@valbuild/ui 0.44.0 → 0.45.0

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.
@@ -17,7 +17,7 @@ function getServerMimeType(path) {
17
17
  }
18
18
  }
19
19
  const files = JSON.parse(
20
- `{"/assets/index-ktSR2XYf.js":"dmFyIHYkPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgeSQ9KGUsdCxuKT0+dCBpbiBlP3YkKGUsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pOmVbdF09bjt2YXIgSmU9KGUsdCxuKT0+KHkkKGUsdHlwZW9mIHQhPSJzeW1ib2wiP3QrIiI6dCxuKSxuKSx4JD0oZSx0LG4pPT57aWYoIXQuaGFzKGUpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIrbil9O3ZhciBuaD0oZSx0LG4pPT57aWYodC5oYXMoZSkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlIik7dCBpbnN0YW5jZW9mIFdlYWtTZXQ/dC5hZGQoZSk6dC5zZXQoZSxuKX07dmFyIEd1PShlLHQsbik9Pih4JChlLHQsImFjY2VzcyBwcml2YXRlIG1ldGhvZCIpLG4pO2Z1bmN0aW9uIEVfKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9dFtuXTtpZih0eXBlb2YgciE9InN0cmluZyImJiFBcnJheS5pc0FycmF5KHIpKXtmb3IoY29uc3QgaSBpbiByKWlmKGkhPT0iZGVmYXVsdCImJiEoaSBpbiBlKSl7Y29uc3Qgbz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsaSk7byYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsaSxvLmdldD9vOntlbnVtZXJhYmxlOiEwLGdldDooKT0+cltpXX0pfX19cmV0dXJuIE9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pKX0oZnVuY3Rpb24oKXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKS5yZWxMaXN0O2lmKHQmJnQuc3VwcG9ydHMmJnQuc3VwcG9ydHMoIm1vZHVsZXByZWxvYWQiKSlyZXR1cm47Zm9yKGNvbnN0IGkgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbGlua1tyZWw9Im1vZHVsZXByZWxvYWQiXScpKXIoaSk7bmV3IE11dGF0aW9uT2JzZXJ2ZXIoaT0+e2Zvcihjb25zdCBvIG9mIGkpaWYoby50eXBlPT09ImNoaWxkTGlzdCIpZm9yKGNvbnN0IGwgb2Ygby5hZGRlZE5vZGVzKWwudGFnTmFtZT09PSJMSU5LIiYmbC5yZWw9PT0ibW9kdWxlcHJlbG9hZCImJnIobCl9KS5vYnNlcnZlKGRvY3VtZW50LHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pO2Z1bmN0aW9uIG4oaSl7Y29uc3Qgbz17fTtyZXR1cm4gaS5pbnRlZ3JpdHkmJihvLmludGVncml0eT1pLmludGVncml0eSksaS5yZWZlcnJlclBvbGljeSYmKG8ucmVmZXJyZXJQb2xpY3k9aS5yZWZlcnJlclBvbGljeSksaS5jcm9zc09yaWdpbj09PSJ1c2UtY3JlZGVudGlhbHMiP28uY3JlZGVudGlhbHM9ImluY2x1ZGUiOmkuY3Jvc3NPcmlnaW49PT0iYW5vbnltb3VzIj9vLmNyZWRlbnRpYWxzPSJvbWl0IjpvLmNyZWRlbnRpYWxzPSJzYW1lLW9yaWdpbiIsb31mdW5jdGlvbiByKGkpe2lmKGkuZXApcmV0dXJuO2kuZXA9ITA7Y29uc3Qgbz1uKGkpO2ZldGNoKGkuaHJlZixvKX19KSgpO2Z1bmN0aW9uICR1KGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZWZhdWx0Iik/ZS5kZWZhdWx0OmV9dmFyIENfPXtleHBvcnRzOnt9fSxQZT17fTsvKioKICogQGxpY2Vuc2UgUmVhY3QKICogcmVhY3QucHJvZHVjdGlvbi5taW4uanMKICoKICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqL3ZhciBidT1TeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50IiksXyQ9U3ltYm9sLmZvcigicmVhY3QucG9ydGFsIiksdyQ9U3ltYm9sLmZvcigicmVhY3QuZnJhZ21lbnQiKSxTJD1TeW1ib2wuZm9yKCJyZWFjdC5zdHJpY3RfbW9kZSIpLEUkPVN5bWJvbC5mb3IoInJlYWN0LnByb2ZpbGVyIiksQyQ9U3ltYm9sLmZvcigicmVhY3QucHJvdmlkZXIiKSxrJD1TeW1ib2wuZm9yKCJyZWFjdC5jb250ZXh0IiksJCQ9U3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKSxiJD1TeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZSIpLFQkPVN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKSxOJD1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5IiksYXk9U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIFIkKGUpe3JldHVybiBlPT09bnVsbHx8dHlwZW9mIGUhPSJvYmplY3QiP251bGw6KGU9YXkmJmVbYXldfHxlWyJAQGl0ZXJhdG9yIl0sdHlwZW9mIGU9PSJmdW5jdGlvbiI/ZTpudWxsKX12YXIga189e2lzTW91bnRlZDpmdW5jdGlvbigpe3JldHVybiExfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oKXt9LGVucXVldWVSZXBsYWNlU3RhdGU6ZnVuY3Rpb24oKXt9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbigpe319LCRfPU9iamVjdC5hc3NpZ24sYl89e307ZnVuY3Rpb24geXMoZSx0LG4pe3RoaXMucHJvcHM9ZSx0aGlzLmNvbnRleHQ9dCx0aGlzLnJlZnM9Yl8sdGhpcy51cGRhdGVyPW58fGtffXlzLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXt9O3lzLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiBlIT0ib2JqZWN0IiYmdHlwZW9mIGUhPSJmdW5jdGlvbiImJmUhPW51bGwpdGhyb3cgRXJyb3IoInNldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLiIpO3RoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcyxlLHQsInNldFN0YXRlIil9O3lzLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbihlKXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsZSwiZm9yY2VVcGRhdGUiKX07ZnVuY3Rpb24gVF8oKXt9VF8ucHJvdG90eXBlPXlzLnByb3RvdHlwZTtmdW5jdGlvbiBRbShlLHQsbil7dGhpcy5wcm9wcz1lLHRoaXMuY29udGV4dD10LHRoaXMucmVmcz1iXyx0aGlzLnVwZGF0ZXI9bnx8a199dmFyIEptPVFtLnByb3RvdHlwZT1uZXcgVF87Sm0uY29uc3RydWN0b3I9UW07JF8oSm0seXMucHJvdG90eXBlKTtKbS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMDt2YXIgdXk9QXJyYXkuaXNBcnJheSxOXz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHFtPXtjdXJyZW50Om51bGx9LFJfPXtrZXk6ITAscmVmOiEwLF9fc2VsZjohMCxfX3NvdXJjZTohMH07ZnVuY3Rpb24gT18oZSx0LG4pe3ZhciByLGk9e30sbz1udWxsLGw9bnVsbDtpZih0IT1udWxsKWZvcihyIGluIHQucmVmIT09dm9pZCAwJiYobD10LnJlZiksdC5rZXkhPT12b2lkIDAmJihvPSIiK3Qua2V5KSx0KU5fLmNhbGwodCxyKSYmIVJfLmhhc093blByb3BlcnR5KHIpJiYoaVtyXT10W3JdKTt2YXIgcz1hcmd1bWVudHMubGVuZ3RoLTI7aWYocz09PTEpaS5jaGlsZHJlbj1uO2Vsc2UgaWYoMTxzKXtmb3IodmFyIGE9QXJyYXkocyksdT0wO3U8czt1KyspYVt1XT1hcmd1bWVudHNbdSsyXTtpLmNoaWxkcmVuPWF9aWYoZSYmZS5kZWZhdWx0UHJvcHMpZm9yKHIgaW4gcz1lLmRlZmF1bHRQcm9wcyxzKWlbcl09PT12b2lkIDAmJihpW3JdPXNbcl0pO3JldHVybnskJHR5cGVvZjpidSx0eXBlOmUsa2V5Om8scmVmOmwscHJvcHM6aSxfb3duZXI6cW0uY3VycmVudH19ZnVuY3Rpb24gTyQoZSx0KXtyZXR1cm57JCR0eXBlb2Y6YnUsdHlwZTplLnR5cGUsa2V5OnQscmVmOmUucmVmLHByb3BzOmUucHJvcHMsX293bmVyOmUuX293bmVyfX1mdW5jdGlvbiBlZyhlKXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbCYmZS4kJHR5cGVvZj09PWJ1fWZ1bmN0aW9uIFAkKGUpe3ZhciB0PXsiPSI6Ij0wIiwiOiI6Ij0yIn07cmV0dXJuIiQiK2UucmVwbGFjZSgvWz06XS9nLGZ1bmN0aW9uKG4pe3JldHVybiB0W25dfSl9dmFyIGN5PS9cLysvZztmdW5jdGlvbiByaChlLHQpe3JldHVybiB0eXBlb2YgZT09Im9iamVjdCImJmUhPT1udWxsJiZlLmtleSE9bnVsbD9QJCgiIitlLmtleSk6dC50b1N0cmluZygzNil9ZnVuY3Rpb24gVGMoZSx0LG4scixpKXt2YXIgbz10eXBlb2YgZTsobz09PSJ1bmRlZmluZWQifHxvPT09ImJvb2xlYW4iKSYmKGU9bnVsbCk7dmFyIGw9ITE7aWYoZT09PW51bGwpbD0hMDtlbHNlIHN3aXRjaChvKXtjYXNlInN0cmluZyI6Y2FzZSJudW1iZXIiOmw9ITA7YnJlYWs7Y2FzZSJvYmplY3QiOnN3aXRjaChlLiQkdHlwZW9mKXtjYXNlIGJ1OmNhc2UgXyQ6bD0hMH19aWYobClyZXR1cm4gbD1lLGk9aShsKSxlPXI9PT0iIj8iLiIrcmgobCwwKTpyLHV5KGkpPyhuPSIiLGUhPW51bGwmJihuPWUucmVwbGFjZShjeSwiJCYvIikrIi8iKSxUYyhpLHQsbiwiIixmdW5jdGlvbih1KXtyZXR1cm4gdX0pKTppIT1udWxsJiYoZWcoaSkmJihpPU8kKGksbisoIWkua2V5fHxsJiZsLmtleT09PWkua2V5PyIiOigiIitpLmtleSkucmVwbGFjZShjeSwiJCYvIikrIi8iKStlKSksdC5wdXNoKGkpKSwxO2lmKGw9MCxyPXI9PT0iIj8iLiI6cisiOiIsdXkoZSkpZm9yKHZhciBzPTA7czxlLmxlbmd0aDtzKyspe289ZVtzXTt2YXIgYT1yK3JoKG8scyk7bCs9VGMobyx0LG4sYSxpKX1lbHNlIGlmKGE9UiQoZSksdHlwZW9mIGE9PSJmdW5jdGlvbiIpZm9yKGU9YS5jYWxsKGUpLHM9MDshKG89ZS5uZXh0KCkpLmRvbmU7KW89by52YWx1ZSxhPXIrcmgobyxzKyspLGwrPVRjKG8sdCxuLGEsaSk7ZWxzZSBpZihvPT09Im9iamVjdCIpdGhyb3cgdD1TdHJpbmcoZSksRXJyb3IoIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogIisodD09PSJbb2JqZWN0IE9iamVjdF0iPyJvYmplY3Qgd2l0aCBrZXlzIHsiK09iamVjdC5rZXlzKGUpLmpvaW4oIiwgIikrIn0iOnQpKyIpLiBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5IGluc3RlYWQuIik7cmV0dXJuIGx9ZnVuY3Rpb24gWXUoZSx0LG4pe2lmKGU9PW51bGwpcmV0dXJuIGU7dmFyIHI9W10saT0wO3JldHVybiBUYyhlLHIsIiIsIiIsZnVuY3Rpb24obyl7cmV0dXJuIHQuY2FsbChuLG8saSsrKX0pLHJ9ZnVuY3Rpb24gQSQoZSl7aWYoZS5fc3RhdHVzPT09LTEpe3ZhciB0PWUuX3Jlc3VsdDt0PXQoKSx0LnRoZW4oZnVuY3Rpb24obil7KGUuX3N0YXR1cz09PTB8fGUuX3N0YXR1cz09PS0xKSYmKGUuX3N0YXR1cz0xLGUuX3Jlc3VsdD1uKX0sZnVuY3Rpb24obil7KGUuX3N0YXR1cz09PTB8fGUuX3N0YXR1cz09PS0xKSYmKGUuX3N0YXR1cz0yLGUuX3Jlc3VsdD1uKX0pLGUuX3N0YXR1cz09PS0xJiYoZS5fc3RhdHVzPTAsZS5fcmVzdWx0PXQpfWlmKGUuX3N0YXR1cz09PTEpcmV0dXJuIGUuX3Jlc3VsdC5kZWZhdWx0O3Rocm93IGUuX3Jlc3VsdH12YXIgeG49e2N1cnJlbnQ6bnVsbH0sTmM9e3RyYW5zaXRpb246bnVsbH0sTSQ9e1JlYWN0Q3VycmVudERpc3BhdGNoZXI6eG4sUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6TmMsUmVhY3RDdXJyZW50T3duZXI6cW19O1BlLkNoaWxkcmVuPXttYXA6WXUsZm9yRWFjaDpmdW5jdGlvbihlLHQsbil7WXUoZSxmdW5jdGlvbigpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxuKX0sY291bnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9MDtyZXR1cm4gWXUoZSxmdW5jdGlvbigpe3QrK30pLHR9LHRvQXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIFl1KGUsZnVuY3Rpb24odCl7cmV0dXJuIHR9KXx8W119LG9ubHk6ZnVuY3Rpb24oZSl7aWYoIWVnKGUpKXRocm93IEVycm9yKCJSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC4iKTtyZXR1cm4gZX19O1BlLkNvbXBvbmVudD15cztQZS5GcmFnbWVudD13JDtQZS5Qcm9maWxlcj1FJDtQZS5QdXJlQ29tcG9uZW50PVFtO1BlLlN0cmljdE1vZGU9UyQ7UGUuU3VzcGVuc2U9YiQ7UGUuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9TSQ7UGUuY2xvbmVFbGVtZW50PWZ1bmN0aW9uKGUsdCxuKXtpZihlPT1udWxsKXRocm93IEVycm9yKCJSZWFjdC5jbG9uZUVsZW1lbnQoLi4uKTogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCAiK2UrIi4iKTt2YXIgcj0kXyh7fSxlLnByb3BzKSxpPWUua2V5LG89ZS5yZWYsbD1lLl9vd25lcjtpZih0IT1udWxsKXtpZih0LnJlZiE9PXZvaWQgMCYmKG89dC5yZWYsbD1xbS5jdXJyZW50KSx0LmtleSE9PXZvaWQgMCYmKGk9IiIrdC5rZXkpLGUudHlwZSYmZS50eXBlLmRlZmF1bHRQcm9wcyl2YXIgcz1lLnR5cGUuZGVmYXVsdFByb3BzO2ZvcihhIGluIHQpTl8uY2FsbCh0LGEpJiYhUl8uaGFzT3duUHJvcGVydHkoYSkmJihyW2FdPXRbYV09PT12b2lkIDAmJnMhPT12b2lkIDA/c1thXTp0W2FdKX12YXIgYT1hcmd1bWVudHMubGVuZ3RoLTI7aWYoYT09PTEpci5jaGlsZHJlbj1uO2Vsc2UgaWYoMTxhKXtzPUFycmF5KGEpO2Zvcih2YXIgdT0wO3U8YTt1Kyspc1t1XT1hcmd1bWVudHNbdSsyXTtyLmNoaWxkcmVuPXN9cmV0dXJueyQkdHlwZW9mOmJ1LHR5cGU6ZS50eXBlLGtleTppLHJlZjpvLHByb3BzOnIsX293bmVyOmx9fTtQZS5jcmVhdGVDb250ZXh0PWZ1bmN0aW9uKGUpe3JldHVybiBlPXskJHR5cGVvZjprJCxfY3VycmVudFZhbHVlOmUsX2N1cnJlbnRWYWx1ZTI6ZSxfdGhyZWFkQ291bnQ6MCxQcm92aWRlcjpudWxsLENvbnN1bWVyOm51bGwsX2RlZmF1bHRWYWx1ZTpudWxsLF9nbG9iYWxOYW1lOm51bGx9LGUuUHJvdmlkZXI9eyQkdHlwZW9mOkMkLF9jb250ZXh0OmV9LGUuQ29uc3VtZXI9ZX07UGUuY3JlYXRlRWxlbWVudD1PXztQZS5jcmVhdGVGYWN0b3J5PWZ1bmN0aW9uKGUpe3ZhciB0PU9fLmJpbmQobnVsbCxlKTtyZXR1cm4gdC50eXBlPWUsdH07UGUuY3JlYXRlUmVmPWZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bnVsbH19O1BlLmZvcndhcmRSZWY9ZnVuY3Rpb24oZSl7cmV0dXJueyQkdHlwZW9mOiQkLHJlbmRlcjplfX07UGUuaXNWYWxpZEVsZW1lbnQ9ZWc7UGUubGF6eT1mdW5jdGlvbihlKXtyZXR1cm57JCR0eXBlb2Y6TiQsX3BheWxvYWQ6e19zdGF0dXM6LTEsX3Jlc3VsdDplfSxfaW5pdDpBJH19O1BlLm1lbW89ZnVuY3Rpb24oZSx0KXtyZXR1cm57JCR0eXBlb2Y6VCQsdHlwZTplLGNvbXBhcmU6dD09PXZvaWQgMD9udWxsOnR9fTtQZS5zdGFydFRyYW5zaXRpb249ZnVuY3Rpb24oZSl7dmFyIHQ9TmMudHJhbnNpdGlvbjtOYy50cmFuc2l0aW9uPXt9O3RyeXtlKCl9ZmluYWxseXtOYy50cmFuc2l0aW9uPXR9fTtQZS51bnN0YWJsZV9hY3Q9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiYWN0KC4uLikgaXMgbm90IHN1cHBvcnRlZCBpbiBwcm9kdWN0aW9uIGJ1aWxkcyBvZiBSZWFjdC4iKX07UGUudXNlQ2FsbGJhY2s9ZnVuY3Rpb24oZSx0KXtyZXR1cm4geG4uY3VycmVudC51c2VDYWxsYmFjayhlLHQpfTtQZS51c2VDb250ZXh0PWZ1bmN0aW9uKGUpe3JldHVybiB4bi5jdXJyZW50LnVzZUNvbnRleHQoZSl9O1BlLnVzZURlYnVnVmFsdWU9ZnVuY3Rpb24oKXt9O1BlLnVzZURlZmVycmVkVmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIHhuLmN1cnJlbnQudXNlRGVmZXJyZWRWYWx1ZShlKX07UGUudXNlRWZmZWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHhuLmN1cnJlbnQudXNlRWZmZWN0KGUsdCl9O1BlLnVzZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIHhuLmN1cnJlbnQudXNlSWQoKX07UGUudXNlSW1wZXJhdGl2ZUhhbmRsZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHhuLmN1cnJlbnQudXNlSW1wZXJhdGl2ZUhhbmRsZShlLHQsbil9O1BlLnVzZUluc2VydGlvbkVmZmVjdD1mdW5jdGlvbihlLHQpe3JldHVybiB4bi5jdXJyZW50LnVzZUluc2VydGlvbkVmZmVjdChlLHQpfTtQZS51c2VMYXlvdXRFZmZlY3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4geG4uY3VycmVudC51c2VMYXlvdXRFZmZlY3QoZSx0KX07UGUudXNlTWVtbz1mdW5jdGlvbihlLHQpe3JldHVybiB4bi5jdXJyZW50LnVzZU1lbW8oZSx0KX07UGUudXNlUmVkdWNlcj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHhuLmN1cnJlbnQudXNlUmVkdWNlcihlLHQsbil9O1BlLnVzZVJlZj1mdW5jdGlvbihlKXtyZXR1cm4geG4uY3VycmVudC51c2VSZWYoZSl9O1BlLnVzZVN0YXRlPWZ1bmN0aW9uKGUpe3JldHVybiB4bi5jdXJyZW50LnVzZVN0YXRlKGUpfTtQZS51c2VTeW5jRXh0ZXJuYWxTdG9yZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHhuLmN1cnJlbnQudXNlU3luY0V4dGVybmFsU3RvcmUoZSx0LG4pfTtQZS51c2VUcmFuc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHhuLmN1cnJlbnQudXNlVHJhbnNpdGlvbigpfTtQZS52ZXJzaW9uPSIxOC4yLjAiO0NfLmV4cG9ydHM9UGU7dmFyIHA9Q18uZXhwb3J0cztjb25zdCByZT0kdShwKSxQXz1FXyh7X19wcm90b19fOm51bGwsZGVmYXVsdDpyZX0sW3BdKTt2YXIgUWg9e30sQV89e2V4cG9ydHM6e319LFZuPXt9LE1fPXtleHBvcnRzOnt9fSxEXz17fTsvKioKICogQGxpY2Vuc2UgUmVhY3QKICogc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzCiAqCiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogKi8oZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChrLGope3ZhciBMPWsubGVuZ3RoO2sucHVzaChqKTtlOmZvcig7MDxMOyl7dmFyIFo9TC0xPj4+MSxuZT1rW1pdO2lmKDA8aShuZSxqKSlrW1pdPWosa1tMXT1uZSxMPVo7ZWxzZSBicmVhayBlfX1mdW5jdGlvbiBuKGspe3JldHVybiBrLmxlbmd0aD09PTA/bnVsbDprWzBdfWZ1bmN0aW9uIHIoayl7aWYoay5sZW5ndGg9PT0wKXJldHVybiBudWxsO3ZhciBqPWtbMF0sTD1rLnBvcCgpO2lmKEwhPT1qKXtrWzBdPUw7ZTpmb3IodmFyIFo9MCxuZT1rLmxlbmd0aCxrZT1uZT4+PjE7WjxrZTspe3ZhciB2ZT0yKihaKzEpLTEsV2U9a1t2ZV0sRmU9dmUrMSx0ZT1rW0ZlXTtpZigwPmkoV2UsTCkpRmU8bmUmJjA+aSh0ZSxXZSk/KGtbWl09dGUsa1tGZV09TCxaPUZlKTooa1taXT1XZSxrW3ZlXT1MLFo9dmUpO2Vsc2UgaWYoRmU8bmUmJjA+aSh0ZSxMKSlrW1pdPXRlLGtbRmVdPUwsWj1GZTtlbHNlIGJyZWFrIGV9fXJldHVybiBqfWZ1bmN0aW9uIGkoayxqKXt2YXIgTD1rLnNvcnRJbmRleC1qLnNvcnRJbmRleDtyZXR1cm4gTCE9PTA/TDprLmlkLWouaWR9aWYodHlwZW9mIHBlcmZvcm1hbmNlPT0ib2JqZWN0IiYmdHlwZW9mIHBlcmZvcm1hbmNlLm5vdz09ImZ1bmN0aW9uIil7dmFyIG89cGVyZm9ybWFuY2U7ZS51bnN0YWJsZV9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gby5ub3coKX19ZWxzZXt2YXIgbD1EYXRlLHM9bC5ub3coKTtlLnVuc3RhYmxlX25vdz1mdW5jdGlvbigpe3JldHVybiBsLm5vdygpLXN9fXZhciBhPVtdLHU9W10sYz0xLGQ9bnVsbCxmPTMsaD0hMSxtPSExLGc9ITEsUz10eXBlb2Ygc2V0VGltZW91dD09ImZ1bmN0aW9uIj9zZXRUaW1lb3V0Om51bGwsdj10eXBlb2YgY2xlYXJUaW1lb3V0PT0iZnVuY3Rpb24iP2NsZWFyVGltZW91dDpudWxsLHk9dHlwZW9mIHNldEltbWVkaWF0ZTwidSI/c2V0SW1tZWRpYXRlOm51bGw7dHlwZW9mIG5hdmlnYXRvcjwidSImJm5hdmlnYXRvci5zY2hlZHVsaW5nIT09dm9pZCAwJiZuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZyE9PXZvaWQgMCYmbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcuYmluZChuYXZpZ2F0b3Iuc2NoZWR1bGluZyk7ZnVuY3Rpb24gXyhrKXtmb3IodmFyIGo9bih1KTtqIT09bnVsbDspe2lmKGouY2FsbGJhY2s9PT1udWxsKXIodSk7ZWxzZSBpZihqLnN0YXJ0VGltZTw9aylyKHUpLGouc29ydEluZGV4PWouZXhwaXJhdGlvblRpbWUsdChhLGopO2Vsc2UgYnJlYWs7aj1uKHUpfX1mdW5jdGlvbiB3KGspe2lmKGc9ITEsXyhrKSwhbSlpZihuKGEpIT09bnVsbCltPSEwLE8oRSk7ZWxzZXt2YXIgaj1uKHUpO2ohPT1udWxsJiZBKHcsai5zdGFydFRpbWUtayl9fWZ1bmN0aW9uIEUoayxqKXttPSExLGcmJihnPSExLHYoVCksVD0tMSksaD0hMDt2YXIgTD1mO3RyeXtmb3IoXyhqKSxkPW4oYSk7ZCE9PW51bGwmJighKGQuZXhwaXJhdGlvblRpbWU+ail8fGsmJiFEKCkpOyl7dmFyIFo9ZC5jYWxsYmFjaztpZih0eXBlb2YgWj09ImZ1bmN0aW9uIil7ZC5jYWxsYmFjaz1udWxsLGY9ZC5wcmlvcml0eUxldmVsO3ZhciBuZT1aKGQuZXhwaXJhdGlvblRpbWU8PWopO2o9ZS51bnN0YWJsZV9ub3coKSx0eXBlb2YgbmU9PSJmdW5jdGlvbiI/ZC5jYWxsYmFjaz1uZTpkPT09bihhKSYmcihhKSxfKGopfWVsc2UgcihhKTtkPW4oYSl9aWYoZCE9PW51bGwpdmFyIGtlPSEwO2Vsc2V7dmFyIHZlPW4odSk7dmUhPT1udWxsJiZBKHcsdmUuc3RhcnRUaW1lLWopLGtlPSExfXJldHVybiBrZX1maW5hbGx5e2Q9bnVsbCxmPUwsaD0hMX19dmFyICQ9ITEsQz1udWxsLFQ9LTEsTj01LFI9LTE7ZnVuY3Rpb24gRCgpe3JldHVybiEoZS51bnN0YWJsZV9ub3coKS1SPE4pfWZ1bmN0aW9uIEYoKXtpZihDIT09bnVsbCl7dmFyIGs9ZS51bnN0YWJsZV9ub3coKTtSPWs7dmFyIGo9ITA7dHJ5e2o9QyghMCxrKX1maW5hbGx5e2o/c2UoKTooJD0hMSxDPW51bGwpfX1lbHNlICQ9ITF9dmFyIHNlO2lmKHR5cGVvZiB5PT0iZnVuY3Rpb24iKXNlPWZ1bmN0aW9uKCl7eShGKX07ZWxzZSBpZih0eXBlb2YgTWVzc2FnZUNoYW5uZWw8InUiKXt2YXIgVj1uZXcgTWVzc2FnZUNoYW5uZWwsSz1WLnBvcnQyO1YucG9ydDEub25tZXNzYWdlPUYsc2U9ZnVuY3Rpb24oKXtLLnBvc3RNZXNzYWdlKG51bGwpfX1lbHNlIHNlPWZ1bmN0aW9uKCl7UyhGLDApfTtmdW5jdGlvbiBPKGspe0M9aywkfHwoJD0hMCxzZSgpKX1mdW5jdGlvbiBBKGssail7VD1TKGZ1bmN0aW9uKCl7ayhlLnVuc3RhYmxlX25vdygpKX0sail9ZS51bnN0YWJsZV9JZGxlUHJpb3JpdHk9NSxlLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5PTEsZS51bnN0YWJsZV9Mb3dQcmlvcml0eT00LGUudW5zdGFibGVfTm9ybWFsUHJpb3JpdHk9MyxlLnVuc3RhYmxlX1Byb2ZpbGluZz1udWxsLGUudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHk9MixlLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrPWZ1bmN0aW9uKGspe2suY2FsbGJhY2s9bnVsbH0sZS51bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbj1mdW5jdGlvbigpe218fGh8fChtPSEwLE8oRSkpfSxlLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlPWZ1bmN0aW9uKGspezA+a3x8MTI1PGs/Y29uc29sZS5lcnJvcigiZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsIGZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkIik6Tj0wPGs/TWF0aC5mbG9vcigxZTMvayk6NX0sZS51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbD1mdW5jdGlvbigpe3JldHVybiBmfSxlLnVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIG4oYSl9LGUudW5zdGFibGVfbmV4dD1mdW5jdGlvbihrKXtzd2l0Y2goZil7Y2FzZSAxOmNhc2UgMjpjYXNlIDM6dmFyIGo9MzticmVhaztkZWZhdWx0Omo9Zn12YXIgTD1mO2Y9ajt0cnl7cmV0dXJuIGsoKX1maW5hbGx5e2Y9TH19LGUudW5zdGFibGVfcGF1c2VFeGVjdXRpb249ZnVuY3Rpb24oKXt9LGUudW5zdGFibGVfcmVxdWVzdFBhaW50PWZ1bmN0aW9uKCl7fSxlLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eT1mdW5jdGlvbihrLGope3N3aXRjaChrKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OmJyZWFrO2RlZmF1bHQ6az0zfXZhciBMPWY7Zj1rO3RyeXtyZXR1cm4gaigpfWZpbmFsbHl7Zj1MfX0sZS51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrPWZ1bmN0aW9uKGssaixMKXt2YXIgWj1lLnVuc3RhYmxlX25vdygpO3N3aXRjaCh0eXBlb2YgTD09Im9iamVjdCImJkwhPT1udWxsPyhMPUwuZGVsYXksTD10eXBlb2YgTD09Im51bWJlciImJjA8TD9aK0w6Wik6TD1aLGspe2Nhc2UgMTp2YXIgbmU9LTE7YnJlYWs7Y2FzZSAyOm5lPTI1MDticmVhaztjYXNlIDU6bmU9MTA3Mzc0MTgyMzticmVhaztjYXNlIDQ6bmU9MWU0O2JyZWFrO2RlZmF1bHQ6bmU9NWUzfXJldHVybiBuZT1MK25lLGs9e2lkOmMrKyxjYWxsYmFjazpqLHByaW9yaXR5TGV2ZWw6ayxzdGFydFRpbWU6TCxleHBpcmF0aW9uVGltZTpuZSxzb3J0SW5kZXg6LTF9LEw+Wj8oay5zb3J0SW5kZXg9TCx0KHUsayksbihhKT09PW51bGwmJms9PT1uKHUpJiYoZz8odihUKSxUPS0xKTpnPSEwLEEodyxMLVopKSk6KGsuc29ydEluZGV4PW5lLHQoYSxrKSxtfHxofHwobT0hMCxPKEUpKSksa30sZS51bnN0YWJsZV9zaG91bGRZaWVsZD1ELGUudW5zdGFibGVfd3JhcENhbGxiYWNrPWZ1bmN0aW9uKGspe3ZhciBqPWY7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIEw9ZjtmPWo7dHJ5e3JldHVybiBrLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1maW5hbGx5e2Y9TH19fX0pKERfKTtNXy5leHBvcnRzPURfO3ZhciBEJD1NXy5leHBvcnRzOy8qKgogKiBAbGljZW5zZSBSZWFjdAogKiByZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMKICoKICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqL3ZhciBJXz1wLEJuPUQkO2Z1bmN0aW9uIFUoZSl7Zm9yKHZhciB0PSJodHRwczovL3JlYWN0anMub3JnL2RvY3MvZXJyb3ItZGVjb2Rlci5odG1sP2ludmFyaWFudD0iK2Usbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdCs9IiZhcmdzW109IitlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW25dKTtyZXR1cm4iTWluaWZpZWQgUmVhY3QgZXJyb3IgIyIrZSsiOyB2aXNpdCAiK3QrIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIn12YXIgTF89bmV3IFNldCxEYT17fTtmdW5jdGlvbiBybChlLHQpe2VzKGUsdCksZXMoZSsiQ2FwdHVyZSIsdCl9ZnVuY3Rpb24gZXMoZSx0KXtmb3IoRGFbZV09dCxlPTA7ZTx0Lmxlbmd0aDtlKyspTF8uYWRkKHRbZV0pfXZhciBkaT0hKHR5cGVvZiB3aW5kb3c+InUifHx0eXBlb2Ygd2luZG93LmRvY3VtZW50PiJ1Inx8dHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PiJ1IiksSmg9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxJJD0vXls6QS1aX2Etelx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDJGRlx1MDM3MC1cdTAzN0RcdTAzN0YtXHUxRkZGXHUyMDBDLVx1MjAwRFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZEXVs6QS1aX2Etelx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDJGRlx1MDM3MC1cdTAzN0RcdTAzN0YtXHUxRkZGXHUyMDBDLVx1MjAwRFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZEXC0uMC05XHUwMEI3XHUwMzAwLVx1MDM2Rlx1MjAzRi1cdTIwNDBdKiQvLGR5PXt9LGZ5PXt9O2Z1bmN0aW9uIEwkKGUpe3JldHVybiBKaC5jYWxsKGZ5LGUpPyEwOkpoLmNhbGwoZHksZSk/ITE6SSQudGVzdChlKT9meVtlXT0hMDooZHlbZV09ITAsITEpfWZ1bmN0aW9uIGokKGUsdCxuLHIpe2lmKG4hPT1udWxsJiZuLnR5cGU9PT0wKXJldHVybiExO3N3aXRjaCh0eXBlb2YgdCl7Y2FzZSJmdW5jdGlvbiI6Y2FzZSJzeW1ib2wiOnJldHVybiEwO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIHI/ITE6biE9PW51bGw/IW4uYWNjZXB0c0Jvb2xlYW5zOihlPWUudG9Mb3dlckNhc2UoKS5zbGljZSgwLDUpLGUhPT0iZGF0YS0iJiZlIT09ImFyaWEtIik7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24geiQoZSx0LG4scil7aWYodD09PW51bGx8fHR5cGVvZiB0PiJ1Inx8aiQoZSx0LG4scikpcmV0dXJuITA7aWYocilyZXR1cm4hMTtpZihuIT09bnVsbClzd2l0Y2gobi50eXBlKXtjYXNlIDM6cmV0dXJuIXQ7Y2FzZSA0OnJldHVybiB0PT09ITE7Y2FzZSA1OnJldHVybiBpc05hTih0KTtjYXNlIDY6cmV0dXJuIGlzTmFOKHQpfHwxPnR9cmV0dXJuITF9ZnVuY3Rpb24gX24oZSx0LG4scixpLG8sbCl7dGhpcy5hY2NlcHRzQm9vbGVhbnM9dD09PTJ8fHQ9PT0zfHx0PT09NCx0aGlzLmF0dHJpYnV0ZU5hbWU9cix0aGlzLmF0dHJpYnV0ZU5hbWVzcGFjZT1pLHRoaXMubXVzdFVzZVByb3BlcnR5PW4sdGhpcy5wcm9wZXJ0eU5hbWU9ZSx0aGlzLnR5cGU9dCx0aGlzLnNhbml0aXplVVJMPW8sdGhpcy5yZW1vdmVFbXB0eVN0cmluZz1sfXZhciBHdD17fTsiY2hpbGRyZW4gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgZGVmYXVsdFZhbHVlIGRlZmF1bHRDaGVja2VkIGlubmVySFRNTCBzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIHN0eWxlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7R3RbZV09bmV3IF9uKGUsMCwhMSxlLG51bGwsITEsITEpfSk7W1siYWNjZXB0Q2hhcnNldCIsImFjY2VwdC1jaGFyc2V0Il0sWyJjbGFzc05hbWUiLCJjbGFzcyJdLFsiaHRtbEZvciIsImZvciJdLFsiaHR0cEVxdWl2IiwiaHR0cC1lcXVpdiJdXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWVbMF07R3RbdF09bmV3IF9uKHQsMSwhMSxlWzFdLG51bGwsITEsITEpfSk7WyJjb250ZW50RWRpdGFibGUiLCJkcmFnZ2FibGUiLCJzcGVsbENoZWNrIiwidmFsdWUiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0d0W2VdPW5ldyBfbihlLDIsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7WyJhdXRvUmV2ZXJzZSIsImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQiLCJmb2N1c2FibGUiLCJwcmVzZXJ2ZUFscGhhIl0uZm9yRWFjaChmdW5jdGlvbihlKXtHdFtlXT1uZXcgX24oZSwyLCExLGUsbnVsbCwhMSwhMSl9KTsiYWxsb3dGdWxsU2NyZWVuIGFzeW5jIGF1dG9Gb2N1cyBhdXRvUGxheSBjb250cm9scyBkZWZhdWx0IGRlZmVyIGRpc2FibGVkIGRpc2FibGVQaWN0dXJlSW5QaWN0dXJlIGRpc2FibGVSZW1vdGVQbGF5YmFjayBmb3JtTm9WYWxpZGF0ZSBoaWRkZW4gbG9vcCBub01vZHVsZSBub1ZhbGlkYXRlIG9wZW4gcGxheXNJbmxpbmUgcmVhZE9ubHkgcmVxdWlyZWQgcmV2ZXJzZWQgc2NvcGVkIHNlYW1sZXNzIGl0ZW1TY29wZSIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0d0W2VdPW5ldyBfbihlLDMsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7WyJjaGVja2VkIiwibXVsdGlwbGUiLCJtdXRlZCIsInNlbGVjdGVkIl0uZm9yRWFjaChmdW5jdGlvbihlKXtHdFtlXT1uZXcgX24oZSwzLCEwLGUsbnVsbCwhMSwhMSl9KTtbImNhcHR1cmUiLCJkb3dubG9hZCJdLmZvckVhY2goZnVuY3Rpb24oZSl7R3RbZV09bmV3IF9uKGUsNCwhMSxlLG51bGwsITEsITEpfSk7WyJjb2xzIiwicm93cyIsInNpemUiLCJzcGFuIl0uZm9yRWFjaChmdW5jdGlvbihlKXtHdFtlXT1uZXcgX24oZSw2LCExLGUsbnVsbCwhMSwhMSl9KTtbInJvd1NwYW4iLCJzdGFydCJdLmZvckVhY2goZnVuY3Rpb24oZSl7R3RbZV09bmV3IF9uKGUsNSwhMSxlLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTt2YXIgdGc9L1tcLTpdKFthLXpdKS9nO2Z1bmN0aW9uIG5nKGUpe3JldHVybiBlWzFdLnRvVXBwZXJDYXNlKCl9ImFjY2VudC1oZWlnaHQgYWxpZ25tZW50LWJhc2VsaW5lIGFyYWJpYy1mb3JtIGJhc2VsaW5lLXNoaWZ0IGNhcC1oZWlnaHQgY2xpcC1wYXRoIGNsaXAtcnVsZSBjb2xvci1pbnRlcnBvbGF0aW9uIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyBjb2xvci1wcm9maWxlIGNvbG9yLXJlbmRlcmluZyBkb21pbmFudC1iYXNlbGluZSBlbmFibGUtYmFja2dyb3VuZCBmaWxsLW9wYWNpdHkgZmlsbC1ydWxlIGZsb29kLWNvbG9yIGZsb29kLW9wYWNpdHkgZm9udC1mYW1pbHkgZm9udC1zaXplIGZvbnQtc2l6ZS1hZGp1c3QgZm9udC1zdHJldGNoIGZvbnQtc3R5bGUgZm9udC12YXJpYW50IGZvbnQtd2VpZ2h0IGdseXBoLW5hbWUgZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCBnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCBob3Jpei1hZHYteCBob3Jpei1vcmlnaW4teCBpbWFnZS1yZW5kZXJpbmcgbGV0dGVyLXNwYWNpbmcgbGlnaHRpbmctY29sb3IgbWFya2VyLWVuZCBtYXJrZXItbWlkIG1hcmtlci1zdGFydCBvdmVybGluZS1wb3NpdGlvbiBvdmVybGluZS10aGlja25lc3MgcGFpbnQtb3JkZXIgcGFub3NlLTEgcG9pbnRlci1ldmVudHMgcmVuZGVyaW5nLWludGVudCBzaGFwZS1yZW5kZXJpbmcgc3RvcC1jb2xvciBzdG9wLW9wYWNpdHkgc3RyaWtldGhyb3VnaC1wb3NpdGlvbiBzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyBzdHJva2UtZGFzaGFycmF5IHN0cm9rZS1kYXNob2Zmc2V0IHN0cm9rZS1saW5lY2FwIHN0cm9rZS1saW5lam9pbiBzdHJva2UtbWl0ZXJsaW1pdCBzdHJva2Utb3BhY2l0eSBzdHJva2Utd2lkdGggdGV4dC1hbmNob3IgdGV4dC1kZWNvcmF0aW9uIHRleHQtcmVuZGVyaW5nIHVuZGVybGluZS1wb3NpdGlvbiB1bmRlcmxpbmUtdGhpY2tuZXNzIHVuaWNvZGUtYmlkaSB1bmljb2RlLXJhbmdlIHVuaXRzLXBlci1lbSB2LWFscGhhYmV0aWMgdi1oYW5naW5nIHYtaWRlb2dyYXBoaWMgdi1tYXRoZW1hdGljYWwgdmVjdG9yLWVmZmVjdCB2ZXJ0LWFkdi15IHZlcnQtb3JpZ2luLXggdmVydC1vcmlnaW4teSB3b3JkLXNwYWNpbmcgd3JpdGluZy1tb2RlIHhtbG5zOnhsaW5rIHgtaGVpZ2h0Ii5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHRnLG5nKTtHdFt0XT1uZXcgX24odCwxLCExLGUsbnVsbCwhMSwhMSl9KTsieGxpbms6YWN0dWF0ZSB4bGluazphcmNyb2xlIHhsaW5rOnJvbGUgeGxpbms6c2hvdyB4bGluazp0aXRsZSB4bGluazp0eXBlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHRnLG5nKTtHdFt0XT1uZXcgX24odCwxLCExLGUsImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCExLCExKX0pO1sieG1sOmJhc2UiLCJ4bWw6bGFuZyIsInhtbDpzcGFjZSJdLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHRnLG5nKTtHdFt0XT1uZXcgX24odCwxLCExLGUsImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsITEsITEpfSk7WyJ0YWJJbmRleCIsImNyb3NzT3JpZ2luIl0uZm9yRWFjaChmdW5jdGlvbihlKXtHdFtlXT1uZXcgX24oZSwxLCExLGUudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO0d0LnhsaW5rSHJlZj1uZXcgX24oInhsaW5rSHJlZiIsMSwhMSwieGxpbms6aHJlZiIsImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCEwLCExKTtbInNyYyIsImhyZWYiLCJhY3Rpb24iLCJmb3JtQWN0aW9uIl0uZm9yRWFjaChmdW5jdGlvbihlKXtHdFtlXT1uZXcgX24oZSwxLCExLGUudG9Mb3dlckNhc2UoKSxudWxsLCEwLCEwKX0pO2Z1bmN0aW9uIHJnKGUsdCxuLHIpe3ZhciBpPUd0Lmhhc093blByb3BlcnR5KHQpP0d0W3RdOm51bGw7KGkhPT1udWxsP2kudHlwZSE9PTA6cnx8ISgyPHQubGVuZ3RoKXx8dFswXSE9PSJvIiYmdFswXSE9PSJPInx8dFsxXSE9PSJuIiYmdFsxXSE9PSJOIikmJih6JCh0LG4saSxyKSYmKG49bnVsbCkscnx8aT09PW51bGw/TCQodCkmJihuPT09bnVsbD9lLnJlbW92ZUF0dHJpYnV0ZSh0KTplLnNldEF0dHJpYnV0ZSh0LCIiK24pKTppLm11c3RVc2VQcm9wZXJ0eT9lW2kucHJvcGVydHlOYW1lXT1uPT09bnVsbD9pLnR5cGU9PT0zPyExOiIiOm46KHQ9aS5hdHRyaWJ1dGVOYW1lLHI9aS5hdHRyaWJ1dGVOYW1lc3BhY2Usbj09PW51bGw/ZS5yZW1vdmVBdHRyaWJ1dGUodCk6KGk9aS50eXBlLG49aT09PTN8fGk9PT00JiZuPT09ITA/IiI6IiIrbixyP2Uuc2V0QXR0cmlidXRlTlMocix0LG4pOmUuc2V0QXR0cmlidXRlKHQsbikpKSl9dmFyIHhpPUlfLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVELFh1PVN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKSwkbD1TeW1ib2wuZm9yKCJyZWFjdC5wb3J0YWwiKSxibD1TeW1ib2wuZm9yKCJyZWFjdC5mcmFnbWVudCIpLGlnPVN5bWJvbC5mb3IoInJlYWN0LnN0cmljdF9tb2RlIikscWg9U3ltYm9sLmZvcigicmVhY3QucHJvZmlsZXIiKSxqXz1TeW1ib2wuZm9yKCJyZWFjdC5wcm92aWRlciIpLHpfPVN5bWJvbC5mb3IoInJlYWN0LmNvbnRleHQiKSxvZz1TeW1ib2wuZm9yKCJyZWFjdC5mb3J3YXJkX3JlZiIpLGVwPVN5bWJvbC5mb3IoInJlYWN0LnN1c3BlbnNlIiksdHA9U3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2VfbGlzdCIpLGxnPVN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKSxBaT1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5IiksRl89U3ltYm9sLmZvcigicmVhY3Qub2Zmc2NyZWVuIiksaHk9U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIHpzKGUpe3JldHVybiBlPT09bnVsbHx8dHlwZW9mIGUhPSJvYmplY3QiP251bGw6KGU9aHkmJmVbaHldfHxlWyJAQGl0ZXJhdG9yIl0sdHlwZW9mIGU9PSJmdW5jdGlvbiI/ZTpudWxsKX12YXIgbXQ9T2JqZWN0LmFzc2lnbixpaDtmdW5jdGlvbiBpYShlKXtpZihpaD09PXZvaWQgMCl0cnl7dGhyb3cgRXJyb3IoKX1jYXRjaChuKXt2YXIgdD1uLnN0YWNrLnRyaW0oKS5tYXRjaCgvXG4oICooYXQgKT8pLyk7aWg9dCYmdFsxXXx8IiJ9cmV0dXJuYApgK2loK2V9dmFyIG9oPSExO2Z1bmN0aW9uIGxoKGUsdCl7aWYoIWV8fG9oKXJldHVybiIiO29oPSEwO3ZhciBuPUVycm9yLnByZXBhcmVTdGFja1RyYWNlO0Vycm9yLnByZXBhcmVTdGFja1RyYWNlPXZvaWQgMDt0cnl7aWYodClpZih0PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJwcm9wcyIse3NldDpmdW5jdGlvbigpe3Rocm93IEVycm9yKCl9fSksdHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiJiZSZWZsZWN0LmNvbnN0cnVjdCl7dHJ5e1JlZmxlY3QuY29uc3RydWN0KHQsW10pfWNhdGNoKHUpe3ZhciByPXV9UmVmbGVjdC5jb25zdHJ1Y3QoZSxbXSx0KX1lbHNle3RyeXt0LmNhbGwoKX1jYXRjaCh1KXtyPXV9ZS5jYWxsKHQucHJvdG90eXBlKX1lbHNle3RyeXt0aHJvdyBFcnJvcigpfWNhdGNoKHUpe3I9dX1lKCl9fWNhdGNoKHUpe2lmKHUmJnImJnR5cGVvZiB1LnN0YWNrPT0ic3RyaW5nIil7Zm9yKHZhciBpPXUuc3RhY2suc3BsaXQoYApgKSxvPXIuc3RhY2suc3BsaXQoYApgKSxsPWkubGVuZ3RoLTEscz1vLmxlbmd0aC0xOzE8PWwmJjA8PXMmJmlbbF0hPT1vW3NdOylzLS07Zm9yKDsxPD1sJiYwPD1zO2wtLSxzLS0paWYoaVtsXSE9PW9bc10pe2lmKGwhPT0xfHxzIT09MSlkbyBpZihsLS0scy0tLDA+c3x8aVtsXSE9PW9bc10pe3ZhciBhPWAKYCtpW2xdLnJlcGxhY2UoIiBhdCBuZXcgIiwiIGF0ICIpO3JldHVybiBlLmRpc3BsYXlOYW1lJiZhLmluY2x1ZGVzKCI8YW5vbnltb3VzPiIpJiYoYT1hLnJlcGxhY2UoIjxhbm9ueW1vdXM+IixlLmRpc3BsYXlOYW1lKSksYX13aGlsZSgxPD1sJiYwPD1zKTticmVha319fWZpbmFsbHl7b2g9ITEsRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9bn1yZXR1cm4oZT1lP2UuZGlzcGxheU5hbWV8fGUubmFtZToiIik/aWEoZSk6IiJ9ZnVuY3Rpb24gRiQoZSl7c3dpdGNoKGUudGFnKXtjYXNlIDU6cmV0dXJuIGlhKGUudHlwZSk7Y2FzZSAxNjpyZXR1cm4gaWEoIkxhenkiKTtjYXNlIDEzOnJldHVybiBpYSgiU3VzcGVuc2UiKTtjYXNlIDE5OnJldHVybiBpYSgiU3VzcGVuc2VMaXN0Iik7Y2FzZSAwOmNhc2UgMjpjYXNlIDE1OnJldHVybiBlPWxoKGUudHlwZSwhMSksZTtjYXNlIDExOnJldHVybiBlPWxoKGUudHlwZS5yZW5kZXIsITEpLGU7Y2FzZSAxOnJldHVybiBlPWxoKGUudHlwZSwhMCksZTtkZWZhdWx0OnJldHVybiIifX1mdW5jdGlvbiBucChlKXtpZihlPT1udWxsKXJldHVybiBudWxsO2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iKXJldHVybiBlLmRpc3BsYXlOYW1lfHxlLm5hbWV8fG51bGw7aWYodHlwZW9mIGU9PSJzdHJpbmciKXJldHVybiBlO3N3aXRjaChlKXtjYXNlIGJsOnJldHVybiJGcmFnbWVudCI7Y2FzZSAkbDpyZXR1cm4iUG9ydGFsIjtjYXNlIHFoOnJldHVybiJQcm9maWxlciI7Y2FzZSBpZzpyZXR1cm4iU3RyaWN0TW9kZSI7Y2FzZSBlcDpyZXR1cm4iU3VzcGVuc2UiO2Nhc2UgdHA6cmV0dXJuIlN1c3BlbnNlTGlzdCJ9aWYodHlwZW9mIGU9PSJvYmplY3QiKXN3aXRjaChlLiQkdHlwZW9mKXtjYXNlIHpfOnJldHVybihlLmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuQ29uc3VtZXIiO2Nhc2Ugal86cmV0dXJuKGUuX2NvbnRleHQuZGlzcGxheU5hbWV8fCJDb250ZXh0IikrIi5Qcm92aWRlciI7Y2FzZSBvZzp2YXIgdD1lLnJlbmRlcjtyZXR1cm4gZT1lLmRpc3BsYXlOYW1lLGV8fChlPXQuZGlzcGxheU5hbWV8fHQubmFtZXx8IiIsZT1lIT09IiI/IkZvcndhcmRSZWYoIitlKyIpIjoiRm9yd2FyZFJlZiIpLGU7Y2FzZSBsZzpyZXR1cm4gdD1lLmRpc3BsYXlOYW1lfHxudWxsLHQhPT1udWxsP3Q6bnAoZS50eXBlKXx8Ik1lbW8iO2Nhc2UgQWk6dD1lLl9wYXlsb2FkLGU9ZS5faW5pdDt0cnl7cmV0dXJuIG5wKGUodCkpfWNhdGNoe319cmV0dXJuIG51bGx9ZnVuY3Rpb24gQiQoZSl7dmFyIHQ9ZS50eXBlO3N3aXRjaChlLnRhZyl7Y2FzZSAyNDpyZXR1cm4iQ2FjaGUiO2Nhc2UgOTpyZXR1cm4odC5kaXNwbGF5TmFtZXx8IkNvbnRleHQiKSsiLkNvbnN1bWVyIjtjYXNlIDEwOnJldHVybih0Ll9jb250ZXh0LmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuUHJvdmlkZXIiO2Nhc2UgMTg6cmV0dXJuIkRlaHlkcmF0ZWRGcmFnbWVudCI7Y2FzZSAxMTpyZXR1cm4gZT10LnJlbmRlcixlPWUuZGlzcGxheU5hbWV8fGUubmFtZXx8IiIsdC5kaXNwbGF5TmFtZXx8KGUhPT0iIj8iRm9yd2FyZFJlZigiK2UrIikiOiJGb3J3YXJkUmVmIik7Y2FzZSA3OnJldHVybiJGcmFnbWVudCI7Y2FzZSA1OnJldHVybiB0O2Nhc2UgNDpyZXR1cm4iUG9ydGFsIjtjYXNlIDM6cmV0dXJuIlJvb3QiO2Nhc2UgNjpyZXR1cm4iVGV4dCI7Y2FzZSAxNjpyZXR1cm4gbnAodCk7Y2FzZSA4OnJldHVybiB0PT09aWc/IlN0cmljdE1vZGUiOiJNb2RlIjtjYXNlIDIyOnJldHVybiJPZmZzY3JlZW4iO2Nhc2UgMTI6cmV0dXJuIlByb2ZpbGVyIjtjYXNlIDIxOnJldHVybiJTY29wZSI7Y2FzZSAxMzpyZXR1cm4iU3VzcGVuc2UiO2Nhc2UgMTk6cmV0dXJuIlN1c3BlbnNlTGlzdCI7Y2FzZSAyNTpyZXR1cm4iVHJhY2luZ01hcmtlciI7Y2FzZSAxOmNhc2UgMDpjYXNlIDE3OmNhc2UgMjpjYXNlIDE0OmNhc2UgMTU6aWYodHlwZW9mIHQ9PSJmdW5jdGlvbiIpcmV0dXJuIHQuZGlzcGxheU5hbWV8fHQubmFtZXx8bnVsbDtpZih0eXBlb2YgdD09InN0cmluZyIpcmV0dXJuIHR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gdG8oZSl7c3dpdGNoKHR5cGVvZiBlKXtjYXNlImJvb2xlYW4iOmNhc2UibnVtYmVyIjpjYXNlInN0cmluZyI6Y2FzZSJ1bmRlZmluZWQiOnJldHVybiBlO2Nhc2Uib2JqZWN0IjpyZXR1cm4gZTtkZWZhdWx0OnJldHVybiIifX1mdW5jdGlvbiBCXyhlKXt2YXIgdD1lLnR5cGU7cmV0dXJuKGU9ZS5ub2RlTmFtZSkmJmUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJih0PT09ImNoZWNrYm94Inx8dD09PSJyYWRpbyIpfWZ1bmN0aW9uIFUkKGUpe3ZhciB0PUJfKGUpPyJjaGVja2VkIjoidmFsdWUiLG49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSx0KSxyPSIiK2VbdF07aWYoIWUuaGFzT3duUHJvcGVydHkodCkmJnR5cGVvZiBuPCJ1IiYmdHlwZW9mIG4uZ2V0PT0iZnVuY3Rpb24iJiZ0eXBlb2Ygbi5zZXQ9PSJmdW5jdGlvbiIpe3ZhciBpPW4uZ2V0LG89bi5zZXQ7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5jYWxsKHRoaXMpfSxzZXQ6ZnVuY3Rpb24obCl7cj0iIitsLG8uY2FsbCh0aGlzLGwpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6bi5lbnVtZXJhYmxlfSkse2dldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LHNldFZhbHVlOmZ1bmN0aW9uKGwpe3I9IiIrbH0sc3RvcFRyYWNraW5nOmZ1bmN0aW9uKCl7ZS5fdmFsdWVUcmFja2VyPW51bGwsZGVsZXRlIGVbdF19fX19ZnVuY3Rpb24gUXUoZSl7ZS5fdmFsdWVUcmFja2VyfHwoZS5fdmFsdWVUcmFja2VyPVUkKGUpKX1mdW5jdGlvbiBVXyhlKXtpZighZSlyZXR1cm4hMTt2YXIgdD1lLl92YWx1ZVRyYWNrZXI7aWYoIXQpcmV0dXJuITA7dmFyIG49dC5nZXRWYWx1ZSgpLHI9IiI7cmV0dXJuIGUmJihyPUJfKGUpP2UuY2hlY2tlZD8idHJ1ZSI6ImZhbHNlIjplLnZhbHVlKSxlPXIsZSE9PW4/KHQuc2V0VmFsdWUoZSksITApOiExfWZ1bmN0aW9uIFljKGUpe2lmKGU9ZXx8KHR5cGVvZiBkb2N1bWVudDwidSI/ZG9jdW1lbnQ6dm9pZCAwKSx0eXBlb2YgZT4idSIpcmV0dXJuIG51bGw7dHJ5e3JldHVybiBlLmFjdGl2ZUVsZW1lbnR8fGUuYm9keX1jYXRjaHtyZXR1cm4gZS5ib2R5fX1mdW5jdGlvbiBycChlLHQpe3ZhciBuPXQuY2hlY2tlZDtyZXR1cm4gbXQoe30sdCx7ZGVmYXVsdENoZWNrZWQ6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsdmFsdWU6dm9pZCAwLGNoZWNrZWQ6bj8/ZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkfSl9ZnVuY3Rpb24gcHkoZSx0KXt2YXIgbj10LmRlZmF1bHRWYWx1ZT09bnVsbD8iIjp0LmRlZmF1bHRWYWx1ZSxyPXQuY2hlY2tlZCE9bnVsbD90LmNoZWNrZWQ6dC5kZWZhdWx0Q2hlY2tlZDtuPXRvKHQudmFsdWUhPW51bGw/dC52YWx1ZTpuKSxlLl93cmFwcGVyU3RhdGU9e2luaXRpYWxDaGVja2VkOnIsaW5pdGlhbFZhbHVlOm4sY29udHJvbGxlZDp0LnR5cGU9PT0iY2hlY2tib3gifHx0LnR5cGU9PT0icmFkaW8iP3QuY2hlY2tlZCE9bnVsbDp0LnZhbHVlIT1udWxsfX1mdW5jdGlvbiBXXyhlLHQpe3Q9dC5jaGVja2VkLHQhPW51bGwmJnJnKGUsImNoZWNrZWQiLHQsITEpfWZ1bmN0aW9uIGlwKGUsdCl7V18oZSx0KTt2YXIgbj10byh0LnZhbHVlKSxyPXQudHlwZTtpZihuIT1udWxsKXI9PT0ibnVtYmVyIj8obj09PTAmJmUudmFsdWU9PT0iInx8ZS52YWx1ZSE9bikmJihlLnZhbHVlPSIiK24pOmUudmFsdWUhPT0iIituJiYoZS52YWx1ZT0iIituKTtlbHNlIGlmKHI9PT0ic3VibWl0Inx8cj09PSJyZXNldCIpe2UucmVtb3ZlQXR0cmlidXRlKCJ2YWx1ZSIpO3JldHVybn10Lmhhc093blByb3BlcnR5KCJ2YWx1ZSIpP29wKGUsdC50eXBlLG4pOnQuaGFzT3duUHJvcGVydHkoImRlZmF1bHRWYWx1ZSIpJiZvcChlLHQudHlwZSx0byh0LmRlZmF1bHRWYWx1ZSkpLHQuY2hlY2tlZD09bnVsbCYmdC5kZWZhdWx0Q2hlY2tlZCE9bnVsbCYmKGUuZGVmYXVsdENoZWNrZWQ9ISF0LmRlZmF1bHRDaGVja2VkKX1mdW5jdGlvbiBteShlLHQsbil7aWYodC5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKXx8dC5oYXNPd25Qcm9wZXJ0eSgiZGVmYXVsdFZhbHVlIikpe3ZhciByPXQudHlwZTtpZighKHIhPT0ic3VibWl0IiYmciE9PSJyZXNldCJ8fHQudmFsdWUhPT12b2lkIDAmJnQudmFsdWUhPT1udWxsKSlyZXR1cm47dD0iIitlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlLG58fHQ9PT1lLnZhbHVlfHwoZS52YWx1ZT10KSxlLmRlZmF1bHRWYWx1ZT10fW49ZS5uYW1lLG4hPT0iIiYmKGUubmFtZT0iIiksZS5kZWZhdWx0Q2hlY2tlZD0hIWUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZCxuIT09IiImJihlLm5hbWU9bil9ZnVuY3Rpb24gb3AoZSx0LG4peyh0IT09Im51bWJlciJ8fFljKGUub3duZXJEb2N1bWVudCkhPT1lKSYmKG49PW51bGw/ZS5kZWZhdWx0VmFsdWU9IiIrZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZTplLmRlZmF1bHRWYWx1ZSE9PSIiK24mJihlLmRlZmF1bHRWYWx1ZT0iIituKSl9dmFyIG9hPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gVWwoZSx0LG4scil7aWYoZT1lLm9wdGlvbnMsdCl7dD17fTtmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKyl0WyIkIituW2ldXT0hMDtmb3Iobj0wO248ZS5sZW5ndGg7bisrKWk9dC5oYXNPd25Qcm9wZXJ0eSgiJCIrZVtuXS52YWx1ZSksZVtuXS5zZWxlY3RlZCE9PWkmJihlW25dLnNlbGVjdGVkPWkpLGkmJnImJihlW25dLmRlZmF1bHRTZWxlY3RlZD0hMCl9ZWxzZXtmb3Iobj0iIit0byhuKSx0PW51bGwsaT0wO2k8ZS5sZW5ndGg7aSsrKXtpZihlW2ldLnZhbHVlPT09bil7ZVtpXS5zZWxlY3RlZD0hMCxyJiYoZVtpXS5kZWZhdWx0U2VsZWN0ZWQ9ITApO3JldHVybn10IT09bnVsbHx8ZVtpXS5kaXNhYmxlZHx8KHQ9ZVtpXSl9dCE9PW51bGwmJih0LnNlbGVjdGVkPSEwKX19ZnVuY3Rpb24gbHAoZSx0KXtpZih0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT1udWxsKXRocm93IEVycm9yKFUoOTEpKTtyZXR1cm4gbXQoe30sdCx7dmFsdWU6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsY2hpbGRyZW46IiIrZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZX0pfWZ1bmN0aW9uIGd5KGUsdCl7dmFyIG49dC52YWx1ZTtpZihuPT1udWxsKXtpZihuPXQuY2hpbGRyZW4sdD10LmRlZmF1bHRWYWx1ZSxuIT1udWxsKXtpZih0IT1udWxsKXRocm93IEVycm9yKFUoOTIpKTtpZihvYShuKSl7aWYoMTxuLmxlbmd0aCl0aHJvdyBFcnJvcihVKDkzKSk7bj1uWzBdfXQ9bn10PT1udWxsJiYodD0iIiksbj10fWUuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbFZhbHVlOnRvKG4pfX1mdW5jdGlvbiBWXyhlLHQpe3ZhciBuPXRvKHQudmFsdWUpLHI9dG8odC5kZWZhdWx0VmFsdWUpO24hPW51bGwmJihuPSIiK24sbiE9PWUudmFsdWUmJihlLnZhbHVlPW4pLHQuZGVmYXVsdFZhbHVlPT1udWxsJiZlLmRlZmF1bHRWYWx1ZSE9PW4mJihlLmRlZmF1bHRWYWx1ZT1uKSksciE9bnVsbCYmKGUuZGVmYXVsdFZhbHVlPSIiK3IpfWZ1bmN0aW9uIHZ5KGUpe3ZhciB0PWUudGV4dENvbnRlbnQ7dD09PWUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUmJnQhPT0iIiYmdCE9PW51bGwmJihlLnZhbHVlPXQpfWZ1bmN0aW9uIEhfKGUpe3N3aXRjaChlKXtjYXNlInN2ZyI6cmV0dXJuImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjtjYXNlIm1hdGgiOnJldHVybiJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIjtkZWZhdWx0OnJldHVybiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIn19ZnVuY3Rpb24gc3AoZSx0KXtyZXR1cm4gZT09bnVsbHx8ZT09PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj9IXyh0KTplPT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiYmdD09PSJmb3JlaWduT2JqZWN0Ij8iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI6ZX12YXIgSnUsS189ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBNU0FwcDwidSImJk1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uP2Z1bmN0aW9uKHQsbixyLGkpe01TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uKCl7cmV0dXJuIGUodCxuLHIsaSl9KX06ZX0oZnVuY3Rpb24oZSx0KXtpZihlLm5hbWVzcGFjZVVSSSE9PSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyJ8fCJpbm5lckhUTUwiaW4gZSllLmlubmVySFRNTD10O2Vsc2V7Zm9yKEp1PUp1fHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxKdS5pbm5lckhUTUw9Ijxzdmc+Iit0LnZhbHVlT2YoKS50b1N0cmluZygpKyI8L3N2Zz4iLHQ9SnUuZmlyc3RDaGlsZDtlLmZpcnN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtmb3IoO3QuZmlyc3RDaGlsZDspZS5hcHBlbmRDaGlsZCh0LmZpcnN0Q2hpbGQpfX0pO2Z1bmN0aW9uIElhKGUsdCl7aWYodCl7dmFyIG49ZS5maXJzdENoaWxkO2lmKG4mJm49PT1lLmxhc3RDaGlsZCYmbi5ub2RlVHlwZT09PTMpe24ubm9kZVZhbHVlPXQ7cmV0dXJufX1lLnRleHRDb250ZW50PXR9dmFyIGZhPXthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxhc3BlY3RSYXRpbzohMCxib3JkZXJJbWFnZU91dHNldDohMCxib3JkZXJJbWFnZVNsaWNlOiEwLGJvcmRlckltYWdlV2lkdGg6ITAsYm94RmxleDohMCxib3hGbGV4R3JvdXA6ITAsYm94T3JkaW5hbEdyb3VwOiEwLGNvbHVtbkNvdW50OiEwLGNvbHVtbnM6ITAsZmxleDohMCxmbGV4R3JvdzohMCxmbGV4UG9zaXRpdmU6ITAsZmxleFNocmluazohMCxmbGV4TmVnYXRpdmU6ITAsZmxleE9yZGVyOiEwLGdyaWRBcmVhOiEwLGdyaWRSb3c6ITAsZ3JpZFJvd0VuZDohMCxncmlkUm93U3BhbjohMCxncmlkUm93U3RhcnQ6ITAsZ3JpZENvbHVtbjohMCxncmlkQ29sdW1uRW5kOiEwLGdyaWRDb2x1bW5TcGFuOiEwLGdyaWRDb2x1bW5TdGFydDohMCxmb250V2VpZ2h0OiEwLGxpbmVDbGFtcDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx0YWJTaXplOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMCxmaWxsT3BhY2l0eTohMCxmbG9vZE9wYWNpdHk6ITAsc3RvcE9wYWNpdHk6ITAsc3Ryb2tlRGFzaGFycmF5OiEwLHN0cm9rZURhc2hvZmZzZXQ6ITAsc3Ryb2tlTWl0ZXJsaW1pdDohMCxzdHJva2VPcGFjaXR5OiEwLHN0cm9rZVdpZHRoOiEwfSxXJD1bIldlYmtpdCIsIm1zIiwiTW96IiwiTyJdO09iamVjdC5rZXlzKGZhKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe1ckLmZvckVhY2goZnVuY3Rpb24odCl7dD10K2UuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zdWJzdHJpbmcoMSksZmFbdF09ZmFbZV19KX0pO2Z1bmN0aW9uIFpfKGUsdCxuKXtyZXR1cm4gdD09bnVsbHx8dHlwZW9mIHQ9PSJib29sZWFuInx8dD09PSIiPyIiOm58fHR5cGVvZiB0IT0ibnVtYmVyInx8dD09PTB8fGZhLmhhc093blByb3BlcnR5KGUpJiZmYVtlXT8oIiIrdCkudHJpbSgpOnQrInB4In1mdW5jdGlvbiBHXyhlLHQpe2U9ZS5zdHlsZTtmb3IodmFyIG4gaW4gdClpZih0Lmhhc093blByb3BlcnR5KG4pKXt2YXIgcj1uLmluZGV4T2YoIi0tIik9PT0wLGk9Wl8obix0W25dLHIpO249PT0iZmxvYXQiJiYobj0iY3NzRmxvYXQiKSxyP2Uuc2V0UHJvcGVydHkobixpKTplW25dPWl9fXZhciBWJD1tdCh7bWVudWl0ZW06ITB9LHthcmVhOiEwLGJhc2U6ITAsYnI6ITAsY29sOiEwLGVtYmVkOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxrZXlnZW46ITAsbGluazohMCxtZXRhOiEwLHBhcmFtOiEwLHNvdXJjZTohMCx0cmFjazohMCx3YnI6ITB9KTtmdW5jdGlvbiBhcChlLHQpe2lmKHQpe2lmKFYkW2VdJiYodC5jaGlsZHJlbiE9bnVsbHx8dC5kYW5nZXJvdXNseVNldElubmVySFRNTCE9bnVsbCkpdGhyb3cgRXJyb3IoVSgxMzcsZSkpO2lmKHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwhPW51bGwpe2lmKHQuY2hpbGRyZW4hPW51bGwpdGhyb3cgRXJyb3IoVSg2MCkpO2lmKHR5cGVvZiB0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT0ib2JqZWN0Inx8ISgiX19odG1sImluIHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKXRocm93IEVycm9yKFUoNjEpKX1pZih0LnN0eWxlIT1udWxsJiZ0eXBlb2YgdC5zdHlsZSE9Im9iamVjdCIpdGhyb3cgRXJyb3IoVSg2MikpfX1mdW5jdGlvbiB1cChlLHQpe2lmKGUuaW5kZXhPZigiLSIpPT09LTEpcmV0dXJuIHR5cGVvZiB0LmlzPT0ic3RyaW5nIjtzd2l0Y2goZSl7Y2FzZSJhbm5vdGF0aW9uLXhtbCI6Y2FzZSJjb2xvci1wcm9maWxlIjpjYXNlImZvbnQtZmFjZSI6Y2FzZSJmb250LWZhY2Utc3JjIjpjYXNlImZvbnQtZmFjZS11cmkiOmNhc2UiZm9udC1mYWNlLWZvcm1hdCI6Y2FzZSJmb250LWZhY2UtbmFtZSI6Y2FzZSJtaXNzaW5nLWdseXBoIjpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiEwfX12YXIgY3A9bnVsbDtmdW5jdGlvbiBzZyhlKXtyZXR1cm4gZT1lLnRhcmdldHx8ZS5zcmNFbGVtZW50fHx3aW5kb3csZS5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCYmKGU9ZS5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCksZS5ub2RlVHlwZT09PTM/ZS5wYXJlbnROb2RlOmV9dmFyIGRwPW51bGwsV2w9bnVsbCxWbD1udWxsO2Z1bmN0aW9uIHl5KGUpe2lmKGU9UnUoZSkpe2lmKHR5cGVvZiBkcCE9ImZ1bmN0aW9uIil0aHJvdyBFcnJvcihVKDI4MCkpO3ZhciB0PWUuc3RhdGVOb2RlO3QmJih0PWFmKHQpLGRwKGUuc3RhdGVOb2RlLGUudHlwZSx0KSl9fWZ1bmN0aW9uIFlfKGUpe1dsP1ZsP1ZsLnB1c2goZSk6Vmw9W2VdOldsPWV9ZnVuY3Rpb24gWF8oKXtpZihXbCl7dmFyIGU9V2wsdD1WbDtpZihWbD1XbD1udWxsLHl5KGUpLHQpZm9yKGU9MDtlPHQubGVuZ3RoO2UrKyl5eSh0W2VdKX19ZnVuY3Rpb24gUV8oZSx0KXtyZXR1cm4gZSh0KX1mdW5jdGlvbiBKXygpe312YXIgc2g9ITE7ZnVuY3Rpb24gcV8oZSx0LG4pe2lmKHNoKXJldHVybiBlKHQsbik7c2g9ITA7dHJ5e3JldHVybiBRXyhlLHQsbil9ZmluYWxseXtzaD0hMSwoV2whPT1udWxsfHxWbCE9PW51bGwpJiYoSl8oKSxYXygpKX19ZnVuY3Rpb24gTGEoZSx0KXt2YXIgbj1lLnN0YXRlTm9kZTtpZihuPT09bnVsbClyZXR1cm4gbnVsbDt2YXIgcj1hZihuKTtpZihyPT09bnVsbClyZXR1cm4gbnVsbDtuPXJbdF07ZTpzd2l0Y2godCl7Y2FzZSJvbkNsaWNrIjpjYXNlIm9uQ2xpY2tDYXB0dXJlIjpjYXNlIm9uRG91YmxlQ2xpY2siOmNhc2Uib25Eb3VibGVDbGlja0NhcHR1cmUiOmNhc2Uib25Nb3VzZURvd24iOmNhc2Uib25Nb3VzZURvd25DYXB0dXJlIjpjYXNlIm9uTW91c2VNb3ZlIjpjYXNlIm9uTW91c2VNb3ZlQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlVXAiOmNhc2Uib25Nb3VzZVVwQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlRW50ZXIiOihyPSFyLmRpc2FibGVkKXx8KGU9ZS50eXBlLHI9IShlPT09ImJ1dHRvbiJ8fGU9PT0iaW5wdXQifHxlPT09InNlbGVjdCJ8fGU9PT0idGV4dGFyZWEiKSksZT0hcjticmVhayBlO2RlZmF1bHQ6ZT0hMX1pZihlKXJldHVybiBudWxsO2lmKG4mJnR5cGVvZiBuIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFUoMjMxLHQsdHlwZW9mIG4pKTtyZXR1cm4gbn12YXIgZnA9ITE7aWYoZGkpdHJ5e3ZhciBGcz17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRnMsInBhc3NpdmUiLHtnZXQ6ZnVuY3Rpb24oKXtmcD0hMH19KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsRnMsRnMpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixGcyxGcyl9Y2F0Y2h7ZnA9ITF9ZnVuY3Rpb24gSCQoZSx0LG4scixpLG8sbCxzLGEpe3ZhciB1PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywzKTt0cnl7dC5hcHBseShuLHUpfWNhdGNoKGMpe3RoaXMub25FcnJvcihjKX19dmFyIGhhPSExLFhjPW51bGwsUWM9ITEsaHA9bnVsbCxLJD17b25FcnJvcjpmdW5jdGlvbihlKXtoYT0hMCxYYz1lfX07ZnVuY3Rpb24gWiQoZSx0LG4scixpLG8sbCxzLGEpe2hhPSExLFhjPW51bGwsSCQuYXBwbHkoSyQsYXJndW1lbnRzKX1mdW5jdGlvbiBHJChlLHQsbixyLGksbyxsLHMsYSl7aWYoWiQuYXBwbHkodGhpcyxhcmd1bWVudHMpLGhhKXtpZihoYSl7dmFyIHU9WGM7aGE9ITEsWGM9bnVsbH1lbHNlIHRocm93IEVycm9yKFUoMTk4KSk7UWN8fChRYz0hMCxocD11KX19ZnVuY3Rpb24gaWwoZSl7dmFyIHQ9ZSxuPWU7aWYoZS5hbHRlcm5hdGUpZm9yKDt0LnJldHVybjspdD10LnJldHVybjtlbHNle2U9dDtkbyB0PWUsdC5mbGFncyY0MDk4JiYobj10LnJldHVybiksZT10LnJldHVybjt3aGlsZShlKX1yZXR1cm4gdC50YWc9PT0zP246bnVsbH1mdW5jdGlvbiBlMShlKXtpZihlLnRhZz09PTEzKXt2YXIgdD1lLm1lbW9pemVkU3RhdGU7aWYodD09PW51bGwmJihlPWUuYWx0ZXJuYXRlLGUhPT1udWxsJiYodD1lLm1lbW9pemVkU3RhdGUpKSx0IT09bnVsbClyZXR1cm4gdC5kZWh5ZHJhdGVkfXJldHVybiBudWxsfWZ1bmN0aW9uIHh5KGUpe2lmKGlsKGUpIT09ZSl0aHJvdyBFcnJvcihVKDE4OCkpfWZ1bmN0aW9uIFkkKGUpe3ZhciB0PWUuYWx0ZXJuYXRlO2lmKCF0KXtpZih0PWlsKGUpLHQ9PT1udWxsKXRocm93IEVycm9yKFUoMTg4KSk7cmV0dXJuIHQhPT1lP251bGw6ZX1mb3IodmFyIG49ZSxyPXQ7Oyl7dmFyIGk9bi5yZXR1cm47aWYoaT09PW51bGwpYnJlYWs7dmFyIG89aS5hbHRlcm5hdGU7aWYobz09PW51bGwpe2lmKHI9aS5yZXR1cm4sciE9PW51bGwpe249cjtjb250aW51ZX1icmVha31pZihpLmNoaWxkPT09by5jaGlsZCl7Zm9yKG89aS5jaGlsZDtvOyl7aWYobz09PW4pcmV0dXJuIHh5KGkpLGU7aWYobz09PXIpcmV0dXJuIHh5KGkpLHQ7bz1vLnNpYmxpbmd9dGhyb3cgRXJyb3IoVSgxODgpKX1pZihuLnJldHVybiE9PXIucmV0dXJuKW49aSxyPW87ZWxzZXtmb3IodmFyIGw9ITEscz1pLmNoaWxkO3M7KXtpZihzPT09bil7bD0hMCxuPWkscj1vO2JyZWFrfWlmKHM9PT1yKXtsPSEwLHI9aSxuPW87YnJlYWt9cz1zLnNpYmxpbmd9aWYoIWwpe2ZvcihzPW8uY2hpbGQ7czspe2lmKHM9PT1uKXtsPSEwLG49byxyPWk7YnJlYWt9aWYocz09PXIpe2w9ITAscj1vLG49aTticmVha31zPXMuc2libGluZ31pZighbCl0aHJvdyBFcnJvcihVKDE4OSkpfX1pZihuLmFsdGVybmF0ZSE9PXIpdGhyb3cgRXJyb3IoVSgxOTApKX1pZihuLnRhZyE9PTMpdGhyb3cgRXJyb3IoVSgxODgpKTtyZXR1cm4gbi5zdGF0ZU5vZGUuY3VycmVudD09PW4/ZTp0fWZ1bmN0aW9uIHQxKGUpe3JldHVybiBlPVkkKGUpLGUhPT1udWxsP24xKGUpOm51bGx9ZnVuY3Rpb24gbjEoZSl7aWYoZS50YWc9PT01fHxlLnRhZz09PTYpcmV0dXJuIGU7Zm9yKGU9ZS5jaGlsZDtlIT09bnVsbDspe3ZhciB0PW4xKGUpO2lmKHQhPT1udWxsKXJldHVybiB0O2U9ZS5zaWJsaW5nfXJldHVybiBudWxsfXZhciByMT1Cbi51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrLF95PUJuLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrLFgkPUJuLnVuc3RhYmxlX3Nob3VsZFlpZWxkLFEkPUJuLnVuc3RhYmxlX3JlcXVlc3RQYWludCxDdD1Cbi51bnN0YWJsZV9ub3csSiQ9Qm4udW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwsYWc9Qm4udW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHksaTE9Qm4udW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHksSmM9Qm4udW5zdGFibGVfTm9ybWFsUHJpb3JpdHkscSQ9Qm4udW5zdGFibGVfTG93UHJpb3JpdHksbzE9Qm4udW5zdGFibGVfSWRsZVByaW9yaXR5LHJmPW51bGwsenI9bnVsbDtmdW5jdGlvbiBlYihlKXtpZih6ciYmdHlwZW9mIHpyLm9uQ29tbWl0RmliZXJSb290PT0iZnVuY3Rpb24iKXRyeXt6ci5vbkNvbW1pdEZpYmVyUm9vdChyZixlLHZvaWQgMCwoZS5jdXJyZW50LmZsYWdzJjEyOCk9PT0xMjgpfWNhdGNoe319dmFyIHdyPU1hdGguY2x6MzI/TWF0aC5jbHozMjpyYix0Yj1NYXRoLmxvZyxuYj1NYXRoLkxOMjtmdW5jdGlvbiByYihlKXtyZXR1cm4gZT4+Pj0wLGU9PT0wPzMyOjMxLSh0YihlKS9uYnwwKXwwfXZhciBxdT02NCxlYz00MTk0MzA0O2Z1bmN0aW9uIGxhKGUpe3N3aXRjaChlJi1lKXtjYXNlIDE6cmV0dXJuIDE7Y2FzZSAyOnJldHVybiAyO2Nhc2UgNDpyZXR1cm4gNDtjYXNlIDg6cmV0dXJuIDg7Y2FzZSAxNjpyZXR1cm4gMTY7Y2FzZSAzMjpyZXR1cm4gMzI7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpyZXR1cm4gZSY0MTk0MjQwO2Nhc2UgNDE5NDMwNDpjYXNlIDgzODg2MDg6Y2FzZSAxNjc3NzIxNjpjYXNlIDMzNTU0NDMyOmNhc2UgNjcxMDg4NjQ6cmV0dXJuIGUmMTMwMDIzNDI0O2Nhc2UgMTM0MjE3NzI4OnJldHVybiAxMzQyMTc3Mjg7Y2FzZSAyNjg0MzU0NTY6cmV0dXJuIDI2ODQzNTQ1NjtjYXNlIDUzNjg3MDkxMjpyZXR1cm4gNTM2ODcwOTEyO2Nhc2UgMTA3Mzc0MTgyNDpyZXR1cm4gMTA3Mzc0MTgyNDtkZWZhdWx0OnJldHVybiBlfX1mdW5jdGlvbiBxYyhlLHQpe3ZhciBuPWUucGVuZGluZ0xhbmVzO2lmKG49PT0wKXJldHVybiAwO3ZhciByPTAsaT1lLnN1c3BlbmRlZExhbmVzLG89ZS5waW5nZWRMYW5lcyxsPW4mMjY4NDM1NDU1O2lmKGwhPT0wKXt2YXIgcz1sJn5pO3MhPT0wP3I9bGEocyk6KG8mPWwsbyE9PTAmJihyPWxhKG8pKSl9ZWxzZSBsPW4mfmksbCE9PTA/cj1sYShsKTpvIT09MCYmKHI9bGEobykpO2lmKHI9PT0wKXJldHVybiAwO2lmKHQhPT0wJiZ0IT09ciYmISh0JmkpJiYoaT1yJi1yLG89dCYtdCxpPj1vfHxpPT09MTYmJihvJjQxOTQyNDApIT09MCkpcmV0dXJuIHQ7aWYociY0JiYocnw9biYxNiksdD1lLmVudGFuZ2xlZExhbmVzLHQhPT0wKWZvcihlPWUuZW50YW5nbGVtZW50cyx0Jj1yOzA8dDspbj0zMS13cih0KSxpPTE8PG4scnw9ZVtuXSx0Jj1+aTtyZXR1cm4gcn1mdW5jdGlvbiBpYihlLHQpe3N3aXRjaChlKXtjYXNlIDE6Y2FzZSAyOmNhc2UgNDpyZXR1cm4gdCsyNTA7Y2FzZSA4OmNhc2UgMTY6Y2FzZSAzMjpjYXNlIDY0OmNhc2UgMTI4OmNhc2UgMjU2OmNhc2UgNTEyOmNhc2UgMTAyNDpjYXNlIDIwNDg6Y2FzZSA0MDk2OmNhc2UgODE5MjpjYXNlIDE2Mzg0OmNhc2UgMzI3Njg6Y2FzZSA2NTUzNjpjYXNlIDEzMTA3MjpjYXNlIDI2MjE0NDpjYXNlIDUyNDI4ODpjYXNlIDEwNDg1NzY6Y2FzZSAyMDk3MTUyOnJldHVybiB0KzVlMztjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0OnJldHVybi0xO2Nhc2UgMTM0MjE3NzI4OmNhc2UgMjY4NDM1NDU2OmNhc2UgNTM2ODcwOTEyOmNhc2UgMTA3Mzc0MTgyNDpyZXR1cm4tMTtkZWZhdWx0OnJldHVybi0xfX1mdW5jdGlvbiBvYihlLHQpe2Zvcih2YXIgbj1lLnN1c3BlbmRlZExhbmVzLHI9ZS5waW5nZWRMYW5lcyxpPWUuZXhwaXJhdGlvblRpbWVzLG89ZS5wZW5kaW5nTGFuZXM7MDxvOyl7dmFyIGw9MzEtd3Iobykscz0xPDxsLGE9aVtsXTthPT09LTE/KCEocyZuKXx8cyZyKSYmKGlbbF09aWIocyx0KSk6YTw9dCYmKGUuZXhwaXJlZExhbmVzfD1zKSxvJj1+c319ZnVuY3Rpb24gcHAoZSl7cmV0dXJuIGU9ZS5wZW5kaW5nTGFuZXMmLTEwNzM3NDE4MjUsZSE9PTA/ZTplJjEwNzM3NDE4MjQ/MTA3Mzc0MTgyNDowfWZ1bmN0aW9uIGwxKCl7dmFyIGU9cXU7cmV0dXJuIHF1PDw9MSwhKHF1JjQxOTQyNDApJiYocXU9NjQpLGV9ZnVuY3Rpb24gYWgoZSl7Zm9yKHZhciB0PVtdLG49MDszMT5uO24rKyl0LnB1c2goZSk7cmV0dXJuIHR9ZnVuY3Rpb24gVHUoZSx0LG4pe2UucGVuZGluZ0xhbmVzfD10LHQhPT01MzY4NzA5MTImJihlLnN1c3BlbmRlZExhbmVzPTAsZS5waW5nZWRMYW5lcz0wKSxlPWUuZXZlbnRUaW1lcyx0PTMxLXdyKHQpLGVbdF09bn1mdW5jdGlvbiBsYihlLHQpe3ZhciBuPWUucGVuZGluZ0xhbmVzJn50O2UucGVuZGluZ0xhbmVzPXQsZS5zdXNwZW5kZWRMYW5lcz0wLGUucGluZ2VkTGFuZXM9MCxlLmV4cGlyZWRMYW5lcyY9dCxlLm11dGFibGVSZWFkTGFuZXMmPXQsZS5lbnRhbmdsZWRMYW5lcyY9dCx0PWUuZW50YW5nbGVtZW50czt2YXIgcj1lLmV2ZW50VGltZXM7Zm9yKGU9ZS5leHBpcmF0aW9uVGltZXM7MDxuOyl7dmFyIGk9MzEtd3Iobiksbz0xPDxpO3RbaV09MCxyW2ldPS0xLGVbaV09LTEsbiY9fm99fWZ1bmN0aW9uIHVnKGUsdCl7dmFyIG49ZS5lbnRhbmdsZWRMYW5lc3w9dDtmb3IoZT1lLmVudGFuZ2xlbWVudHM7bjspe3ZhciByPTMxLXdyKG4pLGk9MTw8cjtpJnR8ZVtyXSZ0JiYoZVtyXXw9dCksbiY9fml9fXZhciBVZT0wO2Z1bmN0aW9uIHMxKGUpe3JldHVybiBlJj0tZSwxPGU/NDxlP2UmMjY4NDM1NDU1PzE2OjUzNjg3MDkxMjo0OjF9dmFyIGExLGNnLHUxLGMxLGQxLG1wPSExLHRjPVtdLFZpPW51bGwsSGk9bnVsbCxLaT1udWxsLGphPW5ldyBNYXAsemE9bmV3IE1hcCxJaT1bXSxzYj0ibW91c2Vkb3duIG1vdXNldXAgdG91Y2hjYW5jZWwgdG91Y2hlbmQgdG91Y2hzdGFydCBhdXhjbGljayBkYmxjbGljayBwb2ludGVyY2FuY2VsIHBvaW50ZXJkb3duIHBvaW50ZXJ1cCBkcmFnZW5kIGRyYWdzdGFydCBkcm9wIGNvbXBvc2l0aW9uZW5kIGNvbXBvc2l0aW9uc3RhcnQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBpbnB1dCB0ZXh0SW5wdXQgY29weSBjdXQgcGFzdGUgY2xpY2sgY2hhbmdlIGNvbnRleHRtZW51IHJlc2V0IHN1Ym1pdCIuc3BsaXQoIiAiKTtmdW5jdGlvbiB3eShlLHQpe3N3aXRjaChlKXtjYXNlImZvY3VzaW4iOmNhc2UiZm9jdXNvdXQiOlZpPW51bGw7YnJlYWs7Y2FzZSJkcmFnZW50ZXIiOmNhc2UiZHJhZ2xlYXZlIjpIaT1udWxsO2JyZWFrO2Nhc2UibW91c2VvdmVyIjpjYXNlIm1vdXNlb3V0IjpLaT1udWxsO2JyZWFrO2Nhc2UicG9pbnRlcm92ZXIiOmNhc2UicG9pbnRlcm91dCI6amEuZGVsZXRlKHQucG9pbnRlcklkKTticmVhaztjYXNlImdvdHBvaW50ZXJjYXB0dXJlIjpjYXNlImxvc3Rwb2ludGVyY2FwdHVyZSI6emEuZGVsZXRlKHQucG9pbnRlcklkKX19ZnVuY3Rpb24gQnMoZSx0LG4scixpLG8pe3JldHVybiBlPT09bnVsbHx8ZS5uYXRpdmVFdmVudCE9PW8/KGU9e2Jsb2NrZWRPbjp0LGRvbUV2ZW50TmFtZTpuLGV2ZW50U3lzdGVtRmxhZ3M6cixuYXRpdmVFdmVudDpvLHRhcmdldENvbnRhaW5lcnM6W2ldfSx0IT09bnVsbCYmKHQ9UnUodCksdCE9PW51bGwmJmNnKHQpKSxlKTooZS5ldmVudFN5c3RlbUZsYWdzfD1yLHQ9ZS50YXJnZXRDb250YWluZXJzLGkhPT1udWxsJiZ0LmluZGV4T2YoaSk9PT0tMSYmdC5wdXNoKGkpLGUpfWZ1bmN0aW9uIGFiKGUsdCxuLHIsaSl7c3dpdGNoKHQpe2Nhc2UiZm9jdXNpbiI6cmV0dXJuIFZpPUJzKFZpLGUsdCxuLHIsaSksITA7Y2FzZSJkcmFnZW50ZXIiOnJldHVybiBIaT1CcyhIaSxlLHQsbixyLGkpLCEwO2Nhc2UibW91c2VvdmVyIjpyZXR1cm4gS2k9QnMoS2ksZSx0LG4scixpKSwhMDtjYXNlInBvaW50ZXJvdmVyIjp2YXIgbz1pLnBvaW50ZXJJZDtyZXR1cm4gamEuc2V0KG8sQnMoamEuZ2V0KG8pfHxudWxsLGUsdCxuLHIsaSkpLCEwO2Nhc2UiZ290cG9pbnRlcmNhcHR1cmUiOnJldHVybiBvPWkucG9pbnRlcklkLHphLnNldChvLEJzKHphLmdldChvKXx8bnVsbCxlLHQsbixyLGkpKSwhMH1yZXR1cm4hMX1mdW5jdGlvbiBmMShlKXt2YXIgdD1PbyhlLnRhcmdldCk7aWYodCE9PW51bGwpe3ZhciBuPWlsKHQpO2lmKG4hPT1udWxsKXtpZih0PW4udGFnLHQ9PT0xMyl7aWYodD1lMShuKSx0IT09bnVsbCl7ZS5ibG9ja2VkT249dCxkMShlLnByaW9yaXR5LGZ1bmN0aW9uKCl7dTEobil9KTtyZXR1cm59fWVsc2UgaWYodD09PTMmJm4uc3RhdGVOb2RlLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpe2UuYmxvY2tlZE9uPW4udGFnPT09Mz9uLnN0YXRlTm9kZS5jb250YWluZXJJbmZvOm51bGw7cmV0dXJufX19ZS5ibG9ja2VkT249bnVsbH1mdW5jdGlvbiBSYyhlKXtpZihlLmJsb2NrZWRPbiE9PW51bGwpcmV0dXJuITE7Zm9yKHZhciB0PWUudGFyZ2V0Q29udGFpbmVyczswPHQubGVuZ3RoOyl7dmFyIG49Z3AoZS5kb21FdmVudE5hbWUsZS5ldmVudFN5c3RlbUZsYWdzLHRbMF0sZS5uYXRpdmVFdmVudCk7aWYobj09PW51bGwpe249ZS5uYXRpdmVFdmVudDt2YXIgcj1uZXcgbi5jb25zdHJ1Y3RvcihuLnR5cGUsbik7Y3A9cixuLnRhcmdldC5kaXNwYXRjaEV2ZW50KHIpLGNwPW51bGx9ZWxzZSByZXR1cm4gdD1SdShuKSx0IT09bnVsbCYmY2codCksZS5ibG9ja2VkT249biwhMTt0LnNoaWZ0KCl9cmV0dXJuITB9ZnVuY3Rpb24gU3koZSx0LG4pe1JjKGUpJiZuLmRlbGV0ZSh0KX1mdW5jdGlvbiB1Yigpe21wPSExLFZpIT09bnVsbCYmUmMoVmkpJiYoVmk9bnVsbCksSGkhPT1udWxsJiZSYyhIaSkmJihIaT1udWxsKSxLaSE9PW51bGwmJlJjKEtpKSYmKEtpPW51bGwpLGphLmZvckVhY2goU3kpLHphLmZvckVhY2goU3kpfWZ1bmN0aW9uIFVzKGUsdCl7ZS5ibG9ja2VkT249PT10JiYoZS5ibG9ja2VkT249bnVsbCxtcHx8KG1wPSEwLEJuLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soQm4udW5zdGFibGVfTm9ybWFsUHJpb3JpdHksdWIpKSl9ZnVuY3Rpb24gRmEoZSl7ZnVuY3Rpb24gdChpKXtyZXR1cm4gVXMoaSxlKX1pZigwPHRjLmxlbmd0aCl7VXModGNbMF0sZSk7Zm9yKHZhciBuPTE7bjx0Yy5sZW5ndGg7bisrKXt2YXIgcj10Y1tuXTtyLmJsb2NrZWRPbj09PWUmJihyLmJsb2NrZWRPbj1udWxsKX19Zm9yKFZpIT09bnVsbCYmVXMoVmksZSksSGkhPT1udWxsJiZVcyhIaSxlKSxLaSE9PW51bGwmJlVzKEtpLGUpLGphLmZvckVhY2godCksemEuZm9yRWFjaCh0KSxuPTA7bjxJaS5sZW5ndGg7bisrKXI9SWlbbl0sci5ibG9ja2VkT249PT1lJiYoci5ibG9ja2VkT249bnVsbCk7Zm9yKDswPElpLmxlbmd0aCYmKG49SWlbMF0sbi5ibG9ja2VkT249PT1udWxsKTspZjEobiksbi5ibG9ja2VkT249PT1udWxsJiZJaS5zaGlmdCgpfXZhciBIbD14aS5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxlZD0hMDtmdW5jdGlvbiBjYihlLHQsbixyKXt2YXIgaT1VZSxvPUhsLnRyYW5zaXRpb247SGwudHJhbnNpdGlvbj1udWxsO3RyeXtVZT0xLGRnKGUsdCxuLHIpfWZpbmFsbHl7VWU9aSxIbC50cmFuc2l0aW9uPW99fWZ1bmN0aW9uIGRiKGUsdCxuLHIpe3ZhciBpPVVlLG89SGwudHJhbnNpdGlvbjtIbC50cmFuc2l0aW9uPW51bGw7dHJ5e1VlPTQsZGcoZSx0LG4scil9ZmluYWxseXtVZT1pLEhsLnRyYW5zaXRpb249b319ZnVuY3Rpb24gZGcoZSx0LG4scil7aWYoZWQpe3ZhciBpPWdwKGUsdCxuLHIpO2lmKGk9PT1udWxsKXloKGUsdCxyLHRkLG4pLHd5KGUscik7ZWxzZSBpZihhYihpLGUsdCxuLHIpKXIuc3RvcFByb3BhZ2F0aW9uKCk7ZWxzZSBpZih3eShlLHIpLHQmNCYmLTE8c2IuaW5kZXhPZihlKSl7Zm9yKDtpIT09bnVsbDspe3ZhciBvPVJ1KGkpO2lmKG8hPT1udWxsJiZhMShvKSxvPWdwKGUsdCxuLHIpLG89PT1udWxsJiZ5aChlLHQscix0ZCxuKSxvPT09aSlicmVhaztpPW99aSE9PW51bGwmJnIuc3RvcFByb3BhZ2F0aW9uKCl9ZWxzZSB5aChlLHQscixudWxsLG4pfX12YXIgdGQ9bnVsbDtmdW5jdGlvbiBncChlLHQsbixyKXtpZih0ZD1udWxsLGU9c2cociksZT1PbyhlKSxlIT09bnVsbClpZih0PWlsKGUpLHQ9PT1udWxsKWU9bnVsbDtlbHNlIGlmKG49dC50YWcsbj09PTEzKXtpZihlPWUxKHQpLGUhPT1udWxsKXJldHVybiBlO2U9bnVsbH1lbHNlIGlmKG49PT0zKXtpZih0LnN0YXRlTm9kZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXJldHVybiB0LnRhZz09PTM/dC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzpudWxsO2U9bnVsbH1lbHNlIHQhPT1lJiYoZT1udWxsKTtyZXR1cm4gdGQ9ZSxudWxsfWZ1bmN0aW9uIGgxKGUpe3N3aXRjaChlKXtjYXNlImNhbmNlbCI6Y2FzZSJjbGljayI6Y2FzZSJjbG9zZSI6Y2FzZSJjb250ZXh0bWVudSI6Y2FzZSJjb3B5IjpjYXNlImN1dCI6Y2FzZSJhdXhjbGljayI6Y2FzZSJkYmxjbGljayI6Y2FzZSJkcmFnZW5kIjpjYXNlImRyYWdzdGFydCI6Y2FzZSJkcm9wIjpjYXNlImZvY3VzaW4iOmNhc2UiZm9jdXNvdXQiOmNhc2UiaW5wdXQiOmNhc2UiaW52YWxpZCI6Y2FzZSJrZXlkb3duIjpjYXNlImtleXByZXNzIjpjYXNlImtleXVwIjpjYXNlIm1vdXNlZG93biI6Y2FzZSJtb3VzZXVwIjpjYXNlInBhc3RlIjpjYXNlInBhdXNlIjpjYXNlInBsYXkiOmNhc2UicG9pbnRlcmNhbmNlbCI6Y2FzZSJwb2ludGVyZG93biI6Y2FzZSJwb2ludGVydXAiOmNhc2UicmF0ZWNoYW5nZSI6Y2FzZSJyZXNldCI6Y2FzZSJyZXNpemUiOmNhc2Uic2Vla2VkIjpjYXNlInN1Ym1pdCI6Y2FzZSJ0b3VjaGNhbmNlbCI6Y2FzZSJ0b3VjaGVuZCI6Y2FzZSJ0b3VjaHN0YXJ0IjpjYXNlInZvbHVtZWNoYW5nZSI6Y2FzZSJjaGFuZ2UiOmNhc2Uic2VsZWN0aW9uY2hhbmdlIjpjYXNlInRleHRJbnB1dCI6Y2FzZSJjb21wb3NpdGlvbnN0YXJ0IjpjYXNlImNvbXBvc2l0aW9uZW5kIjpjYXNlImNvbXBvc2l0aW9udXBkYXRlIjpjYXNlImJlZm9yZWJsdXIiOmNhc2UiYWZ0ZXJibHVyIjpjYXNlImJlZm9yZWlucHV0IjpjYXNlImJsdXIiOmNhc2UiZnVsbHNjcmVlbmNoYW5nZSI6Y2FzZSJmb2N1cyI6Y2FzZSJoYXNoY2hhbmdlIjpjYXNlInBvcHN0YXRlIjpjYXNlInNlbGVjdCI6Y2FzZSJzZWxlY3RzdGFydCI6cmV0dXJuIDE7Y2FzZSJkcmFnIjpjYXNlImRyYWdlbnRlciI6Y2FzZSJkcmFnZXhpdCI6Y2FzZSJkcmFnbGVhdmUiOmNhc2UiZHJhZ292ZXIiOmNhc2UibW91c2Vtb3ZlIjpjYXNlIm1vdXNlb3V0IjpjYXNlIm1vdXNlb3ZlciI6Y2FzZSJwb2ludGVybW92ZSI6Y2FzZSJwb2ludGVyb3V0IjpjYXNlInBvaW50ZXJvdmVyIjpjYXNlInNjcm9sbCI6Y2FzZSJ0b2dnbGUiOmNhc2UidG91Y2htb3ZlIjpjYXNlIndoZWVsIjpjYXNlIm1vdXNlZW50ZXIiOmNhc2UibW91c2VsZWF2ZSI6Y2FzZSJwb2ludGVyZW50ZXIiOmNhc2UicG9pbnRlcmxlYXZlIjpyZXR1cm4gNDtjYXNlIm1lc3NhZ2UiOnN3aXRjaChKJCgpKXtjYXNlIGFnOnJldHVybiAxO2Nhc2UgaTE6cmV0dXJuIDQ7Y2FzZSBKYzpjYXNlIHEkOnJldHVybiAxNjtjYXNlIG8xOnJldHVybiA1MzY4NzA5MTI7ZGVmYXVsdDpyZXR1cm4gMTZ9ZGVmYXVsdDpyZXR1cm4gMTZ9fXZhciBGaT1udWxsLGZnPW51bGwsT2M9bnVsbDtmdW5jdGlvbiBwMSgpe2lmKE9jKXJldHVybiBPYzt2YXIgZSx0PWZnLG49dC5sZW5ndGgscixpPSJ2YWx1ZSJpbiBGaT9GaS52YWx1ZTpGaS50ZXh0Q29udGVudCxvPWkubGVuZ3RoO2ZvcihlPTA7ZTxuJiZ0W2VdPT09aVtlXTtlKyspO3ZhciBsPW4tZTtmb3Iocj0xO3I8PWwmJnRbbi1yXT09PWlbby1yXTtyKyspO3JldHVybiBPYz1pLnNsaWNlKGUsMTxyPzEtcjp2b2lkIDApfWZ1bmN0aW9uIFBjKGUpe3ZhciB0PWUua2V5Q29kZTtyZXR1cm4iY2hhckNvZGUiaW4gZT8oZT1lLmNoYXJDb2RlLGU9PT0wJiZ0PT09MTMmJihlPTEzKSk6ZT10LGU9PT0xMCYmKGU9MTMpLDMyPD1lfHxlPT09MTM/ZTowfWZ1bmN0aW9uIG5jKCl7cmV0dXJuITB9ZnVuY3Rpb24gRXkoKXtyZXR1cm4hMX1mdW5jdGlvbiBIbihlKXtmdW5jdGlvbiB0KG4scixpLG8sbCl7dGhpcy5fcmVhY3ROYW1lPW4sdGhpcy5fdGFyZ2V0SW5zdD1pLHRoaXMudHlwZT1yLHRoaXMubmF0aXZlRXZlbnQ9byx0aGlzLnRhcmdldD1sLHRoaXMuY3VycmVudFRhcmdldD1udWxsO2Zvcih2YXIgcyBpbiBlKWUuaGFzT3duUHJvcGVydHkocykmJihuPWVbc10sdGhpc1tzXT1uP24obyk6b1tzXSk7cmV0dXJuIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPShvLmRlZmF1bHRQcmV2ZW50ZWQhPW51bGw/by5kZWZhdWx0UHJldmVudGVkOm8ucmV0dXJuVmFsdWU9PT0hMSk/bmM6RXksdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1FeSx0aGlzfXJldHVybiBtdCh0LnByb3RvdHlwZSx7cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITA7dmFyIG49dGhpcy5uYXRpdmVFdmVudDtuJiYobi5wcmV2ZW50RGVmYXVsdD9uLnByZXZlbnREZWZhdWx0KCk6dHlwZW9mIG4ucmV0dXJuVmFsdWUhPSJ1bmtub3duIiYmKG4ucmV0dXJuVmFsdWU9ITEpLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPW5jKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIG49dGhpcy5uYXRpdmVFdmVudDtuJiYobi5zdG9wUHJvcGFnYXRpb24/bi5zdG9wUHJvcGFnYXRpb24oKTp0eXBlb2Ygbi5jYW5jZWxCdWJibGUhPSJ1bmtub3duIiYmKG4uY2FuY2VsQnViYmxlPSEwKSx0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPW5jKX0scGVyc2lzdDpmdW5jdGlvbigpe30saXNQZXJzaXN0ZW50Om5jfSksdH12YXIgeHM9e2V2ZW50UGhhc2U6MCxidWJibGVzOjAsY2FuY2VsYWJsZTowLHRpbWVTdGFtcDpmdW5jdGlvbihlKXtyZXR1cm4gZS50aW1lU3RhbXB8fERhdGUubm93KCl9LGRlZmF1bHRQcmV2ZW50ZWQ6MCxpc1RydXN0ZWQ6MH0saGc9SG4oeHMpLE51PW10KHt9LHhzLHt2aWV3OjAsZGV0YWlsOjB9KSxmYj1IbihOdSksdWgsY2gsV3Msb2Y9bXQoe30sTnUse3NjcmVlblg6MCxzY3JlZW5ZOjAsY2xpZW50WDowLGNsaWVudFk6MCxwYWdlWDowLHBhZ2VZOjAsY3RybEtleTowLHNoaWZ0S2V5OjAsYWx0S2V5OjAsbWV0YUtleTowLGdldE1vZGlmaWVyU3RhdGU6cGcsYnV0dG9uOjAsYnV0dG9uczowLHJlbGF0ZWRUYXJnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVsYXRlZFRhcmdldD09PXZvaWQgMD9lLmZyb21FbGVtZW50PT09ZS5zcmNFbGVtZW50P2UudG9FbGVtZW50OmUuZnJvbUVsZW1lbnQ6ZS5yZWxhdGVkVGFyZ2V0fSxtb3ZlbWVudFg6ZnVuY3Rpb24oZSl7cmV0dXJuIm1vdmVtZW50WCJpbiBlP2UubW92ZW1lbnRYOihlIT09V3MmJihXcyYmZS50eXBlPT09Im1vdXNlbW92ZSI/KHVoPWUuc2NyZWVuWC1Xcy5zY3JlZW5YLGNoPWUuc2NyZWVuWS1Xcy5zY3JlZW5ZKTpjaD11aD0wLFdzPWUpLHVoKX0sbW92ZW1lbnRZOmZ1bmN0aW9uKGUpe3JldHVybiJtb3ZlbWVudFkiaW4gZT9lLm1vdmVtZW50WTpjaH19KSxDeT1IbihvZiksaGI9bXQoe30sb2Yse2RhdGFUcmFuc2ZlcjowfSkscGI9SG4oaGIpLG1iPW10KHt9LE51LHtyZWxhdGVkVGFyZ2V0OjB9KSxkaD1IbihtYiksZ2I9bXQoe30seHMse2FuaW1hdGlvbk5hbWU6MCxlbGFwc2VkVGltZTowLHBzZXVkb0VsZW1lbnQ6MH0pLHZiPUhuKGdiKSx5Yj1tdCh7fSx4cyx7Y2xpcGJvYXJkRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4iY2xpcGJvYXJkRGF0YSJpbiBlP2UuY2xpcGJvYXJkRGF0YTp3aW5kb3cuY2xpcGJvYXJkRGF0YX19KSx4Yj1Ibih5YiksX2I9bXQoe30seHMse2RhdGE6MH0pLGt5PUhuKF9iKSx3Yj17RXNjOiJFc2NhcGUiLFNwYWNlYmFyOiIgIixMZWZ0OiJBcnJvd0xlZnQiLFVwOiJBcnJvd1VwIixSaWdodDoiQXJyb3dSaWdodCIsRG93bjoiQXJyb3dEb3duIixEZWw6IkRlbGV0ZSIsV2luOiJPUyIsTWVudToiQ29udGV4dE1lbnUiLEFwcHM6IkNvbnRleHRNZW51IixTY3JvbGw6IlNjcm9sbExvY2siLE1velByaW50YWJsZUtleToiVW5pZGVudGlmaWVkIn0sU2I9ezg6IkJhY2tzcGFjZSIsOToiVGFiIiwxMjoiQ2xlYXIiLDEzOiJFbnRlciIsMTY6IlNoaWZ0IiwxNzoiQ29udHJvbCIsMTg6IkFsdCIsMTk6IlBhdXNlIiwyMDoiQ2Fwc0xvY2siLDI3OiJFc2NhcGUiLDMyOiIgIiwzMzoiUGFnZVVwIiwzNDoiUGFnZURvd24iLDM1OiJFbmQiLDM2OiJIb21lIiwzNzoiQXJyb3dMZWZ0IiwzODoiQXJyb3dVcCIsMzk6IkFycm93UmlnaHQiLDQwOiJBcnJvd0Rvd24iLDQ1OiJJbnNlcnQiLDQ2OiJEZWxldGUiLDExMjoiRjEiLDExMzoiRjIiLDExNDoiRjMiLDExNToiRjQiLDExNjoiRjUiLDExNzoiRjYiLDExODoiRjciLDExOToiRjgiLDEyMDoiRjkiLDEyMToiRjEwIiwxMjI6IkYxMSIsMTIzOiJGMTIiLDE0NDoiTnVtTG9jayIsMTQ1OiJTY3JvbGxMb2NrIiwyMjQ6Ik1ldGEifSxFYj17QWx0OiJhbHRLZXkiLENvbnRyb2w6ImN0cmxLZXkiLE1ldGE6Im1ldGFLZXkiLFNoaWZ0OiJzaGlmdEtleSJ9O2Z1bmN0aW9uIENiKGUpe3ZhciB0PXRoaXMubmF0aXZlRXZlbnQ7cmV0dXJuIHQuZ2V0TW9kaWZpZXJTdGF0ZT90LmdldE1vZGlmaWVyU3RhdGUoZSk6KGU9RWJbZV0pPyEhdFtlXTohMX1mdW5jdGlvbiBwZygpe3JldHVybiBDYn12YXIga2I9bXQoe30sTnUse2tleTpmdW5jdGlvbihlKXtpZihlLmtleSl7dmFyIHQ9d2JbZS5rZXldfHxlLmtleTtpZih0IT09IlVuaWRlbnRpZmllZCIpcmV0dXJuIHR9cmV0dXJuIGUudHlwZT09PSJrZXlwcmVzcyI/KGU9UGMoZSksZT09PTEzPyJFbnRlciI6U3RyaW5nLmZyb21DaGFyQ29kZShlKSk6ZS50eXBlPT09ImtleWRvd24ifHxlLnR5cGU9PT0ia2V5dXAiP1NiW2Uua2V5Q29kZV18fCJVbmlkZW50aWZpZWQiOiIifSxjb2RlOjAsbG9jYXRpb246MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxhbHRLZXk6MCxtZXRhS2V5OjAscmVwZWF0OjAsbG9jYWxlOjAsZ2V0TW9kaWZpZXJTdGF0ZTpwZyxjaGFyQ29kZTpmdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT09ImtleXByZXNzIj9QYyhlKTowfSxrZXlDb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PT0ia2V5ZG93biJ8fGUudHlwZT09PSJrZXl1cCI/ZS5rZXlDb2RlOjB9LHdoaWNoOmZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PT0ia2V5cHJlc3MiP1BjKGUpOmUudHlwZT09PSJrZXlkb3duInx8ZS50eXBlPT09ImtleXVwIj9lLmtleUNvZGU6MH19KSwkYj1IbihrYiksYmI9bXQoe30sb2Yse3BvaW50ZXJJZDowLHdpZHRoOjAsaGVpZ2h0OjAscHJlc3N1cmU6MCx0YW5nZW50aWFsUHJlc3N1cmU6MCx0aWx0WDowLHRpbHRZOjAsdHdpc3Q6MCxwb2ludGVyVHlwZTowLGlzUHJpbWFyeTowfSksJHk9SG4oYmIpLFRiPW10KHt9LE51LHt0b3VjaGVzOjAsdGFyZ2V0VG91Y2hlczowLGNoYW5nZWRUb3VjaGVzOjAsYWx0S2V5OjAsbWV0YUtleTowLGN0cmxLZXk6MCxzaGlmdEtleTowLGdldE1vZGlmaWVyU3RhdGU6cGd9KSxOYj1IbihUYiksUmI9bXQoe30seHMse3Byb3BlcnR5TmFtZTowLGVsYXBzZWRUaW1lOjAscHNldWRvRWxlbWVudDowfSksT2I9SG4oUmIpLFBiPW10KHt9LG9mLHtkZWx0YVg6ZnVuY3Rpb24oZSl7cmV0dXJuImRlbHRhWCJpbiBlP2UuZGVsdGFYOiJ3aGVlbERlbHRhWCJpbiBlPy1lLndoZWVsRGVsdGFYOjB9LGRlbHRhWTpmdW5jdGlvbihlKXtyZXR1cm4iZGVsdGFZImluIGU/ZS5kZWx0YVk6IndoZWVsRGVsdGFZImluIGU/LWUud2hlZWxEZWx0YVk6IndoZWVsRGVsdGEiaW4gZT8tZS53aGVlbERlbHRhOjB9LGRlbHRhWjowLGRlbHRhTW9kZTowfSksQWI9SG4oUGIpLE1iPVs5LDEzLDI3LDMyXSxtZz1kaSYmIkNvbXBvc2l0aW9uRXZlbnQiaW4gd2luZG93LHBhPW51bGw7ZGkmJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQmJihwYT1kb2N1bWVudC5kb2N1bWVudE1vZGUpO3ZhciBEYj1kaSYmIlRleHRFdmVudCJpbiB3aW5kb3cmJiFwYSxtMT1kaSYmKCFtZ3x8cGEmJjg8cGEmJjExPj1wYSksYnk9IiAiLFR5PSExO2Z1bmN0aW9uIGcxKGUsdCl7c3dpdGNoKGUpe2Nhc2Uia2V5dXAiOnJldHVybiBNYi5pbmRleE9mKHQua2V5Q29kZSkhPT0tMTtjYXNlImtleWRvd24iOnJldHVybiB0LmtleUNvZGUhPT0yMjk7Y2FzZSJrZXlwcmVzcyI6Y2FzZSJtb3VzZWRvd24iOmNhc2UiZm9jdXNvdXQiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIHYxKGUpe3JldHVybiBlPWUuZGV0YWlsLHR5cGVvZiBlPT0ib2JqZWN0IiYmImRhdGEiaW4gZT9lLmRhdGE6bnVsbH12YXIgVGw9ITE7ZnVuY3Rpb24gSWIoZSx0KXtzd2l0Y2goZSl7Y2FzZSJjb21wb3NpdGlvbmVuZCI6cmV0dXJuIHYxKHQpO2Nhc2Uia2V5cHJlc3MiOnJldHVybiB0LndoaWNoIT09MzI/bnVsbDooVHk9ITAsYnkpO2Nhc2UidGV4dElucHV0IjpyZXR1cm4gZT10LmRhdGEsZT09PWJ5JiZUeT9udWxsOmU7ZGVmYXVsdDpyZXR1cm4gbnVsbH19ZnVuY3Rpb24gTGIoZSx0KXtpZihUbClyZXR1cm4gZT09PSJjb21wb3NpdGlvbmVuZCJ8fCFtZyYmZzEoZSx0KT8oZT1wMSgpLE9jPWZnPUZpPW51bGwsVGw9ITEsZSk6bnVsbDtzd2l0Y2goZSl7Y2FzZSJwYXN0ZSI6cmV0dXJuIG51bGw7Y2FzZSJrZXlwcmVzcyI6aWYoISh0LmN0cmxLZXl8fHQuYWx0S2V5fHx0Lm1ldGFLZXkpfHx0LmN0cmxLZXkmJnQuYWx0S2V5KXtpZih0LmNoYXImJjE8dC5jaGFyLmxlbmd0aClyZXR1cm4gdC5jaGFyO2lmKHQud2hpY2gpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodC53aGljaCl9cmV0dXJuIG51bGw7Y2FzZSJjb21wb3NpdGlvbmVuZCI6cmV0dXJuIG0xJiZ0LmxvY2FsZSE9PSJrbyI/bnVsbDp0LmRhdGE7ZGVmYXVsdDpyZXR1cm4gbnVsbH19dmFyIGpiPXtjb2xvcjohMCxkYXRlOiEwLGRhdGV0aW1lOiEwLCJkYXRldGltZS1sb2NhbCI6ITAsZW1haWw6ITAsbW9udGg6ITAsbnVtYmVyOiEwLHBhc3N3b3JkOiEwLHJhbmdlOiEwLHNlYXJjaDohMCx0ZWw6ITAsdGV4dDohMCx0aW1lOiEwLHVybDohMCx3ZWVrOiEwfTtmdW5jdGlvbiBOeShlKXt2YXIgdD1lJiZlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHQ9PT0iaW5wdXQiPyEhamJbZS50eXBlXTp0PT09InRleHRhcmVhIn1mdW5jdGlvbiB5MShlLHQsbixyKXtZXyhyKSx0PW5kKHQsIm9uQ2hhbmdlIiksMDx0Lmxlbmd0aCYmKG49bmV3IGhnKCJvbkNoYW5nZSIsImNoYW5nZSIsbnVsbCxuLHIpLGUucHVzaCh7ZXZlbnQ6bixsaXN0ZW5lcnM6dH0pKX12YXIgbWE9bnVsbCxCYT1udWxsO2Z1bmN0aW9uIHpiKGUpe04xKGUsMCl9ZnVuY3Rpb24gbGYoZSl7dmFyIHQ9T2woZSk7aWYoVV8odCkpcmV0dXJuIGV9ZnVuY3Rpb24gRmIoZSx0KXtpZihlPT09ImNoYW5nZSIpcmV0dXJuIHR9dmFyIHgxPSExO2lmKGRpKXt2YXIgZmg7aWYoZGkpe3ZhciBoaD0ib25pbnB1dCJpbiBkb2N1bWVudDtpZighaGgpe3ZhciBSeT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtSeS5zZXRBdHRyaWJ1dGUoIm9uaW5wdXQiLCJyZXR1cm47IiksaGg9dHlwZW9mIFJ5Lm9uaW5wdXQ9PSJmdW5jdGlvbiJ9Zmg9aGh9ZWxzZSBmaD0hMTt4MT1maCYmKCFkb2N1bWVudC5kb2N1bWVudE1vZGV8fDk8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlKX1mdW5jdGlvbiBPeSgpe21hJiYobWEuZGV0YWNoRXZlbnQoIm9ucHJvcGVydHljaGFuZ2UiLF8xKSxCYT1tYT1udWxsKX1mdW5jdGlvbiBfMShlKXtpZihlLnByb3BlcnR5TmFtZT09PSJ2YWx1ZSImJmxmKEJhKSl7dmFyIHQ9W107eTEodCxCYSxlLHNnKGUpKSxxXyh6Yix0KX19ZnVuY3Rpb24gQmIoZSx0LG4pe2U9PT0iZm9jdXNpbiI/KE95KCksbWE9dCxCYT1uLG1hLmF0dGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIixfMSkpOmU9PT0iZm9jdXNvdXQiJiZPeSgpfWZ1bmN0aW9uIFViKGUpe2lmKGU9PT0ic2VsZWN0aW9uY2hhbmdlInx8ZT09PSJrZXl1cCJ8fGU9PT0ia2V5ZG93biIpcmV0dXJuIGxmKEJhKX1mdW5jdGlvbiBXYihlLHQpe2lmKGU9PT0iY2xpY2siKXJldHVybiBsZih0KX1mdW5jdGlvbiBWYihlLHQpe2lmKGU9PT0iaW5wdXQifHxlPT09ImNoYW5nZSIpcmV0dXJuIGxmKHQpfWZ1bmN0aW9uIEhiKGUsdCl7cmV0dXJuIGU9PT10JiYoZSE9PTB8fDEvZT09PTEvdCl8fGUhPT1lJiZ0IT09dH12YXIga3I9dHlwZW9mIE9iamVjdC5pcz09ImZ1bmN0aW9uIj9PYmplY3QuaXM6SGI7ZnVuY3Rpb24gVWEoZSx0KXtpZihrcihlLHQpKXJldHVybiEwO2lmKHR5cGVvZiBlIT0ib2JqZWN0Inx8ZT09PW51bGx8fHR5cGVvZiB0IT0ib2JqZWN0Inx8dD09PW51bGwpcmV0dXJuITE7dmFyIG49T2JqZWN0LmtleXMoZSkscj1PYmplY3Qua2V5cyh0KTtpZihuLmxlbmd0aCE9PXIubGVuZ3RoKXJldHVybiExO2ZvcihyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBpPW5bcl07aWYoIUpoLmNhbGwodCxpKXx8IWtyKGVbaV0sdFtpXSkpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gUHkoZSl7Zm9yKDtlJiZlLmZpcnN0Q2hpbGQ7KWU9ZS5maXJzdENoaWxkO3JldHVybiBlfWZ1bmN0aW9uIEF5KGUsdCl7dmFyIG49UHkoZSk7ZT0wO2Zvcih2YXIgcjtuOyl7aWYobi5ub2RlVHlwZT09PTMpe2lmKHI9ZStuLnRleHRDb250ZW50Lmxlbmd0aCxlPD10JiZyPj10KXJldHVybntub2RlOm4sb2Zmc2V0OnQtZX07ZT1yfWU6e2Zvcig7bjspe2lmKG4ubmV4dFNpYmxpbmcpe249bi5uZXh0U2libGluZzticmVhayBlfW49bi5wYXJlbnROb2RlfW49dm9pZCAwfW49UHkobil9fWZ1bmN0aW9uIHcxKGUsdCl7cmV0dXJuIGUmJnQ/ZT09PXQ/ITA6ZSYmZS5ub2RlVHlwZT09PTM/ITE6dCYmdC5ub2RlVHlwZT09PTM/dzEoZSx0LnBhcmVudE5vZGUpOiJjb250YWlucyJpbiBlP2UuY29udGFpbnModCk6ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8hIShlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpJjE2KTohMTohMX1mdW5jdGlvbiBTMSgpe2Zvcih2YXIgZT13aW5kb3csdD1ZYygpO3QgaW5zdGFuY2VvZiBlLkhUTUxJRnJhbWVFbGVtZW50Oyl7dHJ5e3ZhciBuPXR5cGVvZiB0LmNvbnRlbnRXaW5kb3cubG9jYXRpb24uaHJlZj09InN0cmluZyJ9Y2F0Y2h7bj0hMX1pZihuKWU9dC5jb250ZW50V2luZG93O2Vsc2UgYnJlYWs7dD1ZYyhlLmRvY3VtZW50KX1yZXR1cm4gdH1mdW5jdGlvbiBnZyhlKXt2YXIgdD1lJiZlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHQmJih0PT09ImlucHV0IiYmKGUudHlwZT09PSJ0ZXh0Inx8ZS50eXBlPT09InNlYXJjaCJ8fGUudHlwZT09PSJ0ZWwifHxlLnR5cGU9PT0idXJsInx8ZS50eXBlPT09InBhc3N3b3JkIil8fHQ9PT0idGV4dGFyZWEifHxlLmNvbnRlbnRFZGl0YWJsZT09PSJ0cnVlIil9ZnVuY3Rpb24gS2IoZSl7dmFyIHQ9UzEoKSxuPWUuZm9jdXNlZEVsZW0scj1lLnNlbGVjdGlvblJhbmdlO2lmKHQhPT1uJiZuJiZuLm93bmVyRG9jdW1lbnQmJncxKG4ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbikpe2lmKHIhPT1udWxsJiZnZyhuKSl7aWYodD1yLnN0YXJ0LGU9ci5lbmQsZT09PXZvaWQgMCYmKGU9dCksInNlbGVjdGlvblN0YXJ0ImluIG4pbi5zZWxlY3Rpb25TdGFydD10LG4uc2VsZWN0aW9uRW5kPU1hdGgubWluKGUsbi52YWx1ZS5sZW5ndGgpO2Vsc2UgaWYoZT0odD1uLm93bmVyRG9jdW1lbnR8fGRvY3VtZW50KSYmdC5kZWZhdWx0Vmlld3x8d2luZG93LGUuZ2V0U2VsZWN0aW9uKXtlPWUuZ2V0U2VsZWN0aW9uKCk7dmFyIGk9bi50ZXh0Q29udGVudC5sZW5ndGgsbz1NYXRoLm1pbihyLnN0YXJ0LGkpO3I9ci5lbmQ9PT12b2lkIDA/bzpNYXRoLm1pbihyLmVuZCxpKSwhZS5leHRlbmQmJm8+ciYmKGk9cixyPW8sbz1pKSxpPUF5KG4sbyk7dmFyIGw9QXkobixyKTtpJiZsJiYoZS5yYW5nZUNvdW50IT09MXx8ZS5hbmNob3JOb2RlIT09aS5ub2RlfHxlLmFuY2hvck9mZnNldCE9PWkub2Zmc2V0fHxlLmZvY3VzTm9kZSE9PWwubm9kZXx8ZS5mb2N1c09mZnNldCE9PWwub2Zmc2V0KSYmKHQ9dC5jcmVhdGVSYW5nZSgpLHQuc2V0U3RhcnQoaS5ub2RlLGkub2Zmc2V0KSxlLnJlbW92ZUFsbFJhbmdlcygpLG8+cj8oZS5hZGRSYW5nZSh0KSxlLmV4dGVuZChsLm5vZGUsbC5vZmZzZXQpKToodC5zZXRFbmQobC5ub2RlLGwub2Zmc2V0KSxlLmFkZFJhbmdlKHQpKSl9fWZvcih0PVtdLGU9bjtlPWUucGFyZW50Tm9kZTspZS5ub2RlVHlwZT09PTEmJnQucHVzaCh7ZWxlbWVudDplLGxlZnQ6ZS5zY3JvbGxMZWZ0LHRvcDplLnNjcm9sbFRvcH0pO2Zvcih0eXBlb2Ygbi5mb2N1cz09ImZ1bmN0aW9uIiYmbi5mb2N1cygpLG49MDtuPHQubGVuZ3RoO24rKyllPXRbbl0sZS5lbGVtZW50LnNjcm9sbExlZnQ9ZS5sZWZ0LGUuZWxlbWVudC5zY3JvbGxUb3A9ZS50b3B9fXZhciBaYj1kaSYmImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCYmMTE+PWRvY3VtZW50LmRvY3VtZW50TW9kZSxObD1udWxsLHZwPW51bGwsZ2E9bnVsbCx5cD0hMTtmdW5jdGlvbiBNeShlLHQsbil7dmFyIHI9bi53aW5kb3c9PT1uP24uZG9jdW1lbnQ6bi5ub2RlVHlwZT09PTk/bjpuLm93bmVyRG9jdW1lbnQ7eXB8fE5sPT1udWxsfHxObCE9PVljKHIpfHwocj1ObCwic2VsZWN0aW9uU3RhcnQiaW4gciYmZ2cocik/cj17c3RhcnQ6ci5zZWxlY3Rpb25TdGFydCxlbmQ6ci5zZWxlY3Rpb25FbmR9OihyPShyLm93bmVyRG9jdW1lbnQmJnIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8d2luZG93KS5nZXRTZWxlY3Rpb24oKSxyPXthbmNob3JOb2RlOnIuYW5jaG9yTm9kZSxhbmNob3JPZmZzZXQ6ci5hbmNob3JPZmZzZXQsZm9jdXNOb2RlOnIuZm9jdXNOb2RlLGZvY3VzT2Zmc2V0OnIuZm9jdXNPZmZzZXR9KSxnYSYmVWEoZ2Escil8fChnYT1yLHI9bmQodnAsIm9uU2VsZWN0IiksMDxyLmxlbmd0aCYmKHQ9bmV3IGhnKCJvblNlbGVjdCIsInNlbGVjdCIsbnVsbCx0LG4pLGUucHVzaCh7ZXZlbnQ6dCxsaXN0ZW5lcnM6cn0pLHQudGFyZ2V0PU5sKSkpfWZ1bmN0aW9uIHJjKGUsdCl7dmFyIG49e307cmV0dXJuIG5bZS50b0xvd2VyQ2FzZSgpXT10LnRvTG93ZXJDYXNlKCksblsiV2Via2l0IitlXT0id2Via2l0Iit0LG5bIk1veiIrZV09Im1veiIrdCxufXZhciBSbD17YW5pbWF0aW9uZW5kOnJjKCJBbmltYXRpb24iLCJBbmltYXRpb25FbmQiKSxhbmltYXRpb25pdGVyYXRpb246cmMoIkFuaW1hdGlvbiIsIkFuaW1hdGlvbkl0ZXJhdGlvbiIpLGFuaW1hdGlvbnN0YXJ0OnJjKCJBbmltYXRpb24iLCJBbmltYXRpb25TdGFydCIpLHRyYW5zaXRpb25lbmQ6cmMoIlRyYW5zaXRpb24iLCJUcmFuc2l0aW9uRW5kIil9LHBoPXt9LEUxPXt9O2RpJiYoRTE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsIkFuaW1hdGlvbkV2ZW50ImluIHdpbmRvd3x8KGRlbGV0ZSBSbC5hbmltYXRpb25lbmQuYW5pbWF0aW9uLGRlbGV0ZSBSbC5hbmltYXRpb25pdGVyYXRpb24uYW5pbWF0aW9uLGRlbGV0ZSBSbC5hbmltYXRpb25zdGFydC5hbmltYXRpb24pLCJUcmFuc2l0aW9uRXZlbnQiaW4gd2luZG93fHxkZWxldGUgUmwudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uKTtmdW5jdGlvbiBzZihlKXtpZihwaFtlXSlyZXR1cm4gcGhbZV07aWYoIVJsW2VdKXJldHVybiBlO3ZhciB0PVJsW2VdLG47Zm9yKG4gaW4gdClpZih0Lmhhc093blByb3BlcnR5KG4pJiZuIGluIEUxKXJldHVybiBwaFtlXT10W25dO3JldHVybiBlfXZhciBDMT1zZigiYW5pbWF0aW9uZW5kIiksazE9c2YoImFuaW1hdGlvbml0ZXJhdGlvbiIpLCQxPXNmKCJhbmltYXRpb25zdGFydCIpLGIxPXNmKCJ0cmFuc2l0aW9uZW5kIiksVDE9bmV3IE1hcCxEeT0iYWJvcnQgYXV4Q2xpY2sgY2FuY2VsIGNhblBsYXkgY2FuUGxheVRocm91Z2ggY2xpY2sgY2xvc2UgY29udGV4dE1lbnUgY29weSBjdXQgZHJhZyBkcmFnRW5kIGRyYWdFbnRlciBkcmFnRXhpdCBkcmFnTGVhdmUgZHJhZ092ZXIgZHJhZ1N0YXJ0IGRyb3AgZHVyYXRpb25DaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgZ290UG9pbnRlckNhcHR1cmUgaW5wdXQgaW52YWxpZCBrZXlEb3duIGtleVByZXNzIGtleVVwIGxvYWQgbG9hZGVkRGF0YSBsb2FkZWRNZXRhZGF0YSBsb2FkU3RhcnQgbG9zdFBvaW50ZXJDYXB0dXJlIG1vdXNlRG93biBtb3VzZU1vdmUgbW91c2VPdXQgbW91c2VPdmVyIG1vdXNlVXAgcGFzdGUgcGF1c2UgcGxheSBwbGF5aW5nIHBvaW50ZXJDYW5jZWwgcG9pbnRlckRvd24gcG9pbnRlck1vdmUgcG9pbnRlck91dCBwb2ludGVyT3ZlciBwb2ludGVyVXAgcHJvZ3Jlc3MgcmF0ZUNoYW5nZSByZXNldCByZXNpemUgc2Vla2VkIHNlZWtpbmcgc3RhbGxlZCBzdWJtaXQgc3VzcGVuZCB0aW1lVXBkYXRlIHRvdWNoQ2FuY2VsIHRvdWNoRW5kIHRvdWNoU3RhcnQgdm9sdW1lQ2hhbmdlIHNjcm9sbCB0b2dnbGUgdG91Y2hNb3ZlIHdhaXRpbmcgd2hlZWwiLnNwbGl0KCIgIik7ZnVuY3Rpb24gbW8oZSx0KXtUMS5zZXQoZSx0KSxybCh0LFtlXSl9Zm9yKHZhciBtaD0wO21oPER5Lmxlbmd0aDttaCsrKXt2YXIgZ2g9RHlbbWhdLEdiPWdoLnRvTG93ZXJDYXNlKCksWWI9Z2hbMF0udG9VcHBlckNhc2UoKStnaC5zbGljZSgxKTttbyhHYiwib24iK1liKX1tbyhDMSwib25BbmltYXRpb25FbmQiKTttbyhrMSwib25BbmltYXRpb25JdGVyYXRpb24iKTttbygkMSwib25BbmltYXRpb25TdGFydCIpO21vKCJkYmxjbGljayIsIm9uRG91YmxlQ2xpY2siKTttbygiZm9jdXNpbiIsIm9uRm9jdXMiKTttbygiZm9jdXNvdXQiLCJvbkJsdXIiKTttbyhiMSwib25UcmFuc2l0aW9uRW5kIik7ZXMoIm9uTW91c2VFbnRlciIsWyJtb3VzZW91dCIsIm1vdXNlb3ZlciJdKTtlcygib25Nb3VzZUxlYXZlIixbIm1vdXNlb3V0IiwibW91c2VvdmVyIl0pO2VzKCJvblBvaW50ZXJFbnRlciIsWyJwb2ludGVyb3V0IiwicG9pbnRlcm92ZXIiXSk7ZXMoIm9uUG9pbnRlckxlYXZlIixbInBvaW50ZXJvdXQiLCJwb2ludGVyb3ZlciJdKTtybCgib25DaGFuZ2UiLCJjaGFuZ2UgY2xpY2sgZm9jdXNpbiBmb2N1c291dCBpbnB1dCBrZXlkb3duIGtleXVwIHNlbGVjdGlvbmNoYW5nZSIuc3BsaXQoIiAiKSk7cmwoIm9uU2VsZWN0IiwiZm9jdXNvdXQgY29udGV4dG1lbnUgZHJhZ2VuZCBmb2N1c2luIGtleWRvd24ga2V5dXAgbW91c2Vkb3duIG1vdXNldXAgc2VsZWN0aW9uY2hhbmdlIi5zcGxpdCgiICIpKTtybCgib25CZWZvcmVJbnB1dCIsWyJjb21wb3NpdGlvbmVuZCIsImtleXByZXNzIiwidGV4dElucHV0IiwicGFzdGUiXSk7cmwoIm9uQ29tcG9zaXRpb25FbmQiLCJjb21wb3NpdGlvbmVuZCBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93biIuc3BsaXQoIiAiKSk7cmwoIm9uQ29tcG9zaXRpb25TdGFydCIsImNvbXBvc2l0aW9uc3RhcnQgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd24iLnNwbGl0KCIgIikpO3JsKCJvbkNvbXBvc2l0aW9uVXBkYXRlIiwiY29tcG9zaXRpb251cGRhdGUgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd24iLnNwbGl0KCIgIikpO3ZhciBzYT0iYWJvcnQgY2FucGxheSBjYW5wbGF5dGhyb3VnaCBkdXJhdGlvbmNoYW5nZSBlbXB0aWVkIGVuY3J5cHRlZCBlbmRlZCBlcnJvciBsb2FkZWRkYXRhIGxvYWRlZG1ldGFkYXRhIGxvYWRzdGFydCBwYXVzZSBwbGF5IHBsYXlpbmcgcHJvZ3Jlc3MgcmF0ZWNoYW5nZSByZXNpemUgc2Vla2VkIHNlZWtpbmcgc3RhbGxlZCBzdXNwZW5kIHRpbWV1cGRhdGUgdm9sdW1lY2hhbmdlIHdhaXRpbmciLnNwbGl0KCIgIiksWGI9bmV3IFNldCgiY2FuY2VsIGNsb3NlIGludmFsaWQgbG9hZCBzY3JvbGwgdG9nZ2xlIi5zcGxpdCgiICIpLmNvbmNhdChzYSkpO2Z1bmN0aW9uIEl5KGUsdCxuKXt2YXIgcj1lLnR5cGV8fCJ1bmtub3duLWV2ZW50IjtlLmN1cnJlbnRUYXJnZXQ9bixHJChyLHQsdm9pZCAwLGUpLGUuY3VycmVudFRhcmdldD1udWxsfWZ1bmN0aW9uIE4xKGUsdCl7dD0odCY0KSE9PTA7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl0saT1yLmV2ZW50O3I9ci5saXN0ZW5lcnM7ZTp7dmFyIG89dm9pZCAwO2lmKHQpZm9yKHZhciBsPXIubGVuZ3RoLTE7MDw9bDtsLS0pe3ZhciBzPXJbbF0sYT1zLmluc3RhbmNlLHU9cy5jdXJyZW50VGFyZ2V0O2lmKHM9cy5saXN0ZW5lcixhIT09byYmaS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrIGU7SXkoaSxzLHUpLG89YX1lbHNlIGZvcihsPTA7bDxyLmxlbmd0aDtsKyspe2lmKHM9cltsXSxhPXMuaW5zdGFuY2UsdT1zLmN1cnJlbnRUYXJnZXQscz1zLmxpc3RlbmVyLGEhPT1vJiZpLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWsgZTtJeShpLHMsdSksbz1hfX19aWYoUWMpdGhyb3cgZT1ocCxRYz0hMSxocD1udWxsLGV9ZnVuY3Rpb24gZXQoZSx0KXt2YXIgbj10W0VwXTtuPT09dm9pZCAwJiYobj10W0VwXT1uZXcgU2V0KTt2YXIgcj1lKyJfX2J1YmJsZSI7bi5oYXMocil8fChSMSh0LGUsMiwhMSksbi5hZGQocikpfWZ1bmN0aW9uIHZoKGUsdCxuKXt2YXIgcj0wO3QmJihyfD00KSxSMShuLGUscix0KX12YXIgaWM9Il9yZWFjdExpc3RlbmluZyIrTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7ZnVuY3Rpb24gV2EoZSl7aWYoIWVbaWNdKXtlW2ljXT0hMCxMXy5mb3JFYWNoKGZ1bmN0aW9uKG4pe24hPT0ic2VsZWN0aW9uY2hhbmdlIiYmKFhiLmhhcyhuKXx8dmgobiwhMSxlKSx2aChuLCEwLGUpKX0pO3ZhciB0PWUubm9kZVR5cGU9PT05P2U6ZS5vd25lckRvY3VtZW50O3Q9PT1udWxsfHx0W2ljXXx8KHRbaWNdPSEwLHZoKCJzZWxlY3Rpb25jaGFuZ2UiLCExLHQpKX19ZnVuY3Rpb24gUjEoZSx0LG4scil7c3dpdGNoKGgxKHQpKXtjYXNlIDE6dmFyIGk9Y2I7YnJlYWs7Y2FzZSA0Omk9ZGI7YnJlYWs7ZGVmYXVsdDppPWRnfW49aS5iaW5kKG51bGwsdCxuLGUpLGk9dm9pZCAwLCFmcHx8dCE9PSJ0b3VjaHN0YXJ0IiYmdCE9PSJ0b3VjaG1vdmUiJiZ0IT09IndoZWVsInx8KGk9ITApLHI/aSE9PXZvaWQgMD9lLmFkZEV2ZW50TGlzdGVuZXIodCxuLHtjYXB0dXJlOiEwLHBhc3NpdmU6aX0pOmUuYWRkRXZlbnRMaXN0ZW5lcih0LG4sITApOmkhPT12b2lkIDA/ZS5hZGRFdmVudExpc3RlbmVyKHQsbix7cGFzc2l2ZTppfSk6ZS5hZGRFdmVudExpc3RlbmVyKHQsbiwhMSl9ZnVuY3Rpb24geWgoZSx0LG4scixpKXt2YXIgbz1yO2lmKCEodCYxKSYmISh0JjIpJiZyIT09bnVsbCllOmZvcig7Oyl7aWYocj09PW51bGwpcmV0dXJuO3ZhciBsPXIudGFnO2lmKGw9PT0zfHxsPT09NCl7dmFyIHM9ci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztpZihzPT09aXx8cy5ub2RlVHlwZT09PTgmJnMucGFyZW50Tm9kZT09PWkpYnJlYWs7aWYobD09PTQpZm9yKGw9ci5yZXR1cm47bCE9PW51bGw7KXt2YXIgYT1sLnRhZztpZigoYT09PTN8fGE9PT00KSYmKGE9bC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxhPT09aXx8YS5ub2RlVHlwZT09PTgmJmEucGFyZW50Tm9kZT09PWkpKXJldHVybjtsPWwucmV0dXJufWZvcig7cyE9PW51bGw7KXtpZihsPU9vKHMpLGw9PT1udWxsKXJldHVybjtpZihhPWwudGFnLGE9PT01fHxhPT09Nil7cj1vPWw7Y29udGludWUgZX1zPXMucGFyZW50Tm9kZX19cj1yLnJldHVybn1xXyhmdW5jdGlvbigpe3ZhciB1PW8sYz1zZyhuKSxkPVtdO2U6e3ZhciBmPVQxLmdldChlKTtpZihmIT09dm9pZCAwKXt2YXIgaD1oZyxtPWU7c3dpdGNoKGUpe2Nhc2Uia2V5cHJlc3MiOmlmKFBjKG4pPT09MClicmVhayBlO2Nhc2Uia2V5ZG93biI6Y2FzZSJrZXl1cCI6aD0kYjticmVhaztjYXNlImZvY3VzaW4iOm09ImZvY3VzIixoPWRoO2JyZWFrO2Nhc2UiZm9jdXNvdXQiOm09ImJsdXIiLGg9ZGg7YnJlYWs7Y2FzZSJiZWZvcmVibHVyIjpjYXNlImFmdGVyYmx1ciI6aD1kaDticmVhaztjYXNlImNsaWNrIjppZihuLmJ1dHRvbj09PTIpYnJlYWsgZTtjYXNlImF1eGNsaWNrIjpjYXNlImRibGNsaWNrIjpjYXNlIm1vdXNlZG93biI6Y2FzZSJtb3VzZW1vdmUiOmNhc2UibW91c2V1cCI6Y2FzZSJtb3VzZW91dCI6Y2FzZSJtb3VzZW92ZXIiOmNhc2UiY29udGV4dG1lbnUiOmg9Q3k7YnJlYWs7Y2FzZSJkcmFnIjpjYXNlImRyYWdlbmQiOmNhc2UiZHJhZ2VudGVyIjpjYXNlImRyYWdleGl0IjpjYXNlImRyYWdsZWF2ZSI6Y2FzZSJkcmFnb3ZlciI6Y2FzZSJkcmFnc3RhcnQiOmNhc2UiZHJvcCI6aD1wYjticmVhaztjYXNlInRvdWNoY2FuY2VsIjpjYXNlInRvdWNoZW5kIjpjYXNlInRvdWNobW92ZSI6Y2FzZSJ0b3VjaHN0YXJ0IjpoPU5iO2JyZWFrO2Nhc2UgQzE6Y2FzZSBrMTpjYXNlICQxOmg9dmI7YnJlYWs7Y2FzZSBiMTpoPU9iO2JyZWFrO2Nhc2Uic2Nyb2xsIjpoPWZiO2JyZWFrO2Nhc2Uid2hlZWwiOmg9QWI7YnJlYWs7Y2FzZSJjb3B5IjpjYXNlImN1dCI6Y2FzZSJwYXN0ZSI6aD14YjticmVhaztjYXNlImdvdHBvaW50ZXJjYXB0dXJlIjpjYXNlImxvc3Rwb2ludGVyY2FwdHVyZSI6Y2FzZSJwb2ludGVyY2FuY2VsIjpjYXNlInBvaW50ZXJkb3duIjpjYXNlInBvaW50ZXJtb3ZlIjpjYXNlInBvaW50ZXJvdXQiOmNhc2UicG9pbnRlcm92ZXIiOmNhc2UicG9pbnRlcnVwIjpoPSR5fXZhciBnPSh0JjQpIT09MCxTPSFnJiZlPT09InNjcm9sbCIsdj1nP2YhPT1udWxsP2YrIkNhcHR1cmUiOm51bGw6ZjtnPVtdO2Zvcih2YXIgeT11LF87eSE9PW51bGw7KXtfPXk7dmFyIHc9Xy5zdGF0ZU5vZGU7aWYoXy50YWc9PT01JiZ3IT09bnVsbCYmKF89dyx2IT09bnVsbCYmKHc9TGEoeSx2KSx3IT1udWxsJiZnLnB1c2goVmEoeSx3LF8pKSkpLFMpYnJlYWs7eT15LnJldHVybn0wPGcubGVuZ3RoJiYoZj1uZXcgaChmLG0sbnVsbCxuLGMpLGQucHVzaCh7ZXZlbnQ6ZixsaXN0ZW5lcnM6Z30pKX19aWYoISh0JjcpKXtlOntpZihmPWU9PT0ibW91c2VvdmVyInx8ZT09PSJwb2ludGVyb3ZlciIsaD1lPT09Im1vdXNlb3V0Inx8ZT09PSJwb2ludGVyb3V0IixmJiZuIT09Y3AmJihtPW4ucmVsYXRlZFRhcmdldHx8bi5mcm9tRWxlbWVudCkmJihPbyhtKXx8bVtmaV0pKWJyZWFrIGU7aWYoKGh8fGYpJiYoZj1jLndpbmRvdz09PWM/YzooZj1jLm93bmVyRG9jdW1lbnQpP2YuZGVmYXVsdFZpZXd8fGYucGFyZW50V2luZG93OndpbmRvdyxoPyhtPW4ucmVsYXRlZFRhcmdldHx8bi50b0VsZW1lbnQsaD11LG09bT9PbyhtKTpudWxsLG0hPT1udWxsJiYoUz1pbChtKSxtIT09U3x8bS50YWchPT01JiZtLnRhZyE9PTYpJiYobT1udWxsKSk6KGg9bnVsbCxtPXUpLGghPT1tKSl7aWYoZz1DeSx3PSJvbk1vdXNlTGVhdmUiLHY9Im9uTW91c2VFbnRlciIseT0ibW91c2UiLChlPT09InBvaW50ZXJvdXQifHxlPT09InBvaW50ZXJvdmVyIikmJihnPSR5LHc9Im9uUG9pbnRlckxlYXZlIix2PSJvblBvaW50ZXJFbnRlciIseT0icG9pbnRlciIpLFM9aD09bnVsbD9mOk9sKGgpLF89bT09bnVsbD9mOk9sKG0pLGY9bmV3IGcodyx5KyJsZWF2ZSIsaCxuLGMpLGYudGFyZ2V0PVMsZi5yZWxhdGVkVGFyZ2V0PV8sdz1udWxsLE9vKGMpPT09dSYmKGc9bmV3IGcodix5KyJlbnRlciIsbSxuLGMpLGcudGFyZ2V0PV8sZy5yZWxhdGVkVGFyZ2V0PVMsdz1nKSxTPXcsaCYmbSl0Ontmb3IoZz1oLHY9bSx5PTAsXz1nO187Xz1wbChfKSl5Kys7Zm9yKF89MCx3PXY7dzt3PXBsKHcpKV8rKztmb3IoOzA8eS1fOylnPXBsKGcpLHktLTtmb3IoOzA8Xy15Oyl2PXBsKHYpLF8tLTtmb3IoO3ktLTspe2lmKGc9PT12fHx2IT09bnVsbCYmZz09PXYuYWx0ZXJuYXRlKWJyZWFrIHQ7Zz1wbChnKSx2PXBsKHYpfWc9bnVsbH1lbHNlIGc9bnVsbDtoIT09bnVsbCYmTHkoZCxmLGgsZywhMSksbSE9PW51bGwmJlMhPT1udWxsJiZMeShkLFMsbSxnLCEwKX19ZTp7aWYoZj11P09sKHUpOndpbmRvdyxoPWYubm9kZU5hbWUmJmYubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxoPT09InNlbGVjdCJ8fGg9PT0iaW5wdXQiJiZmLnR5cGU9PT0iZmlsZSIpdmFyIEU9RmI7ZWxzZSBpZihOeShmKSlpZih4MSlFPVZiO2Vsc2V7RT1VYjt2YXIgJD1CYn1lbHNlKGg9Zi5ub2RlTmFtZSkmJmgudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJihmLnR5cGU9PT0iY2hlY2tib3gifHxmLnR5cGU9PT0icmFkaW8iKSYmKEU9V2IpO2lmKEUmJihFPUUoZSx1KSkpe3kxKGQsRSxuLGMpO2JyZWFrIGV9JCYmJChlLGYsdSksZT09PSJmb2N1c291dCImJigkPWYuX3dyYXBwZXJTdGF0ZSkmJiQuY29udHJvbGxlZCYmZi50eXBlPT09Im51bWJlciImJm9wKGYsIm51bWJlciIsZi52YWx1ZSl9c3dpdGNoKCQ9dT9PbCh1KTp3aW5kb3csZSl7Y2FzZSJmb2N1c2luIjooTnkoJCl8fCQuY29udGVudEVkaXRhYmxlPT09InRydWUiKSYmKE5sPSQsdnA9dSxnYT1udWxsKTticmVhaztjYXNlImZvY3Vzb3V0IjpnYT12cD1ObD1udWxsO2JyZWFrO2Nhc2UibW91c2Vkb3duIjp5cD0hMDticmVhaztjYXNlImNvbnRleHRtZW51IjpjYXNlIm1vdXNldXAiOmNhc2UiZHJhZ2VuZCI6eXA9ITEsTXkoZCxuLGMpO2JyZWFrO2Nhc2Uic2VsZWN0aW9uY2hhbmdlIjppZihaYilicmVhaztjYXNlImtleWRvd24iOmNhc2Uia2V5dXAiOk15KGQsbixjKX12YXIgQztpZihtZyllOntzd2l0Y2goZSl7Y2FzZSJjb21wb3NpdGlvbnN0YXJ0Ijp2YXIgVD0ib25Db21wb3NpdGlvblN0YXJ0IjticmVhayBlO2Nhc2UiY29tcG9zaXRpb25lbmQiOlQ9Im9uQ29tcG9zaXRpb25FbmQiO2JyZWFrIGU7Y2FzZSJjb21wb3NpdGlvbnVwZGF0ZSI6VD0ib25Db21wb3NpdGlvblVwZGF0ZSI7YnJlYWsgZX1UPXZvaWQgMH1lbHNlIFRsP2cxKGUsbikmJihUPSJvbkNvbXBvc2l0aW9uRW5kIik6ZT09PSJrZXlkb3duIiYmbi5rZXlDb2RlPT09MjI5JiYoVD0ib25Db21wb3NpdGlvblN0YXJ0Iik7VCYmKG0xJiZuLmxvY2FsZSE9PSJrbyImJihUbHx8VCE9PSJvbkNvbXBvc2l0aW9uU3RhcnQiP1Q9PT0ib25Db21wb3NpdGlvbkVuZCImJlRsJiYoQz1wMSgpKTooRmk9YyxmZz0idmFsdWUiaW4gRmk/RmkudmFsdWU6RmkudGV4dENvbnRlbnQsVGw9ITApKSwkPW5kKHUsVCksMDwkLmxlbmd0aCYmKFQ9bmV3IGt5KFQsZSxudWxsLG4sYyksZC5wdXNoKHtldmVudDpULGxpc3RlbmVyczokfSksQz9ULmRhdGE9QzooQz12MShuKSxDIT09bnVsbCYmKFQuZGF0YT1DKSkpKSwoQz1EYj9JYihlLG4pOkxiKGUsbikpJiYodT1uZCh1LCJvbkJlZm9yZUlucHV0IiksMDx1Lmxlbmd0aCYmKGM9bmV3IGt5KCJvbkJlZm9yZUlucHV0IiwiYmVmb3JlaW5wdXQiLG51bGwsbixjKSxkLnB1c2goe2V2ZW50OmMsbGlzdGVuZXJzOnV9KSxjLmRhdGE9QykpfU4xKGQsdCl9KX1mdW5jdGlvbiBWYShlLHQsbil7cmV0dXJue2luc3RhbmNlOmUsbGlzdGVuZXI6dCxjdXJyZW50VGFyZ2V0Om59fWZ1bmN0aW9uIG5kKGUsdCl7Zm9yKHZhciBuPXQrIkNhcHR1cmUiLHI9W107ZSE9PW51bGw7KXt2YXIgaT1lLG89aS5zdGF0ZU5vZGU7aS50YWc9PT01JiZvIT09bnVsbCYmKGk9byxvPUxhKGUsbiksbyE9bnVsbCYmci51bnNoaWZ0KFZhKGUsbyxpKSksbz1MYShlLHQpLG8hPW51bGwmJnIucHVzaChWYShlLG8saSkpKSxlPWUucmV0dXJufXJldHVybiByfWZ1bmN0aW9uIHBsKGUpe2lmKGU9PT1udWxsKXJldHVybiBudWxsO2RvIGU9ZS5yZXR1cm47d2hpbGUoZSYmZS50YWchPT01KTtyZXR1cm4gZXx8bnVsbH1mdW5jdGlvbiBMeShlLHQsbixyLGkpe2Zvcih2YXIgbz10Ll9yZWFjdE5hbWUsbD1bXTtuIT09bnVsbCYmbiE9PXI7KXt2YXIgcz1uLGE9cy5hbHRlcm5hdGUsdT1zLnN0YXRlTm9kZTtpZihhIT09bnVsbCYmYT09PXIpYnJlYWs7cy50YWc9PT01JiZ1IT09bnVsbCYmKHM9dSxpPyhhPUxhKG4sbyksYSE9bnVsbCYmbC51bnNoaWZ0KFZhKG4sYSxzKSkpOml8fChhPUxhKG4sbyksYSE9bnVsbCYmbC5wdXNoKFZhKG4sYSxzKSkpKSxuPW4ucmV0dXJufWwubGVuZ3RoIT09MCYmZS5wdXNoKHtldmVudDp0LGxpc3RlbmVyczpsfSl9dmFyIFFiPS9cclxuPy9nLEpiPS9cdTAwMDB8XHVGRkZEL2c7ZnVuY3Rpb24gankoZSl7cmV0dXJuKHR5cGVvZiBlPT0ic3RyaW5nIj9lOiIiK2UpLnJlcGxhY2UoUWIsYApgKS5yZXBsYWNlKEpiLCIiKX1mdW5jdGlvbiBvYyhlLHQsbil7aWYodD1qeSh0KSxqeShlKSE9PXQmJm4pdGhyb3cgRXJyb3IoVSg0MjUpKX1mdW5jdGlvbiByZCgpe312YXIgeHA9bnVsbCxfcD1udWxsO2Z1bmN0aW9uIHdwKGUsdCl7cmV0dXJuIGU9PT0idGV4dGFyZWEifHxlPT09Im5vc2NyaXB0Inx8dHlwZW9mIHQuY2hpbGRyZW49PSJzdHJpbmcifHx0eXBlb2YgdC5jaGlsZHJlbj09Im51bWJlciJ8fHR5cGVvZiB0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPT0ib2JqZWN0IiYmdC5kYW5nZXJvdXNseVNldElubmVySFRNTCE9PW51bGwmJnQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sIT1udWxsfXZhciBTcD10eXBlb2Ygc2V0VGltZW91dD09ImZ1bmN0aW9uIj9zZXRUaW1lb3V0OnZvaWQgMCxxYj10eXBlb2YgY2xlYXJUaW1lb3V0PT0iZnVuY3Rpb24iP2NsZWFyVGltZW91dDp2b2lkIDAsenk9dHlwZW9mIFByb21pc2U9PSJmdW5jdGlvbiI/UHJvbWlzZTp2b2lkIDAsZVQ9dHlwZW9mIHF1ZXVlTWljcm90YXNrPT0iZnVuY3Rpb24iP3F1ZXVlTWljcm90YXNrOnR5cGVvZiB6eTwidSI/ZnVuY3Rpb24oZSl7cmV0dXJuIHp5LnJlc29sdmUobnVsbCkudGhlbihlKS5jYXRjaCh0VCl9OlNwO2Z1bmN0aW9uIHRUKGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBlfSl9ZnVuY3Rpb24geGgoZSx0KXt2YXIgbj10LHI9MDtkb3t2YXIgaT1uLm5leHRTaWJsaW5nO2lmKGUucmVtb3ZlQ2hpbGQobiksaSYmaS5ub2RlVHlwZT09PTgpaWYobj1pLmRhdGEsbj09PSIvJCIpe2lmKHI9PT0wKXtlLnJlbW92ZUNoaWxkKGkpLEZhKHQpO3JldHVybn1yLS19ZWxzZSBuIT09IiQiJiZuIT09IiQ/IiYmbiE9PSIkISJ8fHIrKztuPWl9d2hpbGUobik7RmEodCl9ZnVuY3Rpb24gWmkoZSl7Zm9yKDtlIT1udWxsO2U9ZS5uZXh0U2libGluZyl7dmFyIHQ9ZS5ub2RlVHlwZTtpZih0PT09MXx8dD09PTMpYnJlYWs7aWYodD09PTgpe2lmKHQ9ZS5kYXRhLHQ9PT0iJCJ8fHQ9PT0iJCEifHx0PT09IiQ/IilicmVhaztpZih0PT09Ii8kIilyZXR1cm4gbnVsbH19cmV0dXJuIGV9ZnVuY3Rpb24gRnkoZSl7ZT1lLnByZXZpb3VzU2libGluZztmb3IodmFyIHQ9MDtlOyl7aWYoZS5ub2RlVHlwZT09PTgpe3ZhciBuPWUuZGF0YTtpZihuPT09IiQifHxuPT09IiQhInx8bj09PSIkPyIpe2lmKHQ9PT0wKXJldHVybiBlO3QtLX1lbHNlIG49PT0iLyQiJiZ0Kyt9ZT1lLnByZXZpb3VzU2libGluZ31yZXR1cm4gbnVsbH12YXIgX3M9TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiksTXI9Il9fcmVhY3RGaWJlciQiK19zLEhhPSJfX3JlYWN0UHJvcHMkIitfcyxmaT0iX19yZWFjdENvbnRhaW5lciQiK19zLEVwPSJfX3JlYWN0RXZlbnRzJCIrX3MsblQ9Il9fcmVhY3RMaXN0ZW5lcnMkIitfcyxyVD0iX19yZWFjdEhhbmRsZXMkIitfcztmdW5jdGlvbiBPbyhlKXt2YXIgdD1lW01yXTtpZih0KXJldHVybiB0O2Zvcih2YXIgbj1lLnBhcmVudE5vZGU7bjspe2lmKHQ9bltmaV18fG5bTXJdKXtpZihuPXQuYWx0ZXJuYXRlLHQuY2hpbGQhPT1udWxsfHxuIT09bnVsbCYmbi5jaGlsZCE9PW51bGwpZm9yKGU9RnkoZSk7ZSE9PW51bGw7KXtpZihuPWVbTXJdKXJldHVybiBuO2U9RnkoZSl9cmV0dXJuIHR9ZT1uLG49ZS5wYXJlbnROb2RlfXJldHVybiBudWxsfWZ1bmN0aW9uIFJ1KGUpe3JldHVybiBlPWVbTXJdfHxlW2ZpXSwhZXx8ZS50YWchPT01JiZlLnRhZyE9PTYmJmUudGFnIT09MTMmJmUudGFnIT09Mz9udWxsOmV9ZnVuY3Rpb24gT2woZSl7aWYoZS50YWc9PT01fHxlLnRhZz09PTYpcmV0dXJuIGUuc3RhdGVOb2RlO3Rocm93IEVycm9yKFUoMzMpKX1mdW5jdGlvbiBhZihlKXtyZXR1cm4gZVtIYV18fG51bGx9dmFyIENwPVtdLFBsPS0xO2Z1bmN0aW9uIGdvKGUpe3JldHVybntjdXJyZW50OmV9fWZ1bmN0aW9uIGl0KGUpezA+UGx8fChlLmN1cnJlbnQ9Q3BbUGxdLENwW1BsXT1udWxsLFBsLS0pfWZ1bmN0aW9uIFhlKGUsdCl7UGwrKyxDcFtQbF09ZS5jdXJyZW50LGUuY3VycmVudD10fXZhciBubz17fSxybj1nbyhubyksYm49Z28oITEpLFdvPW5vO2Z1bmN0aW9uIHRzKGUsdCl7dmFyIG49ZS50eXBlLmNvbnRleHRUeXBlcztpZighbilyZXR1cm4gbm87dmFyIHI9ZS5zdGF0ZU5vZGU7aWYociYmci5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PT09dClyZXR1cm4gci5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dDt2YXIgaT17fSxvO2ZvcihvIGluIG4paVtvXT10W29dO3JldHVybiByJiYoZT1lLnN0YXRlTm9kZSxlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9dCxlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0PWkpLGl9ZnVuY3Rpb24gVG4oZSl7cmV0dXJuIGU9ZS5jaGlsZENvbnRleHRUeXBlcyxlIT1udWxsfWZ1bmN0aW9uIGlkKCl7aXQoYm4pLGl0KHJuKX1mdW5jdGlvbiBCeShlLHQsbil7aWYocm4uY3VycmVudCE9PW5vKXRocm93IEVycm9yKFUoMTY4KSk7WGUocm4sdCksWGUoYm4sbil9ZnVuY3Rpb24gTzEoZSx0LG4pe3ZhciByPWUuc3RhdGVOb2RlO2lmKHQ9dC5jaGlsZENvbnRleHRUeXBlcyx0eXBlb2Ygci5nZXRDaGlsZENvbnRleHQhPSJmdW5jdGlvbiIpcmV0dXJuIG47cj1yLmdldENoaWxkQ29udGV4dCgpO2Zvcih2YXIgaSBpbiByKWlmKCEoaSBpbiB0KSl0aHJvdyBFcnJvcihVKDEwOCxCJChlKXx8IlVua25vd24iLGkpKTtyZXR1cm4gbXQoe30sbixyKX1mdW5jdGlvbiBvZChlKXtyZXR1cm4gZT0oZT1lLnN0YXRlTm9kZSkmJmUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHR8fG5vLFdvPXJuLmN1cnJlbnQsWGUocm4sZSksWGUoYm4sYm4uY3VycmVudCksITB9ZnVuY3Rpb24gVXkoZSx0LG4pe3ZhciByPWUuc3RhdGVOb2RlO2lmKCFyKXRocm93IEVycm9yKFUoMTY5KSk7bj8oZT1PMShlLHQsV28pLHIuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ9ZSxpdChibiksaXQocm4pLFhlKHJuLGUpKTppdChibiksWGUoYm4sbil9dmFyIGlpPW51bGwsdWY9ITEsX2g9ITE7ZnVuY3Rpb24gUDEoZSl7aWk9PT1udWxsP2lpPVtlXTppaS5wdXNoKGUpfWZ1bmN0aW9uIGlUKGUpe3VmPSEwLFAxKGUpfWZ1bmN0aW9uIHZvKCl7aWYoIV9oJiZpaSE9PW51bGwpe19oPSEwO3ZhciBlPTAsdD1VZTt0cnl7dmFyIG49aWk7Zm9yKFVlPTE7ZTxuLmxlbmd0aDtlKyspe3ZhciByPW5bZV07ZG8gcj1yKCEwKTt3aGlsZShyIT09bnVsbCl9aWk9bnVsbCx1Zj0hMX1jYXRjaChpKXt0aHJvdyBpaSE9PW51bGwmJihpaT1paS5zbGljZShlKzEpKSxyMShhZyx2byksaX1maW5hbGx5e1VlPXQsX2g9ITF9fXJldHVybiBudWxsfXZhciBBbD1bXSxNbD0wLGxkPW51bGwsc2Q9MCxZbj1bXSxYbj0wLFZvPW51bGwsc2k9MSxhaT0iIjtmdW5jdGlvbiBibyhlLHQpe0FsW01sKytdPXNkLEFsW01sKytdPWxkLGxkPWUsc2Q9dH1mdW5jdGlvbiBBMShlLHQsbil7WW5bWG4rK109c2ksWW5bWG4rK109YWksWW5bWG4rK109Vm8sVm89ZTt2YXIgcj1zaTtlPWFpO3ZhciBpPTMyLXdyKHIpLTE7ciY9figxPDxpKSxuKz0xO3ZhciBvPTMyLXdyKHQpK2k7aWYoMzA8byl7dmFyIGw9aS1pJTU7bz0ociYoMTw8bCktMSkudG9TdHJpbmcoMzIpLHI+Pj1sLGktPWwsc2k9MTw8MzItd3IodCkraXxuPDxpfHIsYWk9bytlfWVsc2Ugc2k9MTw8b3xuPDxpfHIsYWk9ZX1mdW5jdGlvbiB2ZyhlKXtlLnJldHVybiE9PW51bGwmJihibyhlLDEpLEExKGUsMSwwKSl9ZnVuY3Rpb24geWcoZSl7Zm9yKDtlPT09bGQ7KWxkPUFsWy0tTWxdLEFsW01sXT1udWxsLHNkPUFsWy0tTWxdLEFsW01sXT1udWxsO2Zvcig7ZT09PVZvOylWbz1ZblstLVhuXSxZbltYbl09bnVsbCxhaT1ZblstLVhuXSxZbltYbl09bnVsbCxzaT1ZblstLVhuXSxZbltYbl09bnVsbH12YXIgTG49bnVsbCxJbj1udWxsLG90PSExLHlyPW51bGw7ZnVuY3Rpb24gTTEoZSx0KXt2YXIgbj1xbig1LG51bGwsbnVsbCwwKTtuLmVsZW1lbnRUeXBlPSJERUxFVEVEIixuLnN0YXRlTm9kZT10LG4ucmV0dXJuPWUsdD1lLmRlbGV0aW9ucyx0PT09bnVsbD8oZS5kZWxldGlvbnM9W25dLGUuZmxhZ3N8PTE2KTp0LnB1c2gobil9ZnVuY3Rpb24gV3koZSx0KXtzd2l0Y2goZS50YWcpe2Nhc2UgNTp2YXIgbj1lLnR5cGU7cmV0dXJuIHQ9dC5ub2RlVHlwZSE9PTF8fG4udG9Mb3dlckNhc2UoKSE9PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT9udWxsOnQsdCE9PW51bGw/KGUuc3RhdGVOb2RlPXQsTG49ZSxJbj1aaSh0LmZpcnN0Q2hpbGQpLCEwKTohMTtjYXNlIDY6cmV0dXJuIHQ9ZS5wZW5kaW5nUHJvcHM9PT0iInx8dC5ub2RlVHlwZSE9PTM/bnVsbDp0LHQhPT1udWxsPyhlLnN0YXRlTm9kZT10LExuPWUsSW49bnVsbCwhMCk6ITE7Y2FzZSAxMzpyZXR1cm4gdD10Lm5vZGVUeXBlIT09OD9udWxsOnQsdCE9PW51bGw/KG49Vm8hPT1udWxsP3tpZDpzaSxvdmVyZmxvdzphaX06bnVsbCxlLm1lbW9pemVkU3RhdGU9e2RlaHlkcmF0ZWQ6dCx0cmVlQ29udGV4dDpuLHJldHJ5TGFuZToxMDczNzQxODI0fSxuPXFuKDE4LG51bGwsbnVsbCwwKSxuLnN0YXRlTm9kZT10LG4ucmV0dXJuPWUsZS5jaGlsZD1uLExuPWUsSW49bnVsbCwhMCk6ITE7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24ga3AoZSl7cmV0dXJuKGUubW9kZSYxKSE9PTAmJihlLmZsYWdzJjEyOCk9PT0wfWZ1bmN0aW9uICRwKGUpe2lmKG90KXt2YXIgdD1JbjtpZih0KXt2YXIgbj10O2lmKCFXeShlLHQpKXtpZihrcChlKSl0aHJvdyBFcnJvcihVKDQxOCkpO3Q9Wmkobi5uZXh0U2libGluZyk7dmFyIHI9TG47dCYmV3koZSx0KT9NMShyLG4pOihlLmZsYWdzPWUuZmxhZ3MmLTQwOTd8MixvdD0hMSxMbj1lKX19ZWxzZXtpZihrcChlKSl0aHJvdyBFcnJvcihVKDQxOCkpO2UuZmxhZ3M9ZS5mbGFncyYtNDA5N3wyLG90PSExLExuPWV9fX1mdW5jdGlvbiBWeShlKXtmb3IoZT1lLnJldHVybjtlIT09bnVsbCYmZS50YWchPT01JiZlLnRhZyE9PTMmJmUudGFnIT09MTM7KWU9ZS5yZXR1cm47TG49ZX1mdW5jdGlvbiBsYyhlKXtpZihlIT09TG4pcmV0dXJuITE7aWYoIW90KXJldHVybiBWeShlKSxvdD0hMCwhMTt2YXIgdDtpZigodD1lLnRhZyE9PTMpJiYhKHQ9ZS50YWchPT01KSYmKHQ9ZS50eXBlLHQ9dCE9PSJoZWFkIiYmdCE9PSJib2R5IiYmIXdwKGUudHlwZSxlLm1lbW9pemVkUHJvcHMpKSx0JiYodD1Jbikpe2lmKGtwKGUpKXRocm93IEQxKCksRXJyb3IoVSg0MTgpKTtmb3IoO3Q7KU0xKGUsdCksdD1aaSh0Lm5leHRTaWJsaW5nKX1pZihWeShlKSxlLnRhZz09PTEzKXtpZihlPWUubWVtb2l6ZWRTdGF0ZSxlPWUhPT1udWxsP2UuZGVoeWRyYXRlZDpudWxsLCFlKXRocm93IEVycm9yKFUoMzE3KSk7ZTp7Zm9yKGU9ZS5uZXh0U2libGluZyx0PTA7ZTspe2lmKGUubm9kZVR5cGU9PT04KXt2YXIgbj1lLmRhdGE7aWYobj09PSIvJCIpe2lmKHQ9PT0wKXtJbj1aaShlLm5leHRTaWJsaW5nKTticmVhayBlfXQtLX1lbHNlIG4hPT0iJCImJm4hPT0iJCEiJiZuIT09IiQ/Inx8dCsrfWU9ZS5uZXh0U2libGluZ31Jbj1udWxsfX1lbHNlIEluPUxuP1ppKGUuc3RhdGVOb2RlLm5leHRTaWJsaW5nKTpudWxsO3JldHVybiEwfWZ1bmN0aW9uIEQxKCl7Zm9yKHZhciBlPUluO2U7KWU9WmkoZS5uZXh0U2libGluZyl9ZnVuY3Rpb24gbnMoKXtJbj1Mbj1udWxsLG90PSExfWZ1bmN0aW9uIHhnKGUpe3lyPT09bnVsbD95cj1bZV06eXIucHVzaChlKX12YXIgb1Q9eGkuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7ZnVuY3Rpb24gbXIoZSx0KXtpZihlJiZlLmRlZmF1bHRQcm9wcyl7dD1tdCh7fSx0KSxlPWUuZGVmYXVsdFByb3BzO2Zvcih2YXIgbiBpbiBlKXRbbl09PT12b2lkIDAmJih0W25dPWVbbl0pO3JldHVybiB0fXJldHVybiB0fXZhciBhZD1nbyhudWxsKSx1ZD1udWxsLERsPW51bGwsX2c9bnVsbDtmdW5jdGlvbiB3Zygpe19nPURsPXVkPW51bGx9ZnVuY3Rpb24gU2coZSl7dmFyIHQ9YWQuY3VycmVudDtpdChhZCksZS5fY3VycmVudFZhbHVlPXR9ZnVuY3Rpb24gYnAoZSx0LG4pe2Zvcig7ZSE9PW51bGw7KXt2YXIgcj1lLmFsdGVybmF0ZTtpZigoZS5jaGlsZExhbmVzJnQpIT09dD8oZS5jaGlsZExhbmVzfD10LHIhPT1udWxsJiYoci5jaGlsZExhbmVzfD10KSk6ciE9PW51bGwmJihyLmNoaWxkTGFuZXMmdCkhPT10JiYoci5jaGlsZExhbmVzfD10KSxlPT09bilicmVhaztlPWUucmV0dXJufX1mdW5jdGlvbiBLbChlLHQpe3VkPWUsX2c9RGw9bnVsbCxlPWUuZGVwZW5kZW5jaWVzLGUhPT1udWxsJiZlLmZpcnN0Q29udGV4dCE9PW51bGwmJihlLmxhbmVzJnQmJigkbj0hMCksZS5maXJzdENvbnRleHQ9bnVsbCl9ZnVuY3Rpb24gcnIoZSl7dmFyIHQ9ZS5fY3VycmVudFZhbHVlO2lmKF9nIT09ZSlpZihlPXtjb250ZXh0OmUsbWVtb2l6ZWRWYWx1ZTp0LG5leHQ6bnVsbH0sRGw9PT1udWxsKXtpZih1ZD09PW51bGwpdGhyb3cgRXJyb3IoVSgzMDgpKTtEbD1lLHVkLmRlcGVuZGVuY2llcz17bGFuZXM6MCxmaXJzdENvbnRleHQ6ZX19ZWxzZSBEbD1EbC5uZXh0PWU7cmV0dXJuIHR9dmFyIFBvPW51bGw7ZnVuY3Rpb24gRWcoZSl7UG89PT1udWxsP1BvPVtlXTpQby5wdXNoKGUpfWZ1bmN0aW9uIEkxKGUsdCxuLHIpe3ZhciBpPXQuaW50ZXJsZWF2ZWQ7cmV0dXJuIGk9PT1udWxsPyhuLm5leHQ9bixFZyh0KSk6KG4ubmV4dD1pLm5leHQsaS5uZXh0PW4pLHQuaW50ZXJsZWF2ZWQ9bixoaShlLHIpfWZ1bmN0aW9uIGhpKGUsdCl7ZS5sYW5lc3w9dDt2YXIgbj1lLmFsdGVybmF0ZTtmb3IobiE9PW51bGwmJihuLmxhbmVzfD10KSxuPWUsZT1lLnJldHVybjtlIT09bnVsbDspZS5jaGlsZExhbmVzfD10LG49ZS5hbHRlcm5hdGUsbiE9PW51bGwmJihuLmNoaWxkTGFuZXN8PXQpLG49ZSxlPWUucmV0dXJuO3JldHVybiBuLnRhZz09PTM/bi5zdGF0ZU5vZGU6bnVsbH12YXIgTWk9ITE7ZnVuY3Rpb24gQ2coZSl7ZS51cGRhdGVRdWV1ZT17YmFzZVN0YXRlOmUubWVtb2l6ZWRTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6bnVsbCxsYXN0QmFzZVVwZGF0ZTpudWxsLHNoYXJlZDp7cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MH0sZWZmZWN0czpudWxsfX1mdW5jdGlvbiBMMShlLHQpe2U9ZS51cGRhdGVRdWV1ZSx0LnVwZGF0ZVF1ZXVlPT09ZSYmKHQudXBkYXRlUXVldWU9e2Jhc2VTdGF0ZTplLmJhc2VTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6ZS5maXJzdEJhc2VVcGRhdGUsbGFzdEJhc2VVcGRhdGU6ZS5sYXN0QmFzZVVwZGF0ZSxzaGFyZWQ6ZS5zaGFyZWQsZWZmZWN0czplLmVmZmVjdHN9KX1mdW5jdGlvbiB1aShlLHQpe3JldHVybntldmVudFRpbWU6ZSxsYW5lOnQsdGFnOjAscGF5bG9hZDpudWxsLGNhbGxiYWNrOm51bGwsbmV4dDpudWxsfX1mdW5jdGlvbiBHaShlLHQsbil7dmFyIHI9ZS51cGRhdGVRdWV1ZTtpZihyPT09bnVsbClyZXR1cm4gbnVsbDtpZihyPXIuc2hhcmVkLE1lJjIpe3ZhciBpPXIucGVuZGluZztyZXR1cm4gaT09PW51bGw/dC5uZXh0PXQ6KHQubmV4dD1pLm5leHQsaS5uZXh0PXQpLHIucGVuZGluZz10LGhpKGUsbil9cmV0dXJuIGk9ci5pbnRlcmxlYXZlZCxpPT09bnVsbD8odC5uZXh0PXQsRWcocikpOih0Lm5leHQ9aS5uZXh0LGkubmV4dD10KSxyLmludGVybGVhdmVkPXQsaGkoZSxuKX1mdW5jdGlvbiBBYyhlLHQsbil7aWYodD10LnVwZGF0ZVF1ZXVlLHQhPT1udWxsJiYodD10LnNoYXJlZCwobiY0MTk0MjQwKSE9PTApKXt2YXIgcj10LmxhbmVzO3ImPWUucGVuZGluZ0xhbmVzLG58PXIsdC5sYW5lcz1uLHVnKGUsbil9fWZ1bmN0aW9uIEh5KGUsdCl7dmFyIG49ZS51cGRhdGVRdWV1ZSxyPWUuYWx0ZXJuYXRlO2lmKHIhPT1udWxsJiYocj1yLnVwZGF0ZVF1ZXVlLG49PT1yKSl7dmFyIGk9bnVsbCxvPW51bGw7aWYobj1uLmZpcnN0QmFzZVVwZGF0ZSxuIT09bnVsbCl7ZG97dmFyIGw9e2V2ZW50VGltZTpuLmV2ZW50VGltZSxsYW5lOm4ubGFuZSx0YWc6bi50YWcscGF5bG9hZDpuLnBheWxvYWQsY2FsbGJhY2s6bi5jYWxsYmFjayxuZXh0Om51bGx9O289PT1udWxsP2k9bz1sOm89by5uZXh0PWwsbj1uLm5leHR9d2hpbGUobiE9PW51bGwpO289PT1udWxsP2k9bz10Om89by5uZXh0PXR9ZWxzZSBpPW89dDtuPXtiYXNlU3RhdGU6ci5iYXNlU3RhdGUsZmlyc3RCYXNlVXBkYXRlOmksbGFzdEJhc2VVcGRhdGU6byxzaGFyZWQ6ci5zaGFyZWQsZWZmZWN0czpyLmVmZmVjdHN9LGUudXBkYXRlUXVldWU9bjtyZXR1cm59ZT1uLmxhc3RCYXNlVXBkYXRlLGU9PT1udWxsP24uZmlyc3RCYXNlVXBkYXRlPXQ6ZS5uZXh0PXQsbi5sYXN0QmFzZVVwZGF0ZT10fWZ1bmN0aW9uIGNkKGUsdCxuLHIpe3ZhciBpPWUudXBkYXRlUXVldWU7TWk9ITE7dmFyIG89aS5maXJzdEJhc2VVcGRhdGUsbD1pLmxhc3RCYXNlVXBkYXRlLHM9aS5zaGFyZWQucGVuZGluZztpZihzIT09bnVsbCl7aS5zaGFyZWQucGVuZGluZz1udWxsO3ZhciBhPXMsdT1hLm5leHQ7YS5uZXh0PW51bGwsbD09PW51bGw/bz11OmwubmV4dD11LGw9YTt2YXIgYz1lLmFsdGVybmF0ZTtjIT09bnVsbCYmKGM9Yy51cGRhdGVRdWV1ZSxzPWMubGFzdEJhc2VVcGRhdGUscyE9PWwmJihzPT09bnVsbD9jLmZpcnN0QmFzZVVwZGF0ZT11OnMubmV4dD11LGMubGFzdEJhc2VVcGRhdGU9YSkpfWlmKG8hPT1udWxsKXt2YXIgZD1pLmJhc2VTdGF0ZTtsPTAsYz11PWE9bnVsbCxzPW87ZG97dmFyIGY9cy5sYW5lLGg9cy5ldmVudFRpbWU7aWYoKHImZik9PT1mKXtjIT09bnVsbCYmKGM9Yy5uZXh0PXtldmVudFRpbWU6aCxsYW5lOjAsdGFnOnMudGFnLHBheWxvYWQ6cy5wYXlsb2FkLGNhbGxiYWNrOnMuY2FsbGJhY2ssbmV4dDpudWxsfSk7ZTp7dmFyIG09ZSxnPXM7c3dpdGNoKGY9dCxoPW4sZy50YWcpe2Nhc2UgMTppZihtPWcucGF5bG9hZCx0eXBlb2YgbT09ImZ1bmN0aW9uIil7ZD1tLmNhbGwoaCxkLGYpO2JyZWFrIGV9ZD1tO2JyZWFrIGU7Y2FzZSAzOm0uZmxhZ3M9bS5mbGFncyYtNjU1Mzd8MTI4O2Nhc2UgMDppZihtPWcucGF5bG9hZCxmPXR5cGVvZiBtPT0iZnVuY3Rpb24iP20uY2FsbChoLGQsZik6bSxmPT1udWxsKWJyZWFrIGU7ZD1tdCh7fSxkLGYpO2JyZWFrIGU7Y2FzZSAyOk1pPSEwfX1zLmNhbGxiYWNrIT09bnVsbCYmcy5sYW5lIT09MCYmKGUuZmxhZ3N8PTY0LGY9aS5lZmZlY3RzLGY9PT1udWxsP2kuZWZmZWN0cz1bc106Zi5wdXNoKHMpKX1lbHNlIGg9e2V2ZW50VGltZTpoLGxhbmU6Zix0YWc6cy50YWcscGF5bG9hZDpzLnBheWxvYWQsY2FsbGJhY2s6cy5jYWxsYmFjayxuZXh0Om51bGx9LGM9PT1udWxsPyh1PWM9aCxhPWQpOmM9Yy5uZXh0PWgsbHw9ZjtpZihzPXMubmV4dCxzPT09bnVsbCl7aWYocz1pLnNoYXJlZC5wZW5kaW5nLHM9PT1udWxsKWJyZWFrO2Y9cyxzPWYubmV4dCxmLm5leHQ9bnVsbCxpLmxhc3RCYXNlVXBkYXRlPWYsaS5zaGFyZWQucGVuZGluZz1udWxsfX13aGlsZSghMCk7aWYoYz09PW51bGwmJihhPWQpLGkuYmFzZVN0YXRlPWEsaS5maXJzdEJhc2VVcGRhdGU9dSxpLmxhc3RCYXNlVXBkYXRlPWMsdD1pLnNoYXJlZC5pbnRlcmxlYXZlZCx0IT09bnVsbCl7aT10O2RvIGx8PWkubGFuZSxpPWkubmV4dDt3aGlsZShpIT09dCl9ZWxzZSBvPT09bnVsbCYmKGkuc2hhcmVkLmxhbmVzPTApO0tvfD1sLGUubGFuZXM9bCxlLm1lbW9pemVkU3RhdGU9ZH19ZnVuY3Rpb24gS3koZSx0LG4pe2lmKGU9dC5lZmZlY3RzLHQuZWZmZWN0cz1udWxsLGUhPT1udWxsKWZvcih0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciByPWVbdF0saT1yLmNhbGxiYWNrO2lmKGkhPT1udWxsKXtpZihyLmNhbGxiYWNrPW51bGwscj1uLHR5cGVvZiBpIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFUoMTkxLGkpKTtpLmNhbGwocil9fX12YXIgajE9bmV3IElfLkNvbXBvbmVudCgpLnJlZnM7ZnVuY3Rpb24gVHAoZSx0LG4scil7dD1lLm1lbW9pemVkU3RhdGUsbj1uKHIsdCksbj1uPT1udWxsP3Q6bXQoe30sdCxuKSxlLm1lbW9pemVkU3RhdGU9bixlLmxhbmVzPT09MCYmKGUudXBkYXRlUXVldWUuYmFzZVN0YXRlPW4pfXZhciBjZj17aXNNb3VudGVkOmZ1bmN0aW9uKGUpe3JldHVybihlPWUuX3JlYWN0SW50ZXJuYWxzKT9pbChlKT09PWU6ITF9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbihlLHQsbil7ZT1lLl9yZWFjdEludGVybmFsczt2YXIgcj12bigpLGk9WGkoZSksbz11aShyLGkpO28ucGF5bG9hZD10LG4hPW51bGwmJihvLmNhbGxiYWNrPW4pLHQ9R2koZSxvLGkpLHQhPT1udWxsJiYoU3IodCxlLGksciksQWModCxlLGkpKX0sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbihlLHQsbil7ZT1lLl9yZWFjdEludGVybmFsczt2YXIgcj12bigpLGk9WGkoZSksbz11aShyLGkpO28udGFnPTEsby5wYXlsb2FkPXQsbiE9bnVsbCYmKG8uY2FsbGJhY2s9biksdD1HaShlLG8saSksdCE9PW51bGwmJihTcih0LGUsaSxyKSxBYyh0LGUsaSkpfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oZSx0KXtlPWUuX3JlYWN0SW50ZXJuYWxzO3ZhciBuPXZuKCkscj1YaShlKSxpPXVpKG4scik7aS50YWc9Mix0IT1udWxsJiYoaS5jYWxsYmFjaz10KSx0PUdpKGUsaSxyKSx0IT09bnVsbCYmKFNyKHQsZSxyLG4pLEFjKHQsZSxyKSl9fTtmdW5jdGlvbiBaeShlLHQsbixyLGksbyxsKXtyZXR1cm4gZT1lLnN0YXRlTm9kZSx0eXBlb2YgZS5zaG91bGRDb21wb25lbnRVcGRhdGU9PSJmdW5jdGlvbiI/ZS5zaG91bGRDb21wb25lbnRVcGRhdGUocixvLGwpOnQucHJvdG90eXBlJiZ0LnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudD8hVWEobixyKXx8IVVhKGksbyk6ITB9ZnVuY3Rpb24gejEoZSx0LG4pe3ZhciByPSExLGk9bm8sbz10LmNvbnRleHRUeXBlO3JldHVybiB0eXBlb2Ygbz09Im9iamVjdCImJm8hPT1udWxsP289cnIobyk6KGk9VG4odCk/V286cm4uY3VycmVudCxyPXQuY29udGV4dFR5cGVzLG89KHI9ciE9bnVsbCk/dHMoZSxpKTpubyksdD1uZXcgdChuLG8pLGUubWVtb2l6ZWRTdGF0ZT10LnN0YXRlIT09bnVsbCYmdC5zdGF0ZSE9PXZvaWQgMD90LnN0YXRlOm51bGwsdC51cGRhdGVyPWNmLGUuc3RhdGVOb2RlPXQsdC5fcmVhY3RJbnRlcm5hbHM9ZSxyJiYoZT1lLnN0YXRlTm9kZSxlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9aSxlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0PW8pLHR9ZnVuY3Rpb24gR3koZSx0LG4scil7ZT10LnN0YXRlLHR5cGVvZiB0LmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM9PSJmdW5jdGlvbiImJnQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuLHIpLHR5cGVvZiB0LlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzPT0iZnVuY3Rpb24iJiZ0LlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG4sciksdC5zdGF0ZSE9PWUmJmNmLmVucXVldWVSZXBsYWNlU3RhdGUodCx0LnN0YXRlLG51bGwpfWZ1bmN0aW9uIE5wKGUsdCxuLHIpe3ZhciBpPWUuc3RhdGVOb2RlO2kucHJvcHM9bixpLnN0YXRlPWUubWVtb2l6ZWRTdGF0ZSxpLnJlZnM9ajEsQ2coZSk7dmFyIG89dC5jb250ZXh0VHlwZTt0eXBlb2Ygbz09Im9iamVjdCImJm8hPT1udWxsP2kuY29udGV4dD1ycihvKToobz1Ubih0KT9Xbzpybi5jdXJyZW50LGkuY29udGV4dD10cyhlLG8pKSxpLnN0YXRlPWUubWVtb2l6ZWRTdGF0ZSxvPXQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLHR5cGVvZiBvPT0iZnVuY3Rpb24iJiYoVHAoZSx0LG8sbiksaS5zdGF0ZT1lLm1lbW9pemVkU3RhdGUpLHR5cGVvZiB0LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcz09ImZ1bmN0aW9uInx8dHlwZW9mIGkuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiJ8fHR5cGVvZiBpLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiImJnR5cGVvZiBpLmNvbXBvbmVudFdpbGxNb3VudCE9ImZ1bmN0aW9uInx8KHQ9aS5zdGF0ZSx0eXBlb2YgaS5jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJmkuY29tcG9uZW50V2lsbE1vdW50KCksdHlwZW9mIGkuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmaS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCksdCE9PWkuc3RhdGUmJmNmLmVucXVldWVSZXBsYWNlU3RhdGUoaSxpLnN0YXRlLG51bGwpLGNkKGUsbixpLHIpLGkuc3RhdGU9ZS5tZW1vaXplZFN0YXRlKSx0eXBlb2YgaS5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIiYmKGUuZmxhZ3N8PTQxOTQzMDgpfWZ1bmN0aW9uIFZzKGUsdCxuKXtpZihlPW4ucmVmLGUhPT1udWxsJiZ0eXBlb2YgZSE9ImZ1bmN0aW9uIiYmdHlwZW9mIGUhPSJvYmplY3QiKXtpZihuLl9vd25lcil7aWYobj1uLl9vd25lcixuKXtpZihuLnRhZyE9PTEpdGhyb3cgRXJyb3IoVSgzMDkpKTt2YXIgcj1uLnN0YXRlTm9kZX1pZighcil0aHJvdyBFcnJvcihVKDE0NyxlKSk7dmFyIGk9cixvPSIiK2U7cmV0dXJuIHQhPT1udWxsJiZ0LnJlZiE9PW51bGwmJnR5cGVvZiB0LnJlZj09ImZ1bmN0aW9uIiYmdC5yZWYuX3N0cmluZ1JlZj09PW8/dC5yZWY6KHQ9ZnVuY3Rpb24obCl7dmFyIHM9aS5yZWZzO3M9PT1qMSYmKHM9aS5yZWZzPXt9KSxsPT09bnVsbD9kZWxldGUgc1tvXTpzW29dPWx9LHQuX3N0cmluZ1JlZj1vLHQpfWlmKHR5cGVvZiBlIT0ic3RyaW5nIil0aHJvdyBFcnJvcihVKDI4NCkpO2lmKCFuLl9vd25lcil0aHJvdyBFcnJvcihVKDI5MCxlKSl9cmV0dXJuIGV9ZnVuY3Rpb24gc2MoZSx0KXt0aHJvdyBlPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSxFcnJvcihVKDMxLGU9PT0iW29iamVjdCBPYmplY3RdIj8ib2JqZWN0IHdpdGgga2V5cyB7IitPYmplY3Qua2V5cyh0KS5qb2luKCIsICIpKyJ9IjplKSl9ZnVuY3Rpb24gWXkoZSl7dmFyIHQ9ZS5faW5pdDtyZXR1cm4gdChlLl9wYXlsb2FkKX1mdW5jdGlvbiBGMShlKXtmdW5jdGlvbiB0KHYseSl7aWYoZSl7dmFyIF89di5kZWxldGlvbnM7Xz09PW51bGw/KHYuZGVsZXRpb25zPVt5XSx2LmZsYWdzfD0xNik6Xy5wdXNoKHkpfX1mdW5jdGlvbiBuKHYseSl7aWYoIWUpcmV0dXJuIG51bGw7Zm9yKDt5IT09bnVsbDspdCh2LHkpLHk9eS5zaWJsaW5nO3JldHVybiBudWxsfWZ1bmN0aW9uIHIodix5KXtmb3Iodj1uZXcgTWFwO3khPT1udWxsOyl5LmtleSE9PW51bGw/di5zZXQoeS5rZXkseSk6di5zZXQoeS5pbmRleCx5KSx5PXkuc2libGluZztyZXR1cm4gdn1mdW5jdGlvbiBpKHYseSl7cmV0dXJuIHY9UWkodix5KSx2LmluZGV4PTAsdi5zaWJsaW5nPW51bGwsdn1mdW5jdGlvbiBvKHYseSxfKXtyZXR1cm4gdi5pbmRleD1fLGU/KF89di5hbHRlcm5hdGUsXyE9PW51bGw/KF89Xy5pbmRleCxfPHk/KHYuZmxhZ3N8PTIseSk6Xyk6KHYuZmxhZ3N8PTIseSkpOih2LmZsYWdzfD0xMDQ4NTc2LHkpfWZ1bmN0aW9uIGwodil7cmV0dXJuIGUmJnYuYWx0ZXJuYXRlPT09bnVsbCYmKHYuZmxhZ3N8PTIpLHZ9ZnVuY3Rpb24gcyh2LHksXyx3KXtyZXR1cm4geT09PW51bGx8fHkudGFnIT09Nj8oeT1iaChfLHYubW9kZSx3KSx5LnJldHVybj12LHkpOih5PWkoeSxfKSx5LnJldHVybj12LHkpfWZ1bmN0aW9uIGEodix5LF8sdyl7dmFyIEU9Xy50eXBlO3JldHVybiBFPT09Ymw/Yyh2LHksXy5wcm9wcy5jaGlsZHJlbix3LF8ua2V5KTp5IT09bnVsbCYmKHkuZWxlbWVudFR5cGU9PT1FfHx0eXBlb2YgRT09Im9iamVjdCImJkUhPT1udWxsJiZFLiQkdHlwZW9mPT09QWkmJll5KEUpPT09eS50eXBlKT8odz1pKHksXy5wcm9wcyksdy5yZWY9VnModix5LF8pLHcucmV0dXJuPXYsdyk6KHc9emMoXy50eXBlLF8ua2V5LF8ucHJvcHMsbnVsbCx2Lm1vZGUsdyksdy5yZWY9VnModix5LF8pLHcucmV0dXJuPXYsdyl9ZnVuY3Rpb24gdSh2LHksXyx3KXtyZXR1cm4geT09PW51bGx8fHkudGFnIT09NHx8eS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyE9PV8uY29udGFpbmVySW5mb3x8eS5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24hPT1fLmltcGxlbWVudGF0aW9uPyh5PVRoKF8sdi5tb2RlLHcpLHkucmV0dXJuPXYseSk6KHk9aSh5LF8uY2hpbGRyZW58fFtdKSx5LnJldHVybj12LHkpfWZ1bmN0aW9uIGModix5LF8sdyxFKXtyZXR1cm4geT09PW51bGx8fHkudGFnIT09Nz8oeT1MbyhfLHYubW9kZSx3LEUpLHkucmV0dXJuPXYseSk6KHk9aSh5LF8pLHkucmV0dXJuPXYseSl9ZnVuY3Rpb24gZCh2LHksXyl7aWYodHlwZW9mIHk9PSJzdHJpbmciJiZ5IT09IiJ8fHR5cGVvZiB5PT0ibnVtYmVyIilyZXR1cm4geT1iaCgiIit5LHYubW9kZSxfKSx5LnJldHVybj12LHk7aWYodHlwZW9mIHk9PSJvYmplY3QiJiZ5IT09bnVsbCl7c3dpdGNoKHkuJCR0eXBlb2Ype2Nhc2UgWHU6cmV0dXJuIF89emMoeS50eXBlLHkua2V5LHkucHJvcHMsbnVsbCx2Lm1vZGUsXyksXy5yZWY9VnModixudWxsLHkpLF8ucmV0dXJuPXYsXztjYXNlICRsOnJldHVybiB5PVRoKHksdi5tb2RlLF8pLHkucmV0dXJuPXYseTtjYXNlIEFpOnZhciB3PXkuX2luaXQ7cmV0dXJuIGQodix3KHkuX3BheWxvYWQpLF8pfWlmKG9hKHkpfHx6cyh5KSlyZXR1cm4geT1Mbyh5LHYubW9kZSxfLG51bGwpLHkucmV0dXJuPXYseTtzYyh2LHkpfXJldHVybiBudWxsfWZ1bmN0aW9uIGYodix5LF8sdyl7dmFyIEU9eSE9PW51bGw/eS5rZXk6bnVsbDtpZih0eXBlb2YgXz09InN0cmluZyImJl8hPT0iInx8dHlwZW9mIF89PSJudW1iZXIiKXJldHVybiBFIT09bnVsbD9udWxsOnModix5LCIiK18sdyk7aWYodHlwZW9mIF89PSJvYmplY3QiJiZfIT09bnVsbCl7c3dpdGNoKF8uJCR0eXBlb2Ype2Nhc2UgWHU6cmV0dXJuIF8ua2V5PT09RT9hKHYseSxfLHcpOm51bGw7Y2FzZSAkbDpyZXR1cm4gXy5rZXk9PT1FP3Uodix5LF8sdyk6bnVsbDtjYXNlIEFpOnJldHVybiBFPV8uX2luaXQsZih2LHksRShfLl9wYXlsb2FkKSx3KX1pZihvYShfKXx8enMoXykpcmV0dXJuIEUhPT1udWxsP251bGw6Yyh2LHksXyx3LG51bGwpO3NjKHYsXyl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gaCh2LHksXyx3LEUpe2lmKHR5cGVvZiB3PT0ic3RyaW5nIiYmdyE9PSIifHx0eXBlb2Ygdz09Im51bWJlciIpcmV0dXJuIHY9di5nZXQoXyl8fG51bGwscyh5LHYsIiIrdyxFKTtpZih0eXBlb2Ygdz09Im9iamVjdCImJnchPT1udWxsKXtzd2l0Y2gody4kJHR5cGVvZil7Y2FzZSBYdTpyZXR1cm4gdj12LmdldCh3LmtleT09PW51bGw/Xzp3LmtleSl8fG51bGwsYSh5LHYsdyxFKTtjYXNlICRsOnJldHVybiB2PXYuZ2V0KHcua2V5PT09bnVsbD9fOncua2V5KXx8bnVsbCx1KHksdix3LEUpO2Nhc2UgQWk6dmFyICQ9dy5faW5pdDtyZXR1cm4gaCh2LHksXywkKHcuX3BheWxvYWQpLEUpfWlmKG9hKHcpfHx6cyh3KSlyZXR1cm4gdj12LmdldChfKXx8bnVsbCxjKHksdix3LEUsbnVsbCk7c2MoeSx3KX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBtKHYseSxfLHcpe2Zvcih2YXIgRT1udWxsLCQ9bnVsbCxDPXksVD15PTAsTj1udWxsO0MhPT1udWxsJiZUPF8ubGVuZ3RoO1QrKyl7Qy5pbmRleD5UPyhOPUMsQz1udWxsKTpOPUMuc2libGluZzt2YXIgUj1mKHYsQyxfW1RdLHcpO2lmKFI9PT1udWxsKXtDPT09bnVsbCYmKEM9Tik7YnJlYWt9ZSYmQyYmUi5hbHRlcm5hdGU9PT1udWxsJiZ0KHYsQykseT1vKFIseSxUKSwkPT09bnVsbD9FPVI6JC5zaWJsaW5nPVIsJD1SLEM9Tn1pZihUPT09Xy5sZW5ndGgpcmV0dXJuIG4odixDKSxvdCYmYm8odixUKSxFO2lmKEM9PT1udWxsKXtmb3IoO1Q8Xy5sZW5ndGg7VCsrKUM9ZCh2LF9bVF0sdyksQyE9PW51bGwmJih5PW8oQyx5LFQpLCQ9PT1udWxsP0U9QzokLnNpYmxpbmc9QywkPUMpO3JldHVybiBvdCYmYm8odixUKSxFfWZvcihDPXIodixDKTtUPF8ubGVuZ3RoO1QrKylOPWgoQyx2LFQsX1tUXSx3KSxOIT09bnVsbCYmKGUmJk4uYWx0ZXJuYXRlIT09bnVsbCYmQy5kZWxldGUoTi5rZXk9PT1udWxsP1Q6Ti5rZXkpLHk9byhOLHksVCksJD09PW51bGw/RT1OOiQuc2libGluZz1OLCQ9Tik7cmV0dXJuIGUmJkMuZm9yRWFjaChmdW5jdGlvbihEKXtyZXR1cm4gdCh2LEQpfSksb3QmJmJvKHYsVCksRX1mdW5jdGlvbiBnKHYseSxfLHcpe3ZhciBFPXpzKF8pO2lmKHR5cGVvZiBFIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFUoMTUwKSk7aWYoXz1FLmNhbGwoXyksXz09bnVsbCl0aHJvdyBFcnJvcihVKDE1MSkpO2Zvcih2YXIgJD1FPW51bGwsQz15LFQ9eT0wLE49bnVsbCxSPV8ubmV4dCgpO0MhPT1udWxsJiYhUi5kb25lO1QrKyxSPV8ubmV4dCgpKXtDLmluZGV4PlQ/KE49QyxDPW51bGwpOk49Qy5zaWJsaW5nO3ZhciBEPWYodixDLFIudmFsdWUsdyk7aWYoRD09PW51bGwpe0M9PT1udWxsJiYoQz1OKTticmVha31lJiZDJiZELmFsdGVybmF0ZT09PW51bGwmJnQodixDKSx5PW8oRCx5LFQpLCQ9PT1udWxsP0U9RDokLnNpYmxpbmc9RCwkPUQsQz1OfWlmKFIuZG9uZSlyZXR1cm4gbih2LEMpLG90JiZibyh2LFQpLEU7aWYoQz09PW51bGwpe2Zvcig7IVIuZG9uZTtUKyssUj1fLm5leHQoKSlSPWQodixSLnZhbHVlLHcpLFIhPT1udWxsJiYoeT1vKFIseSxUKSwkPT09bnVsbD9FPVI6JC5zaWJsaW5nPVIsJD1SKTtyZXR1cm4gb3QmJmJvKHYsVCksRX1mb3IoQz1yKHYsQyk7IVIuZG9uZTtUKyssUj1fLm5leHQoKSlSPWgoQyx2LFQsUi52YWx1ZSx3KSxSIT09bnVsbCYmKGUmJlIuYWx0ZXJuYXRlIT09bnVsbCYmQy5kZWxldGUoUi5rZXk9PT1udWxsP1Q6Ui5rZXkpLHk9byhSLHksVCksJD09PW51bGw/RT1SOiQuc2libGluZz1SLCQ9Uik7cmV0dXJuIGUmJkMuZm9yRWFjaChmdW5jdGlvbihGKXtyZXR1cm4gdCh2LEYpfSksb3QmJmJvKHYsVCksRX1mdW5jdGlvbiBTKHYseSxfLHcpe2lmKHR5cGVvZiBfPT0ib2JqZWN0IiYmXyE9PW51bGwmJl8udHlwZT09PWJsJiZfLmtleT09PW51bGwmJihfPV8ucHJvcHMuY2hpbGRyZW4pLHR5cGVvZiBfPT0ib2JqZWN0IiYmXyE9PW51bGwpe3N3aXRjaChfLiQkdHlwZW9mKXtjYXNlIFh1OmU6e2Zvcih2YXIgRT1fLmtleSwkPXk7JCE9PW51bGw7KXtpZigkLmtleT09PUUpe2lmKEU9Xy50eXBlLEU9PT1ibCl7aWYoJC50YWc9PT03KXtuKHYsJC5zaWJsaW5nKSx5PWkoJCxfLnByb3BzLmNoaWxkcmVuKSx5LnJldHVybj12LHY9eTticmVhayBlfX1lbHNlIGlmKCQuZWxlbWVudFR5cGU9PT1FfHx0eXBlb2YgRT09Im9iamVjdCImJkUhPT1udWxsJiZFLiQkdHlwZW9mPT09QWkmJll5KEUpPT09JC50eXBlKXtuKHYsJC5zaWJsaW5nKSx5PWkoJCxfLnByb3BzKSx5LnJlZj1Wcyh2LCQsXykseS5yZXR1cm49dix2PXk7YnJlYWsgZX1uKHYsJCk7YnJlYWt9ZWxzZSB0KHYsJCk7JD0kLnNpYmxpbmd9Xy50eXBlPT09Ymw/KHk9TG8oXy5wcm9wcy5jaGlsZHJlbix2Lm1vZGUsdyxfLmtleSkseS5yZXR1cm49dix2PXkpOih3PXpjKF8udHlwZSxfLmtleSxfLnByb3BzLG51bGwsdi5tb2RlLHcpLHcucmVmPVZzKHYseSxfKSx3LnJldHVybj12LHY9dyl9cmV0dXJuIGwodik7Y2FzZSAkbDplOntmb3IoJD1fLmtleTt5IT09bnVsbDspe2lmKHkua2V5PT09JClpZih5LnRhZz09PTQmJnkuc3RhdGVOb2RlLmNvbnRhaW5lckluZm89PT1fLmNvbnRhaW5lckluZm8mJnkuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uPT09Xy5pbXBsZW1lbnRhdGlvbil7bih2LHkuc2libGluZykseT1pKHksXy5jaGlsZHJlbnx8W10pLHkucmV0dXJuPXYsdj15O2JyZWFrIGV9ZWxzZXtuKHYseSk7YnJlYWt9ZWxzZSB0KHYseSk7eT15LnNpYmxpbmd9eT1UaChfLHYubW9kZSx3KSx5LnJldHVybj12LHY9eX1yZXR1cm4gbCh2KTtjYXNlIEFpOnJldHVybiAkPV8uX2luaXQsUyh2LHksJChfLl9wYXlsb2FkKSx3KX1pZihvYShfKSlyZXR1cm4gbSh2LHksXyx3KTtpZih6cyhfKSlyZXR1cm4gZyh2LHksXyx3KTtzYyh2LF8pfXJldHVybiB0eXBlb2YgXz09InN0cmluZyImJl8hPT0iInx8dHlwZW9mIF89PSJudW1iZXIiPyhfPSIiK18seSE9PW51bGwmJnkudGFnPT09Nj8obih2LHkuc2libGluZykseT1pKHksXykseS5yZXR1cm49dix2PXkpOihuKHYseSkseT1iaChfLHYubW9kZSx3KSx5LnJldHVybj12LHY9eSksbCh2KSk6bih2LHkpfXJldHVybiBTfXZhciBycz1GMSghMCksQjE9RjEoITEpLE91PXt9LEZyPWdvKE91KSxLYT1nbyhPdSksWmE9Z28oT3UpO2Z1bmN0aW9uIEFvKGUpe2lmKGU9PT1PdSl0aHJvdyBFcnJvcihVKDE3NCkpO3JldHVybiBlfWZ1bmN0aW9uIGtnKGUsdCl7c3dpdGNoKFhlKFphLHQpLFhlKEthLGUpLFhlKEZyLE91KSxlPXQubm9kZVR5cGUsZSl7Y2FzZSA5OmNhc2UgMTE6dD0odD10LmRvY3VtZW50RWxlbWVudCk/dC5uYW1lc3BhY2VVUkk6c3AobnVsbCwiIik7YnJlYWs7ZGVmYXVsdDplPWU9PT04P3QucGFyZW50Tm9kZTp0LHQ9ZS5uYW1lc3BhY2VVUkl8fG51bGwsZT1lLnRhZ05hbWUsdD1zcCh0LGUpfWl0KEZyKSxYZShGcix0KX1mdW5jdGlvbiBpcygpe2l0KEZyKSxpdChLYSksaXQoWmEpfWZ1bmN0aW9uIFUxKGUpe0FvKFphLmN1cnJlbnQpO3ZhciB0PUFvKEZyLmN1cnJlbnQpLG49c3AodCxlLnR5cGUpO3QhPT1uJiYoWGUoS2EsZSksWGUoRnIsbikpfWZ1bmN0aW9uICRnKGUpe0thLmN1cnJlbnQ9PT1lJiYoaXQoRnIpLGl0KEthKSl9dmFyIGR0PWdvKDApO2Z1bmN0aW9uIGRkKGUpe2Zvcih2YXIgdD1lO3QhPT1udWxsOyl7aWYodC50YWc9PT0xMyl7dmFyIG49dC5tZW1vaXplZFN0YXRlO2lmKG4hPT1udWxsJiYobj1uLmRlaHlkcmF0ZWQsbj09PW51bGx8fG4uZGF0YT09PSIkPyJ8fG4uZGF0YT09PSIkISIpKXJldHVybiB0fWVsc2UgaWYodC50YWc9PT0xOSYmdC5tZW1vaXplZFByb3BzLnJldmVhbE9yZGVyIT09dm9pZCAwKXtpZih0LmZsYWdzJjEyOClyZXR1cm4gdH1lbHNlIGlmKHQuY2hpbGQhPT1udWxsKXt0LmNoaWxkLnJldHVybj10LHQ9dC5jaGlsZDtjb250aW51ZX1pZih0PT09ZSlicmVhaztmb3IoO3Quc2libGluZz09PW51bGw7KXtpZih0LnJldHVybj09PW51bGx8fHQucmV0dXJuPT09ZSlyZXR1cm4gbnVsbDt0PXQucmV0dXJufXQuc2libGluZy5yZXR1cm49dC5yZXR1cm4sdD10LnNpYmxpbmd9cmV0dXJuIG51bGx9dmFyIHdoPVtdO2Z1bmN0aW9uIGJnKCl7Zm9yKHZhciBlPTA7ZTx3aC5sZW5ndGg7ZSsrKXdoW2VdLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5PW51bGw7d2gubGVuZ3RoPTB9dmFyIE1jPXhpLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsU2g9eGkuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsSG89MCxodD1udWxsLFJ0PW51bGwsSXQ9bnVsbCxmZD0hMSx2YT0hMSxHYT0wLGxUPTA7ZnVuY3Rpb24gWXQoKXt0aHJvdyBFcnJvcihVKDMyMSkpfWZ1bmN0aW9uIFRnKGUsdCl7aWYodD09PW51bGwpcmV0dXJuITE7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aCYmbjxlLmxlbmd0aDtuKyspaWYoIWtyKGVbbl0sdFtuXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gTmcoZSx0LG4scixpLG8pe2lmKEhvPW8saHQ9dCx0Lm1lbW9pemVkU3RhdGU9bnVsbCx0LnVwZGF0ZVF1ZXVlPW51bGwsdC5sYW5lcz0wLE1jLmN1cnJlbnQ9ZT09PW51bGx8fGUubWVtb2l6ZWRTdGF0ZT09PW51bGw/Y1Q6ZFQsZT1uKHIsaSksdmEpe289MDtkb3tpZih2YT0hMSxHYT0wLDI1PD1vKXRocm93IEVycm9yKFUoMzAxKSk7bys9MSxJdD1SdD1udWxsLHQudXBkYXRlUXVldWU9bnVsbCxNYy5jdXJyZW50PWZULGU9bihyLGkpfXdoaWxlKHZhKX1pZihNYy5jdXJyZW50PWhkLHQ9UnQhPT1udWxsJiZSdC5uZXh0IT09bnVsbCxIbz0wLEl0PVJ0PWh0PW51bGwsZmQ9ITEsdCl0aHJvdyBFcnJvcihVKDMwMCkpO3JldHVybiBlfWZ1bmN0aW9uIFJnKCl7dmFyIGU9R2EhPT0wO3JldHVybiBHYT0wLGV9ZnVuY3Rpb24gUHIoKXt2YXIgZT17bWVtb2l6ZWRTdGF0ZTpudWxsLGJhc2VTdGF0ZTpudWxsLGJhc2VRdWV1ZTpudWxsLHF1ZXVlOm51bGwsbmV4dDpudWxsfTtyZXR1cm4gSXQ9PT1udWxsP2h0Lm1lbW9pemVkU3RhdGU9SXQ9ZTpJdD1JdC5uZXh0PWUsSXR9ZnVuY3Rpb24gaXIoKXtpZihSdD09PW51bGwpe3ZhciBlPWh0LmFsdGVybmF0ZTtlPWUhPT1udWxsP2UubWVtb2l6ZWRTdGF0ZTpudWxsfWVsc2UgZT1SdC5uZXh0O3ZhciB0PUl0PT09bnVsbD9odC5tZW1vaXplZFN0YXRlOkl0Lm5leHQ7aWYodCE9PW51bGwpSXQ9dCxSdD1lO2Vsc2V7aWYoZT09PW51bGwpdGhyb3cgRXJyb3IoVSgzMTApKTtSdD1lLGU9e21lbW9pemVkU3RhdGU6UnQubWVtb2l6ZWRTdGF0ZSxiYXNlU3RhdGU6UnQuYmFzZVN0YXRlLGJhc2VRdWV1ZTpSdC5iYXNlUXVldWUscXVldWU6UnQucXVldWUsbmV4dDpudWxsfSxJdD09PW51bGw/aHQubWVtb2l6ZWRTdGF0ZT1JdD1lOkl0PUl0Lm5leHQ9ZX1yZXR1cm4gSXR9ZnVuY3Rpb24gWWEoZSx0KXtyZXR1cm4gdHlwZW9mIHQ9PSJmdW5jdGlvbiI/dChlKTp0fWZ1bmN0aW9uIEVoKGUpe3ZhciB0PWlyKCksbj10LnF1ZXVlO2lmKG49PT1udWxsKXRocm93IEVycm9yKFUoMzExKSk7bi5sYXN0UmVuZGVyZWRSZWR1Y2VyPWU7dmFyIHI9UnQsaT1yLmJhc2VRdWV1ZSxvPW4ucGVuZGluZztpZihvIT09bnVsbCl7aWYoaSE9PW51bGwpe3ZhciBsPWkubmV4dDtpLm5leHQ9by5uZXh0LG8ubmV4dD1sfXIuYmFzZVF1ZXVlPWk9byxuLnBlbmRpbmc9bnVsbH1pZihpIT09bnVsbCl7bz1pLm5leHQscj1yLmJhc2VTdGF0ZTt2YXIgcz1sPW51bGwsYT1udWxsLHU9bztkb3t2YXIgYz11LmxhbmU7aWYoKEhvJmMpPT09YylhIT09bnVsbCYmKGE9YS5uZXh0PXtsYW5lOjAsYWN0aW9uOnUuYWN0aW9uLGhhc0VhZ2VyU3RhdGU6dS5oYXNFYWdlclN0YXRlLGVhZ2VyU3RhdGU6dS5lYWdlclN0YXRlLG5leHQ6bnVsbH0pLHI9dS5oYXNFYWdlclN0YXRlP3UuZWFnZXJTdGF0ZTplKHIsdS5hY3Rpb24pO2Vsc2V7dmFyIGQ9e2xhbmU6YyxhY3Rpb246dS5hY3Rpb24saGFzRWFnZXJTdGF0ZTp1Lmhhc0VhZ2VyU3RhdGUsZWFnZXJTdGF0ZTp1LmVhZ2VyU3RhdGUsbmV4dDpudWxsfTthPT09bnVsbD8ocz1hPWQsbD1yKTphPWEubmV4dD1kLGh0LmxhbmVzfD1jLEtvfD1jfXU9dS5uZXh0fXdoaWxlKHUhPT1udWxsJiZ1IT09byk7YT09PW51bGw/bD1yOmEubmV4dD1zLGtyKHIsdC5tZW1vaXplZFN0YXRlKXx8KCRuPSEwKSx0Lm1lbW9pemVkU3RhdGU9cix0LmJhc2VTdGF0ZT1sLHQuYmFzZVF1ZXVlPWEsbi5sYXN0UmVuZGVyZWRTdGF0ZT1yfWlmKGU9bi5pbnRlcmxlYXZlZCxlIT09bnVsbCl7aT1lO2RvIG89aS5sYW5lLGh0LmxhbmVzfD1vLEtvfD1vLGk9aS5uZXh0O3doaWxlKGkhPT1lKX1lbHNlIGk9PT1udWxsJiYobi5sYW5lcz0wKTtyZXR1cm5bdC5tZW1vaXplZFN0YXRlLG4uZGlzcGF0Y2hdfWZ1bmN0aW9uIENoKGUpe3ZhciB0PWlyKCksbj10LnF1ZXVlO2lmKG49PT1udWxsKXRocm93IEVycm9yKFUoMzExKSk7bi5sYXN0UmVuZGVyZWRSZWR1Y2VyPWU7dmFyIHI9bi5kaXNwYXRjaCxpPW4ucGVuZGluZyxvPXQubWVtb2l6ZWRTdGF0ZTtpZihpIT09bnVsbCl7bi5wZW5kaW5nPW51bGw7dmFyIGw9aT1pLm5leHQ7ZG8gbz1lKG8sbC5hY3Rpb24pLGw9bC5uZXh0O3doaWxlKGwhPT1pKTtrcihvLHQubWVtb2l6ZWRTdGF0ZSl8fCgkbj0hMCksdC5tZW1vaXplZFN0YXRlPW8sdC5iYXNlUXVldWU9PT1udWxsJiYodC5iYXNlU3RhdGU9byksbi5sYXN0UmVuZGVyZWRTdGF0ZT1vfXJldHVybltvLHJdfWZ1bmN0aW9uIFcxKCl7fWZ1bmN0aW9uIFYxKGUsdCl7dmFyIG49aHQscj1pcigpLGk9dCgpLG89IWtyKHIubWVtb2l6ZWRTdGF0ZSxpKTtpZihvJiYoci5tZW1vaXplZFN0YXRlPWksJG49ITApLHI9ci5xdWV1ZSxPZyhaMS5iaW5kKG51bGwsbixyLGUpLFtlXSksci5nZXRTbmFwc2hvdCE9PXR8fG98fEl0IT09bnVsbCYmSXQubWVtb2l6ZWRTdGF0ZS50YWcmMSl7aWYobi5mbGFnc3w9MjA0OCxYYSg5LEsxLmJpbmQobnVsbCxuLHIsaSx0KSx2b2lkIDAsbnVsbCksQnQ9PT1udWxsKXRocm93IEVycm9yKFUoMzQ5KSk7SG8mMzB8fEgxKG4sdCxpKX1yZXR1cm4gaX1mdW5jdGlvbiBIMShlLHQsbil7ZS5mbGFnc3w9MTYzODQsZT17Z2V0U25hcHNob3Q6dCx2YWx1ZTpufSx0PWh0LnVwZGF0ZVF1ZXVlLHQ9PT1udWxsPyh0PXtsYXN0RWZmZWN0Om51bGwsc3RvcmVzOm51bGx9LGh0LnVwZGF0ZVF1ZXVlPXQsdC5zdG9yZXM9W2VdKToobj10LnN0b3JlcyxuPT09bnVsbD90LnN0b3Jlcz1bZV06bi5wdXNoKGUpKX1mdW5jdGlvbiBLMShlLHQsbixyKXt0LnZhbHVlPW4sdC5nZXRTbmFwc2hvdD1yLEcxKHQpJiZZMShlKX1mdW5jdGlvbiBaMShlLHQsbil7cmV0dXJuIG4oZnVuY3Rpb24oKXtHMSh0KSYmWTEoZSl9KX1mdW5jdGlvbiBHMShlKXt2YXIgdD1lLmdldFNuYXBzaG90O2U9ZS52YWx1ZTt0cnl7dmFyIG49dCgpO3JldHVybiFrcihlLG4pfWNhdGNoe3JldHVybiEwfX1mdW5jdGlvbiBZMShlKXt2YXIgdD1oaShlLDEpO3QhPT1udWxsJiZTcih0LGUsMSwtMSl9ZnVuY3Rpb24gWHkoZSl7dmFyIHQ9UHIoKTtyZXR1cm4gdHlwZW9mIGU9PSJmdW5jdGlvbiImJihlPWUoKSksdC5tZW1vaXplZFN0YXRlPXQuYmFzZVN0YXRlPWUsZT17cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6WWEsbGFzdFJlbmRlcmVkU3RhdGU6ZX0sdC5xdWV1ZT1lLGU9ZS5kaXNwYXRjaD11VC5iaW5kKG51bGwsaHQsZSksW3QubWVtb2l6ZWRTdGF0ZSxlXX1mdW5jdGlvbiBYYShlLHQsbixyKXtyZXR1cm4gZT17dGFnOmUsY3JlYXRlOnQsZGVzdHJveTpuLGRlcHM6cixuZXh0Om51bGx9LHQ9aHQudXBkYXRlUXVldWUsdD09PW51bGw/KHQ9e2xhc3RFZmZlY3Q6bnVsbCxzdG9yZXM6bnVsbH0saHQudXBkYXRlUXVldWU9dCx0Lmxhc3RFZmZlY3Q9ZS5uZXh0PWUpOihuPXQubGFzdEVmZmVjdCxuPT09bnVsbD90Lmxhc3RFZmZlY3Q9ZS5uZXh0PWU6KHI9bi5uZXh0LG4ubmV4dD1lLGUubmV4dD1yLHQubGFzdEVmZmVjdD1lKSksZX1mdW5jdGlvbiBYMSgpe3JldHVybiBpcigpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gRGMoZSx0LG4scil7dmFyIGk9UHIoKTtodC5mbGFnc3w9ZSxpLm1lbW9pemVkU3RhdGU9WGEoMXx0LG4sdm9pZCAwLHI9PT12b2lkIDA/bnVsbDpyKX1mdW5jdGlvbiBkZihlLHQsbixyKXt2YXIgaT1pcigpO3I9cj09PXZvaWQgMD9udWxsOnI7dmFyIG89dm9pZCAwO2lmKFJ0IT09bnVsbCl7dmFyIGw9UnQubWVtb2l6ZWRTdGF0ZTtpZihvPWwuZGVzdHJveSxyIT09bnVsbCYmVGcocixsLmRlcHMpKXtpLm1lbW9pemVkU3RhdGU9WGEodCxuLG8scik7cmV0dXJufX1odC5mbGFnc3w9ZSxpLm1lbW9pemVkU3RhdGU9WGEoMXx0LG4sbyxyKX1mdW5jdGlvbiBReShlLHQpe3JldHVybiBEYyg4MzkwNjU2LDgsZSx0KX1mdW5jdGlvbiBPZyhlLHQpe3JldHVybiBkZigyMDQ4LDgsZSx0KX1mdW5jdGlvbiBRMShlLHQpe3JldHVybiBkZig0LDIsZSx0KX1mdW5jdGlvbiBKMShlLHQpe3JldHVybiBkZig0LDQsZSx0KX1mdW5jdGlvbiBxMShlLHQpe2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXJldHVybiBlPWUoKSx0KGUpLGZ1bmN0aW9uKCl7dChudWxsKX07aWYodCE9bnVsbClyZXR1cm4gZT1lKCksdC5jdXJyZW50PWUsZnVuY3Rpb24oKXt0LmN1cnJlbnQ9bnVsbH19ZnVuY3Rpb24gZXcoZSx0LG4pe3JldHVybiBuPW4hPW51bGw/bi5jb25jYXQoW2VdKTpudWxsLGRmKDQsNCxxMS5iaW5kKG51bGwsdCxlKSxuKX1mdW5jdGlvbiBQZygpe31mdW5jdGlvbiB0dyhlLHQpe3ZhciBuPWlyKCk7dD10PT09dm9pZCAwP251bGw6dDt2YXIgcj1uLm1lbW9pemVkU3RhdGU7cmV0dXJuIHIhPT1udWxsJiZ0IT09bnVsbCYmVGcodCxyWzFdKT9yWzBdOihuLm1lbW9pemVkU3RhdGU9W2UsdF0sZSl9ZnVuY3Rpb24gbncoZSx0KXt2YXIgbj1pcigpO3Q9dD09PXZvaWQgMD9udWxsOnQ7dmFyIHI9bi5tZW1vaXplZFN0YXRlO3JldHVybiByIT09bnVsbCYmdCE9PW51bGwmJlRnKHQsclsxXSk/clswXTooZT1lKCksbi5tZW1vaXplZFN0YXRlPVtlLHRdLGUpfWZ1bmN0aW9uIHJ3KGUsdCxuKXtyZXR1cm4gSG8mMjE/KGtyKG4sdCl8fChuPWwxKCksaHQubGFuZXN8PW4sS298PW4sZS5iYXNlU3RhdGU9ITApLHQpOihlLmJhc2VTdGF0ZSYmKGUuYmFzZVN0YXRlPSExLCRuPSEwKSxlLm1lbW9pemVkU3RhdGU9bil9ZnVuY3Rpb24gc1QoZSx0KXt2YXIgbj1VZTtVZT1uIT09MCYmND5uP246NCxlKCEwKTt2YXIgcj1TaC50cmFuc2l0aW9uO1NoLnRyYW5zaXRpb249e307dHJ5e2UoITEpLHQoKX1maW5hbGx5e1VlPW4sU2gudHJhbnNpdGlvbj1yfX1mdW5jdGlvbiBpdygpe3JldHVybiBpcigpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gYVQoZSx0LG4pe3ZhciByPVhpKGUpO2lmKG49e2xhbmU6cixhY3Rpb246bixoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9LG93KGUpKWx3KHQsbik7ZWxzZSBpZihuPUkxKGUsdCxuLHIpLG4hPT1udWxsKXt2YXIgaT12bigpO1NyKG4sZSxyLGkpLHN3KG4sdCxyKX19ZnVuY3Rpb24gdVQoZSx0LG4pe3ZhciByPVhpKGUpLGk9e2xhbmU6cixhY3Rpb246bixoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9O2lmKG93KGUpKWx3KHQsaSk7ZWxzZXt2YXIgbz1lLmFsdGVybmF0ZTtpZihlLmxhbmVzPT09MCYmKG89PT1udWxsfHxvLmxhbmVzPT09MCkmJihvPXQubGFzdFJlbmRlcmVkUmVkdWNlcixvIT09bnVsbCkpdHJ5e3ZhciBsPXQubGFzdFJlbmRlcmVkU3RhdGUscz1vKGwsbik7aWYoaS5oYXNFYWdlclN0YXRlPSEwLGkuZWFnZXJTdGF0ZT1zLGtyKHMsbCkpe3ZhciBhPXQuaW50ZXJsZWF2ZWQ7YT09PW51bGw/KGkubmV4dD1pLEVnKHQpKTooaS5uZXh0PWEubmV4dCxhLm5leHQ9aSksdC5pbnRlcmxlYXZlZD1pO3JldHVybn19Y2F0Y2h7fWZpbmFsbHl7fW49STEoZSx0LGksciksbiE9PW51bGwmJihpPXZuKCksU3IobixlLHIsaSksc3cobix0LHIpKX19ZnVuY3Rpb24gb3coZSl7dmFyIHQ9ZS5hbHRlcm5hdGU7cmV0dXJuIGU9PT1odHx8dCE9PW51bGwmJnQ9PT1odH1mdW5jdGlvbiBsdyhlLHQpe3ZhPWZkPSEwO3ZhciBuPWUucGVuZGluZztuPT09bnVsbD90Lm5leHQ9dDoodC5uZXh0PW4ubmV4dCxuLm5leHQ9dCksZS5wZW5kaW5nPXR9ZnVuY3Rpb24gc3coZSx0LG4pe2lmKG4mNDE5NDI0MCl7dmFyIHI9dC5sYW5lcztyJj1lLnBlbmRpbmdMYW5lcyxufD1yLHQubGFuZXM9bix1ZyhlLG4pfX12YXIgaGQ9e3JlYWRDb250ZXh0OnJyLHVzZUNhbGxiYWNrOll0LHVzZUNvbnRleHQ6WXQsdXNlRWZmZWN0Oll0LHVzZUltcGVyYXRpdmVIYW5kbGU6WXQsdXNlSW5zZXJ0aW9uRWZmZWN0Oll0LHVzZUxheW91dEVmZmVjdDpZdCx1c2VNZW1vOll0LHVzZVJlZHVjZXI6WXQsdXNlUmVmOll0LHVzZVN0YXRlOll0LHVzZURlYnVnVmFsdWU6WXQsdXNlRGVmZXJyZWRWYWx1ZTpZdCx1c2VUcmFuc2l0aW9uOll0LHVzZU11dGFibGVTb3VyY2U6WXQsdXNlU3luY0V4dGVybmFsU3RvcmU6WXQsdXNlSWQ6WXQsdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSxjVD17cmVhZENvbnRleHQ6cnIsdXNlQ2FsbGJhY2s6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gUHIoKS5tZW1vaXplZFN0YXRlPVtlLHQ9PT12b2lkIDA/bnVsbDp0XSxlfSx1c2VDb250ZXh0OnJyLHVzZUVmZmVjdDpReSx1c2VJbXBlcmF0aXZlSGFuZGxlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj1uIT1udWxsP24uY29uY2F0KFtlXSk6bnVsbCxEYyg0MTk0MzA4LDQscTEuYmluZChudWxsLHQsZSksbil9LHVzZUxheW91dEVmZmVjdDpmdW5jdGlvbihlLHQpe3JldHVybiBEYyg0MTk0MzA4LDQsZSx0KX0sdXNlSW5zZXJ0aW9uRWZmZWN0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIERjKDQsMixlLHQpfSx1c2VNZW1vOmZ1bmN0aW9uKGUsdCl7dmFyIG49UHIoKTtyZXR1cm4gdD10PT09dm9pZCAwP251bGw6dCxlPWUoKSxuLm1lbW9pemVkU3RhdGU9W2UsdF0sZX0sdXNlUmVkdWNlcjpmdW5jdGlvbihlLHQsbil7dmFyIHI9UHIoKTtyZXR1cm4gdD1uIT09dm9pZCAwP24odCk6dCxyLm1lbW9pemVkU3RhdGU9ci5iYXNlU3RhdGU9dCxlPXtwZW5kaW5nOm51bGwsaW50ZXJsZWF2ZWQ6bnVsbCxsYW5lczowLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjplLGxhc3RSZW5kZXJlZFN0YXRlOnR9LHIucXVldWU9ZSxlPWUuZGlzcGF0Y2g9YVQuYmluZChudWxsLGh0LGUpLFtyLm1lbW9pemVkU3RhdGUsZV19LHVzZVJlZjpmdW5jdGlvbihlKXt2YXIgdD1QcigpO3JldHVybiBlPXtjdXJyZW50OmV9LHQubWVtb2l6ZWRTdGF0ZT1lfSx1c2VTdGF0ZTpYeSx1c2VEZWJ1Z1ZhbHVlOlBnLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIFByKCkubWVtb2l6ZWRTdGF0ZT1lfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9WHkoITEpLHQ9ZVswXTtyZXR1cm4gZT1zVC5iaW5kKG51bGwsZVsxXSksUHIoKS5tZW1vaXplZFN0YXRlPWUsW3QsZV19LHVzZU11dGFibGVTb3VyY2U6ZnVuY3Rpb24oKXt9LHVzZVN5bmNFeHRlcm5hbFN0b3JlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1odCxpPVByKCk7aWYob3Qpe2lmKG49PT12b2lkIDApdGhyb3cgRXJyb3IoVSg0MDcpKTtuPW4oKX1lbHNle2lmKG49dCgpLEJ0PT09bnVsbCl0aHJvdyBFcnJvcihVKDM0OSkpO0hvJjMwfHxIMShyLHQsbil9aS5tZW1vaXplZFN0YXRlPW47dmFyIG89e3ZhbHVlOm4sZ2V0U25hcHNob3Q6dH07cmV0dXJuIGkucXVldWU9byxReShaMS5iaW5kKG51bGwscixvLGUpLFtlXSksci5mbGFnc3w9MjA0OCxYYSg5LEsxLmJpbmQobnVsbCxyLG8sbix0KSx2b2lkIDAsbnVsbCksbn0sdXNlSWQ6ZnVuY3Rpb24oKXt2YXIgZT1QcigpLHQ9QnQuaWRlbnRpZmllclByZWZpeDtpZihvdCl7dmFyIG49YWkscj1zaTtuPShyJn4oMTw8MzItd3IociktMSkpLnRvU3RyaW5nKDMyKStuLHQ9IjoiK3QrIlIiK24sbj1HYSsrLDA8biYmKHQrPSJIIituLnRvU3RyaW5nKDMyKSksdCs9IjoifWVsc2Ugbj1sVCsrLHQ9IjoiK3QrInIiK24udG9TdHJpbmcoMzIpKyI6IjtyZXR1cm4gZS5tZW1vaXplZFN0YXRlPXR9LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sZFQ9e3JlYWRDb250ZXh0OnJyLHVzZUNhbGxiYWNrOnR3LHVzZUNvbnRleHQ6cnIsdXNlRWZmZWN0Ok9nLHVzZUltcGVyYXRpdmVIYW5kbGU6ZXcsdXNlSW5zZXJ0aW9uRWZmZWN0OlExLHVzZUxheW91dEVmZmVjdDpKMSx1c2VNZW1vOm53LHVzZVJlZHVjZXI6RWgsdXNlUmVmOlgxLHVzZVN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIEVoKFlhKX0sdXNlRGVidWdWYWx1ZTpQZyx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWlyKCk7cmV0dXJuIHJ3KHQsUnQubWVtb2l6ZWRTdGF0ZSxlKX0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBlPUVoKFlhKVswXSx0PWlyKCkubWVtb2l6ZWRTdGF0ZTtyZXR1cm5bZSx0XX0sdXNlTXV0YWJsZVNvdXJjZTpXMSx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpWMSx1c2VJZDppdyx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LGZUPXtyZWFkQ29udGV4dDpycix1c2VDYWxsYmFjazp0dyx1c2VDb250ZXh0OnJyLHVzZUVmZmVjdDpPZyx1c2VJbXBlcmF0aXZlSGFuZGxlOmV3LHVzZUluc2VydGlvbkVmZmVjdDpRMSx1c2VMYXlvdXRFZmZlY3Q6SjEsdXNlTWVtbzpudyx1c2VSZWR1Y2VyOkNoLHVzZVJlZjpYMSx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBDaChZYSl9LHVzZURlYnVnVmFsdWU6UGcsdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1pcigpO3JldHVybiBSdD09PW51bGw/dC5tZW1vaXplZFN0YXRlPWU6cncodCxSdC5tZW1vaXplZFN0YXRlLGUpfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9Q2goWWEpWzBdLHQ9aXIoKS5tZW1vaXplZFN0YXRlO3JldHVybltlLHRdfSx1c2VNdXRhYmxlU291cmNlOlcxLHVzZVN5bmNFeHRlcm5hbFN0b3JlOlYxLHVzZUlkOml3LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX07ZnVuY3Rpb24gb3MoZSx0KXt0cnl7dmFyIG49IiIscj10O2RvIG4rPUYkKHIpLHI9ci5yZXR1cm47d2hpbGUocik7dmFyIGk9bn1jYXRjaChvKXtpPWAKRXJyb3IgZ2VuZXJhdGluZyBzdGFjazogYCtvLm1lc3NhZ2UrYApgK28uc3RhY2t9cmV0dXJue3ZhbHVlOmUsc291cmNlOnQsc3RhY2s6aSxkaWdlc3Q6bnVsbH19ZnVuY3Rpb24ga2goZSx0LG4pe3JldHVybnt2YWx1ZTplLHNvdXJjZTpudWxsLHN0YWNrOm4/P251bGwsZGlnZXN0OnQ/P251bGx9fWZ1bmN0aW9uIFJwKGUsdCl7dHJ5e2NvbnNvbGUuZXJyb3IodC52YWx1ZSl9Y2F0Y2gobil7c2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IG59KX19dmFyIGhUPXR5cGVvZiBXZWFrTWFwPT0iZnVuY3Rpb24iP1dlYWtNYXA6TWFwO2Z1bmN0aW9uIGF3KGUsdCxuKXtuPXVpKC0xLG4pLG4udGFnPTMsbi5wYXlsb2FkPXtlbGVtZW50Om51bGx9O3ZhciByPXQudmFsdWU7cmV0dXJuIG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXttZHx8KG1kPSEwLEZwPXIpLFJwKGUsdCl9LG59ZnVuY3Rpb24gdXcoZSx0LG4pe249dWkoLTEsbiksbi50YWc9Mzt2YXIgcj1lLnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yO2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXt2YXIgaT10LnZhbHVlO24ucGF5bG9hZD1mdW5jdGlvbigpe3JldHVybiByKGkpfSxuLmNhbGxiYWNrPWZ1bmN0aW9uKCl7UnAoZSx0KX19dmFyIG89ZS5zdGF0ZU5vZGU7cmV0dXJuIG8hPT1udWxsJiZ0eXBlb2Ygby5jb21wb25lbnREaWRDYXRjaD09ImZ1bmN0aW9uIiYmKG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXtScChlLHQpLHR5cGVvZiByIT0iZnVuY3Rpb24iJiYoWWk9PT1udWxsP1lpPW5ldyBTZXQoW3RoaXNdKTpZaS5hZGQodGhpcykpO3ZhciBsPXQuc3RhY2s7dGhpcy5jb21wb25lbnREaWRDYXRjaCh0LnZhbHVlLHtjb21wb25lbnRTdGFjazpsIT09bnVsbD9sOiIifSl9KSxufWZ1bmN0aW9uIEp5KGUsdCxuKXt2YXIgcj1lLnBpbmdDYWNoZTtpZihyPT09bnVsbCl7cj1lLnBpbmdDYWNoZT1uZXcgaFQ7dmFyIGk9bmV3IFNldDtyLnNldCh0LGkpfWVsc2UgaT1yLmdldCh0KSxpPT09dm9pZCAwJiYoaT1uZXcgU2V0LHIuc2V0KHQsaSkpO2kuaGFzKG4pfHwoaS5hZGQobiksZT1iVC5iaW5kKG51bGwsZSx0LG4pLHQudGhlbihlLGUpKX1mdW5jdGlvbiBxeShlKXtkb3t2YXIgdDtpZigodD1lLnRhZz09PTEzKSYmKHQ9ZS5tZW1vaXplZFN0YXRlLHQ9dCE9PW51bGw/dC5kZWh5ZHJhdGVkIT09bnVsbDohMCksdClyZXR1cm4gZTtlPWUucmV0dXJufXdoaWxlKGUhPT1udWxsKTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBlMChlLHQsbixyLGkpe3JldHVybiBlLm1vZGUmMT8oZS5mbGFnc3w9NjU1MzYsZS5sYW5lcz1pLGUpOihlPT09dD9lLmZsYWdzfD02NTUzNjooZS5mbGFnc3w9MTI4LG4uZmxhZ3N8PTEzMTA3MixuLmZsYWdzJj0tNTI4MDUsbi50YWc9PT0xJiYobi5hbHRlcm5hdGU9PT1udWxsP24udGFnPTE3Oih0PXVpKC0xLDEpLHQudGFnPTIsR2kobix0LDEpKSksbi5sYW5lc3w9MSksZSl9dmFyIHBUPXhpLlJlYWN0Q3VycmVudE93bmVyLCRuPSExO2Z1bmN0aW9uIHVuKGUsdCxuLHIpe3QuY2hpbGQ9ZT09PW51bGw/QjEodCxudWxsLG4scik6cnModCxlLmNoaWxkLG4scil9ZnVuY3Rpb24gdDAoZSx0LG4scixpKXtuPW4ucmVuZGVyO3ZhciBvPXQucmVmO3JldHVybiBLbCh0LGkpLHI9TmcoZSx0LG4scixvLGkpLG49UmcoKSxlIT09bnVsbCYmISRuPyh0LnVwZGF0ZVF1ZXVlPWUudXBkYXRlUXVldWUsdC5mbGFncyY9LTIwNTMsZS5sYW5lcyY9fmkscGkoZSx0LGkpKToob3QmJm4mJnZnKHQpLHQuZmxhZ3N8PTEsdW4oZSx0LHIsaSksdC5jaGlsZCl9ZnVuY3Rpb24gbjAoZSx0LG4scixpKXtpZihlPT09bnVsbCl7dmFyIG89bi50eXBlO3JldHVybiB0eXBlb2Ygbz09ImZ1bmN0aW9uIiYmIUZnKG8pJiZvLmRlZmF1bHRQcm9wcz09PXZvaWQgMCYmbi5jb21wYXJlPT09bnVsbCYmbi5kZWZhdWx0UHJvcHM9PT12b2lkIDA/KHQudGFnPTE1LHQudHlwZT1vLGN3KGUsdCxvLHIsaSkpOihlPXpjKG4udHlwZSxudWxsLHIsdCx0Lm1vZGUsaSksZS5yZWY9dC5yZWYsZS5yZXR1cm49dCx0LmNoaWxkPWUpfWlmKG89ZS5jaGlsZCwhKGUubGFuZXMmaSkpe3ZhciBsPW8ubWVtb2l6ZWRQcm9wcztpZihuPW4uY29tcGFyZSxuPW4hPT1udWxsP246VWEsbihsLHIpJiZlLnJlZj09PXQucmVmKXJldHVybiBwaShlLHQsaSl9cmV0dXJuIHQuZmxhZ3N8PTEsZT1RaShvLHIpLGUucmVmPXQucmVmLGUucmV0dXJuPXQsdC5jaGlsZD1lfWZ1bmN0aW9uIGN3KGUsdCxuLHIsaSl7aWYoZSE9PW51bGwpe3ZhciBvPWUubWVtb2l6ZWRQcm9wcztpZihVYShvLHIpJiZlLnJlZj09PXQucmVmKWlmKCRuPSExLHQucGVuZGluZ1Byb3BzPXI9bywoZS5sYW5lcyZpKSE9PTApZS5mbGFncyYxMzEwNzImJigkbj0hMCk7ZWxzZSByZXR1cm4gdC5sYW5lcz1lLmxhbmVzLHBpKGUsdCxpKX1yZXR1cm4gT3AoZSx0LG4scixpKX1mdW5jdGlvbiBkdyhlLHQsbil7dmFyIHI9dC5wZW5kaW5nUHJvcHMsaT1yLmNoaWxkcmVuLG89ZSE9PW51bGw/ZS5tZW1vaXplZFN0YXRlOm51bGw7aWYoci5tb2RlPT09ImhpZGRlbiIpaWYoISh0Lm1vZGUmMSkpdC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxYZShMbCxBbiksQW58PW47ZWxzZXtpZighKG4mMTA3Mzc0MTgyNCkpcmV0dXJuIGU9byE9PW51bGw/by5iYXNlTGFuZXN8bjpuLHQubGFuZXM9dC5jaGlsZExhbmVzPTEwNzM3NDE4MjQsdC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6ZSxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSx0LnVwZGF0ZVF1ZXVlPW51bGwsWGUoTGwsQW4pLEFufD1lLG51bGw7dC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxyPW8hPT1udWxsP28uYmFzZUxhbmVzOm4sWGUoTGwsQW4pLEFufD1yfWVsc2UgbyE9PW51bGw/KHI9by5iYXNlTGFuZXN8bix0Lm1lbW9pemVkU3RhdGU9bnVsbCk6cj1uLFhlKExsLEFuKSxBbnw9cjtyZXR1cm4gdW4oZSx0LGksbiksdC5jaGlsZH1mdW5jdGlvbiBmdyhlLHQpe3ZhciBuPXQucmVmOyhlPT09bnVsbCYmbiE9PW51bGx8fGUhPT1udWxsJiZlLnJlZiE9PW4pJiYodC5mbGFnc3w9NTEyLHQuZmxhZ3N8PTIwOTcxNTIpfWZ1bmN0aW9uIE9wKGUsdCxuLHIsaSl7dmFyIG89VG4obik/V286cm4uY3VycmVudDtyZXR1cm4gbz10cyh0LG8pLEtsKHQsaSksbj1OZyhlLHQsbixyLG8saSkscj1SZygpLGUhPT1udWxsJiYhJG4/KHQudXBkYXRlUXVldWU9ZS51cGRhdGVRdWV1ZSx0LmZsYWdzJj0tMjA1MyxlLmxhbmVzJj1+aSxwaShlLHQsaSkpOihvdCYmciYmdmcodCksdC5mbGFnc3w9MSx1bihlLHQsbixpKSx0LmNoaWxkKX1mdW5jdGlvbiByMChlLHQsbixyLGkpe2lmKFRuKG4pKXt2YXIgbz0hMDtvZCh0KX1lbHNlIG89ITE7aWYoS2wodCxpKSx0LnN0YXRlTm9kZT09PW51bGwpSWMoZSx0KSx6MSh0LG4sciksTnAodCxuLHIsaSkscj0hMDtlbHNlIGlmKGU9PT1udWxsKXt2YXIgbD10LnN0YXRlTm9kZSxzPXQubWVtb2l6ZWRQcm9wcztsLnByb3BzPXM7dmFyIGE9bC5jb250ZXh0LHU9bi5jb250ZXh0VHlwZTt0eXBlb2YgdT09Im9iamVjdCImJnUhPT1udWxsP3U9cnIodSk6KHU9VG4obik/V286cm4uY3VycmVudCx1PXRzKHQsdSkpO3ZhciBjPW4uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLGQ9dHlwZW9mIGM9PSJmdW5jdGlvbiJ8fHR5cGVvZiBsLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlPT0iZnVuY3Rpb24iO2R8fHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24ifHwocyE9PXJ8fGEhPT11KSYmR3kodCxsLHIsdSksTWk9ITE7dmFyIGY9dC5tZW1vaXplZFN0YXRlO2wuc3RhdGU9ZixjZCh0LHIsbCxpKSxhPXQubWVtb2l6ZWRTdGF0ZSxzIT09cnx8ZiE9PWF8fGJuLmN1cnJlbnR8fE1pPyh0eXBlb2YgYz09ImZ1bmN0aW9uIiYmKFRwKHQsbixjLHIpLGE9dC5tZW1vaXplZFN0YXRlKSwocz1NaXx8WnkodCxuLHMscixmLGEsdSkpPyhkfHx0eXBlb2YgbC5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiJ8fCh0eXBlb2YgbC5jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJmwuY29tcG9uZW50V2lsbE1vdW50KCksdHlwZW9mIGwuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmbC5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCkpLHR5cGVvZiBsLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NDE5NDMwOCkpOih0eXBlb2YgbC5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIiYmKHQuZmxhZ3N8PTQxOTQzMDgpLHQubWVtb2l6ZWRQcm9wcz1yLHQubWVtb2l6ZWRTdGF0ZT1hKSxsLnByb3BzPXIsbC5zdGF0ZT1hLGwuY29udGV4dD11LHI9cyk6KHR5cGVvZiBsLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NDE5NDMwOCkscj0hMSl9ZWxzZXtsPXQuc3RhdGVOb2RlLEwxKGUsdCkscz10Lm1lbW9pemVkUHJvcHMsdT10LnR5cGU9PT10LmVsZW1lbnRUeXBlP3M6bXIodC50eXBlLHMpLGwucHJvcHM9dSxkPXQucGVuZGluZ1Byb3BzLGY9bC5jb250ZXh0LGE9bi5jb250ZXh0VHlwZSx0eXBlb2YgYT09Im9iamVjdCImJmEhPT1udWxsP2E9cnIoYSk6KGE9VG4obik/V286cm4uY3VycmVudCxhPXRzKHQsYSkpO3ZhciBoPW4uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOyhjPXR5cGVvZiBoPT0iZnVuY3Rpb24ifHx0eXBlb2YgbC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZT09ImZ1bmN0aW9uIil8fHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24ifHwocyE9PWR8fGYhPT1hKSYmR3kodCxsLHIsYSksTWk9ITEsZj10Lm1lbW9pemVkU3RhdGUsbC5zdGF0ZT1mLGNkKHQscixsLGkpO3ZhciBtPXQubWVtb2l6ZWRTdGF0ZTtzIT09ZHx8ZiE9PW18fGJuLmN1cnJlbnR8fE1pPyh0eXBlb2YgaD09ImZ1bmN0aW9uIiYmKFRwKHQsbixoLHIpLG09dC5tZW1vaXplZFN0YXRlKSwodT1NaXx8WnkodCxuLHUscixmLG0sYSl8fCExKT8oY3x8dHlwZW9mIGwuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUhPSJmdW5jdGlvbiImJnR5cGVvZiBsLmNvbXBvbmVudFdpbGxVcGRhdGUhPSJmdW5jdGlvbiJ8fCh0eXBlb2YgbC5jb21wb25lbnRXaWxsVXBkYXRlPT0iZnVuY3Rpb24iJiZsLmNvbXBvbmVudFdpbGxVcGRhdGUocixtLGEpLHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlPT0iZnVuY3Rpb24iJiZsLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlKHIsbSxhKSksdHlwZW9mIGwuY29tcG9uZW50RGlkVXBkYXRlPT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NCksdHlwZW9mIGwuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiImJih0LmZsYWdzfD0xMDI0KSk6KHR5cGVvZiBsLmNvbXBvbmVudERpZFVwZGF0ZSE9ImZ1bmN0aW9uInx8cz09PWUubWVtb2l6ZWRQcm9wcyYmZj09PWUubWVtb2l6ZWRTdGF0ZXx8KHQuZmxhZ3N8PTQpLHR5cGVvZiBsLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09ZS5tZW1vaXplZFByb3BzJiZmPT09ZS5tZW1vaXplZFN0YXRlfHwodC5mbGFnc3w9MTAyNCksdC5tZW1vaXplZFByb3BzPXIsdC5tZW1vaXplZFN0YXRlPW0pLGwucHJvcHM9cixsLnN0YXRlPW0sbC5jb250ZXh0PWEscj11KToodHlwZW9mIGwuY29tcG9uZW50RGlkVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09ZS5tZW1vaXplZFByb3BzJiZmPT09ZS5tZW1vaXplZFN0YXRlfHwodC5mbGFnc3w9NCksdHlwZW9mIGwuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUhPSJmdW5jdGlvbiJ8fHM9PT1lLm1lbW9pemVkUHJvcHMmJmY9PT1lLm1lbW9pemVkU3RhdGV8fCh0LmZsYWdzfD0xMDI0KSxyPSExKX1yZXR1cm4gUHAoZSx0LG4scixvLGkpfWZ1bmN0aW9uIFBwKGUsdCxuLHIsaSxvKXtmdyhlLHQpO3ZhciBsPSh0LmZsYWdzJjEyOCkhPT0wO2lmKCFyJiYhbClyZXR1cm4gaSYmVXkodCxuLCExKSxwaShlLHQsbyk7cj10LnN0YXRlTm9kZSxwVC5jdXJyZW50PXQ7dmFyIHM9bCYmdHlwZW9mIG4uZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIT0iZnVuY3Rpb24iP251bGw6ci5yZW5kZXIoKTtyZXR1cm4gdC5mbGFnc3w9MSxlIT09bnVsbCYmbD8odC5jaGlsZD1ycyh0LGUuY2hpbGQsbnVsbCxvKSx0LmNoaWxkPXJzKHQsbnVsbCxzLG8pKTp1bihlLHQscyxvKSx0Lm1lbW9pemVkU3RhdGU9ci5zdGF0ZSxpJiZVeSh0LG4sITApLHQuY2hpbGR9ZnVuY3Rpb24gaHcoZSl7dmFyIHQ9ZS5zdGF0ZU5vZGU7dC5wZW5kaW5nQ29udGV4dD9CeShlLHQucGVuZGluZ0NvbnRleHQsdC5wZW5kaW5nQ29udGV4dCE9PXQuY29udGV4dCk6dC5jb250ZXh0JiZCeShlLHQuY29udGV4dCwhMSksa2coZSx0LmNvbnRhaW5lckluZm8pfWZ1bmN0aW9uIGkwKGUsdCxuLHIsaSl7cmV0dXJuIG5zKCkseGcoaSksdC5mbGFnc3w9MjU2LHVuKGUsdCxuLHIpLHQuY2hpbGR9dmFyIEFwPXtkZWh5ZHJhdGVkOm51bGwsdHJlZUNvbnRleHQ6bnVsbCxyZXRyeUxhbmU6MH07ZnVuY3Rpb24gTXAoZSl7cmV0dXJue2Jhc2VMYW5lczplLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9fWZ1bmN0aW9uIHB3KGUsdCxuKXt2YXIgcj10LnBlbmRpbmdQcm9wcyxpPWR0LmN1cnJlbnQsbz0hMSxsPSh0LmZsYWdzJjEyOCkhPT0wLHM7aWYoKHM9bCl8fChzPWUhPT1udWxsJiZlLm1lbW9pemVkU3RhdGU9PT1udWxsPyExOihpJjIpIT09MCkscz8obz0hMCx0LmZsYWdzJj0tMTI5KTooZT09PW51bGx8fGUubWVtb2l6ZWRTdGF0ZSE9PW51bGwpJiYoaXw9MSksWGUoZHQsaSYxKSxlPT09bnVsbClyZXR1cm4gJHAodCksZT10Lm1lbW9pemVkU3RhdGUsZSE9PW51bGwmJihlPWUuZGVoeWRyYXRlZCxlIT09bnVsbCk/KHQubW9kZSYxP2UuZGF0YT09PSIkISI/dC5sYW5lcz04OnQubGFuZXM9MTA3Mzc0MTgyNDp0LmxhbmVzPTEsbnVsbCk6KGw9ci5jaGlsZHJlbixlPXIuZmFsbGJhY2ssbz8ocj10Lm1vZGUsbz10LmNoaWxkLGw9e21vZGU6ImhpZGRlbiIsY2hpbGRyZW46bH0sIShyJjEpJiZvIT09bnVsbD8oby5jaGlsZExhbmVzPTAsby5wZW5kaW5nUHJvcHM9bCk6bz1wZihsLHIsMCxudWxsKSxlPUxvKGUscixuLG51bGwpLG8ucmV0dXJuPXQsZS5yZXR1cm49dCxvLnNpYmxpbmc9ZSx0LmNoaWxkPW8sdC5jaGlsZC5tZW1vaXplZFN0YXRlPU1wKG4pLHQubWVtb2l6ZWRTdGF0ZT1BcCxlKTpBZyh0LGwpKTtpZihpPWUubWVtb2l6ZWRTdGF0ZSxpIT09bnVsbCYmKHM9aS5kZWh5ZHJhdGVkLHMhPT1udWxsKSlyZXR1cm4gbVQoZSx0LGwscixzLGksbik7aWYobyl7bz1yLmZhbGxiYWNrLGw9dC5tb2RlLGk9ZS5jaGlsZCxzPWkuc2libGluZzt2YXIgYT17bW9kZToiaGlkZGVuIixjaGlsZHJlbjpyLmNoaWxkcmVufTtyZXR1cm4hKGwmMSkmJnQuY2hpbGQhPT1pPyhyPXQuY2hpbGQsci5jaGlsZExhbmVzPTAsci5wZW5kaW5nUHJvcHM9YSx0LmRlbGV0aW9ucz1udWxsKToocj1RaShpLGEpLHIuc3VidHJlZUZsYWdzPWkuc3VidHJlZUZsYWdzJjE0NjgwMDY0KSxzIT09bnVsbD9vPVFpKHMsbyk6KG89TG8obyxsLG4sbnVsbCksby5mbGFnc3w9Miksby5yZXR1cm49dCxyLnJldHVybj10LHIuc2libGluZz1vLHQuY2hpbGQ9cixyPW8sbz10LmNoaWxkLGw9ZS5jaGlsZC5tZW1vaXplZFN0YXRlLGw9bD09PW51bGw/TXAobik6e2Jhc2VMYW5lczpsLmJhc2VMYW5lc3xuLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOmwudHJhbnNpdGlvbnN9LG8ubWVtb2l6ZWRTdGF0ZT1sLG8uY2hpbGRMYW5lcz1lLmNoaWxkTGFuZXMmfm4sdC5tZW1vaXplZFN0YXRlPUFwLHJ9cmV0dXJuIG89ZS5jaGlsZCxlPW8uc2libGluZyxyPVFpKG8se21vZGU6InZpc2libGUiLGNoaWxkcmVuOnIuY2hpbGRyZW59KSwhKHQubW9kZSYxKSYmKHIubGFuZXM9biksci5yZXR1cm49dCxyLnNpYmxpbmc9bnVsbCxlIT09bnVsbCYmKG49dC5kZWxldGlvbnMsbj09PW51bGw/KHQuZGVsZXRpb25zPVtlXSx0LmZsYWdzfD0xNik6bi5wdXNoKGUpKSx0LmNoaWxkPXIsdC5tZW1vaXplZFN0YXRlPW51bGwscn1mdW5jdGlvbiBBZyhlLHQpe3JldHVybiB0PXBmKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjp0fSxlLm1vZGUsMCxudWxsKSx0LnJldHVybj1lLGUuY2hpbGQ9dH1mdW5jdGlvbiBhYyhlLHQsbixyKXtyZXR1cm4gciE9PW51bGwmJnhnKHIpLHJzKHQsZS5jaGlsZCxudWxsLG4pLGU9QWcodCx0LnBlbmRpbmdQcm9wcy5jaGlsZHJlbiksZS5mbGFnc3w9Mix0Lm1lbW9pemVkU3RhdGU9bnVsbCxlfWZ1bmN0aW9uIG1UKGUsdCxuLHIsaSxvLGwpe2lmKG4pcmV0dXJuIHQuZmxhZ3MmMjU2Pyh0LmZsYWdzJj0tMjU3LHI9a2goRXJyb3IoVSg0MjIpKSksYWMoZSx0LGwscikpOnQubWVtb2l6ZWRTdGF0ZSE9PW51bGw/KHQuY2hpbGQ9ZS5jaGlsZCx0LmZsYWdzfD0xMjgsbnVsbCk6KG89ci5mYWxsYmFjayxpPXQubW9kZSxyPXBmKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjpyLmNoaWxkcmVufSxpLDAsbnVsbCksbz1MbyhvLGksbCxudWxsKSxvLmZsYWdzfD0yLHIucmV0dXJuPXQsby5yZXR1cm49dCxyLnNpYmxpbmc9byx0LmNoaWxkPXIsdC5tb2RlJjEmJnJzKHQsZS5jaGlsZCxudWxsLGwpLHQuY2hpbGQubWVtb2l6ZWRTdGF0ZT1NcChsKSx0Lm1lbW9pemVkU3RhdGU9QXAsbyk7aWYoISh0Lm1vZGUmMSkpcmV0dXJuIGFjKGUsdCxsLG51bGwpO2lmKGkuZGF0YT09PSIkISIpe2lmKHI9aS5uZXh0U2libGluZyYmaS5uZXh0U2libGluZy5kYXRhc2V0LHIpdmFyIHM9ci5kZ3N0O3JldHVybiByPXMsbz1FcnJvcihVKDQxOSkpLHI9a2gobyxyLHZvaWQgMCksYWMoZSx0LGwscil9aWYocz0obCZlLmNoaWxkTGFuZXMpIT09MCwkbnx8cyl7aWYocj1CdCxyIT09bnVsbCl7c3dpdGNoKGwmLWwpe2Nhc2UgNDppPTI7YnJlYWs7Y2FzZSAxNjppPTg7YnJlYWs7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0Omk9MzI7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6aT0yNjg0MzU0NTY7YnJlYWs7ZGVmYXVsdDppPTB9aT1pJihyLnN1c3BlbmRlZExhbmVzfGwpPzA6aSxpIT09MCYmaSE9PW8ucmV0cnlMYW5lJiYoby5yZXRyeUxhbmU9aSxoaShlLGkpLFNyKHIsZSxpLC0xKSl9cmV0dXJuIHpnKCkscj1raChFcnJvcihVKDQyMSkpKSxhYyhlLHQsbCxyKX1yZXR1cm4gaS5kYXRhPT09IiQ/Ij8odC5mbGFnc3w9MTI4LHQuY2hpbGQ9ZS5jaGlsZCx0PVRULmJpbmQobnVsbCxlKSxpLl9yZWFjdFJldHJ5PXQsbnVsbCk6KGU9by50cmVlQ29udGV4dCxJbj1aaShpLm5leHRTaWJsaW5nKSxMbj10LG90PSEwLHlyPW51bGwsZSE9PW51bGwmJihZbltYbisrXT1zaSxZbltYbisrXT1haSxZbltYbisrXT1WbyxzaT1lLmlkLGFpPWUub3ZlcmZsb3csVm89dCksdD1BZyh0LHIuY2hpbGRyZW4pLHQuZmxhZ3N8PTQwOTYsdCl9ZnVuY3Rpb24gbzAoZSx0LG4pe2UubGFuZXN8PXQ7dmFyIHI9ZS5hbHRlcm5hdGU7ciE9PW51bGwmJihyLmxhbmVzfD10KSxicChlLnJldHVybix0LG4pfWZ1bmN0aW9uICRoKGUsdCxuLHIsaSl7dmFyIG89ZS5tZW1vaXplZFN0YXRlO289PT1udWxsP2UubWVtb2l6ZWRTdGF0ZT17aXNCYWNrd2FyZHM6dCxyZW5kZXJpbmc6bnVsbCxyZW5kZXJpbmdTdGFydFRpbWU6MCxsYXN0OnIsdGFpbDpuLHRhaWxNb2RlOml9OihvLmlzQmFja3dhcmRzPXQsby5yZW5kZXJpbmc9bnVsbCxvLnJlbmRlcmluZ1N0YXJ0VGltZT0wLG8ubGFzdD1yLG8udGFpbD1uLG8udGFpbE1vZGU9aSl9ZnVuY3Rpb24gbXcoZSx0LG4pe3ZhciByPXQucGVuZGluZ1Byb3BzLGk9ci5yZXZlYWxPcmRlcixvPXIudGFpbDtpZih1bihlLHQsci5jaGlsZHJlbixuKSxyPWR0LmN1cnJlbnQsciYyKXI9ciYxfDIsdC5mbGFnc3w9MTI4O2Vsc2V7aWYoZSE9PW51bGwmJmUuZmxhZ3MmMTI4KWU6Zm9yKGU9dC5jaGlsZDtlIT09bnVsbDspe2lmKGUudGFnPT09MTMpZS5tZW1vaXplZFN0YXRlIT09bnVsbCYmbzAoZSxuLHQpO2Vsc2UgaWYoZS50YWc9PT0xOSlvMChlLG4sdCk7ZWxzZSBpZihlLmNoaWxkIT09bnVsbCl7ZS5jaGlsZC5yZXR1cm49ZSxlPWUuY2hpbGQ7Y29udGludWV9aWYoZT09PXQpYnJlYWsgZTtmb3IoO2Uuc2libGluZz09PW51bGw7KXtpZihlLnJldHVybj09PW51bGx8fGUucmV0dXJuPT09dClicmVhayBlO2U9ZS5yZXR1cm59ZS5zaWJsaW5nLnJldHVybj1lLnJldHVybixlPWUuc2libGluZ31yJj0xfWlmKFhlKGR0LHIpLCEodC5tb2RlJjEpKXQubWVtb2l6ZWRTdGF0ZT1udWxsO2Vsc2Ugc3dpdGNoKGkpe2Nhc2UiZm9yd2FyZHMiOmZvcihuPXQuY2hpbGQsaT1udWxsO24hPT1udWxsOyllPW4uYWx0ZXJuYXRlLGUhPT1udWxsJiZkZChlKT09PW51bGwmJihpPW4pLG49bi5zaWJsaW5nO249aSxuPT09bnVsbD8oaT10LmNoaWxkLHQuY2hpbGQ9bnVsbCk6KGk9bi5zaWJsaW5nLG4uc2libGluZz1udWxsKSwkaCh0LCExLGksbixvKTticmVhaztjYXNlImJhY2t3YXJkcyI6Zm9yKG49bnVsbCxpPXQuY2hpbGQsdC5jaGlsZD1udWxsO2khPT1udWxsOyl7aWYoZT1pLmFsdGVybmF0ZSxlIT09bnVsbCYmZGQoZSk9PT1udWxsKXt0LmNoaWxkPWk7YnJlYWt9ZT1pLnNpYmxpbmcsaS5zaWJsaW5nPW4sbj1pLGk9ZX0kaCh0LCEwLG4sbnVsbCxvKTticmVhaztjYXNlInRvZ2V0aGVyIjokaCh0LCExLG51bGwsbnVsbCx2b2lkIDApO2JyZWFrO2RlZmF1bHQ6dC5tZW1vaXplZFN0YXRlPW51bGx9cmV0dXJuIHQuY2hpbGR9ZnVuY3Rpb24gSWMoZSx0KXshKHQubW9kZSYxKSYmZSE9PW51bGwmJihlLmFsdGVybmF0ZT1udWxsLHQuYWx0ZXJuYXRlPW51bGwsdC5mbGFnc3w9Mil9ZnVuY3Rpb24gcGkoZSx0LG4pe2lmKGUhPT1udWxsJiYodC5kZXBlbmRlbmNpZXM9ZS5kZXBlbmRlbmNpZXMpLEtvfD10LmxhbmVzLCEobiZ0LmNoaWxkTGFuZXMpKXJldHVybiBudWxsO2lmKGUhPT1udWxsJiZ0LmNoaWxkIT09ZS5jaGlsZCl0aHJvdyBFcnJvcihVKDE1MykpO2lmKHQuY2hpbGQhPT1udWxsKXtmb3IoZT10LmNoaWxkLG49UWkoZSxlLnBlbmRpbmdQcm9wcyksdC5jaGlsZD1uLG4ucmV0dXJuPXQ7ZS5zaWJsaW5nIT09bnVsbDspZT1lLnNpYmxpbmcsbj1uLnNpYmxpbmc9UWkoZSxlLnBlbmRpbmdQcm9wcyksbi5yZXR1cm49dDtuLnNpYmxpbmc9bnVsbH1yZXR1cm4gdC5jaGlsZH1mdW5jdGlvbiBnVChlLHQsbil7c3dpdGNoKHQudGFnKXtjYXNlIDM6aHcodCksbnMoKTticmVhaztjYXNlIDU6VTEodCk7YnJlYWs7Y2FzZSAxOlRuKHQudHlwZSkmJm9kKHQpO2JyZWFrO2Nhc2UgNDprZyh0LHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO2JyZWFrO2Nhc2UgMTA6dmFyIHI9dC50eXBlLl9jb250ZXh0LGk9dC5tZW1vaXplZFByb3BzLnZhbHVlO1hlKGFkLHIuX2N1cnJlbnRWYWx1ZSksci5fY3VycmVudFZhbHVlPWk7YnJlYWs7Y2FzZSAxMzppZihyPXQubWVtb2l6ZWRTdGF0ZSxyIT09bnVsbClyZXR1cm4gci5kZWh5ZHJhdGVkIT09bnVsbD8oWGUoZHQsZHQuY3VycmVudCYxKSx0LmZsYWdzfD0xMjgsbnVsbCk6biZ0LmNoaWxkLmNoaWxkTGFuZXM/cHcoZSx0LG4pOihYZShkdCxkdC5jdXJyZW50JjEpLGU9cGkoZSx0LG4pLGUhPT1udWxsP2Uuc2libGluZzpudWxsKTtYZShkdCxkdC5jdXJyZW50JjEpO2JyZWFrO2Nhc2UgMTk6aWYocj0obiZ0LmNoaWxkTGFuZXMpIT09MCxlLmZsYWdzJjEyOCl7aWYocilyZXR1cm4gbXcoZSx0LG4pO3QuZmxhZ3N8PTEyOH1pZihpPXQubWVtb2l6ZWRTdGF0ZSxpIT09bnVsbCYmKGkucmVuZGVyaW5nPW51bGwsaS50YWlsPW51bGwsaS5sYXN0RWZmZWN0PW51bGwpLFhlKGR0LGR0LmN1cnJlbnQpLHIpYnJlYWs7cmV0dXJuIG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiB0LmxhbmVzPTAsZHcoZSx0LG4pfXJldHVybiBwaShlLHQsbil9dmFyIGd3LERwLHZ3LHl3O2d3PWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXQuY2hpbGQ7biE9PW51bGw7KXtpZihuLnRhZz09PTV8fG4udGFnPT09NillLmFwcGVuZENoaWxkKG4uc3RhdGVOb2RlKTtlbHNlIGlmKG4udGFnIT09NCYmbi5jaGlsZCE9PW51bGwpe24uY2hpbGQucmV0dXJuPW4sbj1uLmNoaWxkO2NvbnRpbnVlfWlmKG49PT10KWJyZWFrO2Zvcig7bi5zaWJsaW5nPT09bnVsbDspe2lmKG4ucmV0dXJuPT09bnVsbHx8bi5yZXR1cm49PT10KXJldHVybjtuPW4ucmV0dXJufW4uc2libGluZy5yZXR1cm49bi5yZXR1cm4sbj1uLnNpYmxpbmd9fTtEcD1mdW5jdGlvbigpe307dnc9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9ZS5tZW1vaXplZFByb3BzO2lmKGkhPT1yKXtlPXQuc3RhdGVOb2RlLEFvKEZyLmN1cnJlbnQpO3ZhciBvPW51bGw7c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOmk9cnAoZSxpKSxyPXJwKGUsciksbz1bXTticmVhaztjYXNlInNlbGVjdCI6aT1tdCh7fSxpLHt2YWx1ZTp2b2lkIDB9KSxyPW10KHt9LHIse3ZhbHVlOnZvaWQgMH0pLG89W107YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6aT1scChlLGkpLHI9bHAoZSxyKSxvPVtdO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIGkub25DbGljayE9ImZ1bmN0aW9uIiYmdHlwZW9mIHIub25DbGljaz09ImZ1bmN0aW9uIiYmKGUub25jbGljaz1yZCl9YXAobixyKTt2YXIgbDtuPW51bGw7Zm9yKHUgaW4gaSlpZighci5oYXNPd25Qcm9wZXJ0eSh1KSYmaS5oYXNPd25Qcm9wZXJ0eSh1KSYmaVt1XSE9bnVsbClpZih1PT09InN0eWxlIil7dmFyIHM9aVt1XTtmb3IobCBpbiBzKXMuaGFzT3duUHJvcGVydHkobCkmJihufHwobj17fSksbltsXT0iIil9ZWxzZSB1IT09ImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiYmdSE9PSJjaGlsZHJlbiImJnUhPT0ic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiYmdSE9PSJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciJiZ1IT09ImF1dG9Gb2N1cyImJihEYS5oYXNPd25Qcm9wZXJ0eSh1KT9vfHwobz1bXSk6KG89b3x8W10pLnB1c2godSxudWxsKSk7Zm9yKHUgaW4gcil7dmFyIGE9clt1XTtpZihzPWkhPW51bGw/aVt1XTp2b2lkIDAsci5oYXNPd25Qcm9wZXJ0eSh1KSYmYSE9PXMmJihhIT1udWxsfHxzIT1udWxsKSlpZih1PT09InN0eWxlIilpZihzKXtmb3IobCBpbiBzKSFzLmhhc093blByb3BlcnR5KGwpfHxhJiZhLmhhc093blByb3BlcnR5KGwpfHwobnx8KG49e30pLG5bbF09IiIpO2ZvcihsIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShsKSYmc1tsXSE9PWFbbF0mJihufHwobj17fSksbltsXT1hW2xdKX1lbHNlIG58fChvfHwobz1bXSksby5wdXNoKHUsbikpLG49YTtlbHNlIHU9PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyhhPWE/YS5fX2h0bWw6dm9pZCAwLHM9cz9zLl9faHRtbDp2b2lkIDAsYSE9bnVsbCYmcyE9PWEmJihvPW98fFtdKS5wdXNoKHUsYSkpOnU9PT0iY2hpbGRyZW4iP3R5cGVvZiBhIT0ic3RyaW5nIiYmdHlwZW9mIGEhPSJudW1iZXIifHwobz1vfHxbXSkucHVzaCh1LCIiK2EpOnUhPT0ic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiYmdSE9PSJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciJiYoRGEuaGFzT3duUHJvcGVydHkodSk/KGEhPW51bGwmJnU9PT0ib25TY3JvbGwiJiZldCgic2Nyb2xsIixlKSxvfHxzPT09YXx8KG89W10pKToobz1vfHxbXSkucHVzaCh1LGEpKX1uJiYobz1vfHxbXSkucHVzaCgic3R5bGUiLG4pO3ZhciB1PW87KHQudXBkYXRlUXVldWU9dSkmJih0LmZsYWdzfD00KX19O3l3PWZ1bmN0aW9uKGUsdCxuLHIpe24hPT1yJiYodC5mbGFnc3w9NCl9O2Z1bmN0aW9uIEhzKGUsdCl7aWYoIW90KXN3aXRjaChlLnRhaWxNb2RlKXtjYXNlImhpZGRlbiI6dD1lLnRhaWw7Zm9yKHZhciBuPW51bGw7dCE9PW51bGw7KXQuYWx0ZXJuYXRlIT09bnVsbCYmKG49dCksdD10LnNpYmxpbmc7bj09PW51bGw/ZS50YWlsPW51bGw6bi5zaWJsaW5nPW51bGw7YnJlYWs7Y2FzZSJjb2xsYXBzZWQiOm49ZS50YWlsO2Zvcih2YXIgcj1udWxsO24hPT1udWxsOyluLmFsdGVybmF0ZSE9PW51bGwmJihyPW4pLG49bi5zaWJsaW5nO3I9PT1udWxsP3R8fGUudGFpbD09PW51bGw/ZS50YWlsPW51bGw6ZS50YWlsLnNpYmxpbmc9bnVsbDpyLnNpYmxpbmc9bnVsbH19ZnVuY3Rpb24gWHQoZSl7dmFyIHQ9ZS5hbHRlcm5hdGUhPT1udWxsJiZlLmFsdGVybmF0ZS5jaGlsZD09PWUuY2hpbGQsbj0wLHI9MDtpZih0KWZvcih2YXIgaT1lLmNoaWxkO2khPT1udWxsOylufD1pLmxhbmVzfGkuY2hpbGRMYW5lcyxyfD1pLnN1YnRyZWVGbGFncyYxNDY4MDA2NCxyfD1pLmZsYWdzJjE0NjgwMDY0LGkucmV0dXJuPWUsaT1pLnNpYmxpbmc7ZWxzZSBmb3IoaT1lLmNoaWxkO2khPT1udWxsOylufD1pLmxhbmVzfGkuY2hpbGRMYW5lcyxyfD1pLnN1YnRyZWVGbGFncyxyfD1pLmZsYWdzLGkucmV0dXJuPWUsaT1pLnNpYmxpbmc7cmV0dXJuIGUuc3VidHJlZUZsYWdzfD1yLGUuY2hpbGRMYW5lcz1uLHR9ZnVuY3Rpb24gdlQoZSx0LG4pe3ZhciByPXQucGVuZGluZ1Byb3BzO3N3aXRjaCh5Zyh0KSx0LnRhZyl7Y2FzZSAyOmNhc2UgMTY6Y2FzZSAxNTpjYXNlIDA6Y2FzZSAxMTpjYXNlIDc6Y2FzZSA4OmNhc2UgMTI6Y2FzZSA5OmNhc2UgMTQ6cmV0dXJuIFh0KHQpLG51bGw7Y2FzZSAxOnJldHVybiBUbih0LnR5cGUpJiZpZCgpLFh0KHQpLG51bGw7Y2FzZSAzOnJldHVybiByPXQuc3RhdGVOb2RlLGlzKCksaXQoYm4pLGl0KHJuKSxiZygpLHIucGVuZGluZ0NvbnRleHQmJihyLmNvbnRleHQ9ci5wZW5kaW5nQ29udGV4dCxyLnBlbmRpbmdDb250ZXh0PW51bGwpLChlPT09bnVsbHx8ZS5jaGlsZD09PW51bGwpJiYobGModCk/dC5mbGFnc3w9NDplPT09bnVsbHx8ZS5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCYmISh0LmZsYWdzJjI1Nil8fCh0LmZsYWdzfD0xMDI0LHlyIT09bnVsbCYmKFdwKHlyKSx5cj1udWxsKSkpLERwKGUsdCksWHQodCksbnVsbDtjYXNlIDU6JGcodCk7dmFyIGk9QW8oWmEuY3VycmVudCk7aWYobj10LnR5cGUsZSE9PW51bGwmJnQuc3RhdGVOb2RlIT1udWxsKXZ3KGUsdCxuLHIsaSksZS5yZWYhPT10LnJlZiYmKHQuZmxhZ3N8PTUxMix0LmZsYWdzfD0yMDk3MTUyKTtlbHNle2lmKCFyKXtpZih0LnN0YXRlTm9kZT09PW51bGwpdGhyb3cgRXJyb3IoVSgxNjYpKTtyZXR1cm4gWHQodCksbnVsbH1pZihlPUFvKEZyLmN1cnJlbnQpLGxjKHQpKXtyPXQuc3RhdGVOb2RlLG49dC50eXBlO3ZhciBvPXQubWVtb2l6ZWRQcm9wcztzd2l0Y2gocltNcl09dCxyW0hhXT1vLGU9KHQubW9kZSYxKSE9PTAsbil7Y2FzZSJkaWFsb2ciOmV0KCJjYW5jZWwiLHIpLGV0KCJjbG9zZSIscik7YnJlYWs7Y2FzZSJpZnJhbWUiOmNhc2Uib2JqZWN0IjpjYXNlImVtYmVkIjpldCgibG9hZCIscik7YnJlYWs7Y2FzZSJ2aWRlbyI6Y2FzZSJhdWRpbyI6Zm9yKGk9MDtpPHNhLmxlbmd0aDtpKyspZXQoc2FbaV0scik7YnJlYWs7Y2FzZSJzb3VyY2UiOmV0KCJlcnJvciIscik7YnJlYWs7Y2FzZSJpbWciOmNhc2UiaW1hZ2UiOmNhc2UibGluayI6ZXQoImVycm9yIixyKSxldCgibG9hZCIscik7YnJlYWs7Y2FzZSJkZXRhaWxzIjpldCgidG9nZ2xlIixyKTticmVhaztjYXNlImlucHV0IjpweShyLG8pLGV0KCJpbnZhbGlkIixyKTticmVhaztjYXNlInNlbGVjdCI6ci5fd3JhcHBlclN0YXRlPXt3YXNNdWx0aXBsZTohIW8ubXVsdGlwbGV9LGV0KCJpbnZhbGlkIixyKTticmVhaztjYXNlInRleHRhcmVhIjpneShyLG8pLGV0KCJpbnZhbGlkIixyKX1hcChuLG8pLGk9bnVsbDtmb3IodmFyIGwgaW4gbylpZihvLmhhc093blByb3BlcnR5KGwpKXt2YXIgcz1vW2xdO2w9PT0iY2hpbGRyZW4iP3R5cGVvZiBzPT0ic3RyaW5nIj9yLnRleHRDb250ZW50IT09cyYmKG8uc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIT09ITAmJm9jKHIudGV4dENvbnRlbnQscyxlKSxpPVsiY2hpbGRyZW4iLHNdKTp0eXBlb2Ygcz09Im51bWJlciImJnIudGV4dENvbnRlbnQhPT0iIitzJiYoby5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmchPT0hMCYmb2Moci50ZXh0Q29udGVudCxzLGUpLGk9WyJjaGlsZHJlbiIsIiIrc10pOkRhLmhhc093blByb3BlcnR5KGwpJiZzIT1udWxsJiZsPT09Im9uU2Nyb2xsIiYmZXQoInNjcm9sbCIscil9c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOlF1KHIpLG15KHIsbywhMCk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6UXUociksdnkocik7YnJlYWs7Y2FzZSJzZWxlY3QiOmNhc2Uib3B0aW9uIjpicmVhaztkZWZhdWx0OnR5cGVvZiBvLm9uQ2xpY2s9PSJmdW5jdGlvbiImJihyLm9uY2xpY2s9cmQpfXI9aSx0LnVwZGF0ZVF1ZXVlPXIsciE9PW51bGwmJih0LmZsYWdzfD00KX1lbHNle2w9aS5ub2RlVHlwZT09PTk/aTppLm93bmVyRG9jdW1lbnQsZT09PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiYmKGU9SF8obikpLGU9PT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI/bj09PSJzY3JpcHQiPyhlPWwuY3JlYXRlRWxlbWVudCgiZGl2IiksZS5pbm5lckhUTUw9IjxzY3JpcHQ+PFwvc2NyaXB0PiIsZT1lLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCkpOnR5cGVvZiByLmlzPT0ic3RyaW5nIj9lPWwuY3JlYXRlRWxlbWVudChuLHtpczpyLmlzfSk6KGU9bC5jcmVhdGVFbGVtZW50KG4pLG49PT0ic2VsZWN0IiYmKGw9ZSxyLm11bHRpcGxlP2wubXVsdGlwbGU9ITA6ci5zaXplJiYobC5zaXplPXIuc2l6ZSkpKTplPWwuY3JlYXRlRWxlbWVudE5TKGUsbiksZVtNcl09dCxlW0hhXT1yLGd3KGUsdCwhMSwhMSksdC5zdGF0ZU5vZGU9ZTtlOntzd2l0Y2gobD11cChuLHIpLG4pe2Nhc2UiZGlhbG9nIjpldCgiY2FuY2VsIixlKSxldCgiY2xvc2UiLGUpLGk9cjticmVhaztjYXNlImlmcmFtZSI6Y2FzZSJvYmplY3QiOmNhc2UiZW1iZWQiOmV0KCJsb2FkIixlKSxpPXI7YnJlYWs7Y2FzZSJ2aWRlbyI6Y2FzZSJhdWRpbyI6Zm9yKGk9MDtpPHNhLmxlbmd0aDtpKyspZXQoc2FbaV0sZSk7aT1yO2JyZWFrO2Nhc2Uic291cmNlIjpldCgiZXJyb3IiLGUpLGk9cjticmVhaztjYXNlImltZyI6Y2FzZSJpbWFnZSI6Y2FzZSJsaW5rIjpldCgiZXJyb3IiLGUpLGV0KCJsb2FkIixlKSxpPXI7YnJlYWs7Y2FzZSJkZXRhaWxzIjpldCgidG9nZ2xlIixlKSxpPXI7YnJlYWs7Y2FzZSJpbnB1dCI6cHkoZSxyKSxpPXJwKGUsciksZXQoImludmFsaWQiLGUpO2JyZWFrO2Nhc2Uib3B0aW9uIjppPXI7YnJlYWs7Y2FzZSJzZWxlY3QiOmUuX3dyYXBwZXJTdGF0ZT17d2FzTXVsdGlwbGU6ISFyLm11bHRpcGxlfSxpPW10KHt9LHIse3ZhbHVlOnZvaWQgMH0pLGV0KCJpbnZhbGlkIixlKTticmVhaztjYXNlInRleHRhcmVhIjpneShlLHIpLGk9bHAoZSxyKSxldCgiaW52YWxpZCIsZSk7YnJlYWs7ZGVmYXVsdDppPXJ9YXAobixpKSxzPWk7Zm9yKG8gaW4gcylpZihzLmhhc093blByb3BlcnR5KG8pKXt2YXIgYT1zW29dO289PT0ic3R5bGUiP0dfKGUsYSk6bz09PSJkYW5nZXJvdXNseVNldElubmVySFRNTCI/KGE9YT9hLl9faHRtbDp2b2lkIDAsYSE9bnVsbCYmS18oZSxhKSk6bz09PSJjaGlsZHJlbiI/dHlwZW9mIGE9PSJzdHJpbmciPyhuIT09InRleHRhcmVhInx8YSE9PSIiKSYmSWEoZSxhKTp0eXBlb2YgYT09Im51bWJlciImJklhKGUsIiIrYSk6byE9PSJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmciJiZvIT09InN1cHByZXNzSHlkcmF0aW9uV2FybmluZyImJm8hPT0iYXV0b0ZvY3VzIiYmKERhLmhhc093blByb3BlcnR5KG8pP2EhPW51bGwmJm89PT0ib25TY3JvbGwiJiZldCgic2Nyb2xsIixlKTphIT1udWxsJiZyZyhlLG8sYSxsKSl9c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOlF1KGUpLG15KGUsciwhMSk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6UXUoZSksdnkoZSk7YnJlYWs7Y2FzZSJvcHRpb24iOnIudmFsdWUhPW51bGwmJmUuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIrdG8oci52YWx1ZSkpO2JyZWFrO2Nhc2Uic2VsZWN0IjplLm11bHRpcGxlPSEhci5tdWx0aXBsZSxvPXIudmFsdWUsbyE9bnVsbD9VbChlLCEhci5tdWx0aXBsZSxvLCExKTpyLmRlZmF1bHRWYWx1ZSE9bnVsbCYmVWwoZSwhIXIubXVsdGlwbGUsci5kZWZhdWx0VmFsdWUsITApO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIGkub25DbGljaz09ImZ1bmN0aW9uIiYmKGUub25jbGljaz1yZCl9c3dpdGNoKG4pe2Nhc2UiYnV0dG9uIjpjYXNlImlucHV0IjpjYXNlInNlbGVjdCI6Y2FzZSJ0ZXh0YXJlYSI6cj0hIXIuYXV0b0ZvY3VzO2JyZWFrIGU7Y2FzZSJpbWciOnI9ITA7YnJlYWsgZTtkZWZhdWx0OnI9ITF9fXImJih0LmZsYWdzfD00KX10LnJlZiE9PW51bGwmJih0LmZsYWdzfD01MTIsdC5mbGFnc3w9MjA5NzE1Mil9cmV0dXJuIFh0KHQpLG51bGw7Y2FzZSA2OmlmKGUmJnQuc3RhdGVOb2RlIT1udWxsKXl3KGUsdCxlLm1lbW9pemVkUHJvcHMscik7ZWxzZXtpZih0eXBlb2YgciE9InN0cmluZyImJnQuc3RhdGVOb2RlPT09bnVsbCl0aHJvdyBFcnJvcihVKDE2NikpO2lmKG49QW8oWmEuY3VycmVudCksQW8oRnIuY3VycmVudCksbGModCkpe2lmKHI9dC5zdGF0ZU5vZGUsbj10Lm1lbW9pemVkUHJvcHMscltNcl09dCwobz1yLm5vZGVWYWx1ZSE9PW4pJiYoZT1MbixlIT09bnVsbCkpc3dpdGNoKGUudGFnKXtjYXNlIDM6b2Moci5ub2RlVmFsdWUsbiwoZS5tb2RlJjEpIT09MCk7YnJlYWs7Y2FzZSA1OmUubWVtb2l6ZWRQcm9wcy5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmchPT0hMCYmb2Moci5ub2RlVmFsdWUsbiwoZS5tb2RlJjEpIT09MCl9byYmKHQuZmxhZ3N8PTQpfWVsc2Ugcj0obi5ub2RlVHlwZT09PTk/bjpuLm93bmVyRG9jdW1lbnQpLmNyZWF0ZVRleHROb2RlKHIpLHJbTXJdPXQsdC5zdGF0ZU5vZGU9cn1yZXR1cm4gWHQodCksbnVsbDtjYXNlIDEzOmlmKGl0KGR0KSxyPXQubWVtb2l6ZWRTdGF0ZSxlPT09bnVsbHx8ZS5tZW1vaXplZFN0YXRlIT09bnVsbCYmZS5tZW1vaXplZFN0YXRlLmRlaHlkcmF0ZWQhPT1udWxsKXtpZihvdCYmSW4hPT1udWxsJiZ0Lm1vZGUmMSYmISh0LmZsYWdzJjEyOCkpRDEoKSxucygpLHQuZmxhZ3N8PTk4NTYwLG89ITE7ZWxzZSBpZihvPWxjKHQpLHIhPT1udWxsJiZyLmRlaHlkcmF0ZWQhPT1udWxsKXtpZihlPT09bnVsbCl7aWYoIW8pdGhyb3cgRXJyb3IoVSgzMTgpKTtpZihvPXQubWVtb2l6ZWRTdGF0ZSxvPW8hPT1udWxsP28uZGVoeWRyYXRlZDpudWxsLCFvKXRocm93IEVycm9yKFUoMzE3KSk7b1tNcl09dH1lbHNlIG5zKCksISh0LmZsYWdzJjEyOCkmJih0Lm1lbW9pemVkU3RhdGU9bnVsbCksdC5mbGFnc3w9NDtYdCh0KSxvPSExfWVsc2UgeXIhPT1udWxsJiYoV3AoeXIpLHlyPW51bGwpLG89ITA7aWYoIW8pcmV0dXJuIHQuZmxhZ3MmNjU1MzY/dDpudWxsfXJldHVybiB0LmZsYWdzJjEyOD8odC5sYW5lcz1uLHQpOihyPXIhPT1udWxsLHIhPT0oZSE9PW51bGwmJmUubWVtb2l6ZWRTdGF0ZSE9PW51bGwpJiZyJiYodC5jaGlsZC5mbGFnc3w9ODE5Mix0Lm1vZGUmMSYmKGU9PT1udWxsfHxkdC5jdXJyZW50JjE/UHQ9PT0wJiYoUHQ9Myk6emcoKSkpLHQudXBkYXRlUXVldWUhPT1udWxsJiYodC5mbGFnc3w9NCksWHQodCksbnVsbCk7Y2FzZSA0OnJldHVybiBpcygpLERwKGUsdCksZT09PW51bGwmJldhKHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLFh0KHQpLG51bGw7Y2FzZSAxMDpyZXR1cm4gU2codC50eXBlLl9jb250ZXh0KSxYdCh0KSxudWxsO2Nhc2UgMTc6cmV0dXJuIFRuKHQudHlwZSkmJmlkKCksWHQodCksbnVsbDtjYXNlIDE5OmlmKGl0KGR0KSxvPXQubWVtb2l6ZWRTdGF0ZSxvPT09bnVsbClyZXR1cm4gWHQodCksbnVsbDtpZihyPSh0LmZsYWdzJjEyOCkhPT0wLGw9by5yZW5kZXJpbmcsbD09PW51bGwpaWYocilIcyhvLCExKTtlbHNle2lmKFB0IT09MHx8ZSE9PW51bGwmJmUuZmxhZ3MmMTI4KWZvcihlPXQuY2hpbGQ7ZSE9PW51bGw7KXtpZihsPWRkKGUpLGwhPT1udWxsKXtmb3IodC5mbGFnc3w9MTI4LEhzKG8sITEpLHI9bC51cGRhdGVRdWV1ZSxyIT09bnVsbCYmKHQudXBkYXRlUXVldWU9cix0LmZsYWdzfD00KSx0LnN1YnRyZWVGbGFncz0wLHI9bixuPXQuY2hpbGQ7biE9PW51bGw7KW89bixlPXIsby5mbGFncyY9MTQ2ODAwNjYsbD1vLmFsdGVybmF0ZSxsPT09bnVsbD8oby5jaGlsZExhbmVzPTAsby5sYW5lcz1lLG8uY2hpbGQ9bnVsbCxvLnN1YnRyZWVGbGFncz0wLG8ubWVtb2l6ZWRQcm9wcz1udWxsLG8ubWVtb2l6ZWRTdGF0ZT1udWxsLG8udXBkYXRlUXVldWU9bnVsbCxvLmRlcGVuZGVuY2llcz1udWxsLG8uc3RhdGVOb2RlPW51bGwpOihvLmNoaWxkTGFuZXM9bC5jaGlsZExhbmVzLG8ubGFuZXM9bC5sYW5lcyxvLmNoaWxkPWwuY2hpbGQsby5zdWJ0cmVlRmxhZ3M9MCxvLmRlbGV0aW9ucz1udWxsLG8ubWVtb2l6ZWRQcm9wcz1sLm1lbW9pemVkUHJvcHMsby5tZW1vaXplZFN0YXRlPWwubWVtb2l6ZWRTdGF0ZSxvLnVwZGF0ZVF1ZXVlPWwudXBkYXRlUXVldWUsby50eXBlPWwudHlwZSxlPWwuZGVwZW5kZW5jaWVzLG8uZGVwZW5kZW5jaWVzPWU9PT1udWxsP251bGw6e2xhbmVzOmUubGFuZXMsZmlyc3RDb250ZXh0OmUuZmlyc3RDb250ZXh0fSksbj1uLnNpYmxpbmc7cmV0dXJuIFhlKGR0LGR0LmN1cnJlbnQmMXwyKSx0LmNoaWxkfWU9ZS5zaWJsaW5nfW8udGFpbCE9PW51bGwmJkN0KCk+bHMmJih0LmZsYWdzfD0xMjgscj0hMCxIcyhvLCExKSx0LmxhbmVzPTQxOTQzMDQpfWVsc2V7aWYoIXIpaWYoZT1kZChsKSxlIT09bnVsbCl7aWYodC5mbGFnc3w9MTI4LHI9ITAsbj1lLnVwZGF0ZVF1ZXVlLG4hPT1udWxsJiYodC51cGRhdGVRdWV1ZT1uLHQuZmxhZ3N8PTQpLEhzKG8sITApLG8udGFpbD09PW51bGwmJm8udGFpbE1vZGU9PT0iaGlkZGVuIiYmIWwuYWx0ZXJuYXRlJiYhb3QpcmV0dXJuIFh0KHQpLG51bGx9ZWxzZSAyKkN0KCktby5yZW5kZXJpbmdTdGFydFRpbWU+bHMmJm4hPT0xMDczNzQxODI0JiYodC5mbGFnc3w9MTI4LHI9ITAsSHMobywhMSksdC5sYW5lcz00MTk0MzA0KTtvLmlzQmFja3dhcmRzPyhsLnNpYmxpbmc9dC5jaGlsZCx0LmNoaWxkPWwpOihuPW8ubGFzdCxuIT09bnVsbD9uLnNpYmxpbmc9bDp0LmNoaWxkPWwsby5sYXN0PWwpfXJldHVybiBvLnRhaWwhPT1udWxsPyh0PW8udGFpbCxvLnJlbmRlcmluZz10LG8udGFpbD10LnNpYmxpbmcsby5yZW5kZXJpbmdTdGFydFRpbWU9Q3QoKSx0LnNpYmxpbmc9bnVsbCxuPWR0LmN1cnJlbnQsWGUoZHQscj9uJjF8MjpuJjEpLHQpOihYdCh0KSxudWxsKTtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIGpnKCkscj10Lm1lbW9pemVkU3RhdGUhPT1udWxsLGUhPT1udWxsJiZlLm1lbW9pemVkU3RhdGUhPT1udWxsIT09ciYmKHQuZmxhZ3N8PTgxOTIpLHImJnQubW9kZSYxP0FuJjEwNzM3NDE4MjQmJihYdCh0KSx0LnN1YnRyZWVGbGFncyY2JiYodC5mbGFnc3w9ODE5MikpOlh0KHQpLG51bGw7Y2FzZSAyNDpyZXR1cm4gbnVsbDtjYXNlIDI1OnJldHVybiBudWxsfXRocm93IEVycm9yKFUoMTU2LHQudGFnKSl9ZnVuY3Rpb24geVQoZSx0KXtzd2l0Y2goeWcodCksdC50YWcpe2Nhc2UgMTpyZXR1cm4gVG4odC50eXBlKSYmaWQoKSxlPXQuZmxhZ3MsZSY2NTUzNj8odC5mbGFncz1lJi02NTUzN3wxMjgsdCk6bnVsbDtjYXNlIDM6cmV0dXJuIGlzKCksaXQoYm4pLGl0KHJuKSxiZygpLGU9dC5mbGFncyxlJjY1NTM2JiYhKGUmMTI4KT8odC5mbGFncz1lJi02NTUzN3wxMjgsdCk6bnVsbDtjYXNlIDU6cmV0dXJuICRnKHQpLG51bGw7Y2FzZSAxMzppZihpdChkdCksZT10Lm1lbW9pemVkU3RhdGUsZSE9PW51bGwmJmUuZGVoeWRyYXRlZCE9PW51bGwpe2lmKHQuYWx0ZXJuYXRlPT09bnVsbCl0aHJvdyBFcnJvcihVKDM0MCkpO25zKCl9cmV0dXJuIGU9dC5mbGFncyxlJjY1NTM2Pyh0LmZsYWdzPWUmLTY1NTM3fDEyOCx0KTpudWxsO2Nhc2UgMTk6cmV0dXJuIGl0KGR0KSxudWxsO2Nhc2UgNDpyZXR1cm4gaXMoKSxudWxsO2Nhc2UgMTA6cmV0dXJuIFNnKHQudHlwZS5fY29udGV4dCksbnVsbDtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIGpnKCksbnVsbDtjYXNlIDI0OnJldHVybiBudWxsO2RlZmF1bHQ6cmV0dXJuIG51bGx9fXZhciB1Yz0hMSxKdD0hMSx4VD10eXBlb2YgV2Vha1NldD09ImZ1bmN0aW9uIj9XZWFrU2V0OlNldCxlZT1udWxsO2Z1bmN0aW9uIElsKGUsdCl7dmFyIG49ZS5yZWY7aWYobiE9PW51bGwpaWYodHlwZW9mIG49PSJmdW5jdGlvbiIpdHJ5e24obnVsbCl9Y2F0Y2gocil7dnQoZSx0LHIpfWVsc2Ugbi5jdXJyZW50PW51bGx9ZnVuY3Rpb24gSXAoZSx0LG4pe3RyeXtuKCl9Y2F0Y2gocil7dnQoZSx0LHIpfX12YXIgbDA9ITE7ZnVuY3Rpb24gX1QoZSx0KXtpZih4cD1lZCxlPVMxKCksZ2coZSkpe2lmKCJzZWxlY3Rpb25TdGFydCJpbiBlKXZhciBuPXtzdGFydDplLnNlbGVjdGlvblN0YXJ0LGVuZDplLnNlbGVjdGlvbkVuZH07ZWxzZSBlOntuPShuPWUub3duZXJEb2N1bWVudCkmJm4uZGVmYXVsdFZpZXd8fHdpbmRvdzt2YXIgcj1uLmdldFNlbGVjdGlvbiYmbi5nZXRTZWxlY3Rpb24oKTtpZihyJiZyLnJhbmdlQ291bnQhPT0wKXtuPXIuYW5jaG9yTm9kZTt2YXIgaT1yLmFuY2hvck9mZnNldCxvPXIuZm9jdXNOb2RlO3I9ci5mb2N1c09mZnNldDt0cnl7bi5ub2RlVHlwZSxvLm5vZGVUeXBlfWNhdGNoe249bnVsbDticmVhayBlfXZhciBsPTAscz0tMSxhPS0xLHU9MCxjPTAsZD1lLGY9bnVsbDt0OmZvcig7Oyl7Zm9yKHZhciBoO2QhPT1ufHxpIT09MCYmZC5ub2RlVHlwZSE9PTN8fChzPWwraSksZCE9PW98fHIhPT0wJiZkLm5vZGVUeXBlIT09M3x8KGE9bCtyKSxkLm5vZGVUeXBlPT09MyYmKGwrPWQubm9kZVZhbHVlLmxlbmd0aCksKGg9ZC5maXJzdENoaWxkKSE9PW51bGw7KWY9ZCxkPWg7Zm9yKDs7KXtpZihkPT09ZSlicmVhayB0O2lmKGY9PT1uJiYrK3U9PT1pJiYocz1sKSxmPT09byYmKytjPT09ciYmKGE9bCksKGg9ZC5uZXh0U2libGluZykhPT1udWxsKWJyZWFrO2Q9ZixmPWQucGFyZW50Tm9kZX1kPWh9bj1zPT09LTF8fGE9PT0tMT9udWxsOntzdGFydDpzLGVuZDphfX1lbHNlIG49bnVsbH1uPW58fHtzdGFydDowLGVuZDowfX1lbHNlIG49bnVsbDtmb3IoX3A9e2ZvY3VzZWRFbGVtOmUsc2VsZWN0aW9uUmFuZ2U6bn0sZWQ9ITEsZWU9dDtlZSE9PW51bGw7KWlmKHQ9ZWUsZT10LmNoaWxkLCh0LnN1YnRyZWVGbGFncyYxMDI4KSE9PTAmJmUhPT1udWxsKWUucmV0dXJuPXQsZWU9ZTtlbHNlIGZvcig7ZWUhPT1udWxsOyl7dD1lZTt0cnl7dmFyIG09dC5hbHRlcm5hdGU7aWYodC5mbGFncyYxMDI0KXN3aXRjaCh0LnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpicmVhaztjYXNlIDE6aWYobSE9PW51bGwpe3ZhciBnPW0ubWVtb2l6ZWRQcm9wcyxTPW0ubWVtb2l6ZWRTdGF0ZSx2PXQuc3RhdGVOb2RlLHk9di5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSh0LmVsZW1lbnRUeXBlPT09dC50eXBlP2c6bXIodC50eXBlLGcpLFMpO3YuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGU9eX1icmVhaztjYXNlIDM6dmFyIF89dC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztfLm5vZGVUeXBlPT09MT9fLnRleHRDb250ZW50PSIiOl8ubm9kZVR5cGU9PT05JiZfLmRvY3VtZW50RWxlbWVudCYmXy5yZW1vdmVDaGlsZChfLmRvY3VtZW50RWxlbWVudCk7YnJlYWs7Y2FzZSA1OmNhc2UgNjpjYXNlIDQ6Y2FzZSAxNzpicmVhaztkZWZhdWx0OnRocm93IEVycm9yKFUoMTYzKSl9fWNhdGNoKHcpe3Z0KHQsdC5yZXR1cm4sdyl9aWYoZT10LnNpYmxpbmcsZSE9PW51bGwpe2UucmV0dXJuPXQucmV0dXJuLGVlPWU7YnJlYWt9ZWU9dC5yZXR1cm59cmV0dXJuIG09bDAsbDA9ITEsbX1mdW5jdGlvbiB5YShlLHQsbil7dmFyIHI9dC51cGRhdGVRdWV1ZTtpZihyPXIhPT1udWxsP3IubGFzdEVmZmVjdDpudWxsLHIhPT1udWxsKXt2YXIgaT1yPXIubmV4dDtkb3tpZigoaS50YWcmZSk9PT1lKXt2YXIgbz1pLmRlc3Ryb3k7aS5kZXN0cm95PXZvaWQgMCxvIT09dm9pZCAwJiZJcCh0LG4sbyl9aT1pLm5leHR9d2hpbGUoaSE9PXIpfX1mdW5jdGlvbiBmZihlLHQpe2lmKHQ9dC51cGRhdGVRdWV1ZSx0PXQhPT1udWxsP3QubGFzdEVmZmVjdDpudWxsLHQhPT1udWxsKXt2YXIgbj10PXQubmV4dDtkb3tpZigobi50YWcmZSk9PT1lKXt2YXIgcj1uLmNyZWF0ZTtuLmRlc3Ryb3k9cigpfW49bi5uZXh0fXdoaWxlKG4hPT10KX19ZnVuY3Rpb24gTHAoZSl7dmFyIHQ9ZS5yZWY7aWYodCE9PW51bGwpe3ZhciBuPWUuc3RhdGVOb2RlO3N3aXRjaChlLnRhZyl7Y2FzZSA1OmU9bjticmVhaztkZWZhdWx0OmU9bn10eXBlb2YgdD09ImZ1bmN0aW9uIj90KGUpOnQuY3VycmVudD1lfX1mdW5jdGlvbiB4dyhlKXt2YXIgdD1lLmFsdGVybmF0ZTt0IT09bnVsbCYmKGUuYWx0ZXJuYXRlPW51bGwseHcodCkpLGUuY2hpbGQ9bnVsbCxlLmRlbGV0aW9ucz1udWxsLGUuc2libGluZz1udWxsLGUudGFnPT09NSYmKHQ9ZS5zdGF0ZU5vZGUsdCE9PW51bGwmJihkZWxldGUgdFtNcl0sZGVsZXRlIHRbSGFdLGRlbGV0ZSB0W0VwXSxkZWxldGUgdFtuVF0sZGVsZXRlIHRbclRdKSksZS5zdGF0ZU5vZGU9bnVsbCxlLnJldHVybj1udWxsLGUuZGVwZW5kZW5jaWVzPW51bGwsZS5tZW1vaXplZFByb3BzPW51bGwsZS5tZW1vaXplZFN0YXRlPW51bGwsZS5wZW5kaW5nUHJvcHM9bnVsbCxlLnN0YXRlTm9kZT1udWxsLGUudXBkYXRlUXVldWU9bnVsbH1mdW5jdGlvbiBfdyhlKXtyZXR1cm4gZS50YWc9PT01fHxlLnRhZz09PTN8fGUudGFnPT09NH1mdW5jdGlvbiBzMChlKXtlOmZvcig7Oyl7Zm9yKDtlLnNpYmxpbmc9PT1udWxsOyl7aWYoZS5yZXR1cm49PT1udWxsfHxfdyhlLnJldHVybikpcmV0dXJuIG51bGw7ZT1lLnJldHVybn1mb3IoZS5zaWJsaW5nLnJldHVybj1lLnJldHVybixlPWUuc2libGluZztlLnRhZyE9PTUmJmUudGFnIT09NiYmZS50YWchPT0xODspe2lmKGUuZmxhZ3MmMnx8ZS5jaGlsZD09PW51bGx8fGUudGFnPT09NCljb250aW51ZSBlO2UuY2hpbGQucmV0dXJuPWUsZT1lLmNoaWxkfWlmKCEoZS5mbGFncyYyKSlyZXR1cm4gZS5zdGF0ZU5vZGV9fWZ1bmN0aW9uIGpwKGUsdCxuKXt2YXIgcj1lLnRhZztpZihyPT09NXx8cj09PTYpZT1lLnN0YXRlTm9kZSx0P24ubm9kZVR5cGU9PT04P24ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0KTpuLmluc2VydEJlZm9yZShlLHQpOihuLm5vZGVUeXBlPT09OD8odD1uLnBhcmVudE5vZGUsdC5pbnNlcnRCZWZvcmUoZSxuKSk6KHQ9bix0LmFwcGVuZENoaWxkKGUpKSxuPW4uX3JlYWN0Um9vdENvbnRhaW5lcixuIT1udWxsfHx0Lm9uY2xpY2shPT1udWxsfHwodC5vbmNsaWNrPXJkKSk7ZWxzZSBpZihyIT09NCYmKGU9ZS5jaGlsZCxlIT09bnVsbCkpZm9yKGpwKGUsdCxuKSxlPWUuc2libGluZztlIT09bnVsbDspanAoZSx0LG4pLGU9ZS5zaWJsaW5nfWZ1bmN0aW9uIHpwKGUsdCxuKXt2YXIgcj1lLnRhZztpZihyPT09NXx8cj09PTYpZT1lLnN0YXRlTm9kZSx0P24uaW5zZXJ0QmVmb3JlKGUsdCk6bi5hcHBlbmRDaGlsZChlKTtlbHNlIGlmKHIhPT00JiYoZT1lLmNoaWxkLGUhPT1udWxsKSlmb3IoenAoZSx0LG4pLGU9ZS5zaWJsaW5nO2UhPT1udWxsOyl6cChlLHQsbiksZT1lLnNpYmxpbmd9dmFyIEh0PW51bGwsZ3I9ITE7ZnVuY3Rpb24gJGkoZSx0LG4pe2ZvcihuPW4uY2hpbGQ7biE9PW51bGw7KXd3KGUsdCxuKSxuPW4uc2libGluZ31mdW5jdGlvbiB3dyhlLHQsbil7aWYoenImJnR5cGVvZiB6ci5vbkNvbW1pdEZpYmVyVW5tb3VudD09ImZ1bmN0aW9uIil0cnl7enIub25Db21taXRGaWJlclVubW91bnQocmYsbil9Y2F0Y2h7fXN3aXRjaChuLnRhZyl7Y2FzZSA1Okp0fHxJbChuLHQpO2Nhc2UgNjp2YXIgcj1IdCxpPWdyO0h0PW51bGwsJGkoZSx0LG4pLEh0PXIsZ3I9aSxIdCE9PW51bGwmJihncj8oZT1IdCxuPW4uc3RhdGVOb2RlLGUubm9kZVR5cGU9PT04P2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKTplLnJlbW92ZUNoaWxkKG4pKTpIdC5yZW1vdmVDaGlsZChuLnN0YXRlTm9kZSkpO2JyZWFrO2Nhc2UgMTg6SHQhPT1udWxsJiYoZ3I/KGU9SHQsbj1uLnN0YXRlTm9kZSxlLm5vZGVUeXBlPT09OD94aChlLnBhcmVudE5vZGUsbik6ZS5ub2RlVHlwZT09PTEmJnhoKGUsbiksRmEoZSkpOnhoKEh0LG4uc3RhdGVOb2RlKSk7YnJlYWs7Y2FzZSA0OnI9SHQsaT1ncixIdD1uLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLGdyPSEwLCRpKGUsdCxuKSxIdD1yLGdyPWk7YnJlYWs7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmlmKCFKdCYmKHI9bi51cGRhdGVRdWV1ZSxyIT09bnVsbCYmKHI9ci5sYXN0RWZmZWN0LHIhPT1udWxsKSkpe2k9cj1yLm5leHQ7ZG97dmFyIG89aSxsPW8uZGVzdHJveTtvPW8udGFnLGwhPT12b2lkIDAmJihvJjJ8fG8mNCkmJklwKG4sdCxsKSxpPWkubmV4dH13aGlsZShpIT09cil9JGkoZSx0LG4pO2JyZWFrO2Nhc2UgMTppZighSnQmJihJbChuLHQpLHI9bi5zdGF0ZU5vZGUsdHlwZW9mIHIuY29tcG9uZW50V2lsbFVubW91bnQ9PSJmdW5jdGlvbiIpKXRyeXtyLnByb3BzPW4ubWVtb2l6ZWRQcm9wcyxyLnN0YXRlPW4ubWVtb2l6ZWRTdGF0ZSxyLmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2gocyl7dnQobix0LHMpfSRpKGUsdCxuKTticmVhaztjYXNlIDIxOiRpKGUsdCxuKTticmVhaztjYXNlIDIyOm4ubW9kZSYxPyhKdD0ocj1KdCl8fG4ubWVtb2l6ZWRTdGF0ZSE9PW51bGwsJGkoZSx0LG4pLEp0PXIpOiRpKGUsdCxuKTticmVhaztkZWZhdWx0OiRpKGUsdCxuKX19ZnVuY3Rpb24gYTAoZSl7dmFyIHQ9ZS51cGRhdGVRdWV1ZTtpZih0IT09bnVsbCl7ZS51cGRhdGVRdWV1ZT1udWxsO3ZhciBuPWUuc3RhdGVOb2RlO249PT1udWxsJiYobj1lLnN0YXRlTm9kZT1uZXcgeFQpLHQuZm9yRWFjaChmdW5jdGlvbihyKXt2YXIgaT1OVC5iaW5kKG51bGwsZSxyKTtuLmhhcyhyKXx8KG4uYWRkKHIpLHIudGhlbihpLGkpKX0pfX1mdW5jdGlvbiBkcihlLHQpe3ZhciBuPXQuZGVsZXRpb25zO2lmKG4hPT1udWxsKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgaT1uW3JdO3RyeXt2YXIgbz1lLGw9dCxzPWw7ZTpmb3IoO3MhPT1udWxsOyl7c3dpdGNoKHMudGFnKXtjYXNlIDU6SHQ9cy5zdGF0ZU5vZGUsZ3I9ITE7YnJlYWsgZTtjYXNlIDM6SHQ9cy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxncj0hMDticmVhayBlO2Nhc2UgNDpIdD1zLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLGdyPSEwO2JyZWFrIGV9cz1zLnJldHVybn1pZihIdD09PW51bGwpdGhyb3cgRXJyb3IoVSgxNjApKTt3dyhvLGwsaSksSHQ9bnVsbCxncj0hMTt2YXIgYT1pLmFsdGVybmF0ZTthIT09bnVsbCYmKGEucmV0dXJuPW51bGwpLGkucmV0dXJuPW51bGx9Y2F0Y2godSl7dnQoaSx0LHUpfX1pZih0LnN1YnRyZWVGbGFncyYxMjg1NClmb3IodD10LmNoaWxkO3QhPT1udWxsOylTdyh0LGUpLHQ9dC5zaWJsaW5nfWZ1bmN0aW9uIFN3KGUsdCl7dmFyIG49ZS5hbHRlcm5hdGUscj1lLmZsYWdzO3N3aXRjaChlLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmlmKGRyKHQsZSksT3IoZSksciY0KXt0cnl7eWEoMyxlLGUucmV0dXJuKSxmZigzLGUpfWNhdGNoKGcpe3Z0KGUsZS5yZXR1cm4sZyl9dHJ5e3lhKDUsZSxlLnJldHVybil9Y2F0Y2goZyl7dnQoZSxlLnJldHVybixnKX19YnJlYWs7Y2FzZSAxOmRyKHQsZSksT3IoZSksciY1MTImJm4hPT1udWxsJiZJbChuLG4ucmV0dXJuKTticmVhaztjYXNlIDU6aWYoZHIodCxlKSxPcihlKSxyJjUxMiYmbiE9PW51bGwmJklsKG4sbi5yZXR1cm4pLGUuZmxhZ3MmMzIpe3ZhciBpPWUuc3RhdGVOb2RlO3RyeXtJYShpLCIiKX1jYXRjaChnKXt2dChlLGUucmV0dXJuLGcpfX1pZihyJjQmJihpPWUuc3RhdGVOb2RlLGkhPW51bGwpKXt2YXIgbz1lLm1lbW9pemVkUHJvcHMsbD1uIT09bnVsbD9uLm1lbW9pemVkUHJvcHM6byxzPWUudHlwZSxhPWUudXBkYXRlUXVldWU7aWYoZS51cGRhdGVRdWV1ZT1udWxsLGEhPT1udWxsKXRyeXtzPT09ImlucHV0IiYmby50eXBlPT09InJhZGlvIiYmby5uYW1lIT1udWxsJiZXXyhpLG8pLHVwKHMsbCk7dmFyIHU9dXAocyxvKTtmb3IobD0wO2w8YS5sZW5ndGg7bCs9Mil7dmFyIGM9YVtsXSxkPWFbbCsxXTtjPT09InN0eWxlIj9HXyhpLGQpOmM9PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiP0tfKGksZCk6Yz09PSJjaGlsZHJlbiI/SWEoaSxkKTpyZyhpLGMsZCx1KX1zd2l0Y2gocyl7Y2FzZSJpbnB1dCI6aXAoaSxvKTticmVhaztjYXNlInRleHRhcmVhIjpWXyhpLG8pO2JyZWFrO2Nhc2Uic2VsZWN0Ijp2YXIgZj1pLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU7aS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlPSEhby5tdWx0aXBsZTt2YXIgaD1vLnZhbHVlO2ghPW51bGw/VWwoaSwhIW8ubXVsdGlwbGUsaCwhMSk6ZiE9PSEhby5tdWx0aXBsZSYmKG8uZGVmYXVsdFZhbHVlIT1udWxsP1VsKGksISFvLm11bHRpcGxlLG8uZGVmYXVsdFZhbHVlLCEwKTpVbChpLCEhby5tdWx0aXBsZSxvLm11bHRpcGxlP1tdOiIiLCExKSl9aVtIYV09b31jYXRjaChnKXt2dChlLGUucmV0dXJuLGcpfX1icmVhaztjYXNlIDY6aWYoZHIodCxlKSxPcihlKSxyJjQpe2lmKGUuc3RhdGVOb2RlPT09bnVsbCl0aHJvdyBFcnJvcihVKDE2MikpO2k9ZS5zdGF0ZU5vZGUsbz1lLm1lbW9pemVkUHJvcHM7dHJ5e2kubm9kZVZhbHVlPW99Y2F0Y2goZyl7dnQoZSxlLnJldHVybixnKX19YnJlYWs7Y2FzZSAzOmlmKGRyKHQsZSksT3IoZSksciY0JiZuIT09bnVsbCYmbi5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl0cnl7RmEodC5jb250YWluZXJJbmZvKX1jYXRjaChnKXt2dChlLGUucmV0dXJuLGcpfWJyZWFrO2Nhc2UgNDpkcih0LGUpLE9yKGUpO2JyZWFrO2Nhc2UgMTM6ZHIodCxlKSxPcihlKSxpPWUuY2hpbGQsaS5mbGFncyY4MTkyJiYobz1pLm1lbW9pemVkU3RhdGUhPT1udWxsLGkuc3RhdGVOb2RlLmlzSGlkZGVuPW8sIW98fGkuYWx0ZXJuYXRlIT09bnVsbCYmaS5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZSE9PW51bGx8fChJZz1DdCgpKSksciY0JiZhMChlKTticmVhaztjYXNlIDIyOmlmKGM9biE9PW51bGwmJm4ubWVtb2l6ZWRTdGF0ZSE9PW51bGwsZS5tb2RlJjE/KEp0PSh1PUp0KXx8Yyxkcih0LGUpLEp0PXUpOmRyKHQsZSksT3IoZSksciY4MTkyKXtpZih1PWUubWVtb2l6ZWRTdGF0ZSE9PW51bGwsKGUuc3RhdGVOb2RlLmlzSGlkZGVuPXUpJiYhYyYmZS5tb2RlJjEpZm9yKGVlPWUsYz1lLmNoaWxkO2MhPT1udWxsOyl7Zm9yKGQ9ZWU9YztlZSE9PW51bGw7KXtzd2l0Y2goZj1lZSxoPWYuY2hpbGQsZi50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTp5YSg0LGYsZi5yZXR1cm4pO2JyZWFrO2Nhc2UgMTpJbChmLGYucmV0dXJuKTt2YXIgbT1mLnN0YXRlTm9kZTtpZih0eXBlb2YgbS5jb21wb25lbnRXaWxsVW5tb3VudD09ImZ1bmN0aW9uIil7cj1mLG49Zi5yZXR1cm47dHJ5e3Q9cixtLnByb3BzPXQubWVtb2l6ZWRQcm9wcyxtLnN0YXRlPXQubWVtb2l6ZWRTdGF0ZSxtLmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2goZyl7dnQocixuLGcpfX1icmVhaztjYXNlIDU6SWwoZixmLnJldHVybik7YnJlYWs7Y2FzZSAyMjppZihmLm1lbW9pemVkU3RhdGUhPT1udWxsKXtjMChkKTtjb250aW51ZX19aCE9PW51bGw/KGgucmV0dXJuPWYsZWU9aCk6YzAoZCl9Yz1jLnNpYmxpbmd9ZTpmb3IoYz1udWxsLGQ9ZTs7KXtpZihkLnRhZz09PTUpe2lmKGM9PT1udWxsKXtjPWQ7dHJ5e2k9ZC5zdGF0ZU5vZGUsdT8obz1pLnN0eWxlLHR5cGVvZiBvLnNldFByb3BlcnR5PT0iZnVuY3Rpb24iP28uc2V0UHJvcGVydHkoImRpc3BsYXkiLCJub25lIiwiaW1wb3J0YW50Iik6by5kaXNwbGF5PSJub25lIik6KHM9ZC5zdGF0ZU5vZGUsYT1kLm1lbW9pemVkUHJvcHMuc3R5bGUsbD1hIT1udWxsJiZhLmhhc093blByb3BlcnR5KCJkaXNwbGF5Iik/YS5kaXNwbGF5Om51bGwscy5zdHlsZS5kaXNwbGF5PVpfKCJkaXNwbGF5IixsKSl9Y2F0Y2goZyl7dnQoZSxlLnJldHVybixnKX19fWVsc2UgaWYoZC50YWc9PT02KXtpZihjPT09bnVsbCl0cnl7ZC5zdGF0ZU5vZGUubm9kZVZhbHVlPXU/IiI6ZC5tZW1vaXplZFByb3BzfWNhdGNoKGcpe3Z0KGUsZS5yZXR1cm4sZyl9fWVsc2UgaWYoKGQudGFnIT09MjImJmQudGFnIT09MjN8fGQubWVtb2l6ZWRTdGF0ZT09PW51bGx8fGQ9PT1lKSYmZC5jaGlsZCE9PW51bGwpe2QuY2hpbGQucmV0dXJuPWQsZD1kLmNoaWxkO2NvbnRpbnVlfWlmKGQ9PT1lKWJyZWFrIGU7Zm9yKDtkLnNpYmxpbmc9PT1udWxsOyl7aWYoZC5yZXR1cm49PT1udWxsfHxkLnJldHVybj09PWUpYnJlYWsgZTtjPT09ZCYmKGM9bnVsbCksZD1kLnJldHVybn1jPT09ZCYmKGM9bnVsbCksZC5zaWJsaW5nLnJldHVybj1kLnJldHVybixkPWQuc2libGluZ319YnJlYWs7Y2FzZSAxOTpkcih0LGUpLE9yKGUpLHImNCYmYTAoZSk7YnJlYWs7Y2FzZSAyMTpicmVhaztkZWZhdWx0OmRyKHQsZSksT3IoZSl9fWZ1bmN0aW9uIE9yKGUpe3ZhciB0PWUuZmxhZ3M7aWYodCYyKXt0cnl7ZTp7Zm9yKHZhciBuPWUucmV0dXJuO24hPT1udWxsOyl7aWYoX3cobikpe3ZhciByPW47YnJlYWsgZX1uPW4ucmV0dXJufXRocm93IEVycm9yKFUoMTYwKSl9c3dpdGNoKHIudGFnKXtjYXNlIDU6dmFyIGk9ci5zdGF0ZU5vZGU7ci5mbGFncyYzMiYmKElhKGksIiIpLHIuZmxhZ3MmPS0zMyk7dmFyIG89czAoZSk7enAoZSxvLGkpO2JyZWFrO2Nhc2UgMzpjYXNlIDQ6dmFyIGw9ci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxzPXMwKGUpO2pwKGUscyxsKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKFUoMTYxKSl9fWNhdGNoKGEpe3Z0KGUsZS5yZXR1cm4sYSl9ZS5mbGFncyY9LTN9dCY0MDk2JiYoZS5mbGFncyY9LTQwOTcpfWZ1bmN0aW9uIHdUKGUsdCxuKXtlZT1lLEV3KGUpfWZ1bmN0aW9uIEV3KGUsdCxuKXtmb3IodmFyIHI9KGUubW9kZSYxKSE9PTA7ZWUhPT1udWxsOyl7dmFyIGk9ZWUsbz1pLmNoaWxkO2lmKGkudGFnPT09MjImJnIpe3ZhciBsPWkubWVtb2l6ZWRTdGF0ZSE9PW51bGx8fHVjO2lmKCFsKXt2YXIgcz1pLmFsdGVybmF0ZSxhPXMhPT1udWxsJiZzLm1lbW9pemVkU3RhdGUhPT1udWxsfHxKdDtzPXVjO3ZhciB1PUp0O2lmKHVjPWwsKEp0PWEpJiYhdSlmb3IoZWU9aTtlZSE9PW51bGw7KWw9ZWUsYT1sLmNoaWxkLGwudGFnPT09MjImJmwubWVtb2l6ZWRTdGF0ZSE9PW51bGw/ZDAoaSk6YSE9PW51bGw/KGEucmV0dXJuPWwsZWU9YSk6ZDAoaSk7Zm9yKDtvIT09bnVsbDspZWU9byxFdyhvKSxvPW8uc2libGluZztlZT1pLHVjPXMsSnQ9dX11MChlKX1lbHNlIGkuc3VidHJlZUZsYWdzJjg3NzImJm8hPT1udWxsPyhvLnJldHVybj1pLGVlPW8pOnUwKGUpfX1mdW5jdGlvbiB1MChlKXtmb3IoO2VlIT09bnVsbDspe3ZhciB0PWVlO2lmKHQuZmxhZ3MmODc3Mil7dmFyIG49dC5hbHRlcm5hdGU7dHJ5e2lmKHQuZmxhZ3MmODc3Milzd2l0Y2godC50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6SnR8fGZmKDUsdCk7YnJlYWs7Y2FzZSAxOnZhciByPXQuc3RhdGVOb2RlO2lmKHQuZmxhZ3MmNCYmIUp0KWlmKG49PT1udWxsKXIuY29tcG9uZW50RGlkTW91bnQoKTtlbHNle3ZhciBpPXQuZWxlbWVudFR5cGU9PT10LnR5cGU/bi5tZW1vaXplZFByb3BzOm1yKHQudHlwZSxuLm1lbW9pemVkUHJvcHMpO3IuY29tcG9uZW50RGlkVXBkYXRlKGksbi5tZW1vaXplZFN0YXRlLHIuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUpfXZhciBvPXQudXBkYXRlUXVldWU7byE9PW51bGwmJkt5KHQsbyxyKTticmVhaztjYXNlIDM6dmFyIGw9dC51cGRhdGVRdWV1ZTtpZihsIT09bnVsbCl7aWYobj1udWxsLHQuY2hpbGQhPT1udWxsKXN3aXRjaCh0LmNoaWxkLnRhZyl7Y2FzZSA1Om49dC5jaGlsZC5zdGF0ZU5vZGU7YnJlYWs7Y2FzZSAxOm49dC5jaGlsZC5zdGF0ZU5vZGV9S3kodCxsLG4pfWJyZWFrO2Nhc2UgNTp2YXIgcz10LnN0YXRlTm9kZTtpZihuPT09bnVsbCYmdC5mbGFncyY0KXtuPXM7dmFyIGE9dC5tZW1vaXplZFByb3BzO3N3aXRjaCh0LnR5cGUpe2Nhc2UiYnV0dG9uIjpjYXNlImlucHV0IjpjYXNlInNlbGVjdCI6Y2FzZSJ0ZXh0YXJlYSI6YS5hdXRvRm9jdXMmJm4uZm9jdXMoKTticmVhaztjYXNlImltZyI6YS5zcmMmJihuLnNyYz1hLnNyYyl9fWJyZWFrO2Nhc2UgNjpicmVhaztjYXNlIDQ6YnJlYWs7Y2FzZSAxMjpicmVhaztjYXNlIDEzOmlmKHQubWVtb2l6ZWRTdGF0ZT09PW51bGwpe3ZhciB1PXQuYWx0ZXJuYXRlO2lmKHUhPT1udWxsKXt2YXIgYz11Lm1lbW9pemVkU3RhdGU7aWYoYyE9PW51bGwpe3ZhciBkPWMuZGVoeWRyYXRlZDtkIT09bnVsbCYmRmEoZCl9fX1icmVhaztjYXNlIDE5OmNhc2UgMTc6Y2FzZSAyMTpjYXNlIDIyOmNhc2UgMjM6Y2FzZSAyNTpicmVhaztkZWZhdWx0OnRocm93IEVycm9yKFUoMTYzKSl9SnR8fHQuZmxhZ3MmNTEyJiZMcCh0KX1jYXRjaChmKXt2dCh0LHQucmV0dXJuLGYpfX1pZih0PT09ZSl7ZWU9bnVsbDticmVha31pZihuPXQuc2libGluZyxuIT09bnVsbCl7bi5yZXR1cm49dC5yZXR1cm4sZWU9bjticmVha31lZT10LnJldHVybn19ZnVuY3Rpb24gYzAoZSl7Zm9yKDtlZSE9PW51bGw7KXt2YXIgdD1lZTtpZih0PT09ZSl7ZWU9bnVsbDticmVha312YXIgbj10LnNpYmxpbmc7aWYobiE9PW51bGwpe24ucmV0dXJuPXQucmV0dXJuLGVlPW47YnJlYWt9ZWU9dC5yZXR1cm59fWZ1bmN0aW9uIGQwKGUpe2Zvcig7ZWUhPT1udWxsOyl7dmFyIHQ9ZWU7dHJ5e3N3aXRjaCh0LnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTp2YXIgbj10LnJldHVybjt0cnl7ZmYoNCx0KX1jYXRjaChhKXt2dCh0LG4sYSl9YnJlYWs7Y2FzZSAxOnZhciByPXQuc3RhdGVOb2RlO2lmKHR5cGVvZiByLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iKXt2YXIgaT10LnJldHVybjt0cnl7ci5jb21wb25lbnREaWRNb3VudCgpfWNhdGNoKGEpe3Z0KHQsaSxhKX19dmFyIG89dC5yZXR1cm47dHJ5e0xwKHQpfWNhdGNoKGEpe3Z0KHQsbyxhKX1icmVhaztjYXNlIDU6dmFyIGw9dC5yZXR1cm47dHJ5e0xwKHQpfWNhdGNoKGEpe3Z0KHQsbCxhKX19fWNhdGNoKGEpe3Z0KHQsdC5yZXR1cm4sYSl9aWYodD09PWUpe2VlPW51bGw7YnJlYWt9dmFyIHM9dC5zaWJsaW5nO2lmKHMhPT1udWxsKXtzLnJldHVybj10LnJldHVybixlZT1zO2JyZWFrfWVlPXQucmV0dXJufX12YXIgU1Q9TWF0aC5jZWlsLHBkPXhpLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsTWc9eGkuUmVhY3RDdXJyZW50T3duZXIsbnI9eGkuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsTWU9MCxCdD1udWxsLCR0PW51bGwsWnQ9MCxBbj0wLExsPWdvKDApLFB0PTAsUWE9bnVsbCxLbz0wLGhmPTAsRGc9MCx4YT1udWxsLGtuPW51bGwsSWc9MCxscz0xLzAsdGk9bnVsbCxtZD0hMSxGcD1udWxsLFlpPW51bGwsY2M9ITEsQmk9bnVsbCxnZD0wLF9hPTAsQnA9bnVsbCxMYz0tMSxqYz0wO2Z1bmN0aW9uIHZuKCl7cmV0dXJuIE1lJjY/Q3QoKTpMYyE9PS0xP0xjOkxjPUN0KCl9ZnVuY3Rpb24gWGkoZSl7cmV0dXJuIGUubW9kZSYxP01lJjImJlp0IT09MD9adCYtWnQ6b1QudHJhbnNpdGlvbiE9PW51bGw/KGpjPT09MCYmKGpjPWwxKCkpLGpjKTooZT1VZSxlIT09MHx8KGU9d2luZG93LmV2ZW50LGU9ZT09PXZvaWQgMD8xNjpoMShlLnR5cGUpKSxlKToxfWZ1bmN0aW9uIFNyKGUsdCxuLHIpe2lmKDUwPF9hKXRocm93IF9hPTAsQnA9bnVsbCxFcnJvcihVKDE4NSkpO1R1KGUsbixyKSwoIShNZSYyKXx8ZSE9PUJ0KSYmKGU9PT1CdCYmKCEoTWUmMikmJihoZnw9biksUHQ9PT00JiZMaShlLFp0KSksTm4oZSxyKSxuPT09MSYmTWU9PT0wJiYhKHQubW9kZSYxKSYmKGxzPUN0KCkrNTAwLHVmJiZ2bygpKSl9ZnVuY3Rpb24gTm4oZSx0KXt2YXIgbj1lLmNhbGxiYWNrTm9kZTtvYihlLHQpO3ZhciByPXFjKGUsZT09PUJ0P1p0OjApO2lmKHI9PT0wKW4hPT1udWxsJiZfeShuKSxlLmNhbGxiYWNrTm9kZT1udWxsLGUuY2FsbGJhY2tQcmlvcml0eT0wO2Vsc2UgaWYodD1yJi1yLGUuY2FsbGJhY2tQcmlvcml0eSE9PXQpe2lmKG4hPW51bGwmJl95KG4pLHQ9PT0xKWUudGFnPT09MD9pVChmMC5iaW5kKG51bGwsZSkpOlAxKGYwLmJpbmQobnVsbCxlKSksZVQoZnVuY3Rpb24oKXshKE1lJjYpJiZ2bygpfSksbj1udWxsO2Vsc2V7c3dpdGNoKHMxKHIpKXtjYXNlIDE6bj1hZzticmVhaztjYXNlIDQ6bj1pMTticmVhaztjYXNlIDE2Om49SmM7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6bj1vMTticmVhaztkZWZhdWx0Om49SmN9bj1PdyhuLEN3LmJpbmQobnVsbCxlKSl9ZS5jYWxsYmFja1ByaW9yaXR5PXQsZS5jYWxsYmFja05vZGU9bn19ZnVuY3Rpb24gQ3coZSx0KXtpZihMYz0tMSxqYz0wLE1lJjYpdGhyb3cgRXJyb3IoVSgzMjcpKTt2YXIgbj1lLmNhbGxiYWNrTm9kZTtpZihabCgpJiZlLmNhbGxiYWNrTm9kZSE9PW4pcmV0dXJuIG51bGw7dmFyIHI9cWMoZSxlPT09QnQ/WnQ6MCk7aWYocj09PTApcmV0dXJuIG51bGw7aWYociYzMHx8ciZlLmV4cGlyZWRMYW5lc3x8dCl0PXZkKGUscik7ZWxzZXt0PXI7dmFyIGk9TWU7TWV8PTI7dmFyIG89JHcoKTsoQnQhPT1lfHxadCE9PXQpJiYodGk9bnVsbCxscz1DdCgpKzUwMCxJbyhlLHQpKTtkbyB0cnl7a1QoKTticmVha31jYXRjaChzKXtrdyhlLHMpfXdoaWxlKCEwKTt3ZygpLHBkLmN1cnJlbnQ9byxNZT1pLCR0IT09bnVsbD90PTA6KEJ0PW51bGwsWnQ9MCx0PVB0KX1pZih0IT09MCl7aWYodD09PTImJihpPXBwKGUpLGkhPT0wJiYocj1pLHQ9VXAoZSxpKSkpLHQ9PT0xKXRocm93IG49UWEsSW8oZSwwKSxMaShlLHIpLE5uKGUsQ3QoKSksbjtpZih0PT09NilMaShlLHIpO2Vsc2V7aWYoaT1lLmN1cnJlbnQuYWx0ZXJuYXRlLCEociYzMCkmJiFFVChpKSYmKHQ9dmQoZSxyKSx0PT09MiYmKG89cHAoZSksbyE9PTAmJihyPW8sdD1VcChlLG8pKSksdD09PTEpKXRocm93IG49UWEsSW8oZSwwKSxMaShlLHIpLE5uKGUsQ3QoKSksbjtzd2l0Y2goZS5maW5pc2hlZFdvcms9aSxlLmZpbmlzaGVkTGFuZXM9cix0KXtjYXNlIDA6Y2FzZSAxOnRocm93IEVycm9yKFUoMzQ1KSk7Y2FzZSAyOlRvKGUsa24sdGkpO2JyZWFrO2Nhc2UgMzppZihMaShlLHIpLChyJjEzMDAyMzQyNCk9PT1yJiYodD1JZys1MDAtQ3QoKSwxMDx0KSl7aWYocWMoZSwwKSE9PTApYnJlYWs7aWYoaT1lLnN1c3BlbmRlZExhbmVzLChpJnIpIT09cil7dm4oKSxlLnBpbmdlZExhbmVzfD1lLnN1c3BlbmRlZExhbmVzJmk7YnJlYWt9ZS50aW1lb3V0SGFuZGxlPVNwKFRvLmJpbmQobnVsbCxlLGtuLHRpKSx0KTticmVha31UbyhlLGtuLHRpKTticmVhaztjYXNlIDQ6aWYoTGkoZSxyKSwociY0MTk0MjQwKT09PXIpYnJlYWs7Zm9yKHQ9ZS5ldmVudFRpbWVzLGk9LTE7MDxyOyl7dmFyIGw9MzEtd3Iocik7bz0xPDxsLGw9dFtsXSxsPmkmJihpPWwpLHImPX5vfWlmKHI9aSxyPUN0KCktcixyPSgxMjA+cj8xMjA6NDgwPnI/NDgwOjEwODA+cj8xMDgwOjE5MjA+cj8xOTIwOjNlMz5yPzNlMzo0MzIwPnI/NDMyMDoxOTYwKlNUKHIvMTk2MCkpLXIsMTA8cil7ZS50aW1lb3V0SGFuZGxlPVNwKFRvLmJpbmQobnVsbCxlLGtuLHRpKSxyKTticmVha31UbyhlLGtuLHRpKTticmVhaztjYXNlIDU6VG8oZSxrbix0aSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihVKDMyOSkpfX19cmV0dXJuIE5uKGUsQ3QoKSksZS5jYWxsYmFja05vZGU9PT1uP0N3LmJpbmQobnVsbCxlKTpudWxsfWZ1bmN0aW9uIFVwKGUsdCl7dmFyIG49eGE7cmV0dXJuIGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCYmKElvKGUsdCkuZmxhZ3N8PTI1NiksZT12ZChlLHQpLGUhPT0yJiYodD1rbixrbj1uLHQhPT1udWxsJiZXcCh0KSksZX1mdW5jdGlvbiBXcChlKXtrbj09PW51bGw/a249ZTprbi5wdXNoLmFwcGx5KGtuLGUpfWZ1bmN0aW9uIEVUKGUpe2Zvcih2YXIgdD1lOzspe2lmKHQuZmxhZ3MmMTYzODQpe3ZhciBuPXQudXBkYXRlUXVldWU7aWYobiE9PW51bGwmJihuPW4uc3RvcmVzLG4hPT1udWxsKSlmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9bltyXSxvPWkuZ2V0U25hcHNob3Q7aT1pLnZhbHVlO3RyeXtpZigha3IobygpLGkpKXJldHVybiExfWNhdGNoe3JldHVybiExfX19aWYobj10LmNoaWxkLHQuc3VidHJlZUZsYWdzJjE2Mzg0JiZuIT09bnVsbCluLnJldHVybj10LHQ9bjtlbHNle2lmKHQ9PT1lKWJyZWFrO2Zvcig7dC5zaWJsaW5nPT09bnVsbDspe2lmKHQucmV0dXJuPT09bnVsbHx8dC5yZXR1cm49PT1lKXJldHVybiEwO3Q9dC5yZXR1cm59dC5zaWJsaW5nLnJldHVybj10LnJldHVybix0PXQuc2libGluZ319cmV0dXJuITB9ZnVuY3Rpb24gTGkoZSx0KXtmb3IodCY9fkRnLHQmPX5oZixlLnN1c3BlbmRlZExhbmVzfD10LGUucGluZ2VkTGFuZXMmPX50LGU9ZS5leHBpcmF0aW9uVGltZXM7MDx0Oyl7dmFyIG49MzEtd3IodCkscj0xPDxuO2Vbbl09LTEsdCY9fnJ9fWZ1bmN0aW9uIGYwKGUpe2lmKE1lJjYpdGhyb3cgRXJyb3IoVSgzMjcpKTtabCgpO3ZhciB0PXFjKGUsMCk7aWYoISh0JjEpKXJldHVybiBObihlLEN0KCkpLG51bGw7dmFyIG49dmQoZSx0KTtpZihlLnRhZyE9PTAmJm49PT0yKXt2YXIgcj1wcChlKTtyIT09MCYmKHQ9cixuPVVwKGUscikpfWlmKG49PT0xKXRocm93IG49UWEsSW8oZSwwKSxMaShlLHQpLE5uKGUsQ3QoKSksbjtpZihuPT09Nil0aHJvdyBFcnJvcihVKDM0NSkpO3JldHVybiBlLmZpbmlzaGVkV29yaz1lLmN1cnJlbnQuYWx0ZXJuYXRlLGUuZmluaXNoZWRMYW5lcz10LFRvKGUsa24sdGkpLE5uKGUsQ3QoKSksbnVsbH1mdW5jdGlvbiBMZyhlLHQpe3ZhciBuPU1lO01lfD0xO3RyeXtyZXR1cm4gZSh0KX1maW5hbGx5e01lPW4sTWU9PT0wJiYobHM9Q3QoKSs1MDAsdWYmJnZvKCkpfX1mdW5jdGlvbiBabyhlKXtCaSE9PW51bGwmJkJpLnRhZz09PTAmJiEoTWUmNikmJlpsKCk7dmFyIHQ9TWU7TWV8PTE7dmFyIG49bnIudHJhbnNpdGlvbixyPVVlO3RyeXtpZihuci50cmFuc2l0aW9uPW51bGwsVWU9MSxlKXJldHVybiBlKCl9ZmluYWxseXtVZT1yLG5yLnRyYW5zaXRpb249bixNZT10LCEoTWUmNikmJnZvKCl9fWZ1bmN0aW9uIGpnKCl7QW49TGwuY3VycmVudCxpdChMbCl9ZnVuY3Rpb24gSW8oZSx0KXtlLmZpbmlzaGVkV29yaz1udWxsLGUuZmluaXNoZWRMYW5lcz0wO3ZhciBuPWUudGltZW91dEhhbmRsZTtpZihuIT09LTEmJihlLnRpbWVvdXRIYW5kbGU9LTEscWIobikpLCR0IT09bnVsbClmb3Iobj0kdC5yZXR1cm47biE9PW51bGw7KXt2YXIgcj1uO3N3aXRjaCh5ZyhyKSxyLnRhZyl7Y2FzZSAxOnI9ci50eXBlLmNoaWxkQ29udGV4dFR5cGVzLHIhPW51bGwmJmlkKCk7YnJlYWs7Y2FzZSAzOmlzKCksaXQoYm4pLGl0KHJuKSxiZygpO2JyZWFrO2Nhc2UgNTokZyhyKTticmVhaztjYXNlIDQ6aXMoKTticmVhaztjYXNlIDEzOml0KGR0KTticmVhaztjYXNlIDE5Oml0KGR0KTticmVhaztjYXNlIDEwOlNnKHIudHlwZS5fY29udGV4dCk7YnJlYWs7Y2FzZSAyMjpjYXNlIDIzOmpnKCl9bj1uLnJldHVybn1pZihCdD1lLCR0PWU9UWkoZS5jdXJyZW50LG51bGwpLFp0PUFuPXQsUHQ9MCxRYT1udWxsLERnPWhmPUtvPTAsa249eGE9bnVsbCxQbyE9PW51bGwpe2Zvcih0PTA7dDxQby5sZW5ndGg7dCsrKWlmKG49UG9bdF0scj1uLmludGVybGVhdmVkLHIhPT1udWxsKXtuLmludGVybGVhdmVkPW51bGw7dmFyIGk9ci5uZXh0LG89bi5wZW5kaW5nO2lmKG8hPT1udWxsKXt2YXIgbD1vLm5leHQ7by5uZXh0PWksci5uZXh0PWx9bi5wZW5kaW5nPXJ9UG89bnVsbH1yZXR1cm4gZX1mdW5jdGlvbiBrdyhlLHQpe2Rve3ZhciBuPSR0O3RyeXtpZih3ZygpLE1jLmN1cnJlbnQ9aGQsZmQpe2Zvcih2YXIgcj1odC5tZW1vaXplZFN0YXRlO3IhPT1udWxsOyl7dmFyIGk9ci5xdWV1ZTtpIT09bnVsbCYmKGkucGVuZGluZz1udWxsKSxyPXIubmV4dH1mZD0hMX1pZihIbz0wLEl0PVJ0PWh0PW51bGwsdmE9ITEsR2E9MCxNZy5jdXJyZW50PW51bGwsbj09PW51bGx8fG4ucmV0dXJuPT09bnVsbCl7UHQ9MSxRYT10LCR0PW51bGw7YnJlYWt9ZTp7dmFyIG89ZSxsPW4ucmV0dXJuLHM9bixhPXQ7aWYodD1adCxzLmZsYWdzfD0zMjc2OCxhIT09bnVsbCYmdHlwZW9mIGE9PSJvYmplY3QiJiZ0eXBlb2YgYS50aGVuPT0iZnVuY3Rpb24iKXt2YXIgdT1hLGM9cyxkPWMudGFnO2lmKCEoYy5tb2RlJjEpJiYoZD09PTB8fGQ9PT0xMXx8ZD09PTE1KSl7dmFyIGY9Yy5hbHRlcm5hdGU7Zj8oYy51cGRhdGVRdWV1ZT1mLnVwZGF0ZVF1ZXVlLGMubWVtb2l6ZWRTdGF0ZT1mLm1lbW9pemVkU3RhdGUsYy5sYW5lcz1mLmxhbmVzKTooYy51cGRhdGVRdWV1ZT1udWxsLGMubWVtb2l6ZWRTdGF0ZT1udWxsKX12YXIgaD1xeShsKTtpZihoIT09bnVsbCl7aC5mbGFncyY9LTI1NyxlMChoLGwscyxvLHQpLGgubW9kZSYxJiZKeShvLHUsdCksdD1oLGE9dTt2YXIgbT10LnVwZGF0ZVF1ZXVlO2lmKG09PT1udWxsKXt2YXIgZz1uZXcgU2V0O2cuYWRkKGEpLHQudXBkYXRlUXVldWU9Z31lbHNlIG0uYWRkKGEpO2JyZWFrIGV9ZWxzZXtpZighKHQmMSkpe0p5KG8sdSx0KSx6ZygpO2JyZWFrIGV9YT1FcnJvcihVKDQyNikpfX1lbHNlIGlmKG90JiZzLm1vZGUmMSl7dmFyIFM9cXkobCk7aWYoUyE9PW51bGwpeyEoUy5mbGFncyY2NTUzNikmJihTLmZsYWdzfD0yNTYpLGUwKFMsbCxzLG8sdCkseGcob3MoYSxzKSk7YnJlYWsgZX19bz1hPW9zKGEscyksUHQhPT00JiYoUHQ9MikseGE9PT1udWxsP3hhPVtvXTp4YS5wdXNoKG8pLG89bDtkb3tzd2l0Y2goby50YWcpe2Nhc2UgMzpvLmZsYWdzfD02NTUzNix0Jj0tdCxvLmxhbmVzfD10O3ZhciB2PWF3KG8sYSx0KTtIeShvLHYpO2JyZWFrIGU7Y2FzZSAxOnM9YTt2YXIgeT1vLnR5cGUsXz1vLnN0YXRlTm9kZTtpZighKG8uZmxhZ3MmMTI4KSYmKHR5cGVvZiB5LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj09ImZ1bmN0aW9uInx8XyE9PW51bGwmJnR5cGVvZiBfLmNvbXBvbmVudERpZENhdGNoPT0iZnVuY3Rpb24iJiYoWWk9PT1udWxsfHwhWWkuaGFzKF8pKSkpe28uZmxhZ3N8PTY1NTM2LHQmPS10LG8ubGFuZXN8PXQ7dmFyIHc9dXcobyxzLHQpO0h5KG8sdyk7YnJlYWsgZX19bz1vLnJldHVybn13aGlsZShvIT09bnVsbCl9VHcobil9Y2F0Y2goRSl7dD1FLCR0PT09biYmbiE9PW51bGwmJigkdD1uPW4ucmV0dXJuKTtjb250aW51ZX1icmVha313aGlsZSghMCl9ZnVuY3Rpb24gJHcoKXt2YXIgZT1wZC5jdXJyZW50O3JldHVybiBwZC5jdXJyZW50PWhkLGU9PT1udWxsP2hkOmV9ZnVuY3Rpb24gemcoKXsoUHQ9PT0wfHxQdD09PTN8fFB0PT09MikmJihQdD00KSxCdD09PW51bGx8fCEoS28mMjY4NDM1NDU1KSYmIShoZiYyNjg0MzU0NTUpfHxMaShCdCxadCl9ZnVuY3Rpb24gdmQoZSx0KXt2YXIgbj1NZTtNZXw9Mjt2YXIgcj0kdygpOyhCdCE9PWV8fFp0IT09dCkmJih0aT1udWxsLElvKGUsdCkpO2RvIHRyeXtDVCgpO2JyZWFrfWNhdGNoKGkpe2t3KGUsaSl9d2hpbGUoITApO2lmKHdnKCksTWU9bixwZC5jdXJyZW50PXIsJHQhPT1udWxsKXRocm93IEVycm9yKFUoMjYxKSk7cmV0dXJuIEJ0PW51bGwsWnQ9MCxQdH1mdW5jdGlvbiBDVCgpe2Zvcig7JHQhPT1udWxsOylidygkdCl9ZnVuY3Rpb24ga1QoKXtmb3IoOyR0IT09bnVsbCYmIVgkKCk7KWJ3KCR0KX1mdW5jdGlvbiBidyhlKXt2YXIgdD1SdyhlLmFsdGVybmF0ZSxlLEFuKTtlLm1lbW9pemVkUHJvcHM9ZS5wZW5kaW5nUHJvcHMsdD09PW51bGw/VHcoZSk6JHQ9dCxNZy5jdXJyZW50PW51bGx9ZnVuY3Rpb24gVHcoZSl7dmFyIHQ9ZTtkb3t2YXIgbj10LmFsdGVybmF0ZTtpZihlPXQucmV0dXJuLHQuZmxhZ3MmMzI3Njgpe2lmKG49eVQobix0KSxuIT09bnVsbCl7bi5mbGFncyY9MzI3NjcsJHQ9bjtyZXR1cm59aWYoZSE9PW51bGwpZS5mbGFnc3w9MzI3NjgsZS5zdWJ0cmVlRmxhZ3M9MCxlLmRlbGV0aW9ucz1udWxsO2Vsc2V7UHQ9NiwkdD1udWxsO3JldHVybn19ZWxzZSBpZihuPXZUKG4sdCxBbiksbiE9PW51bGwpeyR0PW47cmV0dXJufWlmKHQ9dC5zaWJsaW5nLHQhPT1udWxsKXskdD10O3JldHVybn0kdD10PWV9d2hpbGUodCE9PW51bGwpO1B0PT09MCYmKFB0PTUpfWZ1bmN0aW9uIFRvKGUsdCxuKXt2YXIgcj1VZSxpPW5yLnRyYW5zaXRpb247dHJ5e25yLnRyYW5zaXRpb249bnVsbCxVZT0xLCRUKGUsdCxuLHIpfWZpbmFsbHl7bnIudHJhbnNpdGlvbj1pLFVlPXJ9cmV0dXJuIG51bGx9ZnVuY3Rpb24gJFQoZSx0LG4scil7ZG8gWmwoKTt3aGlsZShCaSE9PW51bGwpO2lmKE1lJjYpdGhyb3cgRXJyb3IoVSgzMjcpKTtuPWUuZmluaXNoZWRXb3JrO3ZhciBpPWUuZmluaXNoZWRMYW5lcztpZihuPT09bnVsbClyZXR1cm4gbnVsbDtpZihlLmZpbmlzaGVkV29yaz1udWxsLGUuZmluaXNoZWRMYW5lcz0wLG49PT1lLmN1cnJlbnQpdGhyb3cgRXJyb3IoVSgxNzcpKTtlLmNhbGxiYWNrTm9kZT1udWxsLGUuY2FsbGJhY2tQcmlvcml0eT0wO3ZhciBvPW4ubGFuZXN8bi5jaGlsZExhbmVzO2lmKGxiKGUsbyksZT09PUJ0JiYoJHQ9QnQ9bnVsbCxadD0wKSwhKG4uc3VidHJlZUZsYWdzJjIwNjQpJiYhKG4uZmxhZ3MmMjA2NCl8fGNjfHwoY2M9ITAsT3coSmMsZnVuY3Rpb24oKXtyZXR1cm4gWmwoKSxudWxsfSkpLG89KG4uZmxhZ3MmMTU5OTApIT09MCxuLnN1YnRyZWVGbGFncyYxNTk5MHx8byl7bz1uci50cmFuc2l0aW9uLG5yLnRyYW5zaXRpb249bnVsbDt2YXIgbD1VZTtVZT0xO3ZhciBzPU1lO01lfD00LE1nLmN1cnJlbnQ9bnVsbCxfVChlLG4pLFN3KG4sZSksS2IoX3ApLGVkPSEheHAsX3A9eHA9bnVsbCxlLmN1cnJlbnQ9bix3VChuKSxRJCgpLE1lPXMsVWU9bCxuci50cmFuc2l0aW9uPW99ZWxzZSBlLmN1cnJlbnQ9bjtpZihjYyYmKGNjPSExLEJpPWUsZ2Q9aSksbz1lLnBlbmRpbmdMYW5lcyxvPT09MCYmKFlpPW51bGwpLGViKG4uc3RhdGVOb2RlKSxObihlLEN0KCkpLHQhPT1udWxsKWZvcihyPWUub25SZWNvdmVyYWJsZUVycm9yLG49MDtuPHQubGVuZ3RoO24rKylpPXRbbl0scihpLnZhbHVlLHtjb21wb25lbnRTdGFjazppLnN0YWNrLGRpZ2VzdDppLmRpZ2VzdH0pO2lmKG1kKXRocm93IG1kPSExLGU9RnAsRnA9bnVsbCxlO3JldHVybiBnZCYxJiZlLnRhZyE9PTAmJlpsKCksbz1lLnBlbmRpbmdMYW5lcyxvJjE/ZT09PUJwP19hKys6KF9hPTAsQnA9ZSk6X2E9MCx2bygpLG51bGx9ZnVuY3Rpb24gWmwoKXtpZihCaSE9PW51bGwpe3ZhciBlPXMxKGdkKSx0PW5yLnRyYW5zaXRpb24sbj1VZTt0cnl7aWYobnIudHJhbnNpdGlvbj1udWxsLFVlPTE2PmU/MTY6ZSxCaT09PW51bGwpdmFyIHI9ITE7ZWxzZXtpZihlPUJpLEJpPW51bGwsZ2Q9MCxNZSY2KXRocm93IEVycm9yKFUoMzMxKSk7dmFyIGk9TWU7Zm9yKE1lfD00LGVlPWUuY3VycmVudDtlZSE9PW51bGw7KXt2YXIgbz1lZSxsPW8uY2hpbGQ7aWYoZWUuZmxhZ3MmMTYpe3ZhciBzPW8uZGVsZXRpb25zO2lmKHMhPT1udWxsKXtmb3IodmFyIGE9MDthPHMubGVuZ3RoO2ErKyl7dmFyIHU9c1thXTtmb3IoZWU9dTtlZSE9PW51bGw7KXt2YXIgYz1lZTtzd2l0Y2goYy50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6eWEoOCxjLG8pfXZhciBkPWMuY2hpbGQ7aWYoZCE9PW51bGwpZC5yZXR1cm49YyxlZT1kO2Vsc2UgZm9yKDtlZSE9PW51bGw7KXtjPWVlO3ZhciBmPWMuc2libGluZyxoPWMucmV0dXJuO2lmKHh3KGMpLGM9PT11KXtlZT1udWxsO2JyZWFrfWlmKGYhPT1udWxsKXtmLnJldHVybj1oLGVlPWY7YnJlYWt9ZWU9aH19fXZhciBtPW8uYWx0ZXJuYXRlO2lmKG0hPT1udWxsKXt2YXIgZz1tLmNoaWxkO2lmKGchPT1udWxsKXttLmNoaWxkPW51bGw7ZG97dmFyIFM9Zy5zaWJsaW5nO2cuc2libGluZz1udWxsLGc9U313aGlsZShnIT09bnVsbCl9fWVlPW99fWlmKG8uc3VidHJlZUZsYWdzJjIwNjQmJmwhPT1udWxsKWwucmV0dXJuPW8sZWU9bDtlbHNlIGU6Zm9yKDtlZSE9PW51bGw7KXtpZihvPWVlLG8uZmxhZ3MmMjA0OClzd2l0Y2goby50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6eWEoOSxvLG8ucmV0dXJuKX12YXIgdj1vLnNpYmxpbmc7aWYodiE9PW51bGwpe3YucmV0dXJuPW8ucmV0dXJuLGVlPXY7YnJlYWsgZX1lZT1vLnJldHVybn19dmFyIHk9ZS5jdXJyZW50O2ZvcihlZT15O2VlIT09bnVsbDspe2w9ZWU7dmFyIF89bC5jaGlsZDtpZihsLnN1YnRyZWVGbGFncyYyMDY0JiZfIT09bnVsbClfLnJldHVybj1sLGVlPV87ZWxzZSBlOmZvcihsPXk7ZWUhPT1udWxsOyl7aWYocz1lZSxzLmZsYWdzJjIwNDgpdHJ5e3N3aXRjaChzLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpmZig5LHMpfX1jYXRjaChFKXt2dChzLHMucmV0dXJuLEUpfWlmKHM9PT1sKXtlZT1udWxsO2JyZWFrIGV9dmFyIHc9cy5zaWJsaW5nO2lmKHchPT1udWxsKXt3LnJldHVybj1zLnJldHVybixlZT13O2JyZWFrIGV9ZWU9cy5yZXR1cm59fWlmKE1lPWksdm8oKSx6ciYmdHlwZW9mIHpyLm9uUG9zdENvbW1pdEZpYmVyUm9vdD09ImZ1bmN0aW9uIil0cnl7enIub25Qb3N0Q29tbWl0RmliZXJSb290KHJmLGUpfWNhdGNoe31yPSEwfXJldHVybiByfWZpbmFsbHl7VWU9bixuci50cmFuc2l0aW9uPXR9fXJldHVybiExfWZ1bmN0aW9uIGgwKGUsdCxuKXt0PW9zKG4sdCksdD1hdyhlLHQsMSksZT1HaShlLHQsMSksdD12bigpLGUhPT1udWxsJiYoVHUoZSwxLHQpLE5uKGUsdCkpfWZ1bmN0aW9uIHZ0KGUsdCxuKXtpZihlLnRhZz09PTMpaDAoZSxlLG4pO2Vsc2UgZm9yKDt0IT09bnVsbDspe2lmKHQudGFnPT09Myl7aDAodCxlLG4pO2JyZWFrfWVsc2UgaWYodC50YWc9PT0xKXt2YXIgcj10LnN0YXRlTm9kZTtpZih0eXBlb2YgdC50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj09ImZ1bmN0aW9uInx8dHlwZW9mIHIuY29tcG9uZW50RGlkQ2F0Y2g9PSJmdW5jdGlvbiImJihZaT09PW51bGx8fCFZaS5oYXMocikpKXtlPW9zKG4sZSksZT11dyh0LGUsMSksdD1HaSh0LGUsMSksZT12bigpLHQhPT1udWxsJiYoVHUodCwxLGUpLE5uKHQsZSkpO2JyZWFrfX10PXQucmV0dXJufX1mdW5jdGlvbiBiVChlLHQsbil7dmFyIHI9ZS5waW5nQ2FjaGU7ciE9PW51bGwmJnIuZGVsZXRlKHQpLHQ9dm4oKSxlLnBpbmdlZExhbmVzfD1lLnN1c3BlbmRlZExhbmVzJm4sQnQ9PT1lJiYoWnQmbik9PT1uJiYoUHQ9PT00fHxQdD09PTMmJihadCYxMzAwMjM0MjQpPT09WnQmJjUwMD5DdCgpLUlnP0lvKGUsMCk6RGd8PW4pLE5uKGUsdCl9ZnVuY3Rpb24gTncoZSx0KXt0PT09MCYmKGUubW9kZSYxPyh0PWVjLGVjPDw9MSwhKGVjJjEzMDAyMzQyNCkmJihlYz00MTk0MzA0KSk6dD0xKTt2YXIgbj12bigpO2U9aGkoZSx0KSxlIT09bnVsbCYmKFR1KGUsdCxuKSxObihlLG4pKX1mdW5jdGlvbiBUVChlKXt2YXIgdD1lLm1lbW9pemVkU3RhdGUsbj0wO3QhPT1udWxsJiYobj10LnJldHJ5TGFuZSksTncoZSxuKX1mdW5jdGlvbiBOVChlLHQpe3ZhciBuPTA7c3dpdGNoKGUudGFnKXtjYXNlIDEzOnZhciByPWUuc3RhdGVOb2RlLGk9ZS5tZW1vaXplZFN0YXRlO2khPT1udWxsJiYobj1pLnJldHJ5TGFuZSk7YnJlYWs7Y2FzZSAxOTpyPWUuc3RhdGVOb2RlO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoVSgzMTQpKX1yIT09bnVsbCYmci5kZWxldGUodCksTncoZSxuKX12YXIgUnc7Unc9ZnVuY3Rpb24oZSx0LG4pe2lmKGUhPT1udWxsKWlmKGUubWVtb2l6ZWRQcm9wcyE9PXQucGVuZGluZ1Byb3BzfHxibi5jdXJyZW50KSRuPSEwO2Vsc2V7aWYoIShlLmxhbmVzJm4pJiYhKHQuZmxhZ3MmMTI4KSlyZXR1cm4gJG49ITEsZ1QoZSx0LG4pOyRuPSEhKGUuZmxhZ3MmMTMxMDcyKX1lbHNlICRuPSExLG90JiZ0LmZsYWdzJjEwNDg1NzYmJkExKHQsc2QsdC5pbmRleCk7c3dpdGNoKHQubGFuZXM9MCx0LnRhZyl7Y2FzZSAyOnZhciByPXQudHlwZTtJYyhlLHQpLGU9dC5wZW5kaW5nUHJvcHM7dmFyIGk9dHModCxybi5jdXJyZW50KTtLbCh0LG4pLGk9TmcobnVsbCx0LHIsZSxpLG4pO3ZhciBvPVJnKCk7cmV0dXJuIHQuZmxhZ3N8PTEsdHlwZW9mIGk9PSJvYmplY3QiJiZpIT09bnVsbCYmdHlwZW9mIGkucmVuZGVyPT0iZnVuY3Rpb24iJiZpLiQkdHlwZW9mPT09dm9pZCAwPyh0LnRhZz0xLHQubWVtb2l6ZWRTdGF0ZT1udWxsLHQudXBkYXRlUXVldWU9bnVsbCxUbihyKT8obz0hMCxvZCh0KSk6bz0hMSx0Lm1lbW9pemVkU3RhdGU9aS5zdGF0ZSE9PW51bGwmJmkuc3RhdGUhPT12b2lkIDA/aS5zdGF0ZTpudWxsLENnKHQpLGkudXBkYXRlcj1jZix0LnN0YXRlTm9kZT1pLGkuX3JlYWN0SW50ZXJuYWxzPXQsTnAodCxyLGUsbiksdD1QcChudWxsLHQsciwhMCxvLG4pKToodC50YWc9MCxvdCYmbyYmdmcodCksdW4obnVsbCx0LGksbiksdD10LmNoaWxkKSx0O2Nhc2UgMTY6cj10LmVsZW1lbnRUeXBlO2U6e3N3aXRjaChJYyhlLHQpLGU9dC5wZW5kaW5nUHJvcHMsaT1yLl9pbml0LHI9aShyLl9wYXlsb2FkKSx0LnR5cGU9cixpPXQudGFnPU9UKHIpLGU9bXIocixlKSxpKXtjYXNlIDA6dD1PcChudWxsLHQscixlLG4pO2JyZWFrIGU7Y2FzZSAxOnQ9cjAobnVsbCx0LHIsZSxuKTticmVhayBlO2Nhc2UgMTE6dD10MChudWxsLHQscixlLG4pO2JyZWFrIGU7Y2FzZSAxNDp0PW4wKG51bGwsdCxyLG1yKHIudHlwZSxlKSxuKTticmVhayBlfXRocm93IEVycm9yKFUoMzA2LHIsIiIpKX1yZXR1cm4gdDtjYXNlIDA6cmV0dXJuIHI9dC50eXBlLGk9dC5wZW5kaW5nUHJvcHMsaT10LmVsZW1lbnRUeXBlPT09cj9pOm1yKHIsaSksT3AoZSx0LHIsaSxuKTtjYXNlIDE6cmV0dXJuIHI9dC50eXBlLGk9dC5wZW5kaW5nUHJvcHMsaT10LmVsZW1lbnRUeXBlPT09cj9pOm1yKHIsaSkscjAoZSx0LHIsaSxuKTtjYXNlIDM6ZTp7aWYoaHcodCksZT09PW51bGwpdGhyb3cgRXJyb3IoVSgzODcpKTtyPXQucGVuZGluZ1Byb3BzLG89dC5tZW1vaXplZFN0YXRlLGk9by5lbGVtZW50LEwxKGUsdCksY2QodCxyLG51bGwsbik7dmFyIGw9dC5tZW1vaXplZFN0YXRlO2lmKHI9bC5lbGVtZW50LG8uaXNEZWh5ZHJhdGVkKWlmKG89e2VsZW1lbnQ6cixpc0RlaHlkcmF0ZWQ6ITEsY2FjaGU6bC5jYWNoZSxwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOmwucGVuZGluZ1N1c3BlbnNlQm91bmRhcmllcyx0cmFuc2l0aW9uczpsLnRyYW5zaXRpb25zfSx0LnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZT1vLHQubWVtb2l6ZWRTdGF0ZT1vLHQuZmxhZ3MmMjU2KXtpPW9zKEVycm9yKFUoNDIzKSksdCksdD1pMChlLHQscixuLGkpO2JyZWFrIGV9ZWxzZSBpZihyIT09aSl7aT1vcyhFcnJvcihVKDQyNCkpLHQpLHQ9aTAoZSx0LHIsbixpKTticmVhayBlfWVsc2UgZm9yKEluPVppKHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8uZmlyc3RDaGlsZCksTG49dCxvdD0hMCx5cj1udWxsLG49QjEodCxudWxsLHIsbiksdC5jaGlsZD1uO247KW4uZmxhZ3M9bi5mbGFncyYtM3w0MDk2LG49bi5zaWJsaW5nO2Vsc2V7aWYobnMoKSxyPT09aSl7dD1waShlLHQsbik7YnJlYWsgZX11bihlLHQscixuKX10PXQuY2hpbGR9cmV0dXJuIHQ7Y2FzZSA1OnJldHVybiBVMSh0KSxlPT09bnVsbCYmJHAodCkscj10LnR5cGUsaT10LnBlbmRpbmdQcm9wcyxvPWUhPT1udWxsP2UubWVtb2l6ZWRQcm9wczpudWxsLGw9aS5jaGlsZHJlbix3cChyLGkpP2w9bnVsbDpvIT09bnVsbCYmd3AocixvKSYmKHQuZmxhZ3N8PTMyKSxmdyhlLHQpLHVuKGUsdCxsLG4pLHQuY2hpbGQ7Y2FzZSA2OnJldHVybiBlPT09bnVsbCYmJHAodCksbnVsbDtjYXNlIDEzOnJldHVybiBwdyhlLHQsbik7Y2FzZSA0OnJldHVybiBrZyh0LHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLHI9dC5wZW5kaW5nUHJvcHMsZT09PW51bGw/dC5jaGlsZD1ycyh0LG51bGwscixuKTp1bihlLHQscixuKSx0LmNoaWxkO2Nhc2UgMTE6cmV0dXJuIHI9dC50eXBlLGk9dC5wZW5kaW5nUHJvcHMsaT10LmVsZW1lbnRUeXBlPT09cj9pOm1yKHIsaSksdDAoZSx0LHIsaSxuKTtjYXNlIDc6cmV0dXJuIHVuKGUsdCx0LnBlbmRpbmdQcm9wcyxuKSx0LmNoaWxkO2Nhc2UgODpyZXR1cm4gdW4oZSx0LHQucGVuZGluZ1Byb3BzLmNoaWxkcmVuLG4pLHQuY2hpbGQ7Y2FzZSAxMjpyZXR1cm4gdW4oZSx0LHQucGVuZGluZ1Byb3BzLmNoaWxkcmVuLG4pLHQuY2hpbGQ7Y2FzZSAxMDplOntpZihyPXQudHlwZS5fY29udGV4dCxpPXQucGVuZGluZ1Byb3BzLG89dC5tZW1vaXplZFByb3BzLGw9aS52YWx1ZSxYZShhZCxyLl9jdXJyZW50VmFsdWUpLHIuX2N1cnJlbnRWYWx1ZT1sLG8hPT1udWxsKWlmKGtyKG8udmFsdWUsbCkpe2lmKG8uY2hpbGRyZW49PT1pLmNoaWxkcmVuJiYhYm4uY3VycmVudCl7dD1waShlLHQsbik7YnJlYWsgZX19ZWxzZSBmb3Iobz10LmNoaWxkLG8hPT1udWxsJiYoby5yZXR1cm49dCk7byE9PW51bGw7KXt2YXIgcz1vLmRlcGVuZGVuY2llcztpZihzIT09bnVsbCl7bD1vLmNoaWxkO2Zvcih2YXIgYT1zLmZpcnN0Q29udGV4dDthIT09bnVsbDspe2lmKGEuY29udGV4dD09PXIpe2lmKG8udGFnPT09MSl7YT11aSgtMSxuJi1uKSxhLnRhZz0yO3ZhciB1PW8udXBkYXRlUXVldWU7aWYodSE9PW51bGwpe3U9dS5zaGFyZWQ7dmFyIGM9dS5wZW5kaW5nO2M9PT1udWxsP2EubmV4dD1hOihhLm5leHQ9Yy5uZXh0LGMubmV4dD1hKSx1LnBlbmRpbmc9YX19by5sYW5lc3w9bixhPW8uYWx0ZXJuYXRlLGEhPT1udWxsJiYoYS5sYW5lc3w9biksYnAoby5yZXR1cm4sbix0KSxzLmxhbmVzfD1uO2JyZWFrfWE9YS5uZXh0fX1lbHNlIGlmKG8udGFnPT09MTApbD1vLnR5cGU9PT10LnR5cGU/bnVsbDpvLmNoaWxkO2Vsc2UgaWYoby50YWc9PT0xOCl7aWYobD1vLnJldHVybixsPT09bnVsbCl0aHJvdyBFcnJvcihVKDM0MSkpO2wubGFuZXN8PW4scz1sLmFsdGVybmF0ZSxzIT09bnVsbCYmKHMubGFuZXN8PW4pLGJwKGwsbix0KSxsPW8uc2libGluZ31lbHNlIGw9by5jaGlsZDtpZihsIT09bnVsbClsLnJldHVybj1vO2Vsc2UgZm9yKGw9bztsIT09bnVsbDspe2lmKGw9PT10KXtsPW51bGw7YnJlYWt9aWYobz1sLnNpYmxpbmcsbyE9PW51bGwpe28ucmV0dXJuPWwucmV0dXJuLGw9bzticmVha31sPWwucmV0dXJufW89bH11bihlLHQsaS5jaGlsZHJlbixuKSx0PXQuY2hpbGR9cmV0dXJuIHQ7Y2FzZSA5OnJldHVybiBpPXQudHlwZSxyPXQucGVuZGluZ1Byb3BzLmNoaWxkcmVuLEtsKHQsbiksaT1ycihpKSxyPXIoaSksdC5mbGFnc3w9MSx1bihlLHQscixuKSx0LmNoaWxkO2Nhc2UgMTQ6cmV0dXJuIHI9dC50eXBlLGk9bXIocix0LnBlbmRpbmdQcm9wcyksaT1tcihyLnR5cGUsaSksbjAoZSx0LHIsaSxuKTtjYXNlIDE1OnJldHVybiBjdyhlLHQsdC50eXBlLHQucGVuZGluZ1Byb3BzLG4pO2Nhc2UgMTc6cmV0dXJuIHI9dC50eXBlLGk9dC5wZW5kaW5nUHJvcHMsaT10LmVsZW1lbnRUeXBlPT09cj9pOm1yKHIsaSksSWMoZSx0KSx0LnRhZz0xLFRuKHIpPyhlPSEwLG9kKHQpKTplPSExLEtsKHQsbiksejEodCxyLGkpLE5wKHQscixpLG4pLFBwKG51bGwsdCxyLCEwLGUsbik7Y2FzZSAxOTpyZXR1cm4gbXcoZSx0LG4pO2Nhc2UgMjI6cmV0dXJuIGR3KGUsdCxuKX10aHJvdyBFcnJvcihVKDE1Nix0LnRhZykpfTtmdW5jdGlvbiBPdyhlLHQpe3JldHVybiByMShlLHQpfWZ1bmN0aW9uIFJUKGUsdCxuLHIpe3RoaXMudGFnPWUsdGhpcy5rZXk9bix0aGlzLnNpYmxpbmc9dGhpcy5jaGlsZD10aGlzLnJldHVybj10aGlzLnN0YXRlTm9kZT10aGlzLnR5cGU9dGhpcy5lbGVtZW50VHlwZT1udWxsLHRoaXMuaW5kZXg9MCx0aGlzLnJlZj1udWxsLHRoaXMucGVuZGluZ1Byb3BzPXQsdGhpcy5kZXBlbmRlbmNpZXM9dGhpcy5tZW1vaXplZFN0YXRlPXRoaXMudXBkYXRlUXVldWU9dGhpcy5tZW1vaXplZFByb3BzPW51bGwsdGhpcy5tb2RlPXIsdGhpcy5zdWJ0cmVlRmxhZ3M9dGhpcy5mbGFncz0wLHRoaXMuZGVsZXRpb25zPW51bGwsdGhpcy5jaGlsZExhbmVzPXRoaXMubGFuZXM9MCx0aGlzLmFsdGVybmF0ZT1udWxsfWZ1bmN0aW9uIHFuKGUsdCxuLHIpe3JldHVybiBuZXcgUlQoZSx0LG4scil9ZnVuY3Rpb24gRmcoZSl7cmV0dXJuIGU9ZS5wcm90b3R5cGUsISghZXx8IWUuaXNSZWFjdENvbXBvbmVudCl9ZnVuY3Rpb24gT1QoZSl7aWYodHlwZW9mIGU9PSJmdW5jdGlvbiIpcmV0dXJuIEZnKGUpPzE6MDtpZihlIT1udWxsKXtpZihlPWUuJCR0eXBlb2YsZT09PW9nKXJldHVybiAxMTtpZihlPT09bGcpcmV0dXJuIDE0fXJldHVybiAyfWZ1bmN0aW9uIFFpKGUsdCl7dmFyIG49ZS5hbHRlcm5hdGU7cmV0dXJuIG49PT1udWxsPyhuPXFuKGUudGFnLHQsZS5rZXksZS5tb2RlKSxuLmVsZW1lbnRUeXBlPWUuZWxlbWVudFR5cGUsbi50eXBlPWUudHlwZSxuLnN0YXRlTm9kZT1lLnN0YXRlTm9kZSxuLmFsdGVybmF0ZT1lLGUuYWx0ZXJuYXRlPW4pOihuLnBlbmRpbmdQcm9wcz10LG4udHlwZT1lLnR5cGUsbi5mbGFncz0wLG4uc3VidHJlZUZsYWdzPTAsbi5kZWxldGlvbnM9bnVsbCksbi5mbGFncz1lLmZsYWdzJjE0NjgwMDY0LG4uY2hpbGRMYW5lcz1lLmNoaWxkTGFuZXMsbi5sYW5lcz1lLmxhbmVzLG4uY2hpbGQ9ZS5jaGlsZCxuLm1lbW9pemVkUHJvcHM9ZS5tZW1vaXplZFByb3BzLG4ubWVtb2l6ZWRTdGF0ZT1lLm1lbW9pemVkU3RhdGUsbi51cGRhdGVRdWV1ZT1lLnVwZGF0ZVF1ZXVlLHQ9ZS5kZXBlbmRlbmNpZXMsbi5kZXBlbmRlbmNpZXM9dD09PW51bGw/bnVsbDp7bGFuZXM6dC5sYW5lcyxmaXJzdENvbnRleHQ6dC5maXJzdENvbnRleHR9LG4uc2libGluZz1lLnNpYmxpbmcsbi5pbmRleD1lLmluZGV4LG4ucmVmPWUucmVmLG59ZnVuY3Rpb24gemMoZSx0LG4scixpLG8pe3ZhciBsPTI7aWYocj1lLHR5cGVvZiBlPT0iZnVuY3Rpb24iKUZnKGUpJiYobD0xKTtlbHNlIGlmKHR5cGVvZiBlPT0ic3RyaW5nIilsPTU7ZWxzZSBlOnN3aXRjaChlKXtjYXNlIGJsOnJldHVybiBMbyhuLmNoaWxkcmVuLGksbyx0KTtjYXNlIGlnOmw9OCxpfD04O2JyZWFrO2Nhc2UgcWg6cmV0dXJuIGU9cW4oMTIsbix0LGl8MiksZS5lbGVtZW50VHlwZT1xaCxlLmxhbmVzPW8sZTtjYXNlIGVwOnJldHVybiBlPXFuKDEzLG4sdCxpKSxlLmVsZW1lbnRUeXBlPWVwLGUubGFuZXM9byxlO2Nhc2UgdHA6cmV0dXJuIGU9cW4oMTksbix0LGkpLGUuZWxlbWVudFR5cGU9dHAsZS5sYW5lcz1vLGU7Y2FzZSBGXzpyZXR1cm4gcGYobixpLG8sdCk7ZGVmYXVsdDppZih0eXBlb2YgZT09Im9iamVjdCImJmUhPT1udWxsKXN3aXRjaChlLiQkdHlwZW9mKXtjYXNlIGpfOmw9MTA7YnJlYWsgZTtjYXNlIHpfOmw9OTticmVhayBlO2Nhc2Ugb2c6bD0xMTticmVhayBlO2Nhc2UgbGc6bD0xNDticmVhayBlO2Nhc2UgQWk6bD0xNixyPW51bGw7YnJlYWsgZX10aHJvdyBFcnJvcihVKDEzMCxlPT1udWxsP2U6dHlwZW9mIGUsIiIpKX1yZXR1cm4gdD1xbihsLG4sdCxpKSx0LmVsZW1lbnRUeXBlPWUsdC50eXBlPXIsdC5sYW5lcz1vLHR9ZnVuY3Rpb24gTG8oZSx0LG4scil7cmV0dXJuIGU9cW4oNyxlLHIsdCksZS5sYW5lcz1uLGV9ZnVuY3Rpb24gcGYoZSx0LG4scil7cmV0dXJuIGU9cW4oMjIsZSxyLHQpLGUuZWxlbWVudFR5cGU9Rl8sZS5sYW5lcz1uLGUuc3RhdGVOb2RlPXtpc0hpZGRlbjohMX0sZX1mdW5jdGlvbiBiaChlLHQsbil7cmV0dXJuIGU9cW4oNixlLG51bGwsdCksZS5sYW5lcz1uLGV9ZnVuY3Rpb24gVGgoZSx0LG4pe3JldHVybiB0PXFuKDQsZS5jaGlsZHJlbiE9PW51bGw/ZS5jaGlsZHJlbjpbXSxlLmtleSx0KSx0LmxhbmVzPW4sdC5zdGF0ZU5vZGU9e2NvbnRhaW5lckluZm86ZS5jb250YWluZXJJbmZvLHBlbmRpbmdDaGlsZHJlbjpudWxsLGltcGxlbWVudGF0aW9uOmUuaW1wbGVtZW50YXRpb259LHR9ZnVuY3Rpb24gUFQoZSx0LG4scixpKXt0aGlzLnRhZz10LHRoaXMuY29udGFpbmVySW5mbz1lLHRoaXMuZmluaXNoZWRXb3JrPXRoaXMucGluZ0NhY2hlPXRoaXMuY3VycmVudD10aGlzLnBlbmRpbmdDaGlsZHJlbj1udWxsLHRoaXMudGltZW91dEhhbmRsZT0tMSx0aGlzLmNhbGxiYWNrTm9kZT10aGlzLnBlbmRpbmdDb250ZXh0PXRoaXMuY29udGV4dD1udWxsLHRoaXMuY2FsbGJhY2tQcmlvcml0eT0wLHRoaXMuZXZlbnRUaW1lcz1haCgwKSx0aGlzLmV4cGlyYXRpb25UaW1lcz1haCgtMSksdGhpcy5lbnRhbmdsZWRMYW5lcz10aGlzLmZpbmlzaGVkTGFuZXM9dGhpcy5tdXRhYmxlUmVhZExhbmVzPXRoaXMuZXhwaXJlZExhbmVzPXRoaXMucGluZ2VkTGFuZXM9dGhpcy5zdXNwZW5kZWRMYW5lcz10aGlzLnBlbmRpbmdMYW5lcz0wLHRoaXMuZW50YW5nbGVtZW50cz1haCgwKSx0aGlzLmlkZW50aWZpZXJQcmVmaXg9cix0aGlzLm9uUmVjb3ZlcmFibGVFcnJvcj1pLHRoaXMubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT1udWxsfWZ1bmN0aW9uIEJnKGUsdCxuLHIsaSxvLGwscyxhKXtyZXR1cm4gZT1uZXcgUFQoZSx0LG4scyxhKSx0PT09MT8odD0xLG89PT0hMCYmKHR8PTgpKTp0PTAsbz1xbigzLG51bGwsbnVsbCx0KSxlLmN1cnJlbnQ9byxvLnN0YXRlTm9kZT1lLG8ubWVtb2l6ZWRTdGF0ZT17ZWxlbWVudDpyLGlzRGVoeWRyYXRlZDpuLGNhY2hlOm51bGwsdHJhbnNpdGlvbnM6bnVsbCxwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOm51bGx9LENnKG8pLGV9ZnVuY3Rpb24gQVQoZSx0LG4pe3ZhciByPTM8YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTpudWxsO3JldHVybnskJHR5cGVvZjokbCxrZXk6cj09bnVsbD9udWxsOiIiK3IsY2hpbGRyZW46ZSxjb250YWluZXJJbmZvOnQsaW1wbGVtZW50YXRpb246bn19ZnVuY3Rpb24gUHcoZSl7aWYoIWUpcmV0dXJuIG5vO2U9ZS5fcmVhY3RJbnRlcm5hbHM7ZTp7aWYoaWwoZSkhPT1lfHxlLnRhZyE9PTEpdGhyb3cgRXJyb3IoVSgxNzApKTt2YXIgdD1lO2Rve3N3aXRjaCh0LnRhZyl7Y2FzZSAzOnQ9dC5zdGF0ZU5vZGUuY29udGV4dDticmVhayBlO2Nhc2UgMTppZihUbih0LnR5cGUpKXt0PXQuc3RhdGVOb2RlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0O2JyZWFrIGV9fXQ9dC5yZXR1cm59d2hpbGUodCE9PW51bGwpO3Rocm93IEVycm9yKFUoMTcxKSl9aWYoZS50YWc9PT0xKXt2YXIgbj1lLnR5cGU7aWYoVG4obikpcmV0dXJuIE8xKGUsbix0KX1yZXR1cm4gdH1mdW5jdGlvbiBBdyhlLHQsbixyLGksbyxsLHMsYSl7cmV0dXJuIGU9QmcobixyLCEwLGUsaSxvLGwscyxhKSxlLmNvbnRleHQ9UHcobnVsbCksbj1lLmN1cnJlbnQscj12bigpLGk9WGkobiksbz11aShyLGkpLG8uY2FsbGJhY2s9dD8/bnVsbCxHaShuLG8saSksZS5jdXJyZW50LmxhbmVzPWksVHUoZSxpLHIpLE5uKGUsciksZX1mdW5jdGlvbiBtZihlLHQsbixyKXt2YXIgaT10LmN1cnJlbnQsbz12bigpLGw9WGkoaSk7cmV0dXJuIG49UHcobiksdC5jb250ZXh0PT09bnVsbD90LmNvbnRleHQ9bjp0LnBlbmRpbmdDb250ZXh0PW4sdD11aShvLGwpLHQucGF5bG9hZD17ZWxlbWVudDplfSxyPXI9PT12b2lkIDA/bnVsbDpyLHIhPT1udWxsJiYodC5jYWxsYmFjaz1yKSxlPUdpKGksdCxsKSxlIT09bnVsbCYmKFNyKGUsaSxsLG8pLEFjKGUsaSxsKSksbH1mdW5jdGlvbiB5ZChlKXtpZihlPWUuY3VycmVudCwhZS5jaGlsZClyZXR1cm4gbnVsbDtzd2l0Y2goZS5jaGlsZC50YWcpe2Nhc2UgNTpyZXR1cm4gZS5jaGlsZC5zdGF0ZU5vZGU7ZGVmYXVsdDpyZXR1cm4gZS5jaGlsZC5zdGF0ZU5vZGV9fWZ1bmN0aW9uIHAwKGUsdCl7aWYoZT1lLm1lbW9pemVkU3RhdGUsZSE9PW51bGwmJmUuZGVoeWRyYXRlZCE9PW51bGwpe3ZhciBuPWUucmV0cnlMYW5lO2UucmV0cnlMYW5lPW4hPT0wJiZuPHQ/bjp0fX1mdW5jdGlvbiBVZyhlLHQpe3AwKGUsdCksKGU9ZS5hbHRlcm5hdGUpJiZwMChlLHQpfWZ1bmN0aW9uIE1UKCl7cmV0dXJuIG51bGx9dmFyIE13PXR5cGVvZiByZXBvcnRFcnJvcj09ImZ1bmN0aW9uIj9yZXBvcnRFcnJvcjpmdW5jdGlvbihlKXtjb25zb2xlLmVycm9yKGUpfTtmdW5jdGlvbiBXZyhlKXt0aGlzLl9pbnRlcm5hbFJvb3Q9ZX1nZi5wcm90b3R5cGUucmVuZGVyPVdnLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5faW50ZXJuYWxSb290O2lmKHQ9PT1udWxsKXRocm93IEVycm9yKFUoNDA5KSk7bWYoZSx0LG51bGwsbnVsbCl9O2dmLnByb3RvdHlwZS51bm1vdW50PVdnLnByb3RvdHlwZS51bm1vdW50PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5faW50ZXJuYWxSb290O2lmKGUhPT1udWxsKXt0aGlzLl9pbnRlcm5hbFJvb3Q9bnVsbDt2YXIgdD1lLmNvbnRhaW5lckluZm87Wm8oZnVuY3Rpb24oKXttZihudWxsLGUsbnVsbCxudWxsKX0pLHRbZmldPW51bGx9fTtmdW5jdGlvbiBnZihlKXt0aGlzLl9pbnRlcm5hbFJvb3Q9ZX1nZi5wcm90b3R5cGUudW5zdGFibGVfc2NoZWR1bGVIeWRyYXRpb249ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9YzEoKTtlPXtibG9ja2VkT246bnVsbCx0YXJnZXQ6ZSxwcmlvcml0eTp0fTtmb3IodmFyIG49MDtuPElpLmxlbmd0aCYmdCE9PTAmJnQ8SWlbbl0ucHJpb3JpdHk7bisrKTtJaS5zcGxpY2UobiwwLGUpLG49PT0wJiZmMShlKX19O2Z1bmN0aW9uIFZnKGUpe3JldHVybiEoIWV8fGUubm9kZVR5cGUhPT0xJiZlLm5vZGVUeXBlIT09OSYmZS5ub2RlVHlwZSE9PTExKX1mdW5jdGlvbiB2ZihlKXtyZXR1cm4hKCFlfHxlLm5vZGVUeXBlIT09MSYmZS5ub2RlVHlwZSE9PTkmJmUubm9kZVR5cGUhPT0xMSYmKGUubm9kZVR5cGUhPT04fHxlLm5vZGVWYWx1ZSE9PSIgcmVhY3QtbW91bnQtcG9pbnQtdW5zdGFibGUgIikpfWZ1bmN0aW9uIG0wKCl7fWZ1bmN0aW9uIERUKGUsdCxuLHIsaSl7aWYoaSl7aWYodHlwZW9mIHI9PSJmdW5jdGlvbiIpe3ZhciBvPXI7cj1mdW5jdGlvbigpe3ZhciB1PXlkKGwpO28uY2FsbCh1KX19dmFyIGw9QXcodCxyLGUsMCxudWxsLCExLCExLCIiLG0wKTtyZXR1cm4gZS5fcmVhY3RSb290Q29udGFpbmVyPWwsZVtmaV09bC5jdXJyZW50LFdhKGUubm9kZVR5cGU9PT04P2UucGFyZW50Tm9kZTplKSxabygpLGx9Zm9yKDtpPWUubGFzdENoaWxkOyllLnJlbW92ZUNoaWxkKGkpO2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXt2YXIgcz1yO3I9ZnVuY3Rpb24oKXt2YXIgdT15ZChhKTtzLmNhbGwodSl9fXZhciBhPUJnKGUsMCwhMSxudWxsLG51bGwsITEsITEsIiIsbTApO3JldHVybiBlLl9yZWFjdFJvb3RDb250YWluZXI9YSxlW2ZpXT1hLmN1cnJlbnQsV2EoZS5ub2RlVHlwZT09PTg/ZS5wYXJlbnROb2RlOmUpLFpvKGZ1bmN0aW9uKCl7bWYodCxhLG4scil9KSxhfWZ1bmN0aW9uIHlmKGUsdCxuLHIsaSl7dmFyIG89bi5fcmVhY3RSb290Q29udGFpbmVyO2lmKG8pe3ZhciBsPW87aWYodHlwZW9mIGk9PSJmdW5jdGlvbiIpe3ZhciBzPWk7aT1mdW5jdGlvbigpe3ZhciBhPXlkKGwpO3MuY2FsbChhKX19bWYodCxsLGUsaSl9ZWxzZSBsPURUKG4sdCxlLGkscik7cmV0dXJuIHlkKGwpfWExPWZ1bmN0aW9uKGUpe3N3aXRjaChlLnRhZyl7Y2FzZSAzOnZhciB0PWUuc3RhdGVOb2RlO2lmKHQuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl7dmFyIG49bGEodC5wZW5kaW5nTGFuZXMpO24hPT0wJiYodWcodCxufDEpLE5uKHQsQ3QoKSksIShNZSY2KSYmKGxzPUN0KCkrNTAwLHZvKCkpKX1icmVhaztjYXNlIDEzOlpvKGZ1bmN0aW9uKCl7dmFyIHI9aGkoZSwxKTtpZihyIT09bnVsbCl7dmFyIGk9dm4oKTtTcihyLGUsMSxpKX19KSxVZyhlLDEpfX07Y2c9ZnVuY3Rpb24oZSl7aWYoZS50YWc9PT0xMyl7dmFyIHQ9aGkoZSwxMzQyMTc3MjgpO2lmKHQhPT1udWxsKXt2YXIgbj12bigpO1NyKHQsZSwxMzQyMTc3Mjgsbil9VWcoZSwxMzQyMTc3MjgpfX07dTE9ZnVuY3Rpb24oZSl7aWYoZS50YWc9PT0xMyl7dmFyIHQ9WGkoZSksbj1oaShlLHQpO2lmKG4hPT1udWxsKXt2YXIgcj12bigpO1NyKG4sZSx0LHIpfVVnKGUsdCl9fTtjMT1mdW5jdGlvbigpe3JldHVybiBVZX07ZDE9ZnVuY3Rpb24oZSx0KXt2YXIgbj1VZTt0cnl7cmV0dXJuIFVlPWUsdCgpfWZpbmFsbHl7VWU9bn19O2RwPWZ1bmN0aW9uKGUsdCxuKXtzd2l0Y2godCl7Y2FzZSJpbnB1dCI6aWYoaXAoZSxuKSx0PW4ubmFtZSxuLnR5cGU9PT0icmFkaW8iJiZ0IT1udWxsKXtmb3Iobj1lO24ucGFyZW50Tm9kZTspbj1uLnBhcmVudE5vZGU7Zm9yKG49bi5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dFtuYW1lPSIrSlNPTi5zdHJpbmdpZnkoIiIrdCkrJ11bdHlwZT0icmFkaW8iXScpLHQ9MDt0PG4ubGVuZ3RoO3QrKyl7dmFyIHI9blt0XTtpZihyIT09ZSYmci5mb3JtPT09ZS5mb3JtKXt2YXIgaT1hZihyKTtpZighaSl0aHJvdyBFcnJvcihVKDkwKSk7VV8ociksaXAocixpKX19fWJyZWFrO2Nhc2UidGV4dGFyZWEiOlZfKGUsbik7YnJlYWs7Y2FzZSJzZWxlY3QiOnQ9bi52YWx1ZSx0IT1udWxsJiZVbChlLCEhbi5tdWx0aXBsZSx0LCExKX19O1FfPUxnO0pfPVpvO3ZhciBJVD17dXNpbmdDbGllbnRFbnRyeVBvaW50OiExLEV2ZW50czpbUnUsT2wsYWYsWV8sWF8sTGddfSxLcz17ZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6T28sYnVuZGxlVHlwZTowLHZlcnNpb246IjE4LjIuMCIscmVuZGVyZXJQYWNrYWdlTmFtZToicmVhY3QtZG9tIn0sTFQ9e2J1bmRsZVR5cGU6S3MuYnVuZGxlVHlwZSx2ZXJzaW9uOktzLnZlcnNpb24scmVuZGVyZXJQYWNrYWdlTmFtZTpLcy5yZW5kZXJlclBhY2thZ2VOYW1lLHJlbmRlcmVyQ29uZmlnOktzLnJlbmRlcmVyQ29uZmlnLG92ZXJyaWRlSG9va1N0YXRlOm51bGwsb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoOm51bGwsb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoOm51bGwsb3ZlcnJpZGVQcm9wczpudWxsLG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoOm51bGwsb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGg6bnVsbCxzZXRFcnJvckhhbmRsZXI6bnVsbCxzZXRTdXNwZW5zZUhhbmRsZXI6bnVsbCxzY2hlZHVsZVVwZGF0ZTpudWxsLGN1cnJlbnREaXNwYXRjaGVyUmVmOnhpLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsZmluZEhvc3RJbnN0YW5jZUJ5RmliZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dDEoZSksZT09PW51bGw/bnVsbDplLnN0YXRlTm9kZX0sZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6S3MuZmluZEZpYmVyQnlIb3N0SW5zdGFuY2V8fE1ULGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaDpudWxsLHNjaGVkdWxlUmVmcmVzaDpudWxsLHNjaGVkdWxlUm9vdDpudWxsLHNldFJlZnJlc2hIYW5kbGVyOm51bGwsZ2V0Q3VycmVudEZpYmVyOm51bGwscmVjb25jaWxlclZlcnNpb246IjE4LjIuMC1uZXh0LTllM2I3NzJiOC0yMDIyMDYwOCJ9O2lmKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX188InUiKXt2YXIgZGM9X19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fO2lmKCFkYy5pc0Rpc2FibGVkJiZkYy5zdXBwb3J0c0ZpYmVyKXRyeXtyZj1kYy5pbmplY3QoTFQpLHpyPWRjfWNhdGNoe319Vm4uX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9SVQ7Vm4uY3JlYXRlUG9ydGFsPWZ1bmN0aW9uKGUsdCl7dmFyIG49Mjxhcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm51bGw7aWYoIVZnKHQpKXRocm93IEVycm9yKFUoMjAwKSk7cmV0dXJuIEFUKGUsdCxudWxsLG4pfTtWbi5jcmVhdGVSb290PWZ1bmN0aW9uKGUsdCl7aWYoIVZnKGUpKXRocm93IEVycm9yKFUoMjk5KSk7dmFyIG49ITEscj0iIixpPU13O3JldHVybiB0IT1udWxsJiYodC51bnN0YWJsZV9zdHJpY3RNb2RlPT09ITAmJihuPSEwKSx0LmlkZW50aWZpZXJQcmVmaXghPT12b2lkIDAmJihyPXQuaWRlbnRpZmllclByZWZpeCksdC5vblJlY292ZXJhYmxlRXJyb3IhPT12b2lkIDAmJihpPXQub25SZWNvdmVyYWJsZUVycm9yKSksdD1CZyhlLDEsITEsbnVsbCxudWxsLG4sITEscixpKSxlW2ZpXT10LmN1cnJlbnQsV2EoZS5ub2RlVHlwZT09PTg/ZS5wYXJlbnROb2RlOmUpLG5ldyBXZyh0KX07Vm4uZmluZERPTU5vZGU9ZnVuY3Rpb24oZSl7aWYoZT09bnVsbClyZXR1cm4gbnVsbDtpZihlLm5vZGVUeXBlPT09MSlyZXR1cm4gZTt2YXIgdD1lLl9yZWFjdEludGVybmFscztpZih0PT09dm9pZCAwKXRocm93IHR5cGVvZiBlLnJlbmRlcj09ImZ1bmN0aW9uIj9FcnJvcihVKDE4OCkpOihlPU9iamVjdC5rZXlzKGUpLmpvaW4oIiwiKSxFcnJvcihVKDI2OCxlKSkpO3JldHVybiBlPXQxKHQpLGU9ZT09PW51bGw/bnVsbDplLnN0YXRlTm9kZSxlfTtWbi5mbHVzaFN5bmM9ZnVuY3Rpb24oZSl7cmV0dXJuIFpvKGUpfTtWbi5oeWRyYXRlPWZ1bmN0aW9uKGUsdCxuKXtpZighdmYodCkpdGhyb3cgRXJyb3IoVSgyMDApKTtyZXR1cm4geWYobnVsbCxlLHQsITAsbil9O1ZuLmh5ZHJhdGVSb290PWZ1bmN0aW9uKGUsdCxuKXtpZighVmcoZSkpdGhyb3cgRXJyb3IoVSg0MDUpKTt2YXIgcj1uIT1udWxsJiZuLmh5ZHJhdGVkU291cmNlc3x8bnVsbCxpPSExLG89IiIsbD1NdztpZihuIT1udWxsJiYobi51bnN0YWJsZV9zdHJpY3RNb2RlPT09ITAmJihpPSEwKSxuLmlkZW50aWZpZXJQcmVmaXghPT12b2lkIDAmJihvPW4uaWRlbnRpZmllclByZWZpeCksbi5vblJlY292ZXJhYmxlRXJyb3IhPT12b2lkIDAmJihsPW4ub25SZWNvdmVyYWJsZUVycm9yKSksdD1Bdyh0LG51bGwsZSwxLG4/P251bGwsaSwhMSxvLGwpLGVbZmldPXQuY3VycmVudCxXYShlKSxyKWZvcihlPTA7ZTxyLmxlbmd0aDtlKyspbj1yW2VdLGk9bi5fZ2V0VmVyc2lvbixpPWkobi5fc291cmNlKSx0Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE9PW51bGw/dC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPVtuLGldOnQubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YS5wdXNoKG4saSk7cmV0dXJuIG5ldyBnZih0KX07Vm4ucmVuZGVyPWZ1bmN0aW9uKGUsdCxuKXtpZighdmYodCkpdGhyb3cgRXJyb3IoVSgyMDApKTtyZXR1cm4geWYobnVsbCxlLHQsITEsbil9O1ZuLnVubW91bnRDb21wb25lbnRBdE5vZGU9ZnVuY3Rpb24oZSl7aWYoIXZmKGUpKXRocm93IEVycm9yKFUoNDApKTtyZXR1cm4gZS5fcmVhY3RSb290Q29udGFpbmVyPyhabyhmdW5jdGlvbigpe3lmKG51bGwsbnVsbCxlLCExLGZ1bmN0aW9uKCl7ZS5fcmVhY3RSb290Q29udGFpbmVyPW51bGwsZVtmaV09bnVsbH0pfSksITApOiExfTtWbi51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcz1MZztWbi51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcj1mdW5jdGlvbihlLHQsbixyKXtpZighdmYobikpdGhyb3cgRXJyb3IoVSgyMDApKTtpZihlPT1udWxsfHxlLl9yZWFjdEludGVybmFscz09PXZvaWQgMCl0aHJvdyBFcnJvcihVKDM4KSk7cmV0dXJuIHlmKGUsdCxuLCExLHIpfTtWbi52ZXJzaW9uPSIxOC4yLjAtbmV4dC05ZTNiNzcyYjgtMjAyMjA2MDgiO2Z1bmN0aW9uIER3KCl7aWYoISh0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fPiJ1Inx8dHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRSE9ImZ1bmN0aW9uIikpdHJ5e19fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRShEdyl9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcihlKX19RHcoKSxBXy5leHBvcnRzPVZuO3ZhciBHcj1BXy5leHBvcnRzO2NvbnN0IEl3PSR1KEdyKSxqVD1FXyh7X19wcm90b19fOm51bGwsZGVmYXVsdDpJd30sW0dyXSk7dmFyIGcwPUdyO1FoLmNyZWF0ZVJvb3Q9ZzAuY3JlYXRlUm9vdCxRaC5oeWRyYXRlUm9vdD1nMC5oeWRyYXRlUm9vdDt2YXIgTHc9e2V4cG9ydHM6e319LHhmPXt9Oy8qKgogKiBAbGljZW5zZSBSZWFjdAogKiByZWFjdC1qc3gtcnVudGltZS5wcm9kdWN0aW9uLm1pbi5qcwogKgogKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICovdmFyIHpUPXAsRlQ9U3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpLEJUPVN5bWJvbC5mb3IoInJlYWN0LmZyYWdtZW50IiksVVQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxXVD16VC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRC5SZWFjdEN1cnJlbnRPd25lcixWVD17a2V5OiEwLHJlZjohMCxfX3NlbGY6ITAsX19zb3VyY2U6ITB9O2Z1bmN0aW9uIGp3KGUsdCxuKXt2YXIgcixpPXt9LG89bnVsbCxsPW51bGw7biE9PXZvaWQgMCYmKG89IiIrbiksdC5rZXkhPT12b2lkIDAmJihvPSIiK3Qua2V5KSx0LnJlZiE9PXZvaWQgMCYmKGw9dC5yZWYpO2ZvcihyIGluIHQpVVQuY2FsbCh0LHIpJiYhVlQuaGFzT3duUHJvcGVydHkocikmJihpW3JdPXRbcl0pO2lmKGUmJmUuZGVmYXVsdFByb3BzKWZvcihyIGluIHQ9ZS5kZWZhdWx0UHJvcHMsdClpW3JdPT09dm9pZCAwJiYoaVtyXT10W3JdKTtyZXR1cm57JCR0eXBlb2Y6RlQsdHlwZTplLGtleTpvLHJlZjpsLHByb3BzOmksX293bmVyOldULmN1cnJlbnR9fXhmLkZyYWdtZW50PUJUO3hmLmpzeD1qdzt4Zi5qc3hzPWp3O0x3LmV4cG9ydHM9eGY7dmFyIHg9THcuZXhwb3J0cztmdW5jdGlvbiBWcChlLHQpeyh0PT1udWxsfHx0PmUubGVuZ3RoKSYmKHQ9ZS5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KHQpO248dDtuKyspcltuXT1lW25dO3JldHVybiByfWZ1bmN0aW9uIEhnKGUsdCl7aWYoZSl7aWYodHlwZW9mIGU9PSJzdHJpbmciKXJldHVybiBWcChlLHQpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKTtpZihuPT09Ik9iamVjdCImJmUuY29uc3RydWN0b3ImJihuPWUuY29uc3RydWN0b3IubmFtZSksbj09PSJNYXAifHxuPT09IlNldCIpcmV0dXJuIEFycmF5LmZyb20oZSk7aWYobj09PSJBcmd1bWVudHMifHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSlyZXR1cm4gVnAoZSx0KX19ZnVuY3Rpb24gX2YoZSx0KXt2YXIgbj10eXBlb2YgU3ltYm9sPCJ1IiYmZVtTeW1ib2wuaXRlcmF0b3JdfHxlWyJAQGl0ZXJhdG9yIl07aWYoIW4pe2lmKEFycmF5LmlzQXJyYXkoZSl8fChuPUhnKGUpKXx8dCYmZSYmdHlwZW9mIGUubGVuZ3RoPT0ibnVtYmVyIil7biYmKGU9bik7dmFyIHI9MCxpPWZ1bmN0aW9uKCl7fTtyZXR1cm57czppLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49ZS5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOmVbcisrXX19LGU6ZnVuY3Rpb24oYSl7dGhyb3cgYX0sZjppfX10aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX12YXIgbz0hMCxsPSExLHM7cmV0dXJue3M6ZnVuY3Rpb24oKXtuPW4uY2FsbChlKX0sbjpmdW5jdGlvbigpe3ZhciBhPW4ubmV4dCgpO3JldHVybiBvPWEuZG9uZSxhfSxlOmZ1bmN0aW9uKGEpe2w9ITAscz1hfSxmOmZ1bmN0aW9uKCl7dHJ5eyFvJiZuLnJldHVybiE9bnVsbCYmbi5yZXR1cm4oKX1maW5hbGx5e2lmKGwpdGhyb3cgc319fX1mdW5jdGlvbiB6dyhlKXtyZXR1cm4gZS5sZW5ndGg+MH12YXIgUHU9T2JqZWN0LmZyZWV6ZSh7a2luZDoib2siLHZhbHVlOnZvaWQgMH0pO2Z1bmN0aW9uIEF1KGUpe3JldHVybiBlPT09dm9pZCAwP1B1OntraW5kOiJvayIsdmFsdWU6ZX19ZnVuY3Rpb24gQnIoZSl7cmV0dXJue2tpbmQ6ImVyciIsZXJyb3I6ZX19ZnVuY3Rpb24gd3MoZSl7cmV0dXJuIGU9PT1QdXx8ZS5raW5kPT09Im9rIn1mdW5jdGlvbiBLZyhlKXtyZXR1cm4gZSE9PVB1JiZlLmtpbmQ9PT0iZXJyIn1mdW5jdGlvbiBGdyhlKXt2YXIgdD1bXSxuPVtdLHI9X2YoZSksaTt0cnl7Zm9yKHIucygpOyEoaT1yLm4oKSkuZG9uZTspe3ZhciBvPWkudmFsdWU7d3Mobyk/dC5wdXNoKG8udmFsdWUpOm4ucHVzaChvLmVycm9yKX19Y2F0Y2gobCl7ci5lKGwpfWZpbmFsbHl7ci5mKCl9cmV0dXJuIHp3KG4pP0JyKG4pOkF1KHQpfWZ1bmN0aW9uIEhUKGUpe3JldHVybiBGdyhlKX1mdW5jdGlvbiBLVChlKXt2YXIgdD1bXSxuPV9mKGUpLHI7dHJ5e2ZvcihuLnMoKTshKHI9bi5uKCkpLmRvbmU7KXt2YXIgaT1yLnZhbHVlO0tnKGkpJiZ0LnB1c2goaS5lcnJvcil9fWNhdGNoKG8pe24uZShvKX1maW5hbGx5e24uZigpfXJldHVybiB6dyh0KT9Ccih0KTpQdX1mdW5jdGlvbiBaVChlLHQpe3JldHVybiBmdW5jdGlvbihuKXtmb3IodmFyIHI9QXUodCksaT0wO2k8bi5sZW5ndGgmJndzKHIpOysraSlyPWUoci52YWx1ZSxuW2ldLGkpO3JldHVybiByfX1mdW5jdGlvbiBHVChlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHdzKHQpP0F1KGUodC52YWx1ZSkpOnR9fWZ1bmN0aW9uIFlUKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gd3ModCk/ZSh0LnZhbHVlKTp0fX1mdW5jdGlvbiBYVChlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIEtnKHQpP0JyKGUodC5lcnJvcikpOnR9fWZ1bmN0aW9uIFFUKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBlKG4pP0F1KG4pOkJyKHQobikpfX12YXIgSlQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHdzKHIpP3Qoci52YWx1ZSk/cjpCcihuKHIudmFsdWUpKTpyfX0sam89T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdm9pZE9rOlB1LG9rOkF1LGVycjpCcixpc09rOndzLGlzRXJyOktnLGFsbFQ6RncsYWxsOkhULGFsbFY6S1QsZmxhdE1hcFJlZHVjZTpaVCxtYXA6R1QsZmxhdE1hcDpZVCxtYXBFcnI6WFQsZnJvbVByZWRpY2F0ZTpRVCxmaWx0ZXJPckVsc2U6SlR9KTtmdW5jdGlvbiBxVChlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBWcChlKX1mdW5jdGlvbiBlTihlKXtpZih0eXBlb2YgU3ltYm9sPCJ1IiYmZVtTeW1ib2wuaXRlcmF0b3JdIT1udWxsfHxlWyJAQGl0ZXJhdG9yIl0hPW51bGwpcmV0dXJuIEFycmF5LmZyb20oZSl9ZnVuY3Rpb24gdE4oKXt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS4KSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLmApfWZ1bmN0aW9uIEJ3KGUpe3JldHVybiBxVChlKXx8ZU4oZSl8fEhnKGUpfHx0TigpfWZ1bmN0aW9uIHhlKGUpeyJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7cmV0dXJuIHhlPXR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJnR5cGVvZiBTeW1ib2wuaXRlcmF0b3I9PSJzeW1ib2wiP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSx4ZShlKX1mdW5jdGlvbiBuTihlLHQpe2lmKHR5cGVvZiBlIT0ib2JqZWN0Inx8ZT09PW51bGwpcmV0dXJuIGU7dmFyIG49ZVtTeW1ib2wudG9QcmltaXRpdmVdO2lmKG4hPT12b2lkIDApe3ZhciByPW4uY2FsbChlLHR8fCJkZWZhdWx0Iik7aWYodHlwZW9mIHIhPSJvYmplY3QiKXJldHVybiByO3Rocm93IG5ldyBUeXBlRXJyb3IoIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuIil9cmV0dXJuKHQ9PT0ic3RyaW5nIj9TdHJpbmc6TnVtYmVyKShlKX1mdW5jdGlvbiBVdyhlKXt2YXIgdD1uTihlLCJzdHJpbmciKTtyZXR1cm4gdHlwZW9mIHQ9PSJzeW1ib2wiP3Q6U3RyaW5nKHQpfWZ1bmN0aW9uIHllKGUsdCxuKXtyZXR1cm4gdD1Vdyh0KSx0IGluIGU/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOmVbdF09bixlfWZ1bmN0aW9uIHYwKGUsdCl7dmFyIG49T2JqZWN0LmtleXMoZSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTt0JiYocj1yLmZpbHRlcihmdW5jdGlvbihpKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLGkpLmVudW1lcmFibGV9KSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gc3MoZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdIT1udWxsP2FyZ3VtZW50c1t0XTp7fTt0JTI/djAoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3llKGUscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOnYwKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gZX1mdW5jdGlvbiByTihlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlfWZ1bmN0aW9uIGlOKGUsdCl7dmFyIG49ZT09bnVsbD9udWxsOnR5cGVvZiBTeW1ib2w8InUiJiZlW1N5bWJvbC5pdGVyYXRvcl18fGVbIkBAaXRlcmF0b3IiXTtpZihuIT1udWxsKXt2YXIgcixpLG8sbCxzPVtdLGE9ITAsdT0hMTt0cnl7aWYobz0obj1uLmNhbGwoZSkpLm5leHQsdD09PTApe2lmKE9iamVjdChuKSE9PW4pcmV0dXJuO2E9ITF9ZWxzZSBmb3IoOyEoYT0ocj1vLmNhbGwobikpLmRvbmUpJiYocy5wdXNoKHIudmFsdWUpLHMubGVuZ3RoIT09dCk7YT0hMCk7fWNhdGNoKGMpe3U9ITAsaT1jfWZpbmFsbHl7dHJ5e2lmKCFhJiZuLnJldHVybiE9bnVsbCYmKGw9bi5yZXR1cm4oKSxPYmplY3QobCkhPT1sKSlyZXR1cm59ZmluYWxseXtpZih1KXRocm93IGl9fXJldHVybiBzfX1mdW5jdGlvbiBvTigpe3Rocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX1mdW5jdGlvbiBKaShlLHQpe3JldHVybiByTihlKXx8aU4oZSx0KXx8SGcoZSx0KXx8b04oKX1mdW5jdGlvbiBscihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIHkwKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxVdyhyLmtleSkscil9fWZ1bmN0aW9uIHNyKGUsdCxuKXtyZXR1cm4gdCYmeTAoZS5wcm90b3R5cGUsdCksbiYmeTAoZSxuKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxlfWZ1bmN0aW9uIEhwKGUsdCl7cmV0dXJuIEhwPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKHIsaSl7cmV0dXJuIHIuX19wcm90b19fPWkscn0sSHAoZSx0KX1mdW5jdGlvbiB5byhlLHQpe2lmKHR5cGVvZiB0IT0iZnVuY3Rpb24iJiZ0IT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSx0JiZIcChlLHQpfWZ1bmN0aW9uIHhkKGUpe3JldHVybiB4ZD1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihuKXtyZXR1cm4gbi5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihuKX0seGQoZSl9ZnVuY3Rpb24gbE4oKXtpZih0eXBlb2YgUmVmbGVjdD4idSJ8fCFSZWZsZWN0LmNvbnN0cnVjdHx8UmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZih0eXBlb2YgUHJveHk9PSJmdW5jdGlvbiIpcmV0dXJuITA7dHJ5e3JldHVybiBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbixbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaHtyZXR1cm4hMX19ZnVuY3Rpb24gV3coZSl7aWYoZT09PXZvaWQgMCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiBlfWZ1bmN0aW9uIHNOKGUsdCl7aWYodCYmKHR5cGVvZiB0PT0ib2JqZWN0Inx8dHlwZW9mIHQ9PSJmdW5jdGlvbiIpKXJldHVybiB0O2lmKHQhPT12b2lkIDApdGhyb3cgbmV3IFR5cGVFcnJvcigiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWQiKTtyZXR1cm4gV3coZSl9ZnVuY3Rpb24geG8oZSl7dmFyIHQ9bE4oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj14ZChlKSxpO2lmKHQpe3ZhciBvPXhkKHRoaXMpLmNvbnN0cnVjdG9yO2k9UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsbyl9ZWxzZSBpPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBzTih0aGlzLGkpfX12YXIgX289ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7bHIodGhpcyxlKX1yZXR1cm4gc3IoZSxbe2tleToiYXBwZW5kVmFsaWRhdGlvbkVycm9yIix2YWx1ZTpmdW5jdGlvbihuLHIsaSxvKXtyZXR1cm4gbj8obltyXT9uW3JdLnB1c2goe21lc3NhZ2U6aSx2YWx1ZTpvfSk6bltyXT1be21lc3NhZ2U6aSx2YWx1ZTpvfV0sbik6eWUoe30scixbe21lc3NhZ2U6aSx2YWx1ZTpvfV0pfX1dKSxlfSgpLEZjPVN5bWJvbCgiR2V0U2NoZW1hIikscG49U3ltYm9sKCJQYXRoIiksT3Q9U3ltYm9sKCJHZXRTb3VyY2UiKTtmdW5jdGlvbiBhTihlKXtyZXR1cm4gZVtGY119dmFyIFpnPXNyKGZ1bmN0aW9uIGUodCl7bHIodGhpcyxlKSx0aGlzLnNwYW49dH0pLHVOPWZ1bmN0aW9uKGUpe3lvKG4sZSk7dmFyIHQ9eG8obik7ZnVuY3Rpb24gbihyLGkpe3ZhciBvO3JldHVybiBscih0aGlzLG4pLG89dC5jYWxsKHRoaXMsaSkseWUoV3cobyksInR5cGUiLCJTeW0iKSxvLnZhbHVlPXIsb31yZXR1cm4gc3Iobixbe2tleToidHJhbnNwaWxlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlfX1dKSxufShaZyk7bmV3IHVOKCIoKSIpO3ZhciBubj0iX3R5cGUiLFJuPSJfcmVmIixjTj1mdW5jdGlvbihlKXt5byhuLGUpO3ZhciB0PXhvKG4pO2Z1bmN0aW9uIG4ocil7dmFyIGksbz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7cmV0dXJuIGxyKHRoaXMsbiksaT10LmNhbGwodGhpcyksaS5vcHRpb25zPXIsaS5vcHQ9byxpfXJldHVybiBzcihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24oaSxvKXtyZXR1cm4gdGhpcy5vcHQmJm89PW51bGw/ITE6bz09bnVsbD95ZSh7fSxpLFt7bWVzc2FnZToiTm9uLW9wdGlvbmFsIGltYWdlIHdhcyBudWxsIG9yIHVuZGVmaW5lZC4iLHZhbHVlOm99XSk6dHlwZW9mIG9bUm5dIT0ic3RyaW5nIj95ZSh7fSxpLFt7bWVzc2FnZToiSW1hZ2UgZGlkIG5vdCBoYXZlIGEgZmlsZSByZWZlcmVuY2Ugc3RyaW5nLiBHb3Q6ICIuY29uY2F0KHhlKG9bUm5dKSksdmFsdWU6b31dKTpvW25uXSE9PSJmaWxlIj95ZSh7fSxpLFt7bWVzc2FnZToiSW1hZ2UgZGlkIG5vdCBoYXZlIHRoZSB2YWxpZCBmaWxlIGV4dGVuc2lvbiB0eXBlLiBHb3Q6ICIuY29uY2F0KG9bbm5dKSx2YWx1ZTpvfV0pOm8ubWV0YWRhdGE/eWUoe30saSxbe21lc3NhZ2U6IkZvdW5kIG1ldGFkYXRhLCBidXQgaXQgY291bGQgbm90IGJlIHZhbGlkYXRlZC4gSW1hZ2UgbWV0YWRhdGEgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgcmVxdWlyZWQgcHJvcHM6IHdpZHRoIChwb3NpdGl2ZSBudW1iZXIpLCBoZWlnaHQgKHBvc2l0aXZlIG51bWJlcikgYW5kIHNoYTI1NiAoc3RyaW5nIG9mIGxlbmd0aCA2NCBvZiB0aGUgYmFzZTE2IGhhc2gpLiIsdmFsdWU6byxmaXhlczpbImltYWdlOnJlcGxhY2UtbWV0YWRhdGEiXX1dKTp5ZSh7fSxpLFt7bWVzc2FnZToiQ291bGQgbm90IHZhbGlkYXRlIEltYWdlIG1ldGFkYXRhLiIsdmFsdWU6byxmaXhlczpbImltYWdlOmFkZC1tZXRhZGF0YSJdfV0pfX0se2tleToiYXNzZXJ0Iix2YWx1ZTpmdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5vcHQmJmk9PW51bGw/ITA6KGk9PW51bGw/dm9pZCAwOmlbUm5dKT09PSJpbWFnZSImJihpPT1udWxsP3ZvaWQgMDppW25uXSk9PT0iZmlsZSJ9fSx7a2V5OiJvcHRpb25hbCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcy5vcHRpb25zLCEwKX19LHtrZXk6InNlcmlhbGl6ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiaW1hZ2UiLG9wdGlvbnM6dGhpcy5vcHRpb25zLG9wdDp0aGlzLm9wdH19fV0pLG59KF9vKSxWdz1mdW5jdGlvbih0KXt2YXIgbjtpZighdFtSbl0uc3RhcnRzV2l0aCgiL3B1YmxpYyIpKXt2YXIgcjtyZXR1cm57dXJsOnRbUm5dKyI/c2hhMjU2PSIuY29uY2F0KChyPXQubWV0YWRhdGEpPT09bnVsbHx8cj09PXZvaWQgMD92b2lkIDA6ci5zaGEyNTYpLG1ldGFkYXRhOnQubWV0YWRhdGF9fXJldHVybnt1cmw6dFtSbl0uc2xpY2UoNykrIj9zaGEyNTY9Ii5jb25jYXQoKG49dC5tZXRhZGF0YSk9PT1udWxsfHxuPT09dm9pZCAwP3ZvaWQgMDpuLnNoYTI1NiksbWV0YWRhdGE6dC5tZXRhZGF0YX19O2Z1bmN0aW9uIEh3KGUpe3JldHVybiB4ZShlKT09PSJvYmplY3QiJiZlIT09bnVsbCYmZSE9PXZvaWQgMCYmKCJ2YWwiaW4gZXx8InZhbFBhdGgiaW4gZSl9ZnVuY3Rpb24gZE4oZSl7cmV0dXJuIHhlKGUpPT09Im9iamVjdCImJmUhPT1udWxsJiZlIT09dm9pZCAwJiZwbiBpbiBlJiYidmFsImluIGV9ZnVuY3Rpb24gZk4oZSl7cmV0dXJuIGVbcG5dfWZ1bmN0aW9uIGhOKGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfWZ1bmN0aW9uIHgwKGUsdCxuKXtyZXR1cm4gdD9NdChlKE10KHQsbikpKTpNdCh0LG4pfWZ1bmN0aW9uIHFpKGUpe3JldHVybiB4ZShlKT09PSJvYmplY3QiJiZlIT09bnVsbCYmKE90IGluIGV8fHBuIGluIGUpfWZ1bmN0aW9uIE10KGUsdCxuKXtpZih4ZShlKT09PSJvYmplY3QiKXtpZihxaShlKSlyZXR1cm4gZTtpZihIdyhlKSlyZXR1cm4gTXQoZS52YWwsZS52YWxQYXRoKX1pZihlJiZlW1JuXSYmZVtubl09PT0iZmlsZSIpe3ZhciByPWVbUm5dO2lmKHR5cGVvZiByIT0ic3RyaW5nIil0aHJvdyBFcnJvcigiSW52YWxpZCBmaWxlIHJlZjogIityKTtyZXR1cm4gTXQoVncoZSksdCxuKX1zd2l0Y2goeGUoZSkpe2Nhc2UiZnVuY3Rpb24iOmNhc2Uic3ltYm9sIjp0aHJvdyBFcnJvcigiSW52YWxpZCBzZWxlY3RvciB0eXBlOiAiLmNvbmNhdCh4ZShlKSwiOiAiKS5jb25jYXQoZSkpO2Nhc2Uib2JqZWN0IjppZihlIT09bnVsbClyZXR1cm4gbmV3IFByb3h5KGUse2hhczpmdW5jdGlvbihvLGwpe3JldHVybiBsPT09T3R8fGw9PT1wbnx8bD09PSJhbmRUaGVuInx8bD09PUZjPyEwOmwgaW4gb30sZ2V0OmZ1bmN0aW9uKG8sbCl7aWYobD09PU90KXJldHVybiBlO2lmKGw9PT1wbilyZXR1cm4gdDtpZihsPT09RmMpcmV0dXJuIG47aWYobD09PSJhbmRUaGVuIilyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIHgwKGEsZSx0KX07aWYoQXJyYXkuaXNBcnJheShvKSl7aWYobD09PSJmaWx0ZXIiKXJldHVybiBmdW5jdGlvbihhKXt2YXIgdT1vLm1hcChmdW5jdGlvbihjLGQpe3JldHVybiBNdChjLGVyKHQsZCksbj09bnVsbD92b2lkIDA6bi5pdGVtKX0pLmZpbHRlcihmdW5jdGlvbihjKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIF9vP2EuYXNzZXJ0KF8wKGMpKTpfMChhKGMpKX0pO3JldHVybiBNdCh1LHQsbil9O2lmKGw9PT0ibWFwIilyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIHU9by5tYXAoZnVuY3Rpb24oYyxkKXt2YXIgZj1hKE10KGMsZXIodCxkKSxuPT1udWxsP3ZvaWQgMDpuLml0ZW0pLE10KGQpKTtyZXR1cm4gcWkoZik/ZjpNdChmKX0pO3JldHVybiBNdCh1LHQsbil9fWlmKEFycmF5LmlzQXJyYXkobykmJmw9PT0ibGVuZ3RoIilyZXR1cm4gTXQoby5sZW5ndGgpO3ZhciBzPVJlZmxlY3QuZ2V0KG8sbCk7cmV0dXJuIGhOKGUsbCk/TnVtYmVyLmlzTmFOKE51bWJlcihsKSk/TXQocyxlcih0LGwpLG49PW51bGw/dm9pZCAwOm4uaXRlbXNbbF0pOk10KHMsZXIodCxOdW1iZXIobCkpLG49PW51bGw/dm9pZCAwOm4uaXRlbSk6c319KTtkZWZhdWx0OnJldHVybiB5ZSh5ZSh5ZSh7ZXE6ZnVuY3Rpb24obyl7dmFyIGw9bztpZihxaShvKSYmKGw9b1tPdF0sbCBpbnN0YW5jZW9mIFpnKSl0aHJvdyBFcnJvcigiVE9ETzogQ2Fubm90IGV2YWx1YXRlIGVxdWFsaXR5IHdpdGggYW4gRXhwciIpO3JldHVybiBNdChlPT09bCx2b2lkIDApfSxhbmRUaGVuOmZ1bmN0aW9uKG8pe3JldHVybiB4MChvLGU9PT12b2lkIDA/bnVsbDplLHQpfX0sT3QsZT09PXZvaWQgMD9udWxsOmUpLHBuLHQpLEZjLG4pfX1mdW5jdGlvbiBlcihlLHQpe2lmKHhlKHQpPT09InN5bWJvbCIpdGhyb3cgRXJyb3IoIkNhbm5vdCBjcmVhdGUgdmFsIHBhdGggb2YgYXJyYXkgaXRlbSB3aXRoIHN5bWJvbCBwcm9wOiAiLmNvbmNhdCh0LnRvU3RyaW5nKCkpKTtyZXR1cm4gZSYmIiIuY29uY2F0KGUsIi4iKS5jb25jYXQoSlNPTi5zdHJpbmdpZnkodCkpfWZ1bmN0aW9uIF8wKGUpe2lmKHhlKGUpPT09Im9iamVjdCImJihPdCBpbiBlfHxwbiBpbiBlKSl7dmFyIHQ9ZVtPdF07cmV0dXJuIHR9cmV0dXJuIGV9dmFyIEt3PWZ1bmN0aW9uKGUpe3lvKG4sZSk7dmFyIHQ9eG8obik7ZnVuY3Rpb24gbihyKXt2YXIgaSxvPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtyZXR1cm4gbHIodGhpcyxuKSxpPXQuY2FsbCh0aGlzKSxpLml0ZW1zPXIsaS5vcHQ9byxpfXJldHVybiBzcihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24oaSxvKXt2YXIgbD10aGlzLHM9ITE7cmV0dXJuIHRoaXMub3B0JiZvPT1udWxsPyExOnhlKG8pIT09Im9iamVjdCI/eWUoe30saSxbe21lc3NhZ2U6IkV4cGVjdGVkICdvYmplY3QnLCBnb3QgJyIuY29uY2F0KHhlKG8pLCInIil9XSk6QXJyYXkuaXNBcnJheShvKT95ZSh7fSxpLFt7bWVzc2FnZToiRXhwZWN0ZWQgJ29iamVjdCcsIGdvdCAnYXJyYXknIn1dKTooT2JqZWN0LmVudHJpZXModGhpcy5pdGVtcykuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgdT1KaShhLDIpLGM9dVswXSxkPXVbMV0sZj1lcihpLGMpO2lmKCFmKXM9bC5hcHBlbmRWYWxpZGF0aW9uRXJyb3IocyxpLCJJbnRlcm5hbCBlcnJvcjogY291bGQgbm90IGNyZWF0ZSBwYXRoIGF0ICIuY29uY2F0KCFpJiZ0eXBlb2YgaT09InN0cmluZyI/IjxlbXB0eSBzdHJpbmc+IjppLCIgYXQga2V5ICIpLmNvbmNhdChjKSxvKTtlbHNle3ZhciBoPWQudmFsaWRhdGUoZixvW2NdKTtoJiZzP3M9c3Moc3Moe30saCkscyk6aCYmKHM9aCl9fSkscyl9fSx7a2V5OiJhc3NlcnQiLHZhbHVlOmZ1bmN0aW9uKGkpe2lmKHRoaXMub3B0JiZpPT1udWxsKXJldHVybiEwO2lmKCFpKXJldHVybiExO2Zvcih2YXIgbz0wLGw9T2JqZWN0LmVudHJpZXModGhpcy5pdGVtcyk7bzxsLmxlbmd0aDtvKyspe3ZhciBzPUppKGxbb10sMiksYT1zWzBdLHU9c1sxXTtpZighdS5hc3NlcnQoaVthXSkpcmV0dXJuITF9cmV0dXJuIHhlKGkpPT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGkpfX0se2tleToib3B0aW9uYWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMuaXRlbXMsITApfX0se2tleToic2VyaWFsaXplIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOiJvYmplY3QiLGl0ZW1zOk9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0aGlzLml0ZW1zKS5tYXAoZnVuY3Rpb24oaSl7dmFyIG89SmkoaSwyKSxsPW9bMF0scz1vWzFdO3JldHVybltsLHMuc2VyaWFsaXplKCldfSkpLG9wdDp0aGlzLm9wdH19fV0pLG59KF9vKSxwTj1mdW5jdGlvbihlKXt5byhuLGUpO3ZhciB0PXhvKG4pO2Z1bmN0aW9uIG4ocil7dmFyIGksbz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7cmV0dXJuIGxyKHRoaXMsbiksaT10LmNhbGwodGhpcyksaS5pdGVtPXIsaS5vcHQ9byxpfXJldHVybiBzcihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24oaSxvKXt2YXIgbD10aGlzLHM9ITE7cmV0dXJuIHRoaXMub3B0JiZvPT1udWxsPyExOnhlKG8pIT09Im9iamVjdCJ8fCFBcnJheS5pc0FycmF5KG8pP3llKHt9LGksW3ttZXNzYWdlOiJFeHBlY3RlZCAnYXJyYXknLCBnb3QgJyIuY29uY2F0KHhlKG8pLCInIil9XSk6KG8uZm9yRWFjaChmdW5jdGlvbihhLHUpe3ZhciBjPWVyKGksdSk7aWYoIWMpcz1sLmFwcGVuZFZhbGlkYXRpb25FcnJvcihzLGksIkludGVybmFsIGVycm9yOiBjb3VsZCBub3QgY3JlYXRlIHBhdGggYXQgIi5jb25jYXQoIWkmJnR5cGVvZiBpPT0ic3RyaW5nIj8iPGVtcHR5IHN0cmluZz4iOmksIiBhdCBpbmRleCAiKS5jb25jYXQodSksbyk7ZWxzZXt2YXIgZD1sLml0ZW0udmFsaWRhdGUoYyxhKTtkJiZzP3M9c3Moc3Moe30sZCkscyk6ZCYmKHM9ZCl9fSkscyl9fSx7a2V5OiJhc3NlcnQiLHZhbHVlOmZ1bmN0aW9uKGkpe2lmKHRoaXMub3B0JiZpPT1udWxsKXJldHVybiEwO2lmKCFpKXJldHVybiExO3ZhciBvPV9mKGkpLGw7dHJ5e2ZvcihvLnMoKTshKGw9by5uKCkpLmRvbmU7KXt2YXIgcz1sLnZhbHVlO2lmKCF0aGlzLml0ZW0uYXNzZXJ0KHMpKXJldHVybiExfX1jYXRjaChhKXtvLmUoYSl9ZmluYWxseXtvLmYoKX1yZXR1cm4geGUoaSk9PT0ib2JqZWN0IiYmQXJyYXkuaXNBcnJheShpKX19LHtrZXk6Im9wdGlvbmFsIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLml0ZW0sITApfX0se2tleToic2VyaWFsaXplIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOiJhcnJheSIsaXRlbTp0aGlzLml0ZW0uc2VyaWFsaXplKCksb3B0OnRoaXMub3B0fX19XSksbn0oX28pLHcwPWZ1bmN0aW9uKGUpe3lvKG4sZSk7dmFyIHQ9eG8obik7ZnVuY3Rpb24gbihyKXt2YXIgaSxvPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtyZXR1cm4gbHIodGhpcyxuKSxpPXQuY2FsbCh0aGlzKSxpLnZhbHVlPXIsaS5vcHQ9byxpfXJldHVybiBzcihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24oaSxvKXtyZXR1cm4gdGhpcy5vcHQmJm89PW51bGw/ITE6dHlwZW9mIG8hPSJzdHJpbmciP3llKHt9LGksW3ttZXNzYWdlOiJFeHBlY3RlZCAnc3RyaW5nJywgZ290ICciLmNvbmNhdCh4ZShvKSwiJyIpLHZhbHVlOm99XSk6byE9PXRoaXMudmFsdWU/eWUoe30saSxbe21lc3NhZ2U6IkV4cGVjdGVkIGxpdGVyYWwgJyIuY29uY2F0KHRoaXMudmFsdWUsIicsIGdvdCAnIikuY29uY2F0KG8sIiciKSx2YWx1ZTpvfV0pOiExfX0se2tleToiYXNzZXJ0Iix2YWx1ZTpmdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5vcHQmJmk9PW51bGw/ITA6dHlwZW9mIGk9PSJzdHJpbmcifX0se2tleToib3B0aW9uYWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMudmFsdWUsITApfX0se2tleToic2VyaWFsaXplIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOiJsaXRlcmFsIix2YWx1ZTp0aGlzLnZhbHVlLG9wdDp0aGlzLm9wdH19fV0pLG59KF9vKSxtTj1mdW5jdGlvbihlKXt5byhuLGUpO3ZhciB0PXhvKG4pO2Z1bmN0aW9uIG4ocixpKXt2YXIgbyxsPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMTtyZXR1cm4gbHIodGhpcyxuKSxvPXQuY2FsbCh0aGlzKSxvLmtleT1yLG8uaXRlbXM9aSxvLm9wdD1sLG99cmV0dXJuIHNyKG4sW3trZXk6InZhbGlkYXRlIix2YWx1ZTpmdW5jdGlvbihpLG8pe3ZhciBsPW8scz0hMTtpZih0aGlzLm9wdCYmbD09bnVsbClyZXR1cm4hMTtpZighdGhpcy5rZXkpcmV0dXJuIHllKHt9LGksW3ttZXNzYWdlOiJNaXNzaW5nIHJlcXVpcmVkIGZpcnN0IGFyZ3VtZW50IGluIHVuaW9uIn1dKTt2YXIgYT10aGlzLmtleTtpZighQXJyYXkuaXNBcnJheSh0aGlzLml0ZW1zKSlyZXR1cm4geWUoe30saSxbe21lc3NhZ2U6IkEgdW5pb24gc2NoZW1hIG11c3QgdGFrZSBtb3JlIHRoYW4gMSBzY2hlbWEgYXJndW1lbnRzIixmYXRhbDohMH1dKTtpZih0eXBlb2YgYT09InN0cmluZyIpe2lmKHRoaXMuaXRlbXMuc29tZShmdW5jdGlvbihOKXtyZXR1cm4hKE4gaW5zdGFuY2VvZiBLdyl9KSlyZXR1cm4geWUoe30saSxbe21lc3NhZ2U6IktleSBpcyBhIHN0cmluZywgc28gYWxsIHNjaGVtYSBpdGVtcyBtdXN0IGJlIG9iamVjdHMiLGZhdGFsOiEwfV0pO3ZhciB1PXRoaXMuaXRlbXMsYz11Lm1hcChmdW5jdGlvbihOKXtyZXR1cm4gTi5zZXJpYWxpemUoKX0pLGQ9Yy5maWx0ZXIoZnVuY3Rpb24oTil7cmV0dXJuIE4udHlwZSE9PSJvYmplY3QifHxOLml0ZW1zW2FdLnR5cGUhPT0ibGl0ZXJhbCJ9KTtpZihkLmxlbmd0aD4wKXJldHVybiB5ZSh7fSxpLFt7bWVzc2FnZToiQWxsIHNjaGVtYSBpdGVtcyBtdXN0IGJlIG9iamVjdHMgd2l0aCBhIGtleTogIi5jb25jYXQoYSwiIHRoYXQgaXMgYSBsaXRlcmFsIHNjaGVtYS4gRm91bmQ6ICIpLmNvbmNhdChKU09OLnN0cmluZ2lmeShkLG51bGwsMikpLGZhdGFsOiEwfV0pO3ZhciBmPWMsaD1mLmZpbHRlcihmdW5jdGlvbihOKXtyZXR1cm4gTi5pdGVtc1thXS5vcHR9KTtpZihoLmxlbmd0aD4xKXJldHVybiB5ZSh7fSxpLFt7bWVzc2FnZToiU2NoZW1hIGNhbm5vdCBoYXZlIGFuIG9wdGlvbmFsIGtleXM6ICIuY29uY2F0KGEpLGZhdGFsOiEwfV0pO2lmKHhlKGwpIT09Im9iamVjdCIpcmV0dXJuIHllKHt9LGksW3ttZXNzYWdlOiJFeHBlY3RlZCBhbiBvYmplY3QifV0pO3ZhciBtPWw7aWYobVthXT09PXZvaWQgMClyZXR1cm4geWUoe30saSxbe21lc3NhZ2U6Ik1pc3NpbmcgcmVxdWlyZWQga2V5OiAiLmNvbmNhdChhKX1dKTt2YXIgZz1bXSxTPV9mKGYpLHY7dHJ5e2ZvcihTLnMoKTshKHY9Uy5uKCkpLmRvbmU7KXt2YXIgeT12LnZhbHVlLF89eS5pdGVtc1thXTtpZihfLnR5cGU9PT0ibGl0ZXJhbCIpaWYoIWcuaW5jbHVkZXMoXy52YWx1ZSkpZy5wdXNoKF8udmFsdWUpO2Vsc2UgcmV0dXJuIHllKHt9LGksW3ttZXNzYWdlOiJGb3VuZCBkdXBsaWNhdGUga2V5IGluIHNjaGVtYTogIi5jb25jYXQoXy52YWx1ZSksZmF0YWw6ITB9XSl9fWNhdGNoKE4pe1MuZShOKX1maW5hbGx5e1MuZigpfXZhciB3PXUuZmluZChmdW5jdGlvbihOKXtyZXR1cm4hTi5pdGVtc1thXS52YWxpZGF0ZShpLG1bYV0pfSk7aWYoIXcpe3ZhciBFPWVyKGksYSk7aWYoIUUpdGhyb3cgbmV3IEVycm9yKCJJbnRlcm5hbCBlcnJvcjogY291bGQgbm90IGNyZWF0ZSBwYXRoIGF0ICIuY29uY2F0KCFpJiZ0eXBlb2YgaT09InN0cmluZyI/IjxlbXB0eSBzdHJpbmc+IjppLCIgYXQga2V5ICIpLmNvbmNhdChhKSk7cmV0dXJuIHllKHt9LEUsW3ttZXNzYWdlOidJbnZhbGlkIGtleTogIicuY29uY2F0KGEsJyIuIFZhbHVlIHdhczogIicpLmNvbmNhdChtW2FdLCciLiBWYWxpZCB2YWx1ZXM6ICcpLmNvbmNhdChmLm1hcChmdW5jdGlvbihOKXt2YXIgUj1OLml0ZW1zW2FdO2lmKFIudHlwZT09PSJsaXRlcmFsIiYmUi52YWx1ZSlyZXR1cm4nIicuY29uY2F0KFIudmFsdWUsJyInKTt0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIGxpdGVyYWwgc2NoZW1hLCBnb3QgIi5jb25jYXQoSlNPTi5zdHJpbmdpZnkoUixudWxsLDIpKSl9KS5qb2luKCIsICIpKX1dKX12YXIgJD13LnZhbGlkYXRlKGksbSk7aWYoJClyZXR1cm4gJH1lbHNlIGlmKGEgaW5zdGFuY2VvZiB3MCl7aWYodGhpcy5pdGVtcy5zb21lKGZ1bmN0aW9uKE4pe3JldHVybiEoTiBpbnN0YW5jZW9mIHcwKX0pKXJldHVybiB5ZSh7fSxpLFt7bWVzc2FnZToiS2V5IGlzIGEgbGl0ZXJhbCBzY2hlbWEsIHNvIGFsbCBzY2hlbWEgaXRlbXMgbXVzdCBiZSBsaXRlcmFscyIsZmF0YWw6ITB9XSk7dmFyIEM9W2FdLmNvbmNhdChCdyh0aGlzLml0ZW1zKSk7aWYodHlwZW9mIGw9PSJzdHJpbmciKXt2YXIgVD1DLnNvbWUoZnVuY3Rpb24oTil7cmV0dXJuIU4udmFsaWRhdGUoaSxsKX0pO2lmKCFUKXJldHVybiB5ZSh7fSxpLFt7bWVzc2FnZToiVW5pb24gbXVzdCBtYXRjaCBvbmUgb2YgdGhlIGZvbGxvd2luZzogIi5jb25jYXQoQy5tYXAoZnVuY3Rpb24oTil7cmV0dXJuJyInLmNvbmNhdChOLnZhbHVlLCciJyl9KS5qb2luKCIsICIpKX1dKX19ZWxzZSByZXR1cm4geWUoe30saSxbe21lc3NhZ2U6IkV4cGVjdGVkIGEgc3RyaW5nIG9yIGxpdGVyYWwifV0pO3JldHVybiBzfX0se2tleToiYXNzZXJ0Iix2YWx1ZTpmdW5jdGlvbihpKXtyZXR1cm4hMH19LHtrZXk6Im9wdGlvbmFsIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLmtleSx0aGlzLml0ZW1zLCEwKX19LHtrZXk6InNlcmlhbGl6ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIHRoaXMua2V5PT0ic3RyaW5nIj97dHlwZToidW5pb24iLGtleTp0aGlzLmtleSxpdGVtczp0aGlzLml0ZW1zLm1hcChmdW5jdGlvbihpKXtyZXR1cm4gaS5zZXJpYWxpemUoKX0pLG9wdDp0aGlzLm9wdH06e3R5cGU6InVuaW9uIixpdGVtczp0aGlzLml0ZW1zLm1hcChmdW5jdGlvbihpKXtyZXR1cm4gaS5zZXJpYWxpemUoKX0pLG9wdDp0aGlzLm9wdH19fV0pLG59KF9vKSxnTj1mdW5jdGlvbihlKXt5byhuLGUpO3ZhciB0PXhvKG4pO2Z1bmN0aW9uIG4ocil7dmFyIGksbz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7cmV0dXJuIGxyKHRoaXMsbiksaT10LmNhbGwodGhpcyksaS5vcHRpb25zPXIsaS5vcHQ9byxpfXJldHVybiBzcihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24oaSxvKXtyZXR1cm4hMX19LHtrZXk6ImFzc2VydCIsdmFsdWU6ZnVuY3Rpb24oaSl7cmV0dXJuITB9fSx7a2V5OiJvcHRpb25hbCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcy5vcHRpb25zLCEwKX19LHtrZXk6InNlcmlhbGl6ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToicmljaHRleHQiLG9wdDp0aGlzLm9wdH19fV0pLG59KF9vKSx2Tj1mdW5jdGlvbihlKXt5byhuLGUpO3ZhciB0PXhvKG4pO2Z1bmN0aW9uIG4ocil7dmFyIGksbz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7cmV0dXJuIGxyKHRoaXMsbiksaT10LmNhbGwodGhpcyksaS5pdGVtPXIsaS5vcHQ9byxpfXJldHVybiBzcihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24oaSxvKXt2YXIgbD10aGlzLHM9ITE7cmV0dXJuIHRoaXMub3B0JiZvPT1udWxsPyExOnhlKG8pIT09Im9iamVjdCI/eWUoe30saSxbe21lc3NhZ2U6IkV4cGVjdGVkICdvYmplY3QnLCBnb3QgJyIuY29uY2F0KHhlKG8pLCInIil9XSk6QXJyYXkuaXNBcnJheShvKT95ZSh7fSxpLFt7bWVzc2FnZToiRXhwZWN0ZWQgJ29iamVjdCcsIGdvdCAnYXJyYXknIn1dKTooT2JqZWN0LmVudHJpZXMobykuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgdT1KaShhLDIpLGM9dVswXSxkPXVbMV0sZj1lcihpLGMpO2lmKCFmKXM9bC5hcHBlbmRWYWxpZGF0aW9uRXJyb3IocyxpLCJJbnRlcm5hbCBlcnJvcjogY291bGQgbm90IGNyZWF0ZSBwYXRoIGF0ICIuY29uY2F0KCFpJiZ0eXBlb2YgaT09InN0cmluZyI/IjxlbXB0eSBzdHJpbmc+IjppLCIgYXQga2V5ICIpLmNvbmNhdChkKSxvKTtlbHNle3ZhciBoPWwuaXRlbS52YWxpZGF0ZShmLGQpO2gmJnM/cz1zcyhzcyh7fSxoKSxzKTpoJiYocz1oKX19KSxzKX19LHtrZXk6ImFzc2VydCIsdmFsdWU6ZnVuY3Rpb24oaSl7aWYodGhpcy5vcHQmJmk9PW51bGwpcmV0dXJuITA7aWYoIWkpcmV0dXJuITE7Zm9yKHZhciBvPTAsbD1PYmplY3QuZW50cmllcyhpKTtvPGwubGVuZ3RoO28rKyl7dmFyIHM9SmkobFtvXSwyKSxhPXNbMV07aWYoIXRoaXMuaXRlbS5hc3NlcnQoYSkpcmV0dXJuITF9cmV0dXJuIHhlKGkpPT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGkpfX0se2tleToib3B0aW9uYWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMuaXRlbSwhMCl9fSx7a2V5OiJzZXJpYWxpemUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6InJlY29yZCIsaXRlbTp0aGlzLml0ZW0uc2VyaWFsaXplKCksb3B0OnRoaXMub3B0fX19XSksbn0oX28pO2Z1bmN0aW9uIHlOKGUpe3ZhciB0PWVbT3RdO2lmKHQgaW5zdGFuY2VvZiBaZyl0aHJvdyBFcnJvcigiQ2Fubm90IGdldCByYXcgc291cmNlIG9mIGFuIEV4cHIiKTt2YXIgbj10O3JldHVybiBufWZ1bmN0aW9uIHhOKGUpe3JldHVybiBlLmluZGV4T2YoIi4iKT09PS0xP1tlLCIiXTpbZS5zbGljZSgwLGUuaW5kZXhPZigiLiIpKSxlLnNsaWNlKGUuaW5kZXhPZigiLiIpKzEpXX1mdW5jdGlvbiBfTihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEt3fHx4ZShlKT09PSJvYmplY3QiJiYidHlwZSJpbiBlJiZlLnR5cGU9PT0ib2JqZWN0In1mdW5jdGlvbiB3TihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHZOfHx4ZShlKT09PSJvYmplY3QiJiYidHlwZSJpbiBlJiZlLnR5cGU9PT0icmVjb3JkIn1mdW5jdGlvbiBTTihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHBOfHx4ZShlKT09PSJvYmplY3QiJiYidHlwZSJpbiBlJiZlLnR5cGU9PT0iYXJyYXkifWZ1bmN0aW9uIEVOKGUpe3JldHVybiBlIGluc3RhbmNlb2YgbU58fHhlKGUpPT09Im9iamVjdCImJiJ0eXBlImluIGUmJmUudHlwZT09PSJ1bmlvbiJ9ZnVuY3Rpb24gQ04oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBnTnx8eGUoZSk9PT0ib2JqZWN0IiYmInR5cGUiaW4gZSYmZS50eXBlPT09InJpY2h0ZXh0In1mdW5jdGlvbiBrTihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGNOfHx4ZShlKT09PSJvYmplY3QiJiYidHlwZSJpbiBlJiZlLnR5cGU9PT0iaW1hZ2UifWZ1bmN0aW9uICROKGUsdCxuKXtmb3IodmFyIHI9Yk4oZSksaT1CdyhyKSxvPW4sbD10LHM9ZnVuY3Rpb24oKXt2YXIgYz1yLnNoaWZ0KCk7aWYoYz09PXZvaWQgMCl0aHJvdyBFcnJvcigiVW5leHBlY3RlZCB1bmRlZmluZWQgcGFydCIpO2lmKFNOKG8pKXtpZihOdW1iZXIuaXNOYU4oTnVtYmVyKGMpKSl0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiBhcnJheSBzY2hlbWEgIi5jb25jYXQoSlNPTi5zdHJpbmdpZnkobyksIiBtdXN0IGhhdmUgYSBudW1iZXIgYXMgcGF0aCwgYnV0IGdvdCAiKS5jb25jYXQoYywiLiBQYXRoOiAiKS5jb25jYXQoZSkpO2lmKHhlKGwpIT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGwpKXRocm93IEVycm9yKCJTY2hlbWEgdHlwZSBlcnJvcjogZXhwZWN0ZWQgc291cmNlIHRvIGJlIHR5cGUgb2YgYXJyYXksIGJ1dCBnb3QgIi5jb25jYXQoeGUobCkpKTtpZighbFtjXSl7dmFyIGQ7dGhyb3cgRXJyb3IoIkludmFsaWQgcGF0aDogYXJyYXkgc291cmNlIChsZW5ndGg6ICIuY29uY2F0KChkPWwpPT09bnVsbHx8ZD09PXZvaWQgMD92b2lkIDA6ZC5sZW5ndGgsIikgZGlkIG5vdCBoYXZlIGluZGV4ICIpLmNvbmNhdChjLCIgZnJvbSBwYXRoOiAiKS5jb25jYXQoZSkpfWw9bFtjXSxvPW8uaXRlbX1lbHNlIGlmKHdOKG8pKXtpZih0eXBlb2YgYyE9InN0cmluZyIpdGhyb3cgRXJyb3IoIkludmFsaWQgcGF0aDogcmVjb3JkIHNjaGVtYSAiLmNvbmNhdChvLCIgbXVzdCBoYXZlIHBhdGg6ICIpLmNvbmNhdChjLCIgYXMgc3RyaW5nIikpO2lmKHhlKGwpIT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGwpKXRocm93IEVycm9yKCJTY2hlbWEgdHlwZSBlcnJvcjogZXhwZWN0ZWQgc291cmNlIHRvIGJlIHR5cGUgb2YgcmVjb3JkLCBidXQgZ290ICIuY29uY2F0KHhlKGwpKSk7aWYoIWxbY10pdGhyb3cgRXJyb3IoIkludmFsaWQgcGF0aDogcmVjb3JkIHNvdXJjZSBkaWQgbm90IGhhdmUga2V5ICIuY29uY2F0KGMsIiBmcm9tIHBhdGg6ICIpLmNvbmNhdChlKSk7bD1sW2NdLG89by5pdGVtfWVsc2UgaWYoX04obykpe2lmKHhlKGwpIT09Im9iamVjdCIpdGhyb3cgRXJyb3IoIlNjaGVtYSB0eXBlIGVycm9yOiBleHBlY3RlZCBzb3VyY2UgdG8gYmUgdHlwZSBvZiBvYmplY3QsIGJ1dCBnb3QgIi5jb25jYXQoeGUobCkpKTtpZighbFtjXSl0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiBvYmplY3Qgc291cmNlIGRpZCBub3QgaGF2ZSBrZXkgIi5jb25jYXQoYywiIGZyb20gcGF0aDogIikuY29uY2F0KGUpKTtsPWxbY10sbz1vLml0ZW1zW2NdfWVsc2V7aWYoa04obykpcmV0dXJue3Y6e3BhdGg6aS5zbGljZSgwLGkubGVuZ3RoLXIubGVuZ3RoLTEpLm1hcChmdW5jdGlvbihnKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZyl9KS5qb2luKCIuIiksc2NoZW1hOm8sc291cmNlOmx9fTtpZihFTihvKSl7dmFyIGY9by5rZXk7aWYoIWYpcmV0dXJue3Y6e3BhdGg6aS5tYXAoZnVuY3Rpb24oZyl7cmV0dXJuIE51bWJlci5pc05hTihOdW1iZXIoZykpP0pTT04uc3RyaW5naWZ5KGcpOmd9KS5qb2luKCIuIiksc2NoZW1hOm8sc291cmNlOmx9fTt2YXIgaD1sW2ZdO2lmKCFoKXRocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6IHVuaW9uIHNvdXJjZSAiLmNvbmNhdChvLCIgZGlkIG5vdCBoYXZlIHJlcXVpcmVkIGtleSAiKS5jb25jYXQoZiwiIGluIHBhdGg6ICIpLmNvbmNhdChlKSk7dmFyIG09by5pdGVtcy5maW5kKGZ1bmN0aW9uKGcpe3ZhciBTO3JldHVybihnPT1udWxsfHwoUz1nLml0ZW1zKT09PW51bGx8fFM9PT12b2lkIDB8fChTPVNbZl0pPT09bnVsbHx8Uz09PXZvaWQgMD92b2lkIDA6Uy52YWx1ZSk9PT1ofSk7aWYoIW0pdGhyb3cgRXJyb3IoIkludmFsaWQgcGF0aDogdW5pb24gc2NoZW1hICIuY29uY2F0KG8sIiBkaWQgbm90IGhhdmUgYSBjaGlsZCBvYmplY3Qgd2l0aCAiKS5jb25jYXQoZiwiIG9mIHZhbHVlICIpLmNvbmNhdChoLCIgaW4gcGF0aDogIikuY29uY2F0KGUpKTtvPW0uaXRlbXNbY10sbD1sW2NdfWVsc2V7aWYoQ04obykpcmV0dXJue3Y6e3BhdGg6aS5zbGljZSgwLGkubGVuZ3RoLXIubGVuZ3RoLTEpLm1hcChmdW5jdGlvbihnKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZyl9KS5qb2luKCIuIiksc2NoZW1hOm8sc291cmNlOmx9fTt0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiAiLmNvbmNhdChjLCIgcmVzb2x2ZWQgdG8gYW4gdW5leHBlY3RlZCBzY2hlbWEgIikuY29uY2F0KEpTT04uc3RyaW5naWZ5KG8pKSl9fX0sYTtyLmxlbmd0aD4wOylpZihhPXMoKSxhKXJldHVybiBhLnY7aWYoci5sZW5ndGg+MCl0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiAiLmNvbmNhdChyLmpvaW4oIi4iKSwiIGlzIG5vdCBhIHZhbGlkIHBhdGgiKSk7cmV0dXJue3BhdGg6aS5tYXAoZnVuY3Rpb24odSl7cmV0dXJuIE51bWJlci5pc05hTihOdW1iZXIodSkpP0pTT04uc3RyaW5naWZ5KHUpOnV9KS5qb2luKCIuIiksc2NoZW1hOm8sc291cmNlOmx9fWZ1bmN0aW9uIGJOKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDspe3ZhciByPSIiO2lmKGVbbl09PT0nIicpe2ZvcihuKys7bjxlLmxlbmd0aCYmZVtuXSE9PSciJzspZVtuXT09PSJcXCImJmVbbisxXT09PSciJz8ocis9JyInLG4rKyk6cis9ZVtuXSxuKys7aWYoZVtuXSE9PSciJyl7dmFyIGk7dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0ICgiLmNvbmNhdChKU09OLnN0cmluZ2lmeShlKSwiKTogTWlzc2luZyBjbG9zaW5nIGRvdWJsZSBxdW90ZTogIikuY29uY2F0KChpPWVbbl0pIT09bnVsbCYmaSE9PXZvaWQgMD9pOiJhdCBlbmQgb2Ygc3RyaW5nIiwiIChjaGFyOiAiKS5jb25jYXQobiwiOyBsZW5ndGg6ICIpLmNvbmNhdChlLmxlbmd0aCwiKSIpKX19ZWxzZSBmb3IoO248ZS5sZW5ndGgmJmVbbl0hPT0iLiI7KXIrPWVbbl0sbisrO3IhPT0iIiYmdC5wdXNoKHIpLG4rK31yZXR1cm4gdH1mdW5jdGlvbiBUTihlKXtyZXR1cm4gWncoT04oZSkpfWZ1bmN0aW9uIE5OKGUpe3JldHVybiBxaShlKT94ZShlW090XSk9PT0ib2JqZWN0IiYmZVtPdF0hPT1udWxsJiZBcnJheS5pc0FycmF5KGVbT3RdKTpBcnJheS5pc0FycmF5KGUpfWZ1bmN0aW9uIFJOKGUpe3JldHVybiBxaShlKT94ZShlW090XSk9PT0ib2JqZWN0IiYmZVtPdF0hPT1udWxsJiYhQXJyYXkuaXNBcnJheShlW090XSk6eGUoZSk9PT0ib2JqZWN0In1mdW5jdGlvbiBPTihlKXt2YXIgdD1NdChlKTtmdW5jdGlvbiBuKHIpe3ZhciBpPU5OKHIpLG89Uk4ocik7aWYoaSl7dmFyIGw9T3QgaW4gcj9yW090XTpyLHM9cG4gaW4gcj9yW3BuXTp2b2lkIDA7cmV0dXJue3ZhbDpsLm1hcChmdW5jdGlvbihjLGQpe3JldHVybiBuKHFpKGMpP2M6TXQoYyxlcihzLGQpKSl9KSx2YWxQYXRoOnN9fWVsc2UgaWYobyl7dmFyIGE9T3QgaW4gcj9yW090XTpyLHU9cG4gaW4gcj9yW3BuXTp2b2lkIDA7cmV0dXJue3ZhbDphIT09bnVsbCYmT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGEpLm1hcChmdW5jdGlvbihjKXt2YXIgZD1KaShjLDIpLGY9ZFswXSxoPWRbMV07cmV0dXJuW2YsbihxaShoKT9oOk10KGgsZXIodSxmKSkpXX0pKSx2YWxQYXRoOnV9fWVsc2UgcmV0dXJuIHFpKHIpP3t2YWw6bihyW090XSksdmFsUGF0aDpyW3BuXX06cn1yZXR1cm4gbih0KX1mdW5jdGlvbiBLcChlKXt2YXIgdD1IdyhlKT9lLnZhbDplO3N3aXRjaCh4ZSh0KSl7Y2FzZSJmdW5jdGlvbiI6Y2FzZSJzeW1ib2wiOnRocm93IEVycm9yKCJJbnZhbGlkIHZhbCB0eXBlOiAiLmNvbmNhdCh4ZSh0KSkpO2Nhc2Uib2JqZWN0IjpyZXR1cm4gdD09PW51bGw/bnVsbDpBcnJheS5pc0FycmF5KHQpP3QubWFwKEtwKTpPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModCkubWFwKGZ1bmN0aW9uKG4pe3ZhciByPUppKG4sMiksaT1yWzBdLG89clsxXTtyZXR1cm5baSxvJiZLcChvKV19KSk7ZGVmYXVsdDpyZXR1cm4gdH19ZnVuY3Rpb24gWncoZSl7dmFyIHQ9ZS52YWw7c3dpdGNoKHhlKHQpKXtjYXNlImZ1bmN0aW9uIjpjYXNlInN5bWJvbCI6dGhyb3cgRXJyb3IoIkludmFsaWQgdmFsIHR5cGU6ICIuY29uY2F0KHhlKHQpKSk7Y2FzZSJvYmplY3QiOmlmKHQhPT1udWxsKXJldHVybiBuZXcgUHJveHkodCx7aGFzOmZ1bmN0aW9uKHIsaSl7cmV0dXJuIGk9PT0idmFsInx8aT09PXBuPyEwOlMwKHIsaSl9LGdldDpmdW5jdGlvbihyLGkpe2lmKGk9PT1wbilyZXR1cm4gZS52YWxQYXRoO2lmKGk9PT0idmFsIilyZXR1cm4gS3AoZSk7aWYoQXJyYXkuaXNBcnJheShyKSYmaT09PSJsZW5ndGgiKXJldHVybiByLmxlbmd0aDtpZihTMCh0LGkpKXt2YXIgbyxsO3JldHVybiBadyh7dmFsOlJlZmxlY3QuZ2V0KHIsaSkudmFsLHZhbFBhdGg6KG89KGw9UmVmbGVjdC5nZXQocixpKSk9PT1udWxsfHxsPT09dm9pZCAwP3ZvaWQgMDpsLnZhbFBhdGgpIT09bnVsbCYmbyE9PXZvaWQgMD9vOmVyKGUudmFsUGF0aCxBcnJheS5pc0FycmF5KHIpP051bWJlcihpKTppKX0pfXJldHVybiBSZWZsZWN0LmdldChyLGkpfX0pO2RlZmF1bHQ6cmV0dXJuIHllKHllKHt9LHBuLGUudmFsUGF0aCksInZhbCIsZS52YWwpfX1mdW5jdGlvbiBTMChlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX12YXIgUE49WzExMTYzNTI0MDgsMTg5OTQ0NzQ0MSwtMTI0NTY0MzgyNSwtMzczOTU3NzIzLDk2MTk4NzE2MywxNTA4OTcwOTkzLC0xODQxMzMxNTQ4LC0xNDI0MjA0MDc1LC02NzA1ODYyMTYsMzEwNTk4NDAxLDYwNzIyNTI3OCwxNDI2ODgxOTg3LDE5MjUwNzgzODgsLTIxMzI4ODkwOTAsLTE2ODAwNzkxOTMsLTEwNDY3NDQ3MTYsLTQ1OTU3Njg5NSwtMjcyNzQyNTIyLDI2NDM0NzA3OCw2MDQ4MDc2MjgsNzcwMjU1OTgzLDEyNDkxNTAxMjIsMTU1NTA4MTY5MiwxOTk2MDY0OTg2LC0xNzQwNzQ2NDE0LC0xNDczMTMyOTQ3LC0xMzQxOTcwNDg4LC0xMDg0NjUzNjI1LC05NTgzOTU0MDUsLTcxMDQzODU4NSwxMTM5MjY5OTMsMzM4MjQxODk1LDY2NjMwNzIwNSw3NzM1Mjk5MTIsMTI5NDc1NzM3MiwxMzk2MTgyMjkxLDE2OTUxODM3MDAsMTk4NjY2MTA1MSwtMjExNzk0MDk0NiwtMTgzODAxMTI1OSwtMTU2NDQ4MTM3NSwtMTQ3NDY2NDg4NSwtMTAzNTIzNjQ5NiwtOTQ5MjAyNTI1LC03Nzg5MDE0NzksLTY5NDYxNDQ5MiwtMjAwMzk1Mzg3LDI3NTQyMzM0NCw0MzAyMjc3MzQsNTA2OTQ4NjE2LDY1OTA2MDU1Niw4ODM5OTc4NzcsOTU4MTM5NTcxLDEzMjI4MjIyMTgsMTUzNzAwMjA2MywxNzQ3ODczNzc5LDE5NTU1NjIyMjIsMjAyNDEwNDgxNSwtMjA2NzIzNjg0NCwtMTkzMzExNDg3MiwtMTg2NjUzMDgyMiwtMTUzODIzMzEwOSwtMTA5MDkzNTgxNywtOTY1NjQxOTk4XSxWZT1mdW5jdGlvbihlKXtyZXR1cm4gZVtlLmlucHV0Qnl0ZXM9NjRdPSJpbnB1dEJ5dGVzIixlW2UuaW5wdXRXb3Jkcz0xNl09ImlucHV0V29yZHMiLGVbZS5oaWdoSW5kZXg9MTRdPSJoaWdoSW5kZXgiLGVbZS5sb3dJbmRleD0xNV09Imxvd0luZGV4IixlW2Uud29ya1dvcmRzPTY0XT0id29ya1dvcmRzIixlW2UuYWxsb2NCeXRlcz04MF09ImFsbG9jQnl0ZXMiLGVbZS5hbGxvY1dvcmRzPTIwXT0iYWxsb2NXb3JkcyIsZVtlLmFsbG9jVG90YWw9OGUzXT0iYWxsb2NUb3RhbCIsZX0oVmV8fHt9KSxFMD17c2hhMjU2OjF9O2Z1bmN0aW9uIEFOKGUpe2lmKGUmJiFFMFtlXSYmIUUwW2UudG9Mb3dlckNhc2UoKV0pdGhyb3cgbmV3IEVycm9yKCJEaWdlc3QgbWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtyZXR1cm4gbmV3IE1OfXZhciBNTj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtscih0aGlzLGUpLHllKHRoaXMsIkEiLDE3NzkwMzM3MDMpLHllKHRoaXMsIkIiLC0xMTUwODMzMDE5KSx5ZSh0aGlzLCJDIiwxMDEzOTA0MjQyKSx5ZSh0aGlzLCJEIiwtMTUyMTQ4NjUzNCkseWUodGhpcywiRSIsMTM1OTg5MzExOSkseWUodGhpcywiRiIsLTE2OTQxNDQzNzIpLHllKHRoaXMsIkciLDUyODczNDYzNSkseWUodGhpcywiSCIsMTU0MTQ1OTIyNSkseWUodGhpcywiX3NpemUiLDApLHllKHRoaXMsIl9zcCIsMCksKCFmY3x8WnM+PVZlLmFsbG9jVG90YWwpJiYoZmM9bmV3IEFycmF5QnVmZmVyKFZlLmFsbG9jVG90YWwpLFpzPTApLHRoaXMuX2J5dGU9bmV3IFVpbnQ4QXJyYXkoZmMsWnMsVmUuYWxsb2NCeXRlcyksdGhpcy5fd29yZD1uZXcgSW50MzJBcnJheShmYyxacyxWZS5hbGxvY1dvcmRzKSxacys9VmUuYWxsb2NCeXRlc31yZXR1cm4gc3IoZSxbe2tleToidXBkYXRlIix2YWx1ZTpmdW5jdGlvbihuKXtpZih0eXBlb2Ygbj09InN0cmluZyIpcmV0dXJuIHRoaXMuX3V0Zjgobik7aWYobj09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIHR5cGU6ICIreGUobikpO3ZhciByPW4uYnl0ZU9mZnNldCxpPW4uYnl0ZUxlbmd0aCxvPWkvVmUuaW5wdXRCeXRlc3wwLGw9MDtpZihvJiYhKHImMykmJiEodGhpcy5fc2l6ZSVWZS5pbnB1dEJ5dGVzKSl7Zm9yKHZhciBzPW5ldyBJbnQzMkFycmF5KG4uYnVmZmVyLHIsbypWZS5pbnB1dFdvcmRzKTtvLS07KXRoaXMuX2ludDMyKHMsbD4+MiksbCs9VmUuaW5wdXRCeXRlczt0aGlzLl9zaXplKz1sfXZhciBhPW4uQllURVNfUEVSX0VMRU1FTlQ7aWYoYSE9PTEmJm4uYnVmZmVyKXt2YXIgdT1uZXcgVWludDhBcnJheShuLmJ1ZmZlcixyK2wsaS1sKTtyZXR1cm4gdGhpcy5fdWludDgodSl9cmV0dXJuIGw9PT1pP3RoaXM6dGhpcy5fdWludDgobixsKX19LHtrZXk6Il91aW50OCIsdmFsdWU6ZnVuY3Rpb24obixyKXt2YXIgaT10aGlzLl9ieXRlLG89dGhpcy5fd29yZCxsPW4ubGVuZ3RoO2ZvcihyPXJ8MDtyPGw7KXtmb3IodmFyIHM9dGhpcy5fc2l6ZSVWZS5pbnB1dEJ5dGVzLGE9cztyPGwmJmE8VmUuaW5wdXRCeXRlczspaVthKytdPW5bcisrXTthPj1WZS5pbnB1dEJ5dGVzJiZ0aGlzLl9pbnQzMihvKSx0aGlzLl9zaXplKz1hLXN9cmV0dXJuIHRoaXN9fSx7a2V5OiJfdXRmOCIsdmFsdWU6ZnVuY3Rpb24obil7Zm9yKHZhciByPXRoaXMuX2J5dGUsaT10aGlzLl93b3JkLG89bi5sZW5ndGgsbD10aGlzLl9zcCxzPTA7czxvOyl7Zm9yKHZhciBhPXRoaXMuX3NpemUlVmUuaW5wdXRCeXRlcyx1PWE7czxvJiZ1PFZlLmlucHV0Qnl0ZXM7KXt2YXIgYz1uLmNoYXJDb2RlQXQocysrKXwwO2M8MTI4P3JbdSsrXT1jOmM8MjA0OD8oclt1KytdPTE5MnxjPj4+NixyW3UrK109MTI4fGMmNjMpOmM8NTUyOTZ8fGM+NTczNDM/KHJbdSsrXT0yMjR8Yz4+PjEyLHJbdSsrXT0xMjh8Yz4+PjYmNjMsclt1KytdPTEyOHxjJjYzKTpsPyhjPSgobCYxMDIzKTw8MTApKyhjJjEwMjMpKzY1NTM2LHJbdSsrXT0yNDB8Yz4+PjE4LHJbdSsrXT0xMjh8Yz4+PjEyJjYzLHJbdSsrXT0xMjh8Yz4+PjYmNjMsclt1KytdPTEyOHxjJjYzLGw9MCk6bD1jfXU+PVZlLmlucHV0Qnl0ZXMmJih0aGlzLl9pbnQzMihpKSxpWzBdPWlbVmUuaW5wdXRXb3Jkc10pLHRoaXMuX3NpemUrPXUtYX1yZXR1cm4gdGhpcy5fc3A9bCx0aGlzfX0se2tleToiX2ludDMyIix2YWx1ZTpmdW5jdGlvbihuLHIpe3ZhciBpPXRoaXMuQSxvPXRoaXMuQixsPXRoaXMuQyxzPXRoaXMuRCxhPXRoaXMuRSx1PXRoaXMuRixjPXRoaXMuRyxkPXRoaXMuSCxmPTA7Zm9yKHI9cnwwO2Y8VmUuaW5wdXRXb3Jkczspa29bZisrXT1mcihuW3IrK10pO2ZvcihmPVZlLmlucHV0V29yZHM7ZjxWZS53b3JrV29yZHM7ZisrKWtvW2ZdPVVOKGtvW2YtMl0pK2tvW2YtN10rQk4oa29bZi0xNV0pK2tvW2YtMTZdfDA7Zm9yKGY9MDtmPFZlLndvcmtXb3JkcztmKyspe3ZhciBoPWQrRk4oYSkrTE4oYSx1LGMpK1BOW2ZdK2tvW2ZdfDAsbT16TihpKStqTihpLG8sbCl8MDtkPWMsYz11LHU9YSxhPXMraHwwLHM9bCxsPW8sbz1pLGk9aCttfDB9dGhpcy5BPWkrdGhpcy5BfDAsdGhpcy5CPW8rdGhpcy5CfDAsdGhpcy5DPWwrdGhpcy5DfDAsdGhpcy5EPXMrdGhpcy5EfDAsdGhpcy5FPWErdGhpcy5FfDAsdGhpcy5GPXUrdGhpcy5GfDAsdGhpcy5HPWMrdGhpcy5HfDAsdGhpcy5IPWQrdGhpcy5IfDB9fSx7a2V5OiJkaWdlc3QiLHZhbHVlOmZ1bmN0aW9uKG4pe3ZhciByPXRoaXMuX2J5dGUsaT10aGlzLl93b3JkLG89dGhpcy5fc2l6ZSVWZS5pbnB1dEJ5dGVzfDA7Zm9yKHJbbysrXT0xMjg7byYzOylyW28rK109MDtpZihvPj49MixvPlZlLmhpZ2hJbmRleCl7Zm9yKDtvPFZlLmlucHV0V29yZHM7KWlbbysrXT0wO289MCx0aGlzLl9pbnQzMihpKX1mb3IoO288VmUuaW5wdXRXb3JkczspaVtvKytdPTA7dmFyIGw9dGhpcy5fc2l6ZSo4LHM9KGwmNDI5NDk2NzI5NSk+Pj4wLGE9KGwtcykvNDI5NDk2NzI5NjtyZXR1cm4gYSYmKGlbVmUuaGlnaEluZGV4XT1mcihhKSkscyYmKGlbVmUubG93SW5kZXhdPWZyKHMpKSx0aGlzLl9pbnQzMihpKSxuPT09ImhleCI/dGhpcy5faGV4KCk6dGhpcy5fYmluKCl9fSx7a2V5OiJfaGV4Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBuPXRoaXMuQSxyPXRoaXMuQixpPXRoaXMuQyxvPXRoaXMuRCxsPXRoaXMuRSxzPXRoaXMuRixhPXRoaXMuRyx1PXRoaXMuSDtyZXR1cm4gYmkobikrYmkocikrYmkoaSkrYmkobykrYmkobCkrYmkocykrYmkoYSkrYmkodSl9fSx7a2V5OiJfYmluIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBuPXRoaXMuQSxyPXRoaXMuQixpPXRoaXMuQyxvPXRoaXMuRCxsPXRoaXMuRSxzPXRoaXMuRixhPXRoaXMuRyx1PXRoaXMuSCxjPXRoaXMuX2J5dGUsZD10aGlzLl93b3JkO3JldHVybiBkWzBdPWZyKG4pLGRbMV09ZnIociksZFsyXT1mcihpKSxkWzNdPWZyKG8pLGRbNF09ZnIobCksZFs1XT1mcihzKSxkWzZdPWZyKGEpLGRbN109ZnIodSksYy5zbGljZSgwLDMyKX19XSksZX0oKSxrbz1uZXcgSW50MzJBcnJheShWZS53b3JrV29yZHMpLGZjLFpzPTAsYmk9ZnVuY3Rpb24odCl7cmV0dXJuKHQrNDI5NDk2NzI5NikudG9TdHJpbmcoMTYpLnN1YnN0cigtOCl9LEROPWZ1bmN0aW9uKHQpe3JldHVybiB0PDwyNCY0Mjc4MTkwMDgwfHQ8PDgmMTY3MTE2ODB8dD4+OCY2NTI4MHx0Pj4yNCYyNTV9LElOPWZ1bmN0aW9uKHQpe3JldHVybiB0fSxmcj1XTigpP0lOOkROLExOPWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gcl50JihuXnIpfSxqTj1mdW5jdGlvbih0LG4scil7cmV0dXJuIHQmbnxyJih0fG4pfSx6Tj1mdW5jdGlvbih0KXtyZXR1cm4odD4+PjJ8dDw8MzApXih0Pj4+MTN8dDw8MTkpXih0Pj4+MjJ8dDw8MTApfSxGTj1mdW5jdGlvbih0KXtyZXR1cm4odD4+PjZ8dDw8MjYpXih0Pj4+MTF8dDw8MjEpXih0Pj4+MjV8dDw8Nyl9LEJOPWZ1bmN0aW9uKHQpe3JldHVybih0Pj4+N3x0PDwyNSleKHQ+Pj4xOHx0PDwxNCledD4+PjN9LFVOPWZ1bmN0aW9uKHQpe3JldHVybih0Pj4+MTd8dDw8MTUpXih0Pj4+MTl8dDw8MTMpXnQ+Pj4xMH07ZnVuY3Rpb24gV04oKXt2YXIgZT1uZXcgVWludDhBcnJheShuZXcgVWludDE2QXJyYXkoWzY1Mjc5XSkuYnVmZmVyKTtyZXR1cm4gZVswXT09PTI1NH12YXIgVk49ZnVuY3Rpb24odCl7cmV0dXJuIEFOKCkudXBkYXRlKHQpLmRpZ2VzdCgiaGV4Iil9O2Z1bmN0aW9uIEphKCl7SmE9ZnVuY3Rpb24oKXtyZXR1cm4gdH07dmFyIGUsdD17fSxuPU9iamVjdC5wcm90b3R5cGUscj1uLmhhc093blByb3BlcnR5LGk9T2JqZWN0LmRlZmluZVByb3BlcnR5fHxmdW5jdGlvbihPLEEsayl7T1tBXT1rLnZhbHVlfSxvPXR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiI/U3ltYm9sOnt9LGw9by5pdGVyYXRvcnx8IkBAaXRlcmF0b3IiLHM9by5hc3luY0l0ZXJhdG9yfHwiQEBhc3luY0l0ZXJhdG9yIixhPW8udG9TdHJpbmdUYWd8fCJAQHRvU3RyaW5nVGFnIjtmdW5jdGlvbiB1KE8sQSxrKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sQSx7dmFsdWU6ayxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pLE9bQV19dHJ5e3Uoe30sIiIpfWNhdGNoe3U9ZnVuY3Rpb24oQSxrLGope3JldHVybiBBW2tdPWp9fWZ1bmN0aW9uIGMoTyxBLGssail7dmFyIEw9QSYmQS5wcm90b3R5cGUgaW5zdGFuY2VvZiB2P0E6dixaPU9iamVjdC5jcmVhdGUoTC5wcm90b3R5cGUpLG5lPW5ldyBWKGp8fFtdKTtyZXR1cm4gaShaLCJfaW52b2tlIix7dmFsdWU6UihPLGssbmUpfSksWn1mdW5jdGlvbiBkKE8sQSxrKXt0cnl7cmV0dXJue3R5cGU6Im5vcm1hbCIsYXJnOk8uY2FsbChBLGspfX1jYXRjaChqKXtyZXR1cm57dHlwZToidGhyb3ciLGFyZzpqfX19dC53cmFwPWM7dmFyIGY9InN1c3BlbmRlZFN0YXJ0IixoPSJzdXNwZW5kZWRZaWVsZCIsbT0iZXhlY3V0aW5nIixnPSJjb21wbGV0ZWQiLFM9e307ZnVuY3Rpb24gdigpe31mdW5jdGlvbiB5KCl7fWZ1bmN0aW9uIF8oKXt9dmFyIHc9e307dSh3LGwsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pO3ZhciBFPU9iamVjdC5nZXRQcm90b3R5cGVPZiwkPUUmJkUoRShLKFtdKSkpOyQmJiQhPT1uJiZyLmNhbGwoJCxsKSYmKHc9JCk7dmFyIEM9Xy5wcm90b3R5cGU9di5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh3KTtmdW5jdGlvbiBUKE8pe1sibmV4dCIsInRocm93IiwicmV0dXJuIl0uZm9yRWFjaChmdW5jdGlvbihBKXt1KE8sQSxmdW5jdGlvbihrKXtyZXR1cm4gdGhpcy5faW52b2tlKEEsayl9KX0pfWZ1bmN0aW9uIE4oTyxBKXtmdW5jdGlvbiBrKEwsWixuZSxrZSl7dmFyIHZlPWQoT1tMXSxPLFopO2lmKHZlLnR5cGUhPT0idGhyb3ciKXt2YXIgV2U9dmUuYXJnLEZlPVdlLnZhbHVlO3JldHVybiBGZSYmdHlwZW9mIEZlPT0ib2JqZWN0IiYmci5jYWxsKEZlLCJfX2F3YWl0Iik/QS5yZXNvbHZlKEZlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odGUpe2soIm5leHQiLHRlLG5lLGtlKX0sZnVuY3Rpb24odGUpe2soInRocm93Iix0ZSxuZSxrZSl9KTpBLnJlc29sdmUoRmUpLnRoZW4oZnVuY3Rpb24odGUpe1dlLnZhbHVlPXRlLG5lKFdlKX0sZnVuY3Rpb24odGUpe3JldHVybiBrKCJ0aHJvdyIsdGUsbmUsa2UpfSl9a2UodmUuYXJnKX12YXIgajtpKHRoaXMsIl9pbnZva2UiLHt2YWx1ZTpmdW5jdGlvbihMLFope2Z1bmN0aW9uIG5lKCl7cmV0dXJuIG5ldyBBKGZ1bmN0aW9uKGtlLHZlKXtrKEwsWixrZSx2ZSl9KX1yZXR1cm4gaj1qP2oudGhlbihuZSxuZSk6bmUoKX19KX1mdW5jdGlvbiBSKE8sQSxrKXt2YXIgaj1mO3JldHVybiBmdW5jdGlvbihMLFope2lmKGo9PT1tKXRocm93IG5ldyBFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZyIpO2lmKGo9PT1nKXtpZihMPT09InRocm93Iil0aHJvdyBaO3JldHVybnt2YWx1ZTplLGRvbmU6ITB9fWZvcihrLm1ldGhvZD1MLGsuYXJnPVo7Oyl7dmFyIG5lPWsuZGVsZWdhdGU7aWYobmUpe3ZhciBrZT1EKG5lLGspO2lmKGtlKXtpZihrZT09PVMpY29udGludWU7cmV0dXJuIGtlfX1pZihrLm1ldGhvZD09PSJuZXh0IilrLnNlbnQ9ay5fc2VudD1rLmFyZztlbHNlIGlmKGsubWV0aG9kPT09InRocm93Iil7aWYoaj09PWYpdGhyb3cgaj1nLGsuYXJnO2suZGlzcGF0Y2hFeGNlcHRpb24oay5hcmcpfWVsc2Ugay5tZXRob2Q9PT0icmV0dXJuIiYmay5hYnJ1cHQoInJldHVybiIsay5hcmcpO2o9bTt2YXIgdmU9ZChPLEEsayk7aWYodmUudHlwZT09PSJub3JtYWwiKXtpZihqPWsuZG9uZT9nOmgsdmUuYXJnPT09Uyljb250aW51ZTtyZXR1cm57dmFsdWU6dmUuYXJnLGRvbmU6ay5kb25lfX12ZS50eXBlPT09InRocm93IiYmKGo9ZyxrLm1ldGhvZD0idGhyb3ciLGsuYXJnPXZlLmFyZyl9fX1mdW5jdGlvbiBEKE8sQSl7dmFyIGs9QS5tZXRob2Qsaj1PLml0ZXJhdG9yW2tdO2lmKGo9PT1lKXJldHVybiBBLmRlbGVnYXRlPW51bGwsaz09PSJ0aHJvdyImJk8uaXRlcmF0b3IucmV0dXJuJiYoQS5tZXRob2Q9InJldHVybiIsQS5hcmc9ZSxEKE8sQSksQS5tZXRob2Q9PT0idGhyb3ciKXx8ayE9PSJyZXR1cm4iJiYoQS5tZXRob2Q9InRocm93IixBLmFyZz1uZXcgVHlwZUVycm9yKCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICciK2srIicgbWV0aG9kIikpLFM7dmFyIEw9ZChqLE8uaXRlcmF0b3IsQS5hcmcpO2lmKEwudHlwZT09PSJ0aHJvdyIpcmV0dXJuIEEubWV0aG9kPSJ0aHJvdyIsQS5hcmc9TC5hcmcsQS5kZWxlZ2F0ZT1udWxsLFM7dmFyIFo9TC5hcmc7cmV0dXJuIFo/Wi5kb25lPyhBW08ucmVzdWx0TmFtZV09Wi52YWx1ZSxBLm5leHQ9Ty5uZXh0TG9jLEEubWV0aG9kIT09InJldHVybiImJihBLm1ldGhvZD0ibmV4dCIsQS5hcmc9ZSksQS5kZWxlZ2F0ZT1udWxsLFMpOlo6KEEubWV0aG9kPSJ0aHJvdyIsQS5hcmc9bmV3IFR5cGVFcnJvcigiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3QiKSxBLmRlbGVnYXRlPW51bGwsUyl9ZnVuY3Rpb24gRihPKXt2YXIgQT17dHJ5TG9jOk9bMF19OzEgaW4gTyYmKEEuY2F0Y2hMb2M9T1sxXSksMiBpbiBPJiYoQS5maW5hbGx5TG9jPU9bMl0sQS5hZnRlckxvYz1PWzNdKSx0aGlzLnRyeUVudHJpZXMucHVzaChBKX1mdW5jdGlvbiBzZShPKXt2YXIgQT1PLmNvbXBsZXRpb258fHt9O0EudHlwZT0ibm9ybWFsIixkZWxldGUgQS5hcmcsTy5jb21wbGV0aW9uPUF9ZnVuY3Rpb24gVihPKXt0aGlzLnRyeUVudHJpZXM9W3t0cnlMb2M6InJvb3QifV0sTy5mb3JFYWNoKEYsdGhpcyksdGhpcy5yZXNldCghMCl9ZnVuY3Rpb24gSyhPKXtpZihPfHxPPT09IiIpe3ZhciBBPU9bbF07aWYoQSlyZXR1cm4gQS5jYWxsKE8pO2lmKHR5cGVvZiBPLm5leHQ9PSJmdW5jdGlvbiIpcmV0dXJuIE87aWYoIWlzTmFOKE8ubGVuZ3RoKSl7dmFyIGs9LTEsaj1mdW5jdGlvbiBMKCl7Zm9yKDsrK2s8Ty5sZW5ndGg7KWlmKHIuY2FsbChPLGspKXJldHVybiBMLnZhbHVlPU9ba10sTC5kb25lPSExLEw7cmV0dXJuIEwudmFsdWU9ZSxMLmRvbmU9ITAsTH07cmV0dXJuIGoubmV4dD1qfX10aHJvdyBuZXcgVHlwZUVycm9yKHR5cGVvZiBPKyIgaXMgbm90IGl0ZXJhYmxlIil9cmV0dXJuIHkucHJvdG90eXBlPV8saShDLCJjb25zdHJ1Y3RvciIse3ZhbHVlOl8sY29uZmlndXJhYmxlOiEwfSksaShfLCJjb25zdHJ1Y3RvciIse3ZhbHVlOnksY29uZmlndXJhYmxlOiEwfSkseS5kaXNwbGF5TmFtZT11KF8sYSwiR2VuZXJhdG9yRnVuY3Rpb24iKSx0LmlzR2VuZXJhdG9yRnVuY3Rpb249ZnVuY3Rpb24oTyl7dmFyIEE9dHlwZW9mIE89PSJmdW5jdGlvbiImJk8uY29uc3RydWN0b3I7cmV0dXJuISFBJiYoQT09PXl8fChBLmRpc3BsYXlOYW1lfHxBLm5hbWUpPT09IkdlbmVyYXRvckZ1bmN0aW9uIil9LHQubWFyaz1mdW5jdGlvbihPKXtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihPLF8pOihPLl9fcHJvdG9fXz1fLHUoTyxhLCJHZW5lcmF0b3JGdW5jdGlvbiIpKSxPLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEMpLE99LHQuYXdyYXA9ZnVuY3Rpb24oTyl7cmV0dXJue19fYXdhaXQ6T319LFQoTi5wcm90b3R5cGUpLHUoTi5wcm90b3R5cGUscyxmdW5jdGlvbigpe3JldHVybiB0aGlzfSksdC5Bc3luY0l0ZXJhdG9yPU4sdC5hc3luYz1mdW5jdGlvbihPLEEsayxqLEwpe0w9PT12b2lkIDAmJihMPVByb21pc2UpO3ZhciBaPW5ldyBOKGMoTyxBLGssaiksTCk7cmV0dXJuIHQuaXNHZW5lcmF0b3JGdW5jdGlvbihBKT9aOloubmV4dCgpLnRoZW4oZnVuY3Rpb24obmUpe3JldHVybiBuZS5kb25lP25lLnZhbHVlOloubmV4dCgpfSl9LFQoQyksdShDLGEsIkdlbmVyYXRvciIpLHUoQyxsLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSx1KEMsInRvU3RyaW5nIixmdW5jdGlvbigpe3JldHVybiJbb2JqZWN0IEdlbmVyYXRvcl0ifSksdC5rZXlzPWZ1bmN0aW9uKE8pe3ZhciBBPU9iamVjdChPKSxrPVtdO2Zvcih2YXIgaiBpbiBBKWsucHVzaChqKTtyZXR1cm4gay5yZXZlcnNlKCksZnVuY3Rpb24gTCgpe2Zvcig7ay5sZW5ndGg7KXt2YXIgWj1rLnBvcCgpO2lmKFogaW4gQSlyZXR1cm4gTC52YWx1ZT1aLEwuZG9uZT0hMSxMfXJldHVybiBMLmRvbmU9ITAsTH19LHQudmFsdWVzPUssVi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlYscmVzZXQ6ZnVuY3Rpb24oTyl7aWYodGhpcy5wcmV2PTAsdGhpcy5uZXh0PTAsdGhpcy5zZW50PXRoaXMuX3NlbnQ9ZSx0aGlzLmRvbmU9ITEsdGhpcy5kZWxlZ2F0ZT1udWxsLHRoaXMubWV0aG9kPSJuZXh0Iix0aGlzLmFyZz1lLHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHNlKSwhTylmb3IodmFyIEEgaW4gdGhpcylBLmNoYXJBdCgwKT09PSJ0IiYmci5jYWxsKHRoaXMsQSkmJiFpc05hTigrQS5zbGljZSgxKSkmJih0aGlzW0FdPWUpfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5kb25lPSEwO3ZhciBPPXRoaXMudHJ5RW50cmllc1swXS5jb21wbGV0aW9uO2lmKE8udHlwZT09PSJ0aHJvdyIpdGhyb3cgTy5hcmc7cmV0dXJuIHRoaXMucnZhbH0sZGlzcGF0Y2hFeGNlcHRpb246ZnVuY3Rpb24oTyl7aWYodGhpcy5kb25lKXRocm93IE87dmFyIEE9dGhpcztmdW5jdGlvbiBrKHZlLFdlKXtyZXR1cm4gWi50eXBlPSJ0aHJvdyIsWi5hcmc9TyxBLm5leHQ9dmUsV2UmJihBLm1ldGhvZD0ibmV4dCIsQS5hcmc9ZSksISFXZX1mb3IodmFyIGo9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2o+PTA7LS1qKXt2YXIgTD10aGlzLnRyeUVudHJpZXNbal0sWj1MLmNvbXBsZXRpb247aWYoTC50cnlMb2M9PT0icm9vdCIpcmV0dXJuIGsoImVuZCIpO2lmKEwudHJ5TG9jPD10aGlzLnByZXYpe3ZhciBuZT1yLmNhbGwoTCwiY2F0Y2hMb2MiKSxrZT1yLmNhbGwoTCwiZmluYWxseUxvYyIpO2lmKG5lJiZrZSl7aWYodGhpcy5wcmV2PEwuY2F0Y2hMb2MpcmV0dXJuIGsoTC5jYXRjaExvYywhMCk7aWYodGhpcy5wcmV2PEwuZmluYWxseUxvYylyZXR1cm4gayhMLmZpbmFsbHlMb2MpfWVsc2UgaWYobmUpe2lmKHRoaXMucHJldjxMLmNhdGNoTG9jKXJldHVybiBrKEwuY2F0Y2hMb2MsITApfWVsc2V7aWYoIWtlKXRocm93IG5ldyBFcnJvcigidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHkiKTtpZih0aGlzLnByZXY8TC5maW5hbGx5TG9jKXJldHVybiBrKEwuZmluYWxseUxvYyl9fX19LGFicnVwdDpmdW5jdGlvbihPLEEpe2Zvcih2YXIgaz10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7az49MDstLWspe3ZhciBqPXRoaXMudHJ5RW50cmllc1trXTtpZihqLnRyeUxvYzw9dGhpcy5wcmV2JiZyLmNhbGwoaiwiZmluYWxseUxvYyIpJiZ0aGlzLnByZXY8ai5maW5hbGx5TG9jKXt2YXIgTD1qO2JyZWFrfX1MJiYoTz09PSJicmVhayJ8fE89PT0iY29udGludWUiKSYmTC50cnlMb2M8PUEmJkE8PUwuZmluYWxseUxvYyYmKEw9bnVsbCk7dmFyIFo9TD9MLmNvbXBsZXRpb246e307cmV0dXJuIFoudHlwZT1PLFouYXJnPUEsTD8odGhpcy5tZXRob2Q9Im5leHQiLHRoaXMubmV4dD1MLmZpbmFsbHlMb2MsUyk6dGhpcy5jb21wbGV0ZShaKX0sY29tcGxldGU6ZnVuY3Rpb24oTyxBKXtpZihPLnR5cGU9PT0idGhyb3ciKXRocm93IE8uYXJnO3JldHVybiBPLnR5cGU9PT0iYnJlYWsifHxPLnR5cGU9PT0iY29udGludWUiP3RoaXMubmV4dD1PLmFyZzpPLnR5cGU9PT0icmV0dXJuIj8odGhpcy5ydmFsPXRoaXMuYXJnPU8uYXJnLHRoaXMubWV0aG9kPSJyZXR1cm4iLHRoaXMubmV4dD0iZW5kIik6Ty50eXBlPT09Im5vcm1hbCImJkEmJih0aGlzLm5leHQ9QSksU30sZmluaXNoOmZ1bmN0aW9uKE8pe2Zvcih2YXIgQT10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7QT49MDstLUEpe3ZhciBrPXRoaXMudHJ5RW50cmllc1tBXTtpZihrLmZpbmFsbHlMb2M9PT1PKXJldHVybiB0aGlzLmNvbXBsZXRlKGsuY29tcGxldGlvbixrLmFmdGVyTG9jKSxzZShrKSxTfX0sY2F0Y2g6ZnVuY3Rpb24oTyl7Zm9yKHZhciBBPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtBPj0wOy0tQSl7dmFyIGs9dGhpcy50cnlFbnRyaWVzW0FdO2lmKGsudHJ5TG9jPT09Tyl7dmFyIGo9ay5jb21wbGV0aW9uO2lmKGoudHlwZT09PSJ0aHJvdyIpe3ZhciBMPWouYXJnO3NlKGspfXJldHVybiBMfX10aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpfSxkZWxlZ2F0ZVlpZWxkOmZ1bmN0aW9uKE8sQSxrKXtyZXR1cm4gdGhpcy5kZWxlZ2F0ZT17aXRlcmF0b3I6SyhPKSxyZXN1bHROYW1lOkEsbmV4dExvYzprfSx0aGlzLm1ldGhvZD09PSJuZXh0IiYmKHRoaXMuYXJnPWUpLFN9fSx0fWZ1bmN0aW9uIEMwKGUsdCxuLHIsaSxvLGwpe3RyeXt2YXIgcz1lW29dKGwpLGE9cy52YWx1ZX1jYXRjaCh1KXtuKHUpO3JldHVybn1zLmRvbmU/dChhKTpQcm9taXNlLnJlc29sdmUoYSkudGhlbihyLGkpfWZ1bmN0aW9uIEd3KGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXRoaXMsbj1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHIsaSl7dmFyIG89ZS5hcHBseSh0LG4pO2Z1bmN0aW9uIGwoYSl7QzAobyxyLGksbCxzLCJuZXh0IixhKX1mdW5jdGlvbiBzKGEpe0MwKG8scixpLGwscywidGhyb3ciLGEpfWwodm9pZCAwKX0pfX12YXIgSE49ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe2xyKHRoaXMsZSksdGhpcy5ob3N0PXR9cmV0dXJuIHNyKGUsW3trZXk6ImdldERpc2FibGVVcmwiLHZhbHVlOmZ1bmN0aW9uKG4pe3JldHVybiIiLmNvbmNhdCh0aGlzLmhvc3QsIi9kaXNhYmxlP3JlZGlyZWN0X3RvPSIpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQobikpfX0se2tleToiZ2V0TG9naW5VcmwiLHZhbHVlOmZ1bmN0aW9uKG4pe3JldHVybiIiLmNvbmNhdCh0aGlzLmhvc3QsIi9hdXRob3JpemU/cmVkaXJlY3RfdG89IikuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudChuKSl9fSx7a2V5OiJnZXRFbmFibGVVcmwiLHZhbHVlOmZ1bmN0aW9uKG4pe3JldHVybiIiLmNvbmNhdCh0aGlzLmhvc3QsIi9lbmFibGU/cmVkaXJlY3RfdG89IikuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudChuKSl9fSx7a2V5OiJnZXRQYXRjaGVzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PUd3KEphKCkubWFyayhmdW5jdGlvbiByKGkpe3ZhciBvLGwscztyZXR1cm4gSmEoKS53cmFwKGZ1bmN0aW9uKHUpe2Zvcig7Oylzd2l0Y2godS5wcmV2PXUubmV4dCl7Y2FzZSAwOnJldHVybiBvPWkucGF0Y2hJZHMsbD1pLmhlYWRlcnMscz1vPyI/Ii5jb25jYXQoby5tYXAoZnVuY3Rpb24oYyl7cmV0dXJuIiIuY29uY2F0KGMsIj0iKS5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KGMpKX0pLmpvaW4oIiYiKSk6IiIsdS5hYnJ1cHQoInJldHVybiIsZmV0Y2goIiIuY29uY2F0KHRoaXMuaG9zdCwiL3BhdGNoZXMvfiIpLmNvbmNhdChzKSx7aGVhZGVyczpsfHx7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifX0pLnRoZW4oZnVuY3Rpb24oYyl7cmV0dXJuIFlzKGMpfSkuY2F0Y2goR3MpKTtjYXNlIDM6Y2FzZSJlbmQiOnJldHVybiB1LnN0b3AoKX19LHIsdGhpcyl9KSk7ZnVuY3Rpb24gbihyKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIG59KCl9LHtrZXk6ImdldEVkaXRVcmwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIiIuY29uY2F0KHRoaXMuaG9zdCwiL3N0YXRpYy9lZGl0Iil9fSx7a2V5OiJwb3N0UGF0Y2hlcyIsdmFsdWU6ZnVuY3Rpb24obixyLGkpe3JldHVybiBmZXRjaCgiIi5jb25jYXQodGhpcy5ob3N0LCIvcGF0Y2hlcy9+Iikse2hlYWRlcnM6aXx8eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sbWV0aG9kOiJQT1NUIixib2R5OkpTT04uc3RyaW5naWZ5KHllKHt9LG4scikpfSkudGhlbihmdW5jdGlvbihvKXtyZXR1cm4gWXMobyl9KS5jYXRjaChHcyl9fSx7a2V5OiJnZXRTZXNzaW9uIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBmZXRjaCgiIi5jb25jYXQodGhpcy5ob3N0LCIvc2Vzc2lvbiIpKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybiBZcyhuKS5jYXRjaChHcyl9KX19LHtrZXk6ImdldFRyZWUiLHZhbHVlOmZ1bmN0aW9uKG4pe3ZhciByPW4ucGF0Y2gsaT1yPT09dm9pZCAwPyExOnIsbz1uLmluY2x1ZGVTY2hlbWEsbD1vPT09dm9pZCAwPyExOm8scz1uLmluY2x1ZGVTb3VyY2UsYT1zPT09dm9pZCAwPyExOnMsdT1uLnRyZWVQYXRoLGM9dT09PXZvaWQgMD8iLyI6dSxkPW4uaGVhZGVycyxmPW5ldyBVUkxTZWFyY2hQYXJhbXM7cmV0dXJuIGYuc2V0KCJwYXRjaCIsaS50b1N0cmluZygpKSxmLnNldCgic2NoZW1hIixsLnRvU3RyaW5nKCkpLGYuc2V0KCJzb3VyY2UiLGEudG9TdHJpbmcoKSksZmV0Y2goIiIuY29uY2F0KHRoaXMuaG9zdCwiL3RyZWUvfiIpLmNvbmNhdChjLCI/IikuY29uY2F0KGYudG9TdHJpbmcoKSkse2hlYWRlcnM6ZH0pLnRoZW4oZnVuY3Rpb24oaCl7cmV0dXJuIFlzKGgpfSkuY2F0Y2goR3MpfX0se2tleToicG9zdENvbW1pdCIsdmFsdWU6ZnVuY3Rpb24obil7dmFyIHI9bi5wYXRjaGVzLGk9bi5oZWFkZXJzO3JldHVybiBmZXRjaCgiIi5jb25jYXQodGhpcy5ob3N0LCIvY29tbWl0Iikse21ldGhvZDoiUE9TVCIsYm9keTpKU09OLnN0cmluZ2lmeSh7cGF0Y2hlczpyfSksaGVhZGVyczppfHx7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifX0pLnRoZW4oZnVuY3Rpb24obyl7cmV0dXJuIFlzKG8pfSkuY2F0Y2goR3MpfX1dKSxlfSgpO2Z1bmN0aW9uIEdzKGUpe3JldHVybiBCcih7c3RhdHVzQ29kZTo1MDAsbWVzc2FnZTplIGluc3RhbmNlb2YgRXJyb3I/ZS5tZXNzYWdlOiJVbmtub3duIGVycm9yIn0pfWZ1bmN0aW9uIFlzKGUpe3JldHVybiBacC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gWnAoKXtyZXR1cm4gWnA9R3coSmEoKS5tYXJrKGZ1bmN0aW9uIGUodCl7dmFyIG47cmV0dXJuIEphKCkud3JhcChmdW5jdGlvbihpKXtmb3IoOzspc3dpdGNoKGkucHJldj1pLm5leHQpe2Nhc2UgMDppZihpLnByZXY9MCwhdC5vayl7aS5uZXh0PTk7YnJlYWt9cmV0dXJuIGkudDA9am8saS5uZXh0PTUsdC5qc29uKCk7Y2FzZSA1OnJldHVybiBpLnQxPWkuc2VudCxpLmFicnVwdCgicmV0dXJuIixpLnQwLm9rLmNhbGwoaS50MCxpLnQxKSk7Y2FzZSA5OnJldHVybiBpLnByZXY9OSxpLm5leHQ9MTIsdC5qc29uKCk7Y2FzZSAxMjpyZXR1cm4gbj1pLnNlbnQsaS5hYnJ1cHQoInJldHVybiIsQnIoe3N0YXR1c0NvZGU6dC5zdGF0dXMsbWVzc2FnZTpuLm1lc3NhZ2V8fHQuc3RhdHVzVGV4dCxkZXRhaWxzOm4uZGV0YWlsc3x8T2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG4pLmZpbHRlcihmdW5jdGlvbihvKXt2YXIgbD1KaShvLDEpLHM9bFswXTtyZXR1cm4gcyE9PSJtZXNzYWdlIn0pKX0pKTtjYXNlIDE2OnJldHVybiBpLnByZXY9MTYsaS50Mj1pLmNhdGNoKDkpLGkuYWJydXB0KCJyZXR1cm4iLEJyKHtzdGF0dXNDb2RlOnQuc3RhdHVzLG1lc3NhZ2U6dC5zdGF0dXNUZXh0fSkpO2Nhc2UgMTk6aS5uZXh0PTI0O2JyZWFrO2Nhc2UgMjE6cmV0dXJuIGkucHJldj0yMSxpLnQzPWkuY2F0Y2goMCksaS5hYnJ1cHQoInJldHVybiIsQnIoe21lc3NhZ2U6aS50MyBpbnN0YW5jZW9mIEVycm9yP2kudDMubWVzc2FnZToiVW5rbm93biBlcnJvciJ9KSk7Y2FzZSAyNDpjYXNlImVuZCI6cmV0dXJuIGkuc3RvcCgpfX0sZSxudWxsLFtbMCwyMV0sWzksMTZdXSl9KSksWnAuYXBwbHkodGhpcyxhcmd1bWVudHMpfXZhciBqbj17Y29udmVydEZpbGVTb3VyY2U6VncsZ2V0U2NoZW1hOmFOLGdldFZhbFBhdGg6Zk4sZ2V0VmFsOlROLGdldFNvdXJjZTp5TixyZXNvbHZlUGF0aDokTixzcGxpdE1vZHVsZUlkQW5kTW9kdWxlUGF0aDp4Tixpc1ZhbDpkTixjcmVhdGVWYWxQYXRoT2ZJdGVtOmVyLGdldFNIQTI1Nkhhc2g6Vk4sY3JlYXRlUGF0Y2hKU09OUGF0aDpmdW5jdGlvbih0KXtyZXR1cm4iLyIuY29uY2F0KHQuc3BsaXQoIi4iKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG4mJktOKG4pfSkuam9pbigiLyIpKX0sVkFMX0VOQUJMRV9DT09LSUVfTkFNRToidmFsX2VuYWJsZSIsVkFMX1NUQVRFX0NPT0tJRToidmFsX3N0YXRlIixWQUxfU0VTU0lPTl9DT09LSUU6InZhbF9zZXNzaW9uIn07ZnVuY3Rpb24gS04oZSl7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoe3JldHVybiBlfX12YXIgWXc9e2V4cG9ydHM6e319Oy8qIQoJQ29weXJpZ2h0IChjKSAyMDE4IEplZCBXYXRzb24uCglMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKE1JVCksIHNlZQoJaHR0cDovL2plZHdhdHNvbi5naXRodWIuaW8vY2xhc3NuYW1lcwoqLyhmdW5jdGlvbihlKXsoZnVuY3Rpb24oKXt2YXIgdD17fS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBuKCl7Zm9yKHZhciByPVtdLGk9MDtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgbz1hcmd1bWVudHNbaV07aWYobyl7dmFyIGw9dHlwZW9mIG87aWYobD09PSJzdHJpbmcifHxsPT09Im51bWJlciIpci5wdXNoKG8pO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShvKSl7aWYoby5sZW5ndGgpe3ZhciBzPW4uYXBwbHkobnVsbCxvKTtzJiZyLnB1c2gocyl9fWVsc2UgaWYobD09PSJvYmplY3QiKXtpZihvLnRvU3RyaW5nIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyYmIW8udG9TdHJpbmcudG9TdHJpbmcoKS5pbmNsdWRlcygiW25hdGl2ZSBjb2RlXSIpKXtyLnB1c2goby50b1N0cmluZygpKTtjb250aW51ZX1mb3IodmFyIGEgaW4gbyl0LmNhbGwobyxhKSYmb1thXSYmci5wdXNoKGEpfX19cmV0dXJuIHIuam9pbigiICIpfWUuZXhwb3J0cz8obi5kZWZhdWx0PW4sZS5leHBvcnRzPW4pOndpbmRvdy5jbGFzc05hbWVzPW59KSgpfSkoWXcpO3ZhciBaTj1Zdy5leHBvcnRzO2NvbnN0IHdmPSR1KFpOKTtmdW5jdGlvbiBpZSgpe3JldHVybiBpZT1PYmplY3QuYXNzaWduP09iamVjdC5hc3NpZ24uYmluZCgpOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9LGllLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBHTihlLHQpe3R5cGVvZiBlPT0iZnVuY3Rpb24iP2UodCk6ZSE9bnVsbCYmKGUuY3VycmVudD10KX1mdW5jdGlvbiBYdyguLi5lKXtyZXR1cm4gdD0+ZS5mb3JFYWNoKG49PkdOKG4sdCkpfWZ1bmN0aW9uIHN0KC4uLmUpe3JldHVybiBwLnVzZUNhbGxiYWNrKFh3KC4uLmUpLGUpfWNvbnN0IGFzPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e2NoaWxkcmVuOm4sLi4ucn09ZSxpPXAuQ2hpbGRyZW4udG9BcnJheShuKSxvPWkuZmluZChYTik7aWYobyl7Y29uc3QgbD1vLnByb3BzLmNoaWxkcmVuLHM9aS5tYXAoYT0+YT09PW8/cC5DaGlsZHJlbi5jb3VudChsKT4xP3AuQ2hpbGRyZW4ub25seShudWxsKTpwLmlzVmFsaWRFbGVtZW50KGwpP2wucHJvcHMuY2hpbGRyZW46bnVsbDphKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KEdwLGllKHt9LHIse3JlZjp0fSkscC5pc1ZhbGlkRWxlbWVudChsKT9wLmNsb25lRWxlbWVudChsLHZvaWQgMCxzKTpudWxsKX1yZXR1cm4gcC5jcmVhdGVFbGVtZW50KEdwLGllKHt9LHIse3JlZjp0fSksbil9KTthcy5kaXNwbGF5TmFtZT0iU2xvdCI7Y29uc3QgR3A9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7Y2hpbGRyZW46biwuLi5yfT1lO3JldHVybiBwLmlzVmFsaWRFbGVtZW50KG4pP3AuY2xvbmVFbGVtZW50KG4sey4uLlFOKHIsbi5wcm9wcykscmVmOnQ/WHcodCxuLnJlZik6bi5yZWZ9KTpwLkNoaWxkcmVuLmNvdW50KG4pPjE/cC5DaGlsZHJlbi5vbmx5KG51bGwpOm51bGx9KTtHcC5kaXNwbGF5TmFtZT0iU2xvdENsb25lIjtjb25zdCBZTj0oe2NoaWxkcmVuOmV9KT0+cC5jcmVhdGVFbGVtZW50KHAuRnJhZ21lbnQsbnVsbCxlKTtmdW5jdGlvbiBYTihlKXtyZXR1cm4gcC5pc1ZhbGlkRWxlbWVudChlKSYmZS50eXBlPT09WU59ZnVuY3Rpb24gUU4oZSx0KXtjb25zdCBuPXsuLi50fTtmb3IoY29uc3QgciBpbiB0KXtjb25zdCBpPWVbcl0sbz10W3JdOy9eb25bQS1aXS8udGVzdChyKT9pJiZvP25bcl09KC4uLnMpPT57byguLi5zKSxpKC4uLnMpfTppJiYobltyXT1pKTpyPT09InN0eWxlIj9uW3JdPXsuLi5pLC4uLm99OnI9PT0iY2xhc3NOYW1lIiYmKG5bcl09W2ksb10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oIiAiKSl9cmV0dXJuey4uLmUsLi4ubn19Y29uc3QgSk49WyJhIiwiYnV0dG9uIiwiZGl2IiwiZm9ybSIsImgyIiwiaDMiLCJpbWciLCJpbnB1dCIsImxhYmVsIiwibGkiLCJuYXYiLCJvbCIsInAiLCJzcGFuIiwic3ZnIiwidWwiXSxLZT1KTi5yZWR1Y2UoKGUsdCk9Pntjb25zdCBuPXAuZm9yd2FyZFJlZigocixpKT0+e2NvbnN0e2FzQ2hpbGQ6bywuLi5sfT1yLHM9bz9hczp0O3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e3dpbmRvd1tTeW1ib2wuZm9yKCJyYWRpeC11aSIpXT0hMH0sW10pLHAuY3JlYXRlRWxlbWVudChzLGllKHt9LGwse3JlZjppfSkpfSk7cmV0dXJuIG4uZGlzcGxheU5hbWU9YFByaW1pdGl2ZS4ke3R9YCx7Li4uZSxbdF06bn19LHt9KTtmdW5jdGlvbiBxTihlLHQpe2UmJkdyLmZsdXNoU3luYygoKT0+ZS5kaXNwYXRjaEV2ZW50KHQpKX1jb25zdCBVbj1nbG9iYWxUaGlzIT1udWxsJiZnbG9iYWxUaGlzLmRvY3VtZW50P3AudXNlTGF5b3V0RWZmZWN0OigpPT57fTtmdW5jdGlvbiBlMihlLHQpe3JldHVybiBwLnVzZVJlZHVjZXIoKG4scik9Pntjb25zdCBpPXRbbl1bcl07cmV0dXJuIGk/P259LGUpfWNvbnN0IFNzPWU9Pntjb25zdHtwcmVzZW50OnQsY2hpbGRyZW46bn09ZSxyPXQyKHQpLGk9dHlwZW9mIG49PSJmdW5jdGlvbiI/bih7cHJlc2VudDpyLmlzUHJlc2VudH0pOnAuQ2hpbGRyZW4ub25seShuKSxvPXN0KHIucmVmLGkucmVmKTtyZXR1cm4gdHlwZW9mIG49PSJmdW5jdGlvbiJ8fHIuaXNQcmVzZW50P3AuY2xvbmVFbGVtZW50KGkse3JlZjpvfSk6bnVsbH07U3MuZGlzcGxheU5hbWU9IlByZXNlbmNlIjtmdW5jdGlvbiB0MihlKXtjb25zdFt0LG5dPXAudXNlU3RhdGUoKSxyPXAudXNlUmVmKHt9KSxpPXAudXNlUmVmKGUpLG89cC51c2VSZWYoIm5vbmUiKSxsPWU/Im1vdW50ZWQiOiJ1bm1vdW50ZWQiLFtzLGFdPWUyKGwse21vdW50ZWQ6e1VOTU9VTlQ6InVubW91bnRlZCIsQU5JTUFUSU9OX09VVDoidW5tb3VudFN1c3BlbmRlZCJ9LHVubW91bnRTdXNwZW5kZWQ6e01PVU5UOiJtb3VudGVkIixBTklNQVRJT05fRU5EOiJ1bm1vdW50ZWQifSx1bm1vdW50ZWQ6e01PVU5UOiJtb3VudGVkIn19KTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCB1PWhjKHIuY3VycmVudCk7by5jdXJyZW50PXM9PT0ibW91bnRlZCI/dToibm9uZSJ9LFtzXSksVW4oKCk9Pntjb25zdCB1PXIuY3VycmVudCxjPWkuY3VycmVudDtpZihjIT09ZSl7Y29uc3QgZj1vLmN1cnJlbnQsaD1oYyh1KTtlP2EoIk1PVU5UIik6aD09PSJub25lInx8KHU9PW51bGw/dm9pZCAwOnUuZGlzcGxheSk9PT0ibm9uZSI/YSgiVU5NT1VOVCIpOmEoYyYmZiE9PWg/IkFOSU1BVElPTl9PVVQiOiJVTk1PVU5UIiksaS5jdXJyZW50PWV9fSxbZSxhXSksVW4oKCk9PntpZih0KXtjb25zdCB1PWQ9Pntjb25zdCBoPWhjKHIuY3VycmVudCkuaW5jbHVkZXMoZC5hbmltYXRpb25OYW1lKTtkLnRhcmdldD09PXQmJmgmJkdyLmZsdXNoU3luYygoKT0+YSgiQU5JTUFUSU9OX0VORCIpKX0sYz1kPT57ZC50YXJnZXQ9PT10JiYoby5jdXJyZW50PWhjKHIuY3VycmVudCkpfTtyZXR1cm4gdC5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25zdGFydCIsYyksdC5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25jYW5jZWwiLHUpLHQuYWRkRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uZW5kIix1KSwoKT0+e3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uc3RhcnQiLGMpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uY2FuY2VsIix1KSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmVuZCIsdSl9fWVsc2UgYSgiQU5JTUFUSU9OX0VORCIpfSxbdCxhXSkse2lzUHJlc2VudDpbIm1vdW50ZWQiLCJ1bm1vdW50U3VzcGVuZGVkIl0uaW5jbHVkZXMocykscmVmOnAudXNlQ2FsbGJhY2sodT0+e3UmJihyLmN1cnJlbnQ9Z2V0Q29tcHV0ZWRTdHlsZSh1KSksbih1KX0sW10pfX1mdW5jdGlvbiBoYyhlKXtyZXR1cm4oZT09bnVsbD92b2lkIDA6ZS5hbmltYXRpb25OYW1lKXx8Im5vbmUifWZ1bmN0aW9uIG9sKGUsdD1bXSl7bGV0IG49W107ZnVuY3Rpb24gcihvLGwpe2NvbnN0IHM9cC5jcmVhdGVDb250ZXh0KGwpLGE9bi5sZW5ndGg7bj1bLi4ubixsXTtmdW5jdGlvbiB1KGQpe2NvbnN0e3Njb3BlOmYsY2hpbGRyZW46aCwuLi5tfT1kLGc9KGY9PW51bGw/dm9pZCAwOmZbZV1bYV0pfHxzLFM9cC51c2VNZW1vKCgpPT5tLE9iamVjdC52YWx1ZXMobSkpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoZy5Qcm92aWRlcix7dmFsdWU6U30saCl9ZnVuY3Rpb24gYyhkLGYpe2NvbnN0IGg9KGY9PW51bGw/dm9pZCAwOmZbZV1bYV0pfHxzLG09cC51c2VDb250ZXh0KGgpO2lmKG0pcmV0dXJuIG07aWYobCE9PXZvaWQgMClyZXR1cm4gbDt0aHJvdyBuZXcgRXJyb3IoYFxgJHtkfVxgIG11c3QgYmUgdXNlZCB3aXRoaW4gXGAke299XGBgKX1yZXR1cm4gdS5kaXNwbGF5TmFtZT1vKyJQcm92aWRlciIsW3UsY119Y29uc3QgaT0oKT0+e2NvbnN0IG89bi5tYXAobD0+cC5jcmVhdGVDb250ZXh0KGwpKTtyZXR1cm4gZnVuY3Rpb24ocyl7Y29uc3QgYT0ocz09bnVsbD92b2lkIDA6c1tlXSl8fG87cmV0dXJuIHAudXNlTWVtbygoKT0+KHtbYF9fc2NvcGUke2V9YF06ey4uLnMsW2VdOmF9fSksW3MsYV0pfX07cmV0dXJuIGkuc2NvcGVOYW1lPWUsW3IsbjIoaSwuLi50KV19ZnVuY3Rpb24gbjIoLi4uZSl7Y29uc3QgdD1lWzBdO2lmKGUubGVuZ3RoPT09MSlyZXR1cm4gdDtjb25zdCBuPSgpPT57Y29uc3Qgcj1lLm1hcChpPT4oe3VzZVNjb3BlOmkoKSxzY29wZU5hbWU6aS5zY29wZU5hbWV9KSk7cmV0dXJuIGZ1bmN0aW9uKG8pe2NvbnN0IGw9ci5yZWR1Y2UoKHMse3VzZVNjb3BlOmEsc2NvcGVOYW1lOnV9KT0+e2NvbnN0IGQ9YShvKVtgX19zY29wZSR7dX1gXTtyZXR1cm57Li4ucywuLi5kfX0se30pO3JldHVybiBwLnVzZU1lbW8oKCk9Pih7W2BfX3Njb3BlJHt0LnNjb3BlTmFtZX1gXTpsfSksW2xdKX19O3JldHVybiBuLnNjb3BlTmFtZT10LnNjb3BlTmFtZSxufWZ1bmN0aW9uIGVuKGUpe2NvbnN0IHQ9cC51c2VSZWYoZSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57dC5jdXJyZW50PWV9KSxwLnVzZU1lbW8oKCk9PiguLi5uKT0+e3ZhciByO3JldHVybihyPXQuY3VycmVudCk9PT1udWxsfHxyPT09dm9pZCAwP3ZvaWQgMDpyLmNhbGwodCwuLi5uKX0sW10pfWNvbnN0IHIyPXAuY3JlYXRlQ29udGV4dCh2b2lkIDApO2Z1bmN0aW9uIEdnKGUpe2NvbnN0IHQ9cC51c2VDb250ZXh0KHIyKTtyZXR1cm4gZXx8dHx8Imx0ciJ9ZnVuY3Rpb24gWXAoZSxbdCxuXSl7cmV0dXJuIE1hdGgubWluKG4sTWF0aC5tYXgodCxlKSl9ZnVuY3Rpb24gbnQoZSx0LHtjaGVja0ZvckRlZmF1bHRQcmV2ZW50ZWQ6bj0hMH09e30pe3JldHVybiBmdW5jdGlvbihpKXtpZihlPT1udWxsfHxlKGkpLG49PT0hMXx8IWkuZGVmYXVsdFByZXZlbnRlZClyZXR1cm4gdD09bnVsbD92b2lkIDA6dChpKX19ZnVuY3Rpb24gaTIoZSx0KXtyZXR1cm4gcC51c2VSZWR1Y2VyKChuLHIpPT57Y29uc3QgaT10W25dW3JdO3JldHVybiBpPz9ufSxlKX1jb25zdCBRdz0iU2Nyb2xsQXJlYSIsW0p3LGJMXT1vbChRdyksW28yLGFyXT1KdyhRdyksbDI9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVNjcm9sbEFyZWE6bix0eXBlOnI9ImhvdmVyIixkaXI6aSxzY3JvbGxIaWRlRGVsYXk6bz02MDAsLi4ubH09ZSxbcyxhXT1wLnVzZVN0YXRlKG51bGwpLFt1LGNdPXAudXNlU3RhdGUobnVsbCksW2QsZl09cC51c2VTdGF0ZShudWxsKSxbaCxtXT1wLnVzZVN0YXRlKG51bGwpLFtnLFNdPXAudXNlU3RhdGUobnVsbCksW3YseV09cC51c2VTdGF0ZSgwKSxbXyx3XT1wLnVzZVN0YXRlKDApLFtFLCRdPXAudXNlU3RhdGUoITEpLFtDLFRdPXAudXNlU3RhdGUoITEpLE49c3QodCxEPT5hKEQpKSxSPUdnKGkpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQobzIse3Njb3BlOm4sdHlwZTpyLGRpcjpSLHNjcm9sbEhpZGVEZWxheTpvLHNjcm9sbEFyZWE6cyx2aWV3cG9ydDp1LG9uVmlld3BvcnRDaGFuZ2U6Yyxjb250ZW50OmQsb25Db250ZW50Q2hhbmdlOmYsc2Nyb2xsYmFyWDpoLG9uU2Nyb2xsYmFyWENoYW5nZTptLHNjcm9sbGJhclhFbmFibGVkOkUsb25TY3JvbGxiYXJYRW5hYmxlZENoYW5nZTokLHNjcm9sbGJhclk6ZyxvblNjcm9sbGJhcllDaGFuZ2U6UyxzY3JvbGxiYXJZRW5hYmxlZDpDLG9uU2Nyb2xsYmFyWUVuYWJsZWRDaGFuZ2U6VCxvbkNvcm5lcldpZHRoQ2hhbmdlOnksb25Db3JuZXJIZWlnaHRDaGFuZ2U6d30scC5jcmVhdGVFbGVtZW50KEtlLmRpdixpZSh7ZGlyOlJ9LGwse3JlZjpOLHN0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUiLCItLXJhZGl4LXNjcm9sbC1hcmVhLWNvcm5lci13aWR0aCI6disicHgiLCItLXJhZGl4LXNjcm9sbC1hcmVhLWNvcm5lci1oZWlnaHQiOl8rInB4IiwuLi5lLnN0eWxlfX0pKSl9KSxzMj0iU2Nyb2xsQXJlYVZpZXdwb3J0IixhMj1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2Nyb2xsQXJlYTpuLGNoaWxkcmVuOnIsLi4uaX09ZSxvPWFyKHMyLG4pLGw9cC51c2VSZWYobnVsbCkscz1zdCh0LGwsby5vblZpZXdwb3J0Q2hhbmdlKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KHAuRnJhZ21lbnQsbnVsbCxwLmNyZWF0ZUVsZW1lbnQoInN0eWxlIix7ZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6e19faHRtbDoiW2RhdGEtcmFkaXgtc2Nyb2xsLWFyZWEtdmlld3BvcnRde3Njcm9sbGJhci13aWR0aDpub25lOy1tcy1vdmVyZmxvdy1zdHlsZTpub25lOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNoO31bZGF0YS1yYWRpeC1zY3JvbGwtYXJlYS12aWV3cG9ydF06Oi13ZWJraXQtc2Nyb2xsYmFye2Rpc3BsYXk6bm9uZX0ifX0pLHAuY3JlYXRlRWxlbWVudChLZS5kaXYsaWUoeyJkYXRhLXJhZGl4LXNjcm9sbC1hcmVhLXZpZXdwb3J0IjoiIn0saSx7cmVmOnMsc3R5bGU6e292ZXJmbG93WDpvLnNjcm9sbGJhclhFbmFibGVkPyJzY3JvbGwiOiJoaWRkZW4iLG92ZXJmbG93WTpvLnNjcm9sbGJhcllFbmFibGVkPyJzY3JvbGwiOiJoaWRkZW4iLC4uLmUuc3R5bGV9fSkscC5jcmVhdGVFbGVtZW50KCJkaXYiLHtyZWY6by5vbkNvbnRlbnRDaGFuZ2Usc3R5bGU6e21pbldpZHRoOiIxMDAlIixkaXNwbGF5OiJ0YWJsZSJ9fSxyKSkpfSksX2k9IlNjcm9sbEFyZWFTY3JvbGxiYXIiLHF3PXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e2ZvcmNlTW91bnQ6biwuLi5yfT1lLGk9YXIoX2ksZS5fX3Njb3BlU2Nyb2xsQXJlYSkse29uU2Nyb2xsYmFyWEVuYWJsZWRDaGFuZ2U6byxvblNjcm9sbGJhcllFbmFibGVkQ2hhbmdlOmx9PWkscz1lLm9yaWVudGF0aW9uPT09Imhvcml6b250YWwiO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+KHM/byghMCk6bCghMCksKCk9PntzP28oITEpOmwoITEpfSksW3MsbyxsXSksaS50eXBlPT09ImhvdmVyIj9wLmNyZWF0ZUVsZW1lbnQodTIsaWUoe30scix7cmVmOnQsZm9yY2VNb3VudDpufSkpOmkudHlwZT09PSJzY3JvbGwiP3AuY3JlYXRlRWxlbWVudChjMixpZSh7fSxyLHtyZWY6dCxmb3JjZU1vdW50Om59KSk6aS50eXBlPT09ImF1dG8iP3AuY3JlYXRlRWxlbWVudChlUyxpZSh7fSxyLHtyZWY6dCxmb3JjZU1vdW50Om59KSk6aS50eXBlPT09ImFsd2F5cyI/cC5jcmVhdGVFbGVtZW50KFlnLGllKHt9LHIse3JlZjp0fSkpOm51bGx9KSx1Mj1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtmb3JjZU1vdW50Om4sLi4ucn09ZSxpPWFyKF9pLGUuX19zY29wZVNjcm9sbEFyZWEpLFtvLGxdPXAudXNlU3RhdGUoITEpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IHM9aS5zY3JvbGxBcmVhO2xldCBhPTA7aWYocyl7Y29uc3QgdT0oKT0+e3dpbmRvdy5jbGVhclRpbWVvdXQoYSksbCghMCl9LGM9KCk9PnthPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT5sKCExKSxpLnNjcm9sbEhpZGVEZWxheSl9O3JldHVybiBzLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJlbnRlciIsdSkscy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybGVhdmUiLGMpLCgpPT57d2luZG93LmNsZWFyVGltZW91dChhKSxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJlbnRlciIsdSkscy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVybGVhdmUiLGMpfX19LFtpLnNjcm9sbEFyZWEsaS5zY3JvbGxIaWRlRGVsYXldKSxwLmNyZWF0ZUVsZW1lbnQoU3Mse3ByZXNlbnQ6bnx8b30scC5jcmVhdGVFbGVtZW50KGVTLGllKHsiZGF0YS1zdGF0ZSI6bz8idmlzaWJsZSI6ImhpZGRlbiJ9LHIse3JlZjp0fSkpKX0pLGMyPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e2ZvcmNlTW91bnQ6biwuLi5yfT1lLGk9YXIoX2ksZS5fX3Njb3BlU2Nyb2xsQXJlYSksbz1lLm9yaWVudGF0aW9uPT09Imhvcml6b250YWwiLGw9RWYoKCk9PmEoIlNDUk9MTF9FTkQiKSwxMDApLFtzLGFdPWkyKCJoaWRkZW4iLHtoaWRkZW46e1NDUk9MTDoic2Nyb2xsaW5nIn0sc2Nyb2xsaW5nOntTQ1JPTExfRU5EOiJpZGxlIixQT0lOVEVSX0VOVEVSOiJpbnRlcmFjdGluZyJ9LGludGVyYWN0aW5nOntTQ1JPTEw6ImludGVyYWN0aW5nIixQT0lOVEVSX0xFQVZFOiJpZGxlIn0saWRsZTp7SElERToiaGlkZGVuIixTQ1JPTEw6InNjcm9sbGluZyIsUE9JTlRFUl9FTlRFUjoiaW50ZXJhY3RpbmcifX0pO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2lmKHM9PT0iaWRsZSIpe2NvbnN0IHU9d2luZG93LnNldFRpbWVvdXQoKCk9PmEoIkhJREUiKSxpLnNjcm9sbEhpZGVEZWxheSk7cmV0dXJuKCk9PndpbmRvdy5jbGVhclRpbWVvdXQodSl9fSxbcyxpLnNjcm9sbEhpZGVEZWxheSxhXSkscC51c2VFZmZlY3QoKCk9Pntjb25zdCB1PWkudmlld3BvcnQsYz1vPyJzY3JvbGxMZWZ0Ijoic2Nyb2xsVG9wIjtpZih1KXtsZXQgZD11W2NdO2NvbnN0IGY9KCk9Pntjb25zdCBoPXVbY107ZCE9PWgmJihhKCJTQ1JPTEwiKSxsKCkpLGQ9aH07cmV0dXJuIHUuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixmKSwoKT0+dS5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLGYpfX0sW2kudmlld3BvcnQsbyxhLGxdKSxwLmNyZWF0ZUVsZW1lbnQoU3Mse3ByZXNlbnQ6bnx8cyE9PSJoaWRkZW4ifSxwLmNyZWF0ZUVsZW1lbnQoWWcsaWUoeyJkYXRhLXN0YXRlIjpzPT09ImhpZGRlbiI/ImhpZGRlbiI6InZpc2libGUifSxyLHtyZWY6dCxvblBvaW50ZXJFbnRlcjpudChlLm9uUG9pbnRlckVudGVyLCgpPT5hKCJQT0lOVEVSX0VOVEVSIikpLG9uUG9pbnRlckxlYXZlOm50KGUub25Qb2ludGVyTGVhdmUsKCk9PmEoIlBPSU5URVJfTEVBVkUiKSl9KSkpfSksZVM9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3Qgbj1hcihfaSxlLl9fc2NvcGVTY3JvbGxBcmVhKSx7Zm9yY2VNb3VudDpyLC4uLml9PWUsW28sbF09cC51c2VTdGF0ZSghMSkscz1lLm9yaWVudGF0aW9uPT09Imhvcml6b250YWwiLGE9RWYoKCk9PntpZihuLnZpZXdwb3J0KXtjb25zdCB1PW4udmlld3BvcnQub2Zmc2V0V2lkdGg8bi52aWV3cG9ydC5zY3JvbGxXaWR0aCxjPW4udmlld3BvcnQub2Zmc2V0SGVpZ2h0PG4udmlld3BvcnQuc2Nyb2xsSGVpZ2h0O2wocz91OmMpfX0sMTApO3JldHVybiB1cyhuLnZpZXdwb3J0LGEpLHVzKG4uY29udGVudCxhKSxwLmNyZWF0ZUVsZW1lbnQoU3Mse3ByZXNlbnQ6cnx8b30scC5jcmVhdGVFbGVtZW50KFlnLGllKHsiZGF0YS1zdGF0ZSI6bz8idmlzaWJsZSI6ImhpZGRlbiJ9LGkse3JlZjp0fSkpKX0pLFlnPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e29yaWVudGF0aW9uOm49InZlcnRpY2FsIiwuLi5yfT1lLGk9YXIoX2ksZS5fX3Njb3BlU2Nyb2xsQXJlYSksbz1wLnVzZVJlZihudWxsKSxsPXAudXNlUmVmKDApLFtzLGFdPXAudXNlU3RhdGUoe2NvbnRlbnQ6MCx2aWV3cG9ydDowLHNjcm9sbGJhcjp7c2l6ZTowLHBhZGRpbmdTdGFydDowLHBhZGRpbmdFbmQ6MH19KSx1PWlTKHMudmlld3BvcnQscy5jb250ZW50KSxjPXsuLi5yLHNpemVzOnMsb25TaXplc0NoYW5nZTphLGhhc1RodW1iOnU+MCYmdTwxLG9uVGh1bWJDaGFuZ2U6Zj0+by5jdXJyZW50PWYsb25UaHVtYlBvaW50ZXJVcDooKT0+bC5jdXJyZW50PTAsb25UaHVtYlBvaW50ZXJEb3duOmY9PmwuY3VycmVudD1mfTtmdW5jdGlvbiBkKGYsaCl7cmV0dXJuIHkyKGYsbC5jdXJyZW50LHMsaCl9cmV0dXJuIG49PT0iaG9yaXpvbnRhbCI/cC5jcmVhdGVFbGVtZW50KGQyLGllKHt9LGMse3JlZjp0LG9uVGh1bWJQb3NpdGlvbkNoYW5nZTooKT0+e2lmKGkudmlld3BvcnQmJm8uY3VycmVudCl7Y29uc3QgZj1pLnZpZXdwb3J0LnNjcm9sbExlZnQsaD1rMChmLHMsaS5kaXIpO28uY3VycmVudC5zdHlsZS50cmFuc2Zvcm09YHRyYW5zbGF0ZTNkKCR7aH1weCwgMCwgMClgfX0sb25XaGVlbFNjcm9sbDpmPT57aS52aWV3cG9ydCYmKGkudmlld3BvcnQuc2Nyb2xsTGVmdD1mKX0sb25EcmFnU2Nyb2xsOmY9PntpLnZpZXdwb3J0JiYoaS52aWV3cG9ydC5zY3JvbGxMZWZ0PWQoZixpLmRpcikpfX0pKTpuPT09InZlcnRpY2FsIj9wLmNyZWF0ZUVsZW1lbnQoZjIsaWUoe30sYyx7cmVmOnQsb25UaHVtYlBvc2l0aW9uQ2hhbmdlOigpPT57aWYoaS52aWV3cG9ydCYmby5jdXJyZW50KXtjb25zdCBmPWkudmlld3BvcnQuc2Nyb2xsVG9wLGg9azAoZixzKTtvLmN1cnJlbnQuc3R5bGUudHJhbnNmb3JtPWB0cmFuc2xhdGUzZCgwLCAke2h9cHgsIDApYH19LG9uV2hlZWxTY3JvbGw6Zj0+e2kudmlld3BvcnQmJihpLnZpZXdwb3J0LnNjcm9sbFRvcD1mKX0sb25EcmFnU2Nyb2xsOmY9PntpLnZpZXdwb3J0JiYoaS52aWV3cG9ydC5zY3JvbGxUb3A9ZChmKSl9fSkpOm51bGx9KSxkMj1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtzaXplczpuLG9uU2l6ZXNDaGFuZ2U6ciwuLi5pfT1lLG89YXIoX2ksZS5fX3Njb3BlU2Nyb2xsQXJlYSksW2wsc109cC51c2VTdGF0ZSgpLGE9cC51c2VSZWYobnVsbCksdT1zdCh0LGEsby5vblNjcm9sbGJhclhDaGFuZ2UpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2EuY3VycmVudCYmcyhnZXRDb21wdXRlZFN0eWxlKGEuY3VycmVudCkpfSxbYV0pLHAuY3JlYXRlRWxlbWVudChuUyxpZSh7ImRhdGEtb3JpZW50YXRpb24iOiJob3Jpem9udGFsIn0saSx7cmVmOnUsc2l6ZXM6bixzdHlsZTp7Ym90dG9tOjAsbGVmdDpvLmRpcj09PSJydGwiPyJ2YXIoLS1yYWRpeC1zY3JvbGwtYXJlYS1jb3JuZXItd2lkdGgpIjowLHJpZ2h0Om8uZGlyPT09Imx0ciI/InZhcigtLXJhZGl4LXNjcm9sbC1hcmVhLWNvcm5lci13aWR0aCkiOjAsIi0tcmFkaXgtc2Nyb2xsLWFyZWEtdGh1bWItd2lkdGgiOlNmKG4pKyJweCIsLi4uZS5zdHlsZX0sb25UaHVtYlBvaW50ZXJEb3duOmM9PmUub25UaHVtYlBvaW50ZXJEb3duKGMueCksb25EcmFnU2Nyb2xsOmM9PmUub25EcmFnU2Nyb2xsKGMueCksb25XaGVlbFNjcm9sbDooYyxkKT0+e2lmKG8udmlld3BvcnQpe2NvbnN0IGY9by52aWV3cG9ydC5zY3JvbGxMZWZ0K2MuZGVsdGFYO2Uub25XaGVlbFNjcm9sbChmKSxsUyhmLGQpJiZjLnByZXZlbnREZWZhdWx0KCl9fSxvblJlc2l6ZTooKT0+e2EuY3VycmVudCYmby52aWV3cG9ydCYmbCYmcih7Y29udGVudDpvLnZpZXdwb3J0LnNjcm9sbFdpZHRoLHZpZXdwb3J0Om8udmlld3BvcnQub2Zmc2V0V2lkdGgsc2Nyb2xsYmFyOntzaXplOmEuY3VycmVudC5jbGllbnRXaWR0aCxwYWRkaW5nU3RhcnQ6X2QobC5wYWRkaW5nTGVmdCkscGFkZGluZ0VuZDpfZChsLnBhZGRpbmdSaWdodCl9fSl9fSkpfSksZjI9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7c2l6ZXM6bixvblNpemVzQ2hhbmdlOnIsLi4uaX09ZSxvPWFyKF9pLGUuX19zY29wZVNjcm9sbEFyZWEpLFtsLHNdPXAudXNlU3RhdGUoKSxhPXAudXNlUmVmKG51bGwpLHU9c3QodCxhLG8ub25TY3JvbGxiYXJZQ2hhbmdlKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PnthLmN1cnJlbnQmJnMoZ2V0Q29tcHV0ZWRTdHlsZShhLmN1cnJlbnQpKX0sW2FdKSxwLmNyZWF0ZUVsZW1lbnQoblMsaWUoeyJkYXRhLW9yaWVudGF0aW9uIjoidmVydGljYWwifSxpLHtyZWY6dSxzaXplczpuLHN0eWxlOnt0b3A6MCxyaWdodDpvLmRpcj09PSJsdHIiPzA6dm9pZCAwLGxlZnQ6by5kaXI9PT0icnRsIj8wOnZvaWQgMCxib3R0b206InZhcigtLXJhZGl4LXNjcm9sbC1hcmVhLWNvcm5lci1oZWlnaHQpIiwiLS1yYWRpeC1zY3JvbGwtYXJlYS10aHVtYi1oZWlnaHQiOlNmKG4pKyJweCIsLi4uZS5zdHlsZX0sb25UaHVtYlBvaW50ZXJEb3duOmM9PmUub25UaHVtYlBvaW50ZXJEb3duKGMueSksb25EcmFnU2Nyb2xsOmM9PmUub25EcmFnU2Nyb2xsKGMueSksb25XaGVlbFNjcm9sbDooYyxkKT0+e2lmKG8udmlld3BvcnQpe2NvbnN0IGY9by52aWV3cG9ydC5zY3JvbGxUb3ArYy5kZWx0YVk7ZS5vbldoZWVsU2Nyb2xsKGYpLGxTKGYsZCkmJmMucHJldmVudERlZmF1bHQoKX19LG9uUmVzaXplOigpPT57YS5jdXJyZW50JiZvLnZpZXdwb3J0JiZsJiZyKHtjb250ZW50Om8udmlld3BvcnQuc2Nyb2xsSGVpZ2h0LHZpZXdwb3J0Om8udmlld3BvcnQub2Zmc2V0SGVpZ2h0LHNjcm9sbGJhcjp7c2l6ZTphLmN1cnJlbnQuY2xpZW50SGVpZ2h0LHBhZGRpbmdTdGFydDpfZChsLnBhZGRpbmdUb3ApLHBhZGRpbmdFbmQ6X2QobC5wYWRkaW5nQm90dG9tKX19KX19KSl9KSxbaDIsdFNdPUp3KF9pKSxuUz1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2Nyb2xsQXJlYTpuLHNpemVzOnIsaGFzVGh1bWI6aSxvblRodW1iQ2hhbmdlOm8sb25UaHVtYlBvaW50ZXJVcDpsLG9uVGh1bWJQb2ludGVyRG93bjpzLG9uVGh1bWJQb3NpdGlvbkNoYW5nZTphLG9uRHJhZ1Njcm9sbDp1LG9uV2hlZWxTY3JvbGw6YyxvblJlc2l6ZTpkLC4uLmZ9PWUsaD1hcihfaSxuKSxbbSxnXT1wLnVzZVN0YXRlKG51bGwpLFM9c3QodCxOPT5nKE4pKSx2PXAudXNlUmVmKG51bGwpLHk9cC51c2VSZWYoIiIpLF89aC52aWV3cG9ydCx3PXIuY29udGVudC1yLnZpZXdwb3J0LEU9ZW4oYyksJD1lbihhKSxDPUVmKGQsMTApO2Z1bmN0aW9uIFQoTil7aWYodi5jdXJyZW50KXtjb25zdCBSPU4uY2xpZW50WC12LmN1cnJlbnQubGVmdCxEPU4uY2xpZW50WS12LmN1cnJlbnQudG9wO3Uoe3g6Uix5OkR9KX19cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3QgTj1SPT57Y29uc3QgRD1SLnRhcmdldDsobT09bnVsbD92b2lkIDA6bS5jb250YWlucyhEKSkmJkUoUix3KX07cmV0dXJuIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndoZWVsIixOLHtwYXNzaXZlOiExfSksKCk9PmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIndoZWVsIixOLHtwYXNzaXZlOiExfSl9LFtfLG0sdyxFXSkscC51c2VFZmZlY3QoJCxbciwkXSksdXMobSxDKSx1cyhoLmNvbnRlbnQsQykscC5jcmVhdGVFbGVtZW50KGgyLHtzY29wZTpuLHNjcm9sbGJhcjptLGhhc1RodW1iOmksb25UaHVtYkNoYW5nZTplbihvKSxvblRodW1iUG9pbnRlclVwOmVuKGwpLG9uVGh1bWJQb3NpdGlvbkNoYW5nZTokLG9uVGh1bWJQb2ludGVyRG93bjplbihzKX0scC5jcmVhdGVFbGVtZW50KEtlLmRpdixpZSh7fSxmLHtyZWY6UyxzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIiwuLi5mLnN0eWxlfSxvblBvaW50ZXJEb3duOm50KGUub25Qb2ludGVyRG93bixOPT57Ti5idXR0b249PT0wJiYoTi50YXJnZXQuc2V0UG9pbnRlckNhcHR1cmUoTi5wb2ludGVySWQpLHYuY3VycmVudD1tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHkuY3VycmVudD1kb2N1bWVudC5ib2R5LnN0eWxlLndlYmtpdFVzZXJTZWxlY3QsZG9jdW1lbnQuYm9keS5zdHlsZS53ZWJraXRVc2VyU2VsZWN0PSJub25lIixoLnZpZXdwb3J0JiYoaC52aWV3cG9ydC5zdHlsZS5zY3JvbGxCZWhhdmlvcj0iYXV0byIpLFQoTikpfSksb25Qb2ludGVyTW92ZTpudChlLm9uUG9pbnRlck1vdmUsVCksb25Qb2ludGVyVXA6bnQoZS5vblBvaW50ZXJVcCxOPT57Y29uc3QgUj1OLnRhcmdldDtSLmhhc1BvaW50ZXJDYXB0dXJlKE4ucG9pbnRlcklkKSYmUi5yZWxlYXNlUG9pbnRlckNhcHR1cmUoTi5wb2ludGVySWQpLGRvY3VtZW50LmJvZHkuc3R5bGUud2Via2l0VXNlclNlbGVjdD15LmN1cnJlbnQsaC52aWV3cG9ydCYmKGgudmlld3BvcnQuc3R5bGUuc2Nyb2xsQmVoYXZpb3I9IiIpLHYuY3VycmVudD1udWxsfSl9KSkpfSksWHA9IlNjcm9sbEFyZWFUaHVtYiIscDI9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7Zm9yY2VNb3VudDpuLC4uLnJ9PWUsaT10UyhYcCxlLl9fc2NvcGVTY3JvbGxBcmVhKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KFNzLHtwcmVzZW50Om58fGkuaGFzVGh1bWJ9LHAuY3JlYXRlRWxlbWVudChtMixpZSh7cmVmOnR9LHIpKSl9KSxtMj1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2Nyb2xsQXJlYTpuLHN0eWxlOnIsLi4uaX09ZSxvPWFyKFhwLG4pLGw9dFMoWHAsbikse29uVGh1bWJQb3NpdGlvbkNoYW5nZTpzfT1sLGE9c3QodCxkPT5sLm9uVGh1bWJDaGFuZ2UoZCkpLHU9cC51c2VSZWYoKSxjPUVmKCgpPT57dS5jdXJyZW50JiYodS5jdXJyZW50KCksdS5jdXJyZW50PXZvaWQgMCl9LDEwMCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3QgZD1vLnZpZXdwb3J0O2lmKGQpe2NvbnN0IGY9KCk9PntpZihjKCksIXUuY3VycmVudCl7Y29uc3QgaD14MihkLHMpO3UuY3VycmVudD1oLHMoKX19O3JldHVybiBzKCksZC5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLGYpLCgpPT5kLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZil9fSxbby52aWV3cG9ydCxjLHNdKSxwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHsiZGF0YS1zdGF0ZSI6bC5oYXNUaHVtYj8idmlzaWJsZSI6ImhpZGRlbiJ9LGkse3JlZjphLHN0eWxlOnt3aWR0aDoidmFyKC0tcmFkaXgtc2Nyb2xsLWFyZWEtdGh1bWItd2lkdGgpIixoZWlnaHQ6InZhcigtLXJhZGl4LXNjcm9sbC1hcmVhLXRodW1iLWhlaWdodCkiLC4uLnJ9LG9uUG9pbnRlckRvd25DYXB0dXJlOm50KGUub25Qb2ludGVyRG93bkNhcHR1cmUsZD0+e2NvbnN0IGg9ZC50YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbT1kLmNsaWVudFgtaC5sZWZ0LGc9ZC5jbGllbnRZLWgudG9wO2wub25UaHVtYlBvaW50ZXJEb3duKHt4Om0seTpnfSl9KSxvblBvaW50ZXJVcDpudChlLm9uUG9pbnRlclVwLGwub25UaHVtYlBvaW50ZXJVcCl9KSl9KSxyUz0iU2Nyb2xsQXJlYUNvcm5lciIsZzI9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3Qgbj1hcihyUyxlLl9fc2NvcGVTY3JvbGxBcmVhKSxyPSEhKG4uc2Nyb2xsYmFyWCYmbi5zY3JvbGxiYXJZKTtyZXR1cm4gbi50eXBlIT09InNjcm9sbCImJnI/cC5jcmVhdGVFbGVtZW50KHYyLGllKHt9LGUse3JlZjp0fSkpOm51bGx9KSx2Mj1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2Nyb2xsQXJlYTpuLC4uLnJ9PWUsaT1hcihyUyxuKSxbbyxsXT1wLnVzZVN0YXRlKDApLFtzLGFdPXAudXNlU3RhdGUoMCksdT0hIShvJiZzKTtyZXR1cm4gdXMoaS5zY3JvbGxiYXJYLCgpPT57dmFyIGM7Y29uc3QgZD0oKGM9aS5zY3JvbGxiYXJYKT09PW51bGx8fGM9PT12b2lkIDA/dm9pZCAwOmMub2Zmc2V0SGVpZ2h0KXx8MDtpLm9uQ29ybmVySGVpZ2h0Q2hhbmdlKGQpLGEoZCl9KSx1cyhpLnNjcm9sbGJhclksKCk9Pnt2YXIgYztjb25zdCBkPSgoYz1pLnNjcm9sbGJhclkpPT09bnVsbHx8Yz09PXZvaWQgMD92b2lkIDA6Yy5vZmZzZXRXaWR0aCl8fDA7aS5vbkNvcm5lcldpZHRoQ2hhbmdlKGQpLGwoZCl9KSx1P3AuY3JlYXRlRWxlbWVudChLZS5kaXYsaWUoe30scix7cmVmOnQsc3R5bGU6e3dpZHRoOm8saGVpZ2h0OnMscG9zaXRpb246ImFic29sdXRlIixyaWdodDppLmRpcj09PSJsdHIiPzA6dm9pZCAwLGxlZnQ6aS5kaXI9PT0icnRsIj8wOnZvaWQgMCxib3R0b206MCwuLi5lLnN0eWxlfX0pKTpudWxsfSk7ZnVuY3Rpb24gX2QoZSl7cmV0dXJuIGU/cGFyc2VJbnQoZSwxMCk6MH1mdW5jdGlvbiBpUyhlLHQpe2NvbnN0IG49ZS90O3JldHVybiBpc05hTihuKT8wOm59ZnVuY3Rpb24gU2YoZSl7Y29uc3QgdD1pUyhlLnZpZXdwb3J0LGUuY29udGVudCksbj1lLnNjcm9sbGJhci5wYWRkaW5nU3RhcnQrZS5zY3JvbGxiYXIucGFkZGluZ0VuZCxyPShlLnNjcm9sbGJhci5zaXplLW4pKnQ7cmV0dXJuIE1hdGgubWF4KHIsMTgpfWZ1bmN0aW9uIHkyKGUsdCxuLHI9Imx0ciIpe2NvbnN0IGk9U2Yobiksbz1pLzIsbD10fHxvLHM9aS1sLGE9bi5zY3JvbGxiYXIucGFkZGluZ1N0YXJ0K2wsdT1uLnNjcm9sbGJhci5zaXplLW4uc2Nyb2xsYmFyLnBhZGRpbmdFbmQtcyxjPW4uY29udGVudC1uLnZpZXdwb3J0LGQ9cj09PSJsdHIiP1swLGNdOltjKi0xLDBdO3JldHVybiBvUyhbYSx1XSxkKShlKX1mdW5jdGlvbiBrMChlLHQsbj0ibHRyIil7Y29uc3Qgcj1TZih0KSxpPXQuc2Nyb2xsYmFyLnBhZGRpbmdTdGFydCt0LnNjcm9sbGJhci5wYWRkaW5nRW5kLG89dC5zY3JvbGxiYXIuc2l6ZS1pLGw9dC5jb250ZW50LXQudmlld3BvcnQscz1vLXIsYT1uPT09Imx0ciI/WzAsbF06W2wqLTEsMF0sdT1ZcChlLGEpO3JldHVybiBvUyhbMCxsXSxbMCxzXSkodSl9ZnVuY3Rpb24gb1MoZSx0KXtyZXR1cm4gbj0+e2lmKGVbMF09PT1lWzFdfHx0WzBdPT09dFsxXSlyZXR1cm4gdFswXTtjb25zdCByPSh0WzFdLXRbMF0pLyhlWzFdLWVbMF0pO3JldHVybiB0WzBdK3IqKG4tZVswXSl9fWZ1bmN0aW9uIGxTKGUsdCl7cmV0dXJuIGU+MCYmZTx0fWNvbnN0IHgyPShlLHQ9KCk9Pnt9KT0+e2xldCBuPXtsZWZ0OmUuc2Nyb2xsTGVmdCx0b3A6ZS5zY3JvbGxUb3B9LHI9MDtyZXR1cm4gZnVuY3Rpb24gaSgpe2NvbnN0IG89e2xlZnQ6ZS5zY3JvbGxMZWZ0LHRvcDplLnNjcm9sbFRvcH0sbD1uLmxlZnQhPT1vLmxlZnQscz1uLnRvcCE9PW8udG9wOyhsfHxzKSYmdCgpLG49byxyPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaSl9KCksKCk9PndpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShyKX07ZnVuY3Rpb24gRWYoZSx0KXtjb25zdCBuPWVuKGUpLHI9cC51c2VSZWYoMCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT4oKT0+d2luZG93LmNsZWFyVGltZW91dChyLmN1cnJlbnQpLFtdKSxwLnVzZUNhbGxiYWNrKCgpPT57d2luZG93LmNsZWFyVGltZW91dChyLmN1cnJlbnQpLHIuY3VycmVudD13aW5kb3cuc2V0VGltZW91dChuLHQpfSxbbix0XSl9ZnVuY3Rpb24gdXMoZSx0KXtjb25zdCBuPWVuKHQpO1VuKCgpPT57bGV0IHI9MDtpZihlKXtjb25zdCBpPW5ldyBSZXNpemVPYnNlcnZlcigoKT0+e2NhbmNlbEFuaW1hdGlvbkZyYW1lKHIpLHI9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShuKX0pO3JldHVybiBpLm9ic2VydmUoZSksKCk9Pnt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUociksaS51bm9ic2VydmUoZSl9fX0sW2Usbl0pfWNvbnN0IHNTPWwyLF8yPWEyLHcyPWcyO2Z1bmN0aW9uIGFTKGUpe3ZhciB0LG4scj0iIjtpZih0eXBlb2YgZT09InN0cmluZyJ8fHR5cGVvZiBlPT0ibnVtYmVyIilyKz1lO2Vsc2UgaWYodHlwZW9mIGU9PSJvYmplY3QiKWlmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdJiYobj1hUyhlW3RdKSkmJihyJiYocis9IiAiKSxyKz1uKTtlbHNlIGZvcih0IGluIGUpZVt0XSYmKHImJihyKz0iICIpLHIrPXQpO3JldHVybiByfWZ1bmN0aW9uIHVTKCl7Zm9yKHZhciBlLHQsbj0wLHI9IiI7bjxhcmd1bWVudHMubGVuZ3RoOykoZT1hcmd1bWVudHNbbisrXSkmJih0PWFTKGUpKSYmKHImJihyKz0iICIpLHIrPXQpO3JldHVybiByfWNvbnN0IFhnPSItIjtmdW5jdGlvbiBTMihlKXtjb25zdCB0PUMyKGUpLHtjb25mbGljdGluZ0NsYXNzR3JvdXBzOm4sY29uZmxpY3RpbmdDbGFzc0dyb3VwTW9kaWZpZXJzOnJ9PWU7ZnVuY3Rpb24gaShsKXtjb25zdCBzPWwuc3BsaXQoWGcpO3JldHVybiBzWzBdPT09IiImJnMubGVuZ3RoIT09MSYmcy5zaGlmdCgpLGNTKHMsdCl8fEUyKGwpfWZ1bmN0aW9uIG8obCxzKXtjb25zdCBhPW5bbF18fFtdO3JldHVybiBzJiZyW2xdP1suLi5hLC4uLnJbbF1dOmF9cmV0dXJue2dldENsYXNzR3JvdXBJZDppLGdldENvbmZsaWN0aW5nQ2xhc3NHcm91cElkczpvfX1mdW5jdGlvbiBjUyhlLHQpe3ZhciBsO2lmKGUubGVuZ3RoPT09MClyZXR1cm4gdC5jbGFzc0dyb3VwSWQ7Y29uc3Qgbj1lWzBdLHI9dC5uZXh0UGFydC5nZXQobiksaT1yP2NTKGUuc2xpY2UoMSkscik6dm9pZCAwO2lmKGkpcmV0dXJuIGk7aWYodC52YWxpZGF0b3JzLmxlbmd0aD09PTApcmV0dXJuO2NvbnN0IG89ZS5qb2luKFhnKTtyZXR1cm4obD10LnZhbGlkYXRvcnMuZmluZCgoe3ZhbGlkYXRvcjpzfSk9PnMobykpKT09bnVsbD92b2lkIDA6bC5jbGFzc0dyb3VwSWR9Y29uc3QgJDA9L15cWyguKylcXSQvO2Z1bmN0aW9uIEUyKGUpe2lmKCQwLnRlc3QoZSkpe2NvbnN0IHQ9JDAuZXhlYyhlKVsxXSxuPXQ9PW51bGw/dm9pZCAwOnQuc3Vic3RyaW5nKDAsdC5pbmRleE9mKCI6IikpO2lmKG4pcmV0dXJuImFyYml0cmFyeS4uIitufX1mdW5jdGlvbiBDMihlKXtjb25zdHt0aGVtZTp0LHByZWZpeDpufT1lLHI9e25leHRQYXJ0Om5ldyBNYXAsdmFsaWRhdG9yczpbXX07cmV0dXJuICQyKE9iamVjdC5lbnRyaWVzKGUuY2xhc3NHcm91cHMpLG4pLmZvckVhY2goKFtvLGxdKT0+e1FwKGwscixvLHQpfSkscn1mdW5jdGlvbiBRcChlLHQsbixyKXtlLmZvckVhY2goaT0+e2lmKHR5cGVvZiBpPT0ic3RyaW5nIil7Y29uc3Qgbz1pPT09IiI/dDpiMCh0LGkpO28uY2xhc3NHcm91cElkPW47cmV0dXJufWlmKHR5cGVvZiBpPT0iZnVuY3Rpb24iKXtpZihrMihpKSl7UXAoaShyKSx0LG4scik7cmV0dXJufXQudmFsaWRhdG9ycy5wdXNoKHt2YWxpZGF0b3I6aSxjbGFzc0dyb3VwSWQ6bn0pO3JldHVybn1PYmplY3QuZW50cmllcyhpKS5mb3JFYWNoKChbbyxsXSk9PntRcChsLGIwKHQsbyksbixyKX0pfSl9ZnVuY3Rpb24gYjAoZSx0KXtsZXQgbj1lO3JldHVybiB0LnNwbGl0KFhnKS5mb3JFYWNoKHI9PntuLm5leHRQYXJ0LmhhcyhyKXx8bi5uZXh0UGFydC5zZXQocix7bmV4dFBhcnQ6bmV3IE1hcCx2YWxpZGF0b3JzOltdfSksbj1uLm5leHRQYXJ0LmdldChyKX0pLG59ZnVuY3Rpb24gazIoZSl7cmV0dXJuIGUuaXNUaGVtZUdldHRlcn1mdW5jdGlvbiAkMihlLHQpe3JldHVybiB0P2UubWFwKChbbixyXSk9Pntjb25zdCBpPXIubWFwKG89PnR5cGVvZiBvPT0ic3RyaW5nIj90K286dHlwZW9mIG89PSJvYmplY3QiP09iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhvKS5tYXAoKFtsLHNdKT0+W3QrbCxzXSkpOm8pO3JldHVybltuLGldfSk6ZX1mdW5jdGlvbiBiMihlKXtpZihlPDEpcmV0dXJue2dldDooKT0+e30sc2V0OigpPT57fX07bGV0IHQ9MCxuPW5ldyBNYXAscj1uZXcgTWFwO2Z1bmN0aW9uIGkobyxsKXtuLnNldChvLGwpLHQrKyx0PmUmJih0PTAscj1uLG49bmV3IE1hcCl9cmV0dXJue2dldChvKXtsZXQgbD1uLmdldChvKTtpZihsIT09dm9pZCAwKXJldHVybiBsO2lmKChsPXIuZ2V0KG8pKSE9PXZvaWQgMClyZXR1cm4gaShvLGwpLGx9LHNldChvLGwpe24uaGFzKG8pP24uc2V0KG8sbCk6aShvLGwpfX19Y29uc3QgZFM9IiEiO2Z1bmN0aW9uIFQyKGUpe2NvbnN0IHQ9ZS5zZXBhcmF0b3Isbj10Lmxlbmd0aD09PTEscj10WzBdLGk9dC5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKGwpe2NvbnN0IHM9W107bGV0IGE9MCx1PTAsYztmb3IobGV0IGc9MDtnPGwubGVuZ3RoO2crKyl7bGV0IFM9bFtnXTtpZihhPT09MCl7aWYoUz09PXImJihufHxsLnNsaWNlKGcsZytpKT09PXQpKXtzLnB1c2gobC5zbGljZSh1LGcpKSx1PWcraTtjb250aW51ZX1pZihTPT09Ii8iKXtjPWc7Y29udGludWV9fVM9PT0iWyI/YSsrOlM9PT0iXSImJmEtLX1jb25zdCBkPXMubGVuZ3RoPT09MD9sOmwuc3Vic3RyaW5nKHUpLGY9ZC5zdGFydHNXaXRoKGRTKSxoPWY/ZC5zdWJzdHJpbmcoMSk6ZCxtPWMmJmM+dT9jLXU6dm9pZCAwO3JldHVybnttb2RpZmllcnM6cyxoYXNJbXBvcnRhbnRNb2RpZmllcjpmLGJhc2VDbGFzc05hbWU6aCxtYXliZVBvc3RmaXhNb2RpZmllclBvc2l0aW9uOm19fX1mdW5jdGlvbiBOMihlKXtpZihlLmxlbmd0aDw9MSlyZXR1cm4gZTtjb25zdCB0PVtdO2xldCBuPVtdO3JldHVybiBlLmZvckVhY2gocj0+e3JbMF09PT0iWyI/KHQucHVzaCguLi5uLnNvcnQoKSxyKSxuPVtdKTpuLnB1c2gocil9KSx0LnB1c2goLi4ubi5zb3J0KCkpLHR9ZnVuY3Rpb24gUjIoZSl7cmV0dXJue2NhY2hlOmIyKGUuY2FjaGVTaXplKSxzcGxpdE1vZGlmaWVyczpUMihlKSwuLi5TMihlKX19Y29uc3QgTzI9L1xzKy87ZnVuY3Rpb24gUDIoZSx0KXtjb25zdHtzcGxpdE1vZGlmaWVyczpuLGdldENsYXNzR3JvdXBJZDpyLGdldENvbmZsaWN0aW5nQ2xhc3NHcm91cElkczppfT10LG89bmV3IFNldDtyZXR1cm4gZS50cmltKCkuc3BsaXQoTzIpLm1hcChsPT57Y29uc3R7bW9kaWZpZXJzOnMsaGFzSW1wb3J0YW50TW9kaWZpZXI6YSxiYXNlQ2xhc3NOYW1lOnUsbWF5YmVQb3N0Zml4TW9kaWZpZXJQb3NpdGlvbjpjfT1uKGwpO2xldCBkPXIoYz91LnN1YnN0cmluZygwLGMpOnUpLGY9ISFjO2lmKCFkKXtpZighYylyZXR1cm57aXNUYWlsd2luZENsYXNzOiExLG9yaWdpbmFsQ2xhc3NOYW1lOmx9O2lmKGQ9cih1KSwhZClyZXR1cm57aXNUYWlsd2luZENsYXNzOiExLG9yaWdpbmFsQ2xhc3NOYW1lOmx9O2Y9ITF9Y29uc3QgaD1OMihzKS5qb2luKCI6Iik7cmV0dXJue2lzVGFpbHdpbmRDbGFzczohMCxtb2RpZmllcklkOmE/aCtkUzpoLGNsYXNzR3JvdXBJZDpkLG9yaWdpbmFsQ2xhc3NOYW1lOmwsaGFzUG9zdGZpeE1vZGlmaWVyOmZ9fSkucmV2ZXJzZSgpLmZpbHRlcihsPT57aWYoIWwuaXNUYWlsd2luZENsYXNzKXJldHVybiEwO2NvbnN0e21vZGlmaWVySWQ6cyxjbGFzc0dyb3VwSWQ6YSxoYXNQb3N0Zml4TW9kaWZpZXI6dX09bCxjPXMrYTtyZXR1cm4gby5oYXMoYyk/ITE6KG8uYWRkKGMpLGkoYSx1KS5mb3JFYWNoKGQ9Pm8uYWRkKHMrZCkpLCEwKX0pLnJldmVyc2UoKS5tYXAobD0+bC5vcmlnaW5hbENsYXNzTmFtZSkuam9pbigiICIpfWZ1bmN0aW9uIEEyKCl7bGV0IGU9MCx0LG4scj0iIjtmb3IoO2U8YXJndW1lbnRzLmxlbmd0aDspKHQ9YXJndW1lbnRzW2UrK10pJiYobj1mUyh0KSkmJihyJiYocis9IiAiKSxyKz1uKTtyZXR1cm4gcn1mdW5jdGlvbiBmUyhlKXtpZih0eXBlb2YgZT09InN0cmluZyIpcmV0dXJuIGU7bGV0IHQsbj0iIjtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKyllW3JdJiYodD1mUyhlW3JdKSkmJihuJiYobis9IiAiKSxuKz10KTtyZXR1cm4gbn1mdW5jdGlvbiBNMihlLC4uLnQpe2xldCBuLHIsaSxvPWw7ZnVuY3Rpb24gbChhKXtjb25zdCB1PXQucmVkdWNlKChjLGQpPT5kKGMpLGUoKSk7cmV0dXJuIG49UjIodSkscj1uLmNhY2hlLmdldCxpPW4uY2FjaGUuc2V0LG89cyxzKGEpfWZ1bmN0aW9uIHMoYSl7Y29uc3QgdT1yKGEpO2lmKHUpcmV0dXJuIHU7Y29uc3QgYz1QMihhLG4pO3JldHVybiBpKGEsYyksY31yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbyhBMi5hcHBseShudWxsLGFyZ3VtZW50cykpfX1mdW5jdGlvbiBxZShlKXtjb25zdCB0PW49Pm5bZV18fFtdO3JldHVybiB0LmlzVGhlbWVHZXR0ZXI9ITAsdH1jb25zdCBoUz0vXlxbKD86KFthLXotXSspOik/KC4rKVxdJC9pLEQyPS9eXGQrXC9cZCskLyxJMj1uZXcgU2V0KFsicHgiLCJmdWxsIiwic2NyZWVuIl0pLEwyPS9eKFxkKyhcLlxkKyk/KT8oeHN8c218bWR8bGd8eGwpJC8sajI9L1xkKyglfHB4fHI/ZW18W3NkbF0/dihbaHdpYl18bWlufG1heCl8cHR8cGN8aW58Y218bW18Y2FwfGNofGV4fHI/bGh8Y3Eod3xofGl8YnxtaW58bWF4KSl8XGIoY2FsY3xtaW58bWF4fGNsYW1wKVwoLitcKXxeMCQvLHoyPS9eLT8oKFxkKyk/XC4/KFxkKylbYS16XSt8MClfLT8oKFxkKyk/XC4/KFxkKylbYS16XSt8MCkvLEYyPS9eKHVybHxpbWFnZXxpbWFnZS1zZXR8Y3Jvc3MtZmFkZXxlbGVtZW50fChyZXBlYXRpbmctKT8obGluZWFyfHJhZGlhbHxjb25pYyktZ3JhZGllbnQpXCguK1wpJC87ZnVuY3Rpb24gaHIoZSl7cmV0dXJuIE1vKGUpfHxJMi5oYXMoZSl8fEQyLnRlc3QoZSl9ZnVuY3Rpb24gVGkoZSl7cmV0dXJuIEVzKGUsImxlbmd0aCIsRzIpfWZ1bmN0aW9uIE1vKGUpe3JldHVybiEhZSYmIU51bWJlci5pc05hTihOdW1iZXIoZSkpfWZ1bmN0aW9uIHBjKGUpe3JldHVybiBFcyhlLCJudW1iZXIiLE1vKX1mdW5jdGlvbiBYcyhlKXtyZXR1cm4hIWUmJk51bWJlci5pc0ludGVnZXIoTnVtYmVyKGUpKX1mdW5jdGlvbiBCMihlKXtyZXR1cm4gZS5lbmRzV2l0aCgiJSIpJiZNbyhlLnNsaWNlKDAsLTEpKX1mdW5jdGlvbiBFZShlKXtyZXR1cm4gaFMudGVzdChlKX1mdW5jdGlvbiBOaShlKXtyZXR1cm4gTDIudGVzdChlKX1jb25zdCBVMj1uZXcgU2V0KFsibGVuZ3RoIiwic2l6ZSIsInBlcmNlbnRhZ2UiXSk7ZnVuY3Rpb24gVzIoZSl7cmV0dXJuIEVzKGUsVTIscFMpfWZ1bmN0aW9uIFYyKGUpe3JldHVybiBFcyhlLCJwb3NpdGlvbiIscFMpfWNvbnN0IEgyPW5ldyBTZXQoWyJpbWFnZSIsInVybCJdKTtmdW5jdGlvbiBLMihlKXtyZXR1cm4gRXMoZSxIMixYMil9ZnVuY3Rpb24gWjIoZSl7cmV0dXJuIEVzKGUsIiIsWTIpfWZ1bmN0aW9uIFFzKCl7cmV0dXJuITB9ZnVuY3Rpb24gRXMoZSx0LG4pe2NvbnN0IHI9aFMuZXhlYyhlKTtyZXR1cm4gcj9yWzFdP3R5cGVvZiB0PT0ic3RyaW5nIj9yWzFdPT09dDp0LmhhcyhyWzFdKTpuKHJbMl0pOiExfWZ1bmN0aW9uIEcyKGUpe3JldHVybiBqMi50ZXN0KGUpfWZ1bmN0aW9uIHBTKCl7cmV0dXJuITF9ZnVuY3Rpb24gWTIoZSl7cmV0dXJuIHoyLnRlc3QoZSl9ZnVuY3Rpb24gWDIoZSl7cmV0dXJuIEYyLnRlc3QoZSl9ZnVuY3Rpb24gUTIoKXtjb25zdCBlPXFlKCJjb2xvcnMiKSx0PXFlKCJzcGFjaW5nIiksbj1xZSgiYmx1ciIpLHI9cWUoImJyaWdodG5lc3MiKSxpPXFlKCJib3JkZXJDb2xvciIpLG89cWUoImJvcmRlclJhZGl1cyIpLGw9cWUoImJvcmRlclNwYWNpbmciKSxzPXFlKCJib3JkZXJXaWR0aCIpLGE9cWUoImNvbnRyYXN0IiksdT1xZSgiZ3JheXNjYWxlIiksYz1xZSgiaHVlUm90YXRlIiksZD1xZSgiaW52ZXJ0IiksZj1xZSgiZ2FwIiksaD1xZSgiZ3JhZGllbnRDb2xvclN0b3BzIiksbT1xZSgiZ3JhZGllbnRDb2xvclN0b3BQb3NpdGlvbnMiKSxnPXFlKCJpbnNldCIpLFM9cWUoIm1hcmdpbiIpLHY9cWUoIm9wYWNpdHkiKSx5PXFlKCJwYWRkaW5nIiksXz1xZSgic2F0dXJhdGUiKSx3PXFlKCJzY2FsZSIpLEU9cWUoInNlcGlhIiksJD1xZSgic2tldyIpLEM9cWUoInNwYWNlIiksVD1xZSgidHJhbnNsYXRlIiksTj0oKT0+WyJhdXRvIiwiY29udGFpbiIsIm5vbmUiXSxSPSgpPT5bImF1dG8iLCJoaWRkZW4iLCJjbGlwIiwidmlzaWJsZSIsInNjcm9sbCJdLEQ9KCk9PlsiYXV0byIsRWUsdF0sRj0oKT0+W0VlLHRdLHNlPSgpPT5bIiIsaHIsVGldLFY9KCk9PlsiYXV0byIsTW8sRWVdLEs9KCk9PlsiYm90dG9tIiwiY2VudGVyIiwibGVmdCIsImxlZnQtYm90dG9tIiwibGVmdC10b3AiLCJyaWdodCIsInJpZ2h0LWJvdHRvbSIsInJpZ2h0LXRvcCIsInRvcCJdLE89KCk9Plsic29saWQiLCJkYXNoZWQiLCJkb3R0ZWQiLCJkb3VibGUiLCJub25lIl0sQT0oKT0+WyJub3JtYWwiLCJtdWx0aXBseSIsInNjcmVlbiIsIm92ZXJsYXkiLCJkYXJrZW4iLCJsaWdodGVuIiwiY29sb3ItZG9kZ2UiLCJjb2xvci1idXJuIiwiaGFyZC1saWdodCIsInNvZnQtbGlnaHQiLCJkaWZmZXJlbmNlIiwiZXhjbHVzaW9uIiwiaHVlIiwic2F0dXJhdGlvbiIsImNvbG9yIiwibHVtaW5vc2l0eSIsInBsdXMtbGlnaHRlciJdLGs9KCk9Plsic3RhcnQiLCJlbmQiLCJjZW50ZXIiLCJiZXR3ZWVuIiwiYXJvdW5kIiwiZXZlbmx5Iiwic3RyZXRjaCJdLGo9KCk9PlsiIiwiMCIsRWVdLEw9KCk9PlsiYXV0byIsImF2b2lkIiwiYWxsIiwiYXZvaWQtcGFnZSIsInBhZ2UiLCJsZWZ0IiwicmlnaHQiLCJjb2x1bW4iXSxaPSgpPT5bTW8scGNdLG5lPSgpPT5bTW8sRWVdO3JldHVybntjYWNoZVNpemU6NTAwLHNlcGFyYXRvcjoiOiIsdGhlbWU6e2NvbG9yczpbUXNdLHNwYWNpbmc6W2hyLFRpXSxibHVyOlsibm9uZSIsIiIsTmksRWVdLGJyaWdodG5lc3M6WigpLGJvcmRlckNvbG9yOltlXSxib3JkZXJSYWRpdXM6WyJub25lIiwiIiwiZnVsbCIsTmksRWVdLGJvcmRlclNwYWNpbmc6RigpLGJvcmRlcldpZHRoOnNlKCksY29udHJhc3Q6WigpLGdyYXlzY2FsZTpqKCksaHVlUm90YXRlOm5lKCksaW52ZXJ0OmooKSxnYXA6RigpLGdyYWRpZW50Q29sb3JTdG9wczpbZV0sZ3JhZGllbnRDb2xvclN0b3BQb3NpdGlvbnM6W0IyLFRpXSxpbnNldDpEKCksbWFyZ2luOkQoKSxvcGFjaXR5OlooKSxwYWRkaW5nOkYoKSxzYXR1cmF0ZTpaKCksc2NhbGU6WigpLHNlcGlhOmooKSxza2V3Om5lKCksc3BhY2U6RigpLHRyYW5zbGF0ZTpGKCl9LGNsYXNzR3JvdXBzOnthc3BlY3Q6W3thc3BlY3Q6WyJhdXRvIiwic3F1YXJlIiwidmlkZW8iLEVlXX1dLGNvbnRhaW5lcjpbImNvbnRhaW5lciJdLGNvbHVtbnM6W3tjb2x1bW5zOltOaV19XSwiYnJlYWstYWZ0ZXIiOlt7ImJyZWFrLWFmdGVyIjpMKCl9XSwiYnJlYWstYmVmb3JlIjpbeyJicmVhay1iZWZvcmUiOkwoKX1dLCJicmVhay1pbnNpZGUiOlt7ImJyZWFrLWluc2lkZSI6WyJhdXRvIiwiYXZvaWQiLCJhdm9pZC1wYWdlIiwiYXZvaWQtY29sdW1uIl19XSwiYm94LWRlY29yYXRpb24iOlt7ImJveC1kZWNvcmF0aW9uIjpbInNsaWNlIiwiY2xvbmUiXX1dLGJveDpbe2JveDpbImJvcmRlciIsImNvbnRlbnQiXX1dLGRpc3BsYXk6WyJibG9jayIsImlubGluZS1ibG9jayIsImlubGluZSIsImZsZXgiLCJpbmxpbmUtZmxleCIsInRhYmxlIiwiaW5saW5lLXRhYmxlIiwidGFibGUtY2FwdGlvbiIsInRhYmxlLWNlbGwiLCJ0YWJsZS1jb2x1bW4iLCJ0YWJsZS1jb2x1bW4tZ3JvdXAiLCJ0YWJsZS1mb290ZXItZ3JvdXAiLCJ0YWJsZS1oZWFkZXItZ3JvdXAiLCJ0YWJsZS1yb3ctZ3JvdXAiLCJ0YWJsZS1yb3ciLCJmbG93LXJvb3QiLCJncmlkIiwiaW5saW5lLWdyaWQiLCJjb250ZW50cyIsImxpc3QtaXRlbSIsImhpZGRlbiJdLGZsb2F0Olt7ZmxvYXQ6WyJyaWdodCIsImxlZnQiLCJub25lIl19XSxjbGVhcjpbe2NsZWFyOlsibGVmdCIsInJpZ2h0IiwiYm90aCIsIm5vbmUiXX1dLGlzb2xhdGlvbjpbImlzb2xhdGUiLCJpc29sYXRpb24tYXV0byJdLCJvYmplY3QtZml0Ijpbe29iamVjdDpbImNvbnRhaW4iLCJjb3ZlciIsImZpbGwiLCJub25lIiwic2NhbGUtZG93biJdfV0sIm9iamVjdC1wb3NpdGlvbiI6W3tvYmplY3Q6Wy4uLksoKSxFZV19XSxvdmVyZmxvdzpbe292ZXJmbG93OlIoKX1dLCJvdmVyZmxvdy14IjpbeyJvdmVyZmxvdy14IjpSKCl9XSwib3ZlcmZsb3cteSI6W3sib3ZlcmZsb3cteSI6UigpfV0sb3ZlcnNjcm9sbDpbe292ZXJzY3JvbGw6TigpfV0sIm92ZXJzY3JvbGwteCI6W3sib3ZlcnNjcm9sbC14IjpOKCl9XSwib3ZlcnNjcm9sbC15IjpbeyJvdmVyc2Nyb2xsLXkiOk4oKX1dLHBvc2l0aW9uOlsic3RhdGljIiwiZml4ZWQiLCJhYnNvbHV0ZSIsInJlbGF0aXZlIiwic3RpY2t5Il0saW5zZXQ6W3tpbnNldDpbZ119XSwiaW5zZXQteCI6W3siaW5zZXQteCI6W2ddfV0sImluc2V0LXkiOlt7Imluc2V0LXkiOltnXX1dLHN0YXJ0Olt7c3RhcnQ6W2ddfV0sZW5kOlt7ZW5kOltnXX1dLHRvcDpbe3RvcDpbZ119XSxyaWdodDpbe3JpZ2h0OltnXX1dLGJvdHRvbTpbe2JvdHRvbTpbZ119XSxsZWZ0Olt7bGVmdDpbZ119XSx2aXNpYmlsaXR5OlsidmlzaWJsZSIsImludmlzaWJsZSIsImNvbGxhcHNlIl0sejpbe3o6WyJhdXRvIixYcyxFZV19XSxiYXNpczpbe2Jhc2lzOkQoKX1dLCJmbGV4LWRpcmVjdGlvbiI6W3tmbGV4Olsicm93Iiwicm93LXJldmVyc2UiLCJjb2wiLCJjb2wtcmV2ZXJzZSJdfV0sImZsZXgtd3JhcCI6W3tmbGV4Olsid3JhcCIsIndyYXAtcmV2ZXJzZSIsIm5vd3JhcCJdfV0sZmxleDpbe2ZsZXg6WyIxIiwiYXV0byIsImluaXRpYWwiLCJub25lIixFZV19XSxncm93Olt7Z3JvdzpqKCl9XSxzaHJpbms6W3tzaHJpbms6aigpfV0sb3JkZXI6W3tvcmRlcjpbImZpcnN0IiwibGFzdCIsIm5vbmUiLFhzLEVlXX1dLCJncmlkLWNvbHMiOlt7ImdyaWQtY29scyI6W1FzXX1dLCJjb2wtc3RhcnQtZW5kIjpbe2NvbDpbImF1dG8iLHtzcGFuOlsiZnVsbCIsWHMsRWVdfSxFZV19XSwiY29sLXN0YXJ0IjpbeyJjb2wtc3RhcnQiOlYoKX1dLCJjb2wtZW5kIjpbeyJjb2wtZW5kIjpWKCl9XSwiZ3JpZC1yb3dzIjpbeyJncmlkLXJvd3MiOltRc119XSwicm93LXN0YXJ0LWVuZCI6W3tyb3c6WyJhdXRvIix7c3BhbjpbWHMsRWVdfSxFZV19XSwicm93LXN0YXJ0IjpbeyJyb3ctc3RhcnQiOlYoKX1dLCJyb3ctZW5kIjpbeyJyb3ctZW5kIjpWKCl9XSwiZ3JpZC1mbG93IjpbeyJncmlkLWZsb3ciOlsicm93IiwiY29sIiwiZGVuc2UiLCJyb3ctZGVuc2UiLCJjb2wtZGVuc2UiXX1dLCJhdXRvLWNvbHMiOlt7ImF1dG8tY29scyI6WyJhdXRvIiwibWluIiwibWF4IiwiZnIiLEVlXX1dLCJhdXRvLXJvd3MiOlt7ImF1dG8tcm93cyI6WyJhdXRvIiwibWluIiwibWF4IiwiZnIiLEVlXX1dLGdhcDpbe2dhcDpbZl19XSwiZ2FwLXgiOlt7ImdhcC14IjpbZl19XSwiZ2FwLXkiOlt7ImdhcC15IjpbZl19XSwianVzdGlmeS1jb250ZW50Ijpbe2p1c3RpZnk6WyJub3JtYWwiLC4uLmsoKV19XSwianVzdGlmeS1pdGVtcyI6W3sianVzdGlmeS1pdGVtcyI6WyJzdGFydCIsImVuZCIsImNlbnRlciIsInN0cmV0Y2giXX1dLCJqdXN0aWZ5LXNlbGYiOlt7Imp1c3RpZnktc2VsZiI6WyJhdXRvIiwic3RhcnQiLCJlbmQiLCJjZW50ZXIiLCJzdHJldGNoIl19XSwiYWxpZ24tY29udGVudCI6W3tjb250ZW50Olsibm9ybWFsIiwuLi5rKCksImJhc2VsaW5lIl19XSwiYWxpZ24taXRlbXMiOlt7aXRlbXM6WyJzdGFydCIsImVuZCIsImNlbnRlciIsImJhc2VsaW5lIiwic3RyZXRjaCJdfV0sImFsaWduLXNlbGYiOlt7c2VsZjpbImF1dG8iLCJzdGFydCIsImVuZCIsImNlbnRlciIsInN0cmV0Y2giLCJiYXNlbGluZSJdfV0sInBsYWNlLWNvbnRlbnQiOlt7InBsYWNlLWNvbnRlbnQiOlsuLi5rKCksImJhc2VsaW5lIl19XSwicGxhY2UtaXRlbXMiOlt7InBsYWNlLWl0ZW1zIjpbInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwiYmFzZWxpbmUiLCJzdHJldGNoIl19XSwicGxhY2Utc2VsZiI6W3sicGxhY2Utc2VsZiI6WyJhdXRvIiwic3RhcnQiLCJlbmQiLCJjZW50ZXIiLCJzdHJldGNoIl19XSxwOlt7cDpbeV19XSxweDpbe3B4Olt5XX1dLHB5Olt7cHk6W3ldfV0scHM6W3twczpbeV19XSxwZTpbe3BlOlt5XX1dLHB0Olt7cHQ6W3ldfV0scHI6W3twcjpbeV19XSxwYjpbe3BiOlt5XX1dLHBsOlt7cGw6W3ldfV0sbTpbe206W1NdfV0sbXg6W3tteDpbU119XSxteTpbe215OltTXX1dLG1zOlt7bXM6W1NdfV0sbWU6W3ttZTpbU119XSxtdDpbe210OltTXX1dLG1yOlt7bXI6W1NdfV0sbWI6W3ttYjpbU119XSxtbDpbe21sOltTXX1dLCJzcGFjZS14IjpbeyJzcGFjZS14IjpbQ119XSwic3BhY2UteC1yZXZlcnNlIjpbInNwYWNlLXgtcmV2ZXJzZSJdLCJzcGFjZS15IjpbeyJzcGFjZS15IjpbQ119XSwic3BhY2UteS1yZXZlcnNlIjpbInNwYWNlLXktcmV2ZXJzZSJdLHc6W3t3OlsiYXV0byIsIm1pbiIsIm1heCIsImZpdCIsRWUsdF19XSwibWluLXciOlt7Im1pbi13IjpbIm1pbiIsIm1heCIsImZpdCIsRWUsaHJdfV0sIm1heC13IjpbeyJtYXgtdyI6WyIwIiwibm9uZSIsImZ1bGwiLCJtaW4iLCJtYXgiLCJmaXQiLCJwcm9zZSIse3NjcmVlbjpbTmldfSxOaSxFZV19XSxoOlt7aDpbRWUsdCwiYXV0byIsIm1pbiIsIm1heCIsImZpdCJdfV0sIm1pbi1oIjpbeyJtaW4taCI6WyJtaW4iLCJtYXgiLCJmaXQiLGhyLEVlXX1dLCJtYXgtaCI6W3sibWF4LWgiOltFZSx0LCJtaW4iLCJtYXgiLCJmaXQiXX1dLCJmb250LXNpemUiOlt7dGV4dDpbImJhc2UiLE5pLFRpXX1dLCJmb250LXNtb290aGluZyI6WyJhbnRpYWxpYXNlZCIsInN1YnBpeGVsLWFudGlhbGlhc2VkIl0sImZvbnQtc3R5bGUiOlsiaXRhbGljIiwibm90LWl0YWxpYyJdLCJmb250LXdlaWdodCI6W3tmb250OlsidGhpbiIsImV4dHJhbGlnaHQiLCJsaWdodCIsIm5vcm1hbCIsIm1lZGl1bSIsInNlbWlib2xkIiwiYm9sZCIsImV4dHJhYm9sZCIsImJsYWNrIixwY119XSwiZm9udC1mYW1pbHkiOlt7Zm9udDpbUXNdfV0sImZ2bi1ub3JtYWwiOlsibm9ybWFsLW51bXMiXSwiZnZuLW9yZGluYWwiOlsib3JkaW5hbCJdLCJmdm4tc2xhc2hlZC16ZXJvIjpbInNsYXNoZWQtemVybyJdLCJmdm4tZmlndXJlIjpbImxpbmluZy1udW1zIiwib2xkc3R5bGUtbnVtcyJdLCJmdm4tc3BhY2luZyI6WyJwcm9wb3J0aW9uYWwtbnVtcyIsInRhYnVsYXItbnVtcyJdLCJmdm4tZnJhY3Rpb24iOlsiZGlhZ29uYWwtZnJhY3Rpb25zIiwic3RhY2tlZC1mcmFjdG9ucyJdLHRyYWNraW5nOlt7dHJhY2tpbmc6WyJ0aWdodGVyIiwidGlnaHQiLCJub3JtYWwiLCJ3aWRlIiwid2lkZXIiLCJ3aWRlc3QiLEVlXX1dLCJsaW5lLWNsYW1wIjpbeyJsaW5lLWNsYW1wIjpbIm5vbmUiLE1vLHBjXX1dLGxlYWRpbmc6W3tsZWFkaW5nOlsibm9uZSIsInRpZ2h0Iiwic251ZyIsIm5vcm1hbCIsInJlbGF4ZWQiLCJsb29zZSIsaHIsRWVdfV0sImxpc3QtaW1hZ2UiOlt7Imxpc3QtaW1hZ2UiOlsibm9uZSIsRWVdfV0sImxpc3Qtc3R5bGUtdHlwZSI6W3tsaXN0Olsibm9uZSIsImRpc2MiLCJkZWNpbWFsIixFZV19XSwibGlzdC1zdHlsZS1wb3NpdGlvbiI6W3tsaXN0OlsiaW5zaWRlIiwib3V0c2lkZSJdfV0sInBsYWNlaG9sZGVyLWNvbG9yIjpbe3BsYWNlaG9sZGVyOltlXX1dLCJwbGFjZWhvbGRlci1vcGFjaXR5IjpbeyJwbGFjZWhvbGRlci1vcGFjaXR5Ijpbdl19XSwidGV4dC1hbGlnbm1lbnQiOlt7dGV4dDpbImxlZnQiLCJjZW50ZXIiLCJyaWdodCIsImp1c3RpZnkiLCJzdGFydCIsImVuZCJdfV0sInRleHQtY29sb3IiOlt7dGV4dDpbZV19XSwidGV4dC1vcGFjaXR5IjpbeyJ0ZXh0LW9wYWNpdHkiOlt2XX1dLCJ0ZXh0LWRlY29yYXRpb24iOlsidW5kZXJsaW5lIiwib3ZlcmxpbmUiLCJsaW5lLXRocm91Z2giLCJuby11bmRlcmxpbmUiXSwidGV4dC1kZWNvcmF0aW9uLXN0eWxlIjpbe2RlY29yYXRpb246Wy4uLk8oKSwid2F2eSJdfV0sInRleHQtZGVjb3JhdGlvbi10aGlja25lc3MiOlt7ZGVjb3JhdGlvbjpbImF1dG8iLCJmcm9tLWZvbnQiLGhyLFRpXX1dLCJ1bmRlcmxpbmUtb2Zmc2V0IjpbeyJ1bmRlcmxpbmUtb2Zmc2V0IjpbImF1dG8iLGhyLEVlXX1dLCJ0ZXh0LWRlY29yYXRpb24tY29sb3IiOlt7ZGVjb3JhdGlvbjpbZV19XSwidGV4dC10cmFuc2Zvcm0iOlsidXBwZXJjYXNlIiwibG93ZXJjYXNlIiwiY2FwaXRhbGl6ZSIsIm5vcm1hbC1jYXNlIl0sInRleHQtb3ZlcmZsb3ciOlsidHJ1bmNhdGUiLCJ0ZXh0LWVsbGlwc2lzIiwidGV4dC1jbGlwIl0saW5kZW50Olt7aW5kZW50OkYoKX1dLCJ2ZXJ0aWNhbC1hbGlnbiI6W3thbGlnbjpbImJhc2VsaW5lIiwidG9wIiwibWlkZGxlIiwiYm90dG9tIiwidGV4dC10b3AiLCJ0ZXh0LWJvdHRvbSIsInN1YiIsInN1cGVyIixFZV19XSx3aGl0ZXNwYWNlOlt7d2hpdGVzcGFjZTpbIm5vcm1hbCIsIm5vd3JhcCIsInByZSIsInByZS1saW5lIiwicHJlLXdyYXAiLCJicmVhay1zcGFjZXMiXX1dLGJyZWFrOlt7YnJlYWs6WyJub3JtYWwiLCJ3b3JkcyIsImFsbCIsImtlZXAiXX1dLGh5cGhlbnM6W3toeXBoZW5zOlsibm9uZSIsIm1hbnVhbCIsImF1dG8iXX1dLGNvbnRlbnQ6W3tjb250ZW50Olsibm9uZSIsRWVdfV0sImJnLWF0dGFjaG1lbnQiOlt7Ymc6WyJmaXhlZCIsImxvY2FsIiwic2Nyb2xsIl19XSwiYmctY2xpcCI6W3siYmctY2xpcCI6WyJib3JkZXIiLCJwYWRkaW5nIiwiY29udGVudCIsInRleHQiXX1dLCJiZy1vcGFjaXR5IjpbeyJiZy1vcGFjaXR5Ijpbdl19XSwiYmctb3JpZ2luIjpbeyJiZy1vcmlnaW4iOlsiYm9yZGVyIiwicGFkZGluZyIsImNvbnRlbnQiXX1dLCJiZy1wb3NpdGlvbiI6W3tiZzpbLi4uSygpLFYyXX1dLCJiZy1yZXBlYXQiOlt7Ymc6WyJuby1yZXBlYXQiLHtyZXBlYXQ6WyIiLCJ4IiwieSIsInJvdW5kIiwic3BhY2UiXX1dfV0sImJnLXNpemUiOlt7Ymc6WyJhdXRvIiwiY292ZXIiLCJjb250YWluIixXMl19XSwiYmctaW1hZ2UiOlt7Ymc6WyJub25lIix7ImdyYWRpZW50LXRvIjpbInQiLCJ0ciIsInIiLCJiciIsImIiLCJibCIsImwiLCJ0bCJdfSxLMl19XSwiYmctY29sb3IiOlt7Ymc6W2VdfV0sImdyYWRpZW50LWZyb20tcG9zIjpbe2Zyb206W21dfV0sImdyYWRpZW50LXZpYS1wb3MiOlt7dmlhOlttXX1dLCJncmFkaWVudC10by1wb3MiOlt7dG86W21dfV0sImdyYWRpZW50LWZyb20iOlt7ZnJvbTpbaF19XSwiZ3JhZGllbnQtdmlhIjpbe3ZpYTpbaF19XSwiZ3JhZGllbnQtdG8iOlt7dG86W2hdfV0scm91bmRlZDpbe3JvdW5kZWQ6W29dfV0sInJvdW5kZWQtcyI6W3sicm91bmRlZC1zIjpbb119XSwicm91bmRlZC1lIjpbeyJyb3VuZGVkLWUiOltvXX1dLCJyb3VuZGVkLXQiOlt7InJvdW5kZWQtdCI6W29dfV0sInJvdW5kZWQtciI6W3sicm91bmRlZC1yIjpbb119XSwicm91bmRlZC1iIjpbeyJyb3VuZGVkLWIiOltvXX1dLCJyb3VuZGVkLWwiOlt7InJvdW5kZWQtbCI6W29dfV0sInJvdW5kZWQtc3MiOlt7InJvdW5kZWQtc3MiOltvXX1dLCJyb3VuZGVkLXNlIjpbeyJyb3VuZGVkLXNlIjpbb119XSwicm91bmRlZC1lZSI6W3sicm91bmRlZC1lZSI6W29dfV0sInJvdW5kZWQtZXMiOlt7InJvdW5kZWQtZXMiOltvXX1dLCJyb3VuZGVkLXRsIjpbeyJyb3VuZGVkLXRsIjpbb119XSwicm91bmRlZC10ciI6W3sicm91bmRlZC10ciI6W29dfV0sInJvdW5kZWQtYnIiOlt7InJvdW5kZWQtYnIiOltvXX1dLCJyb3VuZGVkLWJsIjpbeyJyb3VuZGVkLWJsIjpbb119XSwiYm9yZGVyLXciOlt7Ym9yZGVyOltzXX1dLCJib3JkZXItdy14IjpbeyJib3JkZXIteCI6W3NdfV0sImJvcmRlci13LXkiOlt7ImJvcmRlci15Ijpbc119XSwiYm9yZGVyLXctcyI6W3siYm9yZGVyLXMiOltzXX1dLCJib3JkZXItdy1lIjpbeyJib3JkZXItZSI6W3NdfV0sImJvcmRlci13LXQiOlt7ImJvcmRlci10Ijpbc119XSwiYm9yZGVyLXctciI6W3siYm9yZGVyLXIiOltzXX1dLCJib3JkZXItdy1iIjpbeyJib3JkZXItYiI6W3NdfV0sImJvcmRlci13LWwiOlt7ImJvcmRlci1sIjpbc119XSwiYm9yZGVyLW9wYWNpdHkiOlt7ImJvcmRlci1vcGFjaXR5Ijpbdl19XSwiYm9yZGVyLXN0eWxlIjpbe2JvcmRlcjpbLi4uTygpLCJoaWRkZW4iXX1dLCJkaXZpZGUteCI6W3siZGl2aWRlLXgiOltzXX1dLCJkaXZpZGUteC1yZXZlcnNlIjpbImRpdmlkZS14LXJldmVyc2UiXSwiZGl2aWRlLXkiOlt7ImRpdmlkZS15Ijpbc119XSwiZGl2aWRlLXktcmV2ZXJzZSI6WyJkaXZpZGUteS1yZXZlcnNlIl0sImRpdmlkZS1vcGFjaXR5IjpbeyJkaXZpZGUtb3BhY2l0eSI6W3ZdfV0sImRpdmlkZS1zdHlsZSI6W3tkaXZpZGU6TygpfV0sImJvcmRlci1jb2xvciI6W3tib3JkZXI6W2ldfV0sImJvcmRlci1jb2xvci14IjpbeyJib3JkZXIteCI6W2ldfV0sImJvcmRlci1jb2xvci15IjpbeyJib3JkZXIteSI6W2ldfV0sImJvcmRlci1jb2xvci10IjpbeyJib3JkZXItdCI6W2ldfV0sImJvcmRlci1jb2xvci1yIjpbeyJib3JkZXItciI6W2ldfV0sImJvcmRlci1jb2xvci1iIjpbeyJib3JkZXItYiI6W2ldfV0sImJvcmRlci1jb2xvci1sIjpbeyJib3JkZXItbCI6W2ldfV0sImRpdmlkZS1jb2xvciI6W3tkaXZpZGU6W2ldfV0sIm91dGxpbmUtc3R5bGUiOlt7b3V0bGluZTpbIiIsLi4uTygpXX1dLCJvdXRsaW5lLW9mZnNldCI6W3sib3V0bGluZS1vZmZzZXQiOltocixFZV19XSwib3V0bGluZS13Ijpbe291dGxpbmU6W2hyLFRpXX1dLCJvdXRsaW5lLWNvbG9yIjpbe291dGxpbmU6W2VdfV0sInJpbmctdyI6W3tyaW5nOnNlKCl9XSwicmluZy13LWluc2V0IjpbInJpbmctaW5zZXQiXSwicmluZy1jb2xvciI6W3tyaW5nOltlXX1dLCJyaW5nLW9wYWNpdHkiOlt7InJpbmctb3BhY2l0eSI6W3ZdfV0sInJpbmctb2Zmc2V0LXciOlt7InJpbmctb2Zmc2V0IjpbaHIsVGldfV0sInJpbmctb2Zmc2V0LWNvbG9yIjpbeyJyaW5nLW9mZnNldCI6W2VdfV0sc2hhZG93Olt7c2hhZG93OlsiIiwiaW5uZXIiLCJub25lIixOaSxaMl19XSwic2hhZG93LWNvbG9yIjpbe3NoYWRvdzpbUXNdfV0sb3BhY2l0eTpbe29wYWNpdHk6W3ZdfV0sIm1peC1ibGVuZCI6W3sibWl4LWJsZW5kIjpBKCl9XSwiYmctYmxlbmQiOlt7ImJnLWJsZW5kIjpBKCl9XSxmaWx0ZXI6W3tmaWx0ZXI6WyIiLCJub25lIl19XSxibHVyOlt7Ymx1cjpbbl19XSxicmlnaHRuZXNzOlt7YnJpZ2h0bmVzczpbcl19XSxjb250cmFzdDpbe2NvbnRyYXN0OlthXX1dLCJkcm9wLXNoYWRvdyI6W3siZHJvcC1zaGFkb3ciOlsiIiwibm9uZSIsTmksRWVdfV0sZ3JheXNjYWxlOlt7Z3JheXNjYWxlOlt1XX1dLCJodWUtcm90YXRlIjpbeyJodWUtcm90YXRlIjpbY119XSxpbnZlcnQ6W3tpbnZlcnQ6W2RdfV0sc2F0dXJhdGU6W3tzYXR1cmF0ZTpbX119XSxzZXBpYTpbe3NlcGlhOltFXX1dLCJiYWNrZHJvcC1maWx0ZXIiOlt7ImJhY2tkcm9wLWZpbHRlciI6WyIiLCJub25lIl19XSwiYmFja2Ryb3AtYmx1ciI6W3siYmFja2Ryb3AtYmx1ciI6W25dfV0sImJhY2tkcm9wLWJyaWdodG5lc3MiOlt7ImJhY2tkcm9wLWJyaWdodG5lc3MiOltyXX1dLCJiYWNrZHJvcC1jb250cmFzdCI6W3siYmFja2Ryb3AtY29udHJhc3QiOlthXX1dLCJiYWNrZHJvcC1ncmF5c2NhbGUiOlt7ImJhY2tkcm9wLWdyYXlzY2FsZSI6W3VdfV0sImJhY2tkcm9wLWh1ZS1yb3RhdGUiOlt7ImJhY2tkcm9wLWh1ZS1yb3RhdGUiOltjXX1dLCJiYWNrZHJvcC1pbnZlcnQiOlt7ImJhY2tkcm9wLWludmVydCI6W2RdfV0sImJhY2tkcm9wLW9wYWNpdHkiOlt7ImJhY2tkcm9wLW9wYWNpdHkiOlt2XX1dLCJiYWNrZHJvcC1zYXR1cmF0ZSI6W3siYmFja2Ryb3Atc2F0dXJhdGUiOltfXX1dLCJiYWNrZHJvcC1zZXBpYSI6W3siYmFja2Ryb3Atc2VwaWEiOltFXX1dLCJib3JkZXItY29sbGFwc2UiOlt7Ym9yZGVyOlsiY29sbGFwc2UiLCJzZXBhcmF0ZSJdfV0sImJvcmRlci1zcGFjaW5nIjpbeyJib3JkZXItc3BhY2luZyI6W2xdfV0sImJvcmRlci1zcGFjaW5nLXgiOlt7ImJvcmRlci1zcGFjaW5nLXgiOltsXX1dLCJib3JkZXItc3BhY2luZy15IjpbeyJib3JkZXItc3BhY2luZy15IjpbbF19XSwidGFibGUtbGF5b3V0Ijpbe3RhYmxlOlsiYXV0byIsImZpeGVkIl19XSxjYXB0aW9uOlt7Y2FwdGlvbjpbInRvcCIsImJvdHRvbSJdfV0sdHJhbnNpdGlvbjpbe3RyYW5zaXRpb246WyJub25lIiwiYWxsIiwiIiwiY29sb3JzIiwib3BhY2l0eSIsInNoYWRvdyIsInRyYW5zZm9ybSIsRWVdfV0sZHVyYXRpb246W3tkdXJhdGlvbjpuZSgpfV0sZWFzZTpbe2Vhc2U6WyJsaW5lYXIiLCJpbiIsIm91dCIsImluLW91dCIsRWVdfV0sZGVsYXk6W3tkZWxheTpuZSgpfV0sYW5pbWF0ZTpbe2FuaW1hdGU6WyJub25lIiwic3BpbiIsInBpbmciLCJwdWxzZSIsImJvdW5jZSIsRWVdfV0sdHJhbnNmb3JtOlt7dHJhbnNmb3JtOlsiIiwiZ3B1Iiwibm9uZSJdfV0sc2NhbGU6W3tzY2FsZTpbd119XSwic2NhbGUteCI6W3sic2NhbGUteCI6W3ddfV0sInNjYWxlLXkiOlt7InNjYWxlLXkiOlt3XX1dLHJvdGF0ZTpbe3JvdGF0ZTpbWHMsRWVdfV0sInRyYW5zbGF0ZS14IjpbeyJ0cmFuc2xhdGUteCI6W1RdfV0sInRyYW5zbGF0ZS15IjpbeyJ0cmFuc2xhdGUteSI6W1RdfV0sInNrZXcteCI6W3sic2tldy14IjpbJF19XSwic2tldy15IjpbeyJza2V3LXkiOlskXX1dLCJ0cmFuc2Zvcm0tb3JpZ2luIjpbe29yaWdpbjpbImNlbnRlciIsInRvcCIsInRvcC1yaWdodCIsInJpZ2h0IiwiYm90dG9tLXJpZ2h0IiwiYm90dG9tIiwiYm90dG9tLWxlZnQiLCJsZWZ0IiwidG9wLWxlZnQiLEVlXX1dLGFjY2VudDpbe2FjY2VudDpbImF1dG8iLGVdfV0sYXBwZWFyYW5jZTpbImFwcGVhcmFuY2Utbm9uZSJdLGN1cnNvcjpbe2N1cnNvcjpbImF1dG8iLCJkZWZhdWx0IiwicG9pbnRlciIsIndhaXQiLCJ0ZXh0IiwibW92ZSIsImhlbHAiLCJub3QtYWxsb3dlZCIsIm5vbmUiLCJjb250ZXh0LW1lbnUiLCJwcm9ncmVzcyIsImNlbGwiLCJjcm9zc2hhaXIiLCJ2ZXJ0aWNhbC10ZXh0IiwiYWxpYXMiLCJjb3B5Iiwibm8tZHJvcCIsImdyYWIiLCJncmFiYmluZyIsImFsbC1zY3JvbGwiLCJjb2wtcmVzaXplIiwicm93LXJlc2l6ZSIsIm4tcmVzaXplIiwiZS1yZXNpemUiLCJzLXJlc2l6ZSIsInctcmVzaXplIiwibmUtcmVzaXplIiwibnctcmVzaXplIiwic2UtcmVzaXplIiwic3ctcmVzaXplIiwiZXctcmVzaXplIiwibnMtcmVzaXplIiwibmVzdy1yZXNpemUiLCJud3NlLXJlc2l6ZSIsInpvb20taW4iLCJ6b29tLW91dCIsRWVdfV0sImNhcmV0LWNvbG9yIjpbe2NhcmV0OltlXX1dLCJwb2ludGVyLWV2ZW50cyI6W3sicG9pbnRlci1ldmVudHMiOlsibm9uZSIsImF1dG8iXX1dLHJlc2l6ZTpbe3Jlc2l6ZTpbIm5vbmUiLCJ5IiwieCIsIiJdfV0sInNjcm9sbC1iZWhhdmlvciI6W3tzY3JvbGw6WyJhdXRvIiwic21vb3RoIl19XSwic2Nyb2xsLW0iOlt7InNjcm9sbC1tIjpGKCl9XSwic2Nyb2xsLW14IjpbeyJzY3JvbGwtbXgiOkYoKX1dLCJzY3JvbGwtbXkiOlt7InNjcm9sbC1teSI6RigpfV0sInNjcm9sbC1tcyI6W3sic2Nyb2xsLW1zIjpGKCl9XSwic2Nyb2xsLW1lIjpbeyJzY3JvbGwtbWUiOkYoKX1dLCJzY3JvbGwtbXQiOlt7InNjcm9sbC1tdCI6RigpfV0sInNjcm9sbC1tciI6W3sic2Nyb2xsLW1yIjpGKCl9XSwic2Nyb2xsLW1iIjpbeyJzY3JvbGwtbWIiOkYoKX1dLCJzY3JvbGwtbWwiOlt7InNjcm9sbC1tbCI6RigpfV0sInNjcm9sbC1wIjpbeyJzY3JvbGwtcCI6RigpfV0sInNjcm9sbC1weCI6W3sic2Nyb2xsLXB4IjpGKCl9XSwic2Nyb2xsLXB5IjpbeyJzY3JvbGwtcHkiOkYoKX1dLCJzY3JvbGwtcHMiOlt7InNjcm9sbC1wcyI6RigpfV0sInNjcm9sbC1wZSI6W3sic2Nyb2xsLXBlIjpGKCl9XSwic2Nyb2xsLXB0IjpbeyJzY3JvbGwtcHQiOkYoKX1dLCJzY3JvbGwtcHIiOlt7InNjcm9sbC1wciI6RigpfV0sInNjcm9sbC1wYiI6W3sic2Nyb2xsLXBiIjpGKCl9XSwic2Nyb2xsLXBsIjpbeyJzY3JvbGwtcGwiOkYoKX1dLCJzbmFwLWFsaWduIjpbe3NuYXA6WyJzdGFydCIsImVuZCIsImNlbnRlciIsImFsaWduLW5vbmUiXX1dLCJzbmFwLXN0b3AiOlt7c25hcDpbIm5vcm1hbCIsImFsd2F5cyJdfV0sInNuYXAtdHlwZSI6W3tzbmFwOlsibm9uZSIsIngiLCJ5IiwiYm90aCJdfV0sInNuYXAtc3RyaWN0bmVzcyI6W3tzbmFwOlsibWFuZGF0b3J5IiwicHJveGltaXR5Il19XSx0b3VjaDpbe3RvdWNoOlsiYXV0byIsIm5vbmUiLCJtYW5pcHVsYXRpb24iXX1dLCJ0b3VjaC14IjpbeyJ0b3VjaC1wYW4iOlsieCIsImxlZnQiLCJyaWdodCJdfV0sInRvdWNoLXkiOlt7InRvdWNoLXBhbiI6WyJ5IiwidXAiLCJkb3duIl19XSwidG91Y2gtcHoiOlsidG91Y2gtcGluY2gtem9vbSJdLHNlbGVjdDpbe3NlbGVjdDpbIm5vbmUiLCJ0ZXh0IiwiYWxsIiwiYXV0byJdfV0sIndpbGwtY2hhbmdlIjpbeyJ3aWxsLWNoYW5nZSI6WyJhdXRvIiwic2Nyb2xsIiwiY29udGVudHMiLCJ0cmFuc2Zvcm0iLEVlXX1dLGZpbGw6W3tmaWxsOltlLCJub25lIl19XSwic3Ryb2tlLXciOlt7c3Ryb2tlOltocixUaSxwY119XSxzdHJva2U6W3tzdHJva2U6W2UsIm5vbmUiXX1dLHNyOlsic3Itb25seSIsIm5vdC1zci1vbmx5Il19LGNvbmZsaWN0aW5nQ2xhc3NHcm91cHM6e292ZXJmbG93Olsib3ZlcmZsb3cteCIsIm92ZXJmbG93LXkiXSxvdmVyc2Nyb2xsOlsib3ZlcnNjcm9sbC14Iiwib3ZlcnNjcm9sbC15Il0saW5zZXQ6WyJpbnNldC14IiwiaW5zZXQteSIsInN0YXJ0IiwiZW5kIiwidG9wIiwicmlnaHQiLCJib3R0b20iLCJsZWZ0Il0sImluc2V0LXgiOlsicmlnaHQiLCJsZWZ0Il0sImluc2V0LXkiOlsidG9wIiwiYm90dG9tIl0sZmxleDpbImJhc2lzIiwiZ3JvdyIsInNocmluayJdLGdhcDpbImdhcC14IiwiZ2FwLXkiXSxwOlsicHgiLCJweSIsInBzIiwicGUiLCJwdCIsInByIiwicGIiLCJwbCJdLHB4OlsicHIiLCJwbCJdLHB5OlsicHQiLCJwYiJdLG06WyJteCIsIm15IiwibXMiLCJtZSIsIm10IiwibXIiLCJtYiIsIm1sIl0sbXg6WyJtciIsIm1sIl0sbXk6WyJtdCIsIm1iIl0sImZvbnQtc2l6ZSI6WyJsZWFkaW5nIl0sImZ2bi1ub3JtYWwiOlsiZnZuLW9yZGluYWwiLCJmdm4tc2xhc2hlZC16ZXJvIiwiZnZuLWZpZ3VyZSIsImZ2bi1zcGFjaW5nIiwiZnZuLWZyYWN0aW9uIl0sImZ2bi1vcmRpbmFsIjpbImZ2bi1ub3JtYWwiXSwiZnZuLXNsYXNoZWQtemVybyI6WyJmdm4tbm9ybWFsIl0sImZ2bi1maWd1cmUiOlsiZnZuLW5vcm1hbCJdLCJmdm4tc3BhY2luZyI6WyJmdm4tbm9ybWFsIl0sImZ2bi1mcmFjdGlvbiI6WyJmdm4tbm9ybWFsIl0scm91bmRlZDpbInJvdW5kZWQtcyIsInJvdW5kZWQtZSIsInJvdW5kZWQtdCIsInJvdW5kZWQtciIsInJvdW5kZWQtYiIsInJvdW5kZWQtbCIsInJvdW5kZWQtc3MiLCJyb3VuZGVkLXNlIiwicm91bmRlZC1lZSIsInJvdW5kZWQtZXMiLCJyb3VuZGVkLXRsIiwicm91bmRlZC10ciIsInJvdW5kZWQtYnIiLCJyb3VuZGVkLWJsIl0sInJvdW5kZWQtcyI6WyJyb3VuZGVkLXNzIiwicm91bmRlZC1lcyJdLCJyb3VuZGVkLWUiOlsicm91bmRlZC1zZSIsInJvdW5kZWQtZWUiXSwicm91bmRlZC10IjpbInJvdW5kZWQtdGwiLCJyb3VuZGVkLXRyIl0sInJvdW5kZWQtciI6WyJyb3VuZGVkLXRyIiwicm91bmRlZC1iciJdLCJyb3VuZGVkLWIiOlsicm91bmRlZC1iciIsInJvdW5kZWQtYmwiXSwicm91bmRlZC1sIjpbInJvdW5kZWQtdGwiLCJyb3VuZGVkLWJsIl0sImJvcmRlci1zcGFjaW5nIjpbImJvcmRlci1zcGFjaW5nLXgiLCJib3JkZXItc3BhY2luZy15Il0sImJvcmRlci13IjpbImJvcmRlci13LXMiLCJib3JkZXItdy1lIiwiYm9yZGVyLXctdCIsImJvcmRlci13LXIiLCJib3JkZXItdy1iIiwiYm9yZGVyLXctbCJdLCJib3JkZXItdy14IjpbImJvcmRlci13LXIiLCJib3JkZXItdy1sIl0sImJvcmRlci13LXkiOlsiYm9yZGVyLXctdCIsImJvcmRlci13LWIiXSwiYm9yZGVyLWNvbG9yIjpbImJvcmRlci1jb2xvci10IiwiYm9yZGVyLWNvbG9yLXIiLCJib3JkZXItY29sb3ItYiIsImJvcmRlci1jb2xvci1sIl0sImJvcmRlci1jb2xvci14IjpbImJvcmRlci1jb2xvci1yIiwiYm9yZGVyLWNvbG9yLWwiXSwiYm9yZGVyLWNvbG9yLXkiOlsiYm9yZGVyLWNvbG9yLXQiLCJib3JkZXItY29sb3ItYiJdLCJzY3JvbGwtbSI6WyJzY3JvbGwtbXgiLCJzY3JvbGwtbXkiLCJzY3JvbGwtbXMiLCJzY3JvbGwtbWUiLCJzY3JvbGwtbXQiLCJzY3JvbGwtbXIiLCJzY3JvbGwtbWIiLCJzY3JvbGwtbWwiXSwic2Nyb2xsLW14IjpbInNjcm9sbC1tciIsInNjcm9sbC1tbCJdLCJzY3JvbGwtbXkiOlsic2Nyb2xsLW10Iiwic2Nyb2xsLW1iIl0sInNjcm9sbC1wIjpbInNjcm9sbC1weCIsInNjcm9sbC1weSIsInNjcm9sbC1wcyIsInNjcm9sbC1wZSIsInNjcm9sbC1wdCIsInNjcm9sbC1wciIsInNjcm9sbC1wYiIsInNjcm9sbC1wbCJdLCJzY3JvbGwtcHgiOlsic2Nyb2xsLXByIiwic2Nyb2xsLXBsIl0sInNjcm9sbC1weSI6WyJzY3JvbGwtcHQiLCJzY3JvbGwtcGIiXSx0b3VjaDpbInRvdWNoLXgiLCJ0b3VjaC15IiwidG91Y2gtcHoiXSwidG91Y2gteCI6WyJ0b3VjaCJdLCJ0b3VjaC15IjpbInRvdWNoIl0sInRvdWNoLXB6IjpbInRvdWNoIl19LGNvbmZsaWN0aW5nQ2xhc3NHcm91cE1vZGlmaWVyczp7ImZvbnQtc2l6ZSI6WyJsZWFkaW5nIl19fX1jb25zdCBKMj1NMihRMik7ZnVuY3Rpb24geHQoLi4uZSl7cmV0dXJuIEoyKHVTKGUpKX1jb25zdCB3YT1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSxjaGlsZHJlbjp0LC4uLm59LHIpPT54LmpzeHMoc1Mse3JlZjpyLGNsYXNzTmFtZTp4dCgicmVsYXRpdmUgb3ZlcmZsb3ctaGlkZGVuIixlKSwuLi5uLGNoaWxkcmVuOlt4LmpzeChfMix7Y2xhc3NOYW1lOiJoLWZ1bGwgdy1mdWxsIHJvdW5kZWQtW2luaGVyaXRdIixjaGlsZHJlbjp0fSkseC5qc3gobVMse30pLHguanN4KHcyLHt9KV19KSk7d2EuZGlzcGxheU5hbWU9c1MuZGlzcGxheU5hbWU7Y29uc3QgbVM9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsb3JpZW50YXRpb246dD0idmVydGljYWwiLC4uLm59LHIpPT54LmpzeChxdyx7cmVmOnIsb3JpZW50YXRpb246dCxjbGFzc05hbWU6eHQoImZsZXggdG91Y2gtbm9uZSBzZWxlY3Qtbm9uZSB0cmFuc2l0aW9uLWNvbG9ycyIsdD09PSJ2ZXJ0aWNhbCImJiJoLWZ1bGwgdy0yLjUgYm9yZGVyLWwgYm9yZGVyLWwtdHJhbnNwYXJlbnQgcC1bMXB4XSIsdD09PSJob3Jpem9udGFsIiYmImgtMi41IGZsZXgtY29sIGJvcmRlci10IGJvcmRlci10LXRyYW5zcGFyZW50IHAtWzFweF0iLGUpLC4uLm4sY2hpbGRyZW46eC5qc3gocDIse2NsYXNzTmFtZTp4dCgicmVsYXRpdmUgcm91bmRlZC1mdWxsIGJnLWJvcmRlciIsdD09PSJ2ZXJ0aWNhbCImJiJmbGV4LTEiKX0pfSkpO21TLmRpc3BsYXlOYW1lPXF3LmRpc3BsYXlOYW1lO2Z1bmN0aW9uIFNhKHtjaGlsZHJlbjplfSl7Y29uc3QgdD1wLnVzZVJlZihudWxsKSxuPXAudXNlUmVmKG51bGwpLHI9cC51c2VSZWYoITEpLGk9cC51c2VSZWYoMCksbz1wLnVzZVJlZihudWxsKSxsPXAudXNlUmVmKDApLHM9KCk9PntyLmN1cnJlbnQ9ITEsby5jdXJyZW50PW51bGwsaS5jdXJyZW50PTAsbC5jdXJyZW50PTB9LGE9Uz0+e1MucHJldmVudERlZmF1bHQoKTtjb25zdCB2PW8uY3VycmVudD09PSJsZWZ0Ij90Om47aWYodi5jdXJyZW50JiZyLmN1cnJlbnQpe2NvbnN0IHk9by5jdXJyZW50PT09ImxlZnQiP1Muc2NyZWVuWC1pLmN1cnJlbnQ6aS5jdXJyZW50LVMuc2NyZWVuWDt2LmN1cnJlbnQuc3R5bGUud2lkdGg9YCR7TWF0aC5tYXgobC5jdXJyZW50K3ksMTUwKX1weGB9fSx1PVM9PnY9PntpZih2LnRhcmdldCl7Y29uc3QgXz1TPT09ImxlZnQiP3Q6Uz09PSJyaWdodCI/bjpudWxsO3IuY3VycmVudD0hMCxfJiZfLmN1cnJlbnQmJihpLmN1cnJlbnQ9di5zY3JlZW5YLG8uY3VycmVudD1TLF8uY3VycmVudCYmKGwuY3VycmVudD1fLmN1cnJlbnQub2Zmc2V0V2lkdGgpKX19LFtjLGQsZixoLG0sZ109cC5DaGlsZHJlbi50b0FycmF5KGUpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+KGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHMpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsYSksKCk9Pntkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIixzKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLGEpfSksW10pLHguanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGgtc2NyZWVuIixjaGlsZHJlbjpbeC5qc3hzKCJkaXYiLHtyZWY6dCxjbGFzc05hbWU6InJlbGF0aXZlIGJvcmRlci1yIGJvcmRlci1ib3JkZXIiLHN0eWxlOnt3aWR0aDozMDB9LGNoaWxkcmVuOlt4LmpzeHMoU2EuQ29sdW1uLHtjaGlsZHJlbjpbYyx4LmpzeCh3YSx7c3R5bGU6e2hlaWdodDoiY2FsYygxMDB2aCAtIDUwcHgpIn0sY2hpbGRyZW46ZH0pXX0pLHguanN4KCJkaXYiLHtjbGFzc05hbWU6ImFic29sdXRlIGluc2V0LXktMCByaWdodC0wIGN1cnNvci1jb2wtcmVzaXplIHctWzFweF0gaG92ZXI6dy1bM3B4XSBoLWZ1bGwgaG92ZXI6YmctYm9yZGVyIixvbk1vdXNlRG93bjp1KCJsZWZ0Iil9KV19KSx4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOndmKCIiLHsidy1mdWxsIjohbSYmIWd9KSxjaGlsZHJlbjp4LmpzeHMoU2EuQ29sdW1uLHtjaGlsZHJlbjpbZix4LmpzeCh3YSx7c3R5bGU6e2hlaWdodDoiY2FsYygxMDB2aCAtIDUwcHgpIn0sY2hpbGRyZW46aH0pXX0pfSksbXx8ZyYmeC5qc3hzKCJkaXYiLHtyZWY6bixjbGFzc05hbWU6InJlbGF0aXZlIGgtc2NyZWVuIGJvcmRlci1sIGJvcmRlci1ib3JkZXIiLHN0eWxlOnt3aWR0aDozMDB9LGNoaWxkcmVuOlt4LmpzeHMoU2EuQ29sdW1uLHtjaGlsZHJlbjpbbSx4LmpzeCh3YSx7c3R5bGU6e2hlaWdodDoiY2FsYygxMDB2aCAtIDUwcHgpIn0sY2hpbGRyZW46Z30pXX0pLHguanN4KCJkaXYiLHtvbk1vdXNlRG93bjp1KCJyaWdodCIpLGNsYXNzTmFtZToiYWJzb2x1dGUgaW5zZXQteS0wIGxlZnQtMCBjdXJzb3ItY29sLXJlc2l6ZSB3LVsxcHhdIGJnLWJvcmRlciBob3Zlcjp3LVszcHhdIGhvdmVyOmJnLWJvcmRlciJ9KV19KV19KX1TYS5Db2x1bW49KHtjaGlsZHJlbjplfSk9Pntjb25zdFt0LG5dPXAuQ2hpbGRyZW4udG9BcnJheShlKTtyZXR1cm4geC5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1jb2wiLGNoaWxkcmVuOlt4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBib3JkZXItYiBib3JkZXItYm9yZGVyIixjaGlsZHJlbjp0fSksbl19KX07Y29uc3QgcTI9KHtjbGFzc05hbWU6ZX0pPT54LmpzeHMoInN2ZyIse3dpZHRoOiIxMiIsaGVpZ2h0OiIxMiIsdmlld0JveDoiMCAwIDkgMTAiLGZpbGw6Im5vbmUiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2xhc3NOYW1lOmUsY2hpbGRyZW46W3guanN4cygiZyIse2NsaXBQYXRoOiJ1cmwoI2NsaXAwXzEyMjVfMTYzOCkiLGNoaWxkcmVuOlt4LmpzeCgicmVjdCIse3k6IjAuNSIsd2lkdGg6IjkiLGhlaWdodDoiOSJ9KSx4LmpzeCgicGF0aCIse2Q6Ik0wIDdMOC41IDUiLHN0cm9rZToiY3VycmVudENvbG9yIn0pLHguanN4KCJjaXJjbGUiLHtjeDoiMyIsY3k6IjMuNSIscjoiMSIsZmlsbDoiY3VycmVudENvbG9yIn0pXX0pLHguanN4KCJyZWN0Iix7eDoiMC41Iix5OiIxIix3aWR0aDoiOCIsaGVpZ2h0OiI4IixzdHJva2U6ImN1cnJlbnRDb2xvciJ9KSx4LmpzeCgiZGVmcyIse2NoaWxkcmVuOnguanN4KCJjbGlwUGF0aCIse2lkOiJjbGlwMF8xMjI1XzE2MzgiLGNoaWxkcmVuOnguanN4KCJyZWN0Iix7eToiMC41Iix3aWR0aDoiOSIsaGVpZ2h0OiI5IixmaWxsOiJ3aGl0ZSJ9KX0pfSldfSksZ1M9cTIsZVI9KHtjbGFzc05hbWU6ZX0pPT54LmpzeHMoInN2ZyIse3dpZHRoOiI5IixoZWlnaHQ6IjEwIix2aWV3Qm94OiIwIDAgOSAxMCIsY2xhc3NOYW1lOmUsZmlsbDoiY3VycmVudENvbG9yIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLGNoaWxkcmVuOlt4LmpzeHMoImciLHtjbGlwUGF0aDoidXJsKCNjbGlwMF8xMjIyXzE2MTgpIixjaGlsZHJlbjpbeC5qc3goInBhdGgiLHtmaWxsUnVsZToiZXZlbm9kZCIsY2xpcFJ1bGU6ImV2ZW5vZGQiLGQ6Ik05IDEuNUgwVjAuNUg5VjEuNVoiLGZpbGw6ImN1cnJlbnRDb2xvciJ9KSx4LmpzeCgicGF0aCIse2ZpbGxSdWxlOiJldmVub2RkIixjbGlwUnVsZToiZXZlbm9kZCIsZDoiTTkgOS41SDBWOC41SDlWOS41WiIsZmlsbDoiY3VycmVudENvbG9yIn0pXX0pLHguanN4KCJkZWZzIix7Y2hpbGRyZW46eC5qc3goImNsaXBQYXRoIix7aWQ6ImNsaXAwXzEyMjJfMTYxOCIsY2hpbGRyZW46eC5qc3goInJlY3QiLHt3aWR0aDoiOSIsaGVpZ2h0OiI5IixmaWxsOiJ3aGl0ZSIsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoMCAwLjUpIn0pfSl9KV19KSx0Uj1lUixuUj0oe2NsYXNzTmFtZTplfSk9PnguanN4KCJzdmciLHt3aWR0aDoiOSIsaGVpZ2h0OiIxMCIsdmlld0JveDoiMCAwIDkgMTAiLGZpbGw6ImN1cnJlbnRDb2xvciIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjbGFzc05hbWU6ZSxjaGlsZHJlbjp4LmpzeCgiZyIse2NsaXBQYXRoOiJ1cmwoI2NsaXAwXzEyMjlfMTYyNSkiLGNoaWxkcmVuOnguanN4KCJwYXRoIix7ZDoiTTAuMDE0NTUxMyAwLjVIOC45ODU0NUw5IDMuMTg1NjlIOC41NzA3NEM4LjQzMDA3IDIuMjI3NiA4LjAyNzQ5IDEuNTc5NDggNy4zNjI5OCAxLjI0MTMzQzYuOTg5NDkgMS4wNTQ5MSA2LjQzMTY5IDAuOTUzMDM1IDUuNjg5NTcgMC45MzU2OTRWNy45NDU4MUM1LjY4OTU3IDguNDM1NjkgNS43ODQxNiA4Ljc2MDg0IDUuOTczMzIgOC45MjEyNEM2LjE2NzM0IDkuMDgxNjUgNi41Njc1IDkuMTYxODUgNy4xNzM4MSA5LjE2MTg1VjkuNUgxLjg2MjU3VjkuMTYxODVDMi40NDQ2MiA5LjE2MTg1IDIuODMwMjMgOS4wODE2NSAzLjAxOTQgOC45MjEyNEMzLjIxMzQyIDguNzU2NSAzLjMxMDQzIDguNDMxMzYgMy4zMTA0MyA3Ljk0NTgxVjAuOTM1Njk0QzIuNTgyODYgMC45NTMwMzUgMi4wMjUwNiAxLjA1NDkxIDEuNjM3MDMgMS4yNDEzM0MwLjkyNDAxIDEuNTg4MTUgMC41MjE0MjMgMi4yMzYyNyAwLjQyOTI2NCAzLjE4NTY5SDBMMC4wMTQ1NTEzIDAuNVoifSl9KX0pLHJSPW5SO2Z1bmN0aW9uIHZTKHtjaGlsZHJlbjplLHJvb3RQYXRoOnR9KXtyZXR1cm4geC5qc3goImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCB3LWZ1bGwgcHktMiB0ZXh0LXhzIixjaGlsZHJlbjpwLkNoaWxkcmVuLm1hcChlLG49PnAuY2xvbmVFbGVtZW50KG4se3BhdGhzOlt0XX0pKX0pfXZTLk5vZGU9KHtjaGlsZHJlbjplLHBhdGhzOnQ9W10scGF0aDpuLGxldmVsOnI9MSx0eXBlOmksc2V0QWN0aXZlUGF0aDpvfSk9Pntjb25zdCBsPXIqMzAscz1pPT09InN0cmluZyI/eC5qc3goclIse30pOmk9PT0iaW1hZ2UiP3guanN4KGdTLHtjbGFzc05hbWU6ImgtWzlweF0gdy1bOXB4XSJ9KTp4LmpzeCh0Uix7fSk7cmV0dXJuIHguanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJ3LWZ1bGwiLGNoaWxkcmVuOlt4LmpzeCgiYnV0dG9uIix7Y2xhc3NOYW1lOiJmbGV4IGp1c3RpZnktYmV0d2VlbiB3LWZ1bGwgZ3JvdXAgcHktMiB0ZXh0LXhzIGZvbnQtWzQwMF0gc2hyaW5rLTAiLG9uQ2xpY2s6KCk9PntvJiZvKG4pfSxzdHlsZTp7cGFkZGluZ0xlZnQ6bH0sY2hpbGRyZW46eC5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0yIixjaGlsZHJlbjpbcyx4LmpzeCgicCIse2NoaWxkcmVuOm59KV19KX0pLGUmJnguanN4KHguRnJhZ21lbnQse2NoaWxkcmVuOnAuQ2hpbGRyZW4ubWFwKGUsYT0+cC5jbG9uZUVsZW1lbnQoYSx7bGV2ZWw6cisxLHBhdGhzOlsuLi50LG5dfSkpfSldfSl9O2Z1bmN0aW9uIFFnKCl7cmV0dXJue2FzeW5jOiExLGJyZWFrczohMSxleHRlbnNpb25zOm51bGwsZ2ZtOiEwLGhvb2tzOm51bGwscGVkYW50aWM6ITEscmVuZGVyZXI6bnVsbCxzaWxlbnQ6ITEsdG9rZW5pemVyOm51bGwsd2Fsa1Rva2VuczpudWxsfX1sZXQgbGw9UWcoKTtmdW5jdGlvbiB5UyhlKXtsbD1lfWNvbnN0IHhTPS9bJjw+IiddLyxpUj1uZXcgUmVnRXhwKHhTLnNvdXJjZSwiZyIpLF9TPS9bPD4iJ118Jig/ISgjXGR7MSw3fXwjW1h4XVthLWZBLUYwLTldezEsNn18XHcrKTspLyxvUj1uZXcgUmVnRXhwKF9TLnNvdXJjZSwiZyIpLGxSPXsiJiI6IiZhbXA7IiwiPCI6IiZsdDsiLCI+IjoiJmd0OyIsJyInOiImcXVvdDsiLCInIjoiJiMzOTsifSxUMD1lPT5sUltlXTtmdW5jdGlvbiBNbihlLHQpe2lmKHQpe2lmKHhTLnRlc3QoZSkpcmV0dXJuIGUucmVwbGFjZShpUixUMCl9ZWxzZSBpZihfUy50ZXN0KGUpKXJldHVybiBlLnJlcGxhY2Uob1IsVDApO3JldHVybiBlfWNvbnN0IHNSPS8mKCMoPzpcZCspfCg/OiN4WzAtOUEtRmEtZl0rKXwoPzpcdyspKTs/L2lnO2Z1bmN0aW9uIGFSKGUpe3JldHVybiBlLnJlcGxhY2Uoc1IsKHQsbik9PihuPW4udG9Mb3dlckNhc2UoKSxuPT09ImNvbG9uIj8iOiI6bi5jaGFyQXQoMCk9PT0iIyI/bi5jaGFyQXQoMSk9PT0ieCI/U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChuLnN1YnN0cmluZygyKSwxNikpOlN0cmluZy5mcm9tQ2hhckNvZGUoK24uc3Vic3RyaW5nKDEpKToiIikpfWNvbnN0IHVSPS8oXnxbXlxbXSlcXi9nO2Z1bmN0aW9uIEJlKGUsdCl7ZT10eXBlb2YgZT09InN0cmluZyI/ZTplLnNvdXJjZSx0PXR8fCIiO2NvbnN0IG49e3JlcGxhY2U6KHIsaSk9PihpPXR5cGVvZiBpPT0ib2JqZWN0IiYmInNvdXJjZSJpbiBpP2kuc291cmNlOmksaT1pLnJlcGxhY2UodVIsIiQxIiksZT1lLnJlcGxhY2UocixpKSxuKSxnZXRSZWdleDooKT0+bmV3IFJlZ0V4cChlLHQpfTtyZXR1cm4gbn1mdW5jdGlvbiBOMChlKXt0cnl7ZT1lbmNvZGVVUkkoZSkucmVwbGFjZSgvJTI1L2csIiUiKX1jYXRjaHtyZXR1cm4gbnVsbH1yZXR1cm4gZX1jb25zdCB3ZD17ZXhlYzooKT0+bnVsbH07ZnVuY3Rpb24gUjAoZSx0KXtjb25zdCBuPWUucmVwbGFjZSgvXHwvZywobyxsLHMpPT57bGV0IGE9ITEsdT1sO2Zvcig7LS11Pj0wJiZzW3VdPT09IlxcIjspYT0hYTtyZXR1cm4gYT8ifCI6IiB8In0pLHI9bi5zcGxpdCgvIFx8Lyk7bGV0IGk9MDtpZihyWzBdLnRyaW0oKXx8ci5zaGlmdCgpLHIubGVuZ3RoPjAmJiFyW3IubGVuZ3RoLTFdLnRyaW0oKSYmci5wb3AoKSx0KWlmKHIubGVuZ3RoPnQpci5zcGxpY2UodCk7ZWxzZSBmb3IoO3IubGVuZ3RoPHQ7KXIucHVzaCgiIik7Zm9yKDtpPHIubGVuZ3RoO2krKylyW2ldPXJbaV0udHJpbSgpLnJlcGxhY2UoL1xcXHwvZywifCIpO3JldHVybiByfWZ1bmN0aW9uIG1jKGUsdCxuKXtjb25zdCByPWUubGVuZ3RoO2lmKHI9PT0wKXJldHVybiIiO2xldCBpPTA7Zm9yKDtpPHI7KXtjb25zdCBvPWUuY2hhckF0KHItaS0xKTtpZihvPT09dCYmIW4paSsrO2Vsc2UgaWYobyE9PXQmJm4paSsrO2Vsc2UgYnJlYWt9cmV0dXJuIGUuc2xpY2UoMCxyLWkpfWZ1bmN0aW9uIGNSKGUsdCl7aWYoZS5pbmRleE9mKHRbMV0pPT09LTEpcmV0dXJuLTE7bGV0IG49MDtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKylpZihlW3JdPT09IlxcIilyKys7ZWxzZSBpZihlW3JdPT09dFswXSluKys7ZWxzZSBpZihlW3JdPT09dFsxXSYmKG4tLSxuPDApKXJldHVybiByO3JldHVybi0xfWZ1bmN0aW9uIE8wKGUsdCxuLHIpe2NvbnN0IGk9dC5ocmVmLG89dC50aXRsZT9Nbih0LnRpdGxlKTpudWxsLGw9ZVsxXS5yZXBsYWNlKC9cXChbXFtcXV0pL2csIiQxIik7aWYoZVswXS5jaGFyQXQoMCkhPT0iISIpe3Iuc3RhdGUuaW5MaW5rPSEwO2NvbnN0IHM9e3R5cGU6ImxpbmsiLHJhdzpuLGhyZWY6aSx0aXRsZTpvLHRleHQ6bCx0b2tlbnM6ci5pbmxpbmVUb2tlbnMobCl9O3JldHVybiByLnN0YXRlLmluTGluaz0hMSxzfXJldHVybnt0eXBlOiJpbWFnZSIscmF3Om4saHJlZjppLHRpdGxlOm8sdGV4dDpNbihsKX19ZnVuY3Rpb24gZFIoZSx0KXtjb25zdCBuPWUubWF0Y2goL14oXHMrKSg/OmBgYCkvKTtpZihuPT09bnVsbClyZXR1cm4gdDtjb25zdCByPW5bMV07cmV0dXJuIHQuc3BsaXQoYApgKS5tYXAoaT0+e2NvbnN0IG89aS5tYXRjaCgvXlxzKy8pO2lmKG89PT1udWxsKXJldHVybiBpO2NvbnN0W2xdPW87cmV0dXJuIGwubGVuZ3RoPj1yLmxlbmd0aD9pLnNsaWNlKHIubGVuZ3RoKTppfSkuam9pbihgCmApfWNsYXNzIFNke2NvbnN0cnVjdG9yKHQpe0plKHRoaXMsIm9wdGlvbnMiKTtKZSh0aGlzLCJydWxlcyIpO0plKHRoaXMsImxleGVyIik7dGhpcy5vcHRpb25zPXR8fGxsfXNwYWNlKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5uZXdsaW5lLmV4ZWModCk7aWYobiYmblswXS5sZW5ndGg+MClyZXR1cm57dHlwZToic3BhY2UiLHJhdzpuWzBdfX1jb2RlKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5jb2RlLmV4ZWModCk7aWYobil7Y29uc3Qgcj1uWzBdLnJlcGxhY2UoL14gezEsNH0vZ20sIiIpO3JldHVybnt0eXBlOiJjb2RlIixyYXc6blswXSxjb2RlQmxvY2tTdHlsZToiaW5kZW50ZWQiLHRleHQ6dGhpcy5vcHRpb25zLnBlZGFudGljP3I6bWMocixgCmApfX19ZmVuY2VzKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5mZW5jZXMuZXhlYyh0KTtpZihuKXtjb25zdCByPW5bMF0saT1kUihyLG5bM118fCIiKTtyZXR1cm57dHlwZToiY29kZSIscmF3OnIsbGFuZzpuWzJdP25bMl0udHJpbSgpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuX2VzY2FwZXMsIiQxIik6blsyXSx0ZXh0Oml9fX1oZWFkaW5nKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5oZWFkaW5nLmV4ZWModCk7aWYobil7bGV0IHI9blsyXS50cmltKCk7aWYoLyMkLy50ZXN0KHIpKXtjb25zdCBpPW1jKHIsIiMiKTsodGhpcy5vcHRpb25zLnBlZGFudGljfHwhaXx8LyAkLy50ZXN0KGkpKSYmKHI9aS50cmltKCkpfXJldHVybnt0eXBlOiJoZWFkaW5nIixyYXc6blswXSxkZXB0aDpuWzFdLmxlbmd0aCx0ZXh0OnIsdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKHIpfX19aHIodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmhyLmV4ZWModCk7aWYobilyZXR1cm57dHlwZToiaHIiLHJhdzpuWzBdfX1ibG9ja3F1b3RlKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5ibG9ja3F1b3RlLmV4ZWModCk7aWYobil7Y29uc3Qgcj1tYyhuWzBdLnJlcGxhY2UoL14gKj5bIFx0XT8vZ20sIiIpLGAKYCksaT10aGlzLmxleGVyLnN0YXRlLnRvcDt0aGlzLmxleGVyLnN0YXRlLnRvcD0hMDtjb25zdCBvPXRoaXMubGV4ZXIuYmxvY2tUb2tlbnMocik7cmV0dXJuIHRoaXMubGV4ZXIuc3RhdGUudG9wPWkse3R5cGU6ImJsb2NrcXVvdGUiLHJhdzpuWzBdLHRva2VuczpvLHRleHQ6cn19fWxpc3QodCl7bGV0IG49dGhpcy5ydWxlcy5ibG9jay5saXN0LmV4ZWModCk7aWYobil7bGV0IHI9blsxXS50cmltKCk7Y29uc3QgaT1yLmxlbmd0aD4xLG89e3R5cGU6Imxpc3QiLHJhdzoiIixvcmRlcmVkOmksc3RhcnQ6aT8rci5zbGljZSgwLC0xKToiIixsb29zZTohMSxpdGVtczpbXX07cj1pP2BcXGR7MSw5fVxcJHtyLnNsaWNlKC0xKX1gOmBcXCR7cn1gLHRoaXMub3B0aW9ucy5wZWRhbnRpYyYmKHI9aT9yOiJbKistXSIpO2NvbnN0IGw9bmV3IFJlZ0V4cChgXiggezAsM30ke3J9KSgoPzpbCSBdW15cXG5dKik/KD86XFxufCQpKWApO2xldCBzPSIiLGE9IiIsdT0hMTtmb3IoO3Q7KXtsZXQgYz0hMTtpZighKG49bC5leGVjKHQpKXx8dGhpcy5ydWxlcy5ibG9jay5oci50ZXN0KHQpKWJyZWFrO3M9blswXSx0PXQuc3Vic3RyaW5nKHMubGVuZ3RoKTtsZXQgZD1uWzJdLnNwbGl0KGAKYCwxKVswXS5yZXBsYWNlKC9eXHQrLyx2PT4iICIucmVwZWF0KDMqdi5sZW5ndGgpKSxmPXQuc3BsaXQoYApgLDEpWzBdLGg9MDt0aGlzLm9wdGlvbnMucGVkYW50aWM/KGg9MixhPWQudHJpbVN0YXJ0KCkpOihoPW5bMl0uc2VhcmNoKC9bXiBdLyksaD1oPjQ/MTpoLGE9ZC5zbGljZShoKSxoKz1uWzFdLmxlbmd0aCk7bGV0IG09ITE7aWYoIWQmJi9eICokLy50ZXN0KGYpJiYocys9ZitgCmAsdD10LnN1YnN0cmluZyhmLmxlbmd0aCsxKSxjPSEwKSwhYyl7Y29uc3Qgdj1uZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMyxoLTEpfX0oPzpbKistXXxcXGR7MSw5fVsuKV0pKCg/OlsgCV1bXlxcbl0qKT8oPzpcXG58JCkpYCkseT1uZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMyxoLTEpfX0oKD86LSAqKXszLH18KD86XyAqKXszLH18KD86XFwqICopezMsfSkoPzpcXG4rfCQpYCksXz1uZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMyxoLTEpfX0oPzpcYFxgXGB8fn5+KWApLHc9bmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsaC0xKX19I2ApO2Zvcig7dDspe2NvbnN0IEU9dC5zcGxpdChgCmAsMSlbMF07aWYoZj1FLHRoaXMub3B0aW9ucy5wZWRhbnRpYyYmKGY9Zi5yZXBsYWNlKC9eIHsxLDR9KD89KCB7NH0pKlteIF0pL2csIiAgIikpLF8udGVzdChmKXx8dy50ZXN0KGYpfHx2LnRlc3QoZil8fHkudGVzdCh0KSlicmVhaztpZihmLnNlYXJjaCgvW14gXS8pPj1ofHwhZi50cmltKCkpYSs9YApgK2Yuc2xpY2UoaCk7ZWxzZXtpZihtfHxkLnNlYXJjaCgvW14gXS8pPj00fHxfLnRlc3QoZCl8fHcudGVzdChkKXx8eS50ZXN0KGQpKWJyZWFrO2ErPWAKYCtmfSFtJiYhZi50cmltKCkmJihtPSEwKSxzKz1FK2AKYCx0PXQuc3Vic3RyaW5nKEUubGVuZ3RoKzEpLGQ9Zi5zbGljZShoKX19by5sb29zZXx8KHU/by5sb29zZT0hMDovXG4gKlxuICokLy50ZXN0KHMpJiYodT0hMCkpO2xldCBnPW51bGwsUzt0aGlzLm9wdGlvbnMuZ2ZtJiYoZz0vXlxbWyB4WF1cXSAvLmV4ZWMoYSksZyYmKFM9Z1swXSE9PSJbIF0gIixhPWEucmVwbGFjZSgvXlxbWyB4WF1cXSArLywiIikpKSxvLml0ZW1zLnB1c2goe3R5cGU6Imxpc3RfaXRlbSIscmF3OnMsdGFzazohIWcsY2hlY2tlZDpTLGxvb3NlOiExLHRleHQ6YSx0b2tlbnM6W119KSxvLnJhdys9c31vLml0ZW1zW28uaXRlbXMubGVuZ3RoLTFdLnJhdz1zLnRyaW1FbmQoKSxvLml0ZW1zW28uaXRlbXMubGVuZ3RoLTFdLnRleHQ9YS50cmltRW5kKCksby5yYXc9by5yYXcudHJpbUVuZCgpO2ZvcihsZXQgYz0wO2M8by5pdGVtcy5sZW5ndGg7YysrKWlmKHRoaXMubGV4ZXIuc3RhdGUudG9wPSExLG8uaXRlbXNbY10udG9rZW5zPXRoaXMubGV4ZXIuYmxvY2tUb2tlbnMoby5pdGVtc1tjXS50ZXh0LFtdKSwhby5sb29zZSl7Y29uc3QgZD1vLml0ZW1zW2NdLnRva2Vucy5maWx0ZXIoaD0+aC50eXBlPT09InNwYWNlIiksZj1kLmxlbmd0aD4wJiZkLnNvbWUoaD0+L1xuLipcbi8udGVzdChoLnJhdykpO28ubG9vc2U9Zn1pZihvLmxvb3NlKWZvcihsZXQgYz0wO2M8by5pdGVtcy5sZW5ndGg7YysrKW8uaXRlbXNbY10ubG9vc2U9ITA7cmV0dXJuIG99fWh0bWwodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmh0bWwuZXhlYyh0KTtpZihuKXJldHVybnt0eXBlOiJodG1sIixibG9jazohMCxyYXc6blswXSxwcmU6blsxXT09PSJwcmUifHxuWzFdPT09InNjcmlwdCJ8fG5bMV09PT0ic3R5bGUiLHRleHQ6blswXX19ZGVmKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5kZWYuZXhlYyh0KTtpZihuKXtjb25zdCByPW5bMV0udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9ccysvZywiICIpLGk9blsyXT9uWzJdLnJlcGxhY2UoL148KC4qKT4kLywiJDEiKS5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLl9lc2NhcGVzLCIkMSIpOiIiLG89blszXT9uWzNdLnN1YnN0cmluZygxLG5bM10ubGVuZ3RoLTEpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuX2VzY2FwZXMsIiQxIik6blszXTtyZXR1cm57dHlwZToiZGVmIix0YWc6cixyYXc6blswXSxocmVmOmksdGl0bGU6b319fXRhYmxlKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay50YWJsZS5leGVjKHQpO2lmKG4pe2lmKCEvWzp8XS8udGVzdChuWzJdKSlyZXR1cm47Y29uc3Qgcj17dHlwZToidGFibGUiLHJhdzpuWzBdLGhlYWRlcjpSMChuWzFdKS5tYXAoaT0+KHt0ZXh0OmksdG9rZW5zOltdfSkpLGFsaWduOm5bMl0ucmVwbGFjZSgvXlx8fFx8ICokL2csIiIpLnNwbGl0KCJ8Iikscm93czpuWzNdJiZuWzNdLnRyaW0oKT9uWzNdLnJlcGxhY2UoL1xuWyBcdF0qJC8sIiIpLnNwbGl0KGAKYCk6W119O2lmKHIuaGVhZGVyLmxlbmd0aD09PXIuYWxpZ24ubGVuZ3RoKXtsZXQgaT1yLmFsaWduLmxlbmd0aCxvLGwscyxhO2ZvcihvPTA7bzxpO28rKyl7Y29uc3QgdT1yLmFsaWduW29dO3UmJigvXiAqLSs6ICokLy50ZXN0KHUpP3IuYWxpZ25bb109InJpZ2h0IjovXiAqOi0rOiAqJC8udGVzdCh1KT9yLmFsaWduW29dPSJjZW50ZXIiOi9eICo6LSsgKiQvLnRlc3QodSk/ci5hbGlnbltvXT0ibGVmdCI6ci5hbGlnbltvXT1udWxsKX1mb3IoaT1yLnJvd3MubGVuZ3RoLG89MDtvPGk7bysrKXIucm93c1tvXT1SMChyLnJvd3Nbb10sci5oZWFkZXIubGVuZ3RoKS5tYXAodT0+KHt0ZXh0OnUsdG9rZW5zOltdfSkpO2ZvcihpPXIuaGVhZGVyLmxlbmd0aCxsPTA7bDxpO2wrKylyLmhlYWRlcltsXS50b2tlbnM9dGhpcy5sZXhlci5pbmxpbmUoci5oZWFkZXJbbF0udGV4dCk7Zm9yKGk9ci5yb3dzLmxlbmd0aCxsPTA7bDxpO2wrKylmb3IoYT1yLnJvd3NbbF0scz0wO3M8YS5sZW5ndGg7cysrKWFbc10udG9rZW5zPXRoaXMubGV4ZXIuaW5saW5lKGFbc10udGV4dCk7cmV0dXJuIHJ9fX1saGVhZGluZyh0KXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2subGhlYWRpbmcuZXhlYyh0KTtpZihuKXJldHVybnt0eXBlOiJoZWFkaW5nIixyYXc6blswXSxkZXB0aDpuWzJdLmNoYXJBdCgwKT09PSI9Ij8xOjIsdGV4dDpuWzFdLHRva2Vuczp0aGlzLmxleGVyLmlubGluZShuWzFdKX19cGFyYWdyYXBoKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5wYXJhZ3JhcGguZXhlYyh0KTtpZihuKXtjb25zdCByPW5bMV0uY2hhckF0KG5bMV0ubGVuZ3RoLTEpPT09YApgP25bMV0uc2xpY2UoMCwtMSk6blsxXTtyZXR1cm57dHlwZToicGFyYWdyYXBoIixyYXc6blswXSx0ZXh0OnIsdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKHIpfX19dGV4dCh0KXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2sudGV4dC5leGVjKHQpO2lmKG4pcmV0dXJue3R5cGU6InRleHQiLHJhdzpuWzBdLHRleHQ6blswXSx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUoblswXSl9fWVzY2FwZSh0KXtjb25zdCBuPXRoaXMucnVsZXMuaW5saW5lLmVzY2FwZS5leGVjKHQpO2lmKG4pcmV0dXJue3R5cGU6ImVzY2FwZSIscmF3Om5bMF0sdGV4dDpNbihuWzFdKX19dGFnKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUudGFnLmV4ZWModCk7aWYobilyZXR1cm4hdGhpcy5sZXhlci5zdGF0ZS5pbkxpbmsmJi9ePGEgL2kudGVzdChuWzBdKT90aGlzLmxleGVyLnN0YXRlLmluTGluaz0hMDp0aGlzLmxleGVyLnN0YXRlLmluTGluayYmL148XC9hPi9pLnRlc3QoblswXSkmJih0aGlzLmxleGVyLnN0YXRlLmluTGluaz0hMSksIXRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayYmL148KHByZXxjb2RlfGtiZHxzY3JpcHQpKFxzfD4pL2kudGVzdChuWzBdKT90aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2s9ITA6dGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrJiYvXjxcLyhwcmV8Y29kZXxrYmR8c2NyaXB0KShcc3w+KS9pLnRlc3QoblswXSkmJih0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2s9ITEpLHt0eXBlOiJodG1sIixyYXc6blswXSxpbkxpbms6dGhpcy5sZXhlci5zdGF0ZS5pbkxpbmssaW5SYXdCbG9jazp0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2ssYmxvY2s6ITEsdGV4dDpuWzBdfX1saW5rKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUubGluay5leGVjKHQpO2lmKG4pe2NvbnN0IHI9blsyXS50cmltKCk7aWYoIXRoaXMub3B0aW9ucy5wZWRhbnRpYyYmL148Ly50ZXN0KHIpKXtpZighLz4kLy50ZXN0KHIpKXJldHVybjtjb25zdCBsPW1jKHIuc2xpY2UoMCwtMSksIlxcIik7aWYoKHIubGVuZ3RoLWwubGVuZ3RoKSUyPT09MClyZXR1cm59ZWxzZXtjb25zdCBsPWNSKG5bMl0sIigpIik7aWYobD4tMSl7Y29uc3QgYT0oblswXS5pbmRleE9mKCIhIik9PT0wPzU6NCkrblsxXS5sZW5ndGgrbDtuWzJdPW5bMl0uc3Vic3RyaW5nKDAsbCksblswXT1uWzBdLnN1YnN0cmluZygwLGEpLnRyaW0oKSxuWzNdPSIifX1sZXQgaT1uWzJdLG89IiI7aWYodGhpcy5vcHRpb25zLnBlZGFudGljKXtjb25zdCBsPS9eKFteJyJdKlteXHNdKVxzKyhbJyJdKSguKilcMi8uZXhlYyhpKTtsJiYoaT1sWzFdLG89bFszXSl9ZWxzZSBvPW5bM10/blszXS5zbGljZSgxLC0xKToiIjtyZXR1cm4gaT1pLnRyaW0oKSwvXjwvLnRlc3QoaSkmJih0aGlzLm9wdGlvbnMucGVkYW50aWMmJiEvPiQvLnRlc3Qocik/aT1pLnNsaWNlKDEpOmk9aS5zbGljZSgxLC0xKSksTzAobix7aHJlZjppJiZpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuX2VzY2FwZXMsIiQxIiksdGl0bGU6byYmby5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLl9lc2NhcGVzLCIkMSIpfSxuWzBdLHRoaXMubGV4ZXIpfX1yZWZsaW5rKHQsbil7bGV0IHI7aWYoKHI9dGhpcy5ydWxlcy5pbmxpbmUucmVmbGluay5leGVjKHQpKXx8KHI9dGhpcy5ydWxlcy5pbmxpbmUubm9saW5rLmV4ZWModCkpKXtsZXQgaT0oclsyXXx8clsxXSkucmVwbGFjZSgvXHMrL2csIiAiKTtpZihpPW5baS50b0xvd2VyQ2FzZSgpXSwhaSl7Y29uc3Qgbz1yWzBdLmNoYXJBdCgwKTtyZXR1cm57dHlwZToidGV4dCIscmF3Om8sdGV4dDpvfX1yZXR1cm4gTzAocixpLHJbMF0sdGhpcy5sZXhlcil9fWVtU3Ryb25nKHQsbixyPSIiKXtsZXQgaT10aGlzLnJ1bGVzLmlubGluZS5lbVN0cm9uZy5sRGVsaW0uZXhlYyh0KTtpZighaXx8aVszXSYmci5tYXRjaCgvW1xwe0x9XHB7Tn1dL3UpKXJldHVybjtpZighKGlbMV18fGlbMl18fCIiKXx8IXJ8fHRoaXMucnVsZXMuaW5saW5lLnB1bmN0dWF0aW9uLmV4ZWMocikpe2NvbnN0IGw9Wy4uLmlbMF1dLmxlbmd0aC0xO2xldCBzLGEsdT1sLGM9MDtjb25zdCBkPWlbMF1bMF09PT0iKiI/dGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmcuckRlbGltQXN0OnRoaXMucnVsZXMuaW5saW5lLmVtU3Ryb25nLnJEZWxpbVVuZDtmb3IoZC5sYXN0SW5kZXg9MCxuPW4uc2xpY2UoLTEqdC5sZW5ndGgrbCk7KGk9ZC5leGVjKG4pKSE9bnVsbDspe2lmKHM9aVsxXXx8aVsyXXx8aVszXXx8aVs0XXx8aVs1XXx8aVs2XSwhcyljb250aW51ZTtpZihhPVsuLi5zXS5sZW5ndGgsaVszXXx8aVs0XSl7dSs9YTtjb250aW51ZX1lbHNlIGlmKChpWzVdfHxpWzZdKSYmbCUzJiYhKChsK2EpJTMpKXtjKz1hO2NvbnRpbnVlfWlmKHUtPWEsdT4wKWNvbnRpbnVlO2E9TWF0aC5taW4oYSxhK3UrYyk7Y29uc3QgZj1bLi4uaVswXV1bMF0ubGVuZ3RoLGg9dC5zbGljZSgwLGwraS5pbmRleCtmK2EpO2lmKE1hdGgubWluKGwsYSklMil7Y29uc3QgZz1oLnNsaWNlKDEsLTEpO3JldHVybnt0eXBlOiJlbSIscmF3OmgsdGV4dDpnLHRva2Vuczp0aGlzLmxleGVyLmlubGluZVRva2VucyhnKX19Y29uc3QgbT1oLnNsaWNlKDIsLTIpO3JldHVybnt0eXBlOiJzdHJvbmciLHJhdzpoLHRleHQ6bSx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmVUb2tlbnMobSl9fX19Y29kZXNwYW4odCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmlubGluZS5jb2RlLmV4ZWModCk7aWYobil7bGV0IHI9blsyXS5yZXBsYWNlKC9cbi9nLCIgIik7Y29uc3QgaT0vW14gXS8udGVzdChyKSxvPS9eIC8udGVzdChyKSYmLyAkLy50ZXN0KHIpO3JldHVybiBpJiZvJiYocj1yLnN1YnN0cmluZygxLHIubGVuZ3RoLTEpKSxyPU1uKHIsITApLHt0eXBlOiJjb2Rlc3BhbiIscmF3Om5bMF0sdGV4dDpyfX19YnIodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmlubGluZS5ici5leGVjKHQpO2lmKG4pcmV0dXJue3R5cGU6ImJyIixyYXc6blswXX19ZGVsKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUuZGVsLmV4ZWModCk7aWYobilyZXR1cm57dHlwZToiZGVsIixyYXc6blswXSx0ZXh0Om5bMl0sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKG5bMl0pfX1hdXRvbGluayh0KXtjb25zdCBuPXRoaXMucnVsZXMuaW5saW5lLmF1dG9saW5rLmV4ZWModCk7aWYobil7bGV0IHIsaTtyZXR1cm4gblsyXT09PSJAIj8ocj1NbihuWzFdKSxpPSJtYWlsdG86IityKToocj1NbihuWzFdKSxpPXIpLHt0eXBlOiJsaW5rIixyYXc6blswXSx0ZXh0OnIsaHJlZjppLHRva2Vuczpbe3R5cGU6InRleHQiLHJhdzpyLHRleHQ6cn1dfX19dXJsKHQpe2xldCBuO2lmKG49dGhpcy5ydWxlcy5pbmxpbmUudXJsLmV4ZWModCkpe2xldCByLGk7aWYoblsyXT09PSJAIilyPU1uKG5bMF0pLGk9Im1haWx0bzoiK3I7ZWxzZXtsZXQgbztkbyBvPW5bMF0sblswXT10aGlzLnJ1bGVzLmlubGluZS5fYmFja3BlZGFsLmV4ZWMoblswXSlbMF07d2hpbGUobyE9PW5bMF0pO3I9TW4oblswXSksblsxXT09PSJ3d3cuIj9pPSJodHRwOi8vIituWzBdOmk9blswXX1yZXR1cm57dHlwZToibGluayIscmF3Om5bMF0sdGV4dDpyLGhyZWY6aSx0b2tlbnM6W3t0eXBlOiJ0ZXh0IixyYXc6cix0ZXh0OnJ9XX19fWlubGluZVRleHQodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmlubGluZS50ZXh0LmV4ZWModCk7aWYobil7bGV0IHI7cmV0dXJuIHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jaz9yPW5bMF06cj1NbihuWzBdKSx7dHlwZToidGV4dCIscmF3Om5bMF0sdGV4dDpyfX19fWNvbnN0IHVlPXtuZXdsaW5lOi9eKD86ICooPzpcbnwkKSkrLyxjb2RlOi9eKCB7NH1bXlxuXSsoPzpcbig/OiAqKD86XG58JCkpKik/KSsvLGZlbmNlczovXiB7MCwzfShgezMsfSg/PVteYFxuXSooPzpcbnwkKSl8fnszLH0pKFteXG5dKikoPzpcbnwkKSg/OnwoW1xzXFNdKj8pKD86XG58JCkpKD86IHswLDN9XDFbfmBdKiAqKD89XG58JCl8JCkvLGhyOi9eIHswLDN9KCg/Oi1bXHQgXSopezMsfXwoPzpfWyBcdF0qKXszLH18KD86XCpbIFx0XSopezMsfSkoPzpcbit8JCkvLGhlYWRpbmc6L14gezAsM30oI3sxLDZ9KSg/PVxzfCQpKC4qKSg/OlxuK3wkKS8sYmxvY2txdW90ZTovXiggezAsM30+ID8ocGFyYWdyYXBofFteXG5dKikoPzpcbnwkKSkrLyxsaXN0Oi9eKCB7MCwzfWJ1bGwpKFsgXHRdW15cbl0rPyk/KD86XG58JCkvLGh0bWw6Il4gezAsM30oPzo8KHNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpW1xccz5dW1xcc1xcU10qPyg/OjwvXFwxPlteXFxuXSpcXG4rfCQpfGNvbW1lbnRbXlxcbl0qKFxcbit8JCl8PFxcP1tcXHNcXFNdKj8oPzpcXD8+XFxuKnwkKXw8IVtBLVpdW1xcc1xcU10qPyg/Oj5cXG4qfCQpfDwhXFxbQ0RBVEFcXFtbXFxzXFxTXSo/KD86XFxdXFxdPlxcbip8JCl8PC8/KHRhZykoPzogK3xcXG58Lz8+KVtcXHNcXFNdKj8oPzooPzpcXG4gKikrXFxufCQpfDwoPyFzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKShbYS16XVtcXHctXSopKD86YXR0cmlidXRlKSo/ICovPz4oPz1bIFxcdF0qKD86XFxufCQpKVtcXHNcXFNdKj8oPzooPzpcXG4gKikrXFxufCQpfDwvKD8hc2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYSlbYS16XVtcXHctXSpcXHMqPig/PVsgXFx0XSooPzpcXG58JCkpW1xcc1xcU10qPyg/Oig/OlxcbiAqKStcXG58JCkpIixkZWY6L14gezAsM31cWyhsYWJlbClcXTogKig/OlxuICopPyhbXjxcc11bXlxzXSp8PC4qPz4pKD86KD86ICsoPzpcbiAqKT98ICpcbiAqKSh0aXRsZSkpPyAqKD86XG4rfCQpLyx0YWJsZTp3ZCxsaGVhZGluZzovXig/IWJ1bGwgKSgoPzoufFxuKD8hXHMqP1xufGJ1bGwgKSkrPylcbiB7MCwzfSg9K3wtKykgKig/OlxuK3wkKS8sX3BhcmFncmFwaDovXihbXlxuXSsoPzpcbig/IWhyfGhlYWRpbmd8bGhlYWRpbmd8YmxvY2txdW90ZXxmZW5jZXN8bGlzdHxodG1sfHRhYmxlfCArXG4pW15cbl0rKSopLyx0ZXh0Oi9eW15cbl0rL307dWUuX2xhYmVsPS8oPyFccypcXSkoPzpcXC58W15cW1xdXFxdKSsvO3VlLl90aXRsZT0vKD86Iig/OlxcIj98W14iXFxdKSoifCdbXidcbl0qKD86XG5bXidcbl0rKSpcbj8nfFwoW14oKV0qXCkpLzt1ZS5kZWY9QmUodWUuZGVmKS5yZXBsYWNlKCJsYWJlbCIsdWUuX2xhYmVsKS5yZXBsYWNlKCJ0aXRsZSIsdWUuX3RpdGxlKS5nZXRSZWdleCgpO3VlLmJ1bGxldD0vKD86WyorLV18XGR7MSw5fVsuKV0pLzt1ZS5saXN0SXRlbVN0YXJ0PUJlKC9eKCAqKShidWxsKSAqLykucmVwbGFjZSgiYnVsbCIsdWUuYnVsbGV0KS5nZXRSZWdleCgpO3VlLmxpc3Q9QmUodWUubGlzdCkucmVwbGFjZSgvYnVsbC9nLHVlLmJ1bGxldCkucmVwbGFjZSgiaHIiLCJcXG4rKD89XFwxPyg/Oig/Oi0gKil7Myx9fCg/Ol8gKil7Myx9fCg/OlxcKiAqKXszLH0pKD86XFxuK3wkKSkiKS5yZXBsYWNlKCJkZWYiLCJcXG4rKD89Iit1ZS5kZWYuc291cmNlKyIpIikuZ2V0UmVnZXgoKTt1ZS5fdGFnPSJhZGRyZXNzfGFydGljbGV8YXNpZGV8YmFzZXxiYXNlZm9udHxibG9ja3F1b3RlfGJvZHl8Y2FwdGlvbnxjZW50ZXJ8Y29sfGNvbGdyb3VwfGRkfGRldGFpbHN8ZGlhbG9nfGRpcnxkaXZ8ZGx8ZHR8ZmllbGRzZXR8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGZvcm18ZnJhbWV8ZnJhbWVzZXR8aFsxLTZdfGhlYWR8aGVhZGVyfGhyfGh0bWx8aWZyYW1lfGxlZ2VuZHxsaXxsaW5rfG1haW58bWVudXxtZW51aXRlbXxtZXRhfG5hdnxub2ZyYW1lc3xvbHxvcHRncm91cHxvcHRpb258cHxwYXJhbXxzZWN0aW9ufHNvdXJjZXxzdW1tYXJ5fHRhYmxlfHRib2R5fHRkfHRmb290fHRofHRoZWFkfHRpdGxlfHRyfHRyYWNrfHVsIjt1ZS5fY29tbWVudD0vPCEtLSg/IS0/PilbXHNcU10qPyg/Oi0tPnwkKS87dWUuaHRtbD1CZSh1ZS5odG1sLCJpIikucmVwbGFjZSgiY29tbWVudCIsdWUuX2NvbW1lbnQpLnJlcGxhY2UoInRhZyIsdWUuX3RhZykucmVwbGFjZSgiYXR0cmlidXRlIiwvICtbYS16QS1aOl9dW1x3LjotXSooPzogKj0gKiJbXiJcbl0qInwgKj0gKidbXidcbl0qJ3wgKj0gKlteXHMiJz08PmBdKyk/LykuZ2V0UmVnZXgoKTt1ZS5saGVhZGluZz1CZSh1ZS5saGVhZGluZykucmVwbGFjZSgvYnVsbC9nLHVlLmJ1bGxldCkuZ2V0UmVnZXgoKTt1ZS5wYXJhZ3JhcGg9QmUodWUuX3BhcmFncmFwaCkucmVwbGFjZSgiaHIiLHVlLmhyKS5yZXBsYWNlKCJoZWFkaW5nIiwiIHswLDN9I3sxLDZ9KD86XFxzfCQpIikucmVwbGFjZSgifGxoZWFkaW5nIiwiIikucmVwbGFjZSgifHRhYmxlIiwiIikucmVwbGFjZSgiYmxvY2txdW90ZSIsIiB7MCwzfT4iKS5yZXBsYWNlKCJmZW5jZXMiLCIgezAsM30oPzpgezMsfSg/PVteYFxcbl0qXFxuKXx+ezMsfSlbXlxcbl0qXFxuIikucmVwbGFjZSgibGlzdCIsIiB7MCwzfSg/OlsqKy1dfDFbLildKSAiKS5yZXBsYWNlKCJodG1sIiwiPC8/KD86dGFnKSg/OiArfFxcbnwvPz4pfDwoPzpzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhfCEtLSkiKS5yZXBsYWNlKCJ0YWciLHVlLl90YWcpLmdldFJlZ2V4KCk7dWUuYmxvY2txdW90ZT1CZSh1ZS5ibG9ja3F1b3RlKS5yZXBsYWNlKCJwYXJhZ3JhcGgiLHVlLnBhcmFncmFwaCkuZ2V0UmVnZXgoKTt1ZS5ub3JtYWw9ey4uLnVlfTt1ZS5nZm09ey4uLnVlLm5vcm1hbCx0YWJsZToiXiAqKFteXFxuIF0uKilcXG4gezAsM30oKD86XFx8ICopPzo/LSs6PyAqKD86XFx8ICo6Py0rOj8gKikqKD86XFx8ICopPykoPzpcXG4oKD86KD8hICpcXG58aHJ8aGVhZGluZ3xibG9ja3F1b3RlfGNvZGV8ZmVuY2VzfGxpc3R8aHRtbCkuKig/OlxcbnwkKSkqKVxcbip8JCkifTt1ZS5nZm0udGFibGU9QmUodWUuZ2ZtLnRhYmxlKS5yZXBsYWNlKCJociIsdWUuaHIpLnJlcGxhY2UoImhlYWRpbmciLCIgezAsM30jezEsNn0oPzpcXHN8JCkiKS5yZXBsYWNlKCJibG9ja3F1b3RlIiwiIHswLDN9PiIpLnJlcGxhY2UoImNvZGUiLCIgezR9W15cXG5dIikucmVwbGFjZSgiZmVuY2VzIiwiIHswLDN9KD86YHszLH0oPz1bXmBcXG5dKlxcbil8fnszLH0pW15cXG5dKlxcbiIpLnJlcGxhY2UoImxpc3QiLCIgezAsM30oPzpbKistXXwxWy4pXSkgIikucmVwbGFjZSgiaHRtbCIsIjwvPyg/OnRhZykoPzogK3xcXG58Lz8+KXw8KD86c2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYXwhLS0pIikucmVwbGFjZSgidGFnIix1ZS5fdGFnKS5nZXRSZWdleCgpO3VlLmdmbS5wYXJhZ3JhcGg9QmUodWUuX3BhcmFncmFwaCkucmVwbGFjZSgiaHIiLHVlLmhyKS5yZXBsYWNlKCJoZWFkaW5nIiwiIHswLDN9I3sxLDZ9KD86XFxzfCQpIikucmVwbGFjZSgifGxoZWFkaW5nIiwiIikucmVwbGFjZSgidGFibGUiLHVlLmdmbS50YWJsZSkucmVwbGFjZSgiYmxvY2txdW90ZSIsIiB7MCwzfT4iKS5yZXBsYWNlKCJmZW5jZXMiLCIgezAsM30oPzpgezMsfSg/PVteYFxcbl0qXFxuKXx+ezMsfSlbXlxcbl0qXFxuIikucmVwbGFjZSgibGlzdCIsIiB7MCwzfSg/OlsqKy1dfDFbLildKSAiKS5yZXBsYWNlKCJodG1sIiwiPC8/KD86dGFnKSg/OiArfFxcbnwvPz4pfDwoPzpzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhfCEtLSkiKS5yZXBsYWNlKCJ0YWciLHVlLl90YWcpLmdldFJlZ2V4KCk7dWUucGVkYW50aWM9ey4uLnVlLm5vcm1hbCxodG1sOkJlKGBeICooPzpjb21tZW50ICooPzpcXG58XFxzKiQpfDwodGFnKVtcXHNcXFNdKz88L1xcMT4gKig/OlxcbnsyLH18XFxzKiQpfDx0YWcoPzoiW14iXSoifCdbXiddKid8XFxzW14nIi8+XFxzXSopKj8vPz4gKig/OlxcbnsyLH18XFxzKiQpKWApLnJlcGxhY2UoImNvbW1lbnQiLHVlLl9jb21tZW50KS5yZXBsYWNlKC90YWcvZywiKD8hKD86YXxlbXxzdHJvbmd8c21hbGx8c3xjaXRlfHF8ZGZufGFiYnJ8ZGF0YXx0aW1lfGNvZGV8dmFyfHNhbXB8a2JkfHN1YnxzdXB8aXxifHV8bWFya3xydWJ5fHJ0fHJwfGJkaXxiZG98c3Bhbnxicnx3YnJ8aW5zfGRlbHxpbWcpXFxiKVxcdysoPyE6fFteXFx3XFxzQF0qQClcXGIiKS5nZXRSZWdleCgpLGRlZjovXiAqXFsoW15cXV0rKVxdOiAqPD8oW15ccz5dKyk+Pyg/OiArKFsiKF1bXlxuXStbIildKSk/ICooPzpcbit8JCkvLGhlYWRpbmc6L14oI3sxLDZ9KSguKikoPzpcbit8JCkvLGZlbmNlczp3ZCxsaGVhZGluZzovXiguKz8pXG4gezAsM30oPSt8LSspICooPzpcbit8JCkvLHBhcmFncmFwaDpCZSh1ZS5ub3JtYWwuX3BhcmFncmFwaCkucmVwbGFjZSgiaHIiLHVlLmhyKS5yZXBsYWNlKCJoZWFkaW5nIixgICojezEsNn0gKlteCl1gKS5yZXBsYWNlKCJsaGVhZGluZyIsdWUubGhlYWRpbmcpLnJlcGxhY2UoImJsb2NrcXVvdGUiLCIgezAsM30+IikucmVwbGFjZSgifGZlbmNlcyIsIiIpLnJlcGxhY2UoInxsaXN0IiwiIikucmVwbGFjZSgifGh0bWwiLCIiKS5nZXRSZWdleCgpfTtjb25zdCBZPXtlc2NhcGU6L15cXChbISIjJCUmJygpKissXC0uLzo7PD0+P0BcW1xdXFxeX2B7fH1+XSkvLGF1dG9saW5rOi9ePChzY2hlbWU6W15cc1x4MDAtXHgxZjw+XSp8ZW1haWwpPi8sdXJsOndkLHRhZzoiXmNvbW1lbnR8XjwvW2EtekEtWl1bXFx3Oi1dKlxccyo+fF48W2EtekEtWl1bXFx3LV0qKD86YXR0cmlidXRlKSo/XFxzKi8/PnxePFxcP1tcXHNcXFNdKj9cXD8+fF48IVthLXpBLVpdK1xcc1tcXHNcXFNdKj8+fF48IVxcW0NEQVRBXFxbW1xcc1xcU10qP1xcXVxcXT4iLGxpbms6L14hP1xbKGxhYmVsKVxdXChccyooaHJlZikoPzpccysodGl0bGUpKT9ccypcKS8scmVmbGluazovXiE/XFsobGFiZWwpXF1cWyhyZWYpXF0vLG5vbGluazovXiE/XFsocmVmKVxdKD86XFtcXSk/LyxyZWZsaW5rU2VhcmNoOiJyZWZsaW5rfG5vbGluayg/IVxcKCkiLGVtU3Ryb25nOntsRGVsaW06L14oPzpcKisoPzooKD8hXCopW3B1bmN0XSl8W15ccypdKSl8Xl8rKD86KCg/IV8pW3B1bmN0XSl8KFteXHNfXSkpLyxyRGVsaW1Bc3Q6L15bXl8qXSo/X19bXl8qXSo/XCpbXl8qXSo/KD89X18pfFteKl0rKD89W14qXSl8KD8hXCopW3B1bmN0XShcKispKD89W1xzXXwkKXxbXnB1bmN0XHNdKFwqKykoPyFcKikoPz1bcHVuY3Rcc118JCl8KD8hXCopW3B1bmN0XHNdKFwqKykoPz1bXnB1bmN0XHNdKXxbXHNdKFwqKykoPyFcKikoPz1bcHVuY3RdKXwoPyFcKilbcHVuY3RdKFwqKykoPyFcKikoPz1bcHVuY3RdKXxbXnB1bmN0XHNdKFwqKykoPz1bXnB1bmN0XHNdKS8sckRlbGltVW5kOi9eW15fKl0qP1wqXCpbXl8qXSo/X1teXypdKj8oPz1cKlwqKXxbXl9dKyg/PVteX10pfCg/IV8pW3B1bmN0XShfKykoPz1bXHNdfCQpfFtecHVuY3Rcc10oXyspKD8hXykoPz1bcHVuY3Rcc118JCl8KD8hXylbcHVuY3Rcc10oXyspKD89W15wdW5jdFxzXSl8W1xzXShfKykoPyFfKSg/PVtwdW5jdF0pfCg/IV8pW3B1bmN0XShfKykoPyFfKSg/PVtwdW5jdF0pL30sY29kZTovXihgKykoW15gXXxbXmBdW1xzXFNdKj9bXmBdKVwxKD8hYCkvLGJyOi9eKCB7Mix9fFxcKVxuKD8hXHMqJCkvLGRlbDp3ZCx0ZXh0Oi9eKGArfFteYF0pKD86KD89IHsyLH1cbil8W1xzXFNdKj8oPzooPz1bXFw8IVxbYCpfXXxcYl98JCl8W14gXSg/PSB7Mix9XG4pKSkvLHB1bmN0dWF0aW9uOi9eKCg/IVsqX10pW1xzcHVuY3R1YXRpb25dKS99O1kuX3B1bmN0dWF0aW9uPSJcXHB7UH0kKzw9PmBefH4iO1kucHVuY3R1YXRpb249QmUoWS5wdW5jdHVhdGlvbiwidSIpLnJlcGxhY2UoL3B1bmN0dWF0aW9uL2csWS5fcHVuY3R1YXRpb24pLmdldFJlZ2V4KCk7WS5ibG9ja1NraXA9L1xbW15bXF1dKj9cXVwoW15cKFwpXSo/XCl8YFteYF0qP2B8PFtePD5dKj8+L2c7WS5hbnlQdW5jdHVhdGlvbj0vXFxbcHVuY3RdL2c7WS5fZXNjYXBlcz0vXFwoW3B1bmN0XSkvZztZLl9jb21tZW50PUJlKHVlLl9jb21tZW50KS5yZXBsYWNlKCIoPzotLT58JCkiLCItLT4iKS5nZXRSZWdleCgpO1kuZW1TdHJvbmcubERlbGltPUJlKFkuZW1TdHJvbmcubERlbGltLCJ1IikucmVwbGFjZSgvcHVuY3QvZyxZLl9wdW5jdHVhdGlvbikuZ2V0UmVnZXgoKTtZLmVtU3Ryb25nLnJEZWxpbUFzdD1CZShZLmVtU3Ryb25nLnJEZWxpbUFzdCwiZ3UiKS5yZXBsYWNlKC9wdW5jdC9nLFkuX3B1bmN0dWF0aW9uKS5nZXRSZWdleCgpO1kuZW1TdHJvbmcuckRlbGltVW5kPUJlKFkuZW1TdHJvbmcuckRlbGltVW5kLCJndSIpLnJlcGxhY2UoL3B1bmN0L2csWS5fcHVuY3R1YXRpb24pLmdldFJlZ2V4KCk7WS5hbnlQdW5jdHVhdGlvbj1CZShZLmFueVB1bmN0dWF0aW9uLCJndSIpLnJlcGxhY2UoL3B1bmN0L2csWS5fcHVuY3R1YXRpb24pLmdldFJlZ2V4KCk7WS5fZXNjYXBlcz1CZShZLl9lc2NhcGVzLCJndSIpLnJlcGxhY2UoL3B1bmN0L2csWS5fcHVuY3R1YXRpb24pLmdldFJlZ2V4KCk7WS5fc2NoZW1lPS9bYS16QS1aXVthLXpBLVowLTkrLi1dezEsMzF9LztZLl9lbWFpbD0vW2EtekEtWjAtOS4hIyQlJicqKy89P15fYHt8fX4tXSsoQClbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykrKD8hWy1fXSkvO1kuYXV0b2xpbms9QmUoWS5hdXRvbGluaykucmVwbGFjZSgic2NoZW1lIixZLl9zY2hlbWUpLnJlcGxhY2UoImVtYWlsIixZLl9lbWFpbCkuZ2V0UmVnZXgoKTtZLl9hdHRyaWJ1dGU9L1xzK1thLXpBLVo6X11bXHcuOi1dKig/OlxzKj1ccyoiW14iXSoifFxzKj1ccyonW14nXSonfFxzKj1ccypbXlxzIic9PD5gXSspPy87WS50YWc9QmUoWS50YWcpLnJlcGxhY2UoImNvbW1lbnQiLFkuX2NvbW1lbnQpLnJlcGxhY2UoImF0dHJpYnV0ZSIsWS5fYXR0cmlidXRlKS5nZXRSZWdleCgpO1kuX2xhYmVsPS8oPzpcWyg/OlxcLnxbXlxbXF1cXF0pKlxdfFxcLnxgW15gXSpgfFteXFtcXVxcYF0pKj8vO1kuX2hyZWY9LzwoPzpcXC58W15cbjw+XFxdKSs+fFteXHNceDAwLVx4MWZdKi87WS5fdGl0bGU9LyIoPzpcXCI/fFteIlxcXSkqInwnKD86XFwnP3xbXidcXF0pKid8XCgoPzpcXFwpP3xbXilcXF0pKlwpLztZLmxpbms9QmUoWS5saW5rKS5yZXBsYWNlKCJsYWJlbCIsWS5fbGFiZWwpLnJlcGxhY2UoImhyZWYiLFkuX2hyZWYpLnJlcGxhY2UoInRpdGxlIixZLl90aXRsZSkuZ2V0UmVnZXgoKTtZLnJlZmxpbms9QmUoWS5yZWZsaW5rKS5yZXBsYWNlKCJsYWJlbCIsWS5fbGFiZWwpLnJlcGxhY2UoInJlZiIsdWUuX2xhYmVsKS5nZXRSZWdleCgpO1kubm9saW5rPUJlKFkubm9saW5rKS5yZXBsYWNlKCJyZWYiLHVlLl9sYWJlbCkuZ2V0UmVnZXgoKTtZLnJlZmxpbmtTZWFyY2g9QmUoWS5yZWZsaW5rU2VhcmNoLCJnIikucmVwbGFjZSgicmVmbGluayIsWS5yZWZsaW5rKS5yZXBsYWNlKCJub2xpbmsiLFkubm9saW5rKS5nZXRSZWdleCgpO1kubm9ybWFsPXsuLi5ZfTtZLnBlZGFudGljPXsuLi5ZLm5vcm1hbCxzdHJvbmc6e3N0YXJ0Oi9eX198XCpcKi8sbWlkZGxlOi9eX18oPz1cUykoW1xzXFNdKj9cUylfXyg/IV8pfF5cKlwqKD89XFMpKFtcc1xTXSo/XFMpXCpcKig/IVwqKS8sZW5kQXN0Oi9cKlwqKD8hXCopL2csZW5kVW5kOi9fXyg/IV8pL2d9LGVtOntzdGFydDovXl98XCovLG1pZGRsZTovXigpXCooPz1cUykoW1xzXFNdKj9cUylcKig/IVwqKXxeXyg/PVxTKShbXHNcU10qP1xTKV8oPyFfKS8sZW5kQXN0Oi9cKig/IVwqKS9nLGVuZFVuZDovXyg/IV8pL2d9LGxpbms6QmUoL14hP1xbKGxhYmVsKVxdXCgoLio/KVwpLykucmVwbGFjZSgibGFiZWwiLFkuX2xhYmVsKS5nZXRSZWdleCgpLHJlZmxpbms6QmUoL14hP1xbKGxhYmVsKVxdXHMqXFsoW15cXV0qKVxdLykucmVwbGFjZSgibGFiZWwiLFkuX2xhYmVsKS5nZXRSZWdleCgpfTtZLmdmbT17Li4uWS5ub3JtYWwsZXNjYXBlOkJlKFkuZXNjYXBlKS5yZXBsYWNlKCJdKSIsIn58XSkiKS5nZXRSZWdleCgpLF9leHRlbmRlZF9lbWFpbDovW0EtWmEtejAtOS5fKy1dKyhAKVthLXpBLVowLTktX10rKD86XC5bYS16QS1aMC05LV9dKlthLXpBLVowLTldKSsoPyFbLV9dKS8sdXJsOi9eKCg/OmZ0cHxodHRwcz8pOlwvXC98d3d3XC4pKD86W2EtekEtWjAtOVwtXStcLj8pK1teXHM8XSp8XmVtYWlsLyxfYmFja3BlZGFsOi8oPzpbXj8hLiw6OypfJyJ+KCkmXSt8XChbXildKlwpfCYoPyFbYS16QS1aMC05XSs7JCl8Wz8hLiw6OypfJyJ+KV0rKD8hJCkpKy8sZGVsOi9eKH5+PykoPz1bXlxzfl0pKFtcc1xTXSo/W15cc35dKVwxKD89W15+XXwkKS8sdGV4dDovXihbYH5dK3xbXmB+XSkoPzooPz0gezIsfVxuKXwoPz1bYS16QS1aMC05LiEjJCUmJyorXC89P19ge1x8fX4tXStAKXxbXHNcU10qPyg/Oig/PVtcXDwhXFtgKn5fXXxcYl98aHR0cHM/OlwvXC98ZnRwOlwvXC98d3d3XC58JCl8W14gXSg/PSB7Mix9XG4pfFteYS16QS1aMC05LiEjJCUmJyorXC89P19ge1x8fX4tXSg/PVthLXpBLVowLTkuISMkJSYnKitcLz0/X2B7XHx9fi1dK0ApKSkvfTtZLmdmbS51cmw9QmUoWS5nZm0udXJsLCJpIikucmVwbGFjZSgiZW1haWwiLFkuZ2ZtLl9leHRlbmRlZF9lbWFpbCkuZ2V0UmVnZXgoKTtZLmJyZWFrcz17Li4uWS5nZm0sYnI6QmUoWS5icikucmVwbGFjZSgiezIsfSIsIioiKS5nZXRSZWdleCgpLHRleHQ6QmUoWS5nZm0udGV4dCkucmVwbGFjZSgiXFxiXyIsIlxcYl98IHsyLH1cXG4iKS5yZXBsYWNlKC9cezIsXH0vZywiKiIpLmdldFJlZ2V4KCl9O2NsYXNzIElye2NvbnN0cnVjdG9yKHQpe0plKHRoaXMsInRva2VucyIpO0plKHRoaXMsIm9wdGlvbnMiKTtKZSh0aGlzLCJzdGF0ZSIpO0plKHRoaXMsInRva2VuaXplciIpO0plKHRoaXMsImlubGluZVF1ZXVlIik7dGhpcy50b2tlbnM9W10sdGhpcy50b2tlbnMubGlua3M9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLm9wdGlvbnM9dHx8bGwsdGhpcy5vcHRpb25zLnRva2VuaXplcj10aGlzLm9wdGlvbnMudG9rZW5pemVyfHxuZXcgU2QsdGhpcy50b2tlbml6ZXI9dGhpcy5vcHRpb25zLnRva2VuaXplcix0aGlzLnRva2VuaXplci5vcHRpb25zPXRoaXMub3B0aW9ucyx0aGlzLnRva2VuaXplci5sZXhlcj10aGlzLHRoaXMuaW5saW5lUXVldWU9W10sdGhpcy5zdGF0ZT17aW5MaW5rOiExLGluUmF3QmxvY2s6ITEsdG9wOiEwfTtjb25zdCBuPXtibG9jazp1ZS5ub3JtYWwsaW5saW5lOlkubm9ybWFsfTt0aGlzLm9wdGlvbnMucGVkYW50aWM/KG4uYmxvY2s9dWUucGVkYW50aWMsbi5pbmxpbmU9WS5wZWRhbnRpYyk6dGhpcy5vcHRpb25zLmdmbSYmKG4uYmxvY2s9dWUuZ2ZtLHRoaXMub3B0aW9ucy5icmVha3M/bi5pbmxpbmU9WS5icmVha3M6bi5pbmxpbmU9WS5nZm0pLHRoaXMudG9rZW5pemVyLnJ1bGVzPW59c3RhdGljIGdldCBydWxlcygpe3JldHVybntibG9jazp1ZSxpbmxpbmU6WX19c3RhdGljIGxleCh0LG4pe3JldHVybiBuZXcgSXIobikubGV4KHQpfXN0YXRpYyBsZXhJbmxpbmUodCxuKXtyZXR1cm4gbmV3IElyKG4pLmlubGluZVRva2Vucyh0KX1sZXgodCl7dD10LnJlcGxhY2UoL1xyXG58XHIvZyxgCmApLHRoaXMuYmxvY2tUb2tlbnModCx0aGlzLnRva2Vucyk7bGV0IG47Zm9yKDtuPXRoaXMuaW5saW5lUXVldWUuc2hpZnQoKTspdGhpcy5pbmxpbmVUb2tlbnMobi5zcmMsbi50b2tlbnMpO3JldHVybiB0aGlzLnRva2Vuc31ibG9ja1Rva2Vucyh0LG49W10pe3RoaXMub3B0aW9ucy5wZWRhbnRpYz90PXQucmVwbGFjZSgvXHQvZywiICAgICIpLnJlcGxhY2UoL14gKyQvZ20sIiIpOnQ9dC5yZXBsYWNlKC9eKCAqKShcdCspL2dtLChzLGEsdSk9PmErIiAgICAiLnJlcGVhdCh1Lmxlbmd0aCkpO2xldCByLGksbyxsO2Zvcig7dDspaWYoISh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucyYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuYmxvY2smJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLmJsb2NrLnNvbWUocz0+KHI9cy5jYWxsKHtsZXhlcjp0aGlzfSx0LG4pKT8odD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKSwhMCk6ITEpKSl7aWYocj10aGlzLnRva2VuaXplci5zcGFjZSh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLHIucmF3Lmxlbmd0aD09PTEmJm4ubGVuZ3RoPjA/bltuLmxlbmd0aC0xXS5yYXcrPWAKYDpuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5jb2RlKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksaT1uW24ubGVuZ3RoLTFdLGkmJihpLnR5cGU9PT0icGFyYWdyYXBoInx8aS50eXBlPT09InRleHQiKT8oaS5yYXcrPWAKYCtyLnJhdyxpLnRleHQrPWAKYCtyLnRleHQsdGhpcy5pbmxpbmVRdWV1ZVt0aGlzLmlubGluZVF1ZXVlLmxlbmd0aC0xXS5zcmM9aS50ZXh0KTpuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5mZW5jZXModCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5oZWFkaW5nKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuaHIodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5ibG9ja3F1b3RlKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIubGlzdCh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmh0bWwodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5kZWYodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxpPW5bbi5sZW5ndGgtMV0saSYmKGkudHlwZT09PSJwYXJhZ3JhcGgifHxpLnR5cGU9PT0idGV4dCIpPyhpLnJhdys9YApgK3IucmF3LGkudGV4dCs9YApgK3IucmF3LHRoaXMuaW5saW5lUXVldWVbdGhpcy5pbmxpbmVRdWV1ZS5sZW5ndGgtMV0uc3JjPWkudGV4dCk6dGhpcy50b2tlbnMubGlua3Nbci50YWddfHwodGhpcy50b2tlbnMubGlua3Nbci50YWddPXtocmVmOnIuaHJlZix0aXRsZTpyLnRpdGxlfSk7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci50YWJsZSh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmxoZWFkaW5nKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKG89dCx0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucyYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRCbG9jayl7bGV0IHM9MS8wO2NvbnN0IGE9dC5zbGljZSgxKTtsZXQgdTt0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydEJsb2NrLmZvckVhY2goYz0+e3U9Yy5jYWxsKHtsZXhlcjp0aGlzfSxhKSx0eXBlb2YgdT09Im51bWJlciImJnU+PTAmJihzPU1hdGgubWluKHMsdSkpfSksczwxLzAmJnM+PTAmJihvPXQuc3Vic3RyaW5nKDAscysxKSl9aWYodGhpcy5zdGF0ZS50b3AmJihyPXRoaXMudG9rZW5pemVyLnBhcmFncmFwaChvKSkpe2k9bltuLmxlbmd0aC0xXSxsJiZpLnR5cGU9PT0icGFyYWdyYXBoIj8oaS5yYXcrPWAKYCtyLnJhdyxpLnRleHQrPWAKYCtyLnRleHQsdGhpcy5pbmxpbmVRdWV1ZS5wb3AoKSx0aGlzLmlubGluZVF1ZXVlW3RoaXMuaW5saW5lUXVldWUubGVuZ3RoLTFdLnNyYz1pLnRleHQpOm4ucHVzaChyKSxsPW8ubGVuZ3RoIT09dC5sZW5ndGgsdD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIudGV4dCh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLGk9bltuLmxlbmd0aC0xXSxpJiZpLnR5cGU9PT0idGV4dCI/KGkucmF3Kz1gCmArci5yYXcsaS50ZXh0Kz1gCmArci50ZXh0LHRoaXMuaW5saW5lUXVldWUucG9wKCksdGhpcy5pbmxpbmVRdWV1ZVt0aGlzLmlubGluZVF1ZXVlLmxlbmd0aC0xXS5zcmM9aS50ZXh0KTpuLnB1c2gocik7Y29udGludWV9aWYodCl7Y29uc3Qgcz0iSW5maW5pdGUgbG9vcCBvbiBieXRlOiAiK3QuY2hhckNvZGVBdCgwKTtpZih0aGlzLm9wdGlvbnMuc2lsZW50KXtjb25zb2xlLmVycm9yKHMpO2JyZWFrfWVsc2UgdGhyb3cgbmV3IEVycm9yKHMpfX1yZXR1cm4gdGhpcy5zdGF0ZS50b3A9ITAsbn1pbmxpbmUodCxuPVtdKXtyZXR1cm4gdGhpcy5pbmxpbmVRdWV1ZS5wdXNoKHtzcmM6dCx0b2tlbnM6bn0pLG59aW5saW5lVG9rZW5zKHQsbj1bXSl7bGV0IHIsaSxvLGw9dCxzLGEsdTtpZih0aGlzLnRva2Vucy5saW5rcyl7Y29uc3QgYz1PYmplY3Qua2V5cyh0aGlzLnRva2Vucy5saW5rcyk7aWYoYy5sZW5ndGg+MClmb3IoOyhzPXRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5yZWZsaW5rU2VhcmNoLmV4ZWMobCkpIT1udWxsOyljLmluY2x1ZGVzKHNbMF0uc2xpY2Uoc1swXS5sYXN0SW5kZXhPZigiWyIpKzEsLTEpKSYmKGw9bC5zbGljZSgwLHMuaW5kZXgpKyJbIisiYSIucmVwZWF0KHNbMF0ubGVuZ3RoLTIpKyJdIitsLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5yZWZsaW5rU2VhcmNoLmxhc3RJbmRleCkpfWZvcig7KHM9dGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmJsb2NrU2tpcC5leGVjKGwpKSE9bnVsbDspbD1sLnNsaWNlKDAscy5pbmRleCkrIlsiKyJhIi5yZXBlYXQoc1swXS5sZW5ndGgtMikrIl0iK2wuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmJsb2NrU2tpcC5sYXN0SW5kZXgpO2Zvcig7KHM9dGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLmV4ZWMobCkpIT1udWxsOylsPWwuc2xpY2UoMCxzLmluZGV4KSsiKysiK2wuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLmxhc3RJbmRleCk7Zm9yKDt0OylpZihhfHwodT0iIiksYT0hMSwhKHRoaXMub3B0aW9ucy5leHRlbnNpb25zJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5pbmxpbmUmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLmlubGluZS5zb21lKGM9PihyPWMuY2FsbCh7bGV4ZXI6dGhpc30sdCxuKSk/KHQ9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gociksITApOiExKSkpe2lmKHI9dGhpcy50b2tlbml6ZXIuZXNjYXBlKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIudGFnKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksaT1uW24ubGVuZ3RoLTFdLGkmJnIudHlwZT09PSJ0ZXh0IiYmaS50eXBlPT09InRleHQiPyhpLnJhdys9ci5yYXcsaS50ZXh0Kz1yLnRleHQpOm4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmxpbmsodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5yZWZsaW5rKHQsdGhpcy50b2tlbnMubGlua3MpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksaT1uW24ubGVuZ3RoLTFdLGkmJnIudHlwZT09PSJ0ZXh0IiYmaS50eXBlPT09InRleHQiPyhpLnJhdys9ci5yYXcsaS50ZXh0Kz1yLnRleHQpOm4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmVtU3Ryb25nKHQsbCx1KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmNvZGVzcGFuKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuYnIodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5kZWwodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5hdXRvbGluayh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZighdGhpcy5zdGF0ZS5pbkxpbmsmJihyPXRoaXMudG9rZW5pemVyLnVybCh0KSkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYobz10LHRoaXMub3B0aW9ucy5leHRlbnNpb25zJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydElubGluZSl7bGV0IGM9MS8wO2NvbnN0IGQ9dC5zbGljZSgxKTtsZXQgZjt0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydElubGluZS5mb3JFYWNoKGg9PntmPWguY2FsbCh7bGV4ZXI6dGhpc30sZCksdHlwZW9mIGY9PSJudW1iZXIiJiZmPj0wJiYoYz1NYXRoLm1pbihjLGYpKX0pLGM8MS8wJiZjPj0wJiYobz10LnN1YnN0cmluZygwLGMrMSkpfWlmKHI9dGhpcy50b2tlbml6ZXIuaW5saW5lVGV4dChvKSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLHIucmF3LnNsaWNlKC0xKSE9PSJfIiYmKHU9ci5yYXcuc2xpY2UoLTEpKSxhPSEwLGk9bltuLmxlbmd0aC0xXSxpJiZpLnR5cGU9PT0idGV4dCI/KGkucmF3Kz1yLnJhdyxpLnRleHQrPXIudGV4dCk6bi5wdXNoKHIpO2NvbnRpbnVlfWlmKHQpe2NvbnN0IGM9IkluZmluaXRlIGxvb3Agb24gYnl0ZTogIit0LmNoYXJDb2RlQXQoMCk7aWYodGhpcy5vcHRpb25zLnNpbGVudCl7Y29uc29sZS5lcnJvcihjKTticmVha31lbHNlIHRocm93IG5ldyBFcnJvcihjKX19cmV0dXJuIG59fWNsYXNzIEVke2NvbnN0cnVjdG9yKHQpe0plKHRoaXMsIm9wdGlvbnMiKTt0aGlzLm9wdGlvbnM9dHx8bGx9Y29kZSh0LG4scil7dmFyIG87Y29uc3QgaT0obz0obnx8IiIpLm1hdGNoKC9eXFMqLykpPT1udWxsP3ZvaWQgMDpvWzBdO3JldHVybiB0PXQucmVwbGFjZSgvXG4kLywiIikrYApgLGk/JzxwcmU+PGNvZGUgY2xhc3M9Imxhbmd1YWdlLScrTW4oaSkrJyI+Jysocj90Ok1uKHQsITApKStgPC9jb2RlPjwvcHJlPgpgOiI8cHJlPjxjb2RlPiIrKHI/dDpNbih0LCEwKSkrYDwvY29kZT48L3ByZT4KYH1ibG9ja3F1b3RlKHQpe3JldHVybmA8YmxvY2txdW90ZT4KJHt0fTwvYmxvY2txdW90ZT4KYH1odG1sKHQsbil7cmV0dXJuIHR9aGVhZGluZyh0LG4scil7cmV0dXJuYDxoJHtufT4ke3R9PC9oJHtufT4KYH1ocigpe3JldHVybmA8aHI+CmB9bGlzdCh0LG4scil7Y29uc3QgaT1uPyJvbCI6InVsIixvPW4mJnIhPT0xPycgc3RhcnQ9IicrcisnIic6IiI7cmV0dXJuIjwiK2krbytgPgpgK3QrIjwvIitpK2A+CmB9bGlzdGl0ZW0odCxuLHIpe3JldHVybmA8bGk+JHt0fTwvbGk+CmB9Y2hlY2tib3godCl7cmV0dXJuIjxpbnB1dCAiKyh0PydjaGVja2VkPSIiICc6IiIpKydkaXNhYmxlZD0iIiB0eXBlPSJjaGVja2JveCI+J31wYXJhZ3JhcGgodCl7cmV0dXJuYDxwPiR7dH08L3A+CmB9dGFibGUodCxuKXtyZXR1cm4gbiYmKG49YDx0Ym9keT4ke259PC90Ym9keT5gKSxgPHRhYmxlPgo8dGhlYWQ+CmArdCtgPC90aGVhZD4KYCtuK2A8L3RhYmxlPgpgfXRhYmxlcm93KHQpe3JldHVybmA8dHI+CiR7dH08L3RyPgpgfXRhYmxlY2VsbCh0LG4pe2NvbnN0IHI9bi5oZWFkZXI/InRoIjoidGQiO3JldHVybihuLmFsaWduP2A8JHtyfSBhbGlnbj0iJHtuLmFsaWdufSI+YDpgPCR7cn0+YCkrdCtgPC8ke3J9PgpgfXN0cm9uZyh0KXtyZXR1cm5gPHN0cm9uZz4ke3R9PC9zdHJvbmc+YH1lbSh0KXtyZXR1cm5gPGVtPiR7dH08L2VtPmB9Y29kZXNwYW4odCl7cmV0dXJuYDxjb2RlPiR7dH08L2NvZGU+YH1icigpe3JldHVybiI8YnI+In1kZWwodCl7cmV0dXJuYDxkZWw+JHt0fTwvZGVsPmB9bGluayh0LG4scil7Y29uc3QgaT1OMCh0KTtpZihpPT09bnVsbClyZXR1cm4gcjt0PWk7bGV0IG89JzxhIGhyZWY9IicrdCsnIic7cmV0dXJuIG4mJihvKz0nIHRpdGxlPSInK24rJyInKSxvKz0iPiIrcisiPC9hPiIsb31pbWFnZSh0LG4scil7Y29uc3QgaT1OMCh0KTtpZihpPT09bnVsbClyZXR1cm4gcjt0PWk7bGV0IG89YDxpbWcgc3JjPSIke3R9IiBhbHQ9IiR7cn0iYDtyZXR1cm4gbiYmKG8rPWAgdGl0bGU9IiR7bn0iYCksbys9Ij4iLG99dGV4dCh0KXtyZXR1cm4gdH19Y2xhc3MgSmd7c3Ryb25nKHQpe3JldHVybiB0fWVtKHQpe3JldHVybiB0fWNvZGVzcGFuKHQpe3JldHVybiB0fWRlbCh0KXtyZXR1cm4gdH1odG1sKHQpe3JldHVybiB0fXRleHQodCl7cmV0dXJuIHR9bGluayh0LG4scil7cmV0dXJuIiIrcn1pbWFnZSh0LG4scil7cmV0dXJuIiIrcn1icigpe3JldHVybiIifX1jbGFzcyBMcntjb25zdHJ1Y3Rvcih0KXtKZSh0aGlzLCJvcHRpb25zIik7SmUodGhpcywicmVuZGVyZXIiKTtKZSh0aGlzLCJ0ZXh0UmVuZGVyZXIiKTt0aGlzLm9wdGlvbnM9dHx8bGwsdGhpcy5vcHRpb25zLnJlbmRlcmVyPXRoaXMub3B0aW9ucy5yZW5kZXJlcnx8bmV3IEVkLHRoaXMucmVuZGVyZXI9dGhpcy5vcHRpb25zLnJlbmRlcmVyLHRoaXMucmVuZGVyZXIub3B0aW9ucz10aGlzLm9wdGlvbnMsdGhpcy50ZXh0UmVuZGVyZXI9bmV3IEpnfXN0YXRpYyBwYXJzZSh0LG4pe3JldHVybiBuZXcgTHIobikucGFyc2UodCl9c3RhdGljIHBhcnNlSW5saW5lKHQsbil7cmV0dXJuIG5ldyBMcihuKS5wYXJzZUlubGluZSh0KX1wYXJzZSh0LG49ITApe2xldCByPSIiO2ZvcihsZXQgaT0wO2k8dC5sZW5ndGg7aSsrKXtjb25zdCBvPXRbaV07aWYodGhpcy5vcHRpb25zLmV4dGVuc2lvbnMmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVycyYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW28udHlwZV0pe2NvbnN0IGw9byxzPXRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVyc1tsLnR5cGVdLmNhbGwoe3BhcnNlcjp0aGlzfSxsKTtpZihzIT09ITF8fCFbInNwYWNlIiwiaHIiLCJoZWFkaW5nIiwiY29kZSIsInRhYmxlIiwiYmxvY2txdW90ZSIsImxpc3QiLCJodG1sIiwicGFyYWdyYXBoIiwidGV4dCJdLmluY2x1ZGVzKGwudHlwZSkpe3IrPXN8fCIiO2NvbnRpbnVlfX1zd2l0Y2goby50eXBlKXtjYXNlInNwYWNlIjpjb250aW51ZTtjYXNlImhyIjp7cis9dGhpcy5yZW5kZXJlci5ocigpO2NvbnRpbnVlfWNhc2UiaGVhZGluZyI6e2NvbnN0IGw9bztyKz10aGlzLnJlbmRlcmVyLmhlYWRpbmcodGhpcy5wYXJzZUlubGluZShsLnRva2VucyksbC5kZXB0aCxhUih0aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zLHRoaXMudGV4dFJlbmRlcmVyKSkpO2NvbnRpbnVlfWNhc2UiY29kZSI6e2NvbnN0IGw9bztyKz10aGlzLnJlbmRlcmVyLmNvZGUobC50ZXh0LGwubGFuZywhIWwuZXNjYXBlZCk7Y29udGludWV9Y2FzZSJ0YWJsZSI6e2NvbnN0IGw9bztsZXQgcz0iIixhPSIiO2ZvcihsZXQgYz0wO2M8bC5oZWFkZXIubGVuZ3RoO2MrKylhKz10aGlzLnJlbmRlcmVyLnRhYmxlY2VsbCh0aGlzLnBhcnNlSW5saW5lKGwuaGVhZGVyW2NdLnRva2Vucykse2hlYWRlcjohMCxhbGlnbjpsLmFsaWduW2NdfSk7cys9dGhpcy5yZW5kZXJlci50YWJsZXJvdyhhKTtsZXQgdT0iIjtmb3IobGV0IGM9MDtjPGwucm93cy5sZW5ndGg7YysrKXtjb25zdCBkPWwucm93c1tjXTthPSIiO2ZvcihsZXQgZj0wO2Y8ZC5sZW5ndGg7ZisrKWErPXRoaXMucmVuZGVyZXIudGFibGVjZWxsKHRoaXMucGFyc2VJbmxpbmUoZFtmXS50b2tlbnMpLHtoZWFkZXI6ITEsYWxpZ246bC5hbGlnbltmXX0pO3UrPXRoaXMucmVuZGVyZXIudGFibGVyb3coYSl9cis9dGhpcy5yZW5kZXJlci50YWJsZShzLHUpO2NvbnRpbnVlfWNhc2UiYmxvY2txdW90ZSI6e2NvbnN0IGw9byxzPXRoaXMucGFyc2UobC50b2tlbnMpO3IrPXRoaXMucmVuZGVyZXIuYmxvY2txdW90ZShzKTtjb250aW51ZX1jYXNlImxpc3QiOntjb25zdCBsPW8scz1sLm9yZGVyZWQsYT1sLnN0YXJ0LHU9bC5sb29zZTtsZXQgYz0iIjtmb3IobGV0IGQ9MDtkPGwuaXRlbXMubGVuZ3RoO2QrKyl7Y29uc3QgZj1sLml0ZW1zW2RdLGg9Zi5jaGVja2VkLG09Zi50YXNrO2xldCBnPSIiO2lmKGYudGFzayl7Y29uc3QgUz10aGlzLnJlbmRlcmVyLmNoZWNrYm94KCEhaCk7dT9mLnRva2Vucy5sZW5ndGg+MCYmZi50b2tlbnNbMF0udHlwZT09PSJwYXJhZ3JhcGgiPyhmLnRva2Vuc1swXS50ZXh0PVMrIiAiK2YudG9rZW5zWzBdLnRleHQsZi50b2tlbnNbMF0udG9rZW5zJiZmLnRva2Vuc1swXS50b2tlbnMubGVuZ3RoPjAmJmYudG9rZW5zWzBdLnRva2Vuc1swXS50eXBlPT09InRleHQiJiYoZi50b2tlbnNbMF0udG9rZW5zWzBdLnRleHQ9UysiICIrZi50b2tlbnNbMF0udG9rZW5zWzBdLnRleHQpKTpmLnRva2Vucy51bnNoaWZ0KHt0eXBlOiJ0ZXh0Iix0ZXh0OlMrIiAifSk6Zys9UysiICJ9Zys9dGhpcy5wYXJzZShmLnRva2Vucyx1KSxjKz10aGlzLnJlbmRlcmVyLmxpc3RpdGVtKGcsbSwhIWgpfXIrPXRoaXMucmVuZGVyZXIubGlzdChjLHMsYSk7Y29udGludWV9Y2FzZSJodG1sIjp7Y29uc3QgbD1vO3IrPXRoaXMucmVuZGVyZXIuaHRtbChsLnRleHQsbC5ibG9jayk7Y29udGludWV9Y2FzZSJwYXJhZ3JhcGgiOntjb25zdCBsPW87cis9dGhpcy5yZW5kZXJlci5wYXJhZ3JhcGgodGhpcy5wYXJzZUlubGluZShsLnRva2VucykpO2NvbnRpbnVlfWNhc2UidGV4dCI6e2xldCBsPW8scz1sLnRva2Vucz90aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zKTpsLnRleHQ7Zm9yKDtpKzE8dC5sZW5ndGgmJnRbaSsxXS50eXBlPT09InRleHQiOylsPXRbKytpXSxzKz1gCmArKGwudG9rZW5zP3RoaXMucGFyc2VJbmxpbmUobC50b2tlbnMpOmwudGV4dCk7cis9bj90aGlzLnJlbmRlcmVyLnBhcmFncmFwaChzKTpzO2NvbnRpbnVlfWRlZmF1bHQ6e2NvbnN0IGw9J1Rva2VuIHdpdGggIicrby50eXBlKyciIHR5cGUgd2FzIG5vdCBmb3VuZC4nO2lmKHRoaXMub3B0aW9ucy5zaWxlbnQpcmV0dXJuIGNvbnNvbGUuZXJyb3IobCksIiI7dGhyb3cgbmV3IEVycm9yKGwpfX19cmV0dXJuIHJ9cGFyc2VJbmxpbmUodCxuKXtuPW58fHRoaXMucmVuZGVyZXI7bGV0IHI9IiI7Zm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspe2NvbnN0IG89dFtpXTtpZih0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucyYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnNbby50eXBlXSl7Y29uc3QgbD10aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnNbby50eXBlXS5jYWxsKHtwYXJzZXI6dGhpc30sbyk7aWYobCE9PSExfHwhWyJlc2NhcGUiLCJodG1sIiwibGluayIsImltYWdlIiwic3Ryb25nIiwiZW0iLCJjb2Rlc3BhbiIsImJyIiwiZGVsIiwidGV4dCJdLmluY2x1ZGVzKG8udHlwZSkpe3IrPWx8fCIiO2NvbnRpbnVlfX1zd2l0Y2goby50eXBlKXtjYXNlImVzY2FwZSI6e2NvbnN0IGw9bztyKz1uLnRleHQobC50ZXh0KTticmVha31jYXNlImh0bWwiOntjb25zdCBsPW87cis9bi5odG1sKGwudGV4dCk7YnJlYWt9Y2FzZSJsaW5rIjp7Y29uc3QgbD1vO3IrPW4ubGluayhsLmhyZWYsbC50aXRsZSx0aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zLG4pKTticmVha31jYXNlImltYWdlIjp7Y29uc3QgbD1vO3IrPW4uaW1hZ2UobC5ocmVmLGwudGl0bGUsbC50ZXh0KTticmVha31jYXNlInN0cm9uZyI6e2NvbnN0IGw9bztyKz1uLnN0cm9uZyh0aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zLG4pKTticmVha31jYXNlImVtIjp7Y29uc3QgbD1vO3IrPW4uZW0odGhpcy5wYXJzZUlubGluZShsLnRva2VucyxuKSk7YnJlYWt9Y2FzZSJjb2Rlc3BhbiI6e2NvbnN0IGw9bztyKz1uLmNvZGVzcGFuKGwudGV4dCk7YnJlYWt9Y2FzZSJiciI6e3IrPW4uYnIoKTticmVha31jYXNlImRlbCI6e2NvbnN0IGw9bztyKz1uLmRlbCh0aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zLG4pKTticmVha31jYXNlInRleHQiOntjb25zdCBsPW87cis9bi50ZXh0KGwudGV4dCk7YnJlYWt9ZGVmYXVsdDp7Y29uc3QgbD0nVG9rZW4gd2l0aCAiJytvLnR5cGUrJyIgdHlwZSB3YXMgbm90IGZvdW5kLic7aWYodGhpcy5vcHRpb25zLnNpbGVudClyZXR1cm4gY29uc29sZS5lcnJvcihsKSwiIjt0aHJvdyBuZXcgRXJyb3IobCl9fX1yZXR1cm4gcn19Y2xhc3MgRWF7Y29uc3RydWN0b3IodCl7SmUodGhpcywib3B0aW9ucyIpO3RoaXMub3B0aW9ucz10fHxsbH1wcmVwcm9jZXNzKHQpe3JldHVybiB0fXBvc3Rwcm9jZXNzKHQpe3JldHVybiB0fX1KZShFYSwicGFzc1Rocm91Z2hIb29rcyIsbmV3IFNldChbInByZXByb2Nlc3MiLCJwb3N0cHJvY2VzcyJdKSk7dmFyIGt1LEpwLG5mLHdTO2NsYXNzIGZSe2NvbnN0cnVjdG9yKC4uLnQpe25oKHRoaXMsa3UpO25oKHRoaXMsbmYpO0plKHRoaXMsImRlZmF1bHRzIixRZygpKTtKZSh0aGlzLCJvcHRpb25zIix0aGlzLnNldE9wdGlvbnMpO0plKHRoaXMsInBhcnNlIixHdSh0aGlzLGt1LEpwKS5jYWxsKHRoaXMsSXIubGV4LExyLnBhcnNlKSk7SmUodGhpcywicGFyc2VJbmxpbmUiLEd1KHRoaXMsa3UsSnApLmNhbGwodGhpcyxJci5sZXhJbmxpbmUsTHIucGFyc2VJbmxpbmUpKTtKZSh0aGlzLCJQYXJzZXIiLExyKTtKZSh0aGlzLCJSZW5kZXJlciIsRWQpO0plKHRoaXMsIlRleHRSZW5kZXJlciIsSmcpO0plKHRoaXMsIkxleGVyIixJcik7SmUodGhpcywiVG9rZW5pemVyIixTZCk7SmUodGhpcywiSG9va3MiLEVhKTt0aGlzLnVzZSguLi50KX13YWxrVG9rZW5zKHQsbil7dmFyIGksbztsZXQgcj1bXTtmb3IoY29uc3QgbCBvZiB0KXN3aXRjaChyPXIuY29uY2F0KG4uY2FsbCh0aGlzLGwpKSxsLnR5cGUpe2Nhc2UidGFibGUiOntjb25zdCBzPWw7Zm9yKGNvbnN0IGEgb2Ygcy5oZWFkZXIpcj1yLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoYS50b2tlbnMsbikpO2Zvcihjb25zdCBhIG9mIHMucm93cylmb3IoY29uc3QgdSBvZiBhKXI9ci5jb25jYXQodGhpcy53YWxrVG9rZW5zKHUudG9rZW5zLG4pKTticmVha31jYXNlImxpc3QiOntjb25zdCBzPWw7cj1yLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMocy5pdGVtcyxuKSk7YnJlYWt9ZGVmYXVsdDp7Y29uc3Qgcz1sOyhvPShpPXRoaXMuZGVmYXVsdHMuZXh0ZW5zaW9ucyk9PW51bGw/dm9pZCAwOmkuY2hpbGRUb2tlbnMpIT1udWxsJiZvW3MudHlwZV0/dGhpcy5kZWZhdWx0cy5leHRlbnNpb25zLmNoaWxkVG9rZW5zW3MudHlwZV0uZm9yRWFjaChhPT57cj1yLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoc1thXSxuKSl9KTpzLnRva2VucyYmKHI9ci5jb25jYXQodGhpcy53YWxrVG9rZW5zKHMudG9rZW5zLG4pKSl9fXJldHVybiByfXVzZSguLi50KXtjb25zdCBuPXRoaXMuZGVmYXVsdHMuZXh0ZW5zaW9uc3x8e3JlbmRlcmVyczp7fSxjaGlsZFRva2Vuczp7fX07cmV0dXJuIHQuZm9yRWFjaChyPT57Y29uc3QgaT17Li4ucn07aWYoaS5hc3luYz10aGlzLmRlZmF1bHRzLmFzeW5jfHxpLmFzeW5jfHwhMSxyLmV4dGVuc2lvbnMmJihyLmV4dGVuc2lvbnMuZm9yRWFjaChvPT57aWYoIW8ubmFtZSl0aHJvdyBuZXcgRXJyb3IoImV4dGVuc2lvbiBuYW1lIHJlcXVpcmVkIik7aWYoInJlbmRlcmVyImluIG8pe2NvbnN0IGw9bi5yZW5kZXJlcnNbby5uYW1lXTtsP24ucmVuZGVyZXJzW28ubmFtZV09ZnVuY3Rpb24oLi4ucyl7bGV0IGE9by5yZW5kZXJlci5hcHBseSh0aGlzLHMpO3JldHVybiBhPT09ITEmJihhPWwuYXBwbHkodGhpcyxzKSksYX06bi5yZW5kZXJlcnNbby5uYW1lXT1vLnJlbmRlcmVyfWlmKCJ0b2tlbml6ZXIiaW4gbyl7aWYoIW8ubGV2ZWx8fG8ubGV2ZWwhPT0iYmxvY2siJiZvLmxldmVsIT09ImlubGluZSIpdGhyb3cgbmV3IEVycm9yKCJleHRlbnNpb24gbGV2ZWwgbXVzdCBiZSAnYmxvY2snIG9yICdpbmxpbmUnIik7Y29uc3QgbD1uW28ubGV2ZWxdO2w/bC51bnNoaWZ0KG8udG9rZW5pemVyKTpuW28ubGV2ZWxdPVtvLnRva2VuaXplcl0sby5zdGFydCYmKG8ubGV2ZWw9PT0iYmxvY2siP24uc3RhcnRCbG9jaz9uLnN0YXJ0QmxvY2sucHVzaChvLnN0YXJ0KTpuLnN0YXJ0QmxvY2s9W28uc3RhcnRdOm8ubGV2ZWw9PT0iaW5saW5lIiYmKG4uc3RhcnRJbmxpbmU/bi5zdGFydElubGluZS5wdXNoKG8uc3RhcnQpOm4uc3RhcnRJbmxpbmU9W28uc3RhcnRdKSl9ImNoaWxkVG9rZW5zImluIG8mJm8uY2hpbGRUb2tlbnMmJihuLmNoaWxkVG9rZW5zW28ubmFtZV09by5jaGlsZFRva2Vucyl9KSxpLmV4dGVuc2lvbnM9biksci5yZW5kZXJlcil7Y29uc3Qgbz10aGlzLmRlZmF1bHRzLnJlbmRlcmVyfHxuZXcgRWQodGhpcy5kZWZhdWx0cyk7Zm9yKGNvbnN0IGwgaW4gci5yZW5kZXJlcil7Y29uc3Qgcz1yLnJlbmRlcmVyW2xdLGE9bCx1PW9bYV07b1thXT0oLi4uYyk9PntsZXQgZD1zLmFwcGx5KG8sYyk7cmV0dXJuIGQ9PT0hMSYmKGQ9dS5hcHBseShvLGMpKSxkfHwiIn19aS5yZW5kZXJlcj1vfWlmKHIudG9rZW5pemVyKXtjb25zdCBvPXRoaXMuZGVmYXVsdHMudG9rZW5pemVyfHxuZXcgU2QodGhpcy5kZWZhdWx0cyk7Zm9yKGNvbnN0IGwgaW4gci50b2tlbml6ZXIpe2NvbnN0IHM9ci50b2tlbml6ZXJbbF0sYT1sLHU9b1thXTtvW2FdPSguLi5jKT0+e2xldCBkPXMuYXBwbHkobyxjKTtyZXR1cm4gZD09PSExJiYoZD11LmFwcGx5KG8sYykpLGR9fWkudG9rZW5pemVyPW99aWYoci5ob29rcyl7Y29uc3Qgbz10aGlzLmRlZmF1bHRzLmhvb2tzfHxuZXcgRWE7Zm9yKGNvbnN0IGwgaW4gci5ob29rcyl7Y29uc3Qgcz1yLmhvb2tzW2xdLGE9bCx1PW9bYV07RWEucGFzc1Rocm91Z2hIb29rcy5oYXMobCk/b1thXT1jPT57aWYodGhpcy5kZWZhdWx0cy5hc3luYylyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHMuY2FsbChvLGMpKS50aGVuKGY9PnUuY2FsbChvLGYpKTtjb25zdCBkPXMuY2FsbChvLGMpO3JldHVybiB1LmNhbGwobyxkKX06b1thXT0oLi4uYyk9PntsZXQgZD1zLmFwcGx5KG8sYyk7cmV0dXJuIGQ9PT0hMSYmKGQ9dS5hcHBseShvLGMpKSxkfX1pLmhvb2tzPW99aWYoci53YWxrVG9rZW5zKXtjb25zdCBvPXRoaXMuZGVmYXVsdHMud2Fsa1Rva2VucyxsPXIud2Fsa1Rva2VucztpLndhbGtUb2tlbnM9ZnVuY3Rpb24ocyl7bGV0IGE9W107cmV0dXJuIGEucHVzaChsLmNhbGwodGhpcyxzKSksbyYmKGE9YS5jb25jYXQoby5jYWxsKHRoaXMscykpKSxhfX10aGlzLmRlZmF1bHRzPXsuLi50aGlzLmRlZmF1bHRzLC4uLml9fSksdGhpc31zZXRPcHRpb25zKHQpe3JldHVybiB0aGlzLmRlZmF1bHRzPXsuLi50aGlzLmRlZmF1bHRzLC4uLnR9LHRoaXN9bGV4ZXIodCxuKXtyZXR1cm4gSXIubGV4KHQsbj8/dGhpcy5kZWZhdWx0cyl9cGFyc2VyKHQsbil7cmV0dXJuIExyLnBhcnNlKHQsbj8/dGhpcy5kZWZhdWx0cyl9fWt1PW5ldyBXZWFrU2V0LEpwPWZ1bmN0aW9uKHQsbil7cmV0dXJuKHIsaSk9Pntjb25zdCBvPXsuLi5pfSxsPXsuLi50aGlzLmRlZmF1bHRzLC4uLm99O3RoaXMuZGVmYXVsdHMuYXN5bmM9PT0hMCYmby5hc3luYz09PSExJiYobC5zaWxlbnR8fGNvbnNvbGUud2FybigibWFya2VkKCk6IFRoZSBhc3luYyBvcHRpb24gd2FzIHNldCB0byB0cnVlIGJ5IGFuIGV4dGVuc2lvbi4gVGhlIGFzeW5jOiBmYWxzZSBvcHRpb24gc2VudCB0byBwYXJzZSB3aWxsIGJlIGlnbm9yZWQuIiksbC5hc3luYz0hMCk7Y29uc3Qgcz1HdSh0aGlzLG5mLHdTKS5jYWxsKHRoaXMsISFsLnNpbGVudCwhIWwuYXN5bmMpO2lmKHR5cGVvZiByPiJ1Inx8cj09PW51bGwpcmV0dXJuIHMobmV3IEVycm9yKCJtYXJrZWQoKTogaW5wdXQgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCBvciBudWxsIikpO2lmKHR5cGVvZiByIT0ic3RyaW5nIilyZXR1cm4gcyhuZXcgRXJyb3IoIm1hcmtlZCgpOiBpbnB1dCBwYXJhbWV0ZXIgaXMgb2YgdHlwZSAiK09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyKSsiLCBzdHJpbmcgZXhwZWN0ZWQiKSk7aWYobC5ob29rcyYmKGwuaG9va3Mub3B0aW9ucz1sKSxsLmFzeW5jKXJldHVybiBQcm9taXNlLnJlc29sdmUobC5ob29rcz9sLmhvb2tzLnByZXByb2Nlc3Mocik6cikudGhlbihhPT50KGEsbCkpLnRoZW4oYT0+bC53YWxrVG9rZW5zP1Byb21pc2UuYWxsKHRoaXMud2Fsa1Rva2VucyhhLGwud2Fsa1Rva2VucykpLnRoZW4oKCk9PmEpOmEpLnRoZW4oYT0+bihhLGwpKS50aGVuKGE9PmwuaG9va3M/bC5ob29rcy5wb3N0cHJvY2VzcyhhKTphKS5jYXRjaChzKTt0cnl7bC5ob29rcyYmKHI9bC5ob29rcy5wcmVwcm9jZXNzKHIpKTtjb25zdCBhPXQocixsKTtsLndhbGtUb2tlbnMmJnRoaXMud2Fsa1Rva2VucyhhLGwud2Fsa1Rva2Vucyk7bGV0IHU9bihhLGwpO3JldHVybiBsLmhvb2tzJiYodT1sLmhvb2tzLnBvc3Rwcm9jZXNzKHUpKSx1fWNhdGNoKGEpe3JldHVybiBzKGEpfX19LG5mPW5ldyBXZWFrU2V0LHdTPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHI9PntpZihyLm1lc3NhZ2UrPWAKUGxlYXNlIHJlcG9ydCB0aGlzIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZWRqcy9tYXJrZWQuYCx0KXtjb25zdCBpPSI8cD5BbiBlcnJvciBvY2N1cnJlZDo8L3A+PHByZT4iK01uKHIubWVzc2FnZSsiIiwhMCkrIjwvcHJlPiI7cmV0dXJuIG4/UHJvbWlzZS5yZXNvbHZlKGkpOml9aWYobilyZXR1cm4gUHJvbWlzZS5yZWplY3Qocik7dGhyb3cgcn19O2NvbnN0IEdvPW5ldyBmUjtmdW5jdGlvbiBIZShlLHQpe3JldHVybiBHby5wYXJzZShlLHQpfUhlLm9wdGlvbnM9SGUuc2V0T3B0aW9ucz1mdW5jdGlvbihlKXtyZXR1cm4gR28uc2V0T3B0aW9ucyhlKSxIZS5kZWZhdWx0cz1Hby5kZWZhdWx0cyx5UyhIZS5kZWZhdWx0cyksSGV9O0hlLmdldERlZmF1bHRzPVFnO0hlLmRlZmF1bHRzPWxsO0hlLnVzZT1mdW5jdGlvbiguLi5lKXtyZXR1cm4gR28udXNlKC4uLmUpLEhlLmRlZmF1bHRzPUdvLmRlZmF1bHRzLHlTKEhlLmRlZmF1bHRzKSxIZX07SGUud2Fsa1Rva2Vucz1mdW5jdGlvbihlLHQpe3JldHVybiBHby53YWxrVG9rZW5zKGUsdCl9O0hlLnBhcnNlSW5saW5lPUdvLnBhcnNlSW5saW5lO0hlLlBhcnNlcj1McjtIZS5wYXJzZXI9THIucGFyc2U7SGUuUmVuZGVyZXI9RWQ7SGUuVGV4dFJlbmRlcmVyPUpnO0hlLkxleGVyPUlyO0hlLmxleGVyPUlyLmxleDtIZS5Ub2tlbml6ZXI9U2Q7SGUuSG9va3M9RWE7SGUucGFyc2U9SGU7SGUub3B0aW9ucztIZS5zZXRPcHRpb25zO0hlLnVzZTtIZS53YWxrVG9rZW5zO0hlLnBhcnNlSW5saW5lO0xyLnBhcnNlO2NvbnN0IGhSPUlyLmxleDtmdW5jdGlvbiBwUihlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlfWZ1bmN0aW9uIG1SKGUsdCl7dmFyIG49ZT09bnVsbD9udWxsOnR5cGVvZiBTeW1ib2w8InUiJiZlW1N5bWJvbC5pdGVyYXRvcl18fGVbIkBAaXRlcmF0b3IiXTtpZihuIT1udWxsKXt2YXIgcixpLG8sbCxzPVtdLGE9ITAsdT0hMTt0cnl7aWYobz0obj1uLmNhbGwoZSkpLm5leHQsdD09PTApe2lmKE9iamVjdChuKSE9PW4pcmV0dXJuO2E9ITF9ZWxzZSBmb3IoOyEoYT0ocj1vLmNhbGwobikpLmRvbmUpJiYocy5wdXNoKHIudmFsdWUpLHMubGVuZ3RoIT09dCk7YT0hMCk7fWNhdGNoKGMpe3U9ITAsaT1jfWZpbmFsbHl7dHJ5e2lmKCFhJiZuLnJldHVybiE9bnVsbCYmKGw9bi5yZXR1cm4oKSxPYmplY3QobCkhPT1sKSlyZXR1cm59ZmluYWxseXtpZih1KXRocm93IGl9fXJldHVybiBzfX1mdW5jdGlvbiBxcChlLHQpeyh0PT1udWxsfHx0PmUubGVuZ3RoKSYmKHQ9ZS5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KHQpO248dDtuKyspcltuXT1lW25dO3JldHVybiByfWZ1bmN0aW9uIHFnKGUsdCl7aWYoZSl7aWYodHlwZW9mIGU9PSJzdHJpbmciKXJldHVybiBxcChlLHQpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKTtpZihuPT09Ik9iamVjdCImJmUuY29uc3RydWN0b3ImJihuPWUuY29uc3RydWN0b3IubmFtZSksbj09PSJNYXAifHxuPT09IlNldCIpcmV0dXJuIEFycmF5LmZyb20oZSk7aWYobj09PSJBcmd1bWVudHMifHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSlyZXR1cm4gcXAoZSx0KX19ZnVuY3Rpb24gZ1IoKXt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9ZnVuY3Rpb24gdlIoZSx0KXtyZXR1cm4gcFIoZSl8fG1SKGUsdCl8fHFnKGUsdCl8fGdSKCl9ZnVuY3Rpb24geVIoZSx0KXtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsKXJldHVybiBlO3ZhciBuPWVbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZihuIT09dm9pZCAwKXt2YXIgcj1uLmNhbGwoZSx0fHwiZGVmYXVsdCIpO2lmKHR5cGVvZiByIT0ib2JqZWN0IilyZXR1cm4gcjt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybih0PT09InN0cmluZyI/U3RyaW5nOk51bWJlcikoZSl9ZnVuY3Rpb24geFIoZSl7dmFyIHQ9eVIoZSwic3RyaW5nIik7cmV0dXJuIHR5cGVvZiB0PT0ic3ltYm9sIj90OlN0cmluZyh0KX1mdW5jdGlvbiBxdChlLHQsbil7cmV0dXJuIHQ9eFIodCksdCBpbiBlP09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTplW3RdPW4sZX1mdW5jdGlvbiBfUihlLHQpe3ZhciBuPXR5cGVvZiBTeW1ib2w8InUiJiZlW1N5bWJvbC5pdGVyYXRvcl18fGVbIkBAaXRlcmF0b3IiXTtpZighbil7aWYoQXJyYXkuaXNBcnJheShlKXx8KG49cWcoZSkpfHx0JiZlJiZ0eXBlb2YgZS5sZW5ndGg9PSJudW1iZXIiKXtuJiYoZT1uKTt2YXIgcj0wLGk9ZnVuY3Rpb24oKXt9O3JldHVybntzOmksbjpmdW5jdGlvbigpe3JldHVybiByPj1lLmxlbmd0aD97ZG9uZTohMH06e2RvbmU6ITEsdmFsdWU6ZVtyKytdfX0sZTpmdW5jdGlvbihhKXt0aHJvdyBhfSxmOml9fXRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS4KSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLmApfXZhciBvPSEwLGw9ITEscztyZXR1cm57czpmdW5jdGlvbigpe249bi5jYWxsKGUpfSxuOmZ1bmN0aW9uKCl7dmFyIGE9bi5uZXh0KCk7cmV0dXJuIG89YS5kb25lLGF9LGU6ZnVuY3Rpb24oYSl7bD0hMCxzPWF9LGY6ZnVuY3Rpb24oKXt0cnl7IW8mJm4ucmV0dXJuIT1udWxsJiZuLnJldHVybigpfWZpbmFsbHl7aWYobCl0aHJvdyBzfX19fWZ1bmN0aW9uIHdSKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIHFwKGUpfWZ1bmN0aW9uIFNSKGUpe2lmKHR5cGVvZiBTeW1ib2w8InUiJiZlW1N5bWJvbC5pdGVyYXRvcl0hPW51bGx8fGVbIkBAaXRlcmF0b3IiXSE9bnVsbClyZXR1cm4gQXJyYXkuZnJvbShlKX1mdW5jdGlvbiBFUigpe3Rocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9ZnVuY3Rpb24gZW0oZSl7cmV0dXJuIHdSKGUpfHxTUihlKXx8cWcoZSl8fEVSKCl9dmFyIENSPS9eZGF0YTooaW1hZ2VcLyhwbmd8anBlZ3xqcGd8Z2lmfHdlYnB8Ym1wfHRpZmZ8aWNvfHN2Z1wreG1sKSk7YmFzZTY0LC87ZnVuY3Rpb24gZXYoZSl7dmFyIHQ9Q1IuZXhlYyhlKTtpZih0JiZ0WzFdKXJldHVybiB0WzFdfWZ1bmN0aW9uIHR2KGUpe3JldHVybiBlPT09ImltYWdlL3N2Zyt4bWwiPyJzdmciOmU9PT0iaW1hZ2Uvdm5kLm1pY3Jvc29mdC5pY29uIj8iaWNvIjplLnN0YXJ0c1dpdGgoImltYWdlLyIpP2Uuc2xpY2UoNik6ZX12YXIga1I9L15oKFtcZCtdKSQvO2Z1bmN0aW9uICRSKGUpe3ZhciB0PWUuY2hpbGRyZW4ubWFwKGJSKTtyZXR1cm4gVFIodCl9ZnVuY3Rpb24gYlIoZSl7aWYoZS50eXBlPT09ImhlYWRpbmciKXt2YXIgdCxuPSIiLHI9TnVtYmVyKCh0PWUudGFnLm1hdGNoKGtSKSk9PT1udWxsfHx0PT09dm9pZCAwP3ZvaWQgMDp0WzFdKTtpZihOdW1iZXIuaXNOYU4ocikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGhlYWRlciBkZXB0aCIpO2Zvcih2YXIgaT0wO2k8TnVtYmVyKHIpO2krKyluKz0iIyI7dmFyIG89WyIiLmNvbmNhdChuLCIgIildO3JldHVybnt0eXBlOiJibG9jayIsY2hpbGRyZW46by5jb25jYXQuYXBwbHkobyxlbShlLmNoaWxkcmVuLm1hcCh0bSkpKX19ZWxzZXtpZihlLnR5cGU9PT0icGFyYWdyYXBoIilyZXR1cm4gZS5jaGlsZHJlbi5sZW5ndGg9PT0wP3t0eXBlOiJibG9jayIsY2hpbGRyZW46WyI8YnIgLz4iXX06e3R5cGU6ImJsb2NrIixjaGlsZHJlbjplLmNoaWxkcmVuLm1hcChmdW5jdGlvbihzKXtyZXR1cm4gdG0ocyl9KX07aWYoZS50eXBlPT09Imxpc3QiKXJldHVybnt0eXBlOiJibG9jayIsY2hpbGRyZW46ZS5jaGlsZHJlbi5mbGF0TWFwKGZ1bmN0aW9uKHMsYSl7cmV0dXJuIEVTKENTKGUpLHMsMCxhPT09MCl9KX07dmFyIGw9ZTt0aHJvdyBuZXcgRXJyb3IoIlVuaGFuZGxlZCBub2RlIHR5cGU6ICIuY29uY2F0KCJ0eXBlImluIGw/ImV4aGF1c3RpdmVDaGVjay50eXBlIjoidW5rbm93biIpKX19ZnVuY3Rpb24gVFIoZSl7Zm9yKHZhciB0PVtgCmBdLG49W10scj17fSxpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV0sbD1fUihvLmNoaWxkcmVuKSxzO3RyeXtmb3IobC5zKCk7IShzPWwubigpKS5kb25lOyl7dmFyIGE9cy52YWx1ZTtpZih0eXBlb2YgYT09InN0cmluZyIpdFt0Lmxlbmd0aC0xXSs9YTtlbHNle2lmKGEudHlwZT09PSJpbWFnZSIpbi5wdXNoKFBSKGEscikpO2Vsc2UgaWYoYS50eXBlPT09ImxpbmsiKW4ucHVzaChNUihhKSk7ZWxzZXt2YXIgdT1hO3Rocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCBub2RlIHR5cGU6ICIuY29uY2F0KEpTT04uc3RyaW5naWZ5KHUsbnVsbCwyKSkpfXQucHVzaCgiIil9fX1jYXRjaChjKXtsLmUoYyl9ZmluYWxseXtsLmYoKX1pPT09ZS5sZW5ndGgtMT90W3QubGVuZ3RoLTFdKz1gCmA6dFt0Lmxlbmd0aC0xXSs9YAoKYH1yZXR1cm4gcXQocXQocXQocXQoe30sbm4sInJpY2h0ZXh0IiksInRlbXBsYXRlU3RyaW5ncyIsdCksImV4cHJzIixuKSwiZmlsZXMiLHIpfWZ1bmN0aW9uIFNTKGUpe3ZhciB0PXR5cGVvZiBlLmZvcm1hdD09Im51bWJlciI/UlIoZS5mb3JtYXQpOltdLG49ZS50ZXh0LnRyaW1TdGFydCgpLHI9ZS50ZXh0Lmxlbmd0aC1uLmxlbmd0aDtuPW4udHJpbUVuZCgpO3ZhciBpPWUudGV4dC5sZW5ndGgtbi5sZW5ndGgtcjtyZXR1cm4gdC5pbmNsdWRlcygiYm9sZCIpJiZ0LmluY2x1ZGVzKCJpdGFsaWMiKT9uPSIqKioiLmNvbmNhdChuLCIqKioiKTp0LmluY2x1ZGVzKCJib2xkIik/bj0iKioiLmNvbmNhdChuLCIqKiIpOnQuaW5jbHVkZXMoIml0YWxpYyIpJiYobj0iXyIuY29uY2F0KG4sIl8iKSksdC5pbmNsdWRlcygibGluZS10aHJvdWdoIikmJihuPSJ+fiIuY29uY2F0KG4sIn5+IikpLCIiLmNvbmNhdCgiICIucmVwZWF0KHIpKS5jb25jYXQobikuY29uY2F0KCIgIi5yZXBlYXQoaSkpfWZ1bmN0aW9uIHRtKGUpe3JldHVybiBlLnR5cGU9PT0idGV4dCI/U1MoZSk6ZS50eXBlPT09ImxpbmVicmVhayI/YApgOmV9ZnVuY3Rpb24gRVMoZSx0LG4pe3ZhciByLGk9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLG89aT8iIjpgCmAsbD1bIiIuY29uY2F0KG8pLmNvbmNhdCgiICIucmVwZWF0KG4pKS5jb25jYXQoZSldO3JldHVybigocj10LmNoaWxkcmVuKT09PW51bGx8fHI9PT12b2lkIDB8fChyPXJbMF0pPT09bnVsbHx8cj09PXZvaWQgMD92b2lkIDA6ci50eXBlKSE9PSJsaXN0IiYmbC5wdXNoKCIgIiksbC5jb25jYXQodC5jaGlsZHJlbi5mbGF0TWFwKGZ1bmN0aW9uKHMpe3JldHVybiBzLnR5cGU9PT0ibGlzdCI/cy5jaGlsZHJlbi5mbGF0TWFwKGZ1bmN0aW9uKGEpe3JldHVybiBFUyhDUyhzKSxhLG4rNCl9KTpbdG0ocyldfSkpfWZ1bmN0aW9uIENTKGUpe2lmKGUubGlzdFR5cGU9PT0iYnVsbGV0IilyZXR1cm4iLSI7aWYoZS5saXN0VHlwZT09PSJudW1iZXIiKXJldHVybiIxLiI7dGhyb3cgbmV3IEVycm9yKCJVbmhhbmRsZWQgbGlzdCB0eXBlOiAiLmNvbmNhdChlLmxpc3RUeXBlKSl9dmFyIE5SPXtib2xkOjEsaXRhbGljOjIsImxpbmUtdGhyb3VnaCI6NH07ZnVuY3Rpb24gUlIoZSl7cmV0dXJuIE9iamVjdC5lbnRyaWVzKE5SKS5mbGF0TWFwKGZ1bmN0aW9uKHQpe3ZhciBuPXZSKHQsMikscj1uWzBdLGk9blsxXTtyZXR1cm4oaSZlKT09PWk/W3JdOltdfSl9dmFyIE9SPW5ldyBUZXh0RW5jb2RlcjtmdW5jdGlvbiBQUihlLHQpe2lmKGUuc3JjLnN0YXJ0c1dpdGgoImRhdGE6Iikpe3ZhciBuPWpuLmdldFNIQTI1Nkhhc2goT1IuZW5jb2RlKGUuc3JjKSkscj1ldihlLnNyYyk7aWYocj09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoIkNvdWxkIG5vdCBkZXRlY3QgTWltZSBUeXBlIGZvciBpbWFnZTogIi5jb25jYXQoZS5zcmMpKTt2YXIgaT10dihyKSxvPSIvcHVibGljLyIuY29uY2F0KG4sIi4iKS5jb25jYXQoaSk7cmV0dXJuIHRbb109ZS5zcmMscXQocXQocXQoe30sbm4sImZpbGUiKSxSbixvKSwibWV0YWRhdGEiLHt3aWR0aDplLndpZHRofHwwLGhlaWdodDplLmhlaWdodHx8MCxzaGEyNTY6bnx8IiJ9KX1lbHNle3ZhciBsPUFSKCJzaGEyNTYiLGUuc3JjKTtyZXR1cm4gcXQocXQocXQoe30sbm4sImZpbGUiKSxSbiwiL3B1YmxpYyIuY29uY2F0KGUuc3JjLnNwbGl0KCI/IilbMF0pKSwibWV0YWRhdGEiLHt3aWR0aDplLndpZHRofHwwLGhlaWdodDplLmhlaWdodHx8MCxzaGEyNTY6bHx8IiJ9KX19ZnVuY3Rpb24gQVIoZSx0KXt2YXIgbj10LnNwbGl0KCI/Iik7aWYoIShuLmxlbmd0aDwyKSl7dmFyIHI9blsxXSxpPW5ldyBVUkxTZWFyY2hQYXJhbXMocik7aWYoaS5oYXMoZSkpcmV0dXJuIGkuZ2V0KGUpfX1mdW5jdGlvbiBNUihlKXtyZXR1cm4gcXQocXQocXQoe30sbm4sImxpbmsiKSwiaHJlZiIsZS51cmwpLCJjaGlsZHJlbiIsZS5jaGlsZHJlbi5tYXAoU1MpKX1mdW5jdGlvbiBQMChlLHQpe3ZhciBuPU9iamVjdC5rZXlzKGUpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7dCYmKHI9ci5maWx0ZXIoZnVuY3Rpb24oaSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxpKS5lbnVtZXJhYmxlfSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIGx0KGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XSE9bnVsbD9hcmd1bWVudHNbdF06e307dCUyP1AwKE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbihyKXtxdChlLHIsbltyXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpQMChPYmplY3QobikpLmZvckVhY2goZnVuY3Rpb24ocil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUscixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4scikpfSl9cmV0dXJuIGV9dmFyICRyPXt2ZXJzaW9uOjEsZm9ybWF0OiIiLGluZGVudDowLGRpcmVjdGlvbjpudWxsfTtmdW5jdGlvbiBDcyhlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7aWYodHlwZW9mIGU9PSJzdHJpbmciKXJldHVybiBsdChsdCh7fSwkcikse30se3R5cGU6InRleHQiLGZvcm1hdDoiIix0ZXh0OmV9KTtpZigidGFnImluIGUpc3dpdGNoKGUudGFnKXtjYXNlImgxIjpyZXR1cm4gbWwoZSk7Y2FzZSJoMiI6cmV0dXJuIG1sKGUpO2Nhc2UiaDMiOnJldHVybiBtbChlKTtjYXNlImg0IjpyZXR1cm4gbWwoZSk7Y2FzZSJoNSI6cmV0dXJuIG1sKGUpO2Nhc2UiaDYiOnJldHVybiBtbChlKTtjYXNlImxpIjpyZXR1cm4gRlIoZSk7Y2FzZSJwIjpyZXR1cm4galIoZSk7Y2FzZSJ1bCI6cmV0dXJuIEEwKGUpO2Nhc2Uib2wiOnJldHVybiBBMChlKTtjYXNlInNwYW4iOnJldHVybiBrUyhlKTtjYXNlImEiOnJldHVybiBJUihlKTtjYXNlImltZyI6cmV0dXJuIERSKGUpO2Nhc2UiYnIiOnJldHVybiB0P2x0KGx0KHt9LCRyKSx7fSx7dHlwZToibGluZWJyZWFrIn0pOnpSKCk7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBub2RlIHRhZzogIitKU09OLnN0cmluZ2lmeShlLG51bGwsMikpfWVsc2UgdGhyb3cgRXJyb3IoIlVuZXhwZWN0ZWQgbm9kZTogIitKU09OLnN0cmluZ2lmeShlLG51bGwsMikpfWZ1bmN0aW9uIERSKGUpe3ZhciB0PWUuc3JjO3JldHVybiBsdChsdCh7fSwkcikse30se3R5cGU6ImltYWdlIixzcmM6dCx3aWR0aDplLndpZHRoLGhlaWdodDplLmhlaWdodH0pfWZ1bmN0aW9uIElSKGUpe3JldHVybiBsdChsdCh7fSwkcikse30se3R5cGU6ImxpbmsiLHVybDplLmhyZWYsY2hpbGRyZW46ZS5jaGlsZHJlbi5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIENzKHQpfSl9KX1mdW5jdGlvbiBMUihlKXtyZXR1cm4gbHQobHQoe30sJHIpLHt9LHtmb3JtYXQ6IiIsdHlwZToicm9vdCIsY2hpbGRyZW46ZS5jaGlsZHJlbi5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIENzKHQpfSl9KX1mdW5jdGlvbiBtbChlKXtyZXR1cm4gbHQobHQoe30sJHIpLHt9LHt0eXBlOiJoZWFkaW5nIix0YWc6ZS50YWcsY2hpbGRyZW46ZS5jaGlsZHJlbi5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIENzKHQpfSl9KX1mdW5jdGlvbiBqUihlKXtyZXR1cm4gbHQobHQoe30sJHIpLHt9LHt0eXBlOiJwYXJhZ3JhcGgiLGNoaWxkcmVuOmUuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBDcyh0LCEwKX0pfSl9ZnVuY3Rpb24gelIoKXtyZXR1cm4gbHQobHQoe30sJHIpLHt9LHt0eXBlOiJwYXJhZ3JhcGgiLGNoaWxkcmVuOltdfSl9ZnVuY3Rpb24gRlIoZSl7cmV0dXJuIGx0KGx0KHt9LCRyKSx7fSx7dHlwZToibGlzdGl0ZW0iLGNoaWxkcmVuOmUuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBDcyh0LCEwKX0pfSl9ZnVuY3Rpb24gQTAoZSl7cmV0dXJuIGx0KGx0KHt9LCRyKSx7fSx7dHlwZToibGlzdCIsbGlzdFR5cGU6ZS50YWc9PT0ib2wiPyJudW1iZXIiOiJidWxsZXQiLGNoaWxkcmVuOmUuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBDcyh0KX0pfSxlLmRpcj97ZGlyZWN0aW9uOmUuZGlyfTp7ZGlyZWN0aW9uOm51bGx9KX12YXIgQlI9e2JvbGQ6MSxpdGFsaWM6MiwibGluZS10aHJvdWdoIjo0fTtmdW5jdGlvbiBVUihlKXtyZXR1cm4gZS5yZWR1Y2UoZnVuY3Rpb24odCxuKXtyZXR1cm4gdHxCUltuXX0sMCl9ZnVuY3Rpb24ga1MoZSl7dmFyIHQ9ZS5jaGlsZHJlblswXTtyZXR1cm4gdHlwZW9mIHQ9PSJzdHJpbmciP2x0KGx0KHt9LCRyKSx7fSx7dHlwZToidGV4dCIsdGV4dDp0LGZvcm1hdDpVUihlLmNsYXNzZXMpfSk6a1MobHQobHQoe30sdCkse30se2NsYXNzZXM6ZS5jbGFzc2VzLmNvbmNhdCh0LmNsYXNzZXMpfSkpfXZhciBDZD0nPHZhbCB2YWx1ZT0iJyxubT0nIj4nLHJtPSI8L3ZhbD4iO2Z1bmN0aW9uIHByKGUsdCxuKXtmb3IodmFyIHI9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLGk9W10sbz1mdW5jdGlvbigpe3ZhciBhPWVbbl07aWYoYS50eXBlPT09ImhlYWRpbmciKWkucHVzaCh7dGFnOiJoIi5jb25jYXQoYS5kZXB0aCksY2hpbGRyZW46cHIoYS50b2tlbnM/YS50b2tlbnM6W10sdCwwKS5jaGlsZHJlbn0pO2Vsc2UgaWYoYS50eXBlPT09InBhcmFncmFwaCIpaS5wdXNoKHt0YWc6InAiLGNoaWxkcmVuOnByKGEudG9rZW5zP2EudG9rZW5zOltdLHQsMCkuY2hpbGRyZW59KTtlbHNlIGlmKGEudHlwZT09PSJzdHJvbmciKWkucHVzaCh7dGFnOiJzcGFuIixjbGFzc2VzOlsiYm9sZCJdLGNoaWxkcmVuOnByKGEudG9rZW5zP2EudG9rZW5zOltdLHQsMCkuY2hpbGRyZW59KTtlbHNlIGlmKGEudHlwZT09PSJlbSIpaS5wdXNoKHt0YWc6InNwYW4iLGNsYXNzZXM6WyJpdGFsaWMiXSxjaGlsZHJlbjpwcihhLnRva2Vucz9hLnRva2VuczpbXSx0LDApLmNoaWxkcmVufSk7ZWxzZSBpZihhLnR5cGU9PT0iZGVsIilpLnB1c2goe3RhZzoic3BhbiIsY2xhc3NlczpbImxpbmUtdGhyb3VnaCJdLGNoaWxkcmVuOnByKGEudG9rZW5zP2EudG9rZW5zOltdLHQsMCkuY2hpbGRyZW59KTtlbHNlIGlmKGEudHlwZT09PSJ0ZXh0IilpZigidG9rZW5zImluIGEmJkFycmF5LmlzQXJyYXkoYS50b2tlbnMpKWkucHVzaC5hcHBseShpLGVtKHByKGEudG9rZW5zLHQsbixyKS5jaGlsZHJlbikpO2Vsc2UgaWYociYmdHlwZW9mIGEucmF3PT0ic3RyaW5nIil7dmFyIHU9YS5yYXcuc3BsaXQoYApgKSxjPXUuZmxhdE1hcChmdW5jdGlvbih3LEUpe3JldHVybiBFPT09dS5sZW5ndGgtMT9bd106W3cse3RhZzoiYnIiLGNoaWxkcmVuOltdfV19KTtpLnB1c2guYXBwbHkoaSxlbShjKSl9ZWxzZSBpLnB1c2goYS5yYXcpO2Vsc2UgaWYoYS50eXBlPT09Imxpc3QiKWkucHVzaCh7dGFnOmEub3JkZXJlZD8ib2wiOiJ1bCIsY2hpbGRyZW46cHIoYS5pdGVtcyx0LDApLmNoaWxkcmVufSk7ZWxzZSBpZihhLnR5cGU9PT0ibGlzdF9pdGVtIilpLnB1c2goe3RhZzoibGkiLGNoaWxkcmVuOnByKGEudG9rZW5zP2EudG9rZW5zOltdLHQsMCwhMCkuY2hpbGRyZW59KTtlbHNlIGlmKGEudHlwZSE9PSJzcGFjZSIpaWYoYS50eXBlPT09Imh0bWwiKXtpZihhLnRleHQ9PT1ybSlyZXR1cm57djp7Y2hpbGRyZW46aSxjdXJzb3I6bn19O3ZhciBkPWEudGV4dC5pbmRleE9mKG5tKTtpZihhLnRleHQuc3RhcnRzV2l0aChDZCkmJmQ+LTEpe3ZhciBmPU51bWJlcihhLnRleHQuc2xpY2UoQ2QubGVuZ3RoLGQpKTtpZihOdW1iZXIuaXNOYU4oZikpdGhyb3cgRXJyb3IoIklsbGVnYWwgdmFsIGludGVybWVkaWF0ZSBub2RlOiAiLmNvbmNhdChKU09OLnN0cmluZ2lmeShhKSkpO3ZhciBoPXByKGUubWFwKGZ1bmN0aW9uKHcpe3JldHVybiB3LnR5cGU9PT0ibGluayJ8fHcudHlwZT09PSJsaXN0Ij97dHlwZToidGV4dCIscmF3OncucmF3LHRleHQ6dy5yYXd9Ond9KSx0LG4rMSksbT1oLmNoaWxkcmVuLGc9aC5jdXJzb3IsUz10W2ZdO2lmKFMuX3R5cGU9PT0ibGluayIpaS5wdXNoKHt0YWc6ImEiLGhyZWY6Uy5ocmVmLGNoaWxkcmVuOm19KTtlbHNlIGlmKFMuX3R5cGU9PT0iZmlsZSIpe3ZhciB2LHk7aS5wdXNoKHt0YWc6ImltZyIsc3JjOmpuLmNvbnZlcnRGaWxlU291cmNlKFMpLnVybCx3aWR0aDoodj1TLm1ldGFkYXRhKT09PW51bGx8fHY9PT12b2lkIDA/dm9pZCAwOnYud2lkdGgsaGVpZ2h0Oih5PVMubWV0YWRhdGEpPT09bnVsbHx8eT09PXZvaWQgMD92b2lkIDA6eS5oZWlnaHQsY2hpbGRyZW46W119KX1uPWd9dmFyIF89LzxiclxzKlwvPz4vZ2k7YS50ZXh0LnRyaW0oKS5tYXRjaChfKSYmaS5wdXNoKHt0YWc6ImJyIixjaGlsZHJlbjpbXX0pfWVsc2UgYS50eXBlPT09ImxpbmsiP2EucmF3PT09YS5ocmVmP2kucHVzaChhLnJhdyk6aS5wdXNoKHt0YWc6ImEiLGhyZWY6YS5ocmVmLGNoaWxkcmVuOnByKGEudG9rZW5zP2EudG9rZW5zOltdLHQsMCkuY2hpbGRyZW59KTphLnR5cGU9PT0iYnIiP2kucHVzaCh7dGFnOiJiciIsY2hpbGRyZW46W119KTpjb25zb2xlLmVycm9yKCJDb3VsZCBub3QgcGFyc2UgbWFya2Rvd246IHVuc3VwcG9ydGVkIHRva2VuIHR5cGU6ICIuY29uY2F0KGEudHlwZSwiLiBGb3VuZDogIikuY29uY2F0KGEucmF3KSk7bisrfSxsO248ZS5sZW5ndGg7KWlmKGw9bygpLGwpcmV0dXJuIGwudjtyZXR1cm57Y2hpbGRyZW46aSxjdXJzb3I6bn19ZnVuY3Rpb24gJFMoZSl7dmFyIHQ9ZS50ZW1wbGF0ZVN0cmluZ3Msbj1lLmV4cHJzLHI9dC5mbGF0TWFwKGZ1bmN0aW9uKGEsdSl7dmFyIGM9blt1XTtyZXR1cm4gYz9jW25uXT09PSJsaW5rIj9hLmNvbmNhdCgiIi5jb25jYXQoQ2QpLmNvbmNhdCh1KS5jb25jYXQobm0pLmNvbmNhdChjLmNoaWxkcmVuWzBdKS5jb25jYXQocm0pKTphLmNvbmNhdCgiIi5jb25jYXQoQ2QpLmNvbmNhdCh1KS5jb25jYXQobm0pLmNvbmNhdChybSkpOmF9KS5qb2luKCIiKSxpPWhSKHIse2dmbTohMH0pLG89cHIoaSxuLDApLGw9by5jaGlsZHJlbixzPW8uY3Vyc29yO2lmKHMhPT1pLmxlbmd0aCl0aHJvdyBFcnJvcigiVW5leHBlY3RlZGx5IHRlcm1pbmF0ZWQgbWFya2Rvd24gcGFyc2luZy4gUG9zc2libGUgcmVhc29uOiB1bmNsb3NlZCBodG1sIHRhZz8iKTtyZXR1cm4gcXQocXQoe30sbm4sInJpY2h0ZXh0IiksImNoaWxkcmVuIixsKX12YXIgd249e30sST17fTtsZXQgQ2Y9e30sYlM9e30scWE9e30sQ2E9e30saW09e30sR2w9e30sbnY9e30sb209e30sZXU9e30sdHU9e30sVWk9e30scnY9e30saXY9e30sVFM9e30sTlM9e30sUlM9e30sT1M9e30sUFM9e30sQVM9e30sTVM9e30sa2Q9e30sRFM9e30sSVM9e30sTFM9e30salM9e30selM9e30sRlM9e30sQlM9e30sVVM9e30sV1M9e30sb3Y9e30sbHY9e30sbG09e30sVlM9e30sSFM9e30sS1M9e307ZnVuY3Rpb24gSChlKXtsZXQgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3QuYXBwZW5kKCJjb2RlIixlKTtmb3IobGV0IG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXQuYXBwZW5kKCJ2Iixhcmd1bWVudHNbbl0pO3Rocm93IEVycm9yKGBNaW5pZmllZCBMZXhpY2FsIGVycm9yICMke2V9OyB2aXNpdCBodHRwczovL2xleGljYWwuZGV2L2RvY3MvZXJyb3I/JHt0fSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuYCl9bGV0IHdpPXR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PCJ1IixXUj13aSYmImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudD9kb2N1bWVudC5kb2N1bWVudE1vZGU6bnVsbCxRdD13aSYmL01hY3xpUG9kfGlQaG9uZXxpUGFkLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSkscm89d2kmJi9eKD8hLipTZWFtb25rZXkpKD89LipGaXJlZm94KS4qL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSwkZD13aSYmIklucHV0RXZlbnQiaW4gd2luZG93JiYhV1I/ImdldFRhcmdldFJhbmdlcyJpbiBuZXcgd2luZG93LklucHV0RXZlbnQoImlucHV0Iik6ITEsc3Y9d2kmJi9WZXJzaW9uXC9bXGQuXSsuKlNhZmFyaS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxrZj13aSYmL2lQYWR8aVBob25lfGlQb2QvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiF3aW5kb3cuTVNTdHJlYW0sVlI9d2kmJi9eKD89LipDaHJvbWUpLiovaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGF2PXdpJiYvQXBwbGVXZWJLaXRcL1tcZC5dKy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmIVZSLCRmPXN2fHxrZnx8YXY/IsKgIjoi4oCLIixIUj1ybz8iwqAiOiRmLEtSPS9eW15BLVphLXpcdTAwYzAtXHUwMGQ2XHUwMGQ4LVx1MDBmNlx1MDBmOC1cdTAyYjhcdTAzMDAtXHUwNTkwXHUwODAwLVx1MWZmZlx1MjAwZVx1MmMwMC1cdWZiMWNcdWZlMDAtXHVmZTZmXHVmZWZkLVx1ZmZmZl0qW1x1MDU5MS1cdTA3ZmZcdWZiMWQtXHVmZGZkXHVmZTcwLVx1ZmVmY10vLFpSPS9eW15cdTA1OTEtXHUwN2ZmXHVmYjFkLVx1ZmRmZFx1ZmU3MC1cdWZlZmNdKltBLVphLXpcdTAwYzAtXHUwMGQ2XHUwMGQ4LVx1MDBmNlx1MDBmOC1cdTAyYjhcdTAzMDAtXHUwNTkwXHUwODAwLVx1MWZmZlx1MjAwZVx1MmMwMC1cdWZiMWNcdWZlMDAtXHVmZTZmXHVmZWZkLVx1ZmZmZl0vLHpvPXtib2xkOjEsY29kZToxNixoaWdobGlnaHQ6MTI4LGl0YWxpYzoyLHN0cmlrZXRocm91Z2g6NCxzdWJzY3JpcHQ6MzIsc3VwZXJzY3JpcHQ6NjQsdW5kZXJsaW5lOjh9LEdSPXtkaXJlY3Rpb25sZXNzOjEsdW5tZXJnZWFibGU6Mn0sTTA9e2NlbnRlcjoyLGVuZDo2LGp1c3RpZnk6NCxsZWZ0OjEscmlnaHQ6MyxzdGFydDo1fSxZUj17MjoiY2VudGVyIiw2OiJlbmQiLDQ6Imp1c3RpZnkiLDE6ImxlZnQiLDM6InJpZ2h0Iiw1OiJzdGFydCJ9LFhSPXtub3JtYWw6MCxzZWdtZW50ZWQ6Mix0b2tlbjoxfSxRUj17MDoibm9ybWFsIiwyOiJzZWdtZW50ZWQiLDE6InRva2VuIn0sc209ITEsdXY9MDtmdW5jdGlvbiBKUihlKXt1dj1lLnRpbWVTdGFtcH1mdW5jdGlvbiBOaChlLHQsbil7cmV0dXJuIHQuX19sZXhpY2FsTGluZUJyZWFrPT09ZXx8ZVtgX19sZXhpY2FsS2V5XyR7bi5fa2V5fWBdIT09dm9pZCAwfWZ1bmN0aW9uIHFSKGUpe3JldHVybiBlLmdldEVkaXRvclN0YXRlKCkucmVhZCgoKT0+e2xldCB0PXJ0KCk7cmV0dXJuIHQhPT1udWxsP3QuY2xvbmUoKTpudWxsfSl9ZnVuY3Rpb24gWlMoZSx0LG4pe3NtPSEwO2xldCByPTEwMDxwZXJmb3JtYW5jZS5ub3coKS11djt0cnl7V24oZSwoKT0+e2xldCBpPXJ0KCl8fHFSKGUpO3ZhciBvPW5ldyBNYXAsbD1lLmdldFJvb3RFbGVtZW50KCkscz1lLl9lZGl0b3JTdGF0ZSxhPWUuX2Jsb2NrQ3Vyc29yRWxlbWVudDtsZXQgdT0hMSxjPSIiO2Zvcih2YXIgZD0wO2Q8dC5sZW5ndGg7ZCsrKXt2YXIgZj10W2RdLGg9Zi50eXBlLG09Zi50YXJnZXQsZz1EdShtLHMpO2lmKCEoZz09PW51bGwmJm0hPT1sfHx0dChnKSkpe2lmKGg9PT0iY2hhcmFjdGVyRGF0YSIpe2lmKGY9ciYmSihnKSllOntmPWksaD1tO3ZhciBTPWc7aWYobWUoZikpe3ZhciB2PWYuYW5jaG9yLmdldE5vZGUoKTtpZih2LmlzKFMpJiZmLmZvcm1hdCE9PXYuZ2V0Rm9ybWF0KCkpe2Y9ITE7YnJlYWsgZX19Zj1oLm5vZGVUeXBlPT09MyYmUy5pc0F0dGFjaGVkKCl9ZiYmKFM9WHIoZS5fd2luZG93KSxoPWY9bnVsbCxTIT09bnVsbCYmUy5hbmNob3JOb2RlPT09bSYmKGY9Uy5hbmNob3JPZmZzZXQsaD1TLmZvY3VzT2Zmc2V0KSxtPW0ubm9kZVZhbHVlLG0hPT1udWxsJiZtdihnLG0sZixoLCExKSl9ZWxzZSBpZihoPT09ImNoaWxkTGlzdCIpe2Zvcih1PSEwLGg9Zi5hZGRlZE5vZGVzLFM9MDtTPGgubGVuZ3RoO1MrKyl7dj1oW1NdO3ZhciB5PWVFKHYpLF89di5wYXJlbnROb2RlO189PW51bGx8fHY9PT1hfHx5IT09bnVsbHx8di5ub2RlTmFtZT09PSJCUiImJk5oKHYsXyxlKXx8KHJvJiYoeT12LmlubmVyVGV4dHx8di5ub2RlVmFsdWUpJiYoYys9eSksXy5yZW1vdmVDaGlsZCh2KSl9aWYoZj1mLnJlbW92ZWROb2RlcyxoPWYubGVuZ3RoLDA8aCl7Zm9yKFM9MCx2PTA7djxoO3YrKylfPWZbdl0sKF8ubm9kZU5hbWU9PT0iQlIiJiZOaChfLG0sZSl8fGE9PT1fKSYmKG0uYXBwZW5kQ2hpbGQoXyksUysrKTtoIT09UyYmKG09PT1sJiYoZz1zLl9ub2RlTWFwLmdldCgicm9vdCIpKSxvLnNldChtLGcpKX19fX1pZigwPG8uc2l6ZSlmb3IobGV0W3csRV1vZiBvKWlmKEIoRSkpZm9yKG89RS5nZXRDaGlsZHJlbktleXMoKSxsPXcuZmlyc3RDaGlsZCxzPTA7czxvLmxlbmd0aDtzKyspYT1lLmdldEVsZW1lbnRCeUtleShvW3NdKSxhIT09bnVsbCYmKGw9PW51bGw/KHcuYXBwZW5kQ2hpbGQoYSksbD1hKTpsIT09YSYmdy5yZXBsYWNlQ2hpbGQoYSxsKSxsPWwubmV4dFNpYmxpbmcpO2Vsc2UgSihFKSYmRS5tYXJrRGlydHkoKTtpZihvPW4udGFrZVJlY29yZHMoKSwwPG8ubGVuZ3RoKXtmb3IobD0wO2w8by5sZW5ndGg7bCsrKWZvcihhPW9bbF0scz1hLmFkZGVkTm9kZXMsYT1hLnRhcmdldCxkPTA7ZDxzLmxlbmd0aDtkKyspZz1zW2RdLG09Zy5wYXJlbnROb2RlLG09PW51bGx8fGcubm9kZU5hbWUhPT0iQlIifHxOaChnLGEsZSl8fG0ucmVtb3ZlQ2hpbGQoZyk7bi50YWtlUmVjb3JkcygpfWkhPT1udWxsJiYodSYmKGkuZGlydHk9ITAsV3IoaSkpLHJvJiZpRShlKSYmaS5pbnNlcnRSYXdUZXh0KGMpKX0pfWZpbmFsbHl7c209ITF9fWZ1bmN0aW9uIEdTKGUpe2xldCB0PWUuX29ic2VydmVyO2lmKHQhPT1udWxsKXtsZXQgbj10LnRha2VSZWNvcmRzKCk7WlMoZSxuLHQpfX1mdW5jdGlvbiBZUyhlKXt1dj09PTAmJlRmKGUpLmFkZEV2ZW50TGlzdGVuZXIoInRleHRJbnB1dCIsSlIsITApLGUuX29ic2VydmVyPW5ldyBNdXRhdGlvbk9ic2VydmVyKCh0LG4pPT57WlMoZSx0LG4pfSl9ZnVuY3Rpb24gRDAoZSx0KXtsZXQgbj1lLl9fbW9kZSxyPWUuX19mb3JtYXQ7ZT1lLl9fc3R5bGU7bGV0IGk9dC5fX21vZGUsbz10Ll9fZm9ybWF0O3JldHVybiB0PXQuX19zdHlsZSwobj09PW51bGx8fG49PT1pKSYmKHI9PT1udWxsfHxyPT09bykmJihlPT09bnVsbHx8ZT09PXQpfWZ1bmN0aW9uIEkwKGUsdCl7bGV0IG49ZS5tZXJnZVdpdGhTaWJsaW5nKHQpLHI9cHQoKS5fbm9ybWFsaXplZE5vZGVzO3JldHVybiByLmFkZChlLl9fa2V5KSxyLmFkZCh0Ll9fa2V5KSxufWZ1bmN0aW9uIFhTKGUpe2lmKGUuX190ZXh0PT09IiImJmUuaXNTaW1wbGVUZXh0KCkmJiFlLmlzVW5tZXJnZWFibGUoKSllLnJlbW92ZSgpO2Vsc2V7Zm9yKHZhciB0Oyh0PWUuZ2V0UHJldmlvdXNTaWJsaW5nKCkpIT09bnVsbCYmSih0KSYmdC5pc1NpbXBsZVRleHQoKSYmIXQuaXNVbm1lcmdlYWJsZSgpOylpZih0Ll9fdGV4dD09PSIiKXQucmVtb3ZlKCk7ZWxzZXtEMCh0LGUpJiYoZT1JMCh0LGUpKTticmVha31mb3IodmFyIG47KG49ZS5nZXROZXh0U2libGluZygpKSE9PW51bGwmJkoobikmJm4uaXNTaW1wbGVUZXh0KCkmJiFuLmlzVW5tZXJnZWFibGUoKTspaWYobi5fX3RleHQ9PT0iIiluLnJlbW92ZSgpO2Vsc2V7RDAoZSxuKSYmSTAoZSxuKTticmVha319fWZ1bmN0aW9uIGN2KGUpe3JldHVybiBMMChlLmFuY2hvciksTDAoZS5mb2N1cyksZX1mdW5jdGlvbiBMMChlKXtmb3IoO2UudHlwZT09PSJlbGVtZW50Ijspe3ZhciB0PWUuZ2V0Tm9kZSgpLG49ZS5vZmZzZXQ7aWYobj09PXQuZ2V0Q2hpbGRyZW5TaXplKCk/KHQ9dC5nZXRDaGlsZEF0SW5kZXgobi0xKSxuPSEwKToodD10LmdldENoaWxkQXRJbmRleChuKSxuPSExKSxKKHQpKXtlLnNldCh0Ll9fa2V5LG4/dC5nZXRUZXh0Q29udGVudFNpemUoKTowLCJ0ZXh0Iik7YnJlYWt9ZWxzZSBpZighQih0KSlicmVhaztlLnNldCh0Ll9fa2V5LG4/dC5nZXRDaGlsZHJlblNpemUoKTowLCJlbGVtZW50Iil9fWxldCBlTz0xLHRPPXR5cGVvZiBxdWV1ZU1pY3JvdGFzaz09ImZ1bmN0aW9uIj9xdWV1ZU1pY3JvdGFzazplPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbihlKX07ZnVuY3Rpb24gZHYoZSl7bGV0IHQ9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZih0PT09bnVsbClyZXR1cm4hMTtsZXQgbj10Lm5vZGVOYW1lO3JldHVybiB0dChEdShlKSkmJihuPT09IklOUFVUInx8bj09PSJURVhUQVJFQSJ8fHQuY29udGVudEVkaXRhYmxlPT09InRydWUiJiZ0Ll9fbGV4aWNhbEVkaXRvcj09bnVsbCl9ZnVuY3Rpb24gTXUoZSx0LG4pe2xldCByPWUuZ2V0Um9vdEVsZW1lbnQoKTt0cnl7cmV0dXJuIHIhPT1udWxsJiZyLmNvbnRhaW5zKHQpJiZyLmNvbnRhaW5zKG4pJiZ0IT09bnVsbCYmIWR2KHQpJiZmdih0KT09PWV9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIGZ2KGUpe2Zvcig7ZSE9bnVsbDspe2xldCB0PWUuX19sZXhpY2FsRWRpdG9yO2lmKHQhPW51bGwpcmV0dXJuIHQ7ZT1iZihlKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBhbShlKXtyZXR1cm4gZS5pc1Rva2VuKCl8fGUuaXNTZWdtZW50ZWQoKX1mdW5jdGlvbiBiZChlKXtmb3IoO2UhPW51bGw7KXtpZihlLm5vZGVUeXBlPT09MylyZXR1cm4gZTtlPWUuZmlyc3RDaGlsZH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBRUyhlLHQsbil7cmV0dXJuIHQ9em9bdF0sZSZ0JiYobj09PW51bGx8fCEobiZ0KSk/ZV50Om49PT1udWxsfHxuJnQ/ZXx0OmV9ZnVuY3Rpb24gSlMoZSl7cmV0dXJuIEooZSl8fG91KGUpfHx0dChlKX1mdW5jdGlvbiBxUyhlLHQpe2lmKHQhPW51bGwpZS5fX2tleT10O2Vsc2V7aG4oKSw5OTxsdSYmSCgxNCksdD1wdCgpO3ZhciBuPVFyKCkscj0iIitlTysrO24uX25vZGVNYXAuc2V0KHIsZSksQihlKT90Ll9kaXJ0eUVsZW1lbnRzLnNldChyLCEwKTp0Ll9kaXJ0eUxlYXZlcy5hZGQociksdC5fY2xvbmVOb3ROZWVkZWQuYWRkKHIpLHQuX2RpcnR5VHlwZT0xLGUuX19rZXk9cn19ZnVuY3Rpb24gRm8oZSl7dmFyIHQ9ZS5nZXRQYXJlbnQoKTtpZih0IT09bnVsbCl7bGV0IGk9ZS5nZXRXcml0YWJsZSgpO3Q9dC5nZXRXcml0YWJsZSgpO3ZhciBuPWUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7aWYoZT1lLmdldE5leHRTaWJsaW5nKCksbj09PW51bGwpaWYoZSE9PW51bGwpe3ZhciByPWUuZ2V0V3JpdGFibGUoKTt0Ll9fZmlyc3Q9ZS5fX2tleSxyLl9fcHJldj1udWxsfWVsc2UgdC5fX2ZpcnN0PW51bGw7ZWxzZXtpZihyPW4uZ2V0V3JpdGFibGUoKSxlIT09bnVsbCl7bGV0IG89ZS5nZXRXcml0YWJsZSgpO28uX19wcmV2PXIuX19rZXksci5fX25leHQ9by5fX2tleX1lbHNlIHIuX19uZXh0PW51bGw7aS5fX3ByZXY9bnVsbH1lPT09bnVsbD9uIT09bnVsbD8oZT1uLmdldFdyaXRhYmxlKCksdC5fX2xhc3Q9bi5fX2tleSxlLl9fbmV4dD1udWxsKTp0Ll9fbGFzdD1udWxsOihlPWUuZ2V0V3JpdGFibGUoKSxuIT09bnVsbD8obj1uLmdldFdyaXRhYmxlKCksbi5fX25leHQ9ZS5fX2tleSxlLl9fcHJldj1uLl9fa2V5KTplLl9fcHJldj1udWxsLGkuX19uZXh0PW51bGwpLHQuX19zaXplLS0saS5fX3BhcmVudD1udWxsfX1mdW5jdGlvbiBUZChlKXs5OTxsdSYmSCgxNCk7dmFyIHQ9ZS5nZXRMYXRlc3QoKSxuPXQuX19wYXJlbnQscj1RcigpO2xldCBpPXB0KCksbz1yLl9ub2RlTWFwO2lmKHI9aS5fZGlydHlFbGVtZW50cyxuIT09bnVsbCllOmZvcig7biE9PW51bGw7KXtpZihyLmhhcyhuKSlicmVhayBlO2xldCBsPW8uZ2V0KG4pO2lmKGw9PT12b2lkIDApYnJlYWs7ci5zZXQobiwhMSksbj1sLl9fcGFyZW50fXQ9dC5fX2tleSxpLl9kaXJ0eVR5cGU9MSxCKGUpP3Iuc2V0KHQsITApOmkuX2RpcnR5TGVhdmVzLmFkZCh0KX1mdW5jdGlvbiBLdChlKXtobigpO3ZhciB0PXB0KCk7bGV0IG49dC5fY29tcG9zaXRpb25LZXk7ZSE9PW4mJih0Ll9jb21wb3NpdGlvbktleT1lLG4hPT1udWxsJiYodD1MdChuKSx0IT09bnVsbCYmdC5nZXRXcml0YWJsZSgpKSxlIT09bnVsbCYmKGU9THQoZSksZSE9PW51bGwmJmUuZ2V0V3JpdGFibGUoKSkpfWZ1bmN0aW9uIFdpKCl7cmV0dXJuIE5zKCk/bnVsbDpwdCgpLl9jb21wb3NpdGlvbktleX1mdW5jdGlvbiBMdChlLHQpe3JldHVybiBlPSh0fHxRcigpKS5fbm9kZU1hcC5nZXQoZSksZT09PXZvaWQgMD9udWxsOmV9ZnVuY3Rpb24gZUUoZSx0KXtsZXQgbj1wdCgpO3JldHVybiBlPWVbYF9fbGV4aWNhbEtleV8ke24uX2tleX1gXSxlIT09dm9pZCAwP0x0KGUsdCk6bnVsbH1mdW5jdGlvbiBEdShlLHQpe2Zvcig7ZSE9bnVsbDspe2xldCBuPWVFKGUsdCk7aWYobiE9PW51bGwpcmV0dXJuIG47ZT1iZihlKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiB0RShlKXtsZXQgdD1PYmplY3QuYXNzaWduKHt9LGUuX2RlY29yYXRvcnMpO3JldHVybiBlLl9wZW5kaW5nRGVjb3JhdG9ycz10fWZ1bmN0aW9uIGowKGUpe3JldHVybiBlLnJlYWQoKCk9PllyKCkuZ2V0VGV4dENvbnRlbnQoKSl9ZnVuY3Rpb24gbk8oZSx0KXtXbihlLCgpPT57dmFyIG49UXIoKTtpZighbi5pc0VtcHR5KCkpaWYodD09PSJyb290IilZcigpLm1hcmtEaXJ0eSgpO2Vsc2V7bj1uLl9ub2RlTWFwO2ZvcihsZXRbLHJdb2YgbilyLm1hcmtEaXJ0eSgpfX0sZS5fcGVuZGluZ0VkaXRvclN0YXRlPT09bnVsbD97dGFnOiJoaXN0b3J5LW1lcmdlIn06dm9pZCAwKX1mdW5jdGlvbiBZcigpe3JldHVybiBRcigpLl9ub2RlTWFwLmdldCgicm9vdCIpfWZ1bmN0aW9uIFdyKGUpe2huKCk7bGV0IHQ9UXIoKTtlIT09bnVsbCYmKGUuZGlydHk9ITAsZS5fY2FjaGVkTm9kZXM9bnVsbCksdC5fc2VsZWN0aW9uPWV9ZnVuY3Rpb24gamwoZSl7dmFyIHQ9cHQoKSxuO2U6e2ZvcihuPWU7biE9bnVsbDspe2xldCByPW5bYF9fbGV4aWNhbEtleV8ke3QuX2tleX1gXTtpZihyIT09dm9pZCAwKXtuPXI7YnJlYWsgZX1uPWJmKG4pfW49bnVsbH1yZXR1cm4gbj09PW51bGw/KHQ9dC5nZXRSb290RWxlbWVudCgpLGU9PT10P0x0KCJyb290Iik6bnVsbCk6THQobil9ZnVuY3Rpb24gbkUoZSl7cmV0dXJuL1tcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXS9nLnRlc3QoZSl9ZnVuY3Rpb24gaHYoZSl7bGV0IHQ9W107Zm9yKDtlIT09bnVsbDspdC5wdXNoKGUpLGU9ZS5fcGFyZW50RWRpdG9yO3JldHVybiB0fWZ1bmN0aW9uIHJFKCl7cmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnJlcGxhY2UoL1teYS16XSsvZywiIikuc3Vic3RyKDAsNSl9ZnVuY3Rpb24gcHYoZSx0LG4pe2lmKHQ9WHIodC5fd2luZG93KSx0IT09bnVsbCl7dmFyIHI9dC5hbmNob3JOb2RlLHthbmNob3JPZmZzZXQ6aSxmb2N1c09mZnNldDpvfT10O2lmKHIhPT1udWxsJiYodD1yLm5vZGVUeXBlPT09Mz9yLm5vZGVWYWx1ZTpudWxsLHI9RHUociksdCE9PW51bGwmJkoocikpKXtpZih0PT09JGYmJm4pe2xldCBsPW4ubGVuZ3RoO3Q9bixvPWk9bH10IT09bnVsbCYmbXYocix0LGksbyxlKX19fWZ1bmN0aW9uIG12KGUsdCxuLHIsaSl7bGV0IG89ZTtpZihvLmlzQXR0YWNoZWQoKSYmKGl8fCFvLmlzRGlydHkoKSkpe2xldCB1PW8uaXNDb21wb3NpbmcoKSxjPXQ7aWYoKHV8fGkpJiZ0W3QubGVuZ3RoLTFdPT09JGYmJihjPXQuc2xpY2UoMCwtMSkpLHQ9by5nZXRUZXh0Q29udGVudCgpLGl8fGMhPT10KWlmKGM9PT0iIilpZihLdChudWxsKSxzdnx8a2Z8fGF2KW8ucmVtb3ZlKCk7ZWxzZXtsZXQgZD1wdCgpO3NldFRpbWVvdXQoKCk9PntkLnVwZGF0ZSgoKT0+e28uaXNBdHRhY2hlZCgpJiZvLnJlbW92ZSgpfSl9LDIwKX1lbHNle2k9by5nZXRQYXJlbnQoKSx0PVRzKCk7dmFyIGw9by5nZXRUZXh0Q29udGVudFNpemUoKSxzPVdpKCksYT1vLmdldEtleSgpO28uaXNUb2tlbigpfHxzIT09bnVsbCYmYT09PXMmJiF1fHxtZSh0KSYmKGkhPT1udWxsJiYhaS5jYW5JbnNlcnRUZXh0QmVmb3JlKCkmJnQuYW5jaG9yLm9mZnNldD09PTB8fHQuYW5jaG9yLmtleT09PWUuX19rZXkmJnQuYW5jaG9yLm9mZnNldD09PTAmJiFvLmNhbkluc2VydFRleHRCZWZvcmUoKXx8dC5mb2N1cy5rZXk9PT1lLl9fa2V5JiZ0LmZvY3VzLm9mZnNldD09PWwmJiFvLmNhbkluc2VydFRleHRBZnRlcigpKT9vLm1hcmtEaXJ0eSgpOihlPXJ0KCksbWUoZSkmJm4hPT1udWxsJiZyIT09bnVsbCYmKGUuc2V0VGV4dE5vZGVSYW5nZShvLG4sbyxyKSxvLmlzU2VnbWVudGVkKCkmJihuPW8uZ2V0VGV4dENvbnRlbnQoKSxuPUR0KG4pLG8ucmVwbGFjZShuKSxvPW4pKSxvLnNldFRleHRDb250ZW50KGMpKX19fWZ1bmN0aW9uIHJPKGUsdCl7aWYodC5pc1NlZ21lbnRlZCgpKXJldHVybiEwO2lmKCFlLmlzQ29sbGFwc2VkKCkpcmV0dXJuITE7ZT1lLmFuY2hvci5vZmZzZXQ7bGV0IG49dC5nZXRQYXJlbnRPclRocm93KCkscj10LmlzVG9rZW4oKTtyZXR1cm4gZT09PTA/KChlPSF0LmNhbkluc2VydFRleHRCZWZvcmUoKXx8IW4uY2FuSW5zZXJ0VGV4dEJlZm9yZSgpfHxyKXx8KHQ9dC5nZXRQcmV2aW91c1NpYmxpbmcoKSxlPShKKHQpfHxCKHQpJiZ0LmlzSW5saW5lKCkpJiYhdC5jYW5JbnNlcnRUZXh0QWZ0ZXIoKSksZSk6ZT09PXQuZ2V0VGV4dENvbnRlbnRTaXplKCk/IXQuY2FuSW5zZXJ0VGV4dEFmdGVyKCl8fCFuLmNhbkluc2VydFRleHRBZnRlcigpfHxyOiExfWZ1bmN0aW9uIGthKGUsdCl7ZS5fX2xleGljYWxDbGFzc05hbWVDYWNoZT09PXZvaWQgMCYmKGUuX19sZXhpY2FsQ2xhc3NOYW1lQ2FjaGU9e30pO2xldCBuPWUuX19sZXhpY2FsQ2xhc3NOYW1lQ2FjaGUscj1uW3RdO3JldHVybiByIT09dm9pZCAwP3I6KGU9ZVt0XSx0eXBlb2YgZT09InN0cmluZyI/KGU9ZS5zcGxpdCgiICIpLG5bdF09ZSk6ZSl9ZnVuY3Rpb24gZ3YoZSx0LG4scixpKXtuLnNpemUhPT0wJiYobj1yLl9fdHlwZSxyPXIuX19rZXksdD10LmdldChuKSx0PT09dm9pZCAwJiZIKDMzLG4pLG49dC5rbGFzcyx0PWUuZ2V0KG4pLHQ9PT12b2lkIDAmJih0PW5ldyBNYXAsZS5zZXQobix0KSksZT10LmdldChyKSxuPWU9PT0iZGVzdHJveWVkIiYmaT09PSJjcmVhdGVkIiwoZT09PXZvaWQgMHx8bikmJnQuc2V0KHIsbj8idXBkYXRlZCI6aSkpfWZ1bmN0aW9uIHowKGUsdCxuKXtsZXQgcj1lLmdldFBhcmVudCgpLGk9bjtyZXR1cm4gciE9PW51bGwmJih0JiZuPT09MD8oaT1lLmdldEluZGV4V2l0aGluUGFyZW50KCksZT1yKTp0fHxuIT09ZS5nZXRDaGlsZHJlblNpemUoKXx8KGk9ZS5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEsZT1yKSksZS5nZXRDaGlsZEF0SW5kZXgodD9pLTE6aSl9ZnVuY3Rpb24gdW0oZSx0KXt2YXIgbj1lLm9mZnNldDtyZXR1cm4gZS50eXBlPT09ImVsZW1lbnQiPyhlPWUuZ2V0Tm9kZSgpLHowKGUsdCxuKSk6KGU9ZS5nZXROb2RlKCksdCYmbj09PTB8fCF0JiZuPT09ZS5nZXRUZXh0Q29udGVudFNpemUoKT8obj10P2UuZ2V0UHJldmlvdXNTaWJsaW5nKCk6ZS5nZXROZXh0U2libGluZygpLG49PT1udWxsP3owKGUuZ2V0UGFyZW50T3JUaHJvdygpLHQsZS5nZXRJbmRleFdpdGhpblBhcmVudCgpKyh0PzA6MSkpOm4pOm51bGwpfWZ1bmN0aW9uIGlFKGUpe3JldHVybiBlPShlPVRmKGUpLmV2ZW50KSYmZS5pbnB1dFR5cGUsZT09PSJpbnNlcnRGcm9tUGFzdGUifHxlPT09Imluc2VydEZyb21QYXN0ZUFzUXVvdGF0aW9uIn1mdW5jdGlvbiBOZChlKXtyZXR1cm4hbW4oZSkmJiFlLmlzTGFzdENoaWxkKCkmJiFlLmlzSW5saW5lKCl9ZnVuY3Rpb24gUmQoZSx0KXtyZXR1cm4gZT1lLl9rZXlUb0RPTU1hcC5nZXQodCksZT09PXZvaWQgMCYmSCg3NSx0KSxlfWZ1bmN0aW9uIGJmKGUpe3JldHVybiBlPWUuYXNzaWduZWRTbG90fHxlLnBhcmVudEVsZW1lbnQsZSE9PW51bGwmJmUubm9kZVR5cGU9PT0xMT9lLmhvc3Q6ZX1mdW5jdGlvbiBPZChlLHQpe2ZvcihlPWUuZ2V0UGFyZW50KCk7ZSE9PW51bGw7KXtpZihlLmlzKHQpKXJldHVybiEwO2U9ZS5nZXRQYXJlbnQoKX1yZXR1cm4hMX1mdW5jdGlvbiBUZihlKXtyZXR1cm4gZT1lLl93aW5kb3csZT09PW51bGwmJkgoNzgpLGV9ZnVuY3Rpb24gb0UoZSl7Zm9yKGU9ZS5nZXRQYXJlbnRPclRocm93KCk7ZSE9PW51bGwmJiF4cihlKTspZT1lLmdldFBhcmVudE9yVGhyb3coKTtyZXR1cm4gZX1mdW5jdGlvbiB4cihlKXtyZXR1cm4gbW4oZSl8fEIoZSkmJmUuaXNTaGFkb3dSb290KCl9ZnVuY3Rpb24gbEUoZSl7cmV0dXJuIGU9ZS5jb25zdHJ1Y3Rvci5jbG9uZShlKSxxUyhlLG51bGwpLGV9ZnVuY3Rpb24gSXUoZSl7dmFyIHQ9cHQoKTtsZXQgbj1lLmNvbnN0cnVjdG9yLmdldFR5cGUoKTtyZXR1cm4gdD10Ll9ub2Rlcy5nZXQobiksdD09PXZvaWQgMCYmSCg5NyksdD10LnJlcGxhY2UsdCE9PW51bGw/KHQ9dChlKSx0IGluc3RhbmNlb2YgZS5jb25zdHJ1Y3Rvcnx8SCg5OCksdCk6ZX1mdW5jdGlvbiBSaChlLHQpe2U9ZS5nZXRQYXJlbnQoKSwhbW4oZSl8fEIodCl8fHR0KHQpfHxIKDk5KX1mdW5jdGlvbiBPaChlKXtyZXR1cm4odHQoZSl8fEIoZSkmJiFlLmNhbkJlRW1wdHkoKSkmJiFlLmlzSW5saW5lKCl9ZnVuY3Rpb24gY20oZSx0LG4pe24uc3R5bGUucmVtb3ZlUHJvcGVydHkoImNhcmV0LWNvbG9yIiksdC5fYmxvY2tDdXJzb3JFbGVtZW50PW51bGwsdD1lLnBhcmVudEVsZW1lbnQsdCE9PW51bGwmJnQucmVtb3ZlQ2hpbGQoZSl9ZnVuY3Rpb24gWHIoZSl7cmV0dXJuIHdpPyhlfHx3aW5kb3cpLmdldFNlbGVjdGlvbigpOm51bGx9ZnVuY3Rpb24gc0UoZSx0KXtsZXQgbj1lLmdldENoaWxkQXRJbmRleCh0KTtuPT1udWxsJiYobj1lKSx4cihlKSYmSCgxMDIpO2xldCByPWw9Pntjb25zdCBzPWwuZ2V0UGFyZW50T3JUaHJvdygpLGE9eHIocyksdT1sIT09bnx8YT9sRShsKTpsO2lmKGEpcmV0dXJuIGwuaW5zZXJ0QWZ0ZXIodSksW2wsdSx1XTtjb25zdFtjLGQsZl09cihzKTtyZXR1cm4gbD1sLmdldE5leHRTaWJsaW5ncygpLGYuYXBwZW5kKHUsLi4ubCksW2MsZCx1XX0sW2ksb109cihuKTtyZXR1cm5baSxvXX1mdW5jdGlvbiBQZChlLHQpe2Zvcig7ZSE9PVlyKCkmJmUhPW51bGw7KXtpZih0KGUpKXJldHVybiBlO2U9ZS5nZXRQYXJlbnQoKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBpTyhlKXtsZXQgdD1bXSxuPVtlXTtmb3IoOzA8bi5sZW5ndGg7KXtsZXQgcj1uLnBvcCgpO3I9PT12b2lkIDAmJkgoMTEyKSxCKHIpJiZuLnVuc2hpZnQoLi4uci5nZXRDaGlsZHJlbigpKSxyIT09ZSYmdC5wdXNoKHIpfXJldHVybiB0fWZ1bmN0aW9uIE5mKGUpe3JldHVybiBlLm5vZGVUeXBlPT09MX1mdW5jdGlvbiBhRShlLHQsbixyLGksbyl7Zm9yKGU9ZS5nZXRGaXJzdENoaWxkKCk7ZSE9PW51bGw7KXtsZXQgbD1lLl9fa2V5O2UuX19wYXJlbnQ9PT10JiYoQihlKSYmYUUoZSxsLG4scixpLG8pLG4uaGFzKGwpfHxvLmRlbGV0ZShsKSxpLnB1c2gobCkpLGU9ZS5nZXROZXh0U2libGluZygpfX1mdW5jdGlvbiBvTyhlLHQsbixyKXtlPWUuX25vZGVNYXAsdD10Ll9ub2RlTWFwO2xldCBpPVtdO2ZvcihsZXRbb11vZiByKXtsZXQgbD10LmdldChvKTtsPT09dm9pZCAwfHxsLmlzQXR0YWNoZWQoKXx8KEIobCkmJmFFKGwsbyxlLHQsaSxyKSxlLmhhcyhvKXx8ci5kZWxldGUobyksaS5wdXNoKG8pKX1mb3IobGV0IG8gb2YgaSl0LmRlbGV0ZShvKTtmb3IobGV0IG8gb2YgbilyPXQuZ2V0KG8pLHI9PT12b2lkIDB8fHIuaXNBdHRhY2hlZCgpfHwoZS5oYXMobyl8fG4uZGVsZXRlKG8pLHQuZGVsZXRlKG8pKX1sZXQgTnQ9IiIsZm49IiIsb2k9IiIsaW8sdG4sbnUsdUU9ITEsdnY9ITEsUmYsQmM9bnVsbCxkbSxmbSxZbyxvbyxobSxydTtmdW5jdGlvbiBVYyhlLHQpe2xldCBuPVlvLmdldChlKTtpZih0IT09bnVsbCl7bGV0IHI9Z20oZSk7ci5wYXJlbnROb2RlPT09dCYmdC5yZW1vdmVDaGlsZChyKX1vby5oYXMoZSl8fHRuLl9rZXlUb0RPTU1hcC5kZWxldGUoZSksQihuKSYmKGU9QWQobixZbykscG0oZSwwLGUubGVuZ3RoLTEsbnVsbCkpLG4hPT12b2lkIDAmJmd2KHJ1LG51LFJmLG4sImRlc3Ryb3llZCIpfWZ1bmN0aW9uIHBtKGUsdCxuLHIpe2Zvcig7dDw9bjsrK3Qpe2xldCBpPWVbdF07aSE9PXZvaWQgMCYmVWMoaSxyKX19ZnVuY3Rpb24gJG8oZSx0KXtlLnNldFByb3BlcnR5KCJ0ZXh0LWFsaWduIix0KX1mdW5jdGlvbiBjRShlLHQpe3ZhciBuPWlvLnRoZW1lLmluZGVudDtpZih0eXBlb2Ygbj09InN0cmluZyIpe2xldCByPWUuY2xhc3NMaXN0LmNvbnRhaW5zKG4pOzA8dCYmIXI/ZS5jbGFzc0xpc3QuYWRkKG4pOjE+dCYmciYmZS5jbGFzc0xpc3QucmVtb3ZlKG4pfW49Z2V0Q29tcHV0ZWRTdHlsZShlKS5nZXRQcm9wZXJ0eVZhbHVlKCItLWxleGljYWwtaW5kZW50LWJhc2UtdmFsdWUiKXx8IjQwcHgiLGUuc3R5bGUuc2V0UHJvcGVydHkoInBhZGRpbmctaW5saW5lLXN0YXJ0Iix0PT09MD8iIjpgY2FsYygke3R9ICogJHtufSlgKX1mdW5jdGlvbiBkRShlLHQpe2U9ZS5zdHlsZSx0PT09MD8kbyhlLCIiKTp0PT09MT8kbyhlLCJsZWZ0Iik6dD09PTI/JG8oZSwiY2VudGVyIik6dD09PTM/JG8oZSwicmlnaHQiKTp0PT09ND8kbyhlLCJqdXN0aWZ5Iik6dD09PTU/JG8oZSwic3RhcnQiKTp0PT09NiYmJG8oZSwiZW5kIil9ZnVuY3Rpb24gV2MoZSx0LG4pe2xldCByPW9vLmdldChlKTtyPT09dm9pZCAwJiZIKDYwKTtsZXQgaT1yLmNyZWF0ZURPTShpbyx0bik7dmFyIG89dG4uX2tleVRvRE9NTWFwO2lmKGlbIl9fbGV4aWNhbEtleV8iK3RuLl9rZXldPWUsby5zZXQoZSxpKSxKKHIpP2kuc2V0QXR0cmlidXRlKCJkYXRhLWxleGljYWwtdGV4dCIsInRydWUiKTp0dChyKSYmaS5zZXRBdHRyaWJ1dGUoImRhdGEtbGV4aWNhbC1kZWNvcmF0b3IiLCJ0cnVlIiksQihyKSl7aWYoZT1yLl9faW5kZW50LG89ci5fX3NpemUsZSE9PTAmJmNFKGksZSksbyE9PTApey0tbyxlPUFkKHIsb28pO3ZhciBsPWZuO2ZuPSIiLG1tKGUsciwwLG8saSxudWxsKSxoRShyLGkpLGZuPWx9ZT1yLl9fZm9ybWF0LGUhPT0wJiZkRShpLGUpLHIuaXNJbmxpbmUoKXx8ZkUobnVsbCxyLGkpLE5kKHIpJiYoTnQrPWAKCmAsb2krPWAKCmApfWVsc2Ugbz1yLmdldFRleHRDb250ZW50KCksdHQocik/KGw9ci5kZWNvcmF0ZSh0bixpbyksbCE9PW51bGwmJnBFKGUsbCksaS5jb250ZW50RWRpdGFibGU9ImZhbHNlIik6SihyKSYmKHIuaXNEaXJlY3Rpb25sZXNzKCl8fChmbis9bykpLE50Kz1vLG9pKz1vO3JldHVybiB0IT09bnVsbCYmKG4hPW51bGw/dC5pbnNlcnRCZWZvcmUoaSxuKToobj10Ll9fbGV4aWNhbExpbmVCcmVhayxuIT1udWxsP3QuaW5zZXJ0QmVmb3JlKGksbik6dC5hcHBlbmRDaGlsZChpKSkpLGd2KHJ1LG51LFJmLHIsImNyZWF0ZWQiKSxpfWZ1bmN0aW9uIG1tKGUsdCxuLHIsaSxvKXtsZXQgbD1OdDtmb3IoTnQ9IiI7bjw9cjsrK24pV2MoZVtuXSxpLG8pO05kKHQpJiYoTnQrPWAKCmApLGkuX19sZXhpY2FsVGV4dENvbnRlbnQ9TnQsTnQ9bCtOdH1mdW5jdGlvbiBGMChlLHQpe3JldHVybiBlPXQuZ2V0KGUpLG91KGUpfHx0dChlKSYmZS5pc0lubGluZSgpfWZ1bmN0aW9uIGZFKGUsdCxuKXtlPWUhPT1udWxsJiYoZS5fX3NpemU9PT0wfHxGMChlLl9fbGFzdCxZbykpLHQ9dC5fX3NpemU9PT0wfHxGMCh0Ll9fbGFzdCxvbyksZT90fHwodD1uLl9fbGV4aWNhbExpbmVCcmVhayx0IT1udWxsJiZuLnJlbW92ZUNoaWxkKHQpLG4uX19sZXhpY2FsTGluZUJyZWFrPW51bGwpOnQmJih0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIiksbi5fX2xleGljYWxMaW5lQnJlYWs9dCxuLmFwcGVuZENoaWxkKHQpKX1mdW5jdGlvbiBoRShlLHQpe3ZhciBuPXQuX19sZXhpY2FsRGlyO2lmKHQuX19sZXhpY2FsRGlyVGV4dENvbnRlbnQhPT1mbnx8biE9PUJjKXtsZXQgbz1mbj09PSIiO2lmKG8pdmFyIHI9QmM7ZWxzZSByPWZuLHI9S1IudGVzdChyKT8icnRsIjpaUi50ZXN0KHIpPyJsdHIiOm51bGw7aWYociE9PW4pe2xldCBsPXQuY2xhc3NMaXN0LHM9aW8udGhlbWU7dmFyIGk9biE9PW51bGw/c1tuXTp2b2lkIDA7bGV0IGE9ciE9PW51bGw/c1tyXTp2b2lkIDA7aSE9PXZvaWQgMCYmKHR5cGVvZiBpPT0ic3RyaW5nIiYmKGk9aS5zcGxpdCgiICIpLGk9c1tuXT1pKSxsLnJlbW92ZSguLi5pKSkscj09PW51bGx8fG8mJnI9PT0ibHRyIj90LnJlbW92ZUF0dHJpYnV0ZSgiZGlyIik6KGEhPT12b2lkIDAmJih0eXBlb2YgYT09InN0cmluZyImJihuPWEuc3BsaXQoIiAiKSxhPXNbcl09biksYSE9PXZvaWQgMCYmbC5hZGQoLi4uYSkpLHQuZGlyPXIpLHZ2fHwoZS5nZXRXcml0YWJsZSgpLl9fZGlyPXIpfUJjPXIsdC5fX2xleGljYWxEaXJUZXh0Q29udGVudD1mbix0Ll9fbGV4aWNhbERpcj1yfX1mdW5jdGlvbiBBZChlLHQpe2xldCBuPVtdO2ZvcihlPWUuX19maXJzdDtlIT09bnVsbDspe2xldCByPXQuZ2V0KGUpO3I9PT12b2lkIDAmJkgoMTAxKSxuLnB1c2goZSksZT1yLl9fbmV4dH1yZXR1cm4gbn1mdW5jdGlvbiBhYShlLHQpe3ZhciBuPVlvLmdldChlKSxyPW9vLmdldChlKTtuIT09dm9pZCAwJiZyIT09dm9pZCAwfHxIKDYxKTt2YXIgaT11RXx8Zm0uaGFzKGUpfHxkbS5oYXMoZSk7bGV0IG89UmQodG4sZSk7aWYobj09PXImJiFpKXJldHVybiBCKG4pPyhyPW8uX19sZXhpY2FsVGV4dENvbnRlbnQsciE9PXZvaWQgMCYmKE50Kz1yLG9pKz1yKSxyPW8uX19sZXhpY2FsRGlyVGV4dENvbnRlbnQsciE9PXZvaWQgMCYmKGZuKz1yKSk6KHI9bi5nZXRUZXh0Q29udGVudCgpLEoobikmJiFuLmlzRGlyZWN0aW9ubGVzcygpJiYoZm4rPXIpLG9pKz1yLE50Kz1yKSxvO2lmKG4hPT1yJiZpJiZndihydSxudSxSZixyLCJ1cGRhdGVkIiksci51cGRhdGVET00obixvLGlvKSlyZXR1cm4gcj1XYyhlLG51bGwsbnVsbCksdD09PW51bGwmJkgoNjIpLHQucmVwbGFjZUNoaWxkKHIsbyksVWMoZSxudWxsKSxyO2lmKEIobikmJkIocikpe2lmKGU9ci5fX2luZGVudCxlIT09bi5fX2luZGVudCYmY0UobyxlKSxlPXIuX19mb3JtYXQsZSE9PW4uX19mb3JtYXQmJmRFKG8sZSksaSl7ZT1yLGk9Zm4sZm49IiIsdD1OdDt2YXIgbD1uLl9fc2l6ZSxzPWUuX19zaXplO2lmKE50PSIiLGw9PT0xJiZzPT09MSl7dmFyIGE9bi5fX2ZpcnN0LHU9ZS5fX2ZpcnN0O2lmKGE9PT11KWFhKGEsbyk7ZWxzZXt2YXIgYz1nbShhKTt1PVdjKHUsbnVsbCxudWxsKSxvLnJlcGxhY2VDaGlsZCh1LGMpLFVjKGEsbnVsbCl9fWVsc2V7dT1BZChuLFlvKTt2YXIgZD1BZChlLG9vKTtpZihsPT09MClzIT09MCYmbW0oZCxlLDAscy0xLG8sbnVsbCk7ZWxzZSBpZihzPT09MClsIT09MCYmKGE9by5fX2xleGljYWxMaW5lQnJlYWs9PW51bGwscG0odSwwLGwtMSxhP251bGw6byksYSYmKG8udGV4dENvbnRlbnQ9IiIpKTtlbHNle3ZhciBmPXU7dT1kLGQ9bC0xLGw9cy0xO2xldCBtPW8uZmlyc3RDaGlsZCxnPTA7Zm9yKHM9MDtnPD1kJiZzPD1sOyl7dmFyIGg9ZltnXTtsZXQgUz11W3NdO2lmKGg9PT1TKW09UGgoYWEoUyxvKSksZysrLHMrKztlbHNle2E9PT12b2lkIDAmJihhPW5ldyBTZXQoZikpLGM9PT12b2lkIDAmJihjPW5ldyBTZXQodSkpO2xldCB2PWMuaGFzKGgpLHk9YS5oYXMoUyk7dj8oeT8oaD1SZCh0bixTKSxoPT09bT9tPVBoKGFhKFMsbykpOihtIT1udWxsP28uaW5zZXJ0QmVmb3JlKGgsbSk6by5hcHBlbmRDaGlsZChoKSxhYShTLG8pKSxnKyspOldjKFMsbyxtKSxzKyspOihtPVBoKGdtKGgpKSxVYyhoLG8pLGcrKyl9fWE9Zz5kLGM9cz5sLGEmJiFjPyhhPXVbbCsxXSxhPWE9PT12b2lkIDA/bnVsbDp0bi5nZXRFbGVtZW50QnlLZXkoYSksbW0odSxlLHMsbCxvLGEpKTpjJiYhYSYmcG0oZixnLGQsbyl9fU5kKGUpJiYoTnQrPWAKCmApLG8uX19sZXhpY2FsVGV4dENvbnRlbnQ9TnQsTnQ9dCtOdCxoRShlLG8pLGZuPWksbW4ocil8fHIuaXNJbmxpbmUoKXx8ZkUobixyLG8pfU5kKHIpJiYoTnQrPWAKCmAsb2krPWAKCmApfWVsc2Ugbj1yLmdldFRleHRDb250ZW50KCksdHQocik/KGk9ci5kZWNvcmF0ZSh0bixpbyksaSE9PW51bGwmJnBFKGUsaSkpOkoocikmJiFyLmlzRGlyZWN0aW9ubGVzcygpJiYoZm4rPW4pLE50Kz1uLG9pKz1uO3JldHVybiF2diYmbW4ocikmJnIuX19jYWNoZWRUZXh0IT09b2kmJihyPXIuZ2V0V3JpdGFibGUoKSxyLl9fY2FjaGVkVGV4dD1vaSksb31mdW5jdGlvbiBwRShlLHQpe2xldCBuPXRuLl9wZW5kaW5nRGVjb3JhdG9ycyxyPXRuLl9kZWNvcmF0b3JzO2lmKG49PT1udWxsKXtpZihyW2VdPT09dClyZXR1cm47bj10RSh0bil9bltlXT10fWZ1bmN0aW9uIFBoKGUpe3JldHVybiBlPWUubmV4dFNpYmxpbmcsZSE9PW51bGwmJmU9PT10bi5fYmxvY2tDdXJzb3JFbGVtZW50JiYoZT1lLm5leHRTaWJsaW5nKSxlfWZ1bmN0aW9uIGdtKGUpe2xldCB0PWhtLmdldChlKTtyZXR1cm4gdD09PXZvaWQgMCYmSCg3NSxlKSx0fWxldCBlaT1PYmplY3QuZnJlZXplKHt9KSx2bT1bWyJrZXlkb3duIixoT10sWyJwb2ludGVyZG93biIsc09dLFsiY29tcG9zaXRpb25zdGFydCIsZE9dLFsiY29tcG9zaXRpb25lbmQiLGZPXSxbImlucHV0IixjT10sWyJjbGljayIsbE9dLFsiY3V0IixlaV0sWyJjb3B5IixlaV0sWyJkcmFnc3RhcnQiLGVpXSxbImRyYWdvdmVyIixlaV0sWyJkcmFnZW5kIixlaV0sWyJwYXN0ZSIsZWldLFsiZm9jdXMiLGVpXSxbImJsdXIiLGVpXSxbImRyb3AiLGVpXV07JGQmJnZtLnB1c2goWyJiZWZvcmVpbnB1dCIsKGUsdCk9PnVPKGUsdCldKTtsZXQgaXU9MCxtRT0wLGdFPTAsQ2w9bnVsbCwkYT0wLHltPSExLHhtPSExLGJhPSExLHVhPSExLHZFPVswLCIiLDAsInJvb3QiLDBdO2Z1bmN0aW9uIHlFKGUsdCxuLHIsaSl7bGV0IG89ZS5hbmNob3IsbD1lLmZvY3VzLHM9by5nZXROb2RlKCk7dmFyIGE9cHQoKTtsZXQgdT1YcihhLl93aW5kb3cpLGM9dSE9PW51bGw/dS5hbmNob3JOb2RlOm51bGwsZD1vLmtleTthPWEuZ2V0RWxlbWVudEJ5S2V5KGQpO2xldCBmPW4ubGVuZ3RoO3JldHVybiBkIT09bC5rZXl8fCFKKHMpfHwoIWkmJighJGR8fGdFPHIrNTApfHxzLmlzRGlydHkoKSYmMj5mfHxuRShuKSkmJm8ub2Zmc2V0IT09bC5vZmZzZXQmJiFzLmlzQ29tcG9zaW5nKCl8fGFtKHMpfHxzLmlzRGlydHkoKSYmMTxmfHwoaXx8ISRkKSYmYSE9PW51bGwmJiFzLmlzQ29tcG9zaW5nKCkmJmMhPT1iZChhKXx8dSE9PW51bGwmJnQhPT1udWxsJiYoIXQuY29sbGFwc2VkfHx0LnN0YXJ0Q29udGFpbmVyIT09dS5hbmNob3JOb2RlfHx0LnN0YXJ0T2Zmc2V0IT09dS5hbmNob3JPZmZzZXQpfHxzLmdldEZvcm1hdCgpIT09ZS5mb3JtYXR8fHMuZ2V0U3R5bGUoKSE9PWUuc3R5bGV8fHJPKGUscyl9ZnVuY3Rpb24gQjAoZSx0KXtyZXR1cm4gZSE9PW51bGwmJmUubm9kZVZhbHVlIT09bnVsbCYmZS5ub2RlVHlwZT09PTMmJnQhPT0wJiZ0IT09ZS5ub2RlVmFsdWUubGVuZ3RofWZ1bmN0aW9uIFUwKGUsdCxuKXtsZXR7YW5jaG9yTm9kZTpyLGFuY2hvck9mZnNldDppLGZvY3VzTm9kZTpvLGZvY3VzT2Zmc2V0Omx9PWU7eW0mJih5bT0hMSxCMChyLGkpJiZCMChvLGwpKXx8V24odCwoKT0+e2lmKCFuKVdyKG51bGwpO2Vsc2UgaWYoTXUodCxyLG8pKXt2YXIgcz1ydCgpO2lmKG1lKHMpKXt2YXIgYT1zLmFuY2hvcix1PWEuZ2V0Tm9kZSgpO2lmKHMuaXNDb2xsYXBzZWQoKSl7ZS50eXBlPT09IlJhbmdlIiYmZS5hbmNob3JOb2RlPT09ZS5mb2N1c05vZGUmJihzLmRpcnR5PSEwKTt2YXIgYz1UZih0KS5ldmVudDtjPWM/Yy50aW1lU3RhbXA6cGVyZm9ybWFuY2Uubm93KCk7bGV0W2QsZixoLG0sZ109dkU7YzxnKzIwMCYmYS5vZmZzZXQ9PT1oJiZhLmtleT09PW0/KHMuZm9ybWF0PWQscy5zdHlsZT1mKTphLnR5cGU9PT0idGV4dCI/KHMuZm9ybWF0PXUuZ2V0Rm9ybWF0KCkscy5zdHlsZT11LmdldFN0eWxlKCkpOmEudHlwZT09PSJlbGVtZW50IiYmKHMuZm9ybWF0PTAscy5zdHlsZT0iIil9ZWxzZXthPTI1NSx1PSExLGM9cy5nZXROb2RlcygpO2xldCBkPWMubGVuZ3RoO2ZvcihsZXQgZj0wO2Y8ZDtmKyspe2xldCBoPWNbZl07aWYoSihoKSYmKHU9ITAsYSY9aC5nZXRGb3JtYXQoKSxhPT09MCkpYnJlYWt9cy5mb3JtYXQ9dT9hOjB9fVgodCxDZix2b2lkIDApfX0pfWZ1bmN0aW9uIGxPKGUsdCl7V24odCwoKT0+e2xldCBuPXJ0KCk7dmFyIHI9WHIodC5fd2luZG93KTtsZXQgaT1UcygpO2lmKHIpaWYobWUobikpe2xldCBsPW4uYW5jaG9yO3ZhciBvPWwuZ2V0Tm9kZSgpO2wudHlwZT09PSJlbGVtZW50IiYmbC5vZmZzZXQ9PT0wJiZuLmlzQ29sbGFwc2VkKCkmJiFtbihvKSYmWXIoKS5nZXRDaGlsZHJlblNpemUoKT09PTEmJm8uZ2V0VG9wTGV2ZWxFbGVtZW50T3JUaHJvdygpLmlzRW1wdHkoKSYmaSE9PW51bGwmJm4uaXMoaSk/KHIucmVtb3ZlQWxsUmFuZ2VzKCksbi5kaXJ0eT0hMCk6ZS5kZXRhaWwhPT0zfHxuLmlzQ29sbGFwc2VkKCl8fChyPW4uZm9jdXMuZ2V0Tm9kZSgpLG8hPT1yJiYoQihvKT9vLnNlbGVjdCgwKTpvLmdldFBhcmVudE9yVGhyb3coKS5zZWxlY3QoMCkpKX1lbHNlIGUucG9pbnRlclR5cGU9PT0idG91Y2giJiYobz1yLmFuY2hvck5vZGUsbyE9PW51bGwmJihvPW8ubm9kZVR5cGUsbz09PTF8fG89PT0zKSkmJihyPXh2KGkscix0KSxXcihyKSk7WCh0LGJTLGUpfSl9ZnVuY3Rpb24gc08oZSx0KXtsZXQgbj1lLnRhcmdldDtlPWUucG9pbnRlclR5cGUsbiBpbnN0YW5jZW9mIE5vZGUmJmUhPT0idG91Y2giJiZXbih0LCgpPT57dHQoRHUobikpfHwoeG09ITApfSl9ZnVuY3Rpb24geEUoZSl7cmV0dXJuIGUuZ2V0VGFyZ2V0UmFuZ2VzPyhlPWUuZ2V0VGFyZ2V0UmFuZ2VzKCksZS5sZW5ndGg9PT0wP251bGw6ZVswXSk6bnVsbH1mdW5jdGlvbiBhTyhlLHQpe3JldHVybiBlIT09dHx8QihlKXx8Qih0KXx8IWUuaXNUb2tlbigpfHwhdC5pc1Rva2VuKCl9ZnVuY3Rpb24gdU8oZSx0KXtsZXQgbj1lLmlucHV0VHlwZSxyPXhFKGUpO249PT0iZGVsZXRlQ29tcG9zaXRpb25UZXh0Inx8cm8mJmlFKHQpfHxuIT09Imluc2VydENvbXBvc2l0aW9uVGV4dCImJlduKHQsKCk9PntsZXQgaT1ydCgpO2lmKG49PT0iZGVsZXRlQ29udGVudEJhY2t3YXJkIil7aWYoaT09PW51bGwpe3ZhciBvPVRzKCk7aWYoIW1lKG8pKXJldHVybjtXcihvLmNsb25lKCkpfWlmKG1lKGkpKXttRT09PTIyOSYmZS50aW1lU3RhbXA8aXUrMzAmJnQuaXNDb21wb3NpbmcoKSYmaS5hbmNob3Iua2V5PT09aS5mb2N1cy5rZXk/KEt0KG51bGwpLGl1PTAsc2V0VGltZW91dCgoKT0+e1duKHQsKCk9PntLdChudWxsKX0pfSwzMCksbWUoaSkmJihvPWkuYW5jaG9yLmdldE5vZGUoKSxvLm1hcmtEaXJ0eSgpLGkuZm9ybWF0PW8uZ2V0Rm9ybWF0KCksaS5zdHlsZT1vLmdldFN0eWxlKCkpKTooZS5wcmV2ZW50RGVmYXVsdCgpLFgodCxxYSwhMCkpO3JldHVybn19aWYobWUoaSkpe289ZS5kYXRhLENsIT09bnVsbCYmcHYoITEsdCxDbCksaS5kaXJ0eSYmQ2w9PT1udWxsfHwhaS5pc0NvbGxhcHNlZCgpfHxtbihpLmFuY2hvci5nZXROb2RlKCkpfHxyPT09bnVsbHx8aS5hcHBseURPTVJhbmdlKHIpLENsPW51bGw7dmFyIGw9aS5mb2N1cyxzPWkuYW5jaG9yLmdldE5vZGUoKTtpZihsPWwuZ2V0Tm9kZSgpLG49PT0iaW5zZXJ0VGV4dCJ8fG49PT0iaW5zZXJ0VHJhbnNwb3NlIilvPT09YApgPyhlLnByZXZlbnREZWZhdWx0KCksWCh0LENhLCExKSk6bz09PWAKCmA/KGUucHJldmVudERlZmF1bHQoKSxYKHQsaW0sdm9pZCAwKSk6bz09bnVsbCYmZS5kYXRhVHJhbnNmZXI/KG89ZS5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgidGV4dC9wbGFpbiIpLGUucHJldmVudERlZmF1bHQoKSxpLmluc2VydFJhd1RleHQobykpOm8hPW51bGwmJnlFKGkscixvLGUudGltZVN0YW1wLCEwKT8oZS5wcmV2ZW50RGVmYXVsdCgpLFgodCxHbCxvKSk6Q2w9byxnRT1lLnRpbWVTdGFtcDtlbHNlIHN3aXRjaChlLnByZXZlbnREZWZhdWx0KCksbil7Y2FzZSJpbnNlcnRGcm9tWWFuayI6Y2FzZSJpbnNlcnRGcm9tRHJvcCI6Y2FzZSJpbnNlcnRSZXBsYWNlbWVudFRleHQiOlgodCxHbCxlKTticmVhaztjYXNlImluc2VydEZyb21Db21wb3NpdGlvbiI6S3QobnVsbCksWCh0LEdsLGUpO2JyZWFrO2Nhc2UiaW5zZXJ0TGluZUJyZWFrIjpLdChudWxsKSxYKHQsQ2EsITEpO2JyZWFrO2Nhc2UiaW5zZXJ0UGFyYWdyYXBoIjpLdChudWxsKSxiYSYmIWtmPyhiYT0hMSxYKHQsQ2EsITEpKTpYKHQsaW0sdm9pZCAwKTticmVhaztjYXNlImluc2VydEZyb21QYXN0ZSI6Y2FzZSJpbnNlcnRGcm9tUGFzdGVBc1F1b3RhdGlvbiI6WCh0LG52LGUpO2JyZWFrO2Nhc2UiZGVsZXRlQnlDb21wb3NpdGlvbiI6YU8ocyxsKSYmWCh0LG9tLGUpO2JyZWFrO2Nhc2UiZGVsZXRlQnlEcmFnIjpjYXNlImRlbGV0ZUJ5Q3V0IjpYKHQsb20sZSk7YnJlYWs7Y2FzZSJkZWxldGVDb250ZW50IjpYKHQscWEsITEpO2JyZWFrO2Nhc2UiZGVsZXRlV29yZEJhY2t3YXJkIjpYKHQsZXUsITApO2JyZWFrO2Nhc2UiZGVsZXRlV29yZEZvcndhcmQiOlgodCxldSwhMSk7YnJlYWs7Y2FzZSJkZWxldGVIYXJkTGluZUJhY2t3YXJkIjpjYXNlImRlbGV0ZVNvZnRMaW5lQmFja3dhcmQiOlgodCx0dSwhMCk7YnJlYWs7Y2FzZSJkZWxldGVDb250ZW50Rm9yd2FyZCI6Y2FzZSJkZWxldGVIYXJkTGluZUZvcndhcmQiOmNhc2UiZGVsZXRlU29mdExpbmVGb3J3YXJkIjpYKHQsdHUsITEpO2JyZWFrO2Nhc2UiZm9ybWF0U3RyaWtlVGhyb3VnaCI6WCh0LFVpLCJzdHJpa2V0aHJvdWdoIik7YnJlYWs7Y2FzZSJmb3JtYXRCb2xkIjpYKHQsVWksImJvbGQiKTticmVhaztjYXNlImZvcm1hdEl0YWxpYyI6WCh0LFVpLCJpdGFsaWMiKTticmVhaztjYXNlImZvcm1hdFVuZGVybGluZSI6WCh0LFVpLCJ1bmRlcmxpbmUiKTticmVhaztjYXNlImhpc3RvcnlVbmRvIjpYKHQscnYsdm9pZCAwKTticmVhaztjYXNlImhpc3RvcnlSZWRvIjpYKHQsaXYsdm9pZCAwKX19fSl9ZnVuY3Rpb24gY08oZSx0KXtlLnN0b3BQcm9wYWdhdGlvbigpLFduKHQsKCk9Pnt2YXIgbj1ydCgpLHI9ZS5kYXRhLGk9eEUoZSk7aWYociE9bnVsbCYmbWUobikmJnlFKG4saSxyLGUudGltZVN0YW1wLCExKSl7dWEmJihfbSh0LHIpLHVhPSExKTt2YXIgbz1uLmFuY2hvcixsPW8uZ2V0Tm9kZSgpO2lmKGk9WHIodC5fd2luZG93KSxpPT09bnVsbClyZXR1cm47bGV0IHM9by5vZmZzZXQ7KG89JGQmJiFuLmlzQ29sbGFwc2VkKCkmJkoobCkmJmkuYW5jaG9yTm9kZSE9PW51bGwpJiYobD1sLmdldFRleHRDb250ZW50KCkuc2xpY2UoMCxzKStyK2wuZ2V0VGV4dENvbnRlbnQoKS5zbGljZShzK24uZm9jdXMub2Zmc2V0KSxpPWkuYW5jaG9yTm9kZSxvPWw9PT0oaS5ub2RlVHlwZT09PTM/aS5ub2RlVmFsdWU6bnVsbCkpLG98fFgodCxHbCxyKSxyPXIubGVuZ3RoLHJvJiYxPHImJmUuaW5wdXRUeXBlPT09Imluc2VydENvbXBvc2l0aW9uVGV4dCImJiF0LmlzQ29tcG9zaW5nKCkmJihuLmFuY2hvci5vZmZzZXQtPXIpLHN2fHxrZnx8YXZ8fCF0LmlzQ29tcG9zaW5nKCl8fChpdT0wLEt0KG51bGwpKX1lbHNlIHB2KCExLHQsciE9PW51bGw/cjp2b2lkIDApLHVhJiYoX20odCxyfHx2b2lkIDApLHVhPSExKTtobigpLG49cHQoKSxHUyhuKX0pLENsPW51bGx9ZnVuY3Rpb24gZE8oZSx0KXtXbih0LCgpPT57bGV0IG49cnQoKTtpZihtZShuKSYmIXQuaXNDb21wb3NpbmcoKSl7bGV0IHI9bi5hbmNob3IsaT1uLmFuY2hvci5nZXROb2RlKCk7S3Qoci5rZXkpLChlLnRpbWVTdGFtcDxpdSszMHx8ci50eXBlPT09ImVsZW1lbnQifHwhbi5pc0NvbGxhcHNlZCgpfHxpLmdldEZvcm1hdCgpIT09bi5mb3JtYXR8fGkuZ2V0U3R5bGUoKSE9PW4uc3R5bGUpJiZYKHQsR2wsSFIpfX0pfWZ1bmN0aW9uIF9tKGUsdCl7dmFyIG49ZS5fY29tcG9zaXRpb25LZXk7aWYoS3QobnVsbCksbiE9PW51bGwmJnQhPW51bGwpe2lmKHQ9PT0iIil7dD1MdChuKSxlPWJkKGUuZ2V0RWxlbWVudEJ5S2V5KG4pKSxlIT09bnVsbCYmZS5ub2RlVmFsdWUhPT1udWxsJiZKKHQpJiZtdih0LGUubm9kZVZhbHVlLG51bGwsbnVsbCwhMCk7cmV0dXJufWlmKHRbdC5sZW5ndGgtMV09PT1gCmAmJihuPXJ0KCksbWUobikpKXt0PW4uZm9jdXMsbi5hbmNob3Iuc2V0KHQua2V5LHQub2Zmc2V0LHQudHlwZSksWChlLGtkLG51bGwpO3JldHVybn19cHYoITAsZSx0KX1mdW5jdGlvbiBmTyhlLHQpe3JvP3VhPSEwOlduKHQsKCk9PntfbSh0LGUuZGF0YSl9KX1mdW5jdGlvbiBoTyhlLHQpe2lmKGl1PWUudGltZVN0YW1wLG1FPWUua2V5Q29kZSwhdC5pc0NvbXBvc2luZygpKXt2YXJ7a2V5Q29kZTpuLHNoaWZ0S2V5OnIsY3RybEtleTppLG1ldGFLZXk6byxhbHRLZXk6bH09ZTtpZighWCh0LFRTLGUpKXtpZihuIT09Mzl8fGl8fG98fGwpaWYobiE9PTM5fHxsfHxyfHwhaSYmIW8paWYobiE9PTM3fHxpfHxvfHxsKWlmKG4hPT0zN3x8bHx8cnx8IWkmJiFvKWlmKG4hPT0zOHx8aXx8bylpZihuIT09NDB8fGl8fG8paWYobj09PTEzJiZyKWJhPSEwLFgodCxrZCxlKTtlbHNlIGlmKG49PT0zMilYKHQsRFMsZSk7ZWxzZSBpZihRdCYmaSYmbj09PTc5KWUucHJldmVudERlZmF1bHQoKSxiYT0hMCxYKHQsQ2EsITApO2Vsc2UgaWYobiE9PTEzfHxyKXt2YXIgcz1RdD9sfHxvPyExOm49PT04fHxuPT09NzImJmk6aXx8bHx8bz8hMTpuPT09ODtzP249PT04P1godCxJUyxlKTooZS5wcmV2ZW50RGVmYXVsdCgpLFgodCxxYSwhMCkpOm49PT0yNz9YKHQsTFMsZSk6KHM9UXQ/cnx8bHx8bz8hMTpuPT09NDZ8fG49PT02OCYmaTppfHxsfHxvPyExOm49PT00NixzP249PT00Nj9YKHQsalMsZSk6KGUucHJldmVudERlZmF1bHQoKSxYKHQscWEsITEpKTpuPT09OCYmKFF0P2w6aSk/KGUucHJldmVudERlZmF1bHQoKSxYKHQsZXUsITApKTpuPT09NDYmJihRdD9sOmkpPyhlLnByZXZlbnREZWZhdWx0KCksWCh0LGV1LCExKSk6UXQmJm8mJm49PT04PyhlLnByZXZlbnREZWZhdWx0KCksWCh0LHR1LCEwKSk6UXQmJm8mJm49PT00Nj8oZS5wcmV2ZW50RGVmYXVsdCgpLFgodCx0dSwhMSkpOm49PT02NiYmIWwmJihRdD9vOmkpPyhlLnByZXZlbnREZWZhdWx0KCksWCh0LFVpLCJib2xkIikpOm49PT04NSYmIWwmJihRdD9vOmkpPyhlLnByZXZlbnREZWZhdWx0KCksWCh0LFVpLCJ1bmRlcmxpbmUiKSk6bj09PTczJiYhbCYmKFF0P286aSk/KGUucHJldmVudERlZmF1bHQoKSxYKHQsVWksIml0YWxpYyIpKTpuIT09OXx8bHx8aXx8bz9uPT09OTAmJiFyJiYoUXQ/bzppKT8oZS5wcmV2ZW50RGVmYXVsdCgpLFgodCxydix2b2lkIDApKToocz1RdD9uPT09OTAmJm8mJnI6bj09PTg5JiZpfHxuPT09OTAmJmkmJnIscz8oZS5wcmV2ZW50RGVmYXVsdCgpLFgodCxpdix2b2lkIDApKTpicyh0Ll9lZGl0b3JTdGF0ZS5fc2VsZWN0aW9uKT8ocz1yPyExOm49PT02Nz9RdD9vOmk6ITEscz8oZS5wcmV2ZW50RGVmYXVsdCgpLFgodCxvdixlKSk6KHM9cj8hMTpuPT09ODg/UXQ/bzppOiExLHM/KGUucHJldmVudERlZmF1bHQoKSxYKHQsbHYsZSkpOm49PT02NSYmKFF0P286aSkmJihlLnByZXZlbnREZWZhdWx0KCksWCh0LGxtLGUpKSkpOiFybyYmbj09PTY1JiYoUXQ/bzppKSYmKGUucHJldmVudERlZmF1bHQoKSxYKHQsbG0sZSkpKTpYKHQselMsZSkpfWVsc2UgYmE9ITEsWCh0LGtkLGUpO2Vsc2UgWCh0LE1TLGUpO2Vsc2UgWCh0LEFTLGUpO2Vsc2UgWCh0LFBTLGUpO2Vsc2UgWCh0LE9TLGUpO2Vsc2UgWCh0LFJTLGUpO2Vsc2UgWCh0LE5TLGUpOyhpfHxyfHxsfHxvKSYmWCh0LEtTLGUpfX19ZnVuY3Rpb24gX0UoZSl7bGV0IHQ9ZS5fX2xleGljYWxFdmVudEhhbmRsZXM7cmV0dXJuIHQ9PT12b2lkIDAmJih0PVtdLGUuX19sZXhpY2FsRXZlbnRIYW5kbGVzPXQpLHR9bGV0IFlsPW5ldyBNYXA7ZnVuY3Rpb24gd0UoZSl7ZT1lLnRhcmdldDtsZXQgdD1YcihlPT1udWxsP251bGw6ZS5ub2RlVHlwZT09PTk/ZS5kZWZhdWx0VmlldzplLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpO2lmKHQhPT1udWxsKXt2YXIgbj1mdih0LmFuY2hvck5vZGUpO2lmKG4hPT1udWxsKXt4bSYmKHhtPSExLFduKG4sKCk9Pnt2YXIgbD1UcygpLHM9dC5hbmNob3JOb2RlO3MhPT1udWxsJiYocz1zLm5vZGVUeXBlLHM9PT0xfHxzPT09MykmJihsPXh2KGwsdCxuKSxXcihsKSl9KSksZT1odihuKSxlPWVbZS5sZW5ndGgtMV07dmFyIHI9ZS5fa2V5LGk9WWwuZ2V0KHIpLG89aXx8ZTtvIT09biYmVTAodCxvLCExKSxVMCh0LG4sITApLG4hPT1lP1lsLnNldChyLG4pOmkmJllsLmRlbGV0ZShyKX19fWZ1bmN0aW9uIHBPKGUsdCl7JGE9PT0wJiZlLm93bmVyRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIix3RSksJGErKyxlLl9fbGV4aWNhbEVkaXRvcj10O2xldCBuPV9FKGUpO2ZvcihsZXQgcj0wO3I8dm0ubGVuZ3RoO3IrKyl7bGV0W2ksb109dm1bcl0sbD10eXBlb2Ygbz09ImZ1bmN0aW9uIj9zPT57cy5fbGV4aWNhbEhhbmRsZWQhPT0hMCYmKHMuX2xleGljYWxIYW5kbGVkPSEwLHQuaXNFZGl0YWJsZSgpJiZvKHMsdCkpfTpzPT57aWYocy5fbGV4aWNhbEhhbmRsZWQhPT0hMCYmKHMuX2xleGljYWxIYW5kbGVkPSEwLHQuaXNFZGl0YWJsZSgpKSlzd2l0Y2goaSl7Y2FzZSJjdXQiOnJldHVybiBYKHQsbHYscyk7Y2FzZSJjb3B5IjpyZXR1cm4gWCh0LG92LHMpO2Nhc2UicGFzdGUiOnJldHVybiBYKHQsbnYscyk7Y2FzZSJkcmFnc3RhcnQiOnJldHVybiBYKHQsQlMscyk7Y2FzZSJkcmFnb3ZlciI6cmV0dXJuIFgodCxVUyxzKTtjYXNlImRyYWdlbmQiOnJldHVybiBYKHQsV1Mscyk7Y2FzZSJmb2N1cyI6cmV0dXJuIFgodCxWUyxzKTtjYXNlImJsdXIiOnJldHVybiBYKHQsSFMscyk7Y2FzZSJkcm9wIjpyZXR1cm4gWCh0LEZTLHMpfX07ZS5hZGRFdmVudExpc3RlbmVyKGksbCksbi5wdXNoKCgpPT57ZS5yZW1vdmVFdmVudExpc3RlbmVyKGksbCl9KX19ZnVuY3Rpb24gd20oZSx0LG4pe2huKCk7dmFyIHI9ZS5fX2tleTtsZXQgaT1lLmdldFBhcmVudCgpO2lmKGkhPT1udWxsKXt2YXIgbz1ydCgpO2lmKG1lKG8pJiZCKGUpKXt2YXJ7YW5jaG9yOmwsZm9jdXM6c309byxhPWwuZ2V0Tm9kZSgpLHU9cy5nZXROb2RlKCk7T2QoYSxlKSYmbC5zZXQoZS5fX2tleSwwLCJlbGVtZW50IiksT2QodSxlKSYmcy5zZXQoZS5fX2tleSwwLCJlbGVtZW50Iil9aWYoYT1vLHU9ITEsbWUoYSkmJnQpe289YS5hbmNob3I7bGV0IGM9YS5mb2N1cztvLmtleT09PXImJihEZChvLGUsaSxlLmdldFByZXZpb3VzU2libGluZygpLGUuZ2V0TmV4dFNpYmxpbmcoKSksdT0hMCksYy5rZXk9PT1yJiYoRGQoYyxlLGksZS5nZXRQcmV2aW91c1NpYmxpbmcoKSxlLmdldE5leHRTaWJsaW5nKCkpLHU9ITApfWVsc2UgYnMoYSkmJnQmJmUuaXNTZWxlY3RlZCgpJiZlLnNlbGVjdFByZXZpb3VzKCk7bWUoYSkmJnQmJiF1PyhyPWUuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxGbyhlKSxNZChhLGksciwtMSkpOkZvKGUpLG58fHhyKGkpfHxpLmNhbkJlRW1wdHkoKXx8IWkuaXNFbXB0eSgpfHx3bShpLHQpLHQmJm1uKGkpJiZpLmlzRW1wdHkoKSYmaS5zZWxlY3RFbmQoKX19Y2xhc3MgTHV7c3RhdGljIGdldFR5cGUoKXtIKDY0LHRoaXMubmFtZSl9c3RhdGljIGNsb25lKCl7SCg2NSx0aGlzLm5hbWUpfWNvbnN0cnVjdG9yKHQpe3RoaXMuX190eXBlPXRoaXMuY29uc3RydWN0b3IuZ2V0VHlwZSgpLHRoaXMuX19uZXh0PXRoaXMuX19wcmV2PXRoaXMuX19wYXJlbnQ9bnVsbCxxUyh0aGlzLHQpfWdldFR5cGUoKXtyZXR1cm4gdGhpcy5fX3R5cGV9aXNBdHRhY2hlZCgpe2Zvcih2YXIgdD10aGlzLl9fa2V5O3QhPT1udWxsOyl7aWYodD09PSJyb290IilyZXR1cm4hMDtpZih0PUx0KHQpLHQ9PT1udWxsKWJyZWFrO3Q9dC5fX3BhcmVudH1yZXR1cm4hMX1pc1NlbGVjdGVkKHQpe2lmKHQ9dHx8cnQoKSx0PT1udWxsKXJldHVybiExO2xldCBuPXQuZ2V0Tm9kZXMoKS5zb21lKHI9PnIuX19rZXk9PT10aGlzLl9fa2V5KTtyZXR1cm4gSih0aGlzKT9uOm1lKHQpJiZ0LmFuY2hvci50eXBlPT09ImVsZW1lbnQiJiZ0LmZvY3VzLnR5cGU9PT0iZWxlbWVudCImJnQuYW5jaG9yLmtleT09PXQuZm9jdXMua2V5JiZ0LmFuY2hvci5vZmZzZXQ9PT10LmZvY3VzLm9mZnNldD8hMTpufWdldEtleSgpe3JldHVybiB0aGlzLl9fa2V5fWdldEluZGV4V2l0aGluUGFyZW50KCl7dmFyIHQ9dGhpcy5nZXRQYXJlbnQoKTtpZih0PT09bnVsbClyZXR1cm4tMTt0PXQuZ2V0Rmlyc3RDaGlsZCgpO2xldCBuPTA7Zm9yKDt0IT09bnVsbDspe2lmKHRoaXMuaXModCkpcmV0dXJuIG47bisrLHQ9dC5nZXROZXh0U2libGluZygpfXJldHVybi0xfWdldFBhcmVudCgpe2xldCB0PXRoaXMuZ2V0TGF0ZXN0KCkuX19wYXJlbnQ7cmV0dXJuIHQ9PT1udWxsP251bGw6THQodCl9Z2V0UGFyZW50T3JUaHJvdygpe2xldCB0PXRoaXMuZ2V0UGFyZW50KCk7cmV0dXJuIHQ9PT1udWxsJiZIKDY2LHRoaXMuX19rZXkpLHR9Z2V0VG9wTGV2ZWxFbGVtZW50KCl7bGV0IHQ9dGhpcztmb3IoO3QhPT1udWxsOyl7bGV0IG49dC5nZXRQYXJlbnQoKTtpZih4cihuKSlyZXR1cm4gdDt0PW59cmV0dXJuIG51bGx9Z2V0VG9wTGV2ZWxFbGVtZW50T3JUaHJvdygpe2xldCB0PXRoaXMuZ2V0VG9wTGV2ZWxFbGVtZW50KCk7cmV0dXJuIHQ9PT1udWxsJiZIKDY3LHRoaXMuX19rZXkpLHR9Z2V0UGFyZW50cygpe2xldCB0PVtdLG49dGhpcy5nZXRQYXJlbnQoKTtmb3IoO24hPT1udWxsOyl0LnB1c2gobiksbj1uLmdldFBhcmVudCgpO3JldHVybiB0fWdldFBhcmVudEtleXMoKXtsZXQgdD1bXSxuPXRoaXMuZ2V0UGFyZW50KCk7Zm9yKDtuIT09bnVsbDspdC5wdXNoKG4uX19rZXkpLG49bi5nZXRQYXJlbnQoKTtyZXR1cm4gdH1nZXRQcmV2aW91c1NpYmxpbmcoKXtsZXQgdD10aGlzLmdldExhdGVzdCgpLl9fcHJldjtyZXR1cm4gdD09PW51bGw/bnVsbDpMdCh0KX1nZXRQcmV2aW91c1NpYmxpbmdzKCl7bGV0IHQ9W107dmFyIG49dGhpcy5nZXRQYXJlbnQoKTtpZihuPT09bnVsbClyZXR1cm4gdDtmb3Iobj1uLmdldEZpcnN0Q2hpbGQoKTtuIT09bnVsbCYmIW4uaXModGhpcyk7KXQucHVzaChuKSxuPW4uZ2V0TmV4dFNpYmxpbmcoKTtyZXR1cm4gdH1nZXROZXh0U2libGluZygpe2xldCB0PXRoaXMuZ2V0TGF0ZXN0KCkuX19uZXh0O3JldHVybiB0PT09bnVsbD9udWxsOkx0KHQpfWdldE5leHRTaWJsaW5ncygpe2xldCB0PVtdLG49dGhpcy5nZXROZXh0U2libGluZygpO2Zvcig7biE9PW51bGw7KXQucHVzaChuKSxuPW4uZ2V0TmV4dFNpYmxpbmcoKTtyZXR1cm4gdH1nZXRDb21tb25BbmNlc3Rvcih0KXtsZXQgbj10aGlzLmdldFBhcmVudHMoKTt2YXIgcj10LmdldFBhcmVudHMoKTtCKHRoaXMpJiZuLnVuc2hpZnQodGhpcyksQih0KSYmci51bnNoaWZ0KHQpLHQ9bi5sZW5ndGg7dmFyIGk9ci5sZW5ndGg7aWYodD09PTB8fGk9PT0wfHxuW3QtMV0hPT1yW2ktMV0pcmV0dXJuIG51bGw7Zm9yKHI9bmV3IFNldChyKSxpPTA7aTx0O2krKyl7bGV0IG89bltpXTtpZihyLmhhcyhvKSlyZXR1cm4gb31yZXR1cm4gbnVsbH1pcyh0KXtyZXR1cm4gdD09bnVsbD8hMTp0aGlzLl9fa2V5PT09dC5fX2tleX1pc0JlZm9yZSh0KXtpZih0aGlzPT09dClyZXR1cm4hMTtpZih0LmlzUGFyZW50T2YodGhpcykpcmV0dXJuITA7aWYodGhpcy5pc1BhcmVudE9mKHQpKXJldHVybiExO3ZhciBuPXRoaXMuZ2V0Q29tbW9uQW5jZXN0b3IodCk7bGV0IHI9dGhpcztmb3IoOzspe3ZhciBpPXIuZ2V0UGFyZW50T3JUaHJvdygpO2lmKGk9PT1uKXtpPXIuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKTticmVha31yPWl9Zm9yKHI9dDs7KXtpZih0PXIuZ2V0UGFyZW50T3JUaHJvdygpLHQ9PT1uKXtuPXIuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKTticmVha31yPXR9cmV0dXJuIGk8bn1pc1BhcmVudE9mKHQpe2xldCBuPXRoaXMuX19rZXk7aWYobj09PXQuX19rZXkpcmV0dXJuITE7Zm9yKDt0IT09bnVsbDspe2lmKHQuX19rZXk9PT1uKXJldHVybiEwO3Q9dC5nZXRQYXJlbnQoKX1yZXR1cm4hMX1nZXROb2Rlc0JldHdlZW4odCl7bGV0IG49dGhpcy5pc0JlZm9yZSh0KSxyPVtdLGk9bmV3IFNldDtmb3IodmFyIG89dGhpczs7KXt2YXIgbD1vLl9fa2V5O2lmKGkuaGFzKGwpfHwoaS5hZGQobCksci5wdXNoKG8pKSxvPT09dClicmVhaztpZihsPUIobyk/bj9vLmdldEZpcnN0Q2hpbGQoKTpvLmdldExhc3RDaGlsZCgpOm51bGwsbCE9PW51bGwpbz1sO2Vsc2UgaWYobD1uP28uZ2V0TmV4dFNpYmxpbmcoKTpvLmdldFByZXZpb3VzU2libGluZygpLGwhPT1udWxsKW89bDtlbHNle2lmKG89by5nZXRQYXJlbnRPclRocm93KCksaS5oYXMoby5fX2tleSl8fHIucHVzaChvKSxvPT09dClicmVhaztsPW87ZG8gbD09PW51bGwmJkgoNjgpLG89bj9sLmdldE5leHRTaWJsaW5nKCk6bC5nZXRQcmV2aW91c1NpYmxpbmcoKSxsPWwuZ2V0UGFyZW50KCksbCE9PW51bGwmJihvIT09bnVsbHx8aS5oYXMobC5fX2tleSl8fHIucHVzaChsKSk7d2hpbGUobz09PW51bGwpfX1yZXR1cm4gbnx8ci5yZXZlcnNlKCkscn1pc0RpcnR5KCl7bGV0IHQ9cHQoKS5fZGlydHlMZWF2ZXM7cmV0dXJuIHQhPT1udWxsJiZ0Lmhhcyh0aGlzLl9fa2V5KX1nZXRMYXRlc3QoKXtsZXQgdD1MdCh0aGlzLl9fa2V5KTtyZXR1cm4gdD09PW51bGwmJkgoMTEzKSx0fWdldFdyaXRhYmxlKCl7aG4oKTt2YXIgdD1RcigpLG49cHQoKTt0PXQuX25vZGVNYXA7bGV0IHI9dGhpcy5fX2tleSxpPXRoaXMuZ2V0TGF0ZXN0KCksbz1pLl9fcGFyZW50O249bi5fY2xvbmVOb3ROZWVkZWQ7dmFyIGw9cnQoKTtyZXR1cm4gbCE9PW51bGwmJihsLl9jYWNoZWROb2Rlcz1udWxsKSxuLmhhcyhyKT8oVGQoaSksaSk6KGw9aS5jb25zdHJ1Y3Rvci5jbG9uZShpKSxsLl9fcGFyZW50PW8sbC5fX25leHQ9aS5fX25leHQsbC5fX3ByZXY9aS5fX3ByZXYsQihpKSYmQihsKT8obC5fX2ZpcnN0PWkuX19maXJzdCxsLl9fbGFzdD1pLl9fbGFzdCxsLl9fc2l6ZT1pLl9fc2l6ZSxsLl9faW5kZW50PWkuX19pbmRlbnQsbC5fX2Zvcm1hdD1pLl9fZm9ybWF0LGwuX19kaXI9aS5fX2Rpcik6SihpKSYmSihsKSYmKGwuX19mb3JtYXQ9aS5fX2Zvcm1hdCxsLl9fc3R5bGU9aS5fX3N0eWxlLGwuX19tb2RlPWkuX19tb2RlLGwuX19kZXRhaWw9aS5fX2RldGFpbCksbi5hZGQociksbC5fX2tleT1yLFRkKGwpLHQuc2V0KHIsbCksbCl9Z2V0VGV4dENvbnRlbnQoKXtyZXR1cm4iIn1nZXRUZXh0Q29udGVudFNpemUoKXtyZXR1cm4gdGhpcy5nZXRUZXh0Q29udGVudCgpLmxlbmd0aH1jcmVhdGVET00oKXtIKDcwKX11cGRhdGVET00oKXtIKDcxKX1leHBvcnRET00odCl7cmV0dXJue2VsZW1lbnQ6dGhpcy5jcmVhdGVET00odC5fY29uZmlnLHQpfX1leHBvcnRKU09OKCl7SCg3Mil9c3RhdGljIGltcG9ydEpTT04oKXtIKDE4LHRoaXMubmFtZSl9c3RhdGljIHRyYW5zZm9ybSgpe3JldHVybiBudWxsfXJlbW92ZSh0KXt3bSh0aGlzLCEwLHQpfXJlcGxhY2UodCxuKXtobigpO3ZhciByPXJ0KCk7ciE9PW51bGwmJihyPXIuY2xvbmUoKSksUmgodGhpcyx0KTtsZXQgaT10aGlzLmdldExhdGVzdCgpLG89dGhpcy5fX2tleSxsPXQuX19rZXkscz10LmdldFdyaXRhYmxlKCk7dD10aGlzLmdldFBhcmVudE9yVGhyb3coKS5nZXRXcml0YWJsZSgpO2xldCBhPXQuX19zaXplO0ZvKHMpO2xldCB1PWkuZ2V0UHJldmlvdXNTaWJsaW5nKCksYz1pLmdldE5leHRTaWJsaW5nKCksZD1pLl9fcHJldixmPWkuX19uZXh0LGg9aS5fX3BhcmVudDtyZXR1cm4gd20oaSwhMSwhMCksdT09PW51bGw/dC5fX2ZpcnN0PWw6dS5nZXRXcml0YWJsZSgpLl9fbmV4dD1sLHMuX19wcmV2PWQsYz09PW51bGw/dC5fX2xhc3Q9bDpjLmdldFdyaXRhYmxlKCkuX19wcmV2PWwscy5fX25leHQ9ZixzLl9fcGFyZW50PWgsdC5fX3NpemU9YSxuJiZ0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaChtPT57cy5hcHBlbmQobSl9KSxtZShyKSYmKFdyKHIpLG49ci5hbmNob3Iscj1yLmZvY3VzLG4ua2V5PT09byYmSDAobixzKSxyLmtleT09PW8mJkgwKHIscykpLFdpKCk9PT1vJiZLdChsKSxzfWluc2VydEFmdGVyKHQsbj0hMCl7aG4oKSxSaCh0aGlzLHQpO3ZhciByPXRoaXMuZ2V0V3JpdGFibGUoKTtsZXQgaT10LmdldFdyaXRhYmxlKCk7dmFyIG89aS5nZXRQYXJlbnQoKTtsZXQgbD1ydCgpO3ZhciBzPSExLGE9ITE7aWYobyE9PW51bGwpe3ZhciB1PXQuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKTtGbyhpKSxtZShsKSYmKGE9by5fX2tleSxzPWwuYW5jaG9yLG89bC5mb2N1cyxzPXMudHlwZT09PSJlbGVtZW50IiYmcy5rZXk9PT1hJiZzLm9mZnNldD09PXUrMSxhPW8udHlwZT09PSJlbGVtZW50IiYmby5rZXk9PT1hJiZvLm9mZnNldD09PXUrMSl9bz10aGlzLmdldE5leHRTaWJsaW5nKCksdT10aGlzLmdldFBhcmVudE9yVGhyb3coKS5nZXRXcml0YWJsZSgpO2xldCBjPWkuX19rZXksZD1yLl9fbmV4dDtyZXR1cm4gbz09PW51bGw/dS5fX2xhc3Q9YzpvLmdldFdyaXRhYmxlKCkuX19wcmV2PWMsdS5fX3NpemUrKyxyLl9fbmV4dD1jLGkuX19uZXh0PWQsaS5fX3ByZXY9ci5fX2tleSxpLl9fcGFyZW50PXIuX19wYXJlbnQsbiYmbWUobCkmJihuPXRoaXMuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxNZChsLHUsbisxKSxyPXUuX19rZXkscyYmbC5hbmNob3Iuc2V0KHIsbisyLCJlbGVtZW50IiksYSYmbC5mb2N1cy5zZXQocixuKzIsImVsZW1lbnQiKSksdH1pbnNlcnRCZWZvcmUodCxuPSEwKXtobigpLFJoKHRoaXMsdCk7dmFyIHI9dGhpcy5nZXRXcml0YWJsZSgpO2xldCBpPXQuZ2V0V3JpdGFibGUoKSxvPWkuX19rZXk7Rm8oaSk7bGV0IGw9dGhpcy5nZXRQcmV2aW91c1NpYmxpbmcoKSxzPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpLmdldFdyaXRhYmxlKCksYT1yLl9fcHJldix1PXRoaXMuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKTtyZXR1cm4gbD09PW51bGw/cy5fX2ZpcnN0PW86bC5nZXRXcml0YWJsZSgpLl9fbmV4dD1vLHMuX19zaXplKyssci5fX3ByZXY9byxpLl9fcHJldj1hLGkuX19uZXh0PXIuX19rZXksaS5fX3BhcmVudD1yLl9fcGFyZW50LHI9cnQoKSxuJiZtZShyKSYmKG49dGhpcy5nZXRQYXJlbnRPclRocm93KCksTWQocixuLHUpKSx0fWlzUGFyZW50UmVxdWlyZWQoKXtyZXR1cm4hMX1jcmVhdGVQYXJlbnRFbGVtZW50Tm9kZSgpe3JldHVybiBYbygpfXNlbGVjdFByZXZpb3VzKHQsbil7aG4oKTtsZXQgcj10aGlzLmdldFByZXZpb3VzU2libGluZygpLGk9dGhpcy5nZXRQYXJlbnRPclRocm93KCk7cmV0dXJuIHI9PT1udWxsP2kuc2VsZWN0KDAsMCk6QihyKT9yLnNlbGVjdCgpOkoocik/ci5zZWxlY3QodCxuKToodD1yLmdldEluZGV4V2l0aGluUGFyZW50KCkrMSxpLnNlbGVjdCh0LHQpKX1zZWxlY3ROZXh0KHQsbil7aG4oKTtsZXQgcj10aGlzLmdldE5leHRTaWJsaW5nKCksaT10aGlzLmdldFBhcmVudE9yVGhyb3coKTtyZXR1cm4gcj09PW51bGw/aS5zZWxlY3QoKTpCKHIpP3Iuc2VsZWN0KDAsMCk6SihyKT9yLnNlbGVjdCh0LG4pOih0PXIuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxpLnNlbGVjdCh0LHQpKX1tYXJrRGlydHkoKXt0aGlzLmdldFdyaXRhYmxlKCl9fWNsYXNzIGtzIGV4dGVuZHMgTHV7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4ibGluZWJyZWFrIn1zdGF0aWMgY2xvbmUodCl7cmV0dXJuIG5ldyBrcyh0Ll9fa2V5KX1jb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1nZXRUZXh0Q29udGVudCgpe3JldHVybmAKYH1jcmVhdGVET00oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKX11cGRhdGVET00oKXtyZXR1cm4hMX1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJue2JyOnQ9PntsZXQgbj10LnBhcmVudEVsZW1lbnQscixpO3JldHVybiBuIT09bnVsbCYmKChyPW4uZmlyc3RDaGlsZCk9PT10fHxyLm5leHRTaWJsaW5nPT09dCYmci5ub2RlVHlwZT09PTMmJihyLnRleHRDb250ZW50fHwiIikubWF0Y2goL14oIHxcdHxccj9cbikrJC8pIT09bnVsbCkmJigoaT1uLmxhc3RDaGlsZCk9PT10fHxpLnByZXZpb3VzU2libGluZz09PXQmJmkubm9kZVR5cGU9PT0zJiYoaS50ZXh0Q29udGVudHx8IiIpLm1hdGNoKC9eKCB8XHR8XHI/XG4pKyQvKSE9PW51bGwpP251bGw6e2NvbnZlcnNpb246bU8scHJpb3JpdHk6MH19fX1zdGF0aWMgaW1wb3J0SlNPTigpe3JldHVybiBjcygpfWV4cG9ydEpTT04oKXtyZXR1cm57dHlwZToibGluZWJyZWFrIix2ZXJzaW9uOjF9fX1mdW5jdGlvbiBtTygpe3JldHVybntub2RlOmNzKCl9fWZ1bmN0aW9uIGNzKCl7cmV0dXJuIEl1KG5ldyBrcyl9ZnVuY3Rpb24gb3UoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBrc31mdW5jdGlvbiBBaChlLHQpe3JldHVybiB0JjE2PyJjb2RlIjp0JjEyOD8ibWFyayI6dCYzMj8ic3ViIjp0JjY0PyJzdXAiOm51bGx9ZnVuY3Rpb24gTWgoZSx0KXtyZXR1cm4gdCYxPyJzdHJvbmciOnQmMj8iZW0iOiJzcGFuIn1mdW5jdGlvbiBEaChlLHQsbixyLGkpe2U9ci5jbGFzc0xpc3Qscj1rYShpLCJiYXNlIiksciE9PXZvaWQgMCYmZS5hZGQoLi4ucikscj1rYShpLCJ1bmRlcmxpbmVTdHJpa2V0aHJvdWdoIik7bGV0IG89ITEsbD10JjgmJnQmNDt2YXIgcz1uJjgmJm4mNDtyIT09dm9pZCAwJiYocz8obz0hMCxsfHxlLmFkZCguLi5yKSk6bCYmZS5yZW1vdmUoLi4ucikpO2ZvcihsZXQgYSBpbiB6bylzPXpvW2FdLHI9a2EoaSxhKSxyIT09dm9pZCAwJiYobiZzPyFvfHxhIT09InVuZGVybGluZSImJmEhPT0ic3RyaWtldGhyb3VnaCI/KCEodCZzKXx8bCYmYT09PSJ1bmRlcmxpbmUifHxhPT09InN0cmlrZXRocm91Z2giKSYmZS5hZGQoLi4ucik6dCZzJiZlLnJlbW92ZSguLi5yKTp0JnMmJmUucmVtb3ZlKC4uLnIpKX1mdW5jdGlvbiBJaChlLHQsbil7bGV0IHI9dC5maXJzdENoaWxkO2lmKG49bi5pc0NvbXBvc2luZygpLGUrPW4/JGY6IiIscj09bnVsbCl0LnRleHRDb250ZW50PWU7ZWxzZSBpZih0PXIubm9kZVZhbHVlLHQhPT1lKWlmKG58fHJvKXtuPXQubGVuZ3RoO2xldCBpPWUubGVuZ3RoLG89MCxsPTA7Zm9yKDtvPG4mJm88aSYmdFtvXT09PWVbb107KW8rKztmb3IoO2wrbzxuJiZsK288aSYmdFtuLWwtMV09PT1lW2ktbC0xXTspbCsrO2U9W28sbi1vLWwsZS5zbGljZShvLGktbCldO2xldFtzLGEsdV09ZTthIT09MCYmci5kZWxldGVEYXRhKHMsYSksci5pbnNlcnREYXRhKHMsdSl9ZWxzZSByLm5vZGVWYWx1ZT1lfWZ1bmN0aW9uIGdjKGUsdCl7cmV0dXJuIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0KSx0LmFwcGVuZENoaWxkKGUpLHR9Y2xhc3Mgc2wgZXh0ZW5kcyBMdXtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJ0ZXh0In1zdGF0aWMgY2xvbmUodCl7cmV0dXJuIG5ldyBzbCh0Ll9fdGV4dCx0Ll9fa2V5KX1jb25zdHJ1Y3Rvcih0LG4pe3N1cGVyKG4pLHRoaXMuX190ZXh0PXQsdGhpcy5fX2Zvcm1hdD0wLHRoaXMuX19zdHlsZT0iIix0aGlzLl9fZGV0YWlsPXRoaXMuX19tb2RlPTB9Z2V0Rm9ybWF0KCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19mb3JtYXR9Z2V0RGV0YWlsKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19kZXRhaWx9Z2V0TW9kZSgpe2xldCB0PXRoaXMuZ2V0TGF0ZXN0KCk7cmV0dXJuIFFSW3QuX19tb2RlXX1nZXRTdHlsZSgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fc3R5bGV9aXNUb2tlbigpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fbW9kZT09PTF9aXNDb21wb3NpbmcoKXtyZXR1cm4gdGhpcy5fX2tleT09PVdpKCl9aXNTZWdtZW50ZWQoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX21vZGU9PT0yfWlzRGlyZWN0aW9ubGVzcygpe3JldHVybih0aGlzLmdldExhdGVzdCgpLl9fZGV0YWlsJjEpIT09MH1pc1VubWVyZ2VhYmxlKCl7cmV0dXJuKHRoaXMuZ2V0TGF0ZXN0KCkuX19kZXRhaWwmMikhPT0wfWhhc0Zvcm1hdCh0KXtyZXR1cm4gdD16b1t0XSwodGhpcy5nZXRGb3JtYXQoKSZ0KSE9PTB9aXNTaW1wbGVUZXh0KCl7cmV0dXJuIHRoaXMuX190eXBlPT09InRleHQiJiZ0aGlzLl9fbW9kZT09PTB9Z2V0VGV4dENvbnRlbnQoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3RleHR9Z2V0Rm9ybWF0RmxhZ3ModCxuKXtsZXQgcj10aGlzLmdldExhdGVzdCgpLl9fZm9ybWF0O3JldHVybiBRUyhyLHQsbil9Y3JlYXRlRE9NKHQpe3ZhciBuPXRoaXMuX19mb3JtYXQscj1BaCh0aGlzLG4pO2xldCBpPU1oKHRoaXMsbiksbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHI9PT1udWxsP2k6ciksbD1vO3JldHVybiB0aGlzLmhhc0Zvcm1hdCgiY29kZSIpJiZvLnNldEF0dHJpYnV0ZSgic3BlbGxjaGVjayIsImZhbHNlIiksciE9PW51bGwmJihsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaSksby5hcHBlbmRDaGlsZChsKSkscj1sLEloKHRoaXMuX190ZXh0LHIsdGhpcyksdD10LnRoZW1lLnRleHQsdCE9PXZvaWQgMCYmRGgoaSwwLG4scix0KSxuPXRoaXMuX19zdHlsZSxuIT09IiImJihvLnN0eWxlLmNzc1RleHQ9biksb311cGRhdGVET00odCxuLHIpe2xldCBpPXRoaXMuX190ZXh0O3ZhciBvPXQuX19mb3JtYXQsbD10aGlzLl9fZm9ybWF0LHM9QWgodGhpcyxvKTtsZXQgYT1BaCh0aGlzLGwpO3ZhciB1PU1oKHRoaXMsbyk7bGV0IGM9TWgodGhpcyxsKTtyZXR1cm4ocz09PW51bGw/dTpzKSE9PShhPT09bnVsbD9jOmEpPyEwOnM9PT1hJiZ1IT09Yz8obz1uLmZpcnN0Q2hpbGQsbz09bnVsbCYmSCg0OCksdD1zPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYyksSWgoaSx0LHRoaXMpLHI9ci50aGVtZS50ZXh0LHIhPT12b2lkIDAmJkRoKGMsMCxsLHQsciksbi5yZXBsYWNlQ2hpbGQocyxvKSwhMSk6KHU9bixhIT09bnVsbCYmcyE9PW51bGwmJih1PW4uZmlyc3RDaGlsZCx1PT1udWxsJiZIKDQ5KSksSWgoaSx1LHRoaXMpLHI9ci50aGVtZS50ZXh0LHIhPT12b2lkIDAmJm8hPT1sJiZEaChjLG8sbCx1LHIpLGw9dGhpcy5fX3N0eWxlLHQuX19zdHlsZSE9PWwmJihuLnN0eWxlLmNzc1RleHQ9bCksITEpfXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm57IiN0ZXh0IjooKT0+KHtjb252ZXJzaW9uOnlPLHByaW9yaXR5OjB9KSxiOigpPT4oe2NvbnZlcnNpb246dk8scHJpb3JpdHk6MH0pLGNvZGU6KCk9Pih7Y29udmVyc2lvbjpSaSxwcmlvcml0eTowfSksZW06KCk9Pih7Y29udmVyc2lvbjpSaSxwcmlvcml0eTowfSksaTooKT0+KHtjb252ZXJzaW9uOlJpLHByaW9yaXR5OjB9KSxzOigpPT4oe2NvbnZlcnNpb246UmkscHJpb3JpdHk6MH0pLHNwYW46KCk9Pih7Y29udmVyc2lvbjpnTyxwcmlvcml0eTowfSksc3Ryb25nOigpPT4oe2NvbnZlcnNpb246UmkscHJpb3JpdHk6MH0pLHN1YjooKT0+KHtjb252ZXJzaW9uOlJpLHByaW9yaXR5OjB9KSxzdXA6KCk9Pih7Y29udmVyc2lvbjpSaSxwcmlvcml0eTowfSksdTooKT0+KHtjb252ZXJzaW9uOlJpLHByaW9yaXR5OjB9KX19c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49RHQodC50ZXh0KTtyZXR1cm4gbi5zZXRGb3JtYXQodC5mb3JtYXQpLG4uc2V0RGV0YWlsKHQuZGV0YWlsKSxuLnNldE1vZGUodC5tb2RlKSxuLnNldFN0eWxlKHQuc3R5bGUpLG59ZXhwb3J0RE9NKHQpe3JldHVybntlbGVtZW50OnR9PXN1cGVyLmV4cG9ydERPTSh0KSx0IT09bnVsbCYmTmYodCl8fEgoMTMyKSx0LnN0eWxlLndoaXRlU3BhY2U9InByZS13cmFwIix0aGlzLmhhc0Zvcm1hdCgiYm9sZCIpJiYodD1nYyh0LCJiIikpLHRoaXMuaGFzRm9ybWF0KCJpdGFsaWMiKSYmKHQ9Z2ModCwiaSIpKSx0aGlzLmhhc0Zvcm1hdCgic3RyaWtldGhyb3VnaCIpJiYodD1nYyh0LCJzIikpLHRoaXMuaGFzRm9ybWF0KCJ1bmRlcmxpbmUiKSYmKHQ9Z2ModCwidSIpKSx7ZWxlbWVudDp0fX1leHBvcnRKU09OKCl7cmV0dXJue2RldGFpbDp0aGlzLmdldERldGFpbCgpLGZvcm1hdDp0aGlzLmdldEZvcm1hdCgpLG1vZGU6dGhpcy5nZXRNb2RlKCksc3R5bGU6dGhpcy5nZXRTdHlsZSgpLHRleHQ6dGhpcy5nZXRUZXh0Q29udGVudCgpLHR5cGU6InRleHQiLHZlcnNpb246MX19c2VsZWN0aW9uVHJhbnNmb3JtKCl7fXNldEZvcm1hdCh0KXtsZXQgbj10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIG4uX19mb3JtYXQ9dHlwZW9mIHQ9PSJzdHJpbmciP3pvW3RdOnQsbn1zZXREZXRhaWwodCl7bGV0IG49dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiBuLl9fZGV0YWlsPXR5cGVvZiB0PT0ic3RyaW5nIj9HUlt0XTp0LG59c2V0U3R5bGUodCl7bGV0IG49dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiBuLl9fc3R5bGU9dCxufXRvZ2dsZUZvcm1hdCh0KXtyZXR1cm4gdD16b1t0XSx0aGlzLnNldEZvcm1hdCh0aGlzLmdldEZvcm1hdCgpXnQpfXRvZ2dsZURpcmVjdGlvbmxlc3MoKXtsZXQgdD10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIHQuX19kZXRhaWxePTEsdH10b2dnbGVVbm1lcmdlYWJsZSgpe2xldCB0PXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gdC5fX2RldGFpbF49Mix0fXNldE1vZGUodCl7aWYodD1YUlt0XSx0aGlzLl9fbW9kZT09PXQpcmV0dXJuIHRoaXM7bGV0IG49dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiBuLl9fbW9kZT10LG59c2V0VGV4dENvbnRlbnQodCl7aWYodGhpcy5fX3RleHQ9PT10KXJldHVybiB0aGlzO2xldCBuPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gbi5fX3RleHQ9dCxufXNlbGVjdCh0LG4pe2huKCk7bGV0IHI9cnQoKTt2YXIgaT10aGlzLmdldFRleHRDb250ZW50KCk7bGV0IG89dGhpcy5fX2tleTtpZih0eXBlb2YgaT09InN0cmluZyI/KGk9aS5sZW5ndGgsdD09PXZvaWQgMCYmKHQ9aSksbj09PXZvaWQgMCYmKG49aSkpOm49dD0wLG1lKHIpKWk9V2koKSxpIT09ci5hbmNob3Iua2V5JiZpIT09ci5mb2N1cy5rZXl8fEt0KG8pLHIuc2V0VGV4dE5vZGVSYW5nZSh0aGlzLHQsdGhpcyxuKTtlbHNlIHJldHVybiBDRShvLHQsbyxuLCJ0ZXh0IiwidGV4dCIpO3JldHVybiByfXNwbGljZVRleHQodCxuLHIsaSl7bGV0IG89dGhpcy5nZXRXcml0YWJsZSgpLGw9by5fX3RleHQscz1yLmxlbmd0aCxhPXQ7MD5hJiYoYT1zK2EsMD5hJiYoYT0wKSk7bGV0IHU9cnQoKTtyZXR1cm4gaSYmbWUodSkmJih0Kz1zLHUuc2V0VGV4dE5vZGVSYW5nZShvLHQsbyx0KSksbj1sLnNsaWNlKDAsYSkrcitsLnNsaWNlKGErbiksby5fX3RleHQ9bixvfWNhbkluc2VydFRleHRCZWZvcmUoKXtyZXR1cm4hMH1jYW5JbnNlcnRUZXh0QWZ0ZXIoKXtyZXR1cm4hMH1zcGxpdFRleHQoLi4udCl7aG4oKTt2YXIgbj10aGlzLmdldExhdGVzdCgpLHI9bi5nZXRUZXh0Q29udGVudCgpLGk9bi5fX2tleSxvPVdpKCksbD1uZXcgU2V0KHQpO3Q9W107Zm9yKHZhciBzPXIubGVuZ3RoLGE9IiIsdT0wO3U8czt1KyspYSE9PSIiJiZsLmhhcyh1KSYmKHQucHVzaChhKSxhPSIiKSxhKz1yW3VdO2lmKGEhPT0iIiYmdC5wdXNoKGEpLGw9dC5sZW5ndGgsbD09PTApcmV0dXJuW107aWYodFswXT09PXIpcmV0dXJuW25dO3ZhciBjPXRbMF07cj1uLmdldFBhcmVudE9yVGhyb3coKSx1PW4uZ2V0Rm9ybWF0KCk7bGV0IGQ9bi5nZXRTdHlsZSgpLGY9bi5fX2RldGFpbDtzPSExLG4uaXNTZWdtZW50ZWQoKT8oYT1EdChjKSxhLl9fZm9ybWF0PXUsYS5fX3N0eWxlPWQsYS5fX2RldGFpbD1mLHM9ITApOihhPW4uZ2V0V3JpdGFibGUoKSxhLl9fdGV4dD1jKSxuPXJ0KCksYT1bYV0sYz1jLmxlbmd0aDtmb3IobGV0IGc9MTtnPGw7ZysrKXt2YXIgaD10W2ddLG09aC5sZW5ndGg7aD1EdChoKS5nZXRXcml0YWJsZSgpLGguX19mb3JtYXQ9dSxoLl9fc3R5bGU9ZCxoLl9fZGV0YWlsPWY7bGV0IFM9aC5fX2tleTtpZihtPWMrbSxtZShuKSl7bGV0IHY9bi5hbmNob3IseT1uLmZvY3VzO3Yua2V5PT09aSYmdi50eXBlPT09InRleHQiJiZ2Lm9mZnNldD5jJiZ2Lm9mZnNldDw9bSYmKHYua2V5PVMsdi5vZmZzZXQtPWMsbi5kaXJ0eT0hMCkseS5rZXk9PT1pJiZ5LnR5cGU9PT0idGV4dCImJnkub2Zmc2V0PmMmJnkub2Zmc2V0PD1tJiYoeS5rZXk9Uyx5Lm9mZnNldC09YyxuLmRpcnR5PSEwKX1vPT09aSYmS3QoUyksYz1tLGEucHVzaChoKX1yZXR1cm4gaT10aGlzLmdldFByZXZpb3VzU2libGluZygpLG89dGhpcy5nZXROZXh0U2libGluZygpLGkhPT1udWxsJiZUZChpKSxvIT09bnVsbCYmVGQobyksaT1yLmdldFdyaXRhYmxlKCksbz10aGlzLmdldEluZGV4V2l0aGluUGFyZW50KCkscz8oaS5zcGxpY2UobywwLGEpLHRoaXMucmVtb3ZlKCkpOmkuc3BsaWNlKG8sMSxhKSxtZShuKSYmTWQobixyLG8sbC0xKSxhfW1lcmdlV2l0aFNpYmxpbmcodCl7dmFyIG49dD09PXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCk7bnx8dD09PXRoaXMuZ2V0TmV4dFNpYmxpbmcoKXx8SCg1MCk7dmFyIHI9dGhpcy5fX2tleTtsZXQgaT10Ll9fa2V5LG89dGhpcy5fX3RleHQsbD1vLmxlbmd0aDtXaSgpPT09aSYmS3Qocik7bGV0IHM9cnQoKTtpZihtZShzKSl7bGV0IGE9cy5hbmNob3IsdT1zLmZvY3VzO2EhPT1udWxsJiZhLmtleT09PWkmJihKMChhLG4scix0LGwpLHMuZGlydHk9ITApLHUhPT1udWxsJiZ1LmtleT09PWkmJihKMCh1LG4scix0LGwpLHMuZGlydHk9ITApfXJldHVybiByPXQuX190ZXh0LHRoaXMuc2V0VGV4dENvbnRlbnQobj9yK286bytyKSxuPXRoaXMuZ2V0V3JpdGFibGUoKSx0LnJlbW92ZSgpLG59aXNUZXh0RW50aXR5KCl7cmV0dXJuITF9fWZ1bmN0aW9uIGdPKGUpe2xldCB0PWUuc3R5bGUuZm9udFdlaWdodD09PSI3MDAiLG49ZS5zdHlsZS50ZXh0RGVjb3JhdGlvbj09PSJsaW5lLXRocm91Z2giLHI9ZS5zdHlsZS5mb250U3R5bGU9PT0iaXRhbGljIixpPWUuc3R5bGUudGV4dERlY29yYXRpb249PT0idW5kZXJsaW5lIixvPWUuc3R5bGUudmVydGljYWxBbGlnbjtyZXR1cm57Zm9yQ2hpbGQ6bD0+KEoobCkmJih0JiZsLnRvZ2dsZUZvcm1hdCgiYm9sZCIpLG4mJmwudG9nZ2xlRm9ybWF0KCJzdHJpa2V0aHJvdWdoIiksciYmbC50b2dnbGVGb3JtYXQoIml0YWxpYyIpLGkmJmwudG9nZ2xlRm9ybWF0KCJ1bmRlcmxpbmUiKSxvPT09InN1YiImJmwudG9nZ2xlRm9ybWF0KCJzdWJzY3JpcHQiKSxvPT09InN1cGVyIiYmbC50b2dnbGVGb3JtYXQoInN1cGVyc2NyaXB0IikpLGwpLG5vZGU6bnVsbH19ZnVuY3Rpb24gdk8oZSl7bGV0IHQ9ZS5zdHlsZS5mb250V2VpZ2h0PT09Im5vcm1hbCI7cmV0dXJue2ZvckNoaWxkOm49PihKKG4pJiYhdCYmbi50b2dnbGVGb3JtYXQoImJvbGQiKSxuKSxub2RlOm51bGx9fWxldCBXMD1uZXcgV2Vha01hcDtmdW5jdGlvbiB5TyhlKXtlLnBhcmVudEVsZW1lbnQ9PT1udWxsJiZIKDEyOSk7Zm9yKHZhciB0PWUudGV4dENvbnRlbnR8fCIiLG4scj1lLnBhcmVudE5vZGUsaT1bZV07ciE9PW51bGwmJihuPVcwLmdldChyKSk9PT12b2lkIDAmJiEoci5ub2RlTmFtZT09PSJQUkUifHxyLm5vZGVUeXBlPT09MSYmci5zdHlsZS53aGl0ZVNwYWNlLnN0YXJ0c1dpdGgoInByZSIpKTspaS5wdXNoKHIpLHI9ci5wYXJlbnROb2RlO2ZvcihuPW49PT12b2lkIDA/cjpuLHI9MDtyPGkubGVuZ3RoO3IrKylXMC5zZXQoaVtyXSxuKTtpZihuIT09bnVsbCl7Zm9yKHQ9dC5zcGxpdCgvKFxyP1xufFx0KS8pLGU9W10saT10Lmxlbmd0aCxuPTA7bjxpO24rKylyPXRbbl0scj09PWAKYHx8cj09PWBccgpgP2UucHVzaChjcygpKTpyPT09IgkiP2UucHVzaChPZigpKTpyIT09IiImJmUucHVzaChEdChyKSk7cmV0dXJue25vZGU6ZX19aWYodD10LnJlcGxhY2UoL1xyL2csIiIpLnJlcGxhY2UoL1sgXHRcbl0rL2csIiAiKSx0PT09IiIpcmV0dXJue25vZGU6bnVsbH07aWYodFswXT09PSIgIil7Zm9yKGk9ZSxuPSEwO2khPT1udWxsJiYoaT1WMChpLCExKSkhPT1udWxsOylpZihyPWkudGV4dENvbnRlbnR8fCIiLDA8ci5sZW5ndGgpey9bIFx0XG5dJC8udGVzdChyKSYmKHQ9dC5zbGljZSgxKSksbj0hMTticmVha31uJiYodD10LnNsaWNlKDEpKX1pZih0W3QubGVuZ3RoLTFdPT09IiAiKXtmb3IoaT0hMDtlIT09bnVsbCYmKGU9VjAoZSwhMCkpIT09bnVsbDspaWYoMDwoZS50ZXh0Q29udGVudHx8IiIpLnJlcGxhY2UoL14oIHxcdHxccj9cbikrLywiIikubGVuZ3RoKXtpPSExO2JyZWFrfWkmJih0PXQuc2xpY2UoMCx0Lmxlbmd0aC0xKSl9cmV0dXJuIHQ9PT0iIj97bm9kZTpudWxsfTp7bm9kZTpEdCh0KX19bGV0IHhPPW5ldyBSZWdFeHAoL14oYXxhYmJyfGFjcm9ueW18YnxjaXRlfGNvZGV8ZGVsfGVtfGl8aW5zfGtiZHxsYWJlbHxvdXRwdXR8cXxydWJ5fHN8c2FtcHxzcGFufHN0cm9uZ3xzdWJ8c3VwfHRpbWV8dXx0dHx2YXIpJC8sImkiKTtmdW5jdGlvbiBWMChlLHQpe2Zvcig7Oyl7Zm9yKHZhciBuPXZvaWQgMDsobj10P2UubmV4dFNpYmxpbmc6ZS5wcmV2aW91c1NpYmxpbmcpPT09bnVsbDspaWYoZT1lLnBhcmVudEVsZW1lbnQsZT09PW51bGwpcmV0dXJuIG51bGw7aWYoZT1uLGUubm9kZVR5cGU9PT0xJiYobj1lLnN0eWxlLmRpc3BsYXksbj09PSIiJiZlLm5vZGVOYW1lLm1hdGNoKHhPKT09PW51bGx8fG4hPT0iIiYmIW4uc3RhcnRzV2l0aCgiaW5saW5lIikpKXJldHVybiBudWxsO2Zvcig7KG49dD9lLmZpcnN0Q2hpbGQ6ZS5sYXN0Q2hpbGQpIT09bnVsbDspZT1uO2lmKGUubm9kZVR5cGU9PT0zKXJldHVybiBlO2lmKGUubm9kZU5hbWU9PT0iQlIiKXJldHVybiBudWxsfX1sZXQgX089e2NvZGU6ImNvZGUiLGVtOiJpdGFsaWMiLGk6Iml0YWxpYyIsczoic3RyaWtldGhyb3VnaCIsc3Ryb25nOiJib2xkIixzdWI6InN1YnNjcmlwdCIsc3VwOiJzdXBlcnNjcmlwdCIsdToidW5kZXJsaW5lIn07ZnVuY3Rpb24gUmkoZSl7bGV0IHQ9X09bZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXTtyZXR1cm4gdD09PXZvaWQgMD97bm9kZTpudWxsfTp7Zm9yQ2hpbGQ6bj0+KEoobikmJiFuLmhhc0Zvcm1hdCh0KSYmbi50b2dnbGVGb3JtYXQodCksbiksbm9kZTpudWxsfX1mdW5jdGlvbiBEdChlPSIiKXtyZXR1cm4gSXUobmV3IHNsKGUpKX1mdW5jdGlvbiBKKGUpe3JldHVybiBlIGluc3RhbmNlb2Ygc2x9Y2xhc3MgJHMgZXh0ZW5kcyBzbHtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJ0YWIifXN0YXRpYyBjbG9uZSh0KXtsZXQgbj1uZXcgJHModC5fX2tleSk7cmV0dXJuIG4uX190ZXh0PXQuX190ZXh0LG4uX19mb3JtYXQ9dC5fX2Zvcm1hdCxuLl9fc3R5bGU9dC5fX3N0eWxlLG59Y29uc3RydWN0b3IodCl7c3VwZXIoIgkiLHQpLHRoaXMuX19kZXRhaWw9Mn1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJuIG51bGx9c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49T2YoKTtyZXR1cm4gbi5zZXRGb3JtYXQodC5mb3JtYXQpLG4uc2V0U3R5bGUodC5zdHlsZSksbn1leHBvcnRKU09OKCl7cmV0dXJuey4uLnN1cGVyLmV4cG9ydEpTT04oKSx0eXBlOiJ0YWIiLHZlcnNpb246MX19c2V0VGV4dENvbnRlbnQoKXtIKDEyNil9c2V0RGV0YWlsKCl7SCgxMjcpfXNldE1vZGUoKXtIKDEyOCl9Y2FuSW5zZXJ0VGV4dEJlZm9yZSgpe3JldHVybiExfWNhbkluc2VydFRleHRBZnRlcigpe3JldHVybiExfX1mdW5jdGlvbiBPZigpe3JldHVybiBJdShuZXcgJHMpfWNsYXNzIFZye2NvbnN0cnVjdG9yKHQsbixyKXt0aGlzLl9zZWxlY3Rpb249bnVsbCx0aGlzLmtleT10LHRoaXMub2Zmc2V0PW4sdGhpcy50eXBlPXJ9aXModCl7cmV0dXJuIHRoaXMua2V5PT09dC5rZXkmJnRoaXMub2Zmc2V0PT09dC5vZmZzZXQmJnRoaXMudHlwZT09PXQudHlwZX1pc0JlZm9yZSh0KXtsZXQgbj10aGlzLmdldE5vZGUoKSxyPXQuZ2V0Tm9kZSgpLGk9dGhpcy5vZmZzZXQ7aWYodD10Lm9mZnNldCxCKG4pKXt2YXIgbz1uLmdldERlc2NlbmRhbnRCeUluZGV4KGkpO249bz8/bn1yZXR1cm4gQihyKSYmKG89ci5nZXREZXNjZW5kYW50QnlJbmRleCh0KSxyPW8/P3IpLG49PT1yP2k8dDpuLmlzQmVmb3JlKHIpfWdldE5vZGUoKXtsZXQgdD1MdCh0aGlzLmtleSk7cmV0dXJuIHQ9PT1udWxsJiZIKDIwKSx0fXNldCh0LG4scil7bGV0IGk9dGhpcy5fc2VsZWN0aW9uLG89dGhpcy5rZXk7dGhpcy5rZXk9dCx0aGlzLm9mZnNldD1uLHRoaXMudHlwZT1yLE5zKCl8fChXaSgpPT09byYmS3QodCksaSE9PW51bGwmJihpLl9jYWNoZWROb2Rlcz1udWxsLGkuZGlydHk9ITApKX19ZnVuY3Rpb24gTGgoZSx0KXtsZXQgbj10Ll9fa2V5LHI9ZS5vZmZzZXQsaT0iZWxlbWVudCI7aWYoSih0KSlpPSJ0ZXh0Iix0PXQuZ2V0VGV4dENvbnRlbnRTaXplKCkscj50JiYocj10KTtlbHNlIGlmKCFCKHQpKXt2YXIgbz10LmdldE5leHRTaWJsaW5nKCk7SihvKT8obj1vLl9fa2V5LHI9MCxpPSJ0ZXh0Iik6KG89dC5nZXRQYXJlbnQoKSkmJihuPW8uX19rZXkscj10LmdldEluZGV4V2l0aGluUGFyZW50KCkrMSl9ZS5zZXQobixyLGkpfWZ1bmN0aW9uIEgwKGUsdCl7aWYoQih0KSl7bGV0IG49dC5nZXRMYXN0RGVzY2VuZGFudCgpO0Iobil8fEoobik/TGgoZSxuKTpMaChlLHQpfWVsc2UgTGgoZSx0KX1mdW5jdGlvbiBLMChlLHQsbixyKXtsZXQgaT1lLmdldE5vZGUoKSxvPWkuZ2V0Q2hpbGRBdEluZGV4KGUub2Zmc2V0KSxsPUR0KCkscz1tbihpKT9YbygpLmFwcGVuZChsKTpsO2wuc2V0Rm9ybWF0KG4pLGwuc2V0U3R5bGUociksbz09PW51bGw/aS5hcHBlbmQocyk6KG8uaW5zZXJ0QmVmb3JlKHMpLHQudHlwZT09PSJlbGVtZW50IiYmdC5rZXk9PT1lLmtleSYmdC5vZmZzZXQhPT1lLm9mZnNldCYmdC5zZXQodC5rZXksdC5vZmZzZXQrMSwiZWxlbWVudCIpKSxlLmlzKHQpJiZ0LnNldChsLl9fa2V5LDAsInRleHQiKSxlLnNldChsLl9fa2V5LDAsInRleHQiKX1mdW5jdGlvbiBEaShlLHQsbixyKXtlLmtleT10LGUub2Zmc2V0PW4sZS50eXBlPXJ9Y2xhc3MgUGZ7Y29uc3RydWN0b3IodCl7dGhpcy5kaXJ0eT0hMSx0aGlzLl9ub2Rlcz10LHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9aXModCl7aWYoIWJzKHQpKXJldHVybiExO2xldCBuPXRoaXMuX25vZGVzLHI9dC5fbm9kZXM7cmV0dXJuIG4uc2l6ZT09PXIuc2l6ZSYmQXJyYXkuZnJvbShuKS5ldmVyeShpPT5yLmhhcyhpKSl9YWRkKHQpe3RoaXMuZGlydHk9ITAsdGhpcy5fbm9kZXMuYWRkKHQpLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9ZGVsZXRlKHQpe3RoaXMuZGlydHk9ITAsdGhpcy5fbm9kZXMuZGVsZXRlKHQpLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9Y2xlYXIoKXt0aGlzLmRpcnR5PSEwLHRoaXMuX25vZGVzLmNsZWFyKCksdGhpcy5fY2FjaGVkTm9kZXM9bnVsbH1oYXModCl7cmV0dXJuIHRoaXMuX25vZGVzLmhhcyh0KX1jbG9uZSgpe3JldHVybiBuZXcgUGYobmV3IFNldCh0aGlzLl9ub2RlcykpfWV4dHJhY3QoKXtyZXR1cm4gdGhpcy5nZXROb2RlcygpfWluc2VydFJhd1RleHQoKXt9aW5zZXJ0VGV4dCgpe31pbnNlcnROb2Rlcyh0LG4pe2xldCByPXRoaXMuZ2V0Tm9kZXMoKSxpPXIubGVuZ3RoO3ZhciBvPXJbaS0xXTtpZihKKG8pKW89by5zZWxlY3QoKTtlbHNle2xldCBsPW8uZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsxO289by5nZXRQYXJlbnRPclRocm93KCkuc2VsZWN0KGwsbCl9Zm9yKG8uaW5zZXJ0Tm9kZXModCxuKSx0PTA7dDxpO3QrKylyW3RdLnJlbW92ZSgpO3JldHVybiEwfWdldE5vZGVzKCl7dmFyIHQ9dGhpcy5fY2FjaGVkTm9kZXM7aWYodCE9PW51bGwpcmV0dXJuIHQ7dmFyIG49dGhpcy5fbm9kZXM7dD1bXTtmb3IobGV0IHIgb2YgbiluPUx0KHIpLG4hPT1udWxsJiZ0LnB1c2gobik7cmV0dXJuIE5zKCl8fCh0aGlzLl9jYWNoZWROb2Rlcz10KSx0fWdldFRleHRDb250ZW50KCl7bGV0IHQ9dGhpcy5nZXROb2RlcygpLG49IiI7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspbis9dFtyXS5nZXRUZXh0Q29udGVudCgpO3JldHVybiBufX1mdW5jdGlvbiBtZShlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGFsfWZ1bmN0aW9uIFNtKGUpe2xldFt0LCxuXT0kRShlKTtlPW4uZ2V0Q2hpbGRyZW4oKTtsZXQgcj1lLmxlbmd0aDt2YXIgaT1lWzBdLmdldENoaWxkcmVuKCkubGVuZ3RoO2xldCBvPUFycmF5KHIpO2Zvcih2YXIgbD0wO2w8cjtsKyspb1tsXT1BcnJheShpKTtmb3IoaT0wO2k8cjtpKyspe2w9ZVtpXS5nZXRDaGlsZHJlbigpO2xldCBzPTA7Zm9yKGxldCBhPTA7YTxsLmxlbmd0aDthKyspe2Zvcig7b1tpXVtzXTspcysrO2xldCB1PWxbYV0sYz11Ll9fcm93U3Bhbnx8MSxkPXUuX19jb2xTcGFufHwxO2ZvcihsZXQgZj0wO2Y8YztmKyspZm9yKGxldCBoPTA7aDxkO2grKylvW2krZl1bcytoXT11O2lmKHQ9PT11KXJldHVybntjb2xTcGFuOmQsY29sdW1uSW5kZXg6cyxyb3dJbmRleDppLHJvd1NwYW46Y307cys9ZH19cmV0dXJuIG51bGx9Y2xhc3MgQWZ7Y29uc3RydWN0b3IodCxuLHIpe3RoaXMuZ3JpZEtleT10LHRoaXMuYW5jaG9yPW4sdGhpcy5mb2N1cz1yLHRoaXMuZGlydHk9ITEsdGhpcy5fY2FjaGVkTm9kZXM9bnVsbCxuLl9zZWxlY3Rpb249dGhpcyxyLl9zZWxlY3Rpb249dGhpc31pcyh0KXtyZXR1cm4geXYodCk/dGhpcy5ncmlkS2V5PT09dC5ncmlkS2V5JiZ0aGlzLmFuY2hvci5pcyh0LmFuY2hvcikmJnRoaXMuZm9jdXMuaXModC5mb2N1cyk6ITF9c2V0KHQsbixyKXt0aGlzLmRpcnR5PSEwLHRoaXMuZ3JpZEtleT10LHRoaXMuYW5jaG9yLmtleT1uLHRoaXMuZm9jdXMua2V5PXIsdGhpcy5fY2FjaGVkTm9kZXM9bnVsbH1jbG9uZSgpe3JldHVybiBuZXcgQWYodGhpcy5ncmlkS2V5LHRoaXMuYW5jaG9yLHRoaXMuZm9jdXMpfWlzQ29sbGFwc2VkKCl7cmV0dXJuITF9aXNCYWNrd2FyZCgpe3JldHVybiB0aGlzLmZvY3VzLmlzQmVmb3JlKHRoaXMuYW5jaG9yKX1nZXRDaGFyYWN0ZXJPZmZzZXRzKCl7cmV0dXJuIFZjKHRoaXMpfWV4dHJhY3QoKXtyZXR1cm4gdGhpcy5nZXROb2RlcygpfWluc2VydFJhd1RleHQoKXt9aW5zZXJ0VGV4dCgpe31pbnNlcnROb2Rlcyh0LG4pe2xldCByPXRoaXMuZm9jdXMuZ2V0Tm9kZSgpO3JldHVybiBjdihyLnNlbGVjdCgwLHIuZ2V0Q2hpbGRyZW5TaXplKCkpKS5pbnNlcnROb2Rlcyh0LG4pfWdldFNoYXBlKCl7dmFyIHQ9THQodGhpcy5hbmNob3Iua2V5KTtpZihRbih0KXx8SCgxMDMpLHQ9U20odCksdD09PW51bGwpdGhyb3cgRXJyb3IoImdldENlbGxSZWN0OiBleHBlY3RlZCB0byBmaW5kIEFuY2hvck5vZGUiKTt2YXIgbj1MdCh0aGlzLmZvY3VzLmtleSk7UW4obil8fEgoMTA0KTtsZXQgcj1TbShuKTtpZihyPT09bnVsbCl0aHJvdyBFcnJvcigiZ2V0Q2VsbFJlY3Q6IGV4cGVjdGVkIHRvIGZpbmQgZm9jdXNDZWxsTm9kZSIpO249TWF0aC5taW4odC5jb2x1bW5JbmRleCxyLmNvbHVtbkluZGV4KTtsZXQgaT1NYXRoLm1heCh0LmNvbHVtbkluZGV4LHIuY29sdW1uSW5kZXgpLG89TWF0aC5taW4odC5yb3dJbmRleCxyLnJvd0luZGV4KTtyZXR1cm4gdD1NYXRoLm1heCh0LnJvd0luZGV4LHIucm93SW5kZXgpLHtmcm9tWDpNYXRoLm1pbihuLGkpLGZyb21ZOk1hdGgubWluKG8sdCksdG9YOk1hdGgubWF4KG4saSksdG9ZOk1hdGgubWF4KG8sdCl9fWdldE5vZGVzKCl7ZnVuY3Rpb24gdChTKXtsZXR7Y2VsbDp2LHN0YXJ0Q29sdW1uOnksc3RhcnRSb3c6X309UzthPU1hdGgubWluKGEseSksdT1NYXRoLm1pbih1LF8pLGM9TWF0aC5tYXgoYyx5K3YuX19jb2xTcGFuLTEpLGQ9TWF0aC5tYXgoZCxfK3YuX19yb3dTcGFuLTEpfXZhciBuPXRoaXMuX2NhY2hlZE5vZGVzO2lmKG4hPT1udWxsKXJldHVybiBuO3ZhciByPXRoaXMuYW5jaG9yLmdldE5vZGUoKTtuPXRoaXMuZm9jdXMuZ2V0Tm9kZSgpLHI9UGQocixRbik7dmFyIGk9UGQobixRbik7UW4ocil8fEgoMTAzKSxRbihpKXx8SCgxMDQpLG49ci5nZXRQYXJlbnQoKSxzdShuKXx8SCgxMDUpLG49bi5nZXRQYXJlbnQoKSxFdihuKXx8SCgxMDYpO2xldFtvLGwsc109a0UobixyLGkpLGE9TWF0aC5taW4obC5zdGFydENvbHVtbixzLnN0YXJ0Q29sdW1uKSx1PU1hdGgubWluKGwuc3RhcnRSb3cscy5zdGFydFJvdyksYz1NYXRoLm1heChsLnN0YXJ0Q29sdW1uK2wuY2VsbC5fX2NvbFNwYW4tMSxzLnN0YXJ0Q29sdW1uK3MuY2VsbC5fX2NvbFNwYW4tMSksZD1NYXRoLm1heChsLnN0YXJ0Um93K2wuY2VsbC5fX3Jvd1NwYW4tMSxzLnN0YXJ0Um93K3MuY2VsbC5fX3Jvd1NwYW4tMSk7cj1hLGk9dTtmb3IodmFyIGY9YSxoPXU7YTxyfHx1PGl8fGM+Znx8ZD5oOyl7aWYoYTxyKXt2YXIgbT1oLWk7LS1yO2Zvcih2YXIgZz0wO2c8PW07ZysrKXQob1tpK2ddW3JdKX1pZih1PGkpZm9yKG09Zi1yLC0taSxnPTA7Zzw9bTtnKyspdChvW2ldW3IrZ10pO2lmKGM+Zilmb3IobT1oLWksZis9MSxnPTA7Zzw9bTtnKyspdChvW2krZ11bZl0pO2lmKGQ+aClmb3IobT1mLXIsaCs9MSxnPTA7Zzw9bTtnKyspdChvW2hdW3IrZ10pfWZvcihuPVtuXSxyPW51bGwsaT11O2k8PWQ7aSsrKWZvcihmPWE7Zjw9YztmKyspKHtjZWxsOmh9PW9baV1bZl0pLG09aC5nZXRQYXJlbnQoKSxzdShtKXx8SCgxMDcpLG0hPT1yJiZuLnB1c2gobSksbi5wdXNoKGgsLi4uaU8oaCkpLHI9bTtyZXR1cm4gTnMoKXx8KHRoaXMuX2NhY2hlZE5vZGVzPW4pLG59Z2V0VGV4dENvbnRlbnQoKXtsZXQgdD10aGlzLmdldE5vZGVzKCksbj0iIjtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyluKz10W3JdLmdldFRleHRDb250ZW50KCk7cmV0dXJuIG59fWZ1bmN0aW9uIHl2KGUpe3JldHVybiBlIGluc3RhbmNlb2YgQWZ9Y2xhc3MgYWx7Y29uc3RydWN0b3IodCxuLHIsaSl7dGhpcy5hbmNob3I9dCx0aGlzLmZvY3VzPW4sdGhpcy5kaXJ0eT0hMSx0aGlzLmZvcm1hdD1yLHRoaXMuc3R5bGU9aSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsLHQuX3NlbGVjdGlvbj10aGlzLG4uX3NlbGVjdGlvbj10aGlzfWlzKHQpe3JldHVybiBtZSh0KT90aGlzLmFuY2hvci5pcyh0LmFuY2hvcikmJnRoaXMuZm9jdXMuaXModC5mb2N1cykmJnRoaXMuZm9ybWF0PT09dC5mb3JtYXQmJnRoaXMuc3R5bGU9PT10LnN0eWxlOiExfWlzQmFja3dhcmQoKXtyZXR1cm4gdGhpcy5mb2N1cy5pc0JlZm9yZSh0aGlzLmFuY2hvcil9aXNDb2xsYXBzZWQoKXtyZXR1cm4gdGhpcy5hbmNob3IuaXModGhpcy5mb2N1cyl9Z2V0Tm9kZXMoKXt2YXIgdD10aGlzLl9jYWNoZWROb2RlcztpZih0IT09bnVsbClyZXR1cm4gdDt0PXRoaXMuYW5jaG9yO3ZhciBuPXRoaXMuZm9jdXMscj10LmlzQmVmb3JlKG4pLGk9cj90Om47cj1yP246dCx0PWkuZ2V0Tm9kZSgpLG49ci5nZXROb2RlKCk7bGV0IG89aS5vZmZzZXQ7cmV0dXJuIGk9ci5vZmZzZXQsQih0KSYmKHI9dC5nZXREZXNjZW5kYW50QnlJbmRleChvKSx0PXI/P3QpLEIobikmJihyPW4uZ2V0RGVzY2VuZGFudEJ5SW5kZXgoaSksciE9PW51bGwmJnIhPT10JiZuLmdldENoaWxkQXRJbmRleChpKT09PXImJihyPXIuZ2V0UHJldmlvdXNTaWJsaW5nKCkpLG49cj8/biksdD10LmlzKG4pP0IodCkmJjA8dC5nZXRDaGlsZHJlblNpemUoKT9bXTpbdF06dC5nZXROb2Rlc0JldHdlZW4obiksTnMoKXx8KHRoaXMuX2NhY2hlZE5vZGVzPXQpLHR9c2V0VGV4dE5vZGVSYW5nZSh0LG4scixpKXtEaSh0aGlzLmFuY2hvcix0Ll9fa2V5LG4sInRleHQiKSxEaSh0aGlzLmZvY3VzLHIuX19rZXksaSwidGV4dCIpLHRoaXMuX2NhY2hlZE5vZGVzPW51bGwsdGhpcy5kaXJ0eT0hMH1nZXRUZXh0Q29udGVudCgpe2xldCB0PXRoaXMuZ2V0Tm9kZXMoKTtpZih0Lmxlbmd0aD09PTApcmV0dXJuIiI7bGV0IG49dFswXSxyPXRbdC5sZW5ndGgtMV0saT10aGlzLmFuY2hvcixvPXRoaXMuZm9jdXMsbD1pLmlzQmVmb3JlKG8pLFtzLGFdPVZjKHRoaXMpLHU9IiIsYz0hMDtmb3IobGV0IGQ9MDtkPHQubGVuZ3RoO2QrKyl7bGV0IGY9dFtkXTtpZihCKGYpJiYhZi5pc0lubGluZSgpKWN8fCh1Kz1gCmApLGM9IWYuaXNFbXB0eSgpO2Vsc2UgaWYoYz0hMSxKKGYpKXtsZXQgaD1mLmdldFRleHRDb250ZW50KCk7Zj09PW4/Zj09PXI/KGkudHlwZSE9PSJlbGVtZW50Inx8by50eXBlIT09ImVsZW1lbnQifHxvLm9mZnNldD09PWkub2Zmc2V0KSYmKGg9czxhP2guc2xpY2UocyxhKTpoLnNsaWNlKGEscykpOmg9bD9oLnNsaWNlKHMpOmguc2xpY2UoYSk6Zj09PXImJihoPWw/aC5zbGljZSgwLGEpOmguc2xpY2UoMCxzKSksdSs9aH1lbHNlIXR0KGYpJiYhb3UoZil8fGY9PT1yJiZ0aGlzLmlzQ29sbGFwc2VkKCl8fCh1Kz1mLmdldFRleHRDb250ZW50KCkpfXJldHVybiB1fWFwcGx5RE9NUmFuZ2UodCl7bGV0IG49cHQoKSxyPW4uZ2V0RWRpdG9yU3RhdGUoKS5fc2VsZWN0aW9uO2lmKHQ9RUUodC5zdGFydENvbnRhaW5lcix0LnN0YXJ0T2Zmc2V0LHQuZW5kQ29udGFpbmVyLHQuZW5kT2Zmc2V0LG4sciksdCE9PW51bGwpe3ZhcltpLG9dPXQ7RGkodGhpcy5hbmNob3IsaS5rZXksaS5vZmZzZXQsaS50eXBlKSxEaSh0aGlzLmZvY3VzLG8ua2V5LG8ub2Zmc2V0LG8udHlwZSksdGhpcy5fY2FjaGVkTm9kZXM9bnVsbH19Y2xvbmUoKXtsZXQgdD10aGlzLmFuY2hvcixuPXRoaXMuZm9jdXM7cmV0dXJuIG5ldyBhbChuZXcgVnIodC5rZXksdC5vZmZzZXQsdC50eXBlKSxuZXcgVnIobi5rZXksbi5vZmZzZXQsbi50eXBlKSx0aGlzLmZvcm1hdCx0aGlzLnN0eWxlKX10b2dnbGVGb3JtYXQodCl7dGhpcy5mb3JtYXQ9UVModGhpcy5mb3JtYXQsdCxudWxsKSx0aGlzLmRpcnR5PSEwfXNldFN0eWxlKHQpe3RoaXMuc3R5bGU9dCx0aGlzLmRpcnR5PSEwfWhhc0Zvcm1hdCh0KXtyZXR1cm4odGhpcy5mb3JtYXQmem9bdF0pIT09MH1pbnNlcnRSYXdUZXh0KHQpe3Q9dC5zcGxpdCgvKFxyP1xufFx0KS8pO2xldCBuPVtdLHI9dC5sZW5ndGg7Zm9yKGxldCBpPTA7aTxyO2krKyl7bGV0IG89dFtpXTtvPT09YApgfHxvPT09YFxyCmA/bi5wdXNoKGNzKCkpOm89PT0iCSI/bi5wdXNoKE9mKCkpOm4ucHVzaChEdChvKSl9dGhpcy5pbnNlcnROb2RlcyhuKX1pbnNlcnRUZXh0KHQpe3ZhciBuPXRoaXMuYW5jaG9yLHI9dGhpcy5mb2N1cyxpPXRoaXMuaXNDb2xsYXBzZWQoKXx8bi5pc0JlZm9yZShyKSxvPXRoaXMuZm9ybWF0LGw9dGhpcy5zdHlsZTtpJiZuLnR5cGU9PT0iZWxlbWVudCI/SzAobixyLG8sbCk6aXx8ci50eXBlIT09ImVsZW1lbnQifHxLMChyLG4sbyxsKTt2YXIgcz10aGlzLmdldE5vZGVzKCksYT1zLmxlbmd0aCx1PWk/cjpuO3I9KGk/bjpyKS5vZmZzZXQ7dmFyIGM9dS5vZmZzZXQ7bj1zWzBdLEoobil8fEgoMjYpLGk9bi5nZXRUZXh0Q29udGVudCgpLmxlbmd0aDt2YXIgZD1uLmdldFBhcmVudE9yVGhyb3coKSxmPXNbYS0xXTtpZih0aGlzLmlzQ29sbGFwc2VkKCkmJnI9PT1pJiYobi5pc1NlZ21lbnRlZCgpfHxuLmlzVG9rZW4oKXx8IW4uY2FuSW5zZXJ0VGV4dEFmdGVyKCl8fCFkLmNhbkluc2VydFRleHRBZnRlcigpJiZuLmdldE5leHRTaWJsaW5nKCk9PT1udWxsKSl7dmFyIGg9bi5nZXROZXh0U2libGluZygpO2lmKEooaCkmJmguY2FuSW5zZXJ0VGV4dEJlZm9yZSgpJiYhYW0oaCl8fChoPUR0KCksaC5zZXRGb3JtYXQobyksZC5jYW5JbnNlcnRUZXh0QWZ0ZXIoKT9uLmluc2VydEFmdGVyKGgpOmQuaW5zZXJ0QWZ0ZXIoaCkpLGguc2VsZWN0KDAsMCksbj1oLHQhPT0iIil7dGhpcy5pbnNlcnRUZXh0KHQpO3JldHVybn19ZWxzZSBpZih0aGlzLmlzQ29sbGFwc2VkKCkmJnI9PT0wJiYobi5pc1NlZ21lbnRlZCgpfHxuLmlzVG9rZW4oKXx8IW4uY2FuSW5zZXJ0VGV4dEJlZm9yZSgpfHwhZC5jYW5JbnNlcnRUZXh0QmVmb3JlKCkmJm4uZ2V0UHJldmlvdXNTaWJsaW5nKCk9PT1udWxsKSl7aWYoaD1uLmdldFByZXZpb3VzU2libGluZygpLCghSihoKXx8YW0oaCkpJiYoaD1EdCgpLGguc2V0Rm9ybWF0KG8pLGQuY2FuSW5zZXJ0VGV4dEJlZm9yZSgpP24uaW5zZXJ0QmVmb3JlKGgpOmQuaW5zZXJ0QmVmb3JlKGgpKSxoLnNlbGVjdCgpLG49aCx0IT09IiIpe3RoaXMuaW5zZXJ0VGV4dCh0KTtyZXR1cm59fWVsc2UgaWYobi5pc1NlZ21lbnRlZCgpJiZyIT09aSlkPUR0KG4uZ2V0VGV4dENvbnRlbnQoKSksZC5zZXRGb3JtYXQobyksbi5yZXBsYWNlKGQpLG49ZDtlbHNlIGlmKCEodGhpcy5pc0NvbGxhcHNlZCgpfHx0PT09IiJ8fChoPWYuZ2V0UGFyZW50KCksZC5jYW5JbnNlcnRUZXh0QmVmb3JlKCkmJmQuY2FuSW5zZXJ0VGV4dEFmdGVyKCkmJighQihoKXx8aC5jYW5JbnNlcnRUZXh0QmVmb3JlKCkmJmguY2FuSW5zZXJ0VGV4dEFmdGVyKCkpKSkpe3RoaXMuaW5zZXJ0VGV4dCgiIiksU0UodGhpcy5hbmNob3IsdGhpcy5mb2N1cyxudWxsKSx0aGlzLmluc2VydFRleHQodCk7cmV0dXJufWlmKGE9PT0xKWlmKG4uaXNUb2tlbigpKXQ9RHQodCksdC5zZWxlY3QoKSxuLnJlcGxhY2UodCk7ZWxzZXtpZihzPW4uZ2V0Rm9ybWF0KCksYT1uLmdldFN0eWxlKCkscj09PWMmJihzIT09b3x8YSE9PWwpKWlmKG4uZ2V0VGV4dENvbnRlbnQoKT09PSIiKW4uc2V0Rm9ybWF0KG8pLG4uc2V0U3R5bGUobCk7ZWxzZXtzPUR0KHQpLHMuc2V0Rm9ybWF0KG8pLHMuc2V0U3R5bGUobCkscy5zZWxlY3QoKSxyPT09MD9uLmluc2VydEJlZm9yZShzLCExKTooW2FdPW4uc3BsaXRUZXh0KHIpLGEuaW5zZXJ0QWZ0ZXIocywhMSkpLHMuaXNDb21wb3NpbmcoKSYmdGhpcy5hbmNob3IudHlwZT09PSJ0ZXh0IiYmKHRoaXMuYW5jaG9yLm9mZnNldC09dC5sZW5ndGgpO3JldHVybn1uPW4uc3BsaWNlVGV4dChyLGMtcix0LCEwKSxuLmdldFRleHRDb250ZW50KCk9PT0iIj9uLnJlbW92ZSgpOnRoaXMuYW5jaG9yLnR5cGU9PT0idGV4dCImJihuLmlzQ29tcG9zaW5nKCk/dGhpcy5hbmNob3Iub2Zmc2V0LT10Lmxlbmd0aDoodGhpcy5mb3JtYXQ9cyx0aGlzLnN0eWxlPWEpKX1lbHNle2lmKG89bmV3IFNldChbLi4ubi5nZXRQYXJlbnRLZXlzKCksLi4uZi5nZXRQYXJlbnRLZXlzKCldKSxoPUIobik/bjpuLmdldFBhcmVudE9yVGhyb3coKSxsPUIoZik/ZjpmLmdldFBhcmVudE9yVGhyb3coKSxkPWYsIWguaXMobCkmJmwuaXNJbmxpbmUoKSlkbyBkPWwsbD1sLmdldFBhcmVudE9yVGhyb3coKTt3aGlsZShsLmlzSW5saW5lKCkpO2lmKHUudHlwZT09PSJ0ZXh0IiYmKGMhPT0wfHxmLmdldFRleHRDb250ZW50KCk9PT0iIil8fHUudHlwZT09PSJlbGVtZW50IiYmZi5nZXRJbmRleFdpdGhpblBhcmVudCgpPGMpaWYoSihmKSYmIWYuaXNUb2tlbigpJiZjIT09Zi5nZXRUZXh0Q29udGVudFNpemUoKSl7aWYoZi5pc1NlZ21lbnRlZCgpKXt2YXIgbT1EdChmLmdldFRleHRDb250ZW50KCkpO2YucmVwbGFjZShtKSxmPW19bW4odS5nZXROb2RlKCkpfHwoZj1mLnNwbGljZVRleHQoMCxjLCIiKSksby5hZGQoZi5fX2tleSl9ZWxzZSB1PWYuZ2V0UGFyZW50T3JUaHJvdygpLHUuY2FuQmVFbXB0eSgpfHx1LmdldENoaWxkcmVuU2l6ZSgpIT09MT9mLnJlbW92ZSgpOnUucmVtb3ZlKCk7ZWxzZSBvLmFkZChmLl9fa2V5KTtmb3IodT1sLmdldENoaWxkcmVuKCksYz1uZXcgU2V0KHMpLGY9aC5pcyhsKSxoPWguaXNJbmxpbmUoKSYmbi5nZXROZXh0U2libGluZygpPT09bnVsbD9oOm4sbT11Lmxlbmd0aC0xOzA8PW07bS0tKXtsZXQgZz11W21dO2lmKGcuaXMobil8fEIoZykmJmcuaXNQYXJlbnRPZihuKSlicmVhaztnLmlzQXR0YWNoZWQoKSYmKCFjLmhhcyhnKXx8Zy5pcyhkKT9mfHxoLmluc2VydEFmdGVyKGcsITEpOmcucmVtb3ZlKCkpfWlmKCFmKWZvcih1PWwsYz1udWxsO3UhPT1udWxsOylsPXUuZ2V0Q2hpbGRyZW4oKSxmPWwubGVuZ3RoLChmPT09MHx8bFtmLTFdLmlzKGMpKSYmKG8uZGVsZXRlKHUuX19rZXkpLGM9dSksdT11LmdldFBhcmVudCgpO2ZvcihuLmlzVG9rZW4oKT9yPT09aT9uLnNlbGVjdCgpOih0PUR0KHQpLHQuc2VsZWN0KCksbi5yZXBsYWNlKHQpKToobj1uLnNwbGljZVRleHQocixpLXIsdCwhMCksbi5nZXRUZXh0Q29udGVudCgpPT09IiI/bi5yZW1vdmUoKTpuLmlzQ29tcG9zaW5nKCkmJnRoaXMuYW5jaG9yLnR5cGU9PT0idGV4dCImJih0aGlzLmFuY2hvci5vZmZzZXQtPXQubGVuZ3RoKSksdD0xO3Q8YTt0Kyspbj1zW3RdLG8uaGFzKG4uX19rZXkpfHxuLnJlbW92ZSgpfX1yZW1vdmVUZXh0KCl7dGhpcy5pbnNlcnRUZXh0KCIiKX1mb3JtYXRUZXh0KHQpe2lmKHRoaXMuaXNDb2xsYXBzZWQoKSl0aGlzLnRvZ2dsZUZvcm1hdCh0KSxLdChudWxsKTtlbHNle3ZhciBuPXRoaXMuZ2V0Tm9kZXMoKSxyPVtdO2Zvcih2YXIgaSBvZiBuKUooaSkmJnIucHVzaChpKTt2YXIgbz1yLmxlbmd0aDtpZihvPT09MCl0aGlzLnRvZ2dsZUZvcm1hdCh0KSxLdChudWxsKTtlbHNle2k9dGhpcy5hbmNob3I7dmFyIGw9dGhpcy5mb2N1cyxzPXRoaXMuaXNCYWNrd2FyZCgpO249cz9sOmksaT1zP2k6bDt2YXIgYT0wLHU9clswXTtpZihsPW4udHlwZT09PSJlbGVtZW50Ij8wOm4ub2Zmc2V0LG4udHlwZT09PSJ0ZXh0IiYmbD09PXUuZ2V0VGV4dENvbnRlbnRTaXplKCkmJihhPTEsdT1yWzFdLGw9MCksdSE9bnVsbCl7cz11LmdldEZvcm1hdEZsYWdzKHQsbnVsbCk7dmFyIGM9by0xLGQ9cltjXTtpZihvPWkudHlwZT09PSJ0ZXh0Ij9pLm9mZnNldDpkLmdldFRleHRDb250ZW50U2l6ZSgpLHUuaXMoZCkpbCE9PW8mJihsPT09MCYmbz09PXUuZ2V0VGV4dENvbnRlbnRTaXplKCk/dS5zZXRGb3JtYXQocyk6KHQ9dS5zcGxpdFRleHQobCxvKSx0PWw9PT0wP3RbMF06dFsxXSx0LnNldEZvcm1hdChzKSxuLnR5cGU9PT0idGV4dCImJm4uc2V0KHQuX19rZXksMCwidGV4dCIpLGkudHlwZT09PSJ0ZXh0IiYmaS5zZXQodC5fX2tleSxvLWwsInRleHQiKSksdGhpcy5mb3JtYXQ9cyk7ZWxzZXtsIT09MCYmKFssdV09dS5zcGxpdFRleHQobCksbD0wKSx1LnNldEZvcm1hdChzKTt2YXIgZj1kLmdldEZvcm1hdEZsYWdzKHQscyk7Zm9yKDA8byYmKG8hPT1kLmdldFRleHRDb250ZW50U2l6ZSgpJiYoW2RdPWQuc3BsaXRUZXh0KG8pKSxkLnNldEZvcm1hdChmKSksYSs9MTthPGM7YSsrKXtsZXQgaD1yW2FdO2lmKCFoLmlzVG9rZW4oKSl7bGV0IG09aC5nZXRGb3JtYXRGbGFncyh0LGYpO2guc2V0Rm9ybWF0KG0pfX1uLnR5cGU9PT0idGV4dCImJm4uc2V0KHUuX19rZXksbCwidGV4dCIpLGkudHlwZT09PSJ0ZXh0IiYmaS5zZXQoZC5fX2tleSxvLCJ0ZXh0IiksdGhpcy5mb3JtYXQ9c3xmfX19fX1pbnNlcnROb2Rlcyh0LG4pe2lmKCF0aGlzLmlzQ29sbGFwc2VkKCkpe3ZhciByPXRoaXMuaXNCYWNrd2FyZCgpP3RoaXMuYW5jaG9yOnRoaXMuZm9jdXMsaT1yLmdldE5vZGUoKS5nZXROZXh0U2libGluZygpO2lmKGk9aT9pLmdldEtleSgpOm51bGwscj0ocj1yLmdldE5vZGUoKS5nZXRQcmV2aW91c1NpYmxpbmcoKSk/ci5nZXRLZXkoKTpudWxsLHRoaXMucmVtb3ZlVGV4dCgpLHRoaXMuaXNDb2xsYXBzZWQoKSYmdGhpcy5mb2N1cy50eXBlPT09ImVsZW1lbnQiKXtpZih0aGlzLmZvY3VzLmtleT09PWkmJnRoaXMuZm9jdXMub2Zmc2V0PT09MCl7dmFyIG89RHQoKTt0aGlzLmZvY3VzLmdldE5vZGUoKS5pbnNlcnRCZWZvcmUobyl9ZWxzZSB0aGlzLmZvY3VzLmtleT09PXImJnRoaXMuZm9jdXMub2Zmc2V0PT09dGhpcy5mb2N1cy5nZXROb2RlKCkuZ2V0Q2hpbGRyZW5TaXplKCkmJihvPUR0KCksdGhpcy5mb2N1cy5nZXROb2RlKCkuaW5zZXJ0QWZ0ZXIobykpO28mJih0aGlzLmZvY3VzLnNldChvLl9fa2V5LDAsInRleHQiKSx0aGlzLmFuY2hvci5zZXQoby5fX2tleSwwLCJ0ZXh0IikpfX1vPXRoaXMuYW5jaG9yLHI9by5vZmZzZXQ7dmFyIGw9by5nZXROb2RlKCk7aT1sLG8udHlwZT09PSJlbGVtZW50IiYmKG89by5nZXROb2RlKCksaT1vLmdldENoaWxkQXRJbmRleChyLTEpLGk9aT09PW51bGw/bzppKSxvPVtdO3ZhciBzPWwuZ2V0TmV4dFNpYmxpbmdzKCksYT14cihsKT9udWxsOmwuZ2V0VG9wTGV2ZWxFbGVtZW50T3JUaHJvdygpO2lmKEoobCkpaWYoaT1sLmdldFRleHRDb250ZW50KCkubGVuZ3RoLHI9PT0wJiZpIT09MClpPWwuZ2V0UHJldmlvdXNTaWJsaW5nKCksaT1pIT09bnVsbD9pOmwuZ2V0UGFyZW50T3JUaHJvdygpLG8ucHVzaChsKTtlbHNlIGlmKHI9PT1pKWk9bDtlbHNle2lmKGwuaXNUb2tlbigpKXJldHVybiExO1tpLGxdPWwuc3BsaXRUZXh0KHIpLG8ucHVzaChsKX1sPWksby5wdXNoKC4uLnMpLHM9dFswXTt2YXIgdT0hMSxjPW51bGw7Zm9yKGxldCBtPTA7bTx0Lmxlbmd0aDttKyspe3ZhciBkPXRbbV07aWYoeHIoaSl8fHR0KGkpfHwhQihkKXx8ZC5pc0lubGluZSgpKXUmJiFCKGQpJiYhdHQoZCkmJnhyKGkuZ2V0UGFyZW50KCkpJiZIKDI4KTtlbHNle2lmKGQuaXMocykpe2lmKEIoaSkmJmkuaXNFbXB0eSgpJiZpLmNhblJlcGxhY2VXaXRoKGQpKXtpLnJlcGxhY2UoZCksaT1kLHU9ITA7Y29udGludWV9aWYodT1kLmdldEZpcnN0RGVzY2VuZGFudCgpLEpTKHUpKXtmb3IodmFyIGY9dS5nZXRQYXJlbnRPclRocm93KCk7Zi5pc0lubGluZSgpOylmPWYuZ2V0UGFyZW50T3JUaHJvdygpO2lmKGM9Zi5nZXRDaGlsZHJlbigpLHU9Yy5sZW5ndGgsQihpKSl7dmFyIGg9aS5nZXRGaXJzdENoaWxkKCk7Zm9yKGxldCBnPTA7Zzx1O2crKyl7bGV0IFM9Y1tnXTtoPT09bnVsbD9pLmFwcGVuZChTKTpoLmluc2VydEFmdGVyKFMpLGg9U319ZWxzZXtmb3IoaD11LTE7MDw9aDtoLS0paS5pbnNlcnRBZnRlcihjW2hdKTtpPWkuZ2V0UGFyZW50T3JUaHJvdygpfWlmKGM9Y1t1LTFdLGYucmVtb3ZlKCksdT0hMCxmLmlzKGQpKWNvbnRpbnVlfX1KKGkpJiYoYT09PW51bGwmJkgoMjcpLGk9YSl9dT0hMSxCKGkpJiYhaS5pc0lubGluZSgpPyhjPWQsdHQoZCkmJiFkLmlzSW5saW5lKCk/aT10Lmxlbmd0aD09PTEmJmkuY2FuQmVFbXB0eSgpJiZpLmlzRW1wdHkoKT9pLmluc2VydEJlZm9yZShkLCExKTppLmluc2VydEFmdGVyKGQsITEpOkIoZCk/KGQuY2FuQmVFbXB0eSgpfHwhZC5pc0VtcHR5KCkpJiYobW4oaSk/KGY9aS5nZXRDaGlsZEF0SW5kZXgociksZiE9PW51bGw/Zi5pbnNlcnRCZWZvcmUoZCk6aS5hcHBlbmQoZCksaT1kKTpkLmlzSW5saW5lKCk/KGkuYXBwZW5kKGQpLGk9ZCk6aT1pLmluc2VydEFmdGVyKGQsITEpKTooZj1pLmdldEZpcnN0Q2hpbGQoKSxmIT09bnVsbD9mLmluc2VydEJlZm9yZShkKTppLmFwcGVuZChkKSxpPWQpKTohQihkKXx8QihkKSYmZC5pc0lubGluZSgpfHx0dChpKSYmIWkuaXNJbmxpbmUoKT8oYz1kLG1lKHRoaXMpJiZ0dChkKSYmKEIoaSl8fEooaSkpJiYhZC5pc0lubGluZSgpPyhKKGkpPyhmPWkuZ2V0UGFyZW50T3JUaHJvdygpLFtpXT1pLnNwbGl0VGV4dChyKSxpPWkuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsxKTooZj1pLGk9ciksWyxpXT1zRShmLGkpLGk9aS5pbnNlcnRCZWZvcmUoZCkpOmk9aS5pbnNlcnRBZnRlcihkLCExKSk6KGQ9aS5nZXRQYXJlbnRPclRocm93KCksb3UoaSkmJmkucmVtb3ZlKCksaT1kLG0tLSl9aWYobiYmKEoobCk/bC5zZWxlY3QoKToodD1pLmdldFByZXZpb3VzU2libGluZygpLEoodCk/dC5zZWxlY3QoKToodD1pLmdldEluZGV4V2l0aGluUGFyZW50KCksaS5nZXRQYXJlbnRPclRocm93KCkuc2VsZWN0KHQsdCkpKSksQihpKSl7aWYodD1KKGMpP2M6QihjKSYmYy5pc0lubGluZSgpP2MuZ2V0TGFzdERlc2NlbmRhbnQoKTppLmdldExhc3REZXNjZW5kYW50KCksbnx8KHQ9PT1udWxsP2kuc2VsZWN0KCk6Sih0KT90LmdldFRleHRDb250ZW50KCk9PT0iIj90LnNlbGVjdFByZXZpb3VzKCk6dC5zZWxlY3QoKTp0LnNlbGVjdE5leHQoKSksby5sZW5ndGghPT0wKWZvcihuPWksdD1vLmxlbmd0aC0xOzA8PXQ7dC0tKXI9b1t0XSxhPXIuZ2V0UGFyZW50T3JUaHJvdygpLCFCKGkpfHxFbShyKXx8dHQocikmJighci5pc0lubGluZSgpfHxyLmlzSXNvbGF0ZWQoKSk/QihpKXx8RW0ocik/QihyKSYmIXIuY2FuSW5zZXJ0QWZ0ZXIoaSk/KGw9YS5jb25zdHJ1Y3Rvci5jbG9uZShhKSxCKGwpfHxIKDI5KSxsLmFwcGVuZChyKSxpLmluc2VydEFmdGVyKGwpKTppLmluc2VydEFmdGVyKHIpOihpLmluc2VydEJlZm9yZShyKSxpPXIpOihuPT09aT9pLmFwcGVuZChyKTppLmluc2VydEJlZm9yZShyKSxpPXIpLGEuaXNFbXB0eSgpJiYhYS5jYW5CZUVtcHR5KCkmJmEucmVtb3ZlKCl9ZWxzZSBufHwoSihpKT9pLnNlbGVjdCgpOihuPWkuZ2V0UGFyZW50T3JUaHJvdygpLHQ9aS5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEsbi5zZWxlY3QodCx0KSkpO3JldHVybiEwfWluc2VydFBhcmFncmFwaCgpe3RoaXMuaXNDb2xsYXBzZWQoKXx8dGhpcy5yZW1vdmVUZXh0KCk7dmFyIHQ9dGhpcy5hbmNob3Isbj10Lm9mZnNldCxyPVtdO2lmKHQudHlwZT09PSJ0ZXh0Iil7dmFyIGk9dC5nZXROb2RlKCksbz1pLmdldE5leHRTaWJsaW5ncygpLnJldmVyc2UoKSxsPWkuZ2V0UGFyZW50T3JUaHJvdygpLHM9bC5pc0lubGluZSgpLGE9cz9sLmdldFRleHRDb250ZW50U2l6ZSgpOmkuZ2V0VGV4dENvbnRlbnRTaXplKCk7bj09PTA/by5wdXNoKGkpOihzJiYocj1sLmdldE5leHRTaWJsaW5ncygpKSxuPT09YXx8cyYmbj09PWkuZ2V0VGV4dENvbnRlbnRTaXplKCl8fChbLGldPWkuc3BsaXRUZXh0KG4pLG8ucHVzaChpKSkpfWVsc2V7aWYobD10LmdldE5vZGUoKSx4cihsKSl7bz1YbygpLHI9bC5nZXRDaGlsZEF0SW5kZXgobiksby5zZWxlY3QoKSxyIT09bnVsbD9yLmluc2VydEJlZm9yZShvLCExKTpsLmFwcGVuZChvKTtyZXR1cm59bz1sLmdldENoaWxkcmVuKCkuc2xpY2UobikucmV2ZXJzZSgpfWlmKGk9by5sZW5ndGgsbj09PTAmJjA8aSYmbC5pc0lubGluZSgpKXtpZihyPWwuZ2V0UGFyZW50T3JUaHJvdygpLG89ci5pbnNlcnROZXdBZnRlcih0aGlzLCExKSxCKG8pKWZvcihyPXIuZ2V0Q2hpbGRyZW4oKSxsPTA7bDxyLmxlbmd0aDtsKyspby5hcHBlbmQocltsXSl9ZWxzZSBpZihzPWwuaW5zZXJ0TmV3QWZ0ZXIodGhpcywhMSkscz09PW51bGwpdGhpcy5pbnNlcnRMaW5lQnJlYWsoKTtlbHNlIGlmKEIocykpaWYoYT1sLmdldEZpcnN0Q2hpbGQoKSxuPT09MCYmKGwuaXModC5nZXROb2RlKCkpfHxhJiZhLmlzKHQuZ2V0Tm9kZSgpKSkmJjA8aSlsLmluc2VydEJlZm9yZShzKTtlbHNle2lmKGw9bnVsbCxuPXIubGVuZ3RoLHQ9cy5nZXRQYXJlbnRPclRocm93KCksMDxuKWZvcihhPTA7YTxuO2ErKyl0LmFwcGVuZChyW2FdKTtpZihpIT09MClmb3Iocj0wO3I8aTtyKyspbj1vW3JdLGw9PT1udWxsP3MuYXBwZW5kKG4pOmwuaW5zZXJ0QmVmb3JlKG4pLGw9bjtzLmNhbkJlRW1wdHkoKXx8cy5nZXRDaGlsZHJlblNpemUoKSE9PTA/cy5zZWxlY3RTdGFydCgpOihzLnNlbGVjdFByZXZpb3VzKCkscy5yZW1vdmUoKSl9fWluc2VydExpbmVCcmVhayh0KXtsZXQgbj1jcygpO3ZhciByPXRoaXMuYW5jaG9yO3IudHlwZT09PSJlbGVtZW50IiYmKHI9ci5nZXROb2RlKCksbW4ocikmJnRoaXMuaW5zZXJ0UGFyYWdyYXBoKCkpLHQ/dGhpcy5pbnNlcnROb2Rlcyhbbl0sITApOnRoaXMuaW5zZXJ0Tm9kZXMoW25dKSYmbi5zZWxlY3ROZXh0KDAsMCl9Z2V0Q2hhcmFjdGVyT2Zmc2V0cygpe3JldHVybiBWYyh0aGlzKX1leHRyYWN0KCl7dmFyIHQ9dGhpcy5nZXROb2RlcygpLG49dC5sZW5ndGgscj1uLTEsaT10aGlzLmFuY2hvcjtsZXQgbz10aGlzLmZvY3VzO3ZhciBsPXRbMF07bGV0IHM9dFtyXSxbYSx1XT1WYyh0aGlzKTtyZXR1cm4gbj09PTA/W106bj09PTE/SihsKSYmIXRoaXMuaXNDb2xsYXBzZWQoKT8odD1hPnU/dTphLHI9bC5zcGxpdFRleHQodCxhPnU/YTp1KSx0PXQ9PT0wP3JbMF06clsxXSx0IT1udWxsP1t0XTpbXSk6W2xdOihuPWkuaXNCZWZvcmUobyksSihsKSYmKGk9bj9hOnUsaT09PWwuZ2V0VGV4dENvbnRlbnRTaXplKCk/dC5zaGlmdCgpOmkhPT0wJiYoWyxsXT1sLnNwbGl0VGV4dChpKSx0WzBdPWwpKSxKKHMpJiYobD1zLmdldFRleHRDb250ZW50KCkubGVuZ3RoLG49bj91OmEsbj09PTA/dC5wb3AoKTpuIT09bCYmKFtzXT1zLnNwbGl0VGV4dChuKSx0W3JdPXMpKSx0KX1tb2RpZnkodCxuLHIpe3ZhciBpPXRoaXMuZm9jdXMsbz10aGlzLmFuY2hvcixsPXQ9PT0ibW92ZSIscz11bShpLG4pO2lmKHR0KHMpJiYhcy5pc0lzb2xhdGVkKCkpbCYmcy5pc0tleWJvYXJkU2VsZWN0YWJsZSgpPyhuPUNtKCksbi5hZGQocy5fX2tleSksV3IobikpOih0PW4/cy5nZXRQcmV2aW91c1NpYmxpbmcoKTpzLmdldE5leHRTaWJsaW5nKCksSih0KT8ocz10Ll9fa2V5LG49bj90LmdldFRleHRDb250ZW50KCkubGVuZ3RoOjAsaS5zZXQocyxuLCJ0ZXh0IiksbCYmby5zZXQocyxuLCJ0ZXh0IikpOihyPXMuZ2V0UGFyZW50T3JUaHJvdygpLEIodCk/KHI9dC5fX2tleSxzPW4/dC5nZXRDaGlsZHJlblNpemUoKTowKToocz1zLmdldEluZGV4V2l0aGluUGFyZW50KCkscj1yLl9fa2V5LG58fHMrKyksaS5zZXQocixzLCJlbGVtZW50IiksbCYmby5zZXQocixzLCJlbGVtZW50IikpKTtlbHNlIGlmKG89cHQoKSxpPVhyKG8uX3dpbmRvdykpe3ZhciBhPW8uX2Jsb2NrQ3Vyc29yRWxlbWVudCx1PW8uX3Jvb3RFbGVtZW50O2lmKHU9PT1udWxsfHxhPT09bnVsbHx8IUIocyl8fHMuaXNJbmxpbmUoKXx8cy5jYW5CZUVtcHR5KCl8fGNtKGEsbyx1KSxpLm1vZGlmeSh0LG4/ImJhY2t3YXJkIjoiZm9yd2FyZCIsciksMDxpLnJhbmdlQ291bnQmJihzPWkuZ2V0UmFuZ2VBdCgwKSxvPXRoaXMuYW5jaG9yLmdldE5vZGUoKSxvPW1uKG8pP286b0UobyksdGhpcy5hcHBseURPTVJhbmdlKHMpLHRoaXMuZGlydHk9ITAsIWwpKXtmb3IobD10aGlzLmdldE5vZGVzKCksdD1bXSxyPSExLGE9MDthPGwubGVuZ3RoO2ErKyl1PWxbYV0sT2QodSxvKT90LnB1c2godSk6cj0hMDtyJiYwPHQubGVuZ3RoJiYobj8obj10WzBdLEIobik/bi5zZWxlY3RTdGFydCgpOm4uZ2V0UGFyZW50T3JUaHJvdygpLnNlbGVjdFN0YXJ0KCkpOihuPXRbdC5sZW5ndGgtMV0sQihuKT9uLnNlbGVjdEVuZCgpOm4uZ2V0UGFyZW50T3JUaHJvdygpLnNlbGVjdEVuZCgpKSksKGkuYW5jaG9yTm9kZSE9PXMuc3RhcnRDb250YWluZXJ8fGkuYW5jaG9yT2Zmc2V0IT09cy5zdGFydE9mZnNldCkmJihuPXRoaXMuZm9jdXMsbD10aGlzLmFuY2hvcixpPWwua2V5LHM9bC5vZmZzZXQsbz1sLnR5cGUsRGkobCxuLmtleSxuLm9mZnNldCxuLnR5cGUpLERpKG4saSxzLG8pLHRoaXMuX2NhY2hlZE5vZGVzPW51bGwpfX19ZGVsZXRlQ2hhcmFjdGVyKHQpe2xldCBuPXRoaXMuaXNDb2xsYXBzZWQoKTtpZih0aGlzLmlzQ29sbGFwc2VkKCkpe3ZhciByPXRoaXMuYW5jaG9yLGk9dGhpcy5mb2N1cyxvPXIuZ2V0Tm9kZSgpO2lmKCF0JiYoci50eXBlPT09ImVsZW1lbnQiJiZCKG8pJiZyLm9mZnNldD09PW8uZ2V0Q2hpbGRyZW5TaXplKCl8fHIudHlwZT09PSJ0ZXh0IiYmci5vZmZzZXQ9PT1vLmdldFRleHRDb250ZW50U2l6ZSgpKSl7dmFyIGw9by5nZXRQYXJlbnQoKTtpZihsPW8uZ2V0TmV4dFNpYmxpbmcoKXx8KGw9PT1udWxsP251bGw6bC5nZXROZXh0U2libGluZygpKSxCKGwpJiZsLmlzU2hhZG93Um9vdCgpKXJldHVybn1pZihsPXVtKGksdCksdHQobCkmJiFsLmlzSXNvbGF0ZWQoKSl7bC5pc0tleWJvYXJkU2VsZWN0YWJsZSgpJiZCKG8pJiZvLmdldENoaWxkcmVuU2l6ZSgpPT09MD8oby5yZW1vdmUoKSx0PUNtKCksdC5hZGQobC5fX2tleSksV3IodCkpOihsLnJlbW92ZSgpLHB0KCkuZGlzcGF0Y2hDb21tYW5kKENmLHZvaWQgMCkpO3JldHVybn1pZighdCYmQihsKSYmQihvKSYmby5pc0VtcHR5KCkpe28ucmVtb3ZlKCksbC5zZWxlY3RTdGFydCgpO3JldHVybn1pZih0aGlzLm1vZGlmeSgiZXh0ZW5kIix0LCJjaGFyYWN0ZXIiKSx0aGlzLmlzQ29sbGFwc2VkKCkpe2lmKHQmJnIub2Zmc2V0PT09MCYmKHIudHlwZT09PSJlbGVtZW50Ij9yLmdldE5vZGUoKTpyLmdldE5vZGUoKS5nZXRQYXJlbnRPclRocm93KCkpLmNvbGxhcHNlQXRTdGFydCh0aGlzKSlyZXR1cm59ZWxzZXtpZihsPWkudHlwZT09PSJ0ZXh0Ij9pLmdldE5vZGUoKTpudWxsLG89ci50eXBlPT09InRleHQiP3IuZ2V0Tm9kZSgpOm51bGwsbCE9PW51bGwmJmwuaXNTZWdtZW50ZWQoKSl7aWYocj1pLm9mZnNldCxpPWwuZ2V0VGV4dENvbnRlbnRTaXplKCksbC5pcyhvKXx8dCYmciE9PWl8fCF0JiZyIT09MCl7RzAobCx0LHIpO3JldHVybn19ZWxzZSBpZihvIT09bnVsbCYmby5pc1NlZ21lbnRlZCgpJiYocj1yLm9mZnNldCxpPW8uZ2V0VGV4dENvbnRlbnRTaXplKCksby5pcyhsKXx8dCYmciE9PTB8fCF0JiZyIT09aSkpe0cwKG8sdCxyKTtyZXR1cm59aWYobz10aGlzLmFuY2hvcixsPXRoaXMuZm9jdXMscj1vLmdldE5vZGUoKSxpPWwuZ2V0Tm9kZSgpLHI9PT1pJiZvLnR5cGU9PT0idGV4dCImJmwudHlwZT09PSJ0ZXh0Iil7dmFyIHM9by5vZmZzZXQsYT1sLm9mZnNldDtsZXQgdT1zPGE7aT11P3M6YSxhPXU/YTpzLHM9YS0xLGkhPT1zJiYocj1yLmdldFRleHRDb250ZW50KCkuc2xpY2UoaSxhKSxuRShyKXx8KHQ/bC5vZmZzZXQ9czpvLm9mZnNldD1zKSl9fX10aGlzLnJlbW92ZVRleHQoKSx0JiYhbiYmdGhpcy5pc0NvbGxhcHNlZCgpJiZ0aGlzLmFuY2hvci50eXBlPT09ImVsZW1lbnQiJiZ0aGlzLmFuY2hvci5vZmZzZXQ9PT0wJiYodD10aGlzLmFuY2hvci5nZXROb2RlKCksdC5pc0VtcHR5KCkmJm1uKHQuZ2V0UGFyZW50KCkpJiZ0LmdldEluZGV4V2l0aGluUGFyZW50KCk9PT0wJiZ0LmNvbGxhcHNlQXRTdGFydCh0aGlzKSl9ZGVsZXRlTGluZSh0KXt0aGlzLmlzQ29sbGFwc2VkKCkmJih0aGlzLmFuY2hvci50eXBlPT09InRleHQiJiZ0aGlzLm1vZGlmeSgiZXh0ZW5kIix0LCJsaW5lYm91bmRhcnkiKSwodD90aGlzLmZvY3VzOnRoaXMuYW5jaG9yKS5vZmZzZXQ9PT0wJiZ0aGlzLm1vZGlmeSgiZXh0ZW5kIix0LCJjaGFyYWN0ZXIiKSksdGhpcy5yZW1vdmVUZXh0KCl9ZGVsZXRlV29yZCh0KXt0aGlzLmlzQ29sbGFwc2VkKCkmJnRoaXMubW9kaWZ5KCJleHRlbmQiLHQsIndvcmQiKSx0aGlzLnJlbW92ZVRleHQoKX19ZnVuY3Rpb24gYnMoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBQZn1mdW5jdGlvbiBaMChlKXtsZXQgdD1lLm9mZnNldDtyZXR1cm4gZS50eXBlPT09InRleHQiP3Q6KGU9ZS5nZXROb2RlKCksdD09PWUuZ2V0Q2hpbGRyZW5TaXplKCk/ZS5nZXRUZXh0Q29udGVudCgpLmxlbmd0aDowKX1mdW5jdGlvbiBWYyhlKXtsZXQgdD1lLmFuY2hvcjtyZXR1cm4gZT1lLmZvY3VzLHQudHlwZT09PSJlbGVtZW50IiYmZS50eXBlPT09ImVsZW1lbnQiJiZ0LmtleT09PWUua2V5JiZ0Lm9mZnNldD09PWUub2Zmc2V0P1swLDBdOltaMCh0KSxaMChlKV19ZnVuY3Rpb24gRzAoZSx0LG4pe2xldCByPWUuZ2V0VGV4dENvbnRlbnQoKS5zcGxpdCgvKD89XHMpL2cpLGk9ci5sZW5ndGgsbz0wLGw9MDtmb3IobGV0IHM9MDtzPGk7cysrKXtsZXQgYT1yW3NdLHU9cz09PWktMTtpZihsPW8sbys9YS5sZW5ndGgsdCYmbz09PW58fG8+bnx8dSl7ci5zcGxpY2UocywxKSx1JiYobD12b2lkIDApO2JyZWFrfX10PXIuam9pbigiIikudHJpbSgpLHQ9PT0iIj9lLnJlbW92ZSgpOihlLnNldFRleHRDb250ZW50KHQpLGUuc2VsZWN0KGwsbCkpfWZ1bmN0aW9uIFkwKGUsdCxuLHIpe3ZhciBpPXQ7aWYoZS5ub2RlVHlwZT09PTEpe2xldCBzPSExO3ZhciBvPWUuY2hpbGROb2RlcyxsPW8ubGVuZ3RoO2k9PT1sJiYocz0hMCxpPWwtMSk7bGV0IGE9b1tpXTtpZihsPSExLGE9PT1yLl9ibG9ja0N1cnNvckVsZW1lbnQ/KGE9b1tpKzFdLGw9ITApOnIuX2Jsb2NrQ3Vyc29yRWxlbWVudCE9PW51bGwmJmktLSxyPWpsKGEpLEoocikpaT1zP3IuZ2V0VGV4dENvbnRlbnRTaXplKCk6MDtlbHNle2lmKG89amwoZSksbz09PW51bGwpcmV0dXJuIG51bGw7aWYoQihvKT8oZT1vLmdldENoaWxkQXRJbmRleChpKSwodD1CKGUpKSYmKHQ9ZS5nZXRQYXJlbnQoKSx0PW49PT1udWxsfHx0PT09bnVsbHx8IXQuY2FuQmVFbXB0eSgpfHx0IT09bi5nZXROb2RlKCkpLHQmJihuPXM/ZS5nZXRMYXN0RGVzY2VuZGFudCgpOmUuZ2V0Rmlyc3REZXNjZW5kYW50KCksbj09PW51bGw/KG89ZSxpPTApOihlPW4sbz1CKGUpP2U6ZS5nZXRQYXJlbnRPclRocm93KCkpKSxKKGUpPyhyPWUsbz1udWxsLGk9cz9lLmdldFRleHRDb250ZW50U2l6ZSgpOjApOmUhPT1vJiZzJiYhbCYmaSsrKTooaT1vLmdldEluZGV4V2l0aGluUGFyZW50KCksaT10PT09MCYmdHQobykmJmpsKGUpPT09bz9pOmkrMSxvPW8uZ2V0UGFyZW50T3JUaHJvdygpKSxCKG8pKXJldHVybiBuZXcgVnIoby5fX2tleSxpLCJlbGVtZW50Iil9fWVsc2Ugcj1qbChlKTtyZXR1cm4gSihyKT9uZXcgVnIoci5fX2tleSxpLCJ0ZXh0Iik6bnVsbH1mdW5jdGlvbiBYMChlLHQsbil7dmFyIHI9ZS5vZmZzZXQsaT1lLmdldE5vZGUoKTtyPT09MD8ocj1pLmdldFByZXZpb3VzU2libGluZygpLGk9aS5nZXRQYXJlbnQoKSx0PyhufHwhdCkmJnI9PT1udWxsJiZCKGkpJiZpLmlzSW5saW5lKCkmJih0PWkuZ2V0UHJldmlvdXNTaWJsaW5nKCksSih0KSYmKGUua2V5PXQuX19rZXksZS5vZmZzZXQ9dC5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCkpOkIocikmJiFuJiZyLmlzSW5saW5lKCk/KGUua2V5PXIuX19rZXksZS5vZmZzZXQ9ci5nZXRDaGlsZHJlblNpemUoKSxlLnR5cGU9ImVsZW1lbnQiKTpKKHIpJiYoZS5rZXk9ci5fX2tleSxlLm9mZnNldD1yLmdldFRleHRDb250ZW50KCkubGVuZ3RoKSk6cj09PWkuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGgmJihyPWkuZ2V0TmV4dFNpYmxpbmcoKSxpPWkuZ2V0UGFyZW50KCksdCYmQihyKSYmci5pc0lubGluZSgpPyhlLmtleT1yLl9fa2V5LGUub2Zmc2V0PTAsZS50eXBlPSJlbGVtZW50Iik6KG58fHQpJiZyPT09bnVsbCYmQihpKSYmaS5pc0lubGluZSgpJiYhaS5jYW5JbnNlcnRUZXh0QWZ0ZXIoKSYmKHQ9aS5nZXROZXh0U2libGluZygpLEoodCkmJihlLmtleT10Ll9fa2V5LGUub2Zmc2V0PTApKSl9ZnVuY3Rpb24gU0UoZSx0LG4pe2lmKGUudHlwZT09PSJ0ZXh0IiYmdC50eXBlPT09InRleHQiKXt2YXIgcj1lLmlzQmVmb3JlKHQpO2xldCBpPWUuaXModCk7WDAoZSxyLGkpLFgwKHQsIXIsaSksaSYmKHQua2V5PWUua2V5LHQub2Zmc2V0PWUub2Zmc2V0LHQudHlwZT1lLnR5cGUpLHI9cHQoKSxyLmlzQ29tcG9zaW5nKCkmJnIuX2NvbXBvc2l0aW9uS2V5IT09ZS5rZXkmJm1lKG4pJiYocj1uLmFuY2hvcixuPW4uZm9jdXMsRGkoZSxyLmtleSxyLm9mZnNldCxyLnR5cGUpLERpKHQsbi5rZXksbi5vZmZzZXQsbi50eXBlKSl9fWZ1bmN0aW9uIEVFKGUsdCxuLHIsaSxvKXtyZXR1cm4gZT09PW51bGx8fG49PT1udWxsfHwhTXUoaSxlLG4pfHwodD1ZMChlLHQsbWUobyk/by5hbmNob3I6bnVsbCxpKSx0PT09bnVsbCl8fChyPVkwKG4scixtZShvKT9vLmZvY3VzOm51bGwsaSkscj09PW51bGx8fHQudHlwZT09PSJlbGVtZW50IiYmci50eXBlPT09ImVsZW1lbnQiJiYoZT1qbChlKSxuPWpsKG4pLHR0KGUpJiZ0dChuKSkpP251bGw6KFNFKHQscixvKSxbdCxyXSl9ZnVuY3Rpb24gRW0oZSl7cmV0dXJuIEIoZSkmJiFlLmlzSW5saW5lKCl9ZnVuY3Rpb24gQ0UoZSx0LG4scixpLG8pe2xldCBsPVFyKCk7cmV0dXJuIGU9bmV3IGFsKG5ldyBWcihlLHQsaSksbmV3IFZyKG4scixvKSwwLCIiKSxlLmRpcnR5PSEwLGwuX3NlbGVjdGlvbj1lfWZ1bmN0aW9uIENtKCl7cmV0dXJuIG5ldyBQZihuZXcgU2V0KX1mdW5jdGlvbiB3TyhlKXtsZXQgdD1lLmdldEVkaXRvclN0YXRlKCkuX3NlbGVjdGlvbixuPVhyKGUuX3dpbmRvdyk7cmV0dXJuIGJzKHQpfHx5dih0KT90LmNsb25lKCk6eHYodCxuLGUpfWZ1bmN0aW9uIHh2KGUsdCxuKXt2YXIgcj1uLl93aW5kb3c7aWYocj09PW51bGwpcmV0dXJuIG51bGw7dmFyIGk9ci5ldmVudCxvPWk/aS50eXBlOnZvaWQgMDtyPW89PT0ic2VsZWN0aW9uY2hhbmdlIixpPSFzbSYmKHJ8fG89PT0iYmVmb3JlaW5wdXQifHxvPT09ImNvbXBvc2l0aW9uc3RhcnQifHxvPT09ImNvbXBvc2l0aW9uZW5kInx8bz09PSJjbGljayImJmkmJmkuZGV0YWlsPT09M3x8bz09PSJkcm9wInx8bz09PXZvaWQgMCk7bGV0IGw7aWYoIW1lKGUpfHxpKXtpZih0PT09bnVsbClyZXR1cm4gbnVsbDtpZihpPXQuYW5jaG9yTm9kZSxvPXQuZm9jdXNOb2RlLGw9dC5hbmNob3JPZmZzZXQsdD10LmZvY3VzT2Zmc2V0LHImJm1lKGUpJiYhTXUobixpLG8pKXJldHVybiBlLmNsb25lKCl9ZWxzZSByZXR1cm4gZS5jbG9uZSgpO2lmKG49RUUoaSxsLG8sdCxuLGUpLG49PT1udWxsKXJldHVybiBudWxsO2xldFtzLGFdPW47cmV0dXJuIG5ldyBhbChzLGEsbWUoZSk/ZS5mb3JtYXQ6MCxtZShlKT9lLnN0eWxlOiIiKX1mdW5jdGlvbiBydCgpe3JldHVybiBRcigpLl9zZWxlY3Rpb259ZnVuY3Rpb24gVHMoKXtyZXR1cm4gcHQoKS5fZWRpdG9yU3RhdGUuX3NlbGVjdGlvbn1mdW5jdGlvbiBNZChlLHQsbixyPTEpe3ZhciBpPWUuYW5jaG9yLG89ZS5mb2N1cyxsPWkuZ2V0Tm9kZSgpLHM9by5nZXROb2RlKCk7aWYodC5pcyhsKXx8dC5pcyhzKSl7aWYobD10Ll9fa2V5LGUuaXNDb2xsYXBzZWQoKSl0PWkub2Zmc2V0LChuPD10JiYwPHJ8fG48dCYmMD5yKSYmKG49TWF0aC5tYXgoMCx0K3IpLGkuc2V0KGwsbiwiZWxlbWVudCIpLG8uc2V0KGwsbiwiZWxlbWVudCIpLFEwKGUpKTtlbHNle2xldCB1PWUuaXNCYWNrd2FyZCgpO3M9dT9vOmk7dmFyIGE9cy5nZXROb2RlKCk7aT11P2k6byxvPWkuZ2V0Tm9kZSgpLHQuaXMoYSkmJihhPXMub2Zmc2V0LChuPD1hJiYwPHJ8fG48YSYmMD5yKSYmcy5zZXQobCxNYXRoLm1heCgwLGErciksImVsZW1lbnQiKSksdC5pcyhvKSYmKHQ9aS5vZmZzZXQsKG48PXQmJjA8cnx8bjx0JiYwPnIpJiZpLnNldChsLE1hdGgubWF4KDAsdCtyKSwiZWxlbWVudCIpKX1RMChlKX19ZnVuY3Rpb24gUTAoZSl7dmFyIHQ9ZS5hbmNob3Isbj10Lm9mZnNldDtsZXQgcj1lLmZvY3VzO3ZhciBpPXIub2Zmc2V0LG89dC5nZXROb2RlKCksbD1yLmdldE5vZGUoKTtpZihlLmlzQ29sbGFwc2VkKCkpQihvKSYmKGw9by5nZXRDaGlsZHJlblNpemUoKSxsPShpPW4+PWwpP28uZ2V0Q2hpbGRBdEluZGV4KGwtMSk6by5nZXRDaGlsZEF0SW5kZXgobiksSihsKSYmKG49MCxpJiYobj1sLmdldFRleHRDb250ZW50U2l6ZSgpKSx0LnNldChsLl9fa2V5LG4sInRleHQiKSxyLnNldChsLl9fa2V5LG4sInRleHQiKSkpO2Vsc2V7aWYoQihvKSl7bGV0IHM9by5nZXRDaGlsZHJlblNpemUoKTtuPShlPW4+PXMpP28uZ2V0Q2hpbGRBdEluZGV4KHMtMSk6by5nZXRDaGlsZEF0SW5kZXgobiksSihuKSYmKG89MCxlJiYobz1uLmdldFRleHRDb250ZW50U2l6ZSgpKSx0LnNldChuLl9fa2V5LG8sInRleHQiKSl9QihsKSYmKG49bC5nZXRDaGlsZHJlblNpemUoKSxpPSh0PWk+PW4pP2wuZ2V0Q2hpbGRBdEluZGV4KG4tMSk6bC5nZXRDaGlsZEF0SW5kZXgoaSksSihpKSYmKGw9MCx0JiYobD1pLmdldFRleHRDb250ZW50U2l6ZSgpKSxyLnNldChpLl9fa2V5LGwsInRleHQiKSkpfX1mdW5jdGlvbiBTTyhlLHQpe2lmKHQ9dC5nZXRFZGl0b3JTdGF0ZSgpLl9zZWxlY3Rpb24sZT1lLl9zZWxlY3Rpb24sbWUoZSkpe3ZhciBuPWUuYW5jaG9yO2xldCByPWUuZm9jdXMsaTtuLnR5cGU9PT0idGV4dCImJihpPW4uZ2V0Tm9kZSgpLGkuc2VsZWN0aW9uVHJhbnNmb3JtKHQsZSkpLHIudHlwZT09PSJ0ZXh0IiYmKG49ci5nZXROb2RlKCksaSE9PW4mJm4uc2VsZWN0aW9uVHJhbnNmb3JtKHQsZSkpfX1mdW5jdGlvbiBEZChlLHQsbixyLGkpe2xldCBvPW51bGwsbD0wLHM9bnVsbDtyIT09bnVsbD8obz1yLl9fa2V5LEoocik/KGw9ci5nZXRUZXh0Q29udGVudFNpemUoKSxzPSJ0ZXh0Iik6QihyKSYmKGw9ci5nZXRDaGlsZHJlblNpemUoKSxzPSJlbGVtZW50IikpOmkhPT1udWxsJiYobz1pLl9fa2V5LEooaSk/cz0idGV4dCI6QihpKSYmKHM9ImVsZW1lbnQiKSksbyE9PW51bGwmJnMhPT1udWxsP2Uuc2V0KG8sbCxzKToobD10LmdldEluZGV4V2l0aGluUGFyZW50KCksbD09PS0xJiYobD1uLmdldENoaWxkcmVuU2l6ZSgpKSxlLnNldChuLl9fa2V5LGwsImVsZW1lbnQiKSl9ZnVuY3Rpb24gSjAoZSx0LG4scixpKXtlLnR5cGU9PT0idGV4dCI/KGUua2V5PW4sdHx8KGUub2Zmc2V0Kz1pKSk6ZS5vZmZzZXQ+ci5nZXRJbmRleFdpdGhpblBhcmVudCgpJiYtLWUub2Zmc2V0fWZ1bmN0aW9uIGtFKGUsdCxuKXtsZXQgcj1bXSxpPW51bGwsbz1udWxsO2U9ZS5nZXRDaGlsZHJlbigpO2ZvcihsZXQgYz0wO2M8ZS5sZW5ndGg7YysrKXt2YXIgbD1lW2NdO3N1KGwpfHxIKDEwOCk7dmFyIHM9bC5nZXRDaGlsZHJlbigpO2w9MDtmb3IobGV0IGQgb2Ygcyl7Zm9yKFFuKGQpfHxIKDEwOSk7cltjXSE9PXZvaWQgMCYmcltjXVtsXSE9PXZvaWQgMDspbCsrO3M9Yzt2YXIgYT1sLHU9ZDtsZXQgZj17Y2VsbDp1LHN0YXJ0Q29sdW1uOmEsc3RhcnRSb3c6c30saD11Ll9fcm93U3BhbixtPXUuX19jb2xTcGFuO2ZvcihsZXQgZz0wO2c8aDtnKyspe3JbcytnXT09PXZvaWQgMCYmKHJbcytnXT1bXSk7Zm9yKGxldCBTPTA7UzxtO1MrKylyW3MrZ11bYStTXT1mfXQuaXModSkmJihpPWYpLG4uaXModSkmJihvPWYpLGwrPWQuX19jb2xTcGFufX1yZXR1cm4gaT09PW51bGwmJkgoMTEwKSxvPT09bnVsbCYmSCgxMTEpLFtyLGksb119ZnVuY3Rpb24gJEUoZSl7ZSBpbnN0YW5jZW9mIFN2fHwoZSBpbnN0YW5jZW9mIEx1PyhlPVBkKGUsUW4pLFFuKGUpfHxIKDExNCkpOihlPVBkKGUuZ2V0Tm9kZSgpLFFuKSxRbihlKXx8SCgxMTQpKSk7bGV0IHQ9ZS5nZXRQYXJlbnQoKTtzdSh0KXx8SCgxMTUpO2xldCBuPXQuZ2V0UGFyZW50KCk7cmV0dXJuIEV2KG4pfHxIKDExNiksW2UsdCxuXX1sZXQganQ9bnVsbCx6dD1udWxsLE9uPSExLGpoPSExLGx1PTAscTA9e2NoYXJhY3RlckRhdGE6ITAsY2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9O2Z1bmN0aW9uIE5zKCl7cmV0dXJuIE9ufHxqdCE9PW51bGwmJmp0Ll9yZWFkT25seX1mdW5jdGlvbiBobigpe09uJiZIKDEzKX1mdW5jdGlvbiBRcigpe3JldHVybiBqdD09PW51bGwmJkgoMTUpLGp0fWZ1bmN0aW9uIHB0KCl7cmV0dXJuIHp0PT09bnVsbCYmSCgxNiksenR9ZnVuY3Rpb24gZXgoZSx0LG4pe3ZhciByPXQuX190eXBlO2xldCBpPWUuX25vZGVzLmdldChyKTtmb3IoaT09PXZvaWQgMCYmSCgzMCxyKSxlPW4uZ2V0KHIpLGU9PT12b2lkIDAmJihlPUFycmF5LmZyb20oaS50cmFuc2Zvcm1zKSxuLnNldChyLGUpKSxuPWUubGVuZ3RoLHI9MDtyPG4mJihlW3JdKHQpLHQuaXNBdHRhY2hlZCgpKTtyKyspO31mdW5jdGlvbiBFTyhlLHQpe3Q9dC5fZGlydHlMZWF2ZXMsZT1lLl9ub2RlTWFwO2ZvcihsZXQgbiBvZiB0KXQ9ZS5nZXQobiksSih0KSYmdC5pc0F0dGFjaGVkKCkmJnQuaXNTaW1wbGVUZXh0KCkmJiF0LmlzVW5tZXJnZWFibGUoKSYmWFModCl9ZnVuY3Rpb24gQ08oZSx0KXtsZXQgbj10Ll9kaXJ0eUxlYXZlcyxyPXQuX2RpcnR5RWxlbWVudHM7ZT1lLl9ub2RlTWFwO2xldCBpPVdpKCksbz1uZXcgTWFwO3ZhciBsPW47bGV0IHM9bC5zaXplO2Zvcih2YXIgYT1yLHU9YS5zaXplOzA8c3x8MDx1Oyl7aWYoMDxzKXt0Ll9kaXJ0eUxlYXZlcz1uZXcgU2V0O2ZvcihsZXQgYyBvZiBsKWw9ZS5nZXQoYyksSihsKSYmbC5pc0F0dGFjaGVkKCkmJmwuaXNTaW1wbGVUZXh0KCkmJiFsLmlzVW5tZXJnZWFibGUoKSYmWFMobCksbCE9PXZvaWQgMCYmbCE9PXZvaWQgMCYmbC5fX2tleSE9PWkmJmwuaXNBdHRhY2hlZCgpJiZleCh0LGwsbyksbi5hZGQoYyk7aWYobD10Ll9kaXJ0eUxlYXZlcyxzPWwuc2l6ZSwwPHMpe2x1Kys7Y29udGludWV9fXQuX2RpcnR5TGVhdmVzPW5ldyBTZXQsdC5fZGlydHlFbGVtZW50cz1uZXcgTWFwO2ZvcihsZXQgYyBvZiBhKWE9Y1swXSx1PWNbMV0sKGE9PT0icm9vdCJ8fHUpJiYobD1lLmdldChhKSxsIT09dm9pZCAwJiZsIT09dm9pZCAwJiZsLl9fa2V5IT09aSYmbC5pc0F0dGFjaGVkKCkmJmV4KHQsbCxvKSxyLnNldChhLHUpKTtsPXQuX2RpcnR5TGVhdmVzLHM9bC5zaXplLGE9dC5fZGlydHlFbGVtZW50cyx1PWEuc2l6ZSxsdSsrfXQuX2RpcnR5TGVhdmVzPW4sdC5fZGlydHlFbGVtZW50cz1yfWZ1bmN0aW9uIF92KGUsdCl7dmFyIG49ZS50eXBlLHI9dC5nZXQobik7aWYocj09PXZvaWQgMCYmSCgxNyxuKSxuPXIua2xhc3MsZS50eXBlIT09bi5nZXRUeXBlKCkmJkgoMTgsbi5uYW1lKSxuPW4uaW1wb3J0SlNPTihlKSxlPWUuY2hpbGRyZW4sQihuKSYmQXJyYXkuaXNBcnJheShlKSlmb3Iocj0wO3I8ZS5sZW5ndGg7cisrKXtsZXQgaT1fdihlW3JdLHQpO24uYXBwZW5kKGkpfXJldHVybiBufWZ1bmN0aW9uIHR4KGUsdCl7bGV0IG49anQscj1PbixpPXp0O2p0PWUsT249ITAsenQ9bnVsbDt0cnl7cmV0dXJuIHQoKX1maW5hbGx5e2p0PW4sT249cix6dD1pfX1mdW5jdGlvbiBCbyhlLHQpe2xldCBuPWUuX3BlbmRpbmdFZGl0b3JTdGF0ZSxyPWUuX3Jvb3RFbGVtZW50LGk9ZS5faGVhZGxlc3N8fHI9PT1udWxsO2lmKG4hPT1udWxsKXt2YXIgbz1lLl9lZGl0b3JTdGF0ZSxsPW8uX3NlbGVjdGlvbixzPW4uX3NlbGVjdGlvbixhPWUuX2RpcnR5VHlwZSE9PTAsdT1qdCxjPU9uLGQ9enQsZj1lLl91cGRhdGluZyxoPWUuX29ic2VydmVyLG09bnVsbDtpZihlLl9wZW5kaW5nRWRpdG9yU3RhdGU9bnVsbCxlLl9lZGl0b3JTdGF0ZT1uLCFpJiZhJiZoIT09bnVsbCl7enQ9ZSxqdD1uLE9uPSExLGUuX3VwZGF0aW5nPSEwO3RyeXtsZXQgamU9ZS5fZGlydHlUeXBlLFR0PWUuX2RpcnR5RWxlbWVudHMsYXQ9ZS5fZGlydHlMZWF2ZXM7aC5kaXNjb25uZWN0KCk7dmFyIGc9amUsUz1UdCx2PWF0O2ZuPW9pPU50PSIiLHVFPWc9PT0yLEJjPW51bGwsdG49ZSxpbz1lLl9jb25maWcsbnU9ZS5fbm9kZXMsUmY9dG4uX2xpc3RlbmVycy5tdXRhdGlvbixkbT1TLGZtPXYsWW89by5fbm9kZU1hcCxvbz1uLl9ub2RlTWFwLHZ2PW4uX3JlYWRPbmx5LGhtPW5ldyBNYXAoZS5fa2V5VG9ET01NYXApO2xldCBsbj1uZXcgTWFwO3J1PWxuLGFhKCJyb290IixudWxsKSxydT1obT1pbz1vbz1Zbz1mbT1kbT1udT10bj12b2lkIDAsbT1sbn1jYXRjaChqZSl7aWYoamUgaW5zdGFuY2VvZiBFcnJvciYmZS5fb25FcnJvcihqZSksamgpdGhyb3cgamU7UkUoZSxudWxsLHIsbiksWVMoZSksZS5fZGlydHlUeXBlPTIsamg9ITAsQm8oZSxvKSxqaD0hMTtyZXR1cm59ZmluYWxseXtoLm9ic2VydmUocixxMCksZS5fdXBkYXRpbmc9ZixqdD11LE9uPWMsenQ9ZH19bi5fcmVhZE9ubHl8fChuLl9yZWFkT25seT0hMCk7dmFyIHk9ZS5fZGlydHlMZWF2ZXMsXz1lLl9kaXJ0eUVsZW1lbnRzLHc9ZS5fbm9ybWFsaXplZE5vZGVzLEU9ZS5fdXBkYXRlVGFncywkPWUuX2RlZmVycmVkO2EmJihlLl9kaXJ0eVR5cGU9MCxlLl9jbG9uZU5vdE5lZWRlZC5jbGVhcigpLGUuX2RpcnR5TGVhdmVzPW5ldyBTZXQsZS5fZGlydHlFbGVtZW50cz1uZXcgTWFwLGUuX25vcm1hbGl6ZWROb2Rlcz1uZXcgU2V0LGUuX3VwZGF0ZVRhZ3M9bmV3IFNldCk7dmFyIEM9ZS5fZGVjb3JhdG9ycyxUPWUuX3BlbmRpbmdEZWNvcmF0b3JzfHxDLE49bi5fbm9kZU1hcCxSO2ZvcihSIGluIFQpTi5oYXMoUil8fChUPT09QyYmKFQ9dEUoZSkpLGRlbGV0ZSBUW1JdKTt2YXIgRD1pP251bGw6WHIoZS5fd2luZG93KTtpZihlLl9lZGl0YWJsZSYmRCE9PW51bGwmJihhfHxzPT09bnVsbHx8cy5kaXJ0eSkpe3p0PWUsanQ9bjt0cnl7aWYoaCE9PW51bGwmJmguZGlzY29ubmVjdCgpLGF8fHM9PT1udWxsfHxzLmRpcnR5KXtsZXQgamU9ZS5fYmxvY2tDdXJzb3JFbGVtZW50O2plIT09bnVsbCYmY20oamUsZSxyKTtlOntsZXQgVHQ9RC5hbmNob3JOb2RlLGF0PUQuZm9jdXNOb2RlLGxuPUQuYW5jaG9yT2Zmc2V0LEVuPUQuZm9jdXNPZmZzZXQsX3Q9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZighKEUuaGFzKCJjb2xsYWJvcmF0aW9uIikmJl90IT09cnx8X3QhPT1udWxsJiZkdihfdCkpKWlmKG1lKHMpKXt2YXIgRj1zLmFuY2hvcixzZT1zLmZvY3VzLFY9Ri5rZXksSz1zZS5rZXksTz1SZChlLFYpLEE9UmQoZSxLKSxrPUYub2Zmc2V0LGo9c2Uub2Zmc2V0LEw9cy5mb3JtYXQsWj1zLnN0eWxlLG5lPXMuaXNDb2xsYXBzZWQoKSxrZT1PLHZlPUEsV2U9ITE7aWYoRi50eXBlPT09InRleHQiKXtrZT1iZChPKTtsZXQgQXQ9Ri5nZXROb2RlKCk7V2U9QXQuZ2V0Rm9ybWF0KCkhPT1MfHxBdC5nZXRTdHlsZSgpIT09Wn1lbHNlIG1lKGwpJiZsLmFuY2hvci50eXBlPT09InRleHQiJiYoV2U9ITApO2lmKHNlLnR5cGU9PT0idGV4dCImJih2ZT1iZChBKSksa2UhPT1udWxsJiZ2ZSE9PW51bGwpe2lmKG5lJiYobD09PW51bGx8fFdlfHxtZShsKSYmKGwuZm9ybWF0IT09THx8bC5zdHlsZSE9PVopKSl7dmFyIEZlPXBlcmZvcm1hbmNlLm5vdygpO3ZFPVtMLFosayxWLEZlXX1pZihsbj09PWsmJkVuPT09aiYmVHQ9PT1rZSYmYXQ9PT12ZSYmKEQudHlwZSE9PSJSYW5nZSJ8fCFuZSkmJihfdCE9PW51bGwmJnIuY29udGFpbnMoX3QpfHxyLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSksRi50eXBlIT09ImVsZW1lbnQiKSlicmVhayBlO3RyeXtELnNldEJhc2VBbmRFeHRlbnQoa2Usayx2ZSxqKX1jYXRjaHt9aWYoIUUuaGFzKCJza2lwLXNjcm9sbC1pbnRvLXZpZXciKSYmcy5pc0NvbGxhcHNlZCgpJiZyIT09bnVsbCYmcj09PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpe2xldCBBdD1zIGluc3RhbmNlb2YgYWwmJnMuYW5jaG9yLnR5cGU9PT0iZWxlbWVudCI/a2UuY2hpbGROb2Rlc1trXXx8bnVsbDowPEQucmFuZ2VDb3VudD9ELmdldFJhbmdlQXQoMCk6bnVsbDtpZihBdCE9PW51bGwpe2xldCBzbjtpZihBdCBpbnN0YW5jZW9mIFRleHQpe2xldCBndD1kb2N1bWVudC5jcmVhdGVSYW5nZSgpO2d0LnNlbGVjdE5vZGUoQXQpLHNuPWd0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfWVsc2Ugc249QXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7bGV0IFBuPXIub3duZXJEb2N1bWVudCxxcj1Qbi5kZWZhdWx0VmlldztpZihxciE9PW51bGwpZm9yKHZhcnt0b3A6dGUsYm90dG9tOkxlfT1zbixiZSxSZSxTZT1yO1NlIT09bnVsbDspe2xldCBndD1TZT09PVBuLmJvZHk7aWYoZ3QpYmU9MCxSZT1UZihlKS5pbm5lckhlaWdodDtlbHNle2xldCBFbz1TZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtiZT1Fby50b3AsUmU9RW8uYm90dG9tfWxldCBOcj0wO2lmKHRlPGJlP05yPS0oYmUtdGUpOkxlPlJlJiYoTnI9TGUtUmUpLE5yIT09MClpZihndClxci5zY3JvbGxCeSgwLE5yKTtlbHNle2xldCBFbz1TZS5zY3JvbGxUb3A7U2Uuc2Nyb2xsVG9wKz1OcjtsZXQgTHM9U2Uuc2Nyb2xsVG9wLUVvO3RlLT1McyxMZS09THN9aWYoZ3QpYnJlYWs7U2U9YmYoU2UpfX19eW09ITB9fWVsc2UgbCE9PW51bGwmJk11KGUsVHQsYXQpJiZELnJlbW92ZUFsbFJhbmdlcygpfX1lOntsZXQgamU9ZS5fYmxvY2tDdXJzb3JFbGVtZW50O2lmKG1lKHMpJiZzLmlzQ29sbGFwc2VkKCkmJnMuYW5jaG9yLnR5cGU9PT0iZWxlbWVudCImJnIuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpe2xldCBUdD1zLmFuY2hvcixhdD1UdC5nZXROb2RlKCksbG49VHQub2Zmc2V0LEVuPWF0LmdldENoaWxkcmVuU2l6ZSgpLF90PSExLEF0PW51bGw7aWYobG49PT1Fbil7bGV0IHNuPWF0LmdldENoaWxkQXRJbmRleChsbi0xKTtPaChzbikmJihfdD0hMCl9ZWxzZXtsZXQgc249YXQuZ2V0Q2hpbGRBdEluZGV4KGxuKTtpZihPaChzbikpe2xldCBQbj1zbi5nZXRQcmV2aW91c1NpYmxpbmcoKTsoUG49PT1udWxsfHxPaChQbikpJiYoX3Q9ITAsQXQ9ZS5nZXRFbGVtZW50QnlLZXkoc24uX19rZXkpKX19aWYoX3Qpe2xldCBzbj1lLmdldEVsZW1lbnRCeUtleShhdC5fX2tleSk7aWYoamU9PT1udWxsKXtsZXQgUG49ZS5fY29uZmlnLnRoZW1lLHFyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3FyLmNvbnRlbnRFZGl0YWJsZT0iZmFsc2UiLHFyLnNldEF0dHJpYnV0ZSgiZGF0YS1sZXhpY2FsLWN1cnNvciIsInRydWUiKTtsZXQgZ3Q9UG4uYmxvY2tDdXJzb3I7aWYoZ3QhPT12b2lkIDApe2lmKHR5cGVvZiBndD09InN0cmluZyIpe2xldCBOcj1ndC5zcGxpdCgiICIpO2d0PVBuLmJsb2NrQ3Vyc29yPU5yfWd0IT09dm9pZCAwJiZxci5jbGFzc0xpc3QuYWRkKC4uLmd0KX1lLl9ibG9ja0N1cnNvckVsZW1lbnQ9amU9cXJ9ci5zdHlsZS5jYXJldENvbG9yPSJ0cmFuc3BhcmVudCIsQXQ9PT1udWxsP3NuLmFwcGVuZENoaWxkKGplKTpzbi5pbnNlcnRCZWZvcmUoamUsQXQpO2JyZWFrIGV9fWplIT09bnVsbCYmY20oamUsZSxyKX1oIT09bnVsbCYmaC5vYnNlcnZlKHIscTApfWZpbmFsbHl7enQ9ZCxqdD11fX1pZihtIT09bnVsbCl7dmFyIERlPW07bGV0IGplPUFycmF5LmZyb20oZS5fbGlzdGVuZXJzLm11dGF0aW9uKSxUdD1qZS5sZW5ndGg7Zm9yKGxldCBhdD0wO2F0PFR0O2F0Kyspe2xldFtsbixFbl09amVbYXRdLF90PURlLmdldChFbik7X3QhPT12b2lkIDAmJmxuKF90LHtkaXJ0eUxlYXZlczp5LHByZXZFZGl0b3JTdGF0ZTpvLHVwZGF0ZVRhZ3M6RX0pfX1tZShzKXx8cz09PW51bGx8fGwhPT1udWxsJiZsLmlzKHMpfHxlLmRpc3BhdGNoQ29tbWFuZChDZix2b2lkIDApO3ZhciBRZT1lLl9wZW5kaW5nRGVjb3JhdG9ycztRZSE9PW51bGwmJihlLl9kZWNvcmF0b3JzPVFlLGUuX3BlbmRpbmdEZWNvcmF0b3JzPW51bGwsVGEoImRlY29yYXRvciIsZSwhMCxRZSkpO3ZhciBXdD1qMCh0fHxvKSxTbj1qMChuKTtpZihXdCE9PVNuJiZUYSgidGV4dGNvbnRlbnQiLGUsITAsU24pLFRhKCJ1cGRhdGUiLGUsITAse2RpcnR5RWxlbWVudHM6XyxkaXJ0eUxlYXZlczp5LGVkaXRvclN0YXRlOm4sbm9ybWFsaXplZE5vZGVzOncscHJldkVkaXRvclN0YXRlOnR8fG8sdGFnczpFfSksZS5fZGVmZXJyZWQ9W10sJC5sZW5ndGghPT0wKXtsZXQgamU9ZS5fdXBkYXRpbmc7ZS5fdXBkYXRpbmc9ITA7dHJ5e2ZvcihsZXQgVHQ9MDtUdDwkLmxlbmd0aDtUdCsrKSRbVHRdKCl9ZmluYWxseXtlLl91cGRhdGluZz1qZX19dmFyIHVyPWUuX3VwZGF0ZXM7aWYodXIubGVuZ3RoIT09MCl7bGV0IGplPXVyLnNoaWZ0KCk7aWYoamUpe2xldFtUdCxhdF09amU7YkUoZSxUdCxhdCl9fX19ZnVuY3Rpb24gVGEoZSx0LG4sLi4ucil7bGV0IGk9dC5fdXBkYXRpbmc7dC5fdXBkYXRpbmc9bjt0cnl7bGV0IG89QXJyYXkuZnJvbSh0Ll9saXN0ZW5lcnNbZV0pO2ZvcihlPTA7ZTxvLmxlbmd0aDtlKyspb1tlXS5hcHBseShudWxsLHIpfWZpbmFsbHl7dC5fdXBkYXRpbmc9aX19ZnVuY3Rpb24gWChlLHQsbil7aWYoZS5fdXBkYXRpbmc9PT0hMXx8enQhPT1lKXtsZXQgbz0hMTtyZXR1cm4gZS51cGRhdGUoKCk9PntvPVgoZSx0LG4pfSksb31sZXQgcj1odihlKTtmb3IobGV0IG89NDswPD1vO28tLSlmb3IobGV0IGw9MDtsPHIubGVuZ3RoO2wrKyl7dmFyIGk9cltsXS5fY29tbWFuZHMuZ2V0KHQpO2lmKGkhPT12b2lkIDAmJihpPWlbb10saSE9PXZvaWQgMCkpe2k9QXJyYXkuZnJvbShpKTtsZXQgcz1pLmxlbmd0aDtmb3IobGV0IGE9MDthPHM7YSsrKWlmKGlbYV0obixlKT09PSEwKXJldHVybiEwfX1yZXR1cm4hMX1mdW5jdGlvbiBueChlLHQpe2xldCBuPWUuX3VwZGF0ZXM7Zm9yKHQ9dHx8ITE7bi5sZW5ndGghPT0wOyl7dmFyIHI9bi5zaGlmdCgpO2lmKHIpe2xldFtpLG9dPXIsbDtvIT09dm9pZCAwJiYocj1vLm9uVXBkYXRlLGw9by50YWcsby5za2lwVHJhbnNmb3JtcyYmKHQ9ITApLHImJmUuX2RlZmVycmVkLnB1c2gociksbCYmZS5fdXBkYXRlVGFncy5hZGQobCkpLGkoKX19cmV0dXJuIHR9ZnVuY3Rpb24gYkUoZSx0LG4pe2xldCByPWUuX3VwZGF0ZVRhZ3M7dmFyIGksbz1pPSExO2lmKG4hPT12b2lkIDApe3ZhciBsPW4ub25VcGRhdGU7aT1uLnRhZyxpIT1udWxsJiZyLmFkZChpKSxpPW4uc2tpcFRyYW5zZm9ybXN8fCExLG89bi5kaXNjcmV0ZXx8ITF9bCYmZS5fZGVmZXJyZWQucHVzaChsKSxuPWUuX2VkaXRvclN0YXRlLGw9ZS5fcGVuZGluZ0VkaXRvclN0YXRlO2xldCBzPSExOyhsPT09bnVsbHx8bC5fcmVhZE9ubHkpJiYobD1lLl9wZW5kaW5nRWRpdG9yU3RhdGU9bmV3IE1mKG5ldyBNYXAoKGx8fG4pLl9ub2RlTWFwKSkscz0hMCksbC5fZmx1c2hTeW5jPW8sbz1qdDtsZXQgYT1Pbix1PXp0LGM9ZS5fdXBkYXRpbmc7anQ9bCxPbj0hMSxlLl91cGRhdGluZz0hMCx6dD1lO3RyeXtzJiYoZS5faGVhZGxlc3M/bi5fc2VsZWN0aW9uIT1udWxsJiYobC5fc2VsZWN0aW9uPW4uX3NlbGVjdGlvbi5jbG9uZSgpKTpsLl9zZWxlY3Rpb249d08oZSkpO2xldCBkPWUuX2NvbXBvc2l0aW9uS2V5O3QoKSxpPW54KGUsaSksU08obCxlKSxlLl9kaXJ0eVR5cGUhPT0wJiYoaT9FTyhsLGUpOkNPKGwsZSksbngoZSksb08obixsLGUuX2RpcnR5TGVhdmVzLGUuX2RpcnR5RWxlbWVudHMpKSxkIT09ZS5fY29tcG9zaXRpb25LZXkmJihsLl9mbHVzaFN5bmM9ITApO2xldCBmPWwuX3NlbGVjdGlvbjtpZihtZShmKSl7bGV0IGg9bC5fbm9kZU1hcCxtPWYuZm9jdXMua2V5O2guZ2V0KGYuYW5jaG9yLmtleSkhPT12b2lkIDAmJmguZ2V0KG0pIT09dm9pZCAwfHxIKDE5KX1lbHNlIGJzKGYpJiZmLl9ub2Rlcy5zaXplPT09MCYmKGwuX3NlbGVjdGlvbj1udWxsKX1jYXRjaChkKXtkIGluc3RhbmNlb2YgRXJyb3ImJmUuX29uRXJyb3IoZCksZS5fcGVuZGluZ0VkaXRvclN0YXRlPW4sZS5fZGlydHlUeXBlPTIsZS5fY2xvbmVOb3ROZWVkZWQuY2xlYXIoKSxlLl9kaXJ0eUxlYXZlcz1uZXcgU2V0LGUuX2RpcnR5RWxlbWVudHMuY2xlYXIoKSxCbyhlKTtyZXR1cm59ZmluYWxseXtqdD1vLE9uPWEsenQ9dSxlLl91cGRhdGluZz1jLGx1PTB9ZS5fZGlydHlUeXBlIT09MHx8a08obCxlKT9sLl9mbHVzaFN5bmM/KGwuX2ZsdXNoU3luYz0hMSxCbyhlKSk6cyYmdE8oKCk9PntCbyhlKX0pOihsLl9mbHVzaFN5bmM9ITEscyYmKHIuY2xlYXIoKSxlLl9kZWZlcnJlZD1bXSxlLl9wZW5kaW5nRWRpdG9yU3RhdGU9bnVsbCkpfWZ1bmN0aW9uIFduKGUsdCxuKXtlLl91cGRhdGluZz9lLl91cGRhdGVzLnB1c2goW3Qsbl0pOmJFKGUsdCxuKX1jbGFzcyBURSBleHRlbmRzIEx1e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWRlY29yYXRlKCl7SCg0Nyl9aXNJc29sYXRlZCgpe3JldHVybiExfWlzSW5saW5lKCl7cmV0dXJuITB9aXNLZXlib2FyZFNlbGVjdGFibGUoKXtyZXR1cm4hMH19ZnVuY3Rpb24gdHQoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBURX1jbGFzcyB1bCBleHRlbmRzIEx1e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuX19sYXN0PXRoaXMuX19maXJzdD1udWxsLHRoaXMuX19pbmRlbnQ9dGhpcy5fX2Zvcm1hdD10aGlzLl9fc2l6ZT0wLHRoaXMuX19kaXI9bnVsbH1nZXRGb3JtYXQoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX2Zvcm1hdH1nZXRGb3JtYXRUeXBlKCl7bGV0IHQ9dGhpcy5nZXRGb3JtYXQoKTtyZXR1cm4gWVJbdF18fCIifWdldEluZGVudCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9faW5kZW50fWdldENoaWxkcmVuKCl7bGV0IHQ9W10sbj10aGlzLmdldEZpcnN0Q2hpbGQoKTtmb3IoO24hPT1udWxsOyl0LnB1c2gobiksbj1uLmdldE5leHRTaWJsaW5nKCk7cmV0dXJuIHR9Z2V0Q2hpbGRyZW5LZXlzKCl7bGV0IHQ9W10sbj10aGlzLmdldEZpcnN0Q2hpbGQoKTtmb3IoO24hPT1udWxsOyl0LnB1c2gobi5fX2tleSksbj1uLmdldE5leHRTaWJsaW5nKCk7cmV0dXJuIHR9Z2V0Q2hpbGRyZW5TaXplKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19zaXplfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5nZXRDaGlsZHJlblNpemUoKT09PTB9aXNEaXJ0eSgpe2xldCB0PXB0KCkuX2RpcnR5RWxlbWVudHM7cmV0dXJuIHQhPT1udWxsJiZ0Lmhhcyh0aGlzLl9fa2V5KX1pc0xhc3RDaGlsZCgpe2xldCB0PXRoaXMuZ2V0TGF0ZXN0KCksbj10aGlzLmdldFBhcmVudE9yVGhyb3coKS5nZXRMYXN0Q2hpbGQoKTtyZXR1cm4gbiE9PW51bGwmJm4uaXModCl9Z2V0QWxsVGV4dE5vZGVzKCl7bGV0IHQ9W10sbj10aGlzLmdldEZpcnN0Q2hpbGQoKTtmb3IoO24hPT1udWxsOyl7aWYoSihuKSYmdC5wdXNoKG4pLEIobikpe2xldCByPW4uZ2V0QWxsVGV4dE5vZGVzKCk7dC5wdXNoKC4uLnIpfW49bi5nZXROZXh0U2libGluZygpfXJldHVybiB0fWdldEZpcnN0RGVzY2VuZGFudCgpe2xldCB0PXRoaXMuZ2V0Rmlyc3RDaGlsZCgpO2Zvcig7dCE9PW51bGw7KXtpZihCKHQpKXtsZXQgbj10LmdldEZpcnN0Q2hpbGQoKTtpZihuIT09bnVsbCl7dD1uO2NvbnRpbnVlfX1icmVha31yZXR1cm4gdH1nZXRMYXN0RGVzY2VuZGFudCgpe2xldCB0PXRoaXMuZ2V0TGFzdENoaWxkKCk7Zm9yKDt0IT09bnVsbDspe2lmKEIodCkpe2xldCBuPXQuZ2V0TGFzdENoaWxkKCk7aWYobiE9PW51bGwpe3Q9bjtjb250aW51ZX19YnJlYWt9cmV0dXJuIHR9Z2V0RGVzY2VuZGFudEJ5SW5kZXgodCl7bGV0IG49dGhpcy5nZXRDaGlsZHJlbigpLHI9bi5sZW5ndGg7cmV0dXJuIHQ+PXI/KHQ9bltyLTFdLEIodCkmJnQuZ2V0TGFzdERlc2NlbmRhbnQoKXx8dHx8bnVsbCk6KHQ9blt0XSxCKHQpJiZ0LmdldEZpcnN0RGVzY2VuZGFudCgpfHx0fHxudWxsKX1nZXRGaXJzdENoaWxkKCl7bGV0IHQ9dGhpcy5nZXRMYXRlc3QoKS5fX2ZpcnN0O3JldHVybiB0PT09bnVsbD9udWxsOkx0KHQpfWdldEZpcnN0Q2hpbGRPclRocm93KCl7bGV0IHQ9dGhpcy5nZXRGaXJzdENoaWxkKCk7cmV0dXJuIHQ9PT1udWxsJiZIKDQ1LHRoaXMuX19rZXkpLHR9Z2V0TGFzdENoaWxkKCl7bGV0IHQ9dGhpcy5nZXRMYXRlc3QoKS5fX2xhc3Q7cmV0dXJuIHQ9PT1udWxsP251bGw6THQodCl9Z2V0TGFzdENoaWxkT3JUaHJvdygpe2xldCB0PXRoaXMuZ2V0TGFzdENoaWxkKCk7cmV0dXJuIHQ9PT1udWxsJiZIKDk2LHRoaXMuX19rZXkpLHR9Z2V0Q2hpbGRBdEluZGV4KHQpe3ZhciBuPXRoaXMuZ2V0Q2hpbGRyZW5TaXplKCk7bGV0IHI7aWYodDxuLzIpe2ZvcihyPXRoaXMuZ2V0Rmlyc3RDaGlsZCgpLG49MDtyIT09bnVsbCYmbjw9dDspe2lmKG49PT10KXJldHVybiByO3I9ci5nZXROZXh0U2libGluZygpLG4rK31yZXR1cm4gbnVsbH1mb3Iocj10aGlzLmdldExhc3RDaGlsZCgpLC0tbjtyIT09bnVsbCYmbj49dDspe2lmKG49PT10KXJldHVybiByO3I9ci5nZXRQcmV2aW91c1NpYmxpbmcoKSxuLS19cmV0dXJuIG51bGx9Z2V0VGV4dENvbnRlbnQoKXtsZXQgdD0iIixuPXRoaXMuZ2V0Q2hpbGRyZW4oKSxyPW4ubGVuZ3RoO2ZvcihsZXQgaT0wO2k8cjtpKyspe2xldCBvPW5baV07dCs9by5nZXRUZXh0Q29udGVudCgpLEIobykmJmkhPT1yLTEmJiFvLmlzSW5saW5lKCkmJih0Kz1gCgpgKX1yZXR1cm4gdH1nZXRUZXh0Q29udGVudFNpemUoKXtsZXQgdD0wLG49dGhpcy5nZXRDaGlsZHJlbigpLHI9bi5sZW5ndGg7Zm9yKGxldCBpPTA7aTxyO2krKyl7bGV0IG89bltpXTt0Kz1vLmdldFRleHRDb250ZW50U2l6ZSgpLEIobykmJmkhPT1yLTEmJiFvLmlzSW5saW5lKCkmJih0Kz0yKX1yZXR1cm4gdH1nZXREaXJlY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX2Rpcn1oYXNGb3JtYXQodCl7cmV0dXJuIHQhPT0iIj8odD1NMFt0XSwodGhpcy5nZXRGb3JtYXQoKSZ0KSE9PTApOiExfXNlbGVjdCh0LG4pe2huKCk7bGV0IHI9cnQoKSxpPXQsbz1uO3ZhciBsPXRoaXMuZ2V0Q2hpbGRyZW5TaXplKCk7aWYoIXRoaXMuY2FuQmVFbXB0eSgpKXtpZih0PT09MCYmbj09PTApe2lmKHQ9dGhpcy5nZXRGaXJzdENoaWxkKCksSih0KXx8Qih0KSlyZXR1cm4gdC5zZWxlY3QoMCwwKX1lbHNlIGlmKCEodCE9PXZvaWQgMCYmdCE9PWx8fG4hPT12b2lkIDAmJm4hPT1sKSYmKHQ9dGhpcy5nZXRMYXN0Q2hpbGQoKSxKKHQpfHxCKHQpKSlyZXR1cm4gdC5zZWxlY3QoKX1pZihpPT09dm9pZCAwJiYoaT1sKSxvPT09dm9pZCAwJiYobz1sKSxsPXRoaXMuX19rZXksbWUocikpci5hbmNob3Iuc2V0KGwsaSwiZWxlbWVudCIpLHIuZm9jdXMuc2V0KGwsbywiZWxlbWVudCIpLHIuZGlydHk9ITA7ZWxzZSByZXR1cm4gQ0UobCxpLGwsbywiZWxlbWVudCIsImVsZW1lbnQiKTtyZXR1cm4gcn1zZWxlY3RTdGFydCgpe2xldCB0PXRoaXMuZ2V0Rmlyc3REZXNjZW5kYW50KCk7cmV0dXJuIEIodCl8fEoodCk/dC5zZWxlY3QoMCwwKTp0IT09bnVsbD90LnNlbGVjdFByZXZpb3VzKCk6dGhpcy5zZWxlY3QoMCwwKX1zZWxlY3RFbmQoKXtsZXQgdD10aGlzLmdldExhc3REZXNjZW5kYW50KCk7cmV0dXJuIEIodCl8fEoodCk/dC5zZWxlY3QoKTp0IT09bnVsbD90LnNlbGVjdE5leHQoKTp0aGlzLnNlbGVjdCgpfWNsZWFyKCl7bGV0IHQ9dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiB0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaChuPT5uLnJlbW92ZSgpKSx0fWFwcGVuZCguLi50KXtyZXR1cm4gdGhpcy5zcGxpY2UodGhpcy5nZXRDaGlsZHJlblNpemUoKSwwLHQpfXNldERpcmVjdGlvbih0KXtsZXQgbj10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIG4uX19kaXI9dCxufXNldEZvcm1hdCh0KXtyZXR1cm4gdGhpcy5nZXRXcml0YWJsZSgpLl9fZm9ybWF0PXQhPT0iIj9NMFt0XTowLHRoaXN9c2V0SW5kZW50KHQpe3JldHVybiB0aGlzLmdldFdyaXRhYmxlKCkuX19pbmRlbnQ9dCx0aGlzfXNwbGljZSh0LG4scil7bGV0IGk9ci5sZW5ndGgsbz10aGlzLmdldENoaWxkcmVuU2l6ZSgpLGw9dGhpcy5nZXRXcml0YWJsZSgpLHM9bC5fX2tleTt2YXIgYT1bXSx1PVtdO2xldCBjPXRoaXMuZ2V0Q2hpbGRBdEluZGV4KHQrbiksZD1udWxsLGY9by1uK2k7aWYodCE9PTApaWYodD09PW8pZD10aGlzLmdldExhc3RDaGlsZCgpO2Vsc2V7dmFyIGg9dGhpcy5nZXRDaGlsZEF0SW5kZXgodCk7aCE9PW51bGwmJihkPWguZ2V0UHJldmlvdXNTaWJsaW5nKCkpfWlmKDA8bil7dmFyIG09ZD09PW51bGw/dGhpcy5nZXRGaXJzdENoaWxkKCk6ZC5nZXROZXh0U2libGluZygpO2ZvcihoPTA7aDxuO2grKyl7bT09PW51bGwmJkgoMTAwKTt2YXIgZz1tLmdldE5leHRTaWJsaW5nKCksUz1tLl9fa2V5O209bS5nZXRXcml0YWJsZSgpLEZvKG0pLHUucHVzaChTKSxtPWd9fWZvcihoPWQsZz0wO2c8aTtnKyspe1M9cltnXSxoIT09bnVsbCYmUy5pcyhoKSYmKGQ9aD1oLmdldFByZXZpb3VzU2libGluZygpKSxtPVMuZ2V0V3JpdGFibGUoKSxtLl9fcGFyZW50PT09cyYmZi0tLEZvKG0pO2xldCB2PVMuX19rZXk7aD09PW51bGw/KGwuX19maXJzdD12LG0uX19wcmV2PW51bGwpOihoPWguZ2V0V3JpdGFibGUoKSxoLl9fbmV4dD12LG0uX19wcmV2PWguX19rZXkpLFMuX19rZXk9PT1zJiZIKDc2KSxtLl9fcGFyZW50PXMsYS5wdXNoKHYpLGg9U31pZih0K249PT1vP2ghPT1udWxsJiYoaC5nZXRXcml0YWJsZSgpLl9fbmV4dD1udWxsLGwuX19sYXN0PWguX19rZXkpOmMhPT1udWxsJiYodD1jLmdldFdyaXRhYmxlKCksaCE9PW51bGw/KG49aC5nZXRXcml0YWJsZSgpLHQuX19wcmV2PWguX19rZXksbi5fX25leHQ9Yy5fX2tleSk6dC5fX3ByZXY9bnVsbCksbC5fX3NpemU9Zix1Lmxlbmd0aCYmKHQ9cnQoKSxtZSh0KSkpe3U9bmV3IFNldCh1KSxhPW5ldyBTZXQoYSk7bGV0e2FuY2hvcjp2LGZvY3VzOnl9PXQ7cngodix1LGEpJiZEZCh2LHYuZ2V0Tm9kZSgpLHRoaXMsZCxjKSxyeCh5LHUsYSkmJkRkKHkseS5nZXROb2RlKCksdGhpcyxkLGMpLGYhPT0wfHx0aGlzLmNhbkJlRW1wdHkoKXx8eHIodGhpcyl8fHRoaXMucmVtb3ZlKCl9cmV0dXJuIGx9ZXhwb3J0SlNPTigpe3JldHVybntjaGlsZHJlbjpbXSxkaXJlY3Rpb246dGhpcy5nZXREaXJlY3Rpb24oKSxmb3JtYXQ6dGhpcy5nZXRGb3JtYXRUeXBlKCksaW5kZW50OnRoaXMuZ2V0SW5kZW50KCksdHlwZToiZWxlbWVudCIsdmVyc2lvbjoxfX1pbnNlcnROZXdBZnRlcigpe3JldHVybiBudWxsfWNhbkluZGVudCgpe3JldHVybiEwfWNvbGxhcHNlQXRTdGFydCgpe3JldHVybiExfWV4Y2x1ZGVGcm9tQ29weSgpe3JldHVybiExfWNhbkV4dHJhY3RDb250ZW50cygpe3JldHVybiEwfWNhblJlcGxhY2VXaXRoKCl7cmV0dXJuITB9Y2FuSW5zZXJ0QWZ0ZXIoKXtyZXR1cm4hMH1jYW5CZUVtcHR5KCl7cmV0dXJuITB9Y2FuSW5zZXJ0VGV4dEJlZm9yZSgpe3JldHVybiEwfWNhbkluc2VydFRleHRBZnRlcigpe3JldHVybiEwfWlzSW5saW5lKCl7cmV0dXJuITF9aXNTaGFkb3dSb290KCl7cmV0dXJuITF9Y2FuTWVyZ2VXaXRoKCl7cmV0dXJuITF9ZXh0cmFjdFdpdGhDaGlsZCgpe3JldHVybiExfX1mdW5jdGlvbiBCKGUpe3JldHVybiBlIGluc3RhbmNlb2YgdWx9ZnVuY3Rpb24gcngoZSx0LG4pe2ZvcihlPWUuZ2V0Tm9kZSgpO2U7KXtsZXQgcj1lLl9fa2V5O2lmKHQuaGFzKHIpJiYhbi5oYXMocikpcmV0dXJuITA7ZT1lLmdldFBhcmVudCgpfXJldHVybiExfWNsYXNzIFJzIGV4dGVuZHMgdWx7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4icm9vdCJ9c3RhdGljIGNsb25lKCl7cmV0dXJuIG5ldyBSc31jb25zdHJ1Y3Rvcigpe3N1cGVyKCJyb290IiksdGhpcy5fX2NhY2hlZFRleHQ9bnVsbH1nZXRUb3BMZXZlbEVsZW1lbnRPclRocm93KCl7SCg1MSl9Z2V0VGV4dENvbnRlbnQoKXtsZXQgdD10aGlzLl9fY2FjaGVkVGV4dDtyZXR1cm4hTnMoKSYmcHQoKS5fZGlydHlUeXBlIT09MHx8dD09PW51bGw/c3VwZXIuZ2V0VGV4dENvbnRlbnQoKTp0fXJlbW92ZSgpe0goNTIpfXJlcGxhY2UoKXtIKDUzKX1pbnNlcnRCZWZvcmUoKXtIKDU0KX1pbnNlcnRBZnRlcigpe0goNTUpfXVwZGF0ZURPTSgpe3JldHVybiExfWFwcGVuZCguLi50KXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7bGV0IHI9dFtuXTtCKHIpfHx0dChyKXx8SCg1Nil9cmV0dXJuIHN1cGVyLmFwcGVuZCguLi50KX1zdGF0aWMgaW1wb3J0SlNPTih0KXtsZXQgbj1ZcigpO3JldHVybiBuLnNldEZvcm1hdCh0LmZvcm1hdCksbi5zZXRJbmRlbnQodC5pbmRlbnQpLG4uc2V0RGlyZWN0aW9uKHQuZGlyZWN0aW9uKSxufWV4cG9ydEpTT04oKXtyZXR1cm57Y2hpbGRyZW46W10sZGlyZWN0aW9uOnRoaXMuZ2V0RGlyZWN0aW9uKCksZm9ybWF0OnRoaXMuZ2V0Rm9ybWF0VHlwZSgpLGluZGVudDp0aGlzLmdldEluZGVudCgpLHR5cGU6InJvb3QiLHZlcnNpb246MX19Y29sbGFwc2VBdFN0YXJ0KCl7cmV0dXJuITB9fWZ1bmN0aW9uIG1uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgUnN9ZnVuY3Rpb24ga08oZSx0KXtpZih0PXQuZ2V0RWRpdG9yU3RhdGUoKS5fc2VsZWN0aW9uLGU9ZS5fc2VsZWN0aW9uLGUhPT1udWxsKXtpZihlLmRpcnR5fHwhZS5pcyh0KSlyZXR1cm4hMH1lbHNlIGlmKHQhPT1udWxsKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIHd2KCl7cmV0dXJuIG5ldyBNZihuZXcgTWFwKFtbInJvb3QiLG5ldyBSc11dKSl9ZnVuY3Rpb24gTkUoZSl7bGV0IHQ9ZS5leHBvcnRKU09OKCk7dmFyIG49ZS5jb25zdHJ1Y3Rvcjt0LnR5cGUhPT1uLmdldFR5cGUoKSYmSCgxMzAsbi5uYW1lKTtsZXQgcj10LmNoaWxkcmVuO2lmKEIoZSkpZm9yKEFycmF5LmlzQXJyYXkocil8fEgoNTksbi5uYW1lKSxlPWUuZ2V0Q2hpbGRyZW4oKSxuPTA7bjxlLmxlbmd0aDtuKyspe2xldCBpPU5FKGVbbl0pO3IucHVzaChpKX1yZXR1cm4gdH1jbGFzcyBNZntjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuX25vZGVNYXA9dCx0aGlzLl9zZWxlY3Rpb249bnx8bnVsbCx0aGlzLl9yZWFkT25seT10aGlzLl9mbHVzaFN5bmM9ITF9aXNFbXB0eSgpe3JldHVybiB0aGlzLl9ub2RlTWFwLnNpemU9PT0xJiZ0aGlzLl9zZWxlY3Rpb249PT1udWxsfXJlYWQodCl7cmV0dXJuIHR4KHRoaXMsdCl9Y2xvbmUodCl7cmV0dXJuIHQ9bmV3IE1mKHRoaXMuX25vZGVNYXAsdD09PXZvaWQgMD90aGlzLl9zZWxlY3Rpb246dCksdC5fcmVhZE9ubHk9ITAsdH10b0pTT04oKXtyZXR1cm4gdHgodGhpcywoKT0+KHtyb290Ok5FKFlyKCkpfSkpfX1jbGFzcyBPcyBleHRlbmRzIHVse3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuInBhcmFncmFwaCJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgT3ModC5fX2tleSl9Y3JlYXRlRE9NKHQpe2xldCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInAiKTtyZXR1cm4gdD1rYSh0LnRoZW1lLCJwYXJhZ3JhcGgiKSx0IT09dm9pZCAwJiZuLmNsYXNzTGlzdC5hZGQoLi4udCksbn11cGRhdGVET00oKXtyZXR1cm4hMX1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJue3A6KCk9Pih7Y29udmVyc2lvbjokTyxwcmlvcml0eTowfSl9fWV4cG9ydERPTSh0KXtpZih7ZWxlbWVudDp0fT1zdXBlci5leHBvcnRET00odCksdCYmTmYodCkpe3RoaXMuaXNFbXB0eSgpJiZ0LmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpKTt2YXIgbj10aGlzLmdldEZvcm1hdFR5cGUoKTt0LnN0eWxlLnRleHRBbGlnbj1uLChuPXRoaXMuZ2V0RGlyZWN0aW9uKCkpJiYodC5kaXI9biksbj10aGlzLmdldEluZGVudCgpLDA8biYmKHQuc3R5bGUudGV4dEluZGVudD1gJHsyMCpufXB4YCl9cmV0dXJue2VsZW1lbnQ6dH19c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49WG8oKTtyZXR1cm4gbi5zZXRGb3JtYXQodC5mb3JtYXQpLG4uc2V0SW5kZW50KHQuaW5kZW50KSxuLnNldERpcmVjdGlvbih0LmRpcmVjdGlvbiksbn1leHBvcnRKU09OKCl7cmV0dXJuey4uLnN1cGVyLmV4cG9ydEpTT04oKSx0eXBlOiJwYXJhZ3JhcGgiLHZlcnNpb246MX19aW5zZXJ0TmV3QWZ0ZXIodCxuKXt0PVhvKCk7bGV0IHI9dGhpcy5nZXREaXJlY3Rpb24oKTtyZXR1cm4gdC5zZXREaXJlY3Rpb24ociksdGhpcy5pbnNlcnRBZnRlcih0LG4pLHR9Y29sbGFwc2VBdFN0YXJ0KCl7bGV0IHQ9dGhpcy5nZXRDaGlsZHJlbigpO2lmKHQubGVuZ3RoPT09MHx8Sih0WzBdKSYmdFswXS5nZXRUZXh0Q29udGVudCgpLnRyaW0oKT09PSIiKXtpZih0aGlzLmdldE5leHRTaWJsaW5nKCkhPT1udWxsKXJldHVybiB0aGlzLnNlbGVjdE5leHQoKSx0aGlzLnJlbW92ZSgpLCEwO2lmKHRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCkhPT1udWxsKXJldHVybiB0aGlzLnNlbGVjdFByZXZpb3VzKCksdGhpcy5yZW1vdmUoKSwhMH1yZXR1cm4hMX19ZnVuY3Rpb24gJE8oZSl7bGV0IHQ9WG8oKTtyZXR1cm4gZS5zdHlsZSYmKHQuc2V0Rm9ybWF0KGUuc3R5bGUudGV4dEFsaWduKSxlPXBhcnNlSW50KGUuc3R5bGUudGV4dEluZGVudCwxMCkvMjAsMDxlJiZ0LnNldEluZGVudChlKSkse25vZGU6dH19ZnVuY3Rpb24gWG8oKXtyZXR1cm4gSXUobmV3IE9zKX1mdW5jdGlvbiBSRShlLHQsbixyKXtsZXQgaT1lLl9rZXlUb0RPTU1hcDtpLmNsZWFyKCksZS5fZWRpdG9yU3RhdGU9d3YoKSxlLl9wZW5kaW5nRWRpdG9yU3RhdGU9cixlLl9jb21wb3NpdGlvbktleT1udWxsLGUuX2RpcnR5VHlwZT0wLGUuX2Nsb25lTm90TmVlZGVkLmNsZWFyKCksZS5fZGlydHlMZWF2ZXM9bmV3IFNldCxlLl9kaXJ0eUVsZW1lbnRzLmNsZWFyKCksZS5fbm9ybWFsaXplZE5vZGVzPW5ldyBTZXQsZS5fdXBkYXRlVGFncz1uZXcgU2V0LGUuX3VwZGF0ZXM9W10sZS5fYmxvY2tDdXJzb3JFbGVtZW50PW51bGwscj1lLl9vYnNlcnZlcixyIT09bnVsbCYmKHIuZGlzY29ubmVjdCgpLGUuX29ic2VydmVyPW51bGwpLHQhPT1udWxsJiYodC50ZXh0Q29udGVudD0iIiksbiE9PW51bGwmJihuLnRleHRDb250ZW50PSIiLGkuc2V0KCJyb290IixuKSl9ZnVuY3Rpb24gYk8oZSl7bGV0IHQ9bmV3IE1hcCxuPW5ldyBTZXQ7cmV0dXJuIGUuZm9yRWFjaChyPT57aWYocj1yLmtsYXNzLmltcG9ydERPTSE9bnVsbD9yLmtsYXNzLmltcG9ydERPTS5iaW5kKHIua2xhc3MpOm51bGwsciE9bnVsbCYmIW4uaGFzKHIpKXtuLmFkZChyKTt2YXIgaT1yKCk7aSE9PW51bGwmJk9iamVjdC5rZXlzKGkpLmZvckVhY2gobz0+e2xldCBsPXQuZ2V0KG8pO2w9PT12b2lkIDAmJihsPVtdLHQuc2V0KG8sbCkpLGwucHVzaChpW29dKX0pfX0pLHR9Y2xhc3MgVE97Y29uc3RydWN0b3IodCxuLHIsaSxvLGwscyl7dGhpcy5fcGFyZW50RWRpdG9yPW4sdGhpcy5fcm9vdEVsZW1lbnQ9bnVsbCx0aGlzLl9lZGl0b3JTdGF0ZT10LHRoaXMuX2NvbXBvc2l0aW9uS2V5PXRoaXMuX3BlbmRpbmdFZGl0b3JTdGF0ZT1udWxsLHRoaXMuX2RlZmVycmVkPVtdLHRoaXMuX2tleVRvRE9NTWFwPW5ldyBNYXAsdGhpcy5fdXBkYXRlcz1bXSx0aGlzLl91cGRhdGluZz0hMSx0aGlzLl9saXN0ZW5lcnM9e2RlY29yYXRvcjpuZXcgU2V0LGVkaXRhYmxlOm5ldyBTZXQsbXV0YXRpb246bmV3IE1hcCxyb290Om5ldyBTZXQsdGV4dGNvbnRlbnQ6bmV3IFNldCx1cGRhdGU6bmV3IFNldH0sdGhpcy5fY29tbWFuZHM9bmV3IE1hcCx0aGlzLl9jb25maWc9aSx0aGlzLl9ub2Rlcz1yLHRoaXMuX2RlY29yYXRvcnM9e30sdGhpcy5fcGVuZGluZ0RlY29yYXRvcnM9bnVsbCx0aGlzLl9kaXJ0eVR5cGU9MCx0aGlzLl9jbG9uZU5vdE5lZWRlZD1uZXcgU2V0LHRoaXMuX2RpcnR5TGVhdmVzPW5ldyBTZXQsdGhpcy5fZGlydHlFbGVtZW50cz1uZXcgTWFwLHRoaXMuX25vcm1hbGl6ZWROb2Rlcz1uZXcgU2V0LHRoaXMuX3VwZGF0ZVRhZ3M9bmV3IFNldCx0aGlzLl9vYnNlcnZlcj1udWxsLHRoaXMuX2tleT1yRSgpLHRoaXMuX29uRXJyb3I9byx0aGlzLl9odG1sQ29udmVyc2lvbnM9bCx0aGlzLl9lZGl0YWJsZT1zLHRoaXMuX2hlYWRsZXNzPW4hPT1udWxsJiZuLl9oZWFkbGVzcyx0aGlzLl9ibG9ja0N1cnNvckVsZW1lbnQ9dGhpcy5fd2luZG93PW51bGx9aXNDb21wb3NpbmcoKXtyZXR1cm4gdGhpcy5fY29tcG9zaXRpb25LZXkhPW51bGx9cmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcih0KXtsZXQgbj10aGlzLl9saXN0ZW5lcnMudXBkYXRlO3JldHVybiBuLmFkZCh0KSwoKT0+e24uZGVsZXRlKHQpfX1yZWdpc3RlckVkaXRhYmxlTGlzdGVuZXIodCl7bGV0IG49dGhpcy5fbGlzdGVuZXJzLmVkaXRhYmxlO3JldHVybiBuLmFkZCh0KSwoKT0+e24uZGVsZXRlKHQpfX1yZWdpc3RlckRlY29yYXRvckxpc3RlbmVyKHQpe2xldCBuPXRoaXMuX2xpc3RlbmVycy5kZWNvcmF0b3I7cmV0dXJuIG4uYWRkKHQpLCgpPT57bi5kZWxldGUodCl9fXJlZ2lzdGVyVGV4dENvbnRlbnRMaXN0ZW5lcih0KXtsZXQgbj10aGlzLl9saXN0ZW5lcnMudGV4dGNvbnRlbnQ7cmV0dXJuIG4uYWRkKHQpLCgpPT57bi5kZWxldGUodCl9fXJlZ2lzdGVyUm9vdExpc3RlbmVyKHQpe2xldCBuPXRoaXMuX2xpc3RlbmVycy5yb290O3JldHVybiB0KHRoaXMuX3Jvb3RFbGVtZW50LG51bGwpLG4uYWRkKHQpLCgpPT57dChudWxsLHRoaXMuX3Jvb3RFbGVtZW50KSxuLmRlbGV0ZSh0KX19cmVnaXN0ZXJDb21tYW5kKHQsbixyKXtyPT09dm9pZCAwJiZIKDM1KTtsZXQgaT10aGlzLl9jb21tYW5kcztpLmhhcyh0KXx8aS5zZXQodCxbbmV3IFNldCxuZXcgU2V0LG5ldyBTZXQsbmV3IFNldCxuZXcgU2V0XSk7bGV0IG89aS5nZXQodCk7bz09PXZvaWQgMCYmSCgzNixTdHJpbmcodCkpO2xldCBsPW9bcl07cmV0dXJuIGwuYWRkKG4pLCgpPT57bC5kZWxldGUobiksby5ldmVyeShzPT5zLnNpemU9PT0wKSYmaS5kZWxldGUodCl9fXJlZ2lzdGVyTXV0YXRpb25MaXN0ZW5lcih0LG4pe3RoaXMuX25vZGVzLmdldCh0LmdldFR5cGUoKSk9PT12b2lkIDAmJkgoMzcsdC5uYW1lKTtsZXQgcj10aGlzLl9saXN0ZW5lcnMubXV0YXRpb247cmV0dXJuIHIuc2V0KG4sdCksKCk9PntyLmRlbGV0ZShuKX19cmVnaXN0ZXJOb2RlVHJhbnNmb3JtVG9LbGFzcyh0LG4pe3ZhciByPXQuZ2V0VHlwZSgpO3JldHVybiByPXRoaXMuX25vZGVzLmdldChyKSxyPT09dm9pZCAwJiZIKDM3LHQubmFtZSksci50cmFuc2Zvcm1zLmFkZChuKSxyfXJlZ2lzdGVyTm9kZVRyYW5zZm9ybSh0LG4pe3ZhciByPXRoaXMucmVnaXN0ZXJOb2RlVHJhbnNmb3JtVG9LbGFzcyh0LG4pO2xldCBpPVtyXTtyZXR1cm4gcj1yLnJlcGxhY2VXaXRoS2xhc3MsciE9bnVsbCYmKHI9dGhpcy5yZWdpc3Rlck5vZGVUcmFuc2Zvcm1Ub0tsYXNzKHIsbiksaS5wdXNoKHIpKSxuTyh0aGlzLHQuZ2V0VHlwZSgpKSwoKT0+e2kuZm9yRWFjaChvPT5vLnRyYW5zZm9ybXMuZGVsZXRlKG4pKX19aGFzTm9kZSh0KXtyZXR1cm4gdGhpcy5fbm9kZXMuaGFzKHQuZ2V0VHlwZSgpKX1oYXNOb2Rlcyh0KXtyZXR1cm4gdC5ldmVyeSh0aGlzLmhhc05vZGUuYmluZCh0aGlzKSl9ZGlzcGF0Y2hDb21tYW5kKHQsbil7cmV0dXJuIFgodGhpcyx0LG4pfWdldERlY29yYXRvcnMoKXtyZXR1cm4gdGhpcy5fZGVjb3JhdG9yc31nZXRSb290RWxlbWVudCgpe3JldHVybiB0aGlzLl9yb290RWxlbWVudH1nZXRLZXkoKXtyZXR1cm4gdGhpcy5fa2V5fXNldFJvb3RFbGVtZW50KHQpe2xldCBuPXRoaXMuX3Jvb3RFbGVtZW50O2lmKHQhPT1uKXtsZXQgbD1rYSh0aGlzLl9jb25maWcudGhlbWUsInJvb3QiKTt2YXIgcj10aGlzLl9wZW5kaW5nRWRpdG9yU3RhdGV8fHRoaXMuX2VkaXRvclN0YXRlO2lmKHRoaXMuX3Jvb3RFbGVtZW50PXQsUkUodGhpcyxuLHQsciksbiE9PW51bGwpe2lmKCF0aGlzLl9jb25maWcuZGlzYWJsZUV2ZW50cyl7JGEhPT0wJiYoJGEtLSwkYT09PTAmJm4ub3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJzZWxlY3Rpb25jaGFuZ2UiLHdFKSk7dmFyIGk9bi5fX2xleGljYWxFZGl0b3I7aWYoaSE9bnVsbCl7aWYoaS5fcGFyZW50RWRpdG9yIT09bnVsbCl7dmFyIG89aHYoaSk7bz1vW28ubGVuZ3RoLTFdLl9rZXksWWwuZ2V0KG8pPT09aSYmWWwuZGVsZXRlKG8pfWVsc2UgWWwuZGVsZXRlKGkuX2tleSk7bi5fX2xleGljYWxFZGl0b3I9bnVsbH1mb3IoaT1fRShuKSxvPTA7bzxpLmxlbmd0aDtvKyspaVtvXSgpO24uX19sZXhpY2FsRXZlbnRIYW5kbGVzPVtdfWwhPW51bGwmJm4uY2xhc3NMaXN0LnJlbW92ZSguLi5sKX10IT09bnVsbD8ocj0ocj10Lm93bmVyRG9jdW1lbnQpJiZyLmRlZmF1bHRWaWV3fHxudWxsLGk9dC5zdHlsZSxpLnVzZXJTZWxlY3Q9InRleHQiLGkud2hpdGVTcGFjZT0icHJlLXdyYXAiLGkud29yZEJyZWFrPSJicmVhay13b3JkIix0LnNldEF0dHJpYnV0ZSgiZGF0YS1sZXhpY2FsLWVkaXRvciIsInRydWUiKSx0aGlzLl93aW5kb3c9cix0aGlzLl9kaXJ0eVR5cGU9MixZUyh0aGlzKSx0aGlzLl91cGRhdGVUYWdzLmFkZCgiaGlzdG9yeS1tZXJnZSIpLEJvKHRoaXMpLHRoaXMuX2NvbmZpZy5kaXNhYmxlRXZlbnRzfHxwTyh0LHRoaXMpLGwhPW51bGwmJnQuY2xhc3NMaXN0LmFkZCguLi5sKSk6KHRoaXMuX2VkaXRvclN0YXRlPXIsdGhpcy5fd2luZG93PXRoaXMuX3BlbmRpbmdFZGl0b3JTdGF0ZT1udWxsKSxUYSgicm9vdCIsdGhpcywhMSx0LG4pfX1nZXRFbGVtZW50QnlLZXkodCl7cmV0dXJuIHRoaXMuX2tleVRvRE9NTWFwLmdldCh0KXx8bnVsbH1nZXRFZGl0b3JTdGF0ZSgpe3JldHVybiB0aGlzLl9lZGl0b3JTdGF0ZX1zZXRFZGl0b3JTdGF0ZSh0LG4pe3QuaXNFbXB0eSgpJiZIKDM4KSxHUyh0aGlzKTtsZXQgcj10aGlzLl9wZW5kaW5nRWRpdG9yU3RhdGUsaT10aGlzLl91cGRhdGVUYWdzO249biE9PXZvaWQgMD9uLnRhZzpudWxsLHI9PT1udWxsfHxyLmlzRW1wdHkoKXx8KG4hPW51bGwmJmkuYWRkKG4pLEJvKHRoaXMpKSx0aGlzLl9wZW5kaW5nRWRpdG9yU3RhdGU9dCx0aGlzLl9kaXJ0eVR5cGU9Mix0aGlzLl9kaXJ0eUVsZW1lbnRzLnNldCgicm9vdCIsITEpLHRoaXMuX2NvbXBvc2l0aW9uS2V5PW51bGwsbiE9bnVsbCYmaS5hZGQobiksQm8odGhpcyl9cGFyc2VFZGl0b3JTdGF0ZSh0LG4pe3Q9dHlwZW9mIHQ9PSJzdHJpbmciP0pTT04ucGFyc2UodCk6dDtsZXQgcj13digpLGk9anQsbz1PbixsPXp0LHM9dGhpcy5fZGlydHlFbGVtZW50cyxhPXRoaXMuX2RpcnR5TGVhdmVzLHU9dGhpcy5fY2xvbmVOb3ROZWVkZWQsYz10aGlzLl9kaXJ0eVR5cGU7dGhpcy5fZGlydHlFbGVtZW50cz1uZXcgTWFwLHRoaXMuX2RpcnR5TGVhdmVzPW5ldyBTZXQsdGhpcy5fY2xvbmVOb3ROZWVkZWQ9bmV3IFNldCx0aGlzLl9kaXJ0eVR5cGU9MCxqdD1yLE9uPSExLHp0PXRoaXM7dHJ5e192KHQucm9vdCx0aGlzLl9ub2RlcyksbiYmbigpLHIuX3JlYWRPbmx5PSEwfWNhdGNoKGQpe2QgaW5zdGFuY2VvZiBFcnJvciYmdGhpcy5fb25FcnJvcihkKX1maW5hbGx5e3RoaXMuX2RpcnR5RWxlbWVudHM9cyx0aGlzLl9kaXJ0eUxlYXZlcz1hLHRoaXMuX2Nsb25lTm90TmVlZGVkPXUsdGhpcy5fZGlydHlUeXBlPWMsanQ9aSxPbj1vLHp0PWx9cmV0dXJuIHJ9dXBkYXRlKHQsbil7V24odGhpcyx0LG4pfWZvY3VzKHQsbj17fSl7bGV0IHI9dGhpcy5fcm9vdEVsZW1lbnQ7ciE9PW51bGwmJihyLnNldEF0dHJpYnV0ZSgiYXV0b2NhcGl0YWxpemUiLCJvZmYiKSxXbih0aGlzLCgpPT57bGV0IGk9cnQoKSxvPVlyKCk7aSE9PW51bGw/aS5kaXJ0eT0hMDpvLmdldENoaWxkcmVuU2l6ZSgpIT09MCYmKG4uZGVmYXVsdFNlbGVjdGlvbj09PSJyb290U3RhcnQiP28uc2VsZWN0U3RhcnQoKTpvLnNlbGVjdEVuZCgpKX0se29uVXBkYXRlOigpPT57ci5yZW1vdmVBdHRyaWJ1dGUoImF1dG9jYXBpdGFsaXplIiksdCYmdCgpfSx0YWc6ImZvY3VzIn0pLHRoaXMuX3BlbmRpbmdFZGl0b3JTdGF0ZT09PW51bGwmJnIucmVtb3ZlQXR0cmlidXRlKCJhdXRvY2FwaXRhbGl6ZSIpKX1ibHVyKCl7dmFyIHQ9dGhpcy5fcm9vdEVsZW1lbnQ7dCE9PW51bGwmJnQuYmx1cigpLHQ9WHIodGhpcy5fd2luZG93KSx0IT09bnVsbCYmdC5yZW1vdmVBbGxSYW5nZXMoKX1pc0VkaXRhYmxlKCl7cmV0dXJuIHRoaXMuX2VkaXRhYmxlfXNldEVkaXRhYmxlKHQpe3RoaXMuX2VkaXRhYmxlIT09dCYmKHRoaXMuX2VkaXRhYmxlPXQsVGEoImVkaXRhYmxlIix0aGlzLCEwLHQpKX10b0pTT04oKXtyZXR1cm57ZWRpdG9yU3RhdGU6dGhpcy5fZWRpdG9yU3RhdGUudG9KU09OKCl9fX1jbGFzcyBTdiBleHRlbmRzIHVse2NvbnN0cnVjdG9yKHQsbil7c3VwZXIobiksdGhpcy5fX2NvbFNwYW49dCx0aGlzLl9fcm93U3Bhbj0xfWV4cG9ydEpTT04oKXtyZXR1cm57Li4uc3VwZXIuZXhwb3J0SlNPTigpLGNvbFNwYW46dGhpcy5fX2NvbFNwYW4scm93U3Bhbjp0aGlzLl9fcm93U3Bhbn19Z2V0Q29sU3Bhbigpe3JldHVybiB0aGlzLl9fY29sU3Bhbn1zZXRDb2xTcGFuKHQpe3JldHVybiB0aGlzLmdldFdyaXRhYmxlKCkuX19jb2xTcGFuPXQsdGhpc31nZXRSb3dTcGFuKCl7cmV0dXJuIHRoaXMuX19yb3dTcGFufXNldFJvd1NwYW4odCl7cmV0dXJuIHRoaXMuZ2V0V3JpdGFibGUoKS5fX3Jvd1NwYW49dCx0aGlzfX1mdW5jdGlvbiBRbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFN2fWNsYXNzIE9FIGV4dGVuZHMgdWx7fWZ1bmN0aW9uIEV2KGUpe3JldHVybiBlIGluc3RhbmNlb2YgT0V9Y2xhc3MgUEUgZXh0ZW5kcyB1bHt9ZnVuY3Rpb24gc3UoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBQRX1JLiRhZGRVcGRhdGVUYWc9ZnVuY3Rpb24oZSl7aG4oKSxwdCgpLl91cGRhdGVUYWdzLmFkZChlKX07SS4kYXBwbHlOb2RlUmVwbGFjZW1lbnQ9SXU7SS4kY29weU5vZGU9bEU7SS4kY3JlYXRlTGluZUJyZWFrTm9kZT1jcztJLiRjcmVhdGVOb2RlU2VsZWN0aW9uPUNtO0kuJGNyZWF0ZVBhcmFncmFwaE5vZGU9WG87SS4kY3JlYXRlUmFuZ2VTZWxlY3Rpb249ZnVuY3Rpb24oKXtsZXQgZT1uZXcgVnIoInJvb3QiLDAsImVsZW1lbnQiKSx0PW5ldyBWcigicm9vdCIsMCwiZWxlbWVudCIpO3JldHVybiBuZXcgYWwoZSx0LDAsIiIpfTtJLiRjcmVhdGVUYWJOb2RlPU9mO0kuJGNyZWF0ZVRleHROb2RlPUR0O0kuJGdldEFkamFjZW50Tm9kZT11bTtJLiRnZXROZWFyZXN0Tm9kZUZyb21ET01Ob2RlPUR1O0kuJGdldE5lYXJlc3RSb290T3JTaGFkb3dSb290PW9FO0kuJGdldE5vZGVCeUtleT1MdDtJLiRnZXRQcmV2aW91c1NlbGVjdGlvbj1UcztJLiRnZXRSb290PVlyO0kuJGdldFNlbGVjdGlvbj1ydDtJLiRnZXRUZXh0Q29udGVudD1mdW5jdGlvbigpe2xldCBlPXJ0KCk7cmV0dXJuIGU9PT1udWxsPyIiOmUuZ2V0VGV4dENvbnRlbnQoKX07SS4kaGFzQW5jZXN0b3I9T2Q7SS4kaGFzVXBkYXRlVGFnPWZ1bmN0aW9uKGUpe3JldHVybiBwdCgpLl91cGRhdGVUYWdzLmhhcyhlKX07SS4kaW5zZXJ0Tm9kZXM9ZnVuY3Rpb24oZSx0KXtsZXQgbj1ydCgpfHxUcygpO3JldHVybiBuPT09bnVsbCYmKG49WXIoKS5zZWxlY3RFbmQoKSksbi5pbnNlcnROb2RlcyhlLHQpfTtJLiRpc0Jsb2NrRWxlbWVudE5vZGU9RW07SS4kaXNEZWNvcmF0b3JOb2RlPXR0O0kuJGlzRWxlbWVudE5vZGU9QjtJLiRpc0lubGluZUVsZW1lbnRPckRlY29yYXRvck5vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIEIoZSkmJmUuaXNJbmxpbmUoKXx8dHQoZSkmJmUuaXNJbmxpbmUoKX07SS4kaXNMZWFmTm9kZT1KUztJLiRpc0xpbmVCcmVha05vZGU9b3U7SS4kaXNOb2RlU2VsZWN0aW9uPWJzO0kuJGlzUGFyYWdyYXBoTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIE9zfTtJLiRpc1JhbmdlU2VsZWN0aW9uPW1lO0kuJGlzUm9vdE5vZGU9bW47SS4kaXNSb290T3JTaGFkb3dSb290PXhyO0kuJGlzVGFiTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mICRzfTtJLiRpc1RleHROb2RlPUo7SS4kbm9kZXNPZlR5cGU9ZnVuY3Rpb24oZSl7dmFyIHQ9UXIoKTtsZXQgbj10Ll9yZWFkT25seSxyPWUuZ2V0VHlwZSgpO3Q9dC5fbm9kZU1hcDtsZXQgaT1bXTtmb3IobGV0WyxvXW9mIHQpbyBpbnN0YW5jZW9mIGUmJm8uX190eXBlPT09ciYmKG58fG8uaXNBdHRhY2hlZCgpKSYmaS5wdXNoKG8pO3JldHVybiBpfTtJLiRub3JtYWxpemVTZWxlY3Rpb25fX0VYUEVSSU1FTlRBTD1jdjtJLiRwYXJzZVNlcmlhbGl6ZWROb2RlPWZ1bmN0aW9uKGUpe3JldHVybiBfdihlLHB0KCkuX25vZGVzKX07SS4kc2VsZWN0QWxsPWZ1bmN0aW9uKCl7dmFyIGU9WXIoKTtlPWUuc2VsZWN0KDAsZS5nZXRDaGlsZHJlblNpemUoKSksV3IoY3YoZSkpfTtJLiRzZXRDb21wb3NpdGlvbktleT1LdDtJLiRzZXRTZWxlY3Rpb249V3I7SS4kc3BsaXROb2RlPXNFO0kuQkxVUl9DT01NQU5EPUhTO0kuQ0FOX1JFRE9fQ09NTUFORD17fTtJLkNBTl9VTkRPX0NPTU1BTkQ9e307SS5DTEVBUl9FRElUT1JfQ09NTUFORD17fTtJLkNMRUFSX0hJU1RPUllfQ09NTUFORD17fTtJLkNMSUNLX0NPTU1BTkQ9YlM7SS5DT01NQU5EX1BSSU9SSVRZX0NSSVRJQ0FMPTQ7SS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUj0wO0kuQ09NTUFORF9QUklPUklUWV9ISUdIPTM7SS5DT01NQU5EX1BSSU9SSVRZX0xPVz0xO0kuQ09NTUFORF9QUklPUklUWV9OT1JNQUw9MjtJLkNPTlRST0xMRURfVEVYVF9JTlNFUlRJT05fQ09NTUFORD1HbDtJLkNPUFlfQ09NTUFORD1vdjtJLkNVVF9DT01NQU5EPWx2O0kuREVMRVRFX0NIQVJBQ1RFUl9DT01NQU5EPXFhO0kuREVMRVRFX0xJTkVfQ09NTUFORD10dTtJLkRFTEVURV9XT1JEX0NPTU1BTkQ9ZXU7SS5ERVBSRUNBVEVEXyRjb21wdXRlR3JpZE1hcD1rRTtJLkRFUFJFQ0FURURfJGNyZWF0ZUdyaWRTZWxlY3Rpb249ZnVuY3Rpb24oKXtsZXQgZT1uZXcgVnIoInJvb3QiLDAsImVsZW1lbnQiKSx0PW5ldyBWcigicm9vdCIsMCwiZWxlbWVudCIpO3JldHVybiBuZXcgQWYoInJvb3QiLGUsdCl9O0kuREVQUkVDQVRFRF8kZ2V0R3JpZENlbGxOb2RlUmVjdD1TbTtJLkRFUFJFQ0FURURfJGdldE5vZGVUcmlwbGV0PSRFO0kuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGU9UW47SS5ERVBSRUNBVEVEXyRpc0dyaWROb2RlPUV2O0kuREVQUkVDQVRFRF8kaXNHcmlkUm93Tm9kZT1zdTtJLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbj15djtJLkRFUFJFQ0FURURfR3JpZENlbGxOb2RlPVN2O0kuREVQUkVDQVRFRF9HcmlkTm9kZT1PRTtJLkRFUFJFQ0FURURfR3JpZFJvd05vZGU9UEU7SS5EUkFHRU5EX0NPTU1BTkQ9V1M7SS5EUkFHT1ZFUl9DT01NQU5EPVVTO0kuRFJBR1NUQVJUX0NPTU1BTkQ9QlM7SS5EUk9QX0NPTU1BTkQ9RlM7SS5EZWNvcmF0b3JOb2RlPVRFO0kuRWxlbWVudE5vZGU9dWw7SS5GT0NVU19DT01NQU5EPVZTO0kuRk9STUFUX0VMRU1FTlRfQ09NTUFORD17fTtJLkZPUk1BVF9URVhUX0NPTU1BTkQ9VWk7SS5JTkRFTlRfQ09OVEVOVF9DT01NQU5EPXt9O0kuSU5TRVJUX0xJTkVfQlJFQUtfQ09NTUFORD1DYTtJLklOU0VSVF9QQVJBR1JBUEhfQ09NTUFORD1pbTtJLklOU0VSVF9UQUJfQ09NTUFORD17fTtJLktFWV9BUlJPV19ET1dOX0NPTU1BTkQ9TVM7SS5LRVlfQVJST1dfTEVGVF9DT01NQU5EPU9TO0kuS0VZX0FSUk9XX1JJR0hUX0NPTU1BTkQ9TlM7SS5LRVlfQVJST1dfVVBfQ09NTUFORD1BUztJLktFWV9CQUNLU1BBQ0VfQ09NTUFORD1JUztJLktFWV9ERUxFVEVfQ09NTUFORD1qUztJLktFWV9ET1dOX0NPTU1BTkQ9VFM7SS5LRVlfRU5URVJfQ09NTUFORD1rZDtJLktFWV9FU0NBUEVfQ09NTUFORD1MUztJLktFWV9NT0RJRklFUl9DT01NQU5EPUtTO0kuS0VZX1NQQUNFX0NPTU1BTkQ9RFM7SS5LRVlfVEFCX0NPTU1BTkQ9elM7SS5MaW5lQnJlYWtOb2RlPWtzO0kuTU9WRV9UT19FTkQ9UlM7SS5NT1ZFX1RPX1NUQVJUPVBTO0kuT1VUREVOVF9DT05URU5UX0NPTU1BTkQ9e307SS5QQVNURV9DT01NQU5EPW52O0kuUGFyYWdyYXBoTm9kZT1PcztJLlJFRE9fQ09NTUFORD1pdjtJLlJFTU9WRV9URVhUX0NPTU1BTkQ9b207SS5Sb290Tm9kZT1ScztJLlNFTEVDVElPTl9DSEFOR0VfQ09NTUFORD1DZjtJLlNFTEVDVF9BTExfQ09NTUFORD1sbTtJLlRhYk5vZGU9JHM7SS5UZXh0Tm9kZT1zbDtJLlVORE9fQ09NTUFORD1ydjtJLmNyZWF0ZUNvbW1hbmQ9ZnVuY3Rpb24oKXtyZXR1cm57fX07SS5jcmVhdGVFZGl0b3I9ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8e30sbj16dCxyPXQudGhlbWV8fHt9O2xldCBpPWU9PT12b2lkIDA/bjp0LnBhcmVudEVkaXRvcnx8bnVsbCxvPXQuZGlzYWJsZUV2ZW50c3x8ITEsbD13digpLHM9dC5uYW1lc3BhY2V8fChpIT09bnVsbD9pLl9jb25maWcubmFtZXNwYWNlOnJFKCkpLGE9dC5lZGl0b3JTdGF0ZSx1PVtScyxzbCxrcywkcyxPcywuLi50Lm5vZGVzfHxbXV0sYz10Lm9uRXJyb3I7aWYodD10LmVkaXRhYmxlIT09dm9pZCAwP3QuZWRpdGFibGU6ITAsZT09PXZvaWQgMCYmbiE9PW51bGwpZT1uLl9ub2RlcztlbHNlIGZvcihlPW5ldyBNYXAsbj0wO248dS5sZW5ndGg7bisrKXtsZXQgZj11W25dLGg9bnVsbDt2YXIgZD1udWxsO3R5cGVvZiBmIT0iZnVuY3Rpb24iJiYoZD1mLGY9ZC5yZXBsYWNlLGg9ZC53aXRoLGQ9ZC53aXRoS2xhc3M/ZC53aXRoS2xhc3M6bnVsbCk7bGV0IG09Zi5nZXRUeXBlKCksZz1mLnRyYW5zZm9ybSgpLFM9bmV3IFNldDtnIT09bnVsbCYmUy5hZGQoZyksZS5zZXQobSx7a2xhc3M6ZixyZXBsYWNlOmgscmVwbGFjZVdpdGhLbGFzczpkLHRyYW5zZm9ybXM6U30pfXJldHVybiByPW5ldyBUTyhsLGksZSx7ZGlzYWJsZUV2ZW50czpvLG5hbWVzcGFjZTpzLHRoZW1lOnJ9LGN8fGNvbnNvbGUuZXJyb3IsYk8oZSksdCksYSE9PXZvaWQgMCYmKHIuX3BlbmRpbmdFZGl0b3JTdGF0ZT1hLHIuX2RpcnR5VHlwZT0yKSxyfTtJLmdldE5lYXJlc3RFZGl0b3JGcm9tRE9NTm9kZT1mdjtJLmlzSFRNTEFuY2hvckVsZW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIE5mKGUpJiZlLnRhZ05hbWU9PT0iQSJ9O0kuaXNIVE1MRWxlbWVudD1OZjtJLmlzU2VsZWN0aW9uQ2FwdHVyZWRJbkRlY29yYXRvcklucHV0PWR2O0kuaXNTZWxlY3Rpb25XaXRoaW5FZGl0b3I9TXU7Y29uc3QgTk89STt2YXIgd2U9Tk8sYnQ9e30sVXQ9e30sbGU9d2U7bGV0IElkPW5ldyBNYXA7ZnVuY3Rpb24gaXgoZSl7Zm9yKDtlIT1udWxsOyl7aWYoZS5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFKXJldHVybiBlO2U9ZS5maXJzdENoaWxkfXJldHVybiBudWxsfWZ1bmN0aW9uIG94KGUpe2xldCB0PWUucGFyZW50Tm9kZTtpZih0PT1udWxsKXRocm93IEVycm9yKCJTaG91bGQgbmV2ZXIgaGFwcGVuIik7cmV0dXJuW3QsQXJyYXkuZnJvbSh0LmNoaWxkTm9kZXMpLmluZGV4T2YoZSldfWZ1bmN0aW9uIEFFKGUpe2xldCB0PXt9O2U9ZS5zcGxpdCgiOyIpO2ZvcihsZXQgbiBvZiBlKWlmKG4hPT0iIil7bGV0W3IsaV09bi5zcGxpdCgvOihbXl0rKS8pO3Rbci50cmltKCldPWkudHJpbSgpfXJldHVybiB0fWZ1bmN0aW9uIExkKGUpe2xldCB0PUlkLmdldChlKTtyZXR1cm4gdD09PXZvaWQgMCYmKHQ9QUUoZSksSWQuc2V0KGUsdCkpLHR9ZnVuY3Rpb24gUk8oZSl7bGV0IHQ9IiI7Zm9yKGxldCBuIGluIGUpbiYmKHQrPWAke259OiAke2Vbbl19O2ApO3JldHVybiB0fWZ1bmN0aW9uIGdsKGUsdCl7dmFyIG49TGQoImdldFN0eWxlImluIGU/ZS5nZXRTdHlsZSgpOmUuc3R5bGUpO3Q9T2JqZWN0LmVudHJpZXModCkucmVkdWNlKChyLFtpLG9dKT0+KG89PT1udWxsP2RlbGV0ZSByW2ldOnJbaV09byxyKSx7Li4ubn0pLG49Uk8odCksZS5zZXRTdHlsZShuKSxJZC5zZXQobix0KX1mdW5jdGlvbiBNRShlLHQpe3ZhciBuPWUuZ2V0Tm9kZXMoKSxyPW4ubGVuZ3RoO2lmKGxlLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbihlKSl7Zm9yKHZhciBpPWxlLiRjcmVhdGVSYW5nZVNlbGVjdGlvbigpLG89aS5hbmNob3IsbD1pLmZvY3VzLHM9MDtzPHI7cysrKXt2YXIgYT1uW3NdO2xlLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKGEpJiYoby5zZXQoYS5nZXRLZXkoKSwwLCJlbGVtZW50IiksbC5zZXQoYS5nZXRLZXkoKSxhLmdldENoaWxkcmVuU2l6ZSgpLCJlbGVtZW50IiksTUUobGUuJG5vcm1hbGl6ZVNlbGVjdGlvbl9fRVhQRVJJTUVOVEFMKGkpLHQpKX1sZS4kc2V0U2VsZWN0aW9uKGUpfWVsc2UgaWYoLS1yLGk9blswXSxvPW5bcl0sZS5pc0NvbGxhcHNlZCgpKWdsKGUsdCk7ZWxzZXt2YXIgdT1lLmFuY2hvcixjPWUuZm9jdXM7cz1pLmdldFRleHRDb250ZW50KCkubGVuZ3RoLGE9Yy5vZmZzZXQ7dmFyIGQ9dS5vZmZzZXQsZj11LmlzQmVmb3JlKGMpO2w9Zj9kOmEsZT1mP2E6ZDt2YXIgaD1mP3UudHlwZTpjLnR5cGUsbT1mP2MudHlwZTp1LnR5cGU7aWYodT1mP2Mua2V5OnUua2V5LGxlLiRpc1RleHROb2RlKGkpJiZsPT09cyYmKGM9aS5nZXROZXh0U2libGluZygpLGxlLiRpc1RleHROb2RlKGMpJiYobD1kPTAsaT1jKSksbi5sZW5ndGg9PT0xKWxlLiRpc1RleHROb2RlKGkpJiYobD1oPT09ImVsZW1lbnQiPzA6ZD5hP2E6ZCxlPW09PT0iZWxlbWVudCI/czpkPmE/ZDphLGwhPT1lJiYobD09PTAmJmU9PT1zPyhnbChpLHQpLGkuc2VsZWN0KGwsZSkpOihuPWkuc3BsaXRUZXh0KGwsZSksbj1sPT09MD9uWzBdOm5bMV0sZ2wobix0KSxuLnNlbGVjdCgwLGUtbCkpKSk7ZWxzZSBmb3IobGUuJGlzVGV4dE5vZGUoaSkmJmw8aS5nZXRUZXh0Q29udGVudFNpemUoKSYmKGwhPT0wJiYoaT1pLnNwbGl0VGV4dChsKVsxXSksZ2woaSx0KSksbGUuJGlzVGV4dE5vZGUobykmJihsPW8uZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGgsby5fX2tleSE9PXUmJmUhPT0wJiYoZT1sKSxlIT09bCYmKFtvXT1vLnNwbGl0VGV4dChlKSksZSE9PTAmJmdsKG8sdCkpLGU9MTtlPHI7ZSsrKWw9bltlXSxzPWwuZ2V0S2V5KCksbGUuJGlzVGV4dE5vZGUobCkmJnMhPT1pLmdldEtleSgpJiZzIT09by5nZXRLZXkoKSYmIWwuaXNUb2tlbigpJiZnbChsLHQpfX1mdW5jdGlvbiBPTyhlKXtmb3IoO2UhPT1udWxsJiYhbGUuJGlzUm9vdE9yU2hhZG93Um9vdChlKTspe2xldCB0PWUuZ2V0TGF0ZXN0KCksbj1lLmdldFBhcmVudCgpO3QuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wJiZlLnJlbW92ZSghMCksZT1ufX1mdW5jdGlvbiB6aChlLHQsbixyLGk9bnVsbCl7aWYodC5sZW5ndGghPT0wKXt2YXIgbz10WzBdLGw9bmV3IE1hcCxzPVtdO289bGUuJGlzRWxlbWVudE5vZGUobyk/bzpvLmdldFBhcmVudE9yVGhyb3coKSxvLmlzSW5saW5lKCkmJihvPW8uZ2V0UGFyZW50T3JUaHJvdygpKTtmb3IodmFyIGE9ITE7byE9PW51bGw7KXt2YXIgdT1vLmdldFByZXZpb3VzU2libGluZygpO2lmKHUhPT1udWxsKXtvPXUsYT0hMDticmVha31pZihvPW8uZ2V0UGFyZW50T3JUaHJvdygpLGxlLiRpc1Jvb3RPclNoYWRvd1Jvb3QobykpYnJlYWt9dT1uZXcgU2V0O2Zvcih2YXIgYz0wO2M8bjtjKyspe3ZhciBkPXRbY107bGUuJGlzRWxlbWVudE5vZGUoZCkmJmQuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wJiZ1LmFkZChkLmdldEtleSgpKX12YXIgZj1uZXcgU2V0O2ZvcihjPTA7YzxuO2MrKyl7ZD10W2NdO3ZhciBoPWQuZ2V0UGFyZW50KCk7aWYoaCE9PW51bGwmJmguaXNJbmxpbmUoKSYmKGg9aC5nZXRQYXJlbnQoKSksaCE9PW51bGwmJmxlLiRpc0xlYWZOb2RlKGQpJiYhZi5oYXMoZC5nZXRLZXkoKSkpe2lmKGQ9aC5nZXRLZXkoKSxsLmdldChkKT09PXZvaWQgMCl7bGV0IG09cigpO20uc2V0Rm9ybWF0KGguZ2V0Rm9ybWF0VHlwZSgpKSxtLnNldEluZGVudChoLmdldEluZGVudCgpKSxzLnB1c2gobSksbC5zZXQoZCxtKSxoLmdldENoaWxkcmVuKCkuZm9yRWFjaChnPT57bS5hcHBlbmQoZyksZi5hZGQoZy5nZXRLZXkoKSksbGUuJGlzRWxlbWVudE5vZGUoZykmJmcuZ2V0Q2hpbGRyZW5LZXlzKCkuZm9yRWFjaChTPT5mLmFkZChTKSl9KSxPTyhoKX19ZWxzZSB1LmhhcyhkLmdldEtleSgpKSYmKGg9cigpLGguc2V0Rm9ybWF0KGQuZ2V0Rm9ybWF0VHlwZSgpKSxoLnNldEluZGVudChkLmdldEluZGVudCgpKSxzLnB1c2goaCksZC5yZW1vdmUoITApKX1pZihpIT09bnVsbClmb3IodD0wO3Q8cy5sZW5ndGg7dCsrKWkuYXBwZW5kKHNbdF0pO2lmKHQ9bnVsbCxsZS4kaXNSb290T3JTaGFkb3dSb290KG8pKWlmKGEpaWYoaSE9PW51bGwpby5pbnNlcnRBZnRlcihpKTtlbHNlIGZvcihpPXMubGVuZ3RoLTE7MDw9aTtpLS0pby5pbnNlcnRBZnRlcihzW2ldKTtlbHNlIGlmKGE9by5nZXRGaXJzdENoaWxkKCksbGUuJGlzRWxlbWVudE5vZGUoYSkmJihvPWEpLGE9PT1udWxsKWlmKGkpby5hcHBlbmQoaSk7ZWxzZSBmb3IoaT0wO2k8cy5sZW5ndGg7aSsrKWE9c1tpXSxvLmFwcGVuZChhKSx0PWE7ZWxzZSBpZihpIT09bnVsbClhLmluc2VydEJlZm9yZShpKTtlbHNlIGZvcihvPTA7bzxzLmxlbmd0aDtvKyspaT1zW29dLGEuaW5zZXJ0QmVmb3JlKGkpLHQ9aTtlbHNlIGlmKGkpby5pbnNlcnRBZnRlcihpKTtlbHNlIGZvcihpPXMubGVuZ3RoLTE7MDw9aTtpLS0pYT1zW2ldLG8uaW5zZXJ0QWZ0ZXIoYSksdD1hO3M9bGUuJGdldFByZXZpb3VzU2VsZWN0aW9uKCksbGUuJGlzUmFuZ2VTZWxlY3Rpb24ocykmJnMuYW5jaG9yLmdldE5vZGUoKS5pc0F0dGFjaGVkKCkmJnMuZm9jdXMuZ2V0Tm9kZSgpLmlzQXR0YWNoZWQoKT9sZS4kc2V0U2VsZWN0aW9uKHMuY2xvbmUoKSk6dCE9PW51bGw/dC5zZWxlY3RFbmQoKTplLmRpcnR5PSEwfX1mdW5jdGlvbiBERShlLHQsbixyKXtlLm1vZGlmeSh0PyJleHRlbmQiOiJtb3ZlIixuLHIpfWZ1bmN0aW9uIElFKGUpe3JldHVybiBlPWUuYW5jaG9yLmdldE5vZGUoKSwobGUuJGlzUm9vdE5vZGUoZSk/ZTplLmdldFBhcmVudE9yVGhyb3coKSkuZ2V0RGlyZWN0aW9uKCk9PT0icnRsIn1VdC4kYWRkTm9kZVN0eWxlPWZ1bmN0aW9uKGUpe2U9ZS5nZXRTdHlsZSgpO2xldCB0PUFFKGUpO0lkLnNldChlLHQpfTtVdC4kY2xvbmVXaXRoUHJvcGVydGllcz1mdW5jdGlvbihlKXtsZXQgdD1lLmNvbnN0cnVjdG9yLmNsb25lKGUpO3JldHVybiB0Ll9fcGFyZW50PWUuX19wYXJlbnQsdC5fX25leHQ9ZS5fX25leHQsdC5fX3ByZXY9ZS5fX3ByZXYsbGUuJGlzRWxlbWVudE5vZGUoZSkmJmxlLiRpc0VsZW1lbnROb2RlKHQpPyh0Ll9fZmlyc3Q9ZS5fX2ZpcnN0LHQuX19sYXN0PWUuX19sYXN0LHQuX19zaXplPWUuX19zaXplLHQuX19mb3JtYXQ9ZS5fX2Zvcm1hdCx0Ll9faW5kZW50PWUuX19pbmRlbnQsdC5fX2Rpcj1lLl9fZGlyLHQpOihsZS4kaXNUZXh0Tm9kZShlKSYmbGUuJGlzVGV4dE5vZGUodCkmJih0Ll9fZm9ybWF0PWUuX19mb3JtYXQsdC5fX3N0eWxlPWUuX19zdHlsZSx0Ll9fbW9kZT1lLl9fbW9kZSx0Ll9fZGV0YWlsPWUuX19kZXRhaWwpLHQpfTtVdC4kZ2V0U2VsZWN0aW9uU3R5bGVWYWx1ZUZvclByb3BlcnR5PWZ1bmN0aW9uKGUsdCxuPSIiKXtsZXQgcj1udWxsLGk9ZS5nZXROb2RlcygpO3ZhciBvPWUuYW5jaG9yLGw9ZS5mb2N1cyxzPWUuaXNCYWNrd2FyZCgpO2xldCBhPXM/bC5vZmZzZXQ6by5vZmZzZXQ7aWYobz1zP2wuZ2V0Tm9kZSgpOm8uZ2V0Tm9kZSgpLGUuc3R5bGUhPT0iIiYmKGU9TGQoZS5zdHlsZSksZSE9PW51bGwmJnQgaW4gZSkpcmV0dXJuIGVbdF07Zm9yKGU9MDtlPGkubGVuZ3RoO2UrKyl7dmFyIHU9aVtlXTtpZigoZT09PTB8fGEhPT0wfHwhdS5pcyhvKSkmJmxlLiRpc1RleHROb2RlKHUpKXtpZihsPXQscz1uLHU9dS5nZXRTdHlsZSgpLHU9TGQodSksbD11IT09bnVsbCYmdVtsXXx8cyxyPT09bnVsbClyPWw7ZWxzZSBpZihyIT09bCl7cj0iIjticmVha319fXJldHVybiByPT09bnVsbD9uOnJ9O1V0LiRpc0F0Tm9kZUVuZD1mdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT09InRleHQiP2Uub2Zmc2V0PT09ZS5nZXROb2RlKCkuZ2V0VGV4dENvbnRlbnRTaXplKCk6ZS5vZmZzZXQ9PT1lLmdldE5vZGUoKS5nZXRDaGlsZHJlblNpemUoKX07VXQuJGlzUGFyZW50RWxlbWVudFJUTD1JRTtVdC4kbW92ZUNhcmV0U2VsZWN0aW9uPURFO1V0LiRtb3ZlQ2hhcmFjdGVyPWZ1bmN0aW9uKGUsdCxuKXtsZXQgcj1JRShlKTtERShlLHQsbj8hcjpyLCJjaGFyYWN0ZXIiKX07VXQuJHBhdGNoU3R5bGVUZXh0PU1FO1V0LiRzZWxlY3RBbGw9ZnVuY3Rpb24oZSl7bGV0IHQ9ZS5hbmNob3I7ZT1lLmZvY3VzO3ZhciBuPXQuZ2V0Tm9kZSgpLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKS5nZXRQYXJlbnRPclRocm93KCk7bGV0IHI9bi5nZXRGaXJzdERlc2NlbmRhbnQoKTtuPW4uZ2V0TGFzdERlc2NlbmRhbnQoKTtsZXQgaT0iZWxlbWVudCIsbz0iZWxlbWVudCIsbD0wO2xlLiRpc1RleHROb2RlKHIpP2k9InRleHQiOmxlLiRpc0VsZW1lbnROb2RlKHIpfHxyPT09bnVsbHx8KHI9ci5nZXRQYXJlbnRPclRocm93KCkpLGxlLiRpc1RleHROb2RlKG4pPyhvPSJ0ZXh0IixsPW4uZ2V0VGV4dENvbnRlbnRTaXplKCkpOmxlLiRpc0VsZW1lbnROb2RlKG4pfHxuPT09bnVsbHx8KG49bi5nZXRQYXJlbnRPclRocm93KCkpLHImJm4mJih0LnNldChyLmdldEtleSgpLDAsaSksZS5zZXQobi5nZXRLZXkoKSxsLG8pKX07VXQuJHNldEJsb2Nrc1R5cGU9ZnVuY3Rpb24oZSx0KXtpZihlLmFuY2hvci5rZXk9PT0icm9vdCIpe3Q9dCgpO3ZhciBuPWxlLiRnZXRSb290KCk7KGU9bi5nZXRGaXJzdENoaWxkKCkpP2UucmVwbGFjZSh0LCEwKTpuLmFwcGVuZCh0KX1lbHNlIGZvcihuPWUuZ2V0Tm9kZXMoKSxlPWUuYW5jaG9yLmdldE5vZGUoKS5nZXRQYXJlbnRPclRocm93KCksbi5pbmRleE9mKGUpPT09LTEmJm4ucHVzaChlKSxlLmlzSW5saW5lKCkmJihlPWUuZ2V0UGFyZW50T3JUaHJvdygpLG4uaW5kZXhPZihlKT09PS0xJiZuLnB1c2goZSkpLGU9MDtlPG4ubGVuZ3RoO2UrKyl7bGV0IG89bltlXTt2YXIgcj1vO2lmKCFsZS4kaXNFbGVtZW50Tm9kZShyKXx8bGUuJGlzUm9vdE9yU2hhZG93Um9vdChyKSlyPSExO2Vsc2V7dmFyIGk9ci5nZXRGaXJzdENoaWxkKCk7aT1pPT09bnVsbHx8bGUuJGlzTGluZUJyZWFrTm9kZShpKXx8bGUuJGlzVGV4dE5vZGUoaSl8fGkuaXNJbmxpbmUoKSxyPSFyLmlzSW5saW5lKCkmJnIuY2FuQmVFbXB0eSgpIT09ITEmJml9ciYmKHI9dCgpLHIuc2V0Rm9ybWF0KG8uZ2V0Rm9ybWF0VHlwZSgpKSxyLnNldEluZGVudChvLmdldEluZGVudCgpKSxvLnJlcGxhY2UociwhMCkpfX07VXQuJHNob3VsZE92ZXJyaWRlRGVmYXVsdENoYXJhY3RlclNlbGVjdGlvbj1mdW5jdGlvbihlLHQpe3JldHVybiBlPWxlLiRnZXRBZGphY2VudE5vZGUoZS5mb2N1cyx0KSxsZS4kaXNEZWNvcmF0b3JOb2RlKGUpJiYhZS5pc0lzb2xhdGVkKCl8fGxlLiRpc0VsZW1lbnROb2RlKGUpJiYhZS5pc0lubGluZSgpJiYhZS5jYW5CZUVtcHR5KCl9O1V0LiRzbGljZVNlbGVjdGVkVGV4dE5vZGVDb250ZW50PWZ1bmN0aW9uKGUsdCl7aWYodC5pc1NlbGVjdGVkKCkmJiF0LmlzU2VnbWVudGVkKCkmJiF0LmlzVG9rZW4oKSYmKGxlLiRpc1JhbmdlU2VsZWN0aW9uKGUpfHxsZS5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24oZSkpKXt2YXIgbj1lLmFuY2hvci5nZXROb2RlKCkscj1lLmZvY3VzLmdldE5vZGUoKSxpPXQuaXMobiksbz10LmlzKHIpO2lmKGl8fG8pe2k9ZS5pc0JhY2t3YXJkKCk7bGV0W2wsc109ZS5nZXRDaGFyYWN0ZXJPZmZzZXRzKCk7ZT1uLmlzKHIpLG89dC5pcyhpP3I6bikscj10LmlzKGk/bjpyKSxuPTA7bGV0IGE7ZT8obj1sPnM/czpsLGE9bD5zP2w6cyk6bz8obj1pP3M6bCxhPXZvaWQgMCk6ciYmKGk9aT9sOnMsbj0wLGE9aSksdC5fX3RleHQ9dC5fX3RleHQuc2xpY2UobixhKX19cmV0dXJuIHR9O1V0LiR3cmFwTm9kZXM9ZnVuY3Rpb24oZSx0LG49bnVsbCl7dmFyIHI9ZS5nZXROb2RlcygpO2xldCBpPXIubGVuZ3RoO3ZhciBvPWUuYW5jaG9yO2lmKGk9PT0wfHxpPT09MSYmby50eXBlPT09ImVsZW1lbnQiJiZvLmdldE5vZGUoKS5nZXRDaGlsZHJlblNpemUoKT09PTApe2U9by50eXBlPT09InRleHQiP28uZ2V0Tm9kZSgpLmdldFBhcmVudE9yVGhyb3coKTpvLmdldE5vZGUoKSxyPWUuZ2V0Q2hpbGRyZW4oKTtsZXQgcz10KCk7cy5zZXRGb3JtYXQoZS5nZXRGb3JtYXRUeXBlKCkpLHMuc2V0SW5kZW50KGUuZ2V0SW5kZW50KCkpLHIuZm9yRWFjaChhPT5zLmFwcGVuZChhKSksbiYmKHM9bi5hcHBlbmQocykpLGUucmVwbGFjZShzKX1lbHNle289bnVsbDt2YXIgbD1bXTtmb3IobGV0IHM9MDtzPGk7cysrKXtsZXQgYT1yW3NdO2xlLiRpc1Jvb3RPclNoYWRvd1Jvb3QoYSk/KHpoKGUsbCxsLmxlbmd0aCx0LG4pLGw9W10sbz1hKTpvPT09bnVsbHx8byE9PW51bGwmJmxlLiRoYXNBbmNlc3RvcihhLG8pP2wucHVzaChhKTooemgoZSxsLGwubGVuZ3RoLHQsbiksbD1bYV0pfXpoKGUsbCxsLmxlbmd0aCx0LG4pfX07VXQuY3JlYXRlRE9NUmFuZ2U9ZnVuY3Rpb24oZSx0LG4scixpKXtsZXQgbz10LmdldEtleSgpLGw9ci5nZXRLZXkoKSxzPWRvY3VtZW50LmNyZWF0ZVJhbmdlKCksYT1lLmdldEVsZW1lbnRCeUtleShvKTtpZihlPWUuZ2V0RWxlbWVudEJ5S2V5KGwpLGxlLiRpc1RleHROb2RlKHQpJiYoYT1peChhKSksbGUuJGlzVGV4dE5vZGUocikmJihlPWl4KGUpKSx0PT09dm9pZCAwfHxyPT09dm9pZCAwfHxhPT09bnVsbHx8ZT09PW51bGwpcmV0dXJuIG51bGw7YS5ub2RlTmFtZT09PSJCUiImJihbYSxuXT1veChhKSksZS5ub2RlTmFtZT09PSJCUiImJihbZSxpXT1veChlKSksdD1hLmZpcnN0Q2hpbGQsYT09PWUmJnQhPW51bGwmJnQubm9kZU5hbWU9PT0iQlIiJiZuPT09MCYmaT09PTAmJihpPTEpO3RyeXtzLnNldFN0YXJ0KGEsbikscy5zZXRFbmQoZSxpKX1jYXRjaHtyZXR1cm4gbnVsbH1yZXR1cm4hcy5jb2xsYXBzZWR8fG49PT1pJiZvPT09bHx8KHMuc2V0U3RhcnQoZSxpKSxzLnNldEVuZChhLG4pKSxzfTtVdC5jcmVhdGVSZWN0c0Zyb21ET01SYW5nZT1mdW5jdGlvbihlLHQpe3ZhciBuPWUuZ2V0Um9vdEVsZW1lbnQoKTtpZihuPT09bnVsbClyZXR1cm5bXTtlPW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1nZXRDb21wdXRlZFN0eWxlKG4pLG49cGFyc2VGbG9hdChuLnBhZGRpbmdMZWZ0KStwYXJzZUZsb2F0KG4ucGFkZGluZ1JpZ2h0KSx0PUFycmF5LmZyb20odC5nZXRDbGllbnRSZWN0cygpKTtsZXQgcj10Lmxlbmd0aDt0LnNvcnQoKG8sbCk9PntsZXQgcz1vLnRvcC1sLnRvcDtyZXR1cm4gMz49TWF0aC5hYnMocyk/by5sZWZ0LWwubGVmdDpzfSk7bGV0IGk7Zm9yKGxldCBvPTA7bzxyO28rKyl7bGV0IGw9dFtvXSxzPWwud2lkdGgrbj09PWUud2lkdGg7aSYmaS50b3A8PWwudG9wJiZpLnRvcCtpLmhlaWdodD5sLnRvcCYmaS5sZWZ0K2kud2lkdGg+bC5sZWZ0fHxzPyh0LnNwbGljZShvLS0sMSksci0tKTppPWx9cmV0dXJuIHR9O1V0LmdldFN0eWxlT2JqZWN0RnJvbUNTUz1MZDtVdC50cmltVGV4dENvbnRlbnRGcm9tQW5jaG9yPWZ1bmN0aW9uKGUsdCxuKXtsZXQgcj10LmdldE5vZGUoKTtpZihsZS4kaXNFbGVtZW50Tm9kZShyKSl7dmFyIGk9ci5nZXREZXNjZW5kYW50QnlJbmRleCh0Lm9mZnNldCk7aSE9PW51bGwmJihyPWkpfWZvcig7MDxuJiZyIT09bnVsbDspe3ZhciBvPXIuZ2V0UHJldmlvdXNTaWJsaW5nKCksbD0wO2lmKG89PT1udWxsKXtpPXIuZ2V0UGFyZW50T3JUaHJvdygpO2Zvcih2YXIgcz1pLmdldFByZXZpb3VzU2libGluZygpO3M9PT1udWxsOyl7aWYoaT1pLmdldFBhcmVudCgpLGk9PT1udWxsKXtvPW51bGw7YnJlYWt9cz1pLmdldFByZXZpb3VzU2libGluZygpfWkhPT1udWxsJiYobD1pLmlzSW5saW5lKCk/MDoyLG89bGUuJGlzRWxlbWVudE5vZGUocyk/cy5nZXRMYXN0RGVzY2VuZGFudCgpOnMpfWlmKHM9ci5nZXRUZXh0Q29udGVudCgpLHM9PT0iIiYmbGUuJGlzRWxlbWVudE5vZGUocikmJiFyLmlzSW5saW5lKCkmJihzPWAKCmApLGk9cy5sZW5ndGgsIWxlLiRpc1RleHROb2RlKHIpfHxuPj1pKXM9ci5nZXRQYXJlbnQoKSxyLnJlbW92ZSgpLHM9PW51bGx8fHMuZ2V0Q2hpbGRyZW5TaXplKCkhPT0wfHxsZS4kaXNSb290Tm9kZShzKXx8cy5yZW1vdmUoKSxuLT1pK2wscj1vO2Vsc2V7bGV0IGE9ci5nZXRLZXkoKTtsPWUuZ2V0RWRpdG9yU3RhdGUoKS5yZWFkKCgpPT57Y29uc3QgYz1sZS4kZ2V0Tm9kZUJ5S2V5KGEpO3JldHVybiBsZS4kaXNUZXh0Tm9kZShjKSYmYy5pc1NpbXBsZVRleHQoKT9jLmdldFRleHRDb250ZW50KCk6bnVsbH0pLG89aS1uO2xldCB1PXMuc2xpY2UoMCxvKTtsIT09bnVsbCYmbCE9PXM/KG49bGUuJGdldFByZXZpb3VzU2VsZWN0aW9uKCksaT1yLHIuaXNTaW1wbGVUZXh0KCk/ci5zZXRUZXh0Q29udGVudChsKTooaT1sZS4kY3JlYXRlVGV4dE5vZGUobCksci5yZXBsYWNlKGkpKSxsZS4kaXNSYW5nZVNlbGVjdGlvbihuKSYmbi5pc0NvbGxhcHNlZCgpJiYobj1uLmFuY2hvci5vZmZzZXQsaS5zZWxlY3QobixuKSkpOnIuaXNTaW1wbGVUZXh0KCk/KGw9dC5rZXk9PT1hLHM9dC5vZmZzZXQsczxuJiYocz1pKSxuPWw/cy1uOjAsaT1sP3M6byxsJiZuPT09MD8oW25dPXIuc3BsaXRUZXh0KG4saSksbi5yZW1vdmUoKSk6KFssbl09ci5zcGxpdFRleHQobixpKSxuLnJlbW92ZSgpKSk6KG49bGUuJGNyZWF0ZVRleHROb2RlKHUpLHIucmVwbGFjZShuKSksbj0wfX19O2NvbnN0IFBPPVV0O3ZhciBsbz1QTyxBTz1sbyxFdD13ZTtmdW5jdGlvbiBNTyhlKXtsZXQgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3QuYXBwZW5kKCJjb2RlIixlKTtmb3IobGV0IG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXQuYXBwZW5kKCJ2Iixhcmd1bWVudHNbbl0pO3Rocm93IEVycm9yKGBNaW5pZmllZCBMZXhpY2FsIGVycm9yICMke2V9OyB2aXNpdCBodHRwczovL2xleGljYWwuZGV2L2RvY3MvZXJyb3I/JHt0fSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuYCl9ZnVuY3Rpb24gTEUoZSx0KXtmb3IobGV0IG4gb2YgdClpZihlLnR5cGUuc3RhcnRzV2l0aChuKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBqRShlLHQpe2Zvcig7ZSE9PUV0LiRnZXRSb290KCkmJmUhPW51bGw7KXtpZih0KGUpKXJldHVybiBlO2U9ZS5nZXRQYXJlbnQoKX1yZXR1cm4gbnVsbH1idC4kc3BsaXROb2RlPUV0LiRzcGxpdE5vZGU7YnQuaXNIVE1MQW5jaG9yRWxlbWVudD1FdC5pc0hUTUxBbmNob3JFbGVtZW50O2J0LmlzSFRNTEVsZW1lbnQ9RXQuaXNIVE1MRWxlbWVudDtidC4kZGZzPWZ1bmN0aW9uKGUsdCl7bGV0IG49W107ZT0oZXx8RXQuJGdldFJvb3QoKSkuZ2V0TGF0ZXN0KCksdD10fHwoRXQuJGlzRWxlbWVudE5vZGUoZSk/ZS5nZXRMYXN0RGVzY2VuZGFudCgpOmUpO2Zvcih2YXIgcj1lLGk9MDsocj1yLmdldFBhcmVudCgpKSE9PW51bGw7KWkrKztmb3Iocj1pO2UhPT1udWxsJiYhZS5pcyh0KTspaWYobi5wdXNoKHtkZXB0aDpyLG5vZGU6ZX0pLEV0LiRpc0VsZW1lbnROb2RlKGUpJiYwPGUuZ2V0Q2hpbGRyZW5TaXplKCkpZT1lLmdldEZpcnN0Q2hpbGQoKSxyKys7ZWxzZSBmb3IoaT1udWxsO2k9PT1udWxsJiZlIT09bnVsbDspaT1lLmdldE5leHRTaWJsaW5nKCksaT09PW51bGw/KGU9ZS5nZXRQYXJlbnQoKSxyLS0pOmU9aTtyZXR1cm4gZSE9PW51bGwmJmUuaXModCkmJm4ucHVzaCh7ZGVwdGg6cixub2RlOmV9KSxufTtidC4kZmlsdGVyPWZ1bmN0aW9uKGUsdCl7bGV0IG49W107Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspe2xldCBpPXQoZVtyXSk7aSE9PW51bGwmJm4ucHVzaChpKX1yZXR1cm4gbn07YnQuJGZpbmRNYXRjaGluZ1BhcmVudD1qRTtidC4kZ2V0TmVhcmVzdEJsb2NrRWxlbWVudEFuY2VzdG9yT3JUaHJvdz1mdW5jdGlvbihlKXtsZXQgdD1qRShlLG49PkV0LiRpc0VsZW1lbnROb2RlKG4pJiYhbi5pc0lubGluZSgpKTtyZXR1cm4gRXQuJGlzRWxlbWVudE5vZGUodCl8fE1PKDQsZS5fX2tleSksdH07YnQuJGdldE5lYXJlc3ROb2RlT2ZUeXBlPWZ1bmN0aW9uKGUsdCl7Zm9yKDtlIT1udWxsOyl7aWYoZSBpbnN0YW5jZW9mIHQpcmV0dXJuIGU7ZT1lLmdldFBhcmVudCgpfXJldHVybiBudWxsfTtidC4kaW5zZXJ0Rmlyc3Q9ZnVuY3Rpb24oZSx0KXtsZXQgbj1lLmdldEZpcnN0Q2hpbGQoKTtuIT09bnVsbD9uLmluc2VydEJlZm9yZSh0KTplLmFwcGVuZCh0KX07YnQuJGluc2VydE5vZGVUb05lYXJlc3RSb290PWZ1bmN0aW9uKGUpe3ZhciB0PUV0LiRnZXRTZWxlY3Rpb24oKXx8RXQuJGdldFByZXZpb3VzU2VsZWN0aW9uKCk7aWYoRXQuJGlzUmFuZ2VTZWxlY3Rpb24odCkpe3Zhcntmb2N1czpufT10O2lmKHQ9bi5nZXROb2RlKCksbj1uLm9mZnNldCxFdC4kaXNSb290T3JTaGFkb3dSb290KHQpKW49dC5nZXRDaGlsZEF0SW5kZXgobiksbj09bnVsbD90LmFwcGVuZChlKTpuLmluc2VydEJlZm9yZShlKSxlLnNlbGVjdE5leHQoKTtlbHNle2xldCByLGk7RXQuJGlzVGV4dE5vZGUodCk/KHI9dC5nZXRQYXJlbnRPclRocm93KCksaT10LmdldEluZGV4V2l0aGluUGFyZW50KCksMDxuJiYoaSs9MSx0LnNwbGl0VGV4dChuKSkpOihyPXQsaT1uKSxbLHRdPUV0LiRzcGxpdE5vZGUocixpKSx0Lmluc2VydEJlZm9yZShlKSx0LnNlbGVjdFN0YXJ0KCl9fWVsc2UgRXQuJGlzTm9kZVNlbGVjdGlvbih0KXx8RXQuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKHQpPyh0PXQuZ2V0Tm9kZXMoKSx0W3QubGVuZ3RoLTFdLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKS5pbnNlcnRBZnRlcihlKSk6RXQuJGdldFJvb3QoKS5hcHBlbmQoZSksdD1FdC4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpLGUuaW5zZXJ0QWZ0ZXIodCksdC5zZWxlY3QoKTtyZXR1cm4gZS5nZXRMYXRlc3QoKX07YnQuJHJlc3RvcmVFZGl0b3JTdGF0ZT1mdW5jdGlvbihlLHQpe2xldCBuPW5ldyBNYXAscj1lLl9wZW5kaW5nRWRpdG9yU3RhdGU7Zm9yKGxldFtpLG9db2YgdC5fbm9kZU1hcCl7bGV0IGw9QU8uJGNsb25lV2l0aFByb3BlcnRpZXMobyk7RXQuJGlzVGV4dE5vZGUobCkmJihsLl9fdGV4dD1vLl9fdGV4dCksbi5zZXQoaSxsKX1yJiYoci5fbm9kZU1hcD1uKSxlLl9kaXJ0eVR5cGU9MixlPXQuX3NlbGVjdGlvbixFdC4kc2V0U2VsZWN0aW9uKGU9PT1udWxsP251bGw6ZS5jbG9uZSgpKX07YnQuJHdyYXBOb2RlSW5FbGVtZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9dCgpLGUucmVwbGFjZSh0KSx0LmFwcGVuZChlKSx0fTtidC5hZGRDbGFzc05hbWVzVG9FbGVtZW50PWZ1bmN0aW9uKGUsLi4udCl7dC5mb3JFYWNoKG49Pnt0eXBlb2Ygbj09InN0cmluZyImJihuPW4uc3BsaXQoIiAiKS5maWx0ZXIocj0+ciE9PSIiKSxlLmNsYXNzTGlzdC5hZGQoLi4ubikpfSl9O2J0LmlzTWltZVR5cGU9TEU7YnQubWVkaWFGaWxlUmVhZGVyPWZ1bmN0aW9uKGUsdCl7bGV0IG49ZVtTeW1ib2wuaXRlcmF0b3JdKCk7cmV0dXJuIG5ldyBQcm9taXNlKChyLGkpPT57bGV0IG89W10sbD0oKT0+e2NvbnN0e2RvbmU6cyx2YWx1ZTphfT1uLm5leHQoKTtpZihzKXJldHVybiByKG8pO2NvbnN0IHU9bmV3IEZpbGVSZWFkZXI7dS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsaSksdS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoKT0+e2NvbnN0IGM9dS5yZXN1bHQ7dHlwZW9mIGM9PSJzdHJpbmciJiZvLnB1c2goe2ZpbGU6YSxyZXN1bHQ6Y30pLGwoKX0pLExFKGEsdCk/dS5yZWFkQXNEYXRhVVJMKGEpOmwoKX07bCgpfSl9O2J0Lm1lcmdlUmVnaXN0ZXI9ZnVuY3Rpb24oLi4uZSl7cmV0dXJuKCk9PntlLmZvckVhY2godD0+dCgpKX19O2J0Lm9iamVjdEtsYXNzRXF1YWxzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUhPT1udWxsP09iamVjdC5nZXRQcm90b3R5cGVPZihlKS5jb25zdHJ1Y3Rvci5uYW1lPT09dC5uYW1lOiExfTtidC5yZWdpc3Rlck5lc3RlZEVsZW1lbnRSZXNvbHZlcj1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gZS5yZWdpc3Rlck5vZGVUcmFuc2Zvcm0odCxpPT57ZTp7Zm9yKHZhciBvPWkuZ2V0Q2hpbGRyZW4oKSxsPTA7bDxvLmxlbmd0aDtsKyspaWYob1tsXWluc3RhbmNlb2YgdCl7bz1udWxsO2JyZWFrIGV9Zm9yKG89aTtvIT09bnVsbDspaWYobD1vLG89by5nZXRQYXJlbnQoKSxvIGluc3RhbmNlb2YgdCl7bz17Y2hpbGQ6bCxwYXJlbnQ6b307YnJlYWsgZX1vPW51bGx9aWYobyE9PW51bGwpe2NvbnN0e2NoaWxkOnMscGFyZW50OmF9PW87aWYocy5pcyhpKSl7aWYocihhLGkpLGk9cy5nZXROZXh0U2libGluZ3MoKSxvPWkubGVuZ3RoLGEuaW5zZXJ0QWZ0ZXIocyksbyE9PTApe2w9bihhKSxzLmluc2VydEFmdGVyKGwpO2ZvcihsZXQgdT0wO3U8bzt1KyspbC5hcHBlbmQoaVt1XSl9YS5jYW5CZUVtcHR5KCl8fGEuZ2V0Q2hpbGRyZW5TaXplKCkhPT0wfHxhLnJlbW92ZSgpfX19KX07YnQucmVtb3ZlQ2xhc3NOYW1lc0Zyb21FbGVtZW50PWZ1bmN0aW9uKGUsLi4udCl7dC5mb3JFYWNoKG49Pnt0eXBlb2Ygbj09InN0cmluZyImJmUuY2xhc3NMaXN0LnJlbW92ZSguLi5uLnNwbGl0KCIgIikpfSl9O2NvbnN0IERPPWJ0O3ZhciBGdD1ETyx6ZT13ZSxzbz1GdDtmdW5jdGlvbiBkcyhlKXtsZXQgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3QuYXBwZW5kKCJjb2RlIixlKTtmb3IobGV0IG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXQuYXBwZW5kKCJ2Iixhcmd1bWVudHNbbl0pO3Rocm93IEVycm9yKGBNaW5pZmllZCBMZXhpY2FsIGVycm9yICMke2V9OyB2aXNpdCBodHRwczovL2xleGljYWwuZGV2L2RvY3MvZXJyb3I/JHt0fSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuYCl9ZnVuY3Rpb24gekUoZSl7bGV0IHQ9MTtmb3IoZT1lLmdldFBhcmVudCgpO2UhPW51bGw7KXtpZihmdChlKSl7aWYoZT1lLmdldFBhcmVudCgpLE5lKGUpKXt0KyssZT1lLmdldFBhcmVudCgpO2NvbnRpbnVlfWRzKDQwKX1icmVha31yZXR1cm4gdH1mdW5jdGlvbiBrbShlKXtlPWUuZ2V0UGFyZW50KCksTmUoZSl8fGRzKDQwKTtsZXQgdD1lO2Zvcig7dCE9PW51bGw7KXQ9dC5nZXRQYXJlbnQoKSxOZSh0KSYmKGU9dCk7cmV0dXJuIGV9ZnVuY3Rpb24gRkUoZSl7bGV0IHQ9W107ZT1lLmdldENoaWxkcmVuKCkuZmlsdGVyKGZ0KTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7bGV0IHI9ZVtuXSxpPXIuZ2V0Rmlyc3RDaGlsZCgpO05lKGkpP3Q9dC5jb25jYXQoRkUoaSkpOnQucHVzaChyKX1yZXR1cm4gdH1mdW5jdGlvbiBBcihlKXtyZXR1cm4gZnQoZSkmJk5lKGUuZ2V0Rmlyc3RDaGlsZCgpKX1mdW5jdGlvbiBJTyhlKXtmb3IoO2UuZ2V0TmV4dFNpYmxpbmcoKT09bnVsbCYmZS5nZXRQcmV2aW91c1NpYmxpbmcoKT09bnVsbDspe2xldCB0PWUuZ2V0UGFyZW50KCk7aWYodD09bnVsbHx8IWZ0KGUpJiYhTmUoZSkpYnJlYWs7ZT10fWUucmVtb3ZlKCl9ZnVuY3Rpb24gbHgoZSl7cmV0dXJuIHpuKCkuYXBwZW5kKGUpfWZ1bmN0aW9uIEJFKGUsdCl7cmV0dXJuIGZ0KGUpJiYodC5sZW5ndGg9PT0wfHx0Lmxlbmd0aD09PTEmJmUuaXModFswXSkmJmUuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wKX1mdW5jdGlvbiBRbyhlLHQpe2Uuc3BsaWNlKGUuZ2V0Q2hpbGRyZW5TaXplKCksMCx0KX1mdW5jdGlvbiBzeChlLHQpe2lmKE5lKGUpKXJldHVybiBlO2xldCBuPWUuZ2V0UHJldmlvdXNTaWJsaW5nKCkscj1lLmdldE5leHRTaWJsaW5nKCksaT16bigpO3JldHVybiBpLnNldEZvcm1hdChlLmdldEZvcm1hdFR5cGUoKSksaS5zZXRJbmRlbnQoZS5nZXRJbmRlbnQoKSksUW8oaSxlLmdldENoaWxkcmVuKCkpLE5lKG4pJiZ0PT09bi5nZXRMaXN0VHlwZSgpPyhuLmFwcGVuZChpKSxlLnJlbW92ZSgpLE5lKHIpJiZ0PT09ci5nZXRMaXN0VHlwZSgpJiYoUW8obixyLmdldENoaWxkcmVuKCkpLHIucmVtb3ZlKCkpLG4pOk5lKHIpJiZ0PT09ci5nZXRMaXN0VHlwZSgpPyhyLmdldEZpcnN0Q2hpbGRPclRocm93KCkuaW5zZXJ0QmVmb3JlKGkpLGUucmVtb3ZlKCkscik6KHQ9Z24odCksdC5hcHBlbmQoaSksZS5yZXBsYWNlKHQpLGNuKHQpLHQpfWZ1bmN0aW9uIFVFKGUsdCl7dmFyIG49ZS5nZXRMYXN0Q2hpbGQoKTtsZXQgcj10LmdldEZpcnN0Q2hpbGQoKTtuJiZyJiZBcihuKSYmQXIocikmJihVRShuLmdldEZpcnN0Q2hpbGQoKSxyLmdldEZpcnN0Q2hpbGQoKSksci5yZW1vdmUoKSksbj10LmdldENoaWxkcmVuKCksMDxuLmxlbmd0aCYmKGUuYXBwZW5kKC4uLm4pLGNuKGUpKSx0LnJlbW92ZSgpfWZ1bmN0aW9uIGNuKGUsdCl7aWYoZT10fHxlLmdldENoaWxkcmVuKCksZSE9PXZvaWQgMClmb3IodD0wO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgbz1lW3RdO2lmKGZ0KG8pKXtsZXQgbD1vLmdldFZhbHVlKCk7dmFyIG49byxyPW4uZ2V0UGFyZW50KCksaT0xO2ZvcihyIT1udWxsJiYoTmUocik/aT1yLmdldFN0YXJ0KCk6ZHMoNDQpKSxuPW4uZ2V0UHJldmlvdXNTaWJsaW5ncygpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7bGV0IHM9bltyXTtmdChzKSYmIU5lKHMuZ2V0Rmlyc3RDaGlsZCgpKSYmaSsrfWwhPT1pJiZvLnNldFZhbHVlKGkpfX19ZnVuY3Rpb24gTE8oZSl7aWYoIUFyKGUpKXt2YXIgdD1lLmdldFBhcmVudCgpLG49dD90LmdldFBhcmVudCgpOnZvaWQgMCxyPW4/bi5nZXRQYXJlbnQoKTp2b2lkIDA7aWYoTmUocikmJmZ0KG4pJiZOZSh0KSl7dmFyIGk9dD90LmdldEZpcnN0Q2hpbGQoKTp2b2lkIDAsbz10P3QuZ2V0TGFzdENoaWxkKCk6dm9pZCAwO2lmKGUuaXMoaSkpbi5pbnNlcnRCZWZvcmUoZSksdC5pc0VtcHR5KCkmJm4ucmVtb3ZlKCk7ZWxzZSBpZihlLmlzKG8pKW4uaW5zZXJ0QWZ0ZXIoZSksdC5pc0VtcHR5KCkmJm4ucmVtb3ZlKCk7ZWxzZXt2YXIgbD10LmdldExpc3RUeXBlKCk7aT16bigpO2xldCBzPWduKGwpO2kuYXBwZW5kKHMpLGUuZ2V0UHJldmlvdXNTaWJsaW5ncygpLmZvckVhY2goYT0+cy5hcHBlbmQoYSkpLG89em4oKSxsPWduKGwpLG8uYXBwZW5kKGwpLFFvKGwsZS5nZXROZXh0U2libGluZ3MoKSksbi5pbnNlcnRCZWZvcmUoaSksbi5pbnNlcnRBZnRlcihvKSxuLnJlcGxhY2UoZSl9Y24odCksY24ocil9fX1sZXQgRGY9Y2xhc3MgV0UgZXh0ZW5kcyB6ZS5FbGVtZW50Tm9kZXtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJsaXN0aXRlbSJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgV0UodC5fX3ZhbHVlLHQuX19jaGVja2VkLHQuX19rZXkpfWNvbnN0cnVjdG9yKHQsbixyKXtzdXBlcihyKSx0aGlzLl9fdmFsdWU9dD09PXZvaWQgMD8xOnQsdGhpcy5fX2NoZWNrZWQ9bn1jcmVhdGVET00odCl7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKSxyPXRoaXMuZ2V0UGFyZW50KCk7cmV0dXJuIE5lKHIpJiZyLmdldExpc3RUeXBlKCk9PT0iY2hlY2siJiZ1eChuLHRoaXMsbnVsbCksbi52YWx1ZT10aGlzLl9fdmFsdWUsYXgobix0LnRoZW1lLHRoaXMpLG59dXBkYXRlRE9NKHQsbixyKXtsZXQgaT10aGlzLmdldFBhcmVudCgpO3JldHVybiBOZShpKSYmaS5nZXRMaXN0VHlwZSgpPT09ImNoZWNrIiYmdXgobix0aGlzLHQpLG4udmFsdWU9dGhpcy5fX3ZhbHVlLGF4KG4sci50aGVtZSx0aGlzKSwhMX1zdGF0aWMgdHJhbnNmb3JtKCl7cmV0dXJuIHQ9PntsZXQgbj10LmdldFBhcmVudCgpO05lKG4pJiYoY24obiksbi5nZXRMaXN0VHlwZSgpIT09ImNoZWNrIiYmdC5nZXRDaGVja2VkKCkhPW51bGwmJnQuc2V0Q2hlY2tlZCh2b2lkIDApKX19c3RhdGljIGltcG9ydERPTSgpe3JldHVybntsaTooKT0+KHtjb252ZXJzaW9uOmpPLHByaW9yaXR5OjB9KX19c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49em4oKTtyZXR1cm4gbi5zZXRDaGVja2VkKHQuY2hlY2tlZCksbi5zZXRWYWx1ZSh0LnZhbHVlKSxuLnNldEZvcm1hdCh0LmZvcm1hdCksbi5zZXREaXJlY3Rpb24odC5kaXJlY3Rpb24pLG59ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksY2hlY2tlZDp0aGlzLmdldENoZWNrZWQoKSx0eXBlOiJsaXN0aXRlbSIsdmFsdWU6dGhpcy5nZXRWYWx1ZSgpLHZlcnNpb246MX19YXBwZW5kKC4uLnQpe2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtsZXQgcj10W25dO2lmKHplLiRpc0VsZW1lbnROb2RlKHIpJiZ0aGlzLmNhbk1lcmdlV2l0aChyKSl7bGV0IGk9ci5nZXRDaGlsZHJlbigpO3RoaXMuYXBwZW5kKC4uLmkpLHIucmVtb3ZlKCl9ZWxzZSBzdXBlci5hcHBlbmQocil9cmV0dXJuIHRoaXN9cmVwbGFjZSh0LG4pe2lmKGZ0KHQpKXJldHVybiBzdXBlci5yZXBsYWNlKHQpO3RoaXMuc2V0SW5kZW50KDApO2xldCByPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpO2lmKCFOZShyKSlyZXR1cm4gdDtpZihyLl9fZmlyc3Q9PT10aGlzLmdldEtleSgpKXIuaW5zZXJ0QmVmb3JlKHQpO2Vsc2UgaWYoci5fX2xhc3Q9PT10aGlzLmdldEtleSgpKXIuaW5zZXJ0QWZ0ZXIodCk7ZWxzZXtsZXQgaT1nbihyLmdldExpc3RUeXBlKCkpLG89dGhpcy5nZXROZXh0U2libGluZygpO2Zvcig7bzspe2xldCBsPW87bz1vLmdldE5leHRTaWJsaW5nKCksaS5hcHBlbmQobCl9ci5pbnNlcnRBZnRlcih0KSx0Lmluc2VydEFmdGVyKGkpfXJldHVybiBuJiZ0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaChpPT57dC5hcHBlbmQoaSl9KSx0aGlzLnJlbW92ZSgpLHIuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wJiZyLnJlbW92ZSgpLHR9aW5zZXJ0QWZ0ZXIodCxuPSEwKXt2YXIgcj10aGlzLmdldFBhcmVudE9yVGhyb3coKTtOZShyKXx8ZHMoMzkpO3ZhciBpPXRoaXMuZ2V0TmV4dFNpYmxpbmdzKCk7aWYoZnQodCkpcmV0dXJuIG49c3VwZXIuaW5zZXJ0QWZ0ZXIodCxuKSx0PXQuZ2V0UGFyZW50T3JUaHJvdygpLE5lKHQpJiZjbih0KSxuO2lmKE5lKHQpKXtmb3Iocj10LHQ9dC5nZXRDaGlsZHJlbigpLGk9dC5sZW5ndGgtMTswPD1pO2ktLSlyPXRbaV0sdGhpcy5pbnNlcnRBZnRlcihyLG4pO3JldHVybiByfWlmKHIuaW5zZXJ0QWZ0ZXIodCxuKSxpLmxlbmd0aCE9PTApe2xldCBvPWduKHIuZ2V0TGlzdFR5cGUoKSk7aS5mb3JFYWNoKGw9Pm8uYXBwZW5kKGwpKSx0Lmluc2VydEFmdGVyKG8sbil9cmV0dXJuIHR9cmVtb3ZlKHQpe2xldCBuPXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCkscj10aGlzLmdldE5leHRTaWJsaW5nKCk7c3VwZXIucmVtb3ZlKHQpLG4mJnImJkFyKG4pJiZBcihyKT8oVUUobi5nZXRGaXJzdENoaWxkKCksci5nZXRGaXJzdENoaWxkKCkpLHIucmVtb3ZlKCkpOnImJih0PXIuZ2V0UGFyZW50KCksTmUodCkmJmNuKHQpKX1pbnNlcnROZXdBZnRlcih0LG49ITApe3JldHVybiB0PXpuKHRoaXMuX19jaGVja2VkPT1udWxsP3ZvaWQgMDohMSksdGhpcy5pbnNlcnRBZnRlcih0LG4pLHR9Y29sbGFwc2VBdFN0YXJ0KHQpe2xldCBuPXplLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk7dGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2gobD0+bi5hcHBlbmQobCkpO3ZhciByPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpLGk9ci5nZXRQYXJlbnRPclRocm93KCk7bGV0IG89ZnQoaSk7cmV0dXJuIHIuZ2V0Q2hpbGRyZW5TaXplKCk9PT0xP28/KHIucmVtb3ZlKCksaS5zZWxlY3QoKSk6KHIuaW5zZXJ0QmVmb3JlKG4pLHIucmVtb3ZlKCkscj10LmFuY2hvcix0PXQuZm9jdXMsaT1uLmdldEtleSgpLHIudHlwZT09PSJlbGVtZW50IiYmci5nZXROb2RlKCkuaXModGhpcykmJnIuc2V0KGksci5vZmZzZXQsImVsZW1lbnQiKSx0LnR5cGU9PT0iZWxlbWVudCImJnQuZ2V0Tm9kZSgpLmlzKHRoaXMpJiZ0LnNldChpLHQub2Zmc2V0LCJlbGVtZW50IikpOihyLmluc2VydEJlZm9yZShuKSx0aGlzLnJlbW92ZSgpKSwhMH1nZXRWYWx1ZSgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fdmFsdWV9c2V0VmFsdWUodCl7dGhpcy5nZXRXcml0YWJsZSgpLl9fdmFsdWU9dH1nZXRDaGVja2VkKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19jaGVja2VkfXNldENoZWNrZWQodCl7dGhpcy5nZXRXcml0YWJsZSgpLl9fY2hlY2tlZD10fXRvZ2dsZUNoZWNrZWQoKXt0aGlzLnNldENoZWNrZWQoIXRoaXMuX19jaGVja2VkKX1nZXRJbmRlbnQoKXt2YXIgdD10aGlzLmdldFBhcmVudCgpO2lmKHQ9PT1udWxsKXJldHVybiB0aGlzLmdldExhdGVzdCgpLl9faW5kZW50O3Q9dC5nZXRQYXJlbnRPclRocm93KCk7bGV0IG49MDtmb3IoO2Z0KHQpOyl0PXQuZ2V0UGFyZW50T3JUaHJvdygpLmdldFBhcmVudE9yVGhyb3coKSxuKys7cmV0dXJuIG59c2V0SW5kZW50KHQpe3R5cGVvZiB0PT0ibnVtYmVyIiYmLTE8dHx8ZHMoMTE3KTtsZXQgbj10aGlzLmdldEluZGVudCgpO2Zvcig7biE9PXQ7KWlmKG48dCl7ZTp7dmFyIHI9bmV3IFNldDtpZihBcih0aGlzKXx8ci5oYXModGhpcy5nZXRLZXkoKSkpYnJlYWsgZTtsZXQgcz10aGlzLmdldFBhcmVudCgpO3ZhciBpPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKSxvPXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCk7aWYoQXIoaSkmJkFyKG8pKXtpZihvPW8uZ2V0Rmlyc3RDaGlsZCgpLE5lKG8pKXtvLmFwcGVuZCh0aGlzKTt2YXIgbD1pLmdldEZpcnN0Q2hpbGQoKTtOZShsKSYmKGw9bC5nZXRDaGlsZHJlbigpLFFvKG8sbCksaS5yZW1vdmUoKSxyLmFkZChpLmdldEtleSgpKSksY24obyl9fWVsc2UgQXIoaSk/KGk9aS5nZXRGaXJzdENoaWxkKCksTmUoaSkmJihyPWkuZ2V0Rmlyc3RDaGlsZCgpLHIhPT1udWxsJiZyLmluc2VydEJlZm9yZSh0aGlzKSxjbihpKSkpOkFyKG8pPyhpPW8uZ2V0Rmlyc3RDaGlsZCgpLE5lKGkpJiYoaS5hcHBlbmQodGhpcyksY24oaSkpKTpOZShzKSYmKHI9em4oKSxsPWduKHMuZ2V0TGlzdFR5cGUoKSksci5hcHBlbmQobCksbC5hcHBlbmQodGhpcyksbz9vLmluc2VydEFmdGVyKHIpOmk/aS5pbnNlcnRCZWZvcmUocik6cy5hcHBlbmQociksY24obCkpO05lKHMpJiZjbihzKX1uKyt9ZWxzZSBMTyh0aGlzKSxuLS07cmV0dXJuIHRoaXN9aW5zZXJ0QmVmb3JlKHQpe2lmKGZ0KHQpKXtsZXQgbj10aGlzLmdldFBhcmVudE9yVGhyb3coKTtpZihOZShuKSl7bGV0IHI9dGhpcy5nZXROZXh0U2libGluZ3MoKTtjbihuLHIpfX1yZXR1cm4gc3VwZXIuaW5zZXJ0QmVmb3JlKHQpfWNhbkluc2VydEFmdGVyKHQpe3JldHVybiBmdCh0KX1jYW5SZXBsYWNlV2l0aCh0KXtyZXR1cm4gZnQodCl9Y2FuTWVyZ2VXaXRoKHQpe3JldHVybiB6ZS4kaXNQYXJhZ3JhcGhOb2RlKHQpfHxmdCh0KX1leHRyYWN0V2l0aENoaWxkKHQsbil7aWYoIXplLiRpc1JhbmdlU2VsZWN0aW9uKG4pKXJldHVybiExO3Q9bi5hbmNob3IuZ2V0Tm9kZSgpO2xldCByPW4uZm9jdXMuZ2V0Tm9kZSgpO3JldHVybiB0aGlzLmlzUGFyZW50T2YodCkmJnRoaXMuaXNQYXJlbnRPZihyKSYmdGhpcy5nZXRUZXh0Q29udGVudCgpLmxlbmd0aD09PW4uZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGh9aXNQYXJlbnRSZXF1aXJlZCgpe3JldHVybiEwfWNyZWF0ZVBhcmVudEVsZW1lbnROb2RlKCl7cmV0dXJuIGduKCJidWxsZXQiKX19O2Z1bmN0aW9uIGF4KGUsdCxuKXtsZXQgcj1bXSxpPVtdO3ZhciBvPSh0PXQubGlzdCk/dC5saXN0aXRlbTp2b2lkIDA7aWYodCYmdC5uZXN0ZWQpdmFyIGw9dC5uZXN0ZWQubGlzdGl0ZW07aWYobyE9PXZvaWQgMCYmKG89by5zcGxpdCgiICIpLHIucHVzaCguLi5vKSksdCl7bz1uLmdldFBhcmVudCgpLG89TmUobykmJm8uZ2V0TGlzdFR5cGUoKT09PSJjaGVjayI7bGV0IHM9bi5nZXRDaGVja2VkKCk7byYmIXN8fGkucHVzaCh0Lmxpc3RpdGVtVW5jaGVja2VkKSxvJiZzfHxpLnB1c2godC5saXN0aXRlbUNoZWNrZWQpLG8mJnIucHVzaChzP3QubGlzdGl0ZW1DaGVja2VkOnQubGlzdGl0ZW1VbmNoZWNrZWQpfWwhPT12b2lkIDAmJihsPWwuc3BsaXQoIiAiKSxuLmdldENoaWxkcmVuKCkuc29tZShzPT5OZShzKSk/ci5wdXNoKC4uLmwpOmkucHVzaCguLi5sKSksMDxpLmxlbmd0aCYmc28ucmVtb3ZlQ2xhc3NOYW1lc0Zyb21FbGVtZW50KGUsLi4uaSksMDxyLmxlbmd0aCYmc28uYWRkQ2xhc3NOYW1lc1RvRWxlbWVudChlLC4uLnIpfWZ1bmN0aW9uIHV4KGUsdCxuKXtOZSh0LmdldEZpcnN0Q2hpbGQoKSk/KGUucmVtb3ZlQXR0cmlidXRlKCJyb2xlIiksZS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IiksZS5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIpKTooZS5zZXRBdHRyaWJ1dGUoInJvbGUiLCJjaGVja2JveCIpLGUuc2V0QXR0cmlidXRlKCJ0YWJJbmRleCIsIi0xIiksbiYmdC5fX2NoZWNrZWQ9PT1uLl9fY2hlY2tlZHx8ZS5zZXRBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIsdC5nZXRDaGVja2VkKCk/InRydWUiOiJmYWxzZSIpKX1mdW5jdGlvbiBqTyhlKXtyZXR1cm4gZT1zby5pc0hUTUxFbGVtZW50KGUpJiZlLmdldEF0dHJpYnV0ZSgiYXJpYS1jaGVja2VkIik9PT0idHJ1ZSIse25vZGU6em4oZSl9fWZ1bmN0aW9uIHpuKGUpe3JldHVybiB6ZS4kYXBwbHlOb2RlUmVwbGFjZW1lbnQobmV3IERmKHZvaWQgMCxlKSl9ZnVuY3Rpb24gZnQoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBEZn1sZXQgQ3Y9Y2xhc3MgVkUgZXh0ZW5kcyB6ZS5FbGVtZW50Tm9kZXtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJsaXN0In1zdGF0aWMgY2xvbmUodCl7cmV0dXJuIG5ldyBWRSh0Ll9fbGlzdFR5cGV8fGZ4W3QuX190YWddLHQuX19zdGFydCx0Ll9fa2V5KX1jb25zdHJ1Y3Rvcih0LG4scil7c3VwZXIociksdGhpcy5fX2xpc3RUeXBlPXQ9ZnhbdF18fHQsdGhpcy5fX3RhZz10PT09Im51bWJlciI/Im9sIjoidWwiLHRoaXMuX19zdGFydD1ufWdldFRhZygpe3JldHVybiB0aGlzLl9fdGFnfXNldExpc3RUeXBlKHQpe2xldCBuPXRoaXMuZ2V0V3JpdGFibGUoKTtuLl9fbGlzdFR5cGU9dCxuLl9fdGFnPXQ9PT0ibnVtYmVyIj8ib2wiOiJ1bCJ9Z2V0TGlzdFR5cGUoKXtyZXR1cm4gdGhpcy5fX2xpc3RUeXBlfWdldFN0YXJ0KCl7cmV0dXJuIHRoaXMuX19zdGFydH1jcmVhdGVET00odCl7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLl9fdGFnKTtyZXR1cm4gdGhpcy5fX3N0YXJ0IT09MSYmbi5zZXRBdHRyaWJ1dGUoInN0YXJ0IixTdHJpbmcodGhpcy5fX3N0YXJ0KSksbi5fX2xleGljYWxMaXN0VHlwZT10aGlzLl9fbGlzdFR5cGUsY3gobix0LnRoZW1lLHRoaXMpLG59dXBkYXRlRE9NKHQsbixyKXtyZXR1cm4gdC5fX3RhZyE9PXRoaXMuX190YWc/ITA6KGN4KG4sci50aGVtZSx0aGlzKSwhMSl9c3RhdGljIGltcG9ydERPTSgpe3JldHVybntvbDooKT0+KHtjb252ZXJzaW9uOmR4LHByaW9yaXR5OjB9KSx1bDooKT0+KHtjb252ZXJzaW9uOmR4LHByaW9yaXR5OjB9KX19c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49Z24odC5saXN0VHlwZSx0LnN0YXJ0KTtyZXR1cm4gbi5zZXRGb3JtYXQodC5mb3JtYXQpLG4uc2V0SW5kZW50KHQuaW5kZW50KSxuLnNldERpcmVjdGlvbih0LmRpcmVjdGlvbiksbn1leHBvcnRET00odCl7cmV0dXJue2VsZW1lbnQ6dH09c3VwZXIuZXhwb3J0RE9NKHQpLHQmJnNvLmlzSFRNTEVsZW1lbnQodCkmJih0aGlzLl9fc3RhcnQhPT0xJiZ0LnNldEF0dHJpYnV0ZSgic3RhcnQiLFN0cmluZyh0aGlzLl9fc3RhcnQpKSx0aGlzLl9fbGlzdFR5cGU9PT0iY2hlY2siJiZ0LnNldEF0dHJpYnV0ZSgiX19sZXhpY2FsTGlzdFR5cGUiLCJjaGVjayIpKSx7ZWxlbWVudDp0fX1leHBvcnRKU09OKCl7cmV0dXJuey4uLnN1cGVyLmV4cG9ydEpTT04oKSxsaXN0VHlwZTp0aGlzLmdldExpc3RUeXBlKCksc3RhcnQ6dGhpcy5nZXRTdGFydCgpLHRhZzp0aGlzLmdldFRhZygpLHR5cGU6Imxpc3QiLHZlcnNpb246MX19Y2FuQmVFbXB0eSgpe3JldHVybiExfWNhbkluZGVudCgpe3JldHVybiExfWFwcGVuZCguLi50KXtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG49dFtyXTtpZihmdChuKSlzdXBlci5hcHBlbmQobik7ZWxzZXtsZXQgaT16bigpO05lKG4pfHx6ZS4kaXNFbGVtZW50Tm9kZShuKSYmKG49emUuJGNyZWF0ZVRleHROb2RlKG4uZ2V0VGV4dENvbnRlbnQoKSkpLGkuYXBwZW5kKG4pLHN1cGVyLmFwcGVuZChpKX19cmV0dXJuIGNuKHRoaXMpLHRoaXN9ZXh0cmFjdFdpdGhDaGlsZCh0KXtyZXR1cm4gZnQodCl9fTtmdW5jdGlvbiBjeChlLHQsbil7bGV0IHI9W10saT1bXTt2YXIgbz10Lmxpc3Q7aWYobyE9PXZvaWQgMCl7bGV0IHM9b1tgJHtuLl9fdGFnfURlcHRoYF18fFtdO3Q9ekUobiktMTtsZXQgYT10JXMubGVuZ3RoO3ZhciBsPXNbYV07bGV0IHU9b1tuLl9fdGFnXSxjO2lmKG89by5uZXN0ZWQsbyE9PXZvaWQgMCYmby5saXN0JiYoYz1vLmxpc3QpLHUhPT12b2lkIDAmJnIucHVzaCh1KSxsIT09dm9pZCAwKWZvcihsPWwuc3BsaXQoIiAiKSxyLnB1c2goLi4ubCksbD0wO2w8cy5sZW5ndGg7bCsrKWwhPT1hJiZpLnB1c2gobi5fX3RhZytsKTtjIT09dm9pZCAwJiYobj1jLnNwbGl0KCIgIiksMTx0P3IucHVzaCguLi5uKTppLnB1c2goLi4ubikpfTA8aS5sZW5ndGgmJnNvLnJlbW92ZUNsYXNzTmFtZXNGcm9tRWxlbWVudChlLC4uLmkpLDA8ci5sZW5ndGgmJnNvLmFkZENsYXNzTmFtZXNUb0VsZW1lbnQoZSwuLi5yKX1mdW5jdGlvbiB6TyhlKXtsZXQgdD1bXTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG49ZVtyXTtmdChuKT8odC5wdXNoKG4pLG49bi5nZXRDaGlsZHJlbigpLDE8bi5sZW5ndGgmJm4uZm9yRWFjaChpPT57TmUoaSkmJnQucHVzaChseChpKSl9KSk6dC5wdXNoKGx4KG4pKX1yZXR1cm4gdH1mdW5jdGlvbiBkeChlKXtsZXQgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbj1udWxsO3JldHVybiB0PT09Im9sIj9uPWduKCJudW1iZXIiLGUuc3RhcnQpOnQ9PT0idWwiJiYobj1zby5pc0hUTUxFbGVtZW50KGUpJiZlLmdldEF0dHJpYnV0ZSgiX19sZXhpY2FsbGlzdHR5cGUiKT09PSJjaGVjayI/Z24oImNoZWNrIik6Z24oImJ1bGxldCIpKSx7YWZ0ZXI6ek8sbm9kZTpufX1sZXQgZng9e29sOiJudW1iZXIiLHVsOiJidWxsZXQifTtmdW5jdGlvbiBnbihlLHQ9MSl7cmV0dXJuIHplLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgQ3YoZSx0KSl9ZnVuY3Rpb24gTmUoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBDdn1sZXQgRk89emUuY3JlYXRlQ29tbWFuZCgiSU5TRVJUX1VOT1JERVJFRF9MSVNUX0NPTU1BTkQiKSxCTz16ZS5jcmVhdGVDb21tYW5kKCJJTlNFUlRfT1JERVJFRF9MSVNUX0NPTU1BTkQiKSxVTz16ZS5jcmVhdGVDb21tYW5kKCJJTlNFUlRfQ0hFQ0tfTElTVF9DT01NQU5EIiksV089emUuY3JlYXRlQ29tbWFuZCgiUkVNT1ZFX0xJU1RfQ09NTUFORCIpO3duLiRjcmVhdGVMaXN0SXRlbU5vZGU9em47d24uJGNyZWF0ZUxpc3ROb2RlPWduO3duLiRnZXRMaXN0RGVwdGg9ekU7d24uJGhhbmRsZUxpc3RJbnNlcnRQYXJhZ3JhcGg9ZnVuY3Rpb24oKXt2YXIgZT16ZS4kZ2V0U2VsZWN0aW9uKCk7aWYoIXplLiRpc1JhbmdlU2VsZWN0aW9uKGUpfHwhZS5pc0NvbGxhcHNlZCgpfHwoZT1lLmFuY2hvci5nZXROb2RlKCksIWZ0KGUpfHxlLmdldENoaWxkcmVuU2l6ZSgpIT09MCkpcmV0dXJuITE7dmFyIHQ9a20oZSksbj1lLmdldFBhcmVudCgpO05lKG4pfHxkcyg0MCk7bGV0IHI9bi5nZXRQYXJlbnQoKSxpO2lmKHplLiRpc1Jvb3RPclNoYWRvd1Jvb3QocikpaT16ZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpLHQuaW5zZXJ0QWZ0ZXIoaSk7ZWxzZSBpZihmdChyKSlpPXpuKCksci5pbnNlcnRBZnRlcihpKTtlbHNlIHJldHVybiExO2lmKGkuc2VsZWN0KCksdD1lLmdldE5leHRTaWJsaW5ncygpLDA8dC5sZW5ndGgpe2xldCBvPWduKG4uZ2V0TGlzdFR5cGUoKSk7emUuJGlzUGFyYWdyYXBoTm9kZShpKT9pLmluc2VydEFmdGVyKG8pOihuPXpuKCksbi5hcHBlbmQobyksaS5pbnNlcnRBZnRlcihuKSksdC5mb3JFYWNoKGw9PntsLnJlbW92ZSgpLG8uYXBwZW5kKGwpfSl9cmV0dXJuIElPKGUpLCEwfTt3bi4kaXNMaXN0SXRlbU5vZGU9ZnQ7d24uJGlzTGlzdE5vZGU9TmU7d24uSU5TRVJUX0NIRUNLX0xJU1RfQ09NTUFORD1VTzt3bi5JTlNFUlRfT1JERVJFRF9MSVNUX0NPTU1BTkQ9Qk87d24uSU5TRVJUX1VOT1JERVJFRF9MSVNUX0NPTU1BTkQ9Rk87d24uTGlzdEl0ZW1Ob2RlPURmO3duLkxpc3ROb2RlPUN2O3duLlJFTU9WRV9MSVNUX0NPTU1BTkQ9V087d24uaW5zZXJ0TGlzdD1mdW5jdGlvbihlLHQpe2UudXBkYXRlKCgpPT57dmFyIG49emUuJGdldFNlbGVjdGlvbigpO2lmKHplLiRpc1JhbmdlU2VsZWN0aW9uKG4pfHx6ZS5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24obikpe3ZhciByPW4uZ2V0Tm9kZXMoKTtuPW4uYW5jaG9yLmdldE5vZGUoKTt2YXIgaT1uLmdldFBhcmVudCgpO2lmKEJFKG4scikpcj1nbih0KSx6ZS4kaXNSb290T3JTaGFkb3dSb290KGkpPyhuLnJlcGxhY2UociksaT16bigpLHplLiRpc0VsZW1lbnROb2RlKG4pJiYoaS5zZXRGb3JtYXQobi5nZXRGb3JtYXRUeXBlKCkpLGkuc2V0SW5kZW50KG4uZ2V0SW5kZW50KCkpKSxyLmFwcGVuZChpKSk6ZnQobikmJihuPW4uZ2V0UGFyZW50T3JUaHJvdygpLFFvKHIsbi5nZXRDaGlsZHJlbigpKSxuLnJlcGxhY2UocikpO2Vsc2UgZm9yKG49bmV3IFNldCxpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBvPXJbaV07aWYoemUuJGlzRWxlbWVudE5vZGUobykmJm8uaXNFbXB0eSgpJiYhbi5oYXMoby5nZXRLZXkoKSkpc3gobyx0KTtlbHNlIGlmKHplLiRpc0xlYWZOb2RlKG8pKWZvcihvPW8uZ2V0UGFyZW50KCk7byE9bnVsbDspe2xldCBzPW8uZ2V0S2V5KCk7aWYoTmUobykpe2lmKCFuLmhhcyhzKSl7dmFyIGw9Z24odCk7UW8obCxvLmdldENoaWxkcmVuKCkpLG8ucmVwbGFjZShsKSxjbihsKSxuLmFkZChzKX1icmVha31lbHNle2lmKGw9by5nZXRQYXJlbnQoKSx6ZS4kaXNSb290T3JTaGFkb3dSb290KGwpJiYhbi5oYXMocykpe24uYWRkKHMpLHN4KG8sdCk7YnJlYWt9bz1sfX19fX0pfTt3bi5yZW1vdmVMaXN0PWZ1bmN0aW9uKGUpe2UudXBkYXRlKCgpPT57bGV0IHQ9emUuJGdldFNlbGVjdGlvbigpO2lmKHplLiRpc1JhbmdlU2VsZWN0aW9uKHQpKXt2YXIgbj1uZXcgU2V0LHI9dC5nZXROb2RlcygpLGk9dC5hbmNob3IuZ2V0Tm9kZSgpO2lmKEJFKGkscikpbi5hZGQoa20oaSkpO2Vsc2UgZm9yKGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIG89cltpXTt6ZS4kaXNMZWFmTm9kZShvKSYmKG89c28uJGdldE5lYXJlc3ROb2RlT2ZUeXBlKG8sRGYpLG8hPW51bGwmJm4uYWRkKGttKG8pKSl9Zm9yKGxldCBsIG9mIG4pe249bCxyPUZFKGwpO2ZvcihsZXQgcyBvZiByKXI9emUuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKSxRbyhyLHMuZ2V0Q2hpbGRyZW4oKSksbi5pbnNlcnRBZnRlcihyKSxuPXIscy5fX2tleT09PXQuYW5jaG9yLmtleSYmdC5hbmNob3Iuc2V0KHIuZ2V0S2V5KCksMCwiZWxlbWVudCIpLHMuX19rZXk9PT10LmZvY3VzLmtleSYmdC5mb2N1cy5zZXQoci5nZXRLZXkoKSwwLCJlbGVtZW50Iikscy5yZW1vdmUoKTtsLnJlbW92ZSgpfX19KX07Y29uc3QgVk89d247dmFyIGppPVZPLEhFPXt9LElmPXt9LEtFPXA7ZnVuY3Rpb24gSE8oZSl7bGV0IHQ9bmV3IFVSTFNlYXJjaFBhcmFtczt0LmFwcGVuZCgiY29kZSIsZSk7Zm9yKGxldCBuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0LmFwcGVuZCgidiIsYXJndW1lbnRzW25dKTt0aHJvdyBFcnJvcihgTWluaWZpZWQgTGV4aWNhbCBlcnJvciAjJHtlfTsgdmlzaXQgaHR0cHM6Ly9sZXhpY2FsLmRldi9kb2NzL2Vycm9yPyR7dH0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLmApfWxldCBaRT1LRS5jcmVhdGVDb250ZXh0KG51bGwpO0lmLkxleGljYWxDb21wb3NlckNvbnRleHQ9WkU7SWYuY3JlYXRlTGV4aWNhbENvbXBvc2VyQ29udGV4dD1mdW5jdGlvbihlLHQpe2xldCBuPW51bGw7cmV0dXJuIGUhPW51bGwmJihuPWVbMV0pLHtnZXRUaGVtZTpmdW5jdGlvbigpe3JldHVybiB0Pz8obiE9bnVsbD9uLmdldFRoZW1lKCk6bnVsbCl9fX07SWYudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dD1mdW5jdGlvbigpe2xldCBlPUtFLnVzZUNvbnRleHQoWkUpO3JldHVybiBlPT1udWxsJiZITyg4KSxlfTtjb25zdCBLTz1JZjt2YXIgVHI9S08saHg9VHIsY2E9d2UsamQ9cDtsZXQgR0U9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiO3ZhciBaTz1HRT9qZC51c2VMYXlvdXRFZmZlY3Q6amQudXNlRWZmZWN0O2xldCB2Yz17dGFnOiJoaXN0b3J5LW1lcmdlIn07ZnVuY3Rpb24gR08oZSx0KXtpZih0IT09bnVsbCl7aWYodD09PXZvaWQgMCllLnVwZGF0ZSgoKT0+e3ZhciBuPWNhLiRnZXRSb290KCk7aWYobi5pc0VtcHR5KCkpe2xldCByPWNhLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk7bi5hcHBlbmQociksbj1HRT9kb2N1bWVudC5hY3RpdmVFbGVtZW50Om51bGwsKGNhLiRnZXRTZWxlY3Rpb24oKSE9PW51bGx8fG4hPT1udWxsJiZuPT09ZS5nZXRSb290RWxlbWVudCgpKSYmci5zZWxlY3QoKX19LHZjKTtlbHNlIGlmKHQhPT1udWxsKXN3aXRjaCh0eXBlb2YgdCl7Y2FzZSJzdHJpbmciOmxldCBuPWUucGFyc2VFZGl0b3JTdGF0ZSh0KTtlLnNldEVkaXRvclN0YXRlKG4sdmMpO2JyZWFrO2Nhc2Uib2JqZWN0IjplLnNldEVkaXRvclN0YXRlKHQsdmMpO2JyZWFrO2Nhc2UiZnVuY3Rpb24iOmUudXBkYXRlKCgpPT57Y2EuJGdldFJvb3QoKS5pc0VtcHR5KCkmJnQoZSl9LHZjKX19fUhFLkxleGljYWxDb21wb3Nlcj1mdW5jdGlvbih7aW5pdGlhbENvbmZpZzplLGNoaWxkcmVuOnR9KXtsZXQgbj1qZC51c2VNZW1vKCgpPT57Y29uc3R7dGhlbWU6cixuYW1lc3BhY2U6aSxlZGl0b3JfX0RFUFJFQ0FURUQ6byxub2RlczpsLG9uRXJyb3I6cyxlZGl0b3JTdGF0ZTphfT1lLHU9aHguY3JlYXRlTGV4aWNhbENvbXBvc2VyQ29udGV4dChudWxsLHIpO2xldCBjPW98fG51bGw7aWYoYz09PW51bGwpe2NvbnN0IGQ9Y2EuY3JlYXRlRWRpdG9yKHtlZGl0YWJsZTplLmVkaXRhYmxlLG5hbWVzcGFjZTppLG5vZGVzOmwsb25FcnJvcjpmPT5zKGYsZCksdGhlbWU6cn0pO0dPKGQsYSksYz1kfXJldHVybltjLHVdfSxbXSk7cmV0dXJuIFpPKCgpPT57bGV0IHI9ZS5lZGl0YWJsZSxbaV09bjtpLnNldEVkaXRhYmxlKHIhPT12b2lkIDA/cjohMCl9LFtdKSxqZC5jcmVhdGVFbGVtZW50KGh4LkxleGljYWxDb21wb3NlckNvbnRleHQuUHJvdmlkZXIse3ZhbHVlOm59LHQpfTtjb25zdCBZTz1IRTt2YXIgWE89WU8sTmE9cDtmdW5jdGlvbiAkbShlLHQpe3JldHVybiAkbT1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihuLHIpe3JldHVybiBuLl9fcHJvdG9fXz1yLG59LCRtKGUsdCl9ZnVuY3Rpb24gUU8oZSx0KXtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLCRtKGUsdCl9ZnVuY3Rpb24gSk8oZSx0KXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9W10pLHQ9PT12b2lkIDAmJih0PVtdKSxlLmxlbmd0aCE9PXQubGVuZ3RofHxlLnNvbWUoZnVuY3Rpb24obixyKXtyZXR1cm4hT2JqZWN0LmlzKG4sdFtyXSl9KX12YXIgcHg9e2Vycm9yOm51bGx9LHFPPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtmb3IodmFyIHIsaT1hcmd1bWVudHMubGVuZ3RoLG89QXJyYXkoaSksbD0wO2w8aTtsKyspb1tsXT1hcmd1bWVudHNbbF07cmV0dXJuIHI9ZS5jYWxsLmFwcGx5KGUsW3RoaXNdLmNvbmNhdChvKSl8fHRoaXMsci5zdGF0ZT1weCxyLnJlc2V0RXJyb3JCb3VuZGFyeT1mdW5jdGlvbigpe2Zvcih2YXIgcyxhPWFyZ3VtZW50cy5sZW5ndGgsdT1BcnJheShhKSxjPTA7YzxhO2MrKyl1W2NdPWFyZ3VtZW50c1tjXTtyLnByb3BzLm9uUmVzZXQ9PW51bGx8fChzPXIucHJvcHMpLm9uUmVzZXQuYXBwbHkocyx1KSxyLnJlc2V0KCl9LHJ9UU8odCxlKSx0LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj1mdW5jdGlvbihyKXtyZXR1cm57ZXJyb3I6cn19O3ZhciBuPXQucHJvdG90eXBlO3JldHVybiBuLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5zZXRTdGF0ZShweCl9LG4uY29tcG9uZW50RGlkQ2F0Y2g9ZnVuY3Rpb24ocixpKXt2YXIgbyxsOyhvPShsPXRoaXMucHJvcHMpLm9uRXJyb3IpPT1udWxsfHxvLmNhbGwobCxyLGkpfSxuLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbihyLGkpe3ZhciBvPXRoaXMucHJvcHMucmVzZXRLZXlzO2lmKHRoaXMuc3RhdGUuZXJyb3IhPT1udWxsJiZpLmVycm9yIT09bnVsbCYmSk8oci5yZXNldEtleXMsbykpe3ZhciBsLHM7KGw9KHM9dGhpcy5wcm9wcykub25SZXNldEtleXNDaGFuZ2UpPT1udWxsfHxsLmNhbGwocyxyLnJlc2V0S2V5cyxvKSx0aGlzLnJlc2V0KCl9fSxuLnJlbmRlcj1mdW5jdGlvbigpe3ZhciByPXRoaXMuc3RhdGUuZXJyb3IsaT10aGlzLnByb3BzLG89aS5mYWxsYmFja1JlbmRlcixsPWkuRmFsbGJhY2tDb21wb25lbnQ7aWYoaT1pLmZhbGxiYWNrLHIhPT1udWxsKXtpZihyPXtlcnJvcjpyLHJlc2V0RXJyb3JCb3VuZGFyeTp0aGlzLnJlc2V0RXJyb3JCb3VuZGFyeX0sTmEuaXNWYWxpZEVsZW1lbnQoaSkpcmV0dXJuIGk7aWYodHlwZW9mIG89PSJmdW5jdGlvbiIpcmV0dXJuIG8ocik7aWYobClyZXR1cm4gTmEuY3JlYXRlRWxlbWVudChsLHIpO3Rocm93IEVycm9yKCJyZWFjdC1lcnJvci1ib3VuZGFyeSByZXF1aXJlcyBlaXRoZXIgYSBmYWxsYmFjaywgZmFsbGJhY2tSZW5kZXIsIG9yIEZhbGxiYWNrQ29tcG9uZW50IHByb3AiKX1yZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbn0sdH0oTmEuQ29tcG9uZW50KSxlUD1mdW5jdGlvbih7Y2hpbGRyZW46ZSxvbkVycm9yOnR9KXtyZXR1cm4gTmEuY3JlYXRlRWxlbWVudChxTyx7ZmFsbGJhY2s6TmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7c3R5bGU6e2JvcmRlcjoiMXB4IHNvbGlkICNmMDAiLGNvbG9yOiIjZjAwIixwYWRkaW5nOiI4cHgifX0sIkFuIGVycm9yIHdhcyB0aHJvd24uIiksb25FcnJvcjp0fSxlKX07Y29uc3QgdFA9ZVA7dmFyIG5QPXRQO2NvbnN0IHJQPSR1KG5QKTt2YXIga3Y9e30sJHY9e30saVA9RnQsWWU9d2U7ZnVuY3Rpb24gb1AoZSx0LG4scixpKXtpZihlPT09bnVsbHx8bi5zaXplPT09MCYmci5zaXplPT09MCYmIWkpcmV0dXJuIDA7dmFyIG89dC5fc2VsZWN0aW9uLGw9ZS5fc2VsZWN0aW9uO2lmKGkpcmV0dXJuIDE7aWYoIShZZS4kaXNSYW5nZVNlbGVjdGlvbihvKSYmWWUuJGlzUmFuZ2VTZWxlY3Rpb24obCkmJmwuaXNDb2xsYXBzZWQoKSYmby5pc0NvbGxhcHNlZCgpKSlyZXR1cm4gMDtpPXQuX25vZGVNYXA7bGV0IHM9W107Zm9yKGxldCBhIG9mIG4pbj1pLmdldChhKSxuIT09dm9pZCAwJiZzLnB1c2gobik7Zm9yKGxldFthLHVdb2Ygcil1JiYocj1pLmdldChhKSxyPT09dm9pZCAwfHxZZS4kaXNSb290Tm9kZShyKXx8cy5wdXNoKHIpKTtyZXR1cm4gcy5sZW5ndGg9PT0wPzA6MTxzLmxlbmd0aD8ocj10Ll9ub2RlTWFwLHQ9ci5nZXQoby5hbmNob3Iua2V5KSxsPXIuZ2V0KGwuYW5jaG9yLmtleSksdCYmbCYmIWUuX25vZGVNYXAuaGFzKHQuX19rZXkpJiZZZS4kaXNUZXh0Tm9kZSh0KSYmdC5fX3RleHQubGVuZ3RoPT09MSYmby5hbmNob3Iub2Zmc2V0PT09MT8yOjApOih0PXNbMF0sZT1lLl9ub2RlTWFwLmdldCh0Ll9fa2V5KSwhWWUuJGlzVGV4dE5vZGUoZSl8fCFZZS4kaXNUZXh0Tm9kZSh0KXx8ZS5fX21vZGUhPT10Ll9fbW9kZXx8KGU9ZS5fX3RleHQsdD10Ll9fdGV4dCxlPT09dCl8fChvPW8uYW5jaG9yLGw9bC5hbmNob3Isby5rZXkhPT1sLmtleXx8by50eXBlIT09InRleHQiKT8wOihvPW8ub2Zmc2V0LGw9bC5vZmZzZXQsZT10Lmxlbmd0aC1lLmxlbmd0aCxlPT09MSYmbD09PW8tMT8yOmU9PT0tMSYmbD09PW8rMT8zOmU9PT0tMSYmbD09PW8/NDowKSl9ZnVuY3Rpb24gbFAoZSx0KXtsZXQgbj1EYXRlLm5vdygpLHI9MDtyZXR1cm4oaSxvLGwscyxhLHUpPT57bGV0IGM9RGF0ZS5ub3coKTtpZih1LmhhcygiaGlzdG9yaWMiKSlyZXR1cm4gcj0wLG49YywyO2xldCBkPW9QKGksbyxzLGEsZS5pc0NvbXBvc2luZygpKSxmPSgoKT0+e3ZhciBoPWw9PT1udWxsfHxsLmVkaXRvcj09PWUsbT11LmhhcygiaGlzdG9yeS1wdXNoIik7aWYoIW0mJmgmJnUuaGFzKCJoaXN0b3J5LW1lcmdlIikpcmV0dXJuIDA7aWYoaT09PW51bGwpcmV0dXJuIDE7dmFyIGc9by5fc2VsZWN0aW9uO2lmKCEoMDxzLnNpemV8fDA8YS5zaXplKSlyZXR1cm4gZyE9PW51bGw/MDoyO2lmKG09PT0hMSYmZCE9PTAmJmQ9PT1yJiZjPG4rdCYmaClyZXR1cm4gMDtpZihzLnNpemU9PT0xKXt7bT1BcnJheS5mcm9tKHMpWzBdLGg9aS5fbm9kZU1hcC5nZXQobSksbT1vLl9ub2RlTWFwLmdldChtKSxnPWkuX3NlbGVjdGlvbjtsZXQgUz1vLl9zZWxlY3Rpb24sdj0hMTtZZS4kaXNSYW5nZVNlbGVjdGlvbihnKSYmWWUuJGlzUmFuZ2VTZWxlY3Rpb24oUykmJih2PWcuYW5jaG9yLnR5cGU9PT0iZWxlbWVudCImJmcuZm9jdXMudHlwZT09PSJlbGVtZW50IiYmUy5hbmNob3IudHlwZT09PSJ0ZXh0IiYmUy5mb2N1cy50eXBlPT09InRleHQiKSxoPSF2JiZZZS4kaXNUZXh0Tm9kZShoKSYmWWUuJGlzVGV4dE5vZGUobSk/aC5fX3R5cGU9PT1tLl9fdHlwZSYmaC5fX3RleHQ9PT1tLl9fdGV4dCYmaC5fX21vZGU9PT1tLl9fbW9kZSYmaC5fX2RldGFpbD09PW0uX19kZXRhaWwmJmguX19zdHlsZT09PW0uX19zdHlsZSYmaC5fX2Zvcm1hdD09PW0uX19mb3JtYXQmJmguX19wYXJlbnQ9PT1tLl9fcGFyZW50OiExfWlmKGgpcmV0dXJuIDB9cmV0dXJuIDF9KSgpO3JldHVybiBuPWMscj1kLGZ9fSR2LmNyZWF0ZUVtcHR5SGlzdG9yeVN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bnVsbCxyZWRvU3RhY2s6W10sdW5kb1N0YWNrOltdfX07JHYucmVnaXN0ZXJIaXN0b3J5PWZ1bmN0aW9uKGUsdCxuKXtsZXQgcj1sUChlLG4pO249KHtlZGl0b3JTdGF0ZTpsLHByZXZFZGl0b3JTdGF0ZTpzLGRpcnR5TGVhdmVzOmEsZGlydHlFbGVtZW50czp1LHRhZ3M6Y30pPT57Y29uc3QgZD10LmN1cnJlbnQsZj10LnJlZG9TdGFjayxoPXQudW5kb1N0YWNrLG09ZD09PW51bGw/bnVsbDpkLmVkaXRvclN0YXRlO2lmKGQ9PT1udWxsfHxsIT09bSl7aWYocz1yKHMsbCxkLGEsdSxjKSxzPT09MSlmLmxlbmd0aCE9PTAmJih0LnJlZG9TdGFjaz1bXSxlLmRpc3BhdGNoQ29tbWFuZChZZS5DQU5fUkVET19DT01NQU5ELCExKSksZCE9PW51bGwmJihoLnB1c2goey4uLmR9KSxlLmRpc3BhdGNoQ29tbWFuZChZZS5DQU5fVU5ET19DT01NQU5ELCEwKSk7ZWxzZSBpZihzPT09MilyZXR1cm47dC5jdXJyZW50PXtlZGl0b3I6ZSxlZGl0b3JTdGF0ZTpsfX19O2xldCBpPWlQLm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlckNvbW1hbmQoWWUuVU5ET19DT01NQU5ELCgpPT57bGV0IGw9dC5yZWRvU3RhY2sscz10LnVuZG9TdGFjaztpZihzLmxlbmd0aCE9PTApe2xldCBhPXQuY3VycmVudCx1PXMucG9wKCk7YSE9PW51bGwmJihsLnB1c2goYSksZS5kaXNwYXRjaENvbW1hbmQoWWUuQ0FOX1JFRE9fQ09NTUFORCwhMCkpLHMubGVuZ3RoPT09MCYmZS5kaXNwYXRjaENvbW1hbmQoWWUuQ0FOX1VORE9fQ09NTUFORCwhMSksdC5jdXJyZW50PXV8fG51bGwsdSYmdS5lZGl0b3Iuc2V0RWRpdG9yU3RhdGUodS5lZGl0b3JTdGF0ZSx7dGFnOiJoaXN0b3JpYyJ9KX1yZXR1cm4hMH0sWWUuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKFllLlJFRE9fQ09NTUFORCwoKT0+e2xldCBsPXQucmVkb1N0YWNrO3ZhciBzPXQudW5kb1N0YWNrO2lmKGwubGVuZ3RoIT09MCl7bGV0IGE9dC5jdXJyZW50O2EhPT1udWxsJiYocy5wdXNoKGEpLGUuZGlzcGF0Y2hDb21tYW5kKFllLkNBTl9VTkRPX0NPTU1BTkQsITApKSxzPWwucG9wKCksbC5sZW5ndGg9PT0wJiZlLmRpc3BhdGNoQ29tbWFuZChZZS5DQU5fUkVET19DT01NQU5ELCExKSx0LmN1cnJlbnQ9c3x8bnVsbCxzJiZzLmVkaXRvci5zZXRFZGl0b3JTdGF0ZShzLmVkaXRvclN0YXRlLHt0YWc6Imhpc3RvcmljIn0pfXJldHVybiEwfSxZZS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoWWUuQ0xFQVJfRURJVE9SX0NPTU1BTkQsKCk9Pih0LnVuZG9TdGFjaz1bXSx0LnJlZG9TdGFjaz1bXSx0LmN1cnJlbnQ9bnVsbCwhMSksWWUuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKFllLkNMRUFSX0hJU1RPUllfQ09NTUFORCwoKT0+KHQudW5kb1N0YWNrPVtdLHQucmVkb1N0YWNrPVtdLHQuY3VycmVudD1udWxsLGUuZGlzcGF0Y2hDb21tYW5kKFllLkNBTl9SRURPX0NPTU1BTkQsITEpLGUuZGlzcGF0Y2hDb21tYW5kKFllLkNBTl9VTkRPX0NPTU1BTkQsITEpLCEwKSxZZS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlclVwZGF0ZUxpc3RlbmVyKG4pKSxvPWUucmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcihuKTtyZXR1cm4oKT0+e2koKSxvKCl9fTtjb25zdCBzUD0kdjt2YXIgYVA9c1AsdVA9VHIsYm09YVAsbXg9cDtmdW5jdGlvbiBjUChlLHQsbj0xZTMpe2xldCByPW14LnVzZU1lbW8oKCk9PnR8fGJtLmNyZWF0ZUVtcHR5SGlzdG9yeVN0YXRlKCksW3RdKTtteC51c2VFZmZlY3QoKCk9PmJtLnJlZ2lzdGVySGlzdG9yeShlLHIsbiksW24sZSxyXSl9a3YuY3JlYXRlRW1wdHlIaXN0b3J5U3RhdGU9Ym0uY3JlYXRlRW1wdHlIaXN0b3J5U3RhdGU7a3YuSGlzdG9yeVBsdWdpbj1mdW5jdGlvbih7ZXh0ZXJuYWxIaXN0b3J5U3RhdGU6ZX0pe2xldFt0XT11UC51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7cmV0dXJuIGNQKHQsZSksbnVsbH07Y29uc3QgZFA9a3Y7dmFyIGZQPWRQLFlFPXt9LGhQPVRyLFJhPXAscFA9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiP1JhLnVzZUxheW91dEVmZmVjdDpSYS51c2VFZmZlY3Q7ZnVuY3Rpb24gbVAoZSl7bGV0W3RdPWhQLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKSxuPVJhLnVzZU1lbW8oKCk9PmUodCksW3QsZV0pLHI9UmEudXNlUmVmKG4uaW5pdGlhbFZhbHVlRm4oKSksW2ksb109UmEudXNlU3RhdGUoci5jdXJyZW50KTtyZXR1cm4gcFAoKCk9PntsZXR7aW5pdGlhbFZhbHVlRm46bCxzdWJzY3JpYmU6c309bixhPWwoKTtyZXR1cm4gci5jdXJyZW50IT09YSYmKHIuY3VycmVudD1hLG8oYSkpLHModT0+e3IuY3VycmVudD11LG8odSl9KX0sW24sZV0pLGl9ZnVuY3Rpb24gZ1AoZSl7cmV0dXJue2luaXRpYWxWYWx1ZUZuOigpPT5lLmlzRWRpdGFibGUoKSxzdWJzY3JpYmU6dD0+ZS5yZWdpc3RlckVkaXRhYmxlTGlzdGVuZXIodCl9fXZhciB2UD1mdW5jdGlvbigpe3JldHVybiBtUChnUCl9O2NvbnN0IHlQPXZQO3ZhciB4UD15UCx3bz17fSxkbj13ZTtmdW5jdGlvbiBidihlLHQ9ITApe3JldHVybiBlPyExOihlPVhFKCksdCYmKGU9ZS50cmltKCkpLGU9PT0iIil9ZnVuY3Rpb24gWEUoKXtyZXR1cm4gZG4uJGdldFJvb3QoKS5nZXRUZXh0Q29udGVudCgpfWZ1bmN0aW9uIFFFKGUpe2lmKCFidihlLCExKSlyZXR1cm4hMTtlPWRuLiRnZXRSb290KCkuZ2V0Q2hpbGRyZW4oKTtsZXQgdD1lLmxlbmd0aDtpZigxPHQpcmV0dXJuITE7Zm9yKGxldCByPTA7cjx0O3IrKyl7dmFyIG49ZVtyXTtpZihkbi4kaXNEZWNvcmF0b3JOb2RlKG4pKXJldHVybiExO2lmKGRuLiRpc0VsZW1lbnROb2RlKG4pKXtpZighZG4uJGlzUGFyYWdyYXBoTm9kZShuKXx8bi5fX2luZGVudCE9PTApcmV0dXJuITE7bj1uLmdldENoaWxkcmVuKCk7bGV0IGk9bi5sZW5ndGg7Zm9yKGxldCBvPTA7bzxpO28rKylpZighZG4uJGlzVGV4dE5vZGUobltyXSkpcmV0dXJuITF9fXJldHVybiEwfXdvLiRjYW5TaG93UGxhY2Vob2xkZXI9UUU7d28uJGNhblNob3dQbGFjZWhvbGRlckN1cnJ5PWZ1bmN0aW9uKGUpe3JldHVybigpPT5RRShlKX07d28uJGZpbmRUZXh0SW50ZXJzZWN0aW9uRnJvbUNoYXJhY3RlcnM9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmdldEZpcnN0Q2hpbGQoKTtlPTA7ZTpmb3IoO24hPT1udWxsOyl7aWYoZG4uJGlzRWxlbWVudE5vZGUobikpe3ZhciByPW4uZ2V0Rmlyc3RDaGlsZCgpO2lmKHIhPT1udWxsKXtuPXI7Y29udGludWV9fWVsc2UgaWYoZG4uJGlzVGV4dE5vZGUobikpe2lmKHI9bi5nZXRUZXh0Q29udGVudFNpemUoKSxlK3I+dClyZXR1cm57bm9kZTpuLG9mZnNldDp0LWV9O2UrPXJ9aWYocj1uLmdldE5leHRTaWJsaW5nKCksciE9PW51bGwpbj1yO2Vsc2V7Zm9yKG49bi5nZXRQYXJlbnQoKTtuIT09bnVsbDspe2lmKHI9bi5nZXROZXh0U2libGluZygpLHIhPT1udWxsKXtuPXI7Y29udGludWUgZX1uPW4uZ2V0UGFyZW50KCl9YnJlYWt9fXJldHVybiBudWxsfTt3by4kaXNSb290VGV4dENvbnRlbnRFbXB0eT1idjt3by4kaXNSb290VGV4dENvbnRlbnRFbXB0eUN1cnJ5PWZ1bmN0aW9uKGUsdCl7cmV0dXJuKCk9PmJ2KGUsdCl9O3dvLiRyb290VGV4dENvbnRlbnQ9WEU7d28ucmVnaXN0ZXJMZXhpY2FsVGV4dEVudGl0eT1mdW5jdGlvbihlLHQsbixyKXtsZXQgaT1sPT57Y29uc3Qgcz1kbi4kY3JlYXRlVGV4dE5vZGUobC5nZXRUZXh0Q29udGVudCgpKTtzLnNldEZvcm1hdChsLmdldEZvcm1hdCgpKSxsLnJlcGxhY2Uocyl9LG89ZS5yZWdpc3Rlck5vZGVUcmFuc2Zvcm0oZG4uVGV4dE5vZGUsbD0+e2lmKGwuaXNTaW1wbGVUZXh0KCkpe3ZhciBzPWwuZ2V0UHJldmlvdXNTaWJsaW5nKCksYT1sLmdldFRleHRDb250ZW50KCksdT1sO2lmKGRuLiRpc1RleHROb2RlKHMpKXt2YXIgYz1zLmdldFRleHRDb250ZW50KCksZD10KGMrYSk7aWYocyBpbnN0YW5jZW9mIG4pe2lmKGQ9PT1udWxsfHxzLmdldExhdGVzdCgpLl9fbW9kZSE9PTApe2kocyk7cmV0dXJufWlmKGQ9ZC5lbmQtYy5sZW5ndGgsMDxkKXt1PWEuc2xpY2UoMCxkKSx1PWMrdSxzLnNlbGVjdCgpLHMuc2V0VGV4dENvbnRlbnQodSksZD09PWEubGVuZ3RoP2wucmVtb3ZlKCk6KHM9YS5zbGljZShkKSxsLnNldFRleHRDb250ZW50KHMpKTtyZXR1cm59fWVsc2UgaWYoZD09PW51bGx8fGQuc3RhcnQ8Yy5sZW5ndGgpcmV0dXJufWZvcig7Oyl7aWYobD10KGEpLGE9ZD1sPT09bnVsbD8iIjphLnNsaWNlKGwuZW5kKSxkPT09IiIpe2lmKGM9dS5nZXROZXh0U2libGluZygpLGRuLiRpc1RleHROb2RlKGMpKXtpZihkPXUuZ2V0VGV4dENvbnRlbnQoKStjLmdldFRleHRDb250ZW50KCksZD10KGQpLGQ9PT1udWxsKXtjIGluc3RhbmNlb2Ygbj9pKGMpOmMubWFya0RpcnR5KCk7YnJlYWt9ZWxzZSBpZihkLnN0YXJ0IT09MClicmVha319ZWxzZSBpZihjPXQoZCksYyE9PW51bGwmJmMuc3RhcnQ9PT0wKWJyZWFrO2lmKGw9PT1udWxsKWJyZWFrO2lmKGwuc3RhcnQ9PT0wJiZkbi4kaXNUZXh0Tm9kZShzKSYmcy5pc1RleHRFbnRpdHkoKSljb250aW51ZTtsZXQgZjtpZihsLnN0YXJ0PT09MD9bZix1XT11LnNwbGl0VGV4dChsLmVuZCk6WyxmLHVdPXUuc3BsaXRUZXh0KGwuc3RhcnQsbC5lbmQpLGw9cihmKSxsLnNldEZvcm1hdChmLmdldEZvcm1hdCgpKSxmLnJlcGxhY2UobCksdT09bnVsbClicmVha319fSk7cmV0dXJuIGU9ZS5yZWdpc3Rlck5vZGVUcmFuc2Zvcm0obixsPT57dmFyIHM9bC5nZXRUZXh0Q29udGVudCgpO2NvbnN0IGE9dChzKTthPT09bnVsbHx8YS5zdGFydCE9PTA/aShsKTpzLmxlbmd0aD5hLmVuZD9sLnNwbGl0VGV4dChhLmVuZCk6KHM9bC5nZXRQcmV2aW91c1NpYmxpbmcoKSxkbi4kaXNUZXh0Tm9kZShzKSYmcy5pc1RleHRFbnRpdHkoKSYmKGkocyksaShsKSkscz1sLmdldE5leHRTaWJsaW5nKCksZG4uJGlzVGV4dE5vZGUocykmJnMuaXNUZXh0RW50aXR5KCkmJihpKHMpLGwgaW5zdGFuY2VvZiBuJiZpKGwpKSl9KSxbbyxlXX07Y29uc3QgX1A9d287dmFyIHdQPV9QLEpFPXt9LHljPXdlO0pFLnJlZ2lzdGVyRHJhZ29uU3VwcG9ydD1mdW5jdGlvbihlKXtsZXQgdD13aW5kb3cubG9jYXRpb24ub3JpZ2luLG49cj0+e2lmKHIub3JpZ2luPT09dCl7dmFyIGk9ZS5nZXRSb290RWxlbWVudCgpO2lmKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1pJiYoaT1yLmRhdGEsdHlwZW9mIGk9PSJzdHJpbmciKSl7dHJ5e3ZhciBvPUpTT04ucGFyc2UoaSl9Y2F0Y2h7cmV0dXJufWlmKG8mJm8ucHJvdG9jb2w9PT0ibnVhbnJpYV9tZXNzYWdpbmciJiZvLnR5cGU9PT0icmVxdWVzdCImJihvPW8ucGF5bG9hZCkmJm8uZnVuY3Rpb25JZD09PSJtYWtlQ2hhbmdlcyImJihvPW8uYXJncykpe2NvbnN0W2wscyxhLHUsY109bztlLnVwZGF0ZSgoKT0+e2NvbnN0IGQ9eWMuJGdldFNlbGVjdGlvbigpO2lmKHljLiRpc1JhbmdlU2VsZWN0aW9uKGQpKXt2YXIgZj1kLmFuY2hvcjtsZXQgaD1mLmdldE5vZGUoKSxtPTAsZz0wO3ljLiRpc1RleHROb2RlKGgpJiYwPD1sJiYwPD1zJiYobT1sLGc9bCtzLGQuc2V0VGV4dE5vZGVSYW5nZShoLG0saCxnKSksKG0hPT1nfHxhIT09IiIpJiYoZC5pbnNlcnRSYXdUZXh0KGEpLGg9Zi5nZXROb2RlKCkpLHljLiRpc1RleHROb2RlKGgpJiYobT11LGc9dStjLGY9aC5nZXRUZXh0Q29udGVudFNpemUoKSxtPW0+Zj9mOm0sZz1nPmY/ZjpnLGQuc2V0VGV4dE5vZGVSYW5nZShoLG0saCxnKSksci5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX19KX19fX07cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixuLCEwKSwoKT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixuLCEwKX19O2NvbnN0IFNQPUpFO3ZhciBFUD1TUCxKcj17fSxTaT17fSxUdj17fSxneD1sbyxDUD1GdCx6bD13ZTtmdW5jdGlvbiBxRShlLHQsbixyPW51bGwpe2xldCBpPXIhPW51bGw/dC5pc1NlbGVjdGVkKHIpOiEwLG89emwuJGlzRWxlbWVudE5vZGUodCkmJnQuZXhjbHVkZUZyb21Db3B5KCJodG1sIik7dmFyIGw9dDtyIT09bnVsbCYmKGw9Z3guJGNsb25lV2l0aFByb3BlcnRpZXModCksbD16bC4kaXNUZXh0Tm9kZShsKSYmciE9bnVsbD9neC4kc2xpY2VTZWxlY3RlZFRleHROb2RlQ29udGVudChyLGwpOmwpO2xldCBzPXpsLiRpc0VsZW1lbnROb2RlKGwpP2wuZ2V0Q2hpbGRyZW4oKTpbXSx7ZWxlbWVudDphLGFmdGVyOnV9PWwuZXhwb3J0RE9NKGUpO2lmKCFhKXJldHVybiExO2xldCBjPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtmb3IobGV0IGQ9MDtkPHMubGVuZ3RoO2QrKyl7bGV0IGY9c1tkXSxoPXFFKGUsZixjLHIpOyFpJiZ6bC4kaXNFbGVtZW50Tm9kZSh0KSYmaCYmdC5leHRyYWN0V2l0aENoaWxkKGYsciwiaHRtbCIpJiYoaT0hMCl9cmV0dXJuIGkmJiFvPyhDUC5pc0hUTUxFbGVtZW50KGEpJiZhLmFwcGVuZChjKSxuLmFwcGVuZChhKSx1JiYoZT11LmNhbGwobCxhKSkmJmEucmVwbGFjZVdpdGgoZSkpOm4uYXBwZW5kKGMpLGl9bGV0IGVDPW5ldyBTZXQoWyJTVFlMRSIsIlNDUklQVCJdKTtmdW5jdGlvbiB0QyhlLHQsbj1uZXcgTWFwLHIpe2xldCBpPVtdO2lmKGVDLmhhcyhlLm5vZGVOYW1lKSlyZXR1cm4gaTtsZXQgbz1udWxsO3ZhciBsLHtub2RlTmFtZTpzfT1lLGE9dC5faHRtbENvbnZlcnNpb25zLmdldChzLnRvTG93ZXJDYXNlKCkpO2lmKHM9bnVsbCxhIT09dm9pZCAwKWZvcihsIG9mIGEpYT1sKGUpLGEhPT1udWxsJiYocz09PW51bGx8fHMucHJpb3JpdHk8YS5wcmlvcml0eSkmJihzPWEpO2lmKHM9KGw9cyE9PW51bGw/cy5jb252ZXJzaW9uOm51bGwpP2woZSk6bnVsbCxsPW51bGwscyE9PW51bGwpe2lmKGw9cy5hZnRlcixhPXMubm9kZSxvPUFycmF5LmlzQXJyYXkoYSk/YVthLmxlbmd0aC0xXTphLG8hPT1udWxsKXtmb3IodmFyWyx1XW9mIG4paWYobz11KG8sciksIW8pYnJlYWs7byYmaS5wdXNoKC4uLkFycmF5LmlzQXJyYXkoYSk/YTpbb10pfXMuZm9yQ2hpbGQhPW51bGwmJm4uc2V0KGUubm9kZU5hbWUscy5mb3JDaGlsZCl9Zm9yKGU9ZS5jaGlsZE5vZGVzLHI9W10sdT0wO3U8ZS5sZW5ndGg7dSsrKXIucHVzaCguLi50QyhlW3VdLHQsbmV3IE1hcChuKSxvKSk7cmV0dXJuIGwhPW51bGwmJihyPWwocikpLG89PW51bGw/aT1pLmNvbmNhdChyKTp6bC4kaXNFbGVtZW50Tm9kZShvKSYmby5hcHBlbmQoLi4uciksaX1Udi4kZ2VuZXJhdGVIdG1sRnJvbU5vZGVzPWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIGRvY3VtZW50PiJ1Inx8dHlwZW9mIHdpbmRvdz4idSIpdGhyb3cgRXJyb3IoIlRvIHVzZSAkZ2VuZXJhdGVIdG1sRnJvbU5vZGVzIGluIGhlYWRsZXNzIG1vZGUgcGxlYXNlIGluaXRpYWxpemUgYSBoZWFkbGVzcyBicm93c2VyIGltcGxlbWVudGF0aW9uIHN1Y2ggYXMgSlNEb20gYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4iKTtsZXQgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxyPXpsLiRnZXRSb290KCkuZ2V0Q2hpbGRyZW4oKTtmb3IobGV0IGk9MDtpPHIubGVuZ3RoO2krKylxRShlLHJbaV0sbix0KTtyZXR1cm4gbi5pbm5lckhUTUx9O1R2LiRnZW5lcmF0ZU5vZGVzRnJvbURPTT1mdW5jdGlvbihlLHQpe3Q9dC5ib2R5P3QuYm9keS5jaGlsZE5vZGVzOltdO2xldCBuPVtdO2ZvcihsZXQgaT0wO2k8dC5sZW5ndGg7aSsrKXt2YXIgcj10W2ldO2VDLmhhcyhyLm5vZGVOYW1lKXx8KHI9dEMocixlKSxyIT09bnVsbCYmKG49bi5jb25jYXQocikpKX1yZXR1cm4gbn07Y29uc3Qga1A9VHY7dmFyICRQPWtQLG5DPSRQLFRtPWxvLFhsPUZ0LHBlPXdlO2Z1bmN0aW9uIGxpKGUpe2xldCB0PW5ldyBVUkxTZWFyY2hQYXJhbXM7dC5hcHBlbmQoImNvZGUiLGUpO2ZvcihsZXQgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdC5hcHBlbmQoInYiLGFyZ3VtZW50c1tuXSk7dGhyb3cgRXJyb3IoYE1pbmlmaWVkIExleGljYWwgZXJyb3IgIyR7ZX07IHZpc2l0IGh0dHBzOi8vbGV4aWNhbC5kZXYvZG9jcy9lcnJvcj8ke3R9IGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy5gKX1sZXQgckM9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiO2Z1bmN0aW9uIGlDKGUpe2xldCB0PXBlLiRnZXRTZWxlY3Rpb24oKTtpZih0PT1udWxsKXRocm93IEVycm9yKCJFeHBlY3RlZCB2YWxpZCBMZXhpY2FsU2VsZWN0aW9uIik7cmV0dXJuIHBlLiRpc1JhbmdlU2VsZWN0aW9uKHQpJiZ0LmlzQ29sbGFwc2VkKCl8fHQuZ2V0Tm9kZXMoKS5sZW5ndGg9PT0wPyIiOm5DLiRnZW5lcmF0ZUh0bWxGcm9tTm9kZXMoZSx0KX1mdW5jdGlvbiBvQyhlKXtsZXQgdD1wZS4kZ2V0U2VsZWN0aW9uKCk7aWYodD09bnVsbCl0aHJvdyBFcnJvcigiRXhwZWN0ZWQgdmFsaWQgTGV4aWNhbFNlbGVjdGlvbiIpO3JldHVybiBwZS4kaXNSYW5nZVNlbGVjdGlvbih0KSYmdC5pc0NvbGxhcHNlZCgpfHx0LmdldE5vZGVzKCkubGVuZ3RoPT09MD9udWxsOkpTT04uc3RyaW5naWZ5KHNDKGUsdCkpfWZ1bmN0aW9uIE5tKGUsdCxuKXsocGUuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKG4pfHxYbC4kZmluZE1hdGNoaW5nUGFyZW50KG4uYW5jaG9yLmdldE5vZGUoKSxyPT5wZS5ERVBSRUNBVEVEXyRpc0dyaWRDZWxsTm9kZShyKSkhPT1udWxsJiZYbC4kZmluZE1hdGNoaW5nUGFyZW50KG4uZm9jdXMuZ2V0Tm9kZSgpLHI9PnBlLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKHIpKSE9PW51bGwpJiZ0Lmxlbmd0aD09PTEmJnBlLkRFUFJFQ0FURURfJGlzR3JpZE5vZGUodFswXSk/VFAodCxuLCExLGUpOmJQKHQsbil9ZnVuY3Rpb24gYlAoZSx0KXtsZXQgbj1bXSxyPW51bGw7Zm9yKGxldCBpPTA7aTxlLmxlbmd0aDtpKyspe2xldCBvPWVbaV0sbD1wZS4kaXNMaW5lQnJlYWtOb2RlKG8pO2lmKGx8fHBlLiRpc0RlY29yYXRvck5vZGUobykmJm8uaXNJbmxpbmUoKXx8cGUuJGlzRWxlbWVudE5vZGUobykmJm8uaXNJbmxpbmUoKXx8cGUuJGlzVGV4dE5vZGUobyl8fG8uaXNQYXJlbnRSZXF1aXJlZCgpKXtpZihyPT09bnVsbCYmKHI9by5jcmVhdGVQYXJlbnRFbGVtZW50Tm9kZSgpLG4ucHVzaChyKSxsKSljb250aW51ZTtyIT09bnVsbCYmci5hcHBlbmQobyl9ZWxzZSBuLnB1c2gobykscj1udWxsfXBlLiRpc1JhbmdlU2VsZWN0aW9uKHQpP3QuaW5zZXJ0Tm9kZXMobik6cGUuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKHQpJiYoZT10LmFuY2hvci5nZXROb2RlKCkscGUuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGUoZSl8fGxpKDQxKSxlLmFwcGVuZCguLi5uKSl9ZnVuY3Rpb24gVFAoZSx0LG4scil7ZS5sZW5ndGg9PT0xJiZwZS5ERVBSRUNBVEVEXyRpc0dyaWROb2RlKGVbMF0pfHxsaSg0Mik7dmFyIGk9ZVswXTtlPWkuZ2V0Q2hpbGRyZW4oKSxuPWkuZ2V0Rmlyc3RDaGlsZE9yVGhyb3coKS5nZXRDaGlsZHJlblNpemUoKTt2YXIgbz1pLmdldENoaWxkcmVuU2l6ZSgpLGw9WGwuJGZpbmRNYXRjaGluZ1BhcmVudCh0LmFuY2hvci5nZXROb2RlKCksaD0+cGUuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGUoaCkpO3Q9KGk9bCYmWGwuJGZpbmRNYXRjaGluZ1BhcmVudChsLGg9PnBlLkRFUFJFQ0FURURfJGlzR3JpZFJvd05vZGUoaCkpKSYmWGwuJGZpbmRNYXRjaGluZ1BhcmVudChpLGg9PnBlLkRFUFJFQ0FURURfJGlzR3JpZE5vZGUoaCkpLHBlLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKGwpJiZwZS5ERVBSRUNBVEVEXyRpc0dyaWRSb3dOb2RlKGkpJiZwZS5ERVBSRUNBVEVEXyRpc0dyaWROb2RlKHQpfHxsaSg0Myk7dmFyIHM9aS5nZXRJbmRleFdpdGhpblBhcmVudCgpLGE9TWF0aC5taW4odC5nZXRDaGlsZHJlblNpemUoKS0xLHMrby0xKTtvPWwuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxsPU1hdGgubWluKGkuZ2V0Q2hpbGRyZW5TaXplKCktMSxvK24tMSksbj1NYXRoLm1pbihvLGwpLGk9TWF0aC5taW4ocyxhKSxvPU1hdGgubWF4KG8sbCkscz1NYXRoLm1heChzLGEpLGE9dC5nZXRDaGlsZHJlbigpLGw9MDtsZXQgdSxjO2ZvcihsZXQgaD1pO2g8PXM7aCsrKXt2YXIgZD1hW2hdO3BlLkRFUFJFQ0FURURfJGlzR3JpZFJvd05vZGUoZCl8fGxpKDI0KTt2YXIgZj1lW2xdO3BlLkRFUFJFQ0FURURfJGlzR3JpZFJvd05vZGUoZil8fGxpKDI0KSxkPWQuZ2V0Q2hpbGRyZW4oKSxmPWYuZ2V0Q2hpbGRyZW4oKTtsZXQgbT0wO2ZvcihsZXQgZz1uO2c8PW87ZysrKXtsZXQgUz1kW2ddO3BlLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKFMpfHxsaSgyNSk7bGV0IHY9ZlttXTtwZS5ERVBSRUNBVEVEXyRpc0dyaWRDZWxsTm9kZSh2KXx8bGkoMjUpLGg9PT1pJiZnPT09bj91PVMuZ2V0S2V5KCk6aD09PXMmJmc9PT1vJiYoYz1TLmdldEtleSgpKTtsZXQgeT1TLmdldENoaWxkcmVuKCk7di5nZXRDaGlsZHJlbigpLmZvckVhY2goXz0+e3BlLiRpc1RleHROb2RlKF8pJiZwZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpLmFwcGVuZChfKSxTLmFwcGVuZChfKX0pLHkuZm9yRWFjaChfPT5fLnJlbW92ZSgpKSxtKyt9bCsrfXUmJmMmJihlPXBlLkRFUFJFQ0FURURfJGNyZWF0ZUdyaWRTZWxlY3Rpb24oKSxlLnNldCh0LmdldEtleSgpLHUsYykscGUuJHNldFNlbGVjdGlvbihlKSxyLmRpc3BhdGNoQ29tbWFuZChwZS5TRUxFQ1RJT05fQ0hBTkdFX0NPTU1BTkQsdm9pZCAwKSl9ZnVuY3Rpb24gbEMoZSx0LG4scj1bXSl7bGV0IGk9dCE9bnVsbD9uLmlzU2VsZWN0ZWQodCk6ITAsbz1wZS4kaXNFbGVtZW50Tm9kZShuKSYmbi5leGNsdWRlRnJvbUNvcHkoImh0bWwiKTt2YXIgbD1uO2lmKHQhPT1udWxsKXt2YXIgcz1UbS4kY2xvbmVXaXRoUHJvcGVydGllcyhuKTtsPXM9cGUuJGlzVGV4dE5vZGUocykmJnQhPW51bGw/VG0uJHNsaWNlU2VsZWN0ZWRUZXh0Tm9kZUNvbnRlbnQodCxzKTpzfWxldCBhPXBlLiRpc0VsZW1lbnROb2RlKGwpP2wuZ2V0Q2hpbGRyZW4oKTpbXTt2YXIgdT1sO3M9dS5leHBvcnRKU09OKCk7dmFyIGM9dS5jb25zdHJ1Y3RvcjtzLnR5cGUhPT1jLmdldFR5cGUoKSYmbGkoNTgsYy5uYW1lKTtsZXQgZD1zLmNoaWxkcmVuO2ZvcihwZS4kaXNFbGVtZW50Tm9kZSh1KSYmKEFycmF5LmlzQXJyYXkoZCl8fGxpKDU5LGMubmFtZSkpLHBlLiRpc1RleHROb2RlKGwpJiYobD1sLl9fdGV4dCwwPGwubGVuZ3RoP3MudGV4dD1sOmk9ITEpLGw9MDtsPGEubGVuZ3RoO2wrKyl1PWFbbF0sYz1sQyhlLHQsdSxzLmNoaWxkcmVuKSwhaSYmcGUuJGlzRWxlbWVudE5vZGUobikmJmMmJm4uZXh0cmFjdFdpdGhDaGlsZCh1LHQsImNsb25lIikmJihpPSEwKTtpZihpJiYhbylyLnB1c2gocyk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHMuY2hpbGRyZW4pKWZvcihlPTA7ZTxzLmNoaWxkcmVuLmxlbmd0aDtlKyspci5wdXNoKHMuY2hpbGRyZW5bZV0pO3JldHVybiBpfWZ1bmN0aW9uIHNDKGUsdCl7bGV0IG49W10scj1wZS4kZ2V0Um9vdCgpLmdldENoaWxkcmVuKCk7Zm9yKGxldCBpPTA7aTxyLmxlbmd0aDtpKyspbEMoZSx0LHJbaV0sbik7cmV0dXJue25hbWVzcGFjZTplLl9jb25maWcubmFtZXNwYWNlLG5vZGVzOm59fWZ1bmN0aW9uIGFDKGUpe2xldCB0PVtdO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgcj1wZS4kcGFyc2VTZXJpYWxpemVkTm9kZShlW25dKTtwZS4kaXNUZXh0Tm9kZShyKSYmVG0uJGFkZE5vZGVTdHlsZShyKSx0LnB1c2gocil9cmV0dXJuIHR9bGV0IHZsPW51bGw7ZnVuY3Rpb24gdngoZSx0KXt2YXIgbj1yQz8oZS5fd2luZG93fHx3aW5kb3cpLmdldFNlbGVjdGlvbigpOm51bGw7aWYoIW4pcmV0dXJuITE7dmFyIHI9bi5hbmNob3JOb2RlO2lmKG49bi5mb2N1c05vZGUsciE9PW51bGwmJm4hPT1udWxsJiYhcGUuaXNTZWxlY3Rpb25XaXRoaW5FZGl0b3IoZSxyLG4pfHwodC5wcmV2ZW50RGVmYXVsdCgpLHQ9dC5jbGlwYm9hcmREYXRhLHI9cGUuJGdldFNlbGVjdGlvbigpLHQ9PT1udWxsfHxyPT09bnVsbCkpcmV0dXJuITE7bj1pQyhlKSxlPW9DKGUpO2xldCBpPSIiO3JldHVybiByIT09bnVsbCYmKGk9ci5nZXRUZXh0Q29udGVudCgpKSxuIT09bnVsbCYmdC5zZXREYXRhKCJ0ZXh0L2h0bWwiLG4pLGUhPT1udWxsJiZ0LnNldERhdGEoImFwcGxpY2F0aW9uL3gtbGV4aWNhbC1lZGl0b3IiLGUpLHQuc2V0RGF0YSgidGV4dC9wbGFpbiIsaSksITB9U2kuJGdlbmVyYXRlSlNPTkZyb21TZWxlY3RlZE5vZGVzPXNDO1NpLiRnZW5lcmF0ZU5vZGVzRnJvbVNlcmlhbGl6ZWROb2Rlcz1hQztTaS4kZ2V0SHRtbENvbnRlbnQ9aUM7U2kuJGdldExleGljYWxDb250ZW50PW9DO1NpLiRpbnNlcnREYXRhVHJhbnNmZXJGb3JQbGFpblRleHQ9ZnVuY3Rpb24oZSx0KXtlPWUuZ2V0RGF0YSgidGV4dC9wbGFpbiIpfHxlLmdldERhdGEoInRleHQvdXJpLWxpc3QiKSxlIT1udWxsJiZ0Lmluc2VydFJhd1RleHQoZSl9O1NpLiRpbnNlcnREYXRhVHJhbnNmZXJGb3JSaWNoVGV4dD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5nZXREYXRhKCJhcHBsaWNhdGlvbi94LWxleGljYWwtZWRpdG9yIik7aWYocil0cnl7bGV0IGw9SlNPTi5wYXJzZShyKTtpZihsLm5hbWVzcGFjZT09PW4uX2NvbmZpZy5uYW1lc3BhY2UmJkFycmF5LmlzQXJyYXkobC5ub2Rlcykpe2xldCBzPWFDKGwubm9kZXMpO3JldHVybiBObShuLHMsdCl9fWNhdGNoe31pZihyPWUuZ2V0RGF0YSgidGV4dC9odG1sIikpdHJ5e3ZhciBpPW5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcociwidGV4dC9odG1sIiksbz1uQy4kZ2VuZXJhdGVOb2Rlc0Zyb21ET00obixpKTtyZXR1cm4gTm0obixvLHQpfWNhdGNoe31pZihlPWUuZ2V0RGF0YSgidGV4dC9wbGFpbiIpfHxlLmdldERhdGEoInRleHQvdXJpLWxpc3QiKSxlIT1udWxsKWlmKHBlLiRpc1JhbmdlU2VsZWN0aW9uKHQpKWZvcihlPWUuc3BsaXQoLyhccj9cbnxcdCkvKSxuPWUubGVuZ3RoLGk9MDtpPG47aSsrKW89ZVtpXSxvPT09YApgfHxvPT09YFxyCmA/dC5pbnNlcnRQYXJhZ3JhcGgoKTpvPT09IgkiP3QuaW5zZXJ0Tm9kZXMoW3BlLiRjcmVhdGVUYWJOb2RlKCldKTp0Lmluc2VydFRleHQobyk7ZWxzZSB0Lmluc2VydFJhd1RleHQoZSl9O1NpLiRpbnNlcnRHZW5lcmF0ZWROb2Rlcz1ObTtTaS5jb3B5VG9DbGlwYm9hcmQ9YXN5bmMgZnVuY3Rpb24oZSx0KXtpZih2bCE9PW51bGwpcmV0dXJuITE7aWYodCE9PW51bGwpcmV0dXJuIG5ldyBQcm9taXNlKGw9PntlLnVwZGF0ZSgoKT0+e2wodngoZSx0KSl9KX0pO3ZhciBuPWUuZ2V0Um9vdEVsZW1lbnQoKTtsZXQgcj1lLl93aW5kb3c9PW51bGw/d2luZG93LmRvY3VtZW50OmUuX3dpbmRvdy5kb2N1bWVudCxpPXJDPyhlLl93aW5kb3d8fHdpbmRvdykuZ2V0U2VsZWN0aW9uKCk6bnVsbDtpZihuPT09bnVsbHx8aT09PW51bGwpcmV0dXJuITE7bGV0IG89ci5jcmVhdGVFbGVtZW50KCJzcGFuIik7cmV0dXJuIG8uc3R5bGUuY3NzVGV4dD0icG9zaXRpb246IGZpeGVkOyB0b3A6IC0xMDAwcHg7IixvLmFwcGVuZChyLmNyZWF0ZVRleHROb2RlKCIjIikpLG4uYXBwZW5kKG8pLG49bmV3IFJhbmdlLG4uc2V0U3RhcnQobywwKSxuLnNldEVuZChvLDEpLGkucmVtb3ZlQWxsUmFuZ2VzKCksaS5hZGRSYW5nZShuKSxuZXcgUHJvbWlzZShsPT57bGV0IHM9ZS5yZWdpc3RlckNvbW1hbmQocGUuQ09QWV9DT01NQU5ELGE9PihYbC5vYmplY3RLbGFzc0VxdWFscyhhLENsaXBib2FyZEV2ZW50KSYmKHMoKSx2bCE9PW51bGwmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHZsKSx2bD1udWxsKSxsKHZ4KGUsYSkpKSwhMCkscGUuQ09NTUFORF9QUklPUklUWV9DUklUSUNBTCk7dmw9d2luZG93LnNldFRpbWVvdXQoKCk9PntzKCksdmw9bnVsbCxsKCExKX0sNTApLHIuZXhlY0NvbW1hbmQoImNvcHkiKSxvLnJlbW92ZSgpfSl9O2NvbnN0IE5QPVNpO3ZhciBSUD1OUCx6ZD1SUCx4Yz1sbyxqcj1GdCxQPXdlO2Z1bmN0aW9uIHl4KGUsdCl7cmV0dXJuIHR5cGVvZiBkb2N1bWVudC5jYXJldFJhbmdlRnJvbVBvaW50PCJ1Ij8oZT1kb2N1bWVudC5jYXJldFJhbmdlRnJvbVBvaW50KGUsdCksZT09PW51bGw/bnVsbDp7bm9kZTplLnN0YXJ0Q29udGFpbmVyLG9mZnNldDplLnN0YXJ0T2Zmc2V0fSk6ZG9jdW1lbnQuY2FyZXRQb3NpdGlvbkZyb21Qb2ludCE9PSJ1bmRlZmluZWQiPyhlPWRvY3VtZW50LmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQoZSx0KSxlPT09bnVsbD9udWxsOntub2RlOmUub2Zmc2V0Tm9kZSxvZmZzZXQ6ZS5vZmZzZXR9KTpudWxsfWxldCBQcz10eXBlb2Ygd2luZG93PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudDwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudDwidSIsT1A9UHMmJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQ/ZG9jdW1lbnQuZG9jdW1lbnRNb2RlOm51bGwsUFA9UHMmJiJJbnB1dEV2ZW50ImluIHdpbmRvdyYmIU9QPyJnZXRUYXJnZXRSYW5nZXMiaW4gbmV3IHdpbmRvdy5JbnB1dEV2ZW50KCJpbnB1dCIpOiExLEFQPVBzJiYvVmVyc2lvblwvW1xkLl0rLipTYWZhcmkvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksTVA9UHMmJi9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhd2luZG93Lk1TU3RyZWFtLERQPVBzJiYvXig/PS4qQ2hyb21lKS4qL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxJUD1QcyYmL0FwcGxlV2ViS2l0XC9bXGQuXSsvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiFEUCxSbT1QLmNyZWF0ZUNvbW1hbmQoIkRSQUdfRFJPUF9QQVNURV9GSUxFIiksTnY9Y2xhc3MgdUMgZXh0ZW5kcyBQLkVsZW1lbnROb2Rle3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuInF1b3RlIn1zdGF0aWMgY2xvbmUodCl7cmV0dXJuIG5ldyB1Qyh0Ll9fa2V5KX1jb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1jcmVhdGVET00odCl7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYmxvY2txdW90ZSIpO3JldHVybiBqci5hZGRDbGFzc05hbWVzVG9FbGVtZW50KG4sdC50aGVtZS5xdW90ZSksbn11cGRhdGVET00oKXtyZXR1cm4hMX1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJue2Jsb2NrcXVvdGU6KCk9Pih7Y29udmVyc2lvbjpMUCxwcmlvcml0eTowfSl9fWV4cG9ydERPTSh0KXtpZih7ZWxlbWVudDp0fT1zdXBlci5leHBvcnRET00odCksdCYmanIuaXNIVE1MRWxlbWVudCh0KSl7dGhpcy5pc0VtcHR5KCkmJnQuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIikpO3ZhciBuPXRoaXMuZ2V0Rm9ybWF0VHlwZSgpO3Quc3R5bGUudGV4dEFsaWduPW4sKG49dGhpcy5nZXREaXJlY3Rpb24oKSkmJih0LmRpcj1uKX1yZXR1cm57ZWxlbWVudDp0fX1zdGF0aWMgaW1wb3J0SlNPTih0KXtsZXQgbj1SdigpO3JldHVybiBuLnNldEZvcm1hdCh0LmZvcm1hdCksbi5zZXRJbmRlbnQodC5pbmRlbnQpLG4uc2V0RGlyZWN0aW9uKHQuZGlyZWN0aW9uKSxufWV4cG9ydEpTT04oKXtyZXR1cm57Li4uc3VwZXIuZXhwb3J0SlNPTigpLHR5cGU6InF1b3RlIn19aW5zZXJ0TmV3QWZ0ZXIodCxuKXt0PVAuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKTtsZXQgcj10aGlzLmdldERpcmVjdGlvbigpO3JldHVybiB0LnNldERpcmVjdGlvbihyKSx0aGlzLmluc2VydEFmdGVyKHQsbiksdH1jb2xsYXBzZUF0U3RhcnQoKXtsZXQgdD1QLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKG49PnQuYXBwZW5kKG4pKSx0aGlzLnJlcGxhY2UodCksITB9fTtmdW5jdGlvbiBSdigpe3JldHVybiBQLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgTnYpfWxldCBPdj1jbGFzcyBjQyBleHRlbmRzIFAuRWxlbWVudE5vZGV7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4iaGVhZGluZyJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgY0ModC5fX3RhZyx0Ll9fa2V5KX1jb25zdHJ1Y3Rvcih0LG4pe3N1cGVyKG4pLHRoaXMuX190YWc9dH1nZXRUYWcoKXtyZXR1cm4gdGhpcy5fX3RhZ31jcmVhdGVET00odCl7bGV0IG49dGhpcy5fX3RhZyxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobik7cmV0dXJuIHQ9dC50aGVtZS5oZWFkaW5nLHQhPT12b2lkIDAmJmpyLmFkZENsYXNzTmFtZXNUb0VsZW1lbnQocix0W25dKSxyfXVwZGF0ZURPTSgpe3JldHVybiExfXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm57aDE6KCk9Pih7Y29udmVyc2lvbjp5bCxwcmlvcml0eTowfSksaDI6KCk9Pih7Y29udmVyc2lvbjp5bCxwcmlvcml0eTowfSksaDM6KCk9Pih7Y29udmVyc2lvbjp5bCxwcmlvcml0eTowfSksaDQ6KCk9Pih7Y29udmVyc2lvbjp5bCxwcmlvcml0eTowfSksaDU6KCk9Pih7Y29udmVyc2lvbjp5bCxwcmlvcml0eTowfSksaDY6KCk9Pih7Y29udmVyc2lvbjp5bCxwcmlvcml0eTowfSkscDp0PT4odD10LmZpcnN0Q2hpbGQsdCE9PW51bGwmJnh4KHQpP3tjb252ZXJzaW9uOigpPT4oe25vZGU6bnVsbH0pLHByaW9yaXR5OjN9Om51bGwpLHNwYW46dD0+eHgodCk/e2NvbnZlcnNpb246KCk9Pih7bm9kZTpGbCgiaDEiKX0pLHByaW9yaXR5OjN9Om51bGx9fWV4cG9ydERPTSh0KXtpZih7ZWxlbWVudDp0fT1zdXBlci5leHBvcnRET00odCksdCYmanIuaXNIVE1MRWxlbWVudCh0KSl7dGhpcy5pc0VtcHR5KCkmJnQuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIikpO3ZhciBuPXRoaXMuZ2V0Rm9ybWF0VHlwZSgpO3Quc3R5bGUudGV4dEFsaWduPW4sKG49dGhpcy5nZXREaXJlY3Rpb24oKSkmJih0LmRpcj1uKX1yZXR1cm57ZWxlbWVudDp0fX1zdGF0aWMgaW1wb3J0SlNPTih0KXtsZXQgbj1GbCh0LnRhZyk7cmV0dXJuIG4uc2V0Rm9ybWF0KHQuZm9ybWF0KSxuLnNldEluZGVudCh0LmluZGVudCksbi5zZXREaXJlY3Rpb24odC5kaXJlY3Rpb24pLG59ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksdGFnOnRoaXMuZ2V0VGFnKCksdHlwZToiaGVhZGluZyIsdmVyc2lvbjoxfX1pbnNlcnROZXdBZnRlcih0LG49ITApe3Q9dD90LmFuY2hvci5vZmZzZXQ6MCx0PTA8dCYmdDx0aGlzLmdldFRleHRDb250ZW50U2l6ZSgpP0ZsKHRoaXMuZ2V0VGFnKCkpOlAuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKTtsZXQgcj10aGlzLmdldERpcmVjdGlvbigpO3JldHVybiB0LnNldERpcmVjdGlvbihyKSx0aGlzLmluc2VydEFmdGVyKHQsbiksdH1jb2xsYXBzZUF0U3RhcnQoKXtsZXQgdD10aGlzLmlzRW1wdHkoKT9QLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk6RmwodGhpcy5nZXRUYWcoKSk7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKG49PnQuYXBwZW5kKG4pKSx0aGlzLnJlcGxhY2UodCksITB9ZXh0cmFjdFdpdGhDaGlsZCgpe3JldHVybiEwfX07ZnVuY3Rpb24geHgoZSl7cmV0dXJuIGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJzcGFuIj9lLnN0eWxlLmZvbnRTaXplPT09IjI2cHQiOiExfWZ1bmN0aW9uIHlsKGUpe2xldCB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxuPW51bGw7cmV0dXJuKHQ9PT0iaDEifHx0PT09ImgyInx8dD09PSJoMyJ8fHQ9PT0iaDQifHx0PT09Img1Inx8dD09PSJoNiIpJiYobj1GbCh0KSxlLnN0eWxlIT09bnVsbCYmbi5zZXRGb3JtYXQoZS5zdHlsZS50ZXh0QWxpZ24pKSx7bm9kZTpufX1mdW5jdGlvbiBMUChlKXtsZXQgdD1SdigpO3JldHVybiBlLnN0eWxlIT09bnVsbCYmdC5zZXRGb3JtYXQoZS5zdHlsZS50ZXh0QWxpZ24pLHtub2RlOnR9fWZ1bmN0aW9uIEZsKGUpe3JldHVybiBQLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgT3YoZSkpfWZ1bmN0aW9uIGpQKGUsdCl7ZS5wcmV2ZW50RGVmYXVsdCgpLHQudXBkYXRlKCgpPT57bGV0IG49UC4kZ2V0U2VsZWN0aW9uKCkscj1lIGluc3RhbmNlb2YgSW5wdXRFdmVudHx8ZSBpbnN0YW5jZW9mIEtleWJvYXJkRXZlbnQ/bnVsbDplLmNsaXBib2FyZERhdGE7ciE9bnVsbCYmKFAuJGlzUmFuZ2VTZWxlY3Rpb24obil8fFAuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKG4pKSYmemQuJGluc2VydERhdGFUcmFuc2ZlckZvclJpY2hUZXh0KHIsbix0KX0se3RhZzoicGFzdGUifSl9YXN5bmMgZnVuY3Rpb24gelAoZSx0KXthd2FpdCB6ZC5jb3B5VG9DbGlwYm9hcmQodCxqci5vYmplY3RLbGFzc0VxdWFscyhlLENsaXBib2FyZEV2ZW50KT9lOm51bGwpLHQudXBkYXRlKCgpPT57bGV0IG49UC4kZ2V0U2VsZWN0aW9uKCk7UC4kaXNSYW5nZVNlbGVjdGlvbihuKT9uLnJlbW92ZVRleHQoKTpQLiRpc05vZGVTZWxlY3Rpb24obikmJm4uZ2V0Tm9kZXMoKS5mb3JFYWNoKHI9PnIucmVtb3ZlKCkpfSl9ZnVuY3Rpb24gZGEoZSl7bGV0IHQ9bnVsbDtpZihlIGluc3RhbmNlb2YgRHJhZ0V2ZW50P3Q9ZS5kYXRhVHJhbnNmZXI6ZSBpbnN0YW5jZW9mIENsaXBib2FyZEV2ZW50JiYodD1lLmNsaXBib2FyZERhdGEpLHQ9PT1udWxsKXJldHVyblshMSxbXSwhMV07dmFyIG49dC50eXBlcztyZXR1cm4gZT1uLmluY2x1ZGVzKCJGaWxlcyIpLG49bi5pbmNsdWRlcygidGV4dC9odG1sIil8fG4uaW5jbHVkZXMoInRleHQvcGxhaW4iKSxbZSxBcnJheS5mcm9tKHQuZmlsZXMpLG5dfWZ1bmN0aW9uIF94KGUpe3ZhciB0PVAuJGdldFNlbGVjdGlvbigpO2lmKCFQLiRpc1JhbmdlU2VsZWN0aW9uKHQpKXJldHVybiExO2xldCBuPW5ldyBTZXQ7dD10LmdldE5vZGVzKCk7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciByPXRbb10saT1yLmdldEtleSgpO24uaGFzKGkpfHwocj1qci4kZ2V0TmVhcmVzdEJsb2NrRWxlbWVudEFuY2VzdG9yT3JUaHJvdyhyKSxpPXIuZ2V0S2V5KCksci5jYW5JbmRlbnQoKSYmIW4uaGFzKGkpJiYobi5hZGQoaSksZShyKSkpfXJldHVybiAwPG4uc2l6ZX1mdW5jdGlvbiBfYyhlKXtyZXR1cm4gZT1QLiRnZXROZWFyZXN0Tm9kZUZyb21ET01Ob2RlKGUpLFAuJGlzRGVjb3JhdG9yTm9kZShlKX1Kci4kY3JlYXRlSGVhZGluZ05vZGU9Rmw7SnIuJGNyZWF0ZVF1b3RlTm9kZT1SdjtKci4kaXNIZWFkaW5nTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIE92fTtKci4kaXNRdW90ZU5vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBOdn07SnIuRFJBR19EUk9QX1BBU1RFPVJtO0pyLkhlYWRpbmdOb2RlPU92O0pyLlF1b3RlTm9kZT1OdjtKci5ldmVudEZpbGVzPWRhO0pyLnJlZ2lzdGVyUmljaFRleHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGpyLm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlckNvbW1hbmQoUC5DTElDS19DT01NQU5ELCgpPT57Y29uc3QgdD1QLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gUC4kaXNOb2RlU2VsZWN0aW9uKHQpPyh0LmNsZWFyKCksITApOiExfSwwKSxlLnJlZ2lzdGVyQ29tbWFuZChQLkRFTEVURV9DSEFSQUNURVJfQ09NTUFORCx0PT57Y29uc3Qgbj1QLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gUC4kaXNSYW5nZVNlbGVjdGlvbihuKT8obi5kZWxldGVDaGFyYWN0ZXIodCksITApOiExfSxQLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChQLkRFTEVURV9XT1JEX0NPTU1BTkQsdD0+e2NvbnN0IG49UC4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIFAuJGlzUmFuZ2VTZWxlY3Rpb24obik/KG4uZGVsZXRlV29yZCh0KSwhMCk6ITF9LFAuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKFAuREVMRVRFX0xJTkVfQ09NTUFORCx0PT57Y29uc3Qgbj1QLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gUC4kaXNSYW5nZVNlbGVjdGlvbihuKT8obi5kZWxldGVMaW5lKHQpLCEwKTohMX0sUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoUC5DT05UUk9MTEVEX1RFWFRfSU5TRVJUSU9OX0NPTU1BTkQsdD0+e2NvbnN0IG49UC4kZ2V0U2VsZWN0aW9uKCk7aWYodHlwZW9mIHQ9PSJzdHJpbmciKVAuJGlzUmFuZ2VTZWxlY3Rpb24obik/bi5pbnNlcnRUZXh0KHQpOlAuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKG4pO2Vsc2V7aWYoIVAuJGlzUmFuZ2VTZWxlY3Rpb24obikmJiFQLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbihuKSlyZXR1cm4hMTtjb25zdCByPXQuZGF0YVRyYW5zZmVyO3IhPW51bGw/emQuJGluc2VydERhdGFUcmFuc2ZlckZvclJpY2hUZXh0KHIsbixlKTpQLiRpc1JhbmdlU2VsZWN0aW9uKG4pJiYodD10LmRhdGEpJiZuLmluc2VydFRleHQodCl9cmV0dXJuITB9LFAuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKFAuUkVNT1ZFX1RFWFRfQ09NTUFORCwoKT0+e2NvbnN0IHQ9UC4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIFAuJGlzUmFuZ2VTZWxlY3Rpb24odCk/KHQucmVtb3ZlVGV4dCgpLCEwKTohMX0sUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoUC5GT1JNQVRfVEVYVF9DT01NQU5ELHQ9Pntjb25zdCBuPVAuJGdldFNlbGVjdGlvbigpO3JldHVybiBQLiRpc1JhbmdlU2VsZWN0aW9uKG4pPyhuLmZvcm1hdFRleHQodCksITApOiExfSxQLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChQLkZPUk1BVF9FTEVNRU5UX0NPTU1BTkQsdD0+e3ZhciBuPVAuJGdldFNlbGVjdGlvbigpO2lmKCFQLiRpc1JhbmdlU2VsZWN0aW9uKG4pJiYhUC4kaXNOb2RlU2VsZWN0aW9uKG4pKXJldHVybiExO249bi5nZXROb2RlcygpO2Zvcihjb25zdCByIG9mIG4pbj1qci4kZmluZE1hdGNoaW5nUGFyZW50KHIsaT0+UC4kaXNFbGVtZW50Tm9kZShpKSYmIWkuaXNJbmxpbmUoKSksbiE9PW51bGwmJm4uc2V0Rm9ybWF0KHQpO3JldHVybiEwfSxQLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChQLklOU0VSVF9MSU5FX0JSRUFLX0NPTU1BTkQsdD0+e2NvbnN0IG49UC4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIFAuJGlzUmFuZ2VTZWxlY3Rpb24obik/KG4uaW5zZXJ0TGluZUJyZWFrKHQpLCEwKTohMX0sUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoUC5JTlNFUlRfUEFSQUdSQVBIX0NPTU1BTkQsKCk9Pntjb25zdCB0PVAuJGdldFNlbGVjdGlvbigpO3JldHVybiBQLiRpc1JhbmdlU2VsZWN0aW9uKHQpPyh0Lmluc2VydFBhcmFncmFwaCgpLCEwKTohMX0sUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoUC5JTlNFUlRfVEFCX0NPTU1BTkQsKCk9PihQLiRpbnNlcnROb2RlcyhbUC4kY3JlYXRlVGFiTm9kZSgpXSksITApLFAuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKFAuSU5ERU5UX0NPTlRFTlRfQ09NTUFORCwoKT0+X3godD0+e2NvbnN0IG49dC5nZXRJbmRlbnQoKTt0LnNldEluZGVudChuKzEpfSksUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoUC5PVVRERU5UX0NPTlRFTlRfQ09NTUFORCwoKT0+X3godD0+e2NvbnN0IG49dC5nZXRJbmRlbnQoKTswPG4mJnQuc2V0SW5kZW50KG4tMSl9KSxQLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChQLktFWV9BUlJPV19VUF9DT01NQU5ELHQ9Pnt2YXIgbj1QLiRnZXRTZWxlY3Rpb24oKTtpZihQLiRpc05vZGVTZWxlY3Rpb24obikmJiFfYyh0LnRhcmdldCkpe2lmKHQ9bi5nZXROb2RlcygpLDA8dC5sZW5ndGgpcmV0dXJuIHRbMF0uc2VsZWN0UHJldmlvdXMoKSwhMH1lbHNlIGlmKFAuJGlzUmFuZ2VTZWxlY3Rpb24obikmJihuPVAuJGdldEFkamFjZW50Tm9kZShuLmZvY3VzLCEwKSwhdC5zaGlmdEtleSYmUC4kaXNEZWNvcmF0b3JOb2RlKG4pJiYhbi5pc0lzb2xhdGVkKCkmJiFuLmlzSW5saW5lKCkpKXJldHVybiBuLnNlbGVjdFByZXZpb3VzKCksdC5wcmV2ZW50RGVmYXVsdCgpLCEwO3JldHVybiExfSxQLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChQLktFWV9BUlJPV19ET1dOX0NPTU1BTkQsdD0+e3ZhciBuPVAuJGdldFNlbGVjdGlvbigpO2lmKFAuJGlzTm9kZVNlbGVjdGlvbihuKSl7aWYodD1uLmdldE5vZGVzKCksMDx0Lmxlbmd0aClyZXR1cm4gdFswXS5zZWxlY3ROZXh0KDAsMCksITB9ZWxzZSBpZihQLiRpc1JhbmdlU2VsZWN0aW9uKG4pKXtsZXQgcj1uLmZvY3VzO2lmKHIua2V5PT09InJvb3QiJiZyLm9mZnNldD09PVAuJGdldFJvb3QoKS5nZXRDaGlsZHJlblNpemUoKSlyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpLCEwO2lmKG49UC4kZ2V0QWRqYWNlbnROb2RlKG4uZm9jdXMsITEpLCF0LnNoaWZ0S2V5JiZQLiRpc0RlY29yYXRvck5vZGUobikmJiFuLmlzSXNvbGF0ZWQoKSYmIW4uaXNJbmxpbmUoKSlyZXR1cm4gbi5zZWxlY3ROZXh0KCksdC5wcmV2ZW50RGVmYXVsdCgpLCEwfXJldHVybiExfSxQLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChQLktFWV9BUlJPV19MRUZUX0NPTU1BTkQsdD0+e2NvbnN0IG49UC4kZ2V0U2VsZWN0aW9uKCk7aWYoUC4kaXNOb2RlU2VsZWN0aW9uKG4pKXt2YXIgcj1uLmdldE5vZGVzKCk7aWYoMDxyLmxlbmd0aClyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpLHJbMF0uc2VsZWN0UHJldmlvdXMoKSwhMH1yZXR1cm4gUC4kaXNSYW5nZVNlbGVjdGlvbihuKSYmeGMuJHNob3VsZE92ZXJyaWRlRGVmYXVsdENoYXJhY3RlclNlbGVjdGlvbihuLCEwKT8ocj10LnNoaWZ0S2V5LHQucHJldmVudERlZmF1bHQoKSx4Yy4kbW92ZUNoYXJhY3RlcihuLHIsITApLCEwKTohMX0sUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoUC5LRVlfQVJST1dfUklHSFRfQ09NTUFORCx0PT57Y29uc3Qgbj1QLiRnZXRTZWxlY3Rpb24oKTtpZihQLiRpc05vZGVTZWxlY3Rpb24obikmJiFfYyh0LnRhcmdldCkpe3ZhciByPW4uZ2V0Tm9kZXMoKTtpZigwPHIubGVuZ3RoKXJldHVybiB0LnByZXZlbnREZWZhdWx0KCksclswXS5zZWxlY3ROZXh0KDAsMCksITB9cmV0dXJuIFAuJGlzUmFuZ2VTZWxlY3Rpb24obik/KHI9dC5zaGlmdEtleSx4Yy4kc2hvdWxkT3ZlcnJpZGVEZWZhdWx0Q2hhcmFjdGVyU2VsZWN0aW9uKG4sITEpPyh0LnByZXZlbnREZWZhdWx0KCkseGMuJG1vdmVDaGFyYWN0ZXIobixyLCExKSwhMCk6ITEpOiExfSxQLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChQLktFWV9CQUNLU1BBQ0VfQ09NTUFORCx0PT57aWYoX2ModC50YXJnZXQpKXJldHVybiExO2NvbnN0IG49UC4kZ2V0U2VsZWN0aW9uKCk7aWYoIVAuJGlzUmFuZ2VTZWxlY3Rpb24obikpcmV0dXJuITE7dC5wcmV2ZW50RGVmYXVsdCgpLHthbmNob3I6dH09bjtjb25zdCByPXQuZ2V0Tm9kZSgpO3JldHVybiBuLmlzQ29sbGFwc2VkKCkmJnQub2Zmc2V0PT09MCYmIVAuJGlzUm9vdE5vZGUocikmJjA8anIuJGdldE5lYXJlc3RCbG9ja0VsZW1lbnRBbmNlc3Rvck9yVGhyb3cocikuZ2V0SW5kZW50KCk/ZS5kaXNwYXRjaENvbW1hbmQoUC5PVVRERU5UX0NPTlRFTlRfQ09NTUFORCx2b2lkIDApOmUuZGlzcGF0Y2hDb21tYW5kKFAuREVMRVRFX0NIQVJBQ1RFUl9DT01NQU5ELCEwKX0sUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoUC5LRVlfREVMRVRFX0NPTU1BTkQsdD0+e2lmKF9jKHQudGFyZ2V0KSlyZXR1cm4hMTtjb25zdCBuPVAuJGdldFNlbGVjdGlvbigpO3JldHVybiBQLiRpc1JhbmdlU2VsZWN0aW9uKG4pPyh0LnByZXZlbnREZWZhdWx0KCksZS5kaXNwYXRjaENvbW1hbmQoUC5ERUxFVEVfQ0hBUkFDVEVSX0NPTU1BTkQsITEpKTohMX0sUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoUC5LRVlfRU5URVJfQ09NTUFORCx0PT57Y29uc3Qgbj1QLiRnZXRTZWxlY3Rpb24oKTtpZighUC4kaXNSYW5nZVNlbGVjdGlvbihuKSlyZXR1cm4hMTtpZih0IT09bnVsbCl7aWYoKE1QfHxBUHx8SVApJiZQUClyZXR1cm4hMTtpZih0LnByZXZlbnREZWZhdWx0KCksdC5zaGlmdEtleSlyZXR1cm4gZS5kaXNwYXRjaENvbW1hbmQoUC5JTlNFUlRfTElORV9CUkVBS19DT01NQU5ELCExKX1yZXR1cm4gZS5kaXNwYXRjaENvbW1hbmQoUC5JTlNFUlRfUEFSQUdSQVBIX0NPTU1BTkQsdm9pZCAwKX0sUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoUC5LRVlfRVNDQVBFX0NPTU1BTkQsKCk9Pntjb25zdCB0PVAuJGdldFNlbGVjdGlvbigpO3JldHVybiBQLiRpc1JhbmdlU2VsZWN0aW9uKHQpPyhlLmJsdXIoKSwhMCk6ITF9LFAuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKFAuRFJPUF9DT01NQU5ELHQ9Pntjb25zdFssbl09ZGEodCk7aWYoMDxuLmxlbmd0aCl7dmFyIHI9eXgodC5jbGllbnRYLHQuY2xpZW50WSk7aWYociE9PW51bGwpe2NvbnN0e29mZnNldDpvLG5vZGU6bH09cjt2YXIgaT1QLiRnZXROZWFyZXN0Tm9kZUZyb21ET01Ob2RlKGwpO2lmKGkhPT1udWxsKXtpZihyPVAuJGNyZWF0ZVJhbmdlU2VsZWN0aW9uKCksUC4kaXNUZXh0Tm9kZShpKSlyLmFuY2hvci5zZXQoaS5nZXRLZXkoKSxvLCJ0ZXh0Iiksci5mb2N1cy5zZXQoaS5nZXRLZXkoKSxvLCJ0ZXh0Iik7ZWxzZXtjb25zdCBzPWkuZ2V0UGFyZW50T3JUaHJvdygpLmdldEtleSgpO2k9aS5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEsci5hbmNob3Iuc2V0KHMsaSwiZWxlbWVudCIpLHIuZm9jdXMuc2V0KHMsaSwiZWxlbWVudCIpfXI9UC4kbm9ybWFsaXplU2VsZWN0aW9uX19FWFBFUklNRU5UQUwociksUC4kc2V0U2VsZWN0aW9uKHIpfWUuZGlzcGF0Y2hDb21tYW5kKFJtLG4pfXJldHVybiB0LnByZXZlbnREZWZhdWx0KCksITB9cmV0dXJuIHQ9UC4kZ2V0U2VsZWN0aW9uKCksISFQLiRpc1JhbmdlU2VsZWN0aW9uKHQpfSxQLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChQLkRSQUdTVEFSVF9DT01NQU5ELHQ9PntbdF09ZGEodCk7Y29uc3Qgbj1QLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4hKHQmJiFQLiRpc1JhbmdlU2VsZWN0aW9uKG4pKX0sUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoUC5EUkFHT1ZFUl9DT01NQU5ELHQ9Pnt2YXJbbl09ZGEodCk7Y29uc3Qgcj1QLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gbiYmIVAuJGlzUmFuZ2VTZWxlY3Rpb24ocik/ITE6KG49eXgodC5jbGllbnRYLHQuY2xpZW50WSksbiE9PW51bGwmJihuPVAuJGdldE5lYXJlc3ROb2RlRnJvbURPTU5vZGUobi5ub2RlKSxQLiRpc0RlY29yYXRvck5vZGUobikmJnQucHJldmVudERlZmF1bHQoKSksITApfSxQLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChQLlNFTEVDVF9BTExfQ09NTUFORCwoKT0+KFAuJHNlbGVjdEFsbCgpLCEwKSxQLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChQLkNPUFlfQ09NTUFORCx0PT4oemQuY29weVRvQ2xpcGJvYXJkKGUsanIub2JqZWN0S2xhc3NFcXVhbHModCxDbGlwYm9hcmRFdmVudCk/dDpudWxsKSwhMCksUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoUC5DVVRfQ09NTUFORCx0PT4oelAodCxlKSwhMCksUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoUC5QQVNURV9DT01NQU5ELHQ9Pntjb25zdFssbixyXT1kYSh0KTtpZigwPG4ubGVuZ3RoJiYhcilyZXR1cm4gZS5kaXNwYXRjaENvbW1hbmQoUm0sbiksITA7aWYoUC5pc1NlbGVjdGlvbkNhcHR1cmVkSW5EZWNvcmF0b3JJbnB1dCh0LnRhcmdldCkpcmV0dXJuITE7Y29uc3QgaT1QLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gUC4kaXNSYW5nZVNlbGVjdGlvbihpKXx8UC5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24oaSk/KGpQKHQsZSksITApOiExfSxQLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSl9O2NvbnN0IEZQPUpyO3ZhciBPYT1GUCxkQz1UcixCUD14UCxKbj1wLFVQPXdQLGZDPUZ0LHd4PUdyLFdQPUVQLFZQPU9hLFB2PXR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PCJ1Ij9Kbi51c2VMYXlvdXRFZmZlY3Q6Sm4udXNlRWZmZWN0O2Z1bmN0aW9uIFN4KGUpe3JldHVybiBlLmdldEVkaXRvclN0YXRlKCkucmVhZChVUC4kY2FuU2hvd1BsYWNlaG9sZGVyQ3VycnkoZS5pc0NvbXBvc2luZygpKSl9ZnVuY3Rpb24gSFAoZSl7bGV0W3Qsbl09Sm4udXNlU3RhdGUoKCk9PlN4KGUpKTtyZXR1cm4gUHYoKCk9PntmdW5jdGlvbiByKCl7bGV0IGk9U3goZSk7bihpKX1yZXR1cm4gcigpLGZDLm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlclVwZGF0ZUxpc3RlbmVyKCgpPT57cigpfSksZS5yZWdpc3RlckVkaXRhYmxlTGlzdGVuZXIoKCk9PntyKCl9KSl9LFtlXSksdH1mdW5jdGlvbiBLUChlLHQpe2xldFtuLHJdPUpuLnVzZVN0YXRlKCgpPT5lLmdldERlY29yYXRvcnMoKSk7cmV0dXJuIFB2KCgpPT5lLnJlZ2lzdGVyRGVjb3JhdG9yTGlzdGVuZXIoaT0+e3d4LmZsdXNoU3luYygoKT0+e3IoaSl9KX0pLFtlXSksSm4udXNlRWZmZWN0KCgpPT57cihlLmdldERlY29yYXRvcnMoKSl9LFtlXSksSm4udXNlTWVtbygoKT0+e2xldCBpPVtdLG89T2JqZWN0LmtleXMobik7Zm9yKGxldCBsPTA7bDxvLmxlbmd0aDtsKyspe2xldCBzPW9bbF0sYT1Kbi5jcmVhdGVFbGVtZW50KHQse29uRXJyb3I6Yz0+ZS5fb25FcnJvcihjKX0sSm4uY3JlYXRlRWxlbWVudChKbi5TdXNwZW5zZSx7ZmFsbGJhY2s6bnVsbH0sbltzXSkpLHU9ZS5nZXRFbGVtZW50QnlLZXkocyk7dSE9PW51bGwmJmkucHVzaCh3eC5jcmVhdGVQb3J0YWwoYSx1LHMpKX1yZXR1cm4gaX0sW3QsbixlXSl9ZnVuY3Rpb24gWlAoZSl7UHYoKCk9PmZDLm1lcmdlUmVnaXN0ZXIoVlAucmVnaXN0ZXJSaWNoVGV4dChlKSxXUC5yZWdpc3RlckRyYWdvblN1cHBvcnQoZSkpLFtlXSl9ZnVuY3Rpb24gR1Aoe2NvbnRlbnQ6ZX0pe3Zhclt0XT1kQy51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7dD1IUCh0KTtsZXQgbj1CUCgpO3JldHVybiB0P3R5cGVvZiBlPT0iZnVuY3Rpb24iP2Uobik6ZTpudWxsfVlFLlJpY2hUZXh0UGx1Z2luPWZ1bmN0aW9uKHtjb250ZW50RWRpdGFibGU6ZSxwbGFjZWhvbGRlcjp0LEVycm9yQm91bmRhcnk6bn0pe2xldFtyXT1kQy51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7cmV0dXJuIG49S1AocixuKSxaUChyKSxKbi5jcmVhdGVFbGVtZW50KEpuLkZyYWdtZW50LG51bGwsZSxKbi5jcmVhdGVFbGVtZW50KEdQLHtjb250ZW50OnR9KSxuKX07Y29uc3QgWVA9WUU7dmFyIFhQPVlQLGhDPXt9LG5pPWppLFFQPVRyLHBDPXAsSlA9RnQsSnM9d2U7ZnVuY3Rpb24gcVAoZSl7cEMudXNlRWZmZWN0KCgpPT5KUC5tZXJnZVJlZ2lzdGVyKGUucmVnaXN0ZXJDb21tYW5kKG5pLklOU0VSVF9PUkRFUkVEX0xJU1RfQ09NTUFORCwoKT0+KG5pLmluc2VydExpc3QoZSwibnVtYmVyIiksITApLEpzLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSxlLnJlZ2lzdGVyQ29tbWFuZChuaS5JTlNFUlRfVU5PUkRFUkVEX0xJU1RfQ09NTUFORCwoKT0+KG5pLmluc2VydExpc3QoZSwiYnVsbGV0IiksITApLEpzLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSxlLnJlZ2lzdGVyQ29tbWFuZChuaS5SRU1PVkVfTElTVF9DT01NQU5ELCgpPT4obmkucmVtb3ZlTGlzdChlKSwhMCksSnMuQ09NTUFORF9QUklPUklUWV9MT1cpLGUucmVnaXN0ZXJDb21tYW5kKEpzLklOU0VSVF9QQVJBR1JBUEhfQ09NTUFORCwoKT0+ISFuaS4kaGFuZGxlTGlzdEluc2VydFBhcmFncmFwaCgpLEpzLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSksW2VdKX1oQy5MaXN0UGx1Z2luPWZ1bmN0aW9uKCl7bGV0W2VdPVFQLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtyZXR1cm4gcEMudXNlRWZmZWN0KCgpPT57aWYoIWUuaGFzTm9kZXMoW25pLkxpc3ROb2RlLG5pLkxpc3RJdGVtTm9kZV0pKXRocm93IEVycm9yKCJMaXN0UGx1Z2luOiBMaXN0Tm9kZSBhbmQvb3IgTGlzdEl0ZW1Ob2RlIG5vdCByZWdpc3RlcmVkIG9uIGVkaXRvciIpfSxbZV0pLHFQKGUpLG51bGx9O2NvbnN0IGVBPWhDO3ZhciB0QT1lQSxtQz17fSxFaT17fSxnQz1GdCxVcj13ZTtsZXQgbkE9bmV3IFNldChbImh0dHA6IiwiaHR0cHM6IiwibWFpbHRvOiIsInNtczoiLCJ0ZWw6Il0pO2NsYXNzIEFzIGV4dGVuZHMgVXIuRWxlbWVudE5vZGV7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4ibGluayJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgQXModC5fX3VybCx7cmVsOnQuX19yZWwsdGFyZ2V0OnQuX190YXJnZXQsdGl0bGU6dC5fX3RpdGxlfSx0Ll9fa2V5KX1jb25zdHJ1Y3Rvcih0LG49e30scil7c3VwZXIocik7bGV0e3RhcmdldDppPW51bGwscmVsOm89bnVsbCx0aXRsZTpsPW51bGx9PW47dGhpcy5fX3VybD10LHRoaXMuX190YXJnZXQ9aSx0aGlzLl9fcmVsPW8sdGhpcy5fX3RpdGxlPWx9Y3JlYXRlRE9NKHQpe2xldCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtyZXR1cm4gbi5ocmVmPXRoaXMuc2FuaXRpemVVcmwodGhpcy5fX3VybCksdGhpcy5fX3RhcmdldCE9PW51bGwmJihuLnRhcmdldD10aGlzLl9fdGFyZ2V0KSx0aGlzLl9fcmVsIT09bnVsbCYmKG4ucmVsPXRoaXMuX19yZWwpLHRoaXMuX190aXRsZSE9PW51bGwmJihuLnRpdGxlPXRoaXMuX190aXRsZSksZ0MuYWRkQ2xhc3NOYW1lc1RvRWxlbWVudChuLHQudGhlbWUubGluayksbn11cGRhdGVET00odCxuKXtsZXQgcj10aGlzLl9fdXJsLGk9dGhpcy5fX3RhcmdldCxvPXRoaXMuX19yZWwsbD10aGlzLl9fdGl0bGU7cmV0dXJuIHIhPT10Ll9fdXJsJiYobi5ocmVmPXIpLGkhPT10Ll9fdGFyZ2V0JiYoaT9uLnRhcmdldD1pOm4ucmVtb3ZlQXR0cmlidXRlKCJ0YXJnZXQiKSksbyE9PXQuX19yZWwmJihvP24ucmVsPW86bi5yZW1vdmVBdHRyaWJ1dGUoInJlbCIpKSxsIT09dC5fX3RpdGxlJiYobD9uLnRpdGxlPWw6bi5yZW1vdmVBdHRyaWJ1dGUoInRpdGxlIikpLCExfXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm57YTooKT0+KHtjb252ZXJzaW9uOnJBLHByaW9yaXR5OjF9KX19c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49YXUodC51cmwse3JlbDp0LnJlbCx0YXJnZXQ6dC50YXJnZXQsdGl0bGU6dC50aXRsZX0pO3JldHVybiBuLnNldEZvcm1hdCh0LmZvcm1hdCksbi5zZXRJbmRlbnQodC5pbmRlbnQpLG4uc2V0RGlyZWN0aW9uKHQuZGlyZWN0aW9uKSxufXNhbml0aXplVXJsKHQpe3RyeXtsZXQgbj1uZXcgVVJMKHQpO2lmKCFuQS5oYXMobi5wcm90b2NvbCkpcmV0dXJuImFib3V0OmJsYW5rIn1jYXRjaHt9cmV0dXJuIHR9ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCkscmVsOnRoaXMuZ2V0UmVsKCksdGFyZ2V0OnRoaXMuZ2V0VGFyZ2V0KCksdGl0bGU6dGhpcy5nZXRUaXRsZSgpLHR5cGU6ImxpbmsiLHVybDp0aGlzLmdldFVSTCgpLHZlcnNpb246MX19Z2V0VVJMKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX191cmx9c2V0VVJMKHQpe3RoaXMuZ2V0V3JpdGFibGUoKS5fX3VybD10fWdldFRhcmdldCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fdGFyZ2V0fXNldFRhcmdldCh0KXt0aGlzLmdldFdyaXRhYmxlKCkuX190YXJnZXQ9dH1nZXRSZWwoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3JlbH1zZXRSZWwodCl7dGhpcy5nZXRXcml0YWJsZSgpLl9fcmVsPXR9Z2V0VGl0bGUoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3RpdGxlfXNldFRpdGxlKHQpe3RoaXMuZ2V0V3JpdGFibGUoKS5fX3RpdGxlPXR9aW5zZXJ0TmV3QWZ0ZXIodCxuPSEwKXtyZXR1cm4gdD10aGlzLmdldFBhcmVudE9yVGhyb3coKS5pbnNlcnROZXdBZnRlcih0LG4pLFVyLiRpc0VsZW1lbnROb2RlKHQpPyhuPWF1KHRoaXMuX191cmwse3JlbDp0aGlzLl9fcmVsLHRhcmdldDp0aGlzLl9fdGFyZ2V0LHRpdGxlOnRoaXMuX190aXRsZX0pLHQuYXBwZW5kKG4pLG4pOm51bGx9Y2FuSW5zZXJ0VGV4dEJlZm9yZSgpe3JldHVybiExfWNhbkluc2VydFRleHRBZnRlcigpe3JldHVybiExfWNhbkJlRW1wdHkoKXtyZXR1cm4hMX1pc0lubGluZSgpe3JldHVybiEwfWV4dHJhY3RXaXRoQ2hpbGQodCxuKXtpZighVXIuJGlzUmFuZ2VTZWxlY3Rpb24obikpcmV0dXJuITE7dD1uLmFuY2hvci5nZXROb2RlKCk7bGV0IHI9bi5mb2N1cy5nZXROb2RlKCk7cmV0dXJuIHRoaXMuaXNQYXJlbnRPZih0KSYmdGhpcy5pc1BhcmVudE9mKHIpJiYwPG4uZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGh9fWZ1bmN0aW9uIHJBKGUpe2xldCB0PW51bGw7aWYoZ0MuaXNIVE1MQW5jaG9yRWxlbWVudChlKSl7bGV0IG49ZS50ZXh0Q29udGVudDtuIT09bnVsbCYmbiE9PSIiJiYodD1hdShlLmdldEF0dHJpYnV0ZSgiaHJlZiIpfHwiIix7cmVsOmUuZ2V0QXR0cmlidXRlKCJyZWwiKSx0YXJnZXQ6ZS5nZXRBdHRyaWJ1dGUoInRhcmdldCIpLHRpdGxlOmUuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpfSkpfXJldHVybntub2RlOnR9fWZ1bmN0aW9uIGF1KGUsdCl7cmV0dXJuIFVyLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgQXMoZSx0KSl9ZnVuY3Rpb24gTm8oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBBc31jbGFzcyBqdSBleHRlbmRzIEFze3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuImF1dG9saW5rIn1zdGF0aWMgY2xvbmUodCl7cmV0dXJuIG5ldyBqdSh0Ll9fdXJsLHtyZWw6dC5fX3JlbCx0YXJnZXQ6dC5fX3RhcmdldCx0aXRsZTp0Ll9fdGl0bGV9LHQuX19rZXkpfXN0YXRpYyBpbXBvcnRKU09OKHQpe2xldCBuPU9tKHQudXJsLHtyZWw6dC5yZWwsdGFyZ2V0OnQudGFyZ2V0LHRpdGxlOnQudGl0bGV9KTtyZXR1cm4gbi5zZXRGb3JtYXQodC5mb3JtYXQpLG4uc2V0SW5kZW50KHQuaW5kZW50KSxuLnNldERpcmVjdGlvbih0LmRpcmVjdGlvbiksbn1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJuIG51bGx9ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksdHlwZToiYXV0b2xpbmsiLHZlcnNpb246MX19aW5zZXJ0TmV3QWZ0ZXIodCxuPSEwKXtyZXR1cm4gdD10aGlzLmdldFBhcmVudE9yVGhyb3coKS5pbnNlcnROZXdBZnRlcih0LG4pLFVyLiRpc0VsZW1lbnROb2RlKHQpPyhuPU9tKHRoaXMuX191cmwse3JlbDp0aGlzLl9yZWwsdGFyZ2V0OnRoaXMuX190YXJnZXQsdGl0bGU6dGhpcy5fX3RpdGxlfSksdC5hcHBlbmQobiksbik6bnVsbH19ZnVuY3Rpb24gT20oZSx0KXtyZXR1cm4gVXIuJGFwcGx5Tm9kZVJlcGxhY2VtZW50KG5ldyBqdShlLHQpKX1sZXQgaUE9VXIuY3JlYXRlQ29tbWFuZCgiVE9HR0xFX0xJTktfQ09NTUFORCIpO2Z1bmN0aW9uIG9BKGUsdCl7Zm9yKDtlIT09bnVsbCYmKGU9ZS5nZXRQYXJlbnQoKSkhPT1udWxsJiYhdChlKTspO3JldHVybiBlfUVpLiRjcmVhdGVBdXRvTGlua05vZGU9T207RWkuJGNyZWF0ZUxpbmtOb2RlPWF1O0VpLiRpc0F1dG9MaW5rTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGp1fTtFaS4kaXNMaW5rTm9kZT1ObztFaS5BdXRvTGlua05vZGU9anU7RWkuTGlua05vZGU9QXM7RWkuVE9HR0xFX0xJTktfQ09NTUFORD1pQTtFaS50b2dnbGVMaW5rPWZ1bmN0aW9uKGUsdD17fSl7bGV0e3RhcmdldDpuLHRpdGxlOnJ9PXQsaT10LnJlbD09PXZvaWQgMD8ibm9yZWZlcnJlciI6dC5yZWw7aWYodD1Vci4kZ2V0U2VsZWN0aW9uKCksVXIuJGlzUmFuZ2VTZWxlY3Rpb24odCkpaWYodD10LmV4dHJhY3QoKSxlPT09bnVsbCl0LmZvckVhY2gobD0+e2lmKGw9bC5nZXRQYXJlbnQoKSxObyhsKSl7bGV0IHM9bC5nZXRDaGlsZHJlbigpO2ZvcihsZXQgYT0wO2E8cy5sZW5ndGg7YSsrKWwuaW5zZXJ0QmVmb3JlKHNbYV0pO2wucmVtb3ZlKCl9fSk7ZWxzZXtpZih0Lmxlbmd0aD09PTEpe3ZhciBvPXRbMF07aWYobz1ObyhvKT9vOm9BKG8sTm8pLG8hPT1udWxsKXtvLnNldFVSTChlKSxuIT09dm9pZCAwJiZvLnNldFRhcmdldChuKSxpIT09bnVsbCYmby5zZXRSZWwoaSksciE9PXZvaWQgMCYmby5zZXRUaXRsZShyKTtyZXR1cm59fWxldCBsPW51bGwscz1udWxsO3QuZm9yRWFjaChhPT57dmFyIHU9YS5nZXRQYXJlbnQoKTtpZih1IT09cyYmdSE9PW51bGwmJighVXIuJGlzRWxlbWVudE5vZGUoYSl8fGEuaXNJbmxpbmUoKSkpaWYoTm8odSkpcz11LHUuc2V0VVJMKGUpLG4hPT12b2lkIDAmJnUuc2V0VGFyZ2V0KG4pLGkhPT1udWxsJiZzLnNldFJlbChpKSxyIT09dm9pZCAwJiZzLnNldFRpdGxlKHIpO2Vsc2UgaWYodS5pcyhsKXx8KGw9dSxzPWF1KGUse3JlbDppLHRhcmdldDpufSksTm8odSk/YS5nZXRQcmV2aW91c1NpYmxpbmcoKT09PW51bGw/dS5pbnNlcnRCZWZvcmUocyk6dS5pbnNlcnRBZnRlcihzKTphLmluc2VydEJlZm9yZShzKSksTm8oYSkpe2lmKCFhLmlzKHMpKXtpZihzIT09bnVsbCl7dT1hLmdldENoaWxkcmVuKCk7Zm9yKGxldCBjPTA7Yzx1Lmxlbmd0aDtjKyspcy5hcHBlbmQodVtjXSl9YS5yZW1vdmUoKX19ZWxzZSBzIT09bnVsbCYmcy5hcHBlbmQoYSl9KX19O2NvbnN0IGxBPUVpO3ZhciBmcz1sQSx4bD1mcyxzQT1UcixhQT1GdCxfbD13ZSx1QT1wO21DLkxpbmtQbHVnaW49ZnVuY3Rpb24oe3ZhbGlkYXRlVXJsOmV9KXtsZXRbdF09c0EudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3JldHVybiB1QS51c2VFZmZlY3QoKCk9PntpZighdC5oYXNOb2RlcyhbeGwuTGlua05vZGVdKSl0aHJvdyBFcnJvcigiTGlua1BsdWdpbjogTGlua05vZGUgbm90IHJlZ2lzdGVyZWQgb24gZWRpdG9yIik7cmV0dXJuIGFBLm1lcmdlUmVnaXN0ZXIodC5yZWdpc3RlckNvbW1hbmQoeGwuVE9HR0xFX0xJTktfQ09NTUFORCxuPT57aWYobj09PW51bGwpcmV0dXJuIHhsLnRvZ2dsZUxpbmsobiksITA7aWYodHlwZW9mIG49PSJzdHJpbmciKXJldHVybiBlPT09dm9pZCAwfHxlKG4pPyh4bC50b2dnbGVMaW5rKG4pLCEwKTohMTtsZXR7dXJsOnIsdGFyZ2V0OmkscmVsOm8sdGl0bGU6bH09bjtyZXR1cm4geGwudG9nZ2xlTGluayhyLHtyZWw6byx0YXJnZXQ6aSx0aXRsZTpsfSksITB9LF9sLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSxlIT09dm9pZCAwP3QucmVnaXN0ZXJDb21tYW5kKF9sLlBBU1RFX0NPTU1BTkQsbj0+e2xldCByPV9sLiRnZXRTZWxlY3Rpb24oKTtpZighX2wuJGlzUmFuZ2VTZWxlY3Rpb24ocil8fHIuaXNDb2xsYXBzZWQoKXx8IShuIGluc3RhbmNlb2YgQ2xpcGJvYXJkRXZlbnQpfHxuLmNsaXBib2FyZERhdGE9PW51bGwpcmV0dXJuITE7bGV0IGk9bi5jbGlwYm9hcmREYXRhLmdldERhdGEoInRleHQiKTtyZXR1cm4gZShpKT9yLmdldE5vZGVzKCkuc29tZShvPT5fbC4kaXNFbGVtZW50Tm9kZShvKSk/ITE6KHQuZGlzcGF0Y2hDb21tYW5kKHhsLlRPR0dMRV9MSU5LX0NPTU1BTkQsaSksbi5wcmV2ZW50RGVmYXVsdCgpLCEwKTohMX0sX2wuQ09NTUFORF9QUklPUklUWV9MT1cpOigpPT57fSl9LFt0LGVdKSxudWxsfTtjb25zdCBjQT1tQzt2YXIgZEE9Y0E7ZnVuY3Rpb24gZkEoe2FyaWFBY3RpdmVEZXNjZW5kYW50OmUsYXJpYUF1dG9Db21wbGV0ZTp0LGFyaWFDb250cm9sczpuLGFyaWFEZXNjcmliZWRCeTpyLGFyaWFFeHBhbmRlZDppLGFyaWFMYWJlbDpvLGFyaWFMYWJlbGxlZEJ5OmwsYXJpYU11bHRpbGluZTpzLGFyaWFPd25zOmEsYXJpYVJlcXVpcmVkOnUsYXV0b0NhcGl0YWxpemU6YyxjbGFzc05hbWU6ZCxpZDpmLHJvbGU6aD0idGV4dGJveCIsc3BlbGxDaGVjazptPSEwLHN0eWxlOmcsdGFiSW5kZXg6UywiZGF0YS10ZXN0aWQiOnYsLi4ueX0pe2NvbnN0W19dPVRyLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKSxbdyxFXT1wLnVzZVN0YXRlKCExKSwkPXAudXNlQ2FsbGJhY2soQz0+e3ZhciBOO18uc2V0Um9vdEVsZW1lbnQoQyk7Y29uc3QgVD0oTj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidmFsLXVpIikpPT1udWxsP3ZvaWQgMDpOLnNoYWRvd1Jvb3Q7aWYoVCYmImdldFNlbGVjdGlvbiJpbiBUKXtfLl93aW5kb3c9VDtyZXR1cm59fSxbX10pO3JldHVybiBwLnVzZUxheW91dEVmZmVjdCgoKT0+KEUoXy5pc0VkaXRhYmxlKCkpLF8ucmVnaXN0ZXJFZGl0YWJsZUxpc3RlbmVyKEM9PntFKEMpfSkpLFtfXSkseC5qc3goImRpdiIsey4uLnksImFyaWEtYWN0aXZlZGVzY2VuZGFudCI6dz9lOnZvaWQgMCwiYXJpYS1hdXRvY29tcGxldGUiOnc/dDoibm9uZSIsImFyaWEtY29udHJvbHMiOnc/bjp2b2lkIDAsImFyaWEtZGVzY3JpYmVkYnkiOnIsImFyaWEtZXhwYW5kZWQiOncmJmg9PT0iY29tYm9ib3giPyEhaTp2b2lkIDAsImFyaWEtbGFiZWwiOm8sImFyaWEtbGFiZWxsZWRieSI6bCwiYXJpYS1tdWx0aWxpbmUiOnMsImFyaWEtb3ducyI6dz9hOnZvaWQgMCwiYXJpYS1yZWFkb25seSI6dz92b2lkIDA6ITAsImFyaWEtcmVxdWlyZWQiOnUsYXV0b0NhcGl0YWxpemU6YyxjbGFzc05hbWU6ZCxjb250ZW50RWRpdGFibGU6dywiZGF0YS10ZXN0aWQiOnYsaWQ6ZixyZWY6JCxyb2xlOmgsc3BlbGxDaGVjazptLHN0eWxlOmcsdGFiSW5kZXg6U30pfWZ1bmN0aW9uIGhBKHtjbGFzc05hbWU6ZX0pe3JldHVybiB4LmpzeChmQSx7Y2xhc3NOYW1lOmV9KX1jbGFzcyB6dSBleHRlbmRzIHdlLkRlY29yYXRvck5vZGV7Y29uc3RydWN0b3IodCxuKXtzdXBlcihuKSx0aGlzLl9fc3JjPXQuc3JjLHRoaXMuX19hbHRUZXh0PXQuYWx0VGV4dCx0aGlzLl9fd2lkdGg9dC53aWR0aCx0aGlzLl9faGVpZ2h0PXQuaGVpZ2h0fXN0YXRpYyBnZXRUeXBlKCl7cmV0dXJuImltYWdlIn1zdGF0aWMgY2xvbmUodCl7cmV0dXJuIG5ldyB6dSh7c3JjOnQuX19zcmMsYWx0VGV4dDp0Ll9fYWx0VGV4dCx3aWR0aDp0Ll9fd2lkdGgsaGVpZ2h0OnQuX19oZWlnaHR9KX1leHBvcnRKU09OKCl7cmV0dXJue2FsdFRleHQ6dGhpcy5fX2FsdFRleHQsaGVpZ2h0OnRoaXMuX193aWR0aCxzcmM6dGhpcy5fX3NyYyx0eXBlOiJpbWFnZSIsdmVyc2lvbjoxLHdpZHRoOnRoaXMuX193aWR0aH19c3RhdGljIGltcG9ydEpTT04odCl7cmV0dXJuIHZDKHQpfWNyZWF0ZURPTSgpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKX11cGRhdGVET00oKXtyZXR1cm4hMX1kZWNvcmF0ZSgpe3JldHVybiB4LmpzeChwQSx7c3JjOnRoaXMuX19zcmMsYWx0VGV4dDp0aGlzLl9fYWx0VGV4dCxlbXB0eTp0aGlzLl9fZW1wdHksaGVpZ2h0OnRoaXMuX19oZWlnaHQsbm9kZUtleTp0aGlzLmdldEtleSgpfSl9fWZ1bmN0aW9uIHBBKGUpe3JldHVybiB4LmpzeCgiaW1nIix7c3JjOmUuc3JjfSl9ZnVuY3Rpb24gdkMoZSl7cmV0dXJuIG5ldyB6dShlKX1mdW5jdGlvbiBtQSgpe2NvbnN0W2VdPVRyLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntlLmZvY3VzKCl9LFtlXSksbnVsbH1jb25zdCB5Qz13ZS5jcmVhdGVDb21tYW5kKCJJTlNFUlRfSU1BR0VfQ09NTUFORCIpO2Z1bmN0aW9uIGdBKCl7Y29uc3RbZV09VHIudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2lmKCFlLmhhc05vZGVzKFt6dV0pKXRocm93IG5ldyBFcnJvcigiSW1hZ2VzUGx1Z2luOiBJbWFnZU5vZGUgbm90IHJlZ2lzdGVyZWQgb24gZWRpdG9yIik7cmV0dXJuIEZ0Lm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlckNvbW1hbmQoeUMsdD0+e2NvbnN0IG49dkModCk7cmV0dXJuIHdlLiRpbnNlcnROb2Rlcyhbbl0pLHdlLiRpc1Jvb3RPclNoYWRvd1Jvb3Qobi5nZXRQYXJlbnRPclRocm93KCkpJiZGdC4kd3JhcE5vZGVJbkVsZW1lbnQobix3ZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSkuc2VsZWN0RW5kKCksITB9LHdlLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSl9LFtlXSksbnVsbH1jb25zdCB2QT0oe2NsYXNzTmFtZTplfSk9PnguanN4cygic3ZnIix7aGVpZ2h0OjEyLHdpZHRoOjEyLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNsYXNzTmFtZTplLGNoaWxkcmVuOlt4LmpzeCgicGF0aCIse2Q6Ik02IDRoOGE0IDQgMCAwIDEgNCA0IDQgNCAwIDAgMS00IDRINnoifSkseC5qc3goInBhdGgiLHtkOiJNNiAxMmg5YTQgNCAwIDAgMSA0IDQgNCA0IDAgMCAxLTQgNEg2eiJ9KV19KSx5QT12QSx4QT0oe2NsYXNzTmFtZTplfSk9PnguanN4cygic3ZnIix7eG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix2aWV3Qm94OiIwIDAgMjQgMjQiLGZpbGw6Im5vbmUiLHN0cm9rZToiY3VycmVudENvbG9yIixzdHJva2VXaWR0aDoiMiIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCIsY2xhc3NOYW1lOmUsd2lkdGg6MTIsaGVpZ2h0OjEyLGNoaWxkcmVuOlt4LmpzeCgibGluZSIse3gxOiIxOSIseTE6IjQiLHgyOiIxMCIseTI6IjQifSkseC5qc3goImxpbmUiLHt4MToiMTQiLHkxOiIyMCIseDI6IjUiLHkyOiIyMCJ9KSx4LmpzeCgibGluZSIse3gxOiIxNSIseTE6IjQiLHgyOiI5Iix5MjoiMjAifSldfSksX0E9eEEsd0E9KHtjbGFzc05hbWU6ZX0pPT54LmpzeCgic3ZnIix7eG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix2aWV3Qm94OiIwIDAgMjQgMjQiLHN0cm9rZToiY3VycmVudENvbG9yIixzdHJva2VXaWR0aDoiMSIsY2xhc3NOYW1lOmUsd2lkdGg6MTIsaGVpZ2h0OjEyLGNoaWxkcmVuOnguanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGQ6Ik0xMywxNSBMMTMsMjEgQzEzLDIxLjU1MjI4NDcgMTIuNTUyMjg0NywyMiAxMiwyMiBDMTEuNDQ3NzE1MywyMiAxMSwyMS41NTIyODQ3IDExLDIxIEwxMSwxNSBMMTMsMTUgWiBNMywxMyBDMi40NDc3MTUyNSwxMyAyLDEyLjU1MjI4NDcgMiwxMiBDMiwxMS40NDc3MTUzIDIuNDQ3NzE1MjUsMTEgMywxMSBMMjEsMTEgQzIxLjU1MjI4NDcsMTEgMjIsMTEuNDQ3NzE1MyAyMiwxMiBDMjIsMTIuNTUyMjg0NyAyMS41NTIyODQ3LDEzIDIxLDEzIEwzLDEzIFogTTE5LDIgQzE5LjU1MjI4NDcsMiAyMCwyLjQ0NzcxNTI1IDIwLDMgQzIwLDMuNTUyMjg0NzUgMTkuNTUyMjg0Nyw0IDE5LDQgTDEzLDQgTDEzLDkgTDExLDkgTDExLDQgTDUsNCBDNC40NDc3MTUyNSw0IDQsMy41NTIyODQ3NSA0LDMgQzQsMi40NDc3MTUyNSA0LjQ0NzcxNTI1LDIgNSwyIEwxOSwyIFoifSl9KSxTQT13QSxFQT0oe3ZhcmlhbnQ6ZT0icHJpbWFyeSIsb25DbGljazp0LGNoaWxkcmVuOm4saWNvbjpyLGRpc2FibGVkOmk9ITF9KT0+eC5qc3goImJ1dHRvbiIse2Rpc2FibGVkOmksY2xhc3NOYW1lOndmKCJmb250LXNhbnMgZm9udC1bMTJweF0gdHJhY2tpbmctWzAuMDRlbV0gcHktMSBweC0yIHJvdW5kZWQgd2hpdGVzcGFjZS1ub3dyYXAgZ3JvdXAgcmVsYXRpdmUgdGV4dC1wcmltYXJ5Iix7ImZvbnQtYm9sZCI6ZT09PSJwcmltYXJ5IiwidGV4dC1maWxsIGRpc2FibGVkOmJnLWZpbGwgZGlzYWJsZWQ6dGV4dC1iYWNrZ3JvdW5kIjplPT09InByaW1hcnkiLCJib3JkZXIgYm9yZGVyLXByaW1hcnkgdGV4dC1wcmltYXJ5IGhvdmVyOmJvcmRlci1oaWdobGlnaHQgaG92ZXI6dGV4dC1oaWdobGlnaHQgZGlzYWJsZWQ6YmctZmlsbCBkaXNhYmxlZDp0ZXh0LWJhY2tncm91bmQiOmUhPT0icHJpbWFyeSJ9KSxvbkNsaWNrOnQsY2hpbGRyZW46eC5qc3hzKCJzcGFuIix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMiIsY2hpbGRyZW46W3ImJnIsbl19KX0pLFJvPUVBLENBPSh7Y2xhc3NOYW1lOmV9KT0+eC5qc3hzKCJzdmciLHt3aWR0aDoiMTAiLGhlaWdodDoiMTAiLHZpZXdCb3g6IjAgMCAxMiAxMiIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjbGFzc05hbWU6ZSxjaGlsZHJlbjpbeC5qc3goInBhdGgiLHtmaWxsUnVsZToiZXZlbm9kZCIsY2xpcFJ1bGU6ImV2ZW5vZGQiLGQ6Ik0zLjcwNzMzIDEuMDAwMTVMOC43Nzg0IDYuMDcxMjFMOC4wNzEyOSA2Ljc3ODMyTDMuMDAwMjIgMS43MDcyNUwzLjcwNzMzIDEuMDAwMTVaIixmaWxsOiJjdXJyZW50Q29sb3IifSkseC5qc3goInBhdGgiLHtmaWxsUnVsZToiZXZlbm9kZCIsY2xpcFJ1bGU6ImV2ZW5vZGQiLGQ6Ik0zLjAwMDE1IDEwLjQ3MDlMOC4wNzEyMSA1LjM5OTgzTDguNzc4MzIgNi4xMDY5M0wzLjcwNzI1IDExLjE3OEwzLjAwMDE1IDEwLjQ3MDlaIixmaWxsOiJjdXJyZW50Q29sb3IifSldfSksa0E9Q0EseEM9cmUuY3JlYXRlQ29udGV4dCh7Z2V0IGFwaSgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IHNlc3Npb24oKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCB0aGVtZSgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IHNldFRoZW1lKCl7dGhyb3cgRXJyb3IoIlZhbE92ZXJsYXlDb250ZXh0IG5vdCBmb3VuZC4gRW5zdXJlIGNvbXBvbmVudHMgYXJlIHdyYXBwZWQgYnkgVmFsT3ZlcmxheVByb3ZpZGVyISIpfSxnZXQgZWRpdE1vZGUoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCBzZXRFZGl0TW9kZSgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IGhpZ2hsaWdodCgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IHNldEhpZ2hsaWdodCgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IHNldFdpbmRvd1NpemUoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCB3aW5kb3dTaXplKCl7dGhyb3cgRXJyb3IoIlZhbE92ZXJsYXlDb250ZXh0IG5vdCBmb3VuZC4gRW5zdXJlIGNvbXBvbmVudHMgYXJlIHdyYXBwZWQgYnkgVmFsT3ZlcmxheVByb3ZpZGVyISIpfX0pO2Z1bmN0aW9uIEF2KCl7cmV0dXJuIHJlLnVzZUNvbnRleHQoeEMpfWNvbnN0ICRBPSh7b3B0aW9uczplLG9uQ2hhbmdlOnQsbGFiZWw6bixpY29uOnJ9KT0+e2NvbnN0W2ksb109cC51c2VTdGF0ZSghMSksbD1wLnVzZVJlZihudWxsKSxbcyxhXT1wLnVzZVN0YXRlKDApLHt3aW5kb3dTaXplOnV9PUF2KCksYz0oKT0+e28oIWkpfSxkPShmLGgpPT57YShoKSx0KGYpLG8oITEpfTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBmPWg9PntpJiZsLmN1cnJlbnQmJiFsLmN1cnJlbnQuY29udGFpbnMoaC50YXJnZXQpJiZvKCExKX07cmV0dXJuIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmKSwoKT0+e2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIixmKX19LFtdKSx4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ0ZXh0LVsxMnB4XSIscmVmOmwsY2hpbGRyZW46eC5qc3goUm8se29uQ2xpY2s6Zj0+e2YucHJldmVudERlZmF1bHQoKSxjKCl9LGljb246eC5qc3goa0Ese2NsYXNzTmFtZTpgcm90YXRlLVstOTBkZWddIHRyYW5zaXRpb24tdHJhbnNmb3JtIGR1cmF0aW9uLTE1MCBlYXNlLWluLW91dCAke2k/IiI6InJvdGF0ZS1bOTBkZWddIn1gfSksY2hpbGRyZW46eC5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InJlbGF0aXZlIixjaGlsZHJlbjpbeC5qc3hzKCJzcGFuIix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMSIsY2hpbGRyZW46W24sciYmcl19KSxpJiZ4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJhYnNvbHV0ZSAtdG9wLVs0cHhdIG92ZXJmbG93LXNjcm9sbCBzaGFkb3ctbGcgLWxlZnQtMiB0ZXh0LXByaW1hcnkgdy1maXQgei1vdmVybGF5IixzdHlsZTp7bWF4SGVpZ2h0OnU9PW51bGw/dm9pZCAwOnUuaW5uZXJIZWlnaHR9LGNoaWxkcmVuOnguanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1jb2wgIixjaGlsZHJlbjplPT1udWxsP3ZvaWQgMDplLm1hcCgoZixoKT0+eC5qc3goImJ1dHRvbiIse29uQ2xpY2s6bT0+e20ucHJldmVudERlZmF1bHQoKSxkKGYsaCl9LGNsYXNzTmFtZTpgdGV4dC1sZWZ0IHB4LTIgcHktMSBob3Zlcjp0ZXh0LWhpZ2hsaWdodCAgJHtoPT09cyYmImZvbnQtYm9sZCB0cnVuY2F0ZSJ9YCxjaGlsZHJlbjpmfSxmKSl9KX0pXX0pfSl9KX0sYkE9JEEsVEE9bmV3IFRleHRFbmNvZGVyO2Z1bmN0aW9uIF9DKGUpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e3ZhciBvO2NvbnN0IHI9KG89ZS5jdXJyZW50VGFyZ2V0LmZpbGVzKT09bnVsbD92b2lkIDA6b1swXSxpPW5ldyBGaWxlUmVhZGVyO2kuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKCk9Pntjb25zdCBsPWkucmVzdWx0O2lmKHR5cGVvZiBsPT0ic3RyaW5nIil7Y29uc3Qgcz1uZXcgSW1hZ2U7cy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoKT0+e2NvbnN0IGE9am4uZ2V0U0hBMjU2SGFzaChUQS5lbmNvZGUobCkpO2lmKHMubmF0dXJhbFdpZHRoJiZzLm5hdHVyYWxIZWlnaHQpe2NvbnN0IHU9ZXYobCk7dCh7c3JjOmwsd2lkdGg6cy5uYXR1cmFsV2lkdGgsaGVpZ2h0OnMubmF0dXJhbEhlaWdodCxmaWxlbmFtZTpyPT1udWxsP3ZvaWQgMDpyLm5hbWUsc2hhMjU2OmEsbWltZVR5cGU6dSxmaWxlRXh0OnUmJnR2KHUpfSl9ZWxzZSB0KHtzcmM6bCxmaWxlbmFtZTpyPT1udWxsP3ZvaWQgMDpyLm5hbWUsc2hhMjU2OmF9KX0pLHMuc3JjPWx9ZWxzZSBuKGw/e21lc3NhZ2U6IlVuZXhwZWN0ZWQgaW1hZ2UgcmVzdWx0IHR5cGUiLHJlc3VsdDpsfTp7bWVzc2FnZToiRW1wdHkgcmVzdWx0In0pfSksciYmaS5yZWFkQXNEYXRhVVJMKHIpfSl9ZnVuY3Rpb24gd0MoZSl7Y29uc3QgdD1lLmFuY2hvcixuPWUuZm9jdXMscj1lLmFuY2hvci5nZXROb2RlKCksaT1lLmZvY3VzLmdldE5vZGUoKTtyZXR1cm4gcj09PWk/cjplLmlzQmFja3dhcmQoKT9sby4kaXNBdE5vZGVFbmQobik/cjppOmxvLiRpc0F0Tm9kZUVuZCh0KT9yOml9ZnVuY3Rpb24gTkEoKXtjb25zdFtlXT1Uci51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT5GdC5tZXJnZVJlZ2lzdGVyKGUucmVnaXN0ZXJDb21tYW5kKHdlLkNMSUNLX0NPTU1BTkQsdD0+e2NvbnN0IG49d2UuJGdldFNlbGVjdGlvbigpO2lmKHdlLiRpc1JhbmdlU2VsZWN0aW9uKG4pKXtjb25zdCByPXdDKG4pLGk9RnQuJGZpbmRNYXRjaGluZ1BhcmVudChyLGZzLiRpc0xpbmtOb2RlKTtpZihmcy4kaXNMaW5rTm9kZShpKSYmKHQubWV0YUtleXx8dC5jdHJsS2V5KSlyZXR1cm4gd2luZG93Lm9wZW4oaS5nZXRVUkwoKSwiX2JsYW5rIiksITB9cmV0dXJuITF9LHdlLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSksW10pLG51bGx9dmFyIFNDPXtleHBvcnRzOnt9fSxSQT0iU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQiLE9BPVJBLFBBPU9BO2Z1bmN0aW9uIEVDKCl7fWZ1bmN0aW9uIENDKCl7fUNDLnJlc2V0V2FybmluZ0NhY2hlPUVDO3ZhciBBQT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUocixpLG8sbCxzLGEpe2lmKGEhPT1QQSl7dmFyIHU9bmV3IEVycm9yKCJDYWxsaW5nIFByb3BUeXBlcyB2YWxpZGF0b3JzIGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiBVc2UgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKCkgdG8gY2FsbCB0aGVtLiBSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzIik7dGhyb3cgdS5uYW1lPSJJbnZhcmlhbnQgVmlvbGF0aW9uIix1fX1lLmlzUmVxdWlyZWQ9ZTtmdW5jdGlvbiB0KCl7cmV0dXJuIGV9dmFyIG49e2FycmF5OmUsYmlnaW50OmUsYm9vbDplLGZ1bmM6ZSxudW1iZXI6ZSxvYmplY3Q6ZSxzdHJpbmc6ZSxzeW1ib2w6ZSxhbnk6ZSxhcnJheU9mOnQsZWxlbWVudDplLGVsZW1lbnRUeXBlOmUsaW5zdGFuY2VPZjp0LG5vZGU6ZSxvYmplY3RPZjp0LG9uZU9mOnQsb25lT2ZUeXBlOnQsc2hhcGU6dCxleGFjdDp0LGNoZWNrUHJvcFR5cGVzOkNDLHJlc2V0V2FybmluZ0NhY2hlOkVDfTtyZXR1cm4gbi5Qcm9wVHlwZXM9bixufTtTQy5leHBvcnRzPUFBKCk7dmFyIE1BPVNDLmV4cG9ydHM7Y29uc3QgdHI9JHUoTUEpO2Z1bmN0aW9uIFBtKCl7cmV0dXJuIFBtPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9LFBtLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBEQShlLHQpe2lmKGU9PW51bGwpcmV0dXJue307dmFyIG49SUEoZSx0KSxyLGk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG89T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtmb3IoaT0wO2k8by5sZW5ndGg7aSsrKXI9b1tpXSwhKHQuaW5kZXhPZihyKT49MCkmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLHIpJiYobltyXT1lW3JdKX1yZXR1cm4gbn1mdW5jdGlvbiBJQShlLHQpe2lmKGU9PW51bGwpcmV0dXJue307dmFyIG49e30scj1PYmplY3Qua2V5cyhlKSxpLG87Zm9yKG89MDtvPHIubGVuZ3RoO28rKylpPXJbb10sISh0LmluZGV4T2YoaSk+PTApJiYobltpXT1lW2ldKTtyZXR1cm4gbn12YXIgTXY9cC5mb3J3YXJkUmVmKGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jb2xvcixyPW49PT12b2lkIDA/ImN1cnJlbnRDb2xvciI6bixpPWUuc2l6ZSxvPWk9PT12b2lkIDA/MjQ6aSxsPURBKGUsWyJjb2xvciIsInNpemUiXSk7cmV0dXJuIHJlLmNyZWF0ZUVsZW1lbnQoInN2ZyIsUG0oe3JlZjp0LHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsd2lkdGg6byxoZWlnaHQ6byx2aWV3Qm94OiIwIDAgMjQgMjQiLGZpbGw6Im5vbmUiLHN0cm9rZTpyLHN0cm9rZVdpZHRoOiIyIixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIn0sbCkscmUuY3JlYXRlRWxlbWVudCgicG9seWxpbmUiLHtwb2ludHM6IjIwIDYgOSAxNyA0IDEyIn0pKX0pO012LnByb3BUeXBlcz17Y29sb3I6dHIuc3RyaW5nLHNpemU6dHIub25lT2ZUeXBlKFt0ci5zdHJpbmcsdHIubnVtYmVyXSl9O012LmRpc3BsYXlOYW1lPSJDaGVjayI7Y29uc3QgTEE9TXY7ZnVuY3Rpb24gQW0oKXtyZXR1cm4gQW09T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sQW0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGpBKGUsdCl7aWYoZT09bnVsbClyZXR1cm57fTt2YXIgbj16QShlLHQpLHIsaTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgbz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO2ZvcihpPTA7aTxvLmxlbmd0aDtpKyspcj1vW2ldLCEodC5pbmRleE9mKHIpPj0wKSYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUscikmJihuW3JdPWVbcl0pfXJldHVybiBufWZ1bmN0aW9uIHpBKGUsdCl7aWYoZT09bnVsbClyZXR1cm57fTt2YXIgbj17fSxyPU9iamVjdC5rZXlzKGUpLGksbztmb3Iobz0wO288ci5sZW5ndGg7bysrKWk9cltvXSwhKHQuaW5kZXhPZihpKT49MCkmJihuW2ldPWVbaV0pO3JldHVybiBufXZhciBEdj1wLmZvcndhcmRSZWYoZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNvbG9yLHI9bj09PXZvaWQgMD8iY3VycmVudENvbG9yIjpuLGk9ZS5zaXplLG89aT09PXZvaWQgMD8yNDppLGw9akEoZSxbImNvbG9yIiwic2l6ZSJdKTtyZXR1cm4gcmUuY3JlYXRlRWxlbWVudCgic3ZnIixBbSh7cmVmOnQseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix3aWR0aDpvLGhlaWdodDpvLHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOnIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQifSxsKSxyZS5jcmVhdGVFbGVtZW50KCJwYXRoIix7ZDoiTTEwIDEzYTUgNSAwIDAgMCA3LjU0LjU0bDMtM2E1IDUgMCAwIDAtNy4wNy03LjA3bC0xLjcyIDEuNzEifSkscmUuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik0xNCAxMWE1IDUgMCAwIDAtNy41NC0uNTRsLTMgM2E1IDUgMCAwIDAgNy4wNyA3LjA3bDEuNzEtMS43MSJ9KSl9KTtEdi5wcm9wVHlwZXM9e2NvbG9yOnRyLnN0cmluZyxzaXplOnRyLm9uZU9mVHlwZShbdHIuc3RyaW5nLHRyLm51bWJlcl0pfTtEdi5kaXNwbGF5TmFtZT0iTGluayI7Y29uc3QgRkE9RHY7ZnVuY3Rpb24gTW0oKXtyZXR1cm4gTW09T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sTW0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIEJBKGUsdCl7aWYoZT09bnVsbClyZXR1cm57fTt2YXIgbj1VQShlLHQpLHIsaTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgbz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO2ZvcihpPTA7aTxvLmxlbmd0aDtpKyspcj1vW2ldLCEodC5pbmRleE9mKHIpPj0wKSYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUscikmJihuW3JdPWVbcl0pfXJldHVybiBufWZ1bmN0aW9uIFVBKGUsdCl7aWYoZT09bnVsbClyZXR1cm57fTt2YXIgbj17fSxyPU9iamVjdC5rZXlzKGUpLGksbztmb3Iobz0wO288ci5sZW5ndGg7bysrKWk9cltvXSwhKHQuaW5kZXhPZihpKT49MCkmJihuW2ldPWVbaV0pO3JldHVybiBufXZhciBJdj1wLmZvcndhcmRSZWYoZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNvbG9yLHI9bj09PXZvaWQgMD8iY3VycmVudENvbG9yIjpuLGk9ZS5zaXplLG89aT09PXZvaWQgMD8yNDppLGw9QkEoZSxbImNvbG9yIiwic2l6ZSJdKTtyZXR1cm4gcmUuY3JlYXRlRWxlbWVudCgic3ZnIixNbSh7cmVmOnQseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix3aWR0aDpvLGhlaWdodDpvLHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOnIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQifSxsKSxyZS5jcmVhdGVFbGVtZW50KCJsaW5lIix7eDE6IjE4Iix5MToiNiIseDI6IjYiLHkyOiIxOCJ9KSxyZS5jcmVhdGVFbGVtZW50KCJsaW5lIix7eDE6IjYiLHkxOiI2Iix4MjoiMTgiLHkyOiIxOCJ9KSl9KTtJdi5wcm9wVHlwZXM9e2NvbG9yOnRyLnN0cmluZyxzaXplOnRyLm9uZU9mVHlwZShbdHIuc3RyaW5nLHRyLm51bWJlcl0pfTtJdi5kaXNwbGF5TmFtZT0iWCI7Y29uc3QgV0E9SXYsVkE9KHtmb250U2l6ZXM6ZSxmb250c0ZhbWlsaWVzOnQsb25FZGl0b3I6bixjb2xvcnM6cn0pPT57Y29uc3RbaV09VHIudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3AudXNlRWZmZWN0KCgpPT57biYmbihpKX0sW2ldKTtjb25zdFtvLGxdPXAudXNlU3RhdGUoaSksW3MsYV09cC51c2VTdGF0ZShudWxsKSxbdSxjXT1wLnVzZVN0YXRlKCExKSxbZCxmXT1wLnVzZVN0YXRlKCExKSxbaCxtXT1wLnVzZVN0YXRlKCExKSxbZyxTXT1wLnVzZVN0YXRlKCExKTtwLnVzZVN0YXRlKCIxNXB4IikscC51c2VTdGF0ZSgiIzAwMCIpLHAudXNlU3RhdGUoIlNhbnMiKTtjb25zdFt2LHldPXAudXNlU3RhdGUoInBhcmFncmFwaCIpO3AudXNlU3RhdGUoITEpLHAudXNlU3RhdGUoITEpLHAudXNlU3RhdGUoInVybCIpLHAudXNlU3RhdGUobnVsbCk7Y29uc3RbXyx3XT1wLnVzZVN0YXRlKG51bGwpLEU9Uj0+e2kuZGlzcGF0Y2hDb21tYW5kKGZzLlRPR0dMRV9MSU5LX0NPTU1BTkQsUil9LCQ9e3BhcmFncmFwaDoiTm9ybWFsIixoMToiSGVhZGluZyAxIixoMjoiSGVhZGluZyAyIixoMzoiSGVhZGluZyAzIixoNDoiSGVhZGluZyA0IixoNToiSGVhZGluZyA1IixoNjoiSGVhZGluZyA2IixudW1iZXI6Ik51bWJlcmVkIExpc3QiLGJ1bGxldDoiQnVsbGV0ZWQgTGlzdCJ9LEM9e307Zm9yKGNvbnN0IFIgaW4gJClDWyRbUl1dPVI7Y29uc3QgVD1wLnVzZUNhbGxiYWNrKCgpPT57Y29uc3QgUj13ZS4kZ2V0U2VsZWN0aW9uKCk7aWYod2UuJGlzUmFuZ2VTZWxlY3Rpb24oUikpe2NvbnN0IEQ9Ui5hbmNob3IuZ2V0Tm9kZSgpO2xldCBGPUQuZ2V0S2V5KCk9PT0icm9vdCI/RDpGdC4kZmluZE1hdGNoaW5nUGFyZW50KEQsQT0+e2NvbnN0IGs9QS5nZXRQYXJlbnQoKTtyZXR1cm4gayE9PW51bGwmJndlLiRpc1Jvb3RPclNoYWRvd1Jvb3Qoayl9KTtGPT09bnVsbCYmKEY9RC5nZXRUb3BMZXZlbEVsZW1lbnRPclRocm93KCkpO2NvbnN0IHNlPXdDKFIpLFY9RnQuJGZpbmRNYXRjaGluZ1BhcmVudChzZSxmcy4kaXNMaW5rTm9kZSk7aWYoViE9PW51bGwpe2NvbnN0IEE9Vi5nZXRVUkwoKTt3KEEpfWVsc2UgdyhudWxsKTtjb25zdCBLPUYuZ2V0S2V5KCksTz1vLmdldEVsZW1lbnRCeUtleShLKTtpZihjKFIuaGFzRm9ybWF0KCJib2xkIikpLGYoUi5oYXNGb3JtYXQoIml0YWxpYyIpKSxtKFIuaGFzRm9ybWF0KCJzdHJpa2V0aHJvdWdoIikpLFMoUi5oYXNGb3JtYXQoInVuZGVybGluZSIpKSxPIT09bnVsbClpZihhKEspLGppLiRpc0xpc3ROb2RlKEYpKXtjb25zdCBBPUZ0LiRnZXROZWFyZXN0Tm9kZU9mVHlwZShELGppLkxpc3ROb2RlKSxrPUE/QS5nZXRMaXN0VHlwZSgpOkYuZ2V0TGlzdFR5cGUoKTt5KGspfWVsc2V7Y29uc3QgQT1PYS4kaXNIZWFkaW5nTm9kZShGKT9GLmdldFRhZygpOkYuZ2V0VHlwZSgpO0EgaW4gJCYmeShBKX19fSxbb10pO3AudXNlRWZmZWN0KCgpPT5GdC5tZXJnZVJlZ2lzdGVyKGkucmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcigoe2VkaXRvclN0YXRlOlJ9KT0+e1IucmVhZCgoKT0+e1QoKX0pfSkpLFtULG8saV0pLHAudXNlRWZmZWN0KCgpPT5pLnJlZ2lzdGVyQ29tbWFuZCh3ZS5TRUxFQ1RJT05fQ0hBTkdFX0NPTU1BTkQsKFIsRCk9PihUKCksbChEKSwhMSksd2UuQ09NTUFORF9QUklPUklUWV9DUklUSUNBTCksW2ksVF0pO2NvbnN0IE49Uj0+e1siaDEiLCJoMiIsImgzIiwiaDQiLCJoNSIsImg2Il0uaW5jbHVkZXMoUik/diE9PVImJmkudXBkYXRlKCgpPT57Y29uc3QgRD13ZS4kZ2V0U2VsZWN0aW9uKCk7d2UuJGlzUmFuZ2VTZWxlY3Rpb24oRCkmJmxvLiRzZXRCbG9ja3NUeXBlKEQsKCk9Pk9hLiRjcmVhdGVIZWFkaW5nTm9kZShSKSl9KTpSPT09InBhcmFncmFwaCImJnYhPT0icGFyYWdyYXBoIj9pLnVwZGF0ZSgoKT0+e2NvbnN0IEQ9d2UuJGdldFNlbGVjdGlvbigpOyh3ZS4kaXNSYW5nZVNlbGVjdGlvbihEKXx8d2UuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKEQpKSYmbG8uJHNldEJsb2Nrc1R5cGUoRCwoKT0+d2UuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKSl9KTpSPT09Im51bWJlciImJnYhPT0ibnVtYmVyIj9pLmRpc3BhdGNoQ29tbWFuZChqaS5JTlNFUlRfT1JERVJFRF9MSVNUX0NPTU1BTkQsdm9pZCAwKTpSPT09ImJ1bGxldCImJnYhPT0iYnVsbGV0Ij9pLmRpc3BhdGNoQ29tbWFuZChqaS5JTlNFUlRfVU5PUkRFUkVEX0xJU1RfQ09NTUFORCx2b2lkIDApOmkuZGlzcGF0Y2hDb21tYW5kKGppLlJFTU9WRV9MSVNUX0NPTU1BTkQsdm9pZCAwKX07cmV0dXJuIHAudXNlQ2FsbGJhY2soKCk9PntpLnVwZGF0ZSgoKT0+e2NvbnN0IFI9d2UuJGdldFNlbGVjdGlvbigpO2lmKHdlLiRpc1JhbmdlU2VsZWN0aW9uKFIpKXtjb25zdCBEPVIuYW5jaG9yLEY9Ui5mb2N1cyxzZT1SLmdldE5vZGVzKCk7aWYoRC5rZXk9PT1GLmtleSYmRC5vZmZzZXQ9PT1GLm9mZnNldClyZXR1cm47c2UuZm9yRWFjaCgoVixLKT0+e3dlLiRpc1RleHROb2RlKFYpPyhLPT09MCYmRC5vZmZzZXQhPT0wJiYoVj1WLnNwbGl0VGV4dChELm9mZnNldClbMV18fFYpLEs9PT1zZS5sZW5ndGgtMSYmKFY9Vi5zcGxpdFRleHQoRi5vZmZzZXQpWzBdfHxWKSxWLl9fc3R5bGUhPT0iIiYmVi5zZXRTdHlsZSgiIiksVi5fX2Zvcm1hdCE9PTAmJihWLnNldEZvcm1hdCgwKSxGdC4kZ2V0TmVhcmVzdEJsb2NrRWxlbWVudEFuY2VzdG9yT3JUaHJvdyhWKS5zZXRGb3JtYXQoIiIpKSk6T2EuJGlzSGVhZGluZ05vZGUoVikmJlYucmVwbGFjZSh3ZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpLCEwKX0pfX0pfSxbb10pLHguanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJzdGlja3kgdG9wLTAgZmxleCBmbGV4LWNvbCBweC00IHB5LTIgYm9yZGVyLWIgYmFja2Ryb3AtYmx1ci0zeGwgYmctYmFja2dyb3VuZC8xMCBib3JkZXItaGlnaGxpZ2h0IixjaGlsZHJlbjpbeC5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1yb3cgZ2FwLTEiLGNoaWxkcmVuOlt4LmpzeChiQSx7b3B0aW9uczpPYmplY3QudmFsdWVzKCQpLGxhYmVsOiRbdl0/P3YrIiAobm90IHN1cHBvcnRlZCkiLG9uQ2hhbmdlOlI9PntOKENbUl0pfX0pLHguanN4KFJvLHt2YXJpYW50OiJwcmltYXJ5IixvbkNsaWNrOlI9PntSLnByZXZlbnREZWZhdWx0KCksaS5kaXNwYXRjaENvbW1hbmQod2UuRk9STUFUX1RFWFRfQ09NTUFORCwiYm9sZCIpfSxhY3RpdmU6dSxpY29uOnguanN4KHlBLHtjbGFzc05hbWU6YCR7dSYmInN0cm9rZS1bM3B4XSJ9YH0pfSkseC5qc3goUm8se2FjdGl2ZTpoLG9uQ2xpY2s6Uj0+e1IucHJldmVudERlZmF1bHQoKSxpLmRpc3BhdGNoQ29tbWFuZCh3ZS5GT1JNQVRfVEVYVF9DT01NQU5ELCJzdHJpa2V0aHJvdWdoIil9LGljb246eC5qc3goU0Ese2NsYXNzTmFtZTpgJHtoJiYic3Ryb2tlLVsycHhdIn1gfSl9KSx4LmpzeChSbyx7YWN0aXZlOmQsb25DbGljazpSPT57Ui5wcmV2ZW50RGVmYXVsdCgpLGkuZGlzcGF0Y2hDb21tYW5kKHdlLkZPUk1BVF9URVhUX0NPTU1BTkQsIml0YWxpYyIpfSxpY29uOnguanN4KF9BLHtjbGFzc05hbWU6YCR7ZCYmInN0cm9rZS1bM3B4XSJ9YH0pfSkseC5qc3goUm8se2FjdGl2ZTpfIT09bnVsbCxvbkNsaWNrOlI9PntSLnByZXZlbnREZWZhdWx0KCksdygiIiksRSgiIil9LGljb246eC5qc3goRkEse3dpZHRoOjEyLGhlaWdodDoxMixjbGFzc05hbWU6YCR7XyE9PW51bGwmJiJzdHJva2UtWzNweF0ifWB9KX0pLHguanN4cygibGFiZWwiLHtjbGFzc05hbWU6ImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGN1cnNvci1wb2ludGVyIixjaGlsZHJlbjpbeC5qc3goZ1Mse30pLHguanN4KCJpbnB1dCIse3R5cGU6ImZpbGUiLGhpZGRlbjohMCxvbkNoYW5nZTpSPT57Ui5wcmV2ZW50RGVmYXVsdCgpLF9DKFIpLnRoZW4oRD0+e2kuZGlzcGF0Y2hDb21tYW5kKHlDLHsuLi5EfSl9KS5jYXRjaChEPT57Y29uc29sZS5lcnJvcigiRXJyb3IgcmVhZGluZyBpbWFnZSIsRCl9KX19KV19KV19KSxfIT09bnVsbCYmeC5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1yb3cgcC0yIixjaGlsZHJlbjpbeC5qc3goImlucHV0Iix7dHlwZToidGV4dCIscGxhY2Vob2xkZXI6IkVudGVyIFVSTCIsY2xhc3NOYW1lOiJ3LTEvMyBweC0yIHRleHQtcHJpbWFyeSIsdmFsdWU6XyxvbkNoYW5nZTpSPT57Ui5wcmV2ZW50RGVmYXVsdCgpLHcoUi50YXJnZXQudmFsdWUpfX0pLHguanN4KFJvLHt2YXJpYW50OiJwcmltYXJ5IixvbkNsaWNrOlI9PntSLnByZXZlbnREZWZhdWx0KCksRShffHxudWxsKX0saWNvbjp4LmpzeChMQSx7c2l6ZToxNH0pfSkseC5qc3goUm8se3ZhcmlhbnQ6InByaW1hcnkiLG9uQ2xpY2s6Uj0+e1IucHJldmVudERlZmF1bHQoKSxFKG51bGwpfSxpY29uOnguanN4KFdBLHtzaXplOjE0fSl9KV19KV19KX0sSEE9VkE7ZnVuY3Rpb24gS0EoZSl7Y29uc29sZS5lcnJvcihlKX1jb25zdCBaQT0yOCxHQT0oe3JpY2h0ZXh0OmUsb25FZGl0b3I6dH0pPT57Y29uc3R7d2luZG93U2l6ZTpufT1BdigpLGk9e25hbWVzcGFjZToidmFsIixlZGl0b3JTdGF0ZTpvPT57by5zZXRFZGl0b3JTdGF0ZShvLnBhcnNlRWRpdG9yU3RhdGUoe3Jvb3Q6TFIoJFMoZSkpfSkpfSxub2RlczpbT2EuSGVhZGluZ05vZGUsenUsamkuTGlzdE5vZGUsamkuTGlzdEl0ZW1Ob2RlLGZzLkxpbmtOb2RlXSx0aGVtZTp7dGV4dDp7Ym9sZDoiZm9udC1zZW1pYm9sZCIsdW5kZXJsaW5lOiJ1bmRlcmxpbmUiLGl0YWxpYzoiaXRhbGljIixzdHJpa2V0aHJvdWdoOiJsaW5lLXRocm91Z2giLHVuZGVybGluZVN0cmlrZXRocm91Z2g6InVuZGVybGluZSBsaW5lLXRocm91Z2gifSxsaXN0OntsaXN0aXRlbToibWwtWzIwcHhdIixvbDoibGlzdC1kZWNpbWFsIix1bDoibGlzdC1kaXNjIn0saGVhZGluZzp7aDE6InRleHQtNHhsIGZvbnQtYm9sZCIsaDI6InRleHQtM3hsIGZvbnQtYm9sZCIsaDM6InRleHQtMnhsIGZvbnQtYm9sZCIsaDQ6InRleHQteGwgZm9udC1ib2xkIixoNToidGV4dC1sZyBmb250LWJvbGQiLGg2OiJ0ZXh0LW1kIGZvbnQtYm9sZCJ9LGxpbms6InRleHQtaGlnaGxpZ2h0IHVuZGVybGluZSJ9LG9uRXJyb3I6S0F9O3JldHVybiB4LmpzeHMoWE8uTGV4aWNhbENvbXBvc2VyLHtpbml0aWFsQ29uZmlnOmksY2hpbGRyZW46W3guanN4KG1BLHt9KSx4LmpzeChIQSx7b25FZGl0b3I6dH0pLHguanN4KFhQLlJpY2hUZXh0UGx1Z2luLHtjb250ZW50RWRpdGFibGU6eC5qc3goImRpdiIse2NsYXNzTmFtZToiZm9udC1zYW5zIGJvcmRlci1iIHRleHQtcHJpbWFyeSBib3JkZXItaGlnaGxpZ2h0IixzdHlsZTp7bWluSGVpZ2h0Om4hPW51bGwmJm4uaW5uZXJIZWlnaHQ/KG49PW51bGw/dm9pZCAwOm4uaW5uZXJIZWlnaHQpLVpBOnZvaWQgMH0sY2hpbGRyZW46eC5qc3goaEEse2NsYXNzTmFtZToicC00IG91dGxpbmUtbm9uZSBiZy1maWxsIn0pfSkscGxhY2Vob2xkZXI6eC5qc3goImRpdiIse2NsYXNzTmFtZToiIixjaGlsZHJlbjoiRW50ZXIgc29tZSB0ZXh0Li4uIn0pLEVycm9yQm91bmRhcnk6clB9KSx4LmpzeChkQS5MaW5rUGx1Z2luLHt9KSx4LmpzeChOQSx7fSkseC5qc3godEEuTGlzdFBsdWdpbix7fSkseC5qc3goZ0Ese30pLHguanN4KGZQLkhpc3RvcnlQbHVnaW4se30pXX0pfTt2YXIgWUE9e3htbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsd2lkdGg6MjQsaGVpZ2h0OjI0LHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IiLHN0cm9rZVdpZHRoOjIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCJ9O2NvbnN0IFhBPWU9PmUucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywiJDEtJDIiKS50b0xvd2VyQ2FzZSgpLEtuPShlLHQpPT57Y29uc3Qgbj1wLmZvcndhcmRSZWYoKHtjb2xvcjpyPSJjdXJyZW50Q29sb3IiLHNpemU6aT0yNCxzdHJva2VXaWR0aDpvPTIsYWJzb2x1dGVTdHJva2VXaWR0aDpsLGNoaWxkcmVuOnMsLi4uYX0sdSk9PnAuY3JlYXRlRWxlbWVudCgic3ZnIix7cmVmOnUsLi4uWUEsd2lkdGg6aSxoZWlnaHQ6aSxzdHJva2U6cixzdHJva2VXaWR0aDpsP051bWJlcihvKSoyNC9OdW1iZXIoaSk6byxjbGFzc05hbWU6YGx1Y2lkZSBsdWNpZGUtJHtYQShlKX1gLC4uLmF9LFsuLi50Lm1hcCgoW2MsZF0pPT5wLmNyZWF0ZUVsZW1lbnQoYyxkKSksLi4uKEFycmF5LmlzQXJyYXkocyk/czpbc10pfHxbXV0pKTtyZXR1cm4gbi5kaXNwbGF5TmFtZT1gJHtlfWAsbn0sUUE9S24oIkNoZWNrIixbWyJwb2x5bGluZSIse3BvaW50czoiMjAgNiA5IDE3IDQgMTIiLGtleToiMTBqamZqIn1dXSksa0M9S24oIkNoZXZyb25Eb3duIixbWyJwYXRoIix7ZDoibTYgOSA2IDYgNi02IixrZXk6InFydW5zbCJ9XV0pLEpBPUtuKCJDaGV2cm9uTGVmdCIsW1sicGF0aCIse2Q6Im0xNSAxOC02LTYgNi02IixrZXk6IjF3bmZnMyJ9XV0pLEV4PUtuKCJMb2dJbiIsW1sicGF0aCIse2Q6Ik0xNSAzaDRhMiAyIDAgMCAxIDIgMnYxNGEyIDIgMCAwIDEtMiAyaC00IixrZXk6InU1M3M2ciJ9XSxbInBvbHlsaW5lIix7cG9pbnRzOiIxMCAxNyAxNSAxMiAxMCA3IixrZXk6IjFhaWwwaCJ9XSxbImxpbmUiLHt4MToiMTUiLHgyOiIzIix5MToiMTIiLHkyOiIxMiIsa2V5OiJ2NmdyeDgifV1dKSxxQT1LbigiTWF4aW1pemUiLFtbInBhdGgiLHtkOiJNOCAzSDVhMiAyIDAgMCAwLTIgMnYzIixrZXk6IjFkY21pdCJ9XSxbInBhdGgiLHtkOiJNMjEgOFY1YTIgMiAwIDAgMC0yLTJoLTMiLGtleToiMWU0Z3QzIn1dLFsicGF0aCIse2Q6Ik0zIDE2djNhMiAyIDAgMCAwIDIgMmgzIixrZXk6IndzbDVzYyJ9XSxbInBhdGgiLHtkOiJNMTYgMjFoM2EyIDIgMCAwIDAgMi0ydi0zIixrZXk6IjE4dHJlayJ9XV0pLGU1PUtuKCJNaW5pbWl6ZSIsW1sicGF0aCIse2Q6Ik04IDN2M2EyIDIgMCAwIDEtMiAySDMiLGtleToiaG9oYnRyIn1dLFsicGF0aCIse2Q6Ik0yMSA4aC0zYTIgMiAwIDAgMS0yLTJWMyIsa2V5OiI1ancxZjMifV0sWyJwYXRoIix7ZDoiTTMgMTZoM2EyIDIgMCAwIDEgMiAydjMiLGtleToiMTk4dHZyIn1dLFsicGF0aCIse2Q6Ik0xNiAyMXYtM2EyIDIgMCAwIDEgMi0yaDMiLGtleToicGg4bXhwIn1dXSksdDU9S24oIk1vb24iLFtbInBhdGgiLHtkOiJNMTIgM2E2IDYgMCAwIDAgOSA5IDkgOSAwIDEgMS05LTlaIixrZXk6ImE3dG4xOCJ9XV0pLG41PUtuKCJQYXVzZSIsW1sicmVjdCIse3dpZHRoOiI0IixoZWlnaHQ6IjE2Iix4OiI2Iix5OiI0IixrZXk6ImlmZmhlNCJ9XSxbInJlY3QiLHt3aWR0aDoiNCIsaGVpZ2h0OiIxNiIseDoiMTQiLHk6IjQiLGtleToic2ppbjdqIn1dXSkscjU9S24oIlBsYXkiLFtbInBvbHlnb24iLHtwb2ludHM6IjUgMyAxOSAxMiA1IDIxIDUgMyIsa2V5OiIxOTE2MzcifV1dKSxpNT1LbigiUG93ZXIiLFtbInBhdGgiLHtkOiJNMTIgMnYxMCIsa2V5OiJtbmZibCJ9XSxbInBhdGgiLHtkOiJNMTguNCA2LjZhOSA5IDAgMSAxLTEyLjc3LjA0IixrZXk6Im9ib2Z1OSJ9XV0pLG81PUtuKCJTZW5kIixbWyJwYXRoIix7ZDoibTIyIDItNyAyMC00LTktOS00WiIsa2V5OiIxcTN2Z2cifV0sWyJwYXRoIix7ZDoiTTIyIDIgMTEgMTMiLGtleToibnpicWVmIn1dXSksbDU9S24oIlN1biIsW1siY2lyY2xlIix7Y3g6IjEyIixjeToiMTIiLHI6IjQiLGtleToiNGV4aXAyIn1dLFsicGF0aCIse2Q6Ik0xMiAydjIiLGtleToidHVzMDNtIn1dLFsicGF0aCIse2Q6Ik0xMiAyMHYyIixrZXk6IjFsaDFrZyJ9XSxbInBhdGgiLHtkOiJtNC45MyA0LjkzIDEuNDEgMS40MSIsa2V5OiIxNDl0NmoifV0sWyJwYXRoIix7ZDoibTE3LjY2IDE3LjY2IDEuNDEgMS40MSIsa2V5OiJwdGJndXYifV0sWyJwYXRoIix7ZDoiTTIgMTJoMiIsa2V5OiIxdDhmOG4ifV0sWyJwYXRoIix7ZDoiTTIwIDEyaDIiLGtleToiMXE4bWp3In1dLFsicGF0aCIse2Q6Im02LjM0IDE3LjY2LTEuNDEgMS40MSIsa2V5OiIxbTh6ejUifV0sWyJwYXRoIix7ZDoibTE5LjA3IDQuOTMtMS40MSAxLjQxIixrZXk6IjFzaGxjcyJ9XV0pLHM1PUtuKCJYIixbWyJwYXRoIix7ZDoiTTE4IDYgNiAxOCIsa2V5OiIxYmw1ZjgifV0sWyJwYXRoIix7ZDoibTYgNiAxMiAxMiIsa2V5OiJkOGJrNnYifV1dKSxMdj0icC0xIGJvcmRlciByb3VuZGVkLWZ1bGwgc2hhZG93IGJvcmRlci1hY2NlbnQiLEN4PSJ2YWxidWlsZDp1cmxCZWZvcmVOYXZpZ2F0aW9uIjtmdW5jdGlvbiBhNSh7YXBpOmUscGF0Y2hlczp0LG9uQ29tbWl0Om59KXtjb25zdHt0aGVtZTpyLHNldFRoZW1lOmksZWRpdE1vZGU6byxzZXRFZGl0TW9kZTpsLHNlc3Npb246c309QXYoKTtpZihzLnN0YXR1cz09PSJzdWNjZXNzIiYmcy5kYXRhLm1vZGU9PT0idW5hdXRob3JpemVkIilyZXR1cm4geC5qc3hzKGt4LHtocmVmOmUuZ2V0TG9naW5Vcmwod2luZG93LmxvY2F0aW9uLmhyZWYpLGNoaWxkcmVuOlt4LmpzeCgic3BhbiIse2NoaWxkcmVuOiJMb2dpbiJ9KSx4LmpzeChFeCx7c2l6ZToxOH0pXX0pO2lmKHMuc3RhdHVzPT09InN1Y2Nlc3MiJiYhcy5kYXRhLmVuYWJsZWQpcmV0dXJuIHguanN4cyhreCx7aHJlZjplLmdldEVuYWJsZVVybCh3aW5kb3cubG9jYXRpb24uaHJlZiksY2hpbGRyZW46W3guanN4KCJzcGFuIix7Y2hpbGRyZW46IkVuYWJsZSJ9KSx4LmpzeChFeCx7c2l6ZToxOH0pXX0pO2NvbnN0W2EsdV09cC51c2VTdGF0ZSgpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2xldCBjPTA7Zm9yKGNvbnN0IGQgaW4gdCljKz10W2RdLmxlbmd0aDt1KGMpfSxbdF0pLHguanN4cyh1NSx7Y2hpbGRyZW46W3guanN4KHdjLHthY3RpdmU6bz09PSJob3ZlciIsb25DbGljazooKT0+e2woYz0+Yz09PSJob3ZlciI/Im9mZiI6ImhvdmVyIil9LGNoaWxkcmVuOnguanN4KCJkaXYiLHtjbGFzc05hbWU6ImgtWzI0cHhdIHctWzI0cHhdIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIixjaGlsZHJlbjpvPT09ImhvdmVyIj94LmpzeChuNSx7c2l6ZToxOH0pOnguanN4KHI1LHtzaXplOjE4fSl9KX0pLHguanN4KHdjLHtvbkNsaWNrOigpPT57aShyPT09ImRhcmsiPyJsaWdodCI6ImRhcmsiKX0sY2hpbGRyZW46eC5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImgtWzI0cHhdIHctWzI0cHhdIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIixjaGlsZHJlbjpbcj09PSJkYXJrIiYmeC5qc3gobDUse3NpemU6MTV9KSxyPT09ImxpZ2h0IiYmeC5qc3godDUse3NpemU6MTV9KV19KX0pLHguanN4KHdjLHthY3RpdmU6bz09PSJmdWxsIixvbkNsaWNrOigpPT57aWYobyE9PSJmdWxsIilsb2NhbFN0b3JhZ2Uuc2V0SXRlbShDeCx3aW5kb3cubG9jYXRpb24uaHJlZiksd2luZG93LmxvY2F0aW9uLmhyZWY9ZS5nZXRFZGl0VXJsKCk7ZWxzZSBpZihvPT09ImZ1bGwiKXtjb25zdCBjPWxvY2FsU3RvcmFnZS5nZXRJdGVtKEN4KTt3aW5kb3cubG9jYXRpb24uaHJlZj1jfHwiLyJ9fSxjaGlsZHJlbjp4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJoLVsyNHB4XSB3LVsyNHB4XSBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciIsY2hpbGRyZW46bz09PSJmdWxsIj94LmpzeChlNSx7c2l6ZToxNX0pOnguanN4KHFBLHtzaXplOjE1fSl9KX0pLGEhPT12b2lkIDAmJnMuc3RhdHVzPT09InN1Y2Nlc3MiJiZzLmRhdGEubW9kZT09PSJwcm94eSImJnguanN4KHdjLHtvbkNsaWNrOigpPT57YT4wP2UucG9zdENvbW1pdCh7cGF0Y2hlczp0fSkudGhlbihjPT57am8uaXNFcnIoYyk/KGNvbnNvbGUuZXJyb3IoYy5lcnJvciksYWxlcnQoIkNvdWxkIG5vdCBjb21taXQgcGF0Y2hlczogIitjLmVycm9yLm1lc3NhZ2UpKTooY29uc29sZS5sb2coIkNvbW1pdHRlZCBwYXRjaGVzOiAiLGMudmFsdWUpLG4oKSl9KTphbGVydCgiTm8gcGF0Y2hlcyB0byBjb21taXQiKX0sY2hpbGRyZW46eC5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InJlbGF0aXZlIGgtWzI0cHhdIHctWzI0cHhdIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIixjaGlsZHJlbjpbeC5qc3goImRpdiIse2NsYXNzTmFtZToiYWJzb2x1dGUgLXJpZ2h0LVsxMHB4XSAtdG9wLVsxMHB4XSBib3JkZXIgYm9yZGVyLWJvcmRlciByb3VuZGVkLWZ1bGwgcHgtMSBmb250LXNhbnMgdGV4dC14cyBiZy1jYXJkIHRleHQtYWNjZW50IixjaGlsZHJlbjphfSkseC5qc3gobzUse3NpemU6MTh9KV19KX0pLHguanN4KCJhIix7Y2xhc3NOYW1lOkx2LGhyZWY6ZS5nZXREaXNhYmxlVXJsKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxjaGlsZHJlbjp4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJoLVsyNHB4XSB3LVsyNHB4XSBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciIsY2hpbGRyZW46eC5qc3goaTUse3NpemU6MTh9KX0pfSldfSl9ZnVuY3Rpb24ga3goe2hyZWY6ZSxjaGlsZHJlbjp0fSl7cmV0dXJuIHguanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctZnVsbCBoLWZ1bGwgZm9udC1zYW5zIGJvcmRlci0yIHJvdW5kZWQtZnVsbCBnYXAteC0zIHRleHQtcHJpbWFyeSBiZy1iYWNrZ3JvdW5kIGJvcmRlci1maWxsIixjaGlsZHJlbjp4LmpzeCgiYSIse2NsYXNzTmFtZTpMdixocmVmOmUsY2hpbGRyZW46eC5qc3goImRpdiIse2NsYXNzTmFtZToiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHgtMiBnYXAteC0yIixjaGlsZHJlbjp0fSl9KX0pfWZ1bmN0aW9uIHU1KHtjaGlsZHJlbjplfSl7cmV0dXJuIHguanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctZnVsbCBoLWZ1bGwgcHgtMiBweS0yIGZvbnQtc2FucyBib3JkZXItMiByb3VuZGVkLWZ1bGwgZ2FwLXgtMyB0ZXh0LXByaW1hcnkgYmctYmFja2dyb3VuZCBib3JkZXItZmlsbCIsY2hpbGRyZW46ZX0pfWZ1bmN0aW9uIHdjKHthY3RpdmU6ZSxvbkNsaWNrOnQsY2hpbGRyZW46bn0pe3JldHVybiB4LmpzeCgiYnV0dG9uIix7Y2xhc3NOYW1lOndmKEx2LHsiYmctYWNjZW50IGRyb3Atc2hhZG93LVswcHhfMHB4XzEycHhfcmdiYSg1NiwyMDUsMTUyLDAuNjApXSI6ZX0pLG9uQ2xpY2s6dCxjaGlsZHJlbjpufSl9ZnVuY3Rpb24gYzUoZSx0KXtjb25zdFtuLHJdPXAudXNlU3RhdGUoe30pLFtpLG9dPXAudXNlU3RhdGUoMCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57ZS5zdGF0dXM9PT0ic3VjY2VzcyImJmUuZGF0YS5tb2RlPT09InByb3h5IiYmdC5nZXRQYXRjaGVzKHt9KS50aGVuKGw9PntpZihqby5pc09rKGwpKXtjb25zdCBzPXt9O2Zvcihjb25zdCBhIGluIGwudmFsdWUpc1thXT1sLnZhbHVlW2FdLm1hcCh1PT51LnBhdGNoX2lkKTtyKHMpfWVsc2UgY29uc29sZS5lcnJvcigiQ291bGQgbm90IGxvYWQgcGF0Y2hlcyIsbC5lcnJvcil9KX0sW2UsaV0pLHtwYXRjaGVzOm4sc2V0UGF0Y2hSZXNldElkOm99fWZ1bmN0aW9uIGQ1KGU9ImRhcmsiKXtjb25zdFt0LG5dPXAudXNlU3RhdGUoZSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57bG9jYWxTdG9yYWdlLmdldEl0ZW0oInZhbC10aGVtZSIpPT09ImxpZ2h0Ij9uKCJsaWdodCIpOmxvY2FsU3RvcmFnZS5nZXRJdGVtKCJ2YWwtdGhlbWUiKT09PSJkYXJrInx8d2luZG93Lm1hdGNoTWVkaWEmJndpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIikubWF0Y2hlcz9uKCJkYXJrIik6d2luZG93Lm1hdGNoTWVkaWEmJndpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KSIpLm1hdGNoZXMmJm4oImxpZ2h0Iik7Y29uc3Qgcj1pPT57bG9jYWxTdG9yYWdlLmdldEl0ZW0oInZhbC10aGVtZSIpfHxuKGkubWF0Y2hlcz8iZGFyayI6ImxpZ2h0Iil9O3JldHVybiB3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSIpLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsciksKCk9Pnt3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSIpLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIscil9fSxbXSksW3Qscj0+e2xvY2FsU3RvcmFnZS5zZXRJdGVtKCJ2YWwtdGhlbWUiLHIpLG4ocil9XX12YXIgSWU7KGZ1bmN0aW9uKGUpe2UuYXNzZXJ0RXF1YWw9aT0+aTtmdW5jdGlvbiB0KGkpe31lLmFzc2VydElzPXQ7ZnVuY3Rpb24gbihpKXt0aHJvdyBuZXcgRXJyb3J9ZS5hc3NlcnROZXZlcj1uLGUuYXJyYXlUb0VudW09aT0+e2NvbnN0IG89e307Zm9yKGNvbnN0IGwgb2YgaSlvW2xdPWw7cmV0dXJuIG99LGUuZ2V0VmFsaWRFbnVtVmFsdWVzPWk9Pntjb25zdCBvPWUub2JqZWN0S2V5cyhpKS5maWx0ZXIocz0+dHlwZW9mIGlbaVtzXV0hPSJudW1iZXIiKSxsPXt9O2Zvcihjb25zdCBzIG9mIG8pbFtzXT1pW3NdO3JldHVybiBlLm9iamVjdFZhbHVlcyhsKX0sZS5vYmplY3RWYWx1ZXM9aT0+ZS5vYmplY3RLZXlzKGkpLm1hcChmdW5jdGlvbihvKXtyZXR1cm4gaVtvXX0pLGUub2JqZWN0S2V5cz10eXBlb2YgT2JqZWN0LmtleXM9PSJmdW5jdGlvbiI/aT0+T2JqZWN0LmtleXMoaSk6aT0+e2NvbnN0IG89W107Zm9yKGNvbnN0IGwgaW4gaSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaSxsKSYmby5wdXNoKGwpO3JldHVybiBvfSxlLmZpbmQ9KGksbyk9Pntmb3IoY29uc3QgbCBvZiBpKWlmKG8obCkpcmV0dXJuIGx9LGUuaXNJbnRlZ2VyPXR5cGVvZiBOdW1iZXIuaXNJbnRlZ2VyPT0iZnVuY3Rpb24iP2k9Pk51bWJlci5pc0ludGVnZXIoaSk6aT0+dHlwZW9mIGk9PSJudW1iZXIiJiZpc0Zpbml0ZShpKSYmTWF0aC5mbG9vcihpKT09PWk7ZnVuY3Rpb24gcihpLG89IiB8ICIpe3JldHVybiBpLm1hcChsPT50eXBlb2YgbD09InN0cmluZyI/YCcke2x9J2A6bCkuam9pbihvKX1lLmpvaW5WYWx1ZXM9cixlLmpzb25TdHJpbmdpZnlSZXBsYWNlcj0oaSxvKT0+dHlwZW9mIG89PSJiaWdpbnQiP28udG9TdHJpbmcoKTpvfSkoSWV8fChJZT17fSkpO3ZhciBEbTsoZnVuY3Rpb24oZSl7ZS5tZXJnZVNoYXBlcz0odCxuKT0+KHsuLi50LC4uLm59KX0pKERtfHwoRG09e30pKTtjb25zdCBRPUllLmFycmF5VG9FbnVtKFsic3RyaW5nIiwibmFuIiwibnVtYmVyIiwiaW50ZWdlciIsImZsb2F0IiwiYm9vbGVhbiIsImRhdGUiLCJiaWdpbnQiLCJzeW1ib2wiLCJmdW5jdGlvbiIsInVuZGVmaW5lZCIsIm51bGwiLCJhcnJheSIsIm9iamVjdCIsInVua25vd24iLCJwcm9taXNlIiwidm9pZCIsIm5ldmVyIiwibWFwIiwic2V0Il0pLHppPWU9Pntzd2l0Y2godHlwZW9mIGUpe2Nhc2UidW5kZWZpbmVkIjpyZXR1cm4gUS51bmRlZmluZWQ7Y2FzZSJzdHJpbmciOnJldHVybiBRLnN0cmluZztjYXNlIm51bWJlciI6cmV0dXJuIGlzTmFOKGUpP1EubmFuOlEubnVtYmVyO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIFEuYm9vbGVhbjtjYXNlImZ1bmN0aW9uIjpyZXR1cm4gUS5mdW5jdGlvbjtjYXNlImJpZ2ludCI6cmV0dXJuIFEuYmlnaW50O2Nhc2Uic3ltYm9sIjpyZXR1cm4gUS5zeW1ib2w7Y2FzZSJvYmplY3QiOnJldHVybiBBcnJheS5pc0FycmF5KGUpP1EuYXJyYXk6ZT09PW51bGw/US5udWxsOmUudGhlbiYmdHlwZW9mIGUudGhlbj09ImZ1bmN0aW9uIiYmZS5jYXRjaCYmdHlwZW9mIGUuY2F0Y2g9PSJmdW5jdGlvbiI/US5wcm9taXNlOnR5cGVvZiBNYXA8InUiJiZlIGluc3RhbmNlb2YgTWFwP1EubWFwOnR5cGVvZiBTZXQ8InUiJiZlIGluc3RhbmNlb2YgU2V0P1Euc2V0OnR5cGVvZiBEYXRlPCJ1IiYmZSBpbnN0YW5jZW9mIERhdGU/US5kYXRlOlEub2JqZWN0O2RlZmF1bHQ6cmV0dXJuIFEudW5rbm93bn19LFc9SWUuYXJyYXlUb0VudW0oWyJpbnZhbGlkX3R5cGUiLCJpbnZhbGlkX2xpdGVyYWwiLCJjdXN0b20iLCJpbnZhbGlkX3VuaW9uIiwiaW52YWxpZF91bmlvbl9kaXNjcmltaW5hdG9yIiwiaW52YWxpZF9lbnVtX3ZhbHVlIiwidW5yZWNvZ25pemVkX2tleXMiLCJpbnZhbGlkX2FyZ3VtZW50cyIsImludmFsaWRfcmV0dXJuX3R5cGUiLCJpbnZhbGlkX2RhdGUiLCJpbnZhbGlkX3N0cmluZyIsInRvb19zbWFsbCIsInRvb19iaWciLCJpbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlcyIsIm5vdF9tdWx0aXBsZV9vZiIsIm5vdF9maW5pdGUiXSksZjU9ZT0+SlNPTi5zdHJpbmdpZnkoZSxudWxsLDIpLnJlcGxhY2UoLyIoW14iXSspIjovZywiJDE6Iik7Y2xhc3MgRXIgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNzdWVzPVtdLHRoaXMuYWRkSXNzdWU9cj0+e3RoaXMuaXNzdWVzPVsuLi50aGlzLmlzc3VlcyxyXX0sdGhpcy5hZGRJc3N1ZXM9KHI9W10pPT57dGhpcy5pc3N1ZXM9Wy4uLnRoaXMuaXNzdWVzLC4uLnJdfTtjb25zdCBuPW5ldy50YXJnZXQucHJvdG90eXBlO09iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxuKTp0aGlzLl9fcHJvdG9fXz1uLHRoaXMubmFtZT0iWm9kRXJyb3IiLHRoaXMuaXNzdWVzPXR9Z2V0IGVycm9ycygpe3JldHVybiB0aGlzLmlzc3Vlc31mb3JtYXQodCl7Y29uc3Qgbj10fHxmdW5jdGlvbihvKXtyZXR1cm4gby5tZXNzYWdlfSxyPXtfZXJyb3JzOltdfSxpPW89Pntmb3IoY29uc3QgbCBvZiBvLmlzc3VlcylpZihsLmNvZGU9PT0iaW52YWxpZF91bmlvbiIpbC51bmlvbkVycm9ycy5tYXAoaSk7ZWxzZSBpZihsLmNvZGU9PT0iaW52YWxpZF9yZXR1cm5fdHlwZSIpaShsLnJldHVyblR5cGVFcnJvcik7ZWxzZSBpZihsLmNvZGU9PT0iaW52YWxpZF9hcmd1bWVudHMiKWkobC5hcmd1bWVudHNFcnJvcik7ZWxzZSBpZihsLnBhdGgubGVuZ3RoPT09MClyLl9lcnJvcnMucHVzaChuKGwpKTtlbHNle2xldCBzPXIsYT0wO2Zvcig7YTxsLnBhdGgubGVuZ3RoOyl7Y29uc3QgdT1sLnBhdGhbYV07YT09PWwucGF0aC5sZW5ndGgtMT8oc1t1XT1zW3VdfHx7X2Vycm9yczpbXX0sc1t1XS5fZXJyb3JzLnB1c2gobihsKSkpOnNbdV09c1t1XXx8e19lcnJvcnM6W119LHM9c1t1XSxhKyt9fX07cmV0dXJuIGkodGhpcykscn10b1N0cmluZygpe3JldHVybiB0aGlzLm1lc3NhZ2V9Z2V0IG1lc3NhZ2UoKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5pc3N1ZXMsSWUuanNvblN0cmluZ2lmeVJlcGxhY2VyLDIpfWdldCBpc0VtcHR5KCl7cmV0dXJuIHRoaXMuaXNzdWVzLmxlbmd0aD09PTB9ZmxhdHRlbih0PW49Pm4ubWVzc2FnZSl7Y29uc3Qgbj17fSxyPVtdO2Zvcihjb25zdCBpIG9mIHRoaXMuaXNzdWVzKWkucGF0aC5sZW5ndGg+MD8obltpLnBhdGhbMF1dPW5baS5wYXRoWzBdXXx8W10sbltpLnBhdGhbMF1dLnB1c2godChpKSkpOnIucHVzaCh0KGkpKTtyZXR1cm57Zm9ybUVycm9yczpyLGZpZWxkRXJyb3JzOm59fWdldCBmb3JtRXJyb3JzKCl7cmV0dXJuIHRoaXMuZmxhdHRlbigpfX1Fci5jcmVhdGU9ZT0+bmV3IEVyKGUpO2NvbnN0IHV1PShlLHQpPT57bGV0IG47c3dpdGNoKGUuY29kZSl7Y2FzZSBXLmludmFsaWRfdHlwZTplLnJlY2VpdmVkPT09US51bmRlZmluZWQ/bj0iUmVxdWlyZWQiOm49YEV4cGVjdGVkICR7ZS5leHBlY3RlZH0sIHJlY2VpdmVkICR7ZS5yZWNlaXZlZH1gO2JyZWFrO2Nhc2UgVy5pbnZhbGlkX2xpdGVyYWw6bj1gSW52YWxpZCBsaXRlcmFsIHZhbHVlLCBleHBlY3RlZCAke0pTT04uc3RyaW5naWZ5KGUuZXhwZWN0ZWQsSWUuanNvblN0cmluZ2lmeVJlcGxhY2VyKX1gO2JyZWFrO2Nhc2UgVy51bnJlY29nbml6ZWRfa2V5czpuPWBVbnJlY29nbml6ZWQga2V5KHMpIGluIG9iamVjdDogJHtJZS5qb2luVmFsdWVzKGUua2V5cywiLCAiKX1gO2JyZWFrO2Nhc2UgVy5pbnZhbGlkX3VuaW9uOm49IkludmFsaWQgaW5wdXQiO2JyZWFrO2Nhc2UgVy5pbnZhbGlkX3VuaW9uX2Rpc2NyaW1pbmF0b3I6bj1gSW52YWxpZCBkaXNjcmltaW5hdG9yIHZhbHVlLiBFeHBlY3RlZCAke0llLmpvaW5WYWx1ZXMoZS5vcHRpb25zKX1gO2JyZWFrO2Nhc2UgVy5pbnZhbGlkX2VudW1fdmFsdWU6bj1gSW52YWxpZCBlbnVtIHZhbHVlLiBFeHBlY3RlZCAke0llLmpvaW5WYWx1ZXMoZS5vcHRpb25zKX0sIHJlY2VpdmVkICcke2UucmVjZWl2ZWR9J2A7YnJlYWs7Y2FzZSBXLmludmFsaWRfYXJndW1lbnRzOm49IkludmFsaWQgZnVuY3Rpb24gYXJndW1lbnRzIjticmVhaztjYXNlIFcuaW52YWxpZF9yZXR1cm5fdHlwZTpuPSJJbnZhbGlkIGZ1bmN0aW9uIHJldHVybiB0eXBlIjticmVhaztjYXNlIFcuaW52YWxpZF9kYXRlOm49IkludmFsaWQgZGF0ZSI7YnJlYWs7Y2FzZSBXLmludmFsaWRfc3RyaW5nOnR5cGVvZiBlLnZhbGlkYXRpb249PSJvYmplY3QiPyJpbmNsdWRlcyJpbiBlLnZhbGlkYXRpb24/KG49YEludmFsaWQgaW5wdXQ6IG11c3QgaW5jbHVkZSAiJHtlLnZhbGlkYXRpb24uaW5jbHVkZXN9ImAsdHlwZW9mIGUudmFsaWRhdGlvbi5wb3NpdGlvbj09Im51bWJlciImJihuPWAke259IGF0IG9uZSBvciBtb3JlIHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtlLnZhbGlkYXRpb24ucG9zaXRpb259YCkpOiJzdGFydHNXaXRoImluIGUudmFsaWRhdGlvbj9uPWBJbnZhbGlkIGlucHV0OiBtdXN0IHN0YXJ0IHdpdGggIiR7ZS52YWxpZGF0aW9uLnN0YXJ0c1dpdGh9ImA6ImVuZHNXaXRoImluIGUudmFsaWRhdGlvbj9uPWBJbnZhbGlkIGlucHV0OiBtdXN0IGVuZCB3aXRoICIke2UudmFsaWRhdGlvbi5lbmRzV2l0aH0iYDpJZS5hc3NlcnROZXZlcihlLnZhbGlkYXRpb24pOmUudmFsaWRhdGlvbiE9PSJyZWdleCI/bj1gSW52YWxpZCAke2UudmFsaWRhdGlvbn1gOm49IkludmFsaWQiO2JyZWFrO2Nhc2UgVy50b29fc21hbGw6ZS50eXBlPT09ImFycmF5Ij9uPWBBcnJheSBtdXN0IGNvbnRhaW4gJHtlLmV4YWN0PyJleGFjdGx5IjplLmluY2x1c2l2ZT8iYXQgbGVhc3QiOiJtb3JlIHRoYW4ifSAke2UubWluaW11bX0gZWxlbWVudChzKWA6ZS50eXBlPT09InN0cmluZyI/bj1gU3RyaW5nIG11c3QgY29udGFpbiAke2UuZXhhY3Q/ImV4YWN0bHkiOmUuaW5jbHVzaXZlPyJhdCBsZWFzdCI6Im92ZXIifSAke2UubWluaW11bX0gY2hhcmFjdGVyKHMpYDplLnR5cGU9PT0ibnVtYmVyIj9uPWBOdW1iZXIgbXVzdCBiZSAke2UuZXhhY3Q/ImV4YWN0bHkgZXF1YWwgdG8gIjplLmluY2x1c2l2ZT8iZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICI6ImdyZWF0ZXIgdGhhbiAifSR7ZS5taW5pbXVtfWA6ZS50eXBlPT09ImRhdGUiP249YERhdGUgbXVzdCBiZSAke2UuZXhhY3Q/ImV4YWN0bHkgZXF1YWwgdG8gIjplLmluY2x1c2l2ZT8iZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICI6ImdyZWF0ZXIgdGhhbiAifSR7bmV3IERhdGUoTnVtYmVyKGUubWluaW11bSkpfWA6bj0iSW52YWxpZCBpbnB1dCI7YnJlYWs7Y2FzZSBXLnRvb19iaWc6ZS50eXBlPT09ImFycmF5Ij9uPWBBcnJheSBtdXN0IGNvbnRhaW4gJHtlLmV4YWN0PyJleGFjdGx5IjplLmluY2x1c2l2ZT8iYXQgbW9zdCI6Imxlc3MgdGhhbiJ9ICR7ZS5tYXhpbXVtfSBlbGVtZW50KHMpYDplLnR5cGU9PT0ic3RyaW5nIj9uPWBTdHJpbmcgbXVzdCBjb250YWluICR7ZS5leGFjdD8iZXhhY3RseSI6ZS5pbmNsdXNpdmU/ImF0IG1vc3QiOiJ1bmRlciJ9ICR7ZS5tYXhpbXVtfSBjaGFyYWN0ZXIocylgOmUudHlwZT09PSJudW1iZXIiP249YE51bWJlciBtdXN0IGJlICR7ZS5leGFjdD8iZXhhY3RseSI6ZS5pbmNsdXNpdmU/Imxlc3MgdGhhbiBvciBlcXVhbCB0byI6Imxlc3MgdGhhbiJ9ICR7ZS5tYXhpbXVtfWA6ZS50eXBlPT09ImJpZ2ludCI/bj1gQmlnSW50IG11c3QgYmUgJHtlLmV4YWN0PyJleGFjdGx5IjplLmluY2x1c2l2ZT8ibGVzcyB0aGFuIG9yIGVxdWFsIHRvIjoibGVzcyB0aGFuIn0gJHtlLm1heGltdW19YDplLnR5cGU9PT0iZGF0ZSI/bj1gRGF0ZSBtdXN0IGJlICR7ZS5leGFjdD8iZXhhY3RseSI6ZS5pbmNsdXNpdmU/InNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byI6InNtYWxsZXIgdGhhbiJ9ICR7bmV3IERhdGUoTnVtYmVyKGUubWF4aW11bSkpfWA6bj0iSW52YWxpZCBpbnB1dCI7YnJlYWs7Y2FzZSBXLmN1c3RvbTpuPSJJbnZhbGlkIGlucHV0IjticmVhaztjYXNlIFcuaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXM6bj0iSW50ZXJzZWN0aW9uIHJlc3VsdHMgY291bGQgbm90IGJlIG1lcmdlZCI7YnJlYWs7Y2FzZSBXLm5vdF9tdWx0aXBsZV9vZjpuPWBOdW1iZXIgbXVzdCBiZSBhIG11bHRpcGxlIG9mICR7ZS5tdWx0aXBsZU9mfWA7YnJlYWs7Y2FzZSBXLm5vdF9maW5pdGU6bj0iTnVtYmVyIG11c3QgYmUgZmluaXRlIjticmVhaztkZWZhdWx0Om49dC5kZWZhdWx0RXJyb3IsSWUuYXNzZXJ0TmV2ZXIoZSl9cmV0dXJue21lc3NhZ2U6bn19O2xldCAkQz11dTtmdW5jdGlvbiBoNShlKXskQz1lfWZ1bmN0aW9uIEZkKCl7cmV0dXJuICRDfWNvbnN0IEJkPWU9Pntjb25zdHtkYXRhOnQscGF0aDpuLGVycm9yTWFwczpyLGlzc3VlRGF0YTppfT1lLG89Wy4uLm4sLi4uaS5wYXRofHxbXV0sbD17Li4uaSxwYXRoOm99O2xldCBzPSIiO2NvbnN0IGE9ci5maWx0ZXIodT0+ISF1KS5zbGljZSgpLnJldmVyc2UoKTtmb3IoY29uc3QgdSBvZiBhKXM9dShsLHtkYXRhOnQsZGVmYXVsdEVycm9yOnN9KS5tZXNzYWdlO3JldHVybnsuLi5pLHBhdGg6byxtZXNzYWdlOmkubWVzc2FnZXx8c319LHA1PVtdO2Z1bmN0aW9uIHEoZSx0KXtjb25zdCBuPUJkKHtpc3N1ZURhdGE6dCxkYXRhOmUuZGF0YSxwYXRoOmUucGF0aCxlcnJvck1hcHM6W2UuY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCxlLnNjaGVtYUVycm9yTWFwLEZkKCksdXVdLmZpbHRlcihyPT4hIXIpfSk7ZS5jb21tb24uaXNzdWVzLnB1c2gobil9Y2xhc3Mgb257Y29uc3RydWN0b3IoKXt0aGlzLnZhbHVlPSJ2YWxpZCJ9ZGlydHkoKXt0aGlzLnZhbHVlPT09InZhbGlkIiYmKHRoaXMudmFsdWU9ImRpcnR5Iil9YWJvcnQoKXt0aGlzLnZhbHVlIT09ImFib3J0ZWQiJiYodGhpcy52YWx1ZT0iYWJvcnRlZCIpfXN0YXRpYyBtZXJnZUFycmF5KHQsbil7Y29uc3Qgcj1bXTtmb3IoY29uc3QgaSBvZiBuKXtpZihpLnN0YXR1cz09PSJhYm9ydGVkIilyZXR1cm4gZ2U7aS5zdGF0dXM9PT0iZGlydHkiJiZ0LmRpcnR5KCksci5wdXNoKGkudmFsdWUpfXJldHVybntzdGF0dXM6dC52YWx1ZSx2YWx1ZTpyfX1zdGF0aWMgYXN5bmMgbWVyZ2VPYmplY3RBc3luYyh0LG4pe2NvbnN0IHI9W107Zm9yKGNvbnN0IGkgb2YgbilyLnB1c2goe2tleTphd2FpdCBpLmtleSx2YWx1ZTphd2FpdCBpLnZhbHVlfSk7cmV0dXJuIG9uLm1lcmdlT2JqZWN0U3luYyh0LHIpfXN0YXRpYyBtZXJnZU9iamVjdFN5bmModCxuKXtjb25zdCByPXt9O2Zvcihjb25zdCBpIG9mIG4pe2NvbnN0e2tleTpvLHZhbHVlOmx9PWk7aWYoby5zdGF0dXM9PT0iYWJvcnRlZCJ8fGwuc3RhdHVzPT09ImFib3J0ZWQiKXJldHVybiBnZTtvLnN0YXR1cz09PSJkaXJ0eSImJnQuZGlydHkoKSxsLnN0YXR1cz09PSJkaXJ0eSImJnQuZGlydHkoKSxvLnZhbHVlIT09Il9fcHJvdG9fXyImJih0eXBlb2YgbC52YWx1ZTwidSJ8fGkuYWx3YXlzU2V0KSYmKHJbby52YWx1ZV09bC52YWx1ZSl9cmV0dXJue3N0YXR1czp0LnZhbHVlLHZhbHVlOnJ9fX1jb25zdCBnZT1PYmplY3QuZnJlZXplKHtzdGF0dXM6ImFib3J0ZWQifSksYkM9ZT0+KHtzdGF0dXM6ImRpcnR5Iix2YWx1ZTplfSkseW49ZT0+KHtzdGF0dXM6InZhbGlkIix2YWx1ZTplfSksSW09ZT0+ZS5zdGF0dXM9PT0iYWJvcnRlZCIsTG09ZT0+ZS5zdGF0dXM9PT0iZGlydHkiLGN1PWU9PmUuc3RhdHVzPT09InZhbGlkIixVZD1lPT50eXBlb2YgUHJvbWlzZTwidSImJmUgaW5zdGFuY2VvZiBQcm9taXNlO3ZhciBjZTsoZnVuY3Rpb24oZSl7ZS5lcnJUb09iaj10PT50eXBlb2YgdD09InN0cmluZyI/e21lc3NhZ2U6dH06dHx8e30sZS50b1N0cmluZz10PT50eXBlb2YgdD09InN0cmluZyI/dDp0PT1udWxsP3ZvaWQgMDp0Lm1lc3NhZ2V9KShjZXx8KGNlPXt9KSk7Y2xhc3MgSHJ7Y29uc3RydWN0b3IodCxuLHIsaSl7dGhpcy5fY2FjaGVkUGF0aD1bXSx0aGlzLnBhcmVudD10LHRoaXMuZGF0YT1uLHRoaXMuX3BhdGg9cix0aGlzLl9rZXk9aX1nZXQgcGF0aCgpe3JldHVybiB0aGlzLl9jYWNoZWRQYXRoLmxlbmd0aHx8KHRoaXMuX2tleSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuX2NhY2hlZFBhdGgucHVzaCguLi50aGlzLl9wYXRoLC4uLnRoaXMuX2tleSk6dGhpcy5fY2FjaGVkUGF0aC5wdXNoKC4uLnRoaXMuX3BhdGgsdGhpcy5fa2V5KSksdGhpcy5fY2FjaGVkUGF0aH19Y29uc3QgJHg9KGUsdCk9PntpZihjdSh0KSlyZXR1cm57c3VjY2VzczohMCxkYXRhOnQudmFsdWV9O2lmKCFlLmNvbW1vbi5pc3N1ZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiVmFsaWRhdGlvbiBmYWlsZWQgYnV0IG5vIGlzc3VlcyBkZXRlY3RlZC4iKTtyZXR1cm57c3VjY2VzczohMSxnZXQgZXJyb3IoKXtpZih0aGlzLl9lcnJvcilyZXR1cm4gdGhpcy5fZXJyb3I7Y29uc3Qgbj1uZXcgRXIoZS5jb21tb24uaXNzdWVzKTtyZXR1cm4gdGhpcy5fZXJyb3I9bix0aGlzLl9lcnJvcn19fTtmdW5jdGlvbiBfZShlKXtpZighZSlyZXR1cm57fTtjb25zdHtlcnJvck1hcDp0LGludmFsaWRfdHlwZV9lcnJvcjpuLHJlcXVpcmVkX2Vycm9yOnIsZGVzY3JpcHRpb246aX09ZTtpZih0JiYobnx8cikpdGhyb3cgbmV3IEVycm9yKGBDYW4ndCB1c2UgImludmFsaWRfdHlwZV9lcnJvciIgb3IgInJlcXVpcmVkX2Vycm9yIiBpbiBjb25qdW5jdGlvbiB3aXRoIGN1c3RvbSBlcnJvciBtYXAuYCk7cmV0dXJuIHQ/e2Vycm9yTWFwOnQsZGVzY3JpcHRpb246aX06e2Vycm9yTWFwOihsLHMpPT5sLmNvZGUhPT0iaW52YWxpZF90eXBlIj97bWVzc2FnZTpzLmRlZmF1bHRFcnJvcn06dHlwZW9mIHMuZGF0YT4idSI/e21lc3NhZ2U6cj8/cy5kZWZhdWx0RXJyb3J9OnttZXNzYWdlOm4/P3MuZGVmYXVsdEVycm9yfSxkZXNjcmlwdGlvbjppfX1jbGFzcyBDZXtjb25zdHJ1Y3Rvcih0KXt0aGlzLnNwYT10aGlzLnNhZmVQYXJzZUFzeW5jLHRoaXMuX2RlZj10LHRoaXMucGFyc2U9dGhpcy5wYXJzZS5iaW5kKHRoaXMpLHRoaXMuc2FmZVBhcnNlPXRoaXMuc2FmZVBhcnNlLmJpbmQodGhpcyksdGhpcy5wYXJzZUFzeW5jPXRoaXMucGFyc2VBc3luYy5iaW5kKHRoaXMpLHRoaXMuc2FmZVBhcnNlQXN5bmM9dGhpcy5zYWZlUGFyc2VBc3luYy5iaW5kKHRoaXMpLHRoaXMuc3BhPXRoaXMuc3BhLmJpbmQodGhpcyksdGhpcy5yZWZpbmU9dGhpcy5yZWZpbmUuYmluZCh0aGlzKSx0aGlzLnJlZmluZW1lbnQ9dGhpcy5yZWZpbmVtZW50LmJpbmQodGhpcyksdGhpcy5zdXBlclJlZmluZT10aGlzLnN1cGVyUmVmaW5lLmJpbmQodGhpcyksdGhpcy5vcHRpb25hbD10aGlzLm9wdGlvbmFsLmJpbmQodGhpcyksdGhpcy5udWxsYWJsZT10aGlzLm51bGxhYmxlLmJpbmQodGhpcyksdGhpcy5udWxsaXNoPXRoaXMubnVsbGlzaC5iaW5kKHRoaXMpLHRoaXMuYXJyYXk9dGhpcy5hcnJheS5iaW5kKHRoaXMpLHRoaXMucHJvbWlzZT10aGlzLnByb21pc2UuYmluZCh0aGlzKSx0aGlzLm9yPXRoaXMub3IuYmluZCh0aGlzKSx0aGlzLmFuZD10aGlzLmFuZC5iaW5kKHRoaXMpLHRoaXMudHJhbnNmb3JtPXRoaXMudHJhbnNmb3JtLmJpbmQodGhpcyksdGhpcy5icmFuZD10aGlzLmJyYW5kLmJpbmQodGhpcyksdGhpcy5kZWZhdWx0PXRoaXMuZGVmYXVsdC5iaW5kKHRoaXMpLHRoaXMuY2F0Y2g9dGhpcy5jYXRjaC5iaW5kKHRoaXMpLHRoaXMuZGVzY3JpYmU9dGhpcy5kZXNjcmliZS5iaW5kKHRoaXMpLHRoaXMucGlwZT10aGlzLnBpcGUuYmluZCh0aGlzKSx0aGlzLnJlYWRvbmx5PXRoaXMucmVhZG9ubHkuYmluZCh0aGlzKSx0aGlzLmlzTnVsbGFibGU9dGhpcy5pc051bGxhYmxlLmJpbmQodGhpcyksdGhpcy5pc09wdGlvbmFsPXRoaXMuaXNPcHRpb25hbC5iaW5kKHRoaXMpfWdldCBkZXNjcmlwdGlvbigpe3JldHVybiB0aGlzLl9kZWYuZGVzY3JpcHRpb259X2dldFR5cGUodCl7cmV0dXJuIHppKHQuZGF0YSl9X2dldE9yUmV0dXJuQ3R4KHQsbil7cmV0dXJuIG58fHtjb21tb246dC5wYXJlbnQuY29tbW9uLGRhdGE6dC5kYXRhLHBhcnNlZFR5cGU6emkodC5kYXRhKSxzY2hlbWFFcnJvck1hcDp0aGlzLl9kZWYuZXJyb3JNYXAscGF0aDp0LnBhdGgscGFyZW50OnQucGFyZW50fX1fcHJvY2Vzc0lucHV0UGFyYW1zKHQpe3JldHVybntzdGF0dXM6bmV3IG9uLGN0eDp7Y29tbW9uOnQucGFyZW50LmNvbW1vbixkYXRhOnQuZGF0YSxwYXJzZWRUeXBlOnppKHQuZGF0YSksc2NoZW1hRXJyb3JNYXA6dGhpcy5fZGVmLmVycm9yTWFwLHBhdGg6dC5wYXRoLHBhcmVudDp0LnBhcmVudH19fV9wYXJzZVN5bmModCl7Y29uc3Qgbj10aGlzLl9wYXJzZSh0KTtpZihVZChuKSl0aHJvdyBuZXcgRXJyb3IoIlN5bmNocm9ub3VzIHBhcnNlIGVuY291bnRlcmVkIHByb21pc2UuIik7cmV0dXJuIG59X3BhcnNlQXN5bmModCl7Y29uc3Qgbj10aGlzLl9wYXJzZSh0KTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG4pfXBhcnNlKHQsbil7Y29uc3Qgcj10aGlzLnNhZmVQYXJzZSh0LG4pO2lmKHIuc3VjY2VzcylyZXR1cm4gci5kYXRhO3Rocm93IHIuZXJyb3J9c2FmZVBhcnNlKHQsbil7dmFyIHI7Y29uc3QgaT17Y29tbW9uOntpc3N1ZXM6W10sYXN5bmM6KHI9bj09bnVsbD92b2lkIDA6bi5hc3luYykhPT1udWxsJiZyIT09dm9pZCAwP3I6ITEsY29udGV4dHVhbEVycm9yTWFwOm49PW51bGw/dm9pZCAwOm4uZXJyb3JNYXB9LHBhdGg6KG49PW51bGw/dm9pZCAwOm4ucGF0aCl8fFtdLHNjaGVtYUVycm9yTWFwOnRoaXMuX2RlZi5lcnJvck1hcCxwYXJlbnQ6bnVsbCxkYXRhOnQscGFyc2VkVHlwZTp6aSh0KX0sbz10aGlzLl9wYXJzZVN5bmMoe2RhdGE6dCxwYXRoOmkucGF0aCxwYXJlbnQ6aX0pO3JldHVybiAkeChpLG8pfWFzeW5jIHBhcnNlQXN5bmModCxuKXtjb25zdCByPWF3YWl0IHRoaXMuc2FmZVBhcnNlQXN5bmModCxuKTtpZihyLnN1Y2Nlc3MpcmV0dXJuIHIuZGF0YTt0aHJvdyByLmVycm9yfWFzeW5jIHNhZmVQYXJzZUFzeW5jKHQsbil7Y29uc3Qgcj17Y29tbW9uOntpc3N1ZXM6W10sY29udGV4dHVhbEVycm9yTWFwOm49PW51bGw/dm9pZCAwOm4uZXJyb3JNYXAsYXN5bmM6ITB9LHBhdGg6KG49PW51bGw/dm9pZCAwOm4ucGF0aCl8fFtdLHNjaGVtYUVycm9yTWFwOnRoaXMuX2RlZi5lcnJvck1hcCxwYXJlbnQ6bnVsbCxkYXRhOnQscGFyc2VkVHlwZTp6aSh0KX0saT10aGlzLl9wYXJzZSh7ZGF0YTp0LHBhdGg6ci5wYXRoLHBhcmVudDpyfSksbz1hd2FpdChVZChpKT9pOlByb21pc2UucmVzb2x2ZShpKSk7cmV0dXJuICR4KHIsbyl9cmVmaW5lKHQsbil7Y29uc3Qgcj1pPT50eXBlb2Ygbj09InN0cmluZyJ8fHR5cGVvZiBuPiJ1Ij97bWVzc2FnZTpufTp0eXBlb2Ygbj09ImZ1bmN0aW9uIj9uKGkpOm47cmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKGksbyk9Pntjb25zdCBsPXQoaSkscz0oKT0+by5hZGRJc3N1ZSh7Y29kZTpXLmN1c3RvbSwuLi5yKGkpfSk7cmV0dXJuIHR5cGVvZiBQcm9taXNlPCJ1IiYmbCBpbnN0YW5jZW9mIFByb21pc2U/bC50aGVuKGE9PmE/ITA6KHMoKSwhMSkpOmw/ITA6KHMoKSwhMSl9KX1yZWZpbmVtZW50KHQsbil7cmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKHIsaSk9PnQocik/ITA6KGkuYWRkSXNzdWUodHlwZW9mIG49PSJmdW5jdGlvbiI/bihyLGkpOm4pLCExKSl9X3JlZmluZW1lbnQodCl7cmV0dXJuIG5ldyBicih7c2NoZW1hOnRoaXMsdHlwZU5hbWU6ZGUuWm9kRWZmZWN0cyxlZmZlY3Q6e3R5cGU6InJlZmluZW1lbnQiLHJlZmluZW1lbnQ6dH19KX1zdXBlclJlZmluZSh0KXtyZXR1cm4gdGhpcy5fcmVmaW5lbWVudCh0KX1vcHRpb25hbCgpe3JldHVybiBjaS5jcmVhdGUodGhpcyx0aGlzLl9kZWYpfW51bGxhYmxlKCl7cmV0dXJuIGVsLmNyZWF0ZSh0aGlzLHRoaXMuX2RlZil9bnVsbGlzaCgpe3JldHVybiB0aGlzLm51bGxhYmxlKCkub3B0aW9uYWwoKX1hcnJheSgpe3JldHVybiBDci5jcmVhdGUodGhpcyx0aGlzLl9kZWYpfXByb21pc2UoKXtyZXR1cm4gcHMuY3JlYXRlKHRoaXMsdGhpcy5fZGVmKX1vcih0KXtyZXR1cm4gcHUuY3JlYXRlKFt0aGlzLHRdLHRoaXMuX2RlZil9YW5kKHQpe3JldHVybiBtdS5jcmVhdGUodGhpcyx0LHRoaXMuX2RlZil9dHJhbnNmb3JtKHQpe3JldHVybiBuZXcgYnIoey4uLl9lKHRoaXMuX2RlZiksc2NoZW1hOnRoaXMsdHlwZU5hbWU6ZGUuWm9kRWZmZWN0cyxlZmZlY3Q6e3R5cGU6InRyYW5zZm9ybSIsdHJhbnNmb3JtOnR9fSl9ZGVmYXVsdCh0KXtjb25zdCBuPXR5cGVvZiB0PT0iZnVuY3Rpb24iP3Q6KCk9PnQ7cmV0dXJuIG5ldyBfdSh7Li4uX2UodGhpcy5fZGVmKSxpbm5lclR5cGU6dGhpcyxkZWZhdWx0VmFsdWU6bix0eXBlTmFtZTpkZS5ab2REZWZhdWx0fSl9YnJhbmQoKXtyZXR1cm4gbmV3IE5DKHt0eXBlTmFtZTpkZS5ab2RCcmFuZGVkLHR5cGU6dGhpcywuLi5fZSh0aGlzLl9kZWYpfSl9Y2F0Y2godCl7Y29uc3Qgbj10eXBlb2YgdD09ImZ1bmN0aW9uIj90OigpPT50O3JldHVybiBuZXcgS2Qoey4uLl9lKHRoaXMuX2RlZiksaW5uZXJUeXBlOnRoaXMsY2F0Y2hWYWx1ZTpuLHR5cGVOYW1lOmRlLlpvZENhdGNofSl9ZGVzY3JpYmUodCl7Y29uc3Qgbj10aGlzLmNvbnN0cnVjdG9yO3JldHVybiBuZXcgbih7Li4udGhpcy5fZGVmLGRlc2NyaXB0aW9uOnR9KX1waXBlKHQpe3JldHVybiBGdS5jcmVhdGUodGhpcyx0KX1yZWFkb25seSgpe3JldHVybiBHZC5jcmVhdGUodGhpcyl9aXNPcHRpb25hbCgpe3JldHVybiB0aGlzLnNhZmVQYXJzZSh2b2lkIDApLnN1Y2Nlc3N9aXNOdWxsYWJsZSgpe3JldHVybiB0aGlzLnNhZmVQYXJzZShudWxsKS5zdWNjZXNzfX1jb25zdCBtNT0vXmNbXlxzLV17OCx9JC9pLGc1PS9eW2Etel1bYS16MC05XSokLyx2NT0vXlswLTlBLUhKS01OUC1UVi1aXXsyNn0kLyx5NT0vXlswLTlhLWZBLUZdezh9XGItWzAtOWEtZkEtRl17NH1cYi1bMC05YS1mQS1GXXs0fVxiLVswLTlhLWZBLUZdezR9XGItWzAtOWEtZkEtRl17MTJ9JC9pLHg1PS9eKD8hXC4pKD8hLipcLlwuKShbQS1aMC05XystXC5dKilbQS1aMC05XystXUAoW0EtWjAtOV1bQS1aMC05XC1dKlwuKStbQS1aXXsyLH0kL2ksXzU9Il4oXFxwe0V4dGVuZGVkX1BpY3RvZ3JhcGhpY318XFxwe0Vtb2ppX0NvbXBvbmVudH0pKyQiO2xldCBGaDtjb25zdCB3NT0vXigoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVwuKXszfSgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpJC8sUzU9L14oKFthLWYwLTldezEsNH06KXs3fXw6OihbYS1mMC05XXsxLDR9Oil7MCw2fXwoW2EtZjAtOV17MSw0fTopezF9OihbYS1mMC05XXsxLDR9Oil7MCw1fXwoW2EtZjAtOV17MSw0fTopezJ9OihbYS1mMC05XXsxLDR9Oil7MCw0fXwoW2EtZjAtOV17MSw0fTopezN9OihbYS1mMC05XXsxLDR9Oil7MCwzfXwoW2EtZjAtOV17MSw0fTopezR9OihbYS1mMC05XXsxLDR9Oil7MCwyfXwoW2EtZjAtOV17MSw0fTopezV9OihbYS1mMC05XXsxLDR9Oil7MCwxfSkoW2EtZjAtOV17MSw0fXwoKCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSlcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKSkkLyxFNT1lPT5lLnByZWNpc2lvbj9lLm9mZnNldD9uZXcgUmVnRXhwKGBeXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn1cXC5cXGR7JHtlLnByZWNpc2lvbn19KChbKy1dXFxkezJ9KDo/XFxkezJ9KT8pfFopJGApOm5ldyBSZWdFeHAoYF5cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfVxcLlxcZHske2UucHJlY2lzaW9ufX1aJGApOmUucHJlY2lzaW9uPT09MD9lLm9mZnNldD9uZXcgUmVnRXhwKCJeXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oKFsrLV1cXGR7Mn0oOj9cXGR7Mn0pPyl8WikkIik6bmV3IFJlZ0V4cCgiXlxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9WiQiKTplLm9mZnNldD9uZXcgUmVnRXhwKCJeXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oXFwuXFxkKyk/KChbKy1dXFxkezJ9KDo/XFxkezJ9KT8pfFopJCIpOm5ldyBSZWdFeHAoIl5cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfShcXC5cXGQrKT9aJCIpO2Z1bmN0aW9uIEM1KGUsdCl7cmV0dXJuISEoKHQ9PT0idjQifHwhdCkmJnc1LnRlc3QoZSl8fCh0PT09InY2Inx8IXQpJiZTNS50ZXN0KGUpKX1jbGFzcyBfciBleHRlbmRzIENle19wYXJzZSh0KXtpZih0aGlzLl9kZWYuY29lcmNlJiYodC5kYXRhPVN0cmluZyh0LmRhdGEpKSx0aGlzLl9nZXRUeXBlKHQpIT09US5zdHJpbmcpe2NvbnN0IG89dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCk7cmV0dXJuIHEobyx7Y29kZTpXLmludmFsaWRfdHlwZSxleHBlY3RlZDpRLnN0cmluZyxyZWNlaXZlZDpvLnBhcnNlZFR5cGV9KSxnZX1jb25zdCByPW5ldyBvbjtsZXQgaTtmb3IoY29uc3QgbyBvZiB0aGlzLl9kZWYuY2hlY2tzKWlmKG8ua2luZD09PSJtaW4iKXQuZGF0YS5sZW5ndGg8by52YWx1ZSYmKGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxpKSxxKGkse2NvZGU6Vy50b29fc21hbGwsbWluaW11bTpvLnZhbHVlLHR5cGU6InN0cmluZyIsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1lc3NhZ2U6by5tZXNzYWdlfSksci5kaXJ0eSgpKTtlbHNlIGlmKG8ua2luZD09PSJtYXgiKXQuZGF0YS5sZW5ndGg+by52YWx1ZSYmKGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxpKSxxKGkse2NvZGU6Vy50b29fYmlnLG1heGltdW06by52YWx1ZSx0eXBlOiJzdHJpbmciLGluY2x1c2l2ZTohMCxleGFjdDohMSxtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk7ZWxzZSBpZihvLmtpbmQ9PT0ibGVuZ3RoIil7Y29uc3QgbD10LmRhdGEubGVuZ3RoPm8udmFsdWUscz10LmRhdGEubGVuZ3RoPG8udmFsdWU7KGx8fHMpJiYoaT10aGlzLl9nZXRPclJldHVybkN0eCh0LGkpLGw/cShpLHtjb2RlOlcudG9vX2JpZyxtYXhpbXVtOm8udmFsdWUsdHlwZToic3RyaW5nIixpbmNsdXNpdmU6ITAsZXhhY3Q6ITAsbWVzc2FnZTpvLm1lc3NhZ2V9KTpzJiZxKGkse2NvZGU6Vy50b29fc21hbGwsbWluaW11bTpvLnZhbHVlLHR5cGU6InN0cmluZyIsaW5jbHVzaXZlOiEwLGV4YWN0OiEwLG1lc3NhZ2U6by5tZXNzYWdlfSksci5kaXJ0eSgpKX1lbHNlIGlmKG8ua2luZD09PSJlbWFpbCIpeDUudGVzdCh0LmRhdGEpfHwoaT10aGlzLl9nZXRPclJldHVybkN0eCh0LGkpLHEoaSx7dmFsaWRhdGlvbjoiZW1haWwiLGNvZGU6Vy5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk7ZWxzZSBpZihvLmtpbmQ9PT0iZW1vamkiKUZofHwoRmg9bmV3IFJlZ0V4cChfNSwidSIpKSxGaC50ZXN0KHQuZGF0YSl8fChpPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQsaSkscShpLHt2YWxpZGF0aW9uOiJlbW9qaSIsY29kZTpXLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6by5tZXNzYWdlfSksci5kaXJ0eSgpKTtlbHNlIGlmKG8ua2luZD09PSJ1dWlkIil5NS50ZXN0KHQuZGF0YSl8fChpPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQsaSkscShpLHt2YWxpZGF0aW9uOiJ1dWlkIixjb2RlOlcuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTpvLm1lc3NhZ2V9KSxyLmRpcnR5KCkpO2Vsc2UgaWYoby5raW5kPT09ImN1aWQiKW01LnRlc3QodC5kYXRhKXx8KGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxpKSxxKGkse3ZhbGlkYXRpb246ImN1aWQiLGNvZGU6Vy5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk7ZWxzZSBpZihvLmtpbmQ9PT0iY3VpZDIiKWc1LnRlc3QodC5kYXRhKXx8KGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxpKSxxKGkse3ZhbGlkYXRpb246ImN1aWQyIixjb2RlOlcuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTpvLm1lc3NhZ2V9KSxyLmRpcnR5KCkpO2Vsc2UgaWYoby5raW5kPT09InVsaWQiKXY1LnRlc3QodC5kYXRhKXx8KGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxpKSxxKGkse3ZhbGlkYXRpb246InVsaWQiLGNvZGU6Vy5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk7ZWxzZSBpZihvLmtpbmQ9PT0idXJsIil0cnl7bmV3IFVSTCh0LmRhdGEpfWNhdGNoe2k9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxpKSxxKGkse3ZhbGlkYXRpb246InVybCIsY29kZTpXLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6by5tZXNzYWdlfSksci5kaXJ0eSgpfWVsc2Ugby5raW5kPT09InJlZ2V4Ij8oby5yZWdleC5sYXN0SW5kZXg9MCxvLnJlZ2V4LnRlc3QodC5kYXRhKXx8KGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxpKSxxKGkse3ZhbGlkYXRpb246InJlZ2V4Iixjb2RlOlcuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTpvLm1lc3NhZ2V9KSxyLmRpcnR5KCkpKTpvLmtpbmQ9PT0idHJpbSI/dC5kYXRhPXQuZGF0YS50cmltKCk6by5raW5kPT09ImluY2x1ZGVzIj90LmRhdGEuaW5jbHVkZXMoby52YWx1ZSxvLnBvc2l0aW9uKXx8KGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxpKSxxKGkse2NvZGU6Vy5pbnZhbGlkX3N0cmluZyx2YWxpZGF0aW9uOntpbmNsdWRlczpvLnZhbHVlLHBvc2l0aW9uOm8ucG9zaXRpb259LG1lc3NhZ2U6by5tZXNzYWdlfSksci5kaXJ0eSgpKTpvLmtpbmQ9PT0idG9Mb3dlckNhc2UiP3QuZGF0YT10LmRhdGEudG9Mb3dlckNhc2UoKTpvLmtpbmQ9PT0idG9VcHBlckNhc2UiP3QuZGF0YT10LmRhdGEudG9VcHBlckNhc2UoKTpvLmtpbmQ9PT0ic3RhcnRzV2l0aCI/dC5kYXRhLnN0YXJ0c1dpdGgoby52YWx1ZSl8fChpPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQsaSkscShpLHtjb2RlOlcuaW52YWxpZF9zdHJpbmcsdmFsaWRhdGlvbjp7c3RhcnRzV2l0aDpvLnZhbHVlfSxtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk6by5raW5kPT09ImVuZHNXaXRoIj90LmRhdGEuZW5kc1dpdGgoby52YWx1ZSl8fChpPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQsaSkscShpLHtjb2RlOlcuaW52YWxpZF9zdHJpbmcsdmFsaWRhdGlvbjp7ZW5kc1dpdGg6by52YWx1ZX0sbWVzc2FnZTpvLm1lc3NhZ2V9KSxyLmRpcnR5KCkpOm8ua2luZD09PSJkYXRldGltZSI/RTUobykudGVzdCh0LmRhdGEpfHwoaT10aGlzLl9nZXRPclJldHVybkN0eCh0LGkpLHEoaSx7Y29kZTpXLmludmFsaWRfc3RyaW5nLHZhbGlkYXRpb246ImRhdGV0aW1lIixtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk6by5raW5kPT09ImlwIj9DNSh0LmRhdGEsby52ZXJzaW9uKXx8KGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxpKSxxKGkse3ZhbGlkYXRpb246ImlwIixjb2RlOlcuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTpvLm1lc3NhZ2V9KSxyLmRpcnR5KCkpOkllLmFzc2VydE5ldmVyKG8pO3JldHVybntzdGF0dXM6ci52YWx1ZSx2YWx1ZTp0LmRhdGF9fV9yZWdleCh0LG4scil7cmV0dXJuIHRoaXMucmVmaW5lbWVudChpPT50LnRlc3QoaSkse3ZhbGlkYXRpb246bixjb2RlOlcuaW52YWxpZF9zdHJpbmcsLi4uY2UuZXJyVG9PYmoocil9KX1fYWRkQ2hlY2sodCl7cmV0dXJuIG5ldyBfcih7Li4udGhpcy5fZGVmLGNoZWNrczpbLi4udGhpcy5fZGVmLmNoZWNrcyx0XX0pfWVtYWlsKHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoiZW1haWwiLC4uLmNlLmVyclRvT2JqKHQpfSl9dXJsKHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoidXJsIiwuLi5jZS5lcnJUb09iaih0KX0pfWVtb2ppKHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoiZW1vamkiLC4uLmNlLmVyclRvT2JqKHQpfSl9dXVpZCh0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6InV1aWQiLC4uLmNlLmVyclRvT2JqKHQpfSl9Y3VpZCh0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImN1aWQiLC4uLmNlLmVyclRvT2JqKHQpfSl9Y3VpZDIodCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJjdWlkMiIsLi4uY2UuZXJyVG9PYmoodCl9KX11bGlkKHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoidWxpZCIsLi4uY2UuZXJyVG9PYmoodCl9KX1pcCh0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImlwIiwuLi5jZS5lcnJUb09iaih0KX0pfWRhdGV0aW1lKHQpe3ZhciBuO3JldHVybiB0eXBlb2YgdD09InN0cmluZyI/dGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImRhdGV0aW1lIixwcmVjaXNpb246bnVsbCxvZmZzZXQ6ITEsbWVzc2FnZTp0fSk6dGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImRhdGV0aW1lIixwcmVjaXNpb246dHlwZW9mKHQ9PW51bGw/dm9pZCAwOnQucHJlY2lzaW9uKT4idSI/bnVsbDp0PT1udWxsP3ZvaWQgMDp0LnByZWNpc2lvbixvZmZzZXQ6KG49dD09bnVsbD92b2lkIDA6dC5vZmZzZXQpIT09bnVsbCYmbiE9PXZvaWQgMD9uOiExLC4uLmNlLmVyclRvT2JqKHQ9PW51bGw/dm9pZCAwOnQubWVzc2FnZSl9KX1yZWdleCh0LG4pe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoicmVnZXgiLHJlZ2V4OnQsLi4uY2UuZXJyVG9PYmoobil9KX1pbmNsdWRlcyh0LG4pe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoiaW5jbHVkZXMiLHZhbHVlOnQscG9zaXRpb246bj09bnVsbD92b2lkIDA6bi5wb3NpdGlvbiwuLi5jZS5lcnJUb09iaihuPT1udWxsP3ZvaWQgMDpuLm1lc3NhZ2UpfSl9c3RhcnRzV2l0aCh0LG4pe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoic3RhcnRzV2l0aCIsdmFsdWU6dCwuLi5jZS5lcnJUb09iaihuKX0pfWVuZHNXaXRoKHQsbil7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJlbmRzV2l0aCIsdmFsdWU6dCwuLi5jZS5lcnJUb09iaihuKX0pfW1pbih0LG4pe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTp0LC4uLmNlLmVyclRvT2JqKG4pfSl9bWF4KHQsbil7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtYXgiLHZhbHVlOnQsLi4uY2UuZXJyVG9PYmoobil9KX1sZW5ndGgodCxuKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Imxlbmd0aCIsdmFsdWU6dCwuLi5jZS5lcnJUb09iaihuKX0pfW5vbmVtcHR5KHQpe3JldHVybiB0aGlzLm1pbigxLGNlLmVyclRvT2JqKHQpKX10cmltKCl7cmV0dXJuIG5ldyBfcih7Li4udGhpcy5fZGVmLGNoZWNrczpbLi4udGhpcy5fZGVmLmNoZWNrcyx7a2luZDoidHJpbSJ9XX0pfXRvTG93ZXJDYXNlKCl7cmV0dXJuIG5ldyBfcih7Li4udGhpcy5fZGVmLGNoZWNrczpbLi4udGhpcy5fZGVmLmNoZWNrcyx7a2luZDoidG9Mb3dlckNhc2UifV19KX10b1VwcGVyQ2FzZSgpe3JldHVybiBuZXcgX3Ioey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3Mse2tpbmQ6InRvVXBwZXJDYXNlIn1dfSl9Z2V0IGlzRGF0ZXRpbWUoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZCh0PT50LmtpbmQ9PT0iZGF0ZXRpbWUiKX1nZXQgaXNFbWFpbCgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKHQ9PnQua2luZD09PSJlbWFpbCIpfWdldCBpc1VSTCgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKHQ9PnQua2luZD09PSJ1cmwiKX1nZXQgaXNFbW9qaSgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKHQ9PnQua2luZD09PSJlbW9qaSIpfWdldCBpc1VVSUQoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZCh0PT50LmtpbmQ9PT0idXVpZCIpfWdldCBpc0NVSUQoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZCh0PT50LmtpbmQ9PT0iY3VpZCIpfWdldCBpc0NVSUQyKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQodD0+dC5raW5kPT09ImN1aWQyIil9Z2V0IGlzVUxJRCgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKHQ9PnQua2luZD09PSJ1bGlkIil9Z2V0IGlzSVAoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZCh0PT50LmtpbmQ9PT0iaXAiKX1nZXQgbWluTGVuZ3RoKCl7bGV0IHQ9bnVsbDtmb3IoY29uc3QgbiBvZiB0aGlzLl9kZWYuY2hlY2tzKW4ua2luZD09PSJtaW4iJiYodD09PW51bGx8fG4udmFsdWU+dCkmJih0PW4udmFsdWUpO3JldHVybiB0fWdldCBtYXhMZW5ndGgoKXtsZXQgdD1udWxsO2Zvcihjb25zdCBuIG9mIHRoaXMuX2RlZi5jaGVja3Mpbi5raW5kPT09Im1heCImJih0PT09bnVsbHx8bi52YWx1ZTx0KSYmKHQ9bi52YWx1ZSk7cmV0dXJuIHR9fV9yLmNyZWF0ZT1lPT57dmFyIHQ7cmV0dXJuIG5ldyBfcih7Y2hlY2tzOltdLHR5cGVOYW1lOmRlLlpvZFN0cmluZyxjb2VyY2U6KHQ9ZT09bnVsbD92b2lkIDA6ZS5jb2VyY2UpIT09bnVsbCYmdCE9PXZvaWQgMD90OiExLC4uLl9lKGUpfSl9O2Z1bmN0aW9uIGs1KGUsdCl7Y29uc3Qgbj0oZS50b1N0cmluZygpLnNwbGl0KCIuIilbMV18fCIiKS5sZW5ndGgscj0odC50b1N0cmluZygpLnNwbGl0KCIuIilbMV18fCIiKS5sZW5ndGgsaT1uPnI/bjpyLG89cGFyc2VJbnQoZS50b0ZpeGVkKGkpLnJlcGxhY2UoIi4iLCIiKSksbD1wYXJzZUludCh0LnRvRml4ZWQoaSkucmVwbGFjZSgiLiIsIiIpKTtyZXR1cm4gbyVsL01hdGgucG93KDEwLGkpfWNsYXNzIGFvIGV4dGVuZHMgQ2V7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMubWluPXRoaXMuZ3RlLHRoaXMubWF4PXRoaXMubHRlLHRoaXMuc3RlcD10aGlzLm11bHRpcGxlT2Z9X3BhcnNlKHQpe2lmKHRoaXMuX2RlZi5jb2VyY2UmJih0LmRhdGE9TnVtYmVyKHQuZGF0YSkpLHRoaXMuX2dldFR5cGUodCkhPT1RLm51bWJlcil7Y29uc3Qgbz10aGlzLl9nZXRPclJldHVybkN0eCh0KTtyZXR1cm4gcShvLHtjb2RlOlcuaW52YWxpZF90eXBlLGV4cGVjdGVkOlEubnVtYmVyLHJlY2VpdmVkOm8ucGFyc2VkVHlwZX0pLGdlfWxldCByO2NvbnN0IGk9bmV3IG9uO2Zvcihjb25zdCBvIG9mIHRoaXMuX2RlZi5jaGVja3Mpby5raW5kPT09ImludCI/SWUuaXNJbnRlZ2VyKHQuZGF0YSl8fChyPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQscikscShyLHtjb2RlOlcuaW52YWxpZF90eXBlLGV4cGVjdGVkOiJpbnRlZ2VyIixyZWNlaXZlZDoiZmxvYXQiLG1lc3NhZ2U6by5tZXNzYWdlfSksaS5kaXJ0eSgpKTpvLmtpbmQ9PT0ibWluIj8oby5pbmNsdXNpdmU/dC5kYXRhPG8udmFsdWU6dC5kYXRhPD1vLnZhbHVlKSYmKHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxyKSxxKHIse2NvZGU6Vy50b29fc21hbGwsbWluaW11bTpvLnZhbHVlLHR5cGU6Im51bWJlciIsaW5jbHVzaXZlOm8uaW5jbHVzaXZlLGV4YWN0OiExLG1lc3NhZ2U6by5tZXNzYWdlfSksaS5kaXJ0eSgpKTpvLmtpbmQ9PT0ibWF4Ij8oby5pbmNsdXNpdmU/dC5kYXRhPm8udmFsdWU6dC5kYXRhPj1vLnZhbHVlKSYmKHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxyKSxxKHIse2NvZGU6Vy50b29fYmlnLG1heGltdW06by52YWx1ZSx0eXBlOiJudW1iZXIiLGluY2x1c2l2ZTpvLmluY2x1c2l2ZSxleGFjdDohMSxtZXNzYWdlOm8ubWVzc2FnZX0pLGkuZGlydHkoKSk6by5raW5kPT09Im11bHRpcGxlT2YiP2s1KHQuZGF0YSxvLnZhbHVlKSE9PTAmJihyPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQscikscShyLHtjb2RlOlcubm90X211bHRpcGxlX29mLG11bHRpcGxlT2Y6by52YWx1ZSxtZXNzYWdlOm8ubWVzc2FnZX0pLGkuZGlydHkoKSk6by5raW5kPT09ImZpbml0ZSI/TnVtYmVyLmlzRmluaXRlKHQuZGF0YSl8fChyPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQscikscShyLHtjb2RlOlcubm90X2Zpbml0ZSxtZXNzYWdlOm8ubWVzc2FnZX0pLGkuZGlydHkoKSk6SWUuYXNzZXJ0TmV2ZXIobyk7cmV0dXJue3N0YXR1czppLnZhbHVlLHZhbHVlOnQuZGF0YX19Z3RlKHQsbil7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1pbiIsdCwhMCxjZS50b1N0cmluZyhuKSl9Z3QodCxuKXtyZXR1cm4gdGhpcy5zZXRMaW1pdCgibWluIix0LCExLGNlLnRvU3RyaW5nKG4pKX1sdGUodCxuKXtyZXR1cm4gdGhpcy5zZXRMaW1pdCgibWF4Iix0LCEwLGNlLnRvU3RyaW5nKG4pKX1sdCh0LG4pe3JldHVybiB0aGlzLnNldExpbWl0KCJtYXgiLHQsITEsY2UudG9TdHJpbmcobikpfXNldExpbWl0KHQsbixyLGkpe3JldHVybiBuZXcgYW8oey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3Mse2tpbmQ6dCx2YWx1ZTpuLGluY2x1c2l2ZTpyLG1lc3NhZ2U6Y2UudG9TdHJpbmcoaSl9XX0pfV9hZGRDaGVjayh0KXtyZXR1cm4gbmV3IGFvKHsuLi50aGlzLl9kZWYsY2hlY2tzOlsuLi50aGlzLl9kZWYuY2hlY2tzLHRdfSl9aW50KHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoiaW50IixtZXNzYWdlOmNlLnRvU3RyaW5nKHQpfSl9cG9zaXRpdmUodCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtaW4iLHZhbHVlOjAsaW5jbHVzaXZlOiExLG1lc3NhZ2U6Y2UudG9TdHJpbmcodCl9KX1uZWdhdGl2ZSh0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1heCIsdmFsdWU6MCxpbmNsdXNpdmU6ITEsbWVzc2FnZTpjZS50b1N0cmluZyh0KX0pfW5vbnBvc2l0aXZlKHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWF4Iix2YWx1ZTowLGluY2x1c2l2ZTohMCxtZXNzYWdlOmNlLnRvU3RyaW5nKHQpfSl9bm9ubmVnYXRpdmUodCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtaW4iLHZhbHVlOjAsaW5jbHVzaXZlOiEwLG1lc3NhZ2U6Y2UudG9TdHJpbmcodCl9KX1tdWx0aXBsZU9mKHQsbil7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtdWx0aXBsZU9mIix2YWx1ZTp0LG1lc3NhZ2U6Y2UudG9TdHJpbmcobil9KX1maW5pdGUodCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJmaW5pdGUiLG1lc3NhZ2U6Y2UudG9TdHJpbmcodCl9KX1zYWZlKHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIixpbmNsdXNpdmU6ITAsdmFsdWU6TnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIsbWVzc2FnZTpjZS50b1N0cmluZyh0KX0pLl9hZGRDaGVjayh7a2luZDoibWF4IixpbmNsdXNpdmU6ITAsdmFsdWU6TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsbWVzc2FnZTpjZS50b1N0cmluZyh0KX0pfWdldCBtaW5WYWx1ZSgpe2xldCB0PW51bGw7Zm9yKGNvbnN0IG4gb2YgdGhpcy5fZGVmLmNoZWNrcyluLmtpbmQ9PT0ibWluIiYmKHQ9PT1udWxsfHxuLnZhbHVlPnQpJiYodD1uLnZhbHVlKTtyZXR1cm4gdH1nZXQgbWF4VmFsdWUoKXtsZXQgdD1udWxsO2Zvcihjb25zdCBuIG9mIHRoaXMuX2RlZi5jaGVja3Mpbi5raW5kPT09Im1heCImJih0PT09bnVsbHx8bi52YWx1ZTx0KSYmKHQ9bi52YWx1ZSk7cmV0dXJuIHR9Z2V0IGlzSW50KCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQodD0+dC5raW5kPT09ImludCJ8fHQua2luZD09PSJtdWx0aXBsZU9mIiYmSWUuaXNJbnRlZ2VyKHQudmFsdWUpKX1nZXQgaXNGaW5pdGUoKXtsZXQgdD1udWxsLG49bnVsbDtmb3IoY29uc3QgciBvZiB0aGlzLl9kZWYuY2hlY2tzKXtpZihyLmtpbmQ9PT0iZmluaXRlInx8ci5raW5kPT09ImludCJ8fHIua2luZD09PSJtdWx0aXBsZU9mIilyZXR1cm4hMDtyLmtpbmQ9PT0ibWluIj8obj09PW51bGx8fHIudmFsdWU+bikmJihuPXIudmFsdWUpOnIua2luZD09PSJtYXgiJiYodD09PW51bGx8fHIudmFsdWU8dCkmJih0PXIudmFsdWUpfXJldHVybiBOdW1iZXIuaXNGaW5pdGUobikmJk51bWJlci5pc0Zpbml0ZSh0KX19YW8uY3JlYXRlPWU9Pm5ldyBhbyh7Y2hlY2tzOltdLHR5cGVOYW1lOmRlLlpvZE51bWJlcixjb2VyY2U6KGU9PW51bGw/dm9pZCAwOmUuY29lcmNlKXx8ITEsLi4uX2UoZSl9KTtjbGFzcyB1byBleHRlbmRzIENle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLm1pbj10aGlzLmd0ZSx0aGlzLm1heD10aGlzLmx0ZX1fcGFyc2UodCl7aWYodGhpcy5fZGVmLmNvZXJjZSYmKHQuZGF0YT1CaWdJbnQodC5kYXRhKSksdGhpcy5fZ2V0VHlwZSh0KSE9PVEuYmlnaW50KXtjb25zdCBvPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQpO3JldHVybiBxKG8se2NvZGU6Vy5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6US5iaWdpbnQscmVjZWl2ZWQ6by5wYXJzZWRUeXBlfSksZ2V9bGV0IHI7Y29uc3QgaT1uZXcgb247Zm9yKGNvbnN0IG8gb2YgdGhpcy5fZGVmLmNoZWNrcylvLmtpbmQ9PT0ibWluIj8oby5pbmNsdXNpdmU/dC5kYXRhPG8udmFsdWU6dC5kYXRhPD1vLnZhbHVlKSYmKHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxyKSxxKHIse2NvZGU6Vy50b29fc21hbGwsdHlwZToiYmlnaW50IixtaW5pbXVtOm8udmFsdWUsaW5jbHVzaXZlOm8uaW5jbHVzaXZlLG1lc3NhZ2U6by5tZXNzYWdlfSksaS5kaXJ0eSgpKTpvLmtpbmQ9PT0ibWF4Ij8oby5pbmNsdXNpdmU/dC5kYXRhPm8udmFsdWU6dC5kYXRhPj1vLnZhbHVlKSYmKHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxyKSxxKHIse2NvZGU6Vy50b29fYmlnLHR5cGU6ImJpZ2ludCIsbWF4aW11bTpvLnZhbHVlLGluY2x1c2l2ZTpvLmluY2x1c2l2ZSxtZXNzYWdlOm8ubWVzc2FnZX0pLGkuZGlydHkoKSk6by5raW5kPT09Im11bHRpcGxlT2YiP3QuZGF0YSVvLnZhbHVlIT09QmlnSW50KDApJiYocj10aGlzLl9nZXRPclJldHVybkN0eCh0LHIpLHEocix7Y29kZTpXLm5vdF9tdWx0aXBsZV9vZixtdWx0aXBsZU9mOm8udmFsdWUsbWVzc2FnZTpvLm1lc3NhZ2V9KSxpLmRpcnR5KCkpOkllLmFzc2VydE5ldmVyKG8pO3JldHVybntzdGF0dXM6aS52YWx1ZSx2YWx1ZTp0LmRhdGF9fWd0ZSh0LG4pe3JldHVybiB0aGlzLnNldExpbWl0KCJtaW4iLHQsITAsY2UudG9TdHJpbmcobikpfWd0KHQsbil7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1pbiIsdCwhMSxjZS50b1N0cmluZyhuKSl9bHRlKHQsbil7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1heCIsdCwhMCxjZS50b1N0cmluZyhuKSl9bHQodCxuKXtyZXR1cm4gdGhpcy5zZXRMaW1pdCgibWF4Iix0LCExLGNlLnRvU3RyaW5nKG4pKX1zZXRMaW1pdCh0LG4scixpKXtyZXR1cm4gbmV3IHVvKHsuLi50aGlzLl9kZWYsY2hlY2tzOlsuLi50aGlzLl9kZWYuY2hlY2tzLHtraW5kOnQsdmFsdWU6bixpbmNsdXNpdmU6cixtZXNzYWdlOmNlLnRvU3RyaW5nKGkpfV19KX1fYWRkQ2hlY2sodCl7cmV0dXJuIG5ldyB1byh7Li4udGhpcy5fZGVmLGNoZWNrczpbLi4udGhpcy5fZGVmLmNoZWNrcyx0XX0pfXBvc2l0aXZlKHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTpCaWdJbnQoMCksaW5jbHVzaXZlOiExLG1lc3NhZ2U6Y2UudG9TdHJpbmcodCl9KX1uZWdhdGl2ZSh0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1heCIsdmFsdWU6QmlnSW50KDApLGluY2x1c2l2ZTohMSxtZXNzYWdlOmNlLnRvU3RyaW5nKHQpfSl9bm9ucG9zaXRpdmUodCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtYXgiLHZhbHVlOkJpZ0ludCgwKSxpbmNsdXNpdmU6ITAsbWVzc2FnZTpjZS50b1N0cmluZyh0KX0pfW5vbm5lZ2F0aXZlKHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTpCaWdJbnQoMCksaW5jbHVzaXZlOiEwLG1lc3NhZ2U6Y2UudG9TdHJpbmcodCl9KX1tdWx0aXBsZU9mKHQsbil7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtdWx0aXBsZU9mIix2YWx1ZTp0LG1lc3NhZ2U6Y2UudG9TdHJpbmcobil9KX1nZXQgbWluVmFsdWUoKXtsZXQgdD1udWxsO2Zvcihjb25zdCBuIG9mIHRoaXMuX2RlZi5jaGVja3Mpbi5raW5kPT09Im1pbiImJih0PT09bnVsbHx8bi52YWx1ZT50KSYmKHQ9bi52YWx1ZSk7cmV0dXJuIHR9Z2V0IG1heFZhbHVlKCl7bGV0IHQ9bnVsbDtmb3IoY29uc3QgbiBvZiB0aGlzLl9kZWYuY2hlY2tzKW4ua2luZD09PSJtYXgiJiYodD09PW51bGx8fG4udmFsdWU8dCkmJih0PW4udmFsdWUpO3JldHVybiB0fX11by5jcmVhdGU9ZT0+e3ZhciB0O3JldHVybiBuZXcgdW8oe2NoZWNrczpbXSx0eXBlTmFtZTpkZS5ab2RCaWdJbnQsY29lcmNlOih0PWU9PW51bGw/dm9pZCAwOmUuY29lcmNlKSE9PW51bGwmJnQhPT12b2lkIDA/dDohMSwuLi5fZShlKX0pfTtjbGFzcyBkdSBleHRlbmRzIENle19wYXJzZSh0KXtpZih0aGlzLl9kZWYuY29lcmNlJiYodC5kYXRhPSEhdC5kYXRhKSx0aGlzLl9nZXRUeXBlKHQpIT09US5ib29sZWFuKXtjb25zdCByPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQpO3JldHVybiBxKHIse2NvZGU6Vy5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6US5ib29sZWFuLHJlY2VpdmVkOnIucGFyc2VkVHlwZX0pLGdlfXJldHVybiB5bih0LmRhdGEpfX1kdS5jcmVhdGU9ZT0+bmV3IGR1KHt0eXBlTmFtZTpkZS5ab2RCb29sZWFuLGNvZXJjZTooZT09bnVsbD92b2lkIDA6ZS5jb2VyY2UpfHwhMSwuLi5fZShlKX0pO2NsYXNzIEpvIGV4dGVuZHMgQ2V7X3BhcnNlKHQpe2lmKHRoaXMuX2RlZi5jb2VyY2UmJih0LmRhdGE9bmV3IERhdGUodC5kYXRhKSksdGhpcy5fZ2V0VHlwZSh0KSE9PVEuZGF0ZSl7Y29uc3Qgbz10aGlzLl9nZXRPclJldHVybkN0eCh0KTtyZXR1cm4gcShvLHtjb2RlOlcuaW52YWxpZF90eXBlLGV4cGVjdGVkOlEuZGF0ZSxyZWNlaXZlZDpvLnBhcnNlZFR5cGV9KSxnZX1pZihpc05hTih0LmRhdGEuZ2V0VGltZSgpKSl7Y29uc3Qgbz10aGlzLl9nZXRPclJldHVybkN0eCh0KTtyZXR1cm4gcShvLHtjb2RlOlcuaW52YWxpZF9kYXRlfSksZ2V9Y29uc3Qgcj1uZXcgb247bGV0IGk7Zm9yKGNvbnN0IG8gb2YgdGhpcy5fZGVmLmNoZWNrcylvLmtpbmQ9PT0ibWluIj90LmRhdGEuZ2V0VGltZSgpPG8udmFsdWUmJihpPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQsaSkscShpLHtjb2RlOlcudG9vX3NtYWxsLG1lc3NhZ2U6by5tZXNzYWdlLGluY2x1c2l2ZTohMCxleGFjdDohMSxtaW5pbXVtOm8udmFsdWUsdHlwZToiZGF0ZSJ9KSxyLmRpcnR5KCkpOm8ua2luZD09PSJtYXgiP3QuZGF0YS5nZXRUaW1lKCk+by52YWx1ZSYmKGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxpKSxxKGkse2NvZGU6Vy50b29fYmlnLG1lc3NhZ2U6by5tZXNzYWdlLGluY2x1c2l2ZTohMCxleGFjdDohMSxtYXhpbXVtOm8udmFsdWUsdHlwZToiZGF0ZSJ9KSxyLmRpcnR5KCkpOkllLmFzc2VydE5ldmVyKG8pO3JldHVybntzdGF0dXM6ci52YWx1ZSx2YWx1ZTpuZXcgRGF0ZSh0LmRhdGEuZ2V0VGltZSgpKX19X2FkZENoZWNrKHQpe3JldHVybiBuZXcgSm8oey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3MsdF19KX1taW4odCxuKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1pbiIsdmFsdWU6dC5nZXRUaW1lKCksbWVzc2FnZTpjZS50b1N0cmluZyhuKX0pfW1heCh0LG4pe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWF4Iix2YWx1ZTp0LmdldFRpbWUoKSxtZXNzYWdlOmNlLnRvU3RyaW5nKG4pfSl9Z2V0IG1pbkRhdGUoKXtsZXQgdD1udWxsO2Zvcihjb25zdCBuIG9mIHRoaXMuX2RlZi5jaGVja3Mpbi5raW5kPT09Im1pbiImJih0PT09bnVsbHx8bi52YWx1ZT50KSYmKHQ9bi52YWx1ZSk7cmV0dXJuIHQhPW51bGw/bmV3IERhdGUodCk6bnVsbH1nZXQgbWF4RGF0ZSgpe2xldCB0PW51bGw7Zm9yKGNvbnN0IG4gb2YgdGhpcy5fZGVmLmNoZWNrcyluLmtpbmQ9PT0ibWF4IiYmKHQ9PT1udWxsfHxuLnZhbHVlPHQpJiYodD1uLnZhbHVlKTtyZXR1cm4gdCE9bnVsbD9uZXcgRGF0ZSh0KTpudWxsfX1Kby5jcmVhdGU9ZT0+bmV3IEpvKHtjaGVja3M6W10sY29lcmNlOihlPT1udWxsP3ZvaWQgMDplLmNvZXJjZSl8fCExLHR5cGVOYW1lOmRlLlpvZERhdGUsLi4uX2UoZSl9KTtjbGFzcyBXZCBleHRlbmRzIENle19wYXJzZSh0KXtpZih0aGlzLl9nZXRUeXBlKHQpIT09US5zeW1ib2wpe2NvbnN0IHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCk7cmV0dXJuIHEocix7Y29kZTpXLmludmFsaWRfdHlwZSxleHBlY3RlZDpRLnN5bWJvbCxyZWNlaXZlZDpyLnBhcnNlZFR5cGV9KSxnZX1yZXR1cm4geW4odC5kYXRhKX19V2QuY3JlYXRlPWU9Pm5ldyBXZCh7dHlwZU5hbWU6ZGUuWm9kU3ltYm9sLC4uLl9lKGUpfSk7Y2xhc3MgZnUgZXh0ZW5kcyBDZXtfcGFyc2UodCl7aWYodGhpcy5fZ2V0VHlwZSh0KSE9PVEudW5kZWZpbmVkKXtjb25zdCByPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQpO3JldHVybiBxKHIse2NvZGU6Vy5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6US51bmRlZmluZWQscmVjZWl2ZWQ6ci5wYXJzZWRUeXBlfSksZ2V9cmV0dXJuIHluKHQuZGF0YSl9fWZ1LmNyZWF0ZT1lPT5uZXcgZnUoe3R5cGVOYW1lOmRlLlpvZFVuZGVmaW5lZCwuLi5fZShlKX0pO2NsYXNzIGh1IGV4dGVuZHMgQ2V7X3BhcnNlKHQpe2lmKHRoaXMuX2dldFR5cGUodCkhPT1RLm51bGwpe2NvbnN0IHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCk7cmV0dXJuIHEocix7Y29kZTpXLmludmFsaWRfdHlwZSxleHBlY3RlZDpRLm51bGwscmVjZWl2ZWQ6ci5wYXJzZWRUeXBlfSksZ2V9cmV0dXJuIHluKHQuZGF0YSl9fWh1LmNyZWF0ZT1lPT5uZXcgaHUoe3R5cGVOYW1lOmRlLlpvZE51bGwsLi4uX2UoZSl9KTtjbGFzcyBocyBleHRlbmRzIENle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9hbnk9ITB9X3BhcnNlKHQpe3JldHVybiB5bih0LmRhdGEpfX1ocy5jcmVhdGU9ZT0+bmV3IGhzKHt0eXBlTmFtZTpkZS5ab2RBbnksLi4uX2UoZSl9KTtjbGFzcyBVbyBleHRlbmRzIENle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl91bmtub3duPSEwfV9wYXJzZSh0KXtyZXR1cm4geW4odC5kYXRhKX19VW8uY3JlYXRlPWU9Pm5ldyBVbyh7dHlwZU5hbWU6ZGUuWm9kVW5rbm93biwuLi5fZShlKX0pO2NsYXNzIG1pIGV4dGVuZHMgQ2V7X3BhcnNlKHQpe2NvbnN0IG49dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCk7cmV0dXJuIHEobix7Y29kZTpXLmludmFsaWRfdHlwZSxleHBlY3RlZDpRLm5ldmVyLHJlY2VpdmVkOm4ucGFyc2VkVHlwZX0pLGdlfX1taS5jcmVhdGU9ZT0+bmV3IG1pKHt0eXBlTmFtZTpkZS5ab2ROZXZlciwuLi5fZShlKX0pO2NsYXNzIFZkIGV4dGVuZHMgQ2V7X3BhcnNlKHQpe2lmKHRoaXMuX2dldFR5cGUodCkhPT1RLnVuZGVmaW5lZCl7Y29uc3Qgcj10aGlzLl9nZXRPclJldHVybkN0eCh0KTtyZXR1cm4gcShyLHtjb2RlOlcuaW52YWxpZF90eXBlLGV4cGVjdGVkOlEudm9pZCxyZWNlaXZlZDpyLnBhcnNlZFR5cGV9KSxnZX1yZXR1cm4geW4odC5kYXRhKX19VmQuY3JlYXRlPWU9Pm5ldyBWZCh7dHlwZU5hbWU6ZGUuWm9kVm9pZCwuLi5fZShlKX0pO2NsYXNzIENyIGV4dGVuZHMgQ2V7X3BhcnNlKHQpe2NvbnN0e2N0eDpuLHN0YXR1czpyfT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXModCksaT10aGlzLl9kZWY7aWYobi5wYXJzZWRUeXBlIT09US5hcnJheSlyZXR1cm4gcShuLHtjb2RlOlcuaW52YWxpZF90eXBlLGV4cGVjdGVkOlEuYXJyYXkscmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSksZ2U7aWYoaS5leGFjdExlbmd0aCE9PW51bGwpe2NvbnN0IGw9bi5kYXRhLmxlbmd0aD5pLmV4YWN0TGVuZ3RoLnZhbHVlLHM9bi5kYXRhLmxlbmd0aDxpLmV4YWN0TGVuZ3RoLnZhbHVlOyhsfHxzKSYmKHEobix7Y29kZTpsP1cudG9vX2JpZzpXLnRvb19zbWFsbCxtaW5pbXVtOnM/aS5leGFjdExlbmd0aC52YWx1ZTp2b2lkIDAsbWF4aW11bTpsP2kuZXhhY3RMZW5ndGgudmFsdWU6dm9pZCAwLHR5cGU6ImFycmF5IixpbmNsdXNpdmU6ITAsZXhhY3Q6ITAsbWVzc2FnZTppLmV4YWN0TGVuZ3RoLm1lc3NhZ2V9KSxyLmRpcnR5KCkpfWlmKGkubWluTGVuZ3RoIT09bnVsbCYmbi5kYXRhLmxlbmd0aDxpLm1pbkxlbmd0aC52YWx1ZSYmKHEobix7Y29kZTpXLnRvb19zbWFsbCxtaW5pbXVtOmkubWluTGVuZ3RoLnZhbHVlLHR5cGU6ImFycmF5IixpbmNsdXNpdmU6ITAsZXhhY3Q6ITEsbWVzc2FnZTppLm1pbkxlbmd0aC5tZXNzYWdlfSksci5kaXJ0eSgpKSxpLm1heExlbmd0aCE9PW51bGwmJm4uZGF0YS5sZW5ndGg+aS5tYXhMZW5ndGgudmFsdWUmJihxKG4se2NvZGU6Vy50b29fYmlnLG1heGltdW06aS5tYXhMZW5ndGgudmFsdWUsdHlwZToiYXJyYXkiLGluY2x1c2l2ZTohMCxleGFjdDohMSxtZXNzYWdlOmkubWF4TGVuZ3RoLm1lc3NhZ2V9KSxyLmRpcnR5KCkpLG4uY29tbW9uLmFzeW5jKXJldHVybiBQcm9taXNlLmFsbChbLi4ubi5kYXRhXS5tYXAoKGwscyk9PmkudHlwZS5fcGFyc2VBc3luYyhuZXcgSHIobixsLG4ucGF0aCxzKSkpKS50aGVuKGw9Pm9uLm1lcmdlQXJyYXkocixsKSk7Y29uc3Qgbz1bLi4ubi5kYXRhXS5tYXAoKGwscyk9PmkudHlwZS5fcGFyc2VTeW5jKG5ldyBIcihuLGwsbi5wYXRoLHMpKSk7cmV0dXJuIG9uLm1lcmdlQXJyYXkocixvKX1nZXQgZWxlbWVudCgpe3JldHVybiB0aGlzLl9kZWYudHlwZX1taW4odCxuKXtyZXR1cm4gbmV3IENyKHsuLi50aGlzLl9kZWYsbWluTGVuZ3RoOnt2YWx1ZTp0LG1lc3NhZ2U6Y2UudG9TdHJpbmcobil9fSl9bWF4KHQsbil7cmV0dXJuIG5ldyBDcih7Li4udGhpcy5fZGVmLG1heExlbmd0aDp7dmFsdWU6dCxtZXNzYWdlOmNlLnRvU3RyaW5nKG4pfX0pfWxlbmd0aCh0LG4pe3JldHVybiBuZXcgQ3Ioey4uLnRoaXMuX2RlZixleGFjdExlbmd0aDp7dmFsdWU6dCxtZXNzYWdlOmNlLnRvU3RyaW5nKG4pfX0pfW5vbmVtcHR5KHQpe3JldHVybiB0aGlzLm1pbigxLHQpfX1Dci5jcmVhdGU9KGUsdCk9Pm5ldyBDcih7dHlwZTplLG1pbkxlbmd0aDpudWxsLG1heExlbmd0aDpudWxsLGV4YWN0TGVuZ3RoOm51bGwsdHlwZU5hbWU6ZGUuWm9kQXJyYXksLi4uX2UodCl9KTtmdW5jdGlvbiBrbChlKXtpZihlIGluc3RhbmNlb2YgY3Qpe2NvbnN0IHQ9e307Zm9yKGNvbnN0IG4gaW4gZS5zaGFwZSl7Y29uc3Qgcj1lLnNoYXBlW25dO3Rbbl09Y2kuY3JlYXRlKGtsKHIpKX1yZXR1cm4gbmV3IGN0KHsuLi5lLl9kZWYsc2hhcGU6KCk9PnR9KX1lbHNlIHJldHVybiBlIGluc3RhbmNlb2YgQ3I/bmV3IENyKHsuLi5lLl9kZWYsdHlwZTprbChlLmVsZW1lbnQpfSk6ZSBpbnN0YW5jZW9mIGNpP2NpLmNyZWF0ZShrbChlLnVud3JhcCgpKSk6ZSBpbnN0YW5jZW9mIGVsP2VsLmNyZWF0ZShrbChlLnVud3JhcCgpKSk6ZSBpbnN0YW5jZW9mIEtyP0tyLmNyZWF0ZShlLml0ZW1zLm1hcCh0PT5rbCh0KSkpOmV9Y2xhc3MgY3QgZXh0ZW5kcyBDZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fY2FjaGVkPW51bGwsdGhpcy5ub25zdHJpY3Q9dGhpcy5wYXNzdGhyb3VnaCx0aGlzLmF1Z21lbnQ9dGhpcy5leHRlbmR9X2dldENhY2hlZCgpe2lmKHRoaXMuX2NhY2hlZCE9PW51bGwpcmV0dXJuIHRoaXMuX2NhY2hlZDtjb25zdCB0PXRoaXMuX2RlZi5zaGFwZSgpLG49SWUub2JqZWN0S2V5cyh0KTtyZXR1cm4gdGhpcy5fY2FjaGVkPXtzaGFwZTp0LGtleXM6bn19X3BhcnNlKHQpe2lmKHRoaXMuX2dldFR5cGUodCkhPT1RLm9iamVjdCl7Y29uc3QgdT10aGlzLl9nZXRPclJldHVybkN0eCh0KTtyZXR1cm4gcSh1LHtjb2RlOlcuaW52YWxpZF90eXBlLGV4cGVjdGVkOlEub2JqZWN0LHJlY2VpdmVkOnUucGFyc2VkVHlwZX0pLGdlfWNvbnN0e3N0YXR1czpyLGN0eDppfT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXModCkse3NoYXBlOm8sa2V5czpsfT10aGlzLl9nZXRDYWNoZWQoKSxzPVtdO2lmKCEodGhpcy5fZGVmLmNhdGNoYWxsIGluc3RhbmNlb2YgbWkmJnRoaXMuX2RlZi51bmtub3duS2V5cz09PSJzdHJpcCIpKWZvcihjb25zdCB1IGluIGkuZGF0YSlsLmluY2x1ZGVzKHUpfHxzLnB1c2godSk7Y29uc3QgYT1bXTtmb3IoY29uc3QgdSBvZiBsKXtjb25zdCBjPW9bdV0sZD1pLmRhdGFbdV07YS5wdXNoKHtrZXk6e3N0YXR1czoidmFsaWQiLHZhbHVlOnV9LHZhbHVlOmMuX3BhcnNlKG5ldyBIcihpLGQsaS5wYXRoLHUpKSxhbHdheXNTZXQ6dSBpbiBpLmRhdGF9KX1pZih0aGlzLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiBtaSl7Y29uc3QgdT10aGlzLl9kZWYudW5rbm93bktleXM7aWYodT09PSJwYXNzdGhyb3VnaCIpZm9yKGNvbnN0IGMgb2YgcylhLnB1c2goe2tleTp7c3RhdHVzOiJ2YWxpZCIsdmFsdWU6Y30sdmFsdWU6e3N0YXR1czoidmFsaWQiLHZhbHVlOmkuZGF0YVtjXX19KTtlbHNlIGlmKHU9PT0ic3RyaWN0IilzLmxlbmd0aD4wJiYocShpLHtjb2RlOlcudW5yZWNvZ25pemVkX2tleXMsa2V5czpzfSksci5kaXJ0eSgpKTtlbHNlIGlmKHUhPT0ic3RyaXAiKXRocm93IG5ldyBFcnJvcigiSW50ZXJuYWwgWm9kT2JqZWN0IGVycm9yOiBpbnZhbGlkIHVua25vd25LZXlzIHZhbHVlLiIpfWVsc2V7Y29uc3QgdT10aGlzLl9kZWYuY2F0Y2hhbGw7Zm9yKGNvbnN0IGMgb2Ygcyl7Y29uc3QgZD1pLmRhdGFbY107YS5wdXNoKHtrZXk6e3N0YXR1czoidmFsaWQiLHZhbHVlOmN9LHZhbHVlOnUuX3BhcnNlKG5ldyBIcihpLGQsaS5wYXRoLGMpKSxhbHdheXNTZXQ6YyBpbiBpLmRhdGF9KX19cmV0dXJuIGkuY29tbW9uLmFzeW5jP1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oYXN5bmMoKT0+e2NvbnN0IHU9W107Zm9yKGNvbnN0IGMgb2YgYSl7Y29uc3QgZD1hd2FpdCBjLmtleTt1LnB1c2goe2tleTpkLHZhbHVlOmF3YWl0IGMudmFsdWUsYWx3YXlzU2V0OmMuYWx3YXlzU2V0fSl9cmV0dXJuIHV9KS50aGVuKHU9Pm9uLm1lcmdlT2JqZWN0U3luYyhyLHUpKTpvbi5tZXJnZU9iamVjdFN5bmMocixhKX1nZXQgc2hhcGUoKXtyZXR1cm4gdGhpcy5fZGVmLnNoYXBlKCl9c3RyaWN0KHQpe3JldHVybiBjZS5lcnJUb09iaixuZXcgY3Qoey4uLnRoaXMuX2RlZix1bmtub3duS2V5czoic3RyaWN0IiwuLi50IT09dm9pZCAwP3tlcnJvck1hcDoobixyKT0+e3ZhciBpLG8sbCxzO2NvbnN0IGE9KGw9KG89KGk9dGhpcy5fZGVmKS5lcnJvck1hcCk9PT1udWxsfHxvPT09dm9pZCAwP3ZvaWQgMDpvLmNhbGwoaSxuLHIpLm1lc3NhZ2UpIT09bnVsbCYmbCE9PXZvaWQgMD9sOnIuZGVmYXVsdEVycm9yO3JldHVybiBuLmNvZGU9PT0idW5yZWNvZ25pemVkX2tleXMiP3ttZXNzYWdlOihzPWNlLmVyclRvT2JqKHQpLm1lc3NhZ2UpIT09bnVsbCYmcyE9PXZvaWQgMD9zOmF9OnttZXNzYWdlOmF9fX06e319KX1zdHJpcCgpe3JldHVybiBuZXcgY3Qoey4uLnRoaXMuX2RlZix1bmtub3duS2V5czoic3RyaXAifSl9cGFzc3Rocm91Z2goKXtyZXR1cm4gbmV3IGN0KHsuLi50aGlzLl9kZWYsdW5rbm93bktleXM6InBhc3N0aHJvdWdoIn0pfWV4dGVuZCh0KXtyZXR1cm4gbmV3IGN0KHsuLi50aGlzLl9kZWYsc2hhcGU6KCk9Pih7Li4udGhpcy5fZGVmLnNoYXBlKCksLi4udH0pfSl9bWVyZ2UodCl7cmV0dXJuIG5ldyBjdCh7dW5rbm93bktleXM6dC5fZGVmLnVua25vd25LZXlzLGNhdGNoYWxsOnQuX2RlZi5jYXRjaGFsbCxzaGFwZTooKT0+KHsuLi50aGlzLl9kZWYuc2hhcGUoKSwuLi50Ll9kZWYuc2hhcGUoKX0pLHR5cGVOYW1lOmRlLlpvZE9iamVjdH0pfXNldEtleSh0LG4pe3JldHVybiB0aGlzLmF1Z21lbnQoe1t0XTpufSl9Y2F0Y2hhbGwodCl7cmV0dXJuIG5ldyBjdCh7Li4udGhpcy5fZGVmLGNhdGNoYWxsOnR9KX1waWNrKHQpe2NvbnN0IG49e307cmV0dXJuIEllLm9iamVjdEtleXModCkuZm9yRWFjaChyPT57dFtyXSYmdGhpcy5zaGFwZVtyXSYmKG5bcl09dGhpcy5zaGFwZVtyXSl9KSxuZXcgY3Qoey4uLnRoaXMuX2RlZixzaGFwZTooKT0+bn0pfW9taXQodCl7Y29uc3Qgbj17fTtyZXR1cm4gSWUub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKHI9Pnt0W3JdfHwobltyXT10aGlzLnNoYXBlW3JdKX0pLG5ldyBjdCh7Li4udGhpcy5fZGVmLHNoYXBlOigpPT5ufSl9ZGVlcFBhcnRpYWwoKXtyZXR1cm4ga2wodGhpcyl9cGFydGlhbCh0KXtjb25zdCBuPXt9O3JldHVybiBJZS5vYmplY3RLZXlzKHRoaXMuc2hhcGUpLmZvckVhY2gocj0+e2NvbnN0IGk9dGhpcy5zaGFwZVtyXTt0JiYhdFtyXT9uW3JdPWk6bltyXT1pLm9wdGlvbmFsKCl9KSxuZXcgY3Qoey4uLnRoaXMuX2RlZixzaGFwZTooKT0+bn0pfXJlcXVpcmVkKHQpe2NvbnN0IG49e307cmV0dXJuIEllLm9iamVjdEtleXModGhpcy5zaGFwZSkuZm9yRWFjaChyPT57aWYodCYmIXRbcl0pbltyXT10aGlzLnNoYXBlW3JdO2Vsc2V7bGV0IG89dGhpcy5zaGFwZVtyXTtmb3IoO28gaW5zdGFuY2VvZiBjaTspbz1vLl9kZWYuaW5uZXJUeXBlO25bcl09b319KSxuZXcgY3Qoey4uLnRoaXMuX2RlZixzaGFwZTooKT0+bn0pfWtleW9mKCl7cmV0dXJuIFRDKEllLm9iamVjdEtleXModGhpcy5zaGFwZSkpfX1jdC5jcmVhdGU9KGUsdCk9Pm5ldyBjdCh7c2hhcGU6KCk9PmUsdW5rbm93bktleXM6InN0cmlwIixjYXRjaGFsbDptaS5jcmVhdGUoKSx0eXBlTmFtZTpkZS5ab2RPYmplY3QsLi4uX2UodCl9KTtjdC5zdHJpY3RDcmVhdGU9KGUsdCk9Pm5ldyBjdCh7c2hhcGU6KCk9PmUsdW5rbm93bktleXM6InN0cmljdCIsY2F0Y2hhbGw6bWkuY3JlYXRlKCksdHlwZU5hbWU6ZGUuWm9kT2JqZWN0LC4uLl9lKHQpfSk7Y3QubGF6eWNyZWF0ZT0oZSx0KT0+bmV3IGN0KHtzaGFwZTplLHVua25vd25LZXlzOiJzdHJpcCIsY2F0Y2hhbGw6bWkuY3JlYXRlKCksdHlwZU5hbWU6ZGUuWm9kT2JqZWN0LC4uLl9lKHQpfSk7Y2xhc3MgcHUgZXh0ZW5kcyBDZXtfcGFyc2UodCl7Y29uc3R7Y3R4Om59PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyh0KSxyPXRoaXMuX2RlZi5vcHRpb25zO2Z1bmN0aW9uIGkobyl7Zm9yKGNvbnN0IHMgb2YgbylpZihzLnJlc3VsdC5zdGF0dXM9PT0idmFsaWQiKXJldHVybiBzLnJlc3VsdDtmb3IoY29uc3QgcyBvZiBvKWlmKHMucmVzdWx0LnN0YXR1cz09PSJkaXJ0eSIpcmV0dXJuIG4uY29tbW9uLmlzc3Vlcy5wdXNoKC4uLnMuY3R4LmNvbW1vbi5pc3N1ZXMpLHMucmVzdWx0O2NvbnN0IGw9by5tYXAocz0+bmV3IEVyKHMuY3R4LmNvbW1vbi5pc3N1ZXMpKTtyZXR1cm4gcShuLHtjb2RlOlcuaW52YWxpZF91bmlvbix1bmlvbkVycm9yczpsfSksZ2V9aWYobi5jb21tb24uYXN5bmMpcmV0dXJuIFByb21pc2UuYWxsKHIubWFwKGFzeW5jIG89Pntjb25zdCBsPXsuLi5uLGNvbW1vbjp7Li4ubi5jb21tb24saXNzdWVzOltdfSxwYXJlbnQ6bnVsbH07cmV0dXJue3Jlc3VsdDphd2FpdCBvLl9wYXJzZUFzeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bH0pLGN0eDpsfX0pKS50aGVuKGkpO3tsZXQgbztjb25zdCBsPVtdO2Zvcihjb25zdCBhIG9mIHIpe2NvbnN0IHU9ey4uLm4sY29tbW9uOnsuLi5uLmNvbW1vbixpc3N1ZXM6W119LHBhcmVudDpudWxsfSxjPWEuX3BhcnNlU3luYyh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50OnV9KTtpZihjLnN0YXR1cz09PSJ2YWxpZCIpcmV0dXJuIGM7Yy5zdGF0dXM9PT0iZGlydHkiJiYhbyYmKG89e3Jlc3VsdDpjLGN0eDp1fSksdS5jb21tb24uaXNzdWVzLmxlbmd0aCYmbC5wdXNoKHUuY29tbW9uLmlzc3Vlcyl9aWYobylyZXR1cm4gbi5jb21tb24uaXNzdWVzLnB1c2goLi4uby5jdHguY29tbW9uLmlzc3Vlcyksby5yZXN1bHQ7Y29uc3Qgcz1sLm1hcChhPT5uZXcgRXIoYSkpO3JldHVybiBxKG4se2NvZGU6Vy5pbnZhbGlkX3VuaW9uLHVuaW9uRXJyb3JzOnN9KSxnZX19Z2V0IG9wdGlvbnMoKXtyZXR1cm4gdGhpcy5fZGVmLm9wdGlvbnN9fXB1LmNyZWF0ZT0oZSx0KT0+bmV3IHB1KHtvcHRpb25zOmUsdHlwZU5hbWU6ZGUuWm9kVW5pb24sLi4uX2UodCl9KTtjb25zdCBIYz1lPT5lIGluc3RhbmNlb2YgdnU/SGMoZS5zY2hlbWEpOmUgaW5zdGFuY2VvZiBicj9IYyhlLmlubmVyVHlwZSgpKTplIGluc3RhbmNlb2YgeXU/W2UudmFsdWVdOmUgaW5zdGFuY2VvZiBjbz9lLm9wdGlvbnM6ZSBpbnN0YW5jZW9mIHh1P09iamVjdC5rZXlzKGUuZW51bSk6ZSBpbnN0YW5jZW9mIF91P0hjKGUuX2RlZi5pbm5lclR5cGUpOmUgaW5zdGFuY2VvZiBmdT9bdm9pZCAwXTplIGluc3RhbmNlb2YgaHU/W251bGxdOm51bGw7Y2xhc3MgTGYgZXh0ZW5kcyBDZXtfcGFyc2UodCl7Y29uc3R7Y3R4Om59PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyh0KTtpZihuLnBhcnNlZFR5cGUhPT1RLm9iamVjdClyZXR1cm4gcShuLHtjb2RlOlcuaW52YWxpZF90eXBlLGV4cGVjdGVkOlEub2JqZWN0LHJlY2VpdmVkOm4ucGFyc2VkVHlwZX0pLGdlO2NvbnN0IHI9dGhpcy5kaXNjcmltaW5hdG9yLGk9bi5kYXRhW3JdLG89dGhpcy5vcHRpb25zTWFwLmdldChpKTtyZXR1cm4gbz9uLmNvbW1vbi5hc3luYz9vLl9wYXJzZUFzeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pOm8uX3BhcnNlU3luYyh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50Om59KToocShuLHtjb2RlOlcuaW52YWxpZF91bmlvbl9kaXNjcmltaW5hdG9yLG9wdGlvbnM6QXJyYXkuZnJvbSh0aGlzLm9wdGlvbnNNYXAua2V5cygpKSxwYXRoOltyXX0pLGdlKX1nZXQgZGlzY3JpbWluYXRvcigpe3JldHVybiB0aGlzLl9kZWYuZGlzY3JpbWluYXRvcn1nZXQgb3B0aW9ucygpe3JldHVybiB0aGlzLl9kZWYub3B0aW9uc31nZXQgb3B0aW9uc01hcCgpe3JldHVybiB0aGlzLl9kZWYub3B0aW9uc01hcH1zdGF0aWMgY3JlYXRlKHQsbixyKXtjb25zdCBpPW5ldyBNYXA7Zm9yKGNvbnN0IG8gb2Ygbil7Y29uc3QgbD1IYyhvLnNoYXBlW3RdKTtpZighbCl0aHJvdyBuZXcgRXJyb3IoYEEgZGlzY3JpbWluYXRvciB2YWx1ZSBmb3Iga2V5IFxgJHt0fVxgIGNvdWxkIG5vdCBiZSBleHRyYWN0ZWQgZnJvbSBhbGwgc2NoZW1hIG9wdGlvbnNgKTtmb3IoY29uc3QgcyBvZiBsKXtpZihpLmhhcyhzKSl0aHJvdyBuZXcgRXJyb3IoYERpc2NyaW1pbmF0b3IgcHJvcGVydHkgJHtTdHJpbmcodCl9IGhhcyBkdXBsaWNhdGUgdmFsdWUgJHtTdHJpbmcocyl9YCk7aS5zZXQocyxvKX19cmV0dXJuIG5ldyBMZih7dHlwZU5hbWU6ZGUuWm9kRGlzY3JpbWluYXRlZFVuaW9uLGRpc2NyaW1pbmF0b3I6dCxvcHRpb25zOm4sb3B0aW9uc01hcDppLC4uLl9lKHIpfSl9fWZ1bmN0aW9uIGptKGUsdCl7Y29uc3Qgbj16aShlKSxyPXppKHQpO2lmKGU9PT10KXJldHVybnt2YWxpZDohMCxkYXRhOmV9O2lmKG49PT1RLm9iamVjdCYmcj09PVEub2JqZWN0KXtjb25zdCBpPUllLm9iamVjdEtleXModCksbz1JZS5vYmplY3RLZXlzKGUpLmZpbHRlcihzPT5pLmluZGV4T2YocykhPT0tMSksbD17Li4uZSwuLi50fTtmb3IoY29uc3QgcyBvZiBvKXtjb25zdCBhPWptKGVbc10sdFtzXSk7aWYoIWEudmFsaWQpcmV0dXJue3ZhbGlkOiExfTtsW3NdPWEuZGF0YX1yZXR1cm57dmFsaWQ6ITAsZGF0YTpsfX1lbHNlIGlmKG49PT1RLmFycmF5JiZyPT09US5hcnJheSl7aWYoZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm57dmFsaWQ6ITF9O2NvbnN0IGk9W107Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDtvKyspe2NvbnN0IGw9ZVtvXSxzPXRbb10sYT1qbShsLHMpO2lmKCFhLnZhbGlkKXJldHVybnt2YWxpZDohMX07aS5wdXNoKGEuZGF0YSl9cmV0dXJue3ZhbGlkOiEwLGRhdGE6aX19ZWxzZSByZXR1cm4gbj09PVEuZGF0ZSYmcj09PVEuZGF0ZSYmK2U9PSt0P3t2YWxpZDohMCxkYXRhOmV9Ont2YWxpZDohMX19Y2xhc3MgbXUgZXh0ZW5kcyBDZXtfcGFyc2UodCl7Y29uc3R7c3RhdHVzOm4sY3R4OnJ9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyh0KSxpPShvLGwpPT57aWYoSW0obyl8fEltKGwpKXJldHVybiBnZTtjb25zdCBzPWptKG8udmFsdWUsbC52YWx1ZSk7cmV0dXJuIHMudmFsaWQ/KChMbShvKXx8TG0obCkpJiZuLmRpcnR5KCkse3N0YXR1czpuLnZhbHVlLHZhbHVlOnMuZGF0YX0pOihxKHIse2NvZGU6Vy5pbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlc30pLGdlKX07cmV0dXJuIHIuY29tbW9uLmFzeW5jP1Byb21pc2UuYWxsKFt0aGlzLl9kZWYubGVmdC5fcGFyc2VBc3luYyh7ZGF0YTpyLmRhdGEscGF0aDpyLnBhdGgscGFyZW50OnJ9KSx0aGlzLl9kZWYucmlnaHQuX3BhcnNlQXN5bmMoe2RhdGE6ci5kYXRhLHBhdGg6ci5wYXRoLHBhcmVudDpyfSldKS50aGVuKChbbyxsXSk9PmkobyxsKSk6aSh0aGlzLl9kZWYubGVmdC5fcGFyc2VTeW5jKHtkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pLHRoaXMuX2RlZi5yaWdodC5fcGFyc2VTeW5jKHtkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pKX19bXUuY3JlYXRlPShlLHQsbik9Pm5ldyBtdSh7bGVmdDplLHJpZ2h0OnQsdHlwZU5hbWU6ZGUuWm9kSW50ZXJzZWN0aW9uLC4uLl9lKG4pfSk7Y2xhc3MgS3IgZXh0ZW5kcyBDZXtfcGFyc2UodCl7Y29uc3R7c3RhdHVzOm4sY3R4OnJ9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyh0KTtpZihyLnBhcnNlZFR5cGUhPT1RLmFycmF5KXJldHVybiBxKHIse2NvZGU6Vy5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6US5hcnJheSxyZWNlaXZlZDpyLnBhcnNlZFR5cGV9KSxnZTtpZihyLmRhdGEubGVuZ3RoPHRoaXMuX2RlZi5pdGVtcy5sZW5ndGgpcmV0dXJuIHEocix7Y29kZTpXLnRvb19zbWFsbCxtaW5pbXVtOnRoaXMuX2RlZi5pdGVtcy5sZW5ndGgsaW5jbHVzaXZlOiEwLGV4YWN0OiExLHR5cGU6ImFycmF5In0pLGdlOyF0aGlzLl9kZWYucmVzdCYmci5kYXRhLmxlbmd0aD50aGlzLl9kZWYuaXRlbXMubGVuZ3RoJiYocShyLHtjb2RlOlcudG9vX2JpZyxtYXhpbXVtOnRoaXMuX2RlZi5pdGVtcy5sZW5ndGgsaW5jbHVzaXZlOiEwLGV4YWN0OiExLHR5cGU6ImFycmF5In0pLG4uZGlydHkoKSk7Y29uc3Qgbz1bLi4uci5kYXRhXS5tYXAoKGwscyk9Pntjb25zdCBhPXRoaXMuX2RlZi5pdGVtc1tzXXx8dGhpcy5fZGVmLnJlc3Q7cmV0dXJuIGE/YS5fcGFyc2UobmV3IEhyKHIsbCxyLnBhdGgscykpOm51bGx9KS5maWx0ZXIobD0+ISFsKTtyZXR1cm4gci5jb21tb24uYXN5bmM/UHJvbWlzZS5hbGwobykudGhlbihsPT5vbi5tZXJnZUFycmF5KG4sbCkpOm9uLm1lcmdlQXJyYXkobixvKX1nZXQgaXRlbXMoKXtyZXR1cm4gdGhpcy5fZGVmLml0ZW1zfXJlc3QodCl7cmV0dXJuIG5ldyBLcih7Li4udGhpcy5fZGVmLHJlc3Q6dH0pfX1Lci5jcmVhdGU9KGUsdCk9PntpZighQXJyYXkuaXNBcnJheShlKSl0aHJvdyBuZXcgRXJyb3IoIllvdSBtdXN0IHBhc3MgYW4gYXJyYXkgb2Ygc2NoZW1hcyB0byB6LnR1cGxlKFsgLi4uIF0pIik7cmV0dXJuIG5ldyBLcih7aXRlbXM6ZSx0eXBlTmFtZTpkZS5ab2RUdXBsZSxyZXN0Om51bGwsLi4uX2UodCl9KX07Y2xhc3MgZ3UgZXh0ZW5kcyBDZXtnZXQga2V5U2NoZW1hKCl7cmV0dXJuIHRoaXMuX2RlZi5rZXlUeXBlfWdldCB2YWx1ZVNjaGVtYSgpe3JldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlfV9wYXJzZSh0KXtjb25zdHtzdGF0dXM6bixjdHg6cn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKHQpO2lmKHIucGFyc2VkVHlwZSE9PVEub2JqZWN0KXJldHVybiBxKHIse2NvZGU6Vy5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6US5vYmplY3QscmVjZWl2ZWQ6ci5wYXJzZWRUeXBlfSksZ2U7Y29uc3QgaT1bXSxvPXRoaXMuX2RlZi5rZXlUeXBlLGw9dGhpcy5fZGVmLnZhbHVlVHlwZTtmb3IoY29uc3QgcyBpbiByLmRhdGEpaS5wdXNoKHtrZXk6by5fcGFyc2UobmV3IEhyKHIscyxyLnBhdGgscykpLHZhbHVlOmwuX3BhcnNlKG5ldyBIcihyLHIuZGF0YVtzXSxyLnBhdGgscykpfSk7cmV0dXJuIHIuY29tbW9uLmFzeW5jP29uLm1lcmdlT2JqZWN0QXN5bmMobixpKTpvbi5tZXJnZU9iamVjdFN5bmMobixpKX1nZXQgZWxlbWVudCgpe3JldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlfXN0YXRpYyBjcmVhdGUodCxuLHIpe3JldHVybiBuIGluc3RhbmNlb2YgQ2U/bmV3IGd1KHtrZXlUeXBlOnQsdmFsdWVUeXBlOm4sdHlwZU5hbWU6ZGUuWm9kUmVjb3JkLC4uLl9lKHIpfSk6bmV3IGd1KHtrZXlUeXBlOl9yLmNyZWF0ZSgpLHZhbHVlVHlwZTp0LHR5cGVOYW1lOmRlLlpvZFJlY29yZCwuLi5fZShuKX0pfX1jbGFzcyBIZCBleHRlbmRzIENle2dldCBrZXlTY2hlbWEoKXtyZXR1cm4gdGhpcy5fZGVmLmtleVR5cGV9Z2V0IHZhbHVlU2NoZW1hKCl7cmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGV9X3BhcnNlKHQpe2NvbnN0e3N0YXR1czpuLGN0eDpyfT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXModCk7aWYoci5wYXJzZWRUeXBlIT09US5tYXApcmV0dXJuIHEocix7Y29kZTpXLmludmFsaWRfdHlwZSxleHBlY3RlZDpRLm1hcCxyZWNlaXZlZDpyLnBhcnNlZFR5cGV9KSxnZTtjb25zdCBpPXRoaXMuX2RlZi5rZXlUeXBlLG89dGhpcy5fZGVmLnZhbHVlVHlwZSxsPVsuLi5yLmRhdGEuZW50cmllcygpXS5tYXAoKFtzLGFdLHUpPT4oe2tleTppLl9wYXJzZShuZXcgSHIocixzLHIucGF0aCxbdSwia2V5Il0pKSx2YWx1ZTpvLl9wYXJzZShuZXcgSHIocixhLHIucGF0aCxbdSwidmFsdWUiXSkpfSkpO2lmKHIuY29tbW9uLmFzeW5jKXtjb25zdCBzPW5ldyBNYXA7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oYXN5bmMoKT0+e2Zvcihjb25zdCBhIG9mIGwpe2NvbnN0IHU9YXdhaXQgYS5rZXksYz1hd2FpdCBhLnZhbHVlO2lmKHUuc3RhdHVzPT09ImFib3J0ZWQifHxjLnN0YXR1cz09PSJhYm9ydGVkIilyZXR1cm4gZ2U7KHUuc3RhdHVzPT09ImRpcnR5Inx8Yy5zdGF0dXM9PT0iZGlydHkiKSYmbi5kaXJ0eSgpLHMuc2V0KHUudmFsdWUsYy52YWx1ZSl9cmV0dXJue3N0YXR1czpuLnZhbHVlLHZhbHVlOnN9fSl9ZWxzZXtjb25zdCBzPW5ldyBNYXA7Zm9yKGNvbnN0IGEgb2YgbCl7Y29uc3QgdT1hLmtleSxjPWEudmFsdWU7aWYodS5zdGF0dXM9PT0iYWJvcnRlZCJ8fGMuc3RhdHVzPT09ImFib3J0ZWQiKXJldHVybiBnZTsodS5zdGF0dXM9PT0iZGlydHkifHxjLnN0YXR1cz09PSJkaXJ0eSIpJiZuLmRpcnR5KCkscy5zZXQodS52YWx1ZSxjLnZhbHVlKX1yZXR1cm57c3RhdHVzOm4udmFsdWUsdmFsdWU6c319fX1IZC5jcmVhdGU9KGUsdCxuKT0+bmV3IEhkKHt2YWx1ZVR5cGU6dCxrZXlUeXBlOmUsdHlwZU5hbWU6ZGUuWm9kTWFwLC4uLl9lKG4pfSk7Y2xhc3MgcW8gZXh0ZW5kcyBDZXtfcGFyc2UodCl7Y29uc3R7c3RhdHVzOm4sY3R4OnJ9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyh0KTtpZihyLnBhcnNlZFR5cGUhPT1RLnNldClyZXR1cm4gcShyLHtjb2RlOlcuaW52YWxpZF90eXBlLGV4cGVjdGVkOlEuc2V0LHJlY2VpdmVkOnIucGFyc2VkVHlwZX0pLGdlO2NvbnN0IGk9dGhpcy5fZGVmO2kubWluU2l6ZSE9PW51bGwmJnIuZGF0YS5zaXplPGkubWluU2l6ZS52YWx1ZSYmKHEocix7Y29kZTpXLnRvb19zbWFsbCxtaW5pbXVtOmkubWluU2l6ZS52YWx1ZSx0eXBlOiJzZXQiLGluY2x1c2l2ZTohMCxleGFjdDohMSxtZXNzYWdlOmkubWluU2l6ZS5tZXNzYWdlfSksbi5kaXJ0eSgpKSxpLm1heFNpemUhPT1udWxsJiZyLmRhdGEuc2l6ZT5pLm1heFNpemUudmFsdWUmJihxKHIse2NvZGU6Vy50b29fYmlnLG1heGltdW06aS5tYXhTaXplLnZhbHVlLHR5cGU6InNldCIsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1lc3NhZ2U6aS5tYXhTaXplLm1lc3NhZ2V9KSxuLmRpcnR5KCkpO2NvbnN0IG89dGhpcy5fZGVmLnZhbHVlVHlwZTtmdW5jdGlvbiBsKGEpe2NvbnN0IHU9bmV3IFNldDtmb3IoY29uc3QgYyBvZiBhKXtpZihjLnN0YXR1cz09PSJhYm9ydGVkIilyZXR1cm4gZ2U7Yy5zdGF0dXM9PT0iZGlydHkiJiZuLmRpcnR5KCksdS5hZGQoYy52YWx1ZSl9cmV0dXJue3N0YXR1czpuLnZhbHVlLHZhbHVlOnV9fWNvbnN0IHM9Wy4uLnIuZGF0YS52YWx1ZXMoKV0ubWFwKChhLHUpPT5vLl9wYXJzZShuZXcgSHIocixhLHIucGF0aCx1KSkpO3JldHVybiByLmNvbW1vbi5hc3luYz9Qcm9taXNlLmFsbChzKS50aGVuKGE9PmwoYSkpOmwocyl9bWluKHQsbil7cmV0dXJuIG5ldyBxbyh7Li4udGhpcy5fZGVmLG1pblNpemU6e3ZhbHVlOnQsbWVzc2FnZTpjZS50b1N0cmluZyhuKX19KX1tYXgodCxuKXtyZXR1cm4gbmV3IHFvKHsuLi50aGlzLl9kZWYsbWF4U2l6ZTp7dmFsdWU6dCxtZXNzYWdlOmNlLnRvU3RyaW5nKG4pfX0pfXNpemUodCxuKXtyZXR1cm4gdGhpcy5taW4odCxuKS5tYXgodCxuKX1ub25lbXB0eSh0KXtyZXR1cm4gdGhpcy5taW4oMSx0KX19cW8uY3JlYXRlPShlLHQpPT5uZXcgcW8oe3ZhbHVlVHlwZTplLG1pblNpemU6bnVsbCxtYXhTaXplOm51bGwsdHlwZU5hbWU6ZGUuWm9kU2V0LC4uLl9lKHQpfSk7Y2xhc3MgUWwgZXh0ZW5kcyBDZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy52YWxpZGF0ZT10aGlzLmltcGxlbWVudH1fcGFyc2UodCl7Y29uc3R7Y3R4Om59PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyh0KTtpZihuLnBhcnNlZFR5cGUhPT1RLmZ1bmN0aW9uKXJldHVybiBxKG4se2NvZGU6Vy5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6US5mdW5jdGlvbixyZWNlaXZlZDpuLnBhcnNlZFR5cGV9KSxnZTtmdW5jdGlvbiByKHMsYSl7cmV0dXJuIEJkKHtkYXRhOnMscGF0aDpuLnBhdGgsZXJyb3JNYXBzOltuLmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAsbi5zY2hlbWFFcnJvck1hcCxGZCgpLHV1XS5maWx0ZXIodT0+ISF1KSxpc3N1ZURhdGE6e2NvZGU6Vy5pbnZhbGlkX2FyZ3VtZW50cyxhcmd1bWVudHNFcnJvcjphfX0pfWZ1bmN0aW9uIGkocyxhKXtyZXR1cm4gQmQoe2RhdGE6cyxwYXRoOm4ucGF0aCxlcnJvck1hcHM6W24uY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCxuLnNjaGVtYUVycm9yTWFwLEZkKCksdXVdLmZpbHRlcih1PT4hIXUpLGlzc3VlRGF0YTp7Y29kZTpXLmludmFsaWRfcmV0dXJuX3R5cGUscmV0dXJuVHlwZUVycm9yOmF9fSl9Y29uc3Qgbz17ZXJyb3JNYXA6bi5jb21tb24uY29udGV4dHVhbEVycm9yTWFwfSxsPW4uZGF0YTtpZih0aGlzLl9kZWYucmV0dXJucyBpbnN0YW5jZW9mIHBzKXtjb25zdCBzPXRoaXM7cmV0dXJuIHluKGFzeW5jIGZ1bmN0aW9uKC4uLmEpe2NvbnN0IHU9bmV3IEVyKFtdKSxjPWF3YWl0IHMuX2RlZi5hcmdzLnBhcnNlQXN5bmMoYSxvKS5jYXRjaChoPT57dGhyb3cgdS5hZGRJc3N1ZShyKGEsaCkpLHV9KSxkPWF3YWl0IFJlZmxlY3QuYXBwbHkobCx0aGlzLGMpO3JldHVybiBhd2FpdCBzLl9kZWYucmV0dXJucy5fZGVmLnR5cGUucGFyc2VBc3luYyhkLG8pLmNhdGNoKGg9Pnt0aHJvdyB1LmFkZElzc3VlKGkoZCxoKSksdX0pfSl9ZWxzZXtjb25zdCBzPXRoaXM7cmV0dXJuIHluKGZ1bmN0aW9uKC4uLmEpe2NvbnN0IHU9cy5fZGVmLmFyZ3Muc2FmZVBhcnNlKGEsbyk7aWYoIXUuc3VjY2Vzcyl0aHJvdyBuZXcgRXIoW3IoYSx1LmVycm9yKV0pO2NvbnN0IGM9UmVmbGVjdC5hcHBseShsLHRoaXMsdS5kYXRhKSxkPXMuX2RlZi5yZXR1cm5zLnNhZmVQYXJzZShjLG8pO2lmKCFkLnN1Y2Nlc3MpdGhyb3cgbmV3IEVyKFtpKGMsZC5lcnJvcildKTtyZXR1cm4gZC5kYXRhfSl9fXBhcmFtZXRlcnMoKXtyZXR1cm4gdGhpcy5fZGVmLmFyZ3N9cmV0dXJuVHlwZSgpe3JldHVybiB0aGlzLl9kZWYucmV0dXJuc31hcmdzKC4uLnQpe3JldHVybiBuZXcgUWwoey4uLnRoaXMuX2RlZixhcmdzOktyLmNyZWF0ZSh0KS5yZXN0KFVvLmNyZWF0ZSgpKX0pfXJldHVybnModCl7cmV0dXJuIG5ldyBRbCh7Li4udGhpcy5fZGVmLHJldHVybnM6dH0pfWltcGxlbWVudCh0KXtyZXR1cm4gdGhpcy5wYXJzZSh0KX1zdHJpY3RJbXBsZW1lbnQodCl7cmV0dXJuIHRoaXMucGFyc2UodCl9c3RhdGljIGNyZWF0ZSh0LG4scil7cmV0dXJuIG5ldyBRbCh7YXJnczp0fHxLci5jcmVhdGUoW10pLnJlc3QoVW8uY3JlYXRlKCkpLHJldHVybnM6bnx8VW8uY3JlYXRlKCksdHlwZU5hbWU6ZGUuWm9kRnVuY3Rpb24sLi4uX2Uocil9KX19Y2xhc3MgdnUgZXh0ZW5kcyBDZXtnZXQgc2NoZW1hKCl7cmV0dXJuIHRoaXMuX2RlZi5nZXR0ZXIoKX1fcGFyc2UodCl7Y29uc3R7Y3R4Om59PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyh0KTtyZXR1cm4gdGhpcy5fZGVmLmdldHRlcigpLl9wYXJzZSh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50Om59KX19dnUuY3JlYXRlPShlLHQpPT5uZXcgdnUoe2dldHRlcjplLHR5cGVOYW1lOmRlLlpvZExhenksLi4uX2UodCl9KTtjbGFzcyB5dSBleHRlbmRzIENle19wYXJzZSh0KXtpZih0LmRhdGEhPT10aGlzLl9kZWYudmFsdWUpe2NvbnN0IG49dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCk7cmV0dXJuIHEobix7cmVjZWl2ZWQ6bi5kYXRhLGNvZGU6Vy5pbnZhbGlkX2xpdGVyYWwsZXhwZWN0ZWQ6dGhpcy5fZGVmLnZhbHVlfSksZ2V9cmV0dXJue3N0YXR1czoidmFsaWQiLHZhbHVlOnQuZGF0YX19Z2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMuX2RlZi52YWx1ZX19eXUuY3JlYXRlPShlLHQpPT5uZXcgeXUoe3ZhbHVlOmUsdHlwZU5hbWU6ZGUuWm9kTGl0ZXJhbCwuLi5fZSh0KX0pO2Z1bmN0aW9uIFRDKGUsdCl7cmV0dXJuIG5ldyBjbyh7dmFsdWVzOmUsdHlwZU5hbWU6ZGUuWm9kRW51bSwuLi5fZSh0KX0pfWNsYXNzIGNvIGV4dGVuZHMgQ2V7X3BhcnNlKHQpe2lmKHR5cGVvZiB0LmRhdGEhPSJzdHJpbmciKXtjb25zdCBuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQpLHI9dGhpcy5fZGVmLnZhbHVlcztyZXR1cm4gcShuLHtleHBlY3RlZDpJZS5qb2luVmFsdWVzKHIpLHJlY2VpdmVkOm4ucGFyc2VkVHlwZSxjb2RlOlcuaW52YWxpZF90eXBlfSksZ2V9aWYodGhpcy5fZGVmLnZhbHVlcy5pbmRleE9mKHQuZGF0YSk9PT0tMSl7Y29uc3Qgbj10aGlzLl9nZXRPclJldHVybkN0eCh0KSxyPXRoaXMuX2RlZi52YWx1ZXM7cmV0dXJuIHEobix7cmVjZWl2ZWQ6bi5kYXRhLGNvZGU6Vy5pbnZhbGlkX2VudW1fdmFsdWUsb3B0aW9uczpyfSksZ2V9cmV0dXJuIHluKHQuZGF0YSl9Z2V0IG9wdGlvbnMoKXtyZXR1cm4gdGhpcy5fZGVmLnZhbHVlc31nZXQgZW51bSgpe2NvbnN0IHQ9e307Zm9yKGNvbnN0IG4gb2YgdGhpcy5fZGVmLnZhbHVlcyl0W25dPW47cmV0dXJuIHR9Z2V0IFZhbHVlcygpe2NvbnN0IHQ9e307Zm9yKGNvbnN0IG4gb2YgdGhpcy5fZGVmLnZhbHVlcyl0W25dPW47cmV0dXJuIHR9Z2V0IEVudW0oKXtjb25zdCB0PXt9O2Zvcihjb25zdCBuIG9mIHRoaXMuX2RlZi52YWx1ZXMpdFtuXT1uO3JldHVybiB0fWV4dHJhY3QodCl7cmV0dXJuIGNvLmNyZWF0ZSh0KX1leGNsdWRlKHQpe3JldHVybiBjby5jcmVhdGUodGhpcy5vcHRpb25zLmZpbHRlcihuPT4hdC5pbmNsdWRlcyhuKSkpfX1jby5jcmVhdGU9VEM7Y2xhc3MgeHUgZXh0ZW5kcyBDZXtfcGFyc2UodCl7Y29uc3Qgbj1JZS5nZXRWYWxpZEVudW1WYWx1ZXModGhpcy5fZGVmLnZhbHVlcykscj10aGlzLl9nZXRPclJldHVybkN0eCh0KTtpZihyLnBhcnNlZFR5cGUhPT1RLnN0cmluZyYmci5wYXJzZWRUeXBlIT09US5udW1iZXIpe2NvbnN0IGk9SWUub2JqZWN0VmFsdWVzKG4pO3JldHVybiBxKHIse2V4cGVjdGVkOkllLmpvaW5WYWx1ZXMoaSkscmVjZWl2ZWQ6ci5wYXJzZWRUeXBlLGNvZGU6Vy5pbnZhbGlkX3R5cGV9KSxnZX1pZihuLmluZGV4T2YodC5kYXRhKT09PS0xKXtjb25zdCBpPUllLm9iamVjdFZhbHVlcyhuKTtyZXR1cm4gcShyLHtyZWNlaXZlZDpyLmRhdGEsY29kZTpXLmludmFsaWRfZW51bV92YWx1ZSxvcHRpb25zOml9KSxnZX1yZXR1cm4geW4odC5kYXRhKX1nZXQgZW51bSgpe3JldHVybiB0aGlzLl9kZWYudmFsdWVzfX14dS5jcmVhdGU9KGUsdCk9Pm5ldyB4dSh7dmFsdWVzOmUsdHlwZU5hbWU6ZGUuWm9kTmF0aXZlRW51bSwuLi5fZSh0KX0pO2NsYXNzIHBzIGV4dGVuZHMgQ2V7dW53cmFwKCl7cmV0dXJuIHRoaXMuX2RlZi50eXBlfV9wYXJzZSh0KXtjb25zdHtjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKHQpO2lmKG4ucGFyc2VkVHlwZSE9PVEucHJvbWlzZSYmbi5jb21tb24uYXN5bmM9PT0hMSlyZXR1cm4gcShuLHtjb2RlOlcuaW52YWxpZF90eXBlLGV4cGVjdGVkOlEucHJvbWlzZSxyZWNlaXZlZDpuLnBhcnNlZFR5cGV9KSxnZTtjb25zdCByPW4ucGFyc2VkVHlwZT09PVEucHJvbWlzZT9uLmRhdGE6UHJvbWlzZS5yZXNvbHZlKG4uZGF0YSk7cmV0dXJuIHluKHIudGhlbihpPT50aGlzLl9kZWYudHlwZS5wYXJzZUFzeW5jKGkse3BhdGg6bi5wYXRoLGVycm9yTWFwOm4uY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcH0pKSl9fXBzLmNyZWF0ZT0oZSx0KT0+bmV3IHBzKHt0eXBlOmUsdHlwZU5hbWU6ZGUuWm9kUHJvbWlzZSwuLi5fZSh0KX0pO2NsYXNzIGJyIGV4dGVuZHMgQ2V7aW5uZXJUeXBlKCl7cmV0dXJuIHRoaXMuX2RlZi5zY2hlbWF9c291cmNlVHlwZSgpe3JldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9kZWYudHlwZU5hbWU9PT1kZS5ab2RFZmZlY3RzP3RoaXMuX2RlZi5zY2hlbWEuc291cmNlVHlwZSgpOnRoaXMuX2RlZi5zY2hlbWF9X3BhcnNlKHQpe2NvbnN0e3N0YXR1czpuLGN0eDpyfT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXModCksaT10aGlzLl9kZWYuZWZmZWN0fHxudWxsLG89e2FkZElzc3VlOmw9PntxKHIsbCksbC5mYXRhbD9uLmFib3J0KCk6bi5kaXJ0eSgpfSxnZXQgcGF0aCgpe3JldHVybiByLnBhdGh9fTtpZihvLmFkZElzc3VlPW8uYWRkSXNzdWUuYmluZChvKSxpLnR5cGU9PT0icHJlcHJvY2VzcyIpe2NvbnN0IGw9aS50cmFuc2Zvcm0oci5kYXRhLG8pO3JldHVybiByLmNvbW1vbi5pc3N1ZXMubGVuZ3RoP3tzdGF0dXM6ImRpcnR5Iix2YWx1ZTpyLmRhdGF9OnIuY29tbW9uLmFzeW5jP1Byb21pc2UucmVzb2x2ZShsKS50aGVuKHM9PnRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlQXN5bmMoe2RhdGE6cyxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pKTp0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe2RhdGE6bCxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pfWlmKGkudHlwZT09PSJyZWZpbmVtZW50Iil7Y29uc3QgbD1zPT57Y29uc3QgYT1pLnJlZmluZW1lbnQocyxvKTtpZihyLmNvbW1vbi5hc3luYylyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGEpO2lmKGEgaW5zdGFuY2VvZiBQcm9taXNlKXRocm93IG5ldyBFcnJvcigiQXN5bmMgcmVmaW5lbWVudCBlbmNvdW50ZXJlZCBkdXJpbmcgc3luY2hyb25vdXMgcGFyc2Ugb3BlcmF0aW9uLiBVc2UgLnBhcnNlQXN5bmMgaW5zdGVhZC4iKTtyZXR1cm4gc307aWYoci5jb21tb24uYXN5bmM9PT0hMSl7Y29uc3Qgcz10aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe2RhdGE6ci5kYXRhLHBhdGg6ci5wYXRoLHBhcmVudDpyfSk7cmV0dXJuIHMuc3RhdHVzPT09ImFib3J0ZWQiP2dlOihzLnN0YXR1cz09PSJkaXJ0eSImJm4uZGlydHkoKSxsKHMudmFsdWUpLHtzdGF0dXM6bi52YWx1ZSx2YWx1ZTpzLnZhbHVlfSl9ZWxzZSByZXR1cm4gdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VBc3luYyh7ZGF0YTpyLmRhdGEscGF0aDpyLnBhdGgscGFyZW50OnJ9KS50aGVuKHM9PnMuc3RhdHVzPT09ImFib3J0ZWQiP2dlOihzLnN0YXR1cz09PSJkaXJ0eSImJm4uZGlydHkoKSxsKHMudmFsdWUpLnRoZW4oKCk9Pih7c3RhdHVzOm4udmFsdWUsdmFsdWU6cy52YWx1ZX0pKSkpfWlmKGkudHlwZT09PSJ0cmFuc2Zvcm0iKWlmKHIuY29tbW9uLmFzeW5jPT09ITEpe2NvbnN0IGw9dGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VTeW5jKHtkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pO2lmKCFjdShsKSlyZXR1cm4gbDtjb25zdCBzPWkudHJhbnNmb3JtKGwudmFsdWUsbyk7aWYocyBpbnN0YW5jZW9mIFByb21pc2UpdGhyb3cgbmV3IEVycm9yKCJBc3luY2hyb25vdXMgdHJhbnNmb3JtIGVuY291bnRlcmVkIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZSBvcGVyYXRpb24uIFVzZSAucGFyc2VBc3luYyBpbnN0ZWFkLiIpO3JldHVybntzdGF0dXM6bi52YWx1ZSx2YWx1ZTpzfX1lbHNlIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHtkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pLnRoZW4obD0+Y3UobCk/UHJvbWlzZS5yZXNvbHZlKGkudHJhbnNmb3JtKGwudmFsdWUsbykpLnRoZW4ocz0+KHtzdGF0dXM6bi52YWx1ZSx2YWx1ZTpzfSkpOmwpO0llLmFzc2VydE5ldmVyKGkpfX1ici5jcmVhdGU9KGUsdCxuKT0+bmV3IGJyKHtzY2hlbWE6ZSx0eXBlTmFtZTpkZS5ab2RFZmZlY3RzLGVmZmVjdDp0LC4uLl9lKG4pfSk7YnIuY3JlYXRlV2l0aFByZXByb2Nlc3M9KGUsdCxuKT0+bmV3IGJyKHtzY2hlbWE6dCxlZmZlY3Q6e3R5cGU6InByZXByb2Nlc3MiLHRyYW5zZm9ybTplfSx0eXBlTmFtZTpkZS5ab2RFZmZlY3RzLC4uLl9lKG4pfSk7Y2xhc3MgY2kgZXh0ZW5kcyBDZXtfcGFyc2UodCl7cmV0dXJuIHRoaXMuX2dldFR5cGUodCk9PT1RLnVuZGVmaW5lZD95bih2b2lkIDApOnRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKHQpfXVud3JhcCgpe3JldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlfX1jaS5jcmVhdGU9KGUsdCk9Pm5ldyBjaSh7aW5uZXJUeXBlOmUsdHlwZU5hbWU6ZGUuWm9kT3B0aW9uYWwsLi4uX2UodCl9KTtjbGFzcyBlbCBleHRlbmRzIENle19wYXJzZSh0KXtyZXR1cm4gdGhpcy5fZ2V0VHlwZSh0KT09PVEubnVsbD95bihudWxsKTp0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZSh0KX11bndyYXAoKXtyZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZX19ZWwuY3JlYXRlPShlLHQpPT5uZXcgZWwoe2lubmVyVHlwZTplLHR5cGVOYW1lOmRlLlpvZE51bGxhYmxlLC4uLl9lKHQpfSk7Y2xhc3MgX3UgZXh0ZW5kcyBDZXtfcGFyc2UodCl7Y29uc3R7Y3R4Om59PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyh0KTtsZXQgcj1uLmRhdGE7cmV0dXJuIG4ucGFyc2VkVHlwZT09PVEudW5kZWZpbmVkJiYocj10aGlzLl9kZWYuZGVmYXVsdFZhbHVlKCkpLHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKHtkYXRhOnIscGF0aDpuLnBhdGgscGFyZW50Om59KX1yZW1vdmVEZWZhdWx0KCl7cmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGV9fV91LmNyZWF0ZT0oZSx0KT0+bmV3IF91KHtpbm5lclR5cGU6ZSx0eXBlTmFtZTpkZS5ab2REZWZhdWx0LGRlZmF1bHRWYWx1ZTp0eXBlb2YgdC5kZWZhdWx0PT0iZnVuY3Rpb24iP3QuZGVmYXVsdDooKT0+dC5kZWZhdWx0LC4uLl9lKHQpfSk7Y2xhc3MgS2QgZXh0ZW5kcyBDZXtfcGFyc2UodCl7Y29uc3R7Y3R4Om59PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyh0KSxyPXsuLi5uLGNvbW1vbjp7Li4ubi5jb21tb24saXNzdWVzOltdfX0saT10aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZSh7ZGF0YTpyLmRhdGEscGF0aDpyLnBhdGgscGFyZW50OnsuLi5yfX0pO3JldHVybiBVZChpKT9pLnRoZW4obz0+KHtzdGF0dXM6InZhbGlkIix2YWx1ZTpvLnN0YXR1cz09PSJ2YWxpZCI/by52YWx1ZTp0aGlzLl9kZWYuY2F0Y2hWYWx1ZSh7Z2V0IGVycm9yKCl7cmV0dXJuIG5ldyBFcihyLmNvbW1vbi5pc3N1ZXMpfSxpbnB1dDpyLmRhdGF9KX0pKTp7c3RhdHVzOiJ2YWxpZCIsdmFsdWU6aS5zdGF0dXM9PT0idmFsaWQiP2kudmFsdWU6dGhpcy5fZGVmLmNhdGNoVmFsdWUoe2dldCBlcnJvcigpe3JldHVybiBuZXcgRXIoci5jb21tb24uaXNzdWVzKX0saW5wdXQ6ci5kYXRhfSl9fXJlbW92ZUNhdGNoKCl7cmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGV9fUtkLmNyZWF0ZT0oZSx0KT0+bmV3IEtkKHtpbm5lclR5cGU6ZSx0eXBlTmFtZTpkZS5ab2RDYXRjaCxjYXRjaFZhbHVlOnR5cGVvZiB0LmNhdGNoPT0iZnVuY3Rpb24iP3QuY2F0Y2g6KCk9PnQuY2F0Y2gsLi4uX2UodCl9KTtjbGFzcyBaZCBleHRlbmRzIENle19wYXJzZSh0KXtpZih0aGlzLl9nZXRUeXBlKHQpIT09US5uYW4pe2NvbnN0IHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCk7cmV0dXJuIHEocix7Y29kZTpXLmludmFsaWRfdHlwZSxleHBlY3RlZDpRLm5hbixyZWNlaXZlZDpyLnBhcnNlZFR5cGV9KSxnZX1yZXR1cm57c3RhdHVzOiJ2YWxpZCIsdmFsdWU6dC5kYXRhfX19WmQuY3JlYXRlPWU9Pm5ldyBaZCh7dHlwZU5hbWU6ZGUuWm9kTmFOLC4uLl9lKGUpfSk7Y29uc3QgJDU9U3ltYm9sKCJ6b2RfYnJhbmQiKTtjbGFzcyBOQyBleHRlbmRzIENle19wYXJzZSh0KXtjb25zdHtjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKHQpLHI9bi5kYXRhO3JldHVybiB0aGlzLl9kZWYudHlwZS5fcGFyc2Uoe2RhdGE6cixwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pfXVud3JhcCgpe3JldHVybiB0aGlzLl9kZWYudHlwZX19Y2xhc3MgRnUgZXh0ZW5kcyBDZXtfcGFyc2UodCl7Y29uc3R7c3RhdHVzOm4sY3R4OnJ9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyh0KTtpZihyLmNvbW1vbi5hc3luYylyZXR1cm4oYXN5bmMoKT0+e2NvbnN0IG89YXdhaXQgdGhpcy5fZGVmLmluLl9wYXJzZUFzeW5jKHtkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pO3JldHVybiBvLnN0YXR1cz09PSJhYm9ydGVkIj9nZTpvLnN0YXR1cz09PSJkaXJ0eSI/KG4uZGlydHkoKSxiQyhvLnZhbHVlKSk6dGhpcy5fZGVmLm91dC5fcGFyc2VBc3luYyh7ZGF0YTpvLnZhbHVlLHBhdGg6ci5wYXRoLHBhcmVudDpyfSl9KSgpO3tjb25zdCBpPXRoaXMuX2RlZi5pbi5fcGFyc2VTeW5jKHtkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pO3JldHVybiBpLnN0YXR1cz09PSJhYm9ydGVkIj9nZTppLnN0YXR1cz09PSJkaXJ0eSI/KG4uZGlydHkoKSx7c3RhdHVzOiJkaXJ0eSIsdmFsdWU6aS52YWx1ZX0pOnRoaXMuX2RlZi5vdXQuX3BhcnNlU3luYyh7ZGF0YTppLnZhbHVlLHBhdGg6ci5wYXRoLHBhcmVudDpyfSl9fXN0YXRpYyBjcmVhdGUodCxuKXtyZXR1cm4gbmV3IEZ1KHtpbjp0LG91dDpuLHR5cGVOYW1lOmRlLlpvZFBpcGVsaW5lfSl9fWNsYXNzIEdkIGV4dGVuZHMgQ2V7X3BhcnNlKHQpe2NvbnN0IG49dGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UodCk7cmV0dXJuIGN1KG4pJiYobi52YWx1ZT1PYmplY3QuZnJlZXplKG4udmFsdWUpKSxufX1HZC5jcmVhdGU9KGUsdCk9Pm5ldyBHZCh7aW5uZXJUeXBlOmUsdHlwZU5hbWU6ZGUuWm9kUmVhZG9ubHksLi4uX2UodCl9KTtjb25zdCBSQz0oZSx0PXt9LG4pPT5lP2hzLmNyZWF0ZSgpLnN1cGVyUmVmaW5lKChyLGkpPT57dmFyIG8sbDtpZighZShyKSl7Y29uc3Qgcz10eXBlb2YgdD09ImZ1bmN0aW9uIj90KHIpOnR5cGVvZiB0PT0ic3RyaW5nIj97bWVzc2FnZTp0fTp0LGE9KGw9KG89cy5mYXRhbCkhPT1udWxsJiZvIT09dm9pZCAwP286bikhPT1udWxsJiZsIT09dm9pZCAwP2w6ITAsdT10eXBlb2Ygcz09InN0cmluZyI/e21lc3NhZ2U6c306cztpLmFkZElzc3VlKHtjb2RlOiJjdXN0b20iLC4uLnUsZmF0YWw6YX0pfX0pOmhzLmNyZWF0ZSgpLGI1PXtvYmplY3Q6Y3QubGF6eWNyZWF0ZX07dmFyIGRlOyhmdW5jdGlvbihlKXtlLlpvZFN0cmluZz0iWm9kU3RyaW5nIixlLlpvZE51bWJlcj0iWm9kTnVtYmVyIixlLlpvZE5hTj0iWm9kTmFOIixlLlpvZEJpZ0ludD0iWm9kQmlnSW50IixlLlpvZEJvb2xlYW49IlpvZEJvb2xlYW4iLGUuWm9kRGF0ZT0iWm9kRGF0ZSIsZS5ab2RTeW1ib2w9IlpvZFN5bWJvbCIsZS5ab2RVbmRlZmluZWQ9IlpvZFVuZGVmaW5lZCIsZS5ab2ROdWxsPSJab2ROdWxsIixlLlpvZEFueT0iWm9kQW55IixlLlpvZFVua25vd249IlpvZFVua25vd24iLGUuWm9kTmV2ZXI9IlpvZE5ldmVyIixlLlpvZFZvaWQ9IlpvZFZvaWQiLGUuWm9kQXJyYXk9IlpvZEFycmF5IixlLlpvZE9iamVjdD0iWm9kT2JqZWN0IixlLlpvZFVuaW9uPSJab2RVbmlvbiIsZS5ab2REaXNjcmltaW5hdGVkVW5pb249IlpvZERpc2NyaW1pbmF0ZWRVbmlvbiIsZS5ab2RJbnRlcnNlY3Rpb249IlpvZEludGVyc2VjdGlvbiIsZS5ab2RUdXBsZT0iWm9kVHVwbGUiLGUuWm9kUmVjb3JkPSJab2RSZWNvcmQiLGUuWm9kTWFwPSJab2RNYXAiLGUuWm9kU2V0PSJab2RTZXQiLGUuWm9kRnVuY3Rpb249IlpvZEZ1bmN0aW9uIixlLlpvZExhenk9IlpvZExhenkiLGUuWm9kTGl0ZXJhbD0iWm9kTGl0ZXJhbCIsZS5ab2RFbnVtPSJab2RFbnVtIixlLlpvZEVmZmVjdHM9IlpvZEVmZmVjdHMiLGUuWm9kTmF0aXZlRW51bT0iWm9kTmF0aXZlRW51bSIsZS5ab2RPcHRpb25hbD0iWm9kT3B0aW9uYWwiLGUuWm9kTnVsbGFibGU9IlpvZE51bGxhYmxlIixlLlpvZERlZmF1bHQ9IlpvZERlZmF1bHQiLGUuWm9kQ2F0Y2g9IlpvZENhdGNoIixlLlpvZFByb21pc2U9IlpvZFByb21pc2UiLGUuWm9kQnJhbmRlZD0iWm9kQnJhbmRlZCIsZS5ab2RQaXBlbGluZT0iWm9kUGlwZWxpbmUiLGUuWm9kUmVhZG9ubHk9IlpvZFJlYWRvbmx5In0pKGRlfHwoZGU9e30pKTtjb25zdCBUNT0oZSx0PXttZXNzYWdlOmBJbnB1dCBub3QgaW5zdGFuY2Ugb2YgJHtlLm5hbWV9YH0pPT5SQyhuPT5uIGluc3RhbmNlb2YgZSx0KSxPQz1fci5jcmVhdGUsUEM9YW8uY3JlYXRlLE41PVpkLmNyZWF0ZSxSNT11by5jcmVhdGUsQUM9ZHUuY3JlYXRlLE81PUpvLmNyZWF0ZSxQNT1XZC5jcmVhdGUsQTU9ZnUuY3JlYXRlLE01PWh1LmNyZWF0ZSxENT1ocy5jcmVhdGUsSTU9VW8uY3JlYXRlLEw1PW1pLmNyZWF0ZSxqNT1WZC5jcmVhdGUsejU9Q3IuY3JlYXRlLEY1PWN0LmNyZWF0ZSxCNT1jdC5zdHJpY3RDcmVhdGUsVTU9cHUuY3JlYXRlLFc1PUxmLmNyZWF0ZSxWNT1tdS5jcmVhdGUsSDU9S3IuY3JlYXRlLEs1PWd1LmNyZWF0ZSxaNT1IZC5jcmVhdGUsRzU9cW8uY3JlYXRlLFk1PVFsLmNyZWF0ZSxYNT12dS5jcmVhdGUsUTU9eXUuY3JlYXRlLEo1PWNvLmNyZWF0ZSxxNT14dS5jcmVhdGUsZTM9cHMuY3JlYXRlLGJ4PWJyLmNyZWF0ZSx0Mz1jaS5jcmVhdGUsbjM9ZWwuY3JlYXRlLHIzPWJyLmNyZWF0ZVdpdGhQcmVwcm9jZXNzLGkzPUZ1LmNyZWF0ZSxvMz0oKT0+T0MoKS5vcHRpb25hbCgpLGwzPSgpPT5QQygpLm9wdGlvbmFsKCksczM9KCk9PkFDKCkub3B0aW9uYWwoKSxhMz17c3RyaW5nOmU9Pl9yLmNyZWF0ZSh7Li4uZSxjb2VyY2U6ITB9KSxudW1iZXI6ZT0+YW8uY3JlYXRlKHsuLi5lLGNvZXJjZTohMH0pLGJvb2xlYW46ZT0+ZHUuY3JlYXRlKHsuLi5lLGNvZXJjZTohMH0pLGJpZ2ludDplPT51by5jcmVhdGUoey4uLmUsY29lcmNlOiEwfSksZGF0ZTplPT5Kby5jcmVhdGUoey4uLmUsY29lcmNlOiEwfSl9LHUzPWdlO3ZhciBDbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxkZWZhdWx0RXJyb3JNYXA6dXUsc2V0RXJyb3JNYXA6aDUsZ2V0RXJyb3JNYXA6RmQsbWFrZUlzc3VlOkJkLEVNUFRZX1BBVEg6cDUsYWRkSXNzdWVUb0NvbnRleHQ6cSxQYXJzZVN0YXR1czpvbixJTlZBTElEOmdlLERJUlRZOmJDLE9LOnluLGlzQWJvcnRlZDpJbSxpc0RpcnR5OkxtLGlzVmFsaWQ6Y3UsaXNBc3luYzpVZCxnZXQgdXRpbCgpe3JldHVybiBJZX0sZ2V0IG9iamVjdFV0aWwoKXtyZXR1cm4gRG19LFpvZFBhcnNlZFR5cGU6USxnZXRQYXJzZWRUeXBlOnppLFpvZFR5cGU6Q2UsWm9kU3RyaW5nOl9yLFpvZE51bWJlcjphbyxab2RCaWdJbnQ6dW8sWm9kQm9vbGVhbjpkdSxab2REYXRlOkpvLFpvZFN5bWJvbDpXZCxab2RVbmRlZmluZWQ6ZnUsWm9kTnVsbDpodSxab2RBbnk6aHMsWm9kVW5rbm93bjpVbyxab2ROZXZlcjptaSxab2RWb2lkOlZkLFpvZEFycmF5OkNyLFpvZE9iamVjdDpjdCxab2RVbmlvbjpwdSxab2REaXNjcmltaW5hdGVkVW5pb246TGYsWm9kSW50ZXJzZWN0aW9uOm11LFpvZFR1cGxlOktyLFpvZFJlY29yZDpndSxab2RNYXA6SGQsWm9kU2V0OnFvLFpvZEZ1bmN0aW9uOlFsLFpvZExhenk6dnUsWm9kTGl0ZXJhbDp5dSxab2RFbnVtOmNvLFpvZE5hdGl2ZUVudW06eHUsWm9kUHJvbWlzZTpwcyxab2RFZmZlY3RzOmJyLFpvZFRyYW5zZm9ybWVyOmJyLFpvZE9wdGlvbmFsOmNpLFpvZE51bGxhYmxlOmVsLFpvZERlZmF1bHQ6X3UsWm9kQ2F0Y2g6S2QsWm9kTmFOOlpkLEJSQU5EOiQ1LFpvZEJyYW5kZWQ6TkMsWm9kUGlwZWxpbmU6RnUsWm9kUmVhZG9ubHk6R2QsY3VzdG9tOlJDLFNjaGVtYTpDZSxab2RTY2hlbWE6Q2UsbGF0ZTpiNSxnZXQgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kKCl7cmV0dXJuIGRlfSxjb2VyY2U6YTMsYW55OkQ1LGFycmF5Ono1LGJpZ2ludDpSNSxib29sZWFuOkFDLGRhdGU6TzUsZGlzY3JpbWluYXRlZFVuaW9uOlc1LGVmZmVjdDpieCxlbnVtOko1LGZ1bmN0aW9uOlk1LGluc3RhbmNlb2Y6VDUsaW50ZXJzZWN0aW9uOlY1LGxhenk6WDUsbGl0ZXJhbDpRNSxtYXA6WjUsbmFuOk41LG5hdGl2ZUVudW06cTUsbmV2ZXI6TDUsbnVsbDpNNSxudWxsYWJsZTpuMyxudW1iZXI6UEMsb2JqZWN0OkY1LG9ib29sZWFuOnMzLG9udW1iZXI6bDMsb3B0aW9uYWw6dDMsb3N0cmluZzpvMyxwaXBlbGluZTppMyxwcmVwcm9jZXNzOnIzLHByb21pc2U6ZTMscmVjb3JkOks1LHNldDpHNSxzdHJpY3RPYmplY3Q6QjUsc3RyaW5nOk9DLHN5bWJvbDpQNSx0cmFuc2Zvcm1lcjpieCx0dXBsZTpINSx1bmRlZmluZWQ6QTUsdW5pb246VTUsdW5rbm93bjpJNSx2b2lkOmo1LE5FVkVSOnUzLFpvZElzc3VlQ29kZTpXLHF1b3RlbGVzc0pzb246ZjUsWm9kRXJyb3I6RXJ9KTtjb25zdCBjMz1Dbi51bmlvbihbQ24ub2JqZWN0KHtpZDpDbi5zdHJpbmcoKSxtb2RlOkNuLmxpdGVyYWwoInByb3h5IiksZnVsbF9uYW1lOkNuLnN0cmluZygpLm9wdGlvbmFsKCkubnVsbGFibGUoKSx1c2VybmFtZTpDbi5zdHJpbmcoKS5vcHRpb25hbCgpLm51bGxhYmxlKCksYXZhdGFyX3VybDpDbi5zdHJpbmcoKS51cmwoKS5vcHRpb25hbCgpLm51bGxhYmxlKCksZW5hYmxlZDpDbi5ib29sZWFuKCl9KSxDbi5vYmplY3Qoe21vZGU6Q24ubGl0ZXJhbCgibG9jYWwiKSxlbmFibGVkOkNuLmJvb2xlYW4oKS5vcHRpb25hbCgpfSksQ24ub2JqZWN0KHttb2RlOkNuLmxpdGVyYWwoInVuYXV0aG9yaXplZCIpLGVuYWJsZWQ6Q24uYm9vbGVhbigpLm9wdGlvbmFsKCl9KV0pO2Z1bmN0aW9uIGQzKGUpe2NvbnN0W3Qsbl09cC51c2VTdGF0ZSh7c3RhdHVzOiJub3QtYXNrZWQifSksW3IsaV09cC51c2VTdGF0ZSgwKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntuKHtzdGF0dXM6ImxvYWRpbmcifSksZS5nZXRTZXNzaW9uKCkudGhlbihhc3luYyBvPT57dHJ5e2lmKGpvLmlzT2sobykpe2NvbnN0IGw9by52YWx1ZTtuKHtzdGF0dXM6InN1Y2Nlc3MiLGRhdGE6YzMucGFyc2UobCl9KX1lbHNlIG8uZXJyb3Iuc3RhdHVzQ29kZT09PTQwMT9uKHtzdGF0dXM6InN1Y2Nlc3MiLGRhdGE6e21vZGU6InVuYXV0aG9yaXplZCJ9fSk6cjwzP3NldFRpbWVvdXQoKCk9PntpKHIrMSl9LDIwMCpyKTpuKHtzdGF0dXM6ImVycm9yIixlcnJvcjoiQ291bGQgbm90IGZldGNoIHNlc3Npb24ifSl9Y2F0Y2gobCl7Y29uc29sZS5lcnJvcigiQ291bGQgbm90IGF1dGhvcml6ZToiLGwpLG4oe3N0YXR1czoiZXJyb3IiLGVycm9yOiJHb3QgYW4gZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGdldCBzZXNzaW9uIn0pfX0pfSxbcl0pLHR9Y29uc3QgVHg9ZT0+dHlwZW9mIGU9PSJib29sZWFuIj8iIi5jb25jYXQoZSk6ZT09PTA/IjAiOmUsTng9dVMsZjM9KGUsdCk9Pm49Pnt2YXIgcjtpZigodD09bnVsbD92b2lkIDA6dC52YXJpYW50cyk9PW51bGwpcmV0dXJuIE54KGUsbj09bnVsbD92b2lkIDA6bi5jbGFzcyxuPT1udWxsP3ZvaWQgMDpuLmNsYXNzTmFtZSk7Y29uc3R7dmFyaWFudHM6aSxkZWZhdWx0VmFyaWFudHM6b309dCxsPU9iamVjdC5rZXlzKGkpLm1hcCh1PT57Y29uc3QgYz1uPT1udWxsP3ZvaWQgMDpuW3VdLGQ9bz09bnVsbD92b2lkIDA6b1t1XTtpZihjPT09bnVsbClyZXR1cm4gbnVsbDtjb25zdCBmPVR4KGMpfHxUeChkKTtyZXR1cm4gaVt1XVtmXX0pLHM9biYmT2JqZWN0LmVudHJpZXMobikucmVkdWNlKCh1LGMpPT57bGV0W2QsZl09YztyZXR1cm4gZj09PXZvaWQgMHx8KHVbZF09ZiksdX0se30pLGE9dD09bnVsbHx8KHI9dC5jb21wb3VuZFZhcmlhbnRzKT09PW51bGx8fHI9PT12b2lkIDA/dm9pZCAwOnIucmVkdWNlKCh1LGMpPT57bGV0e2NsYXNzOmQsY2xhc3NOYW1lOmYsLi4uaH09YztyZXR1cm4gT2JqZWN0LmVudHJpZXMoaCkuZXZlcnkobT0+e2xldFtnLFNdPW07cmV0dXJuIEFycmF5LmlzQXJyYXkoUyk/Uy5pbmNsdWRlcyh7Li4ubywuLi5zfVtnXSk6ey4uLm8sLi4uc31bZ109PT1TfSk/Wy4uLnUsZCxmXTp1fSxbXSk7cmV0dXJuIE54KGUsbCxhLG49PW51bGw/dm9pZCAwOm4uY2xhc3Msbj09bnVsbD92b2lkIDA6bi5jbGFzc05hbWUpfSxoMz1mMygiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHdoaXRlc3BhY2Utbm93cmFwIHJvdW5kZWQtbWQgdGV4dC1zbSBmb250LW1lZGl1bSByaW5nLW9mZnNldC1iYWNrZ3JvdW5kIHRyYW5zaXRpb24tY29sb3JzIGZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMiBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOm9wYWNpdHktNTAiLHt2YXJpYW50czp7dmFyaWFudDp7ZGVmYXVsdDoiYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBob3ZlcjpiZy1wcmltYXJ5LzkwIixkZXN0cnVjdGl2ZToiYmctZGVzdHJ1Y3RpdmUgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIGhvdmVyOmJnLWRlc3RydWN0aXZlLzkwIixvdXRsaW5lOiJib3JkZXIgYm9yZGVyLWlucHV0IGJnLWJhY2tncm91bmQgaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQiLHNlY29uZGFyeToiYmctc2Vjb25kYXJ5IHRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmQgaG92ZXI6Ymctc2Vjb25kYXJ5LzgwIixnaG9zdDoiaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQiLGxpbms6InRleHQtcHJpbWFyeSB1bmRlcmxpbmUtb2Zmc2V0LTQgaG92ZXI6dW5kZXJsaW5lIn0sc2l6ZTp7ZGVmYXVsdDoiaC0xMCBweC00IHB5LTIiLHNtOiJoLTkgcm91bmRlZC1tZCBweC0zIixsZzoiaC0xMSByb3VuZGVkLW1kIHB4LTgiLGljb246ImgtMTAgdy0xMCJ9fSxkZWZhdWx0VmFyaWFudHM6e3ZhcmlhbnQ6ImRlZmF1bHQiLHNpemU6ImRlZmF1bHQifX0pLE1DPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLHZhcmlhbnQ6dCxzaXplOm4sYXNDaGlsZDpyPSExLC4uLml9LG8pPT57Y29uc3QgbD1yP2FzOiJidXR0b24iO3JldHVybiB4LmpzeChsLHtjbGFzc05hbWU6eHQoaDMoe3ZhcmlhbnQ6dCxzaXplOm4sY2xhc3NOYW1lOmV9KSkscmVmOm8sLi4uaX0pfSk7TUMuZGlzcGxheU5hbWU9IkJ1dHRvbiI7Y29uc3QganY9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsdHlwZTp0LC4uLm59LHIpPT54LmpzeCgiaW5wdXQiLHt0eXBlOnQsY2xhc3NOYW1lOnh0KCJmbGV4IGgtMTAgdy1mdWxsIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIHB4LTMgcHktMiB0ZXh0LXNtIHJpbmctb2Zmc2V0LWJhY2tncm91bmQgZmlsZTpib3JkZXItMCBmaWxlOmJnLXRyYW5zcGFyZW50IGZpbGU6dGV4dC1zbSBmaWxlOmZvbnQtbWVkaXVtIHBsYWNlaG9sZGVyOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCBmb2N1cy12aXNpYmxlOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctcmluZyBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LTIgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAiLGUpLHJlZjpyLC4uLm59KSk7anYuZGlzcGxheU5hbWU9IklucHV0IjtmdW5jdGlvbiBEQyhlKXtjb25zdCB0PWUrIkNvbGxlY3Rpb25Qcm92aWRlciIsW24scl09b2wodCksW2ksb109bih0LHtjb2xsZWN0aW9uUmVmOntjdXJyZW50Om51bGx9LGl0ZW1NYXA6bmV3IE1hcH0pLGw9aD0+e2NvbnN0e3Njb3BlOm0sY2hpbGRyZW46Z309aCxTPXJlLnVzZVJlZihudWxsKSx2PXJlLnVzZVJlZihuZXcgTWFwKS5jdXJyZW50O3JldHVybiByZS5jcmVhdGVFbGVtZW50KGkse3Njb3BlOm0saXRlbU1hcDp2LGNvbGxlY3Rpb25SZWY6U30sZyl9LHM9ZSsiQ29sbGVjdGlvblNsb3QiLGE9cmUuZm9yd2FyZFJlZigoaCxtKT0+e2NvbnN0e3Njb3BlOmcsY2hpbGRyZW46U309aCx2PW8ocyxnKSx5PXN0KG0sdi5jb2xsZWN0aW9uUmVmKTtyZXR1cm4gcmUuY3JlYXRlRWxlbWVudChhcyx7cmVmOnl9LFMpfSksdT1lKyJDb2xsZWN0aW9uSXRlbVNsb3QiLGM9ImRhdGEtcmFkaXgtY29sbGVjdGlvbi1pdGVtIixkPXJlLmZvcndhcmRSZWYoKGgsbSk9Pntjb25zdHtzY29wZTpnLGNoaWxkcmVuOlMsLi4udn09aCx5PXJlLnVzZVJlZihudWxsKSxfPXN0KG0seSksdz1vKHUsZyk7cmV0dXJuIHJlLnVzZUVmZmVjdCgoKT0+KHcuaXRlbU1hcC5zZXQoeSx7cmVmOnksLi4udn0pLCgpPT52b2lkIHcuaXRlbU1hcC5kZWxldGUoeSkpKSxyZS5jcmVhdGVFbGVtZW50KGFzLHtbY106IiIscmVmOl99LFMpfSk7ZnVuY3Rpb24gZihoKXtjb25zdCBtPW8oZSsiQ29sbGVjdGlvbkNvbnN1bWVyIixoKTtyZXR1cm4gcmUudXNlQ2FsbGJhY2soKCk9Pntjb25zdCBTPW0uY29sbGVjdGlvblJlZi5jdXJyZW50O2lmKCFTKXJldHVybltdO2NvbnN0IHY9QXJyYXkuZnJvbShTLnF1ZXJ5U2VsZWN0b3JBbGwoYFske2N9XWApKTtyZXR1cm4gQXJyYXkuZnJvbShtLml0ZW1NYXAudmFsdWVzKCkpLnNvcnQoKHcsRSk9PnYuaW5kZXhPZih3LnJlZi5jdXJyZW50KS12LmluZGV4T2YoRS5yZWYuY3VycmVudCkpfSxbbS5jb2xsZWN0aW9uUmVmLG0uaXRlbU1hcF0pfXJldHVyblt7UHJvdmlkZXI6bCxTbG90OmEsSXRlbVNsb3Q6ZH0sZixyXX1mdW5jdGlvbiBwMyhlLHQ9Z2xvYmFsVGhpcz09bnVsbD92b2lkIDA6Z2xvYmFsVGhpcy5kb2N1bWVudCl7Y29uc3Qgbj1lbihlKTtwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IHI9aT0+e2kua2V5PT09IkVzY2FwZSImJm4oaSl9O3JldHVybiB0LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHIpLCgpPT50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHIpfSxbbix0XSl9Y29uc3Qgem09ImRpc21pc3NhYmxlTGF5ZXIudXBkYXRlIixtMz0iZGlzbWlzc2FibGVMYXllci5wb2ludGVyRG93bk91dHNpZGUiLGczPSJkaXNtaXNzYWJsZUxheWVyLmZvY3VzT3V0c2lkZSI7bGV0IFJ4O2NvbnN0IHYzPXAuY3JlYXRlQ29udGV4dCh7bGF5ZXJzOm5ldyBTZXQsbGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQ6bmV3IFNldCxicmFuY2hlczpuZXcgU2V0fSkseTM9cC5mb3J3YXJkUmVmKChlLHQpPT57dmFyIG47Y29uc3R7ZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzOnI9ITEsb25Fc2NhcGVLZXlEb3duOmksb25Qb2ludGVyRG93bk91dHNpZGU6byxvbkZvY3VzT3V0c2lkZTpsLG9uSW50ZXJhY3RPdXRzaWRlOnMsb25EaXNtaXNzOmEsLi4udX09ZSxjPXAudXNlQ29udGV4dCh2MyksW2QsZl09cC51c2VTdGF0ZShudWxsKSxoPShuPWQ9PW51bGw/dm9pZCAwOmQub3duZXJEb2N1bWVudCkhPT1udWxsJiZuIT09dm9pZCAwP246Z2xvYmFsVGhpcz09bnVsbD92b2lkIDA6Z2xvYmFsVGhpcy5kb2N1bWVudCxbLG1dPXAudXNlU3RhdGUoe30pLGc9c3QodCxUPT5mKFQpKSxTPUFycmF5LmZyb20oYy5sYXllcnMpLFt2XT1bLi4uYy5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZF0uc2xpY2UoLTEpLHk9Uy5pbmRleE9mKHYpLF89ZD9TLmluZGV4T2YoZCk6LTEsdz1jLmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLnNpemU+MCxFPV8+PXksJD14MyhUPT57Y29uc3QgTj1ULnRhcmdldCxSPVsuLi5jLmJyYW5jaGVzXS5zb21lKEQ9PkQuY29udGFpbnMoTikpOyFFfHxSfHwobz09bnVsbHx8byhUKSxzPT1udWxsfHxzKFQpLFQuZGVmYXVsdFByZXZlbnRlZHx8YT09bnVsbHx8YSgpKX0saCksQz1fMyhUPT57Y29uc3QgTj1ULnRhcmdldDtbLi4uYy5icmFuY2hlc10uc29tZShEPT5ELmNvbnRhaW5zKE4pKXx8KGw9PW51bGx8fGwoVCkscz09bnVsbHx8cyhUKSxULmRlZmF1bHRQcmV2ZW50ZWR8fGE9PW51bGx8fGEoKSl9LGgpO3JldHVybiBwMyhUPT57Xz09PWMubGF5ZXJzLnNpemUtMSYmKGk9PW51bGx8fGkoVCksIVQuZGVmYXVsdFByZXZlbnRlZCYmYSYmKFQucHJldmVudERlZmF1bHQoKSxhKCkpKX0saCkscC51c2VFZmZlY3QoKCk9PntpZihkKXJldHVybiByJiYoYy5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5zaXplPT09MCYmKFJ4PWguYm9keS5zdHlsZS5wb2ludGVyRXZlbnRzLGguYm9keS5zdHlsZS5wb2ludGVyRXZlbnRzPSJub25lIiksYy5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5hZGQoZCkpLGMubGF5ZXJzLmFkZChkKSxPeCgpLCgpPT57ciYmYy5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5zaXplPT09MSYmKGguYm9keS5zdHlsZS5wb2ludGVyRXZlbnRzPVJ4KX19LFtkLGgscixjXSkscC51c2VFZmZlY3QoKCk9PigpPT57ZCYmKGMubGF5ZXJzLmRlbGV0ZShkKSxjLmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLmRlbGV0ZShkKSxPeCgpKX0sW2QsY10pLHAudXNlRWZmZWN0KCgpPT57Y29uc3QgVD0oKT0+bSh7fSk7cmV0dXJuIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoem0sVCksKCk9PmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoem0sVCl9LFtdKSxwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHt9LHUse3JlZjpnLHN0eWxlOntwb2ludGVyRXZlbnRzOnc/RT8iYXV0byI6Im5vbmUiOnZvaWQgMCwuLi5lLnN0eWxlfSxvbkZvY3VzQ2FwdHVyZTpudChlLm9uRm9jdXNDYXB0dXJlLEMub25Gb2N1c0NhcHR1cmUpLG9uQmx1ckNhcHR1cmU6bnQoZS5vbkJsdXJDYXB0dXJlLEMub25CbHVyQ2FwdHVyZSksb25Qb2ludGVyRG93bkNhcHR1cmU6bnQoZS5vblBvaW50ZXJEb3duQ2FwdHVyZSwkLm9uUG9pbnRlckRvd25DYXB0dXJlKX0pKX0pO2Z1bmN0aW9uIHgzKGUsdD1nbG9iYWxUaGlzPT1udWxsP3ZvaWQgMDpnbG9iYWxUaGlzLmRvY3VtZW50KXtjb25zdCBuPWVuKGUpLHI9cC51c2VSZWYoITEpLGk9cC51c2VSZWYoKCk9Pnt9KTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBvPXM9PntpZihzLnRhcmdldCYmIXIuY3VycmVudCl7bGV0IGM9ZnVuY3Rpb24oKXtJQyhtMyxuLHUse2Rpc2NyZXRlOiEwfSl9O3ZhciBhPWM7Y29uc3QgdT17b3JpZ2luYWxFdmVudDpzfTtzLnBvaW50ZXJUeXBlPT09InRvdWNoIj8odC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsaS5jdXJyZW50KSxpLmN1cnJlbnQ9Yyx0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixpLmN1cnJlbnQse29uY2U6ITB9KSk6YygpfWVsc2UgdC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsaS5jdXJyZW50KTtyLmN1cnJlbnQ9ITF9LGw9d2luZG93LnNldFRpbWVvdXQoKCk9Pnt0LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIixvKX0sMCk7cmV0dXJuKCk9Pnt3aW5kb3cuY2xlYXJUaW1lb3V0KGwpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcmRvd24iLG8pLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLGkuY3VycmVudCl9fSxbdCxuXSkse29uUG9pbnRlckRvd25DYXB0dXJlOigpPT5yLmN1cnJlbnQ9ITB9fWZ1bmN0aW9uIF8zKGUsdD1nbG9iYWxUaGlzPT1udWxsP3ZvaWQgMDpnbG9iYWxUaGlzLmRvY3VtZW50KXtjb25zdCBuPWVuKGUpLHI9cC51c2VSZWYoITEpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IGk9bz0+e28udGFyZ2V0JiYhci5jdXJyZW50JiZJQyhnMyxuLHtvcmlnaW5hbEV2ZW50Om99LHtkaXNjcmV0ZTohMX0pfTtyZXR1cm4gdC5hZGRFdmVudExpc3RlbmVyKCJmb2N1c2luIixpKSwoKT0+dC5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1c2luIixpKX0sW3Qsbl0pLHtvbkZvY3VzQ2FwdHVyZTooKT0+ci5jdXJyZW50PSEwLG9uQmx1ckNhcHR1cmU6KCk9PnIuY3VycmVudD0hMX19ZnVuY3Rpb24gT3goKXtjb25zdCBlPW5ldyBDdXN0b21FdmVudCh6bSk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChlKX1mdW5jdGlvbiBJQyhlLHQsbix7ZGlzY3JldGU6cn0pe2NvbnN0IGk9bi5vcmlnaW5hbEV2ZW50LnRhcmdldCxvPW5ldyBDdXN0b21FdmVudChlLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITAsZGV0YWlsOm59KTt0JiZpLmFkZEV2ZW50TGlzdGVuZXIoZSx0LHtvbmNlOiEwfSkscj9xTihpLG8pOmkuZGlzcGF0Y2hFdmVudChvKX1sZXQgQmg9MDtmdW5jdGlvbiB3Mygpe3AudXNlRWZmZWN0KCgpPT57dmFyIGUsdDtjb25zdCBuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLXJhZGl4LWZvY3VzLWd1YXJkXSIpO3JldHVybiBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50RWxlbWVudCgiYWZ0ZXJiZWdpbiIsKGU9blswXSkhPT1udWxsJiZlIT09dm9pZCAwP2U6UHgoKSksZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsKHQ9blsxXSkhPT1udWxsJiZ0IT09dm9pZCAwP3Q6UHgoKSksQmgrKywoKT0+e0JoPT09MSYmZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtcmFkaXgtZm9jdXMtZ3VhcmRdIikuZm9yRWFjaChyPT5yLnJlbW92ZSgpKSxCaC0tfX0sW10pfWZ1bmN0aW9uIFB4KCl7Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7cmV0dXJuIGUuc2V0QXR0cmlidXRlKCJkYXRhLXJhZGl4LWZvY3VzLWd1YXJkIiwiIiksZS50YWJJbmRleD0wLGUuc3R5bGUuY3NzVGV4dD0ib3V0bGluZTogbm9uZTsgb3BhY2l0eTogMDsgcG9zaXRpb246IGZpeGVkOyBwb2ludGVyLWV2ZW50czogbm9uZSIsZX1jb25zdCBVaD0iZm9jdXNTY29wZS5hdXRvRm9jdXNPbk1vdW50IixXaD0iZm9jdXNTY29wZS5hdXRvRm9jdXNPblVubW91bnQiLEF4PXtidWJibGVzOiExLGNhbmNlbGFibGU6ITB9LFMzPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e2xvb3A6bj0hMSx0cmFwcGVkOnI9ITEsb25Nb3VudEF1dG9Gb2N1czppLG9uVW5tb3VudEF1dG9Gb2N1czpvLC4uLmx9PWUsW3MsYV09cC51c2VTdGF0ZShudWxsKSx1PWVuKGkpLGM9ZW4obyksZD1wLnVzZVJlZihudWxsKSxmPXN0KHQsZz0+YShnKSksaD1wLnVzZVJlZih7cGF1c2VkOiExLHBhdXNlKCl7dGhpcy5wYXVzZWQ9ITB9LHJlc3VtZSgpe3RoaXMucGF1c2VkPSExfX0pLmN1cnJlbnQ7cC51c2VFZmZlY3QoKCk9PntpZihyKXtsZXQgeT1mdW5jdGlvbigkKXtpZihoLnBhdXNlZHx8IXMpcmV0dXJuO2NvbnN0IEM9JC50YXJnZXQ7cy5jb250YWlucyhDKT9kLmN1cnJlbnQ9QzpPaShkLmN1cnJlbnQse3NlbGVjdDohMH0pfSxfPWZ1bmN0aW9uKCQpe2lmKGgucGF1c2VkfHwhcylyZXR1cm47Y29uc3QgQz0kLnJlbGF0ZWRUYXJnZXQ7QyE9PW51bGwmJihzLmNvbnRhaW5zKEMpfHxPaShkLmN1cnJlbnQse3NlbGVjdDohMH0pKX0sdz1mdW5jdGlvbigkKXtpZihkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09ZG9jdW1lbnQuYm9keSlmb3IoY29uc3QgVCBvZiAkKVQucmVtb3ZlZE5vZGVzLmxlbmd0aD4wJiZPaShzKX07dmFyIGc9eSxTPV8sdj13O2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzaW4iLHkpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZvY3Vzb3V0IixfKTtjb25zdCBFPW5ldyBNdXRhdGlvbk9ic2VydmVyKHcpO3JldHVybiBzJiZFLm9ic2VydmUocyx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSwoKT0+e2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImZvY3VzaW4iLHkpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImZvY3Vzb3V0IixfKSxFLmRpc2Nvbm5lY3QoKX19fSxbcixzLGgucGF1c2VkXSkscC51c2VFZmZlY3QoKCk9PntpZihzKXtEeC5hZGQoaCk7Y29uc3QgZz1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2lmKCFzLmNvbnRhaW5zKGcpKXtjb25zdCB2PW5ldyBDdXN0b21FdmVudChVaCxBeCk7cy5hZGRFdmVudExpc3RlbmVyKFVoLHUpLHMuZGlzcGF0Y2hFdmVudCh2KSx2LmRlZmF1bHRQcmV2ZW50ZWR8fChFMyhUMyhMQyhzKSkse3NlbGVjdDohMH0pLGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1nJiZPaShzKSl9cmV0dXJuKCk9PntzLnJlbW92ZUV2ZW50TGlzdGVuZXIoVWgsdSksc2V0VGltZW91dCgoKT0+e2NvbnN0IHY9bmV3IEN1c3RvbUV2ZW50KFdoLEF4KTtzLmFkZEV2ZW50TGlzdGVuZXIoV2gsYykscy5kaXNwYXRjaEV2ZW50KHYpLHYuZGVmYXVsdFByZXZlbnRlZHx8T2koZz8/ZG9jdW1lbnQuYm9keSx7c2VsZWN0OiEwfSkscy5yZW1vdmVFdmVudExpc3RlbmVyKFdoLGMpLER4LnJlbW92ZShoKX0sMCl9fX0sW3MsdSxjLGhdKTtjb25zdCBtPXAudXNlQ2FsbGJhY2soZz0+e2lmKCFuJiYhcnx8aC5wYXVzZWQpcmV0dXJuO2NvbnN0IFM9Zy5rZXk9PT0iVGFiIiYmIWcuYWx0S2V5JiYhZy5jdHJsS2V5JiYhZy5tZXRhS2V5LHY9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZihTJiZ2KXtjb25zdCB5PWcuY3VycmVudFRhcmdldCxbXyx3XT1DMyh5KTtfJiZ3PyFnLnNoaWZ0S2V5JiZ2PT09dz8oZy5wcmV2ZW50RGVmYXVsdCgpLG4mJk9pKF8se3NlbGVjdDohMH0pKTpnLnNoaWZ0S2V5JiZ2PT09XyYmKGcucHJldmVudERlZmF1bHQoKSxuJiZPaSh3LHtzZWxlY3Q6ITB9KSk6dj09PXkmJmcucHJldmVudERlZmF1bHQoKX19LFtuLHIsaC5wYXVzZWRdKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KEtlLmRpdixpZSh7dGFiSW5kZXg6LTF9LGwse3JlZjpmLG9uS2V5RG93bjptfSkpfSk7ZnVuY3Rpb24gRTMoZSx7c2VsZWN0OnQ9ITF9PXt9KXtjb25zdCBuPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7Zm9yKGNvbnN0IHIgb2YgZSlpZihPaShyLHtzZWxlY3Q6dH0pLGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQhPT1uKXJldHVybn1mdW5jdGlvbiBDMyhlKXtjb25zdCB0PUxDKGUpLG49TXgodCxlKSxyPU14KHQucmV2ZXJzZSgpLGUpO3JldHVybltuLHJdfWZ1bmN0aW9uIExDKGUpe2NvbnN0IHQ9W10sbj1kb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGUsTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQse2FjY2VwdE5vZGU6cj0+e2NvbnN0IGk9ci50YWdOYW1lPT09IklOUFVUIiYmci50eXBlPT09ImhpZGRlbiI7cmV0dXJuIHIuZGlzYWJsZWR8fHIuaGlkZGVufHxpP05vZGVGaWx0ZXIuRklMVEVSX1NLSVA6ci50YWJJbmRleD49MD9Ob2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQ6Tm9kZUZpbHRlci5GSUxURVJfU0tJUH19KTtmb3IoO24ubmV4dE5vZGUoKTspdC5wdXNoKG4uY3VycmVudE5vZGUpO3JldHVybiB0fWZ1bmN0aW9uIE14KGUsdCl7Zm9yKGNvbnN0IG4gb2YgZSlpZighazMobix7dXBUbzp0fSkpcmV0dXJuIG59ZnVuY3Rpb24gazMoZSx7dXBUbzp0fSl7aWYoZ2V0Q29tcHV0ZWRTdHlsZShlKS52aXNpYmlsaXR5PT09ImhpZGRlbiIpcmV0dXJuITA7Zm9yKDtlOyl7aWYodCE9PXZvaWQgMCYmZT09PXQpcmV0dXJuITE7aWYoZ2V0Q29tcHV0ZWRTdHlsZShlKS5kaXNwbGF5PT09Im5vbmUiKXJldHVybiEwO2U9ZS5wYXJlbnRFbGVtZW50fXJldHVybiExfWZ1bmN0aW9uICQzKGUpe3JldHVybiBlIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCYmInNlbGVjdCJpbiBlfWZ1bmN0aW9uIE9pKGUse3NlbGVjdDp0PSExfT17fSl7aWYoZSYmZS5mb2N1cyl7Y29uc3Qgbj1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2UuZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KSxlIT09biYmJDMoZSkmJnQmJmUuc2VsZWN0KCl9fWNvbnN0IER4PWIzKCk7ZnVuY3Rpb24gYjMoKXtsZXQgZT1bXTtyZXR1cm57YWRkKHQpe2NvbnN0IG49ZVswXTt0IT09biYmKG49PW51bGx8fG4ucGF1c2UoKSksZT1JeChlLHQpLGUudW5zaGlmdCh0KX0scmVtb3ZlKHQpe3ZhciBuO2U9SXgoZSx0KSwobj1lWzBdKT09PW51bGx8fG49PT12b2lkIDB8fG4ucmVzdW1lKCl9fX1mdW5jdGlvbiBJeChlLHQpe2NvbnN0IG49Wy4uLmVdLHI9bi5pbmRleE9mKHQpO3JldHVybiByIT09LTEmJm4uc3BsaWNlKHIsMSksbn1mdW5jdGlvbiBUMyhlKXtyZXR1cm4gZS5maWx0ZXIodD0+dC50YWdOYW1lIT09IkEiKX1jb25zdCBOMz1QXy51c2VJZHx8KCgpPT57fSk7bGV0IFIzPTA7ZnVuY3Rpb24gamYoZSl7Y29uc3RbdCxuXT1wLnVzZVN0YXRlKE4zKCkpO3JldHVybiBVbigoKT0+e2V8fG4ocj0+cj8/U3RyaW5nKFIzKyspKX0sW2VdKSxlfHwodD9gcmFkaXgtJHt0fWA6IiIpfWNvbnN0IE8zPVsidG9wIiwicmlnaHQiLCJib3R0b20iLCJsZWZ0Il0sZm89TWF0aC5taW4sRG49TWF0aC5tYXgsWWQ9TWF0aC5yb3VuZCxTYz1NYXRoLmZsb29yLGhvPWU9Pih7eDplLHk6ZX0pLFAzPXtsZWZ0OiJyaWdodCIscmlnaHQ6ImxlZnQiLGJvdHRvbToidG9wIix0b3A6ImJvdHRvbSJ9LEEzPXtzdGFydDoiZW5kIixlbmQ6InN0YXJ0In07ZnVuY3Rpb24gRm0oZSx0LG4pe3JldHVybiBEbihlLGZvKHQsbikpfWZ1bmN0aW9uIGdpKGUsdCl7cmV0dXJuIHR5cGVvZiBlPT0iZnVuY3Rpb24iP2UodCk6ZX1mdW5jdGlvbiB2aShlKXtyZXR1cm4gZS5zcGxpdCgiLSIpWzBdfWZ1bmN0aW9uIE1zKGUpe3JldHVybiBlLnNwbGl0KCItIilbMV19ZnVuY3Rpb24genYoZSl7cmV0dXJuIGU9PT0ieCI/InkiOiJ4In1mdW5jdGlvbiBGdihlKXtyZXR1cm4gZT09PSJ5Ij8iaGVpZ2h0Ijoid2lkdGgifWZ1bmN0aW9uIERzKGUpe3JldHVyblsidG9wIiwiYm90dG9tIl0uaW5jbHVkZXModmkoZSkpPyJ5IjoieCJ9ZnVuY3Rpb24gQnYoZSl7cmV0dXJuIHp2KERzKGUpKX1mdW5jdGlvbiBNMyhlLHQsbil7bj09PXZvaWQgMCYmKG49ITEpO2NvbnN0IHI9TXMoZSksaT1CdihlKSxvPUZ2KGkpO2xldCBsPWk9PT0ieCI/cj09PShuPyJlbmQiOiJzdGFydCIpPyJyaWdodCI6ImxlZnQiOnI9PT0ic3RhcnQiPyJib3R0b20iOiJ0b3AiO3JldHVybiB0LnJlZmVyZW5jZVtvXT50LmZsb2F0aW5nW29dJiYobD1YZChsKSksW2wsWGQobCldfWZ1bmN0aW9uIEQzKGUpe2NvbnN0IHQ9WGQoZSk7cmV0dXJuW0JtKGUpLHQsQm0odCldfWZ1bmN0aW9uIEJtKGUpe3JldHVybiBlLnJlcGxhY2UoL3N0YXJ0fGVuZC9nLHQ9PkEzW3RdKX1mdW5jdGlvbiBJMyhlLHQsbil7Y29uc3Qgcj1bImxlZnQiLCJyaWdodCJdLGk9WyJyaWdodCIsImxlZnQiXSxvPVsidG9wIiwiYm90dG9tIl0sbD1bImJvdHRvbSIsInRvcCJdO3N3aXRjaChlKXtjYXNlInRvcCI6Y2FzZSJib3R0b20iOnJldHVybiBuP3Q/aTpyOnQ/cjppO2Nhc2UibGVmdCI6Y2FzZSJyaWdodCI6cmV0dXJuIHQ/bzpsO2RlZmF1bHQ6cmV0dXJuW119fWZ1bmN0aW9uIEwzKGUsdCxuLHIpe2NvbnN0IGk9TXMoZSk7bGV0IG89STModmkoZSksbj09PSJzdGFydCIscik7cmV0dXJuIGkmJihvPW8ubWFwKGw9PmwrIi0iK2kpLHQmJihvPW8uY29uY2F0KG8ubWFwKEJtKSkpKSxvfWZ1bmN0aW9uIFhkKGUpe3JldHVybiBlLnJlcGxhY2UoL2xlZnR8cmlnaHR8Ym90dG9tfHRvcC9nLHQ9PlAzW3RdKX1mdW5jdGlvbiBqMyhlKXtyZXR1cm57dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjAsLi4uZX19ZnVuY3Rpb24gakMoZSl7cmV0dXJuIHR5cGVvZiBlIT0ibnVtYmVyIj9qMyhlKTp7dG9wOmUscmlnaHQ6ZSxib3R0b206ZSxsZWZ0OmV9fWZ1bmN0aW9uIFFkKGUpe3JldHVybnsuLi5lLHRvcDplLnksbGVmdDplLngscmlnaHQ6ZS54K2Uud2lkdGgsYm90dG9tOmUueStlLmhlaWdodH19ZnVuY3Rpb24gTHgoZSx0LG4pe2xldHtyZWZlcmVuY2U6cixmbG9hdGluZzppfT1lO2NvbnN0IG89RHModCksbD1Cdih0KSxzPUZ2KGwpLGE9dmkodCksdT1vPT09InkiLGM9ci54K3Iud2lkdGgvMi1pLndpZHRoLzIsZD1yLnkrci5oZWlnaHQvMi1pLmhlaWdodC8yLGY9cltzXS8yLWlbc10vMjtsZXQgaDtzd2l0Y2goYSl7Y2FzZSJ0b3AiOmg9e3g6Yyx5OnIueS1pLmhlaWdodH07YnJlYWs7Y2FzZSJib3R0b20iOmg9e3g6Yyx5OnIueStyLmhlaWdodH07YnJlYWs7Y2FzZSJyaWdodCI6aD17eDpyLngrci53aWR0aCx5OmR9O2JyZWFrO2Nhc2UibGVmdCI6aD17eDpyLngtaS53aWR0aCx5OmR9O2JyZWFrO2RlZmF1bHQ6aD17eDpyLngseTpyLnl9fXN3aXRjaChNcyh0KSl7Y2FzZSJzdGFydCI6aFtsXS09ZioobiYmdT8tMToxKTticmVhaztjYXNlImVuZCI6aFtsXSs9ZioobiYmdT8tMToxKTticmVha31yZXR1cm4gaH1jb25zdCB6Mz1hc3luYyhlLHQsbik9Pntjb25zdHtwbGFjZW1lbnQ6cj0iYm90dG9tIixzdHJhdGVneTppPSJhYnNvbHV0ZSIsbWlkZGxld2FyZTpvPVtdLHBsYXRmb3JtOmx9PW4scz1vLmZpbHRlcihCb29sZWFuKSxhPWF3YWl0KGwuaXNSVEw9PW51bGw/dm9pZCAwOmwuaXNSVEwodCkpO2xldCB1PWF3YWl0IGwuZ2V0RWxlbWVudFJlY3RzKHtyZWZlcmVuY2U6ZSxmbG9hdGluZzp0LHN0cmF0ZWd5Oml9KSx7eDpjLHk6ZH09THgodSxyLGEpLGY9cixoPXt9LG09MDtmb3IobGV0IGc9MDtnPHMubGVuZ3RoO2crKyl7Y29uc3R7bmFtZTpTLGZuOnZ9PXNbZ10se3g6eSx5Ol8sZGF0YTp3LHJlc2V0OkV9PWF3YWl0IHYoe3g6Yyx5OmQsaW5pdGlhbFBsYWNlbWVudDpyLHBsYWNlbWVudDpmLHN0cmF0ZWd5OmksbWlkZGxld2FyZURhdGE6aCxyZWN0czp1LHBsYXRmb3JtOmwsZWxlbWVudHM6e3JlZmVyZW5jZTplLGZsb2F0aW5nOnR9fSk7aWYoYz15Pz9jLGQ9Xz8/ZCxoPXsuLi5oLFtTXTp7Li4uaFtTXSwuLi53fX0sRSYmbTw9NTApe20rKyx0eXBlb2YgRT09Im9iamVjdCImJihFLnBsYWNlbWVudCYmKGY9RS5wbGFjZW1lbnQpLEUucmVjdHMmJih1PUUucmVjdHM9PT0hMD9hd2FpdCBsLmdldEVsZW1lbnRSZWN0cyh7cmVmZXJlbmNlOmUsZmxvYXRpbmc6dCxzdHJhdGVneTppfSk6RS5yZWN0cykse3g6Yyx5OmR9PUx4KHUsZixhKSksZz0tMTtjb250aW51ZX19cmV0dXJue3g6Yyx5OmQscGxhY2VtZW50OmYsc3RyYXRlZ3k6aSxtaWRkbGV3YXJlRGF0YTpofX07YXN5bmMgZnVuY3Rpb24gd3UoZSx0KXt2YXIgbjt0PT09dm9pZCAwJiYodD17fSk7Y29uc3R7eDpyLHk6aSxwbGF0Zm9ybTpvLHJlY3RzOmwsZWxlbWVudHM6cyxzdHJhdGVneTphfT1lLHtib3VuZGFyeTp1PSJjbGlwcGluZ0FuY2VzdG9ycyIscm9vdEJvdW5kYXJ5OmM9InZpZXdwb3J0IixlbGVtZW50Q29udGV4dDpkPSJmbG9hdGluZyIsYWx0Qm91bmRhcnk6Zj0hMSxwYWRkaW5nOmg9MH09Z2kodCxlKSxtPWpDKGgpLFM9c1tmP2Q9PT0iZmxvYXRpbmciPyJyZWZlcmVuY2UiOiJmbG9hdGluZyI6ZF0sdj1RZChhd2FpdCBvLmdldENsaXBwaW5nUmVjdCh7ZWxlbWVudDoobj1hd2FpdChvLmlzRWxlbWVudD09bnVsbD92b2lkIDA6by5pc0VsZW1lbnQoUykpKT09bnVsbHx8bj9TOlMuY29udGV4dEVsZW1lbnR8fGF3YWl0KG8uZ2V0RG9jdW1lbnRFbGVtZW50PT1udWxsP3ZvaWQgMDpvLmdldERvY3VtZW50RWxlbWVudChzLmZsb2F0aW5nKSksYm91bmRhcnk6dSxyb290Qm91bmRhcnk6YyxzdHJhdGVneTphfSkpLHk9ZD09PSJmbG9hdGluZyI/ey4uLmwuZmxvYXRpbmcseDpyLHk6aX06bC5yZWZlcmVuY2UsXz1hd2FpdChvLmdldE9mZnNldFBhcmVudD09bnVsbD92b2lkIDA6by5nZXRPZmZzZXRQYXJlbnQocy5mbG9hdGluZykpLHc9YXdhaXQoby5pc0VsZW1lbnQ9PW51bGw/dm9pZCAwOm8uaXNFbGVtZW50KF8pKT9hd2FpdChvLmdldFNjYWxlPT1udWxsP3ZvaWQgMDpvLmdldFNjYWxlKF8pKXx8e3g6MSx5OjF9Ont4OjEseToxfSxFPVFkKG8uY29udmVydE9mZnNldFBhcmVudFJlbGF0aXZlUmVjdFRvVmlld3BvcnRSZWxhdGl2ZVJlY3Q/YXdhaXQgby5jb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdCh7cmVjdDp5LG9mZnNldFBhcmVudDpfLHN0cmF0ZWd5OmF9KTp5KTtyZXR1cm57dG9wOih2LnRvcC1FLnRvcCttLnRvcCkvdy55LGJvdHRvbTooRS5ib3R0b20tdi5ib3R0b20rbS5ib3R0b20pL3cueSxsZWZ0Oih2LmxlZnQtRS5sZWZ0K20ubGVmdCkvdy54LHJpZ2h0OihFLnJpZ2h0LXYucmlnaHQrbS5yaWdodCkvdy54fX1jb25zdCBqeD1lPT4oe25hbWU6ImFycm93IixvcHRpb25zOmUsYXN5bmMgZm4odCl7Y29uc3R7eDpuLHk6cixwbGFjZW1lbnQ6aSxyZWN0czpvLHBsYXRmb3JtOmwsZWxlbWVudHM6cyxtaWRkbGV3YXJlRGF0YTphfT10LHtlbGVtZW50OnUscGFkZGluZzpjPTB9PWdpKGUsdCl8fHt9O2lmKHU9PW51bGwpcmV0dXJue307Y29uc3QgZD1qQyhjKSxmPXt4Om4seTpyfSxoPUJ2KGkpLG09RnYoaCksZz1hd2FpdCBsLmdldERpbWVuc2lvbnModSksUz1oPT09InkiLHY9Uz8idG9wIjoibGVmdCIseT1TPyJib3R0b20iOiJyaWdodCIsXz1TPyJjbGllbnRIZWlnaHQiOiJjbGllbnRXaWR0aCIsdz1vLnJlZmVyZW5jZVttXStvLnJlZmVyZW5jZVtoXS1mW2hdLW8uZmxvYXRpbmdbbV0sRT1mW2hdLW8ucmVmZXJlbmNlW2hdLCQ9YXdhaXQobC5nZXRPZmZzZXRQYXJlbnQ9PW51bGw/dm9pZCAwOmwuZ2V0T2Zmc2V0UGFyZW50KHUpKTtsZXQgQz0kPyRbX106MDsoIUN8fCFhd2FpdChsLmlzRWxlbWVudD09bnVsbD92b2lkIDA6bC5pc0VsZW1lbnQoJCkpKSYmKEM9cy5mbG9hdGluZ1tfXXx8by5mbG9hdGluZ1ttXSk7Y29uc3QgVD13LzItRS8yLE49Qy8yLWdbbV0vMi0xLFI9Zm8oZFt2XSxOKSxEPWZvKGRbeV0sTiksRj1SLHNlPUMtZ1ttXS1ELFY9Qy8yLWdbbV0vMitULEs9Rm0oRixWLHNlKSxPPSFhLmFycm93JiZNcyhpKSE9bnVsbCYmViE9SyYmby5yZWZlcmVuY2VbbV0vMi0oVjxGP1I6RCktZ1ttXS8yPDAsQT1PP1Y8Rj9WLUY6Vi1zZTowO3JldHVybntbaF06ZltoXStBLGRhdGE6e1toXTpLLGNlbnRlck9mZnNldDpWLUstQSwuLi5PJiZ7YWxpZ25tZW50T2Zmc2V0OkF9fSxyZXNldDpPfX19KSxGMz1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOiJmbGlwIixvcHRpb25zOmUsYXN5bmMgZm4odCl7dmFyIG4scjtjb25zdHtwbGFjZW1lbnQ6aSxtaWRkbGV3YXJlRGF0YTpvLHJlY3RzOmwsaW5pdGlhbFBsYWNlbWVudDpzLHBsYXRmb3JtOmEsZWxlbWVudHM6dX09dCx7bWFpbkF4aXM6Yz0hMCxjcm9zc0F4aXM6ZD0hMCxmYWxsYmFja1BsYWNlbWVudHM6ZixmYWxsYmFja1N0cmF0ZWd5Omg9ImJlc3RGaXQiLGZhbGxiYWNrQXhpc1NpZGVEaXJlY3Rpb246bT0ibm9uZSIsZmxpcEFsaWdubWVudDpnPSEwLC4uLlN9PWdpKGUsdCk7aWYoKG49by5hcnJvdykhPW51bGwmJm4uYWxpZ25tZW50T2Zmc2V0KXJldHVybnt9O2NvbnN0IHY9dmkoaSkseT12aShzKT09PXMsXz1hd2FpdChhLmlzUlRMPT1udWxsP3ZvaWQgMDphLmlzUlRMKHUuZmxvYXRpbmcpKSx3PWZ8fCh5fHwhZz9bWGQocyldOkQzKHMpKTshZiYmbSE9PSJub25lIiYmdy5wdXNoKC4uLkwzKHMsZyxtLF8pKTtjb25zdCBFPVtzLC4uLnddLCQ9YXdhaXQgd3UodCxTKSxDPVtdO2xldCBUPSgocj1vLmZsaXApPT1udWxsP3ZvaWQgMDpyLm92ZXJmbG93cyl8fFtdO2lmKGMmJkMucHVzaCgkW3ZdKSxkKXtjb25zdCBGPU0zKGksbCxfKTtDLnB1c2goJFtGWzBdXSwkW0ZbMV1dKX1pZihUPVsuLi5ULHtwbGFjZW1lbnQ6aSxvdmVyZmxvd3M6Q31dLCFDLmV2ZXJ5KEY9PkY8PTApKXt2YXIgTixSO2NvbnN0IEY9KCgoTj1vLmZsaXApPT1udWxsP3ZvaWQgMDpOLmluZGV4KXx8MCkrMSxzZT1FW0ZdO2lmKHNlKXJldHVybntkYXRhOntpbmRleDpGLG92ZXJmbG93czpUfSxyZXNldDp7cGxhY2VtZW50OnNlfX07bGV0IFY9KFI9VC5maWx0ZXIoSz0+Sy5vdmVyZmxvd3NbMF08PTApLnNvcnQoKEssTyk9Pksub3ZlcmZsb3dzWzFdLU8ub3ZlcmZsb3dzWzFdKVswXSk9PW51bGw/dm9pZCAwOlIucGxhY2VtZW50O2lmKCFWKXN3aXRjaChoKXtjYXNlImJlc3RGaXQiOnt2YXIgRDtjb25zdCBLPShEPVQubWFwKE89PltPLnBsYWNlbWVudCxPLm92ZXJmbG93cy5maWx0ZXIoQT0+QT4wKS5yZWR1Y2UoKEEsayk9PkEraywwKV0pLnNvcnQoKE8sQSk9Pk9bMV0tQVsxXSlbMF0pPT1udWxsP3ZvaWQgMDpEWzBdO0smJihWPUspO2JyZWFrfWNhc2UiaW5pdGlhbFBsYWNlbWVudCI6Vj1zO2JyZWFrfWlmKGkhPT1WKXJldHVybntyZXNldDp7cGxhY2VtZW50OlZ9fX1yZXR1cm57fX19fTtmdW5jdGlvbiB6eChlLHQpe3JldHVybnt0b3A6ZS50b3AtdC5oZWlnaHQscmlnaHQ6ZS5yaWdodC10LndpZHRoLGJvdHRvbTplLmJvdHRvbS10LmhlaWdodCxsZWZ0OmUubGVmdC10LndpZHRofX1mdW5jdGlvbiBGeChlKXtyZXR1cm4gTzMuc29tZSh0PT5lW3RdPj0wKX1jb25zdCBCMz1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOiJoaWRlIixvcHRpb25zOmUsYXN5bmMgZm4odCl7Y29uc3R7cmVjdHM6bn09dCx7c3RyYXRlZ3k6cj0icmVmZXJlbmNlSGlkZGVuIiwuLi5pfT1naShlLHQpO3N3aXRjaChyKXtjYXNlInJlZmVyZW5jZUhpZGRlbiI6e2NvbnN0IG89YXdhaXQgd3UodCx7Li4uaSxlbGVtZW50Q29udGV4dDoicmVmZXJlbmNlIn0pLGw9engobyxuLnJlZmVyZW5jZSk7cmV0dXJue2RhdGE6e3JlZmVyZW5jZUhpZGRlbk9mZnNldHM6bCxyZWZlcmVuY2VIaWRkZW46RngobCl9fX1jYXNlImVzY2FwZWQiOntjb25zdCBvPWF3YWl0IHd1KHQsey4uLmksYWx0Qm91bmRhcnk6ITB9KSxsPXp4KG8sbi5mbG9hdGluZyk7cmV0dXJue2RhdGE6e2VzY2FwZWRPZmZzZXRzOmwsZXNjYXBlZDpGeChsKX19fWRlZmF1bHQ6cmV0dXJue319fX19O2FzeW5jIGZ1bmN0aW9uIFUzKGUsdCl7Y29uc3R7cGxhY2VtZW50Om4scGxhdGZvcm06cixlbGVtZW50czppfT1lLG89YXdhaXQoci5pc1JUTD09bnVsbD92b2lkIDA6ci5pc1JUTChpLmZsb2F0aW5nKSksbD12aShuKSxzPU1zKG4pLGE9RHMobik9PT0ieSIsdT1bImxlZnQiLCJ0b3AiXS5pbmNsdWRlcyhsKT8tMToxLGM9byYmYT8tMToxLGQ9Z2kodCxlKTtsZXR7bWFpbkF4aXM6Zixjcm9zc0F4aXM6aCxhbGlnbm1lbnRBeGlzOm19PXR5cGVvZiBkPT0ibnVtYmVyIj97bWFpbkF4aXM6ZCxjcm9zc0F4aXM6MCxhbGlnbm1lbnRBeGlzOm51bGx9OnttYWluQXhpczowLGNyb3NzQXhpczowLGFsaWdubWVudEF4aXM6bnVsbCwuLi5kfTtyZXR1cm4gcyYmdHlwZW9mIG09PSJudW1iZXIiJiYoaD1zPT09ImVuZCI/bSotMTptKSxhP3t4OmgqYyx5OmYqdX06e3g6Zip1LHk6aCpjfX1jb25zdCBXMz1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9MCkse25hbWU6Im9mZnNldCIsb3B0aW9uczplLGFzeW5jIGZuKHQpe2NvbnN0e3g6bix5OnJ9PXQsaT1hd2FpdCBVMyh0LGUpO3JldHVybnt4Om4raS54LHk6citpLnksZGF0YTppfX19fSxWMz1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOiJzaGlmdCIsb3B0aW9uczplLGFzeW5jIGZuKHQpe2NvbnN0e3g6bix5OnIscGxhY2VtZW50Oml9PXQse21haW5BeGlzOm89ITAsY3Jvc3NBeGlzOmw9ITEsbGltaXRlcjpzPXtmbjpTPT57bGV0e3g6dix5fT1TO3JldHVybnt4OnYseX19fSwuLi5hfT1naShlLHQpLHU9e3g6bix5OnJ9LGM9YXdhaXQgd3UodCxhKSxkPURzKHZpKGkpKSxmPXp2KGQpO2xldCBoPXVbZl0sbT11W2RdO2lmKG8pe2NvbnN0IFM9Zj09PSJ5Ij8idG9wIjoibGVmdCIsdj1mPT09InkiPyJib3R0b20iOiJyaWdodCIseT1oK2NbU10sXz1oLWNbdl07aD1GbSh5LGgsXyl9aWYobCl7Y29uc3QgUz1kPT09InkiPyJ0b3AiOiJsZWZ0Iix2PWQ9PT0ieSI/ImJvdHRvbSI6InJpZ2h0Iix5PW0rY1tTXSxfPW0tY1t2XTttPUZtKHksbSxfKX1jb25zdCBnPXMuZm4oey4uLnQsW2ZdOmgsW2RdOm19KTtyZXR1cm57Li4uZyxkYXRhOnt4OmcueC1uLHk6Zy55LXJ9fX19fSxIMz1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtvcHRpb25zOmUsZm4odCl7Y29uc3R7eDpuLHk6cixwbGFjZW1lbnQ6aSxyZWN0czpvLG1pZGRsZXdhcmVEYXRhOmx9PXQse29mZnNldDpzPTAsbWFpbkF4aXM6YT0hMCxjcm9zc0F4aXM6dT0hMH09Z2koZSx0KSxjPXt4Om4seTpyfSxkPURzKGkpLGY9enYoZCk7bGV0IGg9Y1tmXSxtPWNbZF07Y29uc3QgZz1naShzLHQpLFM9dHlwZW9mIGc9PSJudW1iZXIiP3ttYWluQXhpczpnLGNyb3NzQXhpczowfTp7bWFpbkF4aXM6MCxjcm9zc0F4aXM6MCwuLi5nfTtpZihhKXtjb25zdCBfPWY9PT0ieSI/ImhlaWdodCI6IndpZHRoIix3PW8ucmVmZXJlbmNlW2ZdLW8uZmxvYXRpbmdbX10rUy5tYWluQXhpcyxFPW8ucmVmZXJlbmNlW2ZdK28ucmVmZXJlbmNlW19dLVMubWFpbkF4aXM7aDx3P2g9dzpoPkUmJihoPUUpfWlmKHUpe3ZhciB2LHk7Y29uc3QgXz1mPT09InkiPyJ3aWR0aCI6ImhlaWdodCIsdz1bInRvcCIsImxlZnQiXS5pbmNsdWRlcyh2aShpKSksRT1vLnJlZmVyZW5jZVtkXS1vLmZsb2F0aW5nW19dKyh3JiYoKHY9bC5vZmZzZXQpPT1udWxsP3ZvaWQgMDp2W2RdKXx8MCkrKHc/MDpTLmNyb3NzQXhpcyksJD1vLnJlZmVyZW5jZVtkXStvLnJlZmVyZW5jZVtfXSsodz8wOigoeT1sLm9mZnNldCk9PW51bGw/dm9pZCAwOnlbZF0pfHwwKS0odz9TLmNyb3NzQXhpczowKTttPEU/bT1FOm0+JCYmKG09JCl9cmV0dXJue1tmXTpoLFtkXTptfX19fSxLMz1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOiJzaXplIixvcHRpb25zOmUsYXN5bmMgZm4odCl7Y29uc3R7cGxhY2VtZW50Om4scmVjdHM6cixwbGF0Zm9ybTppLGVsZW1lbnRzOm99PXQse2FwcGx5Omw9KCk9Pnt9LC4uLnN9PWdpKGUsdCksYT1hd2FpdCB3dSh0LHMpLHU9dmkobiksYz1NcyhuKSxkPURzKG4pPT09InkiLHt3aWR0aDpmLGhlaWdodDpofT1yLmZsb2F0aW5nO2xldCBtLGc7dT09PSJ0b3AifHx1PT09ImJvdHRvbSI/KG09dSxnPWM9PT0oYXdhaXQoaS5pc1JUTD09bnVsbD92b2lkIDA6aS5pc1JUTChvLmZsb2F0aW5nKSk/InN0YXJ0IjoiZW5kIik/ImxlZnQiOiJyaWdodCIpOihnPXUsbT1jPT09ImVuZCI/InRvcCI6ImJvdHRvbSIpO2NvbnN0IFM9aC1hW21dLHY9Zi1hW2ddLHk9IXQubWlkZGxld2FyZURhdGEuc2hpZnQ7bGV0IF89Uyx3PXY7aWYoZCl7Y29uc3QgJD1mLWEubGVmdC1hLnJpZ2h0O3c9Y3x8eT9mbyh2LCQpOiR9ZWxzZXtjb25zdCAkPWgtYS50b3AtYS5ib3R0b207Xz1jfHx5P2ZvKFMsJCk6JH1pZih5JiYhYyl7Y29uc3QgJD1EbihhLmxlZnQsMCksQz1EbihhLnJpZ2h0LDApLFQ9RG4oYS50b3AsMCksTj1EbihhLmJvdHRvbSwwKTtkP3c9Zi0yKigkIT09MHx8QyE9PTA/JCtDOkRuKGEubGVmdCxhLnJpZ2h0KSk6Xz1oLTIqKFQhPT0wfHxOIT09MD9UK046RG4oYS50b3AsYS5ib3R0b20pKX1hd2FpdCBsKHsuLi50LGF2YWlsYWJsZVdpZHRoOncsYXZhaWxhYmxlSGVpZ2h0Ol99KTtjb25zdCBFPWF3YWl0IGkuZ2V0RGltZW5zaW9ucyhvLmZsb2F0aW5nKTtyZXR1cm4gZiE9PUUud2lkdGh8fGghPT1FLmhlaWdodD97cmVzZXQ6e3JlY3RzOiEwfX06e319fX07ZnVuY3Rpb24gcG8oZSl7cmV0dXJuIHpDKGUpPyhlLm5vZGVOYW1lfHwiIikudG9Mb3dlckNhc2UoKToiI2RvY3VtZW50In1mdW5jdGlvbiBGbihlKXt2YXIgdDtyZXR1cm4oZT09bnVsbHx8KHQ9ZS5vd25lckRvY3VtZW50KT09bnVsbD92b2lkIDA6dC5kZWZhdWx0Vmlldyl8fHdpbmRvd31mdW5jdGlvbiBDaShlKXt2YXIgdDtyZXR1cm4odD0oekMoZSk/ZS5vd25lckRvY3VtZW50OmUuZG9jdW1lbnQpfHx3aW5kb3cuZG9jdW1lbnQpPT1udWxsP3ZvaWQgMDp0LmRvY3VtZW50RWxlbWVudH1mdW5jdGlvbiB6QyhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIE5vZGV8fGUgaW5zdGFuY2VvZiBGbihlKS5Ob2RlfWZ1bmN0aW9uIHlpKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRWxlbWVudHx8ZSBpbnN0YW5jZW9mIEZuKGUpLkVsZW1lbnR9ZnVuY3Rpb24gWnIoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudHx8ZSBpbnN0YW5jZW9mIEZuKGUpLkhUTUxFbGVtZW50fWZ1bmN0aW9uIEJ4KGUpe3JldHVybiB0eXBlb2YgU2hhZG93Um9vdD4idSI/ITE6ZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3R8fGUgaW5zdGFuY2VvZiBGbihlKS5TaGFkb3dSb290fWZ1bmN0aW9uIEJ1KGUpe2NvbnN0e292ZXJmbG93OnQsb3ZlcmZsb3dYOm4sb3ZlcmZsb3dZOnIsZGlzcGxheTppfT1vcihlKTtyZXR1cm4vYXV0b3xzY3JvbGx8b3ZlcmxheXxoaWRkZW58Y2xpcC8udGVzdCh0K3IrbikmJiFbImlubGluZSIsImNvbnRlbnRzIl0uaW5jbHVkZXMoaSl9ZnVuY3Rpb24gWjMoZSl7cmV0dXJuWyJ0YWJsZSIsInRkIiwidGgiXS5pbmNsdWRlcyhwbyhlKSl9ZnVuY3Rpb24gVXYoZSl7Y29uc3QgdD1XdigpLG49b3IoZSk7cmV0dXJuIG4udHJhbnNmb3JtIT09Im5vbmUifHxuLnBlcnNwZWN0aXZlIT09Im5vbmUifHwobi5jb250YWluZXJUeXBlP24uY29udGFpbmVyVHlwZSE9PSJub3JtYWwiOiExKXx8IXQmJihuLmJhY2tkcm9wRmlsdGVyP24uYmFja2Ryb3BGaWx0ZXIhPT0ibm9uZSI6ITEpfHwhdCYmKG4uZmlsdGVyP24uZmlsdGVyIT09Im5vbmUiOiExKXx8WyJ0cmFuc2Zvcm0iLCJwZXJzcGVjdGl2ZSIsImZpbHRlciJdLnNvbWUocj0+KG4ud2lsbENoYW5nZXx8IiIpLmluY2x1ZGVzKHIpKXx8WyJwYWludCIsImxheW91dCIsInN0cmljdCIsImNvbnRlbnQiXS5zb21lKHI9PihuLmNvbnRhaW58fCIiKS5pbmNsdWRlcyhyKSl9ZnVuY3Rpb24gRzMoZSl7bGV0IHQ9bXMoZSk7Zm9yKDtacih0KSYmIXpmKHQpOyl7aWYoVXYodCkpcmV0dXJuIHQ7dD1tcyh0KX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBXdigpe3JldHVybiB0eXBlb2YgQ1NTPiJ1Inx8IUNTUy5zdXBwb3J0cz8hMTpDU1Muc3VwcG9ydHMoIi13ZWJraXQtYmFja2Ryb3AtZmlsdGVyIiwibm9uZSIpfWZ1bmN0aW9uIHpmKGUpe3JldHVyblsiaHRtbCIsImJvZHkiLCIjZG9jdW1lbnQiXS5pbmNsdWRlcyhwbyhlKSl9ZnVuY3Rpb24gb3IoZSl7cmV0dXJuIEZuKGUpLmdldENvbXB1dGVkU3R5bGUoZSl9ZnVuY3Rpb24gRmYoZSl7cmV0dXJuIHlpKGUpP3tzY3JvbGxMZWZ0OmUuc2Nyb2xsTGVmdCxzY3JvbGxUb3A6ZS5zY3JvbGxUb3B9OntzY3JvbGxMZWZ0OmUucGFnZVhPZmZzZXQsc2Nyb2xsVG9wOmUucGFnZVlPZmZzZXR9fWZ1bmN0aW9uIG1zKGUpe2lmKHBvKGUpPT09Imh0bWwiKXJldHVybiBlO2NvbnN0IHQ9ZS5hc3NpZ25lZFNsb3R8fGUucGFyZW50Tm9kZXx8QngoZSkmJmUuaG9zdHx8Q2koZSk7cmV0dXJuIEJ4KHQpP3QuaG9zdDp0fWZ1bmN0aW9uIEZDKGUpe2NvbnN0IHQ9bXMoZSk7cmV0dXJuIHpmKHQpP2Uub3duZXJEb2N1bWVudD9lLm93bmVyRG9jdW1lbnQuYm9keTplLmJvZHk6WnIodCkmJkJ1KHQpP3Q6RkModCl9ZnVuY3Rpb24gU3UoZSx0LG4pe3ZhciByO3Q9PT12b2lkIDAmJih0PVtdKSxuPT09dm9pZCAwJiYobj0hMCk7Y29uc3QgaT1GQyhlKSxvPWk9PT0oKHI9ZS5vd25lckRvY3VtZW50KT09bnVsbD92b2lkIDA6ci5ib2R5KSxsPUZuKGkpO3JldHVybiBvP3QuY29uY2F0KGwsbC52aXN1YWxWaWV3cG9ydHx8W10sQnUoaSk/aTpbXSxsLmZyYW1lRWxlbWVudCYmbj9TdShsLmZyYW1lRWxlbWVudCk6W10pOnQuY29uY2F0KGksU3UoaSxbXSxuKSl9ZnVuY3Rpb24gQkMoZSl7Y29uc3QgdD1vcihlKTtsZXQgbj1wYXJzZUZsb2F0KHQud2lkdGgpfHwwLHI9cGFyc2VGbG9hdCh0LmhlaWdodCl8fDA7Y29uc3QgaT1acihlKSxvPWk/ZS5vZmZzZXRXaWR0aDpuLGw9aT9lLm9mZnNldEhlaWdodDpyLHM9WWQobikhPT1vfHxZZChyKSE9PWw7cmV0dXJuIHMmJihuPW8scj1sKSx7d2lkdGg6bixoZWlnaHQ6ciwkOnN9fWZ1bmN0aW9uIFZ2KGUpe3JldHVybiB5aShlKT9lOmUuY29udGV4dEVsZW1lbnR9ZnVuY3Rpb24gSmwoZSl7Y29uc3QgdD1WdihlKTtpZighWnIodCkpcmV0dXJuIGhvKDEpO2NvbnN0IG49dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx7d2lkdGg6cixoZWlnaHQ6aSwkOm99PUJDKHQpO2xldCBsPShvP1lkKG4ud2lkdGgpOm4ud2lkdGgpL3Iscz0obz9ZZChuLmhlaWdodCk6bi5oZWlnaHQpL2k7cmV0dXJuKCFsfHwhTnVtYmVyLmlzRmluaXRlKGwpKSYmKGw9MSksKCFzfHwhTnVtYmVyLmlzRmluaXRlKHMpKSYmKHM9MSkse3g6bCx5OnN9fWNvbnN0IFkzPWhvKDApO2Z1bmN0aW9uIFVDKGUpe2NvbnN0IHQ9Rm4oZSk7cmV0dXJuIVd2KCl8fCF0LnZpc3VhbFZpZXdwb3J0P1kzOnt4OnQudmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdCx5OnQudmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wfX1mdW5jdGlvbiBYMyhlLHQsbil7cmV0dXJuIHQ9PT12b2lkIDAmJih0PSExKSwhbnx8dCYmbiE9PUZuKGUpPyExOnR9ZnVuY3Rpb24gdGwoZSx0LG4scil7dD09PXZvaWQgMCYmKHQ9ITEpLG49PT12b2lkIDAmJihuPSExKTtjb25zdCBpPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbz1WdihlKTtsZXQgbD1obygxKTt0JiYocj95aShyKSYmKGw9SmwocikpOmw9SmwoZSkpO2NvbnN0IHM9WDMobyxuLHIpP1VDKG8pOmhvKDApO2xldCBhPShpLmxlZnQrcy54KS9sLngsdT0oaS50b3Arcy55KS9sLnksYz1pLndpZHRoL2wueCxkPWkuaGVpZ2h0L2wueTtpZihvKXtjb25zdCBmPUZuKG8pLGg9ciYmeWkocik/Rm4ocik6cjtsZXQgbT1mLmZyYW1lRWxlbWVudDtmb3IoO20mJnImJmghPT1mOyl7Y29uc3QgZz1KbChtKSxTPW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdj1vcihtKSx5PVMubGVmdCsobS5jbGllbnRMZWZ0K3BhcnNlRmxvYXQodi5wYWRkaW5nTGVmdCkpKmcueCxfPVMudG9wKyhtLmNsaWVudFRvcCtwYXJzZUZsb2F0KHYucGFkZGluZ1RvcCkpKmcueTthKj1nLngsdSo9Zy55LGMqPWcueCxkKj1nLnksYSs9eSx1Kz1fLG09Rm4obSkuZnJhbWVFbGVtZW50fX1yZXR1cm4gUWQoe3dpZHRoOmMsaGVpZ2h0OmQseDphLHk6dX0pfWZ1bmN0aW9uIFEzKGUpe2xldHtyZWN0OnQsb2Zmc2V0UGFyZW50Om4sc3RyYXRlZ3k6cn09ZTtjb25zdCBpPVpyKG4pLG89Q2kobik7aWYobj09PW8pcmV0dXJuIHQ7bGV0IGw9e3Njcm9sbExlZnQ6MCxzY3JvbGxUb3A6MH0scz1obygxKTtjb25zdCBhPWhvKDApO2lmKChpfHwhaSYmciE9PSJmaXhlZCIpJiYoKHBvKG4pIT09ImJvZHkifHxCdShvKSkmJihsPUZmKG4pKSxacihuKSkpe2NvbnN0IHU9dGwobik7cz1KbChuKSxhLng9dS54K24uY2xpZW50TGVmdCxhLnk9dS55K24uY2xpZW50VG9wfXJldHVybnt3aWR0aDp0LndpZHRoKnMueCxoZWlnaHQ6dC5oZWlnaHQqcy55LHg6dC54KnMueC1sLnNjcm9sbExlZnQqcy54K2EueCx5OnQueSpzLnktbC5zY3JvbGxUb3Aqcy55K2EueX19ZnVuY3Rpb24gSjMoZSl7cmV0dXJuIEFycmF5LmZyb20oZS5nZXRDbGllbnRSZWN0cygpKX1mdW5jdGlvbiBXQyhlKXtyZXR1cm4gdGwoQ2koZSkpLmxlZnQrRmYoZSkuc2Nyb2xsTGVmdH1mdW5jdGlvbiBxMyhlKXtjb25zdCB0PUNpKGUpLG49RmYoZSkscj1lLm93bmVyRG9jdW1lbnQuYm9keSxpPURuKHQuc2Nyb2xsV2lkdGgsdC5jbGllbnRXaWR0aCxyLnNjcm9sbFdpZHRoLHIuY2xpZW50V2lkdGgpLG89RG4odC5zY3JvbGxIZWlnaHQsdC5jbGllbnRIZWlnaHQsci5zY3JvbGxIZWlnaHQsci5jbGllbnRIZWlnaHQpO2xldCBsPS1uLnNjcm9sbExlZnQrV0MoZSk7Y29uc3Qgcz0tbi5zY3JvbGxUb3A7cmV0dXJuIG9yKHIpLmRpcmVjdGlvbj09PSJydGwiJiYobCs9RG4odC5jbGllbnRXaWR0aCxyLmNsaWVudFdpZHRoKS1pKSx7d2lkdGg6aSxoZWlnaHQ6byx4OmwseTpzfX1mdW5jdGlvbiBlTShlLHQpe2NvbnN0IG49Rm4oZSkscj1DaShlKSxpPW4udmlzdWFsVmlld3BvcnQ7bGV0IG89ci5jbGllbnRXaWR0aCxsPXIuY2xpZW50SGVpZ2h0LHM9MCxhPTA7aWYoaSl7bz1pLndpZHRoLGw9aS5oZWlnaHQ7Y29uc3QgdT1XdigpOyghdXx8dSYmdD09PSJmaXhlZCIpJiYocz1pLm9mZnNldExlZnQsYT1pLm9mZnNldFRvcCl9cmV0dXJue3dpZHRoOm8saGVpZ2h0OmwseDpzLHk6YX19ZnVuY3Rpb24gdE0oZSx0KXtjb25zdCBuPXRsKGUsITAsdD09PSJmaXhlZCIpLHI9bi50b3ArZS5jbGllbnRUb3AsaT1uLmxlZnQrZS5jbGllbnRMZWZ0LG89WnIoZSk/SmwoZSk6aG8oMSksbD1lLmNsaWVudFdpZHRoKm8ueCxzPWUuY2xpZW50SGVpZ2h0Km8ueSxhPWkqby54LHU9cipvLnk7cmV0dXJue3dpZHRoOmwsaGVpZ2h0OnMseDphLHk6dX19ZnVuY3Rpb24gVXgoZSx0LG4pe2xldCByO2lmKHQ9PT0idmlld3BvcnQiKXI9ZU0oZSxuKTtlbHNlIGlmKHQ9PT0iZG9jdW1lbnQiKXI9cTMoQ2koZSkpO2Vsc2UgaWYoeWkodCkpcj10TSh0LG4pO2Vsc2V7Y29uc3QgaT1VQyhlKTtyPXsuLi50LHg6dC54LWkueCx5OnQueS1pLnl9fXJldHVybiBRZChyKX1mdW5jdGlvbiBWQyhlLHQpe2NvbnN0IG49bXMoZSk7cmV0dXJuIG49PT10fHwheWkobil8fHpmKG4pPyExOm9yKG4pLnBvc2l0aW9uPT09ImZpeGVkInx8VkMobix0KX1mdW5jdGlvbiBuTShlLHQpe2NvbnN0IG49dC5nZXQoZSk7aWYobilyZXR1cm4gbjtsZXQgcj1TdShlLFtdLCExKS5maWx0ZXIocz0+eWkocykmJnBvKHMpIT09ImJvZHkiKSxpPW51bGw7Y29uc3Qgbz1vcihlKS5wb3NpdGlvbj09PSJmaXhlZCI7bGV0IGw9bz9tcyhlKTplO2Zvcig7eWkobCkmJiF6ZihsKTspe2NvbnN0IHM9b3IobCksYT1VdihsKTshYSYmcy5wb3NpdGlvbj09PSJmaXhlZCImJihpPW51bGwpLChvPyFhJiYhaTohYSYmcy5wb3NpdGlvbj09PSJzdGF0aWMiJiYhIWkmJlsiYWJzb2x1dGUiLCJmaXhlZCJdLmluY2x1ZGVzKGkucG9zaXRpb24pfHxCdShsKSYmIWEmJlZDKGUsbCkpP3I9ci5maWx0ZXIoYz0+YyE9PWwpOmk9cyxsPW1zKGwpfXJldHVybiB0LnNldChlLHIpLHJ9ZnVuY3Rpb24gck0oZSl7bGV0e2VsZW1lbnQ6dCxib3VuZGFyeTpuLHJvb3RCb3VuZGFyeTpyLHN0cmF0ZWd5Oml9PWU7Y29uc3QgbD1bLi4ubj09PSJjbGlwcGluZ0FuY2VzdG9ycyI/bk0odCx0aGlzLl9jKTpbXS5jb25jYXQobikscl0scz1sWzBdLGE9bC5yZWR1Y2UoKHUsYyk9Pntjb25zdCBkPVV4KHQsYyxpKTtyZXR1cm4gdS50b3A9RG4oZC50b3AsdS50b3ApLHUucmlnaHQ9Zm8oZC5yaWdodCx1LnJpZ2h0KSx1LmJvdHRvbT1mbyhkLmJvdHRvbSx1LmJvdHRvbSksdS5sZWZ0PURuKGQubGVmdCx1LmxlZnQpLHV9LFV4KHQscyxpKSk7cmV0dXJue3dpZHRoOmEucmlnaHQtYS5sZWZ0LGhlaWdodDphLmJvdHRvbS1hLnRvcCx4OmEubGVmdCx5OmEudG9wfX1mdW5jdGlvbiBpTShlKXtyZXR1cm4gQkMoZSl9ZnVuY3Rpb24gb00oZSx0LG4pe2NvbnN0IHI9WnIodCksaT1DaSh0KSxvPW49PT0iZml4ZWQiLGw9dGwoZSwhMCxvLHQpO2xldCBzPXtzY3JvbGxMZWZ0OjAsc2Nyb2xsVG9wOjB9O2NvbnN0IGE9aG8oMCk7aWYocnx8IXImJiFvKWlmKChwbyh0KSE9PSJib2R5Inx8QnUoaSkpJiYocz1GZih0KSkscil7Y29uc3QgdT10bCh0LCEwLG8sdCk7YS54PXUueCt0LmNsaWVudExlZnQsYS55PXUueSt0LmNsaWVudFRvcH1lbHNlIGkmJihhLng9V0MoaSkpO3JldHVybnt4OmwubGVmdCtzLnNjcm9sbExlZnQtYS54LHk6bC50b3Arcy5zY3JvbGxUb3AtYS55LHdpZHRoOmwud2lkdGgsaGVpZ2h0OmwuaGVpZ2h0fX1mdW5jdGlvbiBXeChlLHQpe3JldHVybiFacihlKXx8b3IoZSkucG9zaXRpb249PT0iZml4ZWQiP251bGw6dD90KGUpOmUub2Zmc2V0UGFyZW50fWZ1bmN0aW9uIEhDKGUsdCl7Y29uc3Qgbj1GbihlKTtpZighWnIoZSkpcmV0dXJuIG47bGV0IHI9V3goZSx0KTtmb3IoO3ImJlozKHIpJiZvcihyKS5wb3NpdGlvbj09PSJzdGF0aWMiOylyPVd4KHIsdCk7cmV0dXJuIHImJihwbyhyKT09PSJodG1sInx8cG8ocik9PT0iYm9keSImJm9yKHIpLnBvc2l0aW9uPT09InN0YXRpYyImJiFVdihyKSk/bjpyfHxHMyhlKXx8bn1jb25zdCBsTT1hc3luYyBmdW5jdGlvbihlKXtsZXR7cmVmZXJlbmNlOnQsZmxvYXRpbmc6bixzdHJhdGVneTpyfT1lO2NvbnN0IGk9dGhpcy5nZXRPZmZzZXRQYXJlbnR8fEhDLG89dGhpcy5nZXREaW1lbnNpb25zO3JldHVybntyZWZlcmVuY2U6b00odCxhd2FpdCBpKG4pLHIpLGZsb2F0aW5nOnt4OjAseTowLC4uLmF3YWl0IG8obil9fX07ZnVuY3Rpb24gc00oZSl7cmV0dXJuIG9yKGUpLmRpcmVjdGlvbj09PSJydGwifWNvbnN0IGFNPXtjb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdDpRMyxnZXREb2N1bWVudEVsZW1lbnQ6Q2ksZ2V0Q2xpcHBpbmdSZWN0OnJNLGdldE9mZnNldFBhcmVudDpIQyxnZXRFbGVtZW50UmVjdHM6bE0sZ2V0Q2xpZW50UmVjdHM6SjMsZ2V0RGltZW5zaW9uczppTSxnZXRTY2FsZTpKbCxpc0VsZW1lbnQ6eWksaXNSVEw6c019O2Z1bmN0aW9uIHVNKGUsdCl7bGV0IG49bnVsbCxyO2NvbnN0IGk9Q2koZSk7ZnVuY3Rpb24gbygpe2NsZWFyVGltZW91dChyKSxuJiZuLmRpc2Nvbm5lY3QoKSxuPW51bGx9ZnVuY3Rpb24gbChzLGEpe3M9PT12b2lkIDAmJihzPSExKSxhPT09dm9pZCAwJiYoYT0xKSxvKCk7Y29uc3R7bGVmdDp1LHRvcDpjLHdpZHRoOmQsaGVpZ2h0OmZ9PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoc3x8dCgpLCFkfHwhZilyZXR1cm47Y29uc3QgaD1TYyhjKSxtPVNjKGkuY2xpZW50V2lkdGgtKHUrZCkpLGc9U2MoaS5jbGllbnRIZWlnaHQtKGMrZikpLFM9U2ModSkseT17cm9vdE1hcmdpbjotaCsicHggIistbSsicHggIistZysicHggIistUysicHgiLHRocmVzaG9sZDpEbigwLGZvKDEsYSkpfHwxfTtsZXQgXz0hMDtmdW5jdGlvbiB3KEUpe2NvbnN0ICQ9RVswXS5pbnRlcnNlY3Rpb25SYXRpbztpZigkIT09YSl7aWYoIV8pcmV0dXJuIGwoKTskP2woITEsJCk6cj1zZXRUaW1lb3V0KCgpPT57bCghMSwxZS03KX0sMTAwKX1fPSExfXRyeXtuPW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcih3LHsuLi55LHJvb3Q6aS5vd25lckRvY3VtZW50fSl9Y2F0Y2h7bj1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIodyx5KX1uLm9ic2VydmUoZSl9cmV0dXJuIGwoITApLG99ZnVuY3Rpb24gY00oZSx0LG4scil7cj09PXZvaWQgMCYmKHI9e30pO2NvbnN0e2FuY2VzdG9yU2Nyb2xsOmk9ITAsYW5jZXN0b3JSZXNpemU6bz0hMCxlbGVtZW50UmVzaXplOmw9dHlwZW9mIFJlc2l6ZU9ic2VydmVyPT0iZnVuY3Rpb24iLGxheW91dFNoaWZ0OnM9dHlwZW9mIEludGVyc2VjdGlvbk9ic2VydmVyPT0iZnVuY3Rpb24iLGFuaW1hdGlvbkZyYW1lOmE9ITF9PXIsdT1WdihlKSxjPWl8fG8/Wy4uLnU/U3UodSk6W10sLi4uU3UodCldOltdO2MuZm9yRWFjaCh2PT57aSYmdi5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLG4se3Bhc3NpdmU6ITB9KSxvJiZ2LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsbil9KTtjb25zdCBkPXUmJnM/dU0odSxuKTpudWxsO2xldCBmPS0xLGg9bnVsbDtsJiYoaD1uZXcgUmVzaXplT2JzZXJ2ZXIodj0+e2xldFt5XT12O3kmJnkudGFyZ2V0PT09dSYmaCYmKGgudW5vYnNlcnZlKHQpLGNhbmNlbEFuaW1hdGlvbkZyYW1lKGYpLGY9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57aCYmaC5vYnNlcnZlKHQpfSkpLG4oKX0pLHUmJiFhJiZoLm9ic2VydmUodSksaC5vYnNlcnZlKHQpKTtsZXQgbSxnPWE/dGwoZSk6bnVsbDthJiZTKCk7ZnVuY3Rpb24gUygpe2NvbnN0IHY9dGwoZSk7ZyYmKHYueCE9PWcueHx8di55IT09Zy55fHx2LndpZHRoIT09Zy53aWR0aHx8di5oZWlnaHQhPT1nLmhlaWdodCkmJm4oKSxnPXYsbT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoUyl9cmV0dXJuIG4oKSwoKT0+e2MuZm9yRWFjaCh2PT57aSYmdi5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLG4pLG8mJnYucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixuKX0pLGQmJmQoKSxoJiZoLmRpc2Nvbm5lY3QoKSxoPW51bGwsYSYmY2FuY2VsQW5pbWF0aW9uRnJhbWUobSl9fWNvbnN0IGRNPShlLHQsbik9Pntjb25zdCByPW5ldyBNYXAsaT17cGxhdGZvcm06YU0sLi4ubn0sbz17Li4uaS5wbGF0Zm9ybSxfYzpyfTtyZXR1cm4gejMoZSx0LHsuLi5pLHBsYXRmb3JtOm99KX0sZk09ZT0+e2Z1bmN0aW9uIHQobil7cmV0dXJue30uaGFzT3duUHJvcGVydHkuY2FsbChuLCJjdXJyZW50Iil9cmV0dXJue25hbWU6ImFycm93IixvcHRpb25zOmUsZm4obil7Y29uc3R7ZWxlbWVudDpyLHBhZGRpbmc6aX09dHlwZW9mIGU9PSJmdW5jdGlvbiI/ZShuKTplO3JldHVybiByJiZ0KHIpP3IuY3VycmVudCE9bnVsbD9qeCh7ZWxlbWVudDpyLmN1cnJlbnQscGFkZGluZzppfSkuZm4obik6e306cj9qeCh7ZWxlbWVudDpyLHBhZGRpbmc6aX0pLmZuKG4pOnt9fX19O3ZhciBLYz10eXBlb2YgZG9jdW1lbnQ8InUiP3AudXNlTGF5b3V0RWZmZWN0OnAudXNlRWZmZWN0O2Z1bmN0aW9uIEpkKGUsdCl7aWYoZT09PXQpcmV0dXJuITA7aWYodHlwZW9mIGUhPXR5cGVvZiB0KXJldHVybiExO2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iJiZlLnRvU3RyaW5nKCk9PT10LnRvU3RyaW5nKCkpcmV0dXJuITA7bGV0IG4scixpO2lmKGUmJnQmJnR5cGVvZiBlPT0ib2JqZWN0Iil7aWYoQXJyYXkuaXNBcnJheShlKSl7aWYobj1lLmxlbmd0aCxuIT10Lmxlbmd0aClyZXR1cm4hMTtmb3Iocj1uO3ItLSE9PTA7KWlmKCFKZChlW3JdLHRbcl0pKXJldHVybiExO3JldHVybiEwfWlmKGk9T2JqZWN0LmtleXMoZSksbj1pLmxlbmd0aCxuIT09T2JqZWN0LmtleXModCkubGVuZ3RoKXJldHVybiExO2ZvcihyPW47ci0tIT09MDspaWYoIXt9Lmhhc093blByb3BlcnR5LmNhbGwodCxpW3JdKSlyZXR1cm4hMTtmb3Iocj1uO3ItLSE9PTA7KXtjb25zdCBvPWlbcl07aWYoIShvPT09Il9vd25lciImJmUuJCR0eXBlb2YpJiYhSmQoZVtvXSx0W29dKSlyZXR1cm4hMX1yZXR1cm4hMH1yZXR1cm4gZSE9PWUmJnQhPT10fWZ1bmN0aW9uIEtDKGUpe3JldHVybiB0eXBlb2Ygd2luZG93PiJ1Ij8xOihlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdykuZGV2aWNlUGl4ZWxSYXRpb3x8MX1mdW5jdGlvbiBWeChlLHQpe2NvbnN0IG49S0MoZSk7cmV0dXJuIE1hdGgucm91bmQodCpuKS9ufWZ1bmN0aW9uIEh4KGUpe2NvbnN0IHQ9cC51c2VSZWYoZSk7cmV0dXJuIEtjKCgpPT57dC5jdXJyZW50PWV9KSx0fWZ1bmN0aW9uIGhNKGUpe2U9PT12b2lkIDAmJihlPXt9KTtjb25zdHtwbGFjZW1lbnQ6dD0iYm90dG9tIixzdHJhdGVneTpuPSJhYnNvbHV0ZSIsbWlkZGxld2FyZTpyPVtdLHBsYXRmb3JtOmksZWxlbWVudHM6e3JlZmVyZW5jZTpvLGZsb2F0aW5nOmx9PXt9LHRyYW5zZm9ybTpzPSEwLHdoaWxlRWxlbWVudHNNb3VudGVkOmEsb3Blbjp1fT1lLFtjLGRdPXAudXNlU3RhdGUoe3g6MCx5OjAsc3RyYXRlZ3k6bixwbGFjZW1lbnQ6dCxtaWRkbGV3YXJlRGF0YTp7fSxpc1Bvc2l0aW9uZWQ6ITF9KSxbZixoXT1wLnVzZVN0YXRlKHIpO0pkKGYscil8fGgocik7Y29uc3RbbSxnXT1wLnVzZVN0YXRlKG51bGwpLFtTLHZdPXAudXNlU3RhdGUobnVsbCkseT1wLnVzZUNhbGxiYWNrKE89PntPIT0kLmN1cnJlbnQmJigkLmN1cnJlbnQ9TyxnKE8pKX0sW2ddKSxfPXAudXNlQ2FsbGJhY2soTz0+e08hPT1DLmN1cnJlbnQmJihDLmN1cnJlbnQ9Tyx2KE8pKX0sW3ZdKSx3PW98fG0sRT1sfHxTLCQ9cC51c2VSZWYobnVsbCksQz1wLnVzZVJlZihudWxsKSxUPXAudXNlUmVmKGMpLE49SHgoYSksUj1IeChpKSxEPXAudXNlQ2FsbGJhY2soKCk9PntpZighJC5jdXJyZW50fHwhQy5jdXJyZW50KXJldHVybjtjb25zdCBPPXtwbGFjZW1lbnQ6dCxzdHJhdGVneTpuLG1pZGRsZXdhcmU6Zn07Ui5jdXJyZW50JiYoTy5wbGF0Zm9ybT1SLmN1cnJlbnQpLGRNKCQuY3VycmVudCxDLmN1cnJlbnQsTykudGhlbihBPT57Y29uc3Qgaz17Li4uQSxpc1Bvc2l0aW9uZWQ6ITB9O0YuY3VycmVudCYmIUpkKFQuY3VycmVudCxrKSYmKFQuY3VycmVudD1rLEdyLmZsdXNoU3luYygoKT0+e2Qoayl9KSl9KX0sW2YsdCxuLFJdKTtLYygoKT0+e3U9PT0hMSYmVC5jdXJyZW50LmlzUG9zaXRpb25lZCYmKFQuY3VycmVudC5pc1Bvc2l0aW9uZWQ9ITEsZChPPT4oey4uLk8saXNQb3NpdGlvbmVkOiExfSkpKX0sW3VdKTtjb25zdCBGPXAudXNlUmVmKCExKTtLYygoKT0+KEYuY3VycmVudD0hMCwoKT0+e0YuY3VycmVudD0hMX0pLFtdKSxLYygoKT0+e2lmKHcmJigkLmN1cnJlbnQ9dyksRSYmKEMuY3VycmVudD1FKSx3JiZFKXtpZihOLmN1cnJlbnQpcmV0dXJuIE4uY3VycmVudCh3LEUsRCk7RCgpfX0sW3csRSxELE5dKTtjb25zdCBzZT1wLnVzZU1lbW8oKCk9Pih7cmVmZXJlbmNlOiQsZmxvYXRpbmc6QyxzZXRSZWZlcmVuY2U6eSxzZXRGbG9hdGluZzpffSksW3ksX10pLFY9cC51c2VNZW1vKCgpPT4oe3JlZmVyZW5jZTp3LGZsb2F0aW5nOkV9KSxbdyxFXSksSz1wLnVzZU1lbW8oKCk9Pntjb25zdCBPPXtwb3NpdGlvbjpuLGxlZnQ6MCx0b3A6MH07aWYoIVYuZmxvYXRpbmcpcmV0dXJuIE87Y29uc3QgQT1WeChWLmZsb2F0aW5nLGMueCksaz1WeChWLmZsb2F0aW5nLGMueSk7cmV0dXJuIHM/ey4uLk8sdHJhbnNmb3JtOiJ0cmFuc2xhdGUoIitBKyJweCwgIitrKyJweCkiLC4uLktDKFYuZmxvYXRpbmcpPj0xLjUmJnt3aWxsQ2hhbmdlOiJ0cmFuc2Zvcm0ifX06e3Bvc2l0aW9uOm4sbGVmdDpBLHRvcDprfX0sW24scyxWLmZsb2F0aW5nLGMueCxjLnldKTtyZXR1cm4gcC51c2VNZW1vKCgpPT4oey4uLmMsdXBkYXRlOkQscmVmczpzZSxlbGVtZW50czpWLGZsb2F0aW5nU3R5bGVzOkt9KSxbYyxELHNlLFYsS10pfWZ1bmN0aW9uIFpDKGUpe2NvbnN0W3Qsbl09cC51c2VTdGF0ZSh2b2lkIDApO3JldHVybiBVbigoKT0+e2lmKGUpe24oe3dpZHRoOmUub2Zmc2V0V2lkdGgsaGVpZ2h0OmUub2Zmc2V0SGVpZ2h0fSk7Y29uc3Qgcj1uZXcgUmVzaXplT2JzZXJ2ZXIoaT0+e2lmKCFBcnJheS5pc0FycmF5KGkpfHwhaS5sZW5ndGgpcmV0dXJuO2NvbnN0IG89aVswXTtsZXQgbCxzO2lmKCJib3JkZXJCb3hTaXplImluIG8pe2NvbnN0IGE9by5ib3JkZXJCb3hTaXplLHU9QXJyYXkuaXNBcnJheShhKT9hWzBdOmE7bD11LmlubGluZVNpemUscz11LmJsb2NrU2l6ZX1lbHNlIGw9ZS5vZmZzZXRXaWR0aCxzPWUub2Zmc2V0SGVpZ2h0O24oe3dpZHRoOmwsaGVpZ2h0OnN9KX0pO3JldHVybiByLm9ic2VydmUoZSx7Ym94OiJib3JkZXItYm94In0pLCgpPT5yLnVub2JzZXJ2ZShlKX1lbHNlIG4odm9pZCAwKX0sW2VdKSx0fWNvbnN0IEdDPSJQb3BwZXIiLFtZQyxYQ109b2woR0MpLFtwTSxRQ109WUMoR0MpLG1NPWU9Pntjb25zdHtfX3Njb3BlUG9wcGVyOnQsY2hpbGRyZW46bn09ZSxbcixpXT1wLnVzZVN0YXRlKG51bGwpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocE0se3Njb3BlOnQsYW5jaG9yOnIsb25BbmNob3JDaGFuZ2U6aX0sbil9LGdNPSJQb3BwZXJBbmNob3IiLHZNPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVQb3BwZXI6bix2aXJ0dWFsUmVmOnIsLi4uaX09ZSxvPVFDKGdNLG4pLGw9cC51c2VSZWYobnVsbCkscz1zdCh0LGwpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e28ub25BbmNob3JDaGFuZ2UoKHI9PW51bGw/dm9pZCAwOnIuY3VycmVudCl8fGwuY3VycmVudCl9KSxyP251bGw6cC5jcmVhdGVFbGVtZW50KEtlLmRpdixpZSh7fSxpLHtyZWY6c30pKX0pLEpDPSJQb3BwZXJDb250ZW50IixbeU0sVExdPVlDKEpDKSx4TT1wLmZvcndhcmRSZWYoKGUsdCk9Pnt2YXIgbixyLGksbyxsLHMsYSx1O2NvbnN0e19fc2NvcGVQb3BwZXI6YyxzaWRlOmQ9ImJvdHRvbSIsc2lkZU9mZnNldDpmPTAsYWxpZ246aD0iY2VudGVyIixhbGlnbk9mZnNldDptPTAsYXJyb3dQYWRkaW5nOmc9MCxhdm9pZENvbGxpc2lvbnM6Uz0hMCxjb2xsaXNpb25Cb3VuZGFyeTp2PVtdLGNvbGxpc2lvblBhZGRpbmc6eT0wLHN0aWNreTpfPSJwYXJ0aWFsIixoaWRlV2hlbkRldGFjaGVkOnc9ITEsdXBkYXRlUG9zaXRpb25TdHJhdGVneTpFPSJvcHRpbWl6ZWQiLG9uUGxhY2VkOiQsLi4uQ309ZSxUPVFDKEpDLGMpLFtOLFJdPXAudXNlU3RhdGUobnVsbCksRD1zdCh0LFNuPT5SKFNuKSksW0Ysc2VdPXAudXNlU3RhdGUobnVsbCksVj1aQyhGKSxLPShuPVY9PW51bGw/dm9pZCAwOlYud2lkdGgpIT09bnVsbCYmbiE9PXZvaWQgMD9uOjAsTz0ocj1WPT1udWxsP3ZvaWQgMDpWLmhlaWdodCkhPT1udWxsJiZyIT09dm9pZCAwP3I6MCxBPWQrKGghPT0iY2VudGVyIj8iLSIraDoiIiksaz10eXBlb2YgeT09Im51bWJlciI/eTp7dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjAsLi4ueX0saj1BcnJheS5pc0FycmF5KHYpP3Y6W3ZdLEw9ai5sZW5ndGg+MCxaPXtwYWRkaW5nOmssYm91bmRhcnk6ai5maWx0ZXIoX00pLGFsdEJvdW5kYXJ5Okx9LHtyZWZzOm5lLGZsb2F0aW5nU3R5bGVzOmtlLHBsYWNlbWVudDp2ZSxpc1Bvc2l0aW9uZWQ6V2UsbWlkZGxld2FyZURhdGE6RmV9PWhNKHtzdHJhdGVneToiZml4ZWQiLHBsYWNlbWVudDpBLHdoaWxlRWxlbWVudHNNb3VudGVkOiguLi5Tbik9PmNNKC4uLlNuLHthbmltYXRpb25GcmFtZTpFPT09ImFsd2F5cyJ9KSxlbGVtZW50czp7cmVmZXJlbmNlOlQuYW5jaG9yfSxtaWRkbGV3YXJlOltXMyh7bWFpbkF4aXM6ZitPLGFsaWdubWVudEF4aXM6bX0pLFMmJlYzKHttYWluQXhpczohMCxjcm9zc0F4aXM6ITEsbGltaXRlcjpfPT09InBhcnRpYWwiP0gzKCk6dm9pZCAwLC4uLlp9KSxTJiZGMyh7Li4uWn0pLEszKHsuLi5aLGFwcGx5Oih7ZWxlbWVudHM6U24scmVjdHM6dXIsYXZhaWxhYmxlV2lkdGg6amUsYXZhaWxhYmxlSGVpZ2h0OlR0fSk9Pntjb25zdHt3aWR0aDphdCxoZWlnaHQ6bG59PXVyLnJlZmVyZW5jZSxFbj1Tbi5mbG9hdGluZy5zdHlsZTtFbi5zZXRQcm9wZXJ0eSgiLS1yYWRpeC1wb3BwZXItYXZhaWxhYmxlLXdpZHRoIixgJHtqZX1weGApLEVuLnNldFByb3BlcnR5KCItLXJhZGl4LXBvcHBlci1hdmFpbGFibGUtaGVpZ2h0IixgJHtUdH1weGApLEVuLnNldFByb3BlcnR5KCItLXJhZGl4LXBvcHBlci1hbmNob3Itd2lkdGgiLGAke2F0fXB4YCksRW4uc2V0UHJvcGVydHkoIi0tcmFkaXgtcG9wcGVyLWFuY2hvci1oZWlnaHQiLGAke2xufXB4YCl9fSksRiYmZk0oe2VsZW1lbnQ6RixwYWRkaW5nOmd9KSx3TSh7YXJyb3dXaWR0aDpLLGFycm93SGVpZ2h0Ok99KSx3JiZCMyh7c3RyYXRlZ3k6InJlZmVyZW5jZUhpZGRlbiIsLi4uWn0pXX0pLFt0ZSxMZV09cUModmUpLGJlPWVuKCQpO1VuKCgpPT57V2UmJihiZT09bnVsbHx8YmUoKSl9LFtXZSxiZV0pO2NvbnN0IFJlPShpPUZlLmFycm93KT09PW51bGx8fGk9PT12b2lkIDA/dm9pZCAwOmkueCxTZT0obz1GZS5hcnJvdyk9PT1udWxsfHxvPT09dm9pZCAwP3ZvaWQgMDpvLnksRGU9KChsPUZlLmFycm93KT09PW51bGx8fGw9PT12b2lkIDA/dm9pZCAwOmwuY2VudGVyT2Zmc2V0KSE9PTAsW1FlLFd0XT1wLnVzZVN0YXRlKCk7cmV0dXJuIFVuKCgpPT57TiYmV3Qod2luZG93LmdldENvbXB1dGVkU3R5bGUoTikuekluZGV4KX0sW05dKSxwLmNyZWF0ZUVsZW1lbnQoImRpdiIse3JlZjpuZS5zZXRGbG9hdGluZywiZGF0YS1yYWRpeC1wb3BwZXItY29udGVudC13cmFwcGVyIjoiIixzdHlsZTp7Li4ua2UsdHJhbnNmb3JtOldlP2tlLnRyYW5zZm9ybToidHJhbnNsYXRlKDAsIC0yMDAlKSIsbWluV2lkdGg6Im1heC1jb250ZW50Iix6SW5kZXg6UWUsIi0tcmFkaXgtcG9wcGVyLXRyYW5zZm9ybS1vcmlnaW4iOlsocz1GZS50cmFuc2Zvcm1PcmlnaW4pPT09bnVsbHx8cz09PXZvaWQgMD92b2lkIDA6cy54LChhPUZlLnRyYW5zZm9ybU9yaWdpbik9PT1udWxsfHxhPT09dm9pZCAwP3ZvaWQgMDphLnldLmpvaW4oIiAiKX0sZGlyOmUuZGlyfSxwLmNyZWF0ZUVsZW1lbnQoeU0se3Njb3BlOmMscGxhY2VkU2lkZTp0ZSxvbkFycm93Q2hhbmdlOnNlLGFycm93WDpSZSxhcnJvd1k6U2Usc2hvdWxkSGlkZUFycm93OkRlfSxwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHsiZGF0YS1zaWRlIjp0ZSwiZGF0YS1hbGlnbiI6TGV9LEMse3JlZjpELHN0eWxlOnsuLi5DLnN0eWxlLGFuaW1hdGlvbjpXZT92b2lkIDA6Im5vbmUiLG9wYWNpdHk6KHU9RmUuaGlkZSkhPT1udWxsJiZ1IT09dm9pZCAwJiZ1LnJlZmVyZW5jZUhpZGRlbj8wOnZvaWQgMH19KSkpKX0pO2Z1bmN0aW9uIF9NKGUpe3JldHVybiBlIT09bnVsbH1jb25zdCB3TT1lPT4oe25hbWU6InRyYW5zZm9ybU9yaWdpbiIsb3B0aW9uczplLGZuKHQpe3ZhciBuLHIsaSxvLGw7Y29uc3R7cGxhY2VtZW50OnMscmVjdHM6YSxtaWRkbGV3YXJlRGF0YTp1fT10LGQ9KChuPXUuYXJyb3cpPT09bnVsbHx8bj09PXZvaWQgMD92b2lkIDA6bi5jZW50ZXJPZmZzZXQpIT09MCxmPWQ/MDplLmFycm93V2lkdGgsaD1kPzA6ZS5hcnJvd0hlaWdodCxbbSxnXT1xQyhzKSxTPXtzdGFydDoiMCUiLGNlbnRlcjoiNTAlIixlbmQ6IjEwMCUifVtnXSx2PSgocj0oaT11LmFycm93KT09PW51bGx8fGk9PT12b2lkIDA/dm9pZCAwOmkueCkhPT1udWxsJiZyIT09dm9pZCAwP3I6MCkrZi8yLHk9KChvPShsPXUuYXJyb3cpPT09bnVsbHx8bD09PXZvaWQgMD92b2lkIDA6bC55KSE9PW51bGwmJm8hPT12b2lkIDA/bzowKStoLzI7bGV0IF89IiIsdz0iIjtyZXR1cm4gbT09PSJib3R0b20iPyhfPWQ/UzpgJHt2fXB4YCx3PWAkey1ofXB4YCk6bT09PSJ0b3AiPyhfPWQ/UzpgJHt2fXB4YCx3PWAke2EuZmxvYXRpbmcuaGVpZ2h0K2h9cHhgKTptPT09InJpZ2h0Ij8oXz1gJHstaH1weGAsdz1kP1M6YCR7eX1weGApOm09PT0ibGVmdCImJihfPWAke2EuZmxvYXRpbmcud2lkdGgraH1weGAsdz1kP1M6YCR7eX1weGApLHtkYXRhOnt4Ol8seTp3fX19fSk7ZnVuY3Rpb24gcUMoZSl7Y29uc3RbdCxuPSJjZW50ZXIiXT1lLnNwbGl0KCItIik7cmV0dXJuW3Qsbl19Y29uc3QgU009bU0sRU09dk0sQ009eE0sa009cC5mb3J3YXJkUmVmKChlLHQpPT57dmFyIG47Y29uc3R7Y29udGFpbmVyOnI9Z2xvYmFsVGhpcz09bnVsbHx8KG49Z2xvYmFsVGhpcy5kb2N1bWVudCk9PT1udWxsfHxuPT09dm9pZCAwP3ZvaWQgMDpuLmJvZHksLi4uaX09ZTtyZXR1cm4gcj9Jdy5jcmVhdGVQb3J0YWwocC5jcmVhdGVFbGVtZW50KEtlLmRpdixpZSh7fSxpLHtyZWY6dH0pKSxyKTpudWxsfSk7ZnVuY3Rpb24gZ3Moe3Byb3A6ZSxkZWZhdWx0UHJvcDp0LG9uQ2hhbmdlOm49KCk9Pnt9fSl7Y29uc3RbcixpXT0kTSh7ZGVmYXVsdFByb3A6dCxvbkNoYW5nZTpufSksbz1lIT09dm9pZCAwLGw9bz9lOnIscz1lbihuKSxhPXAudXNlQ2FsbGJhY2sodT0+e2lmKG8pe2NvbnN0IGQ9dHlwZW9mIHU9PSJmdW5jdGlvbiI/dShlKTp1O2QhPT1lJiZzKGQpfWVsc2UgaSh1KX0sW28sZSxpLHNdKTtyZXR1cm5bbCxhXX1mdW5jdGlvbiAkTSh7ZGVmYXVsdFByb3A6ZSxvbkNoYW5nZTp0fSl7Y29uc3Qgbj1wLnVzZVN0YXRlKGUpLFtyXT1uLGk9cC51c2VSZWYociksbz1lbih0KTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntpLmN1cnJlbnQhPT1yJiYobyhyKSxpLmN1cnJlbnQ9cil9LFtyLGksb10pLG59ZnVuY3Rpb24gZWsoZSl7Y29uc3QgdD1wLnVzZVJlZih7dmFsdWU6ZSxwcmV2aW91czplfSk7cmV0dXJuIHAudXNlTWVtbygoKT0+KHQuY3VycmVudC52YWx1ZSE9PWUmJih0LmN1cnJlbnQucHJldmlvdXM9dC5jdXJyZW50LnZhbHVlLHQuY3VycmVudC52YWx1ZT1lKSx0LmN1cnJlbnQucHJldmlvdXMpLFtlXSl9Y29uc3QgYk09cC5mb3J3YXJkUmVmKChlLHQpPT5wLmNyZWF0ZUVsZW1lbnQoS2Uuc3BhbixpZSh7fSxlLHtyZWY6dCxzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixib3JkZXI6MCx3aWR0aDoxLGhlaWdodDoxLHBhZGRpbmc6MCxtYXJnaW46LTEsb3ZlcmZsb3c6ImhpZGRlbiIsY2xpcDoicmVjdCgwLCAwLCAwLCAwKSIsd2hpdGVTcGFjZToibm93cmFwIix3b3JkV3JhcDoibm9ybWFsIiwuLi5lLnN0eWxlfX0pKSk7dmFyIFRNPWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBkb2N1bWVudD4idSIpcmV0dXJuIG51bGw7dmFyIHQ9QXJyYXkuaXNBcnJheShlKT9lWzBdOmU7cmV0dXJuIHQub3duZXJEb2N1bWVudC5ib2R5fSx3bD1uZXcgV2Vha01hcCxFYz1uZXcgV2Vha01hcCxDYz17fSxWaD0wLHRrPWZ1bmN0aW9uKGUpe3JldHVybiBlJiYoZS5ob3N0fHx0ayhlLnBhcmVudE5vZGUpKX0sTk09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5tYXAoZnVuY3Rpb24obil7aWYoZS5jb250YWlucyhuKSlyZXR1cm4gbjt2YXIgcj10ayhuKTtyZXR1cm4gciYmZS5jb250YWlucyhyKT9yOihjb25zb2xlLmVycm9yKCJhcmlhLWhpZGRlbiIsbiwiaW4gbm90IGNvbnRhaW5lZCBpbnNpZGUiLGUsIi4gRG9pbmcgbm90aGluZyIpLG51bGwpfSkuZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiEhbn0pfSxSTT1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1OTSh0LEFycmF5LmlzQXJyYXkoZSk/ZTpbZV0pO0NjW25dfHwoQ2Nbbl09bmV3IFdlYWtNYXApO3ZhciBvPUNjW25dLGw9W10scz1uZXcgU2V0LGE9bmV3IFNldChpKSx1PWZ1bmN0aW9uKGQpeyFkfHxzLmhhcyhkKXx8KHMuYWRkKGQpLHUoZC5wYXJlbnROb2RlKSl9O2kuZm9yRWFjaCh1KTt2YXIgYz1mdW5jdGlvbihkKXshZHx8YS5oYXMoZCl8fEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZC5jaGlsZHJlbixmdW5jdGlvbihmKXtpZihzLmhhcyhmKSljKGYpO2Vsc2V7dmFyIGg9Zi5nZXRBdHRyaWJ1dGUociksbT1oIT09bnVsbCYmaCE9PSJmYWxzZSIsZz0od2wuZ2V0KGYpfHwwKSsxLFM9KG8uZ2V0KGYpfHwwKSsxO3dsLnNldChmLGcpLG8uc2V0KGYsUyksbC5wdXNoKGYpLGc9PT0xJiZtJiZFYy5zZXQoZiwhMCksUz09PTEmJmYuc2V0QXR0cmlidXRlKG4sInRydWUiKSxtfHxmLnNldEF0dHJpYnV0ZShyLCJ0cnVlIil9fSl9O3JldHVybiBjKHQpLHMuY2xlYXIoKSxWaCsrLGZ1bmN0aW9uKCl7bC5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBmPXdsLmdldChkKS0xLGg9by5nZXQoZCktMTt3bC5zZXQoZCxmKSxvLnNldChkLGgpLGZ8fChFYy5oYXMoZCl8fGQucmVtb3ZlQXR0cmlidXRlKHIpLEVjLmRlbGV0ZShkKSksaHx8ZC5yZW1vdmVBdHRyaWJ1dGUobil9KSxWaC0tLFZofHwod2w9bmV3IFdlYWtNYXAsd2w9bmV3IFdlYWtNYXAsRWM9bmV3IFdlYWtNYXAsQ2M9e30pfX0sT009ZnVuY3Rpb24oZSx0LG4pe249PT12b2lkIDAmJihuPSJkYXRhLWFyaWEtaGlkZGVuIik7dmFyIHI9QXJyYXkuZnJvbShBcnJheS5pc0FycmF5KGUpP2U6W2VdKSxpPXR8fFRNKGUpO3JldHVybiBpPyhyLnB1c2guYXBwbHkocixBcnJheS5mcm9tKGkucXVlcnlTZWxlY3RvckFsbCgiW2FyaWEtbGl2ZV0iKSkpLFJNKHIsaSxuLCJhcmlhLWhpZGRlbiIpKTpmdW5jdGlvbigpe3JldHVybiBudWxsfX0sRHI9ZnVuY3Rpb24oKXtyZXR1cm4gRHI9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBuLHI9MSxpPWFyZ3VtZW50cy5sZW5ndGg7cjxpO3IrKyl7bj1hcmd1bWVudHNbcl07Zm9yKHZhciBvIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sbykmJih0W29dPW5bb10pfXJldHVybiB0fSxEci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2Z1bmN0aW9uIG5rKGUsdCl7dmFyIG49e307Zm9yKHZhciByIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJnQuaW5kZXhPZihyKTwwJiYobltyXT1lW3JdKTtpZihlIT1udWxsJiZ0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz09ImZ1bmN0aW9uIilmb3IodmFyIGk9MCxyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7aTxyLmxlbmd0aDtpKyspdC5pbmRleE9mKHJbaV0pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLHJbaV0pJiYobltyW2ldXT1lW3JbaV1dKTtyZXR1cm4gbn1mdW5jdGlvbiBQTShlLHQsbil7aWYobnx8YXJndW1lbnRzLmxlbmd0aD09PTIpZm9yKHZhciByPTAsaT10Lmxlbmd0aCxvO3I8aTtyKyspKG98fCEociBpbiB0KSkmJihvfHwobz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0LDAscikpLG9bcl09dFtyXSk7cmV0dXJuIGUuY29uY2F0KG98fEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQpKX12YXIgWmM9InJpZ2h0LXNjcm9sbC1iYXItcG9zaXRpb24iLEdjPSJ3aWR0aC1iZWZvcmUtc2Nyb2xsLWJhciIsQU09IndpdGgtc2Nyb2xsLWJhcnMtaGlkZGVuIixNTT0iLS1yZW1vdmVkLWJvZHktc2Nyb2xsLWJhci1zaXplIjtmdW5jdGlvbiBETShlLHQpe3JldHVybiB0eXBlb2YgZT09ImZ1bmN0aW9uIj9lKHQpOmUmJihlLmN1cnJlbnQ9dCksZX1mdW5jdGlvbiBJTShlLHQpe3ZhciBuPXAudXNlU3RhdGUoZnVuY3Rpb24oKXtyZXR1cm57dmFsdWU6ZSxjYWxsYmFjazp0LGZhY2FkZTp7Z2V0IGN1cnJlbnQoKXtyZXR1cm4gbi52YWx1ZX0sc2V0IGN1cnJlbnQocil7dmFyIGk9bi52YWx1ZTtpIT09ciYmKG4udmFsdWU9cixuLmNhbGxiYWNrKHIsaSkpfX19fSlbMF07cmV0dXJuIG4uY2FsbGJhY2s9dCxuLmZhY2FkZX1mdW5jdGlvbiBMTShlLHQpe3JldHVybiBJTSh0fHxudWxsLGZ1bmN0aW9uKG4pe3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24ocil7cmV0dXJuIERNKHIsbil9KX0pfWZ1bmN0aW9uIGpNKGUpe3JldHVybiBlfWZ1bmN0aW9uIHpNKGUsdCl7dD09PXZvaWQgMCYmKHQ9ak0pO3ZhciBuPVtdLHI9ITEsaT17cmVhZDpmdW5jdGlvbigpe2lmKHIpdGhyb3cgbmV3IEVycm9yKCJTaWRlY2FyOiBjb3VsZCBub3QgYHJlYWRgIGZyb20gYW4gYGFzc2lnbmVkYCBtZWRpdW0uIGByZWFkYCBjb3VsZCBiZSB1c2VkIG9ubHkgd2l0aCBgdXNlTWVkaXVtYC4iKTtyZXR1cm4gbi5sZW5ndGg/bltuLmxlbmd0aC0xXTplfSx1c2VNZWRpdW06ZnVuY3Rpb24obyl7dmFyIGw9dChvLHIpO3JldHVybiBuLnB1c2gobCksZnVuY3Rpb24oKXtuPW4uZmlsdGVyKGZ1bmN0aW9uKHMpe3JldHVybiBzIT09bH0pfX0sYXNzaWduU3luY01lZGl1bTpmdW5jdGlvbihvKXtmb3Iocj0hMDtuLmxlbmd0aDspe3ZhciBsPW47bj1bXSxsLmZvckVhY2gobyl9bj17cHVzaDpmdW5jdGlvbihzKXtyZXR1cm4gbyhzKX0sZmlsdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIG59fX0sYXNzaWduTWVkaXVtOmZ1bmN0aW9uKG8pe3I9ITA7dmFyIGw9W107aWYobi5sZW5ndGgpe3ZhciBzPW47bj1bXSxzLmZvckVhY2gobyksbD1ufXZhciBhPWZ1bmN0aW9uKCl7dmFyIGM9bDtsPVtdLGMuZm9yRWFjaChvKX0sdT1mdW5jdGlvbigpe3JldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGEpfTt1KCksbj17cHVzaDpmdW5jdGlvbihjKXtsLnB1c2goYyksdSgpfSxmaWx0ZXI6ZnVuY3Rpb24oYyl7cmV0dXJuIGw9bC5maWx0ZXIoYyksbn19fX07cmV0dXJuIGl9ZnVuY3Rpb24gRk0oZSl7ZT09PXZvaWQgMCYmKGU9e30pO3ZhciB0PXpNKG51bGwpO3JldHVybiB0Lm9wdGlvbnM9RHIoe2FzeW5jOiEwLHNzcjohMX0sZSksdH12YXIgcms9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zaWRlQ2FyLG49bmsoZSxbInNpZGVDYXIiXSk7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJTaWRlY2FyOiBwbGVhc2UgcHJvdmlkZSBgc2lkZUNhcmAgcHJvcGVydHkgdG8gaW1wb3J0IHRoZSByaWdodCBjYXIiKTt2YXIgcj10LnJlYWQoKTtpZighcil0aHJvdyBuZXcgRXJyb3IoIlNpZGVjYXIgbWVkaXVtIG5vdCBmb3VuZCIpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocixEcih7fSxuKSl9O3JrLmlzU2lkZUNhckV4cG9ydD0hMDtmdW5jdGlvbiBCTShlLHQpe3JldHVybiBlLnVzZU1lZGl1bSh0KSxya312YXIgaWs9Rk0oKSxIaD1mdW5jdGlvbigpe30sQmY9cC5mb3J3YXJkUmVmKGZ1bmN0aW9uKGUsdCl7dmFyIG49cC51c2VSZWYobnVsbCkscj1wLnVzZVN0YXRlKHtvblNjcm9sbENhcHR1cmU6SGgsb25XaGVlbENhcHR1cmU6SGgsb25Ub3VjaE1vdmVDYXB0dXJlOkhofSksaT1yWzBdLG89clsxXSxsPWUuZm9yd2FyZFByb3BzLHM9ZS5jaGlsZHJlbixhPWUuY2xhc3NOYW1lLHU9ZS5yZW1vdmVTY3JvbGxCYXIsYz1lLmVuYWJsZWQsZD1lLnNoYXJkcyxmPWUuc2lkZUNhcixoPWUubm9Jc29sYXRpb24sbT1lLmluZXJ0LGc9ZS5hbGxvd1BpbmNoWm9vbSxTPWUuYXMsdj1TPT09dm9pZCAwPyJkaXYiOlMseT1uayhlLFsiZm9yd2FyZFByb3BzIiwiY2hpbGRyZW4iLCJjbGFzc05hbWUiLCJyZW1vdmVTY3JvbGxCYXIiLCJlbmFibGVkIiwic2hhcmRzIiwic2lkZUNhciIsIm5vSXNvbGF0aW9uIiwiaW5lcnQiLCJhbGxvd1BpbmNoWm9vbSIsImFzIl0pLF89Zix3PUxNKFtuLHRdKSxFPURyKERyKHt9LHkpLGkpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLGMmJnAuY3JlYXRlRWxlbWVudChfLHtzaWRlQ2FyOmlrLHJlbW92ZVNjcm9sbEJhcjp1LHNoYXJkczpkLG5vSXNvbGF0aW9uOmgsaW5lcnQ6bSxzZXRDYWxsYmFja3M6byxhbGxvd1BpbmNoWm9vbTohIWcsbG9ja1JlZjpufSksbD9wLmNsb25lRWxlbWVudChwLkNoaWxkcmVuLm9ubHkocyksRHIoRHIoe30sRSkse3JlZjp3fSkpOnAuY3JlYXRlRWxlbWVudCh2LERyKHt9LEUse2NsYXNzTmFtZTphLHJlZjp3fSkscykpfSk7QmYuZGVmYXVsdFByb3BzPXtlbmFibGVkOiEwLHJlbW92ZVNjcm9sbEJhcjohMCxpbmVydDohMX07QmYuY2xhc3NOYW1lcz17ZnVsbFdpZHRoOkdjLHplcm9SaWdodDpaY307dmFyIEt4LFVNPWZ1bmN0aW9uKCl7aWYoS3gpcmV0dXJuIEt4O2lmKHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXzwidSIpcmV0dXJuIF9fd2VicGFja19ub25jZV9ffTtmdW5jdGlvbiBXTSgpe2lmKCFkb2N1bWVudClyZXR1cm4gbnVsbDt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2UudHlwZT0idGV4dC9jc3MiO3ZhciB0PVVNKCk7cmV0dXJuIHQmJmUuc2V0QXR0cmlidXRlKCJub25jZSIsdCksZX1mdW5jdGlvbiBWTShlLHQpe2Uuc3R5bGVTaGVldD9lLnN0eWxlU2hlZXQuY3NzVGV4dD10OmUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodCkpfWZ1bmN0aW9uIEhNKGUpe3ZhciB0PWRvY3VtZW50LmhlYWR8fGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF07dC5hcHBlbmRDaGlsZChlKX12YXIgS009ZnVuY3Rpb24oKXt2YXIgZT0wLHQ9bnVsbDtyZXR1cm57YWRkOmZ1bmN0aW9uKG4pe2U9PTAmJih0PVdNKCkpJiYoVk0odCxuKSxITSh0KSksZSsrfSxyZW1vdmU6ZnVuY3Rpb24oKXtlLS0sIWUmJnQmJih0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGwpfX19LFpNPWZ1bmN0aW9uKCl7dmFyIGU9S00oKTtyZXR1cm4gZnVuY3Rpb24odCxuKXtwLnVzZUVmZmVjdChmdW5jdGlvbigpe3JldHVybiBlLmFkZCh0KSxmdW5jdGlvbigpe2UucmVtb3ZlKCl9fSxbdCYmbl0pfX0sb2s9ZnVuY3Rpb24oKXt2YXIgZT1aTSgpLHQ9ZnVuY3Rpb24obil7dmFyIHI9bi5zdHlsZXMsaT1uLmR5bmFtaWM7cmV0dXJuIGUocixpKSxudWxsfTtyZXR1cm4gdH0sR009e2xlZnQ6MCx0b3A6MCxyaWdodDowLGdhcDowfSxLaD1mdW5jdGlvbihlKXtyZXR1cm4gcGFyc2VJbnQoZXx8IiIsMTApfHwwfSxZTT1mdW5jdGlvbihlKXt2YXIgdD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KSxuPXRbZT09PSJwYWRkaW5nIj8icGFkZGluZ0xlZnQiOiJtYXJnaW5MZWZ0Il0scj10W2U9PT0icGFkZGluZyI/InBhZGRpbmdUb3AiOiJtYXJnaW5Ub3AiXSxpPXRbZT09PSJwYWRkaW5nIj8icGFkZGluZ1JpZ2h0IjoibWFyZ2luUmlnaHQiXTtyZXR1cm5bS2gobiksS2gociksS2goaSldfSxYTT1mdW5jdGlvbihlKXtpZihlPT09dm9pZCAwJiYoZT0ibWFyZ2luIiksdHlwZW9mIHdpbmRvdz4idSIpcmV0dXJuIEdNO3ZhciB0PVlNKGUpLG49ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLHI9d2luZG93LmlubmVyV2lkdGg7cmV0dXJue2xlZnQ6dFswXSx0b3A6dFsxXSxyaWdodDp0WzJdLGdhcDpNYXRoLm1heCgwLHItbit0WzJdLXRbMF0pfX0sUU09b2soKSxKTT1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1lLmxlZnQsbz1lLnRvcCxsPWUucmlnaHQscz1lLmdhcDtyZXR1cm4gbj09PXZvaWQgMCYmKG49Im1hcmdpbiIpLGAKICAuYC5jb25jYXQoQU0sYCB7CiAgIG92ZXJmbG93OiBoaWRkZW4gYCkuY29uY2F0KHIsYDsKICAgcGFkZGluZy1yaWdodDogYCkuY29uY2F0KHMsInB4ICIpLmNvbmNhdChyLGA7CiAgfQogIGJvZHkgewogICAgb3ZlcmZsb3c6IGhpZGRlbiBgKS5jb25jYXQocixgOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjsKICAgIGApLmNvbmNhdChbdCYmInBvc2l0aW9uOiByZWxhdGl2ZSAiLmNvbmNhdChyLCI7Iiksbj09PSJtYXJnaW4iJiZgCiAgICBwYWRkaW5nLWxlZnQ6IGAuY29uY2F0KGksYHB4OwogICAgcGFkZGluZy10b3A6IGApLmNvbmNhdChvLGBweDsKICAgIHBhZGRpbmctcmlnaHQ6IGApLmNvbmNhdChsLGBweDsKICAgIG1hcmdpbi1sZWZ0OjA7CiAgICBtYXJnaW4tdG9wOjA7CiAgICBtYXJnaW4tcmlnaHQ6IGApLmNvbmNhdChzLCJweCAiKS5jb25jYXQocixgOwogICAgYCksbj09PSJwYWRkaW5nIiYmInBhZGRpbmctcmlnaHQ6ICIuY29uY2F0KHMsInB4ICIpLmNvbmNhdChyLCI7IildLmZpbHRlcihCb29sZWFuKS5qb2luKCIiKSxgCiAgfQogIAogIC5gKS5jb25jYXQoWmMsYCB7CiAgICByaWdodDogYCkuY29uY2F0KHMsInB4ICIpLmNvbmNhdChyLGA7CiAgfQogIAogIC5gKS5jb25jYXQoR2MsYCB7CiAgICBtYXJnaW4tcmlnaHQ6IGApLmNvbmNhdChzLCJweCAiKS5jb25jYXQocixgOwogIH0KICAKICAuYCkuY29uY2F0KFpjLCIgLiIpLmNvbmNhdChaYyxgIHsKICAgIHJpZ2h0OiAwIGApLmNvbmNhdChyLGA7CiAgfQogIAogIC5gKS5jb25jYXQoR2MsIiAuIikuY29uY2F0KEdjLGAgewogICAgbWFyZ2luLXJpZ2h0OiAwIGApLmNvbmNhdChyLGA7CiAgfQogIAogIGJvZHkgewogICAgYCkuY29uY2F0KE1NLCI6ICIpLmNvbmNhdChzLGBweDsKICB9CmApfSxxTT1mdW5jdGlvbihlKXt2YXIgdD1lLm5vUmVsYXRpdmUsbj1lLm5vSW1wb3J0YW50LHI9ZS5nYXBNb2RlLGk9cj09PXZvaWQgMD8ibWFyZ2luIjpyLG89cC51c2VNZW1vKGZ1bmN0aW9uKCl7cmV0dXJuIFhNKGkpfSxbaV0pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoUU0se3N0eWxlczpKTShvLCF0LGksbj8iIjoiIWltcG9ydGFudCIpfSl9LFVtPSExO2lmKHR5cGVvZiB3aW5kb3c8InUiKXRyeXt2YXIga2M9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFVtPSEwLCEwfX0pO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0IixrYyxrYyksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRlc3QiLGtjLGtjKX1jYXRjaHtVbT0hMX12YXIgU2w9VW0/e3Bhc3NpdmU6ITF9OiExLGU0PWZ1bmN0aW9uKGUpe3JldHVybiBlLnRhZ05hbWU9PT0iVEVYVEFSRUEifSxsaz1mdW5jdGlvbihlLHQpe3ZhciBuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpO3JldHVybiBuW3RdIT09ImhpZGRlbiImJiEobi5vdmVyZmxvd1k9PT1uLm92ZXJmbG93WCYmIWU0KGUpJiZuW3RdPT09InZpc2libGUiKX0sdDQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGxrKGUsIm92ZXJmbG93WSIpfSxuND1mdW5jdGlvbihlKXtyZXR1cm4gbGsoZSwib3ZlcmZsb3dYIil9LFp4PWZ1bmN0aW9uKGUsdCl7dmFyIG49dDtkb3t0eXBlb2YgU2hhZG93Um9vdDwidSImJm4gaW5zdGFuY2VvZiBTaGFkb3dSb290JiYobj1uLmhvc3QpO3ZhciByPXNrKGUsbik7aWYocil7dmFyIGk9YWsoZSxuKSxvPWlbMV0sbD1pWzJdO2lmKG8+bClyZXR1cm4hMH1uPW4ucGFyZW50Tm9kZX13aGlsZShuJiZuIT09ZG9jdW1lbnQuYm9keSk7cmV0dXJuITF9LHI0PWZ1bmN0aW9uKGUpe3ZhciB0PWUuc2Nyb2xsVG9wLG49ZS5zY3JvbGxIZWlnaHQscj1lLmNsaWVudEhlaWdodDtyZXR1cm5bdCxuLHJdfSxpND1mdW5jdGlvbihlKXt2YXIgdD1lLnNjcm9sbExlZnQsbj1lLnNjcm9sbFdpZHRoLHI9ZS5jbGllbnRXaWR0aDtyZXR1cm5bdCxuLHJdfSxzaz1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09InYiP3Q0KHQpOm40KHQpfSxhaz1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09InYiP3I0KHQpOmk0KHQpfSxvND1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09ImgiJiZ0PT09InJ0bCI/LTE6MX0sbDQ9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz1vNChlLHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLmRpcmVjdGlvbiksbD1vKnIscz1uLnRhcmdldCxhPXQuY29udGFpbnMocyksdT0hMSxjPWw+MCxkPTAsZj0wO2Rve3ZhciBoPWFrKGUscyksbT1oWzBdLGc9aFsxXSxTPWhbMl0sdj1nLVMtbyptOyhtfHx2KSYmc2soZSxzKSYmKGQrPXYsZis9bSkscz1zLnBhcmVudE5vZGV9d2hpbGUoIWEmJnMhPT1kb2N1bWVudC5ib2R5fHxhJiYodC5jb250YWlucyhzKXx8dD09PXMpKTtyZXR1cm4oYyYmKGkmJmQ9PT0wfHwhaSYmbD5kKXx8IWMmJihpJiZmPT09MHx8IWkmJi1sPmYpKSYmKHU9ITApLHV9LCRjPWZ1bmN0aW9uKGUpe3JldHVybiJjaGFuZ2VkVG91Y2hlcyJpbiBlP1tlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFgsZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZXTpbMCwwXX0sR3g9ZnVuY3Rpb24oZSl7cmV0dXJuW2UuZGVsdGFYLGUuZGVsdGFZXX0sWXg9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJjdXJyZW50ImluIGU/ZS5jdXJyZW50OmV9LHM0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbMF09PT10WzBdJiZlWzFdPT09dFsxXX0sYTQ9ZnVuY3Rpb24oZSl7cmV0dXJuYAogIC5ibG9jay1pbnRlcmFjdGl2aXR5LWAuY29uY2F0KGUsYCB7cG9pbnRlci1ldmVudHM6IG5vbmU7fQogIC5hbGxvdy1pbnRlcmFjdGl2aXR5LWApLmNvbmNhdChlLGAge3BvaW50ZXItZXZlbnRzOiBhbGw7fQpgKX0sdTQ9MCxFbD1bXTtmdW5jdGlvbiBjNChlKXt2YXIgdD1wLnVzZVJlZihbXSksbj1wLnVzZVJlZihbMCwwXSkscj1wLnVzZVJlZigpLGk9cC51c2VTdGF0ZSh1NCsrKVswXSxvPXAudXNlU3RhdGUoZnVuY3Rpb24oKXtyZXR1cm4gb2soKX0pWzBdLGw9cC51c2VSZWYoZSk7cC51c2VFZmZlY3QoZnVuY3Rpb24oKXtsLmN1cnJlbnQ9ZX0sW2VdKSxwLnVzZUVmZmVjdChmdW5jdGlvbigpe2lmKGUuaW5lcnQpe2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiYmxvY2staW50ZXJhY3Rpdml0eS0iLmNvbmNhdChpKSk7dmFyIGc9UE0oW2UubG9ja1JlZi5jdXJyZW50XSwoZS5zaGFyZHN8fFtdKS5tYXAoWXgpLCEwKS5maWx0ZXIoQm9vbGVhbik7cmV0dXJuIGcuZm9yRWFjaChmdW5jdGlvbihTKXtyZXR1cm4gUy5jbGFzc0xpc3QuYWRkKCJhbGxvdy1pbnRlcmFjdGl2aXR5LSIuY29uY2F0KGkpKX0pLGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJibG9jay1pbnRlcmFjdGl2aXR5LSIuY29uY2F0KGkpKSxnLmZvckVhY2goZnVuY3Rpb24oUyl7cmV0dXJuIFMuY2xhc3NMaXN0LnJlbW92ZSgiYWxsb3ctaW50ZXJhY3Rpdml0eS0iLmNvbmNhdChpKSl9KX19fSxbZS5pbmVydCxlLmxvY2tSZWYuY3VycmVudCxlLnNoYXJkc10pO3ZhciBzPXAudXNlQ2FsbGJhY2soZnVuY3Rpb24oZyxTKXtpZigidG91Y2hlcyJpbiBnJiZnLnRvdWNoZXMubGVuZ3RoPT09MilyZXR1cm4hbC5jdXJyZW50LmFsbG93UGluY2hab29tO3ZhciB2PSRjKGcpLHk9bi5jdXJyZW50LF89ImRlbHRhWCJpbiBnP2cuZGVsdGFYOnlbMF0tdlswXSx3PSJkZWx0YVkiaW4gZz9nLmRlbHRhWTp5WzFdLXZbMV0sRSwkPWcudGFyZ2V0LEM9TWF0aC5hYnMoXyk+TWF0aC5hYnModyk/ImgiOiJ2IjtpZigidG91Y2hlcyJpbiBnJiZDPT09ImgiJiYkLnR5cGU9PT0icmFuZ2UiKXJldHVybiExO3ZhciBUPVp4KEMsJCk7aWYoIVQpcmV0dXJuITA7aWYoVD9FPUM6KEU9Qz09PSJ2Ij8iaCI6InYiLFQ9WngoQywkKSksIVQpcmV0dXJuITE7aWYoIXIuY3VycmVudCYmImNoYW5nZWRUb3VjaGVzImluIGcmJihffHx3KSYmKHIuY3VycmVudD1FKSwhRSlyZXR1cm4hMDt2YXIgTj1yLmN1cnJlbnR8fEU7cmV0dXJuIGw0KE4sUyxnLE49PT0iaCI/Xzp3LCEwKX0sW10pLGE9cC51c2VDYWxsYmFjayhmdW5jdGlvbihnKXt2YXIgUz1nO2lmKCEoIUVsLmxlbmd0aHx8RWxbRWwubGVuZ3RoLTFdIT09bykpe3ZhciB2PSJkZWx0YVkiaW4gUz9HeChTKTokYyhTKSx5PXQuY3VycmVudC5maWx0ZXIoZnVuY3Rpb24oRSl7cmV0dXJuIEUubmFtZT09PVMudHlwZSYmRS50YXJnZXQ9PT1TLnRhcmdldCYmczQoRS5kZWx0YSx2KX0pWzBdO2lmKHkmJnkuc2hvdWxkKXtTLmNhbmNlbGFibGUmJlMucHJldmVudERlZmF1bHQoKTtyZXR1cm59aWYoIXkpe3ZhciBfPShsLmN1cnJlbnQuc2hhcmRzfHxbXSkubWFwKFl4KS5maWx0ZXIoQm9vbGVhbikuZmlsdGVyKGZ1bmN0aW9uKEUpe3JldHVybiBFLmNvbnRhaW5zKFMudGFyZ2V0KX0pLHc9Xy5sZW5ndGg+MD9zKFMsX1swXSk6IWwuY3VycmVudC5ub0lzb2xhdGlvbjt3JiZTLmNhbmNlbGFibGUmJlMucHJldmVudERlZmF1bHQoKX19fSxbXSksdT1wLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGcsUyx2LHkpe3ZhciBfPXtuYW1lOmcsZGVsdGE6Uyx0YXJnZXQ6dixzaG91bGQ6eX07dC5jdXJyZW50LnB1c2goXyksc2V0VGltZW91dChmdW5jdGlvbigpe3QuY3VycmVudD10LmN1cnJlbnQuZmlsdGVyKGZ1bmN0aW9uKHcpe3JldHVybiB3IT09X30pfSwxKX0sW10pLGM9cC51c2VDYWxsYmFjayhmdW5jdGlvbihnKXtuLmN1cnJlbnQ9JGMoZyksci5jdXJyZW50PXZvaWQgMH0sW10pLGQ9cC51c2VDYWxsYmFjayhmdW5jdGlvbihnKXt1KGcudHlwZSxHeChnKSxnLnRhcmdldCxzKGcsZS5sb2NrUmVmLmN1cnJlbnQpKX0sW10pLGY9cC51c2VDYWxsYmFjayhmdW5jdGlvbihnKXt1KGcudHlwZSwkYyhnKSxnLnRhcmdldCxzKGcsZS5sb2NrUmVmLmN1cnJlbnQpKX0sW10pO3AudXNlRWZmZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIEVsLnB1c2gobyksZS5zZXRDYWxsYmFja3Moe29uU2Nyb2xsQ2FwdHVyZTpkLG9uV2hlZWxDYXB0dXJlOmQsb25Ub3VjaE1vdmVDYXB0dXJlOmZ9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsYSxTbCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixhLFNsKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixjLFNsKSxmdW5jdGlvbigpe0VsPUVsLmZpbHRlcihmdW5jdGlvbihnKXtyZXR1cm4gZyE9PW99KSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ3aGVlbCIsYSxTbCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixhLFNsKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixjLFNsKX19LFtdKTt2YXIgaD1lLnJlbW92ZVNjcm9sbEJhcixtPWUuaW5lcnQ7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwsbT9wLmNyZWF0ZUVsZW1lbnQobyx7c3R5bGVzOmE0KGkpfSk6bnVsbCxoP3AuY3JlYXRlRWxlbWVudChxTSx7Z2FwTW9kZToibWFyZ2luIn0pOm51bGwpfWNvbnN0IGQ0PUJNKGlrLGM0KTt2YXIgdWs9cC5mb3J3YXJkUmVmKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChCZixEcih7fSxlLHtyZWY6dCxzaWRlQ2FyOmQ0fSkpfSk7dWsuY2xhc3NOYW1lcz1CZi5jbGFzc05hbWVzO2NvbnN0IGY0PXVrLGg0PVsiICIsIkVudGVyIiwiQXJyb3dVcCIsIkFycm93RG93biJdLHA0PVsiICIsIkVudGVyIl0sVWY9IlNlbGVjdCIsW1dmLEh2LG00XT1EQyhVZiksW0lzLE5MXT1vbChVZixbbTQsWENdKSxLdj1YQygpLFtnNCxjbF09SXMoVWYpLFt2NCx5NF09SXMoVWYpLHg0PWU9Pntjb25zdHtfX3Njb3BlU2VsZWN0OnQsY2hpbGRyZW46bixvcGVuOnIsZGVmYXVsdE9wZW46aSxvbk9wZW5DaGFuZ2U6byx2YWx1ZTpsLGRlZmF1bHRWYWx1ZTpzLG9uVmFsdWVDaGFuZ2U6YSxkaXI6dSxuYW1lOmMsYXV0b0NvbXBsZXRlOmQsZGlzYWJsZWQ6ZixyZXF1aXJlZDpofT1lLG09S3YodCksW2csU109cC51c2VTdGF0ZShudWxsKSxbdix5XT1wLnVzZVN0YXRlKG51bGwpLFtfLHddPXAudXNlU3RhdGUoITEpLEU9R2codSksWyQ9ITEsQ109Z3Moe3Byb3A6cixkZWZhdWx0UHJvcDppLG9uQ2hhbmdlOm99KSxbVCxOXT1ncyh7cHJvcDpsLGRlZmF1bHRQcm9wOnMsb25DaGFuZ2U6YX0pLFI9cC51c2VSZWYobnVsbCksRD1nPyEhZy5jbG9zZXN0KCJmb3JtIik6ITAsW0Ysc2VdPXAudXNlU3RhdGUobmV3IFNldCksVj1BcnJheS5mcm9tKEYpLm1hcChLPT5LLnByb3BzLnZhbHVlKS5qb2luKCI7Iik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChTTSxtLHAuY3JlYXRlRWxlbWVudChnNCx7cmVxdWlyZWQ6aCxzY29wZTp0LHRyaWdnZXI6ZyxvblRyaWdnZXJDaGFuZ2U6Uyx2YWx1ZU5vZGU6dixvblZhbHVlTm9kZUNoYW5nZTp5LHZhbHVlTm9kZUhhc0NoaWxkcmVuOl8sb25WYWx1ZU5vZGVIYXNDaGlsZHJlbkNoYW5nZTp3LGNvbnRlbnRJZDpqZigpLHZhbHVlOlQsb25WYWx1ZUNoYW5nZTpOLG9wZW46JCxvbk9wZW5DaGFuZ2U6QyxkaXI6RSx0cmlnZ2VyUG9pbnRlckRvd25Qb3NSZWY6UixkaXNhYmxlZDpmfSxwLmNyZWF0ZUVsZW1lbnQoV2YuUHJvdmlkZXIse3Njb3BlOnR9LHAuY3JlYXRlRWxlbWVudCh2NCx7c2NvcGU6ZS5fX3Njb3BlU2VsZWN0LG9uTmF0aXZlT3B0aW9uQWRkOnAudXNlQ2FsbGJhY2soSz0+e3NlKE89Pm5ldyBTZXQoTykuYWRkKEspKX0sW10pLG9uTmF0aXZlT3B0aW9uUmVtb3ZlOnAudXNlQ2FsbGJhY2soSz0+e3NlKE89Pntjb25zdCBBPW5ldyBTZXQoTyk7cmV0dXJuIEEuZGVsZXRlKEspLEF9KX0sW10pfSxuKSksRD9wLmNyZWF0ZUVsZW1lbnQoaGsse2tleTpWLCJhcmlhLWhpZGRlbiI6ITAscmVxdWlyZWQ6aCx0YWJJbmRleDotMSxuYW1lOmMsYXV0b0NvbXBsZXRlOmQsdmFsdWU6VCxvbkNoYW5nZTpLPT5OKEsudGFyZ2V0LnZhbHVlKSxkaXNhYmxlZDpmfSxUPT09dm9pZCAwP3AuY3JlYXRlRWxlbWVudCgib3B0aW9uIix7dmFsdWU6IiJ9KTpudWxsLEFycmF5LmZyb20oRikpOm51bGwpKX0sXzQ9IlNlbGVjdFRyaWdnZXIiLHc0PXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6bixkaXNhYmxlZDpyPSExLC4uLml9PWUsbz1LdihuKSxsPWNsKF80LG4pLHM9bC5kaXNhYmxlZHx8cixhPXN0KHQsbC5vblRyaWdnZXJDaGFuZ2UpLHU9SHYobiksW2MsZCxmXT1wayhtPT57Y29uc3QgZz11KCkuZmlsdGVyKHk9PiF5LmRpc2FibGVkKSxTPWcuZmluZCh5PT55LnZhbHVlPT09bC52YWx1ZSksdj1tayhnLG0sUyk7diE9PXZvaWQgMCYmbC5vblZhbHVlQ2hhbmdlKHYudmFsdWUpfSksaD0oKT0+e3N8fChsLm9uT3BlbkNoYW5nZSghMCksZigpKX07cmV0dXJuIHAuY3JlYXRlRWxlbWVudChFTSxpZSh7YXNDaGlsZDohMH0sbykscC5jcmVhdGVFbGVtZW50KEtlLmJ1dHRvbixpZSh7dHlwZToiYnV0dG9uIixyb2xlOiJjb21ib2JveCIsImFyaWEtY29udHJvbHMiOmwuY29udGVudElkLCJhcmlhLWV4cGFuZGVkIjpsLm9wZW4sImFyaWEtcmVxdWlyZWQiOmwucmVxdWlyZWQsImFyaWEtYXV0b2NvbXBsZXRlIjoibm9uZSIsZGlyOmwuZGlyLCJkYXRhLXN0YXRlIjpsLm9wZW4/Im9wZW4iOiJjbG9zZWQiLGRpc2FibGVkOnMsImRhdGEtZGlzYWJsZWQiOnM/IiI6dm9pZCAwLCJkYXRhLXBsYWNlaG9sZGVyIjpmayhsLnZhbHVlKT8iIjp2b2lkIDB9LGkse3JlZjphLG9uQ2xpY2s6bnQoaS5vbkNsaWNrLG09PnttLmN1cnJlbnRUYXJnZXQuZm9jdXMoKX0pLG9uUG9pbnRlckRvd246bnQoaS5vblBvaW50ZXJEb3duLG09Pntjb25zdCBnPW0udGFyZ2V0O2cuaGFzUG9pbnRlckNhcHR1cmUobS5wb2ludGVySWQpJiZnLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShtLnBvaW50ZXJJZCksbS5idXR0b249PT0wJiZtLmN0cmxLZXk9PT0hMSYmKGgoKSxsLnRyaWdnZXJQb2ludGVyRG93blBvc1JlZi5jdXJyZW50PXt4Ok1hdGgucm91bmQobS5wYWdlWCkseTpNYXRoLnJvdW5kKG0ucGFnZVkpfSxtLnByZXZlbnREZWZhdWx0KCkpfSksb25LZXlEb3duOm50KGkub25LZXlEb3duLG09Pntjb25zdCBnPWMuY3VycmVudCE9PSIiOyEobS5jdHJsS2V5fHxtLmFsdEtleXx8bS5tZXRhS2V5KSYmbS5rZXkubGVuZ3RoPT09MSYmZChtLmtleSksIShnJiZtLmtleT09PSIgIikmJmg0LmluY2x1ZGVzKG0ua2V5KSYmKGgoKSxtLnByZXZlbnREZWZhdWx0KCkpfSl9KSkpfSksUzQ9IlNlbGVjdFZhbHVlIixFND1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sY2xhc3NOYW1lOnIsc3R5bGU6aSxjaGlsZHJlbjpvLHBsYWNlaG9sZGVyOmw9IiIsLi4uc309ZSxhPWNsKFM0LG4pLHtvblZhbHVlTm9kZUhhc0NoaWxkcmVuQ2hhbmdlOnV9PWEsYz1vIT09dm9pZCAwLGQ9c3QodCxhLm9uVmFsdWVOb2RlQ2hhbmdlKTtyZXR1cm4gVW4oKCk9Pnt1KGMpfSxbdSxjXSkscC5jcmVhdGVFbGVtZW50KEtlLnNwYW4saWUoe30scyx7cmVmOmQsc3R5bGU6e3BvaW50ZXJFdmVudHM6Im5vbmUifX0pLGZrKGEudmFsdWUpP3AuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwsbCk6byl9KSxDND1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sY2hpbGRyZW46ciwuLi5pfT1lO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoS2Uuc3BhbixpZSh7ImFyaWEtaGlkZGVuIjohMH0saSx7cmVmOnR9KSxyfHwi4pa8Iil9KSxrND1lPT5wLmNyZWF0ZUVsZW1lbnQoa00saWUoe2FzQ2hpbGQ6ITB9LGUpKSx2cz0iU2VsZWN0Q29udGVudCIsJDQ9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3Qgbj1jbCh2cyxlLl9fc2NvcGVTZWxlY3QpLFtyLGldPXAudXNlU3RhdGUoKTtpZihVbigoKT0+e2kobmV3IERvY3VtZW50RnJhZ21lbnQpfSxbXSksIW4ub3Blbil7Y29uc3Qgbz1yO3JldHVybiBvP0dyLmNyZWF0ZVBvcnRhbChwLmNyZWF0ZUVsZW1lbnQoY2sse3Njb3BlOmUuX19zY29wZVNlbGVjdH0scC5jcmVhdGVFbGVtZW50KFdmLlNsb3Qse3Njb3BlOmUuX19zY29wZVNlbGVjdH0scC5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsZS5jaGlsZHJlbikpKSxvKTpudWxsfXJldHVybiBwLmNyZWF0ZUVsZW1lbnQoYjQsaWUoe30sZSx7cmVmOnR9KSl9KSxyaT0xMCxbY2ssVmZdPUlzKHZzKSxiND1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4scG9zaXRpb246cj0iaXRlbS1hbGlnbmVkIixvbkNsb3NlQXV0b0ZvY3VzOmksb25Fc2NhcGVLZXlEb3duOm8sb25Qb2ludGVyRG93bk91dHNpZGU6bCxzaWRlOnMsc2lkZU9mZnNldDphLGFsaWduOnUsYWxpZ25PZmZzZXQ6YyxhcnJvd1BhZGRpbmc6ZCxjb2xsaXNpb25Cb3VuZGFyeTpmLGNvbGxpc2lvblBhZGRpbmc6aCxzdGlja3k6bSxoaWRlV2hlbkRldGFjaGVkOmcsYXZvaWRDb2xsaXNpb25zOlMsLi4udn09ZSx5PWNsKHZzLG4pLFtfLHddPXAudXNlU3RhdGUobnVsbCksW0UsJF09cC51c2VTdGF0ZShudWxsKSxDPXN0KHQsdGU9PncodGUpKSxbVCxOXT1wLnVzZVN0YXRlKG51bGwpLFtSLERdPXAudXNlU3RhdGUobnVsbCksRj1IdihuKSxbc2UsVl09cC51c2VTdGF0ZSghMSksSz1wLnVzZVJlZighMSk7cC51c2VFZmZlY3QoKCk9PntpZihfKXJldHVybiBPTShfKX0sW19dKSx3MygpO2NvbnN0IE89cC51c2VDYWxsYmFjayh0ZT0+e2NvbnN0W0xlLC4uLmJlXT1GKCkubWFwKERlPT5EZS5yZWYuY3VycmVudCksW1JlXT1iZS5zbGljZSgtMSksU2U9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtmb3IoY29uc3QgRGUgb2YgdGUpaWYoRGU9PT1TZXx8KERlPT1udWxsfHxEZS5zY3JvbGxJbnRvVmlldyh7YmxvY2s6Im5lYXJlc3QifSksRGU9PT1MZSYmRSYmKEUuc2Nyb2xsVG9wPTApLERlPT09UmUmJkUmJihFLnNjcm9sbFRvcD1FLnNjcm9sbEhlaWdodCksRGU9PW51bGx8fERlLmZvY3VzKCksZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PVNlKSlyZXR1cm59LFtGLEVdKSxBPXAudXNlQ2FsbGJhY2soKCk9Pk8oW1QsX10pLFtPLFQsX10pO3AudXNlRWZmZWN0KCgpPT57c2UmJkEoKX0sW3NlLEFdKTtjb25zdHtvbk9wZW5DaGFuZ2U6ayx0cmlnZ2VyUG9pbnRlckRvd25Qb3NSZWY6an09eTtwLnVzZUVmZmVjdCgoKT0+e2lmKF8pe2xldCB0ZT17eDowLHk6MH07Y29uc3QgTGU9UmU9Pnt2YXIgU2UsRGUsUWUsV3Q7dGU9e3g6TWF0aC5hYnMoTWF0aC5yb3VuZChSZS5wYWdlWCktKChTZT0oRGU9ai5jdXJyZW50KT09PW51bGx8fERlPT09dm9pZCAwP3ZvaWQgMDpEZS54KSE9PW51bGwmJlNlIT09dm9pZCAwP1NlOjApKSx5Ok1hdGguYWJzKE1hdGgucm91bmQoUmUucGFnZVkpLSgoUWU9KFd0PWouY3VycmVudCk9PT1udWxsfHxXdD09PXZvaWQgMD92b2lkIDA6V3QueSkhPT1udWxsJiZRZSE9PXZvaWQgMD9RZTowKSl9fSxiZT1SZT0+e3RlLng8PTEwJiZ0ZS55PD0xMD9SZS5wcmV2ZW50RGVmYXVsdCgpOl8uY29udGFpbnMoUmUudGFyZ2V0KXx8ayghMSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLExlKSxqLmN1cnJlbnQ9bnVsbH07cmV0dXJuIGouY3VycmVudCE9PW51bGwmJihkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsTGUpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsYmUse2NhcHR1cmU6ITAsb25jZTohMH0pKSwoKT0+e2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIixMZSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIixiZSx7Y2FwdHVyZTohMH0pfX19LFtfLGssal0pLHAudXNlRWZmZWN0KCgpPT57Y29uc3QgdGU9KCk9PmsoITEpO3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsdGUpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRlKSwoKT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJibHVyIix0ZSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdGUpfX0sW2tdKTtjb25zdFtMLFpdPXBrKHRlPT57Y29uc3QgTGU9RigpLmZpbHRlcihTZT0+IVNlLmRpc2FibGVkKSxiZT1MZS5maW5kKFNlPT5TZS5yZWYuY3VycmVudD09PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLFJlPW1rKExlLHRlLGJlKTtSZSYmc2V0VGltZW91dCgoKT0+UmUucmVmLmN1cnJlbnQuZm9jdXMoKSl9KSxuZT1wLnVzZUNhbGxiYWNrKCh0ZSxMZSxiZSk9Pntjb25zdCBSZT0hSy5jdXJyZW50JiYhYmU7KHkudmFsdWUhPT12b2lkIDAmJnkudmFsdWU9PT1MZXx8UmUpJiYoTih0ZSksUmUmJihLLmN1cnJlbnQ9ITApKX0sW3kudmFsdWVdKSxrZT1wLnVzZUNhbGxiYWNrKCgpPT5fPT1udWxsP3ZvaWQgMDpfLmZvY3VzKCksW19dKSx2ZT1wLnVzZUNhbGxiYWNrKCh0ZSxMZSxiZSk9Pntjb25zdCBSZT0hSy5jdXJyZW50JiYhYmU7KHkudmFsdWUhPT12b2lkIDAmJnkudmFsdWU9PT1MZXx8UmUpJiZEKHRlKX0sW3kudmFsdWVdKSxXZT1yPT09InBvcHBlciI/WHg6VDQsRmU9V2U9PT1YeD97c2lkZTpzLHNpZGVPZmZzZXQ6YSxhbGlnbjp1LGFsaWduT2Zmc2V0OmMsYXJyb3dQYWRkaW5nOmQsY29sbGlzaW9uQm91bmRhcnk6Zixjb2xsaXNpb25QYWRkaW5nOmgsc3RpY2t5Om0saGlkZVdoZW5EZXRhY2hlZDpnLGF2b2lkQ29sbGlzaW9uczpTfTp7fTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KGNrLHtzY29wZTpuLGNvbnRlbnQ6Xyx2aWV3cG9ydDpFLG9uVmlld3BvcnRDaGFuZ2U6JCxpdGVtUmVmQ2FsbGJhY2s6bmUsc2VsZWN0ZWRJdGVtOlQsb25JdGVtTGVhdmU6a2UsaXRlbVRleHRSZWZDYWxsYmFjazp2ZSxmb2N1c1NlbGVjdGVkSXRlbTpBLHNlbGVjdGVkSXRlbVRleHQ6Uixwb3NpdGlvbjpyLGlzUG9zaXRpb25lZDpzZSxzZWFyY2hSZWY6TH0scC5jcmVhdGVFbGVtZW50KGY0LHthcyxhbGxvd1BpbmNoWm9vbTohMH0scC5jcmVhdGVFbGVtZW50KFMzLHthc0NoaWxkOiEwLHRyYXBwZWQ6eS5vcGVuLG9uTW91bnRBdXRvRm9jdXM6dGU9Pnt0ZS5wcmV2ZW50RGVmYXVsdCgpfSxvblVubW91bnRBdXRvRm9jdXM6bnQoaSx0ZT0+e3ZhciBMZTsoTGU9eS50cmlnZ2VyKT09PW51bGx8fExlPT09dm9pZCAwfHxMZS5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pLHRlLnByZXZlbnREZWZhdWx0KCl9KX0scC5jcmVhdGVFbGVtZW50KHkzLHthc0NoaWxkOiEwLGRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50czohMCxvbkVzY2FwZUtleURvd246byxvblBvaW50ZXJEb3duT3V0c2lkZTpsLG9uRm9jdXNPdXRzaWRlOnRlPT50ZS5wcmV2ZW50RGVmYXVsdCgpLG9uRGlzbWlzczooKT0+eS5vbk9wZW5DaGFuZ2UoITEpfSxwLmNyZWF0ZUVsZW1lbnQoV2UsaWUoe3JvbGU6Imxpc3Rib3giLGlkOnkuY29udGVudElkLCJkYXRhLXN0YXRlIjp5Lm9wZW4/Im9wZW4iOiJjbG9zZWQiLGRpcjp5LmRpcixvbkNvbnRleHRNZW51OnRlPT50ZS5wcmV2ZW50RGVmYXVsdCgpfSx2LEZlLHtvblBsYWNlZDooKT0+VighMCkscmVmOkMsc3R5bGU6e2Rpc3BsYXk6ImZsZXgiLGZsZXhEaXJlY3Rpb246ImNvbHVtbiIsb3V0bGluZToibm9uZSIsLi4udi5zdHlsZX0sb25LZXlEb3duOm50KHYub25LZXlEb3duLHRlPT57Y29uc3QgTGU9dGUuY3RybEtleXx8dGUuYWx0S2V5fHx0ZS5tZXRhS2V5O2lmKHRlLmtleT09PSJUYWIiJiZ0ZS5wcmV2ZW50RGVmYXVsdCgpLCFMZSYmdGUua2V5Lmxlbmd0aD09PTEmJloodGUua2V5KSxbIkFycm93VXAiLCJBcnJvd0Rvd24iLCJIb21lIiwiRW5kIl0uaW5jbHVkZXModGUua2V5KSl7bGV0IFJlPUYoKS5maWx0ZXIoU2U9PiFTZS5kaXNhYmxlZCkubWFwKFNlPT5TZS5yZWYuY3VycmVudCk7aWYoWyJBcnJvd1VwIiwiRW5kIl0uaW5jbHVkZXModGUua2V5KSYmKFJlPVJlLnNsaWNlKCkucmV2ZXJzZSgpKSxbIkFycm93VXAiLCJBcnJvd0Rvd24iXS5pbmNsdWRlcyh0ZS5rZXkpKXtjb25zdCBTZT10ZS50YXJnZXQsRGU9UmUuaW5kZXhPZihTZSk7UmU9UmUuc2xpY2UoRGUrMSl9c2V0VGltZW91dCgoKT0+TyhSZSkpLHRlLnByZXZlbnREZWZhdWx0KCl9fSl9KSkpKSkpfSksVDQ9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLG9uUGxhY2VkOnIsLi4uaX09ZSxvPWNsKHZzLG4pLGw9VmYodnMsbiksW3MsYV09cC51c2VTdGF0ZShudWxsKSxbdSxjXT1wLnVzZVN0YXRlKG51bGwpLGQ9c3QodCxDPT5jKEMpKSxmPUh2KG4pLGg9cC51c2VSZWYoITEpLG09cC51c2VSZWYoITApLHt2aWV3cG9ydDpnLHNlbGVjdGVkSXRlbTpTLHNlbGVjdGVkSXRlbVRleHQ6dixmb2N1c1NlbGVjdGVkSXRlbTp5fT1sLF89cC51c2VDYWxsYmFjaygoKT0+e2lmKG8udHJpZ2dlciYmby52YWx1ZU5vZGUmJnMmJnUmJmcmJlMmJnYpe2NvbnN0IEM9by50cmlnZ2VyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFQ9dS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxOPW8udmFsdWVOb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFI9di5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihvLmRpciE9PSJydGwiKXtjb25zdCBTZT1SLmxlZnQtVC5sZWZ0LERlPU4ubGVmdC1TZSxRZT1DLmxlZnQtRGUsV3Q9Qy53aWR0aCtRZSxTbj1NYXRoLm1heChXdCxULndpZHRoKSx1cj13aW5kb3cuaW5uZXJXaWR0aC1yaSxqZT1ZcChEZSxbcmksdXItU25dKTtzLnN0eWxlLm1pbldpZHRoPVd0KyJweCIscy5zdHlsZS5sZWZ0PWplKyJweCJ9ZWxzZXtjb25zdCBTZT1ULnJpZ2h0LVIucmlnaHQsRGU9d2luZG93LmlubmVyV2lkdGgtTi5yaWdodC1TZSxRZT13aW5kb3cuaW5uZXJXaWR0aC1DLnJpZ2h0LURlLFd0PUMud2lkdGgrUWUsU249TWF0aC5tYXgoV3QsVC53aWR0aCksdXI9d2luZG93LmlubmVyV2lkdGgtcmksamU9WXAoRGUsW3JpLHVyLVNuXSk7cy5zdHlsZS5taW5XaWR0aD1XdCsicHgiLHMuc3R5bGUucmlnaHQ9amUrInB4In1jb25zdCBEPWYoKSxGPXdpbmRvdy5pbm5lckhlaWdodC1yaSoyLHNlPWcuc2Nyb2xsSGVpZ2h0LFY9d2luZG93LmdldENvbXB1dGVkU3R5bGUodSksSz1wYXJzZUludChWLmJvcmRlclRvcFdpZHRoLDEwKSxPPXBhcnNlSW50KFYucGFkZGluZ1RvcCwxMCksQT1wYXJzZUludChWLmJvcmRlckJvdHRvbVdpZHRoLDEwKSxrPXBhcnNlSW50KFYucGFkZGluZ0JvdHRvbSwxMCksaj1LK08rc2UraytBLEw9TWF0aC5taW4oUy5vZmZzZXRIZWlnaHQqNSxqKSxaPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGcpLG5lPXBhcnNlSW50KFoucGFkZGluZ1RvcCwxMCksa2U9cGFyc2VJbnQoWi5wYWRkaW5nQm90dG9tLDEwKSx2ZT1DLnRvcCtDLmhlaWdodC8yLXJpLFdlPUYtdmUsRmU9Uy5vZmZzZXRIZWlnaHQvMix0ZT1TLm9mZnNldFRvcCtGZSxMZT1LK08rdGUsYmU9ai1MZTtpZihMZTw9dmUpe2NvbnN0IFNlPVM9PT1EW0QubGVuZ3RoLTFdLnJlZi5jdXJyZW50O3Muc3R5bGUuYm90dG9tPSIwcHgiO2NvbnN0IERlPXUuY2xpZW50SGVpZ2h0LWcub2Zmc2V0VG9wLWcub2Zmc2V0SGVpZ2h0LFFlPU1hdGgubWF4KFdlLEZlKyhTZT9rZTowKStEZStBKSxXdD1MZStRZTtzLnN0eWxlLmhlaWdodD1XdCsicHgifWVsc2V7Y29uc3QgU2U9Uz09PURbMF0ucmVmLmN1cnJlbnQ7cy5zdHlsZS50b3A9IjBweCI7Y29uc3QgUWU9TWF0aC5tYXgodmUsSytnLm9mZnNldFRvcCsoU2U/bmU6MCkrRmUpK2JlO3Muc3R5bGUuaGVpZ2h0PVFlKyJweCIsZy5zY3JvbGxUb3A9TGUtdmUrZy5vZmZzZXRUb3B9cy5zdHlsZS5tYXJnaW49YCR7cml9cHggMGAscy5zdHlsZS5taW5IZWlnaHQ9TCsicHgiLHMuc3R5bGUubWF4SGVpZ2h0PUYrInB4IixyPT1udWxsfHxyKCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT5oLmN1cnJlbnQ9ITApfX0sW2Ysby50cmlnZ2VyLG8udmFsdWVOb2RlLHMsdSxnLFMsdixvLmRpcixyXSk7VW4oKCk9Pl8oKSxbX10pO2NvbnN0W3csRV09cC51c2VTdGF0ZSgpO1VuKCgpPT57dSYmRSh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh1KS56SW5kZXgpfSxbdV0pO2NvbnN0ICQ9cC51c2VDYWxsYmFjayhDPT57QyYmbS5jdXJyZW50PT09ITAmJihfKCkseT09bnVsbHx8eSgpLG0uY3VycmVudD0hMSl9LFtfLHldKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KE40LHtzY29wZTpuLGNvbnRlbnRXcmFwcGVyOnMsc2hvdWxkRXhwYW5kT25TY3JvbGxSZWY6aCxvblNjcm9sbEJ1dHRvbkNoYW5nZTokfSxwLmNyZWF0ZUVsZW1lbnQoImRpdiIse3JlZjphLHN0eWxlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLHBvc2l0aW9uOiJmaXhlZCIsekluZGV4Ond9fSxwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHt9LGkse3JlZjpkLHN0eWxlOntib3hTaXppbmc6ImJvcmRlci1ib3giLG1heEhlaWdodDoiMTAwJSIsLi4uaS5zdHlsZX19KSkpKX0pLFh4PXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6bixhbGlnbjpyPSJzdGFydCIsY29sbGlzaW9uUGFkZGluZzppPXJpLC4uLm99PWUsbD1LdihuKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KENNLGllKHt9LGwsbyx7cmVmOnQsYWxpZ246cixjb2xsaXNpb25QYWRkaW5nOmksc3R5bGU6e2JveFNpemluZzoiYm9yZGVyLWJveCIsLi4uby5zdHlsZSwiLS1yYWRpeC1zZWxlY3QtY29udGVudC10cmFuc2Zvcm0tb3JpZ2luIjoidmFyKC0tcmFkaXgtcG9wcGVyLXRyYW5zZm9ybS1vcmlnaW4pIiwiLS1yYWRpeC1zZWxlY3QtY29udGVudC1hdmFpbGFibGUtd2lkdGgiOiJ2YXIoLS1yYWRpeC1wb3BwZXItYXZhaWxhYmxlLXdpZHRoKSIsIi0tcmFkaXgtc2VsZWN0LWNvbnRlbnQtYXZhaWxhYmxlLWhlaWdodCI6InZhcigtLXJhZGl4LXBvcHBlci1hdmFpbGFibGUtaGVpZ2h0KSIsIi0tcmFkaXgtc2VsZWN0LXRyaWdnZXItd2lkdGgiOiJ2YXIoLS1yYWRpeC1wb3BwZXItYW5jaG9yLXdpZHRoKSIsIi0tcmFkaXgtc2VsZWN0LXRyaWdnZXItaGVpZ2h0IjoidmFyKC0tcmFkaXgtcG9wcGVyLWFuY2hvci1oZWlnaHQpIn19KSl9KSxbTjQsUjRdPUlzKHZzLHt9KSxReD0iU2VsZWN0Vmlld3BvcnQiLE80PXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6biwuLi5yfT1lLGk9VmYoUXgsbiksbz1SNChReCxuKSxsPXN0KHQsaS5vblZpZXdwb3J0Q2hhbmdlKSxzPXAudXNlUmVmKDApO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLHAuY3JlYXRlRWxlbWVudCgic3R5bGUiLHtkYW5nZXJvdXNseVNldElubmVySFRNTDp7X19odG1sOiJbZGF0YS1yYWRpeC1zZWxlY3Qtdmlld3BvcnRde3Njcm9sbGJhci13aWR0aDpub25lOy1tcy1vdmVyZmxvdy1zdHlsZTpub25lOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNoO31bZGF0YS1yYWRpeC1zZWxlY3Qtdmlld3BvcnRdOjotd2Via2l0LXNjcm9sbGJhcntkaXNwbGF5Om5vbmV9In19KSxwLmNyZWF0ZUVsZW1lbnQoV2YuU2xvdCx7c2NvcGU6bn0scC5jcmVhdGVFbGVtZW50KEtlLmRpdixpZSh7ImRhdGEtcmFkaXgtc2VsZWN0LXZpZXdwb3J0IjoiIixyb2xlOiJwcmVzZW50YXRpb24ifSxyLHtyZWY6bCxzdHlsZTp7cG9zaXRpb246InJlbGF0aXZlIixmbGV4OjEsb3ZlcmZsb3c6ImF1dG8iLC4uLnIuc3R5bGV9LG9uU2Nyb2xsOm50KHIub25TY3JvbGwsYT0+e2NvbnN0IHU9YS5jdXJyZW50VGFyZ2V0LHtjb250ZW50V3JhcHBlcjpjLHNob3VsZEV4cGFuZE9uU2Nyb2xsUmVmOmR9PW87aWYoZCE9bnVsbCYmZC5jdXJyZW50JiZjKXtjb25zdCBmPU1hdGguYWJzKHMuY3VycmVudC11LnNjcm9sbFRvcCk7aWYoZj4wKXtjb25zdCBoPXdpbmRvdy5pbm5lckhlaWdodC1yaSoyLG09cGFyc2VGbG9hdChjLnN0eWxlLm1pbkhlaWdodCksZz1wYXJzZUZsb2F0KGMuc3R5bGUuaGVpZ2h0KSxTPU1hdGgubWF4KG0sZyk7aWYoUzxoKXtjb25zdCB2PVMrZix5PU1hdGgubWluKGgsdiksXz12LXk7Yy5zdHlsZS5oZWlnaHQ9eSsicHgiLGMuc3R5bGUuYm90dG9tPT09IjBweCImJih1LnNjcm9sbFRvcD1fPjA/XzowLGMuc3R5bGUuanVzdGlmeUNvbnRlbnQ9ImZsZXgtZW5kIil9fX1zLmN1cnJlbnQ9dS5zY3JvbGxUb3B9KX0pKSkpfSksUDQ9IlNlbGVjdEdyb3VwIixbUkwsQTRdPUlzKFA0KSxNND0iU2VsZWN0TGFiZWwiLEQ0PXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6biwuLi5yfT1lLGk9QTQoTTQsbik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChLZS5kaXYsaWUoe2lkOmkuaWR9LHIse3JlZjp0fSkpfSksV209IlNlbGVjdEl0ZW0iLFtJNCxka109SXMoV20pLEw0PXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6bix2YWx1ZTpyLGRpc2FibGVkOmk9ITEsdGV4dFZhbHVlOm8sLi4ubH09ZSxzPWNsKFdtLG4pLGE9VmYoV20sbiksdT1zLnZhbHVlPT09cixbYyxkXT1wLnVzZVN0YXRlKG8/PyIiKSxbZixoXT1wLnVzZVN0YXRlKCExKSxtPXN0KHQsdj0+e3ZhciB5O3JldHVybih5PWEuaXRlbVJlZkNhbGxiYWNrKT09PW51bGx8fHk9PT12b2lkIDA/dm9pZCAwOnkuY2FsbChhLHYscixpKX0pLGc9amYoKSxTPSgpPT57aXx8KHMub25WYWx1ZUNoYW5nZShyKSxzLm9uT3BlbkNoYW5nZSghMSkpfTtpZihyPT09IiIpdGhyb3cgbmV3IEVycm9yKCJBIDxTZWxlY3QuSXRlbSAvPiBtdXN0IGhhdmUgYSB2YWx1ZSBwcm9wIHRoYXQgaXMgbm90IGFuIGVtcHR5IHN0cmluZy4gVGhpcyBpcyBiZWNhdXNlIHRoZSBTZWxlY3QgdmFsdWUgY2FuIGJlIHNldCB0byBhbiBlbXB0eSBzdHJpbmcgdG8gY2xlYXIgdGhlIHNlbGVjdGlvbiBhbmQgc2hvdyB0aGUgcGxhY2Vob2xkZXIuIik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChJNCx7c2NvcGU6bix2YWx1ZTpyLGRpc2FibGVkOmksdGV4dElkOmcsaXNTZWxlY3RlZDp1LG9uSXRlbVRleHRDaGFuZ2U6cC51c2VDYWxsYmFjayh2PT57ZCh5PT57dmFyIF87cmV0dXJuIHl8fCgoXz12PT1udWxsP3ZvaWQgMDp2LnRleHRDb250ZW50KSE9PW51bGwmJl8hPT12b2lkIDA/XzoiIikudHJpbSgpfSl9LFtdKX0scC5jcmVhdGVFbGVtZW50KFdmLkl0ZW1TbG90LHtzY29wZTpuLHZhbHVlOnIsZGlzYWJsZWQ6aSx0ZXh0VmFsdWU6Y30scC5jcmVhdGVFbGVtZW50KEtlLmRpdixpZSh7cm9sZToib3B0aW9uIiwiYXJpYS1sYWJlbGxlZGJ5IjpnLCJkYXRhLWhpZ2hsaWdodGVkIjpmPyIiOnZvaWQgMCwiYXJpYS1zZWxlY3RlZCI6dSYmZiwiZGF0YS1zdGF0ZSI6dT8iY2hlY2tlZCI6InVuY2hlY2tlZCIsImFyaWEtZGlzYWJsZWQiOml8fHZvaWQgMCwiZGF0YS1kaXNhYmxlZCI6aT8iIjp2b2lkIDAsdGFiSW5kZXg6aT92b2lkIDA6LTF9LGwse3JlZjptLG9uRm9jdXM6bnQobC5vbkZvY3VzLCgpPT5oKCEwKSksb25CbHVyOm50KGwub25CbHVyLCgpPT5oKCExKSksb25Qb2ludGVyVXA6bnQobC5vblBvaW50ZXJVcCxTKSxvblBvaW50ZXJNb3ZlOm50KGwub25Qb2ludGVyTW92ZSx2PT57aWYoaSl7dmFyIHk7KHk9YS5vbkl0ZW1MZWF2ZSk9PT1udWxsfHx5PT09dm9pZCAwfHx5LmNhbGwoYSl9ZWxzZSB2LmN1cnJlbnRUYXJnZXQuZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KX0pLG9uUG9pbnRlckxlYXZlOm50KGwub25Qb2ludGVyTGVhdmUsdj0+e2lmKHYuY3VycmVudFRhcmdldD09PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpe3ZhciB5Oyh5PWEub25JdGVtTGVhdmUpPT09bnVsbHx8eT09PXZvaWQgMHx8eS5jYWxsKGEpfX0pLG9uS2V5RG93bjpudChsLm9uS2V5RG93bix2PT57dmFyIHk7KCh5PWEuc2VhcmNoUmVmKT09PW51bGx8fHk9PT12b2lkIDA/dm9pZCAwOnkuY3VycmVudCkhPT0iIiYmdi5rZXk9PT0iICJ8fChwNC5pbmNsdWRlcyh2LmtleSkmJlMoKSx2LmtleT09PSIgIiYmdi5wcmV2ZW50RGVmYXVsdCgpKX0pfSkpKSl9KSxiYz0iU2VsZWN0SXRlbVRleHQiLGo0PXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6bixjbGFzc05hbWU6cixzdHlsZTppLC4uLm99PWUsbD1jbChiYyxuKSxzPVZmKGJjLG4pLGE9ZGsoYmMsbiksdT15NChiYyxuKSxbYyxkXT1wLnVzZVN0YXRlKG51bGwpLGY9c3QodCx2PT5kKHYpLGEub25JdGVtVGV4dENoYW5nZSx2PT57dmFyIHk7cmV0dXJuKHk9cy5pdGVtVGV4dFJlZkNhbGxiYWNrKT09PW51bGx8fHk9PT12b2lkIDA/dm9pZCAwOnkuY2FsbChzLHYsYS52YWx1ZSxhLmRpc2FibGVkKX0pLGg9Yz09bnVsbD92b2lkIDA6Yy50ZXh0Q29udGVudCxtPXAudXNlTWVtbygoKT0+cC5jcmVhdGVFbGVtZW50KCJvcHRpb24iLHtrZXk6YS52YWx1ZSx2YWx1ZTphLnZhbHVlLGRpc2FibGVkOmEuZGlzYWJsZWR9LGgpLFthLmRpc2FibGVkLGEudmFsdWUsaF0pLHtvbk5hdGl2ZU9wdGlvbkFkZDpnLG9uTmF0aXZlT3B0aW9uUmVtb3ZlOlN9PXU7cmV0dXJuIFVuKCgpPT4oZyhtKSwoKT0+UyhtKSksW2csUyxtXSkscC5jcmVhdGVFbGVtZW50KHAuRnJhZ21lbnQsbnVsbCxwLmNyZWF0ZUVsZW1lbnQoS2Uuc3BhbixpZSh7aWQ6YS50ZXh0SWR9LG8se3JlZjpmfSkpLGEuaXNTZWxlY3RlZCYmbC52YWx1ZU5vZGUmJiFsLnZhbHVlTm9kZUhhc0NoaWxkcmVuP0dyLmNyZWF0ZVBvcnRhbChvLmNoaWxkcmVuLGwudmFsdWVOb2RlKTpudWxsKX0pLHo0PSJTZWxlY3RJdGVtSW5kaWNhdG9yIixGND1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sLi4ucn09ZTtyZXR1cm4gZGsoejQsbikuaXNTZWxlY3RlZD9wLmNyZWF0ZUVsZW1lbnQoS2Uuc3BhbixpZSh7ImFyaWEtaGlkZGVuIjohMH0scix7cmVmOnR9KSk6bnVsbH0pLEI0PXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6biwuLi5yfT1lO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHsiYXJpYS1oaWRkZW4iOiEwfSxyLHtyZWY6dH0pKX0pO2Z1bmN0aW9uIGZrKGUpe3JldHVybiBlPT09IiJ8fGU9PT12b2lkIDB9Y29uc3QgaGs9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7dmFsdWU6biwuLi5yfT1lLGk9cC51c2VSZWYobnVsbCksbz1zdCh0LGkpLGw9ZWsobik7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3Qgcz1pLmN1cnJlbnQsYT13aW5kb3cuSFRNTFNlbGVjdEVsZW1lbnQucHJvdG90eXBlLGM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLCJ2YWx1ZSIpLnNldDtpZihsIT09biYmYyl7Y29uc3QgZD1uZXcgRXZlbnQoImNoYW5nZSIse2J1YmJsZXM6ITB9KTtjLmNhbGwocyxuKSxzLmRpc3BhdGNoRXZlbnQoZCl9fSxbbCxuXSkscC5jcmVhdGVFbGVtZW50KGJNLHthc0NoaWxkOiEwfSxwLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIsaWUoe30scix7cmVmOm8sZGVmYXVsdFZhbHVlOm59KSkpfSk7aGsuZGlzcGxheU5hbWU9IkJ1YmJsZVNlbGVjdCI7ZnVuY3Rpb24gcGsoZSl7Y29uc3QgdD1lbihlKSxuPXAudXNlUmVmKCIiKSxyPXAudXNlUmVmKDApLGk9cC51c2VDYWxsYmFjayhsPT57Y29uc3Qgcz1uLmN1cnJlbnQrbDt0KHMpLGZ1bmN0aW9uIGEodSl7bi5jdXJyZW50PXUsd2luZG93LmNsZWFyVGltZW91dChyLmN1cnJlbnQpLHUhPT0iIiYmKHIuY3VycmVudD13aW5kb3cuc2V0VGltZW91dCgoKT0+YSgiIiksMWUzKSl9KHMpfSxbdF0pLG89cC51c2VDYWxsYmFjaygoKT0+e24uY3VycmVudD0iIix3aW5kb3cuY2xlYXJUaW1lb3V0KHIuY3VycmVudCl9LFtdKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PigpPT53aW5kb3cuY2xlYXJUaW1lb3V0KHIuY3VycmVudCksW10pLFtuLGksb119ZnVuY3Rpb24gbWsoZSx0LG4pe2NvbnN0IGk9dC5sZW5ndGg+MSYmQXJyYXkuZnJvbSh0KS5ldmVyeSh1PT51PT09dFswXSk/dFswXTp0LG89bj9lLmluZGV4T2Yobik6LTE7bGV0IGw9VTQoZSxNYXRoLm1heChvLDApKTtpLmxlbmd0aD09PTEmJihsPWwuZmlsdGVyKHU9PnUhPT1uKSk7Y29uc3QgYT1sLmZpbmQodT0+dS50ZXh0VmFsdWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGkudG9Mb3dlckNhc2UoKSkpO3JldHVybiBhIT09bj9hOnZvaWQgMH1mdW5jdGlvbiBVNChlLHQpe3JldHVybiBlLm1hcCgobixyKT0+ZVsodCtyKSVlLmxlbmd0aF0pfWNvbnN0IFc0PXg0LGdrPXc0LFY0PUU0LEg0PUM0LEs0PWs0LHZrPSQ0LFo0PU80LHlrPUQ0LHhrPUw0LEc0PWo0LFk0PUY0LF9rPUI0LFg0PVc0LFE0PVY0LHdrPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLGNoaWxkcmVuOnQsLi4ubn0scik9PnguanN4cyhnayx7cmVmOnIsY2xhc3NOYW1lOnh0KCJmbGV4IGgtMTAgdy1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWlucHV0IGJnLWJhY2tncm91bmQgcHgtMyBweS0yIHRleHQtc20gcmluZy1vZmZzZXQtYmFja2dyb3VuZCBwbGFjZWhvbGRlcjp0ZXh0LW11dGVkLWZvcmVncm91bmQgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLXJpbmcgZm9jdXM6cmluZy1vZmZzZXQtMiBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6b3BhY2l0eS01MCIsZSksLi4ubixjaGlsZHJlbjpbdCx4LmpzeChINCx7YXNDaGlsZDohMCxjaGlsZHJlbjp4LmpzeChrQyx7Y2xhc3NOYW1lOiJ3LTQgaC00IG9wYWNpdHktNTAifSl9KV19KSk7d2suZGlzcGxheU5hbWU9Z2suZGlzcGxheU5hbWU7Y29uc3QgU2s9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsY2hpbGRyZW46dCxwb3NpdGlvbjpuPSJwb3BwZXIiLC4uLnJ9LGkpPT54LmpzeChLNCx7Y2hpbGRyZW46eC5qc3godmsse3JlZjppLGNsYXNzTmFtZTp4dCgicmVsYXRpdmUgei01MCBtaW4tdy1bOHJlbV0gb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtbWQgYm9yZGVyIGJnLXBvcG92ZXIgdGV4dC1wb3BvdmVyLWZvcmVncm91bmQgc2hhZG93LW1kIGRhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtaW4gZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dCBkYXRhLVtzdGF0ZT1jbG9zZWRdOmZhZGUtb3V0LTAgZGF0YS1bc3RhdGU9b3Blbl06ZmFkZS1pbi0wIGRhdGEtW3N0YXRlPWNsb3NlZF06em9vbS1vdXQtOTUgZGF0YS1bc3RhdGU9b3Blbl06em9vbS1pbi05NSBkYXRhLVtzaWRlPWJvdHRvbV06c2xpZGUtaW4tZnJvbS10b3AtMiBkYXRhLVtzaWRlPWxlZnRdOnNsaWRlLWluLWZyb20tcmlnaHQtMiBkYXRhLVtzaWRlPXJpZ2h0XTpzbGlkZS1pbi1mcm9tLWxlZnQtMiBkYXRhLVtzaWRlPXRvcF06c2xpZGUtaW4tZnJvbS1ib3R0b20tMiIsbj09PSJwb3BwZXIiJiYiZGF0YS1bc2lkZT1ib3R0b21dOnRyYW5zbGF0ZS15LTEgZGF0YS1bc2lkZT1sZWZ0XTotdHJhbnNsYXRlLXgtMSBkYXRhLVtzaWRlPXJpZ2h0XTp0cmFuc2xhdGUteC0xIGRhdGEtW3NpZGU9dG9wXTotdHJhbnNsYXRlLXktMSIsZSkscG9zaXRpb246biwuLi5yLGNoaWxkcmVuOnguanN4KFo0LHtjbGFzc05hbWU6eHQoInAtMSIsbj09PSJwb3BwZXIiJiYiaC1bdmFyKC0tcmFkaXgtc2VsZWN0LXRyaWdnZXItaGVpZ2h0KV0gdy1mdWxsIG1pbi13LVt2YXIoLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci13aWR0aCldIiksY2hpbGRyZW46dH0pfSl9KSk7U2suZGlzcGxheU5hbWU9dmsuZGlzcGxheU5hbWU7Y29uc3QgSjQ9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsLi4udH0sbik9PnguanN4KHlrLHtyZWY6bixjbGFzc05hbWU6eHQoInB5LTEuNSBwbC04IHByLTIgdGV4dC1zbSBmb250LXNlbWlib2xkIixlKSwuLi50fSkpO0o0LmRpc3BsYXlOYW1lPXlrLmRpc3BsYXlOYW1lO2NvbnN0IEVrPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLGNoaWxkcmVuOnQsLi4ubn0scik9PnguanN4cyh4ayx7cmVmOnIsY2xhc3NOYW1lOnh0KCJyZWxhdGl2ZSBmbGV4IHctZnVsbCBjdXJzb3ItZGVmYXVsdCBzZWxlY3Qtbm9uZSBpdGVtcy1jZW50ZXIgcm91bmRlZC1zbSBweS0xLjUgcGwtOCBwci0yIHRleHQtc20gb3V0bGluZS1ub25lIGZvY3VzOmJnLWFjY2VudCBmb2N1czp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIGRhdGEtW2Rpc2FibGVkXTpwb2ludGVyLWV2ZW50cy1ub25lIGRhdGEtW2Rpc2FibGVkXTpvcGFjaXR5LTUwIixlKSwuLi5uLGNoaWxkcmVuOlt4LmpzeCgic3BhbiIse2NsYXNzTmFtZToiYWJzb2x1dGUgbGVmdC0yIGZsZXggaC0zLjUgdy0zLjUgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIixjaGlsZHJlbjp4LmpzeChZNCx7Y2hpbGRyZW46eC5qc3goUUEse2NsYXNzTmFtZToidy00IGgtNCJ9KX0pfSkseC5qc3goRzQse2NoaWxkcmVuOnR9KV19KSk7RWsuZGlzcGxheU5hbWU9eGsuZGlzcGxheU5hbWU7Y29uc3QgcTQ9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsLi4udH0sbik9PnguanN4KF9rLHtyZWY6bixjbGFzc05hbWU6eHQoIi1teC0xIG15LTEgaC1weCBiZy1tdXRlZCIsZSksLi4udH0pKTtxNC5kaXNwbGF5TmFtZT1fay5kaXNwbGF5TmFtZTtmdW5jdGlvbiBDayh7cGF0aDplLGRpc2FibGVkOnQsc291cmNlOm4sc2NoZW1hOnIscmVnaXN0ZXJQYXRjaENhbGxiYWNrOmksb25TdWJtaXQ6b30pe3JldHVybih0eXBlb2Ygbj09InN0cmluZyJ8fG49PT1udWxsKSYmKHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0ic3RyaW5nIj94LmpzeChuRCx7ZGVmYXVsdFZhbHVlOm4sZGlzYWJsZWQ6dCxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6aSxvblN1Ym1pdDpvfSk6KHR5cGVvZiBuPT0ibnVtYmVyInx8bj09PW51bGwpJiYocj09bnVsbD92b2lkIDA6ci50eXBlKT09PSJudW1iZXIiP3guanN4KHRfLHtkZWZhdWx0VmFsdWU6bixkaXNhYmxlZDp0LHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazppLG9uU3VibWl0Om99KToodHlwZW9mIG49PSJudW1iZXIifHx0eXBlb2Ygbj09InN0cmluZyJ8fG49PT1udWxsKSYmKHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0ia2V5T2YiP3guanN4KGVfLHtkZWZhdWx0VmFsdWU6bixkaXNhYmxlZDp0LHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazppLG9uU3VibWl0Om8sc2VsZWN0b3I6ci5zZWxlY3Rvcn0pOih0eXBlb2Ygbj09Im51bWJlciJ8fG49PT1udWxsKSYmKHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0ibnVtYmVyIj94LmpzeCh0Xyx7ZGVmYXVsdFZhbHVlOm4sZGlzYWJsZWQ6dCxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6aSxvblN1Ym1pdDpvfSk6KHR5cGVvZiBuPT0ibnVtYmVyInx8dHlwZW9mIG49PSJzdHJpbmcifHxuPT09bnVsbCkmJihyPT1udWxsP3ZvaWQgMDpyLnR5cGUpPT09ImtleU9mIj94LmpzeChlXyx7ZGVmYXVsdFZhbHVlOm4sZGlzYWJsZWQ6dCxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6aSxvblN1Ym1pdDpvLHNlbGVjdG9yOnIuc2VsZWN0b3J9KToodHlwZW9mIG49PSJvYmplY3QifHxuPT09bnVsbCkmJihyPT1udWxsP3ZvaWQgMDpyLnR5cGUpPT09InJpY2h0ZXh0Ij94LmpzeCh0RCx7cmVnaXN0ZXJQYXRjaENhbGxiYWNrOmksb25TdWJtaXQ6byxkZWZhdWx0VmFsdWU6bn0pOih0eXBlb2Ygbj09Im9iamVjdCJ8fG49PT1udWxsKSYmKHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0iaW1hZ2UiP3guanN4KGVELHtwYXRoOmUscmVnaXN0ZXJQYXRjaENhbGxiYWNrOmksb25TdWJtaXQ6byxkZWZhdWx0VmFsdWU6bn0pOnguanN4cygiZGl2Iix7Y2hpbGRyZW46WyJVbnN1cHBvcnRlZCBzY2hlbWE6ICIsci50eXBlXX0pfWZ1bmN0aW9uIEp4KGUsdCxuLHIpe2lmKCF0fHwhcilyZXR1cm5bXTtjb25zdCBpPXIuc2hhMjU2LnNsaWNlKDAsNSksbz1mdW5jdGlvbigpe2NvbnN0IGw9ZXYodCk/PyJ1bmtub3duIixzPXR2KGwpO2lmKG4pe2xldCBhPW4uc3BsaXQoIi4iKS5zbGljZSgwLC0xKS5qb2luKCIuIil8fG47Y29uc3QgdT1hLmxhc3RJbmRleE9mKCJfIik7cmV0dXJuIGEuc2xpY2UodSsxLGEubGVuZ3RoKT09PWkmJihhPWEuc2xpY2UoMCx1KSksYC9wdWJsaWMvJHthfV8ke2l9LiR7c31gfXJldHVybmAvcHVibGljLyR7ci5zaGEyNTZ9LiR7c31gfSgpO3JldHVyblt7dmFsdWU6e1tSbl06byxbbm5dOiJmaWxlIixtZXRhZGF0YTpyfSxvcDoicmVwbGFjZSIscGF0aDplfSx7dmFsdWU6dCxvcDoiZmlsZSIscGF0aDplLGZpbGVQYXRoOm99XX1mdW5jdGlvbiBlRCh7cGF0aDplLGRlZmF1bHRWYWx1ZTp0LG9uU3VibWl0Om4scmVnaXN0ZXJQYXRjaENhbGxiYWNrOnJ9KXtjb25zdFtpLG9dPXAudXNlU3RhdGUobnVsbCksW2wsc109cC51c2VTdGF0ZSghMSksW2EsdV09cC51c2VTdGF0ZSgpLFtjLGRdPXAudXNlU3RhdGUoKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntkKHQmJmpuLmNvbnZlcnRGaWxlU291cmNlKHQpLnVybCl9LFt0XSkscC51c2VFZmZlY3QoKCk9PntyJiZyKGFzeW5jIGY9Pkp4KGYsKGk9PW51bGw/dm9pZCAwOmkuc3JjKT8/bnVsbCwoaT09bnVsbD92b2lkIDA6aS5maWxlbmFtZSk/P251bGwsYSkpfSxbaSx0XSkseC5qc3hzKFV1LHtjaGlsZHJlbjpbeC5qc3goImRpdiIse2NsYXNzTmFtZToibWF4LXctNHhsIHAtNCIsY2hpbGRyZW46eC5qc3hzKCJsYWJlbCIse2h0bWxGb3I6YGltZ19pbnB1dDoke2V9YCxjbGFzc05hbWU6IiIsY2hpbGRyZW46W2l8fGM/eC5qc3goImltZyIse3NyYzooaT09bnVsbD92b2lkIDA6aS5zcmMpfHxjfSk6eC5qc3goImRpdiIse2NoaWxkcmVuOiJFbXB0eSJ9KSx4LmpzeCgiaW5wdXQiLHtpZDpgaW1nX2lucHV0OiR7ZX1gLHR5cGU6ImZpbGUiLGhpZGRlbjohMCxvbkNoYW5nZTpmPT57X0MoZikudGhlbihoPT57byh7c3JjOmguc3JjLGZpbGVuYW1lOmguZmlsZW5hbWV9KSxoLndpZHRoJiZoLmhlaWdodD91KHtzaGEyNTY6aC5zaGEyNTYsd2lkdGg6aC53aWR0aCxoZWlnaHQ6aC5oZWlnaHR9KTp1KHZvaWQgMCl9KS5jYXRjaChoPT57Y29uc29sZS5lcnJvcihoLm1lc3NhZ2UpLG8obnVsbCksdSh2b2lkIDApfSl9fSldfSl9LGUpLG4mJmkmJnguanN4KFd1LHtsb2FkaW5nOmwsb25DbGljazooKT0+e3MoITApLG4oZj0+UHJvbWlzZS5yZXNvbHZlKEp4KGYsaS5zcmMsaS5maWxlbmFtZT8/bnVsbCxhKSkpLmZpbmFsbHkoKCk9PntzKCExKSxvKG51bGwpLHUodm9pZCAwKX0pfX0pXX0pfWZ1bmN0aW9uIHF4KGUsdCl7Y29uc3R7dGVtcGxhdGVTdHJpbmdzOm4sZXhwcnM6cixmaWxlczppfT10PyRSKHQuZ2V0RWRpdG9yU3RhdGUoKS50b0pTT04oKS5yb290KTp7W25uXToicmljaHRleHQiLHRlbXBsYXRlU3RyaW5nczpbIiJdLGV4cHJzOltdLGZpbGVzOnt9fTtyZXR1cm5be29wOiJyZXBsYWNlIixwYXRoOmUsdmFsdWU6e3RlbXBsYXRlU3RyaW5nczpuLGV4cHJzOnIsW25uXToicmljaHRleHQifX0sLi4uT2JqZWN0LmVudHJpZXMoaSkubWFwKChbbyxsXSk9Pih7b3A6ImZpbGUiLHBhdGg6ZSxmaWxlUGF0aDpvLHZhbHVlOmx9KSldfWZ1bmN0aW9uIHREKHtkZWZhdWx0VmFsdWU6ZSxvblN1Ym1pdDp0LHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazpufSl7Y29uc3RbcixpXT1wLnVzZVN0YXRlKG51bGwpLFtvLGxdPXAudXNlU3RhdGUoITEpLFtzLGFdPXAudXNlU3RhdGUoITEpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e3ImJihsKCExKSxyLnJlZ2lzdGVyVGV4dENvbnRlbnRMaXN0ZW5lcigoKT0+e2woITApfSksci5yZWdpc3RlckRlY29yYXRvckxpc3RlbmVyKCgpPT57bCghMCl9KSl9LFtyXSkscC51c2VFZmZlY3QoKCk9PntyJiZuJiZuKGFzeW5jIHU9PnF4KHUscikpfSxbcl0pLHguanN4cyhVdSx7Y2hpbGRyZW46W3guanN4KEdBLHtvbkVkaXRvcjp1PT57aSh1KX0scmljaHRleHQ6ZXx8e2NoaWxkcmVuOltdLFtubl06InJvb3QifX0pLHQmJm8mJnguanN4KFd1LHtsb2FkaW5nOnN8fCFyLG9uQ2xpY2s6KCk9PntyJiYoYSghMCksdChhc3luYyB1PT5xeCh1LHIpKS5maW5hbGx5KCgpPT57YSghMSksbCghMSl9KSl9fSldfSl9ZnVuY3Rpb24gZV8oe2Rpc2FibGVkOmUsZGVmYXVsdFZhbHVlOnQscmVnaXN0ZXJQYXRjaENhbGxiYWNrOm4sb25TdWJtaXQ6cixzZWxlY3RvcjppfSl7Y29uc3Qgbz1FSShpKSxzPShoPT5BcnJheS5pc0FycmF5KGgubW9kdWxlU291cmNlKT97dHlwZToibnVtYmVyIix2YWx1ZXM6T2JqZWN0LmtleXMoaC5tb2R1bGVTb3VyY2UpLm1hcChtPT5wYXJzZUludChtKSl9Ont0eXBlOiJzdHJpbmciLHZhbHVlczpPYmplY3Qua2V5cyhoLm1vZHVsZVNvdXJjZT8/WyJFUlJPUiBmZXRjaGluZyBzb3VyY2UiXSl9KShvKSxbYSx1XT1wLnVzZVN0YXRlKHR8fHMudmFsdWVzWzBdKSxbYyxkXT1wLnVzZVN0YXRlKCExKTtwLnVzZUVmZmVjdCgoKT0+e2QoZSl9LFtlXSk7Y29uc3QgZj1oPT57aWYocy50eXBlPT09Im51bWJlciIpe2lmKGg9PT0iIil0aHJvdyBuZXcgRXJyb3IoIlZhbHVlIGNhbm5vdCBiZSBlbXB0eSIpO2lmKE51bWJlci5pc05hTihOdW1iZXIoaCkpKXRocm93IG5ldyBFcnJvcigiVmFsdWUgd2FzIG5vdCBhIG51bWJlcjogIitKU09OLnN0cmluZ2lmeShoKSk7cmV0dXJuIE51bWJlcihoKX1yZXR1cm4gaH07cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57biYmbihhc3luYyBoPT5be29wOiJyZXBsYWNlIixwYXRoOmgsdmFsdWU6YX1dKX0sW2FdKSx4LmpzeHMoVXUse2NoaWxkcmVuOlt4LmpzeHMoWDQse2RlZmF1bHRWYWx1ZTphLnRvU3RyaW5nKCksZGlzYWJsZWQ6YyxvblZhbHVlQ2hhbmdlOmg9Pnt1KGYoaCkpfSxjaGlsZHJlbjpbeC5qc3god2sse2NoaWxkcmVuOnguanN4KFE0LHtwbGFjZWhvbGRlcjoiU2VsZWN0IGEgdmFsdWUifSl9KSx4LmpzeChTayx7Y2hpbGRyZW46cy52YWx1ZXMubWFwKGg9PnguanN4KEVrLHt2YWx1ZTpoLnRvU3RyaW5nKCksY2hpbGRyZW46aC50b1N0cmluZygpfSxoKSl9KV19KSxyJiZ0IT09YSYmeC5qc3goV3Use2xvYWRpbmc6YyxvbkNsaWNrOigpPT57ZCghMCkscihhc3luYyBoPT5be29wOiJyZXBsYWNlIixwYXRoOmgsdmFsdWU6YX1dKS5maW5hbGx5KCgpPT57ZCghMSl9KX19KV19KX1mdW5jdGlvbiB0Xyh7ZGlzYWJsZWQ6ZSxkZWZhdWx0VmFsdWU6dCxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6bixvblN1Ym1pdDpyfSl7Y29uc3RbaSxvXT1wLnVzZVN0YXRlKHR8fDApLFtsLHNdPXAudXNlU3RhdGUoITEpO3AudXNlRWZmZWN0KCgpPT57cyhlKX0sW2VdKTtjb25zdCBhPXAudXNlUmVmKG51bGwpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e24mJm4oYXN5bmMgdT0+e3ZhciBjO3JldHVyblt7b3A6InJlcGxhY2UiLHBhdGg6dSx2YWx1ZTpOdW1iZXIoKGM9YS5jdXJyZW50KT09bnVsbD92b2lkIDA6Yy52YWx1ZSl8fDB9XX0pfSxbXSkseC5qc3hzKFV1LHtjaGlsZHJlbjpbeC5qc3goanYse3JlZjphLGRpc2FibGVkOmwsZGVmYXVsdFZhbHVlOmk/PzAsb25DaGFuZ2U6dT0+byhOdW1iZXIodS50YXJnZXQudmFsdWUpKSx0eXBlOiJudW1iZXIifSksciYmdCE9PWkmJnguanN4KFd1LHtsb2FkaW5nOmwsb25DbGljazooKT0+e3MoITApLHIoYXN5bmMgdT0+e3ZhciBjO3JldHVyblt7b3A6InJlcGxhY2UiLHBhdGg6dSx2YWx1ZTpOdW1iZXIoKGM9YS5jdXJyZW50KT09bnVsbD92b2lkIDA6Yy52YWx1ZSl8fDB9XX0pLmZpbmFsbHkoKCk9PntzKCExKX0pfX0pXX0pfWZ1bmN0aW9uIG5EKHtkaXNhYmxlZDplLGRlZmF1bHRWYWx1ZTp0LHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazpuLG9uU3VibWl0OnJ9KXtjb25zdFtpLG9dPXAudXNlU3RhdGUodHx8IiIpLFtsLHNdPXAudXNlU3RhdGUoITEpO3AudXNlRWZmZWN0KCgpPT57cyhlKX0sW2VdKTtjb25zdCBhPXAudXNlUmVmKG51bGwpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e24mJm4oYXN5bmMgdT0+e3ZhciBjO3JldHVyblt7b3A6InJlcGxhY2UiLHBhdGg6dSx2YWx1ZTooKGM9YS5jdXJyZW50KT09bnVsbD92b2lkIDA6Yy52YWx1ZSl8fCIifV19KX0sW10pLHguanN4cyhVdSx7Y2hpbGRyZW46W3guanN4KGp2LHtyZWY6YSxkaXNhYmxlZDpsLGRlZmF1bHRWYWx1ZTppPz8iIixvbkNoYW5nZTp1PT5vKHUudGFyZ2V0LnZhbHVlKX0pLHImJnQhPT1pJiZ4LmpzeChXdSx7bG9hZGluZzpsLG9uQ2xpY2s6KCk9PntzKCEwKSxyKGFzeW5jIHU9Pnt2YXIgYztyZXR1cm5be29wOiJyZXBsYWNlIixwYXRoOnUsdmFsdWU6KChjPWEuY3VycmVudCk9PW51bGw/dm9pZCAwOmMudmFsdWUpfHwiIn1dfSkuZmluYWxseSgoKT0+e3MoITEpfSl9fSldfSl9ZnVuY3Rpb24gVXUoe2NoaWxkcmVuOmV9KXtyZXR1cm4geC5qc3goImRpdiIse2NsYXNzTmFtZToicmVsYXRpdmUgcC00IGJvcmRlciByb3VuZGVkIGJvcmRlci1jYXJkIixjaGlsZHJlbjplfSl9ZnVuY3Rpb24gV3Uoe2xvYWRpbmc6ZSxvbkNsaWNrOnR9KXtyZXR1cm4geC5qc3goImRpdiIse2NsYXNzTmFtZToic3RpY2t5IGJvdHRvbS0wIixjaGlsZHJlbjp4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGp1c3RpZnktZW5kIHctZnVsbCBweS0yIixjaGlsZHJlbjp4LmpzeChNQyx7ZGlzYWJsZWQ6ZSxvbkNsaWNrOnQsY2hpbGRyZW46ZT8iU2F2aW5nLi4uIjoiU2F2ZSJ9KX0pfSl9Y29uc3QgckQ9KHtjbGFzc05hbWU6ZX0pPT54LmpzeHMoInN2ZyIse3dpZHRoOiI1OCIsaGVpZ2h0OiIzNCIsdmlld0JveDoiMCAwIDU4IDM0IixmaWxsOiJub25lIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLGNsYXNzTmFtZTplLGNoaWxkcmVuOlt4LmpzeCgiZyIse2ZpbHRlcjoidXJsKCNmaWx0ZXIwX2RfMjFfMTY3NykiLGNoaWxkcmVuOnguanN4KCJwYXRoIix7ZDoiTTUgNS4zNjQyNkM1IDUuMTYzMDkgNS4xNjMwOSA1IDUuMzY0MjYgNUgxNy42NTgxQzE3Ljg1OTMgNSAxOC4wMjIzIDUuMTYzMDkgMTguMDIyMyA1LjM2NDI2VjI4LjQ5NDlDMTguMDIyMyAyOC42OTYgMTcuODU5MyAyOC44NTkxIDE3LjY1ODEgMjguODU5MUg1LjM2NDI2QzUuMTYzMDkgMjguODU5MSA1IDI4LjY5NiA1IDI4LjQ5NDlWNS4zNjQyNloiLGZpbGw6IiMzOENEOTgifSl9KSx4LmpzeCgiZyIse2ZpbHRlcjoidXJsKCNmaWx0ZXIxX2lfMjFfMTY3NykiLGNoaWxkcmVuOnguanN4KCJjaXJjbGUiLHtjeDoiMTEuNDY1NiIsY3k6IjIzLjc1OTUiLHI6IjIuMTg1NTciLGZpbGw6ImN1cnJlbnRDb2xvciJ9KX0pLHguanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNNTIuODU4OCAyMy44MzlINDguNzI1N0g0OC41MzdINDguMTEyOEM0Ny42NzE1IDIzLjgzOSA0Ny40NTA4IDIzLjU5NDIgNDcuNDUwOCAyMy4xMDQ0VjEzLjcyOTNDNDcuNDUwOCAxMy41Nzg0IDQ3LjMyODUgMTMuNDU2MSA0Ny4xNzc3IDEzLjQ1NjFINDUuODExOEM0NS42NjA5IDEzLjQ1NjEgNDUuNTM4NiAxMy41Nzg0IDQ1LjUzODYgMTMuNzI5M1YxNS4xODM2QzQ1LjUzODYgMTUuMjg0NCA0NS40NTY5IDE1LjM2NjEgNDUuMzU2MSAxNS4zNjYxQzQ1LjI4NzYgMTUuMzY2MSA0NS4yMjUgMTUuMzI3NSA0NS4xOTI0IDE1LjI2NzJDNDQuODA1IDE0LjU1MDMgNDQuMjgzIDE0LjAyIDQzLjYyNjQgMTMuNjc2NUM0Mi45NTYzIDEzLjMwMSA0Mi4yMDQ1IDEzLjExMzIgNDEuMzcwOSAxMy4xMTMyQzQwLjYwMjggMTMuMTEzMiAzOS44NzU1IDEzLjI1MiAzOS4xODkgMTMuNTI5NUMzOC41MDI2IDEzLjgwNzEgMzcuODk3OSAxNC4yMTUyIDM3LjM3NDggMTQuNzUzOUMzNi44NjgyIDE1LjI3NjQgMzYuNDY3OCAxNS45MjEyIDM2LjE3MzYgMTYuNjg4NUMzNS44Nzk0IDE3LjQ1NTggMzUuNzMyMyAxOC4zMzc0IDM1LjczMjMgMTkuMzMzMlYxOS43MjVDMzUuNzMyMyAyMC43MzcyIDM1Ljg3OTQgMjEuNjI3IDM2LjE3MzYgMjIuMzk0MkMzNi40Njc4IDIzLjE2MTUgMzYuODY4MiAyMy44MTQ2IDM3LjM3NDggMjQuMzUzM0MzNy44OTc5IDI0Ljg3NTcgMzguNTAyNiAyNS4yNzU3IDM5LjE4OSAyNS41NTMyQzM5Ljg3NTUgMjUuODE0NCA0MC42MTkxIDI1Ljk0NSA0MS40MiAyNS45NDVDNDIuMTg4MSAyNS45NDUgNDIuOTE1NCAyNS43NDkxIDQzLjYwMTkgMjUuMzU3M0M0NC4yNzUxIDI0Ljk4MiA0NC44MDU4IDI0LjQxMTkgNDUuMTk0MSAyMy42NDcxQzQ1LjIyNTUgMjMuNTg1MiA0NS4yODg2IDIzLjU0NTIgNDUuMzU4IDIzLjU0NTJINDUuMzkxN0M0NS40NzI4IDIzLjU0NTIgNDUuNTM4NiAyMy42MTEgNDUuNTM4NiAyMy42OTIxQzQ1LjUzODYgMjMuNzkwNCA0NS41NDQgMjMuODg1NiA0NS41NTQ3IDIzLjk3NzdWMjUuMTM5MkM0NS41NTQ3IDI1LjM5MDQgNDUuNzU4NCAyNS41OTQxIDQ2LjAwOTYgMjUuNTk0MUg0Ny4yMjYxQzQ3LjI5MTQgMjUuNTk5NSA0Ny4zNTgxIDI1LjYwMjIgNDcuNDI2MyAyNS42MDIySDQ4LjUzN0g0OC43MjU3SDU3LjcyNjhDNTcuODc3NyAyNS42MDIyIDU4IDI1LjQ3OTkgNTggMjUuMzI5VjI0LjExMjJDNTggMjMuOTYxNCA1Ny44Nzc3IDIzLjgzOSA1Ny43MjY4IDIzLjgzOUg1NS4zMTc0QzU1LjE2NjUgMjMuODM5IDU1LjA0NDIgMjMuNzE2NyA1NS4wNDQyIDIzLjU2NTlWOC43MzM2OEM1NS4wNDQyIDguNTgyNzkgNTQuOTIxOSA4LjQ2MDQ4IDU0Ljc3MSA4LjQ2MDQ4SDUwLjUwNTRDNTAuMzU0NSA4LjQ2MDQ4IDUwLjIzMjIgOC41ODI3OSA1MC4yMzIyIDguNzMzNjhWOS45NTA0M0M1MC4yMzIyIDEwLjEwMTMgNTAuMzU0NSAxMC4yMjM2IDUwLjUwNTQgMTAuMjIzNkg1Mi44NTg4QzUzLjAwOTcgMTAuMjIzNiA1My4xMzIgMTAuMzQ1OSA1My4xMzIgMTAuNDk2OFYyMy41NjU5QzUzLjEzMiAyMy43MTY3IDUzLjAwOTcgMjMuODM5IDUyLjg1ODggMjMuODM5Wk00MS42MTYxIDI0LjEzMjlDNDIuMTg4MSAyNC4xMzI5IDQyLjcxMTEgMjQuMDI2OCA0My4xODUxIDIzLjgxNDZDNDMuNjc1NCAyMy42MDIzIDQ0LjA5MjIgMjMuMzAwMyA0NC40MzU0IDIyLjkwODVDNDQuNzc4NiAyMi41MTY3IDQ1LjA0ODMgMjIuMDUxNCA0NS4yNDQ0IDIxLjUxMjdDNDUuNDQwNiAyMC45NTc2IDQ1LjUzODYgMjAuMzQ1NCA0NS41Mzg2IDE5LjY3NjFWMTkuMzgyMkM0NS41Mzg2IDE4LjcyOTIgNDUuNDQwNiAxOC4xMzMzIDQ1LjI0NDQgMTcuNTk0NkM0NS4wNDgzIDE3LjAzOTUgNDQuNzcwNSAxNi41NjYxIDQ0LjQxMDkgMTYuMTc0M0M0NC4wNjc3IDE1Ljc4MjQgNDMuNjUwOSAxNS40ODA0IDQzLjE2MDYgMTUuMjY4MkM0Mi42ODY2IDE1LjAzOTYgNDIuMTcxOCAxNC45MjU0IDQxLjYxNjEgMTQuOTI1NEM0MS4wNDQgMTQuOTI1NCA0MC41MjEgMTUuMDMxNSA0MC4wNDcxIDE1LjI0MzdDMzkuNTczMSAxNS40NTU5IDM5LjE1NjMgMTUuNzU4IDM4Ljc5NjggMTYuMTQ5OEMzOC40NTM1IDE2LjUyNTIgMzguMTgzOSAxNi45OTA1IDM3Ljk4NzcgMTcuNTQ1NkMzNy43OTE2IDE4LjA4NDMgMzcuNjkzNiAxOC42ODAyIDM3LjY5MzYgMTkuMzMzMlYxOS43MjVDMzcuNjkzNiAyMS4xMTI3IDM4LjA1MzEgMjIuMTk4MyAzOC43NzIyIDIyLjk4MkMzOS41MDc3IDIzLjc0OTMgNDAuNDU1NyAyNC4xMzI5IDQxLjYxNjEgMjQuMTMyOVpNMzEuMTExNSAyNS40MTkxQzMxLjA3MzIgMjUuNTI4NyAzMC45Njk4IDI1LjYwMjIgMzAuODUzNiAyNS42MDIySDI3LjQ2NjFDMjcuMzUgMjUuNjAyMiAyNy4yNDY1IDI1LjUyODcgMjcuMjA4MiAyNS40MTkxTDIzLjE1NzggMTMuODE5M0MyMy4wOTU4IDEzLjY0MTcgMjMuMjI3NiAxMy40NTYxIDIzLjQxNTcgMTMuNDU2MUgyNS4wODlDMjUuMjA2OCAxMy40NTYxIDI1LjMxMTQgMTMuNTMxNiAyNS4zNDg0IDEzLjY0MzVMMjguOTY2NiAyNC41ODFDMjguOTk0MiAyNC42NjQzIDI5LjA3MjEgMjQuNzIwNiAyOS4xNTk5IDI0LjcyMDZDMjkuMjQ3NyAyNC43MjA2IDI5LjMyNTYgMjQuNjY0MyAyOS4zNTMyIDI0LjU4MUwzMi45NzE0IDEzLjY0MzVDMzMuMDA4NCAxMy41MzE2IDMzLjExMjkgMTMuNDU2MSAzMy4yMzA4IDEzLjQ1NjFIMzQuOTA0MUMzNS4wOTIyIDEzLjQ1NjEgMzUuMjI0IDEzLjY0MTcgMzUuMTYyIDEzLjgxOTNMMzEuMTExNSAyNS40MTkxWiIsZmlsbDoiY3VycmVudENvbG9yIn0pLHguanN4cygiZGVmcyIse2NoaWxkcmVuOlt4LmpzeHMoImZpbHRlciIse2lkOiJmaWx0ZXIwX2RfMjFfMTY3NyIseDoiMC4xMjQ3MjIiLHk6IjAuMTI0NzIyIix3aWR0aDoiMjIuNzcyOSIsaGVpZ2h0OiIzMy42MDk3IixmaWx0ZXJVbml0czoidXNlclNwYWNlT25Vc2UiLGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6InNSR0IiLGNoaWxkcmVuOlt4LmpzeCgiZmVGbG9vZCIse2Zsb29kT3BhY2l0eToiMCIscmVzdWx0OiJCYWNrZ3JvdW5kSW1hZ2VGaXgifSkseC5qc3goImZlQ29sb3JNYXRyaXgiLHtpbjoiU291cmNlQWxwaGEiLHR5cGU6Im1hdHJpeCIsdmFsdWVzOiIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMCIscmVzdWx0OiJoYXJkQWxwaGEifSkseC5qc3goImZlT2Zmc2V0Iix7fSkseC5qc3goImZlR2F1c3NpYW5CbHVyIix7c3RkRGV2aWF0aW9uOiIyLjQzNzY0In0pLHguanN4KCJmZUNvbXBvc2l0ZSIse2luMjoiaGFyZEFscGhhIixvcGVyYXRvcjoib3V0In0pLHguanN4KCJmZUNvbG9yTWF0cml4Iix7dHlwZToibWF0cml4Iix2YWx1ZXM6IjAgMCAwIDAgMC4yMTk2MDggMCAwIDAgMCAwLjgwMzkyMiAwIDAgMCAwIDAuNTAxOTYxIDAgMCAwIDAuMyAwIn0pLHguanN4KCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjI6IkJhY2tncm91bmRJbWFnZUZpeCIscmVzdWx0OiJlZmZlY3QxX2Ryb3BTaGFkb3dfMjFfMTY3NyJ9KSx4LmpzeCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiZWZmZWN0MV9kcm9wU2hhZG93XzIxXzE2NzciLHJlc3VsdDoic2hhcGUifSldfSkseC5qc3hzKCJmaWx0ZXIiLHtpZDoiZmlsdGVyMV9pXzIxXzE2NzciLHg6IjkuMjgwMDMiLHk6IjIxLjU3MzkiLHdpZHRoOiI0LjM3MTEyIixoZWlnaHQ6IjQuMzcxMTIiLGZpbHRlclVuaXRzOiJ1c2VyU3BhY2VPblVzZSIsY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVyczoic1JHQiIsY2hpbGRyZW46W3guanN4KCJmZUZsb29kIix7Zmxvb2RPcGFjaXR5OiIwIixyZXN1bHQ6IkJhY2tncm91bmRJbWFnZUZpeCJ9KSx4LmpzeCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiQmFja2dyb3VuZEltYWdlRml4IixyZXN1bHQ6InNoYXBlIn0pLHguanN4KCJmZUNvbG9yTWF0cml4Iix7aW46IlNvdXJjZUFscGhhIix0eXBlOiJtYXRyaXgiLHZhbHVlczoiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLHJlc3VsdDoiaGFyZEFscGhhIn0pLHguanN4KCJmZU9mZnNldCIse30pLHguanN4KCJmZUdhdXNzaWFuQmx1ciIse3N0ZERldmlhdGlvbjoiMC41NDYzOTIifSkseC5qc3goImZlQ29tcG9zaXRlIix7aW4yOiJoYXJkQWxwaGEiLG9wZXJhdG9yOiJhcml0aG1ldGljIixrMjoiLTEiLGszOiIxIn0pLHguanN4KCJmZUNvbG9yTWF0cml4Iix7dHlwZToibWF0cml4Iix2YWx1ZXM6IjAgMCAwIDAgMC4yMTk2MDggMCAwIDAgMCAwLjgwMzkyMiAwIDAgMCAwIDAuNTAxOTYxIDAgMCAwIDAuMyAwIn0pLHguanN4KCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjI6InNoYXBlIixyZXN1bHQ6ImVmZmVjdDFfaW5uZXJTaGFkb3dfMjFfMTY3NyJ9KV19KV19KV19KSxraz1yRCwkaz0iU3dpdGNoIixbaUQsT0xdPW9sKCRrKSxbb0QsbERdPWlEKCRrKSxzRD1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU3dpdGNoOm4sbmFtZTpyLGNoZWNrZWQ6aSxkZWZhdWx0Q2hlY2tlZDpvLHJlcXVpcmVkOmwsZGlzYWJsZWQ6cyx2YWx1ZTphPSJvbiIsb25DaGVja2VkQ2hhbmdlOnUsLi4uY309ZSxbZCxmXT1wLnVzZVN0YXRlKG51bGwpLGg9c3QodCx5PT5mKHkpKSxtPXAudXNlUmVmKCExKSxnPWQ/ISFkLmNsb3Nlc3QoImZvcm0iKTohMCxbUz0hMSx2XT1ncyh7cHJvcDppLGRlZmF1bHRQcm9wOm8sb25DaGFuZ2U6dX0pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQob0Qse3Njb3BlOm4sY2hlY2tlZDpTLGRpc2FibGVkOnN9LHAuY3JlYXRlRWxlbWVudChLZS5idXR0b24saWUoe3R5cGU6ImJ1dHRvbiIscm9sZToic3dpdGNoIiwiYXJpYS1jaGVja2VkIjpTLCJhcmlhLXJlcXVpcmVkIjpsLCJkYXRhLXN0YXRlIjpiayhTKSwiZGF0YS1kaXNhYmxlZCI6cz8iIjp2b2lkIDAsZGlzYWJsZWQ6cyx2YWx1ZTphfSxjLHtyZWY6aCxvbkNsaWNrOm50KGUub25DbGljayx5PT57dihfPT4hXyksZyYmKG0uY3VycmVudD15LmlzUHJvcGFnYXRpb25TdG9wcGVkKCksbS5jdXJyZW50fHx5LnN0b3BQcm9wYWdhdGlvbigpKX0pfSkpLGcmJnAuY3JlYXRlRWxlbWVudChjRCx7Y29udHJvbDpkLGJ1YmJsZXM6IW0uY3VycmVudCxuYW1lOnIsdmFsdWU6YSxjaGVja2VkOlMscmVxdWlyZWQ6bCxkaXNhYmxlZDpzLHN0eWxlOnt0cmFuc2Zvcm06InRyYW5zbGF0ZVgoLTEwMCUpIn19KSl9KSxhRD0iU3dpdGNoVGh1bWIiLHVEPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTd2l0Y2g6biwuLi5yfT1lLGk9bEQoYUQsbik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChLZS5zcGFuLGllKHsiZGF0YS1zdGF0ZSI6YmsoaS5jaGVja2VkKSwiZGF0YS1kaXNhYmxlZCI6aS5kaXNhYmxlZD8iIjp2b2lkIDB9LHIse3JlZjp0fSkpfSksY0Q9ZT0+e2NvbnN0e2NvbnRyb2w6dCxjaGVja2VkOm4sYnViYmxlczpyPSEwLC4uLml9PWUsbz1wLnVzZVJlZihudWxsKSxsPWVrKG4pLHM9WkModCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3QgYT1vLmN1cnJlbnQsdT13aW5kb3cuSFRNTElucHV0RWxlbWVudC5wcm90b3R5cGUsZD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHUsImNoZWNrZWQiKS5zZXQ7aWYobCE9PW4mJmQpe2NvbnN0IGY9bmV3IEV2ZW50KCJjbGljayIse2J1YmJsZXM6cn0pO2QuY2FsbChhLG4pLGEuZGlzcGF0Y2hFdmVudChmKX19LFtsLG4scl0pLHAuY3JlYXRlRWxlbWVudCgiaW5wdXQiLGllKHt0eXBlOiJjaGVja2JveCIsImFyaWEtaGlkZGVuIjohMCxkZWZhdWx0Q2hlY2tlZDpufSxpLHt0YWJJbmRleDotMSxyZWY6byxzdHlsZTp7Li4uZS5zdHlsZSwuLi5zLHBvc2l0aW9uOiJhYnNvbHV0ZSIscG9pbnRlckV2ZW50czoibm9uZSIsb3BhY2l0eTowLG1hcmdpbjowfX0pKX07ZnVuY3Rpb24gYmsoZSl7cmV0dXJuIGU/ImNoZWNrZWQiOiJ1bmNoZWNrZWQifWNvbnN0IFRrPXNELGREPXVELFZtPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLC4uLnR9LG4pPT54LmpzeChUayx7Y2xhc3NOYW1lOnh0KCJwZWVyIGlubGluZS1mbGV4IGgtWzIycHhdIHctWzQ0cHhdIHNocmluay0wIGN1cnNvci1wb2ludGVyIGl0ZW1zLWNlbnRlciByb3VuZGVkLWZ1bGwgYm9yZGVyLTIgYm9yZGVyLXRyYW5zcGFyZW50IHRyYW5zaXRpb24tY29sb3JzIGZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMiBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LWJhY2tncm91bmQgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAgZGF0YS1bc3RhdGU9Y2hlY2tlZF06YmctYWNjZW50IGRhdGEtW3N0YXRlPXVuY2hlY2tlZF06YmctcHJpbWFyeSIsZSksLi4udCxyZWY6bixjaGlsZHJlbjp4LmpzeChkRCx7Y2xhc3NOYW1lOnh0KCJwb2ludGVyLWV2ZW50cy1ub25lIGJsb2NrIGgtWzE4cHhdIHctNSByb3VuZGVkLWZ1bGwgYmctYmFja2dyb3VuZCBzaGFkb3ctbGcgcmluZy0wIHRyYW5zaXRpb24tdHJhbnNmb3JtIGRhdGEtW3N0YXRlPWNoZWNrZWRdOnRyYW5zbGF0ZS14LTUgZGF0YS1bc3RhdGU9dW5jaGVja2VkXTp0cmFuc2xhdGUteC0wIil9KX0pKTtWbS5kaXNwbGF5TmFtZT1Uay5kaXNwbGF5TmFtZTtjb25zdCBadj1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSwuLi50fSxuKT0+eC5qc3goImRpdiIse3JlZjpuLGNsYXNzTmFtZTp4dCgicm91bmRlZC1sZyBib3JkZXIgYmctY2FyZCB0ZXh0LWNhcmQtZm9yZWdyb3VuZCBzaGFkb3ctc20iLGUpLC4uLnR9KSk7WnYuZGlzcGxheU5hbWU9IkNhcmQiO2NvbnN0IGZEPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLC4uLnR9LG4pPT54LmpzeCgiZGl2Iix7cmVmOm4sY2xhc3NOYW1lOnh0KCJmbGV4IGZsZXgtY29sIHNwYWNlLXktMS41IHAtNiIsZSksLi4udH0pKTtmRC5kaXNwbGF5TmFtZT0iQ2FyZEhlYWRlciI7Y29uc3QgaEQ9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsLi4udH0sbik9PnguanN4KCJoMyIse3JlZjpuLGNsYXNzTmFtZTp4dCgidGV4dC0yeGwgZm9udC1zZW1pYm9sZCBsZWFkaW5nLW5vbmUgdHJhY2tpbmctdGlnaHQiLGUpLC4uLnR9KSk7aEQuZGlzcGxheU5hbWU9IkNhcmRUaXRsZSI7Y29uc3QgcEQ9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsLi4udH0sbik9PnguanN4KCJwIix7cmVmOm4sY2xhc3NOYW1lOnh0KCJ0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCIsZSksLi4udH0pKTtwRC5kaXNwbGF5TmFtZT0iQ2FyZERlc2NyaXB0aW9uIjtjb25zdCBtRD1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSwuLi50fSxuKT0+eC5qc3goImRpdiIse3JlZjpuLGNsYXNzTmFtZTp4dCgicC02IHB0LTAiLGUpLC4uLnR9KSk7bUQuZGlzcGxheU5hbWU9IkNhcmRDb250ZW50Ijtjb25zdCBnRD1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSwuLi50fSxuKT0+eC5qc3goImRpdiIse3JlZjpuLGNsYXNzTmFtZTp4dCgiZmxleCBpdGVtcy1jZW50ZXIgcC02IHB0LTAiLGUpLC4uLnR9KSk7Z0QuZGlzcGxheU5hbWU9IkNhcmRGb290ZXIiOy8qKgogKiBAcmVtaXgtcnVuL3JvdXRlciB2MS4xMy4wCiAqCiAqIENvcHlyaWdodCAoYykgUmVtaXggU29mdHdhcmUgSW5jLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICogTElDRU5TRS5tZCBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogKgogKiBAbGljZW5zZSBNSVQKICovZnVuY3Rpb24geXQoKXtyZXR1cm4geXQ9T2JqZWN0LmFzc2lnbj9PYmplY3QuYXNzaWduLmJpbmQoKTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJihlW3JdPW5bcl0pfXJldHVybiBlfSx5dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIHd0OyhmdW5jdGlvbihlKXtlLlBvcD0iUE9QIixlLlB1c2g9IlBVU0giLGUuUmVwbGFjZT0iUkVQTEFDRSJ9KSh3dHx8KHd0PXt9KSk7Y29uc3Qgbl89InBvcHN0YXRlIjtmdW5jdGlvbiB2RChlKXtlPT09dm9pZCAwJiYoZT17fSk7ZnVuY3Rpb24gdChyLGkpe2xldHtwYXRobmFtZTpvLHNlYXJjaDpsLGhhc2g6c309ci5sb2NhdGlvbjtyZXR1cm4gRXUoIiIse3BhdGhuYW1lOm8sc2VhcmNoOmwsaGFzaDpzfSxpLnN0YXRlJiZpLnN0YXRlLnVzcnx8bnVsbCxpLnN0YXRlJiZpLnN0YXRlLmtleXx8ImRlZmF1bHQiKX1mdW5jdGlvbiBuKHIsaSl7cmV0dXJuIHR5cGVvZiBpPT0ic3RyaW5nIj9pOlZ1KGkpfXJldHVybiB4RCh0LG4sbnVsbCxlKX1mdW5jdGlvbiBPZShlLHQpe2lmKGU9PT0hMXx8ZT09PW51bGx8fHR5cGVvZiBlPiJ1Iil0aHJvdyBuZXcgRXJyb3IodCl9ZnVuY3Rpb24gbmwoZSx0KXtpZighZSl7dHlwZW9mIGNvbnNvbGU8InUiJiZjb25zb2xlLndhcm4odCk7dHJ5e3Rocm93IG5ldyBFcnJvcih0KX1jYXRjaHt9fX1mdW5jdGlvbiB5RCgpe3JldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiw4KX1mdW5jdGlvbiByXyhlLHQpe3JldHVybnt1c3I6ZS5zdGF0ZSxrZXk6ZS5rZXksaWR4OnR9fWZ1bmN0aW9uIEV1KGUsdCxuLHIpe3JldHVybiBuPT09dm9pZCAwJiYobj1udWxsKSx5dCh7cGF0aG5hbWU6dHlwZW9mIGU9PSJzdHJpbmciP2U6ZS5wYXRobmFtZSxzZWFyY2g6IiIsaGFzaDoiIn0sdHlwZW9mIHQ9PSJzdHJpbmciP2tpKHQpOnQse3N0YXRlOm4sa2V5OnQmJnQua2V5fHxyfHx5RCgpfSl9ZnVuY3Rpb24gVnUoZSl7bGV0e3BhdGhuYW1lOnQ9Ii8iLHNlYXJjaDpuPSIiLGhhc2g6cj0iIn09ZTtyZXR1cm4gbiYmbiE9PSI/IiYmKHQrPW4uY2hhckF0KDApPT09Ij8iP246Ij8iK24pLHImJnIhPT0iIyImJih0Kz1yLmNoYXJBdCgwKT09PSIjIj9yOiIjIityKSx0fWZ1bmN0aW9uIGtpKGUpe2xldCB0PXt9O2lmKGUpe2xldCBuPWUuaW5kZXhPZigiIyIpO24+PTAmJih0Lmhhc2g9ZS5zdWJzdHIobiksZT1lLnN1YnN0cigwLG4pKTtsZXQgcj1lLmluZGV4T2YoIj8iKTtyPj0wJiYodC5zZWFyY2g9ZS5zdWJzdHIociksZT1lLnN1YnN0cigwLHIpKSxlJiYodC5wYXRobmFtZT1lKX1yZXR1cm4gdH1mdW5jdGlvbiB4RChlLHQsbixyKXtyPT09dm9pZCAwJiYocj17fSk7bGV0e3dpbmRvdzppPWRvY3VtZW50LmRlZmF1bHRWaWV3LHY1Q29tcGF0Om89ITF9PXIsbD1pLmhpc3Rvcnkscz13dC5Qb3AsYT1udWxsLHU9YygpO3U9PW51bGwmJih1PTAsbC5yZXBsYWNlU3RhdGUoeXQoe30sbC5zdGF0ZSx7aWR4OnV9KSwiIikpO2Z1bmN0aW9uIGMoKXtyZXR1cm4obC5zdGF0ZXx8e2lkeDpudWxsfSkuaWR4fWZ1bmN0aW9uIGQoKXtzPXd0LlBvcDtsZXQgUz1jKCksdj1TPT1udWxsP251bGw6Uy11O3U9UyxhJiZhKHthY3Rpb246cyxsb2NhdGlvbjpnLmxvY2F0aW9uLGRlbHRhOnZ9KX1mdW5jdGlvbiBmKFMsdil7cz13dC5QdXNoO2xldCB5PUV1KGcubG9jYXRpb24sUyx2KTtuJiZuKHksUyksdT1jKCkrMTtsZXQgXz1yXyh5LHUpLHc9Zy5jcmVhdGVIcmVmKHkpO3RyeXtsLnB1c2hTdGF0ZShfLCIiLHcpfWNhdGNoKEUpe2lmKEUgaW5zdGFuY2VvZiBET01FeGNlcHRpb24mJkUubmFtZT09PSJEYXRhQ2xvbmVFcnJvciIpdGhyb3cgRTtpLmxvY2F0aW9uLmFzc2lnbih3KX1vJiZhJiZhKHthY3Rpb246cyxsb2NhdGlvbjpnLmxvY2F0aW9uLGRlbHRhOjF9KX1mdW5jdGlvbiBoKFMsdil7cz13dC5SZXBsYWNlO2xldCB5PUV1KGcubG9jYXRpb24sUyx2KTtuJiZuKHksUyksdT1jKCk7bGV0IF89cl8oeSx1KSx3PWcuY3JlYXRlSHJlZih5KTtsLnJlcGxhY2VTdGF0ZShfLCIiLHcpLG8mJmEmJmEoe2FjdGlvbjpzLGxvY2F0aW9uOmcubG9jYXRpb24sZGVsdGE6MH0pfWZ1bmN0aW9uIG0oUyl7bGV0IHY9aS5sb2NhdGlvbi5vcmlnaW4hPT0ibnVsbCI/aS5sb2NhdGlvbi5vcmlnaW46aS5sb2NhdGlvbi5ocmVmLHk9dHlwZW9mIFM9PSJzdHJpbmciP1M6VnUoUyk7cmV0dXJuIE9lKHYsIk5vIHdpbmRvdy5sb2NhdGlvbi4ob3JpZ2lufGhyZWYpIGF2YWlsYWJsZSB0byBjcmVhdGUgVVJMIGZvciBocmVmOiAiK3kpLG5ldyBVUkwoeSx2KX1sZXQgZz17Z2V0IGFjdGlvbigpe3JldHVybiBzfSxnZXQgbG9jYXRpb24oKXtyZXR1cm4gZShpLGwpfSxsaXN0ZW4oUyl7aWYoYSl0aHJvdyBuZXcgRXJyb3IoIkEgaGlzdG9yeSBvbmx5IGFjY2VwdHMgb25lIGFjdGl2ZSBsaXN0ZW5lciIpO3JldHVybiBpLmFkZEV2ZW50TGlzdGVuZXIobl8sZCksYT1TLCgpPT57aS5yZW1vdmVFdmVudExpc3RlbmVyKG5fLGQpLGE9bnVsbH19LGNyZWF0ZUhyZWYoUyl7cmV0dXJuIHQoaSxTKX0sY3JlYXRlVVJMOm0sZW5jb2RlTG9jYXRpb24oUyl7bGV0IHY9bShTKTtyZXR1cm57cGF0aG5hbWU6di5wYXRobmFtZSxzZWFyY2g6di5zZWFyY2gsaGFzaDp2Lmhhc2h9fSxwdXNoOmYscmVwbGFjZTpoLGdvKFMpe3JldHVybiBsLmdvKFMpfX07cmV0dXJuIGd9dmFyIFN0OyhmdW5jdGlvbihlKXtlLmRhdGE9ImRhdGEiLGUuZGVmZXJyZWQ9ImRlZmVycmVkIixlLnJlZGlyZWN0PSJyZWRpcmVjdCIsZS5lcnJvcj0iZXJyb3IifSkoU3R8fChTdD17fSkpO2NvbnN0IF9EPW5ldyBTZXQoWyJsYXp5IiwiY2FzZVNlbnNpdGl2ZSIsInBhdGgiLCJpZCIsImluZGV4IiwiY2hpbGRyZW4iXSk7ZnVuY3Rpb24gd0QoZSl7cmV0dXJuIGUuaW5kZXg9PT0hMH1mdW5jdGlvbiBIbShlLHQsbixyKXtyZXR1cm4gbj09PXZvaWQgMCYmKG49W10pLHI9PT12b2lkIDAmJihyPXt9KSxlLm1hcCgoaSxvKT0+e2xldCBsPVsuLi5uLG9dLHM9dHlwZW9mIGkuaWQ9PSJzdHJpbmciP2kuaWQ6bC5qb2luKCItIik7aWYoT2UoaS5pbmRleCE9PSEwfHwhaS5jaGlsZHJlbiwiQ2Fubm90IHNwZWNpZnkgY2hpbGRyZW4gb24gYW4gaW5kZXggcm91dGUiKSxPZSghcltzXSwnRm91bmQgYSByb3V0ZSBpZCBjb2xsaXNpb24gb24gaWQgIicrcytgIi4gIFJvdXRlIGlkJ3MgbXVzdCBiZSBnbG9iYWxseSB1bmlxdWUgd2l0aGluIERhdGEgUm91dGVyIHVzYWdlc2ApLHdEKGkpKXtsZXQgYT15dCh7fSxpLHQoaSkse2lkOnN9KTtyZXR1cm4gcltzXT1hLGF9ZWxzZXtsZXQgYT15dCh7fSxpLHQoaSkse2lkOnMsY2hpbGRyZW46dm9pZCAwfSk7cmV0dXJuIHJbc109YSxpLmNoaWxkcmVuJiYoYS5jaGlsZHJlbj1IbShpLmNoaWxkcmVuLHQsbCxyKSksYX19KX1mdW5jdGlvbiBCbChlLHQsbil7bj09PXZvaWQgMCYmKG49Ii8iKTtsZXQgcj10eXBlb2YgdD09InN0cmluZyI/a2kodCk6dCxpPUh1KHIucGF0aG5hbWV8fCIvIixuKTtpZihpPT1udWxsKXJldHVybiBudWxsO2xldCBvPU5rKGUpO0VEKG8pO2xldCBsPW51bGw7Zm9yKGxldCBzPTA7bD09bnVsbCYmczxvLmxlbmd0aDsrK3MpbD1QRChvW3NdLEREKGkpKTtyZXR1cm4gbH1mdW5jdGlvbiBTRChlLHQpe2xldHtyb3V0ZTpuLHBhdGhuYW1lOnIscGFyYW1zOml9PWU7cmV0dXJue2lkOm4uaWQscGF0aG5hbWU6cixwYXJhbXM6aSxkYXRhOnRbbi5pZF0saGFuZGxlOm4uaGFuZGxlfX1mdW5jdGlvbiBOayhlLHQsbixyKXt0PT09dm9pZCAwJiYodD1bXSksbj09PXZvaWQgMCYmKG49W10pLHI9PT12b2lkIDAmJihyPSIiKTtsZXQgaT0obyxsLHMpPT57bGV0IGE9e3JlbGF0aXZlUGF0aDpzPT09dm9pZCAwP28ucGF0aHx8IiI6cyxjYXNlU2Vuc2l0aXZlOm8uY2FzZVNlbnNpdGl2ZT09PSEwLGNoaWxkcmVuSW5kZXg6bCxyb3V0ZTpvfTthLnJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCIvIikmJihPZShhLnJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKHIpLCdBYnNvbHV0ZSByb3V0ZSBwYXRoICInK2EucmVsYXRpdmVQYXRoKyciIG5lc3RlZCB1bmRlciBwYXRoICcrKCciJytyKyciIGlzIG5vdCB2YWxpZC4gQW4gYWJzb2x1dGUgY2hpbGQgcm91dGUgcGF0aCAnKSsibXVzdCBzdGFydCB3aXRoIHRoZSBjb21iaW5lZCBwYXRoIG9mIGFsbCBpdHMgcGFyZW50IHJvdXRlcy4iKSxhLnJlbGF0aXZlUGF0aD1hLnJlbGF0aXZlUGF0aC5zbGljZShyLmxlbmd0aCkpO2xldCB1PWVvKFtyLGEucmVsYXRpdmVQYXRoXSksYz1uLmNvbmNhdChhKTtvLmNoaWxkcmVuJiZvLmNoaWxkcmVuLmxlbmd0aD4wJiYoT2Uoby5pbmRleCE9PSEwLCJJbmRleCByb3V0ZXMgbXVzdCBub3QgaGF2ZSBjaGlsZCByb3V0ZXMuIFBsZWFzZSByZW1vdmUgIisoJ2FsbCBjaGlsZCByb3V0ZXMgZnJvbSByb3V0ZSBwYXRoICInK3UrJyIuJykpLE5rKG8uY2hpbGRyZW4sdCxjLHUpKSwhKG8ucGF0aD09bnVsbCYmIW8uaW5kZXgpJiZ0LnB1c2goe3BhdGg6dSxzY29yZTpSRCh1LG8uaW5kZXgpLHJvdXRlc01ldGE6Y30pfTtyZXR1cm4gZS5mb3JFYWNoKChvLGwpPT57dmFyIHM7aWYoby5wYXRoPT09IiJ8fCEoKHM9by5wYXRoKSE9bnVsbCYmcy5pbmNsdWRlcygiPyIpKSlpKG8sbCk7ZWxzZSBmb3IobGV0IGEgb2YgUmsoby5wYXRoKSlpKG8sbCxhKX0pLHR9ZnVuY3Rpb24gUmsoZSl7bGV0IHQ9ZS5zcGxpdCgiLyIpO2lmKHQubGVuZ3RoPT09MClyZXR1cm5bXTtsZXRbbiwuLi5yXT10LGk9bi5lbmRzV2l0aCgiPyIpLG89bi5yZXBsYWNlKC9cPyQvLCIiKTtpZihyLmxlbmd0aD09PTApcmV0dXJuIGk/W28sIiJdOltvXTtsZXQgbD1SayhyLmpvaW4oIi8iKSkscz1bXTtyZXR1cm4gcy5wdXNoKC4uLmwubWFwKGE9PmE9PT0iIj9vOltvLGFdLmpvaW4oIi8iKSkpLGkmJnMucHVzaCguLi5sKSxzLm1hcChhPT5lLnN0YXJ0c1dpdGgoIi8iKSYmYT09PSIiPyIvIjphKX1mdW5jdGlvbiBFRChlKXtlLnNvcnQoKHQsbik9PnQuc2NvcmUhPT1uLnNjb3JlP24uc2NvcmUtdC5zY29yZTpPRCh0LnJvdXRlc01ldGEubWFwKHI9PnIuY2hpbGRyZW5JbmRleCksbi5yb3V0ZXNNZXRhLm1hcChyPT5yLmNoaWxkcmVuSW5kZXgpKSl9Y29uc3QgQ0Q9L146XHcrJC8sa0Q9MywkRD0yLGJEPTEsVEQ9MTAsTkQ9LTIsaV89ZT0+ZT09PSIqIjtmdW5jdGlvbiBSRChlLHQpe2xldCBuPWUuc3BsaXQoIi8iKSxyPW4ubGVuZ3RoO3JldHVybiBuLnNvbWUoaV8pJiYocis9TkQpLHQmJihyKz0kRCksbi5maWx0ZXIoaT0+IWlfKGkpKS5yZWR1Y2UoKGksbyk9PmkrKENELnRlc3Qobyk/a0Q6bz09PSIiP2JEOlREKSxyKX1mdW5jdGlvbiBPRChlLHQpe3JldHVybiBlLmxlbmd0aD09PXQubGVuZ3RoJiZlLnNsaWNlKDAsLTEpLmV2ZXJ5KChyLGkpPT5yPT09dFtpXSk/ZVtlLmxlbmd0aC0xXS10W3QubGVuZ3RoLTFdOjB9ZnVuY3Rpb24gUEQoZSx0KXtsZXR7cm91dGVzTWV0YTpufT1lLHI9e30saT0iLyIsbz1bXTtmb3IobGV0IGw9MDtsPG4ubGVuZ3RoOysrbCl7bGV0IHM9bltsXSxhPWw9PT1uLmxlbmd0aC0xLHU9aT09PSIvIj90OnQuc2xpY2UoaS5sZW5ndGgpfHwiLyIsYz1BRCh7cGF0aDpzLnJlbGF0aXZlUGF0aCxjYXNlU2Vuc2l0aXZlOnMuY2FzZVNlbnNpdGl2ZSxlbmQ6YX0sdSk7aWYoIWMpcmV0dXJuIG51bGw7T2JqZWN0LmFzc2lnbihyLGMucGFyYW1zKTtsZXQgZD1zLnJvdXRlO28ucHVzaCh7cGFyYW1zOnIscGF0aG5hbWU6ZW8oW2ksYy5wYXRobmFtZV0pLHBhdGhuYW1lQmFzZTp6RChlbyhbaSxjLnBhdGhuYW1lQmFzZV0pKSxyb3V0ZTpkfSksYy5wYXRobmFtZUJhc2UhPT0iLyImJihpPWVvKFtpLGMucGF0aG5hbWVCYXNlXSkpfXJldHVybiBvfWZ1bmN0aW9uIEFEKGUsdCl7dHlwZW9mIGU9PSJzdHJpbmciJiYoZT17cGF0aDplLGNhc2VTZW5zaXRpdmU6ITEsZW5kOiEwfSk7bGV0W24scl09TUQoZS5wYXRoLGUuY2FzZVNlbnNpdGl2ZSxlLmVuZCksaT10Lm1hdGNoKG4pO2lmKCFpKXJldHVybiBudWxsO2xldCBvPWlbMF0sbD1vLnJlcGxhY2UoLyguKVwvKyQvLCIkMSIpLHM9aS5zbGljZSgxKTtyZXR1cm57cGFyYW1zOnIucmVkdWNlKCh1LGMsZCk9PntsZXR7cGFyYW1OYW1lOmYsaXNPcHRpb25hbDpofT1jO2lmKGY9PT0iKiIpe2xldCBnPXNbZF18fCIiO2w9by5zbGljZSgwLG8ubGVuZ3RoLWcubGVuZ3RoKS5yZXBsYWNlKC8oLilcLyskLywiJDEiKX1jb25zdCBtPXNbZF07cmV0dXJuIGgmJiFtP3VbZl09dm9pZCAwOnVbZl09SUQobXx8IiIsZiksdX0se30pLHBhdGhuYW1lOm8scGF0aG5hbWVCYXNlOmwscGF0dGVybjplfX1mdW5jdGlvbiBNRChlLHQsbil7dD09PXZvaWQgMCYmKHQ9ITEpLG49PT12b2lkIDAmJihuPSEwKSxubChlPT09IioifHwhZS5lbmRzV2l0aCgiKiIpfHxlLmVuZHNXaXRoKCIvKiIpLCdSb3V0ZSBwYXRoICInK2UrJyIgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIGl0IHdlcmUgJysoJyInK2UucmVwbGFjZSgvXCokLywiLyoiKSsnIiBiZWNhdXNlIHRoZSBgKmAgY2hhcmFjdGVyIG11c3QgJykrImFsd2F5cyBmb2xsb3cgYSBgL2AgaW4gdGhlIHBhdHRlcm4uIFRvIGdldCByaWQgb2YgdGhpcyB3YXJuaW5nLCAiKygncGxlYXNlIGNoYW5nZSB0aGUgcm91dGUgcGF0aCB0byAiJytlLnJlcGxhY2UoL1wqJC8sIi8qIikrJyIuJykpO2xldCByPVtdLGk9Il4iK2UucmVwbGFjZSgvXC8qXCo/JC8sIiIpLnJlcGxhY2UoL15cLyovLCIvIikucmVwbGFjZSgvW1xcLiorXiR7fXwoKVtcXV0vZywiXFwkJiIpLnJlcGxhY2UoL1wvOihcdyspKFw/KT8vZywobCxzLGEpPT4oci5wdXNoKHtwYXJhbU5hbWU6cyxpc09wdGlvbmFsOmEhPW51bGx9KSxhPyIvPyhbXlxcL10rKT8iOiIvKFteXFwvXSspIikpO3JldHVybiBlLmVuZHNXaXRoKCIqIik/KHIucHVzaCh7cGFyYW1OYW1lOiIqIn0pLGkrPWU9PT0iKiJ8fGU9PT0iLyoiPyIoLiopJCI6Iig/OlxcLyguKyl8XFwvKikkIik6bj9pKz0iXFwvKiQiOmUhPT0iIiYmZSE9PSIvIiYmKGkrPSIoPzooPz1cXC98JCkpIiksW25ldyBSZWdFeHAoaSx0P3ZvaWQgMDoiaSIpLHJdfWZ1bmN0aW9uIEREKGUpe3RyeXtyZXR1cm4gZGVjb2RlVVJJKGUpfWNhdGNoKHQpe3JldHVybiBubCghMSwnVGhlIFVSTCBwYXRoICInK2UrJyIgY291bGQgbm90IGJlIGRlY29kZWQgYmVjYXVzZSBpdCBpcyBpcyBhIG1hbGZvcm1lZCBVUkwgc2VnbWVudC4gVGhpcyBpcyBwcm9iYWJseSBkdWUgdG8gYSBiYWQgcGVyY2VudCAnKygiZW5jb2RpbmcgKCIrdCsiKS4iKSksZX19ZnVuY3Rpb24gSUQoZSx0KXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlKX1jYXRjaChuKXtyZXR1cm4gbmwoITEsJ1RoZSB2YWx1ZSBmb3IgdGhlIFVSTCBwYXJhbSAiJyt0KyciIHdpbGwgbm90IGJlIGRlY29kZWQgYmVjYXVzZScrKCcgdGhlIHN0cmluZyAiJytlKyciIGlzIGEgbWFsZm9ybWVkIFVSTCBzZWdtZW50LiBUaGlzIGlzIHByb2JhYmx5JykrKCIgZHVlIHRvIGEgYmFkIHBlcmNlbnQgZW5jb2RpbmcgKCIrbisiKS4iKSksZX19ZnVuY3Rpb24gSHUoZSx0KXtpZih0PT09Ii8iKXJldHVybiBlO2lmKCFlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCh0LnRvTG93ZXJDYXNlKCkpKXJldHVybiBudWxsO2xldCBuPXQuZW5kc1dpdGgoIi8iKT90Lmxlbmd0aC0xOnQubGVuZ3RoLHI9ZS5jaGFyQXQobik7cmV0dXJuIHImJnIhPT0iLyI/bnVsbDplLnNsaWNlKG4pfHwiLyJ9ZnVuY3Rpb24gTEQoZSx0KXt0PT09dm9pZCAwJiYodD0iLyIpO2xldHtwYXRobmFtZTpuLHNlYXJjaDpyPSIiLGhhc2g6aT0iIn09dHlwZW9mIGU9PSJzdHJpbmciP2tpKGUpOmU7cmV0dXJue3BhdGhuYW1lOm4/bi5zdGFydHNXaXRoKCIvIik/bjpqRChuLHQpOnQsc2VhcmNoOkZEKHIpLGhhc2g6QkQoaSl9fWZ1bmN0aW9uIGpEKGUsdCl7bGV0IG49dC5yZXBsYWNlKC9cLyskLywiIikuc3BsaXQoIi8iKTtyZXR1cm4gZS5zcGxpdCgiLyIpLmZvckVhY2goaT0+e2k9PT0iLi4iP24ubGVuZ3RoPjEmJm4ucG9wKCk6aSE9PSIuIiYmbi5wdXNoKGkpfSksbi5sZW5ndGg+MT9uLmpvaW4oIi8iKToiLyJ9ZnVuY3Rpb24gWmgoZSx0LG4scil7cmV0dXJuIkNhbm5vdCBpbmNsdWRlIGEgJyIrZSsiJyBjaGFyYWN0ZXIgaW4gYSBtYW51YWxseSBzcGVjaWZpZWQgIisoImB0by4iK3QrImAgZmllbGQgWyIrSlNPTi5zdHJpbmdpZnkocikrIl0uICBQbGVhc2Ugc2VwYXJhdGUgaXQgb3V0IHRvIHRoZSAiKSsoImB0by4iK24rImAgZmllbGQuIEFsdGVybmF0aXZlbHkgeW91IG1heSBwcm92aWRlIHRoZSBmdWxsIHBhdGggYXMgIikrJ2Egc3RyaW5nIGluIDxMaW5rIHRvPSIuLi4iPiBhbmQgdGhlIHJvdXRlciB3aWxsIHBhcnNlIGl0IGZvciB5b3UuJ31mdW5jdGlvbiBPayhlKXtyZXR1cm4gZS5maWx0ZXIoKHQsbik9Pm49PT0wfHx0LnJvdXRlLnBhdGgmJnQucm91dGUucGF0aC5sZW5ndGg+MCl9ZnVuY3Rpb24gUGsoZSl7cmV0dXJuIE9rKGUpLm1hcCgodCxuKT0+bj09PWUubGVuZ3RoLTE/dC5wYXRobmFtZTp0LnBhdGhuYW1lQmFzZSl9ZnVuY3Rpb24gQWsoZSx0LG4scil7cj09PXZvaWQgMCYmKHI9ITEpO2xldCBpO3R5cGVvZiBlPT0ic3RyaW5nIj9pPWtpKGUpOihpPXl0KHt9LGUpLE9lKCFpLnBhdGhuYW1lfHwhaS5wYXRobmFtZS5pbmNsdWRlcygiPyIpLFpoKCI/IiwicGF0aG5hbWUiLCJzZWFyY2giLGkpKSxPZSghaS5wYXRobmFtZXx8IWkucGF0aG5hbWUuaW5jbHVkZXMoIiMiKSxaaCgiIyIsInBhdGhuYW1lIiwiaGFzaCIsaSkpLE9lKCFpLnNlYXJjaHx8IWkuc2VhcmNoLmluY2x1ZGVzKCIjIiksWmgoIiMiLCJzZWFyY2giLCJoYXNoIixpKSkpO2xldCBvPWU9PT0iInx8aS5wYXRobmFtZT09PSIiLGw9bz8iLyI6aS5wYXRobmFtZSxzO2lmKGw9PW51bGwpcz1uO2Vsc2UgaWYocil7bGV0IGQ9dFt0Lmxlbmd0aC0xXS5yZXBsYWNlKC9eXC8vLCIiKS5zcGxpdCgiLyIpO2lmKGwuc3RhcnRzV2l0aCgiLi4iKSl7bGV0IGY9bC5zcGxpdCgiLyIpO2Zvcig7ZlswXT09PSIuLiI7KWYuc2hpZnQoKSxkLnBvcCgpO2kucGF0aG5hbWU9Zi5qb2luKCIvIil9cz0iLyIrZC5qb2luKCIvIil9ZWxzZXtsZXQgZD10Lmxlbmd0aC0xO2lmKGwuc3RhcnRzV2l0aCgiLi4iKSl7bGV0IGY9bC5zcGxpdCgiLyIpO2Zvcig7ZlswXT09PSIuLiI7KWYuc2hpZnQoKSxkLT0xO2kucGF0aG5hbWU9Zi5qb2luKCIvIil9cz1kPj0wP3RbZF06Ii8ifWxldCBhPUxEKGkscyksdT1sJiZsIT09Ii8iJiZsLmVuZHNXaXRoKCIvIiksYz0ob3x8bD09PSIuIikmJm4uZW5kc1dpdGgoIi8iKTtyZXR1cm4hYS5wYXRobmFtZS5lbmRzV2l0aCgiLyIpJiYodXx8YykmJihhLnBhdGhuYW1lKz0iLyIpLGF9Y29uc3QgZW89ZT0+ZS5qb2luKCIvIikucmVwbGFjZSgvXC9cLysvZywiLyIpLHpEPWU9PmUucmVwbGFjZSgvXC8rJC8sIiIpLnJlcGxhY2UoL15cLyovLCIvIiksRkQ9ZT0+IWV8fGU9PT0iPyI/IiI6ZS5zdGFydHNXaXRoKCI/Iik/ZToiPyIrZSxCRD1lPT4hZXx8ZT09PSIjIj8iIjplLnN0YXJ0c1dpdGgoIiMiKT9lOiIjIitlO2NsYXNzIEd2e2NvbnN0cnVjdG9yKHQsbixyLGkpe2k9PT12b2lkIDAmJihpPSExKSx0aGlzLnN0YXR1cz10LHRoaXMuc3RhdHVzVGV4dD1ufHwiIix0aGlzLmludGVybmFsPWksciBpbnN0YW5jZW9mIEVycm9yPyh0aGlzLmRhdGE9ci50b1N0cmluZygpLHRoaXMuZXJyb3I9cik6dGhpcy5kYXRhPXJ9fWZ1bmN0aW9uIE1rKGUpe3JldHVybiBlIT1udWxsJiZ0eXBlb2YgZS5zdGF0dXM9PSJudW1iZXIiJiZ0eXBlb2YgZS5zdGF0dXNUZXh0PT0ic3RyaW5nIiYmdHlwZW9mIGUuaW50ZXJuYWw9PSJib29sZWFuIiYmImRhdGEiaW4gZX1jb25zdCBEaz1bInBvc3QiLCJwdXQiLCJwYXRjaCIsImRlbGV0ZSJdLFVEPW5ldyBTZXQoRGspLFdEPVsiZ2V0IiwuLi5Ea10sVkQ9bmV3IFNldChXRCksSEQ9bmV3IFNldChbMzAxLDMwMiwzMDMsMzA3LDMwOF0pLEtEPW5ldyBTZXQoWzMwNywzMDhdKSxHaD17c3RhdGU6ImlkbGUiLGxvY2F0aW9uOnZvaWQgMCxmb3JtTWV0aG9kOnZvaWQgMCxmb3JtQWN0aW9uOnZvaWQgMCxmb3JtRW5jVHlwZTp2b2lkIDAsZm9ybURhdGE6dm9pZCAwLGpzb246dm9pZCAwLHRleHQ6dm9pZCAwfSxaRD17c3RhdGU6ImlkbGUiLGRhdGE6dm9pZCAwLGZvcm1NZXRob2Q6dm9pZCAwLGZvcm1BY3Rpb246dm9pZCAwLGZvcm1FbmNUeXBlOnZvaWQgMCxmb3JtRGF0YTp2b2lkIDAsanNvbjp2b2lkIDAsdGV4dDp2b2lkIDB9LHFzPXtzdGF0ZToidW5ibG9ja2VkIixwcm9jZWVkOnZvaWQgMCxyZXNldDp2b2lkIDAsbG9jYXRpb246dm9pZCAwfSxJaz0vXig/OlthLXpdW2EtejAtOSsuLV0qOnxcL1wvKS9pLEdEPWU9Pih7aGFzRXJyb3JCb3VuZGFyeTohIWUuaGFzRXJyb3JCb3VuZGFyeX0pLExrPSJyZW1peC1yb3V0ZXItdHJhbnNpdGlvbnMiO2Z1bmN0aW9uIFlEKGUpe2NvbnN0IHQ9ZS53aW5kb3c/ZS53aW5kb3c6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93OnZvaWQgMCxuPXR5cGVvZiB0PCJ1IiYmdHlwZW9mIHQuZG9jdW1lbnQ8InUiJiZ0eXBlb2YgdC5kb2N1bWVudC5jcmVhdGVFbGVtZW50PCJ1IixyPSFuO09lKGUucm91dGVzLmxlbmd0aD4wLCJZb3UgbXVzdCBwcm92aWRlIGEgbm9uLWVtcHR5IHJvdXRlcyBhcnJheSB0byBjcmVhdGVSb3V0ZXIiKTtsZXQgaTtpZihlLm1hcFJvdXRlUHJvcGVydGllcylpPWUubWFwUm91dGVQcm9wZXJ0aWVzO2Vsc2UgaWYoZS5kZXRlY3RFcnJvckJvdW5kYXJ5KXtsZXQgYj1lLmRldGVjdEVycm9yQm91bmRhcnk7aT1NPT4oe2hhc0Vycm9yQm91bmRhcnk6YihNKX0pfWVsc2UgaT1HRDtsZXQgbz17fSxsPUhtKGUucm91dGVzLGksdm9pZCAwLG8pLHMsYT1lLmJhc2VuYW1lfHwiLyIsdT15dCh7djdfZmV0Y2hlclBlcnNpc3Q6ITEsdjdfbm9ybWFsaXplRm9ybU1ldGhvZDohMSx2N19wcmVwZW5kQmFzZW5hbWU6ITF9LGUuZnV0dXJlKSxjPW51bGwsZD1uZXcgU2V0LGY9bnVsbCxoPW51bGwsbT1udWxsLGc9ZS5oeWRyYXRpb25EYXRhIT1udWxsLFM9QmwobCxlLmhpc3RvcnkubG9jYXRpb24sYSksdj1udWxsO2lmKFM9PW51bGwpe2xldCBiPUduKDQwNCx7cGF0aG5hbWU6ZS5oaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lfSkse21hdGNoZXM6TSxyb3V0ZTp6fT1mXyhsKTtTPU0sdj17W3ouaWRdOmJ9fWxldCB5PSFTLnNvbWUoYj0+Yi5yb3V0ZS5sYXp5KSYmKCFTLnNvbWUoYj0+Yi5yb3V0ZS5sb2FkZXIpfHxlLmh5ZHJhdGlvbkRhdGEhPW51bGwpLF8sdz17aGlzdG9yeUFjdGlvbjplLmhpc3RvcnkuYWN0aW9uLGxvY2F0aW9uOmUuaGlzdG9yeS5sb2NhdGlvbixtYXRjaGVzOlMsaW5pdGlhbGl6ZWQ6eSxuYXZpZ2F0aW9uOkdoLHJlc3RvcmVTY3JvbGxQb3NpdGlvbjplLmh5ZHJhdGlvbkRhdGEhPW51bGw/ITE6bnVsbCxwcmV2ZW50U2Nyb2xsUmVzZXQ6ITEscmV2YWxpZGF0aW9uOiJpZGxlIixsb2FkZXJEYXRhOmUuaHlkcmF0aW9uRGF0YSYmZS5oeWRyYXRpb25EYXRhLmxvYWRlckRhdGF8fHt9LGFjdGlvbkRhdGE6ZS5oeWRyYXRpb25EYXRhJiZlLmh5ZHJhdGlvbkRhdGEuYWN0aW9uRGF0YXx8bnVsbCxlcnJvcnM6ZS5oeWRyYXRpb25EYXRhJiZlLmh5ZHJhdGlvbkRhdGEuZXJyb3JzfHx2LGZldGNoZXJzOm5ldyBNYXAsYmxvY2tlcnM6bmV3IE1hcH0sRT13dC5Qb3AsJD0hMSxDLFQ9ITEsTj1uZXcgTWFwLFI9bnVsbCxEPSExLEY9ITEsc2U9W10sVj1bXSxLPW5ldyBNYXAsTz0wLEE9LTEsaz1uZXcgTWFwLGo9bmV3IFNldCxMPW5ldyBNYXAsWj1uZXcgTWFwLG5lPW5ldyBTZXQsa2U9bmV3IE1hcCx2ZT1uZXcgTWFwLFdlPSExO2Z1bmN0aW9uIEZlKCl7aWYoYz1lLmhpc3RvcnkubGlzdGVuKGI9PntsZXR7YWN0aW9uOk0sbG9jYXRpb246eixkZWx0YTpHfT1iO2lmKFdlKXtXZT0hMTtyZXR1cm59bmwodmUuc2l6ZT09PTB8fEchPW51bGwsIllvdSBhcmUgdHJ5aW5nIHRvIHVzZSBhIGJsb2NrZXIgb24gYSBQT1AgbmF2aWdhdGlvbiB0byBhIGxvY2F0aW9uIHRoYXQgd2FzIG5vdCBjcmVhdGVkIGJ5IEByZW1peC1ydW4vcm91dGVyLiBUaGlzIHdpbGwgZmFpbCBzaWxlbnRseSBpbiBwcm9kdWN0aW9uLiBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IGFyZSBuYXZpZ2F0aW5nIG91dHNpZGUgdGhlIHJvdXRlciB2aWEgYHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZWAvYHdpbmRvdy5sb2NhdGlvbi5oYXNoYCBpbnN0ZWFkIG9mIHVzaW5nIHJvdXRlciBuYXZpZ2F0aW9uIEFQSXMuICBUaGlzIGNhbiBhbHNvIGhhcHBlbiBpZiB5b3UgYXJlIHVzaW5nIGNyZWF0ZUhhc2hSb3V0ZXIgYW5kIHRoZSB1c2VyIG1hbnVhbGx5IGNoYW5nZXMgdGhlIFVSTC4iKTtsZXQgb2U9aXkoe2N1cnJlbnRMb2NhdGlvbjp3LmxvY2F0aW9uLG5leHRMb2NhdGlvbjp6LGhpc3RvcnlBY3Rpb246TX0pO2lmKG9lJiZHIT1udWxsKXtXZT0hMCxlLmhpc3RvcnkuZ28oRyotMSksS3Uob2Use3N0YXRlOiJibG9ja2VkIixsb2NhdGlvbjp6LHByb2NlZWQoKXtLdShvZSx7c3RhdGU6InByb2NlZWRpbmciLHByb2NlZWQ6dm9pZCAwLHJlc2V0OnZvaWQgMCxsb2NhdGlvbjp6fSksZS5oaXN0b3J5LmdvKEcpfSxyZXNldCgpe2xldCAkZT1uZXcgTWFwKHcuYmxvY2tlcnMpOyRlLnNldChvZSxxcyksYmUoe2Jsb2NrZXJzOiRlfSl9fSk7cmV0dXJufXJldHVybiBRZShNLHopfSksbil7bEkodCxOKTtsZXQgYj0oKT0+c0kodCxOKTt0LmFkZEV2ZW50TGlzdGVuZXIoInBhZ2VoaWRlIixiKSxSPSgpPT50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBhZ2VoaWRlIixiKX1yZXR1cm4gdy5pbml0aWFsaXplZHx8UWUod3QuUG9wLHcubG9jYXRpb24pLF99ZnVuY3Rpb24gdGUoKXtjJiZjKCksUiYmUigpLGQuY2xlYXIoKSxDJiZDLmFib3J0KCksdy5mZXRjaGVycy5mb3JFYWNoKChiLE0pPT5QbihNKSksdy5ibG9ja2Vycy5mb3JFYWNoKChiLE0pPT5yeShNKSl9ZnVuY3Rpb24gTGUoYil7cmV0dXJuIGQuYWRkKGIpLCgpPT5kLmRlbGV0ZShiKX1mdW5jdGlvbiBiZShiLE0pe009PT12b2lkIDAmJihNPXt9KSx3PXl0KHt9LHcsYik7bGV0IHo9W10sRz1bXTt1LnY3X2ZldGNoZXJQZXJzaXN0JiZ3LmZldGNoZXJzLmZvckVhY2goKG9lLCRlKT0+e29lLnN0YXRlPT09ImlkbGUiJiYobmUuaGFzKCRlKT9HLnB1c2goJGUpOnoucHVzaCgkZSkpfSksWy4uLmRdLmZvckVhY2gob2U9Pm9lKHcse2RlbGV0ZWRGZXRjaGVyczpHLHVuc3RhYmxlX3ZpZXdUcmFuc2l0aW9uT3B0czpNLnZpZXdUcmFuc2l0aW9uT3B0cyx1bnN0YWJsZV9mbHVzaFN5bmM6TS5mbHVzaFN5bmM9PT0hMH0pKSx1LnY3X2ZldGNoZXJQZXJzaXN0JiYoei5mb3JFYWNoKG9lPT53LmZldGNoZXJzLmRlbGV0ZShvZSkpLEcuZm9yRWFjaChvZT0+UG4ob2UpKSl9ZnVuY3Rpb24gUmUoYixNLHope3ZhciBHLG9lO2xldHtmbHVzaFN5bmM6JGV9PXo9PT12b2lkIDA/e306eixoZT13LmFjdGlvbkRhdGEhPW51bGwmJncubmF2aWdhdGlvbi5mb3JtTWV0aG9kIT1udWxsJiZ2cih3Lm5hdmlnYXRpb24uZm9ybU1ldGhvZCkmJncubmF2aWdhdGlvbi5zdGF0ZT09PSJsb2FkaW5nIiYmKChHPWIuc3RhdGUpPT1udWxsP3ZvaWQgMDpHLl9pc1JlZGlyZWN0KSE9PSEwLGZlO00uYWN0aW9uRGF0YT9PYmplY3Qua2V5cyhNLmFjdGlvbkRhdGEpLmxlbmd0aD4wP2ZlPU0uYWN0aW9uRGF0YTpmZT1udWxsOmhlP2ZlPXcuYWN0aW9uRGF0YTpmZT1udWxsO2xldCBhZT1NLmxvYWRlckRhdGE/ZF8ody5sb2FkZXJEYXRhLE0ubG9hZGVyRGF0YSxNLm1hdGNoZXN8fFtdLE0uZXJyb3JzKTp3LmxvYWRlckRhdGEsQWU9dy5ibG9ja2VycztBZS5zaXplPjAmJihBZT1uZXcgTWFwKEFlKSxBZS5mb3JFYWNoKChaZSx1dCk9PkFlLnNldCh1dCxxcykpKTtsZXQgVnQ9JD09PSEwfHx3Lm5hdmlnYXRpb24uZm9ybU1ldGhvZCE9bnVsbCYmdnIody5uYXZpZ2F0aW9uLmZvcm1NZXRob2QpJiYoKG9lPWIuc3RhdGUpPT1udWxsP3ZvaWQgMDpvZS5faXNSZWRpcmVjdCkhPT0hMDtzJiYobD1zLHM9dm9pZCAwKSxEfHxFPT09d3QuUG9wfHwoRT09PXd0LlB1c2g/ZS5oaXN0b3J5LnB1c2goYixiLnN0YXRlKTpFPT09d3QuUmVwbGFjZSYmZS5oaXN0b3J5LnJlcGxhY2UoYixiLnN0YXRlKSk7bGV0IFRlO2lmKEU9PT13dC5Qb3Ape2xldCBaZT1OLmdldCh3LmxvY2F0aW9uLnBhdGhuYW1lKTtaZSYmWmUuaGFzKGIucGF0aG5hbWUpP1RlPXtjdXJyZW50TG9jYXRpb246dy5sb2NhdGlvbixuZXh0TG9jYXRpb246Yn06Ti5oYXMoYi5wYXRobmFtZSkmJihUZT17Y3VycmVudExvY2F0aW9uOmIsbmV4dExvY2F0aW9uOncubG9jYXRpb259KX1lbHNlIGlmKFQpe2xldCBaZT1OLmdldCh3LmxvY2F0aW9uLnBhdGhuYW1lKTtaZT9aZS5hZGQoYi5wYXRobmFtZSk6KFplPW5ldyBTZXQoW2IucGF0aG5hbWVdKSxOLnNldCh3LmxvY2F0aW9uLnBhdGhuYW1lLFplKSksVGU9e2N1cnJlbnRMb2NhdGlvbjp3LmxvY2F0aW9uLG5leHRMb2NhdGlvbjpifX1iZSh5dCh7fSxNLHthY3Rpb25EYXRhOmZlLGxvYWRlckRhdGE6YWUsaGlzdG9yeUFjdGlvbjpFLGxvY2F0aW9uOmIsaW5pdGlhbGl6ZWQ6ITAsbmF2aWdhdGlvbjpHaCxyZXZhbGlkYXRpb246ImlkbGUiLHJlc3RvcmVTY3JvbGxQb3NpdGlvbjpseShiLE0ubWF0Y2hlc3x8dy5tYXRjaGVzKSxwcmV2ZW50U2Nyb2xsUmVzZXQ6VnQsYmxvY2tlcnM6QWV9KSx7dmlld1RyYW5zaXRpb25PcHRzOlRlLGZsdXNoU3luYzokZT09PSEwfSksRT13dC5Qb3AsJD0hMSxUPSExLEQ9ITEsRj0hMSxzZT1bXSxWPVtdfWFzeW5jIGZ1bmN0aW9uIFNlKGIsTSl7aWYodHlwZW9mIGI9PSJudW1iZXIiKXtlLmhpc3RvcnkuZ28oYik7cmV0dXJufWxldCB6PUttKHcubG9jYXRpb24sdy5tYXRjaGVzLGEsdS52N19wcmVwZW5kQmFzZW5hbWUsYixNPT1udWxsP3ZvaWQgMDpNLmZyb21Sb3V0ZUlkLE09PW51bGw/dm9pZCAwOk0ucmVsYXRpdmUpLHtwYXRoOkcsc3VibWlzc2lvbjpvZSxlcnJvcjokZX09b18odS52N19ub3JtYWxpemVGb3JtTWV0aG9kLCExLHosTSksaGU9dy5sb2NhdGlvbixmZT1FdSh3LmxvY2F0aW9uLEcsTSYmTS5zdGF0ZSk7ZmU9eXQoe30sZmUsZS5oaXN0b3J5LmVuY29kZUxvY2F0aW9uKGZlKSk7bGV0IGFlPU0mJk0ucmVwbGFjZSE9bnVsbD9NLnJlcGxhY2U6dm9pZCAwLEFlPXd0LlB1c2g7YWU9PT0hMD9BZT13dC5SZXBsYWNlOmFlPT09ITF8fG9lIT1udWxsJiZ2cihvZS5mb3JtTWV0aG9kKSYmb2UuZm9ybUFjdGlvbj09PXcubG9jYXRpb24ucGF0aG5hbWUrdy5sb2NhdGlvbi5zZWFyY2gmJihBZT13dC5SZXBsYWNlKTtsZXQgVnQ9TSYmInByZXZlbnRTY3JvbGxSZXNldCJpbiBNP00ucHJldmVudFNjcm9sbFJlc2V0PT09ITA6dm9pZCAwLFRlPShNJiZNLnVuc3RhYmxlX2ZsdXNoU3luYyk9PT0hMCxaZT1peSh7Y3VycmVudExvY2F0aW9uOmhlLG5leHRMb2NhdGlvbjpmZSxoaXN0b3J5QWN0aW9uOkFlfSk7aWYoWmUpe0t1KFplLHtzdGF0ZToiYmxvY2tlZCIsbG9jYXRpb246ZmUscHJvY2VlZCgpe0t1KFplLHtzdGF0ZToicHJvY2VlZGluZyIscHJvY2VlZDp2b2lkIDAscmVzZXQ6dm9pZCAwLGxvY2F0aW9uOmZlfSksU2UoYixNKX0scmVzZXQoKXtsZXQgdXQ9bmV3IE1hcCh3LmJsb2NrZXJzKTt1dC5zZXQoWmUscXMpLGJlKHtibG9ja2Vyczp1dH0pfX0pO3JldHVybn1yZXR1cm4gYXdhaXQgUWUoQWUsZmUse3N1Ym1pc3Npb246b2UscGVuZGluZ0Vycm9yOiRlLHByZXZlbnRTY3JvbGxSZXNldDpWdCxyZXBsYWNlOk0mJk0ucmVwbGFjZSxlbmFibGVWaWV3VHJhbnNpdGlvbjpNJiZNLnVuc3RhYmxlX3ZpZXdUcmFuc2l0aW9uLGZsdXNoU3luYzpUZX0pfWZ1bmN0aW9uIERlKCl7aWYoRW4oKSxiZSh7cmV2YWxpZGF0aW9uOiJsb2FkaW5nIn0pLHcubmF2aWdhdGlvbi5zdGF0ZSE9PSJzdWJtaXR0aW5nIil7aWYody5uYXZpZ2F0aW9uLnN0YXRlPT09ImlkbGUiKXtRZSh3Lmhpc3RvcnlBY3Rpb24sdy5sb2NhdGlvbix7c3RhcnRVbmludGVycnVwdGVkUmV2YWxpZGF0aW9uOiEwfSk7cmV0dXJufVFlKEV8fHcuaGlzdG9yeUFjdGlvbix3Lm5hdmlnYXRpb24ubG9jYXRpb24se292ZXJyaWRlTmF2aWdhdGlvbjp3Lm5hdmlnYXRpb259KX19YXN5bmMgZnVuY3Rpb24gUWUoYixNLHope0MmJkMuYWJvcnQoKSxDPW51bGwsRT1iLEQ9KHomJnouc3RhcnRVbmludGVycnVwdGVkUmV2YWxpZGF0aW9uKT09PSEwLHAkKHcubG9jYXRpb24sdy5tYXRjaGVzKSwkPSh6JiZ6LnByZXZlbnRTY3JvbGxSZXNldCk9PT0hMCxUPSh6JiZ6LmVuYWJsZVZpZXdUcmFuc2l0aW9uKT09PSEwO2xldCBHPXN8fGwsb2U9eiYmei5vdmVycmlkZU5hdmlnYXRpb24sJGU9QmwoRyxNLGEpLGhlPSh6JiZ6LmZsdXNoU3luYyk9PT0hMDtpZighJGUpe2xldCB1dD1Hbig0MDQse3BhdGhuYW1lOk0ucGF0aG5hbWV9KSx7bWF0Y2hlczphbixyb3V0ZTpScn09Zl8oRyk7UWYoKSxSZShNLHttYXRjaGVzOmFuLGxvYWRlckRhdGE6e30sZXJyb3JzOntbUnIuaWRdOnV0fX0se2ZsdXNoU3luYzpoZX0pO3JldHVybn1pZih3LmluaXRpYWxpemVkJiYhRiYmZUkody5sb2NhdGlvbixNKSYmISh6JiZ6LnN1Ym1pc3Npb24mJnZyKHouc3VibWlzc2lvbi5mb3JtTWV0aG9kKSkpe1JlKE0se21hdGNoZXM6JGV9LHtmbHVzaFN5bmM6aGV9KTtyZXR1cm59Qz1uZXcgQWJvcnRDb250cm9sbGVyO2xldCBmZT10YShlLmhpc3RvcnksTSxDLnNpZ25hbCx6JiZ6LnN1Ym1pc3Npb24pLGFlLEFlO2lmKHomJnoucGVuZGluZ0Vycm9yKUFlPXtbUGEoJGUpLnJvdXRlLmlkXTp6LnBlbmRpbmdFcnJvcn07ZWxzZSBpZih6JiZ6LnN1Ym1pc3Npb24mJnZyKHouc3VibWlzc2lvbi5mb3JtTWV0aG9kKSl7bGV0IHV0PWF3YWl0IFd0KGZlLE0sei5zdWJtaXNzaW9uLCRlLHtyZXBsYWNlOnoucmVwbGFjZSxmbHVzaFN5bmM6aGV9KTtpZih1dC5zaG9ydENpcmN1aXRlZClyZXR1cm47YWU9dXQucGVuZGluZ0FjdGlvbkRhdGEsQWU9dXQucGVuZGluZ0FjdGlvbkVycm9yLG9lPVloKE0sei5zdWJtaXNzaW9uKSxoZT0hMSxmZT1uZXcgUmVxdWVzdChmZS51cmwse3NpZ25hbDpmZS5zaWduYWx9KX1sZXR7c2hvcnRDaXJjdWl0ZWQ6VnQsbG9hZGVyRGF0YTpUZSxlcnJvcnM6WmV9PWF3YWl0IFNuKGZlLE0sJGUsb2UseiYmei5zdWJtaXNzaW9uLHomJnouZmV0Y2hlclN1Ym1pc3Npb24seiYmei5yZXBsYWNlLGhlLGFlLEFlKTtWdHx8KEM9bnVsbCxSZShNLHl0KHttYXRjaGVzOiRlfSxhZT97YWN0aW9uRGF0YTphZX06e30se2xvYWRlckRhdGE6VGUsZXJyb3JzOlplfSkpKX1hc3luYyBmdW5jdGlvbiBXdChiLE0seixHLG9lKXtvZT09PXZvaWQgMCYmKG9lPXt9KSxFbigpO2xldCAkZT1pSShNLHopO2JlKHtuYXZpZ2F0aW9uOiRlfSx7Zmx1c2hTeW5jOm9lLmZsdXNoU3luYz09PSEwfSk7bGV0IGhlLGZlPUdtKEcsTSk7aWYoIWZlLnJvdXRlLmFjdGlvbiYmIWZlLnJvdXRlLmxhenkpaGU9e3R5cGU6U3QuZXJyb3IsZXJyb3I6R24oNDA1LHttZXRob2Q6Yi5tZXRob2QscGF0aG5hbWU6TS5wYXRobmFtZSxyb3V0ZUlkOmZlLnJvdXRlLmlkfSl9O2Vsc2UgaWYoaGU9YXdhaXQgZWEoImFjdGlvbiIsYixmZSxHLG8saSxhKSxiLnNpZ25hbC5hYm9ydGVkKXJldHVybntzaG9ydENpcmN1aXRlZDohMH07aWYocWwoaGUpKXtsZXQgYWU7cmV0dXJuIG9lJiZvZS5yZXBsYWNlIT1udWxsP2FlPW9lLnJlcGxhY2U6YWU9aGUubG9jYXRpb249PT13LmxvY2F0aW9uLnBhdGhuYW1lK3cubG9jYXRpb24uc2VhcmNoLGF3YWl0IGF0KHcsaGUse3N1Ym1pc3Npb246eixyZXBsYWNlOmFlfSkse3Nob3J0Q2lyY3VpdGVkOiEwfX1pZihBYShoZSkpe2xldCBhZT1QYShHLGZlLnJvdXRlLmlkKTtyZXR1cm4ob2UmJm9lLnJlcGxhY2UpIT09ITAmJihFPXd0LlB1c2gpLHtwZW5kaW5nQWN0aW9uRGF0YTp7fSxwZW5kaW5nQWN0aW9uRXJyb3I6e1thZS5yb3V0ZS5pZF06aGUuZXJyb3J9fX1pZihEbyhoZSkpdGhyb3cgR24oNDAwLHt0eXBlOiJkZWZlci1hY3Rpb24ifSk7cmV0dXJue3BlbmRpbmdBY3Rpb25EYXRhOntbZmUucm91dGUuaWRdOmhlLmRhdGF9fX1hc3luYyBmdW5jdGlvbiBTbihiLE0seixHLG9lLCRlLGhlLGZlLGFlLEFlKXtsZXQgVnQ9R3x8WWgoTSxvZSksVGU9b2V8fCRlfHxtXyhWdCksWmU9c3x8bCxbdXQsYW5dPWxfKGUuaGlzdG9yeSx3LHosVGUsTSxGLHNlLFYsbmUsTCxqLFplLGEsYWUsQWUpO2lmKFFmKEdlPT4hKHomJnouc29tZShabj0+Wm4ucm91dGUuaWQ9PT1HZSkpfHx1dCYmdXQuc29tZShabj0+Wm4ucm91dGUuaWQ9PT1HZSkpLEE9KytPLHV0Lmxlbmd0aD09PTAmJmFuLmxlbmd0aD09PTApe2xldCBHZT1FbygpO3JldHVybiBSZShNLHl0KHttYXRjaGVzOnosbG9hZGVyRGF0YTp7fSxlcnJvcnM6QWV8fG51bGx9LGFlP3thY3Rpb25EYXRhOmFlfTp7fSxHZT97ZmV0Y2hlcnM6bmV3IE1hcCh3LmZldGNoZXJzKX06e30pLHtmbHVzaFN5bmM6ZmV9KSx7c2hvcnRDaXJjdWl0ZWQ6ITB9fWlmKCFEKXthbi5mb3JFYWNoKFpuPT57bGV0IGt0PXcuZmV0Y2hlcnMuZ2V0KFpuLmtleSksQ289bmEodm9pZCAwLGt0P2t0LmRhdGE6dm9pZCAwKTt3LmZldGNoZXJzLnNldChabi5rZXksQ28pfSk7bGV0IEdlPWFlfHx3LmFjdGlvbkRhdGE7YmUoeXQoe25hdmlnYXRpb246VnR9LEdlP09iamVjdC5rZXlzKEdlKS5sZW5ndGg9PT0wP3thY3Rpb25EYXRhOm51bGx9OnthY3Rpb25EYXRhOkdlfTp7fSxhbi5sZW5ndGg+MD97ZmV0Y2hlcnM6bmV3IE1hcCh3LmZldGNoZXJzKX06e30pLHtmbHVzaFN5bmM6ZmV9KX1hbi5mb3JFYWNoKEdlPT57Sy5oYXMoR2Uua2V5KSYmZ3QoR2Uua2V5KSxHZS5jb250cm9sbGVyJiZLLnNldChHZS5rZXksR2UuY29udHJvbGxlcil9KTtsZXQgUnI9KCk9PmFuLmZvckVhY2goR2U9Pmd0KEdlLmtleSkpO0MmJkMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixScik7bGV0e3Jlc3VsdHM6anMsbG9hZGVyUmVzdWx0czpKZixmZXRjaGVyUmVzdWx0czpmbH09YXdhaXQgbG4ody5tYXRjaGVzLHosdXQsYW4sYik7aWYoYi5zaWduYWwuYWJvcnRlZClyZXR1cm57c2hvcnRDaXJjdWl0ZWQ6ITB9O0MmJkMuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixSciksYW4uZm9yRWFjaChHZT0+Sy5kZWxldGUoR2Uua2V5KSk7bGV0IGNyPWhfKGpzKTtpZihjcil7aWYoY3IuaWR4Pj11dC5sZW5ndGgpe2xldCBHZT1hbltjci5pZHgtdXQubGVuZ3RoXS5rZXk7ai5hZGQoR2UpfXJldHVybiBhd2FpdCBhdCh3LGNyLnJlc3VsdCx7cmVwbGFjZTpoZX0pLHtzaG9ydENpcmN1aXRlZDohMH19bGV0e2xvYWRlckRhdGE6WnUsZXJyb3JzOnFmfT1jXyh3LHosdXQsSmYsQWUsYW4sZmwsa2UpO2tlLmZvckVhY2goKEdlLFpuKT0+e0dlLnN1YnNjcmliZShrdD0+eyhrdHx8R2UuZG9uZSkmJmtlLmRlbGV0ZShabil9KX0pO2xldCBlaD1FbygpLHRoPUxzKEEpLGhsPWVofHx0aHx8YW4ubGVuZ3RoPjA7cmV0dXJuIHl0KHtsb2FkZXJEYXRhOlp1LGVycm9yczpxZn0saGw/e2ZldGNoZXJzOm5ldyBNYXAody5mZXRjaGVycyl9Ont9KX1mdW5jdGlvbiB1cihiLE0seixHKXtpZihyKXRocm93IG5ldyBFcnJvcigicm91dGVyLmZldGNoKCkgd2FzIGNhbGxlZCBkdXJpbmcgdGhlIHNlcnZlciByZW5kZXIsIGJ1dCBpdCBzaG91bGRuJ3QgYmUuIFlvdSBhcmUgbGlrZWx5IGNhbGxpbmcgYSB1c2VGZXRjaGVyKCkgbWV0aG9kIGluIHRoZSBib2R5IG9mIHlvdXIgY29tcG9uZW50LiBUcnkgbW92aW5nIGl0IHRvIGEgdXNlRWZmZWN0IG9yIGEgY2FsbGJhY2suIik7Sy5oYXMoYikmJmd0KGIpO2xldCBvZT0oRyYmRy51bnN0YWJsZV9mbHVzaFN5bmMpPT09ITAsJGU9c3x8bCxoZT1LbSh3LmxvY2F0aW9uLHcubWF0Y2hlcyxhLHUudjdfcHJlcGVuZEJhc2VuYW1lLHosTSxHPT1udWxsP3ZvaWQgMDpHLnJlbGF0aXZlKSxmZT1CbCgkZSxoZSxhKTtpZighZmUpe0F0KGIsTSxHbig0MDQse3BhdGhuYW1lOmhlfSkse2ZsdXNoU3luYzpvZX0pO3JldHVybn1sZXR7cGF0aDphZSxzdWJtaXNzaW9uOkFlLGVycm9yOlZ0fT1vXyh1LnY3X25vcm1hbGl6ZUZvcm1NZXRob2QsITAsaGUsRyk7aWYoVnQpe0F0KGIsTSxWdCx7Zmx1c2hTeW5jOm9lfSk7cmV0dXJufWxldCBUZT1HbShmZSxhZSk7aWYoJD0oRyYmRy5wcmV2ZW50U2Nyb2xsUmVzZXQpPT09ITAsQWUmJnZyKEFlLmZvcm1NZXRob2QpKXtqZShiLE0sYWUsVGUsZmUsb2UsQWUpO3JldHVybn1MLnNldChiLHtyb3V0ZUlkOk0scGF0aDphZX0pLFR0KGIsTSxhZSxUZSxmZSxvZSxBZSl9YXN5bmMgZnVuY3Rpb24gamUoYixNLHosRyxvZSwkZSxoZSl7aWYoRW4oKSxMLmRlbGV0ZShiKSwhRy5yb3V0ZS5hY3Rpb24mJiFHLnJvdXRlLmxhenkpe2xldCBrdD1Hbig0MDUse21ldGhvZDpoZS5mb3JtTWV0aG9kLHBhdGhuYW1lOnoscm91dGVJZDpNfSk7QXQoYixNLGt0LHtmbHVzaFN5bmM6JGV9KTtyZXR1cm59bGV0IGZlPXcuZmV0Y2hlcnMuZ2V0KGIpO190KGIsb0koaGUsZmUpLHtmbHVzaFN5bmM6JGV9KTtsZXQgYWU9bmV3IEFib3J0Q29udHJvbGxlcixBZT10YShlLmhpc3RvcnkseixhZS5zaWduYWwsaGUpO0suc2V0KGIsYWUpO2xldCBWdD1PLFRlPWF3YWl0IGVhKCJhY3Rpb24iLEFlLEcsb2UsbyxpLGEpO2lmKEFlLnNpZ25hbC5hYm9ydGVkKXtLLmdldChiKT09PWFlJiZLLmRlbGV0ZShiKTtyZXR1cm59aWYobmUuaGFzKGIpKXtfdChiLFBpKHZvaWQgMCkpO3JldHVybn1pZihxbChUZSkpaWYoSy5kZWxldGUoYiksQT5WdCl7X3QoYixQaSh2b2lkIDApKTtyZXR1cm59ZWxzZSByZXR1cm4gai5hZGQoYiksX3QoYixuYShoZSkpLGF0KHcsVGUse2ZldGNoZXJTdWJtaXNzaW9uOmhlfSk7aWYoQWEoVGUpKXtBdChiLE0sVGUuZXJyb3IpO3JldHVybn1pZihEbyhUZSkpdGhyb3cgR24oNDAwLHt0eXBlOiJkZWZlci1hY3Rpb24ifSk7bGV0IFplPXcubmF2aWdhdGlvbi5sb2NhdGlvbnx8dy5sb2NhdGlvbix1dD10YShlLmhpc3RvcnksWmUsYWUuc2lnbmFsKSxhbj1zfHxsLFJyPXcubmF2aWdhdGlvbi5zdGF0ZSE9PSJpZGxlIj9CbChhbix3Lm5hdmlnYXRpb24ubG9jYXRpb24sYSk6dy5tYXRjaGVzO09lKFJyLCJEaWRuJ3QgZmluZCBhbnkgbWF0Y2hlcyBhZnRlciBmZXRjaGVyIGFjdGlvbiIpO2xldCBqcz0rK087ay5zZXQoYixqcyk7bGV0IEpmPW5hKGhlLFRlLmRhdGEpO3cuZmV0Y2hlcnMuc2V0KGIsSmYpO2xldFtmbCxjcl09bF8oZS5oaXN0b3J5LHcsUnIsaGUsWmUsRixzZSxWLG5lLEwsaixhbixhLHtbRy5yb3V0ZS5pZF06VGUuZGF0YX0sdm9pZCAwKTtjci5maWx0ZXIoa3Q9Pmt0LmtleSE9PWIpLmZvckVhY2goa3Q9PntsZXQgQ289a3Qua2V5LHN5PXcuZmV0Y2hlcnMuZ2V0KENvKSxnJD1uYSh2b2lkIDAsc3k/c3kuZGF0YTp2b2lkIDApO3cuZmV0Y2hlcnMuc2V0KENvLGckKSxLLmhhcyhDbykmJmd0KENvKSxrdC5jb250cm9sbGVyJiZLLnNldChDbyxrdC5jb250cm9sbGVyKX0pLGJlKHtmZXRjaGVyczpuZXcgTWFwKHcuZmV0Y2hlcnMpfSk7bGV0IFp1PSgpPT5jci5mb3JFYWNoKGt0PT5ndChrdC5rZXkpKTthZS5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLFp1KTtsZXR7cmVzdWx0czpxZixsb2FkZXJSZXN1bHRzOmVoLGZldGNoZXJSZXN1bHRzOnRofT1hd2FpdCBsbih3Lm1hdGNoZXMsUnIsZmwsY3IsdXQpO2lmKGFlLnNpZ25hbC5hYm9ydGVkKXJldHVybjthZS5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLFp1KSxrLmRlbGV0ZShiKSxLLmRlbGV0ZShiKSxjci5mb3JFYWNoKGt0PT5LLmRlbGV0ZShrdC5rZXkpKTtsZXQgaGw9aF8ocWYpO2lmKGhsKXtpZihobC5pZHg+PWZsLmxlbmd0aCl7bGV0IGt0PWNyW2hsLmlkeC1mbC5sZW5ndGhdLmtleTtqLmFkZChrdCl9cmV0dXJuIGF0KHcsaGwucmVzdWx0KX1sZXR7bG9hZGVyRGF0YTpHZSxlcnJvcnM6Wm59PWNfKHcsdy5tYXRjaGVzLGZsLGVoLHZvaWQgMCxjcix0aCxrZSk7aWYody5mZXRjaGVycy5oYXMoYikpe2xldCBrdD1QaShUZS5kYXRhKTt3LmZldGNoZXJzLnNldChiLGt0KX1Mcyhqcyksdy5uYXZpZ2F0aW9uLnN0YXRlPT09ImxvYWRpbmciJiZqcz5BPyhPZShFLCJFeHBlY3RlZCBwZW5kaW5nIGFjdGlvbiIpLEMmJkMuYWJvcnQoKSxSZSh3Lm5hdmlnYXRpb24ubG9jYXRpb24se21hdGNoZXM6UnIsbG9hZGVyRGF0YTpHZSxlcnJvcnM6Wm4sZmV0Y2hlcnM6bmV3IE1hcCh3LmZldGNoZXJzKX0pKTooYmUoe2Vycm9yczpabixsb2FkZXJEYXRhOmRfKHcubG9hZGVyRGF0YSxHZSxScixabiksZmV0Y2hlcnM6bmV3IE1hcCh3LmZldGNoZXJzKX0pLEY9ITEpfWFzeW5jIGZ1bmN0aW9uIFR0KGIsTSx6LEcsb2UsJGUsaGUpe2xldCBmZT13LmZldGNoZXJzLmdldChiKTtfdChiLG5hKGhlLGZlP2ZlLmRhdGE6dm9pZCAwKSx7Zmx1c2hTeW5jOiRlfSk7bGV0IGFlPW5ldyBBYm9ydENvbnRyb2xsZXIsQWU9dGEoZS5oaXN0b3J5LHosYWUuc2lnbmFsKTtLLnNldChiLGFlKTtsZXQgVnQ9TyxUZT1hd2FpdCBlYSgibG9hZGVyIixBZSxHLG9lLG8saSxhKTtpZihEbyhUZSkmJihUZT1hd2FpdCBGayhUZSxBZS5zaWduYWwsITApfHxUZSksSy5nZXQoYik9PT1hZSYmSy5kZWxldGUoYiksIUFlLnNpZ25hbC5hYm9ydGVkKXtpZihuZS5oYXMoYikpe190KGIsUGkodm9pZCAwKSk7cmV0dXJufWlmKHFsKFRlKSlpZihBPlZ0KXtfdChiLFBpKHZvaWQgMCkpO3JldHVybn1lbHNle2ouYWRkKGIpLGF3YWl0IGF0KHcsVGUpO3JldHVybn1pZihBYShUZSkpe0F0KGIsTSxUZS5lcnJvcik7cmV0dXJufU9lKCFEbyhUZSksIlVuaGFuZGxlZCBmZXRjaGVyIGRlZmVycmVkIGRhdGEiKSxfdChiLFBpKFRlLmRhdGEpKX19YXN5bmMgZnVuY3Rpb24gYXQoYixNLHope2xldHtzdWJtaXNzaW9uOkcsZmV0Y2hlclN1Ym1pc3Npb246b2UscmVwbGFjZTokZX09ej09PXZvaWQgMD97fTp6O00ucmV2YWxpZGF0ZSYmKEY9ITApO2xldCBoZT1FdShiLmxvY2F0aW9uLE0ubG9jYXRpb24se19pc1JlZGlyZWN0OiEwfSk7aWYoT2UoaGUsIkV4cGVjdGVkIGEgbG9jYXRpb24gb24gdGhlIHJlZGlyZWN0IG5hdmlnYXRpb24iKSxuKXtsZXQgWmU9ITE7aWYoTS5yZWxvYWREb2N1bWVudClaZT0hMDtlbHNlIGlmKElrLnRlc3QoTS5sb2NhdGlvbikpe2NvbnN0IHV0PWUuaGlzdG9yeS5jcmVhdGVVUkwoTS5sb2NhdGlvbik7WmU9dXQub3JpZ2luIT09dC5sb2NhdGlvbi5vcmlnaW58fEh1KHV0LnBhdGhuYW1lLGEpPT1udWxsfWlmKFplKXskZT90LmxvY2F0aW9uLnJlcGxhY2UoTS5sb2NhdGlvbik6dC5sb2NhdGlvbi5hc3NpZ24oTS5sb2NhdGlvbik7cmV0dXJufX1DPW51bGw7bGV0IGZlPSRlPT09ITA/d3QuUmVwbGFjZTp3dC5QdXNoLHtmb3JtTWV0aG9kOmFlLGZvcm1BY3Rpb246QWUsZm9ybUVuY1R5cGU6VnR9PWIubmF2aWdhdGlvbjshRyYmIW9lJiZhZSYmQWUmJlZ0JiYoRz1tXyhiLm5hdmlnYXRpb24pKTtsZXQgVGU9R3x8b2U7aWYoS0QuaGFzKE0uc3RhdHVzKSYmVGUmJnZyKFRlLmZvcm1NZXRob2QpKWF3YWl0IFFlKGZlLGhlLHtzdWJtaXNzaW9uOnl0KHt9LFRlLHtmb3JtQWN0aW9uOk0ubG9jYXRpb259KSxwcmV2ZW50U2Nyb2xsUmVzZXQ6JH0pO2Vsc2V7bGV0IFplPVloKGhlLEcpO2F3YWl0IFFlKGZlLGhlLHtvdmVycmlkZU5hdmlnYXRpb246WmUsZmV0Y2hlclN1Ym1pc3Npb246b2UscHJldmVudFNjcm9sbFJlc2V0OiR9KX19YXN5bmMgZnVuY3Rpb24gbG4oYixNLHosRyxvZSl7bGV0ICRlPWF3YWl0IFByb21pc2UuYWxsKFsuLi56Lm1hcChhZT0+ZWEoImxvYWRlciIsb2UsYWUsTSxvLGksYSkpLC4uLkcubWFwKGFlPT5hZS5tYXRjaGVzJiZhZS5tYXRjaCYmYWUuY29udHJvbGxlcj9lYSgibG9hZGVyIix0YShlLmhpc3RvcnksYWUucGF0aCxhZS5jb250cm9sbGVyLnNpZ25hbCksYWUubWF0Y2gsYWUubWF0Y2hlcyxvLGksYSk6e3R5cGU6U3QuZXJyb3IsZXJyb3I6R24oNDA0LHtwYXRobmFtZTphZS5wYXRofSl9KV0pLGhlPSRlLnNsaWNlKDAsei5sZW5ndGgpLGZlPSRlLnNsaWNlKHoubGVuZ3RoKTtyZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoW3BfKGIseixoZSxoZS5tYXAoKCk9Pm9lLnNpZ25hbCksITEsdy5sb2FkZXJEYXRhKSxwXyhiLEcubWFwKGFlPT5hZS5tYXRjaCksZmUsRy5tYXAoYWU9PmFlLmNvbnRyb2xsZXI/YWUuY29udHJvbGxlci5zaWduYWw6bnVsbCksITApXSkse3Jlc3VsdHM6JGUsbG9hZGVyUmVzdWx0czpoZSxmZXRjaGVyUmVzdWx0czpmZX19ZnVuY3Rpb24gRW4oKXtGPSEwLHNlLnB1c2goLi4uUWYoKSksTC5mb3JFYWNoKChiLE0pPT57Sy5oYXMoTSkmJihWLnB1c2goTSksZ3QoTSkpfSl9ZnVuY3Rpb24gX3QoYixNLHope3o9PT12b2lkIDAmJih6PXt9KSx3LmZldGNoZXJzLnNldChiLE0pLGJlKHtmZXRjaGVyczpuZXcgTWFwKHcuZmV0Y2hlcnMpfSx7Zmx1c2hTeW5jOih6JiZ6LmZsdXNoU3luYyk9PT0hMH0pfWZ1bmN0aW9uIEF0KGIsTSx6LEcpe0c9PT12b2lkIDAmJihHPXt9KTtsZXQgb2U9UGEody5tYXRjaGVzLE0pO1BuKGIpLGJlKHtlcnJvcnM6e1tvZS5yb3V0ZS5pZF06en0sZmV0Y2hlcnM6bmV3IE1hcCh3LmZldGNoZXJzKX0se2ZsdXNoU3luYzooRyYmRy5mbHVzaFN5bmMpPT09ITB9KX1mdW5jdGlvbiBzbihiKXtyZXR1cm4gdS52N19mZXRjaGVyUGVyc2lzdCYmKFouc2V0KGIsKFouZ2V0KGIpfHwwKSsxKSxuZS5oYXMoYikmJm5lLmRlbGV0ZShiKSksdy5mZXRjaGVycy5nZXQoYil8fFpEfWZ1bmN0aW9uIFBuKGIpe2xldCBNPXcuZmV0Y2hlcnMuZ2V0KGIpO0suaGFzKGIpJiYhKE0mJk0uc3RhdGU9PT0ibG9hZGluZyImJmsuaGFzKGIpKSYmZ3QoYiksTC5kZWxldGUoYiksay5kZWxldGUoYiksai5kZWxldGUoYiksbmUuZGVsZXRlKGIpLHcuZmV0Y2hlcnMuZGVsZXRlKGIpfWZ1bmN0aW9uIHFyKGIpe2lmKHUudjdfZmV0Y2hlclBlcnNpc3Qpe2xldCBNPShaLmdldChiKXx8MCktMTtNPD0wPyhaLmRlbGV0ZShiKSxuZS5hZGQoYikpOlouc2V0KGIsTSl9ZWxzZSBQbihiKTtiZSh7ZmV0Y2hlcnM6bmV3IE1hcCh3LmZldGNoZXJzKX0pfWZ1bmN0aW9uIGd0KGIpe2xldCBNPUsuZ2V0KGIpO09lKE0sIkV4cGVjdGVkIGZldGNoIGNvbnRyb2xsZXI6ICIrYiksTS5hYm9ydCgpLEsuZGVsZXRlKGIpfWZ1bmN0aW9uIE5yKGIpe2ZvcihsZXQgTSBvZiBiKXtsZXQgej1zbihNKSxHPVBpKHouZGF0YSk7dy5mZXRjaGVycy5zZXQoTSxHKX19ZnVuY3Rpb24gRW8oKXtsZXQgYj1bXSxNPSExO2ZvcihsZXQgeiBvZiBqKXtsZXQgRz13LmZldGNoZXJzLmdldCh6KTtPZShHLCJFeHBlY3RlZCBmZXRjaGVyOiAiK3opLEcuc3RhdGU9PT0ibG9hZGluZyImJihqLmRlbGV0ZSh6KSxiLnB1c2goeiksTT0hMCl9cmV0dXJuIE5yKGIpLE19ZnVuY3Rpb24gTHMoYil7bGV0IE09W107Zm9yKGxldFt6LEddb2YgaylpZihHPGIpe2xldCBvZT13LmZldGNoZXJzLmdldCh6KTtPZShvZSwiRXhwZWN0ZWQgZmV0Y2hlcjogIit6KSxvZS5zdGF0ZT09PSJsb2FkaW5nIiYmKGd0KHopLGsuZGVsZXRlKHopLE0ucHVzaCh6KSl9cmV0dXJuIE5yKE0pLE0ubGVuZ3RoPjB9ZnVuY3Rpb24gZiQoYixNKXtsZXQgej13LmJsb2NrZXJzLmdldChiKXx8cXM7cmV0dXJuIHZlLmdldChiKSE9PU0mJnZlLnNldChiLE0pLHp9ZnVuY3Rpb24gcnkoYil7dy5ibG9ja2Vycy5kZWxldGUoYiksdmUuZGVsZXRlKGIpfWZ1bmN0aW9uIEt1KGIsTSl7bGV0IHo9dy5ibG9ja2Vycy5nZXQoYil8fHFzO09lKHouc3RhdGU9PT0idW5ibG9ja2VkIiYmTS5zdGF0ZT09PSJibG9ja2VkInx8ei5zdGF0ZT09PSJibG9ja2VkIiYmTS5zdGF0ZT09PSJibG9ja2VkInx8ei5zdGF0ZT09PSJibG9ja2VkIiYmTS5zdGF0ZT09PSJwcm9jZWVkaW5nInx8ei5zdGF0ZT09PSJibG9ja2VkIiYmTS5zdGF0ZT09PSJ1bmJsb2NrZWQifHx6LnN0YXRlPT09InByb2NlZWRpbmciJiZNLnN0YXRlPT09InVuYmxvY2tlZCIsIkludmFsaWQgYmxvY2tlciBzdGF0ZSB0cmFuc2l0aW9uOiAiK3ouc3RhdGUrIiAtPiAiK00uc3RhdGUpO2xldCBHPW5ldyBNYXAody5ibG9ja2Vycyk7Ry5zZXQoYixNKSxiZSh7YmxvY2tlcnM6R30pfWZ1bmN0aW9uIGl5KGIpe2xldHtjdXJyZW50TG9jYXRpb246TSxuZXh0TG9jYXRpb246eixoaXN0b3J5QWN0aW9uOkd9PWI7aWYodmUuc2l6ZT09PTApcmV0dXJuO3ZlLnNpemU+MSYmbmwoITEsIkEgcm91dGVyIG9ubHkgc3VwcG9ydHMgb25lIGJsb2NrZXIgYXQgYSB0aW1lIik7bGV0IG9lPUFycmF5LmZyb20odmUuZW50cmllcygpKSxbJGUsaGVdPW9lW29lLmxlbmd0aC0xXSxmZT13LmJsb2NrZXJzLmdldCgkZSk7aWYoIShmZSYmZmUuc3RhdGU9PT0icHJvY2VlZGluZyIpJiZoZSh7Y3VycmVudExvY2F0aW9uOk0sbmV4dExvY2F0aW9uOnosaGlzdG9yeUFjdGlvbjpHfSkpcmV0dXJuICRlfWZ1bmN0aW9uIFFmKGIpe2xldCBNPVtdO3JldHVybiBrZS5mb3JFYWNoKCh6LEcpPT57KCFifHxiKEcpKSYmKHouY2FuY2VsKCksTS5wdXNoKEcpLGtlLmRlbGV0ZShHKSl9KSxNfWZ1bmN0aW9uIGgkKGIsTSx6KXtpZihmPWIsbT1NLGg9enx8bnVsbCwhZyYmdy5uYXZpZ2F0aW9uPT09R2gpe2c9ITA7bGV0IEc9bHkody5sb2NhdGlvbix3Lm1hdGNoZXMpO0chPW51bGwmJmJlKHtyZXN0b3JlU2Nyb2xsUG9zaXRpb246R30pfXJldHVybigpPT57Zj1udWxsLG09bnVsbCxoPW51bGx9fWZ1bmN0aW9uIG95KGIsTSl7cmV0dXJuIGgmJmgoYixNLm1hcChHPT5TRChHLHcubG9hZGVyRGF0YSkpKXx8Yi5rZXl9ZnVuY3Rpb24gcCQoYixNKXtpZihmJiZtKXtsZXQgej1veShiLE0pO2Zbel09bSgpfX1mdW5jdGlvbiBseShiLE0pe2lmKGYpe2xldCB6PW95KGIsTSksRz1mW3pdO2lmKHR5cGVvZiBHPT0ibnVtYmVyIilyZXR1cm4gR31yZXR1cm4gbnVsbH1mdW5jdGlvbiBtJChiKXtvPXt9LHM9SG0oYixpLHZvaWQgMCxvKX1yZXR1cm4gXz17Z2V0IGJhc2VuYW1lKCl7cmV0dXJuIGF9LGdldCBzdGF0ZSgpe3JldHVybiB3fSxnZXQgcm91dGVzKCl7cmV0dXJuIGx9LGdldCB3aW5kb3coKXtyZXR1cm4gdH0saW5pdGlhbGl6ZTpGZSxzdWJzY3JpYmU6TGUsZW5hYmxlU2Nyb2xsUmVzdG9yYXRpb246aCQsbmF2aWdhdGU6U2UsZmV0Y2g6dXIscmV2YWxpZGF0ZTpEZSxjcmVhdGVIcmVmOmI9PmUuaGlzdG9yeS5jcmVhdGVIcmVmKGIpLGVuY29kZUxvY2F0aW9uOmI9PmUuaGlzdG9yeS5lbmNvZGVMb2NhdGlvbihiKSxnZXRGZXRjaGVyOnNuLGRlbGV0ZUZldGNoZXI6cXIsZGlzcG9zZTp0ZSxnZXRCbG9ja2VyOmYkLGRlbGV0ZUJsb2NrZXI6cnksX2ludGVybmFsRmV0Y2hDb250cm9sbGVyczpLLF9pbnRlcm5hbEFjdGl2ZURlZmVycmVkczprZSxfaW50ZXJuYWxTZXRSb3V0ZXM6bSR9LF99ZnVuY3Rpb24gWEQoZSl7cmV0dXJuIGUhPW51bGwmJigiZm9ybURhdGEiaW4gZSYmZS5mb3JtRGF0YSE9bnVsbHx8ImJvZHkiaW4gZSYmZS5ib2R5IT09dm9pZCAwKX1mdW5jdGlvbiBLbShlLHQsbixyLGksbyxsKXtsZXQgcyxhO2lmKG8pe3M9W107Zm9yKGxldCBjIG9mIHQpaWYocy5wdXNoKGMpLGMucm91dGUuaWQ9PT1vKXthPWM7YnJlYWt9fWVsc2Ugcz10LGE9dFt0Lmxlbmd0aC0xXTtsZXQgdT1BayhpfHwiLiIsUGsocyksSHUoZS5wYXRobmFtZSxuKXx8ZS5wYXRobmFtZSxsPT09InBhdGgiKTtyZXR1cm4gaT09bnVsbCYmKHUuc2VhcmNoPWUuc2VhcmNoLHUuaGFzaD1lLmhhc2gpLChpPT1udWxsfHxpPT09IiJ8fGk9PT0iLiIpJiZhJiZhLnJvdXRlLmluZGV4JiYhWXYodS5zZWFyY2gpJiYodS5zZWFyY2g9dS5zZWFyY2g/dS5zZWFyY2gucmVwbGFjZSgvXlw/LywiP2luZGV4JiIpOiI/aW5kZXgiKSxyJiZuIT09Ii8iJiYodS5wYXRobmFtZT11LnBhdGhuYW1lPT09Ii8iP246ZW8oW24sdS5wYXRobmFtZV0pKSxWdSh1KX1mdW5jdGlvbiBvXyhlLHQsbixyKXtpZighcnx8IVhEKHIpKXJldHVybntwYXRoOm59O2lmKHIuZm9ybU1ldGhvZCYmIXJJKHIuZm9ybU1ldGhvZCkpcmV0dXJue3BhdGg6bixlcnJvcjpHbig0MDUse21ldGhvZDpyLmZvcm1NZXRob2R9KX07bGV0IGk9KCk9Pih7cGF0aDpuLGVycm9yOkduKDQwMCx7dHlwZToiaW52YWxpZC1ib2R5In0pfSksbz1yLmZvcm1NZXRob2R8fCJnZXQiLGw9ZT9vLnRvVXBwZXJDYXNlKCk6by50b0xvd2VyQ2FzZSgpLHM9emsobik7aWYoci5ib2R5IT09dm9pZCAwKXtpZihyLmZvcm1FbmNUeXBlPT09InRleHQvcGxhaW4iKXtpZighdnIobCkpcmV0dXJuIGkoKTtsZXQgZj10eXBlb2Ygci5ib2R5PT0ic3RyaW5nIj9yLmJvZHk6ci5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGF8fHIuYm9keSBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcz9BcnJheS5mcm9tKHIuYm9keS5lbnRyaWVzKCkpLnJlZHVjZSgoaCxtKT0+e2xldFtnLFNdPW07cmV0dXJuIiIraCtnKyI9IitTK2AKYH0sIiIpOlN0cmluZyhyLmJvZHkpO3JldHVybntwYXRoOm4sc3VibWlzc2lvbjp7Zm9ybU1ldGhvZDpsLGZvcm1BY3Rpb246cyxmb3JtRW5jVHlwZTpyLmZvcm1FbmNUeXBlLGZvcm1EYXRhOnZvaWQgMCxqc29uOnZvaWQgMCx0ZXh0OmZ9fX1lbHNlIGlmKHIuZm9ybUVuY1R5cGU9PT0iYXBwbGljYXRpb24vanNvbiIpe2lmKCF2cihsKSlyZXR1cm4gaSgpO3RyeXtsZXQgZj10eXBlb2Ygci5ib2R5PT0ic3RyaW5nIj9KU09OLnBhcnNlKHIuYm9keSk6ci5ib2R5O3JldHVybntwYXRoOm4sc3VibWlzc2lvbjp7Zm9ybU1ldGhvZDpsLGZvcm1BY3Rpb246cyxmb3JtRW5jVHlwZTpyLmZvcm1FbmNUeXBlLGZvcm1EYXRhOnZvaWQgMCxqc29uOmYsdGV4dDp2b2lkIDB9fX1jYXRjaHtyZXR1cm4gaSgpfX19T2UodHlwZW9mIEZvcm1EYXRhPT0iZnVuY3Rpb24iLCJGb3JtRGF0YSBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQiKTtsZXQgYSx1O2lmKHIuZm9ybURhdGEpYT1abShyLmZvcm1EYXRhKSx1PXIuZm9ybURhdGE7ZWxzZSBpZihyLmJvZHkgaW5zdGFuY2VvZiBGb3JtRGF0YSlhPVptKHIuYm9keSksdT1yLmJvZHk7ZWxzZSBpZihyLmJvZHkgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMpYT1yLmJvZHksdT11XyhhKTtlbHNlIGlmKHIuYm9keT09bnVsbClhPW5ldyBVUkxTZWFyY2hQYXJhbXMsdT1uZXcgRm9ybURhdGE7ZWxzZSB0cnl7YT1uZXcgVVJMU2VhcmNoUGFyYW1zKHIuYm9keSksdT11XyhhKX1jYXRjaHtyZXR1cm4gaSgpfWxldCBjPXtmb3JtTWV0aG9kOmwsZm9ybUFjdGlvbjpzLGZvcm1FbmNUeXBlOnImJnIuZm9ybUVuY1R5cGV8fCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLGZvcm1EYXRhOnUsanNvbjp2b2lkIDAsdGV4dDp2b2lkIDB9O2lmKHZyKGMuZm9ybU1ldGhvZCkpcmV0dXJue3BhdGg6bixzdWJtaXNzaW9uOmN9O2xldCBkPWtpKG4pO3JldHVybiB0JiZkLnNlYXJjaCYmWXYoZC5zZWFyY2gpJiZhLmFwcGVuZCgiaW5kZXgiLCIiKSxkLnNlYXJjaD0iPyIrYSx7cGF0aDpWdShkKSxzdWJtaXNzaW9uOmN9fWZ1bmN0aW9uIFFEKGUsdCl7bGV0IG49ZTtpZih0KXtsZXQgcj1lLmZpbmRJbmRleChpPT5pLnJvdXRlLmlkPT09dCk7cj49MCYmKG49ZS5zbGljZSgwLHIpKX1yZXR1cm4gbn1mdW5jdGlvbiBsXyhlLHQsbixyLGksbyxsLHMsYSx1LGMsZCxmLGgsbSl7bGV0IGc9bT9PYmplY3QudmFsdWVzKG0pWzBdOmg/T2JqZWN0LnZhbHVlcyhoKVswXTp2b2lkIDAsUz1lLmNyZWF0ZVVSTCh0LmxvY2F0aW9uKSx2PWUuY3JlYXRlVVJMKGkpLHk9bT9PYmplY3Qua2V5cyhtKVswXTp2b2lkIDAsdz1RRChuLHkpLmZpbHRlcigoJCxDKT0+e2lmKCQucm91dGUubGF6eSlyZXR1cm4hMDtpZigkLnJvdXRlLmxvYWRlcj09bnVsbClyZXR1cm4hMTtpZihKRCh0LmxvYWRlckRhdGEsdC5tYXRjaGVzW0NdLCQpfHxsLnNvbWUoUj0+Uj09PSQucm91dGUuaWQpKXJldHVybiEwO2xldCBUPXQubWF0Y2hlc1tDXSxOPSQ7cmV0dXJuIHNfKCQseXQoe2N1cnJlbnRVcmw6UyxjdXJyZW50UGFyYW1zOlQucGFyYW1zLG5leHRVcmw6dixuZXh0UGFyYW1zOk4ucGFyYW1zfSxyLHthY3Rpb25SZXN1bHQ6ZyxkZWZhdWx0U2hvdWxkUmV2YWxpZGF0ZTpvfHxTLnBhdGhuYW1lK1Muc2VhcmNoPT09di5wYXRobmFtZSt2LnNlYXJjaHx8Uy5zZWFyY2ghPT12LnNlYXJjaHx8amsoVCxOKX0pKX0pLEU9W107cmV0dXJuIHUuZm9yRWFjaCgoJCxDKT0+e2lmKCFuLnNvbWUoRj0+Ri5yb3V0ZS5pZD09PSQucm91dGVJZCl8fGEuaGFzKEMpKXJldHVybjtsZXQgVD1CbChkLCQucGF0aCxmKTtpZighVCl7RS5wdXNoKHtrZXk6Qyxyb3V0ZUlkOiQucm91dGVJZCxwYXRoOiQucGF0aCxtYXRjaGVzOm51bGwsbWF0Y2g6bnVsbCxjb250cm9sbGVyOm51bGx9KTtyZXR1cm59bGV0IE49dC5mZXRjaGVycy5nZXQoQyksUj1HbShULCQucGF0aCksRD0hMTtjLmhhcyhDKT9EPSExOnMuaW5jbHVkZXMoQyk/RD0hMDpOJiZOLnN0YXRlIT09ImlkbGUiJiZOLmRhdGE9PT12b2lkIDA/RD1vOkQ9c18oUix5dCh7Y3VycmVudFVybDpTLGN1cnJlbnRQYXJhbXM6dC5tYXRjaGVzW3QubWF0Y2hlcy5sZW5ndGgtMV0ucGFyYW1zLG5leHRVcmw6dixuZXh0UGFyYW1zOm5bbi5sZW5ndGgtMV0ucGFyYW1zfSxyLHthY3Rpb25SZXN1bHQ6ZyxkZWZhdWx0U2hvdWxkUmV2YWxpZGF0ZTpvfSkpLEQmJkUucHVzaCh7a2V5OkMscm91dGVJZDokLnJvdXRlSWQscGF0aDokLnBhdGgsbWF0Y2hlczpULG1hdGNoOlIsY29udHJvbGxlcjpuZXcgQWJvcnRDb250cm9sbGVyfSl9KSxbdyxFXX1mdW5jdGlvbiBKRChlLHQsbil7bGV0IHI9IXR8fG4ucm91dGUuaWQhPT10LnJvdXRlLmlkLGk9ZVtuLnJvdXRlLmlkXT09PXZvaWQgMDtyZXR1cm4gcnx8aX1mdW5jdGlvbiBqayhlLHQpe2xldCBuPWUucm91dGUucGF0aDtyZXR1cm4gZS5wYXRobmFtZSE9PXQucGF0aG5hbWV8fG4hPW51bGwmJm4uZW5kc1dpdGgoIioiKSYmZS5wYXJhbXNbIioiXSE9PXQucGFyYW1zWyIqIl19ZnVuY3Rpb24gc18oZSx0KXtpZihlLnJvdXRlLnNob3VsZFJldmFsaWRhdGUpe2xldCBuPWUucm91dGUuc2hvdWxkUmV2YWxpZGF0ZSh0KTtpZih0eXBlb2Ygbj09ImJvb2xlYW4iKXJldHVybiBufXJldHVybiB0LmRlZmF1bHRTaG91bGRSZXZhbGlkYXRlfWFzeW5jIGZ1bmN0aW9uIGFfKGUsdCxuKXtpZighZS5sYXp5KXJldHVybjtsZXQgcj1hd2FpdCBlLmxhenkoKTtpZighZS5sYXp5KXJldHVybjtsZXQgaT1uW2UuaWRdO09lKGksIk5vIHJvdXRlIGZvdW5kIGluIG1hbmlmZXN0Iik7bGV0IG89e307Zm9yKGxldCBsIGluIHIpe2xldCBhPWlbbF0hPT12b2lkIDAmJmwhPT0iaGFzRXJyb3JCb3VuZGFyeSI7bmwoIWEsJ1JvdXRlICInK2kuaWQrJyIgaGFzIGEgc3RhdGljIHByb3BlcnR5ICInK2wrJyIgZGVmaW5lZCBidXQgaXRzIGxhenkgZnVuY3Rpb24gaXMgYWxzbyByZXR1cm5pbmcgYSB2YWx1ZSBmb3IgdGhpcyBwcm9wZXJ0eS4gJysoJ1RoZSBsYXp5IHJvdXRlIHByb3BlcnR5ICInK2wrJyIgd2lsbCBiZSBpZ25vcmVkLicpKSwhYSYmIV9ELmhhcyhsKSYmKG9bbF09cltsXSl9T2JqZWN0LmFzc2lnbihpLG8pLE9iamVjdC5hc3NpZ24oaSx5dCh7fSx0KGkpLHtsYXp5OnZvaWQgMH0pKX1hc3luYyBmdW5jdGlvbiBlYShlLHQsbixyLGksbyxsLHMpe3M9PT12b2lkIDAmJihzPXt9KTtsZXQgYSx1LGMsZD1tPT57bGV0IGcsUz1uZXcgUHJvbWlzZSgodix5KT0+Zz15KTtyZXR1cm4gYz0oKT0+ZygpLHQuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixjKSxQcm9taXNlLnJhY2UoW20oe3JlcXVlc3Q6dCxwYXJhbXM6bi5wYXJhbXMsY29udGV4dDpzLnJlcXVlc3RDb250ZXh0fSksU10pfTt0cnl7bGV0IG09bi5yb3V0ZVtlXTtpZihuLnJvdXRlLmxhenkpaWYobSl7bGV0IGcsUz1hd2FpdCBQcm9taXNlLmFsbChbZChtKS5jYXRjaCh2PT57Zz12fSksYV8obi5yb3V0ZSxvLGkpXSk7aWYoZyl0aHJvdyBnO3U9U1swXX1lbHNlIGlmKGF3YWl0IGFfKG4ucm91dGUsbyxpKSxtPW4ucm91dGVbZV0sbSl1PWF3YWl0IGQobSk7ZWxzZSBpZihlPT09ImFjdGlvbiIpe2xldCBnPW5ldyBVUkwodC51cmwpLFM9Zy5wYXRobmFtZStnLnNlYXJjaDt0aHJvdyBHbig0MDUse21ldGhvZDp0Lm1ldGhvZCxwYXRobmFtZTpTLHJvdXRlSWQ6bi5yb3V0ZS5pZH0pfWVsc2UgcmV0dXJue3R5cGU6U3QuZGF0YSxkYXRhOnZvaWQgMH07ZWxzZSBpZihtKXU9YXdhaXQgZChtKTtlbHNle2xldCBnPW5ldyBVUkwodC51cmwpLFM9Zy5wYXRobmFtZStnLnNlYXJjaDt0aHJvdyBHbig0MDQse3BhdGhuYW1lOlN9KX1PZSh1IT09dm9pZCAwLCJZb3UgZGVmaW5lZCAiKyhlPT09ImFjdGlvbiI/ImFuIGFjdGlvbiI6ImEgbG9hZGVyIikrIiBmb3Igcm91dGUgIisoJyInK24ucm91dGUuaWQrIlwiIGJ1dCBkaWRuJ3QgcmV0dXJuIGFueXRoaW5nIGZyb20geW91ciBgIitlKyJgICIpKyJmdW5jdGlvbi4gUGxlYXNlIHJldHVybiBhIHZhbHVlIG9yIGBudWxsYC4iKX1jYXRjaChtKXthPVN0LmVycm9yLHU9bX1maW5hbGx5e2MmJnQuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixjKX1pZihuSSh1KSl7bGV0IG09dS5zdGF0dXM7aWYoSEQuaGFzKG0pKXtsZXQgdj11LmhlYWRlcnMuZ2V0KCJMb2NhdGlvbiIpO2lmKE9lKHYsIlJlZGlyZWN0cyByZXR1cm5lZC90aHJvd24gZnJvbSBsb2FkZXJzL2FjdGlvbnMgbXVzdCBoYXZlIGEgTG9jYXRpb24gaGVhZGVyIiksIUlrLnRlc3Qodikpdj1LbShuZXcgVVJMKHQudXJsKSxyLnNsaWNlKDAsci5pbmRleE9mKG4pKzEpLGwsITAsdik7ZWxzZSBpZighcy5pc1N0YXRpY1JlcXVlc3Qpe2xldCB5PW5ldyBVUkwodC51cmwpLF89di5zdGFydHNXaXRoKCIvLyIpP25ldyBVUkwoeS5wcm90b2NvbCt2KTpuZXcgVVJMKHYpLHc9SHUoXy5wYXRobmFtZSxsKSE9bnVsbDtfLm9yaWdpbj09PXkub3JpZ2luJiZ3JiYodj1fLnBhdGhuYW1lK18uc2VhcmNoK18uaGFzaCl9aWYocy5pc1N0YXRpY1JlcXVlc3QpdGhyb3cgdS5oZWFkZXJzLnNldCgiTG9jYXRpb24iLHYpLHU7cmV0dXJue3R5cGU6U3QucmVkaXJlY3Qsc3RhdHVzOm0sbG9jYXRpb246dixyZXZhbGlkYXRlOnUuaGVhZGVycy5nZXQoIlgtUmVtaXgtUmV2YWxpZGF0ZSIpIT09bnVsbCxyZWxvYWREb2N1bWVudDp1LmhlYWRlcnMuZ2V0KCJYLVJlbWl4LVJlbG9hZC1Eb2N1bWVudCIpIT09bnVsbH19aWYocy5pc1JvdXRlUmVxdWVzdCl0aHJvd3t0eXBlOmE9PT1TdC5lcnJvcj9TdC5lcnJvcjpTdC5kYXRhLHJlc3BvbnNlOnV9O2xldCBnLFM9dS5oZWFkZXJzLmdldCgiQ29udGVudC1UeXBlIik7cmV0dXJuIFMmJi9cYmFwcGxpY2F0aW9uXC9qc29uXGIvLnRlc3QoUyk/Zz1hd2FpdCB1Lmpzb24oKTpnPWF3YWl0IHUudGV4dCgpLGE9PT1TdC5lcnJvcj97dHlwZTphLGVycm9yOm5ldyBHdihtLHUuc3RhdHVzVGV4dCxnKSxoZWFkZXJzOnUuaGVhZGVyc306e3R5cGU6U3QuZGF0YSxkYXRhOmcsc3RhdHVzQ29kZTp1LnN0YXR1cyxoZWFkZXJzOnUuaGVhZGVyc319aWYoYT09PVN0LmVycm9yKXJldHVybnt0eXBlOmEsZXJyb3I6dX07aWYodEkodSkpe3ZhciBmLGg7cmV0dXJue3R5cGU6U3QuZGVmZXJyZWQsZGVmZXJyZWREYXRhOnUsc3RhdHVzQ29kZTooZj11LmluaXQpPT1udWxsP3ZvaWQgMDpmLnN0YXR1cyxoZWFkZXJzOigoaD11LmluaXQpPT1udWxsP3ZvaWQgMDpoLmhlYWRlcnMpJiZuZXcgSGVhZGVycyh1LmluaXQuaGVhZGVycyl9fXJldHVybnt0eXBlOlN0LmRhdGEsZGF0YTp1fX1mdW5jdGlvbiB0YShlLHQsbixyKXtsZXQgaT1lLmNyZWF0ZVVSTCh6ayh0KSkudG9TdHJpbmcoKSxvPXtzaWduYWw6bn07aWYociYmdnIoci5mb3JtTWV0aG9kKSl7bGV0e2Zvcm1NZXRob2Q6bCxmb3JtRW5jVHlwZTpzfT1yO28ubWV0aG9kPWwudG9VcHBlckNhc2UoKSxzPT09ImFwcGxpY2F0aW9uL2pzb24iPyhvLmhlYWRlcnM9bmV3IEhlYWRlcnMoeyJDb250ZW50LVR5cGUiOnN9KSxvLmJvZHk9SlNPTi5zdHJpbmdpZnkoci5qc29uKSk6cz09PSJ0ZXh0L3BsYWluIj9vLmJvZHk9ci50ZXh0OnM9PT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiYmci5mb3JtRGF0YT9vLmJvZHk9Wm0oci5mb3JtRGF0YSk6by5ib2R5PXIuZm9ybURhdGF9cmV0dXJuIG5ldyBSZXF1ZXN0KGksbyl9ZnVuY3Rpb24gWm0oZSl7bGV0IHQ9bmV3IFVSTFNlYXJjaFBhcmFtcztmb3IobGV0W24scl1vZiBlLmVudHJpZXMoKSl0LmFwcGVuZChuLHR5cGVvZiByPT0ic3RyaW5nIj9yOnIubmFtZSk7cmV0dXJuIHR9ZnVuY3Rpb24gdV8oZSl7bGV0IHQ9bmV3IEZvcm1EYXRhO2ZvcihsZXRbbixyXW9mIGUuZW50cmllcygpKXQuYXBwZW5kKG4scik7cmV0dXJuIHR9ZnVuY3Rpb24gcUQoZSx0LG4scixpKXtsZXQgbz17fSxsPW51bGwscyxhPSExLHU9e307cmV0dXJuIG4uZm9yRWFjaCgoYyxkKT0+e2xldCBmPXRbZF0ucm91dGUuaWQ7aWYoT2UoIXFsKGMpLCJDYW5ub3QgaGFuZGxlIHJlZGlyZWN0IHJlc3VsdHMgaW4gcHJvY2Vzc0xvYWRlckRhdGEiKSxBYShjKSl7bGV0IGg9UGEoZSxmKSxtPWMuZXJyb3I7ciYmKG09T2JqZWN0LnZhbHVlcyhyKVswXSxyPXZvaWQgMCksbD1sfHx7fSxsW2gucm91dGUuaWRdPT1udWxsJiYobFtoLnJvdXRlLmlkXT1tKSxvW2ZdPXZvaWQgMCxhfHwoYT0hMCxzPU1rKGMuZXJyb3IpP2MuZXJyb3Iuc3RhdHVzOjUwMCksYy5oZWFkZXJzJiYodVtmXT1jLmhlYWRlcnMpfWVsc2UgRG8oYyk/KGkuc2V0KGYsYy5kZWZlcnJlZERhdGEpLG9bZl09Yy5kZWZlcnJlZERhdGEuZGF0YSk6b1tmXT1jLmRhdGEsYy5zdGF0dXNDb2RlIT1udWxsJiZjLnN0YXR1c0NvZGUhPT0yMDAmJiFhJiYocz1jLnN0YXR1c0NvZGUpLGMuaGVhZGVycyYmKHVbZl09Yy5oZWFkZXJzKX0pLHImJihsPXIsb1tPYmplY3Qua2V5cyhyKVswXV09dm9pZCAwKSx7bG9hZGVyRGF0YTpvLGVycm9yczpsLHN0YXR1c0NvZGU6c3x8MjAwLGxvYWRlckhlYWRlcnM6dX19ZnVuY3Rpb24gY18oZSx0LG4scixpLG8sbCxzKXtsZXR7bG9hZGVyRGF0YTphLGVycm9yczp1fT1xRCh0LG4scixpLHMpO2ZvcihsZXQgYz0wO2M8by5sZW5ndGg7YysrKXtsZXR7a2V5OmQsbWF0Y2g6Zixjb250cm9sbGVyOmh9PW9bY107T2UobCE9PXZvaWQgMCYmbFtjXSE9PXZvaWQgMCwiRGlkIG5vdCBmaW5kIGNvcnJlc3BvbmRpbmcgZmV0Y2hlciByZXN1bHQiKTtsZXQgbT1sW2NdO2lmKCEoaCYmaC5zaWduYWwuYWJvcnRlZCkpaWYoQWEobSkpe2xldCBnPVBhKGUubWF0Y2hlcyxmPT1udWxsP3ZvaWQgMDpmLnJvdXRlLmlkKTt1JiZ1W2cucm91dGUuaWRdfHwodT15dCh7fSx1LHtbZy5yb3V0ZS5pZF06bS5lcnJvcn0pKSxlLmZldGNoZXJzLmRlbGV0ZShkKX1lbHNlIGlmKHFsKG0pKU9lKCExLCJVbmhhbmRsZWQgZmV0Y2hlciByZXZhbGlkYXRpb24gcmVkaXJlY3QiKTtlbHNlIGlmKERvKG0pKU9lKCExLCJVbmhhbmRsZWQgZmV0Y2hlciBkZWZlcnJlZCBkYXRhIik7ZWxzZXtsZXQgZz1QaShtLmRhdGEpO2UuZmV0Y2hlcnMuc2V0KGQsZyl9fXJldHVybntsb2FkZXJEYXRhOmEsZXJyb3JzOnV9fWZ1bmN0aW9uIGRfKGUsdCxuLHIpe2xldCBpPXl0KHt9LHQpO2ZvcihsZXQgbyBvZiBuKXtsZXQgbD1vLnJvdXRlLmlkO2lmKHQuaGFzT3duUHJvcGVydHkobCk/dFtsXSE9PXZvaWQgMCYmKGlbbF09dFtsXSk6ZVtsXSE9PXZvaWQgMCYmby5yb3V0ZS5sb2FkZXImJihpW2xdPWVbbF0pLHImJnIuaGFzT3duUHJvcGVydHkobCkpYnJlYWt9cmV0dXJuIGl9ZnVuY3Rpb24gUGEoZSx0KXtyZXR1cm4odD9lLnNsaWNlKDAsZS5maW5kSW5kZXgocj0+ci5yb3V0ZS5pZD09PXQpKzEpOlsuLi5lXSkucmV2ZXJzZSgpLmZpbmQocj0+ci5yb3V0ZS5oYXNFcnJvckJvdW5kYXJ5PT09ITApfHxlWzBdfWZ1bmN0aW9uIGZfKGUpe2xldCB0PWUubGVuZ3RoPT09MT9lWzBdOmUuZmluZChuPT5uLmluZGV4fHwhbi5wYXRofHxuLnBhdGg9PT0iLyIpfHx7aWQ6Il9fc2hpbS1lcnJvci1yb3V0ZV9fIn07cmV0dXJue21hdGNoZXM6W3twYXJhbXM6e30scGF0aG5hbWU6IiIscGF0aG5hbWVCYXNlOiIiLHJvdXRlOnR9XSxyb3V0ZTp0fX1mdW5jdGlvbiBHbihlLHQpe2xldHtwYXRobmFtZTpuLHJvdXRlSWQ6cixtZXRob2Q6aSx0eXBlOm99PXQ9PT12b2lkIDA/e306dCxsPSJVbmtub3duIFNlcnZlciBFcnJvciIscz0iVW5rbm93biBAcmVtaXgtcnVuL3JvdXRlciBlcnJvciI7cmV0dXJuIGU9PT00MDA/KGw9IkJhZCBSZXF1ZXN0IixpJiZuJiZyP3M9IllvdSBtYWRlIGEgIitpKycgcmVxdWVzdCB0byAiJytuKyciIGJ1dCAnKygnZGlkIG5vdCBwcm92aWRlIGEgYGxvYWRlcmAgZm9yIHJvdXRlICInK3IrJyIsICcpKyJzbyB0aGVyZSBpcyBubyB3YXkgdG8gaGFuZGxlIHRoZSByZXF1ZXN0LiI6bz09PSJkZWZlci1hY3Rpb24iP3M9ImRlZmVyKCkgaXMgbm90IHN1cHBvcnRlZCBpbiBhY3Rpb25zIjpvPT09ImludmFsaWQtYm9keSImJihzPSJVbmFibGUgdG8gZW5jb2RlIHN1Ym1pc3Npb24gYm9keSIpKTplPT09NDAzPyhsPSJGb3JiaWRkZW4iLHM9J1JvdXRlICInK3IrJyIgZG9lcyBub3QgbWF0Y2ggVVJMICInK24rJyInKTplPT09NDA0PyhsPSJOb3QgRm91bmQiLHM9J05vIHJvdXRlIG1hdGNoZXMgVVJMICInK24rJyInKTplPT09NDA1JiYobD0iTWV0aG9kIE5vdCBBbGxvd2VkIixpJiZuJiZyP3M9IllvdSBtYWRlIGEgIitpLnRvVXBwZXJDYXNlKCkrJyByZXF1ZXN0IHRvICInK24rJyIgYnV0ICcrKCdkaWQgbm90IHByb3ZpZGUgYW4gYGFjdGlvbmAgZm9yIHJvdXRlICInK3IrJyIsICcpKyJzbyB0aGVyZSBpcyBubyB3YXkgdG8gaGFuZGxlIHRoZSByZXF1ZXN0LiI6aSYmKHM9J0ludmFsaWQgcmVxdWVzdCBtZXRob2QgIicraS50b1VwcGVyQ2FzZSgpKyciJykpLG5ldyBHdihlfHw1MDAsbCxuZXcgRXJyb3IocyksITApfWZ1bmN0aW9uIGhfKGUpe2ZvcihsZXQgdD1lLmxlbmd0aC0xO3Q+PTA7dC0tKXtsZXQgbj1lW3RdO2lmKHFsKG4pKXJldHVybntyZXN1bHQ6bixpZHg6dH19fWZ1bmN0aW9uIHprKGUpe2xldCB0PXR5cGVvZiBlPT0ic3RyaW5nIj9raShlKTplO3JldHVybiBWdSh5dCh7fSx0LHtoYXNoOiIifSkpfWZ1bmN0aW9uIGVJKGUsdCl7cmV0dXJuIGUucGF0aG5hbWUhPT10LnBhdGhuYW1lfHxlLnNlYXJjaCE9PXQuc2VhcmNoPyExOmUuaGFzaD09PSIiP3QuaGFzaCE9PSIiOmUuaGFzaD09PXQuaGFzaD8hMDp0Lmhhc2ghPT0iIn1mdW5jdGlvbiBEbyhlKXtyZXR1cm4gZS50eXBlPT09U3QuZGVmZXJyZWR9ZnVuY3Rpb24gQWEoZSl7cmV0dXJuIGUudHlwZT09PVN0LmVycm9yfWZ1bmN0aW9uIHFsKGUpe3JldHVybihlJiZlLnR5cGUpPT09U3QucmVkaXJlY3R9ZnVuY3Rpb24gdEkoZSl7bGV0IHQ9ZTtyZXR1cm4gdCYmdHlwZW9mIHQ9PSJvYmplY3QiJiZ0eXBlb2YgdC5kYXRhPT0ib2JqZWN0IiYmdHlwZW9mIHQuc3Vic2NyaWJlPT0iZnVuY3Rpb24iJiZ0eXBlb2YgdC5jYW5jZWw9PSJmdW5jdGlvbiImJnR5cGVvZiB0LnJlc29sdmVEYXRhPT0iZnVuY3Rpb24ifWZ1bmN0aW9uIG5JKGUpe3JldHVybiBlIT1udWxsJiZ0eXBlb2YgZS5zdGF0dXM9PSJudW1iZXIiJiZ0eXBlb2YgZS5zdGF0dXNUZXh0PT0ic3RyaW5nIiYmdHlwZW9mIGUuaGVhZGVycz09Im9iamVjdCImJnR5cGVvZiBlLmJvZHk8InUifWZ1bmN0aW9uIHJJKGUpe3JldHVybiBWRC5oYXMoZS50b0xvd2VyQ2FzZSgpKX1mdW5jdGlvbiB2cihlKXtyZXR1cm4gVUQuaGFzKGUudG9Mb3dlckNhc2UoKSl9YXN5bmMgZnVuY3Rpb24gcF8oZSx0LG4scixpLG8pe2ZvcihsZXQgbD0wO2w8bi5sZW5ndGg7bCsrKXtsZXQgcz1uW2xdLGE9dFtsXTtpZighYSljb250aW51ZTtsZXQgdT1lLmZpbmQoZD0+ZC5yb3V0ZS5pZD09PWEucm91dGUuaWQpLGM9dSE9bnVsbCYmIWprKHUsYSkmJihvJiZvW2Eucm91dGUuaWRdKSE9PXZvaWQgMDtpZihEbyhzKSYmKGl8fGMpKXtsZXQgZD1yW2xdO09lKGQsIkV4cGVjdGVkIGFuIEFib3J0U2lnbmFsIGZvciByZXZhbGlkYXRpbmcgZmV0Y2hlciBkZWZlcnJlZCByZXN1bHQiKSxhd2FpdCBGayhzLGQsaSkudGhlbihmPT57ZiYmKG5bbF09Znx8bltsXSl9KX19fWFzeW5jIGZ1bmN0aW9uIEZrKGUsdCxuKXtpZihuPT09dm9pZCAwJiYobj0hMSksIWF3YWl0IGUuZGVmZXJyZWREYXRhLnJlc29sdmVEYXRhKHQpKXtpZihuKXRyeXtyZXR1cm57dHlwZTpTdC5kYXRhLGRhdGE6ZS5kZWZlcnJlZERhdGEudW53cmFwcGVkRGF0YX19Y2F0Y2goaSl7cmV0dXJue3R5cGU6U3QuZXJyb3IsZXJyb3I6aX19cmV0dXJue3R5cGU6U3QuZGF0YSxkYXRhOmUuZGVmZXJyZWREYXRhLmRhdGF9fX1mdW5jdGlvbiBZdihlKXtyZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtcyhlKS5nZXRBbGwoImluZGV4Iikuc29tZSh0PT50PT09IiIpfWZ1bmN0aW9uIEdtKGUsdCl7bGV0IG49dHlwZW9mIHQ9PSJzdHJpbmciP2tpKHQpLnNlYXJjaDp0LnNlYXJjaDtpZihlW2UubGVuZ3RoLTFdLnJvdXRlLmluZGV4JiZZdihufHwiIikpcmV0dXJuIGVbZS5sZW5ndGgtMV07bGV0IHI9T2soZSk7cmV0dXJuIHJbci5sZW5ndGgtMV19ZnVuY3Rpb24gbV8oZSl7bGV0e2Zvcm1NZXRob2Q6dCxmb3JtQWN0aW9uOm4sZm9ybUVuY1R5cGU6cix0ZXh0OmksZm9ybURhdGE6byxqc29uOmx9PWU7aWYoISghdHx8IW58fCFyKSl7aWYoaSE9bnVsbClyZXR1cm57Zm9ybU1ldGhvZDp0LGZvcm1BY3Rpb246bixmb3JtRW5jVHlwZTpyLGZvcm1EYXRhOnZvaWQgMCxqc29uOnZvaWQgMCx0ZXh0Oml9O2lmKG8hPW51bGwpcmV0dXJue2Zvcm1NZXRob2Q6dCxmb3JtQWN0aW9uOm4sZm9ybUVuY1R5cGU6cixmb3JtRGF0YTpvLGpzb246dm9pZCAwLHRleHQ6dm9pZCAwfTtpZihsIT09dm9pZCAwKXJldHVybntmb3JtTWV0aG9kOnQsZm9ybUFjdGlvbjpuLGZvcm1FbmNUeXBlOnIsZm9ybURhdGE6dm9pZCAwLGpzb246bCx0ZXh0OnZvaWQgMH19fWZ1bmN0aW9uIFloKGUsdCl7cmV0dXJuIHQ/e3N0YXRlOiJsb2FkaW5nIixsb2NhdGlvbjplLGZvcm1NZXRob2Q6dC5mb3JtTWV0aG9kLGZvcm1BY3Rpb246dC5mb3JtQWN0aW9uLGZvcm1FbmNUeXBlOnQuZm9ybUVuY1R5cGUsZm9ybURhdGE6dC5mb3JtRGF0YSxqc29uOnQuanNvbix0ZXh0OnQudGV4dH06e3N0YXRlOiJsb2FkaW5nIixsb2NhdGlvbjplLGZvcm1NZXRob2Q6dm9pZCAwLGZvcm1BY3Rpb246dm9pZCAwLGZvcm1FbmNUeXBlOnZvaWQgMCxmb3JtRGF0YTp2b2lkIDAsanNvbjp2b2lkIDAsdGV4dDp2b2lkIDB9fWZ1bmN0aW9uIGlJKGUsdCl7cmV0dXJue3N0YXRlOiJzdWJtaXR0aW5nIixsb2NhdGlvbjplLGZvcm1NZXRob2Q6dC5mb3JtTWV0aG9kLGZvcm1BY3Rpb246dC5mb3JtQWN0aW9uLGZvcm1FbmNUeXBlOnQuZm9ybUVuY1R5cGUsZm9ybURhdGE6dC5mb3JtRGF0YSxqc29uOnQuanNvbix0ZXh0OnQudGV4dH19ZnVuY3Rpb24gbmEoZSx0KXtyZXR1cm4gZT97c3RhdGU6ImxvYWRpbmciLGZvcm1NZXRob2Q6ZS5mb3JtTWV0aG9kLGZvcm1BY3Rpb246ZS5mb3JtQWN0aW9uLGZvcm1FbmNUeXBlOmUuZm9ybUVuY1R5cGUsZm9ybURhdGE6ZS5mb3JtRGF0YSxqc29uOmUuanNvbix0ZXh0OmUudGV4dCxkYXRhOnR9OntzdGF0ZToibG9hZGluZyIsZm9ybU1ldGhvZDp2b2lkIDAsZm9ybUFjdGlvbjp2b2lkIDAsZm9ybUVuY1R5cGU6dm9pZCAwLGZvcm1EYXRhOnZvaWQgMCxqc29uOnZvaWQgMCx0ZXh0OnZvaWQgMCxkYXRhOnR9fWZ1bmN0aW9uIG9JKGUsdCl7cmV0dXJue3N0YXRlOiJzdWJtaXR0aW5nIixmb3JtTWV0aG9kOmUuZm9ybU1ldGhvZCxmb3JtQWN0aW9uOmUuZm9ybUFjdGlvbixmb3JtRW5jVHlwZTplLmZvcm1FbmNUeXBlLGZvcm1EYXRhOmUuZm9ybURhdGEsanNvbjplLmpzb24sdGV4dDplLnRleHQsZGF0YTp0P3QuZGF0YTp2b2lkIDB9fWZ1bmN0aW9uIFBpKGUpe3JldHVybntzdGF0ZToiaWRsZSIsZm9ybU1ldGhvZDp2b2lkIDAsZm9ybUFjdGlvbjp2b2lkIDAsZm9ybUVuY1R5cGU6dm9pZCAwLGZvcm1EYXRhOnZvaWQgMCxqc29uOnZvaWQgMCx0ZXh0OnZvaWQgMCxkYXRhOmV9fWZ1bmN0aW9uIGxJKGUsdCl7dHJ5e2xldCBuPWUuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShMayk7aWYobil7bGV0IHI9SlNPTi5wYXJzZShuKTtmb3IobGV0W2ksb11vZiBPYmplY3QuZW50cmllcyhyfHx7fSkpbyYmQXJyYXkuaXNBcnJheShvKSYmdC5zZXQoaSxuZXcgU2V0KG98fFtdKSl9fWNhdGNoe319ZnVuY3Rpb24gc0koZSx0KXtpZih0LnNpemU+MCl7bGV0IG49e307Zm9yKGxldFtyLGldb2YgdCluW3JdPVsuLi5pXTt0cnl7ZS5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKExrLEpTT04uc3RyaW5naWZ5KG4pKX1jYXRjaChyKXtubCghMSwiRmFpbGVkIHRvIHNhdmUgYXBwbGllZCB2aWV3IHRyYW5zaXRpb25zIGluIHNlc3Npb25TdG9yYWdlICgiK3IrIikuIil9fX0vKioKICogUmVhY3QgUm91dGVyIHY2LjIwLjAKICoKICogQ29weXJpZ2h0IChjKSBSZW1peCBTb2Z0d2FyZSBJbmMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFLm1kIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqCiAqIEBsaWNlbnNlIE1JVAogKi9mdW5jdGlvbiBxZCgpe3JldHVybiBxZD1PYmplY3QuYXNzaWduP09iamVjdC5hc3NpZ24uYmluZCgpOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9LHFkLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1jb25zdCBIZj1wLmNyZWF0ZUNvbnRleHQobnVsbCksQms9cC5jcmVhdGVDb250ZXh0KG51bGwpLEtmPXAuY3JlYXRlQ29udGV4dChudWxsKSxaZj1wLmNyZWF0ZUNvbnRleHQobnVsbCksZGw9cC5jcmVhdGVDb250ZXh0KHtvdXRsZXQ6bnVsbCxtYXRjaGVzOltdLGlzRGF0YVJvdXRlOiExfSksVWs9cC5jcmVhdGVDb250ZXh0KG51bGwpO2Z1bmN0aW9uIEdmKCl7cmV0dXJuIHAudXNlQ29udGV4dChaZikhPW51bGx9ZnVuY3Rpb24gV2soKXtyZXR1cm4gR2YoKXx8T2UoITEpLHAudXNlQ29udGV4dChaZikubG9jYXRpb259ZnVuY3Rpb24gVmsoZSl7cC51c2VDb250ZXh0KEtmKS5zdGF0aWN8fHAudXNlTGF5b3V0RWZmZWN0KGUpfWZ1bmN0aW9uIFh2KCl7bGV0e2lzRGF0YVJvdXRlOmV9PXAudXNlQ29udGV4dChkbCk7cmV0dXJuIGU/X0koKTphSSgpfWZ1bmN0aW9uIGFJKCl7R2YoKXx8T2UoITEpO2xldCBlPXAudXNlQ29udGV4dChIZikse2Jhc2VuYW1lOnQsbmF2aWdhdG9yOm59PXAudXNlQ29udGV4dChLZikse21hdGNoZXM6cn09cC51c2VDb250ZXh0KGRsKSx7cGF0aG5hbWU6aX09V2soKSxvPUpTT04uc3RyaW5naWZ5KFBrKHIpKSxsPXAudXNlUmVmKCExKTtyZXR1cm4gVmsoKCk9PntsLmN1cnJlbnQ9ITB9KSxwLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGEsdSl7aWYodT09PXZvaWQgMCYmKHU9e30pLCFsLmN1cnJlbnQpcmV0dXJuO2lmKHR5cGVvZiBhPT0ibnVtYmVyIil7bi5nbyhhKTtyZXR1cm59bGV0IGM9QWsoYSxKU09OLnBhcnNlKG8pLGksdS5yZWxhdGl2ZT09PSJwYXRoIik7ZT09bnVsbCYmdCE9PSIvIiYmKGMucGF0aG5hbWU9Yy5wYXRobmFtZT09PSIvIj90OmVvKFt0LGMucGF0aG5hbWVdKSksKHUucmVwbGFjZT9uLnJlcGxhY2U6bi5wdXNoKShjLHUuc3RhdGUsdSl9LFt0LG4sbyxpLGVdKX1mdW5jdGlvbiB1SSgpe2xldHttYXRjaGVzOmV9PXAudXNlQ29udGV4dChkbCksdD1lW2UubGVuZ3RoLTFdO3JldHVybiB0P3QucGFyYW1zOnt9fWZ1bmN0aW9uIGNJKGUsdCxuKXtHZigpfHxPZSghMSk7bGV0e25hdmlnYXRvcjpyfT1wLnVzZUNvbnRleHQoS2YpLHttYXRjaGVzOml9PXAudXNlQ29udGV4dChkbCksbz1pW2kubGVuZ3RoLTFdLGw9bz9vLnBhcmFtczp7fTtvJiZvLnBhdGhuYW1lO2xldCBzPW8/by5wYXRobmFtZUJhc2U6Ii8iO28mJm8ucm91dGU7bGV0IGE9V2soKSx1O2lmKHQpe3ZhciBjO2xldCBnPXR5cGVvZiB0PT0ic3RyaW5nIj9raSh0KTp0O3M9PT0iLyJ8fChjPWcucGF0aG5hbWUpIT1udWxsJiZjLnN0YXJ0c1dpdGgocyl8fE9lKCExKSx1PWd9ZWxzZSB1PWE7bGV0IGQ9dS5wYXRobmFtZXx8Ii8iLGY9cz09PSIvIj9kOmQuc2xpY2Uocy5sZW5ndGgpfHwiLyIsaD1CbChlLHtwYXRobmFtZTpmfSksbT1tSShoJiZoLm1hcChnPT5PYmplY3QuYXNzaWduKHt9LGcse3BhcmFtczpPYmplY3QuYXNzaWduKHt9LGwsZy5wYXJhbXMpLHBhdGhuYW1lOmVvKFtzLHIuZW5jb2RlTG9jYXRpb24/ci5lbmNvZGVMb2NhdGlvbihnLnBhdGhuYW1lKS5wYXRobmFtZTpnLnBhdGhuYW1lXSkscGF0aG5hbWVCYXNlOmcucGF0aG5hbWVCYXNlPT09Ii8iP3M6ZW8oW3Msci5lbmNvZGVMb2NhdGlvbj9yLmVuY29kZUxvY2F0aW9uKGcucGF0aG5hbWVCYXNlKS5wYXRobmFtZTpnLnBhdGhuYW1lQmFzZV0pfSkpLGksbik7cmV0dXJuIHQmJm0/cC5jcmVhdGVFbGVtZW50KFpmLlByb3ZpZGVyLHt2YWx1ZTp7bG9jYXRpb246cWQoe3BhdGhuYW1lOiIvIixzZWFyY2g6IiIsaGFzaDoiIixzdGF0ZTpudWxsLGtleToiZGVmYXVsdCJ9LHUpLG5hdmlnYXRpb25UeXBlOnd0LlBvcH19LG0pOm19ZnVuY3Rpb24gZEkoKXtsZXQgZT14SSgpLHQ9TWsoZSk/ZS5zdGF0dXMrIiAiK2Uuc3RhdHVzVGV4dDplIGluc3RhbmNlb2YgRXJyb3I/ZS5tZXNzYWdlOkpTT04uc3RyaW5naWZ5KGUpLG49ZSBpbnN0YW5jZW9mIEVycm9yP2Uuc3RhY2s6bnVsbCxpPXtwYWRkaW5nOiIwLjVyZW0iLGJhY2tncm91bmRDb2xvcjoicmdiYSgyMDAsMjAwLDIwMCwgMC41KSJ9LG89bnVsbDtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KHAuRnJhZ21lbnQsbnVsbCxwLmNyZWF0ZUVsZW1lbnQoImgyIixudWxsLCJVbmV4cGVjdGVkIEFwcGxpY2F0aW9uIEVycm9yISIpLHAuY3JlYXRlRWxlbWVudCgiaDMiLHtzdHlsZTp7Zm9udFN0eWxlOiJpdGFsaWMifX0sdCksbj9wLmNyZWF0ZUVsZW1lbnQoInByZSIse3N0eWxlOml9LG4pOm51bGwsbyl9Y29uc3QgZkk9cC5jcmVhdGVFbGVtZW50KGRJLG51bGwpO2NsYXNzIGhJIGV4dGVuZHMgcC5Db21wb25lbnR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5zdGF0ZT17bG9jYXRpb246dC5sb2NhdGlvbixyZXZhbGlkYXRpb246dC5yZXZhbGlkYXRpb24sZXJyb3I6dC5lcnJvcn19c3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcih0KXtyZXR1cm57ZXJyb3I6dH19c3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyh0LG4pe3JldHVybiBuLmxvY2F0aW9uIT09dC5sb2NhdGlvbnx8bi5yZXZhbGlkYXRpb24hPT0iaWRsZSImJnQucmV2YWxpZGF0aW9uPT09ImlkbGUiP3tlcnJvcjp0LmVycm9yLGxvY2F0aW9uOnQubG9jYXRpb24scmV2YWxpZGF0aW9uOnQucmV2YWxpZGF0aW9ufTp7ZXJyb3I6dC5lcnJvcnx8bi5lcnJvcixsb2NhdGlvbjpuLmxvY2F0aW9uLHJldmFsaWRhdGlvbjp0LnJldmFsaWRhdGlvbnx8bi5yZXZhbGlkYXRpb259fWNvbXBvbmVudERpZENhdGNoKHQsbil7Y29uc29sZS5lcnJvcigiUmVhY3QgUm91dGVyIGNhdWdodCB0aGUgZm9sbG93aW5nIGVycm9yIGR1cmluZyByZW5kZXIiLHQsbil9cmVuZGVyKCl7cmV0dXJuIHRoaXMuc3RhdGUuZXJyb3I/cC5jcmVhdGVFbGVtZW50KGRsLlByb3ZpZGVyLHt2YWx1ZTp0aGlzLnByb3BzLnJvdXRlQ29udGV4dH0scC5jcmVhdGVFbGVtZW50KFVrLlByb3ZpZGVyLHt2YWx1ZTp0aGlzLnN0YXRlLmVycm9yLGNoaWxkcmVuOnRoaXMucHJvcHMuY29tcG9uZW50fSkpOnRoaXMucHJvcHMuY2hpbGRyZW59fWZ1bmN0aW9uIHBJKGUpe2xldHtyb3V0ZUNvbnRleHQ6dCxtYXRjaDpuLGNoaWxkcmVuOnJ9PWUsaT1wLnVzZUNvbnRleHQoSGYpO3JldHVybiBpJiZpLnN0YXRpYyYmaS5zdGF0aWNDb250ZXh0JiYobi5yb3V0ZS5lcnJvckVsZW1lbnR8fG4ucm91dGUuRXJyb3JCb3VuZGFyeSkmJihpLnN0YXRpY0NvbnRleHQuX2RlZXBlc3RSZW5kZXJlZEJvdW5kYXJ5SWQ9bi5yb3V0ZS5pZCkscC5jcmVhdGVFbGVtZW50KGRsLlByb3ZpZGVyLHt2YWx1ZTp0fSxyKX1mdW5jdGlvbiBtSShlLHQsbil7dmFyIHI7aWYodD09PXZvaWQgMCYmKHQ9W10pLG49PT12b2lkIDAmJihuPW51bGwpLGU9PW51bGwpe3ZhciBpO2lmKChpPW4pIT1udWxsJiZpLmVycm9ycyllPW4ubWF0Y2hlcztlbHNlIHJldHVybiBudWxsfWxldCBvPWUsbD0ocj1uKT09bnVsbD92b2lkIDA6ci5lcnJvcnM7aWYobCE9bnVsbCl7bGV0IHM9by5maW5kSW5kZXgoYT0+YS5yb3V0ZS5pZCYmKGw9PW51bGw/dm9pZCAwOmxbYS5yb3V0ZS5pZF0pKTtzPj0wfHxPZSghMSksbz1vLnNsaWNlKDAsTWF0aC5taW4oby5sZW5ndGgscysxKSl9cmV0dXJuIG8ucmVkdWNlUmlnaHQoKHMsYSx1KT0+e2xldCBjPWEucm91dGUuaWQ/bD09bnVsbD92b2lkIDA6bFthLnJvdXRlLmlkXTpudWxsLGQ9bnVsbDtuJiYoZD1hLnJvdXRlLmVycm9yRWxlbWVudHx8ZkkpO2xldCBmPXQuY29uY2F0KG8uc2xpY2UoMCx1KzEpKSxoPSgpPT57bGV0IG07cmV0dXJuIGM/bT1kOmEucm91dGUuQ29tcG9uZW50P209cC5jcmVhdGVFbGVtZW50KGEucm91dGUuQ29tcG9uZW50LG51bGwpOmEucm91dGUuZWxlbWVudD9tPWEucm91dGUuZWxlbWVudDptPXMscC5jcmVhdGVFbGVtZW50KHBJLHttYXRjaDphLHJvdXRlQ29udGV4dDp7b3V0bGV0OnMsbWF0Y2hlczpmLGlzRGF0YVJvdXRlOm4hPW51bGx9LGNoaWxkcmVuOm19KX07cmV0dXJuIG4mJihhLnJvdXRlLkVycm9yQm91bmRhcnl8fGEucm91dGUuZXJyb3JFbGVtZW50fHx1PT09MCk/cC5jcmVhdGVFbGVtZW50KGhJLHtsb2NhdGlvbjpuLmxvY2F0aW9uLHJldmFsaWRhdGlvbjpuLnJldmFsaWRhdGlvbixjb21wb25lbnQ6ZCxlcnJvcjpjLGNoaWxkcmVuOmgoKSxyb3V0ZUNvbnRleHQ6e291dGxldDpudWxsLG1hdGNoZXM6Zixpc0RhdGFSb3V0ZTohMH19KTpoKCl9LG51bGwpfXZhciBIaz1mdW5jdGlvbihlKXtyZXR1cm4gZS5Vc2VCbG9ja2VyPSJ1c2VCbG9ja2VyIixlLlVzZVJldmFsaWRhdG9yPSJ1c2VSZXZhbGlkYXRvciIsZS5Vc2VOYXZpZ2F0ZVN0YWJsZT0idXNlTmF2aWdhdGUiLGV9KEhrfHx7fSksZWY9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuVXNlQmxvY2tlcj0idXNlQmxvY2tlciIsZS5Vc2VMb2FkZXJEYXRhPSJ1c2VMb2FkZXJEYXRhIixlLlVzZUFjdGlvbkRhdGE9InVzZUFjdGlvbkRhdGEiLGUuVXNlUm91dGVFcnJvcj0idXNlUm91dGVFcnJvciIsZS5Vc2VOYXZpZ2F0aW9uPSJ1c2VOYXZpZ2F0aW9uIixlLlVzZVJvdXRlTG9hZGVyRGF0YT0idXNlUm91dGVMb2FkZXJEYXRhIixlLlVzZU1hdGNoZXM9InVzZU1hdGNoZXMiLGUuVXNlUmV2YWxpZGF0b3I9InVzZVJldmFsaWRhdG9yIixlLlVzZU5hdmlnYXRlU3RhYmxlPSJ1c2VOYXZpZ2F0ZSIsZS5Vc2VSb3V0ZUlkPSJ1c2VSb3V0ZUlkIixlfShlZnx8e30pO2Z1bmN0aW9uIGdJKGUpe2xldCB0PXAudXNlQ29udGV4dChIZik7cmV0dXJuIHR8fE9lKCExKSx0fWZ1bmN0aW9uIHZJKGUpe2xldCB0PXAudXNlQ29udGV4dChCayk7cmV0dXJuIHR8fE9lKCExKSx0fWZ1bmN0aW9uIHlJKGUpe2xldCB0PXAudXNlQ29udGV4dChkbCk7cmV0dXJuIHR8fE9lKCExKSx0fWZ1bmN0aW9uIEtrKGUpe2xldCB0PXlJKCksbj10Lm1hdGNoZXNbdC5tYXRjaGVzLmxlbmd0aC0xXTtyZXR1cm4gbi5yb3V0ZS5pZHx8T2UoITEpLG4ucm91dGUuaWR9ZnVuY3Rpb24geEkoKXt2YXIgZTtsZXQgdD1wLnVzZUNvbnRleHQoVWspLG49dkkoZWYuVXNlUm91dGVFcnJvcikscj1LayhlZi5Vc2VSb3V0ZUVycm9yKTtyZXR1cm4gdHx8KChlPW4uZXJyb3JzKT09bnVsbD92b2lkIDA6ZVtyXSl9ZnVuY3Rpb24gX0koKXtsZXR7cm91dGVyOmV9PWdJKEhrLlVzZU5hdmlnYXRlU3RhYmxlKSx0PUtrKGVmLlVzZU5hdmlnYXRlU3RhYmxlKSxuPXAudXNlUmVmKCExKTtyZXR1cm4gVmsoKCk9PntuLmN1cnJlbnQ9ITB9KSxwLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGksbyl7bz09PXZvaWQgMCYmKG89e30pLG4uY3VycmVudCYmKHR5cGVvZiBpPT0ibnVtYmVyIj9lLm5hdmlnYXRlKGkpOmUubmF2aWdhdGUoaSxxZCh7ZnJvbVJvdXRlSWQ6dH0sbykpKX0sW2UsdF0pfWZ1bmN0aW9uIHdJKGUpe2xldHtiYXNlbmFtZTp0PSIvIixjaGlsZHJlbjpuPW51bGwsbG9jYXRpb246cixuYXZpZ2F0aW9uVHlwZTppPXd0LlBvcCxuYXZpZ2F0b3I6byxzdGF0aWM6bD0hMX09ZTtHZigpJiZPZSghMSk7bGV0IHM9dC5yZXBsYWNlKC9eXC8qLywiLyIpLGE9cC51c2VNZW1vKCgpPT4oe2Jhc2VuYW1lOnMsbmF2aWdhdG9yOm8sc3RhdGljOmx9KSxbcyxvLGxdKTt0eXBlb2Ygcj09InN0cmluZyImJihyPWtpKHIpKTtsZXR7cGF0aG5hbWU6dT0iLyIsc2VhcmNoOmM9IiIsaGFzaDpkPSIiLHN0YXRlOmY9bnVsbCxrZXk6aD0iZGVmYXVsdCJ9PXIsbT1wLnVzZU1lbW8oKCk9PntsZXQgZz1IdSh1LHMpO3JldHVybiBnPT1udWxsP251bGw6e2xvY2F0aW9uOntwYXRobmFtZTpnLHNlYXJjaDpjLGhhc2g6ZCxzdGF0ZTpmLGtleTpofSxuYXZpZ2F0aW9uVHlwZTppfX0sW3MsdSxjLGQsZixoLGldKTtyZXR1cm4gbT09bnVsbD9udWxsOnAuY3JlYXRlRWxlbWVudChLZi5Qcm92aWRlcix7dmFsdWU6YX0scC5jcmVhdGVFbGVtZW50KFpmLlByb3ZpZGVyLHtjaGlsZHJlbjpuLHZhbHVlOm19KSl9bmV3IFByb21pc2UoKCk9Pnt9KTtmdW5jdGlvbiBTSShlKXtsZXQgdD17aGFzRXJyb3JCb3VuZGFyeTplLkVycm9yQm91bmRhcnkhPW51bGx8fGUuZXJyb3JFbGVtZW50IT1udWxsfTtyZXR1cm4gZS5Db21wb25lbnQmJk9iamVjdC5hc3NpZ24odCx7ZWxlbWVudDpwLmNyZWF0ZUVsZW1lbnQoZS5Db21wb25lbnQpLENvbXBvbmVudDp2b2lkIDB9KSxlLkVycm9yQm91bmRhcnkmJk9iamVjdC5hc3NpZ24odCx7ZXJyb3JFbGVtZW50OnAuY3JlYXRlRWxlbWVudChlLkVycm9yQm91bmRhcnkpLEVycm9yQm91bmRhcnk6dm9pZCAwfSksdH1jb25zdCBaaz1yZS5jcmVhdGVDb250ZXh0KG51bGwpLEVJPWU9Pnt2YXIgcyxhO2NvbnN0IHQ9cmUudXNlQ29udGV4dChaayksW24scl09am4uc3BsaXRNb2R1bGVJZEFuZE1vZHVsZVBhdGgoZSksaT0ocz10PT1udWxsP3ZvaWQgMDp0W25dKT09bnVsbD92b2lkIDA6cy5zb3VyY2Usbz0oYT10PT1udWxsP3ZvaWQgMDp0W25dKT09bnVsbD92b2lkIDA6YS5zY2hlbWE7aWYoIWl8fCFvKXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBtb2R1bGU6ICIrbik7Y29uc3QgbD1qbi5yZXNvbHZlUGF0aChyLGksbyk7cmV0dXJue21vZHVsZUlkOm4sbW9kdWxlU291cmNlOmwuc291cmNlLG1vZHVsZVNjaGVtYTpsLnNjaGVtYX19LENJPSh7YXBpOmV9KT0+e3ZhciBDLFQ7Y29uc3R7IioiOnR9PXVJKCksW24scl09cC51c2VTdGF0ZShudWxsKSxbaSxvXT1wLnVzZVN0YXRlKG51bGwpLFtsLHNdPXAudXNlU3RhdGUoKSxbYV09bD9qbi5zcGxpdE1vZHVsZUlkQW5kTW9kdWxlUGF0aChsKTpbdm9pZCAwLHZvaWQgMF0sdT1hJiYoKEM9bj09bnVsbD92b2lkIDA6blthXSk9PW51bGw/dm9pZCAwOkMuc291cmNlKSxjPWEmJigoVD1uPT1udWxsP3ZvaWQgMDpuW2FdKT09bnVsbD92b2lkIDA6VC5zY2hlbWEpLGQ9T2JqZWN0LmVudHJpZXMobnx8e30pLmZsYXRNYXAoKFtOLFJdKT0+Ui5lcnJvcnM/Ui5lcnJvcnMuZmF0YWw/Ui5lcnJvcnMuZmF0YWwubWFwKEQ9Pih7aWQ6TiwuLi5EfSkpOltdOltdKSxmPU9iamVjdC5lbnRyaWVzKG58fHt9KS5mbGF0TWFwKChbLE5dKT0+Ti5lcnJvcnMmJk4uZXJyb3JzLnZhbGlkYXRpb24/W04uZXJyb3JzLnZhbGlkYXRpb25dOltdKTtpZihkJiZkLmxlbmd0aD4wKXtjb25zdCBOPWQubGVuZ3RoPT09MT9kWzBdLm1lc3NhZ2U6YE11bHRpcGxlIGVycm9ycyBkZXRlY3RlZDoKJHtkLm1hcCgoRCxGKT0+YCR7RisxfS4gWyR7RC5pZH1dOiAke0QubWVzc2FnZX1gKS5qb2luKGAKYCl9CgpTaG93aW5nIHN0YWNrIHRyYWNlIG9mOiAxLiAke2RbMF0ubWVzc2FnZX1gLFI9bmV3IEVycm9yKE4pO3Rocm93IFIuc3RhY2s9ZFswXS5zdGFjayxSfWYmJmYubGVuZ3RoPjAmJmNvbnNvbGUud2FybigiVmFsIGVuY291bnRlcmVkIHZhbGlkYXRpb24gZXJyb3JzOiIsZikscC51c2VFZmZlY3QoKCk9PntzKHQ/YC8ke3R9YDpsKX0sW3RdKTtjb25zdFtoLG1dPXAudXNlU3RhdGUobnVsbCk7cC51c2VFZmZlY3QoKCk9Pnt0cnl7bmV3IFdlYlNvY2tldChgJHt3aW5kb3cubG9jYXRpb24ub3JpZ2luLnJlcGxhY2UoImh0dHA6Ly8iLCJ3czovLyIpfS9fbmV4dC93ZWJwYWNrLWhtcmApLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLFI9PntsZXQgRDt0cnl7RD1KU09OLnBhcnNlKFIuZGF0YSl9Y2F0Y2h7Y29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHBhcnNlIEhNUiIpfXR5cGVvZihEPT1udWxsP3ZvaWQgMDpELmhhc2gpPT0ic3RyaW5nIiYmKEQ9PW51bGw/dm9pZCAwOkQuYWN0aW9uKT09PSJidWlsdCImJm0oRC5oYXNoKX0pfWNhdGNoKE4pe2NvbnNvbGUud2FybigiRmFpbGVkIHRvIGluaXRpYWxpemUgSE1SIixOKX19LFtdKSxwLnVzZUVmZmVjdCgoKT0+e2NvbnNvbGUubG9nKCIoUmUpLWZldGNoaW5nIG1vZHVsZXMiKSxlLmdldFRyZWUoe3BhdGNoOiEwLGluY2x1ZGVTY2hlbWE6ITAsaW5jbHVkZVNvdXJjZTohMH0pLnRoZW4oTj0+e2pvLmlzT2soTik/cihOLnZhbHVlLm1vZHVsZXMpOihvKCJDb3VsZCBub3QgbG9hZCBtb2R1bGVzOiAiK04uZXJyb3IubWVzc2FnZSksY29uc29sZS5lcnJvcihOLmVycm9yKSl9KX0sW2hdKTtjb25zdCBnPWQzKGUpLFM9WHYoKSxbdix5XT1kNSgpLHtwYXRjaGVzOl8sc2V0UGF0Y2hSZXNldElkOnd9PWM1KGcsZSksRT1yZS51c2VSZWYobnVsbCksJD1wLnVzZUNhbGxiYWNrKE49PmFzeW5jIFI9Pntjb25zdFtELEZdPWpuLnNwbGl0TW9kdWxlSWRBbmRNb2R1bGVQYXRoKE4pLHNlPWF3YWl0IFIoam4uY3JlYXRlUGF0Y2hKU09OUGF0aChGKSk7cmV0dXJuIGUucG9zdFBhdGNoZXMoRCxzZSkudGhlbihWPT57aWYoam8uaXNFcnIoVikpdGhyb3cgVi5lcnJvcjtpZighaClyZXR1cm4gdyhLPT5LKzEpLGUuZ2V0VHJlZSh7dHJlZVBhdGg6RCxwYXRjaDohMCxpbmNsdWRlU2NoZW1hOiEwLGluY2x1ZGVTb3VyY2U6ITB9KS50aGVuKEs9Pntqby5pc09rKEspP3IoTz0+KHsuLi5PLC4uLksudmFsdWUubW9kdWxlc30pKToobygiQ291bGQgbm90IGxvYWQgbW9kdWxlczogIitLLmVycm9yLm1lc3NhZ2UpLGNvbnNvbGUuZXJyb3IoSy5lcnJvcikpfSl9KS5jYXRjaChWPT57Y29uc29sZS5lcnJvcihWKX0pfSxbXSk7cmV0dXJuIHguanN4KHhDLlByb3ZpZGVyLHt2YWx1ZTp7dGhlbWU6dixzZXRUaGVtZTp5LGFwaTplLGVkaXRNb2RlOiJmdWxsIixzZXNzaW9uOmcsaGlnaGxpZ2h0OiExLHNldEhpZ2hsaWdodDooKT0+e30sc2V0RWRpdE1vZGU6KCk9Pnt9LHNldFdpbmRvd1NpemU6KCk9Pnt9fSxjaGlsZHJlbjp4LmpzeHMoImRpdiIse2lkOiJ2YWwtZnVsbHNjcmVlbi1jb250YWluZXIiLGNsYXNzTmFtZToicmVsYXRpdmUgZm9udC1zZXJpZiBhbnRpYWxpYXNlZCIsImRhdGEtbW9kZSI6dixjaGlsZHJlbjpbeC5qc3goImRpdiIse2NsYXNzTmFtZToiZml4ZWQgLXRyYW5zbGF0ZS14LTEvMiB6LW92ZXJsYXkgbGVmdC0xLzIgYm90dG9tLTQiLGNoaWxkcmVuOnguanN4KGE1LHthcGk6ZSxwYXRjaGVzOl8sb25Db21taXQ6KCk9PncoTj0+TisxKX0pfSkseC5qc3goImRpdiIse2lkOiJ2YWwtZnVsbHNjcmVlbi1ob3ZlciIscmVmOkV9KSx4LmpzeChHay5Qcm92aWRlcix7dmFsdWU6e2hvdmVyRWxlbTpFPT1udWxsP3ZvaWQgMDpFLmN1cnJlbnR9LGNoaWxkcmVuOnguanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQtcHJpbWFyeSBiZy1iYWNrZ3JvdW5kIixjaGlsZHJlbjp4LmpzeHMoU2Ese2NoaWxkcmVuOlt4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJweC00IGgtWzUwcHhdIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIixjaGlsZHJlbjp4LmpzeChrayx7fSl9KSx4LmpzeCh3YSx7Y2xhc3NOYW1lOiJweC00IixjaGlsZHJlbjpuP3guanN4KEFJLHtwYXRoczpPYmplY3Qua2V5cyhuKSxzZXRTZWxlY3RlZE1vZHVsZUlkOk49PntTKE4pfX0pOiFpJiZ4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJweS00IixjaGlsZHJlbjoiTG9hZGluZy4uLiJ9KX0pLHguanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0IHctZnVsbCBoLVs1MHB4XSBnYXAtMiBmb250LXNlcmlmIHRleHQteHMiLGNoaWxkcmVuOlt4LmpzeCgiYnV0dG9uIix7b25DbGljazooKT0+e2hpc3RvcnkuYmFjaygpfSxjaGlsZHJlbjp4LmpzeChKQSx7fSl9KSx4LmpzeCgicCIse2NoaWxkcmVuOmx8fCIvIn0pXX0pLHguanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJwLTQiLGNoaWxkcmVuOltpJiZ4LmpzeHMoImRpdiIse2NsYXNzTmFtZToidGV4dC1sZyB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQiLGNoaWxkcmVuOlsiRVJST1I6ICIsaV19KSxuJiZsJiZhJiZ1IT09dm9pZCAwJiZjIT09dm9pZCAwJiZ4LmpzeChaay5Qcm92aWRlcix7dmFsdWU6bixjaGlsZHJlbjp4LmpzeCgkSSx7cGF0aDpsLHNvdXJjZTp1LHNjaGVtYTpjLHNldFNlbGVjdGVkUGF0aDpzLGluaXRPblN1Ym1pdDokfSl9KV19KV19KX0pfSldfSl9KX0sR2s9cmUuY3JlYXRlQ29udGV4dCh7aG92ZXJFbGVtOm51bGx9KSxrST0oKT0+cmUudXNlQ29udGV4dChHayk7ZnVuY3Rpb24gJEkoe3BhdGg6ZSxzb3VyY2U6dCxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cixpbml0T25TdWJtaXQ6aX0pe2NvbnN0WyxvXT1qbi5zcGxpdE1vZHVsZUlkQW5kTW9kdWxlUGF0aChlKSxsPWpuLnJlc29sdmVQYXRoKG8sdCxuKTtpZighbCl0aHJvdyBFcnJvcigiQ291bGQgbm90IHJlc29sdmUgbW9kdWxlOiAiK2UpO3JldHVybiB4LmpzeChZayx7cGF0aDplLHNvdXJjZTpsLnNvdXJjZSxzY2hlbWE6bC5zY2hlbWEsc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0OmksdG9wOiEwfSl9ZnVuY3Rpb24gWWsoe3BhdGg6ZSxzb3VyY2U6dCxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cixmaWVsZDppLGluaXRPblN1Ym1pdDpvLHRvcDpsfSl7cmV0dXJuIHQ9PT1udWxsfHxuLm9wdD94LmpzeChSSSx7cGF0aDplLHNvdXJjZTp0LHNjaGVtYTpuLGZpZWxkOmksaW5pdE9uU3VibWl0Om8sc2V0U2VsZWN0ZWRQYXRoOnJ9KTpuLnR5cGU9PT0ib2JqZWN0Ij90eXBlb2YgdCE9Im9iamVjdCJ8fE1hKHQpP3guanN4cygiZGl2Iix7Y2hpbGRyZW46WyJFUlJPUjogZXhwZWN0ZWQgb2JqZWN0LCBidXQgZm91bmQgIix0eXBlb2YgdF19KTp4LmpzeChYayx7c291cmNlOnQscGF0aDplLHNjaGVtYTpuLGluaXRPblN1Ym1pdDpvLHNldFNlbGVjdGVkUGF0aDpyLHRvcDpsfSk6bi50eXBlPT09ImFycmF5Ij90eXBlb2YgdCE9Im9iamVjdCJ8fCFNYSh0KT94LmpzeHMoImRpdiIse2NoaWxkcmVuOlsiRVJST1I6IGV4cGVjdGVkIGFycmF5LCBidXQgZm91bmQgIix0eXBlb2YgdF19KTp4LmpzeChRayx7c291cmNlOnQscGF0aDplLHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyfSk6bi50eXBlPT09InJlY29yZCI/dHlwZW9mIHQhPSJvYmplY3QiP3guanN4cygiZGl2Iix7Y2hpbGRyZW46WyJFUlJPUjogZXhwZWN0ZWQgb2JqZWN0IGZvciAiLG4udHlwZSwiLCBidXQgZm91bmQgIix0eXBlb2YgdF19KTpNYSh0KT94LmpzeHMoImRpdiIse2NoaWxkcmVuOlsiRVJST1I6IGRpZCBub3QgZXhwZWN0IGFycmF5IGZvciAiLG4udHlwZV19KTp4LmpzeChiSSx7c291cmNlOnQscGF0aDplLHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyfSk6eC5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InB5LTIgZ2FwLXktNCIsY2hpbGRyZW46W3guanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQtbGVmdCIsY2hpbGRyZW46aXx8ZX0pLHguanN4KENrLHtwYXRoOmUsZGlzYWJsZWQ6ITEsc291cmNlOnQsc2NoZW1hOm4sb25TdWJtaXQ6byhlKX0pXX0pfWZ1bmN0aW9uIFhrKHtwYXRoOmUsc291cmNlOnQsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0OmksdG9wOm99KXtyZXR1cm4geC5qc3goImRpdiIse2NsYXNzTmFtZTp3ZigiZmxleCBmbGV4LWNvbCBnYXAteS04Iix7ImJvcmRlci1sLTIgYm9yZGVyLWJvcmRlciBwbC02Ijohb30pLGNoaWxkcmVuOk9iamVjdC5lbnRyaWVzKG4uaXRlbXMpLm1hcCgoW2wsc10pPT57Y29uc3QgYT1DdShlLGwpO3JldHVybiB4LmpzeChZayx7cGF0aDphLHNvdXJjZTp0W2xdLHNjaGVtYTpzLHNldFNlbGVjdGVkUGF0aDpyLGZpZWxkOmwsaW5pdE9uU3VibWl0Oml9LGEpfSl9LGUpfWZ1bmN0aW9uIGJJKHtwYXRoOmUsc291cmNlOnQsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnJ9KXtjb25zdCBpPVh2KCk7cmV0dXJuIHguanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1jb2wgZ2FwLTQgcC0yIixjaGlsZHJlbjpPYmplY3QuZW50cmllcyh0KS5tYXAoKFtvLGxdKT0+e2NvbnN0IHM9Q3UoZSxvKTtyZXR1cm4geC5qc3goImJ1dHRvbiIse29uQ2xpY2s6KCk9PntyKHMpLGkocyl9LGNoaWxkcmVuOnguanN4KFRJLHtyZWNvcmRLZXk6byxwYXRoOnMsc291cmNlOmwsc2NoZW1hOm4uaXRlbX0pfSxzKX0pfSxlKX1jb25zdCBZbT0xNzA7ZnVuY3Rpb24gVEkoe3JlY29yZEtleTplLHBhdGg6dCxzb3VyY2U6bixzY2hlbWE6cn0pe2NvbnN0IGk9cmUudXNlUmVmKG51bGwpLFtvLGxdPXAudXNlU3RhdGUoITEpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2kuY3VycmVudCYmaS5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodD49WW0mJmwoITApfSxbXSkseC5qc3hzKFp2LHtyZWY6aSxjbGFzc05hbWU6InJlbGF0aXZlIHB4LTQgcHQtMiBwYi00IG92ZXJmbG93LWhpZGRlbiBib3JkZXIgZ2FwLXktMiIsc3R5bGU6e21heEhlaWdodDpZbX0sY2hpbGRyZW46W3guanN4KCJkaXYiLHtjbGFzc05hbWU6InBiLTQgZm9udC1zZXJpZiB0ZXh0LWxlZnQgdGV4dC1hY2NlbnQiLGNoaWxkcmVuOmV9KSx4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ0ZXh0LXhzIixjaGlsZHJlbjp4LmpzeChRdix7cGF0aDp0LHNvdXJjZTpuLHNjaGVtYTpyfSl9KSxvJiZ4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgdy1mdWxsIGgtWzIwcHhdIGJnLWdyYWRpZW50LXRvLWIgZnJvbS10cmFuc3BhcmVudCB0by1iYWNrZ3JvdW5kIn0pXX0sdCl9ZnVuY3Rpb24gUWsoe3BhdGg6ZSxzb3VyY2U6dCxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cn0pe2NvbnN0IGk9WHYoKTtyZXR1cm4geC5qc3goImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCBnYXAtNCBwLTIiLGNoaWxkcmVuOnQubWFwKChvLGwpPT57Y29uc3Qgcz1DdShlLGwpO3JldHVybiB4LmpzeCgiYnV0dG9uIix7b25DbGljazooKT0+e3IocyksaShzKX0sY2hpbGRyZW46eC5qc3goTkkse2luZGV4OmwscGF0aDpzLHNvdXJjZTpvLHNjaGVtYTpuLml0ZW19LHMpfSxzKX0pfSxlKX1jb25zdCBnXz1ZbTtmdW5jdGlvbiBOSSh7aW5kZXg6ZSxwYXRoOnQsc291cmNlOm4sc2NoZW1hOnJ9KXtjb25zdCBpPXJlLnVzZVJlZihudWxsKSxbbyxsXT1wLnVzZVN0YXRlKCExKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntpLmN1cnJlbnQmJmkuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ+PWdfJiZsKCEwKX0sW10pLHguanN4cyhadix7cmVmOmksY2xhc3NOYW1lOiJyZWxhdGl2ZSBweC00IHB0LTIgcGItNCBvdmVyZmxvdy1oaWRkZW4gYm9yZGVyIGdhcC15LTIiLHN0eWxlOnttYXhIZWlnaHQ6Z199LGNoaWxkcmVuOlt4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJwYi00IGZvbnQtc2VyaWYgdGV4dC1sZWZ0IHVwcGVyY2FzZSB0ZXh0LWFjY2VudCIsY2hpbGRyZW46ZSsxPDEwP2AwJHtlKzF9YDplKzF9KSx4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ0ZXh0LXhzIixjaGlsZHJlbjp4LmpzeChRdix7cGF0aDp0LHNvdXJjZTpuLHNjaGVtYTpyfSl9KSxvJiZ4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgdy1mdWxsIGgtWzIwcHhdIGJnLWdyYWRpZW50LXRvLWIgZnJvbS10cmFuc3BhcmVudCB0by1iYWNrZ3JvdW5kIn0pXX0pfWZ1bmN0aW9uIEN1KGUsdCl7Y29uc3Qgbj1qbi5jcmVhdGVWYWxQYXRoT2ZJdGVtKGUsdCk7aWYoIW4pdGhyb3cgRXJyb3IoYENvdWxkIG5vdCBjcmVhdGUgdmFsIHBhdGg6ICR7ZX0gb2YgJHt0PT1udWxsP3ZvaWQgMDp0LnRvU3RyaW5nKCl9YCk7cmV0dXJuIG59ZnVuY3Rpb24gUXYoe3BhdGg6ZSxzb3VyY2U6dCxzY2hlbWE6bn0pe2NvbnN0W3IsaV09cC51c2VTdGF0ZShudWxsKSx7aG92ZXJFbGVtOm99PWtJKCk7aWYobi50eXBlPT09Im9iamVjdCIpcmV0dXJuIHguanN4KCJkaXYiLHtjbGFzc05hbWU6ImdyaWQgZ3JpZC1jb2xzLVttaW4tY29udGVudF8xZnJdIGdhcC0yIHRleHQtbGVmdCIsY2hpbGRyZW46T2JqZWN0LmVudHJpZXMobi5pdGVtcykubWFwKChbbF0pPT54LmpzeHMocC5GcmFnbWVudCx7Y2hpbGRyZW46W3guanN4cygic3BhbiIse2NsYXNzTmFtZToidGV4dC1tdXRlZCIsY2hpbGRyZW46W2wsIjoiXX0pLHguanN4KCJzcGFuIix7Y2hpbGRyZW46eC5qc3goUXYse3NvdXJjZToodD09bnVsbD92b2lkIDA6dFtsXSk/P251bGwsc2NoZW1hOm4uaXRlbXNbbF0scGF0aDpDdShlLGwpfSl9KV19LEN1KGUsbCkpKX0sZSk7aWYobi50eXBlPT09ImFycmF5IilyZXR1cm4gdD09PW51bGw/eC5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjoiRW1wdHkifSxlKTpBcnJheS5pc0FycmF5KHQpP3guanN4cygic3BhbiIse2NoaWxkcmVuOlt4LmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOnQubGVuZ3RofSkseC5qc3goInNwYW4iLHtjaGlsZHJlbjp0Lmxlbmd0aD09PTE/IiBpdGVtIjoiIGl0ZW1zIn0pXX0sZSk6eC5qc3goInNwYW4iLHtjbGFzc05hbWU6InB4LTIgYmctZGVzdHJ1Y3RpdmUgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIixjaGlsZHJlbjoiVW5rbm93biBsZW5ndGgifSxlKTtpZihuLnR5cGU9PT0icmljaHRleHQiKXJldHVybiB0PT09bnVsbD94LmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOiJFbXB0eSJ9LGUpOnR5cGVvZiB0IT0ib2JqZWN0Ij94LmpzeHMoImRpdiIse2NsYXNzTmFtZToicC00IHRleHQtZGVzdHJ1Y3RpdmUtZm9yZWdyb3VuZCBiZy1kZXN0cnVjdGl2ZSIsY2hpbGRyZW46WyJFUlJPUjogIix0eXBlb2YgdCwiIG5vdCBhbiBvYmplY3QiXX0sZSk6IShubiBpbiB0KXx8dFtubl0hPT0icmljaHRleHQiP3guanN4KCJkaXYiLHtjbGFzc05hbWU6InAtNCB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQgYmctZGVzdHJ1Y3RpdmUiLGNoaWxkcmVuOiJFUlJPUjogb2JqZWN0IGlzIG5vdCByaWNodGV4dCJ9LGUpOnguanN4KE1JLHtjaGlsZHJlbjokUyh0KX0sZSk7aWYobi50eXBlPT09InN0cmluZyIpcmV0dXJuIHQ9PT1udWxsP3guanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46IkVtcHR5In0sZSk6eC5qc3goInNwYW4iLHtjaGlsZHJlbjp0fSk7aWYobi50eXBlPT09ImltYWdlIil7aWYodD09PW51bGwpcmV0dXJuIHguanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46IkVtcHR5In0sZSk7aWYodHlwZW9mIHQhPSJvYmplY3QiKXJldHVybiB4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJwLTQgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIGJnLWRlc3RydWN0aXZlIixjaGlsZHJlbjoiRVJST1I6IG5vdCBhbiBvYmplY3QifSxlKTtpZighKFJuIGluIHQpfHx0eXBlb2YgdFtSbl0hPSJzdHJpbmciKXJldHVybiB4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJwLTQgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIGJnLWRlc3RydWN0aXZlIixjaGlsZHJlbjoiRVJST1I6IG9iamVjdCBpcyBub3QgYW4gaW1hZ2UifSxlKTtjb25zdCBsPWpuLmNvbnZlcnRGaWxlU291cmNlKHQpLnVybDtyZXR1cm4geC5qc3hzKCJzcGFuIix7b25Nb3VzZU92ZXI6cz0+e2koe3g6cy5jbGllbnRYLHk6cy5jbGllbnRZfSl9LG9uTW91c2VMZWF2ZTooKT0+e2kobnVsbCl9LGNsYXNzTmFtZToicmVsYXRpdmUgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1zdGFydCBnYXAtMSIsY2hpbGRyZW46W3guanN4KCJhIix7aHJlZjpsLGNsYXNzTmFtZToib3ZlcmZsb3ctaGlkZGVuIHVuZGVybGluZSB0cnVuY2F0ZSAiLGNoaWxkcmVuOnRbUm5dfSksciYmbyYmR3IuY3JlYXRlUG9ydGFsKHguanN4KCJpbWciLHtjbGFzc05hbWU6ImFic29sdXRlIHotWzVdIG1heC13LVsxMHZ3XSIsc3R5bGU6e2xlZnQ6ci54KzEwLHRvcDpyLnkrMTB9LHNyYzpsfSksbyldfSxlKX1lbHNle2lmKG4udHlwZT09PSJib29sZWFuIilyZXR1cm4gdD09PW51bGw/eC5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjoiRW1wdHkifSxlKTp4LmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOnQ/InRydWUiOiJmYWxzZSJ9LGUpO2lmKG4udHlwZT09PSJudW1iZXIiKXJldHVybiB0PT09bnVsbD94LmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOiJFbXB0eSJ9LGUpOnguanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46dC50b1N0cmluZygpfSk7aWYobi50eXBlPT09ImtleU9mIilyZXR1cm4gdD09PW51bGw/eC5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjoiRW1wdHkifSxlKTp4LmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOnQudG9TdHJpbmcoKX0sZSl9cmV0dXJuIHguanN4cygiZGl2Iix7Y2hpbGRyZW46WyJUT0RPOiAiLG4udHlwZV19LGUpfWZ1bmN0aW9uIFJJKHtwYXRoOmUsc291cmNlOnQsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0OmksZmllbGQ6b30pe2NvbnN0W2wsc109cC51c2VTdGF0ZSh0IT09bnVsbCk7cmV0dXJuIHguanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtY29sIGdhcC15LTYiLGNoaWxkcmVuOltvP3guanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0IGdhcC14LTQiLGNoaWxkcmVuOlt4LmpzeChWbSx7Y2hlY2tlZDpsLG9uQ2xpY2s6KCk9PntzKGE9PiFhKX19KSx4LmpzeCgic3BhbiIse2NoaWxkcmVuOm99KV19KTp4LmpzeChWbSx7Y2hlY2tlZDpsLG9uQ2xpY2s6KCk9PntzKGE9PiFhKX19KSxsJiZ4LmpzeChPSSx7c291cmNlOnQsc2NoZW1hOm4scGF0aDplLHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDppfSldfSxlKX1mdW5jdGlvbiBPSSh7c291cmNlOmUscGF0aDp0LHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDppfSl7aWYobi50eXBlPT09ImFycmF5Iil7aWYodHlwZW9mIGU9PSJvYmplY3QiJiYoZT09PW51bGx8fE1hKGUpKSlyZXR1cm4geC5qc3goUWsse3NvdXJjZTplPT09bnVsbD9bXTplLHBhdGg6dCxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cn0pfWVsc2UgaWYobi50eXBlPT09Im9iamVjdCIpe2lmKHR5cGVvZiBlPT0ib2JqZWN0IiYmKGU9PT1udWxsfHwhTWEoZSkpKXJldHVybiB4LmpzeChYayx7c291cmNlOmUscGF0aDp0LHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDppfSl9ZWxzZSBpZihuLnR5cGU9PT0icmljaHRleHQifHxuLnR5cGU9PT0ic3RyaW5nInx8bi50eXBlPT09ImltYWdlInx8bi50eXBlPT09Im51bWJlciJ8fG4udHlwZT09PSJrZXlPZiIpcmV0dXJuIHguanN4KENrLHtwYXRoOnQsZGlzYWJsZWQ6ITEsc291cmNlOmUsc2NoZW1hOm4sb25TdWJtaXQ6aSh0KX0sdCk7cmV0dXJuIHguanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJwLTQgYmctZGVzdHJ1Y3RpdmUgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIixjaGlsZHJlbjpbIkVSUk9SOiB1bmV4cGVjdGVkIHNvdXJjZSB0eXBlICIsdHlwZW9mIGUsIiBmb3Igc2NoZW1hIHR5cGUiLCIgIixuLnR5cGVdfSl9ZnVuY3Rpb24gTWEoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSl9ZnVuY3Rpb24gUEkoZSl7Y29uc3QgdD17fTtyZXR1cm4gZS5mb3JFYWNoKG49Pntjb25zdCByPW4uc3BsaXQoIi8iKS5maWx0ZXIobz0+byE9PSIiKTtsZXQgaT10O3IuZm9yRWFjaChvPT57aVtvXXx8KGlbb109e30pLGk9aVtvXX0pfSksdH1mdW5jdGlvbiBBSSh7cGF0aHM6ZSxzZXRTZWxlY3RlZE1vZHVsZUlkOnR9KXtjb25zdCBuPVBJKGUpO3JldHVybiB4LmpzeCh2Uyx7Y2hpbGRyZW46T2JqZWN0LmVudHJpZXMobikubWFwKChbcixpXSk9PnguanN4KCJkaXYiLHtjbGFzc05hbWU6InB4LTQgcHktMiIsY2hpbGRyZW46eC5qc3goSmsse25hbWU6cix0cmVlOmksbW9kdWxlSWQ6YC8ke3J9YCxzZXRTZWxlY3RlZE1vZHVsZUlkOnR9KX0sYC8ke3J9YCkpfSl9ZnVuY3Rpb24gSmsoe25hbWU6ZSx0cmVlOnQsbW9kdWxlSWQ6bixzZXRTZWxlY3RlZE1vZHVsZUlkOnJ9KXtyZXR1cm4geC5qc3hzKCJkaXYiLHtjaGlsZHJlbjpbeC5qc3goImJ1dHRvbiIse29uQ2xpY2s6KCk9PntyKG4pfSxjaGlsZHJlbjplfSksT2JqZWN0LmVudHJpZXModCkubWFwKChbaSxvXSk9PnguanN4KCJkaXYiLHtjbGFzc05hbWU6InB4LTQgcHktMSIsY2hpbGRyZW46eC5qc3goSmsse25hbWU6aSx0cmVlOm8sbW9kdWxlSWQ6YCR7bn0vJHtpfWAsc2V0U2VsZWN0ZWRNb2R1bGVJZDpyfSl9LGAke259LyR7aX1gKSldfSl9Y29uc3Qgdl89e3RhZ3M6e2gxOiJmb250LWJvbGQiLGgyOiJmb250LWJvbGQiLGgzOiJmb250LWJvbGQiLGg0OiJmb250LWJvbGQiLGg1OiJmb250LWJvbGQiLGg2OiJmb250LWJvbGQiLHA6IiJ9LGNsYXNzZXM6e2JvbGQ6ImZvbnQtYm9sZCIsaXRhbGljOiJpdGFsaWMiLGxpbmVUaHJvdWdoOiJsaW5lLXRocm91Z2gifX07ZnVuY3Rpb24gTUkoe2NoaWxkcmVuOmV9KXtjb25zdCB0PWU7ZnVuY3Rpb24gbihvLGwpe2NvbnN0IHM9dl8udGFnc1tvXTtyZXR1cm4gcyYmbD9bbCxzXS5qb2luKCIgIik6c3x8bH1mdW5jdGlvbiByKG8sbCl7Y29uc3Qgcz12Xy5jbGFzc2VzW29dO3JldHVybiBzJiZsP1tsLHNdLmpvaW4oIiAiKTpzfHxsfWZ1bmN0aW9uIGkobyxsKXt2YXIgdSxjO2lmKHR5cGVvZiBvPT0ic3RyaW5nIilyZXR1cm4gbztpZihvLnRhZz09PSJwIilyZXR1cm4geC5qc3goInAiLHtjbGFzc05hbWU6bigicCIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJpbWciKXJldHVybiB4LmpzeCgiaW1nIix7Y2xhc3NOYW1lOm4oImltZyIpLHNyYzpvLnNyY30sbCk7aWYoby50YWc9PT0idWwiKXJldHVybiB4LmpzeCgidWwiLHtjbGFzc05hbWU6bigidWwiKSxjaGlsZHJlbjpvLmNoaWxkcmVuLm1hcCgoZCxmKT0+aShkLGYpKX0sbCk7aWYoby50YWc9PT0ib2wiKXJldHVybiB4LmpzeCgib2wiLHtjbGFzc05hbWU6bigib2wiKSxjaGlsZHJlbjpvLmNoaWxkcmVuLm1hcCgoZCxmKT0+aShkLGYpKX0sbCk7aWYoby50YWc9PT0ibGkiKXJldHVybiB4LmpzeCgibGkiLHtjbGFzc05hbWU6bigibGkiKSxjaGlsZHJlbjpvLmNoaWxkcmVuLm1hcCgoZCxmKT0+aShkLGYpKX0sbCk7aWYoby50YWc9PT0ic3BhbiIpcmV0dXJuIHguanN4KCJzcGFuIix7Y2xhc3NOYW1lOm8uY2xhc3Nlcy5tYXAoZD0+e3N3aXRjaChkKXtjYXNlImJvbGQiOnJldHVybiByKCJib2xkIik7Y2FzZSJsaW5lLXRocm91Z2giOnJldHVybiByKCJsaW5lVGhyb3VnaCIpO2Nhc2UiaXRhbGljIjpyZXR1cm4gcigiaXRhbGljIil9fSkuam9pbigiICIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoMSIpcmV0dXJuIHguanN4KCJoMSIse2NsYXNzTmFtZTpuKCJoMSIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoMiIpcmV0dXJuIHguanN4KCJoMiIse2NsYXNzTmFtZTpuKCJoMiIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoMyIpcmV0dXJuIHguanN4KCJoMyIse2NsYXNzTmFtZTpuKCJoMyIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoNCIpcmV0dXJuIHguanN4KCJoNCIse2NsYXNzTmFtZTpuKCJoNCIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoNSIpcmV0dXJuIHguanN4KCJoNSIse2NsYXNzTmFtZTpuKCJoNSIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoNiIpcmV0dXJuIHguanN4KCJoNiIse2NsYXNzTmFtZTpuKCJoNiIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJiciIpcmV0dXJuIHguanN4KCJiciIse30sbCk7aWYoby50YWc9PT0iYSIpcmV0dXJuIHguanN4KCJhIix7aHJlZjpvLmhyZWYsY2hpbGRyZW46by5jaGlsZHJlbi5tYXAoKGQsZik9PmkoZCxmKSl9LGwpO2NvbnNvbGUuZXJyb3IoIlVua25vd24gdGFnIixvLnRhZyk7Y29uc3QgYT1vLnRhZztyZXR1cm4gYSE9bnVsbCYmYS50YWc/cmUuY3JlYXRlRWxlbWVudChhLnRhZyx7a2V5OmwsY2xhc3NOYW1lOih1PWEuY2xhc3MpPT1udWxsP3ZvaWQgMDp1LmpvaW4oIiAiKSxjaGlsZHJlbjooYz1hLmNoaWxkcmVuKT09bnVsbD92b2lkIDA6Yy5tYXAoaSl9KTpudWxsfXJldHVybiB4LmpzeCgic3BhbiIseyJkYXRhLXZhbC1wYXRoIjp0LnZhbFBhdGgsY2hpbGRyZW46dC5jaGlsZHJlbi5tYXAoKG8sbCk9PmkobyxsKSl9KX1jb25zdCBEST1wLmNyZWF0ZUNvbnRleHQobnVsbCksWGg9e2RpZENhdGNoOiExLGVycm9yOm51bGx9O2NsYXNzIElJIGV4dGVuZHMgcC5Db21wb25lbnR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5yZXNldEVycm9yQm91bmRhcnk9dGhpcy5yZXNldEVycm9yQm91bmRhcnkuYmluZCh0aGlzKSx0aGlzLnN0YXRlPVhofXN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IodCl7cmV0dXJue2RpZENhdGNoOiEwLGVycm9yOnR9fXJlc2V0RXJyb3JCb3VuZGFyeSgpe2NvbnN0e2Vycm9yOnR9PXRoaXMuc3RhdGU7aWYodCE9PW51bGwpe2Zvcih2YXIgbixyLGk9YXJndW1lbnRzLmxlbmd0aCxvPW5ldyBBcnJheShpKSxsPTA7bDxpO2wrKylvW2xdPWFyZ3VtZW50c1tsXTsobj0ocj10aGlzLnByb3BzKS5vblJlc2V0KT09PW51bGx8fG49PT12b2lkIDB8fG4uY2FsbChyLHthcmdzOm8scmVhc29uOiJpbXBlcmF0aXZlLWFwaSJ9KSx0aGlzLnNldFN0YXRlKFhoKX19Y29tcG9uZW50RGlkQ2F0Y2godCxuKXt2YXIgcixpOyhyPShpPXRoaXMucHJvcHMpLm9uRXJyb3IpPT09bnVsbHx8cj09PXZvaWQgMHx8ci5jYWxsKGksdCxuKX1jb21wb25lbnREaWRVcGRhdGUodCxuKXtjb25zdHtkaWRDYXRjaDpyfT10aGlzLnN0YXRlLHtyZXNldEtleXM6aX09dGhpcy5wcm9wcztpZihyJiZuLmVycm9yIT09bnVsbCYmTEkodC5yZXNldEtleXMsaSkpe3ZhciBvLGw7KG89KGw9dGhpcy5wcm9wcykub25SZXNldCk9PT1udWxsfHxvPT09dm9pZCAwfHxvLmNhbGwobCx7bmV4dDppLHByZXY6dC5yZXNldEtleXMscmVhc29uOiJrZXlzIn0pLHRoaXMuc2V0U3RhdGUoWGgpfX1yZW5kZXIoKXtjb25zdHtjaGlsZHJlbjp0LGZhbGxiYWNrUmVuZGVyOm4sRmFsbGJhY2tDb21wb25lbnQ6cixmYWxsYmFjazppfT10aGlzLnByb3BzLHtkaWRDYXRjaDpvLGVycm9yOmx9PXRoaXMuc3RhdGU7bGV0IHM9dDtpZihvKXtjb25zdCBhPXtlcnJvcjpsLHJlc2V0RXJyb3JCb3VuZGFyeTp0aGlzLnJlc2V0RXJyb3JCb3VuZGFyeX07aWYocC5pc1ZhbGlkRWxlbWVudChpKSlzPWk7ZWxzZSBpZih0eXBlb2Ygbj09ImZ1bmN0aW9uIilzPW4oYSk7ZWxzZSBpZihyKXM9cC5jcmVhdGVFbGVtZW50KHIsYSk7ZWxzZSB0aHJvdyBsfXJldHVybiBwLmNyZWF0ZUVsZW1lbnQoREkuUHJvdmlkZXIse3ZhbHVlOntkaWRDYXRjaDpvLGVycm9yOmwscmVzZXRFcnJvckJvdW5kYXJ5OnRoaXMucmVzZXRFcnJvckJvdW5kYXJ5fX0scyl9fWZ1bmN0aW9uIExJKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOltdLHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOltdO3JldHVybiBlLmxlbmd0aCE9PXQubGVuZ3RofHxlLnNvbWUoKG4scik9PiFPYmplY3QuaXMobix0W3JdKSl9Y29uc3QgcWs9IkNvbGxhcHNpYmxlIixbakksZSRdPW9sKHFrKSxbekksSnZdPWpJKHFrKSxGST1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQ29sbGFwc2libGU6bixvcGVuOnIsZGVmYXVsdE9wZW46aSxkaXNhYmxlZDpvLG9uT3BlbkNoYW5nZTpsLC4uLnN9PWUsW2E9ITEsdV09Z3Moe3Byb3A6cixkZWZhdWx0UHJvcDppLG9uQ2hhbmdlOmx9KTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KHpJLHtzY29wZTpuLGRpc2FibGVkOm8sY29udGVudElkOmpmKCksb3BlbjphLG9uT3BlblRvZ2dsZTpwLnVzZUNhbGxiYWNrKCgpPT51KGM9PiFjKSxbdV0pfSxwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHsiZGF0YS1zdGF0ZSI6cXYoYSksImRhdGEtZGlzYWJsZWQiOm8/IiI6dm9pZCAwfSxzLHtyZWY6dH0pKSl9KSxCST0iQ29sbGFwc2libGVUcmlnZ2VyIixVST1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQ29sbGFwc2libGU6biwuLi5yfT1lLGk9SnYoQkksbik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChLZS5idXR0b24saWUoe3R5cGU6ImJ1dHRvbiIsImFyaWEtY29udHJvbHMiOmkuY29udGVudElkLCJhcmlhLWV4cGFuZGVkIjppLm9wZW58fCExLCJkYXRhLXN0YXRlIjpxdihpLm9wZW4pLCJkYXRhLWRpc2FibGVkIjppLmRpc2FibGVkPyIiOnZvaWQgMCxkaXNhYmxlZDppLmRpc2FibGVkfSxyLHtyZWY6dCxvbkNsaWNrOm50KGUub25DbGljayxpLm9uT3BlblRvZ2dsZSl9KSl9KSx0JD0iQ29sbGFwc2libGVDb250ZW50IixXST1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtmb3JjZU1vdW50Om4sLi4ucn09ZSxpPUp2KHQkLGUuX19zY29wZUNvbGxhcHNpYmxlKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KFNzLHtwcmVzZW50Om58fGkub3Blbn0sKHtwcmVzZW50Om99KT0+cC5jcmVhdGVFbGVtZW50KFZJLGllKHt9LHIse3JlZjp0LHByZXNlbnQ6b30pKSl9KSxWST1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQ29sbGFwc2libGU6bixwcmVzZW50OnIsY2hpbGRyZW46aSwuLi5vfT1lLGw9SnYodCQsbiksW3MsYV09cC51c2VTdGF0ZShyKSx1PXAudXNlUmVmKG51bGwpLGM9c3QodCx1KSxkPXAudXNlUmVmKDApLGY9ZC5jdXJyZW50LGg9cC51c2VSZWYoMCksbT1oLmN1cnJlbnQsZz1sLm9wZW58fHMsUz1wLnVzZVJlZihnKSx2PXAudXNlUmVmKCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3QgeT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PlMuY3VycmVudD0hMSk7cmV0dXJuKCk9PmNhbmNlbEFuaW1hdGlvbkZyYW1lKHkpfSxbXSksVW4oKCk9Pntjb25zdCB5PXUuY3VycmVudDtpZih5KXt2LmN1cnJlbnQ9di5jdXJyZW50fHx7dHJhbnNpdGlvbkR1cmF0aW9uOnkuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uLGFuaW1hdGlvbk5hbWU6eS5zdHlsZS5hbmltYXRpb25OYW1lfSx5LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj0iMHMiLHkuc3R5bGUuYW5pbWF0aW9uTmFtZT0ibm9uZSI7Y29uc3QgXz15LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2QuY3VycmVudD1fLmhlaWdodCxoLmN1cnJlbnQ9Xy53aWR0aCxTLmN1cnJlbnR8fCh5LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj12LmN1cnJlbnQudHJhbnNpdGlvbkR1cmF0aW9uLHkuc3R5bGUuYW5pbWF0aW9uTmFtZT12LmN1cnJlbnQuYW5pbWF0aW9uTmFtZSksYShyKX19LFtsLm9wZW4scl0pLHAuY3JlYXRlRWxlbWVudChLZS5kaXYsaWUoeyJkYXRhLXN0YXRlIjpxdihsLm9wZW4pLCJkYXRhLWRpc2FibGVkIjpsLmRpc2FibGVkPyIiOnZvaWQgMCxpZDpsLmNvbnRlbnRJZCxoaWRkZW46IWd9LG8se3JlZjpjLHN0eWxlOnsiLS1yYWRpeC1jb2xsYXBzaWJsZS1jb250ZW50LWhlaWdodCI6Zj9gJHtmfXB4YDp2b2lkIDAsIi0tcmFkaXgtY29sbGFwc2libGUtY29udGVudC13aWR0aCI6bT9gJHttfXB4YDp2b2lkIDAsLi4uZS5zdHlsZX19KSxnJiZpKX0pO2Z1bmN0aW9uIHF2KGUpe3JldHVybiBlPyJvcGVuIjoiY2xvc2VkIn1jb25zdCBIST1GSSxLST1VSSxaST1XSSxTbz0iQWNjb3JkaW9uIixHST1bIkhvbWUiLCJFbmQiLCJBcnJvd0Rvd24iLCJBcnJvd1VwIiwiQXJyb3dMZWZ0IiwiQXJyb3dSaWdodCJdLFtleSxZSSxYSV09REMoU28pLFtZZixQTF09b2woU28sW1hJLGUkXSksdHk9ZSQoKSxuJD1yZS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7dHlwZTpuLC4uLnJ9PWUsaT1yLG89cjtyZXR1cm4gcmUuY3JlYXRlRWxlbWVudChleS5Qcm92aWRlcix7c2NvcGU6ZS5fX3Njb3BlQWNjb3JkaW9ufSxuPT09Im11bHRpcGxlIj9yZS5jcmVhdGVFbGVtZW50KGVMLGllKHt9LG8se3JlZjp0fSkpOnJlLmNyZWF0ZUVsZW1lbnQocUksaWUoe30saSx7cmVmOnR9KSkpfSk7biQucHJvcFR5cGVzPXt0eXBlKGUpe2NvbnN0IHQ9ZS52YWx1ZXx8ZS5kZWZhdWx0VmFsdWU7cmV0dXJuIGUudHlwZSYmIVsic2luZ2xlIiwibXVsdGlwbGUiXS5pbmNsdWRlcyhlLnR5cGUpP25ldyBFcnJvcigiSW52YWxpZCBwcm9wIGB0eXBlYCBzdXBwbGllZCB0byBgQWNjb3JkaW9uYC4gRXhwZWN0ZWQgb25lIG9mIGBzaW5nbGUgfCBtdWx0aXBsZWAuIik6ZS50eXBlPT09Im11bHRpcGxlIiYmdHlwZW9mIHQ9PSJzdHJpbmciP25ldyBFcnJvcigiSW52YWxpZCBwcm9wIGB0eXBlYCBzdXBwbGllZCB0byBgQWNjb3JkaW9uYC4gRXhwZWN0ZWQgYHNpbmdsZWAgd2hlbiBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIGlzIHR5cGUgYHN0cmluZ2AuIik6ZS50eXBlPT09InNpbmdsZSImJkFycmF5LmlzQXJyYXkodCk/bmV3IEVycm9yKCJJbnZhbGlkIHByb3AgYHR5cGVgIHN1cHBsaWVkIHRvIGBBY2NvcmRpb25gLiBFeHBlY3RlZCBgbXVsdGlwbGVgIHdoZW4gYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBpcyB0eXBlIGBzdHJpbmdbXWAuIik6bnVsbH19O2NvbnN0W3IkLFFJXT1ZZihTbyksW2kkLEpJXT1ZZihTbyx7Y29sbGFwc2libGU6ITF9KSxxST1yZS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7dmFsdWU6bixkZWZhdWx0VmFsdWU6cixvblZhbHVlQ2hhbmdlOmk9KCk9Pnt9LGNvbGxhcHNpYmxlOm89ITEsLi4ubH09ZSxbcyxhXT1ncyh7cHJvcDpuLGRlZmF1bHRQcm9wOnIsb25DaGFuZ2U6aX0pO3JldHVybiByZS5jcmVhdGVFbGVtZW50KHIkLHtzY29wZTplLl9fc2NvcGVBY2NvcmRpb24sdmFsdWU6cz9bc106W10sb25JdGVtT3BlbjphLG9uSXRlbUNsb3NlOnJlLnVzZUNhbGxiYWNrKCgpPT5vJiZhKCIiKSxbbyxhXSl9LHJlLmNyZWF0ZUVsZW1lbnQoaSQse3Njb3BlOmUuX19zY29wZUFjY29yZGlvbixjb2xsYXBzaWJsZTpvfSxyZS5jcmVhdGVFbGVtZW50KG8kLGllKHt9LGwse3JlZjp0fSkpKSl9KSxlTD1yZS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7dmFsdWU6bixkZWZhdWx0VmFsdWU6cixvblZhbHVlQ2hhbmdlOmk9KCk9Pnt9LC4uLm99PWUsW2w9W10sc109Z3Moe3Byb3A6bixkZWZhdWx0UHJvcDpyLG9uQ2hhbmdlOml9KSxhPXJlLnVzZUNhbGxiYWNrKGM9PnMoKGQ9W10pPT5bLi4uZCxjXSksW3NdKSx1PXJlLnVzZUNhbGxiYWNrKGM9PnMoKGQ9W10pPT5kLmZpbHRlcihmPT5mIT09YykpLFtzXSk7cmV0dXJuIHJlLmNyZWF0ZUVsZW1lbnQociQse3Njb3BlOmUuX19zY29wZUFjY29yZGlvbix2YWx1ZTpsLG9uSXRlbU9wZW46YSxvbkl0ZW1DbG9zZTp1fSxyZS5jcmVhdGVFbGVtZW50KGkkLHtzY29wZTplLl9fc2NvcGVBY2NvcmRpb24sY29sbGFwc2libGU6ITB9LHJlLmNyZWF0ZUVsZW1lbnQobyQsaWUoe30sbyx7cmVmOnR9KSkpKX0pLFt0TCxYZl09WWYoU28pLG8kPXJlLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQWNjb3JkaW9uOm4sZGlzYWJsZWQ6cixkaXI6aSxvcmllbnRhdGlvbjpvPSJ2ZXJ0aWNhbCIsLi4ubH09ZSxzPXJlLnVzZVJlZihudWxsKSxhPXN0KHMsdCksdT1ZSShuKSxkPUdnKGkpPT09Imx0ciIsZj1udChlLm9uS2V5RG93bixoPT57dmFyIG07aWYoIUdJLmluY2x1ZGVzKGgua2V5KSlyZXR1cm47Y29uc3QgZz1oLnRhcmdldCxTPXUoKS5maWx0ZXIoTj0+e3ZhciBSO3JldHVybiEoKFI9Ti5yZWYuY3VycmVudCkhPT1udWxsJiZSIT09dm9pZCAwJiZSLmRpc2FibGVkKX0pLHY9Uy5maW5kSW5kZXgoTj0+Ti5yZWYuY3VycmVudD09PWcpLHk9Uy5sZW5ndGg7aWYodj09PS0xKXJldHVybjtoLnByZXZlbnREZWZhdWx0KCk7bGV0IF89djtjb25zdCB3PTAsRT15LTEsJD0oKT0+e189disxLF8+RSYmKF89dyl9LEM9KCk9PntfPXYtMSxfPHcmJihfPUUpfTtzd2l0Y2goaC5rZXkpe2Nhc2UiSG9tZSI6Xz13O2JyZWFrO2Nhc2UiRW5kIjpfPUU7YnJlYWs7Y2FzZSJBcnJvd1JpZ2h0IjpvPT09Imhvcml6b250YWwiJiYoZD8kKCk6QygpKTticmVhaztjYXNlIkFycm93RG93biI6bz09PSJ2ZXJ0aWNhbCImJiQoKTticmVhaztjYXNlIkFycm93TGVmdCI6bz09PSJob3Jpem9udGFsIiYmKGQ/QygpOiQoKSk7YnJlYWs7Y2FzZSJBcnJvd1VwIjpvPT09InZlcnRpY2FsIiYmQygpO2JyZWFrfWNvbnN0IFQ9XyV5OyhtPVNbVF0ucmVmLmN1cnJlbnQpPT09bnVsbHx8bT09PXZvaWQgMHx8bS5mb2N1cygpfSk7cmV0dXJuIHJlLmNyZWF0ZUVsZW1lbnQodEwse3Njb3BlOm4sZGlzYWJsZWQ6cixkaXJlY3Rpb246aSxvcmllbnRhdGlvbjpvfSxyZS5jcmVhdGVFbGVtZW50KGV5LlNsb3Qse3Njb3BlOm59LHJlLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHt9LGwseyJkYXRhLW9yaWVudGF0aW9uIjpvLHJlZjphLG9uS2V5RG93bjpyP3ZvaWQgMDpmfSkpKSl9KSxYbT0iQWNjb3JkaW9uSXRlbSIsW25MLG55XT1ZZihYbSksckw9cmUuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVBY2NvcmRpb246bix2YWx1ZTpyLC4uLml9PWUsbz1YZihYbSxuKSxsPVFJKFhtLG4pLHM9dHkobiksYT1qZigpLHU9ciYmbC52YWx1ZS5pbmNsdWRlcyhyKXx8ITEsYz1vLmRpc2FibGVkfHxlLmRpc2FibGVkO3JldHVybiByZS5jcmVhdGVFbGVtZW50KG5MLHtzY29wZTpuLG9wZW46dSxkaXNhYmxlZDpjLHRyaWdnZXJJZDphfSxyZS5jcmVhdGVFbGVtZW50KEhJLGllKHsiZGF0YS1vcmllbnRhdGlvbiI6by5vcmllbnRhdGlvbiwiZGF0YS1zdGF0ZSI6bCQodSl9LHMsaSx7cmVmOnQsZGlzYWJsZWQ6YyxvcGVuOnUsb25PcGVuQ2hhbmdlOmQ9PntkP2wub25JdGVtT3BlbihyKTpsLm9uSXRlbUNsb3NlKHIpfX0pKSl9KSxpTD0iQWNjb3JkaW9uSGVhZGVyIixvTD1yZS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZUFjY29yZGlvbjpuLC4uLnJ9PWUsaT1YZihTbyxuKSxvPW55KGlMLG4pO3JldHVybiByZS5jcmVhdGVFbGVtZW50KEtlLmgzLGllKHsiZGF0YS1vcmllbnRhdGlvbiI6aS5vcmllbnRhdGlvbiwiZGF0YS1zdGF0ZSI6bCQoby5vcGVuKSwiZGF0YS1kaXNhYmxlZCI6by5kaXNhYmxlZD8iIjp2b2lkIDB9LHIse3JlZjp0fSkpfSkseV89IkFjY29yZGlvblRyaWdnZXIiLGxMPXJlLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQWNjb3JkaW9uOm4sLi4ucn09ZSxpPVhmKFNvLG4pLG89bnkoeV8sbiksbD1KSSh5XyxuKSxzPXR5KG4pO3JldHVybiByZS5jcmVhdGVFbGVtZW50KGV5Lkl0ZW1TbG90LHtzY29wZTpufSxyZS5jcmVhdGVFbGVtZW50KEtJLGllKHsiYXJpYS1kaXNhYmxlZCI6by5vcGVuJiYhbC5jb2xsYXBzaWJsZXx8dm9pZCAwLCJkYXRhLW9yaWVudGF0aW9uIjppLm9yaWVudGF0aW9uLGlkOm8udHJpZ2dlcklkfSxzLHIse3JlZjp0fSkpKX0pLHNMPSJBY2NvcmRpb25Db250ZW50IixhTD1yZS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZUFjY29yZGlvbjpuLC4uLnJ9PWUsaT1YZihTbyxuKSxvPW55KHNMLG4pLGw9dHkobik7cmV0dXJuIHJlLmNyZWF0ZUVsZW1lbnQoWkksaWUoe3JvbGU6InJlZ2lvbiIsImFyaWEtbGFiZWxsZWRieSI6by50cmlnZ2VySWQsImRhdGEtb3JpZW50YXRpb24iOmkub3JpZW50YXRpb259LGwscix7cmVmOnQsc3R5bGU6eyItLXJhZGl4LWFjY29yZGlvbi1jb250ZW50LWhlaWdodCI6InZhcigtLXJhZGl4LWNvbGxhcHNpYmxlLWNvbnRlbnQtaGVpZ2h0KSIsIi0tcmFkaXgtYWNjb3JkaW9uLWNvbnRlbnQtd2lkdGgiOiJ2YXIoLS1yYWRpeC1jb2xsYXBzaWJsZS1jb250ZW50LXdpZHRoKSIsLi4uZS5zdHlsZX19KSl9KTtmdW5jdGlvbiBsJChlKXtyZXR1cm4gZT8ib3BlbiI6ImNsb3NlZCJ9Y29uc3QgdUw9biQsY0w9ckwsZEw9b0wscyQ9bEwsYSQ9YUwsZkw9dUwsdSQ9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsLi4udH0sbik9PnguanN4KGNMLHtyZWY6bixjbGFzc05hbWU6eHQoImJvcmRlci1iIixlKSwuLi50fSkpO3UkLmRpc3BsYXlOYW1lPSJBY2NvcmRpb25JdGVtIjtjb25zdCBjJD1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSxjaGlsZHJlbjp0LC4uLm59LHIpPT54LmpzeChkTCx7Y2xhc3NOYW1lOiJmbGV4IixjaGlsZHJlbjp4LmpzeHMocyQse3JlZjpyLGNsYXNzTmFtZTp4dCgiZmxleCBmbGV4LTEgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBweS00IGZvbnQtbWVkaXVtIHRyYW5zaXRpb24tYWxsIGhvdmVyOnVuZGVybGluZSBbJltkYXRhLXN0YXRlPW9wZW5dPnN2Z106cm90YXRlLTE4MCIsZSksLi4ubixjaGlsZHJlbjpbdCx4LmpzeChrQyx7Y2xhc3NOYW1lOiJ3LTQgaC00IHRyYW5zaXRpb24tdHJhbnNmb3JtIGR1cmF0aW9uLTIwMCBzaHJpbmstMCJ9KV19KX0pKTtjJC5kaXNwbGF5TmFtZT1zJC5kaXNwbGF5TmFtZTtjb25zdCBkJD1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSxjaGlsZHJlbjp0LC4uLm59LHIpPT54LmpzeChhJCx7cmVmOnIsY2xhc3NOYW1lOnh0KCJvdmVyZmxvdy1oaWRkZW4gdGV4dC1zbSB0cmFuc2l0aW9uLWFsbCBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtYWNjb3JkaW9uLXVwIGRhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtYWNjb3JkaW9uLWRvd24iLGUpLC4uLm4sY2hpbGRyZW46eC5qc3goImRpdiIse2NsYXNzTmFtZToicHQtMCBwYi00IixjaGlsZHJlbjp0fSl9KSk7ZCQuZGlzcGxheU5hbWU9YSQuZGlzcGxheU5hbWU7LyoqCiAqIFJlYWN0IFJvdXRlciBET00gdjYuMjAuMAogKgogKiBDb3B5cmlnaHQgKGMpIFJlbWl4IFNvZnR3YXJlIEluYy4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UubWQgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICoKICogQGxpY2Vuc2UgTUlUCiAqL2Z1bmN0aW9uIHRmKCl7cmV0dXJuIHRmPU9iamVjdC5hc3NpZ24/T2JqZWN0LmFzc2lnbi5iaW5kKCk6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sdGYuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGhMKGUsdCl7cmV0dXJuIFlEKHtiYXNlbmFtZTp0PT1udWxsP3ZvaWQgMDp0LmJhc2VuYW1lLGZ1dHVyZTp0Zih7fSx0PT1udWxsP3ZvaWQgMDp0LmZ1dHVyZSx7djdfcHJlcGVuZEJhc2VuYW1lOiEwfSksaGlzdG9yeTp2RCh7d2luZG93OnQ9PW51bGw/dm9pZCAwOnQud2luZG93fSksaHlkcmF0aW9uRGF0YToodD09bnVsbD92b2lkIDA6dC5oeWRyYXRpb25EYXRhKXx8cEwoKSxyb3V0ZXM6ZSxtYXBSb3V0ZVByb3BlcnRpZXM6U0ksd2luZG93OnQ9PW51bGw/dm9pZCAwOnQud2luZG93fSkuaW5pdGlhbGl6ZSgpfWZ1bmN0aW9uIHBMKCl7dmFyIGU7bGV0IHQ9KGU9d2luZG93KT09bnVsbD92b2lkIDA6ZS5fX3N0YXRpY1JvdXRlckh5ZHJhdGlvbkRhdGE7cmV0dXJuIHQmJnQuZXJyb3JzJiYodD10Zih7fSx0LHtlcnJvcnM6bUwodC5lcnJvcnMpfSkpLHR9ZnVuY3Rpb24gbUwoZSl7aWYoIWUpcmV0dXJuIG51bGw7bGV0IHQ9T2JqZWN0LmVudHJpZXMoZSksbj17fTtmb3IobGV0W3IsaV1vZiB0KWlmKGkmJmkuX190eXBlPT09IlJvdXRlRXJyb3JSZXNwb25zZSIpbltyXT1uZXcgR3YoaS5zdGF0dXMsaS5zdGF0dXNUZXh0LGkuZGF0YSxpLmludGVybmFsPT09ITApO2Vsc2UgaWYoaSYmaS5fX3R5cGU9PT0iRXJyb3IiKXtpZihpLl9fc3ViVHlwZSl7bGV0IG89d2luZG93W2kuX19zdWJUeXBlXTtpZih0eXBlb2Ygbz09ImZ1bmN0aW9uIil0cnl7bGV0IGw9bmV3IG8oaS5tZXNzYWdlKTtsLnN0YWNrPSIiLG5bcl09bH1jYXRjaHt9fWlmKG5bcl09PW51bGwpe2xldCBvPW5ldyBFcnJvcihpLm1lc3NhZ2UpO28uc3RhY2s9IiIsbltyXT1vfX1lbHNlIG5bcl09aTtyZXR1cm4gbn1jb25zdCBnTD1wLmNyZWF0ZUNvbnRleHQoe2lzVHJhbnNpdGlvbmluZzohMX0pLHZMPXAuY3JlYXRlQ29udGV4dChuZXcgTWFwKSx5TD0ic3RhcnRUcmFuc2l0aW9uIix4Xz1QX1t5TF0seEw9ImZsdXNoU3luYyIsX189alRbeExdO2Z1bmN0aW9uIF9MKGUpe3hfP3hfKGUpOmUoKX1mdW5jdGlvbiByYShlKXtfXz9fXyhlKTplKCl9Y2xhc3Mgd0x7Y29uc3RydWN0b3IoKXt0aGlzLnN0YXR1cz0icGVuZGluZyIsdGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKCh0LG4pPT57dGhpcy5yZXNvbHZlPXI9Pnt0aGlzLnN0YXR1cz09PSJwZW5kaW5nIiYmKHRoaXMuc3RhdHVzPSJyZXNvbHZlZCIsdChyKSl9LHRoaXMucmVqZWN0PXI9Pnt0aGlzLnN0YXR1cz09PSJwZW5kaW5nIiYmKHRoaXMuc3RhdHVzPSJyZWplY3RlZCIsbihyKSl9fSl9fWZ1bmN0aW9uIFNMKGUpe2xldHtmYWxsYmFja0VsZW1lbnQ6dCxyb3V0ZXI6bixmdXR1cmU6cn09ZSxbaSxvXT1wLnVzZVN0YXRlKG4uc3RhdGUpLFtsLHNdPXAudXNlU3RhdGUoKSxbYSx1XT1wLnVzZVN0YXRlKHtpc1RyYW5zaXRpb25pbmc6ITF9KSxbYyxkXT1wLnVzZVN0YXRlKCksW2YsaF09cC51c2VTdGF0ZSgpLFttLGddPXAudXNlU3RhdGUoKSxTPXAudXNlUmVmKG5ldyBNYXApLHt2N19zdGFydFRyYW5zaXRpb246dn09cnx8e30seT1wLnVzZUNhbGxiYWNrKEM9Pnt2P19MKEMpOkMoKX0sW3ZdKSxfPXAudXNlQ2FsbGJhY2soKEMsVCk9PntsZXR7ZGVsZXRlZEZldGNoZXJzOk4sdW5zdGFibGVfZmx1c2hTeW5jOlIsdW5zdGFibGVfdmlld1RyYW5zaXRpb25PcHRzOkR9PVQ7Ti5mb3JFYWNoKHNlPT5TLmN1cnJlbnQuZGVsZXRlKHNlKSksQy5mZXRjaGVycy5mb3JFYWNoKChzZSxWKT0+e3NlLmRhdGEhPT12b2lkIDAmJlMuY3VycmVudC5zZXQoVixzZS5kYXRhKX0pO2xldCBGPW4ud2luZG93PT1udWxsfHx0eXBlb2Ygbi53aW5kb3cuZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbiE9ImZ1bmN0aW9uIjtpZighRHx8Ril7Uj9yYSgoKT0+byhDKSk6eSgoKT0+byhDKSk7cmV0dXJufWlmKFIpe3JhKCgpPT57ZiYmKGMmJmMucmVzb2x2ZSgpLGYuc2tpcFRyYW5zaXRpb24oKSksdSh7aXNUcmFuc2l0aW9uaW5nOiEwLGZsdXNoU3luYzohMCxjdXJyZW50TG9jYXRpb246RC5jdXJyZW50TG9jYXRpb24sbmV4dExvY2F0aW9uOkQubmV4dExvY2F0aW9ufSl9KTtsZXQgc2U9bi53aW5kb3cuZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbigoKT0+e3JhKCgpPT5vKEMpKX0pO3NlLmZpbmlzaGVkLmZpbmFsbHkoKCk9PntyYSgoKT0+e2Qodm9pZCAwKSxoKHZvaWQgMCkscyh2b2lkIDApLHUoe2lzVHJhbnNpdGlvbmluZzohMX0pfSl9KSxyYSgoKT0+aChzZSkpO3JldHVybn1mPyhjJiZjLnJlc29sdmUoKSxmLnNraXBUcmFuc2l0aW9uKCksZyh7c3RhdGU6QyxjdXJyZW50TG9jYXRpb246RC5jdXJyZW50TG9jYXRpb24sbmV4dExvY2F0aW9uOkQubmV4dExvY2F0aW9ufSkpOihzKEMpLHUoe2lzVHJhbnNpdGlvbmluZzohMCxmbHVzaFN5bmM6ITEsY3VycmVudExvY2F0aW9uOkQuY3VycmVudExvY2F0aW9uLG5leHRMb2NhdGlvbjpELm5leHRMb2NhdGlvbn0pKX0sW24ud2luZG93LGYsYyxTLHldKTtwLnVzZUxheW91dEVmZmVjdCgoKT0+bi5zdWJzY3JpYmUoXyksW24sX10pLHAudXNlRWZmZWN0KCgpPT57YS5pc1RyYW5zaXRpb25pbmcmJiFhLmZsdXNoU3luYyYmZChuZXcgd0wpfSxbYV0pLHAudXNlRWZmZWN0KCgpPT57aWYoYyYmbCYmbi53aW5kb3cpe2xldCBDPWwsVD1jLnByb21pc2UsTj1uLndpbmRvdy5kb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGFzeW5jKCk9Pnt5KCgpPT5vKEMpKSxhd2FpdCBUfSk7Ti5maW5pc2hlZC5maW5hbGx5KCgpPT57ZCh2b2lkIDApLGgodm9pZCAwKSxzKHZvaWQgMCksdSh7aXNUcmFuc2l0aW9uaW5nOiExfSl9KSxoKE4pfX0sW3ksbCxjLG4ud2luZG93XSkscC51c2VFZmZlY3QoKCk9PntjJiZsJiZpLmxvY2F0aW9uLmtleT09PWwubG9jYXRpb24ua2V5JiZjLnJlc29sdmUoKX0sW2MsZixpLmxvY2F0aW9uLGxdKSxwLnVzZUVmZmVjdCgoKT0+eyFhLmlzVHJhbnNpdGlvbmluZyYmbSYmKHMobS5zdGF0ZSksdSh7aXNUcmFuc2l0aW9uaW5nOiEwLGZsdXNoU3luYzohMSxjdXJyZW50TG9jYXRpb246bS5jdXJyZW50TG9jYXRpb24sbmV4dExvY2F0aW9uOm0ubmV4dExvY2F0aW9ufSksZyh2b2lkIDApKX0sW2EuaXNUcmFuc2l0aW9uaW5nLG1dKTtsZXQgdz1wLnVzZU1lbW8oKCk9Pih7Y3JlYXRlSHJlZjpuLmNyZWF0ZUhyZWYsZW5jb2RlTG9jYXRpb246bi5lbmNvZGVMb2NhdGlvbixnbzpDPT5uLm5hdmlnYXRlKEMpLHB1c2g6KEMsVCxOKT0+bi5uYXZpZ2F0ZShDLHtzdGF0ZTpULHByZXZlbnRTY3JvbGxSZXNldDpOPT1udWxsP3ZvaWQgMDpOLnByZXZlbnRTY3JvbGxSZXNldH0pLHJlcGxhY2U6KEMsVCxOKT0+bi5uYXZpZ2F0ZShDLHtyZXBsYWNlOiEwLHN0YXRlOlQscHJldmVudFNjcm9sbFJlc2V0Ok49PW51bGw/dm9pZCAwOk4ucHJldmVudFNjcm9sbFJlc2V0fSl9KSxbbl0pLEU9bi5iYXNlbmFtZXx8Ii8iLCQ9cC51c2VNZW1vKCgpPT4oe3JvdXRlcjpuLG5hdmlnYXRvcjp3LHN0YXRpYzohMSxiYXNlbmFtZTpFfSksW24sdyxFXSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwscC5jcmVhdGVFbGVtZW50KEhmLlByb3ZpZGVyLHt2YWx1ZTokfSxwLmNyZWF0ZUVsZW1lbnQoQmsuUHJvdmlkZXIse3ZhbHVlOml9LHAuY3JlYXRlRWxlbWVudCh2TC5Qcm92aWRlcix7dmFsdWU6Uy5jdXJyZW50fSxwLmNyZWF0ZUVsZW1lbnQoZ0wuUHJvdmlkZXIse3ZhbHVlOmF9LHAuY3JlYXRlRWxlbWVudCh3SSx7YmFzZW5hbWU6RSxsb2NhdGlvbjppLmxvY2F0aW9uLG5hdmlnYXRpb25UeXBlOmkuaGlzdG9yeUFjdGlvbixuYXZpZ2F0b3I6d30saS5pbml0aWFsaXplZD9wLmNyZWF0ZUVsZW1lbnQoRUwse3JvdXRlczpuLnJvdXRlcyxzdGF0ZTppfSk6dCkpKSkpLG51bGwpfWZ1bmN0aW9uIEVMKGUpe2xldHtyb3V0ZXM6dCxzdGF0ZTpufT1lO3JldHVybiBjSSh0LHZvaWQgMCxuKX12YXIgd187KGZ1bmN0aW9uKGUpe2UuVXNlU2Nyb2xsUmVzdG9yYXRpb249InVzZVNjcm9sbFJlc3RvcmF0aW9uIixlLlVzZVN1Ym1pdD0idXNlU3VibWl0IixlLlVzZVN1Ym1pdEZldGNoZXI9InVzZVN1Ym1pdEZldGNoZXIiLGUuVXNlRmV0Y2hlcj0idXNlRmV0Y2hlciIsZS51c2VWaWV3VHJhbnNpdGlvblN0YXRlPSJ1c2VWaWV3VHJhbnNpdGlvblN0YXRlIn0pKHdffHwod189e30pKTt2YXIgU187KGZ1bmN0aW9uKGUpe2UuVXNlRmV0Y2hlcj0idXNlRmV0Y2hlciIsZS5Vc2VGZXRjaGVycz0idXNlRmV0Y2hlcnMiLGUuVXNlU2Nyb2xsUmVzdG9yYXRpb249InVzZVNjcm9sbFJlc3RvcmF0aW9uIn0pKFNffHwoU189e30pKTtmdW5jdGlvbiBDTCh7ZXJyb3I6ZSxyZXNldEVycm9yQm91bmRhcnk6dH0pe3JldHVybiBjb25zb2xlLmVycm9yKGUpLHguanN4KCJkaXYiLHtjbGFzc05hbWU6ImFic29sdXRlIHRvcC0wIGxlZnQtMCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LXNjcmVlbiBoLXNjcmVlbiBiZy1jYXJkLWZvcmVncm91bmQiLGNoaWxkcmVuOnguanN4KCJkaXYiLHtjbGFzc05hbWU6InctZnVsbCBoLWZ1bGwgcC0xMCIsY2hpbGRyZW46eC5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InctZnVsbCBoLWZ1bGwgcC0xMCBiZy1jYXJkIHRleHQtcHJpbWFyeSIsY2hpbGRyZW46W3guanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4iLGNoaWxkcmVuOlt4LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLVswLjVlbV0gdGV4dC1sZyBmb250LWJvbGQgdGV4dC1jZW50ZXIgcHktMiIsY2hpbGRyZW46W3guanN4KGtrLHt9KSwiIGVuY291bnRlcmVkIGFuIGVycm9yIl19KSx4LmpzeCgiYnV0dG9uIix7b25DbGljazp0LGNoaWxkcmVuOnguanN4KHM1LHt9KX0pXX0pLHguanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQtNHhsIGZvbnQtbm9ybWFsICIsY2hpbGRyZW46Ik1lc3NhZ2U6In0pLHguanN4KCJwcmUiLHtjaGlsZHJlbjplLm1lc3NhZ2V9KSxlLnN0YWNrJiZ4LmpzeChmTCx7dHlwZToic2luZ2xlIixjbGFzc05hbWU6ImZvbnQtc2VyaWYiLGNvbGxhcHNpYmxlOiEwLGRlZmF1bHRWYWx1ZToiZXJyb3IiLGNoaWxkcmVuOnguanN4cyh1JCx7dmFsdWU6ImVycm9yIixjaGlsZHJlbjpbeC5qc3goYyQse2NoaWxkcmVuOiJTdGFjayB0cmFjZToifSkseC5qc3goZCQse2NsYXNzTmFtZToicC00IGJnLXBvcG92ZXIgdGV4dC1wb3BvdmVyLWZvcmVncm91bmQiLGNoaWxkcmVuOmUuc3RhY2smJnguanN4KCJwcmUiLHtjaGlsZHJlbjplLnN0YWNrfSl9KV19KX0pXX0pfSl9KX1mdW5jdGlvbiBrTCgpe2NvbnN0IGU9aEwoW3twYXRoOiIvKiIsZWxlbWVudDp4LmpzeChJSSx7ZmFsbGJhY2tSZW5kZXI6Q0wsY2hpbGRyZW46eC5qc3goQ0kse2FwaTpuZXcgSE4oIi9hcGkvdmFsIil9KX0pfV0se2Jhc2VuYW1lOiIvYXBpL3ZhbC9zdGF0aWMvZWRpdCJ9KTtyZXR1cm4geC5qc3goU0wse3JvdXRlcjplfSl9UWguY3JlYXRlUm9vdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicm9vdCIpKS5yZW5kZXIocmUuY3JlYXRlRWxlbWVudChyZS5TdHJpY3RNb2RlLG51bGwscmUuY3JlYXRlRWxlbWVudChrTCxudWxsKSkpOwo=","/assets/index-q5ozHWoP.css":"Kiw6YmVmb3JlLDphZnRlcntib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym9yZGVyLXdpZHRoOjA7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1jb2xvcjojZTVlN2VifTpiZWZvcmUsOmFmdGVyey0tdHctY29udGVudDogIiJ9aHRtbHtsaW5lLWhlaWdodDoxLjU7LXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OjEwMCU7LW1vei10YWItc2l6ZTo0Oy1vLXRhYi1zaXplOjQ7dGFiLXNpemU6NDtmb250LWZhbWlseTpSb2JvdG8sc2Fucy1zZXJpZjtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWF0aW9uLXNldHRpbmdzOm5vcm1hbH1ib2R5e21hcmdpbjowO2xpbmUtaGVpZ2h0OmluaGVyaXR9aHJ7aGVpZ2h0OjA7Y29sb3I6aW5oZXJpdDtib3JkZXItdG9wLXdpZHRoOjFweH1hYmJyOndoZXJlKFt0aXRsZV0pey13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWQ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWR9aDEsaDIsaDMsaDQsaDUsaDZ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6aW5oZXJpdH1he2NvbG9yOmluaGVyaXQ7dGV4dC1kZWNvcmF0aW9uOmluaGVyaXR9YixzdHJvbmd7Zm9udC13ZWlnaHQ6Ym9sZGVyfWNvZGUsa2JkLHNhbXAscHJle2ZvbnQtZmFtaWx5OnVpLW1vbm9zcGFjZSxTRk1vbm8tUmVndWxhcixNZW5sbyxNb25hY28sQ29uc29sYXMsTGliZXJhdGlvbiBNb25vLENvdXJpZXIgTmV3LG1vbm9zcGFjZTtmb250LXNpemU6MWVtfXNtYWxse2ZvbnQtc2l6ZTo4MCV9c3ViLHN1cHtmb250LXNpemU6NzUlO2xpbmUtaGVpZ2h0OjA7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9c3Vie2JvdHRvbTotLjI1ZW19c3Vwe3RvcDotLjVlbX10YWJsZXt0ZXh0LWluZGVudDowO2JvcmRlci1jb2xvcjppbmhlcml0O2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZX1idXR0b24saW5wdXQsb3B0Z3JvdXAsc2VsZWN0LHRleHRhcmVhe2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1mZWF0dXJlLXNldHRpbmdzOmluaGVyaXQ7Zm9udC12YXJpYXRpb24tc2V0dGluZ3M6aW5oZXJpdDtmb250LXNpemU6MTAwJTtmb250LXdlaWdodDppbmhlcml0O2xpbmUtaGVpZ2h0OmluaGVyaXQ7Y29sb3I6aW5oZXJpdDttYXJnaW46MDtwYWRkaW5nOjB9YnV0dG9uLHNlbGVjdHt0ZXh0LXRyYW5zZm9ybTpub25lfWJ1dHRvbixbdHlwZT1idXR0b25dLFt0eXBlPXJlc2V0XSxbdHlwZT1zdWJtaXRdey13ZWJraXQtYXBwZWFyYW5jZTpidXR0b247YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9Oi1tb3otZm9jdXNyaW5ne291dGxpbmU6YXV0b306LW1vei11aS1pbnZhbGlke2JveC1zaGFkb3c6bm9uZX1wcm9ncmVzc3t2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9ue2hlaWdodDphdXRvfVt0eXBlPXNlYXJjaF17LXdlYmtpdC1hcHBlYXJhbmNlOnRleHRmaWVsZDtvdXRsaW5lLW9mZnNldDotMnB4fTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZX06Oi13ZWJraXQtZmlsZS11cGxvYWQtYnV0dG9uey13ZWJraXQtYXBwZWFyYW5jZTpidXR0b247Zm9udDppbmhlcml0fXN1bW1hcnl7ZGlzcGxheTpsaXN0LWl0ZW19YmxvY2txdW90ZSxkbCxkZCxoMSxoMixoMyxoNCxoNSxoNixocixmaWd1cmUscCxwcmV7bWFyZ2luOjB9ZmllbGRzZXR7bWFyZ2luOjA7cGFkZGluZzowfWxlZ2VuZHtwYWRkaW5nOjB9b2wsdWwsbWVudXtsaXN0LXN0eWxlOm5vbmU7bWFyZ2luOjA7cGFkZGluZzowfWRpYWxvZ3twYWRkaW5nOjB9dGV4dGFyZWF7cmVzaXplOnZlcnRpY2FsfWlucHV0OjotbW96LXBsYWNlaG9sZGVyLHRleHRhcmVhOjotbW96LXBsYWNlaG9sZGVye29wYWNpdHk6MTtjb2xvcjojOWNhM2FmfWlucHV0OjpwbGFjZWhvbGRlcix0ZXh0YXJlYTo6cGxhY2Vob2xkZXJ7b3BhY2l0eToxO2NvbG9yOiM5Y2EzYWZ9YnV0dG9uLFtyb2xlPWJ1dHRvbl17Y3Vyc29yOnBvaW50ZXJ9OmRpc2FibGVke2N1cnNvcjpkZWZhdWx0fWltZyxzdmcsdmlkZW8sY2FudmFzLGF1ZGlvLGlmcmFtZSxlbWJlZCxvYmplY3R7ZGlzcGxheTpibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9aW1nLHZpZGVve21heC13aWR0aDoxMDAlO2hlaWdodDphdXRvfVtoaWRkZW5de2Rpc3BsYXk6bm9uZX06aG9zdHstLWJhY2tncm91bmQ6IDAgMCUgMTAwJTstLWZvcmVncm91bmQ6IDIyMi4yIDg0JSA0LjklOy0tY2FyZDogMCAwJSAxMDAlOy0tY2FyZC1mb3JlZ3JvdW5kOiAyMjIuMiA4NCUgNC45JTstLXBvcG92ZXI6IDAgMCUgMTAwJTstLXBvcG92ZXItZm9yZWdyb3VuZDogMjIyLjIgODQlIDQuOSU7LS1wcmltYXJ5OiAyMjIuMiA0Ny40JSAxMS4yJTstLXByaW1hcnktZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1zZWNvbmRhcnk6IDIxMCA0MCUgOTYuMSU7LS1zZWNvbmRhcnktZm9yZWdyb3VuZDogMjIyLjIgNDcuNCUgMTEuMiU7LS1tdXRlZDogMCAwJSA1Ny4zJTstLW11dGVkLWZvcmVncm91bmQ6IDIxNS40IDE2LjMlIDQ2LjklOy0tYWNjZW50OiAxNTksIDYwJSwgNTElLCAxOy0tYWNjZW50LWZvcmVncm91bmQ6IDIyMi4yIDQ3LjQlIDExLjIlOy0tZGVzdHJ1Y3RpdmU6IDAgODQuMiUgNjAuMiU7LS1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kOiAyMTAgNDAlIDk4JTstLWJvcmRlcjogMjE0LjMgMzEuOCUgOTEuNCU7LS1pbnB1dDogMjE0LjMgMzEuOCUgOTEuNCU7LS1yaW5nOiAyMjIuMiA4NCUgNC45JTstLXJhZGl1czogLjVyZW19OnJvb3R7LS1iYWNrZ3JvdW5kOiAwIDAlIDEwMCU7LS1mb3JlZ3JvdW5kOiAyMjIuMiA4NCUgNC45JTstLWNhcmQ6IDAgMCUgMTAwJTstLWNhcmQtZm9yZWdyb3VuZDogMjIyLjIgODQlIDQuOSU7LS1wb3BvdmVyOiAwIDAlIDEwMCU7LS1wb3BvdmVyLWZvcmVncm91bmQ6IDIyMi4yIDg0JSA0LjklOy0tcHJpbWFyeTogMjIyLjIgNDcuNCUgMTEuMiU7LS1wcmltYXJ5LWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tc2Vjb25kYXJ5OiAyMTAgNDAlIDk2LjElOy0tc2Vjb25kYXJ5LWZvcmVncm91bmQ6IDIyMi4yIDQ3LjQlIDExLjIlOy0tbXV0ZWQ6IDAgMCUgNTcuMyU7LS1tdXRlZC1mb3JlZ3JvdW5kOiAyMTUuNCAxNi4zJSA0Ni45JTstLWFjY2VudDogMTU5LCA2MCUsIDUxJSwgMTstLWFjY2VudC1mb3JlZ3JvdW5kOiAyMjIuMiA0Ny40JSAxMS4yJTstLWRlc3RydWN0aXZlOiAwIDg0LjIlIDYwLjIlOy0tZGVzdHJ1Y3RpdmUtZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1ib3JkZXI6IDIxNC4zIDMxLjglIDkxLjQlOy0taW5wdXQ6IDIxNC4zIDMxLjglIDkxLjQlOy0tcmluZzogMjIyLjIgODQlIDQuOSU7LS1yYWRpdXM6IC41cmVtfSpbZGF0YS1tb2RlPWRhcmtdey0tYmFja2dyb3VuZDogMCAwJSA0JTstLWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tY2FyZDogMjIyLjIgODQlIDQuOSU7LS1jYXJkLWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tcG9wb3ZlcjogMjIyLjIgODQlIDQuOSU7LS1wb3BvdmVyLWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tcHJpbWFyeTogMjEwIDQwJSA5OCU7LS1wcmltYXJ5LWZvcmVncm91bmQ6IDIyMi4yIDQ3LjQlIDExLjIlOy0tc2Vjb25kYXJ5OiAyMTcuMiAzMi42JSAxNy41JTstLXNlY29uZGFyeS1mb3JlZ3JvdW5kOiAyMTAgNDAlIDk4JTstLW11dGVkOiAxNzgsIDIzJSwgNzYlLCAxOy0tbXV0ZWQtZm9yZWdyb3VuZDogMjE1IDIwLjIlIDY1LjElOy0tYWNjZW50OiAxNTksIDYwJSwgNTElLCAxOy0tYWNjZW50LWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tZGVzdHJ1Y3RpdmU6IDAgNjIuOCUgMzAuNiU7LS1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kOiAyMTAgNDAlIDk4JTstLWJvcmRlcjogMjE3LjIgMzIuNiUgMTcuNSU7LS1pbnB1dDogMjE3LjIgMzIuNiUgMTcuNSU7LS1yaW5nOiAyMTIuNyAyNi44JSA4My45JX0qe2JvcmRlci1jb2xvcjpoc2wodmFyKC0tYm9yZGVyKSl9Ym9keXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSk7Y29sb3I6aHNsKHZhcigtLWZvcmVncm91bmQpKX0qLDpiZWZvcmUsOmFmdGVyey0tdHctYm9yZGVyLXNwYWNpbmcteDogMDstLXR3LWJvcmRlci1zcGFjaW5nLXk6IDA7LS10dy10cmFuc2xhdGUteDogMDstLXR3LXRyYW5zbGF0ZS15OiAwOy0tdHctcm90YXRlOiAwOy0tdHctc2tldy14OiAwOy0tdHctc2tldy15OiAwOy0tdHctc2NhbGUteDogMTstLXR3LXNjYWxlLXk6IDE7LS10dy1wYW4teDogOy0tdHctcGFuLXk6IDstLXR3LXBpbmNoLXpvb206IDstLXR3LXNjcm9sbC1zbmFwLXN0cmljdG5lc3M6IHByb3hpbWl0eTstLXR3LWdyYWRpZW50LWZyb20tcG9zaXRpb246IDstLXR3LWdyYWRpZW50LXZpYS1wb3NpdGlvbjogOy0tdHctZ3JhZGllbnQtdG8tcG9zaXRpb246IDstLXR3LW9yZGluYWw6IDstLXR3LXNsYXNoZWQtemVybzogOy0tdHctbnVtZXJpYy1maWd1cmU6IDstLXR3LW51bWVyaWMtc3BhY2luZzogOy0tdHctbnVtZXJpYy1mcmFjdGlvbjogOy0tdHctcmluZy1pbnNldDogOy0tdHctcmluZy1vZmZzZXQtd2lkdGg6IDBweDstLXR3LXJpbmctb2Zmc2V0LWNvbG9yOiAjZmZmOy0tdHctcmluZy1jb2xvcjogcmdiKDU5IDEzMCAyNDYgLyAuNSk7LS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IDAgMCAjMDAwMDstLXR3LXJpbmctc2hhZG93OiAwIDAgIzAwMDA7LS10dy1zaGFkb3c6IDAgMCAjMDAwMDstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDAgIzAwMDA7LS10dy1ibHVyOiA7LS10dy1icmlnaHRuZXNzOiA7LS10dy1jb250cmFzdDogOy0tdHctZ3JheXNjYWxlOiA7LS10dy1odWUtcm90YXRlOiA7LS10dy1pbnZlcnQ6IDstLXR3LXNhdHVyYXRlOiA7LS10dy1zZXBpYTogOy0tdHctZHJvcC1zaGFkb3c6IDstLXR3LWJhY2tkcm9wLWJsdXI6IDstLXR3LWJhY2tkcm9wLWJyaWdodG5lc3M6IDstLXR3LWJhY2tkcm9wLWNvbnRyYXN0OiA7LS10dy1iYWNrZHJvcC1ncmF5c2NhbGU6IDstLXR3LWJhY2tkcm9wLWh1ZS1yb3RhdGU6IDstLXR3LWJhY2tkcm9wLWludmVydDogOy0tdHctYmFja2Ryb3Atb3BhY2l0eTogOy0tdHctYmFja2Ryb3Atc2F0dXJhdGU6IDstLXR3LWJhY2tkcm9wLXNlcGlhOiB9OjpiYWNrZHJvcHstLXR3LWJvcmRlci1zcGFjaW5nLXg6IDA7LS10dy1ib3JkZXItc3BhY2luZy15OiAwOy0tdHctdHJhbnNsYXRlLXg6IDA7LS10dy10cmFuc2xhdGUteTogMDstLXR3LXJvdGF0ZTogMDstLXR3LXNrZXcteDogMDstLXR3LXNrZXcteTogMDstLXR3LXNjYWxlLXg6IDE7LS10dy1zY2FsZS15OiAxOy0tdHctcGFuLXg6IDstLXR3LXBhbi15OiA7LS10dy1waW5jaC16b29tOiA7LS10dy1zY3JvbGwtc25hcC1zdHJpY3RuZXNzOiBwcm94aW1pdHk7LS10dy1ncmFkaWVudC1mcm9tLXBvc2l0aW9uOiA7LS10dy1ncmFkaWVudC12aWEtcG9zaXRpb246IDstLXR3LWdyYWRpZW50LXRvLXBvc2l0aW9uOiA7LS10dy1vcmRpbmFsOiA7LS10dy1zbGFzaGVkLXplcm86IDstLXR3LW51bWVyaWMtZmlndXJlOiA7LS10dy1udW1lcmljLXNwYWNpbmc6IDstLXR3LW51bWVyaWMtZnJhY3Rpb246IDstLXR3LXJpbmctaW5zZXQ6IDstLXR3LXJpbmctb2Zmc2V0LXdpZHRoOiAwcHg7LS10dy1yaW5nLW9mZnNldC1jb2xvcjogI2ZmZjstLXR3LXJpbmctY29sb3I6IHJnYig1OSAxMzAgMjQ2IC8gLjUpOy0tdHctcmluZy1vZmZzZXQtc2hhZG93OiAwIDAgIzAwMDA7LS10dy1yaW5nLXNoYWRvdzogMCAwICMwMDAwOy0tdHctc2hhZG93OiAwIDAgIzAwMDA7LS10dy1zaGFkb3ctY29sb3JlZDogMCAwICMwMDAwOy0tdHctYmx1cjogOy0tdHctYnJpZ2h0bmVzczogOy0tdHctY29udHJhc3Q6IDstLXR3LWdyYXlzY2FsZTogOy0tdHctaHVlLXJvdGF0ZTogOy0tdHctaW52ZXJ0OiA7LS10dy1zYXR1cmF0ZTogOy0tdHctc2VwaWE6IDstLXR3LWRyb3Atc2hhZG93OiA7LS10dy1iYWNrZHJvcC1ibHVyOiA7LS10dy1iYWNrZHJvcC1icmlnaHRuZXNzOiA7LS10dy1iYWNrZHJvcC1jb250cmFzdDogOy0tdHctYmFja2Ryb3AtZ3JheXNjYWxlOiA7LS10dy1iYWNrZHJvcC1odWUtcm90YXRlOiA7LS10dy1iYWNrZHJvcC1pbnZlcnQ6IDstLXR3LWJhY2tkcm9wLW9wYWNpdHk6IDstLXR3LWJhY2tkcm9wLXNhdHVyYXRlOiA7LS10dy1iYWNrZHJvcC1zZXBpYTogfS5zci1vbmx5e3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtoZWlnaHQ6MXB4O3BhZGRpbmc6MDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47Y2xpcDpyZWN0KDAsMCwwLDApO3doaXRlLXNwYWNlOm5vd3JhcDtib3JkZXItd2lkdGg6MH0ucG9pbnRlci1ldmVudHMtbm9uZXtwb2ludGVyLWV2ZW50czpub25lfS5pbnZpc2libGV7dmlzaWJpbGl0eTpoaWRkZW59LnN0YXRpY3twb3NpdGlvbjpzdGF0aWN9LmZpeGVke3Bvc2l0aW9uOmZpeGVkfS5hYnNvbHV0ZXtwb3NpdGlvbjphYnNvbHV0ZX0ucmVsYXRpdmV7cG9zaXRpb246cmVsYXRpdmV9LnN0aWNreXtwb3NpdGlvbjpzdGlja3l9Lmluc2V0LTB7dG9wOjA7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjB9Lmluc2V0LXktMHt0b3A6MDtib3R0b206MH0uLWxlZnQtMntsZWZ0Oi0uNXJlbX0uLXJpZ2h0LVxbMTBweFxde3JpZ2h0Oi0xMHB4fS4tdG9wLVxbMTBweFxde3RvcDotMTBweH0uLXRvcC1cWzRweFxde3RvcDotNHB4fS5ib3R0b20tMHtib3R0b206MH0uYm90dG9tLTR7Ym90dG9tOjFyZW19LmxlZnQtMHtsZWZ0OjB9LmxlZnQtMXtsZWZ0Oi4yNXJlbX0ubGVmdC0xXC8ye2xlZnQ6NTAlfS5sZWZ0LTJ7bGVmdDouNXJlbX0ubGVmdC1cWzUwXCVcXXtsZWZ0OjUwJX0ucmlnaHQtMHtyaWdodDowfS5yaWdodC0xe3JpZ2h0Oi4yNXJlbX0ucmlnaHQtNHtyaWdodDoxcmVtfS5yaWdodC1cWzE2cHhcXXtyaWdodDoxNnB4fS50b3AtMHt0b3A6MH0udG9wLTR7dG9wOjFyZW19LnRvcC1cWzUwXCVcXXt0b3A6NTAlfS56LTUwe3otaW5kZXg6NTB9LnotXFs1XF17ei1pbmRleDo1fS56LW92ZXJsYXl7ei1pbmRleDo0fS4tbXgtMXttYXJnaW4tbGVmdDotLjI1cmVtO21hcmdpbi1yaWdodDotLjI1cmVtfS4tbXktMnttYXJnaW4tdG9wOi0uNXJlbTttYXJnaW4tYm90dG9tOi0uNXJlbX0uLW15LVxbMTAwcHhcXXttYXJnaW4tdG9wOi0xMDBweDttYXJnaW4tYm90dG9tOi0xMDBweH0ubXgtMnttYXJnaW4tbGVmdDouNXJlbTttYXJnaW4tcmlnaHQ6LjVyZW19Lm15LTF7bWFyZ2luLXRvcDouMjVyZW07bWFyZ2luLWJvdHRvbTouMjVyZW19Lm1iLTR7bWFyZ2luLWJvdHRvbToxcmVtfS5tbC0ye21hcmdpbi1sZWZ0Oi41cmVtfS5tbC00e21hcmdpbi1sZWZ0OjFyZW19Lm1sLVxbMjBweFxde21hcmdpbi1sZWZ0OjIwcHh9Lm1sLWF1dG97bWFyZ2luLWxlZnQ6YXV0b30ubXItMnttYXJnaW4tcmlnaHQ6LjVyZW19Lm10LTJ7bWFyZ2luLXRvcDouNXJlbX0uYmxvY2t7ZGlzcGxheTpibG9ja30uaW5saW5le2Rpc3BsYXk6aW5saW5lfS5mbGV4e2Rpc3BsYXk6ZmxleH0uaW5saW5lLWZsZXh7ZGlzcGxheTppbmxpbmUtZmxleH0udGFibGV7ZGlzcGxheTp0YWJsZX0uZ3JpZHtkaXNwbGF5OmdyaWR9LmhpZGRlbntkaXNwbGF5Om5vbmV9LmFzcGVjdC1zcXVhcmV7YXNwZWN0LXJhdGlvOjEgLyAxfS5oLTEwe2hlaWdodDoyLjVyZW19LmgtMTF7aGVpZ2h0OjIuNzVyZW19LmgtMntoZWlnaHQ6LjVyZW19LmgtMlwuNXtoZWlnaHQ6LjYyNXJlbX0uaC0ze2hlaWdodDouNzVyZW19LmgtM1wuNXtoZWlnaHQ6Ljg3NXJlbX0uaC00e2hlaWdodDoxcmVtfS5oLTd7aGVpZ2h0OjEuNzVyZW19LmgtOXtoZWlnaHQ6Mi4yNXJlbX0uaC1cWzE0cHhcXXtoZWlnaHQ6MTRweH0uaC1cWzE4cHhcXXtoZWlnaHQ6MThweH0uaC1cWzFweFxde2hlaWdodDoxcHh9LmgtXFsyMHB4XF17aGVpZ2h0OjIwcHh9LmgtXFsyMnB4XF17aGVpZ2h0OjIycHh9LmgtXFsyNHB4XF17aGVpZ2h0OjI0cHh9LmgtXFszMnB4XF17aGVpZ2h0OjMycHh9LmgtXFs1MHB4XF17aGVpZ2h0OjUwcHh9LmgtXFs3NXB4XF17aGVpZ2h0Ojc1cHh9LmgtXFs5cHhcXXtoZWlnaHQ6OXB4fS5oLVxbdmFyXCgtLXJhZGl4LXNlbGVjdC10cmlnZ2VyLWhlaWdodFwpXF17aGVpZ2h0OnZhcigtLXJhZGl4LXNlbGVjdC10cmlnZ2VyLWhlaWdodCl9LmgtZnVsbHtoZWlnaHQ6MTAwJX0uaC1weHtoZWlnaHQ6MXB4fS5oLXNjcmVlbntoZWlnaHQ6MTAwdmh9Lm1heC1oLVxbMzAwcHhcXXttYXgtaGVpZ2h0OjMwMHB4fS5taW4taC1cWzIwMHB4XF17bWluLWhlaWdodDoyMDBweH0ubWluLWgtXFszMDBweFxde21pbi1oZWlnaHQ6MzAwcHh9Lm1pbi1oLXNjcmVlbnttaW4taGVpZ2h0OjEwMHZofS53LTFcLzN7d2lkdGg6MzMuMzMzMzMzJX0udy0xMHt3aWR0aDoyLjVyZW19LnctMnt3aWR0aDouNXJlbX0udy0yXC41e3dpZHRoOi42MjVyZW19LnctM3t3aWR0aDouNzVyZW19LnctM1wuNXt3aWR0aDouODc1cmVtfS53LTR7d2lkdGg6MXJlbX0udy01e3dpZHRoOjEuMjVyZW19LnctN3t3aWR0aDoxLjc1cmVtfS53LTcye3dpZHRoOjE4cmVtfS53LTl7d2lkdGg6Mi4yNXJlbX0udy1cWzE0cHhcXXt3aWR0aDoxNHB4fS53LVxbMXB4XF17d2lkdGg6MXB4fS53LVxbMjBweFxde3dpZHRoOjIwcHh9LnctXFsyNHB4XF17d2lkdGg6MjRweH0udy1cWzMycHhcXXt3aWR0aDozMnB4fS53LVxbNDRweFxde3dpZHRoOjQ0cHh9LnctXFs5cHhcXXt3aWR0aDo5cHh9LnctZml0e3dpZHRoOi1tb3otZml0LWNvbnRlbnQ7d2lkdGg6Zml0LWNvbnRlbnR9LnctZnVsbHt3aWR0aDoxMDAlfS53LXNjcmVlbnt3aWR0aDoxMDB2d30ubWluLXctMHttaW4td2lkdGg6MHB4fS5taW4tdy1cWzMyMHB4XF17bWluLXdpZHRoOjMyMHB4fS5taW4tdy1cWzUwMHB4XF17bWluLXdpZHRoOjUwMHB4fS5taW4tdy1cWzhyZW1cXXttaW4td2lkdGg6OHJlbX0ubWluLXctXFt2YXJcKC0tcmFkaXgtc2VsZWN0LXRyaWdnZXItd2lkdGhcKVxde21pbi13aWR0aDp2YXIoLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci13aWR0aCl9Lm1heC13LTR4bHttYXgtd2lkdGg6NTZyZW19Lm1heC13LVxbMTAwMHB4XF17bWF4LXdpZHRoOjEwMDBweH0ubWF4LXctXFsxMHZ3XF17bWF4LXdpZHRoOjEwdnd9Lm1heC13LVxbMzAwcHhcXXttYXgtd2lkdGg6MzAwcHh9Lm1heC13LVxbOTB2d1xde21heC13aWR0aDo5MHZ3fS5tYXgtdy1sZ3ttYXgtd2lkdGg6MzJyZW19LmZsZXgtMXtmbGV4OjEgMSAwJX0uZmxleC1hdXRve2ZsZXg6MSAxIGF1dG99LmZsZXgtc2hyaW5rLTAsLnNocmluay0we2ZsZXgtc2hyaW5rOjB9LmZsZXgtZ3Jvd3tmbGV4LWdyb3c6MX0uYm9yZGVyLWNvbGxhcHNle2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZX0uLXRyYW5zbGF0ZS14LTFcLzIsLnRyYW5zbGF0ZS14LVxbLTUwXCVcXXstLXR3LXRyYW5zbGF0ZS14OiAtNTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS50cmFuc2xhdGUteS1cWy01MFwlXF17LS10dy10cmFuc2xhdGUteTogLTUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uLXJvdGF0ZS05MHstLXR3LXJvdGF0ZTogLTkwZGVnO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5yb3RhdGUtOTB7LS10dy1yb3RhdGU6IDkwZGVnO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5yb3RhdGUtXFstOTBkZWdcXXstLXR3LXJvdGF0ZTogLTkwZGVnO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5yb3RhdGUtXFs5MGRlZ1xdey0tdHctcm90YXRlOiA5MGRlZzt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0udHJhbnNmb3Jte3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5jdXJzb3ItY29sLXJlc2l6ZXtjdXJzb3I6Y29sLXJlc2l6ZX0uY3Vyc29yLWRlZmF1bHR7Y3Vyc29yOmRlZmF1bHR9LmN1cnNvci1ncmFie2N1cnNvcjpncmFifS5jdXJzb3ItcG9pbnRlcntjdXJzb3I6cG9pbnRlcn0uY3Vyc29yLXNlLXJlc2l6ZXtjdXJzb3I6c2UtcmVzaXplfS50b3VjaC1ub25le3RvdWNoLWFjdGlvbjpub25lfS5zZWxlY3Qtbm9uZXstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9LnJlc2l6ZS1ub25le3Jlc2l6ZTpub25lfS5yZXNpemV7cmVzaXplOmJvdGh9Lmxpc3QtZGVjaW1hbHtsaXN0LXN0eWxlLXR5cGU6ZGVjaW1hbH0ubGlzdC1kaXNje2xpc3Qtc3R5bGUtdHlwZTpkaXNjfS5ncmlkLWNvbHMtXFttaW4tY29udGVudF8xZnJcXXtncmlkLXRlbXBsYXRlLWNvbHVtbnM6bWluLWNvbnRlbnQgMWZyfS5ncmlkLXJvd3MtXFsxZnJcLF9taW4tY29udGVudFxde2dyaWQtdGVtcGxhdGUtcm93czoxZnIgbWluLWNvbnRlbnR9LmZsZXgtcm93e2ZsZXgtZGlyZWN0aW9uOnJvd30uZmxleC1jb2x7ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5mbGV4LWNvbC1yZXZlcnNle2ZsZXgtZGlyZWN0aW9uOmNvbHVtbi1yZXZlcnNlfS5pdGVtcy1zdGFydHthbGlnbi1pdGVtczpmbGV4LXN0YXJ0fS5pdGVtcy1jZW50ZXJ7YWxpZ24taXRlbXM6Y2VudGVyfS5qdXN0aWZ5LXN0YXJ0e2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0fS5qdXN0aWZ5LWVuZHtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9Lmp1c3RpZnktY2VudGVye2p1c3RpZnktY29udGVudDpjZW50ZXJ9Lmp1c3RpZnktYmV0d2VlbntqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbn0uZ2FwLTF7Z2FwOi4yNXJlbX0uZ2FwLTJ7Z2FwOi41cmVtfS5nYXAtM3tnYXA6Ljc1cmVtfS5nYXAtNHtnYXA6MXJlbX0uZ2FwLTV7Z2FwOjEuMjVyZW19LmdhcC1cWzBcLjVlbVxde2dhcDouNWVtfS5nYXAtXFszNnB4XF17Z2FwOjM2cHh9LmdhcC14LTJ7LW1vei1jb2x1bW4tZ2FwOi41cmVtO2NvbHVtbi1nYXA6LjVyZW19LmdhcC14LTN7LW1vei1jb2x1bW4tZ2FwOi43NXJlbTtjb2x1bW4tZ2FwOi43NXJlbX0uZ2FwLXgtNHstbW96LWNvbHVtbi1nYXA6MXJlbTtjb2x1bW4tZ2FwOjFyZW19LmdhcC15LTJ7cm93LWdhcDouNXJlbX0uZ2FwLXktNHtyb3ctZ2FwOjFyZW19LmdhcC15LTZ7cm93LWdhcDoxLjVyZW19LmdhcC15LTh7cm93LWdhcDoycmVtfS5zcGFjZS14LTE+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS14LXJldmVyc2U6IDA7bWFyZ2luLXJpZ2h0OmNhbGMoLjI1cmVtICogdmFyKC0tdHctc3BhY2UteC1yZXZlcnNlKSk7bWFyZ2luLWxlZnQ6Y2FsYyguMjVyZW0gKiBjYWxjKDEgLSB2YXIoLS10dy1zcGFjZS14LXJldmVyc2UpKSl9LnNwYWNlLXktMT46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXktcmV2ZXJzZTogMDttYXJnaW4tdG9wOmNhbGMoLjI1cmVtICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSkpO21hcmdpbi1ib3R0b206Y2FsYyguMjVyZW0gKiB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKX0uc3BhY2UteS0xXC41Pjpub3QoW2hpZGRlbl0pfjpub3QoW2hpZGRlbl0pey0tdHctc3BhY2UteS1yZXZlcnNlOiAwO21hcmdpbi10b3A6Y2FsYyguMzc1cmVtICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSkpO21hcmdpbi1ib3R0b206Y2FsYyguMzc1cmVtICogdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSl9LnNwYWNlLXktMj46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXktcmV2ZXJzZTogMDttYXJnaW4tdG9wOmNhbGMoLjVyZW0gKiBjYWxjKDEgLSB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKSk7bWFyZ2luLWJvdHRvbTpjYWxjKC41cmVtICogdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSl9LnNwYWNlLXktND46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXktcmV2ZXJzZTogMDttYXJnaW4tdG9wOmNhbGMoMXJlbSAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpKTttYXJnaW4tYm90dG9tOmNhbGMoMXJlbSAqIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpfS5vdmVyZmxvdy1hdXRve292ZXJmbG93OmF1dG99Lm92ZXJmbG93LWhpZGRlbntvdmVyZmxvdzpoaWRkZW59Lm92ZXJmbG93LWNsaXB7b3ZlcmZsb3c6Y2xpcH0ub3ZlcmZsb3ctc2Nyb2xse292ZXJmbG93OnNjcm9sbH0ub3ZlcmZsb3cteS1hdXRve292ZXJmbG93LXk6YXV0b30ub3ZlcmZsb3cteC1oaWRkZW57b3ZlcmZsb3cteDpoaWRkZW59Lm92ZXJmbG93LXktc2Nyb2xse292ZXJmbG93LXk6c2Nyb2xsfS50cnVuY2F0ZXtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9LndoaXRlc3BhY2Utbm93cmFwe3doaXRlLXNwYWNlOm5vd3JhcH0ucm91bmRlZHtib3JkZXItcmFkaXVzOi4yNXJlbX0ucm91bmRlZC1cW2luaGVyaXRcXXtib3JkZXItcmFkaXVzOmluaGVyaXR9LnJvdW5kZWQtZnVsbHtib3JkZXItcmFkaXVzOjk5OTlweH0ucm91bmRlZC1sZ3tib3JkZXItcmFkaXVzOnZhcigtLXJhZGl1cyl9LnJvdW5kZWQtbWR7Ym9yZGVyLXJhZGl1czpjYWxjKHZhcigtLXJhZGl1cykgLSAycHgpfS5yb3VuZGVkLXNte2JvcmRlci1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpIC0gNHB4KX0uYm9yZGVye2JvcmRlci13aWR0aDoxcHh9LmJvcmRlci0yLC5ib3JkZXItXFsycHhcXXtib3JkZXItd2lkdGg6MnB4fS5ib3JkZXIteXtib3JkZXItdG9wLXdpZHRoOjFweDtib3JkZXItYm90dG9tLXdpZHRoOjFweH0uYm9yZGVyLWJ7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHh9LmJvcmRlci1se2JvcmRlci1sZWZ0LXdpZHRoOjFweH0uYm9yZGVyLWwtMntib3JkZXItbGVmdC13aWR0aDoycHh9LmJvcmRlci1ye2JvcmRlci1yaWdodC13aWR0aDoxcHh9LmJvcmRlci10e2JvcmRlci10b3Atd2lkdGg6MXB4fS5ib3JkZXItYWNjZW50e2JvcmRlci1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmJvcmRlci1ib3JkZXJ7Ym9yZGVyLWNvbG9yOmhzbCh2YXIoLS1ib3JkZXIpKX0uYm9yZGVyLWNhcmR7Ym9yZGVyLWNvbG9yOmhzbCh2YXIoLS1jYXJkKSl9LmJvcmRlci1ncmF5LTQwMHstLXR3LWJvcmRlci1vcGFjaXR5OiAxO2JvcmRlci1jb2xvcjpyZ2IoMTU2IDE2MyAxNzUgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpfS5ib3JkZXItaW5wdXR7Ym9yZGVyLWNvbG9yOmhzbCh2YXIoLS1pbnB1dCkpfS5ib3JkZXItcHJpbWFyeXtib3JkZXItY29sb3I6aHNsKHZhcigtLXByaW1hcnkpKX0uYm9yZGVyLXRyYW5zcGFyZW50e2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0uYm9yZGVyLWwtdHJhbnNwYXJlbnR7Ym9yZGVyLWxlZnQtY29sb3I6dHJhbnNwYXJlbnR9LmJvcmRlci10LXRyYW5zcGFyZW50e2JvcmRlci10b3AtY29sb3I6dHJhbnNwYXJlbnR9LmJnLWFjY2VudHtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uYmctYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSl9LmJnLWJhY2tncm91bmRcLzEwe2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWJhY2tncm91bmQpIC8gLjEpfS5iZy1iYWNrZ3JvdW5kXC84MHtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSAvIC44KX0uYmctYm9yZGVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWJvcmRlcikpfS5iZy1jYXJke2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWNhcmQpKX0uYmctY2FyZC1mb3JlZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWNhcmQtZm9yZWdyb3VuZCkpfS5iZy1kZXN0cnVjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1kZXN0cnVjdGl2ZSkpfS5iZy1ncmF5LTMwMHstLXR3LWJnLW9wYWNpdHk6IDE7YmFja2dyb3VuZC1jb2xvcjpyZ2IoMjA5IDIxMyAyMTkgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSl9LmJnLWdyYXktNTAwey0tdHctYmctb3BhY2l0eTogMTtiYWNrZ3JvdW5kLWNvbG9yOnJnYigxMDcgMTE0IDEyOCAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKX0uYmctbXV0ZWR7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tbXV0ZWQpKX0uYmctcG9wb3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1wb3BvdmVyKSl9LmJnLXByaW1hcnl7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5iZy1yZWQtNTAwey0tdHctYmctb3BhY2l0eTogMTtiYWNrZ3JvdW5kLWNvbG9yOnJnYigyMzkgNjggNjggLyB2YXIoLS10dy1iZy1vcGFjaXR5KSl9LmJnLXNlY29uZGFyeXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1zZWNvbmRhcnkpKX0uYmctdHJhbnNwYXJlbnR7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0uYmctd2hpdGV7LS10dy1iZy1vcGFjaXR5OiAxO2JhY2tncm91bmQtY29sb3I6cmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpfS5iZy1ncmFkaWVudC10by1ie2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSx2YXIoLS10dy1ncmFkaWVudC1zdG9wcykpfS5iZy1ncmFkaWVudC10by1icntiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20gcmlnaHQsdmFyKC0tdHctZ3JhZGllbnQtc3RvcHMpKX0uZnJvbS1iYWNrZ3JvdW5kXC85MHstLXR3LWdyYWRpZW50LWZyb206IGhzbCh2YXIoLS1iYWNrZ3JvdW5kKSAvIC45KSB2YXIoLS10dy1ncmFkaWVudC1mcm9tLXBvc2l0aW9uKTstLXR3LWdyYWRpZW50LXRvOiBoc2wodmFyKC0tYmFja2dyb3VuZCkgLyAwKSB2YXIoLS10dy1ncmFkaWVudC10by1wb3NpdGlvbik7LS10dy1ncmFkaWVudC1zdG9wczogdmFyKC0tdHctZ3JhZGllbnQtZnJvbSksIHZhcigtLXR3LWdyYWRpZW50LXRvKX0uZnJvbS10cmFuc3BhcmVudHstLXR3LWdyYWRpZW50LWZyb206IHRyYW5zcGFyZW50IHZhcigtLXR3LWdyYWRpZW50LWZyb20tcG9zaXRpb24pOy0tdHctZ3JhZGllbnQtdG86IHJnYigwIDAgMCAvIDApIHZhcigtLXR3LWdyYWRpZW50LXRvLXBvc2l0aW9uKTstLXR3LWdyYWRpZW50LXN0b3BzOiB2YXIoLS10dy1ncmFkaWVudC1mcm9tKSwgdmFyKC0tdHctZ3JhZGllbnQtdG8pfS5mcm9tLTQwXCV7LS10dy1ncmFkaWVudC1mcm9tLXBvc2l0aW9uOiA0MCV9LnRvLWJhY2tncm91bmR7LS10dy1ncmFkaWVudC10bzogaHNsKHZhcigtLWJhY2tncm91bmQpKSB2YXIoLS10dy1ncmFkaWVudC10by1wb3NpdGlvbil9LmZpbGwtY3VycmVudHtmaWxsOmN1cnJlbnRDb2xvcn0uZmlsbC13aGl0ZXtmaWxsOiNmZmZ9LnN0cm9rZS1cWzJweFxde3N0cm9rZS13aWR0aDoycHh9LnN0cm9rZS1cWzNweFxde3N0cm9rZS13aWR0aDozcHh9Lm9iamVjdC1jb250YWluey1vLW9iamVjdC1maXQ6Y29udGFpbjtvYmplY3QtZml0OmNvbnRhaW59LnAtMHtwYWRkaW5nOjB9LnAtMXtwYWRkaW5nOi4yNXJlbX0ucC0xMHtwYWRkaW5nOjIuNXJlbX0ucC0ye3BhZGRpbmc6LjVyZW19LnAtM3twYWRkaW5nOi43NXJlbX0ucC00e3BhZGRpbmc6MXJlbX0ucC02e3BhZGRpbmc6MS41cmVtfS5wLVxbMXB4XF17cGFkZGluZzoxcHh9LnB4LTF7cGFkZGluZy1sZWZ0Oi4yNXJlbTtwYWRkaW5nLXJpZ2h0Oi4yNXJlbX0ucHgtMntwYWRkaW5nLWxlZnQ6LjVyZW07cGFkZGluZy1yaWdodDouNXJlbX0ucHgtMlwuNXtwYWRkaW5nLWxlZnQ6LjYyNXJlbTtwYWRkaW5nLXJpZ2h0Oi42MjVyZW19LnB4LTN7cGFkZGluZy1sZWZ0Oi43NXJlbTtwYWRkaW5nLXJpZ2h0Oi43NXJlbX0ucHgtNHtwYWRkaW5nLWxlZnQ6MXJlbTtwYWRkaW5nLXJpZ2h0OjFyZW19LnB4LTV7cGFkZGluZy1sZWZ0OjEuMjVyZW07cGFkZGluZy1yaWdodDoxLjI1cmVtfS5weC04e3BhZGRpbmctbGVmdDoycmVtO3BhZGRpbmctcmlnaHQ6MnJlbX0ucHgtXFsyNHB4XF17cGFkZGluZy1sZWZ0OjI0cHg7cGFkZGluZy1yaWdodDoyNHB4fS5weS0xe3BhZGRpbmctdG9wOi4yNXJlbTtwYWRkaW5nLWJvdHRvbTouMjVyZW19LnB5LTFcLjV7cGFkZGluZy10b3A6LjM3NXJlbTtwYWRkaW5nLWJvdHRvbTouMzc1cmVtfS5weS0ye3BhZGRpbmctdG9wOi41cmVtO3BhZGRpbmctYm90dG9tOi41cmVtfS5weS0ze3BhZGRpbmctdG9wOi43NXJlbTtwYWRkaW5nLWJvdHRvbTouNzVyZW19LnB5LTR7cGFkZGluZy10b3A6MXJlbTtwYWRkaW5nLWJvdHRvbToxcmVtfS5weS02e3BhZGRpbmctdG9wOjEuNXJlbTtwYWRkaW5nLWJvdHRvbToxLjVyZW19LnB5LTd7cGFkZGluZy10b3A6MS43NXJlbTtwYWRkaW5nLWJvdHRvbToxLjc1cmVtfS5weS1cWzJweFxde3BhZGRpbmctdG9wOjJweDtwYWRkaW5nLWJvdHRvbToycHh9LnBiLTB7cGFkZGluZy1ib3R0b206MH0ucGItMjB7cGFkZGluZy1ib3R0b206NXJlbX0ucGItNHtwYWRkaW5nLWJvdHRvbToxcmVtfS5wbC02e3BhZGRpbmctbGVmdDoxLjVyZW19LnBsLTh7cGFkZGluZy1sZWZ0OjJyZW19LnByLTJ7cGFkZGluZy1yaWdodDouNXJlbX0ucHQtMHtwYWRkaW5nLXRvcDowfS5wdC0xe3BhZGRpbmctdG9wOi4yNXJlbX0ucHQtMntwYWRkaW5nLXRvcDouNXJlbX0ucHQtNHtwYWRkaW5nLXRvcDoxcmVtfS50ZXh0LWxlZnR7dGV4dC1hbGlnbjpsZWZ0fS50ZXh0LWNlbnRlcnt0ZXh0LWFsaWduOmNlbnRlcn0udGV4dC1zdGFydHt0ZXh0LWFsaWduOnN0YXJ0fS5mb250LXNhbnN7Zm9udC1mYW1pbHk6Um9ib3RvLHNhbnMtc2VyaWZ9LmZvbnQtc2VyaWZ7Zm9udC1mYW1pbHk6U3BhY2UgTW9ubyxtb25vc3BhY2V9LnRleHQtMnhse2ZvbnQtc2l6ZToxLjVyZW07bGluZS1oZWlnaHQ6MnJlbX0udGV4dC0zeGx7Zm9udC1zaXplOjEuODc1cmVtO2xpbmUtaGVpZ2h0OjIuMjVyZW19LnRleHQtNHhse2ZvbnQtc2l6ZToyLjI1cmVtO2xpbmUtaGVpZ2h0OjIuNXJlbX0udGV4dC1cWzBcLjhyZW1cXXtmb250LXNpemU6LjhyZW19LnRleHQtXFsxMnB4XF17Zm9udC1zaXplOjEycHh9LnRleHQtbGd7Zm9udC1zaXplOjEuMTI1cmVtO2xpbmUtaGVpZ2h0OjEuNzVyZW19LnRleHQtc217Zm9udC1zaXplOi44NzVyZW07bGluZS1oZWlnaHQ6MS4yNXJlbX0udGV4dC14bHtmb250LXNpemU6MS4yNXJlbTtsaW5lLWhlaWdodDoxLjc1cmVtfS50ZXh0LXhze2ZvbnQtc2l6ZTouNzVyZW07bGluZS1oZWlnaHQ6MXJlbX0uZm9udC1cWzEycHhcXXtmb250LXdlaWdodDoxMnB4fS5mb250LVxbNDAwXF17Zm9udC13ZWlnaHQ6NDAwfS5mb250LVxbNTAwXF17Zm9udC13ZWlnaHQ6NTAwfS5mb250LVxbNTUwXF17Zm9udC13ZWlnaHQ6NTUwfS5mb250LWJvbGR7Zm9udC13ZWlnaHQ6NzAwfS5mb250LWV4dHJhYm9sZHtmb250LXdlaWdodDo4MDB9LmZvbnQtbWVkaXVte2ZvbnQtd2VpZ2h0OjUwMH0uZm9udC1ub3JtYWx7Zm9udC13ZWlnaHQ6NDAwfS5mb250LXNlbWlib2xke2ZvbnQtd2VpZ2h0OjYwMH0udXBwZXJjYXNle3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX0uaXRhbGlje2ZvbnQtc3R5bGU6aXRhbGljfS5sZWFkaW5nLTR7bGluZS1oZWlnaHQ6MXJlbX0ubGVhZGluZy1ub25le2xpbmUtaGVpZ2h0OjF9LnRyYWNraW5nLVxbMFwuMDRlbVxde2xldHRlci1zcGFjaW5nOi4wNGVtfS50cmFja2luZy10aWdodHtsZXR0ZXItc3BhY2luZzotLjAyNWVtfS50cmFja2luZy13aWRlcntsZXR0ZXItc3BhY2luZzouMDVlbX0udHJhY2tpbmctd2lkZXN0e2xldHRlci1zcGFjaW5nOi4xZW19LnRleHQtYWNjZW50e2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0udGV4dC1hY2NlbnQtZm9yZWdyb3VuZHtjb2xvcjpoc2wodmFyKC0tYWNjZW50LWZvcmVncm91bmQpKX0udGV4dC1iYWNrZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSl9LnRleHQtY2FyZC1mb3JlZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1jYXJkLWZvcmVncm91bmQpKX0udGV4dC1jdXJyZW50e2NvbG9yOmN1cnJlbnRDb2xvcn0udGV4dC1kZXN0cnVjdGl2ZXtjb2xvcjpoc2wodmFyKC0tZGVzdHJ1Y3RpdmUpKX0udGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kKSl9LnRleHQtZm9yZWdyb3VuZHtjb2xvcjpoc2wodmFyKC0tZm9yZWdyb3VuZCkpfS50ZXh0LW11dGVke2NvbG9yOmhzbCh2YXIoLS1tdXRlZCkpfS50ZXh0LW11dGVkLWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLW11dGVkLWZvcmVncm91bmQpKX0udGV4dC1wb3BvdmVyLWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLXBvcG92ZXItZm9yZWdyb3VuZCkpfS50ZXh0LXByaW1hcnl7Y29sb3I6aHNsKHZhcigtLXByaW1hcnkpKX0udGV4dC1wcmltYXJ5LWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLXByaW1hcnktZm9yZWdyb3VuZCkpfS50ZXh0LXNlY29uZGFyeS1mb3JlZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1zZWNvbmRhcnktZm9yZWdyb3VuZCkpfS50ZXh0LXdoaXRley0tdHctdGV4dC1vcGFjaXR5OiAxO2NvbG9yOnJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpfS51bmRlcmxpbmV7dGV4dC1kZWNvcmF0aW9uLWxpbmU6dW5kZXJsaW5lfS5saW5lLXRocm91Z2h7dGV4dC1kZWNvcmF0aW9uLWxpbmU6bGluZS10aHJvdWdofS51bmRlcmxpbmUtb2Zmc2V0LTR7dGV4dC11bmRlcmxpbmUtb2Zmc2V0OjRweH0uYW50aWFsaWFzZWR7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZDstbW96LW9zeC1mb250LXNtb290aGluZzpncmF5c2NhbGV9Lm9wYWNpdHktMHtvcGFjaXR5OjB9Lm9wYWNpdHktMTAwe29wYWNpdHk6MX0ub3BhY2l0eS01MHtvcGFjaXR5Oi41fS5vcGFjaXR5LTYwe29wYWNpdHk6LjZ9Lm9wYWNpdHktNzB7b3BhY2l0eTouN30ub3BhY2l0eS03NXtvcGFjaXR5Oi43NX0uc2hhZG93ey0tdHctc2hhZG93OiAwIDFweCAzcHggMCByZ2IoMCAwIDAgLyAuMSksIDAgMXB4IDJweCAtMXB4IHJnYigwIDAgMCAvIC4xKTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDFweCAzcHggMCB2YXIoLS10dy1zaGFkb3ctY29sb3IpLCAwIDFweCAycHggLTFweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXNoYWRvdyl9LnNoYWRvdy1sZ3stLXR3LXNoYWRvdzogMCAxMHB4IDE1cHggLTNweCByZ2IoMCAwIDAgLyAuMSksIDAgNHB4IDZweCAtNHB4IHJnYigwIDAgMCAvIC4xKTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDEwcHggMTVweCAtM3B4IHZhcigtLXR3LXNoYWRvdy1jb2xvciksIDAgNHB4IDZweCAtNHB4IHZhcigtLXR3LXNoYWRvdy1jb2xvcik7Ym94LXNoYWRvdzp2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctcmluZy1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctc2hhZG93KX0uc2hhZG93LW1key0tdHctc2hhZG93OiAwIDRweCA2cHggLTFweCByZ2IoMCAwIDAgLyAuMSksIDAgMnB4IDRweCAtMnB4IHJnYigwIDAgMCAvIC4xKTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDRweCA2cHggLTFweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpLCAwIDJweCA0cHggLTJweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXNoYWRvdyl9LnNoYWRvdy1zbXstLXR3LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gLjA1KTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDFweCAycHggMCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXNoYWRvdyl9Lm91dGxpbmUtbm9uZXtvdXRsaW5lOjJweCBzb2xpZCB0cmFuc3BhcmVudDtvdXRsaW5lLW9mZnNldDoycHh9Lm91dGxpbmV7b3V0bGluZS1zdHlsZTpzb2xpZH0ucmluZy0wey0tdHctcmluZy1vZmZzZXQtc2hhZG93OiB2YXIoLS10dy1yaW5nLWluc2V0KSAwIDAgMCB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkgdmFyKC0tdHctcmluZy1vZmZzZXQtY29sb3IpOy0tdHctcmluZy1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIGNhbGMoMHB4ICsgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpKSB2YXIoLS10dy1yaW5nLWNvbG9yKTtib3gtc2hhZG93OnZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdyksdmFyKC0tdHctcmluZy1zaGFkb3cpLHZhcigtLXR3LXNoYWRvdywgMCAwICMwMDAwKX0ucmluZy1vZmZzZXQtYmFja2dyb3VuZHstLXR3LXJpbmctb2Zmc2V0LWNvbG9yOiBoc2wodmFyKC0tYmFja2dyb3VuZCkpfS5kcm9wLXNoYWRvdy0yeGx7LS10dy1kcm9wLXNoYWRvdzogZHJvcC1zaGFkb3coMCAyNXB4IDI1cHggcmdiKDAgMCAwIC8gLjE1KSk7ZmlsdGVyOnZhcigtLXR3LWJsdXIpIHZhcigtLXR3LWJyaWdodG5lc3MpIHZhcigtLXR3LWNvbnRyYXN0KSB2YXIoLS10dy1ncmF5c2NhbGUpIHZhcigtLXR3LWh1ZS1yb3RhdGUpIHZhcigtLXR3LWludmVydCkgdmFyKC0tdHctc2F0dXJhdGUpIHZhcigtLXR3LXNlcGlhKSB2YXIoLS10dy1kcm9wLXNoYWRvdyl9LmRyb3Atc2hhZG93LVxbMHB4XzBweF8xMnB4X3JnYmFcKDU2XCwyMDVcLDE1MlwsMFwuNjBcKVxdey0tdHctZHJvcC1zaGFkb3c6IGRyb3Atc2hhZG93KDBweCAwcHggMTJweCByZ2JhKDU2LDIwNSwxNTIsLjYpKTtmaWx0ZXI6dmFyKC0tdHctYmx1cikgdmFyKC0tdHctYnJpZ2h0bmVzcykgdmFyKC0tdHctY29udHJhc3QpIHZhcigtLXR3LWdyYXlzY2FsZSkgdmFyKC0tdHctaHVlLXJvdGF0ZSkgdmFyKC0tdHctaW52ZXJ0KSB2YXIoLS10dy1zYXR1cmF0ZSkgdmFyKC0tdHctc2VwaWEpIHZhcigtLXR3LWRyb3Atc2hhZG93KX0uZmlsdGVye2ZpbHRlcjp2YXIoLS10dy1ibHVyKSB2YXIoLS10dy1icmlnaHRuZXNzKSB2YXIoLS10dy1jb250cmFzdCkgdmFyKC0tdHctZ3JheXNjYWxlKSB2YXIoLS10dy1odWUtcm90YXRlKSB2YXIoLS10dy1pbnZlcnQpIHZhcigtLXR3LXNhdHVyYXRlKSB2YXIoLS10dy1zZXBpYSkgdmFyKC0tdHctZHJvcC1zaGFkb3cpfS5iYWNrZHJvcC1ibHVyLTN4bHstLXR3LWJhY2tkcm9wLWJsdXI6IGJsdXIoNjRweCk7LXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6dmFyKC0tdHctYmFja2Ryb3AtYmx1cikgdmFyKC0tdHctYmFja2Ryb3AtYnJpZ2h0bmVzcykgdmFyKC0tdHctYmFja2Ryb3AtY29udHJhc3QpIHZhcigtLXR3LWJhY2tkcm9wLWdyYXlzY2FsZSkgdmFyKC0tdHctYmFja2Ryb3AtaHVlLXJvdGF0ZSkgdmFyKC0tdHctYmFja2Ryb3AtaW52ZXJ0KSB2YXIoLS10dy1iYWNrZHJvcC1vcGFjaXR5KSB2YXIoLS10dy1iYWNrZHJvcC1zYXR1cmF0ZSkgdmFyKC0tdHctYmFja2Ryb3Atc2VwaWEpO2JhY2tkcm9wLWZpbHRlcjp2YXIoLS10dy1iYWNrZHJvcC1ibHVyKSB2YXIoLS10dy1iYWNrZHJvcC1icmlnaHRuZXNzKSB2YXIoLS10dy1iYWNrZHJvcC1jb250cmFzdCkgdmFyKC0tdHctYmFja2Ryb3AtZ3JheXNjYWxlKSB2YXIoLS10dy1iYWNrZHJvcC1odWUtcm90YXRlKSB2YXIoLS10dy1iYWNrZHJvcC1pbnZlcnQpIHZhcigtLXR3LWJhY2tkcm9wLW9wYWNpdHkpIHZhcigtLXR3LWJhY2tkcm9wLXNhdHVyYXRlKSB2YXIoLS10dy1iYWNrZHJvcC1zZXBpYSl9LmJhY2tkcm9wLWJsdXItbGd7LS10dy1iYWNrZHJvcC1ibHVyOiBibHVyKDE2cHgpOy13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOnZhcigtLXR3LWJhY2tkcm9wLWJsdXIpIHZhcigtLXR3LWJhY2tkcm9wLWJyaWdodG5lc3MpIHZhcigtLXR3LWJhY2tkcm9wLWNvbnRyYXN0KSB2YXIoLS10dy1iYWNrZHJvcC1ncmF5c2NhbGUpIHZhcigtLXR3LWJhY2tkcm9wLWh1ZS1yb3RhdGUpIHZhcigtLXR3LWJhY2tkcm9wLWludmVydCkgdmFyKC0tdHctYmFja2Ryb3Atb3BhY2l0eSkgdmFyKC0tdHctYmFja2Ryb3Atc2F0dXJhdGUpIHZhcigtLXR3LWJhY2tkcm9wLXNlcGlhKTtiYWNrZHJvcC1maWx0ZXI6dmFyKC0tdHctYmFja2Ryb3AtYmx1cikgdmFyKC0tdHctYmFja2Ryb3AtYnJpZ2h0bmVzcykgdmFyKC0tdHctYmFja2Ryb3AtY29udHJhc3QpIHZhcigtLXR3LWJhY2tkcm9wLWdyYXlzY2FsZSkgdmFyKC0tdHctYmFja2Ryb3AtaHVlLXJvdGF0ZSkgdmFyKC0tdHctYmFja2Ryb3AtaW52ZXJ0KSB2YXIoLS10dy1iYWNrZHJvcC1vcGFjaXR5KSB2YXIoLS10dy1iYWNrZHJvcC1zYXR1cmF0ZSkgdmFyKC0tdHctYmFja2Ryb3Atc2VwaWEpfS5iYWNrZHJvcC1ibHVyLXNtey0tdHctYmFja2Ryb3AtYmx1cjogYmx1cig0cHgpOy13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOnZhcigtLXR3LWJhY2tkcm9wLWJsdXIpIHZhcigtLXR3LWJhY2tkcm9wLWJyaWdodG5lc3MpIHZhcigtLXR3LWJhY2tkcm9wLWNvbnRyYXN0KSB2YXIoLS10dy1iYWNrZHJvcC1ncmF5c2NhbGUpIHZhcigtLXR3LWJhY2tkcm9wLWh1ZS1yb3RhdGUpIHZhcigtLXR3LWJhY2tkcm9wLWludmVydCkgdmFyKC0tdHctYmFja2Ryb3Atb3BhY2l0eSkgdmFyKC0tdHctYmFja2Ryb3Atc2F0dXJhdGUpIHZhcigtLXR3LWJhY2tkcm9wLXNlcGlhKTtiYWNrZHJvcC1maWx0ZXI6dmFyKC0tdHctYmFja2Ryb3AtYmx1cikgdmFyKC0tdHctYmFja2Ryb3AtYnJpZ2h0bmVzcykgdmFyKC0tdHctYmFja2Ryb3AtY29udHJhc3QpIHZhcigtLXR3LWJhY2tkcm9wLWdyYXlzY2FsZSkgdmFyKC0tdHctYmFja2Ryb3AtaHVlLXJvdGF0ZSkgdmFyKC0tdHctYmFja2Ryb3AtaW52ZXJ0KSB2YXIoLS10dy1iYWNrZHJvcC1vcGFjaXR5KSB2YXIoLS10dy1iYWNrZHJvcC1zYXR1cmF0ZSkgdmFyKC0tdHctYmFja2Ryb3Atc2VwaWEpfS50cmFuc2l0aW9uLWFsbHt0cmFuc2l0aW9uLXByb3BlcnR5OmFsbDt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQsMCwuMiwxKTt0cmFuc2l0aW9uLWR1cmF0aW9uOi4xNXN9LnRyYW5zaXRpb24tY29sb3Jze3RyYW5zaXRpb24tcHJvcGVydHk6Y29sb3IsYmFja2dyb3VuZC1jb2xvcixib3JkZXItY29sb3IsdGV4dC1kZWNvcmF0aW9uLWNvbG9yLGZpbGwsc3Ryb2tlO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNCwwLC4yLDEpO3RyYW5zaXRpb24tZHVyYXRpb246LjE1c30udHJhbnNpdGlvbi1vcGFjaXR5e3RyYW5zaXRpb24tcHJvcGVydHk6b3BhY2l0eTt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQsMCwuMiwxKTt0cmFuc2l0aW9uLWR1cmF0aW9uOi4xNXN9LnRyYW5zaXRpb24tdHJhbnNmb3Jte3RyYW5zaXRpb24tcHJvcGVydHk6dHJhbnNmb3JtO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNCwwLC4yLDEpO3RyYW5zaXRpb24tZHVyYXRpb246LjE1c30uZHVyYXRpb24tMTUwe3RyYW5zaXRpb24tZHVyYXRpb246LjE1c30uZHVyYXRpb24tMjAwe3RyYW5zaXRpb24tZHVyYXRpb246LjJzfS5lYXNlLWluLW91dHt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQsMCwuMiwxKX1Aa2V5ZnJhbWVzIGVudGVyezAle29wYWNpdHk6dmFyKC0tdHctZW50ZXItb3BhY2l0eSwgMSk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKHZhcigtLXR3LWVudGVyLXRyYW5zbGF0ZS14LCAwKSx2YXIoLS10dy1lbnRlci10cmFuc2xhdGUteSwgMCksMCkgc2NhbGUzZCh2YXIoLS10dy1lbnRlci1zY2FsZSwgMSksdmFyKC0tdHctZW50ZXItc2NhbGUsIDEpLHZhcigtLXR3LWVudGVyLXNjYWxlLCAxKSkgcm90YXRlKHZhcigtLXR3LWVudGVyLXJvdGF0ZSwgMCkpfX1Aa2V5ZnJhbWVzIGV4aXR7dG97b3BhY2l0eTp2YXIoLS10dy1leGl0LW9wYWNpdHksIDEpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCh2YXIoLS10dy1leGl0LXRyYW5zbGF0ZS14LCAwKSx2YXIoLS10dy1leGl0LXRyYW5zbGF0ZS15LCAwKSwwKSBzY2FsZTNkKHZhcigtLXR3LWV4aXQtc2NhbGUsIDEpLHZhcigtLXR3LWV4aXQtc2NhbGUsIDEpLHZhcigtLXR3LWV4aXQtc2NhbGUsIDEpKSByb3RhdGUodmFyKC0tdHctZXhpdC1yb3RhdGUsIDApKX19LmFuaW1hdGUtaW57YW5pbWF0aW9uLW5hbWU6ZW50ZXI7YW5pbWF0aW9uLWR1cmF0aW9uOi4xNXM7LS10dy1lbnRlci1vcGFjaXR5OiBpbml0aWFsOy0tdHctZW50ZXItc2NhbGU6IGluaXRpYWw7LS10dy1lbnRlci1yb3RhdGU6IGluaXRpYWw7LS10dy1lbnRlci10cmFuc2xhdGUteDogaW5pdGlhbDstLXR3LWVudGVyLXRyYW5zbGF0ZS15OiBpbml0aWFsfS5mYWRlLWluLTB7LS10dy1lbnRlci1vcGFjaXR5OiAwfS56b29tLWluLTk1ey0tdHctZW50ZXItc2NhbGU6IC45NX0uZHVyYXRpb24tMTUwe2FuaW1hdGlvbi1kdXJhdGlvbjouMTVzfS5kdXJhdGlvbi0yMDB7YW5pbWF0aW9uLWR1cmF0aW9uOi4yc30uZWFzZS1pbi1vdXR7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQsMCwuMiwxKX0uZmlsZVw6Ym9yZGVyLTA6OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2JvcmRlci13aWR0aDowcHh9LmZpbGVcOmJnLXRyYW5zcGFyZW50OjpmaWxlLXNlbGVjdG9yLWJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5maWxlXDp0ZXh0LXNtOjpmaWxlLXNlbGVjdG9yLWJ1dHRvbntmb250LXNpemU6Ljg3NXJlbTtsaW5lLWhlaWdodDoxLjI1cmVtfS5maWxlXDpmb250LW1lZGl1bTo6ZmlsZS1zZWxlY3Rvci1idXR0b257Zm9udC13ZWlnaHQ6NTAwfS5wbGFjZWhvbGRlclw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOmhzbCh2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKSl9LnBsYWNlaG9sZGVyXDp0ZXh0LW11dGVkLWZvcmVncm91bmQ6OnBsYWNlaG9sZGVye2NvbG9yOmhzbCh2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKSl9LmZvY3VzLXdpdGhpblw6cmVsYXRpdmU6Zm9jdXMtd2l0aGlue3Bvc2l0aW9uOnJlbGF0aXZlfS5ob3Zlclw6dy1cWzJweFxdOmhvdmVye3dpZHRoOjJweH0uaG92ZXJcOnctXFszcHhcXTpob3Zlcnt3aWR0aDozcHh9LmhvdmVyXDpjdXJzb3ItcG9pbnRlcjpob3ZlcntjdXJzb3I6cG9pbnRlcn0uaG92ZXJcOnJvdW5kZWQtbGc6aG92ZXJ7Ym9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMpfS5ob3Zlclw6YmctYWNjZW50OmhvdmVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5ob3Zlclw6YmctYm9yZGVyOmhvdmVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWJvcmRlcikpfS5ob3Zlclw6YmctZGVzdHJ1Y3RpdmVcLzkwOmhvdmVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWRlc3RydWN0aXZlKSAvIC45KX0uaG92ZXJcOmJnLW11dGVkOmhvdmVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLW11dGVkKSl9LmhvdmVyXDpiZy1wcmltYXJ5OmhvdmVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLXByaW1hcnkpKX0uaG92ZXJcOmJnLXByaW1hcnlcLzkwOmhvdmVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLXByaW1hcnkpIC8gLjkpfS5ob3Zlclw6YmctcmVkLTcwMDpob3ZlcnstLXR3LWJnLW9wYWNpdHk6IDE7YmFja2dyb3VuZC1jb2xvcjpyZ2IoMTg1IDI4IDI4IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpfS5ob3Zlclw6Ymctc2Vjb25kYXJ5XC84MDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1zZWNvbmRhcnkpIC8gLjgpfS5ob3Zlclw6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZDpob3Zlcntjb2xvcjpoc2wodmFyKC0tYWNjZW50LWZvcmVncm91bmQpKX0uaG92ZXJcOnRleHQtbXV0ZWQtZm9yZWdyb3VuZDpob3Zlcntjb2xvcjpoc2wodmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCkpfS5ob3Zlclw6dGV4dC1wcmltYXJ5LWZvcmVncm91bmQ6aG92ZXJ7Y29sb3I6aHNsKHZhcigtLXByaW1hcnktZm9yZWdyb3VuZCkpfS5ob3Zlclw6dGV4dC13aGl0ZTpob3ZlcnstLXR3LXRleHQtb3BhY2l0eTogMTtjb2xvcjpyZ2IoMjU1IDI1NSAyNTUgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKX0uaG92ZXJcOnVuZGVybGluZTpob3Zlcnt0ZXh0LWRlY29yYXRpb24tbGluZTp1bmRlcmxpbmV9LmhvdmVyXDpvcGFjaXR5LTEwMDpob3ZlcntvcGFjaXR5OjF9LmZvY3VzXDpiZy1hY2NlbnQ6Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmZvY3VzXDpiZy1wcmltYXJ5OmZvY3Vze2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLXByaW1hcnkpKX0uZm9jdXNcOnRleHQtYWNjZW50LWZvcmVncm91bmQ6Zm9jdXN7Y29sb3I6aHNsKHZhcigtLWFjY2VudC1mb3JlZ3JvdW5kKSl9LmZvY3VzXDp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZDpmb2N1c3tjb2xvcjpoc2wodmFyKC0tcHJpbWFyeS1mb3JlZ3JvdW5kKSl9LmZvY3VzXDpvdXRsaW5lLW5vbmU6Zm9jdXN7b3V0bGluZToycHggc29saWQgdHJhbnNwYXJlbnQ7b3V0bGluZS1vZmZzZXQ6MnB4fS5mb2N1c1w6cmluZy0yOmZvY3Vzey0tdHctcmluZy1vZmZzZXQtc2hhZG93OiB2YXIoLS10dy1yaW5nLWluc2V0KSAwIDAgMCB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkgdmFyKC0tdHctcmluZy1vZmZzZXQtY29sb3IpOy0tdHctcmluZy1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIGNhbGMoMnB4ICsgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpKSB2YXIoLS10dy1yaW5nLWNvbG9yKTtib3gtc2hhZG93OnZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdyksdmFyKC0tdHctcmluZy1zaGFkb3cpLHZhcigtLXR3LXNoYWRvdywgMCAwICMwMDAwKX0uZm9jdXNcOnJpbmctcmluZzpmb2N1c3stLXR3LXJpbmctY29sb3I6IGhzbCh2YXIoLS1yaW5nKSl9LmZvY3VzXDpyaW5nLW9mZnNldC0yOmZvY3Vzey0tdHctcmluZy1vZmZzZXQtd2lkdGg6IDJweH0uZm9jdXMtdmlzaWJsZVw6b3V0bGluZS1ub25lOmZvY3VzLXZpc2libGV7b3V0bGluZToycHggc29saWQgdHJhbnNwYXJlbnQ7b3V0bGluZS1vZmZzZXQ6MnB4fS5mb2N1cy12aXNpYmxlXDpvdXRsaW5lLWFjY2VudDpmb2N1cy12aXNpYmxle291dGxpbmUtY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5mb2N1cy12aXNpYmxlXDpyaW5nLTI6Zm9jdXMtdmlzaWJsZXstLXR3LXJpbmctb2Zmc2V0LXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpIHZhcigtLXR3LXJpbmctb2Zmc2V0LWNvbG9yKTstLXR3LXJpbmctc2hhZG93OiB2YXIoLS10dy1yaW5nLWluc2V0KSAwIDAgMCBjYWxjKDJweCArIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSkgdmFyKC0tdHctcmluZy1jb2xvcik7Ym94LXNoYWRvdzp2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3cpLHZhcigtLXR3LXJpbmctc2hhZG93KSx2YXIoLS10dy1zaGFkb3csIDAgMCAjMDAwMCl9LmZvY3VzLXZpc2libGVcOnJpbmctcmluZzpmb2N1cy12aXNpYmxley0tdHctcmluZy1jb2xvcjogaHNsKHZhcigtLXJpbmcpKX0uZm9jdXMtdmlzaWJsZVw6cmluZy1vZmZzZXQtMjpmb2N1cy12aXNpYmxley0tdHctcmluZy1vZmZzZXQtd2lkdGg6IDJweH0uZm9jdXMtdmlzaWJsZVw6cmluZy1vZmZzZXQtYmFja2dyb3VuZDpmb2N1cy12aXNpYmxley0tdHctcmluZy1vZmZzZXQtY29sb3I6IGhzbCh2YXIoLS1iYWNrZ3JvdW5kKSl9LmRpc2FibGVkXDpwb2ludGVyLWV2ZW50cy1ub25lOmRpc2FibGVke3BvaW50ZXItZXZlbnRzOm5vbmV9LmRpc2FibGVkXDpjdXJzb3Itbm90LWFsbG93ZWQ6ZGlzYWJsZWR7Y3Vyc29yOm5vdC1hbGxvd2VkfS5kaXNhYmxlZFw6dGV4dC1iYWNrZ3JvdW5kOmRpc2FibGVke2NvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSl9LmRpc2FibGVkXDpvcGFjaXR5LTUwOmRpc2FibGVke29wYWNpdHk6LjV9LnBlZXI6ZGlzYWJsZWR+LnBlZXItZGlzYWJsZWRcOmN1cnNvci1ub3QtYWxsb3dlZHtjdXJzb3I6bm90LWFsbG93ZWR9LnBlZXI6ZGlzYWJsZWR+LnBlZXItZGlzYWJsZWRcOm9wYWNpdHktNzB7b3BhY2l0eTouN30uYXJpYS1zZWxlY3RlZFw6YmctYWNjZW50W2FyaWEtc2VsZWN0ZWQ9dHJ1ZV17YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmFyaWEtc2VsZWN0ZWRcOnRleHQtYWNjZW50LWZvcmVncm91bmRbYXJpYS1zZWxlY3RlZD10cnVlXXtjb2xvcjpoc2wodmFyKC0tYWNjZW50LWZvcmVncm91bmQpKX0uYXJpYS1zZWxlY3RlZFw6b3BhY2l0eS0xMDBbYXJpYS1zZWxlY3RlZD10cnVlXXtvcGFjaXR5OjF9LmRhdGEtXFtkaXNhYmxlZFxdXDpwb2ludGVyLWV2ZW50cy1ub25lW2RhdGEtZGlzYWJsZWRde3BvaW50ZXItZXZlbnRzOm5vbmV9LmRhdGEtXFtzaWRlXD1ib3R0b21cXVw6dHJhbnNsYXRlLXktMVtkYXRhLXNpZGU9Ym90dG9tXXstLXR3LXRyYW5zbGF0ZS15OiAuMjVyZW07dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LmRhdGEtXFtzaWRlXD1sZWZ0XF1cOi10cmFuc2xhdGUteC0xW2RhdGEtc2lkZT1sZWZ0XXstLXR3LXRyYW5zbGF0ZS14OiAtLjI1cmVtO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5kYXRhLVxbc2lkZVw9cmlnaHRcXVw6dHJhbnNsYXRlLXgtMVtkYXRhLXNpZGU9cmlnaHRdey0tdHctdHJhbnNsYXRlLXg6IC4yNXJlbTt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uZGF0YS1cW3NpZGVcPXRvcFxdXDotdHJhbnNsYXRlLXktMVtkYXRhLXNpZGU9dG9wXXstLXR3LXRyYW5zbGF0ZS15OiAtLjI1cmVtO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5kYXRhLVxbc3RhdGVcPWNoZWNrZWRcXVw6dHJhbnNsYXRlLXgtNVtkYXRhLXN0YXRlPWNoZWNrZWRdey0tdHctdHJhbnNsYXRlLXg6IDEuMjVyZW07dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LmRhdGEtXFtzdGF0ZVw9dW5jaGVja2VkXF1cOnRyYW5zbGF0ZS14LTBbZGF0YS1zdGF0ZT11bmNoZWNrZWRdey0tdHctdHJhbnNsYXRlLXg6IDBweDt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX1Aa2V5ZnJhbWVzIGFjY29yZGlvbi11cHswJXtoZWlnaHQ6dmFyKC0tcmFkaXgtYWNjb3JkaW9uLWNvbnRlbnQtaGVpZ2h0KX10b3toZWlnaHQ6MH19LmRhdGEtXFtzdGF0ZVw9Y2xvc2VkXF1cOmFuaW1hdGUtYWNjb3JkaW9uLXVwW2RhdGEtc3RhdGU9Y2xvc2VkXXthbmltYXRpb246YWNjb3JkaW9uLXVwIC4ycyBlYXNlLW91dH1Aa2V5ZnJhbWVzIGFjY29yZGlvbi1kb3duezAle2hlaWdodDowfXRve2hlaWdodDp2YXIoLS1yYWRpeC1hY2NvcmRpb24tY29udGVudC1oZWlnaHQpfX0uZGF0YS1cW3N0YXRlXD1vcGVuXF1cOmFuaW1hdGUtYWNjb3JkaW9uLWRvd25bZGF0YS1zdGF0ZT1vcGVuXXthbmltYXRpb246YWNjb3JkaW9uLWRvd24gLjJzIGVhc2Utb3V0fS5kYXRhLVxbc3RhdGVcPWFjdGl2ZVxdXDpiZy1iYWNrZ3JvdW5kW2RhdGEtc3RhdGU9YWN0aXZlXXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSl9LmRhdGEtXFtzdGF0ZVw9Y2hlY2tlZFxdXDpiZy1hY2NlbnRbZGF0YS1zdGF0ZT1jaGVja2VkXXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uZGF0YS1cW3N0YXRlXD1jaGVja2VkXF1cOmJnLXByaW1hcnlbZGF0YS1zdGF0ZT1jaGVja2VkXXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1wcmltYXJ5KSl9LmRhdGEtXFtzdGF0ZVw9b25cXVw6YmctYWNjZW50W2RhdGEtc3RhdGU9b25dLC5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6YmctYWNjZW50W2RhdGEtc3RhdGU9b3Blbl17YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmRhdGEtXFtzdGF0ZVw9dW5jaGVja2VkXF1cOmJnLXByaW1hcnlbZGF0YS1zdGF0ZT11bmNoZWNrZWRde2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLXByaW1hcnkpKX0uZGF0YS1cW3N0YXRlXD1hY3RpdmVcXVw6dGV4dC1mb3JlZ3JvdW5kW2RhdGEtc3RhdGU9YWN0aXZlXXtjb2xvcjpoc2wodmFyKC0tZm9yZWdyb3VuZCkpfS5kYXRhLVxbc3RhdGVcPWNoZWNrZWRcXVw6dGV4dC1wcmltYXJ5LWZvcmVncm91bmRbZGF0YS1zdGF0ZT1jaGVja2VkXXtjb2xvcjpoc2wodmFyKC0tcHJpbWFyeS1mb3JlZ3JvdW5kKSl9LmRhdGEtXFtzdGF0ZVw9b25cXVw6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZFtkYXRhLXN0YXRlPW9uXXtjb2xvcjpoc2wodmFyKC0tYWNjZW50LWZvcmVncm91bmQpKX0uZGF0YS1cW3N0YXRlXD1vcGVuXF1cOnRleHQtbXV0ZWQtZm9yZWdyb3VuZFtkYXRhLXN0YXRlPW9wZW5de2NvbG9yOmhzbCh2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKSl9LmRhdGEtXFtkaXNhYmxlZFxdXDpvcGFjaXR5LTUwW2RhdGEtZGlzYWJsZWRde29wYWNpdHk6LjV9LmRhdGEtXFtzdGF0ZVw9YWN0aXZlXF1cOnNoYWRvdy1zbVtkYXRhLXN0YXRlPWFjdGl2ZV17LS10dy1zaGFkb3c6IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIC4wNSk7LS10dy1zaGFkb3ctY29sb3JlZDogMCAxcHggMnB4IDAgdmFyKC0tdHctc2hhZG93LWNvbG9yKTtib3gtc2hhZG93OnZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdywgMCAwICMwMDAwKSx2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSx2YXIoLS10dy1zaGFkb3cpfS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6YW5pbWF0ZS1pbltkYXRhLXN0YXRlPW9wZW5de2FuaW1hdGlvbi1uYW1lOmVudGVyO2FuaW1hdGlvbi1kdXJhdGlvbjouMTVzOy0tdHctZW50ZXItb3BhY2l0eTogaW5pdGlhbDstLXR3LWVudGVyLXNjYWxlOiBpbml0aWFsOy0tdHctZW50ZXItcm90YXRlOiBpbml0aWFsOy0tdHctZW50ZXItdHJhbnNsYXRlLXg6IGluaXRpYWw7LS10dy1lbnRlci10cmFuc2xhdGUteTogaW5pdGlhbH0uZGF0YS1cW3N0YXRlXD1jbG9zZWRcXVw6YW5pbWF0ZS1vdXRbZGF0YS1zdGF0ZT1jbG9zZWRde2FuaW1hdGlvbi1uYW1lOmV4aXQ7YW5pbWF0aW9uLWR1cmF0aW9uOi4xNXM7LS10dy1leGl0LW9wYWNpdHk6IGluaXRpYWw7LS10dy1leGl0LXNjYWxlOiBpbml0aWFsOy0tdHctZXhpdC1yb3RhdGU6IGluaXRpYWw7LS10dy1leGl0LXRyYW5zbGF0ZS14OiBpbml0aWFsOy0tdHctZXhpdC10cmFuc2xhdGUteTogaW5pdGlhbH0uZGF0YS1cW3N0YXRlXD1jbG9zZWRcXVw6ZmFkZS1vdXQtMFtkYXRhLXN0YXRlPWNsb3NlZF17LS10dy1leGl0LW9wYWNpdHk6IDB9LmRhdGEtXFtzdGF0ZVw9b3BlblxdXDpmYWRlLWluLTBbZGF0YS1zdGF0ZT1vcGVuXXstLXR3LWVudGVyLW9wYWNpdHk6IDB9LmRhdGEtXFtzdGF0ZVw9Y2xvc2VkXF1cOnpvb20tb3V0LTk1W2RhdGEtc3RhdGU9Y2xvc2VkXXstLXR3LWV4aXQtc2NhbGU6IC45NX0uZGF0YS1cW3N0YXRlXD1vcGVuXF1cOnpvb20taW4tOTVbZGF0YS1zdGF0ZT1vcGVuXXstLXR3LWVudGVyLXNjYWxlOiAuOTV9LmRhdGEtXFtzaWRlXD1ib3R0b21cXVw6c2xpZGUtaW4tZnJvbS10b3AtMltkYXRhLXNpZGU9Ym90dG9tXXstLXR3LWVudGVyLXRyYW5zbGF0ZS15OiAtLjVyZW19LmRhdGEtXFtzaWRlXD1sZWZ0XF1cOnNsaWRlLWluLWZyb20tcmlnaHQtMltkYXRhLXNpZGU9bGVmdF17LS10dy1lbnRlci10cmFuc2xhdGUteDogLjVyZW19LmRhdGEtXFtzaWRlXD1yaWdodFxdXDpzbGlkZS1pbi1mcm9tLWxlZnQtMltkYXRhLXNpZGU9cmlnaHRdey0tdHctZW50ZXItdHJhbnNsYXRlLXg6IC0uNXJlbX0uZGF0YS1cW3NpZGVcPXRvcFxdXDpzbGlkZS1pbi1mcm9tLWJvdHRvbS0yW2RhdGEtc2lkZT10b3Bdey0tdHctZW50ZXItdHJhbnNsYXRlLXk6IC41cmVtfS5kYXRhLVxbc3RhdGVcPWNsb3NlZFxdXDpzbGlkZS1vdXQtdG8tbGVmdC0xXC8yW2RhdGEtc3RhdGU9Y2xvc2VkXXstLXR3LWV4aXQtdHJhbnNsYXRlLXg6IC01MCV9LmRhdGEtXFtzdGF0ZVw9Y2xvc2VkXF1cOnNsaWRlLW91dC10by10b3AtXFs0OFwlXF1bZGF0YS1zdGF0ZT1jbG9zZWRdey0tdHctZXhpdC10cmFuc2xhdGUteTogLTQ4JX0uZGF0YS1cW3N0YXRlXD1vcGVuXF1cOnNsaWRlLWluLWZyb20tbGVmdC0xXC8yW2RhdGEtc3RhdGU9b3Blbl17LS10dy1lbnRlci10cmFuc2xhdGUteDogLTUwJX0uZGF0YS1cW3N0YXRlXD1vcGVuXF1cOnNsaWRlLWluLWZyb20tdG9wLVxbNDhcJVxdW2RhdGEtc3RhdGU9b3Blbl17LS10dy1lbnRlci10cmFuc2xhdGUteTogLTQ4JX06aXMoW2RhdGEtbW9kZT1kYXJrXSAuZGFya1w6Ym9yZGVyLXdoaXRlKXstLXR3LWJvcmRlci1vcGFjaXR5OiAxO2JvcmRlci1jb2xvcjpyZ2IoMjU1IDI1NSAyNTUgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpfUBtZWRpYSAobWluLXdpZHRoOiA2NDBweCl7LnNtXDptdC0we21hcmdpbi10b3A6MH0uc21cOmJsb2Nre2Rpc3BsYXk6YmxvY2t9LnNtXDpmbGV4LXJvd3tmbGV4LWRpcmVjdGlvbjpyb3d9LnNtXDpqdXN0aWZ5LWVuZHtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9LnNtXDpzcGFjZS14LTI+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS14LXJldmVyc2U6IDA7bWFyZ2luLXJpZ2h0OmNhbGMoLjVyZW0gKiB2YXIoLS10dy1zcGFjZS14LXJldmVyc2UpKTttYXJnaW4tbGVmdDpjYWxjKC41cmVtICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteC1yZXZlcnNlKSkpfS5zbVw6c3BhY2UteC00Pjpub3QoW2hpZGRlbl0pfjpub3QoW2hpZGRlbl0pey0tdHctc3BhY2UteC1yZXZlcnNlOiAwO21hcmdpbi1yaWdodDpjYWxjKDFyZW0gKiB2YXIoLS10dy1zcGFjZS14LXJldmVyc2UpKTttYXJnaW4tbGVmdDpjYWxjKDFyZW0gKiBjYWxjKDEgLSB2YXIoLS10dy1zcGFjZS14LXJldmVyc2UpKSl9LnNtXDpzcGFjZS15LTA+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS15LXJldmVyc2U6IDA7bWFyZ2luLXRvcDpjYWxjKDBweCAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpKTttYXJnaW4tYm90dG9tOmNhbGMoMHB4ICogdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSl9LnNtXDpyb3VuZGVkLWxne2JvcmRlci1yYWRpdXM6dmFyKC0tcmFkaXVzKX0uc21cOnAtMHtwYWRkaW5nOjB9LnNtXDp0ZXh0LWxlZnR7dGV4dC1hbGlnbjpsZWZ0fX1AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpey5tZFw6dy1mdWxse3dpZHRoOjEwMCV9fS5cW1wmXDpoYXNcKFxbYXJpYS1zZWxlY3RlZFxdXClcXVw6YmctYWNjZW50OmhhcyhbYXJpYS1zZWxlY3RlZF0pe2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5maXJzdFw6XFtcJlw6aGFzXChcW2FyaWEtc2VsZWN0ZWRcXVwpXF1cOnJvdW5kZWQtbC1tZDpoYXMoW2FyaWEtc2VsZWN0ZWRdKTpmaXJzdC1jaGlsZHtib3JkZXItdG9wLWxlZnQtcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSAtIDJweCk7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czpjYWxjKHZhcigtLXJhZGl1cykgLSAycHgpfS5sYXN0XDpcW1wmXDpoYXNcKFxbYXJpYS1zZWxlY3RlZFxdXClcXVw6cm91bmRlZC1yLW1kOmhhcyhbYXJpYS1zZWxlY3RlZF0pOmxhc3QtY2hpbGR7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpIC0gMnB4KTtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czpjYWxjKHZhcigtLXJhZGl1cykgLSAycHgpfS5cW1wmXFtkYXRhLXN0YXRlXD1vcGVuXF1cPnN2Z1xdXDpyb3RhdGUtMTgwW2RhdGEtc3RhdGU9b3Blbl0+c3Zney0tdHctcm90YXRlOiAxODBkZWc7dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LlxbXCZfXFtjbWRrLWdyb3VwLWhlYWRpbmdcXVxdXDpweC0yIFtjbWRrLWdyb3VwLWhlYWRpbmdde3BhZGRpbmctbGVmdDouNXJlbTtwYWRkaW5nLXJpZ2h0Oi41cmVtfS5cW1wmX1xbY21kay1ncm91cC1oZWFkaW5nXF1cXVw6cHktMVwuNSBbY21kay1ncm91cC1oZWFkaW5nXXtwYWRkaW5nLXRvcDouMzc1cmVtO3BhZGRpbmctYm90dG9tOi4zNzVyZW19LlxbXCZfXFtjbWRrLWdyb3VwLWhlYWRpbmdcXVxdXDp0ZXh0LXhzIFtjbWRrLWdyb3VwLWhlYWRpbmdde2ZvbnQtc2l6ZTouNzVyZW07bGluZS1oZWlnaHQ6MXJlbX0uXFtcJl9cW2NtZGstZ3JvdXAtaGVhZGluZ1xdXF1cOmZvbnQtbWVkaXVtIFtjbWRrLWdyb3VwLWhlYWRpbmdde2ZvbnQtd2VpZ2h0OjUwMH0uXFtcJl9cW2NtZGstZ3JvdXAtaGVhZGluZ1xdXF1cOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCBbY21kay1ncm91cC1oZWFkaW5nXXtjb2xvcjpoc2wodmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCkpfS5cW1wmX1xbY21kay1ncm91cFxdXDpub3RcKFxbaGlkZGVuXF1cKV9cflxbY21kay1ncm91cFxdXF1cOnB0LTAgW2NtZGstZ3JvdXBdOm5vdChbaGlkZGVuXSl+W2NtZGstZ3JvdXBde3BhZGRpbmctdG9wOjB9LlxbXCZfXFtjbWRrLWdyb3VwXF1cXVw6cHgtMiBbY21kay1ncm91cF17cGFkZGluZy1sZWZ0Oi41cmVtO3BhZGRpbmctcmlnaHQ6LjVyZW19LlxbXCZfXFtjbWRrLWlucHV0LXdyYXBwZXJcXV9zdmdcXVw6aC01IFtjbWRrLWlucHV0LXdyYXBwZXJdIHN2Z3toZWlnaHQ6MS4yNXJlbX0uXFtcJl9cW2NtZGstaW5wdXQtd3JhcHBlclxdX3N2Z1xdXDp3LTUgW2NtZGstaW5wdXQtd3JhcHBlcl0gc3Zne3dpZHRoOjEuMjVyZW19LlxbXCZfXFtjbWRrLWlucHV0XF1cXVw6aC0xMiBbY21kay1pbnB1dF17aGVpZ2h0OjNyZW19LlxbXCZfXFtjbWRrLWl0ZW1cXVxdXDpweC0yIFtjbWRrLWl0ZW1de3BhZGRpbmctbGVmdDouNXJlbTtwYWRkaW5nLXJpZ2h0Oi41cmVtfS5cW1wmX1xbY21kay1pdGVtXF1cXVw6cHktMyBbY21kay1pdGVtXXtwYWRkaW5nLXRvcDouNzVyZW07cGFkZGluZy1ib3R0b206Ljc1cmVtfS5cW1wmX1xbY21kay1pdGVtXF1fc3ZnXF1cOmgtNSBbY21kay1pdGVtXSBzdmd7aGVpZ2h0OjEuMjVyZW19LlxbXCZfXFtjbWRrLWl0ZW1cXV9zdmdcXVw6dy01IFtjbWRrLWl0ZW1dIHN2Z3t3aWR0aDoxLjI1cmVtfQo=","/index.html":"PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiIC8+CiAgICA8dGl0bGU+VmFsPC90aXRsZT4KICAgIDxzY3JpcHQgdHlwZT0ibW9kdWxlIiBjcm9zc29yaWdpbiBzcmM9Ii9hcGkvdmFsL3N0YXRpYy9hc3NldHMvaW5kZXgta3RTUjJYWWYuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBjcm9zc29yaWdpbiBocmVmPSIvYXBpL3ZhbC9zdGF0aWMvYXNzZXRzL2luZGV4LXE1b3pIV29QLmNzcyI+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0icm9vdCI+PC9kaXY+CiAgPC9ib2R5Pgo8L2h0bWw+Cg=="}`
20
+ `{"/assets/index-C9FCHcaG.js":"dmFyIHYkPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgeSQ9KGUsdCxuKT0+dCBpbiBlP3YkKGUsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pOmVbdF09bjt2YXIgSmU9KGUsdCxuKT0+KHkkKGUsdHlwZW9mIHQhPSJzeW1ib2wiP3QrIiI6dCxuKSxuKSx4JD0oZSx0LG4pPT57aWYoIXQuaGFzKGUpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIrbil9O3ZhciBuaD0oZSx0LG4pPT57aWYodC5oYXMoZSkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlIik7dCBpbnN0YW5jZW9mIFdlYWtTZXQ/dC5hZGQoZSk6dC5zZXQoZSxuKX07dmFyIEd1PShlLHQsbik9Pih4JChlLHQsImFjY2VzcyBwcml2YXRlIG1ldGhvZCIpLG4pO2Z1bmN0aW9uIEVfKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9dFtuXTtpZih0eXBlb2YgciE9InN0cmluZyImJiFBcnJheS5pc0FycmF5KHIpKXtmb3IoY29uc3QgaSBpbiByKWlmKGkhPT0iZGVmYXVsdCImJiEoaSBpbiBlKSl7Y29uc3Qgbz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsaSk7byYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsaSxvLmdldD9vOntlbnVtZXJhYmxlOiEwLGdldDooKT0+cltpXX0pfX19cmV0dXJuIE9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pKX0oZnVuY3Rpb24oKXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKS5yZWxMaXN0O2lmKHQmJnQuc3VwcG9ydHMmJnQuc3VwcG9ydHMoIm1vZHVsZXByZWxvYWQiKSlyZXR1cm47Zm9yKGNvbnN0IGkgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbGlua1tyZWw9Im1vZHVsZXByZWxvYWQiXScpKXIoaSk7bmV3IE11dGF0aW9uT2JzZXJ2ZXIoaT0+e2Zvcihjb25zdCBvIG9mIGkpaWYoby50eXBlPT09ImNoaWxkTGlzdCIpZm9yKGNvbnN0IGwgb2Ygby5hZGRlZE5vZGVzKWwudGFnTmFtZT09PSJMSU5LIiYmbC5yZWw9PT0ibW9kdWxlcHJlbG9hZCImJnIobCl9KS5vYnNlcnZlKGRvY3VtZW50LHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pO2Z1bmN0aW9uIG4oaSl7Y29uc3Qgbz17fTtyZXR1cm4gaS5pbnRlZ3JpdHkmJihvLmludGVncml0eT1pLmludGVncml0eSksaS5yZWZlcnJlclBvbGljeSYmKG8ucmVmZXJyZXJQb2xpY3k9aS5yZWZlcnJlclBvbGljeSksaS5jcm9zc09yaWdpbj09PSJ1c2UtY3JlZGVudGlhbHMiP28uY3JlZGVudGlhbHM9ImluY2x1ZGUiOmkuY3Jvc3NPcmlnaW49PT0iYW5vbnltb3VzIj9vLmNyZWRlbnRpYWxzPSJvbWl0IjpvLmNyZWRlbnRpYWxzPSJzYW1lLW9yaWdpbiIsb31mdW5jdGlvbiByKGkpe2lmKGkuZXApcmV0dXJuO2kuZXA9ITA7Y29uc3Qgbz1uKGkpO2ZldGNoKGkuaHJlZixvKX19KSgpO2Z1bmN0aW9uIFR1KGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZWZhdWx0Iik/ZS5kZWZhdWx0OmV9dmFyIENfPXtleHBvcnRzOnt9fSxQZT17fTsvKioKICogQGxpY2Vuc2UgUmVhY3QKICogcmVhY3QucHJvZHVjdGlvbi5taW4uanMKICoKICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqL3ZhciBOdT1TeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50IiksXyQ9U3ltYm9sLmZvcigicmVhY3QucG9ydGFsIiksdyQ9U3ltYm9sLmZvcigicmVhY3QuZnJhZ21lbnQiKSxTJD1TeW1ib2wuZm9yKCJyZWFjdC5zdHJpY3RfbW9kZSIpLEUkPVN5bWJvbC5mb3IoInJlYWN0LnByb2ZpbGVyIiksQyQ9U3ltYm9sLmZvcigicmVhY3QucHJvdmlkZXIiKSxrJD1TeW1ib2wuZm9yKCJyZWFjdC5jb250ZXh0IiksJCQ9U3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKSxiJD1TeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZSIpLFQkPVN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKSxOJD1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5IiksYXk9U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIFIkKGUpe3JldHVybiBlPT09bnVsbHx8dHlwZW9mIGUhPSJvYmplY3QiP251bGw6KGU9YXkmJmVbYXldfHxlWyJAQGl0ZXJhdG9yIl0sdHlwZW9mIGU9PSJmdW5jdGlvbiI/ZTpudWxsKX12YXIga189e2lzTW91bnRlZDpmdW5jdGlvbigpe3JldHVybiExfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oKXt9LGVucXVldWVSZXBsYWNlU3RhdGU6ZnVuY3Rpb24oKXt9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbigpe319LCRfPU9iamVjdC5hc3NpZ24sYl89e307ZnVuY3Rpb24geHMoZSx0LG4pe3RoaXMucHJvcHM9ZSx0aGlzLmNvbnRleHQ9dCx0aGlzLnJlZnM9Yl8sdGhpcy51cGRhdGVyPW58fGtffXhzLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXt9O3hzLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiBlIT0ib2JqZWN0IiYmdHlwZW9mIGUhPSJmdW5jdGlvbiImJmUhPW51bGwpdGhyb3cgRXJyb3IoInNldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLiIpO3RoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcyxlLHQsInNldFN0YXRlIil9O3hzLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbihlKXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsZSwiZm9yY2VVcGRhdGUiKX07ZnVuY3Rpb24gVF8oKXt9VF8ucHJvdG90eXBlPXhzLnByb3RvdHlwZTtmdW5jdGlvbiBRbShlLHQsbil7dGhpcy5wcm9wcz1lLHRoaXMuY29udGV4dD10LHRoaXMucmVmcz1iXyx0aGlzLnVwZGF0ZXI9bnx8a199dmFyIEptPVFtLnByb3RvdHlwZT1uZXcgVF87Sm0uY29uc3RydWN0b3I9UW07JF8oSm0seHMucHJvdG90eXBlKTtKbS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMDt2YXIgdXk9QXJyYXkuaXNBcnJheSxOXz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHFtPXtjdXJyZW50Om51bGx9LFJfPXtrZXk6ITAscmVmOiEwLF9fc2VsZjohMCxfX3NvdXJjZTohMH07ZnVuY3Rpb24gT18oZSx0LG4pe3ZhciByLGk9e30sbz1udWxsLGw9bnVsbDtpZih0IT1udWxsKWZvcihyIGluIHQucmVmIT09dm9pZCAwJiYobD10LnJlZiksdC5rZXkhPT12b2lkIDAmJihvPSIiK3Qua2V5KSx0KU5fLmNhbGwodCxyKSYmIVJfLmhhc093blByb3BlcnR5KHIpJiYoaVtyXT10W3JdKTt2YXIgcz1hcmd1bWVudHMubGVuZ3RoLTI7aWYocz09PTEpaS5jaGlsZHJlbj1uO2Vsc2UgaWYoMTxzKXtmb3IodmFyIGE9QXJyYXkocyksdT0wO3U8czt1KyspYVt1XT1hcmd1bWVudHNbdSsyXTtpLmNoaWxkcmVuPWF9aWYoZSYmZS5kZWZhdWx0UHJvcHMpZm9yKHIgaW4gcz1lLmRlZmF1bHRQcm9wcyxzKWlbcl09PT12b2lkIDAmJihpW3JdPXNbcl0pO3JldHVybnskJHR5cGVvZjpOdSx0eXBlOmUsa2V5Om8scmVmOmwscHJvcHM6aSxfb3duZXI6cW0uY3VycmVudH19ZnVuY3Rpb24gTyQoZSx0KXtyZXR1cm57JCR0eXBlb2Y6TnUsdHlwZTplLnR5cGUsa2V5OnQscmVmOmUucmVmLHByb3BzOmUucHJvcHMsX293bmVyOmUuX293bmVyfX1mdW5jdGlvbiBlZyhlKXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbCYmZS4kJHR5cGVvZj09PU51fWZ1bmN0aW9uIFAkKGUpe3ZhciB0PXsiPSI6Ij0wIiwiOiI6Ij0yIn07cmV0dXJuIiQiK2UucmVwbGFjZSgvWz06XS9nLGZ1bmN0aW9uKG4pe3JldHVybiB0W25dfSl9dmFyIGN5PS9cLysvZztmdW5jdGlvbiByaChlLHQpe3JldHVybiB0eXBlb2YgZT09Im9iamVjdCImJmUhPT1udWxsJiZlLmtleSE9bnVsbD9QJCgiIitlLmtleSk6dC50b1N0cmluZygzNil9ZnVuY3Rpb24gVGMoZSx0LG4scixpKXt2YXIgbz10eXBlb2YgZTsobz09PSJ1bmRlZmluZWQifHxvPT09ImJvb2xlYW4iKSYmKGU9bnVsbCk7dmFyIGw9ITE7aWYoZT09PW51bGwpbD0hMDtlbHNlIHN3aXRjaChvKXtjYXNlInN0cmluZyI6Y2FzZSJudW1iZXIiOmw9ITA7YnJlYWs7Y2FzZSJvYmplY3QiOnN3aXRjaChlLiQkdHlwZW9mKXtjYXNlIE51OmNhc2UgXyQ6bD0hMH19aWYobClyZXR1cm4gbD1lLGk9aShsKSxlPXI9PT0iIj8iLiIrcmgobCwwKTpyLHV5KGkpPyhuPSIiLGUhPW51bGwmJihuPWUucmVwbGFjZShjeSwiJCYvIikrIi8iKSxUYyhpLHQsbiwiIixmdW5jdGlvbih1KXtyZXR1cm4gdX0pKTppIT1udWxsJiYoZWcoaSkmJihpPU8kKGksbisoIWkua2V5fHxsJiZsLmtleT09PWkua2V5PyIiOigiIitpLmtleSkucmVwbGFjZShjeSwiJCYvIikrIi8iKStlKSksdC5wdXNoKGkpKSwxO2lmKGw9MCxyPXI9PT0iIj8iLiI6cisiOiIsdXkoZSkpZm9yKHZhciBzPTA7czxlLmxlbmd0aDtzKyspe289ZVtzXTt2YXIgYT1yK3JoKG8scyk7bCs9VGMobyx0LG4sYSxpKX1lbHNlIGlmKGE9UiQoZSksdHlwZW9mIGE9PSJmdW5jdGlvbiIpZm9yKGU9YS5jYWxsKGUpLHM9MDshKG89ZS5uZXh0KCkpLmRvbmU7KW89by52YWx1ZSxhPXIrcmgobyxzKyspLGwrPVRjKG8sdCxuLGEsaSk7ZWxzZSBpZihvPT09Im9iamVjdCIpdGhyb3cgdD1TdHJpbmcoZSksRXJyb3IoIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogIisodD09PSJbb2JqZWN0IE9iamVjdF0iPyJvYmplY3Qgd2l0aCBrZXlzIHsiK09iamVjdC5rZXlzKGUpLmpvaW4oIiwgIikrIn0iOnQpKyIpLiBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5IGluc3RlYWQuIik7cmV0dXJuIGx9ZnVuY3Rpb24gWXUoZSx0LG4pe2lmKGU9PW51bGwpcmV0dXJuIGU7dmFyIHI9W10saT0wO3JldHVybiBUYyhlLHIsIiIsIiIsZnVuY3Rpb24obyl7cmV0dXJuIHQuY2FsbChuLG8saSsrKX0pLHJ9ZnVuY3Rpb24gQSQoZSl7aWYoZS5fc3RhdHVzPT09LTEpe3ZhciB0PWUuX3Jlc3VsdDt0PXQoKSx0LnRoZW4oZnVuY3Rpb24obil7KGUuX3N0YXR1cz09PTB8fGUuX3N0YXR1cz09PS0xKSYmKGUuX3N0YXR1cz0xLGUuX3Jlc3VsdD1uKX0sZnVuY3Rpb24obil7KGUuX3N0YXR1cz09PTB8fGUuX3N0YXR1cz09PS0xKSYmKGUuX3N0YXR1cz0yLGUuX3Jlc3VsdD1uKX0pLGUuX3N0YXR1cz09PS0xJiYoZS5fc3RhdHVzPTAsZS5fcmVzdWx0PXQpfWlmKGUuX3N0YXR1cz09PTEpcmV0dXJuIGUuX3Jlc3VsdC5kZWZhdWx0O3Rocm93IGUuX3Jlc3VsdH12YXIgeG49e2N1cnJlbnQ6bnVsbH0sTmM9e3RyYW5zaXRpb246bnVsbH0sTSQ9e1JlYWN0Q3VycmVudERpc3BhdGNoZXI6eG4sUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6TmMsUmVhY3RDdXJyZW50T3duZXI6cW19O1BlLkNoaWxkcmVuPXttYXA6WXUsZm9yRWFjaDpmdW5jdGlvbihlLHQsbil7WXUoZSxmdW5jdGlvbigpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxuKX0sY291bnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9MDtyZXR1cm4gWXUoZSxmdW5jdGlvbigpe3QrK30pLHR9LHRvQXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIFl1KGUsZnVuY3Rpb24odCl7cmV0dXJuIHR9KXx8W119LG9ubHk6ZnVuY3Rpb24oZSl7aWYoIWVnKGUpKXRocm93IEVycm9yKCJSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC4iKTtyZXR1cm4gZX19O1BlLkNvbXBvbmVudD14cztQZS5GcmFnbWVudD13JDtQZS5Qcm9maWxlcj1FJDtQZS5QdXJlQ29tcG9uZW50PVFtO1BlLlN0cmljdE1vZGU9UyQ7UGUuU3VzcGVuc2U9YiQ7UGUuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9TSQ7UGUuY2xvbmVFbGVtZW50PWZ1bmN0aW9uKGUsdCxuKXtpZihlPT1udWxsKXRocm93IEVycm9yKCJSZWFjdC5jbG9uZUVsZW1lbnQoLi4uKTogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCAiK2UrIi4iKTt2YXIgcj0kXyh7fSxlLnByb3BzKSxpPWUua2V5LG89ZS5yZWYsbD1lLl9vd25lcjtpZih0IT1udWxsKXtpZih0LnJlZiE9PXZvaWQgMCYmKG89dC5yZWYsbD1xbS5jdXJyZW50KSx0LmtleSE9PXZvaWQgMCYmKGk9IiIrdC5rZXkpLGUudHlwZSYmZS50eXBlLmRlZmF1bHRQcm9wcyl2YXIgcz1lLnR5cGUuZGVmYXVsdFByb3BzO2ZvcihhIGluIHQpTl8uY2FsbCh0LGEpJiYhUl8uaGFzT3duUHJvcGVydHkoYSkmJihyW2FdPXRbYV09PT12b2lkIDAmJnMhPT12b2lkIDA/c1thXTp0W2FdKX12YXIgYT1hcmd1bWVudHMubGVuZ3RoLTI7aWYoYT09PTEpci5jaGlsZHJlbj1uO2Vsc2UgaWYoMTxhKXtzPUFycmF5KGEpO2Zvcih2YXIgdT0wO3U8YTt1Kyspc1t1XT1hcmd1bWVudHNbdSsyXTtyLmNoaWxkcmVuPXN9cmV0dXJueyQkdHlwZW9mOk51LHR5cGU6ZS50eXBlLGtleTppLHJlZjpvLHByb3BzOnIsX293bmVyOmx9fTtQZS5jcmVhdGVDb250ZXh0PWZ1bmN0aW9uKGUpe3JldHVybiBlPXskJHR5cGVvZjprJCxfY3VycmVudFZhbHVlOmUsX2N1cnJlbnRWYWx1ZTI6ZSxfdGhyZWFkQ291bnQ6MCxQcm92aWRlcjpudWxsLENvbnN1bWVyOm51bGwsX2RlZmF1bHRWYWx1ZTpudWxsLF9nbG9iYWxOYW1lOm51bGx9LGUuUHJvdmlkZXI9eyQkdHlwZW9mOkMkLF9jb250ZXh0OmV9LGUuQ29uc3VtZXI9ZX07UGUuY3JlYXRlRWxlbWVudD1PXztQZS5jcmVhdGVGYWN0b3J5PWZ1bmN0aW9uKGUpe3ZhciB0PU9fLmJpbmQobnVsbCxlKTtyZXR1cm4gdC50eXBlPWUsdH07UGUuY3JlYXRlUmVmPWZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bnVsbH19O1BlLmZvcndhcmRSZWY9ZnVuY3Rpb24oZSl7cmV0dXJueyQkdHlwZW9mOiQkLHJlbmRlcjplfX07UGUuaXNWYWxpZEVsZW1lbnQ9ZWc7UGUubGF6eT1mdW5jdGlvbihlKXtyZXR1cm57JCR0eXBlb2Y6TiQsX3BheWxvYWQ6e19zdGF0dXM6LTEsX3Jlc3VsdDplfSxfaW5pdDpBJH19O1BlLm1lbW89ZnVuY3Rpb24oZSx0KXtyZXR1cm57JCR0eXBlb2Y6VCQsdHlwZTplLGNvbXBhcmU6dD09PXZvaWQgMD9udWxsOnR9fTtQZS5zdGFydFRyYW5zaXRpb249ZnVuY3Rpb24oZSl7dmFyIHQ9TmMudHJhbnNpdGlvbjtOYy50cmFuc2l0aW9uPXt9O3RyeXtlKCl9ZmluYWxseXtOYy50cmFuc2l0aW9uPXR9fTtQZS51bnN0YWJsZV9hY3Q9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiYWN0KC4uLikgaXMgbm90IHN1cHBvcnRlZCBpbiBwcm9kdWN0aW9uIGJ1aWxkcyBvZiBSZWFjdC4iKX07UGUudXNlQ2FsbGJhY2s9ZnVuY3Rpb24oZSx0KXtyZXR1cm4geG4uY3VycmVudC51c2VDYWxsYmFjayhlLHQpfTtQZS51c2VDb250ZXh0PWZ1bmN0aW9uKGUpe3JldHVybiB4bi5jdXJyZW50LnVzZUNvbnRleHQoZSl9O1BlLnVzZURlYnVnVmFsdWU9ZnVuY3Rpb24oKXt9O1BlLnVzZURlZmVycmVkVmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIHhuLmN1cnJlbnQudXNlRGVmZXJyZWRWYWx1ZShlKX07UGUudXNlRWZmZWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHhuLmN1cnJlbnQudXNlRWZmZWN0KGUsdCl9O1BlLnVzZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIHhuLmN1cnJlbnQudXNlSWQoKX07UGUudXNlSW1wZXJhdGl2ZUhhbmRsZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHhuLmN1cnJlbnQudXNlSW1wZXJhdGl2ZUhhbmRsZShlLHQsbil9O1BlLnVzZUluc2VydGlvbkVmZmVjdD1mdW5jdGlvbihlLHQpe3JldHVybiB4bi5jdXJyZW50LnVzZUluc2VydGlvbkVmZmVjdChlLHQpfTtQZS51c2VMYXlvdXRFZmZlY3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4geG4uY3VycmVudC51c2VMYXlvdXRFZmZlY3QoZSx0KX07UGUudXNlTWVtbz1mdW5jdGlvbihlLHQpe3JldHVybiB4bi5jdXJyZW50LnVzZU1lbW8oZSx0KX07UGUudXNlUmVkdWNlcj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHhuLmN1cnJlbnQudXNlUmVkdWNlcihlLHQsbil9O1BlLnVzZVJlZj1mdW5jdGlvbihlKXtyZXR1cm4geG4uY3VycmVudC51c2VSZWYoZSl9O1BlLnVzZVN0YXRlPWZ1bmN0aW9uKGUpe3JldHVybiB4bi5jdXJyZW50LnVzZVN0YXRlKGUpfTtQZS51c2VTeW5jRXh0ZXJuYWxTdG9yZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHhuLmN1cnJlbnQudXNlU3luY0V4dGVybmFsU3RvcmUoZSx0LG4pfTtQZS51c2VUcmFuc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHhuLmN1cnJlbnQudXNlVHJhbnNpdGlvbigpfTtQZS52ZXJzaW9uPSIxOC4yLjAiO0NfLmV4cG9ydHM9UGU7dmFyIHA9Q18uZXhwb3J0cztjb25zdCByZT1UdShwKSxQXz1FXyh7X19wcm90b19fOm51bGwsZGVmYXVsdDpyZX0sW3BdKTt2YXIgUWg9e30sQV89e2V4cG9ydHM6e319LFZuPXt9LE1fPXtleHBvcnRzOnt9fSxEXz17fTsvKioKICogQGxpY2Vuc2UgUmVhY3QKICogc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzCiAqCiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogKi8oZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChrLGope3ZhciBJPWsubGVuZ3RoO2sucHVzaChqKTtlOmZvcig7MDxJOyl7dmFyIFo9SS0xPj4+MSxuZT1rW1pdO2lmKDA8aShuZSxqKSlrW1pdPWosa1tJXT1uZSxJPVo7ZWxzZSBicmVhayBlfX1mdW5jdGlvbiBuKGspe3JldHVybiBrLmxlbmd0aD09PTA/bnVsbDprWzBdfWZ1bmN0aW9uIHIoayl7aWYoay5sZW5ndGg9PT0wKXJldHVybiBudWxsO3ZhciBqPWtbMF0sST1rLnBvcCgpO2lmKEkhPT1qKXtrWzBdPUk7ZTpmb3IodmFyIFo9MCxuZT1rLmxlbmd0aCxrZT1uZT4+PjE7WjxrZTspe3ZhciB2ZT0yKihaKzEpLTEsV2U9a1t2ZV0sRmU9dmUrMSx0ZT1rW0ZlXTtpZigwPmkoV2UsSSkpRmU8bmUmJjA+aSh0ZSxXZSk/KGtbWl09dGUsa1tGZV09SSxaPUZlKTooa1taXT1XZSxrW3ZlXT1JLFo9dmUpO2Vsc2UgaWYoRmU8bmUmJjA+aSh0ZSxJKSlrW1pdPXRlLGtbRmVdPUksWj1GZTtlbHNlIGJyZWFrIGV9fXJldHVybiBqfWZ1bmN0aW9uIGkoayxqKXt2YXIgST1rLnNvcnRJbmRleC1qLnNvcnRJbmRleDtyZXR1cm4gSSE9PTA/STprLmlkLWouaWR9aWYodHlwZW9mIHBlcmZvcm1hbmNlPT0ib2JqZWN0IiYmdHlwZW9mIHBlcmZvcm1hbmNlLm5vdz09ImZ1bmN0aW9uIil7dmFyIG89cGVyZm9ybWFuY2U7ZS51bnN0YWJsZV9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gby5ub3coKX19ZWxzZXt2YXIgbD1EYXRlLHM9bC5ub3coKTtlLnVuc3RhYmxlX25vdz1mdW5jdGlvbigpe3JldHVybiBsLm5vdygpLXN9fXZhciBhPVtdLHU9W10sYz0xLGQ9bnVsbCxmPTMsaD0hMSxtPSExLGc9ITEsdz10eXBlb2Ygc2V0VGltZW91dD09ImZ1bmN0aW9uIj9zZXRUaW1lb3V0Om51bGwsdj10eXBlb2YgY2xlYXJUaW1lb3V0PT0iZnVuY3Rpb24iP2NsZWFyVGltZW91dDpudWxsLHk9dHlwZW9mIHNldEltbWVkaWF0ZTwidSI/c2V0SW1tZWRpYXRlOm51bGw7dHlwZW9mIG5hdmlnYXRvcjwidSImJm5hdmlnYXRvci5zY2hlZHVsaW5nIT09dm9pZCAwJiZuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZyE9PXZvaWQgMCYmbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcuYmluZChuYXZpZ2F0b3Iuc2NoZWR1bGluZyk7ZnVuY3Rpb24gXyhrKXtmb3IodmFyIGo9bih1KTtqIT09bnVsbDspe2lmKGouY2FsbGJhY2s9PT1udWxsKXIodSk7ZWxzZSBpZihqLnN0YXJ0VGltZTw9aylyKHUpLGouc29ydEluZGV4PWouZXhwaXJhdGlvblRpbWUsdChhLGopO2Vsc2UgYnJlYWs7aj1uKHUpfX1mdW5jdGlvbiBTKGspe2lmKGc9ITEsXyhrKSwhbSlpZihuKGEpIT09bnVsbCltPSEwLE8oRSk7ZWxzZXt2YXIgaj1uKHUpO2ohPT1udWxsJiZBKFMsai5zdGFydFRpbWUtayl9fWZ1bmN0aW9uIEUoayxqKXttPSExLGcmJihnPSExLHYoVCksVD0tMSksaD0hMDt2YXIgST1mO3RyeXtmb3IoXyhqKSxkPW4oYSk7ZCE9PW51bGwmJighKGQuZXhwaXJhdGlvblRpbWU+ail8fGsmJiFEKCkpOyl7dmFyIFo9ZC5jYWxsYmFjaztpZih0eXBlb2YgWj09ImZ1bmN0aW9uIil7ZC5jYWxsYmFjaz1udWxsLGY9ZC5wcmlvcml0eUxldmVsO3ZhciBuZT1aKGQuZXhwaXJhdGlvblRpbWU8PWopO2o9ZS51bnN0YWJsZV9ub3coKSx0eXBlb2YgbmU9PSJmdW5jdGlvbiI/ZC5jYWxsYmFjaz1uZTpkPT09bihhKSYmcihhKSxfKGopfWVsc2UgcihhKTtkPW4oYSl9aWYoZCE9PW51bGwpdmFyIGtlPSEwO2Vsc2V7dmFyIHZlPW4odSk7dmUhPT1udWxsJiZBKFMsdmUuc3RhcnRUaW1lLWopLGtlPSExfXJldHVybiBrZX1maW5hbGx5e2Q9bnVsbCxmPUksaD0hMX19dmFyICQ9ITEsQz1udWxsLFQ9LTEsTj01LFI9LTE7ZnVuY3Rpb24gRCgpe3JldHVybiEoZS51bnN0YWJsZV9ub3coKS1SPE4pfWZ1bmN0aW9uIEYoKXtpZihDIT09bnVsbCl7dmFyIGs9ZS51bnN0YWJsZV9ub3coKTtSPWs7dmFyIGo9ITA7dHJ5e2o9QyghMCxrKX1maW5hbGx5e2o/c2UoKTooJD0hMSxDPW51bGwpfX1lbHNlICQ9ITF9dmFyIHNlO2lmKHR5cGVvZiB5PT0iZnVuY3Rpb24iKXNlPWZ1bmN0aW9uKCl7eShGKX07ZWxzZSBpZih0eXBlb2YgTWVzc2FnZUNoYW5uZWw8InUiKXt2YXIgVj1uZXcgTWVzc2FnZUNoYW5uZWwsSz1WLnBvcnQyO1YucG9ydDEub25tZXNzYWdlPUYsc2U9ZnVuY3Rpb24oKXtLLnBvc3RNZXNzYWdlKG51bGwpfX1lbHNlIHNlPWZ1bmN0aW9uKCl7dyhGLDApfTtmdW5jdGlvbiBPKGspe0M9aywkfHwoJD0hMCxzZSgpKX1mdW5jdGlvbiBBKGssail7VD13KGZ1bmN0aW9uKCl7ayhlLnVuc3RhYmxlX25vdygpKX0sail9ZS51bnN0YWJsZV9JZGxlUHJpb3JpdHk9NSxlLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5PTEsZS51bnN0YWJsZV9Mb3dQcmlvcml0eT00LGUudW5zdGFibGVfTm9ybWFsUHJpb3JpdHk9MyxlLnVuc3RhYmxlX1Byb2ZpbGluZz1udWxsLGUudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHk9MixlLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrPWZ1bmN0aW9uKGspe2suY2FsbGJhY2s9bnVsbH0sZS51bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbj1mdW5jdGlvbigpe218fGh8fChtPSEwLE8oRSkpfSxlLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlPWZ1bmN0aW9uKGspezA+a3x8MTI1PGs/Y29uc29sZS5lcnJvcigiZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsIGZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkIik6Tj0wPGs/TWF0aC5mbG9vcigxZTMvayk6NX0sZS51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbD1mdW5jdGlvbigpe3JldHVybiBmfSxlLnVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIG4oYSl9LGUudW5zdGFibGVfbmV4dD1mdW5jdGlvbihrKXtzd2l0Y2goZil7Y2FzZSAxOmNhc2UgMjpjYXNlIDM6dmFyIGo9MzticmVhaztkZWZhdWx0Omo9Zn12YXIgST1mO2Y9ajt0cnl7cmV0dXJuIGsoKX1maW5hbGx5e2Y9SX19LGUudW5zdGFibGVfcGF1c2VFeGVjdXRpb249ZnVuY3Rpb24oKXt9LGUudW5zdGFibGVfcmVxdWVzdFBhaW50PWZ1bmN0aW9uKCl7fSxlLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eT1mdW5jdGlvbihrLGope3N3aXRjaChrKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OmJyZWFrO2RlZmF1bHQ6az0zfXZhciBJPWY7Zj1rO3RyeXtyZXR1cm4gaigpfWZpbmFsbHl7Zj1JfX0sZS51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrPWZ1bmN0aW9uKGssaixJKXt2YXIgWj1lLnVuc3RhYmxlX25vdygpO3N3aXRjaCh0eXBlb2YgST09Im9iamVjdCImJkkhPT1udWxsPyhJPUkuZGVsYXksST10eXBlb2YgST09Im51bWJlciImJjA8ST9aK0k6Wik6ST1aLGspe2Nhc2UgMTp2YXIgbmU9LTE7YnJlYWs7Y2FzZSAyOm5lPTI1MDticmVhaztjYXNlIDU6bmU9MTA3Mzc0MTgyMzticmVhaztjYXNlIDQ6bmU9MWU0O2JyZWFrO2RlZmF1bHQ6bmU9NWUzfXJldHVybiBuZT1JK25lLGs9e2lkOmMrKyxjYWxsYmFjazpqLHByaW9yaXR5TGV2ZWw6ayxzdGFydFRpbWU6SSxleHBpcmF0aW9uVGltZTpuZSxzb3J0SW5kZXg6LTF9LEk+Wj8oay5zb3J0SW5kZXg9SSx0KHUsayksbihhKT09PW51bGwmJms9PT1uKHUpJiYoZz8odihUKSxUPS0xKTpnPSEwLEEoUyxJLVopKSk6KGsuc29ydEluZGV4PW5lLHQoYSxrKSxtfHxofHwobT0hMCxPKEUpKSksa30sZS51bnN0YWJsZV9zaG91bGRZaWVsZD1ELGUudW5zdGFibGVfd3JhcENhbGxiYWNrPWZ1bmN0aW9uKGspe3ZhciBqPWY7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIEk9ZjtmPWo7dHJ5e3JldHVybiBrLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1maW5hbGx5e2Y9SX19fX0pKERfKTtNXy5leHBvcnRzPURfO3ZhciBEJD1NXy5leHBvcnRzOy8qKgogKiBAbGljZW5zZSBSZWFjdAogKiByZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMKICoKICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqL3ZhciBMXz1wLEJuPUQkO2Z1bmN0aW9uIFUoZSl7Zm9yKHZhciB0PSJodHRwczovL3JlYWN0anMub3JnL2RvY3MvZXJyb3ItZGVjb2Rlci5odG1sP2ludmFyaWFudD0iK2Usbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdCs9IiZhcmdzW109IitlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW25dKTtyZXR1cm4iTWluaWZpZWQgUmVhY3QgZXJyb3IgIyIrZSsiOyB2aXNpdCAiK3QrIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIn12YXIgSV89bmV3IFNldCxJYT17fTtmdW5jdGlvbiBpbChlLHQpe3RzKGUsdCksdHMoZSsiQ2FwdHVyZSIsdCl9ZnVuY3Rpb24gdHMoZSx0KXtmb3IoSWFbZV09dCxlPTA7ZTx0Lmxlbmd0aDtlKyspSV8uYWRkKHRbZV0pfXZhciBkaT0hKHR5cGVvZiB3aW5kb3c+InUifHx0eXBlb2Ygd2luZG93LmRvY3VtZW50PiJ1Inx8dHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PiJ1IiksSmg9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxMJD0vXls6QS1aX2Etelx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDJGRlx1MDM3MC1cdTAzN0RcdTAzN0YtXHUxRkZGXHUyMDBDLVx1MjAwRFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZEXVs6QS1aX2Etelx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDJGRlx1MDM3MC1cdTAzN0RcdTAzN0YtXHUxRkZGXHUyMDBDLVx1MjAwRFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZEXC0uMC05XHUwMEI3XHUwMzAwLVx1MDM2Rlx1MjAzRi1cdTIwNDBdKiQvLGR5PXt9LGZ5PXt9O2Z1bmN0aW9uIEkkKGUpe3JldHVybiBKaC5jYWxsKGZ5LGUpPyEwOkpoLmNhbGwoZHksZSk/ITE6TCQudGVzdChlKT9meVtlXT0hMDooZHlbZV09ITAsITEpfWZ1bmN0aW9uIGokKGUsdCxuLHIpe2lmKG4hPT1udWxsJiZuLnR5cGU9PT0wKXJldHVybiExO3N3aXRjaCh0eXBlb2YgdCl7Y2FzZSJmdW5jdGlvbiI6Y2FzZSJzeW1ib2wiOnJldHVybiEwO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIHI/ITE6biE9PW51bGw/IW4uYWNjZXB0c0Jvb2xlYW5zOihlPWUudG9Mb3dlckNhc2UoKS5zbGljZSgwLDUpLGUhPT0iZGF0YS0iJiZlIT09ImFyaWEtIik7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24geiQoZSx0LG4scil7aWYodD09PW51bGx8fHR5cGVvZiB0PiJ1Inx8aiQoZSx0LG4scikpcmV0dXJuITA7aWYocilyZXR1cm4hMTtpZihuIT09bnVsbClzd2l0Y2gobi50eXBlKXtjYXNlIDM6cmV0dXJuIXQ7Y2FzZSA0OnJldHVybiB0PT09ITE7Y2FzZSA1OnJldHVybiBpc05hTih0KTtjYXNlIDY6cmV0dXJuIGlzTmFOKHQpfHwxPnR9cmV0dXJuITF9ZnVuY3Rpb24gX24oZSx0LG4scixpLG8sbCl7dGhpcy5hY2NlcHRzQm9vbGVhbnM9dD09PTJ8fHQ9PT0zfHx0PT09NCx0aGlzLmF0dHJpYnV0ZU5hbWU9cix0aGlzLmF0dHJpYnV0ZU5hbWVzcGFjZT1pLHRoaXMubXVzdFVzZVByb3BlcnR5PW4sdGhpcy5wcm9wZXJ0eU5hbWU9ZSx0aGlzLnR5cGU9dCx0aGlzLnNhbml0aXplVVJMPW8sdGhpcy5yZW1vdmVFbXB0eVN0cmluZz1sfXZhciBHdD17fTsiY2hpbGRyZW4gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgZGVmYXVsdFZhbHVlIGRlZmF1bHRDaGVja2VkIGlubmVySFRNTCBzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIHN0eWxlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7R3RbZV09bmV3IF9uKGUsMCwhMSxlLG51bGwsITEsITEpfSk7W1siYWNjZXB0Q2hhcnNldCIsImFjY2VwdC1jaGFyc2V0Il0sWyJjbGFzc05hbWUiLCJjbGFzcyJdLFsiaHRtbEZvciIsImZvciJdLFsiaHR0cEVxdWl2IiwiaHR0cC1lcXVpdiJdXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWVbMF07R3RbdF09bmV3IF9uKHQsMSwhMSxlWzFdLG51bGwsITEsITEpfSk7WyJjb250ZW50RWRpdGFibGUiLCJkcmFnZ2FibGUiLCJzcGVsbENoZWNrIiwidmFsdWUiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0d0W2VdPW5ldyBfbihlLDIsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7WyJhdXRvUmV2ZXJzZSIsImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQiLCJmb2N1c2FibGUiLCJwcmVzZXJ2ZUFscGhhIl0uZm9yRWFjaChmdW5jdGlvbihlKXtHdFtlXT1uZXcgX24oZSwyLCExLGUsbnVsbCwhMSwhMSl9KTsiYWxsb3dGdWxsU2NyZWVuIGFzeW5jIGF1dG9Gb2N1cyBhdXRvUGxheSBjb250cm9scyBkZWZhdWx0IGRlZmVyIGRpc2FibGVkIGRpc2FibGVQaWN0dXJlSW5QaWN0dXJlIGRpc2FibGVSZW1vdGVQbGF5YmFjayBmb3JtTm9WYWxpZGF0ZSBoaWRkZW4gbG9vcCBub01vZHVsZSBub1ZhbGlkYXRlIG9wZW4gcGxheXNJbmxpbmUgcmVhZE9ubHkgcmVxdWlyZWQgcmV2ZXJzZWQgc2NvcGVkIHNlYW1sZXNzIGl0ZW1TY29wZSIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0d0W2VdPW5ldyBfbihlLDMsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7WyJjaGVja2VkIiwibXVsdGlwbGUiLCJtdXRlZCIsInNlbGVjdGVkIl0uZm9yRWFjaChmdW5jdGlvbihlKXtHdFtlXT1uZXcgX24oZSwzLCEwLGUsbnVsbCwhMSwhMSl9KTtbImNhcHR1cmUiLCJkb3dubG9hZCJdLmZvckVhY2goZnVuY3Rpb24oZSl7R3RbZV09bmV3IF9uKGUsNCwhMSxlLG51bGwsITEsITEpfSk7WyJjb2xzIiwicm93cyIsInNpemUiLCJzcGFuIl0uZm9yRWFjaChmdW5jdGlvbihlKXtHdFtlXT1uZXcgX24oZSw2LCExLGUsbnVsbCwhMSwhMSl9KTtbInJvd1NwYW4iLCJzdGFydCJdLmZvckVhY2goZnVuY3Rpb24oZSl7R3RbZV09bmV3IF9uKGUsNSwhMSxlLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTt2YXIgdGc9L1tcLTpdKFthLXpdKS9nO2Z1bmN0aW9uIG5nKGUpe3JldHVybiBlWzFdLnRvVXBwZXJDYXNlKCl9ImFjY2VudC1oZWlnaHQgYWxpZ25tZW50LWJhc2VsaW5lIGFyYWJpYy1mb3JtIGJhc2VsaW5lLXNoaWZ0IGNhcC1oZWlnaHQgY2xpcC1wYXRoIGNsaXAtcnVsZSBjb2xvci1pbnRlcnBvbGF0aW9uIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyBjb2xvci1wcm9maWxlIGNvbG9yLXJlbmRlcmluZyBkb21pbmFudC1iYXNlbGluZSBlbmFibGUtYmFja2dyb3VuZCBmaWxsLW9wYWNpdHkgZmlsbC1ydWxlIGZsb29kLWNvbG9yIGZsb29kLW9wYWNpdHkgZm9udC1mYW1pbHkgZm9udC1zaXplIGZvbnQtc2l6ZS1hZGp1c3QgZm9udC1zdHJldGNoIGZvbnQtc3R5bGUgZm9udC12YXJpYW50IGZvbnQtd2VpZ2h0IGdseXBoLW5hbWUgZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCBnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCBob3Jpei1hZHYteCBob3Jpei1vcmlnaW4teCBpbWFnZS1yZW5kZXJpbmcgbGV0dGVyLXNwYWNpbmcgbGlnaHRpbmctY29sb3IgbWFya2VyLWVuZCBtYXJrZXItbWlkIG1hcmtlci1zdGFydCBvdmVybGluZS1wb3NpdGlvbiBvdmVybGluZS10aGlja25lc3MgcGFpbnQtb3JkZXIgcGFub3NlLTEgcG9pbnRlci1ldmVudHMgcmVuZGVyaW5nLWludGVudCBzaGFwZS1yZW5kZXJpbmcgc3RvcC1jb2xvciBzdG9wLW9wYWNpdHkgc3RyaWtldGhyb3VnaC1wb3NpdGlvbiBzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyBzdHJva2UtZGFzaGFycmF5IHN0cm9rZS1kYXNob2Zmc2V0IHN0cm9rZS1saW5lY2FwIHN0cm9rZS1saW5lam9pbiBzdHJva2UtbWl0ZXJsaW1pdCBzdHJva2Utb3BhY2l0eSBzdHJva2Utd2lkdGggdGV4dC1hbmNob3IgdGV4dC1kZWNvcmF0aW9uIHRleHQtcmVuZGVyaW5nIHVuZGVybGluZS1wb3NpdGlvbiB1bmRlcmxpbmUtdGhpY2tuZXNzIHVuaWNvZGUtYmlkaSB1bmljb2RlLXJhbmdlIHVuaXRzLXBlci1lbSB2LWFscGhhYmV0aWMgdi1oYW5naW5nIHYtaWRlb2dyYXBoaWMgdi1tYXRoZW1hdGljYWwgdmVjdG9yLWVmZmVjdCB2ZXJ0LWFkdi15IHZlcnQtb3JpZ2luLXggdmVydC1vcmlnaW4teSB3b3JkLXNwYWNpbmcgd3JpdGluZy1tb2RlIHhtbG5zOnhsaW5rIHgtaGVpZ2h0Ii5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHRnLG5nKTtHdFt0XT1uZXcgX24odCwxLCExLGUsbnVsbCwhMSwhMSl9KTsieGxpbms6YWN0dWF0ZSB4bGluazphcmNyb2xlIHhsaW5rOnJvbGUgeGxpbms6c2hvdyB4bGluazp0aXRsZSB4bGluazp0eXBlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHRnLG5nKTtHdFt0XT1uZXcgX24odCwxLCExLGUsImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCExLCExKX0pO1sieG1sOmJhc2UiLCJ4bWw6bGFuZyIsInhtbDpzcGFjZSJdLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHRnLG5nKTtHdFt0XT1uZXcgX24odCwxLCExLGUsImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsITEsITEpfSk7WyJ0YWJJbmRleCIsImNyb3NzT3JpZ2luIl0uZm9yRWFjaChmdW5jdGlvbihlKXtHdFtlXT1uZXcgX24oZSwxLCExLGUudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO0d0LnhsaW5rSHJlZj1uZXcgX24oInhsaW5rSHJlZiIsMSwhMSwieGxpbms6aHJlZiIsImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCEwLCExKTtbInNyYyIsImhyZWYiLCJhY3Rpb24iLCJmb3JtQWN0aW9uIl0uZm9yRWFjaChmdW5jdGlvbihlKXtHdFtlXT1uZXcgX24oZSwxLCExLGUudG9Mb3dlckNhc2UoKSxudWxsLCEwLCEwKX0pO2Z1bmN0aW9uIHJnKGUsdCxuLHIpe3ZhciBpPUd0Lmhhc093blByb3BlcnR5KHQpP0d0W3RdOm51bGw7KGkhPT1udWxsP2kudHlwZSE9PTA6cnx8ISgyPHQubGVuZ3RoKXx8dFswXSE9PSJvIiYmdFswXSE9PSJPInx8dFsxXSE9PSJuIiYmdFsxXSE9PSJOIikmJih6JCh0LG4saSxyKSYmKG49bnVsbCkscnx8aT09PW51bGw/SSQodCkmJihuPT09bnVsbD9lLnJlbW92ZUF0dHJpYnV0ZSh0KTplLnNldEF0dHJpYnV0ZSh0LCIiK24pKTppLm11c3RVc2VQcm9wZXJ0eT9lW2kucHJvcGVydHlOYW1lXT1uPT09bnVsbD9pLnR5cGU9PT0zPyExOiIiOm46KHQ9aS5hdHRyaWJ1dGVOYW1lLHI9aS5hdHRyaWJ1dGVOYW1lc3BhY2Usbj09PW51bGw/ZS5yZW1vdmVBdHRyaWJ1dGUodCk6KGk9aS50eXBlLG49aT09PTN8fGk9PT00JiZuPT09ITA/IiI6IiIrbixyP2Uuc2V0QXR0cmlidXRlTlMocix0LG4pOmUuc2V0QXR0cmlidXRlKHQsbikpKSl9dmFyIHhpPUxfLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVELFh1PVN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKSxibD1TeW1ib2wuZm9yKCJyZWFjdC5wb3J0YWwiKSxUbD1TeW1ib2wuZm9yKCJyZWFjdC5mcmFnbWVudCIpLGlnPVN5bWJvbC5mb3IoInJlYWN0LnN0cmljdF9tb2RlIikscWg9U3ltYm9sLmZvcigicmVhY3QucHJvZmlsZXIiKSxqXz1TeW1ib2wuZm9yKCJyZWFjdC5wcm92aWRlciIpLHpfPVN5bWJvbC5mb3IoInJlYWN0LmNvbnRleHQiKSxvZz1TeW1ib2wuZm9yKCJyZWFjdC5mb3J3YXJkX3JlZiIpLGVwPVN5bWJvbC5mb3IoInJlYWN0LnN1c3BlbnNlIiksdHA9U3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2VfbGlzdCIpLGxnPVN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKSxBaT1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5IiksRl89U3ltYm9sLmZvcigicmVhY3Qub2Zmc2NyZWVuIiksaHk9U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIEJzKGUpe3JldHVybiBlPT09bnVsbHx8dHlwZW9mIGUhPSJvYmplY3QiP251bGw6KGU9aHkmJmVbaHldfHxlWyJAQGl0ZXJhdG9yIl0sdHlwZW9mIGU9PSJmdW5jdGlvbiI/ZTpudWxsKX12YXIgbXQ9T2JqZWN0LmFzc2lnbixpaDtmdW5jdGlvbiBsYShlKXtpZihpaD09PXZvaWQgMCl0cnl7dGhyb3cgRXJyb3IoKX1jYXRjaChuKXt2YXIgdD1uLnN0YWNrLnRyaW0oKS5tYXRjaCgvXG4oICooYXQgKT8pLyk7aWg9dCYmdFsxXXx8IiJ9cmV0dXJuYApgK2loK2V9dmFyIG9oPSExO2Z1bmN0aW9uIGxoKGUsdCl7aWYoIWV8fG9oKXJldHVybiIiO29oPSEwO3ZhciBuPUVycm9yLnByZXBhcmVTdGFja1RyYWNlO0Vycm9yLnByZXBhcmVTdGFja1RyYWNlPXZvaWQgMDt0cnl7aWYodClpZih0PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJwcm9wcyIse3NldDpmdW5jdGlvbigpe3Rocm93IEVycm9yKCl9fSksdHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiJiZSZWZsZWN0LmNvbnN0cnVjdCl7dHJ5e1JlZmxlY3QuY29uc3RydWN0KHQsW10pfWNhdGNoKHUpe3ZhciByPXV9UmVmbGVjdC5jb25zdHJ1Y3QoZSxbXSx0KX1lbHNle3RyeXt0LmNhbGwoKX1jYXRjaCh1KXtyPXV9ZS5jYWxsKHQucHJvdG90eXBlKX1lbHNle3RyeXt0aHJvdyBFcnJvcigpfWNhdGNoKHUpe3I9dX1lKCl9fWNhdGNoKHUpe2lmKHUmJnImJnR5cGVvZiB1LnN0YWNrPT0ic3RyaW5nIil7Zm9yKHZhciBpPXUuc3RhY2suc3BsaXQoYApgKSxvPXIuc3RhY2suc3BsaXQoYApgKSxsPWkubGVuZ3RoLTEscz1vLmxlbmd0aC0xOzE8PWwmJjA8PXMmJmlbbF0hPT1vW3NdOylzLS07Zm9yKDsxPD1sJiYwPD1zO2wtLSxzLS0paWYoaVtsXSE9PW9bc10pe2lmKGwhPT0xfHxzIT09MSlkbyBpZihsLS0scy0tLDA+c3x8aVtsXSE9PW9bc10pe3ZhciBhPWAKYCtpW2xdLnJlcGxhY2UoIiBhdCBuZXcgIiwiIGF0ICIpO3JldHVybiBlLmRpc3BsYXlOYW1lJiZhLmluY2x1ZGVzKCI8YW5vbnltb3VzPiIpJiYoYT1hLnJlcGxhY2UoIjxhbm9ueW1vdXM+IixlLmRpc3BsYXlOYW1lKSksYX13aGlsZSgxPD1sJiYwPD1zKTticmVha319fWZpbmFsbHl7b2g9ITEsRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9bn1yZXR1cm4oZT1lP2UuZGlzcGxheU5hbWV8fGUubmFtZToiIik/bGEoZSk6IiJ9ZnVuY3Rpb24gRiQoZSl7c3dpdGNoKGUudGFnKXtjYXNlIDU6cmV0dXJuIGxhKGUudHlwZSk7Y2FzZSAxNjpyZXR1cm4gbGEoIkxhenkiKTtjYXNlIDEzOnJldHVybiBsYSgiU3VzcGVuc2UiKTtjYXNlIDE5OnJldHVybiBsYSgiU3VzcGVuc2VMaXN0Iik7Y2FzZSAwOmNhc2UgMjpjYXNlIDE1OnJldHVybiBlPWxoKGUudHlwZSwhMSksZTtjYXNlIDExOnJldHVybiBlPWxoKGUudHlwZS5yZW5kZXIsITEpLGU7Y2FzZSAxOnJldHVybiBlPWxoKGUudHlwZSwhMCksZTtkZWZhdWx0OnJldHVybiIifX1mdW5jdGlvbiBucChlKXtpZihlPT1udWxsKXJldHVybiBudWxsO2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iKXJldHVybiBlLmRpc3BsYXlOYW1lfHxlLm5hbWV8fG51bGw7aWYodHlwZW9mIGU9PSJzdHJpbmciKXJldHVybiBlO3N3aXRjaChlKXtjYXNlIFRsOnJldHVybiJGcmFnbWVudCI7Y2FzZSBibDpyZXR1cm4iUG9ydGFsIjtjYXNlIHFoOnJldHVybiJQcm9maWxlciI7Y2FzZSBpZzpyZXR1cm4iU3RyaWN0TW9kZSI7Y2FzZSBlcDpyZXR1cm4iU3VzcGVuc2UiO2Nhc2UgdHA6cmV0dXJuIlN1c3BlbnNlTGlzdCJ9aWYodHlwZW9mIGU9PSJvYmplY3QiKXN3aXRjaChlLiQkdHlwZW9mKXtjYXNlIHpfOnJldHVybihlLmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuQ29uc3VtZXIiO2Nhc2Ugal86cmV0dXJuKGUuX2NvbnRleHQuZGlzcGxheU5hbWV8fCJDb250ZXh0IikrIi5Qcm92aWRlciI7Y2FzZSBvZzp2YXIgdD1lLnJlbmRlcjtyZXR1cm4gZT1lLmRpc3BsYXlOYW1lLGV8fChlPXQuZGlzcGxheU5hbWV8fHQubmFtZXx8IiIsZT1lIT09IiI/IkZvcndhcmRSZWYoIitlKyIpIjoiRm9yd2FyZFJlZiIpLGU7Y2FzZSBsZzpyZXR1cm4gdD1lLmRpc3BsYXlOYW1lfHxudWxsLHQhPT1udWxsP3Q6bnAoZS50eXBlKXx8Ik1lbW8iO2Nhc2UgQWk6dD1lLl9wYXlsb2FkLGU9ZS5faW5pdDt0cnl7cmV0dXJuIG5wKGUodCkpfWNhdGNoe319cmV0dXJuIG51bGx9ZnVuY3Rpb24gQiQoZSl7dmFyIHQ9ZS50eXBlO3N3aXRjaChlLnRhZyl7Y2FzZSAyNDpyZXR1cm4iQ2FjaGUiO2Nhc2UgOTpyZXR1cm4odC5kaXNwbGF5TmFtZXx8IkNvbnRleHQiKSsiLkNvbnN1bWVyIjtjYXNlIDEwOnJldHVybih0Ll9jb250ZXh0LmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuUHJvdmlkZXIiO2Nhc2UgMTg6cmV0dXJuIkRlaHlkcmF0ZWRGcmFnbWVudCI7Y2FzZSAxMTpyZXR1cm4gZT10LnJlbmRlcixlPWUuZGlzcGxheU5hbWV8fGUubmFtZXx8IiIsdC5kaXNwbGF5TmFtZXx8KGUhPT0iIj8iRm9yd2FyZFJlZigiK2UrIikiOiJGb3J3YXJkUmVmIik7Y2FzZSA3OnJldHVybiJGcmFnbWVudCI7Y2FzZSA1OnJldHVybiB0O2Nhc2UgNDpyZXR1cm4iUG9ydGFsIjtjYXNlIDM6cmV0dXJuIlJvb3QiO2Nhc2UgNjpyZXR1cm4iVGV4dCI7Y2FzZSAxNjpyZXR1cm4gbnAodCk7Y2FzZSA4OnJldHVybiB0PT09aWc/IlN0cmljdE1vZGUiOiJNb2RlIjtjYXNlIDIyOnJldHVybiJPZmZzY3JlZW4iO2Nhc2UgMTI6cmV0dXJuIlByb2ZpbGVyIjtjYXNlIDIxOnJldHVybiJTY29wZSI7Y2FzZSAxMzpyZXR1cm4iU3VzcGVuc2UiO2Nhc2UgMTk6cmV0dXJuIlN1c3BlbnNlTGlzdCI7Y2FzZSAyNTpyZXR1cm4iVHJhY2luZ01hcmtlciI7Y2FzZSAxOmNhc2UgMDpjYXNlIDE3OmNhc2UgMjpjYXNlIDE0OmNhc2UgMTU6aWYodHlwZW9mIHQ9PSJmdW5jdGlvbiIpcmV0dXJuIHQuZGlzcGxheU5hbWV8fHQubmFtZXx8bnVsbDtpZih0eXBlb2YgdD09InN0cmluZyIpcmV0dXJuIHR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gdG8oZSl7c3dpdGNoKHR5cGVvZiBlKXtjYXNlImJvb2xlYW4iOmNhc2UibnVtYmVyIjpjYXNlInN0cmluZyI6Y2FzZSJ1bmRlZmluZWQiOnJldHVybiBlO2Nhc2Uib2JqZWN0IjpyZXR1cm4gZTtkZWZhdWx0OnJldHVybiIifX1mdW5jdGlvbiBCXyhlKXt2YXIgdD1lLnR5cGU7cmV0dXJuKGU9ZS5ub2RlTmFtZSkmJmUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJih0PT09ImNoZWNrYm94Inx8dD09PSJyYWRpbyIpfWZ1bmN0aW9uIFUkKGUpe3ZhciB0PUJfKGUpPyJjaGVja2VkIjoidmFsdWUiLG49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSx0KSxyPSIiK2VbdF07aWYoIWUuaGFzT3duUHJvcGVydHkodCkmJnR5cGVvZiBuPCJ1IiYmdHlwZW9mIG4uZ2V0PT0iZnVuY3Rpb24iJiZ0eXBlb2Ygbi5zZXQ9PSJmdW5jdGlvbiIpe3ZhciBpPW4uZ2V0LG89bi5zZXQ7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5jYWxsKHRoaXMpfSxzZXQ6ZnVuY3Rpb24obCl7cj0iIitsLG8uY2FsbCh0aGlzLGwpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6bi5lbnVtZXJhYmxlfSkse2dldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LHNldFZhbHVlOmZ1bmN0aW9uKGwpe3I9IiIrbH0sc3RvcFRyYWNraW5nOmZ1bmN0aW9uKCl7ZS5fdmFsdWVUcmFja2VyPW51bGwsZGVsZXRlIGVbdF19fX19ZnVuY3Rpb24gUXUoZSl7ZS5fdmFsdWVUcmFja2VyfHwoZS5fdmFsdWVUcmFja2VyPVUkKGUpKX1mdW5jdGlvbiBVXyhlKXtpZighZSlyZXR1cm4hMTt2YXIgdD1lLl92YWx1ZVRyYWNrZXI7aWYoIXQpcmV0dXJuITA7dmFyIG49dC5nZXRWYWx1ZSgpLHI9IiI7cmV0dXJuIGUmJihyPUJfKGUpP2UuY2hlY2tlZD8idHJ1ZSI6ImZhbHNlIjplLnZhbHVlKSxlPXIsZSE9PW4/KHQuc2V0VmFsdWUoZSksITApOiExfWZ1bmN0aW9uIFljKGUpe2lmKGU9ZXx8KHR5cGVvZiBkb2N1bWVudDwidSI/ZG9jdW1lbnQ6dm9pZCAwKSx0eXBlb2YgZT4idSIpcmV0dXJuIG51bGw7dHJ5e3JldHVybiBlLmFjdGl2ZUVsZW1lbnR8fGUuYm9keX1jYXRjaHtyZXR1cm4gZS5ib2R5fX1mdW5jdGlvbiBycChlLHQpe3ZhciBuPXQuY2hlY2tlZDtyZXR1cm4gbXQoe30sdCx7ZGVmYXVsdENoZWNrZWQ6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsdmFsdWU6dm9pZCAwLGNoZWNrZWQ6bj8/ZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkfSl9ZnVuY3Rpb24gcHkoZSx0KXt2YXIgbj10LmRlZmF1bHRWYWx1ZT09bnVsbD8iIjp0LmRlZmF1bHRWYWx1ZSxyPXQuY2hlY2tlZCE9bnVsbD90LmNoZWNrZWQ6dC5kZWZhdWx0Q2hlY2tlZDtuPXRvKHQudmFsdWUhPW51bGw/dC52YWx1ZTpuKSxlLl93cmFwcGVyU3RhdGU9e2luaXRpYWxDaGVja2VkOnIsaW5pdGlhbFZhbHVlOm4sY29udHJvbGxlZDp0LnR5cGU9PT0iY2hlY2tib3gifHx0LnR5cGU9PT0icmFkaW8iP3QuY2hlY2tlZCE9bnVsbDp0LnZhbHVlIT1udWxsfX1mdW5jdGlvbiBXXyhlLHQpe3Q9dC5jaGVja2VkLHQhPW51bGwmJnJnKGUsImNoZWNrZWQiLHQsITEpfWZ1bmN0aW9uIGlwKGUsdCl7V18oZSx0KTt2YXIgbj10byh0LnZhbHVlKSxyPXQudHlwZTtpZihuIT1udWxsKXI9PT0ibnVtYmVyIj8obj09PTAmJmUudmFsdWU9PT0iInx8ZS52YWx1ZSE9bikmJihlLnZhbHVlPSIiK24pOmUudmFsdWUhPT0iIituJiYoZS52YWx1ZT0iIituKTtlbHNlIGlmKHI9PT0ic3VibWl0Inx8cj09PSJyZXNldCIpe2UucmVtb3ZlQXR0cmlidXRlKCJ2YWx1ZSIpO3JldHVybn10Lmhhc093blByb3BlcnR5KCJ2YWx1ZSIpP29wKGUsdC50eXBlLG4pOnQuaGFzT3duUHJvcGVydHkoImRlZmF1bHRWYWx1ZSIpJiZvcChlLHQudHlwZSx0byh0LmRlZmF1bHRWYWx1ZSkpLHQuY2hlY2tlZD09bnVsbCYmdC5kZWZhdWx0Q2hlY2tlZCE9bnVsbCYmKGUuZGVmYXVsdENoZWNrZWQ9ISF0LmRlZmF1bHRDaGVja2VkKX1mdW5jdGlvbiBteShlLHQsbil7aWYodC5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKXx8dC5oYXNPd25Qcm9wZXJ0eSgiZGVmYXVsdFZhbHVlIikpe3ZhciByPXQudHlwZTtpZighKHIhPT0ic3VibWl0IiYmciE9PSJyZXNldCJ8fHQudmFsdWUhPT12b2lkIDAmJnQudmFsdWUhPT1udWxsKSlyZXR1cm47dD0iIitlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlLG58fHQ9PT1lLnZhbHVlfHwoZS52YWx1ZT10KSxlLmRlZmF1bHRWYWx1ZT10fW49ZS5uYW1lLG4hPT0iIiYmKGUubmFtZT0iIiksZS5kZWZhdWx0Q2hlY2tlZD0hIWUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZCxuIT09IiImJihlLm5hbWU9bil9ZnVuY3Rpb24gb3AoZSx0LG4peyh0IT09Im51bWJlciJ8fFljKGUub3duZXJEb2N1bWVudCkhPT1lKSYmKG49PW51bGw/ZS5kZWZhdWx0VmFsdWU9IiIrZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZTplLmRlZmF1bHRWYWx1ZSE9PSIiK24mJihlLmRlZmF1bHRWYWx1ZT0iIituKSl9dmFyIHNhPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gV2woZSx0LG4scil7aWYoZT1lLm9wdGlvbnMsdCl7dD17fTtmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKyl0WyIkIituW2ldXT0hMDtmb3Iobj0wO248ZS5sZW5ndGg7bisrKWk9dC5oYXNPd25Qcm9wZXJ0eSgiJCIrZVtuXS52YWx1ZSksZVtuXS5zZWxlY3RlZCE9PWkmJihlW25dLnNlbGVjdGVkPWkpLGkmJnImJihlW25dLmRlZmF1bHRTZWxlY3RlZD0hMCl9ZWxzZXtmb3Iobj0iIit0byhuKSx0PW51bGwsaT0wO2k8ZS5sZW5ndGg7aSsrKXtpZihlW2ldLnZhbHVlPT09bil7ZVtpXS5zZWxlY3RlZD0hMCxyJiYoZVtpXS5kZWZhdWx0U2VsZWN0ZWQ9ITApO3JldHVybn10IT09bnVsbHx8ZVtpXS5kaXNhYmxlZHx8KHQ9ZVtpXSl9dCE9PW51bGwmJih0LnNlbGVjdGVkPSEwKX19ZnVuY3Rpb24gbHAoZSx0KXtpZih0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT1udWxsKXRocm93IEVycm9yKFUoOTEpKTtyZXR1cm4gbXQoe30sdCx7dmFsdWU6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsY2hpbGRyZW46IiIrZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZX0pfWZ1bmN0aW9uIGd5KGUsdCl7dmFyIG49dC52YWx1ZTtpZihuPT1udWxsKXtpZihuPXQuY2hpbGRyZW4sdD10LmRlZmF1bHRWYWx1ZSxuIT1udWxsKXtpZih0IT1udWxsKXRocm93IEVycm9yKFUoOTIpKTtpZihzYShuKSl7aWYoMTxuLmxlbmd0aCl0aHJvdyBFcnJvcihVKDkzKSk7bj1uWzBdfXQ9bn10PT1udWxsJiYodD0iIiksbj10fWUuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbFZhbHVlOnRvKG4pfX1mdW5jdGlvbiBWXyhlLHQpe3ZhciBuPXRvKHQudmFsdWUpLHI9dG8odC5kZWZhdWx0VmFsdWUpO24hPW51bGwmJihuPSIiK24sbiE9PWUudmFsdWUmJihlLnZhbHVlPW4pLHQuZGVmYXVsdFZhbHVlPT1udWxsJiZlLmRlZmF1bHRWYWx1ZSE9PW4mJihlLmRlZmF1bHRWYWx1ZT1uKSksciE9bnVsbCYmKGUuZGVmYXVsdFZhbHVlPSIiK3IpfWZ1bmN0aW9uIHZ5KGUpe3ZhciB0PWUudGV4dENvbnRlbnQ7dD09PWUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUmJnQhPT0iIiYmdCE9PW51bGwmJihlLnZhbHVlPXQpfWZ1bmN0aW9uIEhfKGUpe3N3aXRjaChlKXtjYXNlInN2ZyI6cmV0dXJuImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjtjYXNlIm1hdGgiOnJldHVybiJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIjtkZWZhdWx0OnJldHVybiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIn19ZnVuY3Rpb24gc3AoZSx0KXtyZXR1cm4gZT09bnVsbHx8ZT09PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj9IXyh0KTplPT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiYmdD09PSJmb3JlaWduT2JqZWN0Ij8iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI6ZX12YXIgSnUsS189ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBNU0FwcDwidSImJk1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uP2Z1bmN0aW9uKHQsbixyLGkpe01TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uKCl7cmV0dXJuIGUodCxuLHIsaSl9KX06ZX0oZnVuY3Rpb24oZSx0KXtpZihlLm5hbWVzcGFjZVVSSSE9PSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyJ8fCJpbm5lckhUTUwiaW4gZSllLmlubmVySFRNTD10O2Vsc2V7Zm9yKEp1PUp1fHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxKdS5pbm5lckhUTUw9Ijxzdmc+Iit0LnZhbHVlT2YoKS50b1N0cmluZygpKyI8L3N2Zz4iLHQ9SnUuZmlyc3RDaGlsZDtlLmZpcnN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtmb3IoO3QuZmlyc3RDaGlsZDspZS5hcHBlbmRDaGlsZCh0LmZpcnN0Q2hpbGQpfX0pO2Z1bmN0aW9uIGphKGUsdCl7aWYodCl7dmFyIG49ZS5maXJzdENoaWxkO2lmKG4mJm49PT1lLmxhc3RDaGlsZCYmbi5ub2RlVHlwZT09PTMpe24ubm9kZVZhbHVlPXQ7cmV0dXJufX1lLnRleHRDb250ZW50PXR9dmFyIHBhPXthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxhc3BlY3RSYXRpbzohMCxib3JkZXJJbWFnZU91dHNldDohMCxib3JkZXJJbWFnZVNsaWNlOiEwLGJvcmRlckltYWdlV2lkdGg6ITAsYm94RmxleDohMCxib3hGbGV4R3JvdXA6ITAsYm94T3JkaW5hbEdyb3VwOiEwLGNvbHVtbkNvdW50OiEwLGNvbHVtbnM6ITAsZmxleDohMCxmbGV4R3JvdzohMCxmbGV4UG9zaXRpdmU6ITAsZmxleFNocmluazohMCxmbGV4TmVnYXRpdmU6ITAsZmxleE9yZGVyOiEwLGdyaWRBcmVhOiEwLGdyaWRSb3c6ITAsZ3JpZFJvd0VuZDohMCxncmlkUm93U3BhbjohMCxncmlkUm93U3RhcnQ6ITAsZ3JpZENvbHVtbjohMCxncmlkQ29sdW1uRW5kOiEwLGdyaWRDb2x1bW5TcGFuOiEwLGdyaWRDb2x1bW5TdGFydDohMCxmb250V2VpZ2h0OiEwLGxpbmVDbGFtcDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx0YWJTaXplOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMCxmaWxsT3BhY2l0eTohMCxmbG9vZE9wYWNpdHk6ITAsc3RvcE9wYWNpdHk6ITAsc3Ryb2tlRGFzaGFycmF5OiEwLHN0cm9rZURhc2hvZmZzZXQ6ITAsc3Ryb2tlTWl0ZXJsaW1pdDohMCxzdHJva2VPcGFjaXR5OiEwLHN0cm9rZVdpZHRoOiEwfSxXJD1bIldlYmtpdCIsIm1zIiwiTW96IiwiTyJdO09iamVjdC5rZXlzKHBhKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe1ckLmZvckVhY2goZnVuY3Rpb24odCl7dD10K2UuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zdWJzdHJpbmcoMSkscGFbdF09cGFbZV19KX0pO2Z1bmN0aW9uIFpfKGUsdCxuKXtyZXR1cm4gdD09bnVsbHx8dHlwZW9mIHQ9PSJib29sZWFuInx8dD09PSIiPyIiOm58fHR5cGVvZiB0IT0ibnVtYmVyInx8dD09PTB8fHBhLmhhc093blByb3BlcnR5KGUpJiZwYVtlXT8oIiIrdCkudHJpbSgpOnQrInB4In1mdW5jdGlvbiBHXyhlLHQpe2U9ZS5zdHlsZTtmb3IodmFyIG4gaW4gdClpZih0Lmhhc093blByb3BlcnR5KG4pKXt2YXIgcj1uLmluZGV4T2YoIi0tIik9PT0wLGk9Wl8obix0W25dLHIpO249PT0iZmxvYXQiJiYobj0iY3NzRmxvYXQiKSxyP2Uuc2V0UHJvcGVydHkobixpKTplW25dPWl9fXZhciBWJD1tdCh7bWVudWl0ZW06ITB9LHthcmVhOiEwLGJhc2U6ITAsYnI6ITAsY29sOiEwLGVtYmVkOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxrZXlnZW46ITAsbGluazohMCxtZXRhOiEwLHBhcmFtOiEwLHNvdXJjZTohMCx0cmFjazohMCx3YnI6ITB9KTtmdW5jdGlvbiBhcChlLHQpe2lmKHQpe2lmKFYkW2VdJiYodC5jaGlsZHJlbiE9bnVsbHx8dC5kYW5nZXJvdXNseVNldElubmVySFRNTCE9bnVsbCkpdGhyb3cgRXJyb3IoVSgxMzcsZSkpO2lmKHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwhPW51bGwpe2lmKHQuY2hpbGRyZW4hPW51bGwpdGhyb3cgRXJyb3IoVSg2MCkpO2lmKHR5cGVvZiB0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT0ib2JqZWN0Inx8ISgiX19odG1sImluIHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKXRocm93IEVycm9yKFUoNjEpKX1pZih0LnN0eWxlIT1udWxsJiZ0eXBlb2YgdC5zdHlsZSE9Im9iamVjdCIpdGhyb3cgRXJyb3IoVSg2MikpfX1mdW5jdGlvbiB1cChlLHQpe2lmKGUuaW5kZXhPZigiLSIpPT09LTEpcmV0dXJuIHR5cGVvZiB0LmlzPT0ic3RyaW5nIjtzd2l0Y2goZSl7Y2FzZSJhbm5vdGF0aW9uLXhtbCI6Y2FzZSJjb2xvci1wcm9maWxlIjpjYXNlImZvbnQtZmFjZSI6Y2FzZSJmb250LWZhY2Utc3JjIjpjYXNlImZvbnQtZmFjZS11cmkiOmNhc2UiZm9udC1mYWNlLWZvcm1hdCI6Y2FzZSJmb250LWZhY2UtbmFtZSI6Y2FzZSJtaXNzaW5nLWdseXBoIjpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiEwfX12YXIgY3A9bnVsbDtmdW5jdGlvbiBzZyhlKXtyZXR1cm4gZT1lLnRhcmdldHx8ZS5zcmNFbGVtZW50fHx3aW5kb3csZS5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCYmKGU9ZS5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCksZS5ub2RlVHlwZT09PTM/ZS5wYXJlbnROb2RlOmV9dmFyIGRwPW51bGwsVmw9bnVsbCxIbD1udWxsO2Z1bmN0aW9uIHl5KGUpe2lmKGU9UHUoZSkpe2lmKHR5cGVvZiBkcCE9ImZ1bmN0aW9uIil0aHJvdyBFcnJvcihVKDI4MCkpO3ZhciB0PWUuc3RhdGVOb2RlO3QmJih0PWFmKHQpLGRwKGUuc3RhdGVOb2RlLGUudHlwZSx0KSl9fWZ1bmN0aW9uIFlfKGUpe1ZsP0hsP0hsLnB1c2goZSk6SGw9W2VdOlZsPWV9ZnVuY3Rpb24gWF8oKXtpZihWbCl7dmFyIGU9VmwsdD1IbDtpZihIbD1WbD1udWxsLHl5KGUpLHQpZm9yKGU9MDtlPHQubGVuZ3RoO2UrKyl5eSh0W2VdKX19ZnVuY3Rpb24gUV8oZSx0KXtyZXR1cm4gZSh0KX1mdW5jdGlvbiBKXygpe312YXIgc2g9ITE7ZnVuY3Rpb24gcV8oZSx0LG4pe2lmKHNoKXJldHVybiBlKHQsbik7c2g9ITA7dHJ5e3JldHVybiBRXyhlLHQsbil9ZmluYWxseXtzaD0hMSwoVmwhPT1udWxsfHxIbCE9PW51bGwpJiYoSl8oKSxYXygpKX19ZnVuY3Rpb24gemEoZSx0KXt2YXIgbj1lLnN0YXRlTm9kZTtpZihuPT09bnVsbClyZXR1cm4gbnVsbDt2YXIgcj1hZihuKTtpZihyPT09bnVsbClyZXR1cm4gbnVsbDtuPXJbdF07ZTpzd2l0Y2godCl7Y2FzZSJvbkNsaWNrIjpjYXNlIm9uQ2xpY2tDYXB0dXJlIjpjYXNlIm9uRG91YmxlQ2xpY2siOmNhc2Uib25Eb3VibGVDbGlja0NhcHR1cmUiOmNhc2Uib25Nb3VzZURvd24iOmNhc2Uib25Nb3VzZURvd25DYXB0dXJlIjpjYXNlIm9uTW91c2VNb3ZlIjpjYXNlIm9uTW91c2VNb3ZlQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlVXAiOmNhc2Uib25Nb3VzZVVwQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlRW50ZXIiOihyPSFyLmRpc2FibGVkKXx8KGU9ZS50eXBlLHI9IShlPT09ImJ1dHRvbiJ8fGU9PT0iaW5wdXQifHxlPT09InNlbGVjdCJ8fGU9PT0idGV4dGFyZWEiKSksZT0hcjticmVhayBlO2RlZmF1bHQ6ZT0hMX1pZihlKXJldHVybiBudWxsO2lmKG4mJnR5cGVvZiBuIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFUoMjMxLHQsdHlwZW9mIG4pKTtyZXR1cm4gbn12YXIgZnA9ITE7aWYoZGkpdHJ5e3ZhciBVcz17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVXMsInBhc3NpdmUiLHtnZXQ6ZnVuY3Rpb24oKXtmcD0hMH19KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsVXMsVXMpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixVcyxVcyl9Y2F0Y2h7ZnA9ITF9ZnVuY3Rpb24gSCQoZSx0LG4scixpLG8sbCxzLGEpe3ZhciB1PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywzKTt0cnl7dC5hcHBseShuLHUpfWNhdGNoKGMpe3RoaXMub25FcnJvcihjKX19dmFyIG1hPSExLFhjPW51bGwsUWM9ITEsaHA9bnVsbCxLJD17b25FcnJvcjpmdW5jdGlvbihlKXttYT0hMCxYYz1lfX07ZnVuY3Rpb24gWiQoZSx0LG4scixpLG8sbCxzLGEpe21hPSExLFhjPW51bGwsSCQuYXBwbHkoSyQsYXJndW1lbnRzKX1mdW5jdGlvbiBHJChlLHQsbixyLGksbyxsLHMsYSl7aWYoWiQuYXBwbHkodGhpcyxhcmd1bWVudHMpLG1hKXtpZihtYSl7dmFyIHU9WGM7bWE9ITEsWGM9bnVsbH1lbHNlIHRocm93IEVycm9yKFUoMTk4KSk7UWN8fChRYz0hMCxocD11KX19ZnVuY3Rpb24gb2woZSl7dmFyIHQ9ZSxuPWU7aWYoZS5hbHRlcm5hdGUpZm9yKDt0LnJldHVybjspdD10LnJldHVybjtlbHNle2U9dDtkbyB0PWUsdC5mbGFncyY0MDk4JiYobj10LnJldHVybiksZT10LnJldHVybjt3aGlsZShlKX1yZXR1cm4gdC50YWc9PT0zP246bnVsbH1mdW5jdGlvbiBlMShlKXtpZihlLnRhZz09PTEzKXt2YXIgdD1lLm1lbW9pemVkU3RhdGU7aWYodD09PW51bGwmJihlPWUuYWx0ZXJuYXRlLGUhPT1udWxsJiYodD1lLm1lbW9pemVkU3RhdGUpKSx0IT09bnVsbClyZXR1cm4gdC5kZWh5ZHJhdGVkfXJldHVybiBudWxsfWZ1bmN0aW9uIHh5KGUpe2lmKG9sKGUpIT09ZSl0aHJvdyBFcnJvcihVKDE4OCkpfWZ1bmN0aW9uIFkkKGUpe3ZhciB0PWUuYWx0ZXJuYXRlO2lmKCF0KXtpZih0PW9sKGUpLHQ9PT1udWxsKXRocm93IEVycm9yKFUoMTg4KSk7cmV0dXJuIHQhPT1lP251bGw6ZX1mb3IodmFyIG49ZSxyPXQ7Oyl7dmFyIGk9bi5yZXR1cm47aWYoaT09PW51bGwpYnJlYWs7dmFyIG89aS5hbHRlcm5hdGU7aWYobz09PW51bGwpe2lmKHI9aS5yZXR1cm4sciE9PW51bGwpe249cjtjb250aW51ZX1icmVha31pZihpLmNoaWxkPT09by5jaGlsZCl7Zm9yKG89aS5jaGlsZDtvOyl7aWYobz09PW4pcmV0dXJuIHh5KGkpLGU7aWYobz09PXIpcmV0dXJuIHh5KGkpLHQ7bz1vLnNpYmxpbmd9dGhyb3cgRXJyb3IoVSgxODgpKX1pZihuLnJldHVybiE9PXIucmV0dXJuKW49aSxyPW87ZWxzZXtmb3IodmFyIGw9ITEscz1pLmNoaWxkO3M7KXtpZihzPT09bil7bD0hMCxuPWkscj1vO2JyZWFrfWlmKHM9PT1yKXtsPSEwLHI9aSxuPW87YnJlYWt9cz1zLnNpYmxpbmd9aWYoIWwpe2ZvcihzPW8uY2hpbGQ7czspe2lmKHM9PT1uKXtsPSEwLG49byxyPWk7YnJlYWt9aWYocz09PXIpe2w9ITAscj1vLG49aTticmVha31zPXMuc2libGluZ31pZighbCl0aHJvdyBFcnJvcihVKDE4OSkpfX1pZihuLmFsdGVybmF0ZSE9PXIpdGhyb3cgRXJyb3IoVSgxOTApKX1pZihuLnRhZyE9PTMpdGhyb3cgRXJyb3IoVSgxODgpKTtyZXR1cm4gbi5zdGF0ZU5vZGUuY3VycmVudD09PW4/ZTp0fWZ1bmN0aW9uIHQxKGUpe3JldHVybiBlPVkkKGUpLGUhPT1udWxsP24xKGUpOm51bGx9ZnVuY3Rpb24gbjEoZSl7aWYoZS50YWc9PT01fHxlLnRhZz09PTYpcmV0dXJuIGU7Zm9yKGU9ZS5jaGlsZDtlIT09bnVsbDspe3ZhciB0PW4xKGUpO2lmKHQhPT1udWxsKXJldHVybiB0O2U9ZS5zaWJsaW5nfXJldHVybiBudWxsfXZhciByMT1Cbi51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrLF95PUJuLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrLFgkPUJuLnVuc3RhYmxlX3Nob3VsZFlpZWxkLFEkPUJuLnVuc3RhYmxlX3JlcXVlc3RQYWludCxDdD1Cbi51bnN0YWJsZV9ub3csSiQ9Qm4udW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwsYWc9Qm4udW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHksaTE9Qm4udW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHksSmM9Qm4udW5zdGFibGVfTm9ybWFsUHJpb3JpdHkscSQ9Qm4udW5zdGFibGVfTG93UHJpb3JpdHksbzE9Qm4udW5zdGFibGVfSWRsZVByaW9yaXR5LHJmPW51bGwsenI9bnVsbDtmdW5jdGlvbiBlYihlKXtpZih6ciYmdHlwZW9mIHpyLm9uQ29tbWl0RmliZXJSb290PT0iZnVuY3Rpb24iKXRyeXt6ci5vbkNvbW1pdEZpYmVyUm9vdChyZixlLHZvaWQgMCwoZS5jdXJyZW50LmZsYWdzJjEyOCk9PT0xMjgpfWNhdGNoe319dmFyIHdyPU1hdGguY2x6MzI/TWF0aC5jbHozMjpyYix0Yj1NYXRoLmxvZyxuYj1NYXRoLkxOMjtmdW5jdGlvbiByYihlKXtyZXR1cm4gZT4+Pj0wLGU9PT0wPzMyOjMxLSh0YihlKS9uYnwwKXwwfXZhciBxdT02NCxlYz00MTk0MzA0O2Z1bmN0aW9uIGFhKGUpe3N3aXRjaChlJi1lKXtjYXNlIDE6cmV0dXJuIDE7Y2FzZSAyOnJldHVybiAyO2Nhc2UgNDpyZXR1cm4gNDtjYXNlIDg6cmV0dXJuIDg7Y2FzZSAxNjpyZXR1cm4gMTY7Y2FzZSAzMjpyZXR1cm4gMzI7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpyZXR1cm4gZSY0MTk0MjQwO2Nhc2UgNDE5NDMwNDpjYXNlIDgzODg2MDg6Y2FzZSAxNjc3NzIxNjpjYXNlIDMzNTU0NDMyOmNhc2UgNjcxMDg4NjQ6cmV0dXJuIGUmMTMwMDIzNDI0O2Nhc2UgMTM0MjE3NzI4OnJldHVybiAxMzQyMTc3Mjg7Y2FzZSAyNjg0MzU0NTY6cmV0dXJuIDI2ODQzNTQ1NjtjYXNlIDUzNjg3MDkxMjpyZXR1cm4gNTM2ODcwOTEyO2Nhc2UgMTA3Mzc0MTgyNDpyZXR1cm4gMTA3Mzc0MTgyNDtkZWZhdWx0OnJldHVybiBlfX1mdW5jdGlvbiBxYyhlLHQpe3ZhciBuPWUucGVuZGluZ0xhbmVzO2lmKG49PT0wKXJldHVybiAwO3ZhciByPTAsaT1lLnN1c3BlbmRlZExhbmVzLG89ZS5waW5nZWRMYW5lcyxsPW4mMjY4NDM1NDU1O2lmKGwhPT0wKXt2YXIgcz1sJn5pO3MhPT0wP3I9YWEocyk6KG8mPWwsbyE9PTAmJihyPWFhKG8pKSl9ZWxzZSBsPW4mfmksbCE9PTA/cj1hYShsKTpvIT09MCYmKHI9YWEobykpO2lmKHI9PT0wKXJldHVybiAwO2lmKHQhPT0wJiZ0IT09ciYmISh0JmkpJiYoaT1yJi1yLG89dCYtdCxpPj1vfHxpPT09MTYmJihvJjQxOTQyNDApIT09MCkpcmV0dXJuIHQ7aWYociY0JiYocnw9biYxNiksdD1lLmVudGFuZ2xlZExhbmVzLHQhPT0wKWZvcihlPWUuZW50YW5nbGVtZW50cyx0Jj1yOzA8dDspbj0zMS13cih0KSxpPTE8PG4scnw9ZVtuXSx0Jj1+aTtyZXR1cm4gcn1mdW5jdGlvbiBpYihlLHQpe3N3aXRjaChlKXtjYXNlIDE6Y2FzZSAyOmNhc2UgNDpyZXR1cm4gdCsyNTA7Y2FzZSA4OmNhc2UgMTY6Y2FzZSAzMjpjYXNlIDY0OmNhc2UgMTI4OmNhc2UgMjU2OmNhc2UgNTEyOmNhc2UgMTAyNDpjYXNlIDIwNDg6Y2FzZSA0MDk2OmNhc2UgODE5MjpjYXNlIDE2Mzg0OmNhc2UgMzI3Njg6Y2FzZSA2NTUzNjpjYXNlIDEzMTA3MjpjYXNlIDI2MjE0NDpjYXNlIDUyNDI4ODpjYXNlIDEwNDg1NzY6Y2FzZSAyMDk3MTUyOnJldHVybiB0KzVlMztjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0OnJldHVybi0xO2Nhc2UgMTM0MjE3NzI4OmNhc2UgMjY4NDM1NDU2OmNhc2UgNTM2ODcwOTEyOmNhc2UgMTA3Mzc0MTgyNDpyZXR1cm4tMTtkZWZhdWx0OnJldHVybi0xfX1mdW5jdGlvbiBvYihlLHQpe2Zvcih2YXIgbj1lLnN1c3BlbmRlZExhbmVzLHI9ZS5waW5nZWRMYW5lcyxpPWUuZXhwaXJhdGlvblRpbWVzLG89ZS5wZW5kaW5nTGFuZXM7MDxvOyl7dmFyIGw9MzEtd3Iobykscz0xPDxsLGE9aVtsXTthPT09LTE/KCEocyZuKXx8cyZyKSYmKGlbbF09aWIocyx0KSk6YTw9dCYmKGUuZXhwaXJlZExhbmVzfD1zKSxvJj1+c319ZnVuY3Rpb24gcHAoZSl7cmV0dXJuIGU9ZS5wZW5kaW5nTGFuZXMmLTEwNzM3NDE4MjUsZSE9PTA/ZTplJjEwNzM3NDE4MjQ/MTA3Mzc0MTgyNDowfWZ1bmN0aW9uIGwxKCl7dmFyIGU9cXU7cmV0dXJuIHF1PDw9MSwhKHF1JjQxOTQyNDApJiYocXU9NjQpLGV9ZnVuY3Rpb24gYWgoZSl7Zm9yKHZhciB0PVtdLG49MDszMT5uO24rKyl0LnB1c2goZSk7cmV0dXJuIHR9ZnVuY3Rpb24gUnUoZSx0LG4pe2UucGVuZGluZ0xhbmVzfD10LHQhPT01MzY4NzA5MTImJihlLnN1c3BlbmRlZExhbmVzPTAsZS5waW5nZWRMYW5lcz0wKSxlPWUuZXZlbnRUaW1lcyx0PTMxLXdyKHQpLGVbdF09bn1mdW5jdGlvbiBsYihlLHQpe3ZhciBuPWUucGVuZGluZ0xhbmVzJn50O2UucGVuZGluZ0xhbmVzPXQsZS5zdXNwZW5kZWRMYW5lcz0wLGUucGluZ2VkTGFuZXM9MCxlLmV4cGlyZWRMYW5lcyY9dCxlLm11dGFibGVSZWFkTGFuZXMmPXQsZS5lbnRhbmdsZWRMYW5lcyY9dCx0PWUuZW50YW5nbGVtZW50czt2YXIgcj1lLmV2ZW50VGltZXM7Zm9yKGU9ZS5leHBpcmF0aW9uVGltZXM7MDxuOyl7dmFyIGk9MzEtd3Iobiksbz0xPDxpO3RbaV09MCxyW2ldPS0xLGVbaV09LTEsbiY9fm99fWZ1bmN0aW9uIHVnKGUsdCl7dmFyIG49ZS5lbnRhbmdsZWRMYW5lc3w9dDtmb3IoZT1lLmVudGFuZ2xlbWVudHM7bjspe3ZhciByPTMxLXdyKG4pLGk9MTw8cjtpJnR8ZVtyXSZ0JiYoZVtyXXw9dCksbiY9fml9fXZhciBVZT0wO2Z1bmN0aW9uIHMxKGUpe3JldHVybiBlJj0tZSwxPGU/NDxlP2UmMjY4NDM1NDU1PzE2OjUzNjg3MDkxMjo0OjF9dmFyIGExLGNnLHUxLGMxLGQxLG1wPSExLHRjPVtdLFZpPW51bGwsSGk9bnVsbCxLaT1udWxsLEZhPW5ldyBNYXAsQmE9bmV3IE1hcCxMaT1bXSxzYj0ibW91c2Vkb3duIG1vdXNldXAgdG91Y2hjYW5jZWwgdG91Y2hlbmQgdG91Y2hzdGFydCBhdXhjbGljayBkYmxjbGljayBwb2ludGVyY2FuY2VsIHBvaW50ZXJkb3duIHBvaW50ZXJ1cCBkcmFnZW5kIGRyYWdzdGFydCBkcm9wIGNvbXBvc2l0aW9uZW5kIGNvbXBvc2l0aW9uc3RhcnQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBpbnB1dCB0ZXh0SW5wdXQgY29weSBjdXQgcGFzdGUgY2xpY2sgY2hhbmdlIGNvbnRleHRtZW51IHJlc2V0IHN1Ym1pdCIuc3BsaXQoIiAiKTtmdW5jdGlvbiB3eShlLHQpe3N3aXRjaChlKXtjYXNlImZvY3VzaW4iOmNhc2UiZm9jdXNvdXQiOlZpPW51bGw7YnJlYWs7Y2FzZSJkcmFnZW50ZXIiOmNhc2UiZHJhZ2xlYXZlIjpIaT1udWxsO2JyZWFrO2Nhc2UibW91c2VvdmVyIjpjYXNlIm1vdXNlb3V0IjpLaT1udWxsO2JyZWFrO2Nhc2UicG9pbnRlcm92ZXIiOmNhc2UicG9pbnRlcm91dCI6RmEuZGVsZXRlKHQucG9pbnRlcklkKTticmVhaztjYXNlImdvdHBvaW50ZXJjYXB0dXJlIjpjYXNlImxvc3Rwb2ludGVyY2FwdHVyZSI6QmEuZGVsZXRlKHQucG9pbnRlcklkKX19ZnVuY3Rpb24gV3MoZSx0LG4scixpLG8pe3JldHVybiBlPT09bnVsbHx8ZS5uYXRpdmVFdmVudCE9PW8/KGU9e2Jsb2NrZWRPbjp0LGRvbUV2ZW50TmFtZTpuLGV2ZW50U3lzdGVtRmxhZ3M6cixuYXRpdmVFdmVudDpvLHRhcmdldENvbnRhaW5lcnM6W2ldfSx0IT09bnVsbCYmKHQ9UHUodCksdCE9PW51bGwmJmNnKHQpKSxlKTooZS5ldmVudFN5c3RlbUZsYWdzfD1yLHQ9ZS50YXJnZXRDb250YWluZXJzLGkhPT1udWxsJiZ0LmluZGV4T2YoaSk9PT0tMSYmdC5wdXNoKGkpLGUpfWZ1bmN0aW9uIGFiKGUsdCxuLHIsaSl7c3dpdGNoKHQpe2Nhc2UiZm9jdXNpbiI6cmV0dXJuIFZpPVdzKFZpLGUsdCxuLHIsaSksITA7Y2FzZSJkcmFnZW50ZXIiOnJldHVybiBIaT1XcyhIaSxlLHQsbixyLGkpLCEwO2Nhc2UibW91c2VvdmVyIjpyZXR1cm4gS2k9V3MoS2ksZSx0LG4scixpKSwhMDtjYXNlInBvaW50ZXJvdmVyIjp2YXIgbz1pLnBvaW50ZXJJZDtyZXR1cm4gRmEuc2V0KG8sV3MoRmEuZ2V0KG8pfHxudWxsLGUsdCxuLHIsaSkpLCEwO2Nhc2UiZ290cG9pbnRlcmNhcHR1cmUiOnJldHVybiBvPWkucG9pbnRlcklkLEJhLnNldChvLFdzKEJhLmdldChvKXx8bnVsbCxlLHQsbixyLGkpKSwhMH1yZXR1cm4hMX1mdW5jdGlvbiBmMShlKXt2YXIgdD1PbyhlLnRhcmdldCk7aWYodCE9PW51bGwpe3ZhciBuPW9sKHQpO2lmKG4hPT1udWxsKXtpZih0PW4udGFnLHQ9PT0xMyl7aWYodD1lMShuKSx0IT09bnVsbCl7ZS5ibG9ja2VkT249dCxkMShlLnByaW9yaXR5LGZ1bmN0aW9uKCl7dTEobil9KTtyZXR1cm59fWVsc2UgaWYodD09PTMmJm4uc3RhdGVOb2RlLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpe2UuYmxvY2tlZE9uPW4udGFnPT09Mz9uLnN0YXRlTm9kZS5jb250YWluZXJJbmZvOm51bGw7cmV0dXJufX19ZS5ibG9ja2VkT249bnVsbH1mdW5jdGlvbiBSYyhlKXtpZihlLmJsb2NrZWRPbiE9PW51bGwpcmV0dXJuITE7Zm9yKHZhciB0PWUudGFyZ2V0Q29udGFpbmVyczswPHQubGVuZ3RoOyl7dmFyIG49Z3AoZS5kb21FdmVudE5hbWUsZS5ldmVudFN5c3RlbUZsYWdzLHRbMF0sZS5uYXRpdmVFdmVudCk7aWYobj09PW51bGwpe249ZS5uYXRpdmVFdmVudDt2YXIgcj1uZXcgbi5jb25zdHJ1Y3RvcihuLnR5cGUsbik7Y3A9cixuLnRhcmdldC5kaXNwYXRjaEV2ZW50KHIpLGNwPW51bGx9ZWxzZSByZXR1cm4gdD1QdShuKSx0IT09bnVsbCYmY2codCksZS5ibG9ja2VkT249biwhMTt0LnNoaWZ0KCl9cmV0dXJuITB9ZnVuY3Rpb24gU3koZSx0LG4pe1JjKGUpJiZuLmRlbGV0ZSh0KX1mdW5jdGlvbiB1Yigpe21wPSExLFZpIT09bnVsbCYmUmMoVmkpJiYoVmk9bnVsbCksSGkhPT1udWxsJiZSYyhIaSkmJihIaT1udWxsKSxLaSE9PW51bGwmJlJjKEtpKSYmKEtpPW51bGwpLEZhLmZvckVhY2goU3kpLEJhLmZvckVhY2goU3kpfWZ1bmN0aW9uIFZzKGUsdCl7ZS5ibG9ja2VkT249PT10JiYoZS5ibG9ja2VkT249bnVsbCxtcHx8KG1wPSEwLEJuLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soQm4udW5zdGFibGVfTm9ybWFsUHJpb3JpdHksdWIpKSl9ZnVuY3Rpb24gVWEoZSl7ZnVuY3Rpb24gdChpKXtyZXR1cm4gVnMoaSxlKX1pZigwPHRjLmxlbmd0aCl7VnModGNbMF0sZSk7Zm9yKHZhciBuPTE7bjx0Yy5sZW5ndGg7bisrKXt2YXIgcj10Y1tuXTtyLmJsb2NrZWRPbj09PWUmJihyLmJsb2NrZWRPbj1udWxsKX19Zm9yKFZpIT09bnVsbCYmVnMoVmksZSksSGkhPT1udWxsJiZWcyhIaSxlKSxLaSE9PW51bGwmJlZzKEtpLGUpLEZhLmZvckVhY2godCksQmEuZm9yRWFjaCh0KSxuPTA7bjxMaS5sZW5ndGg7bisrKXI9TGlbbl0sci5ibG9ja2VkT249PT1lJiYoci5ibG9ja2VkT249bnVsbCk7Zm9yKDswPExpLmxlbmd0aCYmKG49TGlbMF0sbi5ibG9ja2VkT249PT1udWxsKTspZjEobiksbi5ibG9ja2VkT249PT1udWxsJiZMaS5zaGlmdCgpfXZhciBLbD14aS5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxlZD0hMDtmdW5jdGlvbiBjYihlLHQsbixyKXt2YXIgaT1VZSxvPUtsLnRyYW5zaXRpb247S2wudHJhbnNpdGlvbj1udWxsO3RyeXtVZT0xLGRnKGUsdCxuLHIpfWZpbmFsbHl7VWU9aSxLbC50cmFuc2l0aW9uPW99fWZ1bmN0aW9uIGRiKGUsdCxuLHIpe3ZhciBpPVVlLG89S2wudHJhbnNpdGlvbjtLbC50cmFuc2l0aW9uPW51bGw7dHJ5e1VlPTQsZGcoZSx0LG4scil9ZmluYWxseXtVZT1pLEtsLnRyYW5zaXRpb249b319ZnVuY3Rpb24gZGcoZSx0LG4scil7aWYoZWQpe3ZhciBpPWdwKGUsdCxuLHIpO2lmKGk9PT1udWxsKXloKGUsdCxyLHRkLG4pLHd5KGUscik7ZWxzZSBpZihhYihpLGUsdCxuLHIpKXIuc3RvcFByb3BhZ2F0aW9uKCk7ZWxzZSBpZih3eShlLHIpLHQmNCYmLTE8c2IuaW5kZXhPZihlKSl7Zm9yKDtpIT09bnVsbDspe3ZhciBvPVB1KGkpO2lmKG8hPT1udWxsJiZhMShvKSxvPWdwKGUsdCxuLHIpLG89PT1udWxsJiZ5aChlLHQscix0ZCxuKSxvPT09aSlicmVhaztpPW99aSE9PW51bGwmJnIuc3RvcFByb3BhZ2F0aW9uKCl9ZWxzZSB5aChlLHQscixudWxsLG4pfX12YXIgdGQ9bnVsbDtmdW5jdGlvbiBncChlLHQsbixyKXtpZih0ZD1udWxsLGU9c2cociksZT1PbyhlKSxlIT09bnVsbClpZih0PW9sKGUpLHQ9PT1udWxsKWU9bnVsbDtlbHNlIGlmKG49dC50YWcsbj09PTEzKXtpZihlPWUxKHQpLGUhPT1udWxsKXJldHVybiBlO2U9bnVsbH1lbHNlIGlmKG49PT0zKXtpZih0LnN0YXRlTm9kZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXJldHVybiB0LnRhZz09PTM/dC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzpudWxsO2U9bnVsbH1lbHNlIHQhPT1lJiYoZT1udWxsKTtyZXR1cm4gdGQ9ZSxudWxsfWZ1bmN0aW9uIGgxKGUpe3N3aXRjaChlKXtjYXNlImNhbmNlbCI6Y2FzZSJjbGljayI6Y2FzZSJjbG9zZSI6Y2FzZSJjb250ZXh0bWVudSI6Y2FzZSJjb3B5IjpjYXNlImN1dCI6Y2FzZSJhdXhjbGljayI6Y2FzZSJkYmxjbGljayI6Y2FzZSJkcmFnZW5kIjpjYXNlImRyYWdzdGFydCI6Y2FzZSJkcm9wIjpjYXNlImZvY3VzaW4iOmNhc2UiZm9jdXNvdXQiOmNhc2UiaW5wdXQiOmNhc2UiaW52YWxpZCI6Y2FzZSJrZXlkb3duIjpjYXNlImtleXByZXNzIjpjYXNlImtleXVwIjpjYXNlIm1vdXNlZG93biI6Y2FzZSJtb3VzZXVwIjpjYXNlInBhc3RlIjpjYXNlInBhdXNlIjpjYXNlInBsYXkiOmNhc2UicG9pbnRlcmNhbmNlbCI6Y2FzZSJwb2ludGVyZG93biI6Y2FzZSJwb2ludGVydXAiOmNhc2UicmF0ZWNoYW5nZSI6Y2FzZSJyZXNldCI6Y2FzZSJyZXNpemUiOmNhc2Uic2Vla2VkIjpjYXNlInN1Ym1pdCI6Y2FzZSJ0b3VjaGNhbmNlbCI6Y2FzZSJ0b3VjaGVuZCI6Y2FzZSJ0b3VjaHN0YXJ0IjpjYXNlInZvbHVtZWNoYW5nZSI6Y2FzZSJjaGFuZ2UiOmNhc2Uic2VsZWN0aW9uY2hhbmdlIjpjYXNlInRleHRJbnB1dCI6Y2FzZSJjb21wb3NpdGlvbnN0YXJ0IjpjYXNlImNvbXBvc2l0aW9uZW5kIjpjYXNlImNvbXBvc2l0aW9udXBkYXRlIjpjYXNlImJlZm9yZWJsdXIiOmNhc2UiYWZ0ZXJibHVyIjpjYXNlImJlZm9yZWlucHV0IjpjYXNlImJsdXIiOmNhc2UiZnVsbHNjcmVlbmNoYW5nZSI6Y2FzZSJmb2N1cyI6Y2FzZSJoYXNoY2hhbmdlIjpjYXNlInBvcHN0YXRlIjpjYXNlInNlbGVjdCI6Y2FzZSJzZWxlY3RzdGFydCI6cmV0dXJuIDE7Y2FzZSJkcmFnIjpjYXNlImRyYWdlbnRlciI6Y2FzZSJkcmFnZXhpdCI6Y2FzZSJkcmFnbGVhdmUiOmNhc2UiZHJhZ292ZXIiOmNhc2UibW91c2Vtb3ZlIjpjYXNlIm1vdXNlb3V0IjpjYXNlIm1vdXNlb3ZlciI6Y2FzZSJwb2ludGVybW92ZSI6Y2FzZSJwb2ludGVyb3V0IjpjYXNlInBvaW50ZXJvdmVyIjpjYXNlInNjcm9sbCI6Y2FzZSJ0b2dnbGUiOmNhc2UidG91Y2htb3ZlIjpjYXNlIndoZWVsIjpjYXNlIm1vdXNlZW50ZXIiOmNhc2UibW91c2VsZWF2ZSI6Y2FzZSJwb2ludGVyZW50ZXIiOmNhc2UicG9pbnRlcmxlYXZlIjpyZXR1cm4gNDtjYXNlIm1lc3NhZ2UiOnN3aXRjaChKJCgpKXtjYXNlIGFnOnJldHVybiAxO2Nhc2UgaTE6cmV0dXJuIDQ7Y2FzZSBKYzpjYXNlIHEkOnJldHVybiAxNjtjYXNlIG8xOnJldHVybiA1MzY4NzA5MTI7ZGVmYXVsdDpyZXR1cm4gMTZ9ZGVmYXVsdDpyZXR1cm4gMTZ9fXZhciBGaT1udWxsLGZnPW51bGwsT2M9bnVsbDtmdW5jdGlvbiBwMSgpe2lmKE9jKXJldHVybiBPYzt2YXIgZSx0PWZnLG49dC5sZW5ndGgscixpPSJ2YWx1ZSJpbiBGaT9GaS52YWx1ZTpGaS50ZXh0Q29udGVudCxvPWkubGVuZ3RoO2ZvcihlPTA7ZTxuJiZ0W2VdPT09aVtlXTtlKyspO3ZhciBsPW4tZTtmb3Iocj0xO3I8PWwmJnRbbi1yXT09PWlbby1yXTtyKyspO3JldHVybiBPYz1pLnNsaWNlKGUsMTxyPzEtcjp2b2lkIDApfWZ1bmN0aW9uIFBjKGUpe3ZhciB0PWUua2V5Q29kZTtyZXR1cm4iY2hhckNvZGUiaW4gZT8oZT1lLmNoYXJDb2RlLGU9PT0wJiZ0PT09MTMmJihlPTEzKSk6ZT10LGU9PT0xMCYmKGU9MTMpLDMyPD1lfHxlPT09MTM/ZTowfWZ1bmN0aW9uIG5jKCl7cmV0dXJuITB9ZnVuY3Rpb24gRXkoKXtyZXR1cm4hMX1mdW5jdGlvbiBIbihlKXtmdW5jdGlvbiB0KG4scixpLG8sbCl7dGhpcy5fcmVhY3ROYW1lPW4sdGhpcy5fdGFyZ2V0SW5zdD1pLHRoaXMudHlwZT1yLHRoaXMubmF0aXZlRXZlbnQ9byx0aGlzLnRhcmdldD1sLHRoaXMuY3VycmVudFRhcmdldD1udWxsO2Zvcih2YXIgcyBpbiBlKWUuaGFzT3duUHJvcGVydHkocykmJihuPWVbc10sdGhpc1tzXT1uP24obyk6b1tzXSk7cmV0dXJuIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPShvLmRlZmF1bHRQcmV2ZW50ZWQhPW51bGw/by5kZWZhdWx0UHJldmVudGVkOm8ucmV0dXJuVmFsdWU9PT0hMSk/bmM6RXksdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1FeSx0aGlzfXJldHVybiBtdCh0LnByb3RvdHlwZSx7cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITA7dmFyIG49dGhpcy5uYXRpdmVFdmVudDtuJiYobi5wcmV2ZW50RGVmYXVsdD9uLnByZXZlbnREZWZhdWx0KCk6dHlwZW9mIG4ucmV0dXJuVmFsdWUhPSJ1bmtub3duIiYmKG4ucmV0dXJuVmFsdWU9ITEpLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPW5jKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIG49dGhpcy5uYXRpdmVFdmVudDtuJiYobi5zdG9wUHJvcGFnYXRpb24/bi5zdG9wUHJvcGFnYXRpb24oKTp0eXBlb2Ygbi5jYW5jZWxCdWJibGUhPSJ1bmtub3duIiYmKG4uY2FuY2VsQnViYmxlPSEwKSx0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPW5jKX0scGVyc2lzdDpmdW5jdGlvbigpe30saXNQZXJzaXN0ZW50Om5jfSksdH12YXIgX3M9e2V2ZW50UGhhc2U6MCxidWJibGVzOjAsY2FuY2VsYWJsZTowLHRpbWVTdGFtcDpmdW5jdGlvbihlKXtyZXR1cm4gZS50aW1lU3RhbXB8fERhdGUubm93KCl9LGRlZmF1bHRQcmV2ZW50ZWQ6MCxpc1RydXN0ZWQ6MH0saGc9SG4oX3MpLE91PW10KHt9LF9zLHt2aWV3OjAsZGV0YWlsOjB9KSxmYj1IbihPdSksdWgsY2gsSHMsb2Y9bXQoe30sT3Use3NjcmVlblg6MCxzY3JlZW5ZOjAsY2xpZW50WDowLGNsaWVudFk6MCxwYWdlWDowLHBhZ2VZOjAsY3RybEtleTowLHNoaWZ0S2V5OjAsYWx0S2V5OjAsbWV0YUtleTowLGdldE1vZGlmaWVyU3RhdGU6cGcsYnV0dG9uOjAsYnV0dG9uczowLHJlbGF0ZWRUYXJnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVsYXRlZFRhcmdldD09PXZvaWQgMD9lLmZyb21FbGVtZW50PT09ZS5zcmNFbGVtZW50P2UudG9FbGVtZW50OmUuZnJvbUVsZW1lbnQ6ZS5yZWxhdGVkVGFyZ2V0fSxtb3ZlbWVudFg6ZnVuY3Rpb24oZSl7cmV0dXJuIm1vdmVtZW50WCJpbiBlP2UubW92ZW1lbnRYOihlIT09SHMmJihIcyYmZS50eXBlPT09Im1vdXNlbW92ZSI/KHVoPWUuc2NyZWVuWC1Icy5zY3JlZW5YLGNoPWUuc2NyZWVuWS1Icy5zY3JlZW5ZKTpjaD11aD0wLEhzPWUpLHVoKX0sbW92ZW1lbnRZOmZ1bmN0aW9uKGUpe3JldHVybiJtb3ZlbWVudFkiaW4gZT9lLm1vdmVtZW50WTpjaH19KSxDeT1IbihvZiksaGI9bXQoe30sb2Yse2RhdGFUcmFuc2ZlcjowfSkscGI9SG4oaGIpLG1iPW10KHt9LE91LHtyZWxhdGVkVGFyZ2V0OjB9KSxkaD1IbihtYiksZ2I9bXQoe30sX3Mse2FuaW1hdGlvbk5hbWU6MCxlbGFwc2VkVGltZTowLHBzZXVkb0VsZW1lbnQ6MH0pLHZiPUhuKGdiKSx5Yj1tdCh7fSxfcyx7Y2xpcGJvYXJkRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4iY2xpcGJvYXJkRGF0YSJpbiBlP2UuY2xpcGJvYXJkRGF0YTp3aW5kb3cuY2xpcGJvYXJkRGF0YX19KSx4Yj1Ibih5YiksX2I9bXQoe30sX3Mse2RhdGE6MH0pLGt5PUhuKF9iKSx3Yj17RXNjOiJFc2NhcGUiLFNwYWNlYmFyOiIgIixMZWZ0OiJBcnJvd0xlZnQiLFVwOiJBcnJvd1VwIixSaWdodDoiQXJyb3dSaWdodCIsRG93bjoiQXJyb3dEb3duIixEZWw6IkRlbGV0ZSIsV2luOiJPUyIsTWVudToiQ29udGV4dE1lbnUiLEFwcHM6IkNvbnRleHRNZW51IixTY3JvbGw6IlNjcm9sbExvY2siLE1velByaW50YWJsZUtleToiVW5pZGVudGlmaWVkIn0sU2I9ezg6IkJhY2tzcGFjZSIsOToiVGFiIiwxMjoiQ2xlYXIiLDEzOiJFbnRlciIsMTY6IlNoaWZ0IiwxNzoiQ29udHJvbCIsMTg6IkFsdCIsMTk6IlBhdXNlIiwyMDoiQ2Fwc0xvY2siLDI3OiJFc2NhcGUiLDMyOiIgIiwzMzoiUGFnZVVwIiwzNDoiUGFnZURvd24iLDM1OiJFbmQiLDM2OiJIb21lIiwzNzoiQXJyb3dMZWZ0IiwzODoiQXJyb3dVcCIsMzk6IkFycm93UmlnaHQiLDQwOiJBcnJvd0Rvd24iLDQ1OiJJbnNlcnQiLDQ2OiJEZWxldGUiLDExMjoiRjEiLDExMzoiRjIiLDExNDoiRjMiLDExNToiRjQiLDExNjoiRjUiLDExNzoiRjYiLDExODoiRjciLDExOToiRjgiLDEyMDoiRjkiLDEyMToiRjEwIiwxMjI6IkYxMSIsMTIzOiJGMTIiLDE0NDoiTnVtTG9jayIsMTQ1OiJTY3JvbGxMb2NrIiwyMjQ6Ik1ldGEifSxFYj17QWx0OiJhbHRLZXkiLENvbnRyb2w6ImN0cmxLZXkiLE1ldGE6Im1ldGFLZXkiLFNoaWZ0OiJzaGlmdEtleSJ9O2Z1bmN0aW9uIENiKGUpe3ZhciB0PXRoaXMubmF0aXZlRXZlbnQ7cmV0dXJuIHQuZ2V0TW9kaWZpZXJTdGF0ZT90LmdldE1vZGlmaWVyU3RhdGUoZSk6KGU9RWJbZV0pPyEhdFtlXTohMX1mdW5jdGlvbiBwZygpe3JldHVybiBDYn12YXIga2I9bXQoe30sT3Use2tleTpmdW5jdGlvbihlKXtpZihlLmtleSl7dmFyIHQ9d2JbZS5rZXldfHxlLmtleTtpZih0IT09IlVuaWRlbnRpZmllZCIpcmV0dXJuIHR9cmV0dXJuIGUudHlwZT09PSJrZXlwcmVzcyI/KGU9UGMoZSksZT09PTEzPyJFbnRlciI6U3RyaW5nLmZyb21DaGFyQ29kZShlKSk6ZS50eXBlPT09ImtleWRvd24ifHxlLnR5cGU9PT0ia2V5dXAiP1NiW2Uua2V5Q29kZV18fCJVbmlkZW50aWZpZWQiOiIifSxjb2RlOjAsbG9jYXRpb246MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxhbHRLZXk6MCxtZXRhS2V5OjAscmVwZWF0OjAsbG9jYWxlOjAsZ2V0TW9kaWZpZXJTdGF0ZTpwZyxjaGFyQ29kZTpmdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT09ImtleXByZXNzIj9QYyhlKTowfSxrZXlDb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PT0ia2V5ZG93biJ8fGUudHlwZT09PSJrZXl1cCI/ZS5rZXlDb2RlOjB9LHdoaWNoOmZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PT0ia2V5cHJlc3MiP1BjKGUpOmUudHlwZT09PSJrZXlkb3duInx8ZS50eXBlPT09ImtleXVwIj9lLmtleUNvZGU6MH19KSwkYj1IbihrYiksYmI9bXQoe30sb2Yse3BvaW50ZXJJZDowLHdpZHRoOjAsaGVpZ2h0OjAscHJlc3N1cmU6MCx0YW5nZW50aWFsUHJlc3N1cmU6MCx0aWx0WDowLHRpbHRZOjAsdHdpc3Q6MCxwb2ludGVyVHlwZTowLGlzUHJpbWFyeTowfSksJHk9SG4oYmIpLFRiPW10KHt9LE91LHt0b3VjaGVzOjAsdGFyZ2V0VG91Y2hlczowLGNoYW5nZWRUb3VjaGVzOjAsYWx0S2V5OjAsbWV0YUtleTowLGN0cmxLZXk6MCxzaGlmdEtleTowLGdldE1vZGlmaWVyU3RhdGU6cGd9KSxOYj1IbihUYiksUmI9bXQoe30sX3Mse3Byb3BlcnR5TmFtZTowLGVsYXBzZWRUaW1lOjAscHNldWRvRWxlbWVudDowfSksT2I9SG4oUmIpLFBiPW10KHt9LG9mLHtkZWx0YVg6ZnVuY3Rpb24oZSl7cmV0dXJuImRlbHRhWCJpbiBlP2UuZGVsdGFYOiJ3aGVlbERlbHRhWCJpbiBlPy1lLndoZWVsRGVsdGFYOjB9LGRlbHRhWTpmdW5jdGlvbihlKXtyZXR1cm4iZGVsdGFZImluIGU/ZS5kZWx0YVk6IndoZWVsRGVsdGFZImluIGU/LWUud2hlZWxEZWx0YVk6IndoZWVsRGVsdGEiaW4gZT8tZS53aGVlbERlbHRhOjB9LGRlbHRhWjowLGRlbHRhTW9kZTowfSksQWI9SG4oUGIpLE1iPVs5LDEzLDI3LDMyXSxtZz1kaSYmIkNvbXBvc2l0aW9uRXZlbnQiaW4gd2luZG93LGdhPW51bGw7ZGkmJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQmJihnYT1kb2N1bWVudC5kb2N1bWVudE1vZGUpO3ZhciBEYj1kaSYmIlRleHRFdmVudCJpbiB3aW5kb3cmJiFnYSxtMT1kaSYmKCFtZ3x8Z2EmJjg8Z2EmJjExPj1nYSksYnk9IiAiLFR5PSExO2Z1bmN0aW9uIGcxKGUsdCl7c3dpdGNoKGUpe2Nhc2Uia2V5dXAiOnJldHVybiBNYi5pbmRleE9mKHQua2V5Q29kZSkhPT0tMTtjYXNlImtleWRvd24iOnJldHVybiB0LmtleUNvZGUhPT0yMjk7Y2FzZSJrZXlwcmVzcyI6Y2FzZSJtb3VzZWRvd24iOmNhc2UiZm9jdXNvdXQiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIHYxKGUpe3JldHVybiBlPWUuZGV0YWlsLHR5cGVvZiBlPT0ib2JqZWN0IiYmImRhdGEiaW4gZT9lLmRhdGE6bnVsbH12YXIgTmw9ITE7ZnVuY3Rpb24gTGIoZSx0KXtzd2l0Y2goZSl7Y2FzZSJjb21wb3NpdGlvbmVuZCI6cmV0dXJuIHYxKHQpO2Nhc2Uia2V5cHJlc3MiOnJldHVybiB0LndoaWNoIT09MzI/bnVsbDooVHk9ITAsYnkpO2Nhc2UidGV4dElucHV0IjpyZXR1cm4gZT10LmRhdGEsZT09PWJ5JiZUeT9udWxsOmU7ZGVmYXVsdDpyZXR1cm4gbnVsbH19ZnVuY3Rpb24gSWIoZSx0KXtpZihObClyZXR1cm4gZT09PSJjb21wb3NpdGlvbmVuZCJ8fCFtZyYmZzEoZSx0KT8oZT1wMSgpLE9jPWZnPUZpPW51bGwsTmw9ITEsZSk6bnVsbDtzd2l0Y2goZSl7Y2FzZSJwYXN0ZSI6cmV0dXJuIG51bGw7Y2FzZSJrZXlwcmVzcyI6aWYoISh0LmN0cmxLZXl8fHQuYWx0S2V5fHx0Lm1ldGFLZXkpfHx0LmN0cmxLZXkmJnQuYWx0S2V5KXtpZih0LmNoYXImJjE8dC5jaGFyLmxlbmd0aClyZXR1cm4gdC5jaGFyO2lmKHQud2hpY2gpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodC53aGljaCl9cmV0dXJuIG51bGw7Y2FzZSJjb21wb3NpdGlvbmVuZCI6cmV0dXJuIG0xJiZ0LmxvY2FsZSE9PSJrbyI/bnVsbDp0LmRhdGE7ZGVmYXVsdDpyZXR1cm4gbnVsbH19dmFyIGpiPXtjb2xvcjohMCxkYXRlOiEwLGRhdGV0aW1lOiEwLCJkYXRldGltZS1sb2NhbCI6ITAsZW1haWw6ITAsbW9udGg6ITAsbnVtYmVyOiEwLHBhc3N3b3JkOiEwLHJhbmdlOiEwLHNlYXJjaDohMCx0ZWw6ITAsdGV4dDohMCx0aW1lOiEwLHVybDohMCx3ZWVrOiEwfTtmdW5jdGlvbiBOeShlKXt2YXIgdD1lJiZlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHQ9PT0iaW5wdXQiPyEhamJbZS50eXBlXTp0PT09InRleHRhcmVhIn1mdW5jdGlvbiB5MShlLHQsbixyKXtZXyhyKSx0PW5kKHQsIm9uQ2hhbmdlIiksMDx0Lmxlbmd0aCYmKG49bmV3IGhnKCJvbkNoYW5nZSIsImNoYW5nZSIsbnVsbCxuLHIpLGUucHVzaCh7ZXZlbnQ6bixsaXN0ZW5lcnM6dH0pKX12YXIgdmE9bnVsbCxXYT1udWxsO2Z1bmN0aW9uIHpiKGUpe04xKGUsMCl9ZnVuY3Rpb24gbGYoZSl7dmFyIHQ9UGwoZSk7aWYoVV8odCkpcmV0dXJuIGV9ZnVuY3Rpb24gRmIoZSx0KXtpZihlPT09ImNoYW5nZSIpcmV0dXJuIHR9dmFyIHgxPSExO2lmKGRpKXt2YXIgZmg7aWYoZGkpe3ZhciBoaD0ib25pbnB1dCJpbiBkb2N1bWVudDtpZighaGgpe3ZhciBSeT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtSeS5zZXRBdHRyaWJ1dGUoIm9uaW5wdXQiLCJyZXR1cm47IiksaGg9dHlwZW9mIFJ5Lm9uaW5wdXQ9PSJmdW5jdGlvbiJ9Zmg9aGh9ZWxzZSBmaD0hMTt4MT1maCYmKCFkb2N1bWVudC5kb2N1bWVudE1vZGV8fDk8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlKX1mdW5jdGlvbiBPeSgpe3ZhJiYodmEuZGV0YWNoRXZlbnQoIm9ucHJvcGVydHljaGFuZ2UiLF8xKSxXYT12YT1udWxsKX1mdW5jdGlvbiBfMShlKXtpZihlLnByb3BlcnR5TmFtZT09PSJ2YWx1ZSImJmxmKFdhKSl7dmFyIHQ9W107eTEodCxXYSxlLHNnKGUpKSxxXyh6Yix0KX19ZnVuY3Rpb24gQmIoZSx0LG4pe2U9PT0iZm9jdXNpbiI/KE95KCksdmE9dCxXYT1uLHZhLmF0dGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIixfMSkpOmU9PT0iZm9jdXNvdXQiJiZPeSgpfWZ1bmN0aW9uIFViKGUpe2lmKGU9PT0ic2VsZWN0aW9uY2hhbmdlInx8ZT09PSJrZXl1cCJ8fGU9PT0ia2V5ZG93biIpcmV0dXJuIGxmKFdhKX1mdW5jdGlvbiBXYihlLHQpe2lmKGU9PT0iY2xpY2siKXJldHVybiBsZih0KX1mdW5jdGlvbiBWYihlLHQpe2lmKGU9PT0iaW5wdXQifHxlPT09ImNoYW5nZSIpcmV0dXJuIGxmKHQpfWZ1bmN0aW9uIEhiKGUsdCl7cmV0dXJuIGU9PT10JiYoZSE9PTB8fDEvZT09PTEvdCl8fGUhPT1lJiZ0IT09dH12YXIga3I9dHlwZW9mIE9iamVjdC5pcz09ImZ1bmN0aW9uIj9PYmplY3QuaXM6SGI7ZnVuY3Rpb24gVmEoZSx0KXtpZihrcihlLHQpKXJldHVybiEwO2lmKHR5cGVvZiBlIT0ib2JqZWN0Inx8ZT09PW51bGx8fHR5cGVvZiB0IT0ib2JqZWN0Inx8dD09PW51bGwpcmV0dXJuITE7dmFyIG49T2JqZWN0LmtleXMoZSkscj1PYmplY3Qua2V5cyh0KTtpZihuLmxlbmd0aCE9PXIubGVuZ3RoKXJldHVybiExO2ZvcihyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBpPW5bcl07aWYoIUpoLmNhbGwodCxpKXx8IWtyKGVbaV0sdFtpXSkpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gUHkoZSl7Zm9yKDtlJiZlLmZpcnN0Q2hpbGQ7KWU9ZS5maXJzdENoaWxkO3JldHVybiBlfWZ1bmN0aW9uIEF5KGUsdCl7dmFyIG49UHkoZSk7ZT0wO2Zvcih2YXIgcjtuOyl7aWYobi5ub2RlVHlwZT09PTMpe2lmKHI9ZStuLnRleHRDb250ZW50Lmxlbmd0aCxlPD10JiZyPj10KXJldHVybntub2RlOm4sb2Zmc2V0OnQtZX07ZT1yfWU6e2Zvcig7bjspe2lmKG4ubmV4dFNpYmxpbmcpe249bi5uZXh0U2libGluZzticmVhayBlfW49bi5wYXJlbnROb2RlfW49dm9pZCAwfW49UHkobil9fWZ1bmN0aW9uIHcxKGUsdCl7cmV0dXJuIGUmJnQ/ZT09PXQ/ITA6ZSYmZS5ub2RlVHlwZT09PTM/ITE6dCYmdC5ub2RlVHlwZT09PTM/dzEoZSx0LnBhcmVudE5vZGUpOiJjb250YWlucyJpbiBlP2UuY29udGFpbnModCk6ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8hIShlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpJjE2KTohMTohMX1mdW5jdGlvbiBTMSgpe2Zvcih2YXIgZT13aW5kb3csdD1ZYygpO3QgaW5zdGFuY2VvZiBlLkhUTUxJRnJhbWVFbGVtZW50Oyl7dHJ5e3ZhciBuPXR5cGVvZiB0LmNvbnRlbnRXaW5kb3cubG9jYXRpb24uaHJlZj09InN0cmluZyJ9Y2F0Y2h7bj0hMX1pZihuKWU9dC5jb250ZW50V2luZG93O2Vsc2UgYnJlYWs7dD1ZYyhlLmRvY3VtZW50KX1yZXR1cm4gdH1mdW5jdGlvbiBnZyhlKXt2YXIgdD1lJiZlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHQmJih0PT09ImlucHV0IiYmKGUudHlwZT09PSJ0ZXh0Inx8ZS50eXBlPT09InNlYXJjaCJ8fGUudHlwZT09PSJ0ZWwifHxlLnR5cGU9PT0idXJsInx8ZS50eXBlPT09InBhc3N3b3JkIil8fHQ9PT0idGV4dGFyZWEifHxlLmNvbnRlbnRFZGl0YWJsZT09PSJ0cnVlIil9ZnVuY3Rpb24gS2IoZSl7dmFyIHQ9UzEoKSxuPWUuZm9jdXNlZEVsZW0scj1lLnNlbGVjdGlvblJhbmdlO2lmKHQhPT1uJiZuJiZuLm93bmVyRG9jdW1lbnQmJncxKG4ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbikpe2lmKHIhPT1udWxsJiZnZyhuKSl7aWYodD1yLnN0YXJ0LGU9ci5lbmQsZT09PXZvaWQgMCYmKGU9dCksInNlbGVjdGlvblN0YXJ0ImluIG4pbi5zZWxlY3Rpb25TdGFydD10LG4uc2VsZWN0aW9uRW5kPU1hdGgubWluKGUsbi52YWx1ZS5sZW5ndGgpO2Vsc2UgaWYoZT0odD1uLm93bmVyRG9jdW1lbnR8fGRvY3VtZW50KSYmdC5kZWZhdWx0Vmlld3x8d2luZG93LGUuZ2V0U2VsZWN0aW9uKXtlPWUuZ2V0U2VsZWN0aW9uKCk7dmFyIGk9bi50ZXh0Q29udGVudC5sZW5ndGgsbz1NYXRoLm1pbihyLnN0YXJ0LGkpO3I9ci5lbmQ9PT12b2lkIDA/bzpNYXRoLm1pbihyLmVuZCxpKSwhZS5leHRlbmQmJm8+ciYmKGk9cixyPW8sbz1pKSxpPUF5KG4sbyk7dmFyIGw9QXkobixyKTtpJiZsJiYoZS5yYW5nZUNvdW50IT09MXx8ZS5hbmNob3JOb2RlIT09aS5ub2RlfHxlLmFuY2hvck9mZnNldCE9PWkub2Zmc2V0fHxlLmZvY3VzTm9kZSE9PWwubm9kZXx8ZS5mb2N1c09mZnNldCE9PWwub2Zmc2V0KSYmKHQ9dC5jcmVhdGVSYW5nZSgpLHQuc2V0U3RhcnQoaS5ub2RlLGkub2Zmc2V0KSxlLnJlbW92ZUFsbFJhbmdlcygpLG8+cj8oZS5hZGRSYW5nZSh0KSxlLmV4dGVuZChsLm5vZGUsbC5vZmZzZXQpKToodC5zZXRFbmQobC5ub2RlLGwub2Zmc2V0KSxlLmFkZFJhbmdlKHQpKSl9fWZvcih0PVtdLGU9bjtlPWUucGFyZW50Tm9kZTspZS5ub2RlVHlwZT09PTEmJnQucHVzaCh7ZWxlbWVudDplLGxlZnQ6ZS5zY3JvbGxMZWZ0LHRvcDplLnNjcm9sbFRvcH0pO2Zvcih0eXBlb2Ygbi5mb2N1cz09ImZ1bmN0aW9uIiYmbi5mb2N1cygpLG49MDtuPHQubGVuZ3RoO24rKyllPXRbbl0sZS5lbGVtZW50LnNjcm9sbExlZnQ9ZS5sZWZ0LGUuZWxlbWVudC5zY3JvbGxUb3A9ZS50b3B9fXZhciBaYj1kaSYmImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCYmMTE+PWRvY3VtZW50LmRvY3VtZW50TW9kZSxSbD1udWxsLHZwPW51bGwseWE9bnVsbCx5cD0hMTtmdW5jdGlvbiBNeShlLHQsbil7dmFyIHI9bi53aW5kb3c9PT1uP24uZG9jdW1lbnQ6bi5ub2RlVHlwZT09PTk/bjpuLm93bmVyRG9jdW1lbnQ7eXB8fFJsPT1udWxsfHxSbCE9PVljKHIpfHwocj1SbCwic2VsZWN0aW9uU3RhcnQiaW4gciYmZ2cocik/cj17c3RhcnQ6ci5zZWxlY3Rpb25TdGFydCxlbmQ6ci5zZWxlY3Rpb25FbmR9OihyPShyLm93bmVyRG9jdW1lbnQmJnIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8d2luZG93KS5nZXRTZWxlY3Rpb24oKSxyPXthbmNob3JOb2RlOnIuYW5jaG9yTm9kZSxhbmNob3JPZmZzZXQ6ci5hbmNob3JPZmZzZXQsZm9jdXNOb2RlOnIuZm9jdXNOb2RlLGZvY3VzT2Zmc2V0OnIuZm9jdXNPZmZzZXR9KSx5YSYmVmEoeWEscil8fCh5YT1yLHI9bmQodnAsIm9uU2VsZWN0IiksMDxyLmxlbmd0aCYmKHQ9bmV3IGhnKCJvblNlbGVjdCIsInNlbGVjdCIsbnVsbCx0LG4pLGUucHVzaCh7ZXZlbnQ6dCxsaXN0ZW5lcnM6cn0pLHQudGFyZ2V0PVJsKSkpfWZ1bmN0aW9uIHJjKGUsdCl7dmFyIG49e307cmV0dXJuIG5bZS50b0xvd2VyQ2FzZSgpXT10LnRvTG93ZXJDYXNlKCksblsiV2Via2l0IitlXT0id2Via2l0Iit0LG5bIk1veiIrZV09Im1veiIrdCxufXZhciBPbD17YW5pbWF0aW9uZW5kOnJjKCJBbmltYXRpb24iLCJBbmltYXRpb25FbmQiKSxhbmltYXRpb25pdGVyYXRpb246cmMoIkFuaW1hdGlvbiIsIkFuaW1hdGlvbkl0ZXJhdGlvbiIpLGFuaW1hdGlvbnN0YXJ0OnJjKCJBbmltYXRpb24iLCJBbmltYXRpb25TdGFydCIpLHRyYW5zaXRpb25lbmQ6cmMoIlRyYW5zaXRpb24iLCJUcmFuc2l0aW9uRW5kIil9LHBoPXt9LEUxPXt9O2RpJiYoRTE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsIkFuaW1hdGlvbkV2ZW50ImluIHdpbmRvd3x8KGRlbGV0ZSBPbC5hbmltYXRpb25lbmQuYW5pbWF0aW9uLGRlbGV0ZSBPbC5hbmltYXRpb25pdGVyYXRpb24uYW5pbWF0aW9uLGRlbGV0ZSBPbC5hbmltYXRpb25zdGFydC5hbmltYXRpb24pLCJUcmFuc2l0aW9uRXZlbnQiaW4gd2luZG93fHxkZWxldGUgT2wudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uKTtmdW5jdGlvbiBzZihlKXtpZihwaFtlXSlyZXR1cm4gcGhbZV07aWYoIU9sW2VdKXJldHVybiBlO3ZhciB0PU9sW2VdLG47Zm9yKG4gaW4gdClpZih0Lmhhc093blByb3BlcnR5KG4pJiZuIGluIEUxKXJldHVybiBwaFtlXT10W25dO3JldHVybiBlfXZhciBDMT1zZigiYW5pbWF0aW9uZW5kIiksazE9c2YoImFuaW1hdGlvbml0ZXJhdGlvbiIpLCQxPXNmKCJhbmltYXRpb25zdGFydCIpLGIxPXNmKCJ0cmFuc2l0aW9uZW5kIiksVDE9bmV3IE1hcCxEeT0iYWJvcnQgYXV4Q2xpY2sgY2FuY2VsIGNhblBsYXkgY2FuUGxheVRocm91Z2ggY2xpY2sgY2xvc2UgY29udGV4dE1lbnUgY29weSBjdXQgZHJhZyBkcmFnRW5kIGRyYWdFbnRlciBkcmFnRXhpdCBkcmFnTGVhdmUgZHJhZ092ZXIgZHJhZ1N0YXJ0IGRyb3AgZHVyYXRpb25DaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgZ290UG9pbnRlckNhcHR1cmUgaW5wdXQgaW52YWxpZCBrZXlEb3duIGtleVByZXNzIGtleVVwIGxvYWQgbG9hZGVkRGF0YSBsb2FkZWRNZXRhZGF0YSBsb2FkU3RhcnQgbG9zdFBvaW50ZXJDYXB0dXJlIG1vdXNlRG93biBtb3VzZU1vdmUgbW91c2VPdXQgbW91c2VPdmVyIG1vdXNlVXAgcGFzdGUgcGF1c2UgcGxheSBwbGF5aW5nIHBvaW50ZXJDYW5jZWwgcG9pbnRlckRvd24gcG9pbnRlck1vdmUgcG9pbnRlck91dCBwb2ludGVyT3ZlciBwb2ludGVyVXAgcHJvZ3Jlc3MgcmF0ZUNoYW5nZSByZXNldCByZXNpemUgc2Vla2VkIHNlZWtpbmcgc3RhbGxlZCBzdWJtaXQgc3VzcGVuZCB0aW1lVXBkYXRlIHRvdWNoQ2FuY2VsIHRvdWNoRW5kIHRvdWNoU3RhcnQgdm9sdW1lQ2hhbmdlIHNjcm9sbCB0b2dnbGUgdG91Y2hNb3ZlIHdhaXRpbmcgd2hlZWwiLnNwbGl0KCIgIik7ZnVuY3Rpb24gbW8oZSx0KXtUMS5zZXQoZSx0KSxpbCh0LFtlXSl9Zm9yKHZhciBtaD0wO21oPER5Lmxlbmd0aDttaCsrKXt2YXIgZ2g9RHlbbWhdLEdiPWdoLnRvTG93ZXJDYXNlKCksWWI9Z2hbMF0udG9VcHBlckNhc2UoKStnaC5zbGljZSgxKTttbyhHYiwib24iK1liKX1tbyhDMSwib25BbmltYXRpb25FbmQiKTttbyhrMSwib25BbmltYXRpb25JdGVyYXRpb24iKTttbygkMSwib25BbmltYXRpb25TdGFydCIpO21vKCJkYmxjbGljayIsIm9uRG91YmxlQ2xpY2siKTttbygiZm9jdXNpbiIsIm9uRm9jdXMiKTttbygiZm9jdXNvdXQiLCJvbkJsdXIiKTttbyhiMSwib25UcmFuc2l0aW9uRW5kIik7dHMoIm9uTW91c2VFbnRlciIsWyJtb3VzZW91dCIsIm1vdXNlb3ZlciJdKTt0cygib25Nb3VzZUxlYXZlIixbIm1vdXNlb3V0IiwibW91c2VvdmVyIl0pO3RzKCJvblBvaW50ZXJFbnRlciIsWyJwb2ludGVyb3V0IiwicG9pbnRlcm92ZXIiXSk7dHMoIm9uUG9pbnRlckxlYXZlIixbInBvaW50ZXJvdXQiLCJwb2ludGVyb3ZlciJdKTtpbCgib25DaGFuZ2UiLCJjaGFuZ2UgY2xpY2sgZm9jdXNpbiBmb2N1c291dCBpbnB1dCBrZXlkb3duIGtleXVwIHNlbGVjdGlvbmNoYW5nZSIuc3BsaXQoIiAiKSk7aWwoIm9uU2VsZWN0IiwiZm9jdXNvdXQgY29udGV4dG1lbnUgZHJhZ2VuZCBmb2N1c2luIGtleWRvd24ga2V5dXAgbW91c2Vkb3duIG1vdXNldXAgc2VsZWN0aW9uY2hhbmdlIi5zcGxpdCgiICIpKTtpbCgib25CZWZvcmVJbnB1dCIsWyJjb21wb3NpdGlvbmVuZCIsImtleXByZXNzIiwidGV4dElucHV0IiwicGFzdGUiXSk7aWwoIm9uQ29tcG9zaXRpb25FbmQiLCJjb21wb3NpdGlvbmVuZCBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93biIuc3BsaXQoIiAiKSk7aWwoIm9uQ29tcG9zaXRpb25TdGFydCIsImNvbXBvc2l0aW9uc3RhcnQgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd24iLnNwbGl0KCIgIikpO2lsKCJvbkNvbXBvc2l0aW9uVXBkYXRlIiwiY29tcG9zaXRpb251cGRhdGUgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd24iLnNwbGl0KCIgIikpO3ZhciB1YT0iYWJvcnQgY2FucGxheSBjYW5wbGF5dGhyb3VnaCBkdXJhdGlvbmNoYW5nZSBlbXB0aWVkIGVuY3J5cHRlZCBlbmRlZCBlcnJvciBsb2FkZWRkYXRhIGxvYWRlZG1ldGFkYXRhIGxvYWRzdGFydCBwYXVzZSBwbGF5IHBsYXlpbmcgcHJvZ3Jlc3MgcmF0ZWNoYW5nZSByZXNpemUgc2Vla2VkIHNlZWtpbmcgc3RhbGxlZCBzdXNwZW5kIHRpbWV1cGRhdGUgdm9sdW1lY2hhbmdlIHdhaXRpbmciLnNwbGl0KCIgIiksWGI9bmV3IFNldCgiY2FuY2VsIGNsb3NlIGludmFsaWQgbG9hZCBzY3JvbGwgdG9nZ2xlIi5zcGxpdCgiICIpLmNvbmNhdCh1YSkpO2Z1bmN0aW9uIEx5KGUsdCxuKXt2YXIgcj1lLnR5cGV8fCJ1bmtub3duLWV2ZW50IjtlLmN1cnJlbnRUYXJnZXQ9bixHJChyLHQsdm9pZCAwLGUpLGUuY3VycmVudFRhcmdldD1udWxsfWZ1bmN0aW9uIE4xKGUsdCl7dD0odCY0KSE9PTA7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl0saT1yLmV2ZW50O3I9ci5saXN0ZW5lcnM7ZTp7dmFyIG89dm9pZCAwO2lmKHQpZm9yKHZhciBsPXIubGVuZ3RoLTE7MDw9bDtsLS0pe3ZhciBzPXJbbF0sYT1zLmluc3RhbmNlLHU9cy5jdXJyZW50VGFyZ2V0O2lmKHM9cy5saXN0ZW5lcixhIT09byYmaS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrIGU7THkoaSxzLHUpLG89YX1lbHNlIGZvcihsPTA7bDxyLmxlbmd0aDtsKyspe2lmKHM9cltsXSxhPXMuaW5zdGFuY2UsdT1zLmN1cnJlbnRUYXJnZXQscz1zLmxpc3RlbmVyLGEhPT1vJiZpLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWsgZTtMeShpLHMsdSksbz1hfX19aWYoUWMpdGhyb3cgZT1ocCxRYz0hMSxocD1udWxsLGV9ZnVuY3Rpb24gZXQoZSx0KXt2YXIgbj10W0VwXTtuPT09dm9pZCAwJiYobj10W0VwXT1uZXcgU2V0KTt2YXIgcj1lKyJfX2J1YmJsZSI7bi5oYXMocil8fChSMSh0LGUsMiwhMSksbi5hZGQocikpfWZ1bmN0aW9uIHZoKGUsdCxuKXt2YXIgcj0wO3QmJihyfD00KSxSMShuLGUscix0KX12YXIgaWM9Il9yZWFjdExpc3RlbmluZyIrTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7ZnVuY3Rpb24gSGEoZSl7aWYoIWVbaWNdKXtlW2ljXT0hMCxJXy5mb3JFYWNoKGZ1bmN0aW9uKG4pe24hPT0ic2VsZWN0aW9uY2hhbmdlIiYmKFhiLmhhcyhuKXx8dmgobiwhMSxlKSx2aChuLCEwLGUpKX0pO3ZhciB0PWUubm9kZVR5cGU9PT05P2U6ZS5vd25lckRvY3VtZW50O3Q9PT1udWxsfHx0W2ljXXx8KHRbaWNdPSEwLHZoKCJzZWxlY3Rpb25jaGFuZ2UiLCExLHQpKX19ZnVuY3Rpb24gUjEoZSx0LG4scil7c3dpdGNoKGgxKHQpKXtjYXNlIDE6dmFyIGk9Y2I7YnJlYWs7Y2FzZSA0Omk9ZGI7YnJlYWs7ZGVmYXVsdDppPWRnfW49aS5iaW5kKG51bGwsdCxuLGUpLGk9dm9pZCAwLCFmcHx8dCE9PSJ0b3VjaHN0YXJ0IiYmdCE9PSJ0b3VjaG1vdmUiJiZ0IT09IndoZWVsInx8KGk9ITApLHI/aSE9PXZvaWQgMD9lLmFkZEV2ZW50TGlzdGVuZXIodCxuLHtjYXB0dXJlOiEwLHBhc3NpdmU6aX0pOmUuYWRkRXZlbnRMaXN0ZW5lcih0LG4sITApOmkhPT12b2lkIDA/ZS5hZGRFdmVudExpc3RlbmVyKHQsbix7cGFzc2l2ZTppfSk6ZS5hZGRFdmVudExpc3RlbmVyKHQsbiwhMSl9ZnVuY3Rpb24geWgoZSx0LG4scixpKXt2YXIgbz1yO2lmKCEodCYxKSYmISh0JjIpJiZyIT09bnVsbCllOmZvcig7Oyl7aWYocj09PW51bGwpcmV0dXJuO3ZhciBsPXIudGFnO2lmKGw9PT0zfHxsPT09NCl7dmFyIHM9ci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztpZihzPT09aXx8cy5ub2RlVHlwZT09PTgmJnMucGFyZW50Tm9kZT09PWkpYnJlYWs7aWYobD09PTQpZm9yKGw9ci5yZXR1cm47bCE9PW51bGw7KXt2YXIgYT1sLnRhZztpZigoYT09PTN8fGE9PT00KSYmKGE9bC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxhPT09aXx8YS5ub2RlVHlwZT09PTgmJmEucGFyZW50Tm9kZT09PWkpKXJldHVybjtsPWwucmV0dXJufWZvcig7cyE9PW51bGw7KXtpZihsPU9vKHMpLGw9PT1udWxsKXJldHVybjtpZihhPWwudGFnLGE9PT01fHxhPT09Nil7cj1vPWw7Y29udGludWUgZX1zPXMucGFyZW50Tm9kZX19cj1yLnJldHVybn1xXyhmdW5jdGlvbigpe3ZhciB1PW8sYz1zZyhuKSxkPVtdO2U6e3ZhciBmPVQxLmdldChlKTtpZihmIT09dm9pZCAwKXt2YXIgaD1oZyxtPWU7c3dpdGNoKGUpe2Nhc2Uia2V5cHJlc3MiOmlmKFBjKG4pPT09MClicmVhayBlO2Nhc2Uia2V5ZG93biI6Y2FzZSJrZXl1cCI6aD0kYjticmVhaztjYXNlImZvY3VzaW4iOm09ImZvY3VzIixoPWRoO2JyZWFrO2Nhc2UiZm9jdXNvdXQiOm09ImJsdXIiLGg9ZGg7YnJlYWs7Y2FzZSJiZWZvcmVibHVyIjpjYXNlImFmdGVyYmx1ciI6aD1kaDticmVhaztjYXNlImNsaWNrIjppZihuLmJ1dHRvbj09PTIpYnJlYWsgZTtjYXNlImF1eGNsaWNrIjpjYXNlImRibGNsaWNrIjpjYXNlIm1vdXNlZG93biI6Y2FzZSJtb3VzZW1vdmUiOmNhc2UibW91c2V1cCI6Y2FzZSJtb3VzZW91dCI6Y2FzZSJtb3VzZW92ZXIiOmNhc2UiY29udGV4dG1lbnUiOmg9Q3k7YnJlYWs7Y2FzZSJkcmFnIjpjYXNlImRyYWdlbmQiOmNhc2UiZHJhZ2VudGVyIjpjYXNlImRyYWdleGl0IjpjYXNlImRyYWdsZWF2ZSI6Y2FzZSJkcmFnb3ZlciI6Y2FzZSJkcmFnc3RhcnQiOmNhc2UiZHJvcCI6aD1wYjticmVhaztjYXNlInRvdWNoY2FuY2VsIjpjYXNlInRvdWNoZW5kIjpjYXNlInRvdWNobW92ZSI6Y2FzZSJ0b3VjaHN0YXJ0IjpoPU5iO2JyZWFrO2Nhc2UgQzE6Y2FzZSBrMTpjYXNlICQxOmg9dmI7YnJlYWs7Y2FzZSBiMTpoPU9iO2JyZWFrO2Nhc2Uic2Nyb2xsIjpoPWZiO2JyZWFrO2Nhc2Uid2hlZWwiOmg9QWI7YnJlYWs7Y2FzZSJjb3B5IjpjYXNlImN1dCI6Y2FzZSJwYXN0ZSI6aD14YjticmVhaztjYXNlImdvdHBvaW50ZXJjYXB0dXJlIjpjYXNlImxvc3Rwb2ludGVyY2FwdHVyZSI6Y2FzZSJwb2ludGVyY2FuY2VsIjpjYXNlInBvaW50ZXJkb3duIjpjYXNlInBvaW50ZXJtb3ZlIjpjYXNlInBvaW50ZXJvdXQiOmNhc2UicG9pbnRlcm92ZXIiOmNhc2UicG9pbnRlcnVwIjpoPSR5fXZhciBnPSh0JjQpIT09MCx3PSFnJiZlPT09InNjcm9sbCIsdj1nP2YhPT1udWxsP2YrIkNhcHR1cmUiOm51bGw6ZjtnPVtdO2Zvcih2YXIgeT11LF87eSE9PW51bGw7KXtfPXk7dmFyIFM9Xy5zdGF0ZU5vZGU7aWYoXy50YWc9PT01JiZTIT09bnVsbCYmKF89Uyx2IT09bnVsbCYmKFM9emEoeSx2KSxTIT1udWxsJiZnLnB1c2goS2EoeSxTLF8pKSkpLHcpYnJlYWs7eT15LnJldHVybn0wPGcubGVuZ3RoJiYoZj1uZXcgaChmLG0sbnVsbCxuLGMpLGQucHVzaCh7ZXZlbnQ6ZixsaXN0ZW5lcnM6Z30pKX19aWYoISh0JjcpKXtlOntpZihmPWU9PT0ibW91c2VvdmVyInx8ZT09PSJwb2ludGVyb3ZlciIsaD1lPT09Im1vdXNlb3V0Inx8ZT09PSJwb2ludGVyb3V0IixmJiZuIT09Y3AmJihtPW4ucmVsYXRlZFRhcmdldHx8bi5mcm9tRWxlbWVudCkmJihPbyhtKXx8bVtmaV0pKWJyZWFrIGU7aWYoKGh8fGYpJiYoZj1jLndpbmRvdz09PWM/YzooZj1jLm93bmVyRG9jdW1lbnQpP2YuZGVmYXVsdFZpZXd8fGYucGFyZW50V2luZG93OndpbmRvdyxoPyhtPW4ucmVsYXRlZFRhcmdldHx8bi50b0VsZW1lbnQsaD11LG09bT9PbyhtKTpudWxsLG0hPT1udWxsJiYodz1vbChtKSxtIT09d3x8bS50YWchPT01JiZtLnRhZyE9PTYpJiYobT1udWxsKSk6KGg9bnVsbCxtPXUpLGghPT1tKSl7aWYoZz1DeSxTPSJvbk1vdXNlTGVhdmUiLHY9Im9uTW91c2VFbnRlciIseT0ibW91c2UiLChlPT09InBvaW50ZXJvdXQifHxlPT09InBvaW50ZXJvdmVyIikmJihnPSR5LFM9Im9uUG9pbnRlckxlYXZlIix2PSJvblBvaW50ZXJFbnRlciIseT0icG9pbnRlciIpLHc9aD09bnVsbD9mOlBsKGgpLF89bT09bnVsbD9mOlBsKG0pLGY9bmV3IGcoUyx5KyJsZWF2ZSIsaCxuLGMpLGYudGFyZ2V0PXcsZi5yZWxhdGVkVGFyZ2V0PV8sUz1udWxsLE9vKGMpPT09dSYmKGc9bmV3IGcodix5KyJlbnRlciIsbSxuLGMpLGcudGFyZ2V0PV8sZy5yZWxhdGVkVGFyZ2V0PXcsUz1nKSx3PVMsaCYmbSl0Ontmb3IoZz1oLHY9bSx5PTAsXz1nO187Xz1tbChfKSl5Kys7Zm9yKF89MCxTPXY7UztTPW1sKFMpKV8rKztmb3IoOzA8eS1fOylnPW1sKGcpLHktLTtmb3IoOzA8Xy15Oyl2PW1sKHYpLF8tLTtmb3IoO3ktLTspe2lmKGc9PT12fHx2IT09bnVsbCYmZz09PXYuYWx0ZXJuYXRlKWJyZWFrIHQ7Zz1tbChnKSx2PW1sKHYpfWc9bnVsbH1lbHNlIGc9bnVsbDtoIT09bnVsbCYmSXkoZCxmLGgsZywhMSksbSE9PW51bGwmJnchPT1udWxsJiZJeShkLHcsbSxnLCEwKX19ZTp7aWYoZj11P1BsKHUpOndpbmRvdyxoPWYubm9kZU5hbWUmJmYubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxoPT09InNlbGVjdCJ8fGg9PT0iaW5wdXQiJiZmLnR5cGU9PT0iZmlsZSIpdmFyIEU9RmI7ZWxzZSBpZihOeShmKSlpZih4MSlFPVZiO2Vsc2V7RT1VYjt2YXIgJD1CYn1lbHNlKGg9Zi5ub2RlTmFtZSkmJmgudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJihmLnR5cGU9PT0iY2hlY2tib3gifHxmLnR5cGU9PT0icmFkaW8iKSYmKEU9V2IpO2lmKEUmJihFPUUoZSx1KSkpe3kxKGQsRSxuLGMpO2JyZWFrIGV9JCYmJChlLGYsdSksZT09PSJmb2N1c291dCImJigkPWYuX3dyYXBwZXJTdGF0ZSkmJiQuY29udHJvbGxlZCYmZi50eXBlPT09Im51bWJlciImJm9wKGYsIm51bWJlciIsZi52YWx1ZSl9c3dpdGNoKCQ9dT9QbCh1KTp3aW5kb3csZSl7Y2FzZSJmb2N1c2luIjooTnkoJCl8fCQuY29udGVudEVkaXRhYmxlPT09InRydWUiKSYmKFJsPSQsdnA9dSx5YT1udWxsKTticmVhaztjYXNlImZvY3Vzb3V0Ijp5YT12cD1SbD1udWxsO2JyZWFrO2Nhc2UibW91c2Vkb3duIjp5cD0hMDticmVhaztjYXNlImNvbnRleHRtZW51IjpjYXNlIm1vdXNldXAiOmNhc2UiZHJhZ2VuZCI6eXA9ITEsTXkoZCxuLGMpO2JyZWFrO2Nhc2Uic2VsZWN0aW9uY2hhbmdlIjppZihaYilicmVhaztjYXNlImtleWRvd24iOmNhc2Uia2V5dXAiOk15KGQsbixjKX12YXIgQztpZihtZyllOntzd2l0Y2goZSl7Y2FzZSJjb21wb3NpdGlvbnN0YXJ0Ijp2YXIgVD0ib25Db21wb3NpdGlvblN0YXJ0IjticmVhayBlO2Nhc2UiY29tcG9zaXRpb25lbmQiOlQ9Im9uQ29tcG9zaXRpb25FbmQiO2JyZWFrIGU7Y2FzZSJjb21wb3NpdGlvbnVwZGF0ZSI6VD0ib25Db21wb3NpdGlvblVwZGF0ZSI7YnJlYWsgZX1UPXZvaWQgMH1lbHNlIE5sP2cxKGUsbikmJihUPSJvbkNvbXBvc2l0aW9uRW5kIik6ZT09PSJrZXlkb3duIiYmbi5rZXlDb2RlPT09MjI5JiYoVD0ib25Db21wb3NpdGlvblN0YXJ0Iik7VCYmKG0xJiZuLmxvY2FsZSE9PSJrbyImJihObHx8VCE9PSJvbkNvbXBvc2l0aW9uU3RhcnQiP1Q9PT0ib25Db21wb3NpdGlvbkVuZCImJk5sJiYoQz1wMSgpKTooRmk9YyxmZz0idmFsdWUiaW4gRmk/RmkudmFsdWU6RmkudGV4dENvbnRlbnQsTmw9ITApKSwkPW5kKHUsVCksMDwkLmxlbmd0aCYmKFQ9bmV3IGt5KFQsZSxudWxsLG4sYyksZC5wdXNoKHtldmVudDpULGxpc3RlbmVyczokfSksQz9ULmRhdGE9QzooQz12MShuKSxDIT09bnVsbCYmKFQuZGF0YT1DKSkpKSwoQz1EYj9MYihlLG4pOkliKGUsbikpJiYodT1uZCh1LCJvbkJlZm9yZUlucHV0IiksMDx1Lmxlbmd0aCYmKGM9bmV3IGt5KCJvbkJlZm9yZUlucHV0IiwiYmVmb3JlaW5wdXQiLG51bGwsbixjKSxkLnB1c2goe2V2ZW50OmMsbGlzdGVuZXJzOnV9KSxjLmRhdGE9QykpfU4xKGQsdCl9KX1mdW5jdGlvbiBLYShlLHQsbil7cmV0dXJue2luc3RhbmNlOmUsbGlzdGVuZXI6dCxjdXJyZW50VGFyZ2V0Om59fWZ1bmN0aW9uIG5kKGUsdCl7Zm9yKHZhciBuPXQrIkNhcHR1cmUiLHI9W107ZSE9PW51bGw7KXt2YXIgaT1lLG89aS5zdGF0ZU5vZGU7aS50YWc9PT01JiZvIT09bnVsbCYmKGk9byxvPXphKGUsbiksbyE9bnVsbCYmci51bnNoaWZ0KEthKGUsbyxpKSksbz16YShlLHQpLG8hPW51bGwmJnIucHVzaChLYShlLG8saSkpKSxlPWUucmV0dXJufXJldHVybiByfWZ1bmN0aW9uIG1sKGUpe2lmKGU9PT1udWxsKXJldHVybiBudWxsO2RvIGU9ZS5yZXR1cm47d2hpbGUoZSYmZS50YWchPT01KTtyZXR1cm4gZXx8bnVsbH1mdW5jdGlvbiBJeShlLHQsbixyLGkpe2Zvcih2YXIgbz10Ll9yZWFjdE5hbWUsbD1bXTtuIT09bnVsbCYmbiE9PXI7KXt2YXIgcz1uLGE9cy5hbHRlcm5hdGUsdT1zLnN0YXRlTm9kZTtpZihhIT09bnVsbCYmYT09PXIpYnJlYWs7cy50YWc9PT01JiZ1IT09bnVsbCYmKHM9dSxpPyhhPXphKG4sbyksYSE9bnVsbCYmbC51bnNoaWZ0KEthKG4sYSxzKSkpOml8fChhPXphKG4sbyksYSE9bnVsbCYmbC5wdXNoKEthKG4sYSxzKSkpKSxuPW4ucmV0dXJufWwubGVuZ3RoIT09MCYmZS5wdXNoKHtldmVudDp0LGxpc3RlbmVyczpsfSl9dmFyIFFiPS9cclxuPy9nLEpiPS9cdTAwMDB8XHVGRkZEL2c7ZnVuY3Rpb24gankoZSl7cmV0dXJuKHR5cGVvZiBlPT0ic3RyaW5nIj9lOiIiK2UpLnJlcGxhY2UoUWIsYApgKS5yZXBsYWNlKEpiLCIiKX1mdW5jdGlvbiBvYyhlLHQsbil7aWYodD1qeSh0KSxqeShlKSE9PXQmJm4pdGhyb3cgRXJyb3IoVSg0MjUpKX1mdW5jdGlvbiByZCgpe312YXIgeHA9bnVsbCxfcD1udWxsO2Z1bmN0aW9uIHdwKGUsdCl7cmV0dXJuIGU9PT0idGV4dGFyZWEifHxlPT09Im5vc2NyaXB0Inx8dHlwZW9mIHQuY2hpbGRyZW49PSJzdHJpbmcifHx0eXBlb2YgdC5jaGlsZHJlbj09Im51bWJlciJ8fHR5cGVvZiB0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPT0ib2JqZWN0IiYmdC5kYW5nZXJvdXNseVNldElubmVySFRNTCE9PW51bGwmJnQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sIT1udWxsfXZhciBTcD10eXBlb2Ygc2V0VGltZW91dD09ImZ1bmN0aW9uIj9zZXRUaW1lb3V0OnZvaWQgMCxxYj10eXBlb2YgY2xlYXJUaW1lb3V0PT0iZnVuY3Rpb24iP2NsZWFyVGltZW91dDp2b2lkIDAsenk9dHlwZW9mIFByb21pc2U9PSJmdW5jdGlvbiI/UHJvbWlzZTp2b2lkIDAsZVQ9dHlwZW9mIHF1ZXVlTWljcm90YXNrPT0iZnVuY3Rpb24iP3F1ZXVlTWljcm90YXNrOnR5cGVvZiB6eTwidSI/ZnVuY3Rpb24oZSl7cmV0dXJuIHp5LnJlc29sdmUobnVsbCkudGhlbihlKS5jYXRjaCh0VCl9OlNwO2Z1bmN0aW9uIHRUKGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBlfSl9ZnVuY3Rpb24geGgoZSx0KXt2YXIgbj10LHI9MDtkb3t2YXIgaT1uLm5leHRTaWJsaW5nO2lmKGUucmVtb3ZlQ2hpbGQobiksaSYmaS5ub2RlVHlwZT09PTgpaWYobj1pLmRhdGEsbj09PSIvJCIpe2lmKHI9PT0wKXtlLnJlbW92ZUNoaWxkKGkpLFVhKHQpO3JldHVybn1yLS19ZWxzZSBuIT09IiQiJiZuIT09IiQ/IiYmbiE9PSIkISJ8fHIrKztuPWl9d2hpbGUobik7VWEodCl9ZnVuY3Rpb24gWmkoZSl7Zm9yKDtlIT1udWxsO2U9ZS5uZXh0U2libGluZyl7dmFyIHQ9ZS5ub2RlVHlwZTtpZih0PT09MXx8dD09PTMpYnJlYWs7aWYodD09PTgpe2lmKHQ9ZS5kYXRhLHQ9PT0iJCJ8fHQ9PT0iJCEifHx0PT09IiQ/IilicmVhaztpZih0PT09Ii8kIilyZXR1cm4gbnVsbH19cmV0dXJuIGV9ZnVuY3Rpb24gRnkoZSl7ZT1lLnByZXZpb3VzU2libGluZztmb3IodmFyIHQ9MDtlOyl7aWYoZS5ub2RlVHlwZT09PTgpe3ZhciBuPWUuZGF0YTtpZihuPT09IiQifHxuPT09IiQhInx8bj09PSIkPyIpe2lmKHQ9PT0wKXJldHVybiBlO3QtLX1lbHNlIG49PT0iLyQiJiZ0Kyt9ZT1lLnByZXZpb3VzU2libGluZ31yZXR1cm4gbnVsbH12YXIgd3M9TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiksTXI9Il9fcmVhY3RGaWJlciQiK3dzLFphPSJfX3JlYWN0UHJvcHMkIit3cyxmaT0iX19yZWFjdENvbnRhaW5lciQiK3dzLEVwPSJfX3JlYWN0RXZlbnRzJCIrd3MsblQ9Il9fcmVhY3RMaXN0ZW5lcnMkIit3cyxyVD0iX19yZWFjdEhhbmRsZXMkIit3cztmdW5jdGlvbiBPbyhlKXt2YXIgdD1lW01yXTtpZih0KXJldHVybiB0O2Zvcih2YXIgbj1lLnBhcmVudE5vZGU7bjspe2lmKHQ9bltmaV18fG5bTXJdKXtpZihuPXQuYWx0ZXJuYXRlLHQuY2hpbGQhPT1udWxsfHxuIT09bnVsbCYmbi5jaGlsZCE9PW51bGwpZm9yKGU9RnkoZSk7ZSE9PW51bGw7KXtpZihuPWVbTXJdKXJldHVybiBuO2U9RnkoZSl9cmV0dXJuIHR9ZT1uLG49ZS5wYXJlbnROb2RlfXJldHVybiBudWxsfWZ1bmN0aW9uIFB1KGUpe3JldHVybiBlPWVbTXJdfHxlW2ZpXSwhZXx8ZS50YWchPT01JiZlLnRhZyE9PTYmJmUudGFnIT09MTMmJmUudGFnIT09Mz9udWxsOmV9ZnVuY3Rpb24gUGwoZSl7aWYoZS50YWc9PT01fHxlLnRhZz09PTYpcmV0dXJuIGUuc3RhdGVOb2RlO3Rocm93IEVycm9yKFUoMzMpKX1mdW5jdGlvbiBhZihlKXtyZXR1cm4gZVtaYV18fG51bGx9dmFyIENwPVtdLEFsPS0xO2Z1bmN0aW9uIGdvKGUpe3JldHVybntjdXJyZW50OmV9fWZ1bmN0aW9uIGl0KGUpezA+QWx8fChlLmN1cnJlbnQ9Q3BbQWxdLENwW0FsXT1udWxsLEFsLS0pfWZ1bmN0aW9uIFhlKGUsdCl7QWwrKyxDcFtBbF09ZS5jdXJyZW50LGUuY3VycmVudD10fXZhciBubz17fSxybj1nbyhubyksYm49Z28oITEpLFdvPW5vO2Z1bmN0aW9uIG5zKGUsdCl7dmFyIG49ZS50eXBlLmNvbnRleHRUeXBlcztpZighbilyZXR1cm4gbm87dmFyIHI9ZS5zdGF0ZU5vZGU7aWYociYmci5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PT09dClyZXR1cm4gci5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dDt2YXIgaT17fSxvO2ZvcihvIGluIG4paVtvXT10W29dO3JldHVybiByJiYoZT1lLnN0YXRlTm9kZSxlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9dCxlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0PWkpLGl9ZnVuY3Rpb24gVG4oZSl7cmV0dXJuIGU9ZS5jaGlsZENvbnRleHRUeXBlcyxlIT1udWxsfWZ1bmN0aW9uIGlkKCl7aXQoYm4pLGl0KHJuKX1mdW5jdGlvbiBCeShlLHQsbil7aWYocm4uY3VycmVudCE9PW5vKXRocm93IEVycm9yKFUoMTY4KSk7WGUocm4sdCksWGUoYm4sbil9ZnVuY3Rpb24gTzEoZSx0LG4pe3ZhciByPWUuc3RhdGVOb2RlO2lmKHQ9dC5jaGlsZENvbnRleHRUeXBlcyx0eXBlb2Ygci5nZXRDaGlsZENvbnRleHQhPSJmdW5jdGlvbiIpcmV0dXJuIG47cj1yLmdldENoaWxkQ29udGV4dCgpO2Zvcih2YXIgaSBpbiByKWlmKCEoaSBpbiB0KSl0aHJvdyBFcnJvcihVKDEwOCxCJChlKXx8IlVua25vd24iLGkpKTtyZXR1cm4gbXQoe30sbixyKX1mdW5jdGlvbiBvZChlKXtyZXR1cm4gZT0oZT1lLnN0YXRlTm9kZSkmJmUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHR8fG5vLFdvPXJuLmN1cnJlbnQsWGUocm4sZSksWGUoYm4sYm4uY3VycmVudCksITB9ZnVuY3Rpb24gVXkoZSx0LG4pe3ZhciByPWUuc3RhdGVOb2RlO2lmKCFyKXRocm93IEVycm9yKFUoMTY5KSk7bj8oZT1PMShlLHQsV28pLHIuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ9ZSxpdChibiksaXQocm4pLFhlKHJuLGUpKTppdChibiksWGUoYm4sbil9dmFyIGlpPW51bGwsdWY9ITEsX2g9ITE7ZnVuY3Rpb24gUDEoZSl7aWk9PT1udWxsP2lpPVtlXTppaS5wdXNoKGUpfWZ1bmN0aW9uIGlUKGUpe3VmPSEwLFAxKGUpfWZ1bmN0aW9uIHZvKCl7aWYoIV9oJiZpaSE9PW51bGwpe19oPSEwO3ZhciBlPTAsdD1VZTt0cnl7dmFyIG49aWk7Zm9yKFVlPTE7ZTxuLmxlbmd0aDtlKyspe3ZhciByPW5bZV07ZG8gcj1yKCEwKTt3aGlsZShyIT09bnVsbCl9aWk9bnVsbCx1Zj0hMX1jYXRjaChpKXt0aHJvdyBpaSE9PW51bGwmJihpaT1paS5zbGljZShlKzEpKSxyMShhZyx2byksaX1maW5hbGx5e1VlPXQsX2g9ITF9fXJldHVybiBudWxsfXZhciBNbD1bXSxEbD0wLGxkPW51bGwsc2Q9MCxZbj1bXSxYbj0wLFZvPW51bGwsc2k9MSxhaT0iIjtmdW5jdGlvbiBibyhlLHQpe01sW0RsKytdPXNkLE1sW0RsKytdPWxkLGxkPWUsc2Q9dH1mdW5jdGlvbiBBMShlLHQsbil7WW5bWG4rK109c2ksWW5bWG4rK109YWksWW5bWG4rK109Vm8sVm89ZTt2YXIgcj1zaTtlPWFpO3ZhciBpPTMyLXdyKHIpLTE7ciY9figxPDxpKSxuKz0xO3ZhciBvPTMyLXdyKHQpK2k7aWYoMzA8byl7dmFyIGw9aS1pJTU7bz0ociYoMTw8bCktMSkudG9TdHJpbmcoMzIpLHI+Pj1sLGktPWwsc2k9MTw8MzItd3IodCkraXxuPDxpfHIsYWk9bytlfWVsc2Ugc2k9MTw8b3xuPDxpfHIsYWk9ZX1mdW5jdGlvbiB2ZyhlKXtlLnJldHVybiE9PW51bGwmJihibyhlLDEpLEExKGUsMSwwKSl9ZnVuY3Rpb24geWcoZSl7Zm9yKDtlPT09bGQ7KWxkPU1sWy0tRGxdLE1sW0RsXT1udWxsLHNkPU1sWy0tRGxdLE1sW0RsXT1udWxsO2Zvcig7ZT09PVZvOylWbz1ZblstLVhuXSxZbltYbl09bnVsbCxhaT1ZblstLVhuXSxZbltYbl09bnVsbCxzaT1ZblstLVhuXSxZbltYbl09bnVsbH12YXIgSW49bnVsbCxMbj1udWxsLG90PSExLHlyPW51bGw7ZnVuY3Rpb24gTTEoZSx0KXt2YXIgbj1xbig1LG51bGwsbnVsbCwwKTtuLmVsZW1lbnRUeXBlPSJERUxFVEVEIixuLnN0YXRlTm9kZT10LG4ucmV0dXJuPWUsdD1lLmRlbGV0aW9ucyx0PT09bnVsbD8oZS5kZWxldGlvbnM9W25dLGUuZmxhZ3N8PTE2KTp0LnB1c2gobil9ZnVuY3Rpb24gV3koZSx0KXtzd2l0Y2goZS50YWcpe2Nhc2UgNTp2YXIgbj1lLnR5cGU7cmV0dXJuIHQ9dC5ub2RlVHlwZSE9PTF8fG4udG9Mb3dlckNhc2UoKSE9PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT9udWxsOnQsdCE9PW51bGw/KGUuc3RhdGVOb2RlPXQsSW49ZSxMbj1aaSh0LmZpcnN0Q2hpbGQpLCEwKTohMTtjYXNlIDY6cmV0dXJuIHQ9ZS5wZW5kaW5nUHJvcHM9PT0iInx8dC5ub2RlVHlwZSE9PTM/bnVsbDp0LHQhPT1udWxsPyhlLnN0YXRlTm9kZT10LEluPWUsTG49bnVsbCwhMCk6ITE7Y2FzZSAxMzpyZXR1cm4gdD10Lm5vZGVUeXBlIT09OD9udWxsOnQsdCE9PW51bGw/KG49Vm8hPT1udWxsP3tpZDpzaSxvdmVyZmxvdzphaX06bnVsbCxlLm1lbW9pemVkU3RhdGU9e2RlaHlkcmF0ZWQ6dCx0cmVlQ29udGV4dDpuLHJldHJ5TGFuZToxMDczNzQxODI0fSxuPXFuKDE4LG51bGwsbnVsbCwwKSxuLnN0YXRlTm9kZT10LG4ucmV0dXJuPWUsZS5jaGlsZD1uLEluPWUsTG49bnVsbCwhMCk6ITE7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24ga3AoZSl7cmV0dXJuKGUubW9kZSYxKSE9PTAmJihlLmZsYWdzJjEyOCk9PT0wfWZ1bmN0aW9uICRwKGUpe2lmKG90KXt2YXIgdD1MbjtpZih0KXt2YXIgbj10O2lmKCFXeShlLHQpKXtpZihrcChlKSl0aHJvdyBFcnJvcihVKDQxOCkpO3Q9Wmkobi5uZXh0U2libGluZyk7dmFyIHI9SW47dCYmV3koZSx0KT9NMShyLG4pOihlLmZsYWdzPWUuZmxhZ3MmLTQwOTd8MixvdD0hMSxJbj1lKX19ZWxzZXtpZihrcChlKSl0aHJvdyBFcnJvcihVKDQxOCkpO2UuZmxhZ3M9ZS5mbGFncyYtNDA5N3wyLG90PSExLEluPWV9fX1mdW5jdGlvbiBWeShlKXtmb3IoZT1lLnJldHVybjtlIT09bnVsbCYmZS50YWchPT01JiZlLnRhZyE9PTMmJmUudGFnIT09MTM7KWU9ZS5yZXR1cm47SW49ZX1mdW5jdGlvbiBsYyhlKXtpZihlIT09SW4pcmV0dXJuITE7aWYoIW90KXJldHVybiBWeShlKSxvdD0hMCwhMTt2YXIgdDtpZigodD1lLnRhZyE9PTMpJiYhKHQ9ZS50YWchPT01KSYmKHQ9ZS50eXBlLHQ9dCE9PSJoZWFkIiYmdCE9PSJib2R5IiYmIXdwKGUudHlwZSxlLm1lbW9pemVkUHJvcHMpKSx0JiYodD1Mbikpe2lmKGtwKGUpKXRocm93IEQxKCksRXJyb3IoVSg0MTgpKTtmb3IoO3Q7KU0xKGUsdCksdD1aaSh0Lm5leHRTaWJsaW5nKX1pZihWeShlKSxlLnRhZz09PTEzKXtpZihlPWUubWVtb2l6ZWRTdGF0ZSxlPWUhPT1udWxsP2UuZGVoeWRyYXRlZDpudWxsLCFlKXRocm93IEVycm9yKFUoMzE3KSk7ZTp7Zm9yKGU9ZS5uZXh0U2libGluZyx0PTA7ZTspe2lmKGUubm9kZVR5cGU9PT04KXt2YXIgbj1lLmRhdGE7aWYobj09PSIvJCIpe2lmKHQ9PT0wKXtMbj1aaShlLm5leHRTaWJsaW5nKTticmVhayBlfXQtLX1lbHNlIG4hPT0iJCImJm4hPT0iJCEiJiZuIT09IiQ/Inx8dCsrfWU9ZS5uZXh0U2libGluZ31Mbj1udWxsfX1lbHNlIExuPUluP1ppKGUuc3RhdGVOb2RlLm5leHRTaWJsaW5nKTpudWxsO3JldHVybiEwfWZ1bmN0aW9uIEQxKCl7Zm9yKHZhciBlPUxuO2U7KWU9WmkoZS5uZXh0U2libGluZyl9ZnVuY3Rpb24gcnMoKXtMbj1Jbj1udWxsLG90PSExfWZ1bmN0aW9uIHhnKGUpe3lyPT09bnVsbD95cj1bZV06eXIucHVzaChlKX12YXIgb1Q9eGkuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7ZnVuY3Rpb24gbXIoZSx0KXtpZihlJiZlLmRlZmF1bHRQcm9wcyl7dD1tdCh7fSx0KSxlPWUuZGVmYXVsdFByb3BzO2Zvcih2YXIgbiBpbiBlKXRbbl09PT12b2lkIDAmJih0W25dPWVbbl0pO3JldHVybiB0fXJldHVybiB0fXZhciBhZD1nbyhudWxsKSx1ZD1udWxsLExsPW51bGwsX2c9bnVsbDtmdW5jdGlvbiB3Zygpe19nPUxsPXVkPW51bGx9ZnVuY3Rpb24gU2coZSl7dmFyIHQ9YWQuY3VycmVudDtpdChhZCksZS5fY3VycmVudFZhbHVlPXR9ZnVuY3Rpb24gYnAoZSx0LG4pe2Zvcig7ZSE9PW51bGw7KXt2YXIgcj1lLmFsdGVybmF0ZTtpZigoZS5jaGlsZExhbmVzJnQpIT09dD8oZS5jaGlsZExhbmVzfD10LHIhPT1udWxsJiYoci5jaGlsZExhbmVzfD10KSk6ciE9PW51bGwmJihyLmNoaWxkTGFuZXMmdCkhPT10JiYoci5jaGlsZExhbmVzfD10KSxlPT09bilicmVhaztlPWUucmV0dXJufX1mdW5jdGlvbiBabChlLHQpe3VkPWUsX2c9TGw9bnVsbCxlPWUuZGVwZW5kZW5jaWVzLGUhPT1udWxsJiZlLmZpcnN0Q29udGV4dCE9PW51bGwmJihlLmxhbmVzJnQmJigkbj0hMCksZS5maXJzdENvbnRleHQ9bnVsbCl9ZnVuY3Rpb24gcnIoZSl7dmFyIHQ9ZS5fY3VycmVudFZhbHVlO2lmKF9nIT09ZSlpZihlPXtjb250ZXh0OmUsbWVtb2l6ZWRWYWx1ZTp0LG5leHQ6bnVsbH0sTGw9PT1udWxsKXtpZih1ZD09PW51bGwpdGhyb3cgRXJyb3IoVSgzMDgpKTtMbD1lLHVkLmRlcGVuZGVuY2llcz17bGFuZXM6MCxmaXJzdENvbnRleHQ6ZX19ZWxzZSBMbD1MbC5uZXh0PWU7cmV0dXJuIHR9dmFyIFBvPW51bGw7ZnVuY3Rpb24gRWcoZSl7UG89PT1udWxsP1BvPVtlXTpQby5wdXNoKGUpfWZ1bmN0aW9uIEwxKGUsdCxuLHIpe3ZhciBpPXQuaW50ZXJsZWF2ZWQ7cmV0dXJuIGk9PT1udWxsPyhuLm5leHQ9bixFZyh0KSk6KG4ubmV4dD1pLm5leHQsaS5uZXh0PW4pLHQuaW50ZXJsZWF2ZWQ9bixoaShlLHIpfWZ1bmN0aW9uIGhpKGUsdCl7ZS5sYW5lc3w9dDt2YXIgbj1lLmFsdGVybmF0ZTtmb3IobiE9PW51bGwmJihuLmxhbmVzfD10KSxuPWUsZT1lLnJldHVybjtlIT09bnVsbDspZS5jaGlsZExhbmVzfD10LG49ZS5hbHRlcm5hdGUsbiE9PW51bGwmJihuLmNoaWxkTGFuZXN8PXQpLG49ZSxlPWUucmV0dXJuO3JldHVybiBuLnRhZz09PTM/bi5zdGF0ZU5vZGU6bnVsbH12YXIgTWk9ITE7ZnVuY3Rpb24gQ2coZSl7ZS51cGRhdGVRdWV1ZT17YmFzZVN0YXRlOmUubWVtb2l6ZWRTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6bnVsbCxsYXN0QmFzZVVwZGF0ZTpudWxsLHNoYXJlZDp7cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MH0sZWZmZWN0czpudWxsfX1mdW5jdGlvbiBJMShlLHQpe2U9ZS51cGRhdGVRdWV1ZSx0LnVwZGF0ZVF1ZXVlPT09ZSYmKHQudXBkYXRlUXVldWU9e2Jhc2VTdGF0ZTplLmJhc2VTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6ZS5maXJzdEJhc2VVcGRhdGUsbGFzdEJhc2VVcGRhdGU6ZS5sYXN0QmFzZVVwZGF0ZSxzaGFyZWQ6ZS5zaGFyZWQsZWZmZWN0czplLmVmZmVjdHN9KX1mdW5jdGlvbiB1aShlLHQpe3JldHVybntldmVudFRpbWU6ZSxsYW5lOnQsdGFnOjAscGF5bG9hZDpudWxsLGNhbGxiYWNrOm51bGwsbmV4dDpudWxsfX1mdW5jdGlvbiBHaShlLHQsbil7dmFyIHI9ZS51cGRhdGVRdWV1ZTtpZihyPT09bnVsbClyZXR1cm4gbnVsbDtpZihyPXIuc2hhcmVkLE1lJjIpe3ZhciBpPXIucGVuZGluZztyZXR1cm4gaT09PW51bGw/dC5uZXh0PXQ6KHQubmV4dD1pLm5leHQsaS5uZXh0PXQpLHIucGVuZGluZz10LGhpKGUsbil9cmV0dXJuIGk9ci5pbnRlcmxlYXZlZCxpPT09bnVsbD8odC5uZXh0PXQsRWcocikpOih0Lm5leHQ9aS5uZXh0LGkubmV4dD10KSxyLmludGVybGVhdmVkPXQsaGkoZSxuKX1mdW5jdGlvbiBBYyhlLHQsbil7aWYodD10LnVwZGF0ZVF1ZXVlLHQhPT1udWxsJiYodD10LnNoYXJlZCwobiY0MTk0MjQwKSE9PTApKXt2YXIgcj10LmxhbmVzO3ImPWUucGVuZGluZ0xhbmVzLG58PXIsdC5sYW5lcz1uLHVnKGUsbil9fWZ1bmN0aW9uIEh5KGUsdCl7dmFyIG49ZS51cGRhdGVRdWV1ZSxyPWUuYWx0ZXJuYXRlO2lmKHIhPT1udWxsJiYocj1yLnVwZGF0ZVF1ZXVlLG49PT1yKSl7dmFyIGk9bnVsbCxvPW51bGw7aWYobj1uLmZpcnN0QmFzZVVwZGF0ZSxuIT09bnVsbCl7ZG97dmFyIGw9e2V2ZW50VGltZTpuLmV2ZW50VGltZSxsYW5lOm4ubGFuZSx0YWc6bi50YWcscGF5bG9hZDpuLnBheWxvYWQsY2FsbGJhY2s6bi5jYWxsYmFjayxuZXh0Om51bGx9O289PT1udWxsP2k9bz1sOm89by5uZXh0PWwsbj1uLm5leHR9d2hpbGUobiE9PW51bGwpO289PT1udWxsP2k9bz10Om89by5uZXh0PXR9ZWxzZSBpPW89dDtuPXtiYXNlU3RhdGU6ci5iYXNlU3RhdGUsZmlyc3RCYXNlVXBkYXRlOmksbGFzdEJhc2VVcGRhdGU6byxzaGFyZWQ6ci5zaGFyZWQsZWZmZWN0czpyLmVmZmVjdHN9LGUudXBkYXRlUXVldWU9bjtyZXR1cm59ZT1uLmxhc3RCYXNlVXBkYXRlLGU9PT1udWxsP24uZmlyc3RCYXNlVXBkYXRlPXQ6ZS5uZXh0PXQsbi5sYXN0QmFzZVVwZGF0ZT10fWZ1bmN0aW9uIGNkKGUsdCxuLHIpe3ZhciBpPWUudXBkYXRlUXVldWU7TWk9ITE7dmFyIG89aS5maXJzdEJhc2VVcGRhdGUsbD1pLmxhc3RCYXNlVXBkYXRlLHM9aS5zaGFyZWQucGVuZGluZztpZihzIT09bnVsbCl7aS5zaGFyZWQucGVuZGluZz1udWxsO3ZhciBhPXMsdT1hLm5leHQ7YS5uZXh0PW51bGwsbD09PW51bGw/bz11OmwubmV4dD11LGw9YTt2YXIgYz1lLmFsdGVybmF0ZTtjIT09bnVsbCYmKGM9Yy51cGRhdGVRdWV1ZSxzPWMubGFzdEJhc2VVcGRhdGUscyE9PWwmJihzPT09bnVsbD9jLmZpcnN0QmFzZVVwZGF0ZT11OnMubmV4dD11LGMubGFzdEJhc2VVcGRhdGU9YSkpfWlmKG8hPT1udWxsKXt2YXIgZD1pLmJhc2VTdGF0ZTtsPTAsYz11PWE9bnVsbCxzPW87ZG97dmFyIGY9cy5sYW5lLGg9cy5ldmVudFRpbWU7aWYoKHImZik9PT1mKXtjIT09bnVsbCYmKGM9Yy5uZXh0PXtldmVudFRpbWU6aCxsYW5lOjAsdGFnOnMudGFnLHBheWxvYWQ6cy5wYXlsb2FkLGNhbGxiYWNrOnMuY2FsbGJhY2ssbmV4dDpudWxsfSk7ZTp7dmFyIG09ZSxnPXM7c3dpdGNoKGY9dCxoPW4sZy50YWcpe2Nhc2UgMTppZihtPWcucGF5bG9hZCx0eXBlb2YgbT09ImZ1bmN0aW9uIil7ZD1tLmNhbGwoaCxkLGYpO2JyZWFrIGV9ZD1tO2JyZWFrIGU7Y2FzZSAzOm0uZmxhZ3M9bS5mbGFncyYtNjU1Mzd8MTI4O2Nhc2UgMDppZihtPWcucGF5bG9hZCxmPXR5cGVvZiBtPT0iZnVuY3Rpb24iP20uY2FsbChoLGQsZik6bSxmPT1udWxsKWJyZWFrIGU7ZD1tdCh7fSxkLGYpO2JyZWFrIGU7Y2FzZSAyOk1pPSEwfX1zLmNhbGxiYWNrIT09bnVsbCYmcy5sYW5lIT09MCYmKGUuZmxhZ3N8PTY0LGY9aS5lZmZlY3RzLGY9PT1udWxsP2kuZWZmZWN0cz1bc106Zi5wdXNoKHMpKX1lbHNlIGg9e2V2ZW50VGltZTpoLGxhbmU6Zix0YWc6cy50YWcscGF5bG9hZDpzLnBheWxvYWQsY2FsbGJhY2s6cy5jYWxsYmFjayxuZXh0Om51bGx9LGM9PT1udWxsPyh1PWM9aCxhPWQpOmM9Yy5uZXh0PWgsbHw9ZjtpZihzPXMubmV4dCxzPT09bnVsbCl7aWYocz1pLnNoYXJlZC5wZW5kaW5nLHM9PT1udWxsKWJyZWFrO2Y9cyxzPWYubmV4dCxmLm5leHQ9bnVsbCxpLmxhc3RCYXNlVXBkYXRlPWYsaS5zaGFyZWQucGVuZGluZz1udWxsfX13aGlsZSghMCk7aWYoYz09PW51bGwmJihhPWQpLGkuYmFzZVN0YXRlPWEsaS5maXJzdEJhc2VVcGRhdGU9dSxpLmxhc3RCYXNlVXBkYXRlPWMsdD1pLnNoYXJlZC5pbnRlcmxlYXZlZCx0IT09bnVsbCl7aT10O2RvIGx8PWkubGFuZSxpPWkubmV4dDt3aGlsZShpIT09dCl9ZWxzZSBvPT09bnVsbCYmKGkuc2hhcmVkLmxhbmVzPTApO0tvfD1sLGUubGFuZXM9bCxlLm1lbW9pemVkU3RhdGU9ZH19ZnVuY3Rpb24gS3koZSx0LG4pe2lmKGU9dC5lZmZlY3RzLHQuZWZmZWN0cz1udWxsLGUhPT1udWxsKWZvcih0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciByPWVbdF0saT1yLmNhbGxiYWNrO2lmKGkhPT1udWxsKXtpZihyLmNhbGxiYWNrPW51bGwscj1uLHR5cGVvZiBpIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFUoMTkxLGkpKTtpLmNhbGwocil9fX12YXIgajE9bmV3IExfLkNvbXBvbmVudCgpLnJlZnM7ZnVuY3Rpb24gVHAoZSx0LG4scil7dD1lLm1lbW9pemVkU3RhdGUsbj1uKHIsdCksbj1uPT1udWxsP3Q6bXQoe30sdCxuKSxlLm1lbW9pemVkU3RhdGU9bixlLmxhbmVzPT09MCYmKGUudXBkYXRlUXVldWUuYmFzZVN0YXRlPW4pfXZhciBjZj17aXNNb3VudGVkOmZ1bmN0aW9uKGUpe3JldHVybihlPWUuX3JlYWN0SW50ZXJuYWxzKT9vbChlKT09PWU6ITF9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbihlLHQsbil7ZT1lLl9yZWFjdEludGVybmFsczt2YXIgcj12bigpLGk9WGkoZSksbz11aShyLGkpO28ucGF5bG9hZD10LG4hPW51bGwmJihvLmNhbGxiYWNrPW4pLHQ9R2koZSxvLGkpLHQhPT1udWxsJiYoU3IodCxlLGksciksQWModCxlLGkpKX0sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbihlLHQsbil7ZT1lLl9yZWFjdEludGVybmFsczt2YXIgcj12bigpLGk9WGkoZSksbz11aShyLGkpO28udGFnPTEsby5wYXlsb2FkPXQsbiE9bnVsbCYmKG8uY2FsbGJhY2s9biksdD1HaShlLG8saSksdCE9PW51bGwmJihTcih0LGUsaSxyKSxBYyh0LGUsaSkpfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oZSx0KXtlPWUuX3JlYWN0SW50ZXJuYWxzO3ZhciBuPXZuKCkscj1YaShlKSxpPXVpKG4scik7aS50YWc9Mix0IT1udWxsJiYoaS5jYWxsYmFjaz10KSx0PUdpKGUsaSxyKSx0IT09bnVsbCYmKFNyKHQsZSxyLG4pLEFjKHQsZSxyKSl9fTtmdW5jdGlvbiBaeShlLHQsbixyLGksbyxsKXtyZXR1cm4gZT1lLnN0YXRlTm9kZSx0eXBlb2YgZS5zaG91bGRDb21wb25lbnRVcGRhdGU9PSJmdW5jdGlvbiI/ZS5zaG91bGRDb21wb25lbnRVcGRhdGUocixvLGwpOnQucHJvdG90eXBlJiZ0LnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudD8hVmEobixyKXx8IVZhKGksbyk6ITB9ZnVuY3Rpb24gejEoZSx0LG4pe3ZhciByPSExLGk9bm8sbz10LmNvbnRleHRUeXBlO3JldHVybiB0eXBlb2Ygbz09Im9iamVjdCImJm8hPT1udWxsP289cnIobyk6KGk9VG4odCk/V286cm4uY3VycmVudCxyPXQuY29udGV4dFR5cGVzLG89KHI9ciE9bnVsbCk/bnMoZSxpKTpubyksdD1uZXcgdChuLG8pLGUubWVtb2l6ZWRTdGF0ZT10LnN0YXRlIT09bnVsbCYmdC5zdGF0ZSE9PXZvaWQgMD90LnN0YXRlOm51bGwsdC51cGRhdGVyPWNmLGUuc3RhdGVOb2RlPXQsdC5fcmVhY3RJbnRlcm5hbHM9ZSxyJiYoZT1lLnN0YXRlTm9kZSxlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9aSxlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0PW8pLHR9ZnVuY3Rpb24gR3koZSx0LG4scil7ZT10LnN0YXRlLHR5cGVvZiB0LmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM9PSJmdW5jdGlvbiImJnQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuLHIpLHR5cGVvZiB0LlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzPT0iZnVuY3Rpb24iJiZ0LlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG4sciksdC5zdGF0ZSE9PWUmJmNmLmVucXVldWVSZXBsYWNlU3RhdGUodCx0LnN0YXRlLG51bGwpfWZ1bmN0aW9uIE5wKGUsdCxuLHIpe3ZhciBpPWUuc3RhdGVOb2RlO2kucHJvcHM9bixpLnN0YXRlPWUubWVtb2l6ZWRTdGF0ZSxpLnJlZnM9ajEsQ2coZSk7dmFyIG89dC5jb250ZXh0VHlwZTt0eXBlb2Ygbz09Im9iamVjdCImJm8hPT1udWxsP2kuY29udGV4dD1ycihvKToobz1Ubih0KT9Xbzpybi5jdXJyZW50LGkuY29udGV4dD1ucyhlLG8pKSxpLnN0YXRlPWUubWVtb2l6ZWRTdGF0ZSxvPXQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLHR5cGVvZiBvPT0iZnVuY3Rpb24iJiYoVHAoZSx0LG8sbiksaS5zdGF0ZT1lLm1lbW9pemVkU3RhdGUpLHR5cGVvZiB0LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcz09ImZ1bmN0aW9uInx8dHlwZW9mIGkuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiJ8fHR5cGVvZiBpLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiImJnR5cGVvZiBpLmNvbXBvbmVudFdpbGxNb3VudCE9ImZ1bmN0aW9uInx8KHQ9aS5zdGF0ZSx0eXBlb2YgaS5jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJmkuY29tcG9uZW50V2lsbE1vdW50KCksdHlwZW9mIGkuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmaS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCksdCE9PWkuc3RhdGUmJmNmLmVucXVldWVSZXBsYWNlU3RhdGUoaSxpLnN0YXRlLG51bGwpLGNkKGUsbixpLHIpLGkuc3RhdGU9ZS5tZW1vaXplZFN0YXRlKSx0eXBlb2YgaS5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIiYmKGUuZmxhZ3N8PTQxOTQzMDgpfWZ1bmN0aW9uIEtzKGUsdCxuKXtpZihlPW4ucmVmLGUhPT1udWxsJiZ0eXBlb2YgZSE9ImZ1bmN0aW9uIiYmdHlwZW9mIGUhPSJvYmplY3QiKXtpZihuLl9vd25lcil7aWYobj1uLl9vd25lcixuKXtpZihuLnRhZyE9PTEpdGhyb3cgRXJyb3IoVSgzMDkpKTt2YXIgcj1uLnN0YXRlTm9kZX1pZighcil0aHJvdyBFcnJvcihVKDE0NyxlKSk7dmFyIGk9cixvPSIiK2U7cmV0dXJuIHQhPT1udWxsJiZ0LnJlZiE9PW51bGwmJnR5cGVvZiB0LnJlZj09ImZ1bmN0aW9uIiYmdC5yZWYuX3N0cmluZ1JlZj09PW8/dC5yZWY6KHQ9ZnVuY3Rpb24obCl7dmFyIHM9aS5yZWZzO3M9PT1qMSYmKHM9aS5yZWZzPXt9KSxsPT09bnVsbD9kZWxldGUgc1tvXTpzW29dPWx9LHQuX3N0cmluZ1JlZj1vLHQpfWlmKHR5cGVvZiBlIT0ic3RyaW5nIil0aHJvdyBFcnJvcihVKDI4NCkpO2lmKCFuLl9vd25lcil0aHJvdyBFcnJvcihVKDI5MCxlKSl9cmV0dXJuIGV9ZnVuY3Rpb24gc2MoZSx0KXt0aHJvdyBlPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSxFcnJvcihVKDMxLGU9PT0iW29iamVjdCBPYmplY3RdIj8ib2JqZWN0IHdpdGgga2V5cyB7IitPYmplY3Qua2V5cyh0KS5qb2luKCIsICIpKyJ9IjplKSl9ZnVuY3Rpb24gWXkoZSl7dmFyIHQ9ZS5faW5pdDtyZXR1cm4gdChlLl9wYXlsb2FkKX1mdW5jdGlvbiBGMShlKXtmdW5jdGlvbiB0KHYseSl7aWYoZSl7dmFyIF89di5kZWxldGlvbnM7Xz09PW51bGw/KHYuZGVsZXRpb25zPVt5XSx2LmZsYWdzfD0xNik6Xy5wdXNoKHkpfX1mdW5jdGlvbiBuKHYseSl7aWYoIWUpcmV0dXJuIG51bGw7Zm9yKDt5IT09bnVsbDspdCh2LHkpLHk9eS5zaWJsaW5nO3JldHVybiBudWxsfWZ1bmN0aW9uIHIodix5KXtmb3Iodj1uZXcgTWFwO3khPT1udWxsOyl5LmtleSE9PW51bGw/di5zZXQoeS5rZXkseSk6di5zZXQoeS5pbmRleCx5KSx5PXkuc2libGluZztyZXR1cm4gdn1mdW5jdGlvbiBpKHYseSl7cmV0dXJuIHY9UWkodix5KSx2LmluZGV4PTAsdi5zaWJsaW5nPW51bGwsdn1mdW5jdGlvbiBvKHYseSxfKXtyZXR1cm4gdi5pbmRleD1fLGU/KF89di5hbHRlcm5hdGUsXyE9PW51bGw/KF89Xy5pbmRleCxfPHk/KHYuZmxhZ3N8PTIseSk6Xyk6KHYuZmxhZ3N8PTIseSkpOih2LmZsYWdzfD0xMDQ4NTc2LHkpfWZ1bmN0aW9uIGwodil7cmV0dXJuIGUmJnYuYWx0ZXJuYXRlPT09bnVsbCYmKHYuZmxhZ3N8PTIpLHZ9ZnVuY3Rpb24gcyh2LHksXyxTKXtyZXR1cm4geT09PW51bGx8fHkudGFnIT09Nj8oeT1iaChfLHYubW9kZSxTKSx5LnJldHVybj12LHkpOih5PWkoeSxfKSx5LnJldHVybj12LHkpfWZ1bmN0aW9uIGEodix5LF8sUyl7dmFyIEU9Xy50eXBlO3JldHVybiBFPT09VGw/Yyh2LHksXy5wcm9wcy5jaGlsZHJlbixTLF8ua2V5KTp5IT09bnVsbCYmKHkuZWxlbWVudFR5cGU9PT1FfHx0eXBlb2YgRT09Im9iamVjdCImJkUhPT1udWxsJiZFLiQkdHlwZW9mPT09QWkmJll5KEUpPT09eS50eXBlKT8oUz1pKHksXy5wcm9wcyksUy5yZWY9S3Modix5LF8pLFMucmV0dXJuPXYsUyk6KFM9emMoXy50eXBlLF8ua2V5LF8ucHJvcHMsbnVsbCx2Lm1vZGUsUyksUy5yZWY9S3Modix5LF8pLFMucmV0dXJuPXYsUyl9ZnVuY3Rpb24gdSh2LHksXyxTKXtyZXR1cm4geT09PW51bGx8fHkudGFnIT09NHx8eS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyE9PV8uY29udGFpbmVySW5mb3x8eS5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24hPT1fLmltcGxlbWVudGF0aW9uPyh5PVRoKF8sdi5tb2RlLFMpLHkucmV0dXJuPXYseSk6KHk9aSh5LF8uY2hpbGRyZW58fFtdKSx5LnJldHVybj12LHkpfWZ1bmN0aW9uIGModix5LF8sUyxFKXtyZXR1cm4geT09PW51bGx8fHkudGFnIT09Nz8oeT1JbyhfLHYubW9kZSxTLEUpLHkucmV0dXJuPXYseSk6KHk9aSh5LF8pLHkucmV0dXJuPXYseSl9ZnVuY3Rpb24gZCh2LHksXyl7aWYodHlwZW9mIHk9PSJzdHJpbmciJiZ5IT09IiJ8fHR5cGVvZiB5PT0ibnVtYmVyIilyZXR1cm4geT1iaCgiIit5LHYubW9kZSxfKSx5LnJldHVybj12LHk7aWYodHlwZW9mIHk9PSJvYmplY3QiJiZ5IT09bnVsbCl7c3dpdGNoKHkuJCR0eXBlb2Ype2Nhc2UgWHU6cmV0dXJuIF89emMoeS50eXBlLHkua2V5LHkucHJvcHMsbnVsbCx2Lm1vZGUsXyksXy5yZWY9S3ModixudWxsLHkpLF8ucmV0dXJuPXYsXztjYXNlIGJsOnJldHVybiB5PVRoKHksdi5tb2RlLF8pLHkucmV0dXJuPXYseTtjYXNlIEFpOnZhciBTPXkuX2luaXQ7cmV0dXJuIGQodixTKHkuX3BheWxvYWQpLF8pfWlmKHNhKHkpfHxCcyh5KSlyZXR1cm4geT1Jbyh5LHYubW9kZSxfLG51bGwpLHkucmV0dXJuPXYseTtzYyh2LHkpfXJldHVybiBudWxsfWZ1bmN0aW9uIGYodix5LF8sUyl7dmFyIEU9eSE9PW51bGw/eS5rZXk6bnVsbDtpZih0eXBlb2YgXz09InN0cmluZyImJl8hPT0iInx8dHlwZW9mIF89PSJudW1iZXIiKXJldHVybiBFIT09bnVsbD9udWxsOnModix5LCIiK18sUyk7aWYodHlwZW9mIF89PSJvYmplY3QiJiZfIT09bnVsbCl7c3dpdGNoKF8uJCR0eXBlb2Ype2Nhc2UgWHU6cmV0dXJuIF8ua2V5PT09RT9hKHYseSxfLFMpOm51bGw7Y2FzZSBibDpyZXR1cm4gXy5rZXk9PT1FP3Uodix5LF8sUyk6bnVsbDtjYXNlIEFpOnJldHVybiBFPV8uX2luaXQsZih2LHksRShfLl9wYXlsb2FkKSxTKX1pZihzYShfKXx8QnMoXykpcmV0dXJuIEUhPT1udWxsP251bGw6Yyh2LHksXyxTLG51bGwpO3NjKHYsXyl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gaCh2LHksXyxTLEUpe2lmKHR5cGVvZiBTPT0ic3RyaW5nIiYmUyE9PSIifHx0eXBlb2YgUz09Im51bWJlciIpcmV0dXJuIHY9di5nZXQoXyl8fG51bGwscyh5LHYsIiIrUyxFKTtpZih0eXBlb2YgUz09Im9iamVjdCImJlMhPT1udWxsKXtzd2l0Y2goUy4kJHR5cGVvZil7Y2FzZSBYdTpyZXR1cm4gdj12LmdldChTLmtleT09PW51bGw/XzpTLmtleSl8fG51bGwsYSh5LHYsUyxFKTtjYXNlIGJsOnJldHVybiB2PXYuZ2V0KFMua2V5PT09bnVsbD9fOlMua2V5KXx8bnVsbCx1KHksdixTLEUpO2Nhc2UgQWk6dmFyICQ9Uy5faW5pdDtyZXR1cm4gaCh2LHksXywkKFMuX3BheWxvYWQpLEUpfWlmKHNhKFMpfHxCcyhTKSlyZXR1cm4gdj12LmdldChfKXx8bnVsbCxjKHksdixTLEUsbnVsbCk7c2MoeSxTKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBtKHYseSxfLFMpe2Zvcih2YXIgRT1udWxsLCQ9bnVsbCxDPXksVD15PTAsTj1udWxsO0MhPT1udWxsJiZUPF8ubGVuZ3RoO1QrKyl7Qy5pbmRleD5UPyhOPUMsQz1udWxsKTpOPUMuc2libGluZzt2YXIgUj1mKHYsQyxfW1RdLFMpO2lmKFI9PT1udWxsKXtDPT09bnVsbCYmKEM9Tik7YnJlYWt9ZSYmQyYmUi5hbHRlcm5hdGU9PT1udWxsJiZ0KHYsQykseT1vKFIseSxUKSwkPT09bnVsbD9FPVI6JC5zaWJsaW5nPVIsJD1SLEM9Tn1pZihUPT09Xy5sZW5ndGgpcmV0dXJuIG4odixDKSxvdCYmYm8odixUKSxFO2lmKEM9PT1udWxsKXtmb3IoO1Q8Xy5sZW5ndGg7VCsrKUM9ZCh2LF9bVF0sUyksQyE9PW51bGwmJih5PW8oQyx5LFQpLCQ9PT1udWxsP0U9QzokLnNpYmxpbmc9QywkPUMpO3JldHVybiBvdCYmYm8odixUKSxFfWZvcihDPXIodixDKTtUPF8ubGVuZ3RoO1QrKylOPWgoQyx2LFQsX1tUXSxTKSxOIT09bnVsbCYmKGUmJk4uYWx0ZXJuYXRlIT09bnVsbCYmQy5kZWxldGUoTi5rZXk9PT1udWxsP1Q6Ti5rZXkpLHk9byhOLHksVCksJD09PW51bGw/RT1OOiQuc2libGluZz1OLCQ9Tik7cmV0dXJuIGUmJkMuZm9yRWFjaChmdW5jdGlvbihEKXtyZXR1cm4gdCh2LEQpfSksb3QmJmJvKHYsVCksRX1mdW5jdGlvbiBnKHYseSxfLFMpe3ZhciBFPUJzKF8pO2lmKHR5cGVvZiBFIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFUoMTUwKSk7aWYoXz1FLmNhbGwoXyksXz09bnVsbCl0aHJvdyBFcnJvcihVKDE1MSkpO2Zvcih2YXIgJD1FPW51bGwsQz15LFQ9eT0wLE49bnVsbCxSPV8ubmV4dCgpO0MhPT1udWxsJiYhUi5kb25lO1QrKyxSPV8ubmV4dCgpKXtDLmluZGV4PlQ/KE49QyxDPW51bGwpOk49Qy5zaWJsaW5nO3ZhciBEPWYodixDLFIudmFsdWUsUyk7aWYoRD09PW51bGwpe0M9PT1udWxsJiYoQz1OKTticmVha31lJiZDJiZELmFsdGVybmF0ZT09PW51bGwmJnQodixDKSx5PW8oRCx5LFQpLCQ9PT1udWxsP0U9RDokLnNpYmxpbmc9RCwkPUQsQz1OfWlmKFIuZG9uZSlyZXR1cm4gbih2LEMpLG90JiZibyh2LFQpLEU7aWYoQz09PW51bGwpe2Zvcig7IVIuZG9uZTtUKyssUj1fLm5leHQoKSlSPWQodixSLnZhbHVlLFMpLFIhPT1udWxsJiYoeT1vKFIseSxUKSwkPT09bnVsbD9FPVI6JC5zaWJsaW5nPVIsJD1SKTtyZXR1cm4gb3QmJmJvKHYsVCksRX1mb3IoQz1yKHYsQyk7IVIuZG9uZTtUKyssUj1fLm5leHQoKSlSPWgoQyx2LFQsUi52YWx1ZSxTKSxSIT09bnVsbCYmKGUmJlIuYWx0ZXJuYXRlIT09bnVsbCYmQy5kZWxldGUoUi5rZXk9PT1udWxsP1Q6Ui5rZXkpLHk9byhSLHksVCksJD09PW51bGw/RT1SOiQuc2libGluZz1SLCQ9Uik7cmV0dXJuIGUmJkMuZm9yRWFjaChmdW5jdGlvbihGKXtyZXR1cm4gdCh2LEYpfSksb3QmJmJvKHYsVCksRX1mdW5jdGlvbiB3KHYseSxfLFMpe2lmKHR5cGVvZiBfPT0ib2JqZWN0IiYmXyE9PW51bGwmJl8udHlwZT09PVRsJiZfLmtleT09PW51bGwmJihfPV8ucHJvcHMuY2hpbGRyZW4pLHR5cGVvZiBfPT0ib2JqZWN0IiYmXyE9PW51bGwpe3N3aXRjaChfLiQkdHlwZW9mKXtjYXNlIFh1OmU6e2Zvcih2YXIgRT1fLmtleSwkPXk7JCE9PW51bGw7KXtpZigkLmtleT09PUUpe2lmKEU9Xy50eXBlLEU9PT1UbCl7aWYoJC50YWc9PT03KXtuKHYsJC5zaWJsaW5nKSx5PWkoJCxfLnByb3BzLmNoaWxkcmVuKSx5LnJldHVybj12LHY9eTticmVhayBlfX1lbHNlIGlmKCQuZWxlbWVudFR5cGU9PT1FfHx0eXBlb2YgRT09Im9iamVjdCImJkUhPT1udWxsJiZFLiQkdHlwZW9mPT09QWkmJll5KEUpPT09JC50eXBlKXtuKHYsJC5zaWJsaW5nKSx5PWkoJCxfLnByb3BzKSx5LnJlZj1Lcyh2LCQsXykseS5yZXR1cm49dix2PXk7YnJlYWsgZX1uKHYsJCk7YnJlYWt9ZWxzZSB0KHYsJCk7JD0kLnNpYmxpbmd9Xy50eXBlPT09VGw/KHk9SW8oXy5wcm9wcy5jaGlsZHJlbix2Lm1vZGUsUyxfLmtleSkseS5yZXR1cm49dix2PXkpOihTPXpjKF8udHlwZSxfLmtleSxfLnByb3BzLG51bGwsdi5tb2RlLFMpLFMucmVmPUtzKHYseSxfKSxTLnJldHVybj12LHY9Uyl9cmV0dXJuIGwodik7Y2FzZSBibDplOntmb3IoJD1fLmtleTt5IT09bnVsbDspe2lmKHkua2V5PT09JClpZih5LnRhZz09PTQmJnkuc3RhdGVOb2RlLmNvbnRhaW5lckluZm89PT1fLmNvbnRhaW5lckluZm8mJnkuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uPT09Xy5pbXBsZW1lbnRhdGlvbil7bih2LHkuc2libGluZykseT1pKHksXy5jaGlsZHJlbnx8W10pLHkucmV0dXJuPXYsdj15O2JyZWFrIGV9ZWxzZXtuKHYseSk7YnJlYWt9ZWxzZSB0KHYseSk7eT15LnNpYmxpbmd9eT1UaChfLHYubW9kZSxTKSx5LnJldHVybj12LHY9eX1yZXR1cm4gbCh2KTtjYXNlIEFpOnJldHVybiAkPV8uX2luaXQsdyh2LHksJChfLl9wYXlsb2FkKSxTKX1pZihzYShfKSlyZXR1cm4gbSh2LHksXyxTKTtpZihCcyhfKSlyZXR1cm4gZyh2LHksXyxTKTtzYyh2LF8pfXJldHVybiB0eXBlb2YgXz09InN0cmluZyImJl8hPT0iInx8dHlwZW9mIF89PSJudW1iZXIiPyhfPSIiK18seSE9PW51bGwmJnkudGFnPT09Nj8obih2LHkuc2libGluZykseT1pKHksXykseS5yZXR1cm49dix2PXkpOihuKHYseSkseT1iaChfLHYubW9kZSxTKSx5LnJldHVybj12LHY9eSksbCh2KSk6bih2LHkpfXJldHVybiB3fXZhciBpcz1GMSghMCksQjE9RjEoITEpLEF1PXt9LEZyPWdvKEF1KSxHYT1nbyhBdSksWWE9Z28oQXUpO2Z1bmN0aW9uIEFvKGUpe2lmKGU9PT1BdSl0aHJvdyBFcnJvcihVKDE3NCkpO3JldHVybiBlfWZ1bmN0aW9uIGtnKGUsdCl7c3dpdGNoKFhlKFlhLHQpLFhlKEdhLGUpLFhlKEZyLEF1KSxlPXQubm9kZVR5cGUsZSl7Y2FzZSA5OmNhc2UgMTE6dD0odD10LmRvY3VtZW50RWxlbWVudCk/dC5uYW1lc3BhY2VVUkk6c3AobnVsbCwiIik7YnJlYWs7ZGVmYXVsdDplPWU9PT04P3QucGFyZW50Tm9kZTp0LHQ9ZS5uYW1lc3BhY2VVUkl8fG51bGwsZT1lLnRhZ05hbWUsdD1zcCh0LGUpfWl0KEZyKSxYZShGcix0KX1mdW5jdGlvbiBvcygpe2l0KEZyKSxpdChHYSksaXQoWWEpfWZ1bmN0aW9uIFUxKGUpe0FvKFlhLmN1cnJlbnQpO3ZhciB0PUFvKEZyLmN1cnJlbnQpLG49c3AodCxlLnR5cGUpO3QhPT1uJiYoWGUoR2EsZSksWGUoRnIsbikpfWZ1bmN0aW9uICRnKGUpe0dhLmN1cnJlbnQ9PT1lJiYoaXQoRnIpLGl0KEdhKSl9dmFyIGR0PWdvKDApO2Z1bmN0aW9uIGRkKGUpe2Zvcih2YXIgdD1lO3QhPT1udWxsOyl7aWYodC50YWc9PT0xMyl7dmFyIG49dC5tZW1vaXplZFN0YXRlO2lmKG4hPT1udWxsJiYobj1uLmRlaHlkcmF0ZWQsbj09PW51bGx8fG4uZGF0YT09PSIkPyJ8fG4uZGF0YT09PSIkISIpKXJldHVybiB0fWVsc2UgaWYodC50YWc9PT0xOSYmdC5tZW1vaXplZFByb3BzLnJldmVhbE9yZGVyIT09dm9pZCAwKXtpZih0LmZsYWdzJjEyOClyZXR1cm4gdH1lbHNlIGlmKHQuY2hpbGQhPT1udWxsKXt0LmNoaWxkLnJldHVybj10LHQ9dC5jaGlsZDtjb250aW51ZX1pZih0PT09ZSlicmVhaztmb3IoO3Quc2libGluZz09PW51bGw7KXtpZih0LnJldHVybj09PW51bGx8fHQucmV0dXJuPT09ZSlyZXR1cm4gbnVsbDt0PXQucmV0dXJufXQuc2libGluZy5yZXR1cm49dC5yZXR1cm4sdD10LnNpYmxpbmd9cmV0dXJuIG51bGx9dmFyIHdoPVtdO2Z1bmN0aW9uIGJnKCl7Zm9yKHZhciBlPTA7ZTx3aC5sZW5ndGg7ZSsrKXdoW2VdLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5PW51bGw7d2gubGVuZ3RoPTB9dmFyIE1jPXhpLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsU2g9eGkuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsSG89MCxodD1udWxsLFJ0PW51bGwsTHQ9bnVsbCxmZD0hMSx4YT0hMSxYYT0wLGxUPTA7ZnVuY3Rpb24gWXQoKXt0aHJvdyBFcnJvcihVKDMyMSkpfWZ1bmN0aW9uIFRnKGUsdCl7aWYodD09PW51bGwpcmV0dXJuITE7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aCYmbjxlLmxlbmd0aDtuKyspaWYoIWtyKGVbbl0sdFtuXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gTmcoZSx0LG4scixpLG8pe2lmKEhvPW8saHQ9dCx0Lm1lbW9pemVkU3RhdGU9bnVsbCx0LnVwZGF0ZVF1ZXVlPW51bGwsdC5sYW5lcz0wLE1jLmN1cnJlbnQ9ZT09PW51bGx8fGUubWVtb2l6ZWRTdGF0ZT09PW51bGw/Y1Q6ZFQsZT1uKHIsaSkseGEpe289MDtkb3tpZih4YT0hMSxYYT0wLDI1PD1vKXRocm93IEVycm9yKFUoMzAxKSk7bys9MSxMdD1SdD1udWxsLHQudXBkYXRlUXVldWU9bnVsbCxNYy5jdXJyZW50PWZULGU9bihyLGkpfXdoaWxlKHhhKX1pZihNYy5jdXJyZW50PWhkLHQ9UnQhPT1udWxsJiZSdC5uZXh0IT09bnVsbCxIbz0wLEx0PVJ0PWh0PW51bGwsZmQ9ITEsdCl0aHJvdyBFcnJvcihVKDMwMCkpO3JldHVybiBlfWZ1bmN0aW9uIFJnKCl7dmFyIGU9WGEhPT0wO3JldHVybiBYYT0wLGV9ZnVuY3Rpb24gUHIoKXt2YXIgZT17bWVtb2l6ZWRTdGF0ZTpudWxsLGJhc2VTdGF0ZTpudWxsLGJhc2VRdWV1ZTpudWxsLHF1ZXVlOm51bGwsbmV4dDpudWxsfTtyZXR1cm4gTHQ9PT1udWxsP2h0Lm1lbW9pemVkU3RhdGU9THQ9ZTpMdD1MdC5uZXh0PWUsTHR9ZnVuY3Rpb24gaXIoKXtpZihSdD09PW51bGwpe3ZhciBlPWh0LmFsdGVybmF0ZTtlPWUhPT1udWxsP2UubWVtb2l6ZWRTdGF0ZTpudWxsfWVsc2UgZT1SdC5uZXh0O3ZhciB0PUx0PT09bnVsbD9odC5tZW1vaXplZFN0YXRlOkx0Lm5leHQ7aWYodCE9PW51bGwpTHQ9dCxSdD1lO2Vsc2V7aWYoZT09PW51bGwpdGhyb3cgRXJyb3IoVSgzMTApKTtSdD1lLGU9e21lbW9pemVkU3RhdGU6UnQubWVtb2l6ZWRTdGF0ZSxiYXNlU3RhdGU6UnQuYmFzZVN0YXRlLGJhc2VRdWV1ZTpSdC5iYXNlUXVldWUscXVldWU6UnQucXVldWUsbmV4dDpudWxsfSxMdD09PW51bGw/aHQubWVtb2l6ZWRTdGF0ZT1MdD1lOkx0PUx0Lm5leHQ9ZX1yZXR1cm4gTHR9ZnVuY3Rpb24gUWEoZSx0KXtyZXR1cm4gdHlwZW9mIHQ9PSJmdW5jdGlvbiI/dChlKTp0fWZ1bmN0aW9uIEVoKGUpe3ZhciB0PWlyKCksbj10LnF1ZXVlO2lmKG49PT1udWxsKXRocm93IEVycm9yKFUoMzExKSk7bi5sYXN0UmVuZGVyZWRSZWR1Y2VyPWU7dmFyIHI9UnQsaT1yLmJhc2VRdWV1ZSxvPW4ucGVuZGluZztpZihvIT09bnVsbCl7aWYoaSE9PW51bGwpe3ZhciBsPWkubmV4dDtpLm5leHQ9by5uZXh0LG8ubmV4dD1sfXIuYmFzZVF1ZXVlPWk9byxuLnBlbmRpbmc9bnVsbH1pZihpIT09bnVsbCl7bz1pLm5leHQscj1yLmJhc2VTdGF0ZTt2YXIgcz1sPW51bGwsYT1udWxsLHU9bztkb3t2YXIgYz11LmxhbmU7aWYoKEhvJmMpPT09YylhIT09bnVsbCYmKGE9YS5uZXh0PXtsYW5lOjAsYWN0aW9uOnUuYWN0aW9uLGhhc0VhZ2VyU3RhdGU6dS5oYXNFYWdlclN0YXRlLGVhZ2VyU3RhdGU6dS5lYWdlclN0YXRlLG5leHQ6bnVsbH0pLHI9dS5oYXNFYWdlclN0YXRlP3UuZWFnZXJTdGF0ZTplKHIsdS5hY3Rpb24pO2Vsc2V7dmFyIGQ9e2xhbmU6YyxhY3Rpb246dS5hY3Rpb24saGFzRWFnZXJTdGF0ZTp1Lmhhc0VhZ2VyU3RhdGUsZWFnZXJTdGF0ZTp1LmVhZ2VyU3RhdGUsbmV4dDpudWxsfTthPT09bnVsbD8ocz1hPWQsbD1yKTphPWEubmV4dD1kLGh0LmxhbmVzfD1jLEtvfD1jfXU9dS5uZXh0fXdoaWxlKHUhPT1udWxsJiZ1IT09byk7YT09PW51bGw/bD1yOmEubmV4dD1zLGtyKHIsdC5tZW1vaXplZFN0YXRlKXx8KCRuPSEwKSx0Lm1lbW9pemVkU3RhdGU9cix0LmJhc2VTdGF0ZT1sLHQuYmFzZVF1ZXVlPWEsbi5sYXN0UmVuZGVyZWRTdGF0ZT1yfWlmKGU9bi5pbnRlcmxlYXZlZCxlIT09bnVsbCl7aT1lO2RvIG89aS5sYW5lLGh0LmxhbmVzfD1vLEtvfD1vLGk9aS5uZXh0O3doaWxlKGkhPT1lKX1lbHNlIGk9PT1udWxsJiYobi5sYW5lcz0wKTtyZXR1cm5bdC5tZW1vaXplZFN0YXRlLG4uZGlzcGF0Y2hdfWZ1bmN0aW9uIENoKGUpe3ZhciB0PWlyKCksbj10LnF1ZXVlO2lmKG49PT1udWxsKXRocm93IEVycm9yKFUoMzExKSk7bi5sYXN0UmVuZGVyZWRSZWR1Y2VyPWU7dmFyIHI9bi5kaXNwYXRjaCxpPW4ucGVuZGluZyxvPXQubWVtb2l6ZWRTdGF0ZTtpZihpIT09bnVsbCl7bi5wZW5kaW5nPW51bGw7dmFyIGw9aT1pLm5leHQ7ZG8gbz1lKG8sbC5hY3Rpb24pLGw9bC5uZXh0O3doaWxlKGwhPT1pKTtrcihvLHQubWVtb2l6ZWRTdGF0ZSl8fCgkbj0hMCksdC5tZW1vaXplZFN0YXRlPW8sdC5iYXNlUXVldWU9PT1udWxsJiYodC5iYXNlU3RhdGU9byksbi5sYXN0UmVuZGVyZWRTdGF0ZT1vfXJldHVybltvLHJdfWZ1bmN0aW9uIFcxKCl7fWZ1bmN0aW9uIFYxKGUsdCl7dmFyIG49aHQscj1pcigpLGk9dCgpLG89IWtyKHIubWVtb2l6ZWRTdGF0ZSxpKTtpZihvJiYoci5tZW1vaXplZFN0YXRlPWksJG49ITApLHI9ci5xdWV1ZSxPZyhaMS5iaW5kKG51bGwsbixyLGUpLFtlXSksci5nZXRTbmFwc2hvdCE9PXR8fG98fEx0IT09bnVsbCYmTHQubWVtb2l6ZWRTdGF0ZS50YWcmMSl7aWYobi5mbGFnc3w9MjA0OCxKYSg5LEsxLmJpbmQobnVsbCxuLHIsaSx0KSx2b2lkIDAsbnVsbCksQnQ9PT1udWxsKXRocm93IEVycm9yKFUoMzQ5KSk7SG8mMzB8fEgxKG4sdCxpKX1yZXR1cm4gaX1mdW5jdGlvbiBIMShlLHQsbil7ZS5mbGFnc3w9MTYzODQsZT17Z2V0U25hcHNob3Q6dCx2YWx1ZTpufSx0PWh0LnVwZGF0ZVF1ZXVlLHQ9PT1udWxsPyh0PXtsYXN0RWZmZWN0Om51bGwsc3RvcmVzOm51bGx9LGh0LnVwZGF0ZVF1ZXVlPXQsdC5zdG9yZXM9W2VdKToobj10LnN0b3JlcyxuPT09bnVsbD90LnN0b3Jlcz1bZV06bi5wdXNoKGUpKX1mdW5jdGlvbiBLMShlLHQsbixyKXt0LnZhbHVlPW4sdC5nZXRTbmFwc2hvdD1yLEcxKHQpJiZZMShlKX1mdW5jdGlvbiBaMShlLHQsbil7cmV0dXJuIG4oZnVuY3Rpb24oKXtHMSh0KSYmWTEoZSl9KX1mdW5jdGlvbiBHMShlKXt2YXIgdD1lLmdldFNuYXBzaG90O2U9ZS52YWx1ZTt0cnl7dmFyIG49dCgpO3JldHVybiFrcihlLG4pfWNhdGNoe3JldHVybiEwfX1mdW5jdGlvbiBZMShlKXt2YXIgdD1oaShlLDEpO3QhPT1udWxsJiZTcih0LGUsMSwtMSl9ZnVuY3Rpb24gWHkoZSl7dmFyIHQ9UHIoKTtyZXR1cm4gdHlwZW9mIGU9PSJmdW5jdGlvbiImJihlPWUoKSksdC5tZW1vaXplZFN0YXRlPXQuYmFzZVN0YXRlPWUsZT17cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6UWEsbGFzdFJlbmRlcmVkU3RhdGU6ZX0sdC5xdWV1ZT1lLGU9ZS5kaXNwYXRjaD11VC5iaW5kKG51bGwsaHQsZSksW3QubWVtb2l6ZWRTdGF0ZSxlXX1mdW5jdGlvbiBKYShlLHQsbixyKXtyZXR1cm4gZT17dGFnOmUsY3JlYXRlOnQsZGVzdHJveTpuLGRlcHM6cixuZXh0Om51bGx9LHQ9aHQudXBkYXRlUXVldWUsdD09PW51bGw/KHQ9e2xhc3RFZmZlY3Q6bnVsbCxzdG9yZXM6bnVsbH0saHQudXBkYXRlUXVldWU9dCx0Lmxhc3RFZmZlY3Q9ZS5uZXh0PWUpOihuPXQubGFzdEVmZmVjdCxuPT09bnVsbD90Lmxhc3RFZmZlY3Q9ZS5uZXh0PWU6KHI9bi5uZXh0LG4ubmV4dD1lLGUubmV4dD1yLHQubGFzdEVmZmVjdD1lKSksZX1mdW5jdGlvbiBYMSgpe3JldHVybiBpcigpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gRGMoZSx0LG4scil7dmFyIGk9UHIoKTtodC5mbGFnc3w9ZSxpLm1lbW9pemVkU3RhdGU9SmEoMXx0LG4sdm9pZCAwLHI9PT12b2lkIDA/bnVsbDpyKX1mdW5jdGlvbiBkZihlLHQsbixyKXt2YXIgaT1pcigpO3I9cj09PXZvaWQgMD9udWxsOnI7dmFyIG89dm9pZCAwO2lmKFJ0IT09bnVsbCl7dmFyIGw9UnQubWVtb2l6ZWRTdGF0ZTtpZihvPWwuZGVzdHJveSxyIT09bnVsbCYmVGcocixsLmRlcHMpKXtpLm1lbW9pemVkU3RhdGU9SmEodCxuLG8scik7cmV0dXJufX1odC5mbGFnc3w9ZSxpLm1lbW9pemVkU3RhdGU9SmEoMXx0LG4sbyxyKX1mdW5jdGlvbiBReShlLHQpe3JldHVybiBEYyg4MzkwNjU2LDgsZSx0KX1mdW5jdGlvbiBPZyhlLHQpe3JldHVybiBkZigyMDQ4LDgsZSx0KX1mdW5jdGlvbiBRMShlLHQpe3JldHVybiBkZig0LDIsZSx0KX1mdW5jdGlvbiBKMShlLHQpe3JldHVybiBkZig0LDQsZSx0KX1mdW5jdGlvbiBxMShlLHQpe2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXJldHVybiBlPWUoKSx0KGUpLGZ1bmN0aW9uKCl7dChudWxsKX07aWYodCE9bnVsbClyZXR1cm4gZT1lKCksdC5jdXJyZW50PWUsZnVuY3Rpb24oKXt0LmN1cnJlbnQ9bnVsbH19ZnVuY3Rpb24gZXcoZSx0LG4pe3JldHVybiBuPW4hPW51bGw/bi5jb25jYXQoW2VdKTpudWxsLGRmKDQsNCxxMS5iaW5kKG51bGwsdCxlKSxuKX1mdW5jdGlvbiBQZygpe31mdW5jdGlvbiB0dyhlLHQpe3ZhciBuPWlyKCk7dD10PT09dm9pZCAwP251bGw6dDt2YXIgcj1uLm1lbW9pemVkU3RhdGU7cmV0dXJuIHIhPT1udWxsJiZ0IT09bnVsbCYmVGcodCxyWzFdKT9yWzBdOihuLm1lbW9pemVkU3RhdGU9W2UsdF0sZSl9ZnVuY3Rpb24gbncoZSx0KXt2YXIgbj1pcigpO3Q9dD09PXZvaWQgMD9udWxsOnQ7dmFyIHI9bi5tZW1vaXplZFN0YXRlO3JldHVybiByIT09bnVsbCYmdCE9PW51bGwmJlRnKHQsclsxXSk/clswXTooZT1lKCksbi5tZW1vaXplZFN0YXRlPVtlLHRdLGUpfWZ1bmN0aW9uIHJ3KGUsdCxuKXtyZXR1cm4gSG8mMjE/KGtyKG4sdCl8fChuPWwxKCksaHQubGFuZXN8PW4sS298PW4sZS5iYXNlU3RhdGU9ITApLHQpOihlLmJhc2VTdGF0ZSYmKGUuYmFzZVN0YXRlPSExLCRuPSEwKSxlLm1lbW9pemVkU3RhdGU9bil9ZnVuY3Rpb24gc1QoZSx0KXt2YXIgbj1VZTtVZT1uIT09MCYmND5uP246NCxlKCEwKTt2YXIgcj1TaC50cmFuc2l0aW9uO1NoLnRyYW5zaXRpb249e307dHJ5e2UoITEpLHQoKX1maW5hbGx5e1VlPW4sU2gudHJhbnNpdGlvbj1yfX1mdW5jdGlvbiBpdygpe3JldHVybiBpcigpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gYVQoZSx0LG4pe3ZhciByPVhpKGUpO2lmKG49e2xhbmU6cixhY3Rpb246bixoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9LG93KGUpKWx3KHQsbik7ZWxzZSBpZihuPUwxKGUsdCxuLHIpLG4hPT1udWxsKXt2YXIgaT12bigpO1NyKG4sZSxyLGkpLHN3KG4sdCxyKX19ZnVuY3Rpb24gdVQoZSx0LG4pe3ZhciByPVhpKGUpLGk9e2xhbmU6cixhY3Rpb246bixoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9O2lmKG93KGUpKWx3KHQsaSk7ZWxzZXt2YXIgbz1lLmFsdGVybmF0ZTtpZihlLmxhbmVzPT09MCYmKG89PT1udWxsfHxvLmxhbmVzPT09MCkmJihvPXQubGFzdFJlbmRlcmVkUmVkdWNlcixvIT09bnVsbCkpdHJ5e3ZhciBsPXQubGFzdFJlbmRlcmVkU3RhdGUscz1vKGwsbik7aWYoaS5oYXNFYWdlclN0YXRlPSEwLGkuZWFnZXJTdGF0ZT1zLGtyKHMsbCkpe3ZhciBhPXQuaW50ZXJsZWF2ZWQ7YT09PW51bGw/KGkubmV4dD1pLEVnKHQpKTooaS5uZXh0PWEubmV4dCxhLm5leHQ9aSksdC5pbnRlcmxlYXZlZD1pO3JldHVybn19Y2F0Y2h7fWZpbmFsbHl7fW49TDEoZSx0LGksciksbiE9PW51bGwmJihpPXZuKCksU3IobixlLHIsaSksc3cobix0LHIpKX19ZnVuY3Rpb24gb3coZSl7dmFyIHQ9ZS5hbHRlcm5hdGU7cmV0dXJuIGU9PT1odHx8dCE9PW51bGwmJnQ9PT1odH1mdW5jdGlvbiBsdyhlLHQpe3hhPWZkPSEwO3ZhciBuPWUucGVuZGluZztuPT09bnVsbD90Lm5leHQ9dDoodC5uZXh0PW4ubmV4dCxuLm5leHQ9dCksZS5wZW5kaW5nPXR9ZnVuY3Rpb24gc3coZSx0LG4pe2lmKG4mNDE5NDI0MCl7dmFyIHI9dC5sYW5lcztyJj1lLnBlbmRpbmdMYW5lcyxufD1yLHQubGFuZXM9bix1ZyhlLG4pfX12YXIgaGQ9e3JlYWRDb250ZXh0OnJyLHVzZUNhbGxiYWNrOll0LHVzZUNvbnRleHQ6WXQsdXNlRWZmZWN0Oll0LHVzZUltcGVyYXRpdmVIYW5kbGU6WXQsdXNlSW5zZXJ0aW9uRWZmZWN0Oll0LHVzZUxheW91dEVmZmVjdDpZdCx1c2VNZW1vOll0LHVzZVJlZHVjZXI6WXQsdXNlUmVmOll0LHVzZVN0YXRlOll0LHVzZURlYnVnVmFsdWU6WXQsdXNlRGVmZXJyZWRWYWx1ZTpZdCx1c2VUcmFuc2l0aW9uOll0LHVzZU11dGFibGVTb3VyY2U6WXQsdXNlU3luY0V4dGVybmFsU3RvcmU6WXQsdXNlSWQ6WXQsdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSxjVD17cmVhZENvbnRleHQ6cnIsdXNlQ2FsbGJhY2s6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gUHIoKS5tZW1vaXplZFN0YXRlPVtlLHQ9PT12b2lkIDA/bnVsbDp0XSxlfSx1c2VDb250ZXh0OnJyLHVzZUVmZmVjdDpReSx1c2VJbXBlcmF0aXZlSGFuZGxlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj1uIT1udWxsP24uY29uY2F0KFtlXSk6bnVsbCxEYyg0MTk0MzA4LDQscTEuYmluZChudWxsLHQsZSksbil9LHVzZUxheW91dEVmZmVjdDpmdW5jdGlvbihlLHQpe3JldHVybiBEYyg0MTk0MzA4LDQsZSx0KX0sdXNlSW5zZXJ0aW9uRWZmZWN0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIERjKDQsMixlLHQpfSx1c2VNZW1vOmZ1bmN0aW9uKGUsdCl7dmFyIG49UHIoKTtyZXR1cm4gdD10PT09dm9pZCAwP251bGw6dCxlPWUoKSxuLm1lbW9pemVkU3RhdGU9W2UsdF0sZX0sdXNlUmVkdWNlcjpmdW5jdGlvbihlLHQsbil7dmFyIHI9UHIoKTtyZXR1cm4gdD1uIT09dm9pZCAwP24odCk6dCxyLm1lbW9pemVkU3RhdGU9ci5iYXNlU3RhdGU9dCxlPXtwZW5kaW5nOm51bGwsaW50ZXJsZWF2ZWQ6bnVsbCxsYW5lczowLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjplLGxhc3RSZW5kZXJlZFN0YXRlOnR9LHIucXVldWU9ZSxlPWUuZGlzcGF0Y2g9YVQuYmluZChudWxsLGh0LGUpLFtyLm1lbW9pemVkU3RhdGUsZV19LHVzZVJlZjpmdW5jdGlvbihlKXt2YXIgdD1QcigpO3JldHVybiBlPXtjdXJyZW50OmV9LHQubWVtb2l6ZWRTdGF0ZT1lfSx1c2VTdGF0ZTpYeSx1c2VEZWJ1Z1ZhbHVlOlBnLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIFByKCkubWVtb2l6ZWRTdGF0ZT1lfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9WHkoITEpLHQ9ZVswXTtyZXR1cm4gZT1zVC5iaW5kKG51bGwsZVsxXSksUHIoKS5tZW1vaXplZFN0YXRlPWUsW3QsZV19LHVzZU11dGFibGVTb3VyY2U6ZnVuY3Rpb24oKXt9LHVzZVN5bmNFeHRlcm5hbFN0b3JlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1odCxpPVByKCk7aWYob3Qpe2lmKG49PT12b2lkIDApdGhyb3cgRXJyb3IoVSg0MDcpKTtuPW4oKX1lbHNle2lmKG49dCgpLEJ0PT09bnVsbCl0aHJvdyBFcnJvcihVKDM0OSkpO0hvJjMwfHxIMShyLHQsbil9aS5tZW1vaXplZFN0YXRlPW47dmFyIG89e3ZhbHVlOm4sZ2V0U25hcHNob3Q6dH07cmV0dXJuIGkucXVldWU9byxReShaMS5iaW5kKG51bGwscixvLGUpLFtlXSksci5mbGFnc3w9MjA0OCxKYSg5LEsxLmJpbmQobnVsbCxyLG8sbix0KSx2b2lkIDAsbnVsbCksbn0sdXNlSWQ6ZnVuY3Rpb24oKXt2YXIgZT1QcigpLHQ9QnQuaWRlbnRpZmllclByZWZpeDtpZihvdCl7dmFyIG49YWkscj1zaTtuPShyJn4oMTw8MzItd3IociktMSkpLnRvU3RyaW5nKDMyKStuLHQ9IjoiK3QrIlIiK24sbj1YYSsrLDA8biYmKHQrPSJIIituLnRvU3RyaW5nKDMyKSksdCs9IjoifWVsc2Ugbj1sVCsrLHQ9IjoiK3QrInIiK24udG9TdHJpbmcoMzIpKyI6IjtyZXR1cm4gZS5tZW1vaXplZFN0YXRlPXR9LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sZFQ9e3JlYWRDb250ZXh0OnJyLHVzZUNhbGxiYWNrOnR3LHVzZUNvbnRleHQ6cnIsdXNlRWZmZWN0Ok9nLHVzZUltcGVyYXRpdmVIYW5kbGU6ZXcsdXNlSW5zZXJ0aW9uRWZmZWN0OlExLHVzZUxheW91dEVmZmVjdDpKMSx1c2VNZW1vOm53LHVzZVJlZHVjZXI6RWgsdXNlUmVmOlgxLHVzZVN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIEVoKFFhKX0sdXNlRGVidWdWYWx1ZTpQZyx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWlyKCk7cmV0dXJuIHJ3KHQsUnQubWVtb2l6ZWRTdGF0ZSxlKX0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBlPUVoKFFhKVswXSx0PWlyKCkubWVtb2l6ZWRTdGF0ZTtyZXR1cm5bZSx0XX0sdXNlTXV0YWJsZVNvdXJjZTpXMSx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpWMSx1c2VJZDppdyx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LGZUPXtyZWFkQ29udGV4dDpycix1c2VDYWxsYmFjazp0dyx1c2VDb250ZXh0OnJyLHVzZUVmZmVjdDpPZyx1c2VJbXBlcmF0aXZlSGFuZGxlOmV3LHVzZUluc2VydGlvbkVmZmVjdDpRMSx1c2VMYXlvdXRFZmZlY3Q6SjEsdXNlTWVtbzpudyx1c2VSZWR1Y2VyOkNoLHVzZVJlZjpYMSx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBDaChRYSl9LHVzZURlYnVnVmFsdWU6UGcsdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1pcigpO3JldHVybiBSdD09PW51bGw/dC5tZW1vaXplZFN0YXRlPWU6cncodCxSdC5tZW1vaXplZFN0YXRlLGUpfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9Q2goUWEpWzBdLHQ9aXIoKS5tZW1vaXplZFN0YXRlO3JldHVybltlLHRdfSx1c2VNdXRhYmxlU291cmNlOlcxLHVzZVN5bmNFeHRlcm5hbFN0b3JlOlYxLHVzZUlkOml3LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX07ZnVuY3Rpb24gbHMoZSx0KXt0cnl7dmFyIG49IiIscj10O2RvIG4rPUYkKHIpLHI9ci5yZXR1cm47d2hpbGUocik7dmFyIGk9bn1jYXRjaChvKXtpPWAKRXJyb3IgZ2VuZXJhdGluZyBzdGFjazogYCtvLm1lc3NhZ2UrYApgK28uc3RhY2t9cmV0dXJue3ZhbHVlOmUsc291cmNlOnQsc3RhY2s6aSxkaWdlc3Q6bnVsbH19ZnVuY3Rpb24ga2goZSx0LG4pe3JldHVybnt2YWx1ZTplLHNvdXJjZTpudWxsLHN0YWNrOm4/P251bGwsZGlnZXN0OnQ/P251bGx9fWZ1bmN0aW9uIFJwKGUsdCl7dHJ5e2NvbnNvbGUuZXJyb3IodC52YWx1ZSl9Y2F0Y2gobil7c2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IG59KX19dmFyIGhUPXR5cGVvZiBXZWFrTWFwPT0iZnVuY3Rpb24iP1dlYWtNYXA6TWFwO2Z1bmN0aW9uIGF3KGUsdCxuKXtuPXVpKC0xLG4pLG4udGFnPTMsbi5wYXlsb2FkPXtlbGVtZW50Om51bGx9O3ZhciByPXQudmFsdWU7cmV0dXJuIG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXttZHx8KG1kPSEwLEZwPXIpLFJwKGUsdCl9LG59ZnVuY3Rpb24gdXcoZSx0LG4pe249dWkoLTEsbiksbi50YWc9Mzt2YXIgcj1lLnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yO2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXt2YXIgaT10LnZhbHVlO24ucGF5bG9hZD1mdW5jdGlvbigpe3JldHVybiByKGkpfSxuLmNhbGxiYWNrPWZ1bmN0aW9uKCl7UnAoZSx0KX19dmFyIG89ZS5zdGF0ZU5vZGU7cmV0dXJuIG8hPT1udWxsJiZ0eXBlb2Ygby5jb21wb25lbnREaWRDYXRjaD09ImZ1bmN0aW9uIiYmKG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXtScChlLHQpLHR5cGVvZiByIT0iZnVuY3Rpb24iJiYoWWk9PT1udWxsP1lpPW5ldyBTZXQoW3RoaXNdKTpZaS5hZGQodGhpcykpO3ZhciBsPXQuc3RhY2s7dGhpcy5jb21wb25lbnREaWRDYXRjaCh0LnZhbHVlLHtjb21wb25lbnRTdGFjazpsIT09bnVsbD9sOiIifSl9KSxufWZ1bmN0aW9uIEp5KGUsdCxuKXt2YXIgcj1lLnBpbmdDYWNoZTtpZihyPT09bnVsbCl7cj1lLnBpbmdDYWNoZT1uZXcgaFQ7dmFyIGk9bmV3IFNldDtyLnNldCh0LGkpfWVsc2UgaT1yLmdldCh0KSxpPT09dm9pZCAwJiYoaT1uZXcgU2V0LHIuc2V0KHQsaSkpO2kuaGFzKG4pfHwoaS5hZGQobiksZT1iVC5iaW5kKG51bGwsZSx0LG4pLHQudGhlbihlLGUpKX1mdW5jdGlvbiBxeShlKXtkb3t2YXIgdDtpZigodD1lLnRhZz09PTEzKSYmKHQ9ZS5tZW1vaXplZFN0YXRlLHQ9dCE9PW51bGw/dC5kZWh5ZHJhdGVkIT09bnVsbDohMCksdClyZXR1cm4gZTtlPWUucmV0dXJufXdoaWxlKGUhPT1udWxsKTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBlMChlLHQsbixyLGkpe3JldHVybiBlLm1vZGUmMT8oZS5mbGFnc3w9NjU1MzYsZS5sYW5lcz1pLGUpOihlPT09dD9lLmZsYWdzfD02NTUzNjooZS5mbGFnc3w9MTI4LG4uZmxhZ3N8PTEzMTA3MixuLmZsYWdzJj0tNTI4MDUsbi50YWc9PT0xJiYobi5hbHRlcm5hdGU9PT1udWxsP24udGFnPTE3Oih0PXVpKC0xLDEpLHQudGFnPTIsR2kobix0LDEpKSksbi5sYW5lc3w9MSksZSl9dmFyIHBUPXhpLlJlYWN0Q3VycmVudE93bmVyLCRuPSExO2Z1bmN0aW9uIHVuKGUsdCxuLHIpe3QuY2hpbGQ9ZT09PW51bGw/QjEodCxudWxsLG4scik6aXModCxlLmNoaWxkLG4scil9ZnVuY3Rpb24gdDAoZSx0LG4scixpKXtuPW4ucmVuZGVyO3ZhciBvPXQucmVmO3JldHVybiBabCh0LGkpLHI9TmcoZSx0LG4scixvLGkpLG49UmcoKSxlIT09bnVsbCYmISRuPyh0LnVwZGF0ZVF1ZXVlPWUudXBkYXRlUXVldWUsdC5mbGFncyY9LTIwNTMsZS5sYW5lcyY9fmkscGkoZSx0LGkpKToob3QmJm4mJnZnKHQpLHQuZmxhZ3N8PTEsdW4oZSx0LHIsaSksdC5jaGlsZCl9ZnVuY3Rpb24gbjAoZSx0LG4scixpKXtpZihlPT09bnVsbCl7dmFyIG89bi50eXBlO3JldHVybiB0eXBlb2Ygbz09ImZ1bmN0aW9uIiYmIUZnKG8pJiZvLmRlZmF1bHRQcm9wcz09PXZvaWQgMCYmbi5jb21wYXJlPT09bnVsbCYmbi5kZWZhdWx0UHJvcHM9PT12b2lkIDA/KHQudGFnPTE1LHQudHlwZT1vLGN3KGUsdCxvLHIsaSkpOihlPXpjKG4udHlwZSxudWxsLHIsdCx0Lm1vZGUsaSksZS5yZWY9dC5yZWYsZS5yZXR1cm49dCx0LmNoaWxkPWUpfWlmKG89ZS5jaGlsZCwhKGUubGFuZXMmaSkpe3ZhciBsPW8ubWVtb2l6ZWRQcm9wcztpZihuPW4uY29tcGFyZSxuPW4hPT1udWxsP246VmEsbihsLHIpJiZlLnJlZj09PXQucmVmKXJldHVybiBwaShlLHQsaSl9cmV0dXJuIHQuZmxhZ3N8PTEsZT1RaShvLHIpLGUucmVmPXQucmVmLGUucmV0dXJuPXQsdC5jaGlsZD1lfWZ1bmN0aW9uIGN3KGUsdCxuLHIsaSl7aWYoZSE9PW51bGwpe3ZhciBvPWUubWVtb2l6ZWRQcm9wcztpZihWYShvLHIpJiZlLnJlZj09PXQucmVmKWlmKCRuPSExLHQucGVuZGluZ1Byb3BzPXI9bywoZS5sYW5lcyZpKSE9PTApZS5mbGFncyYxMzEwNzImJigkbj0hMCk7ZWxzZSByZXR1cm4gdC5sYW5lcz1lLmxhbmVzLHBpKGUsdCxpKX1yZXR1cm4gT3AoZSx0LG4scixpKX1mdW5jdGlvbiBkdyhlLHQsbil7dmFyIHI9dC5wZW5kaW5nUHJvcHMsaT1yLmNoaWxkcmVuLG89ZSE9PW51bGw/ZS5tZW1vaXplZFN0YXRlOm51bGw7aWYoci5tb2RlPT09ImhpZGRlbiIpaWYoISh0Lm1vZGUmMSkpdC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxYZShqbCxBbiksQW58PW47ZWxzZXtpZighKG4mMTA3Mzc0MTgyNCkpcmV0dXJuIGU9byE9PW51bGw/by5iYXNlTGFuZXN8bjpuLHQubGFuZXM9dC5jaGlsZExhbmVzPTEwNzM3NDE4MjQsdC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6ZSxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSx0LnVwZGF0ZVF1ZXVlPW51bGwsWGUoamwsQW4pLEFufD1lLG51bGw7dC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxyPW8hPT1udWxsP28uYmFzZUxhbmVzOm4sWGUoamwsQW4pLEFufD1yfWVsc2UgbyE9PW51bGw/KHI9by5iYXNlTGFuZXN8bix0Lm1lbW9pemVkU3RhdGU9bnVsbCk6cj1uLFhlKGpsLEFuKSxBbnw9cjtyZXR1cm4gdW4oZSx0LGksbiksdC5jaGlsZH1mdW5jdGlvbiBmdyhlLHQpe3ZhciBuPXQucmVmOyhlPT09bnVsbCYmbiE9PW51bGx8fGUhPT1udWxsJiZlLnJlZiE9PW4pJiYodC5mbGFnc3w9NTEyLHQuZmxhZ3N8PTIwOTcxNTIpfWZ1bmN0aW9uIE9wKGUsdCxuLHIsaSl7dmFyIG89VG4obik/V286cm4uY3VycmVudDtyZXR1cm4gbz1ucyh0LG8pLFpsKHQsaSksbj1OZyhlLHQsbixyLG8saSkscj1SZygpLGUhPT1udWxsJiYhJG4/KHQudXBkYXRlUXVldWU9ZS51cGRhdGVRdWV1ZSx0LmZsYWdzJj0tMjA1MyxlLmxhbmVzJj1+aSxwaShlLHQsaSkpOihvdCYmciYmdmcodCksdC5mbGFnc3w9MSx1bihlLHQsbixpKSx0LmNoaWxkKX1mdW5jdGlvbiByMChlLHQsbixyLGkpe2lmKFRuKG4pKXt2YXIgbz0hMDtvZCh0KX1lbHNlIG89ITE7aWYoWmwodCxpKSx0LnN0YXRlTm9kZT09PW51bGwpTGMoZSx0KSx6MSh0LG4sciksTnAodCxuLHIsaSkscj0hMDtlbHNlIGlmKGU9PT1udWxsKXt2YXIgbD10LnN0YXRlTm9kZSxzPXQubWVtb2l6ZWRQcm9wcztsLnByb3BzPXM7dmFyIGE9bC5jb250ZXh0LHU9bi5jb250ZXh0VHlwZTt0eXBlb2YgdT09Im9iamVjdCImJnUhPT1udWxsP3U9cnIodSk6KHU9VG4obik/V286cm4uY3VycmVudCx1PW5zKHQsdSkpO3ZhciBjPW4uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLGQ9dHlwZW9mIGM9PSJmdW5jdGlvbiJ8fHR5cGVvZiBsLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlPT0iZnVuY3Rpb24iO2R8fHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24ifHwocyE9PXJ8fGEhPT11KSYmR3kodCxsLHIsdSksTWk9ITE7dmFyIGY9dC5tZW1vaXplZFN0YXRlO2wuc3RhdGU9ZixjZCh0LHIsbCxpKSxhPXQubWVtb2l6ZWRTdGF0ZSxzIT09cnx8ZiE9PWF8fGJuLmN1cnJlbnR8fE1pPyh0eXBlb2YgYz09ImZ1bmN0aW9uIiYmKFRwKHQsbixjLHIpLGE9dC5tZW1vaXplZFN0YXRlKSwocz1NaXx8WnkodCxuLHMscixmLGEsdSkpPyhkfHx0eXBlb2YgbC5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiJ8fCh0eXBlb2YgbC5jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJmwuY29tcG9uZW50V2lsbE1vdW50KCksdHlwZW9mIGwuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmbC5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCkpLHR5cGVvZiBsLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NDE5NDMwOCkpOih0eXBlb2YgbC5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIiYmKHQuZmxhZ3N8PTQxOTQzMDgpLHQubWVtb2l6ZWRQcm9wcz1yLHQubWVtb2l6ZWRTdGF0ZT1hKSxsLnByb3BzPXIsbC5zdGF0ZT1hLGwuY29udGV4dD11LHI9cyk6KHR5cGVvZiBsLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NDE5NDMwOCkscj0hMSl9ZWxzZXtsPXQuc3RhdGVOb2RlLEkxKGUsdCkscz10Lm1lbW9pemVkUHJvcHMsdT10LnR5cGU9PT10LmVsZW1lbnRUeXBlP3M6bXIodC50eXBlLHMpLGwucHJvcHM9dSxkPXQucGVuZGluZ1Byb3BzLGY9bC5jb250ZXh0LGE9bi5jb250ZXh0VHlwZSx0eXBlb2YgYT09Im9iamVjdCImJmEhPT1udWxsP2E9cnIoYSk6KGE9VG4obik/V286cm4uY3VycmVudCxhPW5zKHQsYSkpO3ZhciBoPW4uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOyhjPXR5cGVvZiBoPT0iZnVuY3Rpb24ifHx0eXBlb2YgbC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZT09ImZ1bmN0aW9uIil8fHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24ifHwocyE9PWR8fGYhPT1hKSYmR3kodCxsLHIsYSksTWk9ITEsZj10Lm1lbW9pemVkU3RhdGUsbC5zdGF0ZT1mLGNkKHQscixsLGkpO3ZhciBtPXQubWVtb2l6ZWRTdGF0ZTtzIT09ZHx8ZiE9PW18fGJuLmN1cnJlbnR8fE1pPyh0eXBlb2YgaD09ImZ1bmN0aW9uIiYmKFRwKHQsbixoLHIpLG09dC5tZW1vaXplZFN0YXRlKSwodT1NaXx8WnkodCxuLHUscixmLG0sYSl8fCExKT8oY3x8dHlwZW9mIGwuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUhPSJmdW5jdGlvbiImJnR5cGVvZiBsLmNvbXBvbmVudFdpbGxVcGRhdGUhPSJmdW5jdGlvbiJ8fCh0eXBlb2YgbC5jb21wb25lbnRXaWxsVXBkYXRlPT0iZnVuY3Rpb24iJiZsLmNvbXBvbmVudFdpbGxVcGRhdGUocixtLGEpLHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlPT0iZnVuY3Rpb24iJiZsLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlKHIsbSxhKSksdHlwZW9mIGwuY29tcG9uZW50RGlkVXBkYXRlPT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NCksdHlwZW9mIGwuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiImJih0LmZsYWdzfD0xMDI0KSk6KHR5cGVvZiBsLmNvbXBvbmVudERpZFVwZGF0ZSE9ImZ1bmN0aW9uInx8cz09PWUubWVtb2l6ZWRQcm9wcyYmZj09PWUubWVtb2l6ZWRTdGF0ZXx8KHQuZmxhZ3N8PTQpLHR5cGVvZiBsLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09ZS5tZW1vaXplZFByb3BzJiZmPT09ZS5tZW1vaXplZFN0YXRlfHwodC5mbGFnc3w9MTAyNCksdC5tZW1vaXplZFByb3BzPXIsdC5tZW1vaXplZFN0YXRlPW0pLGwucHJvcHM9cixsLnN0YXRlPW0sbC5jb250ZXh0PWEscj11KToodHlwZW9mIGwuY29tcG9uZW50RGlkVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09ZS5tZW1vaXplZFByb3BzJiZmPT09ZS5tZW1vaXplZFN0YXRlfHwodC5mbGFnc3w9NCksdHlwZW9mIGwuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUhPSJmdW5jdGlvbiJ8fHM9PT1lLm1lbW9pemVkUHJvcHMmJmY9PT1lLm1lbW9pemVkU3RhdGV8fCh0LmZsYWdzfD0xMDI0KSxyPSExKX1yZXR1cm4gUHAoZSx0LG4scixvLGkpfWZ1bmN0aW9uIFBwKGUsdCxuLHIsaSxvKXtmdyhlLHQpO3ZhciBsPSh0LmZsYWdzJjEyOCkhPT0wO2lmKCFyJiYhbClyZXR1cm4gaSYmVXkodCxuLCExKSxwaShlLHQsbyk7cj10LnN0YXRlTm9kZSxwVC5jdXJyZW50PXQ7dmFyIHM9bCYmdHlwZW9mIG4uZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIT0iZnVuY3Rpb24iP251bGw6ci5yZW5kZXIoKTtyZXR1cm4gdC5mbGFnc3w9MSxlIT09bnVsbCYmbD8odC5jaGlsZD1pcyh0LGUuY2hpbGQsbnVsbCxvKSx0LmNoaWxkPWlzKHQsbnVsbCxzLG8pKTp1bihlLHQscyxvKSx0Lm1lbW9pemVkU3RhdGU9ci5zdGF0ZSxpJiZVeSh0LG4sITApLHQuY2hpbGR9ZnVuY3Rpb24gaHcoZSl7dmFyIHQ9ZS5zdGF0ZU5vZGU7dC5wZW5kaW5nQ29udGV4dD9CeShlLHQucGVuZGluZ0NvbnRleHQsdC5wZW5kaW5nQ29udGV4dCE9PXQuY29udGV4dCk6dC5jb250ZXh0JiZCeShlLHQuY29udGV4dCwhMSksa2coZSx0LmNvbnRhaW5lckluZm8pfWZ1bmN0aW9uIGkwKGUsdCxuLHIsaSl7cmV0dXJuIHJzKCkseGcoaSksdC5mbGFnc3w9MjU2LHVuKGUsdCxuLHIpLHQuY2hpbGR9dmFyIEFwPXtkZWh5ZHJhdGVkOm51bGwsdHJlZUNvbnRleHQ6bnVsbCxyZXRyeUxhbmU6MH07ZnVuY3Rpb24gTXAoZSl7cmV0dXJue2Jhc2VMYW5lczplLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9fWZ1bmN0aW9uIHB3KGUsdCxuKXt2YXIgcj10LnBlbmRpbmdQcm9wcyxpPWR0LmN1cnJlbnQsbz0hMSxsPSh0LmZsYWdzJjEyOCkhPT0wLHM7aWYoKHM9bCl8fChzPWUhPT1udWxsJiZlLm1lbW9pemVkU3RhdGU9PT1udWxsPyExOihpJjIpIT09MCkscz8obz0hMCx0LmZsYWdzJj0tMTI5KTooZT09PW51bGx8fGUubWVtb2l6ZWRTdGF0ZSE9PW51bGwpJiYoaXw9MSksWGUoZHQsaSYxKSxlPT09bnVsbClyZXR1cm4gJHAodCksZT10Lm1lbW9pemVkU3RhdGUsZSE9PW51bGwmJihlPWUuZGVoeWRyYXRlZCxlIT09bnVsbCk/KHQubW9kZSYxP2UuZGF0YT09PSIkISI/dC5sYW5lcz04OnQubGFuZXM9MTA3Mzc0MTgyNDp0LmxhbmVzPTEsbnVsbCk6KGw9ci5jaGlsZHJlbixlPXIuZmFsbGJhY2ssbz8ocj10Lm1vZGUsbz10LmNoaWxkLGw9e21vZGU6ImhpZGRlbiIsY2hpbGRyZW46bH0sIShyJjEpJiZvIT09bnVsbD8oby5jaGlsZExhbmVzPTAsby5wZW5kaW5nUHJvcHM9bCk6bz1wZihsLHIsMCxudWxsKSxlPUlvKGUscixuLG51bGwpLG8ucmV0dXJuPXQsZS5yZXR1cm49dCxvLnNpYmxpbmc9ZSx0LmNoaWxkPW8sdC5jaGlsZC5tZW1vaXplZFN0YXRlPU1wKG4pLHQubWVtb2l6ZWRTdGF0ZT1BcCxlKTpBZyh0LGwpKTtpZihpPWUubWVtb2l6ZWRTdGF0ZSxpIT09bnVsbCYmKHM9aS5kZWh5ZHJhdGVkLHMhPT1udWxsKSlyZXR1cm4gbVQoZSx0LGwscixzLGksbik7aWYobyl7bz1yLmZhbGxiYWNrLGw9dC5tb2RlLGk9ZS5jaGlsZCxzPWkuc2libGluZzt2YXIgYT17bW9kZToiaGlkZGVuIixjaGlsZHJlbjpyLmNoaWxkcmVufTtyZXR1cm4hKGwmMSkmJnQuY2hpbGQhPT1pPyhyPXQuY2hpbGQsci5jaGlsZExhbmVzPTAsci5wZW5kaW5nUHJvcHM9YSx0LmRlbGV0aW9ucz1udWxsKToocj1RaShpLGEpLHIuc3VidHJlZUZsYWdzPWkuc3VidHJlZUZsYWdzJjE0NjgwMDY0KSxzIT09bnVsbD9vPVFpKHMsbyk6KG89SW8obyxsLG4sbnVsbCksby5mbGFnc3w9Miksby5yZXR1cm49dCxyLnJldHVybj10LHIuc2libGluZz1vLHQuY2hpbGQ9cixyPW8sbz10LmNoaWxkLGw9ZS5jaGlsZC5tZW1vaXplZFN0YXRlLGw9bD09PW51bGw/TXAobik6e2Jhc2VMYW5lczpsLmJhc2VMYW5lc3xuLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOmwudHJhbnNpdGlvbnN9LG8ubWVtb2l6ZWRTdGF0ZT1sLG8uY2hpbGRMYW5lcz1lLmNoaWxkTGFuZXMmfm4sdC5tZW1vaXplZFN0YXRlPUFwLHJ9cmV0dXJuIG89ZS5jaGlsZCxlPW8uc2libGluZyxyPVFpKG8se21vZGU6InZpc2libGUiLGNoaWxkcmVuOnIuY2hpbGRyZW59KSwhKHQubW9kZSYxKSYmKHIubGFuZXM9biksci5yZXR1cm49dCxyLnNpYmxpbmc9bnVsbCxlIT09bnVsbCYmKG49dC5kZWxldGlvbnMsbj09PW51bGw/KHQuZGVsZXRpb25zPVtlXSx0LmZsYWdzfD0xNik6bi5wdXNoKGUpKSx0LmNoaWxkPXIsdC5tZW1vaXplZFN0YXRlPW51bGwscn1mdW5jdGlvbiBBZyhlLHQpe3JldHVybiB0PXBmKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjp0fSxlLm1vZGUsMCxudWxsKSx0LnJldHVybj1lLGUuY2hpbGQ9dH1mdW5jdGlvbiBhYyhlLHQsbixyKXtyZXR1cm4gciE9PW51bGwmJnhnKHIpLGlzKHQsZS5jaGlsZCxudWxsLG4pLGU9QWcodCx0LnBlbmRpbmdQcm9wcy5jaGlsZHJlbiksZS5mbGFnc3w9Mix0Lm1lbW9pemVkU3RhdGU9bnVsbCxlfWZ1bmN0aW9uIG1UKGUsdCxuLHIsaSxvLGwpe2lmKG4pcmV0dXJuIHQuZmxhZ3MmMjU2Pyh0LmZsYWdzJj0tMjU3LHI9a2goRXJyb3IoVSg0MjIpKSksYWMoZSx0LGwscikpOnQubWVtb2l6ZWRTdGF0ZSE9PW51bGw/KHQuY2hpbGQ9ZS5jaGlsZCx0LmZsYWdzfD0xMjgsbnVsbCk6KG89ci5mYWxsYmFjayxpPXQubW9kZSxyPXBmKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjpyLmNoaWxkcmVufSxpLDAsbnVsbCksbz1JbyhvLGksbCxudWxsKSxvLmZsYWdzfD0yLHIucmV0dXJuPXQsby5yZXR1cm49dCxyLnNpYmxpbmc9byx0LmNoaWxkPXIsdC5tb2RlJjEmJmlzKHQsZS5jaGlsZCxudWxsLGwpLHQuY2hpbGQubWVtb2l6ZWRTdGF0ZT1NcChsKSx0Lm1lbW9pemVkU3RhdGU9QXAsbyk7aWYoISh0Lm1vZGUmMSkpcmV0dXJuIGFjKGUsdCxsLG51bGwpO2lmKGkuZGF0YT09PSIkISIpe2lmKHI9aS5uZXh0U2libGluZyYmaS5uZXh0U2libGluZy5kYXRhc2V0LHIpdmFyIHM9ci5kZ3N0O3JldHVybiByPXMsbz1FcnJvcihVKDQxOSkpLHI9a2gobyxyLHZvaWQgMCksYWMoZSx0LGwscil9aWYocz0obCZlLmNoaWxkTGFuZXMpIT09MCwkbnx8cyl7aWYocj1CdCxyIT09bnVsbCl7c3dpdGNoKGwmLWwpe2Nhc2UgNDppPTI7YnJlYWs7Y2FzZSAxNjppPTg7YnJlYWs7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0Omk9MzI7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6aT0yNjg0MzU0NTY7YnJlYWs7ZGVmYXVsdDppPTB9aT1pJihyLnN1c3BlbmRlZExhbmVzfGwpPzA6aSxpIT09MCYmaSE9PW8ucmV0cnlMYW5lJiYoby5yZXRyeUxhbmU9aSxoaShlLGkpLFNyKHIsZSxpLC0xKSl9cmV0dXJuIHpnKCkscj1raChFcnJvcihVKDQyMSkpKSxhYyhlLHQsbCxyKX1yZXR1cm4gaS5kYXRhPT09IiQ/Ij8odC5mbGFnc3w9MTI4LHQuY2hpbGQ9ZS5jaGlsZCx0PVRULmJpbmQobnVsbCxlKSxpLl9yZWFjdFJldHJ5PXQsbnVsbCk6KGU9by50cmVlQ29udGV4dCxMbj1aaShpLm5leHRTaWJsaW5nKSxJbj10LG90PSEwLHlyPW51bGwsZSE9PW51bGwmJihZbltYbisrXT1zaSxZbltYbisrXT1haSxZbltYbisrXT1WbyxzaT1lLmlkLGFpPWUub3ZlcmZsb3csVm89dCksdD1BZyh0LHIuY2hpbGRyZW4pLHQuZmxhZ3N8PTQwOTYsdCl9ZnVuY3Rpb24gbzAoZSx0LG4pe2UubGFuZXN8PXQ7dmFyIHI9ZS5hbHRlcm5hdGU7ciE9PW51bGwmJihyLmxhbmVzfD10KSxicChlLnJldHVybix0LG4pfWZ1bmN0aW9uICRoKGUsdCxuLHIsaSl7dmFyIG89ZS5tZW1vaXplZFN0YXRlO289PT1udWxsP2UubWVtb2l6ZWRTdGF0ZT17aXNCYWNrd2FyZHM6dCxyZW5kZXJpbmc6bnVsbCxyZW5kZXJpbmdTdGFydFRpbWU6MCxsYXN0OnIsdGFpbDpuLHRhaWxNb2RlOml9OihvLmlzQmFja3dhcmRzPXQsby5yZW5kZXJpbmc9bnVsbCxvLnJlbmRlcmluZ1N0YXJ0VGltZT0wLG8ubGFzdD1yLG8udGFpbD1uLG8udGFpbE1vZGU9aSl9ZnVuY3Rpb24gbXcoZSx0LG4pe3ZhciByPXQucGVuZGluZ1Byb3BzLGk9ci5yZXZlYWxPcmRlcixvPXIudGFpbDtpZih1bihlLHQsci5jaGlsZHJlbixuKSxyPWR0LmN1cnJlbnQsciYyKXI9ciYxfDIsdC5mbGFnc3w9MTI4O2Vsc2V7aWYoZSE9PW51bGwmJmUuZmxhZ3MmMTI4KWU6Zm9yKGU9dC5jaGlsZDtlIT09bnVsbDspe2lmKGUudGFnPT09MTMpZS5tZW1vaXplZFN0YXRlIT09bnVsbCYmbzAoZSxuLHQpO2Vsc2UgaWYoZS50YWc9PT0xOSlvMChlLG4sdCk7ZWxzZSBpZihlLmNoaWxkIT09bnVsbCl7ZS5jaGlsZC5yZXR1cm49ZSxlPWUuY2hpbGQ7Y29udGludWV9aWYoZT09PXQpYnJlYWsgZTtmb3IoO2Uuc2libGluZz09PW51bGw7KXtpZihlLnJldHVybj09PW51bGx8fGUucmV0dXJuPT09dClicmVhayBlO2U9ZS5yZXR1cm59ZS5zaWJsaW5nLnJldHVybj1lLnJldHVybixlPWUuc2libGluZ31yJj0xfWlmKFhlKGR0LHIpLCEodC5tb2RlJjEpKXQubWVtb2l6ZWRTdGF0ZT1udWxsO2Vsc2Ugc3dpdGNoKGkpe2Nhc2UiZm9yd2FyZHMiOmZvcihuPXQuY2hpbGQsaT1udWxsO24hPT1udWxsOyllPW4uYWx0ZXJuYXRlLGUhPT1udWxsJiZkZChlKT09PW51bGwmJihpPW4pLG49bi5zaWJsaW5nO249aSxuPT09bnVsbD8oaT10LmNoaWxkLHQuY2hpbGQ9bnVsbCk6KGk9bi5zaWJsaW5nLG4uc2libGluZz1udWxsKSwkaCh0LCExLGksbixvKTticmVhaztjYXNlImJhY2t3YXJkcyI6Zm9yKG49bnVsbCxpPXQuY2hpbGQsdC5jaGlsZD1udWxsO2khPT1udWxsOyl7aWYoZT1pLmFsdGVybmF0ZSxlIT09bnVsbCYmZGQoZSk9PT1udWxsKXt0LmNoaWxkPWk7YnJlYWt9ZT1pLnNpYmxpbmcsaS5zaWJsaW5nPW4sbj1pLGk9ZX0kaCh0LCEwLG4sbnVsbCxvKTticmVhaztjYXNlInRvZ2V0aGVyIjokaCh0LCExLG51bGwsbnVsbCx2b2lkIDApO2JyZWFrO2RlZmF1bHQ6dC5tZW1vaXplZFN0YXRlPW51bGx9cmV0dXJuIHQuY2hpbGR9ZnVuY3Rpb24gTGMoZSx0KXshKHQubW9kZSYxKSYmZSE9PW51bGwmJihlLmFsdGVybmF0ZT1udWxsLHQuYWx0ZXJuYXRlPW51bGwsdC5mbGFnc3w9Mil9ZnVuY3Rpb24gcGkoZSx0LG4pe2lmKGUhPT1udWxsJiYodC5kZXBlbmRlbmNpZXM9ZS5kZXBlbmRlbmNpZXMpLEtvfD10LmxhbmVzLCEobiZ0LmNoaWxkTGFuZXMpKXJldHVybiBudWxsO2lmKGUhPT1udWxsJiZ0LmNoaWxkIT09ZS5jaGlsZCl0aHJvdyBFcnJvcihVKDE1MykpO2lmKHQuY2hpbGQhPT1udWxsKXtmb3IoZT10LmNoaWxkLG49UWkoZSxlLnBlbmRpbmdQcm9wcyksdC5jaGlsZD1uLG4ucmV0dXJuPXQ7ZS5zaWJsaW5nIT09bnVsbDspZT1lLnNpYmxpbmcsbj1uLnNpYmxpbmc9UWkoZSxlLnBlbmRpbmdQcm9wcyksbi5yZXR1cm49dDtuLnNpYmxpbmc9bnVsbH1yZXR1cm4gdC5jaGlsZH1mdW5jdGlvbiBnVChlLHQsbil7c3dpdGNoKHQudGFnKXtjYXNlIDM6aHcodCkscnMoKTticmVhaztjYXNlIDU6VTEodCk7YnJlYWs7Y2FzZSAxOlRuKHQudHlwZSkmJm9kKHQpO2JyZWFrO2Nhc2UgNDprZyh0LHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO2JyZWFrO2Nhc2UgMTA6dmFyIHI9dC50eXBlLl9jb250ZXh0LGk9dC5tZW1vaXplZFByb3BzLnZhbHVlO1hlKGFkLHIuX2N1cnJlbnRWYWx1ZSksci5fY3VycmVudFZhbHVlPWk7YnJlYWs7Y2FzZSAxMzppZihyPXQubWVtb2l6ZWRTdGF0ZSxyIT09bnVsbClyZXR1cm4gci5kZWh5ZHJhdGVkIT09bnVsbD8oWGUoZHQsZHQuY3VycmVudCYxKSx0LmZsYWdzfD0xMjgsbnVsbCk6biZ0LmNoaWxkLmNoaWxkTGFuZXM/cHcoZSx0LG4pOihYZShkdCxkdC5jdXJyZW50JjEpLGU9cGkoZSx0LG4pLGUhPT1udWxsP2Uuc2libGluZzpudWxsKTtYZShkdCxkdC5jdXJyZW50JjEpO2JyZWFrO2Nhc2UgMTk6aWYocj0obiZ0LmNoaWxkTGFuZXMpIT09MCxlLmZsYWdzJjEyOCl7aWYocilyZXR1cm4gbXcoZSx0LG4pO3QuZmxhZ3N8PTEyOH1pZihpPXQubWVtb2l6ZWRTdGF0ZSxpIT09bnVsbCYmKGkucmVuZGVyaW5nPW51bGwsaS50YWlsPW51bGwsaS5sYXN0RWZmZWN0PW51bGwpLFhlKGR0LGR0LmN1cnJlbnQpLHIpYnJlYWs7cmV0dXJuIG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiB0LmxhbmVzPTAsZHcoZSx0LG4pfXJldHVybiBwaShlLHQsbil9dmFyIGd3LERwLHZ3LHl3O2d3PWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXQuY2hpbGQ7biE9PW51bGw7KXtpZihuLnRhZz09PTV8fG4udGFnPT09NillLmFwcGVuZENoaWxkKG4uc3RhdGVOb2RlKTtlbHNlIGlmKG4udGFnIT09NCYmbi5jaGlsZCE9PW51bGwpe24uY2hpbGQucmV0dXJuPW4sbj1uLmNoaWxkO2NvbnRpbnVlfWlmKG49PT10KWJyZWFrO2Zvcig7bi5zaWJsaW5nPT09bnVsbDspe2lmKG4ucmV0dXJuPT09bnVsbHx8bi5yZXR1cm49PT10KXJldHVybjtuPW4ucmV0dXJufW4uc2libGluZy5yZXR1cm49bi5yZXR1cm4sbj1uLnNpYmxpbmd9fTtEcD1mdW5jdGlvbigpe307dnc9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9ZS5tZW1vaXplZFByb3BzO2lmKGkhPT1yKXtlPXQuc3RhdGVOb2RlLEFvKEZyLmN1cnJlbnQpO3ZhciBvPW51bGw7c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOmk9cnAoZSxpKSxyPXJwKGUsciksbz1bXTticmVhaztjYXNlInNlbGVjdCI6aT1tdCh7fSxpLHt2YWx1ZTp2b2lkIDB9KSxyPW10KHt9LHIse3ZhbHVlOnZvaWQgMH0pLG89W107YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6aT1scChlLGkpLHI9bHAoZSxyKSxvPVtdO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIGkub25DbGljayE9ImZ1bmN0aW9uIiYmdHlwZW9mIHIub25DbGljaz09ImZ1bmN0aW9uIiYmKGUub25jbGljaz1yZCl9YXAobixyKTt2YXIgbDtuPW51bGw7Zm9yKHUgaW4gaSlpZighci5oYXNPd25Qcm9wZXJ0eSh1KSYmaS5oYXNPd25Qcm9wZXJ0eSh1KSYmaVt1XSE9bnVsbClpZih1PT09InN0eWxlIil7dmFyIHM9aVt1XTtmb3IobCBpbiBzKXMuaGFzT3duUHJvcGVydHkobCkmJihufHwobj17fSksbltsXT0iIil9ZWxzZSB1IT09ImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiYmdSE9PSJjaGlsZHJlbiImJnUhPT0ic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiYmdSE9PSJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciJiZ1IT09ImF1dG9Gb2N1cyImJihJYS5oYXNPd25Qcm9wZXJ0eSh1KT9vfHwobz1bXSk6KG89b3x8W10pLnB1c2godSxudWxsKSk7Zm9yKHUgaW4gcil7dmFyIGE9clt1XTtpZihzPWkhPW51bGw/aVt1XTp2b2lkIDAsci5oYXNPd25Qcm9wZXJ0eSh1KSYmYSE9PXMmJihhIT1udWxsfHxzIT1udWxsKSlpZih1PT09InN0eWxlIilpZihzKXtmb3IobCBpbiBzKSFzLmhhc093blByb3BlcnR5KGwpfHxhJiZhLmhhc093blByb3BlcnR5KGwpfHwobnx8KG49e30pLG5bbF09IiIpO2ZvcihsIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShsKSYmc1tsXSE9PWFbbF0mJihufHwobj17fSksbltsXT1hW2xdKX1lbHNlIG58fChvfHwobz1bXSksby5wdXNoKHUsbikpLG49YTtlbHNlIHU9PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyhhPWE/YS5fX2h0bWw6dm9pZCAwLHM9cz9zLl9faHRtbDp2b2lkIDAsYSE9bnVsbCYmcyE9PWEmJihvPW98fFtdKS5wdXNoKHUsYSkpOnU9PT0iY2hpbGRyZW4iP3R5cGVvZiBhIT0ic3RyaW5nIiYmdHlwZW9mIGEhPSJudW1iZXIifHwobz1vfHxbXSkucHVzaCh1LCIiK2EpOnUhPT0ic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiYmdSE9PSJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciJiYoSWEuaGFzT3duUHJvcGVydHkodSk/KGEhPW51bGwmJnU9PT0ib25TY3JvbGwiJiZldCgic2Nyb2xsIixlKSxvfHxzPT09YXx8KG89W10pKToobz1vfHxbXSkucHVzaCh1LGEpKX1uJiYobz1vfHxbXSkucHVzaCgic3R5bGUiLG4pO3ZhciB1PW87KHQudXBkYXRlUXVldWU9dSkmJih0LmZsYWdzfD00KX19O3l3PWZ1bmN0aW9uKGUsdCxuLHIpe24hPT1yJiYodC5mbGFnc3w9NCl9O2Z1bmN0aW9uIFpzKGUsdCl7aWYoIW90KXN3aXRjaChlLnRhaWxNb2RlKXtjYXNlImhpZGRlbiI6dD1lLnRhaWw7Zm9yKHZhciBuPW51bGw7dCE9PW51bGw7KXQuYWx0ZXJuYXRlIT09bnVsbCYmKG49dCksdD10LnNpYmxpbmc7bj09PW51bGw/ZS50YWlsPW51bGw6bi5zaWJsaW5nPW51bGw7YnJlYWs7Y2FzZSJjb2xsYXBzZWQiOm49ZS50YWlsO2Zvcih2YXIgcj1udWxsO24hPT1udWxsOyluLmFsdGVybmF0ZSE9PW51bGwmJihyPW4pLG49bi5zaWJsaW5nO3I9PT1udWxsP3R8fGUudGFpbD09PW51bGw/ZS50YWlsPW51bGw6ZS50YWlsLnNpYmxpbmc9bnVsbDpyLnNpYmxpbmc9bnVsbH19ZnVuY3Rpb24gWHQoZSl7dmFyIHQ9ZS5hbHRlcm5hdGUhPT1udWxsJiZlLmFsdGVybmF0ZS5jaGlsZD09PWUuY2hpbGQsbj0wLHI9MDtpZih0KWZvcih2YXIgaT1lLmNoaWxkO2khPT1udWxsOylufD1pLmxhbmVzfGkuY2hpbGRMYW5lcyxyfD1pLnN1YnRyZWVGbGFncyYxNDY4MDA2NCxyfD1pLmZsYWdzJjE0NjgwMDY0LGkucmV0dXJuPWUsaT1pLnNpYmxpbmc7ZWxzZSBmb3IoaT1lLmNoaWxkO2khPT1udWxsOylufD1pLmxhbmVzfGkuY2hpbGRMYW5lcyxyfD1pLnN1YnRyZWVGbGFncyxyfD1pLmZsYWdzLGkucmV0dXJuPWUsaT1pLnNpYmxpbmc7cmV0dXJuIGUuc3VidHJlZUZsYWdzfD1yLGUuY2hpbGRMYW5lcz1uLHR9ZnVuY3Rpb24gdlQoZSx0LG4pe3ZhciByPXQucGVuZGluZ1Byb3BzO3N3aXRjaCh5Zyh0KSx0LnRhZyl7Y2FzZSAyOmNhc2UgMTY6Y2FzZSAxNTpjYXNlIDA6Y2FzZSAxMTpjYXNlIDc6Y2FzZSA4OmNhc2UgMTI6Y2FzZSA5OmNhc2UgMTQ6cmV0dXJuIFh0KHQpLG51bGw7Y2FzZSAxOnJldHVybiBUbih0LnR5cGUpJiZpZCgpLFh0KHQpLG51bGw7Y2FzZSAzOnJldHVybiByPXQuc3RhdGVOb2RlLG9zKCksaXQoYm4pLGl0KHJuKSxiZygpLHIucGVuZGluZ0NvbnRleHQmJihyLmNvbnRleHQ9ci5wZW5kaW5nQ29udGV4dCxyLnBlbmRpbmdDb250ZXh0PW51bGwpLChlPT09bnVsbHx8ZS5jaGlsZD09PW51bGwpJiYobGModCk/dC5mbGFnc3w9NDplPT09bnVsbHx8ZS5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCYmISh0LmZsYWdzJjI1Nil8fCh0LmZsYWdzfD0xMDI0LHlyIT09bnVsbCYmKFdwKHlyKSx5cj1udWxsKSkpLERwKGUsdCksWHQodCksbnVsbDtjYXNlIDU6JGcodCk7dmFyIGk9QW8oWWEuY3VycmVudCk7aWYobj10LnR5cGUsZSE9PW51bGwmJnQuc3RhdGVOb2RlIT1udWxsKXZ3KGUsdCxuLHIsaSksZS5yZWYhPT10LnJlZiYmKHQuZmxhZ3N8PTUxMix0LmZsYWdzfD0yMDk3MTUyKTtlbHNle2lmKCFyKXtpZih0LnN0YXRlTm9kZT09PW51bGwpdGhyb3cgRXJyb3IoVSgxNjYpKTtyZXR1cm4gWHQodCksbnVsbH1pZihlPUFvKEZyLmN1cnJlbnQpLGxjKHQpKXtyPXQuc3RhdGVOb2RlLG49dC50eXBlO3ZhciBvPXQubWVtb2l6ZWRQcm9wcztzd2l0Y2gocltNcl09dCxyW1phXT1vLGU9KHQubW9kZSYxKSE9PTAsbil7Y2FzZSJkaWFsb2ciOmV0KCJjYW5jZWwiLHIpLGV0KCJjbG9zZSIscik7YnJlYWs7Y2FzZSJpZnJhbWUiOmNhc2Uib2JqZWN0IjpjYXNlImVtYmVkIjpldCgibG9hZCIscik7YnJlYWs7Y2FzZSJ2aWRlbyI6Y2FzZSJhdWRpbyI6Zm9yKGk9MDtpPHVhLmxlbmd0aDtpKyspZXQodWFbaV0scik7YnJlYWs7Y2FzZSJzb3VyY2UiOmV0KCJlcnJvciIscik7YnJlYWs7Y2FzZSJpbWciOmNhc2UiaW1hZ2UiOmNhc2UibGluayI6ZXQoImVycm9yIixyKSxldCgibG9hZCIscik7YnJlYWs7Y2FzZSJkZXRhaWxzIjpldCgidG9nZ2xlIixyKTticmVhaztjYXNlImlucHV0IjpweShyLG8pLGV0KCJpbnZhbGlkIixyKTticmVhaztjYXNlInNlbGVjdCI6ci5fd3JhcHBlclN0YXRlPXt3YXNNdWx0aXBsZTohIW8ubXVsdGlwbGV9LGV0KCJpbnZhbGlkIixyKTticmVhaztjYXNlInRleHRhcmVhIjpneShyLG8pLGV0KCJpbnZhbGlkIixyKX1hcChuLG8pLGk9bnVsbDtmb3IodmFyIGwgaW4gbylpZihvLmhhc093blByb3BlcnR5KGwpKXt2YXIgcz1vW2xdO2w9PT0iY2hpbGRyZW4iP3R5cGVvZiBzPT0ic3RyaW5nIj9yLnRleHRDb250ZW50IT09cyYmKG8uc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIT09ITAmJm9jKHIudGV4dENvbnRlbnQscyxlKSxpPVsiY2hpbGRyZW4iLHNdKTp0eXBlb2Ygcz09Im51bWJlciImJnIudGV4dENvbnRlbnQhPT0iIitzJiYoby5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmchPT0hMCYmb2Moci50ZXh0Q29udGVudCxzLGUpLGk9WyJjaGlsZHJlbiIsIiIrc10pOklhLmhhc093blByb3BlcnR5KGwpJiZzIT1udWxsJiZsPT09Im9uU2Nyb2xsIiYmZXQoInNjcm9sbCIscil9c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOlF1KHIpLG15KHIsbywhMCk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6UXUociksdnkocik7YnJlYWs7Y2FzZSJzZWxlY3QiOmNhc2Uib3B0aW9uIjpicmVhaztkZWZhdWx0OnR5cGVvZiBvLm9uQ2xpY2s9PSJmdW5jdGlvbiImJihyLm9uY2xpY2s9cmQpfXI9aSx0LnVwZGF0ZVF1ZXVlPXIsciE9PW51bGwmJih0LmZsYWdzfD00KX1lbHNle2w9aS5ub2RlVHlwZT09PTk/aTppLm93bmVyRG9jdW1lbnQsZT09PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiYmKGU9SF8obikpLGU9PT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI/bj09PSJzY3JpcHQiPyhlPWwuY3JlYXRlRWxlbWVudCgiZGl2IiksZS5pbm5lckhUTUw9IjxzY3JpcHQ+PFwvc2NyaXB0PiIsZT1lLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCkpOnR5cGVvZiByLmlzPT0ic3RyaW5nIj9lPWwuY3JlYXRlRWxlbWVudChuLHtpczpyLmlzfSk6KGU9bC5jcmVhdGVFbGVtZW50KG4pLG49PT0ic2VsZWN0IiYmKGw9ZSxyLm11bHRpcGxlP2wubXVsdGlwbGU9ITA6ci5zaXplJiYobC5zaXplPXIuc2l6ZSkpKTplPWwuY3JlYXRlRWxlbWVudE5TKGUsbiksZVtNcl09dCxlW1phXT1yLGd3KGUsdCwhMSwhMSksdC5zdGF0ZU5vZGU9ZTtlOntzd2l0Y2gobD11cChuLHIpLG4pe2Nhc2UiZGlhbG9nIjpldCgiY2FuY2VsIixlKSxldCgiY2xvc2UiLGUpLGk9cjticmVhaztjYXNlImlmcmFtZSI6Y2FzZSJvYmplY3QiOmNhc2UiZW1iZWQiOmV0KCJsb2FkIixlKSxpPXI7YnJlYWs7Y2FzZSJ2aWRlbyI6Y2FzZSJhdWRpbyI6Zm9yKGk9MDtpPHVhLmxlbmd0aDtpKyspZXQodWFbaV0sZSk7aT1yO2JyZWFrO2Nhc2Uic291cmNlIjpldCgiZXJyb3IiLGUpLGk9cjticmVhaztjYXNlImltZyI6Y2FzZSJpbWFnZSI6Y2FzZSJsaW5rIjpldCgiZXJyb3IiLGUpLGV0KCJsb2FkIixlKSxpPXI7YnJlYWs7Y2FzZSJkZXRhaWxzIjpldCgidG9nZ2xlIixlKSxpPXI7YnJlYWs7Y2FzZSJpbnB1dCI6cHkoZSxyKSxpPXJwKGUsciksZXQoImludmFsaWQiLGUpO2JyZWFrO2Nhc2Uib3B0aW9uIjppPXI7YnJlYWs7Y2FzZSJzZWxlY3QiOmUuX3dyYXBwZXJTdGF0ZT17d2FzTXVsdGlwbGU6ISFyLm11bHRpcGxlfSxpPW10KHt9LHIse3ZhbHVlOnZvaWQgMH0pLGV0KCJpbnZhbGlkIixlKTticmVhaztjYXNlInRleHRhcmVhIjpneShlLHIpLGk9bHAoZSxyKSxldCgiaW52YWxpZCIsZSk7YnJlYWs7ZGVmYXVsdDppPXJ9YXAobixpKSxzPWk7Zm9yKG8gaW4gcylpZihzLmhhc093blByb3BlcnR5KG8pKXt2YXIgYT1zW29dO289PT0ic3R5bGUiP0dfKGUsYSk6bz09PSJkYW5nZXJvdXNseVNldElubmVySFRNTCI/KGE9YT9hLl9faHRtbDp2b2lkIDAsYSE9bnVsbCYmS18oZSxhKSk6bz09PSJjaGlsZHJlbiI/dHlwZW9mIGE9PSJzdHJpbmciPyhuIT09InRleHRhcmVhInx8YSE9PSIiKSYmamEoZSxhKTp0eXBlb2YgYT09Im51bWJlciImJmphKGUsIiIrYSk6byE9PSJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmciJiZvIT09InN1cHByZXNzSHlkcmF0aW9uV2FybmluZyImJm8hPT0iYXV0b0ZvY3VzIiYmKElhLmhhc093blByb3BlcnR5KG8pP2EhPW51bGwmJm89PT0ib25TY3JvbGwiJiZldCgic2Nyb2xsIixlKTphIT1udWxsJiZyZyhlLG8sYSxsKSl9c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOlF1KGUpLG15KGUsciwhMSk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6UXUoZSksdnkoZSk7YnJlYWs7Y2FzZSJvcHRpb24iOnIudmFsdWUhPW51bGwmJmUuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIrdG8oci52YWx1ZSkpO2JyZWFrO2Nhc2Uic2VsZWN0IjplLm11bHRpcGxlPSEhci5tdWx0aXBsZSxvPXIudmFsdWUsbyE9bnVsbD9XbChlLCEhci5tdWx0aXBsZSxvLCExKTpyLmRlZmF1bHRWYWx1ZSE9bnVsbCYmV2woZSwhIXIubXVsdGlwbGUsci5kZWZhdWx0VmFsdWUsITApO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIGkub25DbGljaz09ImZ1bmN0aW9uIiYmKGUub25jbGljaz1yZCl9c3dpdGNoKG4pe2Nhc2UiYnV0dG9uIjpjYXNlImlucHV0IjpjYXNlInNlbGVjdCI6Y2FzZSJ0ZXh0YXJlYSI6cj0hIXIuYXV0b0ZvY3VzO2JyZWFrIGU7Y2FzZSJpbWciOnI9ITA7YnJlYWsgZTtkZWZhdWx0OnI9ITF9fXImJih0LmZsYWdzfD00KX10LnJlZiE9PW51bGwmJih0LmZsYWdzfD01MTIsdC5mbGFnc3w9MjA5NzE1Mil9cmV0dXJuIFh0KHQpLG51bGw7Y2FzZSA2OmlmKGUmJnQuc3RhdGVOb2RlIT1udWxsKXl3KGUsdCxlLm1lbW9pemVkUHJvcHMscik7ZWxzZXtpZih0eXBlb2YgciE9InN0cmluZyImJnQuc3RhdGVOb2RlPT09bnVsbCl0aHJvdyBFcnJvcihVKDE2NikpO2lmKG49QW8oWWEuY3VycmVudCksQW8oRnIuY3VycmVudCksbGModCkpe2lmKHI9dC5zdGF0ZU5vZGUsbj10Lm1lbW9pemVkUHJvcHMscltNcl09dCwobz1yLm5vZGVWYWx1ZSE9PW4pJiYoZT1JbixlIT09bnVsbCkpc3dpdGNoKGUudGFnKXtjYXNlIDM6b2Moci5ub2RlVmFsdWUsbiwoZS5tb2RlJjEpIT09MCk7YnJlYWs7Y2FzZSA1OmUubWVtb2l6ZWRQcm9wcy5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmchPT0hMCYmb2Moci5ub2RlVmFsdWUsbiwoZS5tb2RlJjEpIT09MCl9byYmKHQuZmxhZ3N8PTQpfWVsc2Ugcj0obi5ub2RlVHlwZT09PTk/bjpuLm93bmVyRG9jdW1lbnQpLmNyZWF0ZVRleHROb2RlKHIpLHJbTXJdPXQsdC5zdGF0ZU5vZGU9cn1yZXR1cm4gWHQodCksbnVsbDtjYXNlIDEzOmlmKGl0KGR0KSxyPXQubWVtb2l6ZWRTdGF0ZSxlPT09bnVsbHx8ZS5tZW1vaXplZFN0YXRlIT09bnVsbCYmZS5tZW1vaXplZFN0YXRlLmRlaHlkcmF0ZWQhPT1udWxsKXtpZihvdCYmTG4hPT1udWxsJiZ0Lm1vZGUmMSYmISh0LmZsYWdzJjEyOCkpRDEoKSxycygpLHQuZmxhZ3N8PTk4NTYwLG89ITE7ZWxzZSBpZihvPWxjKHQpLHIhPT1udWxsJiZyLmRlaHlkcmF0ZWQhPT1udWxsKXtpZihlPT09bnVsbCl7aWYoIW8pdGhyb3cgRXJyb3IoVSgzMTgpKTtpZihvPXQubWVtb2l6ZWRTdGF0ZSxvPW8hPT1udWxsP28uZGVoeWRyYXRlZDpudWxsLCFvKXRocm93IEVycm9yKFUoMzE3KSk7b1tNcl09dH1lbHNlIHJzKCksISh0LmZsYWdzJjEyOCkmJih0Lm1lbW9pemVkU3RhdGU9bnVsbCksdC5mbGFnc3w9NDtYdCh0KSxvPSExfWVsc2UgeXIhPT1udWxsJiYoV3AoeXIpLHlyPW51bGwpLG89ITA7aWYoIW8pcmV0dXJuIHQuZmxhZ3MmNjU1MzY/dDpudWxsfXJldHVybiB0LmZsYWdzJjEyOD8odC5sYW5lcz1uLHQpOihyPXIhPT1udWxsLHIhPT0oZSE9PW51bGwmJmUubWVtb2l6ZWRTdGF0ZSE9PW51bGwpJiZyJiYodC5jaGlsZC5mbGFnc3w9ODE5Mix0Lm1vZGUmMSYmKGU9PT1udWxsfHxkdC5jdXJyZW50JjE/UHQ9PT0wJiYoUHQ9Myk6emcoKSkpLHQudXBkYXRlUXVldWUhPT1udWxsJiYodC5mbGFnc3w9NCksWHQodCksbnVsbCk7Y2FzZSA0OnJldHVybiBvcygpLERwKGUsdCksZT09PW51bGwmJkhhKHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLFh0KHQpLG51bGw7Y2FzZSAxMDpyZXR1cm4gU2codC50eXBlLl9jb250ZXh0KSxYdCh0KSxudWxsO2Nhc2UgMTc6cmV0dXJuIFRuKHQudHlwZSkmJmlkKCksWHQodCksbnVsbDtjYXNlIDE5OmlmKGl0KGR0KSxvPXQubWVtb2l6ZWRTdGF0ZSxvPT09bnVsbClyZXR1cm4gWHQodCksbnVsbDtpZihyPSh0LmZsYWdzJjEyOCkhPT0wLGw9by5yZW5kZXJpbmcsbD09PW51bGwpaWYocilacyhvLCExKTtlbHNle2lmKFB0IT09MHx8ZSE9PW51bGwmJmUuZmxhZ3MmMTI4KWZvcihlPXQuY2hpbGQ7ZSE9PW51bGw7KXtpZihsPWRkKGUpLGwhPT1udWxsKXtmb3IodC5mbGFnc3w9MTI4LFpzKG8sITEpLHI9bC51cGRhdGVRdWV1ZSxyIT09bnVsbCYmKHQudXBkYXRlUXVldWU9cix0LmZsYWdzfD00KSx0LnN1YnRyZWVGbGFncz0wLHI9bixuPXQuY2hpbGQ7biE9PW51bGw7KW89bixlPXIsby5mbGFncyY9MTQ2ODAwNjYsbD1vLmFsdGVybmF0ZSxsPT09bnVsbD8oby5jaGlsZExhbmVzPTAsby5sYW5lcz1lLG8uY2hpbGQ9bnVsbCxvLnN1YnRyZWVGbGFncz0wLG8ubWVtb2l6ZWRQcm9wcz1udWxsLG8ubWVtb2l6ZWRTdGF0ZT1udWxsLG8udXBkYXRlUXVldWU9bnVsbCxvLmRlcGVuZGVuY2llcz1udWxsLG8uc3RhdGVOb2RlPW51bGwpOihvLmNoaWxkTGFuZXM9bC5jaGlsZExhbmVzLG8ubGFuZXM9bC5sYW5lcyxvLmNoaWxkPWwuY2hpbGQsby5zdWJ0cmVlRmxhZ3M9MCxvLmRlbGV0aW9ucz1udWxsLG8ubWVtb2l6ZWRQcm9wcz1sLm1lbW9pemVkUHJvcHMsby5tZW1vaXplZFN0YXRlPWwubWVtb2l6ZWRTdGF0ZSxvLnVwZGF0ZVF1ZXVlPWwudXBkYXRlUXVldWUsby50eXBlPWwudHlwZSxlPWwuZGVwZW5kZW5jaWVzLG8uZGVwZW5kZW5jaWVzPWU9PT1udWxsP251bGw6e2xhbmVzOmUubGFuZXMsZmlyc3RDb250ZXh0OmUuZmlyc3RDb250ZXh0fSksbj1uLnNpYmxpbmc7cmV0dXJuIFhlKGR0LGR0LmN1cnJlbnQmMXwyKSx0LmNoaWxkfWU9ZS5zaWJsaW5nfW8udGFpbCE9PW51bGwmJkN0KCk+c3MmJih0LmZsYWdzfD0xMjgscj0hMCxacyhvLCExKSx0LmxhbmVzPTQxOTQzMDQpfWVsc2V7aWYoIXIpaWYoZT1kZChsKSxlIT09bnVsbCl7aWYodC5mbGFnc3w9MTI4LHI9ITAsbj1lLnVwZGF0ZVF1ZXVlLG4hPT1udWxsJiYodC51cGRhdGVRdWV1ZT1uLHQuZmxhZ3N8PTQpLFpzKG8sITApLG8udGFpbD09PW51bGwmJm8udGFpbE1vZGU9PT0iaGlkZGVuIiYmIWwuYWx0ZXJuYXRlJiYhb3QpcmV0dXJuIFh0KHQpLG51bGx9ZWxzZSAyKkN0KCktby5yZW5kZXJpbmdTdGFydFRpbWU+c3MmJm4hPT0xMDczNzQxODI0JiYodC5mbGFnc3w9MTI4LHI9ITAsWnMobywhMSksdC5sYW5lcz00MTk0MzA0KTtvLmlzQmFja3dhcmRzPyhsLnNpYmxpbmc9dC5jaGlsZCx0LmNoaWxkPWwpOihuPW8ubGFzdCxuIT09bnVsbD9uLnNpYmxpbmc9bDp0LmNoaWxkPWwsby5sYXN0PWwpfXJldHVybiBvLnRhaWwhPT1udWxsPyh0PW8udGFpbCxvLnJlbmRlcmluZz10LG8udGFpbD10LnNpYmxpbmcsby5yZW5kZXJpbmdTdGFydFRpbWU9Q3QoKSx0LnNpYmxpbmc9bnVsbCxuPWR0LmN1cnJlbnQsWGUoZHQscj9uJjF8MjpuJjEpLHQpOihYdCh0KSxudWxsKTtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIGpnKCkscj10Lm1lbW9pemVkU3RhdGUhPT1udWxsLGUhPT1udWxsJiZlLm1lbW9pemVkU3RhdGUhPT1udWxsIT09ciYmKHQuZmxhZ3N8PTgxOTIpLHImJnQubW9kZSYxP0FuJjEwNzM3NDE4MjQmJihYdCh0KSx0LnN1YnRyZWVGbGFncyY2JiYodC5mbGFnc3w9ODE5MikpOlh0KHQpLG51bGw7Y2FzZSAyNDpyZXR1cm4gbnVsbDtjYXNlIDI1OnJldHVybiBudWxsfXRocm93IEVycm9yKFUoMTU2LHQudGFnKSl9ZnVuY3Rpb24geVQoZSx0KXtzd2l0Y2goeWcodCksdC50YWcpe2Nhc2UgMTpyZXR1cm4gVG4odC50eXBlKSYmaWQoKSxlPXQuZmxhZ3MsZSY2NTUzNj8odC5mbGFncz1lJi02NTUzN3wxMjgsdCk6bnVsbDtjYXNlIDM6cmV0dXJuIG9zKCksaXQoYm4pLGl0KHJuKSxiZygpLGU9dC5mbGFncyxlJjY1NTM2JiYhKGUmMTI4KT8odC5mbGFncz1lJi02NTUzN3wxMjgsdCk6bnVsbDtjYXNlIDU6cmV0dXJuICRnKHQpLG51bGw7Y2FzZSAxMzppZihpdChkdCksZT10Lm1lbW9pemVkU3RhdGUsZSE9PW51bGwmJmUuZGVoeWRyYXRlZCE9PW51bGwpe2lmKHQuYWx0ZXJuYXRlPT09bnVsbCl0aHJvdyBFcnJvcihVKDM0MCkpO3JzKCl9cmV0dXJuIGU9dC5mbGFncyxlJjY1NTM2Pyh0LmZsYWdzPWUmLTY1NTM3fDEyOCx0KTpudWxsO2Nhc2UgMTk6cmV0dXJuIGl0KGR0KSxudWxsO2Nhc2UgNDpyZXR1cm4gb3MoKSxudWxsO2Nhc2UgMTA6cmV0dXJuIFNnKHQudHlwZS5fY29udGV4dCksbnVsbDtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIGpnKCksbnVsbDtjYXNlIDI0OnJldHVybiBudWxsO2RlZmF1bHQ6cmV0dXJuIG51bGx9fXZhciB1Yz0hMSxKdD0hMSx4VD10eXBlb2YgV2Vha1NldD09ImZ1bmN0aW9uIj9XZWFrU2V0OlNldCxlZT1udWxsO2Z1bmN0aW9uIElsKGUsdCl7dmFyIG49ZS5yZWY7aWYobiE9PW51bGwpaWYodHlwZW9mIG49PSJmdW5jdGlvbiIpdHJ5e24obnVsbCl9Y2F0Y2gocil7dnQoZSx0LHIpfWVsc2Ugbi5jdXJyZW50PW51bGx9ZnVuY3Rpb24gTHAoZSx0LG4pe3RyeXtuKCl9Y2F0Y2gocil7dnQoZSx0LHIpfX12YXIgbDA9ITE7ZnVuY3Rpb24gX1QoZSx0KXtpZih4cD1lZCxlPVMxKCksZ2coZSkpe2lmKCJzZWxlY3Rpb25TdGFydCJpbiBlKXZhciBuPXtzdGFydDplLnNlbGVjdGlvblN0YXJ0LGVuZDplLnNlbGVjdGlvbkVuZH07ZWxzZSBlOntuPShuPWUub3duZXJEb2N1bWVudCkmJm4uZGVmYXVsdFZpZXd8fHdpbmRvdzt2YXIgcj1uLmdldFNlbGVjdGlvbiYmbi5nZXRTZWxlY3Rpb24oKTtpZihyJiZyLnJhbmdlQ291bnQhPT0wKXtuPXIuYW5jaG9yTm9kZTt2YXIgaT1yLmFuY2hvck9mZnNldCxvPXIuZm9jdXNOb2RlO3I9ci5mb2N1c09mZnNldDt0cnl7bi5ub2RlVHlwZSxvLm5vZGVUeXBlfWNhdGNoe249bnVsbDticmVhayBlfXZhciBsPTAscz0tMSxhPS0xLHU9MCxjPTAsZD1lLGY9bnVsbDt0OmZvcig7Oyl7Zm9yKHZhciBoO2QhPT1ufHxpIT09MCYmZC5ub2RlVHlwZSE9PTN8fChzPWwraSksZCE9PW98fHIhPT0wJiZkLm5vZGVUeXBlIT09M3x8KGE9bCtyKSxkLm5vZGVUeXBlPT09MyYmKGwrPWQubm9kZVZhbHVlLmxlbmd0aCksKGg9ZC5maXJzdENoaWxkKSE9PW51bGw7KWY9ZCxkPWg7Zm9yKDs7KXtpZihkPT09ZSlicmVhayB0O2lmKGY9PT1uJiYrK3U9PT1pJiYocz1sKSxmPT09byYmKytjPT09ciYmKGE9bCksKGg9ZC5uZXh0U2libGluZykhPT1udWxsKWJyZWFrO2Q9ZixmPWQucGFyZW50Tm9kZX1kPWh9bj1zPT09LTF8fGE9PT0tMT9udWxsOntzdGFydDpzLGVuZDphfX1lbHNlIG49bnVsbH1uPW58fHtzdGFydDowLGVuZDowfX1lbHNlIG49bnVsbDtmb3IoX3A9e2ZvY3VzZWRFbGVtOmUsc2VsZWN0aW9uUmFuZ2U6bn0sZWQ9ITEsZWU9dDtlZSE9PW51bGw7KWlmKHQ9ZWUsZT10LmNoaWxkLCh0LnN1YnRyZWVGbGFncyYxMDI4KSE9PTAmJmUhPT1udWxsKWUucmV0dXJuPXQsZWU9ZTtlbHNlIGZvcig7ZWUhPT1udWxsOyl7dD1lZTt0cnl7dmFyIG09dC5hbHRlcm5hdGU7aWYodC5mbGFncyYxMDI0KXN3aXRjaCh0LnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpicmVhaztjYXNlIDE6aWYobSE9PW51bGwpe3ZhciBnPW0ubWVtb2l6ZWRQcm9wcyx3PW0ubWVtb2l6ZWRTdGF0ZSx2PXQuc3RhdGVOb2RlLHk9di5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSh0LmVsZW1lbnRUeXBlPT09dC50eXBlP2c6bXIodC50eXBlLGcpLHcpO3YuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGU9eX1icmVhaztjYXNlIDM6dmFyIF89dC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztfLm5vZGVUeXBlPT09MT9fLnRleHRDb250ZW50PSIiOl8ubm9kZVR5cGU9PT05JiZfLmRvY3VtZW50RWxlbWVudCYmXy5yZW1vdmVDaGlsZChfLmRvY3VtZW50RWxlbWVudCk7YnJlYWs7Y2FzZSA1OmNhc2UgNjpjYXNlIDQ6Y2FzZSAxNzpicmVhaztkZWZhdWx0OnRocm93IEVycm9yKFUoMTYzKSl9fWNhdGNoKFMpe3Z0KHQsdC5yZXR1cm4sUyl9aWYoZT10LnNpYmxpbmcsZSE9PW51bGwpe2UucmV0dXJuPXQucmV0dXJuLGVlPWU7YnJlYWt9ZWU9dC5yZXR1cm59cmV0dXJuIG09bDAsbDA9ITEsbX1mdW5jdGlvbiBfYShlLHQsbil7dmFyIHI9dC51cGRhdGVRdWV1ZTtpZihyPXIhPT1udWxsP3IubGFzdEVmZmVjdDpudWxsLHIhPT1udWxsKXt2YXIgaT1yPXIubmV4dDtkb3tpZigoaS50YWcmZSk9PT1lKXt2YXIgbz1pLmRlc3Ryb3k7aS5kZXN0cm95PXZvaWQgMCxvIT09dm9pZCAwJiZMcCh0LG4sbyl9aT1pLm5leHR9d2hpbGUoaSE9PXIpfX1mdW5jdGlvbiBmZihlLHQpe2lmKHQ9dC51cGRhdGVRdWV1ZSx0PXQhPT1udWxsP3QubGFzdEVmZmVjdDpudWxsLHQhPT1udWxsKXt2YXIgbj10PXQubmV4dDtkb3tpZigobi50YWcmZSk9PT1lKXt2YXIgcj1uLmNyZWF0ZTtuLmRlc3Ryb3k9cigpfW49bi5uZXh0fXdoaWxlKG4hPT10KX19ZnVuY3Rpb24gSXAoZSl7dmFyIHQ9ZS5yZWY7aWYodCE9PW51bGwpe3ZhciBuPWUuc3RhdGVOb2RlO3N3aXRjaChlLnRhZyl7Y2FzZSA1OmU9bjticmVhaztkZWZhdWx0OmU9bn10eXBlb2YgdD09ImZ1bmN0aW9uIj90KGUpOnQuY3VycmVudD1lfX1mdW5jdGlvbiB4dyhlKXt2YXIgdD1lLmFsdGVybmF0ZTt0IT09bnVsbCYmKGUuYWx0ZXJuYXRlPW51bGwseHcodCkpLGUuY2hpbGQ9bnVsbCxlLmRlbGV0aW9ucz1udWxsLGUuc2libGluZz1udWxsLGUudGFnPT09NSYmKHQ9ZS5zdGF0ZU5vZGUsdCE9PW51bGwmJihkZWxldGUgdFtNcl0sZGVsZXRlIHRbWmFdLGRlbGV0ZSB0W0VwXSxkZWxldGUgdFtuVF0sZGVsZXRlIHRbclRdKSksZS5zdGF0ZU5vZGU9bnVsbCxlLnJldHVybj1udWxsLGUuZGVwZW5kZW5jaWVzPW51bGwsZS5tZW1vaXplZFByb3BzPW51bGwsZS5tZW1vaXplZFN0YXRlPW51bGwsZS5wZW5kaW5nUHJvcHM9bnVsbCxlLnN0YXRlTm9kZT1udWxsLGUudXBkYXRlUXVldWU9bnVsbH1mdW5jdGlvbiBfdyhlKXtyZXR1cm4gZS50YWc9PT01fHxlLnRhZz09PTN8fGUudGFnPT09NH1mdW5jdGlvbiBzMChlKXtlOmZvcig7Oyl7Zm9yKDtlLnNpYmxpbmc9PT1udWxsOyl7aWYoZS5yZXR1cm49PT1udWxsfHxfdyhlLnJldHVybikpcmV0dXJuIG51bGw7ZT1lLnJldHVybn1mb3IoZS5zaWJsaW5nLnJldHVybj1lLnJldHVybixlPWUuc2libGluZztlLnRhZyE9PTUmJmUudGFnIT09NiYmZS50YWchPT0xODspe2lmKGUuZmxhZ3MmMnx8ZS5jaGlsZD09PW51bGx8fGUudGFnPT09NCljb250aW51ZSBlO2UuY2hpbGQucmV0dXJuPWUsZT1lLmNoaWxkfWlmKCEoZS5mbGFncyYyKSlyZXR1cm4gZS5zdGF0ZU5vZGV9fWZ1bmN0aW9uIGpwKGUsdCxuKXt2YXIgcj1lLnRhZztpZihyPT09NXx8cj09PTYpZT1lLnN0YXRlTm9kZSx0P24ubm9kZVR5cGU9PT04P24ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0KTpuLmluc2VydEJlZm9yZShlLHQpOihuLm5vZGVUeXBlPT09OD8odD1uLnBhcmVudE5vZGUsdC5pbnNlcnRCZWZvcmUoZSxuKSk6KHQ9bix0LmFwcGVuZENoaWxkKGUpKSxuPW4uX3JlYWN0Um9vdENvbnRhaW5lcixuIT1udWxsfHx0Lm9uY2xpY2shPT1udWxsfHwodC5vbmNsaWNrPXJkKSk7ZWxzZSBpZihyIT09NCYmKGU9ZS5jaGlsZCxlIT09bnVsbCkpZm9yKGpwKGUsdCxuKSxlPWUuc2libGluZztlIT09bnVsbDspanAoZSx0LG4pLGU9ZS5zaWJsaW5nfWZ1bmN0aW9uIHpwKGUsdCxuKXt2YXIgcj1lLnRhZztpZihyPT09NXx8cj09PTYpZT1lLnN0YXRlTm9kZSx0P24uaW5zZXJ0QmVmb3JlKGUsdCk6bi5hcHBlbmRDaGlsZChlKTtlbHNlIGlmKHIhPT00JiYoZT1lLmNoaWxkLGUhPT1udWxsKSlmb3IoenAoZSx0LG4pLGU9ZS5zaWJsaW5nO2UhPT1udWxsOyl6cChlLHQsbiksZT1lLnNpYmxpbmd9dmFyIEh0PW51bGwsZ3I9ITE7ZnVuY3Rpb24gJGkoZSx0LG4pe2ZvcihuPW4uY2hpbGQ7biE9PW51bGw7KXd3KGUsdCxuKSxuPW4uc2libGluZ31mdW5jdGlvbiB3dyhlLHQsbil7aWYoenImJnR5cGVvZiB6ci5vbkNvbW1pdEZpYmVyVW5tb3VudD09ImZ1bmN0aW9uIil0cnl7enIub25Db21taXRGaWJlclVubW91bnQocmYsbil9Y2F0Y2h7fXN3aXRjaChuLnRhZyl7Y2FzZSA1Okp0fHxJbChuLHQpO2Nhc2UgNjp2YXIgcj1IdCxpPWdyO0h0PW51bGwsJGkoZSx0LG4pLEh0PXIsZ3I9aSxIdCE9PW51bGwmJihncj8oZT1IdCxuPW4uc3RhdGVOb2RlLGUubm9kZVR5cGU9PT04P2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKTplLnJlbW92ZUNoaWxkKG4pKTpIdC5yZW1vdmVDaGlsZChuLnN0YXRlTm9kZSkpO2JyZWFrO2Nhc2UgMTg6SHQhPT1udWxsJiYoZ3I/KGU9SHQsbj1uLnN0YXRlTm9kZSxlLm5vZGVUeXBlPT09OD94aChlLnBhcmVudE5vZGUsbik6ZS5ub2RlVHlwZT09PTEmJnhoKGUsbiksVWEoZSkpOnhoKEh0LG4uc3RhdGVOb2RlKSk7YnJlYWs7Y2FzZSA0OnI9SHQsaT1ncixIdD1uLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLGdyPSEwLCRpKGUsdCxuKSxIdD1yLGdyPWk7YnJlYWs7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmlmKCFKdCYmKHI9bi51cGRhdGVRdWV1ZSxyIT09bnVsbCYmKHI9ci5sYXN0RWZmZWN0LHIhPT1udWxsKSkpe2k9cj1yLm5leHQ7ZG97dmFyIG89aSxsPW8uZGVzdHJveTtvPW8udGFnLGwhPT12b2lkIDAmJihvJjJ8fG8mNCkmJkxwKG4sdCxsKSxpPWkubmV4dH13aGlsZShpIT09cil9JGkoZSx0LG4pO2JyZWFrO2Nhc2UgMTppZighSnQmJihJbChuLHQpLHI9bi5zdGF0ZU5vZGUsdHlwZW9mIHIuY29tcG9uZW50V2lsbFVubW91bnQ9PSJmdW5jdGlvbiIpKXRyeXtyLnByb3BzPW4ubWVtb2l6ZWRQcm9wcyxyLnN0YXRlPW4ubWVtb2l6ZWRTdGF0ZSxyLmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2gocyl7dnQobix0LHMpfSRpKGUsdCxuKTticmVhaztjYXNlIDIxOiRpKGUsdCxuKTticmVhaztjYXNlIDIyOm4ubW9kZSYxPyhKdD0ocj1KdCl8fG4ubWVtb2l6ZWRTdGF0ZSE9PW51bGwsJGkoZSx0LG4pLEp0PXIpOiRpKGUsdCxuKTticmVhaztkZWZhdWx0OiRpKGUsdCxuKX19ZnVuY3Rpb24gYTAoZSl7dmFyIHQ9ZS51cGRhdGVRdWV1ZTtpZih0IT09bnVsbCl7ZS51cGRhdGVRdWV1ZT1udWxsO3ZhciBuPWUuc3RhdGVOb2RlO249PT1udWxsJiYobj1lLnN0YXRlTm9kZT1uZXcgeFQpLHQuZm9yRWFjaChmdW5jdGlvbihyKXt2YXIgaT1OVC5iaW5kKG51bGwsZSxyKTtuLmhhcyhyKXx8KG4uYWRkKHIpLHIudGhlbihpLGkpKX0pfX1mdW5jdGlvbiBkcihlLHQpe3ZhciBuPXQuZGVsZXRpb25zO2lmKG4hPT1udWxsKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgaT1uW3JdO3RyeXt2YXIgbz1lLGw9dCxzPWw7ZTpmb3IoO3MhPT1udWxsOyl7c3dpdGNoKHMudGFnKXtjYXNlIDU6SHQ9cy5zdGF0ZU5vZGUsZ3I9ITE7YnJlYWsgZTtjYXNlIDM6SHQ9cy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxncj0hMDticmVhayBlO2Nhc2UgNDpIdD1zLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLGdyPSEwO2JyZWFrIGV9cz1zLnJldHVybn1pZihIdD09PW51bGwpdGhyb3cgRXJyb3IoVSgxNjApKTt3dyhvLGwsaSksSHQ9bnVsbCxncj0hMTt2YXIgYT1pLmFsdGVybmF0ZTthIT09bnVsbCYmKGEucmV0dXJuPW51bGwpLGkucmV0dXJuPW51bGx9Y2F0Y2godSl7dnQoaSx0LHUpfX1pZih0LnN1YnRyZWVGbGFncyYxMjg1NClmb3IodD10LmNoaWxkO3QhPT1udWxsOylTdyh0LGUpLHQ9dC5zaWJsaW5nfWZ1bmN0aW9uIFN3KGUsdCl7dmFyIG49ZS5hbHRlcm5hdGUscj1lLmZsYWdzO3N3aXRjaChlLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmlmKGRyKHQsZSksT3IoZSksciY0KXt0cnl7X2EoMyxlLGUucmV0dXJuKSxmZigzLGUpfWNhdGNoKGcpe3Z0KGUsZS5yZXR1cm4sZyl9dHJ5e19hKDUsZSxlLnJldHVybil9Y2F0Y2goZyl7dnQoZSxlLnJldHVybixnKX19YnJlYWs7Y2FzZSAxOmRyKHQsZSksT3IoZSksciY1MTImJm4hPT1udWxsJiZJbChuLG4ucmV0dXJuKTticmVhaztjYXNlIDU6aWYoZHIodCxlKSxPcihlKSxyJjUxMiYmbiE9PW51bGwmJklsKG4sbi5yZXR1cm4pLGUuZmxhZ3MmMzIpe3ZhciBpPWUuc3RhdGVOb2RlO3RyeXtqYShpLCIiKX1jYXRjaChnKXt2dChlLGUucmV0dXJuLGcpfX1pZihyJjQmJihpPWUuc3RhdGVOb2RlLGkhPW51bGwpKXt2YXIgbz1lLm1lbW9pemVkUHJvcHMsbD1uIT09bnVsbD9uLm1lbW9pemVkUHJvcHM6byxzPWUudHlwZSxhPWUudXBkYXRlUXVldWU7aWYoZS51cGRhdGVRdWV1ZT1udWxsLGEhPT1udWxsKXRyeXtzPT09ImlucHV0IiYmby50eXBlPT09InJhZGlvIiYmby5uYW1lIT1udWxsJiZXXyhpLG8pLHVwKHMsbCk7dmFyIHU9dXAocyxvKTtmb3IobD0wO2w8YS5sZW5ndGg7bCs9Mil7dmFyIGM9YVtsXSxkPWFbbCsxXTtjPT09InN0eWxlIj9HXyhpLGQpOmM9PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiP0tfKGksZCk6Yz09PSJjaGlsZHJlbiI/amEoaSxkKTpyZyhpLGMsZCx1KX1zd2l0Y2gocyl7Y2FzZSJpbnB1dCI6aXAoaSxvKTticmVhaztjYXNlInRleHRhcmVhIjpWXyhpLG8pO2JyZWFrO2Nhc2Uic2VsZWN0Ijp2YXIgZj1pLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU7aS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlPSEhby5tdWx0aXBsZTt2YXIgaD1vLnZhbHVlO2ghPW51bGw/V2woaSwhIW8ubXVsdGlwbGUsaCwhMSk6ZiE9PSEhby5tdWx0aXBsZSYmKG8uZGVmYXVsdFZhbHVlIT1udWxsP1dsKGksISFvLm11bHRpcGxlLG8uZGVmYXVsdFZhbHVlLCEwKTpXbChpLCEhby5tdWx0aXBsZSxvLm11bHRpcGxlP1tdOiIiLCExKSl9aVtaYV09b31jYXRjaChnKXt2dChlLGUucmV0dXJuLGcpfX1icmVhaztjYXNlIDY6aWYoZHIodCxlKSxPcihlKSxyJjQpe2lmKGUuc3RhdGVOb2RlPT09bnVsbCl0aHJvdyBFcnJvcihVKDE2MikpO2k9ZS5zdGF0ZU5vZGUsbz1lLm1lbW9pemVkUHJvcHM7dHJ5e2kubm9kZVZhbHVlPW99Y2F0Y2goZyl7dnQoZSxlLnJldHVybixnKX19YnJlYWs7Y2FzZSAzOmlmKGRyKHQsZSksT3IoZSksciY0JiZuIT09bnVsbCYmbi5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl0cnl7VWEodC5jb250YWluZXJJbmZvKX1jYXRjaChnKXt2dChlLGUucmV0dXJuLGcpfWJyZWFrO2Nhc2UgNDpkcih0LGUpLE9yKGUpO2JyZWFrO2Nhc2UgMTM6ZHIodCxlKSxPcihlKSxpPWUuY2hpbGQsaS5mbGFncyY4MTkyJiYobz1pLm1lbW9pemVkU3RhdGUhPT1udWxsLGkuc3RhdGVOb2RlLmlzSGlkZGVuPW8sIW98fGkuYWx0ZXJuYXRlIT09bnVsbCYmaS5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZSE9PW51bGx8fChMZz1DdCgpKSksciY0JiZhMChlKTticmVhaztjYXNlIDIyOmlmKGM9biE9PW51bGwmJm4ubWVtb2l6ZWRTdGF0ZSE9PW51bGwsZS5tb2RlJjE/KEp0PSh1PUp0KXx8Yyxkcih0LGUpLEp0PXUpOmRyKHQsZSksT3IoZSksciY4MTkyKXtpZih1PWUubWVtb2l6ZWRTdGF0ZSE9PW51bGwsKGUuc3RhdGVOb2RlLmlzSGlkZGVuPXUpJiYhYyYmZS5tb2RlJjEpZm9yKGVlPWUsYz1lLmNoaWxkO2MhPT1udWxsOyl7Zm9yKGQ9ZWU9YztlZSE9PW51bGw7KXtzd2l0Y2goZj1lZSxoPWYuY2hpbGQsZi50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTpfYSg0LGYsZi5yZXR1cm4pO2JyZWFrO2Nhc2UgMTpJbChmLGYucmV0dXJuKTt2YXIgbT1mLnN0YXRlTm9kZTtpZih0eXBlb2YgbS5jb21wb25lbnRXaWxsVW5tb3VudD09ImZ1bmN0aW9uIil7cj1mLG49Zi5yZXR1cm47dHJ5e3Q9cixtLnByb3BzPXQubWVtb2l6ZWRQcm9wcyxtLnN0YXRlPXQubWVtb2l6ZWRTdGF0ZSxtLmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2goZyl7dnQocixuLGcpfX1icmVhaztjYXNlIDU6SWwoZixmLnJldHVybik7YnJlYWs7Y2FzZSAyMjppZihmLm1lbW9pemVkU3RhdGUhPT1udWxsKXtjMChkKTtjb250aW51ZX19aCE9PW51bGw/KGgucmV0dXJuPWYsZWU9aCk6YzAoZCl9Yz1jLnNpYmxpbmd9ZTpmb3IoYz1udWxsLGQ9ZTs7KXtpZihkLnRhZz09PTUpe2lmKGM9PT1udWxsKXtjPWQ7dHJ5e2k9ZC5zdGF0ZU5vZGUsdT8obz1pLnN0eWxlLHR5cGVvZiBvLnNldFByb3BlcnR5PT0iZnVuY3Rpb24iP28uc2V0UHJvcGVydHkoImRpc3BsYXkiLCJub25lIiwiaW1wb3J0YW50Iik6by5kaXNwbGF5PSJub25lIik6KHM9ZC5zdGF0ZU5vZGUsYT1kLm1lbW9pemVkUHJvcHMuc3R5bGUsbD1hIT1udWxsJiZhLmhhc093blByb3BlcnR5KCJkaXNwbGF5Iik/YS5kaXNwbGF5Om51bGwscy5zdHlsZS5kaXNwbGF5PVpfKCJkaXNwbGF5IixsKSl9Y2F0Y2goZyl7dnQoZSxlLnJldHVybixnKX19fWVsc2UgaWYoZC50YWc9PT02KXtpZihjPT09bnVsbCl0cnl7ZC5zdGF0ZU5vZGUubm9kZVZhbHVlPXU/IiI6ZC5tZW1vaXplZFByb3BzfWNhdGNoKGcpe3Z0KGUsZS5yZXR1cm4sZyl9fWVsc2UgaWYoKGQudGFnIT09MjImJmQudGFnIT09MjN8fGQubWVtb2l6ZWRTdGF0ZT09PW51bGx8fGQ9PT1lKSYmZC5jaGlsZCE9PW51bGwpe2QuY2hpbGQucmV0dXJuPWQsZD1kLmNoaWxkO2NvbnRpbnVlfWlmKGQ9PT1lKWJyZWFrIGU7Zm9yKDtkLnNpYmxpbmc9PT1udWxsOyl7aWYoZC5yZXR1cm49PT1udWxsfHxkLnJldHVybj09PWUpYnJlYWsgZTtjPT09ZCYmKGM9bnVsbCksZD1kLnJldHVybn1jPT09ZCYmKGM9bnVsbCksZC5zaWJsaW5nLnJldHVybj1kLnJldHVybixkPWQuc2libGluZ319YnJlYWs7Y2FzZSAxOTpkcih0LGUpLE9yKGUpLHImNCYmYTAoZSk7YnJlYWs7Y2FzZSAyMTpicmVhaztkZWZhdWx0OmRyKHQsZSksT3IoZSl9fWZ1bmN0aW9uIE9yKGUpe3ZhciB0PWUuZmxhZ3M7aWYodCYyKXt0cnl7ZTp7Zm9yKHZhciBuPWUucmV0dXJuO24hPT1udWxsOyl7aWYoX3cobikpe3ZhciByPW47YnJlYWsgZX1uPW4ucmV0dXJufXRocm93IEVycm9yKFUoMTYwKSl9c3dpdGNoKHIudGFnKXtjYXNlIDU6dmFyIGk9ci5zdGF0ZU5vZGU7ci5mbGFncyYzMiYmKGphKGksIiIpLHIuZmxhZ3MmPS0zMyk7dmFyIG89czAoZSk7enAoZSxvLGkpO2JyZWFrO2Nhc2UgMzpjYXNlIDQ6dmFyIGw9ci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxzPXMwKGUpO2pwKGUscyxsKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKFUoMTYxKSl9fWNhdGNoKGEpe3Z0KGUsZS5yZXR1cm4sYSl9ZS5mbGFncyY9LTN9dCY0MDk2JiYoZS5mbGFncyY9LTQwOTcpfWZ1bmN0aW9uIHdUKGUsdCxuKXtlZT1lLEV3KGUpfWZ1bmN0aW9uIEV3KGUsdCxuKXtmb3IodmFyIHI9KGUubW9kZSYxKSE9PTA7ZWUhPT1udWxsOyl7dmFyIGk9ZWUsbz1pLmNoaWxkO2lmKGkudGFnPT09MjImJnIpe3ZhciBsPWkubWVtb2l6ZWRTdGF0ZSE9PW51bGx8fHVjO2lmKCFsKXt2YXIgcz1pLmFsdGVybmF0ZSxhPXMhPT1udWxsJiZzLm1lbW9pemVkU3RhdGUhPT1udWxsfHxKdDtzPXVjO3ZhciB1PUp0O2lmKHVjPWwsKEp0PWEpJiYhdSlmb3IoZWU9aTtlZSE9PW51bGw7KWw9ZWUsYT1sLmNoaWxkLGwudGFnPT09MjImJmwubWVtb2l6ZWRTdGF0ZSE9PW51bGw/ZDAoaSk6YSE9PW51bGw/KGEucmV0dXJuPWwsZWU9YSk6ZDAoaSk7Zm9yKDtvIT09bnVsbDspZWU9byxFdyhvKSxvPW8uc2libGluZztlZT1pLHVjPXMsSnQ9dX11MChlKX1lbHNlIGkuc3VidHJlZUZsYWdzJjg3NzImJm8hPT1udWxsPyhvLnJldHVybj1pLGVlPW8pOnUwKGUpfX1mdW5jdGlvbiB1MChlKXtmb3IoO2VlIT09bnVsbDspe3ZhciB0PWVlO2lmKHQuZmxhZ3MmODc3Mil7dmFyIG49dC5hbHRlcm5hdGU7dHJ5e2lmKHQuZmxhZ3MmODc3Milzd2l0Y2godC50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6SnR8fGZmKDUsdCk7YnJlYWs7Y2FzZSAxOnZhciByPXQuc3RhdGVOb2RlO2lmKHQuZmxhZ3MmNCYmIUp0KWlmKG49PT1udWxsKXIuY29tcG9uZW50RGlkTW91bnQoKTtlbHNle3ZhciBpPXQuZWxlbWVudFR5cGU9PT10LnR5cGU/bi5tZW1vaXplZFByb3BzOm1yKHQudHlwZSxuLm1lbW9pemVkUHJvcHMpO3IuY29tcG9uZW50RGlkVXBkYXRlKGksbi5tZW1vaXplZFN0YXRlLHIuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUpfXZhciBvPXQudXBkYXRlUXVldWU7byE9PW51bGwmJkt5KHQsbyxyKTticmVhaztjYXNlIDM6dmFyIGw9dC51cGRhdGVRdWV1ZTtpZihsIT09bnVsbCl7aWYobj1udWxsLHQuY2hpbGQhPT1udWxsKXN3aXRjaCh0LmNoaWxkLnRhZyl7Y2FzZSA1Om49dC5jaGlsZC5zdGF0ZU5vZGU7YnJlYWs7Y2FzZSAxOm49dC5jaGlsZC5zdGF0ZU5vZGV9S3kodCxsLG4pfWJyZWFrO2Nhc2UgNTp2YXIgcz10LnN0YXRlTm9kZTtpZihuPT09bnVsbCYmdC5mbGFncyY0KXtuPXM7dmFyIGE9dC5tZW1vaXplZFByb3BzO3N3aXRjaCh0LnR5cGUpe2Nhc2UiYnV0dG9uIjpjYXNlImlucHV0IjpjYXNlInNlbGVjdCI6Y2FzZSJ0ZXh0YXJlYSI6YS5hdXRvRm9jdXMmJm4uZm9jdXMoKTticmVhaztjYXNlImltZyI6YS5zcmMmJihuLnNyYz1hLnNyYyl9fWJyZWFrO2Nhc2UgNjpicmVhaztjYXNlIDQ6YnJlYWs7Y2FzZSAxMjpicmVhaztjYXNlIDEzOmlmKHQubWVtb2l6ZWRTdGF0ZT09PW51bGwpe3ZhciB1PXQuYWx0ZXJuYXRlO2lmKHUhPT1udWxsKXt2YXIgYz11Lm1lbW9pemVkU3RhdGU7aWYoYyE9PW51bGwpe3ZhciBkPWMuZGVoeWRyYXRlZDtkIT09bnVsbCYmVWEoZCl9fX1icmVhaztjYXNlIDE5OmNhc2UgMTc6Y2FzZSAyMTpjYXNlIDIyOmNhc2UgMjM6Y2FzZSAyNTpicmVhaztkZWZhdWx0OnRocm93IEVycm9yKFUoMTYzKSl9SnR8fHQuZmxhZ3MmNTEyJiZJcCh0KX1jYXRjaChmKXt2dCh0LHQucmV0dXJuLGYpfX1pZih0PT09ZSl7ZWU9bnVsbDticmVha31pZihuPXQuc2libGluZyxuIT09bnVsbCl7bi5yZXR1cm49dC5yZXR1cm4sZWU9bjticmVha31lZT10LnJldHVybn19ZnVuY3Rpb24gYzAoZSl7Zm9yKDtlZSE9PW51bGw7KXt2YXIgdD1lZTtpZih0PT09ZSl7ZWU9bnVsbDticmVha312YXIgbj10LnNpYmxpbmc7aWYobiE9PW51bGwpe24ucmV0dXJuPXQucmV0dXJuLGVlPW47YnJlYWt9ZWU9dC5yZXR1cm59fWZ1bmN0aW9uIGQwKGUpe2Zvcig7ZWUhPT1udWxsOyl7dmFyIHQ9ZWU7dHJ5e3N3aXRjaCh0LnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTp2YXIgbj10LnJldHVybjt0cnl7ZmYoNCx0KX1jYXRjaChhKXt2dCh0LG4sYSl9YnJlYWs7Y2FzZSAxOnZhciByPXQuc3RhdGVOb2RlO2lmKHR5cGVvZiByLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iKXt2YXIgaT10LnJldHVybjt0cnl7ci5jb21wb25lbnREaWRNb3VudCgpfWNhdGNoKGEpe3Z0KHQsaSxhKX19dmFyIG89dC5yZXR1cm47dHJ5e0lwKHQpfWNhdGNoKGEpe3Z0KHQsbyxhKX1icmVhaztjYXNlIDU6dmFyIGw9dC5yZXR1cm47dHJ5e0lwKHQpfWNhdGNoKGEpe3Z0KHQsbCxhKX19fWNhdGNoKGEpe3Z0KHQsdC5yZXR1cm4sYSl9aWYodD09PWUpe2VlPW51bGw7YnJlYWt9dmFyIHM9dC5zaWJsaW5nO2lmKHMhPT1udWxsKXtzLnJldHVybj10LnJldHVybixlZT1zO2JyZWFrfWVlPXQucmV0dXJufX12YXIgU1Q9TWF0aC5jZWlsLHBkPXhpLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsTWc9eGkuUmVhY3RDdXJyZW50T3duZXIsbnI9eGkuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsTWU9MCxCdD1udWxsLCR0PW51bGwsWnQ9MCxBbj0wLGpsPWdvKDApLFB0PTAscWE9bnVsbCxLbz0wLGhmPTAsRGc9MCx3YT1udWxsLGtuPW51bGwsTGc9MCxzcz0xLzAsdGk9bnVsbCxtZD0hMSxGcD1udWxsLFlpPW51bGwsY2M9ITEsQmk9bnVsbCxnZD0wLFNhPTAsQnA9bnVsbCxJYz0tMSxqYz0wO2Z1bmN0aW9uIHZuKCl7cmV0dXJuIE1lJjY/Q3QoKTpJYyE9PS0xP0ljOkljPUN0KCl9ZnVuY3Rpb24gWGkoZSl7cmV0dXJuIGUubW9kZSYxP01lJjImJlp0IT09MD9adCYtWnQ6b1QudHJhbnNpdGlvbiE9PW51bGw/KGpjPT09MCYmKGpjPWwxKCkpLGpjKTooZT1VZSxlIT09MHx8KGU9d2luZG93LmV2ZW50LGU9ZT09PXZvaWQgMD8xNjpoMShlLnR5cGUpKSxlKToxfWZ1bmN0aW9uIFNyKGUsdCxuLHIpe2lmKDUwPFNhKXRocm93IFNhPTAsQnA9bnVsbCxFcnJvcihVKDE4NSkpO1J1KGUsbixyKSwoIShNZSYyKXx8ZSE9PUJ0KSYmKGU9PT1CdCYmKCEoTWUmMikmJihoZnw9biksUHQ9PT00JiZJaShlLFp0KSksTm4oZSxyKSxuPT09MSYmTWU9PT0wJiYhKHQubW9kZSYxKSYmKHNzPUN0KCkrNTAwLHVmJiZ2bygpKSl9ZnVuY3Rpb24gTm4oZSx0KXt2YXIgbj1lLmNhbGxiYWNrTm9kZTtvYihlLHQpO3ZhciByPXFjKGUsZT09PUJ0P1p0OjApO2lmKHI9PT0wKW4hPT1udWxsJiZfeShuKSxlLmNhbGxiYWNrTm9kZT1udWxsLGUuY2FsbGJhY2tQcmlvcml0eT0wO2Vsc2UgaWYodD1yJi1yLGUuY2FsbGJhY2tQcmlvcml0eSE9PXQpe2lmKG4hPW51bGwmJl95KG4pLHQ9PT0xKWUudGFnPT09MD9pVChmMC5iaW5kKG51bGwsZSkpOlAxKGYwLmJpbmQobnVsbCxlKSksZVQoZnVuY3Rpb24oKXshKE1lJjYpJiZ2bygpfSksbj1udWxsO2Vsc2V7c3dpdGNoKHMxKHIpKXtjYXNlIDE6bj1hZzticmVhaztjYXNlIDQ6bj1pMTticmVhaztjYXNlIDE2Om49SmM7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6bj1vMTticmVhaztkZWZhdWx0Om49SmN9bj1PdyhuLEN3LmJpbmQobnVsbCxlKSl9ZS5jYWxsYmFja1ByaW9yaXR5PXQsZS5jYWxsYmFja05vZGU9bn19ZnVuY3Rpb24gQ3coZSx0KXtpZihJYz0tMSxqYz0wLE1lJjYpdGhyb3cgRXJyb3IoVSgzMjcpKTt2YXIgbj1lLmNhbGxiYWNrTm9kZTtpZihHbCgpJiZlLmNhbGxiYWNrTm9kZSE9PW4pcmV0dXJuIG51bGw7dmFyIHI9cWMoZSxlPT09QnQ/WnQ6MCk7aWYocj09PTApcmV0dXJuIG51bGw7aWYociYzMHx8ciZlLmV4cGlyZWRMYW5lc3x8dCl0PXZkKGUscik7ZWxzZXt0PXI7dmFyIGk9TWU7TWV8PTI7dmFyIG89JHcoKTsoQnQhPT1lfHxadCE9PXQpJiYodGk9bnVsbCxzcz1DdCgpKzUwMCxMbyhlLHQpKTtkbyB0cnl7a1QoKTticmVha31jYXRjaChzKXtrdyhlLHMpfXdoaWxlKCEwKTt3ZygpLHBkLmN1cnJlbnQ9byxNZT1pLCR0IT09bnVsbD90PTA6KEJ0PW51bGwsWnQ9MCx0PVB0KX1pZih0IT09MCl7aWYodD09PTImJihpPXBwKGUpLGkhPT0wJiYocj1pLHQ9VXAoZSxpKSkpLHQ9PT0xKXRocm93IG49cWEsTG8oZSwwKSxJaShlLHIpLE5uKGUsQ3QoKSksbjtpZih0PT09NilJaShlLHIpO2Vsc2V7aWYoaT1lLmN1cnJlbnQuYWx0ZXJuYXRlLCEociYzMCkmJiFFVChpKSYmKHQ9dmQoZSxyKSx0PT09MiYmKG89cHAoZSksbyE9PTAmJihyPW8sdD1VcChlLG8pKSksdD09PTEpKXRocm93IG49cWEsTG8oZSwwKSxJaShlLHIpLE5uKGUsQ3QoKSksbjtzd2l0Y2goZS5maW5pc2hlZFdvcms9aSxlLmZpbmlzaGVkTGFuZXM9cix0KXtjYXNlIDA6Y2FzZSAxOnRocm93IEVycm9yKFUoMzQ1KSk7Y2FzZSAyOlRvKGUsa24sdGkpO2JyZWFrO2Nhc2UgMzppZihJaShlLHIpLChyJjEzMDAyMzQyNCk9PT1yJiYodD1MZys1MDAtQ3QoKSwxMDx0KSl7aWYocWMoZSwwKSE9PTApYnJlYWs7aWYoaT1lLnN1c3BlbmRlZExhbmVzLChpJnIpIT09cil7dm4oKSxlLnBpbmdlZExhbmVzfD1lLnN1c3BlbmRlZExhbmVzJmk7YnJlYWt9ZS50aW1lb3V0SGFuZGxlPVNwKFRvLmJpbmQobnVsbCxlLGtuLHRpKSx0KTticmVha31UbyhlLGtuLHRpKTticmVhaztjYXNlIDQ6aWYoSWkoZSxyKSwociY0MTk0MjQwKT09PXIpYnJlYWs7Zm9yKHQ9ZS5ldmVudFRpbWVzLGk9LTE7MDxyOyl7dmFyIGw9MzEtd3Iocik7bz0xPDxsLGw9dFtsXSxsPmkmJihpPWwpLHImPX5vfWlmKHI9aSxyPUN0KCktcixyPSgxMjA+cj8xMjA6NDgwPnI/NDgwOjEwODA+cj8xMDgwOjE5MjA+cj8xOTIwOjNlMz5yPzNlMzo0MzIwPnI/NDMyMDoxOTYwKlNUKHIvMTk2MCkpLXIsMTA8cil7ZS50aW1lb3V0SGFuZGxlPVNwKFRvLmJpbmQobnVsbCxlLGtuLHRpKSxyKTticmVha31UbyhlLGtuLHRpKTticmVhaztjYXNlIDU6VG8oZSxrbix0aSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihVKDMyOSkpfX19cmV0dXJuIE5uKGUsQ3QoKSksZS5jYWxsYmFja05vZGU9PT1uP0N3LmJpbmQobnVsbCxlKTpudWxsfWZ1bmN0aW9uIFVwKGUsdCl7dmFyIG49d2E7cmV0dXJuIGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCYmKExvKGUsdCkuZmxhZ3N8PTI1NiksZT12ZChlLHQpLGUhPT0yJiYodD1rbixrbj1uLHQhPT1udWxsJiZXcCh0KSksZX1mdW5jdGlvbiBXcChlKXtrbj09PW51bGw/a249ZTprbi5wdXNoLmFwcGx5KGtuLGUpfWZ1bmN0aW9uIEVUKGUpe2Zvcih2YXIgdD1lOzspe2lmKHQuZmxhZ3MmMTYzODQpe3ZhciBuPXQudXBkYXRlUXVldWU7aWYobiE9PW51bGwmJihuPW4uc3RvcmVzLG4hPT1udWxsKSlmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9bltyXSxvPWkuZ2V0U25hcHNob3Q7aT1pLnZhbHVlO3RyeXtpZigha3IobygpLGkpKXJldHVybiExfWNhdGNoe3JldHVybiExfX19aWYobj10LmNoaWxkLHQuc3VidHJlZUZsYWdzJjE2Mzg0JiZuIT09bnVsbCluLnJldHVybj10LHQ9bjtlbHNle2lmKHQ9PT1lKWJyZWFrO2Zvcig7dC5zaWJsaW5nPT09bnVsbDspe2lmKHQucmV0dXJuPT09bnVsbHx8dC5yZXR1cm49PT1lKXJldHVybiEwO3Q9dC5yZXR1cm59dC5zaWJsaW5nLnJldHVybj10LnJldHVybix0PXQuc2libGluZ319cmV0dXJuITB9ZnVuY3Rpb24gSWkoZSx0KXtmb3IodCY9fkRnLHQmPX5oZixlLnN1c3BlbmRlZExhbmVzfD10LGUucGluZ2VkTGFuZXMmPX50LGU9ZS5leHBpcmF0aW9uVGltZXM7MDx0Oyl7dmFyIG49MzEtd3IodCkscj0xPDxuO2Vbbl09LTEsdCY9fnJ9fWZ1bmN0aW9uIGYwKGUpe2lmKE1lJjYpdGhyb3cgRXJyb3IoVSgzMjcpKTtHbCgpO3ZhciB0PXFjKGUsMCk7aWYoISh0JjEpKXJldHVybiBObihlLEN0KCkpLG51bGw7dmFyIG49dmQoZSx0KTtpZihlLnRhZyE9PTAmJm49PT0yKXt2YXIgcj1wcChlKTtyIT09MCYmKHQ9cixuPVVwKGUscikpfWlmKG49PT0xKXRocm93IG49cWEsTG8oZSwwKSxJaShlLHQpLE5uKGUsQ3QoKSksbjtpZihuPT09Nil0aHJvdyBFcnJvcihVKDM0NSkpO3JldHVybiBlLmZpbmlzaGVkV29yaz1lLmN1cnJlbnQuYWx0ZXJuYXRlLGUuZmluaXNoZWRMYW5lcz10LFRvKGUsa24sdGkpLE5uKGUsQ3QoKSksbnVsbH1mdW5jdGlvbiBJZyhlLHQpe3ZhciBuPU1lO01lfD0xO3RyeXtyZXR1cm4gZSh0KX1maW5hbGx5e01lPW4sTWU9PT0wJiYoc3M9Q3QoKSs1MDAsdWYmJnZvKCkpfX1mdW5jdGlvbiBabyhlKXtCaSE9PW51bGwmJkJpLnRhZz09PTAmJiEoTWUmNikmJkdsKCk7dmFyIHQ9TWU7TWV8PTE7dmFyIG49bnIudHJhbnNpdGlvbixyPVVlO3RyeXtpZihuci50cmFuc2l0aW9uPW51bGwsVWU9MSxlKXJldHVybiBlKCl9ZmluYWxseXtVZT1yLG5yLnRyYW5zaXRpb249bixNZT10LCEoTWUmNikmJnZvKCl9fWZ1bmN0aW9uIGpnKCl7QW49amwuY3VycmVudCxpdChqbCl9ZnVuY3Rpb24gTG8oZSx0KXtlLmZpbmlzaGVkV29yaz1udWxsLGUuZmluaXNoZWRMYW5lcz0wO3ZhciBuPWUudGltZW91dEhhbmRsZTtpZihuIT09LTEmJihlLnRpbWVvdXRIYW5kbGU9LTEscWIobikpLCR0IT09bnVsbClmb3Iobj0kdC5yZXR1cm47biE9PW51bGw7KXt2YXIgcj1uO3N3aXRjaCh5ZyhyKSxyLnRhZyl7Y2FzZSAxOnI9ci50eXBlLmNoaWxkQ29udGV4dFR5cGVzLHIhPW51bGwmJmlkKCk7YnJlYWs7Y2FzZSAzOm9zKCksaXQoYm4pLGl0KHJuKSxiZygpO2JyZWFrO2Nhc2UgNTokZyhyKTticmVhaztjYXNlIDQ6b3MoKTticmVhaztjYXNlIDEzOml0KGR0KTticmVhaztjYXNlIDE5Oml0KGR0KTticmVhaztjYXNlIDEwOlNnKHIudHlwZS5fY29udGV4dCk7YnJlYWs7Y2FzZSAyMjpjYXNlIDIzOmpnKCl9bj1uLnJldHVybn1pZihCdD1lLCR0PWU9UWkoZS5jdXJyZW50LG51bGwpLFp0PUFuPXQsUHQ9MCxxYT1udWxsLERnPWhmPUtvPTAsa249d2E9bnVsbCxQbyE9PW51bGwpe2Zvcih0PTA7dDxQby5sZW5ndGg7dCsrKWlmKG49UG9bdF0scj1uLmludGVybGVhdmVkLHIhPT1udWxsKXtuLmludGVybGVhdmVkPW51bGw7dmFyIGk9ci5uZXh0LG89bi5wZW5kaW5nO2lmKG8hPT1udWxsKXt2YXIgbD1vLm5leHQ7by5uZXh0PWksci5uZXh0PWx9bi5wZW5kaW5nPXJ9UG89bnVsbH1yZXR1cm4gZX1mdW5jdGlvbiBrdyhlLHQpe2Rve3ZhciBuPSR0O3RyeXtpZih3ZygpLE1jLmN1cnJlbnQ9aGQsZmQpe2Zvcih2YXIgcj1odC5tZW1vaXplZFN0YXRlO3IhPT1udWxsOyl7dmFyIGk9ci5xdWV1ZTtpIT09bnVsbCYmKGkucGVuZGluZz1udWxsKSxyPXIubmV4dH1mZD0hMX1pZihIbz0wLEx0PVJ0PWh0PW51bGwseGE9ITEsWGE9MCxNZy5jdXJyZW50PW51bGwsbj09PW51bGx8fG4ucmV0dXJuPT09bnVsbCl7UHQ9MSxxYT10LCR0PW51bGw7YnJlYWt9ZTp7dmFyIG89ZSxsPW4ucmV0dXJuLHM9bixhPXQ7aWYodD1adCxzLmZsYWdzfD0zMjc2OCxhIT09bnVsbCYmdHlwZW9mIGE9PSJvYmplY3QiJiZ0eXBlb2YgYS50aGVuPT0iZnVuY3Rpb24iKXt2YXIgdT1hLGM9cyxkPWMudGFnO2lmKCEoYy5tb2RlJjEpJiYoZD09PTB8fGQ9PT0xMXx8ZD09PTE1KSl7dmFyIGY9Yy5hbHRlcm5hdGU7Zj8oYy51cGRhdGVRdWV1ZT1mLnVwZGF0ZVF1ZXVlLGMubWVtb2l6ZWRTdGF0ZT1mLm1lbW9pemVkU3RhdGUsYy5sYW5lcz1mLmxhbmVzKTooYy51cGRhdGVRdWV1ZT1udWxsLGMubWVtb2l6ZWRTdGF0ZT1udWxsKX12YXIgaD1xeShsKTtpZihoIT09bnVsbCl7aC5mbGFncyY9LTI1NyxlMChoLGwscyxvLHQpLGgubW9kZSYxJiZKeShvLHUsdCksdD1oLGE9dTt2YXIgbT10LnVwZGF0ZVF1ZXVlO2lmKG09PT1udWxsKXt2YXIgZz1uZXcgU2V0O2cuYWRkKGEpLHQudXBkYXRlUXVldWU9Z31lbHNlIG0uYWRkKGEpO2JyZWFrIGV9ZWxzZXtpZighKHQmMSkpe0p5KG8sdSx0KSx6ZygpO2JyZWFrIGV9YT1FcnJvcihVKDQyNikpfX1lbHNlIGlmKG90JiZzLm1vZGUmMSl7dmFyIHc9cXkobCk7aWYodyE9PW51bGwpeyEody5mbGFncyY2NTUzNikmJih3LmZsYWdzfD0yNTYpLGUwKHcsbCxzLG8sdCkseGcobHMoYSxzKSk7YnJlYWsgZX19bz1hPWxzKGEscyksUHQhPT00JiYoUHQ9Miksd2E9PT1udWxsP3dhPVtvXTp3YS5wdXNoKG8pLG89bDtkb3tzd2l0Y2goby50YWcpe2Nhc2UgMzpvLmZsYWdzfD02NTUzNix0Jj0tdCxvLmxhbmVzfD10O3ZhciB2PWF3KG8sYSx0KTtIeShvLHYpO2JyZWFrIGU7Y2FzZSAxOnM9YTt2YXIgeT1vLnR5cGUsXz1vLnN0YXRlTm9kZTtpZighKG8uZmxhZ3MmMTI4KSYmKHR5cGVvZiB5LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj09ImZ1bmN0aW9uInx8XyE9PW51bGwmJnR5cGVvZiBfLmNvbXBvbmVudERpZENhdGNoPT0iZnVuY3Rpb24iJiYoWWk9PT1udWxsfHwhWWkuaGFzKF8pKSkpe28uZmxhZ3N8PTY1NTM2LHQmPS10LG8ubGFuZXN8PXQ7dmFyIFM9dXcobyxzLHQpO0h5KG8sUyk7YnJlYWsgZX19bz1vLnJldHVybn13aGlsZShvIT09bnVsbCl9VHcobil9Y2F0Y2goRSl7dD1FLCR0PT09biYmbiE9PW51bGwmJigkdD1uPW4ucmV0dXJuKTtjb250aW51ZX1icmVha313aGlsZSghMCl9ZnVuY3Rpb24gJHcoKXt2YXIgZT1wZC5jdXJyZW50O3JldHVybiBwZC5jdXJyZW50PWhkLGU9PT1udWxsP2hkOmV9ZnVuY3Rpb24gemcoKXsoUHQ9PT0wfHxQdD09PTN8fFB0PT09MikmJihQdD00KSxCdD09PW51bGx8fCEoS28mMjY4NDM1NDU1KSYmIShoZiYyNjg0MzU0NTUpfHxJaShCdCxadCl9ZnVuY3Rpb24gdmQoZSx0KXt2YXIgbj1NZTtNZXw9Mjt2YXIgcj0kdygpOyhCdCE9PWV8fFp0IT09dCkmJih0aT1udWxsLExvKGUsdCkpO2RvIHRyeXtDVCgpO2JyZWFrfWNhdGNoKGkpe2t3KGUsaSl9d2hpbGUoITApO2lmKHdnKCksTWU9bixwZC5jdXJyZW50PXIsJHQhPT1udWxsKXRocm93IEVycm9yKFUoMjYxKSk7cmV0dXJuIEJ0PW51bGwsWnQ9MCxQdH1mdW5jdGlvbiBDVCgpe2Zvcig7JHQhPT1udWxsOylidygkdCl9ZnVuY3Rpb24ga1QoKXtmb3IoOyR0IT09bnVsbCYmIVgkKCk7KWJ3KCR0KX1mdW5jdGlvbiBidyhlKXt2YXIgdD1SdyhlLmFsdGVybmF0ZSxlLEFuKTtlLm1lbW9pemVkUHJvcHM9ZS5wZW5kaW5nUHJvcHMsdD09PW51bGw/VHcoZSk6JHQ9dCxNZy5jdXJyZW50PW51bGx9ZnVuY3Rpb24gVHcoZSl7dmFyIHQ9ZTtkb3t2YXIgbj10LmFsdGVybmF0ZTtpZihlPXQucmV0dXJuLHQuZmxhZ3MmMzI3Njgpe2lmKG49eVQobix0KSxuIT09bnVsbCl7bi5mbGFncyY9MzI3NjcsJHQ9bjtyZXR1cm59aWYoZSE9PW51bGwpZS5mbGFnc3w9MzI3NjgsZS5zdWJ0cmVlRmxhZ3M9MCxlLmRlbGV0aW9ucz1udWxsO2Vsc2V7UHQ9NiwkdD1udWxsO3JldHVybn19ZWxzZSBpZihuPXZUKG4sdCxBbiksbiE9PW51bGwpeyR0PW47cmV0dXJufWlmKHQ9dC5zaWJsaW5nLHQhPT1udWxsKXskdD10O3JldHVybn0kdD10PWV9d2hpbGUodCE9PW51bGwpO1B0PT09MCYmKFB0PTUpfWZ1bmN0aW9uIFRvKGUsdCxuKXt2YXIgcj1VZSxpPW5yLnRyYW5zaXRpb247dHJ5e25yLnRyYW5zaXRpb249bnVsbCxVZT0xLCRUKGUsdCxuLHIpfWZpbmFsbHl7bnIudHJhbnNpdGlvbj1pLFVlPXJ9cmV0dXJuIG51bGx9ZnVuY3Rpb24gJFQoZSx0LG4scil7ZG8gR2woKTt3aGlsZShCaSE9PW51bGwpO2lmKE1lJjYpdGhyb3cgRXJyb3IoVSgzMjcpKTtuPWUuZmluaXNoZWRXb3JrO3ZhciBpPWUuZmluaXNoZWRMYW5lcztpZihuPT09bnVsbClyZXR1cm4gbnVsbDtpZihlLmZpbmlzaGVkV29yaz1udWxsLGUuZmluaXNoZWRMYW5lcz0wLG49PT1lLmN1cnJlbnQpdGhyb3cgRXJyb3IoVSgxNzcpKTtlLmNhbGxiYWNrTm9kZT1udWxsLGUuY2FsbGJhY2tQcmlvcml0eT0wO3ZhciBvPW4ubGFuZXN8bi5jaGlsZExhbmVzO2lmKGxiKGUsbyksZT09PUJ0JiYoJHQ9QnQ9bnVsbCxadD0wKSwhKG4uc3VidHJlZUZsYWdzJjIwNjQpJiYhKG4uZmxhZ3MmMjA2NCl8fGNjfHwoY2M9ITAsT3coSmMsZnVuY3Rpb24oKXtyZXR1cm4gR2woKSxudWxsfSkpLG89KG4uZmxhZ3MmMTU5OTApIT09MCxuLnN1YnRyZWVGbGFncyYxNTk5MHx8byl7bz1uci50cmFuc2l0aW9uLG5yLnRyYW5zaXRpb249bnVsbDt2YXIgbD1VZTtVZT0xO3ZhciBzPU1lO01lfD00LE1nLmN1cnJlbnQ9bnVsbCxfVChlLG4pLFN3KG4sZSksS2IoX3ApLGVkPSEheHAsX3A9eHA9bnVsbCxlLmN1cnJlbnQ9bix3VChuKSxRJCgpLE1lPXMsVWU9bCxuci50cmFuc2l0aW9uPW99ZWxzZSBlLmN1cnJlbnQ9bjtpZihjYyYmKGNjPSExLEJpPWUsZ2Q9aSksbz1lLnBlbmRpbmdMYW5lcyxvPT09MCYmKFlpPW51bGwpLGViKG4uc3RhdGVOb2RlKSxObihlLEN0KCkpLHQhPT1udWxsKWZvcihyPWUub25SZWNvdmVyYWJsZUVycm9yLG49MDtuPHQubGVuZ3RoO24rKylpPXRbbl0scihpLnZhbHVlLHtjb21wb25lbnRTdGFjazppLnN0YWNrLGRpZ2VzdDppLmRpZ2VzdH0pO2lmKG1kKXRocm93IG1kPSExLGU9RnAsRnA9bnVsbCxlO3JldHVybiBnZCYxJiZlLnRhZyE9PTAmJkdsKCksbz1lLnBlbmRpbmdMYW5lcyxvJjE/ZT09PUJwP1NhKys6KFNhPTAsQnA9ZSk6U2E9MCx2bygpLG51bGx9ZnVuY3Rpb24gR2woKXtpZihCaSE9PW51bGwpe3ZhciBlPXMxKGdkKSx0PW5yLnRyYW5zaXRpb24sbj1VZTt0cnl7aWYobnIudHJhbnNpdGlvbj1udWxsLFVlPTE2PmU/MTY6ZSxCaT09PW51bGwpdmFyIHI9ITE7ZWxzZXtpZihlPUJpLEJpPW51bGwsZ2Q9MCxNZSY2KXRocm93IEVycm9yKFUoMzMxKSk7dmFyIGk9TWU7Zm9yKE1lfD00LGVlPWUuY3VycmVudDtlZSE9PW51bGw7KXt2YXIgbz1lZSxsPW8uY2hpbGQ7aWYoZWUuZmxhZ3MmMTYpe3ZhciBzPW8uZGVsZXRpb25zO2lmKHMhPT1udWxsKXtmb3IodmFyIGE9MDthPHMubGVuZ3RoO2ErKyl7dmFyIHU9c1thXTtmb3IoZWU9dTtlZSE9PW51bGw7KXt2YXIgYz1lZTtzd2l0Y2goYy50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6X2EoOCxjLG8pfXZhciBkPWMuY2hpbGQ7aWYoZCE9PW51bGwpZC5yZXR1cm49YyxlZT1kO2Vsc2UgZm9yKDtlZSE9PW51bGw7KXtjPWVlO3ZhciBmPWMuc2libGluZyxoPWMucmV0dXJuO2lmKHh3KGMpLGM9PT11KXtlZT1udWxsO2JyZWFrfWlmKGYhPT1udWxsKXtmLnJldHVybj1oLGVlPWY7YnJlYWt9ZWU9aH19fXZhciBtPW8uYWx0ZXJuYXRlO2lmKG0hPT1udWxsKXt2YXIgZz1tLmNoaWxkO2lmKGchPT1udWxsKXttLmNoaWxkPW51bGw7ZG97dmFyIHc9Zy5zaWJsaW5nO2cuc2libGluZz1udWxsLGc9d313aGlsZShnIT09bnVsbCl9fWVlPW99fWlmKG8uc3VidHJlZUZsYWdzJjIwNjQmJmwhPT1udWxsKWwucmV0dXJuPW8sZWU9bDtlbHNlIGU6Zm9yKDtlZSE9PW51bGw7KXtpZihvPWVlLG8uZmxhZ3MmMjA0OClzd2l0Y2goby50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6X2EoOSxvLG8ucmV0dXJuKX12YXIgdj1vLnNpYmxpbmc7aWYodiE9PW51bGwpe3YucmV0dXJuPW8ucmV0dXJuLGVlPXY7YnJlYWsgZX1lZT1vLnJldHVybn19dmFyIHk9ZS5jdXJyZW50O2ZvcihlZT15O2VlIT09bnVsbDspe2w9ZWU7dmFyIF89bC5jaGlsZDtpZihsLnN1YnRyZWVGbGFncyYyMDY0JiZfIT09bnVsbClfLnJldHVybj1sLGVlPV87ZWxzZSBlOmZvcihsPXk7ZWUhPT1udWxsOyl7aWYocz1lZSxzLmZsYWdzJjIwNDgpdHJ5e3N3aXRjaChzLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpmZig5LHMpfX1jYXRjaChFKXt2dChzLHMucmV0dXJuLEUpfWlmKHM9PT1sKXtlZT1udWxsO2JyZWFrIGV9dmFyIFM9cy5zaWJsaW5nO2lmKFMhPT1udWxsKXtTLnJldHVybj1zLnJldHVybixlZT1TO2JyZWFrIGV9ZWU9cy5yZXR1cm59fWlmKE1lPWksdm8oKSx6ciYmdHlwZW9mIHpyLm9uUG9zdENvbW1pdEZpYmVyUm9vdD09ImZ1bmN0aW9uIil0cnl7enIub25Qb3N0Q29tbWl0RmliZXJSb290KHJmLGUpfWNhdGNoe31yPSEwfXJldHVybiByfWZpbmFsbHl7VWU9bixuci50cmFuc2l0aW9uPXR9fXJldHVybiExfWZ1bmN0aW9uIGgwKGUsdCxuKXt0PWxzKG4sdCksdD1hdyhlLHQsMSksZT1HaShlLHQsMSksdD12bigpLGUhPT1udWxsJiYoUnUoZSwxLHQpLE5uKGUsdCkpfWZ1bmN0aW9uIHZ0KGUsdCxuKXtpZihlLnRhZz09PTMpaDAoZSxlLG4pO2Vsc2UgZm9yKDt0IT09bnVsbDspe2lmKHQudGFnPT09Myl7aDAodCxlLG4pO2JyZWFrfWVsc2UgaWYodC50YWc9PT0xKXt2YXIgcj10LnN0YXRlTm9kZTtpZih0eXBlb2YgdC50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj09ImZ1bmN0aW9uInx8dHlwZW9mIHIuY29tcG9uZW50RGlkQ2F0Y2g9PSJmdW5jdGlvbiImJihZaT09PW51bGx8fCFZaS5oYXMocikpKXtlPWxzKG4sZSksZT11dyh0LGUsMSksdD1HaSh0LGUsMSksZT12bigpLHQhPT1udWxsJiYoUnUodCwxLGUpLE5uKHQsZSkpO2JyZWFrfX10PXQucmV0dXJufX1mdW5jdGlvbiBiVChlLHQsbil7dmFyIHI9ZS5waW5nQ2FjaGU7ciE9PW51bGwmJnIuZGVsZXRlKHQpLHQ9dm4oKSxlLnBpbmdlZExhbmVzfD1lLnN1c3BlbmRlZExhbmVzJm4sQnQ9PT1lJiYoWnQmbik9PT1uJiYoUHQ9PT00fHxQdD09PTMmJihadCYxMzAwMjM0MjQpPT09WnQmJjUwMD5DdCgpLUxnP0xvKGUsMCk6RGd8PW4pLE5uKGUsdCl9ZnVuY3Rpb24gTncoZSx0KXt0PT09MCYmKGUubW9kZSYxPyh0PWVjLGVjPDw9MSwhKGVjJjEzMDAyMzQyNCkmJihlYz00MTk0MzA0KSk6dD0xKTt2YXIgbj12bigpO2U9aGkoZSx0KSxlIT09bnVsbCYmKFJ1KGUsdCxuKSxObihlLG4pKX1mdW5jdGlvbiBUVChlKXt2YXIgdD1lLm1lbW9pemVkU3RhdGUsbj0wO3QhPT1udWxsJiYobj10LnJldHJ5TGFuZSksTncoZSxuKX1mdW5jdGlvbiBOVChlLHQpe3ZhciBuPTA7c3dpdGNoKGUudGFnKXtjYXNlIDEzOnZhciByPWUuc3RhdGVOb2RlLGk9ZS5tZW1vaXplZFN0YXRlO2khPT1udWxsJiYobj1pLnJldHJ5TGFuZSk7YnJlYWs7Y2FzZSAxOTpyPWUuc3RhdGVOb2RlO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoVSgzMTQpKX1yIT09bnVsbCYmci5kZWxldGUodCksTncoZSxuKX12YXIgUnc7Unc9ZnVuY3Rpb24oZSx0LG4pe2lmKGUhPT1udWxsKWlmKGUubWVtb2l6ZWRQcm9wcyE9PXQucGVuZGluZ1Byb3BzfHxibi5jdXJyZW50KSRuPSEwO2Vsc2V7aWYoIShlLmxhbmVzJm4pJiYhKHQuZmxhZ3MmMTI4KSlyZXR1cm4gJG49ITEsZ1QoZSx0LG4pOyRuPSEhKGUuZmxhZ3MmMTMxMDcyKX1lbHNlICRuPSExLG90JiZ0LmZsYWdzJjEwNDg1NzYmJkExKHQsc2QsdC5pbmRleCk7c3dpdGNoKHQubGFuZXM9MCx0LnRhZyl7Y2FzZSAyOnZhciByPXQudHlwZTtMYyhlLHQpLGU9dC5wZW5kaW5nUHJvcHM7dmFyIGk9bnModCxybi5jdXJyZW50KTtabCh0LG4pLGk9TmcobnVsbCx0LHIsZSxpLG4pO3ZhciBvPVJnKCk7cmV0dXJuIHQuZmxhZ3N8PTEsdHlwZW9mIGk9PSJvYmplY3QiJiZpIT09bnVsbCYmdHlwZW9mIGkucmVuZGVyPT0iZnVuY3Rpb24iJiZpLiQkdHlwZW9mPT09dm9pZCAwPyh0LnRhZz0xLHQubWVtb2l6ZWRTdGF0ZT1udWxsLHQudXBkYXRlUXVldWU9bnVsbCxUbihyKT8obz0hMCxvZCh0KSk6bz0hMSx0Lm1lbW9pemVkU3RhdGU9aS5zdGF0ZSE9PW51bGwmJmkuc3RhdGUhPT12b2lkIDA/aS5zdGF0ZTpudWxsLENnKHQpLGkudXBkYXRlcj1jZix0LnN0YXRlTm9kZT1pLGkuX3JlYWN0SW50ZXJuYWxzPXQsTnAodCxyLGUsbiksdD1QcChudWxsLHQsciwhMCxvLG4pKToodC50YWc9MCxvdCYmbyYmdmcodCksdW4obnVsbCx0LGksbiksdD10LmNoaWxkKSx0O2Nhc2UgMTY6cj10LmVsZW1lbnRUeXBlO2U6e3N3aXRjaChMYyhlLHQpLGU9dC5wZW5kaW5nUHJvcHMsaT1yLl9pbml0LHI9aShyLl9wYXlsb2FkKSx0LnR5cGU9cixpPXQudGFnPU9UKHIpLGU9bXIocixlKSxpKXtjYXNlIDA6dD1PcChudWxsLHQscixlLG4pO2JyZWFrIGU7Y2FzZSAxOnQ9cjAobnVsbCx0LHIsZSxuKTticmVhayBlO2Nhc2UgMTE6dD10MChudWxsLHQscixlLG4pO2JyZWFrIGU7Y2FzZSAxNDp0PW4wKG51bGwsdCxyLG1yKHIudHlwZSxlKSxuKTticmVhayBlfXRocm93IEVycm9yKFUoMzA2LHIsIiIpKX1yZXR1cm4gdDtjYXNlIDA6cmV0dXJuIHI9dC50eXBlLGk9dC5wZW5kaW5nUHJvcHMsaT10LmVsZW1lbnRUeXBlPT09cj9pOm1yKHIsaSksT3AoZSx0LHIsaSxuKTtjYXNlIDE6cmV0dXJuIHI9dC50eXBlLGk9dC5wZW5kaW5nUHJvcHMsaT10LmVsZW1lbnRUeXBlPT09cj9pOm1yKHIsaSkscjAoZSx0LHIsaSxuKTtjYXNlIDM6ZTp7aWYoaHcodCksZT09PW51bGwpdGhyb3cgRXJyb3IoVSgzODcpKTtyPXQucGVuZGluZ1Byb3BzLG89dC5tZW1vaXplZFN0YXRlLGk9by5lbGVtZW50LEkxKGUsdCksY2QodCxyLG51bGwsbik7dmFyIGw9dC5tZW1vaXplZFN0YXRlO2lmKHI9bC5lbGVtZW50LG8uaXNEZWh5ZHJhdGVkKWlmKG89e2VsZW1lbnQ6cixpc0RlaHlkcmF0ZWQ6ITEsY2FjaGU6bC5jYWNoZSxwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOmwucGVuZGluZ1N1c3BlbnNlQm91bmRhcmllcyx0cmFuc2l0aW9uczpsLnRyYW5zaXRpb25zfSx0LnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZT1vLHQubWVtb2l6ZWRTdGF0ZT1vLHQuZmxhZ3MmMjU2KXtpPWxzKEVycm9yKFUoNDIzKSksdCksdD1pMChlLHQscixuLGkpO2JyZWFrIGV9ZWxzZSBpZihyIT09aSl7aT1scyhFcnJvcihVKDQyNCkpLHQpLHQ9aTAoZSx0LHIsbixpKTticmVhayBlfWVsc2UgZm9yKExuPVppKHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8uZmlyc3RDaGlsZCksSW49dCxvdD0hMCx5cj1udWxsLG49QjEodCxudWxsLHIsbiksdC5jaGlsZD1uO247KW4uZmxhZ3M9bi5mbGFncyYtM3w0MDk2LG49bi5zaWJsaW5nO2Vsc2V7aWYocnMoKSxyPT09aSl7dD1waShlLHQsbik7YnJlYWsgZX11bihlLHQscixuKX10PXQuY2hpbGR9cmV0dXJuIHQ7Y2FzZSA1OnJldHVybiBVMSh0KSxlPT09bnVsbCYmJHAodCkscj10LnR5cGUsaT10LnBlbmRpbmdQcm9wcyxvPWUhPT1udWxsP2UubWVtb2l6ZWRQcm9wczpudWxsLGw9aS5jaGlsZHJlbix3cChyLGkpP2w9bnVsbDpvIT09bnVsbCYmd3AocixvKSYmKHQuZmxhZ3N8PTMyKSxmdyhlLHQpLHVuKGUsdCxsLG4pLHQuY2hpbGQ7Y2FzZSA2OnJldHVybiBlPT09bnVsbCYmJHAodCksbnVsbDtjYXNlIDEzOnJldHVybiBwdyhlLHQsbik7Y2FzZSA0OnJldHVybiBrZyh0LHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLHI9dC5wZW5kaW5nUHJvcHMsZT09PW51bGw/dC5jaGlsZD1pcyh0LG51bGwscixuKTp1bihlLHQscixuKSx0LmNoaWxkO2Nhc2UgMTE6cmV0dXJuIHI9dC50eXBlLGk9dC5wZW5kaW5nUHJvcHMsaT10LmVsZW1lbnRUeXBlPT09cj9pOm1yKHIsaSksdDAoZSx0LHIsaSxuKTtjYXNlIDc6cmV0dXJuIHVuKGUsdCx0LnBlbmRpbmdQcm9wcyxuKSx0LmNoaWxkO2Nhc2UgODpyZXR1cm4gdW4oZSx0LHQucGVuZGluZ1Byb3BzLmNoaWxkcmVuLG4pLHQuY2hpbGQ7Y2FzZSAxMjpyZXR1cm4gdW4oZSx0LHQucGVuZGluZ1Byb3BzLmNoaWxkcmVuLG4pLHQuY2hpbGQ7Y2FzZSAxMDplOntpZihyPXQudHlwZS5fY29udGV4dCxpPXQucGVuZGluZ1Byb3BzLG89dC5tZW1vaXplZFByb3BzLGw9aS52YWx1ZSxYZShhZCxyLl9jdXJyZW50VmFsdWUpLHIuX2N1cnJlbnRWYWx1ZT1sLG8hPT1udWxsKWlmKGtyKG8udmFsdWUsbCkpe2lmKG8uY2hpbGRyZW49PT1pLmNoaWxkcmVuJiYhYm4uY3VycmVudCl7dD1waShlLHQsbik7YnJlYWsgZX19ZWxzZSBmb3Iobz10LmNoaWxkLG8hPT1udWxsJiYoby5yZXR1cm49dCk7byE9PW51bGw7KXt2YXIgcz1vLmRlcGVuZGVuY2llcztpZihzIT09bnVsbCl7bD1vLmNoaWxkO2Zvcih2YXIgYT1zLmZpcnN0Q29udGV4dDthIT09bnVsbDspe2lmKGEuY29udGV4dD09PXIpe2lmKG8udGFnPT09MSl7YT11aSgtMSxuJi1uKSxhLnRhZz0yO3ZhciB1PW8udXBkYXRlUXVldWU7aWYodSE9PW51bGwpe3U9dS5zaGFyZWQ7dmFyIGM9dS5wZW5kaW5nO2M9PT1udWxsP2EubmV4dD1hOihhLm5leHQ9Yy5uZXh0LGMubmV4dD1hKSx1LnBlbmRpbmc9YX19by5sYW5lc3w9bixhPW8uYWx0ZXJuYXRlLGEhPT1udWxsJiYoYS5sYW5lc3w9biksYnAoby5yZXR1cm4sbix0KSxzLmxhbmVzfD1uO2JyZWFrfWE9YS5uZXh0fX1lbHNlIGlmKG8udGFnPT09MTApbD1vLnR5cGU9PT10LnR5cGU/bnVsbDpvLmNoaWxkO2Vsc2UgaWYoby50YWc9PT0xOCl7aWYobD1vLnJldHVybixsPT09bnVsbCl0aHJvdyBFcnJvcihVKDM0MSkpO2wubGFuZXN8PW4scz1sLmFsdGVybmF0ZSxzIT09bnVsbCYmKHMubGFuZXN8PW4pLGJwKGwsbix0KSxsPW8uc2libGluZ31lbHNlIGw9by5jaGlsZDtpZihsIT09bnVsbClsLnJldHVybj1vO2Vsc2UgZm9yKGw9bztsIT09bnVsbDspe2lmKGw9PT10KXtsPW51bGw7YnJlYWt9aWYobz1sLnNpYmxpbmcsbyE9PW51bGwpe28ucmV0dXJuPWwucmV0dXJuLGw9bzticmVha31sPWwucmV0dXJufW89bH11bihlLHQsaS5jaGlsZHJlbixuKSx0PXQuY2hpbGR9cmV0dXJuIHQ7Y2FzZSA5OnJldHVybiBpPXQudHlwZSxyPXQucGVuZGluZ1Byb3BzLmNoaWxkcmVuLFpsKHQsbiksaT1ycihpKSxyPXIoaSksdC5mbGFnc3w9MSx1bihlLHQscixuKSx0LmNoaWxkO2Nhc2UgMTQ6cmV0dXJuIHI9dC50eXBlLGk9bXIocix0LnBlbmRpbmdQcm9wcyksaT1tcihyLnR5cGUsaSksbjAoZSx0LHIsaSxuKTtjYXNlIDE1OnJldHVybiBjdyhlLHQsdC50eXBlLHQucGVuZGluZ1Byb3BzLG4pO2Nhc2UgMTc6cmV0dXJuIHI9dC50eXBlLGk9dC5wZW5kaW5nUHJvcHMsaT10LmVsZW1lbnRUeXBlPT09cj9pOm1yKHIsaSksTGMoZSx0KSx0LnRhZz0xLFRuKHIpPyhlPSEwLG9kKHQpKTplPSExLFpsKHQsbiksejEodCxyLGkpLE5wKHQscixpLG4pLFBwKG51bGwsdCxyLCEwLGUsbik7Y2FzZSAxOTpyZXR1cm4gbXcoZSx0LG4pO2Nhc2UgMjI6cmV0dXJuIGR3KGUsdCxuKX10aHJvdyBFcnJvcihVKDE1Nix0LnRhZykpfTtmdW5jdGlvbiBPdyhlLHQpe3JldHVybiByMShlLHQpfWZ1bmN0aW9uIFJUKGUsdCxuLHIpe3RoaXMudGFnPWUsdGhpcy5rZXk9bix0aGlzLnNpYmxpbmc9dGhpcy5jaGlsZD10aGlzLnJldHVybj10aGlzLnN0YXRlTm9kZT10aGlzLnR5cGU9dGhpcy5lbGVtZW50VHlwZT1udWxsLHRoaXMuaW5kZXg9MCx0aGlzLnJlZj1udWxsLHRoaXMucGVuZGluZ1Byb3BzPXQsdGhpcy5kZXBlbmRlbmNpZXM9dGhpcy5tZW1vaXplZFN0YXRlPXRoaXMudXBkYXRlUXVldWU9dGhpcy5tZW1vaXplZFByb3BzPW51bGwsdGhpcy5tb2RlPXIsdGhpcy5zdWJ0cmVlRmxhZ3M9dGhpcy5mbGFncz0wLHRoaXMuZGVsZXRpb25zPW51bGwsdGhpcy5jaGlsZExhbmVzPXRoaXMubGFuZXM9MCx0aGlzLmFsdGVybmF0ZT1udWxsfWZ1bmN0aW9uIHFuKGUsdCxuLHIpe3JldHVybiBuZXcgUlQoZSx0LG4scil9ZnVuY3Rpb24gRmcoZSl7cmV0dXJuIGU9ZS5wcm90b3R5cGUsISghZXx8IWUuaXNSZWFjdENvbXBvbmVudCl9ZnVuY3Rpb24gT1QoZSl7aWYodHlwZW9mIGU9PSJmdW5jdGlvbiIpcmV0dXJuIEZnKGUpPzE6MDtpZihlIT1udWxsKXtpZihlPWUuJCR0eXBlb2YsZT09PW9nKXJldHVybiAxMTtpZihlPT09bGcpcmV0dXJuIDE0fXJldHVybiAyfWZ1bmN0aW9uIFFpKGUsdCl7dmFyIG49ZS5hbHRlcm5hdGU7cmV0dXJuIG49PT1udWxsPyhuPXFuKGUudGFnLHQsZS5rZXksZS5tb2RlKSxuLmVsZW1lbnRUeXBlPWUuZWxlbWVudFR5cGUsbi50eXBlPWUudHlwZSxuLnN0YXRlTm9kZT1lLnN0YXRlTm9kZSxuLmFsdGVybmF0ZT1lLGUuYWx0ZXJuYXRlPW4pOihuLnBlbmRpbmdQcm9wcz10LG4udHlwZT1lLnR5cGUsbi5mbGFncz0wLG4uc3VidHJlZUZsYWdzPTAsbi5kZWxldGlvbnM9bnVsbCksbi5mbGFncz1lLmZsYWdzJjE0NjgwMDY0LG4uY2hpbGRMYW5lcz1lLmNoaWxkTGFuZXMsbi5sYW5lcz1lLmxhbmVzLG4uY2hpbGQ9ZS5jaGlsZCxuLm1lbW9pemVkUHJvcHM9ZS5tZW1vaXplZFByb3BzLG4ubWVtb2l6ZWRTdGF0ZT1lLm1lbW9pemVkU3RhdGUsbi51cGRhdGVRdWV1ZT1lLnVwZGF0ZVF1ZXVlLHQ9ZS5kZXBlbmRlbmNpZXMsbi5kZXBlbmRlbmNpZXM9dD09PW51bGw/bnVsbDp7bGFuZXM6dC5sYW5lcyxmaXJzdENvbnRleHQ6dC5maXJzdENvbnRleHR9LG4uc2libGluZz1lLnNpYmxpbmcsbi5pbmRleD1lLmluZGV4LG4ucmVmPWUucmVmLG59ZnVuY3Rpb24gemMoZSx0LG4scixpLG8pe3ZhciBsPTI7aWYocj1lLHR5cGVvZiBlPT0iZnVuY3Rpb24iKUZnKGUpJiYobD0xKTtlbHNlIGlmKHR5cGVvZiBlPT0ic3RyaW5nIilsPTU7ZWxzZSBlOnN3aXRjaChlKXtjYXNlIFRsOnJldHVybiBJbyhuLmNoaWxkcmVuLGksbyx0KTtjYXNlIGlnOmw9OCxpfD04O2JyZWFrO2Nhc2UgcWg6cmV0dXJuIGU9cW4oMTIsbix0LGl8MiksZS5lbGVtZW50VHlwZT1xaCxlLmxhbmVzPW8sZTtjYXNlIGVwOnJldHVybiBlPXFuKDEzLG4sdCxpKSxlLmVsZW1lbnRUeXBlPWVwLGUubGFuZXM9byxlO2Nhc2UgdHA6cmV0dXJuIGU9cW4oMTksbix0LGkpLGUuZWxlbWVudFR5cGU9dHAsZS5sYW5lcz1vLGU7Y2FzZSBGXzpyZXR1cm4gcGYobixpLG8sdCk7ZGVmYXVsdDppZih0eXBlb2YgZT09Im9iamVjdCImJmUhPT1udWxsKXN3aXRjaChlLiQkdHlwZW9mKXtjYXNlIGpfOmw9MTA7YnJlYWsgZTtjYXNlIHpfOmw9OTticmVhayBlO2Nhc2Ugb2c6bD0xMTticmVhayBlO2Nhc2UgbGc6bD0xNDticmVhayBlO2Nhc2UgQWk6bD0xNixyPW51bGw7YnJlYWsgZX10aHJvdyBFcnJvcihVKDEzMCxlPT1udWxsP2U6dHlwZW9mIGUsIiIpKX1yZXR1cm4gdD1xbihsLG4sdCxpKSx0LmVsZW1lbnRUeXBlPWUsdC50eXBlPXIsdC5sYW5lcz1vLHR9ZnVuY3Rpb24gSW8oZSx0LG4scil7cmV0dXJuIGU9cW4oNyxlLHIsdCksZS5sYW5lcz1uLGV9ZnVuY3Rpb24gcGYoZSx0LG4scil7cmV0dXJuIGU9cW4oMjIsZSxyLHQpLGUuZWxlbWVudFR5cGU9Rl8sZS5sYW5lcz1uLGUuc3RhdGVOb2RlPXtpc0hpZGRlbjohMX0sZX1mdW5jdGlvbiBiaChlLHQsbil7cmV0dXJuIGU9cW4oNixlLG51bGwsdCksZS5sYW5lcz1uLGV9ZnVuY3Rpb24gVGgoZSx0LG4pe3JldHVybiB0PXFuKDQsZS5jaGlsZHJlbiE9PW51bGw/ZS5jaGlsZHJlbjpbXSxlLmtleSx0KSx0LmxhbmVzPW4sdC5zdGF0ZU5vZGU9e2NvbnRhaW5lckluZm86ZS5jb250YWluZXJJbmZvLHBlbmRpbmdDaGlsZHJlbjpudWxsLGltcGxlbWVudGF0aW9uOmUuaW1wbGVtZW50YXRpb259LHR9ZnVuY3Rpb24gUFQoZSx0LG4scixpKXt0aGlzLnRhZz10LHRoaXMuY29udGFpbmVySW5mbz1lLHRoaXMuZmluaXNoZWRXb3JrPXRoaXMucGluZ0NhY2hlPXRoaXMuY3VycmVudD10aGlzLnBlbmRpbmdDaGlsZHJlbj1udWxsLHRoaXMudGltZW91dEhhbmRsZT0tMSx0aGlzLmNhbGxiYWNrTm9kZT10aGlzLnBlbmRpbmdDb250ZXh0PXRoaXMuY29udGV4dD1udWxsLHRoaXMuY2FsbGJhY2tQcmlvcml0eT0wLHRoaXMuZXZlbnRUaW1lcz1haCgwKSx0aGlzLmV4cGlyYXRpb25UaW1lcz1haCgtMSksdGhpcy5lbnRhbmdsZWRMYW5lcz10aGlzLmZpbmlzaGVkTGFuZXM9dGhpcy5tdXRhYmxlUmVhZExhbmVzPXRoaXMuZXhwaXJlZExhbmVzPXRoaXMucGluZ2VkTGFuZXM9dGhpcy5zdXNwZW5kZWRMYW5lcz10aGlzLnBlbmRpbmdMYW5lcz0wLHRoaXMuZW50YW5nbGVtZW50cz1haCgwKSx0aGlzLmlkZW50aWZpZXJQcmVmaXg9cix0aGlzLm9uUmVjb3ZlcmFibGVFcnJvcj1pLHRoaXMubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT1udWxsfWZ1bmN0aW9uIEJnKGUsdCxuLHIsaSxvLGwscyxhKXtyZXR1cm4gZT1uZXcgUFQoZSx0LG4scyxhKSx0PT09MT8odD0xLG89PT0hMCYmKHR8PTgpKTp0PTAsbz1xbigzLG51bGwsbnVsbCx0KSxlLmN1cnJlbnQ9byxvLnN0YXRlTm9kZT1lLG8ubWVtb2l6ZWRTdGF0ZT17ZWxlbWVudDpyLGlzRGVoeWRyYXRlZDpuLGNhY2hlOm51bGwsdHJhbnNpdGlvbnM6bnVsbCxwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOm51bGx9LENnKG8pLGV9ZnVuY3Rpb24gQVQoZSx0LG4pe3ZhciByPTM8YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTpudWxsO3JldHVybnskJHR5cGVvZjpibCxrZXk6cj09bnVsbD9udWxsOiIiK3IsY2hpbGRyZW46ZSxjb250YWluZXJJbmZvOnQsaW1wbGVtZW50YXRpb246bn19ZnVuY3Rpb24gUHcoZSl7aWYoIWUpcmV0dXJuIG5vO2U9ZS5fcmVhY3RJbnRlcm5hbHM7ZTp7aWYob2woZSkhPT1lfHxlLnRhZyE9PTEpdGhyb3cgRXJyb3IoVSgxNzApKTt2YXIgdD1lO2Rve3N3aXRjaCh0LnRhZyl7Y2FzZSAzOnQ9dC5zdGF0ZU5vZGUuY29udGV4dDticmVhayBlO2Nhc2UgMTppZihUbih0LnR5cGUpKXt0PXQuc3RhdGVOb2RlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0O2JyZWFrIGV9fXQ9dC5yZXR1cm59d2hpbGUodCE9PW51bGwpO3Rocm93IEVycm9yKFUoMTcxKSl9aWYoZS50YWc9PT0xKXt2YXIgbj1lLnR5cGU7aWYoVG4obikpcmV0dXJuIE8xKGUsbix0KX1yZXR1cm4gdH1mdW5jdGlvbiBBdyhlLHQsbixyLGksbyxsLHMsYSl7cmV0dXJuIGU9QmcobixyLCEwLGUsaSxvLGwscyxhKSxlLmNvbnRleHQ9UHcobnVsbCksbj1lLmN1cnJlbnQscj12bigpLGk9WGkobiksbz11aShyLGkpLG8uY2FsbGJhY2s9dD8/bnVsbCxHaShuLG8saSksZS5jdXJyZW50LmxhbmVzPWksUnUoZSxpLHIpLE5uKGUsciksZX1mdW5jdGlvbiBtZihlLHQsbixyKXt2YXIgaT10LmN1cnJlbnQsbz12bigpLGw9WGkoaSk7cmV0dXJuIG49UHcobiksdC5jb250ZXh0PT09bnVsbD90LmNvbnRleHQ9bjp0LnBlbmRpbmdDb250ZXh0PW4sdD11aShvLGwpLHQucGF5bG9hZD17ZWxlbWVudDplfSxyPXI9PT12b2lkIDA/bnVsbDpyLHIhPT1udWxsJiYodC5jYWxsYmFjaz1yKSxlPUdpKGksdCxsKSxlIT09bnVsbCYmKFNyKGUsaSxsLG8pLEFjKGUsaSxsKSksbH1mdW5jdGlvbiB5ZChlKXtpZihlPWUuY3VycmVudCwhZS5jaGlsZClyZXR1cm4gbnVsbDtzd2l0Y2goZS5jaGlsZC50YWcpe2Nhc2UgNTpyZXR1cm4gZS5jaGlsZC5zdGF0ZU5vZGU7ZGVmYXVsdDpyZXR1cm4gZS5jaGlsZC5zdGF0ZU5vZGV9fWZ1bmN0aW9uIHAwKGUsdCl7aWYoZT1lLm1lbW9pemVkU3RhdGUsZSE9PW51bGwmJmUuZGVoeWRyYXRlZCE9PW51bGwpe3ZhciBuPWUucmV0cnlMYW5lO2UucmV0cnlMYW5lPW4hPT0wJiZuPHQ/bjp0fX1mdW5jdGlvbiBVZyhlLHQpe3AwKGUsdCksKGU9ZS5hbHRlcm5hdGUpJiZwMChlLHQpfWZ1bmN0aW9uIE1UKCl7cmV0dXJuIG51bGx9dmFyIE13PXR5cGVvZiByZXBvcnRFcnJvcj09ImZ1bmN0aW9uIj9yZXBvcnRFcnJvcjpmdW5jdGlvbihlKXtjb25zb2xlLmVycm9yKGUpfTtmdW5jdGlvbiBXZyhlKXt0aGlzLl9pbnRlcm5hbFJvb3Q9ZX1nZi5wcm90b3R5cGUucmVuZGVyPVdnLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5faW50ZXJuYWxSb290O2lmKHQ9PT1udWxsKXRocm93IEVycm9yKFUoNDA5KSk7bWYoZSx0LG51bGwsbnVsbCl9O2dmLnByb3RvdHlwZS51bm1vdW50PVdnLnByb3RvdHlwZS51bm1vdW50PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5faW50ZXJuYWxSb290O2lmKGUhPT1udWxsKXt0aGlzLl9pbnRlcm5hbFJvb3Q9bnVsbDt2YXIgdD1lLmNvbnRhaW5lckluZm87Wm8oZnVuY3Rpb24oKXttZihudWxsLGUsbnVsbCxudWxsKX0pLHRbZmldPW51bGx9fTtmdW5jdGlvbiBnZihlKXt0aGlzLl9pbnRlcm5hbFJvb3Q9ZX1nZi5wcm90b3R5cGUudW5zdGFibGVfc2NoZWR1bGVIeWRyYXRpb249ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9YzEoKTtlPXtibG9ja2VkT246bnVsbCx0YXJnZXQ6ZSxwcmlvcml0eTp0fTtmb3IodmFyIG49MDtuPExpLmxlbmd0aCYmdCE9PTAmJnQ8TGlbbl0ucHJpb3JpdHk7bisrKTtMaS5zcGxpY2UobiwwLGUpLG49PT0wJiZmMShlKX19O2Z1bmN0aW9uIFZnKGUpe3JldHVybiEoIWV8fGUubm9kZVR5cGUhPT0xJiZlLm5vZGVUeXBlIT09OSYmZS5ub2RlVHlwZSE9PTExKX1mdW5jdGlvbiB2ZihlKXtyZXR1cm4hKCFlfHxlLm5vZGVUeXBlIT09MSYmZS5ub2RlVHlwZSE9PTkmJmUubm9kZVR5cGUhPT0xMSYmKGUubm9kZVR5cGUhPT04fHxlLm5vZGVWYWx1ZSE9PSIgcmVhY3QtbW91bnQtcG9pbnQtdW5zdGFibGUgIikpfWZ1bmN0aW9uIG0wKCl7fWZ1bmN0aW9uIERUKGUsdCxuLHIsaSl7aWYoaSl7aWYodHlwZW9mIHI9PSJmdW5jdGlvbiIpe3ZhciBvPXI7cj1mdW5jdGlvbigpe3ZhciB1PXlkKGwpO28uY2FsbCh1KX19dmFyIGw9QXcodCxyLGUsMCxudWxsLCExLCExLCIiLG0wKTtyZXR1cm4gZS5fcmVhY3RSb290Q29udGFpbmVyPWwsZVtmaV09bC5jdXJyZW50LEhhKGUubm9kZVR5cGU9PT04P2UucGFyZW50Tm9kZTplKSxabygpLGx9Zm9yKDtpPWUubGFzdENoaWxkOyllLnJlbW92ZUNoaWxkKGkpO2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXt2YXIgcz1yO3I9ZnVuY3Rpb24oKXt2YXIgdT15ZChhKTtzLmNhbGwodSl9fXZhciBhPUJnKGUsMCwhMSxudWxsLG51bGwsITEsITEsIiIsbTApO3JldHVybiBlLl9yZWFjdFJvb3RDb250YWluZXI9YSxlW2ZpXT1hLmN1cnJlbnQsSGEoZS5ub2RlVHlwZT09PTg/ZS5wYXJlbnROb2RlOmUpLFpvKGZ1bmN0aW9uKCl7bWYodCxhLG4scil9KSxhfWZ1bmN0aW9uIHlmKGUsdCxuLHIsaSl7dmFyIG89bi5fcmVhY3RSb290Q29udGFpbmVyO2lmKG8pe3ZhciBsPW87aWYodHlwZW9mIGk9PSJmdW5jdGlvbiIpe3ZhciBzPWk7aT1mdW5jdGlvbigpe3ZhciBhPXlkKGwpO3MuY2FsbChhKX19bWYodCxsLGUsaSl9ZWxzZSBsPURUKG4sdCxlLGkscik7cmV0dXJuIHlkKGwpfWExPWZ1bmN0aW9uKGUpe3N3aXRjaChlLnRhZyl7Y2FzZSAzOnZhciB0PWUuc3RhdGVOb2RlO2lmKHQuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl7dmFyIG49YWEodC5wZW5kaW5nTGFuZXMpO24hPT0wJiYodWcodCxufDEpLE5uKHQsQ3QoKSksIShNZSY2KSYmKHNzPUN0KCkrNTAwLHZvKCkpKX1icmVhaztjYXNlIDEzOlpvKGZ1bmN0aW9uKCl7dmFyIHI9aGkoZSwxKTtpZihyIT09bnVsbCl7dmFyIGk9dm4oKTtTcihyLGUsMSxpKX19KSxVZyhlLDEpfX07Y2c9ZnVuY3Rpb24oZSl7aWYoZS50YWc9PT0xMyl7dmFyIHQ9aGkoZSwxMzQyMTc3MjgpO2lmKHQhPT1udWxsKXt2YXIgbj12bigpO1NyKHQsZSwxMzQyMTc3Mjgsbil9VWcoZSwxMzQyMTc3MjgpfX07dTE9ZnVuY3Rpb24oZSl7aWYoZS50YWc9PT0xMyl7dmFyIHQ9WGkoZSksbj1oaShlLHQpO2lmKG4hPT1udWxsKXt2YXIgcj12bigpO1NyKG4sZSx0LHIpfVVnKGUsdCl9fTtjMT1mdW5jdGlvbigpe3JldHVybiBVZX07ZDE9ZnVuY3Rpb24oZSx0KXt2YXIgbj1VZTt0cnl7cmV0dXJuIFVlPWUsdCgpfWZpbmFsbHl7VWU9bn19O2RwPWZ1bmN0aW9uKGUsdCxuKXtzd2l0Y2godCl7Y2FzZSJpbnB1dCI6aWYoaXAoZSxuKSx0PW4ubmFtZSxuLnR5cGU9PT0icmFkaW8iJiZ0IT1udWxsKXtmb3Iobj1lO24ucGFyZW50Tm9kZTspbj1uLnBhcmVudE5vZGU7Zm9yKG49bi5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dFtuYW1lPSIrSlNPTi5zdHJpbmdpZnkoIiIrdCkrJ11bdHlwZT0icmFkaW8iXScpLHQ9MDt0PG4ubGVuZ3RoO3QrKyl7dmFyIHI9blt0XTtpZihyIT09ZSYmci5mb3JtPT09ZS5mb3JtKXt2YXIgaT1hZihyKTtpZighaSl0aHJvdyBFcnJvcihVKDkwKSk7VV8ociksaXAocixpKX19fWJyZWFrO2Nhc2UidGV4dGFyZWEiOlZfKGUsbik7YnJlYWs7Y2FzZSJzZWxlY3QiOnQ9bi52YWx1ZSx0IT1udWxsJiZXbChlLCEhbi5tdWx0aXBsZSx0LCExKX19O1FfPUlnO0pfPVpvO3ZhciBMVD17dXNpbmdDbGllbnRFbnRyeVBvaW50OiExLEV2ZW50czpbUHUsUGwsYWYsWV8sWF8sSWddfSxHcz17ZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6T28sYnVuZGxlVHlwZTowLHZlcnNpb246IjE4LjIuMCIscmVuZGVyZXJQYWNrYWdlTmFtZToicmVhY3QtZG9tIn0sSVQ9e2J1bmRsZVR5cGU6R3MuYnVuZGxlVHlwZSx2ZXJzaW9uOkdzLnZlcnNpb24scmVuZGVyZXJQYWNrYWdlTmFtZTpHcy5yZW5kZXJlclBhY2thZ2VOYW1lLHJlbmRlcmVyQ29uZmlnOkdzLnJlbmRlcmVyQ29uZmlnLG92ZXJyaWRlSG9va1N0YXRlOm51bGwsb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoOm51bGwsb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoOm51bGwsb3ZlcnJpZGVQcm9wczpudWxsLG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoOm51bGwsb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGg6bnVsbCxzZXRFcnJvckhhbmRsZXI6bnVsbCxzZXRTdXNwZW5zZUhhbmRsZXI6bnVsbCxzY2hlZHVsZVVwZGF0ZTpudWxsLGN1cnJlbnREaXNwYXRjaGVyUmVmOnhpLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsZmluZEhvc3RJbnN0YW5jZUJ5RmliZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dDEoZSksZT09PW51bGw/bnVsbDplLnN0YXRlTm9kZX0sZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6R3MuZmluZEZpYmVyQnlIb3N0SW5zdGFuY2V8fE1ULGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaDpudWxsLHNjaGVkdWxlUmVmcmVzaDpudWxsLHNjaGVkdWxlUm9vdDpudWxsLHNldFJlZnJlc2hIYW5kbGVyOm51bGwsZ2V0Q3VycmVudEZpYmVyOm51bGwscmVjb25jaWxlclZlcnNpb246IjE4LjIuMC1uZXh0LTllM2I3NzJiOC0yMDIyMDYwOCJ9O2lmKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX188InUiKXt2YXIgZGM9X19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fO2lmKCFkYy5pc0Rpc2FibGVkJiZkYy5zdXBwb3J0c0ZpYmVyKXRyeXtyZj1kYy5pbmplY3QoSVQpLHpyPWRjfWNhdGNoe319Vm4uX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9TFQ7Vm4uY3JlYXRlUG9ydGFsPWZ1bmN0aW9uKGUsdCl7dmFyIG49Mjxhcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm51bGw7aWYoIVZnKHQpKXRocm93IEVycm9yKFUoMjAwKSk7cmV0dXJuIEFUKGUsdCxudWxsLG4pfTtWbi5jcmVhdGVSb290PWZ1bmN0aW9uKGUsdCl7aWYoIVZnKGUpKXRocm93IEVycm9yKFUoMjk5KSk7dmFyIG49ITEscj0iIixpPU13O3JldHVybiB0IT1udWxsJiYodC51bnN0YWJsZV9zdHJpY3RNb2RlPT09ITAmJihuPSEwKSx0LmlkZW50aWZpZXJQcmVmaXghPT12b2lkIDAmJihyPXQuaWRlbnRpZmllclByZWZpeCksdC5vblJlY292ZXJhYmxlRXJyb3IhPT12b2lkIDAmJihpPXQub25SZWNvdmVyYWJsZUVycm9yKSksdD1CZyhlLDEsITEsbnVsbCxudWxsLG4sITEscixpKSxlW2ZpXT10LmN1cnJlbnQsSGEoZS5ub2RlVHlwZT09PTg/ZS5wYXJlbnROb2RlOmUpLG5ldyBXZyh0KX07Vm4uZmluZERPTU5vZGU9ZnVuY3Rpb24oZSl7aWYoZT09bnVsbClyZXR1cm4gbnVsbDtpZihlLm5vZGVUeXBlPT09MSlyZXR1cm4gZTt2YXIgdD1lLl9yZWFjdEludGVybmFscztpZih0PT09dm9pZCAwKXRocm93IHR5cGVvZiBlLnJlbmRlcj09ImZ1bmN0aW9uIj9FcnJvcihVKDE4OCkpOihlPU9iamVjdC5rZXlzKGUpLmpvaW4oIiwiKSxFcnJvcihVKDI2OCxlKSkpO3JldHVybiBlPXQxKHQpLGU9ZT09PW51bGw/bnVsbDplLnN0YXRlTm9kZSxlfTtWbi5mbHVzaFN5bmM9ZnVuY3Rpb24oZSl7cmV0dXJuIFpvKGUpfTtWbi5oeWRyYXRlPWZ1bmN0aW9uKGUsdCxuKXtpZighdmYodCkpdGhyb3cgRXJyb3IoVSgyMDApKTtyZXR1cm4geWYobnVsbCxlLHQsITAsbil9O1ZuLmh5ZHJhdGVSb290PWZ1bmN0aW9uKGUsdCxuKXtpZighVmcoZSkpdGhyb3cgRXJyb3IoVSg0MDUpKTt2YXIgcj1uIT1udWxsJiZuLmh5ZHJhdGVkU291cmNlc3x8bnVsbCxpPSExLG89IiIsbD1NdztpZihuIT1udWxsJiYobi51bnN0YWJsZV9zdHJpY3RNb2RlPT09ITAmJihpPSEwKSxuLmlkZW50aWZpZXJQcmVmaXghPT12b2lkIDAmJihvPW4uaWRlbnRpZmllclByZWZpeCksbi5vblJlY292ZXJhYmxlRXJyb3IhPT12b2lkIDAmJihsPW4ub25SZWNvdmVyYWJsZUVycm9yKSksdD1Bdyh0LG51bGwsZSwxLG4/P251bGwsaSwhMSxvLGwpLGVbZmldPXQuY3VycmVudCxIYShlKSxyKWZvcihlPTA7ZTxyLmxlbmd0aDtlKyspbj1yW2VdLGk9bi5fZ2V0VmVyc2lvbixpPWkobi5fc291cmNlKSx0Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE9PW51bGw/dC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPVtuLGldOnQubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YS5wdXNoKG4saSk7cmV0dXJuIG5ldyBnZih0KX07Vm4ucmVuZGVyPWZ1bmN0aW9uKGUsdCxuKXtpZighdmYodCkpdGhyb3cgRXJyb3IoVSgyMDApKTtyZXR1cm4geWYobnVsbCxlLHQsITEsbil9O1ZuLnVubW91bnRDb21wb25lbnRBdE5vZGU9ZnVuY3Rpb24oZSl7aWYoIXZmKGUpKXRocm93IEVycm9yKFUoNDApKTtyZXR1cm4gZS5fcmVhY3RSb290Q29udGFpbmVyPyhabyhmdW5jdGlvbigpe3lmKG51bGwsbnVsbCxlLCExLGZ1bmN0aW9uKCl7ZS5fcmVhY3RSb290Q29udGFpbmVyPW51bGwsZVtmaV09bnVsbH0pfSksITApOiExfTtWbi51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcz1JZztWbi51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcj1mdW5jdGlvbihlLHQsbixyKXtpZighdmYobikpdGhyb3cgRXJyb3IoVSgyMDApKTtpZihlPT1udWxsfHxlLl9yZWFjdEludGVybmFscz09PXZvaWQgMCl0aHJvdyBFcnJvcihVKDM4KSk7cmV0dXJuIHlmKGUsdCxuLCExLHIpfTtWbi52ZXJzaW9uPSIxOC4yLjAtbmV4dC05ZTNiNzcyYjgtMjAyMjA2MDgiO2Z1bmN0aW9uIER3KCl7aWYoISh0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fPiJ1Inx8dHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRSE9ImZ1bmN0aW9uIikpdHJ5e19fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRShEdyl9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcihlKX19RHcoKSxBXy5leHBvcnRzPVZuO3ZhciBHcj1BXy5leHBvcnRzO2NvbnN0IEx3PVR1KEdyKSxqVD1FXyh7X19wcm90b19fOm51bGwsZGVmYXVsdDpMd30sW0dyXSk7dmFyIGcwPUdyO1FoLmNyZWF0ZVJvb3Q9ZzAuY3JlYXRlUm9vdCxRaC5oeWRyYXRlUm9vdD1nMC5oeWRyYXRlUm9vdDt2YXIgSXc9e2V4cG9ydHM6e319LHhmPXt9Oy8qKgogKiBAbGljZW5zZSBSZWFjdAogKiByZWFjdC1qc3gtcnVudGltZS5wcm9kdWN0aW9uLm1pbi5qcwogKgogKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICovdmFyIHpUPXAsRlQ9U3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpLEJUPVN5bWJvbC5mb3IoInJlYWN0LmZyYWdtZW50IiksVVQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxXVD16VC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRC5SZWFjdEN1cnJlbnRPd25lcixWVD17a2V5OiEwLHJlZjohMCxfX3NlbGY6ITAsX19zb3VyY2U6ITB9O2Z1bmN0aW9uIGp3KGUsdCxuKXt2YXIgcixpPXt9LG89bnVsbCxsPW51bGw7biE9PXZvaWQgMCYmKG89IiIrbiksdC5rZXkhPT12b2lkIDAmJihvPSIiK3Qua2V5KSx0LnJlZiE9PXZvaWQgMCYmKGw9dC5yZWYpO2ZvcihyIGluIHQpVVQuY2FsbCh0LHIpJiYhVlQuaGFzT3duUHJvcGVydHkocikmJihpW3JdPXRbcl0pO2lmKGUmJmUuZGVmYXVsdFByb3BzKWZvcihyIGluIHQ9ZS5kZWZhdWx0UHJvcHMsdClpW3JdPT09dm9pZCAwJiYoaVtyXT10W3JdKTtyZXR1cm57JCR0eXBlb2Y6RlQsdHlwZTplLGtleTpvLHJlZjpsLHByb3BzOmksX293bmVyOldULmN1cnJlbnR9fXhmLkZyYWdtZW50PUJUO3hmLmpzeD1qdzt4Zi5qc3hzPWp3O0l3LmV4cG9ydHM9eGY7dmFyIHg9SXcuZXhwb3J0cztmdW5jdGlvbiBWcChlLHQpeyh0PT1udWxsfHx0PmUubGVuZ3RoKSYmKHQ9ZS5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KHQpO248dDtuKyspcltuXT1lW25dO3JldHVybiByfWZ1bmN0aW9uIEhnKGUsdCl7aWYoZSl7aWYodHlwZW9mIGU9PSJzdHJpbmciKXJldHVybiBWcChlLHQpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKTtpZihuPT09Ik9iamVjdCImJmUuY29uc3RydWN0b3ImJihuPWUuY29uc3RydWN0b3IubmFtZSksbj09PSJNYXAifHxuPT09IlNldCIpcmV0dXJuIEFycmF5LmZyb20oZSk7aWYobj09PSJBcmd1bWVudHMifHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSlyZXR1cm4gVnAoZSx0KX19ZnVuY3Rpb24gX2YoZSx0KXt2YXIgbj10eXBlb2YgU3ltYm9sPCJ1IiYmZVtTeW1ib2wuaXRlcmF0b3JdfHxlWyJAQGl0ZXJhdG9yIl07aWYoIW4pe2lmKEFycmF5LmlzQXJyYXkoZSl8fChuPUhnKGUpKXx8dCYmZSYmdHlwZW9mIGUubGVuZ3RoPT0ibnVtYmVyIil7biYmKGU9bik7dmFyIHI9MCxpPWZ1bmN0aW9uKCl7fTtyZXR1cm57czppLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49ZS5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOmVbcisrXX19LGU6ZnVuY3Rpb24oYSl7dGhyb3cgYX0sZjppfX10aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX12YXIgbz0hMCxsPSExLHM7cmV0dXJue3M6ZnVuY3Rpb24oKXtuPW4uY2FsbChlKX0sbjpmdW5jdGlvbigpe3ZhciBhPW4ubmV4dCgpO3JldHVybiBvPWEuZG9uZSxhfSxlOmZ1bmN0aW9uKGEpe2w9ITAscz1hfSxmOmZ1bmN0aW9uKCl7dHJ5eyFvJiZuLnJldHVybiE9bnVsbCYmbi5yZXR1cm4oKX1maW5hbGx5e2lmKGwpdGhyb3cgc319fX1mdW5jdGlvbiB6dyhlKXtyZXR1cm4gZS5sZW5ndGg+MH12YXIgTXU9T2JqZWN0LmZyZWV6ZSh7a2luZDoib2siLHZhbHVlOnZvaWQgMH0pO2Z1bmN0aW9uIER1KGUpe3JldHVybiBlPT09dm9pZCAwP011OntraW5kOiJvayIsdmFsdWU6ZX19ZnVuY3Rpb24gQnIoZSl7cmV0dXJue2tpbmQ6ImVyciIsZXJyb3I6ZX19ZnVuY3Rpb24gU3MoZSl7cmV0dXJuIGU9PT1NdXx8ZS5raW5kPT09Im9rIn1mdW5jdGlvbiBLZyhlKXtyZXR1cm4gZSE9PU11JiZlLmtpbmQ9PT0iZXJyIn1mdW5jdGlvbiBGdyhlKXt2YXIgdD1bXSxuPVtdLHI9X2YoZSksaTt0cnl7Zm9yKHIucygpOyEoaT1yLm4oKSkuZG9uZTspe3ZhciBvPWkudmFsdWU7U3Mobyk/dC5wdXNoKG8udmFsdWUpOm4ucHVzaChvLmVycm9yKX19Y2F0Y2gobCl7ci5lKGwpfWZpbmFsbHl7ci5mKCl9cmV0dXJuIHp3KG4pP0JyKG4pOkR1KHQpfWZ1bmN0aW9uIEhUKGUpe3JldHVybiBGdyhlKX1mdW5jdGlvbiBLVChlKXt2YXIgdD1bXSxuPV9mKGUpLHI7dHJ5e2ZvcihuLnMoKTshKHI9bi5uKCkpLmRvbmU7KXt2YXIgaT1yLnZhbHVlO0tnKGkpJiZ0LnB1c2goaS5lcnJvcil9fWNhdGNoKG8pe24uZShvKX1maW5hbGx5e24uZigpfXJldHVybiB6dyh0KT9Ccih0KTpNdX1mdW5jdGlvbiBaVChlLHQpe3JldHVybiBmdW5jdGlvbihuKXtmb3IodmFyIHI9RHUodCksaT0wO2k8bi5sZW5ndGgmJlNzKHIpOysraSlyPWUoci52YWx1ZSxuW2ldLGkpO3JldHVybiByfX1mdW5jdGlvbiBHVChlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIFNzKHQpP0R1KGUodC52YWx1ZSkpOnR9fWZ1bmN0aW9uIFlUKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gU3ModCk/ZSh0LnZhbHVlKTp0fX1mdW5jdGlvbiBYVChlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIEtnKHQpP0JyKGUodC5lcnJvcikpOnR9fWZ1bmN0aW9uIFFUKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBlKG4pP0R1KG4pOkJyKHQobikpfX12YXIgSlQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIFNzKHIpP3Qoci52YWx1ZSk/cjpCcihuKHIudmFsdWUpKTpyfX0sam89T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdm9pZE9rOk11LG9rOkR1LGVycjpCcixpc09rOlNzLGlzRXJyOktnLGFsbFQ6RncsYWxsOkhULGFsbFY6S1QsZmxhdE1hcFJlZHVjZTpaVCxtYXA6R1QsZmxhdE1hcDpZVCxtYXBFcnI6WFQsZnJvbVByZWRpY2F0ZTpRVCxmaWx0ZXJPckVsc2U6SlR9KTtmdW5jdGlvbiBxVChlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBWcChlKX1mdW5jdGlvbiBlTihlKXtpZih0eXBlb2YgU3ltYm9sPCJ1IiYmZVtTeW1ib2wuaXRlcmF0b3JdIT1udWxsfHxlWyJAQGl0ZXJhdG9yIl0hPW51bGwpcmV0dXJuIEFycmF5LmZyb20oZSl9ZnVuY3Rpb24gdE4oKXt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS4KSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLmApfWZ1bmN0aW9uIEJ3KGUpe3JldHVybiBxVChlKXx8ZU4oZSl8fEhnKGUpfHx0TigpfWZ1bmN0aW9uIF9lKGUpeyJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7cmV0dXJuIF9lPXR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJnR5cGVvZiBTeW1ib2wuaXRlcmF0b3I9PSJzeW1ib2wiP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSxfZShlKX1mdW5jdGlvbiBuTihlLHQpe2lmKHR5cGVvZiBlIT0ib2JqZWN0Inx8ZT09PW51bGwpcmV0dXJuIGU7dmFyIG49ZVtTeW1ib2wudG9QcmltaXRpdmVdO2lmKG4hPT12b2lkIDApe3ZhciByPW4uY2FsbChlLHR8fCJkZWZhdWx0Iik7aWYodHlwZW9mIHIhPSJvYmplY3QiKXJldHVybiByO3Rocm93IG5ldyBUeXBlRXJyb3IoIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuIil9cmV0dXJuKHQ9PT0ic3RyaW5nIj9TdHJpbmc6TnVtYmVyKShlKX1mdW5jdGlvbiBVdyhlKXt2YXIgdD1uTihlLCJzdHJpbmciKTtyZXR1cm4gdHlwZW9mIHQ9PSJzeW1ib2wiP3Q6U3RyaW5nKHQpfWZ1bmN0aW9uIHllKGUsdCxuKXtyZXR1cm4gdD1Vdyh0KSx0IGluIGU/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOmVbdF09bixlfWZ1bmN0aW9uIHYwKGUsdCl7dmFyIG49T2JqZWN0LmtleXMoZSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTt0JiYocj1yLmZpbHRlcihmdW5jdGlvbihpKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLGkpLmVudW1lcmFibGV9KSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gYXMoZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdIT1udWxsP2FyZ3VtZW50c1t0XTp7fTt0JTI/djAoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3llKGUscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOnYwKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gZX1mdW5jdGlvbiByTihlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlfWZ1bmN0aW9uIGlOKGUsdCl7dmFyIG49ZT09bnVsbD9udWxsOnR5cGVvZiBTeW1ib2w8InUiJiZlW1N5bWJvbC5pdGVyYXRvcl18fGVbIkBAaXRlcmF0b3IiXTtpZihuIT1udWxsKXt2YXIgcixpLG8sbCxzPVtdLGE9ITAsdT0hMTt0cnl7aWYobz0obj1uLmNhbGwoZSkpLm5leHQsdD09PTApe2lmKE9iamVjdChuKSE9PW4pcmV0dXJuO2E9ITF9ZWxzZSBmb3IoOyEoYT0ocj1vLmNhbGwobikpLmRvbmUpJiYocy5wdXNoKHIudmFsdWUpLHMubGVuZ3RoIT09dCk7YT0hMCk7fWNhdGNoKGMpe3U9ITAsaT1jfWZpbmFsbHl7dHJ5e2lmKCFhJiZuLnJldHVybiE9bnVsbCYmKGw9bi5yZXR1cm4oKSxPYmplY3QobCkhPT1sKSlyZXR1cm59ZmluYWxseXtpZih1KXRocm93IGl9fXJldHVybiBzfX1mdW5jdGlvbiBvTigpe3Rocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX1mdW5jdGlvbiBKaShlLHQpe3JldHVybiByTihlKXx8aU4oZSx0KXx8SGcoZSx0KXx8b04oKX1mdW5jdGlvbiBscihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIHkwKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxVdyhyLmtleSkscil9fWZ1bmN0aW9uIHNyKGUsdCxuKXtyZXR1cm4gdCYmeTAoZS5wcm90b3R5cGUsdCksbiYmeTAoZSxuKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxlfWZ1bmN0aW9uIEhwKGUsdCl7cmV0dXJuIEhwPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKHIsaSl7cmV0dXJuIHIuX19wcm90b19fPWkscn0sSHAoZSx0KX1mdW5jdGlvbiB5byhlLHQpe2lmKHR5cGVvZiB0IT0iZnVuY3Rpb24iJiZ0IT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSx0JiZIcChlLHQpfWZ1bmN0aW9uIHhkKGUpe3JldHVybiB4ZD1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihuKXtyZXR1cm4gbi5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihuKX0seGQoZSl9ZnVuY3Rpb24gbE4oKXtpZih0eXBlb2YgUmVmbGVjdD4idSJ8fCFSZWZsZWN0LmNvbnN0cnVjdHx8UmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZih0eXBlb2YgUHJveHk9PSJmdW5jdGlvbiIpcmV0dXJuITA7dHJ5e3JldHVybiBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbixbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaHtyZXR1cm4hMX19ZnVuY3Rpb24gV3coZSl7aWYoZT09PXZvaWQgMCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiBlfWZ1bmN0aW9uIHNOKGUsdCl7aWYodCYmKHR5cGVvZiB0PT0ib2JqZWN0Inx8dHlwZW9mIHQ9PSJmdW5jdGlvbiIpKXJldHVybiB0O2lmKHQhPT12b2lkIDApdGhyb3cgbmV3IFR5cGVFcnJvcigiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWQiKTtyZXR1cm4gV3coZSl9ZnVuY3Rpb24geG8oZSl7dmFyIHQ9bE4oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj14ZChlKSxpO2lmKHQpe3ZhciBvPXhkKHRoaXMpLmNvbnN0cnVjdG9yO2k9UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsbyl9ZWxzZSBpPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBzTih0aGlzLGkpfX12YXIgX289ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7bHIodGhpcyxlKX1yZXR1cm4gc3IoZSxbe2tleToiYXBwZW5kVmFsaWRhdGlvbkVycm9yIix2YWx1ZTpmdW5jdGlvbihuLHIsaSxvKXtyZXR1cm4gbj8obltyXT9uW3JdLnB1c2goe21lc3NhZ2U6aSx2YWx1ZTpvfSk6bltyXT1be21lc3NhZ2U6aSx2YWx1ZTpvfV0sbik6eWUoe30scixbe21lc3NhZ2U6aSx2YWx1ZTpvfV0pfX1dKSxlfSgpLEZjPVN5bWJvbCgiR2V0U2NoZW1hIikscG49U3ltYm9sKCJQYXRoIiksT3Q9U3ltYm9sKCJHZXRTb3VyY2UiKTtmdW5jdGlvbiBhTihlKXtyZXR1cm4gZVtGY119dmFyIFpnPXNyKGZ1bmN0aW9uIGUodCl7bHIodGhpcyxlKSx0aGlzLnNwYW49dH0pLHVOPWZ1bmN0aW9uKGUpe3lvKG4sZSk7dmFyIHQ9eG8obik7ZnVuY3Rpb24gbihyLGkpe3ZhciBvO3JldHVybiBscih0aGlzLG4pLG89dC5jYWxsKHRoaXMsaSkseWUoV3cobyksInR5cGUiLCJTeW0iKSxvLnZhbHVlPXIsb31yZXR1cm4gc3Iobixbe2tleToidHJhbnNwaWxlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlfX1dKSxufShaZyk7bmV3IHVOKCIoKSIpO3ZhciBubj0iX3R5cGUiLFJuPSJfcmVmIjtmdW5jdGlvbiBWdyhlKXt2YXIgdDtpZighZVtSbl0uc3RhcnRzV2l0aCgiL3B1YmxpYyIpKXt2YXIgbjtyZXR1cm57dXJsOmVbUm5dKyI/c2hhMjU2PSIuY29uY2F0KChuPWUubWV0YWRhdGEpPT09bnVsbHx8bj09PXZvaWQgMD92b2lkIDA6bi5zaGEyNTYpLG1ldGFkYXRhOmUubWV0YWRhdGF9fXJldHVybnt1cmw6ZVtSbl0uc2xpY2UoNykrIj9zaGEyNTY9Ii5jb25jYXQoKHQ9ZS5tZXRhZGF0YSk9PT1udWxsfHx0PT09dm9pZCAwP3ZvaWQgMDp0LnNoYTI1NiksbWV0YWRhdGE6ZS5tZXRhZGF0YX19ZnVuY3Rpb24gSHcoZSl7cmV0dXJuIF9lKGUpPT09Im9iamVjdCImJmUhPT1udWxsJiZlIT09dm9pZCAwJiYoInZhbCJpbiBlfHwidmFsUGF0aCJpbiBlKX1mdW5jdGlvbiBjTihlKXtyZXR1cm4gX2UoZSk9PT0ib2JqZWN0IiYmZSE9PW51bGwmJmUhPT12b2lkIDAmJnBuIGluIGUmJiJ2YWwiaW4gZX1mdW5jdGlvbiBkTihlKXtyZXR1cm4gZVtwbl19ZnVuY3Rpb24gZk4oZSx0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9ZnVuY3Rpb24geDAoZSx0LG4pe3JldHVybiB0P010KGUoTXQodCxuKSkpOk10KHQsbil9ZnVuY3Rpb24gcWkoZSl7cmV0dXJuIF9lKGUpPT09Im9iamVjdCImJmUhPT1udWxsJiYoT3QgaW4gZXx8cG4gaW4gZSl9ZnVuY3Rpb24gTXQoZSx0LG4pe2lmKF9lKGUpPT09Im9iamVjdCIpe2lmKHFpKGUpKXJldHVybiBlO2lmKEh3KGUpKXJldHVybiBNdChlLnZhbCxlLnZhbFBhdGgpfWlmKGUmJmVbUm5dJiZlW25uXT09PSJmaWxlIil7dmFyIHI9ZVtSbl07aWYodHlwZW9mIHIhPSJzdHJpbmciKXRocm93IEVycm9yKCJJbnZhbGlkIGZpbGUgcmVmOiAiK3IpO3JldHVybiBNdChWdyhlKSx0LG4pfXN3aXRjaChfZShlKSl7Y2FzZSJmdW5jdGlvbiI6Y2FzZSJzeW1ib2wiOnRocm93IEVycm9yKCJJbnZhbGlkIHNlbGVjdG9yIHR5cGU6ICIuY29uY2F0KF9lKGUpLCI6ICIpLmNvbmNhdChlKSk7Y2FzZSJvYmplY3QiOmlmKGUhPT1udWxsKXJldHVybiBuZXcgUHJveHkoZSx7aGFzOmZ1bmN0aW9uKG8sbCl7cmV0dXJuIGw9PT1PdHx8bD09PXBufHxsPT09ImFuZFRoZW4ifHxsPT09RmM/ITA6bCBpbiBvfSxnZXQ6ZnVuY3Rpb24obyxsKXtpZihsPT09T3QpcmV0dXJuIGU7aWYobD09PXBuKXJldHVybiB0O2lmKGw9PT1GYylyZXR1cm4gbjtpZihsPT09ImFuZFRoZW4iKXJldHVybiBmdW5jdGlvbihhKXtyZXR1cm4geDAoYSxlLHQpfTtpZihBcnJheS5pc0FycmF5KG8pKXtpZihsPT09ImZpbHRlciIpcmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciB1PW8ubWFwKGZ1bmN0aW9uKGMsZCl7cmV0dXJuIE10KGMsZXIodCxkKSxuPT1udWxsP3ZvaWQgMDpuLml0ZW0pfSkuZmlsdGVyKGZ1bmN0aW9uKGMpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgX28/YS5hc3NlcnQoXzAoYykpOl8wKGEoYykpfSk7cmV0dXJuIE10KHUsdCxuKX07aWYobD09PSJtYXAiKXJldHVybiBmdW5jdGlvbihhKXt2YXIgdT1vLm1hcChmdW5jdGlvbihjLGQpe3ZhciBmPWEoTXQoYyxlcih0LGQpLG49PW51bGw/dm9pZCAwOm4uaXRlbSksTXQoZCkpO3JldHVybiBxaShmKT9mOk10KGYpfSk7cmV0dXJuIE10KHUsdCxuKX19aWYoQXJyYXkuaXNBcnJheShvKSYmbD09PSJsZW5ndGgiKXJldHVybiBNdChvLmxlbmd0aCk7dmFyIHM9UmVmbGVjdC5nZXQobyxsKTtyZXR1cm4gZk4oZSxsKT9OdW1iZXIuaXNOYU4oTnVtYmVyKGwpKT9NdChzLGVyKHQsbCksbj09bnVsbD92b2lkIDA6bi5pdGVtc1tsXSk6TXQocyxlcih0LE51bWJlcihsKSksbj09bnVsbD92b2lkIDA6bi5pdGVtKTpzfX0pO2RlZmF1bHQ6cmV0dXJuIHllKHllKHllKHtlcTpmdW5jdGlvbihvKXt2YXIgbD1vO2lmKHFpKG8pJiYobD1vW090XSxsIGluc3RhbmNlb2YgWmcpKXRocm93IEVycm9yKCJUT0RPOiBDYW5ub3QgZXZhbHVhdGUgZXF1YWxpdHkgd2l0aCBhbiBFeHByIik7cmV0dXJuIE10KGU9PT1sLHZvaWQgMCl9LGFuZFRoZW46ZnVuY3Rpb24obyl7cmV0dXJuIHgwKG8sZT09PXZvaWQgMD9udWxsOmUsdCl9fSxPdCxlPT09dm9pZCAwP251bGw6ZSkscG4sdCksRmMsbil9fWZ1bmN0aW9uIGVyKGUsdCl7aWYoX2UodCk9PT0ic3ltYm9sIil0aHJvdyBFcnJvcigiQ2Fubm90IGNyZWF0ZSB2YWwgcGF0aCBvZiBhcnJheSBpdGVtIHdpdGggc3ltYm9sIHByb3A6ICIuY29uY2F0KHQudG9TdHJpbmcoKSkpO3JldHVybiBlJiYiIi5jb25jYXQoZSwiLiIpLmNvbmNhdChKU09OLnN0cmluZ2lmeSh0KSl9ZnVuY3Rpb24gXzAoZSl7aWYoX2UoZSk9PT0ib2JqZWN0IiYmKE90IGluIGV8fHBuIGluIGUpKXt2YXIgdD1lW090XTtyZXR1cm4gdH1yZXR1cm4gZX12YXIgS3c9ZnVuY3Rpb24oZSl7eW8obixlKTt2YXIgdD14byhuKTtmdW5jdGlvbiBuKHIpe3ZhciBpLG89YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiExO3JldHVybiBscih0aGlzLG4pLGk9dC5jYWxsKHRoaXMpLGkuaXRlbXM9cixpLm9wdD1vLGl9cmV0dXJuIHNyKG4sW3trZXk6InZhbGlkYXRlIix2YWx1ZTpmdW5jdGlvbihpLG8pe3ZhciBsPXRoaXMscz0hMTtyZXR1cm4gdGhpcy5vcHQmJm89PW51bGw/ITE6X2UobykhPT0ib2JqZWN0Ij95ZSh7fSxpLFt7bWVzc2FnZToiRXhwZWN0ZWQgJ29iamVjdCcsIGdvdCAnIi5jb25jYXQoX2UobyksIiciKX1dKTpBcnJheS5pc0FycmF5KG8pP3llKHt9LGksW3ttZXNzYWdlOiJFeHBlY3RlZCAnb2JqZWN0JywgZ290ICdhcnJheScifV0pOihPYmplY3QuZW50cmllcyh0aGlzLml0ZW1zKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciB1PUppKGEsMiksYz11WzBdLGQ9dVsxXSxmPWVyKGksYyk7aWYoIWYpcz1sLmFwcGVuZFZhbGlkYXRpb25FcnJvcihzLGksIkludGVybmFsIGVycm9yOiBjb3VsZCBub3QgY3JlYXRlIHBhdGggYXQgIi5jb25jYXQoIWkmJnR5cGVvZiBpPT0ic3RyaW5nIj8iPGVtcHR5IHN0cmluZz4iOmksIiBhdCBrZXkgIikuY29uY2F0KGMpLG8pO2Vsc2V7dmFyIGg9ZC52YWxpZGF0ZShmLG9bY10pO2gmJnM/cz1hcyhhcyh7fSxoKSxzKTpoJiYocz1oKX19KSxzKX19LHtrZXk6ImFzc2VydCIsdmFsdWU6ZnVuY3Rpb24oaSl7aWYodGhpcy5vcHQmJmk9PW51bGwpcmV0dXJuITA7aWYoIWkpcmV0dXJuITE7Zm9yKHZhciBvPTAsbD1PYmplY3QuZW50cmllcyh0aGlzLml0ZW1zKTtvPGwubGVuZ3RoO28rKyl7dmFyIHM9SmkobFtvXSwyKSxhPXNbMF0sdT1zWzFdO2lmKCF1LmFzc2VydChpW2FdKSlyZXR1cm4hMX1yZXR1cm4gX2UoaSk9PT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkoaSl9fSx7a2V5OiJvcHRpb25hbCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcy5pdGVtcywhMCl9fSx7a2V5OiJzZXJpYWxpemUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6Im9iamVjdCIsaXRlbXM6T2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHRoaXMuaXRlbXMpLm1hcChmdW5jdGlvbihpKXt2YXIgbz1KaShpLDIpLGw9b1swXSxzPW9bMV07cmV0dXJuW2wscy5zZXJpYWxpemUoKV19KSksb3B0OnRoaXMub3B0fX19XSksbn0oX28pLGhOPWZ1bmN0aW9uKGUpe3lvKG4sZSk7dmFyIHQ9eG8obik7ZnVuY3Rpb24gbihyKXt2YXIgaSxvPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtyZXR1cm4gbHIodGhpcyxuKSxpPXQuY2FsbCh0aGlzKSxpLml0ZW09cixpLm9wdD1vLGl9cmV0dXJuIHNyKG4sW3trZXk6InZhbGlkYXRlIix2YWx1ZTpmdW5jdGlvbihpLG8pe3ZhciBsPXRoaXMscz0hMTtyZXR1cm4gdGhpcy5vcHQmJm89PW51bGw/ITE6X2UobykhPT0ib2JqZWN0Inx8IUFycmF5LmlzQXJyYXkobyk/eWUoe30saSxbe21lc3NhZ2U6IkV4cGVjdGVkICdhcnJheScsIGdvdCAnIi5jb25jYXQoX2UobyksIiciKX1dKTooby5mb3JFYWNoKGZ1bmN0aW9uKGEsdSl7dmFyIGM9ZXIoaSx1KTtpZighYylzPWwuYXBwZW5kVmFsaWRhdGlvbkVycm9yKHMsaSwiSW50ZXJuYWwgZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgcGF0aCBhdCAiLmNvbmNhdCghaSYmdHlwZW9mIGk9PSJzdHJpbmciPyI8ZW1wdHkgc3RyaW5nPiI6aSwiIGF0IGluZGV4ICIpLmNvbmNhdCh1KSxvKTtlbHNle3ZhciBkPWwuaXRlbS52YWxpZGF0ZShjLGEpO2QmJnM/cz1hcyhhcyh7fSxkKSxzKTpkJiYocz1kKX19KSxzKX19LHtrZXk6ImFzc2VydCIsdmFsdWU6ZnVuY3Rpb24oaSl7aWYodGhpcy5vcHQmJmk9PW51bGwpcmV0dXJuITA7aWYoIWkpcmV0dXJuITE7dmFyIG89X2YoaSksbDt0cnl7Zm9yKG8ucygpOyEobD1vLm4oKSkuZG9uZTspe3ZhciBzPWwudmFsdWU7aWYoIXRoaXMuaXRlbS5hc3NlcnQocykpcmV0dXJuITF9fWNhdGNoKGEpe28uZShhKX1maW5hbGx5e28uZigpfXJldHVybiBfZShpKT09PSJvYmplY3QiJiZBcnJheS5pc0FycmF5KGkpfX0se2tleToib3B0aW9uYWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMuaXRlbSwhMCl9fSx7a2V5OiJzZXJpYWxpemUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6ImFycmF5IixpdGVtOnRoaXMuaXRlbS5zZXJpYWxpemUoKSxvcHQ6dGhpcy5vcHR9fX1dKSxufShfbyksdzA9ZnVuY3Rpb24oZSl7eW8obixlKTt2YXIgdD14byhuKTtmdW5jdGlvbiBuKHIpe3ZhciBpLG89YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiExO3JldHVybiBscih0aGlzLG4pLGk9dC5jYWxsKHRoaXMpLGkudmFsdWU9cixpLm9wdD1vLGl9cmV0dXJuIHNyKG4sW3trZXk6InZhbGlkYXRlIix2YWx1ZTpmdW5jdGlvbihpLG8pe3JldHVybiB0aGlzLm9wdCYmbz09bnVsbD8hMTp0eXBlb2YgbyE9InN0cmluZyI/eWUoe30saSxbe21lc3NhZ2U6IkV4cGVjdGVkICdzdHJpbmcnLCBnb3QgJyIuY29uY2F0KF9lKG8pLCInIiksdmFsdWU6b31dKTpvIT09dGhpcy52YWx1ZT95ZSh7fSxpLFt7bWVzc2FnZToiRXhwZWN0ZWQgbGl0ZXJhbCAnIi5jb25jYXQodGhpcy52YWx1ZSwiJywgZ290ICciKS5jb25jYXQobywiJyIpLHZhbHVlOm99XSk6ITF9fSx7a2V5OiJhc3NlcnQiLHZhbHVlOmZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLm9wdCYmaT09bnVsbD8hMDp0eXBlb2YgaT09InN0cmluZyJ9fSx7a2V5OiJvcHRpb25hbCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcy52YWx1ZSwhMCl9fSx7a2V5OiJzZXJpYWxpemUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6ImxpdGVyYWwiLHZhbHVlOnRoaXMudmFsdWUsb3B0OnRoaXMub3B0fX19XSksbn0oX28pLHBOPWZ1bmN0aW9uKGUpe3lvKG4sZSk7dmFyIHQ9eG8obik7ZnVuY3Rpb24gbihyLGkpe3ZhciBvLGw9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExO3JldHVybiBscih0aGlzLG4pLG89dC5jYWxsKHRoaXMpLG8ua2V5PXIsby5pdGVtcz1pLG8ub3B0PWwsb31yZXR1cm4gc3Iobixbe2tleToidmFsaWRhdGUiLHZhbHVlOmZ1bmN0aW9uKGksbyl7dmFyIGw9byxzPSExO2lmKHRoaXMub3B0JiZsPT1udWxsKXJldHVybiExO2lmKCF0aGlzLmtleSlyZXR1cm4geWUoe30saSxbe21lc3NhZ2U6Ik1pc3NpbmcgcmVxdWlyZWQgZmlyc3QgYXJndW1lbnQgaW4gdW5pb24ifV0pO3ZhciBhPXRoaXMua2V5O2lmKCFBcnJheS5pc0FycmF5KHRoaXMuaXRlbXMpKXJldHVybiB5ZSh7fSxpLFt7bWVzc2FnZToiQSB1bmlvbiBzY2hlbWEgbXVzdCB0YWtlIG1vcmUgdGhhbiAxIHNjaGVtYSBhcmd1bWVudHMiLGZhdGFsOiEwfV0pO2lmKHR5cGVvZiBhPT0ic3RyaW5nIil7aWYodGhpcy5pdGVtcy5zb21lKGZ1bmN0aW9uKE4pe3JldHVybiEoTiBpbnN0YW5jZW9mIEt3KX0pKXJldHVybiB5ZSh7fSxpLFt7bWVzc2FnZToiS2V5IGlzIGEgc3RyaW5nLCBzbyBhbGwgc2NoZW1hIGl0ZW1zIG11c3QgYmUgb2JqZWN0cyIsZmF0YWw6ITB9XSk7dmFyIHU9dGhpcy5pdGVtcyxjPXUubWFwKGZ1bmN0aW9uKE4pe3JldHVybiBOLnNlcmlhbGl6ZSgpfSksZD1jLmZpbHRlcihmdW5jdGlvbihOKXtyZXR1cm4gTi50eXBlIT09Im9iamVjdCJ8fE4uaXRlbXNbYV0udHlwZSE9PSJsaXRlcmFsIn0pO2lmKGQubGVuZ3RoPjApcmV0dXJuIHllKHt9LGksW3ttZXNzYWdlOiJBbGwgc2NoZW1hIGl0ZW1zIG11c3QgYmUgb2JqZWN0cyB3aXRoIGEga2V5OiAiLmNvbmNhdChhLCIgdGhhdCBpcyBhIGxpdGVyYWwgc2NoZW1hLiBGb3VuZDogIikuY29uY2F0KEpTT04uc3RyaW5naWZ5KGQsbnVsbCwyKSksZmF0YWw6ITB9XSk7dmFyIGY9YyxoPWYuZmlsdGVyKGZ1bmN0aW9uKE4pe3JldHVybiBOLml0ZW1zW2FdLm9wdH0pO2lmKGgubGVuZ3RoPjEpcmV0dXJuIHllKHt9LGksW3ttZXNzYWdlOiJTY2hlbWEgY2Fubm90IGhhdmUgYW4gb3B0aW9uYWwga2V5czogIi5jb25jYXQoYSksZmF0YWw6ITB9XSk7aWYoX2UobCkhPT0ib2JqZWN0IilyZXR1cm4geWUoe30saSxbe21lc3NhZ2U6IkV4cGVjdGVkIGFuIG9iamVjdCJ9XSk7dmFyIG09bDtpZihtW2FdPT09dm9pZCAwKXJldHVybiB5ZSh7fSxpLFt7bWVzc2FnZToiTWlzc2luZyByZXF1aXJlZCBrZXk6ICIuY29uY2F0KGEpfV0pO3ZhciBnPVtdLHc9X2YoZiksdjt0cnl7Zm9yKHcucygpOyEodj13Lm4oKSkuZG9uZTspe3ZhciB5PXYudmFsdWUsXz15Lml0ZW1zW2FdO2lmKF8udHlwZT09PSJsaXRlcmFsIilpZighZy5pbmNsdWRlcyhfLnZhbHVlKSlnLnB1c2goXy52YWx1ZSk7ZWxzZSByZXR1cm4geWUoe30saSxbe21lc3NhZ2U6IkZvdW5kIGR1cGxpY2F0ZSBrZXkgaW4gc2NoZW1hOiAiLmNvbmNhdChfLnZhbHVlKSxmYXRhbDohMH1dKX19Y2F0Y2goTil7dy5lKE4pfWZpbmFsbHl7dy5mKCl9dmFyIFM9dS5maW5kKGZ1bmN0aW9uKE4pe3JldHVybiFOLml0ZW1zW2FdLnZhbGlkYXRlKGksbVthXSl9KTtpZighUyl7dmFyIEU9ZXIoaSxhKTtpZighRSl0aHJvdyBuZXcgRXJyb3IoIkludGVybmFsIGVycm9yOiBjb3VsZCBub3QgY3JlYXRlIHBhdGggYXQgIi5jb25jYXQoIWkmJnR5cGVvZiBpPT0ic3RyaW5nIj8iPGVtcHR5IHN0cmluZz4iOmksIiBhdCBrZXkgIikuY29uY2F0KGEpKTtyZXR1cm4geWUoe30sRSxbe21lc3NhZ2U6J0ludmFsaWQga2V5OiAiJy5jb25jYXQoYSwnIi4gVmFsdWUgd2FzOiAiJykuY29uY2F0KG1bYV0sJyIuIFZhbGlkIHZhbHVlczogJykuY29uY2F0KGYubWFwKGZ1bmN0aW9uKE4pe3ZhciBSPU4uaXRlbXNbYV07aWYoUi50eXBlPT09ImxpdGVyYWwiJiZSLnZhbHVlKXJldHVybiciJy5jb25jYXQoUi52YWx1ZSwnIicpO3Rocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgbGl0ZXJhbCBzY2hlbWEsIGdvdCAiLmNvbmNhdChKU09OLnN0cmluZ2lmeShSLG51bGwsMikpKX0pLmpvaW4oIiwgIikpfV0pfXZhciAkPVMudmFsaWRhdGUoaSxtKTtpZigkKXJldHVybiAkfWVsc2UgaWYoYSBpbnN0YW5jZW9mIHcwKXtpZih0aGlzLml0ZW1zLnNvbWUoZnVuY3Rpb24oTil7cmV0dXJuIShOIGluc3RhbmNlb2YgdzApfSkpcmV0dXJuIHllKHt9LGksW3ttZXNzYWdlOiJLZXkgaXMgYSBsaXRlcmFsIHNjaGVtYSwgc28gYWxsIHNjaGVtYSBpdGVtcyBtdXN0IGJlIGxpdGVyYWxzIixmYXRhbDohMH1dKTt2YXIgQz1bYV0uY29uY2F0KEJ3KHRoaXMuaXRlbXMpKTtpZih0eXBlb2YgbD09InN0cmluZyIpe3ZhciBUPUMuc29tZShmdW5jdGlvbihOKXtyZXR1cm4hTi52YWxpZGF0ZShpLGwpfSk7aWYoIVQpcmV0dXJuIHllKHt9LGksW3ttZXNzYWdlOiJVbmlvbiBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgZm9sbG93aW5nOiAiLmNvbmNhdChDLm1hcChmdW5jdGlvbihOKXtyZXR1cm4nIicuY29uY2F0KE4udmFsdWUsJyInKX0pLmpvaW4oIiwgIikpfV0pfX1lbHNlIHJldHVybiB5ZSh7fSxpLFt7bWVzc2FnZToiRXhwZWN0ZWQgYSBzdHJpbmcgb3IgbGl0ZXJhbCJ9XSk7cmV0dXJuIHN9fSx7a2V5OiJhc3NlcnQiLHZhbHVlOmZ1bmN0aW9uKGkpe3JldHVybiEwfX0se2tleToib3B0aW9uYWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMua2V5LHRoaXMuaXRlbXMsITApfX0se2tleToic2VyaWFsaXplIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0eXBlb2YgdGhpcy5rZXk9PSJzdHJpbmciP3t0eXBlOiJ1bmlvbiIsa2V5OnRoaXMua2V5LGl0ZW1zOnRoaXMuaXRlbXMubWFwKGZ1bmN0aW9uKGkpe3JldHVybiBpLnNlcmlhbGl6ZSgpfSksb3B0OnRoaXMub3B0fTp7dHlwZToidW5pb24iLGl0ZW1zOnRoaXMuaXRlbXMubWFwKGZ1bmN0aW9uKGkpe3JldHVybiBpLnNlcmlhbGl6ZSgpfSksb3B0OnRoaXMub3B0fX19XSksbn0oX28pLG1OPWZ1bmN0aW9uKGUpe3lvKG4sZSk7dmFyIHQ9eG8obik7ZnVuY3Rpb24gbihyKXt2YXIgaSxvPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtyZXR1cm4gbHIodGhpcyxuKSxpPXQuY2FsbCh0aGlzKSxpLm9wdGlvbnM9cixpLm9wdD1vLGl9cmV0dXJuIHNyKG4sW3trZXk6InZhbGlkYXRlIix2YWx1ZTpmdW5jdGlvbihpLG8pe3JldHVybiExfX0se2tleToiYXNzZXJ0Iix2YWx1ZTpmdW5jdGlvbihpKXtyZXR1cm4hMH19LHtrZXk6Im9wdGlvbmFsIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLm9wdGlvbnMsITApfX0se2tleToic2VyaWFsaXplIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOiJyaWNodGV4dCIsb3B0OnRoaXMub3B0fX19XSksbn0oX28pLGdOPWZ1bmN0aW9uKGUpe3lvKG4sZSk7dmFyIHQ9eG8obik7ZnVuY3Rpb24gbihyKXt2YXIgaSxvPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtyZXR1cm4gbHIodGhpcyxuKSxpPXQuY2FsbCh0aGlzKSxpLm9wdGlvbnM9cixpLm9wdD1vLGl9cmV0dXJuIHNyKG4sW3trZXk6InZhbGlkYXRlIix2YWx1ZTpmdW5jdGlvbihpLG8pe3JldHVybiB0aGlzLm9wdCYmbz09bnVsbD8hMTpvPT1udWxsP3llKHt9LGksW3ttZXNzYWdlOiJOb24tb3B0aW9uYWwgaW1hZ2Ugd2FzIG51bGwgb3IgdW5kZWZpbmVkLiIsdmFsdWU6b31dKTp0eXBlb2Ygb1tSbl0hPSJzdHJpbmciP3llKHt9LGksW3ttZXNzYWdlOiJJbWFnZSBkaWQgbm90IGhhdmUgYSBmaWxlIHJlZmVyZW5jZSBzdHJpbmcuIEdvdDogIi5jb25jYXQoX2Uob1tSbl0pKSx2YWx1ZTpvfV0pOm9bbm5dIT09ImZpbGUiP3llKHt9LGksW3ttZXNzYWdlOiJJbWFnZSBkaWQgbm90IGhhdmUgdGhlIHZhbGlkIGZpbGUgZXh0ZW5zaW9uIHR5cGUuIEdvdDogIi5jb25jYXQob1tubl0pLHZhbHVlOm99XSk6by5tZXRhZGF0YT95ZSh7fSxpLFt7bWVzc2FnZToiRm91bmQgbWV0YWRhdGEsIGJ1dCBpdCBjb3VsZCBub3QgYmUgdmFsaWRhdGVkLiBJbWFnZSBtZXRhZGF0YSBtdXN0IGJlIGFuIG9iamVjdCB3aXRoIHRoZSByZXF1aXJlZCBwcm9wczogd2lkdGggKHBvc2l0aXZlIG51bWJlciksIGhlaWdodCAocG9zaXRpdmUgbnVtYmVyKSBhbmQgc2hhMjU2IChzdHJpbmcgb2YgbGVuZ3RoIDY0IG9mIHRoZSBiYXNlMTYgaGFzaCkuIix2YWx1ZTpvLGZpeGVzOlsiaW1hZ2U6cmVwbGFjZS1tZXRhZGF0YSJdfV0pOnllKHt9LGksW3ttZXNzYWdlOiJDb3VsZCBub3QgdmFsaWRhdGUgSW1hZ2UgbWV0YWRhdGEuIix2YWx1ZTpvLGZpeGVzOlsiaW1hZ2U6YWRkLW1ldGFkYXRhIl19XSl9fSx7a2V5OiJhc3NlcnQiLHZhbHVlOmZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLm9wdCYmaT09bnVsbD8hMDooaT09bnVsbD92b2lkIDA6aVtSbl0pPT09ImltYWdlIiYmKGk9PW51bGw/dm9pZCAwOmlbbm5dKT09PSJmaWxlIn19LHtrZXk6Im9wdGlvbmFsIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLm9wdGlvbnMsITApfX0se2tleToic2VyaWFsaXplIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOiJpbWFnZSIsb3B0aW9uczp0aGlzLm9wdGlvbnMsb3B0OnRoaXMub3B0fX19XSksbn0oX28pLHZOPWZ1bmN0aW9uKGUpe3lvKG4sZSk7dmFyIHQ9eG8obik7ZnVuY3Rpb24gbihyKXt2YXIgaSxvPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtyZXR1cm4gbHIodGhpcyxuKSxpPXQuY2FsbCh0aGlzKSxpLml0ZW09cixpLm9wdD1vLGl9cmV0dXJuIHNyKG4sW3trZXk6InZhbGlkYXRlIix2YWx1ZTpmdW5jdGlvbihpLG8pe3ZhciBsPXRoaXMscz0hMTtyZXR1cm4gdGhpcy5vcHQmJm89PW51bGw/ITE6X2UobykhPT0ib2JqZWN0Ij95ZSh7fSxpLFt7bWVzc2FnZToiRXhwZWN0ZWQgJ29iamVjdCcsIGdvdCAnIi5jb25jYXQoX2UobyksIiciKX1dKTpBcnJheS5pc0FycmF5KG8pP3llKHt9LGksW3ttZXNzYWdlOiJFeHBlY3RlZCAnb2JqZWN0JywgZ290ICdhcnJheScifV0pOihPYmplY3QuZW50cmllcyhvKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciB1PUppKGEsMiksYz11WzBdLGQ9dVsxXSxmPWVyKGksYyk7aWYoIWYpcz1sLmFwcGVuZFZhbGlkYXRpb25FcnJvcihzLGksIkludGVybmFsIGVycm9yOiBjb3VsZCBub3QgY3JlYXRlIHBhdGggYXQgIi5jb25jYXQoIWkmJnR5cGVvZiBpPT0ic3RyaW5nIj8iPGVtcHR5IHN0cmluZz4iOmksIiBhdCBrZXkgIikuY29uY2F0KGQpLG8pO2Vsc2V7dmFyIGg9bC5pdGVtLnZhbGlkYXRlKGYsZCk7aCYmcz9zPWFzKGFzKHt9LGgpLHMpOmgmJihzPWgpfX0pLHMpfX0se2tleToiYXNzZXJ0Iix2YWx1ZTpmdW5jdGlvbihpKXtpZih0aGlzLm9wdCYmaT09bnVsbClyZXR1cm4hMDtpZighaSlyZXR1cm4hMTtmb3IodmFyIG89MCxsPU9iamVjdC5lbnRyaWVzKGkpO288bC5sZW5ndGg7bysrKXt2YXIgcz1KaShsW29dLDIpLGE9c1sxXTtpZighdGhpcy5pdGVtLmFzc2VydChhKSlyZXR1cm4hMX1yZXR1cm4gX2UoaSk9PT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkoaSl9fSx7a2V5OiJvcHRpb25hbCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcy5pdGVtLCEwKX19LHtrZXk6InNlcmlhbGl6ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToicmVjb3JkIixpdGVtOnRoaXMuaXRlbS5zZXJpYWxpemUoKSxvcHQ6dGhpcy5vcHR9fX1dKSxufShfbyk7ZnVuY3Rpb24geU4oZSl7dmFyIHQ9ZVtPdF07aWYodCBpbnN0YW5jZW9mIFpnKXRocm93IEVycm9yKCJDYW5ub3QgZ2V0IHJhdyBzb3VyY2Ugb2YgYW4gRXhwciIpO3ZhciBuPXQ7cmV0dXJuIG59ZnVuY3Rpb24geE4oZSl7cmV0dXJuIGUuaW5kZXhPZigiLiIpPT09LTE/W2UsIiJdOltlLnNsaWNlKDAsZS5pbmRleE9mKCIuIikpLGUuc2xpY2UoZS5pbmRleE9mKCIuIikrMSldfWZ1bmN0aW9uIF9OKGUpe3JldHVybiBlIGluc3RhbmNlb2YgS3d8fF9lKGUpPT09Im9iamVjdCImJiJ0eXBlImluIGUmJmUudHlwZT09PSJvYmplY3QifWZ1bmN0aW9uIHdOKGUpe3JldHVybiBlIGluc3RhbmNlb2Ygdk58fF9lKGUpPT09Im9iamVjdCImJiJ0eXBlImluIGUmJmUudHlwZT09PSJyZWNvcmQifWZ1bmN0aW9uIFNOKGUpe3JldHVybiBlIGluc3RhbmNlb2YgaE58fF9lKGUpPT09Im9iamVjdCImJiJ0eXBlImluIGUmJmUudHlwZT09PSJhcnJheSJ9ZnVuY3Rpb24gRU4oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBwTnx8X2UoZSk9PT0ib2JqZWN0IiYmInR5cGUiaW4gZSYmZS50eXBlPT09InVuaW9uIn1mdW5jdGlvbiBDTihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIG1OfHxfZShlKT09PSJvYmplY3QiJiYidHlwZSJpbiBlJiZlLnR5cGU9PT0icmljaHRleHQifWZ1bmN0aW9uIGtOKGUpe3JldHVybiBlIGluc3RhbmNlb2YgZ058fF9lKGUpPT09Im9iamVjdCImJiJ0eXBlImluIGUmJmUudHlwZT09PSJpbWFnZSJ9ZnVuY3Rpb24gJE4oZSx0LG4pe2Zvcih2YXIgcj1iTihlKSxpPUJ3KHIpLG89bixsPXQscz1mdW5jdGlvbigpe3ZhciBjPXIuc2hpZnQoKTtpZihjPT09dm9pZCAwKXRocm93IEVycm9yKCJVbmV4cGVjdGVkIHVuZGVmaW5lZCBwYXJ0Iik7aWYoU04obykpe2lmKE51bWJlci5pc05hTihOdW1iZXIoYykpKXRocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6IGFycmF5IHNjaGVtYSAiLmNvbmNhdChKU09OLnN0cmluZ2lmeShvKSwiIG11c3QgaGF2ZSBhIG51bWJlciBhcyBwYXRoLCBidXQgZ290ICIpLmNvbmNhdChjLCIuIFBhdGg6ICIpLmNvbmNhdChlKSk7aWYoX2UobCkhPT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkobCkpdGhyb3cgRXJyb3IoIlNjaGVtYSB0eXBlIGVycm9yOiBleHBlY3RlZCBzb3VyY2UgdG8gYmUgdHlwZSBvZiBhcnJheSwgYnV0IGdvdCAiLmNvbmNhdChfZShsKSkpO2lmKCFsW2NdKXt2YXIgZDt0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiBhcnJheSBzb3VyY2UgKGxlbmd0aDogIi5jb25jYXQoKGQ9bCk9PT1udWxsfHxkPT09dm9pZCAwP3ZvaWQgMDpkLmxlbmd0aCwiKSBkaWQgbm90IGhhdmUgaW5kZXggIikuY29uY2F0KGMsIiBmcm9tIHBhdGg6ICIpLmNvbmNhdChlKSl9bD1sW2NdLG89by5pdGVtfWVsc2UgaWYod04obykpe2lmKHR5cGVvZiBjIT0ic3RyaW5nIil0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiByZWNvcmQgc2NoZW1hICIuY29uY2F0KG8sIiBtdXN0IGhhdmUgcGF0aDogIikuY29uY2F0KGMsIiBhcyBzdHJpbmciKSk7aWYoX2UobCkhPT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkobCkpdGhyb3cgRXJyb3IoIlNjaGVtYSB0eXBlIGVycm9yOiBleHBlY3RlZCBzb3VyY2UgdG8gYmUgdHlwZSBvZiByZWNvcmQsIGJ1dCBnb3QgIi5jb25jYXQoX2UobCkpKTtpZighbFtjXSl0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiByZWNvcmQgc291cmNlIGRpZCBub3QgaGF2ZSBrZXkgIi5jb25jYXQoYywiIGZyb20gcGF0aDogIikuY29uY2F0KGUpKTtsPWxbY10sbz1vLml0ZW19ZWxzZSBpZihfTihvKSl7aWYoX2UobCkhPT0ib2JqZWN0Iil0aHJvdyBFcnJvcigiU2NoZW1hIHR5cGUgZXJyb3I6IGV4cGVjdGVkIHNvdXJjZSB0byBiZSB0eXBlIG9mIG9iamVjdCwgYnV0IGdvdCAiLmNvbmNhdChfZShsKSkpO2lmKCFsW2NdKXRocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6IG9iamVjdCBzb3VyY2UgZGlkIG5vdCBoYXZlIGtleSAiLmNvbmNhdChjLCIgZnJvbSBwYXRoOiAiKS5jb25jYXQoZSkpO2w9bFtjXSxvPW8uaXRlbXNbY119ZWxzZXtpZihrTihvKSlyZXR1cm57djp7cGF0aDppLnNsaWNlKDAsaS5sZW5ndGgtci5sZW5ndGgtMSkubWFwKGZ1bmN0aW9uKGcpe3JldHVybiBKU09OLnN0cmluZ2lmeShnKX0pLmpvaW4oIi4iKSxzY2hlbWE6byxzb3VyY2U6bH19O2lmKEVOKG8pKXt2YXIgZj1vLmtleTtpZighZilyZXR1cm57djp7cGF0aDppLm1hcChmdW5jdGlvbihnKXtyZXR1cm4gTnVtYmVyLmlzTmFOKE51bWJlcihnKSk/SlNPTi5zdHJpbmdpZnkoZyk6Z30pLmpvaW4oIi4iKSxzY2hlbWE6byxzb3VyY2U6bH19O3ZhciBoPWxbZl07aWYoIWgpdGhyb3cgRXJyb3IoIkludmFsaWQgcGF0aDogdW5pb24gc291cmNlICIuY29uY2F0KG8sIiBkaWQgbm90IGhhdmUgcmVxdWlyZWQga2V5ICIpLmNvbmNhdChmLCIgaW4gcGF0aDogIikuY29uY2F0KGUpKTt2YXIgbT1vLml0ZW1zLmZpbmQoZnVuY3Rpb24oZyl7dmFyIHc7cmV0dXJuKGc9PW51bGx8fCh3PWcuaXRlbXMpPT09bnVsbHx8dz09PXZvaWQgMHx8KHc9d1tmXSk9PT1udWxsfHx3PT09dm9pZCAwP3ZvaWQgMDp3LnZhbHVlKT09PWh9KTtpZighbSl0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiB1bmlvbiBzY2hlbWEgIi5jb25jYXQobywiIGRpZCBub3QgaGF2ZSBhIGNoaWxkIG9iamVjdCB3aXRoICIpLmNvbmNhdChmLCIgb2YgdmFsdWUgIikuY29uY2F0KGgsIiBpbiBwYXRoOiAiKS5jb25jYXQoZSkpO289bS5pdGVtc1tjXSxsPWxbY119ZWxzZXtpZihDTihvKSlyZXR1cm57djp7cGF0aDppLnNsaWNlKDAsaS5sZW5ndGgtci5sZW5ndGgtMSkubWFwKGZ1bmN0aW9uKGcpe3JldHVybiBKU09OLnN0cmluZ2lmeShnKX0pLmpvaW4oIi4iKSxzY2hlbWE6byxzb3VyY2U6bH19O3Rocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6ICIuY29uY2F0KGMsIiByZXNvbHZlZCB0byBhbiB1bmV4cGVjdGVkIHNjaGVtYSAiKS5jb25jYXQoSlNPTi5zdHJpbmdpZnkobykpKX19fSxhO3IubGVuZ3RoPjA7KWlmKGE9cygpLGEpcmV0dXJuIGEudjtpZihyLmxlbmd0aD4wKXRocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6ICIuY29uY2F0KHIuam9pbigiLiIpLCIgaXMgbm90IGEgdmFsaWQgcGF0aCIpKTtyZXR1cm57cGF0aDppLm1hcChmdW5jdGlvbih1KXtyZXR1cm4gTnVtYmVyLmlzTmFOKE51bWJlcih1KSk/SlNPTi5zdHJpbmdpZnkodSk6dX0pLmpvaW4oIi4iKSxzY2hlbWE6byxzb3VyY2U6bH19ZnVuY3Rpb24gYk4oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoOyl7dmFyIHI9IiI7aWYoZVtuXT09PSciJyl7Zm9yKG4rKztuPGUubGVuZ3RoJiZlW25dIT09JyInOyllW25dPT09IlxcIiYmZVtuKzFdPT09JyInPyhyKz0nIicsbisrKTpyKz1lW25dLG4rKztpZihlW25dIT09JyInKXt2YXIgaTt0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgKCIuY29uY2F0KEpTT04uc3RyaW5naWZ5KGUpLCIpOiBNaXNzaW5nIGNsb3NpbmcgZG91YmxlIHF1b3RlOiAiKS5jb25jYXQoKGk9ZVtuXSkhPT1udWxsJiZpIT09dm9pZCAwP2k6ImF0IGVuZCBvZiBzdHJpbmciLCIgKGNoYXI6ICIpLmNvbmNhdChuLCI7IGxlbmd0aDogIikuY29uY2F0KGUubGVuZ3RoLCIpIikpfX1lbHNlIGZvcig7bjxlLmxlbmd0aCYmZVtuXSE9PSIuIjspcis9ZVtuXSxuKys7ciE9PSIiJiZ0LnB1c2gociksbisrfXJldHVybiB0fWZ1bmN0aW9uIFROKGUpe3JldHVybiBadyhPTihlKSl9ZnVuY3Rpb24gTk4oZSl7cmV0dXJuIHFpKGUpP19lKGVbT3RdKT09PSJvYmplY3QiJiZlW090XSE9PW51bGwmJkFycmF5LmlzQXJyYXkoZVtPdF0pOkFycmF5LmlzQXJyYXkoZSl9ZnVuY3Rpb24gUk4oZSl7cmV0dXJuIHFpKGUpP19lKGVbT3RdKT09PSJvYmplY3QiJiZlW090XSE9PW51bGwmJiFBcnJheS5pc0FycmF5KGVbT3RdKTpfZShlKT09PSJvYmplY3QifWZ1bmN0aW9uIE9OKGUpe3ZhciB0PU10KGUpO2Z1bmN0aW9uIG4ocil7dmFyIGk9Tk4ociksbz1STihyKTtpZihpKXt2YXIgbD1PdCBpbiByP3JbT3RdOnIscz1wbiBpbiByP3JbcG5dOnZvaWQgMDtyZXR1cm57dmFsOmwubWFwKGZ1bmN0aW9uKGMsZCl7cmV0dXJuIG4ocWkoYyk/YzpNdChjLGVyKHMsZCkpKX0pLHZhbFBhdGg6c319ZWxzZSBpZihvKXt2YXIgYT1PdCBpbiByP3JbT3RdOnIsdT1wbiBpbiByP3JbcG5dOnZvaWQgMDtyZXR1cm57dmFsOmEhPT1udWxsJiZPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYSkubWFwKGZ1bmN0aW9uKGMpe3ZhciBkPUppKGMsMiksZj1kWzBdLGg9ZFsxXTtyZXR1cm5bZixuKHFpKGgpP2g6TXQoaCxlcih1LGYpKSldfSkpLHZhbFBhdGg6dX19ZWxzZSByZXR1cm4gcWkocik/e3ZhbDpuKHJbT3RdKSx2YWxQYXRoOnJbcG5dfTpyfXJldHVybiBuKHQpfWZ1bmN0aW9uIEtwKGUpe3ZhciB0PUh3KGUpP2UudmFsOmU7c3dpdGNoKF9lKHQpKXtjYXNlImZ1bmN0aW9uIjpjYXNlInN5bWJvbCI6dGhyb3cgRXJyb3IoIkludmFsaWQgdmFsIHR5cGU6ICIuY29uY2F0KF9lKHQpKSk7Y2FzZSJvYmplY3QiOnJldHVybiB0PT09bnVsbD9udWxsOkFycmF5LmlzQXJyYXkodCk/dC5tYXAoS3ApOk9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0KS5tYXAoZnVuY3Rpb24obil7dmFyIHI9SmkobiwyKSxpPXJbMF0sbz1yWzFdO3JldHVybltpLG8mJktwKG8pXX0pKTtkZWZhdWx0OnJldHVybiB0fX1mdW5jdGlvbiBadyhlKXt2YXIgdD1lLnZhbDtzd2l0Y2goX2UodCkpe2Nhc2UiZnVuY3Rpb24iOmNhc2Uic3ltYm9sIjp0aHJvdyBFcnJvcigiSW52YWxpZCB2YWwgdHlwZTogIi5jb25jYXQoX2UodCkpKTtjYXNlIm9iamVjdCI6aWYodCE9PW51bGwpcmV0dXJuIG5ldyBQcm94eSh0LHtoYXM6ZnVuY3Rpb24ocixpKXtyZXR1cm4gaT09PSJ2YWwifHxpPT09cG4/ITA6UzAocixpKX0sZ2V0OmZ1bmN0aW9uKHIsaSl7aWYoaT09PXBuKXJldHVybiBlLnZhbFBhdGg7aWYoaT09PSJ2YWwiKXJldHVybiBLcChlKTtpZihBcnJheS5pc0FycmF5KHIpJiZpPT09Imxlbmd0aCIpcmV0dXJuIHIubGVuZ3RoO2lmKFMwKHQsaSkpe3ZhciBvLGw7cmV0dXJuIFp3KHt2YWw6UmVmbGVjdC5nZXQocixpKS52YWwsdmFsUGF0aDoobz0obD1SZWZsZWN0LmdldChyLGkpKT09PW51bGx8fGw9PT12b2lkIDA/dm9pZCAwOmwudmFsUGF0aCkhPT1udWxsJiZvIT09dm9pZCAwP286ZXIoZS52YWxQYXRoLEFycmF5LmlzQXJyYXkocik/TnVtYmVyKGkpOmkpfSl9cmV0dXJuIFJlZmxlY3QuZ2V0KHIsaSl9fSk7ZGVmYXVsdDpyZXR1cm4geWUoeWUoe30scG4sZS52YWxQYXRoKSwidmFsIixlLnZhbCl9fWZ1bmN0aW9uIFMwKGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfXZhciBQTj1bMTExNjM1MjQwOCwxODk5NDQ3NDQxLC0xMjQ1NjQzODI1LC0zNzM5NTc3MjMsOTYxOTg3MTYzLDE1MDg5NzA5OTMsLTE4NDEzMzE1NDgsLTE0MjQyMDQwNzUsLTY3MDU4NjIxNiwzMTA1OTg0MDEsNjA3MjI1Mjc4LDE0MjY4ODE5ODcsMTkyNTA3ODM4OCwtMjEzMjg4OTA5MCwtMTY4MDA3OTE5MywtMTA0Njc0NDcxNiwtNDU5NTc2ODk1LC0yNzI3NDI1MjIsMjY0MzQ3MDc4LDYwNDgwNzYyOCw3NzAyNTU5ODMsMTI0OTE1MDEyMiwxNTU1MDgxNjkyLDE5OTYwNjQ5ODYsLTE3NDA3NDY0MTQsLTE0NzMxMzI5NDcsLTEzNDE5NzA0ODgsLTEwODQ2NTM2MjUsLTk1ODM5NTQwNSwtNzEwNDM4NTg1LDExMzkyNjk5MywzMzgyNDE4OTUsNjY2MzA3MjA1LDc3MzUyOTkxMiwxMjk0NzU3MzcyLDEzOTYxODIyOTEsMTY5NTE4MzcwMCwxOTg2NjYxMDUxLC0yMTE3OTQwOTQ2LC0xODM4MDExMjU5LC0xNTY0NDgxMzc1LC0xNDc0NjY0ODg1LC0xMDM1MjM2NDk2LC05NDkyMDI1MjUsLTc3ODkwMTQ3OSwtNjk0NjE0NDkyLC0yMDAzOTUzODcsMjc1NDIzMzQ0LDQzMDIyNzczNCw1MDY5NDg2MTYsNjU5MDYwNTU2LDg4Mzk5Nzg3Nyw5NTgxMzk1NzEsMTMyMjgyMjIxOCwxNTM3MDAyMDYzLDE3NDc4NzM3NzksMTk1NTU2MjIyMiwyMDI0MTA0ODE1LC0yMDY3MjM2ODQ0LC0xOTMzMTE0ODcyLC0xODY2NTMwODIyLC0xNTM4MjMzMTA5LC0xMDkwOTM1ODE3LC05NjU2NDE5OThdLFZlPWZ1bmN0aW9uKGUpe3JldHVybiBlW2UuaW5wdXRCeXRlcz02NF09ImlucHV0Qnl0ZXMiLGVbZS5pbnB1dFdvcmRzPTE2XT0iaW5wdXRXb3JkcyIsZVtlLmhpZ2hJbmRleD0xNF09ImhpZ2hJbmRleCIsZVtlLmxvd0luZGV4PTE1XT0ibG93SW5kZXgiLGVbZS53b3JrV29yZHM9NjRdPSJ3b3JrV29yZHMiLGVbZS5hbGxvY0J5dGVzPTgwXT0iYWxsb2NCeXRlcyIsZVtlLmFsbG9jV29yZHM9MjBdPSJhbGxvY1dvcmRzIixlW2UuYWxsb2NUb3RhbD04ZTNdPSJhbGxvY1RvdGFsIixlfShWZXx8e30pLEUwPXtzaGEyNTY6MX07ZnVuY3Rpb24gQU4oZSl7aWYoZSYmIUUwW2VdJiYhRTBbZS50b0xvd2VyQ2FzZSgpXSl0aHJvdyBuZXcgRXJyb3IoIkRpZ2VzdCBtZXRob2Qgbm90IHN1cHBvcnRlZCIpO3JldHVybiBuZXcgTU59dmFyIE1OPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe2xyKHRoaXMsZSkseWUodGhpcywiQSIsMTc3OTAzMzcwMykseWUodGhpcywiQiIsLTExNTA4MzMwMTkpLHllKHRoaXMsIkMiLDEwMTM5MDQyNDIpLHllKHRoaXMsIkQiLC0xNTIxNDg2NTM0KSx5ZSh0aGlzLCJFIiwxMzU5ODkzMTE5KSx5ZSh0aGlzLCJGIiwtMTY5NDE0NDM3MikseWUodGhpcywiRyIsNTI4NzM0NjM1KSx5ZSh0aGlzLCJIIiwxNTQxNDU5MjI1KSx5ZSh0aGlzLCJfc2l6ZSIsMCkseWUodGhpcywiX3NwIiwwKSwoIWZjfHxZcz49VmUuYWxsb2NUb3RhbCkmJihmYz1uZXcgQXJyYXlCdWZmZXIoVmUuYWxsb2NUb3RhbCksWXM9MCksdGhpcy5fYnl0ZT1uZXcgVWludDhBcnJheShmYyxZcyxWZS5hbGxvY0J5dGVzKSx0aGlzLl93b3JkPW5ldyBJbnQzMkFycmF5KGZjLFlzLFZlLmFsbG9jV29yZHMpLFlzKz1WZS5hbGxvY0J5dGVzfXJldHVybiBzcihlLFt7a2V5OiJ1cGRhdGUiLHZhbHVlOmZ1bmN0aW9uKG4pe2lmKHR5cGVvZiBuPT0ic3RyaW5nIilyZXR1cm4gdGhpcy5fdXRmOChuKTtpZihuPT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgdHlwZTogIitfZShuKSk7dmFyIHI9bi5ieXRlT2Zmc2V0LGk9bi5ieXRlTGVuZ3RoLG89aS9WZS5pbnB1dEJ5dGVzfDAsbD0wO2lmKG8mJiEociYzKSYmISh0aGlzLl9zaXplJVZlLmlucHV0Qnl0ZXMpKXtmb3IodmFyIHM9bmV3IEludDMyQXJyYXkobi5idWZmZXIscixvKlZlLmlucHV0V29yZHMpO28tLTspdGhpcy5faW50MzIocyxsPj4yKSxsKz1WZS5pbnB1dEJ5dGVzO3RoaXMuX3NpemUrPWx9dmFyIGE9bi5CWVRFU19QRVJfRUxFTUVOVDtpZihhIT09MSYmbi5idWZmZXIpe3ZhciB1PW5ldyBVaW50OEFycmF5KG4uYnVmZmVyLHIrbCxpLWwpO3JldHVybiB0aGlzLl91aW50OCh1KX1yZXR1cm4gbD09PWk/dGhpczp0aGlzLl91aW50OChuLGwpfX0se2tleToiX3VpbnQ4Iix2YWx1ZTpmdW5jdGlvbihuLHIpe3ZhciBpPXRoaXMuX2J5dGUsbz10aGlzLl93b3JkLGw9bi5sZW5ndGg7Zm9yKHI9cnwwO3I8bDspe2Zvcih2YXIgcz10aGlzLl9zaXplJVZlLmlucHV0Qnl0ZXMsYT1zO3I8bCYmYTxWZS5pbnB1dEJ5dGVzOylpW2ErK109bltyKytdO2E+PVZlLmlucHV0Qnl0ZXMmJnRoaXMuX2ludDMyKG8pLHRoaXMuX3NpemUrPWEtc31yZXR1cm4gdGhpc319LHtrZXk6Il91dGY4Iix2YWx1ZTpmdW5jdGlvbihuKXtmb3IodmFyIHI9dGhpcy5fYnl0ZSxpPXRoaXMuX3dvcmQsbz1uLmxlbmd0aCxsPXRoaXMuX3NwLHM9MDtzPG87KXtmb3IodmFyIGE9dGhpcy5fc2l6ZSVWZS5pbnB1dEJ5dGVzLHU9YTtzPG8mJnU8VmUuaW5wdXRCeXRlczspe3ZhciBjPW4uY2hhckNvZGVBdChzKyspfDA7YzwxMjg/clt1KytdPWM6YzwyMDQ4PyhyW3UrK109MTkyfGM+Pj42LHJbdSsrXT0xMjh8YyY2Myk6Yzw1NTI5Nnx8Yz41NzM0Mz8oclt1KytdPTIyNHxjPj4+MTIsclt1KytdPTEyOHxjPj4+NiY2MyxyW3UrK109MTI4fGMmNjMpOmw/KGM9KChsJjEwMjMpPDwxMCkrKGMmMTAyMykrNjU1MzYsclt1KytdPTI0MHxjPj4+MTgsclt1KytdPTEyOHxjPj4+MTImNjMsclt1KytdPTEyOHxjPj4+NiY2MyxyW3UrK109MTI4fGMmNjMsbD0wKTpsPWN9dT49VmUuaW5wdXRCeXRlcyYmKHRoaXMuX2ludDMyKGkpLGlbMF09aVtWZS5pbnB1dFdvcmRzXSksdGhpcy5fc2l6ZSs9dS1hfXJldHVybiB0aGlzLl9zcD1sLHRoaXN9fSx7a2V5OiJfaW50MzIiLHZhbHVlOmZ1bmN0aW9uKG4scil7dmFyIGk9dGhpcy5BLG89dGhpcy5CLGw9dGhpcy5DLHM9dGhpcy5ELGE9dGhpcy5FLHU9dGhpcy5GLGM9dGhpcy5HLGQ9dGhpcy5ILGY9MDtmb3Iocj1yfDA7ZjxWZS5pbnB1dFdvcmRzOylrb1tmKytdPWZyKG5bcisrXSk7Zm9yKGY9VmUuaW5wdXRXb3JkcztmPFZlLndvcmtXb3JkcztmKyspa29bZl09VU4oa29bZi0yXSkra29bZi03XStCTihrb1tmLTE1XSkra29bZi0xNl18MDtmb3IoZj0wO2Y8VmUud29ya1dvcmRzO2YrKyl7dmFyIGg9ZCtGTihhKStJTihhLHUsYykrUE5bZl0ra29bZl18MCxtPXpOKGkpK2pOKGksbyxsKXwwO2Q9YyxjPXUsdT1hLGE9cytofDAscz1sLGw9byxvPWksaT1oK218MH10aGlzLkE9aSt0aGlzLkF8MCx0aGlzLkI9byt0aGlzLkJ8MCx0aGlzLkM9bCt0aGlzLkN8MCx0aGlzLkQ9cyt0aGlzLkR8MCx0aGlzLkU9YSt0aGlzLkV8MCx0aGlzLkY9dSt0aGlzLkZ8MCx0aGlzLkc9Yyt0aGlzLkd8MCx0aGlzLkg9ZCt0aGlzLkh8MH19LHtrZXk6ImRpZ2VzdCIsdmFsdWU6ZnVuY3Rpb24obil7dmFyIHI9dGhpcy5fYnl0ZSxpPXRoaXMuX3dvcmQsbz10aGlzLl9zaXplJVZlLmlucHV0Qnl0ZXN8MDtmb3IocltvKytdPTEyODtvJjM7KXJbbysrXT0wO2lmKG8+Pj0yLG8+VmUuaGlnaEluZGV4KXtmb3IoO288VmUuaW5wdXRXb3JkczspaVtvKytdPTA7bz0wLHRoaXMuX2ludDMyKGkpfWZvcig7bzxWZS5pbnB1dFdvcmRzOylpW28rK109MDt2YXIgbD10aGlzLl9zaXplKjgscz0obCY0Mjk0OTY3Mjk1KT4+PjAsYT0obC1zKS80Mjk0OTY3Mjk2O3JldHVybiBhJiYoaVtWZS5oaWdoSW5kZXhdPWZyKGEpKSxzJiYoaVtWZS5sb3dJbmRleF09ZnIocykpLHRoaXMuX2ludDMyKGkpLG49PT0iaGV4Ij90aGlzLl9oZXgoKTp0aGlzLl9iaW4oKX19LHtrZXk6Il9oZXgiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIG49dGhpcy5BLHI9dGhpcy5CLGk9dGhpcy5DLG89dGhpcy5ELGw9dGhpcy5FLHM9dGhpcy5GLGE9dGhpcy5HLHU9dGhpcy5IO3JldHVybiBiaShuKStiaShyKStiaShpKStiaShvKStiaShsKStiaShzKStiaShhKStiaSh1KX19LHtrZXk6Il9iaW4iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIG49dGhpcy5BLHI9dGhpcy5CLGk9dGhpcy5DLG89dGhpcy5ELGw9dGhpcy5FLHM9dGhpcy5GLGE9dGhpcy5HLHU9dGhpcy5ILGM9dGhpcy5fYnl0ZSxkPXRoaXMuX3dvcmQ7cmV0dXJuIGRbMF09ZnIobiksZFsxXT1mcihyKSxkWzJdPWZyKGkpLGRbM109ZnIobyksZFs0XT1mcihsKSxkWzVdPWZyKHMpLGRbNl09ZnIoYSksZFs3XT1mcih1KSxjLnNsaWNlKDAsMzIpfX1dKSxlfSgpLGtvPW5ldyBJbnQzMkFycmF5KFZlLndvcmtXb3JkcyksZmMsWXM9MCxiaT1mdW5jdGlvbih0KXtyZXR1cm4odCs0Mjk0OTY3Mjk2KS50b1N0cmluZygxNikuc3Vic3RyKC04KX0sRE49ZnVuY3Rpb24odCl7cmV0dXJuIHQ8PDI0JjQyNzgxOTAwODB8dDw8OCYxNjcxMTY4MHx0Pj44JjY1MjgwfHQ+PjI0JjI1NX0sTE49ZnVuY3Rpb24odCl7cmV0dXJuIHR9LGZyPVdOKCk/TE46RE4sSU49ZnVuY3Rpb24odCxuLHIpe3JldHVybiByXnQmKG5ecil9LGpOPWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdCZufHImKHR8bil9LHpOPWZ1bmN0aW9uKHQpe3JldHVybih0Pj4+Mnx0PDwzMCleKHQ+Pj4xM3x0PDwxOSleKHQ+Pj4yMnx0PDwxMCl9LEZOPWZ1bmN0aW9uKHQpe3JldHVybih0Pj4+Nnx0PDwyNileKHQ+Pj4xMXx0PDwyMSleKHQ+Pj4yNXx0PDw3KX0sQk49ZnVuY3Rpb24odCl7cmV0dXJuKHQ+Pj43fHQ8PDI1KV4odD4+PjE4fHQ8PDE0KV50Pj4+M30sVU49ZnVuY3Rpb24odCl7cmV0dXJuKHQ+Pj4xN3x0PDwxNSleKHQ+Pj4xOXx0PDwxMyledD4+PjEwfTtmdW5jdGlvbiBXTigpe3ZhciBlPW5ldyBVaW50OEFycmF5KG5ldyBVaW50MTZBcnJheShbNjUyNzldKS5idWZmZXIpO3JldHVybiBlWzBdPT09MjU0fXZhciBWTj1mdW5jdGlvbih0KXtyZXR1cm4gQU4oKS51cGRhdGUodCkuZGlnZXN0KCJoZXgiKX07ZnVuY3Rpb24gZXUoKXtldT1mdW5jdGlvbigpe3JldHVybiB0fTt2YXIgZSx0PXt9LG49T2JqZWN0LnByb3RvdHlwZSxyPW4uaGFzT3duUHJvcGVydHksaT1PYmplY3QuZGVmaW5lUHJvcGVydHl8fGZ1bmN0aW9uKE8sQSxrKXtPW0FdPWsudmFsdWV9LG89dHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIj9TeW1ib2w6e30sbD1vLml0ZXJhdG9yfHwiQEBpdGVyYXRvciIscz1vLmFzeW5jSXRlcmF0b3J8fCJAQGFzeW5jSXRlcmF0b3IiLGE9by50b1N0cmluZ1RhZ3x8IkBAdG9TdHJpbmdUYWciO2Z1bmN0aW9uIHUoTyxBLGspe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoTyxBLHt2YWx1ZTprLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSksT1tBXX10cnl7dSh7fSwiIil9Y2F0Y2h7dT1mdW5jdGlvbihBLGssail7cmV0dXJuIEFba109an19ZnVuY3Rpb24gYyhPLEEsayxqKXt2YXIgST1BJiZBLnByb3RvdHlwZSBpbnN0YW5jZW9mIHY/QTp2LFo9T2JqZWN0LmNyZWF0ZShJLnByb3RvdHlwZSksbmU9bmV3IFYoanx8W10pO3JldHVybiBpKFosIl9pbnZva2UiLHt2YWx1ZTpSKE8sayxuZSl9KSxafWZ1bmN0aW9uIGQoTyxBLGspe3RyeXtyZXR1cm57dHlwZToibm9ybWFsIixhcmc6Ty5jYWxsKEEsayl9fWNhdGNoKGope3JldHVybnt0eXBlOiJ0aHJvdyIsYXJnOmp9fX10LndyYXA9Yzt2YXIgZj0ic3VzcGVuZGVkU3RhcnQiLGg9InN1c3BlbmRlZFlpZWxkIixtPSJleGVjdXRpbmciLGc9ImNvbXBsZXRlZCIsdz17fTtmdW5jdGlvbiB2KCl7fWZ1bmN0aW9uIHkoKXt9ZnVuY3Rpb24gXygpe312YXIgUz17fTt1KFMsbCxmdW5jdGlvbigpe3JldHVybiB0aGlzfSk7dmFyIEU9T2JqZWN0LmdldFByb3RvdHlwZU9mLCQ9RSYmRShFKEsoW10pKSk7JCYmJCE9PW4mJnIuY2FsbCgkLGwpJiYoUz0kKTt2YXIgQz1fLnByb3RvdHlwZT12LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFMpO2Z1bmN0aW9uIFQoTyl7WyJuZXh0IiwidGhyb3ciLCJyZXR1cm4iXS5mb3JFYWNoKGZ1bmN0aW9uKEEpe3UoTyxBLGZ1bmN0aW9uKGspe3JldHVybiB0aGlzLl9pbnZva2UoQSxrKX0pfSl9ZnVuY3Rpb24gTihPLEEpe2Z1bmN0aW9uIGsoSSxaLG5lLGtlKXt2YXIgdmU9ZChPW0ldLE8sWik7aWYodmUudHlwZSE9PSJ0aHJvdyIpe3ZhciBXZT12ZS5hcmcsRmU9V2UudmFsdWU7cmV0dXJuIEZlJiZ0eXBlb2YgRmU9PSJvYmplY3QiJiZyLmNhbGwoRmUsIl9fYXdhaXQiKT9BLnJlc29sdmUoRmUuX19hd2FpdCkudGhlbihmdW5jdGlvbih0ZSl7aygibmV4dCIsdGUsbmUsa2UpfSxmdW5jdGlvbih0ZSl7aygidGhyb3ciLHRlLG5lLGtlKX0pOkEucmVzb2x2ZShGZSkudGhlbihmdW5jdGlvbih0ZSl7V2UudmFsdWU9dGUsbmUoV2UpfSxmdW5jdGlvbih0ZSl7cmV0dXJuIGsoInRocm93Iix0ZSxuZSxrZSl9KX1rZSh2ZS5hcmcpfXZhciBqO2kodGhpcywiX2ludm9rZSIse3ZhbHVlOmZ1bmN0aW9uKEksWil7ZnVuY3Rpb24gbmUoKXtyZXR1cm4gbmV3IEEoZnVuY3Rpb24oa2UsdmUpe2soSSxaLGtlLHZlKX0pfXJldHVybiBqPWo/ai50aGVuKG5lLG5lKTpuZSgpfX0pfWZ1bmN0aW9uIFIoTyxBLGspe3ZhciBqPWY7cmV0dXJuIGZ1bmN0aW9uKEksWil7aWYoaj09PW0pdGhyb3cgbmV3IEVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nIik7aWYoaj09PWcpe2lmKEk9PT0idGhyb3ciKXRocm93IFo7cmV0dXJue3ZhbHVlOmUsZG9uZTohMH19Zm9yKGsubWV0aG9kPUksay5hcmc9Wjs7KXt2YXIgbmU9ay5kZWxlZ2F0ZTtpZihuZSl7dmFyIGtlPUQobmUsayk7aWYoa2Upe2lmKGtlPT09dyljb250aW51ZTtyZXR1cm4ga2V9fWlmKGsubWV0aG9kPT09Im5leHQiKWsuc2VudD1rLl9zZW50PWsuYXJnO2Vsc2UgaWYoay5tZXRob2Q9PT0idGhyb3ciKXtpZihqPT09Zil0aHJvdyBqPWcsay5hcmc7ay5kaXNwYXRjaEV4Y2VwdGlvbihrLmFyZyl9ZWxzZSBrLm1ldGhvZD09PSJyZXR1cm4iJiZrLmFicnVwdCgicmV0dXJuIixrLmFyZyk7aj1tO3ZhciB2ZT1kKE8sQSxrKTtpZih2ZS50eXBlPT09Im5vcm1hbCIpe2lmKGo9ay5kb25lP2c6aCx2ZS5hcmc9PT13KWNvbnRpbnVlO3JldHVybnt2YWx1ZTp2ZS5hcmcsZG9uZTprLmRvbmV9fXZlLnR5cGU9PT0idGhyb3ciJiYoaj1nLGsubWV0aG9kPSJ0aHJvdyIsay5hcmc9dmUuYXJnKX19fWZ1bmN0aW9uIEQoTyxBKXt2YXIgaz1BLm1ldGhvZCxqPU8uaXRlcmF0b3Jba107aWYoaj09PWUpcmV0dXJuIEEuZGVsZWdhdGU9bnVsbCxrPT09InRocm93IiYmTy5pdGVyYXRvci5yZXR1cm4mJihBLm1ldGhvZD0icmV0dXJuIixBLmFyZz1lLEQoTyxBKSxBLm1ldGhvZD09PSJ0aHJvdyIpfHxrIT09InJldHVybiImJihBLm1ldGhvZD0idGhyb3ciLEEuYXJnPW5ldyBUeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJyIraysiJyBtZXRob2QiKSksdzt2YXIgST1kKGosTy5pdGVyYXRvcixBLmFyZyk7aWYoSS50eXBlPT09InRocm93IilyZXR1cm4gQS5tZXRob2Q9InRocm93IixBLmFyZz1JLmFyZyxBLmRlbGVnYXRlPW51bGwsdzt2YXIgWj1JLmFyZztyZXR1cm4gWj9aLmRvbmU/KEFbTy5yZXN1bHROYW1lXT1aLnZhbHVlLEEubmV4dD1PLm5leHRMb2MsQS5tZXRob2QhPT0icmV0dXJuIiYmKEEubWV0aG9kPSJuZXh0IixBLmFyZz1lKSxBLmRlbGVnYXRlPW51bGwsdyk6WjooQS5tZXRob2Q9InRocm93IixBLmFyZz1uZXcgVHlwZUVycm9yKCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdCIpLEEuZGVsZWdhdGU9bnVsbCx3KX1mdW5jdGlvbiBGKE8pe3ZhciBBPXt0cnlMb2M6T1swXX07MSBpbiBPJiYoQS5jYXRjaExvYz1PWzFdKSwyIGluIE8mJihBLmZpbmFsbHlMb2M9T1syXSxBLmFmdGVyTG9jPU9bM10pLHRoaXMudHJ5RW50cmllcy5wdXNoKEEpfWZ1bmN0aW9uIHNlKE8pe3ZhciBBPU8uY29tcGxldGlvbnx8e307QS50eXBlPSJub3JtYWwiLGRlbGV0ZSBBLmFyZyxPLmNvbXBsZXRpb249QX1mdW5jdGlvbiBWKE8pe3RoaXMudHJ5RW50cmllcz1be3RyeUxvYzoicm9vdCJ9XSxPLmZvckVhY2goRix0aGlzKSx0aGlzLnJlc2V0KCEwKX1mdW5jdGlvbiBLKE8pe2lmKE98fE89PT0iIil7dmFyIEE9T1tsXTtpZihBKXJldHVybiBBLmNhbGwoTyk7aWYodHlwZW9mIE8ubmV4dD09ImZ1bmN0aW9uIilyZXR1cm4gTztpZighaXNOYU4oTy5sZW5ndGgpKXt2YXIgaz0tMSxqPWZ1bmN0aW9uIEkoKXtmb3IoOysrazxPLmxlbmd0aDspaWYoci5jYWxsKE8saykpcmV0dXJuIEkudmFsdWU9T1trXSxJLmRvbmU9ITEsSTtyZXR1cm4gSS52YWx1ZT1lLEkuZG9uZT0hMCxJfTtyZXR1cm4gai5uZXh0PWp9fXRocm93IG5ldyBUeXBlRXJyb3IodHlwZW9mIE8rIiBpcyBub3QgaXRlcmFibGUiKX1yZXR1cm4geS5wcm90b3R5cGU9XyxpKEMsImNvbnN0cnVjdG9yIix7dmFsdWU6Xyxjb25maWd1cmFibGU6ITB9KSxpKF8sImNvbnN0cnVjdG9yIix7dmFsdWU6eSxjb25maWd1cmFibGU6ITB9KSx5LmRpc3BsYXlOYW1lPXUoXyxhLCJHZW5lcmF0b3JGdW5jdGlvbiIpLHQuaXNHZW5lcmF0b3JGdW5jdGlvbj1mdW5jdGlvbihPKXt2YXIgQT10eXBlb2YgTz09ImZ1bmN0aW9uIiYmTy5jb25zdHJ1Y3RvcjtyZXR1cm4hIUEmJihBPT09eXx8KEEuZGlzcGxheU5hbWV8fEEubmFtZSk9PT0iR2VuZXJhdG9yRnVuY3Rpb24iKX0sdC5tYXJrPWZ1bmN0aW9uKE8pe3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKE8sXyk6KE8uX19wcm90b19fPV8sdShPLGEsIkdlbmVyYXRvckZ1bmN0aW9uIikpLE8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoQyksT30sdC5hd3JhcD1mdW5jdGlvbihPKXtyZXR1cm57X19hd2FpdDpPfX0sVChOLnByb3RvdHlwZSksdShOLnByb3RvdHlwZSxzLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSx0LkFzeW5jSXRlcmF0b3I9Tix0LmFzeW5jPWZ1bmN0aW9uKE8sQSxrLGosSSl7ST09PXZvaWQgMCYmKEk9UHJvbWlzZSk7dmFyIFo9bmV3IE4oYyhPLEEsayxqKSxJKTtyZXR1cm4gdC5pc0dlbmVyYXRvckZ1bmN0aW9uKEEpP1o6Wi5uZXh0KCkudGhlbihmdW5jdGlvbihuZSl7cmV0dXJuIG5lLmRvbmU/bmUudmFsdWU6Wi5uZXh0KCl9KX0sVChDKSx1KEMsYSwiR2VuZXJhdG9yIiksdShDLGwsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLHUoQywidG9TdHJpbmciLGZ1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgR2VuZXJhdG9yXSJ9KSx0LmtleXM9ZnVuY3Rpb24oTyl7dmFyIEE9T2JqZWN0KE8pLGs9W107Zm9yKHZhciBqIGluIEEpay5wdXNoKGopO3JldHVybiBrLnJldmVyc2UoKSxmdW5jdGlvbiBJKCl7Zm9yKDtrLmxlbmd0aDspe3ZhciBaPWsucG9wKCk7aWYoWiBpbiBBKXJldHVybiBJLnZhbHVlPVosSS5kb25lPSExLEl9cmV0dXJuIEkuZG9uZT0hMCxJfX0sdC52YWx1ZXM9SyxWLnByb3RvdHlwZT17Y29uc3RydWN0b3I6VixyZXNldDpmdW5jdGlvbihPKXtpZih0aGlzLnByZXY9MCx0aGlzLm5leHQ9MCx0aGlzLnNlbnQ9dGhpcy5fc2VudD1lLHRoaXMuZG9uZT0hMSx0aGlzLmRlbGVnYXRlPW51bGwsdGhpcy5tZXRob2Q9Im5leHQiLHRoaXMuYXJnPWUsdGhpcy50cnlFbnRyaWVzLmZvckVhY2goc2UpLCFPKWZvcih2YXIgQSBpbiB0aGlzKUEuY2hhckF0KDApPT09InQiJiZyLmNhbGwodGhpcyxBKSYmIWlzTmFOKCtBLnNsaWNlKDEpKSYmKHRoaXNbQV09ZSl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLmRvbmU9ITA7dmFyIE89dGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247aWYoTy50eXBlPT09InRocm93Iil0aHJvdyBPLmFyZztyZXR1cm4gdGhpcy5ydmFsfSxkaXNwYXRjaEV4Y2VwdGlvbjpmdW5jdGlvbihPKXtpZih0aGlzLmRvbmUpdGhyb3cgTzt2YXIgQT10aGlzO2Z1bmN0aW9uIGsodmUsV2Upe3JldHVybiBaLnR5cGU9InRocm93IixaLmFyZz1PLEEubmV4dD12ZSxXZSYmKEEubWV0aG9kPSJuZXh0IixBLmFyZz1lKSwhIVdlfWZvcih2YXIgaj10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7aj49MDstLWope3ZhciBJPXRoaXMudHJ5RW50cmllc1tqXSxaPUkuY29tcGxldGlvbjtpZihJLnRyeUxvYz09PSJyb290IilyZXR1cm4gaygiZW5kIik7aWYoSS50cnlMb2M8PXRoaXMucHJldil7dmFyIG5lPXIuY2FsbChJLCJjYXRjaExvYyIpLGtlPXIuY2FsbChJLCJmaW5hbGx5TG9jIik7aWYobmUmJmtlKXtpZih0aGlzLnByZXY8SS5jYXRjaExvYylyZXR1cm4gayhJLmNhdGNoTG9jLCEwKTtpZih0aGlzLnByZXY8SS5maW5hbGx5TG9jKXJldHVybiBrKEkuZmluYWxseUxvYyl9ZWxzZSBpZihuZSl7aWYodGhpcy5wcmV2PEkuY2F0Y2hMb2MpcmV0dXJuIGsoSS5jYXRjaExvYywhMCl9ZWxzZXtpZigha2UpdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpO2lmKHRoaXMucHJldjxJLmZpbmFsbHlMb2MpcmV0dXJuIGsoSS5maW5hbGx5TG9jKX19fX0sYWJydXB0OmZ1bmN0aW9uKE8sQSl7Zm9yKHZhciBrPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtrPj0wOy0tayl7dmFyIGo9dGhpcy50cnlFbnRyaWVzW2tdO2lmKGoudHJ5TG9jPD10aGlzLnByZXYmJnIuY2FsbChqLCJmaW5hbGx5TG9jIikmJnRoaXMucHJldjxqLmZpbmFsbHlMb2Mpe3ZhciBJPWo7YnJlYWt9fUkmJihPPT09ImJyZWFrInx8Tz09PSJjb250aW51ZSIpJiZJLnRyeUxvYzw9QSYmQTw9SS5maW5hbGx5TG9jJiYoST1udWxsKTt2YXIgWj1JP0kuY29tcGxldGlvbjp7fTtyZXR1cm4gWi50eXBlPU8sWi5hcmc9QSxJPyh0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5uZXh0PUkuZmluYWxseUxvYyx3KTp0aGlzLmNvbXBsZXRlKFopfSxjb21wbGV0ZTpmdW5jdGlvbihPLEEpe2lmKE8udHlwZT09PSJ0aHJvdyIpdGhyb3cgTy5hcmc7cmV0dXJuIE8udHlwZT09PSJicmVhayJ8fE8udHlwZT09PSJjb250aW51ZSI/dGhpcy5uZXh0PU8uYXJnOk8udHlwZT09PSJyZXR1cm4iPyh0aGlzLnJ2YWw9dGhpcy5hcmc9Ty5hcmcsdGhpcy5tZXRob2Q9InJldHVybiIsdGhpcy5uZXh0PSJlbmQiKTpPLnR5cGU9PT0ibm9ybWFsIiYmQSYmKHRoaXMubmV4dD1BKSx3fSxmaW5pc2g6ZnVuY3Rpb24oTyl7Zm9yKHZhciBBPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtBPj0wOy0tQSl7dmFyIGs9dGhpcy50cnlFbnRyaWVzW0FdO2lmKGsuZmluYWxseUxvYz09PU8pcmV0dXJuIHRoaXMuY29tcGxldGUoay5jb21wbGV0aW9uLGsuYWZ0ZXJMb2MpLHNlKGspLHd9fSxjYXRjaDpmdW5jdGlvbihPKXtmb3IodmFyIEE9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO0E+PTA7LS1BKXt2YXIgaz10aGlzLnRyeUVudHJpZXNbQV07aWYoay50cnlMb2M9PT1PKXt2YXIgaj1rLmNvbXBsZXRpb247aWYoai50eXBlPT09InRocm93Iil7dmFyIEk9ai5hcmc7c2Uoayl9cmV0dXJuIEl9fXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBjYXRjaCBhdHRlbXB0Iil9LGRlbGVnYXRlWWllbGQ6ZnVuY3Rpb24oTyxBLGspe3JldHVybiB0aGlzLmRlbGVnYXRlPXtpdGVyYXRvcjpLKE8pLHJlc3VsdE5hbWU6QSxuZXh0TG9jOmt9LHRoaXMubWV0aG9kPT09Im5leHQiJiYodGhpcy5hcmc9ZSksd319LHR9ZnVuY3Rpb24gQzAoZSx0LG4scixpLG8sbCl7dHJ5e3ZhciBzPWVbb10obCksYT1zLnZhbHVlfWNhdGNoKHUpe24odSk7cmV0dXJufXMuZG9uZT90KGEpOlByb21pc2UucmVzb2x2ZShhKS50aGVuKHIsaSl9ZnVuY3Rpb24gR3coZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPWFyZ3VtZW50cztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocixpKXt2YXIgbz1lLmFwcGx5KHQsbik7ZnVuY3Rpb24gbChhKXtDMChvLHIsaSxsLHMsIm5leHQiLGEpfWZ1bmN0aW9uIHMoYSl7QzAobyxyLGksbCxzLCJ0aHJvdyIsYSl9bCh2b2lkIDApfSl9fXZhciBITj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7bHIodGhpcyxlKSx0aGlzLmhvc3Q9dH1yZXR1cm4gc3IoZSxbe2tleToiZ2V0RGlzYWJsZVVybCIsdmFsdWU6ZnVuY3Rpb24obil7cmV0dXJuIiIuY29uY2F0KHRoaXMuaG9zdCwiL2Rpc2FibGU/cmVkaXJlY3RfdG89IikuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudChuKSl9fSx7a2V5OiJnZXRMb2dpblVybCIsdmFsdWU6ZnVuY3Rpb24obil7cmV0dXJuIiIuY29uY2F0KHRoaXMuaG9zdCwiL2F1dGhvcml6ZT9yZWRpcmVjdF90bz0iKS5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KG4pKX19LHtrZXk6ImdldEVuYWJsZVVybCIsdmFsdWU6ZnVuY3Rpb24obil7cmV0dXJuIiIuY29uY2F0KHRoaXMuaG9zdCwiL2VuYWJsZT9yZWRpcmVjdF90bz0iKS5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KG4pKX19LHtrZXk6ImdldFBhdGNoZXMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9R3coZXUoKS5tYXJrKGZ1bmN0aW9uIHIoaSl7dmFyIG8sbCxzO3JldHVybiBldSgpLndyYXAoZnVuY3Rpb24odSl7Zm9yKDs7KXN3aXRjaCh1LnByZXY9dS5uZXh0KXtjYXNlIDA6cmV0dXJuIG89aS5wYXRjaElkcyxsPWkuaGVhZGVycyxzPW8/Ij8iLmNvbmNhdChvLm1hcChmdW5jdGlvbihjKXtyZXR1cm4iIi5jb25jYXQoYywiPSIpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQoYykpfSkuam9pbigiJiIpKToiIix1LmFicnVwdCgicmV0dXJuIixmZXRjaCgiIi5jb25jYXQodGhpcy5ob3N0LCIvcGF0Y2hlcy9+IikuY29uY2F0KHMpLHtoZWFkZXJzOmx8fHsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9fSkudGhlbihmdW5jdGlvbihjKXtyZXR1cm4gUXMoYyl9KS5jYXRjaChYcykpO2Nhc2UgMzpjYXNlImVuZCI6cmV0dXJuIHUuc3RvcCgpfX0scix0aGlzKX0pKTtmdW5jdGlvbiBuKHIpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gbn0oKX0se2tleToiZ2V0RWRpdFVybCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4iIi5jb25jYXQodGhpcy5ob3N0LCIvc3RhdGljL2VkaXQiKX19LHtrZXk6InBvc3RQYXRjaGVzIix2YWx1ZTpmdW5jdGlvbihuLHIsaSl7cmV0dXJuIGZldGNoKCIiLmNvbmNhdCh0aGlzLmhvc3QsIi9wYXRjaGVzL34iKSx7aGVhZGVyczppfHx7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifSxtZXRob2Q6IlBPU1QiLGJvZHk6SlNPTi5zdHJpbmdpZnkoeWUoe30sbixyKSl9KS50aGVuKGZ1bmN0aW9uKG8pe3JldHVybiBRcyhvKX0pLmNhdGNoKFhzKX19LHtrZXk6ImdldFNlc3Npb24iLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGZldGNoKCIiLmNvbmNhdCh0aGlzLmhvc3QsIi9zZXNzaW9uIikpLnRoZW4oZnVuY3Rpb24obil7cmV0dXJuIFFzKG4pLmNhdGNoKFhzKX0pfX0se2tleToiZ2V0VHJlZSIsdmFsdWU6ZnVuY3Rpb24obil7dmFyIHI9bi5wYXRjaCxpPXI9PT12b2lkIDA/ITE6cixvPW4uaW5jbHVkZVNjaGVtYSxsPW89PT12b2lkIDA/ITE6byxzPW4uaW5jbHVkZVNvdXJjZSxhPXM9PT12b2lkIDA/ITE6cyx1PW4udHJlZVBhdGgsYz11PT09dm9pZCAwPyIvIjp1LGQ9bi5oZWFkZXJzLGY9bmV3IFVSTFNlYXJjaFBhcmFtcztyZXR1cm4gZi5zZXQoInBhdGNoIixpLnRvU3RyaW5nKCkpLGYuc2V0KCJzY2hlbWEiLGwudG9TdHJpbmcoKSksZi5zZXQoInNvdXJjZSIsYS50b1N0cmluZygpKSxmZXRjaCgiIi5jb25jYXQodGhpcy5ob3N0LCIvdHJlZS9+IikuY29uY2F0KGMsIj8iKS5jb25jYXQoZi50b1N0cmluZygpKSx7aGVhZGVyczpkfSkudGhlbihmdW5jdGlvbihoKXtyZXR1cm4gUXMoaCl9KS5jYXRjaChYcyl9fSx7a2V5OiJwb3N0Q29tbWl0Iix2YWx1ZTpmdW5jdGlvbihuKXt2YXIgcj1uLnBhdGNoZXMsaT1uLmhlYWRlcnM7cmV0dXJuIGZldGNoKCIiLmNvbmNhdCh0aGlzLmhvc3QsIi9jb21taXQiKSx7bWV0aG9kOiJQT1NUIixib2R5OkpTT04uc3RyaW5naWZ5KHtwYXRjaGVzOnJ9KSxoZWFkZXJzOml8fHsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9fSkudGhlbihmdW5jdGlvbihvKXtyZXR1cm4gUXMobyl9KS5jYXRjaChYcyl9fV0pLGV9KCk7ZnVuY3Rpb24gWHMoZSl7cmV0dXJuIEJyKHtzdGF0dXNDb2RlOjUwMCxtZXNzYWdlOmUgaW5zdGFuY2VvZiBFcnJvcj9lLm1lc3NhZ2U6IlVua25vd24gZXJyb3IifSl9ZnVuY3Rpb24gUXMoZSl7cmV0dXJuIFpwLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBacCgpe3JldHVybiBacD1HdyhldSgpLm1hcmsoZnVuY3Rpb24gZSh0KXt2YXIgbjtyZXR1cm4gZXUoKS53cmFwKGZ1bmN0aW9uKGkpe2Zvcig7Oylzd2l0Y2goaS5wcmV2PWkubmV4dCl7Y2FzZSAwOmlmKGkucHJldj0wLCF0Lm9rKXtpLm5leHQ9OTticmVha31yZXR1cm4gaS50MD1qbyxpLm5leHQ9NSx0Lmpzb24oKTtjYXNlIDU6cmV0dXJuIGkudDE9aS5zZW50LGkuYWJydXB0KCJyZXR1cm4iLGkudDAub2suY2FsbChpLnQwLGkudDEpKTtjYXNlIDk6cmV0dXJuIGkucHJldj05LGkubmV4dD0xMix0Lmpzb24oKTtjYXNlIDEyOnJldHVybiBuPWkuc2VudCxpLmFicnVwdCgicmV0dXJuIixCcih7c3RhdHVzQ29kZTp0LnN0YXR1cyxtZXNzYWdlOm4ubWVzc2FnZXx8dC5zdGF0dXNUZXh0LGRldGFpbHM6bi5kZXRhaWxzfHxPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMobikuZmlsdGVyKGZ1bmN0aW9uKG8pe3ZhciBsPUppKG8sMSkscz1sWzBdO3JldHVybiBzIT09Im1lc3NhZ2UifSkpfSkpO2Nhc2UgMTY6cmV0dXJuIGkucHJldj0xNixpLnQyPWkuY2F0Y2goOSksaS5hYnJ1cHQoInJldHVybiIsQnIoe3N0YXR1c0NvZGU6dC5zdGF0dXMsbWVzc2FnZTp0LnN0YXR1c1RleHR9KSk7Y2FzZSAxOTppLm5leHQ9MjQ7YnJlYWs7Y2FzZSAyMTpyZXR1cm4gaS5wcmV2PTIxLGkudDM9aS5jYXRjaCgwKSxpLmFicnVwdCgicmV0dXJuIixCcih7bWVzc2FnZTppLnQzIGluc3RhbmNlb2YgRXJyb3I/aS50My5tZXNzYWdlOiJVbmtub3duIGVycm9yIn0pKTtjYXNlIDI0OmNhc2UiZW5kIjpyZXR1cm4gaS5zdG9wKCl9fSxlLG51bGwsW1swLDIxXSxbOSwxNl1dKX0pKSxacC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIGpuPXtjb252ZXJ0RmlsZVNvdXJjZTpWdyxnZXRTY2hlbWE6YU4sZ2V0VmFsUGF0aDpkTixnZXRWYWw6VE4sZ2V0U291cmNlOnlOLHJlc29sdmVQYXRoOiROLHNwbGl0TW9kdWxlSWRBbmRNb2R1bGVQYXRoOnhOLGlzVmFsOmNOLGNyZWF0ZVZhbFBhdGhPZkl0ZW06ZXIsZ2V0U0hBMjU2SGFzaDpWTixjcmVhdGVQYXRjaEpTT05QYXRoOmZ1bmN0aW9uKHQpe3JldHVybiIvIi5jb25jYXQodC5zcGxpdCgiLiIpLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbiYmS04obil9KS5qb2luKCIvIikpfSxWQUxfRU5BQkxFX0NPT0tJRV9OQU1FOiJ2YWxfZW5hYmxlIixWQUxfU1RBVEVfQ09PS0lFOiJ2YWxfc3RhdGUiLFZBTF9TRVNTSU9OX0NPT0tJRToidmFsX3Nlc3Npb24ifTtmdW5jdGlvbiBLTihlKXt0cnl7cmV0dXJuIEpTT04ucGFyc2UoZSl9Y2F0Y2h7cmV0dXJuIGV9fXZhciBZdz17ZXhwb3J0czp7fX07LyohCglDb3B5cmlnaHQgKGMpIDIwMTggSmVkIFdhdHNvbi4KCUxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTUlUKSwgc2VlCglodHRwOi8vamVkd2F0c29uLmdpdGh1Yi5pby9jbGFzc25hbWVzCiovKGZ1bmN0aW9uKGUpeyhmdW5jdGlvbigpe3ZhciB0PXt9Lmhhc093blByb3BlcnR5O2Z1bmN0aW9uIG4oKXtmb3IodmFyIHI9W10saT0wO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBvPWFyZ3VtZW50c1tpXTtpZihvKXt2YXIgbD10eXBlb2YgbztpZihsPT09InN0cmluZyJ8fGw9PT0ibnVtYmVyIilyLnB1c2gobyk7ZWxzZSBpZihBcnJheS5pc0FycmF5KG8pKXtpZihvLmxlbmd0aCl7dmFyIHM9bi5hcHBseShudWxsLG8pO3MmJnIucHVzaChzKX19ZWxzZSBpZihsPT09Im9iamVjdCIpe2lmKG8udG9TdHJpbmchPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nJiYhby50b1N0cmluZy50b1N0cmluZygpLmluY2x1ZGVzKCJbbmF0aXZlIGNvZGVdIikpe3IucHVzaChvLnRvU3RyaW5nKCkpO2NvbnRpbnVlfWZvcih2YXIgYSBpbiBvKXQuY2FsbChvLGEpJiZvW2FdJiZyLnB1c2goYSl9fX1yZXR1cm4gci5qb2luKCIgIil9ZS5leHBvcnRzPyhuLmRlZmF1bHQ9bixlLmV4cG9ydHM9bik6d2luZG93LmNsYXNzTmFtZXM9bn0pKCl9KShZdyk7dmFyIFpOPVl3LmV4cG9ydHM7Y29uc3Qgd2Y9VHUoWk4pO2Z1bmN0aW9uIGllKCl7cmV0dXJuIGllPU9iamVjdC5hc3NpZ24/T2JqZWN0LmFzc2lnbi5iaW5kKCk6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0saWUuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIEdOKGUsdCl7dHlwZW9mIGU9PSJmdW5jdGlvbiI/ZSh0KTplIT1udWxsJiYoZS5jdXJyZW50PXQpfWZ1bmN0aW9uIFh3KC4uLmUpe3JldHVybiB0PT5lLmZvckVhY2gobj0+R04obix0KSl9ZnVuY3Rpb24gc3QoLi4uZSl7cmV0dXJuIHAudXNlQ2FsbGJhY2soWHcoLi4uZSksZSl9Y29uc3QgdXM9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7Y2hpbGRyZW46biwuLi5yfT1lLGk9cC5DaGlsZHJlbi50b0FycmF5KG4pLG89aS5maW5kKFhOKTtpZihvKXtjb25zdCBsPW8ucHJvcHMuY2hpbGRyZW4scz1pLm1hcChhPT5hPT09bz9wLkNoaWxkcmVuLmNvdW50KGwpPjE/cC5DaGlsZHJlbi5vbmx5KG51bGwpOnAuaXNWYWxpZEVsZW1lbnQobCk/bC5wcm9wcy5jaGlsZHJlbjpudWxsOmEpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoR3AsaWUoe30scix7cmVmOnR9KSxwLmlzVmFsaWRFbGVtZW50KGwpP3AuY2xvbmVFbGVtZW50KGwsdm9pZCAwLHMpOm51bGwpfXJldHVybiBwLmNyZWF0ZUVsZW1lbnQoR3AsaWUoe30scix7cmVmOnR9KSxuKX0pO3VzLmRpc3BsYXlOYW1lPSJTbG90Ijtjb25zdCBHcD1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtjaGlsZHJlbjpuLC4uLnJ9PWU7cmV0dXJuIHAuaXNWYWxpZEVsZW1lbnQobik/cC5jbG9uZUVsZW1lbnQobix7Li4uUU4ocixuLnByb3BzKSxyZWY6dD9Ydyh0LG4ucmVmKTpuLnJlZn0pOnAuQ2hpbGRyZW4uY291bnQobik+MT9wLkNoaWxkcmVuLm9ubHkobnVsbCk6bnVsbH0pO0dwLmRpc3BsYXlOYW1lPSJTbG90Q2xvbmUiO2NvbnN0IFlOPSh7Y2hpbGRyZW46ZX0pPT5wLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLGUpO2Z1bmN0aW9uIFhOKGUpe3JldHVybiBwLmlzVmFsaWRFbGVtZW50KGUpJiZlLnR5cGU9PT1ZTn1mdW5jdGlvbiBRTihlLHQpe2NvbnN0IG49ey4uLnR9O2Zvcihjb25zdCByIGluIHQpe2NvbnN0IGk9ZVtyXSxvPXRbcl07L15vbltBLVpdLy50ZXN0KHIpP2kmJm8/bltyXT0oLi4ucyk9PntvKC4uLnMpLGkoLi4ucyl9OmkmJihuW3JdPWkpOnI9PT0ic3R5bGUiP25bcl09ey4uLmksLi4ub306cj09PSJjbGFzc05hbWUiJiYobltyXT1baSxvXS5maWx0ZXIoQm9vbGVhbikuam9pbigiICIpKX1yZXR1cm57Li4uZSwuLi5ufX1jb25zdCBKTj1bImEiLCJidXR0b24iLCJkaXYiLCJmb3JtIiwiaDIiLCJoMyIsImltZyIsImlucHV0IiwibGFiZWwiLCJsaSIsIm5hdiIsIm9sIiwicCIsInNwYW4iLCJzdmciLCJ1bCJdLEtlPUpOLnJlZHVjZSgoZSx0KT0+e2NvbnN0IG49cC5mb3J3YXJkUmVmKChyLGkpPT57Y29uc3R7YXNDaGlsZDpvLC4uLmx9PXIscz1vP3VzOnQ7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57d2luZG93W1N5bWJvbC5mb3IoInJhZGl4LXVpIildPSEwfSxbXSkscC5jcmVhdGVFbGVtZW50KHMsaWUoe30sbCx7cmVmOml9KSl9KTtyZXR1cm4gbi5kaXNwbGF5TmFtZT1gUHJpbWl0aXZlLiR7dH1gLHsuLi5lLFt0XTpufX0se30pO2Z1bmN0aW9uIHFOKGUsdCl7ZSYmR3IuZmx1c2hTeW5jKCgpPT5lLmRpc3BhdGNoRXZlbnQodCkpfWNvbnN0IFVuPWdsb2JhbFRoaXMhPW51bGwmJmdsb2JhbFRoaXMuZG9jdW1lbnQ/cC51c2VMYXlvdXRFZmZlY3Q6KCk9Pnt9O2Z1bmN0aW9uIGUyKGUsdCl7cmV0dXJuIHAudXNlUmVkdWNlcigobixyKT0+e2NvbnN0IGk9dFtuXVtyXTtyZXR1cm4gaT8/bn0sZSl9Y29uc3QgRXM9ZT0+e2NvbnN0e3ByZXNlbnQ6dCxjaGlsZHJlbjpufT1lLHI9dDIodCksaT10eXBlb2Ygbj09ImZ1bmN0aW9uIj9uKHtwcmVzZW50OnIuaXNQcmVzZW50fSk6cC5DaGlsZHJlbi5vbmx5KG4pLG89c3Qoci5yZWYsaS5yZWYpO3JldHVybiB0eXBlb2Ygbj09ImZ1bmN0aW9uInx8ci5pc1ByZXNlbnQ/cC5jbG9uZUVsZW1lbnQoaSx7cmVmOm99KTpudWxsfTtFcy5kaXNwbGF5TmFtZT0iUHJlc2VuY2UiO2Z1bmN0aW9uIHQyKGUpe2NvbnN0W3Qsbl09cC51c2VTdGF0ZSgpLHI9cC51c2VSZWYoe30pLGk9cC51c2VSZWYoZSksbz1wLnVzZVJlZigibm9uZSIpLGw9ZT8ibW91bnRlZCI6InVubW91bnRlZCIsW3MsYV09ZTIobCx7bW91bnRlZDp7VU5NT1VOVDoidW5tb3VudGVkIixBTklNQVRJT05fT1VUOiJ1bm1vdW50U3VzcGVuZGVkIn0sdW5tb3VudFN1c3BlbmRlZDp7TU9VTlQ6Im1vdW50ZWQiLEFOSU1BVElPTl9FTkQ6InVubW91bnRlZCJ9LHVubW91bnRlZDp7TU9VTlQ6Im1vdW50ZWQifX0pO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IHU9aGMoci5jdXJyZW50KTtvLmN1cnJlbnQ9cz09PSJtb3VudGVkIj91OiJub25lIn0sW3NdKSxVbigoKT0+e2NvbnN0IHU9ci5jdXJyZW50LGM9aS5jdXJyZW50O2lmKGMhPT1lKXtjb25zdCBmPW8uY3VycmVudCxoPWhjKHUpO2U/YSgiTU9VTlQiKTpoPT09Im5vbmUifHwodT09bnVsbD92b2lkIDA6dS5kaXNwbGF5KT09PSJub25lIj9hKCJVTk1PVU5UIik6YShjJiZmIT09aD8iQU5JTUFUSU9OX09VVCI6IlVOTU9VTlQiKSxpLmN1cnJlbnQ9ZX19LFtlLGFdKSxVbigoKT0+e2lmKHQpe2NvbnN0IHU9ZD0+e2NvbnN0IGg9aGMoci5jdXJyZW50KS5pbmNsdWRlcyhkLmFuaW1hdGlvbk5hbWUpO2QudGFyZ2V0PT09dCYmaCYmR3IuZmx1c2hTeW5jKCgpPT5hKCJBTklNQVRJT05fRU5EIikpfSxjPWQ9PntkLnRhcmdldD09PXQmJihvLmN1cnJlbnQ9aGMoci5jdXJyZW50KSl9O3JldHVybiB0LmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbnN0YXJ0IixjKSx0LmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmNhbmNlbCIsdSksdC5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25lbmQiLHUpLCgpPT57dC5yZW1vdmVFdmVudExpc3RlbmVyKCJhbmltYXRpb25zdGFydCIsYyksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJhbmltYXRpb25jYW5jZWwiLHUpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uZW5kIix1KX19ZWxzZSBhKCJBTklNQVRJT05fRU5EIil9LFt0LGFdKSx7aXNQcmVzZW50OlsibW91bnRlZCIsInVubW91bnRTdXNwZW5kZWQiXS5pbmNsdWRlcyhzKSxyZWY6cC51c2VDYWxsYmFjayh1PT57dSYmKHIuY3VycmVudD1nZXRDb21wdXRlZFN0eWxlKHUpKSxuKHUpfSxbXSl9fWZ1bmN0aW9uIGhjKGUpe3JldHVybihlPT1udWxsP3ZvaWQgMDplLmFuaW1hdGlvbk5hbWUpfHwibm9uZSJ9ZnVuY3Rpb24gbGwoZSx0PVtdKXtsZXQgbj1bXTtmdW5jdGlvbiByKG8sbCl7Y29uc3Qgcz1wLmNyZWF0ZUNvbnRleHQobCksYT1uLmxlbmd0aDtuPVsuLi5uLGxdO2Z1bmN0aW9uIHUoZCl7Y29uc3R7c2NvcGU6ZixjaGlsZHJlbjpoLC4uLm19PWQsZz0oZj09bnVsbD92b2lkIDA6ZltlXVthXSl8fHMsdz1wLnVzZU1lbW8oKCk9Pm0sT2JqZWN0LnZhbHVlcyhtKSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChnLlByb3ZpZGVyLHt2YWx1ZTp3fSxoKX1mdW5jdGlvbiBjKGQsZil7Y29uc3QgaD0oZj09bnVsbD92b2lkIDA6ZltlXVthXSl8fHMsbT1wLnVzZUNvbnRleHQoaCk7aWYobSlyZXR1cm4gbTtpZihsIT09dm9pZCAwKXJldHVybiBsO3Rocm93IG5ldyBFcnJvcihgXGAke2R9XGAgbXVzdCBiZSB1c2VkIHdpdGhpbiBcYCR7b31cYGApfXJldHVybiB1LmRpc3BsYXlOYW1lPW8rIlByb3ZpZGVyIixbdSxjXX1jb25zdCBpPSgpPT57Y29uc3Qgbz1uLm1hcChsPT5wLmNyZWF0ZUNvbnRleHQobCkpO3JldHVybiBmdW5jdGlvbihzKXtjb25zdCBhPShzPT1udWxsP3ZvaWQgMDpzW2VdKXx8bztyZXR1cm4gcC51c2VNZW1vKCgpPT4oe1tgX19zY29wZSR7ZX1gXTp7Li4ucyxbZV06YX19KSxbcyxhXSl9fTtyZXR1cm4gaS5zY29wZU5hbWU9ZSxbcixuMihpLC4uLnQpXX1mdW5jdGlvbiBuMiguLi5lKXtjb25zdCB0PWVbMF07aWYoZS5sZW5ndGg9PT0xKXJldHVybiB0O2NvbnN0IG49KCk9Pntjb25zdCByPWUubWFwKGk9Pih7dXNlU2NvcGU6aSgpLHNjb3BlTmFtZTppLnNjb3BlTmFtZX0pKTtyZXR1cm4gZnVuY3Rpb24obyl7Y29uc3QgbD1yLnJlZHVjZSgocyx7dXNlU2NvcGU6YSxzY29wZU5hbWU6dX0pPT57Y29uc3QgZD1hKG8pW2BfX3Njb3BlJHt1fWBdO3JldHVybnsuLi5zLC4uLmR9fSx7fSk7cmV0dXJuIHAudXNlTWVtbygoKT0+KHtbYF9fc2NvcGUke3Quc2NvcGVOYW1lfWBdOmx9KSxbbF0pfX07cmV0dXJuIG4uc2NvcGVOYW1lPXQuc2NvcGVOYW1lLG59ZnVuY3Rpb24gZW4oZSl7Y29uc3QgdD1wLnVzZVJlZihlKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pnt0LmN1cnJlbnQ9ZX0pLHAudXNlTWVtbygoKT0+KC4uLm4pPT57dmFyIHI7cmV0dXJuKHI9dC5jdXJyZW50KT09PW51bGx8fHI9PT12b2lkIDA/dm9pZCAwOnIuY2FsbCh0LC4uLm4pfSxbXSl9Y29uc3QgcjI9cC5jcmVhdGVDb250ZXh0KHZvaWQgMCk7ZnVuY3Rpb24gR2coZSl7Y29uc3QgdD1wLnVzZUNvbnRleHQocjIpO3JldHVybiBlfHx0fHwibHRyIn1mdW5jdGlvbiBZcChlLFt0LG5dKXtyZXR1cm4gTWF0aC5taW4obixNYXRoLm1heCh0LGUpKX1mdW5jdGlvbiBudChlLHQse2NoZWNrRm9yRGVmYXVsdFByZXZlbnRlZDpuPSEwfT17fSl7cmV0dXJuIGZ1bmN0aW9uKGkpe2lmKGU9PW51bGx8fGUoaSksbj09PSExfHwhaS5kZWZhdWx0UHJldmVudGVkKXJldHVybiB0PT1udWxsP3ZvaWQgMDp0KGkpfX1mdW5jdGlvbiBpMihlLHQpe3JldHVybiBwLnVzZVJlZHVjZXIoKG4scik9Pntjb25zdCBpPXRbbl1bcl07cmV0dXJuIGk/P259LGUpfWNvbnN0IFF3PSJTY3JvbGxBcmVhIixbSncsVEldPWxsKFF3KSxbbzIsYXJdPUp3KFF3KSxsMj1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2Nyb2xsQXJlYTpuLHR5cGU6cj0iaG92ZXIiLGRpcjppLHNjcm9sbEhpZGVEZWxheTpvPTYwMCwuLi5sfT1lLFtzLGFdPXAudXNlU3RhdGUobnVsbCksW3UsY109cC51c2VTdGF0ZShudWxsKSxbZCxmXT1wLnVzZVN0YXRlKG51bGwpLFtoLG1dPXAudXNlU3RhdGUobnVsbCksW2csd109cC51c2VTdGF0ZShudWxsKSxbdix5XT1wLnVzZVN0YXRlKDApLFtfLFNdPXAudXNlU3RhdGUoMCksW0UsJF09cC51c2VTdGF0ZSghMSksW0MsVF09cC51c2VTdGF0ZSghMSksTj1zdCh0LEQ9PmEoRCkpLFI9R2coaSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChvMix7c2NvcGU6bix0eXBlOnIsZGlyOlIsc2Nyb2xsSGlkZURlbGF5Om8sc2Nyb2xsQXJlYTpzLHZpZXdwb3J0OnUsb25WaWV3cG9ydENoYW5nZTpjLGNvbnRlbnQ6ZCxvbkNvbnRlbnRDaGFuZ2U6ZixzY3JvbGxiYXJYOmgsb25TY3JvbGxiYXJYQ2hhbmdlOm0sc2Nyb2xsYmFyWEVuYWJsZWQ6RSxvblNjcm9sbGJhclhFbmFibGVkQ2hhbmdlOiQsc2Nyb2xsYmFyWTpnLG9uU2Nyb2xsYmFyWUNoYW5nZTp3LHNjcm9sbGJhcllFbmFibGVkOkMsb25TY3JvbGxiYXJZRW5hYmxlZENoYW5nZTpULG9uQ29ybmVyV2lkdGhDaGFuZ2U6eSxvbkNvcm5lckhlaWdodENoYW5nZTpTfSxwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHtkaXI6Un0sbCx7cmVmOk4sc3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsIi0tcmFkaXgtc2Nyb2xsLWFyZWEtY29ybmVyLXdpZHRoIjp2KyJweCIsIi0tcmFkaXgtc2Nyb2xsLWFyZWEtY29ybmVyLWhlaWdodCI6XysicHgiLC4uLmUuc3R5bGV9fSkpKX0pLHMyPSJTY3JvbGxBcmVhVmlld3BvcnQiLGEyPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTY3JvbGxBcmVhOm4sY2hpbGRyZW46ciwuLi5pfT1lLG89YXIoczIsbiksbD1wLnVzZVJlZihudWxsKSxzPXN0KHQsbCxvLm9uVmlld3BvcnRDaGFuZ2UpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLHAuY3JlYXRlRWxlbWVudCgic3R5bGUiLHtkYW5nZXJvdXNseVNldElubmVySFRNTDp7X19odG1sOiJbZGF0YS1yYWRpeC1zY3JvbGwtYXJlYS12aWV3cG9ydF17c2Nyb2xsYmFyLXdpZHRoOm5vbmU7LW1zLW92ZXJmbG93LXN0eWxlOm5vbmU7LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7fVtkYXRhLXJhZGl4LXNjcm9sbC1hcmVhLXZpZXdwb3J0XTo6LXdlYmtpdC1zY3JvbGxiYXJ7ZGlzcGxheTpub25lfSJ9fSkscC5jcmVhdGVFbGVtZW50KEtlLmRpdixpZSh7ImRhdGEtcmFkaXgtc2Nyb2xsLWFyZWEtdmlld3BvcnQiOiIifSxpLHtyZWY6cyxzdHlsZTp7b3ZlcmZsb3dYOm8uc2Nyb2xsYmFyWEVuYWJsZWQ/InNjcm9sbCI6ImhpZGRlbiIsb3ZlcmZsb3dZOm8uc2Nyb2xsYmFyWUVuYWJsZWQ/InNjcm9sbCI6ImhpZGRlbiIsLi4uZS5zdHlsZX19KSxwLmNyZWF0ZUVsZW1lbnQoImRpdiIse3JlZjpvLm9uQ29udGVudENoYW5nZSxzdHlsZTp7bWluV2lkdGg6IjEwMCUiLGRpc3BsYXk6InRhYmxlIn19LHIpKSl9KSxfaT0iU2Nyb2xsQXJlYVNjcm9sbGJhciIscXc9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7Zm9yY2VNb3VudDpuLC4uLnJ9PWUsaT1hcihfaSxlLl9fc2NvcGVTY3JvbGxBcmVhKSx7b25TY3JvbGxiYXJYRW5hYmxlZENoYW5nZTpvLG9uU2Nyb2xsYmFyWUVuYWJsZWRDaGFuZ2U6bH09aSxzPWUub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCI7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT4ocz9vKCEwKTpsKCEwKSwoKT0+e3M/byghMSk6bCghMSl9KSxbcyxvLGxdKSxpLnR5cGU9PT0iaG92ZXIiP3AuY3JlYXRlRWxlbWVudCh1MixpZSh7fSxyLHtyZWY6dCxmb3JjZU1vdW50Om59KSk6aS50eXBlPT09InNjcm9sbCI/cC5jcmVhdGVFbGVtZW50KGMyLGllKHt9LHIse3JlZjp0LGZvcmNlTW91bnQ6bn0pKTppLnR5cGU9PT0iYXV0byI/cC5jcmVhdGVFbGVtZW50KGVTLGllKHt9LHIse3JlZjp0LGZvcmNlTW91bnQ6bn0pKTppLnR5cGU9PT0iYWx3YXlzIj9wLmNyZWF0ZUVsZW1lbnQoWWcsaWUoe30scix7cmVmOnR9KSk6bnVsbH0pLHUyPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e2ZvcmNlTW91bnQ6biwuLi5yfT1lLGk9YXIoX2ksZS5fX3Njb3BlU2Nyb2xsQXJlYSksW28sbF09cC51c2VTdGF0ZSghMSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3Qgcz1pLnNjcm9sbEFyZWE7bGV0IGE9MDtpZihzKXtjb25zdCB1PSgpPT57d2luZG93LmNsZWFyVGltZW91dChhKSxsKCEwKX0sYz0oKT0+e2E9d2luZG93LnNldFRpbWVvdXQoKCk9PmwoITEpLGkuc2Nyb2xsSGlkZURlbGF5KX07cmV0dXJuIHMuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmVudGVyIix1KSxzLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJsZWF2ZSIsYyksKCk9Pnt3aW5kb3cuY2xlYXJUaW1lb3V0KGEpLHMucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcmVudGVyIix1KSxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJsZWF2ZSIsYyl9fX0sW2kuc2Nyb2xsQXJlYSxpLnNjcm9sbEhpZGVEZWxheV0pLHAuY3JlYXRlRWxlbWVudChFcyx7cHJlc2VudDpufHxvfSxwLmNyZWF0ZUVsZW1lbnQoZVMsaWUoeyJkYXRhLXN0YXRlIjpvPyJ2aXNpYmxlIjoiaGlkZGVuIn0scix7cmVmOnR9KSkpfSksYzI9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7Zm9yY2VNb3VudDpuLC4uLnJ9PWUsaT1hcihfaSxlLl9fc2NvcGVTY3JvbGxBcmVhKSxvPWUub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCIsbD1FZigoKT0+YSgiU0NST0xMX0VORCIpLDEwMCksW3MsYV09aTIoImhpZGRlbiIse2hpZGRlbjp7U0NST0xMOiJzY3JvbGxpbmcifSxzY3JvbGxpbmc6e1NDUk9MTF9FTkQ6ImlkbGUiLFBPSU5URVJfRU5URVI6ImludGVyYWN0aW5nIn0saW50ZXJhY3Rpbmc6e1NDUk9MTDoiaW50ZXJhY3RpbmciLFBPSU5URVJfTEVBVkU6ImlkbGUifSxpZGxlOntISURFOiJoaWRkZW4iLFNDUk9MTDoic2Nyb2xsaW5nIixQT0lOVEVSX0VOVEVSOiJpbnRlcmFjdGluZyJ9fSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57aWYocz09PSJpZGxlIil7Y29uc3QgdT13aW5kb3cuc2V0VGltZW91dCgoKT0+YSgiSElERSIpLGkuc2Nyb2xsSGlkZURlbGF5KTtyZXR1cm4oKT0+d2luZG93LmNsZWFyVGltZW91dCh1KX19LFtzLGkuc2Nyb2xsSGlkZURlbGF5LGFdKSxwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IHU9aS52aWV3cG9ydCxjPW8/InNjcm9sbExlZnQiOiJzY3JvbGxUb3AiO2lmKHUpe2xldCBkPXVbY107Y29uc3QgZj0oKT0+e2NvbnN0IGg9dVtjXTtkIT09aCYmKGEoIlNDUk9MTCIpLGwoKSksZD1ofTtyZXR1cm4gdS5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLGYpLCgpPT51LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZil9fSxbaS52aWV3cG9ydCxvLGEsbF0pLHAuY3JlYXRlRWxlbWVudChFcyx7cHJlc2VudDpufHxzIT09ImhpZGRlbiJ9LHAuY3JlYXRlRWxlbWVudChZZyxpZSh7ImRhdGEtc3RhdGUiOnM9PT0iaGlkZGVuIj8iaGlkZGVuIjoidmlzaWJsZSJ9LHIse3JlZjp0LG9uUG9pbnRlckVudGVyOm50KGUub25Qb2ludGVyRW50ZXIsKCk9PmEoIlBPSU5URVJfRU5URVIiKSksb25Qb2ludGVyTGVhdmU6bnQoZS5vblBvaW50ZXJMZWF2ZSwoKT0+YSgiUE9JTlRFUl9MRUFWRSIpKX0pKSl9KSxlUz1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdCBuPWFyKF9pLGUuX19zY29wZVNjcm9sbEFyZWEpLHtmb3JjZU1vdW50OnIsLi4uaX09ZSxbbyxsXT1wLnVzZVN0YXRlKCExKSxzPWUub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCIsYT1FZigoKT0+e2lmKG4udmlld3BvcnQpe2NvbnN0IHU9bi52aWV3cG9ydC5vZmZzZXRXaWR0aDxuLnZpZXdwb3J0LnNjcm9sbFdpZHRoLGM9bi52aWV3cG9ydC5vZmZzZXRIZWlnaHQ8bi52aWV3cG9ydC5zY3JvbGxIZWlnaHQ7bChzP3U6Yyl9fSwxMCk7cmV0dXJuIGNzKG4udmlld3BvcnQsYSksY3Mobi5jb250ZW50LGEpLHAuY3JlYXRlRWxlbWVudChFcyx7cHJlc2VudDpyfHxvfSxwLmNyZWF0ZUVsZW1lbnQoWWcsaWUoeyJkYXRhLXN0YXRlIjpvPyJ2aXNpYmxlIjoiaGlkZGVuIn0saSx7cmVmOnR9KSkpfSksWWc9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7b3JpZW50YXRpb246bj0idmVydGljYWwiLC4uLnJ9PWUsaT1hcihfaSxlLl9fc2NvcGVTY3JvbGxBcmVhKSxvPXAudXNlUmVmKG51bGwpLGw9cC51c2VSZWYoMCksW3MsYV09cC51c2VTdGF0ZSh7Y29udGVudDowLHZpZXdwb3J0OjAsc2Nyb2xsYmFyOntzaXplOjAscGFkZGluZ1N0YXJ0OjAscGFkZGluZ0VuZDowfX0pLHU9aVMocy52aWV3cG9ydCxzLmNvbnRlbnQpLGM9ey4uLnIsc2l6ZXM6cyxvblNpemVzQ2hhbmdlOmEsaGFzVGh1bWI6dT4wJiZ1PDEsb25UaHVtYkNoYW5nZTpmPT5vLmN1cnJlbnQ9ZixvblRodW1iUG9pbnRlclVwOigpPT5sLmN1cnJlbnQ9MCxvblRodW1iUG9pbnRlckRvd246Zj0+bC5jdXJyZW50PWZ9O2Z1bmN0aW9uIGQoZixoKXtyZXR1cm4geTIoZixsLmN1cnJlbnQscyxoKX1yZXR1cm4gbj09PSJob3Jpem9udGFsIj9wLmNyZWF0ZUVsZW1lbnQoZDIsaWUoe30sYyx7cmVmOnQsb25UaHVtYlBvc2l0aW9uQ2hhbmdlOigpPT57aWYoaS52aWV3cG9ydCYmby5jdXJyZW50KXtjb25zdCBmPWkudmlld3BvcnQuc2Nyb2xsTGVmdCxoPWswKGYscyxpLmRpcik7by5jdXJyZW50LnN0eWxlLnRyYW5zZm9ybT1gdHJhbnNsYXRlM2QoJHtofXB4LCAwLCAwKWB9fSxvbldoZWVsU2Nyb2xsOmY9PntpLnZpZXdwb3J0JiYoaS52aWV3cG9ydC5zY3JvbGxMZWZ0PWYpfSxvbkRyYWdTY3JvbGw6Zj0+e2kudmlld3BvcnQmJihpLnZpZXdwb3J0LnNjcm9sbExlZnQ9ZChmLGkuZGlyKSl9fSkpOm49PT0idmVydGljYWwiP3AuY3JlYXRlRWxlbWVudChmMixpZSh7fSxjLHtyZWY6dCxvblRodW1iUG9zaXRpb25DaGFuZ2U6KCk9PntpZihpLnZpZXdwb3J0JiZvLmN1cnJlbnQpe2NvbnN0IGY9aS52aWV3cG9ydC5zY3JvbGxUb3AsaD1rMChmLHMpO28uY3VycmVudC5zdHlsZS50cmFuc2Zvcm09YHRyYW5zbGF0ZTNkKDAsICR7aH1weCwgMClgfX0sb25XaGVlbFNjcm9sbDpmPT57aS52aWV3cG9ydCYmKGkudmlld3BvcnQuc2Nyb2xsVG9wPWYpfSxvbkRyYWdTY3JvbGw6Zj0+e2kudmlld3BvcnQmJihpLnZpZXdwb3J0LnNjcm9sbFRvcD1kKGYpKX19KSk6bnVsbH0pLGQyPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e3NpemVzOm4sb25TaXplc0NoYW5nZTpyLC4uLml9PWUsbz1hcihfaSxlLl9fc2NvcGVTY3JvbGxBcmVhKSxbbCxzXT1wLnVzZVN0YXRlKCksYT1wLnVzZVJlZihudWxsKSx1PXN0KHQsYSxvLm9uU2Nyb2xsYmFyWENoYW5nZSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57YS5jdXJyZW50JiZzKGdldENvbXB1dGVkU3R5bGUoYS5jdXJyZW50KSl9LFthXSkscC5jcmVhdGVFbGVtZW50KG5TLGllKHsiZGF0YS1vcmllbnRhdGlvbiI6Imhvcml6b250YWwifSxpLHtyZWY6dSxzaXplczpuLHN0eWxlOntib3R0b206MCxsZWZ0Om8uZGlyPT09InJ0bCI/InZhcigtLXJhZGl4LXNjcm9sbC1hcmVhLWNvcm5lci13aWR0aCkiOjAscmlnaHQ6by5kaXI9PT0ibHRyIj8idmFyKC0tcmFkaXgtc2Nyb2xsLWFyZWEtY29ybmVyLXdpZHRoKSI6MCwiLS1yYWRpeC1zY3JvbGwtYXJlYS10aHVtYi13aWR0aCI6U2YobikrInB4IiwuLi5lLnN0eWxlfSxvblRodW1iUG9pbnRlckRvd246Yz0+ZS5vblRodW1iUG9pbnRlckRvd24oYy54KSxvbkRyYWdTY3JvbGw6Yz0+ZS5vbkRyYWdTY3JvbGwoYy54KSxvbldoZWVsU2Nyb2xsOihjLGQpPT57aWYoby52aWV3cG9ydCl7Y29uc3QgZj1vLnZpZXdwb3J0LnNjcm9sbExlZnQrYy5kZWx0YVg7ZS5vbldoZWVsU2Nyb2xsKGYpLGxTKGYsZCkmJmMucHJldmVudERlZmF1bHQoKX19LG9uUmVzaXplOigpPT57YS5jdXJyZW50JiZvLnZpZXdwb3J0JiZsJiZyKHtjb250ZW50Om8udmlld3BvcnQuc2Nyb2xsV2lkdGgsdmlld3BvcnQ6by52aWV3cG9ydC5vZmZzZXRXaWR0aCxzY3JvbGxiYXI6e3NpemU6YS5jdXJyZW50LmNsaWVudFdpZHRoLHBhZGRpbmdTdGFydDpfZChsLnBhZGRpbmdMZWZ0KSxwYWRkaW5nRW5kOl9kKGwucGFkZGluZ1JpZ2h0KX19KX19KSl9KSxmMj1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtzaXplczpuLG9uU2l6ZXNDaGFuZ2U6ciwuLi5pfT1lLG89YXIoX2ksZS5fX3Njb3BlU2Nyb2xsQXJlYSksW2wsc109cC51c2VTdGF0ZSgpLGE9cC51c2VSZWYobnVsbCksdT1zdCh0LGEsby5vblNjcm9sbGJhcllDaGFuZ2UpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2EuY3VycmVudCYmcyhnZXRDb21wdXRlZFN0eWxlKGEuY3VycmVudCkpfSxbYV0pLHAuY3JlYXRlRWxlbWVudChuUyxpZSh7ImRhdGEtb3JpZW50YXRpb24iOiJ2ZXJ0aWNhbCJ9LGkse3JlZjp1LHNpemVzOm4sc3R5bGU6e3RvcDowLHJpZ2h0Om8uZGlyPT09Imx0ciI/MDp2b2lkIDAsbGVmdDpvLmRpcj09PSJydGwiPzA6dm9pZCAwLGJvdHRvbToidmFyKC0tcmFkaXgtc2Nyb2xsLWFyZWEtY29ybmVyLWhlaWdodCkiLCItLXJhZGl4LXNjcm9sbC1hcmVhLXRodW1iLWhlaWdodCI6U2YobikrInB4IiwuLi5lLnN0eWxlfSxvblRodW1iUG9pbnRlckRvd246Yz0+ZS5vblRodW1iUG9pbnRlckRvd24oYy55KSxvbkRyYWdTY3JvbGw6Yz0+ZS5vbkRyYWdTY3JvbGwoYy55KSxvbldoZWVsU2Nyb2xsOihjLGQpPT57aWYoby52aWV3cG9ydCl7Y29uc3QgZj1vLnZpZXdwb3J0LnNjcm9sbFRvcCtjLmRlbHRhWTtlLm9uV2hlZWxTY3JvbGwoZiksbFMoZixkKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sb25SZXNpemU6KCk9PnthLmN1cnJlbnQmJm8udmlld3BvcnQmJmwmJnIoe2NvbnRlbnQ6by52aWV3cG9ydC5zY3JvbGxIZWlnaHQsdmlld3BvcnQ6by52aWV3cG9ydC5vZmZzZXRIZWlnaHQsc2Nyb2xsYmFyOntzaXplOmEuY3VycmVudC5jbGllbnRIZWlnaHQscGFkZGluZ1N0YXJ0Ol9kKGwucGFkZGluZ1RvcCkscGFkZGluZ0VuZDpfZChsLnBhZGRpbmdCb3R0b20pfX0pfX0pKX0pLFtoMix0U109SncoX2kpLG5TPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTY3JvbGxBcmVhOm4sc2l6ZXM6cixoYXNUaHVtYjppLG9uVGh1bWJDaGFuZ2U6byxvblRodW1iUG9pbnRlclVwOmwsb25UaHVtYlBvaW50ZXJEb3duOnMsb25UaHVtYlBvc2l0aW9uQ2hhbmdlOmEsb25EcmFnU2Nyb2xsOnUsb25XaGVlbFNjcm9sbDpjLG9uUmVzaXplOmQsLi4uZn09ZSxoPWFyKF9pLG4pLFttLGddPXAudXNlU3RhdGUobnVsbCksdz1zdCh0LE49PmcoTikpLHY9cC51c2VSZWYobnVsbCkseT1wLnVzZVJlZigiIiksXz1oLnZpZXdwb3J0LFM9ci5jb250ZW50LXIudmlld3BvcnQsRT1lbihjKSwkPWVuKGEpLEM9RWYoZCwxMCk7ZnVuY3Rpb24gVChOKXtpZih2LmN1cnJlbnQpe2NvbnN0IFI9Ti5jbGllbnRYLXYuY3VycmVudC5sZWZ0LEQ9Ti5jbGllbnRZLXYuY3VycmVudC50b3A7dSh7eDpSLHk6RH0pfX1yZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBOPVI9Pntjb25zdCBEPVIudGFyZ2V0OyhtPT1udWxsP3ZvaWQgMDptLmNvbnRhaW5zKEQpKSYmRShSLFMpfTtyZXR1cm4gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLE4se3Bhc3NpdmU6ITF9KSwoKT0+ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2hlZWwiLE4se3Bhc3NpdmU6ITF9KX0sW18sbSxTLEVdKSxwLnVzZUVmZmVjdCgkLFtyLCRdKSxjcyhtLEMpLGNzKGguY29udGVudCxDKSxwLmNyZWF0ZUVsZW1lbnQoaDIse3Njb3BlOm4sc2Nyb2xsYmFyOm0saGFzVGh1bWI6aSxvblRodW1iQ2hhbmdlOmVuKG8pLG9uVGh1bWJQb2ludGVyVXA6ZW4obCksb25UaHVtYlBvc2l0aW9uQ2hhbmdlOiQsb25UaHVtYlBvaW50ZXJEb3duOmVuKHMpfSxwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHt9LGYse3JlZjp3LHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLC4uLmYuc3R5bGV9LG9uUG9pbnRlckRvd246bnQoZS5vblBvaW50ZXJEb3duLE49PntOLmJ1dHRvbj09PTAmJihOLnRhcmdldC5zZXRQb2ludGVyQ2FwdHVyZShOLnBvaW50ZXJJZCksdi5jdXJyZW50PW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkseS5jdXJyZW50PWRvY3VtZW50LmJvZHkuc3R5bGUud2Via2l0VXNlclNlbGVjdCxkb2N1bWVudC5ib2R5LnN0eWxlLndlYmtpdFVzZXJTZWxlY3Q9Im5vbmUiLGgudmlld3BvcnQmJihoLnZpZXdwb3J0LnN0eWxlLnNjcm9sbEJlaGF2aW9yPSJhdXRvIiksVChOKSl9KSxvblBvaW50ZXJNb3ZlOm50KGUub25Qb2ludGVyTW92ZSxUKSxvblBvaW50ZXJVcDpudChlLm9uUG9pbnRlclVwLE49Pntjb25zdCBSPU4udGFyZ2V0O1IuaGFzUG9pbnRlckNhcHR1cmUoTi5wb2ludGVySWQpJiZSLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShOLnBvaW50ZXJJZCksZG9jdW1lbnQuYm9keS5zdHlsZS53ZWJraXRVc2VyU2VsZWN0PXkuY3VycmVudCxoLnZpZXdwb3J0JiYoaC52aWV3cG9ydC5zdHlsZS5zY3JvbGxCZWhhdmlvcj0iIiksdi5jdXJyZW50PW51bGx9KX0pKSl9KSxYcD0iU2Nyb2xsQXJlYVRodW1iIixwMj1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtmb3JjZU1vdW50Om4sLi4ucn09ZSxpPXRTKFhwLGUuX19zY29wZVNjcm9sbEFyZWEpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoRXMse3ByZXNlbnQ6bnx8aS5oYXNUaHVtYn0scC5jcmVhdGVFbGVtZW50KG0yLGllKHtyZWY6dH0scikpKX0pLG0yPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTY3JvbGxBcmVhOm4sc3R5bGU6ciwuLi5pfT1lLG89YXIoWHAsbiksbD10UyhYcCxuKSx7b25UaHVtYlBvc2l0aW9uQ2hhbmdlOnN9PWwsYT1zdCh0LGQ9Pmwub25UaHVtYkNoYW5nZShkKSksdT1wLnVzZVJlZigpLGM9RWYoKCk9Pnt1LmN1cnJlbnQmJih1LmN1cnJlbnQoKSx1LmN1cnJlbnQ9dm9pZCAwKX0sMTAwKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBkPW8udmlld3BvcnQ7aWYoZCl7Y29uc3QgZj0oKT0+e2lmKGMoKSwhdS5jdXJyZW50KXtjb25zdCBoPXgyKGQscyk7dS5jdXJyZW50PWgscygpfX07cmV0dXJuIHMoKSxkLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZiksKCk9PmQucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixmKX19LFtvLnZpZXdwb3J0LGMsc10pLHAuY3JlYXRlRWxlbWVudChLZS5kaXYsaWUoeyJkYXRhLXN0YXRlIjpsLmhhc1RodW1iPyJ2aXNpYmxlIjoiaGlkZGVuIn0saSx7cmVmOmEsc3R5bGU6e3dpZHRoOiJ2YXIoLS1yYWRpeC1zY3JvbGwtYXJlYS10aHVtYi13aWR0aCkiLGhlaWdodDoidmFyKC0tcmFkaXgtc2Nyb2xsLWFyZWEtdGh1bWItaGVpZ2h0KSIsLi4ucn0sb25Qb2ludGVyRG93bkNhcHR1cmU6bnQoZS5vblBvaW50ZXJEb3duQ2FwdHVyZSxkPT57Y29uc3QgaD1kLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxtPWQuY2xpZW50WC1oLmxlZnQsZz1kLmNsaWVudFktaC50b3A7bC5vblRodW1iUG9pbnRlckRvd24oe3g6bSx5Omd9KX0pLG9uUG9pbnRlclVwOm50KGUub25Qb2ludGVyVXAsbC5vblRodW1iUG9pbnRlclVwKX0pKX0pLHJTPSJTY3JvbGxBcmVhQ29ybmVyIixnMj1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdCBuPWFyKHJTLGUuX19zY29wZVNjcm9sbEFyZWEpLHI9ISEobi5zY3JvbGxiYXJYJiZuLnNjcm9sbGJhclkpO3JldHVybiBuLnR5cGUhPT0ic2Nyb2xsIiYmcj9wLmNyZWF0ZUVsZW1lbnQodjIsaWUoe30sZSx7cmVmOnR9KSk6bnVsbH0pLHYyPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTY3JvbGxBcmVhOm4sLi4ucn09ZSxpPWFyKHJTLG4pLFtvLGxdPXAudXNlU3RhdGUoMCksW3MsYV09cC51c2VTdGF0ZSgwKSx1PSEhKG8mJnMpO3JldHVybiBjcyhpLnNjcm9sbGJhclgsKCk9Pnt2YXIgYztjb25zdCBkPSgoYz1pLnNjcm9sbGJhclgpPT09bnVsbHx8Yz09PXZvaWQgMD92b2lkIDA6Yy5vZmZzZXRIZWlnaHQpfHwwO2kub25Db3JuZXJIZWlnaHRDaGFuZ2UoZCksYShkKX0pLGNzKGkuc2Nyb2xsYmFyWSwoKT0+e3ZhciBjO2NvbnN0IGQ9KChjPWkuc2Nyb2xsYmFyWSk9PT1udWxsfHxjPT09dm9pZCAwP3ZvaWQgMDpjLm9mZnNldFdpZHRoKXx8MDtpLm9uQ29ybmVyV2lkdGhDaGFuZ2UoZCksbChkKX0pLHU/cC5jcmVhdGVFbGVtZW50KEtlLmRpdixpZSh7fSxyLHtyZWY6dCxzdHlsZTp7d2lkdGg6byxoZWlnaHQ6cyxwb3NpdGlvbjoiYWJzb2x1dGUiLHJpZ2h0OmkuZGlyPT09Imx0ciI/MDp2b2lkIDAsbGVmdDppLmRpcj09PSJydGwiPzA6dm9pZCAwLGJvdHRvbTowLC4uLmUuc3R5bGV9fSkpOm51bGx9KTtmdW5jdGlvbiBfZChlKXtyZXR1cm4gZT9wYXJzZUludChlLDEwKTowfWZ1bmN0aW9uIGlTKGUsdCl7Y29uc3Qgbj1lL3Q7cmV0dXJuIGlzTmFOKG4pPzA6bn1mdW5jdGlvbiBTZihlKXtjb25zdCB0PWlTKGUudmlld3BvcnQsZS5jb250ZW50KSxuPWUuc2Nyb2xsYmFyLnBhZGRpbmdTdGFydCtlLnNjcm9sbGJhci5wYWRkaW5nRW5kLHI9KGUuc2Nyb2xsYmFyLnNpemUtbikqdDtyZXR1cm4gTWF0aC5tYXgociwxOCl9ZnVuY3Rpb24geTIoZSx0LG4scj0ibHRyIil7Y29uc3QgaT1TZihuKSxvPWkvMixsPXR8fG8scz1pLWwsYT1uLnNjcm9sbGJhci5wYWRkaW5nU3RhcnQrbCx1PW4uc2Nyb2xsYmFyLnNpemUtbi5zY3JvbGxiYXIucGFkZGluZ0VuZC1zLGM9bi5jb250ZW50LW4udmlld3BvcnQsZD1yPT09Imx0ciI/WzAsY106W2MqLTEsMF07cmV0dXJuIG9TKFthLHVdLGQpKGUpfWZ1bmN0aW9uIGswKGUsdCxuPSJsdHIiKXtjb25zdCByPVNmKHQpLGk9dC5zY3JvbGxiYXIucGFkZGluZ1N0YXJ0K3Quc2Nyb2xsYmFyLnBhZGRpbmdFbmQsbz10LnNjcm9sbGJhci5zaXplLWksbD10LmNvbnRlbnQtdC52aWV3cG9ydCxzPW8tcixhPW49PT0ibHRyIj9bMCxsXTpbbCotMSwwXSx1PVlwKGUsYSk7cmV0dXJuIG9TKFswLGxdLFswLHNdKSh1KX1mdW5jdGlvbiBvUyhlLHQpe3JldHVybiBuPT57aWYoZVswXT09PWVbMV18fHRbMF09PT10WzFdKXJldHVybiB0WzBdO2NvbnN0IHI9KHRbMV0tdFswXSkvKGVbMV0tZVswXSk7cmV0dXJuIHRbMF0rcioobi1lWzBdKX19ZnVuY3Rpb24gbFMoZSx0KXtyZXR1cm4gZT4wJiZlPHR9Y29uc3QgeDI9KGUsdD0oKT0+e30pPT57bGV0IG49e2xlZnQ6ZS5zY3JvbGxMZWZ0LHRvcDplLnNjcm9sbFRvcH0scj0wO3JldHVybiBmdW5jdGlvbiBpKCl7Y29uc3Qgbz17bGVmdDplLnNjcm9sbExlZnQsdG9wOmUuc2Nyb2xsVG9wfSxsPW4ubGVmdCE9PW8ubGVmdCxzPW4udG9wIT09by50b3A7KGx8fHMpJiZ0KCksbj1vLHI9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShpKX0oKSwoKT0+d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHIpfTtmdW5jdGlvbiBFZihlLHQpe2NvbnN0IG49ZW4oZSkscj1wLnVzZVJlZigwKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PigpPT53aW5kb3cuY2xlYXJUaW1lb3V0KHIuY3VycmVudCksW10pLHAudXNlQ2FsbGJhY2soKCk9Pnt3aW5kb3cuY2xlYXJUaW1lb3V0KHIuY3VycmVudCksci5jdXJyZW50PXdpbmRvdy5zZXRUaW1lb3V0KG4sdCl9LFtuLHRdKX1mdW5jdGlvbiBjcyhlLHQpe2NvbnN0IG49ZW4odCk7VW4oKCk9PntsZXQgcj0wO2lmKGUpe2NvbnN0IGk9bmV3IFJlc2l6ZU9ic2VydmVyKCgpPT57Y2FuY2VsQW5pbWF0aW9uRnJhbWUocikscj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKG4pfSk7cmV0dXJuIGkub2JzZXJ2ZShlKSwoKT0+e3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShyKSxpLnVub2JzZXJ2ZShlKX19fSxbZSxuXSl9Y29uc3Qgc1M9bDIsXzI9YTIsdzI9ZzI7ZnVuY3Rpb24gYVMoZSl7dmFyIHQsbixyPSIiO2lmKHR5cGVvZiBlPT0ic3RyaW5nInx8dHlwZW9mIGU9PSJudW1iZXIiKXIrPWU7ZWxzZSBpZih0eXBlb2YgZT09Im9iamVjdCIpaWYoQXJyYXkuaXNBcnJheShlKSlmb3IodD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0mJihuPWFTKGVbdF0pKSYmKHImJihyKz0iICIpLHIrPW4pO2Vsc2UgZm9yKHQgaW4gZSllW3RdJiYociYmKHIrPSIgIikscis9dCk7cmV0dXJuIHJ9ZnVuY3Rpb24gdVMoKXtmb3IodmFyIGUsdCxuPTAscj0iIjtuPGFyZ3VtZW50cy5sZW5ndGg7KShlPWFyZ3VtZW50c1tuKytdKSYmKHQ9YVMoZSkpJiYociYmKHIrPSIgIikscis9dCk7cmV0dXJuIHJ9Y29uc3QgWGc9Ii0iO2Z1bmN0aW9uIFMyKGUpe2NvbnN0IHQ9QzIoZSkse2NvbmZsaWN0aW5nQ2xhc3NHcm91cHM6bixjb25mbGljdGluZ0NsYXNzR3JvdXBNb2RpZmllcnM6cn09ZTtmdW5jdGlvbiBpKGwpe2NvbnN0IHM9bC5zcGxpdChYZyk7cmV0dXJuIHNbMF09PT0iIiYmcy5sZW5ndGghPT0xJiZzLnNoaWZ0KCksY1Mocyx0KXx8RTIobCl9ZnVuY3Rpb24gbyhsLHMpe2NvbnN0IGE9bltsXXx8W107cmV0dXJuIHMmJnJbbF0/Wy4uLmEsLi4ucltsXV06YX1yZXR1cm57Z2V0Q2xhc3NHcm91cElkOmksZ2V0Q29uZmxpY3RpbmdDbGFzc0dyb3VwSWRzOm99fWZ1bmN0aW9uIGNTKGUsdCl7dmFyIGw7aWYoZS5sZW5ndGg9PT0wKXJldHVybiB0LmNsYXNzR3JvdXBJZDtjb25zdCBuPWVbMF0scj10Lm5leHRQYXJ0LmdldChuKSxpPXI/Y1MoZS5zbGljZSgxKSxyKTp2b2lkIDA7aWYoaSlyZXR1cm4gaTtpZih0LnZhbGlkYXRvcnMubGVuZ3RoPT09MClyZXR1cm47Y29uc3Qgbz1lLmpvaW4oWGcpO3JldHVybihsPXQudmFsaWRhdG9ycy5maW5kKCh7dmFsaWRhdG9yOnN9KT0+cyhvKSkpPT1udWxsP3ZvaWQgMDpsLmNsYXNzR3JvdXBJZH1jb25zdCAkMD0vXlxbKC4rKVxdJC87ZnVuY3Rpb24gRTIoZSl7aWYoJDAudGVzdChlKSl7Y29uc3QgdD0kMC5leGVjKGUpWzFdLG49dD09bnVsbD92b2lkIDA6dC5zdWJzdHJpbmcoMCx0LmluZGV4T2YoIjoiKSk7aWYobilyZXR1cm4iYXJiaXRyYXJ5Li4iK259fWZ1bmN0aW9uIEMyKGUpe2NvbnN0e3RoZW1lOnQscHJlZml4Om59PWUscj17bmV4dFBhcnQ6bmV3IE1hcCx2YWxpZGF0b3JzOltdfTtyZXR1cm4gJDIoT2JqZWN0LmVudHJpZXMoZS5jbGFzc0dyb3VwcyksbikuZm9yRWFjaCgoW28sbF0pPT57UXAobCxyLG8sdCl9KSxyfWZ1bmN0aW9uIFFwKGUsdCxuLHIpe2UuZm9yRWFjaChpPT57aWYodHlwZW9mIGk9PSJzdHJpbmciKXtjb25zdCBvPWk9PT0iIj90OmIwKHQsaSk7by5jbGFzc0dyb3VwSWQ9bjtyZXR1cm59aWYodHlwZW9mIGk9PSJmdW5jdGlvbiIpe2lmKGsyKGkpKXtRcChpKHIpLHQsbixyKTtyZXR1cm59dC52YWxpZGF0b3JzLnB1c2goe3ZhbGlkYXRvcjppLGNsYXNzR3JvdXBJZDpufSk7cmV0dXJufU9iamVjdC5lbnRyaWVzKGkpLmZvckVhY2goKFtvLGxdKT0+e1FwKGwsYjAodCxvKSxuLHIpfSl9KX1mdW5jdGlvbiBiMChlLHQpe2xldCBuPWU7cmV0dXJuIHQuc3BsaXQoWGcpLmZvckVhY2gocj0+e24ubmV4dFBhcnQuaGFzKHIpfHxuLm5leHRQYXJ0LnNldChyLHtuZXh0UGFydDpuZXcgTWFwLHZhbGlkYXRvcnM6W119KSxuPW4ubmV4dFBhcnQuZ2V0KHIpfSksbn1mdW5jdGlvbiBrMihlKXtyZXR1cm4gZS5pc1RoZW1lR2V0dGVyfWZ1bmN0aW9uICQyKGUsdCl7cmV0dXJuIHQ/ZS5tYXAoKFtuLHJdKT0+e2NvbnN0IGk9ci5tYXAobz0+dHlwZW9mIG89PSJzdHJpbmciP3Qrbzp0eXBlb2Ygbz09Im9iamVjdCI/T2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG8pLm1hcCgoW2wsc10pPT5bdCtsLHNdKSk6byk7cmV0dXJuW24saV19KTplfWZ1bmN0aW9uIGIyKGUpe2lmKGU8MSlyZXR1cm57Z2V0OigpPT57fSxzZXQ6KCk9Pnt9fTtsZXQgdD0wLG49bmV3IE1hcCxyPW5ldyBNYXA7ZnVuY3Rpb24gaShvLGwpe24uc2V0KG8sbCksdCsrLHQ+ZSYmKHQ9MCxyPW4sbj1uZXcgTWFwKX1yZXR1cm57Z2V0KG8pe2xldCBsPW4uZ2V0KG8pO2lmKGwhPT12b2lkIDApcmV0dXJuIGw7aWYoKGw9ci5nZXQobykpIT09dm9pZCAwKXJldHVybiBpKG8sbCksbH0sc2V0KG8sbCl7bi5oYXMobyk/bi5zZXQobyxsKTppKG8sbCl9fX1jb25zdCBkUz0iISI7ZnVuY3Rpb24gVDIoZSl7Y29uc3QgdD1lLnNlcGFyYXRvcixuPXQubGVuZ3RoPT09MSxyPXRbMF0saT10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24obCl7Y29uc3Qgcz1bXTtsZXQgYT0wLHU9MCxjO2ZvcihsZXQgZz0wO2c8bC5sZW5ndGg7ZysrKXtsZXQgdz1sW2ddO2lmKGE9PT0wKXtpZih3PT09ciYmKG58fGwuc2xpY2UoZyxnK2kpPT09dCkpe3MucHVzaChsLnNsaWNlKHUsZykpLHU9ZytpO2NvbnRpbnVlfWlmKHc9PT0iLyIpe2M9Zztjb250aW51ZX19dz09PSJbIj9hKys6dz09PSJdIiYmYS0tfWNvbnN0IGQ9cy5sZW5ndGg9PT0wP2w6bC5zdWJzdHJpbmcodSksZj1kLnN0YXJ0c1dpdGgoZFMpLGg9Zj9kLnN1YnN0cmluZygxKTpkLG09YyYmYz51P2MtdTp2b2lkIDA7cmV0dXJue21vZGlmaWVyczpzLGhhc0ltcG9ydGFudE1vZGlmaWVyOmYsYmFzZUNsYXNzTmFtZTpoLG1heWJlUG9zdGZpeE1vZGlmaWVyUG9zaXRpb246bX19fWZ1bmN0aW9uIE4yKGUpe2lmKGUubGVuZ3RoPD0xKXJldHVybiBlO2NvbnN0IHQ9W107bGV0IG49W107cmV0dXJuIGUuZm9yRWFjaChyPT57clswXT09PSJbIj8odC5wdXNoKC4uLm4uc29ydCgpLHIpLG49W10pOm4ucHVzaChyKX0pLHQucHVzaCguLi5uLnNvcnQoKSksdH1mdW5jdGlvbiBSMihlKXtyZXR1cm57Y2FjaGU6YjIoZS5jYWNoZVNpemUpLHNwbGl0TW9kaWZpZXJzOlQyKGUpLC4uLlMyKGUpfX1jb25zdCBPMj0vXHMrLztmdW5jdGlvbiBQMihlLHQpe2NvbnN0e3NwbGl0TW9kaWZpZXJzOm4sZ2V0Q2xhc3NHcm91cElkOnIsZ2V0Q29uZmxpY3RpbmdDbGFzc0dyb3VwSWRzOml9PXQsbz1uZXcgU2V0O3JldHVybiBlLnRyaW0oKS5zcGxpdChPMikubWFwKGw9Pntjb25zdHttb2RpZmllcnM6cyxoYXNJbXBvcnRhbnRNb2RpZmllcjphLGJhc2VDbGFzc05hbWU6dSxtYXliZVBvc3RmaXhNb2RpZmllclBvc2l0aW9uOmN9PW4obCk7bGV0IGQ9cihjP3Uuc3Vic3RyaW5nKDAsYyk6dSksZj0hIWM7aWYoIWQpe2lmKCFjKXJldHVybntpc1RhaWx3aW5kQ2xhc3M6ITEsb3JpZ2luYWxDbGFzc05hbWU6bH07aWYoZD1yKHUpLCFkKXJldHVybntpc1RhaWx3aW5kQ2xhc3M6ITEsb3JpZ2luYWxDbGFzc05hbWU6bH07Zj0hMX1jb25zdCBoPU4yKHMpLmpvaW4oIjoiKTtyZXR1cm57aXNUYWlsd2luZENsYXNzOiEwLG1vZGlmaWVySWQ6YT9oK2RTOmgsY2xhc3NHcm91cElkOmQsb3JpZ2luYWxDbGFzc05hbWU6bCxoYXNQb3N0Zml4TW9kaWZpZXI6Zn19KS5yZXZlcnNlKCkuZmlsdGVyKGw9PntpZighbC5pc1RhaWx3aW5kQ2xhc3MpcmV0dXJuITA7Y29uc3R7bW9kaWZpZXJJZDpzLGNsYXNzR3JvdXBJZDphLGhhc1Bvc3RmaXhNb2RpZmllcjp1fT1sLGM9cythO3JldHVybiBvLmhhcyhjKT8hMTooby5hZGQoYyksaShhLHUpLmZvckVhY2goZD0+by5hZGQocytkKSksITApfSkucmV2ZXJzZSgpLm1hcChsPT5sLm9yaWdpbmFsQ2xhc3NOYW1lKS5qb2luKCIgIil9ZnVuY3Rpb24gQTIoKXtsZXQgZT0wLHQsbixyPSIiO2Zvcig7ZTxhcmd1bWVudHMubGVuZ3RoOykodD1hcmd1bWVudHNbZSsrXSkmJihuPWZTKHQpKSYmKHImJihyKz0iICIpLHIrPW4pO3JldHVybiByfWZ1bmN0aW9uIGZTKGUpe2lmKHR5cGVvZiBlPT0ic3RyaW5nIilyZXR1cm4gZTtsZXQgdCxuPSIiO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKWVbcl0mJih0PWZTKGVbcl0pKSYmKG4mJihuKz0iICIpLG4rPXQpO3JldHVybiBufWZ1bmN0aW9uIE0yKGUsLi4udCl7bGV0IG4scixpLG89bDtmdW5jdGlvbiBsKGEpe2NvbnN0IHU9dC5yZWR1Y2UoKGMsZCk9PmQoYyksZSgpKTtyZXR1cm4gbj1SMih1KSxyPW4uY2FjaGUuZ2V0LGk9bi5jYWNoZS5zZXQsbz1zLHMoYSl9ZnVuY3Rpb24gcyhhKXtjb25zdCB1PXIoYSk7aWYodSlyZXR1cm4gdTtjb25zdCBjPVAyKGEsbik7cmV0dXJuIGkoYSxjKSxjfXJldHVybiBmdW5jdGlvbigpe3JldHVybiBvKEEyLmFwcGx5KG51bGwsYXJndW1lbnRzKSl9fWZ1bmN0aW9uIHFlKGUpe2NvbnN0IHQ9bj0+bltlXXx8W107cmV0dXJuIHQuaXNUaGVtZUdldHRlcj0hMCx0fWNvbnN0IGhTPS9eXFsoPzooW2Etei1dKyk6KT8oLispXF0kL2ksRDI9L15cZCtcL1xkKyQvLEwyPW5ldyBTZXQoWyJweCIsImZ1bGwiLCJzY3JlZW4iXSksSTI9L14oXGQrKFwuXGQrKT8pPyh4c3xzbXxtZHxsZ3x4bCkkLyxqMj0vXGQrKCV8cHh8cj9lbXxbc2RsXT92KFtod2liXXxtaW58bWF4KXxwdHxwY3xpbnxjbXxtbXxjYXB8Y2h8ZXh8cj9saHxjcSh3fGh8aXxifG1pbnxtYXgpKXxcYihjYWxjfG1pbnxtYXh8Y2xhbXApXCguK1wpfF4wJC8sejI9L14tPygoXGQrKT9cLj8oXGQrKVthLXpdK3wwKV8tPygoXGQrKT9cLj8oXGQrKVthLXpdK3wwKS8sRjI9L14odXJsfGltYWdlfGltYWdlLXNldHxjcm9zcy1mYWRlfGVsZW1lbnR8KHJlcGVhdGluZy0pPyhsaW5lYXJ8cmFkaWFsfGNvbmljKS1ncmFkaWVudClcKC4rXCkkLztmdW5jdGlvbiBocihlKXtyZXR1cm4gTW8oZSl8fEwyLmhhcyhlKXx8RDIudGVzdChlKX1mdW5jdGlvbiBUaShlKXtyZXR1cm4gQ3MoZSwibGVuZ3RoIixHMil9ZnVuY3Rpb24gTW8oZSl7cmV0dXJuISFlJiYhTnVtYmVyLmlzTmFOKE51bWJlcihlKSl9ZnVuY3Rpb24gcGMoZSl7cmV0dXJuIENzKGUsIm51bWJlciIsTW8pfWZ1bmN0aW9uIEpzKGUpe3JldHVybiEhZSYmTnVtYmVyLmlzSW50ZWdlcihOdW1iZXIoZSkpfWZ1bmN0aW9uIEIyKGUpe3JldHVybiBlLmVuZHNXaXRoKCIlIikmJk1vKGUuc2xpY2UoMCwtMSkpfWZ1bmN0aW9uIEVlKGUpe3JldHVybiBoUy50ZXN0KGUpfWZ1bmN0aW9uIE5pKGUpe3JldHVybiBJMi50ZXN0KGUpfWNvbnN0IFUyPW5ldyBTZXQoWyJsZW5ndGgiLCJzaXplIiwicGVyY2VudGFnZSJdKTtmdW5jdGlvbiBXMihlKXtyZXR1cm4gQ3MoZSxVMixwUyl9ZnVuY3Rpb24gVjIoZSl7cmV0dXJuIENzKGUsInBvc2l0aW9uIixwUyl9Y29uc3QgSDI9bmV3IFNldChbImltYWdlIiwidXJsIl0pO2Z1bmN0aW9uIEsyKGUpe3JldHVybiBDcyhlLEgyLFgyKX1mdW5jdGlvbiBaMihlKXtyZXR1cm4gQ3MoZSwiIixZMil9ZnVuY3Rpb24gcXMoKXtyZXR1cm4hMH1mdW5jdGlvbiBDcyhlLHQsbil7Y29uc3Qgcj1oUy5leGVjKGUpO3JldHVybiByP3JbMV0/dHlwZW9mIHQ9PSJzdHJpbmciP3JbMV09PT10OnQuaGFzKHJbMV0pOm4oclsyXSk6ITF9ZnVuY3Rpb24gRzIoZSl7cmV0dXJuIGoyLnRlc3QoZSl9ZnVuY3Rpb24gcFMoKXtyZXR1cm4hMX1mdW5jdGlvbiBZMihlKXtyZXR1cm4gejIudGVzdChlKX1mdW5jdGlvbiBYMihlKXtyZXR1cm4gRjIudGVzdChlKX1mdW5jdGlvbiBRMigpe2NvbnN0IGU9cWUoImNvbG9ycyIpLHQ9cWUoInNwYWNpbmciKSxuPXFlKCJibHVyIikscj1xZSgiYnJpZ2h0bmVzcyIpLGk9cWUoImJvcmRlckNvbG9yIiksbz1xZSgiYm9yZGVyUmFkaXVzIiksbD1xZSgiYm9yZGVyU3BhY2luZyIpLHM9cWUoImJvcmRlcldpZHRoIiksYT1xZSgiY29udHJhc3QiKSx1PXFlKCJncmF5c2NhbGUiKSxjPXFlKCJodWVSb3RhdGUiKSxkPXFlKCJpbnZlcnQiKSxmPXFlKCJnYXAiKSxoPXFlKCJncmFkaWVudENvbG9yU3RvcHMiKSxtPXFlKCJncmFkaWVudENvbG9yU3RvcFBvc2l0aW9ucyIpLGc9cWUoImluc2V0Iiksdz1xZSgibWFyZ2luIiksdj1xZSgib3BhY2l0eSIpLHk9cWUoInBhZGRpbmciKSxfPXFlKCJzYXR1cmF0ZSIpLFM9cWUoInNjYWxlIiksRT1xZSgic2VwaWEiKSwkPXFlKCJza2V3IiksQz1xZSgic3BhY2UiKSxUPXFlKCJ0cmFuc2xhdGUiKSxOPSgpPT5bImF1dG8iLCJjb250YWluIiwibm9uZSJdLFI9KCk9PlsiYXV0byIsImhpZGRlbiIsImNsaXAiLCJ2aXNpYmxlIiwic2Nyb2xsIl0sRD0oKT0+WyJhdXRvIixFZSx0XSxGPSgpPT5bRWUsdF0sc2U9KCk9PlsiIixocixUaV0sVj0oKT0+WyJhdXRvIixNbyxFZV0sSz0oKT0+WyJib3R0b20iLCJjZW50ZXIiLCJsZWZ0IiwibGVmdC1ib3R0b20iLCJsZWZ0LXRvcCIsInJpZ2h0IiwicmlnaHQtYm90dG9tIiwicmlnaHQtdG9wIiwidG9wIl0sTz0oKT0+WyJzb2xpZCIsImRhc2hlZCIsImRvdHRlZCIsImRvdWJsZSIsIm5vbmUiXSxBPSgpPT5bIm5vcm1hbCIsIm11bHRpcGx5Iiwic2NyZWVuIiwib3ZlcmxheSIsImRhcmtlbiIsImxpZ2h0ZW4iLCJjb2xvci1kb2RnZSIsImNvbG9yLWJ1cm4iLCJoYXJkLWxpZ2h0Iiwic29mdC1saWdodCIsImRpZmZlcmVuY2UiLCJleGNsdXNpb24iLCJodWUiLCJzYXR1cmF0aW9uIiwiY29sb3IiLCJsdW1pbm9zaXR5IiwicGx1cy1saWdodGVyIl0saz0oKT0+WyJzdGFydCIsImVuZCIsImNlbnRlciIsImJldHdlZW4iLCJhcm91bmQiLCJldmVubHkiLCJzdHJldGNoIl0saj0oKT0+WyIiLCIwIixFZV0sST0oKT0+WyJhdXRvIiwiYXZvaWQiLCJhbGwiLCJhdm9pZC1wYWdlIiwicGFnZSIsImxlZnQiLCJyaWdodCIsImNvbHVtbiJdLFo9KCk9PltNbyxwY10sbmU9KCk9PltNbyxFZV07cmV0dXJue2NhY2hlU2l6ZTo1MDAsc2VwYXJhdG9yOiI6Iix0aGVtZTp7Y29sb3JzOltxc10sc3BhY2luZzpbaHIsVGldLGJsdXI6WyJub25lIiwiIixOaSxFZV0sYnJpZ2h0bmVzczpaKCksYm9yZGVyQ29sb3I6W2VdLGJvcmRlclJhZGl1czpbIm5vbmUiLCIiLCJmdWxsIixOaSxFZV0sYm9yZGVyU3BhY2luZzpGKCksYm9yZGVyV2lkdGg6c2UoKSxjb250cmFzdDpaKCksZ3JheXNjYWxlOmooKSxodWVSb3RhdGU6bmUoKSxpbnZlcnQ6aigpLGdhcDpGKCksZ3JhZGllbnRDb2xvclN0b3BzOltlXSxncmFkaWVudENvbG9yU3RvcFBvc2l0aW9uczpbQjIsVGldLGluc2V0OkQoKSxtYXJnaW46RCgpLG9wYWNpdHk6WigpLHBhZGRpbmc6RigpLHNhdHVyYXRlOlooKSxzY2FsZTpaKCksc2VwaWE6aigpLHNrZXc6bmUoKSxzcGFjZTpGKCksdHJhbnNsYXRlOkYoKX0sY2xhc3NHcm91cHM6e2FzcGVjdDpbe2FzcGVjdDpbImF1dG8iLCJzcXVhcmUiLCJ2aWRlbyIsRWVdfV0sY29udGFpbmVyOlsiY29udGFpbmVyIl0sY29sdW1uczpbe2NvbHVtbnM6W05pXX1dLCJicmVhay1hZnRlciI6W3siYnJlYWstYWZ0ZXIiOkkoKX1dLCJicmVhay1iZWZvcmUiOlt7ImJyZWFrLWJlZm9yZSI6SSgpfV0sImJyZWFrLWluc2lkZSI6W3siYnJlYWstaW5zaWRlIjpbImF1dG8iLCJhdm9pZCIsImF2b2lkLXBhZ2UiLCJhdm9pZC1jb2x1bW4iXX1dLCJib3gtZGVjb3JhdGlvbiI6W3siYm94LWRlY29yYXRpb24iOlsic2xpY2UiLCJjbG9uZSJdfV0sYm94Olt7Ym94OlsiYm9yZGVyIiwiY29udGVudCJdfV0sZGlzcGxheTpbImJsb2NrIiwiaW5saW5lLWJsb2NrIiwiaW5saW5lIiwiZmxleCIsImlubGluZS1mbGV4IiwidGFibGUiLCJpbmxpbmUtdGFibGUiLCJ0YWJsZS1jYXB0aW9uIiwidGFibGUtY2VsbCIsInRhYmxlLWNvbHVtbiIsInRhYmxlLWNvbHVtbi1ncm91cCIsInRhYmxlLWZvb3Rlci1ncm91cCIsInRhYmxlLWhlYWRlci1ncm91cCIsInRhYmxlLXJvdy1ncm91cCIsInRhYmxlLXJvdyIsImZsb3ctcm9vdCIsImdyaWQiLCJpbmxpbmUtZ3JpZCIsImNvbnRlbnRzIiwibGlzdC1pdGVtIiwiaGlkZGVuIl0sZmxvYXQ6W3tmbG9hdDpbInJpZ2h0IiwibGVmdCIsIm5vbmUiXX1dLGNsZWFyOlt7Y2xlYXI6WyJsZWZ0IiwicmlnaHQiLCJib3RoIiwibm9uZSJdfV0saXNvbGF0aW9uOlsiaXNvbGF0ZSIsImlzb2xhdGlvbi1hdXRvIl0sIm9iamVjdC1maXQiOlt7b2JqZWN0OlsiY29udGFpbiIsImNvdmVyIiwiZmlsbCIsIm5vbmUiLCJzY2FsZS1kb3duIl19XSwib2JqZWN0LXBvc2l0aW9uIjpbe29iamVjdDpbLi4uSygpLEVlXX1dLG92ZXJmbG93Olt7b3ZlcmZsb3c6UigpfV0sIm92ZXJmbG93LXgiOlt7Im92ZXJmbG93LXgiOlIoKX1dLCJvdmVyZmxvdy15IjpbeyJvdmVyZmxvdy15IjpSKCl9XSxvdmVyc2Nyb2xsOlt7b3ZlcnNjcm9sbDpOKCl9XSwib3ZlcnNjcm9sbC14IjpbeyJvdmVyc2Nyb2xsLXgiOk4oKX1dLCJvdmVyc2Nyb2xsLXkiOlt7Im92ZXJzY3JvbGwteSI6TigpfV0scG9zaXRpb246WyJzdGF0aWMiLCJmaXhlZCIsImFic29sdXRlIiwicmVsYXRpdmUiLCJzdGlja3kiXSxpbnNldDpbe2luc2V0OltnXX1dLCJpbnNldC14IjpbeyJpbnNldC14IjpbZ119XSwiaW5zZXQteSI6W3siaW5zZXQteSI6W2ddfV0sc3RhcnQ6W3tzdGFydDpbZ119XSxlbmQ6W3tlbmQ6W2ddfV0sdG9wOlt7dG9wOltnXX1dLHJpZ2h0Olt7cmlnaHQ6W2ddfV0sYm90dG9tOlt7Ym90dG9tOltnXX1dLGxlZnQ6W3tsZWZ0OltnXX1dLHZpc2liaWxpdHk6WyJ2aXNpYmxlIiwiaW52aXNpYmxlIiwiY29sbGFwc2UiXSx6Olt7ejpbImF1dG8iLEpzLEVlXX1dLGJhc2lzOlt7YmFzaXM6RCgpfV0sImZsZXgtZGlyZWN0aW9uIjpbe2ZsZXg6WyJyb3ciLCJyb3ctcmV2ZXJzZSIsImNvbCIsImNvbC1yZXZlcnNlIl19XSwiZmxleC13cmFwIjpbe2ZsZXg6WyJ3cmFwIiwid3JhcC1yZXZlcnNlIiwibm93cmFwIl19XSxmbGV4Olt7ZmxleDpbIjEiLCJhdXRvIiwiaW5pdGlhbCIsIm5vbmUiLEVlXX1dLGdyb3c6W3tncm93OmooKX1dLHNocmluazpbe3NocmluazpqKCl9XSxvcmRlcjpbe29yZGVyOlsiZmlyc3QiLCJsYXN0Iiwibm9uZSIsSnMsRWVdfV0sImdyaWQtY29scyI6W3siZ3JpZC1jb2xzIjpbcXNdfV0sImNvbC1zdGFydC1lbmQiOlt7Y29sOlsiYXV0byIse3NwYW46WyJmdWxsIixKcyxFZV19LEVlXX1dLCJjb2wtc3RhcnQiOlt7ImNvbC1zdGFydCI6VigpfV0sImNvbC1lbmQiOlt7ImNvbC1lbmQiOlYoKX1dLCJncmlkLXJvd3MiOlt7ImdyaWQtcm93cyI6W3FzXX1dLCJyb3ctc3RhcnQtZW5kIjpbe3JvdzpbImF1dG8iLHtzcGFuOltKcyxFZV19LEVlXX1dLCJyb3ctc3RhcnQiOlt7InJvdy1zdGFydCI6VigpfV0sInJvdy1lbmQiOlt7InJvdy1lbmQiOlYoKX1dLCJncmlkLWZsb3ciOlt7ImdyaWQtZmxvdyI6WyJyb3ciLCJjb2wiLCJkZW5zZSIsInJvdy1kZW5zZSIsImNvbC1kZW5zZSJdfV0sImF1dG8tY29scyI6W3siYXV0by1jb2xzIjpbImF1dG8iLCJtaW4iLCJtYXgiLCJmciIsRWVdfV0sImF1dG8tcm93cyI6W3siYXV0by1yb3dzIjpbImF1dG8iLCJtaW4iLCJtYXgiLCJmciIsRWVdfV0sZ2FwOlt7Z2FwOltmXX1dLCJnYXAteCI6W3siZ2FwLXgiOltmXX1dLCJnYXAteSI6W3siZ2FwLXkiOltmXX1dLCJqdXN0aWZ5LWNvbnRlbnQiOlt7anVzdGlmeTpbIm5vcm1hbCIsLi4uaygpXX1dLCJqdXN0aWZ5LWl0ZW1zIjpbeyJqdXN0aWZ5LWl0ZW1zIjpbInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwic3RyZXRjaCJdfV0sImp1c3RpZnktc2VsZiI6W3sianVzdGlmeS1zZWxmIjpbImF1dG8iLCJzdGFydCIsImVuZCIsImNlbnRlciIsInN0cmV0Y2giXX1dLCJhbGlnbi1jb250ZW50Ijpbe2NvbnRlbnQ6WyJub3JtYWwiLC4uLmsoKSwiYmFzZWxpbmUiXX1dLCJhbGlnbi1pdGVtcyI6W3tpdGVtczpbInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwiYmFzZWxpbmUiLCJzdHJldGNoIl19XSwiYWxpZ24tc2VsZiI6W3tzZWxmOlsiYXV0byIsInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwic3RyZXRjaCIsImJhc2VsaW5lIl19XSwicGxhY2UtY29udGVudCI6W3sicGxhY2UtY29udGVudCI6Wy4uLmsoKSwiYmFzZWxpbmUiXX1dLCJwbGFjZS1pdGVtcyI6W3sicGxhY2UtaXRlbXMiOlsic3RhcnQiLCJlbmQiLCJjZW50ZXIiLCJiYXNlbGluZSIsInN0cmV0Y2giXX1dLCJwbGFjZS1zZWxmIjpbeyJwbGFjZS1zZWxmIjpbImF1dG8iLCJzdGFydCIsImVuZCIsImNlbnRlciIsInN0cmV0Y2giXX1dLHA6W3twOlt5XX1dLHB4Olt7cHg6W3ldfV0scHk6W3tweTpbeV19XSxwczpbe3BzOlt5XX1dLHBlOlt7cGU6W3ldfV0scHQ6W3twdDpbeV19XSxwcjpbe3ByOlt5XX1dLHBiOlt7cGI6W3ldfV0scGw6W3twbDpbeV19XSxtOlt7bTpbd119XSxteDpbe214Olt3XX1dLG15Olt7bXk6W3ddfV0sbXM6W3ttczpbd119XSxtZTpbe21lOlt3XX1dLG10Olt7bXQ6W3ddfV0sbXI6W3ttcjpbd119XSxtYjpbe21iOlt3XX1dLG1sOlt7bWw6W3ddfV0sInNwYWNlLXgiOlt7InNwYWNlLXgiOltDXX1dLCJzcGFjZS14LXJldmVyc2UiOlsic3BhY2UteC1yZXZlcnNlIl0sInNwYWNlLXkiOlt7InNwYWNlLXkiOltDXX1dLCJzcGFjZS15LXJldmVyc2UiOlsic3BhY2UteS1yZXZlcnNlIl0sdzpbe3c6WyJhdXRvIiwibWluIiwibWF4IiwiZml0IixFZSx0XX1dLCJtaW4tdyI6W3sibWluLXciOlsibWluIiwibWF4IiwiZml0IixFZSxocl19XSwibWF4LXciOlt7Im1heC13IjpbIjAiLCJub25lIiwiZnVsbCIsIm1pbiIsIm1heCIsImZpdCIsInByb3NlIix7c2NyZWVuOltOaV19LE5pLEVlXX1dLGg6W3toOltFZSx0LCJhdXRvIiwibWluIiwibWF4IiwiZml0Il19XSwibWluLWgiOlt7Im1pbi1oIjpbIm1pbiIsIm1heCIsImZpdCIsaHIsRWVdfV0sIm1heC1oIjpbeyJtYXgtaCI6W0VlLHQsIm1pbiIsIm1heCIsImZpdCJdfV0sImZvbnQtc2l6ZSI6W3t0ZXh0OlsiYmFzZSIsTmksVGldfV0sImZvbnQtc21vb3RoaW5nIjpbImFudGlhbGlhc2VkIiwic3VicGl4ZWwtYW50aWFsaWFzZWQiXSwiZm9udC1zdHlsZSI6WyJpdGFsaWMiLCJub3QtaXRhbGljIl0sImZvbnQtd2VpZ2h0Ijpbe2ZvbnQ6WyJ0aGluIiwiZXh0cmFsaWdodCIsImxpZ2h0Iiwibm9ybWFsIiwibWVkaXVtIiwic2VtaWJvbGQiLCJib2xkIiwiZXh0cmFib2xkIiwiYmxhY2siLHBjXX1dLCJmb250LWZhbWlseSI6W3tmb250Oltxc119XSwiZnZuLW5vcm1hbCI6WyJub3JtYWwtbnVtcyJdLCJmdm4tb3JkaW5hbCI6WyJvcmRpbmFsIl0sImZ2bi1zbGFzaGVkLXplcm8iOlsic2xhc2hlZC16ZXJvIl0sImZ2bi1maWd1cmUiOlsibGluaW5nLW51bXMiLCJvbGRzdHlsZS1udW1zIl0sImZ2bi1zcGFjaW5nIjpbInByb3BvcnRpb25hbC1udW1zIiwidGFidWxhci1udW1zIl0sImZ2bi1mcmFjdGlvbiI6WyJkaWFnb25hbC1mcmFjdGlvbnMiLCJzdGFja2VkLWZyYWN0b25zIl0sdHJhY2tpbmc6W3t0cmFja2luZzpbInRpZ2h0ZXIiLCJ0aWdodCIsIm5vcm1hbCIsIndpZGUiLCJ3aWRlciIsIndpZGVzdCIsRWVdfV0sImxpbmUtY2xhbXAiOlt7ImxpbmUtY2xhbXAiOlsibm9uZSIsTW8scGNdfV0sbGVhZGluZzpbe2xlYWRpbmc6WyJub25lIiwidGlnaHQiLCJzbnVnIiwibm9ybWFsIiwicmVsYXhlZCIsImxvb3NlIixocixFZV19XSwibGlzdC1pbWFnZSI6W3sibGlzdC1pbWFnZSI6WyJub25lIixFZV19XSwibGlzdC1zdHlsZS10eXBlIjpbe2xpc3Q6WyJub25lIiwiZGlzYyIsImRlY2ltYWwiLEVlXX1dLCJsaXN0LXN0eWxlLXBvc2l0aW9uIjpbe2xpc3Q6WyJpbnNpZGUiLCJvdXRzaWRlIl19XSwicGxhY2Vob2xkZXItY29sb3IiOlt7cGxhY2Vob2xkZXI6W2VdfV0sInBsYWNlaG9sZGVyLW9wYWNpdHkiOlt7InBsYWNlaG9sZGVyLW9wYWNpdHkiOlt2XX1dLCJ0ZXh0LWFsaWdubWVudCI6W3t0ZXh0OlsibGVmdCIsImNlbnRlciIsInJpZ2h0IiwianVzdGlmeSIsInN0YXJ0IiwiZW5kIl19XSwidGV4dC1jb2xvciI6W3t0ZXh0OltlXX1dLCJ0ZXh0LW9wYWNpdHkiOlt7InRleHQtb3BhY2l0eSI6W3ZdfV0sInRleHQtZGVjb3JhdGlvbiI6WyJ1bmRlcmxpbmUiLCJvdmVybGluZSIsImxpbmUtdGhyb3VnaCIsIm5vLXVuZGVybGluZSJdLCJ0ZXh0LWRlY29yYXRpb24tc3R5bGUiOlt7ZGVjb3JhdGlvbjpbLi4uTygpLCJ3YXZ5Il19XSwidGV4dC1kZWNvcmF0aW9uLXRoaWNrbmVzcyI6W3tkZWNvcmF0aW9uOlsiYXV0byIsImZyb20tZm9udCIsaHIsVGldfV0sInVuZGVybGluZS1vZmZzZXQiOlt7InVuZGVybGluZS1vZmZzZXQiOlsiYXV0byIsaHIsRWVdfV0sInRleHQtZGVjb3JhdGlvbi1jb2xvciI6W3tkZWNvcmF0aW9uOltlXX1dLCJ0ZXh0LXRyYW5zZm9ybSI6WyJ1cHBlcmNhc2UiLCJsb3dlcmNhc2UiLCJjYXBpdGFsaXplIiwibm9ybWFsLWNhc2UiXSwidGV4dC1vdmVyZmxvdyI6WyJ0cnVuY2F0ZSIsInRleHQtZWxsaXBzaXMiLCJ0ZXh0LWNsaXAiXSxpbmRlbnQ6W3tpbmRlbnQ6RigpfV0sInZlcnRpY2FsLWFsaWduIjpbe2FsaWduOlsiYmFzZWxpbmUiLCJ0b3AiLCJtaWRkbGUiLCJib3R0b20iLCJ0ZXh0LXRvcCIsInRleHQtYm90dG9tIiwic3ViIiwic3VwZXIiLEVlXX1dLHdoaXRlc3BhY2U6W3t3aGl0ZXNwYWNlOlsibm9ybWFsIiwibm93cmFwIiwicHJlIiwicHJlLWxpbmUiLCJwcmUtd3JhcCIsImJyZWFrLXNwYWNlcyJdfV0sYnJlYWs6W3ticmVhazpbIm5vcm1hbCIsIndvcmRzIiwiYWxsIiwia2VlcCJdfV0saHlwaGVuczpbe2h5cGhlbnM6WyJub25lIiwibWFudWFsIiwiYXV0byJdfV0sY29udGVudDpbe2NvbnRlbnQ6WyJub25lIixFZV19XSwiYmctYXR0YWNobWVudCI6W3tiZzpbImZpeGVkIiwibG9jYWwiLCJzY3JvbGwiXX1dLCJiZy1jbGlwIjpbeyJiZy1jbGlwIjpbImJvcmRlciIsInBhZGRpbmciLCJjb250ZW50IiwidGV4dCJdfV0sImJnLW9wYWNpdHkiOlt7ImJnLW9wYWNpdHkiOlt2XX1dLCJiZy1vcmlnaW4iOlt7ImJnLW9yaWdpbiI6WyJib3JkZXIiLCJwYWRkaW5nIiwiY29udGVudCJdfV0sImJnLXBvc2l0aW9uIjpbe2JnOlsuLi5LKCksVjJdfV0sImJnLXJlcGVhdCI6W3tiZzpbIm5vLXJlcGVhdCIse3JlcGVhdDpbIiIsIngiLCJ5Iiwicm91bmQiLCJzcGFjZSJdfV19XSwiYmctc2l6ZSI6W3tiZzpbImF1dG8iLCJjb3ZlciIsImNvbnRhaW4iLFcyXX1dLCJiZy1pbWFnZSI6W3tiZzpbIm5vbmUiLHsiZ3JhZGllbnQtdG8iOlsidCIsInRyIiwiciIsImJyIiwiYiIsImJsIiwibCIsInRsIl19LEsyXX1dLCJiZy1jb2xvciI6W3tiZzpbZV19XSwiZ3JhZGllbnQtZnJvbS1wb3MiOlt7ZnJvbTpbbV19XSwiZ3JhZGllbnQtdmlhLXBvcyI6W3t2aWE6W21dfV0sImdyYWRpZW50LXRvLXBvcyI6W3t0bzpbbV19XSwiZ3JhZGllbnQtZnJvbSI6W3tmcm9tOltoXX1dLCJncmFkaWVudC12aWEiOlt7dmlhOltoXX1dLCJncmFkaWVudC10byI6W3t0bzpbaF19XSxyb3VuZGVkOlt7cm91bmRlZDpbb119XSwicm91bmRlZC1zIjpbeyJyb3VuZGVkLXMiOltvXX1dLCJyb3VuZGVkLWUiOlt7InJvdW5kZWQtZSI6W29dfV0sInJvdW5kZWQtdCI6W3sicm91bmRlZC10Ijpbb119XSwicm91bmRlZC1yIjpbeyJyb3VuZGVkLXIiOltvXX1dLCJyb3VuZGVkLWIiOlt7InJvdW5kZWQtYiI6W29dfV0sInJvdW5kZWQtbCI6W3sicm91bmRlZC1sIjpbb119XSwicm91bmRlZC1zcyI6W3sicm91bmRlZC1zcyI6W29dfV0sInJvdW5kZWQtc2UiOlt7InJvdW5kZWQtc2UiOltvXX1dLCJyb3VuZGVkLWVlIjpbeyJyb3VuZGVkLWVlIjpbb119XSwicm91bmRlZC1lcyI6W3sicm91bmRlZC1lcyI6W29dfV0sInJvdW5kZWQtdGwiOlt7InJvdW5kZWQtdGwiOltvXX1dLCJyb3VuZGVkLXRyIjpbeyJyb3VuZGVkLXRyIjpbb119XSwicm91bmRlZC1iciI6W3sicm91bmRlZC1iciI6W29dfV0sInJvdW5kZWQtYmwiOlt7InJvdW5kZWQtYmwiOltvXX1dLCJib3JkZXItdyI6W3tib3JkZXI6W3NdfV0sImJvcmRlci13LXgiOlt7ImJvcmRlci14Ijpbc119XSwiYm9yZGVyLXcteSI6W3siYm9yZGVyLXkiOltzXX1dLCJib3JkZXItdy1zIjpbeyJib3JkZXItcyI6W3NdfV0sImJvcmRlci13LWUiOlt7ImJvcmRlci1lIjpbc119XSwiYm9yZGVyLXctdCI6W3siYm9yZGVyLXQiOltzXX1dLCJib3JkZXItdy1yIjpbeyJib3JkZXItciI6W3NdfV0sImJvcmRlci13LWIiOlt7ImJvcmRlci1iIjpbc119XSwiYm9yZGVyLXctbCI6W3siYm9yZGVyLWwiOltzXX1dLCJib3JkZXItb3BhY2l0eSI6W3siYm9yZGVyLW9wYWNpdHkiOlt2XX1dLCJib3JkZXItc3R5bGUiOlt7Ym9yZGVyOlsuLi5PKCksImhpZGRlbiJdfV0sImRpdmlkZS14IjpbeyJkaXZpZGUteCI6W3NdfV0sImRpdmlkZS14LXJldmVyc2UiOlsiZGl2aWRlLXgtcmV2ZXJzZSJdLCJkaXZpZGUteSI6W3siZGl2aWRlLXkiOltzXX1dLCJkaXZpZGUteS1yZXZlcnNlIjpbImRpdmlkZS15LXJldmVyc2UiXSwiZGl2aWRlLW9wYWNpdHkiOlt7ImRpdmlkZS1vcGFjaXR5Ijpbdl19XSwiZGl2aWRlLXN0eWxlIjpbe2RpdmlkZTpPKCl9XSwiYm9yZGVyLWNvbG9yIjpbe2JvcmRlcjpbaV19XSwiYm9yZGVyLWNvbG9yLXgiOlt7ImJvcmRlci14IjpbaV19XSwiYm9yZGVyLWNvbG9yLXkiOlt7ImJvcmRlci15IjpbaV19XSwiYm9yZGVyLWNvbG9yLXQiOlt7ImJvcmRlci10IjpbaV19XSwiYm9yZGVyLWNvbG9yLXIiOlt7ImJvcmRlci1yIjpbaV19XSwiYm9yZGVyLWNvbG9yLWIiOlt7ImJvcmRlci1iIjpbaV19XSwiYm9yZGVyLWNvbG9yLWwiOlt7ImJvcmRlci1sIjpbaV19XSwiZGl2aWRlLWNvbG9yIjpbe2RpdmlkZTpbaV19XSwib3V0bGluZS1zdHlsZSI6W3tvdXRsaW5lOlsiIiwuLi5PKCldfV0sIm91dGxpbmUtb2Zmc2V0IjpbeyJvdXRsaW5lLW9mZnNldCI6W2hyLEVlXX1dLCJvdXRsaW5lLXciOlt7b3V0bGluZTpbaHIsVGldfV0sIm91dGxpbmUtY29sb3IiOlt7b3V0bGluZTpbZV19XSwicmluZy13Ijpbe3Jpbmc6c2UoKX1dLCJyaW5nLXctaW5zZXQiOlsicmluZy1pbnNldCJdLCJyaW5nLWNvbG9yIjpbe3Jpbmc6W2VdfV0sInJpbmctb3BhY2l0eSI6W3sicmluZy1vcGFjaXR5Ijpbdl19XSwicmluZy1vZmZzZXQtdyI6W3sicmluZy1vZmZzZXQiOltocixUaV19XSwicmluZy1vZmZzZXQtY29sb3IiOlt7InJpbmctb2Zmc2V0IjpbZV19XSxzaGFkb3c6W3tzaGFkb3c6WyIiLCJpbm5lciIsIm5vbmUiLE5pLFoyXX1dLCJzaGFkb3ctY29sb3IiOlt7c2hhZG93Oltxc119XSxvcGFjaXR5Olt7b3BhY2l0eTpbdl19XSwibWl4LWJsZW5kIjpbeyJtaXgtYmxlbmQiOkEoKX1dLCJiZy1ibGVuZCI6W3siYmctYmxlbmQiOkEoKX1dLGZpbHRlcjpbe2ZpbHRlcjpbIiIsIm5vbmUiXX1dLGJsdXI6W3tibHVyOltuXX1dLGJyaWdodG5lc3M6W3ticmlnaHRuZXNzOltyXX1dLGNvbnRyYXN0Olt7Y29udHJhc3Q6W2FdfV0sImRyb3Atc2hhZG93IjpbeyJkcm9wLXNoYWRvdyI6WyIiLCJub25lIixOaSxFZV19XSxncmF5c2NhbGU6W3tncmF5c2NhbGU6W3VdfV0sImh1ZS1yb3RhdGUiOlt7Imh1ZS1yb3RhdGUiOltjXX1dLGludmVydDpbe2ludmVydDpbZF19XSxzYXR1cmF0ZTpbe3NhdHVyYXRlOltfXX1dLHNlcGlhOlt7c2VwaWE6W0VdfV0sImJhY2tkcm9wLWZpbHRlciI6W3siYmFja2Ryb3AtZmlsdGVyIjpbIiIsIm5vbmUiXX1dLCJiYWNrZHJvcC1ibHVyIjpbeyJiYWNrZHJvcC1ibHVyIjpbbl19XSwiYmFja2Ryb3AtYnJpZ2h0bmVzcyI6W3siYmFja2Ryb3AtYnJpZ2h0bmVzcyI6W3JdfV0sImJhY2tkcm9wLWNvbnRyYXN0IjpbeyJiYWNrZHJvcC1jb250cmFzdCI6W2FdfV0sImJhY2tkcm9wLWdyYXlzY2FsZSI6W3siYmFja2Ryb3AtZ3JheXNjYWxlIjpbdV19XSwiYmFja2Ryb3AtaHVlLXJvdGF0ZSI6W3siYmFja2Ryb3AtaHVlLXJvdGF0ZSI6W2NdfV0sImJhY2tkcm9wLWludmVydCI6W3siYmFja2Ryb3AtaW52ZXJ0IjpbZF19XSwiYmFja2Ryb3Atb3BhY2l0eSI6W3siYmFja2Ryb3Atb3BhY2l0eSI6W3ZdfV0sImJhY2tkcm9wLXNhdHVyYXRlIjpbeyJiYWNrZHJvcC1zYXR1cmF0ZSI6W19dfV0sImJhY2tkcm9wLXNlcGlhIjpbeyJiYWNrZHJvcC1zZXBpYSI6W0VdfV0sImJvcmRlci1jb2xsYXBzZSI6W3tib3JkZXI6WyJjb2xsYXBzZSIsInNlcGFyYXRlIl19XSwiYm9yZGVyLXNwYWNpbmciOlt7ImJvcmRlci1zcGFjaW5nIjpbbF19XSwiYm9yZGVyLXNwYWNpbmcteCI6W3siYm9yZGVyLXNwYWNpbmcteCI6W2xdfV0sImJvcmRlci1zcGFjaW5nLXkiOlt7ImJvcmRlci1zcGFjaW5nLXkiOltsXX1dLCJ0YWJsZS1sYXlvdXQiOlt7dGFibGU6WyJhdXRvIiwiZml4ZWQiXX1dLGNhcHRpb246W3tjYXB0aW9uOlsidG9wIiwiYm90dG9tIl19XSx0cmFuc2l0aW9uOlt7dHJhbnNpdGlvbjpbIm5vbmUiLCJhbGwiLCIiLCJjb2xvcnMiLCJvcGFjaXR5Iiwic2hhZG93IiwidHJhbnNmb3JtIixFZV19XSxkdXJhdGlvbjpbe2R1cmF0aW9uOm5lKCl9XSxlYXNlOlt7ZWFzZTpbImxpbmVhciIsImluIiwib3V0IiwiaW4tb3V0IixFZV19XSxkZWxheTpbe2RlbGF5Om5lKCl9XSxhbmltYXRlOlt7YW5pbWF0ZTpbIm5vbmUiLCJzcGluIiwicGluZyIsInB1bHNlIiwiYm91bmNlIixFZV19XSx0cmFuc2Zvcm06W3t0cmFuc2Zvcm06WyIiLCJncHUiLCJub25lIl19XSxzY2FsZTpbe3NjYWxlOltTXX1dLCJzY2FsZS14IjpbeyJzY2FsZS14IjpbU119XSwic2NhbGUteSI6W3sic2NhbGUteSI6W1NdfV0scm90YXRlOlt7cm90YXRlOltKcyxFZV19XSwidHJhbnNsYXRlLXgiOlt7InRyYW5zbGF0ZS14IjpbVF19XSwidHJhbnNsYXRlLXkiOlt7InRyYW5zbGF0ZS15IjpbVF19XSwic2tldy14IjpbeyJza2V3LXgiOlskXX1dLCJza2V3LXkiOlt7InNrZXcteSI6WyRdfV0sInRyYW5zZm9ybS1vcmlnaW4iOlt7b3JpZ2luOlsiY2VudGVyIiwidG9wIiwidG9wLXJpZ2h0IiwicmlnaHQiLCJib3R0b20tcmlnaHQiLCJib3R0b20iLCJib3R0b20tbGVmdCIsImxlZnQiLCJ0b3AtbGVmdCIsRWVdfV0sYWNjZW50Olt7YWNjZW50OlsiYXV0byIsZV19XSxhcHBlYXJhbmNlOlsiYXBwZWFyYW5jZS1ub25lIl0sY3Vyc29yOlt7Y3Vyc29yOlsiYXV0byIsImRlZmF1bHQiLCJwb2ludGVyIiwid2FpdCIsInRleHQiLCJtb3ZlIiwiaGVscCIsIm5vdC1hbGxvd2VkIiwibm9uZSIsImNvbnRleHQtbWVudSIsInByb2dyZXNzIiwiY2VsbCIsImNyb3NzaGFpciIsInZlcnRpY2FsLXRleHQiLCJhbGlhcyIsImNvcHkiLCJuby1kcm9wIiwiZ3JhYiIsImdyYWJiaW5nIiwiYWxsLXNjcm9sbCIsImNvbC1yZXNpemUiLCJyb3ctcmVzaXplIiwibi1yZXNpemUiLCJlLXJlc2l6ZSIsInMtcmVzaXplIiwidy1yZXNpemUiLCJuZS1yZXNpemUiLCJudy1yZXNpemUiLCJzZS1yZXNpemUiLCJzdy1yZXNpemUiLCJldy1yZXNpemUiLCJucy1yZXNpemUiLCJuZXN3LXJlc2l6ZSIsIm53c2UtcmVzaXplIiwiem9vbS1pbiIsInpvb20tb3V0IixFZV19XSwiY2FyZXQtY29sb3IiOlt7Y2FyZXQ6W2VdfV0sInBvaW50ZXItZXZlbnRzIjpbeyJwb2ludGVyLWV2ZW50cyI6WyJub25lIiwiYXV0byJdfV0scmVzaXplOlt7cmVzaXplOlsibm9uZSIsInkiLCJ4IiwiIl19XSwic2Nyb2xsLWJlaGF2aW9yIjpbe3Njcm9sbDpbImF1dG8iLCJzbW9vdGgiXX1dLCJzY3JvbGwtbSI6W3sic2Nyb2xsLW0iOkYoKX1dLCJzY3JvbGwtbXgiOlt7InNjcm9sbC1teCI6RigpfV0sInNjcm9sbC1teSI6W3sic2Nyb2xsLW15IjpGKCl9XSwic2Nyb2xsLW1zIjpbeyJzY3JvbGwtbXMiOkYoKX1dLCJzY3JvbGwtbWUiOlt7InNjcm9sbC1tZSI6RigpfV0sInNjcm9sbC1tdCI6W3sic2Nyb2xsLW10IjpGKCl9XSwic2Nyb2xsLW1yIjpbeyJzY3JvbGwtbXIiOkYoKX1dLCJzY3JvbGwtbWIiOlt7InNjcm9sbC1tYiI6RigpfV0sInNjcm9sbC1tbCI6W3sic2Nyb2xsLW1sIjpGKCl9XSwic2Nyb2xsLXAiOlt7InNjcm9sbC1wIjpGKCl9XSwic2Nyb2xsLXB4IjpbeyJzY3JvbGwtcHgiOkYoKX1dLCJzY3JvbGwtcHkiOlt7InNjcm9sbC1weSI6RigpfV0sInNjcm9sbC1wcyI6W3sic2Nyb2xsLXBzIjpGKCl9XSwic2Nyb2xsLXBlIjpbeyJzY3JvbGwtcGUiOkYoKX1dLCJzY3JvbGwtcHQiOlt7InNjcm9sbC1wdCI6RigpfV0sInNjcm9sbC1wciI6W3sic2Nyb2xsLXByIjpGKCl9XSwic2Nyb2xsLXBiIjpbeyJzY3JvbGwtcGIiOkYoKX1dLCJzY3JvbGwtcGwiOlt7InNjcm9sbC1wbCI6RigpfV0sInNuYXAtYWxpZ24iOlt7c25hcDpbInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwiYWxpZ24tbm9uZSJdfV0sInNuYXAtc3RvcCI6W3tzbmFwOlsibm9ybWFsIiwiYWx3YXlzIl19XSwic25hcC10eXBlIjpbe3NuYXA6WyJub25lIiwieCIsInkiLCJib3RoIl19XSwic25hcC1zdHJpY3RuZXNzIjpbe3NuYXA6WyJtYW5kYXRvcnkiLCJwcm94aW1pdHkiXX1dLHRvdWNoOlt7dG91Y2g6WyJhdXRvIiwibm9uZSIsIm1hbmlwdWxhdGlvbiJdfV0sInRvdWNoLXgiOlt7InRvdWNoLXBhbiI6WyJ4IiwibGVmdCIsInJpZ2h0Il19XSwidG91Y2gteSI6W3sidG91Y2gtcGFuIjpbInkiLCJ1cCIsImRvd24iXX1dLCJ0b3VjaC1weiI6WyJ0b3VjaC1waW5jaC16b29tIl0sc2VsZWN0Olt7c2VsZWN0Olsibm9uZSIsInRleHQiLCJhbGwiLCJhdXRvIl19XSwid2lsbC1jaGFuZ2UiOlt7IndpbGwtY2hhbmdlIjpbImF1dG8iLCJzY3JvbGwiLCJjb250ZW50cyIsInRyYW5zZm9ybSIsRWVdfV0sZmlsbDpbe2ZpbGw6W2UsIm5vbmUiXX1dLCJzdHJva2UtdyI6W3tzdHJva2U6W2hyLFRpLHBjXX1dLHN0cm9rZTpbe3N0cm9rZTpbZSwibm9uZSJdfV0sc3I6WyJzci1vbmx5Iiwibm90LXNyLW9ubHkiXX0sY29uZmxpY3RpbmdDbGFzc0dyb3Vwczp7b3ZlcmZsb3c6WyJvdmVyZmxvdy14Iiwib3ZlcmZsb3cteSJdLG92ZXJzY3JvbGw6WyJvdmVyc2Nyb2xsLXgiLCJvdmVyc2Nyb2xsLXkiXSxpbnNldDpbImluc2V0LXgiLCJpbnNldC15Iiwic3RhcnQiLCJlbmQiLCJ0b3AiLCJyaWdodCIsImJvdHRvbSIsImxlZnQiXSwiaW5zZXQteCI6WyJyaWdodCIsImxlZnQiXSwiaW5zZXQteSI6WyJ0b3AiLCJib3R0b20iXSxmbGV4OlsiYmFzaXMiLCJncm93Iiwic2hyaW5rIl0sZ2FwOlsiZ2FwLXgiLCJnYXAteSJdLHA6WyJweCIsInB5IiwicHMiLCJwZSIsInB0IiwicHIiLCJwYiIsInBsIl0scHg6WyJwciIsInBsIl0scHk6WyJwdCIsInBiIl0sbTpbIm14IiwibXkiLCJtcyIsIm1lIiwibXQiLCJtciIsIm1iIiwibWwiXSxteDpbIm1yIiwibWwiXSxteTpbIm10IiwibWIiXSwiZm9udC1zaXplIjpbImxlYWRpbmciXSwiZnZuLW5vcm1hbCI6WyJmdm4tb3JkaW5hbCIsImZ2bi1zbGFzaGVkLXplcm8iLCJmdm4tZmlndXJlIiwiZnZuLXNwYWNpbmciLCJmdm4tZnJhY3Rpb24iXSwiZnZuLW9yZGluYWwiOlsiZnZuLW5vcm1hbCJdLCJmdm4tc2xhc2hlZC16ZXJvIjpbImZ2bi1ub3JtYWwiXSwiZnZuLWZpZ3VyZSI6WyJmdm4tbm9ybWFsIl0sImZ2bi1zcGFjaW5nIjpbImZ2bi1ub3JtYWwiXSwiZnZuLWZyYWN0aW9uIjpbImZ2bi1ub3JtYWwiXSxyb3VuZGVkOlsicm91bmRlZC1zIiwicm91bmRlZC1lIiwicm91bmRlZC10Iiwicm91bmRlZC1yIiwicm91bmRlZC1iIiwicm91bmRlZC1sIiwicm91bmRlZC1zcyIsInJvdW5kZWQtc2UiLCJyb3VuZGVkLWVlIiwicm91bmRlZC1lcyIsInJvdW5kZWQtdGwiLCJyb3VuZGVkLXRyIiwicm91bmRlZC1iciIsInJvdW5kZWQtYmwiXSwicm91bmRlZC1zIjpbInJvdW5kZWQtc3MiLCJyb3VuZGVkLWVzIl0sInJvdW5kZWQtZSI6WyJyb3VuZGVkLXNlIiwicm91bmRlZC1lZSJdLCJyb3VuZGVkLXQiOlsicm91bmRlZC10bCIsInJvdW5kZWQtdHIiXSwicm91bmRlZC1yIjpbInJvdW5kZWQtdHIiLCJyb3VuZGVkLWJyIl0sInJvdW5kZWQtYiI6WyJyb3VuZGVkLWJyIiwicm91bmRlZC1ibCJdLCJyb3VuZGVkLWwiOlsicm91bmRlZC10bCIsInJvdW5kZWQtYmwiXSwiYm9yZGVyLXNwYWNpbmciOlsiYm9yZGVyLXNwYWNpbmcteCIsImJvcmRlci1zcGFjaW5nLXkiXSwiYm9yZGVyLXciOlsiYm9yZGVyLXctcyIsImJvcmRlci13LWUiLCJib3JkZXItdy10IiwiYm9yZGVyLXctciIsImJvcmRlci13LWIiLCJib3JkZXItdy1sIl0sImJvcmRlci13LXgiOlsiYm9yZGVyLXctciIsImJvcmRlci13LWwiXSwiYm9yZGVyLXcteSI6WyJib3JkZXItdy10IiwiYm9yZGVyLXctYiJdLCJib3JkZXItY29sb3IiOlsiYm9yZGVyLWNvbG9yLXQiLCJib3JkZXItY29sb3ItciIsImJvcmRlci1jb2xvci1iIiwiYm9yZGVyLWNvbG9yLWwiXSwiYm9yZGVyLWNvbG9yLXgiOlsiYm9yZGVyLWNvbG9yLXIiLCJib3JkZXItY29sb3ItbCJdLCJib3JkZXItY29sb3IteSI6WyJib3JkZXItY29sb3ItdCIsImJvcmRlci1jb2xvci1iIl0sInNjcm9sbC1tIjpbInNjcm9sbC1teCIsInNjcm9sbC1teSIsInNjcm9sbC1tcyIsInNjcm9sbC1tZSIsInNjcm9sbC1tdCIsInNjcm9sbC1tciIsInNjcm9sbC1tYiIsInNjcm9sbC1tbCJdLCJzY3JvbGwtbXgiOlsic2Nyb2xsLW1yIiwic2Nyb2xsLW1sIl0sInNjcm9sbC1teSI6WyJzY3JvbGwtbXQiLCJzY3JvbGwtbWIiXSwic2Nyb2xsLXAiOlsic2Nyb2xsLXB4Iiwic2Nyb2xsLXB5Iiwic2Nyb2xsLXBzIiwic2Nyb2xsLXBlIiwic2Nyb2xsLXB0Iiwic2Nyb2xsLXByIiwic2Nyb2xsLXBiIiwic2Nyb2xsLXBsIl0sInNjcm9sbC1weCI6WyJzY3JvbGwtcHIiLCJzY3JvbGwtcGwiXSwic2Nyb2xsLXB5IjpbInNjcm9sbC1wdCIsInNjcm9sbC1wYiJdLHRvdWNoOlsidG91Y2gteCIsInRvdWNoLXkiLCJ0b3VjaC1weiJdLCJ0b3VjaC14IjpbInRvdWNoIl0sInRvdWNoLXkiOlsidG91Y2giXSwidG91Y2gtcHoiOlsidG91Y2giXX0sY29uZmxpY3RpbmdDbGFzc0dyb3VwTW9kaWZpZXJzOnsiZm9udC1zaXplIjpbImxlYWRpbmciXX19fWNvbnN0IEoyPU0yKFEyKTtmdW5jdGlvbiB4dCguLi5lKXtyZXR1cm4gSjIodVMoZSkpfWNvbnN0IEVhPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLGNoaWxkcmVuOnQsLi4ubn0scik9PnguanN4cyhzUyx7cmVmOnIsY2xhc3NOYW1lOnh0KCJyZWxhdGl2ZSBvdmVyZmxvdy1oaWRkZW4iLGUpLC4uLm4sY2hpbGRyZW46W3guanN4KF8yLHtjbGFzc05hbWU6ImgtZnVsbCB3LWZ1bGwgcm91bmRlZC1baW5oZXJpdF0iLGNoaWxkcmVuOnR9KSx4LmpzeChtUyx7fSkseC5qc3godzIse30pXX0pKTtFYS5kaXNwbGF5TmFtZT1zUy5kaXNwbGF5TmFtZTtjb25zdCBtUz1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSxvcmllbnRhdGlvbjp0PSJ2ZXJ0aWNhbCIsLi4ubn0scik9PnguanN4KHF3LHtyZWY6cixvcmllbnRhdGlvbjp0LGNsYXNzTmFtZTp4dCgiZmxleCB0b3VjaC1ub25lIHNlbGVjdC1ub25lIHRyYW5zaXRpb24tY29sb3JzIix0PT09InZlcnRpY2FsIiYmImgtZnVsbCB3LTIuNSBib3JkZXItbCBib3JkZXItbC10cmFuc3BhcmVudCBwLVsxcHhdIix0PT09Imhvcml6b250YWwiJiYiaC0yLjUgZmxleC1jb2wgYm9yZGVyLXQgYm9yZGVyLXQtdHJhbnNwYXJlbnQgcC1bMXB4XSIsZSksLi4ubixjaGlsZHJlbjp4LmpzeChwMix7Y2xhc3NOYW1lOnh0KCJyZWxhdGl2ZSByb3VuZGVkLWZ1bGwgYmctYm9yZGVyIix0PT09InZlcnRpY2FsIiYmImZsZXgtMSIpfSl9KSk7bVMuZGlzcGxheU5hbWU9cXcuZGlzcGxheU5hbWU7ZnVuY3Rpb24gQ2Eoe2NoaWxkcmVuOmV9KXtjb25zdCB0PXAudXNlUmVmKG51bGwpLG49cC51c2VSZWYobnVsbCkscj1wLnVzZVJlZighMSksaT1wLnVzZVJlZigwKSxvPXAudXNlUmVmKG51bGwpLGw9cC51c2VSZWYoMCkscz0oKT0+e3IuY3VycmVudD0hMSxvLmN1cnJlbnQ9bnVsbCxpLmN1cnJlbnQ9MCxsLmN1cnJlbnQ9MH0sYT13PT57dy5wcmV2ZW50RGVmYXVsdCgpO2NvbnN0IHY9by5jdXJyZW50PT09ImxlZnQiP3Q6bjtpZih2LmN1cnJlbnQmJnIuY3VycmVudCl7Y29uc3QgeT1vLmN1cnJlbnQ9PT0ibGVmdCI/dy5zY3JlZW5YLWkuY3VycmVudDppLmN1cnJlbnQtdy5zY3JlZW5YO3YuY3VycmVudC5zdHlsZS53aWR0aD1gJHtNYXRoLm1heChsLmN1cnJlbnQreSwxNTApfXB4YH19LHU9dz0+dj0+e2lmKHYudGFyZ2V0KXtjb25zdCBfPXc9PT0ibGVmdCI/dDp3PT09InJpZ2h0Ij9uOm51bGw7ci5jdXJyZW50PSEwLF8mJl8uY3VycmVudCYmKGkuY3VycmVudD12LnNjcmVlblgsby5jdXJyZW50PXcsXy5jdXJyZW50JiYobC5jdXJyZW50PV8uY3VycmVudC5vZmZzZXRXaWR0aCkpfX0sW2MsZCxmLGgsbSxnXT1wLkNoaWxkcmVuLnRvQXJyYXkoZSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT4oZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIscyksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixhKSwoKT0+e2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHMpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsYSl9KSxbXSkseC5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggaC1zY3JlZW4iLGNoaWxkcmVuOlt4LmpzeHMoImRpdiIse3JlZjp0LGNsYXNzTmFtZToicmVsYXRpdmUgYm9yZGVyLXIgYm9yZGVyLWJvcmRlciIsc3R5bGU6e3dpZHRoOjMwMH0sY2hpbGRyZW46W3guanN4cyhDYS5Db2x1bW4se2NoaWxkcmVuOltjLHguanN4KEVhLHtzdHlsZTp7aGVpZ2h0OiJjYWxjKDEwMHZoIC0gNTBweCkifSxjaGlsZHJlbjpkfSldfSkseC5qc3goImRpdiIse2NsYXNzTmFtZToiYWJzb2x1dGUgaW5zZXQteS0wIHJpZ2h0LTAgY3Vyc29yLWNvbC1yZXNpemUgdy1bMXB4XSBob3Zlcjp3LVszcHhdIGgtZnVsbCBob3ZlcjpiZy1ib3JkZXIiLG9uTW91c2VEb3duOnUoImxlZnQiKX0pXX0pLHguanN4KCJkaXYiLHtjbGFzc05hbWU6d2YoIiIseyJ3LWZ1bGwiOiFtJiYhZ30pLGNoaWxkcmVuOnguanN4cyhDYS5Db2x1bW4se2NoaWxkcmVuOltmLHguanN4KEVhLHtzdHlsZTp7aGVpZ2h0OiJjYWxjKDEwMHZoIC0gNTBweCkifSxjaGlsZHJlbjpofSldfSl9KSxtfHxnJiZ4LmpzeHMoImRpdiIse3JlZjpuLGNsYXNzTmFtZToicmVsYXRpdmUgaC1zY3JlZW4gYm9yZGVyLWwgYm9yZGVyLWJvcmRlciIsc3R5bGU6e3dpZHRoOjMwMH0sY2hpbGRyZW46W3guanN4cyhDYS5Db2x1bW4se2NoaWxkcmVuOlttLHguanN4KEVhLHtzdHlsZTp7aGVpZ2h0OiJjYWxjKDEwMHZoIC0gNTBweCkifSxjaGlsZHJlbjpnfSldfSkseC5qc3goImRpdiIse29uTW91c2VEb3duOnUoInJpZ2h0IiksY2xhc3NOYW1lOiJhYnNvbHV0ZSBpbnNldC15LTAgbGVmdC0wIGN1cnNvci1jb2wtcmVzaXplIHctWzFweF0gYmctYm9yZGVyIGhvdmVyOnctWzNweF0gaG92ZXI6YmctYm9yZGVyIn0pXX0pXX0pfUNhLkNvbHVtbj0oe2NoaWxkcmVuOmV9KT0+e2NvbnN0W3Qsbl09cC5DaGlsZHJlbi50b0FycmF5KGUpO3JldHVybiB4LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCIsY2hpbGRyZW46W3guanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggaXRlbXMtY2VudGVyIGJvcmRlci1iIGJvcmRlci1ib3JkZXIiLGNoaWxkcmVuOnR9KSxuXX0pfTtjb25zdCBxMj0oe2NsYXNzTmFtZTplfSk9PnguanN4cygic3ZnIix7d2lkdGg6IjEyIixoZWlnaHQ6IjEyIix2aWV3Qm94OiIwIDAgOSAxMCIsZmlsbDoibm9uZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjbGFzc05hbWU6ZSxjaGlsZHJlbjpbeC5qc3hzKCJnIix7Y2xpcFBhdGg6InVybCgjY2xpcDBfMTIyNV8xNjM4KSIsY2hpbGRyZW46W3guanN4KCJyZWN0Iix7eToiMC41Iix3aWR0aDoiOSIsaGVpZ2h0OiI5In0pLHguanN4KCJwYXRoIix7ZDoiTTAgN0w4LjUgNSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IifSkseC5qc3goImNpcmNsZSIse2N4OiIzIixjeToiMy41IixyOiIxIixmaWxsOiJjdXJyZW50Q29sb3IifSldfSkseC5qc3goInJlY3QiLHt4OiIwLjUiLHk6IjEiLHdpZHRoOiI4IixoZWlnaHQ6IjgiLHN0cm9rZToiY3VycmVudENvbG9yIn0pLHguanN4KCJkZWZzIix7Y2hpbGRyZW46eC5qc3goImNsaXBQYXRoIix7aWQ6ImNsaXAwXzEyMjVfMTYzOCIsY2hpbGRyZW46eC5qc3goInJlY3QiLHt5OiIwLjUiLHdpZHRoOiI5IixoZWlnaHQ6IjkiLGZpbGw6IndoaXRlIn0pfSl9KV19KSxnUz1xMixlUj0oe2NsYXNzTmFtZTplfSk9PnguanN4cygic3ZnIix7d2lkdGg6IjkiLGhlaWdodDoiMTAiLHZpZXdCb3g6IjAgMCA5IDEwIixjbGFzc05hbWU6ZSxmaWxsOiJjdXJyZW50Q29sb3IiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46W3guanN4cygiZyIse2NsaXBQYXRoOiJ1cmwoI2NsaXAwXzEyMjJfMTYxOCkiLGNoaWxkcmVuOlt4LmpzeCgicGF0aCIse2ZpbGxSdWxlOiJldmVub2RkIixjbGlwUnVsZToiZXZlbm9kZCIsZDoiTTkgMS41SDBWMC41SDlWMS41WiIsZmlsbDoiY3VycmVudENvbG9yIn0pLHguanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNOSA5LjVIMFY4LjVIOVY5LjVaIixmaWxsOiJjdXJyZW50Q29sb3IifSldfSkseC5qc3goImRlZnMiLHtjaGlsZHJlbjp4LmpzeCgiY2xpcFBhdGgiLHtpZDoiY2xpcDBfMTIyMl8xNjE4IixjaGlsZHJlbjp4LmpzeCgicmVjdCIse3dpZHRoOiI5IixoZWlnaHQ6IjkiLGZpbGw6IndoaXRlIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgwIDAuNSkifSl9KX0pXX0pLHRSPWVSLG5SPSh7Y2xhc3NOYW1lOmV9KT0+eC5qc3goInN2ZyIse3dpZHRoOiI5IixoZWlnaHQ6IjEwIix2aWV3Qm94OiIwIDAgOSAxMCIsZmlsbDoiY3VycmVudENvbG9yIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLGNsYXNzTmFtZTplLGNoaWxkcmVuOnguanN4KCJnIix7Y2xpcFBhdGg6InVybCgjY2xpcDBfMTIyOV8xNjI1KSIsY2hpbGRyZW46eC5qc3goInBhdGgiLHtkOiJNMC4wMTQ1NTEzIDAuNUg4Ljk4NTQ1TDkgMy4xODU2OUg4LjU3MDc0QzguNDMwMDcgMi4yMjc2IDguMDI3NDkgMS41Nzk0OCA3LjM2Mjk4IDEuMjQxMzNDNi45ODk0OSAxLjA1NDkxIDYuNDMxNjkgMC45NTMwMzUgNS42ODk1NyAwLjkzNTY5NFY3Ljk0NTgxQzUuNjg5NTcgOC40MzU2OSA1Ljc4NDE2IDguNzYwODQgNS45NzMzMiA4LjkyMTI0QzYuMTY3MzQgOS4wODE2NSA2LjU2NzUgOS4xNjE4NSA3LjE3MzgxIDkuMTYxODVWOS41SDEuODYyNTdWOS4xNjE4NUMyLjQ0NDYyIDkuMTYxODUgMi44MzAyMyA5LjA4MTY1IDMuMDE5NCA4LjkyMTI0QzMuMjEzNDIgOC43NTY1IDMuMzEwNDMgOC40MzEzNiAzLjMxMDQzIDcuOTQ1ODFWMC45MzU2OTRDMi41ODI4NiAwLjk1MzAzNSAyLjAyNTA2IDEuMDU0OTEgMS42MzcwMyAxLjI0MTMzQzAuOTI0MDEgMS41ODgxNSAwLjUyMTQyMyAyLjIzNjI3IDAuNDI5MjY0IDMuMTg1NjlIMEwwLjAxNDU1MTMgMC41WiJ9KX0pfSksclI9blI7ZnVuY3Rpb24gdlMoe2NoaWxkcmVuOmUscm9vdFBhdGg6dH0pe3JldHVybiB4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtY29sIHctZnVsbCBweS0yIHRleHQteHMiLGNoaWxkcmVuOnAuQ2hpbGRyZW4ubWFwKGUsbj0+cC5jbG9uZUVsZW1lbnQobix7cGF0aHM6W3RdfSkpfSl9dlMuTm9kZT0oe2NoaWxkcmVuOmUscGF0aHM6dD1bXSxwYXRoOm4sbGV2ZWw6cj0xLHR5cGU6aSxzZXRBY3RpdmVQYXRoOm99KT0+e2NvbnN0IGw9ciozMCxzPWk9PT0ic3RyaW5nIj94LmpzeChyUix7fSk6aT09PSJpbWFnZSI/eC5qc3goZ1Mse2NsYXNzTmFtZToiaC1bOXB4XSB3LVs5cHhdIn0pOnguanN4KHRSLHt9KTtyZXR1cm4geC5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InctZnVsbCIsY2hpbGRyZW46W3guanN4KCJidXR0b24iLHtjbGFzc05hbWU6ImZsZXgganVzdGlmeS1iZXR3ZWVuIHctZnVsbCBncm91cCBweS0yIHRleHQteHMgZm9udC1bNDAwXSBzaHJpbmstMCIsb25DbGljazooKT0+e28mJm8obil9LHN0eWxlOntwYWRkaW5nTGVmdDpsfSxjaGlsZHJlbjp4LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIiLGNoaWxkcmVuOltzLHguanN4KCJwIix7Y2hpbGRyZW46bn0pXX0pfSksZSYmeC5qc3goeC5GcmFnbWVudCx7Y2hpbGRyZW46cC5DaGlsZHJlbi5tYXAoZSxhPT5wLmNsb25lRWxlbWVudChhLHtsZXZlbDpyKzEscGF0aHM6Wy4uLnQsbl19KSl9KV19KX07dmFyIEw9e307bGV0IENmPXt9LHlTPXt9LHR1PXt9LGthPXt9LEpwPXt9LFlsPXt9LFFnPXt9LHFwPXt9LG51PXt9LHJ1PXt9LFVpPXt9LEpnPXt9LHFnPXt9LHhTPXt9LF9TPXt9LHdTPXt9LFNTPXt9LEVTPXt9LENTPXt9LGtTPXt9LHdkPXt9LCRTPXt9LGJTPXt9LFRTPXt9LE5TPXt9LFJTPXt9LE9TPXt9LFBTPXt9LEFTPXt9LE1TPXt9LGV2PXt9LHR2PXt9LGVtPXt9LERTPXt9LExTPXt9LElTPXt9O2Z1bmN0aW9uIEgoZSl7bGV0IHQ9bmV3IFVSTFNlYXJjaFBhcmFtczt0LmFwcGVuZCgiY29kZSIsZSk7Zm9yKGxldCBuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0LmFwcGVuZCgidiIsYXJndW1lbnRzW25dKTt0aHJvdyBFcnJvcihgTWluaWZpZWQgTGV4aWNhbCBlcnJvciAjJHtlfTsgdmlzaXQgaHR0cHM6Ly9sZXhpY2FsLmRldi9kb2NzL2Vycm9yPyR7dH0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLmApfWxldCB3aT10eXBlb2Ygd2luZG93PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudDwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudDwidSIsaVI9d2kmJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQ/ZG9jdW1lbnQuZG9jdW1lbnRNb2RlOm51bGwsUXQ9d2kmJi9NYWN8aVBvZHxpUGhvbmV8aVBhZC8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pLHJvPXdpJiYvXig/IS4qU2VhbW9ua2V5KSg/PS4qRmlyZWZveCkuKi9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksU2Q9d2kmJiJJbnB1dEV2ZW50ImluIHdpbmRvdyYmIWlSPyJnZXRUYXJnZXRSYW5nZXMiaW4gbmV3IHdpbmRvdy5JbnB1dEV2ZW50KCJpbnB1dCIpOiExLG52PXdpJiYvVmVyc2lvblwvW1xkLl0rLipTYWZhcmkvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksa2Y9d2kmJi9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhd2luZG93Lk1TU3RyZWFtLG9SPXdpJiYvXig/PS4qQ2hyb21lKS4qL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxydj13aSYmL0FwcGxlV2ViS2l0XC9bXGQuXSsvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiFvUiwkZj1udnx8a2Z8fHJ2PyLCoCI6IuKAiyIsbFI9cm8/IsKgIjokZixzUj0vXlteQS1aYS16XHUwMGMwLVx1MDBkNlx1MDBkOC1cdTAwZjZcdTAwZjgtXHUwMmI4XHUwMzAwLVx1MDU5MFx1MDgwMC1cdTFmZmZcdTIwMGVcdTJjMDAtXHVmYjFjXHVmZTAwLVx1ZmU2Zlx1ZmVmZC1cdWZmZmZdKltcdTA1OTEtXHUwN2ZmXHVmYjFkLVx1ZmRmZFx1ZmU3MC1cdWZlZmNdLyxhUj0vXlteXHUwNTkxLVx1MDdmZlx1ZmIxZC1cdWZkZmRcdWZlNzAtXHVmZWZjXSpbQS1aYS16XHUwMGMwLVx1MDBkNlx1MDBkOC1cdTAwZjZcdTAwZjgtXHUwMmI4XHUwMzAwLVx1MDU5MFx1MDgwMC1cdTFmZmZcdTIwMGVcdTJjMDAtXHVmYjFjXHVmZTAwLVx1ZmU2Zlx1ZmVmZC1cdWZmZmZdLyx6bz17Ym9sZDoxLGNvZGU6MTYsaGlnaGxpZ2h0OjEyOCxpdGFsaWM6MixzdHJpa2V0aHJvdWdoOjQsc3Vic2NyaXB0OjMyLHN1cGVyc2NyaXB0OjY0LHVuZGVybGluZTo4fSx1Uj17ZGlyZWN0aW9ubGVzczoxLHVubWVyZ2VhYmxlOjJ9LFQwPXtjZW50ZXI6MixlbmQ6NixqdXN0aWZ5OjQsbGVmdDoxLHJpZ2h0OjMsc3RhcnQ6NX0sY1I9ezI6ImNlbnRlciIsNjoiZW5kIiw0OiJqdXN0aWZ5IiwxOiJsZWZ0IiwzOiJyaWdodCIsNToic3RhcnQifSxkUj17bm9ybWFsOjAsc2VnbWVudGVkOjIsdG9rZW46MX0sZlI9ezA6Im5vcm1hbCIsMjoic2VnbWVudGVkIiwxOiJ0b2tlbiJ9LHRtPSExLGl2PTA7ZnVuY3Rpb24gaFIoZSl7aXY9ZS50aW1lU3RhbXB9ZnVuY3Rpb24gTmgoZSx0LG4pe3JldHVybiB0Ll9fbGV4aWNhbExpbmVCcmVhaz09PWV8fGVbYF9fbGV4aWNhbEtleV8ke24uX2tleX1gXSE9PXZvaWQgMH1mdW5jdGlvbiBwUihlKXtyZXR1cm4gZS5nZXRFZGl0b3JTdGF0ZSgpLnJlYWQoKCk9PntsZXQgdD1ydCgpO3JldHVybiB0IT09bnVsbD90LmNsb25lKCk6bnVsbH0pfWZ1bmN0aW9uIGpTKGUsdCxuKXt0bT0hMDtsZXQgcj0xMDA8cGVyZm9ybWFuY2Uubm93KCktaXY7dHJ5e1duKGUsKCk9PntsZXQgaT1ydCgpfHxwUihlKTt2YXIgbz1uZXcgTWFwLGw9ZS5nZXRSb290RWxlbWVudCgpLHM9ZS5fZWRpdG9yU3RhdGUsYT1lLl9ibG9ja0N1cnNvckVsZW1lbnQ7bGV0IHU9ITEsYz0iIjtmb3IodmFyIGQ9MDtkPHQubGVuZ3RoO2QrKyl7dmFyIGY9dFtkXSxoPWYudHlwZSxtPWYudGFyZ2V0LGc9SXUobSxzKTtpZighKGc9PT1udWxsJiZtIT09bHx8dHQoZykpKXtpZihoPT09ImNoYXJhY3RlckRhdGEiKXtpZihmPXImJkooZykpZTp7Zj1pLGg9bTt2YXIgdz1nO2lmKG1lKGYpKXt2YXIgdj1mLmFuY2hvci5nZXROb2RlKCk7aWYodi5pcyh3KSYmZi5mb3JtYXQhPT12LmdldEZvcm1hdCgpKXtmPSExO2JyZWFrIGV9fWY9aC5ub2RlVHlwZT09PTMmJncuaXNBdHRhY2hlZCgpfWYmJih3PVhyKGUuX3dpbmRvdyksaD1mPW51bGwsdyE9PW51bGwmJncuYW5jaG9yTm9kZT09PW0mJihmPXcuYW5jaG9yT2Zmc2V0LGg9dy5mb2N1c09mZnNldCksbT1tLm5vZGVWYWx1ZSxtIT09bnVsbCYmY3YoZyxtLGYsaCwhMSkpfWVsc2UgaWYoaD09PSJjaGlsZExpc3QiKXtmb3IodT0hMCxoPWYuYWRkZWROb2Rlcyx3PTA7dzxoLmxlbmd0aDt3Kyspe3Y9aFt3XTt2YXIgeT1IUyh2KSxfPXYucGFyZW50Tm9kZTtfPT1udWxsfHx2PT09YXx8eSE9PW51bGx8fHYubm9kZU5hbWU9PT0iQlIiJiZOaCh2LF8sZSl8fChybyYmKHk9di5pbm5lclRleHR8fHYubm9kZVZhbHVlKSYmKGMrPXkpLF8ucmVtb3ZlQ2hpbGQodikpfWlmKGY9Zi5yZW1vdmVkTm9kZXMsaD1mLmxlbmd0aCwwPGgpe2Zvcih3PTAsdj0wO3Y8aDt2KyspXz1mW3ZdLChfLm5vZGVOYW1lPT09IkJSIiYmTmgoXyxtLGUpfHxhPT09XykmJihtLmFwcGVuZENoaWxkKF8pLHcrKyk7aCE9PXcmJihtPT09bCYmKGc9cy5fbm9kZU1hcC5nZXQoInJvb3QiKSksby5zZXQobSxnKSl9fX19aWYoMDxvLnNpemUpZm9yKGxldFtTLEVdb2YgbylpZihCKEUpKWZvcihvPUUuZ2V0Q2hpbGRyZW5LZXlzKCksbD1TLmZpcnN0Q2hpbGQscz0wO3M8by5sZW5ndGg7cysrKWE9ZS5nZXRFbGVtZW50QnlLZXkob1tzXSksYSE9PW51bGwmJihsPT1udWxsPyhTLmFwcGVuZENoaWxkKGEpLGw9YSk6bCE9PWEmJlMucmVwbGFjZUNoaWxkKGEsbCksbD1sLm5leHRTaWJsaW5nKTtlbHNlIEooRSkmJkUubWFya0RpcnR5KCk7aWYobz1uLnRha2VSZWNvcmRzKCksMDxvLmxlbmd0aCl7Zm9yKGw9MDtsPG8ubGVuZ3RoO2wrKylmb3IoYT1vW2xdLHM9YS5hZGRlZE5vZGVzLGE9YS50YXJnZXQsZD0wO2Q8cy5sZW5ndGg7ZCsrKWc9c1tkXSxtPWcucGFyZW50Tm9kZSxtPT1udWxsfHxnLm5vZGVOYW1lIT09IkJSInx8TmgoZyxhLGUpfHxtLnJlbW92ZUNoaWxkKGcpO24udGFrZVJlY29yZHMoKX1pIT09bnVsbCYmKHUmJihpLmRpcnR5PSEwLFdyKGkpKSxybyYmWVMoZSkmJmkuaW5zZXJ0UmF3VGV4dChjKSl9KX1maW5hbGx5e3RtPSExfX1mdW5jdGlvbiB6UyhlKXtsZXQgdD1lLl9vYnNlcnZlcjtpZih0IT09bnVsbCl7bGV0IG49dC50YWtlUmVjb3JkcygpO2pTKGUsbix0KX19ZnVuY3Rpb24gRlMoZSl7aXY9PT0wJiZUZihlKS5hZGRFdmVudExpc3RlbmVyKCJ0ZXh0SW5wdXQiLGhSLCEwKSxlLl9vYnNlcnZlcj1uZXcgTXV0YXRpb25PYnNlcnZlcigodCxuKT0+e2pTKGUsdCxuKX0pfWZ1bmN0aW9uIE4wKGUsdCl7bGV0IG49ZS5fX21vZGUscj1lLl9fZm9ybWF0O2U9ZS5fX3N0eWxlO2xldCBpPXQuX19tb2RlLG89dC5fX2Zvcm1hdDtyZXR1cm4gdD10Ll9fc3R5bGUsKG49PT1udWxsfHxuPT09aSkmJihyPT09bnVsbHx8cj09PW8pJiYoZT09PW51bGx8fGU9PT10KX1mdW5jdGlvbiBSMChlLHQpe2xldCBuPWUubWVyZ2VXaXRoU2libGluZyh0KSxyPXB0KCkuX25vcm1hbGl6ZWROb2RlcztyZXR1cm4gci5hZGQoZS5fX2tleSksci5hZGQodC5fX2tleSksbn1mdW5jdGlvbiBCUyhlKXtpZihlLl9fdGV4dD09PSIiJiZlLmlzU2ltcGxlVGV4dCgpJiYhZS5pc1VubWVyZ2VhYmxlKCkpZS5yZW1vdmUoKTtlbHNle2Zvcih2YXIgdDsodD1lLmdldFByZXZpb3VzU2libGluZygpKSE9PW51bGwmJkoodCkmJnQuaXNTaW1wbGVUZXh0KCkmJiF0LmlzVW5tZXJnZWFibGUoKTspaWYodC5fX3RleHQ9PT0iIil0LnJlbW92ZSgpO2Vsc2V7TjAodCxlKSYmKGU9UjAodCxlKSk7YnJlYWt9Zm9yKHZhciBuOyhuPWUuZ2V0TmV4dFNpYmxpbmcoKSkhPT1udWxsJiZKKG4pJiZuLmlzU2ltcGxlVGV4dCgpJiYhbi5pc1VubWVyZ2VhYmxlKCk7KWlmKG4uX190ZXh0PT09IiIpbi5yZW1vdmUoKTtlbHNle04wKGUsbikmJlIwKGUsbik7YnJlYWt9fX1mdW5jdGlvbiBvdihlKXtyZXR1cm4gTzAoZS5hbmNob3IpLE8wKGUuZm9jdXMpLGV9ZnVuY3Rpb24gTzAoZSl7Zm9yKDtlLnR5cGU9PT0iZWxlbWVudCI7KXt2YXIgdD1lLmdldE5vZGUoKSxuPWUub2Zmc2V0O2lmKG49PT10LmdldENoaWxkcmVuU2l6ZSgpPyh0PXQuZ2V0Q2hpbGRBdEluZGV4KG4tMSksbj0hMCk6KHQ9dC5nZXRDaGlsZEF0SW5kZXgobiksbj0hMSksSih0KSl7ZS5zZXQodC5fX2tleSxuP3QuZ2V0VGV4dENvbnRlbnRTaXplKCk6MCwidGV4dCIpO2JyZWFrfWVsc2UgaWYoIUIodCkpYnJlYWs7ZS5zZXQodC5fX2tleSxuP3QuZ2V0Q2hpbGRyZW5TaXplKCk6MCwiZWxlbWVudCIpfX1sZXQgbVI9MSxnUj10eXBlb2YgcXVldWVNaWNyb3Rhc2s9PSJmdW5jdGlvbiI/cXVldWVNaWNyb3Rhc2s6ZT0+e1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oZSl9O2Z1bmN0aW9uIGx2KGUpe2xldCB0PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYodD09PW51bGwpcmV0dXJuITE7bGV0IG49dC5ub2RlTmFtZTtyZXR1cm4gdHQoSXUoZSkpJiYobj09PSJJTlBVVCJ8fG49PT0iVEVYVEFSRUEifHx0LmNvbnRlbnRFZGl0YWJsZT09PSJ0cnVlIiYmdC5fX2xleGljYWxFZGl0b3I9PW51bGwpfWZ1bmN0aW9uIEx1KGUsdCxuKXtsZXQgcj1lLmdldFJvb3RFbGVtZW50KCk7dHJ5e3JldHVybiByIT09bnVsbCYmci5jb250YWlucyh0KSYmci5jb250YWlucyhuKSYmdCE9PW51bGwmJiFsdih0KSYmc3YodCk9PT1lfWNhdGNoe3JldHVybiExfX1mdW5jdGlvbiBzdihlKXtmb3IoO2UhPW51bGw7KXtsZXQgdD1lLl9fbGV4aWNhbEVkaXRvcjtpZih0IT1udWxsKXJldHVybiB0O2U9YmYoZSl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gbm0oZSl7cmV0dXJuIGUuaXNUb2tlbigpfHxlLmlzU2VnbWVudGVkKCl9ZnVuY3Rpb24gRWQoZSl7Zm9yKDtlIT1udWxsOyl7aWYoZS5ub2RlVHlwZT09PTMpcmV0dXJuIGU7ZT1lLmZpcnN0Q2hpbGR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gVVMoZSx0LG4pe3JldHVybiB0PXpvW3RdLGUmdCYmKG49PT1udWxsfHwhKG4mdCkpP2VedDpuPT09bnVsbHx8biZ0P2V8dDplfWZ1bmN0aW9uIFdTKGUpe3JldHVybiBKKGUpfHxzdShlKXx8dHQoZSl9ZnVuY3Rpb24gVlMoZSx0KXtpZih0IT1udWxsKWUuX19rZXk9dDtlbHNle2huKCksOTk8YXUmJkgoMTQpLHQ9cHQoKTt2YXIgbj1RcigpLHI9IiIrbVIrKztuLl9ub2RlTWFwLnNldChyLGUpLEIoZSk/dC5fZGlydHlFbGVtZW50cy5zZXQociwhMCk6dC5fZGlydHlMZWF2ZXMuYWRkKHIpLHQuX2Nsb25lTm90TmVlZGVkLmFkZChyKSx0Ll9kaXJ0eVR5cGU9MSxlLl9fa2V5PXJ9fWZ1bmN0aW9uIEZvKGUpe3ZhciB0PWUuZ2V0UGFyZW50KCk7aWYodCE9PW51bGwpe2xldCBpPWUuZ2V0V3JpdGFibGUoKTt0PXQuZ2V0V3JpdGFibGUoKTt2YXIgbj1lLmdldFByZXZpb3VzU2libGluZygpO2lmKGU9ZS5nZXROZXh0U2libGluZygpLG49PT1udWxsKWlmKGUhPT1udWxsKXt2YXIgcj1lLmdldFdyaXRhYmxlKCk7dC5fX2ZpcnN0PWUuX19rZXksci5fX3ByZXY9bnVsbH1lbHNlIHQuX19maXJzdD1udWxsO2Vsc2V7aWYocj1uLmdldFdyaXRhYmxlKCksZSE9PW51bGwpe2xldCBvPWUuZ2V0V3JpdGFibGUoKTtvLl9fcHJldj1yLl9fa2V5LHIuX19uZXh0PW8uX19rZXl9ZWxzZSByLl9fbmV4dD1udWxsO2kuX19wcmV2PW51bGx9ZT09PW51bGw/biE9PW51bGw/KGU9bi5nZXRXcml0YWJsZSgpLHQuX19sYXN0PW4uX19rZXksZS5fX25leHQ9bnVsbCk6dC5fX2xhc3Q9bnVsbDooZT1lLmdldFdyaXRhYmxlKCksbiE9PW51bGw/KG49bi5nZXRXcml0YWJsZSgpLG4uX19uZXh0PWUuX19rZXksZS5fX3ByZXY9bi5fX2tleSk6ZS5fX3ByZXY9bnVsbCxpLl9fbmV4dD1udWxsKSx0Ll9fc2l6ZS0tLGkuX19wYXJlbnQ9bnVsbH19ZnVuY3Rpb24gQ2QoZSl7OTk8YXUmJkgoMTQpO3ZhciB0PWUuZ2V0TGF0ZXN0KCksbj10Ll9fcGFyZW50LHI9UXIoKTtsZXQgaT1wdCgpLG89ci5fbm9kZU1hcDtpZihyPWkuX2RpcnR5RWxlbWVudHMsbiE9PW51bGwpZTpmb3IoO24hPT1udWxsOyl7aWYoci5oYXMobikpYnJlYWsgZTtsZXQgbD1vLmdldChuKTtpZihsPT09dm9pZCAwKWJyZWFrO3Iuc2V0KG4sITEpLG49bC5fX3BhcmVudH10PXQuX19rZXksaS5fZGlydHlUeXBlPTEsQihlKT9yLnNldCh0LCEwKTppLl9kaXJ0eUxlYXZlcy5hZGQodCl9ZnVuY3Rpb24gS3QoZSl7aG4oKTt2YXIgdD1wdCgpO2xldCBuPXQuX2NvbXBvc2l0aW9uS2V5O2UhPT1uJiYodC5fY29tcG9zaXRpb25LZXk9ZSxuIT09bnVsbCYmKHQ9SXQobiksdCE9PW51bGwmJnQuZ2V0V3JpdGFibGUoKSksZSE9PW51bGwmJihlPUl0KGUpLGUhPT1udWxsJiZlLmdldFdyaXRhYmxlKCkpKX1mdW5jdGlvbiBXaSgpe3JldHVybiBOcygpP251bGw6cHQoKS5fY29tcG9zaXRpb25LZXl9ZnVuY3Rpb24gSXQoZSx0KXtyZXR1cm4gZT0odHx8UXIoKSkuX25vZGVNYXAuZ2V0KGUpLGU9PT12b2lkIDA/bnVsbDplfWZ1bmN0aW9uIEhTKGUsdCl7bGV0IG49cHQoKTtyZXR1cm4gZT1lW2BfX2xleGljYWxLZXlfJHtuLl9rZXl9YF0sZSE9PXZvaWQgMD9JdChlLHQpOm51bGx9ZnVuY3Rpb24gSXUoZSx0KXtmb3IoO2UhPW51bGw7KXtsZXQgbj1IUyhlLHQpO2lmKG4hPT1udWxsKXJldHVybiBuO2U9YmYoZSl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gS1MoZSl7bGV0IHQ9T2JqZWN0LmFzc2lnbih7fSxlLl9kZWNvcmF0b3JzKTtyZXR1cm4gZS5fcGVuZGluZ0RlY29yYXRvcnM9dH1mdW5jdGlvbiBQMChlKXtyZXR1cm4gZS5yZWFkKCgpPT5ZcigpLmdldFRleHRDb250ZW50KCkpfWZ1bmN0aW9uIHZSKGUsdCl7V24oZSwoKT0+e3ZhciBuPVFyKCk7aWYoIW4uaXNFbXB0eSgpKWlmKHQ9PT0icm9vdCIpWXIoKS5tYXJrRGlydHkoKTtlbHNle249bi5fbm9kZU1hcDtmb3IobGV0WyxyXW9mIG4pci5tYXJrRGlydHkoKX19LGUuX3BlbmRpbmdFZGl0b3JTdGF0ZT09PW51bGw/e3RhZzoiaGlzdG9yeS1tZXJnZSJ9OnZvaWQgMCl9ZnVuY3Rpb24gWXIoKXtyZXR1cm4gUXIoKS5fbm9kZU1hcC5nZXQoInJvb3QiKX1mdW5jdGlvbiBXcihlKXtobigpO2xldCB0PVFyKCk7ZSE9PW51bGwmJihlLmRpcnR5PSEwLGUuX2NhY2hlZE5vZGVzPW51bGwpLHQuX3NlbGVjdGlvbj1lfWZ1bmN0aW9uIHpsKGUpe3ZhciB0PXB0KCksbjtlOntmb3Iobj1lO24hPW51bGw7KXtsZXQgcj1uW2BfX2xleGljYWxLZXlfJHt0Ll9rZXl9YF07aWYociE9PXZvaWQgMCl7bj1yO2JyZWFrIGV9bj1iZihuKX1uPW51bGx9cmV0dXJuIG49PT1udWxsPyh0PXQuZ2V0Um9vdEVsZW1lbnQoKSxlPT09dD9JdCgicm9vdCIpOm51bGwpOkl0KG4pfWZ1bmN0aW9uIFpTKGUpe3JldHVybi9bXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl0vZy50ZXN0KGUpfWZ1bmN0aW9uIGF2KGUpe2xldCB0PVtdO2Zvcig7ZSE9PW51bGw7KXQucHVzaChlKSxlPWUuX3BhcmVudEVkaXRvcjtyZXR1cm4gdH1mdW5jdGlvbiBHUygpe3JldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5yZXBsYWNlKC9bXmEtel0rL2csIiIpLnN1YnN0cigwLDUpfWZ1bmN0aW9uIHV2KGUsdCxuKXtpZih0PVhyKHQuX3dpbmRvdyksdCE9PW51bGwpe3ZhciByPXQuYW5jaG9yTm9kZSx7YW5jaG9yT2Zmc2V0OmksZm9jdXNPZmZzZXQ6b309dDtpZihyIT09bnVsbCYmKHQ9ci5ub2RlVHlwZT09PTM/ci5ub2RlVmFsdWU6bnVsbCxyPUl1KHIpLHQhPT1udWxsJiZKKHIpKSl7aWYodD09PSRmJiZuKXtsZXQgbD1uLmxlbmd0aDt0PW4sbz1pPWx9dCE9PW51bGwmJmN2KHIsdCxpLG8sZSl9fX1mdW5jdGlvbiBjdihlLHQsbixyLGkpe2xldCBvPWU7aWYoby5pc0F0dGFjaGVkKCkmJihpfHwhby5pc0RpcnR5KCkpKXtsZXQgdT1vLmlzQ29tcG9zaW5nKCksYz10O2lmKCh1fHxpKSYmdFt0Lmxlbmd0aC0xXT09PSRmJiYoYz10LnNsaWNlKDAsLTEpKSx0PW8uZ2V0VGV4dENvbnRlbnQoKSxpfHxjIT09dClpZihjPT09IiIpaWYoS3QobnVsbCksbnZ8fGtmfHxydilvLnJlbW92ZSgpO2Vsc2V7bGV0IGQ9cHQoKTtzZXRUaW1lb3V0KCgpPT57ZC51cGRhdGUoKCk9PntvLmlzQXR0YWNoZWQoKSYmby5yZW1vdmUoKX0pfSwyMCl9ZWxzZXtpPW8uZ2V0UGFyZW50KCksdD1UcygpO3ZhciBsPW8uZ2V0VGV4dENvbnRlbnRTaXplKCkscz1XaSgpLGE9by5nZXRLZXkoKTtvLmlzVG9rZW4oKXx8cyE9PW51bGwmJmE9PT1zJiYhdXx8bWUodCkmJihpIT09bnVsbCYmIWkuY2FuSW5zZXJ0VGV4dEJlZm9yZSgpJiZ0LmFuY2hvci5vZmZzZXQ9PT0wfHx0LmFuY2hvci5rZXk9PT1lLl9fa2V5JiZ0LmFuY2hvci5vZmZzZXQ9PT0wJiYhby5jYW5JbnNlcnRUZXh0QmVmb3JlKCl8fHQuZm9jdXMua2V5PT09ZS5fX2tleSYmdC5mb2N1cy5vZmZzZXQ9PT1sJiYhby5jYW5JbnNlcnRUZXh0QWZ0ZXIoKSk/by5tYXJrRGlydHkoKTooZT1ydCgpLG1lKGUpJiZuIT09bnVsbCYmciE9PW51bGwmJihlLnNldFRleHROb2RlUmFuZ2UobyxuLG8sciksby5pc1NlZ21lbnRlZCgpJiYobj1vLmdldFRleHRDb250ZW50KCksbj1EdChuKSxvLnJlcGxhY2Uobiksbz1uKSksby5zZXRUZXh0Q29udGVudChjKSl9fX1mdW5jdGlvbiB5UihlLHQpe2lmKHQuaXNTZWdtZW50ZWQoKSlyZXR1cm4hMDtpZighZS5pc0NvbGxhcHNlZCgpKXJldHVybiExO2U9ZS5hbmNob3Iub2Zmc2V0O2xldCBuPXQuZ2V0UGFyZW50T3JUaHJvdygpLHI9dC5pc1Rva2VuKCk7cmV0dXJuIGU9PT0wPygoZT0hdC5jYW5JbnNlcnRUZXh0QmVmb3JlKCl8fCFuLmNhbkluc2VydFRleHRCZWZvcmUoKXx8cil8fCh0PXQuZ2V0UHJldmlvdXNTaWJsaW5nKCksZT0oSih0KXx8Qih0KSYmdC5pc0lubGluZSgpKSYmIXQuY2FuSW5zZXJ0VGV4dEFmdGVyKCkpLGUpOmU9PT10LmdldFRleHRDb250ZW50U2l6ZSgpPyF0LmNhbkluc2VydFRleHRBZnRlcigpfHwhbi5jYW5JbnNlcnRUZXh0QWZ0ZXIoKXx8cjohMX1mdW5jdGlvbiAkYShlLHQpe2UuX19sZXhpY2FsQ2xhc3NOYW1lQ2FjaGU9PT12b2lkIDAmJihlLl9fbGV4aWNhbENsYXNzTmFtZUNhY2hlPXt9KTtsZXQgbj1lLl9fbGV4aWNhbENsYXNzTmFtZUNhY2hlLHI9blt0XTtyZXR1cm4gciE9PXZvaWQgMD9yOihlPWVbdF0sdHlwZW9mIGU9PSJzdHJpbmciPyhlPWUuc3BsaXQoIiAiKSxuW3RdPWUpOmUpfWZ1bmN0aW9uIGR2KGUsdCxuLHIsaSl7bi5zaXplIT09MCYmKG49ci5fX3R5cGUscj1yLl9fa2V5LHQ9dC5nZXQobiksdD09PXZvaWQgMCYmSCgzMyxuKSxuPXQua2xhc3MsdD1lLmdldChuKSx0PT09dm9pZCAwJiYodD1uZXcgTWFwLGUuc2V0KG4sdCkpLGU9dC5nZXQociksbj1lPT09ImRlc3Ryb3llZCImJmk9PT0iY3JlYXRlZCIsKGU9PT12b2lkIDB8fG4pJiZ0LnNldChyLG4/InVwZGF0ZWQiOmkpKX1mdW5jdGlvbiBBMChlLHQsbil7bGV0IHI9ZS5nZXRQYXJlbnQoKSxpPW47cmV0dXJuIHIhPT1udWxsJiYodCYmbj09PTA/KGk9ZS5nZXRJbmRleFdpdGhpblBhcmVudCgpLGU9cik6dHx8biE9PWUuZ2V0Q2hpbGRyZW5TaXplKCl8fChpPWUuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsxLGU9cikpLGUuZ2V0Q2hpbGRBdEluZGV4KHQ/aS0xOmkpfWZ1bmN0aW9uIHJtKGUsdCl7dmFyIG49ZS5vZmZzZXQ7cmV0dXJuIGUudHlwZT09PSJlbGVtZW50Ij8oZT1lLmdldE5vZGUoKSxBMChlLHQsbikpOihlPWUuZ2V0Tm9kZSgpLHQmJm49PT0wfHwhdCYmbj09PWUuZ2V0VGV4dENvbnRlbnRTaXplKCk/KG49dD9lLmdldFByZXZpb3VzU2libGluZygpOmUuZ2V0TmV4dFNpYmxpbmcoKSxuPT09bnVsbD9BMChlLmdldFBhcmVudE9yVGhyb3coKSx0LGUuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsodD8wOjEpKTpuKTpudWxsKX1mdW5jdGlvbiBZUyhlKXtyZXR1cm4gZT0oZT1UZihlKS5ldmVudCkmJmUuaW5wdXRUeXBlLGU9PT0iaW5zZXJ0RnJvbVBhc3RlInx8ZT09PSJpbnNlcnRGcm9tUGFzdGVBc1F1b3RhdGlvbiJ9ZnVuY3Rpb24ga2QoZSl7cmV0dXJuIW1uKGUpJiYhZS5pc0xhc3RDaGlsZCgpJiYhZS5pc0lubGluZSgpfWZ1bmN0aW9uICRkKGUsdCl7cmV0dXJuIGU9ZS5fa2V5VG9ET01NYXAuZ2V0KHQpLGU9PT12b2lkIDAmJkgoNzUsdCksZX1mdW5jdGlvbiBiZihlKXtyZXR1cm4gZT1lLmFzc2lnbmVkU2xvdHx8ZS5wYXJlbnRFbGVtZW50LGUhPT1udWxsJiZlLm5vZGVUeXBlPT09MTE/ZS5ob3N0OmV9ZnVuY3Rpb24gYmQoZSx0KXtmb3IoZT1lLmdldFBhcmVudCgpO2UhPT1udWxsOyl7aWYoZS5pcyh0KSlyZXR1cm4hMDtlPWUuZ2V0UGFyZW50KCl9cmV0dXJuITF9ZnVuY3Rpb24gVGYoZSl7cmV0dXJuIGU9ZS5fd2luZG93LGU9PT1udWxsJiZIKDc4KSxlfWZ1bmN0aW9uIFhTKGUpe2ZvcihlPWUuZ2V0UGFyZW50T3JUaHJvdygpO2UhPT1udWxsJiYheHIoZSk7KWU9ZS5nZXRQYXJlbnRPclRocm93KCk7cmV0dXJuIGV9ZnVuY3Rpb24geHIoZSl7cmV0dXJuIG1uKGUpfHxCKGUpJiZlLmlzU2hhZG93Um9vdCgpfWZ1bmN0aW9uIFFTKGUpe3JldHVybiBlPWUuY29uc3RydWN0b3IuY2xvbmUoZSksVlMoZSxudWxsKSxlfWZ1bmN0aW9uIGp1KGUpe3ZhciB0PXB0KCk7bGV0IG49ZS5jb25zdHJ1Y3Rvci5nZXRUeXBlKCk7cmV0dXJuIHQ9dC5fbm9kZXMuZ2V0KG4pLHQ9PT12b2lkIDAmJkgoOTcpLHQ9dC5yZXBsYWNlLHQhPT1udWxsPyh0PXQoZSksdCBpbnN0YW5jZW9mIGUuY29uc3RydWN0b3J8fEgoOTgpLHQpOmV9ZnVuY3Rpb24gUmgoZSx0KXtlPWUuZ2V0UGFyZW50KCksIW1uKGUpfHxCKHQpfHx0dCh0KXx8SCg5OSl9ZnVuY3Rpb24gT2goZSl7cmV0dXJuKHR0KGUpfHxCKGUpJiYhZS5jYW5CZUVtcHR5KCkpJiYhZS5pc0lubGluZSgpfWZ1bmN0aW9uIGltKGUsdCxuKXtuLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJjYXJldC1jb2xvciIpLHQuX2Jsb2NrQ3Vyc29yRWxlbWVudD1udWxsLHQ9ZS5wYXJlbnRFbGVtZW50LHQhPT1udWxsJiZ0LnJlbW92ZUNoaWxkKGUpfWZ1bmN0aW9uIFhyKGUpe3JldHVybiB3aT8oZXx8d2luZG93KS5nZXRTZWxlY3Rpb24oKTpudWxsfWZ1bmN0aW9uIEpTKGUsdCl7bGV0IG49ZS5nZXRDaGlsZEF0SW5kZXgodCk7bj09bnVsbCYmKG49ZSkseHIoZSkmJkgoMTAyKTtsZXQgcj1sPT57Y29uc3Qgcz1sLmdldFBhcmVudE9yVGhyb3coKSxhPXhyKHMpLHU9bCE9PW58fGE/UVMobCk6bDtpZihhKXJldHVybiBsLmluc2VydEFmdGVyKHUpLFtsLHUsdV07Y29uc3RbYyxkLGZdPXIocyk7cmV0dXJuIGw9bC5nZXROZXh0U2libGluZ3MoKSxmLmFwcGVuZCh1LC4uLmwpLFtjLGQsdV19LFtpLG9dPXIobik7cmV0dXJuW2ksb119ZnVuY3Rpb24gVGQoZSx0KXtmb3IoO2UhPT1ZcigpJiZlIT1udWxsOyl7aWYodChlKSlyZXR1cm4gZTtlPWUuZ2V0UGFyZW50KCl9cmV0dXJuIG51bGx9ZnVuY3Rpb24geFIoZSl7bGV0IHQ9W10sbj1bZV07Zm9yKDswPG4ubGVuZ3RoOyl7bGV0IHI9bi5wb3AoKTtyPT09dm9pZCAwJiZIKDExMiksQihyKSYmbi51bnNoaWZ0KC4uLnIuZ2V0Q2hpbGRyZW4oKSksciE9PWUmJnQucHVzaChyKX1yZXR1cm4gdH1mdW5jdGlvbiBOZihlKXtyZXR1cm4gZS5ub2RlVHlwZT09PTF9ZnVuY3Rpb24gcVMoZSx0LG4scixpLG8pe2ZvcihlPWUuZ2V0Rmlyc3RDaGlsZCgpO2UhPT1udWxsOyl7bGV0IGw9ZS5fX2tleTtlLl9fcGFyZW50PT09dCYmKEIoZSkmJnFTKGUsbCxuLHIsaSxvKSxuLmhhcyhsKXx8by5kZWxldGUobCksaS5wdXNoKGwpKSxlPWUuZ2V0TmV4dFNpYmxpbmcoKX19ZnVuY3Rpb24gX1IoZSx0LG4scil7ZT1lLl9ub2RlTWFwLHQ9dC5fbm9kZU1hcDtsZXQgaT1bXTtmb3IobGV0W29db2Ygcil7bGV0IGw9dC5nZXQobyk7bD09PXZvaWQgMHx8bC5pc0F0dGFjaGVkKCl8fChCKGwpJiZxUyhsLG8sZSx0LGksciksZS5oYXMobyl8fHIuZGVsZXRlKG8pLGkucHVzaChvKSl9Zm9yKGxldCBvIG9mIGkpdC5kZWxldGUobyk7Zm9yKGxldCBvIG9mIG4pcj10LmdldChvKSxyPT09dm9pZCAwfHxyLmlzQXR0YWNoZWQoKXx8KGUuaGFzKG8pfHxuLmRlbGV0ZShvKSx0LmRlbGV0ZShvKSl9bGV0IE50PSIiLGZuPSIiLG9pPSIiLGlvLHRuLGl1LGVFPSExLGZ2PSExLFJmLEJjPW51bGwsb20sbG0sR28sb28sc20sb3U7ZnVuY3Rpb24gVWMoZSx0KXtsZXQgbj1Hby5nZXQoZSk7aWYodCE9PW51bGwpe2xldCByPWNtKGUpO3IucGFyZW50Tm9kZT09PXQmJnQucmVtb3ZlQ2hpbGQocil9b28uaGFzKGUpfHx0bi5fa2V5VG9ET01NYXAuZGVsZXRlKGUpLEIobikmJihlPU5kKG4sR28pLGFtKGUsMCxlLmxlbmd0aC0xLG51bGwpKSxuIT09dm9pZCAwJiZkdihvdSxpdSxSZixuLCJkZXN0cm95ZWQiKX1mdW5jdGlvbiBhbShlLHQsbixyKXtmb3IoO3Q8PW47Kyt0KXtsZXQgaT1lW3RdO2khPT12b2lkIDAmJlVjKGkscil9fWZ1bmN0aW9uICRvKGUsdCl7ZS5zZXRQcm9wZXJ0eSgidGV4dC1hbGlnbiIsdCl9ZnVuY3Rpb24gdEUoZSx0KXt2YXIgbj1pby50aGVtZS5pbmRlbnQ7aWYodHlwZW9mIG49PSJzdHJpbmciKXtsZXQgcj1lLmNsYXNzTGlzdC5jb250YWlucyhuKTswPHQmJiFyP2UuY2xhc3NMaXN0LmFkZChuKToxPnQmJnImJmUuY2xhc3NMaXN0LnJlbW92ZShuKX1uPWdldENvbXB1dGVkU3R5bGUoZSkuZ2V0UHJvcGVydHlWYWx1ZSgiLS1sZXhpY2FsLWluZGVudC1iYXNlLXZhbHVlIil8fCI0MHB4IixlLnN0eWxlLnNldFByb3BlcnR5KCJwYWRkaW5nLWlubGluZS1zdGFydCIsdD09PTA/IiI6YGNhbGMoJHt0fSAqICR7bn0pYCl9ZnVuY3Rpb24gbkUoZSx0KXtlPWUuc3R5bGUsdD09PTA/JG8oZSwiIik6dD09PTE/JG8oZSwibGVmdCIpOnQ9PT0yPyRvKGUsImNlbnRlciIpOnQ9PT0zPyRvKGUsInJpZ2h0Iik6dD09PTQ/JG8oZSwianVzdGlmeSIpOnQ9PT01PyRvKGUsInN0YXJ0Iik6dD09PTYmJiRvKGUsImVuZCIpfWZ1bmN0aW9uIFdjKGUsdCxuKXtsZXQgcj1vby5nZXQoZSk7cj09PXZvaWQgMCYmSCg2MCk7bGV0IGk9ci5jcmVhdGVET00oaW8sdG4pO3ZhciBvPXRuLl9rZXlUb0RPTU1hcDtpZihpWyJfX2xleGljYWxLZXlfIit0bi5fa2V5XT1lLG8uc2V0KGUsaSksSihyKT9pLnNldEF0dHJpYnV0ZSgiZGF0YS1sZXhpY2FsLXRleHQiLCJ0cnVlIik6dHQocikmJmkuc2V0QXR0cmlidXRlKCJkYXRhLWxleGljYWwtZGVjb3JhdG9yIiwidHJ1ZSIpLEIocikpe2lmKGU9ci5fX2luZGVudCxvPXIuX19zaXplLGUhPT0wJiZ0RShpLGUpLG8hPT0wKXstLW8sZT1OZChyLG9vKTt2YXIgbD1mbjtmbj0iIix1bShlLHIsMCxvLGksbnVsbCksaUUocixpKSxmbj1sfWU9ci5fX2Zvcm1hdCxlIT09MCYmbkUoaSxlKSxyLmlzSW5saW5lKCl8fHJFKG51bGwscixpKSxrZChyKSYmKE50Kz1gCgpgLG9pKz1gCgpgKX1lbHNlIG89ci5nZXRUZXh0Q29udGVudCgpLHR0KHIpPyhsPXIuZGVjb3JhdGUodG4saW8pLGwhPT1udWxsJiZvRShlLGwpLGkuY29udGVudEVkaXRhYmxlPSJmYWxzZSIpOkoocikmJihyLmlzRGlyZWN0aW9ubGVzcygpfHwoZm4rPW8pKSxOdCs9byxvaSs9bztyZXR1cm4gdCE9PW51bGwmJihuIT1udWxsP3QuaW5zZXJ0QmVmb3JlKGksbik6KG49dC5fX2xleGljYWxMaW5lQnJlYWssbiE9bnVsbD90Lmluc2VydEJlZm9yZShpLG4pOnQuYXBwZW5kQ2hpbGQoaSkpKSxkdihvdSxpdSxSZixyLCJjcmVhdGVkIiksaX1mdW5jdGlvbiB1bShlLHQsbixyLGksbyl7bGV0IGw9TnQ7Zm9yKE50PSIiO248PXI7KytuKVdjKGVbbl0saSxvKTtrZCh0KSYmKE50Kz1gCgpgKSxpLl9fbGV4aWNhbFRleHRDb250ZW50PU50LE50PWwrTnR9ZnVuY3Rpb24gTTAoZSx0KXtyZXR1cm4gZT10LmdldChlKSxzdShlKXx8dHQoZSkmJmUuaXNJbmxpbmUoKX1mdW5jdGlvbiByRShlLHQsbil7ZT1lIT09bnVsbCYmKGUuX19zaXplPT09MHx8TTAoZS5fX2xhc3QsR28pKSx0PXQuX19zaXplPT09MHx8TTAodC5fX2xhc3Qsb28pLGU/dHx8KHQ9bi5fX2xleGljYWxMaW5lQnJlYWssdCE9bnVsbCYmbi5yZW1vdmVDaGlsZCh0KSxuLl9fbGV4aWNhbExpbmVCcmVhaz1udWxsKTp0JiYodD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpLG4uX19sZXhpY2FsTGluZUJyZWFrPXQsbi5hcHBlbmRDaGlsZCh0KSl9ZnVuY3Rpb24gaUUoZSx0KXt2YXIgbj10Ll9fbGV4aWNhbERpcjtpZih0Ll9fbGV4aWNhbERpclRleHRDb250ZW50IT09Zm58fG4hPT1CYyl7bGV0IG89Zm49PT0iIjtpZihvKXZhciByPUJjO2Vsc2Ugcj1mbixyPXNSLnRlc3Qocik/InJ0bCI6YVIudGVzdChyKT8ibHRyIjpudWxsO2lmKHIhPT1uKXtsZXQgbD10LmNsYXNzTGlzdCxzPWlvLnRoZW1lO3ZhciBpPW4hPT1udWxsP3Nbbl06dm9pZCAwO2xldCBhPXIhPT1udWxsP3Nbcl06dm9pZCAwO2khPT12b2lkIDAmJih0eXBlb2YgaT09InN0cmluZyImJihpPWkuc3BsaXQoIiAiKSxpPXNbbl09aSksbC5yZW1vdmUoLi4uaSkpLHI9PT1udWxsfHxvJiZyPT09Imx0ciI/dC5yZW1vdmVBdHRyaWJ1dGUoImRpciIpOihhIT09dm9pZCAwJiYodHlwZW9mIGE9PSJzdHJpbmciJiYobj1hLnNwbGl0KCIgIiksYT1zW3JdPW4pLGEhPT12b2lkIDAmJmwuYWRkKC4uLmEpKSx0LmRpcj1yKSxmdnx8KGUuZ2V0V3JpdGFibGUoKS5fX2Rpcj1yKX1CYz1yLHQuX19sZXhpY2FsRGlyVGV4dENvbnRlbnQ9Zm4sdC5fX2xleGljYWxEaXI9cn19ZnVuY3Rpb24gTmQoZSx0KXtsZXQgbj1bXTtmb3IoZT1lLl9fZmlyc3Q7ZSE9PW51bGw7KXtsZXQgcj10LmdldChlKTtyPT09dm9pZCAwJiZIKDEwMSksbi5wdXNoKGUpLGU9ci5fX25leHR9cmV0dXJuIG59ZnVuY3Rpb24gY2EoZSx0KXt2YXIgbj1Hby5nZXQoZSkscj1vby5nZXQoZSk7biE9PXZvaWQgMCYmciE9PXZvaWQgMHx8SCg2MSk7dmFyIGk9ZUV8fGxtLmhhcyhlKXx8b20uaGFzKGUpO2xldCBvPSRkKHRuLGUpO2lmKG49PT1yJiYhaSlyZXR1cm4gQihuKT8ocj1vLl9fbGV4aWNhbFRleHRDb250ZW50LHIhPT12b2lkIDAmJihOdCs9cixvaSs9cikscj1vLl9fbGV4aWNhbERpclRleHRDb250ZW50LHIhPT12b2lkIDAmJihmbis9cikpOihyPW4uZ2V0VGV4dENvbnRlbnQoKSxKKG4pJiYhbi5pc0RpcmVjdGlvbmxlc3MoKSYmKGZuKz1yKSxvaSs9cixOdCs9ciksbztpZihuIT09ciYmaSYmZHYob3UsaXUsUmYsciwidXBkYXRlZCIpLHIudXBkYXRlRE9NKG4sbyxpbykpcmV0dXJuIHI9V2MoZSxudWxsLG51bGwpLHQ9PT1udWxsJiZIKDYyKSx0LnJlcGxhY2VDaGlsZChyLG8pLFVjKGUsbnVsbCkscjtpZihCKG4pJiZCKHIpKXtpZihlPXIuX19pbmRlbnQsZSE9PW4uX19pbmRlbnQmJnRFKG8sZSksZT1yLl9fZm9ybWF0LGUhPT1uLl9fZm9ybWF0JiZuRShvLGUpLGkpe2U9cixpPWZuLGZuPSIiLHQ9TnQ7dmFyIGw9bi5fX3NpemUscz1lLl9fc2l6ZTtpZihOdD0iIixsPT09MSYmcz09PTEpe3ZhciBhPW4uX19maXJzdCx1PWUuX19maXJzdDtpZihhPT09dSljYShhLG8pO2Vsc2V7dmFyIGM9Y20oYSk7dT1XYyh1LG51bGwsbnVsbCksby5yZXBsYWNlQ2hpbGQodSxjKSxVYyhhLG51bGwpfX1lbHNle3U9TmQobixHbyk7dmFyIGQ9TmQoZSxvbyk7aWYobD09PTApcyE9PTAmJnVtKGQsZSwwLHMtMSxvLG51bGwpO2Vsc2UgaWYocz09PTApbCE9PTAmJihhPW8uX19sZXhpY2FsTGluZUJyZWFrPT1udWxsLGFtKHUsMCxsLTEsYT9udWxsOm8pLGEmJihvLnRleHRDb250ZW50PSIiKSk7ZWxzZXt2YXIgZj11O3U9ZCxkPWwtMSxsPXMtMTtsZXQgbT1vLmZpcnN0Q2hpbGQsZz0wO2ZvcihzPTA7Zzw9ZCYmczw9bDspe3ZhciBoPWZbZ107bGV0IHc9dVtzXTtpZihoPT09dyltPVBoKGNhKHcsbykpLGcrKyxzKys7ZWxzZXthPT09dm9pZCAwJiYoYT1uZXcgU2V0KGYpKSxjPT09dm9pZCAwJiYoYz1uZXcgU2V0KHUpKTtsZXQgdj1jLmhhcyhoKSx5PWEuaGFzKHcpO3Y/KHk/KGg9JGQodG4sdyksaD09PW0/bT1QaChjYSh3LG8pKToobSE9bnVsbD9vLmluc2VydEJlZm9yZShoLG0pOm8uYXBwZW5kQ2hpbGQoaCksY2EodyxvKSksZysrKTpXYyh3LG8sbSkscysrKToobT1QaChjbShoKSksVWMoaCxvKSxnKyspfX1hPWc+ZCxjPXM+bCxhJiYhYz8oYT11W2wrMV0sYT1hPT09dm9pZCAwP251bGw6dG4uZ2V0RWxlbWVudEJ5S2V5KGEpLHVtKHUsZSxzLGwsbyxhKSk6YyYmIWEmJmFtKGYsZyxkLG8pfX1rZChlKSYmKE50Kz1gCgpgKSxvLl9fbGV4aWNhbFRleHRDb250ZW50PU50LE50PXQrTnQsaUUoZSxvKSxmbj1pLG1uKHIpfHxyLmlzSW5saW5lKCl8fHJFKG4scixvKX1rZChyKSYmKE50Kz1gCgpgLG9pKz1gCgpgKX1lbHNlIG49ci5nZXRUZXh0Q29udGVudCgpLHR0KHIpPyhpPXIuZGVjb3JhdGUodG4saW8pLGkhPT1udWxsJiZvRShlLGkpKTpKKHIpJiYhci5pc0RpcmVjdGlvbmxlc3MoKSYmKGZuKz1uKSxOdCs9bixvaSs9bjtyZXR1cm4hZnYmJm1uKHIpJiZyLl9fY2FjaGVkVGV4dCE9PW9pJiYocj1yLmdldFdyaXRhYmxlKCksci5fX2NhY2hlZFRleHQ9b2kpLG99ZnVuY3Rpb24gb0UoZSx0KXtsZXQgbj10bi5fcGVuZGluZ0RlY29yYXRvcnMscj10bi5fZGVjb3JhdG9ycztpZihuPT09bnVsbCl7aWYocltlXT09PXQpcmV0dXJuO249S1ModG4pfW5bZV09dH1mdW5jdGlvbiBQaChlKXtyZXR1cm4gZT1lLm5leHRTaWJsaW5nLGUhPT1udWxsJiZlPT09dG4uX2Jsb2NrQ3Vyc29yRWxlbWVudCYmKGU9ZS5uZXh0U2libGluZyksZX1mdW5jdGlvbiBjbShlKXtsZXQgdD1zbS5nZXQoZSk7cmV0dXJuIHQ9PT12b2lkIDAmJkgoNzUsZSksdH1sZXQgZWk9T2JqZWN0LmZyZWV6ZSh7fSksZG09W1sia2V5ZG93biIsVFJdLFsicG9pbnRlcmRvd24iLFNSXSxbImNvbXBvc2l0aW9uc3RhcnQiLCRSXSxbImNvbXBvc2l0aW9uZW5kIixiUl0sWyJpbnB1dCIsa1JdLFsiY2xpY2siLHdSXSxbImN1dCIsZWldLFsiY29weSIsZWldLFsiZHJhZ3N0YXJ0IixlaV0sWyJkcmFnb3ZlciIsZWldLFsiZHJhZ2VuZCIsZWldLFsicGFzdGUiLGVpXSxbImZvY3VzIixlaV0sWyJibHVyIixlaV0sWyJkcm9wIixlaV1dO1NkJiZkbS5wdXNoKFsiYmVmb3JlaW5wdXQiLChlLHQpPT5DUihlLHQpXSk7bGV0IGx1PTAsbEU9MCxzRT0wLGtsPW51bGwsYmE9MCxmbT0hMSxobT0hMSxUYT0hMSxkYT0hMSxhRT1bMCwiIiwwLCJyb290IiwwXTtmdW5jdGlvbiB1RShlLHQsbixyLGkpe2xldCBvPWUuYW5jaG9yLGw9ZS5mb2N1cyxzPW8uZ2V0Tm9kZSgpO3ZhciBhPXB0KCk7bGV0IHU9WHIoYS5fd2luZG93KSxjPXUhPT1udWxsP3UuYW5jaG9yTm9kZTpudWxsLGQ9by5rZXk7YT1hLmdldEVsZW1lbnRCeUtleShkKTtsZXQgZj1uLmxlbmd0aDtyZXR1cm4gZCE9PWwua2V5fHwhSihzKXx8KCFpJiYoIVNkfHxzRTxyKzUwKXx8cy5pc0RpcnR5KCkmJjI+Znx8WlMobikpJiZvLm9mZnNldCE9PWwub2Zmc2V0JiYhcy5pc0NvbXBvc2luZygpfHxubShzKXx8cy5pc0RpcnR5KCkmJjE8Znx8KGl8fCFTZCkmJmEhPT1udWxsJiYhcy5pc0NvbXBvc2luZygpJiZjIT09RWQoYSl8fHUhPT1udWxsJiZ0IT09bnVsbCYmKCF0LmNvbGxhcHNlZHx8dC5zdGFydENvbnRhaW5lciE9PXUuYW5jaG9yTm9kZXx8dC5zdGFydE9mZnNldCE9PXUuYW5jaG9yT2Zmc2V0KXx8cy5nZXRGb3JtYXQoKSE9PWUuZm9ybWF0fHxzLmdldFN0eWxlKCkhPT1lLnN0eWxlfHx5UihlLHMpfWZ1bmN0aW9uIEQwKGUsdCl7cmV0dXJuIGUhPT1udWxsJiZlLm5vZGVWYWx1ZSE9PW51bGwmJmUubm9kZVR5cGU9PT0zJiZ0IT09MCYmdCE9PWUubm9kZVZhbHVlLmxlbmd0aH1mdW5jdGlvbiBMMChlLHQsbil7bGV0e2FuY2hvck5vZGU6cixhbmNob3JPZmZzZXQ6aSxmb2N1c05vZGU6byxmb2N1c09mZnNldDpsfT1lO2ZtJiYoZm09ITEsRDAocixpKSYmRDAobyxsKSl8fFduKHQsKCk9PntpZighbilXcihudWxsKTtlbHNlIGlmKEx1KHQscixvKSl7dmFyIHM9cnQoKTtpZihtZShzKSl7dmFyIGE9cy5hbmNob3IsdT1hLmdldE5vZGUoKTtpZihzLmlzQ29sbGFwc2VkKCkpe2UudHlwZT09PSJSYW5nZSImJmUuYW5jaG9yTm9kZT09PWUuZm9jdXNOb2RlJiYocy5kaXJ0eT0hMCk7dmFyIGM9VGYodCkuZXZlbnQ7Yz1jP2MudGltZVN0YW1wOnBlcmZvcm1hbmNlLm5vdygpO2xldFtkLGYsaCxtLGddPWFFO2M8ZysyMDAmJmEub2Zmc2V0PT09aCYmYS5rZXk9PT1tPyhzLmZvcm1hdD1kLHMuc3R5bGU9Zik6YS50eXBlPT09InRleHQiPyhzLmZvcm1hdD11LmdldEZvcm1hdCgpLHMuc3R5bGU9dS5nZXRTdHlsZSgpKTphLnR5cGU9PT0iZWxlbWVudCImJihzLmZvcm1hdD0wLHMuc3R5bGU9IiIpfWVsc2V7YT0yNTUsdT0hMSxjPXMuZ2V0Tm9kZXMoKTtsZXQgZD1jLmxlbmd0aDtmb3IobGV0IGY9MDtmPGQ7ZisrKXtsZXQgaD1jW2ZdO2lmKEooaCkmJih1PSEwLGEmPWguZ2V0Rm9ybWF0KCksYT09PTApKWJyZWFrfXMuZm9ybWF0PXU/YTowfX1YKHQsQ2Ysdm9pZCAwKX19KX1mdW5jdGlvbiB3UihlLHQpe1duKHQsKCk9PntsZXQgbj1ydCgpO3ZhciByPVhyKHQuX3dpbmRvdyk7bGV0IGk9VHMoKTtpZihyKWlmKG1lKG4pKXtsZXQgbD1uLmFuY2hvcjt2YXIgbz1sLmdldE5vZGUoKTtsLnR5cGU9PT0iZWxlbWVudCImJmwub2Zmc2V0PT09MCYmbi5pc0NvbGxhcHNlZCgpJiYhbW4obykmJllyKCkuZ2V0Q2hpbGRyZW5TaXplKCk9PT0xJiZvLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKS5pc0VtcHR5KCkmJmkhPT1udWxsJiZuLmlzKGkpPyhyLnJlbW92ZUFsbFJhbmdlcygpLG4uZGlydHk9ITApOmUuZGV0YWlsIT09M3x8bi5pc0NvbGxhcHNlZCgpfHwocj1uLmZvY3VzLmdldE5vZGUoKSxvIT09ciYmKEIobyk/by5zZWxlY3QoMCk6by5nZXRQYXJlbnRPclRocm93KCkuc2VsZWN0KDApKSl9ZWxzZSBlLnBvaW50ZXJUeXBlPT09InRvdWNoIiYmKG89ci5hbmNob3JOb2RlLG8hPT1udWxsJiYobz1vLm5vZGVUeXBlLG89PT0xfHxvPT09MykpJiYocj1wdihpLHIsdCksV3IocikpO1godCx5UyxlKX0pfWZ1bmN0aW9uIFNSKGUsdCl7bGV0IG49ZS50YXJnZXQ7ZT1lLnBvaW50ZXJUeXBlLG4gaW5zdGFuY2VvZiBOb2RlJiZlIT09InRvdWNoIiYmV24odCwoKT0+e3R0KEl1KG4pKXx8KGhtPSEwKX0pfWZ1bmN0aW9uIGNFKGUpe3JldHVybiBlLmdldFRhcmdldFJhbmdlcz8oZT1lLmdldFRhcmdldFJhbmdlcygpLGUubGVuZ3RoPT09MD9udWxsOmVbMF0pOm51bGx9ZnVuY3Rpb24gRVIoZSx0KXtyZXR1cm4gZSE9PXR8fEIoZSl8fEIodCl8fCFlLmlzVG9rZW4oKXx8IXQuaXNUb2tlbigpfWZ1bmN0aW9uIENSKGUsdCl7bGV0IG49ZS5pbnB1dFR5cGUscj1jRShlKTtuPT09ImRlbGV0ZUNvbXBvc2l0aW9uVGV4dCJ8fHJvJiZZUyh0KXx8biE9PSJpbnNlcnRDb21wb3NpdGlvblRleHQiJiZXbih0LCgpPT57bGV0IGk9cnQoKTtpZihuPT09ImRlbGV0ZUNvbnRlbnRCYWNrd2FyZCIpe2lmKGk9PT1udWxsKXt2YXIgbz1UcygpO2lmKCFtZShvKSlyZXR1cm47V3Ioby5jbG9uZSgpKX1pZihtZShpKSl7bEU9PT0yMjkmJmUudGltZVN0YW1wPGx1KzMwJiZ0LmlzQ29tcG9zaW5nKCkmJmkuYW5jaG9yLmtleT09PWkuZm9jdXMua2V5PyhLdChudWxsKSxsdT0wLHNldFRpbWVvdXQoKCk9PntXbih0LCgpPT57S3QobnVsbCl9KX0sMzApLG1lKGkpJiYobz1pLmFuY2hvci5nZXROb2RlKCksby5tYXJrRGlydHkoKSxpLmZvcm1hdD1vLmdldEZvcm1hdCgpLGkuc3R5bGU9by5nZXRTdHlsZSgpKSk6KGUucHJldmVudERlZmF1bHQoKSxYKHQsdHUsITApKTtyZXR1cm59fWlmKG1lKGkpKXtvPWUuZGF0YSxrbCE9PW51bGwmJnV2KCExLHQsa2wpLGkuZGlydHkmJmtsPT09bnVsbHx8IWkuaXNDb2xsYXBzZWQoKXx8bW4oaS5hbmNob3IuZ2V0Tm9kZSgpKXx8cj09PW51bGx8fGkuYXBwbHlET01SYW5nZShyKSxrbD1udWxsO3ZhciBsPWkuZm9jdXMscz1pLmFuY2hvci5nZXROb2RlKCk7aWYobD1sLmdldE5vZGUoKSxuPT09Imluc2VydFRleHQifHxuPT09Imluc2VydFRyYW5zcG9zZSIpbz09PWAKYD8oZS5wcmV2ZW50RGVmYXVsdCgpLFgodCxrYSwhMSkpOm89PT1gCgpgPyhlLnByZXZlbnREZWZhdWx0KCksWCh0LEpwLHZvaWQgMCkpOm89PW51bGwmJmUuZGF0YVRyYW5zZmVyPyhvPWUuZGF0YVRyYW5zZmVyLmdldERhdGEoInRleHQvcGxhaW4iKSxlLnByZXZlbnREZWZhdWx0KCksaS5pbnNlcnRSYXdUZXh0KG8pKTpvIT1udWxsJiZ1RShpLHIsbyxlLnRpbWVTdGFtcCwhMCk/KGUucHJldmVudERlZmF1bHQoKSxYKHQsWWwsbykpOmtsPW8sc0U9ZS50aW1lU3RhbXA7ZWxzZSBzd2l0Y2goZS5wcmV2ZW50RGVmYXVsdCgpLG4pe2Nhc2UiaW5zZXJ0RnJvbVlhbmsiOmNhc2UiaW5zZXJ0RnJvbURyb3AiOmNhc2UiaW5zZXJ0UmVwbGFjZW1lbnRUZXh0IjpYKHQsWWwsZSk7YnJlYWs7Y2FzZSJpbnNlcnRGcm9tQ29tcG9zaXRpb24iOkt0KG51bGwpLFgodCxZbCxlKTticmVhaztjYXNlImluc2VydExpbmVCcmVhayI6S3QobnVsbCksWCh0LGthLCExKTticmVhaztjYXNlImluc2VydFBhcmFncmFwaCI6S3QobnVsbCksVGEmJiFrZj8oVGE9ITEsWCh0LGthLCExKSk6WCh0LEpwLHZvaWQgMCk7YnJlYWs7Y2FzZSJpbnNlcnRGcm9tUGFzdGUiOmNhc2UiaW5zZXJ0RnJvbVBhc3RlQXNRdW90YXRpb24iOlgodCxRZyxlKTticmVhaztjYXNlImRlbGV0ZUJ5Q29tcG9zaXRpb24iOkVSKHMsbCkmJlgodCxxcCxlKTticmVhaztjYXNlImRlbGV0ZUJ5RHJhZyI6Y2FzZSJkZWxldGVCeUN1dCI6WCh0LHFwLGUpO2JyZWFrO2Nhc2UiZGVsZXRlQ29udGVudCI6WCh0LHR1LCExKTticmVhaztjYXNlImRlbGV0ZVdvcmRCYWNrd2FyZCI6WCh0LG51LCEwKTticmVhaztjYXNlImRlbGV0ZVdvcmRGb3J3YXJkIjpYKHQsbnUsITEpO2JyZWFrO2Nhc2UiZGVsZXRlSGFyZExpbmVCYWNrd2FyZCI6Y2FzZSJkZWxldGVTb2Z0TGluZUJhY2t3YXJkIjpYKHQscnUsITApO2JyZWFrO2Nhc2UiZGVsZXRlQ29udGVudEZvcndhcmQiOmNhc2UiZGVsZXRlSGFyZExpbmVGb3J3YXJkIjpjYXNlImRlbGV0ZVNvZnRMaW5lRm9yd2FyZCI6WCh0LHJ1LCExKTticmVhaztjYXNlImZvcm1hdFN0cmlrZVRocm91Z2giOlgodCxVaSwic3RyaWtldGhyb3VnaCIpO2JyZWFrO2Nhc2UiZm9ybWF0Qm9sZCI6WCh0LFVpLCJib2xkIik7YnJlYWs7Y2FzZSJmb3JtYXRJdGFsaWMiOlgodCxVaSwiaXRhbGljIik7YnJlYWs7Y2FzZSJmb3JtYXRVbmRlcmxpbmUiOlgodCxVaSwidW5kZXJsaW5lIik7YnJlYWs7Y2FzZSJoaXN0b3J5VW5kbyI6WCh0LEpnLHZvaWQgMCk7YnJlYWs7Y2FzZSJoaXN0b3J5UmVkbyI6WCh0LHFnLHZvaWQgMCl9fX0pfWZ1bmN0aW9uIGtSKGUsdCl7ZS5zdG9wUHJvcGFnYXRpb24oKSxXbih0LCgpPT57dmFyIG49cnQoKSxyPWUuZGF0YSxpPWNFKGUpO2lmKHIhPW51bGwmJm1lKG4pJiZ1RShuLGkscixlLnRpbWVTdGFtcCwhMSkpe2RhJiYocG0odCxyKSxkYT0hMSk7dmFyIG89bi5hbmNob3IsbD1vLmdldE5vZGUoKTtpZihpPVhyKHQuX3dpbmRvdyksaT09PW51bGwpcmV0dXJuO2xldCBzPW8ub2Zmc2V0OyhvPVNkJiYhbi5pc0NvbGxhcHNlZCgpJiZKKGwpJiZpLmFuY2hvck5vZGUhPT1udWxsKSYmKGw9bC5nZXRUZXh0Q29udGVudCgpLnNsaWNlKDAscykrcitsLmdldFRleHRDb250ZW50KCkuc2xpY2UocytuLmZvY3VzLm9mZnNldCksaT1pLmFuY2hvck5vZGUsbz1sPT09KGkubm9kZVR5cGU9PT0zP2kubm9kZVZhbHVlOm51bGwpKSxvfHxYKHQsWWwscikscj1yLmxlbmd0aCxybyYmMTxyJiZlLmlucHV0VHlwZT09PSJpbnNlcnRDb21wb3NpdGlvblRleHQiJiYhdC5pc0NvbXBvc2luZygpJiYobi5hbmNob3Iub2Zmc2V0LT1yKSxudnx8a2Z8fHJ2fHwhdC5pc0NvbXBvc2luZygpfHwobHU9MCxLdChudWxsKSl9ZWxzZSB1dighMSx0LHIhPT1udWxsP3I6dm9pZCAwKSxkYSYmKHBtKHQscnx8dm9pZCAwKSxkYT0hMSk7aG4oKSxuPXB0KCkselMobil9KSxrbD1udWxsfWZ1bmN0aW9uICRSKGUsdCl7V24odCwoKT0+e2xldCBuPXJ0KCk7aWYobWUobikmJiF0LmlzQ29tcG9zaW5nKCkpe2xldCByPW4uYW5jaG9yLGk9bi5hbmNob3IuZ2V0Tm9kZSgpO0t0KHIua2V5KSwoZS50aW1lU3RhbXA8bHUrMzB8fHIudHlwZT09PSJlbGVtZW50Inx8IW4uaXNDb2xsYXBzZWQoKXx8aS5nZXRGb3JtYXQoKSE9PW4uZm9ybWF0fHxpLmdldFN0eWxlKCkhPT1uLnN0eWxlKSYmWCh0LFlsLGxSKX19KX1mdW5jdGlvbiBwbShlLHQpe3ZhciBuPWUuX2NvbXBvc2l0aW9uS2V5O2lmKEt0KG51bGwpLG4hPT1udWxsJiZ0IT1udWxsKXtpZih0PT09IiIpe3Q9SXQobiksZT1FZChlLmdldEVsZW1lbnRCeUtleShuKSksZSE9PW51bGwmJmUubm9kZVZhbHVlIT09bnVsbCYmSih0KSYmY3YodCxlLm5vZGVWYWx1ZSxudWxsLG51bGwsITApO3JldHVybn1pZih0W3QubGVuZ3RoLTFdPT09YApgJiYobj1ydCgpLG1lKG4pKSl7dD1uLmZvY3VzLG4uYW5jaG9yLnNldCh0LmtleSx0Lm9mZnNldCx0LnR5cGUpLFgoZSx3ZCxudWxsKTtyZXR1cm59fXV2KCEwLGUsdCl9ZnVuY3Rpb24gYlIoZSx0KXtybz9kYT0hMDpXbih0LCgpPT57cG0odCxlLmRhdGEpfSl9ZnVuY3Rpb24gVFIoZSx0KXtpZihsdT1lLnRpbWVTdGFtcCxsRT1lLmtleUNvZGUsIXQuaXNDb21wb3NpbmcoKSl7dmFye2tleUNvZGU6bixzaGlmdEtleTpyLGN0cmxLZXk6aSxtZXRhS2V5Om8sYWx0S2V5Omx9PWU7aWYoIVgodCx4UyxlKSl7aWYobiE9PTM5fHxpfHxvfHxsKWlmKG4hPT0zOXx8bHx8cnx8IWkmJiFvKWlmKG4hPT0zN3x8aXx8b3x8bClpZihuIT09Mzd8fGx8fHJ8fCFpJiYhbylpZihuIT09Mzh8fGl8fG8paWYobiE9PTQwfHxpfHxvKWlmKG49PT0xMyYmcilUYT0hMCxYKHQsd2QsZSk7ZWxzZSBpZihuPT09MzIpWCh0LCRTLGUpO2Vsc2UgaWYoUXQmJmkmJm49PT03OSllLnByZXZlbnREZWZhdWx0KCksVGE9ITAsWCh0LGthLCEwKTtlbHNlIGlmKG4hPT0xM3x8cil7dmFyIHM9UXQ/bHx8bz8hMTpuPT09OHx8bj09PTcyJiZpOml8fGx8fG8/ITE6bj09PTg7cz9uPT09OD9YKHQsYlMsZSk6KGUucHJldmVudERlZmF1bHQoKSxYKHQsdHUsITApKTpuPT09Mjc/WCh0LFRTLGUpOihzPVF0P3J8fGx8fG8/ITE6bj09PTQ2fHxuPT09NjgmJmk6aXx8bHx8bz8hMTpuPT09NDYscz9uPT09NDY/WCh0LE5TLGUpOihlLnByZXZlbnREZWZhdWx0KCksWCh0LHR1LCExKSk6bj09PTgmJihRdD9sOmkpPyhlLnByZXZlbnREZWZhdWx0KCksWCh0LG51LCEwKSk6bj09PTQ2JiYoUXQ/bDppKT8oZS5wcmV2ZW50RGVmYXVsdCgpLFgodCxudSwhMSkpOlF0JiZvJiZuPT09OD8oZS5wcmV2ZW50RGVmYXVsdCgpLFgodCxydSwhMCkpOlF0JiZvJiZuPT09NDY/KGUucHJldmVudERlZmF1bHQoKSxYKHQscnUsITEpKTpuPT09NjYmJiFsJiYoUXQ/bzppKT8oZS5wcmV2ZW50RGVmYXVsdCgpLFgodCxVaSwiYm9sZCIpKTpuPT09ODUmJiFsJiYoUXQ/bzppKT8oZS5wcmV2ZW50RGVmYXVsdCgpLFgodCxVaSwidW5kZXJsaW5lIikpOm49PT03MyYmIWwmJihRdD9vOmkpPyhlLnByZXZlbnREZWZhdWx0KCksWCh0LFVpLCJpdGFsaWMiKSk6biE9PTl8fGx8fGl8fG8/bj09PTkwJiYhciYmKFF0P286aSk/KGUucHJldmVudERlZmF1bHQoKSxYKHQsSmcsdm9pZCAwKSk6KHM9UXQ/bj09PTkwJiZvJiZyOm49PT04OSYmaXx8bj09PTkwJiZpJiZyLHM/KGUucHJldmVudERlZmF1bHQoKSxYKHQscWcsdm9pZCAwKSk6YnModC5fZWRpdG9yU3RhdGUuX3NlbGVjdGlvbik/KHM9cj8hMTpuPT09Njc/UXQ/bzppOiExLHM/KGUucHJldmVudERlZmF1bHQoKSxYKHQsZXYsZSkpOihzPXI/ITE6bj09PTg4P1F0P286aTohMSxzPyhlLnByZXZlbnREZWZhdWx0KCksWCh0LHR2LGUpKTpuPT09NjUmJihRdD9vOmkpJiYoZS5wcmV2ZW50RGVmYXVsdCgpLFgodCxlbSxlKSkpKTohcm8mJm49PT02NSYmKFF0P286aSkmJihlLnByZXZlbnREZWZhdWx0KCksWCh0LGVtLGUpKSk6WCh0LFJTLGUpKX1lbHNlIFRhPSExLFgodCx3ZCxlKTtlbHNlIFgodCxrUyxlKTtlbHNlIFgodCxDUyxlKTtlbHNlIFgodCxFUyxlKTtlbHNlIFgodCxTUyxlKTtlbHNlIFgodCx3UyxlKTtlbHNlIFgodCxfUyxlKTsoaXx8cnx8bHx8bykmJlgodCxJUyxlKX19fWZ1bmN0aW9uIGRFKGUpe2xldCB0PWUuX19sZXhpY2FsRXZlbnRIYW5kbGVzO3JldHVybiB0PT09dm9pZCAwJiYodD1bXSxlLl9fbGV4aWNhbEV2ZW50SGFuZGxlcz10KSx0fWxldCBYbD1uZXcgTWFwO2Z1bmN0aW9uIGZFKGUpe2U9ZS50YXJnZXQ7bGV0IHQ9WHIoZT09bnVsbD9udWxsOmUubm9kZVR5cGU9PT05P2UuZGVmYXVsdFZpZXc6ZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KTtpZih0IT09bnVsbCl7dmFyIG49c3YodC5hbmNob3JOb2RlKTtpZihuIT09bnVsbCl7aG0mJihobT0hMSxXbihuLCgpPT57dmFyIGw9VHMoKSxzPXQuYW5jaG9yTm9kZTtzIT09bnVsbCYmKHM9cy5ub2RlVHlwZSxzPT09MXx8cz09PTMpJiYobD1wdihsLHQsbiksV3IobCkpfSkpLGU9YXYobiksZT1lW2UubGVuZ3RoLTFdO3ZhciByPWUuX2tleSxpPVhsLmdldChyKSxvPWl8fGU7byE9PW4mJkwwKHQsbywhMSksTDAodCxuLCEwKSxuIT09ZT9YbC5zZXQocixuKTppJiZYbC5kZWxldGUocil9fX1mdW5jdGlvbiBOUihlLHQpe2JhPT09MCYmZS5vd25lckRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGlvbmNoYW5nZSIsZkUpLGJhKyssZS5fX2xleGljYWxFZGl0b3I9dDtsZXQgbj1kRShlKTtmb3IobGV0IHI9MDtyPGRtLmxlbmd0aDtyKyspe2xldFtpLG9dPWRtW3JdLGw9dHlwZW9mIG89PSJmdW5jdGlvbiI/cz0+e3MuX2xleGljYWxIYW5kbGVkIT09ITAmJihzLl9sZXhpY2FsSGFuZGxlZD0hMCx0LmlzRWRpdGFibGUoKSYmbyhzLHQpKX06cz0+e2lmKHMuX2xleGljYWxIYW5kbGVkIT09ITAmJihzLl9sZXhpY2FsSGFuZGxlZD0hMCx0LmlzRWRpdGFibGUoKSkpc3dpdGNoKGkpe2Nhc2UiY3V0IjpyZXR1cm4gWCh0LHR2LHMpO2Nhc2UiY29weSI6cmV0dXJuIFgodCxldixzKTtjYXNlInBhc3RlIjpyZXR1cm4gWCh0LFFnLHMpO2Nhc2UiZHJhZ3N0YXJ0IjpyZXR1cm4gWCh0LFBTLHMpO2Nhc2UiZHJhZ292ZXIiOnJldHVybiBYKHQsQVMscyk7Y2FzZSJkcmFnZW5kIjpyZXR1cm4gWCh0LE1TLHMpO2Nhc2UiZm9jdXMiOnJldHVybiBYKHQsRFMscyk7Y2FzZSJibHVyIjpyZXR1cm4gWCh0LExTLHMpO2Nhc2UiZHJvcCI6cmV0dXJuIFgodCxPUyxzKX19O2UuYWRkRXZlbnRMaXN0ZW5lcihpLGwpLG4ucHVzaCgoKT0+e2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihpLGwpfSl9fWZ1bmN0aW9uIG1tKGUsdCxuKXtobigpO3ZhciByPWUuX19rZXk7bGV0IGk9ZS5nZXRQYXJlbnQoKTtpZihpIT09bnVsbCl7dmFyIG89cnQoKTtpZihtZShvKSYmQihlKSl7dmFye2FuY2hvcjpsLGZvY3VzOnN9PW8sYT1sLmdldE5vZGUoKSx1PXMuZ2V0Tm9kZSgpO2JkKGEsZSkmJmwuc2V0KGUuX19rZXksMCwiZWxlbWVudCIpLGJkKHUsZSkmJnMuc2V0KGUuX19rZXksMCwiZWxlbWVudCIpfWlmKGE9byx1PSExLG1lKGEpJiZ0KXtvPWEuYW5jaG9yO2xldCBjPWEuZm9jdXM7by5rZXk9PT1yJiYoT2QobyxlLGksZS5nZXRQcmV2aW91c1NpYmxpbmcoKSxlLmdldE5leHRTaWJsaW5nKCkpLHU9ITApLGMua2V5PT09ciYmKE9kKGMsZSxpLGUuZ2V0UHJldmlvdXNTaWJsaW5nKCksZS5nZXROZXh0U2libGluZygpKSx1PSEwKX1lbHNlIGJzKGEpJiZ0JiZlLmlzU2VsZWN0ZWQoKSYmZS5zZWxlY3RQcmV2aW91cygpO21lKGEpJiZ0JiYhdT8ocj1lLmdldEluZGV4V2l0aGluUGFyZW50KCksRm8oZSksUmQoYSxpLHIsLTEpKTpGbyhlKSxufHx4cihpKXx8aS5jYW5CZUVtcHR5KCl8fCFpLmlzRW1wdHkoKXx8bW0oaSx0KSx0JiZtbihpKSYmaS5pc0VtcHR5KCkmJmkuc2VsZWN0RW5kKCl9fWNsYXNzIHp1e3N0YXRpYyBnZXRUeXBlKCl7SCg2NCx0aGlzLm5hbWUpfXN0YXRpYyBjbG9uZSgpe0goNjUsdGhpcy5uYW1lKX1jb25zdHJ1Y3Rvcih0KXt0aGlzLl9fdHlwZT10aGlzLmNvbnN0cnVjdG9yLmdldFR5cGUoKSx0aGlzLl9fbmV4dD10aGlzLl9fcHJldj10aGlzLl9fcGFyZW50PW51bGwsVlModGhpcyx0KX1nZXRUeXBlKCl7cmV0dXJuIHRoaXMuX190eXBlfWlzQXR0YWNoZWQoKXtmb3IodmFyIHQ9dGhpcy5fX2tleTt0IT09bnVsbDspe2lmKHQ9PT0icm9vdCIpcmV0dXJuITA7aWYodD1JdCh0KSx0PT09bnVsbClicmVhazt0PXQuX19wYXJlbnR9cmV0dXJuITF9aXNTZWxlY3RlZCh0KXtpZih0PXR8fHJ0KCksdD09bnVsbClyZXR1cm4hMTtsZXQgbj10LmdldE5vZGVzKCkuc29tZShyPT5yLl9fa2V5PT09dGhpcy5fX2tleSk7cmV0dXJuIEoodGhpcyk/bjptZSh0KSYmdC5hbmNob3IudHlwZT09PSJlbGVtZW50IiYmdC5mb2N1cy50eXBlPT09ImVsZW1lbnQiJiZ0LmFuY2hvci5rZXk9PT10LmZvY3VzLmtleSYmdC5hbmNob3Iub2Zmc2V0PT09dC5mb2N1cy5vZmZzZXQ/ITE6bn1nZXRLZXkoKXtyZXR1cm4gdGhpcy5fX2tleX1nZXRJbmRleFdpdGhpblBhcmVudCgpe3ZhciB0PXRoaXMuZ2V0UGFyZW50KCk7aWYodD09PW51bGwpcmV0dXJuLTE7dD10LmdldEZpcnN0Q2hpbGQoKTtsZXQgbj0wO2Zvcig7dCE9PW51bGw7KXtpZih0aGlzLmlzKHQpKXJldHVybiBuO24rKyx0PXQuZ2V0TmV4dFNpYmxpbmcoKX1yZXR1cm4tMX1nZXRQYXJlbnQoKXtsZXQgdD10aGlzLmdldExhdGVzdCgpLl9fcGFyZW50O3JldHVybiB0PT09bnVsbD9udWxsOkl0KHQpfWdldFBhcmVudE9yVGhyb3coKXtsZXQgdD10aGlzLmdldFBhcmVudCgpO3JldHVybiB0PT09bnVsbCYmSCg2Nix0aGlzLl9fa2V5KSx0fWdldFRvcExldmVsRWxlbWVudCgpe2xldCB0PXRoaXM7Zm9yKDt0IT09bnVsbDspe2xldCBuPXQuZ2V0UGFyZW50KCk7aWYoeHIobikpcmV0dXJuIHQ7dD1ufXJldHVybiBudWxsfWdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKXtsZXQgdD10aGlzLmdldFRvcExldmVsRWxlbWVudCgpO3JldHVybiB0PT09bnVsbCYmSCg2Nyx0aGlzLl9fa2V5KSx0fWdldFBhcmVudHMoKXtsZXQgdD1bXSxuPXRoaXMuZ2V0UGFyZW50KCk7Zm9yKDtuIT09bnVsbDspdC5wdXNoKG4pLG49bi5nZXRQYXJlbnQoKTtyZXR1cm4gdH1nZXRQYXJlbnRLZXlzKCl7bGV0IHQ9W10sbj10aGlzLmdldFBhcmVudCgpO2Zvcig7biE9PW51bGw7KXQucHVzaChuLl9fa2V5KSxuPW4uZ2V0UGFyZW50KCk7cmV0dXJuIHR9Z2V0UHJldmlvdXNTaWJsaW5nKCl7bGV0IHQ9dGhpcy5nZXRMYXRlc3QoKS5fX3ByZXY7cmV0dXJuIHQ9PT1udWxsP251bGw6SXQodCl9Z2V0UHJldmlvdXNTaWJsaW5ncygpe2xldCB0PVtdO3ZhciBuPXRoaXMuZ2V0UGFyZW50KCk7aWYobj09PW51bGwpcmV0dXJuIHQ7Zm9yKG49bi5nZXRGaXJzdENoaWxkKCk7biE9PW51bGwmJiFuLmlzKHRoaXMpOyl0LnB1c2gobiksbj1uLmdldE5leHRTaWJsaW5nKCk7cmV0dXJuIHR9Z2V0TmV4dFNpYmxpbmcoKXtsZXQgdD10aGlzLmdldExhdGVzdCgpLl9fbmV4dDtyZXR1cm4gdD09PW51bGw/bnVsbDpJdCh0KX1nZXROZXh0U2libGluZ3MoKXtsZXQgdD1bXSxuPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKTtmb3IoO24hPT1udWxsOyl0LnB1c2gobiksbj1uLmdldE5leHRTaWJsaW5nKCk7cmV0dXJuIHR9Z2V0Q29tbW9uQW5jZXN0b3IodCl7bGV0IG49dGhpcy5nZXRQYXJlbnRzKCk7dmFyIHI9dC5nZXRQYXJlbnRzKCk7Qih0aGlzKSYmbi51bnNoaWZ0KHRoaXMpLEIodCkmJnIudW5zaGlmdCh0KSx0PW4ubGVuZ3RoO3ZhciBpPXIubGVuZ3RoO2lmKHQ9PT0wfHxpPT09MHx8blt0LTFdIT09cltpLTFdKXJldHVybiBudWxsO2ZvcihyPW5ldyBTZXQociksaT0wO2k8dDtpKyspe2xldCBvPW5baV07aWYoci5oYXMobykpcmV0dXJuIG99cmV0dXJuIG51bGx9aXModCl7cmV0dXJuIHQ9PW51bGw/ITE6dGhpcy5fX2tleT09PXQuX19rZXl9aXNCZWZvcmUodCl7aWYodGhpcz09PXQpcmV0dXJuITE7aWYodC5pc1BhcmVudE9mKHRoaXMpKXJldHVybiEwO2lmKHRoaXMuaXNQYXJlbnRPZih0KSlyZXR1cm4hMTt2YXIgbj10aGlzLmdldENvbW1vbkFuY2VzdG9yKHQpO2xldCByPXRoaXM7Zm9yKDs7KXt2YXIgaT1yLmdldFBhcmVudE9yVGhyb3coKTtpZihpPT09bil7aT1yLmdldEluZGV4V2l0aGluUGFyZW50KCk7YnJlYWt9cj1pfWZvcihyPXQ7Oyl7aWYodD1yLmdldFBhcmVudE9yVGhyb3coKSx0PT09bil7bj1yLmdldEluZGV4V2l0aGluUGFyZW50KCk7YnJlYWt9cj10fXJldHVybiBpPG59aXNQYXJlbnRPZih0KXtsZXQgbj10aGlzLl9fa2V5O2lmKG49PT10Ll9fa2V5KXJldHVybiExO2Zvcig7dCE9PW51bGw7KXtpZih0Ll9fa2V5PT09bilyZXR1cm4hMDt0PXQuZ2V0UGFyZW50KCl9cmV0dXJuITF9Z2V0Tm9kZXNCZXR3ZWVuKHQpe2xldCBuPXRoaXMuaXNCZWZvcmUodCkscj1bXSxpPW5ldyBTZXQ7Zm9yKHZhciBvPXRoaXM7Oyl7dmFyIGw9by5fX2tleTtpZihpLmhhcyhsKXx8KGkuYWRkKGwpLHIucHVzaChvKSksbz09PXQpYnJlYWs7aWYobD1CKG8pP24/by5nZXRGaXJzdENoaWxkKCk6by5nZXRMYXN0Q2hpbGQoKTpudWxsLGwhPT1udWxsKW89bDtlbHNlIGlmKGw9bj9vLmdldE5leHRTaWJsaW5nKCk6by5nZXRQcmV2aW91c1NpYmxpbmcoKSxsIT09bnVsbClvPWw7ZWxzZXtpZihvPW8uZ2V0UGFyZW50T3JUaHJvdygpLGkuaGFzKG8uX19rZXkpfHxyLnB1c2gobyksbz09PXQpYnJlYWs7bD1vO2RvIGw9PT1udWxsJiZIKDY4KSxvPW4/bC5nZXROZXh0U2libGluZygpOmwuZ2V0UHJldmlvdXNTaWJsaW5nKCksbD1sLmdldFBhcmVudCgpLGwhPT1udWxsJiYobyE9PW51bGx8fGkuaGFzKGwuX19rZXkpfHxyLnB1c2gobCkpO3doaWxlKG89PT1udWxsKX19cmV0dXJuIG58fHIucmV2ZXJzZSgpLHJ9aXNEaXJ0eSgpe2xldCB0PXB0KCkuX2RpcnR5TGVhdmVzO3JldHVybiB0IT09bnVsbCYmdC5oYXModGhpcy5fX2tleSl9Z2V0TGF0ZXN0KCl7bGV0IHQ9SXQodGhpcy5fX2tleSk7cmV0dXJuIHQ9PT1udWxsJiZIKDExMyksdH1nZXRXcml0YWJsZSgpe2huKCk7dmFyIHQ9UXIoKSxuPXB0KCk7dD10Ll9ub2RlTWFwO2xldCByPXRoaXMuX19rZXksaT10aGlzLmdldExhdGVzdCgpLG89aS5fX3BhcmVudDtuPW4uX2Nsb25lTm90TmVlZGVkO3ZhciBsPXJ0KCk7cmV0dXJuIGwhPT1udWxsJiYobC5fY2FjaGVkTm9kZXM9bnVsbCksbi5oYXMocik/KENkKGkpLGkpOihsPWkuY29uc3RydWN0b3IuY2xvbmUoaSksbC5fX3BhcmVudD1vLGwuX19uZXh0PWkuX19uZXh0LGwuX19wcmV2PWkuX19wcmV2LEIoaSkmJkIobCk/KGwuX19maXJzdD1pLl9fZmlyc3QsbC5fX2xhc3Q9aS5fX2xhc3QsbC5fX3NpemU9aS5fX3NpemUsbC5fX2luZGVudD1pLl9faW5kZW50LGwuX19mb3JtYXQ9aS5fX2Zvcm1hdCxsLl9fZGlyPWkuX19kaXIpOkooaSkmJkoobCkmJihsLl9fZm9ybWF0PWkuX19mb3JtYXQsbC5fX3N0eWxlPWkuX19zdHlsZSxsLl9fbW9kZT1pLl9fbW9kZSxsLl9fZGV0YWlsPWkuX19kZXRhaWwpLG4uYWRkKHIpLGwuX19rZXk9cixDZChsKSx0LnNldChyLGwpLGwpfWdldFRleHRDb250ZW50KCl7cmV0dXJuIiJ9Z2V0VGV4dENvbnRlbnRTaXplKCl7cmV0dXJuIHRoaXMuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGh9Y3JlYXRlRE9NKCl7SCg3MCl9dXBkYXRlRE9NKCl7SCg3MSl9ZXhwb3J0RE9NKHQpe3JldHVybntlbGVtZW50OnRoaXMuY3JlYXRlRE9NKHQuX2NvbmZpZyx0KX19ZXhwb3J0SlNPTigpe0goNzIpfXN0YXRpYyBpbXBvcnRKU09OKCl7SCgxOCx0aGlzLm5hbWUpfXN0YXRpYyB0cmFuc2Zvcm0oKXtyZXR1cm4gbnVsbH1yZW1vdmUodCl7bW0odGhpcywhMCx0KX1yZXBsYWNlKHQsbil7aG4oKTt2YXIgcj1ydCgpO3IhPT1udWxsJiYocj1yLmNsb25lKCkpLFJoKHRoaXMsdCk7bGV0IGk9dGhpcy5nZXRMYXRlc3QoKSxvPXRoaXMuX19rZXksbD10Ll9fa2V5LHM9dC5nZXRXcml0YWJsZSgpO3Q9dGhpcy5nZXRQYXJlbnRPclRocm93KCkuZ2V0V3JpdGFibGUoKTtsZXQgYT10Ll9fc2l6ZTtGbyhzKTtsZXQgdT1pLmdldFByZXZpb3VzU2libGluZygpLGM9aS5nZXROZXh0U2libGluZygpLGQ9aS5fX3ByZXYsZj1pLl9fbmV4dCxoPWkuX19wYXJlbnQ7cmV0dXJuIG1tKGksITEsITApLHU9PT1udWxsP3QuX19maXJzdD1sOnUuZ2V0V3JpdGFibGUoKS5fX25leHQ9bCxzLl9fcHJldj1kLGM9PT1udWxsP3QuX19sYXN0PWw6Yy5nZXRXcml0YWJsZSgpLl9fcHJldj1sLHMuX19uZXh0PWYscy5fX3BhcmVudD1oLHQuX19zaXplPWEsbiYmdGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2gobT0+e3MuYXBwZW5kKG0pfSksbWUocikmJihXcihyKSxuPXIuYW5jaG9yLHI9ci5mb2N1cyxuLmtleT09PW8mJnowKG4scyksci5rZXk9PT1vJiZ6MChyLHMpKSxXaSgpPT09byYmS3QobCksc31pbnNlcnRBZnRlcih0LG49ITApe2huKCksUmgodGhpcyx0KTt2YXIgcj10aGlzLmdldFdyaXRhYmxlKCk7bGV0IGk9dC5nZXRXcml0YWJsZSgpO3ZhciBvPWkuZ2V0UGFyZW50KCk7bGV0IGw9cnQoKTt2YXIgcz0hMSxhPSExO2lmKG8hPT1udWxsKXt2YXIgdT10LmdldEluZGV4V2l0aGluUGFyZW50KCk7Rm8oaSksbWUobCkmJihhPW8uX19rZXkscz1sLmFuY2hvcixvPWwuZm9jdXMscz1zLnR5cGU9PT0iZWxlbWVudCImJnMua2V5PT09YSYmcy5vZmZzZXQ9PT11KzEsYT1vLnR5cGU9PT0iZWxlbWVudCImJm8ua2V5PT09YSYmby5vZmZzZXQ9PT11KzEpfW89dGhpcy5nZXROZXh0U2libGluZygpLHU9dGhpcy5nZXRQYXJlbnRPclRocm93KCkuZ2V0V3JpdGFibGUoKTtsZXQgYz1pLl9fa2V5LGQ9ci5fX25leHQ7cmV0dXJuIG89PT1udWxsP3UuX19sYXN0PWM6by5nZXRXcml0YWJsZSgpLl9fcHJldj1jLHUuX19zaXplKyssci5fX25leHQ9YyxpLl9fbmV4dD1kLGkuX19wcmV2PXIuX19rZXksaS5fX3BhcmVudD1yLl9fcGFyZW50LG4mJm1lKGwpJiYobj10aGlzLmdldEluZGV4V2l0aGluUGFyZW50KCksUmQobCx1LG4rMSkscj11Ll9fa2V5LHMmJmwuYW5jaG9yLnNldChyLG4rMiwiZWxlbWVudCIpLGEmJmwuZm9jdXMuc2V0KHIsbisyLCJlbGVtZW50IikpLHR9aW5zZXJ0QmVmb3JlKHQsbj0hMCl7aG4oKSxSaCh0aGlzLHQpO3ZhciByPXRoaXMuZ2V0V3JpdGFibGUoKTtsZXQgaT10LmdldFdyaXRhYmxlKCksbz1pLl9fa2V5O0ZvKGkpO2xldCBsPXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCkscz10aGlzLmdldFBhcmVudE9yVGhyb3coKS5nZXRXcml0YWJsZSgpLGE9ci5fX3ByZXYsdT10aGlzLmdldEluZGV4V2l0aGluUGFyZW50KCk7cmV0dXJuIGw9PT1udWxsP3MuX19maXJzdD1vOmwuZ2V0V3JpdGFibGUoKS5fX25leHQ9byxzLl9fc2l6ZSsrLHIuX19wcmV2PW8saS5fX3ByZXY9YSxpLl9fbmV4dD1yLl9fa2V5LGkuX19wYXJlbnQ9ci5fX3BhcmVudCxyPXJ0KCksbiYmbWUocikmJihuPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpLFJkKHIsbix1KSksdH1pc1BhcmVudFJlcXVpcmVkKCl7cmV0dXJuITF9Y3JlYXRlUGFyZW50RWxlbWVudE5vZGUoKXtyZXR1cm4gWW8oKX1zZWxlY3RQcmV2aW91cyh0LG4pe2huKCk7bGV0IHI9dGhpcy5nZXRQcmV2aW91c1NpYmxpbmcoKSxpPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpO3JldHVybiByPT09bnVsbD9pLnNlbGVjdCgwLDApOkIocik/ci5zZWxlY3QoKTpKKHIpP3Iuc2VsZWN0KHQsbik6KHQ9ci5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEsaS5zZWxlY3QodCx0KSl9c2VsZWN0TmV4dCh0LG4pe2huKCk7bGV0IHI9dGhpcy5nZXROZXh0U2libGluZygpLGk9dGhpcy5nZXRQYXJlbnRPclRocm93KCk7cmV0dXJuIHI9PT1udWxsP2kuc2VsZWN0KCk6QihyKT9yLnNlbGVjdCgwLDApOkoocik/ci5zZWxlY3QodCxuKToodD1yLmdldEluZGV4V2l0aGluUGFyZW50KCksaS5zZWxlY3QodCx0KSl9bWFya0RpcnR5KCl7dGhpcy5nZXRXcml0YWJsZSgpfX1jbGFzcyBrcyBleHRlbmRzIHp1e3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuImxpbmVicmVhayJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcga3ModC5fX2tleSl9Y29uc3RydWN0b3IodCl7c3VwZXIodCl9Z2V0VGV4dENvbnRlbnQoKXtyZXR1cm5gCmB9Y3JlYXRlRE9NKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIil9dXBkYXRlRE9NKCl7cmV0dXJuITF9c3RhdGljIGltcG9ydERPTSgpe3JldHVybnticjp0PT57bGV0IG49dC5wYXJlbnRFbGVtZW50LHIsaTtyZXR1cm4gbiE9PW51bGwmJigocj1uLmZpcnN0Q2hpbGQpPT09dHx8ci5uZXh0U2libGluZz09PXQmJnIubm9kZVR5cGU9PT0zJiYoci50ZXh0Q29udGVudHx8IiIpLm1hdGNoKC9eKCB8XHR8XHI/XG4pKyQvKSE9PW51bGwpJiYoKGk9bi5sYXN0Q2hpbGQpPT09dHx8aS5wcmV2aW91c1NpYmxpbmc9PT10JiZpLm5vZGVUeXBlPT09MyYmKGkudGV4dENvbnRlbnR8fCIiKS5tYXRjaCgvXiggfFx0fFxyP1xuKSskLykhPT1udWxsKT9udWxsOntjb252ZXJzaW9uOlJSLHByaW9yaXR5OjB9fX19c3RhdGljIGltcG9ydEpTT04oKXtyZXR1cm4gZHMoKX1leHBvcnRKU09OKCl7cmV0dXJue3R5cGU6ImxpbmVicmVhayIsdmVyc2lvbjoxfX19ZnVuY3Rpb24gUlIoKXtyZXR1cm57bm9kZTpkcygpfX1mdW5jdGlvbiBkcygpe3JldHVybiBqdShuZXcga3MpfWZ1bmN0aW9uIHN1KGUpe3JldHVybiBlIGluc3RhbmNlb2Yga3N9ZnVuY3Rpb24gQWgoZSx0KXtyZXR1cm4gdCYxNj8iY29kZSI6dCYxMjg/Im1hcmsiOnQmMzI/InN1YiI6dCY2ND8ic3VwIjpudWxsfWZ1bmN0aW9uIE1oKGUsdCl7cmV0dXJuIHQmMT8ic3Ryb25nIjp0JjI/ImVtIjoic3BhbiJ9ZnVuY3Rpb24gRGgoZSx0LG4scixpKXtlPXIuY2xhc3NMaXN0LHI9JGEoaSwiYmFzZSIpLHIhPT12b2lkIDAmJmUuYWRkKC4uLnIpLHI9JGEoaSwidW5kZXJsaW5lU3RyaWtldGhyb3VnaCIpO2xldCBvPSExLGw9dCY4JiZ0JjQ7dmFyIHM9biY4JiZuJjQ7ciE9PXZvaWQgMCYmKHM/KG89ITAsbHx8ZS5hZGQoLi4ucikpOmwmJmUucmVtb3ZlKC4uLnIpKTtmb3IobGV0IGEgaW4gem8pcz16b1thXSxyPSRhKGksYSksciE9PXZvaWQgMCYmKG4mcz8hb3x8YSE9PSJ1bmRlcmxpbmUiJiZhIT09InN0cmlrZXRocm91Z2giPyghKHQmcyl8fGwmJmE9PT0idW5kZXJsaW5lInx8YT09PSJzdHJpa2V0aHJvdWdoIikmJmUuYWRkKC4uLnIpOnQmcyYmZS5yZW1vdmUoLi4ucik6dCZzJiZlLnJlbW92ZSguLi5yKSl9ZnVuY3Rpb24gTGgoZSx0LG4pe2xldCByPXQuZmlyc3RDaGlsZDtpZihuPW4uaXNDb21wb3NpbmcoKSxlKz1uPyRmOiIiLHI9PW51bGwpdC50ZXh0Q29udGVudD1lO2Vsc2UgaWYodD1yLm5vZGVWYWx1ZSx0IT09ZSlpZihufHxybyl7bj10Lmxlbmd0aDtsZXQgaT1lLmxlbmd0aCxvPTAsbD0wO2Zvcig7bzxuJiZvPGkmJnRbb109PT1lW29dOylvKys7Zm9yKDtsK288biYmbCtvPGkmJnRbbi1sLTFdPT09ZVtpLWwtMV07KWwrKztlPVtvLG4tby1sLGUuc2xpY2UobyxpLWwpXTtsZXRbcyxhLHVdPWU7YSE9PTAmJnIuZGVsZXRlRGF0YShzLGEpLHIuaW5zZXJ0RGF0YShzLHUpfWVsc2Ugci5ub2RlVmFsdWU9ZX1mdW5jdGlvbiBtYyhlLHQpe3JldHVybiB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodCksdC5hcHBlbmRDaGlsZChlKSx0fWNsYXNzIHNsIGV4dGVuZHMgenV7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4idGV4dCJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgc2wodC5fX3RleHQsdC5fX2tleSl9Y29uc3RydWN0b3IodCxuKXtzdXBlcihuKSx0aGlzLl9fdGV4dD10LHRoaXMuX19mb3JtYXQ9MCx0aGlzLl9fc3R5bGU9IiIsdGhpcy5fX2RldGFpbD10aGlzLl9fbW9kZT0wfWdldEZvcm1hdCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fZm9ybWF0fWdldERldGFpbCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fZGV0YWlsfWdldE1vZGUoKXtsZXQgdD10aGlzLmdldExhdGVzdCgpO3JldHVybiBmUlt0Ll9fbW9kZV19Z2V0U3R5bGUoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3N0eWxlfWlzVG9rZW4oKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX21vZGU9PT0xfWlzQ29tcG9zaW5nKCl7cmV0dXJuIHRoaXMuX19rZXk9PT1XaSgpfWlzU2VnbWVudGVkKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19tb2RlPT09Mn1pc0RpcmVjdGlvbmxlc3MoKXtyZXR1cm4odGhpcy5nZXRMYXRlc3QoKS5fX2RldGFpbCYxKSE9PTB9aXNVbm1lcmdlYWJsZSgpe3JldHVybih0aGlzLmdldExhdGVzdCgpLl9fZGV0YWlsJjIpIT09MH1oYXNGb3JtYXQodCl7cmV0dXJuIHQ9em9bdF0sKHRoaXMuZ2V0Rm9ybWF0KCkmdCkhPT0wfWlzU2ltcGxlVGV4dCgpe3JldHVybiB0aGlzLl9fdHlwZT09PSJ0ZXh0IiYmdGhpcy5fX21vZGU9PT0wfWdldFRleHRDb250ZW50KCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX190ZXh0fWdldEZvcm1hdEZsYWdzKHQsbil7bGV0IHI9dGhpcy5nZXRMYXRlc3QoKS5fX2Zvcm1hdDtyZXR1cm4gVVMocix0LG4pfWNyZWF0ZURPTSh0KXt2YXIgbj10aGlzLl9fZm9ybWF0LHI9QWgodGhpcyxuKTtsZXQgaT1NaCh0aGlzLG4pLG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChyPT09bnVsbD9pOnIpLGw9bztyZXR1cm4gdGhpcy5oYXNGb3JtYXQoImNvZGUiKSYmby5zZXRBdHRyaWJ1dGUoInNwZWxsY2hlY2siLCJmYWxzZSIpLHIhPT1udWxsJiYobD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGkpLG8uYXBwZW5kQ2hpbGQobCkpLHI9bCxMaCh0aGlzLl9fdGV4dCxyLHRoaXMpLHQ9dC50aGVtZS50ZXh0LHQhPT12b2lkIDAmJkRoKGksMCxuLHIsdCksbj10aGlzLl9fc3R5bGUsbiE9PSIiJiYoby5zdHlsZS5jc3NUZXh0PW4pLG99dXBkYXRlRE9NKHQsbixyKXtsZXQgaT10aGlzLl9fdGV4dDt2YXIgbz10Ll9fZm9ybWF0LGw9dGhpcy5fX2Zvcm1hdCxzPUFoKHRoaXMsbyk7bGV0IGE9QWgodGhpcyxsKTt2YXIgdT1NaCh0aGlzLG8pO2xldCBjPU1oKHRoaXMsbCk7cmV0dXJuKHM9PT1udWxsP3U6cykhPT0oYT09PW51bGw/YzphKT8hMDpzPT09YSYmdSE9PWM/KG89bi5maXJzdENoaWxkLG89PW51bGwmJkgoNDgpLHQ9cz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGMpLExoKGksdCx0aGlzKSxyPXIudGhlbWUudGV4dCxyIT09dm9pZCAwJiZEaChjLDAsbCx0LHIpLG4ucmVwbGFjZUNoaWxkKHMsbyksITEpOih1PW4sYSE9PW51bGwmJnMhPT1udWxsJiYodT1uLmZpcnN0Q2hpbGQsdT09bnVsbCYmSCg0OSkpLExoKGksdSx0aGlzKSxyPXIudGhlbWUudGV4dCxyIT09dm9pZCAwJiZvIT09bCYmRGgoYyxvLGwsdSxyKSxsPXRoaXMuX19zdHlsZSx0Ll9fc3R5bGUhPT1sJiYobi5zdHlsZS5jc3NUZXh0PWwpLCExKX1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJueyIjdGV4dCI6KCk9Pih7Y29udmVyc2lvbjpBUixwcmlvcml0eTowfSksYjooKT0+KHtjb252ZXJzaW9uOlBSLHByaW9yaXR5OjB9KSxjb2RlOigpPT4oe2NvbnZlcnNpb246UmkscHJpb3JpdHk6MH0pLGVtOigpPT4oe2NvbnZlcnNpb246UmkscHJpb3JpdHk6MH0pLGk6KCk9Pih7Y29udmVyc2lvbjpSaSxwcmlvcml0eTowfSksczooKT0+KHtjb252ZXJzaW9uOlJpLHByaW9yaXR5OjB9KSxzcGFuOigpPT4oe2NvbnZlcnNpb246T1IscHJpb3JpdHk6MH0pLHN0cm9uZzooKT0+KHtjb252ZXJzaW9uOlJpLHByaW9yaXR5OjB9KSxzdWI6KCk9Pih7Y29udmVyc2lvbjpSaSxwcmlvcml0eTowfSksc3VwOigpPT4oe2NvbnZlcnNpb246UmkscHJpb3JpdHk6MH0pLHU6KCk9Pih7Y29udmVyc2lvbjpSaSxwcmlvcml0eTowfSl9fXN0YXRpYyBpbXBvcnRKU09OKHQpe2xldCBuPUR0KHQudGV4dCk7cmV0dXJuIG4uc2V0Rm9ybWF0KHQuZm9ybWF0KSxuLnNldERldGFpbCh0LmRldGFpbCksbi5zZXRNb2RlKHQubW9kZSksbi5zZXRTdHlsZSh0LnN0eWxlKSxufWV4cG9ydERPTSh0KXtyZXR1cm57ZWxlbWVudDp0fT1zdXBlci5leHBvcnRET00odCksdCE9PW51bGwmJk5mKHQpfHxIKDEzMiksdC5zdHlsZS53aGl0ZVNwYWNlPSJwcmUtd3JhcCIsdGhpcy5oYXNGb3JtYXQoImJvbGQiKSYmKHQ9bWModCwiYiIpKSx0aGlzLmhhc0Zvcm1hdCgiaXRhbGljIikmJih0PW1jKHQsImkiKSksdGhpcy5oYXNGb3JtYXQoInN0cmlrZXRocm91Z2giKSYmKHQ9bWModCwicyIpKSx0aGlzLmhhc0Zvcm1hdCgidW5kZXJsaW5lIikmJih0PW1jKHQsInUiKSkse2VsZW1lbnQ6dH19ZXhwb3J0SlNPTigpe3JldHVybntkZXRhaWw6dGhpcy5nZXREZXRhaWwoKSxmb3JtYXQ6dGhpcy5nZXRGb3JtYXQoKSxtb2RlOnRoaXMuZ2V0TW9kZSgpLHN0eWxlOnRoaXMuZ2V0U3R5bGUoKSx0ZXh0OnRoaXMuZ2V0VGV4dENvbnRlbnQoKSx0eXBlOiJ0ZXh0Iix2ZXJzaW9uOjF9fXNlbGVjdGlvblRyYW5zZm9ybSgpe31zZXRGb3JtYXQodCl7bGV0IG49dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiBuLl9fZm9ybWF0PXR5cGVvZiB0PT0ic3RyaW5nIj96b1t0XTp0LG59c2V0RGV0YWlsKHQpe2xldCBuPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gbi5fX2RldGFpbD10eXBlb2YgdD09InN0cmluZyI/dVJbdF06dCxufXNldFN0eWxlKHQpe2xldCBuPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gbi5fX3N0eWxlPXQsbn10b2dnbGVGb3JtYXQodCl7cmV0dXJuIHQ9em9bdF0sdGhpcy5zZXRGb3JtYXQodGhpcy5nZXRGb3JtYXQoKV50KX10b2dnbGVEaXJlY3Rpb25sZXNzKCl7bGV0IHQ9dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiB0Ll9fZGV0YWlsXj0xLHR9dG9nZ2xlVW5tZXJnZWFibGUoKXtsZXQgdD10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIHQuX19kZXRhaWxePTIsdH1zZXRNb2RlKHQpe2lmKHQ9ZFJbdF0sdGhpcy5fX21vZGU9PT10KXJldHVybiB0aGlzO2xldCBuPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gbi5fX21vZGU9dCxufXNldFRleHRDb250ZW50KHQpe2lmKHRoaXMuX190ZXh0PT09dClyZXR1cm4gdGhpcztsZXQgbj10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIG4uX190ZXh0PXQsbn1zZWxlY3QodCxuKXtobigpO2xldCByPXJ0KCk7dmFyIGk9dGhpcy5nZXRUZXh0Q29udGVudCgpO2xldCBvPXRoaXMuX19rZXk7aWYodHlwZW9mIGk9PSJzdHJpbmciPyhpPWkubGVuZ3RoLHQ9PT12b2lkIDAmJih0PWkpLG49PT12b2lkIDAmJihuPWkpKTpuPXQ9MCxtZShyKSlpPVdpKCksaSE9PXIuYW5jaG9yLmtleSYmaSE9PXIuZm9jdXMua2V5fHxLdChvKSxyLnNldFRleHROb2RlUmFuZ2UodGhpcyx0LHRoaXMsbik7ZWxzZSByZXR1cm4gbUUobyx0LG8sbiwidGV4dCIsInRleHQiKTtyZXR1cm4gcn1zcGxpY2VUZXh0KHQsbixyLGkpe2xldCBvPXRoaXMuZ2V0V3JpdGFibGUoKSxsPW8uX190ZXh0LHM9ci5sZW5ndGgsYT10OzA+YSYmKGE9cythLDA+YSYmKGE9MCkpO2xldCB1PXJ0KCk7cmV0dXJuIGkmJm1lKHUpJiYodCs9cyx1LnNldFRleHROb2RlUmFuZ2Uobyx0LG8sdCkpLG49bC5zbGljZSgwLGEpK3IrbC5zbGljZShhK24pLG8uX190ZXh0PW4sb31jYW5JbnNlcnRUZXh0QmVmb3JlKCl7cmV0dXJuITB9Y2FuSW5zZXJ0VGV4dEFmdGVyKCl7cmV0dXJuITB9c3BsaXRUZXh0KC4uLnQpe2huKCk7dmFyIG49dGhpcy5nZXRMYXRlc3QoKSxyPW4uZ2V0VGV4dENvbnRlbnQoKSxpPW4uX19rZXksbz1XaSgpLGw9bmV3IFNldCh0KTt0PVtdO2Zvcih2YXIgcz1yLmxlbmd0aCxhPSIiLHU9MDt1PHM7dSsrKWEhPT0iIiYmbC5oYXModSkmJih0LnB1c2goYSksYT0iIiksYSs9clt1XTtpZihhIT09IiImJnQucHVzaChhKSxsPXQubGVuZ3RoLGw9PT0wKXJldHVybltdO2lmKHRbMF09PT1yKXJldHVybltuXTt2YXIgYz10WzBdO3I9bi5nZXRQYXJlbnRPclRocm93KCksdT1uLmdldEZvcm1hdCgpO2xldCBkPW4uZ2V0U3R5bGUoKSxmPW4uX19kZXRhaWw7cz0hMSxuLmlzU2VnbWVudGVkKCk/KGE9RHQoYyksYS5fX2Zvcm1hdD11LGEuX19zdHlsZT1kLGEuX19kZXRhaWw9ZixzPSEwKTooYT1uLmdldFdyaXRhYmxlKCksYS5fX3RleHQ9Yyksbj1ydCgpLGE9W2FdLGM9Yy5sZW5ndGg7Zm9yKGxldCBnPTE7ZzxsO2crKyl7dmFyIGg9dFtnXSxtPWgubGVuZ3RoO2g9RHQoaCkuZ2V0V3JpdGFibGUoKSxoLl9fZm9ybWF0PXUsaC5fX3N0eWxlPWQsaC5fX2RldGFpbD1mO2xldCB3PWguX19rZXk7aWYobT1jK20sbWUobikpe2xldCB2PW4uYW5jaG9yLHk9bi5mb2N1czt2LmtleT09PWkmJnYudHlwZT09PSJ0ZXh0IiYmdi5vZmZzZXQ+YyYmdi5vZmZzZXQ8PW0mJih2LmtleT13LHYub2Zmc2V0LT1jLG4uZGlydHk9ITApLHkua2V5PT09aSYmeS50eXBlPT09InRleHQiJiZ5Lm9mZnNldD5jJiZ5Lm9mZnNldDw9bSYmKHkua2V5PXcseS5vZmZzZXQtPWMsbi5kaXJ0eT0hMCl9bz09PWkmJkt0KHcpLGM9bSxhLnB1c2goaCl9cmV0dXJuIGk9dGhpcy5nZXRQcmV2aW91c1NpYmxpbmcoKSxvPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKSxpIT09bnVsbCYmQ2QoaSksbyE9PW51bGwmJkNkKG8pLGk9ci5nZXRXcml0YWJsZSgpLG89dGhpcy5nZXRJbmRleFdpdGhpblBhcmVudCgpLHM/KGkuc3BsaWNlKG8sMCxhKSx0aGlzLnJlbW92ZSgpKTppLnNwbGljZShvLDEsYSksbWUobikmJlJkKG4scixvLGwtMSksYX1tZXJnZVdpdGhTaWJsaW5nKHQpe3ZhciBuPXQ9PT10aGlzLmdldFByZXZpb3VzU2libGluZygpO258fHQ9PT10aGlzLmdldE5leHRTaWJsaW5nKCl8fEgoNTApO3ZhciByPXRoaXMuX19rZXk7bGV0IGk9dC5fX2tleSxvPXRoaXMuX190ZXh0LGw9by5sZW5ndGg7V2koKT09PWkmJkt0KHIpO2xldCBzPXJ0KCk7aWYobWUocykpe2xldCBhPXMuYW5jaG9yLHU9cy5mb2N1czthIT09bnVsbCYmYS5rZXk9PT1pJiYoSzAoYSxuLHIsdCxsKSxzLmRpcnR5PSEwKSx1IT09bnVsbCYmdS5rZXk9PT1pJiYoSzAodSxuLHIsdCxsKSxzLmRpcnR5PSEwKX1yZXR1cm4gcj10Ll9fdGV4dCx0aGlzLnNldFRleHRDb250ZW50KG4/citvOm8rciksbj10aGlzLmdldFdyaXRhYmxlKCksdC5yZW1vdmUoKSxufWlzVGV4dEVudGl0eSgpe3JldHVybiExfX1mdW5jdGlvbiBPUihlKXtsZXQgdD1lLnN0eWxlLmZvbnRXZWlnaHQ9PT0iNzAwIixuPWUuc3R5bGUudGV4dERlY29yYXRpb249PT0ibGluZS10aHJvdWdoIixyPWUuc3R5bGUuZm9udFN0eWxlPT09Iml0YWxpYyIsaT1lLnN0eWxlLnRleHREZWNvcmF0aW9uPT09InVuZGVybGluZSIsbz1lLnN0eWxlLnZlcnRpY2FsQWxpZ247cmV0dXJue2ZvckNoaWxkOmw9PihKKGwpJiYodCYmbC50b2dnbGVGb3JtYXQoImJvbGQiKSxuJiZsLnRvZ2dsZUZvcm1hdCgic3RyaWtldGhyb3VnaCIpLHImJmwudG9nZ2xlRm9ybWF0KCJpdGFsaWMiKSxpJiZsLnRvZ2dsZUZvcm1hdCgidW5kZXJsaW5lIiksbz09PSJzdWIiJiZsLnRvZ2dsZUZvcm1hdCgic3Vic2NyaXB0Iiksbz09PSJzdXBlciImJmwudG9nZ2xlRm9ybWF0KCJzdXBlcnNjcmlwdCIpKSxsKSxub2RlOm51bGx9fWZ1bmN0aW9uIFBSKGUpe2xldCB0PWUuc3R5bGUuZm9udFdlaWdodD09PSJub3JtYWwiO3JldHVybntmb3JDaGlsZDpuPT4oSihuKSYmIXQmJm4udG9nZ2xlRm9ybWF0KCJib2xkIiksbiksbm9kZTpudWxsfX1sZXQgSTA9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gQVIoZSl7ZS5wYXJlbnRFbGVtZW50PT09bnVsbCYmSCgxMjkpO2Zvcih2YXIgdD1lLnRleHRDb250ZW50fHwiIixuLHI9ZS5wYXJlbnROb2RlLGk9W2VdO3IhPT1udWxsJiYobj1JMC5nZXQocikpPT09dm9pZCAwJiYhKHIubm9kZU5hbWU9PT0iUFJFInx8ci5ub2RlVHlwZT09PTEmJnIuc3R5bGUud2hpdGVTcGFjZS5zdGFydHNXaXRoKCJwcmUiKSk7KWkucHVzaChyKSxyPXIucGFyZW50Tm9kZTtmb3Iobj1uPT09dm9pZCAwP3I6bixyPTA7cjxpLmxlbmd0aDtyKyspSTAuc2V0KGlbcl0sbik7aWYobiE9PW51bGwpe2Zvcih0PXQuc3BsaXQoLyhccj9cbnxcdCkvKSxlPVtdLGk9dC5sZW5ndGgsbj0wO248aTtuKyspcj10W25dLHI9PT1gCmB8fHI9PT1gXHIKYD9lLnB1c2goZHMoKSk6cj09PSIJIj9lLnB1c2goT2YoKSk6ciE9PSIiJiZlLnB1c2goRHQocikpO3JldHVybntub2RlOmV9fWlmKHQ9dC5yZXBsYWNlKC9cci9nLCIiKS5yZXBsYWNlKC9bIFx0XG5dKy9nLCIgIiksdD09PSIiKXJldHVybntub2RlOm51bGx9O2lmKHRbMF09PT0iICIpe2ZvcihpPWUsbj0hMDtpIT09bnVsbCYmKGk9ajAoaSwhMSkpIT09bnVsbDspaWYocj1pLnRleHRDb250ZW50fHwiIiwwPHIubGVuZ3RoKXsvWyBcdFxuXSQvLnRlc3QocikmJih0PXQuc2xpY2UoMSkpLG49ITE7YnJlYWt9biYmKHQ9dC5zbGljZSgxKSl9aWYodFt0Lmxlbmd0aC0xXT09PSIgIil7Zm9yKGk9ITA7ZSE9PW51bGwmJihlPWowKGUsITApKSE9PW51bGw7KWlmKDA8KGUudGV4dENvbnRlbnR8fCIiKS5yZXBsYWNlKC9eKCB8XHR8XHI/XG4pKy8sIiIpLmxlbmd0aCl7aT0hMTticmVha31pJiYodD10LnNsaWNlKDAsdC5sZW5ndGgtMSkpfXJldHVybiB0PT09IiI/e25vZGU6bnVsbH06e25vZGU6RHQodCl9fWxldCBNUj1uZXcgUmVnRXhwKC9eKGF8YWJicnxhY3JvbnltfGJ8Y2l0ZXxjb2RlfGRlbHxlbXxpfGluc3xrYmR8bGFiZWx8b3V0cHV0fHF8cnVieXxzfHNhbXB8c3BhbnxzdHJvbmd8c3VifHN1cHx0aW1lfHV8dHR8dmFyKSQvLCJpIik7ZnVuY3Rpb24gajAoZSx0KXtmb3IoOzspe2Zvcih2YXIgbj12b2lkIDA7KG49dD9lLm5leHRTaWJsaW5nOmUucHJldmlvdXNTaWJsaW5nKT09PW51bGw7KWlmKGU9ZS5wYXJlbnRFbGVtZW50LGU9PT1udWxsKXJldHVybiBudWxsO2lmKGU9bixlLm5vZGVUeXBlPT09MSYmKG49ZS5zdHlsZS5kaXNwbGF5LG49PT0iIiYmZS5ub2RlTmFtZS5tYXRjaChNUik9PT1udWxsfHxuIT09IiImJiFuLnN0YXJ0c1dpdGgoImlubGluZSIpKSlyZXR1cm4gbnVsbDtmb3IoOyhuPXQ/ZS5maXJzdENoaWxkOmUubGFzdENoaWxkKSE9PW51bGw7KWU9bjtpZihlLm5vZGVUeXBlPT09MylyZXR1cm4gZTtpZihlLm5vZGVOYW1lPT09IkJSIilyZXR1cm4gbnVsbH19bGV0IERSPXtjb2RlOiJjb2RlIixlbToiaXRhbGljIixpOiJpdGFsaWMiLHM6InN0cmlrZXRocm91Z2giLHN0cm9uZzoiYm9sZCIsc3ViOiJzdWJzY3JpcHQiLHN1cDoic3VwZXJzY3JpcHQiLHU6InVuZGVybGluZSJ9O2Z1bmN0aW9uIFJpKGUpe2xldCB0PURSW2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07cmV0dXJuIHQ9PT12b2lkIDA/e25vZGU6bnVsbH06e2ZvckNoaWxkOm49PihKKG4pJiYhbi5oYXNGb3JtYXQodCkmJm4udG9nZ2xlRm9ybWF0KHQpLG4pLG5vZGU6bnVsbH19ZnVuY3Rpb24gRHQoZT0iIil7cmV0dXJuIGp1KG5ldyBzbChlKSl9ZnVuY3Rpb24gSihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHNsfWNsYXNzICRzIGV4dGVuZHMgc2x7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4idGFiIn1zdGF0aWMgY2xvbmUodCl7bGV0IG49bmV3ICRzKHQuX19rZXkpO3JldHVybiBuLl9fdGV4dD10Ll9fdGV4dCxuLl9fZm9ybWF0PXQuX19mb3JtYXQsbi5fX3N0eWxlPXQuX19zdHlsZSxufWNvbnN0cnVjdG9yKHQpe3N1cGVyKCIJIix0KSx0aGlzLl9fZGV0YWlsPTJ9c3RhdGljIGltcG9ydERPTSgpe3JldHVybiBudWxsfXN0YXRpYyBpbXBvcnRKU09OKHQpe2xldCBuPU9mKCk7cmV0dXJuIG4uc2V0Rm9ybWF0KHQuZm9ybWF0KSxuLnNldFN0eWxlKHQuc3R5bGUpLG59ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksdHlwZToidGFiIix2ZXJzaW9uOjF9fXNldFRleHRDb250ZW50KCl7SCgxMjYpfXNldERldGFpbCgpe0goMTI3KX1zZXRNb2RlKCl7SCgxMjgpfWNhbkluc2VydFRleHRCZWZvcmUoKXtyZXR1cm4hMX1jYW5JbnNlcnRUZXh0QWZ0ZXIoKXtyZXR1cm4hMX19ZnVuY3Rpb24gT2YoKXtyZXR1cm4ganUobmV3ICRzKX1jbGFzcyBWcntjb25zdHJ1Y3Rvcih0LG4scil7dGhpcy5fc2VsZWN0aW9uPW51bGwsdGhpcy5rZXk9dCx0aGlzLm9mZnNldD1uLHRoaXMudHlwZT1yfWlzKHQpe3JldHVybiB0aGlzLmtleT09PXQua2V5JiZ0aGlzLm9mZnNldD09PXQub2Zmc2V0JiZ0aGlzLnR5cGU9PT10LnR5cGV9aXNCZWZvcmUodCl7bGV0IG49dGhpcy5nZXROb2RlKCkscj10LmdldE5vZGUoKSxpPXRoaXMub2Zmc2V0O2lmKHQ9dC5vZmZzZXQsQihuKSl7dmFyIG89bi5nZXREZXNjZW5kYW50QnlJbmRleChpKTtuPW8/P259cmV0dXJuIEIocikmJihvPXIuZ2V0RGVzY2VuZGFudEJ5SW5kZXgodCkscj1vPz9yKSxuPT09cj9pPHQ6bi5pc0JlZm9yZShyKX1nZXROb2RlKCl7bGV0IHQ9SXQodGhpcy5rZXkpO3JldHVybiB0PT09bnVsbCYmSCgyMCksdH1zZXQodCxuLHIpe2xldCBpPXRoaXMuX3NlbGVjdGlvbixvPXRoaXMua2V5O3RoaXMua2V5PXQsdGhpcy5vZmZzZXQ9bix0aGlzLnR5cGU9cixOcygpfHwoV2koKT09PW8mJkt0KHQpLGkhPT1udWxsJiYoaS5fY2FjaGVkTm9kZXM9bnVsbCxpLmRpcnR5PSEwKSl9fWZ1bmN0aW9uIEloKGUsdCl7bGV0IG49dC5fX2tleSxyPWUub2Zmc2V0LGk9ImVsZW1lbnQiO2lmKEoodCkpaT0idGV4dCIsdD10LmdldFRleHRDb250ZW50U2l6ZSgpLHI+dCYmKHI9dCk7ZWxzZSBpZighQih0KSl7dmFyIG89dC5nZXROZXh0U2libGluZygpO0oobyk/KG49by5fX2tleSxyPTAsaT0idGV4dCIpOihvPXQuZ2V0UGFyZW50KCkpJiYobj1vLl9fa2V5LHI9dC5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEpfWUuc2V0KG4scixpKX1mdW5jdGlvbiB6MChlLHQpe2lmKEIodCkpe2xldCBuPXQuZ2V0TGFzdERlc2NlbmRhbnQoKTtCKG4pfHxKKG4pP0loKGUsbik6SWgoZSx0KX1lbHNlIEloKGUsdCl9ZnVuY3Rpb24gRjAoZSx0LG4scil7bGV0IGk9ZS5nZXROb2RlKCksbz1pLmdldENoaWxkQXRJbmRleChlLm9mZnNldCksbD1EdCgpLHM9bW4oaSk/WW8oKS5hcHBlbmQobCk6bDtsLnNldEZvcm1hdChuKSxsLnNldFN0eWxlKHIpLG89PT1udWxsP2kuYXBwZW5kKHMpOihvLmluc2VydEJlZm9yZShzKSx0LnR5cGU9PT0iZWxlbWVudCImJnQua2V5PT09ZS5rZXkmJnQub2Zmc2V0IT09ZS5vZmZzZXQmJnQuc2V0KHQua2V5LHQub2Zmc2V0KzEsImVsZW1lbnQiKSksZS5pcyh0KSYmdC5zZXQobC5fX2tleSwwLCJ0ZXh0IiksZS5zZXQobC5fX2tleSwwLCJ0ZXh0Iil9ZnVuY3Rpb24gRGkoZSx0LG4scil7ZS5rZXk9dCxlLm9mZnNldD1uLGUudHlwZT1yfWNsYXNzIFBme2NvbnN0cnVjdG9yKHQpe3RoaXMuZGlydHk9ITEsdGhpcy5fbm9kZXM9dCx0aGlzLl9jYWNoZWROb2Rlcz1udWxsfWlzKHQpe2lmKCFicyh0KSlyZXR1cm4hMTtsZXQgbj10aGlzLl9ub2RlcyxyPXQuX25vZGVzO3JldHVybiBuLnNpemU9PT1yLnNpemUmJkFycmF5LmZyb20obikuZXZlcnkoaT0+ci5oYXMoaSkpfWFkZCh0KXt0aGlzLmRpcnR5PSEwLHRoaXMuX25vZGVzLmFkZCh0KSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsfWRlbGV0ZSh0KXt0aGlzLmRpcnR5PSEwLHRoaXMuX25vZGVzLmRlbGV0ZSh0KSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsfWNsZWFyKCl7dGhpcy5kaXJ0eT0hMCx0aGlzLl9ub2Rlcy5jbGVhcigpLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9aGFzKHQpe3JldHVybiB0aGlzLl9ub2Rlcy5oYXModCl9Y2xvbmUoKXtyZXR1cm4gbmV3IFBmKG5ldyBTZXQodGhpcy5fbm9kZXMpKX1leHRyYWN0KCl7cmV0dXJuIHRoaXMuZ2V0Tm9kZXMoKX1pbnNlcnRSYXdUZXh0KCl7fWluc2VydFRleHQoKXt9aW5zZXJ0Tm9kZXModCxuKXtsZXQgcj10aGlzLmdldE5vZGVzKCksaT1yLmxlbmd0aDt2YXIgbz1yW2ktMV07aWYoSihvKSlvPW8uc2VsZWN0KCk7ZWxzZXtsZXQgbD1vLmdldEluZGV4V2l0aGluUGFyZW50KCkrMTtvPW8uZ2V0UGFyZW50T3JUaHJvdygpLnNlbGVjdChsLGwpfWZvcihvLmluc2VydE5vZGVzKHQsbiksdD0wO3Q8aTt0Kyspclt0XS5yZW1vdmUoKTtyZXR1cm4hMH1nZXROb2Rlcygpe3ZhciB0PXRoaXMuX2NhY2hlZE5vZGVzO2lmKHQhPT1udWxsKXJldHVybiB0O3ZhciBuPXRoaXMuX25vZGVzO3Q9W107Zm9yKGxldCByIG9mIG4pbj1JdChyKSxuIT09bnVsbCYmdC5wdXNoKG4pO3JldHVybiBOcygpfHwodGhpcy5fY2FjaGVkTm9kZXM9dCksdH1nZXRUZXh0Q29udGVudCgpe2xldCB0PXRoaXMuZ2V0Tm9kZXMoKSxuPSIiO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKW4rPXRbcl0uZ2V0VGV4dENvbnRlbnQoKTtyZXR1cm4gbn19ZnVuY3Rpb24gbWUoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhbH1mdW5jdGlvbiBnbShlKXtsZXRbdCwsbl09dkUoZSk7ZT1uLmdldENoaWxkcmVuKCk7bGV0IHI9ZS5sZW5ndGg7dmFyIGk9ZVswXS5nZXRDaGlsZHJlbigpLmxlbmd0aDtsZXQgbz1BcnJheShyKTtmb3IodmFyIGw9MDtsPHI7bCsrKW9bbF09QXJyYXkoaSk7Zm9yKGk9MDtpPHI7aSsrKXtsPWVbaV0uZ2V0Q2hpbGRyZW4oKTtsZXQgcz0wO2ZvcihsZXQgYT0wO2E8bC5sZW5ndGg7YSsrKXtmb3IoO29baV1bc107KXMrKztsZXQgdT1sW2FdLGM9dS5fX3Jvd1NwYW58fDEsZD11Ll9fY29sU3Bhbnx8MTtmb3IobGV0IGY9MDtmPGM7ZisrKWZvcihsZXQgaD0wO2g8ZDtoKyspb1tpK2ZdW3MraF09dTtpZih0PT09dSlyZXR1cm57Y29sU3BhbjpkLGNvbHVtbkluZGV4OnMscm93SW5kZXg6aSxyb3dTcGFuOmN9O3MrPWR9fXJldHVybiBudWxsfWNsYXNzIEFme2NvbnN0cnVjdG9yKHQsbixyKXt0aGlzLmdyaWRLZXk9dCx0aGlzLmFuY2hvcj1uLHRoaXMuZm9jdXM9cix0aGlzLmRpcnR5PSExLHRoaXMuX2NhY2hlZE5vZGVzPW51bGwsbi5fc2VsZWN0aW9uPXRoaXMsci5fc2VsZWN0aW9uPXRoaXN9aXModCl7cmV0dXJuIGh2KHQpP3RoaXMuZ3JpZEtleT09PXQuZ3JpZEtleSYmdGhpcy5hbmNob3IuaXModC5hbmNob3IpJiZ0aGlzLmZvY3VzLmlzKHQuZm9jdXMpOiExfXNldCh0LG4scil7dGhpcy5kaXJ0eT0hMCx0aGlzLmdyaWRLZXk9dCx0aGlzLmFuY2hvci5rZXk9bix0aGlzLmZvY3VzLmtleT1yLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9Y2xvbmUoKXtyZXR1cm4gbmV3IEFmKHRoaXMuZ3JpZEtleSx0aGlzLmFuY2hvcix0aGlzLmZvY3VzKX1pc0NvbGxhcHNlZCgpe3JldHVybiExfWlzQmFja3dhcmQoKXtyZXR1cm4gdGhpcy5mb2N1cy5pc0JlZm9yZSh0aGlzLmFuY2hvcil9Z2V0Q2hhcmFjdGVyT2Zmc2V0cygpe3JldHVybiBWYyh0aGlzKX1leHRyYWN0KCl7cmV0dXJuIHRoaXMuZ2V0Tm9kZXMoKX1pbnNlcnRSYXdUZXh0KCl7fWluc2VydFRleHQoKXt9aW5zZXJ0Tm9kZXModCxuKXtsZXQgcj10aGlzLmZvY3VzLmdldE5vZGUoKTtyZXR1cm4gb3Yoci5zZWxlY3QoMCxyLmdldENoaWxkcmVuU2l6ZSgpKSkuaW5zZXJ0Tm9kZXModCxuKX1nZXRTaGFwZSgpe3ZhciB0PUl0KHRoaXMuYW5jaG9yLmtleSk7aWYoUW4odCl8fEgoMTAzKSx0PWdtKHQpLHQ9PT1udWxsKXRocm93IEVycm9yKCJnZXRDZWxsUmVjdDogZXhwZWN0ZWQgdG8gZmluZCBBbmNob3JOb2RlIik7dmFyIG49SXQodGhpcy5mb2N1cy5rZXkpO1FuKG4pfHxIKDEwNCk7bGV0IHI9Z20obik7aWYocj09PW51bGwpdGhyb3cgRXJyb3IoImdldENlbGxSZWN0OiBleHBlY3RlZCB0byBmaW5kIGZvY3VzQ2VsbE5vZGUiKTtuPU1hdGgubWluKHQuY29sdW1uSW5kZXgsci5jb2x1bW5JbmRleCk7bGV0IGk9TWF0aC5tYXgodC5jb2x1bW5JbmRleCxyLmNvbHVtbkluZGV4KSxvPU1hdGgubWluKHQucm93SW5kZXgsci5yb3dJbmRleCk7cmV0dXJuIHQ9TWF0aC5tYXgodC5yb3dJbmRleCxyLnJvd0luZGV4KSx7ZnJvbVg6TWF0aC5taW4obixpKSxmcm9tWTpNYXRoLm1pbihvLHQpLHRvWDpNYXRoLm1heChuLGkpLHRvWTpNYXRoLm1heChvLHQpfX1nZXROb2Rlcygpe2Z1bmN0aW9uIHQodyl7bGV0e2NlbGw6dixzdGFydENvbHVtbjp5LHN0YXJ0Um93Ol99PXc7YT1NYXRoLm1pbihhLHkpLHU9TWF0aC5taW4odSxfKSxjPU1hdGgubWF4KGMseSt2Ll9fY29sU3Bhbi0xKSxkPU1hdGgubWF4KGQsXyt2Ll9fcm93U3Bhbi0xKX12YXIgbj10aGlzLl9jYWNoZWROb2RlcztpZihuIT09bnVsbClyZXR1cm4gbjt2YXIgcj10aGlzLmFuY2hvci5nZXROb2RlKCk7bj10aGlzLmZvY3VzLmdldE5vZGUoKSxyPVRkKHIsUW4pO3ZhciBpPVRkKG4sUW4pO1FuKHIpfHxIKDEwMyksUW4oaSl8fEgoMTA0KSxuPXIuZ2V0UGFyZW50KCksdXUobil8fEgoMTA1KSxuPW4uZ2V0UGFyZW50KCkseXYobil8fEgoMTA2KTtsZXRbbyxsLHNdPWdFKG4scixpKSxhPU1hdGgubWluKGwuc3RhcnRDb2x1bW4scy5zdGFydENvbHVtbiksdT1NYXRoLm1pbihsLnN0YXJ0Um93LHMuc3RhcnRSb3cpLGM9TWF0aC5tYXgobC5zdGFydENvbHVtbitsLmNlbGwuX19jb2xTcGFuLTEscy5zdGFydENvbHVtbitzLmNlbGwuX19jb2xTcGFuLTEpLGQ9TWF0aC5tYXgobC5zdGFydFJvdytsLmNlbGwuX19yb3dTcGFuLTEscy5zdGFydFJvdytzLmNlbGwuX19yb3dTcGFuLTEpO3I9YSxpPXU7Zm9yKHZhciBmPWEsaD11O2E8cnx8dTxpfHxjPmZ8fGQ+aDspe2lmKGE8cil7dmFyIG09aC1pOy0tcjtmb3IodmFyIGc9MDtnPD1tO2crKyl0KG9baStnXVtyXSl9aWYodTxpKWZvcihtPWYtciwtLWksZz0wO2c8PW07ZysrKXQob1tpXVtyK2ddKTtpZihjPmYpZm9yKG09aC1pLGYrPTEsZz0wO2c8PW07ZysrKXQob1tpK2ddW2ZdKTtpZihkPmgpZm9yKG09Zi1yLGgrPTEsZz0wO2c8PW07ZysrKXQob1toXVtyK2ddKX1mb3Iobj1bbl0scj1udWxsLGk9dTtpPD1kO2krKylmb3IoZj1hO2Y8PWM7ZisrKSh7Y2VsbDpofT1vW2ldW2ZdKSxtPWguZ2V0UGFyZW50KCksdXUobSl8fEgoMTA3KSxtIT09ciYmbi5wdXNoKG0pLG4ucHVzaChoLC4uLnhSKGgpKSxyPW07cmV0dXJuIE5zKCl8fCh0aGlzLl9jYWNoZWROb2Rlcz1uKSxufWdldFRleHRDb250ZW50KCl7bGV0IHQ9dGhpcy5nZXROb2RlcygpLG49IiI7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspbis9dFtyXS5nZXRUZXh0Q29udGVudCgpO3JldHVybiBufX1mdW5jdGlvbiBodihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEFmfWNsYXNzIGFse2NvbnN0cnVjdG9yKHQsbixyLGkpe3RoaXMuYW5jaG9yPXQsdGhpcy5mb2N1cz1uLHRoaXMuZGlydHk9ITEsdGhpcy5mb3JtYXQ9cix0aGlzLnN0eWxlPWksdGhpcy5fY2FjaGVkTm9kZXM9bnVsbCx0Ll9zZWxlY3Rpb249dGhpcyxuLl9zZWxlY3Rpb249dGhpc31pcyh0KXtyZXR1cm4gbWUodCk/dGhpcy5hbmNob3IuaXModC5hbmNob3IpJiZ0aGlzLmZvY3VzLmlzKHQuZm9jdXMpJiZ0aGlzLmZvcm1hdD09PXQuZm9ybWF0JiZ0aGlzLnN0eWxlPT09dC5zdHlsZTohMX1pc0JhY2t3YXJkKCl7cmV0dXJuIHRoaXMuZm9jdXMuaXNCZWZvcmUodGhpcy5hbmNob3IpfWlzQ29sbGFwc2VkKCl7cmV0dXJuIHRoaXMuYW5jaG9yLmlzKHRoaXMuZm9jdXMpfWdldE5vZGVzKCl7dmFyIHQ9dGhpcy5fY2FjaGVkTm9kZXM7aWYodCE9PW51bGwpcmV0dXJuIHQ7dD10aGlzLmFuY2hvcjt2YXIgbj10aGlzLmZvY3VzLHI9dC5pc0JlZm9yZShuKSxpPXI/dDpuO3I9cj9uOnQsdD1pLmdldE5vZGUoKSxuPXIuZ2V0Tm9kZSgpO2xldCBvPWkub2Zmc2V0O3JldHVybiBpPXIub2Zmc2V0LEIodCkmJihyPXQuZ2V0RGVzY2VuZGFudEJ5SW5kZXgobyksdD1yPz90KSxCKG4pJiYocj1uLmdldERlc2NlbmRhbnRCeUluZGV4KGkpLHIhPT1udWxsJiZyIT09dCYmbi5nZXRDaGlsZEF0SW5kZXgoaSk9PT1yJiYocj1yLmdldFByZXZpb3VzU2libGluZygpKSxuPXI/P24pLHQ9dC5pcyhuKT9CKHQpJiYwPHQuZ2V0Q2hpbGRyZW5TaXplKCk/W106W3RdOnQuZ2V0Tm9kZXNCZXR3ZWVuKG4pLE5zKCl8fCh0aGlzLl9jYWNoZWROb2Rlcz10KSx0fXNldFRleHROb2RlUmFuZ2UodCxuLHIsaSl7RGkodGhpcy5hbmNob3IsdC5fX2tleSxuLCJ0ZXh0IiksRGkodGhpcy5mb2N1cyxyLl9fa2V5LGksInRleHQiKSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsLHRoaXMuZGlydHk9ITB9Z2V0VGV4dENvbnRlbnQoKXtsZXQgdD10aGlzLmdldE5vZGVzKCk7aWYodC5sZW5ndGg9PT0wKXJldHVybiIiO2xldCBuPXRbMF0scj10W3QubGVuZ3RoLTFdLGk9dGhpcy5hbmNob3Isbz10aGlzLmZvY3VzLGw9aS5pc0JlZm9yZShvKSxbcyxhXT1WYyh0aGlzKSx1PSIiLGM9ITA7Zm9yKGxldCBkPTA7ZDx0Lmxlbmd0aDtkKyspe2xldCBmPXRbZF07aWYoQihmKSYmIWYuaXNJbmxpbmUoKSljfHwodSs9YApgKSxjPSFmLmlzRW1wdHkoKTtlbHNlIGlmKGM9ITEsSihmKSl7bGV0IGg9Zi5nZXRUZXh0Q29udGVudCgpO2Y9PT1uP2Y9PT1yPyhpLnR5cGUhPT0iZWxlbWVudCJ8fG8udHlwZSE9PSJlbGVtZW50Inx8by5vZmZzZXQ9PT1pLm9mZnNldCkmJihoPXM8YT9oLnNsaWNlKHMsYSk6aC5zbGljZShhLHMpKTpoPWw/aC5zbGljZShzKTpoLnNsaWNlKGEpOmY9PT1yJiYoaD1sP2guc2xpY2UoMCxhKTpoLnNsaWNlKDAscykpLHUrPWh9ZWxzZSF0dChmKSYmIXN1KGYpfHxmPT09ciYmdGhpcy5pc0NvbGxhcHNlZCgpfHwodSs9Zi5nZXRUZXh0Q29udGVudCgpKX1yZXR1cm4gdX1hcHBseURPTVJhbmdlKHQpe2xldCBuPXB0KCkscj1uLmdldEVkaXRvclN0YXRlKCkuX3NlbGVjdGlvbjtpZih0PXBFKHQuc3RhcnRDb250YWluZXIsdC5zdGFydE9mZnNldCx0LmVuZENvbnRhaW5lcix0LmVuZE9mZnNldCxuLHIpLHQhPT1udWxsKXt2YXJbaSxvXT10O0RpKHRoaXMuYW5jaG9yLGkua2V5LGkub2Zmc2V0LGkudHlwZSksRGkodGhpcy5mb2N1cyxvLmtleSxvLm9mZnNldCxvLnR5cGUpLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9fWNsb25lKCl7bGV0IHQ9dGhpcy5hbmNob3Isbj10aGlzLmZvY3VzO3JldHVybiBuZXcgYWwobmV3IFZyKHQua2V5LHQub2Zmc2V0LHQudHlwZSksbmV3IFZyKG4ua2V5LG4ub2Zmc2V0LG4udHlwZSksdGhpcy5mb3JtYXQsdGhpcy5zdHlsZSl9dG9nZ2xlRm9ybWF0KHQpe3RoaXMuZm9ybWF0PVVTKHRoaXMuZm9ybWF0LHQsbnVsbCksdGhpcy5kaXJ0eT0hMH1zZXRTdHlsZSh0KXt0aGlzLnN0eWxlPXQsdGhpcy5kaXJ0eT0hMH1oYXNGb3JtYXQodCl7cmV0dXJuKHRoaXMuZm9ybWF0JnpvW3RdKSE9PTB9aW5zZXJ0UmF3VGV4dCh0KXt0PXQuc3BsaXQoLyhccj9cbnxcdCkvKTtsZXQgbj1bXSxyPXQubGVuZ3RoO2ZvcihsZXQgaT0wO2k8cjtpKyspe2xldCBvPXRbaV07bz09PWAKYHx8bz09PWBccgpgP24ucHVzaChkcygpKTpvPT09IgkiP24ucHVzaChPZigpKTpuLnB1c2goRHQobykpfXRoaXMuaW5zZXJ0Tm9kZXMobil9aW5zZXJ0VGV4dCh0KXt2YXIgbj10aGlzLmFuY2hvcixyPXRoaXMuZm9jdXMsaT10aGlzLmlzQ29sbGFwc2VkKCl8fG4uaXNCZWZvcmUociksbz10aGlzLmZvcm1hdCxsPXRoaXMuc3R5bGU7aSYmbi50eXBlPT09ImVsZW1lbnQiP0YwKG4scixvLGwpOml8fHIudHlwZSE9PSJlbGVtZW50Inx8RjAocixuLG8sbCk7dmFyIHM9dGhpcy5nZXROb2RlcygpLGE9cy5sZW5ndGgsdT1pP3I6bjtyPShpP246cikub2Zmc2V0O3ZhciBjPXUub2Zmc2V0O249c1swXSxKKG4pfHxIKDI2KSxpPW4uZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGg7dmFyIGQ9bi5nZXRQYXJlbnRPclRocm93KCksZj1zW2EtMV07aWYodGhpcy5pc0NvbGxhcHNlZCgpJiZyPT09aSYmKG4uaXNTZWdtZW50ZWQoKXx8bi5pc1Rva2VuKCl8fCFuLmNhbkluc2VydFRleHRBZnRlcigpfHwhZC5jYW5JbnNlcnRUZXh0QWZ0ZXIoKSYmbi5nZXROZXh0U2libGluZygpPT09bnVsbCkpe3ZhciBoPW4uZ2V0TmV4dFNpYmxpbmcoKTtpZihKKGgpJiZoLmNhbkluc2VydFRleHRCZWZvcmUoKSYmIW5tKGgpfHwoaD1EdCgpLGguc2V0Rm9ybWF0KG8pLGQuY2FuSW5zZXJ0VGV4dEFmdGVyKCk/bi5pbnNlcnRBZnRlcihoKTpkLmluc2VydEFmdGVyKGgpKSxoLnNlbGVjdCgwLDApLG49aCx0IT09IiIpe3RoaXMuaW5zZXJ0VGV4dCh0KTtyZXR1cm59fWVsc2UgaWYodGhpcy5pc0NvbGxhcHNlZCgpJiZyPT09MCYmKG4uaXNTZWdtZW50ZWQoKXx8bi5pc1Rva2VuKCl8fCFuLmNhbkluc2VydFRleHRCZWZvcmUoKXx8IWQuY2FuSW5zZXJ0VGV4dEJlZm9yZSgpJiZuLmdldFByZXZpb3VzU2libGluZygpPT09bnVsbCkpe2lmKGg9bi5nZXRQcmV2aW91c1NpYmxpbmcoKSwoIUooaCl8fG5tKGgpKSYmKGg9RHQoKSxoLnNldEZvcm1hdChvKSxkLmNhbkluc2VydFRleHRCZWZvcmUoKT9uLmluc2VydEJlZm9yZShoKTpkLmluc2VydEJlZm9yZShoKSksaC5zZWxlY3QoKSxuPWgsdCE9PSIiKXt0aGlzLmluc2VydFRleHQodCk7cmV0dXJufX1lbHNlIGlmKG4uaXNTZWdtZW50ZWQoKSYmciE9PWkpZD1EdChuLmdldFRleHRDb250ZW50KCkpLGQuc2V0Rm9ybWF0KG8pLG4ucmVwbGFjZShkKSxuPWQ7ZWxzZSBpZighKHRoaXMuaXNDb2xsYXBzZWQoKXx8dD09PSIifHwoaD1mLmdldFBhcmVudCgpLGQuY2FuSW5zZXJ0VGV4dEJlZm9yZSgpJiZkLmNhbkluc2VydFRleHRBZnRlcigpJiYoIUIoaCl8fGguY2FuSW5zZXJ0VGV4dEJlZm9yZSgpJiZoLmNhbkluc2VydFRleHRBZnRlcigpKSkpKXt0aGlzLmluc2VydFRleHQoIiIpLGhFKHRoaXMuYW5jaG9yLHRoaXMuZm9jdXMsbnVsbCksdGhpcy5pbnNlcnRUZXh0KHQpO3JldHVybn1pZihhPT09MSlpZihuLmlzVG9rZW4oKSl0PUR0KHQpLHQuc2VsZWN0KCksbi5yZXBsYWNlKHQpO2Vsc2V7aWYocz1uLmdldEZvcm1hdCgpLGE9bi5nZXRTdHlsZSgpLHI9PT1jJiYocyE9PW98fGEhPT1sKSlpZihuLmdldFRleHRDb250ZW50KCk9PT0iIiluLnNldEZvcm1hdChvKSxuLnNldFN0eWxlKGwpO2Vsc2V7cz1EdCh0KSxzLnNldEZvcm1hdChvKSxzLnNldFN0eWxlKGwpLHMuc2VsZWN0KCkscj09PTA/bi5pbnNlcnRCZWZvcmUocywhMSk6KFthXT1uLnNwbGl0VGV4dChyKSxhLmluc2VydEFmdGVyKHMsITEpKSxzLmlzQ29tcG9zaW5nKCkmJnRoaXMuYW5jaG9yLnR5cGU9PT0idGV4dCImJih0aGlzLmFuY2hvci5vZmZzZXQtPXQubGVuZ3RoKTtyZXR1cm59bj1uLnNwbGljZVRleHQocixjLXIsdCwhMCksbi5nZXRUZXh0Q29udGVudCgpPT09IiI/bi5yZW1vdmUoKTp0aGlzLmFuY2hvci50eXBlPT09InRleHQiJiYobi5pc0NvbXBvc2luZygpP3RoaXMuYW5jaG9yLm9mZnNldC09dC5sZW5ndGg6KHRoaXMuZm9ybWF0PXMsdGhpcy5zdHlsZT1hKSl9ZWxzZXtpZihvPW5ldyBTZXQoWy4uLm4uZ2V0UGFyZW50S2V5cygpLC4uLmYuZ2V0UGFyZW50S2V5cygpXSksaD1CKG4pP246bi5nZXRQYXJlbnRPclRocm93KCksbD1CKGYpP2Y6Zi5nZXRQYXJlbnRPclRocm93KCksZD1mLCFoLmlzKGwpJiZsLmlzSW5saW5lKCkpZG8gZD1sLGw9bC5nZXRQYXJlbnRPclRocm93KCk7d2hpbGUobC5pc0lubGluZSgpKTtpZih1LnR5cGU9PT0idGV4dCImJihjIT09MHx8Zi5nZXRUZXh0Q29udGVudCgpPT09IiIpfHx1LnR5cGU9PT0iZWxlbWVudCImJmYuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKTxjKWlmKEooZikmJiFmLmlzVG9rZW4oKSYmYyE9PWYuZ2V0VGV4dENvbnRlbnRTaXplKCkpe2lmKGYuaXNTZWdtZW50ZWQoKSl7dmFyIG09RHQoZi5nZXRUZXh0Q29udGVudCgpKTtmLnJlcGxhY2UobSksZj1tfW1uKHUuZ2V0Tm9kZSgpKXx8KGY9Zi5zcGxpY2VUZXh0KDAsYywiIikpLG8uYWRkKGYuX19rZXkpfWVsc2UgdT1mLmdldFBhcmVudE9yVGhyb3coKSx1LmNhbkJlRW1wdHkoKXx8dS5nZXRDaGlsZHJlblNpemUoKSE9PTE/Zi5yZW1vdmUoKTp1LnJlbW92ZSgpO2Vsc2Ugby5hZGQoZi5fX2tleSk7Zm9yKHU9bC5nZXRDaGlsZHJlbigpLGM9bmV3IFNldChzKSxmPWguaXMobCksaD1oLmlzSW5saW5lKCkmJm4uZ2V0TmV4dFNpYmxpbmcoKT09PW51bGw/aDpuLG09dS5sZW5ndGgtMTswPD1tO20tLSl7bGV0IGc9dVttXTtpZihnLmlzKG4pfHxCKGcpJiZnLmlzUGFyZW50T2YobikpYnJlYWs7Zy5pc0F0dGFjaGVkKCkmJighYy5oYXMoZyl8fGcuaXMoZCk/Znx8aC5pbnNlcnRBZnRlcihnLCExKTpnLnJlbW92ZSgpKX1pZighZilmb3IodT1sLGM9bnVsbDt1IT09bnVsbDspbD11LmdldENoaWxkcmVuKCksZj1sLmxlbmd0aCwoZj09PTB8fGxbZi0xXS5pcyhjKSkmJihvLmRlbGV0ZSh1Ll9fa2V5KSxjPXUpLHU9dS5nZXRQYXJlbnQoKTtmb3Iobi5pc1Rva2VuKCk/cj09PWk/bi5zZWxlY3QoKToodD1EdCh0KSx0LnNlbGVjdCgpLG4ucmVwbGFjZSh0KSk6KG49bi5zcGxpY2VUZXh0KHIsaS1yLHQsITApLG4uZ2V0VGV4dENvbnRlbnQoKT09PSIiP24ucmVtb3ZlKCk6bi5pc0NvbXBvc2luZygpJiZ0aGlzLmFuY2hvci50eXBlPT09InRleHQiJiYodGhpcy5hbmNob3Iub2Zmc2V0LT10Lmxlbmd0aCkpLHQ9MTt0PGE7dCsrKW49c1t0XSxvLmhhcyhuLl9fa2V5KXx8bi5yZW1vdmUoKX19cmVtb3ZlVGV4dCgpe3RoaXMuaW5zZXJ0VGV4dCgiIil9Zm9ybWF0VGV4dCh0KXtpZih0aGlzLmlzQ29sbGFwc2VkKCkpdGhpcy50b2dnbGVGb3JtYXQodCksS3QobnVsbCk7ZWxzZXt2YXIgbj10aGlzLmdldE5vZGVzKCkscj1bXTtmb3IodmFyIGkgb2YgbilKKGkpJiZyLnB1c2goaSk7dmFyIG89ci5sZW5ndGg7aWYobz09PTApdGhpcy50b2dnbGVGb3JtYXQodCksS3QobnVsbCk7ZWxzZXtpPXRoaXMuYW5jaG9yO3ZhciBsPXRoaXMuZm9jdXMscz10aGlzLmlzQmFja3dhcmQoKTtuPXM/bDppLGk9cz9pOmw7dmFyIGE9MCx1PXJbMF07aWYobD1uLnR5cGU9PT0iZWxlbWVudCI/MDpuLm9mZnNldCxuLnR5cGU9PT0idGV4dCImJmw9PT11LmdldFRleHRDb250ZW50U2l6ZSgpJiYoYT0xLHU9clsxXSxsPTApLHUhPW51bGwpe3M9dS5nZXRGb3JtYXRGbGFncyh0LG51bGwpO3ZhciBjPW8tMSxkPXJbY107aWYobz1pLnR5cGU9PT0idGV4dCI/aS5vZmZzZXQ6ZC5nZXRUZXh0Q29udGVudFNpemUoKSx1LmlzKGQpKWwhPT1vJiYobD09PTAmJm89PT11LmdldFRleHRDb250ZW50U2l6ZSgpP3Uuc2V0Rm9ybWF0KHMpOih0PXUuc3BsaXRUZXh0KGwsbyksdD1sPT09MD90WzBdOnRbMV0sdC5zZXRGb3JtYXQocyksbi50eXBlPT09InRleHQiJiZuLnNldCh0Ll9fa2V5LDAsInRleHQiKSxpLnR5cGU9PT0idGV4dCImJmkuc2V0KHQuX19rZXksby1sLCJ0ZXh0IikpLHRoaXMuZm9ybWF0PXMpO2Vsc2V7bCE9PTAmJihbLHVdPXUuc3BsaXRUZXh0KGwpLGw9MCksdS5zZXRGb3JtYXQocyk7dmFyIGY9ZC5nZXRGb3JtYXRGbGFncyh0LHMpO2ZvcigwPG8mJihvIT09ZC5nZXRUZXh0Q29udGVudFNpemUoKSYmKFtkXT1kLnNwbGl0VGV4dChvKSksZC5zZXRGb3JtYXQoZikpLGErPTE7YTxjO2ErKyl7bGV0IGg9clthXTtpZighaC5pc1Rva2VuKCkpe2xldCBtPWguZ2V0Rm9ybWF0RmxhZ3ModCxmKTtoLnNldEZvcm1hdChtKX19bi50eXBlPT09InRleHQiJiZuLnNldCh1Ll9fa2V5LGwsInRleHQiKSxpLnR5cGU9PT0idGV4dCImJmkuc2V0KGQuX19rZXksbywidGV4dCIpLHRoaXMuZm9ybWF0PXN8Zn19fX19aW5zZXJ0Tm9kZXModCxuKXtpZighdGhpcy5pc0NvbGxhcHNlZCgpKXt2YXIgcj10aGlzLmlzQmFja3dhcmQoKT90aGlzLmFuY2hvcjp0aGlzLmZvY3VzLGk9ci5nZXROb2RlKCkuZ2V0TmV4dFNpYmxpbmcoKTtpZihpPWk/aS5nZXRLZXkoKTpudWxsLHI9KHI9ci5nZXROb2RlKCkuZ2V0UHJldmlvdXNTaWJsaW5nKCkpP3IuZ2V0S2V5KCk6bnVsbCx0aGlzLnJlbW92ZVRleHQoKSx0aGlzLmlzQ29sbGFwc2VkKCkmJnRoaXMuZm9jdXMudHlwZT09PSJlbGVtZW50Iil7aWYodGhpcy5mb2N1cy5rZXk9PT1pJiZ0aGlzLmZvY3VzLm9mZnNldD09PTApe3ZhciBvPUR0KCk7dGhpcy5mb2N1cy5nZXROb2RlKCkuaW5zZXJ0QmVmb3JlKG8pfWVsc2UgdGhpcy5mb2N1cy5rZXk9PT1yJiZ0aGlzLmZvY3VzLm9mZnNldD09PXRoaXMuZm9jdXMuZ2V0Tm9kZSgpLmdldENoaWxkcmVuU2l6ZSgpJiYobz1EdCgpLHRoaXMuZm9jdXMuZ2V0Tm9kZSgpLmluc2VydEFmdGVyKG8pKTtvJiYodGhpcy5mb2N1cy5zZXQoby5fX2tleSwwLCJ0ZXh0IiksdGhpcy5hbmNob3Iuc2V0KG8uX19rZXksMCwidGV4dCIpKX19bz10aGlzLmFuY2hvcixyPW8ub2Zmc2V0O3ZhciBsPW8uZ2V0Tm9kZSgpO2k9bCxvLnR5cGU9PT0iZWxlbWVudCImJihvPW8uZ2V0Tm9kZSgpLGk9by5nZXRDaGlsZEF0SW5kZXgoci0xKSxpPWk9PT1udWxsP286aSksbz1bXTt2YXIgcz1sLmdldE5leHRTaWJsaW5ncygpLGE9eHIobCk/bnVsbDpsLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKTtpZihKKGwpKWlmKGk9bC5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCxyPT09MCYmaSE9PTApaT1sLmdldFByZXZpb3VzU2libGluZygpLGk9aSE9PW51bGw/aTpsLmdldFBhcmVudE9yVGhyb3coKSxvLnB1c2gobCk7ZWxzZSBpZihyPT09aSlpPWw7ZWxzZXtpZihsLmlzVG9rZW4oKSlyZXR1cm4hMTtbaSxsXT1sLnNwbGl0VGV4dChyKSxvLnB1c2gobCl9bD1pLG8ucHVzaCguLi5zKSxzPXRbMF07dmFyIHU9ITEsYz1udWxsO2ZvcihsZXQgbT0wO208dC5sZW5ndGg7bSsrKXt2YXIgZD10W21dO2lmKHhyKGkpfHx0dChpKXx8IUIoZCl8fGQuaXNJbmxpbmUoKSl1JiYhQihkKSYmIXR0KGQpJiZ4cihpLmdldFBhcmVudCgpKSYmSCgyOCk7ZWxzZXtpZihkLmlzKHMpKXtpZihCKGkpJiZpLmlzRW1wdHkoKSYmaS5jYW5SZXBsYWNlV2l0aChkKSl7aS5yZXBsYWNlKGQpLGk9ZCx1PSEwO2NvbnRpbnVlfWlmKHU9ZC5nZXRGaXJzdERlc2NlbmRhbnQoKSxXUyh1KSl7Zm9yKHZhciBmPXUuZ2V0UGFyZW50T3JUaHJvdygpO2YuaXNJbmxpbmUoKTspZj1mLmdldFBhcmVudE9yVGhyb3coKTtpZihjPWYuZ2V0Q2hpbGRyZW4oKSx1PWMubGVuZ3RoLEIoaSkpe3ZhciBoPWkuZ2V0Rmlyc3RDaGlsZCgpO2ZvcihsZXQgZz0wO2c8dTtnKyspe2xldCB3PWNbZ107aD09PW51bGw/aS5hcHBlbmQodyk6aC5pbnNlcnRBZnRlcih3KSxoPXd9fWVsc2V7Zm9yKGg9dS0xOzA8PWg7aC0tKWkuaW5zZXJ0QWZ0ZXIoY1toXSk7aT1pLmdldFBhcmVudE9yVGhyb3coKX1pZihjPWNbdS0xXSxmLnJlbW92ZSgpLHU9ITAsZi5pcyhkKSljb250aW51ZX19SihpKSYmKGE9PT1udWxsJiZIKDI3KSxpPWEpfXU9ITEsQihpKSYmIWkuaXNJbmxpbmUoKT8oYz1kLHR0KGQpJiYhZC5pc0lubGluZSgpP2k9dC5sZW5ndGg9PT0xJiZpLmNhbkJlRW1wdHkoKSYmaS5pc0VtcHR5KCk/aS5pbnNlcnRCZWZvcmUoZCwhMSk6aS5pbnNlcnRBZnRlcihkLCExKTpCKGQpPyhkLmNhbkJlRW1wdHkoKXx8IWQuaXNFbXB0eSgpKSYmKG1uKGkpPyhmPWkuZ2V0Q2hpbGRBdEluZGV4KHIpLGYhPT1udWxsP2YuaW5zZXJ0QmVmb3JlKGQpOmkuYXBwZW5kKGQpLGk9ZCk6ZC5pc0lubGluZSgpPyhpLmFwcGVuZChkKSxpPWQpOmk9aS5pbnNlcnRBZnRlcihkLCExKSk6KGY9aS5nZXRGaXJzdENoaWxkKCksZiE9PW51bGw/Zi5pbnNlcnRCZWZvcmUoZCk6aS5hcHBlbmQoZCksaT1kKSk6IUIoZCl8fEIoZCkmJmQuaXNJbmxpbmUoKXx8dHQoaSkmJiFpLmlzSW5saW5lKCk/KGM9ZCxtZSh0aGlzKSYmdHQoZCkmJihCKGkpfHxKKGkpKSYmIWQuaXNJbmxpbmUoKT8oSihpKT8oZj1pLmdldFBhcmVudE9yVGhyb3coKSxbaV09aS5zcGxpdFRleHQociksaT1pLmdldEluZGV4V2l0aGluUGFyZW50KCkrMSk6KGY9aSxpPXIpLFssaV09SlMoZixpKSxpPWkuaW5zZXJ0QmVmb3JlKGQpKTppPWkuaW5zZXJ0QWZ0ZXIoZCwhMSkpOihkPWkuZ2V0UGFyZW50T3JUaHJvdygpLHN1KGkpJiZpLnJlbW92ZSgpLGk9ZCxtLS0pfWlmKG4mJihKKGwpP2wuc2VsZWN0KCk6KHQ9aS5nZXRQcmV2aW91c1NpYmxpbmcoKSxKKHQpP3Quc2VsZWN0KCk6KHQ9aS5nZXRJbmRleFdpdGhpblBhcmVudCgpLGkuZ2V0UGFyZW50T3JUaHJvdygpLnNlbGVjdCh0LHQpKSkpLEIoaSkpe2lmKHQ9SihjKT9jOkIoYykmJmMuaXNJbmxpbmUoKT9jLmdldExhc3REZXNjZW5kYW50KCk6aS5nZXRMYXN0RGVzY2VuZGFudCgpLG58fCh0PT09bnVsbD9pLnNlbGVjdCgpOkoodCk/dC5nZXRUZXh0Q29udGVudCgpPT09IiI/dC5zZWxlY3RQcmV2aW91cygpOnQuc2VsZWN0KCk6dC5zZWxlY3ROZXh0KCkpLG8ubGVuZ3RoIT09MClmb3Iobj1pLHQ9by5sZW5ndGgtMTswPD10O3QtLSlyPW9bdF0sYT1yLmdldFBhcmVudE9yVGhyb3coKSwhQihpKXx8dm0ocil8fHR0KHIpJiYoIXIuaXNJbmxpbmUoKXx8ci5pc0lzb2xhdGVkKCkpP0IoaSl8fHZtKHIpP0IocikmJiFyLmNhbkluc2VydEFmdGVyKGkpPyhsPWEuY29uc3RydWN0b3IuY2xvbmUoYSksQihsKXx8SCgyOSksbC5hcHBlbmQociksaS5pbnNlcnRBZnRlcihsKSk6aS5pbnNlcnRBZnRlcihyKTooaS5pbnNlcnRCZWZvcmUociksaT1yKToobj09PWk/aS5hcHBlbmQocik6aS5pbnNlcnRCZWZvcmUociksaT1yKSxhLmlzRW1wdHkoKSYmIWEuY2FuQmVFbXB0eSgpJiZhLnJlbW92ZSgpfWVsc2Ugbnx8KEooaSk/aS5zZWxlY3QoKToobj1pLmdldFBhcmVudE9yVGhyb3coKSx0PWkuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsxLG4uc2VsZWN0KHQsdCkpKTtyZXR1cm4hMH1pbnNlcnRQYXJhZ3JhcGgoKXt0aGlzLmlzQ29sbGFwc2VkKCl8fHRoaXMucmVtb3ZlVGV4dCgpO3ZhciB0PXRoaXMuYW5jaG9yLG49dC5vZmZzZXQscj1bXTtpZih0LnR5cGU9PT0idGV4dCIpe3ZhciBpPXQuZ2V0Tm9kZSgpLG89aS5nZXROZXh0U2libGluZ3MoKS5yZXZlcnNlKCksbD1pLmdldFBhcmVudE9yVGhyb3coKSxzPWwuaXNJbmxpbmUoKSxhPXM/bC5nZXRUZXh0Q29udGVudFNpemUoKTppLmdldFRleHRDb250ZW50U2l6ZSgpO249PT0wP28ucHVzaChpKToocyYmKHI9bC5nZXROZXh0U2libGluZ3MoKSksbj09PWF8fHMmJm49PT1pLmdldFRleHRDb250ZW50U2l6ZSgpfHwoWyxpXT1pLnNwbGl0VGV4dChuKSxvLnB1c2goaSkpKX1lbHNle2lmKGw9dC5nZXROb2RlKCkseHIobCkpe289WW8oKSxyPWwuZ2V0Q2hpbGRBdEluZGV4KG4pLG8uc2VsZWN0KCksciE9PW51bGw/ci5pbnNlcnRCZWZvcmUobywhMSk6bC5hcHBlbmQobyk7cmV0dXJufW89bC5nZXRDaGlsZHJlbigpLnNsaWNlKG4pLnJldmVyc2UoKX1pZihpPW8ubGVuZ3RoLG49PT0wJiYwPGkmJmwuaXNJbmxpbmUoKSl7aWYocj1sLmdldFBhcmVudE9yVGhyb3coKSxvPXIuaW5zZXJ0TmV3QWZ0ZXIodGhpcywhMSksQihvKSlmb3Iocj1yLmdldENoaWxkcmVuKCksbD0wO2w8ci5sZW5ndGg7bCsrKW8uYXBwZW5kKHJbbF0pfWVsc2UgaWYocz1sLmluc2VydE5ld0FmdGVyKHRoaXMsITEpLHM9PT1udWxsKXRoaXMuaW5zZXJ0TGluZUJyZWFrKCk7ZWxzZSBpZihCKHMpKWlmKGE9bC5nZXRGaXJzdENoaWxkKCksbj09PTAmJihsLmlzKHQuZ2V0Tm9kZSgpKXx8YSYmYS5pcyh0LmdldE5vZGUoKSkpJiYwPGkpbC5pbnNlcnRCZWZvcmUocyk7ZWxzZXtpZihsPW51bGwsbj1yLmxlbmd0aCx0PXMuZ2V0UGFyZW50T3JUaHJvdygpLDA8bilmb3IoYT0wO2E8bjthKyspdC5hcHBlbmQoclthXSk7aWYoaSE9PTApZm9yKHI9MDtyPGk7cisrKW49b1tyXSxsPT09bnVsbD9zLmFwcGVuZChuKTpsLmluc2VydEJlZm9yZShuKSxsPW47cy5jYW5CZUVtcHR5KCl8fHMuZ2V0Q2hpbGRyZW5TaXplKCkhPT0wP3Muc2VsZWN0U3RhcnQoKToocy5zZWxlY3RQcmV2aW91cygpLHMucmVtb3ZlKCkpfX1pbnNlcnRMaW5lQnJlYWsodCl7bGV0IG49ZHMoKTt2YXIgcj10aGlzLmFuY2hvcjtyLnR5cGU9PT0iZWxlbWVudCImJihyPXIuZ2V0Tm9kZSgpLG1uKHIpJiZ0aGlzLmluc2VydFBhcmFncmFwaCgpKSx0P3RoaXMuaW5zZXJ0Tm9kZXMoW25dLCEwKTp0aGlzLmluc2VydE5vZGVzKFtuXSkmJm4uc2VsZWN0TmV4dCgwLDApfWdldENoYXJhY3Rlck9mZnNldHMoKXtyZXR1cm4gVmModGhpcyl9ZXh0cmFjdCgpe3ZhciB0PXRoaXMuZ2V0Tm9kZXMoKSxuPXQubGVuZ3RoLHI9bi0xLGk9dGhpcy5hbmNob3I7bGV0IG89dGhpcy5mb2N1czt2YXIgbD10WzBdO2xldCBzPXRbcl0sW2EsdV09VmModGhpcyk7cmV0dXJuIG49PT0wP1tdOm49PT0xP0oobCkmJiF0aGlzLmlzQ29sbGFwc2VkKCk/KHQ9YT51P3U6YSxyPWwuc3BsaXRUZXh0KHQsYT51P2E6dSksdD10PT09MD9yWzBdOnJbMV0sdCE9bnVsbD9bdF06W10pOltsXToobj1pLmlzQmVmb3JlKG8pLEoobCkmJihpPW4/YTp1LGk9PT1sLmdldFRleHRDb250ZW50U2l6ZSgpP3Quc2hpZnQoKTppIT09MCYmKFssbF09bC5zcGxpdFRleHQoaSksdFswXT1sKSksSihzKSYmKGw9cy5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCxuPW4/dTphLG49PT0wP3QucG9wKCk6biE9PWwmJihbc109cy5zcGxpdFRleHQobiksdFtyXT1zKSksdCl9bW9kaWZ5KHQsbixyKXt2YXIgaT10aGlzLmZvY3VzLG89dGhpcy5hbmNob3IsbD10PT09Im1vdmUiLHM9cm0oaSxuKTtpZih0dChzKSYmIXMuaXNJc29sYXRlZCgpKWwmJnMuaXNLZXlib2FyZFNlbGVjdGFibGUoKT8obj15bSgpLG4uYWRkKHMuX19rZXkpLFdyKG4pKToodD1uP3MuZ2V0UHJldmlvdXNTaWJsaW5nKCk6cy5nZXROZXh0U2libGluZygpLEoodCk/KHM9dC5fX2tleSxuPW4/dC5nZXRUZXh0Q29udGVudCgpLmxlbmd0aDowLGkuc2V0KHMsbiwidGV4dCIpLGwmJm8uc2V0KHMsbiwidGV4dCIpKToocj1zLmdldFBhcmVudE9yVGhyb3coKSxCKHQpPyhyPXQuX19rZXkscz1uP3QuZ2V0Q2hpbGRyZW5TaXplKCk6MCk6KHM9cy5nZXRJbmRleFdpdGhpblBhcmVudCgpLHI9ci5fX2tleSxufHxzKyspLGkuc2V0KHIscywiZWxlbWVudCIpLGwmJm8uc2V0KHIscywiZWxlbWVudCIpKSk7ZWxzZSBpZihvPXB0KCksaT1YcihvLl93aW5kb3cpKXt2YXIgYT1vLl9ibG9ja0N1cnNvckVsZW1lbnQsdT1vLl9yb290RWxlbWVudDtpZih1PT09bnVsbHx8YT09PW51bGx8fCFCKHMpfHxzLmlzSW5saW5lKCl8fHMuY2FuQmVFbXB0eSgpfHxpbShhLG8sdSksaS5tb2RpZnkodCxuPyJiYWNrd2FyZCI6ImZvcndhcmQiLHIpLDA8aS5yYW5nZUNvdW50JiYocz1pLmdldFJhbmdlQXQoMCksbz10aGlzLmFuY2hvci5nZXROb2RlKCksbz1tbihvKT9vOlhTKG8pLHRoaXMuYXBwbHlET01SYW5nZShzKSx0aGlzLmRpcnR5PSEwLCFsKSl7Zm9yKGw9dGhpcy5nZXROb2RlcygpLHQ9W10scj0hMSxhPTA7YTxsLmxlbmd0aDthKyspdT1sW2FdLGJkKHUsbyk/dC5wdXNoKHUpOnI9ITA7ciYmMDx0Lmxlbmd0aCYmKG4/KG49dFswXSxCKG4pP24uc2VsZWN0U3RhcnQoKTpuLmdldFBhcmVudE9yVGhyb3coKS5zZWxlY3RTdGFydCgpKToobj10W3QubGVuZ3RoLTFdLEIobik/bi5zZWxlY3RFbmQoKTpuLmdldFBhcmVudE9yVGhyb3coKS5zZWxlY3RFbmQoKSkpLChpLmFuY2hvck5vZGUhPT1zLnN0YXJ0Q29udGFpbmVyfHxpLmFuY2hvck9mZnNldCE9PXMuc3RhcnRPZmZzZXQpJiYobj10aGlzLmZvY3VzLGw9dGhpcy5hbmNob3IsaT1sLmtleSxzPWwub2Zmc2V0LG89bC50eXBlLERpKGwsbi5rZXksbi5vZmZzZXQsbi50eXBlKSxEaShuLGkscyxvKSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsKX19fWRlbGV0ZUNoYXJhY3Rlcih0KXtsZXQgbj10aGlzLmlzQ29sbGFwc2VkKCk7aWYodGhpcy5pc0NvbGxhcHNlZCgpKXt2YXIgcj10aGlzLmFuY2hvcixpPXRoaXMuZm9jdXMsbz1yLmdldE5vZGUoKTtpZighdCYmKHIudHlwZT09PSJlbGVtZW50IiYmQihvKSYmci5vZmZzZXQ9PT1vLmdldENoaWxkcmVuU2l6ZSgpfHxyLnR5cGU9PT0idGV4dCImJnIub2Zmc2V0PT09by5nZXRUZXh0Q29udGVudFNpemUoKSkpe3ZhciBsPW8uZ2V0UGFyZW50KCk7aWYobD1vLmdldE5leHRTaWJsaW5nKCl8fChsPT09bnVsbD9udWxsOmwuZ2V0TmV4dFNpYmxpbmcoKSksQihsKSYmbC5pc1NoYWRvd1Jvb3QoKSlyZXR1cm59aWYobD1ybShpLHQpLHR0KGwpJiYhbC5pc0lzb2xhdGVkKCkpe2wuaXNLZXlib2FyZFNlbGVjdGFibGUoKSYmQihvKSYmby5nZXRDaGlsZHJlblNpemUoKT09PTA/KG8ucmVtb3ZlKCksdD15bSgpLHQuYWRkKGwuX19rZXkpLFdyKHQpKToobC5yZW1vdmUoKSxwdCgpLmRpc3BhdGNoQ29tbWFuZChDZix2b2lkIDApKTtyZXR1cm59aWYoIXQmJkIobCkmJkIobykmJm8uaXNFbXB0eSgpKXtvLnJlbW92ZSgpLGwuc2VsZWN0U3RhcnQoKTtyZXR1cm59aWYodGhpcy5tb2RpZnkoImV4dGVuZCIsdCwiY2hhcmFjdGVyIiksdGhpcy5pc0NvbGxhcHNlZCgpKXtpZih0JiZyLm9mZnNldD09PTAmJihyLnR5cGU9PT0iZWxlbWVudCI/ci5nZXROb2RlKCk6ci5nZXROb2RlKCkuZ2V0UGFyZW50T3JUaHJvdygpKS5jb2xsYXBzZUF0U3RhcnQodGhpcykpcmV0dXJufWVsc2V7aWYobD1pLnR5cGU9PT0idGV4dCI/aS5nZXROb2RlKCk6bnVsbCxvPXIudHlwZT09PSJ0ZXh0Ij9yLmdldE5vZGUoKTpudWxsLGwhPT1udWxsJiZsLmlzU2VnbWVudGVkKCkpe2lmKHI9aS5vZmZzZXQsaT1sLmdldFRleHRDb250ZW50U2l6ZSgpLGwuaXMobyl8fHQmJnIhPT1pfHwhdCYmciE9PTApe1UwKGwsdCxyKTtyZXR1cm59fWVsc2UgaWYobyE9PW51bGwmJm8uaXNTZWdtZW50ZWQoKSYmKHI9ci5vZmZzZXQsaT1vLmdldFRleHRDb250ZW50U2l6ZSgpLG8uaXMobCl8fHQmJnIhPT0wfHwhdCYmciE9PWkpKXtVMChvLHQscik7cmV0dXJufWlmKG89dGhpcy5hbmNob3IsbD10aGlzLmZvY3VzLHI9by5nZXROb2RlKCksaT1sLmdldE5vZGUoKSxyPT09aSYmby50eXBlPT09InRleHQiJiZsLnR5cGU9PT0idGV4dCIpe3ZhciBzPW8ub2Zmc2V0LGE9bC5vZmZzZXQ7bGV0IHU9czxhO2k9dT9zOmEsYT11P2E6cyxzPWEtMSxpIT09cyYmKHI9ci5nZXRUZXh0Q29udGVudCgpLnNsaWNlKGksYSksWlMocil8fCh0P2wub2Zmc2V0PXM6by5vZmZzZXQ9cykpfX19dGhpcy5yZW1vdmVUZXh0KCksdCYmIW4mJnRoaXMuaXNDb2xsYXBzZWQoKSYmdGhpcy5hbmNob3IudHlwZT09PSJlbGVtZW50IiYmdGhpcy5hbmNob3Iub2Zmc2V0PT09MCYmKHQ9dGhpcy5hbmNob3IuZ2V0Tm9kZSgpLHQuaXNFbXB0eSgpJiZtbih0LmdldFBhcmVudCgpKSYmdC5nZXRJbmRleFdpdGhpblBhcmVudCgpPT09MCYmdC5jb2xsYXBzZUF0U3RhcnQodGhpcykpfWRlbGV0ZUxpbmUodCl7dGhpcy5pc0NvbGxhcHNlZCgpJiYodGhpcy5hbmNob3IudHlwZT09PSJ0ZXh0IiYmdGhpcy5tb2RpZnkoImV4dGVuZCIsdCwibGluZWJvdW5kYXJ5IiksKHQ/dGhpcy5mb2N1czp0aGlzLmFuY2hvcikub2Zmc2V0PT09MCYmdGhpcy5tb2RpZnkoImV4dGVuZCIsdCwiY2hhcmFjdGVyIikpLHRoaXMucmVtb3ZlVGV4dCgpfWRlbGV0ZVdvcmQodCl7dGhpcy5pc0NvbGxhcHNlZCgpJiZ0aGlzLm1vZGlmeSgiZXh0ZW5kIix0LCJ3b3JkIiksdGhpcy5yZW1vdmVUZXh0KCl9fWZ1bmN0aW9uIGJzKGUpe3JldHVybiBlIGluc3RhbmNlb2YgUGZ9ZnVuY3Rpb24gQjAoZSl7bGV0IHQ9ZS5vZmZzZXQ7cmV0dXJuIGUudHlwZT09PSJ0ZXh0Ij90OihlPWUuZ2V0Tm9kZSgpLHQ9PT1lLmdldENoaWxkcmVuU2l6ZSgpP2UuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGg6MCl9ZnVuY3Rpb24gVmMoZSl7bGV0IHQ9ZS5hbmNob3I7cmV0dXJuIGU9ZS5mb2N1cyx0LnR5cGU9PT0iZWxlbWVudCImJmUudHlwZT09PSJlbGVtZW50IiYmdC5rZXk9PT1lLmtleSYmdC5vZmZzZXQ9PT1lLm9mZnNldD9bMCwwXTpbQjAodCksQjAoZSldfWZ1bmN0aW9uIFUwKGUsdCxuKXtsZXQgcj1lLmdldFRleHRDb250ZW50KCkuc3BsaXQoLyg/PVxzKS9nKSxpPXIubGVuZ3RoLG89MCxsPTA7Zm9yKGxldCBzPTA7czxpO3MrKyl7bGV0IGE9cltzXSx1PXM9PT1pLTE7aWYobD1vLG8rPWEubGVuZ3RoLHQmJm89PT1ufHxvPm58fHUpe3Iuc3BsaWNlKHMsMSksdSYmKGw9dm9pZCAwKTticmVha319dD1yLmpvaW4oIiIpLnRyaW0oKSx0PT09IiI/ZS5yZW1vdmUoKTooZS5zZXRUZXh0Q29udGVudCh0KSxlLnNlbGVjdChsLGwpKX1mdW5jdGlvbiBXMChlLHQsbixyKXt2YXIgaT10O2lmKGUubm9kZVR5cGU9PT0xKXtsZXQgcz0hMTt2YXIgbz1lLmNoaWxkTm9kZXMsbD1vLmxlbmd0aDtpPT09bCYmKHM9ITAsaT1sLTEpO2xldCBhPW9baV07aWYobD0hMSxhPT09ci5fYmxvY2tDdXJzb3JFbGVtZW50PyhhPW9baSsxXSxsPSEwKTpyLl9ibG9ja0N1cnNvckVsZW1lbnQhPT1udWxsJiZpLS0scj16bChhKSxKKHIpKWk9cz9yLmdldFRleHRDb250ZW50U2l6ZSgpOjA7ZWxzZXtpZihvPXpsKGUpLG89PT1udWxsKXJldHVybiBudWxsO2lmKEIobyk/KGU9by5nZXRDaGlsZEF0SW5kZXgoaSksKHQ9QihlKSkmJih0PWUuZ2V0UGFyZW50KCksdD1uPT09bnVsbHx8dD09PW51bGx8fCF0LmNhbkJlRW1wdHkoKXx8dCE9PW4uZ2V0Tm9kZSgpKSx0JiYobj1zP2UuZ2V0TGFzdERlc2NlbmRhbnQoKTplLmdldEZpcnN0RGVzY2VuZGFudCgpLG49PT1udWxsPyhvPWUsaT0wKTooZT1uLG89QihlKT9lOmUuZ2V0UGFyZW50T3JUaHJvdygpKSksSihlKT8ocj1lLG89bnVsbCxpPXM/ZS5nZXRUZXh0Q29udGVudFNpemUoKTowKTplIT09byYmcyYmIWwmJmkrKyk6KGk9by5nZXRJbmRleFdpdGhpblBhcmVudCgpLGk9dD09PTAmJnR0KG8pJiZ6bChlKT09PW8/aTppKzEsbz1vLmdldFBhcmVudE9yVGhyb3coKSksQihvKSlyZXR1cm4gbmV3IFZyKG8uX19rZXksaSwiZWxlbWVudCIpfX1lbHNlIHI9emwoZSk7cmV0dXJuIEoocik/bmV3IFZyKHIuX19rZXksaSwidGV4dCIpOm51bGx9ZnVuY3Rpb24gVjAoZSx0LG4pe3ZhciByPWUub2Zmc2V0LGk9ZS5nZXROb2RlKCk7cj09PTA/KHI9aS5nZXRQcmV2aW91c1NpYmxpbmcoKSxpPWkuZ2V0UGFyZW50KCksdD8obnx8IXQpJiZyPT09bnVsbCYmQihpKSYmaS5pc0lubGluZSgpJiYodD1pLmdldFByZXZpb3VzU2libGluZygpLEoodCkmJihlLmtleT10Ll9fa2V5LGUub2Zmc2V0PXQuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGgpKTpCKHIpJiYhbiYmci5pc0lubGluZSgpPyhlLmtleT1yLl9fa2V5LGUub2Zmc2V0PXIuZ2V0Q2hpbGRyZW5TaXplKCksZS50eXBlPSJlbGVtZW50Iik6SihyKSYmKGUua2V5PXIuX19rZXksZS5vZmZzZXQ9ci5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCkpOnI9PT1pLmdldFRleHRDb250ZW50KCkubGVuZ3RoJiYocj1pLmdldE5leHRTaWJsaW5nKCksaT1pLmdldFBhcmVudCgpLHQmJkIocikmJnIuaXNJbmxpbmUoKT8oZS5rZXk9ci5fX2tleSxlLm9mZnNldD0wLGUudHlwZT0iZWxlbWVudCIpOihufHx0KSYmcj09PW51bGwmJkIoaSkmJmkuaXNJbmxpbmUoKSYmIWkuY2FuSW5zZXJ0VGV4dEFmdGVyKCkmJih0PWkuZ2V0TmV4dFNpYmxpbmcoKSxKKHQpJiYoZS5rZXk9dC5fX2tleSxlLm9mZnNldD0wKSkpfWZ1bmN0aW9uIGhFKGUsdCxuKXtpZihlLnR5cGU9PT0idGV4dCImJnQudHlwZT09PSJ0ZXh0Iil7dmFyIHI9ZS5pc0JlZm9yZSh0KTtsZXQgaT1lLmlzKHQpO1YwKGUscixpKSxWMCh0LCFyLGkpLGkmJih0LmtleT1lLmtleSx0Lm9mZnNldD1lLm9mZnNldCx0LnR5cGU9ZS50eXBlKSxyPXB0KCksci5pc0NvbXBvc2luZygpJiZyLl9jb21wb3NpdGlvbktleSE9PWUua2V5JiZtZShuKSYmKHI9bi5hbmNob3Isbj1uLmZvY3VzLERpKGUsci5rZXksci5vZmZzZXQsci50eXBlKSxEaSh0LG4ua2V5LG4ub2Zmc2V0LG4udHlwZSkpfX1mdW5jdGlvbiBwRShlLHQsbixyLGksbyl7cmV0dXJuIGU9PT1udWxsfHxuPT09bnVsbHx8IUx1KGksZSxuKXx8KHQ9VzAoZSx0LG1lKG8pP28uYW5jaG9yOm51bGwsaSksdD09PW51bGwpfHwocj1XMChuLHIsbWUobyk/by5mb2N1czpudWxsLGkpLHI9PT1udWxsfHx0LnR5cGU9PT0iZWxlbWVudCImJnIudHlwZT09PSJlbGVtZW50IiYmKGU9emwoZSksbj16bChuKSx0dChlKSYmdHQobikpKT9udWxsOihoRSh0LHIsbyksW3Qscl0pfWZ1bmN0aW9uIHZtKGUpe3JldHVybiBCKGUpJiYhZS5pc0lubGluZSgpfWZ1bmN0aW9uIG1FKGUsdCxuLHIsaSxvKXtsZXQgbD1RcigpO3JldHVybiBlPW5ldyBhbChuZXcgVnIoZSx0LGkpLG5ldyBWcihuLHIsbyksMCwiIiksZS5kaXJ0eT0hMCxsLl9zZWxlY3Rpb249ZX1mdW5jdGlvbiB5bSgpe3JldHVybiBuZXcgUGYobmV3IFNldCl9ZnVuY3Rpb24gTFIoZSl7bGV0IHQ9ZS5nZXRFZGl0b3JTdGF0ZSgpLl9zZWxlY3Rpb24sbj1YcihlLl93aW5kb3cpO3JldHVybiBicyh0KXx8aHYodCk/dC5jbG9uZSgpOnB2KHQsbixlKX1mdW5jdGlvbiBwdihlLHQsbil7dmFyIHI9bi5fd2luZG93O2lmKHI9PT1udWxsKXJldHVybiBudWxsO3ZhciBpPXIuZXZlbnQsbz1pP2kudHlwZTp2b2lkIDA7cj1vPT09InNlbGVjdGlvbmNoYW5nZSIsaT0hdG0mJihyfHxvPT09ImJlZm9yZWlucHV0Inx8bz09PSJjb21wb3NpdGlvbnN0YXJ0Inx8bz09PSJjb21wb3NpdGlvbmVuZCJ8fG89PT0iY2xpY2siJiZpJiZpLmRldGFpbD09PTN8fG89PT0iZHJvcCJ8fG89PT12b2lkIDApO2xldCBsO2lmKCFtZShlKXx8aSl7aWYodD09PW51bGwpcmV0dXJuIG51bGw7aWYoaT10LmFuY2hvck5vZGUsbz10LmZvY3VzTm9kZSxsPXQuYW5jaG9yT2Zmc2V0LHQ9dC5mb2N1c09mZnNldCxyJiZtZShlKSYmIUx1KG4saSxvKSlyZXR1cm4gZS5jbG9uZSgpfWVsc2UgcmV0dXJuIGUuY2xvbmUoKTtpZihuPXBFKGksbCxvLHQsbixlKSxuPT09bnVsbClyZXR1cm4gbnVsbDtsZXRbcyxhXT1uO3JldHVybiBuZXcgYWwocyxhLG1lKGUpP2UuZm9ybWF0OjAsbWUoZSk/ZS5zdHlsZToiIil9ZnVuY3Rpb24gcnQoKXtyZXR1cm4gUXIoKS5fc2VsZWN0aW9ufWZ1bmN0aW9uIFRzKCl7cmV0dXJuIHB0KCkuX2VkaXRvclN0YXRlLl9zZWxlY3Rpb259ZnVuY3Rpb24gUmQoZSx0LG4scj0xKXt2YXIgaT1lLmFuY2hvcixvPWUuZm9jdXMsbD1pLmdldE5vZGUoKSxzPW8uZ2V0Tm9kZSgpO2lmKHQuaXMobCl8fHQuaXMocykpe2lmKGw9dC5fX2tleSxlLmlzQ29sbGFwc2VkKCkpdD1pLm9mZnNldCwobjw9dCYmMDxyfHxuPHQmJjA+cikmJihuPU1hdGgubWF4KDAsdCtyKSxpLnNldChsLG4sImVsZW1lbnQiKSxvLnNldChsLG4sImVsZW1lbnQiKSxIMChlKSk7ZWxzZXtsZXQgdT1lLmlzQmFja3dhcmQoKTtzPXU/bzppO3ZhciBhPXMuZ2V0Tm9kZSgpO2k9dT9pOm8sbz1pLmdldE5vZGUoKSx0LmlzKGEpJiYoYT1zLm9mZnNldCwobjw9YSYmMDxyfHxuPGEmJjA+cikmJnMuc2V0KGwsTWF0aC5tYXgoMCxhK3IpLCJlbGVtZW50IikpLHQuaXMobykmJih0PWkub2Zmc2V0LChuPD10JiYwPHJ8fG48dCYmMD5yKSYmaS5zZXQobCxNYXRoLm1heCgwLHQrciksImVsZW1lbnQiKSl9SDAoZSl9fWZ1bmN0aW9uIEgwKGUpe3ZhciB0PWUuYW5jaG9yLG49dC5vZmZzZXQ7bGV0IHI9ZS5mb2N1czt2YXIgaT1yLm9mZnNldCxvPXQuZ2V0Tm9kZSgpLGw9ci5nZXROb2RlKCk7aWYoZS5pc0NvbGxhcHNlZCgpKUIobykmJihsPW8uZ2V0Q2hpbGRyZW5TaXplKCksbD0oaT1uPj1sKT9vLmdldENoaWxkQXRJbmRleChsLTEpOm8uZ2V0Q2hpbGRBdEluZGV4KG4pLEoobCkmJihuPTAsaSYmKG49bC5nZXRUZXh0Q29udGVudFNpemUoKSksdC5zZXQobC5fX2tleSxuLCJ0ZXh0Iiksci5zZXQobC5fX2tleSxuLCJ0ZXh0IikpKTtlbHNle2lmKEIobykpe2xldCBzPW8uZ2V0Q2hpbGRyZW5TaXplKCk7bj0oZT1uPj1zKT9vLmdldENoaWxkQXRJbmRleChzLTEpOm8uZ2V0Q2hpbGRBdEluZGV4KG4pLEoobikmJihvPTAsZSYmKG89bi5nZXRUZXh0Q29udGVudFNpemUoKSksdC5zZXQobi5fX2tleSxvLCJ0ZXh0IikpfUIobCkmJihuPWwuZ2V0Q2hpbGRyZW5TaXplKCksaT0odD1pPj1uKT9sLmdldENoaWxkQXRJbmRleChuLTEpOmwuZ2V0Q2hpbGRBdEluZGV4KGkpLEooaSkmJihsPTAsdCYmKGw9aS5nZXRUZXh0Q29udGVudFNpemUoKSksci5zZXQoaS5fX2tleSxsLCJ0ZXh0IikpKX19ZnVuY3Rpb24gSVIoZSx0KXtpZih0PXQuZ2V0RWRpdG9yU3RhdGUoKS5fc2VsZWN0aW9uLGU9ZS5fc2VsZWN0aW9uLG1lKGUpKXt2YXIgbj1lLmFuY2hvcjtsZXQgcj1lLmZvY3VzLGk7bi50eXBlPT09InRleHQiJiYoaT1uLmdldE5vZGUoKSxpLnNlbGVjdGlvblRyYW5zZm9ybSh0LGUpKSxyLnR5cGU9PT0idGV4dCImJihuPXIuZ2V0Tm9kZSgpLGkhPT1uJiZuLnNlbGVjdGlvblRyYW5zZm9ybSh0LGUpKX19ZnVuY3Rpb24gT2QoZSx0LG4scixpKXtsZXQgbz1udWxsLGw9MCxzPW51bGw7ciE9PW51bGw/KG89ci5fX2tleSxKKHIpPyhsPXIuZ2V0VGV4dENvbnRlbnRTaXplKCkscz0idGV4dCIpOkIocikmJihsPXIuZ2V0Q2hpbGRyZW5TaXplKCkscz0iZWxlbWVudCIpKTppIT09bnVsbCYmKG89aS5fX2tleSxKKGkpP3M9InRleHQiOkIoaSkmJihzPSJlbGVtZW50IikpLG8hPT1udWxsJiZzIT09bnVsbD9lLnNldChvLGwscyk6KGw9dC5nZXRJbmRleFdpdGhpblBhcmVudCgpLGw9PT0tMSYmKGw9bi5nZXRDaGlsZHJlblNpemUoKSksZS5zZXQobi5fX2tleSxsLCJlbGVtZW50IikpfWZ1bmN0aW9uIEswKGUsdCxuLHIsaSl7ZS50eXBlPT09InRleHQiPyhlLmtleT1uLHR8fChlLm9mZnNldCs9aSkpOmUub2Zmc2V0PnIuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSYmLS1lLm9mZnNldH1mdW5jdGlvbiBnRShlLHQsbil7bGV0IHI9W10saT1udWxsLG89bnVsbDtlPWUuZ2V0Q2hpbGRyZW4oKTtmb3IobGV0IGM9MDtjPGUubGVuZ3RoO2MrKyl7dmFyIGw9ZVtjXTt1dShsKXx8SCgxMDgpO3ZhciBzPWwuZ2V0Q2hpbGRyZW4oKTtsPTA7Zm9yKGxldCBkIG9mIHMpe2ZvcihRbihkKXx8SCgxMDkpO3JbY10hPT12b2lkIDAmJnJbY11bbF0hPT12b2lkIDA7KWwrKztzPWM7dmFyIGE9bCx1PWQ7bGV0IGY9e2NlbGw6dSxzdGFydENvbHVtbjphLHN0YXJ0Um93OnN9LGg9dS5fX3Jvd1NwYW4sbT11Ll9fY29sU3Bhbjtmb3IobGV0IGc9MDtnPGg7ZysrKXtyW3MrZ109PT12b2lkIDAmJihyW3MrZ109W10pO2ZvcihsZXQgdz0wO3c8bTt3KyspcltzK2ddW2Erd109Zn10LmlzKHUpJiYoaT1mKSxuLmlzKHUpJiYobz1mKSxsKz1kLl9fY29sU3Bhbn19cmV0dXJuIGk9PT1udWxsJiZIKDExMCksbz09PW51bGwmJkgoMTExKSxbcixpLG9dfWZ1bmN0aW9uIHZFKGUpe2UgaW5zdGFuY2VvZiB2dnx8KGUgaW5zdGFuY2VvZiB6dT8oZT1UZChlLFFuKSxRbihlKXx8SCgxMTQpKTooZT1UZChlLmdldE5vZGUoKSxRbiksUW4oZSl8fEgoMTE0KSkpO2xldCB0PWUuZ2V0UGFyZW50KCk7dXUodCl8fEgoMTE1KTtsZXQgbj10LmdldFBhcmVudCgpO3JldHVybiB5dihuKXx8SCgxMTYpLFtlLHQsbl19bGV0IGp0PW51bGwsenQ9bnVsbCxPbj0hMSxqaD0hMSxhdT0wLFowPXtjaGFyYWN0ZXJEYXRhOiEwLGNoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfTtmdW5jdGlvbiBOcygpe3JldHVybiBPbnx8anQhPT1udWxsJiZqdC5fcmVhZE9ubHl9ZnVuY3Rpb24gaG4oKXtPbiYmSCgxMyl9ZnVuY3Rpb24gUXIoKXtyZXR1cm4ganQ9PT1udWxsJiZIKDE1KSxqdH1mdW5jdGlvbiBwdCgpe3JldHVybiB6dD09PW51bGwmJkgoMTYpLHp0fWZ1bmN0aW9uIEcwKGUsdCxuKXt2YXIgcj10Ll9fdHlwZTtsZXQgaT1lLl9ub2Rlcy5nZXQocik7Zm9yKGk9PT12b2lkIDAmJkgoMzAsciksZT1uLmdldChyKSxlPT09dm9pZCAwJiYoZT1BcnJheS5mcm9tKGkudHJhbnNmb3Jtcyksbi5zZXQocixlKSksbj1lLmxlbmd0aCxyPTA7cjxuJiYoZVtyXSh0KSx0LmlzQXR0YWNoZWQoKSk7cisrKTt9ZnVuY3Rpb24galIoZSx0KXt0PXQuX2RpcnR5TGVhdmVzLGU9ZS5fbm9kZU1hcDtmb3IobGV0IG4gb2YgdCl0PWUuZ2V0KG4pLEoodCkmJnQuaXNBdHRhY2hlZCgpJiZ0LmlzU2ltcGxlVGV4dCgpJiYhdC5pc1VubWVyZ2VhYmxlKCkmJkJTKHQpfWZ1bmN0aW9uIHpSKGUsdCl7bGV0IG49dC5fZGlydHlMZWF2ZXMscj10Ll9kaXJ0eUVsZW1lbnRzO2U9ZS5fbm9kZU1hcDtsZXQgaT1XaSgpLG89bmV3IE1hcDt2YXIgbD1uO2xldCBzPWwuc2l6ZTtmb3IodmFyIGE9cix1PWEuc2l6ZTswPHN8fDA8dTspe2lmKDA8cyl7dC5fZGlydHlMZWF2ZXM9bmV3IFNldDtmb3IobGV0IGMgb2YgbClsPWUuZ2V0KGMpLEoobCkmJmwuaXNBdHRhY2hlZCgpJiZsLmlzU2ltcGxlVGV4dCgpJiYhbC5pc1VubWVyZ2VhYmxlKCkmJkJTKGwpLGwhPT12b2lkIDAmJmwhPT12b2lkIDAmJmwuX19rZXkhPT1pJiZsLmlzQXR0YWNoZWQoKSYmRzAodCxsLG8pLG4uYWRkKGMpO2lmKGw9dC5fZGlydHlMZWF2ZXMscz1sLnNpemUsMDxzKXthdSsrO2NvbnRpbnVlfX10Ll9kaXJ0eUxlYXZlcz1uZXcgU2V0LHQuX2RpcnR5RWxlbWVudHM9bmV3IE1hcDtmb3IobGV0IGMgb2YgYSlhPWNbMF0sdT1jWzFdLChhPT09InJvb3QifHx1KSYmKGw9ZS5nZXQoYSksbCE9PXZvaWQgMCYmbCE9PXZvaWQgMCYmbC5fX2tleSE9PWkmJmwuaXNBdHRhY2hlZCgpJiZHMCh0LGwsbyksci5zZXQoYSx1KSk7bD10Ll9kaXJ0eUxlYXZlcyxzPWwuc2l6ZSxhPXQuX2RpcnR5RWxlbWVudHMsdT1hLnNpemUsYXUrK310Ll9kaXJ0eUxlYXZlcz1uLHQuX2RpcnR5RWxlbWVudHM9cn1mdW5jdGlvbiBtdihlLHQpe3ZhciBuPWUudHlwZSxyPXQuZ2V0KG4pO2lmKHI9PT12b2lkIDAmJkgoMTcsbiksbj1yLmtsYXNzLGUudHlwZSE9PW4uZ2V0VHlwZSgpJiZIKDE4LG4ubmFtZSksbj1uLmltcG9ydEpTT04oZSksZT1lLmNoaWxkcmVuLEIobikmJkFycmF5LmlzQXJyYXkoZSkpZm9yKHI9MDtyPGUubGVuZ3RoO3IrKyl7bGV0IGk9bXYoZVtyXSx0KTtuLmFwcGVuZChpKX1yZXR1cm4gbn1mdW5jdGlvbiBZMChlLHQpe2xldCBuPWp0LHI9T24saT16dDtqdD1lLE9uPSEwLHp0PW51bGw7dHJ5e3JldHVybiB0KCl9ZmluYWxseXtqdD1uLE9uPXIsenQ9aX19ZnVuY3Rpb24gQm8oZSx0KXtsZXQgbj1lLl9wZW5kaW5nRWRpdG9yU3RhdGUscj1lLl9yb290RWxlbWVudCxpPWUuX2hlYWRsZXNzfHxyPT09bnVsbDtpZihuIT09bnVsbCl7dmFyIG89ZS5fZWRpdG9yU3RhdGUsbD1vLl9zZWxlY3Rpb24scz1uLl9zZWxlY3Rpb24sYT1lLl9kaXJ0eVR5cGUhPT0wLHU9anQsYz1PbixkPXp0LGY9ZS5fdXBkYXRpbmcsaD1lLl9vYnNlcnZlcixtPW51bGw7aWYoZS5fcGVuZGluZ0VkaXRvclN0YXRlPW51bGwsZS5fZWRpdG9yU3RhdGU9biwhaSYmYSYmaCE9PW51bGwpe3p0PWUsanQ9bixPbj0hMSxlLl91cGRhdGluZz0hMDt0cnl7bGV0IGplPWUuX2RpcnR5VHlwZSxUdD1lLl9kaXJ0eUVsZW1lbnRzLGF0PWUuX2RpcnR5TGVhdmVzO2guZGlzY29ubmVjdCgpO3ZhciBnPWplLHc9VHQsdj1hdDtmbj1vaT1OdD0iIixlRT1nPT09MixCYz1udWxsLHRuPWUsaW89ZS5fY29uZmlnLGl1PWUuX25vZGVzLFJmPXRuLl9saXN0ZW5lcnMubXV0YXRpb24sb209dyxsbT12LEdvPW8uX25vZGVNYXAsb289bi5fbm9kZU1hcCxmdj1uLl9yZWFkT25seSxzbT1uZXcgTWFwKGUuX2tleVRvRE9NTWFwKTtsZXQgbG49bmV3IE1hcDtvdT1sbixjYSgicm9vdCIsbnVsbCksb3U9c209aW89b289R289bG09b209aXU9dG49dm9pZCAwLG09bG59Y2F0Y2goamUpe2lmKGplIGluc3RhbmNlb2YgRXJyb3ImJmUuX29uRXJyb3IoamUpLGpoKXRocm93IGplO3dFKGUsbnVsbCxyLG4pLEZTKGUpLGUuX2RpcnR5VHlwZT0yLGpoPSEwLEJvKGUsbyksamg9ITE7cmV0dXJufWZpbmFsbHl7aC5vYnNlcnZlKHIsWjApLGUuX3VwZGF0aW5nPWYsanQ9dSxPbj1jLHp0PWR9fW4uX3JlYWRPbmx5fHwobi5fcmVhZE9ubHk9ITApO3ZhciB5PWUuX2RpcnR5TGVhdmVzLF89ZS5fZGlydHlFbGVtZW50cyxTPWUuX25vcm1hbGl6ZWROb2RlcyxFPWUuX3VwZGF0ZVRhZ3MsJD1lLl9kZWZlcnJlZDthJiYoZS5fZGlydHlUeXBlPTAsZS5fY2xvbmVOb3ROZWVkZWQuY2xlYXIoKSxlLl9kaXJ0eUxlYXZlcz1uZXcgU2V0LGUuX2RpcnR5RWxlbWVudHM9bmV3IE1hcCxlLl9ub3JtYWxpemVkTm9kZXM9bmV3IFNldCxlLl91cGRhdGVUYWdzPW5ldyBTZXQpO3ZhciBDPWUuX2RlY29yYXRvcnMsVD1lLl9wZW5kaW5nRGVjb3JhdG9yc3x8QyxOPW4uX25vZGVNYXAsUjtmb3IoUiBpbiBUKU4uaGFzKFIpfHwoVD09PUMmJihUPUtTKGUpKSxkZWxldGUgVFtSXSk7dmFyIEQ9aT9udWxsOlhyKGUuX3dpbmRvdyk7aWYoZS5fZWRpdGFibGUmJkQhPT1udWxsJiYoYXx8cz09PW51bGx8fHMuZGlydHkpKXt6dD1lLGp0PW47dHJ5e2lmKGghPT1udWxsJiZoLmRpc2Nvbm5lY3QoKSxhfHxzPT09bnVsbHx8cy5kaXJ0eSl7bGV0IGplPWUuX2Jsb2NrQ3Vyc29yRWxlbWVudDtqZSE9PW51bGwmJmltKGplLGUscik7ZTp7bGV0IFR0PUQuYW5jaG9yTm9kZSxhdD1ELmZvY3VzTm9kZSxsbj1ELmFuY2hvck9mZnNldCxFbj1ELmZvY3VzT2Zmc2V0LF90PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYoIShFLmhhcygiY29sbGFib3JhdGlvbiIpJiZfdCE9PXJ8fF90IT09bnVsbCYmbHYoX3QpKSlpZihtZShzKSl7dmFyIEY9cy5hbmNob3Isc2U9cy5mb2N1cyxWPUYua2V5LEs9c2Uua2V5LE89JGQoZSxWKSxBPSRkKGUsSyksaz1GLm9mZnNldCxqPXNlLm9mZnNldCxJPXMuZm9ybWF0LFo9cy5zdHlsZSxuZT1zLmlzQ29sbGFwc2VkKCksa2U9Tyx2ZT1BLFdlPSExO2lmKEYudHlwZT09PSJ0ZXh0Iil7a2U9RWQoTyk7bGV0IEF0PUYuZ2V0Tm9kZSgpO1dlPUF0LmdldEZvcm1hdCgpIT09SXx8QXQuZ2V0U3R5bGUoKSE9PVp9ZWxzZSBtZShsKSYmbC5hbmNob3IudHlwZT09PSJ0ZXh0IiYmKFdlPSEwKTtpZihzZS50eXBlPT09InRleHQiJiYodmU9RWQoQSkpLGtlIT09bnVsbCYmdmUhPT1udWxsKXtpZihuZSYmKGw9PT1udWxsfHxXZXx8bWUobCkmJihsLmZvcm1hdCE9PUl8fGwuc3R5bGUhPT1aKSkpe3ZhciBGZT1wZXJmb3JtYW5jZS5ub3coKTthRT1bSSxaLGssVixGZV19aWYobG49PT1rJiZFbj09PWomJlR0PT09a2UmJmF0PT09dmUmJihELnR5cGUhPT0iUmFuZ2UifHwhbmUpJiYoX3QhPT1udWxsJiZyLmNvbnRhaW5zKF90KXx8ci5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pLEYudHlwZSE9PSJlbGVtZW50IikpYnJlYWsgZTt0cnl7RC5zZXRCYXNlQW5kRXh0ZW50KGtlLGssdmUsail9Y2F0Y2h7fWlmKCFFLmhhcygic2tpcC1zY3JvbGwtaW50by12aWV3IikmJnMuaXNDb2xsYXBzZWQoKSYmciE9PW51bGwmJnI9PT1kb2N1bWVudC5hY3RpdmVFbGVtZW50KXtsZXQgQXQ9cyBpbnN0YW5jZW9mIGFsJiZzLmFuY2hvci50eXBlPT09ImVsZW1lbnQiP2tlLmNoaWxkTm9kZXNba118fG51bGw6MDxELnJhbmdlQ291bnQ/RC5nZXRSYW5nZUF0KDApOm51bGw7aWYoQXQhPT1udWxsKXtsZXQgc247aWYoQXQgaW5zdGFuY2VvZiBUZXh0KXtsZXQgZ3Q9ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtndC5zZWxlY3ROb2RlKEF0KSxzbj1ndC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1lbHNlIHNuPUF0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2xldCBQbj1yLm93bmVyRG9jdW1lbnQscXI9UG4uZGVmYXVsdFZpZXc7aWYocXIhPT1udWxsKWZvcih2YXJ7dG9wOnRlLGJvdHRvbTpJZX09c24sYmUsUmUsU2U9cjtTZSE9PW51bGw7KXtsZXQgZ3Q9U2U9PT1Qbi5ib2R5O2lmKGd0KWJlPTAsUmU9VGYoZSkuaW5uZXJIZWlnaHQ7ZWxzZXtsZXQgRW89U2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7YmU9RW8udG9wLFJlPUVvLmJvdHRvbX1sZXQgTnI9MDtpZih0ZTxiZT9Ocj0tKGJlLXRlKTpJZT5SZSYmKE5yPUllLVJlKSxOciE9PTApaWYoZ3QpcXIuc2Nyb2xsQnkoMCxOcik7ZWxzZXtsZXQgRW89U2Uuc2Nyb2xsVG9wO1NlLnNjcm9sbFRvcCs9TnI7bGV0IHpzPVNlLnNjcm9sbFRvcC1Fbzt0ZS09enMsSWUtPXpzfWlmKGd0KWJyZWFrO1NlPWJmKFNlKX19fWZtPSEwfX1lbHNlIGwhPT1udWxsJiZMdShlLFR0LGF0KSYmRC5yZW1vdmVBbGxSYW5nZXMoKX19ZTp7bGV0IGplPWUuX2Jsb2NrQ3Vyc29yRWxlbWVudDtpZihtZShzKSYmcy5pc0NvbGxhcHNlZCgpJiZzLmFuY2hvci50eXBlPT09ImVsZW1lbnQiJiZyLmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKXtsZXQgVHQ9cy5hbmNob3IsYXQ9VHQuZ2V0Tm9kZSgpLGxuPVR0Lm9mZnNldCxFbj1hdC5nZXRDaGlsZHJlblNpemUoKSxfdD0hMSxBdD1udWxsO2lmKGxuPT09RW4pe2xldCBzbj1hdC5nZXRDaGlsZEF0SW5kZXgobG4tMSk7T2goc24pJiYoX3Q9ITApfWVsc2V7bGV0IHNuPWF0LmdldENoaWxkQXRJbmRleChsbik7aWYoT2goc24pKXtsZXQgUG49c24uZ2V0UHJldmlvdXNTaWJsaW5nKCk7KFBuPT09bnVsbHx8T2goUG4pKSYmKF90PSEwLEF0PWUuZ2V0RWxlbWVudEJ5S2V5KHNuLl9fa2V5KSl9fWlmKF90KXtsZXQgc249ZS5nZXRFbGVtZW50QnlLZXkoYXQuX19rZXkpO2lmKGplPT09bnVsbCl7bGV0IFBuPWUuX2NvbmZpZy50aGVtZSxxcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtxci5jb250ZW50RWRpdGFibGU9ImZhbHNlIixxci5zZXRBdHRyaWJ1dGUoImRhdGEtbGV4aWNhbC1jdXJzb3IiLCJ0cnVlIik7bGV0IGd0PVBuLmJsb2NrQ3Vyc29yO2lmKGd0IT09dm9pZCAwKXtpZih0eXBlb2YgZ3Q9PSJzdHJpbmciKXtsZXQgTnI9Z3Quc3BsaXQoIiAiKTtndD1Qbi5ibG9ja0N1cnNvcj1Ocn1ndCE9PXZvaWQgMCYmcXIuY2xhc3NMaXN0LmFkZCguLi5ndCl9ZS5fYmxvY2tDdXJzb3JFbGVtZW50PWplPXFyfXIuc3R5bGUuY2FyZXRDb2xvcj0idHJhbnNwYXJlbnQiLEF0PT09bnVsbD9zbi5hcHBlbmRDaGlsZChqZSk6c24uaW5zZXJ0QmVmb3JlKGplLEF0KTticmVhayBlfX1qZSE9PW51bGwmJmltKGplLGUscil9aCE9PW51bGwmJmgub2JzZXJ2ZShyLFowKX1maW5hbGx5e3p0PWQsanQ9dX19aWYobSE9PW51bGwpe3ZhciBEZT1tO2xldCBqZT1BcnJheS5mcm9tKGUuX2xpc3RlbmVycy5tdXRhdGlvbiksVHQ9amUubGVuZ3RoO2ZvcihsZXQgYXQ9MDthdDxUdDthdCsrKXtsZXRbbG4sRW5dPWplW2F0XSxfdD1EZS5nZXQoRW4pO190IT09dm9pZCAwJiZsbihfdCx7ZGlydHlMZWF2ZXM6eSxwcmV2RWRpdG9yU3RhdGU6byx1cGRhdGVUYWdzOkV9KX19bWUocyl8fHM9PT1udWxsfHxsIT09bnVsbCYmbC5pcyhzKXx8ZS5kaXNwYXRjaENvbW1hbmQoQ2Ysdm9pZCAwKTt2YXIgUWU9ZS5fcGVuZGluZ0RlY29yYXRvcnM7UWUhPT1udWxsJiYoZS5fZGVjb3JhdG9ycz1RZSxlLl9wZW5kaW5nRGVjb3JhdG9ycz1udWxsLE5hKCJkZWNvcmF0b3IiLGUsITAsUWUpKTt2YXIgV3Q9UDAodHx8byksU249UDAobik7aWYoV3QhPT1TbiYmTmEoInRleHRjb250ZW50IixlLCEwLFNuKSxOYSgidXBkYXRlIixlLCEwLHtkaXJ0eUVsZW1lbnRzOl8sZGlydHlMZWF2ZXM6eSxlZGl0b3JTdGF0ZTpuLG5vcm1hbGl6ZWROb2RlczpTLHByZXZFZGl0b3JTdGF0ZTp0fHxvLHRhZ3M6RX0pLGUuX2RlZmVycmVkPVtdLCQubGVuZ3RoIT09MCl7bGV0IGplPWUuX3VwZGF0aW5nO2UuX3VwZGF0aW5nPSEwO3RyeXtmb3IobGV0IFR0PTA7VHQ8JC5sZW5ndGg7VHQrKykkW1R0XSgpfWZpbmFsbHl7ZS5fdXBkYXRpbmc9amV9fXZhciB1cj1lLl91cGRhdGVzO2lmKHVyLmxlbmd0aCE9PTApe2xldCBqZT11ci5zaGlmdCgpO2lmKGplKXtsZXRbVHQsYXRdPWplO3lFKGUsVHQsYXQpfX19fWZ1bmN0aW9uIE5hKGUsdCxuLC4uLnIpe2xldCBpPXQuX3VwZGF0aW5nO3QuX3VwZGF0aW5nPW47dHJ5e2xldCBvPUFycmF5LmZyb20odC5fbGlzdGVuZXJzW2VdKTtmb3IoZT0wO2U8by5sZW5ndGg7ZSsrKW9bZV0uYXBwbHkobnVsbCxyKX1maW5hbGx5e3QuX3VwZGF0aW5nPWl9fWZ1bmN0aW9uIFgoZSx0LG4pe2lmKGUuX3VwZGF0aW5nPT09ITF8fHp0IT09ZSl7bGV0IG89ITE7cmV0dXJuIGUudXBkYXRlKCgpPT57bz1YKGUsdCxuKX0pLG99bGV0IHI9YXYoZSk7Zm9yKGxldCBvPTQ7MDw9bztvLS0pZm9yKGxldCBsPTA7bDxyLmxlbmd0aDtsKyspe3ZhciBpPXJbbF0uX2NvbW1hbmRzLmdldCh0KTtpZihpIT09dm9pZCAwJiYoaT1pW29dLGkhPT12b2lkIDApKXtpPUFycmF5LmZyb20oaSk7bGV0IHM9aS5sZW5ndGg7Zm9yKGxldCBhPTA7YTxzO2ErKylpZihpW2FdKG4sZSk9PT0hMClyZXR1cm4hMH19cmV0dXJuITF9ZnVuY3Rpb24gWDAoZSx0KXtsZXQgbj1lLl91cGRhdGVzO2Zvcih0PXR8fCExO24ubGVuZ3RoIT09MDspe3ZhciByPW4uc2hpZnQoKTtpZihyKXtsZXRbaSxvXT1yLGw7byE9PXZvaWQgMCYmKHI9by5vblVwZGF0ZSxsPW8udGFnLG8uc2tpcFRyYW5zZm9ybXMmJih0PSEwKSxyJiZlLl9kZWZlcnJlZC5wdXNoKHIpLGwmJmUuX3VwZGF0ZVRhZ3MuYWRkKGwpKSxpKCl9fXJldHVybiB0fWZ1bmN0aW9uIHlFKGUsdCxuKXtsZXQgcj1lLl91cGRhdGVUYWdzO3ZhciBpLG89aT0hMTtpZihuIT09dm9pZCAwKXt2YXIgbD1uLm9uVXBkYXRlO2k9bi50YWcsaSE9bnVsbCYmci5hZGQoaSksaT1uLnNraXBUcmFuc2Zvcm1zfHwhMSxvPW4uZGlzY3JldGV8fCExfWwmJmUuX2RlZmVycmVkLnB1c2gobCksbj1lLl9lZGl0b3JTdGF0ZSxsPWUuX3BlbmRpbmdFZGl0b3JTdGF0ZTtsZXQgcz0hMTsobD09PW51bGx8fGwuX3JlYWRPbmx5KSYmKGw9ZS5fcGVuZGluZ0VkaXRvclN0YXRlPW5ldyBNZihuZXcgTWFwKChsfHxuKS5fbm9kZU1hcCkpLHM9ITApLGwuX2ZsdXNoU3luYz1vLG89anQ7bGV0IGE9T24sdT16dCxjPWUuX3VwZGF0aW5nO2p0PWwsT249ITEsZS5fdXBkYXRpbmc9ITAsenQ9ZTt0cnl7cyYmKGUuX2hlYWRsZXNzP24uX3NlbGVjdGlvbiE9bnVsbCYmKGwuX3NlbGVjdGlvbj1uLl9zZWxlY3Rpb24uY2xvbmUoKSk6bC5fc2VsZWN0aW9uPUxSKGUpKTtsZXQgZD1lLl9jb21wb3NpdGlvbktleTt0KCksaT1YMChlLGkpLElSKGwsZSksZS5fZGlydHlUeXBlIT09MCYmKGk/alIobCxlKTp6UihsLGUpLFgwKGUpLF9SKG4sbCxlLl9kaXJ0eUxlYXZlcyxlLl9kaXJ0eUVsZW1lbnRzKSksZCE9PWUuX2NvbXBvc2l0aW9uS2V5JiYobC5fZmx1c2hTeW5jPSEwKTtsZXQgZj1sLl9zZWxlY3Rpb247aWYobWUoZikpe2xldCBoPWwuX25vZGVNYXAsbT1mLmZvY3VzLmtleTtoLmdldChmLmFuY2hvci5rZXkpIT09dm9pZCAwJiZoLmdldChtKSE9PXZvaWQgMHx8SCgxOSl9ZWxzZSBicyhmKSYmZi5fbm9kZXMuc2l6ZT09PTAmJihsLl9zZWxlY3Rpb249bnVsbCl9Y2F0Y2goZCl7ZCBpbnN0YW5jZW9mIEVycm9yJiZlLl9vbkVycm9yKGQpLGUuX3BlbmRpbmdFZGl0b3JTdGF0ZT1uLGUuX2RpcnR5VHlwZT0yLGUuX2Nsb25lTm90TmVlZGVkLmNsZWFyKCksZS5fZGlydHlMZWF2ZXM9bmV3IFNldCxlLl9kaXJ0eUVsZW1lbnRzLmNsZWFyKCksQm8oZSk7cmV0dXJufWZpbmFsbHl7anQ9byxPbj1hLHp0PXUsZS5fdXBkYXRpbmc9YyxhdT0wfWUuX2RpcnR5VHlwZSE9PTB8fEZSKGwsZSk/bC5fZmx1c2hTeW5jPyhsLl9mbHVzaFN5bmM9ITEsQm8oZSkpOnMmJmdSKCgpPT57Qm8oZSl9KToobC5fZmx1c2hTeW5jPSExLHMmJihyLmNsZWFyKCksZS5fZGVmZXJyZWQ9W10sZS5fcGVuZGluZ0VkaXRvclN0YXRlPW51bGwpKX1mdW5jdGlvbiBXbihlLHQsbil7ZS5fdXBkYXRpbmc/ZS5fdXBkYXRlcy5wdXNoKFt0LG5dKTp5RShlLHQsbil9Y2xhc3MgeEUgZXh0ZW5kcyB6dXtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1kZWNvcmF0ZSgpe0goNDcpfWlzSXNvbGF0ZWQoKXtyZXR1cm4hMX1pc0lubGluZSgpe3JldHVybiEwfWlzS2V5Ym9hcmRTZWxlY3RhYmxlKCl7cmV0dXJuITB9fWZ1bmN0aW9uIHR0KGUpe3JldHVybiBlIGluc3RhbmNlb2YgeEV9Y2xhc3MgdWwgZXh0ZW5kcyB6dXtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLl9fbGFzdD10aGlzLl9fZmlyc3Q9bnVsbCx0aGlzLl9faW5kZW50PXRoaXMuX19mb3JtYXQ9dGhpcy5fX3NpemU9MCx0aGlzLl9fZGlyPW51bGx9Z2V0Rm9ybWF0KCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19mb3JtYXR9Z2V0Rm9ybWF0VHlwZSgpe2xldCB0PXRoaXMuZ2V0Rm9ybWF0KCk7cmV0dXJuIGNSW3RdfHwiIn1nZXRJbmRlbnQoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX2luZGVudH1nZXRDaGlsZHJlbigpe2xldCB0PVtdLG49dGhpcy5nZXRGaXJzdENoaWxkKCk7Zm9yKDtuIT09bnVsbDspdC5wdXNoKG4pLG49bi5nZXROZXh0U2libGluZygpO3JldHVybiB0fWdldENoaWxkcmVuS2V5cygpe2xldCB0PVtdLG49dGhpcy5nZXRGaXJzdENoaWxkKCk7Zm9yKDtuIT09bnVsbDspdC5wdXNoKG4uX19rZXkpLG49bi5nZXROZXh0U2libGluZygpO3JldHVybiB0fWdldENoaWxkcmVuU2l6ZSgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fc2l6ZX1pc0VtcHR5KCl7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wfWlzRGlydHkoKXtsZXQgdD1wdCgpLl9kaXJ0eUVsZW1lbnRzO3JldHVybiB0IT09bnVsbCYmdC5oYXModGhpcy5fX2tleSl9aXNMYXN0Q2hpbGQoKXtsZXQgdD10aGlzLmdldExhdGVzdCgpLG49dGhpcy5nZXRQYXJlbnRPclRocm93KCkuZ2V0TGFzdENoaWxkKCk7cmV0dXJuIG4hPT1udWxsJiZuLmlzKHQpfWdldEFsbFRleHROb2Rlcygpe2xldCB0PVtdLG49dGhpcy5nZXRGaXJzdENoaWxkKCk7Zm9yKDtuIT09bnVsbDspe2lmKEoobikmJnQucHVzaChuKSxCKG4pKXtsZXQgcj1uLmdldEFsbFRleHROb2RlcygpO3QucHVzaCguLi5yKX1uPW4uZ2V0TmV4dFNpYmxpbmcoKX1yZXR1cm4gdH1nZXRGaXJzdERlc2NlbmRhbnQoKXtsZXQgdD10aGlzLmdldEZpcnN0Q2hpbGQoKTtmb3IoO3QhPT1udWxsOyl7aWYoQih0KSl7bGV0IG49dC5nZXRGaXJzdENoaWxkKCk7aWYobiE9PW51bGwpe3Q9bjtjb250aW51ZX19YnJlYWt9cmV0dXJuIHR9Z2V0TGFzdERlc2NlbmRhbnQoKXtsZXQgdD10aGlzLmdldExhc3RDaGlsZCgpO2Zvcig7dCE9PW51bGw7KXtpZihCKHQpKXtsZXQgbj10LmdldExhc3RDaGlsZCgpO2lmKG4hPT1udWxsKXt0PW47Y29udGludWV9fWJyZWFrfXJldHVybiB0fWdldERlc2NlbmRhbnRCeUluZGV4KHQpe2xldCBuPXRoaXMuZ2V0Q2hpbGRyZW4oKSxyPW4ubGVuZ3RoO3JldHVybiB0Pj1yPyh0PW5bci0xXSxCKHQpJiZ0LmdldExhc3REZXNjZW5kYW50KCl8fHR8fG51bGwpOih0PW5bdF0sQih0KSYmdC5nZXRGaXJzdERlc2NlbmRhbnQoKXx8dHx8bnVsbCl9Z2V0Rmlyc3RDaGlsZCgpe2xldCB0PXRoaXMuZ2V0TGF0ZXN0KCkuX19maXJzdDtyZXR1cm4gdD09PW51bGw/bnVsbDpJdCh0KX1nZXRGaXJzdENoaWxkT3JUaHJvdygpe2xldCB0PXRoaXMuZ2V0Rmlyc3RDaGlsZCgpO3JldHVybiB0PT09bnVsbCYmSCg0NSx0aGlzLl9fa2V5KSx0fWdldExhc3RDaGlsZCgpe2xldCB0PXRoaXMuZ2V0TGF0ZXN0KCkuX19sYXN0O3JldHVybiB0PT09bnVsbD9udWxsOkl0KHQpfWdldExhc3RDaGlsZE9yVGhyb3coKXtsZXQgdD10aGlzLmdldExhc3RDaGlsZCgpO3JldHVybiB0PT09bnVsbCYmSCg5Nix0aGlzLl9fa2V5KSx0fWdldENoaWxkQXRJbmRleCh0KXt2YXIgbj10aGlzLmdldENoaWxkcmVuU2l6ZSgpO2xldCByO2lmKHQ8bi8yKXtmb3Iocj10aGlzLmdldEZpcnN0Q2hpbGQoKSxuPTA7ciE9PW51bGwmJm48PXQ7KXtpZihuPT09dClyZXR1cm4gcjtyPXIuZ2V0TmV4dFNpYmxpbmcoKSxuKyt9cmV0dXJuIG51bGx9Zm9yKHI9dGhpcy5nZXRMYXN0Q2hpbGQoKSwtLW47ciE9PW51bGwmJm4+PXQ7KXtpZihuPT09dClyZXR1cm4gcjtyPXIuZ2V0UHJldmlvdXNTaWJsaW5nKCksbi0tfXJldHVybiBudWxsfWdldFRleHRDb250ZW50KCl7bGV0IHQ9IiIsbj10aGlzLmdldENoaWxkcmVuKCkscj1uLmxlbmd0aDtmb3IobGV0IGk9MDtpPHI7aSsrKXtsZXQgbz1uW2ldO3QrPW8uZ2V0VGV4dENvbnRlbnQoKSxCKG8pJiZpIT09ci0xJiYhby5pc0lubGluZSgpJiYodCs9YAoKYCl9cmV0dXJuIHR9Z2V0VGV4dENvbnRlbnRTaXplKCl7bGV0IHQ9MCxuPXRoaXMuZ2V0Q2hpbGRyZW4oKSxyPW4ubGVuZ3RoO2ZvcihsZXQgaT0wO2k8cjtpKyspe2xldCBvPW5baV07dCs9by5nZXRUZXh0Q29udGVudFNpemUoKSxCKG8pJiZpIT09ci0xJiYhby5pc0lubGluZSgpJiYodCs9Mil9cmV0dXJuIHR9Z2V0RGlyZWN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19kaXJ9aGFzRm9ybWF0KHQpe3JldHVybiB0IT09IiI/KHQ9VDBbdF0sKHRoaXMuZ2V0Rm9ybWF0KCkmdCkhPT0wKTohMX1zZWxlY3QodCxuKXtobigpO2xldCByPXJ0KCksaT10LG89bjt2YXIgbD10aGlzLmdldENoaWxkcmVuU2l6ZSgpO2lmKCF0aGlzLmNhbkJlRW1wdHkoKSl7aWYodD09PTAmJm49PT0wKXtpZih0PXRoaXMuZ2V0Rmlyc3RDaGlsZCgpLEoodCl8fEIodCkpcmV0dXJuIHQuc2VsZWN0KDAsMCl9ZWxzZSBpZighKHQhPT12b2lkIDAmJnQhPT1sfHxuIT09dm9pZCAwJiZuIT09bCkmJih0PXRoaXMuZ2V0TGFzdENoaWxkKCksSih0KXx8Qih0KSkpcmV0dXJuIHQuc2VsZWN0KCl9aWYoaT09PXZvaWQgMCYmKGk9bCksbz09PXZvaWQgMCYmKG89bCksbD10aGlzLl9fa2V5LG1lKHIpKXIuYW5jaG9yLnNldChsLGksImVsZW1lbnQiKSxyLmZvY3VzLnNldChsLG8sImVsZW1lbnQiKSxyLmRpcnR5PSEwO2Vsc2UgcmV0dXJuIG1FKGwsaSxsLG8sImVsZW1lbnQiLCJlbGVtZW50Iik7cmV0dXJuIHJ9c2VsZWN0U3RhcnQoKXtsZXQgdD10aGlzLmdldEZpcnN0RGVzY2VuZGFudCgpO3JldHVybiBCKHQpfHxKKHQpP3Quc2VsZWN0KDAsMCk6dCE9PW51bGw/dC5zZWxlY3RQcmV2aW91cygpOnRoaXMuc2VsZWN0KDAsMCl9c2VsZWN0RW5kKCl7bGV0IHQ9dGhpcy5nZXRMYXN0RGVzY2VuZGFudCgpO3JldHVybiBCKHQpfHxKKHQpP3Quc2VsZWN0KCk6dCE9PW51bGw/dC5zZWxlY3ROZXh0KCk6dGhpcy5zZWxlY3QoKX1jbGVhcigpe2xldCB0PXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gdGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2gobj0+bi5yZW1vdmUoKSksdH1hcHBlbmQoLi4udCl7cmV0dXJuIHRoaXMuc3BsaWNlKHRoaXMuZ2V0Q2hpbGRyZW5TaXplKCksMCx0KX1zZXREaXJlY3Rpb24odCl7bGV0IG49dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiBuLl9fZGlyPXQsbn1zZXRGb3JtYXQodCl7cmV0dXJuIHRoaXMuZ2V0V3JpdGFibGUoKS5fX2Zvcm1hdD10IT09IiI/VDBbdF06MCx0aGlzfXNldEluZGVudCh0KXtyZXR1cm4gdGhpcy5nZXRXcml0YWJsZSgpLl9faW5kZW50PXQsdGhpc31zcGxpY2UodCxuLHIpe2xldCBpPXIubGVuZ3RoLG89dGhpcy5nZXRDaGlsZHJlblNpemUoKSxsPXRoaXMuZ2V0V3JpdGFibGUoKSxzPWwuX19rZXk7dmFyIGE9W10sdT1bXTtsZXQgYz10aGlzLmdldENoaWxkQXRJbmRleCh0K24pLGQ9bnVsbCxmPW8tbitpO2lmKHQhPT0wKWlmKHQ9PT1vKWQ9dGhpcy5nZXRMYXN0Q2hpbGQoKTtlbHNle3ZhciBoPXRoaXMuZ2V0Q2hpbGRBdEluZGV4KHQpO2ghPT1udWxsJiYoZD1oLmdldFByZXZpb3VzU2libGluZygpKX1pZigwPG4pe3ZhciBtPWQ9PT1udWxsP3RoaXMuZ2V0Rmlyc3RDaGlsZCgpOmQuZ2V0TmV4dFNpYmxpbmcoKTtmb3IoaD0wO2g8bjtoKyspe209PT1udWxsJiZIKDEwMCk7dmFyIGc9bS5nZXROZXh0U2libGluZygpLHc9bS5fX2tleTttPW0uZ2V0V3JpdGFibGUoKSxGbyhtKSx1LnB1c2godyksbT1nfX1mb3IoaD1kLGc9MDtnPGk7ZysrKXt3PXJbZ10saCE9PW51bGwmJncuaXMoaCkmJihkPWg9aC5nZXRQcmV2aW91c1NpYmxpbmcoKSksbT13LmdldFdyaXRhYmxlKCksbS5fX3BhcmVudD09PXMmJmYtLSxGbyhtKTtsZXQgdj13Ll9fa2V5O2g9PT1udWxsPyhsLl9fZmlyc3Q9dixtLl9fcHJldj1udWxsKTooaD1oLmdldFdyaXRhYmxlKCksaC5fX25leHQ9dixtLl9fcHJldj1oLl9fa2V5KSx3Ll9fa2V5PT09cyYmSCg3NiksbS5fX3BhcmVudD1zLGEucHVzaCh2KSxoPXd9aWYodCtuPT09bz9oIT09bnVsbCYmKGguZ2V0V3JpdGFibGUoKS5fX25leHQ9bnVsbCxsLl9fbGFzdD1oLl9fa2V5KTpjIT09bnVsbCYmKHQ9Yy5nZXRXcml0YWJsZSgpLGghPT1udWxsPyhuPWguZ2V0V3JpdGFibGUoKSx0Ll9fcHJldj1oLl9fa2V5LG4uX19uZXh0PWMuX19rZXkpOnQuX19wcmV2PW51bGwpLGwuX19zaXplPWYsdS5sZW5ndGgmJih0PXJ0KCksbWUodCkpKXt1PW5ldyBTZXQodSksYT1uZXcgU2V0KGEpO2xldHthbmNob3I6dixmb2N1czp5fT10O1EwKHYsdSxhKSYmT2Qodix2LmdldE5vZGUoKSx0aGlzLGQsYyksUTAoeSx1LGEpJiZPZCh5LHkuZ2V0Tm9kZSgpLHRoaXMsZCxjKSxmIT09MHx8dGhpcy5jYW5CZUVtcHR5KCl8fHhyKHRoaXMpfHx0aGlzLnJlbW92ZSgpfXJldHVybiBsfWV4cG9ydEpTT04oKXtyZXR1cm57Y2hpbGRyZW46W10sZGlyZWN0aW9uOnRoaXMuZ2V0RGlyZWN0aW9uKCksZm9ybWF0OnRoaXMuZ2V0Rm9ybWF0VHlwZSgpLGluZGVudDp0aGlzLmdldEluZGVudCgpLHR5cGU6ImVsZW1lbnQiLHZlcnNpb246MX19aW5zZXJ0TmV3QWZ0ZXIoKXtyZXR1cm4gbnVsbH1jYW5JbmRlbnQoKXtyZXR1cm4hMH1jb2xsYXBzZUF0U3RhcnQoKXtyZXR1cm4hMX1leGNsdWRlRnJvbUNvcHkoKXtyZXR1cm4hMX1jYW5FeHRyYWN0Q29udGVudHMoKXtyZXR1cm4hMH1jYW5SZXBsYWNlV2l0aCgpe3JldHVybiEwfWNhbkluc2VydEFmdGVyKCl7cmV0dXJuITB9Y2FuQmVFbXB0eSgpe3JldHVybiEwfWNhbkluc2VydFRleHRCZWZvcmUoKXtyZXR1cm4hMH1jYW5JbnNlcnRUZXh0QWZ0ZXIoKXtyZXR1cm4hMH1pc0lubGluZSgpe3JldHVybiExfWlzU2hhZG93Um9vdCgpe3JldHVybiExfWNhbk1lcmdlV2l0aCgpe3JldHVybiExfWV4dHJhY3RXaXRoQ2hpbGQoKXtyZXR1cm4hMX19ZnVuY3Rpb24gQihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHVsfWZ1bmN0aW9uIFEwKGUsdCxuKXtmb3IoZT1lLmdldE5vZGUoKTtlOyl7bGV0IHI9ZS5fX2tleTtpZih0LmhhcyhyKSYmIW4uaGFzKHIpKXJldHVybiEwO2U9ZS5nZXRQYXJlbnQoKX1yZXR1cm4hMX1jbGFzcyBScyBleHRlbmRzIHVse3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuInJvb3QifXN0YXRpYyBjbG9uZSgpe3JldHVybiBuZXcgUnN9Y29uc3RydWN0b3IoKXtzdXBlcigicm9vdCIpLHRoaXMuX19jYWNoZWRUZXh0PW51bGx9Z2V0VG9wTGV2ZWxFbGVtZW50T3JUaHJvdygpe0goNTEpfWdldFRleHRDb250ZW50KCl7bGV0IHQ9dGhpcy5fX2NhY2hlZFRleHQ7cmV0dXJuIU5zKCkmJnB0KCkuX2RpcnR5VHlwZSE9PTB8fHQ9PT1udWxsP3N1cGVyLmdldFRleHRDb250ZW50KCk6dH1yZW1vdmUoKXtIKDUyKX1yZXBsYWNlKCl7SCg1Myl9aW5zZXJ0QmVmb3JlKCl7SCg1NCl9aW5zZXJ0QWZ0ZXIoKXtIKDU1KX11cGRhdGVET00oKXtyZXR1cm4hMX1hcHBlbmQoLi4udCl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2xldCByPXRbbl07QihyKXx8dHQocil8fEgoNTYpfXJldHVybiBzdXBlci5hcHBlbmQoLi4udCl9c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49WXIoKTtyZXR1cm4gbi5zZXRGb3JtYXQodC5mb3JtYXQpLG4uc2V0SW5kZW50KHQuaW5kZW50KSxuLnNldERpcmVjdGlvbih0LmRpcmVjdGlvbiksbn1leHBvcnRKU09OKCl7cmV0dXJue2NoaWxkcmVuOltdLGRpcmVjdGlvbjp0aGlzLmdldERpcmVjdGlvbigpLGZvcm1hdDp0aGlzLmdldEZvcm1hdFR5cGUoKSxpbmRlbnQ6dGhpcy5nZXRJbmRlbnQoKSx0eXBlOiJyb290Iix2ZXJzaW9uOjF9fWNvbGxhcHNlQXRTdGFydCgpe3JldHVybiEwfX1mdW5jdGlvbiBtbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFJzfWZ1bmN0aW9uIEZSKGUsdCl7aWYodD10LmdldEVkaXRvclN0YXRlKCkuX3NlbGVjdGlvbixlPWUuX3NlbGVjdGlvbixlIT09bnVsbCl7aWYoZS5kaXJ0eXx8IWUuaXModCkpcmV0dXJuITB9ZWxzZSBpZih0IT09bnVsbClyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBndigpe3JldHVybiBuZXcgTWYobmV3IE1hcChbWyJyb290IixuZXcgUnNdXSkpfWZ1bmN0aW9uIF9FKGUpe2xldCB0PWUuZXhwb3J0SlNPTigpO3ZhciBuPWUuY29uc3RydWN0b3I7dC50eXBlIT09bi5nZXRUeXBlKCkmJkgoMTMwLG4ubmFtZSk7bGV0IHI9dC5jaGlsZHJlbjtpZihCKGUpKWZvcihBcnJheS5pc0FycmF5KHIpfHxIKDU5LG4ubmFtZSksZT1lLmdldENoaWxkcmVuKCksbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgaT1fRShlW25dKTtyLnB1c2goaSl9cmV0dXJuIHR9Y2xhc3MgTWZ7Y29uc3RydWN0b3IodCxuKXt0aGlzLl9ub2RlTWFwPXQsdGhpcy5fc2VsZWN0aW9uPW58fG51bGwsdGhpcy5fcmVhZE9ubHk9dGhpcy5fZmx1c2hTeW5jPSExfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5fbm9kZU1hcC5zaXplPT09MSYmdGhpcy5fc2VsZWN0aW9uPT09bnVsbH1yZWFkKHQpe3JldHVybiBZMCh0aGlzLHQpfWNsb25lKHQpe3JldHVybiB0PW5ldyBNZih0aGlzLl9ub2RlTWFwLHQ9PT12b2lkIDA/dGhpcy5fc2VsZWN0aW9uOnQpLHQuX3JlYWRPbmx5PSEwLHR9dG9KU09OKCl7cmV0dXJuIFkwKHRoaXMsKCk9Pih7cm9vdDpfRShZcigpKX0pKX19Y2xhc3MgT3MgZXh0ZW5kcyB1bHtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJwYXJhZ3JhcGgifXN0YXRpYyBjbG9uZSh0KXtyZXR1cm4gbmV3IE9zKHQuX19rZXkpfWNyZWF0ZURPTSh0KXtsZXQgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7cmV0dXJuIHQ9JGEodC50aGVtZSwicGFyYWdyYXBoIiksdCE9PXZvaWQgMCYmbi5jbGFzc0xpc3QuYWRkKC4uLnQpLG59dXBkYXRlRE9NKCl7cmV0dXJuITF9c3RhdGljIGltcG9ydERPTSgpe3JldHVybntwOigpPT4oe2NvbnZlcnNpb246QlIscHJpb3JpdHk6MH0pfX1leHBvcnRET00odCl7aWYoe2VsZW1lbnQ6dH09c3VwZXIuZXhwb3J0RE9NKHQpLHQmJk5mKHQpKXt0aGlzLmlzRW1wdHkoKSYmdC5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKSk7dmFyIG49dGhpcy5nZXRGb3JtYXRUeXBlKCk7dC5zdHlsZS50ZXh0QWxpZ249biwobj10aGlzLmdldERpcmVjdGlvbigpKSYmKHQuZGlyPW4pLG49dGhpcy5nZXRJbmRlbnQoKSwwPG4mJih0LnN0eWxlLnRleHRJbmRlbnQ9YCR7MjAqbn1weGApfXJldHVybntlbGVtZW50OnR9fXN0YXRpYyBpbXBvcnRKU09OKHQpe2xldCBuPVlvKCk7cmV0dXJuIG4uc2V0Rm9ybWF0KHQuZm9ybWF0KSxuLnNldEluZGVudCh0LmluZGVudCksbi5zZXREaXJlY3Rpb24odC5kaXJlY3Rpb24pLG59ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksdHlwZToicGFyYWdyYXBoIix2ZXJzaW9uOjF9fWluc2VydE5ld0FmdGVyKHQsbil7dD1ZbygpO2xldCByPXRoaXMuZ2V0RGlyZWN0aW9uKCk7cmV0dXJuIHQuc2V0RGlyZWN0aW9uKHIpLHRoaXMuaW5zZXJ0QWZ0ZXIodCxuKSx0fWNvbGxhcHNlQXRTdGFydCgpe2xldCB0PXRoaXMuZ2V0Q2hpbGRyZW4oKTtpZih0Lmxlbmd0aD09PTB8fEoodFswXSkmJnRbMF0uZ2V0VGV4dENvbnRlbnQoKS50cmltKCk9PT0iIil7aWYodGhpcy5nZXROZXh0U2libGluZygpIT09bnVsbClyZXR1cm4gdGhpcy5zZWxlY3ROZXh0KCksdGhpcy5yZW1vdmUoKSwhMDtpZih0aGlzLmdldFByZXZpb3VzU2libGluZygpIT09bnVsbClyZXR1cm4gdGhpcy5zZWxlY3RQcmV2aW91cygpLHRoaXMucmVtb3ZlKCksITB9cmV0dXJuITF9fWZ1bmN0aW9uIEJSKGUpe2xldCB0PVlvKCk7cmV0dXJuIGUuc3R5bGUmJih0LnNldEZvcm1hdChlLnN0eWxlLnRleHRBbGlnbiksZT1wYXJzZUludChlLnN0eWxlLnRleHRJbmRlbnQsMTApLzIwLDA8ZSYmdC5zZXRJbmRlbnQoZSkpLHtub2RlOnR9fWZ1bmN0aW9uIFlvKCl7cmV0dXJuIGp1KG5ldyBPcyl9ZnVuY3Rpb24gd0UoZSx0LG4scil7bGV0IGk9ZS5fa2V5VG9ET01NYXA7aS5jbGVhcigpLGUuX2VkaXRvclN0YXRlPWd2KCksZS5fcGVuZGluZ0VkaXRvclN0YXRlPXIsZS5fY29tcG9zaXRpb25LZXk9bnVsbCxlLl9kaXJ0eVR5cGU9MCxlLl9jbG9uZU5vdE5lZWRlZC5jbGVhcigpLGUuX2RpcnR5TGVhdmVzPW5ldyBTZXQsZS5fZGlydHlFbGVtZW50cy5jbGVhcigpLGUuX25vcm1hbGl6ZWROb2Rlcz1uZXcgU2V0LGUuX3VwZGF0ZVRhZ3M9bmV3IFNldCxlLl91cGRhdGVzPVtdLGUuX2Jsb2NrQ3Vyc29yRWxlbWVudD1udWxsLHI9ZS5fb2JzZXJ2ZXIsciE9PW51bGwmJihyLmRpc2Nvbm5lY3QoKSxlLl9vYnNlcnZlcj1udWxsKSx0IT09bnVsbCYmKHQudGV4dENvbnRlbnQ9IiIpLG4hPT1udWxsJiYobi50ZXh0Q29udGVudD0iIixpLnNldCgicm9vdCIsbikpfWZ1bmN0aW9uIFVSKGUpe2xldCB0PW5ldyBNYXAsbj1uZXcgU2V0O3JldHVybiBlLmZvckVhY2gocj0+e2lmKHI9ci5rbGFzcy5pbXBvcnRET00hPW51bGw/ci5rbGFzcy5pbXBvcnRET00uYmluZChyLmtsYXNzKTpudWxsLHIhPW51bGwmJiFuLmhhcyhyKSl7bi5hZGQocik7dmFyIGk9cigpO2khPT1udWxsJiZPYmplY3Qua2V5cyhpKS5mb3JFYWNoKG89PntsZXQgbD10LmdldChvKTtsPT09dm9pZCAwJiYobD1bXSx0LnNldChvLGwpKSxsLnB1c2goaVtvXSl9KX19KSx0fWNsYXNzIFdSe2NvbnN0cnVjdG9yKHQsbixyLGksbyxsLHMpe3RoaXMuX3BhcmVudEVkaXRvcj1uLHRoaXMuX3Jvb3RFbGVtZW50PW51bGwsdGhpcy5fZWRpdG9yU3RhdGU9dCx0aGlzLl9jb21wb3NpdGlvbktleT10aGlzLl9wZW5kaW5nRWRpdG9yU3RhdGU9bnVsbCx0aGlzLl9kZWZlcnJlZD1bXSx0aGlzLl9rZXlUb0RPTU1hcD1uZXcgTWFwLHRoaXMuX3VwZGF0ZXM9W10sdGhpcy5fdXBkYXRpbmc9ITEsdGhpcy5fbGlzdGVuZXJzPXtkZWNvcmF0b3I6bmV3IFNldCxlZGl0YWJsZTpuZXcgU2V0LG11dGF0aW9uOm5ldyBNYXAscm9vdDpuZXcgU2V0LHRleHRjb250ZW50Om5ldyBTZXQsdXBkYXRlOm5ldyBTZXR9LHRoaXMuX2NvbW1hbmRzPW5ldyBNYXAsdGhpcy5fY29uZmlnPWksdGhpcy5fbm9kZXM9cix0aGlzLl9kZWNvcmF0b3JzPXt9LHRoaXMuX3BlbmRpbmdEZWNvcmF0b3JzPW51bGwsdGhpcy5fZGlydHlUeXBlPTAsdGhpcy5fY2xvbmVOb3ROZWVkZWQ9bmV3IFNldCx0aGlzLl9kaXJ0eUxlYXZlcz1uZXcgU2V0LHRoaXMuX2RpcnR5RWxlbWVudHM9bmV3IE1hcCx0aGlzLl9ub3JtYWxpemVkTm9kZXM9bmV3IFNldCx0aGlzLl91cGRhdGVUYWdzPW5ldyBTZXQsdGhpcy5fb2JzZXJ2ZXI9bnVsbCx0aGlzLl9rZXk9R1MoKSx0aGlzLl9vbkVycm9yPW8sdGhpcy5faHRtbENvbnZlcnNpb25zPWwsdGhpcy5fZWRpdGFibGU9cyx0aGlzLl9oZWFkbGVzcz1uIT09bnVsbCYmbi5faGVhZGxlc3MsdGhpcy5fYmxvY2tDdXJzb3JFbGVtZW50PXRoaXMuX3dpbmRvdz1udWxsfWlzQ29tcG9zaW5nKCl7cmV0dXJuIHRoaXMuX2NvbXBvc2l0aW9uS2V5IT1udWxsfXJlZ2lzdGVyVXBkYXRlTGlzdGVuZXIodCl7bGV0IG49dGhpcy5fbGlzdGVuZXJzLnVwZGF0ZTtyZXR1cm4gbi5hZGQodCksKCk9PntuLmRlbGV0ZSh0KX19cmVnaXN0ZXJFZGl0YWJsZUxpc3RlbmVyKHQpe2xldCBuPXRoaXMuX2xpc3RlbmVycy5lZGl0YWJsZTtyZXR1cm4gbi5hZGQodCksKCk9PntuLmRlbGV0ZSh0KX19cmVnaXN0ZXJEZWNvcmF0b3JMaXN0ZW5lcih0KXtsZXQgbj10aGlzLl9saXN0ZW5lcnMuZGVjb3JhdG9yO3JldHVybiBuLmFkZCh0KSwoKT0+e24uZGVsZXRlKHQpfX1yZWdpc3RlclRleHRDb250ZW50TGlzdGVuZXIodCl7bGV0IG49dGhpcy5fbGlzdGVuZXJzLnRleHRjb250ZW50O3JldHVybiBuLmFkZCh0KSwoKT0+e24uZGVsZXRlKHQpfX1yZWdpc3RlclJvb3RMaXN0ZW5lcih0KXtsZXQgbj10aGlzLl9saXN0ZW5lcnMucm9vdDtyZXR1cm4gdCh0aGlzLl9yb290RWxlbWVudCxudWxsKSxuLmFkZCh0KSwoKT0+e3QobnVsbCx0aGlzLl9yb290RWxlbWVudCksbi5kZWxldGUodCl9fXJlZ2lzdGVyQ29tbWFuZCh0LG4scil7cj09PXZvaWQgMCYmSCgzNSk7bGV0IGk9dGhpcy5fY29tbWFuZHM7aS5oYXModCl8fGkuc2V0KHQsW25ldyBTZXQsbmV3IFNldCxuZXcgU2V0LG5ldyBTZXQsbmV3IFNldF0pO2xldCBvPWkuZ2V0KHQpO289PT12b2lkIDAmJkgoMzYsU3RyaW5nKHQpKTtsZXQgbD1vW3JdO3JldHVybiBsLmFkZChuKSwoKT0+e2wuZGVsZXRlKG4pLG8uZXZlcnkocz0+cy5zaXplPT09MCkmJmkuZGVsZXRlKHQpfX1yZWdpc3Rlck11dGF0aW9uTGlzdGVuZXIodCxuKXt0aGlzLl9ub2Rlcy5nZXQodC5nZXRUeXBlKCkpPT09dm9pZCAwJiZIKDM3LHQubmFtZSk7bGV0IHI9dGhpcy5fbGlzdGVuZXJzLm11dGF0aW9uO3JldHVybiByLnNldChuLHQpLCgpPT57ci5kZWxldGUobil9fXJlZ2lzdGVyTm9kZVRyYW5zZm9ybVRvS2xhc3ModCxuKXt2YXIgcj10LmdldFR5cGUoKTtyZXR1cm4gcj10aGlzLl9ub2Rlcy5nZXQocikscj09PXZvaWQgMCYmSCgzNyx0Lm5hbWUpLHIudHJhbnNmb3Jtcy5hZGQobikscn1yZWdpc3Rlck5vZGVUcmFuc2Zvcm0odCxuKXt2YXIgcj10aGlzLnJlZ2lzdGVyTm9kZVRyYW5zZm9ybVRvS2xhc3ModCxuKTtsZXQgaT1bcl07cmV0dXJuIHI9ci5yZXBsYWNlV2l0aEtsYXNzLHIhPW51bGwmJihyPXRoaXMucmVnaXN0ZXJOb2RlVHJhbnNmb3JtVG9LbGFzcyhyLG4pLGkucHVzaChyKSksdlIodGhpcyx0LmdldFR5cGUoKSksKCk9PntpLmZvckVhY2gobz0+by50cmFuc2Zvcm1zLmRlbGV0ZShuKSl9fWhhc05vZGUodCl7cmV0dXJuIHRoaXMuX25vZGVzLmhhcyh0LmdldFR5cGUoKSl9aGFzTm9kZXModCl7cmV0dXJuIHQuZXZlcnkodGhpcy5oYXNOb2RlLmJpbmQodGhpcykpfWRpc3BhdGNoQ29tbWFuZCh0LG4pe3JldHVybiBYKHRoaXMsdCxuKX1nZXREZWNvcmF0b3JzKCl7cmV0dXJuIHRoaXMuX2RlY29yYXRvcnN9Z2V0Um9vdEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fcm9vdEVsZW1lbnR9Z2V0S2V5KCl7cmV0dXJuIHRoaXMuX2tleX1zZXRSb290RWxlbWVudCh0KXtsZXQgbj10aGlzLl9yb290RWxlbWVudDtpZih0IT09bil7bGV0IGw9JGEodGhpcy5fY29uZmlnLnRoZW1lLCJyb290Iik7dmFyIHI9dGhpcy5fcGVuZGluZ0VkaXRvclN0YXRlfHx0aGlzLl9lZGl0b3JTdGF0ZTtpZih0aGlzLl9yb290RWxlbWVudD10LHdFKHRoaXMsbix0LHIpLG4hPT1udWxsKXtpZighdGhpcy5fY29uZmlnLmRpc2FibGVFdmVudHMpe2JhIT09MCYmKGJhLS0sYmE9PT0wJiZuLm93bmVyRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIixmRSkpO3ZhciBpPW4uX19sZXhpY2FsRWRpdG9yO2lmKGkhPW51bGwpe2lmKGkuX3BhcmVudEVkaXRvciE9PW51bGwpe3ZhciBvPWF2KGkpO289b1tvLmxlbmd0aC0xXS5fa2V5LFhsLmdldChvKT09PWkmJlhsLmRlbGV0ZShvKX1lbHNlIFhsLmRlbGV0ZShpLl9rZXkpO24uX19sZXhpY2FsRWRpdG9yPW51bGx9Zm9yKGk9ZEUobiksbz0wO288aS5sZW5ndGg7bysrKWlbb10oKTtuLl9fbGV4aWNhbEV2ZW50SGFuZGxlcz1bXX1sIT1udWxsJiZuLmNsYXNzTGlzdC5yZW1vdmUoLi4ubCl9dCE9PW51bGw/KHI9KHI9dC5vd25lckRvY3VtZW50KSYmci5kZWZhdWx0Vmlld3x8bnVsbCxpPXQuc3R5bGUsaS51c2VyU2VsZWN0PSJ0ZXh0IixpLndoaXRlU3BhY2U9InByZS13cmFwIixpLndvcmRCcmVhaz0iYnJlYWstd29yZCIsdC5zZXRBdHRyaWJ1dGUoImRhdGEtbGV4aWNhbC1lZGl0b3IiLCJ0cnVlIiksdGhpcy5fd2luZG93PXIsdGhpcy5fZGlydHlUeXBlPTIsRlModGhpcyksdGhpcy5fdXBkYXRlVGFncy5hZGQoImhpc3RvcnktbWVyZ2UiKSxCbyh0aGlzKSx0aGlzLl9jb25maWcuZGlzYWJsZUV2ZW50c3x8TlIodCx0aGlzKSxsIT1udWxsJiZ0LmNsYXNzTGlzdC5hZGQoLi4ubCkpOih0aGlzLl9lZGl0b3JTdGF0ZT1yLHRoaXMuX3dpbmRvdz10aGlzLl9wZW5kaW5nRWRpdG9yU3RhdGU9bnVsbCksTmEoInJvb3QiLHRoaXMsITEsdCxuKX19Z2V0RWxlbWVudEJ5S2V5KHQpe3JldHVybiB0aGlzLl9rZXlUb0RPTU1hcC5nZXQodCl8fG51bGx9Z2V0RWRpdG9yU3RhdGUoKXtyZXR1cm4gdGhpcy5fZWRpdG9yU3RhdGV9c2V0RWRpdG9yU3RhdGUodCxuKXt0LmlzRW1wdHkoKSYmSCgzOCkselModGhpcyk7bGV0IHI9dGhpcy5fcGVuZGluZ0VkaXRvclN0YXRlLGk9dGhpcy5fdXBkYXRlVGFncztuPW4hPT12b2lkIDA/bi50YWc6bnVsbCxyPT09bnVsbHx8ci5pc0VtcHR5KCl8fChuIT1udWxsJiZpLmFkZChuKSxCbyh0aGlzKSksdGhpcy5fcGVuZGluZ0VkaXRvclN0YXRlPXQsdGhpcy5fZGlydHlUeXBlPTIsdGhpcy5fZGlydHlFbGVtZW50cy5zZXQoInJvb3QiLCExKSx0aGlzLl9jb21wb3NpdGlvbktleT1udWxsLG4hPW51bGwmJmkuYWRkKG4pLEJvKHRoaXMpfXBhcnNlRWRpdG9yU3RhdGUodCxuKXt0PXR5cGVvZiB0PT0ic3RyaW5nIj9KU09OLnBhcnNlKHQpOnQ7bGV0IHI9Z3YoKSxpPWp0LG89T24sbD16dCxzPXRoaXMuX2RpcnR5RWxlbWVudHMsYT10aGlzLl9kaXJ0eUxlYXZlcyx1PXRoaXMuX2Nsb25lTm90TmVlZGVkLGM9dGhpcy5fZGlydHlUeXBlO3RoaXMuX2RpcnR5RWxlbWVudHM9bmV3IE1hcCx0aGlzLl9kaXJ0eUxlYXZlcz1uZXcgU2V0LHRoaXMuX2Nsb25lTm90TmVlZGVkPW5ldyBTZXQsdGhpcy5fZGlydHlUeXBlPTAsanQ9cixPbj0hMSx6dD10aGlzO3RyeXttdih0LnJvb3QsdGhpcy5fbm9kZXMpLG4mJm4oKSxyLl9yZWFkT25seT0hMH1jYXRjaChkKXtkIGluc3RhbmNlb2YgRXJyb3ImJnRoaXMuX29uRXJyb3IoZCl9ZmluYWxseXt0aGlzLl9kaXJ0eUVsZW1lbnRzPXMsdGhpcy5fZGlydHlMZWF2ZXM9YSx0aGlzLl9jbG9uZU5vdE5lZWRlZD11LHRoaXMuX2RpcnR5VHlwZT1jLGp0PWksT249byx6dD1sfXJldHVybiByfXVwZGF0ZSh0LG4pe1duKHRoaXMsdCxuKX1mb2N1cyh0LG49e30pe2xldCByPXRoaXMuX3Jvb3RFbGVtZW50O3IhPT1udWxsJiYoci5zZXRBdHRyaWJ1dGUoImF1dG9jYXBpdGFsaXplIiwib2ZmIiksV24odGhpcywoKT0+e2xldCBpPXJ0KCksbz1ZcigpO2khPT1udWxsP2kuZGlydHk9ITA6by5nZXRDaGlsZHJlblNpemUoKSE9PTAmJihuLmRlZmF1bHRTZWxlY3Rpb249PT0icm9vdFN0YXJ0Ij9vLnNlbGVjdFN0YXJ0KCk6by5zZWxlY3RFbmQoKSl9LHtvblVwZGF0ZTooKT0+e3IucmVtb3ZlQXR0cmlidXRlKCJhdXRvY2FwaXRhbGl6ZSIpLHQmJnQoKX0sdGFnOiJmb2N1cyJ9KSx0aGlzLl9wZW5kaW5nRWRpdG9yU3RhdGU9PT1udWxsJiZyLnJlbW92ZUF0dHJpYnV0ZSgiYXV0b2NhcGl0YWxpemUiKSl9Ymx1cigpe3ZhciB0PXRoaXMuX3Jvb3RFbGVtZW50O3QhPT1udWxsJiZ0LmJsdXIoKSx0PVhyKHRoaXMuX3dpbmRvdyksdCE9PW51bGwmJnQucmVtb3ZlQWxsUmFuZ2VzKCl9aXNFZGl0YWJsZSgpe3JldHVybiB0aGlzLl9lZGl0YWJsZX1zZXRFZGl0YWJsZSh0KXt0aGlzLl9lZGl0YWJsZSE9PXQmJih0aGlzLl9lZGl0YWJsZT10LE5hKCJlZGl0YWJsZSIsdGhpcywhMCx0KSl9dG9KU09OKCl7cmV0dXJue2VkaXRvclN0YXRlOnRoaXMuX2VkaXRvclN0YXRlLnRvSlNPTigpfX19Y2xhc3MgdnYgZXh0ZW5kcyB1bHtjb25zdHJ1Y3Rvcih0LG4pe3N1cGVyKG4pLHRoaXMuX19jb2xTcGFuPXQsdGhpcy5fX3Jvd1NwYW49MX1leHBvcnRKU09OKCl7cmV0dXJuey4uLnN1cGVyLmV4cG9ydEpTT04oKSxjb2xTcGFuOnRoaXMuX19jb2xTcGFuLHJvd1NwYW46dGhpcy5fX3Jvd1NwYW59fWdldENvbFNwYW4oKXtyZXR1cm4gdGhpcy5fX2NvbFNwYW59c2V0Q29sU3Bhbih0KXtyZXR1cm4gdGhpcy5nZXRXcml0YWJsZSgpLl9fY29sU3Bhbj10LHRoaXN9Z2V0Um93U3Bhbigpe3JldHVybiB0aGlzLl9fcm93U3Bhbn1zZXRSb3dTcGFuKHQpe3JldHVybiB0aGlzLmdldFdyaXRhYmxlKCkuX19yb3dTcGFuPXQsdGhpc319ZnVuY3Rpb24gUW4oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiB2dn1jbGFzcyBTRSBleHRlbmRzIHVse31mdW5jdGlvbiB5dihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFNFfWNsYXNzIEVFIGV4dGVuZHMgdWx7fWZ1bmN0aW9uIHV1KGUpe3JldHVybiBlIGluc3RhbmNlb2YgRUV9TC4kYWRkVXBkYXRlVGFnPWZ1bmN0aW9uKGUpe2huKCkscHQoKS5fdXBkYXRlVGFncy5hZGQoZSl9O0wuJGFwcGx5Tm9kZVJlcGxhY2VtZW50PWp1O0wuJGNvcHlOb2RlPVFTO0wuJGNyZWF0ZUxpbmVCcmVha05vZGU9ZHM7TC4kY3JlYXRlTm9kZVNlbGVjdGlvbj15bTtMLiRjcmVhdGVQYXJhZ3JhcGhOb2RlPVlvO0wuJGNyZWF0ZVJhbmdlU2VsZWN0aW9uPWZ1bmN0aW9uKCl7bGV0IGU9bmV3IFZyKCJyb290IiwwLCJlbGVtZW50IiksdD1uZXcgVnIoInJvb3QiLDAsImVsZW1lbnQiKTtyZXR1cm4gbmV3IGFsKGUsdCwwLCIiKX07TC4kY3JlYXRlVGFiTm9kZT1PZjtMLiRjcmVhdGVUZXh0Tm9kZT1EdDtMLiRnZXRBZGphY2VudE5vZGU9cm07TC4kZ2V0TmVhcmVzdE5vZGVGcm9tRE9NTm9kZT1JdTtMLiRnZXROZWFyZXN0Um9vdE9yU2hhZG93Um9vdD1YUztMLiRnZXROb2RlQnlLZXk9SXQ7TC4kZ2V0UHJldmlvdXNTZWxlY3Rpb249VHM7TC4kZ2V0Um9vdD1ZcjtMLiRnZXRTZWxlY3Rpb249cnQ7TC4kZ2V0VGV4dENvbnRlbnQ9ZnVuY3Rpb24oKXtsZXQgZT1ydCgpO3JldHVybiBlPT09bnVsbD8iIjplLmdldFRleHRDb250ZW50KCl9O0wuJGhhc0FuY2VzdG9yPWJkO0wuJGhhc1VwZGF0ZVRhZz1mdW5jdGlvbihlKXtyZXR1cm4gcHQoKS5fdXBkYXRlVGFncy5oYXMoZSl9O0wuJGluc2VydE5vZGVzPWZ1bmN0aW9uKGUsdCl7bGV0IG49cnQoKXx8VHMoKTtyZXR1cm4gbj09PW51bGwmJihuPVlyKCkuc2VsZWN0RW5kKCkpLG4uaW5zZXJ0Tm9kZXMoZSx0KX07TC4kaXNCbG9ja0VsZW1lbnROb2RlPXZtO0wuJGlzRGVjb3JhdG9yTm9kZT10dDtMLiRpc0VsZW1lbnROb2RlPUI7TC4kaXNJbmxpbmVFbGVtZW50T3JEZWNvcmF0b3JOb2RlPWZ1bmN0aW9uKGUpe3JldHVybiBCKGUpJiZlLmlzSW5saW5lKCl8fHR0KGUpJiZlLmlzSW5saW5lKCl9O0wuJGlzTGVhZk5vZGU9V1M7TC4kaXNMaW5lQnJlYWtOb2RlPXN1O0wuJGlzTm9kZVNlbGVjdGlvbj1icztMLiRpc1BhcmFncmFwaE5vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBPc307TC4kaXNSYW5nZVNlbGVjdGlvbj1tZTtMLiRpc1Jvb3ROb2RlPW1uO0wuJGlzUm9vdE9yU2hhZG93Um9vdD14cjtMLiRpc1RhYk5vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiAkc307TC4kaXNUZXh0Tm9kZT1KO0wuJG5vZGVzT2ZUeXBlPWZ1bmN0aW9uKGUpe3ZhciB0PVFyKCk7bGV0IG49dC5fcmVhZE9ubHkscj1lLmdldFR5cGUoKTt0PXQuX25vZGVNYXA7bGV0IGk9W107Zm9yKGxldFssb11vZiB0KW8gaW5zdGFuY2VvZiBlJiZvLl9fdHlwZT09PXImJihufHxvLmlzQXR0YWNoZWQoKSkmJmkucHVzaChvKTtyZXR1cm4gaX07TC4kbm9ybWFsaXplU2VsZWN0aW9uX19FWFBFUklNRU5UQUw9b3Y7TC4kcGFyc2VTZXJpYWxpemVkTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gbXYoZSxwdCgpLl9ub2Rlcyl9O0wuJHNlbGVjdEFsbD1mdW5jdGlvbigpe3ZhciBlPVlyKCk7ZT1lLnNlbGVjdCgwLGUuZ2V0Q2hpbGRyZW5TaXplKCkpLFdyKG92KGUpKX07TC4kc2V0Q29tcG9zaXRpb25LZXk9S3Q7TC4kc2V0U2VsZWN0aW9uPVdyO0wuJHNwbGl0Tm9kZT1KUztMLkJMVVJfQ09NTUFORD1MUztMLkNBTl9SRURPX0NPTU1BTkQ9e307TC5DQU5fVU5ET19DT01NQU5EPXt9O0wuQ0xFQVJfRURJVE9SX0NPTU1BTkQ9e307TC5DTEVBUl9ISVNUT1JZX0NPTU1BTkQ9e307TC5DTElDS19DT01NQU5EPXlTO0wuQ09NTUFORF9QUklPUklUWV9DUklUSUNBTD00O0wuQ09NTUFORF9QUklPUklUWV9FRElUT1I9MDtMLkNPTU1BTkRfUFJJT1JJVFlfSElHSD0zO0wuQ09NTUFORF9QUklPUklUWV9MT1c9MTtMLkNPTU1BTkRfUFJJT1JJVFlfTk9STUFMPTI7TC5DT05UUk9MTEVEX1RFWFRfSU5TRVJUSU9OX0NPTU1BTkQ9WWw7TC5DT1BZX0NPTU1BTkQ9ZXY7TC5DVVRfQ09NTUFORD10djtMLkRFTEVURV9DSEFSQUNURVJfQ09NTUFORD10dTtMLkRFTEVURV9MSU5FX0NPTU1BTkQ9cnU7TC5ERUxFVEVfV09SRF9DT01NQU5EPW51O0wuREVQUkVDQVRFRF8kY29tcHV0ZUdyaWRNYXA9Z0U7TC5ERVBSRUNBVEVEXyRjcmVhdGVHcmlkU2VsZWN0aW9uPWZ1bmN0aW9uKCl7bGV0IGU9bmV3IFZyKCJyb290IiwwLCJlbGVtZW50IiksdD1uZXcgVnIoInJvb3QiLDAsImVsZW1lbnQiKTtyZXR1cm4gbmV3IEFmKCJyb290IixlLHQpfTtMLkRFUFJFQ0FURURfJGdldEdyaWRDZWxsTm9kZVJlY3Q9Z207TC5ERVBSRUNBVEVEXyRnZXROb2RlVHJpcGxldD12RTtMLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlPVFuO0wuREVQUkVDQVRFRF8kaXNHcmlkTm9kZT15djtMLkRFUFJFQ0FURURfJGlzR3JpZFJvd05vZGU9dXU7TC5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb249aHY7TC5ERVBSRUNBVEVEX0dyaWRDZWxsTm9kZT12djtMLkRFUFJFQ0FURURfR3JpZE5vZGU9U0U7TC5ERVBSRUNBVEVEX0dyaWRSb3dOb2RlPUVFO0wuRFJBR0VORF9DT01NQU5EPU1TO0wuRFJBR09WRVJfQ09NTUFORD1BUztMLkRSQUdTVEFSVF9DT01NQU5EPVBTO0wuRFJPUF9DT01NQU5EPU9TO0wuRGVjb3JhdG9yTm9kZT14RTtMLkVsZW1lbnROb2RlPXVsO0wuRk9DVVNfQ09NTUFORD1EUztMLkZPUk1BVF9FTEVNRU5UX0NPTU1BTkQ9e307TC5GT1JNQVRfVEVYVF9DT01NQU5EPVVpO0wuSU5ERU5UX0NPTlRFTlRfQ09NTUFORD17fTtMLklOU0VSVF9MSU5FX0JSRUFLX0NPTU1BTkQ9a2E7TC5JTlNFUlRfUEFSQUdSQVBIX0NPTU1BTkQ9SnA7TC5JTlNFUlRfVEFCX0NPTU1BTkQ9e307TC5LRVlfQVJST1dfRE9XTl9DT01NQU5EPWtTO0wuS0VZX0FSUk9XX0xFRlRfQ09NTUFORD1TUztMLktFWV9BUlJPV19SSUdIVF9DT01NQU5EPV9TO0wuS0VZX0FSUk9XX1VQX0NPTU1BTkQ9Q1M7TC5LRVlfQkFDS1NQQUNFX0NPTU1BTkQ9YlM7TC5LRVlfREVMRVRFX0NPTU1BTkQ9TlM7TC5LRVlfRE9XTl9DT01NQU5EPXhTO0wuS0VZX0VOVEVSX0NPTU1BTkQ9d2Q7TC5LRVlfRVNDQVBFX0NPTU1BTkQ9VFM7TC5LRVlfTU9ESUZJRVJfQ09NTUFORD1JUztMLktFWV9TUEFDRV9DT01NQU5EPSRTO0wuS0VZX1RBQl9DT01NQU5EPVJTO0wuTGluZUJyZWFrTm9kZT1rcztMLk1PVkVfVE9fRU5EPXdTO0wuTU9WRV9UT19TVEFSVD1FUztMLk9VVERFTlRfQ09OVEVOVF9DT01NQU5EPXt9O0wuUEFTVEVfQ09NTUFORD1RZztMLlBhcmFncmFwaE5vZGU9T3M7TC5SRURPX0NPTU1BTkQ9cWc7TC5SRU1PVkVfVEVYVF9DT01NQU5EPXFwO0wuUm9vdE5vZGU9UnM7TC5TRUxFQ1RJT05fQ0hBTkdFX0NPTU1BTkQ9Q2Y7TC5TRUxFQ1RfQUxMX0NPTU1BTkQ9ZW07TC5UYWJOb2RlPSRzO0wuVGV4dE5vZGU9c2w7TC5VTkRPX0NPTU1BTkQ9Smc7TC5jcmVhdGVDb21tYW5kPWZ1bmN0aW9uKCl7cmV0dXJue319O0wuY3JlYXRlRWRpdG9yPWZ1bmN0aW9uKGUpe3ZhciB0PWV8fHt9LG49enQscj10LnRoZW1lfHx7fTtsZXQgaT1lPT09dm9pZCAwP246dC5wYXJlbnRFZGl0b3J8fG51bGwsbz10LmRpc2FibGVFdmVudHN8fCExLGw9Z3YoKSxzPXQubmFtZXNwYWNlfHwoaSE9PW51bGw/aS5fY29uZmlnLm5hbWVzcGFjZTpHUygpKSxhPXQuZWRpdG9yU3RhdGUsdT1bUnMsc2wsa3MsJHMsT3MsLi4udC5ub2Rlc3x8W11dLGM9dC5vbkVycm9yO2lmKHQ9dC5lZGl0YWJsZSE9PXZvaWQgMD90LmVkaXRhYmxlOiEwLGU9PT12b2lkIDAmJm4hPT1udWxsKWU9bi5fbm9kZXM7ZWxzZSBmb3IoZT1uZXcgTWFwLG49MDtuPHUubGVuZ3RoO24rKyl7bGV0IGY9dVtuXSxoPW51bGw7dmFyIGQ9bnVsbDt0eXBlb2YgZiE9ImZ1bmN0aW9uIiYmKGQ9ZixmPWQucmVwbGFjZSxoPWQud2l0aCxkPWQud2l0aEtsYXNzP2Qud2l0aEtsYXNzOm51bGwpO2xldCBtPWYuZ2V0VHlwZSgpLGc9Zi50cmFuc2Zvcm0oKSx3PW5ldyBTZXQ7ZyE9PW51bGwmJncuYWRkKGcpLGUuc2V0KG0se2tsYXNzOmYscmVwbGFjZTpoLHJlcGxhY2VXaXRoS2xhc3M6ZCx0cmFuc2Zvcm1zOnd9KX1yZXR1cm4gcj1uZXcgV1IobCxpLGUse2Rpc2FibGVFdmVudHM6byxuYW1lc3BhY2U6cyx0aGVtZTpyfSxjfHxjb25zb2xlLmVycm9yLFVSKGUpLHQpLGEhPT12b2lkIDAmJihyLl9wZW5kaW5nRWRpdG9yU3RhdGU9YSxyLl9kaXJ0eVR5cGU9Mikscn07TC5nZXROZWFyZXN0RWRpdG9yRnJvbURPTU5vZGU9c3Y7TC5pc0hUTUxBbmNob3JFbGVtZW50PWZ1bmN0aW9uKGUpe3JldHVybiBOZihlKSYmZS50YWdOYW1lPT09IkEifTtMLmlzSFRNTEVsZW1lbnQ9TmY7TC5pc1NlbGVjdGlvbkNhcHR1cmVkSW5EZWNvcmF0b3JJbnB1dD1sdjtMLmlzU2VsZWN0aW9uV2l0aGluRWRpdG9yPUx1O2NvbnN0IFZSPUw7dmFyIHhlPVZSO2Z1bmN0aW9uIHh2KCl7cmV0dXJue2FzeW5jOiExLGJyZWFrczohMSxleHRlbnNpb25zOm51bGwsZ2ZtOiEwLGhvb2tzOm51bGwscGVkYW50aWM6ITEscmVuZGVyZXI6bnVsbCxzaWxlbnQ6ITEsdG9rZW5pemVyOm51bGwsd2Fsa1Rva2VuczpudWxsfX1sZXQgY2w9eHYoKTtmdW5jdGlvbiBDRShlKXtjbD1lfWNvbnN0IGtFPS9bJjw+IiddLyxIUj1uZXcgUmVnRXhwKGtFLnNvdXJjZSwiZyIpLCRFPS9bPD4iJ118Jig/ISgjXGR7MSw3fXwjW1h4XVthLWZBLUYwLTldezEsNn18XHcrKTspLyxLUj1uZXcgUmVnRXhwKCRFLnNvdXJjZSwiZyIpLFpSPXsiJiI6IiZhbXA7IiwiPCI6IiZsdDsiLCI+IjoiJmd0OyIsJyInOiImcXVvdDsiLCInIjoiJiMzOTsifSxKMD1lPT5aUltlXTtmdW5jdGlvbiBNbihlLHQpe2lmKHQpe2lmKGtFLnRlc3QoZSkpcmV0dXJuIGUucmVwbGFjZShIUixKMCl9ZWxzZSBpZigkRS50ZXN0KGUpKXJldHVybiBlLnJlcGxhY2UoS1IsSjApO3JldHVybiBlfWNvbnN0IEdSPS8mKCMoPzpcZCspfCg/OiN4WzAtOUEtRmEtZl0rKXwoPzpcdyspKTs/L2lnO2Z1bmN0aW9uIFlSKGUpe3JldHVybiBlLnJlcGxhY2UoR1IsKHQsbik9PihuPW4udG9Mb3dlckNhc2UoKSxuPT09ImNvbG9uIj8iOiI6bi5jaGFyQXQoMCk9PT0iIyI/bi5jaGFyQXQoMSk9PT0ieCI/U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChuLnN1YnN0cmluZygyKSwxNikpOlN0cmluZy5mcm9tQ2hhckNvZGUoK24uc3Vic3RyaW5nKDEpKToiIikpfWNvbnN0IFhSPS8oXnxbXlxbXSlcXi9nO2Z1bmN0aW9uIEJlKGUsdCl7ZT10eXBlb2YgZT09InN0cmluZyI/ZTplLnNvdXJjZSx0PXR8fCIiO2NvbnN0IG49e3JlcGxhY2U6KHIsaSk9PihpPXR5cGVvZiBpPT0ib2JqZWN0IiYmInNvdXJjZSJpbiBpP2kuc291cmNlOmksaT1pLnJlcGxhY2UoWFIsIiQxIiksZT1lLnJlcGxhY2UocixpKSxuKSxnZXRSZWdleDooKT0+bmV3IFJlZ0V4cChlLHQpfTtyZXR1cm4gbn1mdW5jdGlvbiBxMChlKXt0cnl7ZT1lbmNvZGVVUkkoZSkucmVwbGFjZSgvJTI1L2csIiUiKX1jYXRjaHtyZXR1cm4gbnVsbH1yZXR1cm4gZX1jb25zdCBQZD17ZXhlYzooKT0+bnVsbH07ZnVuY3Rpb24gZXgoZSx0KXtjb25zdCBuPWUucmVwbGFjZSgvXHwvZywobyxsLHMpPT57bGV0IGE9ITEsdT1sO2Zvcig7LS11Pj0wJiZzW3VdPT09IlxcIjspYT0hYTtyZXR1cm4gYT8ifCI6IiB8In0pLHI9bi5zcGxpdCgvIFx8Lyk7bGV0IGk9MDtpZihyWzBdLnRyaW0oKXx8ci5zaGlmdCgpLHIubGVuZ3RoPjAmJiFyW3IubGVuZ3RoLTFdLnRyaW0oKSYmci5wb3AoKSx0KWlmKHIubGVuZ3RoPnQpci5zcGxpY2UodCk7ZWxzZSBmb3IoO3IubGVuZ3RoPHQ7KXIucHVzaCgiIik7Zm9yKDtpPHIubGVuZ3RoO2krKylyW2ldPXJbaV0udHJpbSgpLnJlcGxhY2UoL1xcXHwvZywifCIpO3JldHVybiByfWZ1bmN0aW9uIGdjKGUsdCxuKXtjb25zdCByPWUubGVuZ3RoO2lmKHI9PT0wKXJldHVybiIiO2xldCBpPTA7Zm9yKDtpPHI7KXtjb25zdCBvPWUuY2hhckF0KHItaS0xKTtpZihvPT09dCYmIW4paSsrO2Vsc2UgaWYobyE9PXQmJm4paSsrO2Vsc2UgYnJlYWt9cmV0dXJuIGUuc2xpY2UoMCxyLWkpfWZ1bmN0aW9uIFFSKGUsdCl7aWYoZS5pbmRleE9mKHRbMV0pPT09LTEpcmV0dXJuLTE7bGV0IG49MDtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKylpZihlW3JdPT09IlxcIilyKys7ZWxzZSBpZihlW3JdPT09dFswXSluKys7ZWxzZSBpZihlW3JdPT09dFsxXSYmKG4tLSxuPDApKXJldHVybiByO3JldHVybi0xfWZ1bmN0aW9uIHR4KGUsdCxuLHIpe2NvbnN0IGk9dC5ocmVmLG89dC50aXRsZT9Nbih0LnRpdGxlKTpudWxsLGw9ZVsxXS5yZXBsYWNlKC9cXChbXFtcXV0pL2csIiQxIik7aWYoZVswXS5jaGFyQXQoMCkhPT0iISIpe3Iuc3RhdGUuaW5MaW5rPSEwO2NvbnN0IHM9e3R5cGU6ImxpbmsiLHJhdzpuLGhyZWY6aSx0aXRsZTpvLHRleHQ6bCx0b2tlbnM6ci5pbmxpbmVUb2tlbnMobCl9O3JldHVybiByLnN0YXRlLmluTGluaz0hMSxzfXJldHVybnt0eXBlOiJpbWFnZSIscmF3Om4saHJlZjppLHRpdGxlOm8sdGV4dDpNbihsKX19ZnVuY3Rpb24gSlIoZSx0KXtjb25zdCBuPWUubWF0Y2goL14oXHMrKSg/OmBgYCkvKTtpZihuPT09bnVsbClyZXR1cm4gdDtjb25zdCByPW5bMV07cmV0dXJuIHQuc3BsaXQoYApgKS5tYXAoaT0+e2NvbnN0IG89aS5tYXRjaCgvXlxzKy8pO2lmKG89PT1udWxsKXJldHVybiBpO2NvbnN0W2xdPW87cmV0dXJuIGwubGVuZ3RoPj1yLmxlbmd0aD9pLnNsaWNlKHIubGVuZ3RoKTppfSkuam9pbihgCmApfWNsYXNzIEFke2NvbnN0cnVjdG9yKHQpe0plKHRoaXMsIm9wdGlvbnMiKTtKZSh0aGlzLCJydWxlcyIpO0plKHRoaXMsImxleGVyIik7dGhpcy5vcHRpb25zPXR8fGNsfXNwYWNlKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5uZXdsaW5lLmV4ZWModCk7aWYobiYmblswXS5sZW5ndGg+MClyZXR1cm57dHlwZToic3BhY2UiLHJhdzpuWzBdfX1jb2RlKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5jb2RlLmV4ZWModCk7aWYobil7Y29uc3Qgcj1uWzBdLnJlcGxhY2UoL14gezEsNH0vZ20sIiIpO3JldHVybnt0eXBlOiJjb2RlIixyYXc6blswXSxjb2RlQmxvY2tTdHlsZToiaW5kZW50ZWQiLHRleHQ6dGhpcy5vcHRpb25zLnBlZGFudGljP3I6Z2MocixgCmApfX19ZmVuY2VzKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5mZW5jZXMuZXhlYyh0KTtpZihuKXtjb25zdCByPW5bMF0saT1KUihyLG5bM118fCIiKTtyZXR1cm57dHlwZToiY29kZSIscmF3OnIsbGFuZzpuWzJdP25bMl0udHJpbSgpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuX2VzY2FwZXMsIiQxIik6blsyXSx0ZXh0Oml9fX1oZWFkaW5nKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5oZWFkaW5nLmV4ZWModCk7aWYobil7bGV0IHI9blsyXS50cmltKCk7aWYoLyMkLy50ZXN0KHIpKXtjb25zdCBpPWdjKHIsIiMiKTsodGhpcy5vcHRpb25zLnBlZGFudGljfHwhaXx8LyAkLy50ZXN0KGkpKSYmKHI9aS50cmltKCkpfXJldHVybnt0eXBlOiJoZWFkaW5nIixyYXc6blswXSxkZXB0aDpuWzFdLmxlbmd0aCx0ZXh0OnIsdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKHIpfX19aHIodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmhyLmV4ZWModCk7aWYobilyZXR1cm57dHlwZToiaHIiLHJhdzpuWzBdfX1ibG9ja3F1b3RlKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5ibG9ja3F1b3RlLmV4ZWModCk7aWYobil7Y29uc3Qgcj1nYyhuWzBdLnJlcGxhY2UoL14gKj5bIFx0XT8vZ20sIiIpLGAKYCksaT10aGlzLmxleGVyLnN0YXRlLnRvcDt0aGlzLmxleGVyLnN0YXRlLnRvcD0hMDtjb25zdCBvPXRoaXMubGV4ZXIuYmxvY2tUb2tlbnMocik7cmV0dXJuIHRoaXMubGV4ZXIuc3RhdGUudG9wPWkse3R5cGU6ImJsb2NrcXVvdGUiLHJhdzpuWzBdLHRva2VuczpvLHRleHQ6cn19fWxpc3QodCl7bGV0IG49dGhpcy5ydWxlcy5ibG9jay5saXN0LmV4ZWModCk7aWYobil7bGV0IHI9blsxXS50cmltKCk7Y29uc3QgaT1yLmxlbmd0aD4xLG89e3R5cGU6Imxpc3QiLHJhdzoiIixvcmRlcmVkOmksc3RhcnQ6aT8rci5zbGljZSgwLC0xKToiIixsb29zZTohMSxpdGVtczpbXX07cj1pP2BcXGR7MSw5fVxcJHtyLnNsaWNlKC0xKX1gOmBcXCR7cn1gLHRoaXMub3B0aW9ucy5wZWRhbnRpYyYmKHI9aT9yOiJbKistXSIpO2NvbnN0IGw9bmV3IFJlZ0V4cChgXiggezAsM30ke3J9KSgoPzpbCSBdW15cXG5dKik/KD86XFxufCQpKWApO2xldCBzPSIiLGE9IiIsdT0hMTtmb3IoO3Q7KXtsZXQgYz0hMTtpZighKG49bC5leGVjKHQpKXx8dGhpcy5ydWxlcy5ibG9jay5oci50ZXN0KHQpKWJyZWFrO3M9blswXSx0PXQuc3Vic3RyaW5nKHMubGVuZ3RoKTtsZXQgZD1uWzJdLnNwbGl0KGAKYCwxKVswXS5yZXBsYWNlKC9eXHQrLyx2PT4iICIucmVwZWF0KDMqdi5sZW5ndGgpKSxmPXQuc3BsaXQoYApgLDEpWzBdLGg9MDt0aGlzLm9wdGlvbnMucGVkYW50aWM/KGg9MixhPWQudHJpbVN0YXJ0KCkpOihoPW5bMl0uc2VhcmNoKC9bXiBdLyksaD1oPjQ/MTpoLGE9ZC5zbGljZShoKSxoKz1uWzFdLmxlbmd0aCk7bGV0IG09ITE7aWYoIWQmJi9eICokLy50ZXN0KGYpJiYocys9ZitgCmAsdD10LnN1YnN0cmluZyhmLmxlbmd0aCsxKSxjPSEwKSwhYyl7Y29uc3Qgdj1uZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMyxoLTEpfX0oPzpbKistXXxcXGR7MSw5fVsuKV0pKCg/OlsgCV1bXlxcbl0qKT8oPzpcXG58JCkpYCkseT1uZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMyxoLTEpfX0oKD86LSAqKXszLH18KD86XyAqKXszLH18KD86XFwqICopezMsfSkoPzpcXG4rfCQpYCksXz1uZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMyxoLTEpfX0oPzpcYFxgXGB8fn5+KWApLFM9bmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsaC0xKX19I2ApO2Zvcig7dDspe2NvbnN0IEU9dC5zcGxpdChgCmAsMSlbMF07aWYoZj1FLHRoaXMub3B0aW9ucy5wZWRhbnRpYyYmKGY9Zi5yZXBsYWNlKC9eIHsxLDR9KD89KCB7NH0pKlteIF0pL2csIiAgIikpLF8udGVzdChmKXx8Uy50ZXN0KGYpfHx2LnRlc3QoZil8fHkudGVzdCh0KSlicmVhaztpZihmLnNlYXJjaCgvW14gXS8pPj1ofHwhZi50cmltKCkpYSs9YApgK2Yuc2xpY2UoaCk7ZWxzZXtpZihtfHxkLnNlYXJjaCgvW14gXS8pPj00fHxfLnRlc3QoZCl8fFMudGVzdChkKXx8eS50ZXN0KGQpKWJyZWFrO2ErPWAKYCtmfSFtJiYhZi50cmltKCkmJihtPSEwKSxzKz1FK2AKYCx0PXQuc3Vic3RyaW5nKEUubGVuZ3RoKzEpLGQ9Zi5zbGljZShoKX19by5sb29zZXx8KHU/by5sb29zZT0hMDovXG4gKlxuICokLy50ZXN0KHMpJiYodT0hMCkpO2xldCBnPW51bGwsdzt0aGlzLm9wdGlvbnMuZ2ZtJiYoZz0vXlxbWyB4WF1cXSAvLmV4ZWMoYSksZyYmKHc9Z1swXSE9PSJbIF0gIixhPWEucmVwbGFjZSgvXlxbWyB4WF1cXSArLywiIikpKSxvLml0ZW1zLnB1c2goe3R5cGU6Imxpc3RfaXRlbSIscmF3OnMsdGFzazohIWcsY2hlY2tlZDp3LGxvb3NlOiExLHRleHQ6YSx0b2tlbnM6W119KSxvLnJhdys9c31vLml0ZW1zW28uaXRlbXMubGVuZ3RoLTFdLnJhdz1zLnRyaW1FbmQoKSxvLml0ZW1zW28uaXRlbXMubGVuZ3RoLTFdLnRleHQ9YS50cmltRW5kKCksby5yYXc9by5yYXcudHJpbUVuZCgpO2ZvcihsZXQgYz0wO2M8by5pdGVtcy5sZW5ndGg7YysrKWlmKHRoaXMubGV4ZXIuc3RhdGUudG9wPSExLG8uaXRlbXNbY10udG9rZW5zPXRoaXMubGV4ZXIuYmxvY2tUb2tlbnMoby5pdGVtc1tjXS50ZXh0LFtdKSwhby5sb29zZSl7Y29uc3QgZD1vLml0ZW1zW2NdLnRva2Vucy5maWx0ZXIoaD0+aC50eXBlPT09InNwYWNlIiksZj1kLmxlbmd0aD4wJiZkLnNvbWUoaD0+L1xuLipcbi8udGVzdChoLnJhdykpO28ubG9vc2U9Zn1pZihvLmxvb3NlKWZvcihsZXQgYz0wO2M8by5pdGVtcy5sZW5ndGg7YysrKW8uaXRlbXNbY10ubG9vc2U9ITA7cmV0dXJuIG99fWh0bWwodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmh0bWwuZXhlYyh0KTtpZihuKXJldHVybnt0eXBlOiJodG1sIixibG9jazohMCxyYXc6blswXSxwcmU6blsxXT09PSJwcmUifHxuWzFdPT09InNjcmlwdCJ8fG5bMV09PT0ic3R5bGUiLHRleHQ6blswXX19ZGVmKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5kZWYuZXhlYyh0KTtpZihuKXtjb25zdCByPW5bMV0udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9ccysvZywiICIpLGk9blsyXT9uWzJdLnJlcGxhY2UoL148KC4qKT4kLywiJDEiKS5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLl9lc2NhcGVzLCIkMSIpOiIiLG89blszXT9uWzNdLnN1YnN0cmluZygxLG5bM10ubGVuZ3RoLTEpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuX2VzY2FwZXMsIiQxIik6blszXTtyZXR1cm57dHlwZToiZGVmIix0YWc6cixyYXc6blswXSxocmVmOmksdGl0bGU6b319fXRhYmxlKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay50YWJsZS5leGVjKHQpO2lmKG4pe2lmKCEvWzp8XS8udGVzdChuWzJdKSlyZXR1cm47Y29uc3Qgcj17dHlwZToidGFibGUiLHJhdzpuWzBdLGhlYWRlcjpleChuWzFdKS5tYXAoaT0+KHt0ZXh0OmksdG9rZW5zOltdfSkpLGFsaWduOm5bMl0ucmVwbGFjZSgvXlx8fFx8ICokL2csIiIpLnNwbGl0KCJ8Iikscm93czpuWzNdJiZuWzNdLnRyaW0oKT9uWzNdLnJlcGxhY2UoL1xuWyBcdF0qJC8sIiIpLnNwbGl0KGAKYCk6W119O2lmKHIuaGVhZGVyLmxlbmd0aD09PXIuYWxpZ24ubGVuZ3RoKXtsZXQgaT1yLmFsaWduLmxlbmd0aCxvLGwscyxhO2ZvcihvPTA7bzxpO28rKyl7Y29uc3QgdT1yLmFsaWduW29dO3UmJigvXiAqLSs6ICokLy50ZXN0KHUpP3IuYWxpZ25bb109InJpZ2h0IjovXiAqOi0rOiAqJC8udGVzdCh1KT9yLmFsaWduW29dPSJjZW50ZXIiOi9eICo6LSsgKiQvLnRlc3QodSk/ci5hbGlnbltvXT0ibGVmdCI6ci5hbGlnbltvXT1udWxsKX1mb3IoaT1yLnJvd3MubGVuZ3RoLG89MDtvPGk7bysrKXIucm93c1tvXT1leChyLnJvd3Nbb10sci5oZWFkZXIubGVuZ3RoKS5tYXAodT0+KHt0ZXh0OnUsdG9rZW5zOltdfSkpO2ZvcihpPXIuaGVhZGVyLmxlbmd0aCxsPTA7bDxpO2wrKylyLmhlYWRlcltsXS50b2tlbnM9dGhpcy5sZXhlci5pbmxpbmUoci5oZWFkZXJbbF0udGV4dCk7Zm9yKGk9ci5yb3dzLmxlbmd0aCxsPTA7bDxpO2wrKylmb3IoYT1yLnJvd3NbbF0scz0wO3M8YS5sZW5ndGg7cysrKWFbc10udG9rZW5zPXRoaXMubGV4ZXIuaW5saW5lKGFbc10udGV4dCk7cmV0dXJuIHJ9fX1saGVhZGluZyh0KXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2subGhlYWRpbmcuZXhlYyh0KTtpZihuKXJldHVybnt0eXBlOiJoZWFkaW5nIixyYXc6blswXSxkZXB0aDpuWzJdLmNoYXJBdCgwKT09PSI9Ij8xOjIsdGV4dDpuWzFdLHRva2Vuczp0aGlzLmxleGVyLmlubGluZShuWzFdKX19cGFyYWdyYXBoKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5wYXJhZ3JhcGguZXhlYyh0KTtpZihuKXtjb25zdCByPW5bMV0uY2hhckF0KG5bMV0ubGVuZ3RoLTEpPT09YApgP25bMV0uc2xpY2UoMCwtMSk6blsxXTtyZXR1cm57dHlwZToicGFyYWdyYXBoIixyYXc6blswXSx0ZXh0OnIsdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKHIpfX19dGV4dCh0KXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2sudGV4dC5leGVjKHQpO2lmKG4pcmV0dXJue3R5cGU6InRleHQiLHJhdzpuWzBdLHRleHQ6blswXSx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUoblswXSl9fWVzY2FwZSh0KXtjb25zdCBuPXRoaXMucnVsZXMuaW5saW5lLmVzY2FwZS5leGVjKHQpO2lmKG4pcmV0dXJue3R5cGU6ImVzY2FwZSIscmF3Om5bMF0sdGV4dDpNbihuWzFdKX19dGFnKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUudGFnLmV4ZWModCk7aWYobilyZXR1cm4hdGhpcy5sZXhlci5zdGF0ZS5pbkxpbmsmJi9ePGEgL2kudGVzdChuWzBdKT90aGlzLmxleGVyLnN0YXRlLmluTGluaz0hMDp0aGlzLmxleGVyLnN0YXRlLmluTGluayYmL148XC9hPi9pLnRlc3QoblswXSkmJih0aGlzLmxleGVyLnN0YXRlLmluTGluaz0hMSksIXRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayYmL148KHByZXxjb2RlfGtiZHxzY3JpcHQpKFxzfD4pL2kudGVzdChuWzBdKT90aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2s9ITA6dGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrJiYvXjxcLyhwcmV8Y29kZXxrYmR8c2NyaXB0KShcc3w+KS9pLnRlc3QoblswXSkmJih0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2s9ITEpLHt0eXBlOiJodG1sIixyYXc6blswXSxpbkxpbms6dGhpcy5sZXhlci5zdGF0ZS5pbkxpbmssaW5SYXdCbG9jazp0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2ssYmxvY2s6ITEsdGV4dDpuWzBdfX1saW5rKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUubGluay5leGVjKHQpO2lmKG4pe2NvbnN0IHI9blsyXS50cmltKCk7aWYoIXRoaXMub3B0aW9ucy5wZWRhbnRpYyYmL148Ly50ZXN0KHIpKXtpZighLz4kLy50ZXN0KHIpKXJldHVybjtjb25zdCBsPWdjKHIuc2xpY2UoMCwtMSksIlxcIik7aWYoKHIubGVuZ3RoLWwubGVuZ3RoKSUyPT09MClyZXR1cm59ZWxzZXtjb25zdCBsPVFSKG5bMl0sIigpIik7aWYobD4tMSl7Y29uc3QgYT0oblswXS5pbmRleE9mKCIhIik9PT0wPzU6NCkrblsxXS5sZW5ndGgrbDtuWzJdPW5bMl0uc3Vic3RyaW5nKDAsbCksblswXT1uWzBdLnN1YnN0cmluZygwLGEpLnRyaW0oKSxuWzNdPSIifX1sZXQgaT1uWzJdLG89IiI7aWYodGhpcy5vcHRpb25zLnBlZGFudGljKXtjb25zdCBsPS9eKFteJyJdKlteXHNdKVxzKyhbJyJdKSguKilcMi8uZXhlYyhpKTtsJiYoaT1sWzFdLG89bFszXSl9ZWxzZSBvPW5bM10/blszXS5zbGljZSgxLC0xKToiIjtyZXR1cm4gaT1pLnRyaW0oKSwvXjwvLnRlc3QoaSkmJih0aGlzLm9wdGlvbnMucGVkYW50aWMmJiEvPiQvLnRlc3Qocik/aT1pLnNsaWNlKDEpOmk9aS5zbGljZSgxLC0xKSksdHgobix7aHJlZjppJiZpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuX2VzY2FwZXMsIiQxIiksdGl0bGU6byYmby5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLl9lc2NhcGVzLCIkMSIpfSxuWzBdLHRoaXMubGV4ZXIpfX1yZWZsaW5rKHQsbil7bGV0IHI7aWYoKHI9dGhpcy5ydWxlcy5pbmxpbmUucmVmbGluay5leGVjKHQpKXx8KHI9dGhpcy5ydWxlcy5pbmxpbmUubm9saW5rLmV4ZWModCkpKXtsZXQgaT0oclsyXXx8clsxXSkucmVwbGFjZSgvXHMrL2csIiAiKTtpZihpPW5baS50b0xvd2VyQ2FzZSgpXSwhaSl7Y29uc3Qgbz1yWzBdLmNoYXJBdCgwKTtyZXR1cm57dHlwZToidGV4dCIscmF3Om8sdGV4dDpvfX1yZXR1cm4gdHgocixpLHJbMF0sdGhpcy5sZXhlcil9fWVtU3Ryb25nKHQsbixyPSIiKXtsZXQgaT10aGlzLnJ1bGVzLmlubGluZS5lbVN0cm9uZy5sRGVsaW0uZXhlYyh0KTtpZighaXx8aVszXSYmci5tYXRjaCgvW1xwe0x9XHB7Tn1dL3UpKXJldHVybjtpZighKGlbMV18fGlbMl18fCIiKXx8IXJ8fHRoaXMucnVsZXMuaW5saW5lLnB1bmN0dWF0aW9uLmV4ZWMocikpe2NvbnN0IGw9Wy4uLmlbMF1dLmxlbmd0aC0xO2xldCBzLGEsdT1sLGM9MDtjb25zdCBkPWlbMF1bMF09PT0iKiI/dGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmcuckRlbGltQXN0OnRoaXMucnVsZXMuaW5saW5lLmVtU3Ryb25nLnJEZWxpbVVuZDtmb3IoZC5sYXN0SW5kZXg9MCxuPW4uc2xpY2UoLTEqdC5sZW5ndGgrbCk7KGk9ZC5leGVjKG4pKSE9bnVsbDspe2lmKHM9aVsxXXx8aVsyXXx8aVszXXx8aVs0XXx8aVs1XXx8aVs2XSwhcyljb250aW51ZTtpZihhPVsuLi5zXS5sZW5ndGgsaVszXXx8aVs0XSl7dSs9YTtjb250aW51ZX1lbHNlIGlmKChpWzVdfHxpWzZdKSYmbCUzJiYhKChsK2EpJTMpKXtjKz1hO2NvbnRpbnVlfWlmKHUtPWEsdT4wKWNvbnRpbnVlO2E9TWF0aC5taW4oYSxhK3UrYyk7Y29uc3QgZj1bLi4uaVswXV1bMF0ubGVuZ3RoLGg9dC5zbGljZSgwLGwraS5pbmRleCtmK2EpO2lmKE1hdGgubWluKGwsYSklMil7Y29uc3QgZz1oLnNsaWNlKDEsLTEpO3JldHVybnt0eXBlOiJlbSIscmF3OmgsdGV4dDpnLHRva2Vuczp0aGlzLmxleGVyLmlubGluZVRva2VucyhnKX19Y29uc3QgbT1oLnNsaWNlKDIsLTIpO3JldHVybnt0eXBlOiJzdHJvbmciLHJhdzpoLHRleHQ6bSx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmVUb2tlbnMobSl9fX19Y29kZXNwYW4odCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmlubGluZS5jb2RlLmV4ZWModCk7aWYobil7bGV0IHI9blsyXS5yZXBsYWNlKC9cbi9nLCIgIik7Y29uc3QgaT0vW14gXS8udGVzdChyKSxvPS9eIC8udGVzdChyKSYmLyAkLy50ZXN0KHIpO3JldHVybiBpJiZvJiYocj1yLnN1YnN0cmluZygxLHIubGVuZ3RoLTEpKSxyPU1uKHIsITApLHt0eXBlOiJjb2Rlc3BhbiIscmF3Om5bMF0sdGV4dDpyfX19YnIodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmlubGluZS5ici5leGVjKHQpO2lmKG4pcmV0dXJue3R5cGU6ImJyIixyYXc6blswXX19ZGVsKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUuZGVsLmV4ZWModCk7aWYobilyZXR1cm57dHlwZToiZGVsIixyYXc6blswXSx0ZXh0Om5bMl0sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKG5bMl0pfX1hdXRvbGluayh0KXtjb25zdCBuPXRoaXMucnVsZXMuaW5saW5lLmF1dG9saW5rLmV4ZWModCk7aWYobil7bGV0IHIsaTtyZXR1cm4gblsyXT09PSJAIj8ocj1NbihuWzFdKSxpPSJtYWlsdG86IityKToocj1NbihuWzFdKSxpPXIpLHt0eXBlOiJsaW5rIixyYXc6blswXSx0ZXh0OnIsaHJlZjppLHRva2Vuczpbe3R5cGU6InRleHQiLHJhdzpyLHRleHQ6cn1dfX19dXJsKHQpe2xldCBuO2lmKG49dGhpcy5ydWxlcy5pbmxpbmUudXJsLmV4ZWModCkpe2xldCByLGk7aWYoblsyXT09PSJAIilyPU1uKG5bMF0pLGk9Im1haWx0bzoiK3I7ZWxzZXtsZXQgbztkbyBvPW5bMF0sblswXT10aGlzLnJ1bGVzLmlubGluZS5fYmFja3BlZGFsLmV4ZWMoblswXSlbMF07d2hpbGUobyE9PW5bMF0pO3I9TW4oblswXSksblsxXT09PSJ3d3cuIj9pPSJodHRwOi8vIituWzBdOmk9blswXX1yZXR1cm57dHlwZToibGluayIscmF3Om5bMF0sdGV4dDpyLGhyZWY6aSx0b2tlbnM6W3t0eXBlOiJ0ZXh0IixyYXc6cix0ZXh0OnJ9XX19fWlubGluZVRleHQodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmlubGluZS50ZXh0LmV4ZWModCk7aWYobil7bGV0IHI7cmV0dXJuIHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jaz9yPW5bMF06cj1NbihuWzBdKSx7dHlwZToidGV4dCIscmF3Om5bMF0sdGV4dDpyfX19fWNvbnN0IHVlPXtuZXdsaW5lOi9eKD86ICooPzpcbnwkKSkrLyxjb2RlOi9eKCB7NH1bXlxuXSsoPzpcbig/OiAqKD86XG58JCkpKik/KSsvLGZlbmNlczovXiB7MCwzfShgezMsfSg/PVteYFxuXSooPzpcbnwkKSl8fnszLH0pKFteXG5dKikoPzpcbnwkKSg/OnwoW1xzXFNdKj8pKD86XG58JCkpKD86IHswLDN9XDFbfmBdKiAqKD89XG58JCl8JCkvLGhyOi9eIHswLDN9KCg/Oi1bXHQgXSopezMsfXwoPzpfWyBcdF0qKXszLH18KD86XCpbIFx0XSopezMsfSkoPzpcbit8JCkvLGhlYWRpbmc6L14gezAsM30oI3sxLDZ9KSg/PVxzfCQpKC4qKSg/OlxuK3wkKS8sYmxvY2txdW90ZTovXiggezAsM30+ID8ocGFyYWdyYXBofFteXG5dKikoPzpcbnwkKSkrLyxsaXN0Oi9eKCB7MCwzfWJ1bGwpKFsgXHRdW15cbl0rPyk/KD86XG58JCkvLGh0bWw6Il4gezAsM30oPzo8KHNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpW1xccz5dW1xcc1xcU10qPyg/OjwvXFwxPlteXFxuXSpcXG4rfCQpfGNvbW1lbnRbXlxcbl0qKFxcbit8JCl8PFxcP1tcXHNcXFNdKj8oPzpcXD8+XFxuKnwkKXw8IVtBLVpdW1xcc1xcU10qPyg/Oj5cXG4qfCQpfDwhXFxbQ0RBVEFcXFtbXFxzXFxTXSo/KD86XFxdXFxdPlxcbip8JCl8PC8/KHRhZykoPzogK3xcXG58Lz8+KVtcXHNcXFNdKj8oPzooPzpcXG4gKikrXFxufCQpfDwoPyFzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKShbYS16XVtcXHctXSopKD86YXR0cmlidXRlKSo/ICovPz4oPz1bIFxcdF0qKD86XFxufCQpKVtcXHNcXFNdKj8oPzooPzpcXG4gKikrXFxufCQpfDwvKD8hc2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYSlbYS16XVtcXHctXSpcXHMqPig/PVsgXFx0XSooPzpcXG58JCkpW1xcc1xcU10qPyg/Oig/OlxcbiAqKStcXG58JCkpIixkZWY6L14gezAsM31cWyhsYWJlbClcXTogKig/OlxuICopPyhbXjxcc11bXlxzXSp8PC4qPz4pKD86KD86ICsoPzpcbiAqKT98ICpcbiAqKSh0aXRsZSkpPyAqKD86XG4rfCQpLyx0YWJsZTpQZCxsaGVhZGluZzovXig/IWJ1bGwgKSgoPzoufFxuKD8hXHMqP1xufGJ1bGwgKSkrPylcbiB7MCwzfSg9K3wtKykgKig/OlxuK3wkKS8sX3BhcmFncmFwaDovXihbXlxuXSsoPzpcbig/IWhyfGhlYWRpbmd8bGhlYWRpbmd8YmxvY2txdW90ZXxmZW5jZXN8bGlzdHxodG1sfHRhYmxlfCArXG4pW15cbl0rKSopLyx0ZXh0Oi9eW15cbl0rL307dWUuX2xhYmVsPS8oPyFccypcXSkoPzpcXC58W15cW1xdXFxdKSsvO3VlLl90aXRsZT0vKD86Iig/OlxcIj98W14iXFxdKSoifCdbXidcbl0qKD86XG5bXidcbl0rKSpcbj8nfFwoW14oKV0qXCkpLzt1ZS5kZWY9QmUodWUuZGVmKS5yZXBsYWNlKCJsYWJlbCIsdWUuX2xhYmVsKS5yZXBsYWNlKCJ0aXRsZSIsdWUuX3RpdGxlKS5nZXRSZWdleCgpO3VlLmJ1bGxldD0vKD86WyorLV18XGR7MSw5fVsuKV0pLzt1ZS5saXN0SXRlbVN0YXJ0PUJlKC9eKCAqKShidWxsKSAqLykucmVwbGFjZSgiYnVsbCIsdWUuYnVsbGV0KS5nZXRSZWdleCgpO3VlLmxpc3Q9QmUodWUubGlzdCkucmVwbGFjZSgvYnVsbC9nLHVlLmJ1bGxldCkucmVwbGFjZSgiaHIiLCJcXG4rKD89XFwxPyg/Oig/Oi0gKil7Myx9fCg/Ol8gKil7Myx9fCg/OlxcKiAqKXszLH0pKD86XFxuK3wkKSkiKS5yZXBsYWNlKCJkZWYiLCJcXG4rKD89Iit1ZS5kZWYuc291cmNlKyIpIikuZ2V0UmVnZXgoKTt1ZS5fdGFnPSJhZGRyZXNzfGFydGljbGV8YXNpZGV8YmFzZXxiYXNlZm9udHxibG9ja3F1b3RlfGJvZHl8Y2FwdGlvbnxjZW50ZXJ8Y29sfGNvbGdyb3VwfGRkfGRldGFpbHN8ZGlhbG9nfGRpcnxkaXZ8ZGx8ZHR8ZmllbGRzZXR8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGZvcm18ZnJhbWV8ZnJhbWVzZXR8aFsxLTZdfGhlYWR8aGVhZGVyfGhyfGh0bWx8aWZyYW1lfGxlZ2VuZHxsaXxsaW5rfG1haW58bWVudXxtZW51aXRlbXxtZXRhfG5hdnxub2ZyYW1lc3xvbHxvcHRncm91cHxvcHRpb258cHxwYXJhbXxzZWN0aW9ufHNvdXJjZXxzdW1tYXJ5fHRhYmxlfHRib2R5fHRkfHRmb290fHRofHRoZWFkfHRpdGxlfHRyfHRyYWNrfHVsIjt1ZS5fY29tbWVudD0vPCEtLSg/IS0/PilbXHNcU10qPyg/Oi0tPnwkKS87dWUuaHRtbD1CZSh1ZS5odG1sLCJpIikucmVwbGFjZSgiY29tbWVudCIsdWUuX2NvbW1lbnQpLnJlcGxhY2UoInRhZyIsdWUuX3RhZykucmVwbGFjZSgiYXR0cmlidXRlIiwvICtbYS16QS1aOl9dW1x3LjotXSooPzogKj0gKiJbXiJcbl0qInwgKj0gKidbXidcbl0qJ3wgKj0gKlteXHMiJz08PmBdKyk/LykuZ2V0UmVnZXgoKTt1ZS5saGVhZGluZz1CZSh1ZS5saGVhZGluZykucmVwbGFjZSgvYnVsbC9nLHVlLmJ1bGxldCkuZ2V0UmVnZXgoKTt1ZS5wYXJhZ3JhcGg9QmUodWUuX3BhcmFncmFwaCkucmVwbGFjZSgiaHIiLHVlLmhyKS5yZXBsYWNlKCJoZWFkaW5nIiwiIHswLDN9I3sxLDZ9KD86XFxzfCQpIikucmVwbGFjZSgifGxoZWFkaW5nIiwiIikucmVwbGFjZSgifHRhYmxlIiwiIikucmVwbGFjZSgiYmxvY2txdW90ZSIsIiB7MCwzfT4iKS5yZXBsYWNlKCJmZW5jZXMiLCIgezAsM30oPzpgezMsfSg/PVteYFxcbl0qXFxuKXx+ezMsfSlbXlxcbl0qXFxuIikucmVwbGFjZSgibGlzdCIsIiB7MCwzfSg/OlsqKy1dfDFbLildKSAiKS5yZXBsYWNlKCJodG1sIiwiPC8/KD86dGFnKSg/OiArfFxcbnwvPz4pfDwoPzpzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhfCEtLSkiKS5yZXBsYWNlKCJ0YWciLHVlLl90YWcpLmdldFJlZ2V4KCk7dWUuYmxvY2txdW90ZT1CZSh1ZS5ibG9ja3F1b3RlKS5yZXBsYWNlKCJwYXJhZ3JhcGgiLHVlLnBhcmFncmFwaCkuZ2V0UmVnZXgoKTt1ZS5ub3JtYWw9ey4uLnVlfTt1ZS5nZm09ey4uLnVlLm5vcm1hbCx0YWJsZToiXiAqKFteXFxuIF0uKilcXG4gezAsM30oKD86XFx8ICopPzo/LSs6PyAqKD86XFx8ICo6Py0rOj8gKikqKD86XFx8ICopPykoPzpcXG4oKD86KD8hICpcXG58aHJ8aGVhZGluZ3xibG9ja3F1b3RlfGNvZGV8ZmVuY2VzfGxpc3R8aHRtbCkuKig/OlxcbnwkKSkqKVxcbip8JCkifTt1ZS5nZm0udGFibGU9QmUodWUuZ2ZtLnRhYmxlKS5yZXBsYWNlKCJociIsdWUuaHIpLnJlcGxhY2UoImhlYWRpbmciLCIgezAsM30jezEsNn0oPzpcXHN8JCkiKS5yZXBsYWNlKCJibG9ja3F1b3RlIiwiIHswLDN9PiIpLnJlcGxhY2UoImNvZGUiLCIgezR9W15cXG5dIikucmVwbGFjZSgiZmVuY2VzIiwiIHswLDN9KD86YHszLH0oPz1bXmBcXG5dKlxcbil8fnszLH0pW15cXG5dKlxcbiIpLnJlcGxhY2UoImxpc3QiLCIgezAsM30oPzpbKistXXwxWy4pXSkgIikucmVwbGFjZSgiaHRtbCIsIjwvPyg/OnRhZykoPzogK3xcXG58Lz8+KXw8KD86c2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYXwhLS0pIikucmVwbGFjZSgidGFnIix1ZS5fdGFnKS5nZXRSZWdleCgpO3VlLmdmbS5wYXJhZ3JhcGg9QmUodWUuX3BhcmFncmFwaCkucmVwbGFjZSgiaHIiLHVlLmhyKS5yZXBsYWNlKCJoZWFkaW5nIiwiIHswLDN9I3sxLDZ9KD86XFxzfCQpIikucmVwbGFjZSgifGxoZWFkaW5nIiwiIikucmVwbGFjZSgidGFibGUiLHVlLmdmbS50YWJsZSkucmVwbGFjZSgiYmxvY2txdW90ZSIsIiB7MCwzfT4iKS5yZXBsYWNlKCJmZW5jZXMiLCIgezAsM30oPzpgezMsfSg/PVteYFxcbl0qXFxuKXx+ezMsfSlbXlxcbl0qXFxuIikucmVwbGFjZSgibGlzdCIsIiB7MCwzfSg/OlsqKy1dfDFbLildKSAiKS5yZXBsYWNlKCJodG1sIiwiPC8/KD86dGFnKSg/OiArfFxcbnwvPz4pfDwoPzpzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhfCEtLSkiKS5yZXBsYWNlKCJ0YWciLHVlLl90YWcpLmdldFJlZ2V4KCk7dWUucGVkYW50aWM9ey4uLnVlLm5vcm1hbCxodG1sOkJlKGBeICooPzpjb21tZW50ICooPzpcXG58XFxzKiQpfDwodGFnKVtcXHNcXFNdKz88L1xcMT4gKig/OlxcbnsyLH18XFxzKiQpfDx0YWcoPzoiW14iXSoifCdbXiddKid8XFxzW14nIi8+XFxzXSopKj8vPz4gKig/OlxcbnsyLH18XFxzKiQpKWApLnJlcGxhY2UoImNvbW1lbnQiLHVlLl9jb21tZW50KS5yZXBsYWNlKC90YWcvZywiKD8hKD86YXxlbXxzdHJvbmd8c21hbGx8c3xjaXRlfHF8ZGZufGFiYnJ8ZGF0YXx0aW1lfGNvZGV8dmFyfHNhbXB8a2JkfHN1YnxzdXB8aXxifHV8bWFya3xydWJ5fHJ0fHJwfGJkaXxiZG98c3Bhbnxicnx3YnJ8aW5zfGRlbHxpbWcpXFxiKVxcdysoPyE6fFteXFx3XFxzQF0qQClcXGIiKS5nZXRSZWdleCgpLGRlZjovXiAqXFsoW15cXV0rKVxdOiAqPD8oW15ccz5dKyk+Pyg/OiArKFsiKF1bXlxuXStbIildKSk/ICooPzpcbit8JCkvLGhlYWRpbmc6L14oI3sxLDZ9KSguKikoPzpcbit8JCkvLGZlbmNlczpQZCxsaGVhZGluZzovXiguKz8pXG4gezAsM30oPSt8LSspICooPzpcbit8JCkvLHBhcmFncmFwaDpCZSh1ZS5ub3JtYWwuX3BhcmFncmFwaCkucmVwbGFjZSgiaHIiLHVlLmhyKS5yZXBsYWNlKCJoZWFkaW5nIixgICojezEsNn0gKlteCl1gKS5yZXBsYWNlKCJsaGVhZGluZyIsdWUubGhlYWRpbmcpLnJlcGxhY2UoImJsb2NrcXVvdGUiLCIgezAsM30+IikucmVwbGFjZSgifGZlbmNlcyIsIiIpLnJlcGxhY2UoInxsaXN0IiwiIikucmVwbGFjZSgifGh0bWwiLCIiKS5nZXRSZWdleCgpfTtjb25zdCBZPXtlc2NhcGU6L15cXChbISIjJCUmJygpKissXC0uLzo7PD0+P0BcW1xdXFxeX2B7fH1+XSkvLGF1dG9saW5rOi9ePChzY2hlbWU6W15cc1x4MDAtXHgxZjw+XSp8ZW1haWwpPi8sdXJsOlBkLHRhZzoiXmNvbW1lbnR8XjwvW2EtekEtWl1bXFx3Oi1dKlxccyo+fF48W2EtekEtWl1bXFx3LV0qKD86YXR0cmlidXRlKSo/XFxzKi8/PnxePFxcP1tcXHNcXFNdKj9cXD8+fF48IVthLXpBLVpdK1xcc1tcXHNcXFNdKj8+fF48IVxcW0NEQVRBXFxbW1xcc1xcU10qP1xcXVxcXT4iLGxpbms6L14hP1xbKGxhYmVsKVxdXChccyooaHJlZikoPzpccysodGl0bGUpKT9ccypcKS8scmVmbGluazovXiE/XFsobGFiZWwpXF1cWyhyZWYpXF0vLG5vbGluazovXiE/XFsocmVmKVxdKD86XFtcXSk/LyxyZWZsaW5rU2VhcmNoOiJyZWZsaW5rfG5vbGluayg/IVxcKCkiLGVtU3Ryb25nOntsRGVsaW06L14oPzpcKisoPzooKD8hXCopW3B1bmN0XSl8W15ccypdKSl8Xl8rKD86KCg/IV8pW3B1bmN0XSl8KFteXHNfXSkpLyxyRGVsaW1Bc3Q6L15bXl8qXSo/X19bXl8qXSo/XCpbXl8qXSo/KD89X18pfFteKl0rKD89W14qXSl8KD8hXCopW3B1bmN0XShcKispKD89W1xzXXwkKXxbXnB1bmN0XHNdKFwqKykoPyFcKikoPz1bcHVuY3Rcc118JCl8KD8hXCopW3B1bmN0XHNdKFwqKykoPz1bXnB1bmN0XHNdKXxbXHNdKFwqKykoPyFcKikoPz1bcHVuY3RdKXwoPyFcKilbcHVuY3RdKFwqKykoPyFcKikoPz1bcHVuY3RdKXxbXnB1bmN0XHNdKFwqKykoPz1bXnB1bmN0XHNdKS8sckRlbGltVW5kOi9eW15fKl0qP1wqXCpbXl8qXSo/X1teXypdKj8oPz1cKlwqKXxbXl9dKyg/PVteX10pfCg/IV8pW3B1bmN0XShfKykoPz1bXHNdfCQpfFtecHVuY3Rcc10oXyspKD8hXykoPz1bcHVuY3Rcc118JCl8KD8hXylbcHVuY3Rcc10oXyspKD89W15wdW5jdFxzXSl8W1xzXShfKykoPyFfKSg/PVtwdW5jdF0pfCg/IV8pW3B1bmN0XShfKykoPyFfKSg/PVtwdW5jdF0pL30sY29kZTovXihgKykoW15gXXxbXmBdW1xzXFNdKj9bXmBdKVwxKD8hYCkvLGJyOi9eKCB7Mix9fFxcKVxuKD8hXHMqJCkvLGRlbDpQZCx0ZXh0Oi9eKGArfFteYF0pKD86KD89IHsyLH1cbil8W1xzXFNdKj8oPzooPz1bXFw8IVxbYCpfXXxcYl98JCl8W14gXSg/PSB7Mix9XG4pKSkvLHB1bmN0dWF0aW9uOi9eKCg/IVsqX10pW1xzcHVuY3R1YXRpb25dKS99O1kuX3B1bmN0dWF0aW9uPSJcXHB7UH0kKzw9PmBefH4iO1kucHVuY3R1YXRpb249QmUoWS5wdW5jdHVhdGlvbiwidSIpLnJlcGxhY2UoL3B1bmN0dWF0aW9uL2csWS5fcHVuY3R1YXRpb24pLmdldFJlZ2V4KCk7WS5ibG9ja1NraXA9L1xbW15bXF1dKj9cXVwoW15cKFwpXSo/XCl8YFteYF0qP2B8PFtePD5dKj8+L2c7WS5hbnlQdW5jdHVhdGlvbj0vXFxbcHVuY3RdL2c7WS5fZXNjYXBlcz0vXFwoW3B1bmN0XSkvZztZLl9jb21tZW50PUJlKHVlLl9jb21tZW50KS5yZXBsYWNlKCIoPzotLT58JCkiLCItLT4iKS5nZXRSZWdleCgpO1kuZW1TdHJvbmcubERlbGltPUJlKFkuZW1TdHJvbmcubERlbGltLCJ1IikucmVwbGFjZSgvcHVuY3QvZyxZLl9wdW5jdHVhdGlvbikuZ2V0UmVnZXgoKTtZLmVtU3Ryb25nLnJEZWxpbUFzdD1CZShZLmVtU3Ryb25nLnJEZWxpbUFzdCwiZ3UiKS5yZXBsYWNlKC9wdW5jdC9nLFkuX3B1bmN0dWF0aW9uKS5nZXRSZWdleCgpO1kuZW1TdHJvbmcuckRlbGltVW5kPUJlKFkuZW1TdHJvbmcuckRlbGltVW5kLCJndSIpLnJlcGxhY2UoL3B1bmN0L2csWS5fcHVuY3R1YXRpb24pLmdldFJlZ2V4KCk7WS5hbnlQdW5jdHVhdGlvbj1CZShZLmFueVB1bmN0dWF0aW9uLCJndSIpLnJlcGxhY2UoL3B1bmN0L2csWS5fcHVuY3R1YXRpb24pLmdldFJlZ2V4KCk7WS5fZXNjYXBlcz1CZShZLl9lc2NhcGVzLCJndSIpLnJlcGxhY2UoL3B1bmN0L2csWS5fcHVuY3R1YXRpb24pLmdldFJlZ2V4KCk7WS5fc2NoZW1lPS9bYS16QS1aXVthLXpBLVowLTkrLi1dezEsMzF9LztZLl9lbWFpbD0vW2EtekEtWjAtOS4hIyQlJicqKy89P15fYHt8fX4tXSsoQClbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykrKD8hWy1fXSkvO1kuYXV0b2xpbms9QmUoWS5hdXRvbGluaykucmVwbGFjZSgic2NoZW1lIixZLl9zY2hlbWUpLnJlcGxhY2UoImVtYWlsIixZLl9lbWFpbCkuZ2V0UmVnZXgoKTtZLl9hdHRyaWJ1dGU9L1xzK1thLXpBLVo6X11bXHcuOi1dKig/OlxzKj1ccyoiW14iXSoifFxzKj1ccyonW14nXSonfFxzKj1ccypbXlxzIic9PD5gXSspPy87WS50YWc9QmUoWS50YWcpLnJlcGxhY2UoImNvbW1lbnQiLFkuX2NvbW1lbnQpLnJlcGxhY2UoImF0dHJpYnV0ZSIsWS5fYXR0cmlidXRlKS5nZXRSZWdleCgpO1kuX2xhYmVsPS8oPzpcWyg/OlxcLnxbXlxbXF1cXF0pKlxdfFxcLnxgW15gXSpgfFteXFtcXVxcYF0pKj8vO1kuX2hyZWY9LzwoPzpcXC58W15cbjw+XFxdKSs+fFteXHNceDAwLVx4MWZdKi87WS5fdGl0bGU9LyIoPzpcXCI/fFteIlxcXSkqInwnKD86XFwnP3xbXidcXF0pKid8XCgoPzpcXFwpP3xbXilcXF0pKlwpLztZLmxpbms9QmUoWS5saW5rKS5yZXBsYWNlKCJsYWJlbCIsWS5fbGFiZWwpLnJlcGxhY2UoImhyZWYiLFkuX2hyZWYpLnJlcGxhY2UoInRpdGxlIixZLl90aXRsZSkuZ2V0UmVnZXgoKTtZLnJlZmxpbms9QmUoWS5yZWZsaW5rKS5yZXBsYWNlKCJsYWJlbCIsWS5fbGFiZWwpLnJlcGxhY2UoInJlZiIsdWUuX2xhYmVsKS5nZXRSZWdleCgpO1kubm9saW5rPUJlKFkubm9saW5rKS5yZXBsYWNlKCJyZWYiLHVlLl9sYWJlbCkuZ2V0UmVnZXgoKTtZLnJlZmxpbmtTZWFyY2g9QmUoWS5yZWZsaW5rU2VhcmNoLCJnIikucmVwbGFjZSgicmVmbGluayIsWS5yZWZsaW5rKS5yZXBsYWNlKCJub2xpbmsiLFkubm9saW5rKS5nZXRSZWdleCgpO1kubm9ybWFsPXsuLi5ZfTtZLnBlZGFudGljPXsuLi5ZLm5vcm1hbCxzdHJvbmc6e3N0YXJ0Oi9eX198XCpcKi8sbWlkZGxlOi9eX18oPz1cUykoW1xzXFNdKj9cUylfXyg/IV8pfF5cKlwqKD89XFMpKFtcc1xTXSo/XFMpXCpcKig/IVwqKS8sZW5kQXN0Oi9cKlwqKD8hXCopL2csZW5kVW5kOi9fXyg/IV8pL2d9LGVtOntzdGFydDovXl98XCovLG1pZGRsZTovXigpXCooPz1cUykoW1xzXFNdKj9cUylcKig/IVwqKXxeXyg/PVxTKShbXHNcU10qP1xTKV8oPyFfKS8sZW5kQXN0Oi9cKig/IVwqKS9nLGVuZFVuZDovXyg/IV8pL2d9LGxpbms6QmUoL14hP1xbKGxhYmVsKVxdXCgoLio/KVwpLykucmVwbGFjZSgibGFiZWwiLFkuX2xhYmVsKS5nZXRSZWdleCgpLHJlZmxpbms6QmUoL14hP1xbKGxhYmVsKVxdXHMqXFsoW15cXV0qKVxdLykucmVwbGFjZSgibGFiZWwiLFkuX2xhYmVsKS5nZXRSZWdleCgpfTtZLmdmbT17Li4uWS5ub3JtYWwsZXNjYXBlOkJlKFkuZXNjYXBlKS5yZXBsYWNlKCJdKSIsIn58XSkiKS5nZXRSZWdleCgpLF9leHRlbmRlZF9lbWFpbDovW0EtWmEtejAtOS5fKy1dKyhAKVthLXpBLVowLTktX10rKD86XC5bYS16QS1aMC05LV9dKlthLXpBLVowLTldKSsoPyFbLV9dKS8sdXJsOi9eKCg/OmZ0cHxodHRwcz8pOlwvXC98d3d3XC4pKD86W2EtekEtWjAtOVwtXStcLj8pK1teXHM8XSp8XmVtYWlsLyxfYmFja3BlZGFsOi8oPzpbXj8hLiw6OypfJyJ+KCkmXSt8XChbXildKlwpfCYoPyFbYS16QS1aMC05XSs7JCl8Wz8hLiw6OypfJyJ+KV0rKD8hJCkpKy8sZGVsOi9eKH5+PykoPz1bXlxzfl0pKFtcc1xTXSo/W15cc35dKVwxKD89W15+XXwkKS8sdGV4dDovXihbYH5dK3xbXmB+XSkoPzooPz0gezIsfVxuKXwoPz1bYS16QS1aMC05LiEjJCUmJyorXC89P19ge1x8fX4tXStAKXxbXHNcU10qPyg/Oig/PVtcXDwhXFtgKn5fXXxcYl98aHR0cHM/OlwvXC98ZnRwOlwvXC98d3d3XC58JCl8W14gXSg/PSB7Mix9XG4pfFteYS16QS1aMC05LiEjJCUmJyorXC89P19ge1x8fX4tXSg/PVthLXpBLVowLTkuISMkJSYnKitcLz0/X2B7XHx9fi1dK0ApKSkvfTtZLmdmbS51cmw9QmUoWS5nZm0udXJsLCJpIikucmVwbGFjZSgiZW1haWwiLFkuZ2ZtLl9leHRlbmRlZF9lbWFpbCkuZ2V0UmVnZXgoKTtZLmJyZWFrcz17Li4uWS5nZm0sYnI6QmUoWS5icikucmVwbGFjZSgiezIsfSIsIioiKS5nZXRSZWdleCgpLHRleHQ6QmUoWS5nZm0udGV4dCkucmVwbGFjZSgiXFxiXyIsIlxcYl98IHsyLH1cXG4iKS5yZXBsYWNlKC9cezIsXH0vZywiKiIpLmdldFJlZ2V4KCl9O2NsYXNzIExye2NvbnN0cnVjdG9yKHQpe0plKHRoaXMsInRva2VucyIpO0plKHRoaXMsIm9wdGlvbnMiKTtKZSh0aGlzLCJzdGF0ZSIpO0plKHRoaXMsInRva2VuaXplciIpO0plKHRoaXMsImlubGluZVF1ZXVlIik7dGhpcy50b2tlbnM9W10sdGhpcy50b2tlbnMubGlua3M9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLm9wdGlvbnM9dHx8Y2wsdGhpcy5vcHRpb25zLnRva2VuaXplcj10aGlzLm9wdGlvbnMudG9rZW5pemVyfHxuZXcgQWQsdGhpcy50b2tlbml6ZXI9dGhpcy5vcHRpb25zLnRva2VuaXplcix0aGlzLnRva2VuaXplci5vcHRpb25zPXRoaXMub3B0aW9ucyx0aGlzLnRva2VuaXplci5sZXhlcj10aGlzLHRoaXMuaW5saW5lUXVldWU9W10sdGhpcy5zdGF0ZT17aW5MaW5rOiExLGluUmF3QmxvY2s6ITEsdG9wOiEwfTtjb25zdCBuPXtibG9jazp1ZS5ub3JtYWwsaW5saW5lOlkubm9ybWFsfTt0aGlzLm9wdGlvbnMucGVkYW50aWM/KG4uYmxvY2s9dWUucGVkYW50aWMsbi5pbmxpbmU9WS5wZWRhbnRpYyk6dGhpcy5vcHRpb25zLmdmbSYmKG4uYmxvY2s9dWUuZ2ZtLHRoaXMub3B0aW9ucy5icmVha3M/bi5pbmxpbmU9WS5icmVha3M6bi5pbmxpbmU9WS5nZm0pLHRoaXMudG9rZW5pemVyLnJ1bGVzPW59c3RhdGljIGdldCBydWxlcygpe3JldHVybntibG9jazp1ZSxpbmxpbmU6WX19c3RhdGljIGxleCh0LG4pe3JldHVybiBuZXcgTHIobikubGV4KHQpfXN0YXRpYyBsZXhJbmxpbmUodCxuKXtyZXR1cm4gbmV3IExyKG4pLmlubGluZVRva2Vucyh0KX1sZXgodCl7dD10LnJlcGxhY2UoL1xyXG58XHIvZyxgCmApLHRoaXMuYmxvY2tUb2tlbnModCx0aGlzLnRva2Vucyk7bGV0IG47Zm9yKDtuPXRoaXMuaW5saW5lUXVldWUuc2hpZnQoKTspdGhpcy5pbmxpbmVUb2tlbnMobi5zcmMsbi50b2tlbnMpO3JldHVybiB0aGlzLnRva2Vuc31ibG9ja1Rva2Vucyh0LG49W10pe3RoaXMub3B0aW9ucy5wZWRhbnRpYz90PXQucmVwbGFjZSgvXHQvZywiICAgICIpLnJlcGxhY2UoL14gKyQvZ20sIiIpOnQ9dC5yZXBsYWNlKC9eKCAqKShcdCspL2dtLChzLGEsdSk9PmErIiAgICAiLnJlcGVhdCh1Lmxlbmd0aCkpO2xldCByLGksbyxsO2Zvcig7dDspaWYoISh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucyYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuYmxvY2smJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLmJsb2NrLnNvbWUocz0+KHI9cy5jYWxsKHtsZXhlcjp0aGlzfSx0LG4pKT8odD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKSwhMCk6ITEpKSl7aWYocj10aGlzLnRva2VuaXplci5zcGFjZSh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLHIucmF3Lmxlbmd0aD09PTEmJm4ubGVuZ3RoPjA/bltuLmxlbmd0aC0xXS5yYXcrPWAKYDpuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5jb2RlKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksaT1uW24ubGVuZ3RoLTFdLGkmJihpLnR5cGU9PT0icGFyYWdyYXBoInx8aS50eXBlPT09InRleHQiKT8oaS5yYXcrPWAKYCtyLnJhdyxpLnRleHQrPWAKYCtyLnRleHQsdGhpcy5pbmxpbmVRdWV1ZVt0aGlzLmlubGluZVF1ZXVlLmxlbmd0aC0xXS5zcmM9aS50ZXh0KTpuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5mZW5jZXModCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5oZWFkaW5nKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuaHIodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5ibG9ja3F1b3RlKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIubGlzdCh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmh0bWwodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5kZWYodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxpPW5bbi5sZW5ndGgtMV0saSYmKGkudHlwZT09PSJwYXJhZ3JhcGgifHxpLnR5cGU9PT0idGV4dCIpPyhpLnJhdys9YApgK3IucmF3LGkudGV4dCs9YApgK3IucmF3LHRoaXMuaW5saW5lUXVldWVbdGhpcy5pbmxpbmVRdWV1ZS5sZW5ndGgtMV0uc3JjPWkudGV4dCk6dGhpcy50b2tlbnMubGlua3Nbci50YWddfHwodGhpcy50b2tlbnMubGlua3Nbci50YWddPXtocmVmOnIuaHJlZix0aXRsZTpyLnRpdGxlfSk7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci50YWJsZSh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmxoZWFkaW5nKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKG89dCx0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucyYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRCbG9jayl7bGV0IHM9MS8wO2NvbnN0IGE9dC5zbGljZSgxKTtsZXQgdTt0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydEJsb2NrLmZvckVhY2goYz0+e3U9Yy5jYWxsKHtsZXhlcjp0aGlzfSxhKSx0eXBlb2YgdT09Im51bWJlciImJnU+PTAmJihzPU1hdGgubWluKHMsdSkpfSksczwxLzAmJnM+PTAmJihvPXQuc3Vic3RyaW5nKDAscysxKSl9aWYodGhpcy5zdGF0ZS50b3AmJihyPXRoaXMudG9rZW5pemVyLnBhcmFncmFwaChvKSkpe2k9bltuLmxlbmd0aC0xXSxsJiZpLnR5cGU9PT0icGFyYWdyYXBoIj8oaS5yYXcrPWAKYCtyLnJhdyxpLnRleHQrPWAKYCtyLnRleHQsdGhpcy5pbmxpbmVRdWV1ZS5wb3AoKSx0aGlzLmlubGluZVF1ZXVlW3RoaXMuaW5saW5lUXVldWUubGVuZ3RoLTFdLnNyYz1pLnRleHQpOm4ucHVzaChyKSxsPW8ubGVuZ3RoIT09dC5sZW5ndGgsdD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIudGV4dCh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLGk9bltuLmxlbmd0aC0xXSxpJiZpLnR5cGU9PT0idGV4dCI/KGkucmF3Kz1gCmArci5yYXcsaS50ZXh0Kz1gCmArci50ZXh0LHRoaXMuaW5saW5lUXVldWUucG9wKCksdGhpcy5pbmxpbmVRdWV1ZVt0aGlzLmlubGluZVF1ZXVlLmxlbmd0aC0xXS5zcmM9aS50ZXh0KTpuLnB1c2gocik7Y29udGludWV9aWYodCl7Y29uc3Qgcz0iSW5maW5pdGUgbG9vcCBvbiBieXRlOiAiK3QuY2hhckNvZGVBdCgwKTtpZih0aGlzLm9wdGlvbnMuc2lsZW50KXtjb25zb2xlLmVycm9yKHMpO2JyZWFrfWVsc2UgdGhyb3cgbmV3IEVycm9yKHMpfX1yZXR1cm4gdGhpcy5zdGF0ZS50b3A9ITAsbn1pbmxpbmUodCxuPVtdKXtyZXR1cm4gdGhpcy5pbmxpbmVRdWV1ZS5wdXNoKHtzcmM6dCx0b2tlbnM6bn0pLG59aW5saW5lVG9rZW5zKHQsbj1bXSl7bGV0IHIsaSxvLGw9dCxzLGEsdTtpZih0aGlzLnRva2Vucy5saW5rcyl7Y29uc3QgYz1PYmplY3Qua2V5cyh0aGlzLnRva2Vucy5saW5rcyk7aWYoYy5sZW5ndGg+MClmb3IoOyhzPXRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5yZWZsaW5rU2VhcmNoLmV4ZWMobCkpIT1udWxsOyljLmluY2x1ZGVzKHNbMF0uc2xpY2Uoc1swXS5sYXN0SW5kZXhPZigiWyIpKzEsLTEpKSYmKGw9bC5zbGljZSgwLHMuaW5kZXgpKyJbIisiYSIucmVwZWF0KHNbMF0ubGVuZ3RoLTIpKyJdIitsLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5yZWZsaW5rU2VhcmNoLmxhc3RJbmRleCkpfWZvcig7KHM9dGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmJsb2NrU2tpcC5leGVjKGwpKSE9bnVsbDspbD1sLnNsaWNlKDAscy5pbmRleCkrIlsiKyJhIi5yZXBlYXQoc1swXS5sZW5ndGgtMikrIl0iK2wuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmJsb2NrU2tpcC5sYXN0SW5kZXgpO2Zvcig7KHM9dGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLmV4ZWMobCkpIT1udWxsOylsPWwuc2xpY2UoMCxzLmluZGV4KSsiKysiK2wuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLmxhc3RJbmRleCk7Zm9yKDt0OylpZihhfHwodT0iIiksYT0hMSwhKHRoaXMub3B0aW9ucy5leHRlbnNpb25zJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5pbmxpbmUmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLmlubGluZS5zb21lKGM9PihyPWMuY2FsbCh7bGV4ZXI6dGhpc30sdCxuKSk/KHQ9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gociksITApOiExKSkpe2lmKHI9dGhpcy50b2tlbml6ZXIuZXNjYXBlKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIudGFnKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksaT1uW24ubGVuZ3RoLTFdLGkmJnIudHlwZT09PSJ0ZXh0IiYmaS50eXBlPT09InRleHQiPyhpLnJhdys9ci5yYXcsaS50ZXh0Kz1yLnRleHQpOm4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmxpbmsodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5yZWZsaW5rKHQsdGhpcy50b2tlbnMubGlua3MpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksaT1uW24ubGVuZ3RoLTFdLGkmJnIudHlwZT09PSJ0ZXh0IiYmaS50eXBlPT09InRleHQiPyhpLnJhdys9ci5yYXcsaS50ZXh0Kz1yLnRleHQpOm4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmVtU3Ryb25nKHQsbCx1KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmNvZGVzcGFuKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuYnIodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5kZWwodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5hdXRvbGluayh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZighdGhpcy5zdGF0ZS5pbkxpbmsmJihyPXRoaXMudG9rZW5pemVyLnVybCh0KSkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYobz10LHRoaXMub3B0aW9ucy5leHRlbnNpb25zJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydElubGluZSl7bGV0IGM9MS8wO2NvbnN0IGQ9dC5zbGljZSgxKTtsZXQgZjt0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydElubGluZS5mb3JFYWNoKGg9PntmPWguY2FsbCh7bGV4ZXI6dGhpc30sZCksdHlwZW9mIGY9PSJudW1iZXIiJiZmPj0wJiYoYz1NYXRoLm1pbihjLGYpKX0pLGM8MS8wJiZjPj0wJiYobz10LnN1YnN0cmluZygwLGMrMSkpfWlmKHI9dGhpcy50b2tlbml6ZXIuaW5saW5lVGV4dChvKSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLHIucmF3LnNsaWNlKC0xKSE9PSJfIiYmKHU9ci5yYXcuc2xpY2UoLTEpKSxhPSEwLGk9bltuLmxlbmd0aC0xXSxpJiZpLnR5cGU9PT0idGV4dCI/KGkucmF3Kz1yLnJhdyxpLnRleHQrPXIudGV4dCk6bi5wdXNoKHIpO2NvbnRpbnVlfWlmKHQpe2NvbnN0IGM9IkluZmluaXRlIGxvb3Agb24gYnl0ZTogIit0LmNoYXJDb2RlQXQoMCk7aWYodGhpcy5vcHRpb25zLnNpbGVudCl7Y29uc29sZS5lcnJvcihjKTticmVha31lbHNlIHRocm93IG5ldyBFcnJvcihjKX19cmV0dXJuIG59fWNsYXNzIE1ke2NvbnN0cnVjdG9yKHQpe0plKHRoaXMsIm9wdGlvbnMiKTt0aGlzLm9wdGlvbnM9dHx8Y2x9Y29kZSh0LG4scil7dmFyIG87Y29uc3QgaT0obz0obnx8IiIpLm1hdGNoKC9eXFMqLykpPT1udWxsP3ZvaWQgMDpvWzBdO3JldHVybiB0PXQucmVwbGFjZSgvXG4kLywiIikrYApgLGk/JzxwcmU+PGNvZGUgY2xhc3M9Imxhbmd1YWdlLScrTW4oaSkrJyI+Jysocj90Ok1uKHQsITApKStgPC9jb2RlPjwvcHJlPgpgOiI8cHJlPjxjb2RlPiIrKHI/dDpNbih0LCEwKSkrYDwvY29kZT48L3ByZT4KYH1ibG9ja3F1b3RlKHQpe3JldHVybmA8YmxvY2txdW90ZT4KJHt0fTwvYmxvY2txdW90ZT4KYH1odG1sKHQsbil7cmV0dXJuIHR9aGVhZGluZyh0LG4scil7cmV0dXJuYDxoJHtufT4ke3R9PC9oJHtufT4KYH1ocigpe3JldHVybmA8aHI+CmB9bGlzdCh0LG4scil7Y29uc3QgaT1uPyJvbCI6InVsIixvPW4mJnIhPT0xPycgc3RhcnQ9IicrcisnIic6IiI7cmV0dXJuIjwiK2krbytgPgpgK3QrIjwvIitpK2A+CmB9bGlzdGl0ZW0odCxuLHIpe3JldHVybmA8bGk+JHt0fTwvbGk+CmB9Y2hlY2tib3godCl7cmV0dXJuIjxpbnB1dCAiKyh0PydjaGVja2VkPSIiICc6IiIpKydkaXNhYmxlZD0iIiB0eXBlPSJjaGVja2JveCI+J31wYXJhZ3JhcGgodCl7cmV0dXJuYDxwPiR7dH08L3A+CmB9dGFibGUodCxuKXtyZXR1cm4gbiYmKG49YDx0Ym9keT4ke259PC90Ym9keT5gKSxgPHRhYmxlPgo8dGhlYWQ+CmArdCtgPC90aGVhZD4KYCtuK2A8L3RhYmxlPgpgfXRhYmxlcm93KHQpe3JldHVybmA8dHI+CiR7dH08L3RyPgpgfXRhYmxlY2VsbCh0LG4pe2NvbnN0IHI9bi5oZWFkZXI/InRoIjoidGQiO3JldHVybihuLmFsaWduP2A8JHtyfSBhbGlnbj0iJHtuLmFsaWdufSI+YDpgPCR7cn0+YCkrdCtgPC8ke3J9PgpgfXN0cm9uZyh0KXtyZXR1cm5gPHN0cm9uZz4ke3R9PC9zdHJvbmc+YH1lbSh0KXtyZXR1cm5gPGVtPiR7dH08L2VtPmB9Y29kZXNwYW4odCl7cmV0dXJuYDxjb2RlPiR7dH08L2NvZGU+YH1icigpe3JldHVybiI8YnI+In1kZWwodCl7cmV0dXJuYDxkZWw+JHt0fTwvZGVsPmB9bGluayh0LG4scil7Y29uc3QgaT1xMCh0KTtpZihpPT09bnVsbClyZXR1cm4gcjt0PWk7bGV0IG89JzxhIGhyZWY9IicrdCsnIic7cmV0dXJuIG4mJihvKz0nIHRpdGxlPSInK24rJyInKSxvKz0iPiIrcisiPC9hPiIsb31pbWFnZSh0LG4scil7Y29uc3QgaT1xMCh0KTtpZihpPT09bnVsbClyZXR1cm4gcjt0PWk7bGV0IG89YDxpbWcgc3JjPSIke3R9IiBhbHQ9IiR7cn0iYDtyZXR1cm4gbiYmKG8rPWAgdGl0bGU9IiR7bn0iYCksbys9Ij4iLG99dGV4dCh0KXtyZXR1cm4gdH19Y2xhc3MgX3Z7c3Ryb25nKHQpe3JldHVybiB0fWVtKHQpe3JldHVybiB0fWNvZGVzcGFuKHQpe3JldHVybiB0fWRlbCh0KXtyZXR1cm4gdH1odG1sKHQpe3JldHVybiB0fXRleHQodCl7cmV0dXJuIHR9bGluayh0LG4scil7cmV0dXJuIiIrcn1pbWFnZSh0LG4scil7cmV0dXJuIiIrcn1icigpe3JldHVybiIifX1jbGFzcyBJcntjb25zdHJ1Y3Rvcih0KXtKZSh0aGlzLCJvcHRpb25zIik7SmUodGhpcywicmVuZGVyZXIiKTtKZSh0aGlzLCJ0ZXh0UmVuZGVyZXIiKTt0aGlzLm9wdGlvbnM9dHx8Y2wsdGhpcy5vcHRpb25zLnJlbmRlcmVyPXRoaXMub3B0aW9ucy5yZW5kZXJlcnx8bmV3IE1kLHRoaXMucmVuZGVyZXI9dGhpcy5vcHRpb25zLnJlbmRlcmVyLHRoaXMucmVuZGVyZXIub3B0aW9ucz10aGlzLm9wdGlvbnMsdGhpcy50ZXh0UmVuZGVyZXI9bmV3IF92fXN0YXRpYyBwYXJzZSh0LG4pe3JldHVybiBuZXcgSXIobikucGFyc2UodCl9c3RhdGljIHBhcnNlSW5saW5lKHQsbil7cmV0dXJuIG5ldyBJcihuKS5wYXJzZUlubGluZSh0KX1wYXJzZSh0LG49ITApe2xldCByPSIiO2ZvcihsZXQgaT0wO2k8dC5sZW5ndGg7aSsrKXtjb25zdCBvPXRbaV07aWYodGhpcy5vcHRpb25zLmV4dGVuc2lvbnMmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVycyYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW28udHlwZV0pe2NvbnN0IGw9byxzPXRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVyc1tsLnR5cGVdLmNhbGwoe3BhcnNlcjp0aGlzfSxsKTtpZihzIT09ITF8fCFbInNwYWNlIiwiaHIiLCJoZWFkaW5nIiwiY29kZSIsInRhYmxlIiwiYmxvY2txdW90ZSIsImxpc3QiLCJodG1sIiwicGFyYWdyYXBoIiwidGV4dCJdLmluY2x1ZGVzKGwudHlwZSkpe3IrPXN8fCIiO2NvbnRpbnVlfX1zd2l0Y2goby50eXBlKXtjYXNlInNwYWNlIjpjb250aW51ZTtjYXNlImhyIjp7cis9dGhpcy5yZW5kZXJlci5ocigpO2NvbnRpbnVlfWNhc2UiaGVhZGluZyI6e2NvbnN0IGw9bztyKz10aGlzLnJlbmRlcmVyLmhlYWRpbmcodGhpcy5wYXJzZUlubGluZShsLnRva2VucyksbC5kZXB0aCxZUih0aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zLHRoaXMudGV4dFJlbmRlcmVyKSkpO2NvbnRpbnVlfWNhc2UiY29kZSI6e2NvbnN0IGw9bztyKz10aGlzLnJlbmRlcmVyLmNvZGUobC50ZXh0LGwubGFuZywhIWwuZXNjYXBlZCk7Y29udGludWV9Y2FzZSJ0YWJsZSI6e2NvbnN0IGw9bztsZXQgcz0iIixhPSIiO2ZvcihsZXQgYz0wO2M8bC5oZWFkZXIubGVuZ3RoO2MrKylhKz10aGlzLnJlbmRlcmVyLnRhYmxlY2VsbCh0aGlzLnBhcnNlSW5saW5lKGwuaGVhZGVyW2NdLnRva2Vucykse2hlYWRlcjohMCxhbGlnbjpsLmFsaWduW2NdfSk7cys9dGhpcy5yZW5kZXJlci50YWJsZXJvdyhhKTtsZXQgdT0iIjtmb3IobGV0IGM9MDtjPGwucm93cy5sZW5ndGg7YysrKXtjb25zdCBkPWwucm93c1tjXTthPSIiO2ZvcihsZXQgZj0wO2Y8ZC5sZW5ndGg7ZisrKWErPXRoaXMucmVuZGVyZXIudGFibGVjZWxsKHRoaXMucGFyc2VJbmxpbmUoZFtmXS50b2tlbnMpLHtoZWFkZXI6ITEsYWxpZ246bC5hbGlnbltmXX0pO3UrPXRoaXMucmVuZGVyZXIudGFibGVyb3coYSl9cis9dGhpcy5yZW5kZXJlci50YWJsZShzLHUpO2NvbnRpbnVlfWNhc2UiYmxvY2txdW90ZSI6e2NvbnN0IGw9byxzPXRoaXMucGFyc2UobC50b2tlbnMpO3IrPXRoaXMucmVuZGVyZXIuYmxvY2txdW90ZShzKTtjb250aW51ZX1jYXNlImxpc3QiOntjb25zdCBsPW8scz1sLm9yZGVyZWQsYT1sLnN0YXJ0LHU9bC5sb29zZTtsZXQgYz0iIjtmb3IobGV0IGQ9MDtkPGwuaXRlbXMubGVuZ3RoO2QrKyl7Y29uc3QgZj1sLml0ZW1zW2RdLGg9Zi5jaGVja2VkLG09Zi50YXNrO2xldCBnPSIiO2lmKGYudGFzayl7Y29uc3Qgdz10aGlzLnJlbmRlcmVyLmNoZWNrYm94KCEhaCk7dT9mLnRva2Vucy5sZW5ndGg+MCYmZi50b2tlbnNbMF0udHlwZT09PSJwYXJhZ3JhcGgiPyhmLnRva2Vuc1swXS50ZXh0PXcrIiAiK2YudG9rZW5zWzBdLnRleHQsZi50b2tlbnNbMF0udG9rZW5zJiZmLnRva2Vuc1swXS50b2tlbnMubGVuZ3RoPjAmJmYudG9rZW5zWzBdLnRva2Vuc1swXS50eXBlPT09InRleHQiJiYoZi50b2tlbnNbMF0udG9rZW5zWzBdLnRleHQ9dysiICIrZi50b2tlbnNbMF0udG9rZW5zWzBdLnRleHQpKTpmLnRva2Vucy51bnNoaWZ0KHt0eXBlOiJ0ZXh0Iix0ZXh0OncrIiAifSk6Zys9dysiICJ9Zys9dGhpcy5wYXJzZShmLnRva2Vucyx1KSxjKz10aGlzLnJlbmRlcmVyLmxpc3RpdGVtKGcsbSwhIWgpfXIrPXRoaXMucmVuZGVyZXIubGlzdChjLHMsYSk7Y29udGludWV9Y2FzZSJodG1sIjp7Y29uc3QgbD1vO3IrPXRoaXMucmVuZGVyZXIuaHRtbChsLnRleHQsbC5ibG9jayk7Y29udGludWV9Y2FzZSJwYXJhZ3JhcGgiOntjb25zdCBsPW87cis9dGhpcy5yZW5kZXJlci5wYXJhZ3JhcGgodGhpcy5wYXJzZUlubGluZShsLnRva2VucykpO2NvbnRpbnVlfWNhc2UidGV4dCI6e2xldCBsPW8scz1sLnRva2Vucz90aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zKTpsLnRleHQ7Zm9yKDtpKzE8dC5sZW5ndGgmJnRbaSsxXS50eXBlPT09InRleHQiOylsPXRbKytpXSxzKz1gCmArKGwudG9rZW5zP3RoaXMucGFyc2VJbmxpbmUobC50b2tlbnMpOmwudGV4dCk7cis9bj90aGlzLnJlbmRlcmVyLnBhcmFncmFwaChzKTpzO2NvbnRpbnVlfWRlZmF1bHQ6e2NvbnN0IGw9J1Rva2VuIHdpdGggIicrby50eXBlKyciIHR5cGUgd2FzIG5vdCBmb3VuZC4nO2lmKHRoaXMub3B0aW9ucy5zaWxlbnQpcmV0dXJuIGNvbnNvbGUuZXJyb3IobCksIiI7dGhyb3cgbmV3IEVycm9yKGwpfX19cmV0dXJuIHJ9cGFyc2VJbmxpbmUodCxuKXtuPW58fHRoaXMucmVuZGVyZXI7bGV0IHI9IiI7Zm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspe2NvbnN0IG89dFtpXTtpZih0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucyYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnNbby50eXBlXSl7Y29uc3QgbD10aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnNbby50eXBlXS5jYWxsKHtwYXJzZXI6dGhpc30sbyk7aWYobCE9PSExfHwhWyJlc2NhcGUiLCJodG1sIiwibGluayIsImltYWdlIiwic3Ryb25nIiwiZW0iLCJjb2Rlc3BhbiIsImJyIiwiZGVsIiwidGV4dCJdLmluY2x1ZGVzKG8udHlwZSkpe3IrPWx8fCIiO2NvbnRpbnVlfX1zd2l0Y2goby50eXBlKXtjYXNlImVzY2FwZSI6e2NvbnN0IGw9bztyKz1uLnRleHQobC50ZXh0KTticmVha31jYXNlImh0bWwiOntjb25zdCBsPW87cis9bi5odG1sKGwudGV4dCk7YnJlYWt9Y2FzZSJsaW5rIjp7Y29uc3QgbD1vO3IrPW4ubGluayhsLmhyZWYsbC50aXRsZSx0aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zLG4pKTticmVha31jYXNlImltYWdlIjp7Y29uc3QgbD1vO3IrPW4uaW1hZ2UobC5ocmVmLGwudGl0bGUsbC50ZXh0KTticmVha31jYXNlInN0cm9uZyI6e2NvbnN0IGw9bztyKz1uLnN0cm9uZyh0aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zLG4pKTticmVha31jYXNlImVtIjp7Y29uc3QgbD1vO3IrPW4uZW0odGhpcy5wYXJzZUlubGluZShsLnRva2VucyxuKSk7YnJlYWt9Y2FzZSJjb2Rlc3BhbiI6e2NvbnN0IGw9bztyKz1uLmNvZGVzcGFuKGwudGV4dCk7YnJlYWt9Y2FzZSJiciI6e3IrPW4uYnIoKTticmVha31jYXNlImRlbCI6e2NvbnN0IGw9bztyKz1uLmRlbCh0aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zLG4pKTticmVha31jYXNlInRleHQiOntjb25zdCBsPW87cis9bi50ZXh0KGwudGV4dCk7YnJlYWt9ZGVmYXVsdDp7Y29uc3QgbD0nVG9rZW4gd2l0aCAiJytvLnR5cGUrJyIgdHlwZSB3YXMgbm90IGZvdW5kLic7aWYodGhpcy5vcHRpb25zLnNpbGVudClyZXR1cm4gY29uc29sZS5lcnJvcihsKSwiIjt0aHJvdyBuZXcgRXJyb3IobCl9fX1yZXR1cm4gcn19Y2xhc3MgUmF7Y29uc3RydWN0b3IodCl7SmUodGhpcywib3B0aW9ucyIpO3RoaXMub3B0aW9ucz10fHxjbH1wcmVwcm9jZXNzKHQpe3JldHVybiB0fXBvc3Rwcm9jZXNzKHQpe3JldHVybiB0fX1KZShSYSwicGFzc1Rocm91Z2hIb29rcyIsbmV3IFNldChbInByZXByb2Nlc3MiLCJwb3N0cHJvY2VzcyJdKSk7dmFyIGJ1LHhtLG5mLGJFO2NsYXNzIHFSe2NvbnN0cnVjdG9yKC4uLnQpe25oKHRoaXMsYnUpO25oKHRoaXMsbmYpO0plKHRoaXMsImRlZmF1bHRzIix4digpKTtKZSh0aGlzLCJvcHRpb25zIix0aGlzLnNldE9wdGlvbnMpO0plKHRoaXMsInBhcnNlIixHdSh0aGlzLGJ1LHhtKS5jYWxsKHRoaXMsTHIubGV4LElyLnBhcnNlKSk7SmUodGhpcywicGFyc2VJbmxpbmUiLEd1KHRoaXMsYnUseG0pLmNhbGwodGhpcyxMci5sZXhJbmxpbmUsSXIucGFyc2VJbmxpbmUpKTtKZSh0aGlzLCJQYXJzZXIiLElyKTtKZSh0aGlzLCJSZW5kZXJlciIsTWQpO0plKHRoaXMsIlRleHRSZW5kZXJlciIsX3YpO0plKHRoaXMsIkxleGVyIixMcik7SmUodGhpcywiVG9rZW5pemVyIixBZCk7SmUodGhpcywiSG9va3MiLFJhKTt0aGlzLnVzZSguLi50KX13YWxrVG9rZW5zKHQsbil7dmFyIGksbztsZXQgcj1bXTtmb3IoY29uc3QgbCBvZiB0KXN3aXRjaChyPXIuY29uY2F0KG4uY2FsbCh0aGlzLGwpKSxsLnR5cGUpe2Nhc2UidGFibGUiOntjb25zdCBzPWw7Zm9yKGNvbnN0IGEgb2Ygcy5oZWFkZXIpcj1yLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoYS50b2tlbnMsbikpO2Zvcihjb25zdCBhIG9mIHMucm93cylmb3IoY29uc3QgdSBvZiBhKXI9ci5jb25jYXQodGhpcy53YWxrVG9rZW5zKHUudG9rZW5zLG4pKTticmVha31jYXNlImxpc3QiOntjb25zdCBzPWw7cj1yLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMocy5pdGVtcyxuKSk7YnJlYWt9ZGVmYXVsdDp7Y29uc3Qgcz1sOyhvPShpPXRoaXMuZGVmYXVsdHMuZXh0ZW5zaW9ucyk9PW51bGw/dm9pZCAwOmkuY2hpbGRUb2tlbnMpIT1udWxsJiZvW3MudHlwZV0/dGhpcy5kZWZhdWx0cy5leHRlbnNpb25zLmNoaWxkVG9rZW5zW3MudHlwZV0uZm9yRWFjaChhPT57cj1yLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoc1thXSxuKSl9KTpzLnRva2VucyYmKHI9ci5jb25jYXQodGhpcy53YWxrVG9rZW5zKHMudG9rZW5zLG4pKSl9fXJldHVybiByfXVzZSguLi50KXtjb25zdCBuPXRoaXMuZGVmYXVsdHMuZXh0ZW5zaW9uc3x8e3JlbmRlcmVyczp7fSxjaGlsZFRva2Vuczp7fX07cmV0dXJuIHQuZm9yRWFjaChyPT57Y29uc3QgaT17Li4ucn07aWYoaS5hc3luYz10aGlzLmRlZmF1bHRzLmFzeW5jfHxpLmFzeW5jfHwhMSxyLmV4dGVuc2lvbnMmJihyLmV4dGVuc2lvbnMuZm9yRWFjaChvPT57aWYoIW8ubmFtZSl0aHJvdyBuZXcgRXJyb3IoImV4dGVuc2lvbiBuYW1lIHJlcXVpcmVkIik7aWYoInJlbmRlcmVyImluIG8pe2NvbnN0IGw9bi5yZW5kZXJlcnNbby5uYW1lXTtsP24ucmVuZGVyZXJzW28ubmFtZV09ZnVuY3Rpb24oLi4ucyl7bGV0IGE9by5yZW5kZXJlci5hcHBseSh0aGlzLHMpO3JldHVybiBhPT09ITEmJihhPWwuYXBwbHkodGhpcyxzKSksYX06bi5yZW5kZXJlcnNbby5uYW1lXT1vLnJlbmRlcmVyfWlmKCJ0b2tlbml6ZXIiaW4gbyl7aWYoIW8ubGV2ZWx8fG8ubGV2ZWwhPT0iYmxvY2siJiZvLmxldmVsIT09ImlubGluZSIpdGhyb3cgbmV3IEVycm9yKCJleHRlbnNpb24gbGV2ZWwgbXVzdCBiZSAnYmxvY2snIG9yICdpbmxpbmUnIik7Y29uc3QgbD1uW28ubGV2ZWxdO2w/bC51bnNoaWZ0KG8udG9rZW5pemVyKTpuW28ubGV2ZWxdPVtvLnRva2VuaXplcl0sby5zdGFydCYmKG8ubGV2ZWw9PT0iYmxvY2siP24uc3RhcnRCbG9jaz9uLnN0YXJ0QmxvY2sucHVzaChvLnN0YXJ0KTpuLnN0YXJ0QmxvY2s9W28uc3RhcnRdOm8ubGV2ZWw9PT0iaW5saW5lIiYmKG4uc3RhcnRJbmxpbmU/bi5zdGFydElubGluZS5wdXNoKG8uc3RhcnQpOm4uc3RhcnRJbmxpbmU9W28uc3RhcnRdKSl9ImNoaWxkVG9rZW5zImluIG8mJm8uY2hpbGRUb2tlbnMmJihuLmNoaWxkVG9rZW5zW28ubmFtZV09by5jaGlsZFRva2Vucyl9KSxpLmV4dGVuc2lvbnM9biksci5yZW5kZXJlcil7Y29uc3Qgbz10aGlzLmRlZmF1bHRzLnJlbmRlcmVyfHxuZXcgTWQodGhpcy5kZWZhdWx0cyk7Zm9yKGNvbnN0IGwgaW4gci5yZW5kZXJlcil7Y29uc3Qgcz1yLnJlbmRlcmVyW2xdLGE9bCx1PW9bYV07b1thXT0oLi4uYyk9PntsZXQgZD1zLmFwcGx5KG8sYyk7cmV0dXJuIGQ9PT0hMSYmKGQ9dS5hcHBseShvLGMpKSxkfHwiIn19aS5yZW5kZXJlcj1vfWlmKHIudG9rZW5pemVyKXtjb25zdCBvPXRoaXMuZGVmYXVsdHMudG9rZW5pemVyfHxuZXcgQWQodGhpcy5kZWZhdWx0cyk7Zm9yKGNvbnN0IGwgaW4gci50b2tlbml6ZXIpe2NvbnN0IHM9ci50b2tlbml6ZXJbbF0sYT1sLHU9b1thXTtvW2FdPSguLi5jKT0+e2xldCBkPXMuYXBwbHkobyxjKTtyZXR1cm4gZD09PSExJiYoZD11LmFwcGx5KG8sYykpLGR9fWkudG9rZW5pemVyPW99aWYoci5ob29rcyl7Y29uc3Qgbz10aGlzLmRlZmF1bHRzLmhvb2tzfHxuZXcgUmE7Zm9yKGNvbnN0IGwgaW4gci5ob29rcyl7Y29uc3Qgcz1yLmhvb2tzW2xdLGE9bCx1PW9bYV07UmEucGFzc1Rocm91Z2hIb29rcy5oYXMobCk/b1thXT1jPT57aWYodGhpcy5kZWZhdWx0cy5hc3luYylyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHMuY2FsbChvLGMpKS50aGVuKGY9PnUuY2FsbChvLGYpKTtjb25zdCBkPXMuY2FsbChvLGMpO3JldHVybiB1LmNhbGwobyxkKX06b1thXT0oLi4uYyk9PntsZXQgZD1zLmFwcGx5KG8sYyk7cmV0dXJuIGQ9PT0hMSYmKGQ9dS5hcHBseShvLGMpKSxkfX1pLmhvb2tzPW99aWYoci53YWxrVG9rZW5zKXtjb25zdCBvPXRoaXMuZGVmYXVsdHMud2Fsa1Rva2VucyxsPXIud2Fsa1Rva2VucztpLndhbGtUb2tlbnM9ZnVuY3Rpb24ocyl7bGV0IGE9W107cmV0dXJuIGEucHVzaChsLmNhbGwodGhpcyxzKSksbyYmKGE9YS5jb25jYXQoby5jYWxsKHRoaXMscykpKSxhfX10aGlzLmRlZmF1bHRzPXsuLi50aGlzLmRlZmF1bHRzLC4uLml9fSksdGhpc31zZXRPcHRpb25zKHQpe3JldHVybiB0aGlzLmRlZmF1bHRzPXsuLi50aGlzLmRlZmF1bHRzLC4uLnR9LHRoaXN9bGV4ZXIodCxuKXtyZXR1cm4gTHIubGV4KHQsbj8/dGhpcy5kZWZhdWx0cyl9cGFyc2VyKHQsbil7cmV0dXJuIElyLnBhcnNlKHQsbj8/dGhpcy5kZWZhdWx0cyl9fWJ1PW5ldyBXZWFrU2V0LHhtPWZ1bmN0aW9uKHQsbil7cmV0dXJuKHIsaSk9Pntjb25zdCBvPXsuLi5pfSxsPXsuLi50aGlzLmRlZmF1bHRzLC4uLm99O3RoaXMuZGVmYXVsdHMuYXN5bmM9PT0hMCYmby5hc3luYz09PSExJiYobC5zaWxlbnR8fGNvbnNvbGUud2FybigibWFya2VkKCk6IFRoZSBhc3luYyBvcHRpb24gd2FzIHNldCB0byB0cnVlIGJ5IGFuIGV4dGVuc2lvbi4gVGhlIGFzeW5jOiBmYWxzZSBvcHRpb24gc2VudCB0byBwYXJzZSB3aWxsIGJlIGlnbm9yZWQuIiksbC5hc3luYz0hMCk7Y29uc3Qgcz1HdSh0aGlzLG5mLGJFKS5jYWxsKHRoaXMsISFsLnNpbGVudCwhIWwuYXN5bmMpO2lmKHR5cGVvZiByPiJ1Inx8cj09PW51bGwpcmV0dXJuIHMobmV3IEVycm9yKCJtYXJrZWQoKTogaW5wdXQgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCBvciBudWxsIikpO2lmKHR5cGVvZiByIT0ic3RyaW5nIilyZXR1cm4gcyhuZXcgRXJyb3IoIm1hcmtlZCgpOiBpbnB1dCBwYXJhbWV0ZXIgaXMgb2YgdHlwZSAiK09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyKSsiLCBzdHJpbmcgZXhwZWN0ZWQiKSk7aWYobC5ob29rcyYmKGwuaG9va3Mub3B0aW9ucz1sKSxsLmFzeW5jKXJldHVybiBQcm9taXNlLnJlc29sdmUobC5ob29rcz9sLmhvb2tzLnByZXByb2Nlc3Mocik6cikudGhlbihhPT50KGEsbCkpLnRoZW4oYT0+bC53YWxrVG9rZW5zP1Byb21pc2UuYWxsKHRoaXMud2Fsa1Rva2VucyhhLGwud2Fsa1Rva2VucykpLnRoZW4oKCk9PmEpOmEpLnRoZW4oYT0+bihhLGwpKS50aGVuKGE9PmwuaG9va3M/bC5ob29rcy5wb3N0cHJvY2VzcyhhKTphKS5jYXRjaChzKTt0cnl7bC5ob29rcyYmKHI9bC5ob29rcy5wcmVwcm9jZXNzKHIpKTtjb25zdCBhPXQocixsKTtsLndhbGtUb2tlbnMmJnRoaXMud2Fsa1Rva2VucyhhLGwud2Fsa1Rva2Vucyk7bGV0IHU9bihhLGwpO3JldHVybiBsLmhvb2tzJiYodT1sLmhvb2tzLnBvc3Rwcm9jZXNzKHUpKSx1fWNhdGNoKGEpe3JldHVybiBzKGEpfX19LG5mPW5ldyBXZWFrU2V0LGJFPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHI9PntpZihyLm1lc3NhZ2UrPWAKUGxlYXNlIHJlcG9ydCB0aGlzIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZWRqcy9tYXJrZWQuYCx0KXtjb25zdCBpPSI8cD5BbiBlcnJvciBvY2N1cnJlZDo8L3A+PHByZT4iK01uKHIubWVzc2FnZSsiIiwhMCkrIjwvcHJlPiI7cmV0dXJuIG4/UHJvbWlzZS5yZXNvbHZlKGkpOml9aWYobilyZXR1cm4gUHJvbWlzZS5yZWplY3Qocik7dGhyb3cgcn19O2NvbnN0IFhvPW5ldyBxUjtmdW5jdGlvbiBIZShlLHQpe3JldHVybiBYby5wYXJzZShlLHQpfUhlLm9wdGlvbnM9SGUuc2V0T3B0aW9ucz1mdW5jdGlvbihlKXtyZXR1cm4gWG8uc2V0T3B0aW9ucyhlKSxIZS5kZWZhdWx0cz1Yby5kZWZhdWx0cyxDRShIZS5kZWZhdWx0cyksSGV9O0hlLmdldERlZmF1bHRzPXh2O0hlLmRlZmF1bHRzPWNsO0hlLnVzZT1mdW5jdGlvbiguLi5lKXtyZXR1cm4gWG8udXNlKC4uLmUpLEhlLmRlZmF1bHRzPVhvLmRlZmF1bHRzLENFKEhlLmRlZmF1bHRzKSxIZX07SGUud2Fsa1Rva2Vucz1mdW5jdGlvbihlLHQpe3JldHVybiBYby53YWxrVG9rZW5zKGUsdCl9O0hlLnBhcnNlSW5saW5lPVhvLnBhcnNlSW5saW5lO0hlLlBhcnNlcj1JcjtIZS5wYXJzZXI9SXIucGFyc2U7SGUuUmVuZGVyZXI9TWQ7SGUuVGV4dFJlbmRlcmVyPV92O0hlLkxleGVyPUxyO0hlLmxleGVyPUxyLmxleDtIZS5Ub2tlbml6ZXI9QWQ7SGUuSG9va3M9UmE7SGUucGFyc2U9SGU7SGUub3B0aW9ucztIZS5zZXRPcHRpb25zO0hlLnVzZTtIZS53YWxrVG9rZW5zO0hlLnBhcnNlSW5saW5lO0lyLnBhcnNlO2NvbnN0IGVPPUxyLmxleDtmdW5jdGlvbiB0TyhlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlfWZ1bmN0aW9uIG5PKGUsdCl7dmFyIG49ZT09bnVsbD9udWxsOnR5cGVvZiBTeW1ib2w8InUiJiZlW1N5bWJvbC5pdGVyYXRvcl18fGVbIkBAaXRlcmF0b3IiXTtpZihuIT1udWxsKXt2YXIgcixpLG8sbCxzPVtdLGE9ITAsdT0hMTt0cnl7aWYobz0obj1uLmNhbGwoZSkpLm5leHQsdD09PTApe2lmKE9iamVjdChuKSE9PW4pcmV0dXJuO2E9ITF9ZWxzZSBmb3IoOyEoYT0ocj1vLmNhbGwobikpLmRvbmUpJiYocy5wdXNoKHIudmFsdWUpLHMubGVuZ3RoIT09dCk7YT0hMCk7fWNhdGNoKGMpe3U9ITAsaT1jfWZpbmFsbHl7dHJ5e2lmKCFhJiZuLnJldHVybiE9bnVsbCYmKGw9bi5yZXR1cm4oKSxPYmplY3QobCkhPT1sKSlyZXR1cm59ZmluYWxseXtpZih1KXRocm93IGl9fXJldHVybiBzfX1mdW5jdGlvbiBfbShlLHQpeyh0PT1udWxsfHx0PmUubGVuZ3RoKSYmKHQ9ZS5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KHQpO248dDtuKyspcltuXT1lW25dO3JldHVybiByfWZ1bmN0aW9uIHd2KGUsdCl7aWYoZSl7aWYodHlwZW9mIGU9PSJzdHJpbmciKXJldHVybiBfbShlLHQpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKTtpZihuPT09Ik9iamVjdCImJmUuY29uc3RydWN0b3ImJihuPWUuY29uc3RydWN0b3IubmFtZSksbj09PSJNYXAifHxuPT09IlNldCIpcmV0dXJuIEFycmF5LmZyb20oZSk7aWYobj09PSJBcmd1bWVudHMifHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSlyZXR1cm4gX20oZSx0KX19ZnVuY3Rpb24gck8oKXt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9ZnVuY3Rpb24gaU8oZSx0KXtyZXR1cm4gdE8oZSl8fG5PKGUsdCl8fHd2KGUsdCl8fHJPKCl9ZnVuY3Rpb24gb08oZSx0KXtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsKXJldHVybiBlO3ZhciBuPWVbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZihuIT09dm9pZCAwKXt2YXIgcj1uLmNhbGwoZSx0fHwiZGVmYXVsdCIpO2lmKHR5cGVvZiByIT0ib2JqZWN0IilyZXR1cm4gcjt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybih0PT09InN0cmluZyI/U3RyaW5nOk51bWJlcikoZSl9ZnVuY3Rpb24gbE8oZSl7dmFyIHQ9b08oZSwic3RyaW5nIik7cmV0dXJuIHR5cGVvZiB0PT0ic3ltYm9sIj90OlN0cmluZyh0KX1mdW5jdGlvbiBxdChlLHQsbil7cmV0dXJuIHQ9bE8odCksdCBpbiBlP09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTplW3RdPW4sZX1mdW5jdGlvbiBzTyhlLHQpe3ZhciBuPXR5cGVvZiBTeW1ib2w8InUiJiZlW1N5bWJvbC5pdGVyYXRvcl18fGVbIkBAaXRlcmF0b3IiXTtpZighbil7aWYoQXJyYXkuaXNBcnJheShlKXx8KG49d3YoZSkpfHx0JiZlJiZ0eXBlb2YgZS5sZW5ndGg9PSJudW1iZXIiKXtuJiYoZT1uKTt2YXIgcj0wLGk9ZnVuY3Rpb24oKXt9O3JldHVybntzOmksbjpmdW5jdGlvbigpe3JldHVybiByPj1lLmxlbmd0aD97ZG9uZTohMH06e2RvbmU6ITEsdmFsdWU6ZVtyKytdfX0sZTpmdW5jdGlvbihhKXt0aHJvdyBhfSxmOml9fXRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS4KSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLmApfXZhciBvPSEwLGw9ITEscztyZXR1cm57czpmdW5jdGlvbigpe249bi5jYWxsKGUpfSxuOmZ1bmN0aW9uKCl7dmFyIGE9bi5uZXh0KCk7cmV0dXJuIG89YS5kb25lLGF9LGU6ZnVuY3Rpb24oYSl7bD0hMCxzPWF9LGY6ZnVuY3Rpb24oKXt0cnl7IW8mJm4ucmV0dXJuIT1udWxsJiZuLnJldHVybigpfWZpbmFsbHl7aWYobCl0aHJvdyBzfX19fWZ1bmN0aW9uIGFPKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIF9tKGUpfWZ1bmN0aW9uIHVPKGUpe2lmKHR5cGVvZiBTeW1ib2w8InUiJiZlW1N5bWJvbC5pdGVyYXRvcl0hPW51bGx8fGVbIkBAaXRlcmF0b3IiXSE9bnVsbClyZXR1cm4gQXJyYXkuZnJvbShlKX1mdW5jdGlvbiBjTygpe3Rocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9ZnVuY3Rpb24gd20oZSl7cmV0dXJuIGFPKGUpfHx1TyhlKXx8d3YoZSl8fGNPKCl9dmFyIGRPPS9eZGF0YTooaW1hZ2VcLyhwbmd8anBlZ3xqcGd8Z2lmfHdlYnB8Ym1wfHRpZmZ8aWNvfHN2Z1wreG1sKSk7YmFzZTY0LC87ZnVuY3Rpb24gU3YoZSl7dmFyIHQ9ZE8uZXhlYyhlKTtpZih0JiZ0WzFdKXJldHVybiB0WzFdfWZ1bmN0aW9uIEV2KGUpe3JldHVybiBlPT09ImltYWdlL3N2Zyt4bWwiPyJzdmciOmU9PT0iaW1hZ2Uvdm5kLm1pY3Jvc29mdC5pY29uIj8iaWNvIjplLnN0YXJ0c1dpdGgoImltYWdlLyIpP2Uuc2xpY2UoNik6ZX12YXIgZk89L15oKFtcZCtdKSQvO2Z1bmN0aW9uIGhPKGUpe3ZhciB0PWUuY2hpbGRyZW4ubWFwKHBPKTtyZXR1cm4gbU8odCl9ZnVuY3Rpb24gcE8oZSl7aWYoZS50eXBlPT09ImhlYWRpbmciKXt2YXIgdCxuPSIiLHI9TnVtYmVyKCh0PWUudGFnLm1hdGNoKGZPKSk9PT1udWxsfHx0PT09dm9pZCAwP3ZvaWQgMDp0WzFdKTtpZihOdW1iZXIuaXNOYU4ocikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGhlYWRlciBkZXB0aCIpO2Zvcih2YXIgaT0wO2k8TnVtYmVyKHIpO2krKyluKz0iIyI7dmFyIG89WyIiLmNvbmNhdChuLCIgIildO3JldHVybnt0eXBlOiJibG9jayIsY2hpbGRyZW46by5jb25jYXQuYXBwbHkobyx3bShlLmNoaWxkcmVuLm1hcChTbSkpKX19ZWxzZXtpZihlLnR5cGU9PT0icGFyYWdyYXBoIilyZXR1cm4gZS5jaGlsZHJlbi5sZW5ndGg9PT0wP3t0eXBlOiJibG9jayIsY2hpbGRyZW46WyI8YnIgLz4iXX06e3R5cGU6ImJsb2NrIixjaGlsZHJlbjplLmNoaWxkcmVuLm1hcChmdW5jdGlvbihzKXtyZXR1cm4gU20ocyl9KX07aWYoZS50eXBlPT09Imxpc3QiKXJldHVybnt0eXBlOiJibG9jayIsY2hpbGRyZW46ZS5jaGlsZHJlbi5mbGF0TWFwKGZ1bmN0aW9uKHMsYSl7cmV0dXJuIE5FKFJFKGUpLHMsMCxhPT09MCl9KX07dmFyIGw9ZTt0aHJvdyBuZXcgRXJyb3IoIlVuaGFuZGxlZCBub2RlIHR5cGU6ICIuY29uY2F0KCJ0eXBlImluIGw/ImV4aGF1c3RpdmVDaGVjay50eXBlIjoidW5rbm93biIpKX19ZnVuY3Rpb24gbU8oZSl7Zm9yKHZhciB0PVtgCmBdLG49W10scj17fSxpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV0sbD1zTyhvLmNoaWxkcmVuKSxzO3RyeXtmb3IobC5zKCk7IShzPWwubigpKS5kb25lOyl7dmFyIGE9cy52YWx1ZTtpZih0eXBlb2YgYT09InN0cmluZyIpdFt0Lmxlbmd0aC0xXSs9YTtlbHNle2lmKGEudHlwZT09PSJpbWFnZSIpbi5wdXNoKHhPKGEscikpO2Vsc2UgaWYoYS50eXBlPT09ImxpbmsiKW4ucHVzaCh3TyhhKSk7ZWxzZXt2YXIgdT1hO3Rocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCBub2RlIHR5cGU6ICIuY29uY2F0KEpTT04uc3RyaW5naWZ5KHUsbnVsbCwyKSkpfXQucHVzaCgiIil9fX1jYXRjaChjKXtsLmUoYyl9ZmluYWxseXtsLmYoKX1pPT09ZS5sZW5ndGgtMT90W3QubGVuZ3RoLTFdKz1gCmA6dFt0Lmxlbmd0aC0xXSs9YAoKYH1yZXR1cm4gcXQocXQocXQocXQoe30sbm4sInJpY2h0ZXh0IiksInRlbXBsYXRlU3RyaW5ncyIsdCksImV4cHJzIixuKSwiZmlsZXMiLHIpfWZ1bmN0aW9uIFRFKGUpe3ZhciB0PXR5cGVvZiBlLmZvcm1hdD09Im51bWJlciI/dk8oZS5mb3JtYXQpOltdLG49ZS50ZXh0LnRyaW1TdGFydCgpLHI9ZS50ZXh0Lmxlbmd0aC1uLmxlbmd0aDtuPW4udHJpbUVuZCgpO3ZhciBpPWUudGV4dC5sZW5ndGgtbi5sZW5ndGgtcjtyZXR1cm4gdC5pbmNsdWRlcygiYm9sZCIpJiZ0LmluY2x1ZGVzKCJpdGFsaWMiKT9uPSIqKioiLmNvbmNhdChuLCIqKioiKTp0LmluY2x1ZGVzKCJib2xkIik/bj0iKioiLmNvbmNhdChuLCIqKiIpOnQuaW5jbHVkZXMoIml0YWxpYyIpJiYobj0iXyIuY29uY2F0KG4sIl8iKSksdC5pbmNsdWRlcygibGluZS10aHJvdWdoIikmJihuPSJ+fiIuY29uY2F0KG4sIn5+IikpLCIiLmNvbmNhdCgiICIucmVwZWF0KHIpKS5jb25jYXQobikuY29uY2F0KCIgIi5yZXBlYXQoaSkpfWZ1bmN0aW9uIFNtKGUpe3JldHVybiBlLnR5cGU9PT0idGV4dCI/VEUoZSk6ZS50eXBlPT09ImxpbmVicmVhayI/YApgOmV9ZnVuY3Rpb24gTkUoZSx0LG4pe3ZhciByLGk9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLG89aT8iIjpgCmAsbD1bIiIuY29uY2F0KG8pLmNvbmNhdCgiICIucmVwZWF0KG4pKS5jb25jYXQoZSldO3JldHVybigocj10LmNoaWxkcmVuKT09PW51bGx8fHI9PT12b2lkIDB8fChyPXJbMF0pPT09bnVsbHx8cj09PXZvaWQgMD92b2lkIDA6ci50eXBlKSE9PSJsaXN0IiYmbC5wdXNoKCIgIiksbC5jb25jYXQodC5jaGlsZHJlbi5mbGF0TWFwKGZ1bmN0aW9uKHMpe3JldHVybiBzLnR5cGU9PT0ibGlzdCI/cy5jaGlsZHJlbi5mbGF0TWFwKGZ1bmN0aW9uKGEpe3JldHVybiBORShSRShzKSxhLG4rNCl9KTpbU20ocyldfSkpfWZ1bmN0aW9uIFJFKGUpe2lmKGUubGlzdFR5cGU9PT0iYnVsbGV0IilyZXR1cm4iLSI7aWYoZS5saXN0VHlwZT09PSJudW1iZXIiKXJldHVybiIxLiI7dGhyb3cgbmV3IEVycm9yKCJVbmhhbmRsZWQgbGlzdCB0eXBlOiAiLmNvbmNhdChlLmxpc3RUeXBlKSl9dmFyIGdPPXtib2xkOjEsaXRhbGljOjIsImxpbmUtdGhyb3VnaCI6NH07ZnVuY3Rpb24gdk8oZSl7cmV0dXJuIE9iamVjdC5lbnRyaWVzKGdPKS5mbGF0TWFwKGZ1bmN0aW9uKHQpe3ZhciBuPWlPKHQsMikscj1uWzBdLGk9blsxXTtyZXR1cm4oaSZlKT09PWk/W3JdOltdfSl9dmFyIHlPPW5ldyBUZXh0RW5jb2RlcjtmdW5jdGlvbiB4TyhlLHQpe2lmKGUuc3JjLnN0YXJ0c1dpdGgoImRhdGE6Iikpe3ZhciBuPWpuLmdldFNIQTI1Nkhhc2goeU8uZW5jb2RlKGUuc3JjKSkscj1TdihlLnNyYyk7aWYocj09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoIkNvdWxkIG5vdCBkZXRlY3QgTWltZSBUeXBlIGZvciBpbWFnZTogIi5jb25jYXQoZS5zcmMpKTt2YXIgaT1FdihyKSxvPSIvcHVibGljLyIuY29uY2F0KG4sIi4iKS5jb25jYXQoaSk7cmV0dXJuIHRbb109ZS5zcmMscXQocXQocXQoe30sbm4sImZpbGUiKSxSbixvKSwibWV0YWRhdGEiLHt3aWR0aDplLndpZHRofHwwLGhlaWdodDplLmhlaWdodHx8MCxzaGEyNTY6bnx8IiIsbWltZVR5cGU6cn0pfWVsc2V7dmFyIGw9X08oInNoYTI1NiIsZS5zcmMpO3JldHVybiBxdChxdChxdCh7fSxubiwiZmlsZSIpLFJuLCIvcHVibGljIi5jb25jYXQoZS5zcmMuc3BsaXQoIj8iKVswXSkpLCJtZXRhZGF0YSIse3dpZHRoOmUud2lkdGh8fDAsaGVpZ2h0OmUuaGVpZ2h0fHwwLHNoYTI1NjpsfHwiIixtaW1lVHlwZTplLm1pbWVUeXBlfHwiIn0pfX1mdW5jdGlvbiBfTyhlLHQpe3ZhciBuPXQuc3BsaXQoIj8iKTtpZighKG4ubGVuZ3RoPDIpKXt2YXIgcj1uWzFdLGk9bmV3IFVSTFNlYXJjaFBhcmFtcyhyKTtpZihpLmhhcyhlKSlyZXR1cm4gaS5nZXQoZSl9fWZ1bmN0aW9uIHdPKGUpe3JldHVybiBxdChxdChxdCh7fSxubiwibGluayIpLCJocmVmIixlLnVybCksImNoaWxkcmVuIixlLmNoaWxkcmVuLm1hcChURSkpfWZ1bmN0aW9uIG54KGUsdCl7dmFyIG49T2JqZWN0LmtleXMoZSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTt0JiYocj1yLmZpbHRlcihmdW5jdGlvbihpKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLGkpLmVudW1lcmFibGV9KSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gbHQoZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdIT1udWxsP2FyZ3VtZW50c1t0XTp7fTt0JTI/bngoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3F0KGUscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOm54KE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gZX12YXIgJHI9e3ZlcnNpb246MSxmb3JtYXQ6IiIsaW5kZW50OjAsZGlyZWN0aW9uOm51bGx9O2Z1bmN0aW9uIFBzKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtpZih0eXBlb2YgZT09InN0cmluZyIpcmV0dXJuIGx0KGx0KHt9LCRyKSx7fSx7dHlwZToidGV4dCIsZm9ybWF0OiIiLHRleHQ6ZX0pO2lmKCJ0YWciaW4gZSlzd2l0Y2goZS50YWcpe2Nhc2UiaDEiOnJldHVybiBnbChlKTtjYXNlImgyIjpyZXR1cm4gZ2woZSk7Y2FzZSJoMyI6cmV0dXJuIGdsKGUpO2Nhc2UiaDQiOnJldHVybiBnbChlKTtjYXNlImg1IjpyZXR1cm4gZ2woZSk7Y2FzZSJoNiI6cmV0dXJuIGdsKGUpO2Nhc2UibGkiOnJldHVybiBiTyhlKTtjYXNlInAiOnJldHVybiBrTyhlKTtjYXNlInVsIjpyZXR1cm4gcngoZSk7Y2FzZSJvbCI6cmV0dXJuIHJ4KGUpO2Nhc2Uic3BhbiI6cmV0dXJuIE9FKGUpO2Nhc2UiYSI6cmV0dXJuIEVPKGUpO2Nhc2UiaW1nIjpyZXR1cm4gU08oZSk7Y2FzZSJiciI6cmV0dXJuIHQ/bHQobHQoe30sJHIpLHt9LHt0eXBlOiJsaW5lYnJlYWsifSk6JE8oKTtkZWZhdWx0OnRocm93IEVycm9yKCJVbmV4cGVjdGVkIG5vZGUgdGFnOiAiK0pTT04uc3RyaW5naWZ5KGUsbnVsbCwyKSl9ZWxzZSB0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBub2RlOiAiK0pTT04uc3RyaW5naWZ5KGUsbnVsbCwyKSl9ZnVuY3Rpb24gU08oZSl7dmFyIHQ9ZS5zcmM7cmV0dXJuIGx0KGx0KHt9LCRyKSx7fSx7dHlwZToiaW1hZ2UiLHNyYzp0LHdpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0LG1pbWVUeXBlOmUubWltZVR5cGV9KX1mdW5jdGlvbiBFTyhlKXtyZXR1cm4gbHQobHQoe30sJHIpLHt9LHt0eXBlOiJsaW5rIix1cmw6ZS5ocmVmLGNoaWxkcmVuOmUuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBQcyh0KX0pfSl9ZnVuY3Rpb24gQ08oZSl7cmV0dXJuIGx0KGx0KHt9LCRyKSx7fSx7Zm9ybWF0OiIiLHR5cGU6InJvb3QiLGNoaWxkcmVuOmUuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBQcyh0KX0pfSl9ZnVuY3Rpb24gZ2woZSl7cmV0dXJuIGx0KGx0KHt9LCRyKSx7fSx7dHlwZToiaGVhZGluZyIsdGFnOmUudGFnLGNoaWxkcmVuOmUuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBQcyh0KX0pfSl9ZnVuY3Rpb24ga08oZSl7cmV0dXJuIGx0KGx0KHt9LCRyKSx7fSx7dHlwZToicGFyYWdyYXBoIixjaGlsZHJlbjplLmNoaWxkcmVuLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gUHModCwhMCl9KX0pfWZ1bmN0aW9uICRPKCl7cmV0dXJuIGx0KGx0KHt9LCRyKSx7fSx7dHlwZToicGFyYWdyYXBoIixjaGlsZHJlbjpbXX0pfWZ1bmN0aW9uIGJPKGUpe3JldHVybiBsdChsdCh7fSwkcikse30se3R5cGU6Imxpc3RpdGVtIixjaGlsZHJlbjplLmNoaWxkcmVuLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gUHModCwhMCl9KX0pfWZ1bmN0aW9uIHJ4KGUpe3JldHVybiBsdChsdCh7fSwkcikse30se3R5cGU6Imxpc3QiLGxpc3RUeXBlOmUudGFnPT09Im9sIj8ibnVtYmVyIjoiYnVsbGV0IixjaGlsZHJlbjplLmNoaWxkcmVuLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gUHModCl9KX0sZS5kaXI/e2RpcmVjdGlvbjplLmRpcn06e2RpcmVjdGlvbjpudWxsfSl9dmFyIFRPPXtib2xkOjEsaXRhbGljOjIsImxpbmUtdGhyb3VnaCI6NH07ZnVuY3Rpb24gTk8oZSl7cmV0dXJuIGUucmVkdWNlKGZ1bmN0aW9uKHQsbil7cmV0dXJuIHR8VE9bbl19LDApfWZ1bmN0aW9uIE9FKGUpe3ZhciB0PWUuY2hpbGRyZW5bMF07cmV0dXJuIHR5cGVvZiB0PT0ic3RyaW5nIj9sdChsdCh7fSwkcikse30se3R5cGU6InRleHQiLHRleHQ6dCxmb3JtYXQ6Tk8oZS5jbGFzc2VzKX0pOk9FKGx0KGx0KHt9LHQpLHt9LHtjbGFzc2VzOmUuY2xhc3Nlcy5jb25jYXQodC5jbGFzc2VzKX0pKX12YXIgRGQ9Jzx2YWwgdmFsdWU9IicsRW09JyI+JyxDbT0iPC92YWw+IjtmdW5jdGlvbiBwcihlLHQsbil7Zm9yKHZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMSxpPVtdLG89ZnVuY3Rpb24oKXt2YXIgYT1lW25dO2lmKGEudHlwZT09PSJoZWFkaW5nIilpLnB1c2goe3RhZzoiaCIuY29uY2F0KGEuZGVwdGgpLGNoaWxkcmVuOnByKGEudG9rZW5zP2EudG9rZW5zOltdLHQsMCkuY2hpbGRyZW59KTtlbHNlIGlmKGEudHlwZT09PSJwYXJhZ3JhcGgiKWkucHVzaCh7dGFnOiJwIixjaGlsZHJlbjpwcihhLnRva2Vucz9hLnRva2VuczpbXSx0LDApLmNoaWxkcmVufSk7ZWxzZSBpZihhLnR5cGU9PT0ic3Ryb25nIilpLnB1c2goe3RhZzoic3BhbiIsY2xhc3NlczpbImJvbGQiXSxjaGlsZHJlbjpwcihhLnRva2Vucz9hLnRva2VuczpbXSx0LDApLmNoaWxkcmVufSk7ZWxzZSBpZihhLnR5cGU9PT0iZW0iKWkucHVzaCh7dGFnOiJzcGFuIixjbGFzc2VzOlsiaXRhbGljIl0sY2hpbGRyZW46cHIoYS50b2tlbnM/YS50b2tlbnM6W10sdCwwKS5jaGlsZHJlbn0pO2Vsc2UgaWYoYS50eXBlPT09ImRlbCIpaS5wdXNoKHt0YWc6InNwYW4iLGNsYXNzZXM6WyJsaW5lLXRocm91Z2giXSxjaGlsZHJlbjpwcihhLnRva2Vucz9hLnRva2VuczpbXSx0LDApLmNoaWxkcmVufSk7ZWxzZSBpZihhLnR5cGU9PT0idGV4dCIpaWYoInRva2VucyJpbiBhJiZBcnJheS5pc0FycmF5KGEudG9rZW5zKSlpLnB1c2guYXBwbHkoaSx3bShwcihhLnRva2Vucyx0LG4scikuY2hpbGRyZW4pKTtlbHNlIGlmKHImJnR5cGVvZiBhLnJhdz09InN0cmluZyIpe3ZhciB1PWEucmF3LnNwbGl0KGAKYCksYz11LmZsYXRNYXAoZnVuY3Rpb24oRSwkKXtyZXR1cm4gJD09PXUubGVuZ3RoLTE/W0VdOltFLHt0YWc6ImJyIixjaGlsZHJlbjpbXX1dfSk7aS5wdXNoLmFwcGx5KGksd20oYykpfWVsc2UgaS5wdXNoKGEucmF3KTtlbHNlIGlmKGEudHlwZT09PSJsaXN0IilpLnB1c2goe3RhZzphLm9yZGVyZWQ/Im9sIjoidWwiLGNoaWxkcmVuOnByKGEuaXRlbXMsdCwwKS5jaGlsZHJlbn0pO2Vsc2UgaWYoYS50eXBlPT09Imxpc3RfaXRlbSIpaS5wdXNoKHt0YWc6ImxpIixjaGlsZHJlbjpwcihhLnRva2Vucz9hLnRva2VuczpbXSx0LDAsITApLmNoaWxkcmVufSk7ZWxzZSBpZihhLnR5cGUhPT0ic3BhY2UiKWlmKGEudHlwZT09PSJodG1sIil7aWYoYS50ZXh0PT09Q20pcmV0dXJue3Y6e2NoaWxkcmVuOmksY3Vyc29yOm59fTt2YXIgZD1hLnRleHQuaW5kZXhPZihFbSk7aWYoYS50ZXh0LnN0YXJ0c1dpdGgoRGQpJiZkPi0xKXt2YXIgZj1OdW1iZXIoYS50ZXh0LnNsaWNlKERkLmxlbmd0aCxkKSk7aWYoTnVtYmVyLmlzTmFOKGYpKXRocm93IEVycm9yKCJJbGxlZ2FsIHZhbCBpbnRlcm1lZGlhdGUgbm9kZTogIi5jb25jYXQoSlNPTi5zdHJpbmdpZnkoYSkpKTt2YXIgaD1wcihlLm1hcChmdW5jdGlvbihFKXtyZXR1cm4gRS50eXBlPT09ImxpbmsifHxFLnR5cGU9PT0ibGlzdCI/e3R5cGU6InRleHQiLHJhdzpFLnJhdyx0ZXh0OkUucmF3fTpFfSksdCxuKzEpLG09aC5jaGlsZHJlbixnPWguY3Vyc29yLHc9dFtmXTtpZih3Ll90eXBlPT09ImxpbmsiKWkucHVzaCh7dGFnOiJhIixocmVmOncuaHJlZixjaGlsZHJlbjptfSk7ZWxzZSBpZih3Ll90eXBlPT09ImZpbGUiKXt2YXIgdix5LF87aS5wdXNoKHt0YWc6ImltZyIsc3JjOmpuLmNvbnZlcnRGaWxlU291cmNlKHcpLnVybCx3aWR0aDoodj13Lm1ldGFkYXRhKT09PW51bGx8fHY9PT12b2lkIDA/dm9pZCAwOnYud2lkdGgsaGVpZ2h0Oih5PXcubWV0YWRhdGEpPT09bnVsbHx8eT09PXZvaWQgMD92b2lkIDA6eS5oZWlnaHQsbWltZVR5cGU6KF89dy5tZXRhZGF0YSk9PT1udWxsfHxfPT09dm9pZCAwP3ZvaWQgMDpfLm1pbWVUeXBlLGNoaWxkcmVuOltdfSl9bj1nfXZhciBTPS88YnJccypcLz8+L2dpO2EudGV4dC50cmltKCkubWF0Y2goUykmJmkucHVzaCh7dGFnOiJiciIsY2hpbGRyZW46W119KX1lbHNlIGEudHlwZT09PSJsaW5rIj9hLnJhdz09PWEuaHJlZj9pLnB1c2goYS5yYXcpOmkucHVzaCh7dGFnOiJhIixocmVmOmEuaHJlZixjaGlsZHJlbjpwcihhLnRva2Vucz9hLnRva2VuczpbXSx0LDApLmNoaWxkcmVufSk6YS50eXBlPT09ImJyIj9pLnB1c2goe3RhZzoiYnIiLGNoaWxkcmVuOltdfSk6Y29uc29sZS5lcnJvcigiQ291bGQgbm90IHBhcnNlIG1hcmtkb3duOiB1bnN1cHBvcnRlZCB0b2tlbiB0eXBlOiAiLmNvbmNhdChhLnR5cGUsIi4gRm91bmQ6ICIpLmNvbmNhdChhLnJhdykpO24rK30sbDtuPGUubGVuZ3RoOylpZihsPW8oKSxsKXJldHVybiBsLnY7cmV0dXJue2NoaWxkcmVuOmksY3Vyc29yOm59fWZ1bmN0aW9uIFBFKGUpe3ZhciB0PWUudGVtcGxhdGVTdHJpbmdzLG49ZS5leHBycyxyPXQuZmxhdE1hcChmdW5jdGlvbihhLHUpe3ZhciBjPW5bdV07cmV0dXJuIGM/Y1tubl09PT0ibGluayI/YS5jb25jYXQoIiIuY29uY2F0KERkKS5jb25jYXQodSkuY29uY2F0KEVtKS5jb25jYXQoYy5jaGlsZHJlblswXSkuY29uY2F0KENtKSk6YS5jb25jYXQoIiIuY29uY2F0KERkKS5jb25jYXQodSkuY29uY2F0KEVtKS5jb25jYXQoQ20pKTphfSkuam9pbigiIiksaT1lTyhyLHtnZm06ITB9KSxvPXByKGksbiwwKSxsPW8uY2hpbGRyZW4scz1vLmN1cnNvcjtpZihzIT09aS5sZW5ndGgpdGhyb3cgRXJyb3IoIlVuZXhwZWN0ZWRseSB0ZXJtaW5hdGVkIG1hcmtkb3duIHBhcnNpbmcuIFBvc3NpYmxlIHJlYXNvbjogdW5jbG9zZWQgaHRtbCB0YWc/Iik7cmV0dXJuIHF0KHF0KHt9LG5uLCJyaWNodGV4dCIpLCJjaGlsZHJlbiIsbCl9dmFyIHduPXt9LGJ0PXt9LFV0PXt9LGxlPXhlO2xldCBMZD1uZXcgTWFwO2Z1bmN0aW9uIGl4KGUpe2Zvcig7ZSE9bnVsbDspe2lmKGUubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSlyZXR1cm4gZTtlPWUuZmlyc3RDaGlsZH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBveChlKXtsZXQgdD1lLnBhcmVudE5vZGU7aWYodD09bnVsbCl0aHJvdyBFcnJvcigiU2hvdWxkIG5ldmVyIGhhcHBlbiIpO3JldHVyblt0LEFycmF5LmZyb20odC5jaGlsZE5vZGVzKS5pbmRleE9mKGUpXX1mdW5jdGlvbiBBRShlKXtsZXQgdD17fTtlPWUuc3BsaXQoIjsiKTtmb3IobGV0IG4gb2YgZSlpZihuIT09IiIpe2xldFtyLGldPW4uc3BsaXQoLzooW15dKykvKTt0W3IudHJpbSgpXT1pLnRyaW0oKX1yZXR1cm4gdH1mdW5jdGlvbiBJZChlKXtsZXQgdD1MZC5nZXQoZSk7cmV0dXJuIHQ9PT12b2lkIDAmJih0PUFFKGUpLExkLnNldChlLHQpKSx0fWZ1bmN0aW9uIFJPKGUpe2xldCB0PSIiO2ZvcihsZXQgbiBpbiBlKW4mJih0Kz1gJHtufTogJHtlW25dfTtgKTtyZXR1cm4gdH1mdW5jdGlvbiB2bChlLHQpe3ZhciBuPUlkKCJnZXRTdHlsZSJpbiBlP2UuZ2V0U3R5bGUoKTplLnN0eWxlKTt0PU9iamVjdC5lbnRyaWVzKHQpLnJlZHVjZSgocixbaSxvXSk9PihvPT09bnVsbD9kZWxldGUgcltpXTpyW2ldPW8sciksey4uLm59KSxuPVJPKHQpLGUuc2V0U3R5bGUobiksTGQuc2V0KG4sdCl9ZnVuY3Rpb24gTUUoZSx0KXt2YXIgbj1lLmdldE5vZGVzKCkscj1uLmxlbmd0aDtpZihsZS5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24oZSkpe2Zvcih2YXIgaT1sZS4kY3JlYXRlUmFuZ2VTZWxlY3Rpb24oKSxvPWkuYW5jaG9yLGw9aS5mb2N1cyxzPTA7czxyO3MrKyl7dmFyIGE9bltzXTtsZS5ERVBSRUNBVEVEXyRpc0dyaWRDZWxsTm9kZShhKSYmKG8uc2V0KGEuZ2V0S2V5KCksMCwiZWxlbWVudCIpLGwuc2V0KGEuZ2V0S2V5KCksYS5nZXRDaGlsZHJlblNpemUoKSwiZWxlbWVudCIpLE1FKGxlLiRub3JtYWxpemVTZWxlY3Rpb25fX0VYUEVSSU1FTlRBTChpKSx0KSl9bGUuJHNldFNlbGVjdGlvbihlKX1lbHNlIGlmKC0tcixpPW5bMF0sbz1uW3JdLGUuaXNDb2xsYXBzZWQoKSl2bChlLHQpO2Vsc2V7dmFyIHU9ZS5hbmNob3IsYz1lLmZvY3VzO3M9aS5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCxhPWMub2Zmc2V0O3ZhciBkPXUub2Zmc2V0LGY9dS5pc0JlZm9yZShjKTtsPWY/ZDphLGU9Zj9hOmQ7dmFyIGg9Zj91LnR5cGU6Yy50eXBlLG09Zj9jLnR5cGU6dS50eXBlO2lmKHU9Zj9jLmtleTp1LmtleSxsZS4kaXNUZXh0Tm9kZShpKSYmbD09PXMmJihjPWkuZ2V0TmV4dFNpYmxpbmcoKSxsZS4kaXNUZXh0Tm9kZShjKSYmKGw9ZD0wLGk9YykpLG4ubGVuZ3RoPT09MSlsZS4kaXNUZXh0Tm9kZShpKSYmKGw9aD09PSJlbGVtZW50Ij8wOmQ+YT9hOmQsZT1tPT09ImVsZW1lbnQiP3M6ZD5hP2Q6YSxsIT09ZSYmKGw9PT0wJiZlPT09cz8odmwoaSx0KSxpLnNlbGVjdChsLGUpKToobj1pLnNwbGl0VGV4dChsLGUpLG49bD09PTA/blswXTpuWzFdLHZsKG4sdCksbi5zZWxlY3QoMCxlLWwpKSkpO2Vsc2UgZm9yKGxlLiRpc1RleHROb2RlKGkpJiZsPGkuZ2V0VGV4dENvbnRlbnRTaXplKCkmJihsIT09MCYmKGk9aS5zcGxpdFRleHQobClbMV0pLHZsKGksdCkpLGxlLiRpc1RleHROb2RlKG8pJiYobD1vLmdldFRleHRDb250ZW50KCkubGVuZ3RoLG8uX19rZXkhPT11JiZlIT09MCYmKGU9bCksZSE9PWwmJihbb109by5zcGxpdFRleHQoZSkpLGUhPT0wJiZ2bChvLHQpKSxlPTE7ZTxyO2UrKylsPW5bZV0scz1sLmdldEtleSgpLGxlLiRpc1RleHROb2RlKGwpJiZzIT09aS5nZXRLZXkoKSYmcyE9PW8uZ2V0S2V5KCkmJiFsLmlzVG9rZW4oKSYmdmwobCx0KX19ZnVuY3Rpb24gT08oZSl7Zm9yKDtlIT09bnVsbCYmIWxlLiRpc1Jvb3RPclNoYWRvd1Jvb3QoZSk7KXtsZXQgdD1lLmdldExhdGVzdCgpLG49ZS5nZXRQYXJlbnQoKTt0LmdldENoaWxkcmVuU2l6ZSgpPT09MCYmZS5yZW1vdmUoITApLGU9bn19ZnVuY3Rpb24gemgoZSx0LG4scixpPW51bGwpe2lmKHQubGVuZ3RoIT09MCl7dmFyIG89dFswXSxsPW5ldyBNYXAscz1bXTtvPWxlLiRpc0VsZW1lbnROb2RlKG8pP286by5nZXRQYXJlbnRPclRocm93KCksby5pc0lubGluZSgpJiYobz1vLmdldFBhcmVudE9yVGhyb3coKSk7Zm9yKHZhciBhPSExO28hPT1udWxsOyl7dmFyIHU9by5nZXRQcmV2aW91c1NpYmxpbmcoKTtpZih1IT09bnVsbCl7bz11LGE9ITA7YnJlYWt9aWYobz1vLmdldFBhcmVudE9yVGhyb3coKSxsZS4kaXNSb290T3JTaGFkb3dSb290KG8pKWJyZWFrfXU9bmV3IFNldDtmb3IodmFyIGM9MDtjPG47YysrKXt2YXIgZD10W2NdO2xlLiRpc0VsZW1lbnROb2RlKGQpJiZkLmdldENoaWxkcmVuU2l6ZSgpPT09MCYmdS5hZGQoZC5nZXRLZXkoKSl9dmFyIGY9bmV3IFNldDtmb3IoYz0wO2M8bjtjKyspe2Q9dFtjXTt2YXIgaD1kLmdldFBhcmVudCgpO2lmKGghPT1udWxsJiZoLmlzSW5saW5lKCkmJihoPWguZ2V0UGFyZW50KCkpLGghPT1udWxsJiZsZS4kaXNMZWFmTm9kZShkKSYmIWYuaGFzKGQuZ2V0S2V5KCkpKXtpZihkPWguZ2V0S2V5KCksbC5nZXQoZCk9PT12b2lkIDApe2xldCBtPXIoKTttLnNldEZvcm1hdChoLmdldEZvcm1hdFR5cGUoKSksbS5zZXRJbmRlbnQoaC5nZXRJbmRlbnQoKSkscy5wdXNoKG0pLGwuc2V0KGQsbSksaC5nZXRDaGlsZHJlbigpLmZvckVhY2goZz0+e20uYXBwZW5kKGcpLGYuYWRkKGcuZ2V0S2V5KCkpLGxlLiRpc0VsZW1lbnROb2RlKGcpJiZnLmdldENoaWxkcmVuS2V5cygpLmZvckVhY2godz0+Zi5hZGQodykpfSksT08oaCl9fWVsc2UgdS5oYXMoZC5nZXRLZXkoKSkmJihoPXIoKSxoLnNldEZvcm1hdChkLmdldEZvcm1hdFR5cGUoKSksaC5zZXRJbmRlbnQoZC5nZXRJbmRlbnQoKSkscy5wdXNoKGgpLGQucmVtb3ZlKCEwKSl9aWYoaSE9PW51bGwpZm9yKHQ9MDt0PHMubGVuZ3RoO3QrKylpLmFwcGVuZChzW3RdKTtpZih0PW51bGwsbGUuJGlzUm9vdE9yU2hhZG93Um9vdChvKSlpZihhKWlmKGkhPT1udWxsKW8uaW5zZXJ0QWZ0ZXIoaSk7ZWxzZSBmb3IoaT1zLmxlbmd0aC0xOzA8PWk7aS0tKW8uaW5zZXJ0QWZ0ZXIoc1tpXSk7ZWxzZSBpZihhPW8uZ2V0Rmlyc3RDaGlsZCgpLGxlLiRpc0VsZW1lbnROb2RlKGEpJiYobz1hKSxhPT09bnVsbClpZihpKW8uYXBwZW5kKGkpO2Vsc2UgZm9yKGk9MDtpPHMubGVuZ3RoO2krKylhPXNbaV0sby5hcHBlbmQoYSksdD1hO2Vsc2UgaWYoaSE9PW51bGwpYS5pbnNlcnRCZWZvcmUoaSk7ZWxzZSBmb3Iobz0wO288cy5sZW5ndGg7bysrKWk9c1tvXSxhLmluc2VydEJlZm9yZShpKSx0PWk7ZWxzZSBpZihpKW8uaW5zZXJ0QWZ0ZXIoaSk7ZWxzZSBmb3IoaT1zLmxlbmd0aC0xOzA8PWk7aS0tKWE9c1tpXSxvLmluc2VydEFmdGVyKGEpLHQ9YTtzPWxlLiRnZXRQcmV2aW91c1NlbGVjdGlvbigpLGxlLiRpc1JhbmdlU2VsZWN0aW9uKHMpJiZzLmFuY2hvci5nZXROb2RlKCkuaXNBdHRhY2hlZCgpJiZzLmZvY3VzLmdldE5vZGUoKS5pc0F0dGFjaGVkKCk/bGUuJHNldFNlbGVjdGlvbihzLmNsb25lKCkpOnQhPT1udWxsP3Quc2VsZWN0RW5kKCk6ZS5kaXJ0eT0hMH19ZnVuY3Rpb24gREUoZSx0LG4scil7ZS5tb2RpZnkodD8iZXh0ZW5kIjoibW92ZSIsbixyKX1mdW5jdGlvbiBMRShlKXtyZXR1cm4gZT1lLmFuY2hvci5nZXROb2RlKCksKGxlLiRpc1Jvb3ROb2RlKGUpP2U6ZS5nZXRQYXJlbnRPclRocm93KCkpLmdldERpcmVjdGlvbigpPT09InJ0bCJ9VXQuJGFkZE5vZGVTdHlsZT1mdW5jdGlvbihlKXtlPWUuZ2V0U3R5bGUoKTtsZXQgdD1BRShlKTtMZC5zZXQoZSx0KX07VXQuJGNsb25lV2l0aFByb3BlcnRpZXM9ZnVuY3Rpb24oZSl7bGV0IHQ9ZS5jb25zdHJ1Y3Rvci5jbG9uZShlKTtyZXR1cm4gdC5fX3BhcmVudD1lLl9fcGFyZW50LHQuX19uZXh0PWUuX19uZXh0LHQuX19wcmV2PWUuX19wcmV2LGxlLiRpc0VsZW1lbnROb2RlKGUpJiZsZS4kaXNFbGVtZW50Tm9kZSh0KT8odC5fX2ZpcnN0PWUuX19maXJzdCx0Ll9fbGFzdD1lLl9fbGFzdCx0Ll9fc2l6ZT1lLl9fc2l6ZSx0Ll9fZm9ybWF0PWUuX19mb3JtYXQsdC5fX2luZGVudD1lLl9faW5kZW50LHQuX19kaXI9ZS5fX2Rpcix0KToobGUuJGlzVGV4dE5vZGUoZSkmJmxlLiRpc1RleHROb2RlKHQpJiYodC5fX2Zvcm1hdD1lLl9fZm9ybWF0LHQuX19zdHlsZT1lLl9fc3R5bGUsdC5fX21vZGU9ZS5fX21vZGUsdC5fX2RldGFpbD1lLl9fZGV0YWlsKSx0KX07VXQuJGdldFNlbGVjdGlvblN0eWxlVmFsdWVGb3JQcm9wZXJ0eT1mdW5jdGlvbihlLHQsbj0iIil7bGV0IHI9bnVsbCxpPWUuZ2V0Tm9kZXMoKTt2YXIgbz1lLmFuY2hvcixsPWUuZm9jdXMscz1lLmlzQmFja3dhcmQoKTtsZXQgYT1zP2wub2Zmc2V0Om8ub2Zmc2V0O2lmKG89cz9sLmdldE5vZGUoKTpvLmdldE5vZGUoKSxlLnN0eWxlIT09IiImJihlPUlkKGUuc3R5bGUpLGUhPT1udWxsJiZ0IGluIGUpKXJldHVybiBlW3RdO2ZvcihlPTA7ZTxpLmxlbmd0aDtlKyspe3ZhciB1PWlbZV07aWYoKGU9PT0wfHxhIT09MHx8IXUuaXMobykpJiZsZS4kaXNUZXh0Tm9kZSh1KSl7aWYobD10LHM9bix1PXUuZ2V0U3R5bGUoKSx1PUlkKHUpLGw9dSE9PW51bGwmJnVbbF18fHMscj09PW51bGwpcj1sO2Vsc2UgaWYociE9PWwpe3I9IiI7YnJlYWt9fX1yZXR1cm4gcj09PW51bGw/bjpyfTtVdC4kaXNBdE5vZGVFbmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZT09PSJ0ZXh0Ij9lLm9mZnNldD09PWUuZ2V0Tm9kZSgpLmdldFRleHRDb250ZW50U2l6ZSgpOmUub2Zmc2V0PT09ZS5nZXROb2RlKCkuZ2V0Q2hpbGRyZW5TaXplKCl9O1V0LiRpc1BhcmVudEVsZW1lbnRSVEw9TEU7VXQuJG1vdmVDYXJldFNlbGVjdGlvbj1ERTtVdC4kbW92ZUNoYXJhY3Rlcj1mdW5jdGlvbihlLHQsbil7bGV0IHI9TEUoZSk7REUoZSx0LG4/IXI6ciwiY2hhcmFjdGVyIil9O1V0LiRwYXRjaFN0eWxlVGV4dD1NRTtVdC4kc2VsZWN0QWxsPWZ1bmN0aW9uKGUpe2xldCB0PWUuYW5jaG9yO2U9ZS5mb2N1czt2YXIgbj10LmdldE5vZGUoKS5nZXRUb3BMZXZlbEVsZW1lbnRPclRocm93KCkuZ2V0UGFyZW50T3JUaHJvdygpO2xldCByPW4uZ2V0Rmlyc3REZXNjZW5kYW50KCk7bj1uLmdldExhc3REZXNjZW5kYW50KCk7bGV0IGk9ImVsZW1lbnQiLG89ImVsZW1lbnQiLGw9MDtsZS4kaXNUZXh0Tm9kZShyKT9pPSJ0ZXh0IjpsZS4kaXNFbGVtZW50Tm9kZShyKXx8cj09PW51bGx8fChyPXIuZ2V0UGFyZW50T3JUaHJvdygpKSxsZS4kaXNUZXh0Tm9kZShuKT8obz0idGV4dCIsbD1uLmdldFRleHRDb250ZW50U2l6ZSgpKTpsZS4kaXNFbGVtZW50Tm9kZShuKXx8bj09PW51bGx8fChuPW4uZ2V0UGFyZW50T3JUaHJvdygpKSxyJiZuJiYodC5zZXQoci5nZXRLZXkoKSwwLGkpLGUuc2V0KG4uZ2V0S2V5KCksbCxvKSl9O1V0LiRzZXRCbG9ja3NUeXBlPWZ1bmN0aW9uKGUsdCl7aWYoZS5hbmNob3Iua2V5PT09InJvb3QiKXt0PXQoKTt2YXIgbj1sZS4kZ2V0Um9vdCgpOyhlPW4uZ2V0Rmlyc3RDaGlsZCgpKT9lLnJlcGxhY2UodCwhMCk6bi5hcHBlbmQodCl9ZWxzZSBmb3Iobj1lLmdldE5vZGVzKCksZT1lLmFuY2hvci5nZXROb2RlKCkuZ2V0UGFyZW50T3JUaHJvdygpLG4uaW5kZXhPZihlKT09PS0xJiZuLnB1c2goZSksZS5pc0lubGluZSgpJiYoZT1lLmdldFBhcmVudE9yVGhyb3coKSxuLmluZGV4T2YoZSk9PT0tMSYmbi5wdXNoKGUpKSxlPTA7ZTxuLmxlbmd0aDtlKyspe2xldCBvPW5bZV07dmFyIHI9bztpZighbGUuJGlzRWxlbWVudE5vZGUocil8fGxlLiRpc1Jvb3RPclNoYWRvd1Jvb3Qocikpcj0hMTtlbHNle3ZhciBpPXIuZ2V0Rmlyc3RDaGlsZCgpO2k9aT09PW51bGx8fGxlLiRpc0xpbmVCcmVha05vZGUoaSl8fGxlLiRpc1RleHROb2RlKGkpfHxpLmlzSW5saW5lKCkscj0hci5pc0lubGluZSgpJiZyLmNhbkJlRW1wdHkoKSE9PSExJiZpfXImJihyPXQoKSxyLnNldEZvcm1hdChvLmdldEZvcm1hdFR5cGUoKSksci5zZXRJbmRlbnQoby5nZXRJbmRlbnQoKSksby5yZXBsYWNlKHIsITApKX19O1V0LiRzaG91bGRPdmVycmlkZURlZmF1bHRDaGFyYWN0ZXJTZWxlY3Rpb249ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1sZS4kZ2V0QWRqYWNlbnROb2RlKGUuZm9jdXMsdCksbGUuJGlzRGVjb3JhdG9yTm9kZShlKSYmIWUuaXNJc29sYXRlZCgpfHxsZS4kaXNFbGVtZW50Tm9kZShlKSYmIWUuaXNJbmxpbmUoKSYmIWUuY2FuQmVFbXB0eSgpfTtVdC4kc2xpY2VTZWxlY3RlZFRleHROb2RlQ29udGVudD1mdW5jdGlvbihlLHQpe2lmKHQuaXNTZWxlY3RlZCgpJiYhdC5pc1NlZ21lbnRlZCgpJiYhdC5pc1Rva2VuKCkmJihsZS4kaXNSYW5nZVNlbGVjdGlvbihlKXx8bGUuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKGUpKSl7dmFyIG49ZS5hbmNob3IuZ2V0Tm9kZSgpLHI9ZS5mb2N1cy5nZXROb2RlKCksaT10LmlzKG4pLG89dC5pcyhyKTtpZihpfHxvKXtpPWUuaXNCYWNrd2FyZCgpO2xldFtsLHNdPWUuZ2V0Q2hhcmFjdGVyT2Zmc2V0cygpO2U9bi5pcyhyKSxvPXQuaXMoaT9yOm4pLHI9dC5pcyhpP246ciksbj0wO2xldCBhO2U/KG49bD5zP3M6bCxhPWw+cz9sOnMpOm8/KG49aT9zOmwsYT12b2lkIDApOnImJihpPWk/bDpzLG49MCxhPWkpLHQuX190ZXh0PXQuX190ZXh0LnNsaWNlKG4sYSl9fXJldHVybiB0fTtVdC4kd3JhcE5vZGVzPWZ1bmN0aW9uKGUsdCxuPW51bGwpe3ZhciByPWUuZ2V0Tm9kZXMoKTtsZXQgaT1yLmxlbmd0aDt2YXIgbz1lLmFuY2hvcjtpZihpPT09MHx8aT09PTEmJm8udHlwZT09PSJlbGVtZW50IiYmby5nZXROb2RlKCkuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wKXtlPW8udHlwZT09PSJ0ZXh0Ij9vLmdldE5vZGUoKS5nZXRQYXJlbnRPclRocm93KCk6by5nZXROb2RlKCkscj1lLmdldENoaWxkcmVuKCk7bGV0IHM9dCgpO3Muc2V0Rm9ybWF0KGUuZ2V0Rm9ybWF0VHlwZSgpKSxzLnNldEluZGVudChlLmdldEluZGVudCgpKSxyLmZvckVhY2goYT0+cy5hcHBlbmQoYSkpLG4mJihzPW4uYXBwZW5kKHMpKSxlLnJlcGxhY2Uocyl9ZWxzZXtvPW51bGw7dmFyIGw9W107Zm9yKGxldCBzPTA7czxpO3MrKyl7bGV0IGE9cltzXTtsZS4kaXNSb290T3JTaGFkb3dSb290KGEpPyh6aChlLGwsbC5sZW5ndGgsdCxuKSxsPVtdLG89YSk6bz09PW51bGx8fG8hPT1udWxsJiZsZS4kaGFzQW5jZXN0b3IoYSxvKT9sLnB1c2goYSk6KHpoKGUsbCxsLmxlbmd0aCx0LG4pLGw9W2FdKX16aChlLGwsbC5sZW5ndGgsdCxuKX19O1V0LmNyZWF0ZURPTVJhbmdlPWZ1bmN0aW9uKGUsdCxuLHIsaSl7bGV0IG89dC5nZXRLZXkoKSxsPXIuZ2V0S2V5KCkscz1kb2N1bWVudC5jcmVhdGVSYW5nZSgpLGE9ZS5nZXRFbGVtZW50QnlLZXkobyk7aWYoZT1lLmdldEVsZW1lbnRCeUtleShsKSxsZS4kaXNUZXh0Tm9kZSh0KSYmKGE9aXgoYSkpLGxlLiRpc1RleHROb2RlKHIpJiYoZT1peChlKSksdD09PXZvaWQgMHx8cj09PXZvaWQgMHx8YT09PW51bGx8fGU9PT1udWxsKXJldHVybiBudWxsO2Eubm9kZU5hbWU9PT0iQlIiJiYoW2Esbl09b3goYSkpLGUubm9kZU5hbWU9PT0iQlIiJiYoW2UsaV09b3goZSkpLHQ9YS5maXJzdENoaWxkLGE9PT1lJiZ0IT1udWxsJiZ0Lm5vZGVOYW1lPT09IkJSIiYmbj09PTAmJmk9PT0wJiYoaT0xKTt0cnl7cy5zZXRTdGFydChhLG4pLHMuc2V0RW5kKGUsaSl9Y2F0Y2h7cmV0dXJuIG51bGx9cmV0dXJuIXMuY29sbGFwc2VkfHxuPT09aSYmbz09PWx8fChzLnNldFN0YXJ0KGUsaSkscy5zZXRFbmQoYSxuKSksc307VXQuY3JlYXRlUmVjdHNGcm9tRE9NUmFuZ2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmdldFJvb3RFbGVtZW50KCk7aWYobj09PW51bGwpcmV0dXJuW107ZT1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49Z2V0Q29tcHV0ZWRTdHlsZShuKSxuPXBhcnNlRmxvYXQobi5wYWRkaW5nTGVmdCkrcGFyc2VGbG9hdChuLnBhZGRpbmdSaWdodCksdD1BcnJheS5mcm9tKHQuZ2V0Q2xpZW50UmVjdHMoKSk7bGV0IHI9dC5sZW5ndGg7dC5zb3J0KChvLGwpPT57bGV0IHM9by50b3AtbC50b3A7cmV0dXJuIDM+PU1hdGguYWJzKHMpP28ubGVmdC1sLmxlZnQ6c30pO2xldCBpO2ZvcihsZXQgbz0wO288cjtvKyspe2xldCBsPXRbb10scz1sLndpZHRoK249PT1lLndpZHRoO2kmJmkudG9wPD1sLnRvcCYmaS50b3AraS5oZWlnaHQ+bC50b3AmJmkubGVmdCtpLndpZHRoPmwubGVmdHx8cz8odC5zcGxpY2Uoby0tLDEpLHItLSk6aT1sfXJldHVybiB0fTtVdC5nZXRTdHlsZU9iamVjdEZyb21DU1M9SWQ7VXQudHJpbVRleHRDb250ZW50RnJvbUFuY2hvcj1mdW5jdGlvbihlLHQsbil7bGV0IHI9dC5nZXROb2RlKCk7aWYobGUuJGlzRWxlbWVudE5vZGUocikpe3ZhciBpPXIuZ2V0RGVzY2VuZGFudEJ5SW5kZXgodC5vZmZzZXQpO2khPT1udWxsJiYocj1pKX1mb3IoOzA8biYmciE9PW51bGw7KXt2YXIgbz1yLmdldFByZXZpb3VzU2libGluZygpLGw9MDtpZihvPT09bnVsbCl7aT1yLmdldFBhcmVudE9yVGhyb3coKTtmb3IodmFyIHM9aS5nZXRQcmV2aW91c1NpYmxpbmcoKTtzPT09bnVsbDspe2lmKGk9aS5nZXRQYXJlbnQoKSxpPT09bnVsbCl7bz1udWxsO2JyZWFrfXM9aS5nZXRQcmV2aW91c1NpYmxpbmcoKX1pIT09bnVsbCYmKGw9aS5pc0lubGluZSgpPzA6MixvPWxlLiRpc0VsZW1lbnROb2RlKHMpP3MuZ2V0TGFzdERlc2NlbmRhbnQoKTpzKX1pZihzPXIuZ2V0VGV4dENvbnRlbnQoKSxzPT09IiImJmxlLiRpc0VsZW1lbnROb2RlKHIpJiYhci5pc0lubGluZSgpJiYocz1gCgpgKSxpPXMubGVuZ3RoLCFsZS4kaXNUZXh0Tm9kZShyKXx8bj49aSlzPXIuZ2V0UGFyZW50KCksci5yZW1vdmUoKSxzPT1udWxsfHxzLmdldENoaWxkcmVuU2l6ZSgpIT09MHx8bGUuJGlzUm9vdE5vZGUocyl8fHMucmVtb3ZlKCksbi09aStsLHI9bztlbHNle2xldCBhPXIuZ2V0S2V5KCk7bD1lLmdldEVkaXRvclN0YXRlKCkucmVhZCgoKT0+e2NvbnN0IGM9bGUuJGdldE5vZGVCeUtleShhKTtyZXR1cm4gbGUuJGlzVGV4dE5vZGUoYykmJmMuaXNTaW1wbGVUZXh0KCk/Yy5nZXRUZXh0Q29udGVudCgpOm51bGx9KSxvPWktbjtsZXQgdT1zLnNsaWNlKDAsbyk7bCE9PW51bGwmJmwhPT1zPyhuPWxlLiRnZXRQcmV2aW91c1NlbGVjdGlvbigpLGk9cixyLmlzU2ltcGxlVGV4dCgpP3Iuc2V0VGV4dENvbnRlbnQobCk6KGk9bGUuJGNyZWF0ZVRleHROb2RlKGwpLHIucmVwbGFjZShpKSksbGUuJGlzUmFuZ2VTZWxlY3Rpb24obikmJm4uaXNDb2xsYXBzZWQoKSYmKG49bi5hbmNob3Iub2Zmc2V0LGkuc2VsZWN0KG4sbikpKTpyLmlzU2ltcGxlVGV4dCgpPyhsPXQua2V5PT09YSxzPXQub2Zmc2V0LHM8biYmKHM9aSksbj1sP3MtbjowLGk9bD9zOm8sbCYmbj09PTA/KFtuXT1yLnNwbGl0VGV4dChuLGkpLG4ucmVtb3ZlKCkpOihbLG5dPXIuc3BsaXRUZXh0KG4saSksbi5yZW1vdmUoKSkpOihuPWxlLiRjcmVhdGVUZXh0Tm9kZSh1KSxyLnJlcGxhY2UobikpLG49MH19fTtjb25zdCBQTz1VdDt2YXIgbG89UE8sQU89bG8sRXQ9eGU7ZnVuY3Rpb24gTU8oZSl7bGV0IHQ9bmV3IFVSTFNlYXJjaFBhcmFtczt0LmFwcGVuZCgiY29kZSIsZSk7Zm9yKGxldCBuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0LmFwcGVuZCgidiIsYXJndW1lbnRzW25dKTt0aHJvdyBFcnJvcihgTWluaWZpZWQgTGV4aWNhbCBlcnJvciAjJHtlfTsgdmlzaXQgaHR0cHM6Ly9sZXhpY2FsLmRldi9kb2NzL2Vycm9yPyR7dH0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLmApfWZ1bmN0aW9uIElFKGUsdCl7Zm9yKGxldCBuIG9mIHQpaWYoZS50eXBlLnN0YXJ0c1dpdGgobikpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gakUoZSx0KXtmb3IoO2UhPT1FdC4kZ2V0Um9vdCgpJiZlIT1udWxsOyl7aWYodChlKSlyZXR1cm4gZTtlPWUuZ2V0UGFyZW50KCl9cmV0dXJuIG51bGx9YnQuJHNwbGl0Tm9kZT1FdC4kc3BsaXROb2RlO2J0LmlzSFRNTEFuY2hvckVsZW1lbnQ9RXQuaXNIVE1MQW5jaG9yRWxlbWVudDtidC5pc0hUTUxFbGVtZW50PUV0LmlzSFRNTEVsZW1lbnQ7YnQuJGRmcz1mdW5jdGlvbihlLHQpe2xldCBuPVtdO2U9KGV8fEV0LiRnZXRSb290KCkpLmdldExhdGVzdCgpLHQ9dHx8KEV0LiRpc0VsZW1lbnROb2RlKGUpP2UuZ2V0TGFzdERlc2NlbmRhbnQoKTplKTtmb3IodmFyIHI9ZSxpPTA7KHI9ci5nZXRQYXJlbnQoKSkhPT1udWxsOylpKys7Zm9yKHI9aTtlIT09bnVsbCYmIWUuaXModCk7KWlmKG4ucHVzaCh7ZGVwdGg6cixub2RlOmV9KSxFdC4kaXNFbGVtZW50Tm9kZShlKSYmMDxlLmdldENoaWxkcmVuU2l6ZSgpKWU9ZS5nZXRGaXJzdENoaWxkKCkscisrO2Vsc2UgZm9yKGk9bnVsbDtpPT09bnVsbCYmZSE9PW51bGw7KWk9ZS5nZXROZXh0U2libGluZygpLGk9PT1udWxsPyhlPWUuZ2V0UGFyZW50KCksci0tKTplPWk7cmV0dXJuIGUhPT1udWxsJiZlLmlzKHQpJiZuLnB1c2goe2RlcHRoOnIsbm9kZTplfSksbn07YnQuJGZpbHRlcj1mdW5jdGlvbihlLHQpe2xldCBuPVtdO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKXtsZXQgaT10KGVbcl0pO2khPT1udWxsJiZuLnB1c2goaSl9cmV0dXJuIG59O2J0LiRmaW5kTWF0Y2hpbmdQYXJlbnQ9akU7YnQuJGdldE5lYXJlc3RCbG9ja0VsZW1lbnRBbmNlc3Rvck9yVGhyb3c9ZnVuY3Rpb24oZSl7bGV0IHQ9akUoZSxuPT5FdC4kaXNFbGVtZW50Tm9kZShuKSYmIW4uaXNJbmxpbmUoKSk7cmV0dXJuIEV0LiRpc0VsZW1lbnROb2RlKHQpfHxNTyg0LGUuX19rZXkpLHR9O2J0LiRnZXROZWFyZXN0Tm9kZU9mVHlwZT1mdW5jdGlvbihlLHQpe2Zvcig7ZSE9bnVsbDspe2lmKGUgaW5zdGFuY2VvZiB0KXJldHVybiBlO2U9ZS5nZXRQYXJlbnQoKX1yZXR1cm4gbnVsbH07YnQuJGluc2VydEZpcnN0PWZ1bmN0aW9uKGUsdCl7bGV0IG49ZS5nZXRGaXJzdENoaWxkKCk7biE9PW51bGw/bi5pbnNlcnRCZWZvcmUodCk6ZS5hcHBlbmQodCl9O2J0LiRpbnNlcnROb2RlVG9OZWFyZXN0Um9vdD1mdW5jdGlvbihlKXt2YXIgdD1FdC4kZ2V0U2VsZWN0aW9uKCl8fEV0LiRnZXRQcmV2aW91c1NlbGVjdGlvbigpO2lmKEV0LiRpc1JhbmdlU2VsZWN0aW9uKHQpKXt2YXJ7Zm9jdXM6bn09dDtpZih0PW4uZ2V0Tm9kZSgpLG49bi5vZmZzZXQsRXQuJGlzUm9vdE9yU2hhZG93Um9vdCh0KSluPXQuZ2V0Q2hpbGRBdEluZGV4KG4pLG49PW51bGw/dC5hcHBlbmQoZSk6bi5pbnNlcnRCZWZvcmUoZSksZS5zZWxlY3ROZXh0KCk7ZWxzZXtsZXQgcixpO0V0LiRpc1RleHROb2RlKHQpPyhyPXQuZ2V0UGFyZW50T3JUaHJvdygpLGk9dC5nZXRJbmRleFdpdGhpblBhcmVudCgpLDA8biYmKGkrPTEsdC5zcGxpdFRleHQobikpKToocj10LGk9biksWyx0XT1FdC4kc3BsaXROb2RlKHIsaSksdC5pbnNlcnRCZWZvcmUoZSksdC5zZWxlY3RTdGFydCgpfX1lbHNlIEV0LiRpc05vZGVTZWxlY3Rpb24odCl8fEV0LkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbih0KT8odD10LmdldE5vZGVzKCksdFt0Lmxlbmd0aC0xXS5nZXRUb3BMZXZlbEVsZW1lbnRPclRocm93KCkuaW5zZXJ0QWZ0ZXIoZSkpOkV0LiRnZXRSb290KCkuYXBwZW5kKGUpLHQ9RXQuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKSxlLmluc2VydEFmdGVyKHQpLHQuc2VsZWN0KCk7cmV0dXJuIGUuZ2V0TGF0ZXN0KCl9O2J0LiRyZXN0b3JlRWRpdG9yU3RhdGU9ZnVuY3Rpb24oZSx0KXtsZXQgbj1uZXcgTWFwLHI9ZS5fcGVuZGluZ0VkaXRvclN0YXRlO2ZvcihsZXRbaSxvXW9mIHQuX25vZGVNYXApe2xldCBsPUFPLiRjbG9uZVdpdGhQcm9wZXJ0aWVzKG8pO0V0LiRpc1RleHROb2RlKGwpJiYobC5fX3RleHQ9by5fX3RleHQpLG4uc2V0KGksbCl9ciYmKHIuX25vZGVNYXA9biksZS5fZGlydHlUeXBlPTIsZT10Ll9zZWxlY3Rpb24sRXQuJHNldFNlbGVjdGlvbihlPT09bnVsbD9udWxsOmUuY2xvbmUoKSl9O2J0LiR3cmFwTm9kZUluRWxlbWVudD1mdW5jdGlvbihlLHQpe3JldHVybiB0PXQoKSxlLnJlcGxhY2UodCksdC5hcHBlbmQoZSksdH07YnQuYWRkQ2xhc3NOYW1lc1RvRWxlbWVudD1mdW5jdGlvbihlLC4uLnQpe3QuZm9yRWFjaChuPT57dHlwZW9mIG49PSJzdHJpbmciJiYobj1uLnNwbGl0KCIgIikuZmlsdGVyKHI9PnIhPT0iIiksZS5jbGFzc0xpc3QuYWRkKC4uLm4pKX0pfTtidC5pc01pbWVUeXBlPUlFO2J0Lm1lZGlhRmlsZVJlYWRlcj1mdW5jdGlvbihlLHQpe2xldCBuPWVbU3ltYm9sLml0ZXJhdG9yXSgpO3JldHVybiBuZXcgUHJvbWlzZSgocixpKT0+e2xldCBvPVtdLGw9KCk9Pntjb25zdHtkb25lOnMsdmFsdWU6YX09bi5uZXh0KCk7aWYocylyZXR1cm4gcihvKTtjb25zdCB1PW5ldyBGaWxlUmVhZGVyO3UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGkpLHUuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKCk9Pntjb25zdCBjPXUucmVzdWx0O3R5cGVvZiBjPT0ic3RyaW5nIiYmby5wdXNoKHtmaWxlOmEscmVzdWx0OmN9KSxsKCl9KSxJRShhLHQpP3UucmVhZEFzRGF0YVVSTChhKTpsKCl9O2woKX0pfTtidC5tZXJnZVJlZ2lzdGVyPWZ1bmN0aW9uKC4uLmUpe3JldHVybigpPT57ZS5mb3JFYWNoKHQ9PnQoKSl9fTtidC5vYmplY3RLbGFzc0VxdWFscz1mdW5jdGlvbihlLHQpe3JldHVybiBlIT09bnVsbD9PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkuY29uc3RydWN0b3IubmFtZT09PXQubmFtZTohMX07YnQucmVnaXN0ZXJOZXN0ZWRFbGVtZW50UmVzb2x2ZXI9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGUucmVnaXN0ZXJOb2RlVHJhbnNmb3JtKHQsaT0+e2U6e2Zvcih2YXIgbz1pLmdldENoaWxkcmVuKCksbD0wO2w8by5sZW5ndGg7bCsrKWlmKG9bbF1pbnN0YW5jZW9mIHQpe289bnVsbDticmVhayBlfWZvcihvPWk7byE9PW51bGw7KWlmKGw9byxvPW8uZ2V0UGFyZW50KCksbyBpbnN0YW5jZW9mIHQpe289e2NoaWxkOmwscGFyZW50Om99O2JyZWFrIGV9bz1udWxsfWlmKG8hPT1udWxsKXtjb25zdHtjaGlsZDpzLHBhcmVudDphfT1vO2lmKHMuaXMoaSkpe2lmKHIoYSxpKSxpPXMuZ2V0TmV4dFNpYmxpbmdzKCksbz1pLmxlbmd0aCxhLmluc2VydEFmdGVyKHMpLG8hPT0wKXtsPW4oYSkscy5pbnNlcnRBZnRlcihsKTtmb3IobGV0IHU9MDt1PG87dSsrKWwuYXBwZW5kKGlbdV0pfWEuY2FuQmVFbXB0eSgpfHxhLmdldENoaWxkcmVuU2l6ZSgpIT09MHx8YS5yZW1vdmUoKX19fSl9O2J0LnJlbW92ZUNsYXNzTmFtZXNGcm9tRWxlbWVudD1mdW5jdGlvbihlLC4uLnQpe3QuZm9yRWFjaChuPT57dHlwZW9mIG49PSJzdHJpbmciJiZlLmNsYXNzTGlzdC5yZW1vdmUoLi4ubi5zcGxpdCgiICIpKX0pfTtjb25zdCBETz1idDt2YXIgRnQ9RE8semU9eGUsc289RnQ7ZnVuY3Rpb24gZnMoZSl7bGV0IHQ9bmV3IFVSTFNlYXJjaFBhcmFtczt0LmFwcGVuZCgiY29kZSIsZSk7Zm9yKGxldCBuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0LmFwcGVuZCgidiIsYXJndW1lbnRzW25dKTt0aHJvdyBFcnJvcihgTWluaWZpZWQgTGV4aWNhbCBlcnJvciAjJHtlfTsgdmlzaXQgaHR0cHM6Ly9sZXhpY2FsLmRldi9kb2NzL2Vycm9yPyR7dH0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLmApfWZ1bmN0aW9uIHpFKGUpe2xldCB0PTE7Zm9yKGU9ZS5nZXRQYXJlbnQoKTtlIT1udWxsOyl7aWYoZnQoZSkpe2lmKGU9ZS5nZXRQYXJlbnQoKSxOZShlKSl7dCsrLGU9ZS5nZXRQYXJlbnQoKTtjb250aW51ZX1mcyg0MCl9YnJlYWt9cmV0dXJuIHR9ZnVuY3Rpb24ga20oZSl7ZT1lLmdldFBhcmVudCgpLE5lKGUpfHxmcyg0MCk7bGV0IHQ9ZTtmb3IoO3QhPT1udWxsOyl0PXQuZ2V0UGFyZW50KCksTmUodCkmJihlPXQpO3JldHVybiBlfWZ1bmN0aW9uIEZFKGUpe2xldCB0PVtdO2U9ZS5nZXRDaGlsZHJlbigpLmZpbHRlcihmdCk7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2xldCByPWVbbl0saT1yLmdldEZpcnN0Q2hpbGQoKTtOZShpKT90PXQuY29uY2F0KEZFKGkpKTp0LnB1c2gocil9cmV0dXJuIHR9ZnVuY3Rpb24gQXIoZSl7cmV0dXJuIGZ0KGUpJiZOZShlLmdldEZpcnN0Q2hpbGQoKSl9ZnVuY3Rpb24gTE8oZSl7Zm9yKDtlLmdldE5leHRTaWJsaW5nKCk9PW51bGwmJmUuZ2V0UHJldmlvdXNTaWJsaW5nKCk9PW51bGw7KXtsZXQgdD1lLmdldFBhcmVudCgpO2lmKHQ9PW51bGx8fCFmdChlKSYmIU5lKGUpKWJyZWFrO2U9dH1lLnJlbW92ZSgpfWZ1bmN0aW9uIGx4KGUpe3JldHVybiB6bigpLmFwcGVuZChlKX1mdW5jdGlvbiBCRShlLHQpe3JldHVybiBmdChlKSYmKHQubGVuZ3RoPT09MHx8dC5sZW5ndGg9PT0xJiZlLmlzKHRbMF0pJiZlLmdldENoaWxkcmVuU2l6ZSgpPT09MCl9ZnVuY3Rpb24gUW8oZSx0KXtlLnNwbGljZShlLmdldENoaWxkcmVuU2l6ZSgpLDAsdCl9ZnVuY3Rpb24gc3goZSx0KXtpZihOZShlKSlyZXR1cm4gZTtsZXQgbj1lLmdldFByZXZpb3VzU2libGluZygpLHI9ZS5nZXROZXh0U2libGluZygpLGk9em4oKTtyZXR1cm4gaS5zZXRGb3JtYXQoZS5nZXRGb3JtYXRUeXBlKCkpLGkuc2V0SW5kZW50KGUuZ2V0SW5kZW50KCkpLFFvKGksZS5nZXRDaGlsZHJlbigpKSxOZShuKSYmdD09PW4uZ2V0TGlzdFR5cGUoKT8obi5hcHBlbmQoaSksZS5yZW1vdmUoKSxOZShyKSYmdD09PXIuZ2V0TGlzdFR5cGUoKSYmKFFvKG4sci5nZXRDaGlsZHJlbigpKSxyLnJlbW92ZSgpKSxuKTpOZShyKSYmdD09PXIuZ2V0TGlzdFR5cGUoKT8oci5nZXRGaXJzdENoaWxkT3JUaHJvdygpLmluc2VydEJlZm9yZShpKSxlLnJlbW92ZSgpLHIpOih0PWduKHQpLHQuYXBwZW5kKGkpLGUucmVwbGFjZSh0KSxjbih0KSx0KX1mdW5jdGlvbiBVRShlLHQpe3ZhciBuPWUuZ2V0TGFzdENoaWxkKCk7bGV0IHI9dC5nZXRGaXJzdENoaWxkKCk7biYmciYmQXIobikmJkFyKHIpJiYoVUUobi5nZXRGaXJzdENoaWxkKCksci5nZXRGaXJzdENoaWxkKCkpLHIucmVtb3ZlKCkpLG49dC5nZXRDaGlsZHJlbigpLDA8bi5sZW5ndGgmJihlLmFwcGVuZCguLi5uKSxjbihlKSksdC5yZW1vdmUoKX1mdW5jdGlvbiBjbihlLHQpe2lmKGU9dHx8ZS5nZXRDaGlsZHJlbigpLGUhPT12b2lkIDApZm9yKHQ9MDt0PGUubGVuZ3RoO3QrKyl7bGV0IG89ZVt0XTtpZihmdChvKSl7bGV0IGw9by5nZXRWYWx1ZSgpO3ZhciBuPW8scj1uLmdldFBhcmVudCgpLGk9MTtmb3IociE9bnVsbCYmKE5lKHIpP2k9ci5nZXRTdGFydCgpOmZzKDQ0KSksbj1uLmdldFByZXZpb3VzU2libGluZ3MoKSxyPTA7cjxuLmxlbmd0aDtyKyspe2xldCBzPW5bcl07ZnQocykmJiFOZShzLmdldEZpcnN0Q2hpbGQoKSkmJmkrK31sIT09aSYmby5zZXRWYWx1ZShpKX19fWZ1bmN0aW9uIElPKGUpe2lmKCFBcihlKSl7dmFyIHQ9ZS5nZXRQYXJlbnQoKSxuPXQ/dC5nZXRQYXJlbnQoKTp2b2lkIDAscj1uP24uZ2V0UGFyZW50KCk6dm9pZCAwO2lmKE5lKHIpJiZmdChuKSYmTmUodCkpe3ZhciBpPXQ/dC5nZXRGaXJzdENoaWxkKCk6dm9pZCAwLG89dD90LmdldExhc3RDaGlsZCgpOnZvaWQgMDtpZihlLmlzKGkpKW4uaW5zZXJ0QmVmb3JlKGUpLHQuaXNFbXB0eSgpJiZuLnJlbW92ZSgpO2Vsc2UgaWYoZS5pcyhvKSluLmluc2VydEFmdGVyKGUpLHQuaXNFbXB0eSgpJiZuLnJlbW92ZSgpO2Vsc2V7dmFyIGw9dC5nZXRMaXN0VHlwZSgpO2k9em4oKTtsZXQgcz1nbihsKTtpLmFwcGVuZChzKSxlLmdldFByZXZpb3VzU2libGluZ3MoKS5mb3JFYWNoKGE9PnMuYXBwZW5kKGEpKSxvPXpuKCksbD1nbihsKSxvLmFwcGVuZChsKSxRbyhsLGUuZ2V0TmV4dFNpYmxpbmdzKCkpLG4uaW5zZXJ0QmVmb3JlKGkpLG4uaW5zZXJ0QWZ0ZXIobyksbi5yZXBsYWNlKGUpfWNuKHQpLGNuKHIpfX19bGV0IERmPWNsYXNzIFdFIGV4dGVuZHMgemUuRWxlbWVudE5vZGV7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4ibGlzdGl0ZW0ifXN0YXRpYyBjbG9uZSh0KXtyZXR1cm4gbmV3IFdFKHQuX192YWx1ZSx0Ll9fY2hlY2tlZCx0Ll9fa2V5KX1jb25zdHJ1Y3Rvcih0LG4scil7c3VwZXIociksdGhpcy5fX3ZhbHVlPXQ9PT12b2lkIDA/MTp0LHRoaXMuX19jaGVja2VkPW59Y3JlYXRlRE9NKHQpe2xldCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpIikscj10aGlzLmdldFBhcmVudCgpO3JldHVybiBOZShyKSYmci5nZXRMaXN0VHlwZSgpPT09ImNoZWNrIiYmdXgobix0aGlzLG51bGwpLG4udmFsdWU9dGhpcy5fX3ZhbHVlLGF4KG4sdC50aGVtZSx0aGlzKSxufXVwZGF0ZURPTSh0LG4scil7bGV0IGk9dGhpcy5nZXRQYXJlbnQoKTtyZXR1cm4gTmUoaSkmJmkuZ2V0TGlzdFR5cGUoKT09PSJjaGVjayImJnV4KG4sdGhpcyx0KSxuLnZhbHVlPXRoaXMuX192YWx1ZSxheChuLHIudGhlbWUsdGhpcyksITF9c3RhdGljIHRyYW5zZm9ybSgpe3JldHVybiB0PT57bGV0IG49dC5nZXRQYXJlbnQoKTtOZShuKSYmKGNuKG4pLG4uZ2V0TGlzdFR5cGUoKSE9PSJjaGVjayImJnQuZ2V0Q2hlY2tlZCgpIT1udWxsJiZ0LnNldENoZWNrZWQodm9pZCAwKSl9fXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm57bGk6KCk9Pih7Y29udmVyc2lvbjpqTyxwcmlvcml0eTowfSl9fXN0YXRpYyBpbXBvcnRKU09OKHQpe2xldCBuPXpuKCk7cmV0dXJuIG4uc2V0Q2hlY2tlZCh0LmNoZWNrZWQpLG4uc2V0VmFsdWUodC52YWx1ZSksbi5zZXRGb3JtYXQodC5mb3JtYXQpLG4uc2V0RGlyZWN0aW9uKHQuZGlyZWN0aW9uKSxufWV4cG9ydEpTT04oKXtyZXR1cm57Li4uc3VwZXIuZXhwb3J0SlNPTigpLGNoZWNrZWQ6dGhpcy5nZXRDaGVja2VkKCksdHlwZToibGlzdGl0ZW0iLHZhbHVlOnRoaXMuZ2V0VmFsdWUoKSx2ZXJzaW9uOjF9fWFwcGVuZCguLi50KXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7bGV0IHI9dFtuXTtpZih6ZS4kaXNFbGVtZW50Tm9kZShyKSYmdGhpcy5jYW5NZXJnZVdpdGgocikpe2xldCBpPXIuZ2V0Q2hpbGRyZW4oKTt0aGlzLmFwcGVuZCguLi5pKSxyLnJlbW92ZSgpfWVsc2Ugc3VwZXIuYXBwZW5kKHIpfXJldHVybiB0aGlzfXJlcGxhY2UodCxuKXtpZihmdCh0KSlyZXR1cm4gc3VwZXIucmVwbGFjZSh0KTt0aGlzLnNldEluZGVudCgwKTtsZXQgcj10aGlzLmdldFBhcmVudE9yVGhyb3coKTtpZighTmUocikpcmV0dXJuIHQ7aWYoci5fX2ZpcnN0PT09dGhpcy5nZXRLZXkoKSlyLmluc2VydEJlZm9yZSh0KTtlbHNlIGlmKHIuX19sYXN0PT09dGhpcy5nZXRLZXkoKSlyLmluc2VydEFmdGVyKHQpO2Vsc2V7bGV0IGk9Z24oci5nZXRMaXN0VHlwZSgpKSxvPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKTtmb3IoO287KXtsZXQgbD1vO289by5nZXROZXh0U2libGluZygpLGkuYXBwZW5kKGwpfXIuaW5zZXJ0QWZ0ZXIodCksdC5pbnNlcnRBZnRlcihpKX1yZXR1cm4gbiYmdGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2goaT0+e3QuYXBwZW5kKGkpfSksdGhpcy5yZW1vdmUoKSxyLmdldENoaWxkcmVuU2l6ZSgpPT09MCYmci5yZW1vdmUoKSx0fWluc2VydEFmdGVyKHQsbj0hMCl7dmFyIHI9dGhpcy5nZXRQYXJlbnRPclRocm93KCk7TmUocil8fGZzKDM5KTt2YXIgaT10aGlzLmdldE5leHRTaWJsaW5ncygpO2lmKGZ0KHQpKXJldHVybiBuPXN1cGVyLmluc2VydEFmdGVyKHQsbiksdD10LmdldFBhcmVudE9yVGhyb3coKSxOZSh0KSYmY24odCksbjtpZihOZSh0KSl7Zm9yKHI9dCx0PXQuZ2V0Q2hpbGRyZW4oKSxpPXQubGVuZ3RoLTE7MDw9aTtpLS0pcj10W2ldLHRoaXMuaW5zZXJ0QWZ0ZXIocixuKTtyZXR1cm4gcn1pZihyLmluc2VydEFmdGVyKHQsbiksaS5sZW5ndGghPT0wKXtsZXQgbz1nbihyLmdldExpc3RUeXBlKCkpO2kuZm9yRWFjaChsPT5vLmFwcGVuZChsKSksdC5pbnNlcnRBZnRlcihvLG4pfXJldHVybiB0fXJlbW92ZSh0KXtsZXQgbj10aGlzLmdldFByZXZpb3VzU2libGluZygpLHI9dGhpcy5nZXROZXh0U2libGluZygpO3N1cGVyLnJlbW92ZSh0KSxuJiZyJiZBcihuKSYmQXIocik/KFVFKG4uZ2V0Rmlyc3RDaGlsZCgpLHIuZ2V0Rmlyc3RDaGlsZCgpKSxyLnJlbW92ZSgpKTpyJiYodD1yLmdldFBhcmVudCgpLE5lKHQpJiZjbih0KSl9aW5zZXJ0TmV3QWZ0ZXIodCxuPSEwKXtyZXR1cm4gdD16bih0aGlzLl9fY2hlY2tlZD09bnVsbD92b2lkIDA6ITEpLHRoaXMuaW5zZXJ0QWZ0ZXIodCxuKSx0fWNvbGxhcHNlQXRTdGFydCh0KXtsZXQgbj16ZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpO3RoaXMuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKGw9Pm4uYXBwZW5kKGwpKTt2YXIgcj10aGlzLmdldFBhcmVudE9yVGhyb3coKSxpPXIuZ2V0UGFyZW50T3JUaHJvdygpO2xldCBvPWZ0KGkpO3JldHVybiByLmdldENoaWxkcmVuU2l6ZSgpPT09MT9vPyhyLnJlbW92ZSgpLGkuc2VsZWN0KCkpOihyLmluc2VydEJlZm9yZShuKSxyLnJlbW92ZSgpLHI9dC5hbmNob3IsdD10LmZvY3VzLGk9bi5nZXRLZXkoKSxyLnR5cGU9PT0iZWxlbWVudCImJnIuZ2V0Tm9kZSgpLmlzKHRoaXMpJiZyLnNldChpLHIub2Zmc2V0LCJlbGVtZW50IiksdC50eXBlPT09ImVsZW1lbnQiJiZ0LmdldE5vZGUoKS5pcyh0aGlzKSYmdC5zZXQoaSx0Lm9mZnNldCwiZWxlbWVudCIpKTooci5pbnNlcnRCZWZvcmUobiksdGhpcy5yZW1vdmUoKSksITB9Z2V0VmFsdWUoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3ZhbHVlfXNldFZhbHVlKHQpe3RoaXMuZ2V0V3JpdGFibGUoKS5fX3ZhbHVlPXR9Z2V0Q2hlY2tlZCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fY2hlY2tlZH1zZXRDaGVja2VkKHQpe3RoaXMuZ2V0V3JpdGFibGUoKS5fX2NoZWNrZWQ9dH10b2dnbGVDaGVja2VkKCl7dGhpcy5zZXRDaGVja2VkKCF0aGlzLl9fY2hlY2tlZCl9Z2V0SW5kZW50KCl7dmFyIHQ9dGhpcy5nZXRQYXJlbnQoKTtpZih0PT09bnVsbClyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX2luZGVudDt0PXQuZ2V0UGFyZW50T3JUaHJvdygpO2xldCBuPTA7Zm9yKDtmdCh0KTspdD10LmdldFBhcmVudE9yVGhyb3coKS5nZXRQYXJlbnRPclRocm93KCksbisrO3JldHVybiBufXNldEluZGVudCh0KXt0eXBlb2YgdD09Im51bWJlciImJi0xPHR8fGZzKDExNyk7bGV0IG49dGhpcy5nZXRJbmRlbnQoKTtmb3IoO24hPT10OylpZihuPHQpe2U6e3ZhciByPW5ldyBTZXQ7aWYoQXIodGhpcyl8fHIuaGFzKHRoaXMuZ2V0S2V5KCkpKWJyZWFrIGU7bGV0IHM9dGhpcy5nZXRQYXJlbnQoKTt2YXIgaT10aGlzLmdldE5leHRTaWJsaW5nKCksbz10aGlzLmdldFByZXZpb3VzU2libGluZygpO2lmKEFyKGkpJiZBcihvKSl7aWYobz1vLmdldEZpcnN0Q2hpbGQoKSxOZShvKSl7by5hcHBlbmQodGhpcyk7dmFyIGw9aS5nZXRGaXJzdENoaWxkKCk7TmUobCkmJihsPWwuZ2V0Q2hpbGRyZW4oKSxRbyhvLGwpLGkucmVtb3ZlKCksci5hZGQoaS5nZXRLZXkoKSkpLGNuKG8pfX1lbHNlIEFyKGkpPyhpPWkuZ2V0Rmlyc3RDaGlsZCgpLE5lKGkpJiYocj1pLmdldEZpcnN0Q2hpbGQoKSxyIT09bnVsbCYmci5pbnNlcnRCZWZvcmUodGhpcyksY24oaSkpKTpBcihvKT8oaT1vLmdldEZpcnN0Q2hpbGQoKSxOZShpKSYmKGkuYXBwZW5kKHRoaXMpLGNuKGkpKSk6TmUocykmJihyPXpuKCksbD1nbihzLmdldExpc3RUeXBlKCkpLHIuYXBwZW5kKGwpLGwuYXBwZW5kKHRoaXMpLG8/by5pbnNlcnRBZnRlcihyKTppP2kuaW5zZXJ0QmVmb3JlKHIpOnMuYXBwZW5kKHIpLGNuKGwpKTtOZShzKSYmY24ocyl9bisrfWVsc2UgSU8odGhpcyksbi0tO3JldHVybiB0aGlzfWluc2VydEJlZm9yZSh0KXtpZihmdCh0KSl7bGV0IG49dGhpcy5nZXRQYXJlbnRPclRocm93KCk7aWYoTmUobikpe2xldCByPXRoaXMuZ2V0TmV4dFNpYmxpbmdzKCk7Y24obixyKX19cmV0dXJuIHN1cGVyLmluc2VydEJlZm9yZSh0KX1jYW5JbnNlcnRBZnRlcih0KXtyZXR1cm4gZnQodCl9Y2FuUmVwbGFjZVdpdGgodCl7cmV0dXJuIGZ0KHQpfWNhbk1lcmdlV2l0aCh0KXtyZXR1cm4gemUuJGlzUGFyYWdyYXBoTm9kZSh0KXx8ZnQodCl9ZXh0cmFjdFdpdGhDaGlsZCh0LG4pe2lmKCF6ZS4kaXNSYW5nZVNlbGVjdGlvbihuKSlyZXR1cm4hMTt0PW4uYW5jaG9yLmdldE5vZGUoKTtsZXQgcj1uLmZvY3VzLmdldE5vZGUoKTtyZXR1cm4gdGhpcy5pc1BhcmVudE9mKHQpJiZ0aGlzLmlzUGFyZW50T2YocikmJnRoaXMuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGg9PT1uLmdldFRleHRDb250ZW50KCkubGVuZ3RofWlzUGFyZW50UmVxdWlyZWQoKXtyZXR1cm4hMH1jcmVhdGVQYXJlbnRFbGVtZW50Tm9kZSgpe3JldHVybiBnbigiYnVsbGV0Iil9fTtmdW5jdGlvbiBheChlLHQsbil7bGV0IHI9W10saT1bXTt2YXIgbz0odD10Lmxpc3QpP3QubGlzdGl0ZW06dm9pZCAwO2lmKHQmJnQubmVzdGVkKXZhciBsPXQubmVzdGVkLmxpc3RpdGVtO2lmKG8hPT12b2lkIDAmJihvPW8uc3BsaXQoIiAiKSxyLnB1c2goLi4ubykpLHQpe289bi5nZXRQYXJlbnQoKSxvPU5lKG8pJiZvLmdldExpc3RUeXBlKCk9PT0iY2hlY2siO2xldCBzPW4uZ2V0Q2hlY2tlZCgpO28mJiFzfHxpLnB1c2godC5saXN0aXRlbVVuY2hlY2tlZCksbyYmc3x8aS5wdXNoKHQubGlzdGl0ZW1DaGVja2VkKSxvJiZyLnB1c2gocz90Lmxpc3RpdGVtQ2hlY2tlZDp0Lmxpc3RpdGVtVW5jaGVja2VkKX1sIT09dm9pZCAwJiYobD1sLnNwbGl0KCIgIiksbi5nZXRDaGlsZHJlbigpLnNvbWUocz0+TmUocykpP3IucHVzaCguLi5sKTppLnB1c2goLi4ubCkpLDA8aS5sZW5ndGgmJnNvLnJlbW92ZUNsYXNzTmFtZXNGcm9tRWxlbWVudChlLC4uLmkpLDA8ci5sZW5ndGgmJnNvLmFkZENsYXNzTmFtZXNUb0VsZW1lbnQoZSwuLi5yKX1mdW5jdGlvbiB1eChlLHQsbil7TmUodC5nZXRGaXJzdENoaWxkKCkpPyhlLnJlbW92ZUF0dHJpYnV0ZSgicm9sZSIpLGUucmVtb3ZlQXR0cmlidXRlKCJ0YWJJbmRleCIpLGUucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWNoZWNrZWQiKSk6KGUuc2V0QXR0cmlidXRlKCJyb2xlIiwiY2hlY2tib3giKSxlLnNldEF0dHJpYnV0ZSgidGFiSW5kZXgiLCItMSIpLG4mJnQuX19jaGVja2VkPT09bi5fX2NoZWNrZWR8fGUuc2V0QXR0cmlidXRlKCJhcmlhLWNoZWNrZWQiLHQuZ2V0Q2hlY2tlZCgpPyJ0cnVlIjoiZmFsc2UiKSl9ZnVuY3Rpb24gak8oZSl7cmV0dXJuIGU9c28uaXNIVE1MRWxlbWVudChlKSYmZS5nZXRBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIpPT09InRydWUiLHtub2RlOnpuKGUpfX1mdW5jdGlvbiB6bihlKXtyZXR1cm4gemUuJGFwcGx5Tm9kZVJlcGxhY2VtZW50KG5ldyBEZih2b2lkIDAsZSkpfWZ1bmN0aW9uIGZ0KGUpe3JldHVybiBlIGluc3RhbmNlb2YgRGZ9bGV0IEN2PWNsYXNzIFZFIGV4dGVuZHMgemUuRWxlbWVudE5vZGV7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4ibGlzdCJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgVkUodC5fX2xpc3RUeXBlfHxmeFt0Ll9fdGFnXSx0Ll9fc3RhcnQsdC5fX2tleSl9Y29uc3RydWN0b3IodCxuLHIpe3N1cGVyKHIpLHRoaXMuX19saXN0VHlwZT10PWZ4W3RdfHx0LHRoaXMuX190YWc9dD09PSJudW1iZXIiPyJvbCI6InVsIix0aGlzLl9fc3RhcnQ9bn1nZXRUYWcoKXtyZXR1cm4gdGhpcy5fX3RhZ31zZXRMaXN0VHlwZSh0KXtsZXQgbj10aGlzLmdldFdyaXRhYmxlKCk7bi5fX2xpc3RUeXBlPXQsbi5fX3RhZz10PT09Im51bWJlciI/Im9sIjoidWwifWdldExpc3RUeXBlKCl7cmV0dXJuIHRoaXMuX19saXN0VHlwZX1nZXRTdGFydCgpe3JldHVybiB0aGlzLl9fc3RhcnR9Y3JlYXRlRE9NKHQpe2xldCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5fX3RhZyk7cmV0dXJuIHRoaXMuX19zdGFydCE9PTEmJm4uc2V0QXR0cmlidXRlKCJzdGFydCIsU3RyaW5nKHRoaXMuX19zdGFydCkpLG4uX19sZXhpY2FsTGlzdFR5cGU9dGhpcy5fX2xpc3RUeXBlLGN4KG4sdC50aGVtZSx0aGlzKSxufXVwZGF0ZURPTSh0LG4scil7cmV0dXJuIHQuX190YWchPT10aGlzLl9fdGFnPyEwOihjeChuLHIudGhlbWUsdGhpcyksITEpfXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm57b2w6KCk9Pih7Y29udmVyc2lvbjpkeCxwcmlvcml0eTowfSksdWw6KCk9Pih7Y29udmVyc2lvbjpkeCxwcmlvcml0eTowfSl9fXN0YXRpYyBpbXBvcnRKU09OKHQpe2xldCBuPWduKHQubGlzdFR5cGUsdC5zdGFydCk7cmV0dXJuIG4uc2V0Rm9ybWF0KHQuZm9ybWF0KSxuLnNldEluZGVudCh0LmluZGVudCksbi5zZXREaXJlY3Rpb24odC5kaXJlY3Rpb24pLG59ZXhwb3J0RE9NKHQpe3JldHVybntlbGVtZW50OnR9PXN1cGVyLmV4cG9ydERPTSh0KSx0JiZzby5pc0hUTUxFbGVtZW50KHQpJiYodGhpcy5fX3N0YXJ0IT09MSYmdC5zZXRBdHRyaWJ1dGUoInN0YXJ0IixTdHJpbmcodGhpcy5fX3N0YXJ0KSksdGhpcy5fX2xpc3RUeXBlPT09ImNoZWNrIiYmdC5zZXRBdHRyaWJ1dGUoIl9fbGV4aWNhbExpc3RUeXBlIiwiY2hlY2siKSkse2VsZW1lbnQ6dH19ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksbGlzdFR5cGU6dGhpcy5nZXRMaXN0VHlwZSgpLHN0YXJ0OnRoaXMuZ2V0U3RhcnQoKSx0YWc6dGhpcy5nZXRUYWcoKSx0eXBlOiJsaXN0Iix2ZXJzaW9uOjF9fWNhbkJlRW1wdHkoKXtyZXR1cm4hMX1jYW5JbmRlbnQoKXtyZXR1cm4hMX1hcHBlbmQoLi4udCl7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBuPXRbcl07aWYoZnQobikpc3VwZXIuYXBwZW5kKG4pO2Vsc2V7bGV0IGk9em4oKTtOZShuKXx8emUuJGlzRWxlbWVudE5vZGUobikmJihuPXplLiRjcmVhdGVUZXh0Tm9kZShuLmdldFRleHRDb250ZW50KCkpKSxpLmFwcGVuZChuKSxzdXBlci5hcHBlbmQoaSl9fXJldHVybiBjbih0aGlzKSx0aGlzfWV4dHJhY3RXaXRoQ2hpbGQodCl7cmV0dXJuIGZ0KHQpfX07ZnVuY3Rpb24gY3goZSx0LG4pe2xldCByPVtdLGk9W107dmFyIG89dC5saXN0O2lmKG8hPT12b2lkIDApe2xldCBzPW9bYCR7bi5fX3RhZ31EZXB0aGBdfHxbXTt0PXpFKG4pLTE7bGV0IGE9dCVzLmxlbmd0aDt2YXIgbD1zW2FdO2xldCB1PW9bbi5fX3RhZ10sYztpZihvPW8ubmVzdGVkLG8hPT12b2lkIDAmJm8ubGlzdCYmKGM9by5saXN0KSx1IT09dm9pZCAwJiZyLnB1c2godSksbCE9PXZvaWQgMClmb3IobD1sLnNwbGl0KCIgIiksci5wdXNoKC4uLmwpLGw9MDtsPHMubGVuZ3RoO2wrKylsIT09YSYmaS5wdXNoKG4uX190YWcrbCk7YyE9PXZvaWQgMCYmKG49Yy5zcGxpdCgiICIpLDE8dD9yLnB1c2goLi4ubik6aS5wdXNoKC4uLm4pKX0wPGkubGVuZ3RoJiZzby5yZW1vdmVDbGFzc05hbWVzRnJvbUVsZW1lbnQoZSwuLi5pKSwwPHIubGVuZ3RoJiZzby5hZGRDbGFzc05hbWVzVG9FbGVtZW50KGUsLi4ucil9ZnVuY3Rpb24gek8oZSl7bGV0IHQ9W107Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBuPWVbcl07ZnQobik/KHQucHVzaChuKSxuPW4uZ2V0Q2hpbGRyZW4oKSwxPG4ubGVuZ3RoJiZuLmZvckVhY2goaT0+e05lKGkpJiZ0LnB1c2gobHgoaSkpfSkpOnQucHVzaChseChuKSl9cmV0dXJuIHR9ZnVuY3Rpb24gZHgoZSl7bGV0IHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLG49bnVsbDtyZXR1cm4gdD09PSJvbCI/bj1nbigibnVtYmVyIixlLnN0YXJ0KTp0PT09InVsIiYmKG49c28uaXNIVE1MRWxlbWVudChlKSYmZS5nZXRBdHRyaWJ1dGUoIl9fbGV4aWNhbGxpc3R0eXBlIik9PT0iY2hlY2siP2duKCJjaGVjayIpOmduKCJidWxsZXQiKSkse2FmdGVyOnpPLG5vZGU6bn19bGV0IGZ4PXtvbDoibnVtYmVyIix1bDoiYnVsbGV0In07ZnVuY3Rpb24gZ24oZSx0PTEpe3JldHVybiB6ZS4kYXBwbHlOb2RlUmVwbGFjZW1lbnQobmV3IEN2KGUsdCkpfWZ1bmN0aW9uIE5lKGUpe3JldHVybiBlIGluc3RhbmNlb2YgQ3Z9bGV0IEZPPXplLmNyZWF0ZUNvbW1hbmQoIklOU0VSVF9VTk9SREVSRURfTElTVF9DT01NQU5EIiksQk89emUuY3JlYXRlQ29tbWFuZCgiSU5TRVJUX09SREVSRURfTElTVF9DT01NQU5EIiksVU89emUuY3JlYXRlQ29tbWFuZCgiSU5TRVJUX0NIRUNLX0xJU1RfQ09NTUFORCIpLFdPPXplLmNyZWF0ZUNvbW1hbmQoIlJFTU9WRV9MSVNUX0NPTU1BTkQiKTt3bi4kY3JlYXRlTGlzdEl0ZW1Ob2RlPXpuO3duLiRjcmVhdGVMaXN0Tm9kZT1nbjt3bi4kZ2V0TGlzdERlcHRoPXpFO3duLiRoYW5kbGVMaXN0SW5zZXJ0UGFyYWdyYXBoPWZ1bmN0aW9uKCl7dmFyIGU9emUuJGdldFNlbGVjdGlvbigpO2lmKCF6ZS4kaXNSYW5nZVNlbGVjdGlvbihlKXx8IWUuaXNDb2xsYXBzZWQoKXx8KGU9ZS5hbmNob3IuZ2V0Tm9kZSgpLCFmdChlKXx8ZS5nZXRDaGlsZHJlblNpemUoKSE9PTApKXJldHVybiExO3ZhciB0PWttKGUpLG49ZS5nZXRQYXJlbnQoKTtOZShuKXx8ZnMoNDApO2xldCByPW4uZ2V0UGFyZW50KCksaTtpZih6ZS4kaXNSb290T3JTaGFkb3dSb290KHIpKWk9emUuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKSx0Lmluc2VydEFmdGVyKGkpO2Vsc2UgaWYoZnQocikpaT16bigpLHIuaW5zZXJ0QWZ0ZXIoaSk7ZWxzZSByZXR1cm4hMTtpZihpLnNlbGVjdCgpLHQ9ZS5nZXROZXh0U2libGluZ3MoKSwwPHQubGVuZ3RoKXtsZXQgbz1nbihuLmdldExpc3RUeXBlKCkpO3plLiRpc1BhcmFncmFwaE5vZGUoaSk/aS5pbnNlcnRBZnRlcihvKToobj16bigpLG4uYXBwZW5kKG8pLGkuaW5zZXJ0QWZ0ZXIobikpLHQuZm9yRWFjaChsPT57bC5yZW1vdmUoKSxvLmFwcGVuZChsKX0pfXJldHVybiBMTyhlKSwhMH07d24uJGlzTGlzdEl0ZW1Ob2RlPWZ0O3duLiRpc0xpc3ROb2RlPU5lO3duLklOU0VSVF9DSEVDS19MSVNUX0NPTU1BTkQ9VU87d24uSU5TRVJUX09SREVSRURfTElTVF9DT01NQU5EPUJPO3duLklOU0VSVF9VTk9SREVSRURfTElTVF9DT01NQU5EPUZPO3duLkxpc3RJdGVtTm9kZT1EZjt3bi5MaXN0Tm9kZT1Ddjt3bi5SRU1PVkVfTElTVF9DT01NQU5EPVdPO3duLmluc2VydExpc3Q9ZnVuY3Rpb24oZSx0KXtlLnVwZGF0ZSgoKT0+e3ZhciBuPXplLiRnZXRTZWxlY3Rpb24oKTtpZih6ZS4kaXNSYW5nZVNlbGVjdGlvbihuKXx8emUuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKG4pKXt2YXIgcj1uLmdldE5vZGVzKCk7bj1uLmFuY2hvci5nZXROb2RlKCk7dmFyIGk9bi5nZXRQYXJlbnQoKTtpZihCRShuLHIpKXI9Z24odCksemUuJGlzUm9vdE9yU2hhZG93Um9vdChpKT8obi5yZXBsYWNlKHIpLGk9em4oKSx6ZS4kaXNFbGVtZW50Tm9kZShuKSYmKGkuc2V0Rm9ybWF0KG4uZ2V0Rm9ybWF0VHlwZSgpKSxpLnNldEluZGVudChuLmdldEluZGVudCgpKSksci5hcHBlbmQoaSkpOmZ0KG4pJiYobj1uLmdldFBhcmVudE9yVGhyb3coKSxRbyhyLG4uZ2V0Q2hpbGRyZW4oKSksbi5yZXBsYWNlKHIpKTtlbHNlIGZvcihuPW5ldyBTZXQsaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgbz1yW2ldO2lmKHplLiRpc0VsZW1lbnROb2RlKG8pJiZvLmlzRW1wdHkoKSYmIW4uaGFzKG8uZ2V0S2V5KCkpKXN4KG8sdCk7ZWxzZSBpZih6ZS4kaXNMZWFmTm9kZShvKSlmb3Iobz1vLmdldFBhcmVudCgpO28hPW51bGw7KXtsZXQgcz1vLmdldEtleSgpO2lmKE5lKG8pKXtpZighbi5oYXMocykpe3ZhciBsPWduKHQpO1FvKGwsby5nZXRDaGlsZHJlbigpKSxvLnJlcGxhY2UobCksY24obCksbi5hZGQocyl9YnJlYWt9ZWxzZXtpZihsPW8uZ2V0UGFyZW50KCksemUuJGlzUm9vdE9yU2hhZG93Um9vdChsKSYmIW4uaGFzKHMpKXtuLmFkZChzKSxzeChvLHQpO2JyZWFrfW89bH19fX19KX07d24ucmVtb3ZlTGlzdD1mdW5jdGlvbihlKXtlLnVwZGF0ZSgoKT0+e2xldCB0PXplLiRnZXRTZWxlY3Rpb24oKTtpZih6ZS4kaXNSYW5nZVNlbGVjdGlvbih0KSl7dmFyIG49bmV3IFNldCxyPXQuZ2V0Tm9kZXMoKSxpPXQuYW5jaG9yLmdldE5vZGUoKTtpZihCRShpLHIpKW4uYWRkKGttKGkpKTtlbHNlIGZvcihpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBvPXJbaV07emUuJGlzTGVhZk5vZGUobykmJihvPXNvLiRnZXROZWFyZXN0Tm9kZU9mVHlwZShvLERmKSxvIT1udWxsJiZuLmFkZChrbShvKSkpfWZvcihsZXQgbCBvZiBuKXtuPWwscj1GRShsKTtmb3IobGV0IHMgb2YgcilyPXplLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCksUW8ocixzLmdldENoaWxkcmVuKCkpLG4uaW5zZXJ0QWZ0ZXIociksbj1yLHMuX19rZXk9PT10LmFuY2hvci5rZXkmJnQuYW5jaG9yLnNldChyLmdldEtleSgpLDAsImVsZW1lbnQiKSxzLl9fa2V5PT09dC5mb2N1cy5rZXkmJnQuZm9jdXMuc2V0KHIuZ2V0S2V5KCksMCwiZWxlbWVudCIpLHMucmVtb3ZlKCk7bC5yZW1vdmUoKX19fSl9O2NvbnN0IFZPPXduO3ZhciBqaT1WTyxIRT17fSxMZj17fSxLRT1wO2Z1bmN0aW9uIEhPKGUpe2xldCB0PW5ldyBVUkxTZWFyY2hQYXJhbXM7dC5hcHBlbmQoImNvZGUiLGUpO2ZvcihsZXQgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdC5hcHBlbmQoInYiLGFyZ3VtZW50c1tuXSk7dGhyb3cgRXJyb3IoYE1pbmlmaWVkIExleGljYWwgZXJyb3IgIyR7ZX07IHZpc2l0IGh0dHBzOi8vbGV4aWNhbC5kZXYvZG9jcy9lcnJvcj8ke3R9IGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy5gKX1sZXQgWkU9S0UuY3JlYXRlQ29udGV4dChudWxsKTtMZi5MZXhpY2FsQ29tcG9zZXJDb250ZXh0PVpFO0xmLmNyZWF0ZUxleGljYWxDb21wb3NlckNvbnRleHQ9ZnVuY3Rpb24oZSx0KXtsZXQgbj1udWxsO3JldHVybiBlIT1udWxsJiYobj1lWzFdKSx7Z2V0VGhlbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdD8/KG4hPW51bGw/bi5nZXRUaGVtZSgpOm51bGwpfX19O0xmLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQ9ZnVuY3Rpb24oKXtsZXQgZT1LRS51c2VDb250ZXh0KFpFKTtyZXR1cm4gZT09bnVsbCYmSE8oOCksZX07Y29uc3QgS089TGY7dmFyIFRyPUtPLGh4PVRyLGZhPXhlLGpkPXA7bGV0IEdFPXR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PCJ1Ijt2YXIgWk89R0U/amQudXNlTGF5b3V0RWZmZWN0OmpkLnVzZUVmZmVjdDtsZXQgdmM9e3RhZzoiaGlzdG9yeS1tZXJnZSJ9O2Z1bmN0aW9uIEdPKGUsdCl7aWYodCE9PW51bGwpe2lmKHQ9PT12b2lkIDApZS51cGRhdGUoKCk9Pnt2YXIgbj1mYS4kZ2V0Um9vdCgpO2lmKG4uaXNFbXB0eSgpKXtsZXQgcj1mYS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpO24uYXBwZW5kKHIpLG49R0U/ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDpudWxsLChmYS4kZ2V0U2VsZWN0aW9uKCkhPT1udWxsfHxuIT09bnVsbCYmbj09PWUuZ2V0Um9vdEVsZW1lbnQoKSkmJnIuc2VsZWN0KCl9fSx2Yyk7ZWxzZSBpZih0IT09bnVsbClzd2l0Y2godHlwZW9mIHQpe2Nhc2Uic3RyaW5nIjpsZXQgbj1lLnBhcnNlRWRpdG9yU3RhdGUodCk7ZS5zZXRFZGl0b3JTdGF0ZShuLHZjKTticmVhaztjYXNlIm9iamVjdCI6ZS5zZXRFZGl0b3JTdGF0ZSh0LHZjKTticmVhaztjYXNlImZ1bmN0aW9uIjplLnVwZGF0ZSgoKT0+e2ZhLiRnZXRSb290KCkuaXNFbXB0eSgpJiZ0KGUpfSx2Yyl9fX1IRS5MZXhpY2FsQ29tcG9zZXI9ZnVuY3Rpb24oe2luaXRpYWxDb25maWc6ZSxjaGlsZHJlbjp0fSl7bGV0IG49amQudXNlTWVtbygoKT0+e2NvbnN0e3RoZW1lOnIsbmFtZXNwYWNlOmksZWRpdG9yX19ERVBSRUNBVEVEOm8sbm9kZXM6bCxvbkVycm9yOnMsZWRpdG9yU3RhdGU6YX09ZSx1PWh4LmNyZWF0ZUxleGljYWxDb21wb3NlckNvbnRleHQobnVsbCxyKTtsZXQgYz1vfHxudWxsO2lmKGM9PT1udWxsKXtjb25zdCBkPWZhLmNyZWF0ZUVkaXRvcih7ZWRpdGFibGU6ZS5lZGl0YWJsZSxuYW1lc3BhY2U6aSxub2RlczpsLG9uRXJyb3I6Zj0+cyhmLGQpLHRoZW1lOnJ9KTtHTyhkLGEpLGM9ZH1yZXR1cm5bYyx1XX0sW10pO3JldHVybiBaTygoKT0+e2xldCByPWUuZWRpdGFibGUsW2ldPW47aS5zZXRFZGl0YWJsZShyIT09dm9pZCAwP3I6ITApfSxbXSksamQuY3JlYXRlRWxlbWVudChoeC5MZXhpY2FsQ29tcG9zZXJDb250ZXh0LlByb3ZpZGVyLHt2YWx1ZTpufSx0KX07Y29uc3QgWU89SEU7dmFyIFhPPVlPLE9hPXA7ZnVuY3Rpb24gJG0oZSx0KXtyZXR1cm4gJG09T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCk6ZnVuY3Rpb24obixyKXtyZXR1cm4gbi5fX3Byb3RvX189cixufSwkbShlLHQpfWZ1bmN0aW9uIFFPKGUsdCl7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSwkbShlLHQpfWZ1bmN0aW9uIEpPKGUsdCl7cmV0dXJuIGU9PT12b2lkIDAmJihlPVtdKSx0PT09dm9pZCAwJiYodD1bXSksZS5sZW5ndGghPT10Lmxlbmd0aHx8ZS5zb21lKGZ1bmN0aW9uKG4scil7cmV0dXJuIU9iamVjdC5pcyhuLHRbcl0pfSl9dmFyIHB4PXtlcnJvcjpudWxsfSxxTz1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7Zm9yKHZhciByLGk9YXJndW1lbnRzLmxlbmd0aCxvPUFycmF5KGkpLGw9MDtsPGk7bCsrKW9bbF09YXJndW1lbnRzW2xdO3JldHVybiByPWUuY2FsbC5hcHBseShlLFt0aGlzXS5jb25jYXQobykpfHx0aGlzLHIuc3RhdGU9cHgsci5yZXNldEVycm9yQm91bmRhcnk9ZnVuY3Rpb24oKXtmb3IodmFyIHMsYT1hcmd1bWVudHMubGVuZ3RoLHU9QXJyYXkoYSksYz0wO2M8YTtjKyspdVtjXT1hcmd1bWVudHNbY107ci5wcm9wcy5vblJlc2V0PT1udWxsfHwocz1yLnByb3BzKS5vblJlc2V0LmFwcGx5KHMsdSksci5yZXNldCgpfSxyfVFPKHQsZSksdC5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I9ZnVuY3Rpb24ocil7cmV0dXJue2Vycm9yOnJ9fTt2YXIgbj10LnByb3RvdHlwZTtyZXR1cm4gbi5yZXNldD1mdW5jdGlvbigpe3RoaXMuc2V0U3RhdGUocHgpfSxuLmNvbXBvbmVudERpZENhdGNoPWZ1bmN0aW9uKHIsaSl7dmFyIG8sbDsobz0obD10aGlzLnByb3BzKS5vbkVycm9yKT09bnVsbHx8by5jYWxsKGwscixpKX0sbi5jb21wb25lbnREaWRVcGRhdGU9ZnVuY3Rpb24ocixpKXt2YXIgbz10aGlzLnByb3BzLnJlc2V0S2V5cztpZih0aGlzLnN0YXRlLmVycm9yIT09bnVsbCYmaS5lcnJvciE9PW51bGwmJkpPKHIucmVzZXRLZXlzLG8pKXt2YXIgbCxzOyhsPShzPXRoaXMucHJvcHMpLm9uUmVzZXRLZXlzQ2hhbmdlKT09bnVsbHx8bC5jYWxsKHMsci5yZXNldEtleXMsbyksdGhpcy5yZXNldCgpfX0sbi5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgcj10aGlzLnN0YXRlLmVycm9yLGk9dGhpcy5wcm9wcyxvPWkuZmFsbGJhY2tSZW5kZXIsbD1pLkZhbGxiYWNrQ29tcG9uZW50O2lmKGk9aS5mYWxsYmFjayxyIT09bnVsbCl7aWYocj17ZXJyb3I6cixyZXNldEVycm9yQm91bmRhcnk6dGhpcy5yZXNldEVycm9yQm91bmRhcnl9LE9hLmlzVmFsaWRFbGVtZW50KGkpKXJldHVybiBpO2lmKHR5cGVvZiBvPT0iZnVuY3Rpb24iKXJldHVybiBvKHIpO2lmKGwpcmV0dXJuIE9hLmNyZWF0ZUVsZW1lbnQobCxyKTt0aHJvdyBFcnJvcigicmVhY3QtZXJyb3ItYm91bmRhcnkgcmVxdWlyZXMgZWl0aGVyIGEgZmFsbGJhY2ssIGZhbGxiYWNrUmVuZGVyLCBvciBGYWxsYmFja0NvbXBvbmVudCBwcm9wIil9cmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW59LHR9KE9hLkNvbXBvbmVudCksZVA9ZnVuY3Rpb24oe2NoaWxkcmVuOmUsb25FcnJvcjp0fSl7cmV0dXJuIE9hLmNyZWF0ZUVsZW1lbnQocU8se2ZhbGxiYWNrOk9hLmNyZWF0ZUVsZW1lbnQoImRpdiIse3N0eWxlOntib3JkZXI6IjFweCBzb2xpZCAjZjAwIixjb2xvcjoiI2YwMCIscGFkZGluZzoiOHB4In19LCJBbiBlcnJvciB3YXMgdGhyb3duLiIpLG9uRXJyb3I6dH0sZSl9O2NvbnN0IHRQPWVQO3ZhciBuUD10UDtjb25zdCByUD1UdShuUCk7dmFyIGt2PXt9LCR2PXt9LGlQPUZ0LFllPXhlO2Z1bmN0aW9uIG9QKGUsdCxuLHIsaSl7aWYoZT09PW51bGx8fG4uc2l6ZT09PTAmJnIuc2l6ZT09PTAmJiFpKXJldHVybiAwO3ZhciBvPXQuX3NlbGVjdGlvbixsPWUuX3NlbGVjdGlvbjtpZihpKXJldHVybiAxO2lmKCEoWWUuJGlzUmFuZ2VTZWxlY3Rpb24obykmJlllLiRpc1JhbmdlU2VsZWN0aW9uKGwpJiZsLmlzQ29sbGFwc2VkKCkmJm8uaXNDb2xsYXBzZWQoKSkpcmV0dXJuIDA7aT10Ll9ub2RlTWFwO2xldCBzPVtdO2ZvcihsZXQgYSBvZiBuKW49aS5nZXQoYSksbiE9PXZvaWQgMCYmcy5wdXNoKG4pO2ZvcihsZXRbYSx1XW9mIHIpdSYmKHI9aS5nZXQoYSkscj09PXZvaWQgMHx8WWUuJGlzUm9vdE5vZGUocil8fHMucHVzaChyKSk7cmV0dXJuIHMubGVuZ3RoPT09MD8wOjE8cy5sZW5ndGg/KHI9dC5fbm9kZU1hcCx0PXIuZ2V0KG8uYW5jaG9yLmtleSksbD1yLmdldChsLmFuY2hvci5rZXkpLHQmJmwmJiFlLl9ub2RlTWFwLmhhcyh0Ll9fa2V5KSYmWWUuJGlzVGV4dE5vZGUodCkmJnQuX190ZXh0Lmxlbmd0aD09PTEmJm8uYW5jaG9yLm9mZnNldD09PTE/MjowKToodD1zWzBdLGU9ZS5fbm9kZU1hcC5nZXQodC5fX2tleSksIVllLiRpc1RleHROb2RlKGUpfHwhWWUuJGlzVGV4dE5vZGUodCl8fGUuX19tb2RlIT09dC5fX21vZGV8fChlPWUuX190ZXh0LHQ9dC5fX3RleHQsZT09PXQpfHwobz1vLmFuY2hvcixsPWwuYW5jaG9yLG8ua2V5IT09bC5rZXl8fG8udHlwZSE9PSJ0ZXh0Iik/MDoobz1vLm9mZnNldCxsPWwub2Zmc2V0LGU9dC5sZW5ndGgtZS5sZW5ndGgsZT09PTEmJmw9PT1vLTE/MjplPT09LTEmJmw9PT1vKzE/MzplPT09LTEmJmw9PT1vPzQ6MCkpfWZ1bmN0aW9uIGxQKGUsdCl7bGV0IG49RGF0ZS5ub3coKSxyPTA7cmV0dXJuKGksbyxsLHMsYSx1KT0+e2xldCBjPURhdGUubm93KCk7aWYodS5oYXMoImhpc3RvcmljIikpcmV0dXJuIHI9MCxuPWMsMjtsZXQgZD1vUChpLG8scyxhLGUuaXNDb21wb3NpbmcoKSksZj0oKCk9Pnt2YXIgaD1sPT09bnVsbHx8bC5lZGl0b3I9PT1lLG09dS5oYXMoImhpc3RvcnktcHVzaCIpO2lmKCFtJiZoJiZ1LmhhcygiaGlzdG9yeS1tZXJnZSIpKXJldHVybiAwO2lmKGk9PT1udWxsKXJldHVybiAxO3ZhciBnPW8uX3NlbGVjdGlvbjtpZighKDA8cy5zaXplfHwwPGEuc2l6ZSkpcmV0dXJuIGchPT1udWxsPzA6MjtpZihtPT09ITEmJmQhPT0wJiZkPT09ciYmYzxuK3QmJmgpcmV0dXJuIDA7aWYocy5zaXplPT09MSl7e209QXJyYXkuZnJvbShzKVswXSxoPWkuX25vZGVNYXAuZ2V0KG0pLG09by5fbm9kZU1hcC5nZXQobSksZz1pLl9zZWxlY3Rpb247bGV0IHc9by5fc2VsZWN0aW9uLHY9ITE7WWUuJGlzUmFuZ2VTZWxlY3Rpb24oZykmJlllLiRpc1JhbmdlU2VsZWN0aW9uKHcpJiYodj1nLmFuY2hvci50eXBlPT09ImVsZW1lbnQiJiZnLmZvY3VzLnR5cGU9PT0iZWxlbWVudCImJncuYW5jaG9yLnR5cGU9PT0idGV4dCImJncuZm9jdXMudHlwZT09PSJ0ZXh0IiksaD0hdiYmWWUuJGlzVGV4dE5vZGUoaCkmJlllLiRpc1RleHROb2RlKG0pP2guX190eXBlPT09bS5fX3R5cGUmJmguX190ZXh0PT09bS5fX3RleHQmJmguX19tb2RlPT09bS5fX21vZGUmJmguX19kZXRhaWw9PT1tLl9fZGV0YWlsJiZoLl9fc3R5bGU9PT1tLl9fc3R5bGUmJmguX19mb3JtYXQ9PT1tLl9fZm9ybWF0JiZoLl9fcGFyZW50PT09bS5fX3BhcmVudDohMX1pZihoKXJldHVybiAwfXJldHVybiAxfSkoKTtyZXR1cm4gbj1jLHI9ZCxmfX0kdi5jcmVhdGVFbXB0eUhpc3RvcnlTdGF0ZT1mdW5jdGlvbigpe3JldHVybntjdXJyZW50Om51bGwscmVkb1N0YWNrOltdLHVuZG9TdGFjazpbXX19OyR2LnJlZ2lzdGVySGlzdG9yeT1mdW5jdGlvbihlLHQsbil7bGV0IHI9bFAoZSxuKTtuPSh7ZWRpdG9yU3RhdGU6bCxwcmV2RWRpdG9yU3RhdGU6cyxkaXJ0eUxlYXZlczphLGRpcnR5RWxlbWVudHM6dSx0YWdzOmN9KT0+e2NvbnN0IGQ9dC5jdXJyZW50LGY9dC5yZWRvU3RhY2ssaD10LnVuZG9TdGFjayxtPWQ9PT1udWxsP251bGw6ZC5lZGl0b3JTdGF0ZTtpZihkPT09bnVsbHx8bCE9PW0pe2lmKHM9cihzLGwsZCxhLHUsYykscz09PTEpZi5sZW5ndGghPT0wJiYodC5yZWRvU3RhY2s9W10sZS5kaXNwYXRjaENvbW1hbmQoWWUuQ0FOX1JFRE9fQ09NTUFORCwhMSkpLGQhPT1udWxsJiYoaC5wdXNoKHsuLi5kfSksZS5kaXNwYXRjaENvbW1hbmQoWWUuQ0FOX1VORE9fQ09NTUFORCwhMCkpO2Vsc2UgaWYocz09PTIpcmV0dXJuO3QuY3VycmVudD17ZWRpdG9yOmUsZWRpdG9yU3RhdGU6bH19fTtsZXQgaT1pUC5tZXJnZVJlZ2lzdGVyKGUucmVnaXN0ZXJDb21tYW5kKFllLlVORE9fQ09NTUFORCwoKT0+e2xldCBsPXQucmVkb1N0YWNrLHM9dC51bmRvU3RhY2s7aWYocy5sZW5ndGghPT0wKXtsZXQgYT10LmN1cnJlbnQsdT1zLnBvcCgpO2EhPT1udWxsJiYobC5wdXNoKGEpLGUuZGlzcGF0Y2hDb21tYW5kKFllLkNBTl9SRURPX0NPTU1BTkQsITApKSxzLmxlbmd0aD09PTAmJmUuZGlzcGF0Y2hDb21tYW5kKFllLkNBTl9VTkRPX0NPTU1BTkQsITEpLHQuY3VycmVudD11fHxudWxsLHUmJnUuZWRpdG9yLnNldEVkaXRvclN0YXRlKHUuZWRpdG9yU3RhdGUse3RhZzoiaGlzdG9yaWMifSl9cmV0dXJuITB9LFllLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChZZS5SRURPX0NPTU1BTkQsKCk9PntsZXQgbD10LnJlZG9TdGFjazt2YXIgcz10LnVuZG9TdGFjaztpZihsLmxlbmd0aCE9PTApe2xldCBhPXQuY3VycmVudDthIT09bnVsbCYmKHMucHVzaChhKSxlLmRpc3BhdGNoQ29tbWFuZChZZS5DQU5fVU5ET19DT01NQU5ELCEwKSkscz1sLnBvcCgpLGwubGVuZ3RoPT09MCYmZS5kaXNwYXRjaENvbW1hbmQoWWUuQ0FOX1JFRE9fQ09NTUFORCwhMSksdC5jdXJyZW50PXN8fG51bGwscyYmcy5lZGl0b3Iuc2V0RWRpdG9yU3RhdGUocy5lZGl0b3JTdGF0ZSx7dGFnOiJoaXN0b3JpYyJ9KX1yZXR1cm4hMH0sWWUuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKFllLkNMRUFSX0VESVRPUl9DT01NQU5ELCgpPT4odC51bmRvU3RhY2s9W10sdC5yZWRvU3RhY2s9W10sdC5jdXJyZW50PW51bGwsITEpLFllLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChZZS5DTEVBUl9ISVNUT1JZX0NPTU1BTkQsKCk9Pih0LnVuZG9TdGFjaz1bXSx0LnJlZG9TdGFjaz1bXSx0LmN1cnJlbnQ9bnVsbCxlLmRpc3BhdGNoQ29tbWFuZChZZS5DQU5fUkVET19DT01NQU5ELCExKSxlLmRpc3BhdGNoQ29tbWFuZChZZS5DQU5fVU5ET19DT01NQU5ELCExKSwhMCksWWUuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcihuKSksbz1lLnJlZ2lzdGVyVXBkYXRlTGlzdGVuZXIobik7cmV0dXJuKCk9PntpKCksbygpfX07Y29uc3Qgc1A9JHY7dmFyIGFQPXNQLHVQPVRyLGJtPWFQLG14PXA7ZnVuY3Rpb24gY1AoZSx0LG49MWUzKXtsZXQgcj1teC51c2VNZW1vKCgpPT50fHxibS5jcmVhdGVFbXB0eUhpc3RvcnlTdGF0ZSgpLFt0XSk7bXgudXNlRWZmZWN0KCgpPT5ibS5yZWdpc3Rlckhpc3RvcnkoZSxyLG4pLFtuLGUscl0pfWt2LmNyZWF0ZUVtcHR5SGlzdG9yeVN0YXRlPWJtLmNyZWF0ZUVtcHR5SGlzdG9yeVN0YXRlO2t2Lkhpc3RvcnlQbHVnaW49ZnVuY3Rpb24oe2V4dGVybmFsSGlzdG9yeVN0YXRlOmV9KXtsZXRbdF09dVAudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3JldHVybiBjUCh0LGUpLG51bGx9O2NvbnN0IGRQPWt2O3ZhciBmUD1kUCxZRT17fSxoUD1UcixQYT1wLHBQPXR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PCJ1Ij9QYS51c2VMYXlvdXRFZmZlY3Q6UGEudXNlRWZmZWN0O2Z1bmN0aW9uIG1QKGUpe2xldFt0XT1oUC51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCksbj1QYS51c2VNZW1vKCgpPT5lKHQpLFt0LGVdKSxyPVBhLnVzZVJlZihuLmluaXRpYWxWYWx1ZUZuKCkpLFtpLG9dPVBhLnVzZVN0YXRlKHIuY3VycmVudCk7cmV0dXJuIHBQKCgpPT57bGV0e2luaXRpYWxWYWx1ZUZuOmwsc3Vic2NyaWJlOnN9PW4sYT1sKCk7cmV0dXJuIHIuY3VycmVudCE9PWEmJihyLmN1cnJlbnQ9YSxvKGEpKSxzKHU9PntyLmN1cnJlbnQ9dSxvKHUpfSl9LFtuLGVdKSxpfWZ1bmN0aW9uIGdQKGUpe3JldHVybntpbml0aWFsVmFsdWVGbjooKT0+ZS5pc0VkaXRhYmxlKCksc3Vic2NyaWJlOnQ9PmUucmVnaXN0ZXJFZGl0YWJsZUxpc3RlbmVyKHQpfX12YXIgdlA9ZnVuY3Rpb24oKXtyZXR1cm4gbVAoZ1ApfTtjb25zdCB5UD12UDt2YXIgeFA9eVAsd289e30sZG49eGU7ZnVuY3Rpb24gYnYoZSx0PSEwKXtyZXR1cm4gZT8hMTooZT1YRSgpLHQmJihlPWUudHJpbSgpKSxlPT09IiIpfWZ1bmN0aW9uIFhFKCl7cmV0dXJuIGRuLiRnZXRSb290KCkuZ2V0VGV4dENvbnRlbnQoKX1mdW5jdGlvbiBRRShlKXtpZighYnYoZSwhMSkpcmV0dXJuITE7ZT1kbi4kZ2V0Um9vdCgpLmdldENoaWxkcmVuKCk7bGV0IHQ9ZS5sZW5ndGg7aWYoMTx0KXJldHVybiExO2ZvcihsZXQgcj0wO3I8dDtyKyspe3ZhciBuPWVbcl07aWYoZG4uJGlzRGVjb3JhdG9yTm9kZShuKSlyZXR1cm4hMTtpZihkbi4kaXNFbGVtZW50Tm9kZShuKSl7aWYoIWRuLiRpc1BhcmFncmFwaE5vZGUobil8fG4uX19pbmRlbnQhPT0wKXJldHVybiExO249bi5nZXRDaGlsZHJlbigpO2xldCBpPW4ubGVuZ3RoO2ZvcihsZXQgbz0wO288aTtvKyspaWYoIWRuLiRpc1RleHROb2RlKG5bcl0pKXJldHVybiExfX1yZXR1cm4hMH13by4kY2FuU2hvd1BsYWNlaG9sZGVyPVFFO3dvLiRjYW5TaG93UGxhY2Vob2xkZXJDdXJyeT1mdW5jdGlvbihlKXtyZXR1cm4oKT0+UUUoZSl9O3dvLiRmaW5kVGV4dEludGVyc2VjdGlvbkZyb21DaGFyYWN0ZXJzPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5nZXRGaXJzdENoaWxkKCk7ZT0wO2U6Zm9yKDtuIT09bnVsbDspe2lmKGRuLiRpc0VsZW1lbnROb2RlKG4pKXt2YXIgcj1uLmdldEZpcnN0Q2hpbGQoKTtpZihyIT09bnVsbCl7bj1yO2NvbnRpbnVlfX1lbHNlIGlmKGRuLiRpc1RleHROb2RlKG4pKXtpZihyPW4uZ2V0VGV4dENvbnRlbnRTaXplKCksZStyPnQpcmV0dXJue25vZGU6bixvZmZzZXQ6dC1lfTtlKz1yfWlmKHI9bi5nZXROZXh0U2libGluZygpLHIhPT1udWxsKW49cjtlbHNle2ZvcihuPW4uZ2V0UGFyZW50KCk7biE9PW51bGw7KXtpZihyPW4uZ2V0TmV4dFNpYmxpbmcoKSxyIT09bnVsbCl7bj1yO2NvbnRpbnVlIGV9bj1uLmdldFBhcmVudCgpfWJyZWFrfX1yZXR1cm4gbnVsbH07d28uJGlzUm9vdFRleHRDb250ZW50RW1wdHk9YnY7d28uJGlzUm9vdFRleHRDb250ZW50RW1wdHlDdXJyeT1mdW5jdGlvbihlLHQpe3JldHVybigpPT5idihlLHQpfTt3by4kcm9vdFRleHRDb250ZW50PVhFO3dvLnJlZ2lzdGVyTGV4aWNhbFRleHRFbnRpdHk9ZnVuY3Rpb24oZSx0LG4scil7bGV0IGk9bD0+e2NvbnN0IHM9ZG4uJGNyZWF0ZVRleHROb2RlKGwuZ2V0VGV4dENvbnRlbnQoKSk7cy5zZXRGb3JtYXQobC5nZXRGb3JtYXQoKSksbC5yZXBsYWNlKHMpfSxvPWUucmVnaXN0ZXJOb2RlVHJhbnNmb3JtKGRuLlRleHROb2RlLGw9PntpZihsLmlzU2ltcGxlVGV4dCgpKXt2YXIgcz1sLmdldFByZXZpb3VzU2libGluZygpLGE9bC5nZXRUZXh0Q29udGVudCgpLHU9bDtpZihkbi4kaXNUZXh0Tm9kZShzKSl7dmFyIGM9cy5nZXRUZXh0Q29udGVudCgpLGQ9dChjK2EpO2lmKHMgaW5zdGFuY2VvZiBuKXtpZihkPT09bnVsbHx8cy5nZXRMYXRlc3QoKS5fX21vZGUhPT0wKXtpKHMpO3JldHVybn1pZihkPWQuZW5kLWMubGVuZ3RoLDA8ZCl7dT1hLnNsaWNlKDAsZCksdT1jK3Uscy5zZWxlY3QoKSxzLnNldFRleHRDb250ZW50KHUpLGQ9PT1hLmxlbmd0aD9sLnJlbW92ZSgpOihzPWEuc2xpY2UoZCksbC5zZXRUZXh0Q29udGVudChzKSk7cmV0dXJufX1lbHNlIGlmKGQ9PT1udWxsfHxkLnN0YXJ0PGMubGVuZ3RoKXJldHVybn1mb3IoOzspe2lmKGw9dChhKSxhPWQ9bD09PW51bGw/IiI6YS5zbGljZShsLmVuZCksZD09PSIiKXtpZihjPXUuZ2V0TmV4dFNpYmxpbmcoKSxkbi4kaXNUZXh0Tm9kZShjKSl7aWYoZD11LmdldFRleHRDb250ZW50KCkrYy5nZXRUZXh0Q29udGVudCgpLGQ9dChkKSxkPT09bnVsbCl7YyBpbnN0YW5jZW9mIG4/aShjKTpjLm1hcmtEaXJ0eSgpO2JyZWFrfWVsc2UgaWYoZC5zdGFydCE9PTApYnJlYWt9fWVsc2UgaWYoYz10KGQpLGMhPT1udWxsJiZjLnN0YXJ0PT09MClicmVhaztpZihsPT09bnVsbClicmVhaztpZihsLnN0YXJ0PT09MCYmZG4uJGlzVGV4dE5vZGUocykmJnMuaXNUZXh0RW50aXR5KCkpY29udGludWU7bGV0IGY7aWYobC5zdGFydD09PTA/W2YsdV09dS5zcGxpdFRleHQobC5lbmQpOlssZix1XT11LnNwbGl0VGV4dChsLnN0YXJ0LGwuZW5kKSxsPXIoZiksbC5zZXRGb3JtYXQoZi5nZXRGb3JtYXQoKSksZi5yZXBsYWNlKGwpLHU9PW51bGwpYnJlYWt9fX0pO3JldHVybiBlPWUucmVnaXN0ZXJOb2RlVHJhbnNmb3JtKG4sbD0+e3ZhciBzPWwuZ2V0VGV4dENvbnRlbnQoKTtjb25zdCBhPXQocyk7YT09PW51bGx8fGEuc3RhcnQhPT0wP2kobCk6cy5sZW5ndGg+YS5lbmQ/bC5zcGxpdFRleHQoYS5lbmQpOihzPWwuZ2V0UHJldmlvdXNTaWJsaW5nKCksZG4uJGlzVGV4dE5vZGUocykmJnMuaXNUZXh0RW50aXR5KCkmJihpKHMpLGkobCkpLHM9bC5nZXROZXh0U2libGluZygpLGRuLiRpc1RleHROb2RlKHMpJiZzLmlzVGV4dEVudGl0eSgpJiYoaShzKSxsIGluc3RhbmNlb2YgbiYmaShsKSkpfSksW28sZV19O2NvbnN0IF9QPXdvO3ZhciB3UD1fUCxKRT17fSx5Yz14ZTtKRS5yZWdpc3RlckRyYWdvblN1cHBvcnQ9ZnVuY3Rpb24oZSl7bGV0IHQ9d2luZG93LmxvY2F0aW9uLm9yaWdpbixuPXI9PntpZihyLm9yaWdpbj09PXQpe3ZhciBpPWUuZ2V0Um9vdEVsZW1lbnQoKTtpZihkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09aSYmKGk9ci5kYXRhLHR5cGVvZiBpPT0ic3RyaW5nIikpe3RyeXt2YXIgbz1KU09OLnBhcnNlKGkpfWNhdGNoe3JldHVybn1pZihvJiZvLnByb3RvY29sPT09Im51YW5yaWFfbWVzc2FnaW5nIiYmby50eXBlPT09InJlcXVlc3QiJiYobz1vLnBheWxvYWQpJiZvLmZ1bmN0aW9uSWQ9PT0ibWFrZUNoYW5nZXMiJiYobz1vLmFyZ3MpKXtjb25zdFtsLHMsYSx1LGNdPW87ZS51cGRhdGUoKCk9Pntjb25zdCBkPXljLiRnZXRTZWxlY3Rpb24oKTtpZih5Yy4kaXNSYW5nZVNlbGVjdGlvbihkKSl7dmFyIGY9ZC5hbmNob3I7bGV0IGg9Zi5nZXROb2RlKCksbT0wLGc9MDt5Yy4kaXNUZXh0Tm9kZShoKSYmMDw9bCYmMDw9cyYmKG09bCxnPWwrcyxkLnNldFRleHROb2RlUmFuZ2UoaCxtLGgsZykpLChtIT09Z3x8YSE9PSIiKSYmKGQuaW5zZXJ0UmF3VGV4dChhKSxoPWYuZ2V0Tm9kZSgpKSx5Yy4kaXNUZXh0Tm9kZShoKSYmKG09dSxnPXUrYyxmPWguZ2V0VGV4dENvbnRlbnRTaXplKCksbT1tPmY/ZjptLGc9Zz5mP2Y6ZyxkLnNldFRleHROb2RlUmFuZ2UoaCxtLGgsZykpLHIuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9fSl9fX19O3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbiwhMCksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbiwhMCl9fTtjb25zdCBTUD1KRTt2YXIgRVA9U1AsSnI9e30sU2k9e30sVHY9e30sZ3g9bG8sQ1A9RnQsRmw9eGU7ZnVuY3Rpb24gcUUoZSx0LG4scj1udWxsKXtsZXQgaT1yIT1udWxsP3QuaXNTZWxlY3RlZChyKTohMCxvPUZsLiRpc0VsZW1lbnROb2RlKHQpJiZ0LmV4Y2x1ZGVGcm9tQ29weSgiaHRtbCIpO3ZhciBsPXQ7ciE9PW51bGwmJihsPWd4LiRjbG9uZVdpdGhQcm9wZXJ0aWVzKHQpLGw9RmwuJGlzVGV4dE5vZGUobCkmJnIhPW51bGw/Z3guJHNsaWNlU2VsZWN0ZWRUZXh0Tm9kZUNvbnRlbnQocixsKTpsKTtsZXQgcz1GbC4kaXNFbGVtZW50Tm9kZShsKT9sLmdldENoaWxkcmVuKCk6W10se2VsZW1lbnQ6YSxhZnRlcjp1fT1sLmV4cG9ydERPTShlKTtpZighYSlyZXR1cm4hMTtsZXQgYz1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Zm9yKGxldCBkPTA7ZDxzLmxlbmd0aDtkKyspe2xldCBmPXNbZF0saD1xRShlLGYsYyxyKTshaSYmRmwuJGlzRWxlbWVudE5vZGUodCkmJmgmJnQuZXh0cmFjdFdpdGhDaGlsZChmLHIsImh0bWwiKSYmKGk9ITApfXJldHVybiBpJiYhbz8oQ1AuaXNIVE1MRWxlbWVudChhKSYmYS5hcHBlbmQoYyksbi5hcHBlbmQoYSksdSYmKGU9dS5jYWxsKGwsYSkpJiZhLnJlcGxhY2VXaXRoKGUpKTpuLmFwcGVuZChjKSxpfWxldCBlQz1uZXcgU2V0KFsiU1RZTEUiLCJTQ1JJUFQiXSk7ZnVuY3Rpb24gdEMoZSx0LG49bmV3IE1hcCxyKXtsZXQgaT1bXTtpZihlQy5oYXMoZS5ub2RlTmFtZSkpcmV0dXJuIGk7bGV0IG89bnVsbDt2YXIgbCx7bm9kZU5hbWU6c309ZSxhPXQuX2h0bWxDb252ZXJzaW9ucy5nZXQocy50b0xvd2VyQ2FzZSgpKTtpZihzPW51bGwsYSE9PXZvaWQgMClmb3IobCBvZiBhKWE9bChlKSxhIT09bnVsbCYmKHM9PT1udWxsfHxzLnByaW9yaXR5PGEucHJpb3JpdHkpJiYocz1hKTtpZihzPShsPXMhPT1udWxsP3MuY29udmVyc2lvbjpudWxsKT9sKGUpOm51bGwsbD1udWxsLHMhPT1udWxsKXtpZihsPXMuYWZ0ZXIsYT1zLm5vZGUsbz1BcnJheS5pc0FycmF5KGEpP2FbYS5sZW5ndGgtMV06YSxvIT09bnVsbCl7Zm9yKHZhclssdV1vZiBuKWlmKG89dShvLHIpLCFvKWJyZWFrO28mJmkucHVzaCguLi5BcnJheS5pc0FycmF5KGEpP2E6W29dKX1zLmZvckNoaWxkIT1udWxsJiZuLnNldChlLm5vZGVOYW1lLHMuZm9yQ2hpbGQpfWZvcihlPWUuY2hpbGROb2RlcyxyPVtdLHU9MDt1PGUubGVuZ3RoO3UrKylyLnB1c2goLi4udEMoZVt1XSx0LG5ldyBNYXAobiksbykpO3JldHVybiBsIT1udWxsJiYocj1sKHIpKSxvPT1udWxsP2k9aS5jb25jYXQocik6RmwuJGlzRWxlbWVudE5vZGUobykmJm8uYXBwZW5kKC4uLnIpLGl9VHYuJGdlbmVyYXRlSHRtbEZyb21Ob2Rlcz1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiBkb2N1bWVudD4idSJ8fHR5cGVvZiB3aW5kb3c+InUiKXRocm93IEVycm9yKCJUbyB1c2UgJGdlbmVyYXRlSHRtbEZyb21Ob2RlcyBpbiBoZWFkbGVzcyBtb2RlIHBsZWFzZSBpbml0aWFsaXplIGEgaGVhZGxlc3MgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBzdWNoIGFzIEpTRG9tIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIik7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikscj1GbC4kZ2V0Um9vdCgpLmdldENoaWxkcmVuKCk7Zm9yKGxldCBpPTA7aTxyLmxlbmd0aDtpKyspcUUoZSxyW2ldLG4sdCk7cmV0dXJuIG4uaW5uZXJIVE1MfTtUdi4kZ2VuZXJhdGVOb2Rlc0Zyb21ET009ZnVuY3Rpb24oZSx0KXt0PXQuYm9keT90LmJvZHkuY2hpbGROb2RlczpbXTtsZXQgbj1bXTtmb3IobGV0IGk9MDtpPHQubGVuZ3RoO2krKyl7dmFyIHI9dFtpXTtlQy5oYXMoci5ub2RlTmFtZSl8fChyPXRDKHIsZSksciE9PW51bGwmJihuPW4uY29uY2F0KHIpKSl9cmV0dXJuIG59O2NvbnN0IGtQPVR2O3ZhciAkUD1rUCxuQz0kUCxUbT1sbyxRbD1GdCxwZT14ZTtmdW5jdGlvbiBsaShlKXtsZXQgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3QuYXBwZW5kKCJjb2RlIixlKTtmb3IobGV0IG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXQuYXBwZW5kKCJ2Iixhcmd1bWVudHNbbl0pO3Rocm93IEVycm9yKGBNaW5pZmllZCBMZXhpY2FsIGVycm9yICMke2V9OyB2aXNpdCBodHRwczovL2xleGljYWwuZGV2L2RvY3MvZXJyb3I/JHt0fSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuYCl9bGV0IHJDPXR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PCJ1IjtmdW5jdGlvbiBpQyhlKXtsZXQgdD1wZS4kZ2V0U2VsZWN0aW9uKCk7aWYodD09bnVsbCl0aHJvdyBFcnJvcigiRXhwZWN0ZWQgdmFsaWQgTGV4aWNhbFNlbGVjdGlvbiIpO3JldHVybiBwZS4kaXNSYW5nZVNlbGVjdGlvbih0KSYmdC5pc0NvbGxhcHNlZCgpfHx0LmdldE5vZGVzKCkubGVuZ3RoPT09MD8iIjpuQy4kZ2VuZXJhdGVIdG1sRnJvbU5vZGVzKGUsdCl9ZnVuY3Rpb24gb0MoZSl7bGV0IHQ9cGUuJGdldFNlbGVjdGlvbigpO2lmKHQ9PW51bGwpdGhyb3cgRXJyb3IoIkV4cGVjdGVkIHZhbGlkIExleGljYWxTZWxlY3Rpb24iKTtyZXR1cm4gcGUuJGlzUmFuZ2VTZWxlY3Rpb24odCkmJnQuaXNDb2xsYXBzZWQoKXx8dC5nZXROb2RlcygpLmxlbmd0aD09PTA/bnVsbDpKU09OLnN0cmluZ2lmeShzQyhlLHQpKX1mdW5jdGlvbiBObShlLHQsbil7KHBlLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbihuKXx8UWwuJGZpbmRNYXRjaGluZ1BhcmVudChuLmFuY2hvci5nZXROb2RlKCkscj0+cGUuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGUocikpIT09bnVsbCYmUWwuJGZpbmRNYXRjaGluZ1BhcmVudChuLmZvY3VzLmdldE5vZGUoKSxyPT5wZS5ERVBSRUNBVEVEXyRpc0dyaWRDZWxsTm9kZShyKSkhPT1udWxsKSYmdC5sZW5ndGg9PT0xJiZwZS5ERVBSRUNBVEVEXyRpc0dyaWROb2RlKHRbMF0pP1RQKHQsbiwhMSxlKTpiUCh0LG4pfWZ1bmN0aW9uIGJQKGUsdCl7bGV0IG49W10scj1udWxsO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKXtsZXQgbz1lW2ldLGw9cGUuJGlzTGluZUJyZWFrTm9kZShvKTtpZihsfHxwZS4kaXNEZWNvcmF0b3JOb2RlKG8pJiZvLmlzSW5saW5lKCl8fHBlLiRpc0VsZW1lbnROb2RlKG8pJiZvLmlzSW5saW5lKCl8fHBlLiRpc1RleHROb2RlKG8pfHxvLmlzUGFyZW50UmVxdWlyZWQoKSl7aWYocj09PW51bGwmJihyPW8uY3JlYXRlUGFyZW50RWxlbWVudE5vZGUoKSxuLnB1c2gociksbCkpY29udGludWU7ciE9PW51bGwmJnIuYXBwZW5kKG8pfWVsc2Ugbi5wdXNoKG8pLHI9bnVsbH1wZS4kaXNSYW5nZVNlbGVjdGlvbih0KT90Lmluc2VydE5vZGVzKG4pOnBlLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbih0KSYmKGU9dC5hbmNob3IuZ2V0Tm9kZSgpLHBlLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKGUpfHxsaSg0MSksZS5hcHBlbmQoLi4ubikpfWZ1bmN0aW9uIFRQKGUsdCxuLHIpe2UubGVuZ3RoPT09MSYmcGUuREVQUkVDQVRFRF8kaXNHcmlkTm9kZShlWzBdKXx8bGkoNDIpO3ZhciBpPWVbMF07ZT1pLmdldENoaWxkcmVuKCksbj1pLmdldEZpcnN0Q2hpbGRPclRocm93KCkuZ2V0Q2hpbGRyZW5TaXplKCk7dmFyIG89aS5nZXRDaGlsZHJlblNpemUoKSxsPVFsLiRmaW5kTWF0Y2hpbmdQYXJlbnQodC5hbmNob3IuZ2V0Tm9kZSgpLGg9PnBlLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKGgpKTt0PShpPWwmJlFsLiRmaW5kTWF0Y2hpbmdQYXJlbnQobCxoPT5wZS5ERVBSRUNBVEVEXyRpc0dyaWRSb3dOb2RlKGgpKSkmJlFsLiRmaW5kTWF0Y2hpbmdQYXJlbnQoaSxoPT5wZS5ERVBSRUNBVEVEXyRpc0dyaWROb2RlKGgpKSxwZS5ERVBSRUNBVEVEXyRpc0dyaWRDZWxsTm9kZShsKSYmcGUuREVQUkVDQVRFRF8kaXNHcmlkUm93Tm9kZShpKSYmcGUuREVQUkVDQVRFRF8kaXNHcmlkTm9kZSh0KXx8bGkoNDMpO3ZhciBzPWkuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxhPU1hdGgubWluKHQuZ2V0Q2hpbGRyZW5TaXplKCktMSxzK28tMSk7bz1sLmdldEluZGV4V2l0aGluUGFyZW50KCksbD1NYXRoLm1pbihpLmdldENoaWxkcmVuU2l6ZSgpLTEsbytuLTEpLG49TWF0aC5taW4obyxsKSxpPU1hdGgubWluKHMsYSksbz1NYXRoLm1heChvLGwpLHM9TWF0aC5tYXgocyxhKSxhPXQuZ2V0Q2hpbGRyZW4oKSxsPTA7bGV0IHUsYztmb3IobGV0IGg9aTtoPD1zO2grKyl7dmFyIGQ9YVtoXTtwZS5ERVBSRUNBVEVEXyRpc0dyaWRSb3dOb2RlKGQpfHxsaSgyNCk7dmFyIGY9ZVtsXTtwZS5ERVBSRUNBVEVEXyRpc0dyaWRSb3dOb2RlKGYpfHxsaSgyNCksZD1kLmdldENoaWxkcmVuKCksZj1mLmdldENoaWxkcmVuKCk7bGV0IG09MDtmb3IobGV0IGc9bjtnPD1vO2crKyl7bGV0IHc9ZFtnXTtwZS5ERVBSRUNBVEVEXyRpc0dyaWRDZWxsTm9kZSh3KXx8bGkoMjUpO2xldCB2PWZbbV07cGUuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGUodil8fGxpKDI1KSxoPT09aSYmZz09PW4/dT13LmdldEtleSgpOmg9PT1zJiZnPT09byYmKGM9dy5nZXRLZXkoKSk7bGV0IHk9dy5nZXRDaGlsZHJlbigpO3YuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKF89PntwZS4kaXNUZXh0Tm9kZShfKSYmcGUuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKS5hcHBlbmQoXyksdy5hcHBlbmQoXyl9KSx5LmZvckVhY2goXz0+Xy5yZW1vdmUoKSksbSsrfWwrK311JiZjJiYoZT1wZS5ERVBSRUNBVEVEXyRjcmVhdGVHcmlkU2VsZWN0aW9uKCksZS5zZXQodC5nZXRLZXkoKSx1LGMpLHBlLiRzZXRTZWxlY3Rpb24oZSksci5kaXNwYXRjaENvbW1hbmQocGUuU0VMRUNUSU9OX0NIQU5HRV9DT01NQU5ELHZvaWQgMCkpfWZ1bmN0aW9uIGxDKGUsdCxuLHI9W10pe2xldCBpPXQhPW51bGw/bi5pc1NlbGVjdGVkKHQpOiEwLG89cGUuJGlzRWxlbWVudE5vZGUobikmJm4uZXhjbHVkZUZyb21Db3B5KCJodG1sIik7dmFyIGw9bjtpZih0IT09bnVsbCl7dmFyIHM9VG0uJGNsb25lV2l0aFByb3BlcnRpZXMobik7bD1zPXBlLiRpc1RleHROb2RlKHMpJiZ0IT1udWxsP1RtLiRzbGljZVNlbGVjdGVkVGV4dE5vZGVDb250ZW50KHQscyk6c31sZXQgYT1wZS4kaXNFbGVtZW50Tm9kZShsKT9sLmdldENoaWxkcmVuKCk6W107dmFyIHU9bDtzPXUuZXhwb3J0SlNPTigpO3ZhciBjPXUuY29uc3RydWN0b3I7cy50eXBlIT09Yy5nZXRUeXBlKCkmJmxpKDU4LGMubmFtZSk7bGV0IGQ9cy5jaGlsZHJlbjtmb3IocGUuJGlzRWxlbWVudE5vZGUodSkmJihBcnJheS5pc0FycmF5KGQpfHxsaSg1OSxjLm5hbWUpKSxwZS4kaXNUZXh0Tm9kZShsKSYmKGw9bC5fX3RleHQsMDxsLmxlbmd0aD9zLnRleHQ9bDppPSExKSxsPTA7bDxhLmxlbmd0aDtsKyspdT1hW2xdLGM9bEMoZSx0LHUscy5jaGlsZHJlbiksIWkmJnBlLiRpc0VsZW1lbnROb2RlKG4pJiZjJiZuLmV4dHJhY3RXaXRoQ2hpbGQodSx0LCJjbG9uZSIpJiYoaT0hMCk7aWYoaSYmIW8pci5wdXNoKHMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShzLmNoaWxkcmVuKSlmb3IoZT0wO2U8cy5jaGlsZHJlbi5sZW5ndGg7ZSsrKXIucHVzaChzLmNoaWxkcmVuW2VdKTtyZXR1cm4gaX1mdW5jdGlvbiBzQyhlLHQpe2xldCBuPVtdLHI9cGUuJGdldFJvb3QoKS5nZXRDaGlsZHJlbigpO2ZvcihsZXQgaT0wO2k8ci5sZW5ndGg7aSsrKWxDKGUsdCxyW2ldLG4pO3JldHVybntuYW1lc3BhY2U6ZS5fY29uZmlnLm5hbWVzcGFjZSxub2RlczpufX1mdW5jdGlvbiBhQyhlKXtsZXQgdD1bXTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7bGV0IHI9cGUuJHBhcnNlU2VyaWFsaXplZE5vZGUoZVtuXSk7cGUuJGlzVGV4dE5vZGUocikmJlRtLiRhZGROb2RlU3R5bGUociksdC5wdXNoKHIpfXJldHVybiB0fWxldCB5bD1udWxsO2Z1bmN0aW9uIHZ4KGUsdCl7dmFyIG49ckM/KGUuX3dpbmRvd3x8d2luZG93KS5nZXRTZWxlY3Rpb24oKTpudWxsO2lmKCFuKXJldHVybiExO3ZhciByPW4uYW5jaG9yTm9kZTtpZihuPW4uZm9jdXNOb2RlLHIhPT1udWxsJiZuIT09bnVsbCYmIXBlLmlzU2VsZWN0aW9uV2l0aGluRWRpdG9yKGUscixuKXx8KHQucHJldmVudERlZmF1bHQoKSx0PXQuY2xpcGJvYXJkRGF0YSxyPXBlLiRnZXRTZWxlY3Rpb24oKSx0PT09bnVsbHx8cj09PW51bGwpKXJldHVybiExO249aUMoZSksZT1vQyhlKTtsZXQgaT0iIjtyZXR1cm4gciE9PW51bGwmJihpPXIuZ2V0VGV4dENvbnRlbnQoKSksbiE9PW51bGwmJnQuc2V0RGF0YSgidGV4dC9odG1sIixuKSxlIT09bnVsbCYmdC5zZXREYXRhKCJhcHBsaWNhdGlvbi94LWxleGljYWwtZWRpdG9yIixlKSx0LnNldERhdGEoInRleHQvcGxhaW4iLGkpLCEwfVNpLiRnZW5lcmF0ZUpTT05Gcm9tU2VsZWN0ZWROb2Rlcz1zQztTaS4kZ2VuZXJhdGVOb2Rlc0Zyb21TZXJpYWxpemVkTm9kZXM9YUM7U2kuJGdldEh0bWxDb250ZW50PWlDO1NpLiRnZXRMZXhpY2FsQ29udGVudD1vQztTaS4kaW5zZXJ0RGF0YVRyYW5zZmVyRm9yUGxhaW5UZXh0PWZ1bmN0aW9uKGUsdCl7ZT1lLmdldERhdGEoInRleHQvcGxhaW4iKXx8ZS5nZXREYXRhKCJ0ZXh0L3VyaS1saXN0IiksZSE9bnVsbCYmdC5pbnNlcnRSYXdUZXh0KGUpfTtTaS4kaW5zZXJ0RGF0YVRyYW5zZmVyRm9yUmljaFRleHQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuZ2V0RGF0YSgiYXBwbGljYXRpb24veC1sZXhpY2FsLWVkaXRvciIpO2lmKHIpdHJ5e2xldCBsPUpTT04ucGFyc2Uocik7aWYobC5uYW1lc3BhY2U9PT1uLl9jb25maWcubmFtZXNwYWNlJiZBcnJheS5pc0FycmF5KGwubm9kZXMpKXtsZXQgcz1hQyhsLm5vZGVzKTtyZXR1cm4gTm0obixzLHQpfX1jYXRjaHt9aWYocj1lLmdldERhdGEoInRleHQvaHRtbCIpKXRyeXt2YXIgaT1uZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHIsInRleHQvaHRtbCIpLG89bkMuJGdlbmVyYXRlTm9kZXNGcm9tRE9NKG4saSk7cmV0dXJuIE5tKG4sbyx0KX1jYXRjaHt9aWYoZT1lLmdldERhdGEoInRleHQvcGxhaW4iKXx8ZS5nZXREYXRhKCJ0ZXh0L3VyaS1saXN0IiksZSE9bnVsbClpZihwZS4kaXNSYW5nZVNlbGVjdGlvbih0KSlmb3IoZT1lLnNwbGl0KC8oXHI/XG58XHQpLyksbj1lLmxlbmd0aCxpPTA7aTxuO2krKylvPWVbaV0sbz09PWAKYHx8bz09PWBccgpgP3QuaW5zZXJ0UGFyYWdyYXBoKCk6bz09PSIJIj90Lmluc2VydE5vZGVzKFtwZS4kY3JlYXRlVGFiTm9kZSgpXSk6dC5pbnNlcnRUZXh0KG8pO2Vsc2UgdC5pbnNlcnRSYXdUZXh0KGUpfTtTaS4kaW5zZXJ0R2VuZXJhdGVkTm9kZXM9Tm07U2kuY29weVRvQ2xpcGJvYXJkPWFzeW5jIGZ1bmN0aW9uKGUsdCl7aWYoeWwhPT1udWxsKXJldHVybiExO2lmKHQhPT1udWxsKXJldHVybiBuZXcgUHJvbWlzZShsPT57ZS51cGRhdGUoKCk9PntsKHZ4KGUsdCkpfSl9KTt2YXIgbj1lLmdldFJvb3RFbGVtZW50KCk7bGV0IHI9ZS5fd2luZG93PT1udWxsP3dpbmRvdy5kb2N1bWVudDplLl93aW5kb3cuZG9jdW1lbnQsaT1yQz8oZS5fd2luZG93fHx3aW5kb3cpLmdldFNlbGVjdGlvbigpOm51bGw7aWYobj09PW51bGx8fGk9PT1udWxsKXJldHVybiExO2xldCBvPXIuY3JlYXRlRWxlbWVudCgic3BhbiIpO3JldHVybiBvLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOiBmaXhlZDsgdG9wOiAtMTAwMHB4OyIsby5hcHBlbmQoci5jcmVhdGVUZXh0Tm9kZSgiIyIpKSxuLmFwcGVuZChvKSxuPW5ldyBSYW5nZSxuLnNldFN0YXJ0KG8sMCksbi5zZXRFbmQobywxKSxpLnJlbW92ZUFsbFJhbmdlcygpLGkuYWRkUmFuZ2UobiksbmV3IFByb21pc2UobD0+e2xldCBzPWUucmVnaXN0ZXJDb21tYW5kKHBlLkNPUFlfQ09NTUFORCxhPT4oUWwub2JqZWN0S2xhc3NFcXVhbHMoYSxDbGlwYm9hcmRFdmVudCkmJihzKCkseWwhPT1udWxsJiYod2luZG93LmNsZWFyVGltZW91dCh5bCkseWw9bnVsbCksbCh2eChlLGEpKSksITApLHBlLkNPTU1BTkRfUFJJT1JJVFlfQ1JJVElDQUwpO3lsPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT57cygpLHlsPW51bGwsbCghMSl9LDUwKSxyLmV4ZWNDb21tYW5kKCJjb3B5Iiksby5yZW1vdmUoKX0pfTtjb25zdCBOUD1TaTt2YXIgUlA9TlAsemQ9UlAseGM9bG8sanI9RnQsUD14ZTtmdW5jdGlvbiB5eChlLHQpe3JldHVybiB0eXBlb2YgZG9jdW1lbnQuY2FyZXRSYW5nZUZyb21Qb2ludDwidSI/KGU9ZG9jdW1lbnQuY2FyZXRSYW5nZUZyb21Qb2ludChlLHQpLGU9PT1udWxsP251bGw6e25vZGU6ZS5zdGFydENvbnRhaW5lcixvZmZzZXQ6ZS5zdGFydE9mZnNldH0pOmRvY3VtZW50LmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQhPT0idW5kZWZpbmVkIj8oZT1kb2N1bWVudC5jYXJldFBvc2l0aW9uRnJvbVBvaW50KGUsdCksZT09PW51bGw/bnVsbDp7bm9kZTplLm9mZnNldE5vZGUsb2Zmc2V0OmUub2Zmc2V0fSk6bnVsbH1sZXQgQXM9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiLE9QPUFzJiYiZG9jdW1lbnRNb2RlImluIGRvY3VtZW50P2RvY3VtZW50LmRvY3VtZW50TW9kZTpudWxsLFBQPUFzJiYiSW5wdXRFdmVudCJpbiB3aW5kb3cmJiFPUD8iZ2V0VGFyZ2V0UmFuZ2VzImluIG5ldyB3aW5kb3cuSW5wdXRFdmVudCgiaW5wdXQiKTohMSxBUD1BcyYmL1ZlcnNpb25cL1tcZC5dKy4qU2FmYXJpLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLE1QPUFzJiYvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmIXdpbmRvdy5NU1N0cmVhbSxEUD1BcyYmL14oPz0uKkNocm9tZSkuKi9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksTFA9QXMmJi9BcHBsZVdlYktpdFwvW1xkLl0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhRFAsUm09UC5jcmVhdGVDb21tYW5kKCJEUkFHX0RST1BfUEFTVEVfRklMRSIpLE52PWNsYXNzIHVDIGV4dGVuZHMgUC5FbGVtZW50Tm9kZXtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJxdW90ZSJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgdUModC5fX2tleSl9Y29uc3RydWN0b3IodCl7c3VwZXIodCl9Y3JlYXRlRE9NKHQpe2xldCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJsb2NrcXVvdGUiKTtyZXR1cm4ganIuYWRkQ2xhc3NOYW1lc1RvRWxlbWVudChuLHQudGhlbWUucXVvdGUpLG59dXBkYXRlRE9NKCl7cmV0dXJuITF9c3RhdGljIGltcG9ydERPTSgpe3JldHVybntibG9ja3F1b3RlOigpPT4oe2NvbnZlcnNpb246SVAscHJpb3JpdHk6MH0pfX1leHBvcnRET00odCl7aWYoe2VsZW1lbnQ6dH09c3VwZXIuZXhwb3J0RE9NKHQpLHQmJmpyLmlzSFRNTEVsZW1lbnQodCkpe3RoaXMuaXNFbXB0eSgpJiZ0LmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpKTt2YXIgbj10aGlzLmdldEZvcm1hdFR5cGUoKTt0LnN0eWxlLnRleHRBbGlnbj1uLChuPXRoaXMuZ2V0RGlyZWN0aW9uKCkpJiYodC5kaXI9bil9cmV0dXJue2VsZW1lbnQ6dH19c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49UnYoKTtyZXR1cm4gbi5zZXRGb3JtYXQodC5mb3JtYXQpLG4uc2V0SW5kZW50KHQuaW5kZW50KSxuLnNldERpcmVjdGlvbih0LmRpcmVjdGlvbiksbn1leHBvcnRKU09OKCl7cmV0dXJuey4uLnN1cGVyLmV4cG9ydEpTT04oKSx0eXBlOiJxdW90ZSJ9fWluc2VydE5ld0FmdGVyKHQsbil7dD1QLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk7bGV0IHI9dGhpcy5nZXREaXJlY3Rpb24oKTtyZXR1cm4gdC5zZXREaXJlY3Rpb24ociksdGhpcy5pbnNlcnRBZnRlcih0LG4pLHR9Y29sbGFwc2VBdFN0YXJ0KCl7bGV0IHQ9UC4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpO3JldHVybiB0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaChuPT50LmFwcGVuZChuKSksdGhpcy5yZXBsYWNlKHQpLCEwfX07ZnVuY3Rpb24gUnYoKXtyZXR1cm4gUC4kYXBwbHlOb2RlUmVwbGFjZW1lbnQobmV3IE52KX1sZXQgT3Y9Y2xhc3MgY0MgZXh0ZW5kcyBQLkVsZW1lbnROb2Rle3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuImhlYWRpbmcifXN0YXRpYyBjbG9uZSh0KXtyZXR1cm4gbmV3IGNDKHQuX190YWcsdC5fX2tleSl9Y29uc3RydWN0b3IodCxuKXtzdXBlcihuKSx0aGlzLl9fdGFnPXR9Z2V0VGFnKCl7cmV0dXJuIHRoaXMuX190YWd9Y3JlYXRlRE9NKHQpe2xldCBuPXRoaXMuX190YWcscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KG4pO3JldHVybiB0PXQudGhlbWUuaGVhZGluZyx0IT09dm9pZCAwJiZqci5hZGRDbGFzc05hbWVzVG9FbGVtZW50KHIsdFtuXSkscn11cGRhdGVET00oKXtyZXR1cm4hMX1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJue2gxOigpPT4oe2NvbnZlcnNpb246eGwscHJpb3JpdHk6MH0pLGgyOigpPT4oe2NvbnZlcnNpb246eGwscHJpb3JpdHk6MH0pLGgzOigpPT4oe2NvbnZlcnNpb246eGwscHJpb3JpdHk6MH0pLGg0OigpPT4oe2NvbnZlcnNpb246eGwscHJpb3JpdHk6MH0pLGg1OigpPT4oe2NvbnZlcnNpb246eGwscHJpb3JpdHk6MH0pLGg2OigpPT4oe2NvbnZlcnNpb246eGwscHJpb3JpdHk6MH0pLHA6dD0+KHQ9dC5maXJzdENoaWxkLHQhPT1udWxsJiZ4eCh0KT97Y29udmVyc2lvbjooKT0+KHtub2RlOm51bGx9KSxwcmlvcml0eTozfTpudWxsKSxzcGFuOnQ9Pnh4KHQpP3tjb252ZXJzaW9uOigpPT4oe25vZGU6QmwoImgxIil9KSxwcmlvcml0eTozfTpudWxsfX1leHBvcnRET00odCl7aWYoe2VsZW1lbnQ6dH09c3VwZXIuZXhwb3J0RE9NKHQpLHQmJmpyLmlzSFRNTEVsZW1lbnQodCkpe3RoaXMuaXNFbXB0eSgpJiZ0LmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpKTt2YXIgbj10aGlzLmdldEZvcm1hdFR5cGUoKTt0LnN0eWxlLnRleHRBbGlnbj1uLChuPXRoaXMuZ2V0RGlyZWN0aW9uKCkpJiYodC5kaXI9bil9cmV0dXJue2VsZW1lbnQ6dH19c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49QmwodC50YWcpO3JldHVybiBuLnNldEZvcm1hdCh0LmZvcm1hdCksbi5zZXRJbmRlbnQodC5pbmRlbnQpLG4uc2V0RGlyZWN0aW9uKHQuZGlyZWN0aW9uKSxufWV4cG9ydEpTT04oKXtyZXR1cm57Li4uc3VwZXIuZXhwb3J0SlNPTigpLHRhZzp0aGlzLmdldFRhZygpLHR5cGU6ImhlYWRpbmciLHZlcnNpb246MX19aW5zZXJ0TmV3QWZ0ZXIodCxuPSEwKXt0PXQ/dC5hbmNob3Iub2Zmc2V0OjAsdD0wPHQmJnQ8dGhpcy5nZXRUZXh0Q29udGVudFNpemUoKT9CbCh0aGlzLmdldFRhZygpKTpQLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk7bGV0IHI9dGhpcy5nZXREaXJlY3Rpb24oKTtyZXR1cm4gdC5zZXREaXJlY3Rpb24ociksdGhpcy5pbnNlcnRBZnRlcih0LG4pLHR9Y29sbGFwc2VBdFN0YXJ0KCl7bGV0IHQ9dGhpcy5pc0VtcHR5KCk/UC4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpOkJsKHRoaXMuZ2V0VGFnKCkpO3JldHVybiB0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaChuPT50LmFwcGVuZChuKSksdGhpcy5yZXBsYWNlKHQpLCEwfWV4dHJhY3RXaXRoQ2hpbGQoKXtyZXR1cm4hMH19O2Z1bmN0aW9uIHh4KGUpe3JldHVybiBlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0ic3BhbiI/ZS5zdHlsZS5mb250U2l6ZT09PSIyNnB0IjohMX1mdW5jdGlvbiB4bChlKXtsZXQgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbj1udWxsO3JldHVybih0PT09ImgxInx8dD09PSJoMiJ8fHQ9PT0iaDMifHx0PT09Img0Inx8dD09PSJoNSJ8fHQ9PT0iaDYiKSYmKG49QmwodCksZS5zdHlsZSE9PW51bGwmJm4uc2V0Rm9ybWF0KGUuc3R5bGUudGV4dEFsaWduKSkse25vZGU6bn19ZnVuY3Rpb24gSVAoZSl7bGV0IHQ9UnYoKTtyZXR1cm4gZS5zdHlsZSE9PW51bGwmJnQuc2V0Rm9ybWF0KGUuc3R5bGUudGV4dEFsaWduKSx7bm9kZTp0fX1mdW5jdGlvbiBCbChlKXtyZXR1cm4gUC4kYXBwbHlOb2RlUmVwbGFjZW1lbnQobmV3IE92KGUpKX1mdW5jdGlvbiBqUChlLHQpe2UucHJldmVudERlZmF1bHQoKSx0LnVwZGF0ZSgoKT0+e2xldCBuPVAuJGdldFNlbGVjdGlvbigpLHI9ZSBpbnN0YW5jZW9mIElucHV0RXZlbnR8fGUgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50P251bGw6ZS5jbGlwYm9hcmREYXRhO3IhPW51bGwmJihQLiRpc1JhbmdlU2VsZWN0aW9uKG4pfHxQLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbihuKSkmJnpkLiRpbnNlcnREYXRhVHJhbnNmZXJGb3JSaWNoVGV4dChyLG4sdCl9LHt0YWc6InBhc3RlIn0pfWFzeW5jIGZ1bmN0aW9uIHpQKGUsdCl7YXdhaXQgemQuY29weVRvQ2xpcGJvYXJkKHQsanIub2JqZWN0S2xhc3NFcXVhbHMoZSxDbGlwYm9hcmRFdmVudCk/ZTpudWxsKSx0LnVwZGF0ZSgoKT0+e2xldCBuPVAuJGdldFNlbGVjdGlvbigpO1AuJGlzUmFuZ2VTZWxlY3Rpb24obik/bi5yZW1vdmVUZXh0KCk6UC4kaXNOb2RlU2VsZWN0aW9uKG4pJiZuLmdldE5vZGVzKCkuZm9yRWFjaChyPT5yLnJlbW92ZSgpKX0pfWZ1bmN0aW9uIGhhKGUpe2xldCB0PW51bGw7aWYoZSBpbnN0YW5jZW9mIERyYWdFdmVudD90PWUuZGF0YVRyYW5zZmVyOmUgaW5zdGFuY2VvZiBDbGlwYm9hcmRFdmVudCYmKHQ9ZS5jbGlwYm9hcmREYXRhKSx0PT09bnVsbClyZXR1cm5bITEsW10sITFdO3ZhciBuPXQudHlwZXM7cmV0dXJuIGU9bi5pbmNsdWRlcygiRmlsZXMiKSxuPW4uaW5jbHVkZXMoInRleHQvaHRtbCIpfHxuLmluY2x1ZGVzKCJ0ZXh0L3BsYWluIiksW2UsQXJyYXkuZnJvbSh0LmZpbGVzKSxuXX1mdW5jdGlvbiBfeChlKXt2YXIgdD1QLiRnZXRTZWxlY3Rpb24oKTtpZighUC4kaXNSYW5nZVNlbGVjdGlvbih0KSlyZXR1cm4hMTtsZXQgbj1uZXcgU2V0O3Q9dC5nZXROb2RlcygpO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXt2YXIgcj10W29dLGk9ci5nZXRLZXkoKTtuLmhhcyhpKXx8KHI9anIuJGdldE5lYXJlc3RCbG9ja0VsZW1lbnRBbmNlc3Rvck9yVGhyb3cociksaT1yLmdldEtleSgpLHIuY2FuSW5kZW50KCkmJiFuLmhhcyhpKSYmKG4uYWRkKGkpLGUocikpKX1yZXR1cm4gMDxuLnNpemV9ZnVuY3Rpb24gX2MoZSl7cmV0dXJuIGU9UC4kZ2V0TmVhcmVzdE5vZGVGcm9tRE9NTm9kZShlKSxQLiRpc0RlY29yYXRvck5vZGUoZSl9SnIuJGNyZWF0ZUhlYWRpbmdOb2RlPUJsO0pyLiRjcmVhdGVRdW90ZU5vZGU9UnY7SnIuJGlzSGVhZGluZ05vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBPdn07SnIuJGlzUXVvdGVOb2RlPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgTnZ9O0pyLkRSQUdfRFJPUF9QQVNURT1SbTtKci5IZWFkaW5nTm9kZT1PdjtKci5RdW90ZU5vZGU9TnY7SnIuZXZlbnRGaWxlcz1oYTtKci5yZWdpc3RlclJpY2hUZXh0PWZ1bmN0aW9uKGUpe3JldHVybiBqci5tZXJnZVJlZ2lzdGVyKGUucmVnaXN0ZXJDb21tYW5kKFAuQ0xJQ0tfQ09NTUFORCwoKT0+e2NvbnN0IHQ9UC4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIFAuJGlzTm9kZVNlbGVjdGlvbih0KT8odC5jbGVhcigpLCEwKTohMX0sMCksZS5yZWdpc3RlckNvbW1hbmQoUC5ERUxFVEVfQ0hBUkFDVEVSX0NPTU1BTkQsdD0+e2NvbnN0IG49UC4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIFAuJGlzUmFuZ2VTZWxlY3Rpb24obik/KG4uZGVsZXRlQ2hhcmFjdGVyKHQpLCEwKTohMX0sUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoUC5ERUxFVEVfV09SRF9DT01NQU5ELHQ9Pntjb25zdCBuPVAuJGdldFNlbGVjdGlvbigpO3JldHVybiBQLiRpc1JhbmdlU2VsZWN0aW9uKG4pPyhuLmRlbGV0ZVdvcmQodCksITApOiExfSxQLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChQLkRFTEVURV9MSU5FX0NPTU1BTkQsdD0+e2NvbnN0IG49UC4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIFAuJGlzUmFuZ2VTZWxlY3Rpb24obik/KG4uZGVsZXRlTGluZSh0KSwhMCk6ITF9LFAuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKFAuQ09OVFJPTExFRF9URVhUX0lOU0VSVElPTl9DT01NQU5ELHQ9Pntjb25zdCBuPVAuJGdldFNlbGVjdGlvbigpO2lmKHR5cGVvZiB0PT0ic3RyaW5nIilQLiRpc1JhbmdlU2VsZWN0aW9uKG4pP24uaW5zZXJ0VGV4dCh0KTpQLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbihuKTtlbHNle2lmKCFQLiRpc1JhbmdlU2VsZWN0aW9uKG4pJiYhUC5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24obikpcmV0dXJuITE7Y29uc3Qgcj10LmRhdGFUcmFuc2ZlcjtyIT1udWxsP3pkLiRpbnNlcnREYXRhVHJhbnNmZXJGb3JSaWNoVGV4dChyLG4sZSk6UC4kaXNSYW5nZVNlbGVjdGlvbihuKSYmKHQ9dC5kYXRhKSYmbi5pbnNlcnRUZXh0KHQpfXJldHVybiEwfSxQLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChQLlJFTU9WRV9URVhUX0NPTU1BTkQsKCk9Pntjb25zdCB0PVAuJGdldFNlbGVjdGlvbigpO3JldHVybiBQLiRpc1JhbmdlU2VsZWN0aW9uKHQpPyh0LnJlbW92ZVRleHQoKSwhMCk6ITF9LFAuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKFAuRk9STUFUX1RFWFRfQ09NTUFORCx0PT57Y29uc3Qgbj1QLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gUC4kaXNSYW5nZVNlbGVjdGlvbihuKT8obi5mb3JtYXRUZXh0KHQpLCEwKTohMX0sUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoUC5GT1JNQVRfRUxFTUVOVF9DT01NQU5ELHQ9Pnt2YXIgbj1QLiRnZXRTZWxlY3Rpb24oKTtpZighUC4kaXNSYW5nZVNlbGVjdGlvbihuKSYmIVAuJGlzTm9kZVNlbGVjdGlvbihuKSlyZXR1cm4hMTtuPW4uZ2V0Tm9kZXMoKTtmb3IoY29uc3QgciBvZiBuKW49anIuJGZpbmRNYXRjaGluZ1BhcmVudChyLGk9PlAuJGlzRWxlbWVudE5vZGUoaSkmJiFpLmlzSW5saW5lKCkpLG4hPT1udWxsJiZuLnNldEZvcm1hdCh0KTtyZXR1cm4hMH0sUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoUC5JTlNFUlRfTElORV9CUkVBS19DT01NQU5ELHQ9Pntjb25zdCBuPVAuJGdldFNlbGVjdGlvbigpO3JldHVybiBQLiRpc1JhbmdlU2VsZWN0aW9uKG4pPyhuLmluc2VydExpbmVCcmVhayh0KSwhMCk6ITF9LFAuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKFAuSU5TRVJUX1BBUkFHUkFQSF9DT01NQU5ELCgpPT57Y29uc3QgdD1QLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gUC4kaXNSYW5nZVNlbGVjdGlvbih0KT8odC5pbnNlcnRQYXJhZ3JhcGgoKSwhMCk6ITF9LFAuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKFAuSU5TRVJUX1RBQl9DT01NQU5ELCgpPT4oUC4kaW5zZXJ0Tm9kZXMoW1AuJGNyZWF0ZVRhYk5vZGUoKV0pLCEwKSxQLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChQLklOREVOVF9DT05URU5UX0NPTU1BTkQsKCk9Pl94KHQ9Pntjb25zdCBuPXQuZ2V0SW5kZW50KCk7dC5zZXRJbmRlbnQobisxKX0pLFAuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKFAuT1VUREVOVF9DT05URU5UX0NPTU1BTkQsKCk9Pl94KHQ9Pntjb25zdCBuPXQuZ2V0SW5kZW50KCk7MDxuJiZ0LnNldEluZGVudChuLTEpfSksUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoUC5LRVlfQVJST1dfVVBfQ09NTUFORCx0PT57dmFyIG49UC4kZ2V0U2VsZWN0aW9uKCk7aWYoUC4kaXNOb2RlU2VsZWN0aW9uKG4pJiYhX2ModC50YXJnZXQpKXtpZih0PW4uZ2V0Tm9kZXMoKSwwPHQubGVuZ3RoKXJldHVybiB0WzBdLnNlbGVjdFByZXZpb3VzKCksITB9ZWxzZSBpZihQLiRpc1JhbmdlU2VsZWN0aW9uKG4pJiYobj1QLiRnZXRBZGphY2VudE5vZGUobi5mb2N1cywhMCksIXQuc2hpZnRLZXkmJlAuJGlzRGVjb3JhdG9yTm9kZShuKSYmIW4uaXNJc29sYXRlZCgpJiYhbi5pc0lubGluZSgpKSlyZXR1cm4gbi5zZWxlY3RQcmV2aW91cygpLHQucHJldmVudERlZmF1bHQoKSwhMDtyZXR1cm4hMX0sUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoUC5LRVlfQVJST1dfRE9XTl9DT01NQU5ELHQ9Pnt2YXIgbj1QLiRnZXRTZWxlY3Rpb24oKTtpZihQLiRpc05vZGVTZWxlY3Rpb24obikpe2lmKHQ9bi5nZXROb2RlcygpLDA8dC5sZW5ndGgpcmV0dXJuIHRbMF0uc2VsZWN0TmV4dCgwLDApLCEwfWVsc2UgaWYoUC4kaXNSYW5nZVNlbGVjdGlvbihuKSl7bGV0IHI9bi5mb2N1cztpZihyLmtleT09PSJyb290IiYmci5vZmZzZXQ9PT1QLiRnZXRSb290KCkuZ2V0Q2hpbGRyZW5TaXplKCkpcmV0dXJuIHQucHJldmVudERlZmF1bHQoKSwhMDtpZihuPVAuJGdldEFkamFjZW50Tm9kZShuLmZvY3VzLCExKSwhdC5zaGlmdEtleSYmUC4kaXNEZWNvcmF0b3JOb2RlKG4pJiYhbi5pc0lzb2xhdGVkKCkmJiFuLmlzSW5saW5lKCkpcmV0dXJuIG4uc2VsZWN0TmV4dCgpLHQucHJldmVudERlZmF1bHQoKSwhMH1yZXR1cm4hMX0sUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoUC5LRVlfQVJST1dfTEVGVF9DT01NQU5ELHQ9Pntjb25zdCBuPVAuJGdldFNlbGVjdGlvbigpO2lmKFAuJGlzTm9kZVNlbGVjdGlvbihuKSl7dmFyIHI9bi5nZXROb2RlcygpO2lmKDA8ci5sZW5ndGgpcmV0dXJuIHQucHJldmVudERlZmF1bHQoKSxyWzBdLnNlbGVjdFByZXZpb3VzKCksITB9cmV0dXJuIFAuJGlzUmFuZ2VTZWxlY3Rpb24obikmJnhjLiRzaG91bGRPdmVycmlkZURlZmF1bHRDaGFyYWN0ZXJTZWxlY3Rpb24obiwhMCk/KHI9dC5zaGlmdEtleSx0LnByZXZlbnREZWZhdWx0KCkseGMuJG1vdmVDaGFyYWN0ZXIobixyLCEwKSwhMCk6ITF9LFAuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKFAuS0VZX0FSUk9XX1JJR0hUX0NPTU1BTkQsdD0+e2NvbnN0IG49UC4kZ2V0U2VsZWN0aW9uKCk7aWYoUC4kaXNOb2RlU2VsZWN0aW9uKG4pJiYhX2ModC50YXJnZXQpKXt2YXIgcj1uLmdldE5vZGVzKCk7aWYoMDxyLmxlbmd0aClyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpLHJbMF0uc2VsZWN0TmV4dCgwLDApLCEwfXJldHVybiBQLiRpc1JhbmdlU2VsZWN0aW9uKG4pPyhyPXQuc2hpZnRLZXkseGMuJHNob3VsZE92ZXJyaWRlRGVmYXVsdENoYXJhY3RlclNlbGVjdGlvbihuLCExKT8odC5wcmV2ZW50RGVmYXVsdCgpLHhjLiRtb3ZlQ2hhcmFjdGVyKG4sciwhMSksITApOiExKTohMX0sUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoUC5LRVlfQkFDS1NQQUNFX0NPTU1BTkQsdD0+e2lmKF9jKHQudGFyZ2V0KSlyZXR1cm4hMTtjb25zdCBuPVAuJGdldFNlbGVjdGlvbigpO2lmKCFQLiRpc1JhbmdlU2VsZWN0aW9uKG4pKXJldHVybiExO3QucHJldmVudERlZmF1bHQoKSx7YW5jaG9yOnR9PW47Y29uc3Qgcj10LmdldE5vZGUoKTtyZXR1cm4gbi5pc0NvbGxhcHNlZCgpJiZ0Lm9mZnNldD09PTAmJiFQLiRpc1Jvb3ROb2RlKHIpJiYwPGpyLiRnZXROZWFyZXN0QmxvY2tFbGVtZW50QW5jZXN0b3JPclRocm93KHIpLmdldEluZGVudCgpP2UuZGlzcGF0Y2hDb21tYW5kKFAuT1VUREVOVF9DT05URU5UX0NPTU1BTkQsdm9pZCAwKTplLmRpc3BhdGNoQ29tbWFuZChQLkRFTEVURV9DSEFSQUNURVJfQ09NTUFORCwhMCl9LFAuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKFAuS0VZX0RFTEVURV9DT01NQU5ELHQ9PntpZihfYyh0LnRhcmdldCkpcmV0dXJuITE7Y29uc3Qgbj1QLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gUC4kaXNSYW5nZVNlbGVjdGlvbihuKT8odC5wcmV2ZW50RGVmYXVsdCgpLGUuZGlzcGF0Y2hDb21tYW5kKFAuREVMRVRFX0NIQVJBQ1RFUl9DT01NQU5ELCExKSk6ITF9LFAuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKFAuS0VZX0VOVEVSX0NPTU1BTkQsdD0+e2NvbnN0IG49UC4kZ2V0U2VsZWN0aW9uKCk7aWYoIVAuJGlzUmFuZ2VTZWxlY3Rpb24obikpcmV0dXJuITE7aWYodCE9PW51bGwpe2lmKChNUHx8QVB8fExQKSYmUFApcmV0dXJuITE7aWYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc2hpZnRLZXkpcmV0dXJuIGUuZGlzcGF0Y2hDb21tYW5kKFAuSU5TRVJUX0xJTkVfQlJFQUtfQ09NTUFORCwhMSl9cmV0dXJuIGUuZGlzcGF0Y2hDb21tYW5kKFAuSU5TRVJUX1BBUkFHUkFQSF9DT01NQU5ELHZvaWQgMCl9LFAuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKFAuS0VZX0VTQ0FQRV9DT01NQU5ELCgpPT57Y29uc3QgdD1QLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gUC4kaXNSYW5nZVNlbGVjdGlvbih0KT8oZS5ibHVyKCksITApOiExfSxQLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChQLkRST1BfQ09NTUFORCx0PT57Y29uc3RbLG5dPWhhKHQpO2lmKDA8bi5sZW5ndGgpe3ZhciByPXl4KHQuY2xpZW50WCx0LmNsaWVudFkpO2lmKHIhPT1udWxsKXtjb25zdHtvZmZzZXQ6byxub2RlOmx9PXI7dmFyIGk9UC4kZ2V0TmVhcmVzdE5vZGVGcm9tRE9NTm9kZShsKTtpZihpIT09bnVsbCl7aWYocj1QLiRjcmVhdGVSYW5nZVNlbGVjdGlvbigpLFAuJGlzVGV4dE5vZGUoaSkpci5hbmNob3Iuc2V0KGkuZ2V0S2V5KCksbywidGV4dCIpLHIuZm9jdXMuc2V0KGkuZ2V0S2V5KCksbywidGV4dCIpO2Vsc2V7Y29uc3Qgcz1pLmdldFBhcmVudE9yVGhyb3coKS5nZXRLZXkoKTtpPWkuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsxLHIuYW5jaG9yLnNldChzLGksImVsZW1lbnQiKSxyLmZvY3VzLnNldChzLGksImVsZW1lbnQiKX1yPVAuJG5vcm1hbGl6ZVNlbGVjdGlvbl9fRVhQRVJJTUVOVEFMKHIpLFAuJHNldFNlbGVjdGlvbihyKX1lLmRpc3BhdGNoQ29tbWFuZChSbSxuKX1yZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpLCEwfXJldHVybiB0PVAuJGdldFNlbGVjdGlvbigpLCEhUC4kaXNSYW5nZVNlbGVjdGlvbih0KX0sUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoUC5EUkFHU1RBUlRfQ09NTUFORCx0PT57W3RdPWhhKHQpO2NvbnN0IG49UC4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuISh0JiYhUC4kaXNSYW5nZVNlbGVjdGlvbihuKSl9LFAuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKFAuRFJBR09WRVJfQ09NTUFORCx0PT57dmFyW25dPWhhKHQpO2NvbnN0IHI9UC4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIG4mJiFQLiRpc1JhbmdlU2VsZWN0aW9uKHIpPyExOihuPXl4KHQuY2xpZW50WCx0LmNsaWVudFkpLG4hPT1udWxsJiYobj1QLiRnZXROZWFyZXN0Tm9kZUZyb21ET01Ob2RlKG4ubm9kZSksUC4kaXNEZWNvcmF0b3JOb2RlKG4pJiZ0LnByZXZlbnREZWZhdWx0KCkpLCEwKX0sUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoUC5TRUxFQ1RfQUxMX0NPTU1BTkQsKCk9PihQLiRzZWxlY3RBbGwoKSwhMCksUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoUC5DT1BZX0NPTU1BTkQsdD0+KHpkLmNvcHlUb0NsaXBib2FyZChlLGpyLm9iamVjdEtsYXNzRXF1YWxzKHQsQ2xpcGJvYXJkRXZlbnQpP3Q6bnVsbCksITApLFAuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKFAuQ1VUX0NPTU1BTkQsdD0+KHpQKHQsZSksITApLFAuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKFAuUEFTVEVfQ09NTUFORCx0PT57Y29uc3RbLG4scl09aGEodCk7aWYoMDxuLmxlbmd0aCYmIXIpcmV0dXJuIGUuZGlzcGF0Y2hDb21tYW5kKFJtLG4pLCEwO2lmKFAuaXNTZWxlY3Rpb25DYXB0dXJlZEluRGVjb3JhdG9ySW5wdXQodC50YXJnZXQpKXJldHVybiExO2NvbnN0IGk9UC4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIFAuJGlzUmFuZ2VTZWxlY3Rpb24oaSl8fFAuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKGkpPyhqUCh0LGUpLCEwKTohMX0sUC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUikpfTtjb25zdCBGUD1Kcjt2YXIgQWE9RlAsZEM9VHIsQlA9eFAsSm49cCxVUD13UCxmQz1GdCx3eD1HcixXUD1FUCxWUD1BYSxQdj10eXBlb2Ygd2luZG93PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudDwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudDwidSI/Sm4udXNlTGF5b3V0RWZmZWN0OkpuLnVzZUVmZmVjdDtmdW5jdGlvbiBTeChlKXtyZXR1cm4gZS5nZXRFZGl0b3JTdGF0ZSgpLnJlYWQoVVAuJGNhblNob3dQbGFjZWhvbGRlckN1cnJ5KGUuaXNDb21wb3NpbmcoKSkpfWZ1bmN0aW9uIEhQKGUpe2xldFt0LG5dPUpuLnVzZVN0YXRlKCgpPT5TeChlKSk7cmV0dXJuIFB2KCgpPT57ZnVuY3Rpb24gcigpe2xldCBpPVN4KGUpO24oaSl9cmV0dXJuIHIoKSxmQy5tZXJnZVJlZ2lzdGVyKGUucmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcigoKT0+e3IoKX0pLGUucmVnaXN0ZXJFZGl0YWJsZUxpc3RlbmVyKCgpPT57cigpfSkpfSxbZV0pLHR9ZnVuY3Rpb24gS1AoZSx0KXtsZXRbbixyXT1Kbi51c2VTdGF0ZSgoKT0+ZS5nZXREZWNvcmF0b3JzKCkpO3JldHVybiBQdigoKT0+ZS5yZWdpc3RlckRlY29yYXRvckxpc3RlbmVyKGk9Pnt3eC5mbHVzaFN5bmMoKCk9PntyKGkpfSl9KSxbZV0pLEpuLnVzZUVmZmVjdCgoKT0+e3IoZS5nZXREZWNvcmF0b3JzKCkpfSxbZV0pLEpuLnVzZU1lbW8oKCk9PntsZXQgaT1bXSxvPU9iamVjdC5rZXlzKG4pO2ZvcihsZXQgbD0wO2w8by5sZW5ndGg7bCsrKXtsZXQgcz1vW2xdLGE9Sm4uY3JlYXRlRWxlbWVudCh0LHtvbkVycm9yOmM9PmUuX29uRXJyb3IoYyl9LEpuLmNyZWF0ZUVsZW1lbnQoSm4uU3VzcGVuc2Use2ZhbGxiYWNrOm51bGx9LG5bc10pKSx1PWUuZ2V0RWxlbWVudEJ5S2V5KHMpO3UhPT1udWxsJiZpLnB1c2god3guY3JlYXRlUG9ydGFsKGEsdSxzKSl9cmV0dXJuIGl9LFt0LG4sZV0pfWZ1bmN0aW9uIFpQKGUpe1B2KCgpPT5mQy5tZXJnZVJlZ2lzdGVyKFZQLnJlZ2lzdGVyUmljaFRleHQoZSksV1AucmVnaXN0ZXJEcmFnb25TdXBwb3J0KGUpKSxbZV0pfWZ1bmN0aW9uIEdQKHtjb250ZW50OmV9KXt2YXJbdF09ZEMudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3Q9SFAodCk7bGV0IG49QlAoKTtyZXR1cm4gdD90eXBlb2YgZT09ImZ1bmN0aW9uIj9lKG4pOmU6bnVsbH1ZRS5SaWNoVGV4dFBsdWdpbj1mdW5jdGlvbih7Y29udGVudEVkaXRhYmxlOmUscGxhY2Vob2xkZXI6dCxFcnJvckJvdW5kYXJ5Om59KXtsZXRbcl09ZEMudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3JldHVybiBuPUtQKHIsbiksWlAociksSm4uY3JlYXRlRWxlbWVudChKbi5GcmFnbWVudCxudWxsLGUsSm4uY3JlYXRlRWxlbWVudChHUCx7Y29udGVudDp0fSksbil9O2NvbnN0IFlQPVlFO3ZhciBYUD1ZUCxoQz17fSxuaT1qaSxRUD1UcixwQz1wLEpQPUZ0LGVhPXhlO2Z1bmN0aW9uIHFQKGUpe3BDLnVzZUVmZmVjdCgoKT0+SlAubWVyZ2VSZWdpc3RlcihlLnJlZ2lzdGVyQ29tbWFuZChuaS5JTlNFUlRfT1JERVJFRF9MSVNUX0NPTU1BTkQsKCk9PihuaS5pbnNlcnRMaXN0KGUsIm51bWJlciIpLCEwKSxlYS5DT01NQU5EX1BSSU9SSVRZX0xPVyksZS5yZWdpc3RlckNvbW1hbmQobmkuSU5TRVJUX1VOT1JERVJFRF9MSVNUX0NPTU1BTkQsKCk9PihuaS5pbnNlcnRMaXN0KGUsImJ1bGxldCIpLCEwKSxlYS5DT01NQU5EX1BSSU9SSVRZX0xPVyksZS5yZWdpc3RlckNvbW1hbmQobmkuUkVNT1ZFX0xJU1RfQ09NTUFORCwoKT0+KG5pLnJlbW92ZUxpc3QoZSksITApLGVhLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSxlLnJlZ2lzdGVyQ29tbWFuZChlYS5JTlNFUlRfUEFSQUdSQVBIX0NPTU1BTkQsKCk9PiEhbmkuJGhhbmRsZUxpc3RJbnNlcnRQYXJhZ3JhcGgoKSxlYS5DT01NQU5EX1BSSU9SSVRZX0xPVykpLFtlXSl9aEMuTGlzdFBsdWdpbj1mdW5jdGlvbigpe2xldFtlXT1RUC51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7cmV0dXJuIHBDLnVzZUVmZmVjdCgoKT0+e2lmKCFlLmhhc05vZGVzKFtuaS5MaXN0Tm9kZSxuaS5MaXN0SXRlbU5vZGVdKSl0aHJvdyBFcnJvcigiTGlzdFBsdWdpbjogTGlzdE5vZGUgYW5kL29yIExpc3RJdGVtTm9kZSBub3QgcmVnaXN0ZXJlZCBvbiBlZGl0b3IiKX0sW2VdKSxxUChlKSxudWxsfTtjb25zdCBlQT1oQzt2YXIgdEE9ZUEsbUM9e30sRWk9e30sZ0M9RnQsVXI9eGU7bGV0IG5BPW5ldyBTZXQoWyJodHRwOiIsImh0dHBzOiIsIm1haWx0bzoiLCJzbXM6IiwidGVsOiJdKTtjbGFzcyBNcyBleHRlbmRzIFVyLkVsZW1lbnROb2Rle3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuImxpbmsifXN0YXRpYyBjbG9uZSh0KXtyZXR1cm4gbmV3IE1zKHQuX191cmwse3JlbDp0Ll9fcmVsLHRhcmdldDp0Ll9fdGFyZ2V0LHRpdGxlOnQuX190aXRsZX0sdC5fX2tleSl9Y29uc3RydWN0b3IodCxuPXt9LHIpe3N1cGVyKHIpO2xldHt0YXJnZXQ6aT1udWxsLHJlbDpvPW51bGwsdGl0bGU6bD1udWxsfT1uO3RoaXMuX191cmw9dCx0aGlzLl9fdGFyZ2V0PWksdGhpcy5fX3JlbD1vLHRoaXMuX190aXRsZT1sfWNyZWF0ZURPTSh0KXtsZXQgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7cmV0dXJuIG4uaHJlZj10aGlzLnNhbml0aXplVXJsKHRoaXMuX191cmwpLHRoaXMuX190YXJnZXQhPT1udWxsJiYobi50YXJnZXQ9dGhpcy5fX3RhcmdldCksdGhpcy5fX3JlbCE9PW51bGwmJihuLnJlbD10aGlzLl9fcmVsKSx0aGlzLl9fdGl0bGUhPT1udWxsJiYobi50aXRsZT10aGlzLl9fdGl0bGUpLGdDLmFkZENsYXNzTmFtZXNUb0VsZW1lbnQobix0LnRoZW1lLmxpbmspLG59dXBkYXRlRE9NKHQsbil7bGV0IHI9dGhpcy5fX3VybCxpPXRoaXMuX190YXJnZXQsbz10aGlzLl9fcmVsLGw9dGhpcy5fX3RpdGxlO3JldHVybiByIT09dC5fX3VybCYmKG4uaHJlZj1yKSxpIT09dC5fX3RhcmdldCYmKGk/bi50YXJnZXQ9aTpuLnJlbW92ZUF0dHJpYnV0ZSgidGFyZ2V0IikpLG8hPT10Ll9fcmVsJiYobz9uLnJlbD1vOm4ucmVtb3ZlQXR0cmlidXRlKCJyZWwiKSksbCE9PXQuX190aXRsZSYmKGw/bi50aXRsZT1sOm4ucmVtb3ZlQXR0cmlidXRlKCJ0aXRsZSIpKSwhMX1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJue2E6KCk9Pih7Y29udmVyc2lvbjpyQSxwcmlvcml0eToxfSl9fXN0YXRpYyBpbXBvcnRKU09OKHQpe2xldCBuPWN1KHQudXJsLHtyZWw6dC5yZWwsdGFyZ2V0OnQudGFyZ2V0LHRpdGxlOnQudGl0bGV9KTtyZXR1cm4gbi5zZXRGb3JtYXQodC5mb3JtYXQpLG4uc2V0SW5kZW50KHQuaW5kZW50KSxuLnNldERpcmVjdGlvbih0LmRpcmVjdGlvbiksbn1zYW5pdGl6ZVVybCh0KXt0cnl7bGV0IG49bmV3IFVSTCh0KTtpZighbkEuaGFzKG4ucHJvdG9jb2wpKXJldHVybiJhYm91dDpibGFuayJ9Y2F0Y2h7fXJldHVybiB0fWV4cG9ydEpTT04oKXtyZXR1cm57Li4uc3VwZXIuZXhwb3J0SlNPTigpLHJlbDp0aGlzLmdldFJlbCgpLHRhcmdldDp0aGlzLmdldFRhcmdldCgpLHRpdGxlOnRoaXMuZ2V0VGl0bGUoKSx0eXBlOiJsaW5rIix1cmw6dGhpcy5nZXRVUkwoKSx2ZXJzaW9uOjF9fWdldFVSTCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fdXJsfXNldFVSTCh0KXt0aGlzLmdldFdyaXRhYmxlKCkuX191cmw9dH1nZXRUYXJnZXQoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3RhcmdldH1zZXRUYXJnZXQodCl7dGhpcy5nZXRXcml0YWJsZSgpLl9fdGFyZ2V0PXR9Z2V0UmVsKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19yZWx9c2V0UmVsKHQpe3RoaXMuZ2V0V3JpdGFibGUoKS5fX3JlbD10fWdldFRpdGxlKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX190aXRsZX1zZXRUaXRsZSh0KXt0aGlzLmdldFdyaXRhYmxlKCkuX190aXRsZT10fWluc2VydE5ld0FmdGVyKHQsbj0hMCl7cmV0dXJuIHQ9dGhpcy5nZXRQYXJlbnRPclRocm93KCkuaW5zZXJ0TmV3QWZ0ZXIodCxuKSxVci4kaXNFbGVtZW50Tm9kZSh0KT8obj1jdSh0aGlzLl9fdXJsLHtyZWw6dGhpcy5fX3JlbCx0YXJnZXQ6dGhpcy5fX3RhcmdldCx0aXRsZTp0aGlzLl9fdGl0bGV9KSx0LmFwcGVuZChuKSxuKTpudWxsfWNhbkluc2VydFRleHRCZWZvcmUoKXtyZXR1cm4hMX1jYW5JbnNlcnRUZXh0QWZ0ZXIoKXtyZXR1cm4hMX1jYW5CZUVtcHR5KCl7cmV0dXJuITF9aXNJbmxpbmUoKXtyZXR1cm4hMH1leHRyYWN0V2l0aENoaWxkKHQsbil7aWYoIVVyLiRpc1JhbmdlU2VsZWN0aW9uKG4pKXJldHVybiExO3Q9bi5hbmNob3IuZ2V0Tm9kZSgpO2xldCByPW4uZm9jdXMuZ2V0Tm9kZSgpO3JldHVybiB0aGlzLmlzUGFyZW50T2YodCkmJnRoaXMuaXNQYXJlbnRPZihyKSYmMDxuLmdldFRleHRDb250ZW50KCkubGVuZ3RofX1mdW5jdGlvbiByQShlKXtsZXQgdD1udWxsO2lmKGdDLmlzSFRNTEFuY2hvckVsZW1lbnQoZSkpe2xldCBuPWUudGV4dENvbnRlbnQ7biE9PW51bGwmJm4hPT0iIiYmKHQ9Y3UoZS5nZXRBdHRyaWJ1dGUoImhyZWYiKXx8IiIse3JlbDplLmdldEF0dHJpYnV0ZSgicmVsIiksdGFyZ2V0OmUuZ2V0QXR0cmlidXRlKCJ0YXJnZXQiKSx0aXRsZTplLmdldEF0dHJpYnV0ZSgidGl0bGUiKX0pKX1yZXR1cm57bm9kZTp0fX1mdW5jdGlvbiBjdShlLHQpe3JldHVybiBVci4kYXBwbHlOb2RlUmVwbGFjZW1lbnQobmV3IE1zKGUsdCkpfWZ1bmN0aW9uIE5vKGUpe3JldHVybiBlIGluc3RhbmNlb2YgTXN9Y2xhc3MgRnUgZXh0ZW5kcyBNc3tzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJhdXRvbGluayJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgRnUodC5fX3VybCx7cmVsOnQuX19yZWwsdGFyZ2V0OnQuX190YXJnZXQsdGl0bGU6dC5fX3RpdGxlfSx0Ll9fa2V5KX1zdGF0aWMgaW1wb3J0SlNPTih0KXtsZXQgbj1PbSh0LnVybCx7cmVsOnQucmVsLHRhcmdldDp0LnRhcmdldCx0aXRsZTp0LnRpdGxlfSk7cmV0dXJuIG4uc2V0Rm9ybWF0KHQuZm9ybWF0KSxuLnNldEluZGVudCh0LmluZGVudCksbi5zZXREaXJlY3Rpb24odC5kaXJlY3Rpb24pLG59c3RhdGljIGltcG9ydERPTSgpe3JldHVybiBudWxsfWV4cG9ydEpTT04oKXtyZXR1cm57Li4uc3VwZXIuZXhwb3J0SlNPTigpLHR5cGU6ImF1dG9saW5rIix2ZXJzaW9uOjF9fWluc2VydE5ld0FmdGVyKHQsbj0hMCl7cmV0dXJuIHQ9dGhpcy5nZXRQYXJlbnRPclRocm93KCkuaW5zZXJ0TmV3QWZ0ZXIodCxuKSxVci4kaXNFbGVtZW50Tm9kZSh0KT8obj1PbSh0aGlzLl9fdXJsLHtyZWw6dGhpcy5fcmVsLHRhcmdldDp0aGlzLl9fdGFyZ2V0LHRpdGxlOnRoaXMuX190aXRsZX0pLHQuYXBwZW5kKG4pLG4pOm51bGx9fWZ1bmN0aW9uIE9tKGUsdCl7cmV0dXJuIFVyLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgRnUoZSx0KSl9bGV0IGlBPVVyLmNyZWF0ZUNvbW1hbmQoIlRPR0dMRV9MSU5LX0NPTU1BTkQiKTtmdW5jdGlvbiBvQShlLHQpe2Zvcig7ZSE9PW51bGwmJihlPWUuZ2V0UGFyZW50KCkpIT09bnVsbCYmIXQoZSk7KTtyZXR1cm4gZX1FaS4kY3JlYXRlQXV0b0xpbmtOb2RlPU9tO0VpLiRjcmVhdGVMaW5rTm9kZT1jdTtFaS4kaXNBdXRvTGlua05vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBGdX07RWkuJGlzTGlua05vZGU9Tm87RWkuQXV0b0xpbmtOb2RlPUZ1O0VpLkxpbmtOb2RlPU1zO0VpLlRPR0dMRV9MSU5LX0NPTU1BTkQ9aUE7RWkudG9nZ2xlTGluaz1mdW5jdGlvbihlLHQ9e30pe2xldHt0YXJnZXQ6bix0aXRsZTpyfT10LGk9dC5yZWw9PT12b2lkIDA/Im5vcmVmZXJyZXIiOnQucmVsO2lmKHQ9VXIuJGdldFNlbGVjdGlvbigpLFVyLiRpc1JhbmdlU2VsZWN0aW9uKHQpKWlmKHQ9dC5leHRyYWN0KCksZT09PW51bGwpdC5mb3JFYWNoKGw9PntpZihsPWwuZ2V0UGFyZW50KCksTm8obCkpe2xldCBzPWwuZ2V0Q2hpbGRyZW4oKTtmb3IobGV0IGE9MDthPHMubGVuZ3RoO2ErKylsLmluc2VydEJlZm9yZShzW2FdKTtsLnJlbW92ZSgpfX0pO2Vsc2V7aWYodC5sZW5ndGg9PT0xKXt2YXIgbz10WzBdO2lmKG89Tm8obyk/bzpvQShvLE5vKSxvIT09bnVsbCl7by5zZXRVUkwoZSksbiE9PXZvaWQgMCYmby5zZXRUYXJnZXQobiksaSE9PW51bGwmJm8uc2V0UmVsKGkpLHIhPT12b2lkIDAmJm8uc2V0VGl0bGUocik7cmV0dXJufX1sZXQgbD1udWxsLHM9bnVsbDt0LmZvckVhY2goYT0+e3ZhciB1PWEuZ2V0UGFyZW50KCk7aWYodSE9PXMmJnUhPT1udWxsJiYoIVVyLiRpc0VsZW1lbnROb2RlKGEpfHxhLmlzSW5saW5lKCkpKWlmKE5vKHUpKXM9dSx1LnNldFVSTChlKSxuIT09dm9pZCAwJiZ1LnNldFRhcmdldChuKSxpIT09bnVsbCYmcy5zZXRSZWwoaSksciE9PXZvaWQgMCYmcy5zZXRUaXRsZShyKTtlbHNlIGlmKHUuaXMobCl8fChsPXUscz1jdShlLHtyZWw6aSx0YXJnZXQ6bn0pLE5vKHUpP2EuZ2V0UHJldmlvdXNTaWJsaW5nKCk9PT1udWxsP3UuaW5zZXJ0QmVmb3JlKHMpOnUuaW5zZXJ0QWZ0ZXIocyk6YS5pbnNlcnRCZWZvcmUocykpLE5vKGEpKXtpZighYS5pcyhzKSl7aWYocyE9PW51bGwpe3U9YS5nZXRDaGlsZHJlbigpO2ZvcihsZXQgYz0wO2M8dS5sZW5ndGg7YysrKXMuYXBwZW5kKHVbY10pfWEucmVtb3ZlKCl9fWVsc2UgcyE9PW51bGwmJnMuYXBwZW5kKGEpfSl9fTtjb25zdCBsQT1FaTt2YXIgSm89bEEsX2w9Sm8sc0E9VHIsYUE9RnQsd2w9eGUsdUE9cDttQy5MaW5rUGx1Z2luPWZ1bmN0aW9uKHt2YWxpZGF0ZVVybDplfSl7bGV0W3RdPXNBLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtyZXR1cm4gdUEudXNlRWZmZWN0KCgpPT57aWYoIXQuaGFzTm9kZXMoW19sLkxpbmtOb2RlXSkpdGhyb3cgRXJyb3IoIkxpbmtQbHVnaW46IExpbmtOb2RlIG5vdCByZWdpc3RlcmVkIG9uIGVkaXRvciIpO3JldHVybiBhQS5tZXJnZVJlZ2lzdGVyKHQucmVnaXN0ZXJDb21tYW5kKF9sLlRPR0dMRV9MSU5LX0NPTU1BTkQsbj0+e2lmKG49PT1udWxsKXJldHVybiBfbC50b2dnbGVMaW5rKG4pLCEwO2lmKHR5cGVvZiBuPT0ic3RyaW5nIilyZXR1cm4gZT09PXZvaWQgMHx8ZShuKT8oX2wudG9nZ2xlTGluayhuKSwhMCk6ITE7bGV0e3VybDpyLHRhcmdldDppLHJlbDpvLHRpdGxlOmx9PW47cmV0dXJuIF9sLnRvZ2dsZUxpbmsocix7cmVsOm8sdGFyZ2V0OmksdGl0bGU6bH0pLCEwfSx3bC5DT01NQU5EX1BSSU9SSVRZX0xPVyksZSE9PXZvaWQgMD90LnJlZ2lzdGVyQ29tbWFuZCh3bC5QQVNURV9DT01NQU5ELG49PntsZXQgcj13bC4kZ2V0U2VsZWN0aW9uKCk7aWYoIXdsLiRpc1JhbmdlU2VsZWN0aW9uKHIpfHxyLmlzQ29sbGFwc2VkKCl8fCEobiBpbnN0YW5jZW9mIENsaXBib2FyZEV2ZW50KXx8bi5jbGlwYm9hcmREYXRhPT1udWxsKXJldHVybiExO2xldCBpPW4uY2xpcGJvYXJkRGF0YS5nZXREYXRhKCJ0ZXh0Iik7cmV0dXJuIGUoaSk/ci5nZXROb2RlcygpLnNvbWUobz0+d2wuJGlzRWxlbWVudE5vZGUobykpPyExOih0LmRpc3BhdGNoQ29tbWFuZChfbC5UT0dHTEVfTElOS19DT01NQU5ELGkpLG4ucHJldmVudERlZmF1bHQoKSwhMCk6ITF9LHdsLkNPTU1BTkRfUFJJT1JJVFlfTE9XKTooKT0+e30pfSxbdCxlXSksbnVsbH07Y29uc3QgY0E9bUM7dmFyIGRBPWNBO2Z1bmN0aW9uIGZBKHthcmlhQWN0aXZlRGVzY2VuZGFudDplLGFyaWFBdXRvQ29tcGxldGU6dCxhcmlhQ29udHJvbHM6bixhcmlhRGVzY3JpYmVkQnk6cixhcmlhRXhwYW5kZWQ6aSxhcmlhTGFiZWw6byxhcmlhTGFiZWxsZWRCeTpsLGFyaWFNdWx0aWxpbmU6cyxhcmlhT3duczphLGFyaWFSZXF1aXJlZDp1LGF1dG9DYXBpdGFsaXplOmMsY2xhc3NOYW1lOmQsaWQ6Zixyb2xlOmg9InRleHRib3giLHNwZWxsQ2hlY2s6bT0hMCxzdHlsZTpnLHRhYkluZGV4OncsImRhdGEtdGVzdGlkIjp2LC4uLnl9KXtjb25zdFtfXT1Uci51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCksW1MsRV09cC51c2VTdGF0ZSghMSksJD1wLnVzZUNhbGxiYWNrKEM9Pnt2YXIgTjtfLnNldFJvb3RFbGVtZW50KEMpO2NvbnN0IFQ9KE49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZhbC11aSIpKT09bnVsbD92b2lkIDA6Ti5zaGFkb3dSb290O2lmKFQmJiJnZXRTZWxlY3Rpb24iaW4gVCl7Xy5fd2luZG93PVQ7cmV0dXJufX0sW19dKTtyZXR1cm4gcC51c2VMYXlvdXRFZmZlY3QoKCk9PihFKF8uaXNFZGl0YWJsZSgpKSxfLnJlZ2lzdGVyRWRpdGFibGVMaXN0ZW5lcihDPT57RShDKX0pKSxbX10pLHguanN4KCJkaXYiLHsuLi55LCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiOlM/ZTp2b2lkIDAsImFyaWEtYXV0b2NvbXBsZXRlIjpTP3Q6Im5vbmUiLCJhcmlhLWNvbnRyb2xzIjpTP246dm9pZCAwLCJhcmlhLWRlc2NyaWJlZGJ5IjpyLCJhcmlhLWV4cGFuZGVkIjpTJiZoPT09ImNvbWJvYm94Ij8hIWk6dm9pZCAwLCJhcmlhLWxhYmVsIjpvLCJhcmlhLWxhYmVsbGVkYnkiOmwsImFyaWEtbXVsdGlsaW5lIjpzLCJhcmlhLW93bnMiOlM/YTp2b2lkIDAsImFyaWEtcmVhZG9ubHkiOlM/dm9pZCAwOiEwLCJhcmlhLXJlcXVpcmVkIjp1LGF1dG9DYXBpdGFsaXplOmMsY2xhc3NOYW1lOmQsY29udGVudEVkaXRhYmxlOlMsImRhdGEtdGVzdGlkIjp2LGlkOmYscmVmOiQscm9sZTpoLHNwZWxsQ2hlY2s6bSxzdHlsZTpnLHRhYkluZGV4Ond9KX1mdW5jdGlvbiBoQSh7Y2xhc3NOYW1lOmV9KXtyZXR1cm4geC5qc3goZkEse2NsYXNzTmFtZTplfSl9Y2xhc3MgRHMgZXh0ZW5kcyB4ZS5EZWNvcmF0b3JOb2Rle2NvbnN0cnVjdG9yKHQsbil7c3VwZXIobiksdGhpcy5fX3NyYz10LnNyYyx0aGlzLl9fYWx0VGV4dD10LmFsdFRleHQsdGhpcy5fX3dpZHRoPXQud2lkdGgsdGhpcy5fX2hlaWdodD10LmhlaWdodH1zdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJpbWFnZSJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgRHMoe3NyYzp0Ll9fc3JjLGFsdFRleHQ6dC5fX2FsdFRleHQsd2lkdGg6dC5fX3dpZHRoLGhlaWdodDp0Ll9faGVpZ2h0fSl9ZXhwb3J0SlNPTigpe3JldHVybnthbHRUZXh0OnRoaXMuX19hbHRUZXh0LGhlaWdodDp0aGlzLl9fd2lkdGgsc3JjOnRoaXMuX19zcmMsdHlwZToiaW1hZ2UiLHZlcnNpb246MSx3aWR0aDp0aGlzLl9fd2lkdGh9fXN0YXRpYyBpbXBvcnRKU09OKHQpe3JldHVybiB2Qyh0KX1jcmVhdGVET00oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iil9dXBkYXRlRE9NKCl7cmV0dXJuITF9ZGVjb3JhdGUoKXtyZXR1cm4geC5qc3gocEEse3NyYzp0aGlzLl9fc3JjLGFsdFRleHQ6dGhpcy5fX2FsdFRleHQsZW1wdHk6dGhpcy5fX2VtcHR5LGhlaWdodDp0aGlzLl9faGVpZ2h0LG5vZGVLZXk6dGhpcy5nZXRLZXkoKX0pfX1mdW5jdGlvbiBwQShlKXtyZXR1cm4geC5qc3goImltZyIse3NyYzplLnNyY30pfWZ1bmN0aW9uIHZDKGUpe3JldHVybiBuZXcgRHMoZSl9ZnVuY3Rpb24gbUEoKXtjb25zdFtlXT1Uci51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57ZS5mb2N1cygpfSxbZV0pLG51bGx9Y29uc3QgeUM9eGUuY3JlYXRlQ29tbWFuZCgiSU5TRVJUX0lNQUdFX0NPTU1BTkQiKTtmdW5jdGlvbiBnQSgpe2NvbnN0W2VdPVRyLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntpZighZS5oYXNOb2RlcyhbRHNdKSl0aHJvdyBuZXcgRXJyb3IoIkltYWdlc1BsdWdpbjogSW1hZ2VOb2RlIG5vdCByZWdpc3RlcmVkIG9uIGVkaXRvciIpO3JldHVybiBGdC5tZXJnZVJlZ2lzdGVyKGUucmVnaXN0ZXJDb21tYW5kKHlDLHQ9Pntjb25zdCBuPXZDKHQpO3JldHVybiB4ZS4kaW5zZXJ0Tm9kZXMoW25dKSx4ZS4kaXNSb290T3JTaGFkb3dSb290KG4uZ2V0UGFyZW50T3JUaHJvdygpKSYmRnQuJHdyYXBOb2RlSW5FbGVtZW50KG4seGUuJGNyZWF0ZVBhcmFncmFwaE5vZGUpLnNlbGVjdEVuZCgpLCEwfSx4ZS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUikpfSxbZV0pLG51bGx9Y29uc3QgdkE9KHtjbGFzc05hbWU6ZX0pPT54LmpzeHMoInN2ZyIse2hlaWdodDoxMix3aWR0aDoxMix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IiLHN0cm9rZVdpZHRoOiIyIixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIixjbGFzc05hbWU6ZSxjaGlsZHJlbjpbeC5qc3goInBhdGgiLHtkOiJNNiA0aDhhNCA0IDAgMCAxIDQgNCA0IDQgMCAwIDEtNCA0SDZ6In0pLHguanN4KCJwYXRoIix7ZDoiTTYgMTJoOWE0IDQgMCAwIDEgNCA0IDQgNCAwIDAgMS00IDRINnoifSldfSkseUE9dkEseEE9KHtjbGFzc05hbWU6ZX0pPT54LmpzeHMoInN2ZyIse3htbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNsYXNzTmFtZTplLHdpZHRoOjEyLGhlaWdodDoxMixjaGlsZHJlbjpbeC5qc3goImxpbmUiLHt4MToiMTkiLHkxOiI0Iix4MjoiMTAiLHkyOiI0In0pLHguanN4KCJsaW5lIix7eDE6IjE0Iix5MToiMjAiLHgyOiI1Iix5MjoiMjAifSkseC5qc3goImxpbmUiLHt4MToiMTUiLHkxOiI0Iix4MjoiOSIseTI6IjIwIn0pXX0pLF9BPXhBLHdBPSh7Y2xhc3NOYW1lOmV9KT0+eC5qc3goInN2ZyIse3htbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdmlld0JveDoiMCAwIDI0IDI0IixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjEiLGNsYXNzTmFtZTplLHdpZHRoOjEyLGhlaWdodDoxMixjaGlsZHJlbjp4LmpzeCgicGF0aCIse2ZpbGxSdWxlOiJldmVub2RkIixkOiJNMTMsMTUgTDEzLDIxIEMxMywyMS41NTIyODQ3IDEyLjU1MjI4NDcsMjIgMTIsMjIgQzExLjQ0NzcxNTMsMjIgMTEsMjEuNTUyMjg0NyAxMSwyMSBMMTEsMTUgTDEzLDE1IFogTTMsMTMgQzIuNDQ3NzE1MjUsMTMgMiwxMi41NTIyODQ3IDIsMTIgQzIsMTEuNDQ3NzE1MyAyLjQ0NzcxNTI1LDExIDMsMTEgTDIxLDExIEMyMS41NTIyODQ3LDExIDIyLDExLjQ0NzcxNTMgMjIsMTIgQzIyLDEyLjU1MjI4NDcgMjEuNTUyMjg0NywxMyAyMSwxMyBMMywxMyBaIE0xOSwyIEMxOS41NTIyODQ3LDIgMjAsMi40NDc3MTUyNSAyMCwzIEMyMCwzLjU1MjI4NDc1IDE5LjU1MjI4NDcsNCAxOSw0IEwxMyw0IEwxMyw5IEwxMSw5IEwxMSw0IEw1LDQgQzQuNDQ3NzE1MjUsNCA0LDMuNTUyMjg0NzUgNCwzIEM0LDIuNDQ3NzE1MjUgNC40NDc3MTUyNSwyIDUsMiBMMTksMiBaIn0pfSksU0E9d0EsRUE9KHt2YXJpYW50OmU9InByaW1hcnkiLG9uQ2xpY2s6dCxjaGlsZHJlbjpuLGljb246cixkaXNhYmxlZDppPSExfSk9PnguanN4KCJidXR0b24iLHtkaXNhYmxlZDppLGNsYXNzTmFtZTp3ZigiZm9udC1zYW5zIGZvbnQtWzEycHhdIHRyYWNraW5nLVswLjA0ZW1dIHB5LTEgcHgtMiByb3VuZGVkIHdoaXRlc3BhY2Utbm93cmFwIGdyb3VwIHJlbGF0aXZlIHRleHQtcHJpbWFyeSIseyJmb250LWJvbGQiOmU9PT0icHJpbWFyeSIsInRleHQtZmlsbCBkaXNhYmxlZDpiZy1maWxsIGRpc2FibGVkOnRleHQtYmFja2dyb3VuZCI6ZT09PSJwcmltYXJ5IiwiYm9yZGVyIGJvcmRlci1wcmltYXJ5IHRleHQtcHJpbWFyeSBob3Zlcjpib3JkZXItaGlnaGxpZ2h0IGhvdmVyOnRleHQtaGlnaGxpZ2h0IGRpc2FibGVkOmJnLWZpbGwgZGlzYWJsZWQ6dGV4dC1iYWNrZ3JvdW5kIjplIT09InByaW1hcnkifSksb25DbGljazp0LGNoaWxkcmVuOnguanN4cygic3BhbiIse2NsYXNzTmFtZToiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIiLGNoaWxkcmVuOltyJiZyLG5dfSl9KSxSbz1FQSxDQT0oe2NsYXNzTmFtZTplfSk9PnguanN4cygic3ZnIix7d2lkdGg6IjEwIixoZWlnaHQ6IjEwIix2aWV3Qm94OiIwIDAgMTIgMTIiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2xhc3NOYW1lOmUsY2hpbGRyZW46W3guanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNMy43MDczMyAxLjAwMDE1TDguNzc4NCA2LjA3MTIxTDguMDcxMjkgNi43NzgzMkwzLjAwMDIyIDEuNzA3MjVMMy43MDczMyAxLjAwMDE1WiIsZmlsbDoiY3VycmVudENvbG9yIn0pLHguanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNMy4wMDAxNSAxMC40NzA5TDguMDcxMjEgNS4zOTk4M0w4Ljc3ODMyIDYuMTA2OTNMMy43MDcyNSAxMS4xNzhMMy4wMDAxNSAxMC40NzA5WiIsZmlsbDoiY3VycmVudENvbG9yIn0pXX0pLGtBPUNBLHhDPXJlLmNyZWF0ZUNvbnRleHQoe2dldCBhcGkoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCBzZXNzaW9uKCl7dGhyb3cgRXJyb3IoIlZhbE92ZXJsYXlDb250ZXh0IG5vdCBmb3VuZC4gRW5zdXJlIGNvbXBvbmVudHMgYXJlIHdyYXBwZWQgYnkgVmFsT3ZlcmxheVByb3ZpZGVyISIpfSxnZXQgdGhlbWUoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCBzZXRUaGVtZSgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IGVkaXRNb2RlKCl7dGhyb3cgRXJyb3IoIlZhbE92ZXJsYXlDb250ZXh0IG5vdCBmb3VuZC4gRW5zdXJlIGNvbXBvbmVudHMgYXJlIHdyYXBwZWQgYnkgVmFsT3ZlcmxheVByb3ZpZGVyISIpfSxnZXQgc2V0RWRpdE1vZGUoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCBoaWdobGlnaHQoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCBzZXRIaWdobGlnaHQoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCBzZXRXaW5kb3dTaXplKCl7dGhyb3cgRXJyb3IoIlZhbE92ZXJsYXlDb250ZXh0IG5vdCBmb3VuZC4gRW5zdXJlIGNvbXBvbmVudHMgYXJlIHdyYXBwZWQgYnkgVmFsT3ZlcmxheVByb3ZpZGVyISIpfSxnZXQgd2luZG93U2l6ZSgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX19KTtmdW5jdGlvbiBBdigpe3JldHVybiByZS51c2VDb250ZXh0KHhDKX1jb25zdCAkQT0oe29wdGlvbnM6ZSxvbkNoYW5nZTp0LGxhYmVsOm4saWNvbjpyfSk9Pntjb25zdFtpLG9dPXAudXNlU3RhdGUoITEpLGw9cC51c2VSZWYobnVsbCksW3MsYV09cC51c2VTdGF0ZSgwKSx7d2luZG93U2l6ZTp1fT1BdigpLGM9KCk9PntvKCFpKX0sZD0oZixoKT0+e2EoaCksdChmKSxvKCExKX07cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3QgZj1oPT57aSYmbC5jdXJyZW50JiYhbC5jdXJyZW50LmNvbnRhaW5zKGgudGFyZ2V0KSYmbyghMSl9O3JldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZiksKCk9Pntkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsZil9fSxbXSkseC5qc3goImRpdiIse2NsYXNzTmFtZToidGV4dC1bMTJweF0iLHJlZjpsLGNoaWxkcmVuOnguanN4KFJvLHtvbkNsaWNrOmY9PntmLnByZXZlbnREZWZhdWx0KCksYygpfSxpY29uOnguanN4KGtBLHtjbGFzc05hbWU6YHJvdGF0ZS1bLTkwZGVnXSB0cmFuc2l0aW9uLXRyYW5zZm9ybSBkdXJhdGlvbi0xNTAgZWFzZS1pbi1vdXQgJHtpPyIiOiJyb3RhdGUtWzkwZGVnXSJ9YH0pLGNoaWxkcmVuOnguanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJyZWxhdGl2ZSIsY2hpbGRyZW46W3guanN4cygic3BhbiIse2NsYXNzTmFtZToiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTEiLGNoaWxkcmVuOltuLHImJnJdfSksaSYmeC5qc3goImRpdiIse2NsYXNzTmFtZToiYWJzb2x1dGUgLXRvcC1bNHB4XSBvdmVyZmxvdy1zY3JvbGwgc2hhZG93LWxnIC1sZWZ0LTIgdGV4dC1wcmltYXJ5IHctZml0IHotb3ZlcmxheSIsc3R5bGU6e21heEhlaWdodDp1PT1udWxsP3ZvaWQgMDp1LmlubmVySGVpZ2h0fSxjaGlsZHJlbjp4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtY29sICIsY2hpbGRyZW46ZT09bnVsbD92b2lkIDA6ZS5tYXAoKGYsaCk9PnguanN4KCJidXR0b24iLHtvbkNsaWNrOm09PnttLnByZXZlbnREZWZhdWx0KCksZChmLGgpfSxjbGFzc05hbWU6YHRleHQtbGVmdCBweC0yIHB5LTEgaG92ZXI6dGV4dC1oaWdobGlnaHQgICR7aD09PXMmJiJmb250LWJvbGQgdHJ1bmNhdGUifWAsY2hpbGRyZW46Zn0sZikpfSl9KV19KX0pfSl9LGJBPSRBLFRBPW5ldyBUZXh0RW5jb2RlcjtmdW5jdGlvbiBfQyhlKXtyZXR1cm4gbmV3IFByb21pc2UoKHQsbik9Pnt2YXIgbztjb25zdCByPShvPWUuY3VycmVudFRhcmdldC5maWxlcyk9PW51bGw/dm9pZCAwOm9bMF0saT1uZXcgRmlsZVJlYWRlcjtpLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCgpPT57Y29uc3QgbD1pLnJlc3VsdDtpZih0eXBlb2YgbD09InN0cmluZyIpe2NvbnN0IHM9bmV3IEltYWdlO3MuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKCk9Pntjb25zdCBhPWpuLmdldFNIQTI1Nkhhc2goVEEuZW5jb2RlKGwpKTtpZihzLm5hdHVyYWxXaWR0aCYmcy5uYXR1cmFsSGVpZ2h0KXtjb25zdCB1PVN2KGwpO3Qoe3NyYzpsLHdpZHRoOnMubmF0dXJhbFdpZHRoLGhlaWdodDpzLm5hdHVyYWxIZWlnaHQsZmlsZW5hbWU6cj09bnVsbD92b2lkIDA6ci5uYW1lLHNoYTI1NjphLG1pbWVUeXBlOnUsZmlsZUV4dDp1JiZFdih1KX0pfWVsc2UgdCh7c3JjOmwsZmlsZW5hbWU6cj09bnVsbD92b2lkIDA6ci5uYW1lLHNoYTI1NjphfSl9KSxzLnNyYz1sfWVsc2UgbihsP3ttZXNzYWdlOiJVbmV4cGVjdGVkIGltYWdlIHJlc3VsdCB0eXBlIixyZXN1bHQ6bH06e21lc3NhZ2U6IkVtcHR5IHJlc3VsdCJ9KX0pLHImJmkucmVhZEFzRGF0YVVSTChyKX0pfWZ1bmN0aW9uIHdDKGUpe2NvbnN0IHQ9ZS5hbmNob3Isbj1lLmZvY3VzLHI9ZS5hbmNob3IuZ2V0Tm9kZSgpLGk9ZS5mb2N1cy5nZXROb2RlKCk7cmV0dXJuIHI9PT1pP3I6ZS5pc0JhY2t3YXJkKCk/bG8uJGlzQXROb2RlRW5kKG4pP3I6aTpsby4kaXNBdE5vZGVFbmQodCk/cjppfWZ1bmN0aW9uIE5BKCl7Y29uc3RbZV09VHIudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+RnQubWVyZ2VSZWdpc3RlcihlLnJlZ2lzdGVyQ29tbWFuZCh4ZS5DTElDS19DT01NQU5ELHQ9Pntjb25zdCBuPXhlLiRnZXRTZWxlY3Rpb24oKTtpZih4ZS4kaXNSYW5nZVNlbGVjdGlvbihuKSl7Y29uc3Qgcj13QyhuKSxpPUZ0LiRmaW5kTWF0Y2hpbmdQYXJlbnQocixKby4kaXNMaW5rTm9kZSk7aWYoSm8uJGlzTGlua05vZGUoaSkmJih0Lm1ldGFLZXl8fHQuY3RybEtleSkpcmV0dXJuIHdpbmRvdy5vcGVuKGkuZ2V0VVJMKCksIl9ibGFuayIpLCEwfXJldHVybiExfSx4ZS5DT01NQU5EX1BSSU9SSVRZX0xPVykpLFtdKSxudWxsfXZhciBTQz17ZXhwb3J0czp7fX0sUkE9IlNFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEIixPQT1SQSxQQT1PQTtmdW5jdGlvbiBFQygpe31mdW5jdGlvbiBDQygpe31DQy5yZXNldFdhcm5pbmdDYWNoZT1FQzt2YXIgQUE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHIsaSxvLGwscyxhKXtpZihhIT09UEEpe3ZhciB1PW5ldyBFcnJvcigiQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gVXNlIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcygpIHRvIGNhbGwgdGhlbS4gUmVhZCBtb3JlIGF0IGh0dHA6Ly9mYi5tZS91c2UtY2hlY2stcHJvcC10eXBlcyIpO3Rocm93IHUubmFtZT0iSW52YXJpYW50IFZpb2xhdGlvbiIsdX19ZS5pc1JlcXVpcmVkPWU7ZnVuY3Rpb24gdCgpe3JldHVybiBlfXZhciBuPXthcnJheTplLGJpZ2ludDplLGJvb2w6ZSxmdW5jOmUsbnVtYmVyOmUsb2JqZWN0OmUsc3RyaW5nOmUsc3ltYm9sOmUsYW55OmUsYXJyYXlPZjp0LGVsZW1lbnQ6ZSxlbGVtZW50VHlwZTplLGluc3RhbmNlT2Y6dCxub2RlOmUsb2JqZWN0T2Y6dCxvbmVPZjp0LG9uZU9mVHlwZTp0LHNoYXBlOnQsZXhhY3Q6dCxjaGVja1Byb3BUeXBlczpDQyxyZXNldFdhcm5pbmdDYWNoZTpFQ307cmV0dXJuIG4uUHJvcFR5cGVzPW4sbn07U0MuZXhwb3J0cz1BQSgpO3ZhciBNQT1TQy5leHBvcnRzO2NvbnN0IHRyPVR1KE1BKTtmdW5jdGlvbiBQbSgpe3JldHVybiBQbT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJihlW3JdPW5bcl0pfXJldHVybiBlfSxQbS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gREEoZSx0KXtpZihlPT1udWxsKXJldHVybnt9O3ZhciBuPUxBKGUsdCkscixpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7Zm9yKGk9MDtpPG8ubGVuZ3RoO2krKylyPW9baV0sISh0LmluZGV4T2Yocik+PTApJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyKSYmKG5bcl09ZVtyXSl9cmV0dXJuIG59ZnVuY3Rpb24gTEEoZSx0KXtpZihlPT1udWxsKXJldHVybnt9O3ZhciBuPXt9LHI9T2JqZWN0LmtleXMoZSksaSxvO2ZvcihvPTA7bzxyLmxlbmd0aDtvKyspaT1yW29dLCEodC5pbmRleE9mKGkpPj0wKSYmKG5baV09ZVtpXSk7cmV0dXJuIG59dmFyIE12PXAuZm9yd2FyZFJlZihmdW5jdGlvbihlLHQpe3ZhciBuPWUuY29sb3Iscj1uPT09dm9pZCAwPyJjdXJyZW50Q29sb3IiOm4saT1lLnNpemUsbz1pPT09dm9pZCAwPzI0OmksbD1EQShlLFsiY29sb3IiLCJzaXplIl0pO3JldHVybiByZS5jcmVhdGVFbGVtZW50KCJzdmciLFBtKHtyZWY6dCx4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHdpZHRoOm8saGVpZ2h0Om8sdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6cixzdHJva2VXaWR0aDoiMiIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCJ9LGwpLHJlLmNyZWF0ZUVsZW1lbnQoInBvbHlsaW5lIix7cG9pbnRzOiIyMCA2IDkgMTcgNCAxMiJ9KSl9KTtNdi5wcm9wVHlwZXM9e2NvbG9yOnRyLnN0cmluZyxzaXplOnRyLm9uZU9mVHlwZShbdHIuc3RyaW5nLHRyLm51bWJlcl0pfTtNdi5kaXNwbGF5TmFtZT0iQ2hlY2siO2NvbnN0IElBPU12O2Z1bmN0aW9uIEFtKCl7cmV0dXJuIEFtPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9LEFtLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBqQShlLHQpe2lmKGU9PW51bGwpcmV0dXJue307dmFyIG49ekEoZSx0KSxyLGk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG89T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtmb3IoaT0wO2k8by5sZW5ndGg7aSsrKXI9b1tpXSwhKHQuaW5kZXhPZihyKT49MCkmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLHIpJiYobltyXT1lW3JdKX1yZXR1cm4gbn1mdW5jdGlvbiB6QShlLHQpe2lmKGU9PW51bGwpcmV0dXJue307dmFyIG49e30scj1PYmplY3Qua2V5cyhlKSxpLG87Zm9yKG89MDtvPHIubGVuZ3RoO28rKylpPXJbb10sISh0LmluZGV4T2YoaSk+PTApJiYobltpXT1lW2ldKTtyZXR1cm4gbn12YXIgRHY9cC5mb3J3YXJkUmVmKGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jb2xvcixyPW49PT12b2lkIDA/ImN1cnJlbnRDb2xvciI6bixpPWUuc2l6ZSxvPWk9PT12b2lkIDA/MjQ6aSxsPWpBKGUsWyJjb2xvciIsInNpemUiXSk7cmV0dXJuIHJlLmNyZWF0ZUVsZW1lbnQoInN2ZyIsQW0oe3JlZjp0LHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsd2lkdGg6byxoZWlnaHQ6byx2aWV3Qm94OiIwIDAgMjQgMjQiLGZpbGw6Im5vbmUiLHN0cm9rZTpyLHN0cm9rZVdpZHRoOiIyIixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIn0sbCkscmUuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik0xMCAxM2E1IDUgMCAwIDAgNy41NC41NGwzLTNhNSA1IDAgMCAwLTcuMDctNy4wN2wtMS43MiAxLjcxIn0pLHJlLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMTQgMTFhNSA1IDAgMCAwLTcuNTQtLjU0bC0zIDNhNSA1IDAgMCAwIDcuMDcgNy4wN2wxLjcxLTEuNzEifSkpfSk7RHYucHJvcFR5cGVzPXtjb2xvcjp0ci5zdHJpbmcsc2l6ZTp0ci5vbmVPZlR5cGUoW3RyLnN0cmluZyx0ci5udW1iZXJdKX07RHYuZGlzcGxheU5hbWU9IkxpbmsiO2NvbnN0IEZBPUR2O2Z1bmN0aW9uIE1tKCl7cmV0dXJuIE1tPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9LE1tLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBCQShlLHQpe2lmKGU9PW51bGwpcmV0dXJue307dmFyIG49VUEoZSx0KSxyLGk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG89T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtmb3IoaT0wO2k8by5sZW5ndGg7aSsrKXI9b1tpXSwhKHQuaW5kZXhPZihyKT49MCkmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLHIpJiYobltyXT1lW3JdKX1yZXR1cm4gbn1mdW5jdGlvbiBVQShlLHQpe2lmKGU9PW51bGwpcmV0dXJue307dmFyIG49e30scj1PYmplY3Qua2V5cyhlKSxpLG87Zm9yKG89MDtvPHIubGVuZ3RoO28rKylpPXJbb10sISh0LmluZGV4T2YoaSk+PTApJiYobltpXT1lW2ldKTtyZXR1cm4gbn12YXIgTHY9cC5mb3J3YXJkUmVmKGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jb2xvcixyPW49PT12b2lkIDA/ImN1cnJlbnRDb2xvciI6bixpPWUuc2l6ZSxvPWk9PT12b2lkIDA/MjQ6aSxsPUJBKGUsWyJjb2xvciIsInNpemUiXSk7cmV0dXJuIHJlLmNyZWF0ZUVsZW1lbnQoInN2ZyIsTW0oe3JlZjp0LHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsd2lkdGg6byxoZWlnaHQ6byx2aWV3Qm94OiIwIDAgMjQgMjQiLGZpbGw6Im5vbmUiLHN0cm9rZTpyLHN0cm9rZVdpZHRoOiIyIixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIn0sbCkscmUuY3JlYXRlRWxlbWVudCgibGluZSIse3gxOiIxOCIseTE6IjYiLHgyOiI2Iix5MjoiMTgifSkscmUuY3JlYXRlRWxlbWVudCgibGluZSIse3gxOiI2Iix5MToiNiIseDI6IjE4Iix5MjoiMTgifSkpfSk7THYucHJvcFR5cGVzPXtjb2xvcjp0ci5zdHJpbmcsc2l6ZTp0ci5vbmVPZlR5cGUoW3RyLnN0cmluZyx0ci5udW1iZXJdKX07THYuZGlzcGxheU5hbWU9IlgiO2NvbnN0IFdBPUx2LFZBPSh7Zm9udFNpemVzOmUsZm9udHNGYW1pbGllczp0LG9uRWRpdG9yOm4sY29sb3JzOnJ9KT0+e2NvbnN0W2ldPVRyLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtwLnVzZUVmZmVjdCgoKT0+e24mJm4oaSl9LFtpXSk7Y29uc3RbbyxsXT1wLnVzZVN0YXRlKGkpLFtzLGFdPXAudXNlU3RhdGUobnVsbCksW3UsY109cC51c2VTdGF0ZSghMSksW2QsZl09cC51c2VTdGF0ZSghMSksW2gsbV09cC51c2VTdGF0ZSghMSksW2csd109cC51c2VTdGF0ZSghMSk7cC51c2VTdGF0ZSgiMTVweCIpLHAudXNlU3RhdGUoIiMwMDAiKSxwLnVzZVN0YXRlKCJTYW5zIik7Y29uc3Rbdix5XT1wLnVzZVN0YXRlKCJwYXJhZ3JhcGgiKTtwLnVzZVN0YXRlKCExKSxwLnVzZVN0YXRlKCExKSxwLnVzZVN0YXRlKCJ1cmwiKSxwLnVzZVN0YXRlKG51bGwpO2NvbnN0W18sU109cC51c2VTdGF0ZShudWxsKSxFPVI9PntpLmRpc3BhdGNoQ29tbWFuZChKby5UT0dHTEVfTElOS19DT01NQU5ELFIpfSwkPXtwYXJhZ3JhcGg6Ik5vcm1hbCIsaDE6IkhlYWRpbmcgMSIsaDI6IkhlYWRpbmcgMiIsaDM6IkhlYWRpbmcgMyIsaDQ6IkhlYWRpbmcgNCIsaDU6IkhlYWRpbmcgNSIsaDY6IkhlYWRpbmcgNiIsbnVtYmVyOiJOdW1iZXJlZCBMaXN0IixidWxsZXQ6IkJ1bGxldGVkIExpc3QifSxDPXt9O2Zvcihjb25zdCBSIGluICQpQ1skW1JdXT1SO2NvbnN0IFQ9cC51c2VDYWxsYmFjaygoKT0+e2NvbnN0IFI9eGUuJGdldFNlbGVjdGlvbigpO2lmKHhlLiRpc1JhbmdlU2VsZWN0aW9uKFIpKXtjb25zdCBEPVIuYW5jaG9yLmdldE5vZGUoKTtsZXQgRj1ELmdldEtleSgpPT09InJvb3QiP0Q6RnQuJGZpbmRNYXRjaGluZ1BhcmVudChELEE9Pntjb25zdCBrPUEuZ2V0UGFyZW50KCk7cmV0dXJuIGshPT1udWxsJiZ4ZS4kaXNSb290T3JTaGFkb3dSb290KGspfSk7Rj09PW51bGwmJihGPUQuZ2V0VG9wTGV2ZWxFbGVtZW50T3JUaHJvdygpKTtjb25zdCBzZT13QyhSKSxWPUZ0LiRmaW5kTWF0Y2hpbmdQYXJlbnQoc2UsSm8uJGlzTGlua05vZGUpO2lmKFYhPT1udWxsKXtjb25zdCBBPVYuZ2V0VVJMKCk7UyhBKX1lbHNlIFMobnVsbCk7Y29uc3QgSz1GLmdldEtleSgpLE89by5nZXRFbGVtZW50QnlLZXkoSyk7aWYoYyhSLmhhc0Zvcm1hdCgiYm9sZCIpKSxmKFIuaGFzRm9ybWF0KCJpdGFsaWMiKSksbShSLmhhc0Zvcm1hdCgic3RyaWtldGhyb3VnaCIpKSx3KFIuaGFzRm9ybWF0KCJ1bmRlcmxpbmUiKSksTyE9PW51bGwpaWYoYShLKSxqaS4kaXNMaXN0Tm9kZShGKSl7Y29uc3QgQT1GdC4kZ2V0TmVhcmVzdE5vZGVPZlR5cGUoRCxqaS5MaXN0Tm9kZSksaz1BP0EuZ2V0TGlzdFR5cGUoKTpGLmdldExpc3RUeXBlKCk7eShrKX1lbHNle2NvbnN0IEE9QWEuJGlzSGVhZGluZ05vZGUoRik/Ri5nZXRUYWcoKTpGLmdldFR5cGUoKTtBIGluICQmJnkoQSl9fX0sW29dKTtwLnVzZUVmZmVjdCgoKT0+RnQubWVyZ2VSZWdpc3RlcihpLnJlZ2lzdGVyVXBkYXRlTGlzdGVuZXIoKHtlZGl0b3JTdGF0ZTpSfSk9PntSLnJlYWQoKCk9PntUKCl9KX0pKSxbVCxvLGldKSxwLnVzZUVmZmVjdCgoKT0+aS5yZWdpc3RlckNvbW1hbmQoeGUuU0VMRUNUSU9OX0NIQU5HRV9DT01NQU5ELChSLEQpPT4oVCgpLGwoRCksITEpLHhlLkNPTU1BTkRfUFJJT1JJVFlfQ1JJVElDQUwpLFtpLFRdKTtjb25zdCBOPVI9PntbImgxIiwiaDIiLCJoMyIsImg0IiwiaDUiLCJoNiJdLmluY2x1ZGVzKFIpP3YhPT1SJiZpLnVwZGF0ZSgoKT0+e2NvbnN0IEQ9eGUuJGdldFNlbGVjdGlvbigpO3hlLiRpc1JhbmdlU2VsZWN0aW9uKEQpJiZsby4kc2V0QmxvY2tzVHlwZShELCgpPT5BYS4kY3JlYXRlSGVhZGluZ05vZGUoUikpfSk6Uj09PSJwYXJhZ3JhcGgiJiZ2IT09InBhcmFncmFwaCI/aS51cGRhdGUoKCk9Pntjb25zdCBEPXhlLiRnZXRTZWxlY3Rpb24oKTsoeGUuJGlzUmFuZ2VTZWxlY3Rpb24oRCl8fHhlLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbihEKSkmJmxvLiRzZXRCbG9ja3NUeXBlKEQsKCk9PnhlLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCkpfSk6Uj09PSJudW1iZXIiJiZ2IT09Im51bWJlciI/aS5kaXNwYXRjaENvbW1hbmQoamkuSU5TRVJUX09SREVSRURfTElTVF9DT01NQU5ELHZvaWQgMCk6Uj09PSJidWxsZXQiJiZ2IT09ImJ1bGxldCI/aS5kaXNwYXRjaENvbW1hbmQoamkuSU5TRVJUX1VOT1JERVJFRF9MSVNUX0NPTU1BTkQsdm9pZCAwKTppLmRpc3BhdGNoQ29tbWFuZChqaS5SRU1PVkVfTElTVF9DT01NQU5ELHZvaWQgMCl9O3JldHVybiBwLnVzZUNhbGxiYWNrKCgpPT57aS51cGRhdGUoKCk9Pntjb25zdCBSPXhlLiRnZXRTZWxlY3Rpb24oKTtpZih4ZS4kaXNSYW5nZVNlbGVjdGlvbihSKSl7Y29uc3QgRD1SLmFuY2hvcixGPVIuZm9jdXMsc2U9Ui5nZXROb2RlcygpO2lmKEQua2V5PT09Ri5rZXkmJkQub2Zmc2V0PT09Ri5vZmZzZXQpcmV0dXJuO3NlLmZvckVhY2goKFYsSyk9Pnt4ZS4kaXNUZXh0Tm9kZShWKT8oSz09PTAmJkQub2Zmc2V0IT09MCYmKFY9Vi5zcGxpdFRleHQoRC5vZmZzZXQpWzFdfHxWKSxLPT09c2UubGVuZ3RoLTEmJihWPVYuc3BsaXRUZXh0KEYub2Zmc2V0KVswXXx8ViksVi5fX3N0eWxlIT09IiImJlYuc2V0U3R5bGUoIiIpLFYuX19mb3JtYXQhPT0wJiYoVi5zZXRGb3JtYXQoMCksRnQuJGdldE5lYXJlc3RCbG9ja0VsZW1lbnRBbmNlc3Rvck9yVGhyb3coVikuc2V0Rm9ybWF0KCIiKSkpOkFhLiRpc0hlYWRpbmdOb2RlKFYpJiZWLnJlcGxhY2UoeGUuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKSwhMCl9KX19KX0sW29dKSx4LmpzeHMoImRpdiIse2NsYXNzTmFtZToic3RpY2t5IHRvcC0wIGZsZXggZmxleC1jb2wgcHgtNCBweS0yIGJvcmRlci1iIGJnLWJhY2tncm91bmQgYm9yZGVyLWhpZ2hsaWdodCIsY2hpbGRyZW46W3guanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtcm93IGdhcC0xIixjaGlsZHJlbjpbeC5qc3goYkEse29wdGlvbnM6T2JqZWN0LnZhbHVlcygkKSxsYWJlbDokW3ZdPz92KyIgKG5vdCBzdXBwb3J0ZWQpIixvbkNoYW5nZTpSPT57TihDW1JdKX19KSx4LmpzeChSbyx7dmFyaWFudDoicHJpbWFyeSIsb25DbGljazpSPT57Ui5wcmV2ZW50RGVmYXVsdCgpLGkuZGlzcGF0Y2hDb21tYW5kKHhlLkZPUk1BVF9URVhUX0NPTU1BTkQsImJvbGQiKX0sYWN0aXZlOnUsaWNvbjp4LmpzeCh5QSx7Y2xhc3NOYW1lOmAke3UmJiJzdHJva2UtWzNweF0ifWB9KX0pLHguanN4KFJvLHthY3RpdmU6aCxvbkNsaWNrOlI9PntSLnByZXZlbnREZWZhdWx0KCksaS5kaXNwYXRjaENvbW1hbmQoeGUuRk9STUFUX1RFWFRfQ09NTUFORCwic3RyaWtldGhyb3VnaCIpfSxpY29uOnguanN4KFNBLHtjbGFzc05hbWU6YCR7aCYmInN0cm9rZS1bMnB4XSJ9YH0pfSkseC5qc3goUm8se2FjdGl2ZTpkLG9uQ2xpY2s6Uj0+e1IucHJldmVudERlZmF1bHQoKSxpLmRpc3BhdGNoQ29tbWFuZCh4ZS5GT1JNQVRfVEVYVF9DT01NQU5ELCJpdGFsaWMiKX0saWNvbjp4LmpzeChfQSx7Y2xhc3NOYW1lOmAke2QmJiJzdHJva2UtWzNweF0ifWB9KX0pLHguanN4KFJvLHthY3RpdmU6XyE9PW51bGwsb25DbGljazpSPT57Ui5wcmV2ZW50RGVmYXVsdCgpLFMoIiIpLEUoIiIpfSxpY29uOnguanN4KEZBLHt3aWR0aDoxMixoZWlnaHQ6MTIsY2xhc3NOYW1lOmAke18hPT1udWxsJiYic3Ryb2tlLVszcHhdIn1gfSl9KSx4LmpzeHMoImxhYmVsIix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBjdXJzb3ItcG9pbnRlciIsY2hpbGRyZW46W3guanN4KGdTLHt9KSx4LmpzeCgiaW5wdXQiLHt0eXBlOiJmaWxlIixoaWRkZW46ITAsb25DaGFuZ2U6Uj0+e1IucHJldmVudERlZmF1bHQoKSxfQyhSKS50aGVuKEQ9PntpLmRpc3BhdGNoQ29tbWFuZCh5Qyx7Li4uRH0pfSkuY2F0Y2goRD0+e2NvbnNvbGUuZXJyb3IoIkVycm9yIHJlYWRpbmcgaW1hZ2UiLEQpfSl9fSldfSldfSksXyE9PW51bGwmJnguanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtcm93IHAtMiIsY2hpbGRyZW46W3guanN4KCJpbnB1dCIse3R5cGU6InRleHQiLHBsYWNlaG9sZGVyOiJFbnRlciBVUkwiLGNsYXNzTmFtZToidy0xLzMgcHgtMiBiZy1iYWNrZ3JvdW5kIHRleHQtcHJpbWFyeSIsdmFsdWU6XyxvbkNoYW5nZTpSPT57Ui5wcmV2ZW50RGVmYXVsdCgpLFMoUi50YXJnZXQudmFsdWUpfX0pLHguanN4KFJvLHt2YXJpYW50OiJwcmltYXJ5IixvbkNsaWNrOlI9PntSLnByZXZlbnREZWZhdWx0KCksRShffHxudWxsKX0saWNvbjp4LmpzeChJQSx7c2l6ZToxNH0pfSkseC5qc3goUm8se3ZhcmlhbnQ6InByaW1hcnkiLG9uQ2xpY2s6Uj0+e1IucHJldmVudERlZmF1bHQoKSxFKG51bGwpfSxpY29uOnguanN4KFdBLHtzaXplOjE0fSl9KV19KV19KX0sSEE9VkE7ZnVuY3Rpb24gS0EoZSl7Y29uc29sZS5lcnJvcihlKX1jb25zdCBaQT0yOCxHQT0oe3JpY2h0ZXh0OmUsb25FZGl0b3I6dH0pPT57Y29uc3R7d2luZG93U2l6ZTpufT1BdigpLGk9e25hbWVzcGFjZToidmFsIixlZGl0b3JTdGF0ZTpvPT57by5zZXRFZGl0b3JTdGF0ZShvLnBhcnNlRWRpdG9yU3RhdGUoe3Jvb3Q6Q08oUEUoZSkpfSkpfSxub2RlczpbQWEuSGVhZGluZ05vZGUsRHMsamkuTGlzdE5vZGUsamkuTGlzdEl0ZW1Ob2RlLEpvLkxpbmtOb2RlXSx0aGVtZTp7dGV4dDp7Ym9sZDoiZm9udC1zZW1pYm9sZCIsdW5kZXJsaW5lOiJ1bmRlcmxpbmUiLGl0YWxpYzoiaXRhbGljIixzdHJpa2V0aHJvdWdoOiJsaW5lLXRocm91Z2giLHVuZGVybGluZVN0cmlrZXRocm91Z2g6InVuZGVybGluZSBsaW5lLXRocm91Z2gifSxsaXN0OntsaXN0aXRlbToibWwtWzIwcHhdIixvbDoibGlzdC1kZWNpbWFsIix1bDoibGlzdC1kaXNjIn0saGVhZGluZzp7aDE6InRleHQtNHhsIGZvbnQtYm9sZCIsaDI6InRleHQtM3hsIGZvbnQtYm9sZCIsaDM6InRleHQtMnhsIGZvbnQtYm9sZCIsaDQ6InRleHQteGwgZm9udC1ib2xkIixoNToidGV4dC1sZyBmb250LWJvbGQiLGg2OiJ0ZXh0LW1kIGZvbnQtYm9sZCJ9LGxpbms6InRleHQtaGlnaGxpZ2h0IHVuZGVybGluZSJ9LG9uRXJyb3I6S0F9O3JldHVybiB4LmpzeHMoWE8uTGV4aWNhbENvbXBvc2VyLHtpbml0aWFsQ29uZmlnOmksY2hpbGRyZW46W3guanN4KG1BLHt9KSx4LmpzeChIQSx7b25FZGl0b3I6dH0pLHguanN4KFhQLlJpY2hUZXh0UGx1Z2luLHtjb250ZW50RWRpdGFibGU6eC5qc3goImRpdiIse2NsYXNzTmFtZToiZm9udC1zYW5zIGJvcmRlci1iIHRleHQtcHJpbWFyeSBib3JkZXItaGlnaGxpZ2h0IixzdHlsZTp7bWluSGVpZ2h0Om4hPW51bGwmJm4uaW5uZXJIZWlnaHQ/KG49PW51bGw/dm9pZCAwOm4uaW5uZXJIZWlnaHQpLVpBOnZvaWQgMH0sY2hpbGRyZW46eC5qc3goaEEse2NsYXNzTmFtZToicC00IG91dGxpbmUtbm9uZSBiZy1maWxsIn0pfSkscGxhY2Vob2xkZXI6eC5qc3goImRpdiIse2NsYXNzTmFtZToiIixjaGlsZHJlbjoiRW50ZXIgc29tZSB0ZXh0Li4uIn0pLEVycm9yQm91bmRhcnk6clB9KSx4LmpzeChkQS5MaW5rUGx1Z2luLHt9KSx4LmpzeChOQSx7fSkseC5qc3godEEuTGlzdFBsdWdpbix7fSkseC5qc3goZ0Ese30pLHguanN4KGZQLkhpc3RvcnlQbHVnaW4se30pXX0pfTt2YXIgWUE9e3htbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsd2lkdGg6MjQsaGVpZ2h0OjI0LHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IiLHN0cm9rZVdpZHRoOjIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCJ9O2NvbnN0IFhBPWU9PmUucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywiJDEtJDIiKS50b0xvd2VyQ2FzZSgpLEtuPShlLHQpPT57Y29uc3Qgbj1wLmZvcndhcmRSZWYoKHtjb2xvcjpyPSJjdXJyZW50Q29sb3IiLHNpemU6aT0yNCxzdHJva2VXaWR0aDpvPTIsYWJzb2x1dGVTdHJva2VXaWR0aDpsLGNoaWxkcmVuOnMsLi4uYX0sdSk9PnAuY3JlYXRlRWxlbWVudCgic3ZnIix7cmVmOnUsLi4uWUEsd2lkdGg6aSxoZWlnaHQ6aSxzdHJva2U6cixzdHJva2VXaWR0aDpsP051bWJlcihvKSoyNC9OdW1iZXIoaSk6byxjbGFzc05hbWU6YGx1Y2lkZSBsdWNpZGUtJHtYQShlKX1gLC4uLmF9LFsuLi50Lm1hcCgoW2MsZF0pPT5wLmNyZWF0ZUVsZW1lbnQoYyxkKSksLi4uKEFycmF5LmlzQXJyYXkocyk/czpbc10pfHxbXV0pKTtyZXR1cm4gbi5kaXNwbGF5TmFtZT1gJHtlfWAsbn0sUUE9S24oIkNoZWNrIixbWyJwb2x5bGluZSIse3BvaW50czoiMjAgNiA5IDE3IDQgMTIiLGtleToiMTBqamZqIn1dXSksa0M9S24oIkNoZXZyb25Eb3duIixbWyJwYXRoIix7ZDoibTYgOSA2IDYgNi02IixrZXk6InFydW5zbCJ9XV0pLEpBPUtuKCJDaGV2cm9uTGVmdCIsW1sicGF0aCIse2Q6Im0xNSAxOC02LTYgNi02IixrZXk6IjF3bmZnMyJ9XV0pLEV4PUtuKCJMb2dJbiIsW1sicGF0aCIse2Q6Ik0xNSAzaDRhMiAyIDAgMCAxIDIgMnYxNGEyIDIgMCAwIDEtMiAyaC00IixrZXk6InU1M3M2ciJ9XSxbInBvbHlsaW5lIix7cG9pbnRzOiIxMCAxNyAxNSAxMiAxMCA3IixrZXk6IjFhaWwwaCJ9XSxbImxpbmUiLHt4MToiMTUiLHgyOiIzIix5MToiMTIiLHkyOiIxMiIsa2V5OiJ2NmdyeDgifV1dKSxxQT1LbigiTWF4aW1pemUiLFtbInBhdGgiLHtkOiJNOCAzSDVhMiAyIDAgMCAwLTIgMnYzIixrZXk6IjFkY21pdCJ9XSxbInBhdGgiLHtkOiJNMjEgOFY1YTIgMiAwIDAgMC0yLTJoLTMiLGtleToiMWU0Z3QzIn1dLFsicGF0aCIse2Q6Ik0zIDE2djNhMiAyIDAgMCAwIDIgMmgzIixrZXk6IndzbDVzYyJ9XSxbInBhdGgiLHtkOiJNMTYgMjFoM2EyIDIgMCAwIDAgMi0ydi0zIixrZXk6IjE4dHJlayJ9XV0pLGU1PUtuKCJNaW5pbWl6ZSIsW1sicGF0aCIse2Q6Ik04IDN2M2EyIDIgMCAwIDEtMiAySDMiLGtleToiaG9oYnRyIn1dLFsicGF0aCIse2Q6Ik0yMSA4aC0zYTIgMiAwIDAgMS0yLTJWMyIsa2V5OiI1ancxZjMifV0sWyJwYXRoIix7ZDoiTTMgMTZoM2EyIDIgMCAwIDEgMiAydjMiLGtleToiMTk4dHZyIn1dLFsicGF0aCIse2Q6Ik0xNiAyMXYtM2EyIDIgMCAwIDEgMi0yaDMiLGtleToicGg4bXhwIn1dXSksdDU9S24oIk1vb24iLFtbInBhdGgiLHtkOiJNMTIgM2E2IDYgMCAwIDAgOSA5IDkgOSAwIDEgMS05LTlaIixrZXk6ImE3dG4xOCJ9XV0pLG41PUtuKCJQYXVzZSIsW1sicmVjdCIse3dpZHRoOiI0IixoZWlnaHQ6IjE2Iix4OiI2Iix5OiI0IixrZXk6ImlmZmhlNCJ9XSxbInJlY3QiLHt3aWR0aDoiNCIsaGVpZ2h0OiIxNiIseDoiMTQiLHk6IjQiLGtleToic2ppbjdqIn1dXSkscjU9S24oIlBsYXkiLFtbInBvbHlnb24iLHtwb2ludHM6IjUgMyAxOSAxMiA1IDIxIDUgMyIsa2V5OiIxOTE2MzcifV1dKSxpNT1LbigiUG93ZXIiLFtbInBhdGgiLHtkOiJNMTIgMnYxMCIsa2V5OiJtbmZibCJ9XSxbInBhdGgiLHtkOiJNMTguNCA2LjZhOSA5IDAgMSAxLTEyLjc3LjA0IixrZXk6Im9ib2Z1OSJ9XV0pLG81PUtuKCJTZW5kIixbWyJwYXRoIix7ZDoibTIyIDItNyAyMC00LTktOS00WiIsa2V5OiIxcTN2Z2cifV0sWyJwYXRoIix7ZDoiTTIyIDIgMTEgMTMiLGtleToibnpicWVmIn1dXSksbDU9S24oIlN1biIsW1siY2lyY2xlIix7Y3g6IjEyIixjeToiMTIiLHI6IjQiLGtleToiNGV4aXAyIn1dLFsicGF0aCIse2Q6Ik0xMiAydjIiLGtleToidHVzMDNtIn1dLFsicGF0aCIse2Q6Ik0xMiAyMHYyIixrZXk6IjFsaDFrZyJ9XSxbInBhdGgiLHtkOiJtNC45MyA0LjkzIDEuNDEgMS40MSIsa2V5OiIxNDl0NmoifV0sWyJwYXRoIix7ZDoibTE3LjY2IDE3LjY2IDEuNDEgMS40MSIsa2V5OiJwdGJndXYifV0sWyJwYXRoIix7ZDoiTTIgMTJoMiIsa2V5OiIxdDhmOG4ifV0sWyJwYXRoIix7ZDoiTTIwIDEyaDIiLGtleToiMXE4bWp3In1dLFsicGF0aCIse2Q6Im02LjM0IDE3LjY2LTEuNDEgMS40MSIsa2V5OiIxbTh6ejUifV0sWyJwYXRoIix7ZDoibTE5LjA3IDQuOTMtMS40MSAxLjQxIixrZXk6IjFzaGxjcyJ9XV0pLHM1PUtuKCJYIixbWyJwYXRoIix7ZDoiTTE4IDYgNiAxOCIsa2V5OiIxYmw1ZjgifV0sWyJwYXRoIix7ZDoibTYgNiAxMiAxMiIsa2V5OiJkOGJrNnYifV1dKSxJdj0icC0xIGJvcmRlciByb3VuZGVkLWZ1bGwgc2hhZG93IGJvcmRlci1hY2NlbnQiLEN4PSJ2YWxidWlsZDp1cmxCZWZvcmVOYXZpZ2F0aW9uIjtmdW5jdGlvbiBhNSh7YXBpOmUscGF0Y2hlczp0LG9uQ29tbWl0Om59KXtjb25zdHt0aGVtZTpyLHNldFRoZW1lOmksZWRpdE1vZGU6byxzZXRFZGl0TW9kZTpsLHNlc3Npb246c309QXYoKTtpZihzLnN0YXR1cz09PSJzdWNjZXNzIiYmcy5kYXRhLm1vZGU9PT0idW5hdXRob3JpemVkIilyZXR1cm4geC5qc3hzKGt4LHtocmVmOmUuZ2V0TG9naW5Vcmwod2luZG93LmxvY2F0aW9uLmhyZWYpLGNoaWxkcmVuOlt4LmpzeCgic3BhbiIse2NoaWxkcmVuOiJMb2dpbiJ9KSx4LmpzeChFeCx7c2l6ZToxOH0pXX0pO2lmKHMuc3RhdHVzPT09InN1Y2Nlc3MiJiYhcy5kYXRhLmVuYWJsZWQpcmV0dXJuIHguanN4cyhreCx7aHJlZjplLmdldEVuYWJsZVVybCh3aW5kb3cubG9jYXRpb24uaHJlZiksY2hpbGRyZW46W3guanN4KCJzcGFuIix7Y2hpbGRyZW46IkVuYWJsZSJ9KSx4LmpzeChFeCx7c2l6ZToxOH0pXX0pO2NvbnN0W2EsdV09cC51c2VTdGF0ZSgpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2xldCBjPTA7Zm9yKGNvbnN0IGQgaW4gdCljKz10W2RdLmxlbmd0aDt1KGMpfSxbdF0pLHguanN4cyh1NSx7Y2hpbGRyZW46W3guanN4KHdjLHthY3RpdmU6bz09PSJob3ZlciIsb25DbGljazooKT0+e2woYz0+Yz09PSJob3ZlciI/Im9mZiI6ImhvdmVyIil9LGNoaWxkcmVuOnguanN4KCJkaXYiLHtjbGFzc05hbWU6ImgtWzI0cHhdIHctWzI0cHhdIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIixjaGlsZHJlbjpvPT09ImhvdmVyIj94LmpzeChuNSx7c2l6ZToxOH0pOnguanN4KHI1LHtzaXplOjE4fSl9KX0pLHguanN4KHdjLHtvbkNsaWNrOigpPT57aShyPT09ImRhcmsiPyJsaWdodCI6ImRhcmsiKX0sY2hpbGRyZW46eC5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImgtWzI0cHhdIHctWzI0cHhdIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIixjaGlsZHJlbjpbcj09PSJkYXJrIiYmeC5qc3gobDUse3NpemU6MTV9KSxyPT09ImxpZ2h0IiYmeC5qc3godDUse3NpemU6MTV9KV19KX0pLHguanN4KHdjLHthY3RpdmU6bz09PSJmdWxsIixvbkNsaWNrOigpPT57aWYobyE9PSJmdWxsIilsb2NhbFN0b3JhZ2Uuc2V0SXRlbShDeCx3aW5kb3cubG9jYXRpb24uaHJlZiksd2luZG93LmxvY2F0aW9uLmhyZWY9ZS5nZXRFZGl0VXJsKCk7ZWxzZSBpZihvPT09ImZ1bGwiKXtjb25zdCBjPWxvY2FsU3RvcmFnZS5nZXRJdGVtKEN4KTt3aW5kb3cubG9jYXRpb24uaHJlZj1jfHwiLyJ9fSxjaGlsZHJlbjp4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJoLVsyNHB4XSB3LVsyNHB4XSBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciIsY2hpbGRyZW46bz09PSJmdWxsIj94LmpzeChlNSx7c2l6ZToxNX0pOnguanN4KHFBLHtzaXplOjE1fSl9KX0pLGEhPT12b2lkIDAmJnMuc3RhdHVzPT09InN1Y2Nlc3MiJiZzLmRhdGEubW9kZT09PSJwcm94eSImJnguanN4KHdjLHtvbkNsaWNrOigpPT57YT4wP2UucG9zdENvbW1pdCh7cGF0Y2hlczp0fSkudGhlbihjPT57am8uaXNFcnIoYyk/KGNvbnNvbGUuZXJyb3IoYy5lcnJvciksYWxlcnQoIkNvdWxkIG5vdCBjb21taXQgcGF0Y2hlczogIitjLmVycm9yLm1lc3NhZ2UpKTooY29uc29sZS5sb2coIkNvbW1pdHRlZCBwYXRjaGVzOiAiLGMudmFsdWUpLG4oKSl9KTphbGVydCgiTm8gcGF0Y2hlcyB0byBjb21taXQiKX0sY2hpbGRyZW46eC5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InJlbGF0aXZlIGgtWzI0cHhdIHctWzI0cHhdIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIixjaGlsZHJlbjpbeC5qc3goImRpdiIse2NsYXNzTmFtZToiYWJzb2x1dGUgLXJpZ2h0LVsxMHB4XSAtdG9wLVsxMHB4XSBib3JkZXIgYm9yZGVyLWJvcmRlciByb3VuZGVkLWZ1bGwgcHgtMSBmb250LXNhbnMgdGV4dC14cyBiZy1jYXJkIHRleHQtYWNjZW50IixjaGlsZHJlbjphfSkseC5qc3gobzUse3NpemU6MTh9KV19KX0pLHguanN4KCJhIix7Y2xhc3NOYW1lOkl2LGhyZWY6ZS5nZXREaXNhYmxlVXJsKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxjaGlsZHJlbjp4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJoLVsyNHB4XSB3LVsyNHB4XSBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciIsY2hpbGRyZW46eC5qc3goaTUse3NpemU6MTh9KX0pfSldfSl9ZnVuY3Rpb24ga3goe2hyZWY6ZSxjaGlsZHJlbjp0fSl7cmV0dXJuIHguanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctZnVsbCBoLWZ1bGwgZm9udC1zYW5zIGJvcmRlci0yIHJvdW5kZWQtZnVsbCBnYXAteC0zIHRleHQtcHJpbWFyeSBiZy1iYWNrZ3JvdW5kIGJvcmRlci1maWxsIixjaGlsZHJlbjp4LmpzeCgiYSIse2NsYXNzTmFtZTpJdixocmVmOmUsY2hpbGRyZW46eC5qc3goImRpdiIse2NsYXNzTmFtZToiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHgtMiBnYXAteC0yIixjaGlsZHJlbjp0fSl9KX0pfWZ1bmN0aW9uIHU1KHtjaGlsZHJlbjplfSl7cmV0dXJuIHguanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctZnVsbCBoLWZ1bGwgcHgtMiBweS0yIGZvbnQtc2FucyBib3JkZXItMiByb3VuZGVkLWZ1bGwgZ2FwLXgtMyB0ZXh0LXByaW1hcnkgYmctYmFja2dyb3VuZCBib3JkZXItZmlsbCIsY2hpbGRyZW46ZX0pfWZ1bmN0aW9uIHdjKHthY3RpdmU6ZSxvbkNsaWNrOnQsY2hpbGRyZW46bn0pe3JldHVybiB4LmpzeCgiYnV0dG9uIix7Y2xhc3NOYW1lOndmKEl2LHsiYmctYWNjZW50IGRyb3Atc2hhZG93LVswcHhfMHB4XzEycHhfcmdiYSg1NiwyMDUsMTUyLDAuNjApXSI6ZX0pLG9uQ2xpY2s6dCxjaGlsZHJlbjpufSl9ZnVuY3Rpb24gYzUoZSx0KXtjb25zdFtuLHJdPXAudXNlU3RhdGUoe30pLFtpLG9dPXAudXNlU3RhdGUoMCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57ZS5zdGF0dXM9PT0ic3VjY2VzcyImJmUuZGF0YS5tb2RlPT09InByb3h5IiYmdC5nZXRQYXRjaGVzKHt9KS50aGVuKGw9PntpZihqby5pc09rKGwpKXtjb25zdCBzPXt9O2Zvcihjb25zdCBhIGluIGwudmFsdWUpc1thXT1sLnZhbHVlW2FdLm1hcCh1PT51LnBhdGNoX2lkKTtyKHMpfWVsc2UgY29uc29sZS5lcnJvcigiQ291bGQgbm90IGxvYWQgcGF0Y2hlcyIsbC5lcnJvcil9KX0sW2UsaV0pLHtwYXRjaGVzOm4sc2V0UGF0Y2hSZXNldElkOm99fWZ1bmN0aW9uIGQ1KGU9ImRhcmsiKXtjb25zdFt0LG5dPXAudXNlU3RhdGUoZSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57bG9jYWxTdG9yYWdlLmdldEl0ZW0oInZhbC10aGVtZSIpPT09ImxpZ2h0Ij9uKCJsaWdodCIpOmxvY2FsU3RvcmFnZS5nZXRJdGVtKCJ2YWwtdGhlbWUiKT09PSJkYXJrInx8d2luZG93Lm1hdGNoTWVkaWEmJndpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIikubWF0Y2hlcz9uKCJkYXJrIik6d2luZG93Lm1hdGNoTWVkaWEmJndpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KSIpLm1hdGNoZXMmJm4oImxpZ2h0Iik7Y29uc3Qgcj1pPT57bG9jYWxTdG9yYWdlLmdldEl0ZW0oInZhbC10aGVtZSIpfHxuKGkubWF0Y2hlcz8iZGFyayI6ImxpZ2h0Iil9O3JldHVybiB3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSIpLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsciksKCk9Pnt3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSIpLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIscil9fSxbXSksW3Qscj0+e2xvY2FsU3RvcmFnZS5zZXRJdGVtKCJ2YWwtdGhlbWUiLHIpLG4ocil9XX12YXIgTGU7KGZ1bmN0aW9uKGUpe2UuYXNzZXJ0RXF1YWw9aT0+aTtmdW5jdGlvbiB0KGkpe31lLmFzc2VydElzPXQ7ZnVuY3Rpb24gbihpKXt0aHJvdyBuZXcgRXJyb3J9ZS5hc3NlcnROZXZlcj1uLGUuYXJyYXlUb0VudW09aT0+e2NvbnN0IG89e307Zm9yKGNvbnN0IGwgb2YgaSlvW2xdPWw7cmV0dXJuIG99LGUuZ2V0VmFsaWRFbnVtVmFsdWVzPWk9Pntjb25zdCBvPWUub2JqZWN0S2V5cyhpKS5maWx0ZXIocz0+dHlwZW9mIGlbaVtzXV0hPSJudW1iZXIiKSxsPXt9O2Zvcihjb25zdCBzIG9mIG8pbFtzXT1pW3NdO3JldHVybiBlLm9iamVjdFZhbHVlcyhsKX0sZS5vYmplY3RWYWx1ZXM9aT0+ZS5vYmplY3RLZXlzKGkpLm1hcChmdW5jdGlvbihvKXtyZXR1cm4gaVtvXX0pLGUub2JqZWN0S2V5cz10eXBlb2YgT2JqZWN0LmtleXM9PSJmdW5jdGlvbiI/aT0+T2JqZWN0LmtleXMoaSk6aT0+e2NvbnN0IG89W107Zm9yKGNvbnN0IGwgaW4gaSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaSxsKSYmby5wdXNoKGwpO3JldHVybiBvfSxlLmZpbmQ9KGksbyk9Pntmb3IoY29uc3QgbCBvZiBpKWlmKG8obCkpcmV0dXJuIGx9LGUuaXNJbnRlZ2VyPXR5cGVvZiBOdW1iZXIuaXNJbnRlZ2VyPT0iZnVuY3Rpb24iP2k9Pk51bWJlci5pc0ludGVnZXIoaSk6aT0+dHlwZW9mIGk9PSJudW1iZXIiJiZpc0Zpbml0ZShpKSYmTWF0aC5mbG9vcihpKT09PWk7ZnVuY3Rpb24gcihpLG89IiB8ICIpe3JldHVybiBpLm1hcChsPT50eXBlb2YgbD09InN0cmluZyI/YCcke2x9J2A6bCkuam9pbihvKX1lLmpvaW5WYWx1ZXM9cixlLmpzb25TdHJpbmdpZnlSZXBsYWNlcj0oaSxvKT0+dHlwZW9mIG89PSJiaWdpbnQiP28udG9TdHJpbmcoKTpvfSkoTGV8fChMZT17fSkpO3ZhciBEbTsoZnVuY3Rpb24oZSl7ZS5tZXJnZVNoYXBlcz0odCxuKT0+KHsuLi50LC4uLm59KX0pKERtfHwoRG09e30pKTtjb25zdCBRPUxlLmFycmF5VG9FbnVtKFsic3RyaW5nIiwibmFuIiwibnVtYmVyIiwiaW50ZWdlciIsImZsb2F0IiwiYm9vbGVhbiIsImRhdGUiLCJiaWdpbnQiLCJzeW1ib2wiLCJmdW5jdGlvbiIsInVuZGVmaW5lZCIsIm51bGwiLCJhcnJheSIsIm9iamVjdCIsInVua25vd24iLCJwcm9taXNlIiwidm9pZCIsIm5ldmVyIiwibWFwIiwic2V0Il0pLHppPWU9Pntzd2l0Y2godHlwZW9mIGUpe2Nhc2UidW5kZWZpbmVkIjpyZXR1cm4gUS51bmRlZmluZWQ7Y2FzZSJzdHJpbmciOnJldHVybiBRLnN0cmluZztjYXNlIm51bWJlciI6cmV0dXJuIGlzTmFOKGUpP1EubmFuOlEubnVtYmVyO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIFEuYm9vbGVhbjtjYXNlImZ1bmN0aW9uIjpyZXR1cm4gUS5mdW5jdGlvbjtjYXNlImJpZ2ludCI6cmV0dXJuIFEuYmlnaW50O2Nhc2Uic3ltYm9sIjpyZXR1cm4gUS5zeW1ib2w7Y2FzZSJvYmplY3QiOnJldHVybiBBcnJheS5pc0FycmF5KGUpP1EuYXJyYXk6ZT09PW51bGw/US5udWxsOmUudGhlbiYmdHlwZW9mIGUudGhlbj09ImZ1bmN0aW9uIiYmZS5jYXRjaCYmdHlwZW9mIGUuY2F0Y2g9PSJmdW5jdGlvbiI/US5wcm9taXNlOnR5cGVvZiBNYXA8InUiJiZlIGluc3RhbmNlb2YgTWFwP1EubWFwOnR5cGVvZiBTZXQ8InUiJiZlIGluc3RhbmNlb2YgU2V0P1Euc2V0OnR5cGVvZiBEYXRlPCJ1IiYmZSBpbnN0YW5jZW9mIERhdGU/US5kYXRlOlEub2JqZWN0O2RlZmF1bHQ6cmV0dXJuIFEudW5rbm93bn19LFc9TGUuYXJyYXlUb0VudW0oWyJpbnZhbGlkX3R5cGUiLCJpbnZhbGlkX2xpdGVyYWwiLCJjdXN0b20iLCJpbnZhbGlkX3VuaW9uIiwiaW52YWxpZF91bmlvbl9kaXNjcmltaW5hdG9yIiwiaW52YWxpZF9lbnVtX3ZhbHVlIiwidW5yZWNvZ25pemVkX2tleXMiLCJpbnZhbGlkX2FyZ3VtZW50cyIsImludmFsaWRfcmV0dXJuX3R5cGUiLCJpbnZhbGlkX2RhdGUiLCJpbnZhbGlkX3N0cmluZyIsInRvb19zbWFsbCIsInRvb19iaWciLCJpbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlcyIsIm5vdF9tdWx0aXBsZV9vZiIsIm5vdF9maW5pdGUiXSksZjU9ZT0+SlNPTi5zdHJpbmdpZnkoZSxudWxsLDIpLnJlcGxhY2UoLyIoW14iXSspIjovZywiJDE6Iik7Y2xhc3MgRXIgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNzdWVzPVtdLHRoaXMuYWRkSXNzdWU9cj0+e3RoaXMuaXNzdWVzPVsuLi50aGlzLmlzc3VlcyxyXX0sdGhpcy5hZGRJc3N1ZXM9KHI9W10pPT57dGhpcy5pc3N1ZXM9Wy4uLnRoaXMuaXNzdWVzLC4uLnJdfTtjb25zdCBuPW5ldy50YXJnZXQucHJvdG90eXBlO09iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxuKTp0aGlzLl9fcHJvdG9fXz1uLHRoaXMubmFtZT0iWm9kRXJyb3IiLHRoaXMuaXNzdWVzPXR9Z2V0IGVycm9ycygpe3JldHVybiB0aGlzLmlzc3Vlc31mb3JtYXQodCl7Y29uc3Qgbj10fHxmdW5jdGlvbihvKXtyZXR1cm4gby5tZXNzYWdlfSxyPXtfZXJyb3JzOltdfSxpPW89Pntmb3IoY29uc3QgbCBvZiBvLmlzc3VlcylpZihsLmNvZGU9PT0iaW52YWxpZF91bmlvbiIpbC51bmlvbkVycm9ycy5tYXAoaSk7ZWxzZSBpZihsLmNvZGU9PT0iaW52YWxpZF9yZXR1cm5fdHlwZSIpaShsLnJldHVyblR5cGVFcnJvcik7ZWxzZSBpZihsLmNvZGU9PT0iaW52YWxpZF9hcmd1bWVudHMiKWkobC5hcmd1bWVudHNFcnJvcik7ZWxzZSBpZihsLnBhdGgubGVuZ3RoPT09MClyLl9lcnJvcnMucHVzaChuKGwpKTtlbHNle2xldCBzPXIsYT0wO2Zvcig7YTxsLnBhdGgubGVuZ3RoOyl7Y29uc3QgdT1sLnBhdGhbYV07YT09PWwucGF0aC5sZW5ndGgtMT8oc1t1XT1zW3VdfHx7X2Vycm9yczpbXX0sc1t1XS5fZXJyb3JzLnB1c2gobihsKSkpOnNbdV09c1t1XXx8e19lcnJvcnM6W119LHM9c1t1XSxhKyt9fX07cmV0dXJuIGkodGhpcykscn10b1N0cmluZygpe3JldHVybiB0aGlzLm1lc3NhZ2V9Z2V0IG1lc3NhZ2UoKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5pc3N1ZXMsTGUuanNvblN0cmluZ2lmeVJlcGxhY2VyLDIpfWdldCBpc0VtcHR5KCl7cmV0dXJuIHRoaXMuaXNzdWVzLmxlbmd0aD09PTB9ZmxhdHRlbih0PW49Pm4ubWVzc2FnZSl7Y29uc3Qgbj17fSxyPVtdO2Zvcihjb25zdCBpIG9mIHRoaXMuaXNzdWVzKWkucGF0aC5sZW5ndGg+MD8obltpLnBhdGhbMF1dPW5baS5wYXRoWzBdXXx8W10sbltpLnBhdGhbMF1dLnB1c2godChpKSkpOnIucHVzaCh0KGkpKTtyZXR1cm57Zm9ybUVycm9yczpyLGZpZWxkRXJyb3JzOm59fWdldCBmb3JtRXJyb3JzKCl7cmV0dXJuIHRoaXMuZmxhdHRlbigpfX1Fci5jcmVhdGU9ZT0+bmV3IEVyKGUpO2NvbnN0IGR1PShlLHQpPT57bGV0IG47c3dpdGNoKGUuY29kZSl7Y2FzZSBXLmludmFsaWRfdHlwZTplLnJlY2VpdmVkPT09US51bmRlZmluZWQ/bj0iUmVxdWlyZWQiOm49YEV4cGVjdGVkICR7ZS5leHBlY3RlZH0sIHJlY2VpdmVkICR7ZS5yZWNlaXZlZH1gO2JyZWFrO2Nhc2UgVy5pbnZhbGlkX2xpdGVyYWw6bj1gSW52YWxpZCBsaXRlcmFsIHZhbHVlLCBleHBlY3RlZCAke0pTT04uc3RyaW5naWZ5KGUuZXhwZWN0ZWQsTGUuanNvblN0cmluZ2lmeVJlcGxhY2VyKX1gO2JyZWFrO2Nhc2UgVy51bnJlY29nbml6ZWRfa2V5czpuPWBVbnJlY29nbml6ZWQga2V5KHMpIGluIG9iamVjdDogJHtMZS5qb2luVmFsdWVzKGUua2V5cywiLCAiKX1gO2JyZWFrO2Nhc2UgVy5pbnZhbGlkX3VuaW9uOm49IkludmFsaWQgaW5wdXQiO2JyZWFrO2Nhc2UgVy5pbnZhbGlkX3VuaW9uX2Rpc2NyaW1pbmF0b3I6bj1gSW52YWxpZCBkaXNjcmltaW5hdG9yIHZhbHVlLiBFeHBlY3RlZCAke0xlLmpvaW5WYWx1ZXMoZS5vcHRpb25zKX1gO2JyZWFrO2Nhc2UgVy5pbnZhbGlkX2VudW1fdmFsdWU6bj1gSW52YWxpZCBlbnVtIHZhbHVlLiBFeHBlY3RlZCAke0xlLmpvaW5WYWx1ZXMoZS5vcHRpb25zKX0sIHJlY2VpdmVkICcke2UucmVjZWl2ZWR9J2A7YnJlYWs7Y2FzZSBXLmludmFsaWRfYXJndW1lbnRzOm49IkludmFsaWQgZnVuY3Rpb24gYXJndW1lbnRzIjticmVhaztjYXNlIFcuaW52YWxpZF9yZXR1cm5fdHlwZTpuPSJJbnZhbGlkIGZ1bmN0aW9uIHJldHVybiB0eXBlIjticmVhaztjYXNlIFcuaW52YWxpZF9kYXRlOm49IkludmFsaWQgZGF0ZSI7YnJlYWs7Y2FzZSBXLmludmFsaWRfc3RyaW5nOnR5cGVvZiBlLnZhbGlkYXRpb249PSJvYmplY3QiPyJpbmNsdWRlcyJpbiBlLnZhbGlkYXRpb24/KG49YEludmFsaWQgaW5wdXQ6IG11c3QgaW5jbHVkZSAiJHtlLnZhbGlkYXRpb24uaW5jbHVkZXN9ImAsdHlwZW9mIGUudmFsaWRhdGlvbi5wb3NpdGlvbj09Im51bWJlciImJihuPWAke259IGF0IG9uZSBvciBtb3JlIHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtlLnZhbGlkYXRpb24ucG9zaXRpb259YCkpOiJzdGFydHNXaXRoImluIGUudmFsaWRhdGlvbj9uPWBJbnZhbGlkIGlucHV0OiBtdXN0IHN0YXJ0IHdpdGggIiR7ZS52YWxpZGF0aW9uLnN0YXJ0c1dpdGh9ImA6ImVuZHNXaXRoImluIGUudmFsaWRhdGlvbj9uPWBJbnZhbGlkIGlucHV0OiBtdXN0IGVuZCB3aXRoICIke2UudmFsaWRhdGlvbi5lbmRzV2l0aH0iYDpMZS5hc3NlcnROZXZlcihlLnZhbGlkYXRpb24pOmUudmFsaWRhdGlvbiE9PSJyZWdleCI/bj1gSW52YWxpZCAke2UudmFsaWRhdGlvbn1gOm49IkludmFsaWQiO2JyZWFrO2Nhc2UgVy50b29fc21hbGw6ZS50eXBlPT09ImFycmF5Ij9uPWBBcnJheSBtdXN0IGNvbnRhaW4gJHtlLmV4YWN0PyJleGFjdGx5IjplLmluY2x1c2l2ZT8iYXQgbGVhc3QiOiJtb3JlIHRoYW4ifSAke2UubWluaW11bX0gZWxlbWVudChzKWA6ZS50eXBlPT09InN0cmluZyI/bj1gU3RyaW5nIG11c3QgY29udGFpbiAke2UuZXhhY3Q/ImV4YWN0bHkiOmUuaW5jbHVzaXZlPyJhdCBsZWFzdCI6Im92ZXIifSAke2UubWluaW11bX0gY2hhcmFjdGVyKHMpYDplLnR5cGU9PT0ibnVtYmVyIj9uPWBOdW1iZXIgbXVzdCBiZSAke2UuZXhhY3Q/ImV4YWN0bHkgZXF1YWwgdG8gIjplLmluY2x1c2l2ZT8iZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICI6ImdyZWF0ZXIgdGhhbiAifSR7ZS5taW5pbXVtfWA6ZS50eXBlPT09ImRhdGUiP249YERhdGUgbXVzdCBiZSAke2UuZXhhY3Q/ImV4YWN0bHkgZXF1YWwgdG8gIjplLmluY2x1c2l2ZT8iZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICI6ImdyZWF0ZXIgdGhhbiAifSR7bmV3IERhdGUoTnVtYmVyKGUubWluaW11bSkpfWA6bj0iSW52YWxpZCBpbnB1dCI7YnJlYWs7Y2FzZSBXLnRvb19iaWc6ZS50eXBlPT09ImFycmF5Ij9uPWBBcnJheSBtdXN0IGNvbnRhaW4gJHtlLmV4YWN0PyJleGFjdGx5IjplLmluY2x1c2l2ZT8iYXQgbW9zdCI6Imxlc3MgdGhhbiJ9ICR7ZS5tYXhpbXVtfSBlbGVtZW50KHMpYDplLnR5cGU9PT0ic3RyaW5nIj9uPWBTdHJpbmcgbXVzdCBjb250YWluICR7ZS5leGFjdD8iZXhhY3RseSI6ZS5pbmNsdXNpdmU/ImF0IG1vc3QiOiJ1bmRlciJ9ICR7ZS5tYXhpbXVtfSBjaGFyYWN0ZXIocylgOmUudHlwZT09PSJudW1iZXIiP249YE51bWJlciBtdXN0IGJlICR7ZS5leGFjdD8iZXhhY3RseSI6ZS5pbmNsdXNpdmU/Imxlc3MgdGhhbiBvciBlcXVhbCB0byI6Imxlc3MgdGhhbiJ9ICR7ZS5tYXhpbXVtfWA6ZS50eXBlPT09ImJpZ2ludCI/bj1gQmlnSW50IG11c3QgYmUgJHtlLmV4YWN0PyJleGFjdGx5IjplLmluY2x1c2l2ZT8ibGVzcyB0aGFuIG9yIGVxdWFsIHRvIjoibGVzcyB0aGFuIn0gJHtlLm1heGltdW19YDplLnR5cGU9PT0iZGF0ZSI/bj1gRGF0ZSBtdXN0IGJlICR7ZS5leGFjdD8iZXhhY3RseSI6ZS5pbmNsdXNpdmU/InNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byI6InNtYWxsZXIgdGhhbiJ9ICR7bmV3IERhdGUoTnVtYmVyKGUubWF4aW11bSkpfWA6bj0iSW52YWxpZCBpbnB1dCI7YnJlYWs7Y2FzZSBXLmN1c3RvbTpuPSJJbnZhbGlkIGlucHV0IjticmVhaztjYXNlIFcuaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXM6bj0iSW50ZXJzZWN0aW9uIHJlc3VsdHMgY291bGQgbm90IGJlIG1lcmdlZCI7YnJlYWs7Y2FzZSBXLm5vdF9tdWx0aXBsZV9vZjpuPWBOdW1iZXIgbXVzdCBiZSBhIG11bHRpcGxlIG9mICR7ZS5tdWx0aXBsZU9mfWA7YnJlYWs7Y2FzZSBXLm5vdF9maW5pdGU6bj0iTnVtYmVyIG11c3QgYmUgZmluaXRlIjticmVhaztkZWZhdWx0Om49dC5kZWZhdWx0RXJyb3IsTGUuYXNzZXJ0TmV2ZXIoZSl9cmV0dXJue21lc3NhZ2U6bn19O2xldCAkQz1kdTtmdW5jdGlvbiBoNShlKXskQz1lfWZ1bmN0aW9uIEZkKCl7cmV0dXJuICRDfWNvbnN0IEJkPWU9Pntjb25zdHtkYXRhOnQscGF0aDpuLGVycm9yTWFwczpyLGlzc3VlRGF0YTppfT1lLG89Wy4uLm4sLi4uaS5wYXRofHxbXV0sbD17Li4uaSxwYXRoOm99O2xldCBzPSIiO2NvbnN0IGE9ci5maWx0ZXIodT0+ISF1KS5zbGljZSgpLnJldmVyc2UoKTtmb3IoY29uc3QgdSBvZiBhKXM9dShsLHtkYXRhOnQsZGVmYXVsdEVycm9yOnN9KS5tZXNzYWdlO3JldHVybnsuLi5pLHBhdGg6byxtZXNzYWdlOmkubWVzc2FnZXx8c319LHA1PVtdO2Z1bmN0aW9uIHEoZSx0KXtjb25zdCBuPUJkKHtpc3N1ZURhdGE6dCxkYXRhOmUuZGF0YSxwYXRoOmUucGF0aCxlcnJvck1hcHM6W2UuY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCxlLnNjaGVtYUVycm9yTWFwLEZkKCksZHVdLmZpbHRlcihyPT4hIXIpfSk7ZS5jb21tb24uaXNzdWVzLnB1c2gobil9Y2xhc3Mgb257Y29uc3RydWN0b3IoKXt0aGlzLnZhbHVlPSJ2YWxpZCJ9ZGlydHkoKXt0aGlzLnZhbHVlPT09InZhbGlkIiYmKHRoaXMudmFsdWU9ImRpcnR5Iil9YWJvcnQoKXt0aGlzLnZhbHVlIT09ImFib3J0ZWQiJiYodGhpcy52YWx1ZT0iYWJvcnRlZCIpfXN0YXRpYyBtZXJnZUFycmF5KHQsbil7Y29uc3Qgcj1bXTtmb3IoY29uc3QgaSBvZiBuKXtpZihpLnN0YXR1cz09PSJhYm9ydGVkIilyZXR1cm4gZ2U7aS5zdGF0dXM9PT0iZGlydHkiJiZ0LmRpcnR5KCksci5wdXNoKGkudmFsdWUpfXJldHVybntzdGF0dXM6dC52YWx1ZSx2YWx1ZTpyfX1zdGF0aWMgYXN5bmMgbWVyZ2VPYmplY3RBc3luYyh0LG4pe2NvbnN0IHI9W107Zm9yKGNvbnN0IGkgb2YgbilyLnB1c2goe2tleTphd2FpdCBpLmtleSx2YWx1ZTphd2FpdCBpLnZhbHVlfSk7cmV0dXJuIG9uLm1lcmdlT2JqZWN0U3luYyh0LHIpfXN0YXRpYyBtZXJnZU9iamVjdFN5bmModCxuKXtjb25zdCByPXt9O2Zvcihjb25zdCBpIG9mIG4pe2NvbnN0e2tleTpvLHZhbHVlOmx9PWk7aWYoby5zdGF0dXM9PT0iYWJvcnRlZCJ8fGwuc3RhdHVzPT09ImFib3J0ZWQiKXJldHVybiBnZTtvLnN0YXR1cz09PSJkaXJ0eSImJnQuZGlydHkoKSxsLnN0YXR1cz09PSJkaXJ0eSImJnQuZGlydHkoKSxvLnZhbHVlIT09Il9fcHJvdG9fXyImJih0eXBlb2YgbC52YWx1ZTwidSJ8fGkuYWx3YXlzU2V0KSYmKHJbby52YWx1ZV09bC52YWx1ZSl9cmV0dXJue3N0YXR1czp0LnZhbHVlLHZhbHVlOnJ9fX1jb25zdCBnZT1PYmplY3QuZnJlZXplKHtzdGF0dXM6ImFib3J0ZWQifSksYkM9ZT0+KHtzdGF0dXM6ImRpcnR5Iix2YWx1ZTplfSkseW49ZT0+KHtzdGF0dXM6InZhbGlkIix2YWx1ZTplfSksTG09ZT0+ZS5zdGF0dXM9PT0iYWJvcnRlZCIsSW09ZT0+ZS5zdGF0dXM9PT0iZGlydHkiLGZ1PWU9PmUuc3RhdHVzPT09InZhbGlkIixVZD1lPT50eXBlb2YgUHJvbWlzZTwidSImJmUgaW5zdGFuY2VvZiBQcm9taXNlO3ZhciBjZTsoZnVuY3Rpb24oZSl7ZS5lcnJUb09iaj10PT50eXBlb2YgdD09InN0cmluZyI/e21lc3NhZ2U6dH06dHx8e30sZS50b1N0cmluZz10PT50eXBlb2YgdD09InN0cmluZyI/dDp0PT1udWxsP3ZvaWQgMDp0Lm1lc3NhZ2V9KShjZXx8KGNlPXt9KSk7Y2xhc3MgSHJ7Y29uc3RydWN0b3IodCxuLHIsaSl7dGhpcy5fY2FjaGVkUGF0aD1bXSx0aGlzLnBhcmVudD10LHRoaXMuZGF0YT1uLHRoaXMuX3BhdGg9cix0aGlzLl9rZXk9aX1nZXQgcGF0aCgpe3JldHVybiB0aGlzLl9jYWNoZWRQYXRoLmxlbmd0aHx8KHRoaXMuX2tleSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuX2NhY2hlZFBhdGgucHVzaCguLi50aGlzLl9wYXRoLC4uLnRoaXMuX2tleSk6dGhpcy5fY2FjaGVkUGF0aC5wdXNoKC4uLnRoaXMuX3BhdGgsdGhpcy5fa2V5KSksdGhpcy5fY2FjaGVkUGF0aH19Y29uc3QgJHg9KGUsdCk9PntpZihmdSh0KSlyZXR1cm57c3VjY2VzczohMCxkYXRhOnQudmFsdWV9O2lmKCFlLmNvbW1vbi5pc3N1ZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiVmFsaWRhdGlvbiBmYWlsZWQgYnV0IG5vIGlzc3VlcyBkZXRlY3RlZC4iKTtyZXR1cm57c3VjY2VzczohMSxnZXQgZXJyb3IoKXtpZih0aGlzLl9lcnJvcilyZXR1cm4gdGhpcy5fZXJyb3I7Y29uc3Qgbj1uZXcgRXIoZS5jb21tb24uaXNzdWVzKTtyZXR1cm4gdGhpcy5fZXJyb3I9bix0aGlzLl9lcnJvcn19fTtmdW5jdGlvbiB3ZShlKXtpZighZSlyZXR1cm57fTtjb25zdHtlcnJvck1hcDp0LGludmFsaWRfdHlwZV9lcnJvcjpuLHJlcXVpcmVkX2Vycm9yOnIsZGVzY3JpcHRpb246aX09ZTtpZih0JiYobnx8cikpdGhyb3cgbmV3IEVycm9yKGBDYW4ndCB1c2UgImludmFsaWRfdHlwZV9lcnJvciIgb3IgInJlcXVpcmVkX2Vycm9yIiBpbiBjb25qdW5jdGlvbiB3aXRoIGN1c3RvbSBlcnJvciBtYXAuYCk7cmV0dXJuIHQ/e2Vycm9yTWFwOnQsZGVzY3JpcHRpb246aX06e2Vycm9yTWFwOihsLHMpPT5sLmNvZGUhPT0iaW52YWxpZF90eXBlIj97bWVzc2FnZTpzLmRlZmF1bHRFcnJvcn06dHlwZW9mIHMuZGF0YT4idSI/e21lc3NhZ2U6cj8/cy5kZWZhdWx0RXJyb3J9OnttZXNzYWdlOm4/P3MuZGVmYXVsdEVycm9yfSxkZXNjcmlwdGlvbjppfX1jbGFzcyBDZXtjb25zdHJ1Y3Rvcih0KXt0aGlzLnNwYT10aGlzLnNhZmVQYXJzZUFzeW5jLHRoaXMuX2RlZj10LHRoaXMucGFyc2U9dGhpcy5wYXJzZS5iaW5kKHRoaXMpLHRoaXMuc2FmZVBhcnNlPXRoaXMuc2FmZVBhcnNlLmJpbmQodGhpcyksdGhpcy5wYXJzZUFzeW5jPXRoaXMucGFyc2VBc3luYy5iaW5kKHRoaXMpLHRoaXMuc2FmZVBhcnNlQXN5bmM9dGhpcy5zYWZlUGFyc2VBc3luYy5iaW5kKHRoaXMpLHRoaXMuc3BhPXRoaXMuc3BhLmJpbmQodGhpcyksdGhpcy5yZWZpbmU9dGhpcy5yZWZpbmUuYmluZCh0aGlzKSx0aGlzLnJlZmluZW1lbnQ9dGhpcy5yZWZpbmVtZW50LmJpbmQodGhpcyksdGhpcy5zdXBlclJlZmluZT10aGlzLnN1cGVyUmVmaW5lLmJpbmQodGhpcyksdGhpcy5vcHRpb25hbD10aGlzLm9wdGlvbmFsLmJpbmQodGhpcyksdGhpcy5udWxsYWJsZT10aGlzLm51bGxhYmxlLmJpbmQodGhpcyksdGhpcy5udWxsaXNoPXRoaXMubnVsbGlzaC5iaW5kKHRoaXMpLHRoaXMuYXJyYXk9dGhpcy5hcnJheS5iaW5kKHRoaXMpLHRoaXMucHJvbWlzZT10aGlzLnByb21pc2UuYmluZCh0aGlzKSx0aGlzLm9yPXRoaXMub3IuYmluZCh0aGlzKSx0aGlzLmFuZD10aGlzLmFuZC5iaW5kKHRoaXMpLHRoaXMudHJhbnNmb3JtPXRoaXMudHJhbnNmb3JtLmJpbmQodGhpcyksdGhpcy5icmFuZD10aGlzLmJyYW5kLmJpbmQodGhpcyksdGhpcy5kZWZhdWx0PXRoaXMuZGVmYXVsdC5iaW5kKHRoaXMpLHRoaXMuY2F0Y2g9dGhpcy5jYXRjaC5iaW5kKHRoaXMpLHRoaXMuZGVzY3JpYmU9dGhpcy5kZXNjcmliZS5iaW5kKHRoaXMpLHRoaXMucGlwZT10aGlzLnBpcGUuYmluZCh0aGlzKSx0aGlzLnJlYWRvbmx5PXRoaXMucmVhZG9ubHkuYmluZCh0aGlzKSx0aGlzLmlzTnVsbGFibGU9dGhpcy5pc051bGxhYmxlLmJpbmQodGhpcyksdGhpcy5pc09wdGlvbmFsPXRoaXMuaXNPcHRpb25hbC5iaW5kKHRoaXMpfWdldCBkZXNjcmlwdGlvbigpe3JldHVybiB0aGlzLl9kZWYuZGVzY3JpcHRpb259X2dldFR5cGUodCl7cmV0dXJuIHppKHQuZGF0YSl9X2dldE9yUmV0dXJuQ3R4KHQsbil7cmV0dXJuIG58fHtjb21tb246dC5wYXJlbnQuY29tbW9uLGRhdGE6dC5kYXRhLHBhcnNlZFR5cGU6emkodC5kYXRhKSxzY2hlbWFFcnJvck1hcDp0aGlzLl9kZWYuZXJyb3JNYXAscGF0aDp0LnBhdGgscGFyZW50OnQucGFyZW50fX1fcHJvY2Vzc0lucHV0UGFyYW1zKHQpe3JldHVybntzdGF0dXM6bmV3IG9uLGN0eDp7Y29tbW9uOnQucGFyZW50LmNvbW1vbixkYXRhOnQuZGF0YSxwYXJzZWRUeXBlOnppKHQuZGF0YSksc2NoZW1hRXJyb3JNYXA6dGhpcy5fZGVmLmVycm9yTWFwLHBhdGg6dC5wYXRoLHBhcmVudDp0LnBhcmVudH19fV9wYXJzZVN5bmModCl7Y29uc3Qgbj10aGlzLl9wYXJzZSh0KTtpZihVZChuKSl0aHJvdyBuZXcgRXJyb3IoIlN5bmNocm9ub3VzIHBhcnNlIGVuY291bnRlcmVkIHByb21pc2UuIik7cmV0dXJuIG59X3BhcnNlQXN5bmModCl7Y29uc3Qgbj10aGlzLl9wYXJzZSh0KTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG4pfXBhcnNlKHQsbil7Y29uc3Qgcj10aGlzLnNhZmVQYXJzZSh0LG4pO2lmKHIuc3VjY2VzcylyZXR1cm4gci5kYXRhO3Rocm93IHIuZXJyb3J9c2FmZVBhcnNlKHQsbil7dmFyIHI7Y29uc3QgaT17Y29tbW9uOntpc3N1ZXM6W10sYXN5bmM6KHI9bj09bnVsbD92b2lkIDA6bi5hc3luYykhPT1udWxsJiZyIT09dm9pZCAwP3I6ITEsY29udGV4dHVhbEVycm9yTWFwOm49PW51bGw/dm9pZCAwOm4uZXJyb3JNYXB9LHBhdGg6KG49PW51bGw/dm9pZCAwOm4ucGF0aCl8fFtdLHNjaGVtYUVycm9yTWFwOnRoaXMuX2RlZi5lcnJvck1hcCxwYXJlbnQ6bnVsbCxkYXRhOnQscGFyc2VkVHlwZTp6aSh0KX0sbz10aGlzLl9wYXJzZVN5bmMoe2RhdGE6dCxwYXRoOmkucGF0aCxwYXJlbnQ6aX0pO3JldHVybiAkeChpLG8pfWFzeW5jIHBhcnNlQXN5bmModCxuKXtjb25zdCByPWF3YWl0IHRoaXMuc2FmZVBhcnNlQXN5bmModCxuKTtpZihyLnN1Y2Nlc3MpcmV0dXJuIHIuZGF0YTt0aHJvdyByLmVycm9yfWFzeW5jIHNhZmVQYXJzZUFzeW5jKHQsbil7Y29uc3Qgcj17Y29tbW9uOntpc3N1ZXM6W10sY29udGV4dHVhbEVycm9yTWFwOm49PW51bGw/dm9pZCAwOm4uZXJyb3JNYXAsYXN5bmM6ITB9LHBhdGg6KG49PW51bGw/dm9pZCAwOm4ucGF0aCl8fFtdLHNjaGVtYUVycm9yTWFwOnRoaXMuX2RlZi5lcnJvck1hcCxwYXJlbnQ6bnVsbCxkYXRhOnQscGFyc2VkVHlwZTp6aSh0KX0saT10aGlzLl9wYXJzZSh7ZGF0YTp0LHBhdGg6ci5wYXRoLHBhcmVudDpyfSksbz1hd2FpdChVZChpKT9pOlByb21pc2UucmVzb2x2ZShpKSk7cmV0dXJuICR4KHIsbyl9cmVmaW5lKHQsbil7Y29uc3Qgcj1pPT50eXBlb2Ygbj09InN0cmluZyJ8fHR5cGVvZiBuPiJ1Ij97bWVzc2FnZTpufTp0eXBlb2Ygbj09ImZ1bmN0aW9uIj9uKGkpOm47cmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKGksbyk9Pntjb25zdCBsPXQoaSkscz0oKT0+by5hZGRJc3N1ZSh7Y29kZTpXLmN1c3RvbSwuLi5yKGkpfSk7cmV0dXJuIHR5cGVvZiBQcm9taXNlPCJ1IiYmbCBpbnN0YW5jZW9mIFByb21pc2U/bC50aGVuKGE9PmE/ITA6KHMoKSwhMSkpOmw/ITA6KHMoKSwhMSl9KX1yZWZpbmVtZW50KHQsbil7cmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKHIsaSk9PnQocik/ITA6KGkuYWRkSXNzdWUodHlwZW9mIG49PSJmdW5jdGlvbiI/bihyLGkpOm4pLCExKSl9X3JlZmluZW1lbnQodCl7cmV0dXJuIG5ldyBicih7c2NoZW1hOnRoaXMsdHlwZU5hbWU6ZGUuWm9kRWZmZWN0cyxlZmZlY3Q6e3R5cGU6InJlZmluZW1lbnQiLHJlZmluZW1lbnQ6dH19KX1zdXBlclJlZmluZSh0KXtyZXR1cm4gdGhpcy5fcmVmaW5lbWVudCh0KX1vcHRpb25hbCgpe3JldHVybiBjaS5jcmVhdGUodGhpcyx0aGlzLl9kZWYpfW51bGxhYmxlKCl7cmV0dXJuIHRsLmNyZWF0ZSh0aGlzLHRoaXMuX2RlZil9bnVsbGlzaCgpe3JldHVybiB0aGlzLm51bGxhYmxlKCkub3B0aW9uYWwoKX1hcnJheSgpe3JldHVybiBDci5jcmVhdGUodGhpcyx0aGlzLl9kZWYpfXByb21pc2UoKXtyZXR1cm4gcHMuY3JlYXRlKHRoaXMsdGhpcy5fZGVmKX1vcih0KXtyZXR1cm4gZ3UuY3JlYXRlKFt0aGlzLHRdLHRoaXMuX2RlZil9YW5kKHQpe3JldHVybiB2dS5jcmVhdGUodGhpcyx0LHRoaXMuX2RlZil9dHJhbnNmb3JtKHQpe3JldHVybiBuZXcgYnIoey4uLndlKHRoaXMuX2RlZiksc2NoZW1hOnRoaXMsdHlwZU5hbWU6ZGUuWm9kRWZmZWN0cyxlZmZlY3Q6e3R5cGU6InRyYW5zZm9ybSIsdHJhbnNmb3JtOnR9fSl9ZGVmYXVsdCh0KXtjb25zdCBuPXR5cGVvZiB0PT0iZnVuY3Rpb24iP3Q6KCk9PnQ7cmV0dXJuIG5ldyBTdSh7Li4ud2UodGhpcy5fZGVmKSxpbm5lclR5cGU6dGhpcyxkZWZhdWx0VmFsdWU6bix0eXBlTmFtZTpkZS5ab2REZWZhdWx0fSl9YnJhbmQoKXtyZXR1cm4gbmV3IE5DKHt0eXBlTmFtZTpkZS5ab2RCcmFuZGVkLHR5cGU6dGhpcywuLi53ZSh0aGlzLl9kZWYpfSl9Y2F0Y2godCl7Y29uc3Qgbj10eXBlb2YgdD09ImZ1bmN0aW9uIj90OigpPT50O3JldHVybiBuZXcgS2Qoey4uLndlKHRoaXMuX2RlZiksaW5uZXJUeXBlOnRoaXMsY2F0Y2hWYWx1ZTpuLHR5cGVOYW1lOmRlLlpvZENhdGNofSl9ZGVzY3JpYmUodCl7Y29uc3Qgbj10aGlzLmNvbnN0cnVjdG9yO3JldHVybiBuZXcgbih7Li4udGhpcy5fZGVmLGRlc2NyaXB0aW9uOnR9KX1waXBlKHQpe3JldHVybiBCdS5jcmVhdGUodGhpcyx0KX1yZWFkb25seSgpe3JldHVybiBHZC5jcmVhdGUodGhpcyl9aXNPcHRpb25hbCgpe3JldHVybiB0aGlzLnNhZmVQYXJzZSh2b2lkIDApLnN1Y2Nlc3N9aXNOdWxsYWJsZSgpe3JldHVybiB0aGlzLnNhZmVQYXJzZShudWxsKS5zdWNjZXNzfX1jb25zdCBtNT0vXmNbXlxzLV17OCx9JC9pLGc1PS9eW2Etel1bYS16MC05XSokLyx2NT0vXlswLTlBLUhKS01OUC1UVi1aXXsyNn0kLyx5NT0vXlswLTlhLWZBLUZdezh9XGItWzAtOWEtZkEtRl17NH1cYi1bMC05YS1mQS1GXXs0fVxiLVswLTlhLWZBLUZdezR9XGItWzAtOWEtZkEtRl17MTJ9JC9pLHg1PS9eKD8hXC4pKD8hLipcLlwuKShbQS1aMC05XystXC5dKilbQS1aMC05XystXUAoW0EtWjAtOV1bQS1aMC05XC1dKlwuKStbQS1aXXsyLH0kL2ksXzU9Il4oXFxwe0V4dGVuZGVkX1BpY3RvZ3JhcGhpY318XFxwe0Vtb2ppX0NvbXBvbmVudH0pKyQiO2xldCBGaDtjb25zdCB3NT0vXigoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVwuKXszfSgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpJC8sUzU9L14oKFthLWYwLTldezEsNH06KXs3fXw6OihbYS1mMC05XXsxLDR9Oil7MCw2fXwoW2EtZjAtOV17MSw0fTopezF9OihbYS1mMC05XXsxLDR9Oil7MCw1fXwoW2EtZjAtOV17MSw0fTopezJ9OihbYS1mMC05XXsxLDR9Oil7MCw0fXwoW2EtZjAtOV17MSw0fTopezN9OihbYS1mMC05XXsxLDR9Oil7MCwzfXwoW2EtZjAtOV17MSw0fTopezR9OihbYS1mMC05XXsxLDR9Oil7MCwyfXwoW2EtZjAtOV17MSw0fTopezV9OihbYS1mMC05XXsxLDR9Oil7MCwxfSkoW2EtZjAtOV17MSw0fXwoKCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSlcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKSkkLyxFNT1lPT5lLnByZWNpc2lvbj9lLm9mZnNldD9uZXcgUmVnRXhwKGBeXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn1cXC5cXGR7JHtlLnByZWNpc2lvbn19KChbKy1dXFxkezJ9KDo/XFxkezJ9KT8pfFopJGApOm5ldyBSZWdFeHAoYF5cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfVxcLlxcZHske2UucHJlY2lzaW9ufX1aJGApOmUucHJlY2lzaW9uPT09MD9lLm9mZnNldD9uZXcgUmVnRXhwKCJeXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oKFsrLV1cXGR7Mn0oOj9cXGR7Mn0pPyl8WikkIik6bmV3IFJlZ0V4cCgiXlxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9WiQiKTplLm9mZnNldD9uZXcgUmVnRXhwKCJeXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oXFwuXFxkKyk/KChbKy1dXFxkezJ9KDo/XFxkezJ9KT8pfFopJCIpOm5ldyBSZWdFeHAoIl5cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfShcXC5cXGQrKT9aJCIpO2Z1bmN0aW9uIEM1KGUsdCl7cmV0dXJuISEoKHQ9PT0idjQifHwhdCkmJnc1LnRlc3QoZSl8fCh0PT09InY2Inx8IXQpJiZTNS50ZXN0KGUpKX1jbGFzcyBfciBleHRlbmRzIENle19wYXJzZSh0KXtpZih0aGlzLl9kZWYuY29lcmNlJiYodC5kYXRhPVN0cmluZyh0LmRhdGEpKSx0aGlzLl9nZXRUeXBlKHQpIT09US5zdHJpbmcpe2NvbnN0IG89dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCk7cmV0dXJuIHEobyx7Y29kZTpXLmludmFsaWRfdHlwZSxleHBlY3RlZDpRLnN0cmluZyxyZWNlaXZlZDpvLnBhcnNlZFR5cGV9KSxnZX1jb25zdCByPW5ldyBvbjtsZXQgaTtmb3IoY29uc3QgbyBvZiB0aGlzLl9kZWYuY2hlY2tzKWlmKG8ua2luZD09PSJtaW4iKXQuZGF0YS5sZW5ndGg8by52YWx1ZSYmKGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxpKSxxKGkse2NvZGU6Vy50b29fc21hbGwsbWluaW11bTpvLnZhbHVlLHR5cGU6InN0cmluZyIsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1lc3NhZ2U6by5tZXNzYWdlfSksci5kaXJ0eSgpKTtlbHNlIGlmKG8ua2luZD09PSJtYXgiKXQuZGF0YS5sZW5ndGg+by52YWx1ZSYmKGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxpKSxxKGkse2NvZGU6Vy50b29fYmlnLG1heGltdW06by52YWx1ZSx0eXBlOiJzdHJpbmciLGluY2x1c2l2ZTohMCxleGFjdDohMSxtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk7ZWxzZSBpZihvLmtpbmQ9PT0ibGVuZ3RoIil7Y29uc3QgbD10LmRhdGEubGVuZ3RoPm8udmFsdWUscz10LmRhdGEubGVuZ3RoPG8udmFsdWU7KGx8fHMpJiYoaT10aGlzLl9nZXRPclJldHVybkN0eCh0LGkpLGw/cShpLHtjb2RlOlcudG9vX2JpZyxtYXhpbXVtOm8udmFsdWUsdHlwZToic3RyaW5nIixpbmNsdXNpdmU6ITAsZXhhY3Q6ITAsbWVzc2FnZTpvLm1lc3NhZ2V9KTpzJiZxKGkse2NvZGU6Vy50b29fc21hbGwsbWluaW11bTpvLnZhbHVlLHR5cGU6InN0cmluZyIsaW5jbHVzaXZlOiEwLGV4YWN0OiEwLG1lc3NhZ2U6by5tZXNzYWdlfSksci5kaXJ0eSgpKX1lbHNlIGlmKG8ua2luZD09PSJlbWFpbCIpeDUudGVzdCh0LmRhdGEpfHwoaT10aGlzLl9nZXRPclJldHVybkN0eCh0LGkpLHEoaSx7dmFsaWRhdGlvbjoiZW1haWwiLGNvZGU6Vy5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk7ZWxzZSBpZihvLmtpbmQ9PT0iZW1vamkiKUZofHwoRmg9bmV3IFJlZ0V4cChfNSwidSIpKSxGaC50ZXN0KHQuZGF0YSl8fChpPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQsaSkscShpLHt2YWxpZGF0aW9uOiJlbW9qaSIsY29kZTpXLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6by5tZXNzYWdlfSksci5kaXJ0eSgpKTtlbHNlIGlmKG8ua2luZD09PSJ1dWlkIil5NS50ZXN0KHQuZGF0YSl8fChpPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQsaSkscShpLHt2YWxpZGF0aW9uOiJ1dWlkIixjb2RlOlcuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTpvLm1lc3NhZ2V9KSxyLmRpcnR5KCkpO2Vsc2UgaWYoby5raW5kPT09ImN1aWQiKW01LnRlc3QodC5kYXRhKXx8KGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxpKSxxKGkse3ZhbGlkYXRpb246ImN1aWQiLGNvZGU6Vy5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk7ZWxzZSBpZihvLmtpbmQ9PT0iY3VpZDIiKWc1LnRlc3QodC5kYXRhKXx8KGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxpKSxxKGkse3ZhbGlkYXRpb246ImN1aWQyIixjb2RlOlcuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTpvLm1lc3NhZ2V9KSxyLmRpcnR5KCkpO2Vsc2UgaWYoby5raW5kPT09InVsaWQiKXY1LnRlc3QodC5kYXRhKXx8KGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxpKSxxKGkse3ZhbGlkYXRpb246InVsaWQiLGNvZGU6Vy5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk7ZWxzZSBpZihvLmtpbmQ9PT0idXJsIil0cnl7bmV3IFVSTCh0LmRhdGEpfWNhdGNoe2k9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxpKSxxKGkse3ZhbGlkYXRpb246InVybCIsY29kZTpXLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6by5tZXNzYWdlfSksci5kaXJ0eSgpfWVsc2Ugby5raW5kPT09InJlZ2V4Ij8oby5yZWdleC5sYXN0SW5kZXg9MCxvLnJlZ2V4LnRlc3QodC5kYXRhKXx8KGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxpKSxxKGkse3ZhbGlkYXRpb246InJlZ2V4Iixjb2RlOlcuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTpvLm1lc3NhZ2V9KSxyLmRpcnR5KCkpKTpvLmtpbmQ9PT0idHJpbSI/dC5kYXRhPXQuZGF0YS50cmltKCk6by5raW5kPT09ImluY2x1ZGVzIj90LmRhdGEuaW5jbHVkZXMoby52YWx1ZSxvLnBvc2l0aW9uKXx8KGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxpKSxxKGkse2NvZGU6Vy5pbnZhbGlkX3N0cmluZyx2YWxpZGF0aW9uOntpbmNsdWRlczpvLnZhbHVlLHBvc2l0aW9uOm8ucG9zaXRpb259LG1lc3NhZ2U6by5tZXNzYWdlfSksci5kaXJ0eSgpKTpvLmtpbmQ9PT0idG9Mb3dlckNhc2UiP3QuZGF0YT10LmRhdGEudG9Mb3dlckNhc2UoKTpvLmtpbmQ9PT0idG9VcHBlckNhc2UiP3QuZGF0YT10LmRhdGEudG9VcHBlckNhc2UoKTpvLmtpbmQ9PT0ic3RhcnRzV2l0aCI/dC5kYXRhLnN0YXJ0c1dpdGgoby52YWx1ZSl8fChpPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQsaSkscShpLHtjb2RlOlcuaW52YWxpZF9zdHJpbmcsdmFsaWRhdGlvbjp7c3RhcnRzV2l0aDpvLnZhbHVlfSxtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk6by5raW5kPT09ImVuZHNXaXRoIj90LmRhdGEuZW5kc1dpdGgoby52YWx1ZSl8fChpPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQsaSkscShpLHtjb2RlOlcuaW52YWxpZF9zdHJpbmcsdmFsaWRhdGlvbjp7ZW5kc1dpdGg6by52YWx1ZX0sbWVzc2FnZTpvLm1lc3NhZ2V9KSxyLmRpcnR5KCkpOm8ua2luZD09PSJkYXRldGltZSI/RTUobykudGVzdCh0LmRhdGEpfHwoaT10aGlzLl9nZXRPclJldHVybkN0eCh0LGkpLHEoaSx7Y29kZTpXLmludmFsaWRfc3RyaW5nLHZhbGlkYXRpb246ImRhdGV0aW1lIixtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk6by5raW5kPT09ImlwIj9DNSh0LmRhdGEsby52ZXJzaW9uKXx8KGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxpKSxxKGkse3ZhbGlkYXRpb246ImlwIixjb2RlOlcuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTpvLm1lc3NhZ2V9KSxyLmRpcnR5KCkpOkxlLmFzc2VydE5ldmVyKG8pO3JldHVybntzdGF0dXM6ci52YWx1ZSx2YWx1ZTp0LmRhdGF9fV9yZWdleCh0LG4scil7cmV0dXJuIHRoaXMucmVmaW5lbWVudChpPT50LnRlc3QoaSkse3ZhbGlkYXRpb246bixjb2RlOlcuaW52YWxpZF9zdHJpbmcsLi4uY2UuZXJyVG9PYmoocil9KX1fYWRkQ2hlY2sodCl7cmV0dXJuIG5ldyBfcih7Li4udGhpcy5fZGVmLGNoZWNrczpbLi4udGhpcy5fZGVmLmNoZWNrcyx0XX0pfWVtYWlsKHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoiZW1haWwiLC4uLmNlLmVyclRvT2JqKHQpfSl9dXJsKHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoidXJsIiwuLi5jZS5lcnJUb09iaih0KX0pfWVtb2ppKHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoiZW1vamkiLC4uLmNlLmVyclRvT2JqKHQpfSl9dXVpZCh0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6InV1aWQiLC4uLmNlLmVyclRvT2JqKHQpfSl9Y3VpZCh0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImN1aWQiLC4uLmNlLmVyclRvT2JqKHQpfSl9Y3VpZDIodCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJjdWlkMiIsLi4uY2UuZXJyVG9PYmoodCl9KX11bGlkKHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoidWxpZCIsLi4uY2UuZXJyVG9PYmoodCl9KX1pcCh0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImlwIiwuLi5jZS5lcnJUb09iaih0KX0pfWRhdGV0aW1lKHQpe3ZhciBuO3JldHVybiB0eXBlb2YgdD09InN0cmluZyI/dGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImRhdGV0aW1lIixwcmVjaXNpb246bnVsbCxvZmZzZXQ6ITEsbWVzc2FnZTp0fSk6dGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImRhdGV0aW1lIixwcmVjaXNpb246dHlwZW9mKHQ9PW51bGw/dm9pZCAwOnQucHJlY2lzaW9uKT4idSI/bnVsbDp0PT1udWxsP3ZvaWQgMDp0LnByZWNpc2lvbixvZmZzZXQ6KG49dD09bnVsbD92b2lkIDA6dC5vZmZzZXQpIT09bnVsbCYmbiE9PXZvaWQgMD9uOiExLC4uLmNlLmVyclRvT2JqKHQ9PW51bGw/dm9pZCAwOnQubWVzc2FnZSl9KX1yZWdleCh0LG4pe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoicmVnZXgiLHJlZ2V4OnQsLi4uY2UuZXJyVG9PYmoobil9KX1pbmNsdWRlcyh0LG4pe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoiaW5jbHVkZXMiLHZhbHVlOnQscG9zaXRpb246bj09bnVsbD92b2lkIDA6bi5wb3NpdGlvbiwuLi5jZS5lcnJUb09iaihuPT1udWxsP3ZvaWQgMDpuLm1lc3NhZ2UpfSl9c3RhcnRzV2l0aCh0LG4pe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoic3RhcnRzV2l0aCIsdmFsdWU6dCwuLi5jZS5lcnJUb09iaihuKX0pfWVuZHNXaXRoKHQsbil7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJlbmRzV2l0aCIsdmFsdWU6dCwuLi5jZS5lcnJUb09iaihuKX0pfW1pbih0LG4pe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTp0LC4uLmNlLmVyclRvT2JqKG4pfSl9bWF4KHQsbil7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtYXgiLHZhbHVlOnQsLi4uY2UuZXJyVG9PYmoobil9KX1sZW5ndGgodCxuKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Imxlbmd0aCIsdmFsdWU6dCwuLi5jZS5lcnJUb09iaihuKX0pfW5vbmVtcHR5KHQpe3JldHVybiB0aGlzLm1pbigxLGNlLmVyclRvT2JqKHQpKX10cmltKCl7cmV0dXJuIG5ldyBfcih7Li4udGhpcy5fZGVmLGNoZWNrczpbLi4udGhpcy5fZGVmLmNoZWNrcyx7a2luZDoidHJpbSJ9XX0pfXRvTG93ZXJDYXNlKCl7cmV0dXJuIG5ldyBfcih7Li4udGhpcy5fZGVmLGNoZWNrczpbLi4udGhpcy5fZGVmLmNoZWNrcyx7a2luZDoidG9Mb3dlckNhc2UifV19KX10b1VwcGVyQ2FzZSgpe3JldHVybiBuZXcgX3Ioey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3Mse2tpbmQ6InRvVXBwZXJDYXNlIn1dfSl9Z2V0IGlzRGF0ZXRpbWUoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZCh0PT50LmtpbmQ9PT0iZGF0ZXRpbWUiKX1nZXQgaXNFbWFpbCgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKHQ9PnQua2luZD09PSJlbWFpbCIpfWdldCBpc1VSTCgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKHQ9PnQua2luZD09PSJ1cmwiKX1nZXQgaXNFbW9qaSgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKHQ9PnQua2luZD09PSJlbW9qaSIpfWdldCBpc1VVSUQoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZCh0PT50LmtpbmQ9PT0idXVpZCIpfWdldCBpc0NVSUQoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZCh0PT50LmtpbmQ9PT0iY3VpZCIpfWdldCBpc0NVSUQyKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQodD0+dC5raW5kPT09ImN1aWQyIil9Z2V0IGlzVUxJRCgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKHQ9PnQua2luZD09PSJ1bGlkIil9Z2V0IGlzSVAoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZCh0PT50LmtpbmQ9PT0iaXAiKX1nZXQgbWluTGVuZ3RoKCl7bGV0IHQ9bnVsbDtmb3IoY29uc3QgbiBvZiB0aGlzLl9kZWYuY2hlY2tzKW4ua2luZD09PSJtaW4iJiYodD09PW51bGx8fG4udmFsdWU+dCkmJih0PW4udmFsdWUpO3JldHVybiB0fWdldCBtYXhMZW5ndGgoKXtsZXQgdD1udWxsO2Zvcihjb25zdCBuIG9mIHRoaXMuX2RlZi5jaGVja3Mpbi5raW5kPT09Im1heCImJih0PT09bnVsbHx8bi52YWx1ZTx0KSYmKHQ9bi52YWx1ZSk7cmV0dXJuIHR9fV9yLmNyZWF0ZT1lPT57dmFyIHQ7cmV0dXJuIG5ldyBfcih7Y2hlY2tzOltdLHR5cGVOYW1lOmRlLlpvZFN0cmluZyxjb2VyY2U6KHQ9ZT09bnVsbD92b2lkIDA6ZS5jb2VyY2UpIT09bnVsbCYmdCE9PXZvaWQgMD90OiExLC4uLndlKGUpfSl9O2Z1bmN0aW9uIGs1KGUsdCl7Y29uc3Qgbj0oZS50b1N0cmluZygpLnNwbGl0KCIuIilbMV18fCIiKS5sZW5ndGgscj0odC50b1N0cmluZygpLnNwbGl0KCIuIilbMV18fCIiKS5sZW5ndGgsaT1uPnI/bjpyLG89cGFyc2VJbnQoZS50b0ZpeGVkKGkpLnJlcGxhY2UoIi4iLCIiKSksbD1wYXJzZUludCh0LnRvRml4ZWQoaSkucmVwbGFjZSgiLiIsIiIpKTtyZXR1cm4gbyVsL01hdGgucG93KDEwLGkpfWNsYXNzIGFvIGV4dGVuZHMgQ2V7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMubWluPXRoaXMuZ3RlLHRoaXMubWF4PXRoaXMubHRlLHRoaXMuc3RlcD10aGlzLm11bHRpcGxlT2Z9X3BhcnNlKHQpe2lmKHRoaXMuX2RlZi5jb2VyY2UmJih0LmRhdGE9TnVtYmVyKHQuZGF0YSkpLHRoaXMuX2dldFR5cGUodCkhPT1RLm51bWJlcil7Y29uc3Qgbz10aGlzLl9nZXRPclJldHVybkN0eCh0KTtyZXR1cm4gcShvLHtjb2RlOlcuaW52YWxpZF90eXBlLGV4cGVjdGVkOlEubnVtYmVyLHJlY2VpdmVkOm8ucGFyc2VkVHlwZX0pLGdlfWxldCByO2NvbnN0IGk9bmV3IG9uO2Zvcihjb25zdCBvIG9mIHRoaXMuX2RlZi5jaGVja3Mpby5raW5kPT09ImludCI/TGUuaXNJbnRlZ2VyKHQuZGF0YSl8fChyPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQscikscShyLHtjb2RlOlcuaW52YWxpZF90eXBlLGV4cGVjdGVkOiJpbnRlZ2VyIixyZWNlaXZlZDoiZmxvYXQiLG1lc3NhZ2U6by5tZXNzYWdlfSksaS5kaXJ0eSgpKTpvLmtpbmQ9PT0ibWluIj8oby5pbmNsdXNpdmU/dC5kYXRhPG8udmFsdWU6dC5kYXRhPD1vLnZhbHVlKSYmKHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxyKSxxKHIse2NvZGU6Vy50b29fc21hbGwsbWluaW11bTpvLnZhbHVlLHR5cGU6Im51bWJlciIsaW5jbHVzaXZlOm8uaW5jbHVzaXZlLGV4YWN0OiExLG1lc3NhZ2U6by5tZXNzYWdlfSksaS5kaXJ0eSgpKTpvLmtpbmQ9PT0ibWF4Ij8oby5pbmNsdXNpdmU/dC5kYXRhPm8udmFsdWU6dC5kYXRhPj1vLnZhbHVlKSYmKHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxyKSxxKHIse2NvZGU6Vy50b29fYmlnLG1heGltdW06by52YWx1ZSx0eXBlOiJudW1iZXIiLGluY2x1c2l2ZTpvLmluY2x1c2l2ZSxleGFjdDohMSxtZXNzYWdlOm8ubWVzc2FnZX0pLGkuZGlydHkoKSk6by5raW5kPT09Im11bHRpcGxlT2YiP2s1KHQuZGF0YSxvLnZhbHVlKSE9PTAmJihyPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQscikscShyLHtjb2RlOlcubm90X211bHRpcGxlX29mLG11bHRpcGxlT2Y6by52YWx1ZSxtZXNzYWdlOm8ubWVzc2FnZX0pLGkuZGlydHkoKSk6by5raW5kPT09ImZpbml0ZSI/TnVtYmVyLmlzRmluaXRlKHQuZGF0YSl8fChyPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQscikscShyLHtjb2RlOlcubm90X2Zpbml0ZSxtZXNzYWdlOm8ubWVzc2FnZX0pLGkuZGlydHkoKSk6TGUuYXNzZXJ0TmV2ZXIobyk7cmV0dXJue3N0YXR1czppLnZhbHVlLHZhbHVlOnQuZGF0YX19Z3RlKHQsbil7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1pbiIsdCwhMCxjZS50b1N0cmluZyhuKSl9Z3QodCxuKXtyZXR1cm4gdGhpcy5zZXRMaW1pdCgibWluIix0LCExLGNlLnRvU3RyaW5nKG4pKX1sdGUodCxuKXtyZXR1cm4gdGhpcy5zZXRMaW1pdCgibWF4Iix0LCEwLGNlLnRvU3RyaW5nKG4pKX1sdCh0LG4pe3JldHVybiB0aGlzLnNldExpbWl0KCJtYXgiLHQsITEsY2UudG9TdHJpbmcobikpfXNldExpbWl0KHQsbixyLGkpe3JldHVybiBuZXcgYW8oey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3Mse2tpbmQ6dCx2YWx1ZTpuLGluY2x1c2l2ZTpyLG1lc3NhZ2U6Y2UudG9TdHJpbmcoaSl9XX0pfV9hZGRDaGVjayh0KXtyZXR1cm4gbmV3IGFvKHsuLi50aGlzLl9kZWYsY2hlY2tzOlsuLi50aGlzLl9kZWYuY2hlY2tzLHRdfSl9aW50KHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoiaW50IixtZXNzYWdlOmNlLnRvU3RyaW5nKHQpfSl9cG9zaXRpdmUodCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtaW4iLHZhbHVlOjAsaW5jbHVzaXZlOiExLG1lc3NhZ2U6Y2UudG9TdHJpbmcodCl9KX1uZWdhdGl2ZSh0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1heCIsdmFsdWU6MCxpbmNsdXNpdmU6ITEsbWVzc2FnZTpjZS50b1N0cmluZyh0KX0pfW5vbnBvc2l0aXZlKHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWF4Iix2YWx1ZTowLGluY2x1c2l2ZTohMCxtZXNzYWdlOmNlLnRvU3RyaW5nKHQpfSl9bm9ubmVnYXRpdmUodCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtaW4iLHZhbHVlOjAsaW5jbHVzaXZlOiEwLG1lc3NhZ2U6Y2UudG9TdHJpbmcodCl9KX1tdWx0aXBsZU9mKHQsbil7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtdWx0aXBsZU9mIix2YWx1ZTp0LG1lc3NhZ2U6Y2UudG9TdHJpbmcobil9KX1maW5pdGUodCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJmaW5pdGUiLG1lc3NhZ2U6Y2UudG9TdHJpbmcodCl9KX1zYWZlKHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIixpbmNsdXNpdmU6ITAsdmFsdWU6TnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIsbWVzc2FnZTpjZS50b1N0cmluZyh0KX0pLl9hZGRDaGVjayh7a2luZDoibWF4IixpbmNsdXNpdmU6ITAsdmFsdWU6TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsbWVzc2FnZTpjZS50b1N0cmluZyh0KX0pfWdldCBtaW5WYWx1ZSgpe2xldCB0PW51bGw7Zm9yKGNvbnN0IG4gb2YgdGhpcy5fZGVmLmNoZWNrcyluLmtpbmQ9PT0ibWluIiYmKHQ9PT1udWxsfHxuLnZhbHVlPnQpJiYodD1uLnZhbHVlKTtyZXR1cm4gdH1nZXQgbWF4VmFsdWUoKXtsZXQgdD1udWxsO2Zvcihjb25zdCBuIG9mIHRoaXMuX2RlZi5jaGVja3Mpbi5raW5kPT09Im1heCImJih0PT09bnVsbHx8bi52YWx1ZTx0KSYmKHQ9bi52YWx1ZSk7cmV0dXJuIHR9Z2V0IGlzSW50KCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQodD0+dC5raW5kPT09ImludCJ8fHQua2luZD09PSJtdWx0aXBsZU9mIiYmTGUuaXNJbnRlZ2VyKHQudmFsdWUpKX1nZXQgaXNGaW5pdGUoKXtsZXQgdD1udWxsLG49bnVsbDtmb3IoY29uc3QgciBvZiB0aGlzLl9kZWYuY2hlY2tzKXtpZihyLmtpbmQ9PT0iZmluaXRlInx8ci5raW5kPT09ImludCJ8fHIua2luZD09PSJtdWx0aXBsZU9mIilyZXR1cm4hMDtyLmtpbmQ9PT0ibWluIj8obj09PW51bGx8fHIudmFsdWU+bikmJihuPXIudmFsdWUpOnIua2luZD09PSJtYXgiJiYodD09PW51bGx8fHIudmFsdWU8dCkmJih0PXIudmFsdWUpfXJldHVybiBOdW1iZXIuaXNGaW5pdGUobikmJk51bWJlci5pc0Zpbml0ZSh0KX19YW8uY3JlYXRlPWU9Pm5ldyBhbyh7Y2hlY2tzOltdLHR5cGVOYW1lOmRlLlpvZE51bWJlcixjb2VyY2U6KGU9PW51bGw/dm9pZCAwOmUuY29lcmNlKXx8ITEsLi4ud2UoZSl9KTtjbGFzcyB1byBleHRlbmRzIENle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLm1pbj10aGlzLmd0ZSx0aGlzLm1heD10aGlzLmx0ZX1fcGFyc2UodCl7aWYodGhpcy5fZGVmLmNvZXJjZSYmKHQuZGF0YT1CaWdJbnQodC5kYXRhKSksdGhpcy5fZ2V0VHlwZSh0KSE9PVEuYmlnaW50KXtjb25zdCBvPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQpO3JldHVybiBxKG8se2NvZGU6Vy5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6US5iaWdpbnQscmVjZWl2ZWQ6by5wYXJzZWRUeXBlfSksZ2V9bGV0IHI7Y29uc3QgaT1uZXcgb247Zm9yKGNvbnN0IG8gb2YgdGhpcy5fZGVmLmNoZWNrcylvLmtpbmQ9PT0ibWluIj8oby5pbmNsdXNpdmU/dC5kYXRhPG8udmFsdWU6dC5kYXRhPD1vLnZhbHVlKSYmKHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxyKSxxKHIse2NvZGU6Vy50b29fc21hbGwsdHlwZToiYmlnaW50IixtaW5pbXVtOm8udmFsdWUsaW5jbHVzaXZlOm8uaW5jbHVzaXZlLG1lc3NhZ2U6by5tZXNzYWdlfSksaS5kaXJ0eSgpKTpvLmtpbmQ9PT0ibWF4Ij8oby5pbmNsdXNpdmU/dC5kYXRhPm8udmFsdWU6dC5kYXRhPj1vLnZhbHVlKSYmKHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxyKSxxKHIse2NvZGU6Vy50b29fYmlnLHR5cGU6ImJpZ2ludCIsbWF4aW11bTpvLnZhbHVlLGluY2x1c2l2ZTpvLmluY2x1c2l2ZSxtZXNzYWdlOm8ubWVzc2FnZX0pLGkuZGlydHkoKSk6by5raW5kPT09Im11bHRpcGxlT2YiP3QuZGF0YSVvLnZhbHVlIT09QmlnSW50KDApJiYocj10aGlzLl9nZXRPclJldHVybkN0eCh0LHIpLHEocix7Y29kZTpXLm5vdF9tdWx0aXBsZV9vZixtdWx0aXBsZU9mOm8udmFsdWUsbWVzc2FnZTpvLm1lc3NhZ2V9KSxpLmRpcnR5KCkpOkxlLmFzc2VydE5ldmVyKG8pO3JldHVybntzdGF0dXM6aS52YWx1ZSx2YWx1ZTp0LmRhdGF9fWd0ZSh0LG4pe3JldHVybiB0aGlzLnNldExpbWl0KCJtaW4iLHQsITAsY2UudG9TdHJpbmcobikpfWd0KHQsbil7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1pbiIsdCwhMSxjZS50b1N0cmluZyhuKSl9bHRlKHQsbil7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1heCIsdCwhMCxjZS50b1N0cmluZyhuKSl9bHQodCxuKXtyZXR1cm4gdGhpcy5zZXRMaW1pdCgibWF4Iix0LCExLGNlLnRvU3RyaW5nKG4pKX1zZXRMaW1pdCh0LG4scixpKXtyZXR1cm4gbmV3IHVvKHsuLi50aGlzLl9kZWYsY2hlY2tzOlsuLi50aGlzLl9kZWYuY2hlY2tzLHtraW5kOnQsdmFsdWU6bixpbmNsdXNpdmU6cixtZXNzYWdlOmNlLnRvU3RyaW5nKGkpfV19KX1fYWRkQ2hlY2sodCl7cmV0dXJuIG5ldyB1byh7Li4udGhpcy5fZGVmLGNoZWNrczpbLi4udGhpcy5fZGVmLmNoZWNrcyx0XX0pfXBvc2l0aXZlKHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTpCaWdJbnQoMCksaW5jbHVzaXZlOiExLG1lc3NhZ2U6Y2UudG9TdHJpbmcodCl9KX1uZWdhdGl2ZSh0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1heCIsdmFsdWU6QmlnSW50KDApLGluY2x1c2l2ZTohMSxtZXNzYWdlOmNlLnRvU3RyaW5nKHQpfSl9bm9ucG9zaXRpdmUodCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtYXgiLHZhbHVlOkJpZ0ludCgwKSxpbmNsdXNpdmU6ITAsbWVzc2FnZTpjZS50b1N0cmluZyh0KX0pfW5vbm5lZ2F0aXZlKHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTpCaWdJbnQoMCksaW5jbHVzaXZlOiEwLG1lc3NhZ2U6Y2UudG9TdHJpbmcodCl9KX1tdWx0aXBsZU9mKHQsbil7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtdWx0aXBsZU9mIix2YWx1ZTp0LG1lc3NhZ2U6Y2UudG9TdHJpbmcobil9KX1nZXQgbWluVmFsdWUoKXtsZXQgdD1udWxsO2Zvcihjb25zdCBuIG9mIHRoaXMuX2RlZi5jaGVja3Mpbi5raW5kPT09Im1pbiImJih0PT09bnVsbHx8bi52YWx1ZT50KSYmKHQ9bi52YWx1ZSk7cmV0dXJuIHR9Z2V0IG1heFZhbHVlKCl7bGV0IHQ9bnVsbDtmb3IoY29uc3QgbiBvZiB0aGlzLl9kZWYuY2hlY2tzKW4ua2luZD09PSJtYXgiJiYodD09PW51bGx8fG4udmFsdWU8dCkmJih0PW4udmFsdWUpO3JldHVybiB0fX11by5jcmVhdGU9ZT0+e3ZhciB0O3JldHVybiBuZXcgdW8oe2NoZWNrczpbXSx0eXBlTmFtZTpkZS5ab2RCaWdJbnQsY29lcmNlOih0PWU9PW51bGw/dm9pZCAwOmUuY29lcmNlKSE9PW51bGwmJnQhPT12b2lkIDA/dDohMSwuLi53ZShlKX0pfTtjbGFzcyBodSBleHRlbmRzIENle19wYXJzZSh0KXtpZih0aGlzLl9kZWYuY29lcmNlJiYodC5kYXRhPSEhdC5kYXRhKSx0aGlzLl9nZXRUeXBlKHQpIT09US5ib29sZWFuKXtjb25zdCByPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQpO3JldHVybiBxKHIse2NvZGU6Vy5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6US5ib29sZWFuLHJlY2VpdmVkOnIucGFyc2VkVHlwZX0pLGdlfXJldHVybiB5bih0LmRhdGEpfX1odS5jcmVhdGU9ZT0+bmV3IGh1KHt0eXBlTmFtZTpkZS5ab2RCb29sZWFuLGNvZXJjZTooZT09bnVsbD92b2lkIDA6ZS5jb2VyY2UpfHwhMSwuLi53ZShlKX0pO2NsYXNzIHFvIGV4dGVuZHMgQ2V7X3BhcnNlKHQpe2lmKHRoaXMuX2RlZi5jb2VyY2UmJih0LmRhdGE9bmV3IERhdGUodC5kYXRhKSksdGhpcy5fZ2V0VHlwZSh0KSE9PVEuZGF0ZSl7Y29uc3Qgbz10aGlzLl9nZXRPclJldHVybkN0eCh0KTtyZXR1cm4gcShvLHtjb2RlOlcuaW52YWxpZF90eXBlLGV4cGVjdGVkOlEuZGF0ZSxyZWNlaXZlZDpvLnBhcnNlZFR5cGV9KSxnZX1pZihpc05hTih0LmRhdGEuZ2V0VGltZSgpKSl7Y29uc3Qgbz10aGlzLl9nZXRPclJldHVybkN0eCh0KTtyZXR1cm4gcShvLHtjb2RlOlcuaW52YWxpZF9kYXRlfSksZ2V9Y29uc3Qgcj1uZXcgb247bGV0IGk7Zm9yKGNvbnN0IG8gb2YgdGhpcy5fZGVmLmNoZWNrcylvLmtpbmQ9PT0ibWluIj90LmRhdGEuZ2V0VGltZSgpPG8udmFsdWUmJihpPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQsaSkscShpLHtjb2RlOlcudG9vX3NtYWxsLG1lc3NhZ2U6by5tZXNzYWdlLGluY2x1c2l2ZTohMCxleGFjdDohMSxtaW5pbXVtOm8udmFsdWUsdHlwZToiZGF0ZSJ9KSxyLmRpcnR5KCkpOm8ua2luZD09PSJtYXgiP3QuZGF0YS5nZXRUaW1lKCk+by52YWx1ZSYmKGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCxpKSxxKGkse2NvZGU6Vy50b29fYmlnLG1lc3NhZ2U6by5tZXNzYWdlLGluY2x1c2l2ZTohMCxleGFjdDohMSxtYXhpbXVtOm8udmFsdWUsdHlwZToiZGF0ZSJ9KSxyLmRpcnR5KCkpOkxlLmFzc2VydE5ldmVyKG8pO3JldHVybntzdGF0dXM6ci52YWx1ZSx2YWx1ZTpuZXcgRGF0ZSh0LmRhdGEuZ2V0VGltZSgpKX19X2FkZENoZWNrKHQpe3JldHVybiBuZXcgcW8oey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3MsdF19KX1taW4odCxuKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1pbiIsdmFsdWU6dC5nZXRUaW1lKCksbWVzc2FnZTpjZS50b1N0cmluZyhuKX0pfW1heCh0LG4pe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWF4Iix2YWx1ZTp0LmdldFRpbWUoKSxtZXNzYWdlOmNlLnRvU3RyaW5nKG4pfSl9Z2V0IG1pbkRhdGUoKXtsZXQgdD1udWxsO2Zvcihjb25zdCBuIG9mIHRoaXMuX2RlZi5jaGVja3Mpbi5raW5kPT09Im1pbiImJih0PT09bnVsbHx8bi52YWx1ZT50KSYmKHQ9bi52YWx1ZSk7cmV0dXJuIHQhPW51bGw/bmV3IERhdGUodCk6bnVsbH1nZXQgbWF4RGF0ZSgpe2xldCB0PW51bGw7Zm9yKGNvbnN0IG4gb2YgdGhpcy5fZGVmLmNoZWNrcyluLmtpbmQ9PT0ibWF4IiYmKHQ9PT1udWxsfHxuLnZhbHVlPHQpJiYodD1uLnZhbHVlKTtyZXR1cm4gdCE9bnVsbD9uZXcgRGF0ZSh0KTpudWxsfX1xby5jcmVhdGU9ZT0+bmV3IHFvKHtjaGVja3M6W10sY29lcmNlOihlPT1udWxsP3ZvaWQgMDplLmNvZXJjZSl8fCExLHR5cGVOYW1lOmRlLlpvZERhdGUsLi4ud2UoZSl9KTtjbGFzcyBXZCBleHRlbmRzIENle19wYXJzZSh0KXtpZih0aGlzLl9nZXRUeXBlKHQpIT09US5zeW1ib2wpe2NvbnN0IHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCk7cmV0dXJuIHEocix7Y29kZTpXLmludmFsaWRfdHlwZSxleHBlY3RlZDpRLnN5bWJvbCxyZWNlaXZlZDpyLnBhcnNlZFR5cGV9KSxnZX1yZXR1cm4geW4odC5kYXRhKX19V2QuY3JlYXRlPWU9Pm5ldyBXZCh7dHlwZU5hbWU6ZGUuWm9kU3ltYm9sLC4uLndlKGUpfSk7Y2xhc3MgcHUgZXh0ZW5kcyBDZXtfcGFyc2UodCl7aWYodGhpcy5fZ2V0VHlwZSh0KSE9PVEudW5kZWZpbmVkKXtjb25zdCByPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQpO3JldHVybiBxKHIse2NvZGU6Vy5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6US51bmRlZmluZWQscmVjZWl2ZWQ6ci5wYXJzZWRUeXBlfSksZ2V9cmV0dXJuIHluKHQuZGF0YSl9fXB1LmNyZWF0ZT1lPT5uZXcgcHUoe3R5cGVOYW1lOmRlLlpvZFVuZGVmaW5lZCwuLi53ZShlKX0pO2NsYXNzIG11IGV4dGVuZHMgQ2V7X3BhcnNlKHQpe2lmKHRoaXMuX2dldFR5cGUodCkhPT1RLm51bGwpe2NvbnN0IHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCk7cmV0dXJuIHEocix7Y29kZTpXLmludmFsaWRfdHlwZSxleHBlY3RlZDpRLm51bGwscmVjZWl2ZWQ6ci5wYXJzZWRUeXBlfSksZ2V9cmV0dXJuIHluKHQuZGF0YSl9fW11LmNyZWF0ZT1lPT5uZXcgbXUoe3R5cGVOYW1lOmRlLlpvZE51bGwsLi4ud2UoZSl9KTtjbGFzcyBocyBleHRlbmRzIENle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9hbnk9ITB9X3BhcnNlKHQpe3JldHVybiB5bih0LmRhdGEpfX1ocy5jcmVhdGU9ZT0+bmV3IGhzKHt0eXBlTmFtZTpkZS5ab2RBbnksLi4ud2UoZSl9KTtjbGFzcyBVbyBleHRlbmRzIENle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl91bmtub3duPSEwfV9wYXJzZSh0KXtyZXR1cm4geW4odC5kYXRhKX19VW8uY3JlYXRlPWU9Pm5ldyBVbyh7dHlwZU5hbWU6ZGUuWm9kVW5rbm93biwuLi53ZShlKX0pO2NsYXNzIG1pIGV4dGVuZHMgQ2V7X3BhcnNlKHQpe2NvbnN0IG49dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCk7cmV0dXJuIHEobix7Y29kZTpXLmludmFsaWRfdHlwZSxleHBlY3RlZDpRLm5ldmVyLHJlY2VpdmVkOm4ucGFyc2VkVHlwZX0pLGdlfX1taS5jcmVhdGU9ZT0+bmV3IG1pKHt0eXBlTmFtZTpkZS5ab2ROZXZlciwuLi53ZShlKX0pO2NsYXNzIFZkIGV4dGVuZHMgQ2V7X3BhcnNlKHQpe2lmKHRoaXMuX2dldFR5cGUodCkhPT1RLnVuZGVmaW5lZCl7Y29uc3Qgcj10aGlzLl9nZXRPclJldHVybkN0eCh0KTtyZXR1cm4gcShyLHtjb2RlOlcuaW52YWxpZF90eXBlLGV4cGVjdGVkOlEudm9pZCxyZWNlaXZlZDpyLnBhcnNlZFR5cGV9KSxnZX1yZXR1cm4geW4odC5kYXRhKX19VmQuY3JlYXRlPWU9Pm5ldyBWZCh7dHlwZU5hbWU6ZGUuWm9kVm9pZCwuLi53ZShlKX0pO2NsYXNzIENyIGV4dGVuZHMgQ2V7X3BhcnNlKHQpe2NvbnN0e2N0eDpuLHN0YXR1czpyfT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXModCksaT10aGlzLl9kZWY7aWYobi5wYXJzZWRUeXBlIT09US5hcnJheSlyZXR1cm4gcShuLHtjb2RlOlcuaW52YWxpZF90eXBlLGV4cGVjdGVkOlEuYXJyYXkscmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSksZ2U7aWYoaS5leGFjdExlbmd0aCE9PW51bGwpe2NvbnN0IGw9bi5kYXRhLmxlbmd0aD5pLmV4YWN0TGVuZ3RoLnZhbHVlLHM9bi5kYXRhLmxlbmd0aDxpLmV4YWN0TGVuZ3RoLnZhbHVlOyhsfHxzKSYmKHEobix7Y29kZTpsP1cudG9vX2JpZzpXLnRvb19zbWFsbCxtaW5pbXVtOnM/aS5leGFjdExlbmd0aC52YWx1ZTp2b2lkIDAsbWF4aW11bTpsP2kuZXhhY3RMZW5ndGgudmFsdWU6dm9pZCAwLHR5cGU6ImFycmF5IixpbmNsdXNpdmU6ITAsZXhhY3Q6ITAsbWVzc2FnZTppLmV4YWN0TGVuZ3RoLm1lc3NhZ2V9KSxyLmRpcnR5KCkpfWlmKGkubWluTGVuZ3RoIT09bnVsbCYmbi5kYXRhLmxlbmd0aDxpLm1pbkxlbmd0aC52YWx1ZSYmKHEobix7Y29kZTpXLnRvb19zbWFsbCxtaW5pbXVtOmkubWluTGVuZ3RoLnZhbHVlLHR5cGU6ImFycmF5IixpbmNsdXNpdmU6ITAsZXhhY3Q6ITEsbWVzc2FnZTppLm1pbkxlbmd0aC5tZXNzYWdlfSksci5kaXJ0eSgpKSxpLm1heExlbmd0aCE9PW51bGwmJm4uZGF0YS5sZW5ndGg+aS5tYXhMZW5ndGgudmFsdWUmJihxKG4se2NvZGU6Vy50b29fYmlnLG1heGltdW06aS5tYXhMZW5ndGgudmFsdWUsdHlwZToiYXJyYXkiLGluY2x1c2l2ZTohMCxleGFjdDohMSxtZXNzYWdlOmkubWF4TGVuZ3RoLm1lc3NhZ2V9KSxyLmRpcnR5KCkpLG4uY29tbW9uLmFzeW5jKXJldHVybiBQcm9taXNlLmFsbChbLi4ubi5kYXRhXS5tYXAoKGwscyk9PmkudHlwZS5fcGFyc2VBc3luYyhuZXcgSHIobixsLG4ucGF0aCxzKSkpKS50aGVuKGw9Pm9uLm1lcmdlQXJyYXkocixsKSk7Y29uc3Qgbz1bLi4ubi5kYXRhXS5tYXAoKGwscyk9PmkudHlwZS5fcGFyc2VTeW5jKG5ldyBIcihuLGwsbi5wYXRoLHMpKSk7cmV0dXJuIG9uLm1lcmdlQXJyYXkocixvKX1nZXQgZWxlbWVudCgpe3JldHVybiB0aGlzLl9kZWYudHlwZX1taW4odCxuKXtyZXR1cm4gbmV3IENyKHsuLi50aGlzLl9kZWYsbWluTGVuZ3RoOnt2YWx1ZTp0LG1lc3NhZ2U6Y2UudG9TdHJpbmcobil9fSl9bWF4KHQsbil7cmV0dXJuIG5ldyBDcih7Li4udGhpcy5fZGVmLG1heExlbmd0aDp7dmFsdWU6dCxtZXNzYWdlOmNlLnRvU3RyaW5nKG4pfX0pfWxlbmd0aCh0LG4pe3JldHVybiBuZXcgQ3Ioey4uLnRoaXMuX2RlZixleGFjdExlbmd0aDp7dmFsdWU6dCxtZXNzYWdlOmNlLnRvU3RyaW5nKG4pfX0pfW5vbmVtcHR5KHQpe3JldHVybiB0aGlzLm1pbigxLHQpfX1Dci5jcmVhdGU9KGUsdCk9Pm5ldyBDcih7dHlwZTplLG1pbkxlbmd0aDpudWxsLG1heExlbmd0aDpudWxsLGV4YWN0TGVuZ3RoOm51bGwsdHlwZU5hbWU6ZGUuWm9kQXJyYXksLi4ud2UodCl9KTtmdW5jdGlvbiAkbChlKXtpZihlIGluc3RhbmNlb2YgY3Qpe2NvbnN0IHQ9e307Zm9yKGNvbnN0IG4gaW4gZS5zaGFwZSl7Y29uc3Qgcj1lLnNoYXBlW25dO3Rbbl09Y2kuY3JlYXRlKCRsKHIpKX1yZXR1cm4gbmV3IGN0KHsuLi5lLl9kZWYsc2hhcGU6KCk9PnR9KX1lbHNlIHJldHVybiBlIGluc3RhbmNlb2YgQ3I/bmV3IENyKHsuLi5lLl9kZWYsdHlwZTokbChlLmVsZW1lbnQpfSk6ZSBpbnN0YW5jZW9mIGNpP2NpLmNyZWF0ZSgkbChlLnVud3JhcCgpKSk6ZSBpbnN0YW5jZW9mIHRsP3RsLmNyZWF0ZSgkbChlLnVud3JhcCgpKSk6ZSBpbnN0YW5jZW9mIEtyP0tyLmNyZWF0ZShlLml0ZW1zLm1hcCh0PT4kbCh0KSkpOmV9Y2xhc3MgY3QgZXh0ZW5kcyBDZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fY2FjaGVkPW51bGwsdGhpcy5ub25zdHJpY3Q9dGhpcy5wYXNzdGhyb3VnaCx0aGlzLmF1Z21lbnQ9dGhpcy5leHRlbmR9X2dldENhY2hlZCgpe2lmKHRoaXMuX2NhY2hlZCE9PW51bGwpcmV0dXJuIHRoaXMuX2NhY2hlZDtjb25zdCB0PXRoaXMuX2RlZi5zaGFwZSgpLG49TGUub2JqZWN0S2V5cyh0KTtyZXR1cm4gdGhpcy5fY2FjaGVkPXtzaGFwZTp0LGtleXM6bn19X3BhcnNlKHQpe2lmKHRoaXMuX2dldFR5cGUodCkhPT1RLm9iamVjdCl7Y29uc3QgdT10aGlzLl9nZXRPclJldHVybkN0eCh0KTtyZXR1cm4gcSh1LHtjb2RlOlcuaW52YWxpZF90eXBlLGV4cGVjdGVkOlEub2JqZWN0LHJlY2VpdmVkOnUucGFyc2VkVHlwZX0pLGdlfWNvbnN0e3N0YXR1czpyLGN0eDppfT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXModCkse3NoYXBlOm8sa2V5czpsfT10aGlzLl9nZXRDYWNoZWQoKSxzPVtdO2lmKCEodGhpcy5fZGVmLmNhdGNoYWxsIGluc3RhbmNlb2YgbWkmJnRoaXMuX2RlZi51bmtub3duS2V5cz09PSJzdHJpcCIpKWZvcihjb25zdCB1IGluIGkuZGF0YSlsLmluY2x1ZGVzKHUpfHxzLnB1c2godSk7Y29uc3QgYT1bXTtmb3IoY29uc3QgdSBvZiBsKXtjb25zdCBjPW9bdV0sZD1pLmRhdGFbdV07YS5wdXNoKHtrZXk6e3N0YXR1czoidmFsaWQiLHZhbHVlOnV9LHZhbHVlOmMuX3BhcnNlKG5ldyBIcihpLGQsaS5wYXRoLHUpKSxhbHdheXNTZXQ6dSBpbiBpLmRhdGF9KX1pZih0aGlzLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiBtaSl7Y29uc3QgdT10aGlzLl9kZWYudW5rbm93bktleXM7aWYodT09PSJwYXNzdGhyb3VnaCIpZm9yKGNvbnN0IGMgb2YgcylhLnB1c2goe2tleTp7c3RhdHVzOiJ2YWxpZCIsdmFsdWU6Y30sdmFsdWU6e3N0YXR1czoidmFsaWQiLHZhbHVlOmkuZGF0YVtjXX19KTtlbHNlIGlmKHU9PT0ic3RyaWN0IilzLmxlbmd0aD4wJiYocShpLHtjb2RlOlcudW5yZWNvZ25pemVkX2tleXMsa2V5czpzfSksci5kaXJ0eSgpKTtlbHNlIGlmKHUhPT0ic3RyaXAiKXRocm93IG5ldyBFcnJvcigiSW50ZXJuYWwgWm9kT2JqZWN0IGVycm9yOiBpbnZhbGlkIHVua25vd25LZXlzIHZhbHVlLiIpfWVsc2V7Y29uc3QgdT10aGlzLl9kZWYuY2F0Y2hhbGw7Zm9yKGNvbnN0IGMgb2Ygcyl7Y29uc3QgZD1pLmRhdGFbY107YS5wdXNoKHtrZXk6e3N0YXR1czoidmFsaWQiLHZhbHVlOmN9LHZhbHVlOnUuX3BhcnNlKG5ldyBIcihpLGQsaS5wYXRoLGMpKSxhbHdheXNTZXQ6YyBpbiBpLmRhdGF9KX19cmV0dXJuIGkuY29tbW9uLmFzeW5jP1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oYXN5bmMoKT0+e2NvbnN0IHU9W107Zm9yKGNvbnN0IGMgb2YgYSl7Y29uc3QgZD1hd2FpdCBjLmtleTt1LnB1c2goe2tleTpkLHZhbHVlOmF3YWl0IGMudmFsdWUsYWx3YXlzU2V0OmMuYWx3YXlzU2V0fSl9cmV0dXJuIHV9KS50aGVuKHU9Pm9uLm1lcmdlT2JqZWN0U3luYyhyLHUpKTpvbi5tZXJnZU9iamVjdFN5bmMocixhKX1nZXQgc2hhcGUoKXtyZXR1cm4gdGhpcy5fZGVmLnNoYXBlKCl9c3RyaWN0KHQpe3JldHVybiBjZS5lcnJUb09iaixuZXcgY3Qoey4uLnRoaXMuX2RlZix1bmtub3duS2V5czoic3RyaWN0IiwuLi50IT09dm9pZCAwP3tlcnJvck1hcDoobixyKT0+e3ZhciBpLG8sbCxzO2NvbnN0IGE9KGw9KG89KGk9dGhpcy5fZGVmKS5lcnJvck1hcCk9PT1udWxsfHxvPT09dm9pZCAwP3ZvaWQgMDpvLmNhbGwoaSxuLHIpLm1lc3NhZ2UpIT09bnVsbCYmbCE9PXZvaWQgMD9sOnIuZGVmYXVsdEVycm9yO3JldHVybiBuLmNvZGU9PT0idW5yZWNvZ25pemVkX2tleXMiP3ttZXNzYWdlOihzPWNlLmVyclRvT2JqKHQpLm1lc3NhZ2UpIT09bnVsbCYmcyE9PXZvaWQgMD9zOmF9OnttZXNzYWdlOmF9fX06e319KX1zdHJpcCgpe3JldHVybiBuZXcgY3Qoey4uLnRoaXMuX2RlZix1bmtub3duS2V5czoic3RyaXAifSl9cGFzc3Rocm91Z2goKXtyZXR1cm4gbmV3IGN0KHsuLi50aGlzLl9kZWYsdW5rbm93bktleXM6InBhc3N0aHJvdWdoIn0pfWV4dGVuZCh0KXtyZXR1cm4gbmV3IGN0KHsuLi50aGlzLl9kZWYsc2hhcGU6KCk9Pih7Li4udGhpcy5fZGVmLnNoYXBlKCksLi4udH0pfSl9bWVyZ2UodCl7cmV0dXJuIG5ldyBjdCh7dW5rbm93bktleXM6dC5fZGVmLnVua25vd25LZXlzLGNhdGNoYWxsOnQuX2RlZi5jYXRjaGFsbCxzaGFwZTooKT0+KHsuLi50aGlzLl9kZWYuc2hhcGUoKSwuLi50Ll9kZWYuc2hhcGUoKX0pLHR5cGVOYW1lOmRlLlpvZE9iamVjdH0pfXNldEtleSh0LG4pe3JldHVybiB0aGlzLmF1Z21lbnQoe1t0XTpufSl9Y2F0Y2hhbGwodCl7cmV0dXJuIG5ldyBjdCh7Li4udGhpcy5fZGVmLGNhdGNoYWxsOnR9KX1waWNrKHQpe2NvbnN0IG49e307cmV0dXJuIExlLm9iamVjdEtleXModCkuZm9yRWFjaChyPT57dFtyXSYmdGhpcy5zaGFwZVtyXSYmKG5bcl09dGhpcy5zaGFwZVtyXSl9KSxuZXcgY3Qoey4uLnRoaXMuX2RlZixzaGFwZTooKT0+bn0pfW9taXQodCl7Y29uc3Qgbj17fTtyZXR1cm4gTGUub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKHI9Pnt0W3JdfHwobltyXT10aGlzLnNoYXBlW3JdKX0pLG5ldyBjdCh7Li4udGhpcy5fZGVmLHNoYXBlOigpPT5ufSl9ZGVlcFBhcnRpYWwoKXtyZXR1cm4gJGwodGhpcyl9cGFydGlhbCh0KXtjb25zdCBuPXt9O3JldHVybiBMZS5vYmplY3RLZXlzKHRoaXMuc2hhcGUpLmZvckVhY2gocj0+e2NvbnN0IGk9dGhpcy5zaGFwZVtyXTt0JiYhdFtyXT9uW3JdPWk6bltyXT1pLm9wdGlvbmFsKCl9KSxuZXcgY3Qoey4uLnRoaXMuX2RlZixzaGFwZTooKT0+bn0pfXJlcXVpcmVkKHQpe2NvbnN0IG49e307cmV0dXJuIExlLm9iamVjdEtleXModGhpcy5zaGFwZSkuZm9yRWFjaChyPT57aWYodCYmIXRbcl0pbltyXT10aGlzLnNoYXBlW3JdO2Vsc2V7bGV0IG89dGhpcy5zaGFwZVtyXTtmb3IoO28gaW5zdGFuY2VvZiBjaTspbz1vLl9kZWYuaW5uZXJUeXBlO25bcl09b319KSxuZXcgY3Qoey4uLnRoaXMuX2RlZixzaGFwZTooKT0+bn0pfWtleW9mKCl7cmV0dXJuIFRDKExlLm9iamVjdEtleXModGhpcy5zaGFwZSkpfX1jdC5jcmVhdGU9KGUsdCk9Pm5ldyBjdCh7c2hhcGU6KCk9PmUsdW5rbm93bktleXM6InN0cmlwIixjYXRjaGFsbDptaS5jcmVhdGUoKSx0eXBlTmFtZTpkZS5ab2RPYmplY3QsLi4ud2UodCl9KTtjdC5zdHJpY3RDcmVhdGU9KGUsdCk9Pm5ldyBjdCh7c2hhcGU6KCk9PmUsdW5rbm93bktleXM6InN0cmljdCIsY2F0Y2hhbGw6bWkuY3JlYXRlKCksdHlwZU5hbWU6ZGUuWm9kT2JqZWN0LC4uLndlKHQpfSk7Y3QubGF6eWNyZWF0ZT0oZSx0KT0+bmV3IGN0KHtzaGFwZTplLHVua25vd25LZXlzOiJzdHJpcCIsY2F0Y2hhbGw6bWkuY3JlYXRlKCksdHlwZU5hbWU6ZGUuWm9kT2JqZWN0LC4uLndlKHQpfSk7Y2xhc3MgZ3UgZXh0ZW5kcyBDZXtfcGFyc2UodCl7Y29uc3R7Y3R4Om59PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyh0KSxyPXRoaXMuX2RlZi5vcHRpb25zO2Z1bmN0aW9uIGkobyl7Zm9yKGNvbnN0IHMgb2YgbylpZihzLnJlc3VsdC5zdGF0dXM9PT0idmFsaWQiKXJldHVybiBzLnJlc3VsdDtmb3IoY29uc3QgcyBvZiBvKWlmKHMucmVzdWx0LnN0YXR1cz09PSJkaXJ0eSIpcmV0dXJuIG4uY29tbW9uLmlzc3Vlcy5wdXNoKC4uLnMuY3R4LmNvbW1vbi5pc3N1ZXMpLHMucmVzdWx0O2NvbnN0IGw9by5tYXAocz0+bmV3IEVyKHMuY3R4LmNvbW1vbi5pc3N1ZXMpKTtyZXR1cm4gcShuLHtjb2RlOlcuaW52YWxpZF91bmlvbix1bmlvbkVycm9yczpsfSksZ2V9aWYobi5jb21tb24uYXN5bmMpcmV0dXJuIFByb21pc2UuYWxsKHIubWFwKGFzeW5jIG89Pntjb25zdCBsPXsuLi5uLGNvbW1vbjp7Li4ubi5jb21tb24saXNzdWVzOltdfSxwYXJlbnQ6bnVsbH07cmV0dXJue3Jlc3VsdDphd2FpdCBvLl9wYXJzZUFzeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bH0pLGN0eDpsfX0pKS50aGVuKGkpO3tsZXQgbztjb25zdCBsPVtdO2Zvcihjb25zdCBhIG9mIHIpe2NvbnN0IHU9ey4uLm4sY29tbW9uOnsuLi5uLmNvbW1vbixpc3N1ZXM6W119LHBhcmVudDpudWxsfSxjPWEuX3BhcnNlU3luYyh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50OnV9KTtpZihjLnN0YXR1cz09PSJ2YWxpZCIpcmV0dXJuIGM7Yy5zdGF0dXM9PT0iZGlydHkiJiYhbyYmKG89e3Jlc3VsdDpjLGN0eDp1fSksdS5jb21tb24uaXNzdWVzLmxlbmd0aCYmbC5wdXNoKHUuY29tbW9uLmlzc3Vlcyl9aWYobylyZXR1cm4gbi5jb21tb24uaXNzdWVzLnB1c2goLi4uby5jdHguY29tbW9uLmlzc3Vlcyksby5yZXN1bHQ7Y29uc3Qgcz1sLm1hcChhPT5uZXcgRXIoYSkpO3JldHVybiBxKG4se2NvZGU6Vy5pbnZhbGlkX3VuaW9uLHVuaW9uRXJyb3JzOnN9KSxnZX19Z2V0IG9wdGlvbnMoKXtyZXR1cm4gdGhpcy5fZGVmLm9wdGlvbnN9fWd1LmNyZWF0ZT0oZSx0KT0+bmV3IGd1KHtvcHRpb25zOmUsdHlwZU5hbWU6ZGUuWm9kVW5pb24sLi4ud2UodCl9KTtjb25zdCBIYz1lPT5lIGluc3RhbmNlb2YgeHU/SGMoZS5zY2hlbWEpOmUgaW5zdGFuY2VvZiBicj9IYyhlLmlubmVyVHlwZSgpKTplIGluc3RhbmNlb2YgX3U/W2UudmFsdWVdOmUgaW5zdGFuY2VvZiBjbz9lLm9wdGlvbnM6ZSBpbnN0YW5jZW9mIHd1P09iamVjdC5rZXlzKGUuZW51bSk6ZSBpbnN0YW5jZW9mIFN1P0hjKGUuX2RlZi5pbm5lclR5cGUpOmUgaW5zdGFuY2VvZiBwdT9bdm9pZCAwXTplIGluc3RhbmNlb2YgbXU/W251bGxdOm51bGw7Y2xhc3MgSWYgZXh0ZW5kcyBDZXtfcGFyc2UodCl7Y29uc3R7Y3R4Om59PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyh0KTtpZihuLnBhcnNlZFR5cGUhPT1RLm9iamVjdClyZXR1cm4gcShuLHtjb2RlOlcuaW52YWxpZF90eXBlLGV4cGVjdGVkOlEub2JqZWN0LHJlY2VpdmVkOm4ucGFyc2VkVHlwZX0pLGdlO2NvbnN0IHI9dGhpcy5kaXNjcmltaW5hdG9yLGk9bi5kYXRhW3JdLG89dGhpcy5vcHRpb25zTWFwLmdldChpKTtyZXR1cm4gbz9uLmNvbW1vbi5hc3luYz9vLl9wYXJzZUFzeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pOm8uX3BhcnNlU3luYyh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50Om59KToocShuLHtjb2RlOlcuaW52YWxpZF91bmlvbl9kaXNjcmltaW5hdG9yLG9wdGlvbnM6QXJyYXkuZnJvbSh0aGlzLm9wdGlvbnNNYXAua2V5cygpKSxwYXRoOltyXX0pLGdlKX1nZXQgZGlzY3JpbWluYXRvcigpe3JldHVybiB0aGlzLl9kZWYuZGlzY3JpbWluYXRvcn1nZXQgb3B0aW9ucygpe3JldHVybiB0aGlzLl9kZWYub3B0aW9uc31nZXQgb3B0aW9uc01hcCgpe3JldHVybiB0aGlzLl9kZWYub3B0aW9uc01hcH1zdGF0aWMgY3JlYXRlKHQsbixyKXtjb25zdCBpPW5ldyBNYXA7Zm9yKGNvbnN0IG8gb2Ygbil7Y29uc3QgbD1IYyhvLnNoYXBlW3RdKTtpZighbCl0aHJvdyBuZXcgRXJyb3IoYEEgZGlzY3JpbWluYXRvciB2YWx1ZSBmb3Iga2V5IFxgJHt0fVxgIGNvdWxkIG5vdCBiZSBleHRyYWN0ZWQgZnJvbSBhbGwgc2NoZW1hIG9wdGlvbnNgKTtmb3IoY29uc3QgcyBvZiBsKXtpZihpLmhhcyhzKSl0aHJvdyBuZXcgRXJyb3IoYERpc2NyaW1pbmF0b3IgcHJvcGVydHkgJHtTdHJpbmcodCl9IGhhcyBkdXBsaWNhdGUgdmFsdWUgJHtTdHJpbmcocyl9YCk7aS5zZXQocyxvKX19cmV0dXJuIG5ldyBJZih7dHlwZU5hbWU6ZGUuWm9kRGlzY3JpbWluYXRlZFVuaW9uLGRpc2NyaW1pbmF0b3I6dCxvcHRpb25zOm4sb3B0aW9uc01hcDppLC4uLndlKHIpfSl9fWZ1bmN0aW9uIGptKGUsdCl7Y29uc3Qgbj16aShlKSxyPXppKHQpO2lmKGU9PT10KXJldHVybnt2YWxpZDohMCxkYXRhOmV9O2lmKG49PT1RLm9iamVjdCYmcj09PVEub2JqZWN0KXtjb25zdCBpPUxlLm9iamVjdEtleXModCksbz1MZS5vYmplY3RLZXlzKGUpLmZpbHRlcihzPT5pLmluZGV4T2YocykhPT0tMSksbD17Li4uZSwuLi50fTtmb3IoY29uc3QgcyBvZiBvKXtjb25zdCBhPWptKGVbc10sdFtzXSk7aWYoIWEudmFsaWQpcmV0dXJue3ZhbGlkOiExfTtsW3NdPWEuZGF0YX1yZXR1cm57dmFsaWQ6ITAsZGF0YTpsfX1lbHNlIGlmKG49PT1RLmFycmF5JiZyPT09US5hcnJheSl7aWYoZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm57dmFsaWQ6ITF9O2NvbnN0IGk9W107Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDtvKyspe2NvbnN0IGw9ZVtvXSxzPXRbb10sYT1qbShsLHMpO2lmKCFhLnZhbGlkKXJldHVybnt2YWxpZDohMX07aS5wdXNoKGEuZGF0YSl9cmV0dXJue3ZhbGlkOiEwLGRhdGE6aX19ZWxzZSByZXR1cm4gbj09PVEuZGF0ZSYmcj09PVEuZGF0ZSYmK2U9PSt0P3t2YWxpZDohMCxkYXRhOmV9Ont2YWxpZDohMX19Y2xhc3MgdnUgZXh0ZW5kcyBDZXtfcGFyc2UodCl7Y29uc3R7c3RhdHVzOm4sY3R4OnJ9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyh0KSxpPShvLGwpPT57aWYoTG0obyl8fExtKGwpKXJldHVybiBnZTtjb25zdCBzPWptKG8udmFsdWUsbC52YWx1ZSk7cmV0dXJuIHMudmFsaWQ/KChJbShvKXx8SW0obCkpJiZuLmRpcnR5KCkse3N0YXR1czpuLnZhbHVlLHZhbHVlOnMuZGF0YX0pOihxKHIse2NvZGU6Vy5pbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlc30pLGdlKX07cmV0dXJuIHIuY29tbW9uLmFzeW5jP1Byb21pc2UuYWxsKFt0aGlzLl9kZWYubGVmdC5fcGFyc2VBc3luYyh7ZGF0YTpyLmRhdGEscGF0aDpyLnBhdGgscGFyZW50OnJ9KSx0aGlzLl9kZWYucmlnaHQuX3BhcnNlQXN5bmMoe2RhdGE6ci5kYXRhLHBhdGg6ci5wYXRoLHBhcmVudDpyfSldKS50aGVuKChbbyxsXSk9PmkobyxsKSk6aSh0aGlzLl9kZWYubGVmdC5fcGFyc2VTeW5jKHtkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pLHRoaXMuX2RlZi5yaWdodC5fcGFyc2VTeW5jKHtkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pKX19dnUuY3JlYXRlPShlLHQsbik9Pm5ldyB2dSh7bGVmdDplLHJpZ2h0OnQsdHlwZU5hbWU6ZGUuWm9kSW50ZXJzZWN0aW9uLC4uLndlKG4pfSk7Y2xhc3MgS3IgZXh0ZW5kcyBDZXtfcGFyc2UodCl7Y29uc3R7c3RhdHVzOm4sY3R4OnJ9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyh0KTtpZihyLnBhcnNlZFR5cGUhPT1RLmFycmF5KXJldHVybiBxKHIse2NvZGU6Vy5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6US5hcnJheSxyZWNlaXZlZDpyLnBhcnNlZFR5cGV9KSxnZTtpZihyLmRhdGEubGVuZ3RoPHRoaXMuX2RlZi5pdGVtcy5sZW5ndGgpcmV0dXJuIHEocix7Y29kZTpXLnRvb19zbWFsbCxtaW5pbXVtOnRoaXMuX2RlZi5pdGVtcy5sZW5ndGgsaW5jbHVzaXZlOiEwLGV4YWN0OiExLHR5cGU6ImFycmF5In0pLGdlOyF0aGlzLl9kZWYucmVzdCYmci5kYXRhLmxlbmd0aD50aGlzLl9kZWYuaXRlbXMubGVuZ3RoJiYocShyLHtjb2RlOlcudG9vX2JpZyxtYXhpbXVtOnRoaXMuX2RlZi5pdGVtcy5sZW5ndGgsaW5jbHVzaXZlOiEwLGV4YWN0OiExLHR5cGU6ImFycmF5In0pLG4uZGlydHkoKSk7Y29uc3Qgbz1bLi4uci5kYXRhXS5tYXAoKGwscyk9Pntjb25zdCBhPXRoaXMuX2RlZi5pdGVtc1tzXXx8dGhpcy5fZGVmLnJlc3Q7cmV0dXJuIGE/YS5fcGFyc2UobmV3IEhyKHIsbCxyLnBhdGgscykpOm51bGx9KS5maWx0ZXIobD0+ISFsKTtyZXR1cm4gci5jb21tb24uYXN5bmM/UHJvbWlzZS5hbGwobykudGhlbihsPT5vbi5tZXJnZUFycmF5KG4sbCkpOm9uLm1lcmdlQXJyYXkobixvKX1nZXQgaXRlbXMoKXtyZXR1cm4gdGhpcy5fZGVmLml0ZW1zfXJlc3QodCl7cmV0dXJuIG5ldyBLcih7Li4udGhpcy5fZGVmLHJlc3Q6dH0pfX1Lci5jcmVhdGU9KGUsdCk9PntpZighQXJyYXkuaXNBcnJheShlKSl0aHJvdyBuZXcgRXJyb3IoIllvdSBtdXN0IHBhc3MgYW4gYXJyYXkgb2Ygc2NoZW1hcyB0byB6LnR1cGxlKFsgLi4uIF0pIik7cmV0dXJuIG5ldyBLcih7aXRlbXM6ZSx0eXBlTmFtZTpkZS5ab2RUdXBsZSxyZXN0Om51bGwsLi4ud2UodCl9KX07Y2xhc3MgeXUgZXh0ZW5kcyBDZXtnZXQga2V5U2NoZW1hKCl7cmV0dXJuIHRoaXMuX2RlZi5rZXlUeXBlfWdldCB2YWx1ZVNjaGVtYSgpe3JldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlfV9wYXJzZSh0KXtjb25zdHtzdGF0dXM6bixjdHg6cn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKHQpO2lmKHIucGFyc2VkVHlwZSE9PVEub2JqZWN0KXJldHVybiBxKHIse2NvZGU6Vy5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6US5vYmplY3QscmVjZWl2ZWQ6ci5wYXJzZWRUeXBlfSksZ2U7Y29uc3QgaT1bXSxvPXRoaXMuX2RlZi5rZXlUeXBlLGw9dGhpcy5fZGVmLnZhbHVlVHlwZTtmb3IoY29uc3QgcyBpbiByLmRhdGEpaS5wdXNoKHtrZXk6by5fcGFyc2UobmV3IEhyKHIscyxyLnBhdGgscykpLHZhbHVlOmwuX3BhcnNlKG5ldyBIcihyLHIuZGF0YVtzXSxyLnBhdGgscykpfSk7cmV0dXJuIHIuY29tbW9uLmFzeW5jP29uLm1lcmdlT2JqZWN0QXN5bmMobixpKTpvbi5tZXJnZU9iamVjdFN5bmMobixpKX1nZXQgZWxlbWVudCgpe3JldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlfXN0YXRpYyBjcmVhdGUodCxuLHIpe3JldHVybiBuIGluc3RhbmNlb2YgQ2U/bmV3IHl1KHtrZXlUeXBlOnQsdmFsdWVUeXBlOm4sdHlwZU5hbWU6ZGUuWm9kUmVjb3JkLC4uLndlKHIpfSk6bmV3IHl1KHtrZXlUeXBlOl9yLmNyZWF0ZSgpLHZhbHVlVHlwZTp0LHR5cGVOYW1lOmRlLlpvZFJlY29yZCwuLi53ZShuKX0pfX1jbGFzcyBIZCBleHRlbmRzIENle2dldCBrZXlTY2hlbWEoKXtyZXR1cm4gdGhpcy5fZGVmLmtleVR5cGV9Z2V0IHZhbHVlU2NoZW1hKCl7cmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGV9X3BhcnNlKHQpe2NvbnN0e3N0YXR1czpuLGN0eDpyfT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXModCk7aWYoci5wYXJzZWRUeXBlIT09US5tYXApcmV0dXJuIHEocix7Y29kZTpXLmludmFsaWRfdHlwZSxleHBlY3RlZDpRLm1hcCxyZWNlaXZlZDpyLnBhcnNlZFR5cGV9KSxnZTtjb25zdCBpPXRoaXMuX2RlZi5rZXlUeXBlLG89dGhpcy5fZGVmLnZhbHVlVHlwZSxsPVsuLi5yLmRhdGEuZW50cmllcygpXS5tYXAoKFtzLGFdLHUpPT4oe2tleTppLl9wYXJzZShuZXcgSHIocixzLHIucGF0aCxbdSwia2V5Il0pKSx2YWx1ZTpvLl9wYXJzZShuZXcgSHIocixhLHIucGF0aCxbdSwidmFsdWUiXSkpfSkpO2lmKHIuY29tbW9uLmFzeW5jKXtjb25zdCBzPW5ldyBNYXA7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oYXN5bmMoKT0+e2Zvcihjb25zdCBhIG9mIGwpe2NvbnN0IHU9YXdhaXQgYS5rZXksYz1hd2FpdCBhLnZhbHVlO2lmKHUuc3RhdHVzPT09ImFib3J0ZWQifHxjLnN0YXR1cz09PSJhYm9ydGVkIilyZXR1cm4gZ2U7KHUuc3RhdHVzPT09ImRpcnR5Inx8Yy5zdGF0dXM9PT0iZGlydHkiKSYmbi5kaXJ0eSgpLHMuc2V0KHUudmFsdWUsYy52YWx1ZSl9cmV0dXJue3N0YXR1czpuLnZhbHVlLHZhbHVlOnN9fSl9ZWxzZXtjb25zdCBzPW5ldyBNYXA7Zm9yKGNvbnN0IGEgb2YgbCl7Y29uc3QgdT1hLmtleSxjPWEudmFsdWU7aWYodS5zdGF0dXM9PT0iYWJvcnRlZCJ8fGMuc3RhdHVzPT09ImFib3J0ZWQiKXJldHVybiBnZTsodS5zdGF0dXM9PT0iZGlydHkifHxjLnN0YXR1cz09PSJkaXJ0eSIpJiZuLmRpcnR5KCkscy5zZXQodS52YWx1ZSxjLnZhbHVlKX1yZXR1cm57c3RhdHVzOm4udmFsdWUsdmFsdWU6c319fX1IZC5jcmVhdGU9KGUsdCxuKT0+bmV3IEhkKHt2YWx1ZVR5cGU6dCxrZXlUeXBlOmUsdHlwZU5hbWU6ZGUuWm9kTWFwLC4uLndlKG4pfSk7Y2xhc3MgZWwgZXh0ZW5kcyBDZXtfcGFyc2UodCl7Y29uc3R7c3RhdHVzOm4sY3R4OnJ9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyh0KTtpZihyLnBhcnNlZFR5cGUhPT1RLnNldClyZXR1cm4gcShyLHtjb2RlOlcuaW52YWxpZF90eXBlLGV4cGVjdGVkOlEuc2V0LHJlY2VpdmVkOnIucGFyc2VkVHlwZX0pLGdlO2NvbnN0IGk9dGhpcy5fZGVmO2kubWluU2l6ZSE9PW51bGwmJnIuZGF0YS5zaXplPGkubWluU2l6ZS52YWx1ZSYmKHEocix7Y29kZTpXLnRvb19zbWFsbCxtaW5pbXVtOmkubWluU2l6ZS52YWx1ZSx0eXBlOiJzZXQiLGluY2x1c2l2ZTohMCxleGFjdDohMSxtZXNzYWdlOmkubWluU2l6ZS5tZXNzYWdlfSksbi5kaXJ0eSgpKSxpLm1heFNpemUhPT1udWxsJiZyLmRhdGEuc2l6ZT5pLm1heFNpemUudmFsdWUmJihxKHIse2NvZGU6Vy50b29fYmlnLG1heGltdW06aS5tYXhTaXplLnZhbHVlLHR5cGU6InNldCIsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1lc3NhZ2U6aS5tYXhTaXplLm1lc3NhZ2V9KSxuLmRpcnR5KCkpO2NvbnN0IG89dGhpcy5fZGVmLnZhbHVlVHlwZTtmdW5jdGlvbiBsKGEpe2NvbnN0IHU9bmV3IFNldDtmb3IoY29uc3QgYyBvZiBhKXtpZihjLnN0YXR1cz09PSJhYm9ydGVkIilyZXR1cm4gZ2U7Yy5zdGF0dXM9PT0iZGlydHkiJiZuLmRpcnR5KCksdS5hZGQoYy52YWx1ZSl9cmV0dXJue3N0YXR1czpuLnZhbHVlLHZhbHVlOnV9fWNvbnN0IHM9Wy4uLnIuZGF0YS52YWx1ZXMoKV0ubWFwKChhLHUpPT5vLl9wYXJzZShuZXcgSHIocixhLHIucGF0aCx1KSkpO3JldHVybiByLmNvbW1vbi5hc3luYz9Qcm9taXNlLmFsbChzKS50aGVuKGE9PmwoYSkpOmwocyl9bWluKHQsbil7cmV0dXJuIG5ldyBlbCh7Li4udGhpcy5fZGVmLG1pblNpemU6e3ZhbHVlOnQsbWVzc2FnZTpjZS50b1N0cmluZyhuKX19KX1tYXgodCxuKXtyZXR1cm4gbmV3IGVsKHsuLi50aGlzLl9kZWYsbWF4U2l6ZTp7dmFsdWU6dCxtZXNzYWdlOmNlLnRvU3RyaW5nKG4pfX0pfXNpemUodCxuKXtyZXR1cm4gdGhpcy5taW4odCxuKS5tYXgodCxuKX1ub25lbXB0eSh0KXtyZXR1cm4gdGhpcy5taW4oMSx0KX19ZWwuY3JlYXRlPShlLHQpPT5uZXcgZWwoe3ZhbHVlVHlwZTplLG1pblNpemU6bnVsbCxtYXhTaXplOm51bGwsdHlwZU5hbWU6ZGUuWm9kU2V0LC4uLndlKHQpfSk7Y2xhc3MgSmwgZXh0ZW5kcyBDZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy52YWxpZGF0ZT10aGlzLmltcGxlbWVudH1fcGFyc2UodCl7Y29uc3R7Y3R4Om59PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyh0KTtpZihuLnBhcnNlZFR5cGUhPT1RLmZ1bmN0aW9uKXJldHVybiBxKG4se2NvZGU6Vy5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6US5mdW5jdGlvbixyZWNlaXZlZDpuLnBhcnNlZFR5cGV9KSxnZTtmdW5jdGlvbiByKHMsYSl7cmV0dXJuIEJkKHtkYXRhOnMscGF0aDpuLnBhdGgsZXJyb3JNYXBzOltuLmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAsbi5zY2hlbWFFcnJvck1hcCxGZCgpLGR1XS5maWx0ZXIodT0+ISF1KSxpc3N1ZURhdGE6e2NvZGU6Vy5pbnZhbGlkX2FyZ3VtZW50cyxhcmd1bWVudHNFcnJvcjphfX0pfWZ1bmN0aW9uIGkocyxhKXtyZXR1cm4gQmQoe2RhdGE6cyxwYXRoOm4ucGF0aCxlcnJvck1hcHM6W24uY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCxuLnNjaGVtYUVycm9yTWFwLEZkKCksZHVdLmZpbHRlcih1PT4hIXUpLGlzc3VlRGF0YTp7Y29kZTpXLmludmFsaWRfcmV0dXJuX3R5cGUscmV0dXJuVHlwZUVycm9yOmF9fSl9Y29uc3Qgbz17ZXJyb3JNYXA6bi5jb21tb24uY29udGV4dHVhbEVycm9yTWFwfSxsPW4uZGF0YTtpZih0aGlzLl9kZWYucmV0dXJucyBpbnN0YW5jZW9mIHBzKXtjb25zdCBzPXRoaXM7cmV0dXJuIHluKGFzeW5jIGZ1bmN0aW9uKC4uLmEpe2NvbnN0IHU9bmV3IEVyKFtdKSxjPWF3YWl0IHMuX2RlZi5hcmdzLnBhcnNlQXN5bmMoYSxvKS5jYXRjaChoPT57dGhyb3cgdS5hZGRJc3N1ZShyKGEsaCkpLHV9KSxkPWF3YWl0IFJlZmxlY3QuYXBwbHkobCx0aGlzLGMpO3JldHVybiBhd2FpdCBzLl9kZWYucmV0dXJucy5fZGVmLnR5cGUucGFyc2VBc3luYyhkLG8pLmNhdGNoKGg9Pnt0aHJvdyB1LmFkZElzc3VlKGkoZCxoKSksdX0pfSl9ZWxzZXtjb25zdCBzPXRoaXM7cmV0dXJuIHluKGZ1bmN0aW9uKC4uLmEpe2NvbnN0IHU9cy5fZGVmLmFyZ3Muc2FmZVBhcnNlKGEsbyk7aWYoIXUuc3VjY2Vzcyl0aHJvdyBuZXcgRXIoW3IoYSx1LmVycm9yKV0pO2NvbnN0IGM9UmVmbGVjdC5hcHBseShsLHRoaXMsdS5kYXRhKSxkPXMuX2RlZi5yZXR1cm5zLnNhZmVQYXJzZShjLG8pO2lmKCFkLnN1Y2Nlc3MpdGhyb3cgbmV3IEVyKFtpKGMsZC5lcnJvcildKTtyZXR1cm4gZC5kYXRhfSl9fXBhcmFtZXRlcnMoKXtyZXR1cm4gdGhpcy5fZGVmLmFyZ3N9cmV0dXJuVHlwZSgpe3JldHVybiB0aGlzLl9kZWYucmV0dXJuc31hcmdzKC4uLnQpe3JldHVybiBuZXcgSmwoey4uLnRoaXMuX2RlZixhcmdzOktyLmNyZWF0ZSh0KS5yZXN0KFVvLmNyZWF0ZSgpKX0pfXJldHVybnModCl7cmV0dXJuIG5ldyBKbCh7Li4udGhpcy5fZGVmLHJldHVybnM6dH0pfWltcGxlbWVudCh0KXtyZXR1cm4gdGhpcy5wYXJzZSh0KX1zdHJpY3RJbXBsZW1lbnQodCl7cmV0dXJuIHRoaXMucGFyc2UodCl9c3RhdGljIGNyZWF0ZSh0LG4scil7cmV0dXJuIG5ldyBKbCh7YXJnczp0fHxLci5jcmVhdGUoW10pLnJlc3QoVW8uY3JlYXRlKCkpLHJldHVybnM6bnx8VW8uY3JlYXRlKCksdHlwZU5hbWU6ZGUuWm9kRnVuY3Rpb24sLi4ud2Uocil9KX19Y2xhc3MgeHUgZXh0ZW5kcyBDZXtnZXQgc2NoZW1hKCl7cmV0dXJuIHRoaXMuX2RlZi5nZXR0ZXIoKX1fcGFyc2UodCl7Y29uc3R7Y3R4Om59PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyh0KTtyZXR1cm4gdGhpcy5fZGVmLmdldHRlcigpLl9wYXJzZSh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50Om59KX19eHUuY3JlYXRlPShlLHQpPT5uZXcgeHUoe2dldHRlcjplLHR5cGVOYW1lOmRlLlpvZExhenksLi4ud2UodCl9KTtjbGFzcyBfdSBleHRlbmRzIENle19wYXJzZSh0KXtpZih0LmRhdGEhPT10aGlzLl9kZWYudmFsdWUpe2NvbnN0IG49dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCk7cmV0dXJuIHEobix7cmVjZWl2ZWQ6bi5kYXRhLGNvZGU6Vy5pbnZhbGlkX2xpdGVyYWwsZXhwZWN0ZWQ6dGhpcy5fZGVmLnZhbHVlfSksZ2V9cmV0dXJue3N0YXR1czoidmFsaWQiLHZhbHVlOnQuZGF0YX19Z2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMuX2RlZi52YWx1ZX19X3UuY3JlYXRlPShlLHQpPT5uZXcgX3Uoe3ZhbHVlOmUsdHlwZU5hbWU6ZGUuWm9kTGl0ZXJhbCwuLi53ZSh0KX0pO2Z1bmN0aW9uIFRDKGUsdCl7cmV0dXJuIG5ldyBjbyh7dmFsdWVzOmUsdHlwZU5hbWU6ZGUuWm9kRW51bSwuLi53ZSh0KX0pfWNsYXNzIGNvIGV4dGVuZHMgQ2V7X3BhcnNlKHQpe2lmKHR5cGVvZiB0LmRhdGEhPSJzdHJpbmciKXtjb25zdCBuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KHQpLHI9dGhpcy5fZGVmLnZhbHVlcztyZXR1cm4gcShuLHtleHBlY3RlZDpMZS5qb2luVmFsdWVzKHIpLHJlY2VpdmVkOm4ucGFyc2VkVHlwZSxjb2RlOlcuaW52YWxpZF90eXBlfSksZ2V9aWYodGhpcy5fZGVmLnZhbHVlcy5pbmRleE9mKHQuZGF0YSk9PT0tMSl7Y29uc3Qgbj10aGlzLl9nZXRPclJldHVybkN0eCh0KSxyPXRoaXMuX2RlZi52YWx1ZXM7cmV0dXJuIHEobix7cmVjZWl2ZWQ6bi5kYXRhLGNvZGU6Vy5pbnZhbGlkX2VudW1fdmFsdWUsb3B0aW9uczpyfSksZ2V9cmV0dXJuIHluKHQuZGF0YSl9Z2V0IG9wdGlvbnMoKXtyZXR1cm4gdGhpcy5fZGVmLnZhbHVlc31nZXQgZW51bSgpe2NvbnN0IHQ9e307Zm9yKGNvbnN0IG4gb2YgdGhpcy5fZGVmLnZhbHVlcyl0W25dPW47cmV0dXJuIHR9Z2V0IFZhbHVlcygpe2NvbnN0IHQ9e307Zm9yKGNvbnN0IG4gb2YgdGhpcy5fZGVmLnZhbHVlcyl0W25dPW47cmV0dXJuIHR9Z2V0IEVudW0oKXtjb25zdCB0PXt9O2Zvcihjb25zdCBuIG9mIHRoaXMuX2RlZi52YWx1ZXMpdFtuXT1uO3JldHVybiB0fWV4dHJhY3QodCl7cmV0dXJuIGNvLmNyZWF0ZSh0KX1leGNsdWRlKHQpe3JldHVybiBjby5jcmVhdGUodGhpcy5vcHRpb25zLmZpbHRlcihuPT4hdC5pbmNsdWRlcyhuKSkpfX1jby5jcmVhdGU9VEM7Y2xhc3Mgd3UgZXh0ZW5kcyBDZXtfcGFyc2UodCl7Y29uc3Qgbj1MZS5nZXRWYWxpZEVudW1WYWx1ZXModGhpcy5fZGVmLnZhbHVlcykscj10aGlzLl9nZXRPclJldHVybkN0eCh0KTtpZihyLnBhcnNlZFR5cGUhPT1RLnN0cmluZyYmci5wYXJzZWRUeXBlIT09US5udW1iZXIpe2NvbnN0IGk9TGUub2JqZWN0VmFsdWVzKG4pO3JldHVybiBxKHIse2V4cGVjdGVkOkxlLmpvaW5WYWx1ZXMoaSkscmVjZWl2ZWQ6ci5wYXJzZWRUeXBlLGNvZGU6Vy5pbnZhbGlkX3R5cGV9KSxnZX1pZihuLmluZGV4T2YodC5kYXRhKT09PS0xKXtjb25zdCBpPUxlLm9iamVjdFZhbHVlcyhuKTtyZXR1cm4gcShyLHtyZWNlaXZlZDpyLmRhdGEsY29kZTpXLmludmFsaWRfZW51bV92YWx1ZSxvcHRpb25zOml9KSxnZX1yZXR1cm4geW4odC5kYXRhKX1nZXQgZW51bSgpe3JldHVybiB0aGlzLl9kZWYudmFsdWVzfX13dS5jcmVhdGU9KGUsdCk9Pm5ldyB3dSh7dmFsdWVzOmUsdHlwZU5hbWU6ZGUuWm9kTmF0aXZlRW51bSwuLi53ZSh0KX0pO2NsYXNzIHBzIGV4dGVuZHMgQ2V7dW53cmFwKCl7cmV0dXJuIHRoaXMuX2RlZi50eXBlfV9wYXJzZSh0KXtjb25zdHtjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKHQpO2lmKG4ucGFyc2VkVHlwZSE9PVEucHJvbWlzZSYmbi5jb21tb24uYXN5bmM9PT0hMSlyZXR1cm4gcShuLHtjb2RlOlcuaW52YWxpZF90eXBlLGV4cGVjdGVkOlEucHJvbWlzZSxyZWNlaXZlZDpuLnBhcnNlZFR5cGV9KSxnZTtjb25zdCByPW4ucGFyc2VkVHlwZT09PVEucHJvbWlzZT9uLmRhdGE6UHJvbWlzZS5yZXNvbHZlKG4uZGF0YSk7cmV0dXJuIHluKHIudGhlbihpPT50aGlzLl9kZWYudHlwZS5wYXJzZUFzeW5jKGkse3BhdGg6bi5wYXRoLGVycm9yTWFwOm4uY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcH0pKSl9fXBzLmNyZWF0ZT0oZSx0KT0+bmV3IHBzKHt0eXBlOmUsdHlwZU5hbWU6ZGUuWm9kUHJvbWlzZSwuLi53ZSh0KX0pO2NsYXNzIGJyIGV4dGVuZHMgQ2V7aW5uZXJUeXBlKCl7cmV0dXJuIHRoaXMuX2RlZi5zY2hlbWF9c291cmNlVHlwZSgpe3JldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9kZWYudHlwZU5hbWU9PT1kZS5ab2RFZmZlY3RzP3RoaXMuX2RlZi5zY2hlbWEuc291cmNlVHlwZSgpOnRoaXMuX2RlZi5zY2hlbWF9X3BhcnNlKHQpe2NvbnN0e3N0YXR1czpuLGN0eDpyfT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXModCksaT10aGlzLl9kZWYuZWZmZWN0fHxudWxsLG89e2FkZElzc3VlOmw9PntxKHIsbCksbC5mYXRhbD9uLmFib3J0KCk6bi5kaXJ0eSgpfSxnZXQgcGF0aCgpe3JldHVybiByLnBhdGh9fTtpZihvLmFkZElzc3VlPW8uYWRkSXNzdWUuYmluZChvKSxpLnR5cGU9PT0icHJlcHJvY2VzcyIpe2NvbnN0IGw9aS50cmFuc2Zvcm0oci5kYXRhLG8pO3JldHVybiByLmNvbW1vbi5pc3N1ZXMubGVuZ3RoP3tzdGF0dXM6ImRpcnR5Iix2YWx1ZTpyLmRhdGF9OnIuY29tbW9uLmFzeW5jP1Byb21pc2UucmVzb2x2ZShsKS50aGVuKHM9PnRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlQXN5bmMoe2RhdGE6cyxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pKTp0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe2RhdGE6bCxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pfWlmKGkudHlwZT09PSJyZWZpbmVtZW50Iil7Y29uc3QgbD1zPT57Y29uc3QgYT1pLnJlZmluZW1lbnQocyxvKTtpZihyLmNvbW1vbi5hc3luYylyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGEpO2lmKGEgaW5zdGFuY2VvZiBQcm9taXNlKXRocm93IG5ldyBFcnJvcigiQXN5bmMgcmVmaW5lbWVudCBlbmNvdW50ZXJlZCBkdXJpbmcgc3luY2hyb25vdXMgcGFyc2Ugb3BlcmF0aW9uLiBVc2UgLnBhcnNlQXN5bmMgaW5zdGVhZC4iKTtyZXR1cm4gc307aWYoci5jb21tb24uYXN5bmM9PT0hMSl7Y29uc3Qgcz10aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe2RhdGE6ci5kYXRhLHBhdGg6ci5wYXRoLHBhcmVudDpyfSk7cmV0dXJuIHMuc3RhdHVzPT09ImFib3J0ZWQiP2dlOihzLnN0YXR1cz09PSJkaXJ0eSImJm4uZGlydHkoKSxsKHMudmFsdWUpLHtzdGF0dXM6bi52YWx1ZSx2YWx1ZTpzLnZhbHVlfSl9ZWxzZSByZXR1cm4gdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VBc3luYyh7ZGF0YTpyLmRhdGEscGF0aDpyLnBhdGgscGFyZW50OnJ9KS50aGVuKHM9PnMuc3RhdHVzPT09ImFib3J0ZWQiP2dlOihzLnN0YXR1cz09PSJkaXJ0eSImJm4uZGlydHkoKSxsKHMudmFsdWUpLnRoZW4oKCk9Pih7c3RhdHVzOm4udmFsdWUsdmFsdWU6cy52YWx1ZX0pKSkpfWlmKGkudHlwZT09PSJ0cmFuc2Zvcm0iKWlmKHIuY29tbW9uLmFzeW5jPT09ITEpe2NvbnN0IGw9dGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VTeW5jKHtkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pO2lmKCFmdShsKSlyZXR1cm4gbDtjb25zdCBzPWkudHJhbnNmb3JtKGwudmFsdWUsbyk7aWYocyBpbnN0YW5jZW9mIFByb21pc2UpdGhyb3cgbmV3IEVycm9yKCJBc3luY2hyb25vdXMgdHJhbnNmb3JtIGVuY291bnRlcmVkIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZSBvcGVyYXRpb24uIFVzZSAucGFyc2VBc3luYyBpbnN0ZWFkLiIpO3JldHVybntzdGF0dXM6bi52YWx1ZSx2YWx1ZTpzfX1lbHNlIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHtkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pLnRoZW4obD0+ZnUobCk/UHJvbWlzZS5yZXNvbHZlKGkudHJhbnNmb3JtKGwudmFsdWUsbykpLnRoZW4ocz0+KHtzdGF0dXM6bi52YWx1ZSx2YWx1ZTpzfSkpOmwpO0xlLmFzc2VydE5ldmVyKGkpfX1ici5jcmVhdGU9KGUsdCxuKT0+bmV3IGJyKHtzY2hlbWE6ZSx0eXBlTmFtZTpkZS5ab2RFZmZlY3RzLGVmZmVjdDp0LC4uLndlKG4pfSk7YnIuY3JlYXRlV2l0aFByZXByb2Nlc3M9KGUsdCxuKT0+bmV3IGJyKHtzY2hlbWE6dCxlZmZlY3Q6e3R5cGU6InByZXByb2Nlc3MiLHRyYW5zZm9ybTplfSx0eXBlTmFtZTpkZS5ab2RFZmZlY3RzLC4uLndlKG4pfSk7Y2xhc3MgY2kgZXh0ZW5kcyBDZXtfcGFyc2UodCl7cmV0dXJuIHRoaXMuX2dldFR5cGUodCk9PT1RLnVuZGVmaW5lZD95bih2b2lkIDApOnRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKHQpfXVud3JhcCgpe3JldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlfX1jaS5jcmVhdGU9KGUsdCk9Pm5ldyBjaSh7aW5uZXJUeXBlOmUsdHlwZU5hbWU6ZGUuWm9kT3B0aW9uYWwsLi4ud2UodCl9KTtjbGFzcyB0bCBleHRlbmRzIENle19wYXJzZSh0KXtyZXR1cm4gdGhpcy5fZ2V0VHlwZSh0KT09PVEubnVsbD95bihudWxsKTp0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZSh0KX11bndyYXAoKXtyZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZX19dGwuY3JlYXRlPShlLHQpPT5uZXcgdGwoe2lubmVyVHlwZTplLHR5cGVOYW1lOmRlLlpvZE51bGxhYmxlLC4uLndlKHQpfSk7Y2xhc3MgU3UgZXh0ZW5kcyBDZXtfcGFyc2UodCl7Y29uc3R7Y3R4Om59PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyh0KTtsZXQgcj1uLmRhdGE7cmV0dXJuIG4ucGFyc2VkVHlwZT09PVEudW5kZWZpbmVkJiYocj10aGlzLl9kZWYuZGVmYXVsdFZhbHVlKCkpLHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKHtkYXRhOnIscGF0aDpuLnBhdGgscGFyZW50Om59KX1yZW1vdmVEZWZhdWx0KCl7cmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGV9fVN1LmNyZWF0ZT0oZSx0KT0+bmV3IFN1KHtpbm5lclR5cGU6ZSx0eXBlTmFtZTpkZS5ab2REZWZhdWx0LGRlZmF1bHRWYWx1ZTp0eXBlb2YgdC5kZWZhdWx0PT0iZnVuY3Rpb24iP3QuZGVmYXVsdDooKT0+dC5kZWZhdWx0LC4uLndlKHQpfSk7Y2xhc3MgS2QgZXh0ZW5kcyBDZXtfcGFyc2UodCl7Y29uc3R7Y3R4Om59PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyh0KSxyPXsuLi5uLGNvbW1vbjp7Li4ubi5jb21tb24saXNzdWVzOltdfX0saT10aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZSh7ZGF0YTpyLmRhdGEscGF0aDpyLnBhdGgscGFyZW50OnsuLi5yfX0pO3JldHVybiBVZChpKT9pLnRoZW4obz0+KHtzdGF0dXM6InZhbGlkIix2YWx1ZTpvLnN0YXR1cz09PSJ2YWxpZCI/by52YWx1ZTp0aGlzLl9kZWYuY2F0Y2hWYWx1ZSh7Z2V0IGVycm9yKCl7cmV0dXJuIG5ldyBFcihyLmNvbW1vbi5pc3N1ZXMpfSxpbnB1dDpyLmRhdGF9KX0pKTp7c3RhdHVzOiJ2YWxpZCIsdmFsdWU6aS5zdGF0dXM9PT0idmFsaWQiP2kudmFsdWU6dGhpcy5fZGVmLmNhdGNoVmFsdWUoe2dldCBlcnJvcigpe3JldHVybiBuZXcgRXIoci5jb21tb24uaXNzdWVzKX0saW5wdXQ6ci5kYXRhfSl9fXJlbW92ZUNhdGNoKCl7cmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGV9fUtkLmNyZWF0ZT0oZSx0KT0+bmV3IEtkKHtpbm5lclR5cGU6ZSx0eXBlTmFtZTpkZS5ab2RDYXRjaCxjYXRjaFZhbHVlOnR5cGVvZiB0LmNhdGNoPT0iZnVuY3Rpb24iP3QuY2F0Y2g6KCk9PnQuY2F0Y2gsLi4ud2UodCl9KTtjbGFzcyBaZCBleHRlbmRzIENle19wYXJzZSh0KXtpZih0aGlzLl9nZXRUeXBlKHQpIT09US5uYW4pe2NvbnN0IHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgodCk7cmV0dXJuIHEocix7Y29kZTpXLmludmFsaWRfdHlwZSxleHBlY3RlZDpRLm5hbixyZWNlaXZlZDpyLnBhcnNlZFR5cGV9KSxnZX1yZXR1cm57c3RhdHVzOiJ2YWxpZCIsdmFsdWU6dC5kYXRhfX19WmQuY3JlYXRlPWU9Pm5ldyBaZCh7dHlwZU5hbWU6ZGUuWm9kTmFOLC4uLndlKGUpfSk7Y29uc3QgJDU9U3ltYm9sKCJ6b2RfYnJhbmQiKTtjbGFzcyBOQyBleHRlbmRzIENle19wYXJzZSh0KXtjb25zdHtjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKHQpLHI9bi5kYXRhO3JldHVybiB0aGlzLl9kZWYudHlwZS5fcGFyc2Uoe2RhdGE6cixwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pfXVud3JhcCgpe3JldHVybiB0aGlzLl9kZWYudHlwZX19Y2xhc3MgQnUgZXh0ZW5kcyBDZXtfcGFyc2UodCl7Y29uc3R7c3RhdHVzOm4sY3R4OnJ9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyh0KTtpZihyLmNvbW1vbi5hc3luYylyZXR1cm4oYXN5bmMoKT0+e2NvbnN0IG89YXdhaXQgdGhpcy5fZGVmLmluLl9wYXJzZUFzeW5jKHtkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pO3JldHVybiBvLnN0YXR1cz09PSJhYm9ydGVkIj9nZTpvLnN0YXR1cz09PSJkaXJ0eSI/KG4uZGlydHkoKSxiQyhvLnZhbHVlKSk6dGhpcy5fZGVmLm91dC5fcGFyc2VBc3luYyh7ZGF0YTpvLnZhbHVlLHBhdGg6ci5wYXRoLHBhcmVudDpyfSl9KSgpO3tjb25zdCBpPXRoaXMuX2RlZi5pbi5fcGFyc2VTeW5jKHtkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pO3JldHVybiBpLnN0YXR1cz09PSJhYm9ydGVkIj9nZTppLnN0YXR1cz09PSJkaXJ0eSI/KG4uZGlydHkoKSx7c3RhdHVzOiJkaXJ0eSIsdmFsdWU6aS52YWx1ZX0pOnRoaXMuX2RlZi5vdXQuX3BhcnNlU3luYyh7ZGF0YTppLnZhbHVlLHBhdGg6ci5wYXRoLHBhcmVudDpyfSl9fXN0YXRpYyBjcmVhdGUodCxuKXtyZXR1cm4gbmV3IEJ1KHtpbjp0LG91dDpuLHR5cGVOYW1lOmRlLlpvZFBpcGVsaW5lfSl9fWNsYXNzIEdkIGV4dGVuZHMgQ2V7X3BhcnNlKHQpe2NvbnN0IG49dGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UodCk7cmV0dXJuIGZ1KG4pJiYobi52YWx1ZT1PYmplY3QuZnJlZXplKG4udmFsdWUpKSxufX1HZC5jcmVhdGU9KGUsdCk9Pm5ldyBHZCh7aW5uZXJUeXBlOmUsdHlwZU5hbWU6ZGUuWm9kUmVhZG9ubHksLi4ud2UodCl9KTtjb25zdCBSQz0oZSx0PXt9LG4pPT5lP2hzLmNyZWF0ZSgpLnN1cGVyUmVmaW5lKChyLGkpPT57dmFyIG8sbDtpZighZShyKSl7Y29uc3Qgcz10eXBlb2YgdD09ImZ1bmN0aW9uIj90KHIpOnR5cGVvZiB0PT0ic3RyaW5nIj97bWVzc2FnZTp0fTp0LGE9KGw9KG89cy5mYXRhbCkhPT1udWxsJiZvIT09dm9pZCAwP286bikhPT1udWxsJiZsIT09dm9pZCAwP2w6ITAsdT10eXBlb2Ygcz09InN0cmluZyI/e21lc3NhZ2U6c306cztpLmFkZElzc3VlKHtjb2RlOiJjdXN0b20iLC4uLnUsZmF0YWw6YX0pfX0pOmhzLmNyZWF0ZSgpLGI1PXtvYmplY3Q6Y3QubGF6eWNyZWF0ZX07dmFyIGRlOyhmdW5jdGlvbihlKXtlLlpvZFN0cmluZz0iWm9kU3RyaW5nIixlLlpvZE51bWJlcj0iWm9kTnVtYmVyIixlLlpvZE5hTj0iWm9kTmFOIixlLlpvZEJpZ0ludD0iWm9kQmlnSW50IixlLlpvZEJvb2xlYW49IlpvZEJvb2xlYW4iLGUuWm9kRGF0ZT0iWm9kRGF0ZSIsZS5ab2RTeW1ib2w9IlpvZFN5bWJvbCIsZS5ab2RVbmRlZmluZWQ9IlpvZFVuZGVmaW5lZCIsZS5ab2ROdWxsPSJab2ROdWxsIixlLlpvZEFueT0iWm9kQW55IixlLlpvZFVua25vd249IlpvZFVua25vd24iLGUuWm9kTmV2ZXI9IlpvZE5ldmVyIixlLlpvZFZvaWQ9IlpvZFZvaWQiLGUuWm9kQXJyYXk9IlpvZEFycmF5IixlLlpvZE9iamVjdD0iWm9kT2JqZWN0IixlLlpvZFVuaW9uPSJab2RVbmlvbiIsZS5ab2REaXNjcmltaW5hdGVkVW5pb249IlpvZERpc2NyaW1pbmF0ZWRVbmlvbiIsZS5ab2RJbnRlcnNlY3Rpb249IlpvZEludGVyc2VjdGlvbiIsZS5ab2RUdXBsZT0iWm9kVHVwbGUiLGUuWm9kUmVjb3JkPSJab2RSZWNvcmQiLGUuWm9kTWFwPSJab2RNYXAiLGUuWm9kU2V0PSJab2RTZXQiLGUuWm9kRnVuY3Rpb249IlpvZEZ1bmN0aW9uIixlLlpvZExhenk9IlpvZExhenkiLGUuWm9kTGl0ZXJhbD0iWm9kTGl0ZXJhbCIsZS5ab2RFbnVtPSJab2RFbnVtIixlLlpvZEVmZmVjdHM9IlpvZEVmZmVjdHMiLGUuWm9kTmF0aXZlRW51bT0iWm9kTmF0aXZlRW51bSIsZS5ab2RPcHRpb25hbD0iWm9kT3B0aW9uYWwiLGUuWm9kTnVsbGFibGU9IlpvZE51bGxhYmxlIixlLlpvZERlZmF1bHQ9IlpvZERlZmF1bHQiLGUuWm9kQ2F0Y2g9IlpvZENhdGNoIixlLlpvZFByb21pc2U9IlpvZFByb21pc2UiLGUuWm9kQnJhbmRlZD0iWm9kQnJhbmRlZCIsZS5ab2RQaXBlbGluZT0iWm9kUGlwZWxpbmUiLGUuWm9kUmVhZG9ubHk9IlpvZFJlYWRvbmx5In0pKGRlfHwoZGU9e30pKTtjb25zdCBUNT0oZSx0PXttZXNzYWdlOmBJbnB1dCBub3QgaW5zdGFuY2Ugb2YgJHtlLm5hbWV9YH0pPT5SQyhuPT5uIGluc3RhbmNlb2YgZSx0KSxPQz1fci5jcmVhdGUsUEM9YW8uY3JlYXRlLE41PVpkLmNyZWF0ZSxSNT11by5jcmVhdGUsQUM9aHUuY3JlYXRlLE81PXFvLmNyZWF0ZSxQNT1XZC5jcmVhdGUsQTU9cHUuY3JlYXRlLE01PW11LmNyZWF0ZSxENT1ocy5jcmVhdGUsTDU9VW8uY3JlYXRlLEk1PW1pLmNyZWF0ZSxqNT1WZC5jcmVhdGUsejU9Q3IuY3JlYXRlLEY1PWN0LmNyZWF0ZSxCNT1jdC5zdHJpY3RDcmVhdGUsVTU9Z3UuY3JlYXRlLFc1PUlmLmNyZWF0ZSxWNT12dS5jcmVhdGUsSDU9S3IuY3JlYXRlLEs1PXl1LmNyZWF0ZSxaNT1IZC5jcmVhdGUsRzU9ZWwuY3JlYXRlLFk1PUpsLmNyZWF0ZSxYNT14dS5jcmVhdGUsUTU9X3UuY3JlYXRlLEo1PWNvLmNyZWF0ZSxxNT13dS5jcmVhdGUsZU09cHMuY3JlYXRlLGJ4PWJyLmNyZWF0ZSx0TT1jaS5jcmVhdGUsbk09dGwuY3JlYXRlLHJNPWJyLmNyZWF0ZVdpdGhQcmVwcm9jZXNzLGlNPUJ1LmNyZWF0ZSxvTT0oKT0+T0MoKS5vcHRpb25hbCgpLGxNPSgpPT5QQygpLm9wdGlvbmFsKCksc009KCk9PkFDKCkub3B0aW9uYWwoKSxhTT17c3RyaW5nOmU9Pl9yLmNyZWF0ZSh7Li4uZSxjb2VyY2U6ITB9KSxudW1iZXI6ZT0+YW8uY3JlYXRlKHsuLi5lLGNvZXJjZTohMH0pLGJvb2xlYW46ZT0+aHUuY3JlYXRlKHsuLi5lLGNvZXJjZTohMH0pLGJpZ2ludDplPT51by5jcmVhdGUoey4uLmUsY29lcmNlOiEwfSksZGF0ZTplPT5xby5jcmVhdGUoey4uLmUsY29lcmNlOiEwfSl9LHVNPWdlO3ZhciBDbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxkZWZhdWx0RXJyb3JNYXA6ZHUsc2V0RXJyb3JNYXA6aDUsZ2V0RXJyb3JNYXA6RmQsbWFrZUlzc3VlOkJkLEVNUFRZX1BBVEg6cDUsYWRkSXNzdWVUb0NvbnRleHQ6cSxQYXJzZVN0YXR1czpvbixJTlZBTElEOmdlLERJUlRZOmJDLE9LOnluLGlzQWJvcnRlZDpMbSxpc0RpcnR5OkltLGlzVmFsaWQ6ZnUsaXNBc3luYzpVZCxnZXQgdXRpbCgpe3JldHVybiBMZX0sZ2V0IG9iamVjdFV0aWwoKXtyZXR1cm4gRG19LFpvZFBhcnNlZFR5cGU6USxnZXRQYXJzZWRUeXBlOnppLFpvZFR5cGU6Q2UsWm9kU3RyaW5nOl9yLFpvZE51bWJlcjphbyxab2RCaWdJbnQ6dW8sWm9kQm9vbGVhbjpodSxab2REYXRlOnFvLFpvZFN5bWJvbDpXZCxab2RVbmRlZmluZWQ6cHUsWm9kTnVsbDptdSxab2RBbnk6aHMsWm9kVW5rbm93bjpVbyxab2ROZXZlcjptaSxab2RWb2lkOlZkLFpvZEFycmF5OkNyLFpvZE9iamVjdDpjdCxab2RVbmlvbjpndSxab2REaXNjcmltaW5hdGVkVW5pb246SWYsWm9kSW50ZXJzZWN0aW9uOnZ1LFpvZFR1cGxlOktyLFpvZFJlY29yZDp5dSxab2RNYXA6SGQsWm9kU2V0OmVsLFpvZEZ1bmN0aW9uOkpsLFpvZExhenk6eHUsWm9kTGl0ZXJhbDpfdSxab2RFbnVtOmNvLFpvZE5hdGl2ZUVudW06d3UsWm9kUHJvbWlzZTpwcyxab2RFZmZlY3RzOmJyLFpvZFRyYW5zZm9ybWVyOmJyLFpvZE9wdGlvbmFsOmNpLFpvZE51bGxhYmxlOnRsLFpvZERlZmF1bHQ6U3UsWm9kQ2F0Y2g6S2QsWm9kTmFOOlpkLEJSQU5EOiQ1LFpvZEJyYW5kZWQ6TkMsWm9kUGlwZWxpbmU6QnUsWm9kUmVhZG9ubHk6R2QsY3VzdG9tOlJDLFNjaGVtYTpDZSxab2RTY2hlbWE6Q2UsbGF0ZTpiNSxnZXQgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kKCl7cmV0dXJuIGRlfSxjb2VyY2U6YU0sYW55OkQ1LGFycmF5Ono1LGJpZ2ludDpSNSxib29sZWFuOkFDLGRhdGU6TzUsZGlzY3JpbWluYXRlZFVuaW9uOlc1LGVmZmVjdDpieCxlbnVtOko1LGZ1bmN0aW9uOlk1LGluc3RhbmNlb2Y6VDUsaW50ZXJzZWN0aW9uOlY1LGxhenk6WDUsbGl0ZXJhbDpRNSxtYXA6WjUsbmFuOk41LG5hdGl2ZUVudW06cTUsbmV2ZXI6STUsbnVsbDpNNSxudWxsYWJsZTpuTSxudW1iZXI6UEMsb2JqZWN0OkY1LG9ib29sZWFuOnNNLG9udW1iZXI6bE0sb3B0aW9uYWw6dE0sb3N0cmluZzpvTSxwaXBlbGluZTppTSxwcmVwcm9jZXNzOnJNLHByb21pc2U6ZU0scmVjb3JkOks1LHNldDpHNSxzdHJpY3RPYmplY3Q6QjUsc3RyaW5nOk9DLHN5bWJvbDpQNSx0cmFuc2Zvcm1lcjpieCx0dXBsZTpINSx1bmRlZmluZWQ6QTUsdW5pb246VTUsdW5rbm93bjpMNSx2b2lkOmo1LE5FVkVSOnVNLFpvZElzc3VlQ29kZTpXLHF1b3RlbGVzc0pzb246ZjUsWm9kRXJyb3I6RXJ9KTtjb25zdCBjTT1Dbi51bmlvbihbQ24ub2JqZWN0KHtpZDpDbi5zdHJpbmcoKSxtb2RlOkNuLmxpdGVyYWwoInByb3h5IiksZnVsbF9uYW1lOkNuLnN0cmluZygpLm9wdGlvbmFsKCkubnVsbGFibGUoKSx1c2VybmFtZTpDbi5zdHJpbmcoKS5vcHRpb25hbCgpLm51bGxhYmxlKCksYXZhdGFyX3VybDpDbi5zdHJpbmcoKS51cmwoKS5vcHRpb25hbCgpLm51bGxhYmxlKCksZW5hYmxlZDpDbi5ib29sZWFuKCl9KSxDbi5vYmplY3Qoe21vZGU6Q24ubGl0ZXJhbCgibG9jYWwiKSxlbmFibGVkOkNuLmJvb2xlYW4oKS5vcHRpb25hbCgpfSksQ24ub2JqZWN0KHttb2RlOkNuLmxpdGVyYWwoInVuYXV0aG9yaXplZCIpLGVuYWJsZWQ6Q24uYm9vbGVhbigpLm9wdGlvbmFsKCl9KV0pO2Z1bmN0aW9uIGRNKGUpe2NvbnN0W3Qsbl09cC51c2VTdGF0ZSh7c3RhdHVzOiJub3QtYXNrZWQifSksW3IsaV09cC51c2VTdGF0ZSgwKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntuKHtzdGF0dXM6ImxvYWRpbmcifSksZS5nZXRTZXNzaW9uKCkudGhlbihhc3luYyBvPT57dHJ5e2lmKGpvLmlzT2sobykpe2NvbnN0IGw9by52YWx1ZTtuKHtzdGF0dXM6InN1Y2Nlc3MiLGRhdGE6Y00ucGFyc2UobCl9KX1lbHNlIG8uZXJyb3Iuc3RhdHVzQ29kZT09PTQwMT9uKHtzdGF0dXM6InN1Y2Nlc3MiLGRhdGE6e21vZGU6InVuYXV0aG9yaXplZCJ9fSk6cjwzP3NldFRpbWVvdXQoKCk9PntpKHIrMSl9LDIwMCpyKTpuKHtzdGF0dXM6ImVycm9yIixlcnJvcjoiQ291bGQgbm90IGZldGNoIHNlc3Npb24ifSl9Y2F0Y2gobCl7Y29uc29sZS5lcnJvcigiQ291bGQgbm90IGF1dGhvcml6ZToiLGwpLG4oe3N0YXR1czoiZXJyb3IiLGVycm9yOiJHb3QgYW4gZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGdldCBzZXNzaW9uIn0pfX0pfSxbcl0pLHR9Y29uc3QgVHg9ZT0+dHlwZW9mIGU9PSJib29sZWFuIj8iIi5jb25jYXQoZSk6ZT09PTA/IjAiOmUsTng9dVMsZk09KGUsdCk9Pm49Pnt2YXIgcjtpZigodD09bnVsbD92b2lkIDA6dC52YXJpYW50cyk9PW51bGwpcmV0dXJuIE54KGUsbj09bnVsbD92b2lkIDA6bi5jbGFzcyxuPT1udWxsP3ZvaWQgMDpuLmNsYXNzTmFtZSk7Y29uc3R7dmFyaWFudHM6aSxkZWZhdWx0VmFyaWFudHM6b309dCxsPU9iamVjdC5rZXlzKGkpLm1hcCh1PT57Y29uc3QgYz1uPT1udWxsP3ZvaWQgMDpuW3VdLGQ9bz09bnVsbD92b2lkIDA6b1t1XTtpZihjPT09bnVsbClyZXR1cm4gbnVsbDtjb25zdCBmPVR4KGMpfHxUeChkKTtyZXR1cm4gaVt1XVtmXX0pLHM9biYmT2JqZWN0LmVudHJpZXMobikucmVkdWNlKCh1LGMpPT57bGV0W2QsZl09YztyZXR1cm4gZj09PXZvaWQgMHx8KHVbZF09ZiksdX0se30pLGE9dD09bnVsbHx8KHI9dC5jb21wb3VuZFZhcmlhbnRzKT09PW51bGx8fHI9PT12b2lkIDA/dm9pZCAwOnIucmVkdWNlKCh1LGMpPT57bGV0e2NsYXNzOmQsY2xhc3NOYW1lOmYsLi4uaH09YztyZXR1cm4gT2JqZWN0LmVudHJpZXMoaCkuZXZlcnkobT0+e2xldFtnLHddPW07cmV0dXJuIEFycmF5LmlzQXJyYXkodyk/dy5pbmNsdWRlcyh7Li4ubywuLi5zfVtnXSk6ey4uLm8sLi4uc31bZ109PT13fSk/Wy4uLnUsZCxmXTp1fSxbXSk7cmV0dXJuIE54KGUsbCxhLG49PW51bGw/dm9pZCAwOm4uY2xhc3Msbj09bnVsbD92b2lkIDA6bi5jbGFzc05hbWUpfSxoTT1mTSgiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHdoaXRlc3BhY2Utbm93cmFwIHJvdW5kZWQtbWQgdGV4dC1zbSBmb250LW1lZGl1bSByaW5nLW9mZnNldC1iYWNrZ3JvdW5kIHRyYW5zaXRpb24tY29sb3JzIGZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMiBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOm9wYWNpdHktNTAiLHt2YXJpYW50czp7dmFyaWFudDp7ZGVmYXVsdDoiYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBob3ZlcjpiZy1wcmltYXJ5LzkwIixkZXN0cnVjdGl2ZToiYmctZGVzdHJ1Y3RpdmUgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIGhvdmVyOmJnLWRlc3RydWN0aXZlLzkwIixvdXRsaW5lOiJib3JkZXIgYm9yZGVyLWlucHV0IGJnLWJhY2tncm91bmQgaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQiLHNlY29uZGFyeToiYmctc2Vjb25kYXJ5IHRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmQgaG92ZXI6Ymctc2Vjb25kYXJ5LzgwIixnaG9zdDoiaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQiLGxpbms6InRleHQtcHJpbWFyeSB1bmRlcmxpbmUtb2Zmc2V0LTQgaG92ZXI6dW5kZXJsaW5lIn0sc2l6ZTp7ZGVmYXVsdDoiaC0xMCBweC00IHB5LTIiLHNtOiJoLTkgcm91bmRlZC1tZCBweC0zIixsZzoiaC0xMSByb3VuZGVkLW1kIHB4LTgiLGljb246ImgtMTAgdy0xMCJ9fSxkZWZhdWx0VmFyaWFudHM6e3ZhcmlhbnQ6ImRlZmF1bHQiLHNpemU6ImRlZmF1bHQifX0pLE1DPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLHZhcmlhbnQ6dCxzaXplOm4sYXNDaGlsZDpyPSExLC4uLml9LG8pPT57Y29uc3QgbD1yP3VzOiJidXR0b24iO3JldHVybiB4LmpzeChsLHtjbGFzc05hbWU6eHQoaE0oe3ZhcmlhbnQ6dCxzaXplOm4sY2xhc3NOYW1lOmV9KSkscmVmOm8sLi4uaX0pfSk7TUMuZGlzcGxheU5hbWU9IkJ1dHRvbiI7Y29uc3QganY9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsdHlwZTp0LC4uLm59LHIpPT54LmpzeCgiaW5wdXQiLHt0eXBlOnQsY2xhc3NOYW1lOnh0KCJmbGV4IGgtMTAgdy1mdWxsIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIHB4LTMgcHktMiB0ZXh0LXNtIHJpbmctb2Zmc2V0LWJhY2tncm91bmQgZmlsZTpib3JkZXItMCBmaWxlOmJnLXRyYW5zcGFyZW50IGZpbGU6dGV4dC1zbSBmaWxlOmZvbnQtbWVkaXVtIHBsYWNlaG9sZGVyOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCBmb2N1cy12aXNpYmxlOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctcmluZyBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LTIgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAiLGUpLHJlZjpyLC4uLm59KSk7anYuZGlzcGxheU5hbWU9IklucHV0IjtmdW5jdGlvbiBEQyhlKXtjb25zdCB0PWUrIkNvbGxlY3Rpb25Qcm92aWRlciIsW24scl09bGwodCksW2ksb109bih0LHtjb2xsZWN0aW9uUmVmOntjdXJyZW50Om51bGx9LGl0ZW1NYXA6bmV3IE1hcH0pLGw9aD0+e2NvbnN0e3Njb3BlOm0sY2hpbGRyZW46Z309aCx3PXJlLnVzZVJlZihudWxsKSx2PXJlLnVzZVJlZihuZXcgTWFwKS5jdXJyZW50O3JldHVybiByZS5jcmVhdGVFbGVtZW50KGkse3Njb3BlOm0saXRlbU1hcDp2LGNvbGxlY3Rpb25SZWY6d30sZyl9LHM9ZSsiQ29sbGVjdGlvblNsb3QiLGE9cmUuZm9yd2FyZFJlZigoaCxtKT0+e2NvbnN0e3Njb3BlOmcsY2hpbGRyZW46d309aCx2PW8ocyxnKSx5PXN0KG0sdi5jb2xsZWN0aW9uUmVmKTtyZXR1cm4gcmUuY3JlYXRlRWxlbWVudCh1cyx7cmVmOnl9LHcpfSksdT1lKyJDb2xsZWN0aW9uSXRlbVNsb3QiLGM9ImRhdGEtcmFkaXgtY29sbGVjdGlvbi1pdGVtIixkPXJlLmZvcndhcmRSZWYoKGgsbSk9Pntjb25zdHtzY29wZTpnLGNoaWxkcmVuOncsLi4udn09aCx5PXJlLnVzZVJlZihudWxsKSxfPXN0KG0seSksUz1vKHUsZyk7cmV0dXJuIHJlLnVzZUVmZmVjdCgoKT0+KFMuaXRlbU1hcC5zZXQoeSx7cmVmOnksLi4udn0pLCgpPT52b2lkIFMuaXRlbU1hcC5kZWxldGUoeSkpKSxyZS5jcmVhdGVFbGVtZW50KHVzLHtbY106IiIscmVmOl99LHcpfSk7ZnVuY3Rpb24gZihoKXtjb25zdCBtPW8oZSsiQ29sbGVjdGlvbkNvbnN1bWVyIixoKTtyZXR1cm4gcmUudXNlQ2FsbGJhY2soKCk9Pntjb25zdCB3PW0uY29sbGVjdGlvblJlZi5jdXJyZW50O2lmKCF3KXJldHVybltdO2NvbnN0IHY9QXJyYXkuZnJvbSh3LnF1ZXJ5U2VsZWN0b3JBbGwoYFske2N9XWApKTtyZXR1cm4gQXJyYXkuZnJvbShtLml0ZW1NYXAudmFsdWVzKCkpLnNvcnQoKFMsRSk9PnYuaW5kZXhPZihTLnJlZi5jdXJyZW50KS12LmluZGV4T2YoRS5yZWYuY3VycmVudCkpfSxbbS5jb2xsZWN0aW9uUmVmLG0uaXRlbU1hcF0pfXJldHVyblt7UHJvdmlkZXI6bCxTbG90OmEsSXRlbVNsb3Q6ZH0sZixyXX1mdW5jdGlvbiBwTShlLHQ9Z2xvYmFsVGhpcz09bnVsbD92b2lkIDA6Z2xvYmFsVGhpcy5kb2N1bWVudCl7Y29uc3Qgbj1lbihlKTtwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IHI9aT0+e2kua2V5PT09IkVzY2FwZSImJm4oaSl9O3JldHVybiB0LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHIpLCgpPT50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHIpfSxbbix0XSl9Y29uc3Qgem09ImRpc21pc3NhYmxlTGF5ZXIudXBkYXRlIixtTT0iZGlzbWlzc2FibGVMYXllci5wb2ludGVyRG93bk91dHNpZGUiLGdNPSJkaXNtaXNzYWJsZUxheWVyLmZvY3VzT3V0c2lkZSI7bGV0IFJ4O2NvbnN0IHZNPXAuY3JlYXRlQ29udGV4dCh7bGF5ZXJzOm5ldyBTZXQsbGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQ6bmV3IFNldCxicmFuY2hlczpuZXcgU2V0fSkseU09cC5mb3J3YXJkUmVmKChlLHQpPT57dmFyIG47Y29uc3R7ZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzOnI9ITEsb25Fc2NhcGVLZXlEb3duOmksb25Qb2ludGVyRG93bk91dHNpZGU6byxvbkZvY3VzT3V0c2lkZTpsLG9uSW50ZXJhY3RPdXRzaWRlOnMsb25EaXNtaXNzOmEsLi4udX09ZSxjPXAudXNlQ29udGV4dCh2TSksW2QsZl09cC51c2VTdGF0ZShudWxsKSxoPShuPWQ9PW51bGw/dm9pZCAwOmQub3duZXJEb2N1bWVudCkhPT1udWxsJiZuIT09dm9pZCAwP246Z2xvYmFsVGhpcz09bnVsbD92b2lkIDA6Z2xvYmFsVGhpcy5kb2N1bWVudCxbLG1dPXAudXNlU3RhdGUoe30pLGc9c3QodCxUPT5mKFQpKSx3PUFycmF5LmZyb20oYy5sYXllcnMpLFt2XT1bLi4uYy5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZF0uc2xpY2UoLTEpLHk9dy5pbmRleE9mKHYpLF89ZD93LmluZGV4T2YoZCk6LTEsUz1jLmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLnNpemU+MCxFPV8+PXksJD14TShUPT57Y29uc3QgTj1ULnRhcmdldCxSPVsuLi5jLmJyYW5jaGVzXS5zb21lKEQ9PkQuY29udGFpbnMoTikpOyFFfHxSfHwobz09bnVsbHx8byhUKSxzPT1udWxsfHxzKFQpLFQuZGVmYXVsdFByZXZlbnRlZHx8YT09bnVsbHx8YSgpKX0saCksQz1fTShUPT57Y29uc3QgTj1ULnRhcmdldDtbLi4uYy5icmFuY2hlc10uc29tZShEPT5ELmNvbnRhaW5zKE4pKXx8KGw9PW51bGx8fGwoVCkscz09bnVsbHx8cyhUKSxULmRlZmF1bHRQcmV2ZW50ZWR8fGE9PW51bGx8fGEoKSl9LGgpO3JldHVybiBwTShUPT57Xz09PWMubGF5ZXJzLnNpemUtMSYmKGk9PW51bGx8fGkoVCksIVQuZGVmYXVsdFByZXZlbnRlZCYmYSYmKFQucHJldmVudERlZmF1bHQoKSxhKCkpKX0saCkscC51c2VFZmZlY3QoKCk9PntpZihkKXJldHVybiByJiYoYy5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5zaXplPT09MCYmKFJ4PWguYm9keS5zdHlsZS5wb2ludGVyRXZlbnRzLGguYm9keS5zdHlsZS5wb2ludGVyRXZlbnRzPSJub25lIiksYy5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5hZGQoZCkpLGMubGF5ZXJzLmFkZChkKSxPeCgpLCgpPT57ciYmYy5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5zaXplPT09MSYmKGguYm9keS5zdHlsZS5wb2ludGVyRXZlbnRzPVJ4KX19LFtkLGgscixjXSkscC51c2VFZmZlY3QoKCk9PigpPT57ZCYmKGMubGF5ZXJzLmRlbGV0ZShkKSxjLmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLmRlbGV0ZShkKSxPeCgpKX0sW2QsY10pLHAudXNlRWZmZWN0KCgpPT57Y29uc3QgVD0oKT0+bSh7fSk7cmV0dXJuIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoem0sVCksKCk9PmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoem0sVCl9LFtdKSxwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHt9LHUse3JlZjpnLHN0eWxlOntwb2ludGVyRXZlbnRzOlM/RT8iYXV0byI6Im5vbmUiOnZvaWQgMCwuLi5lLnN0eWxlfSxvbkZvY3VzQ2FwdHVyZTpudChlLm9uRm9jdXNDYXB0dXJlLEMub25Gb2N1c0NhcHR1cmUpLG9uQmx1ckNhcHR1cmU6bnQoZS5vbkJsdXJDYXB0dXJlLEMub25CbHVyQ2FwdHVyZSksb25Qb2ludGVyRG93bkNhcHR1cmU6bnQoZS5vblBvaW50ZXJEb3duQ2FwdHVyZSwkLm9uUG9pbnRlckRvd25DYXB0dXJlKX0pKX0pO2Z1bmN0aW9uIHhNKGUsdD1nbG9iYWxUaGlzPT1udWxsP3ZvaWQgMDpnbG9iYWxUaGlzLmRvY3VtZW50KXtjb25zdCBuPWVuKGUpLHI9cC51c2VSZWYoITEpLGk9cC51c2VSZWYoKCk9Pnt9KTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBvPXM9PntpZihzLnRhcmdldCYmIXIuY3VycmVudCl7bGV0IGM9ZnVuY3Rpb24oKXtMQyhtTSxuLHUse2Rpc2NyZXRlOiEwfSl9O3ZhciBhPWM7Y29uc3QgdT17b3JpZ2luYWxFdmVudDpzfTtzLnBvaW50ZXJUeXBlPT09InRvdWNoIj8odC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsaS5jdXJyZW50KSxpLmN1cnJlbnQ9Yyx0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixpLmN1cnJlbnQse29uY2U6ITB9KSk6YygpfWVsc2UgdC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsaS5jdXJyZW50KTtyLmN1cnJlbnQ9ITF9LGw9d2luZG93LnNldFRpbWVvdXQoKCk9Pnt0LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIixvKX0sMCk7cmV0dXJuKCk9Pnt3aW5kb3cuY2xlYXJUaW1lb3V0KGwpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcmRvd24iLG8pLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLGkuY3VycmVudCl9fSxbdCxuXSkse29uUG9pbnRlckRvd25DYXB0dXJlOigpPT5yLmN1cnJlbnQ9ITB9fWZ1bmN0aW9uIF9NKGUsdD1nbG9iYWxUaGlzPT1udWxsP3ZvaWQgMDpnbG9iYWxUaGlzLmRvY3VtZW50KXtjb25zdCBuPWVuKGUpLHI9cC51c2VSZWYoITEpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IGk9bz0+e28udGFyZ2V0JiYhci5jdXJyZW50JiZMQyhnTSxuLHtvcmlnaW5hbEV2ZW50Om99LHtkaXNjcmV0ZTohMX0pfTtyZXR1cm4gdC5hZGRFdmVudExpc3RlbmVyKCJmb2N1c2luIixpKSwoKT0+dC5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1c2luIixpKX0sW3Qsbl0pLHtvbkZvY3VzQ2FwdHVyZTooKT0+ci5jdXJyZW50PSEwLG9uQmx1ckNhcHR1cmU6KCk9PnIuY3VycmVudD0hMX19ZnVuY3Rpb24gT3goKXtjb25zdCBlPW5ldyBDdXN0b21FdmVudCh6bSk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChlKX1mdW5jdGlvbiBMQyhlLHQsbix7ZGlzY3JldGU6cn0pe2NvbnN0IGk9bi5vcmlnaW5hbEV2ZW50LnRhcmdldCxvPW5ldyBDdXN0b21FdmVudChlLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITAsZGV0YWlsOm59KTt0JiZpLmFkZEV2ZW50TGlzdGVuZXIoZSx0LHtvbmNlOiEwfSkscj9xTihpLG8pOmkuZGlzcGF0Y2hFdmVudChvKX1sZXQgQmg9MDtmdW5jdGlvbiB3TSgpe3AudXNlRWZmZWN0KCgpPT57dmFyIGUsdDtjb25zdCBuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLXJhZGl4LWZvY3VzLWd1YXJkXSIpO3JldHVybiBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50RWxlbWVudCgiYWZ0ZXJiZWdpbiIsKGU9blswXSkhPT1udWxsJiZlIT09dm9pZCAwP2U6UHgoKSksZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsKHQ9blsxXSkhPT1udWxsJiZ0IT09dm9pZCAwP3Q6UHgoKSksQmgrKywoKT0+e0JoPT09MSYmZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtcmFkaXgtZm9jdXMtZ3VhcmRdIikuZm9yRWFjaChyPT5yLnJlbW92ZSgpKSxCaC0tfX0sW10pfWZ1bmN0aW9uIFB4KCl7Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7cmV0dXJuIGUuc2V0QXR0cmlidXRlKCJkYXRhLXJhZGl4LWZvY3VzLWd1YXJkIiwiIiksZS50YWJJbmRleD0wLGUuc3R5bGUuY3NzVGV4dD0ib3V0bGluZTogbm9uZTsgb3BhY2l0eTogMDsgcG9zaXRpb246IGZpeGVkOyBwb2ludGVyLWV2ZW50czogbm9uZSIsZX1jb25zdCBVaD0iZm9jdXNTY29wZS5hdXRvRm9jdXNPbk1vdW50IixXaD0iZm9jdXNTY29wZS5hdXRvRm9jdXNPblVubW91bnQiLEF4PXtidWJibGVzOiExLGNhbmNlbGFibGU6ITB9LFNNPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e2xvb3A6bj0hMSx0cmFwcGVkOnI9ITEsb25Nb3VudEF1dG9Gb2N1czppLG9uVW5tb3VudEF1dG9Gb2N1czpvLC4uLmx9PWUsW3MsYV09cC51c2VTdGF0ZShudWxsKSx1PWVuKGkpLGM9ZW4obyksZD1wLnVzZVJlZihudWxsKSxmPXN0KHQsZz0+YShnKSksaD1wLnVzZVJlZih7cGF1c2VkOiExLHBhdXNlKCl7dGhpcy5wYXVzZWQ9ITB9LHJlc3VtZSgpe3RoaXMucGF1c2VkPSExfX0pLmN1cnJlbnQ7cC51c2VFZmZlY3QoKCk9PntpZihyKXtsZXQgeT1mdW5jdGlvbigkKXtpZihoLnBhdXNlZHx8IXMpcmV0dXJuO2NvbnN0IEM9JC50YXJnZXQ7cy5jb250YWlucyhDKT9kLmN1cnJlbnQ9QzpPaShkLmN1cnJlbnQse3NlbGVjdDohMH0pfSxfPWZ1bmN0aW9uKCQpe2lmKGgucGF1c2VkfHwhcylyZXR1cm47Y29uc3QgQz0kLnJlbGF0ZWRUYXJnZXQ7QyE9PW51bGwmJihzLmNvbnRhaW5zKEMpfHxPaShkLmN1cnJlbnQse3NlbGVjdDohMH0pKX0sUz1mdW5jdGlvbigkKXtpZihkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09ZG9jdW1lbnQuYm9keSlmb3IoY29uc3QgVCBvZiAkKVQucmVtb3ZlZE5vZGVzLmxlbmd0aD4wJiZPaShzKX07dmFyIGc9eSx3PV8sdj1TO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzaW4iLHkpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZvY3Vzb3V0IixfKTtjb25zdCBFPW5ldyBNdXRhdGlvbk9ic2VydmVyKFMpO3JldHVybiBzJiZFLm9ic2VydmUocyx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSwoKT0+e2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImZvY3VzaW4iLHkpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImZvY3Vzb3V0IixfKSxFLmRpc2Nvbm5lY3QoKX19fSxbcixzLGgucGF1c2VkXSkscC51c2VFZmZlY3QoKCk9PntpZihzKXtEeC5hZGQoaCk7Y29uc3QgZz1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2lmKCFzLmNvbnRhaW5zKGcpKXtjb25zdCB2PW5ldyBDdXN0b21FdmVudChVaCxBeCk7cy5hZGRFdmVudExpc3RlbmVyKFVoLHUpLHMuZGlzcGF0Y2hFdmVudCh2KSx2LmRlZmF1bHRQcmV2ZW50ZWR8fChFTShUTShJQyhzKSkse3NlbGVjdDohMH0pLGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1nJiZPaShzKSl9cmV0dXJuKCk9PntzLnJlbW92ZUV2ZW50TGlzdGVuZXIoVWgsdSksc2V0VGltZW91dCgoKT0+e2NvbnN0IHY9bmV3IEN1c3RvbUV2ZW50KFdoLEF4KTtzLmFkZEV2ZW50TGlzdGVuZXIoV2gsYykscy5kaXNwYXRjaEV2ZW50KHYpLHYuZGVmYXVsdFByZXZlbnRlZHx8T2koZz8/ZG9jdW1lbnQuYm9keSx7c2VsZWN0OiEwfSkscy5yZW1vdmVFdmVudExpc3RlbmVyKFdoLGMpLER4LnJlbW92ZShoKX0sMCl9fX0sW3MsdSxjLGhdKTtjb25zdCBtPXAudXNlQ2FsbGJhY2soZz0+e2lmKCFuJiYhcnx8aC5wYXVzZWQpcmV0dXJuO2NvbnN0IHc9Zy5rZXk9PT0iVGFiIiYmIWcuYWx0S2V5JiYhZy5jdHJsS2V5JiYhZy5tZXRhS2V5LHY9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZih3JiZ2KXtjb25zdCB5PWcuY3VycmVudFRhcmdldCxbXyxTXT1DTSh5KTtfJiZTPyFnLnNoaWZ0S2V5JiZ2PT09Uz8oZy5wcmV2ZW50RGVmYXVsdCgpLG4mJk9pKF8se3NlbGVjdDohMH0pKTpnLnNoaWZ0S2V5JiZ2PT09XyYmKGcucHJldmVudERlZmF1bHQoKSxuJiZPaShTLHtzZWxlY3Q6ITB9KSk6dj09PXkmJmcucHJldmVudERlZmF1bHQoKX19LFtuLHIsaC5wYXVzZWRdKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KEtlLmRpdixpZSh7dGFiSW5kZXg6LTF9LGwse3JlZjpmLG9uS2V5RG93bjptfSkpfSk7ZnVuY3Rpb24gRU0oZSx7c2VsZWN0OnQ9ITF9PXt9KXtjb25zdCBuPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7Zm9yKGNvbnN0IHIgb2YgZSlpZihPaShyLHtzZWxlY3Q6dH0pLGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQhPT1uKXJldHVybn1mdW5jdGlvbiBDTShlKXtjb25zdCB0PUlDKGUpLG49TXgodCxlKSxyPU14KHQucmV2ZXJzZSgpLGUpO3JldHVybltuLHJdfWZ1bmN0aW9uIElDKGUpe2NvbnN0IHQ9W10sbj1kb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGUsTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQse2FjY2VwdE5vZGU6cj0+e2NvbnN0IGk9ci50YWdOYW1lPT09IklOUFVUIiYmci50eXBlPT09ImhpZGRlbiI7cmV0dXJuIHIuZGlzYWJsZWR8fHIuaGlkZGVufHxpP05vZGVGaWx0ZXIuRklMVEVSX1NLSVA6ci50YWJJbmRleD49MD9Ob2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQ6Tm9kZUZpbHRlci5GSUxURVJfU0tJUH19KTtmb3IoO24ubmV4dE5vZGUoKTspdC5wdXNoKG4uY3VycmVudE5vZGUpO3JldHVybiB0fWZ1bmN0aW9uIE14KGUsdCl7Zm9yKGNvbnN0IG4gb2YgZSlpZigha00obix7dXBUbzp0fSkpcmV0dXJuIG59ZnVuY3Rpb24ga00oZSx7dXBUbzp0fSl7aWYoZ2V0Q29tcHV0ZWRTdHlsZShlKS52aXNpYmlsaXR5PT09ImhpZGRlbiIpcmV0dXJuITA7Zm9yKDtlOyl7aWYodCE9PXZvaWQgMCYmZT09PXQpcmV0dXJuITE7aWYoZ2V0Q29tcHV0ZWRTdHlsZShlKS5kaXNwbGF5PT09Im5vbmUiKXJldHVybiEwO2U9ZS5wYXJlbnRFbGVtZW50fXJldHVybiExfWZ1bmN0aW9uICRNKGUpe3JldHVybiBlIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCYmInNlbGVjdCJpbiBlfWZ1bmN0aW9uIE9pKGUse3NlbGVjdDp0PSExfT17fSl7aWYoZSYmZS5mb2N1cyl7Y29uc3Qgbj1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2UuZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KSxlIT09biYmJE0oZSkmJnQmJmUuc2VsZWN0KCl9fWNvbnN0IER4PWJNKCk7ZnVuY3Rpb24gYk0oKXtsZXQgZT1bXTtyZXR1cm57YWRkKHQpe2NvbnN0IG49ZVswXTt0IT09biYmKG49PW51bGx8fG4ucGF1c2UoKSksZT1MeChlLHQpLGUudW5zaGlmdCh0KX0scmVtb3ZlKHQpe3ZhciBuO2U9THgoZSx0KSwobj1lWzBdKT09PW51bGx8fG49PT12b2lkIDB8fG4ucmVzdW1lKCl9fX1mdW5jdGlvbiBMeChlLHQpe2NvbnN0IG49Wy4uLmVdLHI9bi5pbmRleE9mKHQpO3JldHVybiByIT09LTEmJm4uc3BsaWNlKHIsMSksbn1mdW5jdGlvbiBUTShlKXtyZXR1cm4gZS5maWx0ZXIodD0+dC50YWdOYW1lIT09IkEiKX1jb25zdCBOTT1QXy51c2VJZHx8KCgpPT57fSk7bGV0IFJNPTA7ZnVuY3Rpb24gamYoZSl7Y29uc3RbdCxuXT1wLnVzZVN0YXRlKE5NKCkpO3JldHVybiBVbigoKT0+e2V8fG4ocj0+cj8/U3RyaW5nKFJNKyspKX0sW2VdKSxlfHwodD9gcmFkaXgtJHt0fWA6IiIpfWNvbnN0IE9NPVsidG9wIiwicmlnaHQiLCJib3R0b20iLCJsZWZ0Il0sZm89TWF0aC5taW4sRG49TWF0aC5tYXgsWWQ9TWF0aC5yb3VuZCxTYz1NYXRoLmZsb29yLGhvPWU9Pih7eDplLHk6ZX0pLFBNPXtsZWZ0OiJyaWdodCIscmlnaHQ6ImxlZnQiLGJvdHRvbToidG9wIix0b3A6ImJvdHRvbSJ9LEFNPXtzdGFydDoiZW5kIixlbmQ6InN0YXJ0In07ZnVuY3Rpb24gRm0oZSx0LG4pe3JldHVybiBEbihlLGZvKHQsbikpfWZ1bmN0aW9uIGdpKGUsdCl7cmV0dXJuIHR5cGVvZiBlPT0iZnVuY3Rpb24iP2UodCk6ZX1mdW5jdGlvbiB2aShlKXtyZXR1cm4gZS5zcGxpdCgiLSIpWzBdfWZ1bmN0aW9uIExzKGUpe3JldHVybiBlLnNwbGl0KCItIilbMV19ZnVuY3Rpb24genYoZSl7cmV0dXJuIGU9PT0ieCI/InkiOiJ4In1mdW5jdGlvbiBGdihlKXtyZXR1cm4gZT09PSJ5Ij8iaGVpZ2h0Ijoid2lkdGgifWZ1bmN0aW9uIElzKGUpe3JldHVyblsidG9wIiwiYm90dG9tIl0uaW5jbHVkZXModmkoZSkpPyJ5IjoieCJ9ZnVuY3Rpb24gQnYoZSl7cmV0dXJuIHp2KElzKGUpKX1mdW5jdGlvbiBNTShlLHQsbil7bj09PXZvaWQgMCYmKG49ITEpO2NvbnN0IHI9THMoZSksaT1CdihlKSxvPUZ2KGkpO2xldCBsPWk9PT0ieCI/cj09PShuPyJlbmQiOiJzdGFydCIpPyJyaWdodCI6ImxlZnQiOnI9PT0ic3RhcnQiPyJib3R0b20iOiJ0b3AiO3JldHVybiB0LnJlZmVyZW5jZVtvXT50LmZsb2F0aW5nW29dJiYobD1YZChsKSksW2wsWGQobCldfWZ1bmN0aW9uIERNKGUpe2NvbnN0IHQ9WGQoZSk7cmV0dXJuW0JtKGUpLHQsQm0odCldfWZ1bmN0aW9uIEJtKGUpe3JldHVybiBlLnJlcGxhY2UoL3N0YXJ0fGVuZC9nLHQ9PkFNW3RdKX1mdW5jdGlvbiBMTShlLHQsbil7Y29uc3Qgcj1bImxlZnQiLCJyaWdodCJdLGk9WyJyaWdodCIsImxlZnQiXSxvPVsidG9wIiwiYm90dG9tIl0sbD1bImJvdHRvbSIsInRvcCJdO3N3aXRjaChlKXtjYXNlInRvcCI6Y2FzZSJib3R0b20iOnJldHVybiBuP3Q/aTpyOnQ/cjppO2Nhc2UibGVmdCI6Y2FzZSJyaWdodCI6cmV0dXJuIHQ/bzpsO2RlZmF1bHQ6cmV0dXJuW119fWZ1bmN0aW9uIElNKGUsdCxuLHIpe2NvbnN0IGk9THMoZSk7bGV0IG89TE0odmkoZSksbj09PSJzdGFydCIscik7cmV0dXJuIGkmJihvPW8ubWFwKGw9PmwrIi0iK2kpLHQmJihvPW8uY29uY2F0KG8ubWFwKEJtKSkpKSxvfWZ1bmN0aW9uIFhkKGUpe3JldHVybiBlLnJlcGxhY2UoL2xlZnR8cmlnaHR8Ym90dG9tfHRvcC9nLHQ9PlBNW3RdKX1mdW5jdGlvbiBqTShlKXtyZXR1cm57dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjAsLi4uZX19ZnVuY3Rpb24gakMoZSl7cmV0dXJuIHR5cGVvZiBlIT0ibnVtYmVyIj9qTShlKTp7dG9wOmUscmlnaHQ6ZSxib3R0b206ZSxsZWZ0OmV9fWZ1bmN0aW9uIFFkKGUpe3JldHVybnsuLi5lLHRvcDplLnksbGVmdDplLngscmlnaHQ6ZS54K2Uud2lkdGgsYm90dG9tOmUueStlLmhlaWdodH19ZnVuY3Rpb24gSXgoZSx0LG4pe2xldHtyZWZlcmVuY2U6cixmbG9hdGluZzppfT1lO2NvbnN0IG89SXModCksbD1Cdih0KSxzPUZ2KGwpLGE9dmkodCksdT1vPT09InkiLGM9ci54K3Iud2lkdGgvMi1pLndpZHRoLzIsZD1yLnkrci5oZWlnaHQvMi1pLmhlaWdodC8yLGY9cltzXS8yLWlbc10vMjtsZXQgaDtzd2l0Y2goYSl7Y2FzZSJ0b3AiOmg9e3g6Yyx5OnIueS1pLmhlaWdodH07YnJlYWs7Y2FzZSJib3R0b20iOmg9e3g6Yyx5OnIueStyLmhlaWdodH07YnJlYWs7Y2FzZSJyaWdodCI6aD17eDpyLngrci53aWR0aCx5OmR9O2JyZWFrO2Nhc2UibGVmdCI6aD17eDpyLngtaS53aWR0aCx5OmR9O2JyZWFrO2RlZmF1bHQ6aD17eDpyLngseTpyLnl9fXN3aXRjaChMcyh0KSl7Y2FzZSJzdGFydCI6aFtsXS09ZioobiYmdT8tMToxKTticmVhaztjYXNlImVuZCI6aFtsXSs9ZioobiYmdT8tMToxKTticmVha31yZXR1cm4gaH1jb25zdCB6TT1hc3luYyhlLHQsbik9Pntjb25zdHtwbGFjZW1lbnQ6cj0iYm90dG9tIixzdHJhdGVneTppPSJhYnNvbHV0ZSIsbWlkZGxld2FyZTpvPVtdLHBsYXRmb3JtOmx9PW4scz1vLmZpbHRlcihCb29sZWFuKSxhPWF3YWl0KGwuaXNSVEw9PW51bGw/dm9pZCAwOmwuaXNSVEwodCkpO2xldCB1PWF3YWl0IGwuZ2V0RWxlbWVudFJlY3RzKHtyZWZlcmVuY2U6ZSxmbG9hdGluZzp0LHN0cmF0ZWd5Oml9KSx7eDpjLHk6ZH09SXgodSxyLGEpLGY9cixoPXt9LG09MDtmb3IobGV0IGc9MDtnPHMubGVuZ3RoO2crKyl7Y29uc3R7bmFtZTp3LGZuOnZ9PXNbZ10se3g6eSx5Ol8sZGF0YTpTLHJlc2V0OkV9PWF3YWl0IHYoe3g6Yyx5OmQsaW5pdGlhbFBsYWNlbWVudDpyLHBsYWNlbWVudDpmLHN0cmF0ZWd5OmksbWlkZGxld2FyZURhdGE6aCxyZWN0czp1LHBsYXRmb3JtOmwsZWxlbWVudHM6e3JlZmVyZW5jZTplLGZsb2F0aW5nOnR9fSk7aWYoYz15Pz9jLGQ9Xz8/ZCxoPXsuLi5oLFt3XTp7Li4uaFt3XSwuLi5TfX0sRSYmbTw9NTApe20rKyx0eXBlb2YgRT09Im9iamVjdCImJihFLnBsYWNlbWVudCYmKGY9RS5wbGFjZW1lbnQpLEUucmVjdHMmJih1PUUucmVjdHM9PT0hMD9hd2FpdCBsLmdldEVsZW1lbnRSZWN0cyh7cmVmZXJlbmNlOmUsZmxvYXRpbmc6dCxzdHJhdGVneTppfSk6RS5yZWN0cykse3g6Yyx5OmR9PUl4KHUsZixhKSksZz0tMTtjb250aW51ZX19cmV0dXJue3g6Yyx5OmQscGxhY2VtZW50OmYsc3RyYXRlZ3k6aSxtaWRkbGV3YXJlRGF0YTpofX07YXN5bmMgZnVuY3Rpb24gRXUoZSx0KXt2YXIgbjt0PT09dm9pZCAwJiYodD17fSk7Y29uc3R7eDpyLHk6aSxwbGF0Zm9ybTpvLHJlY3RzOmwsZWxlbWVudHM6cyxzdHJhdGVneTphfT1lLHtib3VuZGFyeTp1PSJjbGlwcGluZ0FuY2VzdG9ycyIscm9vdEJvdW5kYXJ5OmM9InZpZXdwb3J0IixlbGVtZW50Q29udGV4dDpkPSJmbG9hdGluZyIsYWx0Qm91bmRhcnk6Zj0hMSxwYWRkaW5nOmg9MH09Z2kodCxlKSxtPWpDKGgpLHc9c1tmP2Q9PT0iZmxvYXRpbmciPyJyZWZlcmVuY2UiOiJmbG9hdGluZyI6ZF0sdj1RZChhd2FpdCBvLmdldENsaXBwaW5nUmVjdCh7ZWxlbWVudDoobj1hd2FpdChvLmlzRWxlbWVudD09bnVsbD92b2lkIDA6by5pc0VsZW1lbnQodykpKT09bnVsbHx8bj93OncuY29udGV4dEVsZW1lbnR8fGF3YWl0KG8uZ2V0RG9jdW1lbnRFbGVtZW50PT1udWxsP3ZvaWQgMDpvLmdldERvY3VtZW50RWxlbWVudChzLmZsb2F0aW5nKSksYm91bmRhcnk6dSxyb290Qm91bmRhcnk6YyxzdHJhdGVneTphfSkpLHk9ZD09PSJmbG9hdGluZyI/ey4uLmwuZmxvYXRpbmcseDpyLHk6aX06bC5yZWZlcmVuY2UsXz1hd2FpdChvLmdldE9mZnNldFBhcmVudD09bnVsbD92b2lkIDA6by5nZXRPZmZzZXRQYXJlbnQocy5mbG9hdGluZykpLFM9YXdhaXQoby5pc0VsZW1lbnQ9PW51bGw/dm9pZCAwOm8uaXNFbGVtZW50KF8pKT9hd2FpdChvLmdldFNjYWxlPT1udWxsP3ZvaWQgMDpvLmdldFNjYWxlKF8pKXx8e3g6MSx5OjF9Ont4OjEseToxfSxFPVFkKG8uY29udmVydE9mZnNldFBhcmVudFJlbGF0aXZlUmVjdFRvVmlld3BvcnRSZWxhdGl2ZVJlY3Q/YXdhaXQgby5jb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdCh7cmVjdDp5LG9mZnNldFBhcmVudDpfLHN0cmF0ZWd5OmF9KTp5KTtyZXR1cm57dG9wOih2LnRvcC1FLnRvcCttLnRvcCkvUy55LGJvdHRvbTooRS5ib3R0b20tdi5ib3R0b20rbS5ib3R0b20pL1MueSxsZWZ0Oih2LmxlZnQtRS5sZWZ0K20ubGVmdCkvUy54LHJpZ2h0OihFLnJpZ2h0LXYucmlnaHQrbS5yaWdodCkvUy54fX1jb25zdCBqeD1lPT4oe25hbWU6ImFycm93IixvcHRpb25zOmUsYXN5bmMgZm4odCl7Y29uc3R7eDpuLHk6cixwbGFjZW1lbnQ6aSxyZWN0czpvLHBsYXRmb3JtOmwsZWxlbWVudHM6cyxtaWRkbGV3YXJlRGF0YTphfT10LHtlbGVtZW50OnUscGFkZGluZzpjPTB9PWdpKGUsdCl8fHt9O2lmKHU9PW51bGwpcmV0dXJue307Y29uc3QgZD1qQyhjKSxmPXt4Om4seTpyfSxoPUJ2KGkpLG09RnYoaCksZz1hd2FpdCBsLmdldERpbWVuc2lvbnModSksdz1oPT09InkiLHY9dz8idG9wIjoibGVmdCIseT13PyJib3R0b20iOiJyaWdodCIsXz13PyJjbGllbnRIZWlnaHQiOiJjbGllbnRXaWR0aCIsUz1vLnJlZmVyZW5jZVttXStvLnJlZmVyZW5jZVtoXS1mW2hdLW8uZmxvYXRpbmdbbV0sRT1mW2hdLW8ucmVmZXJlbmNlW2hdLCQ9YXdhaXQobC5nZXRPZmZzZXRQYXJlbnQ9PW51bGw/dm9pZCAwOmwuZ2V0T2Zmc2V0UGFyZW50KHUpKTtsZXQgQz0kPyRbX106MDsoIUN8fCFhd2FpdChsLmlzRWxlbWVudD09bnVsbD92b2lkIDA6bC5pc0VsZW1lbnQoJCkpKSYmKEM9cy5mbG9hdGluZ1tfXXx8by5mbG9hdGluZ1ttXSk7Y29uc3QgVD1TLzItRS8yLE49Qy8yLWdbbV0vMi0xLFI9Zm8oZFt2XSxOKSxEPWZvKGRbeV0sTiksRj1SLHNlPUMtZ1ttXS1ELFY9Qy8yLWdbbV0vMitULEs9Rm0oRixWLHNlKSxPPSFhLmFycm93JiZMcyhpKSE9bnVsbCYmViE9SyYmby5yZWZlcmVuY2VbbV0vMi0oVjxGP1I6RCktZ1ttXS8yPDAsQT1PP1Y8Rj9WLUY6Vi1zZTowO3JldHVybntbaF06ZltoXStBLGRhdGE6e1toXTpLLGNlbnRlck9mZnNldDpWLUstQSwuLi5PJiZ7YWxpZ25tZW50T2Zmc2V0OkF9fSxyZXNldDpPfX19KSxGTT1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOiJmbGlwIixvcHRpb25zOmUsYXN5bmMgZm4odCl7dmFyIG4scjtjb25zdHtwbGFjZW1lbnQ6aSxtaWRkbGV3YXJlRGF0YTpvLHJlY3RzOmwsaW5pdGlhbFBsYWNlbWVudDpzLHBsYXRmb3JtOmEsZWxlbWVudHM6dX09dCx7bWFpbkF4aXM6Yz0hMCxjcm9zc0F4aXM6ZD0hMCxmYWxsYmFja1BsYWNlbWVudHM6ZixmYWxsYmFja1N0cmF0ZWd5Omg9ImJlc3RGaXQiLGZhbGxiYWNrQXhpc1NpZGVEaXJlY3Rpb246bT0ibm9uZSIsZmxpcEFsaWdubWVudDpnPSEwLC4uLnd9PWdpKGUsdCk7aWYoKG49by5hcnJvdykhPW51bGwmJm4uYWxpZ25tZW50T2Zmc2V0KXJldHVybnt9O2NvbnN0IHY9dmkoaSkseT12aShzKT09PXMsXz1hd2FpdChhLmlzUlRMPT1udWxsP3ZvaWQgMDphLmlzUlRMKHUuZmxvYXRpbmcpKSxTPWZ8fCh5fHwhZz9bWGQocyldOkRNKHMpKTshZiYmbSE9PSJub25lIiYmUy5wdXNoKC4uLklNKHMsZyxtLF8pKTtjb25zdCBFPVtzLC4uLlNdLCQ9YXdhaXQgRXUodCx3KSxDPVtdO2xldCBUPSgocj1vLmZsaXApPT1udWxsP3ZvaWQgMDpyLm92ZXJmbG93cyl8fFtdO2lmKGMmJkMucHVzaCgkW3ZdKSxkKXtjb25zdCBGPU1NKGksbCxfKTtDLnB1c2goJFtGWzBdXSwkW0ZbMV1dKX1pZihUPVsuLi5ULHtwbGFjZW1lbnQ6aSxvdmVyZmxvd3M6Q31dLCFDLmV2ZXJ5KEY9PkY8PTApKXt2YXIgTixSO2NvbnN0IEY9KCgoTj1vLmZsaXApPT1udWxsP3ZvaWQgMDpOLmluZGV4KXx8MCkrMSxzZT1FW0ZdO2lmKHNlKXJldHVybntkYXRhOntpbmRleDpGLG92ZXJmbG93czpUfSxyZXNldDp7cGxhY2VtZW50OnNlfX07bGV0IFY9KFI9VC5maWx0ZXIoSz0+Sy5vdmVyZmxvd3NbMF08PTApLnNvcnQoKEssTyk9Pksub3ZlcmZsb3dzWzFdLU8ub3ZlcmZsb3dzWzFdKVswXSk9PW51bGw/dm9pZCAwOlIucGxhY2VtZW50O2lmKCFWKXN3aXRjaChoKXtjYXNlImJlc3RGaXQiOnt2YXIgRDtjb25zdCBLPShEPVQubWFwKE89PltPLnBsYWNlbWVudCxPLm92ZXJmbG93cy5maWx0ZXIoQT0+QT4wKS5yZWR1Y2UoKEEsayk9PkEraywwKV0pLnNvcnQoKE8sQSk9Pk9bMV0tQVsxXSlbMF0pPT1udWxsP3ZvaWQgMDpEWzBdO0smJihWPUspO2JyZWFrfWNhc2UiaW5pdGlhbFBsYWNlbWVudCI6Vj1zO2JyZWFrfWlmKGkhPT1WKXJldHVybntyZXNldDp7cGxhY2VtZW50OlZ9fX1yZXR1cm57fX19fTtmdW5jdGlvbiB6eChlLHQpe3JldHVybnt0b3A6ZS50b3AtdC5oZWlnaHQscmlnaHQ6ZS5yaWdodC10LndpZHRoLGJvdHRvbTplLmJvdHRvbS10LmhlaWdodCxsZWZ0OmUubGVmdC10LndpZHRofX1mdW5jdGlvbiBGeChlKXtyZXR1cm4gT00uc29tZSh0PT5lW3RdPj0wKX1jb25zdCBCTT1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOiJoaWRlIixvcHRpb25zOmUsYXN5bmMgZm4odCl7Y29uc3R7cmVjdHM6bn09dCx7c3RyYXRlZ3k6cj0icmVmZXJlbmNlSGlkZGVuIiwuLi5pfT1naShlLHQpO3N3aXRjaChyKXtjYXNlInJlZmVyZW5jZUhpZGRlbiI6e2NvbnN0IG89YXdhaXQgRXUodCx7Li4uaSxlbGVtZW50Q29udGV4dDoicmVmZXJlbmNlIn0pLGw9engobyxuLnJlZmVyZW5jZSk7cmV0dXJue2RhdGE6e3JlZmVyZW5jZUhpZGRlbk9mZnNldHM6bCxyZWZlcmVuY2VIaWRkZW46RngobCl9fX1jYXNlImVzY2FwZWQiOntjb25zdCBvPWF3YWl0IEV1KHQsey4uLmksYWx0Qm91bmRhcnk6ITB9KSxsPXp4KG8sbi5mbG9hdGluZyk7cmV0dXJue2RhdGE6e2VzY2FwZWRPZmZzZXRzOmwsZXNjYXBlZDpGeChsKX19fWRlZmF1bHQ6cmV0dXJue319fX19O2FzeW5jIGZ1bmN0aW9uIFVNKGUsdCl7Y29uc3R7cGxhY2VtZW50Om4scGxhdGZvcm06cixlbGVtZW50czppfT1lLG89YXdhaXQoci5pc1JUTD09bnVsbD92b2lkIDA6ci5pc1JUTChpLmZsb2F0aW5nKSksbD12aShuKSxzPUxzKG4pLGE9SXMobik9PT0ieSIsdT1bImxlZnQiLCJ0b3AiXS5pbmNsdWRlcyhsKT8tMToxLGM9byYmYT8tMToxLGQ9Z2kodCxlKTtsZXR7bWFpbkF4aXM6Zixjcm9zc0F4aXM6aCxhbGlnbm1lbnRBeGlzOm19PXR5cGVvZiBkPT0ibnVtYmVyIj97bWFpbkF4aXM6ZCxjcm9zc0F4aXM6MCxhbGlnbm1lbnRBeGlzOm51bGx9OnttYWluQXhpczowLGNyb3NzQXhpczowLGFsaWdubWVudEF4aXM6bnVsbCwuLi5kfTtyZXR1cm4gcyYmdHlwZW9mIG09PSJudW1iZXIiJiYoaD1zPT09ImVuZCI/bSotMTptKSxhP3t4OmgqYyx5OmYqdX06e3g6Zip1LHk6aCpjfX1jb25zdCBXTT1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9MCkse25hbWU6Im9mZnNldCIsb3B0aW9uczplLGFzeW5jIGZuKHQpe2NvbnN0e3g6bix5OnJ9PXQsaT1hd2FpdCBVTSh0LGUpO3JldHVybnt4Om4raS54LHk6citpLnksZGF0YTppfX19fSxWTT1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOiJzaGlmdCIsb3B0aW9uczplLGFzeW5jIGZuKHQpe2NvbnN0e3g6bix5OnIscGxhY2VtZW50Oml9PXQse21haW5BeGlzOm89ITAsY3Jvc3NBeGlzOmw9ITEsbGltaXRlcjpzPXtmbjp3PT57bGV0e3g6dix5fT13O3JldHVybnt4OnYseX19fSwuLi5hfT1naShlLHQpLHU9e3g6bix5OnJ9LGM9YXdhaXQgRXUodCxhKSxkPUlzKHZpKGkpKSxmPXp2KGQpO2xldCBoPXVbZl0sbT11W2RdO2lmKG8pe2NvbnN0IHc9Zj09PSJ5Ij8idG9wIjoibGVmdCIsdj1mPT09InkiPyJib3R0b20iOiJyaWdodCIseT1oK2Nbd10sXz1oLWNbdl07aD1GbSh5LGgsXyl9aWYobCl7Y29uc3Qgdz1kPT09InkiPyJ0b3AiOiJsZWZ0Iix2PWQ9PT0ieSI/ImJvdHRvbSI6InJpZ2h0Iix5PW0rY1t3XSxfPW0tY1t2XTttPUZtKHksbSxfKX1jb25zdCBnPXMuZm4oey4uLnQsW2ZdOmgsW2RdOm19KTtyZXR1cm57Li4uZyxkYXRhOnt4OmcueC1uLHk6Zy55LXJ9fX19fSxITT1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtvcHRpb25zOmUsZm4odCl7Y29uc3R7eDpuLHk6cixwbGFjZW1lbnQ6aSxyZWN0czpvLG1pZGRsZXdhcmVEYXRhOmx9PXQse29mZnNldDpzPTAsbWFpbkF4aXM6YT0hMCxjcm9zc0F4aXM6dT0hMH09Z2koZSx0KSxjPXt4Om4seTpyfSxkPUlzKGkpLGY9enYoZCk7bGV0IGg9Y1tmXSxtPWNbZF07Y29uc3QgZz1naShzLHQpLHc9dHlwZW9mIGc9PSJudW1iZXIiP3ttYWluQXhpczpnLGNyb3NzQXhpczowfTp7bWFpbkF4aXM6MCxjcm9zc0F4aXM6MCwuLi5nfTtpZihhKXtjb25zdCBfPWY9PT0ieSI/ImhlaWdodCI6IndpZHRoIixTPW8ucmVmZXJlbmNlW2ZdLW8uZmxvYXRpbmdbX10rdy5tYWluQXhpcyxFPW8ucmVmZXJlbmNlW2ZdK28ucmVmZXJlbmNlW19dLXcubWFpbkF4aXM7aDxTP2g9UzpoPkUmJihoPUUpfWlmKHUpe3ZhciB2LHk7Y29uc3QgXz1mPT09InkiPyJ3aWR0aCI6ImhlaWdodCIsUz1bInRvcCIsImxlZnQiXS5pbmNsdWRlcyh2aShpKSksRT1vLnJlZmVyZW5jZVtkXS1vLmZsb2F0aW5nW19dKyhTJiYoKHY9bC5vZmZzZXQpPT1udWxsP3ZvaWQgMDp2W2RdKXx8MCkrKFM/MDp3LmNyb3NzQXhpcyksJD1vLnJlZmVyZW5jZVtkXStvLnJlZmVyZW5jZVtfXSsoUz8wOigoeT1sLm9mZnNldCk9PW51bGw/dm9pZCAwOnlbZF0pfHwwKS0oUz93LmNyb3NzQXhpczowKTttPEU/bT1FOm0+JCYmKG09JCl9cmV0dXJue1tmXTpoLFtkXTptfX19fSxLTT1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOiJzaXplIixvcHRpb25zOmUsYXN5bmMgZm4odCl7Y29uc3R7cGxhY2VtZW50Om4scmVjdHM6cixwbGF0Zm9ybTppLGVsZW1lbnRzOm99PXQse2FwcGx5Omw9KCk9Pnt9LC4uLnN9PWdpKGUsdCksYT1hd2FpdCBFdSh0LHMpLHU9dmkobiksYz1McyhuKSxkPUlzKG4pPT09InkiLHt3aWR0aDpmLGhlaWdodDpofT1yLmZsb2F0aW5nO2xldCBtLGc7dT09PSJ0b3AifHx1PT09ImJvdHRvbSI/KG09dSxnPWM9PT0oYXdhaXQoaS5pc1JUTD09bnVsbD92b2lkIDA6aS5pc1JUTChvLmZsb2F0aW5nKSk/InN0YXJ0IjoiZW5kIik/ImxlZnQiOiJyaWdodCIpOihnPXUsbT1jPT09ImVuZCI/InRvcCI6ImJvdHRvbSIpO2NvbnN0IHc9aC1hW21dLHY9Zi1hW2ddLHk9IXQubWlkZGxld2FyZURhdGEuc2hpZnQ7bGV0IF89dyxTPXY7aWYoZCl7Y29uc3QgJD1mLWEubGVmdC1hLnJpZ2h0O1M9Y3x8eT9mbyh2LCQpOiR9ZWxzZXtjb25zdCAkPWgtYS50b3AtYS5ib3R0b207Xz1jfHx5P2ZvKHcsJCk6JH1pZih5JiYhYyl7Y29uc3QgJD1EbihhLmxlZnQsMCksQz1EbihhLnJpZ2h0LDApLFQ9RG4oYS50b3AsMCksTj1EbihhLmJvdHRvbSwwKTtkP1M9Zi0yKigkIT09MHx8QyE9PTA/JCtDOkRuKGEubGVmdCxhLnJpZ2h0KSk6Xz1oLTIqKFQhPT0wfHxOIT09MD9UK046RG4oYS50b3AsYS5ib3R0b20pKX1hd2FpdCBsKHsuLi50LGF2YWlsYWJsZVdpZHRoOlMsYXZhaWxhYmxlSGVpZ2h0Ol99KTtjb25zdCBFPWF3YWl0IGkuZ2V0RGltZW5zaW9ucyhvLmZsb2F0aW5nKTtyZXR1cm4gZiE9PUUud2lkdGh8fGghPT1FLmhlaWdodD97cmVzZXQ6e3JlY3RzOiEwfX06e319fX07ZnVuY3Rpb24gcG8oZSl7cmV0dXJuIHpDKGUpPyhlLm5vZGVOYW1lfHwiIikudG9Mb3dlckNhc2UoKToiI2RvY3VtZW50In1mdW5jdGlvbiBGbihlKXt2YXIgdDtyZXR1cm4oZT09bnVsbHx8KHQ9ZS5vd25lckRvY3VtZW50KT09bnVsbD92b2lkIDA6dC5kZWZhdWx0Vmlldyl8fHdpbmRvd31mdW5jdGlvbiBDaShlKXt2YXIgdDtyZXR1cm4odD0oekMoZSk/ZS5vd25lckRvY3VtZW50OmUuZG9jdW1lbnQpfHx3aW5kb3cuZG9jdW1lbnQpPT1udWxsP3ZvaWQgMDp0LmRvY3VtZW50RWxlbWVudH1mdW5jdGlvbiB6QyhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIE5vZGV8fGUgaW5zdGFuY2VvZiBGbihlKS5Ob2RlfWZ1bmN0aW9uIHlpKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRWxlbWVudHx8ZSBpbnN0YW5jZW9mIEZuKGUpLkVsZW1lbnR9ZnVuY3Rpb24gWnIoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudHx8ZSBpbnN0YW5jZW9mIEZuKGUpLkhUTUxFbGVtZW50fWZ1bmN0aW9uIEJ4KGUpe3JldHVybiB0eXBlb2YgU2hhZG93Um9vdD4idSI/ITE6ZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3R8fGUgaW5zdGFuY2VvZiBGbihlKS5TaGFkb3dSb290fWZ1bmN0aW9uIFV1KGUpe2NvbnN0e292ZXJmbG93OnQsb3ZlcmZsb3dYOm4sb3ZlcmZsb3dZOnIsZGlzcGxheTppfT1vcihlKTtyZXR1cm4vYXV0b3xzY3JvbGx8b3ZlcmxheXxoaWRkZW58Y2xpcC8udGVzdCh0K3IrbikmJiFbImlubGluZSIsImNvbnRlbnRzIl0uaW5jbHVkZXMoaSl9ZnVuY3Rpb24gWk0oZSl7cmV0dXJuWyJ0YWJsZSIsInRkIiwidGgiXS5pbmNsdWRlcyhwbyhlKSl9ZnVuY3Rpb24gVXYoZSl7Y29uc3QgdD1XdigpLG49b3IoZSk7cmV0dXJuIG4udHJhbnNmb3JtIT09Im5vbmUifHxuLnBlcnNwZWN0aXZlIT09Im5vbmUifHwobi5jb250YWluZXJUeXBlP24uY29udGFpbmVyVHlwZSE9PSJub3JtYWwiOiExKXx8IXQmJihuLmJhY2tkcm9wRmlsdGVyP24uYmFja2Ryb3BGaWx0ZXIhPT0ibm9uZSI6ITEpfHwhdCYmKG4uZmlsdGVyP24uZmlsdGVyIT09Im5vbmUiOiExKXx8WyJ0cmFuc2Zvcm0iLCJwZXJzcGVjdGl2ZSIsImZpbHRlciJdLnNvbWUocj0+KG4ud2lsbENoYW5nZXx8IiIpLmluY2x1ZGVzKHIpKXx8WyJwYWludCIsImxheW91dCIsInN0cmljdCIsImNvbnRlbnQiXS5zb21lKHI9PihuLmNvbnRhaW58fCIiKS5pbmNsdWRlcyhyKSl9ZnVuY3Rpb24gR00oZSl7bGV0IHQ9bXMoZSk7Zm9yKDtacih0KSYmIXpmKHQpOyl7aWYoVXYodCkpcmV0dXJuIHQ7dD1tcyh0KX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBXdigpe3JldHVybiB0eXBlb2YgQ1NTPiJ1Inx8IUNTUy5zdXBwb3J0cz8hMTpDU1Muc3VwcG9ydHMoIi13ZWJraXQtYmFja2Ryb3AtZmlsdGVyIiwibm9uZSIpfWZ1bmN0aW9uIHpmKGUpe3JldHVyblsiaHRtbCIsImJvZHkiLCIjZG9jdW1lbnQiXS5pbmNsdWRlcyhwbyhlKSl9ZnVuY3Rpb24gb3IoZSl7cmV0dXJuIEZuKGUpLmdldENvbXB1dGVkU3R5bGUoZSl9ZnVuY3Rpb24gRmYoZSl7cmV0dXJuIHlpKGUpP3tzY3JvbGxMZWZ0OmUuc2Nyb2xsTGVmdCxzY3JvbGxUb3A6ZS5zY3JvbGxUb3B9OntzY3JvbGxMZWZ0OmUucGFnZVhPZmZzZXQsc2Nyb2xsVG9wOmUucGFnZVlPZmZzZXR9fWZ1bmN0aW9uIG1zKGUpe2lmKHBvKGUpPT09Imh0bWwiKXJldHVybiBlO2NvbnN0IHQ9ZS5hc3NpZ25lZFNsb3R8fGUucGFyZW50Tm9kZXx8QngoZSkmJmUuaG9zdHx8Q2koZSk7cmV0dXJuIEJ4KHQpP3QuaG9zdDp0fWZ1bmN0aW9uIEZDKGUpe2NvbnN0IHQ9bXMoZSk7cmV0dXJuIHpmKHQpP2Uub3duZXJEb2N1bWVudD9lLm93bmVyRG9jdW1lbnQuYm9keTplLmJvZHk6WnIodCkmJlV1KHQpP3Q6RkModCl9ZnVuY3Rpb24gQ3UoZSx0LG4pe3ZhciByO3Q9PT12b2lkIDAmJih0PVtdKSxuPT09dm9pZCAwJiYobj0hMCk7Y29uc3QgaT1GQyhlKSxvPWk9PT0oKHI9ZS5vd25lckRvY3VtZW50KT09bnVsbD92b2lkIDA6ci5ib2R5KSxsPUZuKGkpO3JldHVybiBvP3QuY29uY2F0KGwsbC52aXN1YWxWaWV3cG9ydHx8W10sVXUoaSk/aTpbXSxsLmZyYW1lRWxlbWVudCYmbj9DdShsLmZyYW1lRWxlbWVudCk6W10pOnQuY29uY2F0KGksQ3UoaSxbXSxuKSl9ZnVuY3Rpb24gQkMoZSl7Y29uc3QgdD1vcihlKTtsZXQgbj1wYXJzZUZsb2F0KHQud2lkdGgpfHwwLHI9cGFyc2VGbG9hdCh0LmhlaWdodCl8fDA7Y29uc3QgaT1acihlKSxvPWk/ZS5vZmZzZXRXaWR0aDpuLGw9aT9lLm9mZnNldEhlaWdodDpyLHM9WWQobikhPT1vfHxZZChyKSE9PWw7cmV0dXJuIHMmJihuPW8scj1sKSx7d2lkdGg6bixoZWlnaHQ6ciwkOnN9fWZ1bmN0aW9uIFZ2KGUpe3JldHVybiB5aShlKT9lOmUuY29udGV4dEVsZW1lbnR9ZnVuY3Rpb24gcWwoZSl7Y29uc3QgdD1WdihlKTtpZighWnIodCkpcmV0dXJuIGhvKDEpO2NvbnN0IG49dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx7d2lkdGg6cixoZWlnaHQ6aSwkOm99PUJDKHQpO2xldCBsPShvP1lkKG4ud2lkdGgpOm4ud2lkdGgpL3Iscz0obz9ZZChuLmhlaWdodCk6bi5oZWlnaHQpL2k7cmV0dXJuKCFsfHwhTnVtYmVyLmlzRmluaXRlKGwpKSYmKGw9MSksKCFzfHwhTnVtYmVyLmlzRmluaXRlKHMpKSYmKHM9MSkse3g6bCx5OnN9fWNvbnN0IFlNPWhvKDApO2Z1bmN0aW9uIFVDKGUpe2NvbnN0IHQ9Rm4oZSk7cmV0dXJuIVd2KCl8fCF0LnZpc3VhbFZpZXdwb3J0P1lNOnt4OnQudmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdCx5OnQudmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wfX1mdW5jdGlvbiBYTShlLHQsbil7cmV0dXJuIHQ9PT12b2lkIDAmJih0PSExKSwhbnx8dCYmbiE9PUZuKGUpPyExOnR9ZnVuY3Rpb24gbmwoZSx0LG4scil7dD09PXZvaWQgMCYmKHQ9ITEpLG49PT12b2lkIDAmJihuPSExKTtjb25zdCBpPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbz1WdihlKTtsZXQgbD1obygxKTt0JiYocj95aShyKSYmKGw9cWwocikpOmw9cWwoZSkpO2NvbnN0IHM9WE0obyxuLHIpP1VDKG8pOmhvKDApO2xldCBhPShpLmxlZnQrcy54KS9sLngsdT0oaS50b3Arcy55KS9sLnksYz1pLndpZHRoL2wueCxkPWkuaGVpZ2h0L2wueTtpZihvKXtjb25zdCBmPUZuKG8pLGg9ciYmeWkocik/Rm4ocik6cjtsZXQgbT1mLmZyYW1lRWxlbWVudDtmb3IoO20mJnImJmghPT1mOyl7Y29uc3QgZz1xbChtKSx3PW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdj1vcihtKSx5PXcubGVmdCsobS5jbGllbnRMZWZ0K3BhcnNlRmxvYXQodi5wYWRkaW5nTGVmdCkpKmcueCxfPXcudG9wKyhtLmNsaWVudFRvcCtwYXJzZUZsb2F0KHYucGFkZGluZ1RvcCkpKmcueTthKj1nLngsdSo9Zy55LGMqPWcueCxkKj1nLnksYSs9eSx1Kz1fLG09Rm4obSkuZnJhbWVFbGVtZW50fX1yZXR1cm4gUWQoe3dpZHRoOmMsaGVpZ2h0OmQseDphLHk6dX0pfWZ1bmN0aW9uIFFNKGUpe2xldHtyZWN0OnQsb2Zmc2V0UGFyZW50Om4sc3RyYXRlZ3k6cn09ZTtjb25zdCBpPVpyKG4pLG89Q2kobik7aWYobj09PW8pcmV0dXJuIHQ7bGV0IGw9e3Njcm9sbExlZnQ6MCxzY3JvbGxUb3A6MH0scz1obygxKTtjb25zdCBhPWhvKDApO2lmKChpfHwhaSYmciE9PSJmaXhlZCIpJiYoKHBvKG4pIT09ImJvZHkifHxVdShvKSkmJihsPUZmKG4pKSxacihuKSkpe2NvbnN0IHU9bmwobik7cz1xbChuKSxhLng9dS54K24uY2xpZW50TGVmdCxhLnk9dS55K24uY2xpZW50VG9wfXJldHVybnt3aWR0aDp0LndpZHRoKnMueCxoZWlnaHQ6dC5oZWlnaHQqcy55LHg6dC54KnMueC1sLnNjcm9sbExlZnQqcy54K2EueCx5OnQueSpzLnktbC5zY3JvbGxUb3Aqcy55K2EueX19ZnVuY3Rpb24gSk0oZSl7cmV0dXJuIEFycmF5LmZyb20oZS5nZXRDbGllbnRSZWN0cygpKX1mdW5jdGlvbiBXQyhlKXtyZXR1cm4gbmwoQ2koZSkpLmxlZnQrRmYoZSkuc2Nyb2xsTGVmdH1mdW5jdGlvbiBxTShlKXtjb25zdCB0PUNpKGUpLG49RmYoZSkscj1lLm93bmVyRG9jdW1lbnQuYm9keSxpPURuKHQuc2Nyb2xsV2lkdGgsdC5jbGllbnRXaWR0aCxyLnNjcm9sbFdpZHRoLHIuY2xpZW50V2lkdGgpLG89RG4odC5zY3JvbGxIZWlnaHQsdC5jbGllbnRIZWlnaHQsci5zY3JvbGxIZWlnaHQsci5jbGllbnRIZWlnaHQpO2xldCBsPS1uLnNjcm9sbExlZnQrV0MoZSk7Y29uc3Qgcz0tbi5zY3JvbGxUb3A7cmV0dXJuIG9yKHIpLmRpcmVjdGlvbj09PSJydGwiJiYobCs9RG4odC5jbGllbnRXaWR0aCxyLmNsaWVudFdpZHRoKS1pKSx7d2lkdGg6aSxoZWlnaHQ6byx4OmwseTpzfX1mdW5jdGlvbiBlMyhlLHQpe2NvbnN0IG49Rm4oZSkscj1DaShlKSxpPW4udmlzdWFsVmlld3BvcnQ7bGV0IG89ci5jbGllbnRXaWR0aCxsPXIuY2xpZW50SGVpZ2h0LHM9MCxhPTA7aWYoaSl7bz1pLndpZHRoLGw9aS5oZWlnaHQ7Y29uc3QgdT1XdigpOyghdXx8dSYmdD09PSJmaXhlZCIpJiYocz1pLm9mZnNldExlZnQsYT1pLm9mZnNldFRvcCl9cmV0dXJue3dpZHRoOm8saGVpZ2h0OmwseDpzLHk6YX19ZnVuY3Rpb24gdDMoZSx0KXtjb25zdCBuPW5sKGUsITAsdD09PSJmaXhlZCIpLHI9bi50b3ArZS5jbGllbnRUb3AsaT1uLmxlZnQrZS5jbGllbnRMZWZ0LG89WnIoZSk/cWwoZSk6aG8oMSksbD1lLmNsaWVudFdpZHRoKm8ueCxzPWUuY2xpZW50SGVpZ2h0Km8ueSxhPWkqby54LHU9cipvLnk7cmV0dXJue3dpZHRoOmwsaGVpZ2h0OnMseDphLHk6dX19ZnVuY3Rpb24gVXgoZSx0LG4pe2xldCByO2lmKHQ9PT0idmlld3BvcnQiKXI9ZTMoZSxuKTtlbHNlIGlmKHQ9PT0iZG9jdW1lbnQiKXI9cU0oQ2koZSkpO2Vsc2UgaWYoeWkodCkpcj10Myh0LG4pO2Vsc2V7Y29uc3QgaT1VQyhlKTtyPXsuLi50LHg6dC54LWkueCx5OnQueS1pLnl9fXJldHVybiBRZChyKX1mdW5jdGlvbiBWQyhlLHQpe2NvbnN0IG49bXMoZSk7cmV0dXJuIG49PT10fHwheWkobil8fHpmKG4pPyExOm9yKG4pLnBvc2l0aW9uPT09ImZpeGVkInx8VkMobix0KX1mdW5jdGlvbiBuMyhlLHQpe2NvbnN0IG49dC5nZXQoZSk7aWYobilyZXR1cm4gbjtsZXQgcj1DdShlLFtdLCExKS5maWx0ZXIocz0+eWkocykmJnBvKHMpIT09ImJvZHkiKSxpPW51bGw7Y29uc3Qgbz1vcihlKS5wb3NpdGlvbj09PSJmaXhlZCI7bGV0IGw9bz9tcyhlKTplO2Zvcig7eWkobCkmJiF6ZihsKTspe2NvbnN0IHM9b3IobCksYT1VdihsKTshYSYmcy5wb3NpdGlvbj09PSJmaXhlZCImJihpPW51bGwpLChvPyFhJiYhaTohYSYmcy5wb3NpdGlvbj09PSJzdGF0aWMiJiYhIWkmJlsiYWJzb2x1dGUiLCJmaXhlZCJdLmluY2x1ZGVzKGkucG9zaXRpb24pfHxVdShsKSYmIWEmJlZDKGUsbCkpP3I9ci5maWx0ZXIoYz0+YyE9PWwpOmk9cyxsPW1zKGwpfXJldHVybiB0LnNldChlLHIpLHJ9ZnVuY3Rpb24gcjMoZSl7bGV0e2VsZW1lbnQ6dCxib3VuZGFyeTpuLHJvb3RCb3VuZGFyeTpyLHN0cmF0ZWd5Oml9PWU7Y29uc3QgbD1bLi4ubj09PSJjbGlwcGluZ0FuY2VzdG9ycyI/bjModCx0aGlzLl9jKTpbXS5jb25jYXQobikscl0scz1sWzBdLGE9bC5yZWR1Y2UoKHUsYyk9Pntjb25zdCBkPVV4KHQsYyxpKTtyZXR1cm4gdS50b3A9RG4oZC50b3AsdS50b3ApLHUucmlnaHQ9Zm8oZC5yaWdodCx1LnJpZ2h0KSx1LmJvdHRvbT1mbyhkLmJvdHRvbSx1LmJvdHRvbSksdS5sZWZ0PURuKGQubGVmdCx1LmxlZnQpLHV9LFV4KHQscyxpKSk7cmV0dXJue3dpZHRoOmEucmlnaHQtYS5sZWZ0LGhlaWdodDphLmJvdHRvbS1hLnRvcCx4OmEubGVmdCx5OmEudG9wfX1mdW5jdGlvbiBpMyhlKXtyZXR1cm4gQkMoZSl9ZnVuY3Rpb24gbzMoZSx0LG4pe2NvbnN0IHI9WnIodCksaT1DaSh0KSxvPW49PT0iZml4ZWQiLGw9bmwoZSwhMCxvLHQpO2xldCBzPXtzY3JvbGxMZWZ0OjAsc2Nyb2xsVG9wOjB9O2NvbnN0IGE9aG8oMCk7aWYocnx8IXImJiFvKWlmKChwbyh0KSE9PSJib2R5Inx8VXUoaSkpJiYocz1GZih0KSkscil7Y29uc3QgdT1ubCh0LCEwLG8sdCk7YS54PXUueCt0LmNsaWVudExlZnQsYS55PXUueSt0LmNsaWVudFRvcH1lbHNlIGkmJihhLng9V0MoaSkpO3JldHVybnt4OmwubGVmdCtzLnNjcm9sbExlZnQtYS54LHk6bC50b3Arcy5zY3JvbGxUb3AtYS55LHdpZHRoOmwud2lkdGgsaGVpZ2h0OmwuaGVpZ2h0fX1mdW5jdGlvbiBXeChlLHQpe3JldHVybiFacihlKXx8b3IoZSkucG9zaXRpb249PT0iZml4ZWQiP251bGw6dD90KGUpOmUub2Zmc2V0UGFyZW50fWZ1bmN0aW9uIEhDKGUsdCl7Y29uc3Qgbj1GbihlKTtpZighWnIoZSkpcmV0dXJuIG47bGV0IHI9V3goZSx0KTtmb3IoO3ImJlpNKHIpJiZvcihyKS5wb3NpdGlvbj09PSJzdGF0aWMiOylyPVd4KHIsdCk7cmV0dXJuIHImJihwbyhyKT09PSJodG1sInx8cG8ocik9PT0iYm9keSImJm9yKHIpLnBvc2l0aW9uPT09InN0YXRpYyImJiFVdihyKSk/bjpyfHxHTShlKXx8bn1jb25zdCBsMz1hc3luYyBmdW5jdGlvbihlKXtsZXR7cmVmZXJlbmNlOnQsZmxvYXRpbmc6bixzdHJhdGVneTpyfT1lO2NvbnN0IGk9dGhpcy5nZXRPZmZzZXRQYXJlbnR8fEhDLG89dGhpcy5nZXREaW1lbnNpb25zO3JldHVybntyZWZlcmVuY2U6bzModCxhd2FpdCBpKG4pLHIpLGZsb2F0aW5nOnt4OjAseTowLC4uLmF3YWl0IG8obil9fX07ZnVuY3Rpb24gczMoZSl7cmV0dXJuIG9yKGUpLmRpcmVjdGlvbj09PSJydGwifWNvbnN0IGEzPXtjb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdDpRTSxnZXREb2N1bWVudEVsZW1lbnQ6Q2ksZ2V0Q2xpcHBpbmdSZWN0OnIzLGdldE9mZnNldFBhcmVudDpIQyxnZXRFbGVtZW50UmVjdHM6bDMsZ2V0Q2xpZW50UmVjdHM6Sk0sZ2V0RGltZW5zaW9uczppMyxnZXRTY2FsZTpxbCxpc0VsZW1lbnQ6eWksaXNSVEw6czN9O2Z1bmN0aW9uIHUzKGUsdCl7bGV0IG49bnVsbCxyO2NvbnN0IGk9Q2koZSk7ZnVuY3Rpb24gbygpe2NsZWFyVGltZW91dChyKSxuJiZuLmRpc2Nvbm5lY3QoKSxuPW51bGx9ZnVuY3Rpb24gbChzLGEpe3M9PT12b2lkIDAmJihzPSExKSxhPT09dm9pZCAwJiYoYT0xKSxvKCk7Y29uc3R7bGVmdDp1LHRvcDpjLHdpZHRoOmQsaGVpZ2h0OmZ9PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoc3x8dCgpLCFkfHwhZilyZXR1cm47Y29uc3QgaD1TYyhjKSxtPVNjKGkuY2xpZW50V2lkdGgtKHUrZCkpLGc9U2MoaS5jbGllbnRIZWlnaHQtKGMrZikpLHc9U2ModSkseT17cm9vdE1hcmdpbjotaCsicHggIistbSsicHggIistZysicHggIistdysicHgiLHRocmVzaG9sZDpEbigwLGZvKDEsYSkpfHwxfTtsZXQgXz0hMDtmdW5jdGlvbiBTKEUpe2NvbnN0ICQ9RVswXS5pbnRlcnNlY3Rpb25SYXRpbztpZigkIT09YSl7aWYoIV8pcmV0dXJuIGwoKTskP2woITEsJCk6cj1zZXRUaW1lb3V0KCgpPT57bCghMSwxZS03KX0sMTAwKX1fPSExfXRyeXtuPW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihTLHsuLi55LHJvb3Q6aS5vd25lckRvY3VtZW50fSl9Y2F0Y2h7bj1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoUyx5KX1uLm9ic2VydmUoZSl9cmV0dXJuIGwoITApLG99ZnVuY3Rpb24gYzMoZSx0LG4scil7cj09PXZvaWQgMCYmKHI9e30pO2NvbnN0e2FuY2VzdG9yU2Nyb2xsOmk9ITAsYW5jZXN0b3JSZXNpemU6bz0hMCxlbGVtZW50UmVzaXplOmw9dHlwZW9mIFJlc2l6ZU9ic2VydmVyPT0iZnVuY3Rpb24iLGxheW91dFNoaWZ0OnM9dHlwZW9mIEludGVyc2VjdGlvbk9ic2VydmVyPT0iZnVuY3Rpb24iLGFuaW1hdGlvbkZyYW1lOmE9ITF9PXIsdT1WdihlKSxjPWl8fG8/Wy4uLnU/Q3UodSk6W10sLi4uQ3UodCldOltdO2MuZm9yRWFjaCh2PT57aSYmdi5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLG4se3Bhc3NpdmU6ITB9KSxvJiZ2LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsbil9KTtjb25zdCBkPXUmJnM/dTModSxuKTpudWxsO2xldCBmPS0xLGg9bnVsbDtsJiYoaD1uZXcgUmVzaXplT2JzZXJ2ZXIodj0+e2xldFt5XT12O3kmJnkudGFyZ2V0PT09dSYmaCYmKGgudW5vYnNlcnZlKHQpLGNhbmNlbEFuaW1hdGlvbkZyYW1lKGYpLGY9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57aCYmaC5vYnNlcnZlKHQpfSkpLG4oKX0pLHUmJiFhJiZoLm9ic2VydmUodSksaC5vYnNlcnZlKHQpKTtsZXQgbSxnPWE/bmwoZSk6bnVsbDthJiZ3KCk7ZnVuY3Rpb24gdygpe2NvbnN0IHY9bmwoZSk7ZyYmKHYueCE9PWcueHx8di55IT09Zy55fHx2LndpZHRoIT09Zy53aWR0aHx8di5oZWlnaHQhPT1nLmhlaWdodCkmJm4oKSxnPXYsbT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodyl9cmV0dXJuIG4oKSwoKT0+e2MuZm9yRWFjaCh2PT57aSYmdi5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLG4pLG8mJnYucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixuKX0pLGQmJmQoKSxoJiZoLmRpc2Nvbm5lY3QoKSxoPW51bGwsYSYmY2FuY2VsQW5pbWF0aW9uRnJhbWUobSl9fWNvbnN0IGQzPShlLHQsbik9Pntjb25zdCByPW5ldyBNYXAsaT17cGxhdGZvcm06YTMsLi4ubn0sbz17Li4uaS5wbGF0Zm9ybSxfYzpyfTtyZXR1cm4gek0oZSx0LHsuLi5pLHBsYXRmb3JtOm99KX0sZjM9ZT0+e2Z1bmN0aW9uIHQobil7cmV0dXJue30uaGFzT3duUHJvcGVydHkuY2FsbChuLCJjdXJyZW50Iil9cmV0dXJue25hbWU6ImFycm93IixvcHRpb25zOmUsZm4obil7Y29uc3R7ZWxlbWVudDpyLHBhZGRpbmc6aX09dHlwZW9mIGU9PSJmdW5jdGlvbiI/ZShuKTplO3JldHVybiByJiZ0KHIpP3IuY3VycmVudCE9bnVsbD9qeCh7ZWxlbWVudDpyLmN1cnJlbnQscGFkZGluZzppfSkuZm4obik6e306cj9qeCh7ZWxlbWVudDpyLHBhZGRpbmc6aX0pLmZuKG4pOnt9fX19O3ZhciBLYz10eXBlb2YgZG9jdW1lbnQ8InUiP3AudXNlTGF5b3V0RWZmZWN0OnAudXNlRWZmZWN0O2Z1bmN0aW9uIEpkKGUsdCl7aWYoZT09PXQpcmV0dXJuITA7aWYodHlwZW9mIGUhPXR5cGVvZiB0KXJldHVybiExO2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iJiZlLnRvU3RyaW5nKCk9PT10LnRvU3RyaW5nKCkpcmV0dXJuITA7bGV0IG4scixpO2lmKGUmJnQmJnR5cGVvZiBlPT0ib2JqZWN0Iil7aWYoQXJyYXkuaXNBcnJheShlKSl7aWYobj1lLmxlbmd0aCxuIT10Lmxlbmd0aClyZXR1cm4hMTtmb3Iocj1uO3ItLSE9PTA7KWlmKCFKZChlW3JdLHRbcl0pKXJldHVybiExO3JldHVybiEwfWlmKGk9T2JqZWN0LmtleXMoZSksbj1pLmxlbmd0aCxuIT09T2JqZWN0LmtleXModCkubGVuZ3RoKXJldHVybiExO2ZvcihyPW47ci0tIT09MDspaWYoIXt9Lmhhc093blByb3BlcnR5LmNhbGwodCxpW3JdKSlyZXR1cm4hMTtmb3Iocj1uO3ItLSE9PTA7KXtjb25zdCBvPWlbcl07aWYoIShvPT09Il9vd25lciImJmUuJCR0eXBlb2YpJiYhSmQoZVtvXSx0W29dKSlyZXR1cm4hMX1yZXR1cm4hMH1yZXR1cm4gZSE9PWUmJnQhPT10fWZ1bmN0aW9uIEtDKGUpe3JldHVybiB0eXBlb2Ygd2luZG93PiJ1Ij8xOihlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdykuZGV2aWNlUGl4ZWxSYXRpb3x8MX1mdW5jdGlvbiBWeChlLHQpe2NvbnN0IG49S0MoZSk7cmV0dXJuIE1hdGgucm91bmQodCpuKS9ufWZ1bmN0aW9uIEh4KGUpe2NvbnN0IHQ9cC51c2VSZWYoZSk7cmV0dXJuIEtjKCgpPT57dC5jdXJyZW50PWV9KSx0fWZ1bmN0aW9uIGgzKGUpe2U9PT12b2lkIDAmJihlPXt9KTtjb25zdHtwbGFjZW1lbnQ6dD0iYm90dG9tIixzdHJhdGVneTpuPSJhYnNvbHV0ZSIsbWlkZGxld2FyZTpyPVtdLHBsYXRmb3JtOmksZWxlbWVudHM6e3JlZmVyZW5jZTpvLGZsb2F0aW5nOmx9PXt9LHRyYW5zZm9ybTpzPSEwLHdoaWxlRWxlbWVudHNNb3VudGVkOmEsb3Blbjp1fT1lLFtjLGRdPXAudXNlU3RhdGUoe3g6MCx5OjAsc3RyYXRlZ3k6bixwbGFjZW1lbnQ6dCxtaWRkbGV3YXJlRGF0YTp7fSxpc1Bvc2l0aW9uZWQ6ITF9KSxbZixoXT1wLnVzZVN0YXRlKHIpO0pkKGYscil8fGgocik7Y29uc3RbbSxnXT1wLnVzZVN0YXRlKG51bGwpLFt3LHZdPXAudXNlU3RhdGUobnVsbCkseT1wLnVzZUNhbGxiYWNrKE89PntPIT0kLmN1cnJlbnQmJigkLmN1cnJlbnQ9TyxnKE8pKX0sW2ddKSxfPXAudXNlQ2FsbGJhY2soTz0+e08hPT1DLmN1cnJlbnQmJihDLmN1cnJlbnQ9Tyx2KE8pKX0sW3ZdKSxTPW98fG0sRT1sfHx3LCQ9cC51c2VSZWYobnVsbCksQz1wLnVzZVJlZihudWxsKSxUPXAudXNlUmVmKGMpLE49SHgoYSksUj1IeChpKSxEPXAudXNlQ2FsbGJhY2soKCk9PntpZighJC5jdXJyZW50fHwhQy5jdXJyZW50KXJldHVybjtjb25zdCBPPXtwbGFjZW1lbnQ6dCxzdHJhdGVneTpuLG1pZGRsZXdhcmU6Zn07Ui5jdXJyZW50JiYoTy5wbGF0Zm9ybT1SLmN1cnJlbnQpLGQzKCQuY3VycmVudCxDLmN1cnJlbnQsTykudGhlbihBPT57Y29uc3Qgaz17Li4uQSxpc1Bvc2l0aW9uZWQ6ITB9O0YuY3VycmVudCYmIUpkKFQuY3VycmVudCxrKSYmKFQuY3VycmVudD1rLEdyLmZsdXNoU3luYygoKT0+e2Qoayl9KSl9KX0sW2YsdCxuLFJdKTtLYygoKT0+e3U9PT0hMSYmVC5jdXJyZW50LmlzUG9zaXRpb25lZCYmKFQuY3VycmVudC5pc1Bvc2l0aW9uZWQ9ITEsZChPPT4oey4uLk8saXNQb3NpdGlvbmVkOiExfSkpKX0sW3VdKTtjb25zdCBGPXAudXNlUmVmKCExKTtLYygoKT0+KEYuY3VycmVudD0hMCwoKT0+e0YuY3VycmVudD0hMX0pLFtdKSxLYygoKT0+e2lmKFMmJigkLmN1cnJlbnQ9UyksRSYmKEMuY3VycmVudD1FKSxTJiZFKXtpZihOLmN1cnJlbnQpcmV0dXJuIE4uY3VycmVudChTLEUsRCk7RCgpfX0sW1MsRSxELE5dKTtjb25zdCBzZT1wLnVzZU1lbW8oKCk9Pih7cmVmZXJlbmNlOiQsZmxvYXRpbmc6QyxzZXRSZWZlcmVuY2U6eSxzZXRGbG9hdGluZzpffSksW3ksX10pLFY9cC51c2VNZW1vKCgpPT4oe3JlZmVyZW5jZTpTLGZsb2F0aW5nOkV9KSxbUyxFXSksSz1wLnVzZU1lbW8oKCk9Pntjb25zdCBPPXtwb3NpdGlvbjpuLGxlZnQ6MCx0b3A6MH07aWYoIVYuZmxvYXRpbmcpcmV0dXJuIE87Y29uc3QgQT1WeChWLmZsb2F0aW5nLGMueCksaz1WeChWLmZsb2F0aW5nLGMueSk7cmV0dXJuIHM/ey4uLk8sdHJhbnNmb3JtOiJ0cmFuc2xhdGUoIitBKyJweCwgIitrKyJweCkiLC4uLktDKFYuZmxvYXRpbmcpPj0xLjUmJnt3aWxsQ2hhbmdlOiJ0cmFuc2Zvcm0ifX06e3Bvc2l0aW9uOm4sbGVmdDpBLHRvcDprfX0sW24scyxWLmZsb2F0aW5nLGMueCxjLnldKTtyZXR1cm4gcC51c2VNZW1vKCgpPT4oey4uLmMsdXBkYXRlOkQscmVmczpzZSxlbGVtZW50czpWLGZsb2F0aW5nU3R5bGVzOkt9KSxbYyxELHNlLFYsS10pfWZ1bmN0aW9uIFpDKGUpe2NvbnN0W3Qsbl09cC51c2VTdGF0ZSh2b2lkIDApO3JldHVybiBVbigoKT0+e2lmKGUpe24oe3dpZHRoOmUub2Zmc2V0V2lkdGgsaGVpZ2h0OmUub2Zmc2V0SGVpZ2h0fSk7Y29uc3Qgcj1uZXcgUmVzaXplT2JzZXJ2ZXIoaT0+e2lmKCFBcnJheS5pc0FycmF5KGkpfHwhaS5sZW5ndGgpcmV0dXJuO2NvbnN0IG89aVswXTtsZXQgbCxzO2lmKCJib3JkZXJCb3hTaXplImluIG8pe2NvbnN0IGE9by5ib3JkZXJCb3hTaXplLHU9QXJyYXkuaXNBcnJheShhKT9hWzBdOmE7bD11LmlubGluZVNpemUscz11LmJsb2NrU2l6ZX1lbHNlIGw9ZS5vZmZzZXRXaWR0aCxzPWUub2Zmc2V0SGVpZ2h0O24oe3dpZHRoOmwsaGVpZ2h0OnN9KX0pO3JldHVybiByLm9ic2VydmUoZSx7Ym94OiJib3JkZXItYm94In0pLCgpPT5yLnVub2JzZXJ2ZShlKX1lbHNlIG4odm9pZCAwKX0sW2VdKSx0fWNvbnN0IEdDPSJQb3BwZXIiLFtZQyxYQ109bGwoR0MpLFtwMyxRQ109WUMoR0MpLG0zPWU9Pntjb25zdHtfX3Njb3BlUG9wcGVyOnQsY2hpbGRyZW46bn09ZSxbcixpXT1wLnVzZVN0YXRlKG51bGwpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocDMse3Njb3BlOnQsYW5jaG9yOnIsb25BbmNob3JDaGFuZ2U6aX0sbil9LGczPSJQb3BwZXJBbmNob3IiLHYzPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVQb3BwZXI6bix2aXJ0dWFsUmVmOnIsLi4uaX09ZSxvPVFDKGczLG4pLGw9cC51c2VSZWYobnVsbCkscz1zdCh0LGwpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e28ub25BbmNob3JDaGFuZ2UoKHI9PW51bGw/dm9pZCAwOnIuY3VycmVudCl8fGwuY3VycmVudCl9KSxyP251bGw6cC5jcmVhdGVFbGVtZW50KEtlLmRpdixpZSh7fSxpLHtyZWY6c30pKX0pLEpDPSJQb3BwZXJDb250ZW50IixbeTMsTkldPVlDKEpDKSx4Mz1wLmZvcndhcmRSZWYoKGUsdCk9Pnt2YXIgbixyLGksbyxsLHMsYSx1O2NvbnN0e19fc2NvcGVQb3BwZXI6YyxzaWRlOmQ9ImJvdHRvbSIsc2lkZU9mZnNldDpmPTAsYWxpZ246aD0iY2VudGVyIixhbGlnbk9mZnNldDptPTAsYXJyb3dQYWRkaW5nOmc9MCxhdm9pZENvbGxpc2lvbnM6dz0hMCxjb2xsaXNpb25Cb3VuZGFyeTp2PVtdLGNvbGxpc2lvblBhZGRpbmc6eT0wLHN0aWNreTpfPSJwYXJ0aWFsIixoaWRlV2hlbkRldGFjaGVkOlM9ITEsdXBkYXRlUG9zaXRpb25TdHJhdGVneTpFPSJvcHRpbWl6ZWQiLG9uUGxhY2VkOiQsLi4uQ309ZSxUPVFDKEpDLGMpLFtOLFJdPXAudXNlU3RhdGUobnVsbCksRD1zdCh0LFNuPT5SKFNuKSksW0Ysc2VdPXAudXNlU3RhdGUobnVsbCksVj1aQyhGKSxLPShuPVY9PW51bGw/dm9pZCAwOlYud2lkdGgpIT09bnVsbCYmbiE9PXZvaWQgMD9uOjAsTz0ocj1WPT1udWxsP3ZvaWQgMDpWLmhlaWdodCkhPT1udWxsJiZyIT09dm9pZCAwP3I6MCxBPWQrKGghPT0iY2VudGVyIj8iLSIraDoiIiksaz10eXBlb2YgeT09Im51bWJlciI/eTp7dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjAsLi4ueX0saj1BcnJheS5pc0FycmF5KHYpP3Y6W3ZdLEk9ai5sZW5ndGg+MCxaPXtwYWRkaW5nOmssYm91bmRhcnk6ai5maWx0ZXIoXzMpLGFsdEJvdW5kYXJ5Okl9LHtyZWZzOm5lLGZsb2F0aW5nU3R5bGVzOmtlLHBsYWNlbWVudDp2ZSxpc1Bvc2l0aW9uZWQ6V2UsbWlkZGxld2FyZURhdGE6RmV9PWgzKHtzdHJhdGVneToiZml4ZWQiLHBsYWNlbWVudDpBLHdoaWxlRWxlbWVudHNNb3VudGVkOiguLi5Tbik9PmMzKC4uLlNuLHthbmltYXRpb25GcmFtZTpFPT09ImFsd2F5cyJ9KSxlbGVtZW50czp7cmVmZXJlbmNlOlQuYW5jaG9yfSxtaWRkbGV3YXJlOltXTSh7bWFpbkF4aXM6ZitPLGFsaWdubWVudEF4aXM6bX0pLHcmJlZNKHttYWluQXhpczohMCxjcm9zc0F4aXM6ITEsbGltaXRlcjpfPT09InBhcnRpYWwiP0hNKCk6dm9pZCAwLC4uLlp9KSx3JiZGTSh7Li4uWn0pLEtNKHsuLi5aLGFwcGx5Oih7ZWxlbWVudHM6U24scmVjdHM6dXIsYXZhaWxhYmxlV2lkdGg6amUsYXZhaWxhYmxlSGVpZ2h0OlR0fSk9Pntjb25zdHt3aWR0aDphdCxoZWlnaHQ6bG59PXVyLnJlZmVyZW5jZSxFbj1Tbi5mbG9hdGluZy5zdHlsZTtFbi5zZXRQcm9wZXJ0eSgiLS1yYWRpeC1wb3BwZXItYXZhaWxhYmxlLXdpZHRoIixgJHtqZX1weGApLEVuLnNldFByb3BlcnR5KCItLXJhZGl4LXBvcHBlci1hdmFpbGFibGUtaGVpZ2h0IixgJHtUdH1weGApLEVuLnNldFByb3BlcnR5KCItLXJhZGl4LXBvcHBlci1hbmNob3Itd2lkdGgiLGAke2F0fXB4YCksRW4uc2V0UHJvcGVydHkoIi0tcmFkaXgtcG9wcGVyLWFuY2hvci1oZWlnaHQiLGAke2xufXB4YCl9fSksRiYmZjMoe2VsZW1lbnQ6RixwYWRkaW5nOmd9KSx3Myh7YXJyb3dXaWR0aDpLLGFycm93SGVpZ2h0Ok99KSxTJiZCTSh7c3RyYXRlZ3k6InJlZmVyZW5jZUhpZGRlbiIsLi4uWn0pXX0pLFt0ZSxJZV09cUModmUpLGJlPWVuKCQpO1VuKCgpPT57V2UmJihiZT09bnVsbHx8YmUoKSl9LFtXZSxiZV0pO2NvbnN0IFJlPShpPUZlLmFycm93KT09PW51bGx8fGk9PT12b2lkIDA/dm9pZCAwOmkueCxTZT0obz1GZS5hcnJvdyk9PT1udWxsfHxvPT09dm9pZCAwP3ZvaWQgMDpvLnksRGU9KChsPUZlLmFycm93KT09PW51bGx8fGw9PT12b2lkIDA/dm9pZCAwOmwuY2VudGVyT2Zmc2V0KSE9PTAsW1FlLFd0XT1wLnVzZVN0YXRlKCk7cmV0dXJuIFVuKCgpPT57TiYmV3Qod2luZG93LmdldENvbXB1dGVkU3R5bGUoTikuekluZGV4KX0sW05dKSxwLmNyZWF0ZUVsZW1lbnQoImRpdiIse3JlZjpuZS5zZXRGbG9hdGluZywiZGF0YS1yYWRpeC1wb3BwZXItY29udGVudC13cmFwcGVyIjoiIixzdHlsZTp7Li4ua2UsdHJhbnNmb3JtOldlP2tlLnRyYW5zZm9ybToidHJhbnNsYXRlKDAsIC0yMDAlKSIsbWluV2lkdGg6Im1heC1jb250ZW50Iix6SW5kZXg6UWUsIi0tcmFkaXgtcG9wcGVyLXRyYW5zZm9ybS1vcmlnaW4iOlsocz1GZS50cmFuc2Zvcm1PcmlnaW4pPT09bnVsbHx8cz09PXZvaWQgMD92b2lkIDA6cy54LChhPUZlLnRyYW5zZm9ybU9yaWdpbik9PT1udWxsfHxhPT09dm9pZCAwP3ZvaWQgMDphLnldLmpvaW4oIiAiKX0sZGlyOmUuZGlyfSxwLmNyZWF0ZUVsZW1lbnQoeTMse3Njb3BlOmMscGxhY2VkU2lkZTp0ZSxvbkFycm93Q2hhbmdlOnNlLGFycm93WDpSZSxhcnJvd1k6U2Usc2hvdWxkSGlkZUFycm93OkRlfSxwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHsiZGF0YS1zaWRlIjp0ZSwiZGF0YS1hbGlnbiI6SWV9LEMse3JlZjpELHN0eWxlOnsuLi5DLnN0eWxlLGFuaW1hdGlvbjpXZT92b2lkIDA6Im5vbmUiLG9wYWNpdHk6KHU9RmUuaGlkZSkhPT1udWxsJiZ1IT09dm9pZCAwJiZ1LnJlZmVyZW5jZUhpZGRlbj8wOnZvaWQgMH19KSkpKX0pO2Z1bmN0aW9uIF8zKGUpe3JldHVybiBlIT09bnVsbH1jb25zdCB3Mz1lPT4oe25hbWU6InRyYW5zZm9ybU9yaWdpbiIsb3B0aW9uczplLGZuKHQpe3ZhciBuLHIsaSxvLGw7Y29uc3R7cGxhY2VtZW50OnMscmVjdHM6YSxtaWRkbGV3YXJlRGF0YTp1fT10LGQ9KChuPXUuYXJyb3cpPT09bnVsbHx8bj09PXZvaWQgMD92b2lkIDA6bi5jZW50ZXJPZmZzZXQpIT09MCxmPWQ/MDplLmFycm93V2lkdGgsaD1kPzA6ZS5hcnJvd0hlaWdodCxbbSxnXT1xQyhzKSx3PXtzdGFydDoiMCUiLGNlbnRlcjoiNTAlIixlbmQ6IjEwMCUifVtnXSx2PSgocj0oaT11LmFycm93KT09PW51bGx8fGk9PT12b2lkIDA/dm9pZCAwOmkueCkhPT1udWxsJiZyIT09dm9pZCAwP3I6MCkrZi8yLHk9KChvPShsPXUuYXJyb3cpPT09bnVsbHx8bD09PXZvaWQgMD92b2lkIDA6bC55KSE9PW51bGwmJm8hPT12b2lkIDA/bzowKStoLzI7bGV0IF89IiIsUz0iIjtyZXR1cm4gbT09PSJib3R0b20iPyhfPWQ/dzpgJHt2fXB4YCxTPWAkey1ofXB4YCk6bT09PSJ0b3AiPyhfPWQ/dzpgJHt2fXB4YCxTPWAke2EuZmxvYXRpbmcuaGVpZ2h0K2h9cHhgKTptPT09InJpZ2h0Ij8oXz1gJHstaH1weGAsUz1kP3c6YCR7eX1weGApOm09PT0ibGVmdCImJihfPWAke2EuZmxvYXRpbmcud2lkdGgraH1weGAsUz1kP3c6YCR7eX1weGApLHtkYXRhOnt4Ol8seTpTfX19fSk7ZnVuY3Rpb24gcUMoZSl7Y29uc3RbdCxuPSJjZW50ZXIiXT1lLnNwbGl0KCItIik7cmV0dXJuW3Qsbl19Y29uc3QgUzM9bTMsRTM9djMsQzM9eDMsazM9cC5mb3J3YXJkUmVmKChlLHQpPT57dmFyIG47Y29uc3R7Y29udGFpbmVyOnI9Z2xvYmFsVGhpcz09bnVsbHx8KG49Z2xvYmFsVGhpcy5kb2N1bWVudCk9PT1udWxsfHxuPT09dm9pZCAwP3ZvaWQgMDpuLmJvZHksLi4uaX09ZTtyZXR1cm4gcj9Mdy5jcmVhdGVQb3J0YWwocC5jcmVhdGVFbGVtZW50KEtlLmRpdixpZSh7fSxpLHtyZWY6dH0pKSxyKTpudWxsfSk7ZnVuY3Rpb24gZ3Moe3Byb3A6ZSxkZWZhdWx0UHJvcDp0LG9uQ2hhbmdlOm49KCk9Pnt9fSl7Y29uc3RbcixpXT0kMyh7ZGVmYXVsdFByb3A6dCxvbkNoYW5nZTpufSksbz1lIT09dm9pZCAwLGw9bz9lOnIscz1lbihuKSxhPXAudXNlQ2FsbGJhY2sodT0+e2lmKG8pe2NvbnN0IGQ9dHlwZW9mIHU9PSJmdW5jdGlvbiI/dShlKTp1O2QhPT1lJiZzKGQpfWVsc2UgaSh1KX0sW28sZSxpLHNdKTtyZXR1cm5bbCxhXX1mdW5jdGlvbiAkMyh7ZGVmYXVsdFByb3A6ZSxvbkNoYW5nZTp0fSl7Y29uc3Qgbj1wLnVzZVN0YXRlKGUpLFtyXT1uLGk9cC51c2VSZWYociksbz1lbih0KTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntpLmN1cnJlbnQhPT1yJiYobyhyKSxpLmN1cnJlbnQ9cil9LFtyLGksb10pLG59ZnVuY3Rpb24gZWsoZSl7Y29uc3QgdD1wLnVzZVJlZih7dmFsdWU6ZSxwcmV2aW91czplfSk7cmV0dXJuIHAudXNlTWVtbygoKT0+KHQuY3VycmVudC52YWx1ZSE9PWUmJih0LmN1cnJlbnQucHJldmlvdXM9dC5jdXJyZW50LnZhbHVlLHQuY3VycmVudC52YWx1ZT1lKSx0LmN1cnJlbnQucHJldmlvdXMpLFtlXSl9Y29uc3QgYjM9cC5mb3J3YXJkUmVmKChlLHQpPT5wLmNyZWF0ZUVsZW1lbnQoS2Uuc3BhbixpZSh7fSxlLHtyZWY6dCxzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixib3JkZXI6MCx3aWR0aDoxLGhlaWdodDoxLHBhZGRpbmc6MCxtYXJnaW46LTEsb3ZlcmZsb3c6ImhpZGRlbiIsY2xpcDoicmVjdCgwLCAwLCAwLCAwKSIsd2hpdGVTcGFjZToibm93cmFwIix3b3JkV3JhcDoibm9ybWFsIiwuLi5lLnN0eWxlfX0pKSk7dmFyIFQzPWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBkb2N1bWVudD4idSIpcmV0dXJuIG51bGw7dmFyIHQ9QXJyYXkuaXNBcnJheShlKT9lWzBdOmU7cmV0dXJuIHQub3duZXJEb2N1bWVudC5ib2R5fSxTbD1uZXcgV2Vha01hcCxFYz1uZXcgV2Vha01hcCxDYz17fSxWaD0wLHRrPWZ1bmN0aW9uKGUpe3JldHVybiBlJiYoZS5ob3N0fHx0ayhlLnBhcmVudE5vZGUpKX0sTjM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5tYXAoZnVuY3Rpb24obil7aWYoZS5jb250YWlucyhuKSlyZXR1cm4gbjt2YXIgcj10ayhuKTtyZXR1cm4gciYmZS5jb250YWlucyhyKT9yOihjb25zb2xlLmVycm9yKCJhcmlhLWhpZGRlbiIsbiwiaW4gbm90IGNvbnRhaW5lZCBpbnNpZGUiLGUsIi4gRG9pbmcgbm90aGluZyIpLG51bGwpfSkuZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiEhbn0pfSxSMz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1OMyh0LEFycmF5LmlzQXJyYXkoZSk/ZTpbZV0pO0NjW25dfHwoQ2Nbbl09bmV3IFdlYWtNYXApO3ZhciBvPUNjW25dLGw9W10scz1uZXcgU2V0LGE9bmV3IFNldChpKSx1PWZ1bmN0aW9uKGQpeyFkfHxzLmhhcyhkKXx8KHMuYWRkKGQpLHUoZC5wYXJlbnROb2RlKSl9O2kuZm9yRWFjaCh1KTt2YXIgYz1mdW5jdGlvbihkKXshZHx8YS5oYXMoZCl8fEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZC5jaGlsZHJlbixmdW5jdGlvbihmKXtpZihzLmhhcyhmKSljKGYpO2Vsc2V7dmFyIGg9Zi5nZXRBdHRyaWJ1dGUociksbT1oIT09bnVsbCYmaCE9PSJmYWxzZSIsZz0oU2wuZ2V0KGYpfHwwKSsxLHc9KG8uZ2V0KGYpfHwwKSsxO1NsLnNldChmLGcpLG8uc2V0KGYsdyksbC5wdXNoKGYpLGc9PT0xJiZtJiZFYy5zZXQoZiwhMCksdz09PTEmJmYuc2V0QXR0cmlidXRlKG4sInRydWUiKSxtfHxmLnNldEF0dHJpYnV0ZShyLCJ0cnVlIil9fSl9O3JldHVybiBjKHQpLHMuY2xlYXIoKSxWaCsrLGZ1bmN0aW9uKCl7bC5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBmPVNsLmdldChkKS0xLGg9by5nZXQoZCktMTtTbC5zZXQoZCxmKSxvLnNldChkLGgpLGZ8fChFYy5oYXMoZCl8fGQucmVtb3ZlQXR0cmlidXRlKHIpLEVjLmRlbGV0ZShkKSksaHx8ZC5yZW1vdmVBdHRyaWJ1dGUobil9KSxWaC0tLFZofHwoU2w9bmV3IFdlYWtNYXAsU2w9bmV3IFdlYWtNYXAsRWM9bmV3IFdlYWtNYXAsQ2M9e30pfX0sTzM9ZnVuY3Rpb24oZSx0LG4pe249PT12b2lkIDAmJihuPSJkYXRhLWFyaWEtaGlkZGVuIik7dmFyIHI9QXJyYXkuZnJvbShBcnJheS5pc0FycmF5KGUpP2U6W2VdKSxpPXR8fFQzKGUpO3JldHVybiBpPyhyLnB1c2guYXBwbHkocixBcnJheS5mcm9tKGkucXVlcnlTZWxlY3RvckFsbCgiW2FyaWEtbGl2ZV0iKSkpLFIzKHIsaSxuLCJhcmlhLWhpZGRlbiIpKTpmdW5jdGlvbigpe3JldHVybiBudWxsfX0sRHI9ZnVuY3Rpb24oKXtyZXR1cm4gRHI9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBuLHI9MSxpPWFyZ3VtZW50cy5sZW5ndGg7cjxpO3IrKyl7bj1hcmd1bWVudHNbcl07Zm9yKHZhciBvIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sbykmJih0W29dPW5bb10pfXJldHVybiB0fSxEci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2Z1bmN0aW9uIG5rKGUsdCl7dmFyIG49e307Zm9yKHZhciByIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJnQuaW5kZXhPZihyKTwwJiYobltyXT1lW3JdKTtpZihlIT1udWxsJiZ0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz09ImZ1bmN0aW9uIilmb3IodmFyIGk9MCxyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7aTxyLmxlbmd0aDtpKyspdC5pbmRleE9mKHJbaV0pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLHJbaV0pJiYobltyW2ldXT1lW3JbaV1dKTtyZXR1cm4gbn1mdW5jdGlvbiBQMyhlLHQsbil7aWYobnx8YXJndW1lbnRzLmxlbmd0aD09PTIpZm9yKHZhciByPTAsaT10Lmxlbmd0aCxvO3I8aTtyKyspKG98fCEociBpbiB0KSkmJihvfHwobz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0LDAscikpLG9bcl09dFtyXSk7cmV0dXJuIGUuY29uY2F0KG98fEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQpKX12YXIgWmM9InJpZ2h0LXNjcm9sbC1iYXItcG9zaXRpb24iLEdjPSJ3aWR0aC1iZWZvcmUtc2Nyb2xsLWJhciIsQTM9IndpdGgtc2Nyb2xsLWJhcnMtaGlkZGVuIixNMz0iLS1yZW1vdmVkLWJvZHktc2Nyb2xsLWJhci1zaXplIjtmdW5jdGlvbiBEMyhlLHQpe3JldHVybiB0eXBlb2YgZT09ImZ1bmN0aW9uIj9lKHQpOmUmJihlLmN1cnJlbnQ9dCksZX1mdW5jdGlvbiBMMyhlLHQpe3ZhciBuPXAudXNlU3RhdGUoZnVuY3Rpb24oKXtyZXR1cm57dmFsdWU6ZSxjYWxsYmFjazp0LGZhY2FkZTp7Z2V0IGN1cnJlbnQoKXtyZXR1cm4gbi52YWx1ZX0sc2V0IGN1cnJlbnQocil7dmFyIGk9bi52YWx1ZTtpIT09ciYmKG4udmFsdWU9cixuLmNhbGxiYWNrKHIsaSkpfX19fSlbMF07cmV0dXJuIG4uY2FsbGJhY2s9dCxuLmZhY2FkZX1mdW5jdGlvbiBJMyhlLHQpe3JldHVybiBMMyh0fHxudWxsLGZ1bmN0aW9uKG4pe3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24ocil7cmV0dXJuIEQzKHIsbil9KX0pfWZ1bmN0aW9uIGozKGUpe3JldHVybiBlfWZ1bmN0aW9uIHozKGUsdCl7dD09PXZvaWQgMCYmKHQ9ajMpO3ZhciBuPVtdLHI9ITEsaT17cmVhZDpmdW5jdGlvbigpe2lmKHIpdGhyb3cgbmV3IEVycm9yKCJTaWRlY2FyOiBjb3VsZCBub3QgYHJlYWRgIGZyb20gYW4gYGFzc2lnbmVkYCBtZWRpdW0uIGByZWFkYCBjb3VsZCBiZSB1c2VkIG9ubHkgd2l0aCBgdXNlTWVkaXVtYC4iKTtyZXR1cm4gbi5sZW5ndGg/bltuLmxlbmd0aC0xXTplfSx1c2VNZWRpdW06ZnVuY3Rpb24obyl7dmFyIGw9dChvLHIpO3JldHVybiBuLnB1c2gobCksZnVuY3Rpb24oKXtuPW4uZmlsdGVyKGZ1bmN0aW9uKHMpe3JldHVybiBzIT09bH0pfX0sYXNzaWduU3luY01lZGl1bTpmdW5jdGlvbihvKXtmb3Iocj0hMDtuLmxlbmd0aDspe3ZhciBsPW47bj1bXSxsLmZvckVhY2gobyl9bj17cHVzaDpmdW5jdGlvbihzKXtyZXR1cm4gbyhzKX0sZmlsdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIG59fX0sYXNzaWduTWVkaXVtOmZ1bmN0aW9uKG8pe3I9ITA7dmFyIGw9W107aWYobi5sZW5ndGgpe3ZhciBzPW47bj1bXSxzLmZvckVhY2gobyksbD1ufXZhciBhPWZ1bmN0aW9uKCl7dmFyIGM9bDtsPVtdLGMuZm9yRWFjaChvKX0sdT1mdW5jdGlvbigpe3JldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGEpfTt1KCksbj17cHVzaDpmdW5jdGlvbihjKXtsLnB1c2goYyksdSgpfSxmaWx0ZXI6ZnVuY3Rpb24oYyl7cmV0dXJuIGw9bC5maWx0ZXIoYyksbn19fX07cmV0dXJuIGl9ZnVuY3Rpb24gRjMoZSl7ZT09PXZvaWQgMCYmKGU9e30pO3ZhciB0PXozKG51bGwpO3JldHVybiB0Lm9wdGlvbnM9RHIoe2FzeW5jOiEwLHNzcjohMX0sZSksdH12YXIgcms9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zaWRlQ2FyLG49bmsoZSxbInNpZGVDYXIiXSk7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJTaWRlY2FyOiBwbGVhc2UgcHJvdmlkZSBgc2lkZUNhcmAgcHJvcGVydHkgdG8gaW1wb3J0IHRoZSByaWdodCBjYXIiKTt2YXIgcj10LnJlYWQoKTtpZighcil0aHJvdyBuZXcgRXJyb3IoIlNpZGVjYXIgbWVkaXVtIG5vdCBmb3VuZCIpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocixEcih7fSxuKSl9O3JrLmlzU2lkZUNhckV4cG9ydD0hMDtmdW5jdGlvbiBCMyhlLHQpe3JldHVybiBlLnVzZU1lZGl1bSh0KSxya312YXIgaWs9RjMoKSxIaD1mdW5jdGlvbigpe30sQmY9cC5mb3J3YXJkUmVmKGZ1bmN0aW9uKGUsdCl7dmFyIG49cC51c2VSZWYobnVsbCkscj1wLnVzZVN0YXRlKHtvblNjcm9sbENhcHR1cmU6SGgsb25XaGVlbENhcHR1cmU6SGgsb25Ub3VjaE1vdmVDYXB0dXJlOkhofSksaT1yWzBdLG89clsxXSxsPWUuZm9yd2FyZFByb3BzLHM9ZS5jaGlsZHJlbixhPWUuY2xhc3NOYW1lLHU9ZS5yZW1vdmVTY3JvbGxCYXIsYz1lLmVuYWJsZWQsZD1lLnNoYXJkcyxmPWUuc2lkZUNhcixoPWUubm9Jc29sYXRpb24sbT1lLmluZXJ0LGc9ZS5hbGxvd1BpbmNoWm9vbSx3PWUuYXMsdj13PT09dm9pZCAwPyJkaXYiOncseT1uayhlLFsiZm9yd2FyZFByb3BzIiwiY2hpbGRyZW4iLCJjbGFzc05hbWUiLCJyZW1vdmVTY3JvbGxCYXIiLCJlbmFibGVkIiwic2hhcmRzIiwic2lkZUNhciIsIm5vSXNvbGF0aW9uIiwiaW5lcnQiLCJhbGxvd1BpbmNoWm9vbSIsImFzIl0pLF89ZixTPUkzKFtuLHRdKSxFPURyKERyKHt9LHkpLGkpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLGMmJnAuY3JlYXRlRWxlbWVudChfLHtzaWRlQ2FyOmlrLHJlbW92ZVNjcm9sbEJhcjp1LHNoYXJkczpkLG5vSXNvbGF0aW9uOmgsaW5lcnQ6bSxzZXRDYWxsYmFja3M6byxhbGxvd1BpbmNoWm9vbTohIWcsbG9ja1JlZjpufSksbD9wLmNsb25lRWxlbWVudChwLkNoaWxkcmVuLm9ubHkocyksRHIoRHIoe30sRSkse3JlZjpTfSkpOnAuY3JlYXRlRWxlbWVudCh2LERyKHt9LEUse2NsYXNzTmFtZTphLHJlZjpTfSkscykpfSk7QmYuZGVmYXVsdFByb3BzPXtlbmFibGVkOiEwLHJlbW92ZVNjcm9sbEJhcjohMCxpbmVydDohMX07QmYuY2xhc3NOYW1lcz17ZnVsbFdpZHRoOkdjLHplcm9SaWdodDpaY307dmFyIEt4LFUzPWZ1bmN0aW9uKCl7aWYoS3gpcmV0dXJuIEt4O2lmKHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXzwidSIpcmV0dXJuIF9fd2VicGFja19ub25jZV9ffTtmdW5jdGlvbiBXMygpe2lmKCFkb2N1bWVudClyZXR1cm4gbnVsbDt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2UudHlwZT0idGV4dC9jc3MiO3ZhciB0PVUzKCk7cmV0dXJuIHQmJmUuc2V0QXR0cmlidXRlKCJub25jZSIsdCksZX1mdW5jdGlvbiBWMyhlLHQpe2Uuc3R5bGVTaGVldD9lLnN0eWxlU2hlZXQuY3NzVGV4dD10OmUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodCkpfWZ1bmN0aW9uIEgzKGUpe3ZhciB0PWRvY3VtZW50LmhlYWR8fGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF07dC5hcHBlbmRDaGlsZChlKX12YXIgSzM9ZnVuY3Rpb24oKXt2YXIgZT0wLHQ9bnVsbDtyZXR1cm57YWRkOmZ1bmN0aW9uKG4pe2U9PTAmJih0PVczKCkpJiYoVjModCxuKSxIMyh0KSksZSsrfSxyZW1vdmU6ZnVuY3Rpb24oKXtlLS0sIWUmJnQmJih0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGwpfX19LFozPWZ1bmN0aW9uKCl7dmFyIGU9SzMoKTtyZXR1cm4gZnVuY3Rpb24odCxuKXtwLnVzZUVmZmVjdChmdW5jdGlvbigpe3JldHVybiBlLmFkZCh0KSxmdW5jdGlvbigpe2UucmVtb3ZlKCl9fSxbdCYmbl0pfX0sb2s9ZnVuY3Rpb24oKXt2YXIgZT1aMygpLHQ9ZnVuY3Rpb24obil7dmFyIHI9bi5zdHlsZXMsaT1uLmR5bmFtaWM7cmV0dXJuIGUocixpKSxudWxsfTtyZXR1cm4gdH0sRzM9e2xlZnQ6MCx0b3A6MCxyaWdodDowLGdhcDowfSxLaD1mdW5jdGlvbihlKXtyZXR1cm4gcGFyc2VJbnQoZXx8IiIsMTApfHwwfSxZMz1mdW5jdGlvbihlKXt2YXIgdD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KSxuPXRbZT09PSJwYWRkaW5nIj8icGFkZGluZ0xlZnQiOiJtYXJnaW5MZWZ0Il0scj10W2U9PT0icGFkZGluZyI/InBhZGRpbmdUb3AiOiJtYXJnaW5Ub3AiXSxpPXRbZT09PSJwYWRkaW5nIj8icGFkZGluZ1JpZ2h0IjoibWFyZ2luUmlnaHQiXTtyZXR1cm5bS2gobiksS2gociksS2goaSldfSxYMz1mdW5jdGlvbihlKXtpZihlPT09dm9pZCAwJiYoZT0ibWFyZ2luIiksdHlwZW9mIHdpbmRvdz4idSIpcmV0dXJuIEczO3ZhciB0PVkzKGUpLG49ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLHI9d2luZG93LmlubmVyV2lkdGg7cmV0dXJue2xlZnQ6dFswXSx0b3A6dFsxXSxyaWdodDp0WzJdLGdhcDpNYXRoLm1heCgwLHItbit0WzJdLXRbMF0pfX0sUTM9b2soKSxKMz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1lLmxlZnQsbz1lLnRvcCxsPWUucmlnaHQscz1lLmdhcDtyZXR1cm4gbj09PXZvaWQgMCYmKG49Im1hcmdpbiIpLGAKICAuYC5jb25jYXQoQTMsYCB7CiAgIG92ZXJmbG93OiBoaWRkZW4gYCkuY29uY2F0KHIsYDsKICAgcGFkZGluZy1yaWdodDogYCkuY29uY2F0KHMsInB4ICIpLmNvbmNhdChyLGA7CiAgfQogIGJvZHkgewogICAgb3ZlcmZsb3c6IGhpZGRlbiBgKS5jb25jYXQocixgOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjsKICAgIGApLmNvbmNhdChbdCYmInBvc2l0aW9uOiByZWxhdGl2ZSAiLmNvbmNhdChyLCI7Iiksbj09PSJtYXJnaW4iJiZgCiAgICBwYWRkaW5nLWxlZnQ6IGAuY29uY2F0KGksYHB4OwogICAgcGFkZGluZy10b3A6IGApLmNvbmNhdChvLGBweDsKICAgIHBhZGRpbmctcmlnaHQ6IGApLmNvbmNhdChsLGBweDsKICAgIG1hcmdpbi1sZWZ0OjA7CiAgICBtYXJnaW4tdG9wOjA7CiAgICBtYXJnaW4tcmlnaHQ6IGApLmNvbmNhdChzLCJweCAiKS5jb25jYXQocixgOwogICAgYCksbj09PSJwYWRkaW5nIiYmInBhZGRpbmctcmlnaHQ6ICIuY29uY2F0KHMsInB4ICIpLmNvbmNhdChyLCI7IildLmZpbHRlcihCb29sZWFuKS5qb2luKCIiKSxgCiAgfQogIAogIC5gKS5jb25jYXQoWmMsYCB7CiAgICByaWdodDogYCkuY29uY2F0KHMsInB4ICIpLmNvbmNhdChyLGA7CiAgfQogIAogIC5gKS5jb25jYXQoR2MsYCB7CiAgICBtYXJnaW4tcmlnaHQ6IGApLmNvbmNhdChzLCJweCAiKS5jb25jYXQocixgOwogIH0KICAKICAuYCkuY29uY2F0KFpjLCIgLiIpLmNvbmNhdChaYyxgIHsKICAgIHJpZ2h0OiAwIGApLmNvbmNhdChyLGA7CiAgfQogIAogIC5gKS5jb25jYXQoR2MsIiAuIikuY29uY2F0KEdjLGAgewogICAgbWFyZ2luLXJpZ2h0OiAwIGApLmNvbmNhdChyLGA7CiAgfQogIAogIGJvZHkgewogICAgYCkuY29uY2F0KE0zLCI6ICIpLmNvbmNhdChzLGBweDsKICB9CmApfSxxMz1mdW5jdGlvbihlKXt2YXIgdD1lLm5vUmVsYXRpdmUsbj1lLm5vSW1wb3J0YW50LHI9ZS5nYXBNb2RlLGk9cj09PXZvaWQgMD8ibWFyZ2luIjpyLG89cC51c2VNZW1vKGZ1bmN0aW9uKCl7cmV0dXJuIFgzKGkpfSxbaV0pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoUTMse3N0eWxlczpKMyhvLCF0LGksbj8iIjoiIWltcG9ydGFudCIpfSl9LFVtPSExO2lmKHR5cGVvZiB3aW5kb3c8InUiKXRyeXt2YXIga2M9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFVtPSEwLCEwfX0pO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0IixrYyxrYyksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRlc3QiLGtjLGtjKX1jYXRjaHtVbT0hMX12YXIgRWw9VW0/e3Bhc3NpdmU6ITF9OiExLGU0PWZ1bmN0aW9uKGUpe3JldHVybiBlLnRhZ05hbWU9PT0iVEVYVEFSRUEifSxsaz1mdW5jdGlvbihlLHQpe3ZhciBuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpO3JldHVybiBuW3RdIT09ImhpZGRlbiImJiEobi5vdmVyZmxvd1k9PT1uLm92ZXJmbG93WCYmIWU0KGUpJiZuW3RdPT09InZpc2libGUiKX0sdDQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGxrKGUsIm92ZXJmbG93WSIpfSxuND1mdW5jdGlvbihlKXtyZXR1cm4gbGsoZSwib3ZlcmZsb3dYIil9LFp4PWZ1bmN0aW9uKGUsdCl7dmFyIG49dDtkb3t0eXBlb2YgU2hhZG93Um9vdDwidSImJm4gaW5zdGFuY2VvZiBTaGFkb3dSb290JiYobj1uLmhvc3QpO3ZhciByPXNrKGUsbik7aWYocil7dmFyIGk9YWsoZSxuKSxvPWlbMV0sbD1pWzJdO2lmKG8+bClyZXR1cm4hMH1uPW4ucGFyZW50Tm9kZX13aGlsZShuJiZuIT09ZG9jdW1lbnQuYm9keSk7cmV0dXJuITF9LHI0PWZ1bmN0aW9uKGUpe3ZhciB0PWUuc2Nyb2xsVG9wLG49ZS5zY3JvbGxIZWlnaHQscj1lLmNsaWVudEhlaWdodDtyZXR1cm5bdCxuLHJdfSxpND1mdW5jdGlvbihlKXt2YXIgdD1lLnNjcm9sbExlZnQsbj1lLnNjcm9sbFdpZHRoLHI9ZS5jbGllbnRXaWR0aDtyZXR1cm5bdCxuLHJdfSxzaz1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09InYiP3Q0KHQpOm40KHQpfSxhaz1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09InYiP3I0KHQpOmk0KHQpfSxvND1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09ImgiJiZ0PT09InJ0bCI/LTE6MX0sbDQ9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz1vNChlLHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLmRpcmVjdGlvbiksbD1vKnIscz1uLnRhcmdldCxhPXQuY29udGFpbnMocyksdT0hMSxjPWw+MCxkPTAsZj0wO2Rve3ZhciBoPWFrKGUscyksbT1oWzBdLGc9aFsxXSx3PWhbMl0sdj1nLXctbyptOyhtfHx2KSYmc2soZSxzKSYmKGQrPXYsZis9bSkscz1zLnBhcmVudE5vZGV9d2hpbGUoIWEmJnMhPT1kb2N1bWVudC5ib2R5fHxhJiYodC5jb250YWlucyhzKXx8dD09PXMpKTtyZXR1cm4oYyYmKGkmJmQ9PT0wfHwhaSYmbD5kKXx8IWMmJihpJiZmPT09MHx8IWkmJi1sPmYpKSYmKHU9ITApLHV9LCRjPWZ1bmN0aW9uKGUpe3JldHVybiJjaGFuZ2VkVG91Y2hlcyJpbiBlP1tlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFgsZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZXTpbMCwwXX0sR3g9ZnVuY3Rpb24oZSl7cmV0dXJuW2UuZGVsdGFYLGUuZGVsdGFZXX0sWXg9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJjdXJyZW50ImluIGU/ZS5jdXJyZW50OmV9LHM0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbMF09PT10WzBdJiZlWzFdPT09dFsxXX0sYTQ9ZnVuY3Rpb24oZSl7cmV0dXJuYAogIC5ibG9jay1pbnRlcmFjdGl2aXR5LWAuY29uY2F0KGUsYCB7cG9pbnRlci1ldmVudHM6IG5vbmU7fQogIC5hbGxvdy1pbnRlcmFjdGl2aXR5LWApLmNvbmNhdChlLGAge3BvaW50ZXItZXZlbnRzOiBhbGw7fQpgKX0sdTQ9MCxDbD1bXTtmdW5jdGlvbiBjNChlKXt2YXIgdD1wLnVzZVJlZihbXSksbj1wLnVzZVJlZihbMCwwXSkscj1wLnVzZVJlZigpLGk9cC51c2VTdGF0ZSh1NCsrKVswXSxvPXAudXNlU3RhdGUoZnVuY3Rpb24oKXtyZXR1cm4gb2soKX0pWzBdLGw9cC51c2VSZWYoZSk7cC51c2VFZmZlY3QoZnVuY3Rpb24oKXtsLmN1cnJlbnQ9ZX0sW2VdKSxwLnVzZUVmZmVjdChmdW5jdGlvbigpe2lmKGUuaW5lcnQpe2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiYmxvY2staW50ZXJhY3Rpdml0eS0iLmNvbmNhdChpKSk7dmFyIGc9UDMoW2UubG9ja1JlZi5jdXJyZW50XSwoZS5zaGFyZHN8fFtdKS5tYXAoWXgpLCEwKS5maWx0ZXIoQm9vbGVhbik7cmV0dXJuIGcuZm9yRWFjaChmdW5jdGlvbih3KXtyZXR1cm4gdy5jbGFzc0xpc3QuYWRkKCJhbGxvdy1pbnRlcmFjdGl2aXR5LSIuY29uY2F0KGkpKX0pLGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJibG9jay1pbnRlcmFjdGl2aXR5LSIuY29uY2F0KGkpKSxnLmZvckVhY2goZnVuY3Rpb24odyl7cmV0dXJuIHcuY2xhc3NMaXN0LnJlbW92ZSgiYWxsb3ctaW50ZXJhY3Rpdml0eS0iLmNvbmNhdChpKSl9KX19fSxbZS5pbmVydCxlLmxvY2tSZWYuY3VycmVudCxlLnNoYXJkc10pO3ZhciBzPXAudXNlQ2FsbGJhY2soZnVuY3Rpb24oZyx3KXtpZigidG91Y2hlcyJpbiBnJiZnLnRvdWNoZXMubGVuZ3RoPT09MilyZXR1cm4hbC5jdXJyZW50LmFsbG93UGluY2hab29tO3ZhciB2PSRjKGcpLHk9bi5jdXJyZW50LF89ImRlbHRhWCJpbiBnP2cuZGVsdGFYOnlbMF0tdlswXSxTPSJkZWx0YVkiaW4gZz9nLmRlbHRhWTp5WzFdLXZbMV0sRSwkPWcudGFyZ2V0LEM9TWF0aC5hYnMoXyk+TWF0aC5hYnMoUyk/ImgiOiJ2IjtpZigidG91Y2hlcyJpbiBnJiZDPT09ImgiJiYkLnR5cGU9PT0icmFuZ2UiKXJldHVybiExO3ZhciBUPVp4KEMsJCk7aWYoIVQpcmV0dXJuITA7aWYoVD9FPUM6KEU9Qz09PSJ2Ij8iaCI6InYiLFQ9WngoQywkKSksIVQpcmV0dXJuITE7aWYoIXIuY3VycmVudCYmImNoYW5nZWRUb3VjaGVzImluIGcmJihffHxTKSYmKHIuY3VycmVudD1FKSwhRSlyZXR1cm4hMDt2YXIgTj1yLmN1cnJlbnR8fEU7cmV0dXJuIGw0KE4sdyxnLE49PT0iaCI/XzpTLCEwKX0sW10pLGE9cC51c2VDYWxsYmFjayhmdW5jdGlvbihnKXt2YXIgdz1nO2lmKCEoIUNsLmxlbmd0aHx8Q2xbQ2wubGVuZ3RoLTFdIT09bykpe3ZhciB2PSJkZWx0YVkiaW4gdz9HeCh3KTokYyh3KSx5PXQuY3VycmVudC5maWx0ZXIoZnVuY3Rpb24oRSl7cmV0dXJuIEUubmFtZT09PXcudHlwZSYmRS50YXJnZXQ9PT13LnRhcmdldCYmczQoRS5kZWx0YSx2KX0pWzBdO2lmKHkmJnkuc2hvdWxkKXt3LmNhbmNlbGFibGUmJncucHJldmVudERlZmF1bHQoKTtyZXR1cm59aWYoIXkpe3ZhciBfPShsLmN1cnJlbnQuc2hhcmRzfHxbXSkubWFwKFl4KS5maWx0ZXIoQm9vbGVhbikuZmlsdGVyKGZ1bmN0aW9uKEUpe3JldHVybiBFLmNvbnRhaW5zKHcudGFyZ2V0KX0pLFM9Xy5sZW5ndGg+MD9zKHcsX1swXSk6IWwuY3VycmVudC5ub0lzb2xhdGlvbjtTJiZ3LmNhbmNlbGFibGUmJncucHJldmVudERlZmF1bHQoKX19fSxbXSksdT1wLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGcsdyx2LHkpe3ZhciBfPXtuYW1lOmcsZGVsdGE6dyx0YXJnZXQ6dixzaG91bGQ6eX07dC5jdXJyZW50LnB1c2goXyksc2V0VGltZW91dChmdW5jdGlvbigpe3QuY3VycmVudD10LmN1cnJlbnQuZmlsdGVyKGZ1bmN0aW9uKFMpe3JldHVybiBTIT09X30pfSwxKX0sW10pLGM9cC51c2VDYWxsYmFjayhmdW5jdGlvbihnKXtuLmN1cnJlbnQ9JGMoZyksci5jdXJyZW50PXZvaWQgMH0sW10pLGQ9cC51c2VDYWxsYmFjayhmdW5jdGlvbihnKXt1KGcudHlwZSxHeChnKSxnLnRhcmdldCxzKGcsZS5sb2NrUmVmLmN1cnJlbnQpKX0sW10pLGY9cC51c2VDYWxsYmFjayhmdW5jdGlvbihnKXt1KGcudHlwZSwkYyhnKSxnLnRhcmdldCxzKGcsZS5sb2NrUmVmLmN1cnJlbnQpKX0sW10pO3AudXNlRWZmZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIENsLnB1c2gobyksZS5zZXRDYWxsYmFja3Moe29uU2Nyb2xsQ2FwdHVyZTpkLG9uV2hlZWxDYXB0dXJlOmQsb25Ub3VjaE1vdmVDYXB0dXJlOmZ9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsYSxFbCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixhLEVsKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixjLEVsKSxmdW5jdGlvbigpe0NsPUNsLmZpbHRlcihmdW5jdGlvbihnKXtyZXR1cm4gZyE9PW99KSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ3aGVlbCIsYSxFbCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixhLEVsKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixjLEVsKX19LFtdKTt2YXIgaD1lLnJlbW92ZVNjcm9sbEJhcixtPWUuaW5lcnQ7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwsbT9wLmNyZWF0ZUVsZW1lbnQobyx7c3R5bGVzOmE0KGkpfSk6bnVsbCxoP3AuY3JlYXRlRWxlbWVudChxMyx7Z2FwTW9kZToibWFyZ2luIn0pOm51bGwpfWNvbnN0IGQ0PUIzKGlrLGM0KTt2YXIgdWs9cC5mb3J3YXJkUmVmKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChCZixEcih7fSxlLHtyZWY6dCxzaWRlQ2FyOmQ0fSkpfSk7dWsuY2xhc3NOYW1lcz1CZi5jbGFzc05hbWVzO2NvbnN0IGY0PXVrLGg0PVsiICIsIkVudGVyIiwiQXJyb3dVcCIsIkFycm93RG93biJdLHA0PVsiICIsIkVudGVyIl0sVWY9IlNlbGVjdCIsW1dmLEh2LG00XT1EQyhVZiksW2pzLFJJXT1sbChVZixbbTQsWENdKSxLdj1YQygpLFtnNCxkbF09anMoVWYpLFt2NCx5NF09anMoVWYpLHg0PWU9Pntjb25zdHtfX3Njb3BlU2VsZWN0OnQsY2hpbGRyZW46bixvcGVuOnIsZGVmYXVsdE9wZW46aSxvbk9wZW5DaGFuZ2U6byx2YWx1ZTpsLGRlZmF1bHRWYWx1ZTpzLG9uVmFsdWVDaGFuZ2U6YSxkaXI6dSxuYW1lOmMsYXV0b0NvbXBsZXRlOmQsZGlzYWJsZWQ6ZixyZXF1aXJlZDpofT1lLG09S3YodCksW2csd109cC51c2VTdGF0ZShudWxsKSxbdix5XT1wLnVzZVN0YXRlKG51bGwpLFtfLFNdPXAudXNlU3RhdGUoITEpLEU9R2codSksWyQ9ITEsQ109Z3Moe3Byb3A6cixkZWZhdWx0UHJvcDppLG9uQ2hhbmdlOm99KSxbVCxOXT1ncyh7cHJvcDpsLGRlZmF1bHRQcm9wOnMsb25DaGFuZ2U6YX0pLFI9cC51c2VSZWYobnVsbCksRD1nPyEhZy5jbG9zZXN0KCJmb3JtIik6ITAsW0Ysc2VdPXAudXNlU3RhdGUobmV3IFNldCksVj1BcnJheS5mcm9tKEYpLm1hcChLPT5LLnByb3BzLnZhbHVlKS5qb2luKCI7Iik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChTMyxtLHAuY3JlYXRlRWxlbWVudChnNCx7cmVxdWlyZWQ6aCxzY29wZTp0LHRyaWdnZXI6ZyxvblRyaWdnZXJDaGFuZ2U6dyx2YWx1ZU5vZGU6dixvblZhbHVlTm9kZUNoYW5nZTp5LHZhbHVlTm9kZUhhc0NoaWxkcmVuOl8sb25WYWx1ZU5vZGVIYXNDaGlsZHJlbkNoYW5nZTpTLGNvbnRlbnRJZDpqZigpLHZhbHVlOlQsb25WYWx1ZUNoYW5nZTpOLG9wZW46JCxvbk9wZW5DaGFuZ2U6QyxkaXI6RSx0cmlnZ2VyUG9pbnRlckRvd25Qb3NSZWY6UixkaXNhYmxlZDpmfSxwLmNyZWF0ZUVsZW1lbnQoV2YuUHJvdmlkZXIse3Njb3BlOnR9LHAuY3JlYXRlRWxlbWVudCh2NCx7c2NvcGU6ZS5fX3Njb3BlU2VsZWN0LG9uTmF0aXZlT3B0aW9uQWRkOnAudXNlQ2FsbGJhY2soSz0+e3NlKE89Pm5ldyBTZXQoTykuYWRkKEspKX0sW10pLG9uTmF0aXZlT3B0aW9uUmVtb3ZlOnAudXNlQ2FsbGJhY2soSz0+e3NlKE89Pntjb25zdCBBPW5ldyBTZXQoTyk7cmV0dXJuIEEuZGVsZXRlKEspLEF9KX0sW10pfSxuKSksRD9wLmNyZWF0ZUVsZW1lbnQoaGsse2tleTpWLCJhcmlhLWhpZGRlbiI6ITAscmVxdWlyZWQ6aCx0YWJJbmRleDotMSxuYW1lOmMsYXV0b0NvbXBsZXRlOmQsdmFsdWU6VCxvbkNoYW5nZTpLPT5OKEsudGFyZ2V0LnZhbHVlKSxkaXNhYmxlZDpmfSxUPT09dm9pZCAwP3AuY3JlYXRlRWxlbWVudCgib3B0aW9uIix7dmFsdWU6IiJ9KTpudWxsLEFycmF5LmZyb20oRikpOm51bGwpKX0sXzQ9IlNlbGVjdFRyaWdnZXIiLHc0PXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6bixkaXNhYmxlZDpyPSExLC4uLml9PWUsbz1LdihuKSxsPWRsKF80LG4pLHM9bC5kaXNhYmxlZHx8cixhPXN0KHQsbC5vblRyaWdnZXJDaGFuZ2UpLHU9SHYobiksW2MsZCxmXT1wayhtPT57Y29uc3QgZz11KCkuZmlsdGVyKHk9PiF5LmRpc2FibGVkKSx3PWcuZmluZCh5PT55LnZhbHVlPT09bC52YWx1ZSksdj1tayhnLG0sdyk7diE9PXZvaWQgMCYmbC5vblZhbHVlQ2hhbmdlKHYudmFsdWUpfSksaD0oKT0+e3N8fChsLm9uT3BlbkNoYW5nZSghMCksZigpKX07cmV0dXJuIHAuY3JlYXRlRWxlbWVudChFMyxpZSh7YXNDaGlsZDohMH0sbykscC5jcmVhdGVFbGVtZW50KEtlLmJ1dHRvbixpZSh7dHlwZToiYnV0dG9uIixyb2xlOiJjb21ib2JveCIsImFyaWEtY29udHJvbHMiOmwuY29udGVudElkLCJhcmlhLWV4cGFuZGVkIjpsLm9wZW4sImFyaWEtcmVxdWlyZWQiOmwucmVxdWlyZWQsImFyaWEtYXV0b2NvbXBsZXRlIjoibm9uZSIsZGlyOmwuZGlyLCJkYXRhLXN0YXRlIjpsLm9wZW4/Im9wZW4iOiJjbG9zZWQiLGRpc2FibGVkOnMsImRhdGEtZGlzYWJsZWQiOnM/IiI6dm9pZCAwLCJkYXRhLXBsYWNlaG9sZGVyIjpmayhsLnZhbHVlKT8iIjp2b2lkIDB9LGkse3JlZjphLG9uQ2xpY2s6bnQoaS5vbkNsaWNrLG09PnttLmN1cnJlbnRUYXJnZXQuZm9jdXMoKX0pLG9uUG9pbnRlckRvd246bnQoaS5vblBvaW50ZXJEb3duLG09Pntjb25zdCBnPW0udGFyZ2V0O2cuaGFzUG9pbnRlckNhcHR1cmUobS5wb2ludGVySWQpJiZnLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShtLnBvaW50ZXJJZCksbS5idXR0b249PT0wJiZtLmN0cmxLZXk9PT0hMSYmKGgoKSxsLnRyaWdnZXJQb2ludGVyRG93blBvc1JlZi5jdXJyZW50PXt4Ok1hdGgucm91bmQobS5wYWdlWCkseTpNYXRoLnJvdW5kKG0ucGFnZVkpfSxtLnByZXZlbnREZWZhdWx0KCkpfSksb25LZXlEb3duOm50KGkub25LZXlEb3duLG09Pntjb25zdCBnPWMuY3VycmVudCE9PSIiOyEobS5jdHJsS2V5fHxtLmFsdEtleXx8bS5tZXRhS2V5KSYmbS5rZXkubGVuZ3RoPT09MSYmZChtLmtleSksIShnJiZtLmtleT09PSIgIikmJmg0LmluY2x1ZGVzKG0ua2V5KSYmKGgoKSxtLnByZXZlbnREZWZhdWx0KCkpfSl9KSkpfSksUzQ9IlNlbGVjdFZhbHVlIixFND1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sY2xhc3NOYW1lOnIsc3R5bGU6aSxjaGlsZHJlbjpvLHBsYWNlaG9sZGVyOmw9IiIsLi4uc309ZSxhPWRsKFM0LG4pLHtvblZhbHVlTm9kZUhhc0NoaWxkcmVuQ2hhbmdlOnV9PWEsYz1vIT09dm9pZCAwLGQ9c3QodCxhLm9uVmFsdWVOb2RlQ2hhbmdlKTtyZXR1cm4gVW4oKCk9Pnt1KGMpfSxbdSxjXSkscC5jcmVhdGVFbGVtZW50KEtlLnNwYW4saWUoe30scyx7cmVmOmQsc3R5bGU6e3BvaW50ZXJFdmVudHM6Im5vbmUifX0pLGZrKGEudmFsdWUpP3AuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwsbCk6byl9KSxDND1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sY2hpbGRyZW46ciwuLi5pfT1lO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoS2Uuc3BhbixpZSh7ImFyaWEtaGlkZGVuIjohMH0saSx7cmVmOnR9KSxyfHwi4pa8Iil9KSxrND1lPT5wLmNyZWF0ZUVsZW1lbnQoazMsaWUoe2FzQ2hpbGQ6ITB9LGUpKSx2cz0iU2VsZWN0Q29udGVudCIsJDQ9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3Qgbj1kbCh2cyxlLl9fc2NvcGVTZWxlY3QpLFtyLGldPXAudXNlU3RhdGUoKTtpZihVbigoKT0+e2kobmV3IERvY3VtZW50RnJhZ21lbnQpfSxbXSksIW4ub3Blbil7Y29uc3Qgbz1yO3JldHVybiBvP0dyLmNyZWF0ZVBvcnRhbChwLmNyZWF0ZUVsZW1lbnQoY2sse3Njb3BlOmUuX19zY29wZVNlbGVjdH0scC5jcmVhdGVFbGVtZW50KFdmLlNsb3Qse3Njb3BlOmUuX19zY29wZVNlbGVjdH0scC5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsZS5jaGlsZHJlbikpKSxvKTpudWxsfXJldHVybiBwLmNyZWF0ZUVsZW1lbnQoYjQsaWUoe30sZSx7cmVmOnR9KSl9KSxyaT0xMCxbY2ssVmZdPWpzKHZzKSxiND1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4scG9zaXRpb246cj0iaXRlbS1hbGlnbmVkIixvbkNsb3NlQXV0b0ZvY3VzOmksb25Fc2NhcGVLZXlEb3duOm8sb25Qb2ludGVyRG93bk91dHNpZGU6bCxzaWRlOnMsc2lkZU9mZnNldDphLGFsaWduOnUsYWxpZ25PZmZzZXQ6YyxhcnJvd1BhZGRpbmc6ZCxjb2xsaXNpb25Cb3VuZGFyeTpmLGNvbGxpc2lvblBhZGRpbmc6aCxzdGlja3k6bSxoaWRlV2hlbkRldGFjaGVkOmcsYXZvaWRDb2xsaXNpb25zOncsLi4udn09ZSx5PWRsKHZzLG4pLFtfLFNdPXAudXNlU3RhdGUobnVsbCksW0UsJF09cC51c2VTdGF0ZShudWxsKSxDPXN0KHQsdGU9PlModGUpKSxbVCxOXT1wLnVzZVN0YXRlKG51bGwpLFtSLERdPXAudXNlU3RhdGUobnVsbCksRj1IdihuKSxbc2UsVl09cC51c2VTdGF0ZSghMSksSz1wLnVzZVJlZighMSk7cC51c2VFZmZlY3QoKCk9PntpZihfKXJldHVybiBPMyhfKX0sW19dKSx3TSgpO2NvbnN0IE89cC51c2VDYWxsYmFjayh0ZT0+e2NvbnN0W0llLC4uLmJlXT1GKCkubWFwKERlPT5EZS5yZWYuY3VycmVudCksW1JlXT1iZS5zbGljZSgtMSksU2U9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtmb3IoY29uc3QgRGUgb2YgdGUpaWYoRGU9PT1TZXx8KERlPT1udWxsfHxEZS5zY3JvbGxJbnRvVmlldyh7YmxvY2s6Im5lYXJlc3QifSksRGU9PT1JZSYmRSYmKEUuc2Nyb2xsVG9wPTApLERlPT09UmUmJkUmJihFLnNjcm9sbFRvcD1FLnNjcm9sbEhlaWdodCksRGU9PW51bGx8fERlLmZvY3VzKCksZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PVNlKSlyZXR1cm59LFtGLEVdKSxBPXAudXNlQ2FsbGJhY2soKCk9Pk8oW1QsX10pLFtPLFQsX10pO3AudXNlRWZmZWN0KCgpPT57c2UmJkEoKX0sW3NlLEFdKTtjb25zdHtvbk9wZW5DaGFuZ2U6ayx0cmlnZ2VyUG9pbnRlckRvd25Qb3NSZWY6an09eTtwLnVzZUVmZmVjdCgoKT0+e2lmKF8pe2xldCB0ZT17eDowLHk6MH07Y29uc3QgSWU9UmU9Pnt2YXIgU2UsRGUsUWUsV3Q7dGU9e3g6TWF0aC5hYnMoTWF0aC5yb3VuZChSZS5wYWdlWCktKChTZT0oRGU9ai5jdXJyZW50KT09PW51bGx8fERlPT09dm9pZCAwP3ZvaWQgMDpEZS54KSE9PW51bGwmJlNlIT09dm9pZCAwP1NlOjApKSx5Ok1hdGguYWJzKE1hdGgucm91bmQoUmUucGFnZVkpLSgoUWU9KFd0PWouY3VycmVudCk9PT1udWxsfHxXdD09PXZvaWQgMD92b2lkIDA6V3QueSkhPT1udWxsJiZRZSE9PXZvaWQgMD9RZTowKSl9fSxiZT1SZT0+e3RlLng8PTEwJiZ0ZS55PD0xMD9SZS5wcmV2ZW50RGVmYXVsdCgpOl8uY29udGFpbnMoUmUudGFyZ2V0KXx8ayghMSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLEllKSxqLmN1cnJlbnQ9bnVsbH07cmV0dXJuIGouY3VycmVudCE9PW51bGwmJihkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsSWUpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsYmUse2NhcHR1cmU6ITAsb25jZTohMH0pKSwoKT0+e2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIixJZSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIixiZSx7Y2FwdHVyZTohMH0pfX19LFtfLGssal0pLHAudXNlRWZmZWN0KCgpPT57Y29uc3QgdGU9KCk9PmsoITEpO3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsdGUpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRlKSwoKT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJibHVyIix0ZSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdGUpfX0sW2tdKTtjb25zdFtJLFpdPXBrKHRlPT57Y29uc3QgSWU9RigpLmZpbHRlcihTZT0+IVNlLmRpc2FibGVkKSxiZT1JZS5maW5kKFNlPT5TZS5yZWYuY3VycmVudD09PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLFJlPW1rKEllLHRlLGJlKTtSZSYmc2V0VGltZW91dCgoKT0+UmUucmVmLmN1cnJlbnQuZm9jdXMoKSl9KSxuZT1wLnVzZUNhbGxiYWNrKCh0ZSxJZSxiZSk9Pntjb25zdCBSZT0hSy5jdXJyZW50JiYhYmU7KHkudmFsdWUhPT12b2lkIDAmJnkudmFsdWU9PT1JZXx8UmUpJiYoTih0ZSksUmUmJihLLmN1cnJlbnQ9ITApKX0sW3kudmFsdWVdKSxrZT1wLnVzZUNhbGxiYWNrKCgpPT5fPT1udWxsP3ZvaWQgMDpfLmZvY3VzKCksW19dKSx2ZT1wLnVzZUNhbGxiYWNrKCh0ZSxJZSxiZSk9Pntjb25zdCBSZT0hSy5jdXJyZW50JiYhYmU7KHkudmFsdWUhPT12b2lkIDAmJnkudmFsdWU9PT1JZXx8UmUpJiZEKHRlKX0sW3kudmFsdWVdKSxXZT1yPT09InBvcHBlciI/WHg6VDQsRmU9V2U9PT1YeD97c2lkZTpzLHNpZGVPZmZzZXQ6YSxhbGlnbjp1LGFsaWduT2Zmc2V0OmMsYXJyb3dQYWRkaW5nOmQsY29sbGlzaW9uQm91bmRhcnk6Zixjb2xsaXNpb25QYWRkaW5nOmgsc3RpY2t5Om0saGlkZVdoZW5EZXRhY2hlZDpnLGF2b2lkQ29sbGlzaW9uczp3fTp7fTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KGNrLHtzY29wZTpuLGNvbnRlbnQ6Xyx2aWV3cG9ydDpFLG9uVmlld3BvcnRDaGFuZ2U6JCxpdGVtUmVmQ2FsbGJhY2s6bmUsc2VsZWN0ZWRJdGVtOlQsb25JdGVtTGVhdmU6a2UsaXRlbVRleHRSZWZDYWxsYmFjazp2ZSxmb2N1c1NlbGVjdGVkSXRlbTpBLHNlbGVjdGVkSXRlbVRleHQ6Uixwb3NpdGlvbjpyLGlzUG9zaXRpb25lZDpzZSxzZWFyY2hSZWY6SX0scC5jcmVhdGVFbGVtZW50KGY0LHthczp1cyxhbGxvd1BpbmNoWm9vbTohMH0scC5jcmVhdGVFbGVtZW50KFNNLHthc0NoaWxkOiEwLHRyYXBwZWQ6eS5vcGVuLG9uTW91bnRBdXRvRm9jdXM6dGU9Pnt0ZS5wcmV2ZW50RGVmYXVsdCgpfSxvblVubW91bnRBdXRvRm9jdXM6bnQoaSx0ZT0+e3ZhciBJZTsoSWU9eS50cmlnZ2VyKT09PW51bGx8fEllPT09dm9pZCAwfHxJZS5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pLHRlLnByZXZlbnREZWZhdWx0KCl9KX0scC5jcmVhdGVFbGVtZW50KHlNLHthc0NoaWxkOiEwLGRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50czohMCxvbkVzY2FwZUtleURvd246byxvblBvaW50ZXJEb3duT3V0c2lkZTpsLG9uRm9jdXNPdXRzaWRlOnRlPT50ZS5wcmV2ZW50RGVmYXVsdCgpLG9uRGlzbWlzczooKT0+eS5vbk9wZW5DaGFuZ2UoITEpfSxwLmNyZWF0ZUVsZW1lbnQoV2UsaWUoe3JvbGU6Imxpc3Rib3giLGlkOnkuY29udGVudElkLCJkYXRhLXN0YXRlIjp5Lm9wZW4/Im9wZW4iOiJjbG9zZWQiLGRpcjp5LmRpcixvbkNvbnRleHRNZW51OnRlPT50ZS5wcmV2ZW50RGVmYXVsdCgpfSx2LEZlLHtvblBsYWNlZDooKT0+VighMCkscmVmOkMsc3R5bGU6e2Rpc3BsYXk6ImZsZXgiLGZsZXhEaXJlY3Rpb246ImNvbHVtbiIsb3V0bGluZToibm9uZSIsLi4udi5zdHlsZX0sb25LZXlEb3duOm50KHYub25LZXlEb3duLHRlPT57Y29uc3QgSWU9dGUuY3RybEtleXx8dGUuYWx0S2V5fHx0ZS5tZXRhS2V5O2lmKHRlLmtleT09PSJUYWIiJiZ0ZS5wcmV2ZW50RGVmYXVsdCgpLCFJZSYmdGUua2V5Lmxlbmd0aD09PTEmJloodGUua2V5KSxbIkFycm93VXAiLCJBcnJvd0Rvd24iLCJIb21lIiwiRW5kIl0uaW5jbHVkZXModGUua2V5KSl7bGV0IFJlPUYoKS5maWx0ZXIoU2U9PiFTZS5kaXNhYmxlZCkubWFwKFNlPT5TZS5yZWYuY3VycmVudCk7aWYoWyJBcnJvd1VwIiwiRW5kIl0uaW5jbHVkZXModGUua2V5KSYmKFJlPVJlLnNsaWNlKCkucmV2ZXJzZSgpKSxbIkFycm93VXAiLCJBcnJvd0Rvd24iXS5pbmNsdWRlcyh0ZS5rZXkpKXtjb25zdCBTZT10ZS50YXJnZXQsRGU9UmUuaW5kZXhPZihTZSk7UmU9UmUuc2xpY2UoRGUrMSl9c2V0VGltZW91dCgoKT0+TyhSZSkpLHRlLnByZXZlbnREZWZhdWx0KCl9fSl9KSkpKSkpfSksVDQ9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLG9uUGxhY2VkOnIsLi4uaX09ZSxvPWRsKHZzLG4pLGw9VmYodnMsbiksW3MsYV09cC51c2VTdGF0ZShudWxsKSxbdSxjXT1wLnVzZVN0YXRlKG51bGwpLGQ9c3QodCxDPT5jKEMpKSxmPUh2KG4pLGg9cC51c2VSZWYoITEpLG09cC51c2VSZWYoITApLHt2aWV3cG9ydDpnLHNlbGVjdGVkSXRlbTp3LHNlbGVjdGVkSXRlbVRleHQ6dixmb2N1c1NlbGVjdGVkSXRlbTp5fT1sLF89cC51c2VDYWxsYmFjaygoKT0+e2lmKG8udHJpZ2dlciYmby52YWx1ZU5vZGUmJnMmJnUmJmcmJncmJnYpe2NvbnN0IEM9by50cmlnZ2VyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFQ9dS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxOPW8udmFsdWVOb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFI9di5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihvLmRpciE9PSJydGwiKXtjb25zdCBTZT1SLmxlZnQtVC5sZWZ0LERlPU4ubGVmdC1TZSxRZT1DLmxlZnQtRGUsV3Q9Qy53aWR0aCtRZSxTbj1NYXRoLm1heChXdCxULndpZHRoKSx1cj13aW5kb3cuaW5uZXJXaWR0aC1yaSxqZT1ZcChEZSxbcmksdXItU25dKTtzLnN0eWxlLm1pbldpZHRoPVd0KyJweCIscy5zdHlsZS5sZWZ0PWplKyJweCJ9ZWxzZXtjb25zdCBTZT1ULnJpZ2h0LVIucmlnaHQsRGU9d2luZG93LmlubmVyV2lkdGgtTi5yaWdodC1TZSxRZT13aW5kb3cuaW5uZXJXaWR0aC1DLnJpZ2h0LURlLFd0PUMud2lkdGgrUWUsU249TWF0aC5tYXgoV3QsVC53aWR0aCksdXI9d2luZG93LmlubmVyV2lkdGgtcmksamU9WXAoRGUsW3JpLHVyLVNuXSk7cy5zdHlsZS5taW5XaWR0aD1XdCsicHgiLHMuc3R5bGUucmlnaHQ9amUrInB4In1jb25zdCBEPWYoKSxGPXdpbmRvdy5pbm5lckhlaWdodC1yaSoyLHNlPWcuc2Nyb2xsSGVpZ2h0LFY9d2luZG93LmdldENvbXB1dGVkU3R5bGUodSksSz1wYXJzZUludChWLmJvcmRlclRvcFdpZHRoLDEwKSxPPXBhcnNlSW50KFYucGFkZGluZ1RvcCwxMCksQT1wYXJzZUludChWLmJvcmRlckJvdHRvbVdpZHRoLDEwKSxrPXBhcnNlSW50KFYucGFkZGluZ0JvdHRvbSwxMCksaj1LK08rc2UraytBLEk9TWF0aC5taW4ody5vZmZzZXRIZWlnaHQqNSxqKSxaPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGcpLG5lPXBhcnNlSW50KFoucGFkZGluZ1RvcCwxMCksa2U9cGFyc2VJbnQoWi5wYWRkaW5nQm90dG9tLDEwKSx2ZT1DLnRvcCtDLmhlaWdodC8yLXJpLFdlPUYtdmUsRmU9dy5vZmZzZXRIZWlnaHQvMix0ZT13Lm9mZnNldFRvcCtGZSxJZT1LK08rdGUsYmU9ai1JZTtpZihJZTw9dmUpe2NvbnN0IFNlPXc9PT1EW0QubGVuZ3RoLTFdLnJlZi5jdXJyZW50O3Muc3R5bGUuYm90dG9tPSIwcHgiO2NvbnN0IERlPXUuY2xpZW50SGVpZ2h0LWcub2Zmc2V0VG9wLWcub2Zmc2V0SGVpZ2h0LFFlPU1hdGgubWF4KFdlLEZlKyhTZT9rZTowKStEZStBKSxXdD1JZStRZTtzLnN0eWxlLmhlaWdodD1XdCsicHgifWVsc2V7Y29uc3QgU2U9dz09PURbMF0ucmVmLmN1cnJlbnQ7cy5zdHlsZS50b3A9IjBweCI7Y29uc3QgUWU9TWF0aC5tYXgodmUsSytnLm9mZnNldFRvcCsoU2U/bmU6MCkrRmUpK2JlO3Muc3R5bGUuaGVpZ2h0PVFlKyJweCIsZy5zY3JvbGxUb3A9SWUtdmUrZy5vZmZzZXRUb3B9cy5zdHlsZS5tYXJnaW49YCR7cml9cHggMGAscy5zdHlsZS5taW5IZWlnaHQ9SSsicHgiLHMuc3R5bGUubWF4SGVpZ2h0PUYrInB4IixyPT1udWxsfHxyKCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT5oLmN1cnJlbnQ9ITApfX0sW2Ysby50cmlnZ2VyLG8udmFsdWVOb2RlLHMsdSxnLHcsdixvLmRpcixyXSk7VW4oKCk9Pl8oKSxbX10pO2NvbnN0W1MsRV09cC51c2VTdGF0ZSgpO1VuKCgpPT57dSYmRSh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh1KS56SW5kZXgpfSxbdV0pO2NvbnN0ICQ9cC51c2VDYWxsYmFjayhDPT57QyYmbS5jdXJyZW50PT09ITAmJihfKCkseT09bnVsbHx8eSgpLG0uY3VycmVudD0hMSl9LFtfLHldKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KE40LHtzY29wZTpuLGNvbnRlbnRXcmFwcGVyOnMsc2hvdWxkRXhwYW5kT25TY3JvbGxSZWY6aCxvblNjcm9sbEJ1dHRvbkNoYW5nZTokfSxwLmNyZWF0ZUVsZW1lbnQoImRpdiIse3JlZjphLHN0eWxlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLHBvc2l0aW9uOiJmaXhlZCIsekluZGV4OlN9fSxwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHt9LGkse3JlZjpkLHN0eWxlOntib3hTaXppbmc6ImJvcmRlci1ib3giLG1heEhlaWdodDoiMTAwJSIsLi4uaS5zdHlsZX19KSkpKX0pLFh4PXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6bixhbGlnbjpyPSJzdGFydCIsY29sbGlzaW9uUGFkZGluZzppPXJpLC4uLm99PWUsbD1LdihuKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KEMzLGllKHt9LGwsbyx7cmVmOnQsYWxpZ246cixjb2xsaXNpb25QYWRkaW5nOmksc3R5bGU6e2JveFNpemluZzoiYm9yZGVyLWJveCIsLi4uby5zdHlsZSwiLS1yYWRpeC1zZWxlY3QtY29udGVudC10cmFuc2Zvcm0tb3JpZ2luIjoidmFyKC0tcmFkaXgtcG9wcGVyLXRyYW5zZm9ybS1vcmlnaW4pIiwiLS1yYWRpeC1zZWxlY3QtY29udGVudC1hdmFpbGFibGUtd2lkdGgiOiJ2YXIoLS1yYWRpeC1wb3BwZXItYXZhaWxhYmxlLXdpZHRoKSIsIi0tcmFkaXgtc2VsZWN0LWNvbnRlbnQtYXZhaWxhYmxlLWhlaWdodCI6InZhcigtLXJhZGl4LXBvcHBlci1hdmFpbGFibGUtaGVpZ2h0KSIsIi0tcmFkaXgtc2VsZWN0LXRyaWdnZXItd2lkdGgiOiJ2YXIoLS1yYWRpeC1wb3BwZXItYW5jaG9yLXdpZHRoKSIsIi0tcmFkaXgtc2VsZWN0LXRyaWdnZXItaGVpZ2h0IjoidmFyKC0tcmFkaXgtcG9wcGVyLWFuY2hvci1oZWlnaHQpIn19KSl9KSxbTjQsUjRdPWpzKHZzLHt9KSxReD0iU2VsZWN0Vmlld3BvcnQiLE80PXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6biwuLi5yfT1lLGk9VmYoUXgsbiksbz1SNChReCxuKSxsPXN0KHQsaS5vblZpZXdwb3J0Q2hhbmdlKSxzPXAudXNlUmVmKDApO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLHAuY3JlYXRlRWxlbWVudCgic3R5bGUiLHtkYW5nZXJvdXNseVNldElubmVySFRNTDp7X19odG1sOiJbZGF0YS1yYWRpeC1zZWxlY3Qtdmlld3BvcnRde3Njcm9sbGJhci13aWR0aDpub25lOy1tcy1vdmVyZmxvdy1zdHlsZTpub25lOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNoO31bZGF0YS1yYWRpeC1zZWxlY3Qtdmlld3BvcnRdOjotd2Via2l0LXNjcm9sbGJhcntkaXNwbGF5Om5vbmV9In19KSxwLmNyZWF0ZUVsZW1lbnQoV2YuU2xvdCx7c2NvcGU6bn0scC5jcmVhdGVFbGVtZW50KEtlLmRpdixpZSh7ImRhdGEtcmFkaXgtc2VsZWN0LXZpZXdwb3J0IjoiIixyb2xlOiJwcmVzZW50YXRpb24ifSxyLHtyZWY6bCxzdHlsZTp7cG9zaXRpb246InJlbGF0aXZlIixmbGV4OjEsb3ZlcmZsb3c6ImF1dG8iLC4uLnIuc3R5bGV9LG9uU2Nyb2xsOm50KHIub25TY3JvbGwsYT0+e2NvbnN0IHU9YS5jdXJyZW50VGFyZ2V0LHtjb250ZW50V3JhcHBlcjpjLHNob3VsZEV4cGFuZE9uU2Nyb2xsUmVmOmR9PW87aWYoZCE9bnVsbCYmZC5jdXJyZW50JiZjKXtjb25zdCBmPU1hdGguYWJzKHMuY3VycmVudC11LnNjcm9sbFRvcCk7aWYoZj4wKXtjb25zdCBoPXdpbmRvdy5pbm5lckhlaWdodC1yaSoyLG09cGFyc2VGbG9hdChjLnN0eWxlLm1pbkhlaWdodCksZz1wYXJzZUZsb2F0KGMuc3R5bGUuaGVpZ2h0KSx3PU1hdGgubWF4KG0sZyk7aWYodzxoKXtjb25zdCB2PXcrZix5PU1hdGgubWluKGgsdiksXz12LXk7Yy5zdHlsZS5oZWlnaHQ9eSsicHgiLGMuc3R5bGUuYm90dG9tPT09IjBweCImJih1LnNjcm9sbFRvcD1fPjA/XzowLGMuc3R5bGUuanVzdGlmeUNvbnRlbnQ9ImZsZXgtZW5kIil9fX1zLmN1cnJlbnQ9dS5zY3JvbGxUb3B9KX0pKSkpfSksUDQ9IlNlbGVjdEdyb3VwIixbT0ksQTRdPWpzKFA0KSxNND0iU2VsZWN0TGFiZWwiLEQ0PXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6biwuLi5yfT1lLGk9QTQoTTQsbik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChLZS5kaXYsaWUoe2lkOmkuaWR9LHIse3JlZjp0fSkpfSksV209IlNlbGVjdEl0ZW0iLFtMNCxka109anMoV20pLEk0PXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6bix2YWx1ZTpyLGRpc2FibGVkOmk9ITEsdGV4dFZhbHVlOm8sLi4ubH09ZSxzPWRsKFdtLG4pLGE9VmYoV20sbiksdT1zLnZhbHVlPT09cixbYyxkXT1wLnVzZVN0YXRlKG8/PyIiKSxbZixoXT1wLnVzZVN0YXRlKCExKSxtPXN0KHQsdj0+e3ZhciB5O3JldHVybih5PWEuaXRlbVJlZkNhbGxiYWNrKT09PW51bGx8fHk9PT12b2lkIDA/dm9pZCAwOnkuY2FsbChhLHYscixpKX0pLGc9amYoKSx3PSgpPT57aXx8KHMub25WYWx1ZUNoYW5nZShyKSxzLm9uT3BlbkNoYW5nZSghMSkpfTtpZihyPT09IiIpdGhyb3cgbmV3IEVycm9yKCJBIDxTZWxlY3QuSXRlbSAvPiBtdXN0IGhhdmUgYSB2YWx1ZSBwcm9wIHRoYXQgaXMgbm90IGFuIGVtcHR5IHN0cmluZy4gVGhpcyBpcyBiZWNhdXNlIHRoZSBTZWxlY3QgdmFsdWUgY2FuIGJlIHNldCB0byBhbiBlbXB0eSBzdHJpbmcgdG8gY2xlYXIgdGhlIHNlbGVjdGlvbiBhbmQgc2hvdyB0aGUgcGxhY2Vob2xkZXIuIik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChMNCx7c2NvcGU6bix2YWx1ZTpyLGRpc2FibGVkOmksdGV4dElkOmcsaXNTZWxlY3RlZDp1LG9uSXRlbVRleHRDaGFuZ2U6cC51c2VDYWxsYmFjayh2PT57ZCh5PT57dmFyIF87cmV0dXJuIHl8fCgoXz12PT1udWxsP3ZvaWQgMDp2LnRleHRDb250ZW50KSE9PW51bGwmJl8hPT12b2lkIDA/XzoiIikudHJpbSgpfSl9LFtdKX0scC5jcmVhdGVFbGVtZW50KFdmLkl0ZW1TbG90LHtzY29wZTpuLHZhbHVlOnIsZGlzYWJsZWQ6aSx0ZXh0VmFsdWU6Y30scC5jcmVhdGVFbGVtZW50KEtlLmRpdixpZSh7cm9sZToib3B0aW9uIiwiYXJpYS1sYWJlbGxlZGJ5IjpnLCJkYXRhLWhpZ2hsaWdodGVkIjpmPyIiOnZvaWQgMCwiYXJpYS1zZWxlY3RlZCI6dSYmZiwiZGF0YS1zdGF0ZSI6dT8iY2hlY2tlZCI6InVuY2hlY2tlZCIsImFyaWEtZGlzYWJsZWQiOml8fHZvaWQgMCwiZGF0YS1kaXNhYmxlZCI6aT8iIjp2b2lkIDAsdGFiSW5kZXg6aT92b2lkIDA6LTF9LGwse3JlZjptLG9uRm9jdXM6bnQobC5vbkZvY3VzLCgpPT5oKCEwKSksb25CbHVyOm50KGwub25CbHVyLCgpPT5oKCExKSksb25Qb2ludGVyVXA6bnQobC5vblBvaW50ZXJVcCx3KSxvblBvaW50ZXJNb3ZlOm50KGwub25Qb2ludGVyTW92ZSx2PT57aWYoaSl7dmFyIHk7KHk9YS5vbkl0ZW1MZWF2ZSk9PT1udWxsfHx5PT09dm9pZCAwfHx5LmNhbGwoYSl9ZWxzZSB2LmN1cnJlbnRUYXJnZXQuZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KX0pLG9uUG9pbnRlckxlYXZlOm50KGwub25Qb2ludGVyTGVhdmUsdj0+e2lmKHYuY3VycmVudFRhcmdldD09PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpe3ZhciB5Oyh5PWEub25JdGVtTGVhdmUpPT09bnVsbHx8eT09PXZvaWQgMHx8eS5jYWxsKGEpfX0pLG9uS2V5RG93bjpudChsLm9uS2V5RG93bix2PT57dmFyIHk7KCh5PWEuc2VhcmNoUmVmKT09PW51bGx8fHk9PT12b2lkIDA/dm9pZCAwOnkuY3VycmVudCkhPT0iIiYmdi5rZXk9PT0iICJ8fChwNC5pbmNsdWRlcyh2LmtleSkmJncoKSx2LmtleT09PSIgIiYmdi5wcmV2ZW50RGVmYXVsdCgpKX0pfSkpKSl9KSxiYz0iU2VsZWN0SXRlbVRleHQiLGo0PXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6bixjbGFzc05hbWU6cixzdHlsZTppLC4uLm99PWUsbD1kbChiYyxuKSxzPVZmKGJjLG4pLGE9ZGsoYmMsbiksdT15NChiYyxuKSxbYyxkXT1wLnVzZVN0YXRlKG51bGwpLGY9c3QodCx2PT5kKHYpLGEub25JdGVtVGV4dENoYW5nZSx2PT57dmFyIHk7cmV0dXJuKHk9cy5pdGVtVGV4dFJlZkNhbGxiYWNrKT09PW51bGx8fHk9PT12b2lkIDA/dm9pZCAwOnkuY2FsbChzLHYsYS52YWx1ZSxhLmRpc2FibGVkKX0pLGg9Yz09bnVsbD92b2lkIDA6Yy50ZXh0Q29udGVudCxtPXAudXNlTWVtbygoKT0+cC5jcmVhdGVFbGVtZW50KCJvcHRpb24iLHtrZXk6YS52YWx1ZSx2YWx1ZTphLnZhbHVlLGRpc2FibGVkOmEuZGlzYWJsZWR9LGgpLFthLmRpc2FibGVkLGEudmFsdWUsaF0pLHtvbk5hdGl2ZU9wdGlvbkFkZDpnLG9uTmF0aXZlT3B0aW9uUmVtb3ZlOnd9PXU7cmV0dXJuIFVuKCgpPT4oZyhtKSwoKT0+dyhtKSksW2csdyxtXSkscC5jcmVhdGVFbGVtZW50KHAuRnJhZ21lbnQsbnVsbCxwLmNyZWF0ZUVsZW1lbnQoS2Uuc3BhbixpZSh7aWQ6YS50ZXh0SWR9LG8se3JlZjpmfSkpLGEuaXNTZWxlY3RlZCYmbC52YWx1ZU5vZGUmJiFsLnZhbHVlTm9kZUhhc0NoaWxkcmVuP0dyLmNyZWF0ZVBvcnRhbChvLmNoaWxkcmVuLGwudmFsdWVOb2RlKTpudWxsKX0pLHo0PSJTZWxlY3RJdGVtSW5kaWNhdG9yIixGND1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sLi4ucn09ZTtyZXR1cm4gZGsoejQsbikuaXNTZWxlY3RlZD9wLmNyZWF0ZUVsZW1lbnQoS2Uuc3BhbixpZSh7ImFyaWEtaGlkZGVuIjohMH0scix7cmVmOnR9KSk6bnVsbH0pLEI0PXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6biwuLi5yfT1lO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHsiYXJpYS1oaWRkZW4iOiEwfSxyLHtyZWY6dH0pKX0pO2Z1bmN0aW9uIGZrKGUpe3JldHVybiBlPT09IiJ8fGU9PT12b2lkIDB9Y29uc3QgaGs9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7dmFsdWU6biwuLi5yfT1lLGk9cC51c2VSZWYobnVsbCksbz1zdCh0LGkpLGw9ZWsobik7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3Qgcz1pLmN1cnJlbnQsYT13aW5kb3cuSFRNTFNlbGVjdEVsZW1lbnQucHJvdG90eXBlLGM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLCJ2YWx1ZSIpLnNldDtpZihsIT09biYmYyl7Y29uc3QgZD1uZXcgRXZlbnQoImNoYW5nZSIse2J1YmJsZXM6ITB9KTtjLmNhbGwocyxuKSxzLmRpc3BhdGNoRXZlbnQoZCl9fSxbbCxuXSkscC5jcmVhdGVFbGVtZW50KGIzLHthc0NoaWxkOiEwfSxwLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIsaWUoe30scix7cmVmOm8sZGVmYXVsdFZhbHVlOm59KSkpfSk7aGsuZGlzcGxheU5hbWU9IkJ1YmJsZVNlbGVjdCI7ZnVuY3Rpb24gcGsoZSl7Y29uc3QgdD1lbihlKSxuPXAudXNlUmVmKCIiKSxyPXAudXNlUmVmKDApLGk9cC51c2VDYWxsYmFjayhsPT57Y29uc3Qgcz1uLmN1cnJlbnQrbDt0KHMpLGZ1bmN0aW9uIGEodSl7bi5jdXJyZW50PXUsd2luZG93LmNsZWFyVGltZW91dChyLmN1cnJlbnQpLHUhPT0iIiYmKHIuY3VycmVudD13aW5kb3cuc2V0VGltZW91dCgoKT0+YSgiIiksMWUzKSl9KHMpfSxbdF0pLG89cC51c2VDYWxsYmFjaygoKT0+e24uY3VycmVudD0iIix3aW5kb3cuY2xlYXJUaW1lb3V0KHIuY3VycmVudCl9LFtdKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PigpPT53aW5kb3cuY2xlYXJUaW1lb3V0KHIuY3VycmVudCksW10pLFtuLGksb119ZnVuY3Rpb24gbWsoZSx0LG4pe2NvbnN0IGk9dC5sZW5ndGg+MSYmQXJyYXkuZnJvbSh0KS5ldmVyeSh1PT51PT09dFswXSk/dFswXTp0LG89bj9lLmluZGV4T2Yobik6LTE7bGV0IGw9VTQoZSxNYXRoLm1heChvLDApKTtpLmxlbmd0aD09PTEmJihsPWwuZmlsdGVyKHU9PnUhPT1uKSk7Y29uc3QgYT1sLmZpbmQodT0+dS50ZXh0VmFsdWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGkudG9Mb3dlckNhc2UoKSkpO3JldHVybiBhIT09bj9hOnZvaWQgMH1mdW5jdGlvbiBVNChlLHQpe3JldHVybiBlLm1hcCgobixyKT0+ZVsodCtyKSVlLmxlbmd0aF0pfWNvbnN0IFc0PXg0LGdrPXc0LFY0PUU0LEg0PUM0LEs0PWs0LHZrPSQ0LFo0PU80LHlrPUQ0LHhrPUk0LEc0PWo0LFk0PUY0LF9rPUI0LFg0PVc0LFE0PVY0LHdrPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLGNoaWxkcmVuOnQsLi4ubn0scik9PnguanN4cyhnayx7cmVmOnIsY2xhc3NOYW1lOnh0KCJmbGV4IGgtMTAgdy1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWlucHV0IGJnLWJhY2tncm91bmQgcHgtMyBweS0yIHRleHQtc20gcmluZy1vZmZzZXQtYmFja2dyb3VuZCBwbGFjZWhvbGRlcjp0ZXh0LW11dGVkLWZvcmVncm91bmQgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLXJpbmcgZm9jdXM6cmluZy1vZmZzZXQtMiBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6b3BhY2l0eS01MCIsZSksLi4ubixjaGlsZHJlbjpbdCx4LmpzeChINCx7YXNDaGlsZDohMCxjaGlsZHJlbjp4LmpzeChrQyx7Y2xhc3NOYW1lOiJ3LTQgaC00IG9wYWNpdHktNTAifSl9KV19KSk7d2suZGlzcGxheU5hbWU9Z2suZGlzcGxheU5hbWU7Y29uc3QgU2s9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsY2hpbGRyZW46dCxwb3NpdGlvbjpuPSJwb3BwZXIiLC4uLnJ9LGkpPT54LmpzeChLNCx7Y2hpbGRyZW46eC5qc3godmsse3JlZjppLGNsYXNzTmFtZTp4dCgicmVsYXRpdmUgei01MCBtaW4tdy1bOHJlbV0gb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtbWQgYm9yZGVyIGJnLXBvcG92ZXIgdGV4dC1wb3BvdmVyLWZvcmVncm91bmQgc2hhZG93LW1kIGRhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtaW4gZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dCBkYXRhLVtzdGF0ZT1jbG9zZWRdOmZhZGUtb3V0LTAgZGF0YS1bc3RhdGU9b3Blbl06ZmFkZS1pbi0wIGRhdGEtW3N0YXRlPWNsb3NlZF06em9vbS1vdXQtOTUgZGF0YS1bc3RhdGU9b3Blbl06em9vbS1pbi05NSBkYXRhLVtzaWRlPWJvdHRvbV06c2xpZGUtaW4tZnJvbS10b3AtMiBkYXRhLVtzaWRlPWxlZnRdOnNsaWRlLWluLWZyb20tcmlnaHQtMiBkYXRhLVtzaWRlPXJpZ2h0XTpzbGlkZS1pbi1mcm9tLWxlZnQtMiBkYXRhLVtzaWRlPXRvcF06c2xpZGUtaW4tZnJvbS1ib3R0b20tMiIsbj09PSJwb3BwZXIiJiYiZGF0YS1bc2lkZT1ib3R0b21dOnRyYW5zbGF0ZS15LTEgZGF0YS1bc2lkZT1sZWZ0XTotdHJhbnNsYXRlLXgtMSBkYXRhLVtzaWRlPXJpZ2h0XTp0cmFuc2xhdGUteC0xIGRhdGEtW3NpZGU9dG9wXTotdHJhbnNsYXRlLXktMSIsZSkscG9zaXRpb246biwuLi5yLGNoaWxkcmVuOnguanN4KFo0LHtjbGFzc05hbWU6eHQoInAtMSIsbj09PSJwb3BwZXIiJiYiaC1bdmFyKC0tcmFkaXgtc2VsZWN0LXRyaWdnZXItaGVpZ2h0KV0gdy1mdWxsIG1pbi13LVt2YXIoLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci13aWR0aCldIiksY2hpbGRyZW46dH0pfSl9KSk7U2suZGlzcGxheU5hbWU9dmsuZGlzcGxheU5hbWU7Y29uc3QgSjQ9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsLi4udH0sbik9PnguanN4KHlrLHtyZWY6bixjbGFzc05hbWU6eHQoInB5LTEuNSBwbC04IHByLTIgdGV4dC1zbSBmb250LXNlbWlib2xkIixlKSwuLi50fSkpO0o0LmRpc3BsYXlOYW1lPXlrLmRpc3BsYXlOYW1lO2NvbnN0IEVrPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLGNoaWxkcmVuOnQsLi4ubn0scik9PnguanN4cyh4ayx7cmVmOnIsY2xhc3NOYW1lOnh0KCJyZWxhdGl2ZSBmbGV4IHctZnVsbCBjdXJzb3ItZGVmYXVsdCBzZWxlY3Qtbm9uZSBpdGVtcy1jZW50ZXIgcm91bmRlZC1zbSBweS0xLjUgcGwtOCBwci0yIHRleHQtc20gb3V0bGluZS1ub25lIGZvY3VzOmJnLWFjY2VudCBmb2N1czp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIGRhdGEtW2Rpc2FibGVkXTpwb2ludGVyLWV2ZW50cy1ub25lIGRhdGEtW2Rpc2FibGVkXTpvcGFjaXR5LTUwIixlKSwuLi5uLGNoaWxkcmVuOlt4LmpzeCgic3BhbiIse2NsYXNzTmFtZToiYWJzb2x1dGUgbGVmdC0yIGZsZXggaC0zLjUgdy0zLjUgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIixjaGlsZHJlbjp4LmpzeChZNCx7Y2hpbGRyZW46eC5qc3goUUEse2NsYXNzTmFtZToidy00IGgtNCJ9KX0pfSkseC5qc3goRzQse2NoaWxkcmVuOnR9KV19KSk7RWsuZGlzcGxheU5hbWU9eGsuZGlzcGxheU5hbWU7Y29uc3QgcTQ9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsLi4udH0sbik9PnguanN4KF9rLHtyZWY6bixjbGFzc05hbWU6eHQoIi1teC0xIG15LTEgaC1weCBiZy1tdXRlZCIsZSksLi4udH0pKTtxNC5kaXNwbGF5TmFtZT1fay5kaXNwbGF5TmFtZTtmdW5jdGlvbiBDayh7cGF0aDplLGRpc2FibGVkOnQsc291cmNlOm4sc2NoZW1hOnIscmVnaXN0ZXJQYXRjaENhbGxiYWNrOmksb25TdWJtaXQ6b30pe3JldHVybih0eXBlb2Ygbj09InN0cmluZyJ8fG49PT1udWxsKSYmKHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0ic3RyaW5nIj94LmpzeChyRCx7ZGVmYXVsdFZhbHVlOm4sZGlzYWJsZWQ6dCxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6aSxvblN1Ym1pdDpvfSk6KHR5cGVvZiBuPT0ibnVtYmVyInx8bj09PW51bGwpJiYocj09bnVsbD92b2lkIDA6ci50eXBlKT09PSJudW1iZXIiP3guanN4KHRfLHtkZWZhdWx0VmFsdWU6bixkaXNhYmxlZDp0LHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazppLG9uU3VibWl0Om99KToodHlwZW9mIG49PSJudW1iZXIifHx0eXBlb2Ygbj09InN0cmluZyJ8fG49PT1udWxsKSYmKHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0ia2V5T2YiP3guanN4KGVfLHtkZWZhdWx0VmFsdWU6bixkaXNhYmxlZDp0LHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazppLG9uU3VibWl0Om8sc2VsZWN0b3I6ci5zZWxlY3Rvcn0pOih0eXBlb2Ygbj09Im51bWJlciJ8fG49PT1udWxsKSYmKHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0ibnVtYmVyIj94LmpzeCh0Xyx7ZGVmYXVsdFZhbHVlOm4sZGlzYWJsZWQ6dCxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6aSxvblN1Ym1pdDpvfSk6KHR5cGVvZiBuPT0ibnVtYmVyInx8dHlwZW9mIG49PSJzdHJpbmcifHxuPT09bnVsbCkmJihyPT1udWxsP3ZvaWQgMDpyLnR5cGUpPT09ImtleU9mIj94LmpzeChlXyx7ZGVmYXVsdFZhbHVlOm4sZGlzYWJsZWQ6dCxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6aSxvblN1Ym1pdDpvLHNlbGVjdG9yOnIuc2VsZWN0b3J9KToodHlwZW9mIG49PSJvYmplY3QifHxuPT09bnVsbCkmJihyPT1udWxsP3ZvaWQgMDpyLnR5cGUpPT09InJpY2h0ZXh0Ij94LmpzeChuRCx7cmVnaXN0ZXJQYXRjaENhbGxiYWNrOmksb25TdWJtaXQ6byxkZWZhdWx0VmFsdWU6bn0pOih0eXBlb2Ygbj09Im9iamVjdCJ8fG49PT1udWxsKSYmKHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0iaW1hZ2UiP3guanN4KHRELHtwYXRoOmUscmVnaXN0ZXJQYXRjaENhbGxiYWNrOmksb25TdWJtaXQ6byxkZWZhdWx0VmFsdWU6bn0pOnguanN4cygiZGl2Iix7Y2hpbGRyZW46WyJVbnN1cHBvcnRlZCBzY2hlbWE6ICIsci50eXBlXX0pfWZ1bmN0aW9uIEp4KGUsdCxuLHIpe2lmKCF0fHwhcilyZXR1cm5bXTtjb25zdCBpPXIuc2hhMjU2LnNsaWNlKDAsNSksbz1mdW5jdGlvbigpe2NvbnN0IGw9U3YodCk/PyJ1bmtub3duIixzPUV2KGwpO2lmKG4pe2xldCBhPW4uc3BsaXQoIi4iKS5zbGljZSgwLC0xKS5qb2luKCIuIil8fG47Y29uc3QgdT1hLmxhc3RJbmRleE9mKCJfIik7cmV0dXJuIGEuc2xpY2UodSsxLGEubGVuZ3RoKT09PWkmJihhPWEuc2xpY2UoMCx1KSksYC9wdWJsaWMvJHthfV8ke2l9LiR7c31gfXJldHVybmAvcHVibGljLyR7ci5zaGEyNTZ9LiR7c31gfSgpO3JldHVyblt7dmFsdWU6e1tSbl06byxbbm5dOiJmaWxlIixtZXRhZGF0YTpyfSxvcDoicmVwbGFjZSIscGF0aDplfSx7dmFsdWU6dCxvcDoiZmlsZSIscGF0aDplLGZpbGVQYXRoOm99XX1mdW5jdGlvbiBlRChlLHQpe2NvbnN0IG49ZSsiL21ldGFkYXRhIjtyZXR1cm5be3ZhbHVlOnQsb3A6InJlcGxhY2UiLHBhdGg6bn1dfWZ1bmN0aW9uIHREKHtwYXRoOmUsZGVmYXVsdFZhbHVlOnQsb25TdWJtaXQ6bixyZWdpc3RlclBhdGNoQ2FsbGJhY2s6cn0pe2NvbnN0W2ksb109cC51c2VTdGF0ZShudWxsKSxbbCxzXT1wLnVzZVN0YXRlKCExKSxbYSx1XT1wLnVzZVN0YXRlKCksW2MsZF09cC51c2VTdGF0ZSgpLFtmLGhdPXAudXNlU3RhdGUoKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntoKHQmJmpuLmNvbnZlcnRGaWxlU291cmNlKHQpLnVybCl9LFt0XSkscC51c2VFZmZlY3QoKCk9PntyJiZyKGFzeW5jIG09Pkp4KG0sKGk9PW51bGw/dm9pZCAwOmkuc3JjKT8/bnVsbCwoaT09bnVsbD92b2lkIDA6aS5maWxlbmFtZSk/P251bGwsYSkpfSxbaSx0XSkscC51c2VFZmZlY3QoKCk9Pnt2YXIgbTtpZihjKWlmKGEpe2NvbnN0IGc9ey4uLmEsaG90c3BvdDpjfTt1KGcpfWVsc2UgdCE9bnVsbCYmdC5tZXRhZGF0YT91KHsuLi50Lm1ldGFkYXRhLGhvdHNwb3Q6Y30pOmNvbnNvbGUuZXJyb3IoIk5laXRoZXIgaW1hZ2UgbWV0YWRhdGEgbm9yIHZhbHVlIGlzIHNldCIpO2Vsc2UobT10PT1udWxsP3ZvaWQgMDp0Lm1ldGFkYXRhKSE9bnVsbCYmbS5ob3RzcG90JiZkKHQubWV0YWRhdGEuaG90c3BvdCl9LFtjLHRdKSx4LmpzeHMoV3Use2NoaWxkcmVuOlt4LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCBtYXgtdy00eGwgcC00IGdhcC15LTQiLGNoaWxkcmVuOltpfHxmP3guanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJyZWxhdGl2ZSIsY2hpbGRyZW46W2MmJnguanN4KCJkaXYiLHtjbGFzc05hbWU6InJvdW5kZWQtZnVsbCBoLVsyMHB4XSB3LVsyMHB4XSBiZy1hY2NlbnQgYWJzb2x1dGUiLHN0eWxlOnt0b3A6YCR7Yy55KjEwMH0lYCxsZWZ0OmAke2MueCoxMDB9JWB9fSkseC5qc3goImltZyIse3NyYzooaT09bnVsbD92b2lkIDA6aS5zcmMpfHxmLGNsYXNzTmFtZToidy1mdWxsIGN1cnNvci1jcm9zc2hhaXIiLG9uQ2xpY2s6bT0+e2NvbnN0IGc9bS5uYXRpdmVFdmVudC5vZmZzZXRYLHc9bS5uYXRpdmVFdmVudC5vZmZzZXRZLHY9bS5jdXJyZW50VGFyZ2V0LmNsaWVudFdpZHRoLHk9bS5jdXJyZW50VGFyZ2V0LmNsaWVudEhlaWdodCxfPU1hdGgucm91bmQoZy92KjEwMCkvMTAwLFM9TWF0aC5yb3VuZCh3L3kqMTAwKS8xMDA7ZCh7eDpfLHk6Uyx3aWR0aDoxLGhlaWdodDoxfSl9fSldfSk6eC5qc3goImRpdiIse2NoaWxkcmVuOiJTZWxlY3QgaW1hZ2UgYmVsb3cifSkseC5qc3hzKCJsYWJlbCIse2h0bWxGb3I6YGltZ19pbnB1dDoke2V9YCxjbGFzc05hbWU6IiIsY2hpbGRyZW46W3guanN4KCJkaXYiLHtjbGFzc05hbWU6InB4LTEgcHktMiB0ZXh0LWNlbnRlciByb3VuZGVkLW1kIGJnLXByaW1hcnkgdGV4dC1iYWNrZ3JvdW5kIixjaGlsZHJlbjoiVXBkYXRlIGltYWdlIn0pLHguanN4KCJpbnB1dCIse2hpZGRlbjohMCxpZDpgaW1nX2lucHV0OiR7ZX1gLHR5cGU6ImZpbGUiLG9uQ2hhbmdlOm09PntfQyhtKS50aGVuKGc9PntvKHtzcmM6Zy5zcmMsZmlsZW5hbWU6Zy5maWxlbmFtZX0pLGcud2lkdGgmJmcuaGVpZ2h0JiZnLm1pbWVUeXBlP3Uoe3NoYTI1NjpnLnNoYTI1Nix3aWR0aDpnLndpZHRoLGhlaWdodDpnLmhlaWdodCxtaW1lVHlwZTpnLm1pbWVUeXBlLGhvdHNwb3Q6Y30pOih1KHZvaWQgMCksZCh2b2lkIDApKX0pLmNhdGNoKGc9Pntjb25zb2xlLmVycm9yKGcubWVzc2FnZSksbyhudWxsKSxkKHZvaWQgMCksdSh2b2lkIDApfSl9fSldfSldfSxlKSxuJiZpJiZ4LmpzeCh5cyx7bG9hZGluZzpsLG9uQ2xpY2s6KCk9PntzKCEwKSxuKG09PlByb21pc2UucmVzb2x2ZShKeChtLGkuc3JjLGkuZmlsZW5hbWU/P251bGwsYSkpKS5maW5hbGx5KCgpPT57cyghMSksbyhudWxsKSx1KHZvaWQgMCl9KX19KSxuJiYhaSYmYSYmeC5qc3goeXMse2xvYWRpbmc6bCxvbkNsaWNrOigpPT57cyghMCksbihtPT5Qcm9taXNlLnJlc29sdmUoZUQobSxhKSkpLmZpbmFsbHkoKCk9PntzKCExKSxvKG51bGwpLHUodm9pZCAwKX0pfX0pXX0pfWZ1bmN0aW9uIHF4KGUsdCl7Y29uc3R7dGVtcGxhdGVTdHJpbmdzOm4sZXhwcnM6cixmaWxlczppfT10P2hPKHQuZ2V0RWRpdG9yU3RhdGUoKS50b0pTT04oKS5yb290KTp7W25uXToicmljaHRleHQiLHRlbXBsYXRlU3RyaW5nczpbIiJdLGV4cHJzOltdLGZpbGVzOnt9fTtyZXR1cm5be29wOiJyZXBsYWNlIixwYXRoOmUsdmFsdWU6e3RlbXBsYXRlU3RyaW5nczpuLGV4cHJzOnIsW25uXToicmljaHRleHQifX0sLi4uT2JqZWN0LmVudHJpZXMoaSkubWFwKChbbyxsXSk9Pih7b3A6ImZpbGUiLHBhdGg6ZSxmaWxlUGF0aDpvLHZhbHVlOmx9KSldfWZ1bmN0aW9uIG5EKHtkZWZhdWx0VmFsdWU6ZSxvblN1Ym1pdDp0LHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazpufSl7Y29uc3RbcixpXT1wLnVzZVN0YXRlKG51bGwpLFtvLGxdPXAudXNlU3RhdGUoITEpLFtzLGFdPXAudXNlU3RhdGUoITEpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e3ImJihsKCExKSxyLnJlZ2lzdGVyVGV4dENvbnRlbnRMaXN0ZW5lcigoKT0+e2woITApfSksci5yZWdpc3RlckRlY29yYXRvckxpc3RlbmVyKCgpPT57bCghMCl9KSxyLnJlZ2lzdGVyTXV0YXRpb25MaXN0ZW5lcihKby5MaW5rTm9kZSwoKT0+e2woITApfSksci5yZWdpc3Rlck11dGF0aW9uTGlzdGVuZXIoRHMsKCk9PntsKCEwKX0pLHIucmVnaXN0ZXJNdXRhdGlvbkxpc3RlbmVyKHhlLlRleHROb2RlLCgpPT57bCghMCl9KSl9LFtyXSkscC51c2VFZmZlY3QoKCk9PntyJiZuJiZuKGFzeW5jIHU9PnF4KHUscikpfSxbcl0pLHguanN4cyhXdSx7Y2hpbGRyZW46W3guanN4KEdBLHtvbkVkaXRvcjp1PT57aSh1KX0scmljaHRleHQ6ZXx8e2NoaWxkcmVuOltdLFtubl06InJvb3QifX0pLHQmJm8mJnguanN4KHlzLHtsb2FkaW5nOnN8fCFyLG9uQ2xpY2s6KCk9PntyJiYoYSghMCksdChhc3luYyB1PT5xeCh1LHIpKS5maW5hbGx5KCgpPT57YSghMSksbCghMSl9KSl9fSldfSl9ZnVuY3Rpb24gZV8oe2Rpc2FibGVkOmUsZGVmYXVsdFZhbHVlOnQscmVnaXN0ZXJQYXRjaENhbGxiYWNrOm4sb25TdWJtaXQ6cixzZWxlY3RvcjppfSl7Y29uc3Qgbz1DTChpKSxzPShoPT5BcnJheS5pc0FycmF5KGgubW9kdWxlU291cmNlKT97dHlwZToibnVtYmVyIix2YWx1ZXM6T2JqZWN0LmtleXMoaC5tb2R1bGVTb3VyY2UpLm1hcChtPT5wYXJzZUludChtKSl9Ont0eXBlOiJzdHJpbmciLHZhbHVlczpPYmplY3Qua2V5cyhoLm1vZHVsZVNvdXJjZT8/WyJFUlJPUiBmZXRjaGluZyBzb3VyY2UiXSl9KShvKSxbYSx1XT1wLnVzZVN0YXRlKHR8fHMudmFsdWVzWzBdKSxbYyxkXT1wLnVzZVN0YXRlKCExKTtwLnVzZUVmZmVjdCgoKT0+e2QoZSl9LFtlXSk7Y29uc3QgZj1oPT57aWYocy50eXBlPT09Im51bWJlciIpe2lmKGg9PT0iIil0aHJvdyBuZXcgRXJyb3IoIlZhbHVlIGNhbm5vdCBiZSBlbXB0eSIpO2lmKE51bWJlci5pc05hTihOdW1iZXIoaCkpKXRocm93IG5ldyBFcnJvcigiVmFsdWUgd2FzIG5vdCBhIG51bWJlcjogIitKU09OLnN0cmluZ2lmeShoKSk7cmV0dXJuIE51bWJlcihoKX1yZXR1cm4gaH07cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57biYmbihhc3luYyBoPT5be29wOiJyZXBsYWNlIixwYXRoOmgsdmFsdWU6YX1dKX0sW2FdKSx4LmpzeHMoV3Use2NoaWxkcmVuOlt4LmpzeHMoWDQse2RlZmF1bHRWYWx1ZTphLnRvU3RyaW5nKCksZGlzYWJsZWQ6YyxvblZhbHVlQ2hhbmdlOmg9Pnt1KGYoaCkpfSxjaGlsZHJlbjpbeC5qc3god2sse2NoaWxkcmVuOnguanN4KFE0LHtwbGFjZWhvbGRlcjoiU2VsZWN0IGEgdmFsdWUifSl9KSx4LmpzeChTayx7Y2hpbGRyZW46cy52YWx1ZXMubWFwKGg9PnguanN4KEVrLHt2YWx1ZTpoLnRvU3RyaW5nKCksY2hpbGRyZW46aC50b1N0cmluZygpfSxoKSl9KV19KSxyJiZ0IT09YSYmeC5qc3goeXMse2xvYWRpbmc6YyxvbkNsaWNrOigpPT57ZCghMCkscihhc3luYyBoPT5be29wOiJyZXBsYWNlIixwYXRoOmgsdmFsdWU6YX1dKS5maW5hbGx5KCgpPT57ZCghMSl9KX19KV19KX1mdW5jdGlvbiB0Xyh7ZGlzYWJsZWQ6ZSxkZWZhdWx0VmFsdWU6dCxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6bixvblN1Ym1pdDpyfSl7Y29uc3RbaSxvXT1wLnVzZVN0YXRlKHR8fDApLFtsLHNdPXAudXNlU3RhdGUoITEpO3AudXNlRWZmZWN0KCgpPT57cyhlKX0sW2VdKTtjb25zdCBhPXAudXNlUmVmKG51bGwpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e24mJm4oYXN5bmMgdT0+e3ZhciBjO3JldHVyblt7b3A6InJlcGxhY2UiLHBhdGg6dSx2YWx1ZTpOdW1iZXIoKGM9YS5jdXJyZW50KT09bnVsbD92b2lkIDA6Yy52YWx1ZSl8fDB9XX0pfSxbXSkseC5qc3hzKFd1LHtjaGlsZHJlbjpbeC5qc3goanYse3JlZjphLGRpc2FibGVkOmwsZGVmYXVsdFZhbHVlOmk/PzAsb25DaGFuZ2U6dT0+byhOdW1iZXIodS50YXJnZXQudmFsdWUpKSx0eXBlOiJudW1iZXIifSksciYmdCE9PWkmJnguanN4KHlzLHtsb2FkaW5nOmwsb25DbGljazooKT0+e3MoITApLHIoYXN5bmMgdT0+e3ZhciBjO3JldHVyblt7b3A6InJlcGxhY2UiLHBhdGg6dSx2YWx1ZTpOdW1iZXIoKGM9YS5jdXJyZW50KT09bnVsbD92b2lkIDA6Yy52YWx1ZSl8fDB9XX0pLmZpbmFsbHkoKCk9PntzKCExKX0pfX0pXX0pfWZ1bmN0aW9uIHJEKHtkaXNhYmxlZDplLGRlZmF1bHRWYWx1ZTp0LHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazpuLG9uU3VibWl0OnJ9KXtjb25zdFtpLG9dPXAudXNlU3RhdGUodHx8IiIpLFtsLHNdPXAudXNlU3RhdGUoITEpO3AudXNlRWZmZWN0KCgpPT57cyhlKX0sW2VdKTtjb25zdCBhPXAudXNlUmVmKG51bGwpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e24mJm4oYXN5bmMgdT0+e3ZhciBjO3JldHVyblt7b3A6InJlcGxhY2UiLHBhdGg6dSx2YWx1ZTooKGM9YS5jdXJyZW50KT09bnVsbD92b2lkIDA6Yy52YWx1ZSl8fCIifV19KX0sW10pLHguanN4cyhXdSx7Y2hpbGRyZW46W3guanN4KGp2LHtyZWY6YSxkaXNhYmxlZDpsLGRlZmF1bHRWYWx1ZTppPz8iIixvbkNoYW5nZTp1PT5vKHUudGFyZ2V0LnZhbHVlKX0pLHImJnQhPT1pJiZ4LmpzeCh5cyx7bG9hZGluZzpsLG9uQ2xpY2s6KCk9PntzKCEwKSxyKGFzeW5jIHU9Pnt2YXIgYztyZXR1cm5be29wOiJyZXBsYWNlIixwYXRoOnUsdmFsdWU6KChjPWEuY3VycmVudCk9PW51bGw/dm9pZCAwOmMudmFsdWUpfHwiIn1dfSkuZmluYWxseSgoKT0+e3MoITEpfSl9fSldfSl9ZnVuY3Rpb24gV3Uoe2NoaWxkcmVuOmV9KXtyZXR1cm4geC5qc3goImRpdiIse2NsYXNzTmFtZToicmVsYXRpdmUgcC00IGJvcmRlciByb3VuZGVkIGJvcmRlci1jYXJkIixjaGlsZHJlbjplfSl9ZnVuY3Rpb24geXMoe2xvYWRpbmc6ZSxvbkNsaWNrOnR9KXtyZXR1cm4geC5qc3goImRpdiIse2NsYXNzTmFtZToic3RpY2t5IGJvdHRvbS0wIixjaGlsZHJlbjp4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGp1c3RpZnktZW5kIHctZnVsbCBweS0yIixjaGlsZHJlbjp4LmpzeChNQyx7ZGlzYWJsZWQ6ZSxvbkNsaWNrOnQsY2hpbGRyZW46ZT8iU2F2aW5nLi4uIjoiU2F2ZSJ9KX0pfSl9Y29uc3QgaUQ9KHtjbGFzc05hbWU6ZX0pPT54LmpzeHMoInN2ZyIse3dpZHRoOiI1OCIsaGVpZ2h0OiIzNCIsdmlld0JveDoiMCAwIDU4IDM0IixmaWxsOiJub25lIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLGNsYXNzTmFtZTplLGNoaWxkcmVuOlt4LmpzeCgiZyIse2ZpbHRlcjoidXJsKCNmaWx0ZXIwX2RfMjFfMTY3NykiLGNoaWxkcmVuOnguanN4KCJwYXRoIix7ZDoiTTUgNS4zNjQyNkM1IDUuMTYzMDkgNS4xNjMwOSA1IDUuMzY0MjYgNUgxNy42NTgxQzE3Ljg1OTMgNSAxOC4wMjIzIDUuMTYzMDkgMTguMDIyMyA1LjM2NDI2VjI4LjQ5NDlDMTguMDIyMyAyOC42OTYgMTcuODU5MyAyOC44NTkxIDE3LjY1ODEgMjguODU5MUg1LjM2NDI2QzUuMTYzMDkgMjguODU5MSA1IDI4LjY5NiA1IDI4LjQ5NDlWNS4zNjQyNloiLGZpbGw6IiMzOENEOTgifSl9KSx4LmpzeCgiZyIse2ZpbHRlcjoidXJsKCNmaWx0ZXIxX2lfMjFfMTY3NykiLGNoaWxkcmVuOnguanN4KCJjaXJjbGUiLHtjeDoiMTEuNDY1NiIsY3k6IjIzLjc1OTUiLHI6IjIuMTg1NTciLGZpbGw6ImN1cnJlbnRDb2xvciJ9KX0pLHguanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNNTIuODU4OCAyMy44MzlINDguNzI1N0g0OC41MzdINDguMTEyOEM0Ny42NzE1IDIzLjgzOSA0Ny40NTA4IDIzLjU5NDIgNDcuNDUwOCAyMy4xMDQ0VjEzLjcyOTNDNDcuNDUwOCAxMy41Nzg0IDQ3LjMyODUgMTMuNDU2MSA0Ny4xNzc3IDEzLjQ1NjFINDUuODExOEM0NS42NjA5IDEzLjQ1NjEgNDUuNTM4NiAxMy41Nzg0IDQ1LjUzODYgMTMuNzI5M1YxNS4xODM2QzQ1LjUzODYgMTUuMjg0NCA0NS40NTY5IDE1LjM2NjEgNDUuMzU2MSAxNS4zNjYxQzQ1LjI4NzYgMTUuMzY2MSA0NS4yMjUgMTUuMzI3NSA0NS4xOTI0IDE1LjI2NzJDNDQuODA1IDE0LjU1MDMgNDQuMjgzIDE0LjAyIDQzLjYyNjQgMTMuNjc2NUM0Mi45NTYzIDEzLjMwMSA0Mi4yMDQ1IDEzLjExMzIgNDEuMzcwOSAxMy4xMTMyQzQwLjYwMjggMTMuMTEzMiAzOS44NzU1IDEzLjI1MiAzOS4xODkgMTMuNTI5NUMzOC41MDI2IDEzLjgwNzEgMzcuODk3OSAxNC4yMTUyIDM3LjM3NDggMTQuNzUzOUMzNi44NjgyIDE1LjI3NjQgMzYuNDY3OCAxNS45MjEyIDM2LjE3MzYgMTYuNjg4NUMzNS44Nzk0IDE3LjQ1NTggMzUuNzMyMyAxOC4zMzc0IDM1LjczMjMgMTkuMzMzMlYxOS43MjVDMzUuNzMyMyAyMC43MzcyIDM1Ljg3OTQgMjEuNjI3IDM2LjE3MzYgMjIuMzk0MkMzNi40Njc4IDIzLjE2MTUgMzYuODY4MiAyMy44MTQ2IDM3LjM3NDggMjQuMzUzM0MzNy44OTc5IDI0Ljg3NTcgMzguNTAyNiAyNS4yNzU3IDM5LjE4OSAyNS41NTMyQzM5Ljg3NTUgMjUuODE0NCA0MC42MTkxIDI1Ljk0NSA0MS40MiAyNS45NDVDNDIuMTg4MSAyNS45NDUgNDIuOTE1NCAyNS43NDkxIDQzLjYwMTkgMjUuMzU3M0M0NC4yNzUxIDI0Ljk4MiA0NC44MDU4IDI0LjQxMTkgNDUuMTk0MSAyMy42NDcxQzQ1LjIyNTUgMjMuNTg1MiA0NS4yODg2IDIzLjU0NTIgNDUuMzU4IDIzLjU0NTJINDUuMzkxN0M0NS40NzI4IDIzLjU0NTIgNDUuNTM4NiAyMy42MTEgNDUuNTM4NiAyMy42OTIxQzQ1LjUzODYgMjMuNzkwNCA0NS41NDQgMjMuODg1NiA0NS41NTQ3IDIzLjk3NzdWMjUuMTM5MkM0NS41NTQ3IDI1LjM5MDQgNDUuNzU4NCAyNS41OTQxIDQ2LjAwOTYgMjUuNTk0MUg0Ny4yMjYxQzQ3LjI5MTQgMjUuNTk5NSA0Ny4zNTgxIDI1LjYwMjIgNDcuNDI2MyAyNS42MDIySDQ4LjUzN0g0OC43MjU3SDU3LjcyNjhDNTcuODc3NyAyNS42MDIyIDU4IDI1LjQ3OTkgNTggMjUuMzI5VjI0LjExMjJDNTggMjMuOTYxNCA1Ny44Nzc3IDIzLjgzOSA1Ny43MjY4IDIzLjgzOUg1NS4zMTc0QzU1LjE2NjUgMjMuODM5IDU1LjA0NDIgMjMuNzE2NyA1NS4wNDQyIDIzLjU2NTlWOC43MzM2OEM1NS4wNDQyIDguNTgyNzkgNTQuOTIxOSA4LjQ2MDQ4IDU0Ljc3MSA4LjQ2MDQ4SDUwLjUwNTRDNTAuMzU0NSA4LjQ2MDQ4IDUwLjIzMjIgOC41ODI3OSA1MC4yMzIyIDguNzMzNjhWOS45NTA0M0M1MC4yMzIyIDEwLjEwMTMgNTAuMzU0NSAxMC4yMjM2IDUwLjUwNTQgMTAuMjIzNkg1Mi44NTg4QzUzLjAwOTcgMTAuMjIzNiA1My4xMzIgMTAuMzQ1OSA1My4xMzIgMTAuNDk2OFYyMy41NjU5QzUzLjEzMiAyMy43MTY3IDUzLjAwOTcgMjMuODM5IDUyLjg1ODggMjMuODM5Wk00MS42MTYxIDI0LjEzMjlDNDIuMTg4MSAyNC4xMzI5IDQyLjcxMTEgMjQuMDI2OCA0My4xODUxIDIzLjgxNDZDNDMuNjc1NCAyMy42MDIzIDQ0LjA5MjIgMjMuMzAwMyA0NC40MzU0IDIyLjkwODVDNDQuNzc4NiAyMi41MTY3IDQ1LjA0ODMgMjIuMDUxNCA0NS4yNDQ0IDIxLjUxMjdDNDUuNDQwNiAyMC45NTc2IDQ1LjUzODYgMjAuMzQ1NCA0NS41Mzg2IDE5LjY3NjFWMTkuMzgyMkM0NS41Mzg2IDE4LjcyOTIgNDUuNDQwNiAxOC4xMzMzIDQ1LjI0NDQgMTcuNTk0NkM0NS4wNDgzIDE3LjAzOTUgNDQuNzcwNSAxNi41NjYxIDQ0LjQxMDkgMTYuMTc0M0M0NC4wNjc3IDE1Ljc4MjQgNDMuNjUwOSAxNS40ODA0IDQzLjE2MDYgMTUuMjY4MkM0Mi42ODY2IDE1LjAzOTYgNDIuMTcxOCAxNC45MjU0IDQxLjYxNjEgMTQuOTI1NEM0MS4wNDQgMTQuOTI1NCA0MC41MjEgMTUuMDMxNSA0MC4wNDcxIDE1LjI0MzdDMzkuNTczMSAxNS40NTU5IDM5LjE1NjMgMTUuNzU4IDM4Ljc5NjggMTYuMTQ5OEMzOC40NTM1IDE2LjUyNTIgMzguMTgzOSAxNi45OTA1IDM3Ljk4NzcgMTcuNTQ1NkMzNy43OTE2IDE4LjA4NDMgMzcuNjkzNiAxOC42ODAyIDM3LjY5MzYgMTkuMzMzMlYxOS43MjVDMzcuNjkzNiAyMS4xMTI3IDM4LjA1MzEgMjIuMTk4MyAzOC43NzIyIDIyLjk4MkMzOS41MDc3IDIzLjc0OTMgNDAuNDU1NyAyNC4xMzI5IDQxLjYxNjEgMjQuMTMyOVpNMzEuMTExNSAyNS40MTkxQzMxLjA3MzIgMjUuNTI4NyAzMC45Njk4IDI1LjYwMjIgMzAuODUzNiAyNS42MDIySDI3LjQ2NjFDMjcuMzUgMjUuNjAyMiAyNy4yNDY1IDI1LjUyODcgMjcuMjA4MiAyNS40MTkxTDIzLjE1NzggMTMuODE5M0MyMy4wOTU4IDEzLjY0MTcgMjMuMjI3NiAxMy40NTYxIDIzLjQxNTcgMTMuNDU2MUgyNS4wODlDMjUuMjA2OCAxMy40NTYxIDI1LjMxMTQgMTMuNTMxNiAyNS4zNDg0IDEzLjY0MzVMMjguOTY2NiAyNC41ODFDMjguOTk0MiAyNC42NjQzIDI5LjA3MjEgMjQuNzIwNiAyOS4xNTk5IDI0LjcyMDZDMjkuMjQ3NyAyNC43MjA2IDI5LjMyNTYgMjQuNjY0MyAyOS4zNTMyIDI0LjU4MUwzMi45NzE0IDEzLjY0MzVDMzMuMDA4NCAxMy41MzE2IDMzLjExMjkgMTMuNDU2MSAzMy4yMzA4IDEzLjQ1NjFIMzQuOTA0MUMzNS4wOTIyIDEzLjQ1NjEgMzUuMjI0IDEzLjY0MTcgMzUuMTYyIDEzLjgxOTNMMzEuMTExNSAyNS40MTkxWiIsZmlsbDoiY3VycmVudENvbG9yIn0pLHguanN4cygiZGVmcyIse2NoaWxkcmVuOlt4LmpzeHMoImZpbHRlciIse2lkOiJmaWx0ZXIwX2RfMjFfMTY3NyIseDoiMC4xMjQ3MjIiLHk6IjAuMTI0NzIyIix3aWR0aDoiMjIuNzcyOSIsaGVpZ2h0OiIzMy42MDk3IixmaWx0ZXJVbml0czoidXNlclNwYWNlT25Vc2UiLGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6InNSR0IiLGNoaWxkcmVuOlt4LmpzeCgiZmVGbG9vZCIse2Zsb29kT3BhY2l0eToiMCIscmVzdWx0OiJCYWNrZ3JvdW5kSW1hZ2VGaXgifSkseC5qc3goImZlQ29sb3JNYXRyaXgiLHtpbjoiU291cmNlQWxwaGEiLHR5cGU6Im1hdHJpeCIsdmFsdWVzOiIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMCIscmVzdWx0OiJoYXJkQWxwaGEifSkseC5qc3goImZlT2Zmc2V0Iix7fSkseC5qc3goImZlR2F1c3NpYW5CbHVyIix7c3RkRGV2aWF0aW9uOiIyLjQzNzY0In0pLHguanN4KCJmZUNvbXBvc2l0ZSIse2luMjoiaGFyZEFscGhhIixvcGVyYXRvcjoib3V0In0pLHguanN4KCJmZUNvbG9yTWF0cml4Iix7dHlwZToibWF0cml4Iix2YWx1ZXM6IjAgMCAwIDAgMC4yMTk2MDggMCAwIDAgMCAwLjgwMzkyMiAwIDAgMCAwIDAuNTAxOTYxIDAgMCAwIDAuMyAwIn0pLHguanN4KCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjI6IkJhY2tncm91bmRJbWFnZUZpeCIscmVzdWx0OiJlZmZlY3QxX2Ryb3BTaGFkb3dfMjFfMTY3NyJ9KSx4LmpzeCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiZWZmZWN0MV9kcm9wU2hhZG93XzIxXzE2NzciLHJlc3VsdDoic2hhcGUifSldfSkseC5qc3hzKCJmaWx0ZXIiLHtpZDoiZmlsdGVyMV9pXzIxXzE2NzciLHg6IjkuMjgwMDMiLHk6IjIxLjU3MzkiLHdpZHRoOiI0LjM3MTEyIixoZWlnaHQ6IjQuMzcxMTIiLGZpbHRlclVuaXRzOiJ1c2VyU3BhY2VPblVzZSIsY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVyczoic1JHQiIsY2hpbGRyZW46W3guanN4KCJmZUZsb29kIix7Zmxvb2RPcGFjaXR5OiIwIixyZXN1bHQ6IkJhY2tncm91bmRJbWFnZUZpeCJ9KSx4LmpzeCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiQmFja2dyb3VuZEltYWdlRml4IixyZXN1bHQ6InNoYXBlIn0pLHguanN4KCJmZUNvbG9yTWF0cml4Iix7aW46IlNvdXJjZUFscGhhIix0eXBlOiJtYXRyaXgiLHZhbHVlczoiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLHJlc3VsdDoiaGFyZEFscGhhIn0pLHguanN4KCJmZU9mZnNldCIse30pLHguanN4KCJmZUdhdXNzaWFuQmx1ciIse3N0ZERldmlhdGlvbjoiMC41NDYzOTIifSkseC5qc3goImZlQ29tcG9zaXRlIix7aW4yOiJoYXJkQWxwaGEiLG9wZXJhdG9yOiJhcml0aG1ldGljIixrMjoiLTEiLGszOiIxIn0pLHguanN4KCJmZUNvbG9yTWF0cml4Iix7dHlwZToibWF0cml4Iix2YWx1ZXM6IjAgMCAwIDAgMC4yMTk2MDggMCAwIDAgMCAwLjgwMzkyMiAwIDAgMCAwIDAuNTAxOTYxIDAgMCAwIDAuMyAwIn0pLHguanN4KCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjI6InNoYXBlIixyZXN1bHQ6ImVmZmVjdDFfaW5uZXJTaGFkb3dfMjFfMTY3NyJ9KV19KV19KV19KSxraz1pRCwkaz0iU3dpdGNoIixbb0QsUEldPWxsKCRrKSxbbEQsc0RdPW9EKCRrKSxhRD1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU3dpdGNoOm4sbmFtZTpyLGNoZWNrZWQ6aSxkZWZhdWx0Q2hlY2tlZDpvLHJlcXVpcmVkOmwsZGlzYWJsZWQ6cyx2YWx1ZTphPSJvbiIsb25DaGVja2VkQ2hhbmdlOnUsLi4uY309ZSxbZCxmXT1wLnVzZVN0YXRlKG51bGwpLGg9c3QodCx5PT5mKHkpKSxtPXAudXNlUmVmKCExKSxnPWQ/ISFkLmNsb3Nlc3QoImZvcm0iKTohMCxbdz0hMSx2XT1ncyh7cHJvcDppLGRlZmF1bHRQcm9wOm8sb25DaGFuZ2U6dX0pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQobEQse3Njb3BlOm4sY2hlY2tlZDp3LGRpc2FibGVkOnN9LHAuY3JlYXRlRWxlbWVudChLZS5idXR0b24saWUoe3R5cGU6ImJ1dHRvbiIscm9sZToic3dpdGNoIiwiYXJpYS1jaGVja2VkIjp3LCJhcmlhLXJlcXVpcmVkIjpsLCJkYXRhLXN0YXRlIjpiayh3KSwiZGF0YS1kaXNhYmxlZCI6cz8iIjp2b2lkIDAsZGlzYWJsZWQ6cyx2YWx1ZTphfSxjLHtyZWY6aCxvbkNsaWNrOm50KGUub25DbGljayx5PT57dihfPT4hXyksZyYmKG0uY3VycmVudD15LmlzUHJvcGFnYXRpb25TdG9wcGVkKCksbS5jdXJyZW50fHx5LnN0b3BQcm9wYWdhdGlvbigpKX0pfSkpLGcmJnAuY3JlYXRlRWxlbWVudChkRCx7Y29udHJvbDpkLGJ1YmJsZXM6IW0uY3VycmVudCxuYW1lOnIsdmFsdWU6YSxjaGVja2VkOncscmVxdWlyZWQ6bCxkaXNhYmxlZDpzLHN0eWxlOnt0cmFuc2Zvcm06InRyYW5zbGF0ZVgoLTEwMCUpIn19KSl9KSx1RD0iU3dpdGNoVGh1bWIiLGNEPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTd2l0Y2g6biwuLi5yfT1lLGk9c0QodUQsbik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChLZS5zcGFuLGllKHsiZGF0YS1zdGF0ZSI6YmsoaS5jaGVja2VkKSwiZGF0YS1kaXNhYmxlZCI6aS5kaXNhYmxlZD8iIjp2b2lkIDB9LHIse3JlZjp0fSkpfSksZEQ9ZT0+e2NvbnN0e2NvbnRyb2w6dCxjaGVja2VkOm4sYnViYmxlczpyPSEwLC4uLml9PWUsbz1wLnVzZVJlZihudWxsKSxsPWVrKG4pLHM9WkModCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3QgYT1vLmN1cnJlbnQsdT13aW5kb3cuSFRNTElucHV0RWxlbWVudC5wcm90b3R5cGUsZD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHUsImNoZWNrZWQiKS5zZXQ7aWYobCE9PW4mJmQpe2NvbnN0IGY9bmV3IEV2ZW50KCJjbGljayIse2J1YmJsZXM6cn0pO2QuY2FsbChhLG4pLGEuZGlzcGF0Y2hFdmVudChmKX19LFtsLG4scl0pLHAuY3JlYXRlRWxlbWVudCgiaW5wdXQiLGllKHt0eXBlOiJjaGVja2JveCIsImFyaWEtaGlkZGVuIjohMCxkZWZhdWx0Q2hlY2tlZDpufSxpLHt0YWJJbmRleDotMSxyZWY6byxzdHlsZTp7Li4uZS5zdHlsZSwuLi5zLHBvc2l0aW9uOiJhYnNvbHV0ZSIscG9pbnRlckV2ZW50czoibm9uZSIsb3BhY2l0eTowLG1hcmdpbjowfX0pKX07ZnVuY3Rpb24gYmsoZSl7cmV0dXJuIGU/ImNoZWNrZWQiOiJ1bmNoZWNrZWQifWNvbnN0IFRrPWFELGZEPWNELFZtPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLC4uLnR9LG4pPT54LmpzeChUayx7Y2xhc3NOYW1lOnh0KCJwZWVyIGlubGluZS1mbGV4IGgtWzIycHhdIHctWzQ0cHhdIHNocmluay0wIGN1cnNvci1wb2ludGVyIGl0ZW1zLWNlbnRlciByb3VuZGVkLWZ1bGwgYm9yZGVyLTIgYm9yZGVyLXRyYW5zcGFyZW50IHRyYW5zaXRpb24tY29sb3JzIGZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMiBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LWJhY2tncm91bmQgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAgZGF0YS1bc3RhdGU9Y2hlY2tlZF06YmctYWNjZW50IGRhdGEtW3N0YXRlPXVuY2hlY2tlZF06YmctcHJpbWFyeSIsZSksLi4udCxyZWY6bixjaGlsZHJlbjp4LmpzeChmRCx7Y2xhc3NOYW1lOnh0KCJwb2ludGVyLWV2ZW50cy1ub25lIGJsb2NrIGgtWzE4cHhdIHctNSByb3VuZGVkLWZ1bGwgYmctYmFja2dyb3VuZCBzaGFkb3ctbGcgcmluZy0wIHRyYW5zaXRpb24tdHJhbnNmb3JtIGRhdGEtW3N0YXRlPWNoZWNrZWRdOnRyYW5zbGF0ZS14LTUgZGF0YS1bc3RhdGU9dW5jaGVja2VkXTp0cmFuc2xhdGUteC0wIil9KX0pKTtWbS5kaXNwbGF5TmFtZT1Uay5kaXNwbGF5TmFtZTtjb25zdCBadj1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSwuLi50fSxuKT0+eC5qc3goImRpdiIse3JlZjpuLGNsYXNzTmFtZTp4dCgicm91bmRlZC1sZyBib3JkZXIgYmctY2FyZCB0ZXh0LWNhcmQtZm9yZWdyb3VuZCBzaGFkb3ctc20iLGUpLC4uLnR9KSk7WnYuZGlzcGxheU5hbWU9IkNhcmQiO2NvbnN0IGhEPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLC4uLnR9LG4pPT54LmpzeCgiZGl2Iix7cmVmOm4sY2xhc3NOYW1lOnh0KCJmbGV4IGZsZXgtY29sIHNwYWNlLXktMS41IHAtNiIsZSksLi4udH0pKTtoRC5kaXNwbGF5TmFtZT0iQ2FyZEhlYWRlciI7Y29uc3QgcEQ9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsLi4udH0sbik9PnguanN4KCJoMyIse3JlZjpuLGNsYXNzTmFtZTp4dCgidGV4dC0yeGwgZm9udC1zZW1pYm9sZCBsZWFkaW5nLW5vbmUgdHJhY2tpbmctdGlnaHQiLGUpLC4uLnR9KSk7cEQuZGlzcGxheU5hbWU9IkNhcmRUaXRsZSI7Y29uc3QgbUQ9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsLi4udH0sbik9PnguanN4KCJwIix7cmVmOm4sY2xhc3NOYW1lOnh0KCJ0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCIsZSksLi4udH0pKTttRC5kaXNwbGF5TmFtZT0iQ2FyZERlc2NyaXB0aW9uIjtjb25zdCBnRD1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSwuLi50fSxuKT0+eC5qc3goImRpdiIse3JlZjpuLGNsYXNzTmFtZTp4dCgicC02IHB0LTAiLGUpLC4uLnR9KSk7Z0QuZGlzcGxheU5hbWU9IkNhcmRDb250ZW50Ijtjb25zdCB2RD1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSwuLi50fSxuKT0+eC5qc3goImRpdiIse3JlZjpuLGNsYXNzTmFtZTp4dCgiZmxleCBpdGVtcy1jZW50ZXIgcC02IHB0LTAiLGUpLC4uLnR9KSk7dkQuZGlzcGxheU5hbWU9IkNhcmRGb290ZXIiOy8qKgogKiBAcmVtaXgtcnVuL3JvdXRlciB2MS4xMy4wCiAqCiAqIENvcHlyaWdodCAoYykgUmVtaXggU29mdHdhcmUgSW5jLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICogTElDRU5TRS5tZCBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogKgogKiBAbGljZW5zZSBNSVQKICovZnVuY3Rpb24geXQoKXtyZXR1cm4geXQ9T2JqZWN0LmFzc2lnbj9PYmplY3QuYXNzaWduLmJpbmQoKTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJihlW3JdPW5bcl0pfXJldHVybiBlfSx5dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIHd0OyhmdW5jdGlvbihlKXtlLlBvcD0iUE9QIixlLlB1c2g9IlBVU0giLGUuUmVwbGFjZT0iUkVQTEFDRSJ9KSh3dHx8KHd0PXt9KSk7Y29uc3Qgbl89InBvcHN0YXRlIjtmdW5jdGlvbiB5RChlKXtlPT09dm9pZCAwJiYoZT17fSk7ZnVuY3Rpb24gdChyLGkpe2xldHtwYXRobmFtZTpvLHNlYXJjaDpsLGhhc2g6c309ci5sb2NhdGlvbjtyZXR1cm4ga3UoIiIse3BhdGhuYW1lOm8sc2VhcmNoOmwsaGFzaDpzfSxpLnN0YXRlJiZpLnN0YXRlLnVzcnx8bnVsbCxpLnN0YXRlJiZpLnN0YXRlLmtleXx8ImRlZmF1bHQiKX1mdW5jdGlvbiBuKHIsaSl7cmV0dXJuIHR5cGVvZiBpPT0ic3RyaW5nIj9pOlZ1KGkpfXJldHVybiBfRCh0LG4sbnVsbCxlKX1mdW5jdGlvbiBPZShlLHQpe2lmKGU9PT0hMXx8ZT09PW51bGx8fHR5cGVvZiBlPiJ1Iil0aHJvdyBuZXcgRXJyb3IodCl9ZnVuY3Rpb24gcmwoZSx0KXtpZighZSl7dHlwZW9mIGNvbnNvbGU8InUiJiZjb25zb2xlLndhcm4odCk7dHJ5e3Rocm93IG5ldyBFcnJvcih0KX1jYXRjaHt9fX1mdW5jdGlvbiB4RCgpe3JldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiw4KX1mdW5jdGlvbiByXyhlLHQpe3JldHVybnt1c3I6ZS5zdGF0ZSxrZXk6ZS5rZXksaWR4OnR9fWZ1bmN0aW9uIGt1KGUsdCxuLHIpe3JldHVybiBuPT09dm9pZCAwJiYobj1udWxsKSx5dCh7cGF0aG5hbWU6dHlwZW9mIGU9PSJzdHJpbmciP2U6ZS5wYXRobmFtZSxzZWFyY2g6IiIsaGFzaDoiIn0sdHlwZW9mIHQ9PSJzdHJpbmciP2tpKHQpOnQse3N0YXRlOm4sa2V5OnQmJnQua2V5fHxyfHx4RCgpfSl9ZnVuY3Rpb24gVnUoZSl7bGV0e3BhdGhuYW1lOnQ9Ii8iLHNlYXJjaDpuPSIiLGhhc2g6cj0iIn09ZTtyZXR1cm4gbiYmbiE9PSI/IiYmKHQrPW4uY2hhckF0KDApPT09Ij8iP246Ij8iK24pLHImJnIhPT0iIyImJih0Kz1yLmNoYXJBdCgwKT09PSIjIj9yOiIjIityKSx0fWZ1bmN0aW9uIGtpKGUpe2xldCB0PXt9O2lmKGUpe2xldCBuPWUuaW5kZXhPZigiIyIpO24+PTAmJih0Lmhhc2g9ZS5zdWJzdHIobiksZT1lLnN1YnN0cigwLG4pKTtsZXQgcj1lLmluZGV4T2YoIj8iKTtyPj0wJiYodC5zZWFyY2g9ZS5zdWJzdHIociksZT1lLnN1YnN0cigwLHIpKSxlJiYodC5wYXRobmFtZT1lKX1yZXR1cm4gdH1mdW5jdGlvbiBfRChlLHQsbixyKXtyPT09dm9pZCAwJiYocj17fSk7bGV0e3dpbmRvdzppPWRvY3VtZW50LmRlZmF1bHRWaWV3LHY1Q29tcGF0Om89ITF9PXIsbD1pLmhpc3Rvcnkscz13dC5Qb3AsYT1udWxsLHU9YygpO3U9PW51bGwmJih1PTAsbC5yZXBsYWNlU3RhdGUoeXQoe30sbC5zdGF0ZSx7aWR4OnV9KSwiIikpO2Z1bmN0aW9uIGMoKXtyZXR1cm4obC5zdGF0ZXx8e2lkeDpudWxsfSkuaWR4fWZ1bmN0aW9uIGQoKXtzPXd0LlBvcDtsZXQgdz1jKCksdj13PT1udWxsP251bGw6dy11O3U9dyxhJiZhKHthY3Rpb246cyxsb2NhdGlvbjpnLmxvY2F0aW9uLGRlbHRhOnZ9KX1mdW5jdGlvbiBmKHcsdil7cz13dC5QdXNoO2xldCB5PWt1KGcubG9jYXRpb24sdyx2KTtuJiZuKHksdyksdT1jKCkrMTtsZXQgXz1yXyh5LHUpLFM9Zy5jcmVhdGVIcmVmKHkpO3RyeXtsLnB1c2hTdGF0ZShfLCIiLFMpfWNhdGNoKEUpe2lmKEUgaW5zdGFuY2VvZiBET01FeGNlcHRpb24mJkUubmFtZT09PSJEYXRhQ2xvbmVFcnJvciIpdGhyb3cgRTtpLmxvY2F0aW9uLmFzc2lnbihTKX1vJiZhJiZhKHthY3Rpb246cyxsb2NhdGlvbjpnLmxvY2F0aW9uLGRlbHRhOjF9KX1mdW5jdGlvbiBoKHcsdil7cz13dC5SZXBsYWNlO2xldCB5PWt1KGcubG9jYXRpb24sdyx2KTtuJiZuKHksdyksdT1jKCk7bGV0IF89cl8oeSx1KSxTPWcuY3JlYXRlSHJlZih5KTtsLnJlcGxhY2VTdGF0ZShfLCIiLFMpLG8mJmEmJmEoe2FjdGlvbjpzLGxvY2F0aW9uOmcubG9jYXRpb24sZGVsdGE6MH0pfWZ1bmN0aW9uIG0odyl7bGV0IHY9aS5sb2NhdGlvbi5vcmlnaW4hPT0ibnVsbCI/aS5sb2NhdGlvbi5vcmlnaW46aS5sb2NhdGlvbi5ocmVmLHk9dHlwZW9mIHc9PSJzdHJpbmciP3c6VnUodyk7cmV0dXJuIE9lKHYsIk5vIHdpbmRvdy5sb2NhdGlvbi4ob3JpZ2lufGhyZWYpIGF2YWlsYWJsZSB0byBjcmVhdGUgVVJMIGZvciBocmVmOiAiK3kpLG5ldyBVUkwoeSx2KX1sZXQgZz17Z2V0IGFjdGlvbigpe3JldHVybiBzfSxnZXQgbG9jYXRpb24oKXtyZXR1cm4gZShpLGwpfSxsaXN0ZW4odyl7aWYoYSl0aHJvdyBuZXcgRXJyb3IoIkEgaGlzdG9yeSBvbmx5IGFjY2VwdHMgb25lIGFjdGl2ZSBsaXN0ZW5lciIpO3JldHVybiBpLmFkZEV2ZW50TGlzdGVuZXIobl8sZCksYT13LCgpPT57aS5yZW1vdmVFdmVudExpc3RlbmVyKG5fLGQpLGE9bnVsbH19LGNyZWF0ZUhyZWYodyl7cmV0dXJuIHQoaSx3KX0sY3JlYXRlVVJMOm0sZW5jb2RlTG9jYXRpb24odyl7bGV0IHY9bSh3KTtyZXR1cm57cGF0aG5hbWU6di5wYXRobmFtZSxzZWFyY2g6di5zZWFyY2gsaGFzaDp2Lmhhc2h9fSxwdXNoOmYscmVwbGFjZTpoLGdvKHcpe3JldHVybiBsLmdvKHcpfX07cmV0dXJuIGd9dmFyIFN0OyhmdW5jdGlvbihlKXtlLmRhdGE9ImRhdGEiLGUuZGVmZXJyZWQ9ImRlZmVycmVkIixlLnJlZGlyZWN0PSJyZWRpcmVjdCIsZS5lcnJvcj0iZXJyb3IifSkoU3R8fChTdD17fSkpO2NvbnN0IHdEPW5ldyBTZXQoWyJsYXp5IiwiY2FzZVNlbnNpdGl2ZSIsInBhdGgiLCJpZCIsImluZGV4IiwiY2hpbGRyZW4iXSk7ZnVuY3Rpb24gU0QoZSl7cmV0dXJuIGUuaW5kZXg9PT0hMH1mdW5jdGlvbiBIbShlLHQsbixyKXtyZXR1cm4gbj09PXZvaWQgMCYmKG49W10pLHI9PT12b2lkIDAmJihyPXt9KSxlLm1hcCgoaSxvKT0+e2xldCBsPVsuLi5uLG9dLHM9dHlwZW9mIGkuaWQ9PSJzdHJpbmciP2kuaWQ6bC5qb2luKCItIik7aWYoT2UoaS5pbmRleCE9PSEwfHwhaS5jaGlsZHJlbiwiQ2Fubm90IHNwZWNpZnkgY2hpbGRyZW4gb24gYW4gaW5kZXggcm91dGUiKSxPZSghcltzXSwnRm91bmQgYSByb3V0ZSBpZCBjb2xsaXNpb24gb24gaWQgIicrcytgIi4gIFJvdXRlIGlkJ3MgbXVzdCBiZSBnbG9iYWxseSB1bmlxdWUgd2l0aGluIERhdGEgUm91dGVyIHVzYWdlc2ApLFNEKGkpKXtsZXQgYT15dCh7fSxpLHQoaSkse2lkOnN9KTtyZXR1cm4gcltzXT1hLGF9ZWxzZXtsZXQgYT15dCh7fSxpLHQoaSkse2lkOnMsY2hpbGRyZW46dm9pZCAwfSk7cmV0dXJuIHJbc109YSxpLmNoaWxkcmVuJiYoYS5jaGlsZHJlbj1IbShpLmNoaWxkcmVuLHQsbCxyKSksYX19KX1mdW5jdGlvbiBVbChlLHQsbil7bj09PXZvaWQgMCYmKG49Ii8iKTtsZXQgcj10eXBlb2YgdD09InN0cmluZyI/a2kodCk6dCxpPUh1KHIucGF0aG5hbWV8fCIvIixuKTtpZihpPT1udWxsKXJldHVybiBudWxsO2xldCBvPU5rKGUpO0NEKG8pO2xldCBsPW51bGw7Zm9yKGxldCBzPTA7bD09bnVsbCYmczxvLmxlbmd0aDsrK3MpbD1BRChvW3NdLExEKGkpKTtyZXR1cm4gbH1mdW5jdGlvbiBFRChlLHQpe2xldHtyb3V0ZTpuLHBhdGhuYW1lOnIscGFyYW1zOml9PWU7cmV0dXJue2lkOm4uaWQscGF0aG5hbWU6cixwYXJhbXM6aSxkYXRhOnRbbi5pZF0saGFuZGxlOm4uaGFuZGxlfX1mdW5jdGlvbiBOayhlLHQsbixyKXt0PT09dm9pZCAwJiYodD1bXSksbj09PXZvaWQgMCYmKG49W10pLHI9PT12b2lkIDAmJihyPSIiKTtsZXQgaT0obyxsLHMpPT57bGV0IGE9e3JlbGF0aXZlUGF0aDpzPT09dm9pZCAwP28ucGF0aHx8IiI6cyxjYXNlU2Vuc2l0aXZlOm8uY2FzZVNlbnNpdGl2ZT09PSEwLGNoaWxkcmVuSW5kZXg6bCxyb3V0ZTpvfTthLnJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCIvIikmJihPZShhLnJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKHIpLCdBYnNvbHV0ZSByb3V0ZSBwYXRoICInK2EucmVsYXRpdmVQYXRoKyciIG5lc3RlZCB1bmRlciBwYXRoICcrKCciJytyKyciIGlzIG5vdCB2YWxpZC4gQW4gYWJzb2x1dGUgY2hpbGQgcm91dGUgcGF0aCAnKSsibXVzdCBzdGFydCB3aXRoIHRoZSBjb21iaW5lZCBwYXRoIG9mIGFsbCBpdHMgcGFyZW50IHJvdXRlcy4iKSxhLnJlbGF0aXZlUGF0aD1hLnJlbGF0aXZlUGF0aC5zbGljZShyLmxlbmd0aCkpO2xldCB1PWVvKFtyLGEucmVsYXRpdmVQYXRoXSksYz1uLmNvbmNhdChhKTtvLmNoaWxkcmVuJiZvLmNoaWxkcmVuLmxlbmd0aD4wJiYoT2Uoby5pbmRleCE9PSEwLCJJbmRleCByb3V0ZXMgbXVzdCBub3QgaGF2ZSBjaGlsZCByb3V0ZXMuIFBsZWFzZSByZW1vdmUgIisoJ2FsbCBjaGlsZCByb3V0ZXMgZnJvbSByb3V0ZSBwYXRoICInK3UrJyIuJykpLE5rKG8uY2hpbGRyZW4sdCxjLHUpKSwhKG8ucGF0aD09bnVsbCYmIW8uaW5kZXgpJiZ0LnB1c2goe3BhdGg6dSxzY29yZTpPRCh1LG8uaW5kZXgpLHJvdXRlc01ldGE6Y30pfTtyZXR1cm4gZS5mb3JFYWNoKChvLGwpPT57dmFyIHM7aWYoby5wYXRoPT09IiJ8fCEoKHM9by5wYXRoKSE9bnVsbCYmcy5pbmNsdWRlcygiPyIpKSlpKG8sbCk7ZWxzZSBmb3IobGV0IGEgb2YgUmsoby5wYXRoKSlpKG8sbCxhKX0pLHR9ZnVuY3Rpb24gUmsoZSl7bGV0IHQ9ZS5zcGxpdCgiLyIpO2lmKHQubGVuZ3RoPT09MClyZXR1cm5bXTtsZXRbbiwuLi5yXT10LGk9bi5lbmRzV2l0aCgiPyIpLG89bi5yZXBsYWNlKC9cPyQvLCIiKTtpZihyLmxlbmd0aD09PTApcmV0dXJuIGk/W28sIiJdOltvXTtsZXQgbD1SayhyLmpvaW4oIi8iKSkscz1bXTtyZXR1cm4gcy5wdXNoKC4uLmwubWFwKGE9PmE9PT0iIj9vOltvLGFdLmpvaW4oIi8iKSkpLGkmJnMucHVzaCguLi5sKSxzLm1hcChhPT5lLnN0YXJ0c1dpdGgoIi8iKSYmYT09PSIiPyIvIjphKX1mdW5jdGlvbiBDRChlKXtlLnNvcnQoKHQsbik9PnQuc2NvcmUhPT1uLnNjb3JlP24uc2NvcmUtdC5zY29yZTpQRCh0LnJvdXRlc01ldGEubWFwKHI9PnIuY2hpbGRyZW5JbmRleCksbi5yb3V0ZXNNZXRhLm1hcChyPT5yLmNoaWxkcmVuSW5kZXgpKSl9Y29uc3Qga0Q9L146XHcrJC8sJEQ9MyxiRD0yLFREPTEsTkQ9MTAsUkQ9LTIsaV89ZT0+ZT09PSIqIjtmdW5jdGlvbiBPRChlLHQpe2xldCBuPWUuc3BsaXQoIi8iKSxyPW4ubGVuZ3RoO3JldHVybiBuLnNvbWUoaV8pJiYocis9UkQpLHQmJihyKz1iRCksbi5maWx0ZXIoaT0+IWlfKGkpKS5yZWR1Y2UoKGksbyk9PmkrKGtELnRlc3Qobyk/JEQ6bz09PSIiP1REOk5EKSxyKX1mdW5jdGlvbiBQRChlLHQpe3JldHVybiBlLmxlbmd0aD09PXQubGVuZ3RoJiZlLnNsaWNlKDAsLTEpLmV2ZXJ5KChyLGkpPT5yPT09dFtpXSk/ZVtlLmxlbmd0aC0xXS10W3QubGVuZ3RoLTFdOjB9ZnVuY3Rpb24gQUQoZSx0KXtsZXR7cm91dGVzTWV0YTpufT1lLHI9e30saT0iLyIsbz1bXTtmb3IobGV0IGw9MDtsPG4ubGVuZ3RoOysrbCl7bGV0IHM9bltsXSxhPWw9PT1uLmxlbmd0aC0xLHU9aT09PSIvIj90OnQuc2xpY2UoaS5sZW5ndGgpfHwiLyIsYz1NRCh7cGF0aDpzLnJlbGF0aXZlUGF0aCxjYXNlU2Vuc2l0aXZlOnMuY2FzZVNlbnNpdGl2ZSxlbmQ6YX0sdSk7aWYoIWMpcmV0dXJuIG51bGw7T2JqZWN0LmFzc2lnbihyLGMucGFyYW1zKTtsZXQgZD1zLnJvdXRlO28ucHVzaCh7cGFyYW1zOnIscGF0aG5hbWU6ZW8oW2ksYy5wYXRobmFtZV0pLHBhdGhuYW1lQmFzZTpGRChlbyhbaSxjLnBhdGhuYW1lQmFzZV0pKSxyb3V0ZTpkfSksYy5wYXRobmFtZUJhc2UhPT0iLyImJihpPWVvKFtpLGMucGF0aG5hbWVCYXNlXSkpfXJldHVybiBvfWZ1bmN0aW9uIE1EKGUsdCl7dHlwZW9mIGU9PSJzdHJpbmciJiYoZT17cGF0aDplLGNhc2VTZW5zaXRpdmU6ITEsZW5kOiEwfSk7bGV0W24scl09REQoZS5wYXRoLGUuY2FzZVNlbnNpdGl2ZSxlLmVuZCksaT10Lm1hdGNoKG4pO2lmKCFpKXJldHVybiBudWxsO2xldCBvPWlbMF0sbD1vLnJlcGxhY2UoLyguKVwvKyQvLCIkMSIpLHM9aS5zbGljZSgxKTtyZXR1cm57cGFyYW1zOnIucmVkdWNlKCh1LGMsZCk9PntsZXR7cGFyYW1OYW1lOmYsaXNPcHRpb25hbDpofT1jO2lmKGY9PT0iKiIpe2xldCBnPXNbZF18fCIiO2w9by5zbGljZSgwLG8ubGVuZ3RoLWcubGVuZ3RoKS5yZXBsYWNlKC8oLilcLyskLywiJDEiKX1jb25zdCBtPXNbZF07cmV0dXJuIGgmJiFtP3VbZl09dm9pZCAwOnVbZl09SUQobXx8IiIsZiksdX0se30pLHBhdGhuYW1lOm8scGF0aG5hbWVCYXNlOmwscGF0dGVybjplfX1mdW5jdGlvbiBERChlLHQsbil7dD09PXZvaWQgMCYmKHQ9ITEpLG49PT12b2lkIDAmJihuPSEwKSxybChlPT09IioifHwhZS5lbmRzV2l0aCgiKiIpfHxlLmVuZHNXaXRoKCIvKiIpLCdSb3V0ZSBwYXRoICInK2UrJyIgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIGl0IHdlcmUgJysoJyInK2UucmVwbGFjZSgvXCokLywiLyoiKSsnIiBiZWNhdXNlIHRoZSBgKmAgY2hhcmFjdGVyIG11c3QgJykrImFsd2F5cyBmb2xsb3cgYSBgL2AgaW4gdGhlIHBhdHRlcm4uIFRvIGdldCByaWQgb2YgdGhpcyB3YXJuaW5nLCAiKygncGxlYXNlIGNoYW5nZSB0aGUgcm91dGUgcGF0aCB0byAiJytlLnJlcGxhY2UoL1wqJC8sIi8qIikrJyIuJykpO2xldCByPVtdLGk9Il4iK2UucmVwbGFjZSgvXC8qXCo/JC8sIiIpLnJlcGxhY2UoL15cLyovLCIvIikucmVwbGFjZSgvW1xcLiorXiR7fXwoKVtcXV0vZywiXFwkJiIpLnJlcGxhY2UoL1wvOihcdyspKFw/KT8vZywobCxzLGEpPT4oci5wdXNoKHtwYXJhbU5hbWU6cyxpc09wdGlvbmFsOmEhPW51bGx9KSxhPyIvPyhbXlxcL10rKT8iOiIvKFteXFwvXSspIikpO3JldHVybiBlLmVuZHNXaXRoKCIqIik/KHIucHVzaCh7cGFyYW1OYW1lOiIqIn0pLGkrPWU9PT0iKiJ8fGU9PT0iLyoiPyIoLiopJCI6Iig/OlxcLyguKyl8XFwvKikkIik6bj9pKz0iXFwvKiQiOmUhPT0iIiYmZSE9PSIvIiYmKGkrPSIoPzooPz1cXC98JCkpIiksW25ldyBSZWdFeHAoaSx0P3ZvaWQgMDoiaSIpLHJdfWZ1bmN0aW9uIExEKGUpe3RyeXtyZXR1cm4gZGVjb2RlVVJJKGUpfWNhdGNoKHQpe3JldHVybiBybCghMSwnVGhlIFVSTCBwYXRoICInK2UrJyIgY291bGQgbm90IGJlIGRlY29kZWQgYmVjYXVzZSBpdCBpcyBpcyBhIG1hbGZvcm1lZCBVUkwgc2VnbWVudC4gVGhpcyBpcyBwcm9iYWJseSBkdWUgdG8gYSBiYWQgcGVyY2VudCAnKygiZW5jb2RpbmcgKCIrdCsiKS4iKSksZX19ZnVuY3Rpb24gSUQoZSx0KXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlKX1jYXRjaChuKXtyZXR1cm4gcmwoITEsJ1RoZSB2YWx1ZSBmb3IgdGhlIFVSTCBwYXJhbSAiJyt0KyciIHdpbGwgbm90IGJlIGRlY29kZWQgYmVjYXVzZScrKCcgdGhlIHN0cmluZyAiJytlKyciIGlzIGEgbWFsZm9ybWVkIFVSTCBzZWdtZW50LiBUaGlzIGlzIHByb2JhYmx5JykrKCIgZHVlIHRvIGEgYmFkIHBlcmNlbnQgZW5jb2RpbmcgKCIrbisiKS4iKSksZX19ZnVuY3Rpb24gSHUoZSx0KXtpZih0PT09Ii8iKXJldHVybiBlO2lmKCFlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCh0LnRvTG93ZXJDYXNlKCkpKXJldHVybiBudWxsO2xldCBuPXQuZW5kc1dpdGgoIi8iKT90Lmxlbmd0aC0xOnQubGVuZ3RoLHI9ZS5jaGFyQXQobik7cmV0dXJuIHImJnIhPT0iLyI/bnVsbDplLnNsaWNlKG4pfHwiLyJ9ZnVuY3Rpb24gakQoZSx0KXt0PT09dm9pZCAwJiYodD0iLyIpO2xldHtwYXRobmFtZTpuLHNlYXJjaDpyPSIiLGhhc2g6aT0iIn09dHlwZW9mIGU9PSJzdHJpbmciP2tpKGUpOmU7cmV0dXJue3BhdGhuYW1lOm4/bi5zdGFydHNXaXRoKCIvIik/bjp6RChuLHQpOnQsc2VhcmNoOkJEKHIpLGhhc2g6VUQoaSl9fWZ1bmN0aW9uIHpEKGUsdCl7bGV0IG49dC5yZXBsYWNlKC9cLyskLywiIikuc3BsaXQoIi8iKTtyZXR1cm4gZS5zcGxpdCgiLyIpLmZvckVhY2goaT0+e2k9PT0iLi4iP24ubGVuZ3RoPjEmJm4ucG9wKCk6aSE9PSIuIiYmbi5wdXNoKGkpfSksbi5sZW5ndGg+MT9uLmpvaW4oIi8iKToiLyJ9ZnVuY3Rpb24gWmgoZSx0LG4scil7cmV0dXJuIkNhbm5vdCBpbmNsdWRlIGEgJyIrZSsiJyBjaGFyYWN0ZXIgaW4gYSBtYW51YWxseSBzcGVjaWZpZWQgIisoImB0by4iK3QrImAgZmllbGQgWyIrSlNPTi5zdHJpbmdpZnkocikrIl0uICBQbGVhc2Ugc2VwYXJhdGUgaXQgb3V0IHRvIHRoZSAiKSsoImB0by4iK24rImAgZmllbGQuIEFsdGVybmF0aXZlbHkgeW91IG1heSBwcm92aWRlIHRoZSBmdWxsIHBhdGggYXMgIikrJ2Egc3RyaW5nIGluIDxMaW5rIHRvPSIuLi4iPiBhbmQgdGhlIHJvdXRlciB3aWxsIHBhcnNlIGl0IGZvciB5b3UuJ31mdW5jdGlvbiBPayhlKXtyZXR1cm4gZS5maWx0ZXIoKHQsbik9Pm49PT0wfHx0LnJvdXRlLnBhdGgmJnQucm91dGUucGF0aC5sZW5ndGg+MCl9ZnVuY3Rpb24gUGsoZSl7cmV0dXJuIE9rKGUpLm1hcCgodCxuKT0+bj09PWUubGVuZ3RoLTE/dC5wYXRobmFtZTp0LnBhdGhuYW1lQmFzZSl9ZnVuY3Rpb24gQWsoZSx0LG4scil7cj09PXZvaWQgMCYmKHI9ITEpO2xldCBpO3R5cGVvZiBlPT0ic3RyaW5nIj9pPWtpKGUpOihpPXl0KHt9LGUpLE9lKCFpLnBhdGhuYW1lfHwhaS5wYXRobmFtZS5pbmNsdWRlcygiPyIpLFpoKCI/IiwicGF0aG5hbWUiLCJzZWFyY2giLGkpKSxPZSghaS5wYXRobmFtZXx8IWkucGF0aG5hbWUuaW5jbHVkZXMoIiMiKSxaaCgiIyIsInBhdGhuYW1lIiwiaGFzaCIsaSkpLE9lKCFpLnNlYXJjaHx8IWkuc2VhcmNoLmluY2x1ZGVzKCIjIiksWmgoIiMiLCJzZWFyY2giLCJoYXNoIixpKSkpO2xldCBvPWU9PT0iInx8aS5wYXRobmFtZT09PSIiLGw9bz8iLyI6aS5wYXRobmFtZSxzO2lmKGw9PW51bGwpcz1uO2Vsc2UgaWYocil7bGV0IGQ9dFt0Lmxlbmd0aC0xXS5yZXBsYWNlKC9eXC8vLCIiKS5zcGxpdCgiLyIpO2lmKGwuc3RhcnRzV2l0aCgiLi4iKSl7bGV0IGY9bC5zcGxpdCgiLyIpO2Zvcig7ZlswXT09PSIuLiI7KWYuc2hpZnQoKSxkLnBvcCgpO2kucGF0aG5hbWU9Zi5qb2luKCIvIil9cz0iLyIrZC5qb2luKCIvIil9ZWxzZXtsZXQgZD10Lmxlbmd0aC0xO2lmKGwuc3RhcnRzV2l0aCgiLi4iKSl7bGV0IGY9bC5zcGxpdCgiLyIpO2Zvcig7ZlswXT09PSIuLiI7KWYuc2hpZnQoKSxkLT0xO2kucGF0aG5hbWU9Zi5qb2luKCIvIil9cz1kPj0wP3RbZF06Ii8ifWxldCBhPWpEKGkscyksdT1sJiZsIT09Ii8iJiZsLmVuZHNXaXRoKCIvIiksYz0ob3x8bD09PSIuIikmJm4uZW5kc1dpdGgoIi8iKTtyZXR1cm4hYS5wYXRobmFtZS5lbmRzV2l0aCgiLyIpJiYodXx8YykmJihhLnBhdGhuYW1lKz0iLyIpLGF9Y29uc3QgZW89ZT0+ZS5qb2luKCIvIikucmVwbGFjZSgvXC9cLysvZywiLyIpLEZEPWU9PmUucmVwbGFjZSgvXC8rJC8sIiIpLnJlcGxhY2UoL15cLyovLCIvIiksQkQ9ZT0+IWV8fGU9PT0iPyI/IiI6ZS5zdGFydHNXaXRoKCI/Iik/ZToiPyIrZSxVRD1lPT4hZXx8ZT09PSIjIj8iIjplLnN0YXJ0c1dpdGgoIiMiKT9lOiIjIitlO2NsYXNzIEd2e2NvbnN0cnVjdG9yKHQsbixyLGkpe2k9PT12b2lkIDAmJihpPSExKSx0aGlzLnN0YXR1cz10LHRoaXMuc3RhdHVzVGV4dD1ufHwiIix0aGlzLmludGVybmFsPWksciBpbnN0YW5jZW9mIEVycm9yPyh0aGlzLmRhdGE9ci50b1N0cmluZygpLHRoaXMuZXJyb3I9cik6dGhpcy5kYXRhPXJ9fWZ1bmN0aW9uIE1rKGUpe3JldHVybiBlIT1udWxsJiZ0eXBlb2YgZS5zdGF0dXM9PSJudW1iZXIiJiZ0eXBlb2YgZS5zdGF0dXNUZXh0PT0ic3RyaW5nIiYmdHlwZW9mIGUuaW50ZXJuYWw9PSJib29sZWFuIiYmImRhdGEiaW4gZX1jb25zdCBEaz1bInBvc3QiLCJwdXQiLCJwYXRjaCIsImRlbGV0ZSJdLFdEPW5ldyBTZXQoRGspLFZEPVsiZ2V0IiwuLi5Ea10sSEQ9bmV3IFNldChWRCksS0Q9bmV3IFNldChbMzAxLDMwMiwzMDMsMzA3LDMwOF0pLFpEPW5ldyBTZXQoWzMwNywzMDhdKSxHaD17c3RhdGU6ImlkbGUiLGxvY2F0aW9uOnZvaWQgMCxmb3JtTWV0aG9kOnZvaWQgMCxmb3JtQWN0aW9uOnZvaWQgMCxmb3JtRW5jVHlwZTp2b2lkIDAsZm9ybURhdGE6dm9pZCAwLGpzb246dm9pZCAwLHRleHQ6dm9pZCAwfSxHRD17c3RhdGU6ImlkbGUiLGRhdGE6dm9pZCAwLGZvcm1NZXRob2Q6dm9pZCAwLGZvcm1BY3Rpb246dm9pZCAwLGZvcm1FbmNUeXBlOnZvaWQgMCxmb3JtRGF0YTp2b2lkIDAsanNvbjp2b2lkIDAsdGV4dDp2b2lkIDB9LHRhPXtzdGF0ZToidW5ibG9ja2VkIixwcm9jZWVkOnZvaWQgMCxyZXNldDp2b2lkIDAsbG9jYXRpb246dm9pZCAwfSxMaz0vXig/OlthLXpdW2EtejAtOSsuLV0qOnxcL1wvKS9pLFlEPWU9Pih7aGFzRXJyb3JCb3VuZGFyeTohIWUuaGFzRXJyb3JCb3VuZGFyeX0pLElrPSJyZW1peC1yb3V0ZXItdHJhbnNpdGlvbnMiO2Z1bmN0aW9uIFhEKGUpe2NvbnN0IHQ9ZS53aW5kb3c/ZS53aW5kb3c6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93OnZvaWQgMCxuPXR5cGVvZiB0PCJ1IiYmdHlwZW9mIHQuZG9jdW1lbnQ8InUiJiZ0eXBlb2YgdC5kb2N1bWVudC5jcmVhdGVFbGVtZW50PCJ1IixyPSFuO09lKGUucm91dGVzLmxlbmd0aD4wLCJZb3UgbXVzdCBwcm92aWRlIGEgbm9uLWVtcHR5IHJvdXRlcyBhcnJheSB0byBjcmVhdGVSb3V0ZXIiKTtsZXQgaTtpZihlLm1hcFJvdXRlUHJvcGVydGllcylpPWUubWFwUm91dGVQcm9wZXJ0aWVzO2Vsc2UgaWYoZS5kZXRlY3RFcnJvckJvdW5kYXJ5KXtsZXQgYj1lLmRldGVjdEVycm9yQm91bmRhcnk7aT1NPT4oe2hhc0Vycm9yQm91bmRhcnk6YihNKX0pfWVsc2UgaT1ZRDtsZXQgbz17fSxsPUhtKGUucm91dGVzLGksdm9pZCAwLG8pLHMsYT1lLmJhc2VuYW1lfHwiLyIsdT15dCh7djdfZmV0Y2hlclBlcnNpc3Q6ITEsdjdfbm9ybWFsaXplRm9ybU1ldGhvZDohMSx2N19wcmVwZW5kQmFzZW5hbWU6ITF9LGUuZnV0dXJlKSxjPW51bGwsZD1uZXcgU2V0LGY9bnVsbCxoPW51bGwsbT1udWxsLGc9ZS5oeWRyYXRpb25EYXRhIT1udWxsLHc9VWwobCxlLmhpc3RvcnkubG9jYXRpb24sYSksdj1udWxsO2lmKHc9PW51bGwpe2xldCBiPUduKDQwNCx7cGF0aG5hbWU6ZS5oaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lfSkse21hdGNoZXM6TSxyb3V0ZTp6fT1mXyhsKTt3PU0sdj17W3ouaWRdOmJ9fWxldCB5PSF3LnNvbWUoYj0+Yi5yb3V0ZS5sYXp5KSYmKCF3LnNvbWUoYj0+Yi5yb3V0ZS5sb2FkZXIpfHxlLmh5ZHJhdGlvbkRhdGEhPW51bGwpLF8sUz17aGlzdG9yeUFjdGlvbjplLmhpc3RvcnkuYWN0aW9uLGxvY2F0aW9uOmUuaGlzdG9yeS5sb2NhdGlvbixtYXRjaGVzOncsaW5pdGlhbGl6ZWQ6eSxuYXZpZ2F0aW9uOkdoLHJlc3RvcmVTY3JvbGxQb3NpdGlvbjplLmh5ZHJhdGlvbkRhdGEhPW51bGw/ITE6bnVsbCxwcmV2ZW50U2Nyb2xsUmVzZXQ6ITEscmV2YWxpZGF0aW9uOiJpZGxlIixsb2FkZXJEYXRhOmUuaHlkcmF0aW9uRGF0YSYmZS5oeWRyYXRpb25EYXRhLmxvYWRlckRhdGF8fHt9LGFjdGlvbkRhdGE6ZS5oeWRyYXRpb25EYXRhJiZlLmh5ZHJhdGlvbkRhdGEuYWN0aW9uRGF0YXx8bnVsbCxlcnJvcnM6ZS5oeWRyYXRpb25EYXRhJiZlLmh5ZHJhdGlvbkRhdGEuZXJyb3JzfHx2LGZldGNoZXJzOm5ldyBNYXAsYmxvY2tlcnM6bmV3IE1hcH0sRT13dC5Qb3AsJD0hMSxDLFQ9ITEsTj1uZXcgTWFwLFI9bnVsbCxEPSExLEY9ITEsc2U9W10sVj1bXSxLPW5ldyBNYXAsTz0wLEE9LTEsaz1uZXcgTWFwLGo9bmV3IFNldCxJPW5ldyBNYXAsWj1uZXcgTWFwLG5lPW5ldyBTZXQsa2U9bmV3IE1hcCx2ZT1uZXcgTWFwLFdlPSExO2Z1bmN0aW9uIEZlKCl7aWYoYz1lLmhpc3RvcnkubGlzdGVuKGI9PntsZXR7YWN0aW9uOk0sbG9jYXRpb246eixkZWx0YTpHfT1iO2lmKFdlKXtXZT0hMTtyZXR1cm59cmwodmUuc2l6ZT09PTB8fEchPW51bGwsIllvdSBhcmUgdHJ5aW5nIHRvIHVzZSBhIGJsb2NrZXIgb24gYSBQT1AgbmF2aWdhdGlvbiB0byBhIGxvY2F0aW9uIHRoYXQgd2FzIG5vdCBjcmVhdGVkIGJ5IEByZW1peC1ydW4vcm91dGVyLiBUaGlzIHdpbGwgZmFpbCBzaWxlbnRseSBpbiBwcm9kdWN0aW9uLiBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IGFyZSBuYXZpZ2F0aW5nIG91dHNpZGUgdGhlIHJvdXRlciB2aWEgYHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZWAvYHdpbmRvdy5sb2NhdGlvbi5oYXNoYCBpbnN0ZWFkIG9mIHVzaW5nIHJvdXRlciBuYXZpZ2F0aW9uIEFQSXMuICBUaGlzIGNhbiBhbHNvIGhhcHBlbiBpZiB5b3UgYXJlIHVzaW5nIGNyZWF0ZUhhc2hSb3V0ZXIgYW5kIHRoZSB1c2VyIG1hbnVhbGx5IGNoYW5nZXMgdGhlIFVSTC4iKTtsZXQgb2U9aXkoe2N1cnJlbnRMb2NhdGlvbjpTLmxvY2F0aW9uLG5leHRMb2NhdGlvbjp6LGhpc3RvcnlBY3Rpb246TX0pO2lmKG9lJiZHIT1udWxsKXtXZT0hMCxlLmhpc3RvcnkuZ28oRyotMSksS3Uob2Use3N0YXRlOiJibG9ja2VkIixsb2NhdGlvbjp6LHByb2NlZWQoKXtLdShvZSx7c3RhdGU6InByb2NlZWRpbmciLHByb2NlZWQ6dm9pZCAwLHJlc2V0OnZvaWQgMCxsb2NhdGlvbjp6fSksZS5oaXN0b3J5LmdvKEcpfSxyZXNldCgpe2xldCAkZT1uZXcgTWFwKFMuYmxvY2tlcnMpOyRlLnNldChvZSx0YSksYmUoe2Jsb2NrZXJzOiRlfSl9fSk7cmV0dXJufXJldHVybiBRZShNLHopfSksbil7c0wodCxOKTtsZXQgYj0oKT0+YUwodCxOKTt0LmFkZEV2ZW50TGlzdGVuZXIoInBhZ2VoaWRlIixiKSxSPSgpPT50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBhZ2VoaWRlIixiKX1yZXR1cm4gUy5pbml0aWFsaXplZHx8UWUod3QuUG9wLFMubG9jYXRpb24pLF99ZnVuY3Rpb24gdGUoKXtjJiZjKCksUiYmUigpLGQuY2xlYXIoKSxDJiZDLmFib3J0KCksUy5mZXRjaGVycy5mb3JFYWNoKChiLE0pPT5QbihNKSksUy5ibG9ja2Vycy5mb3JFYWNoKChiLE0pPT5yeShNKSl9ZnVuY3Rpb24gSWUoYil7cmV0dXJuIGQuYWRkKGIpLCgpPT5kLmRlbGV0ZShiKX1mdW5jdGlvbiBiZShiLE0pe009PT12b2lkIDAmJihNPXt9KSxTPXl0KHt9LFMsYik7bGV0IHo9W10sRz1bXTt1LnY3X2ZldGNoZXJQZXJzaXN0JiZTLmZldGNoZXJzLmZvckVhY2goKG9lLCRlKT0+e29lLnN0YXRlPT09ImlkbGUiJiYobmUuaGFzKCRlKT9HLnB1c2goJGUpOnoucHVzaCgkZSkpfSksWy4uLmRdLmZvckVhY2gob2U9Pm9lKFMse2RlbGV0ZWRGZXRjaGVyczpHLHVuc3RhYmxlX3ZpZXdUcmFuc2l0aW9uT3B0czpNLnZpZXdUcmFuc2l0aW9uT3B0cyx1bnN0YWJsZV9mbHVzaFN5bmM6TS5mbHVzaFN5bmM9PT0hMH0pKSx1LnY3X2ZldGNoZXJQZXJzaXN0JiYoei5mb3JFYWNoKG9lPT5TLmZldGNoZXJzLmRlbGV0ZShvZSkpLEcuZm9yRWFjaChvZT0+UG4ob2UpKSl9ZnVuY3Rpb24gUmUoYixNLHope3ZhciBHLG9lO2xldHtmbHVzaFN5bmM6JGV9PXo9PT12b2lkIDA/e306eixoZT1TLmFjdGlvbkRhdGEhPW51bGwmJlMubmF2aWdhdGlvbi5mb3JtTWV0aG9kIT1udWxsJiZ2cihTLm5hdmlnYXRpb24uZm9ybU1ldGhvZCkmJlMubmF2aWdhdGlvbi5zdGF0ZT09PSJsb2FkaW5nIiYmKChHPWIuc3RhdGUpPT1udWxsP3ZvaWQgMDpHLl9pc1JlZGlyZWN0KSE9PSEwLGZlO00uYWN0aW9uRGF0YT9PYmplY3Qua2V5cyhNLmFjdGlvbkRhdGEpLmxlbmd0aD4wP2ZlPU0uYWN0aW9uRGF0YTpmZT1udWxsOmhlP2ZlPVMuYWN0aW9uRGF0YTpmZT1udWxsO2xldCBhZT1NLmxvYWRlckRhdGE/ZF8oUy5sb2FkZXJEYXRhLE0ubG9hZGVyRGF0YSxNLm1hdGNoZXN8fFtdLE0uZXJyb3JzKTpTLmxvYWRlckRhdGEsQWU9Uy5ibG9ja2VycztBZS5zaXplPjAmJihBZT1uZXcgTWFwKEFlKSxBZS5mb3JFYWNoKChaZSx1dCk9PkFlLnNldCh1dCx0YSkpKTtsZXQgVnQ9JD09PSEwfHxTLm5hdmlnYXRpb24uZm9ybU1ldGhvZCE9bnVsbCYmdnIoUy5uYXZpZ2F0aW9uLmZvcm1NZXRob2QpJiYoKG9lPWIuc3RhdGUpPT1udWxsP3ZvaWQgMDpvZS5faXNSZWRpcmVjdCkhPT0hMDtzJiYobD1zLHM9dm9pZCAwKSxEfHxFPT09d3QuUG9wfHwoRT09PXd0LlB1c2g/ZS5oaXN0b3J5LnB1c2goYixiLnN0YXRlKTpFPT09d3QuUmVwbGFjZSYmZS5oaXN0b3J5LnJlcGxhY2UoYixiLnN0YXRlKSk7bGV0IFRlO2lmKEU9PT13dC5Qb3Ape2xldCBaZT1OLmdldChTLmxvY2F0aW9uLnBhdGhuYW1lKTtaZSYmWmUuaGFzKGIucGF0aG5hbWUpP1RlPXtjdXJyZW50TG9jYXRpb246Uy5sb2NhdGlvbixuZXh0TG9jYXRpb246Yn06Ti5oYXMoYi5wYXRobmFtZSkmJihUZT17Y3VycmVudExvY2F0aW9uOmIsbmV4dExvY2F0aW9uOlMubG9jYXRpb259KX1lbHNlIGlmKFQpe2xldCBaZT1OLmdldChTLmxvY2F0aW9uLnBhdGhuYW1lKTtaZT9aZS5hZGQoYi5wYXRobmFtZSk6KFplPW5ldyBTZXQoW2IucGF0aG5hbWVdKSxOLnNldChTLmxvY2F0aW9uLnBhdGhuYW1lLFplKSksVGU9e2N1cnJlbnRMb2NhdGlvbjpTLmxvY2F0aW9uLG5leHRMb2NhdGlvbjpifX1iZSh5dCh7fSxNLHthY3Rpb25EYXRhOmZlLGxvYWRlckRhdGE6YWUsaGlzdG9yeUFjdGlvbjpFLGxvY2F0aW9uOmIsaW5pdGlhbGl6ZWQ6ITAsbmF2aWdhdGlvbjpHaCxyZXZhbGlkYXRpb246ImlkbGUiLHJlc3RvcmVTY3JvbGxQb3NpdGlvbjpseShiLE0ubWF0Y2hlc3x8Uy5tYXRjaGVzKSxwcmV2ZW50U2Nyb2xsUmVzZXQ6VnQsYmxvY2tlcnM6QWV9KSx7dmlld1RyYW5zaXRpb25PcHRzOlRlLGZsdXNoU3luYzokZT09PSEwfSksRT13dC5Qb3AsJD0hMSxUPSExLEQ9ITEsRj0hMSxzZT1bXSxWPVtdfWFzeW5jIGZ1bmN0aW9uIFNlKGIsTSl7aWYodHlwZW9mIGI9PSJudW1iZXIiKXtlLmhpc3RvcnkuZ28oYik7cmV0dXJufWxldCB6PUttKFMubG9jYXRpb24sUy5tYXRjaGVzLGEsdS52N19wcmVwZW5kQmFzZW5hbWUsYixNPT1udWxsP3ZvaWQgMDpNLmZyb21Sb3V0ZUlkLE09PW51bGw/dm9pZCAwOk0ucmVsYXRpdmUpLHtwYXRoOkcsc3VibWlzc2lvbjpvZSxlcnJvcjokZX09b18odS52N19ub3JtYWxpemVGb3JtTWV0aG9kLCExLHosTSksaGU9Uy5sb2NhdGlvbixmZT1rdShTLmxvY2F0aW9uLEcsTSYmTS5zdGF0ZSk7ZmU9eXQoe30sZmUsZS5oaXN0b3J5LmVuY29kZUxvY2F0aW9uKGZlKSk7bGV0IGFlPU0mJk0ucmVwbGFjZSE9bnVsbD9NLnJlcGxhY2U6dm9pZCAwLEFlPXd0LlB1c2g7YWU9PT0hMD9BZT13dC5SZXBsYWNlOmFlPT09ITF8fG9lIT1udWxsJiZ2cihvZS5mb3JtTWV0aG9kKSYmb2UuZm9ybUFjdGlvbj09PVMubG9jYXRpb24ucGF0aG5hbWUrUy5sb2NhdGlvbi5zZWFyY2gmJihBZT13dC5SZXBsYWNlKTtsZXQgVnQ9TSYmInByZXZlbnRTY3JvbGxSZXNldCJpbiBNP00ucHJldmVudFNjcm9sbFJlc2V0PT09ITA6dm9pZCAwLFRlPShNJiZNLnVuc3RhYmxlX2ZsdXNoU3luYyk9PT0hMCxaZT1peSh7Y3VycmVudExvY2F0aW9uOmhlLG5leHRMb2NhdGlvbjpmZSxoaXN0b3J5QWN0aW9uOkFlfSk7aWYoWmUpe0t1KFplLHtzdGF0ZToiYmxvY2tlZCIsbG9jYXRpb246ZmUscHJvY2VlZCgpe0t1KFplLHtzdGF0ZToicHJvY2VlZGluZyIscHJvY2VlZDp2b2lkIDAscmVzZXQ6dm9pZCAwLGxvY2F0aW9uOmZlfSksU2UoYixNKX0scmVzZXQoKXtsZXQgdXQ9bmV3IE1hcChTLmJsb2NrZXJzKTt1dC5zZXQoWmUsdGEpLGJlKHtibG9ja2Vyczp1dH0pfX0pO3JldHVybn1yZXR1cm4gYXdhaXQgUWUoQWUsZmUse3N1Ym1pc3Npb246b2UscGVuZGluZ0Vycm9yOiRlLHByZXZlbnRTY3JvbGxSZXNldDpWdCxyZXBsYWNlOk0mJk0ucmVwbGFjZSxlbmFibGVWaWV3VHJhbnNpdGlvbjpNJiZNLnVuc3RhYmxlX3ZpZXdUcmFuc2l0aW9uLGZsdXNoU3luYzpUZX0pfWZ1bmN0aW9uIERlKCl7aWYoRW4oKSxiZSh7cmV2YWxpZGF0aW9uOiJsb2FkaW5nIn0pLFMubmF2aWdhdGlvbi5zdGF0ZSE9PSJzdWJtaXR0aW5nIil7aWYoUy5uYXZpZ2F0aW9uLnN0YXRlPT09ImlkbGUiKXtRZShTLmhpc3RvcnlBY3Rpb24sUy5sb2NhdGlvbix7c3RhcnRVbmludGVycnVwdGVkUmV2YWxpZGF0aW9uOiEwfSk7cmV0dXJufVFlKEV8fFMuaGlzdG9yeUFjdGlvbixTLm5hdmlnYXRpb24ubG9jYXRpb24se292ZXJyaWRlTmF2aWdhdGlvbjpTLm5hdmlnYXRpb259KX19YXN5bmMgZnVuY3Rpb24gUWUoYixNLHope0MmJkMuYWJvcnQoKSxDPW51bGwsRT1iLEQ9KHomJnouc3RhcnRVbmludGVycnVwdGVkUmV2YWxpZGF0aW9uKT09PSEwLHAkKFMubG9jYXRpb24sUy5tYXRjaGVzKSwkPSh6JiZ6LnByZXZlbnRTY3JvbGxSZXNldCk9PT0hMCxUPSh6JiZ6LmVuYWJsZVZpZXdUcmFuc2l0aW9uKT09PSEwO2xldCBHPXN8fGwsb2U9eiYmei5vdmVycmlkZU5hdmlnYXRpb24sJGU9VWwoRyxNLGEpLGhlPSh6JiZ6LmZsdXNoU3luYyk9PT0hMDtpZighJGUpe2xldCB1dD1Hbig0MDQse3BhdGhuYW1lOk0ucGF0aG5hbWV9KSx7bWF0Y2hlczphbixyb3V0ZTpScn09Zl8oRyk7UWYoKSxSZShNLHttYXRjaGVzOmFuLGxvYWRlckRhdGE6e30sZXJyb3JzOntbUnIuaWRdOnV0fX0se2ZsdXNoU3luYzpoZX0pO3JldHVybn1pZihTLmluaXRpYWxpemVkJiYhRiYmdEwoUy5sb2NhdGlvbixNKSYmISh6JiZ6LnN1Ym1pc3Npb24mJnZyKHouc3VibWlzc2lvbi5mb3JtTWV0aG9kKSkpe1JlKE0se21hdGNoZXM6JGV9LHtmbHVzaFN5bmM6aGV9KTtyZXR1cm59Qz1uZXcgQWJvcnRDb250cm9sbGVyO2xldCBmZT1yYShlLmhpc3RvcnksTSxDLnNpZ25hbCx6JiZ6LnN1Ym1pc3Npb24pLGFlLEFlO2lmKHomJnoucGVuZGluZ0Vycm9yKUFlPXtbTWEoJGUpLnJvdXRlLmlkXTp6LnBlbmRpbmdFcnJvcn07ZWxzZSBpZih6JiZ6LnN1Ym1pc3Npb24mJnZyKHouc3VibWlzc2lvbi5mb3JtTWV0aG9kKSl7bGV0IHV0PWF3YWl0IFd0KGZlLE0sei5zdWJtaXNzaW9uLCRlLHtyZXBsYWNlOnoucmVwbGFjZSxmbHVzaFN5bmM6aGV9KTtpZih1dC5zaG9ydENpcmN1aXRlZClyZXR1cm47YWU9dXQucGVuZGluZ0FjdGlvbkRhdGEsQWU9dXQucGVuZGluZ0FjdGlvbkVycm9yLG9lPVloKE0sei5zdWJtaXNzaW9uKSxoZT0hMSxmZT1uZXcgUmVxdWVzdChmZS51cmwse3NpZ25hbDpmZS5zaWduYWx9KX1sZXR7c2hvcnRDaXJjdWl0ZWQ6VnQsbG9hZGVyRGF0YTpUZSxlcnJvcnM6WmV9PWF3YWl0IFNuKGZlLE0sJGUsb2UseiYmei5zdWJtaXNzaW9uLHomJnouZmV0Y2hlclN1Ym1pc3Npb24seiYmei5yZXBsYWNlLGhlLGFlLEFlKTtWdHx8KEM9bnVsbCxSZShNLHl0KHttYXRjaGVzOiRlfSxhZT97YWN0aW9uRGF0YTphZX06e30se2xvYWRlckRhdGE6VGUsZXJyb3JzOlplfSkpKX1hc3luYyBmdW5jdGlvbiBXdChiLE0seixHLG9lKXtvZT09PXZvaWQgMCYmKG9lPXt9KSxFbigpO2xldCAkZT1vTChNLHopO2JlKHtuYXZpZ2F0aW9uOiRlfSx7Zmx1c2hTeW5jOm9lLmZsdXNoU3luYz09PSEwfSk7bGV0IGhlLGZlPUdtKEcsTSk7aWYoIWZlLnJvdXRlLmFjdGlvbiYmIWZlLnJvdXRlLmxhenkpaGU9e3R5cGU6U3QuZXJyb3IsZXJyb3I6R24oNDA1LHttZXRob2Q6Yi5tZXRob2QscGF0aG5hbWU6TS5wYXRobmFtZSxyb3V0ZUlkOmZlLnJvdXRlLmlkfSl9O2Vsc2UgaWYoaGU9YXdhaXQgbmEoImFjdGlvbiIsYixmZSxHLG8saSxhKSxiLnNpZ25hbC5hYm9ydGVkKXJldHVybntzaG9ydENpcmN1aXRlZDohMH07aWYoZXMoaGUpKXtsZXQgYWU7cmV0dXJuIG9lJiZvZS5yZXBsYWNlIT1udWxsP2FlPW9lLnJlcGxhY2U6YWU9aGUubG9jYXRpb249PT1TLmxvY2F0aW9uLnBhdGhuYW1lK1MubG9jYXRpb24uc2VhcmNoLGF3YWl0IGF0KFMsaGUse3N1Ym1pc3Npb246eixyZXBsYWNlOmFlfSkse3Nob3J0Q2lyY3VpdGVkOiEwfX1pZihEYShoZSkpe2xldCBhZT1NYShHLGZlLnJvdXRlLmlkKTtyZXR1cm4ob2UmJm9lLnJlcGxhY2UpIT09ITAmJihFPXd0LlB1c2gpLHtwZW5kaW5nQWN0aW9uRGF0YTp7fSxwZW5kaW5nQWN0aW9uRXJyb3I6e1thZS5yb3V0ZS5pZF06aGUuZXJyb3J9fX1pZihEbyhoZSkpdGhyb3cgR24oNDAwLHt0eXBlOiJkZWZlci1hY3Rpb24ifSk7cmV0dXJue3BlbmRpbmdBY3Rpb25EYXRhOntbZmUucm91dGUuaWRdOmhlLmRhdGF9fX1hc3luYyBmdW5jdGlvbiBTbihiLE0seixHLG9lLCRlLGhlLGZlLGFlLEFlKXtsZXQgVnQ9R3x8WWgoTSxvZSksVGU9b2V8fCRlfHxtXyhWdCksWmU9c3x8bCxbdXQsYW5dPWxfKGUuaGlzdG9yeSxTLHosVGUsTSxGLHNlLFYsbmUsSSxqLFplLGEsYWUsQWUpO2lmKFFmKEdlPT4hKHomJnouc29tZShabj0+Wm4ucm91dGUuaWQ9PT1HZSkpfHx1dCYmdXQuc29tZShabj0+Wm4ucm91dGUuaWQ9PT1HZSkpLEE9KytPLHV0Lmxlbmd0aD09PTAmJmFuLmxlbmd0aD09PTApe2xldCBHZT1FbygpO3JldHVybiBSZShNLHl0KHttYXRjaGVzOnosbG9hZGVyRGF0YTp7fSxlcnJvcnM6QWV8fG51bGx9LGFlP3thY3Rpb25EYXRhOmFlfTp7fSxHZT97ZmV0Y2hlcnM6bmV3IE1hcChTLmZldGNoZXJzKX06e30pLHtmbHVzaFN5bmM6ZmV9KSx7c2hvcnRDaXJjdWl0ZWQ6ITB9fWlmKCFEKXthbi5mb3JFYWNoKFpuPT57bGV0IGt0PVMuZmV0Y2hlcnMuZ2V0KFpuLmtleSksQ289aWEodm9pZCAwLGt0P2t0LmRhdGE6dm9pZCAwKTtTLmZldGNoZXJzLnNldChabi5rZXksQ28pfSk7bGV0IEdlPWFlfHxTLmFjdGlvbkRhdGE7YmUoeXQoe25hdmlnYXRpb246VnR9LEdlP09iamVjdC5rZXlzKEdlKS5sZW5ndGg9PT0wP3thY3Rpb25EYXRhOm51bGx9OnthY3Rpb25EYXRhOkdlfTp7fSxhbi5sZW5ndGg+MD97ZmV0Y2hlcnM6bmV3IE1hcChTLmZldGNoZXJzKX06e30pLHtmbHVzaFN5bmM6ZmV9KX1hbi5mb3JFYWNoKEdlPT57Sy5oYXMoR2Uua2V5KSYmZ3QoR2Uua2V5KSxHZS5jb250cm9sbGVyJiZLLnNldChHZS5rZXksR2UuY29udHJvbGxlcil9KTtsZXQgUnI9KCk9PmFuLmZvckVhY2goR2U9Pmd0KEdlLmtleSkpO0MmJkMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixScik7bGV0e3Jlc3VsdHM6RnMsbG9hZGVyUmVzdWx0czpKZixmZXRjaGVyUmVzdWx0czpobH09YXdhaXQgbG4oUy5tYXRjaGVzLHosdXQsYW4sYik7aWYoYi5zaWduYWwuYWJvcnRlZClyZXR1cm57c2hvcnRDaXJjdWl0ZWQ6ITB9O0MmJkMuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixSciksYW4uZm9yRWFjaChHZT0+Sy5kZWxldGUoR2Uua2V5KSk7bGV0IGNyPWhfKEZzKTtpZihjcil7aWYoY3IuaWR4Pj11dC5sZW5ndGgpe2xldCBHZT1hbltjci5pZHgtdXQubGVuZ3RoXS5rZXk7ai5hZGQoR2UpfXJldHVybiBhd2FpdCBhdChTLGNyLnJlc3VsdCx7cmVwbGFjZTpoZX0pLHtzaG9ydENpcmN1aXRlZDohMH19bGV0e2xvYWRlckRhdGE6WnUsZXJyb3JzOnFmfT1jXyhTLHosdXQsSmYsQWUsYW4saGwsa2UpO2tlLmZvckVhY2goKEdlLFpuKT0+e0dlLnN1YnNjcmliZShrdD0+eyhrdHx8R2UuZG9uZSkmJmtlLmRlbGV0ZShabil9KX0pO2xldCBlaD1FbygpLHRoPXpzKEEpLHBsPWVofHx0aHx8YW4ubGVuZ3RoPjA7cmV0dXJuIHl0KHtsb2FkZXJEYXRhOlp1LGVycm9yczpxZn0scGw/e2ZldGNoZXJzOm5ldyBNYXAoUy5mZXRjaGVycyl9Ont9KX1mdW5jdGlvbiB1cihiLE0seixHKXtpZihyKXRocm93IG5ldyBFcnJvcigicm91dGVyLmZldGNoKCkgd2FzIGNhbGxlZCBkdXJpbmcgdGhlIHNlcnZlciByZW5kZXIsIGJ1dCBpdCBzaG91bGRuJ3QgYmUuIFlvdSBhcmUgbGlrZWx5IGNhbGxpbmcgYSB1c2VGZXRjaGVyKCkgbWV0aG9kIGluIHRoZSBib2R5IG9mIHlvdXIgY29tcG9uZW50LiBUcnkgbW92aW5nIGl0IHRvIGEgdXNlRWZmZWN0IG9yIGEgY2FsbGJhY2suIik7Sy5oYXMoYikmJmd0KGIpO2xldCBvZT0oRyYmRy51bnN0YWJsZV9mbHVzaFN5bmMpPT09ITAsJGU9c3x8bCxoZT1LbShTLmxvY2F0aW9uLFMubWF0Y2hlcyxhLHUudjdfcHJlcGVuZEJhc2VuYW1lLHosTSxHPT1udWxsP3ZvaWQgMDpHLnJlbGF0aXZlKSxmZT1VbCgkZSxoZSxhKTtpZighZmUpe0F0KGIsTSxHbig0MDQse3BhdGhuYW1lOmhlfSkse2ZsdXNoU3luYzpvZX0pO3JldHVybn1sZXR7cGF0aDphZSxzdWJtaXNzaW9uOkFlLGVycm9yOlZ0fT1vXyh1LnY3X25vcm1hbGl6ZUZvcm1NZXRob2QsITAsaGUsRyk7aWYoVnQpe0F0KGIsTSxWdCx7Zmx1c2hTeW5jOm9lfSk7cmV0dXJufWxldCBUZT1HbShmZSxhZSk7aWYoJD0oRyYmRy5wcmV2ZW50U2Nyb2xsUmVzZXQpPT09ITAsQWUmJnZyKEFlLmZvcm1NZXRob2QpKXtqZShiLE0sYWUsVGUsZmUsb2UsQWUpO3JldHVybn1JLnNldChiLHtyb3V0ZUlkOk0scGF0aDphZX0pLFR0KGIsTSxhZSxUZSxmZSxvZSxBZSl9YXN5bmMgZnVuY3Rpb24gamUoYixNLHosRyxvZSwkZSxoZSl7aWYoRW4oKSxJLmRlbGV0ZShiKSwhRy5yb3V0ZS5hY3Rpb24mJiFHLnJvdXRlLmxhenkpe2xldCBrdD1Hbig0MDUse21ldGhvZDpoZS5mb3JtTWV0aG9kLHBhdGhuYW1lOnoscm91dGVJZDpNfSk7QXQoYixNLGt0LHtmbHVzaFN5bmM6JGV9KTtyZXR1cm59bGV0IGZlPVMuZmV0Y2hlcnMuZ2V0KGIpO190KGIsbEwoaGUsZmUpLHtmbHVzaFN5bmM6JGV9KTtsZXQgYWU9bmV3IEFib3J0Q29udHJvbGxlcixBZT1yYShlLmhpc3RvcnkseixhZS5zaWduYWwsaGUpO0suc2V0KGIsYWUpO2xldCBWdD1PLFRlPWF3YWl0IG5hKCJhY3Rpb24iLEFlLEcsb2UsbyxpLGEpO2lmKEFlLnNpZ25hbC5hYm9ydGVkKXtLLmdldChiKT09PWFlJiZLLmRlbGV0ZShiKTtyZXR1cm59aWYobmUuaGFzKGIpKXtfdChiLFBpKHZvaWQgMCkpO3JldHVybn1pZihlcyhUZSkpaWYoSy5kZWxldGUoYiksQT5WdCl7X3QoYixQaSh2b2lkIDApKTtyZXR1cm59ZWxzZSByZXR1cm4gai5hZGQoYiksX3QoYixpYShoZSkpLGF0KFMsVGUse2ZldGNoZXJTdWJtaXNzaW9uOmhlfSk7aWYoRGEoVGUpKXtBdChiLE0sVGUuZXJyb3IpO3JldHVybn1pZihEbyhUZSkpdGhyb3cgR24oNDAwLHt0eXBlOiJkZWZlci1hY3Rpb24ifSk7bGV0IFplPVMubmF2aWdhdGlvbi5sb2NhdGlvbnx8Uy5sb2NhdGlvbix1dD1yYShlLmhpc3RvcnksWmUsYWUuc2lnbmFsKSxhbj1zfHxsLFJyPVMubmF2aWdhdGlvbi5zdGF0ZSE9PSJpZGxlIj9VbChhbixTLm5hdmlnYXRpb24ubG9jYXRpb24sYSk6Uy5tYXRjaGVzO09lKFJyLCJEaWRuJ3QgZmluZCBhbnkgbWF0Y2hlcyBhZnRlciBmZXRjaGVyIGFjdGlvbiIpO2xldCBGcz0rK087ay5zZXQoYixGcyk7bGV0IEpmPWlhKGhlLFRlLmRhdGEpO1MuZmV0Y2hlcnMuc2V0KGIsSmYpO2xldFtobCxjcl09bF8oZS5oaXN0b3J5LFMsUnIsaGUsWmUsRixzZSxWLG5lLEksaixhbixhLHtbRy5yb3V0ZS5pZF06VGUuZGF0YX0sdm9pZCAwKTtjci5maWx0ZXIoa3Q9Pmt0LmtleSE9PWIpLmZvckVhY2goa3Q9PntsZXQgQ289a3Qua2V5LHN5PVMuZmV0Y2hlcnMuZ2V0KENvKSxnJD1pYSh2b2lkIDAsc3k/c3kuZGF0YTp2b2lkIDApO1MuZmV0Y2hlcnMuc2V0KENvLGckKSxLLmhhcyhDbykmJmd0KENvKSxrdC5jb250cm9sbGVyJiZLLnNldChDbyxrdC5jb250cm9sbGVyKX0pLGJlKHtmZXRjaGVyczpuZXcgTWFwKFMuZmV0Y2hlcnMpfSk7bGV0IFp1PSgpPT5jci5mb3JFYWNoKGt0PT5ndChrdC5rZXkpKTthZS5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLFp1KTtsZXR7cmVzdWx0czpxZixsb2FkZXJSZXN1bHRzOmVoLGZldGNoZXJSZXN1bHRzOnRofT1hd2FpdCBsbihTLm1hdGNoZXMsUnIsaGwsY3IsdXQpO2lmKGFlLnNpZ25hbC5hYm9ydGVkKXJldHVybjthZS5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLFp1KSxrLmRlbGV0ZShiKSxLLmRlbGV0ZShiKSxjci5mb3JFYWNoKGt0PT5LLmRlbGV0ZShrdC5rZXkpKTtsZXQgcGw9aF8ocWYpO2lmKHBsKXtpZihwbC5pZHg+PWhsLmxlbmd0aCl7bGV0IGt0PWNyW3BsLmlkeC1obC5sZW5ndGhdLmtleTtqLmFkZChrdCl9cmV0dXJuIGF0KFMscGwucmVzdWx0KX1sZXR7bG9hZGVyRGF0YTpHZSxlcnJvcnM6Wm59PWNfKFMsUy5tYXRjaGVzLGhsLGVoLHZvaWQgMCxjcix0aCxrZSk7aWYoUy5mZXRjaGVycy5oYXMoYikpe2xldCBrdD1QaShUZS5kYXRhKTtTLmZldGNoZXJzLnNldChiLGt0KX16cyhGcyksUy5uYXZpZ2F0aW9uLnN0YXRlPT09ImxvYWRpbmciJiZGcz5BPyhPZShFLCJFeHBlY3RlZCBwZW5kaW5nIGFjdGlvbiIpLEMmJkMuYWJvcnQoKSxSZShTLm5hdmlnYXRpb24ubG9jYXRpb24se21hdGNoZXM6UnIsbG9hZGVyRGF0YTpHZSxlcnJvcnM6Wm4sZmV0Y2hlcnM6bmV3IE1hcChTLmZldGNoZXJzKX0pKTooYmUoe2Vycm9yczpabixsb2FkZXJEYXRhOmRfKFMubG9hZGVyRGF0YSxHZSxScixabiksZmV0Y2hlcnM6bmV3IE1hcChTLmZldGNoZXJzKX0pLEY9ITEpfWFzeW5jIGZ1bmN0aW9uIFR0KGIsTSx6LEcsb2UsJGUsaGUpe2xldCBmZT1TLmZldGNoZXJzLmdldChiKTtfdChiLGlhKGhlLGZlP2ZlLmRhdGE6dm9pZCAwKSx7Zmx1c2hTeW5jOiRlfSk7bGV0IGFlPW5ldyBBYm9ydENvbnRyb2xsZXIsQWU9cmEoZS5oaXN0b3J5LHosYWUuc2lnbmFsKTtLLnNldChiLGFlKTtsZXQgVnQ9TyxUZT1hd2FpdCBuYSgibG9hZGVyIixBZSxHLG9lLG8saSxhKTtpZihEbyhUZSkmJihUZT1hd2FpdCBGayhUZSxBZS5zaWduYWwsITApfHxUZSksSy5nZXQoYik9PT1hZSYmSy5kZWxldGUoYiksIUFlLnNpZ25hbC5hYm9ydGVkKXtpZihuZS5oYXMoYikpe190KGIsUGkodm9pZCAwKSk7cmV0dXJufWlmKGVzKFRlKSlpZihBPlZ0KXtfdChiLFBpKHZvaWQgMCkpO3JldHVybn1lbHNle2ouYWRkKGIpLGF3YWl0IGF0KFMsVGUpO3JldHVybn1pZihEYShUZSkpe0F0KGIsTSxUZS5lcnJvcik7cmV0dXJufU9lKCFEbyhUZSksIlVuaGFuZGxlZCBmZXRjaGVyIGRlZmVycmVkIGRhdGEiKSxfdChiLFBpKFRlLmRhdGEpKX19YXN5bmMgZnVuY3Rpb24gYXQoYixNLHope2xldHtzdWJtaXNzaW9uOkcsZmV0Y2hlclN1Ym1pc3Npb246b2UscmVwbGFjZTokZX09ej09PXZvaWQgMD97fTp6O00ucmV2YWxpZGF0ZSYmKEY9ITApO2xldCBoZT1rdShiLmxvY2F0aW9uLE0ubG9jYXRpb24se19pc1JlZGlyZWN0OiEwfSk7aWYoT2UoaGUsIkV4cGVjdGVkIGEgbG9jYXRpb24gb24gdGhlIHJlZGlyZWN0IG5hdmlnYXRpb24iKSxuKXtsZXQgWmU9ITE7aWYoTS5yZWxvYWREb2N1bWVudClaZT0hMDtlbHNlIGlmKExrLnRlc3QoTS5sb2NhdGlvbikpe2NvbnN0IHV0PWUuaGlzdG9yeS5jcmVhdGVVUkwoTS5sb2NhdGlvbik7WmU9dXQub3JpZ2luIT09dC5sb2NhdGlvbi5vcmlnaW58fEh1KHV0LnBhdGhuYW1lLGEpPT1udWxsfWlmKFplKXskZT90LmxvY2F0aW9uLnJlcGxhY2UoTS5sb2NhdGlvbik6dC5sb2NhdGlvbi5hc3NpZ24oTS5sb2NhdGlvbik7cmV0dXJufX1DPW51bGw7bGV0IGZlPSRlPT09ITA/d3QuUmVwbGFjZTp3dC5QdXNoLHtmb3JtTWV0aG9kOmFlLGZvcm1BY3Rpb246QWUsZm9ybUVuY1R5cGU6VnR9PWIubmF2aWdhdGlvbjshRyYmIW9lJiZhZSYmQWUmJlZ0JiYoRz1tXyhiLm5hdmlnYXRpb24pKTtsZXQgVGU9R3x8b2U7aWYoWkQuaGFzKE0uc3RhdHVzKSYmVGUmJnZyKFRlLmZvcm1NZXRob2QpKWF3YWl0IFFlKGZlLGhlLHtzdWJtaXNzaW9uOnl0KHt9LFRlLHtmb3JtQWN0aW9uOk0ubG9jYXRpb259KSxwcmV2ZW50U2Nyb2xsUmVzZXQ6JH0pO2Vsc2V7bGV0IFplPVloKGhlLEcpO2F3YWl0IFFlKGZlLGhlLHtvdmVycmlkZU5hdmlnYXRpb246WmUsZmV0Y2hlclN1Ym1pc3Npb246b2UscHJldmVudFNjcm9sbFJlc2V0OiR9KX19YXN5bmMgZnVuY3Rpb24gbG4oYixNLHosRyxvZSl7bGV0ICRlPWF3YWl0IFByb21pc2UuYWxsKFsuLi56Lm1hcChhZT0+bmEoImxvYWRlciIsb2UsYWUsTSxvLGksYSkpLC4uLkcubWFwKGFlPT5hZS5tYXRjaGVzJiZhZS5tYXRjaCYmYWUuY29udHJvbGxlcj9uYSgibG9hZGVyIixyYShlLmhpc3RvcnksYWUucGF0aCxhZS5jb250cm9sbGVyLnNpZ25hbCksYWUubWF0Y2gsYWUubWF0Y2hlcyxvLGksYSk6e3R5cGU6U3QuZXJyb3IsZXJyb3I6R24oNDA0LHtwYXRobmFtZTphZS5wYXRofSl9KV0pLGhlPSRlLnNsaWNlKDAsei5sZW5ndGgpLGZlPSRlLnNsaWNlKHoubGVuZ3RoKTtyZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoW3BfKGIseixoZSxoZS5tYXAoKCk9Pm9lLnNpZ25hbCksITEsUy5sb2FkZXJEYXRhKSxwXyhiLEcubWFwKGFlPT5hZS5tYXRjaCksZmUsRy5tYXAoYWU9PmFlLmNvbnRyb2xsZXI/YWUuY29udHJvbGxlci5zaWduYWw6bnVsbCksITApXSkse3Jlc3VsdHM6JGUsbG9hZGVyUmVzdWx0czpoZSxmZXRjaGVyUmVzdWx0czpmZX19ZnVuY3Rpb24gRW4oKXtGPSEwLHNlLnB1c2goLi4uUWYoKSksSS5mb3JFYWNoKChiLE0pPT57Sy5oYXMoTSkmJihWLnB1c2goTSksZ3QoTSkpfSl9ZnVuY3Rpb24gX3QoYixNLHope3o9PT12b2lkIDAmJih6PXt9KSxTLmZldGNoZXJzLnNldChiLE0pLGJlKHtmZXRjaGVyczpuZXcgTWFwKFMuZmV0Y2hlcnMpfSx7Zmx1c2hTeW5jOih6JiZ6LmZsdXNoU3luYyk9PT0hMH0pfWZ1bmN0aW9uIEF0KGIsTSx6LEcpe0c9PT12b2lkIDAmJihHPXt9KTtsZXQgb2U9TWEoUy5tYXRjaGVzLE0pO1BuKGIpLGJlKHtlcnJvcnM6e1tvZS5yb3V0ZS5pZF06en0sZmV0Y2hlcnM6bmV3IE1hcChTLmZldGNoZXJzKX0se2ZsdXNoU3luYzooRyYmRy5mbHVzaFN5bmMpPT09ITB9KX1mdW5jdGlvbiBzbihiKXtyZXR1cm4gdS52N19mZXRjaGVyUGVyc2lzdCYmKFouc2V0KGIsKFouZ2V0KGIpfHwwKSsxKSxuZS5oYXMoYikmJm5lLmRlbGV0ZShiKSksUy5mZXRjaGVycy5nZXQoYil8fEdEfWZ1bmN0aW9uIFBuKGIpe2xldCBNPVMuZmV0Y2hlcnMuZ2V0KGIpO0suaGFzKGIpJiYhKE0mJk0uc3RhdGU9PT0ibG9hZGluZyImJmsuaGFzKGIpKSYmZ3QoYiksSS5kZWxldGUoYiksay5kZWxldGUoYiksai5kZWxldGUoYiksbmUuZGVsZXRlKGIpLFMuZmV0Y2hlcnMuZGVsZXRlKGIpfWZ1bmN0aW9uIHFyKGIpe2lmKHUudjdfZmV0Y2hlclBlcnNpc3Qpe2xldCBNPShaLmdldChiKXx8MCktMTtNPD0wPyhaLmRlbGV0ZShiKSxuZS5hZGQoYikpOlouc2V0KGIsTSl9ZWxzZSBQbihiKTtiZSh7ZmV0Y2hlcnM6bmV3IE1hcChTLmZldGNoZXJzKX0pfWZ1bmN0aW9uIGd0KGIpe2xldCBNPUsuZ2V0KGIpO09lKE0sIkV4cGVjdGVkIGZldGNoIGNvbnRyb2xsZXI6ICIrYiksTS5hYm9ydCgpLEsuZGVsZXRlKGIpfWZ1bmN0aW9uIE5yKGIpe2ZvcihsZXQgTSBvZiBiKXtsZXQgej1zbihNKSxHPVBpKHouZGF0YSk7Uy5mZXRjaGVycy5zZXQoTSxHKX19ZnVuY3Rpb24gRW8oKXtsZXQgYj1bXSxNPSExO2ZvcihsZXQgeiBvZiBqKXtsZXQgRz1TLmZldGNoZXJzLmdldCh6KTtPZShHLCJFeHBlY3RlZCBmZXRjaGVyOiAiK3opLEcuc3RhdGU9PT0ibG9hZGluZyImJihqLmRlbGV0ZSh6KSxiLnB1c2goeiksTT0hMCl9cmV0dXJuIE5yKGIpLE19ZnVuY3Rpb24genMoYil7bGV0IE09W107Zm9yKGxldFt6LEddb2YgaylpZihHPGIpe2xldCBvZT1TLmZldGNoZXJzLmdldCh6KTtPZShvZSwiRXhwZWN0ZWQgZmV0Y2hlcjogIit6KSxvZS5zdGF0ZT09PSJsb2FkaW5nIiYmKGd0KHopLGsuZGVsZXRlKHopLE0ucHVzaCh6KSl9cmV0dXJuIE5yKE0pLE0ubGVuZ3RoPjB9ZnVuY3Rpb24gZiQoYixNKXtsZXQgej1TLmJsb2NrZXJzLmdldChiKXx8dGE7cmV0dXJuIHZlLmdldChiKSE9PU0mJnZlLnNldChiLE0pLHp9ZnVuY3Rpb24gcnkoYil7Uy5ibG9ja2Vycy5kZWxldGUoYiksdmUuZGVsZXRlKGIpfWZ1bmN0aW9uIEt1KGIsTSl7bGV0IHo9Uy5ibG9ja2Vycy5nZXQoYil8fHRhO09lKHouc3RhdGU9PT0idW5ibG9ja2VkIiYmTS5zdGF0ZT09PSJibG9ja2VkInx8ei5zdGF0ZT09PSJibG9ja2VkIiYmTS5zdGF0ZT09PSJibG9ja2VkInx8ei5zdGF0ZT09PSJibG9ja2VkIiYmTS5zdGF0ZT09PSJwcm9jZWVkaW5nInx8ei5zdGF0ZT09PSJibG9ja2VkIiYmTS5zdGF0ZT09PSJ1bmJsb2NrZWQifHx6LnN0YXRlPT09InByb2NlZWRpbmciJiZNLnN0YXRlPT09InVuYmxvY2tlZCIsIkludmFsaWQgYmxvY2tlciBzdGF0ZSB0cmFuc2l0aW9uOiAiK3ouc3RhdGUrIiAtPiAiK00uc3RhdGUpO2xldCBHPW5ldyBNYXAoUy5ibG9ja2Vycyk7Ry5zZXQoYixNKSxiZSh7YmxvY2tlcnM6R30pfWZ1bmN0aW9uIGl5KGIpe2xldHtjdXJyZW50TG9jYXRpb246TSxuZXh0TG9jYXRpb246eixoaXN0b3J5QWN0aW9uOkd9PWI7aWYodmUuc2l6ZT09PTApcmV0dXJuO3ZlLnNpemU+MSYmcmwoITEsIkEgcm91dGVyIG9ubHkgc3VwcG9ydHMgb25lIGJsb2NrZXIgYXQgYSB0aW1lIik7bGV0IG9lPUFycmF5LmZyb20odmUuZW50cmllcygpKSxbJGUsaGVdPW9lW29lLmxlbmd0aC0xXSxmZT1TLmJsb2NrZXJzLmdldCgkZSk7aWYoIShmZSYmZmUuc3RhdGU9PT0icHJvY2VlZGluZyIpJiZoZSh7Y3VycmVudExvY2F0aW9uOk0sbmV4dExvY2F0aW9uOnosaGlzdG9yeUFjdGlvbjpHfSkpcmV0dXJuICRlfWZ1bmN0aW9uIFFmKGIpe2xldCBNPVtdO3JldHVybiBrZS5mb3JFYWNoKCh6LEcpPT57KCFifHxiKEcpKSYmKHouY2FuY2VsKCksTS5wdXNoKEcpLGtlLmRlbGV0ZShHKSl9KSxNfWZ1bmN0aW9uIGgkKGIsTSx6KXtpZihmPWIsbT1NLGg9enx8bnVsbCwhZyYmUy5uYXZpZ2F0aW9uPT09R2gpe2c9ITA7bGV0IEc9bHkoUy5sb2NhdGlvbixTLm1hdGNoZXMpO0chPW51bGwmJmJlKHtyZXN0b3JlU2Nyb2xsUG9zaXRpb246R30pfXJldHVybigpPT57Zj1udWxsLG09bnVsbCxoPW51bGx9fWZ1bmN0aW9uIG95KGIsTSl7cmV0dXJuIGgmJmgoYixNLm1hcChHPT5FRChHLFMubG9hZGVyRGF0YSkpKXx8Yi5rZXl9ZnVuY3Rpb24gcCQoYixNKXtpZihmJiZtKXtsZXQgej1veShiLE0pO2Zbel09bSgpfX1mdW5jdGlvbiBseShiLE0pe2lmKGYpe2xldCB6PW95KGIsTSksRz1mW3pdO2lmKHR5cGVvZiBHPT0ibnVtYmVyIilyZXR1cm4gR31yZXR1cm4gbnVsbH1mdW5jdGlvbiBtJChiKXtvPXt9LHM9SG0oYixpLHZvaWQgMCxvKX1yZXR1cm4gXz17Z2V0IGJhc2VuYW1lKCl7cmV0dXJuIGF9LGdldCBzdGF0ZSgpe3JldHVybiBTfSxnZXQgcm91dGVzKCl7cmV0dXJuIGx9LGdldCB3aW5kb3coKXtyZXR1cm4gdH0saW5pdGlhbGl6ZTpGZSxzdWJzY3JpYmU6SWUsZW5hYmxlU2Nyb2xsUmVzdG9yYXRpb246aCQsbmF2aWdhdGU6U2UsZmV0Y2g6dXIscmV2YWxpZGF0ZTpEZSxjcmVhdGVIcmVmOmI9PmUuaGlzdG9yeS5jcmVhdGVIcmVmKGIpLGVuY29kZUxvY2F0aW9uOmI9PmUuaGlzdG9yeS5lbmNvZGVMb2NhdGlvbihiKSxnZXRGZXRjaGVyOnNuLGRlbGV0ZUZldGNoZXI6cXIsZGlzcG9zZTp0ZSxnZXRCbG9ja2VyOmYkLGRlbGV0ZUJsb2NrZXI6cnksX2ludGVybmFsRmV0Y2hDb250cm9sbGVyczpLLF9pbnRlcm5hbEFjdGl2ZURlZmVycmVkczprZSxfaW50ZXJuYWxTZXRSb3V0ZXM6bSR9LF99ZnVuY3Rpb24gUUQoZSl7cmV0dXJuIGUhPW51bGwmJigiZm9ybURhdGEiaW4gZSYmZS5mb3JtRGF0YSE9bnVsbHx8ImJvZHkiaW4gZSYmZS5ib2R5IT09dm9pZCAwKX1mdW5jdGlvbiBLbShlLHQsbixyLGksbyxsKXtsZXQgcyxhO2lmKG8pe3M9W107Zm9yKGxldCBjIG9mIHQpaWYocy5wdXNoKGMpLGMucm91dGUuaWQ9PT1vKXthPWM7YnJlYWt9fWVsc2Ugcz10LGE9dFt0Lmxlbmd0aC0xXTtsZXQgdT1BayhpfHwiLiIsUGsocyksSHUoZS5wYXRobmFtZSxuKXx8ZS5wYXRobmFtZSxsPT09InBhdGgiKTtyZXR1cm4gaT09bnVsbCYmKHUuc2VhcmNoPWUuc2VhcmNoLHUuaGFzaD1lLmhhc2gpLChpPT1udWxsfHxpPT09IiJ8fGk9PT0iLiIpJiZhJiZhLnJvdXRlLmluZGV4JiYhWXYodS5zZWFyY2gpJiYodS5zZWFyY2g9dS5zZWFyY2g/dS5zZWFyY2gucmVwbGFjZSgvXlw/LywiP2luZGV4JiIpOiI/aW5kZXgiKSxyJiZuIT09Ii8iJiYodS5wYXRobmFtZT11LnBhdGhuYW1lPT09Ii8iP246ZW8oW24sdS5wYXRobmFtZV0pKSxWdSh1KX1mdW5jdGlvbiBvXyhlLHQsbixyKXtpZighcnx8IVFEKHIpKXJldHVybntwYXRoOm59O2lmKHIuZm9ybU1ldGhvZCYmIWlMKHIuZm9ybU1ldGhvZCkpcmV0dXJue3BhdGg6bixlcnJvcjpHbig0MDUse21ldGhvZDpyLmZvcm1NZXRob2R9KX07bGV0IGk9KCk9Pih7cGF0aDpuLGVycm9yOkduKDQwMCx7dHlwZToiaW52YWxpZC1ib2R5In0pfSksbz1yLmZvcm1NZXRob2R8fCJnZXQiLGw9ZT9vLnRvVXBwZXJDYXNlKCk6by50b0xvd2VyQ2FzZSgpLHM9emsobik7aWYoci5ib2R5IT09dm9pZCAwKXtpZihyLmZvcm1FbmNUeXBlPT09InRleHQvcGxhaW4iKXtpZighdnIobCkpcmV0dXJuIGkoKTtsZXQgZj10eXBlb2Ygci5ib2R5PT0ic3RyaW5nIj9yLmJvZHk6ci5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGF8fHIuYm9keSBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcz9BcnJheS5mcm9tKHIuYm9keS5lbnRyaWVzKCkpLnJlZHVjZSgoaCxtKT0+e2xldFtnLHddPW07cmV0dXJuIiIraCtnKyI9Iit3K2AKYH0sIiIpOlN0cmluZyhyLmJvZHkpO3JldHVybntwYXRoOm4sc3VibWlzc2lvbjp7Zm9ybU1ldGhvZDpsLGZvcm1BY3Rpb246cyxmb3JtRW5jVHlwZTpyLmZvcm1FbmNUeXBlLGZvcm1EYXRhOnZvaWQgMCxqc29uOnZvaWQgMCx0ZXh0OmZ9fX1lbHNlIGlmKHIuZm9ybUVuY1R5cGU9PT0iYXBwbGljYXRpb24vanNvbiIpe2lmKCF2cihsKSlyZXR1cm4gaSgpO3RyeXtsZXQgZj10eXBlb2Ygci5ib2R5PT0ic3RyaW5nIj9KU09OLnBhcnNlKHIuYm9keSk6ci5ib2R5O3JldHVybntwYXRoOm4sc3VibWlzc2lvbjp7Zm9ybU1ldGhvZDpsLGZvcm1BY3Rpb246cyxmb3JtRW5jVHlwZTpyLmZvcm1FbmNUeXBlLGZvcm1EYXRhOnZvaWQgMCxqc29uOmYsdGV4dDp2b2lkIDB9fX1jYXRjaHtyZXR1cm4gaSgpfX19T2UodHlwZW9mIEZvcm1EYXRhPT0iZnVuY3Rpb24iLCJGb3JtRGF0YSBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQiKTtsZXQgYSx1O2lmKHIuZm9ybURhdGEpYT1abShyLmZvcm1EYXRhKSx1PXIuZm9ybURhdGE7ZWxzZSBpZihyLmJvZHkgaW5zdGFuY2VvZiBGb3JtRGF0YSlhPVptKHIuYm9keSksdT1yLmJvZHk7ZWxzZSBpZihyLmJvZHkgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMpYT1yLmJvZHksdT11XyhhKTtlbHNlIGlmKHIuYm9keT09bnVsbClhPW5ldyBVUkxTZWFyY2hQYXJhbXMsdT1uZXcgRm9ybURhdGE7ZWxzZSB0cnl7YT1uZXcgVVJMU2VhcmNoUGFyYW1zKHIuYm9keSksdT11XyhhKX1jYXRjaHtyZXR1cm4gaSgpfWxldCBjPXtmb3JtTWV0aG9kOmwsZm9ybUFjdGlvbjpzLGZvcm1FbmNUeXBlOnImJnIuZm9ybUVuY1R5cGV8fCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLGZvcm1EYXRhOnUsanNvbjp2b2lkIDAsdGV4dDp2b2lkIDB9O2lmKHZyKGMuZm9ybU1ldGhvZCkpcmV0dXJue3BhdGg6bixzdWJtaXNzaW9uOmN9O2xldCBkPWtpKG4pO3JldHVybiB0JiZkLnNlYXJjaCYmWXYoZC5zZWFyY2gpJiZhLmFwcGVuZCgiaW5kZXgiLCIiKSxkLnNlYXJjaD0iPyIrYSx7cGF0aDpWdShkKSxzdWJtaXNzaW9uOmN9fWZ1bmN0aW9uIEpEKGUsdCl7bGV0IG49ZTtpZih0KXtsZXQgcj1lLmZpbmRJbmRleChpPT5pLnJvdXRlLmlkPT09dCk7cj49MCYmKG49ZS5zbGljZSgwLHIpKX1yZXR1cm4gbn1mdW5jdGlvbiBsXyhlLHQsbixyLGksbyxsLHMsYSx1LGMsZCxmLGgsbSl7bGV0IGc9bT9PYmplY3QudmFsdWVzKG0pWzBdOmg/T2JqZWN0LnZhbHVlcyhoKVswXTp2b2lkIDAsdz1lLmNyZWF0ZVVSTCh0LmxvY2F0aW9uKSx2PWUuY3JlYXRlVVJMKGkpLHk9bT9PYmplY3Qua2V5cyhtKVswXTp2b2lkIDAsUz1KRChuLHkpLmZpbHRlcigoJCxDKT0+e2lmKCQucm91dGUubGF6eSlyZXR1cm4hMDtpZigkLnJvdXRlLmxvYWRlcj09bnVsbClyZXR1cm4hMTtpZihxRCh0LmxvYWRlckRhdGEsdC5tYXRjaGVzW0NdLCQpfHxsLnNvbWUoUj0+Uj09PSQucm91dGUuaWQpKXJldHVybiEwO2xldCBUPXQubWF0Y2hlc1tDXSxOPSQ7cmV0dXJuIHNfKCQseXQoe2N1cnJlbnRVcmw6dyxjdXJyZW50UGFyYW1zOlQucGFyYW1zLG5leHRVcmw6dixuZXh0UGFyYW1zOk4ucGFyYW1zfSxyLHthY3Rpb25SZXN1bHQ6ZyxkZWZhdWx0U2hvdWxkUmV2YWxpZGF0ZTpvfHx3LnBhdGhuYW1lK3cuc2VhcmNoPT09di5wYXRobmFtZSt2LnNlYXJjaHx8dy5zZWFyY2ghPT12LnNlYXJjaHx8amsoVCxOKX0pKX0pLEU9W107cmV0dXJuIHUuZm9yRWFjaCgoJCxDKT0+e2lmKCFuLnNvbWUoRj0+Ri5yb3V0ZS5pZD09PSQucm91dGVJZCl8fGEuaGFzKEMpKXJldHVybjtsZXQgVD1VbChkLCQucGF0aCxmKTtpZighVCl7RS5wdXNoKHtrZXk6Qyxyb3V0ZUlkOiQucm91dGVJZCxwYXRoOiQucGF0aCxtYXRjaGVzOm51bGwsbWF0Y2g6bnVsbCxjb250cm9sbGVyOm51bGx9KTtyZXR1cm59bGV0IE49dC5mZXRjaGVycy5nZXQoQyksUj1HbShULCQucGF0aCksRD0hMTtjLmhhcyhDKT9EPSExOnMuaW5jbHVkZXMoQyk/RD0hMDpOJiZOLnN0YXRlIT09ImlkbGUiJiZOLmRhdGE9PT12b2lkIDA/RD1vOkQ9c18oUix5dCh7Y3VycmVudFVybDp3LGN1cnJlbnRQYXJhbXM6dC5tYXRjaGVzW3QubWF0Y2hlcy5sZW5ndGgtMV0ucGFyYW1zLG5leHRVcmw6dixuZXh0UGFyYW1zOm5bbi5sZW5ndGgtMV0ucGFyYW1zfSxyLHthY3Rpb25SZXN1bHQ6ZyxkZWZhdWx0U2hvdWxkUmV2YWxpZGF0ZTpvfSkpLEQmJkUucHVzaCh7a2V5OkMscm91dGVJZDokLnJvdXRlSWQscGF0aDokLnBhdGgsbWF0Y2hlczpULG1hdGNoOlIsY29udHJvbGxlcjpuZXcgQWJvcnRDb250cm9sbGVyfSl9KSxbUyxFXX1mdW5jdGlvbiBxRChlLHQsbil7bGV0IHI9IXR8fG4ucm91dGUuaWQhPT10LnJvdXRlLmlkLGk9ZVtuLnJvdXRlLmlkXT09PXZvaWQgMDtyZXR1cm4gcnx8aX1mdW5jdGlvbiBqayhlLHQpe2xldCBuPWUucm91dGUucGF0aDtyZXR1cm4gZS5wYXRobmFtZSE9PXQucGF0aG5hbWV8fG4hPW51bGwmJm4uZW5kc1dpdGgoIioiKSYmZS5wYXJhbXNbIioiXSE9PXQucGFyYW1zWyIqIl19ZnVuY3Rpb24gc18oZSx0KXtpZihlLnJvdXRlLnNob3VsZFJldmFsaWRhdGUpe2xldCBuPWUucm91dGUuc2hvdWxkUmV2YWxpZGF0ZSh0KTtpZih0eXBlb2Ygbj09ImJvb2xlYW4iKXJldHVybiBufXJldHVybiB0LmRlZmF1bHRTaG91bGRSZXZhbGlkYXRlfWFzeW5jIGZ1bmN0aW9uIGFfKGUsdCxuKXtpZighZS5sYXp5KXJldHVybjtsZXQgcj1hd2FpdCBlLmxhenkoKTtpZighZS5sYXp5KXJldHVybjtsZXQgaT1uW2UuaWRdO09lKGksIk5vIHJvdXRlIGZvdW5kIGluIG1hbmlmZXN0Iik7bGV0IG89e307Zm9yKGxldCBsIGluIHIpe2xldCBhPWlbbF0hPT12b2lkIDAmJmwhPT0iaGFzRXJyb3JCb3VuZGFyeSI7cmwoIWEsJ1JvdXRlICInK2kuaWQrJyIgaGFzIGEgc3RhdGljIHByb3BlcnR5ICInK2wrJyIgZGVmaW5lZCBidXQgaXRzIGxhenkgZnVuY3Rpb24gaXMgYWxzbyByZXR1cm5pbmcgYSB2YWx1ZSBmb3IgdGhpcyBwcm9wZXJ0eS4gJysoJ1RoZSBsYXp5IHJvdXRlIHByb3BlcnR5ICInK2wrJyIgd2lsbCBiZSBpZ25vcmVkLicpKSwhYSYmIXdELmhhcyhsKSYmKG9bbF09cltsXSl9T2JqZWN0LmFzc2lnbihpLG8pLE9iamVjdC5hc3NpZ24oaSx5dCh7fSx0KGkpLHtsYXp5OnZvaWQgMH0pKX1hc3luYyBmdW5jdGlvbiBuYShlLHQsbixyLGksbyxsLHMpe3M9PT12b2lkIDAmJihzPXt9KTtsZXQgYSx1LGMsZD1tPT57bGV0IGcsdz1uZXcgUHJvbWlzZSgodix5KT0+Zz15KTtyZXR1cm4gYz0oKT0+ZygpLHQuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixjKSxQcm9taXNlLnJhY2UoW20oe3JlcXVlc3Q6dCxwYXJhbXM6bi5wYXJhbXMsY29udGV4dDpzLnJlcXVlc3RDb250ZXh0fSksd10pfTt0cnl7bGV0IG09bi5yb3V0ZVtlXTtpZihuLnJvdXRlLmxhenkpaWYobSl7bGV0IGcsdz1hd2FpdCBQcm9taXNlLmFsbChbZChtKS5jYXRjaCh2PT57Zz12fSksYV8obi5yb3V0ZSxvLGkpXSk7aWYoZyl0aHJvdyBnO3U9d1swXX1lbHNlIGlmKGF3YWl0IGFfKG4ucm91dGUsbyxpKSxtPW4ucm91dGVbZV0sbSl1PWF3YWl0IGQobSk7ZWxzZSBpZihlPT09ImFjdGlvbiIpe2xldCBnPW5ldyBVUkwodC51cmwpLHc9Zy5wYXRobmFtZStnLnNlYXJjaDt0aHJvdyBHbig0MDUse21ldGhvZDp0Lm1ldGhvZCxwYXRobmFtZTp3LHJvdXRlSWQ6bi5yb3V0ZS5pZH0pfWVsc2UgcmV0dXJue3R5cGU6U3QuZGF0YSxkYXRhOnZvaWQgMH07ZWxzZSBpZihtKXU9YXdhaXQgZChtKTtlbHNle2xldCBnPW5ldyBVUkwodC51cmwpLHc9Zy5wYXRobmFtZStnLnNlYXJjaDt0aHJvdyBHbig0MDQse3BhdGhuYW1lOnd9KX1PZSh1IT09dm9pZCAwLCJZb3UgZGVmaW5lZCAiKyhlPT09ImFjdGlvbiI/ImFuIGFjdGlvbiI6ImEgbG9hZGVyIikrIiBmb3Igcm91dGUgIisoJyInK24ucm91dGUuaWQrIlwiIGJ1dCBkaWRuJ3QgcmV0dXJuIGFueXRoaW5nIGZyb20geW91ciBgIitlKyJgICIpKyJmdW5jdGlvbi4gUGxlYXNlIHJldHVybiBhIHZhbHVlIG9yIGBudWxsYC4iKX1jYXRjaChtKXthPVN0LmVycm9yLHU9bX1maW5hbGx5e2MmJnQuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixjKX1pZihyTCh1KSl7bGV0IG09dS5zdGF0dXM7aWYoS0QuaGFzKG0pKXtsZXQgdj11LmhlYWRlcnMuZ2V0KCJMb2NhdGlvbiIpO2lmKE9lKHYsIlJlZGlyZWN0cyByZXR1cm5lZC90aHJvd24gZnJvbSBsb2FkZXJzL2FjdGlvbnMgbXVzdCBoYXZlIGEgTG9jYXRpb24gaGVhZGVyIiksIUxrLnRlc3Qodikpdj1LbShuZXcgVVJMKHQudXJsKSxyLnNsaWNlKDAsci5pbmRleE9mKG4pKzEpLGwsITAsdik7ZWxzZSBpZighcy5pc1N0YXRpY1JlcXVlc3Qpe2xldCB5PW5ldyBVUkwodC51cmwpLF89di5zdGFydHNXaXRoKCIvLyIpP25ldyBVUkwoeS5wcm90b2NvbCt2KTpuZXcgVVJMKHYpLFM9SHUoXy5wYXRobmFtZSxsKSE9bnVsbDtfLm9yaWdpbj09PXkub3JpZ2luJiZTJiYodj1fLnBhdGhuYW1lK18uc2VhcmNoK18uaGFzaCl9aWYocy5pc1N0YXRpY1JlcXVlc3QpdGhyb3cgdS5oZWFkZXJzLnNldCgiTG9jYXRpb24iLHYpLHU7cmV0dXJue3R5cGU6U3QucmVkaXJlY3Qsc3RhdHVzOm0sbG9jYXRpb246dixyZXZhbGlkYXRlOnUuaGVhZGVycy5nZXQoIlgtUmVtaXgtUmV2YWxpZGF0ZSIpIT09bnVsbCxyZWxvYWREb2N1bWVudDp1LmhlYWRlcnMuZ2V0KCJYLVJlbWl4LVJlbG9hZC1Eb2N1bWVudCIpIT09bnVsbH19aWYocy5pc1JvdXRlUmVxdWVzdCl0aHJvd3t0eXBlOmE9PT1TdC5lcnJvcj9TdC5lcnJvcjpTdC5kYXRhLHJlc3BvbnNlOnV9O2xldCBnLHc9dS5oZWFkZXJzLmdldCgiQ29udGVudC1UeXBlIik7cmV0dXJuIHcmJi9cYmFwcGxpY2F0aW9uXC9qc29uXGIvLnRlc3Qodyk/Zz1hd2FpdCB1Lmpzb24oKTpnPWF3YWl0IHUudGV4dCgpLGE9PT1TdC5lcnJvcj97dHlwZTphLGVycm9yOm5ldyBHdihtLHUuc3RhdHVzVGV4dCxnKSxoZWFkZXJzOnUuaGVhZGVyc306e3R5cGU6U3QuZGF0YSxkYXRhOmcsc3RhdHVzQ29kZTp1LnN0YXR1cyxoZWFkZXJzOnUuaGVhZGVyc319aWYoYT09PVN0LmVycm9yKXJldHVybnt0eXBlOmEsZXJyb3I6dX07aWYobkwodSkpe3ZhciBmLGg7cmV0dXJue3R5cGU6U3QuZGVmZXJyZWQsZGVmZXJyZWREYXRhOnUsc3RhdHVzQ29kZTooZj11LmluaXQpPT1udWxsP3ZvaWQgMDpmLnN0YXR1cyxoZWFkZXJzOigoaD11LmluaXQpPT1udWxsP3ZvaWQgMDpoLmhlYWRlcnMpJiZuZXcgSGVhZGVycyh1LmluaXQuaGVhZGVycyl9fXJldHVybnt0eXBlOlN0LmRhdGEsZGF0YTp1fX1mdW5jdGlvbiByYShlLHQsbixyKXtsZXQgaT1lLmNyZWF0ZVVSTCh6ayh0KSkudG9TdHJpbmcoKSxvPXtzaWduYWw6bn07aWYociYmdnIoci5mb3JtTWV0aG9kKSl7bGV0e2Zvcm1NZXRob2Q6bCxmb3JtRW5jVHlwZTpzfT1yO28ubWV0aG9kPWwudG9VcHBlckNhc2UoKSxzPT09ImFwcGxpY2F0aW9uL2pzb24iPyhvLmhlYWRlcnM9bmV3IEhlYWRlcnMoeyJDb250ZW50LVR5cGUiOnN9KSxvLmJvZHk9SlNPTi5zdHJpbmdpZnkoci5qc29uKSk6cz09PSJ0ZXh0L3BsYWluIj9vLmJvZHk9ci50ZXh0OnM9PT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiYmci5mb3JtRGF0YT9vLmJvZHk9Wm0oci5mb3JtRGF0YSk6by5ib2R5PXIuZm9ybURhdGF9cmV0dXJuIG5ldyBSZXF1ZXN0KGksbyl9ZnVuY3Rpb24gWm0oZSl7bGV0IHQ9bmV3IFVSTFNlYXJjaFBhcmFtcztmb3IobGV0W24scl1vZiBlLmVudHJpZXMoKSl0LmFwcGVuZChuLHR5cGVvZiByPT0ic3RyaW5nIj9yOnIubmFtZSk7cmV0dXJuIHR9ZnVuY3Rpb24gdV8oZSl7bGV0IHQ9bmV3IEZvcm1EYXRhO2ZvcihsZXRbbixyXW9mIGUuZW50cmllcygpKXQuYXBwZW5kKG4scik7cmV0dXJuIHR9ZnVuY3Rpb24gZUwoZSx0LG4scixpKXtsZXQgbz17fSxsPW51bGwscyxhPSExLHU9e307cmV0dXJuIG4uZm9yRWFjaCgoYyxkKT0+e2xldCBmPXRbZF0ucm91dGUuaWQ7aWYoT2UoIWVzKGMpLCJDYW5ub3QgaGFuZGxlIHJlZGlyZWN0IHJlc3VsdHMgaW4gcHJvY2Vzc0xvYWRlckRhdGEiKSxEYShjKSl7bGV0IGg9TWEoZSxmKSxtPWMuZXJyb3I7ciYmKG09T2JqZWN0LnZhbHVlcyhyKVswXSxyPXZvaWQgMCksbD1sfHx7fSxsW2gucm91dGUuaWRdPT1udWxsJiYobFtoLnJvdXRlLmlkXT1tKSxvW2ZdPXZvaWQgMCxhfHwoYT0hMCxzPU1rKGMuZXJyb3IpP2MuZXJyb3Iuc3RhdHVzOjUwMCksYy5oZWFkZXJzJiYodVtmXT1jLmhlYWRlcnMpfWVsc2UgRG8oYyk/KGkuc2V0KGYsYy5kZWZlcnJlZERhdGEpLG9bZl09Yy5kZWZlcnJlZERhdGEuZGF0YSk6b1tmXT1jLmRhdGEsYy5zdGF0dXNDb2RlIT1udWxsJiZjLnN0YXR1c0NvZGUhPT0yMDAmJiFhJiYocz1jLnN0YXR1c0NvZGUpLGMuaGVhZGVycyYmKHVbZl09Yy5oZWFkZXJzKX0pLHImJihsPXIsb1tPYmplY3Qua2V5cyhyKVswXV09dm9pZCAwKSx7bG9hZGVyRGF0YTpvLGVycm9yczpsLHN0YXR1c0NvZGU6c3x8MjAwLGxvYWRlckhlYWRlcnM6dX19ZnVuY3Rpb24gY18oZSx0LG4scixpLG8sbCxzKXtsZXR7bG9hZGVyRGF0YTphLGVycm9yczp1fT1lTCh0LG4scixpLHMpO2ZvcihsZXQgYz0wO2M8by5sZW5ndGg7YysrKXtsZXR7a2V5OmQsbWF0Y2g6Zixjb250cm9sbGVyOmh9PW9bY107T2UobCE9PXZvaWQgMCYmbFtjXSE9PXZvaWQgMCwiRGlkIG5vdCBmaW5kIGNvcnJlc3BvbmRpbmcgZmV0Y2hlciByZXN1bHQiKTtsZXQgbT1sW2NdO2lmKCEoaCYmaC5zaWduYWwuYWJvcnRlZCkpaWYoRGEobSkpe2xldCBnPU1hKGUubWF0Y2hlcyxmPT1udWxsP3ZvaWQgMDpmLnJvdXRlLmlkKTt1JiZ1W2cucm91dGUuaWRdfHwodT15dCh7fSx1LHtbZy5yb3V0ZS5pZF06bS5lcnJvcn0pKSxlLmZldGNoZXJzLmRlbGV0ZShkKX1lbHNlIGlmKGVzKG0pKU9lKCExLCJVbmhhbmRsZWQgZmV0Y2hlciByZXZhbGlkYXRpb24gcmVkaXJlY3QiKTtlbHNlIGlmKERvKG0pKU9lKCExLCJVbmhhbmRsZWQgZmV0Y2hlciBkZWZlcnJlZCBkYXRhIik7ZWxzZXtsZXQgZz1QaShtLmRhdGEpO2UuZmV0Y2hlcnMuc2V0KGQsZyl9fXJldHVybntsb2FkZXJEYXRhOmEsZXJyb3JzOnV9fWZ1bmN0aW9uIGRfKGUsdCxuLHIpe2xldCBpPXl0KHt9LHQpO2ZvcihsZXQgbyBvZiBuKXtsZXQgbD1vLnJvdXRlLmlkO2lmKHQuaGFzT3duUHJvcGVydHkobCk/dFtsXSE9PXZvaWQgMCYmKGlbbF09dFtsXSk6ZVtsXSE9PXZvaWQgMCYmby5yb3V0ZS5sb2FkZXImJihpW2xdPWVbbF0pLHImJnIuaGFzT3duUHJvcGVydHkobCkpYnJlYWt9cmV0dXJuIGl9ZnVuY3Rpb24gTWEoZSx0KXtyZXR1cm4odD9lLnNsaWNlKDAsZS5maW5kSW5kZXgocj0+ci5yb3V0ZS5pZD09PXQpKzEpOlsuLi5lXSkucmV2ZXJzZSgpLmZpbmQocj0+ci5yb3V0ZS5oYXNFcnJvckJvdW5kYXJ5PT09ITApfHxlWzBdfWZ1bmN0aW9uIGZfKGUpe2xldCB0PWUubGVuZ3RoPT09MT9lWzBdOmUuZmluZChuPT5uLmluZGV4fHwhbi5wYXRofHxuLnBhdGg9PT0iLyIpfHx7aWQ6Il9fc2hpbS1lcnJvci1yb3V0ZV9fIn07cmV0dXJue21hdGNoZXM6W3twYXJhbXM6e30scGF0aG5hbWU6IiIscGF0aG5hbWVCYXNlOiIiLHJvdXRlOnR9XSxyb3V0ZTp0fX1mdW5jdGlvbiBHbihlLHQpe2xldHtwYXRobmFtZTpuLHJvdXRlSWQ6cixtZXRob2Q6aSx0eXBlOm99PXQ9PT12b2lkIDA/e306dCxsPSJVbmtub3duIFNlcnZlciBFcnJvciIscz0iVW5rbm93biBAcmVtaXgtcnVuL3JvdXRlciBlcnJvciI7cmV0dXJuIGU9PT00MDA/KGw9IkJhZCBSZXF1ZXN0IixpJiZuJiZyP3M9IllvdSBtYWRlIGEgIitpKycgcmVxdWVzdCB0byAiJytuKyciIGJ1dCAnKygnZGlkIG5vdCBwcm92aWRlIGEgYGxvYWRlcmAgZm9yIHJvdXRlICInK3IrJyIsICcpKyJzbyB0aGVyZSBpcyBubyB3YXkgdG8gaGFuZGxlIHRoZSByZXF1ZXN0LiI6bz09PSJkZWZlci1hY3Rpb24iP3M9ImRlZmVyKCkgaXMgbm90IHN1cHBvcnRlZCBpbiBhY3Rpb25zIjpvPT09ImludmFsaWQtYm9keSImJihzPSJVbmFibGUgdG8gZW5jb2RlIHN1Ym1pc3Npb24gYm9keSIpKTplPT09NDAzPyhsPSJGb3JiaWRkZW4iLHM9J1JvdXRlICInK3IrJyIgZG9lcyBub3QgbWF0Y2ggVVJMICInK24rJyInKTplPT09NDA0PyhsPSJOb3QgRm91bmQiLHM9J05vIHJvdXRlIG1hdGNoZXMgVVJMICInK24rJyInKTplPT09NDA1JiYobD0iTWV0aG9kIE5vdCBBbGxvd2VkIixpJiZuJiZyP3M9IllvdSBtYWRlIGEgIitpLnRvVXBwZXJDYXNlKCkrJyByZXF1ZXN0IHRvICInK24rJyIgYnV0ICcrKCdkaWQgbm90IHByb3ZpZGUgYW4gYGFjdGlvbmAgZm9yIHJvdXRlICInK3IrJyIsICcpKyJzbyB0aGVyZSBpcyBubyB3YXkgdG8gaGFuZGxlIHRoZSByZXF1ZXN0LiI6aSYmKHM9J0ludmFsaWQgcmVxdWVzdCBtZXRob2QgIicraS50b1VwcGVyQ2FzZSgpKyciJykpLG5ldyBHdihlfHw1MDAsbCxuZXcgRXJyb3IocyksITApfWZ1bmN0aW9uIGhfKGUpe2ZvcihsZXQgdD1lLmxlbmd0aC0xO3Q+PTA7dC0tKXtsZXQgbj1lW3RdO2lmKGVzKG4pKXJldHVybntyZXN1bHQ6bixpZHg6dH19fWZ1bmN0aW9uIHprKGUpe2xldCB0PXR5cGVvZiBlPT0ic3RyaW5nIj9raShlKTplO3JldHVybiBWdSh5dCh7fSx0LHtoYXNoOiIifSkpfWZ1bmN0aW9uIHRMKGUsdCl7cmV0dXJuIGUucGF0aG5hbWUhPT10LnBhdGhuYW1lfHxlLnNlYXJjaCE9PXQuc2VhcmNoPyExOmUuaGFzaD09PSIiP3QuaGFzaCE9PSIiOmUuaGFzaD09PXQuaGFzaD8hMDp0Lmhhc2ghPT0iIn1mdW5jdGlvbiBEbyhlKXtyZXR1cm4gZS50eXBlPT09U3QuZGVmZXJyZWR9ZnVuY3Rpb24gRGEoZSl7cmV0dXJuIGUudHlwZT09PVN0LmVycm9yfWZ1bmN0aW9uIGVzKGUpe3JldHVybihlJiZlLnR5cGUpPT09U3QucmVkaXJlY3R9ZnVuY3Rpb24gbkwoZSl7bGV0IHQ9ZTtyZXR1cm4gdCYmdHlwZW9mIHQ9PSJvYmplY3QiJiZ0eXBlb2YgdC5kYXRhPT0ib2JqZWN0IiYmdHlwZW9mIHQuc3Vic2NyaWJlPT0iZnVuY3Rpb24iJiZ0eXBlb2YgdC5jYW5jZWw9PSJmdW5jdGlvbiImJnR5cGVvZiB0LnJlc29sdmVEYXRhPT0iZnVuY3Rpb24ifWZ1bmN0aW9uIHJMKGUpe3JldHVybiBlIT1udWxsJiZ0eXBlb2YgZS5zdGF0dXM9PSJudW1iZXIiJiZ0eXBlb2YgZS5zdGF0dXNUZXh0PT0ic3RyaW5nIiYmdHlwZW9mIGUuaGVhZGVycz09Im9iamVjdCImJnR5cGVvZiBlLmJvZHk8InUifWZ1bmN0aW9uIGlMKGUpe3JldHVybiBIRC5oYXMoZS50b0xvd2VyQ2FzZSgpKX1mdW5jdGlvbiB2cihlKXtyZXR1cm4gV0QuaGFzKGUudG9Mb3dlckNhc2UoKSl9YXN5bmMgZnVuY3Rpb24gcF8oZSx0LG4scixpLG8pe2ZvcihsZXQgbD0wO2w8bi5sZW5ndGg7bCsrKXtsZXQgcz1uW2xdLGE9dFtsXTtpZighYSljb250aW51ZTtsZXQgdT1lLmZpbmQoZD0+ZC5yb3V0ZS5pZD09PWEucm91dGUuaWQpLGM9dSE9bnVsbCYmIWprKHUsYSkmJihvJiZvW2Eucm91dGUuaWRdKSE9PXZvaWQgMDtpZihEbyhzKSYmKGl8fGMpKXtsZXQgZD1yW2xdO09lKGQsIkV4cGVjdGVkIGFuIEFib3J0U2lnbmFsIGZvciByZXZhbGlkYXRpbmcgZmV0Y2hlciBkZWZlcnJlZCByZXN1bHQiKSxhd2FpdCBGayhzLGQsaSkudGhlbihmPT57ZiYmKG5bbF09Znx8bltsXSl9KX19fWFzeW5jIGZ1bmN0aW9uIEZrKGUsdCxuKXtpZihuPT09dm9pZCAwJiYobj0hMSksIWF3YWl0IGUuZGVmZXJyZWREYXRhLnJlc29sdmVEYXRhKHQpKXtpZihuKXRyeXtyZXR1cm57dHlwZTpTdC5kYXRhLGRhdGE6ZS5kZWZlcnJlZERhdGEudW53cmFwcGVkRGF0YX19Y2F0Y2goaSl7cmV0dXJue3R5cGU6U3QuZXJyb3IsZXJyb3I6aX19cmV0dXJue3R5cGU6U3QuZGF0YSxkYXRhOmUuZGVmZXJyZWREYXRhLmRhdGF9fX1mdW5jdGlvbiBZdihlKXtyZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtcyhlKS5nZXRBbGwoImluZGV4Iikuc29tZSh0PT50PT09IiIpfWZ1bmN0aW9uIEdtKGUsdCl7bGV0IG49dHlwZW9mIHQ9PSJzdHJpbmciP2tpKHQpLnNlYXJjaDp0LnNlYXJjaDtpZihlW2UubGVuZ3RoLTFdLnJvdXRlLmluZGV4JiZZdihufHwiIikpcmV0dXJuIGVbZS5sZW5ndGgtMV07bGV0IHI9T2soZSk7cmV0dXJuIHJbci5sZW5ndGgtMV19ZnVuY3Rpb24gbV8oZSl7bGV0e2Zvcm1NZXRob2Q6dCxmb3JtQWN0aW9uOm4sZm9ybUVuY1R5cGU6cix0ZXh0OmksZm9ybURhdGE6byxqc29uOmx9PWU7aWYoISghdHx8IW58fCFyKSl7aWYoaSE9bnVsbClyZXR1cm57Zm9ybU1ldGhvZDp0LGZvcm1BY3Rpb246bixmb3JtRW5jVHlwZTpyLGZvcm1EYXRhOnZvaWQgMCxqc29uOnZvaWQgMCx0ZXh0Oml9O2lmKG8hPW51bGwpcmV0dXJue2Zvcm1NZXRob2Q6dCxmb3JtQWN0aW9uOm4sZm9ybUVuY1R5cGU6cixmb3JtRGF0YTpvLGpzb246dm9pZCAwLHRleHQ6dm9pZCAwfTtpZihsIT09dm9pZCAwKXJldHVybntmb3JtTWV0aG9kOnQsZm9ybUFjdGlvbjpuLGZvcm1FbmNUeXBlOnIsZm9ybURhdGE6dm9pZCAwLGpzb246bCx0ZXh0OnZvaWQgMH19fWZ1bmN0aW9uIFloKGUsdCl7cmV0dXJuIHQ/e3N0YXRlOiJsb2FkaW5nIixsb2NhdGlvbjplLGZvcm1NZXRob2Q6dC5mb3JtTWV0aG9kLGZvcm1BY3Rpb246dC5mb3JtQWN0aW9uLGZvcm1FbmNUeXBlOnQuZm9ybUVuY1R5cGUsZm9ybURhdGE6dC5mb3JtRGF0YSxqc29uOnQuanNvbix0ZXh0OnQudGV4dH06e3N0YXRlOiJsb2FkaW5nIixsb2NhdGlvbjplLGZvcm1NZXRob2Q6dm9pZCAwLGZvcm1BY3Rpb246dm9pZCAwLGZvcm1FbmNUeXBlOnZvaWQgMCxmb3JtRGF0YTp2b2lkIDAsanNvbjp2b2lkIDAsdGV4dDp2b2lkIDB9fWZ1bmN0aW9uIG9MKGUsdCl7cmV0dXJue3N0YXRlOiJzdWJtaXR0aW5nIixsb2NhdGlvbjplLGZvcm1NZXRob2Q6dC5mb3JtTWV0aG9kLGZvcm1BY3Rpb246dC5mb3JtQWN0aW9uLGZvcm1FbmNUeXBlOnQuZm9ybUVuY1R5cGUsZm9ybURhdGE6dC5mb3JtRGF0YSxqc29uOnQuanNvbix0ZXh0OnQudGV4dH19ZnVuY3Rpb24gaWEoZSx0KXtyZXR1cm4gZT97c3RhdGU6ImxvYWRpbmciLGZvcm1NZXRob2Q6ZS5mb3JtTWV0aG9kLGZvcm1BY3Rpb246ZS5mb3JtQWN0aW9uLGZvcm1FbmNUeXBlOmUuZm9ybUVuY1R5cGUsZm9ybURhdGE6ZS5mb3JtRGF0YSxqc29uOmUuanNvbix0ZXh0OmUudGV4dCxkYXRhOnR9OntzdGF0ZToibG9hZGluZyIsZm9ybU1ldGhvZDp2b2lkIDAsZm9ybUFjdGlvbjp2b2lkIDAsZm9ybUVuY1R5cGU6dm9pZCAwLGZvcm1EYXRhOnZvaWQgMCxqc29uOnZvaWQgMCx0ZXh0OnZvaWQgMCxkYXRhOnR9fWZ1bmN0aW9uIGxMKGUsdCl7cmV0dXJue3N0YXRlOiJzdWJtaXR0aW5nIixmb3JtTWV0aG9kOmUuZm9ybU1ldGhvZCxmb3JtQWN0aW9uOmUuZm9ybUFjdGlvbixmb3JtRW5jVHlwZTplLmZvcm1FbmNUeXBlLGZvcm1EYXRhOmUuZm9ybURhdGEsanNvbjplLmpzb24sdGV4dDplLnRleHQsZGF0YTp0P3QuZGF0YTp2b2lkIDB9fWZ1bmN0aW9uIFBpKGUpe3JldHVybntzdGF0ZToiaWRsZSIsZm9ybU1ldGhvZDp2b2lkIDAsZm9ybUFjdGlvbjp2b2lkIDAsZm9ybUVuY1R5cGU6dm9pZCAwLGZvcm1EYXRhOnZvaWQgMCxqc29uOnZvaWQgMCx0ZXh0OnZvaWQgMCxkYXRhOmV9fWZ1bmN0aW9uIHNMKGUsdCl7dHJ5e2xldCBuPWUuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShJayk7aWYobil7bGV0IHI9SlNPTi5wYXJzZShuKTtmb3IobGV0W2ksb11vZiBPYmplY3QuZW50cmllcyhyfHx7fSkpbyYmQXJyYXkuaXNBcnJheShvKSYmdC5zZXQoaSxuZXcgU2V0KG98fFtdKSl9fWNhdGNoe319ZnVuY3Rpb24gYUwoZSx0KXtpZih0LnNpemU+MCl7bGV0IG49e307Zm9yKGxldFtyLGldb2YgdCluW3JdPVsuLi5pXTt0cnl7ZS5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKElrLEpTT04uc3RyaW5naWZ5KG4pKX1jYXRjaChyKXtybCghMSwiRmFpbGVkIHRvIHNhdmUgYXBwbGllZCB2aWV3IHRyYW5zaXRpb25zIGluIHNlc3Npb25TdG9yYWdlICgiK3IrIikuIil9fX0vKioKICogUmVhY3QgUm91dGVyIHY2LjIwLjAKICoKICogQ29weXJpZ2h0IChjKSBSZW1peCBTb2Z0d2FyZSBJbmMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFLm1kIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqCiAqIEBsaWNlbnNlIE1JVAogKi9mdW5jdGlvbiBxZCgpe3JldHVybiBxZD1PYmplY3QuYXNzaWduP09iamVjdC5hc3NpZ24uYmluZCgpOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9LHFkLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1jb25zdCBIZj1wLmNyZWF0ZUNvbnRleHQobnVsbCksQms9cC5jcmVhdGVDb250ZXh0KG51bGwpLEtmPXAuY3JlYXRlQ29udGV4dChudWxsKSxaZj1wLmNyZWF0ZUNvbnRleHQobnVsbCksZmw9cC5jcmVhdGVDb250ZXh0KHtvdXRsZXQ6bnVsbCxtYXRjaGVzOltdLGlzRGF0YVJvdXRlOiExfSksVWs9cC5jcmVhdGVDb250ZXh0KG51bGwpO2Z1bmN0aW9uIEdmKCl7cmV0dXJuIHAudXNlQ29udGV4dChaZikhPW51bGx9ZnVuY3Rpb24gV2soKXtyZXR1cm4gR2YoKXx8T2UoITEpLHAudXNlQ29udGV4dChaZikubG9jYXRpb259ZnVuY3Rpb24gVmsoZSl7cC51c2VDb250ZXh0KEtmKS5zdGF0aWN8fHAudXNlTGF5b3V0RWZmZWN0KGUpfWZ1bmN0aW9uIFh2KCl7bGV0e2lzRGF0YVJvdXRlOmV9PXAudXNlQ29udGV4dChmbCk7cmV0dXJuIGU/d0woKTp1TCgpfWZ1bmN0aW9uIHVMKCl7R2YoKXx8T2UoITEpO2xldCBlPXAudXNlQ29udGV4dChIZikse2Jhc2VuYW1lOnQsbmF2aWdhdG9yOm59PXAudXNlQ29udGV4dChLZikse21hdGNoZXM6cn09cC51c2VDb250ZXh0KGZsKSx7cGF0aG5hbWU6aX09V2soKSxvPUpTT04uc3RyaW5naWZ5KFBrKHIpKSxsPXAudXNlUmVmKCExKTtyZXR1cm4gVmsoKCk9PntsLmN1cnJlbnQ9ITB9KSxwLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGEsdSl7aWYodT09PXZvaWQgMCYmKHU9e30pLCFsLmN1cnJlbnQpcmV0dXJuO2lmKHR5cGVvZiBhPT0ibnVtYmVyIil7bi5nbyhhKTtyZXR1cm59bGV0IGM9QWsoYSxKU09OLnBhcnNlKG8pLGksdS5yZWxhdGl2ZT09PSJwYXRoIik7ZT09bnVsbCYmdCE9PSIvIiYmKGMucGF0aG5hbWU9Yy5wYXRobmFtZT09PSIvIj90OmVvKFt0LGMucGF0aG5hbWVdKSksKHUucmVwbGFjZT9uLnJlcGxhY2U6bi5wdXNoKShjLHUuc3RhdGUsdSl9LFt0LG4sbyxpLGVdKX1mdW5jdGlvbiBjTCgpe2xldHttYXRjaGVzOmV9PXAudXNlQ29udGV4dChmbCksdD1lW2UubGVuZ3RoLTFdO3JldHVybiB0P3QucGFyYW1zOnt9fWZ1bmN0aW9uIGRMKGUsdCxuKXtHZigpfHxPZSghMSk7bGV0e25hdmlnYXRvcjpyfT1wLnVzZUNvbnRleHQoS2YpLHttYXRjaGVzOml9PXAudXNlQ29udGV4dChmbCksbz1pW2kubGVuZ3RoLTFdLGw9bz9vLnBhcmFtczp7fTtvJiZvLnBhdGhuYW1lO2xldCBzPW8/by5wYXRobmFtZUJhc2U6Ii8iO28mJm8ucm91dGU7bGV0IGE9V2soKSx1O2lmKHQpe3ZhciBjO2xldCBnPXR5cGVvZiB0PT0ic3RyaW5nIj9raSh0KTp0O3M9PT0iLyJ8fChjPWcucGF0aG5hbWUpIT1udWxsJiZjLnN0YXJ0c1dpdGgocyl8fE9lKCExKSx1PWd9ZWxzZSB1PWE7bGV0IGQ9dS5wYXRobmFtZXx8Ii8iLGY9cz09PSIvIj9kOmQuc2xpY2Uocy5sZW5ndGgpfHwiLyIsaD1VbChlLHtwYXRobmFtZTpmfSksbT1nTChoJiZoLm1hcChnPT5PYmplY3QuYXNzaWduKHt9LGcse3BhcmFtczpPYmplY3QuYXNzaWduKHt9LGwsZy5wYXJhbXMpLHBhdGhuYW1lOmVvKFtzLHIuZW5jb2RlTG9jYXRpb24/ci5lbmNvZGVMb2NhdGlvbihnLnBhdGhuYW1lKS5wYXRobmFtZTpnLnBhdGhuYW1lXSkscGF0aG5hbWVCYXNlOmcucGF0aG5hbWVCYXNlPT09Ii8iP3M6ZW8oW3Msci5lbmNvZGVMb2NhdGlvbj9yLmVuY29kZUxvY2F0aW9uKGcucGF0aG5hbWVCYXNlKS5wYXRobmFtZTpnLnBhdGhuYW1lQmFzZV0pfSkpLGksbik7cmV0dXJuIHQmJm0/cC5jcmVhdGVFbGVtZW50KFpmLlByb3ZpZGVyLHt2YWx1ZTp7bG9jYXRpb246cWQoe3BhdGhuYW1lOiIvIixzZWFyY2g6IiIsaGFzaDoiIixzdGF0ZTpudWxsLGtleToiZGVmYXVsdCJ9LHUpLG5hdmlnYXRpb25UeXBlOnd0LlBvcH19LG0pOm19ZnVuY3Rpb24gZkwoKXtsZXQgZT1fTCgpLHQ9TWsoZSk/ZS5zdGF0dXMrIiAiK2Uuc3RhdHVzVGV4dDplIGluc3RhbmNlb2YgRXJyb3I/ZS5tZXNzYWdlOkpTT04uc3RyaW5naWZ5KGUpLG49ZSBpbnN0YW5jZW9mIEVycm9yP2Uuc3RhY2s6bnVsbCxpPXtwYWRkaW5nOiIwLjVyZW0iLGJhY2tncm91bmRDb2xvcjoicmdiYSgyMDAsMjAwLDIwMCwgMC41KSJ9LG89bnVsbDtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KHAuRnJhZ21lbnQsbnVsbCxwLmNyZWF0ZUVsZW1lbnQoImgyIixudWxsLCJVbmV4cGVjdGVkIEFwcGxpY2F0aW9uIEVycm9yISIpLHAuY3JlYXRlRWxlbWVudCgiaDMiLHtzdHlsZTp7Zm9udFN0eWxlOiJpdGFsaWMifX0sdCksbj9wLmNyZWF0ZUVsZW1lbnQoInByZSIse3N0eWxlOml9LG4pOm51bGwsbyl9Y29uc3QgaEw9cC5jcmVhdGVFbGVtZW50KGZMLG51bGwpO2NsYXNzIHBMIGV4dGVuZHMgcC5Db21wb25lbnR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5zdGF0ZT17bG9jYXRpb246dC5sb2NhdGlvbixyZXZhbGlkYXRpb246dC5yZXZhbGlkYXRpb24sZXJyb3I6dC5lcnJvcn19c3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcih0KXtyZXR1cm57ZXJyb3I6dH19c3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyh0LG4pe3JldHVybiBuLmxvY2F0aW9uIT09dC5sb2NhdGlvbnx8bi5yZXZhbGlkYXRpb24hPT0iaWRsZSImJnQucmV2YWxpZGF0aW9uPT09ImlkbGUiP3tlcnJvcjp0LmVycm9yLGxvY2F0aW9uOnQubG9jYXRpb24scmV2YWxpZGF0aW9uOnQucmV2YWxpZGF0aW9ufTp7ZXJyb3I6dC5lcnJvcnx8bi5lcnJvcixsb2NhdGlvbjpuLmxvY2F0aW9uLHJldmFsaWRhdGlvbjp0LnJldmFsaWRhdGlvbnx8bi5yZXZhbGlkYXRpb259fWNvbXBvbmVudERpZENhdGNoKHQsbil7Y29uc29sZS5lcnJvcigiUmVhY3QgUm91dGVyIGNhdWdodCB0aGUgZm9sbG93aW5nIGVycm9yIGR1cmluZyByZW5kZXIiLHQsbil9cmVuZGVyKCl7cmV0dXJuIHRoaXMuc3RhdGUuZXJyb3I/cC5jcmVhdGVFbGVtZW50KGZsLlByb3ZpZGVyLHt2YWx1ZTp0aGlzLnByb3BzLnJvdXRlQ29udGV4dH0scC5jcmVhdGVFbGVtZW50KFVrLlByb3ZpZGVyLHt2YWx1ZTp0aGlzLnN0YXRlLmVycm9yLGNoaWxkcmVuOnRoaXMucHJvcHMuY29tcG9uZW50fSkpOnRoaXMucHJvcHMuY2hpbGRyZW59fWZ1bmN0aW9uIG1MKGUpe2xldHtyb3V0ZUNvbnRleHQ6dCxtYXRjaDpuLGNoaWxkcmVuOnJ9PWUsaT1wLnVzZUNvbnRleHQoSGYpO3JldHVybiBpJiZpLnN0YXRpYyYmaS5zdGF0aWNDb250ZXh0JiYobi5yb3V0ZS5lcnJvckVsZW1lbnR8fG4ucm91dGUuRXJyb3JCb3VuZGFyeSkmJihpLnN0YXRpY0NvbnRleHQuX2RlZXBlc3RSZW5kZXJlZEJvdW5kYXJ5SWQ9bi5yb3V0ZS5pZCkscC5jcmVhdGVFbGVtZW50KGZsLlByb3ZpZGVyLHt2YWx1ZTp0fSxyKX1mdW5jdGlvbiBnTChlLHQsbil7dmFyIHI7aWYodD09PXZvaWQgMCYmKHQ9W10pLG49PT12b2lkIDAmJihuPW51bGwpLGU9PW51bGwpe3ZhciBpO2lmKChpPW4pIT1udWxsJiZpLmVycm9ycyllPW4ubWF0Y2hlcztlbHNlIHJldHVybiBudWxsfWxldCBvPWUsbD0ocj1uKT09bnVsbD92b2lkIDA6ci5lcnJvcnM7aWYobCE9bnVsbCl7bGV0IHM9by5maW5kSW5kZXgoYT0+YS5yb3V0ZS5pZCYmKGw9PW51bGw/dm9pZCAwOmxbYS5yb3V0ZS5pZF0pKTtzPj0wfHxPZSghMSksbz1vLnNsaWNlKDAsTWF0aC5taW4oby5sZW5ndGgscysxKSl9cmV0dXJuIG8ucmVkdWNlUmlnaHQoKHMsYSx1KT0+e2xldCBjPWEucm91dGUuaWQ/bD09bnVsbD92b2lkIDA6bFthLnJvdXRlLmlkXTpudWxsLGQ9bnVsbDtuJiYoZD1hLnJvdXRlLmVycm9yRWxlbWVudHx8aEwpO2xldCBmPXQuY29uY2F0KG8uc2xpY2UoMCx1KzEpKSxoPSgpPT57bGV0IG07cmV0dXJuIGM/bT1kOmEucm91dGUuQ29tcG9uZW50P209cC5jcmVhdGVFbGVtZW50KGEucm91dGUuQ29tcG9uZW50LG51bGwpOmEucm91dGUuZWxlbWVudD9tPWEucm91dGUuZWxlbWVudDptPXMscC5jcmVhdGVFbGVtZW50KG1MLHttYXRjaDphLHJvdXRlQ29udGV4dDp7b3V0bGV0OnMsbWF0Y2hlczpmLGlzRGF0YVJvdXRlOm4hPW51bGx9LGNoaWxkcmVuOm19KX07cmV0dXJuIG4mJihhLnJvdXRlLkVycm9yQm91bmRhcnl8fGEucm91dGUuZXJyb3JFbGVtZW50fHx1PT09MCk/cC5jcmVhdGVFbGVtZW50KHBMLHtsb2NhdGlvbjpuLmxvY2F0aW9uLHJldmFsaWRhdGlvbjpuLnJldmFsaWRhdGlvbixjb21wb25lbnQ6ZCxlcnJvcjpjLGNoaWxkcmVuOmgoKSxyb3V0ZUNvbnRleHQ6e291dGxldDpudWxsLG1hdGNoZXM6Zixpc0RhdGFSb3V0ZTohMH19KTpoKCl9LG51bGwpfXZhciBIaz1mdW5jdGlvbihlKXtyZXR1cm4gZS5Vc2VCbG9ja2VyPSJ1c2VCbG9ja2VyIixlLlVzZVJldmFsaWRhdG9yPSJ1c2VSZXZhbGlkYXRvciIsZS5Vc2VOYXZpZ2F0ZVN0YWJsZT0idXNlTmF2aWdhdGUiLGV9KEhrfHx7fSksZWY9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuVXNlQmxvY2tlcj0idXNlQmxvY2tlciIsZS5Vc2VMb2FkZXJEYXRhPSJ1c2VMb2FkZXJEYXRhIixlLlVzZUFjdGlvbkRhdGE9InVzZUFjdGlvbkRhdGEiLGUuVXNlUm91dGVFcnJvcj0idXNlUm91dGVFcnJvciIsZS5Vc2VOYXZpZ2F0aW9uPSJ1c2VOYXZpZ2F0aW9uIixlLlVzZVJvdXRlTG9hZGVyRGF0YT0idXNlUm91dGVMb2FkZXJEYXRhIixlLlVzZU1hdGNoZXM9InVzZU1hdGNoZXMiLGUuVXNlUmV2YWxpZGF0b3I9InVzZVJldmFsaWRhdG9yIixlLlVzZU5hdmlnYXRlU3RhYmxlPSJ1c2VOYXZpZ2F0ZSIsZS5Vc2VSb3V0ZUlkPSJ1c2VSb3V0ZUlkIixlfShlZnx8e30pO2Z1bmN0aW9uIHZMKGUpe2xldCB0PXAudXNlQ29udGV4dChIZik7cmV0dXJuIHR8fE9lKCExKSx0fWZ1bmN0aW9uIHlMKGUpe2xldCB0PXAudXNlQ29udGV4dChCayk7cmV0dXJuIHR8fE9lKCExKSx0fWZ1bmN0aW9uIHhMKGUpe2xldCB0PXAudXNlQ29udGV4dChmbCk7cmV0dXJuIHR8fE9lKCExKSx0fWZ1bmN0aW9uIEtrKGUpe2xldCB0PXhMKCksbj10Lm1hdGNoZXNbdC5tYXRjaGVzLmxlbmd0aC0xXTtyZXR1cm4gbi5yb3V0ZS5pZHx8T2UoITEpLG4ucm91dGUuaWR9ZnVuY3Rpb24gX0woKXt2YXIgZTtsZXQgdD1wLnVzZUNvbnRleHQoVWspLG49eUwoZWYuVXNlUm91dGVFcnJvcikscj1LayhlZi5Vc2VSb3V0ZUVycm9yKTtyZXR1cm4gdHx8KChlPW4uZXJyb3JzKT09bnVsbD92b2lkIDA6ZVtyXSl9ZnVuY3Rpb24gd0woKXtsZXR7cm91dGVyOmV9PXZMKEhrLlVzZU5hdmlnYXRlU3RhYmxlKSx0PUtrKGVmLlVzZU5hdmlnYXRlU3RhYmxlKSxuPXAudXNlUmVmKCExKTtyZXR1cm4gVmsoKCk9PntuLmN1cnJlbnQ9ITB9KSxwLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGksbyl7bz09PXZvaWQgMCYmKG89e30pLG4uY3VycmVudCYmKHR5cGVvZiBpPT0ibnVtYmVyIj9lLm5hdmlnYXRlKGkpOmUubmF2aWdhdGUoaSxxZCh7ZnJvbVJvdXRlSWQ6dH0sbykpKX0sW2UsdF0pfWZ1bmN0aW9uIFNMKGUpe2xldHtiYXNlbmFtZTp0PSIvIixjaGlsZHJlbjpuPW51bGwsbG9jYXRpb246cixuYXZpZ2F0aW9uVHlwZTppPXd0LlBvcCxuYXZpZ2F0b3I6byxzdGF0aWM6bD0hMX09ZTtHZigpJiZPZSghMSk7bGV0IHM9dC5yZXBsYWNlKC9eXC8qLywiLyIpLGE9cC51c2VNZW1vKCgpPT4oe2Jhc2VuYW1lOnMsbmF2aWdhdG9yOm8sc3RhdGljOmx9KSxbcyxvLGxdKTt0eXBlb2Ygcj09InN0cmluZyImJihyPWtpKHIpKTtsZXR7cGF0aG5hbWU6dT0iLyIsc2VhcmNoOmM9IiIsaGFzaDpkPSIiLHN0YXRlOmY9bnVsbCxrZXk6aD0iZGVmYXVsdCJ9PXIsbT1wLnVzZU1lbW8oKCk9PntsZXQgZz1IdSh1LHMpO3JldHVybiBnPT1udWxsP251bGw6e2xvY2F0aW9uOntwYXRobmFtZTpnLHNlYXJjaDpjLGhhc2g6ZCxzdGF0ZTpmLGtleTpofSxuYXZpZ2F0aW9uVHlwZTppfX0sW3MsdSxjLGQsZixoLGldKTtyZXR1cm4gbT09bnVsbD9udWxsOnAuY3JlYXRlRWxlbWVudChLZi5Qcm92aWRlcix7dmFsdWU6YX0scC5jcmVhdGVFbGVtZW50KFpmLlByb3ZpZGVyLHtjaGlsZHJlbjpuLHZhbHVlOm19KSl9bmV3IFByb21pc2UoKCk9Pnt9KTtmdW5jdGlvbiBFTChlKXtsZXQgdD17aGFzRXJyb3JCb3VuZGFyeTplLkVycm9yQm91bmRhcnkhPW51bGx8fGUuZXJyb3JFbGVtZW50IT1udWxsfTtyZXR1cm4gZS5Db21wb25lbnQmJk9iamVjdC5hc3NpZ24odCx7ZWxlbWVudDpwLmNyZWF0ZUVsZW1lbnQoZS5Db21wb25lbnQpLENvbXBvbmVudDp2b2lkIDB9KSxlLkVycm9yQm91bmRhcnkmJk9iamVjdC5hc3NpZ24odCx7ZXJyb3JFbGVtZW50OnAuY3JlYXRlRWxlbWVudChlLkVycm9yQm91bmRhcnkpLEVycm9yQm91bmRhcnk6dm9pZCAwfSksdH1jb25zdCBaaz1yZS5jcmVhdGVDb250ZXh0KG51bGwpLENMPWU9Pnt2YXIgcyxhO2NvbnN0IHQ9cmUudXNlQ29udGV4dChaayksW24scl09am4uc3BsaXRNb2R1bGVJZEFuZE1vZHVsZVBhdGgoZSksaT0ocz10PT1udWxsP3ZvaWQgMDp0W25dKT09bnVsbD92b2lkIDA6cy5zb3VyY2Usbz0oYT10PT1udWxsP3ZvaWQgMDp0W25dKT09bnVsbD92b2lkIDA6YS5zY2hlbWE7aWYoIWl8fCFvKXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBtb2R1bGU6ICIrbik7Y29uc3QgbD1qbi5yZXNvbHZlUGF0aChyLGksbyk7cmV0dXJue21vZHVsZUlkOm4sbW9kdWxlU291cmNlOmwuc291cmNlLG1vZHVsZVNjaGVtYTpsLnNjaGVtYX19LGtMPSh7YXBpOmV9KT0+e3ZhciBDLFQ7Y29uc3R7IioiOnR9PWNMKCksW24scl09cC51c2VTdGF0ZShudWxsKSxbaSxvXT1wLnVzZVN0YXRlKG51bGwpLFtsLHNdPXAudXNlU3RhdGUoKSxbYV09bD9qbi5zcGxpdE1vZHVsZUlkQW5kTW9kdWxlUGF0aChsKTpbdm9pZCAwLHZvaWQgMF0sdT1hJiYoKEM9bj09bnVsbD92b2lkIDA6blthXSk9PW51bGw/dm9pZCAwOkMuc291cmNlKSxjPWEmJigoVD1uPT1udWxsP3ZvaWQgMDpuW2FdKT09bnVsbD92b2lkIDA6VC5zY2hlbWEpLGQ9T2JqZWN0LmVudHJpZXMobnx8e30pLmZsYXRNYXAoKFtOLFJdKT0+Ui5lcnJvcnM/Ui5lcnJvcnMuZmF0YWw/Ui5lcnJvcnMuZmF0YWwubWFwKEQ9Pih7aWQ6TiwuLi5EfSkpOltdOltdKSxmPU9iamVjdC5lbnRyaWVzKG58fHt9KS5mbGF0TWFwKChbLE5dKT0+Ti5lcnJvcnMmJk4uZXJyb3JzLnZhbGlkYXRpb24/W04uZXJyb3JzLnZhbGlkYXRpb25dOltdKTtpZihkJiZkLmxlbmd0aD4wKXtjb25zdCBOPWQubGVuZ3RoPT09MT9kWzBdLm1lc3NhZ2U6YE11bHRpcGxlIGVycm9ycyBkZXRlY3RlZDoKJHtkLm1hcCgoRCxGKT0+YCR7RisxfS4gWyR7RC5pZH1dOiAke0QubWVzc2FnZX1gKS5qb2luKGAKYCl9CgpTaG93aW5nIHN0YWNrIHRyYWNlIG9mOiAxLiAke2RbMF0ubWVzc2FnZX1gLFI9bmV3IEVycm9yKE4pO3Rocm93IFIuc3RhY2s9ZFswXS5zdGFjayxSfWYmJmYubGVuZ3RoPjAmJmNvbnNvbGUud2FybigiVmFsIGVuY291bnRlcmVkIHZhbGlkYXRpb24gZXJyb3JzOiIsZikscC51c2VFZmZlY3QoKCk9PntzKHQ/YC8ke3R9YDpsKX0sW3RdKTtjb25zdFtoLG1dPXAudXNlU3RhdGUobnVsbCk7cC51c2VFZmZlY3QoKCk9Pnt0cnl7bmV3IFdlYlNvY2tldChgJHt3aW5kb3cubG9jYXRpb24ub3JpZ2luLnJlcGxhY2UoImh0dHA6Ly8iLCJ3czovLyIpfS9fbmV4dC93ZWJwYWNrLWhtcmApLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLFI9PntsZXQgRDt0cnl7RD1KU09OLnBhcnNlKFIuZGF0YSl9Y2F0Y2h7Y29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHBhcnNlIEhNUiIpfXR5cGVvZihEPT1udWxsP3ZvaWQgMDpELmhhc2gpPT0ic3RyaW5nIiYmKEQ9PW51bGw/dm9pZCAwOkQuYWN0aW9uKT09PSJidWlsdCImJm0oRC5oYXNoKX0pfWNhdGNoKE4pe2NvbnNvbGUud2FybigiRmFpbGVkIHRvIGluaXRpYWxpemUgSE1SIixOKX19LFtdKSxwLnVzZUVmZmVjdCgoKT0+e2NvbnNvbGUubG9nKCIoUmUpLWZldGNoaW5nIG1vZHVsZXMiKSxlLmdldFRyZWUoe3BhdGNoOiEwLGluY2x1ZGVTY2hlbWE6ITAsaW5jbHVkZVNvdXJjZTohMH0pLnRoZW4oTj0+e2pvLmlzT2soTik/cihOLnZhbHVlLm1vZHVsZXMpOihvKCJDb3VsZCBub3QgbG9hZCBtb2R1bGVzOiAiK04uZXJyb3IubWVzc2FnZSksY29uc29sZS5lcnJvcihOLmVycm9yKSl9KX0sW2hdKTtjb25zdCBnPWRNKGUpLHc9WHYoKSxbdix5XT1kNSgpLHtwYXRjaGVzOl8sc2V0UGF0Y2hSZXNldElkOlN9PWM1KGcsZSksRT1yZS51c2VSZWYobnVsbCksJD1wLnVzZUNhbGxiYWNrKE49PmFzeW5jIFI9Pntjb25zdFtELEZdPWpuLnNwbGl0TW9kdWxlSWRBbmRNb2R1bGVQYXRoKE4pLHNlPWF3YWl0IFIoam4uY3JlYXRlUGF0Y2hKU09OUGF0aChGKSk7cmV0dXJuIGUucG9zdFBhdGNoZXMoRCxzZSkudGhlbihWPT57aWYoam8uaXNFcnIoVikpdGhyb3cgVi5lcnJvcjtpZighaClyZXR1cm4gUyhLPT5LKzEpLGUuZ2V0VHJlZSh7dHJlZVBhdGg6RCxwYXRjaDohMCxpbmNsdWRlU2NoZW1hOiEwLGluY2x1ZGVTb3VyY2U6ITB9KS50aGVuKEs9Pntqby5pc09rKEspP3IoTz0+KHsuLi5PLC4uLksudmFsdWUubW9kdWxlc30pKToobygiQ291bGQgbm90IGxvYWQgbW9kdWxlczogIitLLmVycm9yLm1lc3NhZ2UpLGNvbnNvbGUuZXJyb3IoSy5lcnJvcikpfSl9KS5jYXRjaChWPT57Y29uc29sZS5lcnJvcihWKX0pfSxbXSk7cmV0dXJuIHguanN4KHhDLlByb3ZpZGVyLHt2YWx1ZTp7dGhlbWU6dixzZXRUaGVtZTp5LGFwaTplLGVkaXRNb2RlOiJmdWxsIixzZXNzaW9uOmcsaGlnaGxpZ2h0OiExLHNldEhpZ2hsaWdodDooKT0+e30sc2V0RWRpdE1vZGU6KCk9Pnt9LHNldFdpbmRvd1NpemU6KCk9Pnt9fSxjaGlsZHJlbjp4LmpzeHMoImRpdiIse2lkOiJ2YWwtZnVsbHNjcmVlbi1jb250YWluZXIiLGNsYXNzTmFtZToicmVsYXRpdmUgZm9udC1zZXJpZiBhbnRpYWxpYXNlZCIsImRhdGEtbW9kZSI6dixjaGlsZHJlbjpbeC5qc3goImRpdiIse2NsYXNzTmFtZToiZml4ZWQgLXRyYW5zbGF0ZS14LTEvMiB6LW92ZXJsYXkgbGVmdC0xLzIgYm90dG9tLTQiLGNoaWxkcmVuOnguanN4KGE1LHthcGk6ZSxwYXRjaGVzOl8sb25Db21taXQ6KCk9PlMoTj0+TisxKX0pfSkseC5qc3goImRpdiIse2lkOiJ2YWwtZnVsbHNjcmVlbi1ob3ZlciIscmVmOkV9KSx4LmpzeChHay5Qcm92aWRlcix7dmFsdWU6e2hvdmVyRWxlbTpFPT1udWxsP3ZvaWQgMDpFLmN1cnJlbnR9LGNoaWxkcmVuOnguanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQtcHJpbWFyeSBiZy1iYWNrZ3JvdW5kIixjaGlsZHJlbjp4LmpzeHMoQ2Ese2NoaWxkcmVuOlt4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJweC00IGgtWzUwcHhdIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIixjaGlsZHJlbjp4LmpzeChrayx7fSl9KSx4LmpzeChFYSx7Y2xhc3NOYW1lOiJweC00IixjaGlsZHJlbjpuP3guanN4KE1MLHtwYXRoczpPYmplY3Qua2V5cyhuKSxzZXRTZWxlY3RlZE1vZHVsZUlkOk49Pnt3KE4pfX0pOiFpJiZ4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJweS00IixjaGlsZHJlbjoiTG9hZGluZy4uLiJ9KX0pLHguanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0IHctZnVsbCBoLVs1MHB4XSBnYXAtMiBmb250LXNlcmlmIHRleHQteHMiLGNoaWxkcmVuOlt4LmpzeCgiYnV0dG9uIix7b25DbGljazooKT0+e2hpc3RvcnkuYmFjaygpfSxjaGlsZHJlbjp4LmpzeChKQSx7fSl9KSx4LmpzeCgicCIse2NoaWxkcmVuOmx8fCIvIn0pXX0pLHguanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJwLTQiLGNoaWxkcmVuOltpJiZ4LmpzeHMoImRpdiIse2NsYXNzTmFtZToidGV4dC1sZyB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQiLGNoaWxkcmVuOlsiRVJST1I6ICIsaV19KSxuJiZsJiZhJiZ1IT09dm9pZCAwJiZjIT09dm9pZCAwJiZ4LmpzeChaay5Qcm92aWRlcix7dmFsdWU6bixjaGlsZHJlbjp4LmpzeChiTCx7cGF0aDpsLHNvdXJjZTp1LHNjaGVtYTpjLHNldFNlbGVjdGVkUGF0aDpzLGluaXRPblN1Ym1pdDokfSl9KV19KV19KX0pfSldfSl9KX0sR2s9cmUuY3JlYXRlQ29udGV4dCh7aG92ZXJFbGVtOm51bGx9KSwkTD0oKT0+cmUudXNlQ29udGV4dChHayk7ZnVuY3Rpb24gYkwoe3BhdGg6ZSxzb3VyY2U6dCxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cixpbml0T25TdWJtaXQ6aX0pe2NvbnN0WyxvXT1qbi5zcGxpdE1vZHVsZUlkQW5kTW9kdWxlUGF0aChlKSxsPWpuLnJlc29sdmVQYXRoKG8sdCxuKTtpZighbCl0aHJvdyBFcnJvcigiQ291bGQgbm90IHJlc29sdmUgbW9kdWxlOiAiK2UpO3JldHVybiB4LmpzeChZayx7cGF0aDplLHNvdXJjZTpsLnNvdXJjZSxzY2hlbWE6bC5zY2hlbWEsc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0OmksdG9wOiEwfSl9ZnVuY3Rpb24gWWsoe3BhdGg6ZSxzb3VyY2U6dCxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cixmaWVsZDppLGluaXRPblN1Ym1pdDpvLHRvcDpsfSl7cmV0dXJuIHQ9PT1udWxsfHxuLm9wdD94LmpzeChPTCx7cGF0aDplLHNvdXJjZTp0LHNjaGVtYTpuLGZpZWxkOmksaW5pdE9uU3VibWl0Om8sc2V0U2VsZWN0ZWRQYXRoOnJ9KTpuLnR5cGU9PT0ib2JqZWN0Ij90eXBlb2YgdCE9Im9iamVjdCJ8fExhKHQpP3guanN4cygiZGl2Iix7Y2hpbGRyZW46WyJFUlJPUjogZXhwZWN0ZWQgb2JqZWN0LCBidXQgZm91bmQgIix0eXBlb2YgdF19KTp4LmpzeChYayx7c291cmNlOnQscGF0aDplLHNjaGVtYTpuLGluaXRPblN1Ym1pdDpvLHNldFNlbGVjdGVkUGF0aDpyLHRvcDpsfSk6bi50eXBlPT09ImFycmF5Ij90eXBlb2YgdCE9Im9iamVjdCJ8fCFMYSh0KT94LmpzeHMoImRpdiIse2NoaWxkcmVuOlsiRVJST1I6IGV4cGVjdGVkIGFycmF5LCBidXQgZm91bmQgIix0eXBlb2YgdF19KTp4LmpzeChRayx7c291cmNlOnQscGF0aDplLHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyfSk6bi50eXBlPT09InJlY29yZCI/dHlwZW9mIHQhPSJvYmplY3QiP3guanN4cygiZGl2Iix7Y2hpbGRyZW46WyJFUlJPUjogZXhwZWN0ZWQgb2JqZWN0IGZvciAiLG4udHlwZSwiLCBidXQgZm91bmQgIix0eXBlb2YgdF19KTpMYSh0KT94LmpzeHMoImRpdiIse2NoaWxkcmVuOlsiRVJST1I6IGRpZCBub3QgZXhwZWN0IGFycmF5IGZvciAiLG4udHlwZV19KTp4LmpzeChUTCx7c291cmNlOnQscGF0aDplLHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyfSk6eC5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InB5LTIgZ2FwLXktNCIsY2hpbGRyZW46W3guanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQtbGVmdCIsY2hpbGRyZW46aXx8ZX0pLHguanN4KENrLHtwYXRoOmUsZGlzYWJsZWQ6ITEsc291cmNlOnQsc2NoZW1hOm4sb25TdWJtaXQ6byhlKX0pXX0pfWZ1bmN0aW9uIFhrKHtwYXRoOmUsc291cmNlOnQsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0OmksdG9wOm99KXtyZXR1cm4geC5qc3goImRpdiIse2NsYXNzTmFtZTp3ZigiZmxleCBmbGV4LWNvbCBnYXAteS04Iix7ImJvcmRlci1sLTIgYm9yZGVyLWJvcmRlciBwbC02Ijohb30pLGNoaWxkcmVuOk9iamVjdC5lbnRyaWVzKG4uaXRlbXMpLm1hcCgoW2wsc10pPT57Y29uc3QgYT0kdShlLGwpO3JldHVybiB4LmpzeChZayx7cGF0aDphLHNvdXJjZTp0W2xdLHNjaGVtYTpzLHNldFNlbGVjdGVkUGF0aDpyLGZpZWxkOmwsaW5pdE9uU3VibWl0Oml9LGEpfSl9LGUpfWZ1bmN0aW9uIFRMKHtwYXRoOmUsc291cmNlOnQsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnJ9KXtjb25zdCBpPVh2KCk7cmV0dXJuIHguanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1jb2wgZ2FwLTQgcC0yIixjaGlsZHJlbjpPYmplY3QuZW50cmllcyh0KS5tYXAoKFtvLGxdKT0+e2NvbnN0IHM9JHUoZSxvKTtyZXR1cm4geC5qc3goImJ1dHRvbiIse29uQ2xpY2s6KCk9PntyKHMpLGkocyl9LGNoaWxkcmVuOnguanN4KE5MLHtyZWNvcmRLZXk6byxwYXRoOnMsc291cmNlOmwsc2NoZW1hOm4uaXRlbX0pfSxzKX0pfSxlKX1jb25zdCBZbT0xNzA7ZnVuY3Rpb24gTkwoe3JlY29yZEtleTplLHBhdGg6dCxzb3VyY2U6bixzY2hlbWE6cn0pe2NvbnN0IGk9cmUudXNlUmVmKG51bGwpLFtvLGxdPXAudXNlU3RhdGUoITEpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2kuY3VycmVudCYmaS5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodD49WW0mJmwoITApfSxbXSkseC5qc3hzKFp2LHtyZWY6aSxjbGFzc05hbWU6InJlbGF0aXZlIHB4LTQgcHQtMiBwYi00IG92ZXJmbG93LWhpZGRlbiBib3JkZXIgZ2FwLXktMiIsc3R5bGU6e21heEhlaWdodDpZbX0sY2hpbGRyZW46W3guanN4KCJkaXYiLHtjbGFzc05hbWU6InBiLTQgZm9udC1zZXJpZiB0ZXh0LWxlZnQgdGV4dC1hY2NlbnQiLGNoaWxkcmVuOmV9KSx4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ0ZXh0LXhzIixjaGlsZHJlbjp4LmpzeChRdix7cGF0aDp0LHNvdXJjZTpuLHNjaGVtYTpyfSl9KSxvJiZ4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgdy1mdWxsIGgtWzIwcHhdIGJnLWdyYWRpZW50LXRvLWIgZnJvbS10cmFuc3BhcmVudCB0by1iYWNrZ3JvdW5kIn0pXX0sdCl9ZnVuY3Rpb24gUWsoe3BhdGg6ZSxzb3VyY2U6dCxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cn0pe2NvbnN0IGk9WHYoKTtyZXR1cm4geC5qc3goImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCBnYXAtNCBwLTIiLGNoaWxkcmVuOnQubWFwKChvLGwpPT57Y29uc3Qgcz0kdShlLGwpO3JldHVybiB4LmpzeCgiYnV0dG9uIix7b25DbGljazooKT0+e3IocyksaShzKX0sY2hpbGRyZW46eC5qc3goUkwse2luZGV4OmwscGF0aDpzLHNvdXJjZTpvLHNjaGVtYTpuLml0ZW19LHMpfSxzKX0pfSxlKX1jb25zdCBnXz1ZbTtmdW5jdGlvbiBSTCh7aW5kZXg6ZSxwYXRoOnQsc291cmNlOm4sc2NoZW1hOnJ9KXtjb25zdCBpPXJlLnVzZVJlZihudWxsKSxbbyxsXT1wLnVzZVN0YXRlKCExKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntpLmN1cnJlbnQmJmkuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ+PWdfJiZsKCEwKX0sW10pLHguanN4cyhadix7cmVmOmksY2xhc3NOYW1lOiJyZWxhdGl2ZSBweC00IHB0LTIgcGItNCBvdmVyZmxvdy1oaWRkZW4gYm9yZGVyIGdhcC15LTIiLHN0eWxlOnttYXhIZWlnaHQ6Z199LGNoaWxkcmVuOlt4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJwYi00IGZvbnQtc2VyaWYgdGV4dC1sZWZ0IHVwcGVyY2FzZSB0ZXh0LWFjY2VudCIsY2hpbGRyZW46ZSsxPDEwP2AwJHtlKzF9YDplKzF9KSx4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ0ZXh0LXhzIixjaGlsZHJlbjp4LmpzeChRdix7cGF0aDp0LHNvdXJjZTpuLHNjaGVtYTpyfSl9KSxvJiZ4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgdy1mdWxsIGgtWzIwcHhdIGJnLWdyYWRpZW50LXRvLWIgZnJvbS10cmFuc3BhcmVudCB0by1iYWNrZ3JvdW5kIn0pXX0pfWZ1bmN0aW9uICR1KGUsdCl7Y29uc3Qgbj1qbi5jcmVhdGVWYWxQYXRoT2ZJdGVtKGUsdCk7aWYoIW4pdGhyb3cgRXJyb3IoYENvdWxkIG5vdCBjcmVhdGUgdmFsIHBhdGg6ICR7ZX0gb2YgJHt0PT1udWxsP3ZvaWQgMDp0LnRvU3RyaW5nKCl9YCk7cmV0dXJuIG59ZnVuY3Rpb24gUXYoe3BhdGg6ZSxzb3VyY2U6dCxzY2hlbWE6bn0pe2NvbnN0W3IsaV09cC51c2VTdGF0ZShudWxsKSx7aG92ZXJFbGVtOm99PSRMKCk7aWYobi50eXBlPT09Im9iamVjdCIpcmV0dXJuIHguanN4KCJkaXYiLHtjbGFzc05hbWU6ImdyaWQgZ3JpZC1jb2xzLVttaW4tY29udGVudF8xZnJdIGdhcC0yIHRleHQtbGVmdCIsY2hpbGRyZW46T2JqZWN0LmVudHJpZXMobi5pdGVtcykubWFwKChbbF0pPT54LmpzeHMocC5GcmFnbWVudCx7Y2hpbGRyZW46W3guanN4cygic3BhbiIse2NsYXNzTmFtZToidGV4dC1tdXRlZCIsY2hpbGRyZW46W2wsIjoiXX0pLHguanN4KCJzcGFuIix7Y2hpbGRyZW46eC5qc3goUXYse3NvdXJjZToodD09bnVsbD92b2lkIDA6dFtsXSk/P251bGwsc2NoZW1hOm4uaXRlbXNbbF0scGF0aDokdShlLGwpfSl9KV19LCR1KGUsbCkpKX0sZSk7aWYobi50eXBlPT09ImFycmF5IilyZXR1cm4gdD09PW51bGw/eC5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjoiRW1wdHkifSxlKTpBcnJheS5pc0FycmF5KHQpP3guanN4cygic3BhbiIse2NoaWxkcmVuOlt4LmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOnQubGVuZ3RofSkseC5qc3goInNwYW4iLHtjaGlsZHJlbjp0Lmxlbmd0aD09PTE/IiBpdGVtIjoiIGl0ZW1zIn0pXX0sZSk6eC5qc3goInNwYW4iLHtjbGFzc05hbWU6InB4LTIgYmctZGVzdHJ1Y3RpdmUgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIixjaGlsZHJlbjoiVW5rbm93biBsZW5ndGgifSxlKTtpZihuLnR5cGU9PT0icmljaHRleHQiKXJldHVybiB0PT09bnVsbD94LmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOiJFbXB0eSJ9LGUpOnR5cGVvZiB0IT0ib2JqZWN0Ij94LmpzeHMoImRpdiIse2NsYXNzTmFtZToicC00IHRleHQtZGVzdHJ1Y3RpdmUtZm9yZWdyb3VuZCBiZy1kZXN0cnVjdGl2ZSIsY2hpbGRyZW46WyJFUlJPUjogIix0eXBlb2YgdCwiIG5vdCBhbiBvYmplY3QiXX0sZSk6IShubiBpbiB0KXx8dFtubl0hPT0icmljaHRleHQiP3guanN4KCJkaXYiLHtjbGFzc05hbWU6InAtNCB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQgYmctZGVzdHJ1Y3RpdmUiLGNoaWxkcmVuOiJFUlJPUjogb2JqZWN0IGlzIG5vdCByaWNodGV4dCJ9LGUpOnguanN4KERMLHtjaGlsZHJlbjpQRSh0KX0sZSk7aWYobi50eXBlPT09InN0cmluZyIpcmV0dXJuIHQ9PT1udWxsP3guanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46IkVtcHR5In0sZSk6eC5qc3goInNwYW4iLHtjaGlsZHJlbjp0fSk7aWYobi50eXBlPT09ImltYWdlIil7aWYodD09PW51bGwpcmV0dXJuIHguanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46IkVtcHR5In0sZSk7aWYodHlwZW9mIHQhPSJvYmplY3QiKXJldHVybiB4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJwLTQgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIGJnLWRlc3RydWN0aXZlIixjaGlsZHJlbjoiRVJST1I6IG5vdCBhbiBvYmplY3QifSxlKTtpZighKFJuIGluIHQpfHx0eXBlb2YgdFtSbl0hPSJzdHJpbmciKXJldHVybiB4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJwLTQgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIGJnLWRlc3RydWN0aXZlIixjaGlsZHJlbjoiRVJST1I6IG9iamVjdCBpcyBub3QgYW4gaW1hZ2UifSxlKTtjb25zdCBsPWpuLmNvbnZlcnRGaWxlU291cmNlKHQpLnVybDtyZXR1cm4geC5qc3hzKCJzcGFuIix7b25Nb3VzZU92ZXI6cz0+e2koe3g6cy5jbGllbnRYLHk6cy5jbGllbnRZfSl9LG9uTW91c2VMZWF2ZTooKT0+e2kobnVsbCl9LGNsYXNzTmFtZToicmVsYXRpdmUgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1zdGFydCBnYXAtMSIsY2hpbGRyZW46W3guanN4KCJhIix7aHJlZjpsLGNsYXNzTmFtZToib3ZlcmZsb3ctaGlkZGVuIHVuZGVybGluZSB0cnVuY2F0ZSAiLGNoaWxkcmVuOnRbUm5dfSksciYmbyYmR3IuY3JlYXRlUG9ydGFsKHguanN4KCJpbWciLHtjbGFzc05hbWU6ImFic29sdXRlIHotWzVdIG1heC13LVsxMHZ3XSIsc3R5bGU6e2xlZnQ6ci54KzEwLHRvcDpyLnkrMTB9LHNyYzpsfSksbyldfSxlKX1lbHNle2lmKG4udHlwZT09PSJib29sZWFuIilyZXR1cm4gdD09PW51bGw/eC5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjoiRW1wdHkifSxlKTp4LmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOnQ/InRydWUiOiJmYWxzZSJ9LGUpO2lmKG4udHlwZT09PSJudW1iZXIiKXJldHVybiB0PT09bnVsbD94LmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOiJFbXB0eSJ9LGUpOnguanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46dC50b1N0cmluZygpfSk7aWYobi50eXBlPT09ImtleU9mIilyZXR1cm4gdD09PW51bGw/eC5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjoiRW1wdHkifSxlKTp4LmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOnQudG9TdHJpbmcoKX0sZSl9cmV0dXJuIHguanN4cygiZGl2Iix7Y2hpbGRyZW46WyJUT0RPOiAiLG4udHlwZV19LGUpfWZ1bmN0aW9uIE9MKHtwYXRoOmUsc291cmNlOnQsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0OmksZmllbGQ6b30pe2NvbnN0W2wsc109cC51c2VTdGF0ZSh0IT09bnVsbCk7cmV0dXJuIHguanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtY29sIGdhcC15LTYiLGNoaWxkcmVuOltvP3guanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0IGdhcC14LTQiLGNoaWxkcmVuOlt4LmpzeChWbSx7Y2hlY2tlZDpsLG9uQ2xpY2s6KCk9PntzKGE9PiFhKX19KSx4LmpzeCgic3BhbiIse2NoaWxkcmVuOm99KV19KTp4LmpzeChWbSx7Y2hlY2tlZDpsLG9uQ2xpY2s6KCk9PntzKGE9PiFhKX19KSxsJiZ4LmpzeChQTCx7c291cmNlOnQsc2NoZW1hOm4scGF0aDplLHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDppfSldfSxlKX1mdW5jdGlvbiBQTCh7c291cmNlOmUscGF0aDp0LHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDppfSl7aWYobi50eXBlPT09ImFycmF5Iil7aWYodHlwZW9mIGU9PSJvYmplY3QiJiYoZT09PW51bGx8fExhKGUpKSlyZXR1cm4geC5qc3goUWsse3NvdXJjZTplPT09bnVsbD9bXTplLHBhdGg6dCxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cn0pfWVsc2UgaWYobi50eXBlPT09Im9iamVjdCIpe2lmKHR5cGVvZiBlPT0ib2JqZWN0IiYmKGU9PT1udWxsfHwhTGEoZSkpKXJldHVybiB4LmpzeChYayx7c291cmNlOmUscGF0aDp0LHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDppfSl9ZWxzZSBpZihuLnR5cGU9PT0icmljaHRleHQifHxuLnR5cGU9PT0ic3RyaW5nInx8bi50eXBlPT09ImltYWdlInx8bi50eXBlPT09Im51bWJlciJ8fG4udHlwZT09PSJrZXlPZiIpcmV0dXJuIHguanN4KENrLHtwYXRoOnQsZGlzYWJsZWQ6ITEsc291cmNlOmUsc2NoZW1hOm4sb25TdWJtaXQ6aSh0KX0sdCk7cmV0dXJuIHguanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJwLTQgYmctZGVzdHJ1Y3RpdmUgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIixjaGlsZHJlbjpbIkVSUk9SOiB1bmV4cGVjdGVkIHNvdXJjZSB0eXBlICIsdHlwZW9mIGUsIiBmb3Igc2NoZW1hIHR5cGUiLCIgIixuLnR5cGVdfSl9ZnVuY3Rpb24gTGEoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSl9ZnVuY3Rpb24gQUwoZSl7Y29uc3QgdD17fTtyZXR1cm4gZS5mb3JFYWNoKG49Pntjb25zdCByPW4uc3BsaXQoIi8iKS5maWx0ZXIobz0+byE9PSIiKTtsZXQgaT10O3IuZm9yRWFjaChvPT57aVtvXXx8KGlbb109e30pLGk9aVtvXX0pfSksdH1mdW5jdGlvbiBNTCh7cGF0aHM6ZSxzZXRTZWxlY3RlZE1vZHVsZUlkOnR9KXtjb25zdCBuPUFMKGUpO3JldHVybiB4LmpzeCh2Uyx7Y2hpbGRyZW46T2JqZWN0LmVudHJpZXMobikubWFwKChbcixpXSk9PnguanN4KCJkaXYiLHtjbGFzc05hbWU6InB4LTQgcHktMiIsY2hpbGRyZW46eC5qc3goSmsse25hbWU6cix0cmVlOmksbW9kdWxlSWQ6YC8ke3J9YCxzZXRTZWxlY3RlZE1vZHVsZUlkOnR9KX0sYC8ke3J9YCkpfSl9ZnVuY3Rpb24gSmsoe25hbWU6ZSx0cmVlOnQsbW9kdWxlSWQ6bixzZXRTZWxlY3RlZE1vZHVsZUlkOnJ9KXtyZXR1cm4geC5qc3hzKCJkaXYiLHtjaGlsZHJlbjpbeC5qc3goImJ1dHRvbiIse29uQ2xpY2s6KCk9PntyKG4pfSxjaGlsZHJlbjplfSksT2JqZWN0LmVudHJpZXModCkubWFwKChbaSxvXSk9PnguanN4KCJkaXYiLHtjbGFzc05hbWU6InB4LTQgcHktMSIsY2hpbGRyZW46eC5qc3goSmsse25hbWU6aSx0cmVlOm8sbW9kdWxlSWQ6YCR7bn0vJHtpfWAsc2V0U2VsZWN0ZWRNb2R1bGVJZDpyfSl9LGAke259LyR7aX1gKSldfSl9Y29uc3Qgdl89e3RhZ3M6e2gxOiJmb250LWJvbGQiLGgyOiJmb250LWJvbGQiLGgzOiJmb250LWJvbGQiLGg0OiJmb250LWJvbGQiLGg1OiJmb250LWJvbGQiLGg2OiJmb250LWJvbGQiLHA6IiJ9LGNsYXNzZXM6e2JvbGQ6ImZvbnQtYm9sZCIsaXRhbGljOiJpdGFsaWMiLGxpbmVUaHJvdWdoOiJsaW5lLXRocm91Z2gifX07ZnVuY3Rpb24gREwoe2NoaWxkcmVuOmV9KXtjb25zdCB0PWU7ZnVuY3Rpb24gbihvLGwpe2NvbnN0IHM9dl8udGFnc1tvXTtyZXR1cm4gcyYmbD9bbCxzXS5qb2luKCIgIik6c3x8bH1mdW5jdGlvbiByKG8sbCl7Y29uc3Qgcz12Xy5jbGFzc2VzW29dO3JldHVybiBzJiZsP1tsLHNdLmpvaW4oIiAiKTpzfHxsfWZ1bmN0aW9uIGkobyxsKXt2YXIgdSxjO2lmKHR5cGVvZiBvPT0ic3RyaW5nIilyZXR1cm4gbztpZihvLnRhZz09PSJwIilyZXR1cm4geC5qc3goInAiLHtjbGFzc05hbWU6bigicCIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJpbWciKXJldHVybiB4LmpzeCgiaW1nIix7Y2xhc3NOYW1lOm4oImltZyIpLHNyYzpvLnNyY30sbCk7aWYoby50YWc9PT0idWwiKXJldHVybiB4LmpzeCgidWwiLHtjbGFzc05hbWU6bigidWwiKSxjaGlsZHJlbjpvLmNoaWxkcmVuLm1hcCgoZCxmKT0+aShkLGYpKX0sbCk7aWYoby50YWc9PT0ib2wiKXJldHVybiB4LmpzeCgib2wiLHtjbGFzc05hbWU6bigib2wiKSxjaGlsZHJlbjpvLmNoaWxkcmVuLm1hcCgoZCxmKT0+aShkLGYpKX0sbCk7aWYoby50YWc9PT0ibGkiKXJldHVybiB4LmpzeCgibGkiLHtjbGFzc05hbWU6bigibGkiKSxjaGlsZHJlbjpvLmNoaWxkcmVuLm1hcCgoZCxmKT0+aShkLGYpKX0sbCk7aWYoby50YWc9PT0ic3BhbiIpcmV0dXJuIHguanN4KCJzcGFuIix7Y2xhc3NOYW1lOm8uY2xhc3Nlcy5tYXAoZD0+e3N3aXRjaChkKXtjYXNlImJvbGQiOnJldHVybiByKCJib2xkIik7Y2FzZSJsaW5lLXRocm91Z2giOnJldHVybiByKCJsaW5lVGhyb3VnaCIpO2Nhc2UiaXRhbGljIjpyZXR1cm4gcigiaXRhbGljIil9fSkuam9pbigiICIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoMSIpcmV0dXJuIHguanN4KCJoMSIse2NsYXNzTmFtZTpuKCJoMSIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoMiIpcmV0dXJuIHguanN4KCJoMiIse2NsYXNzTmFtZTpuKCJoMiIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoMyIpcmV0dXJuIHguanN4KCJoMyIse2NsYXNzTmFtZTpuKCJoMyIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoNCIpcmV0dXJuIHguanN4KCJoNCIse2NsYXNzTmFtZTpuKCJoNCIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoNSIpcmV0dXJuIHguanN4KCJoNSIse2NsYXNzTmFtZTpuKCJoNSIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoNiIpcmV0dXJuIHguanN4KCJoNiIse2NsYXNzTmFtZTpuKCJoNiIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJiciIpcmV0dXJuIHguanN4KCJiciIse30sbCk7aWYoby50YWc9PT0iYSIpcmV0dXJuIHguanN4KCJhIix7aHJlZjpvLmhyZWYsY2hpbGRyZW46by5jaGlsZHJlbi5tYXAoKGQsZik9PmkoZCxmKSl9LGwpO2NvbnNvbGUuZXJyb3IoIlVua25vd24gdGFnIixvLnRhZyk7Y29uc3QgYT1vLnRhZztyZXR1cm4gYSE9bnVsbCYmYS50YWc/cmUuY3JlYXRlRWxlbWVudChhLnRhZyx7a2V5OmwsY2xhc3NOYW1lOih1PWEuY2xhc3MpPT1udWxsP3ZvaWQgMDp1LmpvaW4oIiAiKSxjaGlsZHJlbjooYz1hLmNoaWxkcmVuKT09bnVsbD92b2lkIDA6Yy5tYXAoaSl9KTpudWxsfXJldHVybiB4LmpzeCgic3BhbiIseyJkYXRhLXZhbC1wYXRoIjp0LnZhbFBhdGgsY2hpbGRyZW46dC5jaGlsZHJlbi5tYXAoKG8sbCk9PmkobyxsKSl9KX1jb25zdCBMTD1wLmNyZWF0ZUNvbnRleHQobnVsbCksWGg9e2RpZENhdGNoOiExLGVycm9yOm51bGx9O2NsYXNzIElMIGV4dGVuZHMgcC5Db21wb25lbnR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5yZXNldEVycm9yQm91bmRhcnk9dGhpcy5yZXNldEVycm9yQm91bmRhcnkuYmluZCh0aGlzKSx0aGlzLnN0YXRlPVhofXN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IodCl7cmV0dXJue2RpZENhdGNoOiEwLGVycm9yOnR9fXJlc2V0RXJyb3JCb3VuZGFyeSgpe2NvbnN0e2Vycm9yOnR9PXRoaXMuc3RhdGU7aWYodCE9PW51bGwpe2Zvcih2YXIgbixyLGk9YXJndW1lbnRzLmxlbmd0aCxvPW5ldyBBcnJheShpKSxsPTA7bDxpO2wrKylvW2xdPWFyZ3VtZW50c1tsXTsobj0ocj10aGlzLnByb3BzKS5vblJlc2V0KT09PW51bGx8fG49PT12b2lkIDB8fG4uY2FsbChyLHthcmdzOm8scmVhc29uOiJpbXBlcmF0aXZlLWFwaSJ9KSx0aGlzLnNldFN0YXRlKFhoKX19Y29tcG9uZW50RGlkQ2F0Y2godCxuKXt2YXIgcixpOyhyPShpPXRoaXMucHJvcHMpLm9uRXJyb3IpPT09bnVsbHx8cj09PXZvaWQgMHx8ci5jYWxsKGksdCxuKX1jb21wb25lbnREaWRVcGRhdGUodCxuKXtjb25zdHtkaWRDYXRjaDpyfT10aGlzLnN0YXRlLHtyZXNldEtleXM6aX09dGhpcy5wcm9wcztpZihyJiZuLmVycm9yIT09bnVsbCYmakwodC5yZXNldEtleXMsaSkpe3ZhciBvLGw7KG89KGw9dGhpcy5wcm9wcykub25SZXNldCk9PT1udWxsfHxvPT09dm9pZCAwfHxvLmNhbGwobCx7bmV4dDppLHByZXY6dC5yZXNldEtleXMscmVhc29uOiJrZXlzIn0pLHRoaXMuc2V0U3RhdGUoWGgpfX1yZW5kZXIoKXtjb25zdHtjaGlsZHJlbjp0LGZhbGxiYWNrUmVuZGVyOm4sRmFsbGJhY2tDb21wb25lbnQ6cixmYWxsYmFjazppfT10aGlzLnByb3BzLHtkaWRDYXRjaDpvLGVycm9yOmx9PXRoaXMuc3RhdGU7bGV0IHM9dDtpZihvKXtjb25zdCBhPXtlcnJvcjpsLHJlc2V0RXJyb3JCb3VuZGFyeTp0aGlzLnJlc2V0RXJyb3JCb3VuZGFyeX07aWYocC5pc1ZhbGlkRWxlbWVudChpKSlzPWk7ZWxzZSBpZih0eXBlb2Ygbj09ImZ1bmN0aW9uIilzPW4oYSk7ZWxzZSBpZihyKXM9cC5jcmVhdGVFbGVtZW50KHIsYSk7ZWxzZSB0aHJvdyBsfXJldHVybiBwLmNyZWF0ZUVsZW1lbnQoTEwuUHJvdmlkZXIse3ZhbHVlOntkaWRDYXRjaDpvLGVycm9yOmwscmVzZXRFcnJvckJvdW5kYXJ5OnRoaXMucmVzZXRFcnJvckJvdW5kYXJ5fX0scyl9fWZ1bmN0aW9uIGpMKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOltdLHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOltdO3JldHVybiBlLmxlbmd0aCE9PXQubGVuZ3RofHxlLnNvbWUoKG4scik9PiFPYmplY3QuaXMobix0W3JdKSl9Y29uc3QgcWs9IkNvbGxhcHNpYmxlIixbekwsZSRdPWxsKHFrKSxbRkwsSnZdPXpMKHFrKSxCTD1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQ29sbGFwc2libGU6bixvcGVuOnIsZGVmYXVsdE9wZW46aSxkaXNhYmxlZDpvLG9uT3BlbkNoYW5nZTpsLC4uLnN9PWUsW2E9ITEsdV09Z3Moe3Byb3A6cixkZWZhdWx0UHJvcDppLG9uQ2hhbmdlOmx9KTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KEZMLHtzY29wZTpuLGRpc2FibGVkOm8sY29udGVudElkOmpmKCksb3BlbjphLG9uT3BlblRvZ2dsZTpwLnVzZUNhbGxiYWNrKCgpPT51KGM9PiFjKSxbdV0pfSxwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHsiZGF0YS1zdGF0ZSI6cXYoYSksImRhdGEtZGlzYWJsZWQiOm8/IiI6dm9pZCAwfSxzLHtyZWY6dH0pKSl9KSxVTD0iQ29sbGFwc2libGVUcmlnZ2VyIixXTD1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQ29sbGFwc2libGU6biwuLi5yfT1lLGk9SnYoVUwsbik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChLZS5idXR0b24saWUoe3R5cGU6ImJ1dHRvbiIsImFyaWEtY29udHJvbHMiOmkuY29udGVudElkLCJhcmlhLWV4cGFuZGVkIjppLm9wZW58fCExLCJkYXRhLXN0YXRlIjpxdihpLm9wZW4pLCJkYXRhLWRpc2FibGVkIjppLmRpc2FibGVkPyIiOnZvaWQgMCxkaXNhYmxlZDppLmRpc2FibGVkfSxyLHtyZWY6dCxvbkNsaWNrOm50KGUub25DbGljayxpLm9uT3BlblRvZ2dsZSl9KSl9KSx0JD0iQ29sbGFwc2libGVDb250ZW50IixWTD1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtmb3JjZU1vdW50Om4sLi4ucn09ZSxpPUp2KHQkLGUuX19zY29wZUNvbGxhcHNpYmxlKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KEVzLHtwcmVzZW50Om58fGkub3Blbn0sKHtwcmVzZW50Om99KT0+cC5jcmVhdGVFbGVtZW50KEhMLGllKHt9LHIse3JlZjp0LHByZXNlbnQ6b30pKSl9KSxITD1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQ29sbGFwc2libGU6bixwcmVzZW50OnIsY2hpbGRyZW46aSwuLi5vfT1lLGw9SnYodCQsbiksW3MsYV09cC51c2VTdGF0ZShyKSx1PXAudXNlUmVmKG51bGwpLGM9c3QodCx1KSxkPXAudXNlUmVmKDApLGY9ZC5jdXJyZW50LGg9cC51c2VSZWYoMCksbT1oLmN1cnJlbnQsZz1sLm9wZW58fHMsdz1wLnVzZVJlZihnKSx2PXAudXNlUmVmKCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3QgeT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PncuY3VycmVudD0hMSk7cmV0dXJuKCk9PmNhbmNlbEFuaW1hdGlvbkZyYW1lKHkpfSxbXSksVW4oKCk9Pntjb25zdCB5PXUuY3VycmVudDtpZih5KXt2LmN1cnJlbnQ9di5jdXJyZW50fHx7dHJhbnNpdGlvbkR1cmF0aW9uOnkuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uLGFuaW1hdGlvbk5hbWU6eS5zdHlsZS5hbmltYXRpb25OYW1lfSx5LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj0iMHMiLHkuc3R5bGUuYW5pbWF0aW9uTmFtZT0ibm9uZSI7Y29uc3QgXz15LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2QuY3VycmVudD1fLmhlaWdodCxoLmN1cnJlbnQ9Xy53aWR0aCx3LmN1cnJlbnR8fCh5LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj12LmN1cnJlbnQudHJhbnNpdGlvbkR1cmF0aW9uLHkuc3R5bGUuYW5pbWF0aW9uTmFtZT12LmN1cnJlbnQuYW5pbWF0aW9uTmFtZSksYShyKX19LFtsLm9wZW4scl0pLHAuY3JlYXRlRWxlbWVudChLZS5kaXYsaWUoeyJkYXRhLXN0YXRlIjpxdihsLm9wZW4pLCJkYXRhLWRpc2FibGVkIjpsLmRpc2FibGVkPyIiOnZvaWQgMCxpZDpsLmNvbnRlbnRJZCxoaWRkZW46IWd9LG8se3JlZjpjLHN0eWxlOnsiLS1yYWRpeC1jb2xsYXBzaWJsZS1jb250ZW50LWhlaWdodCI6Zj9gJHtmfXB4YDp2b2lkIDAsIi0tcmFkaXgtY29sbGFwc2libGUtY29udGVudC13aWR0aCI6bT9gJHttfXB4YDp2b2lkIDAsLi4uZS5zdHlsZX19KSxnJiZpKX0pO2Z1bmN0aW9uIHF2KGUpe3JldHVybiBlPyJvcGVuIjoiY2xvc2VkIn1jb25zdCBLTD1CTCxaTD1XTCxHTD1WTCxTbz0iQWNjb3JkaW9uIixZTD1bIkhvbWUiLCJFbmQiLCJBcnJvd0Rvd24iLCJBcnJvd1VwIiwiQXJyb3dMZWZ0IiwiQXJyb3dSaWdodCJdLFtleSxYTCxRTF09REMoU28pLFtZZixBSV09bGwoU28sW1FMLGUkXSksdHk9ZSQoKSxuJD1yZS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7dHlwZTpuLC4uLnJ9PWUsaT1yLG89cjtyZXR1cm4gcmUuY3JlYXRlRWxlbWVudChleS5Qcm92aWRlcix7c2NvcGU6ZS5fX3Njb3BlQWNjb3JkaW9ufSxuPT09Im11bHRpcGxlIj9yZS5jcmVhdGVFbGVtZW50KHRJLGllKHt9LG8se3JlZjp0fSkpOnJlLmNyZWF0ZUVsZW1lbnQoZUksaWUoe30saSx7cmVmOnR9KSkpfSk7biQucHJvcFR5cGVzPXt0eXBlKGUpe2NvbnN0IHQ9ZS52YWx1ZXx8ZS5kZWZhdWx0VmFsdWU7cmV0dXJuIGUudHlwZSYmIVsic2luZ2xlIiwibXVsdGlwbGUiXS5pbmNsdWRlcyhlLnR5cGUpP25ldyBFcnJvcigiSW52YWxpZCBwcm9wIGB0eXBlYCBzdXBwbGllZCB0byBgQWNjb3JkaW9uYC4gRXhwZWN0ZWQgb25lIG9mIGBzaW5nbGUgfCBtdWx0aXBsZWAuIik6ZS50eXBlPT09Im11bHRpcGxlIiYmdHlwZW9mIHQ9PSJzdHJpbmciP25ldyBFcnJvcigiSW52YWxpZCBwcm9wIGB0eXBlYCBzdXBwbGllZCB0byBgQWNjb3JkaW9uYC4gRXhwZWN0ZWQgYHNpbmdsZWAgd2hlbiBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIGlzIHR5cGUgYHN0cmluZ2AuIik6ZS50eXBlPT09InNpbmdsZSImJkFycmF5LmlzQXJyYXkodCk/bmV3IEVycm9yKCJJbnZhbGlkIHByb3AgYHR5cGVgIHN1cHBsaWVkIHRvIGBBY2NvcmRpb25gLiBFeHBlY3RlZCBgbXVsdGlwbGVgIHdoZW4gYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBpcyB0eXBlIGBzdHJpbmdbXWAuIik6bnVsbH19O2NvbnN0W3IkLEpMXT1ZZihTbyksW2kkLHFMXT1ZZihTbyx7Y29sbGFwc2libGU6ITF9KSxlST1yZS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7dmFsdWU6bixkZWZhdWx0VmFsdWU6cixvblZhbHVlQ2hhbmdlOmk9KCk9Pnt9LGNvbGxhcHNpYmxlOm89ITEsLi4ubH09ZSxbcyxhXT1ncyh7cHJvcDpuLGRlZmF1bHRQcm9wOnIsb25DaGFuZ2U6aX0pO3JldHVybiByZS5jcmVhdGVFbGVtZW50KHIkLHtzY29wZTplLl9fc2NvcGVBY2NvcmRpb24sdmFsdWU6cz9bc106W10sb25JdGVtT3BlbjphLG9uSXRlbUNsb3NlOnJlLnVzZUNhbGxiYWNrKCgpPT5vJiZhKCIiKSxbbyxhXSl9LHJlLmNyZWF0ZUVsZW1lbnQoaSQse3Njb3BlOmUuX19zY29wZUFjY29yZGlvbixjb2xsYXBzaWJsZTpvfSxyZS5jcmVhdGVFbGVtZW50KG8kLGllKHt9LGwse3JlZjp0fSkpKSl9KSx0ST1yZS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7dmFsdWU6bixkZWZhdWx0VmFsdWU6cixvblZhbHVlQ2hhbmdlOmk9KCk9Pnt9LC4uLm99PWUsW2w9W10sc109Z3Moe3Byb3A6bixkZWZhdWx0UHJvcDpyLG9uQ2hhbmdlOml9KSxhPXJlLnVzZUNhbGxiYWNrKGM9PnMoKGQ9W10pPT5bLi4uZCxjXSksW3NdKSx1PXJlLnVzZUNhbGxiYWNrKGM9PnMoKGQ9W10pPT5kLmZpbHRlcihmPT5mIT09YykpLFtzXSk7cmV0dXJuIHJlLmNyZWF0ZUVsZW1lbnQociQse3Njb3BlOmUuX19zY29wZUFjY29yZGlvbix2YWx1ZTpsLG9uSXRlbU9wZW46YSxvbkl0ZW1DbG9zZTp1fSxyZS5jcmVhdGVFbGVtZW50KGkkLHtzY29wZTplLl9fc2NvcGVBY2NvcmRpb24sY29sbGFwc2libGU6ITB9LHJlLmNyZWF0ZUVsZW1lbnQobyQsaWUoe30sbyx7cmVmOnR9KSkpKX0pLFtuSSxYZl09WWYoU28pLG8kPXJlLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQWNjb3JkaW9uOm4sZGlzYWJsZWQ6cixkaXI6aSxvcmllbnRhdGlvbjpvPSJ2ZXJ0aWNhbCIsLi4ubH09ZSxzPXJlLnVzZVJlZihudWxsKSxhPXN0KHMsdCksdT1YTChuKSxkPUdnKGkpPT09Imx0ciIsZj1udChlLm9uS2V5RG93bixoPT57dmFyIG07aWYoIVlMLmluY2x1ZGVzKGgua2V5KSlyZXR1cm47Y29uc3QgZz1oLnRhcmdldCx3PXUoKS5maWx0ZXIoTj0+e3ZhciBSO3JldHVybiEoKFI9Ti5yZWYuY3VycmVudCkhPT1udWxsJiZSIT09dm9pZCAwJiZSLmRpc2FibGVkKX0pLHY9dy5maW5kSW5kZXgoTj0+Ti5yZWYuY3VycmVudD09PWcpLHk9dy5sZW5ndGg7aWYodj09PS0xKXJldHVybjtoLnByZXZlbnREZWZhdWx0KCk7bGV0IF89djtjb25zdCBTPTAsRT15LTEsJD0oKT0+e189disxLF8+RSYmKF89Uyl9LEM9KCk9PntfPXYtMSxfPFMmJihfPUUpfTtzd2l0Y2goaC5rZXkpe2Nhc2UiSG9tZSI6Xz1TO2JyZWFrO2Nhc2UiRW5kIjpfPUU7YnJlYWs7Y2FzZSJBcnJvd1JpZ2h0IjpvPT09Imhvcml6b250YWwiJiYoZD8kKCk6QygpKTticmVhaztjYXNlIkFycm93RG93biI6bz09PSJ2ZXJ0aWNhbCImJiQoKTticmVhaztjYXNlIkFycm93TGVmdCI6bz09PSJob3Jpem9udGFsIiYmKGQ/QygpOiQoKSk7YnJlYWs7Y2FzZSJBcnJvd1VwIjpvPT09InZlcnRpY2FsIiYmQygpO2JyZWFrfWNvbnN0IFQ9XyV5OyhtPXdbVF0ucmVmLmN1cnJlbnQpPT09bnVsbHx8bT09PXZvaWQgMHx8bS5mb2N1cygpfSk7cmV0dXJuIHJlLmNyZWF0ZUVsZW1lbnQobkkse3Njb3BlOm4sZGlzYWJsZWQ6cixkaXJlY3Rpb246aSxvcmllbnRhdGlvbjpvfSxyZS5jcmVhdGVFbGVtZW50KGV5LlNsb3Qse3Njb3BlOm59LHJlLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHt9LGwseyJkYXRhLW9yaWVudGF0aW9uIjpvLHJlZjphLG9uS2V5RG93bjpyP3ZvaWQgMDpmfSkpKSl9KSxYbT0iQWNjb3JkaW9uSXRlbSIsW3JJLG55XT1ZZihYbSksaUk9cmUuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVBY2NvcmRpb246bix2YWx1ZTpyLC4uLml9PWUsbz1YZihYbSxuKSxsPUpMKFhtLG4pLHM9dHkobiksYT1qZigpLHU9ciYmbC52YWx1ZS5pbmNsdWRlcyhyKXx8ITEsYz1vLmRpc2FibGVkfHxlLmRpc2FibGVkO3JldHVybiByZS5jcmVhdGVFbGVtZW50KHJJLHtzY29wZTpuLG9wZW46dSxkaXNhYmxlZDpjLHRyaWdnZXJJZDphfSxyZS5jcmVhdGVFbGVtZW50KEtMLGllKHsiZGF0YS1vcmllbnRhdGlvbiI6by5vcmllbnRhdGlvbiwiZGF0YS1zdGF0ZSI6bCQodSl9LHMsaSx7cmVmOnQsZGlzYWJsZWQ6YyxvcGVuOnUsb25PcGVuQ2hhbmdlOmQ9PntkP2wub25JdGVtT3BlbihyKTpsLm9uSXRlbUNsb3NlKHIpfX0pKSl9KSxvST0iQWNjb3JkaW9uSGVhZGVyIixsST1yZS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZUFjY29yZGlvbjpuLC4uLnJ9PWUsaT1YZihTbyxuKSxvPW55KG9JLG4pO3JldHVybiByZS5jcmVhdGVFbGVtZW50KEtlLmgzLGllKHsiZGF0YS1vcmllbnRhdGlvbiI6aS5vcmllbnRhdGlvbiwiZGF0YS1zdGF0ZSI6bCQoby5vcGVuKSwiZGF0YS1kaXNhYmxlZCI6by5kaXNhYmxlZD8iIjp2b2lkIDB9LHIse3JlZjp0fSkpfSkseV89IkFjY29yZGlvblRyaWdnZXIiLHNJPXJlLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQWNjb3JkaW9uOm4sLi4ucn09ZSxpPVhmKFNvLG4pLG89bnkoeV8sbiksbD1xTCh5XyxuKSxzPXR5KG4pO3JldHVybiByZS5jcmVhdGVFbGVtZW50KGV5Lkl0ZW1TbG90LHtzY29wZTpufSxyZS5jcmVhdGVFbGVtZW50KFpMLGllKHsiYXJpYS1kaXNhYmxlZCI6by5vcGVuJiYhbC5jb2xsYXBzaWJsZXx8dm9pZCAwLCJkYXRhLW9yaWVudGF0aW9uIjppLm9yaWVudGF0aW9uLGlkOm8udHJpZ2dlcklkfSxzLHIse3JlZjp0fSkpKX0pLGFJPSJBY2NvcmRpb25Db250ZW50Iix1ST1yZS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZUFjY29yZGlvbjpuLC4uLnJ9PWUsaT1YZihTbyxuKSxvPW55KGFJLG4pLGw9dHkobik7cmV0dXJuIHJlLmNyZWF0ZUVsZW1lbnQoR0wsaWUoe3JvbGU6InJlZ2lvbiIsImFyaWEtbGFiZWxsZWRieSI6by50cmlnZ2VySWQsImRhdGEtb3JpZW50YXRpb24iOmkub3JpZW50YXRpb259LGwscix7cmVmOnQsc3R5bGU6eyItLXJhZGl4LWFjY29yZGlvbi1jb250ZW50LWhlaWdodCI6InZhcigtLXJhZGl4LWNvbGxhcHNpYmxlLWNvbnRlbnQtaGVpZ2h0KSIsIi0tcmFkaXgtYWNjb3JkaW9uLWNvbnRlbnQtd2lkdGgiOiJ2YXIoLS1yYWRpeC1jb2xsYXBzaWJsZS1jb250ZW50LXdpZHRoKSIsLi4uZS5zdHlsZX19KSl9KTtmdW5jdGlvbiBsJChlKXtyZXR1cm4gZT8ib3BlbiI6ImNsb3NlZCJ9Y29uc3QgY0k9biQsZEk9aUksZkk9bEkscyQ9c0ksYSQ9dUksaEk9Y0ksdSQ9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsLi4udH0sbik9PnguanN4KGRJLHtyZWY6bixjbGFzc05hbWU6eHQoImJvcmRlci1iIixlKSwuLi50fSkpO3UkLmRpc3BsYXlOYW1lPSJBY2NvcmRpb25JdGVtIjtjb25zdCBjJD1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSxjaGlsZHJlbjp0LC4uLm59LHIpPT54LmpzeChmSSx7Y2xhc3NOYW1lOiJmbGV4IixjaGlsZHJlbjp4LmpzeHMocyQse3JlZjpyLGNsYXNzTmFtZTp4dCgiZmxleCBmbGV4LTEgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBweS00IGZvbnQtbWVkaXVtIHRyYW5zaXRpb24tYWxsIGhvdmVyOnVuZGVybGluZSBbJltkYXRhLXN0YXRlPW9wZW5dPnN2Z106cm90YXRlLTE4MCIsZSksLi4ubixjaGlsZHJlbjpbdCx4LmpzeChrQyx7Y2xhc3NOYW1lOiJ3LTQgaC00IHRyYW5zaXRpb24tdHJhbnNmb3JtIGR1cmF0aW9uLTIwMCBzaHJpbmstMCJ9KV19KX0pKTtjJC5kaXNwbGF5TmFtZT1zJC5kaXNwbGF5TmFtZTtjb25zdCBkJD1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSxjaGlsZHJlbjp0LC4uLm59LHIpPT54LmpzeChhJCx7cmVmOnIsY2xhc3NOYW1lOnh0KCJvdmVyZmxvdy1oaWRkZW4gdGV4dC1zbSB0cmFuc2l0aW9uLWFsbCBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtYWNjb3JkaW9uLXVwIGRhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtYWNjb3JkaW9uLWRvd24iLGUpLC4uLm4sY2hpbGRyZW46eC5qc3goImRpdiIse2NsYXNzTmFtZToicHQtMCBwYi00IixjaGlsZHJlbjp0fSl9KSk7ZCQuZGlzcGxheU5hbWU9YSQuZGlzcGxheU5hbWU7LyoqCiAqIFJlYWN0IFJvdXRlciBET00gdjYuMjAuMAogKgogKiBDb3B5cmlnaHQgKGMpIFJlbWl4IFNvZnR3YXJlIEluYy4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UubWQgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICoKICogQGxpY2Vuc2UgTUlUCiAqL2Z1bmN0aW9uIHRmKCl7cmV0dXJuIHRmPU9iamVjdC5hc3NpZ24/T2JqZWN0LmFzc2lnbi5iaW5kKCk6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sdGYuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIHBJKGUsdCl7cmV0dXJuIFhEKHtiYXNlbmFtZTp0PT1udWxsP3ZvaWQgMDp0LmJhc2VuYW1lLGZ1dHVyZTp0Zih7fSx0PT1udWxsP3ZvaWQgMDp0LmZ1dHVyZSx7djdfcHJlcGVuZEJhc2VuYW1lOiEwfSksaGlzdG9yeTp5RCh7d2luZG93OnQ9PW51bGw/dm9pZCAwOnQud2luZG93fSksaHlkcmF0aW9uRGF0YToodD09bnVsbD92b2lkIDA6dC5oeWRyYXRpb25EYXRhKXx8bUkoKSxyb3V0ZXM6ZSxtYXBSb3V0ZVByb3BlcnRpZXM6RUwsd2luZG93OnQ9PW51bGw/dm9pZCAwOnQud2luZG93fSkuaW5pdGlhbGl6ZSgpfWZ1bmN0aW9uIG1JKCl7dmFyIGU7bGV0IHQ9KGU9d2luZG93KT09bnVsbD92b2lkIDA6ZS5fX3N0YXRpY1JvdXRlckh5ZHJhdGlvbkRhdGE7cmV0dXJuIHQmJnQuZXJyb3JzJiYodD10Zih7fSx0LHtlcnJvcnM6Z0kodC5lcnJvcnMpfSkpLHR9ZnVuY3Rpb24gZ0koZSl7aWYoIWUpcmV0dXJuIG51bGw7bGV0IHQ9T2JqZWN0LmVudHJpZXMoZSksbj17fTtmb3IobGV0W3IsaV1vZiB0KWlmKGkmJmkuX190eXBlPT09IlJvdXRlRXJyb3JSZXNwb25zZSIpbltyXT1uZXcgR3YoaS5zdGF0dXMsaS5zdGF0dXNUZXh0LGkuZGF0YSxpLmludGVybmFsPT09ITApO2Vsc2UgaWYoaSYmaS5fX3R5cGU9PT0iRXJyb3IiKXtpZihpLl9fc3ViVHlwZSl7bGV0IG89d2luZG93W2kuX19zdWJUeXBlXTtpZih0eXBlb2Ygbz09ImZ1bmN0aW9uIil0cnl7bGV0IGw9bmV3IG8oaS5tZXNzYWdlKTtsLnN0YWNrPSIiLG5bcl09bH1jYXRjaHt9fWlmKG5bcl09PW51bGwpe2xldCBvPW5ldyBFcnJvcihpLm1lc3NhZ2UpO28uc3RhY2s9IiIsbltyXT1vfX1lbHNlIG5bcl09aTtyZXR1cm4gbn1jb25zdCB2ST1wLmNyZWF0ZUNvbnRleHQoe2lzVHJhbnNpdGlvbmluZzohMX0pLHlJPXAuY3JlYXRlQ29udGV4dChuZXcgTWFwKSx4ST0ic3RhcnRUcmFuc2l0aW9uIix4Xz1QX1t4SV0sX0k9ImZsdXNoU3luYyIsX189alRbX0ldO2Z1bmN0aW9uIHdJKGUpe3hfP3hfKGUpOmUoKX1mdW5jdGlvbiBvYShlKXtfXz9fXyhlKTplKCl9Y2xhc3MgU0l7Y29uc3RydWN0b3IoKXt0aGlzLnN0YXR1cz0icGVuZGluZyIsdGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKCh0LG4pPT57dGhpcy5yZXNvbHZlPXI9Pnt0aGlzLnN0YXR1cz09PSJwZW5kaW5nIiYmKHRoaXMuc3RhdHVzPSJyZXNvbHZlZCIsdChyKSl9LHRoaXMucmVqZWN0PXI9Pnt0aGlzLnN0YXR1cz09PSJwZW5kaW5nIiYmKHRoaXMuc3RhdHVzPSJyZWplY3RlZCIsbihyKSl9fSl9fWZ1bmN0aW9uIEVJKGUpe2xldHtmYWxsYmFja0VsZW1lbnQ6dCxyb3V0ZXI6bixmdXR1cmU6cn09ZSxbaSxvXT1wLnVzZVN0YXRlKG4uc3RhdGUpLFtsLHNdPXAudXNlU3RhdGUoKSxbYSx1XT1wLnVzZVN0YXRlKHtpc1RyYW5zaXRpb25pbmc6ITF9KSxbYyxkXT1wLnVzZVN0YXRlKCksW2YsaF09cC51c2VTdGF0ZSgpLFttLGddPXAudXNlU3RhdGUoKSx3PXAudXNlUmVmKG5ldyBNYXApLHt2N19zdGFydFRyYW5zaXRpb246dn09cnx8e30seT1wLnVzZUNhbGxiYWNrKEM9Pnt2P3dJKEMpOkMoKX0sW3ZdKSxfPXAudXNlQ2FsbGJhY2soKEMsVCk9PntsZXR7ZGVsZXRlZEZldGNoZXJzOk4sdW5zdGFibGVfZmx1c2hTeW5jOlIsdW5zdGFibGVfdmlld1RyYW5zaXRpb25PcHRzOkR9PVQ7Ti5mb3JFYWNoKHNlPT53LmN1cnJlbnQuZGVsZXRlKHNlKSksQy5mZXRjaGVycy5mb3JFYWNoKChzZSxWKT0+e3NlLmRhdGEhPT12b2lkIDAmJncuY3VycmVudC5zZXQoVixzZS5kYXRhKX0pO2xldCBGPW4ud2luZG93PT1udWxsfHx0eXBlb2Ygbi53aW5kb3cuZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbiE9ImZ1bmN0aW9uIjtpZighRHx8Ril7Uj9vYSgoKT0+byhDKSk6eSgoKT0+byhDKSk7cmV0dXJufWlmKFIpe29hKCgpPT57ZiYmKGMmJmMucmVzb2x2ZSgpLGYuc2tpcFRyYW5zaXRpb24oKSksdSh7aXNUcmFuc2l0aW9uaW5nOiEwLGZsdXNoU3luYzohMCxjdXJyZW50TG9jYXRpb246RC5jdXJyZW50TG9jYXRpb24sbmV4dExvY2F0aW9uOkQubmV4dExvY2F0aW9ufSl9KTtsZXQgc2U9bi53aW5kb3cuZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbigoKT0+e29hKCgpPT5vKEMpKX0pO3NlLmZpbmlzaGVkLmZpbmFsbHkoKCk9PntvYSgoKT0+e2Qodm9pZCAwKSxoKHZvaWQgMCkscyh2b2lkIDApLHUoe2lzVHJhbnNpdGlvbmluZzohMX0pfSl9KSxvYSgoKT0+aChzZSkpO3JldHVybn1mPyhjJiZjLnJlc29sdmUoKSxmLnNraXBUcmFuc2l0aW9uKCksZyh7c3RhdGU6QyxjdXJyZW50TG9jYXRpb246RC5jdXJyZW50TG9jYXRpb24sbmV4dExvY2F0aW9uOkQubmV4dExvY2F0aW9ufSkpOihzKEMpLHUoe2lzVHJhbnNpdGlvbmluZzohMCxmbHVzaFN5bmM6ITEsY3VycmVudExvY2F0aW9uOkQuY3VycmVudExvY2F0aW9uLG5leHRMb2NhdGlvbjpELm5leHRMb2NhdGlvbn0pKX0sW24ud2luZG93LGYsYyx3LHldKTtwLnVzZUxheW91dEVmZmVjdCgoKT0+bi5zdWJzY3JpYmUoXyksW24sX10pLHAudXNlRWZmZWN0KCgpPT57YS5pc1RyYW5zaXRpb25pbmcmJiFhLmZsdXNoU3luYyYmZChuZXcgU0kpfSxbYV0pLHAudXNlRWZmZWN0KCgpPT57aWYoYyYmbCYmbi53aW5kb3cpe2xldCBDPWwsVD1jLnByb21pc2UsTj1uLndpbmRvdy5kb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGFzeW5jKCk9Pnt5KCgpPT5vKEMpKSxhd2FpdCBUfSk7Ti5maW5pc2hlZC5maW5hbGx5KCgpPT57ZCh2b2lkIDApLGgodm9pZCAwKSxzKHZvaWQgMCksdSh7aXNUcmFuc2l0aW9uaW5nOiExfSl9KSxoKE4pfX0sW3ksbCxjLG4ud2luZG93XSkscC51c2VFZmZlY3QoKCk9PntjJiZsJiZpLmxvY2F0aW9uLmtleT09PWwubG9jYXRpb24ua2V5JiZjLnJlc29sdmUoKX0sW2MsZixpLmxvY2F0aW9uLGxdKSxwLnVzZUVmZmVjdCgoKT0+eyFhLmlzVHJhbnNpdGlvbmluZyYmbSYmKHMobS5zdGF0ZSksdSh7aXNUcmFuc2l0aW9uaW5nOiEwLGZsdXNoU3luYzohMSxjdXJyZW50TG9jYXRpb246bS5jdXJyZW50TG9jYXRpb24sbmV4dExvY2F0aW9uOm0ubmV4dExvY2F0aW9ufSksZyh2b2lkIDApKX0sW2EuaXNUcmFuc2l0aW9uaW5nLG1dKTtsZXQgUz1wLnVzZU1lbW8oKCk9Pih7Y3JlYXRlSHJlZjpuLmNyZWF0ZUhyZWYsZW5jb2RlTG9jYXRpb246bi5lbmNvZGVMb2NhdGlvbixnbzpDPT5uLm5hdmlnYXRlKEMpLHB1c2g6KEMsVCxOKT0+bi5uYXZpZ2F0ZShDLHtzdGF0ZTpULHByZXZlbnRTY3JvbGxSZXNldDpOPT1udWxsP3ZvaWQgMDpOLnByZXZlbnRTY3JvbGxSZXNldH0pLHJlcGxhY2U6KEMsVCxOKT0+bi5uYXZpZ2F0ZShDLHtyZXBsYWNlOiEwLHN0YXRlOlQscHJldmVudFNjcm9sbFJlc2V0Ok49PW51bGw/dm9pZCAwOk4ucHJldmVudFNjcm9sbFJlc2V0fSl9KSxbbl0pLEU9bi5iYXNlbmFtZXx8Ii8iLCQ9cC51c2VNZW1vKCgpPT4oe3JvdXRlcjpuLG5hdmlnYXRvcjpTLHN0YXRpYzohMSxiYXNlbmFtZTpFfSksW24sUyxFXSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwscC5jcmVhdGVFbGVtZW50KEhmLlByb3ZpZGVyLHt2YWx1ZTokfSxwLmNyZWF0ZUVsZW1lbnQoQmsuUHJvdmlkZXIse3ZhbHVlOml9LHAuY3JlYXRlRWxlbWVudCh5SS5Qcm92aWRlcix7dmFsdWU6dy5jdXJyZW50fSxwLmNyZWF0ZUVsZW1lbnQodkkuUHJvdmlkZXIse3ZhbHVlOmF9LHAuY3JlYXRlRWxlbWVudChTTCx7YmFzZW5hbWU6RSxsb2NhdGlvbjppLmxvY2F0aW9uLG5hdmlnYXRpb25UeXBlOmkuaGlzdG9yeUFjdGlvbixuYXZpZ2F0b3I6U30saS5pbml0aWFsaXplZD9wLmNyZWF0ZUVsZW1lbnQoQ0kse3JvdXRlczpuLnJvdXRlcyxzdGF0ZTppfSk6dCkpKSkpLG51bGwpfWZ1bmN0aW9uIENJKGUpe2xldHtyb3V0ZXM6dCxzdGF0ZTpufT1lO3JldHVybiBkTCh0LHZvaWQgMCxuKX12YXIgd187KGZ1bmN0aW9uKGUpe2UuVXNlU2Nyb2xsUmVzdG9yYXRpb249InVzZVNjcm9sbFJlc3RvcmF0aW9uIixlLlVzZVN1Ym1pdD0idXNlU3VibWl0IixlLlVzZVN1Ym1pdEZldGNoZXI9InVzZVN1Ym1pdEZldGNoZXIiLGUuVXNlRmV0Y2hlcj0idXNlRmV0Y2hlciIsZS51c2VWaWV3VHJhbnNpdGlvblN0YXRlPSJ1c2VWaWV3VHJhbnNpdGlvblN0YXRlIn0pKHdffHwod189e30pKTt2YXIgU187KGZ1bmN0aW9uKGUpe2UuVXNlRmV0Y2hlcj0idXNlRmV0Y2hlciIsZS5Vc2VGZXRjaGVycz0idXNlRmV0Y2hlcnMiLGUuVXNlU2Nyb2xsUmVzdG9yYXRpb249InVzZVNjcm9sbFJlc3RvcmF0aW9uIn0pKFNffHwoU189e30pKTtmdW5jdGlvbiBrSSh7ZXJyb3I6ZSxyZXNldEVycm9yQm91bmRhcnk6dH0pe3JldHVybiBjb25zb2xlLmVycm9yKGUpLHguanN4KCJkaXYiLHtjbGFzc05hbWU6ImFic29sdXRlIHRvcC0wIGxlZnQtMCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LXNjcmVlbiBoLXNjcmVlbiBiZy1jYXJkLWZvcmVncm91bmQiLGNoaWxkcmVuOnguanN4KCJkaXYiLHtjbGFzc05hbWU6InctZnVsbCBoLWZ1bGwgcC0xMCIsY2hpbGRyZW46eC5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InctZnVsbCBoLWZ1bGwgcC0xMCBiZy1jYXJkIHRleHQtcHJpbWFyeSIsY2hpbGRyZW46W3guanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4iLGNoaWxkcmVuOlt4LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLVswLjVlbV0gdGV4dC1sZyBmb250LWJvbGQgdGV4dC1jZW50ZXIgcHktMiIsY2hpbGRyZW46W3guanN4KGtrLHt9KSwiIGVuY291bnRlcmVkIGFuIGVycm9yIl19KSx4LmpzeCgiYnV0dG9uIix7b25DbGljazp0LGNoaWxkcmVuOnguanN4KHM1LHt9KX0pXX0pLHguanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQtNHhsIGZvbnQtbm9ybWFsICIsY2hpbGRyZW46Ik1lc3NhZ2U6In0pLHguanN4KCJwcmUiLHtjaGlsZHJlbjplLm1lc3NhZ2V9KSxlLnN0YWNrJiZ4LmpzeChoSSx7dHlwZToic2luZ2xlIixjbGFzc05hbWU6ImZvbnQtc2VyaWYiLGNvbGxhcHNpYmxlOiEwLGRlZmF1bHRWYWx1ZToiZXJyb3IiLGNoaWxkcmVuOnguanN4cyh1JCx7dmFsdWU6ImVycm9yIixjaGlsZHJlbjpbeC5qc3goYyQse2NoaWxkcmVuOiJTdGFjayB0cmFjZToifSkseC5qc3goZCQse2NsYXNzTmFtZToicC00IGJnLXBvcG92ZXIgdGV4dC1wb3BvdmVyLWZvcmVncm91bmQiLGNoaWxkcmVuOmUuc3RhY2smJnguanN4KCJwcmUiLHtjaGlsZHJlbjplLnN0YWNrfSl9KV19KX0pXX0pfSl9KX1mdW5jdGlvbiAkSSgpe2NvbnN0IGU9cEkoW3twYXRoOiIvKiIsZWxlbWVudDp4LmpzeChJTCx7ZmFsbGJhY2tSZW5kZXI6a0ksY2hpbGRyZW46eC5qc3goa0wse2FwaTpuZXcgSE4oIi9hcGkvdmFsIil9KX0pfV0se2Jhc2VuYW1lOiIvYXBpL3ZhbC9zdGF0aWMvZWRpdCJ9KTtyZXR1cm4geC5qc3goRUkse3JvdXRlcjplfSl9UWguY3JlYXRlUm9vdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicm9vdCIpKS5yZW5kZXIocmUuY3JlYXRlRWxlbWVudChyZS5TdHJpY3RNb2RlLG51bGwscmUuY3JlYXRlRWxlbWVudCgkSSxudWxsKSkpOwo=","/assets/index-Ol9liWWf.css":"Kiw6YmVmb3JlLDphZnRlcntib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym9yZGVyLXdpZHRoOjA7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1jb2xvcjojZTVlN2VifTpiZWZvcmUsOmFmdGVyey0tdHctY29udGVudDogIiJ9aHRtbHtsaW5lLWhlaWdodDoxLjU7LXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OjEwMCU7LW1vei10YWItc2l6ZTo0Oy1vLXRhYi1zaXplOjQ7dGFiLXNpemU6NDtmb250LWZhbWlseTpSb2JvdG8sc2Fucy1zZXJpZjtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWF0aW9uLXNldHRpbmdzOm5vcm1hbH1ib2R5e21hcmdpbjowO2xpbmUtaGVpZ2h0OmluaGVyaXR9aHJ7aGVpZ2h0OjA7Y29sb3I6aW5oZXJpdDtib3JkZXItdG9wLXdpZHRoOjFweH1hYmJyOndoZXJlKFt0aXRsZV0pey13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWQ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWR9aDEsaDIsaDMsaDQsaDUsaDZ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6aW5oZXJpdH1he2NvbG9yOmluaGVyaXQ7dGV4dC1kZWNvcmF0aW9uOmluaGVyaXR9YixzdHJvbmd7Zm9udC13ZWlnaHQ6Ym9sZGVyfWNvZGUsa2JkLHNhbXAscHJle2ZvbnQtZmFtaWx5OnVpLW1vbm9zcGFjZSxTRk1vbm8tUmVndWxhcixNZW5sbyxNb25hY28sQ29uc29sYXMsTGliZXJhdGlvbiBNb25vLENvdXJpZXIgTmV3LG1vbm9zcGFjZTtmb250LXNpemU6MWVtfXNtYWxse2ZvbnQtc2l6ZTo4MCV9c3ViLHN1cHtmb250LXNpemU6NzUlO2xpbmUtaGVpZ2h0OjA7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9c3Vie2JvdHRvbTotLjI1ZW19c3Vwe3RvcDotLjVlbX10YWJsZXt0ZXh0LWluZGVudDowO2JvcmRlci1jb2xvcjppbmhlcml0O2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZX1idXR0b24saW5wdXQsb3B0Z3JvdXAsc2VsZWN0LHRleHRhcmVhe2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1mZWF0dXJlLXNldHRpbmdzOmluaGVyaXQ7Zm9udC12YXJpYXRpb24tc2V0dGluZ3M6aW5oZXJpdDtmb250LXNpemU6MTAwJTtmb250LXdlaWdodDppbmhlcml0O2xpbmUtaGVpZ2h0OmluaGVyaXQ7Y29sb3I6aW5oZXJpdDttYXJnaW46MDtwYWRkaW5nOjB9YnV0dG9uLHNlbGVjdHt0ZXh0LXRyYW5zZm9ybTpub25lfWJ1dHRvbixbdHlwZT1idXR0b25dLFt0eXBlPXJlc2V0XSxbdHlwZT1zdWJtaXRdey13ZWJraXQtYXBwZWFyYW5jZTpidXR0b247YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9Oi1tb3otZm9jdXNyaW5ne291dGxpbmU6YXV0b306LW1vei11aS1pbnZhbGlke2JveC1zaGFkb3c6bm9uZX1wcm9ncmVzc3t2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9ue2hlaWdodDphdXRvfVt0eXBlPXNlYXJjaF17LXdlYmtpdC1hcHBlYXJhbmNlOnRleHRmaWVsZDtvdXRsaW5lLW9mZnNldDotMnB4fTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZX06Oi13ZWJraXQtZmlsZS11cGxvYWQtYnV0dG9uey13ZWJraXQtYXBwZWFyYW5jZTpidXR0b247Zm9udDppbmhlcml0fXN1bW1hcnl7ZGlzcGxheTpsaXN0LWl0ZW19YmxvY2txdW90ZSxkbCxkZCxoMSxoMixoMyxoNCxoNSxoNixocixmaWd1cmUscCxwcmV7bWFyZ2luOjB9ZmllbGRzZXR7bWFyZ2luOjA7cGFkZGluZzowfWxlZ2VuZHtwYWRkaW5nOjB9b2wsdWwsbWVudXtsaXN0LXN0eWxlOm5vbmU7bWFyZ2luOjA7cGFkZGluZzowfWRpYWxvZ3twYWRkaW5nOjB9dGV4dGFyZWF7cmVzaXplOnZlcnRpY2FsfWlucHV0OjotbW96LXBsYWNlaG9sZGVyLHRleHRhcmVhOjotbW96LXBsYWNlaG9sZGVye29wYWNpdHk6MTtjb2xvcjojOWNhM2FmfWlucHV0OjpwbGFjZWhvbGRlcix0ZXh0YXJlYTo6cGxhY2Vob2xkZXJ7b3BhY2l0eToxO2NvbG9yOiM5Y2EzYWZ9YnV0dG9uLFtyb2xlPWJ1dHRvbl17Y3Vyc29yOnBvaW50ZXJ9OmRpc2FibGVke2N1cnNvcjpkZWZhdWx0fWltZyxzdmcsdmlkZW8sY2FudmFzLGF1ZGlvLGlmcmFtZSxlbWJlZCxvYmplY3R7ZGlzcGxheTpibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9aW1nLHZpZGVve21heC13aWR0aDoxMDAlO2hlaWdodDphdXRvfVtoaWRkZW5de2Rpc3BsYXk6bm9uZX06aG9zdHstLWJhY2tncm91bmQ6IDAgMCUgMTAwJTstLWZvcmVncm91bmQ6IDIyMi4yIDg0JSA0LjklOy0tY2FyZDogMCAwJSAxMDAlOy0tY2FyZC1mb3JlZ3JvdW5kOiAyMjIuMiA4NCUgNC45JTstLXBvcG92ZXI6IDAgMCUgMTAwJTstLXBvcG92ZXItZm9yZWdyb3VuZDogMjIyLjIgODQlIDQuOSU7LS1wcmltYXJ5OiAyMjIuMiA0Ny40JSAxMS4yJTstLXByaW1hcnktZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1zZWNvbmRhcnk6IDIxMCA0MCUgOTYuMSU7LS1zZWNvbmRhcnktZm9yZWdyb3VuZDogMjIyLjIgNDcuNCUgMTEuMiU7LS1tdXRlZDogMCAwJSA1Ny4zJTstLW11dGVkLWZvcmVncm91bmQ6IDIxNS40IDE2LjMlIDQ2LjklOy0tYWNjZW50OiAxNTksIDYwJSwgNTElLCAxOy0tYWNjZW50LWZvcmVncm91bmQ6IDIyMi4yIDQ3LjQlIDExLjIlOy0tZGVzdHJ1Y3RpdmU6IDAgODQuMiUgNjAuMiU7LS1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kOiAyMTAgNDAlIDk4JTstLWJvcmRlcjogMjE0LjMgMzEuOCUgOTEuNCU7LS1pbnB1dDogMjE0LjMgMzEuOCUgOTEuNCU7LS1yaW5nOiAyMjIuMiA4NCUgNC45JTstLXJhZGl1czogLjVyZW19OnJvb3R7LS1iYWNrZ3JvdW5kOiAwIDAlIDEwMCU7LS1mb3JlZ3JvdW5kOiAyMjIuMiA4NCUgNC45JTstLWNhcmQ6IDAgMCUgMTAwJTstLWNhcmQtZm9yZWdyb3VuZDogMjIyLjIgODQlIDQuOSU7LS1wb3BvdmVyOiAwIDAlIDEwMCU7LS1wb3BvdmVyLWZvcmVncm91bmQ6IDIyMi4yIDg0JSA0LjklOy0tcHJpbWFyeTogMjIyLjIgNDcuNCUgMTEuMiU7LS1wcmltYXJ5LWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tc2Vjb25kYXJ5OiAyMTAgNDAlIDk2LjElOy0tc2Vjb25kYXJ5LWZvcmVncm91bmQ6IDIyMi4yIDQ3LjQlIDExLjIlOy0tbXV0ZWQ6IDAgMCUgNTcuMyU7LS1tdXRlZC1mb3JlZ3JvdW5kOiAyMTUuNCAxNi4zJSA0Ni45JTstLWFjY2VudDogMTU5LCA2MCUsIDUxJSwgMTstLWFjY2VudC1mb3JlZ3JvdW5kOiAyMjIuMiA0Ny40JSAxMS4yJTstLWRlc3RydWN0aXZlOiAwIDg0LjIlIDYwLjIlOy0tZGVzdHJ1Y3RpdmUtZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1ib3JkZXI6IDIxNC4zIDMxLjglIDkxLjQlOy0taW5wdXQ6IDIxNC4zIDMxLjglIDkxLjQlOy0tcmluZzogMjIyLjIgODQlIDQuOSU7LS1yYWRpdXM6IC41cmVtfSpbZGF0YS1tb2RlPWRhcmtdey0tYmFja2dyb3VuZDogMCAwJSA0JTstLWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tY2FyZDogMjIyLjIgODQlIDQuOSU7LS1jYXJkLWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tcG9wb3ZlcjogMjIyLjIgODQlIDQuOSU7LS1wb3BvdmVyLWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tcHJpbWFyeTogMjEwIDQwJSA5OCU7LS1wcmltYXJ5LWZvcmVncm91bmQ6IDIyMi4yIDQ3LjQlIDExLjIlOy0tc2Vjb25kYXJ5OiAyMTcuMiAzMi42JSAxNy41JTstLXNlY29uZGFyeS1mb3JlZ3JvdW5kOiAyMTAgNDAlIDk4JTstLW11dGVkOiAxNzgsIDIzJSwgNzYlLCAxOy0tbXV0ZWQtZm9yZWdyb3VuZDogMjE1IDIwLjIlIDY1LjElOy0tYWNjZW50OiAxNTksIDYwJSwgNTElLCAxOy0tYWNjZW50LWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tZGVzdHJ1Y3RpdmU6IDAgNjIuOCUgMzAuNiU7LS1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kOiAyMTAgNDAlIDk4JTstLWJvcmRlcjogMjE3LjIgMzIuNiUgMTcuNSU7LS1pbnB1dDogMjE3LjIgMzIuNiUgMTcuNSU7LS1yaW5nOiAyMTIuNyAyNi44JSA4My45JX0qe2JvcmRlci1jb2xvcjpoc2wodmFyKC0tYm9yZGVyKSl9Ym9keXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSk7Y29sb3I6aHNsKHZhcigtLWZvcmVncm91bmQpKX0qLDpiZWZvcmUsOmFmdGVyey0tdHctYm9yZGVyLXNwYWNpbmcteDogMDstLXR3LWJvcmRlci1zcGFjaW5nLXk6IDA7LS10dy10cmFuc2xhdGUteDogMDstLXR3LXRyYW5zbGF0ZS15OiAwOy0tdHctcm90YXRlOiAwOy0tdHctc2tldy14OiAwOy0tdHctc2tldy15OiAwOy0tdHctc2NhbGUteDogMTstLXR3LXNjYWxlLXk6IDE7LS10dy1wYW4teDogOy0tdHctcGFuLXk6IDstLXR3LXBpbmNoLXpvb206IDstLXR3LXNjcm9sbC1zbmFwLXN0cmljdG5lc3M6IHByb3hpbWl0eTstLXR3LWdyYWRpZW50LWZyb20tcG9zaXRpb246IDstLXR3LWdyYWRpZW50LXZpYS1wb3NpdGlvbjogOy0tdHctZ3JhZGllbnQtdG8tcG9zaXRpb246IDstLXR3LW9yZGluYWw6IDstLXR3LXNsYXNoZWQtemVybzogOy0tdHctbnVtZXJpYy1maWd1cmU6IDstLXR3LW51bWVyaWMtc3BhY2luZzogOy0tdHctbnVtZXJpYy1mcmFjdGlvbjogOy0tdHctcmluZy1pbnNldDogOy0tdHctcmluZy1vZmZzZXQtd2lkdGg6IDBweDstLXR3LXJpbmctb2Zmc2V0LWNvbG9yOiAjZmZmOy0tdHctcmluZy1jb2xvcjogcmdiKDU5IDEzMCAyNDYgLyAuNSk7LS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IDAgMCAjMDAwMDstLXR3LXJpbmctc2hhZG93OiAwIDAgIzAwMDA7LS10dy1zaGFkb3c6IDAgMCAjMDAwMDstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDAgIzAwMDA7LS10dy1ibHVyOiA7LS10dy1icmlnaHRuZXNzOiA7LS10dy1jb250cmFzdDogOy0tdHctZ3JheXNjYWxlOiA7LS10dy1odWUtcm90YXRlOiA7LS10dy1pbnZlcnQ6IDstLXR3LXNhdHVyYXRlOiA7LS10dy1zZXBpYTogOy0tdHctZHJvcC1zaGFkb3c6IDstLXR3LWJhY2tkcm9wLWJsdXI6IDstLXR3LWJhY2tkcm9wLWJyaWdodG5lc3M6IDstLXR3LWJhY2tkcm9wLWNvbnRyYXN0OiA7LS10dy1iYWNrZHJvcC1ncmF5c2NhbGU6IDstLXR3LWJhY2tkcm9wLWh1ZS1yb3RhdGU6IDstLXR3LWJhY2tkcm9wLWludmVydDogOy0tdHctYmFja2Ryb3Atb3BhY2l0eTogOy0tdHctYmFja2Ryb3Atc2F0dXJhdGU6IDstLXR3LWJhY2tkcm9wLXNlcGlhOiB9OjpiYWNrZHJvcHstLXR3LWJvcmRlci1zcGFjaW5nLXg6IDA7LS10dy1ib3JkZXItc3BhY2luZy15OiAwOy0tdHctdHJhbnNsYXRlLXg6IDA7LS10dy10cmFuc2xhdGUteTogMDstLXR3LXJvdGF0ZTogMDstLXR3LXNrZXcteDogMDstLXR3LXNrZXcteTogMDstLXR3LXNjYWxlLXg6IDE7LS10dy1zY2FsZS15OiAxOy0tdHctcGFuLXg6IDstLXR3LXBhbi15OiA7LS10dy1waW5jaC16b29tOiA7LS10dy1zY3JvbGwtc25hcC1zdHJpY3RuZXNzOiBwcm94aW1pdHk7LS10dy1ncmFkaWVudC1mcm9tLXBvc2l0aW9uOiA7LS10dy1ncmFkaWVudC12aWEtcG9zaXRpb246IDstLXR3LWdyYWRpZW50LXRvLXBvc2l0aW9uOiA7LS10dy1vcmRpbmFsOiA7LS10dy1zbGFzaGVkLXplcm86IDstLXR3LW51bWVyaWMtZmlndXJlOiA7LS10dy1udW1lcmljLXNwYWNpbmc6IDstLXR3LW51bWVyaWMtZnJhY3Rpb246IDstLXR3LXJpbmctaW5zZXQ6IDstLXR3LXJpbmctb2Zmc2V0LXdpZHRoOiAwcHg7LS10dy1yaW5nLW9mZnNldC1jb2xvcjogI2ZmZjstLXR3LXJpbmctY29sb3I6IHJnYig1OSAxMzAgMjQ2IC8gLjUpOy0tdHctcmluZy1vZmZzZXQtc2hhZG93OiAwIDAgIzAwMDA7LS10dy1yaW5nLXNoYWRvdzogMCAwICMwMDAwOy0tdHctc2hhZG93OiAwIDAgIzAwMDA7LS10dy1zaGFkb3ctY29sb3JlZDogMCAwICMwMDAwOy0tdHctYmx1cjogOy0tdHctYnJpZ2h0bmVzczogOy0tdHctY29udHJhc3Q6IDstLXR3LWdyYXlzY2FsZTogOy0tdHctaHVlLXJvdGF0ZTogOy0tdHctaW52ZXJ0OiA7LS10dy1zYXR1cmF0ZTogOy0tdHctc2VwaWE6IDstLXR3LWRyb3Atc2hhZG93OiA7LS10dy1iYWNrZHJvcC1ibHVyOiA7LS10dy1iYWNrZHJvcC1icmlnaHRuZXNzOiA7LS10dy1iYWNrZHJvcC1jb250cmFzdDogOy0tdHctYmFja2Ryb3AtZ3JheXNjYWxlOiA7LS10dy1iYWNrZHJvcC1odWUtcm90YXRlOiA7LS10dy1iYWNrZHJvcC1pbnZlcnQ6IDstLXR3LWJhY2tkcm9wLW9wYWNpdHk6IDstLXR3LWJhY2tkcm9wLXNhdHVyYXRlOiA7LS10dy1iYWNrZHJvcC1zZXBpYTogfS5zci1vbmx5e3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtoZWlnaHQ6MXB4O3BhZGRpbmc6MDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47Y2xpcDpyZWN0KDAsMCwwLDApO3doaXRlLXNwYWNlOm5vd3JhcDtib3JkZXItd2lkdGg6MH0ucG9pbnRlci1ldmVudHMtbm9uZXtwb2ludGVyLWV2ZW50czpub25lfS5pbnZpc2libGV7dmlzaWJpbGl0eTpoaWRkZW59LnN0YXRpY3twb3NpdGlvbjpzdGF0aWN9LmZpeGVke3Bvc2l0aW9uOmZpeGVkfS5hYnNvbHV0ZXtwb3NpdGlvbjphYnNvbHV0ZX0ucmVsYXRpdmV7cG9zaXRpb246cmVsYXRpdmV9LnN0aWNreXtwb3NpdGlvbjpzdGlja3l9Lmluc2V0LTB7dG9wOjA7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjB9Lmluc2V0LXktMHt0b3A6MDtib3R0b206MH0uLWxlZnQtMntsZWZ0Oi0uNXJlbX0uLXJpZ2h0LVxbMTBweFxde3JpZ2h0Oi0xMHB4fS4tdG9wLVxbMTBweFxde3RvcDotMTBweH0uLXRvcC1cWzRweFxde3RvcDotNHB4fS5ib3R0b20tMHtib3R0b206MH0uYm90dG9tLTR7Ym90dG9tOjFyZW19LmxlZnQtMHtsZWZ0OjB9LmxlZnQtMXtsZWZ0Oi4yNXJlbX0ubGVmdC0xXC8ye2xlZnQ6NTAlfS5sZWZ0LTJ7bGVmdDouNXJlbX0ubGVmdC1cWzUwXCVcXXtsZWZ0OjUwJX0ucmlnaHQtMHtyaWdodDowfS5yaWdodC0xe3JpZ2h0Oi4yNXJlbX0ucmlnaHQtNHtyaWdodDoxcmVtfS5yaWdodC1cWzE2cHhcXXtyaWdodDoxNnB4fS50b3AtMHt0b3A6MH0udG9wLTR7dG9wOjFyZW19LnRvcC1cWzUwXCVcXXt0b3A6NTAlfS56LTUwe3otaW5kZXg6NTB9LnotXFs1XF17ei1pbmRleDo1fS56LW92ZXJsYXl7ei1pbmRleDo0fS4tbXgtMXttYXJnaW4tbGVmdDotLjI1cmVtO21hcmdpbi1yaWdodDotLjI1cmVtfS4tbXktMnttYXJnaW4tdG9wOi0uNXJlbTttYXJnaW4tYm90dG9tOi0uNXJlbX0uLW15LVxbMTAwcHhcXXttYXJnaW4tdG9wOi0xMDBweDttYXJnaW4tYm90dG9tOi0xMDBweH0ubXgtMnttYXJnaW4tbGVmdDouNXJlbTttYXJnaW4tcmlnaHQ6LjVyZW19Lm15LTF7bWFyZ2luLXRvcDouMjVyZW07bWFyZ2luLWJvdHRvbTouMjVyZW19Lm1iLTR7bWFyZ2luLWJvdHRvbToxcmVtfS5tbC0ye21hcmdpbi1sZWZ0Oi41cmVtfS5tbC00e21hcmdpbi1sZWZ0OjFyZW19Lm1sLVxbMjBweFxde21hcmdpbi1sZWZ0OjIwcHh9Lm1sLWF1dG97bWFyZ2luLWxlZnQ6YXV0b30ubXItMnttYXJnaW4tcmlnaHQ6LjVyZW19Lm10LTJ7bWFyZ2luLXRvcDouNXJlbX0uYmxvY2t7ZGlzcGxheTpibG9ja30uaW5saW5le2Rpc3BsYXk6aW5saW5lfS5mbGV4e2Rpc3BsYXk6ZmxleH0uaW5saW5lLWZsZXh7ZGlzcGxheTppbmxpbmUtZmxleH0udGFibGV7ZGlzcGxheTp0YWJsZX0uZ3JpZHtkaXNwbGF5OmdyaWR9LmhpZGRlbntkaXNwbGF5Om5vbmV9LmFzcGVjdC1zcXVhcmV7YXNwZWN0LXJhdGlvOjEgLyAxfS5oLTEwe2hlaWdodDoyLjVyZW19LmgtMTF7aGVpZ2h0OjIuNzVyZW19LmgtMntoZWlnaHQ6LjVyZW19LmgtMlwuNXtoZWlnaHQ6LjYyNXJlbX0uaC0ze2hlaWdodDouNzVyZW19LmgtM1wuNXtoZWlnaHQ6Ljg3NXJlbX0uaC00e2hlaWdodDoxcmVtfS5oLTd7aGVpZ2h0OjEuNzVyZW19LmgtOXtoZWlnaHQ6Mi4yNXJlbX0uaC1cWzE0cHhcXXtoZWlnaHQ6MTRweH0uaC1cWzE4cHhcXXtoZWlnaHQ6MThweH0uaC1cWzFweFxde2hlaWdodDoxcHh9LmgtXFsyMHB4XF17aGVpZ2h0OjIwcHh9LmgtXFsyMnB4XF17aGVpZ2h0OjIycHh9LmgtXFsyNHB4XF17aGVpZ2h0OjI0cHh9LmgtXFszMnB4XF17aGVpZ2h0OjMycHh9LmgtXFs1MHB4XF17aGVpZ2h0OjUwcHh9LmgtXFs3NXB4XF17aGVpZ2h0Ojc1cHh9LmgtXFs5cHhcXXtoZWlnaHQ6OXB4fS5oLVxbdmFyXCgtLXJhZGl4LXNlbGVjdC10cmlnZ2VyLWhlaWdodFwpXF17aGVpZ2h0OnZhcigtLXJhZGl4LXNlbGVjdC10cmlnZ2VyLWhlaWdodCl9LmgtZnVsbHtoZWlnaHQ6MTAwJX0uaC1weHtoZWlnaHQ6MXB4fS5oLXNjcmVlbntoZWlnaHQ6MTAwdmh9Lm1heC1oLVxbMzAwcHhcXXttYXgtaGVpZ2h0OjMwMHB4fS5taW4taC1cWzIwMHB4XF17bWluLWhlaWdodDoyMDBweH0ubWluLWgtXFszMDBweFxde21pbi1oZWlnaHQ6MzAwcHh9Lm1pbi1oLXNjcmVlbnttaW4taGVpZ2h0OjEwMHZofS53LTFcLzN7d2lkdGg6MzMuMzMzMzMzJX0udy0xMHt3aWR0aDoyLjVyZW19LnctMnt3aWR0aDouNXJlbX0udy0yXC41e3dpZHRoOi42MjVyZW19LnctM3t3aWR0aDouNzVyZW19LnctM1wuNXt3aWR0aDouODc1cmVtfS53LTR7d2lkdGg6MXJlbX0udy01e3dpZHRoOjEuMjVyZW19LnctN3t3aWR0aDoxLjc1cmVtfS53LTcye3dpZHRoOjE4cmVtfS53LTl7d2lkdGg6Mi4yNXJlbX0udy1cWzE0cHhcXXt3aWR0aDoxNHB4fS53LVxbMXB4XF17d2lkdGg6MXB4fS53LVxbMjBweFxde3dpZHRoOjIwcHh9LnctXFsyNHB4XF17d2lkdGg6MjRweH0udy1cWzMycHhcXXt3aWR0aDozMnB4fS53LVxbNDRweFxde3dpZHRoOjQ0cHh9LnctXFs5cHhcXXt3aWR0aDo5cHh9LnctZml0e3dpZHRoOi1tb3otZml0LWNvbnRlbnQ7d2lkdGg6Zml0LWNvbnRlbnR9LnctZnVsbHt3aWR0aDoxMDAlfS53LXNjcmVlbnt3aWR0aDoxMDB2d30ubWluLXctMHttaW4td2lkdGg6MHB4fS5taW4tdy1cWzMyMHB4XF17bWluLXdpZHRoOjMyMHB4fS5taW4tdy1cWzUwMHB4XF17bWluLXdpZHRoOjUwMHB4fS5taW4tdy1cWzhyZW1cXXttaW4td2lkdGg6OHJlbX0ubWluLXctXFt2YXJcKC0tcmFkaXgtc2VsZWN0LXRyaWdnZXItd2lkdGhcKVxde21pbi13aWR0aDp2YXIoLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci13aWR0aCl9Lm1heC13LTR4bHttYXgtd2lkdGg6NTZyZW19Lm1heC13LVxbMTAwMHB4XF17bWF4LXdpZHRoOjEwMDBweH0ubWF4LXctXFsxMHZ3XF17bWF4LXdpZHRoOjEwdnd9Lm1heC13LVxbMzAwcHhcXXttYXgtd2lkdGg6MzAwcHh9Lm1heC13LVxbOTB2d1xde21heC13aWR0aDo5MHZ3fS5tYXgtdy1sZ3ttYXgtd2lkdGg6MzJyZW19LmZsZXgtMXtmbGV4OjEgMSAwJX0uZmxleC1hdXRve2ZsZXg6MSAxIGF1dG99LmZsZXgtc2hyaW5rLTAsLnNocmluay0we2ZsZXgtc2hyaW5rOjB9LmZsZXgtZ3Jvd3tmbGV4LWdyb3c6MX0uYm9yZGVyLWNvbGxhcHNle2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZX0uLXRyYW5zbGF0ZS14LTFcLzIsLnRyYW5zbGF0ZS14LVxbLTUwXCVcXXstLXR3LXRyYW5zbGF0ZS14OiAtNTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS50cmFuc2xhdGUteS1cWy01MFwlXF17LS10dy10cmFuc2xhdGUteTogLTUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uLXJvdGF0ZS05MHstLXR3LXJvdGF0ZTogLTkwZGVnO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5yb3RhdGUtOTB7LS10dy1yb3RhdGU6IDkwZGVnO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5yb3RhdGUtXFstOTBkZWdcXXstLXR3LXJvdGF0ZTogLTkwZGVnO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5yb3RhdGUtXFs5MGRlZ1xdey0tdHctcm90YXRlOiA5MGRlZzt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0udHJhbnNmb3Jte3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5jdXJzb3ItY29sLXJlc2l6ZXtjdXJzb3I6Y29sLXJlc2l6ZX0uY3Vyc29yLWNyb3NzaGFpcntjdXJzb3I6Y3Jvc3NoYWlyfS5jdXJzb3ItZGVmYXVsdHtjdXJzb3I6ZGVmYXVsdH0uY3Vyc29yLWdyYWJ7Y3Vyc29yOmdyYWJ9LmN1cnNvci1wb2ludGVye2N1cnNvcjpwb2ludGVyfS5jdXJzb3Itc2UtcmVzaXple2N1cnNvcjpzZS1yZXNpemV9LnRvdWNoLW5vbmV7dG91Y2gtYWN0aW9uOm5vbmV9LnNlbGVjdC1ub25ley13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX0ucmVzaXplLW5vbmV7cmVzaXplOm5vbmV9LnJlc2l6ZXtyZXNpemU6Ym90aH0ubGlzdC1kZWNpbWFse2xpc3Qtc3R5bGUtdHlwZTpkZWNpbWFsfS5saXN0LWRpc2N7bGlzdC1zdHlsZS10eXBlOmRpc2N9LmdyaWQtY29scy1cW21pbi1jb250ZW50XzFmclxde2dyaWQtdGVtcGxhdGUtY29sdW1uczptaW4tY29udGVudCAxZnJ9LmdyaWQtcm93cy1cWzFmclwsX21pbi1jb250ZW50XF17Z3JpZC10ZW1wbGF0ZS1yb3dzOjFmciBtaW4tY29udGVudH0uZmxleC1yb3d7ZmxleC1kaXJlY3Rpb246cm93fS5mbGV4LWNvbHtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LmZsZXgtY29sLXJldmVyc2V7ZmxleC1kaXJlY3Rpb246Y29sdW1uLXJldmVyc2V9Lml0ZW1zLXN0YXJ0e2FsaWduLWl0ZW1zOmZsZXgtc3RhcnR9Lml0ZW1zLWNlbnRlcnthbGlnbi1pdGVtczpjZW50ZXJ9Lmp1c3RpZnktc3RhcnR7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnR9Lmp1c3RpZnktZW5ke2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0uanVzdGlmeS1jZW50ZXJ7anVzdGlmeS1jb250ZW50OmNlbnRlcn0uanVzdGlmeS1iZXR3ZWVue2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVufS5nYXAtMXtnYXA6LjI1cmVtfS5nYXAtMntnYXA6LjVyZW19LmdhcC0ze2dhcDouNzVyZW19LmdhcC00e2dhcDoxcmVtfS5nYXAtNXtnYXA6MS4yNXJlbX0uZ2FwLVxbMFwuNWVtXF17Z2FwOi41ZW19LmdhcC1cWzM2cHhcXXtnYXA6MzZweH0uZ2FwLXgtMnstbW96LWNvbHVtbi1nYXA6LjVyZW07Y29sdW1uLWdhcDouNXJlbX0uZ2FwLXgtM3stbW96LWNvbHVtbi1nYXA6Ljc1cmVtO2NvbHVtbi1nYXA6Ljc1cmVtfS5nYXAteC00ey1tb3otY29sdW1uLWdhcDoxcmVtO2NvbHVtbi1nYXA6MXJlbX0uZ2FwLXktMntyb3ctZ2FwOi41cmVtfS5nYXAteS00e3Jvdy1nYXA6MXJlbX0uZ2FwLXktNntyb3ctZ2FwOjEuNXJlbX0uZ2FwLXktOHtyb3ctZ2FwOjJyZW19LnNwYWNlLXgtMT46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXgtcmV2ZXJzZTogMDttYXJnaW4tcmlnaHQ6Y2FsYyguMjVyZW0gKiB2YXIoLS10dy1zcGFjZS14LXJldmVyc2UpKTttYXJnaW4tbGVmdDpjYWxjKC4yNXJlbSAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpKX0uc3BhY2UteS0xPjpub3QoW2hpZGRlbl0pfjpub3QoW2hpZGRlbl0pey0tdHctc3BhY2UteS1yZXZlcnNlOiAwO21hcmdpbi10b3A6Y2FsYyguMjVyZW0gKiBjYWxjKDEgLSB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKSk7bWFyZ2luLWJvdHRvbTpjYWxjKC4yNXJlbSAqIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpfS5zcGFjZS15LTFcLjU+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS15LXJldmVyc2U6IDA7bWFyZ2luLXRvcDpjYWxjKC4zNzVyZW0gKiBjYWxjKDEgLSB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKSk7bWFyZ2luLWJvdHRvbTpjYWxjKC4zNzVyZW0gKiB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKX0uc3BhY2UteS0yPjpub3QoW2hpZGRlbl0pfjpub3QoW2hpZGRlbl0pey0tdHctc3BhY2UteS1yZXZlcnNlOiAwO21hcmdpbi10b3A6Y2FsYyguNXJlbSAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpKTttYXJnaW4tYm90dG9tOmNhbGMoLjVyZW0gKiB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKX0uc3BhY2UteS00Pjpub3QoW2hpZGRlbl0pfjpub3QoW2hpZGRlbl0pey0tdHctc3BhY2UteS1yZXZlcnNlOiAwO21hcmdpbi10b3A6Y2FsYygxcmVtICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSkpO21hcmdpbi1ib3R0b206Y2FsYygxcmVtICogdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSl9Lm92ZXJmbG93LWF1dG97b3ZlcmZsb3c6YXV0b30ub3ZlcmZsb3ctaGlkZGVue292ZXJmbG93OmhpZGRlbn0ub3ZlcmZsb3ctY2xpcHtvdmVyZmxvdzpjbGlwfS5vdmVyZmxvdy1zY3JvbGx7b3ZlcmZsb3c6c2Nyb2xsfS5vdmVyZmxvdy15LWF1dG97b3ZlcmZsb3cteTphdXRvfS5vdmVyZmxvdy14LWhpZGRlbntvdmVyZmxvdy14OmhpZGRlbn0ub3ZlcmZsb3cteS1zY3JvbGx7b3ZlcmZsb3cteTpzY3JvbGx9LnRydW5jYXRle292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcH0ud2hpdGVzcGFjZS1ub3dyYXB7d2hpdGUtc3BhY2U6bm93cmFwfS5yb3VuZGVke2JvcmRlci1yYWRpdXM6LjI1cmVtfS5yb3VuZGVkLVxbaW5oZXJpdFxde2JvcmRlci1yYWRpdXM6aW5oZXJpdH0ucm91bmRlZC1mdWxse2JvcmRlci1yYWRpdXM6OTk5OXB4fS5yb3VuZGVkLWxne2JvcmRlci1yYWRpdXM6dmFyKC0tcmFkaXVzKX0ucm91bmRlZC1tZHtib3JkZXItcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSAtIDJweCl9LnJvdW5kZWQtc217Ym9yZGVyLXJhZGl1czpjYWxjKHZhcigtLXJhZGl1cykgLSA0cHgpfS5ib3JkZXJ7Ym9yZGVyLXdpZHRoOjFweH0uYm9yZGVyLTIsLmJvcmRlci1cWzJweFxde2JvcmRlci13aWR0aDoycHh9LmJvcmRlci15e2JvcmRlci10b3Atd2lkdGg6MXB4O2JvcmRlci1ib3R0b20td2lkdGg6MXB4fS5ib3JkZXItYntib3JkZXItYm90dG9tLXdpZHRoOjFweH0uYm9yZGVyLWx7Ym9yZGVyLWxlZnQtd2lkdGg6MXB4fS5ib3JkZXItbC0ye2JvcmRlci1sZWZ0LXdpZHRoOjJweH0uYm9yZGVyLXJ7Ym9yZGVyLXJpZ2h0LXdpZHRoOjFweH0uYm9yZGVyLXR7Ym9yZGVyLXRvcC13aWR0aDoxcHh9LmJvcmRlci1hY2NlbnR7Ym9yZGVyLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uYm9yZGVyLWJvcmRlcntib3JkZXItY29sb3I6aHNsKHZhcigtLWJvcmRlcikpfS5ib3JkZXItY2FyZHtib3JkZXItY29sb3I6aHNsKHZhcigtLWNhcmQpKX0uYm9yZGVyLWdyYXktNDAwey0tdHctYm9yZGVyLW9wYWNpdHk6IDE7Ym9yZGVyLWNvbG9yOnJnYigxNTYgMTYzIDE3NSAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSl9LmJvcmRlci1pbnB1dHtib3JkZXItY29sb3I6aHNsKHZhcigtLWlucHV0KSl9LmJvcmRlci1wcmltYXJ5e2JvcmRlci1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5ib3JkZXItdHJhbnNwYXJlbnR7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5ib3JkZXItbC10cmFuc3BhcmVudHtib3JkZXItbGVmdC1jb2xvcjp0cmFuc3BhcmVudH0uYm9yZGVyLXQtdHJhbnNwYXJlbnR7Ym9yZGVyLXRvcC1jb2xvcjp0cmFuc3BhcmVudH0uYmctYWNjZW50e2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5iZy1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWJhY2tncm91bmQpKX0uYmctYmFja2dyb3VuZFwvODB7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYmFja2dyb3VuZCkgLyAuOCl9LmJnLWJvcmRlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1ib3JkZXIpKX0uYmctY2FyZHtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1jYXJkKSl9LmJnLWNhcmQtZm9yZWdyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1jYXJkLWZvcmVncm91bmQpKX0uYmctZGVzdHJ1Y3RpdmV7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tZGVzdHJ1Y3RpdmUpKX0uYmctZ3JheS0zMDB7LS10dy1iZy1vcGFjaXR5OiAxO2JhY2tncm91bmQtY29sb3I6cmdiKDIwOSAyMTMgMjE5IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpfS5iZy1ncmF5LTUwMHstLXR3LWJnLW9wYWNpdHk6IDE7YmFja2dyb3VuZC1jb2xvcjpyZ2IoMTA3IDExNCAxMjggLyB2YXIoLS10dy1iZy1vcGFjaXR5KSl9LmJnLW11dGVke2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLW11dGVkKSl9LmJnLXBvcG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcG9wb3ZlcikpfS5iZy1wcmltYXJ5e2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLXByaW1hcnkpKX0uYmctcmVkLTUwMHstLXR3LWJnLW9wYWNpdHk6IDE7YmFja2dyb3VuZC1jb2xvcjpyZ2IoMjM5IDY4IDY4IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpfS5iZy1zZWNvbmRhcnl7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tc2Vjb25kYXJ5KSl9LmJnLXRyYW5zcGFyZW50e2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LmJnLXdoaXRley0tdHctYmctb3BhY2l0eTogMTtiYWNrZ3JvdW5kLWNvbG9yOnJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKX0uYmctZ3JhZGllbnQtdG8tYntiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sdmFyKC0tdHctZ3JhZGllbnQtc3RvcHMpKX0uYmctZ3JhZGllbnQtdG8tYnJ7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tIHJpZ2h0LHZhcigtLXR3LWdyYWRpZW50LXN0b3BzKSl9LmZyb20tYmFja2dyb3VuZFwvOTB7LS10dy1ncmFkaWVudC1mcm9tOiBoc2wodmFyKC0tYmFja2dyb3VuZCkgLyAuOSkgdmFyKC0tdHctZ3JhZGllbnQtZnJvbS1wb3NpdGlvbik7LS10dy1ncmFkaWVudC10bzogaHNsKHZhcigtLWJhY2tncm91bmQpIC8gMCkgdmFyKC0tdHctZ3JhZGllbnQtdG8tcG9zaXRpb24pOy0tdHctZ3JhZGllbnQtc3RvcHM6IHZhcigtLXR3LWdyYWRpZW50LWZyb20pLCB2YXIoLS10dy1ncmFkaWVudC10byl9LmZyb20tdHJhbnNwYXJlbnR7LS10dy1ncmFkaWVudC1mcm9tOiB0cmFuc3BhcmVudCB2YXIoLS10dy1ncmFkaWVudC1mcm9tLXBvc2l0aW9uKTstLXR3LWdyYWRpZW50LXRvOiByZ2IoMCAwIDAgLyAwKSB2YXIoLS10dy1ncmFkaWVudC10by1wb3NpdGlvbik7LS10dy1ncmFkaWVudC1zdG9wczogdmFyKC0tdHctZ3JhZGllbnQtZnJvbSksIHZhcigtLXR3LWdyYWRpZW50LXRvKX0uZnJvbS00MFwley0tdHctZ3JhZGllbnQtZnJvbS1wb3NpdGlvbjogNDAlfS50by1iYWNrZ3JvdW5key0tdHctZ3JhZGllbnQtdG86IGhzbCh2YXIoLS1iYWNrZ3JvdW5kKSkgdmFyKC0tdHctZ3JhZGllbnQtdG8tcG9zaXRpb24pfS5maWxsLWN1cnJlbnR7ZmlsbDpjdXJyZW50Q29sb3J9LmZpbGwtd2hpdGV7ZmlsbDojZmZmfS5zdHJva2UtXFsycHhcXXtzdHJva2Utd2lkdGg6MnB4fS5zdHJva2UtXFszcHhcXXtzdHJva2Utd2lkdGg6M3B4fS5vYmplY3QtY29udGFpbnstby1vYmplY3QtZml0OmNvbnRhaW47b2JqZWN0LWZpdDpjb250YWlufS5wLTB7cGFkZGluZzowfS5wLTF7cGFkZGluZzouMjVyZW19LnAtMTB7cGFkZGluZzoyLjVyZW19LnAtMntwYWRkaW5nOi41cmVtfS5wLTN7cGFkZGluZzouNzVyZW19LnAtNHtwYWRkaW5nOjFyZW19LnAtNntwYWRkaW5nOjEuNXJlbX0ucC1cWzFweFxde3BhZGRpbmc6MXB4fS5weC0xe3BhZGRpbmctbGVmdDouMjVyZW07cGFkZGluZy1yaWdodDouMjVyZW19LnB4LTJ7cGFkZGluZy1sZWZ0Oi41cmVtO3BhZGRpbmctcmlnaHQ6LjVyZW19LnB4LTJcLjV7cGFkZGluZy1sZWZ0Oi42MjVyZW07cGFkZGluZy1yaWdodDouNjI1cmVtfS5weC0ze3BhZGRpbmctbGVmdDouNzVyZW07cGFkZGluZy1yaWdodDouNzVyZW19LnB4LTR7cGFkZGluZy1sZWZ0OjFyZW07cGFkZGluZy1yaWdodDoxcmVtfS5weC01e3BhZGRpbmctbGVmdDoxLjI1cmVtO3BhZGRpbmctcmlnaHQ6MS4yNXJlbX0ucHgtOHtwYWRkaW5nLWxlZnQ6MnJlbTtwYWRkaW5nLXJpZ2h0OjJyZW19LnB4LVxbMjRweFxde3BhZGRpbmctbGVmdDoyNHB4O3BhZGRpbmctcmlnaHQ6MjRweH0ucHktMXtwYWRkaW5nLXRvcDouMjVyZW07cGFkZGluZy1ib3R0b206LjI1cmVtfS5weS0xXC41e3BhZGRpbmctdG9wOi4zNzVyZW07cGFkZGluZy1ib3R0b206LjM3NXJlbX0ucHktMntwYWRkaW5nLXRvcDouNXJlbTtwYWRkaW5nLWJvdHRvbTouNXJlbX0ucHktM3twYWRkaW5nLXRvcDouNzVyZW07cGFkZGluZy1ib3R0b206Ljc1cmVtfS5weS00e3BhZGRpbmctdG9wOjFyZW07cGFkZGluZy1ib3R0b206MXJlbX0ucHktNntwYWRkaW5nLXRvcDoxLjVyZW07cGFkZGluZy1ib3R0b206MS41cmVtfS5weS03e3BhZGRpbmctdG9wOjEuNzVyZW07cGFkZGluZy1ib3R0b206MS43NXJlbX0ucHktXFsycHhcXXtwYWRkaW5nLXRvcDoycHg7cGFkZGluZy1ib3R0b206MnB4fS5wYi0we3BhZGRpbmctYm90dG9tOjB9LnBiLTIwe3BhZGRpbmctYm90dG9tOjVyZW19LnBiLTR7cGFkZGluZy1ib3R0b206MXJlbX0ucGwtNntwYWRkaW5nLWxlZnQ6MS41cmVtfS5wbC04e3BhZGRpbmctbGVmdDoycmVtfS5wci0ye3BhZGRpbmctcmlnaHQ6LjVyZW19LnB0LTB7cGFkZGluZy10b3A6MH0ucHQtMXtwYWRkaW5nLXRvcDouMjVyZW19LnB0LTJ7cGFkZGluZy10b3A6LjVyZW19LnB0LTR7cGFkZGluZy10b3A6MXJlbX0udGV4dC1sZWZ0e3RleHQtYWxpZ246bGVmdH0udGV4dC1jZW50ZXJ7dGV4dC1hbGlnbjpjZW50ZXJ9LnRleHQtc3RhcnR7dGV4dC1hbGlnbjpzdGFydH0uZm9udC1zYW5ze2ZvbnQtZmFtaWx5OlJvYm90byxzYW5zLXNlcmlmfS5mb250LXNlcmlme2ZvbnQtZmFtaWx5OlNwYWNlIE1vbm8sbW9ub3NwYWNlfS50ZXh0LTJ4bHtmb250LXNpemU6MS41cmVtO2xpbmUtaGVpZ2h0OjJyZW19LnRleHQtM3hse2ZvbnQtc2l6ZToxLjg3NXJlbTtsaW5lLWhlaWdodDoyLjI1cmVtfS50ZXh0LTR4bHtmb250LXNpemU6Mi4yNXJlbTtsaW5lLWhlaWdodDoyLjVyZW19LnRleHQtXFswXC44cmVtXF17Zm9udC1zaXplOi44cmVtfS50ZXh0LVxbMTJweFxde2ZvbnQtc2l6ZToxMnB4fS50ZXh0LWxne2ZvbnQtc2l6ZToxLjEyNXJlbTtsaW5lLWhlaWdodDoxLjc1cmVtfS50ZXh0LXNte2ZvbnQtc2l6ZTouODc1cmVtO2xpbmUtaGVpZ2h0OjEuMjVyZW19LnRleHQteGx7Zm9udC1zaXplOjEuMjVyZW07bGluZS1oZWlnaHQ6MS43NXJlbX0udGV4dC14c3tmb250LXNpemU6Ljc1cmVtO2xpbmUtaGVpZ2h0OjFyZW19LmZvbnQtXFsxMnB4XF17Zm9udC13ZWlnaHQ6MTJweH0uZm9udC1cWzQwMFxde2ZvbnQtd2VpZ2h0OjQwMH0uZm9udC1cWzUwMFxde2ZvbnQtd2VpZ2h0OjUwMH0uZm9udC1cWzU1MFxde2ZvbnQtd2VpZ2h0OjU1MH0uZm9udC1ib2xke2ZvbnQtd2VpZ2h0OjcwMH0uZm9udC1leHRyYWJvbGR7Zm9udC13ZWlnaHQ6ODAwfS5mb250LW1lZGl1bXtmb250LXdlaWdodDo1MDB9LmZvbnQtbm9ybWFse2ZvbnQtd2VpZ2h0OjQwMH0uZm9udC1zZW1pYm9sZHtmb250LXdlaWdodDo2MDB9LnVwcGVyY2FzZXt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9Lml0YWxpY3tmb250LXN0eWxlOml0YWxpY30ubGVhZGluZy00e2xpbmUtaGVpZ2h0OjFyZW19LmxlYWRpbmctbm9uZXtsaW5lLWhlaWdodDoxfS50cmFja2luZy1cWzBcLjA0ZW1cXXtsZXR0ZXItc3BhY2luZzouMDRlbX0udHJhY2tpbmctdGlnaHR7bGV0dGVyLXNwYWNpbmc6LS4wMjVlbX0udHJhY2tpbmctd2lkZXJ7bGV0dGVyLXNwYWNpbmc6LjA1ZW19LnRyYWNraW5nLXdpZGVzdHtsZXR0ZXItc3BhY2luZzouMWVtfS50ZXh0LWFjY2VudHtjb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LnRleHQtYWNjZW50LWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLWFjY2VudC1mb3JlZ3JvdW5kKSl9LnRleHQtYmFja2dyb3VuZHtjb2xvcjpoc2wodmFyKC0tYmFja2dyb3VuZCkpfS50ZXh0LWNhcmQtZm9yZWdyb3VuZHtjb2xvcjpoc2wodmFyKC0tY2FyZC1mb3JlZ3JvdW5kKSl9LnRleHQtY3VycmVudHtjb2xvcjpjdXJyZW50Q29sb3J9LnRleHQtZGVzdHJ1Y3RpdmV7Y29sb3I6aHNsKHZhcigtLWRlc3RydWN0aXZlKSl9LnRleHQtZGVzdHJ1Y3RpdmUtZm9yZWdyb3VuZHtjb2xvcjpoc2wodmFyKC0tZGVzdHJ1Y3RpdmUtZm9yZWdyb3VuZCkpfS50ZXh0LWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLWZvcmVncm91bmQpKX0udGV4dC1tdXRlZHtjb2xvcjpoc2wodmFyKC0tbXV0ZWQpKX0udGV4dC1tdXRlZC1mb3JlZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKSl9LnRleHQtcG9wb3Zlci1mb3JlZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1wb3BvdmVyLWZvcmVncm91bmQpKX0udGV4dC1wcmltYXJ5e2NvbG9yOmhzbCh2YXIoLS1wcmltYXJ5KSl9LnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1wcmltYXJ5LWZvcmVncm91bmQpKX0udGV4dC1zZWNvbmRhcnktZm9yZWdyb3VuZHtjb2xvcjpoc2wodmFyKC0tc2Vjb25kYXJ5LWZvcmVncm91bmQpKX0udGV4dC13aGl0ZXstLXR3LXRleHQtb3BhY2l0eTogMTtjb2xvcjpyZ2IoMjU1IDI1NSAyNTUgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKX0udW5kZXJsaW5le3RleHQtZGVjb3JhdGlvbi1saW5lOnVuZGVybGluZX0ubGluZS10aHJvdWdoe3RleHQtZGVjb3JhdGlvbi1saW5lOmxpbmUtdGhyb3VnaH0udW5kZXJsaW5lLW9mZnNldC00e3RleHQtdW5kZXJsaW5lLW9mZnNldDo0cHh9LmFudGlhbGlhc2Vkey13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7LW1vei1vc3gtZm9udC1zbW9vdGhpbmc6Z3JheXNjYWxlfS5vcGFjaXR5LTB7b3BhY2l0eTowfS5vcGFjaXR5LTEwMHtvcGFjaXR5OjF9Lm9wYWNpdHktNTB7b3BhY2l0eTouNX0ub3BhY2l0eS02MHtvcGFjaXR5Oi42fS5vcGFjaXR5LTcwe29wYWNpdHk6Ljd9Lm9wYWNpdHktNzV7b3BhY2l0eTouNzV9LnNoYWRvd3stLXR3LXNoYWRvdzogMCAxcHggM3B4IDAgcmdiKDAgMCAwIC8gLjEpLCAwIDFweCAycHggLTFweCByZ2IoMCAwIDAgLyAuMSk7LS10dy1zaGFkb3ctY29sb3JlZDogMCAxcHggM3B4IDAgdmFyKC0tdHctc2hhZG93LWNvbG9yKSwgMCAxcHggMnB4IC0xcHggdmFyKC0tdHctc2hhZG93LWNvbG9yKTtib3gtc2hhZG93OnZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdywgMCAwICMwMDAwKSx2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSx2YXIoLS10dy1zaGFkb3cpfS5zaGFkb3ctbGd7LS10dy1zaGFkb3c6IDAgMTBweCAxNXB4IC0zcHggcmdiKDAgMCAwIC8gLjEpLCAwIDRweCA2cHggLTRweCByZ2IoMCAwIDAgLyAuMSk7LS10dy1zaGFkb3ctY29sb3JlZDogMCAxMHB4IDE1cHggLTNweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpLCAwIDRweCA2cHggLTRweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXNoYWRvdyl9LnNoYWRvdy1tZHstLXR3LXNoYWRvdzogMCA0cHggNnB4IC0xcHggcmdiKDAgMCAwIC8gLjEpLCAwIDJweCA0cHggLTJweCByZ2IoMCAwIDAgLyAuMSk7LS10dy1zaGFkb3ctY29sb3JlZDogMCA0cHggNnB4IC0xcHggdmFyKC0tdHctc2hhZG93LWNvbG9yKSwgMCAycHggNHB4IC0ycHggdmFyKC0tdHctc2hhZG93LWNvbG9yKTtib3gtc2hhZG93OnZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdywgMCAwICMwMDAwKSx2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSx2YXIoLS10dy1zaGFkb3cpfS5zaGFkb3ctc217LS10dy1zaGFkb3c6IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIC4wNSk7LS10dy1zaGFkb3ctY29sb3JlZDogMCAxcHggMnB4IDAgdmFyKC0tdHctc2hhZG93LWNvbG9yKTtib3gtc2hhZG93OnZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdywgMCAwICMwMDAwKSx2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSx2YXIoLS10dy1zaGFkb3cpfS5vdXRsaW5lLW5vbmV7b3V0bGluZToycHggc29saWQgdHJhbnNwYXJlbnQ7b3V0bGluZS1vZmZzZXQ6MnB4fS5vdXRsaW5le291dGxpbmUtc3R5bGU6c29saWR9LnJpbmctMHstLXR3LXJpbmctb2Zmc2V0LXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpIHZhcigtLXR3LXJpbmctb2Zmc2V0LWNvbG9yKTstLXR3LXJpbmctc2hhZG93OiB2YXIoLS10dy1yaW5nLWluc2V0KSAwIDAgMCBjYWxjKDBweCArIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSkgdmFyKC0tdHctcmluZy1jb2xvcik7Ym94LXNoYWRvdzp2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3cpLHZhcigtLXR3LXJpbmctc2hhZG93KSx2YXIoLS10dy1zaGFkb3csIDAgMCAjMDAwMCl9LnJpbmctb2Zmc2V0LWJhY2tncm91bmR7LS10dy1yaW5nLW9mZnNldC1jb2xvcjogaHNsKHZhcigtLWJhY2tncm91bmQpKX0uZHJvcC1zaGFkb3ctMnhsey0tdHctZHJvcC1zaGFkb3c6IGRyb3Atc2hhZG93KDAgMjVweCAyNXB4IHJnYigwIDAgMCAvIC4xNSkpO2ZpbHRlcjp2YXIoLS10dy1ibHVyKSB2YXIoLS10dy1icmlnaHRuZXNzKSB2YXIoLS10dy1jb250cmFzdCkgdmFyKC0tdHctZ3JheXNjYWxlKSB2YXIoLS10dy1odWUtcm90YXRlKSB2YXIoLS10dy1pbnZlcnQpIHZhcigtLXR3LXNhdHVyYXRlKSB2YXIoLS10dy1zZXBpYSkgdmFyKC0tdHctZHJvcC1zaGFkb3cpfS5kcm9wLXNoYWRvdy1cWzBweF8wcHhfMTJweF9yZ2JhXCg1NlwsMjA1XCwxNTJcLDBcLjYwXClcXXstLXR3LWRyb3Atc2hhZG93OiBkcm9wLXNoYWRvdygwcHggMHB4IDEycHggcmdiYSg1NiwyMDUsMTUyLC42KSk7ZmlsdGVyOnZhcigtLXR3LWJsdXIpIHZhcigtLXR3LWJyaWdodG5lc3MpIHZhcigtLXR3LWNvbnRyYXN0KSB2YXIoLS10dy1ncmF5c2NhbGUpIHZhcigtLXR3LWh1ZS1yb3RhdGUpIHZhcigtLXR3LWludmVydCkgdmFyKC0tdHctc2F0dXJhdGUpIHZhcigtLXR3LXNlcGlhKSB2YXIoLS10dy1kcm9wLXNoYWRvdyl9LmZpbHRlcntmaWx0ZXI6dmFyKC0tdHctYmx1cikgdmFyKC0tdHctYnJpZ2h0bmVzcykgdmFyKC0tdHctY29udHJhc3QpIHZhcigtLXR3LWdyYXlzY2FsZSkgdmFyKC0tdHctaHVlLXJvdGF0ZSkgdmFyKC0tdHctaW52ZXJ0KSB2YXIoLS10dy1zYXR1cmF0ZSkgdmFyKC0tdHctc2VwaWEpIHZhcigtLXR3LWRyb3Atc2hhZG93KX0uYmFja2Ryb3AtYmx1ci1sZ3stLXR3LWJhY2tkcm9wLWJsdXI6IGJsdXIoMTZweCk7LXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6dmFyKC0tdHctYmFja2Ryb3AtYmx1cikgdmFyKC0tdHctYmFja2Ryb3AtYnJpZ2h0bmVzcykgdmFyKC0tdHctYmFja2Ryb3AtY29udHJhc3QpIHZhcigtLXR3LWJhY2tkcm9wLWdyYXlzY2FsZSkgdmFyKC0tdHctYmFja2Ryb3AtaHVlLXJvdGF0ZSkgdmFyKC0tdHctYmFja2Ryb3AtaW52ZXJ0KSB2YXIoLS10dy1iYWNrZHJvcC1vcGFjaXR5KSB2YXIoLS10dy1iYWNrZHJvcC1zYXR1cmF0ZSkgdmFyKC0tdHctYmFja2Ryb3Atc2VwaWEpO2JhY2tkcm9wLWZpbHRlcjp2YXIoLS10dy1iYWNrZHJvcC1ibHVyKSB2YXIoLS10dy1iYWNrZHJvcC1icmlnaHRuZXNzKSB2YXIoLS10dy1iYWNrZHJvcC1jb250cmFzdCkgdmFyKC0tdHctYmFja2Ryb3AtZ3JheXNjYWxlKSB2YXIoLS10dy1iYWNrZHJvcC1odWUtcm90YXRlKSB2YXIoLS10dy1iYWNrZHJvcC1pbnZlcnQpIHZhcigtLXR3LWJhY2tkcm9wLW9wYWNpdHkpIHZhcigtLXR3LWJhY2tkcm9wLXNhdHVyYXRlKSB2YXIoLS10dy1iYWNrZHJvcC1zZXBpYSl9LmJhY2tkcm9wLWJsdXItc217LS10dy1iYWNrZHJvcC1ibHVyOiBibHVyKDRweCk7LXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6dmFyKC0tdHctYmFja2Ryb3AtYmx1cikgdmFyKC0tdHctYmFja2Ryb3AtYnJpZ2h0bmVzcykgdmFyKC0tdHctYmFja2Ryb3AtY29udHJhc3QpIHZhcigtLXR3LWJhY2tkcm9wLWdyYXlzY2FsZSkgdmFyKC0tdHctYmFja2Ryb3AtaHVlLXJvdGF0ZSkgdmFyKC0tdHctYmFja2Ryb3AtaW52ZXJ0KSB2YXIoLS10dy1iYWNrZHJvcC1vcGFjaXR5KSB2YXIoLS10dy1iYWNrZHJvcC1zYXR1cmF0ZSkgdmFyKC0tdHctYmFja2Ryb3Atc2VwaWEpO2JhY2tkcm9wLWZpbHRlcjp2YXIoLS10dy1iYWNrZHJvcC1ibHVyKSB2YXIoLS10dy1iYWNrZHJvcC1icmlnaHRuZXNzKSB2YXIoLS10dy1iYWNrZHJvcC1jb250cmFzdCkgdmFyKC0tdHctYmFja2Ryb3AtZ3JheXNjYWxlKSB2YXIoLS10dy1iYWNrZHJvcC1odWUtcm90YXRlKSB2YXIoLS10dy1iYWNrZHJvcC1pbnZlcnQpIHZhcigtLXR3LWJhY2tkcm9wLW9wYWNpdHkpIHZhcigtLXR3LWJhY2tkcm9wLXNhdHVyYXRlKSB2YXIoLS10dy1iYWNrZHJvcC1zZXBpYSl9LnRyYW5zaXRpb24tYWxse3RyYW5zaXRpb24tcHJvcGVydHk6YWxsO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNCwwLC4yLDEpO3RyYW5zaXRpb24tZHVyYXRpb246LjE1c30udHJhbnNpdGlvbi1jb2xvcnN7dHJhbnNpdGlvbi1wcm9wZXJ0eTpjb2xvcixiYWNrZ3JvdW5kLWNvbG9yLGJvcmRlci1jb2xvcix0ZXh0LWRlY29yYXRpb24tY29sb3IsZmlsbCxzdHJva2U7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC40LDAsLjIsMSk7dHJhbnNpdGlvbi1kdXJhdGlvbjouMTVzfS50cmFuc2l0aW9uLW9wYWNpdHl7dHJhbnNpdGlvbi1wcm9wZXJ0eTpvcGFjaXR5O3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNCwwLC4yLDEpO3RyYW5zaXRpb24tZHVyYXRpb246LjE1c30udHJhbnNpdGlvbi10cmFuc2Zvcm17dHJhbnNpdGlvbi1wcm9wZXJ0eTp0cmFuc2Zvcm07dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC40LDAsLjIsMSk7dHJhbnNpdGlvbi1kdXJhdGlvbjouMTVzfS5kdXJhdGlvbi0xNTB7dHJhbnNpdGlvbi1kdXJhdGlvbjouMTVzfS5kdXJhdGlvbi0yMDB7dHJhbnNpdGlvbi1kdXJhdGlvbjouMnN9LmVhc2UtaW4tb3V0e3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNCwwLC4yLDEpfUBrZXlmcmFtZXMgZW50ZXJ7MCV7b3BhY2l0eTp2YXIoLS10dy1lbnRlci1vcGFjaXR5LCAxKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QodmFyKC0tdHctZW50ZXItdHJhbnNsYXRlLXgsIDApLHZhcigtLXR3LWVudGVyLXRyYW5zbGF0ZS15LCAwKSwwKSBzY2FsZTNkKHZhcigtLXR3LWVudGVyLXNjYWxlLCAxKSx2YXIoLS10dy1lbnRlci1zY2FsZSwgMSksdmFyKC0tdHctZW50ZXItc2NhbGUsIDEpKSByb3RhdGUodmFyKC0tdHctZW50ZXItcm90YXRlLCAwKSl9fUBrZXlmcmFtZXMgZXhpdHt0b3tvcGFjaXR5OnZhcigtLXR3LWV4aXQtb3BhY2l0eSwgMSk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKHZhcigtLXR3LWV4aXQtdHJhbnNsYXRlLXgsIDApLHZhcigtLXR3LWV4aXQtdHJhbnNsYXRlLXksIDApLDApIHNjYWxlM2QodmFyKC0tdHctZXhpdC1zY2FsZSwgMSksdmFyKC0tdHctZXhpdC1zY2FsZSwgMSksdmFyKC0tdHctZXhpdC1zY2FsZSwgMSkpIHJvdGF0ZSh2YXIoLS10dy1leGl0LXJvdGF0ZSwgMCkpfX0uYW5pbWF0ZS1pbnthbmltYXRpb24tbmFtZTplbnRlcjthbmltYXRpb24tZHVyYXRpb246LjE1czstLXR3LWVudGVyLW9wYWNpdHk6IGluaXRpYWw7LS10dy1lbnRlci1zY2FsZTogaW5pdGlhbDstLXR3LWVudGVyLXJvdGF0ZTogaW5pdGlhbDstLXR3LWVudGVyLXRyYW5zbGF0ZS14OiBpbml0aWFsOy0tdHctZW50ZXItdHJhbnNsYXRlLXk6IGluaXRpYWx9LmZhZGUtaW4tMHstLXR3LWVudGVyLW9wYWNpdHk6IDB9Lnpvb20taW4tOTV7LS10dy1lbnRlci1zY2FsZTogLjk1fS5kdXJhdGlvbi0xNTB7YW5pbWF0aW9uLWR1cmF0aW9uOi4xNXN9LmR1cmF0aW9uLTIwMHthbmltYXRpb24tZHVyYXRpb246LjJzfS5lYXNlLWluLW91dHthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNCwwLC4yLDEpfS5maWxlXDpib3JkZXItMDo6ZmlsZS1zZWxlY3Rvci1idXR0b257Ym9yZGVyLXdpZHRoOjBweH0uZmlsZVw6YmctdHJhbnNwYXJlbnQ6OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LmZpbGVcOnRleHQtc206OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2ZvbnQtc2l6ZTouODc1cmVtO2xpbmUtaGVpZ2h0OjEuMjVyZW19LmZpbGVcOmZvbnQtbWVkaXVtOjpmaWxlLXNlbGVjdG9yLWJ1dHRvbntmb250LXdlaWdodDo1MDB9LnBsYWNlaG9sZGVyXDp0ZXh0LW11dGVkLWZvcmVncm91bmQ6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6aHNsKHZhcigtLW11dGVkLWZvcmVncm91bmQpKX0ucGxhY2Vob2xkZXJcOnRleHQtbXV0ZWQtZm9yZWdyb3VuZDo6cGxhY2Vob2xkZXJ7Y29sb3I6aHNsKHZhcigtLW11dGVkLWZvcmVncm91bmQpKX0uZm9jdXMtd2l0aGluXDpyZWxhdGl2ZTpmb2N1cy13aXRoaW57cG9zaXRpb246cmVsYXRpdmV9LmhvdmVyXDp3LVxbMnB4XF06aG92ZXJ7d2lkdGg6MnB4fS5ob3Zlclw6dy1cWzNweFxdOmhvdmVye3dpZHRoOjNweH0uaG92ZXJcOmN1cnNvci1wb2ludGVyOmhvdmVye2N1cnNvcjpwb2ludGVyfS5ob3Zlclw6cm91bmRlZC1sZzpob3Zlcntib3JkZXItcmFkaXVzOnZhcigtLXJhZGl1cyl9LmhvdmVyXDpiZy1hY2NlbnQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmhvdmVyXDpiZy1ib3JkZXI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYm9yZGVyKSl9LmhvdmVyXDpiZy1kZXN0cnVjdGl2ZVwvOTA6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tZGVzdHJ1Y3RpdmUpIC8gLjkpfS5ob3Zlclw6YmctbXV0ZWQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tbXV0ZWQpKX0uaG92ZXJcOmJnLXByaW1hcnk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5ob3Zlclw6YmctcHJpbWFyeVwvOTA6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkgLyAuOSl9LmhvdmVyXDpiZy1yZWQtNzAwOmhvdmVyey0tdHctYmctb3BhY2l0eTogMTtiYWNrZ3JvdW5kLWNvbG9yOnJnYigxODUgMjggMjggLyB2YXIoLS10dy1iZy1vcGFjaXR5KSl9LmhvdmVyXDpiZy1zZWNvbmRhcnlcLzgwOmhvdmVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLXNlY29uZGFyeSkgLyAuOCl9LmhvdmVyXDp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kOmhvdmVye2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQtZm9yZWdyb3VuZCkpfS5ob3Zlclw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kOmhvdmVye2NvbG9yOmhzbCh2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKSl9LmhvdmVyXDp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZDpob3Zlcntjb2xvcjpoc2wodmFyKC0tcHJpbWFyeS1mb3JlZ3JvdW5kKSl9LmhvdmVyXDp0ZXh0LXdoaXRlOmhvdmVyey0tdHctdGV4dC1vcGFjaXR5OiAxO2NvbG9yOnJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpfS5ob3Zlclw6dW5kZXJsaW5lOmhvdmVye3RleHQtZGVjb3JhdGlvbi1saW5lOnVuZGVybGluZX0uaG92ZXJcOm9wYWNpdHktMTAwOmhvdmVye29wYWNpdHk6MX0uZm9jdXNcOmJnLWFjY2VudDpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uZm9jdXNcOmJnLXByaW1hcnk6Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5mb2N1c1w6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZDpmb2N1c3tjb2xvcjpoc2wodmFyKC0tYWNjZW50LWZvcmVncm91bmQpKX0uZm9jdXNcOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kOmZvY3Vze2NvbG9yOmhzbCh2YXIoLS1wcmltYXJ5LWZvcmVncm91bmQpKX0uZm9jdXNcOm91dGxpbmUtbm9uZTpmb2N1c3tvdXRsaW5lOjJweCBzb2xpZCB0cmFuc3BhcmVudDtvdXRsaW5lLW9mZnNldDoycHh9LmZvY3VzXDpyaW5nLTI6Zm9jdXN7LS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSB2YXIoLS10dy1yaW5nLW9mZnNldC1jb2xvcik7LS10dy1yaW5nLXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgY2FsYygycHggKyB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkpIHZhcigtLXR3LXJpbmctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93KSx2YXIoLS10dy1yaW5nLXNoYWRvdyksdmFyKC0tdHctc2hhZG93LCAwIDAgIzAwMDApfS5mb2N1c1w6cmluZy1yaW5nOmZvY3Vzey0tdHctcmluZy1jb2xvcjogaHNsKHZhcigtLXJpbmcpKX0uZm9jdXNcOnJpbmctb2Zmc2V0LTI6Zm9jdXN7LS10dy1yaW5nLW9mZnNldC13aWR0aDogMnB4fS5mb2N1cy12aXNpYmxlXDpvdXRsaW5lLW5vbmU6Zm9jdXMtdmlzaWJsZXtvdXRsaW5lOjJweCBzb2xpZCB0cmFuc3BhcmVudDtvdXRsaW5lLW9mZnNldDoycHh9LmZvY3VzLXZpc2libGVcOm91dGxpbmUtYWNjZW50OmZvY3VzLXZpc2libGV7b3V0bGluZS1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmZvY3VzLXZpc2libGVcOnJpbmctMjpmb2N1cy12aXNpYmxley0tdHctcmluZy1vZmZzZXQtc2hhZG93OiB2YXIoLS10dy1yaW5nLWluc2V0KSAwIDAgMCB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkgdmFyKC0tdHctcmluZy1vZmZzZXQtY29sb3IpOy0tdHctcmluZy1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIGNhbGMoMnB4ICsgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpKSB2YXIoLS10dy1yaW5nLWNvbG9yKTtib3gtc2hhZG93OnZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdyksdmFyKC0tdHctcmluZy1zaGFkb3cpLHZhcigtLXR3LXNoYWRvdywgMCAwICMwMDAwKX0uZm9jdXMtdmlzaWJsZVw6cmluZy1yaW5nOmZvY3VzLXZpc2libGV7LS10dy1yaW5nLWNvbG9yOiBoc2wodmFyKC0tcmluZykpfS5mb2N1cy12aXNpYmxlXDpyaW5nLW9mZnNldC0yOmZvY3VzLXZpc2libGV7LS10dy1yaW5nLW9mZnNldC13aWR0aDogMnB4fS5mb2N1cy12aXNpYmxlXDpyaW5nLW9mZnNldC1iYWNrZ3JvdW5kOmZvY3VzLXZpc2libGV7LS10dy1yaW5nLW9mZnNldC1jb2xvcjogaHNsKHZhcigtLWJhY2tncm91bmQpKX0uZGlzYWJsZWRcOnBvaW50ZXItZXZlbnRzLW5vbmU6ZGlzYWJsZWR7cG9pbnRlci1ldmVudHM6bm9uZX0uZGlzYWJsZWRcOmN1cnNvci1ub3QtYWxsb3dlZDpkaXNhYmxlZHtjdXJzb3I6bm90LWFsbG93ZWR9LmRpc2FibGVkXDp0ZXh0LWJhY2tncm91bmQ6ZGlzYWJsZWR7Y29sb3I6aHNsKHZhcigtLWJhY2tncm91bmQpKX0uZGlzYWJsZWRcOm9wYWNpdHktNTA6ZGlzYWJsZWR7b3BhY2l0eTouNX0ucGVlcjpkaXNhYmxlZH4ucGVlci1kaXNhYmxlZFw6Y3Vyc29yLW5vdC1hbGxvd2Vke2N1cnNvcjpub3QtYWxsb3dlZH0ucGVlcjpkaXNhYmxlZH4ucGVlci1kaXNhYmxlZFw6b3BhY2l0eS03MHtvcGFjaXR5Oi43fS5hcmlhLXNlbGVjdGVkXDpiZy1hY2NlbnRbYXJpYS1zZWxlY3RlZD10cnVlXXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uYXJpYS1zZWxlY3RlZFw6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZFthcmlhLXNlbGVjdGVkPXRydWVde2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQtZm9yZWdyb3VuZCkpfS5hcmlhLXNlbGVjdGVkXDpvcGFjaXR5LTEwMFthcmlhLXNlbGVjdGVkPXRydWVde29wYWNpdHk6MX0uZGF0YS1cW2Rpc2FibGVkXF1cOnBvaW50ZXItZXZlbnRzLW5vbmVbZGF0YS1kaXNhYmxlZF17cG9pbnRlci1ldmVudHM6bm9uZX0uZGF0YS1cW3NpZGVcPWJvdHRvbVxdXDp0cmFuc2xhdGUteS0xW2RhdGEtc2lkZT1ib3R0b21dey0tdHctdHJhbnNsYXRlLXk6IC4yNXJlbTt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uZGF0YS1cW3NpZGVcPWxlZnRcXVw6LXRyYW5zbGF0ZS14LTFbZGF0YS1zaWRlPWxlZnRdey0tdHctdHJhbnNsYXRlLXg6IC0uMjVyZW07dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LmRhdGEtXFtzaWRlXD1yaWdodFxdXDp0cmFuc2xhdGUteC0xW2RhdGEtc2lkZT1yaWdodF17LS10dy10cmFuc2xhdGUteDogLjI1cmVtO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5kYXRhLVxbc2lkZVw9dG9wXF1cOi10cmFuc2xhdGUteS0xW2RhdGEtc2lkZT10b3Bdey0tdHctdHJhbnNsYXRlLXk6IC0uMjVyZW07dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LmRhdGEtXFtzdGF0ZVw9Y2hlY2tlZFxdXDp0cmFuc2xhdGUteC01W2RhdGEtc3RhdGU9Y2hlY2tlZF17LS10dy10cmFuc2xhdGUteDogMS4yNXJlbTt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uZGF0YS1cW3N0YXRlXD11bmNoZWNrZWRcXVw6dHJhbnNsYXRlLXgtMFtkYXRhLXN0YXRlPXVuY2hlY2tlZF17LS10dy10cmFuc2xhdGUteDogMHB4O3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfUBrZXlmcmFtZXMgYWNjb3JkaW9uLXVwezAle2hlaWdodDp2YXIoLS1yYWRpeC1hY2NvcmRpb24tY29udGVudC1oZWlnaHQpfXRve2hlaWdodDowfX0uZGF0YS1cW3N0YXRlXD1jbG9zZWRcXVw6YW5pbWF0ZS1hY2NvcmRpb24tdXBbZGF0YS1zdGF0ZT1jbG9zZWRde2FuaW1hdGlvbjphY2NvcmRpb24tdXAgLjJzIGVhc2Utb3V0fUBrZXlmcmFtZXMgYWNjb3JkaW9uLWRvd257MCV7aGVpZ2h0OjB9dG97aGVpZ2h0OnZhcigtLXJhZGl4LWFjY29yZGlvbi1jb250ZW50LWhlaWdodCl9fS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6YW5pbWF0ZS1hY2NvcmRpb24tZG93bltkYXRhLXN0YXRlPW9wZW5de2FuaW1hdGlvbjphY2NvcmRpb24tZG93biAuMnMgZWFzZS1vdXR9LmRhdGEtXFtzdGF0ZVw9YWN0aXZlXF1cOmJnLWJhY2tncm91bmRbZGF0YS1zdGF0ZT1hY3RpdmVde2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWJhY2tncm91bmQpKX0uZGF0YS1cW3N0YXRlXD1jaGVja2VkXF1cOmJnLWFjY2VudFtkYXRhLXN0YXRlPWNoZWNrZWRde2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5kYXRhLVxbc3RhdGVcPWNoZWNrZWRcXVw6YmctcHJpbWFyeVtkYXRhLXN0YXRlPWNoZWNrZWRde2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLXByaW1hcnkpKX0uZGF0YS1cW3N0YXRlXD1vblxdXDpiZy1hY2NlbnRbZGF0YS1zdGF0ZT1vbl0sLmRhdGEtXFtzdGF0ZVw9b3BlblxdXDpiZy1hY2NlbnRbZGF0YS1zdGF0ZT1vcGVuXXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uZGF0YS1cW3N0YXRlXD11bmNoZWNrZWRcXVw6YmctcHJpbWFyeVtkYXRhLXN0YXRlPXVuY2hlY2tlZF17YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5kYXRhLVxbc3RhdGVcPWFjdGl2ZVxdXDp0ZXh0LWZvcmVncm91bmRbZGF0YS1zdGF0ZT1hY3RpdmVde2NvbG9yOmhzbCh2YXIoLS1mb3JlZ3JvdW5kKSl9LmRhdGEtXFtzdGF0ZVw9Y2hlY2tlZFxdXDp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZFtkYXRhLXN0YXRlPWNoZWNrZWRde2NvbG9yOmhzbCh2YXIoLS1wcmltYXJ5LWZvcmVncm91bmQpKX0uZGF0YS1cW3N0YXRlXD1vblxdXDp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kW2RhdGEtc3RhdGU9b25de2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQtZm9yZWdyb3VuZCkpfS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kW2RhdGEtc3RhdGU9b3Blbl17Y29sb3I6aHNsKHZhcigtLW11dGVkLWZvcmVncm91bmQpKX0uZGF0YS1cW2Rpc2FibGVkXF1cOm9wYWNpdHktNTBbZGF0YS1kaXNhYmxlZF17b3BhY2l0eTouNX0uZGF0YS1cW3N0YXRlXD1hY3RpdmVcXVw6c2hhZG93LXNtW2RhdGEtc3RhdGU9YWN0aXZlXXstLXR3LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gLjA1KTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDFweCAycHggMCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXNoYWRvdyl9LmRhdGEtXFtzdGF0ZVw9b3BlblxdXDphbmltYXRlLWluW2RhdGEtc3RhdGU9b3Blbl17YW5pbWF0aW9uLW5hbWU6ZW50ZXI7YW5pbWF0aW9uLWR1cmF0aW9uOi4xNXM7LS10dy1lbnRlci1vcGFjaXR5OiBpbml0aWFsOy0tdHctZW50ZXItc2NhbGU6IGluaXRpYWw7LS10dy1lbnRlci1yb3RhdGU6IGluaXRpYWw7LS10dy1lbnRlci10cmFuc2xhdGUteDogaW5pdGlhbDstLXR3LWVudGVyLXRyYW5zbGF0ZS15OiBpbml0aWFsfS5kYXRhLVxbc3RhdGVcPWNsb3NlZFxdXDphbmltYXRlLW91dFtkYXRhLXN0YXRlPWNsb3NlZF17YW5pbWF0aW9uLW5hbWU6ZXhpdDthbmltYXRpb24tZHVyYXRpb246LjE1czstLXR3LWV4aXQtb3BhY2l0eTogaW5pdGlhbDstLXR3LWV4aXQtc2NhbGU6IGluaXRpYWw7LS10dy1leGl0LXJvdGF0ZTogaW5pdGlhbDstLXR3LWV4aXQtdHJhbnNsYXRlLXg6IGluaXRpYWw7LS10dy1leGl0LXRyYW5zbGF0ZS15OiBpbml0aWFsfS5kYXRhLVxbc3RhdGVcPWNsb3NlZFxdXDpmYWRlLW91dC0wW2RhdGEtc3RhdGU9Y2xvc2VkXXstLXR3LWV4aXQtb3BhY2l0eTogMH0uZGF0YS1cW3N0YXRlXD1vcGVuXF1cOmZhZGUtaW4tMFtkYXRhLXN0YXRlPW9wZW5dey0tdHctZW50ZXItb3BhY2l0eTogMH0uZGF0YS1cW3N0YXRlXD1jbG9zZWRcXVw6em9vbS1vdXQtOTVbZGF0YS1zdGF0ZT1jbG9zZWRdey0tdHctZXhpdC1zY2FsZTogLjk1fS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6em9vbS1pbi05NVtkYXRhLXN0YXRlPW9wZW5dey0tdHctZW50ZXItc2NhbGU6IC45NX0uZGF0YS1cW3NpZGVcPWJvdHRvbVxdXDpzbGlkZS1pbi1mcm9tLXRvcC0yW2RhdGEtc2lkZT1ib3R0b21dey0tdHctZW50ZXItdHJhbnNsYXRlLXk6IC0uNXJlbX0uZGF0YS1cW3NpZGVcPWxlZnRcXVw6c2xpZGUtaW4tZnJvbS1yaWdodC0yW2RhdGEtc2lkZT1sZWZ0XXstLXR3LWVudGVyLXRyYW5zbGF0ZS14OiAuNXJlbX0uZGF0YS1cW3NpZGVcPXJpZ2h0XF1cOnNsaWRlLWluLWZyb20tbGVmdC0yW2RhdGEtc2lkZT1yaWdodF17LS10dy1lbnRlci10cmFuc2xhdGUteDogLS41cmVtfS5kYXRhLVxbc2lkZVw9dG9wXF1cOnNsaWRlLWluLWZyb20tYm90dG9tLTJbZGF0YS1zaWRlPXRvcF17LS10dy1lbnRlci10cmFuc2xhdGUteTogLjVyZW19LmRhdGEtXFtzdGF0ZVw9Y2xvc2VkXF1cOnNsaWRlLW91dC10by1sZWZ0LTFcLzJbZGF0YS1zdGF0ZT1jbG9zZWRdey0tdHctZXhpdC10cmFuc2xhdGUteDogLTUwJX0uZGF0YS1cW3N0YXRlXD1jbG9zZWRcXVw6c2xpZGUtb3V0LXRvLXRvcC1cWzQ4XCVcXVtkYXRhLXN0YXRlPWNsb3NlZF17LS10dy1leGl0LXRyYW5zbGF0ZS15OiAtNDglfS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6c2xpZGUtaW4tZnJvbS1sZWZ0LTFcLzJbZGF0YS1zdGF0ZT1vcGVuXXstLXR3LWVudGVyLXRyYW5zbGF0ZS14OiAtNTAlfS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6c2xpZGUtaW4tZnJvbS10b3AtXFs0OFwlXF1bZGF0YS1zdGF0ZT1vcGVuXXstLXR3LWVudGVyLXRyYW5zbGF0ZS15OiAtNDglfTppcyhbZGF0YS1tb2RlPWRhcmtdIC5kYXJrXDpib3JkZXItd2hpdGUpey0tdHctYm9yZGVyLW9wYWNpdHk6IDE7Ym9yZGVyLWNvbG9yOnJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSl9QG1lZGlhIChtaW4td2lkdGg6IDY0MHB4KXsuc21cOm10LTB7bWFyZ2luLXRvcDowfS5zbVw6YmxvY2t7ZGlzcGxheTpibG9ja30uc21cOmZsZXgtcm93e2ZsZXgtZGlyZWN0aW9uOnJvd30uc21cOmp1c3RpZnktZW5ke2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0uc21cOnNwYWNlLXgtMj46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXgtcmV2ZXJzZTogMDttYXJnaW4tcmlnaHQ6Y2FsYyguNXJlbSAqIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpO21hcmdpbi1sZWZ0OmNhbGMoLjVyZW0gKiBjYWxjKDEgLSB2YXIoLS10dy1zcGFjZS14LXJldmVyc2UpKSl9LnNtXDpzcGFjZS14LTQ+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS14LXJldmVyc2U6IDA7bWFyZ2luLXJpZ2h0OmNhbGMoMXJlbSAqIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpO21hcmdpbi1sZWZ0OmNhbGMoMXJlbSAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpKX0uc21cOnNwYWNlLXktMD46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXktcmV2ZXJzZTogMDttYXJnaW4tdG9wOmNhbGMoMHB4ICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSkpO21hcmdpbi1ib3R0b206Y2FsYygwcHggKiB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKX0uc21cOnJvdW5kZWQtbGd7Ym9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMpfS5zbVw6cC0we3BhZGRpbmc6MH0uc21cOnRleHQtbGVmdHt0ZXh0LWFsaWduOmxlZnR9fUBtZWRpYSAobWluLXdpZHRoOiA3NjhweCl7Lm1kXDp3LWZ1bGx7d2lkdGg6MTAwJX19LlxbXCZcOmhhc1woXFthcmlhLXNlbGVjdGVkXF1cKVxdXDpiZy1hY2NlbnQ6aGFzKFthcmlhLXNlbGVjdGVkXSl7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmZpcnN0XDpcW1wmXDpoYXNcKFxbYXJpYS1zZWxlY3RlZFxdXClcXVw6cm91bmRlZC1sLW1kOmhhcyhbYXJpYS1zZWxlY3RlZF0pOmZpcnN0LWNoaWxke2JvcmRlci10b3AtbGVmdC1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpIC0gMnB4KTtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSAtIDJweCl9Lmxhc3RcOlxbXCZcOmhhc1woXFthcmlhLXNlbGVjdGVkXF1cKVxdXDpyb3VuZGVkLXItbWQ6aGFzKFthcmlhLXNlbGVjdGVkXSk6bGFzdC1jaGlsZHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czpjYWxjKHZhcigtLXJhZGl1cykgLSAycHgpO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSAtIDJweCl9LlxbXCZcW2RhdGEtc3RhdGVcPW9wZW5cXVw+c3ZnXF1cOnJvdGF0ZS0xODBbZGF0YS1zdGF0ZT1vcGVuXT5zdmd7LS10dy1yb3RhdGU6IDE4MGRlZzt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uXFtcJl9cW2NtZGstZ3JvdXAtaGVhZGluZ1xdXF1cOnB4LTIgW2NtZGstZ3JvdXAtaGVhZGluZ117cGFkZGluZy1sZWZ0Oi41cmVtO3BhZGRpbmctcmlnaHQ6LjVyZW19LlxbXCZfXFtjbWRrLWdyb3VwLWhlYWRpbmdcXVxdXDpweS0xXC41IFtjbWRrLWdyb3VwLWhlYWRpbmdde3BhZGRpbmctdG9wOi4zNzVyZW07cGFkZGluZy1ib3R0b206LjM3NXJlbX0uXFtcJl9cW2NtZGstZ3JvdXAtaGVhZGluZ1xdXF1cOnRleHQteHMgW2NtZGstZ3JvdXAtaGVhZGluZ117Zm9udC1zaXplOi43NXJlbTtsaW5lLWhlaWdodDoxcmVtfS5cW1wmX1xbY21kay1ncm91cC1oZWFkaW5nXF1cXVw6Zm9udC1tZWRpdW0gW2NtZGstZ3JvdXAtaGVhZGluZ117Zm9udC13ZWlnaHQ6NTAwfS5cW1wmX1xbY21kay1ncm91cC1oZWFkaW5nXF1cXVw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIFtjbWRrLWdyb3VwLWhlYWRpbmdde2NvbG9yOmhzbCh2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKSl9LlxbXCZfXFtjbWRrLWdyb3VwXF1cOm5vdFwoXFtoaWRkZW5cXVwpX1x+XFtjbWRrLWdyb3VwXF1cXVw6cHQtMCBbY21kay1ncm91cF06bm90KFtoaWRkZW5dKX5bY21kay1ncm91cF17cGFkZGluZy10b3A6MH0uXFtcJl9cW2NtZGstZ3JvdXBcXVxdXDpweC0yIFtjbWRrLWdyb3VwXXtwYWRkaW5nLWxlZnQ6LjVyZW07cGFkZGluZy1yaWdodDouNXJlbX0uXFtcJl9cW2NtZGstaW5wdXQtd3JhcHBlclxdX3N2Z1xdXDpoLTUgW2NtZGstaW5wdXQtd3JhcHBlcl0gc3Zne2hlaWdodDoxLjI1cmVtfS5cW1wmX1xbY21kay1pbnB1dC13cmFwcGVyXF1fc3ZnXF1cOnctNSBbY21kay1pbnB1dC13cmFwcGVyXSBzdmd7d2lkdGg6MS4yNXJlbX0uXFtcJl9cW2NtZGstaW5wdXRcXVxdXDpoLTEyIFtjbWRrLWlucHV0XXtoZWlnaHQ6M3JlbX0uXFtcJl9cW2NtZGstaXRlbVxdXF1cOnB4LTIgW2NtZGstaXRlbV17cGFkZGluZy1sZWZ0Oi41cmVtO3BhZGRpbmctcmlnaHQ6LjVyZW19LlxbXCZfXFtjbWRrLWl0ZW1cXVxdXDpweS0zIFtjbWRrLWl0ZW1de3BhZGRpbmctdG9wOi43NXJlbTtwYWRkaW5nLWJvdHRvbTouNzVyZW19LlxbXCZfXFtjbWRrLWl0ZW1cXV9zdmdcXVw6aC01IFtjbWRrLWl0ZW1dIHN2Z3toZWlnaHQ6MS4yNXJlbX0uXFtcJl9cW2NtZGstaXRlbVxdX3N2Z1xdXDp3LTUgW2NtZGstaXRlbV0gc3Zne3dpZHRoOjEuMjVyZW19Cg==","/index.html":"PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiIC8+CiAgICA8dGl0bGU+VmFsPC90aXRsZT4KICAgIDxzY3JpcHQgdHlwZT0ibW9kdWxlIiBjcm9zc29yaWdpbiBzcmM9Ii9hcGkvdmFsL3N0YXRpYy9hc3NldHMvaW5kZXgtQzlGQ0hjYUcuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBjcm9zc29yaWdpbiBocmVmPSIvYXBpL3ZhbC9zdGF0aWMvYXNzZXRzL2luZGV4LU9sOWxpV1dmLmNzcyI+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0icm9vdCI+PC9kaXY+CiAgPC9ib2R5Pgo8L2h0bWw+Cg=="}`
21
21
  );
22
22
  function createUIRequestHandler() {
23
23
  if (typeof files !== "object") {