gl-draw 0.17.0-beta.3 → 0.17.0-beta.30

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.
Files changed (33) hide show
  1. package/dist/constants.d.ts +0 -1
  2. package/dist/core/BaseObject/PointerEvent.d.ts +1 -0
  3. package/dist/core/BaseObject/index.d.ts +4 -4
  4. package/dist/core/Composer.d.ts +5 -5
  5. package/dist/core/Lead/Pick.d.ts +35 -3
  6. package/dist/core/Lead/index.d.ts +5 -6
  7. package/dist/core/Pages/Pages.d.ts +1 -0
  8. package/dist/core/Pencil.d.ts +3 -3
  9. package/dist/core/pass/OutputPass.d.ts +1 -2
  10. package/dist/index.js +2 -2
  11. package/dist/index.module.js +498 -407
  12. package/dist/index.module2.js +1097 -0
  13. package/dist/index2.js +140 -0
  14. package/dist/objects/extrudePolygon/createGeometry.d.ts +2 -1
  15. package/dist/objects/group/index.d.ts +1 -0
  16. package/dist/objects/index.js +1 -1
  17. package/dist/objects/index.module.js +339 -379
  18. package/dist/objects/node/index.d.ts +4 -2
  19. package/dist/objects/pie/index.d.ts +2 -1
  20. package/dist/plugins/Worker/getAttributes/conicLine.d.ts +2 -3
  21. package/dist/plugins/Worker/getAttributes/conicPolygon.d.ts +2 -3
  22. package/dist/plugins/Worker/getAttributes/extrudePolygon.d.ts +2 -4
  23. package/dist/plugins/Worker/getAttributes/getCoordinatesArr.d.ts +5 -1
  24. package/dist/plugins/Worker/getAttributes/getMessage.d.ts +1 -1
  25. package/dist/plugins/Worker/getAttributes/line.d.ts +2 -2
  26. package/dist/plugins/Worker/getAttributes/line2.d.ts +2 -2
  27. package/dist/plugins/Worker/getAttributes/splitPolygonsByLongitudeDifference.d.ts +5 -2
  28. package/dist/plugins/Worker/index.d.ts +3 -3
  29. package/dist/plugins/index.js +1 -1
  30. package/dist/plugins/index.module.js +77 -57
  31. package/package.json +1 -1
  32. package/dist/WebGPULineSegments2.js +0 -140
  33. package/dist/WebGPULineSegments2.module.js +0 -1031
@@ -1 +1 @@
1
- "use strict";var n=Object.defineProperty;var u=Object.getOwnPropertySymbols;var R=Object.prototype.hasOwnProperty,z=Object.prototype.propertyIsEnumerable;var S=(l,b,d)=>b in l?n(l,b,{enumerable:!0,configurable:!0,writable:!0,value:d}):l[b]=d,y=(l,b)=>{for(var d in b||(b={}))R.call(b,d)&&S(l,d,b[d]);if(u)for(var d of u(b))z.call(b,d)&&S(l,d,b[d]);return l};var o=(l,b)=>{var d={};for(var G in l)R.call(l,G)&&b.indexOf(G)<0&&(d[G]=l[G]);if(l!=null&&u)for(var G of u(l))b.indexOf(G)<0&&z.call(l,G)&&(d[G]=l[G]);return d};var V=(l,b,d)=>new Promise((G,m)=>{var Z=X=>{try{W(d.next(X))}catch(c){m(c)}},L=X=>{try{W(d.throw(X))}catch(c){m(c)}},W=X=>X.done?G(X.value):Promise.resolve(X.value).then(Z,L);W((d=d.apply(l,b)).next())});Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const k=require("esus-lite"),Y=require("idb-keyval"),K=require("three"),H=l=>{const b=new K.BufferGeometry;return Object.keys(l).forEach(d=>{d==="groups"?l[d].forEach(G=>{b.addGroup(G.start,G.count,G.materialIndex)}):d==="index"?b.setIndex(new K.BufferAttribute(l[d].array,l[d].itemSize)):b.setAttribute(d,new K.BufferAttribute(l[d].array,l[d].itemSize))}),b},M="dmFyIE9nPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxEZz1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgJGc9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIGlvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIEt1PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksdGY9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgQWM9KEosaik9PihqPVN5bWJvbFtKXSk/ajpTeW1ib2wuZm9yKCJTeW1ib2wuIitKKSxWZz1KPT57dGhyb3cgVHlwZUVycm9yKEopfSx3aT1NYXRoLnBvdyxRdT0oSixqLHl0KT0+aiBpbiBKP09nKEosaix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6eXR9KTpKW2pdPXl0LEl0PShKLGopPT57Zm9yKHZhciB5dCBpbiBqfHwoaj17fSkpS3UuY2FsbChqLHl0KSYmUXUoSix5dCxqW3l0XSk7aWYoaW8pZm9yKHZhciB5dCBvZiBpbyhqKSl0Zi5jYWxsKGoseXQpJiZRdShKLHl0LGpbeXRdKTtyZXR1cm4gSn0sSGU9KEosaik9PkRnKEosJGcoaikpO3ZhciBlZj0oSixqKT0+e3ZhciB5dD17fTtmb3IodmFyIEF0IGluIEopS3UuY2FsbChKLEF0KSYmai5pbmRleE9mKEF0KTwwJiYoeXRbQXRdPUpbQXRdKTtpZihKIT1udWxsJiZpbylmb3IodmFyIEF0IG9mIGlvKEopKWouaW5kZXhPZihBdCk8MCYmdGYuY2FsbChKLEF0KSYmKHl0W0F0XT1KW0F0XSk7cmV0dXJuIHl0fTt2YXIgVWc9ZnVuY3Rpb24oSixqKXt0aGlzWzBdPUosdGhpc1sxXT1qfTt2YXIgbmY9Sj0+e3ZhciBqPUpbQWMoImFzeW5jSXRlcmF0b3IiKV0seXQ9ITEsQXQsbG49e307cmV0dXJuIGo9PW51bGw/KGo9SltBYygiaXRlcmF0b3IiKV0oKSxBdD12ZT0+bG5bdmVdPUluPT5qW3ZlXShJbikpOihqPWouY2FsbChKKSxBdD12ZT0+bG5bdmVdPUluPT57aWYoeXQpe2lmKHl0PSExLHZlPT09InRocm93Iil0aHJvdyBJbjtyZXR1cm4gSW59cmV0dXJuIHl0PSEwLHtkb25lOiExLHZhbHVlOm5ldyBVZyhuZXcgUHJvbWlzZShTYz0+e3ZhciBzbz1qW3ZlXShJbik7c28gaW5zdGFuY2VvZiBPYmplY3R8fFZnKCJPYmplY3QgZXhwZWN0ZWQiKSxTYyhzbyl9KSwxKX19KSxsbltBYygiaXRlcmF0b3IiKV09KCk9PmxuLEF0KCJuZXh0IiksInRocm93ImluIGo/QXQoInRocm93Iik6bG4udGhyb3c9dmU9Pnt0aHJvdyB2ZX0sInJldHVybiJpbiBqJiZBdCgicmV0dXJuIiksbG59OyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjsvKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IDIwMTAtMjAyNSBUaHJlZS5qcyBBdXRob3JzCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICovY29uc3QgSj0iMTgxIix2Yz0iIixhZT0ic3JnYiIsX2M9InNyZ2ItbGluZWFyIix6Yz0ibGluZWFyIixybz0ic3JnYiI7ZnVuY3Rpb24gc2YoaSl7Zm9yKGxldCB0PWkubGVuZ3RoLTE7dD49MDstLXQpaWYoaVt0XT49NjU1MzUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gVGMoaSl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsaSl9Y29uc3QgUGM9e307ZnVuY3Rpb24gTXQoLi4uaSl7Y29uc3QgdD0iVEhSRUUuIitpLnNoaWZ0KCk7Y29uc29sZS53YXJuKHQsLi4uaSl9ZnVuY3Rpb24gaG4oLi4uaSl7Y29uc3QgdD0iVEhSRUUuIitpLnNoaWZ0KCk7Y29uc29sZS5lcnJvcih0LC4uLmkpfWZ1bmN0aW9uIENjKC4uLmkpe2NvbnN0IHQ9aS5qb2luKCIgIik7dCBpbiBQY3x8KFBjW3RdPSEwLE10KC4uLmkpKX1jbGFzcyBmc3thZGRFdmVudExpc3RlbmVyKHQsZSl7dGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwJiYodGhpcy5fbGlzdGVuZXJzPXt9KTtjb25zdCBuPXRoaXMuX2xpc3RlbmVycztuW3RdPT09dm9pZCAwJiYoblt0XT1bXSksblt0XS5pbmRleE9mKGUpPT09LTEmJm5bdF0ucHVzaChlKX1oYXNFdmVudExpc3RlbmVyKHQsZSl7Y29uc3Qgbj10aGlzLl9saXN0ZW5lcnM7cmV0dXJuIG49PT12b2lkIDA/ITE6blt0XSE9PXZvaWQgMCYmblt0XS5pbmRleE9mKGUpIT09LTF9cmVtb3ZlRXZlbnRMaXN0ZW5lcih0LGUpe2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzO2lmKG49PT12b2lkIDApcmV0dXJuO2NvbnN0IHM9blt0XTtpZihzIT09dm9pZCAwKXtjb25zdCByPXMuaW5kZXhPZihlKTtyIT09LTEmJnMuc3BsaWNlKHIsMSl9fWRpc3BhdGNoRXZlbnQodCl7Y29uc3QgZT10aGlzLl9saXN0ZW5lcnM7aWYoZT09PXZvaWQgMClyZXR1cm47Y29uc3Qgbj1lW3QudHlwZV07aWYobiE9PXZvaWQgMCl7dC50YXJnZXQ9dGhpcztjb25zdCBzPW4uc2xpY2UoMCk7Zm9yKGxldCByPTAsbz1zLmxlbmd0aDtyPG87cisrKXNbcl0uY2FsbCh0aGlzLHQpO3QudGFyZ2V0PW51bGx9fX1jb25zdCBTdD1bIjAwIiwiMDEiLCIwMiIsIjAzIiwiMDQiLCIwNSIsIjA2IiwiMDciLCIwOCIsIjA5IiwiMGEiLCIwYiIsIjBjIiwiMGQiLCIwZSIsIjBmIiwiMTAiLCIxMSIsIjEyIiwiMTMiLCIxNCIsIjE1IiwiMTYiLCIxNyIsIjE4IiwiMTkiLCIxYSIsIjFiIiwiMWMiLCIxZCIsIjFlIiwiMWYiLCIyMCIsIjIxIiwiMjIiLCIyMyIsIjI0IiwiMjUiLCIyNiIsIjI3IiwiMjgiLCIyOSIsIjJhIiwiMmIiLCIyYyIsIjJkIiwiMmUiLCIyZiIsIjMwIiwiMzEiLCIzMiIsIjMzIiwiMzQiLCIzNSIsIjM2IiwiMzciLCIzOCIsIjM5IiwiM2EiLCIzYiIsIjNjIiwiM2QiLCIzZSIsIjNmIiwiNDAiLCI0MSIsIjQyIiwiNDMiLCI0NCIsIjQ1IiwiNDYiLCI0NyIsIjQ4IiwiNDkiLCI0YSIsIjRiIiwiNGMiLCI0ZCIsIjRlIiwiNGYiLCI1MCIsIjUxIiwiNTIiLCI1MyIsIjU0IiwiNTUiLCI1NiIsIjU3IiwiNTgiLCI1OSIsIjVhIiwiNWIiLCI1YyIsIjVkIiwiNWUiLCI1ZiIsIjYwIiwiNjEiLCI2MiIsIjYzIiwiNjQiLCI2NSIsIjY2IiwiNjciLCI2OCIsIjY5IiwiNmEiLCI2YiIsIjZjIiwiNmQiLCI2ZSIsIjZmIiwiNzAiLCI3MSIsIjcyIiwiNzMiLCI3NCIsIjc1IiwiNzYiLCI3NyIsIjc4IiwiNzkiLCI3YSIsIjdiIiwiN2MiLCI3ZCIsIjdlIiwiN2YiLCI4MCIsIjgxIiwiODIiLCI4MyIsIjg0IiwiODUiLCI4NiIsIjg3IiwiODgiLCI4OSIsIjhhIiwiOGIiLCI4YyIsIjhkIiwiOGUiLCI4ZiIsIjkwIiwiOTEiLCI5MiIsIjkzIiwiOTQiLCI5NSIsIjk2IiwiOTciLCI5OCIsIjk5IiwiOWEiLCI5YiIsIjljIiwiOWQiLCI5ZSIsIjlmIiwiYTAiLCJhMSIsImEyIiwiYTMiLCJhNCIsImE1IiwiYTYiLCJhNyIsImE4IiwiYTkiLCJhYSIsImFiIiwiYWMiLCJhZCIsImFlIiwiYWYiLCJiMCIsImIxIiwiYjIiLCJiMyIsImI0IiwiYjUiLCJiNiIsImI3IiwiYjgiLCJiOSIsImJhIiwiYmIiLCJiYyIsImJkIiwiYmUiLCJiZiIsImMwIiwiYzEiLCJjMiIsImMzIiwiYzQiLCJjNSIsImM2IiwiYzciLCJjOCIsImM5IiwiY2EiLCJjYiIsImNjIiwiY2QiLCJjZSIsImNmIiwiZDAiLCJkMSIsImQyIiwiZDMiLCJkNCIsImQ1IiwiZDYiLCJkNyIsImQ4IiwiZDkiLCJkYSIsImRiIiwiZGMiLCJkZCIsImRlIiwiZGYiLCJlMCIsImUxIiwiZTIiLCJlMyIsImU0IiwiZTUiLCJlNiIsImU3IiwiZTgiLCJlOSIsImVhIiwiZWIiLCJlYyIsImVkIiwiZWUiLCJlZiIsImYwIiwiZjEiLCJmMiIsImYzIiwiZjQiLCJmNSIsImY2IiwiZjciLCJmOCIsImY5IiwiZmEiLCJmYiIsImZjIiwiZmQiLCJmZSIsImZmIl07ZnVuY3Rpb24ga24oKXtjb25zdCBpPU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5NXwwLHQ9TWF0aC5yYW5kb20oKSo0Mjk0OTY3Mjk1fDAsZT1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MCxuPU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5NXwwO3JldHVybihTdFtpJjI1NV0rU3RbaT4+OCYyNTVdK1N0W2k+PjE2JjI1NV0rU3RbaT4+MjQmMjU1XSsiLSIrU3RbdCYyNTVdK1N0W3Q+PjgmMjU1XSsiLSIrU3RbdD4+MTYmMTV8NjRdK1N0W3Q+PjI0JjI1NV0rIi0iK1N0W2UmNjN8MTI4XStTdFtlPj44JjI1NV0rIi0iK1N0W2U+PjE2JjI1NV0rU3RbZT4+MjQmMjU1XStTdFtuJjI1NV0rU3Rbbj4+OCYyNTVdK1N0W24+PjE2JjI1NV0rU3Rbbj4+MjQmMjU1XSkudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBaKGksdCxlKXtyZXR1cm4gTWF0aC5tYXgodCxNYXRoLm1pbihlLGkpKX1mdW5jdGlvbiByZihpLHQpe3JldHVybihpJXQrdCkldH1mdW5jdGlvbiBvbyhpLHQsZSl7cmV0dXJuKDEtZSkqaStlKnR9ZnVuY3Rpb24gYmkoaSx0KXtzd2l0Y2godC5jb25zdHJ1Y3Rvcil7Y2FzZSBGbG9hdDMyQXJyYXk6cmV0dXJuIGk7Y2FzZSBVaW50MzJBcnJheTpyZXR1cm4gaS80Mjk0OTY3Mjk1O2Nhc2UgVWludDE2QXJyYXk6cmV0dXJuIGkvNjU1MzU7Y2FzZSBVaW50OEFycmF5OnJldHVybiBpLzI1NTtjYXNlIEludDMyQXJyYXk6cmV0dXJuIE1hdGgubWF4KGkvMjE0NzQ4MzY0NywtMSk7Y2FzZSBJbnQxNkFycmF5OnJldHVybiBNYXRoLm1heChpLzMyNzY3LC0xKTtjYXNlIEludDhBcnJheTpyZXR1cm4gTWF0aC5tYXgoaS8xMjcsLTEpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCB0eXBlLiIpfX1mdW5jdGlvbiBrdChpLHQpe3N3aXRjaCh0LmNvbnN0cnVjdG9yKXtjYXNlIEZsb2F0MzJBcnJheTpyZXR1cm4gaTtjYXNlIFVpbnQzMkFycmF5OnJldHVybiBNYXRoLnJvdW5kKGkqNDI5NDk2NzI5NSk7Y2FzZSBVaW50MTZBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChpKjY1NTM1KTtjYXNlIFVpbnQ4QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSoyNTUpO2Nhc2UgSW50MzJBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChpKjIxNDc0ODM2NDcpO2Nhc2UgSW50MTZBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChpKjMyNzY3KTtjYXNlIEludDhBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChpKjEyNyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHR5cGUuIil9fWNsYXNzIE57Y29uc3RydWN0b3IodD0wLGU9MCl7Ti5wcm90b3R5cGUuaXNWZWN0b3IyPSEwLHRoaXMueD10LHRoaXMueT1lfWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnh9c2V0IHdpZHRoKHQpe3RoaXMueD10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy55fXNldCBoZWlnaHQodCl7dGhpcy55PXR9c2V0KHQsZSl7cmV0dXJuIHRoaXMueD10LHRoaXMueT1lLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscz10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9c1swXSplK3NbM10qbitzWzZdLHRoaXMueT1zWzFdKmUrc1s0XSpuK3NbN10sdGhpc31taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9Wih0aGlzLngsdC54LGUueCksdGhpcy55PVoodGhpcy55LHQueSxlLnkpLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PVoodGhpcy54LHQsZSksdGhpcy55PVoodGhpcy55LHQsZSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IG49dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobnx8MSkubXVsdGlwbHlTY2FsYXIoWihuLHQsZSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD1NYXRoLnRydW5jKHRoaXMueCksdGhpcy55PU1hdGgudHJ1bmModGhpcy55KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55fWNyb3NzKHQpe3JldHVybiB0aGlzLngqdC55LXRoaXMueSp0Lnh9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55KX1tYW5oYXR0YW5MZW5ndGgoKXtyZXR1cm4gTWF0aC5hYnModGhpcy54KStNYXRoLmFicyh0aGlzLnkpfW5vcm1hbGl6ZSgpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX1hbmdsZSgpe3JldHVybiBNYXRoLmF0YW4yKC10aGlzLnksLXRoaXMueCkrTWF0aC5QSX1hbmdsZVRvKHQpe2NvbnN0IGU9TWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSp0Lmxlbmd0aFNxKCkpO2lmKGU9PT0wKXJldHVybiBNYXRoLlBJLzI7Y29uc3Qgbj10aGlzLmRvdCh0KS9lO3JldHVybiBNYXRoLmFjb3MoWihuLC0xLDEpKX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LG49dGhpcy55LXQueTtyZXR1cm4gZSplK24qbn1tYW5oYXR0YW5EaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLngtdC54KStNYXRoLmFicyh0aGlzLnktdC55KX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnl9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLng9dC5nZXRYKGUpLHRoaXMueT10LmdldFkoZSksdGhpc31yb3RhdGVBcm91bmQodCxlKXtjb25zdCBuPU1hdGguY29zKGUpLHM9TWF0aC5zaW4oZSkscj10aGlzLngtdC54LG89dGhpcy55LXQueTtyZXR1cm4gdGhpcy54PXIqbi1vKnMrdC54LHRoaXMueT1yKnMrbypuK3QueSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnl9fWNsYXNzIE1pe2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0wLHM9MSl7dGhpcy5pc1F1YXRlcm5pb249ITAsdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fdz1zfXN0YXRpYyBzbGVycEZsYXQodCxlLG4scyxyLG8sYSl7bGV0IGM9bltzKzBdLGw9bltzKzFdLGg9bltzKzJdLHU9bltzKzNdLGY9cltvKzBdLGQ9cltvKzFdLHA9cltvKzJdLHk9cltvKzNdO2lmKGE8PTApe3RbZSswXT1jLHRbZSsxXT1sLHRbZSsyXT1oLHRbZSszXT11O3JldHVybn1pZihhPj0xKXt0W2UrMF09Zix0W2UrMV09ZCx0W2UrMl09cCx0W2UrM109eTtyZXR1cm59aWYodSE9PXl8fGMhPT1mfHxsIT09ZHx8aCE9PXApe2xldCBtPWMqZitsKmQraCpwK3UqeTttPDAmJihmPS1mLGQ9LWQscD0tcCx5PS15LG09LW0pO2xldCBnPTEtYTtpZihtPC45OTk1KXtjb25zdCBiPU1hdGguYWNvcyhtKSx4PU1hdGguc2luKGIpO2c9TWF0aC5zaW4oZypiKS94LGE9TWF0aC5zaW4oYSpiKS94LGM9YypnK2YqYSxsPWwqZytkKmEsaD1oKmcrcCphLHU9dSpnK3kqYX1lbHNle2M9YypnK2YqYSxsPWwqZytkKmEsaD1oKmcrcCphLHU9dSpnK3kqYTtjb25zdCBiPTEvTWF0aC5zcXJ0KGMqYytsKmwraCpoK3UqdSk7Yyo9YixsKj1iLGgqPWIsdSo9Yn19dFtlXT1jLHRbZSsxXT1sLHRbZSsyXT1oLHRbZSszXT11fXN0YXRpYyBtdWx0aXBseVF1YXRlcm5pb25zRmxhdCh0LGUsbixzLHIsbyl7Y29uc3QgYT1uW3NdLGM9bltzKzFdLGw9bltzKzJdLGg9bltzKzNdLHU9cltvXSxmPXJbbysxXSxkPXJbbysyXSxwPXJbbyszXTtyZXR1cm4gdFtlXT1hKnAraCp1K2MqZC1sKmYsdFtlKzFdPWMqcCtoKmYrbCp1LWEqZCx0W2UrMl09bCpwK2gqZCthKmYtYyp1LHRbZSszXT1oKnAtYSp1LWMqZi1sKmQsdH1nZXQgeCgpe3JldHVybiB0aGlzLl94fXNldCB4KHQpe3RoaXMuX3g9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHkoKXtyZXR1cm4gdGhpcy5feX1zZXQgeSh0KXt0aGlzLl95PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB6KCl7cmV0dXJuIHRoaXMuX3p9c2V0IHoodCl7dGhpcy5fej10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgdygpe3JldHVybiB0aGlzLl93fXNldCB3KHQpe3RoaXMuX3c9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9c2V0KHQsZSxuLHMpe3JldHVybiB0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl93PXMsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3osdGhpcy5fdyl9Y29weSh0KXtyZXR1cm4gdGhpcy5feD10LngsdGhpcy5feT10LnksdGhpcy5fej10LnosdGhpcy5fdz10LncsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbUV1bGVyKHQsZT0hMCl7Y29uc3Qgbj10Ll94LHM9dC5feSxyPXQuX3osbz10Ll9vcmRlcixhPU1hdGguY29zLGM9TWF0aC5zaW4sbD1hKG4vMiksaD1hKHMvMiksdT1hKHIvMiksZj1jKG4vMiksZD1jKHMvMikscD1jKHIvMik7c3dpdGNoKG8pe2Nhc2UiWFlaIjp0aGlzLl94PWYqaCp1K2wqZCpwLHRoaXMuX3k9bCpkKnUtZipoKnAsdGhpcy5fej1sKmgqcCtmKmQqdSx0aGlzLl93PWwqaCp1LWYqZCpwO2JyZWFrO2Nhc2UiWVhaIjp0aGlzLl94PWYqaCp1K2wqZCpwLHRoaXMuX3k9bCpkKnUtZipoKnAsdGhpcy5fej1sKmgqcC1mKmQqdSx0aGlzLl93PWwqaCp1K2YqZCpwO2JyZWFrO2Nhc2UiWlhZIjp0aGlzLl94PWYqaCp1LWwqZCpwLHRoaXMuX3k9bCpkKnUrZipoKnAsdGhpcy5fej1sKmgqcCtmKmQqdSx0aGlzLl93PWwqaCp1LWYqZCpwO2JyZWFrO2Nhc2UiWllYIjp0aGlzLl94PWYqaCp1LWwqZCpwLHRoaXMuX3k9bCpkKnUrZipoKnAsdGhpcy5fej1sKmgqcC1mKmQqdSx0aGlzLl93PWwqaCp1K2YqZCpwO2JyZWFrO2Nhc2UiWVpYIjp0aGlzLl94PWYqaCp1K2wqZCpwLHRoaXMuX3k9bCpkKnUrZipoKnAsdGhpcy5fej1sKmgqcC1mKmQqdSx0aGlzLl93PWwqaCp1LWYqZCpwO2JyZWFrO2Nhc2UiWFpZIjp0aGlzLl94PWYqaCp1LWwqZCpwLHRoaXMuX3k9bCpkKnUtZipoKnAsdGhpcy5fej1sKmgqcCtmKmQqdSx0aGlzLl93PWwqaCp1K2YqZCpwO2JyZWFrO2RlZmF1bHQ6TXQoIlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIG9yZGVyOiAiK28pfXJldHVybiBlPT09ITAmJnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21BeGlzQW5nbGUodCxlKXtjb25zdCBuPWUvMixzPU1hdGguc2luKG4pO3JldHVybiB0aGlzLl94PXQueCpzLHRoaXMuX3k9dC55KnMsdGhpcy5fej10Lnoqcyx0aGlzLl93PU1hdGguY29zKG4pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Sb3RhdGlvbk1hdHJpeCh0KXtjb25zdCBlPXQuZWxlbWVudHMsbj1lWzBdLHM9ZVs0XSxyPWVbOF0sbz1lWzFdLGE9ZVs1XSxjPWVbOV0sbD1lWzJdLGg9ZVs2XSx1PWVbMTBdLGY9bithK3U7aWYoZj4wKXtjb25zdCBkPS41L01hdGguc3FydChmKzEpO3RoaXMuX3c9LjI1L2QsdGhpcy5feD0oaC1jKSpkLHRoaXMuX3k9KHItbCkqZCx0aGlzLl96PShvLXMpKmR9ZWxzZSBpZihuPmEmJm4+dSl7Y29uc3QgZD0yKk1hdGguc3FydCgxK24tYS11KTt0aGlzLl93PShoLWMpL2QsdGhpcy5feD0uMjUqZCx0aGlzLl95PShzK28pL2QsdGhpcy5fej0ocitsKS9kfWVsc2UgaWYoYT51KXtjb25zdCBkPTIqTWF0aC5zcXJ0KDErYS1uLXUpO3RoaXMuX3c9KHItbCkvZCx0aGlzLl94PShzK28pL2QsdGhpcy5feT0uMjUqZCx0aGlzLl96PShjK2gpL2R9ZWxzZXtjb25zdCBkPTIqTWF0aC5zcXJ0KDErdS1uLWEpO3RoaXMuX3c9KG8tcykvZCx0aGlzLl94PShyK2wpL2QsdGhpcy5feT0oYytoKS9kLHRoaXMuX3o9LjI1KmR9cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Vbml0VmVjdG9ycyh0LGUpe2xldCBuPXQuZG90KGUpKzE7cmV0dXJuIG48MWUtOD8obj0wLE1hdGguYWJzKHQueCk+TWF0aC5hYnModC56KT8odGhpcy5feD0tdC55LHRoaXMuX3k9dC54LHRoaXMuX3o9MCx0aGlzLl93PW4pOih0aGlzLl94PTAsdGhpcy5feT0tdC56LHRoaXMuX3o9dC55LHRoaXMuX3c9bikpOih0aGlzLl94PXQueSplLnotdC56KmUueSx0aGlzLl95PXQueiplLngtdC54KmUueix0aGlzLl96PXQueCplLnktdC55KmUueCx0aGlzLl93PW4pLHRoaXMubm9ybWFsaXplKCl9YW5nbGVUbyh0KXtyZXR1cm4gMipNYXRoLmFjb3MoTWF0aC5hYnMoWih0aGlzLmRvdCh0KSwtMSwxKSkpfXJvdGF0ZVRvd2FyZHModCxlKXtjb25zdCBuPXRoaXMuYW5nbGVUbyh0KTtpZihuPT09MClyZXR1cm4gdGhpcztjb25zdCBzPU1hdGgubWluKDEsZS9uKTtyZXR1cm4gdGhpcy5zbGVycCh0LHMpLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMSl9aW52ZXJ0KCl7cmV0dXJuIHRoaXMuY29uanVnYXRlKCl9Y29uanVnYXRlKCl7cmV0dXJuIHRoaXMuX3gqPS0xLHRoaXMuX3kqPS0xLHRoaXMuX3oqPS0xLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy5feCp0Ll94K3RoaXMuX3kqdC5feSt0aGlzLl96KnQuX3ordGhpcy5fdyp0Ll93fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fd31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fdyl9bm9ybWFsaXplKCl7bGV0IHQ9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdD09PTA/KHRoaXMuX3g9MCx0aGlzLl95PTAsdGhpcy5fej0wLHRoaXMuX3c9MSk6KHQ9MS90LHRoaXMuX3g9dGhpcy5feCp0LHRoaXMuX3k9dGhpcy5feSp0LHRoaXMuX3o9dGhpcy5feip0LHRoaXMuX3c9dGhpcy5fdyp0KSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0LHRoaXMpfW11bHRpcGx5UXVhdGVybmlvbnModCxlKXtjb25zdCBuPXQuX3gscz10Ll95LHI9dC5feixvPXQuX3csYT1lLl94LGM9ZS5feSxsPWUuX3osaD1lLl93O3JldHVybiB0aGlzLl94PW4qaCtvKmErcypsLXIqYyx0aGlzLl95PXMqaCtvKmMrciphLW4qbCx0aGlzLl96PXIqaCtvKmwrbipjLXMqYSx0aGlzLl93PW8qaC1uKmEtcypjLXIqbCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycCh0LGUpe2lmKGU8PTApcmV0dXJuIHRoaXM7aWYoZT49MSlyZXR1cm4gdGhpcy5jb3B5KHQpO2xldCBuPXQuX3gscz10Ll95LHI9dC5feixvPXQuX3csYT10aGlzLmRvdCh0KTthPDAmJihuPS1uLHM9LXMscj0tcixvPS1vLGE9LWEpO2xldCBjPTEtZTtpZihhPC45OTk1KXtjb25zdCBsPU1hdGguYWNvcyhhKSxoPU1hdGguc2luKGwpO2M9TWF0aC5zaW4oYypsKS9oLGU9TWF0aC5zaW4oZSpsKS9oLHRoaXMuX3g9dGhpcy5feCpjK24qZSx0aGlzLl95PXRoaXMuX3kqYytzKmUsdGhpcy5fej10aGlzLl96KmMrciplLHRoaXMuX3c9dGhpcy5fdypjK28qZSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9ZWxzZSB0aGlzLl94PXRoaXMuX3gqYytuKmUsdGhpcy5feT10aGlzLl95KmMrcyplLHRoaXMuX3o9dGhpcy5feipjK3IqZSx0aGlzLl93PXRoaXMuX3cqYytvKmUsdGhpcy5ub3JtYWxpemUoKTtyZXR1cm4gdGhpc31zbGVycFF1YXRlcm5pb25zKHQsZSxuKXtyZXR1cm4gdGhpcy5jb3B5KHQpLnNsZXJwKGUsbil9cmFuZG9tKCl7Y29uc3QgdD0yKk1hdGguUEkqTWF0aC5yYW5kb20oKSxlPTIqTWF0aC5QSSpNYXRoLnJhbmRvbSgpLG49TWF0aC5yYW5kb20oKSxzPU1hdGguc3FydCgxLW4pLHI9TWF0aC5zcXJ0KG4pO3JldHVybiB0aGlzLnNldChzKk1hdGguc2luKHQpLHMqTWF0aC5jb3ModCkscipNYXRoLnNpbihlKSxyKk1hdGguY29zKGUpKX1lcXVhbHModCl7cmV0dXJuIHQuX3g9PT10aGlzLl94JiZ0Ll95PT09dGhpcy5feSYmdC5fej09PXRoaXMuX3omJnQuX3c9PT10aGlzLl93fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMuX3g9dFtlXSx0aGlzLl95PXRbZSsxXSx0aGlzLl96PXRbZSsyXSx0aGlzLl93PXRbZSszXSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLl94LHRbZSsxXT10aGlzLl95LHRbZSsyXT10aGlzLl96LHRbZSszXT10aGlzLl93LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLl94PXQuZ2V0WChlKSx0aGlzLl95PXQuZ2V0WShlKSx0aGlzLl96PXQuZ2V0WihlKSx0aGlzLl93PXQuZ2V0VyhlKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0pTT04oKXtyZXR1cm4gdGhpcy50b0FycmF5KCl9X29uQ2hhbmdlKHQpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPXQsdGhpc31fb25DaGFuZ2VDYWxsYmFjaygpe30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLl94LHlpZWxkIHRoaXMuX3kseWllbGQgdGhpcy5feix5aWVsZCB0aGlzLl93fX1jbGFzcyBUe2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0wKXtULnByb3RvdHlwZS5pc1ZlY3RvcjM9ITAsdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PW59c2V0KHQsZSxuKXtyZXR1cm4gbj09PXZvaWQgMCYmKG49dGhpcy56KSx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztjYXNlIDI6dGhpcy56PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQueix0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXN9YWRkVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54K2UueCx0aGlzLnk9dC55K2UueSx0aGlzLno9dC56K2Uueix0aGlzfWFkZFNjYWxlZFZlY3Rvcih0LGUpe3JldHVybiB0aGlzLngrPXQueCplLHRoaXMueSs9dC55KmUsdGhpcy56Kz10LnoqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzLnoqPXQueix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXMueio9dCx0aGlzfW11bHRpcGx5VmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54KmUueCx0aGlzLnk9dC55KmUueSx0aGlzLno9dC56KmUueix0aGlzfWFwcGx5RXVsZXIodCl7cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKEVjLnNldEZyb21FdWxlcih0KSl9YXBwbHlBeGlzQW5nbGUodCxlKXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oRWMuc2V0RnJvbUF4aXNBbmdsZSh0LGUpKX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscz10aGlzLnoscj10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9clswXSplK3JbM10qbityWzZdKnMsdGhpcy55PXJbMV0qZStyWzRdKm4rcls3XSpzLHRoaXMuej1yWzJdKmUrcls1XSpuK3JbOF0qcyx0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4Myh0KS5ub3JtYWxpemUoKX1hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscz10aGlzLnoscj10LmVsZW1lbnRzLG89MS8oclszXSplK3JbN10qbityWzExXSpzK3JbMTVdKTtyZXR1cm4gdGhpcy54PShyWzBdKmUrcls0XSpuK3JbOF0qcytyWzEyXSkqbyx0aGlzLnk9KHJbMV0qZStyWzVdKm4rcls5XSpzK3JbMTNdKSpvLHRoaXMuej0oclsyXSplK3JbNl0qbityWzEwXSpzK3JbMTRdKSpvLHRoaXN9YXBwbHlRdWF0ZXJuaW9uKHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHM9dGhpcy56LHI9dC54LG89dC55LGE9dC56LGM9dC53LGw9MioobypzLWEqbiksaD0yKihhKmUtcipzKSx1PTIqKHIqbi1vKmUpO3JldHVybiB0aGlzLng9ZStjKmwrbyp1LWEqaCx0aGlzLnk9bitjKmgrYSpsLXIqdSx0aGlzLno9cytjKnUrcipoLW8qbCx0aGlzfXByb2plY3QodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGRJbnZlcnNlKS5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4KX11bnByb2plY3QodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KHQucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKX10cmFuc2Zvcm1EaXJlY3Rpb24odCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscz10aGlzLnoscj10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9clswXSplK3JbNF0qbityWzhdKnMsdGhpcy55PXJbMV0qZStyWzVdKm4rcls5XSpzLHRoaXMuej1yWzJdKmUrcls2XSpuK3JbMTBdKnMsdGhpcy5ub3JtYWxpemUoKX1kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXMuei89dC56LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzfW1heCh0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksdC55KSx0aGlzLno9TWF0aC5tYXgodGhpcy56LHQueiksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9Wih0aGlzLngsdC54LGUueCksdGhpcy55PVoodGhpcy55LHQueSxlLnkpLHRoaXMuej1aKHRoaXMueix0LnosZS56KSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1aKHRoaXMueCx0LGUpLHRoaXMueT1aKHRoaXMueSx0LGUpLHRoaXMuej1aKHRoaXMueix0LGUpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKFoobix0LGUpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpcy56PU1hdGguZmxvb3IodGhpcy56KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzLno9TWF0aC5jZWlsKHRoaXMueiksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpcy56PU1hdGgucm91bmQodGhpcy56KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD1NYXRoLnRydW5jKHRoaXMueCksdGhpcy55PU1hdGgudHJ1bmModGhpcy55KSx0aGlzLno9TWF0aC50cnVuYyh0aGlzLnopLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXMuej0tdGhpcy56LHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLngqdC54K3RoaXMueSp0LnkrdGhpcy56KnQuen1sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMuen1sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56KX1tYW5oYXR0YW5MZW5ndGgoKXtyZXR1cm4gTWF0aC5hYnModGhpcy54KStNYXRoLmFicyh0aGlzLnkpK01hdGguYWJzKHRoaXMueil9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzLnorPSh0LnotdGhpcy56KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpcy56PXQueisoZS56LXQueikqbix0aGlzfWNyb3NzKHQpe3JldHVybiB0aGlzLmNyb3NzVmVjdG9ycyh0aGlzLHQpfWNyb3NzVmVjdG9ycyh0LGUpe2NvbnN0IG49dC54LHM9dC55LHI9dC56LG89ZS54LGE9ZS55LGM9ZS56O3JldHVybiB0aGlzLng9cypjLXIqYSx0aGlzLnk9cipvLW4qYyx0aGlzLno9biphLXMqbyx0aGlzfXByb2plY3RPblZlY3Rvcih0KXtjb25zdCBlPXQubGVuZ3RoU3EoKTtpZihlPT09MClyZXR1cm4gdGhpcy5zZXQoMCwwLDApO2NvbnN0IG49dC5kb3QodGhpcykvZTtyZXR1cm4gdGhpcy5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKG4pfXByb2plY3RPblBsYW5lKHQpe3JldHVybiBhby5jb3B5KHRoaXMpLnByb2plY3RPblZlY3Rvcih0KSx0aGlzLnN1Yihhbyl9cmVmbGVjdCh0KXtyZXR1cm4gdGhpcy5zdWIoYW8uY29weSh0KS5tdWx0aXBseVNjYWxhcigyKnRoaXMuZG90KHQpKSl9YW5nbGVUbyh0KXtjb25zdCBlPU1hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqdC5sZW5ndGhTcSgpKTtpZihlPT09MClyZXR1cm4gTWF0aC5QSS8yO2NvbnN0IG49dGhpcy5kb3QodCkvZTtyZXR1cm4gTWF0aC5hY29zKFoobiwtMSwxKSl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnkscz10aGlzLnotdC56O3JldHVybiBlKmUrbipuK3Mqc31tYW5oYXR0YW5EaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLngtdC54KStNYXRoLmFicyh0aGlzLnktdC55KStNYXRoLmFicyh0aGlzLnotdC56KX1zZXRGcm9tU3BoZXJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHModC5yYWRpdXMsdC5waGksdC50aGV0YSl9c2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LGUsbil7Y29uc3Qgcz1NYXRoLnNpbihlKSp0O3JldHVybiB0aGlzLng9cypNYXRoLnNpbihuKSx0aGlzLnk9TWF0aC5jb3MoZSkqdCx0aGlzLno9cypNYXRoLmNvcyhuKSx0aGlzfXNldEZyb21DeWxpbmRyaWNhbCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHModC5yYWRpdXMsdC50aGV0YSx0LnkpfXNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LGUsbil7cmV0dXJuIHRoaXMueD10Kk1hdGguc2luKGUpLHRoaXMueT1uLHRoaXMuej10Kk1hdGguY29zKGUpLHRoaXN9c2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWVbMTJdLHRoaXMueT1lWzEzXSx0aGlzLno9ZVsxNF0sdGhpc31zZXRGcm9tTWF0cml4U2NhbGUodCl7Y29uc3QgZT10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwwKS5sZW5ndGgoKSxuPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLHM9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMikubGVuZ3RoKCk7cmV0dXJuIHRoaXMueD1lLHRoaXMueT1uLHRoaXMuej1zLHRoaXN9c2V0RnJvbU1hdHJpeENvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLGUqNCl9c2V0RnJvbU1hdHJpeDNDb2x1bW4odCxlKXtyZXR1cm4gdGhpcy5mcm9tQXJyYXkodC5lbGVtZW50cyxlKjMpfXNldEZyb21FdWxlcih0KXtyZXR1cm4gdGhpcy54PXQuX3gsdGhpcy55PXQuX3ksdGhpcy56PXQuX3osdGhpc31zZXRGcm9tQ29sb3IodCl7cmV0dXJuIHRoaXMueD10LnIsdGhpcy55PXQuZyx0aGlzLno9dC5iLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueSYmdC56PT09dGhpcy56fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpcy56PXRbZSsyXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHRbZSsyXT10aGlzLnosdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXN9cmFuZG9tRGlyZWN0aW9uKCl7Y29uc3QgdD1NYXRoLnJhbmRvbSgpKk1hdGguUEkqMixlPU1hdGgucmFuZG9tKCkqMi0xLG49TWF0aC5zcXJ0KDEtZSplKTtyZXR1cm4gdGhpcy54PW4qTWF0aC5jb3ModCksdGhpcy55PWUsdGhpcy56PW4qTWF0aC5zaW4odCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55LHlpZWxkIHRoaXMuen19Y29uc3QgYW89bmV3IFQsRWM9bmV3IE1pO2NsYXNzIGdle2NvbnN0cnVjdG9yKHQsZSxuLHMscixvLGEsYyxsKXtnZS5wcm90b3R5cGUuaXNNYXRyaXgzPSEwLHRoaXMuZWxlbWVudHM9WzEsMCwwLDAsMSwwLDAsMCwxXSx0IT09dm9pZCAwJiZ0aGlzLnNldCh0LGUsbixzLHIsbyxhLGMsbCl9c2V0KHQsZSxuLHMscixvLGEsYyxsKXtjb25zdCBoPXRoaXMuZWxlbWVudHM7cmV0dXJuIGhbMF09dCxoWzFdPXMsaFsyXT1hLGhbM109ZSxoWzRdPXIsaFs1XT1jLGhbNl09bixoWzddPW8saFs4XT1sLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwxLDAsMCwwLDEpLHRoaXN9Y29weSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO3JldHVybiBlWzBdPW5bMF0sZVsxXT1uWzFdLGVbMl09blsyXSxlWzNdPW5bM10sZVs0XT1uWzRdLGVbNV09bls1XSxlWzZdPW5bNl0sZVs3XT1uWzddLGVbOF09bls4XSx0aGlzfWV4dHJhY3RCYXNpcyh0LGUsbil7cmV0dXJuIHQuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywwKSxlLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMSksbi5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDIpLHRoaXN9c2V0RnJvbU1hdHJpeDQodCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnNldChlWzBdLGVbNF0sZVs4XSxlWzFdLGVbNV0sZVs5XSxlWzJdLGVbNl0sZVsxMF0pLHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLHQpfXByZW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModCx0aGlzKX1tdWx0aXBseU1hdHJpY2VzKHQsZSl7Y29uc3Qgbj10LmVsZW1lbnRzLHM9ZS5lbGVtZW50cyxyPXRoaXMuZWxlbWVudHMsbz1uWzBdLGE9blszXSxjPW5bNl0sbD1uWzFdLGg9bls0XSx1PW5bN10sZj1uWzJdLGQ9bls1XSxwPW5bOF0seT1zWzBdLG09c1szXSxnPXNbNl0sYj1zWzFdLHg9c1s0XSx3PXNbN10sTT1zWzJdLEE9c1s1XSxTPXNbOF07cmV0dXJuIHJbMF09byp5K2EqYitjKk0sclszXT1vKm0rYSp4K2MqQSxyWzZdPW8qZythKncrYypTLHJbMV09bCp5K2gqYit1Kk0scls0XT1sKm0raCp4K3UqQSxyWzddPWwqZytoKncrdSpTLHJbMl09Zip5K2QqYitwKk0scls1XT1mKm0rZCp4K3AqQSxyWzhdPWYqZytkKncrcCpTLHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbM10qPXQsZVs2XSo9dCxlWzFdKj10LGVbNF0qPXQsZVs3XSo9dCxlWzJdKj10LGVbNV0qPXQsZVs4XSo9dCx0aGlzfWRldGVybWluYW50KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbMV0scz10WzJdLHI9dFszXSxvPXRbNF0sYT10WzVdLGM9dFs2XSxsPXRbN10saD10WzhdO3JldHVybiBlKm8qaC1lKmEqbC1uKnIqaCtuKmEqYytzKnIqbC1zKm8qY31pbnZlcnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFsxXSxzPXRbMl0scj10WzNdLG89dFs0XSxhPXRbNV0sYz10WzZdLGw9dFs3XSxoPXRbOF0sdT1oKm8tYSpsLGY9YSpjLWgqcixkPWwqci1vKmMscD1lKnUrbipmK3MqZDtpZihwPT09MClyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDApO2NvbnN0IHk9MS9wO3JldHVybiB0WzBdPXUqeSx0WzFdPShzKmwtaCpuKSp5LHRbMl09KGEqbi1zKm8pKnksdFszXT1mKnksdFs0XT0oaCplLXMqYykqeSx0WzVdPShzKnItYSplKSp5LHRbNl09ZCp5LHRbN109KG4qYy1sKmUpKnksdFs4XT0obyplLW4qcikqeSx0aGlzfXRyYW5zcG9zZSgpe2xldCB0O2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gdD1lWzFdLGVbMV09ZVszXSxlWzNdPXQsdD1lWzJdLGVbMl09ZVs2XSxlWzZdPXQsdD1lWzVdLGVbNV09ZVs3XSxlWzddPXQsdGhpc31nZXROb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeDQodCkuaW52ZXJ0KCkudHJhbnNwb3NlKCl9dHJhbnNwb3NlSW50b0FycmF5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVszXSx0WzJdPWVbNl0sdFszXT1lWzFdLHRbNF09ZVs0XSx0WzVdPWVbN10sdFs2XT1lWzJdLHRbN109ZVs1XSx0WzhdPWVbOF0sdGhpc31zZXRVdlRyYW5zZm9ybSh0LGUsbixzLHIsbyxhKXtjb25zdCBjPU1hdGguY29zKHIpLGw9TWF0aC5zaW4ocik7cmV0dXJuIHRoaXMuc2V0KG4qYyxuKmwsLW4qKGMqbytsKmEpK28rdCwtcypsLHMqYywtcyooLWwqbytjKmEpK2ErZSwwLDAsMSksdGhpc31zY2FsZSh0LGUpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KGNvLm1ha2VTY2FsZSh0LGUpKSx0aGlzfXJvdGF0ZSh0KXtyZXR1cm4gdGhpcy5wcmVtdWx0aXBseShjby5tYWtlUm90YXRpb24oLXQpKSx0aGlzfXRyYW5zbGF0ZSh0LGUpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KGNvLm1ha2VUcmFuc2xhdGlvbih0LGUpKSx0aGlzfW1ha2VUcmFuc2xhdGlvbih0LGUpe3JldHVybiB0LmlzVmVjdG9yMj90aGlzLnNldCgxLDAsdC54LDAsMSx0LnksMCwwLDEpOnRoaXMuc2V0KDEsMCx0LDAsMSxlLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbih0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsLW4sMCxuLGUsMCwwLDAsMSksdGhpc31tYWtlU2NhbGUodCxlKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCxlLDAsMCwwLDEpLHRoaXN9ZXF1YWxzKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7Zm9yKGxldCBzPTA7czw5O3MrKylpZihlW3NdIT09bltzXSlyZXR1cm4hMTtyZXR1cm4hMH1mcm9tQXJyYXkodCxlPTApe2ZvcihsZXQgbj0wO248OTtuKyspdGhpcy5lbGVtZW50c1tuXT10W24rZV07cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO3JldHVybiB0W2VdPW5bMF0sdFtlKzFdPW5bMV0sdFtlKzJdPW5bMl0sdFtlKzNdPW5bM10sdFtlKzRdPW5bNF0sdFtlKzVdPW5bNV0sdFtlKzZdPW5bNl0sdFtlKzddPW5bN10sdFtlKzhdPW5bOF0sdH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmZyb21BcnJheSh0aGlzLmVsZW1lbnRzKX19Y29uc3QgY289bmV3IGdlLEJjPW5ldyBnZSgpLnNldCguNDEyMzkwOCwuMzU3NTg0MywuMTgwNDgwOCwuMjEyNjM5LC43MTUxNjg3LC4wNzIxOTIzLC4wMTkzMzA4LC4xMTkxOTQ4LC45NTA1MzIyKSxGYz1uZXcgZ2UoKS5zZXQoMy4yNDA5Njk5LC0xLjUzNzM4MzIsLS40OTg2MTA4LC0uOTY5MjQzNiwxLjg3NTk2NzUsLjA0MTU1NTEsLjA1NTYzMDEsLS4yMDM5NzcsMS4wNTY5NzE1KTtmdW5jdGlvbiBvZigpe2NvbnN0IGk9e2VuYWJsZWQ6ITAsd29ya2luZ0NvbG9yU3BhY2U6X2Msc3BhY2VzOnt9LGNvbnZlcnQ6ZnVuY3Rpb24ocyxyLG8pe3JldHVybiB0aGlzLmVuYWJsZWQ9PT0hMXx8cj09PW98fCFyfHwhb3x8KHRoaXMuc3BhY2VzW3JdLnRyYW5zZmVyPT09cm8mJihzLnI9X2Uocy5yKSxzLmc9X2Uocy5nKSxzLmI9X2Uocy5iKSksdGhpcy5zcGFjZXNbcl0ucHJpbWFyaWVzIT09dGhpcy5zcGFjZXNbb10ucHJpbWFyaWVzJiYocy5hcHBseU1hdHJpeDModGhpcy5zcGFjZXNbcl0udG9YWVopLHMuYXBwbHlNYXRyaXgzKHRoaXMuc3BhY2VzW29dLmZyb21YWVopKSx0aGlzLnNwYWNlc1tvXS50cmFuc2Zlcj09PXJvJiYocy5yPU5uKHMucikscy5nPU5uKHMuZykscy5iPU5uKHMuYikpKSxzfSx3b3JraW5nVG9Db2xvclNwYWNlOmZ1bmN0aW9uKHMscil7cmV0dXJuIHRoaXMuY29udmVydChzLHRoaXMud29ya2luZ0NvbG9yU3BhY2Uscil9LGNvbG9yU3BhY2VUb1dvcmtpbmc6ZnVuY3Rpb24ocyxyKXtyZXR1cm4gdGhpcy5jb252ZXJ0KHMscix0aGlzLndvcmtpbmdDb2xvclNwYWNlKX0sZ2V0UHJpbWFyaWVzOmZ1bmN0aW9uKHMpe3JldHVybiB0aGlzLnNwYWNlc1tzXS5wcmltYXJpZXN9LGdldFRyYW5zZmVyOmZ1bmN0aW9uKHMpe3JldHVybiBzPT09dmM/emM6dGhpcy5zcGFjZXNbc10udHJhbnNmZXJ9LGdldFRvbmVNYXBwaW5nTW9kZTpmdW5jdGlvbihzKXtyZXR1cm4gdGhpcy5zcGFjZXNbc10ub3V0cHV0Q29sb3JTcGFjZUNvbmZpZy50b25lTWFwcGluZ01vZGV8fCJzdGFuZGFyZCJ9LGdldEx1bWluYW5jZUNvZWZmaWNpZW50czpmdW5jdGlvbihzLHI9dGhpcy53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHMuZnJvbUFycmF5KHRoaXMuc3BhY2VzW3JdLmx1bWluYW5jZUNvZWZmaWNpZW50cyl9LGRlZmluZTpmdW5jdGlvbihzKXtPYmplY3QuYXNzaWduKHRoaXMuc3BhY2VzLHMpfSxfZ2V0TWF0cml4OmZ1bmN0aW9uKHMscixvKXtyZXR1cm4gcy5jb3B5KHRoaXMuc3BhY2VzW3JdLnRvWFlaKS5tdWx0aXBseSh0aGlzLnNwYWNlc1tvXS5mcm9tWFlaKX0sX2dldERyYXdpbmdCdWZmZXJDb2xvclNwYWNlOmZ1bmN0aW9uKHMpe3JldHVybiB0aGlzLnNwYWNlc1tzXS5vdXRwdXRDb2xvclNwYWNlQ29uZmlnLmRyYXdpbmdCdWZmZXJDb2xvclNwYWNlfSxfZ2V0VW5wYWNrQ29sb3JTcGFjZTpmdW5jdGlvbihzPXRoaXMud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiB0aGlzLnNwYWNlc1tzXS53b3JraW5nQ29sb3JTcGFjZUNvbmZpZy51bnBhY2tDb2xvclNwYWNlfSxmcm9tV29ya2luZ0NvbG9yU3BhY2U6ZnVuY3Rpb24ocyxyKXtyZXR1cm4gQ2MoIkNvbG9yTWFuYWdlbWVudDogLmZyb21Xb3JraW5nQ29sb3JTcGFjZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLndvcmtpbmdUb0NvbG9yU3BhY2UoKS4iKSxpLndvcmtpbmdUb0NvbG9yU3BhY2UocyxyKX0sdG9Xb3JraW5nQ29sb3JTcGFjZTpmdW5jdGlvbihzLHIpe3JldHVybiBDYygiQ29sb3JNYW5hZ2VtZW50OiAudG9Xb3JraW5nQ29sb3JTcGFjZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmNvbG9yU3BhY2VUb1dvcmtpbmcoKS4iKSxpLmNvbG9yU3BhY2VUb1dvcmtpbmcocyxyKX19LHQ9Wy42NCwuMzMsLjMsLjYsLjE1LC4wNl0sZT1bLjIxMjYsLjcxNTIsLjA3MjJdLG49Wy4zMTI3LC4zMjldO3JldHVybiBpLmRlZmluZSh7W19jXTp7cHJpbWFyaWVzOnQsd2hpdGVQb2ludDpuLHRyYW5zZmVyOnpjLHRvWFlaOkJjLGZyb21YWVo6RmMsbHVtaW5hbmNlQ29lZmZpY2llbnRzOmUsd29ya2luZ0NvbG9yU3BhY2VDb25maWc6e3VucGFja0NvbG9yU3BhY2U6YWV9LG91dHB1dENvbG9yU3BhY2VDb25maWc6e2RyYXdpbmdCdWZmZXJDb2xvclNwYWNlOmFlfX0sW2FlXTp7cHJpbWFyaWVzOnQsd2hpdGVQb2ludDpuLHRyYW5zZmVyOnJvLHRvWFlaOkJjLGZyb21YWVo6RmMsbHVtaW5hbmNlQ29lZmZpY2llbnRzOmUsb3V0cHV0Q29sb3JTcGFjZUNvbmZpZzp7ZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6YWV9fX0pLGl9Y29uc3QgY2U9b2YoKTtmdW5jdGlvbiBfZShpKXtyZXR1cm4gaTwuMDQwNDU/aSouMDc3Mzk5MzgwODpNYXRoLnBvdyhpKi45NDc4NjcyOTg2Ky4wNTIxMzI3MDE0LDIuNCl9ZnVuY3Rpb24gTm4oaSl7cmV0dXJuIGk8LjAwMzEzMDg/aSoxMi45MjoxLjA1NSpNYXRoLnBvdyhpLC40MTY2NiktLjA1NX1sZXQgUm47Y2xhc3MgYWZ7c3RhdGljIGdldERhdGFVUkwodCxlPSJpbWFnZS9wbmciKXtpZigvXmRhdGE6L2kudGVzdCh0LnNyYyl8fHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudD09InVuZGVmaW5lZCIpcmV0dXJuIHQuc3JjO2xldCBuO2lmKHQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCluPXQ7ZWxzZXtSbj09PXZvaWQgMCYmKFJuPVRjKCJjYW52YXMiKSksUm4ud2lkdGg9dC53aWR0aCxSbi5oZWlnaHQ9dC5oZWlnaHQ7Y29uc3Qgcz1Sbi5nZXRDb250ZXh0KCIyZCIpO3QgaW5zdGFuY2VvZiBJbWFnZURhdGE/cy5wdXRJbWFnZURhdGEodCwwLDApOnMuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpLG49Um59cmV0dXJuIG4udG9EYXRhVVJMKGUpfXN0YXRpYyBzUkdCVG9MaW5lYXIodCl7aWYodHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQhPSJ1bmRlZmluZWQiJiZ0IGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudHx8dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50IT0idW5kZWZpbmVkIiYmdCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHx0eXBlb2YgSW1hZ2VCaXRtYXAhPSJ1bmRlZmluZWQiJiZ0IGluc3RhbmNlb2YgSW1hZ2VCaXRtYXApe2NvbnN0IGU9VGMoImNhbnZhcyIpO2Uud2lkdGg9dC53aWR0aCxlLmhlaWdodD10LmhlaWdodDtjb25zdCBuPWUuZ2V0Q29udGV4dCgiMmQiKTtuLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KTtjb25zdCBzPW4uZ2V0SW1hZ2VEYXRhKDAsMCx0LndpZHRoLHQuaGVpZ2h0KSxyPXMuZGF0YTtmb3IobGV0IG89MDtvPHIubGVuZ3RoO28rKylyW29dPV9lKHJbb10vMjU1KSoyNTU7cmV0dXJuIG4ucHV0SW1hZ2VEYXRhKHMsMCwwKSxlfWVsc2UgaWYodC5kYXRhKXtjb25zdCBlPXQuZGF0YS5zbGljZSgwKTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyllIGluc3RhbmNlb2YgVWludDhBcnJheXx8ZSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5P2Vbbl09TWF0aC5mbG9vcihfZShlW25dLzI1NSkqMjU1KTplW25dPV9lKGVbbl0pO3JldHVybntkYXRhOmUsd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHR9fWVsc2UgcmV0dXJuIE10KCJJbWFnZVV0aWxzLnNSR0JUb0xpbmVhcigpOiBVbnN1cHBvcnRlZCBpbWFnZSB0eXBlLiBObyBjb2xvciBzcGFjZSBjb252ZXJzaW9uIGFwcGxpZWQuIiksdH19bGV0IGNmPTA7Y2xhc3MgbGZ7Y29uc3RydWN0b3IodD1udWxsKXt0aGlzLmlzU291cmNlPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOmNmKyt9KSx0aGlzLnV1aWQ9a24oKSx0aGlzLmRhdGE9dCx0aGlzLmRhdGFSZWFkeT0hMCx0aGlzLnZlcnNpb249MH1nZXRTaXplKHQpe2NvbnN0IGU9dGhpcy5kYXRhO3JldHVybiB0eXBlb2YgSFRNTFZpZGVvRWxlbWVudCE9InVuZGVmaW5lZCImJmUgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50P3Quc2V0KGUudmlkZW9XaWR0aCxlLnZpZGVvSGVpZ2h0LDApOmUgaW5zdGFuY2VvZiBWaWRlb0ZyYW1lP3Quc2V0KGUuZGlzcGxheUhlaWdodCxlLmRpc3BsYXlXaWR0aCwwKTplIT09bnVsbD90LnNldChlLndpZHRoLGUuaGVpZ2h0LGUuZGVwdGh8fDApOnQuc2V0KDAsMCwwKSx0fXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJnRoaXMudmVyc2lvbisrfXRvSlNPTih0KXtjb25zdCBlPXQ9PT12b2lkIDB8fHR5cGVvZiB0PT0ic3RyaW5nIjtpZighZSYmdC5pbWFnZXNbdGhpcy51dWlkXSE9PXZvaWQgMClyZXR1cm4gdC5pbWFnZXNbdGhpcy51dWlkXTtjb25zdCBuPXt1dWlkOnRoaXMudXVpZCx1cmw6IiJ9LHM9dGhpcy5kYXRhO2lmKHMhPT1udWxsKXtsZXQgcjtpZihBcnJheS5pc0FycmF5KHMpKXtyPVtdO2ZvcihsZXQgbz0wLGE9cy5sZW5ndGg7bzxhO28rKylzW29dLmlzRGF0YVRleHR1cmU/ci5wdXNoKGxvKHNbb10uaW1hZ2UpKTpyLnB1c2gobG8oc1tvXSkpfWVsc2Ugcj1sbyhzKTtuLnVybD1yfXJldHVybiBlfHwodC5pbWFnZXNbdGhpcy51dWlkXT1uKSxufX1mdW5jdGlvbiBsbyhpKXtyZXR1cm4gdHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQhPSJ1bmRlZmluZWQiJiZpIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudHx8dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50IT0idW5kZWZpbmVkIiYmaSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHx0eXBlb2YgSW1hZ2VCaXRtYXAhPSJ1bmRlZmluZWQiJiZpIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXA/YWYuZ2V0RGF0YVVSTChpKTppLmRhdGE/e2RhdGE6QXJyYXkuZnJvbShpLmRhdGEpLHdpZHRoOmkud2lkdGgsaGVpZ2h0OmkuaGVpZ2h0LHR5cGU6aS5kYXRhLmNvbnN0cnVjdG9yLm5hbWV9OihNdCgiVGV4dHVyZTogVW5hYmxlIHRvIHNlcmlhbGl6ZSBUZXh0dXJlLiIpLHt9KX1sZXQgaGY9MDtjb25zdCBobz1uZXcgVDtjbGFzcyB1biBleHRlbmRzIGZze2NvbnN0cnVjdG9yKHQ9dW4uREVGQVVMVF9JTUFHRSxlPXVuLkRFRkFVTFRfTUFQUElORyxuPTEwMDEscz0xMDAxLHI9MTAwNixvPTEwMDgsYT0xMDIzLGM9MTAwOSxsPXVuLkRFRkFVTFRfQU5JU09UUk9QWSxoPXZjKXtzdXBlcigpLHRoaXMuaXNUZXh0dXJlPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOmhmKyt9KSx0aGlzLnV1aWQ9a24oKSx0aGlzLm5hbWU9IiIsdGhpcy5zb3VyY2U9bmV3IGxmKHQpLHRoaXMubWlwbWFwcz1bXSx0aGlzLm1hcHBpbmc9ZSx0aGlzLmNoYW5uZWw9MCx0aGlzLndyYXBTPW4sdGhpcy53cmFwVD1zLHRoaXMubWFnRmlsdGVyPXIsdGhpcy5taW5GaWx0ZXI9byx0aGlzLmFuaXNvdHJvcHk9bCx0aGlzLmZvcm1hdD1hLHRoaXMuaW50ZXJuYWxGb3JtYXQ9bnVsbCx0aGlzLnR5cGU9Yyx0aGlzLm9mZnNldD1uZXcgTigwLDApLHRoaXMucmVwZWF0PW5ldyBOKDEsMSksdGhpcy5jZW50ZXI9bmV3IE4oMCwwKSx0aGlzLnJvdGF0aW9uPTAsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPSEwLHRoaXMubWF0cml4PW5ldyBnZSx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMCx0aGlzLnByZW11bHRpcGx5QWxwaGE9ITEsdGhpcy5mbGlwWT0hMCx0aGlzLnVucGFja0FsaWdubWVudD00LHRoaXMuY29sb3JTcGFjZT1oLHRoaXMudXNlckRhdGE9e30sdGhpcy51cGRhdGVSYW5nZXM9W10sdGhpcy52ZXJzaW9uPTAsdGhpcy5vblVwZGF0ZT1udWxsLHRoaXMucmVuZGVyVGFyZ2V0PW51bGwsdGhpcy5pc1JlbmRlclRhcmdldFRleHR1cmU9ITEsdGhpcy5pc0FycmF5VGV4dHVyZT0hISh0JiZ0LmRlcHRoJiZ0LmRlcHRoPjEpLHRoaXMucG1yZW1WZXJzaW9uPTB9Z2V0IHdpZHRoKCl7cmV0dXJuIHRoaXMuc291cmNlLmdldFNpemUoaG8pLnh9Z2V0IGhlaWdodCgpe3JldHVybiB0aGlzLnNvdXJjZS5nZXRTaXplKGhvKS55fWdldCBkZXB0aCgpe3JldHVybiB0aGlzLnNvdXJjZS5nZXRTaXplKGhvKS56fWdldCBpbWFnZSgpe3JldHVybiB0aGlzLnNvdXJjZS5kYXRhfXNldCBpbWFnZSh0PW51bGwpe3RoaXMuc291cmNlLmRhdGE9dH11cGRhdGVNYXRyaXgoKXt0aGlzLm1hdHJpeC5zZXRVdlRyYW5zZm9ybSh0aGlzLm9mZnNldC54LHRoaXMub2Zmc2V0LnksdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55LHRoaXMucm90YXRpb24sdGhpcy5jZW50ZXIueCx0aGlzLmNlbnRlci55KX1hZGRVcGRhdGVSYW5nZSh0LGUpe3RoaXMudXBkYXRlUmFuZ2VzLnB1c2goe3N0YXJ0OnQsY291bnQ6ZX0pfWNsZWFyVXBkYXRlUmFuZ2VzKCl7dGhpcy51cGRhdGVSYW5nZXMubGVuZ3RoPTB9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMubmFtZT10Lm5hbWUsdGhpcy5zb3VyY2U9dC5zb3VyY2UsdGhpcy5taXBtYXBzPXQubWlwbWFwcy5zbGljZSgwKSx0aGlzLm1hcHBpbmc9dC5tYXBwaW5nLHRoaXMuY2hhbm5lbD10LmNoYW5uZWwsdGhpcy53cmFwUz10LndyYXBTLHRoaXMud3JhcFQ9dC53cmFwVCx0aGlzLm1hZ0ZpbHRlcj10Lm1hZ0ZpbHRlcix0aGlzLm1pbkZpbHRlcj10Lm1pbkZpbHRlcix0aGlzLmFuaXNvdHJvcHk9dC5hbmlzb3Ryb3B5LHRoaXMuZm9ybWF0PXQuZm9ybWF0LHRoaXMuaW50ZXJuYWxGb3JtYXQ9dC5pbnRlcm5hbEZvcm1hdCx0aGlzLnR5cGU9dC50eXBlLHRoaXMub2Zmc2V0LmNvcHkodC5vZmZzZXQpLHRoaXMucmVwZWF0LmNvcHkodC5yZXBlYXQpLHRoaXMuY2VudGVyLmNvcHkodC5jZW50ZXIpLHRoaXMucm90YXRpb249dC5yb3RhdGlvbix0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlLHRoaXMubWF0cml4LmNvcHkodC5tYXRyaXgpLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPXQuZ2VuZXJhdGVNaXBtYXBzLHRoaXMucHJlbXVsdGlwbHlBbHBoYT10LnByZW11bHRpcGx5QWxwaGEsdGhpcy5mbGlwWT10LmZsaXBZLHRoaXMudW5wYWNrQWxpZ25tZW50PXQudW5wYWNrQWxpZ25tZW50LHRoaXMuY29sb3JTcGFjZT10LmNvbG9yU3BhY2UsdGhpcy5yZW5kZXJUYXJnZXQ9dC5yZW5kZXJUYXJnZXQsdGhpcy5pc1JlbmRlclRhcmdldFRleHR1cmU9dC5pc1JlbmRlclRhcmdldFRleHR1cmUsdGhpcy5pc0FycmF5VGV4dHVyZT10LmlzQXJyYXlUZXh0dXJlLHRoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnVzZXJEYXRhKSksdGhpcy5uZWVkc1VwZGF0ZT0hMCx0aGlzfXNldFZhbHVlcyh0KXtmb3IoY29uc3QgZSBpbiB0KXtjb25zdCBuPXRbZV07aWYobj09PXZvaWQgMCl7TXQoYFRleHR1cmUuc2V0VmFsdWVzKCk6IHBhcmFtZXRlciAnJHtlfScgaGFzIHZhbHVlIG9mIHVuZGVmaW5lZC5gKTtjb250aW51ZX1jb25zdCBzPXRoaXNbZV07aWYocz09PXZvaWQgMCl7TXQoYFRleHR1cmUuc2V0VmFsdWVzKCk6IHByb3BlcnR5ICcke2V9JyBkb2VzIG5vdCBleGlzdC5gKTtjb250aW51ZX1zJiZuJiZzLmlzVmVjdG9yMiYmbi5pc1ZlY3RvcjJ8fHMmJm4mJnMuaXNWZWN0b3IzJiZuLmlzVmVjdG9yM3x8cyYmbiYmcy5pc01hdHJpeDMmJm4uaXNNYXRyaXgzP3MuY29weShuKTp0aGlzW2VdPW59fXRvSlNPTih0KXtjb25zdCBlPXQ9PT12b2lkIDB8fHR5cGVvZiB0PT0ic3RyaW5nIjtpZighZSYmdC50ZXh0dXJlc1t0aGlzLnV1aWRdIT09dm9pZCAwKXJldHVybiB0LnRleHR1cmVzW3RoaXMudXVpZF07Y29uc3Qgbj17bWV0YWRhdGE6e3ZlcnNpb246NC43LHR5cGU6IlRleHR1cmUiLGdlbmVyYXRvcjoiVGV4dHVyZS50b0pTT04ifSx1dWlkOnRoaXMudXVpZCxuYW1lOnRoaXMubmFtZSxpbWFnZTp0aGlzLnNvdXJjZS50b0pTT04odCkudXVpZCxtYXBwaW5nOnRoaXMubWFwcGluZyxjaGFubmVsOnRoaXMuY2hhbm5lbCxyZXBlYXQ6W3RoaXMucmVwZWF0LngsdGhpcy5yZXBlYXQueV0sb2Zmc2V0Olt0aGlzLm9mZnNldC54LHRoaXMub2Zmc2V0LnldLGNlbnRlcjpbdGhpcy5jZW50ZXIueCx0aGlzLmNlbnRlci55XSxyb3RhdGlvbjp0aGlzLnJvdGF0aW9uLHdyYXA6W3RoaXMud3JhcFMsdGhpcy53cmFwVF0sZm9ybWF0OnRoaXMuZm9ybWF0LGludGVybmFsRm9ybWF0OnRoaXMuaW50ZXJuYWxGb3JtYXQsdHlwZTp0aGlzLnR5cGUsY29sb3JTcGFjZTp0aGlzLmNvbG9yU3BhY2UsbWluRmlsdGVyOnRoaXMubWluRmlsdGVyLG1hZ0ZpbHRlcjp0aGlzLm1hZ0ZpbHRlcixhbmlzb3Ryb3B5OnRoaXMuYW5pc290cm9weSxmbGlwWTp0aGlzLmZsaXBZLGdlbmVyYXRlTWlwbWFwczp0aGlzLmdlbmVyYXRlTWlwbWFwcyxwcmVtdWx0aXBseUFscGhhOnRoaXMucHJlbXVsdGlwbHlBbHBoYSx1bnBhY2tBbGlnbm1lbnQ6dGhpcy51bnBhY2tBbGlnbm1lbnR9O3JldHVybiBPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKG4udXNlckRhdGE9dGhpcy51c2VyRGF0YSksZXx8KHQudGV4dHVyZXNbdGhpcy51dWlkXT1uKSxufWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9dHJhbnNmb3JtVXYodCl7aWYodGhpcy5tYXBwaW5nIT09MzAwKXJldHVybiB0O2lmKHQuYXBwbHlNYXRyaXgzKHRoaXMubWF0cml4KSx0Lng8MHx8dC54PjEpc3dpdGNoKHRoaXMud3JhcFMpe2Nhc2UgMWUzOnQueD10LngtTWF0aC5mbG9vcih0LngpO2JyZWFrO2Nhc2UgMTAwMTp0Lng9dC54PDA/MDoxO2JyZWFrO2Nhc2UgMTAwMjpNYXRoLmFicyhNYXRoLmZsb29yKHQueCklMik9PT0xP3QueD1NYXRoLmNlaWwodC54KS10Lng6dC54PXQueC1NYXRoLmZsb29yKHQueCk7YnJlYWt9aWYodC55PDB8fHQueT4xKXN3aXRjaCh0aGlzLndyYXBUKXtjYXNlIDFlMzp0Lnk9dC55LU1hdGguZmxvb3IodC55KTticmVhaztjYXNlIDEwMDE6dC55PXQueTwwPzA6MTticmVhaztjYXNlIDEwMDI6TWF0aC5hYnMoTWF0aC5mbG9vcih0LnkpJTIpPT09MT90Lnk9TWF0aC5jZWlsKHQueSktdC55OnQueT10LnktTWF0aC5mbG9vcih0LnkpO2JyZWFrfXJldHVybiB0aGlzLmZsaXBZJiYodC55PTEtdC55KSx0fXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJih0aGlzLnZlcnNpb24rKyx0aGlzLnNvdXJjZS5uZWVkc1VwZGF0ZT0hMCl9c2V0IG5lZWRzUE1SRU1VcGRhdGUodCl7dD09PSEwJiZ0aGlzLnBtcmVtVmVyc2lvbisrfX11bi5ERUZBVUxUX0lNQUdFPW51bGwsdW4uREVGQVVMVF9NQVBQSU5HPTMwMCx1bi5ERUZBVUxUX0FOSVNPVFJPUFk9MTtjbGFzcyBZdHtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCxzPTEpe1l0LnByb3RvdHlwZS5pc1ZlY3RvcjQ9ITAsdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PW4sdGhpcy53PXN9Z2V0IHdpZHRoKCl7cmV0dXJuIHRoaXMuen1zZXQgd2lkdGgodCl7dGhpcy56PXR9Z2V0IGhlaWdodCgpe3JldHVybiB0aGlzLnd9c2V0IGhlaWdodCh0KXt0aGlzLnc9dH1zZXQodCxlLG4scyl7cmV0dXJuIHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXMudz1zLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzLno9dCx0aGlzLnc9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRaKHQpe3JldHVybiB0aGlzLno9dCx0aGlzfXNldFcodCl7cmV0dXJuIHRoaXMudz10LHRoaXN9c2V0Q29tcG9uZW50KHQsZSl7c3dpdGNoKHQpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7Y2FzZSAyOnRoaXMuej1lO2JyZWFrO2Nhc2UgMzp0aGlzLnc9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7Y2FzZSAzOnJldHVybiB0aGlzLnc7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnosdGhpcy53KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQueix0aGlzLnc9dC53IT09dm9pZCAwP3QudzoxLHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzLnorPXQueix0aGlzLncrPXQudyx0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzLnorPXQsdGhpcy53Kz10LHRoaXN9YWRkVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54K2UueCx0aGlzLnk9dC55K2UueSx0aGlzLno9dC56K2Uueix0aGlzLnc9dC53K2Uudyx0aGlzfWFkZFNjYWxlZFZlY3Rvcih0LGUpe3JldHVybiB0aGlzLngrPXQueCplLHRoaXMueSs9dC55KmUsdGhpcy56Kz10LnoqZSx0aGlzLncrPXQudyplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzLnotPXQueix0aGlzLnctPXQudyx0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzLnotPXQsdGhpcy53LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzLnc9dC53LWUudyx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzLnoqPXQueix0aGlzLncqPXQudyx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXMueio9dCx0aGlzLncqPXQsdGhpc31hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscz10aGlzLnoscj10aGlzLncsbz10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9b1swXSplK29bNF0qbitvWzhdKnMrb1sxMl0qcix0aGlzLnk9b1sxXSplK29bNV0qbitvWzldKnMrb1sxM10qcix0aGlzLno9b1syXSplK29bNl0qbitvWzEwXSpzK29bMTRdKnIsdGhpcy53PW9bM10qZStvWzddKm4rb1sxMV0qcytvWzE1XSpyLHRoaXN9ZGl2aWRlKHQpe3JldHVybiB0aGlzLngvPXQueCx0aGlzLnkvPXQueSx0aGlzLnovPXQueix0aGlzLncvPXQudyx0aGlzfWRpdmlkZVNjYWxhcih0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigxL3QpfXNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uKHQpe3RoaXMudz0yKk1hdGguYWNvcyh0LncpO2NvbnN0IGU9TWF0aC5zcXJ0KDEtdC53KnQudyk7cmV0dXJuIGU8MWUtND8odGhpcy54PTEsdGhpcy55PTAsdGhpcy56PTApOih0aGlzLng9dC54L2UsdGhpcy55PXQueS9lLHRoaXMuej10LnovZSksdGhpc31zZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXgodCl7bGV0IGUsbixzLHI7Y29uc3QgYz10LmVsZW1lbnRzLGw9Y1swXSxoPWNbNF0sdT1jWzhdLGY9Y1sxXSxkPWNbNV0scD1jWzldLHk9Y1syXSxtPWNbNl0sZz1jWzEwXTtpZihNYXRoLmFicyhoLWYpPC4wMSYmTWF0aC5hYnModS15KTwuMDEmJk1hdGguYWJzKHAtbSk8LjAxKXtpZihNYXRoLmFicyhoK2YpPC4xJiZNYXRoLmFicyh1K3kpPC4xJiZNYXRoLmFicyhwK20pPC4xJiZNYXRoLmFicyhsK2QrZy0zKTwuMSlyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCksdGhpcztlPU1hdGguUEk7Y29uc3QgeD0obCsxKS8yLHc9KGQrMSkvMixNPShnKzEpLzIsQT0oaCtmKS80LFM9KHUreSkvNCxfPShwK20pLzQ7cmV0dXJuIHg+dyYmeD5NP3g8LjAxPyhuPTAscz0uNzA3MTA2NzgxLHI9LjcwNzEwNjc4MSk6KG49TWF0aC5zcXJ0KHgpLHM9QS9uLHI9Uy9uKTp3Pk0/dzwuMDE/KG49LjcwNzEwNjc4MSxzPTAscj0uNzA3MTA2NzgxKToocz1NYXRoLnNxcnQodyksbj1BL3Mscj1fL3MpOk08LjAxPyhuPS43MDcxMDY3ODEscz0uNzA3MTA2NzgxLHI9MCk6KHI9TWF0aC5zcXJ0KE0pLG49Uy9yLHM9Xy9yKSx0aGlzLnNldChuLHMscixlKSx0aGlzfWxldCBiPU1hdGguc3FydCgobS1wKSoobS1wKSsodS15KSoodS15KSsoZi1oKSooZi1oKSk7cmV0dXJuIE1hdGguYWJzKGIpPC4wMDEmJihiPTEpLHRoaXMueD0obS1wKS9iLHRoaXMueT0odS15KS9iLHRoaXMuej0oZi1oKS9iLHRoaXMudz1NYXRoLmFjb3MoKGwrZCtnLTEpLzIpLHRoaXN9c2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWVbMTJdLHRoaXMueT1lWzEzXSx0aGlzLno9ZVsxNF0sdGhpcy53PWVbMTVdLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5taW4odGhpcy53LHQudyksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpcy56PU1hdGgubWF4KHRoaXMueix0LnopLHRoaXMudz1NYXRoLm1heCh0aGlzLncsdC53KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1aKHRoaXMueCx0LngsZS54KSx0aGlzLnk9Wih0aGlzLnksdC55LGUueSksdGhpcy56PVoodGhpcy56LHQueixlLnopLHRoaXMudz1aKHRoaXMudyx0LncsZS53KSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1aKHRoaXMueCx0LGUpLHRoaXMueT1aKHRoaXMueSx0LGUpLHRoaXMuej1aKHRoaXMueix0LGUpLHRoaXMudz1aKHRoaXMudyx0LGUpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKFoobix0LGUpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpcy56PU1hdGguZmxvb3IodGhpcy56KSx0aGlzLnc9TWF0aC5mbG9vcih0aGlzLncpLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzLnc9TWF0aC5jZWlsKHRoaXMudyksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpcy56PU1hdGgucm91bmQodGhpcy56KSx0aGlzLnc9TWF0aC5yb3VuZCh0aGlzLncpLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpcy53PU1hdGgudHJ1bmModGhpcy53KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzLno9LXRoaXMueix0aGlzLnc9LXRoaXMudyx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55K3RoaXMueip0LnordGhpcy53KnQud31sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMudyl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopK01hdGguYWJzKHRoaXMudyl9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzLnorPSh0LnotdGhpcy56KSplLHRoaXMudys9KHQudy10aGlzLncpKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzLno9dC56KyhlLnotdC56KSpuLHRoaXMudz10LncrKGUudy10LncpKm4sdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55JiZ0Lno9PT10aGlzLnomJnQudz09PXRoaXMud31mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLng9dFtlXSx0aGlzLnk9dFtlKzFdLHRoaXMuej10W2UrMl0sdGhpcy53PXRbZSszXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHRbZSsyXT10aGlzLnosdFtlKzNdPXRoaXMudyx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXMuej10LmdldFooZSksdGhpcy53PXQuZ2V0VyhlKSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzLno9TWF0aC5yYW5kb20oKSx0aGlzLnc9TWF0aC5yYW5kb20oKSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnkseWllbGQgdGhpcy56LHlpZWxkIHRoaXMud319Y2xhc3MgbXR7Y29uc3RydWN0b3IodD1uZXcgVCgxLzAsMS8wLDEvMCksZT1uZXcgVCgtMS8wLC0xLzAsLTEvMCkpe3RoaXMuaXNCb3gzPSEwLHRoaXMubWluPXQsdGhpcy5tYXg9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5taW4uY29weSh0KSx0aGlzLm1heC5jb3B5KGUpLHRoaXN9c2V0RnJvbUFycmF5KHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSs9Myl0aGlzLmV4cGFuZEJ5UG9pbnQobGUuZnJvbUFycmF5KHQsZSkpO3JldHVybiB0aGlzfXNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IGU9MCxuPXQuY291bnQ7ZTxuO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQobGUuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpKTtyZXR1cm4gdGhpc31zZXRGcm9tUG9pbnRzKHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXRoaXMuZXhwYW5kQnlQb2ludCh0W2VdKTtyZXR1cm4gdGhpc31zZXRGcm9tQ2VudGVyQW5kU2l6ZSh0LGUpe2NvbnN0IG49bGUuY29weShlKS5tdWx0aXBseVNjYWxhciguNSk7cmV0dXJuIHRoaXMubWluLmNvcHkodCkuc3ViKG4pLHRoaXMubWF4LmNvcHkodCkuYWRkKG4pLHRoaXN9c2V0RnJvbU9iamVjdCh0LGU9ITEpe3JldHVybiB0aGlzLm1ha2VFbXB0eSgpLHRoaXMuZXhwYW5kQnlPYmplY3QodCxlKX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpc31tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5taW4ueD10aGlzLm1pbi55PXRoaXMubWluLno9MS8wLHRoaXMubWF4Lng9dGhpcy5tYXgueT10aGlzLm1heC56PS0xLzAsdGhpc31pc0VtcHR5KCl7cmV0dXJuIHRoaXMubWF4Lng8dGhpcy5taW4ueHx8dGhpcy5tYXgueTx0aGlzLm1pbi55fHx0aGlzLm1heC56PHRoaXMubWluLnp9Z2V0Q2VudGVyKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDAsMCk6dC5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9Z2V0U2l6ZSh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwLDApOnQuc3ViVmVjdG9ycyh0aGlzLm1heCx0aGlzLm1pbil9ZXhwYW5kQnlQb2ludCh0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQpLHRoaXMubWF4Lm1heCh0KSx0aGlzfWV4cGFuZEJ5VmVjdG9yKHQpe3JldHVybiB0aGlzLm1pbi5zdWIodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXhwYW5kQnlTY2FsYXIodCl7cmV0dXJuIHRoaXMubWluLmFkZFNjYWxhcigtdCksdGhpcy5tYXguYWRkU2NhbGFyKHQpLHRoaXN9ZXhwYW5kQnlPYmplY3QodCxlPSExKXt0LnVwZGF0ZVdvcmxkTWF0cml4KCExLCExKTtjb25zdCBuPXQuZ2VvbWV0cnk7aWYobiE9PXZvaWQgMCl7Y29uc3Qgcj1uLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtpZihlPT09ITAmJnIhPT12b2lkIDAmJnQuaXNJbnN0YW5jZWRNZXNoIT09ITApZm9yKGxldCBvPTAsYT1yLmNvdW50O288YTtvKyspdC5pc01lc2g9PT0hMD90LmdldFZlcnRleFBvc2l0aW9uKG8sbGUpOmxlLmZyb21CdWZmZXJBdHRyaWJ1dGUocixvKSxsZS5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy5leHBhbmRCeVBvaW50KGxlKTtlbHNlIHQuYm91bmRpbmdCb3ghPT12b2lkIDA/KHQuYm91bmRpbmdCb3g9PT1udWxsJiZ0LmNvbXB1dGVCb3VuZGluZ0JveCgpLGRzLmNvcHkodC5ib3VuZGluZ0JveCkpOihuLmJvdW5kaW5nQm94PT09bnVsbCYmbi5jb21wdXRlQm91bmRpbmdCb3goKSxkcy5jb3B5KG4uYm91bmRpbmdCb3gpKSxkcy5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy51bmlvbihkcyl9Y29uc3Qgcz10LmNoaWxkcmVuO2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrKyl0aGlzLmV4cGFuZEJ5T2JqZWN0KHNbcl0sZSk7cmV0dXJuIHRoaXN9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdC54Pj10aGlzLm1pbi54JiZ0Lng8PXRoaXMubWF4LngmJnQueT49dGhpcy5taW4ueSYmdC55PD10aGlzLm1heC55JiZ0Lno+PXRoaXMubWluLnomJnQuejw9dGhpcy5tYXguen1jb250YWluc0JveCh0KXtyZXR1cm4gdGhpcy5taW4ueDw9dC5taW4ueCYmdC5tYXgueDw9dGhpcy5tYXgueCYmdGhpcy5taW4ueTw9dC5taW4ueSYmdC5tYXgueTw9dGhpcy5tYXgueSYmdGhpcy5taW4uejw9dC5taW4ueiYmdC5tYXguejw9dGhpcy5tYXguen1nZXRQYXJhbWV0ZXIodCxlKXtyZXR1cm4gZS5zZXQoKHQueC10aGlzLm1pbi54KS8odGhpcy5tYXgueC10aGlzLm1pbi54KSwodC55LXRoaXMubWluLnkpLyh0aGlzLm1heC55LXRoaXMubWluLnkpLCh0LnotdGhpcy5taW4ueikvKHRoaXMubWF4LnotdGhpcy5taW4ueikpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQubWF4Lng+PXRoaXMubWluLngmJnQubWluLng8PXRoaXMubWF4LngmJnQubWF4Lnk+PXRoaXMubWluLnkmJnQubWluLnk8PXRoaXMubWF4LnkmJnQubWF4Lno+PXRoaXMubWluLnomJnQubWluLno8PXRoaXMubWF4Lnp9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQuY2VudGVyLGxlKSxsZS5kaXN0YW5jZVRvU3F1YXJlZCh0LmNlbnRlcik8PXQucmFkaXVzKnQucmFkaXVzfWludGVyc2VjdHNQbGFuZSh0KXtsZXQgZSxuO3JldHVybiB0Lm5vcm1hbC54PjA/KGU9dC5ub3JtYWwueCp0aGlzLm1pbi54LG49dC5ub3JtYWwueCp0aGlzLm1heC54KTooZT10Lm5vcm1hbC54KnRoaXMubWF4Lngsbj10Lm5vcm1hbC54KnRoaXMubWluLngpLHQubm9ybWFsLnk+MD8oZSs9dC5ub3JtYWwueSp0aGlzLm1pbi55LG4rPXQubm9ybWFsLnkqdGhpcy5tYXgueSk6KGUrPXQubm9ybWFsLnkqdGhpcy5tYXgueSxuKz10Lm5vcm1hbC55KnRoaXMubWluLnkpLHQubm9ybWFsLno+MD8oZSs9dC5ub3JtYWwueip0aGlzLm1pbi56LG4rPXQubm9ybWFsLnoqdGhpcy5tYXgueik6KGUrPXQubm9ybWFsLnoqdGhpcy5tYXgueixuKz10Lm5vcm1hbC56KnRoaXMubWluLnopLGU8PS10LmNvbnN0YW50JiZuPj0tdC5jb25zdGFudH1pbnRlcnNlY3RzVHJpYW5nbGUodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuITE7dGhpcy5nZXRDZW50ZXIoQWkpLHBzLnN1YlZlY3RvcnModGhpcy5tYXgsQWkpLExuLnN1YlZlY3RvcnModC5hLEFpKSxPbi5zdWJWZWN0b3JzKHQuYixBaSksRG4uc3ViVmVjdG9ycyh0LmMsQWkpLEplLnN1YlZlY3RvcnMoT24sTG4pLFllLnN1YlZlY3RvcnMoRG4sT24pLGZuLnN1YlZlY3RvcnMoTG4sRG4pO2xldCBlPVswLC1KZS56LEplLnksMCwtWWUueixZZS55LDAsLWZuLnosZm4ueSxKZS56LDAsLUplLngsWWUueiwwLC1ZZS54LGZuLnosMCwtZm4ueCwtSmUueSxKZS54LDAsLVllLnksWWUueCwwLC1mbi55LGZuLngsMF07cmV0dXJuIXVvKGUsTG4sT24sRG4scHMpfHwoZT1bMSwwLDAsMCwxLDAsMCwwLDFdLCF1byhlLExuLE9uLERuLHBzKSk/ITE6KHlzLmNyb3NzVmVjdG9ycyhKZSxZZSksZT1beXMueCx5cy55LHlzLnpdLHVvKGUsTG4sT24sRG4scHMpKX1jbGFtcFBvaW50KHQsZSl7cmV0dXJuIGUuY29weSh0KS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCl9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiB0aGlzLmNsYW1wUG9pbnQodCxsZSkuZGlzdGFuY2VUbyh0KX1nZXRCb3VuZGluZ1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5tYWtlRW1wdHkoKToodGhpcy5nZXRDZW50ZXIodC5jZW50ZXIpLHQucmFkaXVzPXRoaXMuZ2V0U2l6ZShsZSkubGVuZ3RoKCkqLjUpLHR9aW50ZXJzZWN0KHQpe3JldHVybiB0aGlzLm1pbi5tYXgodC5taW4pLHRoaXMubWF4Lm1pbih0Lm1heCksdGhpcy5pc0VtcHR5KCkmJnRoaXMubWFrZUVtcHR5KCksdGhpc311bmlvbih0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQubWluKSx0aGlzLm1heC5tYXgodC5tYXgpLHRoaXN9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90aGlzOih6ZVswXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSx6ZVsxXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx6ZVsyXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSx6ZVszXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx6ZVs0XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSx6ZVs1XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx6ZVs2XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSx6ZVs3XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx0aGlzLnNldEZyb21Qb2ludHMoemUpLHRoaXMpfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5taW4uYWRkKHQpLHRoaXMubWF4LmFkZCh0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5taW4uZXF1YWxzKHRoaXMubWluKSYmdC5tYXguZXF1YWxzKHRoaXMubWF4KX10b0pTT04oKXtyZXR1cm57bWluOnRoaXMubWluLnRvQXJyYXkoKSxtYXg6dGhpcy5tYXgudG9BcnJheSgpfX1mcm9tSlNPTih0KXtyZXR1cm4gdGhpcy5taW4uZnJvbUFycmF5KHQubWluKSx0aGlzLm1heC5mcm9tQXJyYXkodC5tYXgpLHRoaXN9fWNvbnN0IHplPVtuZXcgVCxuZXcgVCxuZXcgVCxuZXcgVCxuZXcgVCxuZXcgVCxuZXcgVCxuZXcgVF0sbGU9bmV3IFQsZHM9bmV3IG10LExuPW5ldyBULE9uPW5ldyBULERuPW5ldyBULEplPW5ldyBULFllPW5ldyBULGZuPW5ldyBULEFpPW5ldyBULHBzPW5ldyBULHlzPW5ldyBULGRuPW5ldyBUO2Z1bmN0aW9uIHVvKGksdCxlLG4scyl7Zm9yKGxldCByPTAsbz1pLmxlbmd0aC0zO3I8PW87cis9Myl7ZG4uZnJvbUFycmF5KGkscik7Y29uc3QgYT1zLngqTWF0aC5hYnMoZG4ueCkrcy55Kk1hdGguYWJzKGRuLnkpK3MueipNYXRoLmFicyhkbi56KSxjPXQuZG90KGRuKSxsPWUuZG90KGRuKSxoPW4uZG90KGRuKTtpZihNYXRoLm1heCgtTWF0aC5tYXgoYyxsLGgpLE1hdGgubWluKGMsbCxoKSk+YSlyZXR1cm4hMX1yZXR1cm4hMH1jb25zdCB1Zj1uZXcgbXQsU2k9bmV3IFQsZm89bmV3IFQ7Y2xhc3MgcG97Y29uc3RydWN0b3IodD1uZXcgVCxlPS0xKXt0aGlzLmlzU3BoZXJlPSEwLHRoaXMuY2VudGVyPXQsdGhpcy5yYWRpdXM9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0KSx0aGlzLnJhZGl1cz1lLHRoaXN9c2V0RnJvbVBvaW50cyh0LGUpe2NvbnN0IG49dGhpcy5jZW50ZXI7ZSE9PXZvaWQgMD9uLmNvcHkoZSk6dWYuc2V0RnJvbVBvaW50cyh0KS5nZXRDZW50ZXIobik7bGV0IHM9MDtmb3IobGV0IHI9MCxvPXQubGVuZ3RoO3I8bztyKyspcz1NYXRoLm1heChzLG4uZGlzdGFuY2VUb1NxdWFyZWQodFtyXSkpO3JldHVybiB0aGlzLnJhZGl1cz1NYXRoLnNxcnQocyksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLnJhZGl1cz10LnJhZGl1cyx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5yYWRpdXM8MH1tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5jZW50ZXIuc2V0KDAsMCwwKSx0aGlzLnJhZGl1cz0tMSx0aGlzfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuIHQuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD10aGlzLnJhZGl1cyp0aGlzLnJhZGl1c31kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHQuZGlzdGFuY2VUbyh0aGlzLmNlbnRlciktdGhpcy5yYWRpdXN9aW50ZXJzZWN0c1NwaGVyZSh0KXtjb25zdCBlPXRoaXMucmFkaXVzK3QucmFkaXVzO3JldHVybiB0LmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcik8PWUqZX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNTcGhlcmUodGhpcyl9aW50ZXJzZWN0c1BsYW5lKHQpe3JldHVybiBNYXRoLmFicyh0LmRpc3RhbmNlVG9Qb2ludCh0aGlzLmNlbnRlcikpPD10aGlzLnJhZGl1c31jbGFtcFBvaW50KHQsZSl7Y29uc3Qgbj10aGlzLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0KTtyZXR1cm4gZS5jb3B5KHQpLG4+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMmJihlLnN1Yih0aGlzLmNlbnRlcikubm9ybWFsaXplKCksZS5tdWx0aXBseVNjYWxhcih0aGlzLnJhZGl1cykuYWRkKHRoaXMuY2VudGVyKSksZX1nZXRCb3VuZGluZ0JveCh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/KHQubWFrZUVtcHR5KCksdCk6KHQuc2V0KHRoaXMuY2VudGVyLHRoaXMuY2VudGVyKSx0LmV4cGFuZEJ5U2NhbGFyKHRoaXMucmFkaXVzKSx0KX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuY2VudGVyLmFwcGx5TWF0cml4NCh0KSx0aGlzLnJhZGl1cz10aGlzLnJhZGl1cyp0LmdldE1heFNjYWxlT25BeGlzKCksdGhpc310cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMuY2VudGVyLmFkZCh0KSx0aGlzfWV4cGFuZEJ5UG9pbnQodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodCksdGhpcy5yYWRpdXM9MCx0aGlzO1NpLnN1YlZlY3RvcnModCx0aGlzLmNlbnRlcik7Y29uc3QgZT1TaS5sZW5ndGhTcSgpO2lmKGU+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMpe2NvbnN0IG49TWF0aC5zcXJ0KGUpLHM9KG4tdGhpcy5yYWRpdXMpKi41O3RoaXMuY2VudGVyLmFkZFNjYWxlZFZlY3RvcihTaSxzL24pLHRoaXMucmFkaXVzKz1zfXJldHVybiB0aGlzfXVuaW9uKHQpe3JldHVybiB0LmlzRW1wdHkoKT90aGlzOnRoaXMuaXNFbXB0eSgpPyh0aGlzLmNvcHkodCksdGhpcyk6KHRoaXMuY2VudGVyLmVxdWFscyh0LmNlbnRlcik9PT0hMD90aGlzLnJhZGl1cz1NYXRoLm1heCh0aGlzLnJhZGl1cyx0LnJhZGl1cyk6KGZvLnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5jZW50ZXIpLnNldExlbmd0aCh0LnJhZGl1cyksdGhpcy5leHBhbmRCeVBvaW50KFNpLmNvcHkodC5jZW50ZXIpLmFkZChmbykpLHRoaXMuZXhwYW5kQnlQb2ludChTaS5jb3B5KHQuY2VudGVyKS5zdWIoZm8pKSksdGhpcyl9ZXF1YWxzKHQpe3JldHVybiB0LmNlbnRlci5lcXVhbHModGhpcy5jZW50ZXIpJiZ0LnJhZGl1cz09PXRoaXMucmFkaXVzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX10b0pTT04oKXtyZXR1cm57cmFkaXVzOnRoaXMucmFkaXVzLGNlbnRlcjp0aGlzLmNlbnRlci50b0FycmF5KCl9fWZyb21KU09OKHQpe3JldHVybiB0aGlzLnJhZGl1cz10LnJhZGl1cyx0aGlzLmNlbnRlci5mcm9tQXJyYXkodC5jZW50ZXIpLHRoaXN9fWNvbnN0IFRlPW5ldyBULHlvPW5ldyBULG1zPW5ldyBULGplPW5ldyBULG1vPW5ldyBULGdzPW5ldyBULGdvPW5ldyBUO2NsYXNzIHhve2NvbnN0cnVjdG9yKHQ9bmV3IFQsZT1uZXcgVCgwLDAsLTEpKXt0aGlzLm9yaWdpbj10LHRoaXMuZGlyZWN0aW9uPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMub3JpZ2luLmNvcHkodCksdGhpcy5kaXJlY3Rpb24uY29weShlKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMub3JpZ2luLmNvcHkodC5vcmlnaW4pLHRoaXMuZGlyZWN0aW9uLmNvcHkodC5kaXJlY3Rpb24pLHRoaXN9YXQodCxlKXtyZXR1cm4gZS5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sdCl9bG9va0F0KHQpe3JldHVybiB0aGlzLmRpcmVjdGlvbi5jb3B5KHQpLnN1Yih0aGlzLm9yaWdpbikubm9ybWFsaXplKCksdGhpc31yZWNhc3QodCl7cmV0dXJuIHRoaXMub3JpZ2luLmNvcHkodGhpcy5hdCh0LFRlKSksdGhpc31jbG9zZXN0UG9pbnRUb1BvaW50KHQsZSl7ZS5zdWJWZWN0b3JzKHQsdGhpcy5vcmlnaW4pO2NvbnN0IG49ZS5kb3QodGhpcy5kaXJlY3Rpb24pO3JldHVybiBuPDA/ZS5jb3B5KHRoaXMub3JpZ2luKTplLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbixuKX1kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlU3FUb1BvaW50KHQpKX1kaXN0YW5jZVNxVG9Qb2ludCh0KXtjb25zdCBlPVRlLnN1YlZlY3RvcnModCx0aGlzLm9yaWdpbikuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gZTwwP3RoaXMub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKHQpOihUZS5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sZSksVGUuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlU3FUb1NlZ21lbnQodCxlLG4scyl7eW8uY29weSh0KS5hZGQoZSkubXVsdGlwbHlTY2FsYXIoLjUpLG1zLmNvcHkoZSkuc3ViKHQpLm5vcm1hbGl6ZSgpLGplLmNvcHkodGhpcy5vcmlnaW4pLnN1Yih5byk7Y29uc3Qgcj10LmRpc3RhbmNlVG8oZSkqLjUsbz0tdGhpcy5kaXJlY3Rpb24uZG90KG1zKSxhPWplLmRvdCh0aGlzLmRpcmVjdGlvbiksYz0tamUuZG90KG1zKSxsPWplLmxlbmd0aFNxKCksaD1NYXRoLmFicygxLW8qbyk7bGV0IHUsZixkLHA7aWYoaD4wKWlmKHU9bypjLWEsZj1vKmEtYyxwPXIqaCx1Pj0wKWlmKGY+PS1wKWlmKGY8PXApe2NvbnN0IHk9MS9oO3UqPXksZio9eSxkPXUqKHUrbypmKzIqYSkrZioobyp1K2YrMipjKStsfWVsc2UgZj1yLHU9TWF0aC5tYXgoMCwtKG8qZithKSksZD0tdSp1K2YqKGYrMipjKStsO2Vsc2UgZj0tcix1PU1hdGgubWF4KDAsLShvKmYrYSkpLGQ9LXUqdStmKihmKzIqYykrbDtlbHNlIGY8PS1wPyh1PU1hdGgubWF4KDAsLSgtbypyK2EpKSxmPXU+MD8tcjpNYXRoLm1pbihNYXRoLm1heCgtciwtYyksciksZD0tdSp1K2YqKGYrMipjKStsKTpmPD1wPyh1PTAsZj1NYXRoLm1pbihNYXRoLm1heCgtciwtYyksciksZD1mKihmKzIqYykrbCk6KHU9TWF0aC5tYXgoMCwtKG8qcithKSksZj11PjA/cjpNYXRoLm1pbihNYXRoLm1heCgtciwtYyksciksZD0tdSp1K2YqKGYrMipjKStsKTtlbHNlIGY9bz4wPy1yOnIsdT1NYXRoLm1heCgwLC0obypmK2EpKSxkPS11KnUrZiooZisyKmMpK2w7cmV0dXJuIG4mJm4uY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLHUpLHMmJnMuY29weSh5bykuYWRkU2NhbGVkVmVjdG9yKG1zLGYpLGR9aW50ZXJzZWN0U3BoZXJlKHQsZSl7VGUuc3ViVmVjdG9ycyh0LmNlbnRlcix0aGlzLm9yaWdpbik7Y29uc3Qgbj1UZS5kb3QodGhpcy5kaXJlY3Rpb24pLHM9VGUuZG90KFRlKS1uKm4scj10LnJhZGl1cyp0LnJhZGl1cztpZihzPnIpcmV0dXJuIG51bGw7Y29uc3Qgbz1NYXRoLnNxcnQoci1zKSxhPW4tbyxjPW4rbztyZXR1cm4gYzwwP251bGw6YTwwP3RoaXMuYXQoYyxlKTp0aGlzLmF0KGEsZSl9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdC5yYWRpdXM8MD8hMTp0aGlzLmRpc3RhbmNlU3FUb1BvaW50KHQuY2VudGVyKTw9dC5yYWRpdXMqdC5yYWRpdXN9ZGlzdGFuY2VUb1BsYW5lKHQpe2NvbnN0IGU9dC5ub3JtYWwuZG90KHRoaXMuZGlyZWN0aW9uKTtpZihlPT09MClyZXR1cm4gdC5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pPT09MD8wOm51bGw7Y29uc3Qgbj0tKHRoaXMub3JpZ2luLmRvdCh0Lm5vcm1hbCkrdC5jb25zdGFudCkvZTtyZXR1cm4gbj49MD9uOm51bGx9aW50ZXJzZWN0UGxhbmUodCxlKXtjb25zdCBuPXRoaXMuZGlzdGFuY2VUb1BsYW5lKHQpO3JldHVybiBuPT09bnVsbD9udWxsOnRoaXMuYXQobixlKX1pbnRlcnNlY3RzUGxhbmUodCl7Y29uc3QgZT10LmRpc3RhbmNlVG9Qb2ludCh0aGlzLm9yaWdpbik7cmV0dXJuIGU9PT0wfHx0Lm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pKmU8MH1pbnRlcnNlY3RCb3godCxlKXtsZXQgbixzLHIsbyxhLGM7Y29uc3QgbD0xL3RoaXMuZGlyZWN0aW9uLngsaD0xL3RoaXMuZGlyZWN0aW9uLnksdT0xL3RoaXMuZGlyZWN0aW9uLnosZj10aGlzLm9yaWdpbjtyZXR1cm4gbD49MD8obj0odC5taW4ueC1mLngpKmwscz0odC5tYXgueC1mLngpKmwpOihuPSh0Lm1heC54LWYueCkqbCxzPSh0Lm1pbi54LWYueCkqbCksaD49MD8ocj0odC5taW4ueS1mLnkpKmgsbz0odC5tYXgueS1mLnkpKmgpOihyPSh0Lm1heC55LWYueSkqaCxvPSh0Lm1pbi55LWYueSkqaCksbj5vfHxyPnN8fCgocj5ufHxpc05hTihuKSkmJihuPXIpLChvPHN8fGlzTmFOKHMpKSYmKHM9byksdT49MD8oYT0odC5taW4uei1mLnopKnUsYz0odC5tYXguei1mLnopKnUpOihhPSh0Lm1heC56LWYueikqdSxjPSh0Lm1pbi56LWYueikqdSksbj5jfHxhPnMpfHwoKGE+bnx8biE9PW4pJiYobj1hKSwoYzxzfHxzIT09cykmJihzPWMpLHM8MCk/bnVsbDp0aGlzLmF0KG4+PTA/bjpzLGUpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHRoaXMuaW50ZXJzZWN0Qm94KHQsVGUpIT09bnVsbH1pbnRlcnNlY3RUcmlhbmdsZSh0LGUsbixzLHIpe21vLnN1YlZlY3RvcnMoZSx0KSxncy5zdWJWZWN0b3JzKG4sdCksZ28uY3Jvc3NWZWN0b3JzKG1vLGdzKTtsZXQgbz10aGlzLmRpcmVjdGlvbi5kb3QoZ28pLGE7aWYobz4wKXtpZihzKXJldHVybiBudWxsO2E9MX1lbHNlIGlmKG88MClhPS0xLG89LW87ZWxzZSByZXR1cm4gbnVsbDtqZS5zdWJWZWN0b3JzKHRoaXMub3JpZ2luLHQpO2NvbnN0IGM9YSp0aGlzLmRpcmVjdGlvbi5kb3QoZ3MuY3Jvc3NWZWN0b3JzKGplLGdzKSk7aWYoYzwwKXJldHVybiBudWxsO2NvbnN0IGw9YSp0aGlzLmRpcmVjdGlvbi5kb3QobW8uY3Jvc3MoamUpKTtpZihsPDB8fGMrbD5vKXJldHVybiBudWxsO2NvbnN0IGg9LWEqamUuZG90KGdvKTtyZXR1cm4gaDwwP251bGw6dGhpcy5hdChoL28scil9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLm9yaWdpbi5hcHBseU1hdHJpeDQodCksdGhpcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKHQpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm9yaWdpbi5lcXVhbHModGhpcy5vcmlnaW4pJiZ0LmRpcmVjdGlvbi5lcXVhbHModGhpcy5kaXJlY3Rpb24pfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19Y2xhc3Mgc3R7Y29uc3RydWN0b3IodCxlLG4scyxyLG8sYSxjLGwsaCx1LGYsZCxwLHksbSl7c3QucHJvdG90eXBlLmlzTWF0cml4ND0hMCx0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSx0IT09dm9pZCAwJiZ0aGlzLnNldCh0LGUsbixzLHIsbyxhLGMsbCxoLHUsZixkLHAseSxtKX1zZXQodCxlLG4scyxyLG8sYSxjLGwsaCx1LGYsZCxwLHksbSl7Y29uc3QgZz10aGlzLmVsZW1lbnRzO3JldHVybiBnWzBdPXQsZ1s0XT1lLGdbOF09bixnWzEyXT1zLGdbMV09cixnWzVdPW8sZ1s5XT1hLGdbMTNdPWMsZ1syXT1sLGdbNl09aCxnWzEwXT11LGdbMTRdPWYsZ1szXT1kLGdbN109cCxnWzExXT15LGdbMTVdPW0sdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyBzdCgpLmZyb21BcnJheSh0aGlzLmVsZW1lbnRzKX1jb3B5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7cmV0dXJuIGVbMF09blswXSxlWzFdPW5bMV0sZVsyXT1uWzJdLGVbM109blszXSxlWzRdPW5bNF0sZVs1XT1uWzVdLGVbNl09bls2XSxlWzddPW5bN10sZVs4XT1uWzhdLGVbOV09bls5XSxlWzEwXT1uWzEwXSxlWzExXT1uWzExXSxlWzEyXT1uWzEyXSxlWzEzXT1uWzEzXSxlWzE0XT1uWzE0XSxlWzE1XT1uWzE1XSx0aGlzfWNvcHlQb3NpdGlvbih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO3JldHVybiBlWzEyXT1uWzEyXSxlWzEzXT1uWzEzXSxlWzE0XT1uWzE0XSx0aGlzfXNldEZyb21NYXRyaXgzKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5zZXQoZVswXSxlWzNdLGVbNl0sMCxlWzFdLGVbNF0sZVs3XSwwLGVbMl0sZVs1XSxlWzhdLDAsMCwwLDAsMSksdGhpc31leHRyYWN0QmFzaXModCxlLG4pe3JldHVybiB0LnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywwKSxlLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywxKSxuLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywyKSx0aGlzfW1ha2VCYXNpcyh0LGUsbil7cmV0dXJuIHRoaXMuc2V0KHQueCxlLngsbi54LDAsdC55LGUueSxuLnksMCx0LnosZS56LG4ueiwwLDAsMCwwLDEpLHRoaXN9ZXh0cmFjdFJvdGF0aW9uKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHMscz0xLyRuLnNldEZyb21NYXRyaXhDb2x1bW4odCwwKS5sZW5ndGgoKSxyPTEvJG4uc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLG89MS8kbi5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMikubGVuZ3RoKCk7cmV0dXJuIGVbMF09blswXSpzLGVbMV09blsxXSpzLGVbMl09blsyXSpzLGVbM109MCxlWzRdPW5bNF0qcixlWzVdPW5bNV0qcixlWzZdPW5bNl0qcixlWzddPTAsZVs4XT1uWzhdKm8sZVs5XT1uWzldKm8sZVsxMF09blsxMF0qbyxlWzExXT0wLGVbMTJdPTAsZVsxM109MCxlWzE0XT0wLGVbMTVdPTEsdGhpc31tYWtlUm90YXRpb25Gcm9tRXVsZXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC54LHM9dC55LHI9dC56LG89TWF0aC5jb3MobiksYT1NYXRoLnNpbihuKSxjPU1hdGguY29zKHMpLGw9TWF0aC5zaW4ocyksaD1NYXRoLmNvcyhyKSx1PU1hdGguc2luKHIpO2lmKHQub3JkZXI9PT0iWFlaIil7Y29uc3QgZj1vKmgsZD1vKnUscD1hKmgseT1hKnU7ZVswXT1jKmgsZVs0XT0tYyp1LGVbOF09bCxlWzFdPWQrcCpsLGVbNV09Zi15KmwsZVs5XT0tYSpjLGVbMl09eS1mKmwsZVs2XT1wK2QqbCxlWzEwXT1vKmN9ZWxzZSBpZih0Lm9yZGVyPT09IllYWiIpe2NvbnN0IGY9YypoLGQ9Yyp1LHA9bCpoLHk9bCp1O2VbMF09Zit5KmEsZVs0XT1wKmEtZCxlWzhdPW8qbCxlWzFdPW8qdSxlWzVdPW8qaCxlWzldPS1hLGVbMl09ZCphLXAsZVs2XT15K2YqYSxlWzEwXT1vKmN9ZWxzZSBpZih0Lm9yZGVyPT09IlpYWSIpe2NvbnN0IGY9YypoLGQ9Yyp1LHA9bCpoLHk9bCp1O2VbMF09Zi15KmEsZVs0XT0tbyp1LGVbOF09cCtkKmEsZVsxXT1kK3AqYSxlWzVdPW8qaCxlWzldPXktZiphLGVbMl09LW8qbCxlWzZdPWEsZVsxMF09bypjfWVsc2UgaWYodC5vcmRlcj09PSJaWVgiKXtjb25zdCBmPW8qaCxkPW8qdSxwPWEqaCx5PWEqdTtlWzBdPWMqaCxlWzRdPXAqbC1kLGVbOF09ZipsK3ksZVsxXT1jKnUsZVs1XT15KmwrZixlWzldPWQqbC1wLGVbMl09LWwsZVs2XT1hKmMsZVsxMF09bypjfWVsc2UgaWYodC5vcmRlcj09PSJZWlgiKXtjb25zdCBmPW8qYyxkPW8qbCxwPWEqYyx5PWEqbDtlWzBdPWMqaCxlWzRdPXktZip1LGVbOF09cCp1K2QsZVsxXT11LGVbNV09bypoLGVbOV09LWEqaCxlWzJdPS1sKmgsZVs2XT1kKnUrcCxlWzEwXT1mLXkqdX1lbHNlIGlmKHQub3JkZXI9PT0iWFpZIil7Y29uc3QgZj1vKmMsZD1vKmwscD1hKmMseT1hKmw7ZVswXT1jKmgsZVs0XT0tdSxlWzhdPWwqaCxlWzFdPWYqdSt5LGVbNV09bypoLGVbOV09ZCp1LXAsZVsyXT1wKnUtZCxlWzZdPWEqaCxlWzEwXT15KnUrZn1yZXR1cm4gZVszXT0wLGVbN109MCxlWzExXT0wLGVbMTJdPTAsZVsxM109MCxlWzE0XT0wLGVbMTVdPTEsdGhpc31tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy5jb21wb3NlKGZmLHQsZGYpfWxvb2tBdCh0LGUsbil7Y29uc3Qgcz10aGlzLmVsZW1lbnRzO3JldHVybiAkdC5zdWJWZWN0b3JzKHQsZSksJHQubGVuZ3RoU3EoKT09PTAmJigkdC56PTEpLCR0Lm5vcm1hbGl6ZSgpLFFlLmNyb3NzVmVjdG9ycyhuLCR0KSxRZS5sZW5ndGhTcSgpPT09MCYmKE1hdGguYWJzKG4ueik9PT0xPyR0LngrPTFlLTQ6JHQueis9MWUtNCwkdC5ub3JtYWxpemUoKSxRZS5jcm9zc1ZlY3RvcnMobiwkdCkpLFFlLm5vcm1hbGl6ZSgpLHhzLmNyb3NzVmVjdG9ycygkdCxRZSksc1swXT1RZS54LHNbNF09eHMueCxzWzhdPSR0Lngsc1sxXT1RZS55LHNbNV09eHMueSxzWzldPSR0Lnksc1syXT1RZS56LHNbNl09eHMueixzWzEwXT0kdC56LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLHQpfXByZW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModCx0aGlzKX1tdWx0aXBseU1hdHJpY2VzKHQsZSl7Y29uc3Qgbj10LmVsZW1lbnRzLHM9ZS5lbGVtZW50cyxyPXRoaXMuZWxlbWVudHMsbz1uWzBdLGE9bls0XSxjPW5bOF0sbD1uWzEyXSxoPW5bMV0sdT1uWzVdLGY9bls5XSxkPW5bMTNdLHA9blsyXSx5PW5bNl0sbT1uWzEwXSxnPW5bMTRdLGI9blszXSx4PW5bN10sdz1uWzExXSxNPW5bMTVdLEE9c1swXSxTPXNbNF0sXz1zWzhdLHY9c1sxMl0sUD1zWzFdLHo9c1s1XSxFPXNbOV0sQz1zWzEzXSxGPXNbMl0sQj1zWzZdLEk9c1sxMF0sUj1zWzE0XSwkPXNbM10sVj1zWzddLG50PXNbMTFdLHh0PXNbMTVdO3JldHVybiByWzBdPW8qQSthKlArYypGK2wqJCxyWzRdPW8qUythKnorYypCK2wqVixyWzhdPW8qXythKkUrYypJK2wqbnQsclsxMl09byp2K2EqQytjKlIrbCp4dCxyWzFdPWgqQSt1KlArZipGK2QqJCxyWzVdPWgqUyt1KnorZipCK2QqVixyWzldPWgqXyt1KkUrZipJK2QqbnQsclsxM109aCp2K3UqQytmKlIrZCp4dCxyWzJdPXAqQSt5KlArbSpGK2cqJCxyWzZdPXAqUyt5KnorbSpCK2cqVixyWzEwXT1wKl8reSpFK20qSStnKm50LHJbMTRdPXAqdit5KkMrbSpSK2cqeHQsclszXT1iKkEreCpQK3cqRitNKiQscls3XT1iKlMreCp6K3cqQitNKlYsclsxMV09YipfK3gqRSt3KkkrTSpudCxyWzE1XT1iKnYreCpDK3cqUitNKnh0LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbNF0qPXQsZVs4XSo9dCxlWzEyXSo9dCxlWzFdKj10LGVbNV0qPXQsZVs5XSo9dCxlWzEzXSo9dCxlWzJdKj10LGVbNl0qPXQsZVsxMF0qPXQsZVsxNF0qPXQsZVszXSo9dCxlWzddKj10LGVbMTFdKj10LGVbMTVdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFs0XSxzPXRbOF0scj10WzEyXSxvPXRbMV0sYT10WzVdLGM9dFs5XSxsPXRbMTNdLGg9dFsyXSx1PXRbNl0sZj10WzEwXSxkPXRbMTRdLHA9dFszXSx5PXRbN10sbT10WzExXSxnPXRbMTVdO3JldHVybiBwKigrcipjKnUtcypsKnUtciphKmYrbipsKmYrcyphKmQtbipjKmQpK3kqKCtlKmMqZC1lKmwqZityKm8qZi1zKm8qZCtzKmwqaC1yKmMqaCkrbSooK2UqbCp1LWUqYSpkLXIqbyp1K24qbypkK3IqYSpoLW4qbCpoKStnKigtcyphKmgtZSpjKnUrZSphKmYrcypvKnUtbipvKmYrbipjKmgpfXRyYW5zcG9zZSgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cztsZXQgZTtyZXR1cm4gZT10WzFdLHRbMV09dFs0XSx0WzRdPWUsZT10WzJdLHRbMl09dFs4XSx0WzhdPWUsZT10WzZdLHRbNl09dFs5XSx0WzldPWUsZT10WzNdLHRbM109dFsxMl0sdFsxMl09ZSxlPXRbN10sdFs3XT10WzEzXSx0WzEzXT1lLGU9dFsxMV0sdFsxMV09dFsxNF0sdFsxNF09ZSx0aGlzfXNldFBvc2l0aW9uKHQsZSxuKXtjb25zdCBzPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQuaXNWZWN0b3IzPyhzWzEyXT10Lngsc1sxM109dC55LHNbMTRdPXQueik6KHNbMTJdPXQsc1sxM109ZSxzWzE0XT1uKSx0aGlzfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLHM9dFsyXSxyPXRbM10sbz10WzRdLGE9dFs1XSxjPXRbNl0sbD10WzddLGg9dFs4XSx1PXRbOV0sZj10WzEwXSxkPXRbMTFdLHA9dFsxMl0seT10WzEzXSxtPXRbMTRdLGc9dFsxNV0sYj11Km0qbC15KmYqbCt5KmMqZC1hKm0qZC11KmMqZythKmYqZyx4PXAqZipsLWgqbSpsLXAqYypkK28qbSpkK2gqYypnLW8qZipnLHc9aCp5KmwtcCp1KmwrcCphKmQtbyp5KmQtaCphKmcrbyp1KmcsTT1wKnUqYy1oKnkqYy1wKmEqZitvKnkqZitoKmEqbS1vKnUqbSxBPWUqYituKngrcyp3K3IqTTtpZihBPT09MClyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgUz0xL0E7cmV0dXJuIHRbMF09YipTLHRbMV09KHkqZipyLXUqbSpyLXkqcypkK24qbSpkK3UqcypnLW4qZipnKSpTLHRbMl09KGEqbSpyLXkqYypyK3kqcypsLW4qbSpsLWEqcypnK24qYypnKSpTLHRbM109KHUqYypyLWEqZipyLXUqcypsK24qZipsK2EqcypkLW4qYypkKSpTLHRbNF09eCpTLHRbNV09KGgqbSpyLXAqZipyK3AqcypkLWUqbSpkLWgqcypnK2UqZipnKSpTLHRbNl09KHAqYypyLW8qbSpyLXAqcypsK2UqbSpsK28qcypnLWUqYypnKSpTLHRbN109KG8qZipyLWgqYypyK2gqcypsLWUqZipsLW8qcypkK2UqYypkKSpTLHRbOF09dypTLHRbOV09KHAqdSpyLWgqeSpyLXAqbipkK2UqeSpkK2gqbipnLWUqdSpnKSpTLHRbMTBdPShvKnkqci1wKmEqcitwKm4qbC1lKnkqbC1vKm4qZytlKmEqZykqUyx0WzExXT0oaCphKnItbyp1KnItaCpuKmwrZSp1KmwrbypuKmQtZSphKmQpKlMsdFsxMl09TSpTLHRbMTNdPShoKnkqcy1wKnUqcytwKm4qZi1lKnkqZi1oKm4qbStlKnUqbSkqUyx0WzE0XT0ocCphKnMtbyp5KnMtcCpuKmMrZSp5KmMrbypuKm0tZSphKm0pKlMsdFsxNV09KG8qdSpzLWgqYSpzK2gqbipjLWUqdSpjLW8qbipmK2UqYSpmKSpTLHRoaXN9c2NhbGUodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC54LHM9dC55LHI9dC56O3JldHVybiBlWzBdKj1uLGVbNF0qPXMsZVs4XSo9cixlWzFdKj1uLGVbNV0qPXMsZVs5XSo9cixlWzJdKj1uLGVbNl0qPXMsZVsxMF0qPXIsZVszXSo9bixlWzddKj1zLGVbMTFdKj1yLHRoaXN9Z2V0TWF4U2NhbGVPbkF4aXMoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSxuPXRbNF0qdFs0XSt0WzVdKnRbNV0rdFs2XSp0WzZdLHM9dFs4XSp0WzhdK3RbOV0qdFs5XSt0WzEwXSp0WzEwXTtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgubWF4KGUsbixzKSl9bWFrZVRyYW5zbGF0aW9uKHQsZSxuKXtyZXR1cm4gdC5pc1ZlY3RvcjM/dGhpcy5zZXQoMSwwLDAsdC54LDAsMSwwLHQueSwwLDAsMSx0LnosMCwwLDAsMSk6dGhpcy5zZXQoMSwwLDAsdCwwLDEsMCxlLDAsMCwxLG4sMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25YKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLGUsLW4sMCwwLG4sZSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWSh0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsMCxuLDAsMCwxLDAsMCwtbiwwLGUsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbloodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLC1uLDAsMCxuLGUsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25BeGlzKHQsZSl7Y29uc3Qgbj1NYXRoLmNvcyhlKSxzPU1hdGguc2luKGUpLHI9MS1uLG89dC54LGE9dC55LGM9dC56LGw9cipvLGg9ciphO3JldHVybiB0aGlzLnNldChsKm8rbixsKmEtcypjLGwqYytzKmEsMCxsKmErcypjLGgqYStuLGgqYy1zKm8sMCxsKmMtcyphLGgqYytzKm8scipjKmMrbiwwLDAsMCwwLDEpLHRoaXN9bWFrZVNjYWxlKHQsZSxuKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCwwLGUsMCwwLDAsMCxuLDAsMCwwLDAsMSksdGhpc31tYWtlU2hlYXIodCxlLG4scyxyLG8pe3JldHVybiB0aGlzLnNldCgxLG4sciwwLHQsMSxvLDAsZSxzLDEsMCwwLDAsMCwxKSx0aGlzfWNvbXBvc2UodCxlLG4pe2NvbnN0IHM9dGhpcy5lbGVtZW50cyxyPWUuX3gsbz1lLl95LGE9ZS5feixjPWUuX3csbD1yK3IsaD1vK28sdT1hK2EsZj1yKmwsZD1yKmgscD1yKnUseT1vKmgsbT1vKnUsZz1hKnUsYj1jKmwseD1jKmgsdz1jKnUsTT1uLngsQT1uLnksUz1uLno7cmV0dXJuIHNbMF09KDEtKHkrZykpKk0sc1sxXT0oZCt3KSpNLHNbMl09KHAteCkqTSxzWzNdPTAsc1s0XT0oZC13KSpBLHNbNV09KDEtKGYrZykpKkEsc1s2XT0obStiKSpBLHNbN109MCxzWzhdPShwK3gpKlMsc1s5XT0obS1iKSpTLHNbMTBdPSgxLShmK3kpKSpTLHNbMTFdPTAsc1sxMl09dC54LHNbMTNdPXQueSxzWzE0XT10Lnosc1sxNV09MSx0aGlzfWRlY29tcG9zZSh0LGUsbil7Y29uc3Qgcz10aGlzLmVsZW1lbnRzO2xldCByPSRuLnNldChzWzBdLHNbMV0sc1syXSkubGVuZ3RoKCk7Y29uc3Qgbz0kbi5zZXQoc1s0XSxzWzVdLHNbNl0pLmxlbmd0aCgpLGE9JG4uc2V0KHNbOF0sc1s5XSxzWzEwXSkubGVuZ3RoKCk7dGhpcy5kZXRlcm1pbmFudCgpPDAmJihyPS1yKSx0Lng9c1sxMl0sdC55PXNbMTNdLHQuej1zWzE0XSxoZS5jb3B5KHRoaXMpO2NvbnN0IGw9MS9yLGg9MS9vLHU9MS9hO3JldHVybiBoZS5lbGVtZW50c1swXSo9bCxoZS5lbGVtZW50c1sxXSo9bCxoZS5lbGVtZW50c1syXSo9bCxoZS5lbGVtZW50c1s0XSo9aCxoZS5lbGVtZW50c1s1XSo9aCxoZS5lbGVtZW50c1s2XSo9aCxoZS5lbGVtZW50c1s4XSo9dSxoZS5lbGVtZW50c1s5XSo9dSxoZS5lbGVtZW50c1sxMF0qPXUsZS5zZXRGcm9tUm90YXRpb25NYXRyaXgoaGUpLG4ueD1yLG4ueT1vLG4uej1hLHRoaXN9bWFrZVBlcnNwZWN0aXZlKHQsZSxuLHMscixvLGE9MmUzLGM9ITEpe2NvbnN0IGw9dGhpcy5lbGVtZW50cyxoPTIqci8oZS10KSx1PTIqci8obi1zKSxmPShlK3QpLyhlLXQpLGQ9KG4rcykvKG4tcyk7bGV0IHAseTtpZihjKXA9ci8oby1yKSx5PW8qci8oby1yKTtlbHNlIGlmKGE9PT0yZTMpcD0tKG8rcikvKG8tcikseT0tMipvKnIvKG8tcik7ZWxzZSBpZihhPT09MjAwMSlwPS1vLyhvLXIpLHk9LW8qci8oby1yKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVEhSRUUuTWF0cml4NC5tYWtlUGVyc3BlY3RpdmUoKTogSW52YWxpZCBjb29yZGluYXRlIHN5c3RlbTogIithKTtyZXR1cm4gbFswXT1oLGxbNF09MCxsWzhdPWYsbFsxMl09MCxsWzFdPTAsbFs1XT11LGxbOV09ZCxsWzEzXT0wLGxbMl09MCxsWzZdPTAsbFsxMF09cCxsWzE0XT15LGxbM109MCxsWzddPTAsbFsxMV09LTEsbFsxNV09MCx0aGlzfW1ha2VPcnRob2dyYXBoaWModCxlLG4scyxyLG8sYT0yZTMsYz0hMSl7Y29uc3QgbD10aGlzLmVsZW1lbnRzLGg9Mi8oZS10KSx1PTIvKG4tcyksZj0tKGUrdCkvKGUtdCksZD0tKG4rcykvKG4tcyk7bGV0IHAseTtpZihjKXA9MS8oby1yKSx5PW8vKG8tcik7ZWxzZSBpZihhPT09MmUzKXA9LTIvKG8tcikseT0tKG8rcikvKG8tcik7ZWxzZSBpZihhPT09MjAwMSlwPS0xLyhvLXIpLHk9LXIvKG8tcik7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk1hdHJpeDQubWFrZU9ydGhvZ3JhcGhpYygpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK2EpO3JldHVybiBsWzBdPWgsbFs0XT0wLGxbOF09MCxsWzEyXT1mLGxbMV09MCxsWzVdPXUsbFs5XT0wLGxbMTNdPWQsbFsyXT0wLGxbNl09MCxsWzEwXT1wLGxbMTRdPXksbFszXT0wLGxbN109MCxsWzExXT0wLGxbMTVdPTEsdGhpc31lcXVhbHModCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztmb3IobGV0IHM9MDtzPDE2O3MrKylpZihlW3NdIT09bltzXSlyZXR1cm4hMTtyZXR1cm4hMH1mcm9tQXJyYXkodCxlPTApe2ZvcihsZXQgbj0wO248MTY7bisrKXRoaXMuZWxlbWVudHNbbl09dFtuK2VdO3JldHVybiB0aGlzfXRvQXJyYXkodD1bXSxlPTApe2NvbnN0IG49dGhpcy5lbGVtZW50cztyZXR1cm4gdFtlXT1uWzBdLHRbZSsxXT1uWzFdLHRbZSsyXT1uWzJdLHRbZSszXT1uWzNdLHRbZSs0XT1uWzRdLHRbZSs1XT1uWzVdLHRbZSs2XT1uWzZdLHRbZSs3XT1uWzddLHRbZSs4XT1uWzhdLHRbZSs5XT1uWzldLHRbZSsxMF09blsxMF0sdFtlKzExXT1uWzExXSx0W2UrMTJdPW5bMTJdLHRbZSsxM109blsxM10sdFtlKzE0XT1uWzE0XSx0W2UrMTVdPW5bMTVdLHR9fWNvbnN0ICRuPW5ldyBULGhlPW5ldyBzdCxmZj1uZXcgVCgwLDAsMCksZGY9bmV3IFQoMSwxLDEpLFFlPW5ldyBULHhzPW5ldyBULCR0PW5ldyBULEljPW5ldyBzdCxrYz1uZXcgTWk7Y2xhc3Mgdml7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAscz12aS5ERUZBVUxUX09SREVSKXt0aGlzLmlzRXVsZXI9ITAsdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fb3JkZXI9c31nZXQgeCgpe3JldHVybiB0aGlzLl94fXNldCB4KHQpe3RoaXMuX3g9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHkoKXtyZXR1cm4gdGhpcy5feX1zZXQgeSh0KXt0aGlzLl95PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB6KCl7cmV0dXJuIHRoaXMuX3p9c2V0IHoodCl7dGhpcy5fej10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgb3JkZXIoKXtyZXR1cm4gdGhpcy5fb3JkZXJ9c2V0IG9yZGVyKHQpe3RoaXMuX29yZGVyPXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldCh0LGUsbixzPXRoaXMuX29yZGVyKXtyZXR1cm4gdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fb3JkZXI9cyx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl9vcmRlcil9Y29weSh0KXtyZXR1cm4gdGhpcy5feD10Ll94LHRoaXMuX3k9dC5feSx0aGlzLl96PXQuX3osdGhpcy5fb3JkZXI9dC5fb3JkZXIsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVJvdGF0aW9uTWF0cml4KHQsZT10aGlzLl9vcmRlcixuPSEwKXtjb25zdCBzPXQuZWxlbWVudHMscj1zWzBdLG89c1s0XSxhPXNbOF0sYz1zWzFdLGw9c1s1XSxoPXNbOV0sdT1zWzJdLGY9c1s2XSxkPXNbMTBdO3N3aXRjaChlKXtjYXNlIlhZWiI6dGhpcy5feT1NYXRoLmFzaW4oWihhLC0xLDEpKSxNYXRoLmFicyhhKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1oLGQpLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxyKSk6KHRoaXMuX3g9TWF0aC5hdGFuMihmLGwpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJZWFoiOnRoaXMuX3g9TWF0aC5hc2luKC1aKGgsLTEsMSkpLE1hdGguYWJzKGgpPC45OTk5OTk5Pyh0aGlzLl95PU1hdGguYXRhbjIoYSxkKSx0aGlzLl96PU1hdGguYXRhbjIoYyxsKSk6KHRoaXMuX3k9TWF0aC5hdGFuMigtdSxyKSx0aGlzLl96PTApO2JyZWFrO2Nhc2UiWlhZIjp0aGlzLl94PU1hdGguYXNpbihaKGYsLTEsMSkpLE1hdGguYWJzKGYpPC45OTk5OTk5Pyh0aGlzLl95PU1hdGguYXRhbjIoLXUsZCksdGhpcy5fej1NYXRoLmF0YW4yKC1vLGwpKToodGhpcy5feT0wLHRoaXMuX3o9TWF0aC5hdGFuMihjLHIpKTticmVhaztjYXNlIlpZWCI6dGhpcy5feT1NYXRoLmFzaW4oLVoodSwtMSwxKSksTWF0aC5hYnModSk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMihmLGQpLHRoaXMuX3o9TWF0aC5hdGFuMihjLHIpKToodGhpcy5feD0wLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxsKSk7YnJlYWs7Y2FzZSJZWlgiOnRoaXMuX3o9TWF0aC5hc2luKFooYywtMSwxKSksTWF0aC5hYnMoYyk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMigtaCxsKSx0aGlzLl95PU1hdGguYXRhbjIoLXUscikpOih0aGlzLl94PTAsdGhpcy5feT1NYXRoLmF0YW4yKGEsZCkpO2JyZWFrO2Nhc2UiWFpZIjp0aGlzLl96PU1hdGguYXNpbigtWihvLC0xLDEpKSxNYXRoLmFicyhvKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKGYsbCksdGhpcy5feT1NYXRoLmF0YW4yKGEscikpOih0aGlzLl94PU1hdGguYXRhbjIoLWgsZCksdGhpcy5feT0wKTticmVhaztkZWZhdWx0Ok10KCJFdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrZSl9cmV0dXJuIHRoaXMuX29yZGVyPWUsbj09PSEwJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUXVhdGVybmlvbih0LGUsbil7cmV0dXJuIEljLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KEljLGUsbil9c2V0RnJvbVZlY3RvcjModCxlPXRoaXMuX29yZGVyKXtyZXR1cm4gdGhpcy5zZXQodC54LHQueSx0LnosZSl9cmVvcmRlcih0KXtyZXR1cm4ga2Muc2V0RnJvbUV1bGVyKHRoaXMpLHRoaXMuc2V0RnJvbVF1YXRlcm5pb24oa2MsdCl9ZXF1YWxzKHQpe3JldHVybiB0Ll94PT09dGhpcy5feCYmdC5feT09PXRoaXMuX3kmJnQuX3o9PT10aGlzLl96JiZ0Ll9vcmRlcj09PXRoaXMuX29yZGVyfWZyb21BcnJheSh0KXtyZXR1cm4gdGhpcy5feD10WzBdLHRoaXMuX3k9dFsxXSx0aGlzLl96PXRbMl0sdFszXSE9PXZvaWQgMCYmKHRoaXMuX29yZGVyPXRbM10pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX29yZGVyLHR9X29uQ2hhbmdlKHQpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPXQsdGhpc31fb25DaGFuZ2VDYWxsYmFjaygpe30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLl94LHlpZWxkIHRoaXMuX3kseWllbGQgdGhpcy5feix5aWVsZCB0aGlzLl9vcmRlcn19dmkuREVGQVVMVF9PUkRFUj0iWFlaIjtjbGFzcyBwZntjb25zdHJ1Y3Rvcigpe3RoaXMubWFzaz0xfXNldCh0KXt0aGlzLm1hc2s9KDE8PHR8MCk+Pj4wfWVuYWJsZSh0KXt0aGlzLm1hc2t8PTE8PHR8MH1lbmFibGVBbGwoKXt0aGlzLm1hc2s9LTF9dG9nZ2xlKHQpe3RoaXMubWFza149MTw8dHwwfWRpc2FibGUodCl7dGhpcy5tYXNrJj1+KDE8PHR8MCl9ZGlzYWJsZUFsbCgpe3RoaXMubWFzaz0wfXRlc3QodCl7cmV0dXJuKHRoaXMubWFzayZ0Lm1hc2spIT09MH1pc0VuYWJsZWQodCl7cmV0dXJuKHRoaXMubWFzayYoMTw8dHwwKSkhPT0wfX1sZXQgeWY9MDtjb25zdCBOYz1uZXcgVCxWbj1uZXcgTWksUGU9bmV3IHN0LHdzPW5ldyBULF9pPW5ldyBULG1mPW5ldyBULGdmPW5ldyBNaSxSYz1uZXcgVCgxLDAsMCksTGM9bmV3IFQoMCwxLDApLE9jPW5ldyBUKDAsMCwxKSxEYz17dHlwZToiYWRkZWQifSx4Zj17dHlwZToicmVtb3ZlZCJ9LFVuPXt0eXBlOiJjaGlsZGFkZGVkIixjaGlsZDpudWxsfSx3bz17dHlwZToiY2hpbGRyZW1vdmVkIixjaGlsZDpudWxsfTtjbGFzcyBDZSBleHRlbmRzIGZze2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzT2JqZWN0M0Q9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6eWYrK30pLHRoaXMudXVpZD1rbigpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9Ik9iamVjdDNEIix0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49W10sdGhpcy51cD1DZS5ERUZBVUxUX1VQLmNsb25lKCk7Y29uc3QgdD1uZXcgVCxlPW5ldyB2aSxuPW5ldyBNaSxzPW5ldyBUKDEsMSwxKTtmdW5jdGlvbiByKCl7bi5zZXRGcm9tRXVsZXIoZSwhMSl9ZnVuY3Rpb24gbygpe2Uuc2V0RnJvbVF1YXRlcm5pb24obix2b2lkIDAsITEpfWUuX29uQ2hhbmdlKHIpLG4uX29uQ2hhbmdlKG8pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3Bvc2l0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTp0fSxyb3RhdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZX0scXVhdGVybmlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bn0sc2NhbGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOnN9LG1vZGVsVmlld01hdHJpeDp7dmFsdWU6bmV3IHN0fSxub3JtYWxNYXRyaXg6e3ZhbHVlOm5ldyBnZX19KSx0aGlzLm1hdHJpeD1uZXcgc3QsdGhpcy5tYXRyaXhXb3JsZD1uZXcgc3QsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPUNlLkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFLHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPUNlLkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSx0aGlzLmxheWVycz1uZXcgcGYsdGhpcy52aXNpYmxlPSEwLHRoaXMuY2FzdFNoYWRvdz0hMSx0aGlzLnJlY2VpdmVTaGFkb3c9ITEsdGhpcy5mcnVzdHVtQ3VsbGVkPSEwLHRoaXMucmVuZGVyT3JkZXI9MCx0aGlzLmFuaW1hdGlvbnM9W10sdGhpcy5jdXN0b21EZXB0aE1hdGVyaWFsPXZvaWQgMCx0aGlzLmN1c3RvbURpc3RhbmNlTWF0ZXJpYWw9dm9pZCAwLHRoaXMudXNlckRhdGE9e319b25CZWZvcmVTaGFkb3coKXt9b25BZnRlclNoYWRvdygpe31vbkJlZm9yZVJlbmRlcigpe31vbkFmdGVyUmVuZGVyKCl7fWFwcGx5TWF0cml4NCh0KXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5tYXRyaXgucHJlbXVsdGlwbHkodCksdGhpcy5tYXRyaXguZGVjb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpfWFwcGx5UXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KHQpLHRoaXN9c2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlKHQsZSl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUodCxlKX1zZXRSb3RhdGlvbkZyb21FdWxlcih0KXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKHQsITApfXNldFJvdGF0aW9uRnJvbU1hdHJpeCh0KXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KHQpfXNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCl7dGhpcy5xdWF0ZXJuaW9uLmNvcHkodCl9cm90YXRlT25BeGlzKHQsZSl7cmV0dXJuIFZuLnNldEZyb21BeGlzQW5nbGUodCxlKSx0aGlzLnF1YXRlcm5pb24ubXVsdGlwbHkoVm4pLHRoaXN9cm90YXRlT25Xb3JsZEF4aXModCxlKXtyZXR1cm4gVm4uc2V0RnJvbUF4aXNBbmdsZSh0LGUpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShWbiksdGhpc31yb3RhdGVYKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhSYyx0KX1yb3RhdGVZKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhMYyx0KX1yb3RhdGVaKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhPYyx0KX10cmFuc2xhdGVPbkF4aXModCxlKXtyZXR1cm4gTmMuY29weSh0KS5hcHBseVF1YXRlcm5pb24odGhpcy5xdWF0ZXJuaW9uKSx0aGlzLnBvc2l0aW9uLmFkZChOYy5tdWx0aXBseVNjYWxhcihlKSksdGhpc310cmFuc2xhdGVYKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhSYyx0KX10cmFuc2xhdGVZKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhMYyx0KX10cmFuc2xhdGVaKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhPYyx0KX1sb2NhbFRvV29ybGQodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpfXdvcmxkVG9Mb2NhbCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5hcHBseU1hdHJpeDQoUGUuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSl9bG9va0F0KHQsZSxuKXt0LmlzVmVjdG9yMz93cy5jb3B5KHQpOndzLnNldCh0LGUsbik7Y29uc3Qgcz10aGlzLnBhcmVudDt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxfaS5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCksdGhpcy5pc0NhbWVyYXx8dGhpcy5pc0xpZ2h0P1BlLmxvb2tBdChfaSx3cyx0aGlzLnVwKTpQZS5sb29rQXQod3MsX2ksdGhpcy51cCksdGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeChQZSkscyYmKFBlLmV4dHJhY3RSb3RhdGlvbihzLm1hdHJpeFdvcmxkKSxWbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoUGUpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShWbi5pbnZlcnQoKSkpfWFkZCh0KXtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2ZvcihsZXQgZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdGhpcy5hZGQoYXJndW1lbnRzW2VdKTtyZXR1cm4gdGhpc31yZXR1cm4gdD09PXRoaXM/KGhuKCJPYmplY3QzRC5hZGQ6IG9iamVjdCBjYW4ndCBiZSBhZGRlZCBhcyBhIGNoaWxkIG9mIGl0c2VsZi4iLHQpLHRoaXMpOih0JiZ0LmlzT2JqZWN0M0Q/KHQucmVtb3ZlRnJvbVBhcmVudCgpLHQucGFyZW50PXRoaXMsdGhpcy5jaGlsZHJlbi5wdXNoKHQpLHQuZGlzcGF0Y2hFdmVudChEYyksVW4uY2hpbGQ9dCx0aGlzLmRpc3BhdGNoRXZlbnQoVW4pLFVuLmNoaWxkPW51bGwpOmhuKCJPYmplY3QzRC5hZGQ6IG9iamVjdCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuT2JqZWN0M0QuIix0KSx0aGlzKX1yZW1vdmUodCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRoaXMucmVtb3ZlKGFyZ3VtZW50c1tuXSk7cmV0dXJuIHRoaXN9Y29uc3QgZT10aGlzLmNoaWxkcmVuLmluZGV4T2YodCk7cmV0dXJuIGUhPT0tMSYmKHQucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbi5zcGxpY2UoZSwxKSx0LmRpc3BhdGNoRXZlbnQoeGYpLHdvLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KHdvKSx3by5jaGlsZD1udWxsKSx0aGlzfXJlbW92ZUZyb21QYXJlbnQoKXtjb25zdCB0PXRoaXMucGFyZW50O3JldHVybiB0IT09bnVsbCYmdC5yZW1vdmUodGhpcyksdGhpc31jbGVhcigpe3JldHVybiB0aGlzLnJlbW92ZSguLi50aGlzLmNoaWxkcmVuKX1hdHRhY2godCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLFBlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksdC5wYXJlbnQhPT1udWxsJiYodC5wYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLFBlLm11bHRpcGx5KHQucGFyZW50Lm1hdHJpeFdvcmxkKSksdC5hcHBseU1hdHJpeDQoUGUpLHQucmVtb3ZlRnJvbVBhcmVudCgpLHQucGFyZW50PXRoaXMsdGhpcy5jaGlsZHJlbi5wdXNoKHQpLHQudXBkYXRlV29ybGRNYXRyaXgoITEsITApLHQuZGlzcGF0Y2hFdmVudChEYyksVW4uY2hpbGQ9dCx0aGlzLmRpc3BhdGNoRXZlbnQoVW4pLFVuLmNoaWxkPW51bGwsdGhpc31nZXRPYmplY3RCeUlkKHQpe3JldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoImlkIix0KX1nZXRPYmplY3RCeU5hbWUodCl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgibmFtZSIsdCl9Z2V0T2JqZWN0QnlQcm9wZXJ0eSh0LGUpe2lmKHRoaXNbdF09PT1lKXJldHVybiB0aGlzO2ZvcihsZXQgbj0wLHM9dGhpcy5jaGlsZHJlbi5sZW5ndGg7bjxzO24rKyl7Y29uc3Qgbz10aGlzLmNoaWxkcmVuW25dLmdldE9iamVjdEJ5UHJvcGVydHkodCxlKTtpZihvIT09dm9pZCAwKXJldHVybiBvfX1nZXRPYmplY3RzQnlQcm9wZXJ0eSh0LGUsbj1bXSl7dGhpc1t0XT09PWUmJm4ucHVzaCh0aGlzKTtjb25zdCBzPXRoaXMuY2hpbGRyZW47Zm9yKGxldCByPTAsbz1zLmxlbmd0aDtyPG87cisrKXNbcl0uZ2V0T2JqZWN0c0J5UHJvcGVydHkodCxlLG4pO3JldHVybiBufWdldFdvcmxkUG9zaXRpb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpfWdldFdvcmxkUXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoX2ksdCxtZiksdH1nZXRXb3JsZFNjYWxlKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShfaSxnZix0KSx0fWdldFdvcmxkRGlyZWN0aW9uKHQpe3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpO2NvbnN0IGU9dGhpcy5tYXRyaXhXb3JsZC5lbGVtZW50cztyZXR1cm4gdC5zZXQoZVs4XSxlWzldLGVbMTBdKS5ub3JtYWxpemUoKX1yYXljYXN0KCl7fXRyYXZlcnNlKHQpe3QodGhpcyk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLHM9ZS5sZW5ndGg7bjxzO24rKyllW25dLnRyYXZlcnNlKHQpfXRyYXZlcnNlVmlzaWJsZSh0KXtpZih0aGlzLnZpc2libGU9PT0hMSlyZXR1cm47dCh0aGlzKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAscz1lLmxlbmd0aDtuPHM7bisrKWVbbl0udHJhdmVyc2VWaXNpYmxlKHQpfXRyYXZlcnNlQW5jZXN0b3JzKHQpe2NvbnN0IGU9dGhpcy5wYXJlbnQ7ZSE9PW51bGwmJih0KGUpLGUudHJhdmVyc2VBbmNlc3RvcnModCkpfXVwZGF0ZU1hdHJpeCgpe3RoaXMubWF0cml4LmNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSksdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfXVwZGF0ZU1hdHJpeFdvcmxkKHQpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSwodGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlfHx0KSYmKHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPT09ITAmJih0aGlzLnBhcmVudD09PW51bGw/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpKSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITEsdD0hMCk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLHM9ZS5sZW5ndGg7bjxzO24rKyllW25dLnVwZGF0ZU1hdHJpeFdvcmxkKHQpfXVwZGF0ZVdvcmxkTWF0cml4KHQsZSl7Y29uc3Qgbj10aGlzLnBhcmVudDtpZih0PT09ITAmJm4hPT1udWxsJiZuLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9PT0hMCYmKHRoaXMucGFyZW50PT09bnVsbD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCkpLGU9PT0hMCl7Y29uc3Qgcz10aGlzLmNoaWxkcmVuO2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrKylzW3JdLnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKX19dG9KU09OKHQpe2NvbnN0IGU9dD09PXZvaWQgMHx8dHlwZW9mIHQ9PSJzdHJpbmciLG49e307ZSYmKHQ9e2dlb21ldHJpZXM6e30sbWF0ZXJpYWxzOnt9LHRleHR1cmVzOnt9LGltYWdlczp7fSxzaGFwZXM6e30sc2tlbGV0b25zOnt9LGFuaW1hdGlvbnM6e30sbm9kZXM6e319LG4ubWV0YWRhdGE9e3ZlcnNpb246NC43LHR5cGU6Ik9iamVjdCIsZ2VuZXJhdG9yOiJPYmplY3QzRC50b0pTT04ifSk7Y29uc3Qgcz17fTtzLnV1aWQ9dGhpcy51dWlkLHMudHlwZT10aGlzLnR5cGUsdGhpcy5uYW1lIT09IiImJihzLm5hbWU9dGhpcy5uYW1lKSx0aGlzLmNhc3RTaGFkb3c9PT0hMCYmKHMuY2FzdFNoYWRvdz0hMCksdGhpcy5yZWNlaXZlU2hhZG93PT09ITAmJihzLnJlY2VpdmVTaGFkb3c9ITApLHRoaXMudmlzaWJsZT09PSExJiYocy52aXNpYmxlPSExKSx0aGlzLmZydXN0dW1DdWxsZWQ9PT0hMSYmKHMuZnJ1c3R1bUN1bGxlZD0hMSksdGhpcy5yZW5kZXJPcmRlciE9PTAmJihzLnJlbmRlck9yZGVyPXRoaXMucmVuZGVyT3JkZXIpLE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYocy51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSxzLmxheWVycz10aGlzLmxheWVycy5tYXNrLHMubWF0cml4PXRoaXMubWF0cml4LnRvQXJyYXkoKSxzLnVwPXRoaXMudXAudG9BcnJheSgpLHRoaXMubWF0cml4QXV0b1VwZGF0ZT09PSExJiYocy5tYXRyaXhBdXRvVXBkYXRlPSExKSx0aGlzLmlzSW5zdGFuY2VkTWVzaCYmKHMudHlwZT0iSW5zdGFuY2VkTWVzaCIscy5jb3VudD10aGlzLmNvdW50LHMuaW5zdGFuY2VNYXRyaXg9dGhpcy5pbnN0YW5jZU1hdHJpeC50b0pTT04oKSx0aGlzLmluc3RhbmNlQ29sb3IhPT1udWxsJiYocy5pbnN0YW5jZUNvbG9yPXRoaXMuaW5zdGFuY2VDb2xvci50b0pTT04oKSkpLHRoaXMuaXNCYXRjaGVkTWVzaCYmKHMudHlwZT0iQmF0Y2hlZE1lc2giLHMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZD10aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQscy5zb3J0T2JqZWN0cz10aGlzLnNvcnRPYmplY3RzLHMuZHJhd1Jhbmdlcz10aGlzLl9kcmF3UmFuZ2VzLHMucmVzZXJ2ZWRSYW5nZXM9dGhpcy5fcmVzZXJ2ZWRSYW5nZXMscy5nZW9tZXRyeUluZm89dGhpcy5fZ2VvbWV0cnlJbmZvLm1hcChhPT5IZShJdCh7fSxhKSx7Ym91bmRpbmdCb3g6YS5ib3VuZGluZ0JveD9hLmJvdW5kaW5nQm94LnRvSlNPTigpOnZvaWQgMCxib3VuZGluZ1NwaGVyZTphLmJvdW5kaW5nU3BoZXJlP2EuYm91bmRpbmdTcGhlcmUudG9KU09OKCk6dm9pZCAwfSkpLHMuaW5zdGFuY2VJbmZvPXRoaXMuX2luc3RhbmNlSW5mby5tYXAoYT0+SXQoe30sYSkpLHMuYXZhaWxhYmxlSW5zdGFuY2VJZHM9dGhpcy5fYXZhaWxhYmxlSW5zdGFuY2VJZHMuc2xpY2UoKSxzLmF2YWlsYWJsZUdlb21ldHJ5SWRzPXRoaXMuX2F2YWlsYWJsZUdlb21ldHJ5SWRzLnNsaWNlKCkscy5uZXh0SW5kZXhTdGFydD10aGlzLl9uZXh0SW5kZXhTdGFydCxzLm5leHRWZXJ0ZXhTdGFydD10aGlzLl9uZXh0VmVydGV4U3RhcnQscy5nZW9tZXRyeUNvdW50PXRoaXMuX2dlb21ldHJ5Q291bnQscy5tYXhJbnN0YW5jZUNvdW50PXRoaXMuX21heEluc3RhbmNlQ291bnQscy5tYXhWZXJ0ZXhDb3VudD10aGlzLl9tYXhWZXJ0ZXhDb3VudCxzLm1heEluZGV4Q291bnQ9dGhpcy5fbWF4SW5kZXhDb3VudCxzLmdlb21ldHJ5SW5pdGlhbGl6ZWQ9dGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZCxzLm1hdHJpY2VzVGV4dHVyZT10aGlzLl9tYXRyaWNlc1RleHR1cmUudG9KU09OKHQpLHMuaW5kaXJlY3RUZXh0dXJlPXRoaXMuX2luZGlyZWN0VGV4dHVyZS50b0pTT04odCksdGhpcy5fY29sb3JzVGV4dHVyZSE9PW51bGwmJihzLmNvbG9yc1RleHR1cmU9dGhpcy5fY29sb3JzVGV4dHVyZS50b0pTT04odCkpLHRoaXMuYm91bmRpbmdTcGhlcmUhPT1udWxsJiYocy5ib3VuZGluZ1NwaGVyZT10aGlzLmJvdW5kaW5nU3BoZXJlLnRvSlNPTigpKSx0aGlzLmJvdW5kaW5nQm94IT09bnVsbCYmKHMuYm91bmRpbmdCb3g9dGhpcy5ib3VuZGluZ0JveC50b0pTT04oKSkpO2Z1bmN0aW9uIHIoYSxjKXtyZXR1cm4gYVtjLnV1aWRdPT09dm9pZCAwJiYoYVtjLnV1aWRdPWMudG9KU09OKHQpKSxjLnV1aWR9aWYodGhpcy5pc1NjZW5lKXRoaXMuYmFja2dyb3VuZCYmKHRoaXMuYmFja2dyb3VuZC5pc0NvbG9yP3MuYmFja2dyb3VuZD10aGlzLmJhY2tncm91bmQudG9KU09OKCk6dGhpcy5iYWNrZ3JvdW5kLmlzVGV4dHVyZSYmKHMuYmFja2dyb3VuZD10aGlzLmJhY2tncm91bmQudG9KU09OKHQpLnV1aWQpKSx0aGlzLmVudmlyb25tZW50JiZ0aGlzLmVudmlyb25tZW50LmlzVGV4dHVyZSYmdGhpcy5lbnZpcm9ubWVudC5pc1JlbmRlclRhcmdldFRleHR1cmUhPT0hMCYmKHMuZW52aXJvbm1lbnQ9dGhpcy5lbnZpcm9ubWVudC50b0pTT04odCkudXVpZCk7ZWxzZSBpZih0aGlzLmlzTWVzaHx8dGhpcy5pc0xpbmV8fHRoaXMuaXNQb2ludHMpe3MuZ2VvbWV0cnk9cih0Lmdlb21ldHJpZXMsdGhpcy5nZW9tZXRyeSk7Y29uc3QgYT10aGlzLmdlb21ldHJ5LnBhcmFtZXRlcnM7aWYoYSE9PXZvaWQgMCYmYS5zaGFwZXMhPT12b2lkIDApe2NvbnN0IGM9YS5zaGFwZXM7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IobGV0IGw9MCxoPWMubGVuZ3RoO2w8aDtsKyspe2NvbnN0IHU9Y1tsXTtyKHQuc2hhcGVzLHUpfWVsc2Ugcih0LnNoYXBlcyxjKX19aWYodGhpcy5pc1NraW5uZWRNZXNoJiYocy5iaW5kTW9kZT10aGlzLmJpbmRNb2RlLHMuYmluZE1hdHJpeD10aGlzLmJpbmRNYXRyaXgudG9BcnJheSgpLHRoaXMuc2tlbGV0b24hPT12b2lkIDAmJihyKHQuc2tlbGV0b25zLHRoaXMuc2tlbGV0b24pLHMuc2tlbGV0b249dGhpcy5za2VsZXRvbi51dWlkKSksdGhpcy5tYXRlcmlhbCE9PXZvaWQgMClpZihBcnJheS5pc0FycmF5KHRoaXMubWF0ZXJpYWwpKXtjb25zdCBhPVtdO2ZvcihsZXQgYz0wLGw9dGhpcy5tYXRlcmlhbC5sZW5ndGg7YzxsO2MrKylhLnB1c2gocih0Lm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsW2NdKSk7cy5tYXRlcmlhbD1hfWVsc2Ugcy5tYXRlcmlhbD1yKHQubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWwpO2lmKHRoaXMuY2hpbGRyZW4ubGVuZ3RoPjApe3MuY2hpbGRyZW49W107Zm9yKGxldCBhPTA7YTx0aGlzLmNoaWxkcmVuLmxlbmd0aDthKyspcy5jaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5bYV0udG9KU09OKHQpLm9iamVjdCl9aWYodGhpcy5hbmltYXRpb25zLmxlbmd0aD4wKXtzLmFuaW1hdGlvbnM9W107Zm9yKGxldCBhPTA7YTx0aGlzLmFuaW1hdGlvbnMubGVuZ3RoO2ErKyl7Y29uc3QgYz10aGlzLmFuaW1hdGlvbnNbYV07cy5hbmltYXRpb25zLnB1c2gocih0LmFuaW1hdGlvbnMsYykpfX1pZihlKXtjb25zdCBhPW8odC5nZW9tZXRyaWVzKSxjPW8odC5tYXRlcmlhbHMpLGw9byh0LnRleHR1cmVzKSxoPW8odC5pbWFnZXMpLHU9byh0LnNoYXBlcyksZj1vKHQuc2tlbGV0b25zKSxkPW8odC5hbmltYXRpb25zKSxwPW8odC5ub2Rlcyk7YS5sZW5ndGg+MCYmKG4uZ2VvbWV0cmllcz1hKSxjLmxlbmd0aD4wJiYobi5tYXRlcmlhbHM9YyksbC5sZW5ndGg+MCYmKG4udGV4dHVyZXM9bCksaC5sZW5ndGg+MCYmKG4uaW1hZ2VzPWgpLHUubGVuZ3RoPjAmJihuLnNoYXBlcz11KSxmLmxlbmd0aD4wJiYobi5za2VsZXRvbnM9ZiksZC5sZW5ndGg+MCYmKG4uYW5pbWF0aW9ucz1kKSxwLmxlbmd0aD4wJiYobi5ub2Rlcz1wKX1yZXR1cm4gbi5vYmplY3Q9cyxuO2Z1bmN0aW9uIG8oYSl7Y29uc3QgYz1bXTtmb3IoY29uc3QgbCBpbiBhKXtjb25zdCBoPWFbbF07ZGVsZXRlIGgubWV0YWRhdGEsYy5wdXNoKGgpfXJldHVybiBjfX1jbG9uZSh0KXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMsdCl9Y29weSh0LGU9ITApe2lmKHRoaXMubmFtZT10Lm5hbWUsdGhpcy51cC5jb3B5KHQudXApLHRoaXMucG9zaXRpb24uY29weSh0LnBvc2l0aW9uKSx0aGlzLnJvdGF0aW9uLm9yZGVyPXQucm90YXRpb24ub3JkZXIsdGhpcy5xdWF0ZXJuaW9uLmNvcHkodC5xdWF0ZXJuaW9uKSx0aGlzLnNjYWxlLmNvcHkodC5zY2FsZSksdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5tYXRyaXhXb3JsZC5jb3B5KHQubWF0cml4V29ybGQpLHRoaXMubWF0cml4QXV0b1VwZGF0ZT10Lm1hdHJpeEF1dG9VcGRhdGUsdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9dC5tYXRyaXhXb3JsZEF1dG9VcGRhdGUsdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPXQubWF0cml4V29ybGROZWVkc1VwZGF0ZSx0aGlzLmxheWVycy5tYXNrPXQubGF5ZXJzLm1hc2ssdGhpcy52aXNpYmxlPXQudmlzaWJsZSx0aGlzLmNhc3RTaGFkb3c9dC5jYXN0U2hhZG93LHRoaXMucmVjZWl2ZVNoYWRvdz10LnJlY2VpdmVTaGFkb3csdGhpcy5mcnVzdHVtQ3VsbGVkPXQuZnJ1c3R1bUN1bGxlZCx0aGlzLnJlbmRlck9yZGVyPXQucmVuZGVyT3JkZXIsdGhpcy5hbmltYXRpb25zPXQuYW5pbWF0aW9ucy5zbGljZSgpLHRoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnVzZXJEYXRhKSksZT09PSEwKWZvcihsZXQgbj0wO248dC5jaGlsZHJlbi5sZW5ndGg7bisrKXtjb25zdCBzPXQuY2hpbGRyZW5bbl07dGhpcy5hZGQocy5jbG9uZSgpKX1yZXR1cm4gdGhpc319Q2UuREVGQVVMVF9VUD1uZXcgVCgwLDEsMCksQ2UuREVGQVVMVF9NQVRSSVhfQVVUT19VUERBVEU9ITAsQ2UuREVGQVVMVF9NQVRSSVhfV09STERfQVVUT19VUERBVEU9ITA7Y29uc3QgdWU9bmV3IFQsRWU9bmV3IFQsYm89bmV3IFQsQmU9bmV3IFQscW49bmV3IFQsWG49bmV3IFQsJGM9bmV3IFQsTW89bmV3IFQsQW89bmV3IFQsU289bmV3IFQsdm89bmV3IFl0LF9vPW5ldyBZdCx6bz1uZXcgWXQ7Y2xhc3MgdHR7Y29uc3RydWN0b3IodD1uZXcgVCxlPW5ldyBULG49bmV3IFQpe3RoaXMuYT10LHRoaXMuYj1lLHRoaXMuYz1ufXN0YXRpYyBnZXROb3JtYWwodCxlLG4scyl7cy5zdWJWZWN0b3JzKG4sZSksdWUuc3ViVmVjdG9ycyh0LGUpLHMuY3Jvc3ModWUpO2NvbnN0IHI9cy5sZW5ndGhTcSgpO3JldHVybiByPjA/cy5tdWx0aXBseVNjYWxhcigxL01hdGguc3FydChyKSk6cy5zZXQoMCwwLDApfXN0YXRpYyBnZXRCYXJ5Y29vcmQodCxlLG4scyxyKXt1ZS5zdWJWZWN0b3JzKHMsZSksRWUuc3ViVmVjdG9ycyhuLGUpLGJvLnN1YlZlY3RvcnModCxlKTtjb25zdCBvPXVlLmRvdCh1ZSksYT11ZS5kb3QoRWUpLGM9dWUuZG90KGJvKSxsPUVlLmRvdChFZSksaD1FZS5kb3QoYm8pLHU9bypsLWEqYTtpZih1PT09MClyZXR1cm4gci5zZXQoMCwwLDApLG51bGw7Y29uc3QgZj0xL3UsZD0obCpjLWEqaCkqZixwPShvKmgtYSpjKSpmO3JldHVybiByLnNldCgxLWQtcCxwLGQpfXN0YXRpYyBjb250YWluc1BvaW50KHQsZSxuLHMpe3JldHVybiB0aGlzLmdldEJhcnljb29yZCh0LGUsbixzLEJlKT09PW51bGw/ITE6QmUueD49MCYmQmUueT49MCYmQmUueCtCZS55PD0xfXN0YXRpYyBnZXRJbnRlcnBvbGF0aW9uKHQsZSxuLHMscixvLGEsYyl7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKHQsZSxuLHMsQmUpPT09bnVsbD8oYy54PTAsYy55PTAsInoiaW4gYyYmKGMuej0wKSwidyJpbiBjJiYoYy53PTApLG51bGwpOihjLnNldFNjYWxhcigwKSxjLmFkZFNjYWxlZFZlY3RvcihyLEJlLngpLGMuYWRkU2NhbGVkVmVjdG9yKG8sQmUueSksYy5hZGRTY2FsZWRWZWN0b3IoYSxCZS56KSxjKX1zdGF0aWMgZ2V0SW50ZXJwb2xhdGVkQXR0cmlidXRlKHQsZSxuLHMscixvKXtyZXR1cm4gdm8uc2V0U2NhbGFyKDApLF9vLnNldFNjYWxhcigwKSx6by5zZXRTY2FsYXIoMCksdm8uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpLF9vLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxuKSx6by5mcm9tQnVmZmVyQXR0cmlidXRlKHQscyksby5zZXRTY2FsYXIoMCksby5hZGRTY2FsZWRWZWN0b3Iodm8sci54KSxvLmFkZFNjYWxlZFZlY3RvcihfbyxyLnkpLG8uYWRkU2NhbGVkVmVjdG9yKHpvLHIueiksb31zdGF0aWMgaXNGcm9udEZhY2luZyh0LGUsbixzKXtyZXR1cm4gdWUuc3ViVmVjdG9ycyhuLGUpLEVlLnN1YlZlY3RvcnModCxlKSx1ZS5jcm9zcyhFZSkuZG90KHMpPDB9c2V0KHQsZSxuKXtyZXR1cm4gdGhpcy5hLmNvcHkodCksdGhpcy5iLmNvcHkoZSksdGhpcy5jLmNvcHkobiksdGhpc31zZXRGcm9tUG9pbnRzQW5kSW5kaWNlcyh0LGUsbixzKXtyZXR1cm4gdGhpcy5hLmNvcHkodFtlXSksdGhpcy5iLmNvcHkodFtuXSksdGhpcy5jLmNvcHkodFtzXSksdGhpc31zZXRGcm9tQXR0cmlidXRlQW5kSW5kaWNlcyh0LGUsbixzKXtyZXR1cm4gdGhpcy5hLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSx0aGlzLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LG4pLHRoaXMuYy5mcm9tQnVmZmVyQXR0cmlidXRlKHQscyksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5hLmNvcHkodC5hKSx0aGlzLmIuY29weSh0LmIpLHRoaXMuYy5jb3B5KHQuYyksdGhpc31nZXRBcmVhKCl7cmV0dXJuIHVlLnN1YlZlY3RvcnModGhpcy5jLHRoaXMuYiksRWUuc3ViVmVjdG9ycyh0aGlzLmEsdGhpcy5iKSx1ZS5jcm9zcyhFZSkubGVuZ3RoKCkqLjV9Z2V0TWlkcG9pbnQodCl7cmV0dXJuIHQuYWRkVmVjdG9ycyh0aGlzLmEsdGhpcy5iKS5hZGQodGhpcy5jKS5tdWx0aXBseVNjYWxhcigxLzMpfWdldE5vcm1hbCh0KXtyZXR1cm4gdHQuZ2V0Tm9ybWFsKHRoaXMuYSx0aGlzLmIsdGhpcy5jLHQpfWdldFBsYW5lKHQpe3JldHVybiB0LnNldEZyb21Db3BsYW5hclBvaW50cyh0aGlzLmEsdGhpcy5iLHRoaXMuYyl9Z2V0QmFyeWNvb3JkKHQsZSl7cmV0dXJuIHR0LmdldEJhcnljb29yZCh0LHRoaXMuYSx0aGlzLmIsdGhpcy5jLGUpfWdldEludGVycG9sYXRpb24odCxlLG4scyxyKXtyZXR1cm4gdHQuZ2V0SW50ZXJwb2xhdGlvbih0LHRoaXMuYSx0aGlzLmIsdGhpcy5jLGUsbixzLHIpfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuIHR0LmNvbnRhaW5zUG9pbnQodCx0aGlzLmEsdGhpcy5iLHRoaXMuYyl9aXNGcm9udEZhY2luZyh0KXtyZXR1cm4gdHQuaXNGcm9udEZhY2luZyh0aGlzLmEsdGhpcy5iLHRoaXMuYyx0KX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNUcmlhbmdsZSh0aGlzKX1jbG9zZXN0UG9pbnRUb1BvaW50KHQsZSl7Y29uc3Qgbj10aGlzLmEscz10aGlzLmIscj10aGlzLmM7bGV0IG8sYTtxbi5zdWJWZWN0b3JzKHMsbiksWG4uc3ViVmVjdG9ycyhyLG4pLE1vLnN1YlZlY3RvcnModCxuKTtjb25zdCBjPXFuLmRvdChNbyksbD1Ybi5kb3QoTW8pO2lmKGM8PTAmJmw8PTApcmV0dXJuIGUuY29weShuKTtBby5zdWJWZWN0b3JzKHQscyk7Y29uc3QgaD1xbi5kb3QoQW8pLHU9WG4uZG90KEFvKTtpZihoPj0wJiZ1PD1oKXJldHVybiBlLmNvcHkocyk7Y29uc3QgZj1jKnUtaCpsO2lmKGY8PTAmJmM+PTAmJmg8PTApcmV0dXJuIG89Yy8oYy1oKSxlLmNvcHkobikuYWRkU2NhbGVkVmVjdG9yKHFuLG8pO1NvLnN1YlZlY3RvcnModCxyKTtjb25zdCBkPXFuLmRvdChTbykscD1Ybi5kb3QoU28pO2lmKHA+PTAmJmQ8PXApcmV0dXJuIGUuY29weShyKTtjb25zdCB5PWQqbC1jKnA7aWYoeTw9MCYmbD49MCYmcDw9MClyZXR1cm4gYT1sLyhsLXApLGUuY29weShuKS5hZGRTY2FsZWRWZWN0b3IoWG4sYSk7Y29uc3QgbT1oKnAtZCp1O2lmKG08PTAmJnUtaD49MCYmZC1wPj0wKXJldHVybiAkYy5zdWJWZWN0b3JzKHIscyksYT0odS1oKS8odS1oKyhkLXApKSxlLmNvcHkocykuYWRkU2NhbGVkVmVjdG9yKCRjLGEpO2NvbnN0IGc9MS8obSt5K2YpO3JldHVybiBvPXkqZyxhPWYqZyxlLmNvcHkobikuYWRkU2NhbGVkVmVjdG9yKHFuLG8pLmFkZFNjYWxlZFZlY3RvcihYbixhKX1lcXVhbHModCl7cmV0dXJuIHQuYS5lcXVhbHModGhpcy5hKSYmdC5iLmVxdWFscyh0aGlzLmIpJiZ0LmMuZXF1YWxzKHRoaXMuYyl9fWNvbnN0IFZjPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9LEtlPXtoOjAsczowLGw6MH0sYnM9e2g6MCxzOjAsbDowfTtmdW5jdGlvbiBUbyhpLHQsZSl7cmV0dXJuIGU8MCYmKGUrPTEpLGU+MSYmKGUtPTEpLGU8MS82P2krKHQtaSkqNiplOmU8MS8yP3Q6ZTwyLzM/aSsodC1pKSo2KigyLzMtZSk6aX1sZXQgTXM9Y2xhc3N7Y29uc3RydWN0b3IodCxlLG4pe3JldHVybiB0aGlzLmlzQ29sb3I9ITAsdGhpcy5yPTEsdGhpcy5nPTEsdGhpcy5iPTEsdGhpcy5zZXQodCxlLG4pfXNldCh0LGUsbil7aWYoZT09PXZvaWQgMCYmbj09PXZvaWQgMCl7Y29uc3Qgcz10O3MmJnMuaXNDb2xvcj90aGlzLmNvcHkocyk6dHlwZW9mIHM9PSJudW1iZXIiP3RoaXMuc2V0SGV4KHMpOnR5cGVvZiBzPT0ic3RyaW5nIiYmdGhpcy5zZXRTdHlsZShzKX1lbHNlIHRoaXMuc2V0UkdCKHQsZSxuKTtyZXR1cm4gdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMucj10LHRoaXMuZz10LHRoaXMuYj10LHRoaXN9c2V0SGV4KHQsZT1hZSl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSx0aGlzLnI9KHQ+PjE2JjI1NSkvMjU1LHRoaXMuZz0odD4+OCYyNTUpLzI1NSx0aGlzLmI9KHQmMjU1KS8yNTUsY2UuY29sb3JTcGFjZVRvV29ya2luZyh0aGlzLGUpLHRoaXN9c2V0UkdCKHQsZSxuLHM9Y2Uud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiB0aGlzLnI9dCx0aGlzLmc9ZSx0aGlzLmI9bixjZS5jb2xvclNwYWNlVG9Xb3JraW5nKHRoaXMscyksdGhpc31zZXRIU0wodCxlLG4scz1jZS53b3JraW5nQ29sb3JTcGFjZSl7aWYodD1yZih0LDEpLGU9WihlLDAsMSksbj1aKG4sMCwxKSxlPT09MCl0aGlzLnI9dGhpcy5nPXRoaXMuYj1uO2Vsc2V7Y29uc3Qgcj1uPD0uNT9uKigxK2UpOm4rZS1uKmUsbz0yKm4tcjt0aGlzLnI9VG8obyxyLHQrMS8zKSx0aGlzLmc9VG8obyxyLHQpLHRoaXMuYj1UbyhvLHIsdC0xLzMpfXJldHVybiBjZS5jb2xvclNwYWNlVG9Xb3JraW5nKHRoaXMscyksdGhpc31zZXRTdHlsZSh0LGU9YWUpe2Z1bmN0aW9uIG4ocil7ciE9PXZvaWQgMCYmcGFyc2VGbG9hdChyKTwxJiZNdCgiQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAiK3QrIiB3aWxsIGJlIGlnbm9yZWQuIil9bGV0IHM7aWYocz0vXihcdyspXCgoW15cKV0qKVwpLy5leGVjKHQpKXtsZXQgcjtjb25zdCBvPXNbMV0sYT1zWzJdO3N3aXRjaChvKXtjYXNlInJnYiI6Y2FzZSJyZ2JhIjppZihyPS9eXHMqKFxkKylccyosXHMqKFxkKylccyosXHMqKFxkKylccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIG4ocls0XSksdGhpcy5zZXRSR0IoTWF0aC5taW4oMjU1LHBhcnNlSW50KHJbMV0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KHJbMl0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KHJbM10sMTApKS8yNTUsZSk7aWYocj0vXlxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKGEpKXJldHVybiBuKHJbNF0pLHRoaXMuc2V0UkdCKE1hdGgubWluKDEwMCxwYXJzZUludChyWzFdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludChyWzJdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludChyWzNdLDEwKSkvMTAwLGUpO2JyZWFrO2Nhc2UiaHNsIjpjYXNlImhzbGEiOmlmKHI9L15ccyooXGQqXC4/XGQrKVxzKixccyooXGQqXC4/XGQrKVwlXHMqLFxzKihcZCpcLj9cZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIG4ocls0XSksdGhpcy5zZXRIU0wocGFyc2VGbG9hdChyWzFdKS8zNjAscGFyc2VGbG9hdChyWzJdKS8xMDAscGFyc2VGbG9hdChyWzNdKS8xMDAsZSk7YnJlYWs7ZGVmYXVsdDpNdCgiQ29sb3I6IFVua25vd24gY29sb3IgbW9kZWwgIit0KX19ZWxzZSBpZihzPS9eXCMoW0EtRmEtZlxkXSspJC8uZXhlYyh0KSl7Y29uc3Qgcj1zWzFdLG89ci5sZW5ndGg7aWYobz09PTMpcmV0dXJuIHRoaXMuc2V0UkdCKHBhcnNlSW50KHIuY2hhckF0KDApLDE2KS8xNSxwYXJzZUludChyLmNoYXJBdCgxKSwxNikvMTUscGFyc2VJbnQoci5jaGFyQXQoMiksMTYpLzE1LGUpO2lmKG89PT02KXJldHVybiB0aGlzLnNldEhleChwYXJzZUludChyLDE2KSxlKTtNdCgiQ29sb3I6IEludmFsaWQgaGV4IGNvbG9yICIrdCl9ZWxzZSBpZih0JiZ0Lmxlbmd0aD4wKXJldHVybiB0aGlzLnNldENvbG9yTmFtZSh0LGUpO3JldHVybiB0aGlzfXNldENvbG9yTmFtZSh0LGU9YWUpe2NvbnN0IG49VmNbdC50b0xvd2VyQ2FzZSgpXTtyZXR1cm4gbiE9PXZvaWQgMD90aGlzLnNldEhleChuLGUpOk10KCJDb2xvcjogVW5rbm93biBjb2xvciAiK3QpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5yLHRoaXMuZyx0aGlzLmIpfWNvcHkodCl7cmV0dXJuIHRoaXMucj10LnIsdGhpcy5nPXQuZyx0aGlzLmI9dC5iLHRoaXN9Y29weVNSR0JUb0xpbmVhcih0KXtyZXR1cm4gdGhpcy5yPV9lKHQuciksdGhpcy5nPV9lKHQuZyksdGhpcy5iPV9lKHQuYiksdGhpc31jb3B5TGluZWFyVG9TUkdCKHQpe3JldHVybiB0aGlzLnI9Tm4odC5yKSx0aGlzLmc9Tm4odC5nKSx0aGlzLmI9Tm4odC5iKSx0aGlzfWNvbnZlcnRTUkdCVG9MaW5lYXIoKXtyZXR1cm4gdGhpcy5jb3B5U1JHQlRvTGluZWFyKHRoaXMpLHRoaXN9Y29udmVydExpbmVhclRvU1JHQigpe3JldHVybiB0aGlzLmNvcHlMaW5lYXJUb1NSR0IodGhpcyksdGhpc31nZXRIZXgodD1hZSl7cmV0dXJuIGNlLndvcmtpbmdUb0NvbG9yU3BhY2UodnQuY29weSh0aGlzKSx0KSxNYXRoLnJvdW5kKFoodnQucioyNTUsMCwyNTUpKSo2NTUzNitNYXRoLnJvdW5kKFoodnQuZyoyNTUsMCwyNTUpKSoyNTYrTWF0aC5yb3VuZChaKHZ0LmIqMjU1LDAsMjU1KSl9Z2V0SGV4U3RyaW5nKHQ9YWUpe3JldHVybigiMDAwMDAwIit0aGlzLmdldEhleCh0KS50b1N0cmluZygxNikpLnNsaWNlKC02KX1nZXRIU0wodCxlPWNlLndvcmtpbmdDb2xvclNwYWNlKXtjZS53b3JraW5nVG9Db2xvclNwYWNlKHZ0LmNvcHkodGhpcyksZSk7Y29uc3Qgbj12dC5yLHM9dnQuZyxyPXZ0LmIsbz1NYXRoLm1heChuLHMsciksYT1NYXRoLm1pbihuLHMscik7bGV0IGMsbDtjb25zdCBoPShhK28pLzI7aWYoYT09PW8pYz0wLGw9MDtlbHNle2NvbnN0IHU9by1hO3N3aXRjaChsPWg8PS41P3UvKG8rYSk6dS8oMi1vLWEpLG8pe2Nhc2UgbjpjPShzLXIpL3UrKHM8cj82OjApO2JyZWFrO2Nhc2UgczpjPShyLW4pL3UrMjticmVhaztjYXNlIHI6Yz0obi1zKS91KzQ7YnJlYWt9Yy89Nn1yZXR1cm4gdC5oPWMsdC5zPWwsdC5sPWgsdH1nZXRSR0IodCxlPWNlLndvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gY2Uud29ya2luZ1RvQ29sb3JTcGFjZSh2dC5jb3B5KHRoaXMpLGUpLHQucj12dC5yLHQuZz12dC5nLHQuYj12dC5iLHR9Z2V0U3R5bGUodD1hZSl7Y2Uud29ya2luZ1RvQ29sb3JTcGFjZSh2dC5jb3B5KHRoaXMpLHQpO2NvbnN0IGU9dnQucixuPXZ0Lmcscz12dC5iO3JldHVybiB0IT09YWU/YGNvbG9yKCR7dH0gJHtlLnRvRml4ZWQoMyl9ICR7bi50b0ZpeGVkKDMpfSAke3MudG9GaXhlZCgzKX0pYDpgcmdiKCR7TWF0aC5yb3VuZChlKjI1NSl9LCR7TWF0aC5yb3VuZChuKjI1NSl9LCR7TWF0aC5yb3VuZChzKjI1NSl9KWB9b2Zmc2V0SFNMKHQsZSxuKXtyZXR1cm4gdGhpcy5nZXRIU0woS2UpLHRoaXMuc2V0SFNMKEtlLmgrdCxLZS5zK2UsS2UubCtuKX1hZGQodCl7cmV0dXJuIHRoaXMucis9dC5yLHRoaXMuZys9dC5nLHRoaXMuYis9dC5iLHRoaXN9YWRkQ29sb3JzKHQsZSl7cmV0dXJuIHRoaXMucj10LnIrZS5yLHRoaXMuZz10LmcrZS5nLHRoaXMuYj10LmIrZS5iLHRoaXN9YWRkU2NhbGFyKHQpe3JldHVybiB0aGlzLnIrPXQsdGhpcy5nKz10LHRoaXMuYis9dCx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy5yPU1hdGgubWF4KDAsdGhpcy5yLXQuciksdGhpcy5nPU1hdGgubWF4KDAsdGhpcy5nLXQuZyksdGhpcy5iPU1hdGgubWF4KDAsdGhpcy5iLXQuYiksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5yKj10LnIsdGhpcy5nKj10LmcsdGhpcy5iKj10LmIsdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy5yKj10LHRoaXMuZyo9dCx0aGlzLmIqPXQsdGhpc31sZXJwKHQsZSl7cmV0dXJuIHRoaXMucis9KHQuci10aGlzLnIpKmUsdGhpcy5nKz0odC5nLXRoaXMuZykqZSx0aGlzLmIrPSh0LmItdGhpcy5iKSplLHRoaXN9bGVycENvbG9ycyh0LGUsbil7cmV0dXJuIHRoaXMucj10LnIrKGUuci10LnIpKm4sdGhpcy5nPXQuZysoZS5nLXQuZykqbix0aGlzLmI9dC5iKyhlLmItdC5iKSpuLHRoaXN9bGVycEhTTCh0LGUpe3RoaXMuZ2V0SFNMKEtlKSx0LmdldEhTTChicyk7Y29uc3Qgbj1vbyhLZS5oLGJzLmgsZSkscz1vbyhLZS5zLGJzLnMsZSkscj1vbyhLZS5sLGJzLmwsZSk7cmV0dXJuIHRoaXMuc2V0SFNMKG4scyxyKSx0aGlzfXNldEZyb21WZWN0b3IzKHQpe3JldHVybiB0aGlzLnI9dC54LHRoaXMuZz10LnksdGhpcy5iPXQueix0aGlzfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMucixuPXRoaXMuZyxzPXRoaXMuYixyPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMucj1yWzBdKmUrclszXSpuK3JbNl0qcyx0aGlzLmc9clsxXSplK3JbNF0qbityWzddKnMsdGhpcy5iPXJbMl0qZStyWzVdKm4rcls4XSpzLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0LnI9PT10aGlzLnImJnQuZz09PXRoaXMuZyYmdC5iPT09dGhpcy5ifWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMucj10W2VdLHRoaXMuZz10W2UrMV0sdGhpcy5iPXRbZSsyXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMucix0W2UrMV09dGhpcy5nLHRbZSsyXT10aGlzLmIsdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMucj10LmdldFgoZSksdGhpcy5nPXQuZ2V0WShlKSx0aGlzLmI9dC5nZXRaKGUpLHRoaXN9dG9KU09OKCl7cmV0dXJuIHRoaXMuZ2V0SGV4KCl9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5yLHlpZWxkIHRoaXMuZyx5aWVsZCB0aGlzLmJ9fTtjb25zdCB2dD1uZXcgTXM7TXMuTkFNRVM9VmM7bGV0IHdmPTA7Y2xhc3MgYmYgZXh0ZW5kcyBmc3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc01hdGVyaWFsPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOndmKyt9KSx0aGlzLnV1aWQ9a24oKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJNYXRlcmlhbCIsdGhpcy5ibGVuZGluZz0xLHRoaXMuc2lkZT0wLHRoaXMudmVydGV4Q29sb3JzPSExLHRoaXMub3BhY2l0eT0xLHRoaXMudHJhbnNwYXJlbnQ9ITEsdGhpcy5hbHBoYUhhc2g9ITEsdGhpcy5ibGVuZFNyYz0yMDQsdGhpcy5ibGVuZERzdD0yMDUsdGhpcy5ibGVuZEVxdWF0aW9uPTEwMCx0aGlzLmJsZW5kU3JjQWxwaGE9bnVsbCx0aGlzLmJsZW5kRHN0QWxwaGE9bnVsbCx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT1udWxsLHRoaXMuYmxlbmRDb2xvcj1uZXcgTXMoMCwwLDApLHRoaXMuYmxlbmRBbHBoYT0wLHRoaXMuZGVwdGhGdW5jPTMsdGhpcy5kZXB0aFRlc3Q9ITAsdGhpcy5kZXB0aFdyaXRlPSEwLHRoaXMuc3RlbmNpbFdyaXRlTWFzaz0yNTUsdGhpcy5zdGVuY2lsRnVuYz01MTksdGhpcy5zdGVuY2lsUmVmPTAsdGhpcy5zdGVuY2lsRnVuY01hc2s9MjU1LHRoaXMuc3RlbmNpbEZhaWw9NzY4MCx0aGlzLnN0ZW5jaWxaRmFpbD03NjgwLHRoaXMuc3RlbmNpbFpQYXNzPTc2ODAsdGhpcy5zdGVuY2lsV3JpdGU9ITEsdGhpcy5jbGlwcGluZ1BsYW5lcz1udWxsLHRoaXMuY2xpcEludGVyc2VjdGlvbj0hMSx0aGlzLmNsaXBTaGFkb3dzPSExLHRoaXMuc2hhZG93U2lkZT1udWxsLHRoaXMuY29sb3JXcml0ZT0hMCx0aGlzLnByZWNpc2lvbj1udWxsLHRoaXMucG9seWdvbk9mZnNldD0hMSx0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9MCx0aGlzLnBvbHlnb25PZmZzZXRVbml0cz0wLHRoaXMuZGl0aGVyaW5nPSExLHRoaXMuYWxwaGFUb0NvdmVyYWdlPSExLHRoaXMucHJlbXVsdGlwbGllZEFscGhhPSExLHRoaXMuZm9yY2VTaW5nbGVQYXNzPSExLHRoaXMuYWxsb3dPdmVycmlkZT0hMCx0aGlzLnZpc2libGU9ITAsdGhpcy50b25lTWFwcGVkPSEwLHRoaXMudXNlckRhdGE9e30sdGhpcy52ZXJzaW9uPTAsdGhpcy5fYWxwaGFUZXN0PTB9Z2V0IGFscGhhVGVzdCgpe3JldHVybiB0aGlzLl9hbHBoYVRlc3R9c2V0IGFscGhhVGVzdCh0KXt0aGlzLl9hbHBoYVRlc3Q+MCE9dD4wJiZ0aGlzLnZlcnNpb24rKyx0aGlzLl9hbHBoYVRlc3Q9dH1vbkJlZm9yZVJlbmRlcigpe31vbkJlZm9yZUNvbXBpbGUoKXt9Y3VzdG9tUHJvZ3JhbUNhY2hlS2V5KCl7cmV0dXJuIHRoaXMub25CZWZvcmVDb21waWxlLnRvU3RyaW5nKCl9c2V0VmFsdWVzKHQpe2lmKHQhPT12b2lkIDApZm9yKGNvbnN0IGUgaW4gdCl7Y29uc3Qgbj10W2VdO2lmKG49PT12b2lkIDApe010KGBNYXRlcmlhbDogcGFyYW1ldGVyICcke2V9JyBoYXMgdmFsdWUgb2YgdW5kZWZpbmVkLmApO2NvbnRpbnVlfWNvbnN0IHM9dGhpc1tlXTtpZihzPT09dm9pZCAwKXtNdChgTWF0ZXJpYWw6ICcke2V9JyBpcyBub3QgYSBwcm9wZXJ0eSBvZiBUSFJFRS4ke3RoaXMudHlwZX0uYCk7Y29udGludWV9cyYmcy5pc0NvbG9yP3Muc2V0KG4pOnMmJnMuaXNWZWN0b3IzJiZuJiZuLmlzVmVjdG9yMz9zLmNvcHkobik6dGhpc1tlXT1ufX10b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyI7ZSYmKHQ9e3RleHR1cmVzOnt9LGltYWdlczp7fX0pO2NvbnN0IG49e21ldGFkYXRhOnt2ZXJzaW9uOjQuNyx0eXBlOiJNYXRlcmlhbCIsZ2VuZXJhdG9yOiJNYXRlcmlhbC50b0pTT04ifX07bi51dWlkPXRoaXMudXVpZCxuLnR5cGU9dGhpcy50eXBlLHRoaXMubmFtZSE9PSIiJiYobi5uYW1lPXRoaXMubmFtZSksdGhpcy5jb2xvciYmdGhpcy5jb2xvci5pc0NvbG9yJiYobi5jb2xvcj10aGlzLmNvbG9yLmdldEhleCgpKSx0aGlzLnJvdWdobmVzcyE9PXZvaWQgMCYmKG4ucm91Z2huZXNzPXRoaXMucm91Z2huZXNzKSx0aGlzLm1ldGFsbmVzcyE9PXZvaWQgMCYmKG4ubWV0YWxuZXNzPXRoaXMubWV0YWxuZXNzKSx0aGlzLnNoZWVuIT09dm9pZCAwJiYobi5zaGVlbj10aGlzLnNoZWVuKSx0aGlzLnNoZWVuQ29sb3ImJnRoaXMuc2hlZW5Db2xvci5pc0NvbG9yJiYobi5zaGVlbkNvbG9yPXRoaXMuc2hlZW5Db2xvci5nZXRIZXgoKSksdGhpcy5zaGVlblJvdWdobmVzcyE9PXZvaWQgMCYmKG4uc2hlZW5Sb3VnaG5lc3M9dGhpcy5zaGVlblJvdWdobmVzcyksdGhpcy5lbWlzc2l2ZSYmdGhpcy5lbWlzc2l2ZS5pc0NvbG9yJiYobi5lbWlzc2l2ZT10aGlzLmVtaXNzaXZlLmdldEhleCgpKSx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5IT09dm9pZCAwJiZ0aGlzLmVtaXNzaXZlSW50ZW5zaXR5IT09MSYmKG4uZW1pc3NpdmVJbnRlbnNpdHk9dGhpcy5lbWlzc2l2ZUludGVuc2l0eSksdGhpcy5zcGVjdWxhciYmdGhpcy5zcGVjdWxhci5pc0NvbG9yJiYobi5zcGVjdWxhcj10aGlzLnNwZWN1bGFyLmdldEhleCgpKSx0aGlzLnNwZWN1bGFySW50ZW5zaXR5IT09dm9pZCAwJiYobi5zcGVjdWxhckludGVuc2l0eT10aGlzLnNwZWN1bGFySW50ZW5zaXR5KSx0aGlzLnNwZWN1bGFyQ29sb3ImJnRoaXMuc3BlY3VsYXJDb2xvci5pc0NvbG9yJiYobi5zcGVjdWxhckNvbG9yPXRoaXMuc3BlY3VsYXJDb2xvci5nZXRIZXgoKSksdGhpcy5zaGluaW5lc3MhPT12b2lkIDAmJihuLnNoaW5pbmVzcz10aGlzLnNoaW5pbmVzcyksdGhpcy5jbGVhcmNvYXQhPT12b2lkIDAmJihuLmNsZWFyY29hdD10aGlzLmNsZWFyY29hdCksdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MhPT12b2lkIDAmJihuLmNsZWFyY29hdFJvdWdobmVzcz10aGlzLmNsZWFyY29hdFJvdWdobmVzcyksdGhpcy5jbGVhcmNvYXRNYXAmJnRoaXMuY2xlYXJjb2F0TWFwLmlzVGV4dHVyZSYmKG4uY2xlYXJjb2F0TWFwPXRoaXMuY2xlYXJjb2F0TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcCYmdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAuaXNUZXh0dXJlJiYobi5jbGVhcmNvYXRSb3VnaG5lc3NNYXA9dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwJiZ0aGlzLmNsZWFyY29hdE5vcm1hbE1hcC5pc1RleHR1cmUmJihuLmNsZWFyY29hdE5vcm1hbE1hcD10aGlzLmNsZWFyY29hdE5vcm1hbE1hcC50b0pTT04odCkudXVpZCxuLmNsZWFyY29hdE5vcm1hbFNjYWxlPXRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudG9BcnJheSgpKSx0aGlzLnNoZWVuQ29sb3JNYXAmJnRoaXMuc2hlZW5Db2xvck1hcC5pc1RleHR1cmUmJihuLnNoZWVuQ29sb3JNYXA9dGhpcy5zaGVlbkNvbG9yTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnNoZWVuUm91Z2huZXNzTWFwJiZ0aGlzLnNoZWVuUm91Z2huZXNzTWFwLmlzVGV4dHVyZSYmKG4uc2hlZW5Sb3VnaG5lc3NNYXA9dGhpcy5zaGVlblJvdWdobmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5kaXNwZXJzaW9uIT09dm9pZCAwJiYobi5kaXNwZXJzaW9uPXRoaXMuZGlzcGVyc2lvbiksdGhpcy5pcmlkZXNjZW5jZSE9PXZvaWQgMCYmKG4uaXJpZGVzY2VuY2U9dGhpcy5pcmlkZXNjZW5jZSksdGhpcy5pcmlkZXNjZW5jZUlPUiE9PXZvaWQgMCYmKG4uaXJpZGVzY2VuY2VJT1I9dGhpcy5pcmlkZXNjZW5jZUlPUiksdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlIT09dm9pZCAwJiYobi5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlPXRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSksdGhpcy5pcmlkZXNjZW5jZU1hcCYmdGhpcy5pcmlkZXNjZW5jZU1hcC5pc1RleHR1cmUmJihuLmlyaWRlc2NlbmNlTWFwPXRoaXMuaXJpZGVzY2VuY2VNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAmJnRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAuaXNUZXh0dXJlJiYobi5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD10aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmFuaXNvdHJvcHkhPT12b2lkIDAmJihuLmFuaXNvdHJvcHk9dGhpcy5hbmlzb3Ryb3B5KSx0aGlzLmFuaXNvdHJvcHlSb3RhdGlvbiE9PXZvaWQgMCYmKG4uYW5pc290cm9weVJvdGF0aW9uPXRoaXMuYW5pc290cm9weVJvdGF0aW9uKSx0aGlzLmFuaXNvdHJvcHlNYXAmJnRoaXMuYW5pc290cm9weU1hcC5pc1RleHR1cmUmJihuLmFuaXNvdHJvcHlNYXA9dGhpcy5hbmlzb3Ryb3B5TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLm1hcCYmdGhpcy5tYXAuaXNUZXh0dXJlJiYobi5tYXA9dGhpcy5tYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubWF0Y2FwJiZ0aGlzLm1hdGNhcC5pc1RleHR1cmUmJihuLm1hdGNhcD10aGlzLm1hdGNhcC50b0pTT04odCkudXVpZCksdGhpcy5hbHBoYU1hcCYmdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUmJihuLmFscGhhTWFwPXRoaXMuYWxwaGFNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubGlnaHRNYXAmJnRoaXMubGlnaHRNYXAuaXNUZXh0dXJlJiYobi5saWdodE1hcD10aGlzLmxpZ2h0TWFwLnRvSlNPTih0KS51dWlkLG4ubGlnaHRNYXBJbnRlbnNpdHk9dGhpcy5saWdodE1hcEludGVuc2l0eSksdGhpcy5hb01hcCYmdGhpcy5hb01hcC5pc1RleHR1cmUmJihuLmFvTWFwPXRoaXMuYW9NYXAudG9KU09OKHQpLnV1aWQsbi5hb01hcEludGVuc2l0eT10aGlzLmFvTWFwSW50ZW5zaXR5KSx0aGlzLmJ1bXBNYXAmJnRoaXMuYnVtcE1hcC5pc1RleHR1cmUmJihuLmJ1bXBNYXA9dGhpcy5idW1wTWFwLnRvSlNPTih0KS51dWlkLG4uYnVtcFNjYWxlPXRoaXMuYnVtcFNjYWxlKSx0aGlzLm5vcm1hbE1hcCYmdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlJiYobi5ub3JtYWxNYXA9dGhpcy5ub3JtYWxNYXAudG9KU09OKHQpLnV1aWQsbi5ub3JtYWxNYXBUeXBlPXRoaXMubm9ybWFsTWFwVHlwZSxuLm5vcm1hbFNjYWxlPXRoaXMubm9ybWFsU2NhbGUudG9BcnJheSgpKSx0aGlzLmRpc3BsYWNlbWVudE1hcCYmdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlJiYobi5kaXNwbGFjZW1lbnRNYXA9dGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKHQpLnV1aWQsbi5kaXNwbGFjZW1lbnRTY2FsZT10aGlzLmRpc3BsYWNlbWVudFNjYWxlLG4uZGlzcGxhY2VtZW50Qmlhcz10aGlzLmRpc3BsYWNlbWVudEJpYXMpLHRoaXMucm91Z2huZXNzTWFwJiZ0aGlzLnJvdWdobmVzc01hcC5pc1RleHR1cmUmJihuLnJvdWdobmVzc01hcD10aGlzLnJvdWdobmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5tZXRhbG5lc3NNYXAmJnRoaXMubWV0YWxuZXNzTWFwLmlzVGV4dHVyZSYmKG4ubWV0YWxuZXNzTWFwPXRoaXMubWV0YWxuZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVtaXNzaXZlTWFwJiZ0aGlzLmVtaXNzaXZlTWFwLmlzVGV4dHVyZSYmKG4uZW1pc3NpdmVNYXA9dGhpcy5lbWlzc2l2ZU1hcC50b0pTT04odCkudXVpZCksdGhpcy5zcGVjdWxhck1hcCYmdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFyTWFwPXRoaXMuc3BlY3VsYXJNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAmJnRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAuaXNUZXh0dXJlJiYobi5zcGVjdWxhckludGVuc2l0eU1hcD10aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnNwZWN1bGFyQ29sb3JNYXAmJnRoaXMuc3BlY3VsYXJDb2xvck1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFyQ29sb3JNYXA9dGhpcy5zcGVjdWxhckNvbG9yTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVudk1hcCYmdGhpcy5lbnZNYXAuaXNUZXh0dXJlJiYobi5lbnZNYXA9dGhpcy5lbnZNYXAudG9KU09OKHQpLnV1aWQsdGhpcy5jb21iaW5lIT09dm9pZCAwJiYobi5jb21iaW5lPXRoaXMuY29tYmluZSkpLHRoaXMuZW52TWFwUm90YXRpb24hPT12b2lkIDAmJihuLmVudk1hcFJvdGF0aW9uPXRoaXMuZW52TWFwUm90YXRpb24udG9BcnJheSgpKSx0aGlzLmVudk1hcEludGVuc2l0eSE9PXZvaWQgMCYmKG4uZW52TWFwSW50ZW5zaXR5PXRoaXMuZW52TWFwSW50ZW5zaXR5KSx0aGlzLnJlZmxlY3Rpdml0eSE9PXZvaWQgMCYmKG4ucmVmbGVjdGl2aXR5PXRoaXMucmVmbGVjdGl2aXR5KSx0aGlzLnJlZnJhY3Rpb25SYXRpbyE9PXZvaWQgMCYmKG4ucmVmcmFjdGlvblJhdGlvPXRoaXMucmVmcmFjdGlvblJhdGlvKSx0aGlzLmdyYWRpZW50TWFwJiZ0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSYmKG4uZ3JhZGllbnRNYXA9dGhpcy5ncmFkaWVudE1hcC50b0pTT04odCkudXVpZCksdGhpcy50cmFuc21pc3Npb24hPT12b2lkIDAmJihuLnRyYW5zbWlzc2lvbj10aGlzLnRyYW5zbWlzc2lvbiksdGhpcy50cmFuc21pc3Npb25NYXAmJnRoaXMudHJhbnNtaXNzaW9uTWFwLmlzVGV4dHVyZSYmKG4udHJhbnNtaXNzaW9uTWFwPXRoaXMudHJhbnNtaXNzaW9uTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnRoaWNrbmVzcyE9PXZvaWQgMCYmKG4udGhpY2tuZXNzPXRoaXMudGhpY2tuZXNzKSx0aGlzLnRoaWNrbmVzc01hcCYmdGhpcy50aGlja25lc3NNYXAuaXNUZXh0dXJlJiYobi50aGlja25lc3NNYXA9dGhpcy50aGlja25lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSE9PXZvaWQgMCYmdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlIT09MS8wJiYobi5hdHRlbnVhdGlvbkRpc3RhbmNlPXRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSksdGhpcy5hdHRlbnVhdGlvbkNvbG9yIT09dm9pZCAwJiYobi5hdHRlbnVhdGlvbkNvbG9yPXRoaXMuYXR0ZW51YXRpb25Db2xvci5nZXRIZXgoKSksdGhpcy5zaXplIT09dm9pZCAwJiYobi5zaXplPXRoaXMuc2l6ZSksdGhpcy5zaGFkb3dTaWRlIT09bnVsbCYmKG4uc2hhZG93U2lkZT10aGlzLnNoYWRvd1NpZGUpLHRoaXMuc2l6ZUF0dGVudWF0aW9uIT09dm9pZCAwJiYobi5zaXplQXR0ZW51YXRpb249dGhpcy5zaXplQXR0ZW51YXRpb24pLHRoaXMuYmxlbmRpbmchPT0xJiYobi5ibGVuZGluZz10aGlzLmJsZW5kaW5nKSx0aGlzLnNpZGUhPT0wJiYobi5zaWRlPXRoaXMuc2lkZSksdGhpcy52ZXJ0ZXhDb2xvcnM9PT0hMCYmKG4udmVydGV4Q29sb3JzPSEwKSx0aGlzLm9wYWNpdHk8MSYmKG4ub3BhY2l0eT10aGlzLm9wYWNpdHkpLHRoaXMudHJhbnNwYXJlbnQ9PT0hMCYmKG4udHJhbnNwYXJlbnQ9ITApLHRoaXMuYmxlbmRTcmMhPT0yMDQmJihuLmJsZW5kU3JjPXRoaXMuYmxlbmRTcmMpLHRoaXMuYmxlbmREc3QhPT0yMDUmJihuLmJsZW5kRHN0PXRoaXMuYmxlbmREc3QpLHRoaXMuYmxlbmRFcXVhdGlvbiE9PTEwMCYmKG4uYmxlbmRFcXVhdGlvbj10aGlzLmJsZW5kRXF1YXRpb24pLHRoaXMuYmxlbmRTcmNBbHBoYSE9PW51bGwmJihuLmJsZW5kU3JjQWxwaGE9dGhpcy5ibGVuZFNyY0FscGhhKSx0aGlzLmJsZW5kRHN0QWxwaGEhPT1udWxsJiYobi5ibGVuZERzdEFscGhhPXRoaXMuYmxlbmREc3RBbHBoYSksdGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEhPT1udWxsJiYobi5ibGVuZEVxdWF0aW9uQWxwaGE9dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEpLHRoaXMuYmxlbmRDb2xvciYmdGhpcy5ibGVuZENvbG9yLmlzQ29sb3ImJihuLmJsZW5kQ29sb3I9dGhpcy5ibGVuZENvbG9yLmdldEhleCgpKSx0aGlzLmJsZW5kQWxwaGEhPT0wJiYobi5ibGVuZEFscGhhPXRoaXMuYmxlbmRBbHBoYSksdGhpcy5kZXB0aEZ1bmMhPT0zJiYobi5kZXB0aEZ1bmM9dGhpcy5kZXB0aEZ1bmMpLHRoaXMuZGVwdGhUZXN0PT09ITEmJihuLmRlcHRoVGVzdD10aGlzLmRlcHRoVGVzdCksdGhpcy5kZXB0aFdyaXRlPT09ITEmJihuLmRlcHRoV3JpdGU9dGhpcy5kZXB0aFdyaXRlKSx0aGlzLmNvbG9yV3JpdGU9PT0hMSYmKG4uY29sb3JXcml0ZT10aGlzLmNvbG9yV3JpdGUpLHRoaXMuc3RlbmNpbFdyaXRlTWFzayE9PTI1NSYmKG4uc3RlbmNpbFdyaXRlTWFzaz10aGlzLnN0ZW5jaWxXcml0ZU1hc2spLHRoaXMuc3RlbmNpbEZ1bmMhPT01MTkmJihuLnN0ZW5jaWxGdW5jPXRoaXMuc3RlbmNpbEZ1bmMpLHRoaXMuc3RlbmNpbFJlZiE9PTAmJihuLnN0ZW5jaWxSZWY9dGhpcy5zdGVuY2lsUmVmKSx0aGlzLnN0ZW5jaWxGdW5jTWFzayE9PTI1NSYmKG4uc3RlbmNpbEZ1bmNNYXNrPXRoaXMuc3RlbmNpbEZ1bmNNYXNrKSx0aGlzLnN0ZW5jaWxGYWlsIT09NzY4MCYmKG4uc3RlbmNpbEZhaWw9dGhpcy5zdGVuY2lsRmFpbCksdGhpcy5zdGVuY2lsWkZhaWwhPT03NjgwJiYobi5zdGVuY2lsWkZhaWw9dGhpcy5zdGVuY2lsWkZhaWwpLHRoaXMuc3RlbmNpbFpQYXNzIT09NzY4MCYmKG4uc3RlbmNpbFpQYXNzPXRoaXMuc3RlbmNpbFpQYXNzKSx0aGlzLnN0ZW5jaWxXcml0ZT09PSEwJiYobi5zdGVuY2lsV3JpdGU9dGhpcy5zdGVuY2lsV3JpdGUpLHRoaXMucm90YXRpb24hPT12b2lkIDAmJnRoaXMucm90YXRpb24hPT0wJiYobi5yb3RhdGlvbj10aGlzLnJvdGF0aW9uKSx0aGlzLnBvbHlnb25PZmZzZXQ9PT0hMCYmKG4ucG9seWdvbk9mZnNldD0hMCksdGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yIT09MCYmKG4ucG9seWdvbk9mZnNldEZhY3Rvcj10aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IpLHRoaXMucG9seWdvbk9mZnNldFVuaXRzIT09MCYmKG4ucG9seWdvbk9mZnNldFVuaXRzPXRoaXMucG9seWdvbk9mZnNldFVuaXRzKSx0aGlzLmxpbmV3aWR0aCE9PXZvaWQgMCYmdGhpcy5saW5ld2lkdGghPT0xJiYobi5saW5ld2lkdGg9dGhpcy5saW5ld2lkdGgpLHRoaXMuZGFzaFNpemUhPT12b2lkIDAmJihuLmRhc2hTaXplPXRoaXMuZGFzaFNpemUpLHRoaXMuZ2FwU2l6ZSE9PXZvaWQgMCYmKG4uZ2FwU2l6ZT10aGlzLmdhcFNpemUpLHRoaXMuc2NhbGUhPT12b2lkIDAmJihuLnNjYWxlPXRoaXMuc2NhbGUpLHRoaXMuZGl0aGVyaW5nPT09ITAmJihuLmRpdGhlcmluZz0hMCksdGhpcy5hbHBoYVRlc3Q+MCYmKG4uYWxwaGFUZXN0PXRoaXMuYWxwaGFUZXN0KSx0aGlzLmFscGhhSGFzaD09PSEwJiYobi5hbHBoYUhhc2g9ITApLHRoaXMuYWxwaGFUb0NvdmVyYWdlPT09ITAmJihuLmFscGhhVG9Db3ZlcmFnZT0hMCksdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9PT0hMCYmKG4ucHJlbXVsdGlwbGllZEFscGhhPSEwKSx0aGlzLmZvcmNlU2luZ2xlUGFzcz09PSEwJiYobi5mb3JjZVNpbmdsZVBhc3M9ITApLHRoaXMud2lyZWZyYW1lPT09ITAmJihuLndpcmVmcmFtZT0hMCksdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg+MSYmKG4ud2lyZWZyYW1lTGluZXdpZHRoPXRoaXMud2lyZWZyYW1lTGluZXdpZHRoKSx0aGlzLndpcmVmcmFtZUxpbmVjYXAhPT0icm91bmQiJiYobi53aXJlZnJhbWVMaW5lY2FwPXRoaXMud2lyZWZyYW1lTGluZWNhcCksdGhpcy53aXJlZnJhbWVMaW5lam9pbiE9PSJyb3VuZCImJihuLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWpvaW4pLHRoaXMuZmxhdFNoYWRpbmc9PT0hMCYmKG4uZmxhdFNoYWRpbmc9ITApLHRoaXMudmlzaWJsZT09PSExJiYobi52aXNpYmxlPSExKSx0aGlzLnRvbmVNYXBwZWQ9PT0hMSYmKG4udG9uZU1hcHBlZD0hMSksdGhpcy5mb2c9PT0hMSYmKG4uZm9nPSExKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKG4udXNlckRhdGE9dGhpcy51c2VyRGF0YSk7ZnVuY3Rpb24gcyhyKXtjb25zdCBvPVtdO2Zvcihjb25zdCBhIGluIHIpe2NvbnN0IGM9clthXTtkZWxldGUgYy5tZXRhZGF0YSxvLnB1c2goYyl9cmV0dXJuIG99aWYoZSl7Y29uc3Qgcj1zKHQudGV4dHVyZXMpLG89cyh0LmltYWdlcyk7ci5sZW5ndGg+MCYmKG4udGV4dHVyZXM9ciksby5sZW5ndGg+MCYmKG4uaW1hZ2VzPW8pfXJldHVybiBufWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMubmFtZT10Lm5hbWUsdGhpcy5ibGVuZGluZz10LmJsZW5kaW5nLHRoaXMuc2lkZT10LnNpZGUsdGhpcy52ZXJ0ZXhDb2xvcnM9dC52ZXJ0ZXhDb2xvcnMsdGhpcy5vcGFjaXR5PXQub3BhY2l0eSx0aGlzLnRyYW5zcGFyZW50PXQudHJhbnNwYXJlbnQsdGhpcy5ibGVuZFNyYz10LmJsZW5kU3JjLHRoaXMuYmxlbmREc3Q9dC5ibGVuZERzdCx0aGlzLmJsZW5kRXF1YXRpb249dC5ibGVuZEVxdWF0aW9uLHRoaXMuYmxlbmRTcmNBbHBoYT10LmJsZW5kU3JjQWxwaGEsdGhpcy5ibGVuZERzdEFscGhhPXQuYmxlbmREc3RBbHBoYSx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT10LmJsZW5kRXF1YXRpb25BbHBoYSx0aGlzLmJsZW5kQ29sb3IuY29weSh0LmJsZW5kQ29sb3IpLHRoaXMuYmxlbmRBbHBoYT10LmJsZW5kQWxwaGEsdGhpcy5kZXB0aEZ1bmM9dC5kZXB0aEZ1bmMsdGhpcy5kZXB0aFRlc3Q9dC5kZXB0aFRlc3QsdGhpcy5kZXB0aFdyaXRlPXQuZGVwdGhXcml0ZSx0aGlzLnN0ZW5jaWxXcml0ZU1hc2s9dC5zdGVuY2lsV3JpdGVNYXNrLHRoaXMuc3RlbmNpbEZ1bmM9dC5zdGVuY2lsRnVuYyx0aGlzLnN0ZW5jaWxSZWY9dC5zdGVuY2lsUmVmLHRoaXMuc3RlbmNpbEZ1bmNNYXNrPXQuc3RlbmNpbEZ1bmNNYXNrLHRoaXMuc3RlbmNpbEZhaWw9dC5zdGVuY2lsRmFpbCx0aGlzLnN0ZW5jaWxaRmFpbD10LnN0ZW5jaWxaRmFpbCx0aGlzLnN0ZW5jaWxaUGFzcz10LnN0ZW5jaWxaUGFzcyx0aGlzLnN0ZW5jaWxXcml0ZT10LnN0ZW5jaWxXcml0ZTtjb25zdCBlPXQuY2xpcHBpbmdQbGFuZXM7bGV0IG49bnVsbDtpZihlIT09bnVsbCl7Y29uc3Qgcz1lLmxlbmd0aDtuPW5ldyBBcnJheShzKTtmb3IobGV0IHI9MDtyIT09czsrK3IpbltyXT1lW3JdLmNsb25lKCl9cmV0dXJuIHRoaXMuY2xpcHBpbmdQbGFuZXM9bix0aGlzLmNsaXBJbnRlcnNlY3Rpb249dC5jbGlwSW50ZXJzZWN0aW9uLHRoaXMuY2xpcFNoYWRvd3M9dC5jbGlwU2hhZG93cyx0aGlzLnNoYWRvd1NpZGU9dC5zaGFkb3dTaWRlLHRoaXMuY29sb3JXcml0ZT10LmNvbG9yV3JpdGUsdGhpcy5wcmVjaXNpb249dC5wcmVjaXNpb24sdGhpcy5wb2x5Z29uT2Zmc2V0PXQucG9seWdvbk9mZnNldCx0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9dC5wb2x5Z29uT2Zmc2V0RmFjdG9yLHRoaXMucG9seWdvbk9mZnNldFVuaXRzPXQucG9seWdvbk9mZnNldFVuaXRzLHRoaXMuZGl0aGVyaW5nPXQuZGl0aGVyaW5nLHRoaXMuYWxwaGFUZXN0PXQuYWxwaGFUZXN0LHRoaXMuYWxwaGFIYXNoPXQuYWxwaGFIYXNoLHRoaXMuYWxwaGFUb0NvdmVyYWdlPXQuYWxwaGFUb0NvdmVyYWdlLHRoaXMucHJlbXVsdGlwbGllZEFscGhhPXQucHJlbXVsdGlwbGllZEFscGhhLHRoaXMuZm9yY2VTaW5nbGVQYXNzPXQuZm9yY2VTaW5nbGVQYXNzLHRoaXMudmlzaWJsZT10LnZpc2libGUsdGhpcy50b25lTWFwcGVkPXQudG9uZU1hcHBlZCx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLHRoaXN9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK319Y2xhc3MgTWYgZXh0ZW5kcyBiZntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNNZXNoQmFzaWNNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hCYXNpY01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyBNcygxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmxpZ2h0TWFwPW51bGwsdGhpcy5saWdodE1hcEludGVuc2l0eT0xLHRoaXMuYW9NYXA9bnVsbCx0aGlzLmFvTWFwSW50ZW5zaXR5PTEsdGhpcy5zcGVjdWxhck1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmVudk1hcD1udWxsLHRoaXMuZW52TWFwUm90YXRpb249bmV3IHZpLHRoaXMuY29tYmluZT0wLHRoaXMucmVmbGVjdGl2aXR5PTEsdGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4LHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuZm9nPSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubWFwPXQubWFwLHRoaXMubGlnaHRNYXA9dC5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD10LmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSx0aGlzLnNwZWN1bGFyTWFwPXQuc3BlY3VsYXJNYXAsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMuZW52TWFwPXQuZW52TWFwLHRoaXMuZW52TWFwUm90YXRpb24uY29weSh0LmVudk1hcFJvdGF0aW9uKSx0aGlzLmNvbWJpbmU9dC5jb21iaW5lLHRoaXMucmVmbGVjdGl2aXR5PXQucmVmbGVjdGl2aXR5LHRoaXMucmVmcmFjdGlvblJhdGlvPXQucmVmcmFjdGlvblJhdGlvLHRoaXMud2lyZWZyYW1lPXQud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoLHRoaXMud2lyZWZyYW1lTGluZWNhcD10LndpcmVmcmFtZUxpbmVjYXAsdGhpcy53aXJlZnJhbWVMaW5lam9pbj10LndpcmVmcmFtZUxpbmVqb2luLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWNvbnN0IGR0PW5ldyBULEFzPW5ldyBOO2xldCBBZj0wO2NsYXNzIGd0e2NvbnN0cnVjdG9yKHQsZSxuPSExKXtpZihBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuIik7dGhpcy5pc0J1ZmZlckF0dHJpYnV0ZT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpBZisrfSksdGhpcy5uYW1lPSIiLHRoaXMuYXJyYXk9dCx0aGlzLml0ZW1TaXplPWUsdGhpcy5jb3VudD10IT09dm9pZCAwP3QubGVuZ3RoL2U6MCx0aGlzLm5vcm1hbGl6ZWQ9bix0aGlzLnVzYWdlPTM1MDQ0LHRoaXMudXBkYXRlUmFuZ2VzPVtdLHRoaXMuZ3B1VHlwZT0xMDE1LHRoaXMudmVyc2lvbj0wfW9uVXBsb2FkQ2FsbGJhY2soKXt9c2V0IG5lZWRzVXBkYXRlKHQpe3Q9PT0hMCYmdGhpcy52ZXJzaW9uKyt9c2V0VXNhZ2UodCl7cmV0dXJuIHRoaXMudXNhZ2U9dCx0aGlzfWFkZFVwZGF0ZVJhbmdlKHQsZSl7dGhpcy51cGRhdGVSYW5nZXMucHVzaCh7c3RhcnQ6dCxjb3VudDplfSl9Y2xlYXJVcGRhdGVSYW5nZXMoKXt0aGlzLnVwZGF0ZVJhbmdlcy5sZW5ndGg9MH1jb3B5KHQpe3JldHVybiB0aGlzLm5hbWU9dC5uYW1lLHRoaXMuYXJyYXk9bmV3IHQuYXJyYXkuY29uc3RydWN0b3IodC5hcnJheSksdGhpcy5pdGVtU2l6ZT10Lml0ZW1TaXplLHRoaXMuY291bnQ9dC5jb3VudCx0aGlzLm5vcm1hbGl6ZWQ9dC5ub3JtYWxpemVkLHRoaXMudXNhZ2U9dC51c2FnZSx0aGlzLmdwdVR5cGU9dC5ncHVUeXBlLHRoaXN9Y29weUF0KHQsZSxuKXt0Kj10aGlzLml0ZW1TaXplLG4qPWUuaXRlbVNpemU7Zm9yKGxldCBzPTAscj10aGlzLml0ZW1TaXplO3M8cjtzKyspdGhpcy5hcnJheVt0K3NdPWUuYXJyYXlbbitzXTtyZXR1cm4gdGhpc31jb3B5QXJyYXkodCl7cmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQpLHRoaXN9YXBwbHlNYXRyaXgzKHQpe2lmKHRoaXMuaXRlbVNpemU9PT0yKWZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKUFzLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxBcy5hcHBseU1hdHJpeDModCksdGhpcy5zZXRYWShlLEFzLngsQXMueSk7ZWxzZSBpZih0aGlzLml0ZW1TaXplPT09Mylmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylkdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksZHQuYXBwbHlNYXRyaXgzKHQpLHRoaXMuc2V0WFlaKGUsZHQueCxkdC55LGR0LnopO3JldHVybiB0aGlzfWFwcGx5TWF0cml4NCh0KXtmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylkdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksZHQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0WFlaKGUsZHQueCxkdC55LGR0LnopO3JldHVybiB0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKWR0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxkdC5hcHBseU5vcm1hbE1hdHJpeCh0KSx0aGlzLnNldFhZWihlLGR0LngsZHQueSxkdC56KTtyZXR1cm4gdGhpc310cmFuc2Zvcm1EaXJlY3Rpb24odCl7Zm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspZHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLGR0LnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzLnNldFhZWihlLGR0LngsZHQueSxkdC56KTtyZXR1cm4gdGhpc31zZXQodCxlPTApe3JldHVybiB0aGlzLmFycmF5LnNldCh0LGUpLHRoaXN9Z2V0Q29tcG9uZW50KHQsZSl7bGV0IG49dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrZV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKG49Ymkobix0aGlzLmFycmF5KSksbn1zZXRDb21wb25lbnQodCxlLG4pe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihuPWt0KG4sdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplK2VdPW4sdGhpc31nZXRYKHQpe2xldCBlPXRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1iaShlLHRoaXMuYXJyYXkpKSxlfXNldFgodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1rdChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZV09ZSx0aGlzfWdldFkodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9YmkoZSx0aGlzLmFycmF5KSksZX1zZXRZKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9a3QoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMV09ZSx0aGlzfWdldFoodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9YmkoZSx0aGlzLmFycmF5KSksZX1zZXRaKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9a3QoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl09ZSx0aGlzfWdldFcodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrM107cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9YmkoZSx0aGlzLmFycmF5KSksZX1zZXRXKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9a3QoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrM109ZSx0aGlzfXNldFhZKHQsZSxuKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPWt0KGUsdGhpcy5hcnJheSksbj1rdChuLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzfXNldFhZWih0LGUsbixzKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPWt0KGUsdGhpcy5hcnJheSksbj1rdChuLHRoaXMuYXJyYXkpLHM9a3Qocyx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KzBdPWUsdGhpcy5hcnJheVt0KzFdPW4sdGhpcy5hcnJheVt0KzJdPXMsdGhpc31zZXRYWVpXKHQsZSxuLHMscil7cmV0dXJuIHQqPXRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkJiYoZT1rdChlLHRoaXMuYXJyYXkpLG49a3Qobix0aGlzLmFycmF5KSxzPWt0KHMsdGhpcy5hcnJheSkscj1rdChyLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzLmFycmF5W3QrMl09cyx0aGlzLmFycmF5W3QrM109cix0aGlzfW9uVXBsb2FkKHQpe3JldHVybiB0aGlzLm9uVXBsb2FkQ2FsbGJhY2s9dCx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuYXJyYXksdGhpcy5pdGVtU2l6ZSkuY29weSh0aGlzKX10b0pTT04oKXtjb25zdCB0PXtpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OkFycmF5LmZyb20odGhpcy5hcnJheSksbm9ybWFsaXplZDp0aGlzLm5vcm1hbGl6ZWR9O3JldHVybiB0aGlzLm5hbWUhPT0iIiYmKHQubmFtZT10aGlzLm5hbWUpLHRoaXMudXNhZ2UhPT0zNTA0NCYmKHQudXNhZ2U9dGhpcy51c2FnZSksdH19Y2xhc3MgU2YgZXh0ZW5kcyBndHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQxNkFycmF5KHQpLGUsbil9fWNsYXNzIHZmIGV4dGVuZHMgZ3R7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBVaW50MzJBcnJheSh0KSxlLG4pfX1jbGFzcyBGZSBleHRlbmRzIGd0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgRmxvYXQzMkFycmF5KHQpLGUsbil9fWxldCBfZj0wO2NvbnN0IGp0PW5ldyBzdCxQbz1uZXcgQ2UsR249bmV3IFQsVnQ9bmV3IG10LHppPW5ldyBtdCxidD1uZXcgVDtjbGFzcyB4ZSBleHRlbmRzIGZze2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzQnVmZmVyR2VvbWV0cnk9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6X2YrK30pLHRoaXMudXVpZD1rbigpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9IkJ1ZmZlckdlb21ldHJ5Iix0aGlzLmluZGV4PW51bGwsdGhpcy5pbmRpcmVjdD1udWxsLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPSExLHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGwsdGhpcy5kcmF3UmFuZ2U9e3N0YXJ0OjAsY291bnQ6MS8wfSx0aGlzLnVzZXJEYXRhPXt9fWdldEluZGV4KCl7cmV0dXJuIHRoaXMuaW5kZXh9c2V0SW5kZXgodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dGhpcy5pbmRleD1uZXcoc2YodCk/dmY6U2YpKHQsMSk6dGhpcy5pbmRleD10LHRoaXN9c2V0SW5kaXJlY3QodCl7cmV0dXJuIHRoaXMuaW5kaXJlY3Q9dCx0aGlzfWdldEluZGlyZWN0KCl7cmV0dXJuIHRoaXMuaW5kaXJlY3R9Z2V0QXR0cmlidXRlKHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF19c2V0QXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XT1lLHRoaXN9ZGVsZXRlQXR0cmlidXRlKHQpe3JldHVybiBkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW3RdLHRoaXN9aGFzQXR0cmlidXRlKHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF0hPT12b2lkIDB9YWRkR3JvdXAodCxlLG49MCl7dGhpcy5ncm91cHMucHVzaCh7c3RhcnQ6dCxjb3VudDplLG1hdGVyaWFsSW5kZXg6bn0pfWNsZWFyR3JvdXBzKCl7dGhpcy5ncm91cHM9W119c2V0RHJhd1JhbmdlKHQsZSl7dGhpcy5kcmF3UmFuZ2Uuc3RhcnQ9dCx0aGlzLmRyYXdSYW5nZS5jb3VudD1lfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtlIT09dm9pZCAwJiYoZS5hcHBseU1hdHJpeDQodCksZS5uZWVkc1VwZGF0ZT0hMCk7Y29uc3Qgbj10aGlzLmF0dHJpYnV0ZXMubm9ybWFsO2lmKG4hPT12b2lkIDApe2NvbnN0IHI9bmV3IGdlKCkuZ2V0Tm9ybWFsTWF0cml4KHQpO24uYXBwbHlOb3JtYWxNYXRyaXgociksbi5uZWVkc1VwZGF0ZT0hMH1jb25zdCBzPXRoaXMuYXR0cmlidXRlcy50YW5nZW50O3JldHVybiBzIT09dm9pZCAwJiYocy50cmFuc2Zvcm1EaXJlY3Rpb24odCkscy5uZWVkc1VwZGF0ZT0hMCksdGhpcy5ib3VuZGluZ0JveCE9PW51bGwmJnRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCksdGhpcy5ib3VuZGluZ1NwaGVyZSE9PW51bGwmJnRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksdGhpc31hcHBseVF1YXRlcm5pb24odCl7cmV0dXJuIGp0Lm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuYXBwbHlNYXRyaXg0KGp0KSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIGp0Lm1ha2VSb3RhdGlvblgodCksdGhpcy5hcHBseU1hdHJpeDQoanQpLHRoaXN9cm90YXRlWSh0KXtyZXR1cm4ganQubWFrZVJvdGF0aW9uWSh0KSx0aGlzLmFwcGx5TWF0cml4NChqdCksdGhpc31yb3RhdGVaKHQpe3JldHVybiBqdC5tYWtlUm90YXRpb25aKHQpLHRoaXMuYXBwbHlNYXRyaXg0KGp0KSx0aGlzfXRyYW5zbGF0ZSh0LGUsbil7cmV0dXJuIGp0Lm1ha2VUcmFuc2xhdGlvbih0LGUsbiksdGhpcy5hcHBseU1hdHJpeDQoanQpLHRoaXN9c2NhbGUodCxlLG4pe3JldHVybiBqdC5tYWtlU2NhbGUodCxlLG4pLHRoaXMuYXBwbHlNYXRyaXg0KGp0KSx0aGlzfWxvb2tBdCh0KXtyZXR1cm4gUG8ubG9va0F0KHQpLFBvLnVwZGF0ZU1hdHJpeCgpLHRoaXMuYXBwbHlNYXRyaXg0KFBvLm1hdHJpeCksdGhpc31jZW50ZXIoKXtyZXR1cm4gdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKSx0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlcihHbikubmVnYXRlKCksdGhpcy50cmFuc2xhdGUoR24ueCxHbi55LEduLnopLHRoaXN9c2V0RnJvbVBvaW50cyh0KXtjb25zdCBlPXRoaXMuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2lmKGU9PT12b2lkIDApe2NvbnN0IG49W107Zm9yKGxldCBzPTAscj10Lmxlbmd0aDtzPHI7cysrKXtjb25zdCBvPXRbc107bi5wdXNoKG8ueCxvLnksby56fHwwKX10aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBGZShuLDMpKX1lbHNle2NvbnN0IG49TWF0aC5taW4odC5sZW5ndGgsZS5jb3VudCk7Zm9yKGxldCBzPTA7czxuO3MrKyl7Y29uc3Qgcj10W3NdO2Uuc2V0WFlaKHMsci54LHIueSxyLnp8fDApfXQubGVuZ3RoPmUuY291bnQmJk10KCJCdWZmZXJHZW9tZXRyeTogQnVmZmVyIHNpemUgdG9vIHNtYWxsIGZvciBwb2ludHMgZGF0YS4gVXNlIC5kaXNwb3NlKCkgYW5kIGNyZWF0ZSBhIG5ldyBnZW9tZXRyeS4iKSxlLm5lZWRzVXBkYXRlPSEwfXJldHVybiB0aGlzfWNvbXB1dGVCb3VuZGluZ0JveCgpe3RoaXMuYm91bmRpbmdCb3g9PT1udWxsJiYodGhpcy5ib3VuZGluZ0JveD1uZXcgbXQpO2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYodCYmdC5pc0dMQnVmZmVyQXR0cmlidXRlKXtobigiQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk6IEdMQnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIGEgbWFudWFsIGJvdW5kaW5nIGJveC4iLHRoaXMpLHRoaXMuYm91bmRpbmdCb3guc2V0KG5ldyBUKC0xLzAsLTEvMCwtMS8wKSxuZXcgVCgxLzAsMS8wLDEvMCkpO3JldHVybn1pZih0IT09dm9pZCAwKXtpZih0aGlzLmJvdW5kaW5nQm94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCksZSlmb3IobGV0IG49MCxzPWUubGVuZ3RoO248cztuKyspe2NvbnN0IHI9ZVtuXTtWdC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHIpLHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU/KGJ0LmFkZFZlY3RvcnModGhpcy5ib3VuZGluZ0JveC5taW4sVnQubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoYnQpLGJ0LmFkZFZlY3RvcnModGhpcy5ib3VuZGluZ0JveC5tYXgsVnQubWF4KSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoYnQpKToodGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KFZ0Lm1pbiksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KFZ0Lm1heCkpfX1lbHNlIHRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7KGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLngpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi55KXx8aXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueikpJiZobignQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk6IENvbXB1dGVkIG1pbi9tYXggaGF2ZSBOYU4gdmFsdWVzLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLHRoaXMpfWNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpe3RoaXMuYm91bmRpbmdTcGhlcmU9PT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1uZXcgcG8pO2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYodCYmdC5pc0dMQnVmZmVyQXR0cmlidXRlKXtobigiQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IEdMQnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIGEgbWFudWFsIGJvdW5kaW5nIHNwaGVyZS4iLHRoaXMpLHRoaXMuYm91bmRpbmdTcGhlcmUuc2V0KG5ldyBULDEvMCk7cmV0dXJufWlmKHQpe2NvbnN0IG49dGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7aWYoVnQuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KSxlKWZvcihsZXQgcj0wLG89ZS5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT1lW3JdO3ppLnNldEZyb21CdWZmZXJBdHRyaWJ1dGUoYSksdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT8oYnQuYWRkVmVjdG9ycyhWdC5taW4semkubWluKSxWdC5leHBhbmRCeVBvaW50KGJ0KSxidC5hZGRWZWN0b3JzKFZ0Lm1heCx6aS5tYXgpLFZ0LmV4cGFuZEJ5UG9pbnQoYnQpKTooVnQuZXhwYW5kQnlQb2ludCh6aS5taW4pLFZ0LmV4cGFuZEJ5UG9pbnQoemkubWF4KSl9VnQuZ2V0Q2VudGVyKG4pO2xldCBzPTA7Zm9yKGxldCByPTAsbz10LmNvdW50O3I8bztyKyspYnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LHIpLHM9TWF0aC5tYXgocyxuLmRpc3RhbmNlVG9TcXVhcmVkKGJ0KSk7aWYoZSlmb3IobGV0IHI9MCxvPWUubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9ZVtyXSxjPXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7Zm9yKGxldCBsPTAsaD1hLmNvdW50O2w8aDtsKyspYnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLGwpLGMmJihHbi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsbCksYnQuYWRkKEduKSkscz1NYXRoLm1heChzLG4uZGlzdGFuY2VUb1NxdWFyZWQoYnQpKX10aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cz1NYXRoLnNxcnQocyksaXNOYU4odGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMpJiZobignQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsdGhpcyl9fWNvbXB1dGVUYW5nZW50cygpe2NvbnN0IHQ9dGhpcy5pbmRleCxlPXRoaXMuYXR0cmlidXRlcztpZih0PT09bnVsbHx8ZS5wb3NpdGlvbj09PXZvaWQgMHx8ZS5ub3JtYWw9PT12b2lkIDB8fGUudXY9PT12b2lkIDApe2huKCJCdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGZhaWxlZC4gTWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzIChpbmRleCwgcG9zaXRpb24sIG5vcm1hbCBvciB1dikiKTtyZXR1cm59Y29uc3Qgbj1lLnBvc2l0aW9uLHM9ZS5ub3JtYWwscj1lLnV2O3RoaXMuaGFzQXR0cmlidXRlKCJ0YW5nZW50Iik9PT0hMSYmdGhpcy5zZXRBdHRyaWJ1dGUoInRhbmdlbnQiLG5ldyBndChuZXcgRmxvYXQzMkFycmF5KDQqbi5jb3VudCksNCkpO2NvbnN0IG89dGhpcy5nZXRBdHRyaWJ1dGUoInRhbmdlbnQiKSxhPVtdLGM9W107Zm9yKGxldCBfPTA7XzxuLmNvdW50O18rKylhW19dPW5ldyBULGNbX109bmV3IFQ7Y29uc3QgbD1uZXcgVCxoPW5ldyBULHU9bmV3IFQsZj1uZXcgTixkPW5ldyBOLHA9bmV3IE4seT1uZXcgVCxtPW5ldyBUO2Z1bmN0aW9uIGcoXyx2LFApe2wuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLF8pLGguZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLHYpLHUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLFApLGYuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLF8pLGQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLHYpLHAuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLFApLGguc3ViKGwpLHUuc3ViKGwpLGQuc3ViKGYpLHAuc3ViKGYpO2NvbnN0IHo9MS8oZC54KnAueS1wLngqZC55KTtpc0Zpbml0ZSh6KSYmKHkuY29weShoKS5tdWx0aXBseVNjYWxhcihwLnkpLmFkZFNjYWxlZFZlY3Rvcih1LC1kLnkpLm11bHRpcGx5U2NhbGFyKHopLG0uY29weSh1KS5tdWx0aXBseVNjYWxhcihkLngpLmFkZFNjYWxlZFZlY3RvcihoLC1wLngpLm11bHRpcGx5U2NhbGFyKHopLGFbX10uYWRkKHkpLGFbdl0uYWRkKHkpLGFbUF0uYWRkKHkpLGNbX10uYWRkKG0pLGNbdl0uYWRkKG0pLGNbUF0uYWRkKG0pKX1sZXQgYj10aGlzLmdyb3VwcztiLmxlbmd0aD09PTAmJihiPVt7c3RhcnQ6MCxjb3VudDp0LmNvdW50fV0pO2ZvcihsZXQgXz0wLHY9Yi5sZW5ndGg7Xzx2OysrXyl7Y29uc3QgUD1iW19dLHo9UC5zdGFydCxFPVAuY291bnQ7Zm9yKGxldCBDPXosRj16K0U7QzxGO0MrPTMpZyh0LmdldFgoQyswKSx0LmdldFgoQysxKSx0LmdldFgoQysyKSl9Y29uc3QgeD1uZXcgVCx3PW5ldyBULE09bmV3IFQsQT1uZXcgVDtmdW5jdGlvbiBTKF8pe00uZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLF8pLEEuY29weShNKTtjb25zdCB2PWFbX107eC5jb3B5KHYpLHguc3ViKE0ubXVsdGlwbHlTY2FsYXIoTS5kb3QodikpKS5ub3JtYWxpemUoKSx3LmNyb3NzVmVjdG9ycyhBLHYpO2NvbnN0IHo9dy5kb3QoY1tfXSk8MD8tMToxO28uc2V0WFlaVyhfLHgueCx4LnkseC56LHopfWZvcihsZXQgXz0wLHY9Yi5sZW5ndGg7Xzx2OysrXyl7Y29uc3QgUD1iW19dLHo9UC5zdGFydCxFPVAuY291bnQ7Zm9yKGxldCBDPXosRj16K0U7QzxGO0MrPTMpUyh0LmdldFgoQyswKSksUyh0LmdldFgoQysxKSksUyh0LmdldFgoQysyKSl9fWNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCl7Y29uc3QgdD10aGlzLmluZGV4LGU9dGhpcy5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7aWYoZSE9PXZvaWQgMCl7bGV0IG49dGhpcy5nZXRBdHRyaWJ1dGUoIm5vcm1hbCIpO2lmKG49PT12b2lkIDApbj1uZXcgZ3QobmV3IEZsb2F0MzJBcnJheShlLmNvdW50KjMpLDMpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG4pO2Vsc2UgZm9yKGxldCBmPTAsZD1uLmNvdW50O2Y8ZDtmKyspbi5zZXRYWVooZiwwLDAsMCk7Y29uc3Qgcz1uZXcgVCxyPW5ldyBULG89bmV3IFQsYT1uZXcgVCxjPW5ldyBULGw9bmV3IFQsaD1uZXcgVCx1PW5ldyBUO2lmKHQpZm9yKGxldCBmPTAsZD10LmNvdW50O2Y8ZDtmKz0zKXtjb25zdCBwPXQuZ2V0WChmKzApLHk9dC5nZXRYKGYrMSksbT10LmdldFgoZisyKTtzLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxwKSxyLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSx5KSxvLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxtKSxoLnN1YlZlY3RvcnMobyxyKSx1LnN1YlZlY3RvcnMocyxyKSxoLmNyb3NzKHUpLGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLHApLGMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLHkpLGwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLG0pLGEuYWRkKGgpLGMuYWRkKGgpLGwuYWRkKGgpLG4uc2V0WFlaKHAsYS54LGEueSxhLnopLG4uc2V0WFlaKHksYy54LGMueSxjLnopLG4uc2V0WFlaKG0sbC54LGwueSxsLnopfWVsc2UgZm9yKGxldCBmPTAsZD1lLmNvdW50O2Y8ZDtmKz0zKXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGYrMCksci5mcm9tQnVmZmVyQXR0cmlidXRlKGUsZisxKSxvLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxmKzIpLGguc3ViVmVjdG9ycyhvLHIpLHUuc3ViVmVjdG9ycyhzLHIpLGguY3Jvc3ModSksbi5zZXRYWVooZiswLGgueCxoLnksaC56KSxuLnNldFhZWihmKzEsaC54LGgueSxoLnopLG4uc2V0WFlaKGYrMixoLngsaC55LGgueik7dGhpcy5ub3JtYWxpemVOb3JtYWxzKCksbi5uZWVkc1VwZGF0ZT0hMH19bm9ybWFsaXplTm9ybWFscygpe2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtmb3IobGV0IGU9MCxuPXQuY291bnQ7ZTxuO2UrKylidC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksYnQubm9ybWFsaXplKCksdC5zZXRYWVooZSxidC54LGJ0LnksYnQueil9dG9Ob25JbmRleGVkKCl7ZnVuY3Rpb24gdChhLGMpe2NvbnN0IGw9YS5hcnJheSxoPWEuaXRlbVNpemUsdT1hLm5vcm1hbGl6ZWQsZj1uZXcgbC5jb25zdHJ1Y3RvcihjLmxlbmd0aCpoKTtsZXQgZD0wLHA9MDtmb3IobGV0IHk9MCxtPWMubGVuZ3RoO3k8bTt5Kyspe2EuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZT9kPWNbeV0qYS5kYXRhLnN0cmlkZSthLm9mZnNldDpkPWNbeV0qaDtmb3IobGV0IGc9MDtnPGg7ZysrKWZbcCsrXT1sW2QrK119cmV0dXJuIG5ldyBndChmLGgsdSl9aWYodGhpcy5pbmRleD09PW51bGwpcmV0dXJuIE10KCJCdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTogQnVmZmVyR2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4iKSx0aGlzO2NvbnN0IGU9bmV3IHhlLG49dGhpcy5pbmRleC5hcnJheSxzPXRoaXMuYXR0cmlidXRlcztmb3IoY29uc3QgYSBpbiBzKXtjb25zdCBjPXNbYV0sbD10KGMsbik7ZS5zZXRBdHRyaWJ1dGUoYSxsKX1jb25zdCByPXRoaXMubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCBhIGluIHIpe2NvbnN0IGM9W10sbD1yW2FdO2ZvcihsZXQgaD0wLHU9bC5sZW5ndGg7aDx1O2grKyl7Y29uc3QgZj1sW2hdLGQ9dChmLG4pO2MucHVzaChkKX1lLm1vcnBoQXR0cmlidXRlc1thXT1jfWUubW9ycGhUYXJnZXRzUmVsYXRpdmU9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtjb25zdCBvPXRoaXMuZ3JvdXBzO2ZvcihsZXQgYT0wLGM9by5sZW5ndGg7YTxjO2ErKyl7Y29uc3QgbD1vW2FdO2UuYWRkR3JvdXAobC5zdGFydCxsLmNvdW50LGwubWF0ZXJpYWxJbmRleCl9cmV0dXJuIGV9dG9KU09OKCl7Y29uc3QgdD17bWV0YWRhdGE6e3ZlcnNpb246NC43LHR5cGU6IkJ1ZmZlckdlb21ldHJ5IixnZW5lcmF0b3I6IkJ1ZmZlckdlb21ldHJ5LnRvSlNPTiJ9fTtpZih0LnV1aWQ9dGhpcy51dWlkLHQudHlwZT10aGlzLnR5cGUsdGhpcy5uYW1lIT09IiImJih0Lm5hbWU9dGhpcy5uYW1lKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKHQudXNlckRhdGE9dGhpcy51c2VyRGF0YSksdGhpcy5wYXJhbWV0ZXJzIT09dm9pZCAwKXtjb25zdCBjPXRoaXMucGFyYW1ldGVycztmb3IoY29uc3QgbCBpbiBjKWNbbF0hPT12b2lkIDAmJih0W2xdPWNbbF0pO3JldHVybiB0fXQuZGF0YT17YXR0cmlidXRlczp7fX07Y29uc3QgZT10aGlzLmluZGV4O2UhPT1udWxsJiYodC5kYXRhLmluZGV4PXt0eXBlOmUuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLmFycmF5KX0pO2NvbnN0IG49dGhpcy5hdHRyaWJ1dGVzO2Zvcihjb25zdCBjIGluIG4pe2NvbnN0IGw9bltjXTt0LmRhdGEuYXR0cmlidXRlc1tjXT1sLnRvSlNPTih0LmRhdGEpfWNvbnN0IHM9e307bGV0IHI9ITE7Zm9yKGNvbnN0IGMgaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMpe2NvbnN0IGw9dGhpcy5tb3JwaEF0dHJpYnV0ZXNbY10saD1bXTtmb3IobGV0IHU9MCxmPWwubGVuZ3RoO3U8Zjt1Kyspe2NvbnN0IGQ9bFt1XTtoLnB1c2goZC50b0pTT04odC5kYXRhKSl9aC5sZW5ndGg+MCYmKHNbY109aCxyPSEwKX1yJiYodC5kYXRhLm1vcnBoQXR0cmlidXRlcz1zLHQuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlKTtjb25zdCBvPXRoaXMuZ3JvdXBzO28ubGVuZ3RoPjAmJih0LmRhdGEuZ3JvdXBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobykpKTtjb25zdCBhPXRoaXMuYm91bmRpbmdTcGhlcmU7cmV0dXJuIGEhPT1udWxsJiYodC5kYXRhLmJvdW5kaW5nU3BoZXJlPWEudG9KU09OKCkpLHR9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7dGhpcy5pbmRleD1udWxsLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLmdyb3Vwcz1bXSx0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsO2NvbnN0IGU9e307dGhpcy5uYW1lPXQubmFtZTtjb25zdCBuPXQuaW5kZXg7biE9PW51bGwmJnRoaXMuc2V0SW5kZXgobi5jbG9uZSgpKTtjb25zdCBzPXQuYXR0cmlidXRlcztmb3IoY29uc3QgbCBpbiBzKXtjb25zdCBoPXNbbF07dGhpcy5zZXRBdHRyaWJ1dGUobCxoLmNsb25lKGUpKX1jb25zdCByPXQubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCBsIGluIHIpe2NvbnN0IGg9W10sdT1yW2xdO2ZvcihsZXQgZj0wLGQ9dS5sZW5ndGg7ZjxkO2YrKyloLnB1c2godVtmXS5jbG9uZShlKSk7dGhpcy5tb3JwaEF0dHJpYnV0ZXNbbF09aH10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPXQubW9ycGhUYXJnZXRzUmVsYXRpdmU7Y29uc3Qgbz10Lmdyb3Vwcztmb3IobGV0IGw9MCxoPW8ubGVuZ3RoO2w8aDtsKyspe2NvbnN0IHU9b1tsXTt0aGlzLmFkZEdyb3VwKHUuc3RhcnQsdS5jb3VudCx1Lm1hdGVyaWFsSW5kZXgpfWNvbnN0IGE9dC5ib3VuZGluZ0JveDthIT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9YS5jbG9uZSgpKTtjb25zdCBjPXQuYm91bmRpbmdTcGhlcmU7cmV0dXJuIGMhPT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1jLmNsb25lKCkpLHRoaXMuZHJhd1JhbmdlLnN0YXJ0PXQuZHJhd1JhbmdlLnN0YXJ0LHRoaXMuZHJhd1JhbmdlLmNvdW50PXQuZHJhd1JhbmdlLmNvdW50LHRoaXMudXNlckRhdGE9dC51c2VyRGF0YSx0aGlzfWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fWNvbnN0IFVjPW5ldyBzdCxwbj1uZXcgeG8sU3M9bmV3IHBvLHFjPW5ldyBULHZzPW5ldyBULF9zPW5ldyBULHpzPW5ldyBULENvPW5ldyBULFRzPW5ldyBULFhjPW5ldyBULFBzPW5ldyBUO2NsYXNzIHpmIGV4dGVuZHMgQ2V7Y29uc3RydWN0b3IodD1uZXcgeGUsZT1uZXcgTWYpe3N1cGVyKCksdGhpcy5pc01lc2g9ITAsdGhpcy50eXBlPSJNZXNoIix0aGlzLmdlb21ldHJ5PXQsdGhpcy5tYXRlcmlhbD1lLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXZvaWQgMCx0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz12b2lkIDAsdGhpcy5jb3VudD0xLHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdC5tb3JwaFRhcmdldEluZmx1ZW5jZXMhPT12b2lkIDAmJih0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz10Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5zbGljZSgpKSx0Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeSE9PXZvaWQgMCYmKHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PU9iamVjdC5hc3NpZ24oe30sdC5tb3JwaFRhcmdldERpY3Rpb25hcnkpKSx0aGlzLm1hdGVyaWFsPUFycmF5LmlzQXJyYXkodC5tYXRlcmlhbCk/dC5tYXRlcmlhbC5zbGljZSgpOnQubWF0ZXJpYWwsdGhpcy5nZW9tZXRyeT10Lmdlb21ldHJ5LHRoaXN9dXBkYXRlTW9ycGhUYXJnZXRzKCl7Y29uc3QgZT10aGlzLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcyxuPU9iamVjdC5rZXlzKGUpO2lmKG4ubGVuZ3RoPjApe2NvbnN0IHM9ZVtuWzBdXTtpZihzIT09dm9pZCAwKXt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1bXSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT17fTtmb3IobGV0IHI9MCxvPXMubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9c1tyXS5uYW1lfHxTdHJpbmcocik7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCgwKSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVthXT1yfX19fWdldFZlcnRleFBvc2l0aW9uKHQsZSl7Y29uc3Qgbj10aGlzLmdlb21ldHJ5LHM9bi5hdHRyaWJ1dGVzLnBvc2l0aW9uLHI9bi5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24sbz1uLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2UuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLHQpO2NvbnN0IGE9dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM7aWYociYmYSl7VHMuc2V0KDAsMCwwKTtmb3IobGV0IGM9MCxsPXIubGVuZ3RoO2M8bDtjKyspe2NvbnN0IGg9YVtjXSx1PXJbY107aCE9PTAmJihDby5mcm9tQnVmZmVyQXR0cmlidXRlKHUsdCksbz9Ucy5hZGRTY2FsZWRWZWN0b3IoQ28saCk6VHMuYWRkU2NhbGVkVmVjdG9yKENvLnN1YihlKSxoKSl9ZS5hZGQoVHMpfXJldHVybiBlfXJheWNhc3QodCxlKXtjb25zdCBuPXRoaXMuZ2VvbWV0cnkscz10aGlzLm1hdGVyaWFsLHI9dGhpcy5tYXRyaXhXb3JsZDtzIT09dm9pZCAwJiYobi5ib3VuZGluZ1NwaGVyZT09PW51bGwmJm4uY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksU3MuY29weShuLmJvdW5kaW5nU3BoZXJlKSxTcy5hcHBseU1hdHJpeDQocikscG4uY29weSh0LnJheSkucmVjYXN0KHQubmVhciksIShTcy5jb250YWluc1BvaW50KHBuLm9yaWdpbik9PT0hMSYmKHBuLmludGVyc2VjdFNwaGVyZShTcyxxYyk9PT1udWxsfHxwbi5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQocWMpPndpKHQuZmFyLXQubmVhciwyKSkpJiYoVWMuY29weShyKS5pbnZlcnQoKSxwbi5jb3B5KHQucmF5KS5hcHBseU1hdHJpeDQoVWMpLCEobi5ib3VuZGluZ0JveCE9PW51bGwmJnBuLmludGVyc2VjdHNCb3gobi5ib3VuZGluZ0JveCk9PT0hMSkmJnRoaXMuX2NvbXB1dGVJbnRlcnNlY3Rpb25zKHQsZSxwbikpKX1fY29tcHV0ZUludGVyc2VjdGlvbnModCxlLG4pe2xldCBzO2NvbnN0IHI9dGhpcy5nZW9tZXRyeSxvPXRoaXMubWF0ZXJpYWwsYT1yLmluZGV4LGM9ci5hdHRyaWJ1dGVzLnBvc2l0aW9uLGw9ci5hdHRyaWJ1dGVzLnV2LGg9ci5hdHRyaWJ1dGVzLnV2MSx1PXIuYXR0cmlidXRlcy5ub3JtYWwsZj1yLmdyb3VwcyxkPXIuZHJhd1JhbmdlO2lmKGEhPT1udWxsKWlmKEFycmF5LmlzQXJyYXkobykpZm9yKGxldCBwPTAseT1mLmxlbmd0aDtwPHk7cCsrKXtjb25zdCBtPWZbcF0sZz1vW20ubWF0ZXJpYWxJbmRleF0sYj1NYXRoLm1heChtLnN0YXJ0LGQuc3RhcnQpLHg9TWF0aC5taW4oYS5jb3VudCxNYXRoLm1pbihtLnN0YXJ0K20uY291bnQsZC5zdGFydCtkLmNvdW50KSk7Zm9yKGxldCB3PWIsTT14O3c8TTt3Kz0zKXtjb25zdCBBPWEuZ2V0WCh3KSxTPWEuZ2V0WCh3KzEpLF89YS5nZXRYKHcrMik7cz1Dcyh0aGlzLGcsdCxuLGwsaCx1LEEsUyxfKSxzJiYocy5mYWNlSW5kZXg9TWF0aC5mbG9vcih3LzMpLHMuZmFjZS5tYXRlcmlhbEluZGV4PW0ubWF0ZXJpYWxJbmRleCxlLnB1c2gocykpfX1lbHNle2NvbnN0IHA9TWF0aC5tYXgoMCxkLnN0YXJ0KSx5PU1hdGgubWluKGEuY291bnQsZC5zdGFydCtkLmNvdW50KTtmb3IobGV0IG09cCxnPXk7bTxnO20rPTMpe2NvbnN0IGI9YS5nZXRYKG0pLHg9YS5nZXRYKG0rMSksdz1hLmdldFgobSsyKTtzPUNzKHRoaXMsbyx0LG4sbCxoLHUsYix4LHcpLHMmJihzLmZhY2VJbmRleD1NYXRoLmZsb29yKG0vMyksZS5wdXNoKHMpKX19ZWxzZSBpZihjIT09dm9pZCAwKWlmKEFycmF5LmlzQXJyYXkobykpZm9yKGxldCBwPTAseT1mLmxlbmd0aDtwPHk7cCsrKXtjb25zdCBtPWZbcF0sZz1vW20ubWF0ZXJpYWxJbmRleF0sYj1NYXRoLm1heChtLnN0YXJ0LGQuc3RhcnQpLHg9TWF0aC5taW4oYy5jb3VudCxNYXRoLm1pbihtLnN0YXJ0K20uY291bnQsZC5zdGFydCtkLmNvdW50KSk7Zm9yKGxldCB3PWIsTT14O3c8TTt3Kz0zKXtjb25zdCBBPXcsUz13KzEsXz13KzI7cz1Dcyh0aGlzLGcsdCxuLGwsaCx1LEEsUyxfKSxzJiYocy5mYWNlSW5kZXg9TWF0aC5mbG9vcih3LzMpLHMuZmFjZS5tYXRlcmlhbEluZGV4PW0ubWF0ZXJpYWxJbmRleCxlLnB1c2gocykpfX1lbHNle2NvbnN0IHA9TWF0aC5tYXgoMCxkLnN0YXJ0KSx5PU1hdGgubWluKGMuY291bnQsZC5zdGFydCtkLmNvdW50KTtmb3IobGV0IG09cCxnPXk7bTxnO20rPTMpe2NvbnN0IGI9bSx4PW0rMSx3PW0rMjtzPUNzKHRoaXMsbyx0LG4sbCxoLHUsYix4LHcpLHMmJihzLmZhY2VJbmRleD1NYXRoLmZsb29yKG0vMyksZS5wdXNoKHMpKX19fX1mdW5jdGlvbiBUZihpLHQsZSxuLHMscixvLGEpe2xldCBjO2lmKHQuc2lkZT09PTE/Yz1uLmludGVyc2VjdFRyaWFuZ2xlKG8scixzLCEwLGEpOmM9bi5pbnRlcnNlY3RUcmlhbmdsZShzLHIsbyx0LnNpZGU9PT0wLGEpLGM9PT1udWxsKXJldHVybiBudWxsO1BzLmNvcHkoYSksUHMuYXBwbHlNYXRyaXg0KGkubWF0cml4V29ybGQpO2NvbnN0IGw9ZS5yYXkub3JpZ2luLmRpc3RhbmNlVG8oUHMpO3JldHVybiBsPGUubmVhcnx8bD5lLmZhcj9udWxsOntkaXN0YW5jZTpsLHBvaW50OlBzLmNsb25lKCksb2JqZWN0Oml9fWZ1bmN0aW9uIENzKGksdCxlLG4scyxyLG8sYSxjLGwpe2kuZ2V0VmVydGV4UG9zaXRpb24oYSx2cyksaS5nZXRWZXJ0ZXhQb3NpdGlvbihjLF9zKSxpLmdldFZlcnRleFBvc2l0aW9uKGwsenMpO2NvbnN0IGg9VGYoaSx0LGUsbix2cyxfcyx6cyxYYyk7aWYoaCl7Y29uc3QgdT1uZXcgVDt0dC5nZXRCYXJ5Y29vcmQoWGMsdnMsX3MsenMsdSkscyYmKGgudXY9dHQuZ2V0SW50ZXJwb2xhdGVkQXR0cmlidXRlKHMsYSxjLGwsdSxuZXcgTikpLHImJihoLnV2MT10dC5nZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUocixhLGMsbCx1LG5ldyBOKSksbyYmKGgubm9ybWFsPXR0LmdldEludGVycG9sYXRlZEF0dHJpYnV0ZShvLGEsYyxsLHUsbmV3IFQpLGgubm9ybWFsLmRvdChuLmRpcmVjdGlvbik+MCYmaC5ub3JtYWwubXVsdGlwbHlTY2FsYXIoLTEpKTtjb25zdCBmPXthLGI6YyxjOmwsbm9ybWFsOm5ldyBULG1hdGVyaWFsSW5kZXg6MH07dHQuZ2V0Tm9ybWFsKHZzLF9zLHpzLGYubm9ybWFsKSxoLmZhY2U9ZixoLmJhcnljb29yZD11fXJldHVybiBofWNvbnN0IEVvPW5ldyBULFBmPW5ldyBULENmPW5ldyBnZTtjbGFzcyBCb3tjb25zdHJ1Y3Rvcih0PW5ldyBUKDEsMCwwKSxlPTApe3RoaXMuaXNQbGFuZT0hMCx0aGlzLm5vcm1hbD10LHRoaXMuY29uc3RhbnQ9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWwuY29weSh0KSx0aGlzLmNvbnN0YW50PWUsdGhpc31zZXRDb21wb25lbnRzKHQsZSxuLHMpe3JldHVybiB0aGlzLm5vcm1hbC5zZXQodCxlLG4pLHRoaXMuY29uc3RhbnQ9cyx0aGlzfXNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodCksdGhpcy5jb25zdGFudD0tZS5kb3QodGhpcy5ub3JtYWwpLHRoaXN9c2V0RnJvbUNvcGxhbmFyUG9pbnRzKHQsZSxuKXtjb25zdCBzPUVvLnN1YlZlY3RvcnMobixlKS5jcm9zcyhQZi5zdWJWZWN0b3JzKHQsZSkpLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KHMsdCksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQubm9ybWFsKSx0aGlzLmNvbnN0YW50PXQuY29uc3RhbnQsdGhpc31ub3JtYWxpemUoKXtjb25zdCB0PTEvdGhpcy5ub3JtYWwubGVuZ3RoKCk7cmV0dXJuIHRoaXMubm9ybWFsLm11bHRpcGx5U2NhbGFyKHQpLHRoaXMuY29uc3RhbnQqPXQsdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy5jb25zdGFudCo9LTEsdGhpcy5ub3JtYWwubmVnYXRlKCksdGhpc31kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHRoaXMubm9ybWFsLmRvdCh0KSt0aGlzLmNvbnN0YW50fWRpc3RhbmNlVG9TcGhlcmUodCl7cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KHQuY2VudGVyKS10LnJhZGl1c31wcm9qZWN0UG9pbnQodCxlKXtyZXR1cm4gZS5jb3B5KHQpLmFkZFNjYWxlZFZlY3Rvcih0aGlzLm5vcm1hbCwtdGhpcy5kaXN0YW5jZVRvUG9pbnQodCkpfWludGVyc2VjdExpbmUodCxlKXtjb25zdCBuPXQuZGVsdGEoRW8pLHM9dGhpcy5ub3JtYWwuZG90KG4pO2lmKHM9PT0wKXJldHVybiB0aGlzLmRpc3RhbmNlVG9Qb2ludCh0LnN0YXJ0KT09PTA/ZS5jb3B5KHQuc3RhcnQpOm51bGw7Y29uc3Qgcj0tKHQuc3RhcnQuZG90KHRoaXMubm9ybWFsKSt0aGlzLmNvbnN0YW50KS9zO3JldHVybiByPDB8fHI+MT9udWxsOmUuY29weSh0LnN0YXJ0KS5hZGRTY2FsZWRWZWN0b3IobixyKX1pbnRlcnNlY3RzTGluZSh0KXtjb25zdCBlPXRoaXMuZGlzdGFuY2VUb1BvaW50KHQuc3RhcnQpLG49dGhpcy5kaXN0YW5jZVRvUG9pbnQodC5lbmQpO3JldHVybiBlPDAmJm4+MHx8bjwwJiZlPjB9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzUGxhbmUodGhpcyl9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzUGxhbmUodGhpcyl9Y29wbGFuYXJQb2ludCh0KXtyZXR1cm4gdC5jb3B5KHRoaXMubm9ybWFsKS5tdWx0aXBseVNjYWxhcigtdGhpcy5jb25zdGFudCl9YXBwbHlNYXRyaXg0KHQsZSl7Y29uc3Qgbj1lfHxDZi5nZXROb3JtYWxNYXRyaXgodCkscz10aGlzLmNvcGxhbmFyUG9pbnQoRW8pLmFwcGx5TWF0cml4NCh0KSxyPXRoaXMubm9ybWFsLmFwcGx5TWF0cml4MyhuKS5ub3JtYWxpemUoKTtyZXR1cm4gdGhpcy5jb25zdGFudD0tcy5kb3QociksdGhpc310cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMuY29uc3RhbnQtPXQuZG90KHRoaXMubm9ybWFsKSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5ub3JtYWwuZXF1YWxzKHRoaXMubm9ybWFsKSYmdC5jb25zdGFudD09PXRoaXMuY29uc3RhbnR9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1jbGFzcyB3ZXtjb25zdHJ1Y3Rvcigpe3RoaXMudHlwZT0iQ3VydmUiLHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPTIwMCx0aGlzLm5lZWRzVXBkYXRlPSExLHRoaXMuY2FjaGVBcmNMZW5ndGhzPW51bGx9Z2V0UG9pbnQoKXtNdCgiQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRlZC4iKX1nZXRQb2ludEF0KHQsZSl7Y29uc3Qgbj10aGlzLmdldFV0b1RtYXBwaW5nKHQpO3JldHVybiB0aGlzLmdldFBvaW50KG4sZSl9Z2V0UG9pbnRzKHQ9NSl7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPD10O24rKyllLnB1c2godGhpcy5nZXRQb2ludChuL3QpKTtyZXR1cm4gZX1nZXRTcGFjZWRQb2ludHModD01KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248PXQ7bisrKWUucHVzaCh0aGlzLmdldFBvaW50QXQobi90KSk7cmV0dXJuIGV9Z2V0TGVuZ3RoKCl7Y29uc3QgdD10aGlzLmdldExlbmd0aHMoKTtyZXR1cm4gdFt0Lmxlbmd0aC0xXX1nZXRMZW5ndGhzKHQ9dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMpe2lmKHRoaXMuY2FjaGVBcmNMZW5ndGhzJiZ0aGlzLmNhY2hlQXJjTGVuZ3Rocy5sZW5ndGg9PT10KzEmJiF0aGlzLm5lZWRzVXBkYXRlKXJldHVybiB0aGlzLmNhY2hlQXJjTGVuZ3Roczt0aGlzLm5lZWRzVXBkYXRlPSExO2NvbnN0IGU9W107bGV0IG4scz10aGlzLmdldFBvaW50KDApLHI9MDtlLnB1c2goMCk7Zm9yKGxldCBvPTE7bzw9dDtvKyspbj10aGlzLmdldFBvaW50KG8vdCkscis9bi5kaXN0YW5jZVRvKHMpLGUucHVzaChyKSxzPW47cmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzPWUsZX11cGRhdGVBcmNMZW5ndGhzKCl7dGhpcy5uZWVkc1VwZGF0ZT0hMCx0aGlzLmdldExlbmd0aHMoKX1nZXRVdG9UbWFwcGluZyh0LGU9bnVsbCl7Y29uc3Qgbj10aGlzLmdldExlbmd0aHMoKTtsZXQgcz0wO2NvbnN0IHI9bi5sZW5ndGg7bGV0IG87ZT9vPWU6bz10Km5bci0xXTtsZXQgYT0wLGM9ci0xLGw7Zm9yKDthPD1jOylpZihzPU1hdGguZmxvb3IoYSsoYy1hKS8yKSxsPW5bc10tbyxsPDApYT1zKzE7ZWxzZSBpZihsPjApYz1zLTE7ZWxzZXtjPXM7YnJlYWt9aWYocz1jLG5bc109PT1vKXJldHVybiBzLyhyLTEpO2NvbnN0IGg9bltzXSxmPW5bcysxXS1oLGQ9KG8taCkvZjtyZXR1cm4ocytkKS8oci0xKX1nZXRUYW5nZW50KHQsZSl7bGV0IHM9dC0xZS00LHI9dCsxZS00O3M8MCYmKHM9MCkscj4xJiYocj0xKTtjb25zdCBvPXRoaXMuZ2V0UG9pbnQocyksYT10aGlzLmdldFBvaW50KHIpLGM9ZXx8KG8uaXNWZWN0b3IyP25ldyBOOm5ldyBUKTtyZXR1cm4gYy5jb3B5KGEpLnN1YihvKS5ub3JtYWxpemUoKSxjfWdldFRhbmdlbnRBdCh0LGUpe2NvbnN0IG49dGhpcy5nZXRVdG9UbWFwcGluZyh0KTtyZXR1cm4gdGhpcy5nZXRUYW5nZW50KG4sZSl9Y29tcHV0ZUZyZW5ldEZyYW1lcyh0LGU9ITEpe2NvbnN0IG49bmV3IFQscz1bXSxyPVtdLG89W10sYT1uZXcgVCxjPW5ldyBzdDtmb3IobGV0IGQ9MDtkPD10O2QrKyl7Y29uc3QgcD1kL3Q7c1tkXT10aGlzLmdldFRhbmdlbnRBdChwLG5ldyBUKX1yWzBdPW5ldyBULG9bMF09bmV3IFQ7bGV0IGw9TnVtYmVyLk1BWF9WQUxVRTtjb25zdCBoPU1hdGguYWJzKHNbMF0ueCksdT1NYXRoLmFicyhzWzBdLnkpLGY9TWF0aC5hYnMoc1swXS56KTtoPD1sJiYobD1oLG4uc2V0KDEsMCwwKSksdTw9bCYmKGw9dSxuLnNldCgwLDEsMCkpLGY8PWwmJm4uc2V0KDAsMCwxKSxhLmNyb3NzVmVjdG9ycyhzWzBdLG4pLm5vcm1hbGl6ZSgpLHJbMF0uY3Jvc3NWZWN0b3JzKHNbMF0sYSksb1swXS5jcm9zc1ZlY3RvcnMoc1swXSxyWzBdKTtmb3IobGV0IGQ9MTtkPD10O2QrKyl7aWYocltkXT1yW2QtMV0uY2xvbmUoKSxvW2RdPW9bZC0xXS5jbG9uZSgpLGEuY3Jvc3NWZWN0b3JzKHNbZC0xXSxzW2RdKSxhLmxlbmd0aCgpPk51bWJlci5FUFNJTE9OKXthLm5vcm1hbGl6ZSgpO2NvbnN0IHA9TWF0aC5hY29zKFooc1tkLTFdLmRvdChzW2RdKSwtMSwxKSk7cltkXS5hcHBseU1hdHJpeDQoYy5tYWtlUm90YXRpb25BeGlzKGEscCkpfW9bZF0uY3Jvc3NWZWN0b3JzKHNbZF0scltkXSl9aWYoZT09PSEwKXtsZXQgZD1NYXRoLmFjb3MoWihyWzBdLmRvdChyW3RdKSwtMSwxKSk7ZC89dCxzWzBdLmRvdChhLmNyb3NzVmVjdG9ycyhyWzBdLHJbdF0pKT4wJiYoZD0tZCk7Zm9yKGxldCBwPTE7cDw9dDtwKyspcltwXS5hcHBseU1hdHJpeDQoYy5tYWtlUm90YXRpb25BeGlzKHNbcF0sZCpwKSksb1twXS5jcm9zc1ZlY3RvcnMoc1twXSxyW3BdKX1yZXR1cm57dGFuZ2VudHM6cyxub3JtYWxzOnIsYmlub3JtYWxzOm99fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz10LmFyY0xlbmd0aERpdmlzaW9ucyx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNyx0eXBlOiJDdXJ2ZSIsZ2VuZXJhdG9yOiJDdXJ2ZS50b0pTT04ifX07cmV0dXJuIHQuYXJjTGVuZ3RoRGl2aXNpb25zPXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zLHQudHlwZT10aGlzLnR5cGUsdH1mcm9tSlNPTih0KXtyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9dC5hcmNMZW5ndGhEaXZpc2lvbnMsdGhpc319Y2xhc3MgRXMgZXh0ZW5kcyB3ZXtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MSxzPTEscj0wLG89TWF0aC5QSSoyLGE9ITEsYz0wKXtzdXBlcigpLHRoaXMuaXNFbGxpcHNlQ3VydmU9ITAsdGhpcy50eXBlPSJFbGxpcHNlQ3VydmUiLHRoaXMuYVg9dCx0aGlzLmFZPWUsdGhpcy54UmFkaXVzPW4sdGhpcy55UmFkaXVzPXMsdGhpcy5hU3RhcnRBbmdsZT1yLHRoaXMuYUVuZEFuZ2xlPW8sdGhpcy5hQ2xvY2t3aXNlPWEsdGhpcy5hUm90YXRpb249Y31nZXRQb2ludCh0LGU9bmV3IE4pe2NvbnN0IG49ZSxzPU1hdGguUEkqMjtsZXQgcj10aGlzLmFFbmRBbmdsZS10aGlzLmFTdGFydEFuZ2xlO2NvbnN0IG89TWF0aC5hYnMocik8TnVtYmVyLkVQU0lMT047Zm9yKDtyPDA7KXIrPXM7Zm9yKDtyPnM7KXItPXM7cjxOdW1iZXIuRVBTSUxPTiYmKG8/cj0wOnI9cyksdGhpcy5hQ2xvY2t3aXNlPT09ITAmJiFvJiYocj09PXM/cj0tczpyPXItcyk7Y29uc3QgYT10aGlzLmFTdGFydEFuZ2xlK3QqcjtsZXQgYz10aGlzLmFYK3RoaXMueFJhZGl1cypNYXRoLmNvcyhhKSxsPXRoaXMuYVkrdGhpcy55UmFkaXVzKk1hdGguc2luKGEpO2lmKHRoaXMuYVJvdGF0aW9uIT09MCl7Y29uc3QgaD1NYXRoLmNvcyh0aGlzLmFSb3RhdGlvbiksdT1NYXRoLnNpbih0aGlzLmFSb3RhdGlvbiksZj1jLXRoaXMuYVgsZD1sLXRoaXMuYVk7Yz1mKmgtZCp1K3RoaXMuYVgsbD1mKnUrZCpoK3RoaXMuYVl9cmV0dXJuIG4uc2V0KGMsbCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmFYPXQuYVgsdGhpcy5hWT10LmFZLHRoaXMueFJhZGl1cz10LnhSYWRpdXMsdGhpcy55UmFkaXVzPXQueVJhZGl1cyx0aGlzLmFTdGFydEFuZ2xlPXQuYVN0YXJ0QW5nbGUsdGhpcy5hRW5kQW5nbGU9dC5hRW5kQW5nbGUsdGhpcy5hQ2xvY2t3aXNlPXQuYUNsb2Nrd2lzZSx0aGlzLmFSb3RhdGlvbj10LmFSb3RhdGlvbix0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQuYVg9dGhpcy5hWCx0LmFZPXRoaXMuYVksdC54UmFkaXVzPXRoaXMueFJhZGl1cyx0LnlSYWRpdXM9dGhpcy55UmFkaXVzLHQuYVN0YXJ0QW5nbGU9dGhpcy5hU3RhcnRBbmdsZSx0LmFFbmRBbmdsZT10aGlzLmFFbmRBbmdsZSx0LmFDbG9ja3dpc2U9dGhpcy5hQ2xvY2t3aXNlLHQuYVJvdGF0aW9uPXRoaXMuYVJvdGF0aW9uLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMuYVg9dC5hWCx0aGlzLmFZPXQuYVksdGhpcy54UmFkaXVzPXQueFJhZGl1cyx0aGlzLnlSYWRpdXM9dC55UmFkaXVzLHRoaXMuYVN0YXJ0QW5nbGU9dC5hU3RhcnRBbmdsZSx0aGlzLmFFbmRBbmdsZT10LmFFbmRBbmdsZSx0aGlzLmFDbG9ja3dpc2U9dC5hQ2xvY2t3aXNlLHRoaXMuYVJvdGF0aW9uPXQuYVJvdGF0aW9uLHRoaXN9fWNsYXNzIEdjIGV4dGVuZHMgRXN7Y29uc3RydWN0b3IodCxlLG4scyxyLG8pe3N1cGVyKHQsZSxuLG4scyxyLG8pLHRoaXMuaXNBcmNDdXJ2ZT0hMCx0aGlzLnR5cGU9IkFyY0N1cnZlIn19ZnVuY3Rpb24gRm8oKXtsZXQgaT0wLHQ9MCxlPTAsbj0wO2Z1bmN0aW9uIHMocixvLGEsYyl7aT1yLHQ9YSxlPS0zKnIrMypvLTIqYS1jLG49MipyLTIqbythK2N9cmV0dXJue2luaXRDYXRtdWxsUm9tOmZ1bmN0aW9uKHIsbyxhLGMsbCl7cyhvLGEsbCooYS1yKSxsKihjLW8pKX0saW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tOmZ1bmN0aW9uKHIsbyxhLGMsbCxoLHUpe2xldCBmPShvLXIpL2wtKGEtcikvKGwraCkrKGEtbykvaCxkPShhLW8pL2gtKGMtbykvKGgrdSkrKGMtYSkvdTtmKj1oLGQqPWgscyhvLGEsZixkKX0sY2FsYzpmdW5jdGlvbihyKXtjb25zdCBvPXIqcixhPW8qcjtyZXR1cm4gaSt0KnIrZSpvK24qYX19fWNvbnN0IEJzPW5ldyBULElvPW5ldyBGbyxrbz1uZXcgRm8sTm89bmV3IEZvO2NsYXNzIFpjIGV4dGVuZHMgd2V7Y29uc3RydWN0b3IodD1bXSxlPSExLG49ImNlbnRyaXBldGFsIixzPS41KXtzdXBlcigpLHRoaXMuaXNDYXRtdWxsUm9tQ3VydmUzPSEwLHRoaXMudHlwZT0iQ2F0bXVsbFJvbUN1cnZlMyIsdGhpcy5wb2ludHM9dCx0aGlzLmNsb3NlZD1lLHRoaXMuY3VydmVUeXBlPW4sdGhpcy50ZW5zaW9uPXN9Z2V0UG9pbnQodCxlPW5ldyBUKXtjb25zdCBuPWUscz10aGlzLnBvaW50cyxyPXMubGVuZ3RoLG89KHItKHRoaXMuY2xvc2VkPzA6MSkpKnQ7bGV0IGE9TWF0aC5mbG9vcihvKSxjPW8tYTt0aGlzLmNsb3NlZD9hKz1hPjA/MDooTWF0aC5mbG9vcihNYXRoLmFicyhhKS9yKSsxKSpyOmM9PT0wJiZhPT09ci0xJiYoYT1yLTIsYz0xKTtsZXQgbCxoO3RoaXMuY2xvc2VkfHxhPjA/bD1zWyhhLTEpJXJdOihCcy5zdWJWZWN0b3JzKHNbMF0sc1sxXSkuYWRkKHNbMF0pLGw9QnMpO2NvbnN0IHU9c1thJXJdLGY9c1soYSsxKSVyXTtpZih0aGlzLmNsb3NlZHx8YSsyPHI/aD1zWyhhKzIpJXJdOihCcy5zdWJWZWN0b3JzKHNbci0xXSxzW3ItMl0pLmFkZChzW3ItMV0pLGg9QnMpLHRoaXMuY3VydmVUeXBlPT09ImNlbnRyaXBldGFsInx8dGhpcy5jdXJ2ZVR5cGU9PT0iY2hvcmRhbCIpe2NvbnN0IGQ9dGhpcy5jdXJ2ZVR5cGU9PT0iY2hvcmRhbCI/LjU6LjI1O2xldCBwPU1hdGgucG93KGwuZGlzdGFuY2VUb1NxdWFyZWQodSksZCkseT1NYXRoLnBvdyh1LmRpc3RhbmNlVG9TcXVhcmVkKGYpLGQpLG09TWF0aC5wb3coZi5kaXN0YW5jZVRvU3F1YXJlZChoKSxkKTt5PDFlLTQmJih5PTEpLHA8MWUtNCYmKHA9eSksbTwxZS00JiYobT15KSxJby5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20obC54LHUueCxmLngsaC54LHAseSxtKSxrby5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20obC55LHUueSxmLnksaC55LHAseSxtKSxOby5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20obC56LHUueixmLnosaC56LHAseSxtKX1lbHNlIHRoaXMuY3VydmVUeXBlPT09ImNhdG11bGxyb20iJiYoSW8uaW5pdENhdG11bGxSb20obC54LHUueCxmLngsaC54LHRoaXMudGVuc2lvbiksa28uaW5pdENhdG11bGxSb20obC55LHUueSxmLnksaC55LHRoaXMudGVuc2lvbiksTm8uaW5pdENhdG11bGxSb20obC56LHUueixmLnosaC56LHRoaXMudGVuc2lvbikpO3JldHVybiBuLnNldChJby5jYWxjKGMpLGtvLmNhbGMoYyksTm8uY2FsYyhjKSksbn1jb3B5KHQpe3N1cGVyLmNvcHkodCksdGhpcy5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10LnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10LnBvaW50c1tlXTt0aGlzLnBvaW50cy5wdXNoKHMuY2xvbmUoKSl9cmV0dXJuIHRoaXMuY2xvc2VkPXQuY2xvc2VkLHRoaXMuY3VydmVUeXBlPXQuY3VydmVUeXBlLHRoaXMudGVuc2lvbj10LnRlbnNpb24sdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dGhpcy5wb2ludHNbZV07dC5wb2ludHMucHVzaChzLnRvQXJyYXkoKSl9cmV0dXJuIHQuY2xvc2VkPXRoaXMuY2xvc2VkLHQuY3VydmVUeXBlPXRoaXMuY3VydmVUeXBlLHQudGVuc2lvbj10aGlzLnRlbnNpb24sdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQucG9pbnRzW2VdO3RoaXMucG9pbnRzLnB1c2gobmV3IFQoKS5mcm9tQXJyYXkocykpfXJldHVybiB0aGlzLmNsb3NlZD10LmNsb3NlZCx0aGlzLmN1cnZlVHlwZT10LmN1cnZlVHlwZSx0aGlzLnRlbnNpb249dC50ZW5zaW9uLHRoaXN9fWZ1bmN0aW9uIFdjKGksdCxlLG4scyl7Y29uc3Qgcj0obi10KSouNSxvPShzLWUpKi41LGE9aSppLGM9aSphO3JldHVybigyKmUtMipuK3IrbykqYysoLTMqZSszKm4tMipyLW8pKmErcippK2V9ZnVuY3Rpb24gRWYoaSx0KXtjb25zdCBlPTEtaTtyZXR1cm4gZSplKnR9ZnVuY3Rpb24gQmYoaSx0KXtyZXR1cm4gMiooMS1pKSppKnR9ZnVuY3Rpb24gRmYoaSx0KXtyZXR1cm4gaSppKnR9ZnVuY3Rpb24gVGkoaSx0LGUsbil7cmV0dXJuIEVmKGksdCkrQmYoaSxlKStGZihpLG4pfWZ1bmN0aW9uIElmKGksdCl7Y29uc3QgZT0xLWk7cmV0dXJuIGUqZSplKnR9ZnVuY3Rpb24ga2YoaSx0KXtjb25zdCBlPTEtaTtyZXR1cm4gMyplKmUqaSp0fWZ1bmN0aW9uIE5mKGksdCl7cmV0dXJuIDMqKDEtaSkqaSppKnR9ZnVuY3Rpb24gUmYoaSx0KXtyZXR1cm4gaSppKmkqdH1mdW5jdGlvbiBQaShpLHQsZSxuLHMpe3JldHVybiBJZihpLHQpK2tmKGksZSkrTmYoaSxuKStSZihpLHMpfWNsYXNzIFJvIGV4dGVuZHMgd2V7Y29uc3RydWN0b3IodD1uZXcgTixlPW5ldyBOLG49bmV3IE4scz1uZXcgTil7c3VwZXIoKSx0aGlzLmlzQ3ViaWNCZXppZXJDdXJ2ZT0hMCx0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1uLHRoaXMudjM9c31nZXRQb2ludCh0LGU9bmV3IE4pe2NvbnN0IG49ZSxzPXRoaXMudjAscj10aGlzLnYxLG89dGhpcy52MixhPXRoaXMudjM7cmV0dXJuIG4uc2V0KFBpKHQscy54LHIueCxvLngsYS54KSxQaSh0LHMueSxyLnksby55LGEueSkpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYwLmNvcHkodC52MCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzLnYzLmNvcHkodC52MyksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0LnYzPXRoaXMudjMudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjAuZnJvbUFycmF5KHQudjApLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXMudjMuZnJvbUFycmF5KHQudjMpLHRoaXN9fWNsYXNzIEhjIGV4dGVuZHMgd2V7Y29uc3RydWN0b3IodD1uZXcgVCxlPW5ldyBULG49bmV3IFQscz1uZXcgVCl7c3VwZXIoKSx0aGlzLmlzQ3ViaWNCZXppZXJDdXJ2ZTM9ITAsdGhpcy50eXBlPSJDdWJpY0JlemllckN1cnZlMyIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW4sdGhpcy52Mz1zfWdldFBvaW50KHQsZT1uZXcgVCl7Y29uc3Qgbj1lLHM9dGhpcy52MCxyPXRoaXMudjEsbz10aGlzLnYyLGE9dGhpcy52MztyZXR1cm4gbi5zZXQoUGkodCxzLngsci54LG8ueCxhLngpLFBpKHQscy55LHIueSxvLnksYS55KSxQaSh0LHMueixyLnosby56LGEueikpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYwLmNvcHkodC52MCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzLnYzLmNvcHkodC52MyksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0LnYzPXRoaXMudjMudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjAuZnJvbUFycmF5KHQudjApLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXMudjMuZnJvbUFycmF5KHQudjMpLHRoaXN9fWNsYXNzIExvIGV4dGVuZHMgd2V7Y29uc3RydWN0b3IodD1uZXcgTixlPW5ldyBOKXtzdXBlcigpLHRoaXMuaXNMaW5lQ3VydmU9ITAsdGhpcy50eXBlPSJMaW5lQ3VydmUiLHRoaXMudjE9dCx0aGlzLnYyPWV9Z2V0UG9pbnQodCxlPW5ldyBOKXtjb25zdCBuPWU7cmV0dXJuIHQ9PT0xP24uY29weSh0aGlzLnYyKToobi5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSxuLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnYxKSksbn1nZXRQb2ludEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQodCxlKX1nZXRUYW5nZW50KHQsZT1uZXcgTil7cmV0dXJuIGUuc3ViVmVjdG9ycyh0aGlzLnYyLHRoaXMudjEpLm5vcm1hbGl6ZSgpfWdldFRhbmdlbnRBdCh0LGUpe3JldHVybiB0aGlzLmdldFRhbmdlbnQodCxlKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpc319Y2xhc3MgSmMgZXh0ZW5kcyB3ZXtjb25zdHJ1Y3Rvcih0PW5ldyBULGU9bmV3IFQpe3N1cGVyKCksdGhpcy5pc0xpbmVDdXJ2ZTM9ITAsdGhpcy50eXBlPSJMaW5lQ3VydmUzIix0aGlzLnYxPXQsdGhpcy52Mj1lfWdldFBvaW50KHQsZT1uZXcgVCl7Y29uc3Qgbj1lO3JldHVybiB0PT09MT9uLmNvcHkodGhpcy52Mik6KG4uY29weSh0aGlzLnYyKS5zdWIodGhpcy52MSksbi5tdWx0aXBseVNjYWxhcih0KS5hZGQodGhpcy52MSkpLG59Z2V0UG9pbnRBdCh0LGUpe3JldHVybiB0aGlzLmdldFBvaW50KHQsZSl9Z2V0VGFuZ2VudCh0LGU9bmV3IFQpe3JldHVybiBlLnN1YlZlY3RvcnModGhpcy52Mix0aGlzLnYxKS5ub3JtYWxpemUoKX1nZXRUYW5nZW50QXQodCxlKXtyZXR1cm4gdGhpcy5nZXRUYW5nZW50KHQsZSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXN9fWNsYXNzIE9vIGV4dGVuZHMgd2V7Y29uc3RydWN0b3IodD1uZXcgTixlPW5ldyBOLG49bmV3IE4pe3N1cGVyKCksdGhpcy5pc1F1YWRyYXRpY0JlemllckN1cnZlPSEwLHRoaXMudHlwZT0iUXVhZHJhdGljQmV6aWVyQ3VydmUiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1ufWdldFBvaW50KHQsZT1uZXcgTil7Y29uc3Qgbj1lLHM9dGhpcy52MCxyPXRoaXMudjEsbz10aGlzLnYyO3JldHVybiBuLnNldChUaSh0LHMueCxyLngsby54KSxUaSh0LHMueSxyLnksby55KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MD10aGlzLnYwLnRvQXJyYXkoKSx0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpc319Y2xhc3MgWWMgZXh0ZW5kcyB3ZXtjb25zdHJ1Y3Rvcih0PW5ldyBULGU9bmV3IFQsbj1uZXcgVCl7c3VwZXIoKSx0aGlzLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUzPSEwLHRoaXMudHlwZT0iUXVhZHJhdGljQmV6aWVyQ3VydmUzIix0aGlzLnYwPXQsdGhpcy52MT1lLHRoaXMudjI9bn1nZXRQb2ludCh0LGU9bmV3IFQpe2NvbnN0IG49ZSxzPXRoaXMudjAscj10aGlzLnYxLG89dGhpcy52MjtyZXR1cm4gbi5zZXQoVGkodCxzLngsci54LG8ueCksVGkodCxzLnksci55LG8ueSksVGkodCxzLnosci56LG8ueikpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYwLmNvcHkodC52MCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjAuZnJvbUFycmF5KHQudjApLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXN9fWNsYXNzIERvIGV4dGVuZHMgd2V7Y29uc3RydWN0b3IodD1bXSl7c3VwZXIoKSx0aGlzLmlzU3BsaW5lQ3VydmU9ITAsdGhpcy50eXBlPSJTcGxpbmVDdXJ2ZSIsdGhpcy5wb2ludHM9dH1nZXRQb2ludCh0LGU9bmV3IE4pe2NvbnN0IG49ZSxzPXRoaXMucG9pbnRzLHI9KHMubGVuZ3RoLTEpKnQsbz1NYXRoLmZsb29yKHIpLGE9ci1vLGM9c1tvPT09MD9vOm8tMV0sbD1zW29dLGg9c1tvPnMubGVuZ3RoLTI/cy5sZW5ndGgtMTpvKzFdLHU9c1tvPnMubGVuZ3RoLTM/cy5sZW5ndGgtMTpvKzJdO3JldHVybiBuLnNldChXYyhhLGMueCxsLngsaC54LHUueCksV2MoYSxjLnksbC55LGgueSx1LnkpKSxufWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQucG9pbnRzW2VdO3RoaXMucG9pbnRzLnB1c2gocy5jbG9uZSgpKX1yZXR1cm4gdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dGhpcy5wb2ludHNbZV07dC5wb2ludHMucHVzaChzLnRvQXJyYXkoKSl9cmV0dXJuIHR9ZnJvbUpTT04odCl7c3VwZXIuZnJvbUpTT04odCksdGhpcy5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10LnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10LnBvaW50c1tlXTt0aGlzLnBvaW50cy5wdXNoKG5ldyBOKCkuZnJvbUFycmF5KHMpKX1yZXR1cm4gdGhpc319dmFyIGpjPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEFyY0N1cnZlOkdjLENhdG11bGxSb21DdXJ2ZTM6WmMsQ3ViaWNCZXppZXJDdXJ2ZTpSbyxDdWJpY0JlemllckN1cnZlMzpIYyxFbGxpcHNlQ3VydmU6RXMsTGluZUN1cnZlOkxvLExpbmVDdXJ2ZTM6SmMsUXVhZHJhdGljQmV6aWVyQ3VydmU6T28sUXVhZHJhdGljQmV6aWVyQ3VydmUzOlljLFNwbGluZUN1cnZlOkRvfSk7Y2xhc3MgTGYgZXh0ZW5kcyB3ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy50eXBlPSJDdXJ2ZVBhdGgiLHRoaXMuY3VydmVzPVtdLHRoaXMuYXV0b0Nsb3NlPSExfWFkZCh0KXt0aGlzLmN1cnZlcy5wdXNoKHQpfWNsb3NlUGF0aCgpe2NvbnN0IHQ9dGhpcy5jdXJ2ZXNbMF0uZ2V0UG9pbnQoMCksZT10aGlzLmN1cnZlc1t0aGlzLmN1cnZlcy5sZW5ndGgtMV0uZ2V0UG9pbnQoMSk7aWYoIXQuZXF1YWxzKGUpKXtjb25zdCBuPXQuaXNWZWN0b3IyPT09ITA/IkxpbmVDdXJ2ZSI6IkxpbmVDdXJ2ZTMiO3RoaXMuY3VydmVzLnB1c2gobmV3IGpjW25dKGUsdCkpfXJldHVybiB0aGlzfWdldFBvaW50KHQsZSl7Y29uc3Qgbj10KnRoaXMuZ2V0TGVuZ3RoKCkscz10aGlzLmdldEN1cnZlTGVuZ3RocygpO2xldCByPTA7Zm9yKDtyPHMubGVuZ3RoOyl7aWYoc1tyXT49bil7Y29uc3Qgbz1zW3JdLW4sYT10aGlzLmN1cnZlc1tyXSxjPWEuZ2V0TGVuZ3RoKCksbD1jPT09MD8wOjEtby9jO3JldHVybiBhLmdldFBvaW50QXQobCxlKX1yKyt9cmV0dXJuIG51bGx9Z2V0TGVuZ3RoKCl7Y29uc3QgdD10aGlzLmdldEN1cnZlTGVuZ3RocygpO3JldHVybiB0W3QubGVuZ3RoLTFdfXVwZGF0ZUFyY0xlbmd0aHMoKXt0aGlzLm5lZWRzVXBkYXRlPSEwLHRoaXMuY2FjaGVMZW5ndGhzPW51bGwsdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKX1nZXRDdXJ2ZUxlbmd0aHMoKXtpZih0aGlzLmNhY2hlTGVuZ3RocyYmdGhpcy5jYWNoZUxlbmd0aHMubGVuZ3RoPT09dGhpcy5jdXJ2ZXMubGVuZ3RoKXJldHVybiB0aGlzLmNhY2hlTGVuZ3Rocztjb25zdCB0PVtdO2xldCBlPTA7Zm9yKGxldCBuPTAscz10aGlzLmN1cnZlcy5sZW5ndGg7bjxzO24rKyllKz10aGlzLmN1cnZlc1tuXS5nZXRMZW5ndGgoKSx0LnB1c2goZSk7cmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzPXQsdH1nZXRTcGFjZWRQb2ludHModD00MCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPD10O24rKyllLnB1c2godGhpcy5nZXRQb2ludChuL3QpKTtyZXR1cm4gdGhpcy5hdXRvQ2xvc2UmJmUucHVzaChlWzBdKSxlfWdldFBvaW50cyh0PTEyKXtjb25zdCBlPVtdO2xldCBuO2ZvcihsZXQgcz0wLHI9dGhpcy5jdXJ2ZXM7czxyLmxlbmd0aDtzKyspe2NvbnN0IG89cltzXSxhPW8uaXNFbGxpcHNlQ3VydmU/dCoyOm8uaXNMaW5lQ3VydmV8fG8uaXNMaW5lQ3VydmUzPzE6by5pc1NwbGluZUN1cnZlP3Qqby5wb2ludHMubGVuZ3RoOnQsYz1vLmdldFBvaW50cyhhKTtmb3IobGV0IGw9MDtsPGMubGVuZ3RoO2wrKyl7Y29uc3QgaD1jW2xdO24mJm4uZXF1YWxzKGgpfHwoZS5wdXNoKGgpLG49aCl9fXJldHVybiB0aGlzLmF1dG9DbG9zZSYmZS5sZW5ndGg+MSYmIWVbZS5sZW5ndGgtMV0uZXF1YWxzKGVbMF0pJiZlLnB1c2goZVswXSksZX1jb3B5KHQpe3N1cGVyLmNvcHkodCksdGhpcy5jdXJ2ZXM9W107Zm9yKGxldCBlPTAsbj10LmN1cnZlcy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10LmN1cnZlc1tlXTt0aGlzLmN1cnZlcy5wdXNoKHMuY2xvbmUoKSl9cmV0dXJuIHRoaXMuYXV0b0Nsb3NlPXQuYXV0b0Nsb3NlLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTt0LmF1dG9DbG9zZT10aGlzLmF1dG9DbG9zZSx0LmN1cnZlcz1bXTtmb3IobGV0IGU9MCxuPXRoaXMuY3VydmVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXRoaXMuY3VydmVzW2VdO3QuY3VydmVzLnB1c2gocy50b0pTT04oKSl9cmV0dXJuIHR9ZnJvbUpTT04odCl7c3VwZXIuZnJvbUpTT04odCksdGhpcy5hdXRvQ2xvc2U9dC5hdXRvQ2xvc2UsdGhpcy5jdXJ2ZXM9W107Zm9yKGxldCBlPTAsbj10LmN1cnZlcy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10LmN1cnZlc1tlXTt0aGlzLmN1cnZlcy5wdXNoKG5ldyBqY1tzLnR5cGVdKCkuZnJvbUpTT04ocykpfXJldHVybiB0aGlzfX1sZXQgUWM9Y2xhc3MgZXh0ZW5kcyBMZntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iUGF0aCIsdGhpcy5jdXJyZW50UG9pbnQ9bmV3IE4sdCYmdGhpcy5zZXRGcm9tUG9pbnRzKHQpfXNldEZyb21Qb2ludHModCl7dGhpcy5tb3ZlVG8odFswXS54LHRbMF0ueSk7Zm9yKGxldCBlPTEsbj10Lmxlbmd0aDtlPG47ZSsrKXRoaXMubGluZVRvKHRbZV0ueCx0W2VdLnkpO3JldHVybiB0aGlzfW1vdmVUbyh0LGUpe3JldHVybiB0aGlzLmN1cnJlbnRQb2ludC5zZXQodCxlKSx0aGlzfWxpbmVUbyh0LGUpe2NvbnN0IG49bmV3IExvKHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksbmV3IE4odCxlKSk7cmV0dXJuIHRoaXMuY3VydmVzLnB1c2gobiksdGhpcy5jdXJyZW50UG9pbnQuc2V0KHQsZSksdGhpc31xdWFkcmF0aWNDdXJ2ZVRvKHQsZSxuLHMpe2NvbnN0IHI9bmV3IE9vKHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksbmV3IE4odCxlKSxuZXcgTihuLHMpKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChyKSx0aGlzLmN1cnJlbnRQb2ludC5zZXQobixzKSx0aGlzfWJlemllckN1cnZlVG8odCxlLG4scyxyLG8pe2NvbnN0IGE9bmV3IFJvKHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksbmV3IE4odCxlKSxuZXcgTihuLHMpLG5ldyBOKHIsbykpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKGEpLHRoaXMuY3VycmVudFBvaW50LnNldChyLG8pLHRoaXN9c3BsaW5lVGhydSh0KXtjb25zdCBlPVt0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpXS5jb25jYXQodCksbj1uZXcgRG8oZSk7cmV0dXJuIHRoaXMuY3VydmVzLnB1c2gobiksdGhpcy5jdXJyZW50UG9pbnQuY29weSh0W3QubGVuZ3RoLTFdKSx0aGlzfWFyYyh0LGUsbixzLHIsbyl7Y29uc3QgYT10aGlzLmN1cnJlbnRQb2ludC54LGM9dGhpcy5jdXJyZW50UG9pbnQueTtyZXR1cm4gdGhpcy5hYnNhcmModCthLGUrYyxuLHMscixvKSx0aGlzfWFic2FyYyh0LGUsbixzLHIsbyl7cmV0dXJuIHRoaXMuYWJzZWxsaXBzZSh0LGUsbixuLHMscixvKSx0aGlzfWVsbGlwc2UodCxlLG4scyxyLG8sYSxjKXtjb25zdCBsPXRoaXMuY3VycmVudFBvaW50LngsaD10aGlzLmN1cnJlbnRQb2ludC55O3JldHVybiB0aGlzLmFic2VsbGlwc2UodCtsLGUraCxuLHMscixvLGEsYyksdGhpc31hYnNlbGxpcHNlKHQsZSxuLHMscixvLGEsYyl7Y29uc3QgbD1uZXcgRXModCxlLG4scyxyLG8sYSxjKTtpZih0aGlzLmN1cnZlcy5sZW5ndGg+MCl7Y29uc3QgdT1sLmdldFBvaW50KDApO3UuZXF1YWxzKHRoaXMuY3VycmVudFBvaW50KXx8dGhpcy5saW5lVG8odS54LHUueSl9dGhpcy5jdXJ2ZXMucHVzaChsKTtjb25zdCBoPWwuZ2V0UG9pbnQoMSk7cmV0dXJuIHRoaXMuY3VycmVudFBvaW50LmNvcHkoaCksdGhpc31jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuY3VycmVudFBvaW50LmNvcHkodC5jdXJyZW50UG9pbnQpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5jdXJyZW50UG9pbnQ9dGhpcy5jdXJyZW50UG9pbnQudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMuY3VycmVudFBvaW50LmZyb21BcnJheSh0LmN1cnJlbnRQb2ludCksdGhpc319O2NsYXNzIEtjIGV4dGVuZHMgUWN7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy51dWlkPWtuKCksdGhpcy50eXBlPSJTaGFwZSIsdGhpcy5ob2xlcz1bXX1nZXRQb2ludHNIb2xlcyh0KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wLHM9dGhpcy5ob2xlcy5sZW5ndGg7bjxzO24rKyllW25dPXRoaXMuaG9sZXNbbl0uZ2V0UG9pbnRzKHQpO3JldHVybiBlfWV4dHJhY3RQb2ludHModCl7cmV0dXJue3NoYXBlOnRoaXMuZ2V0UG9pbnRzKHQpLGhvbGVzOnRoaXMuZ2V0UG9pbnRzSG9sZXModCl9fWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLmhvbGVzPVtdO2ZvcihsZXQgZT0wLG49dC5ob2xlcy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10LmhvbGVzW2VdO3RoaXMuaG9sZXMucHVzaChzLmNsb25lKCkpfXJldHVybiB0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC51dWlkPXRoaXMudXVpZCx0LmhvbGVzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5ob2xlcy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10aGlzLmhvbGVzW2VdO3QuaG9sZXMucHVzaChzLnRvSlNPTigpKX1yZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLnV1aWQ9dC51dWlkLHRoaXMuaG9sZXM9W107Zm9yKGxldCBlPTAsbj10LmhvbGVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQuaG9sZXNbZV07dGhpcy5ob2xlcy5wdXNoKG5ldyBRYygpLmZyb21KU09OKHMpKX1yZXR1cm4gdGhpc319ZnVuY3Rpb24gT2YoaSx0LGU9Mil7Y29uc3Qgbj10JiZ0Lmxlbmd0aCxzPW4/dFswXSplOmkubGVuZ3RoO2xldCByPXRsKGksMCxzLGUsITApO2NvbnN0IG89W107aWYoIXJ8fHIubmV4dD09PXIucHJldilyZXR1cm4gbztsZXQgYSxjLGw7aWYobiYmKHI9cWYoaSx0LHIsZSkpLGkubGVuZ3RoPjgwKmUpe2E9aVswXSxjPWlbMV07bGV0IGg9YSx1PWM7Zm9yKGxldCBmPWU7ZjxzO2YrPWUpe2NvbnN0IGQ9aVtmXSxwPWlbZisxXTtkPGEmJihhPWQpLHA8YyYmKGM9cCksZD5oJiYoaD1kKSxwPnUmJih1PXApfWw9TWF0aC5tYXgoaC1hLHUtYyksbD1sIT09MD8zMjc2Ny9sOjB9cmV0dXJuIENpKHIsbyxlLGEsYyxsLDApLG99ZnVuY3Rpb24gdGwoaSx0LGUsbixzKXtsZXQgcjtpZihzPT09dGQoaSx0LGUsbik+MClmb3IobGV0IG89dDtvPGU7bys9bilyPXNsKG8vbnwwLGlbb10saVtvKzFdLHIpO2Vsc2UgZm9yKGxldCBvPWUtbjtvPj10O28tPW4pcj1zbChvL258MCxpW29dLGlbbysxXSxyKTtyZXR1cm4gciYmWm4ocixyLm5leHQpJiYoRmkocikscj1yLm5leHQpLHJ9ZnVuY3Rpb24geW4oaSx0KXtpZighaSlyZXR1cm4gaTt0fHwodD1pKTtsZXQgZT1pLG47ZG8gaWYobj0hMSwhZS5zdGVpbmVyJiYoWm4oZSxlLm5leHQpfHxydChlLnByZXYsZSxlLm5leHQpPT09MCkpe2lmKEZpKGUpLGU9dD1lLnByZXYsZT09PWUubmV4dClicmVhaztuPSEwfWVsc2UgZT1lLm5leHQ7d2hpbGUobnx8ZSE9PXQpO3JldHVybiB0fWZ1bmN0aW9uIENpKGksdCxlLG4scyxyLG8pe2lmKCFpKXJldHVybjshbyYmciYmSGYoaSxuLHMscik7bGV0IGE9aTtmb3IoO2kucHJldiE9PWkubmV4dDspe2NvbnN0IGM9aS5wcmV2LGw9aS5uZXh0O2lmKHI/JGYoaSxuLHMscik6RGYoaSkpe3QucHVzaChjLmksaS5pLGwuaSksRmkoaSksaT1sLm5leHQsYT1sLm5leHQ7Y29udGludWV9aWYoaT1sLGk9PT1hKXtvP289PT0xPyhpPVZmKHluKGkpLHQpLENpKGksdCxlLG4scyxyLDIpKTpvPT09MiYmVWYoaSx0LGUsbixzLHIpOkNpKHluKGkpLHQsZSxuLHMsciwxKTticmVha319fWZ1bmN0aW9uIERmKGkpe2NvbnN0IHQ9aS5wcmV2LGU9aSxuPWkubmV4dDtpZihydCh0LGUsbik+PTApcmV0dXJuITE7Y29uc3Qgcz10Lngscj1lLngsbz1uLngsYT10LnksYz1lLnksbD1uLnksaD1NYXRoLm1pbihzLHIsbyksdT1NYXRoLm1pbihhLGMsbCksZj1NYXRoLm1heChzLHIsbyksZD1NYXRoLm1heChhLGMsbCk7bGV0IHA9bi5uZXh0O2Zvcig7cCE9PXQ7KXtpZihwLng+PWgmJnAueDw9ZiYmcC55Pj11JiZwLnk8PWQmJkVpKHMsYSxyLGMsbyxsLHAueCxwLnkpJiZydChwLnByZXYscCxwLm5leHQpPj0wKXJldHVybiExO3A9cC5uZXh0fXJldHVybiEwfWZ1bmN0aW9uICRmKGksdCxlLG4pe2NvbnN0IHM9aS5wcmV2LHI9aSxvPWkubmV4dDtpZihydChzLHIsbyk+PTApcmV0dXJuITE7Y29uc3QgYT1zLngsYz1yLngsbD1vLngsaD1zLnksdT1yLnksZj1vLnksZD1NYXRoLm1pbihhLGMsbCkscD1NYXRoLm1pbihoLHUsZikseT1NYXRoLm1heChhLGMsbCksbT1NYXRoLm1heChoLHUsZiksZz0kbyhkLHAsdCxlLG4pLGI9JG8oeSxtLHQsZSxuKTtsZXQgeD1pLnByZXZaLHc9aS5uZXh0Wjtmb3IoO3gmJnguej49ZyYmdyYmdy56PD1iOyl7aWYoeC54Pj1kJiZ4Lng8PXkmJngueT49cCYmeC55PD1tJiZ4IT09cyYmeCE9PW8mJkVpKGEsaCxjLHUsbCxmLHgueCx4LnkpJiZydCh4LnByZXYseCx4Lm5leHQpPj0wfHwoeD14LnByZXZaLHcueD49ZCYmdy54PD15JiZ3Lnk+PXAmJncueTw9bSYmdyE9PXMmJnchPT1vJiZFaShhLGgsYyx1LGwsZix3Lngsdy55KSYmcnQody5wcmV2LHcsdy5uZXh0KT49MCkpcmV0dXJuITE7dz13Lm5leHRafWZvcig7eCYmeC56Pj1nOyl7aWYoeC54Pj1kJiZ4Lng8PXkmJngueT49cCYmeC55PD1tJiZ4IT09cyYmeCE9PW8mJkVpKGEsaCxjLHUsbCxmLHgueCx4LnkpJiZydCh4LnByZXYseCx4Lm5leHQpPj0wKXJldHVybiExO3g9eC5wcmV2Wn1mb3IoO3cmJncuejw9Yjspe2lmKHcueD49ZCYmdy54PD15JiZ3Lnk+PXAmJncueTw9bSYmdyE9PXMmJnchPT1vJiZFaShhLGgsYyx1LGwsZix3Lngsdy55KSYmcnQody5wcmV2LHcsdy5uZXh0KT49MClyZXR1cm4hMTt3PXcubmV4dFp9cmV0dXJuITB9ZnVuY3Rpb24gVmYoaSx0KXtsZXQgZT1pO2Rve2NvbnN0IG49ZS5wcmV2LHM9ZS5uZXh0Lm5leHQ7IVpuKG4scykmJm5sKG4sZSxlLm5leHQscykmJkJpKG4scykmJkJpKHMsbikmJih0LnB1c2gobi5pLGUuaSxzLmkpLEZpKGUpLEZpKGUubmV4dCksZT1pPXMpLGU9ZS5uZXh0fXdoaWxlKGUhPT1pKTtyZXR1cm4geW4oZSl9ZnVuY3Rpb24gVWYoaSx0LGUsbixzLHIpe2xldCBvPWk7ZG97bGV0IGE9by5uZXh0Lm5leHQ7Zm9yKDthIT09by5wcmV2Oyl7aWYoby5pIT09YS5pJiZqZihvLGEpKXtsZXQgYz1pbChvLGEpO289eW4obyxvLm5leHQpLGM9eW4oYyxjLm5leHQpLENpKG8sdCxlLG4scyxyLDApLENpKGMsdCxlLG4scyxyLDApO3JldHVybn1hPWEubmV4dH1vPW8ubmV4dH13aGlsZShvIT09aSl9ZnVuY3Rpb24gcWYoaSx0LGUsbil7Y29uc3Qgcz1bXTtmb3IobGV0IHI9MCxvPXQubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9dFtyXSpuLGM9cjxvLTE/dFtyKzFdKm46aS5sZW5ndGgsbD10bChpLGEsYyxuLCExKTtsPT09bC5uZXh0JiYobC5zdGVpbmVyPSEwKSxzLnB1c2goWWYobCkpfXMuc29ydChYZik7Zm9yKGxldCByPTA7cjxzLmxlbmd0aDtyKyspZT1HZihzW3JdLGUpO3JldHVybiBlfWZ1bmN0aW9uIFhmKGksdCl7bGV0IGU9aS54LXQueDtpZihlPT09MCYmKGU9aS55LXQueSxlPT09MCkpe2NvbnN0IG49KGkubmV4dC55LWkueSkvKGkubmV4dC54LWkueCkscz0odC5uZXh0LnktdC55KS8odC5uZXh0LngtdC54KTtlPW4tc31yZXR1cm4gZX1mdW5jdGlvbiBHZihpLHQpe2NvbnN0IGU9WmYoaSx0KTtpZighZSlyZXR1cm4gdDtjb25zdCBuPWlsKGUsaSk7cmV0dXJuIHluKG4sbi5uZXh0KSx5bihlLGUubmV4dCl9ZnVuY3Rpb24gWmYoaSx0KXtsZXQgZT10O2NvbnN0IG49aS54LHM9aS55O2xldCByPS0xLzAsbztpZihabihpLGUpKXJldHVybiBlO2Rve2lmKFpuKGksZS5uZXh0KSlyZXR1cm4gZS5uZXh0O2lmKHM8PWUueSYmcz49ZS5uZXh0LnkmJmUubmV4dC55IT09ZS55KXtjb25zdCB1PWUueCsocy1lLnkpKihlLm5leHQueC1lLngpLyhlLm5leHQueS1lLnkpO2lmKHU8PW4mJnU+ciYmKHI9dSxvPWUueDxlLm5leHQueD9lOmUubmV4dCx1PT09bikpcmV0dXJuIG99ZT1lLm5leHR9d2hpbGUoZSE9PXQpO2lmKCFvKXJldHVybiBudWxsO2NvbnN0IGE9byxjPW8ueCxsPW8ueTtsZXQgaD0xLzA7ZT1vO2Rve2lmKG4+PWUueCYmZS54Pj1jJiZuIT09ZS54JiZlbChzPGw/bjpyLHMsYyxsLHM8bD9yOm4scyxlLngsZS55KSl7Y29uc3QgdT1NYXRoLmFicyhzLWUueSkvKG4tZS54KTtCaShlLGkpJiYodTxofHx1PT09aCYmKGUueD5vLnh8fGUueD09PW8ueCYmV2YobyxlKSkpJiYobz1lLGg9dSl9ZT1lLm5leHR9d2hpbGUoZSE9PWEpO3JldHVybiBvfWZ1bmN0aW9uIFdmKGksdCl7cmV0dXJuIHJ0KGkucHJldixpLHQucHJldik8MCYmcnQodC5uZXh0LGksaS5uZXh0KTwwfWZ1bmN0aW9uIEhmKGksdCxlLG4pe2xldCBzPWk7ZG8gcy56PT09MCYmKHMuej0kbyhzLngscy55LHQsZSxuKSkscy5wcmV2Wj1zLnByZXYscy5uZXh0Wj1zLm5leHQscz1zLm5leHQ7d2hpbGUocyE9PWkpO3MucHJldloubmV4dFo9bnVsbCxzLnByZXZaPW51bGwsSmYocyl9ZnVuY3Rpb24gSmYoaSl7bGV0IHQsZT0xO2Rve2xldCBuPWkscztpPW51bGw7bGV0IHI9bnVsbDtmb3IodD0wO247KXt0Kys7bGV0IG89bixhPTA7Zm9yKGxldCBsPTA7bDxlJiYoYSsrLG89by5uZXh0WiwhIW8pO2wrKyk7bGV0IGM9ZTtmb3IoO2E+MHx8Yz4wJiZvOylhIT09MCYmKGM9PT0wfHwhb3x8bi56PD1vLnopPyhzPW4sbj1uLm5leHRaLGEtLSk6KHM9byxvPW8ubmV4dFosYy0tKSxyP3IubmV4dFo9czppPXMscy5wcmV2Wj1yLHI9cztuPW99ci5uZXh0Wj1udWxsLGUqPTJ9d2hpbGUodD4xKTtyZXR1cm4gaX1mdW5jdGlvbiAkbyhpLHQsZSxuLHMpe3JldHVybiBpPShpLWUpKnN8MCx0PSh0LW4pKnN8MCxpPShpfGk8PDgpJjE2NzExOTM1LGk9KGl8aTw8NCkmMjUyNjQ1MTM1LGk9KGl8aTw8MikmODU4OTkzNDU5LGk9KGl8aTw8MSkmMTQzMTY1NTc2NSx0PSh0fHQ8PDgpJjE2NzExOTM1LHQ9KHR8dDw8NCkmMjUyNjQ1MTM1LHQ9KHR8dDw8MikmODU4OTkzNDU5LHQ9KHR8dDw8MSkmMTQzMTY1NTc2NSxpfHQ8PDF9ZnVuY3Rpb24gWWYoaSl7bGV0IHQ9aSxlPWk7ZG8odC54PGUueHx8dC54PT09ZS54JiZ0Lnk8ZS55KSYmKGU9dCksdD10Lm5leHQ7d2hpbGUodCE9PWkpO3JldHVybiBlfWZ1bmN0aW9uIGVsKGksdCxlLG4scyxyLG8sYSl7cmV0dXJuKHMtbykqKHQtYSk+PShpLW8pKihyLWEpJiYoaS1vKSoobi1hKT49KGUtbykqKHQtYSkmJihlLW8pKihyLWEpPj0ocy1vKSoobi1hKX1mdW5jdGlvbiBFaShpLHQsZSxuLHMscixvLGEpe3JldHVybiEoaT09PW8mJnQ9PT1hKSYmZWwoaSx0LGUsbixzLHIsbyxhKX1mdW5jdGlvbiBqZihpLHQpe3JldHVybiBpLm5leHQuaSE9PXQuaSYmaS5wcmV2LmkhPT10LmkmJiFRZihpLHQpJiYoQmkoaSx0KSYmQmkodCxpKSYmS2YoaSx0KSYmKHJ0KGkucHJldixpLHQucHJldil8fHJ0KGksdC5wcmV2LHQpKXx8Wm4oaSx0KSYmcnQoaS5wcmV2LGksaS5uZXh0KT4wJiZydCh0LnByZXYsdCx0Lm5leHQpPjApfWZ1bmN0aW9uIHJ0KGksdCxlKXtyZXR1cm4odC55LWkueSkqKGUueC10LngpLSh0LngtaS54KSooZS55LXQueSl9ZnVuY3Rpb24gWm4oaSx0KXtyZXR1cm4gaS54PT09dC54JiZpLnk9PT10Lnl9ZnVuY3Rpb24gbmwoaSx0LGUsbil7Y29uc3Qgcz1JcyhydChpLHQsZSkpLHI9SXMocnQoaSx0LG4pKSxvPUlzKHJ0KGUsbixpKSksYT1JcyhydChlLG4sdCkpO3JldHVybiEhKHMhPT1yJiZvIT09YXx8cz09PTAmJkZzKGksZSx0KXx8cj09PTAmJkZzKGksbix0KXx8bz09PTAmJkZzKGUsaSxuKXx8YT09PTAmJkZzKGUsdCxuKSl9ZnVuY3Rpb24gRnMoaSx0LGUpe3JldHVybiB0Lng8PU1hdGgubWF4KGkueCxlLngpJiZ0Lng+PU1hdGgubWluKGkueCxlLngpJiZ0Lnk8PU1hdGgubWF4KGkueSxlLnkpJiZ0Lnk+PU1hdGgubWluKGkueSxlLnkpfWZ1bmN0aW9uIElzKGkpe3JldHVybiBpPjA/MTppPDA/LTE6MH1mdW5jdGlvbiBRZihpLHQpe2xldCBlPWk7ZG97aWYoZS5pIT09aS5pJiZlLm5leHQuaSE9PWkuaSYmZS5pIT09dC5pJiZlLm5leHQuaSE9PXQuaSYmbmwoZSxlLm5leHQsaSx0KSlyZXR1cm4hMDtlPWUubmV4dH13aGlsZShlIT09aSk7cmV0dXJuITF9ZnVuY3Rpb24gQmkoaSx0KXtyZXR1cm4gcnQoaS5wcmV2LGksaS5uZXh0KTwwP3J0KGksdCxpLm5leHQpPj0wJiZydChpLGkucHJldix0KT49MDpydChpLHQsaS5wcmV2KTwwfHxydChpLGkubmV4dCx0KTwwfWZ1bmN0aW9uIEtmKGksdCl7bGV0IGU9aSxuPSExO2NvbnN0IHM9KGkueCt0LngpLzIscj0oaS55K3QueSkvMjtkbyBlLnk+ciE9ZS5uZXh0Lnk+ciYmZS5uZXh0LnkhPT1lLnkmJnM8KGUubmV4dC54LWUueCkqKHItZS55KS8oZS5uZXh0LnktZS55KStlLngmJihuPSFuKSxlPWUubmV4dDt3aGlsZShlIT09aSk7cmV0dXJuIG59ZnVuY3Rpb24gaWwoaSx0KXtjb25zdCBlPVZvKGkuaSxpLngsaS55KSxuPVZvKHQuaSx0LngsdC55KSxzPWkubmV4dCxyPXQucHJldjtyZXR1cm4gaS5uZXh0PXQsdC5wcmV2PWksZS5uZXh0PXMscy5wcmV2PWUsbi5uZXh0PWUsZS5wcmV2PW4sci5uZXh0PW4sbi5wcmV2PXIsbn1mdW5jdGlvbiBzbChpLHQsZSxuKXtjb25zdCBzPVZvKGksdCxlKTtyZXR1cm4gbj8ocy5uZXh0PW4ubmV4dCxzLnByZXY9bixuLm5leHQucHJldj1zLG4ubmV4dD1zKToocy5wcmV2PXMscy5uZXh0PXMpLHN9ZnVuY3Rpb24gRmkoaSl7aS5uZXh0LnByZXY9aS5wcmV2LGkucHJldi5uZXh0PWkubmV4dCxpLnByZXZaJiYoaS5wcmV2Wi5uZXh0Wj1pLm5leHRaKSxpLm5leHRaJiYoaS5uZXh0Wi5wcmV2Wj1pLnByZXZaKX1mdW5jdGlvbiBWbyhpLHQsZSl7cmV0dXJue2kseDp0LHk6ZSxwcmV2Om51bGwsbmV4dDpudWxsLHo6MCxwcmV2WjpudWxsLG5leHRaOm51bGwsc3RlaW5lcjohMX19ZnVuY3Rpb24gdGQoaSx0LGUsbil7bGV0IHM9MDtmb3IobGV0IHI9dCxvPWUtbjtyPGU7cis9bilzKz0oaVtvXS1pW3JdKSooaVtyKzFdK2lbbysxXSksbz1yO3JldHVybiBzfWNsYXNzIGVke3N0YXRpYyB0cmlhbmd1bGF0ZSh0LGUsbj0yKXtyZXR1cm4gT2YodCxlLG4pfX1jbGFzcyBXbntzdGF0aWMgYXJlYSh0KXtjb25zdCBlPXQubGVuZ3RoO2xldCBuPTA7Zm9yKGxldCBzPWUtMSxyPTA7cjxlO3M9cisrKW4rPXRbc10ueCp0W3JdLnktdFtyXS54KnRbc10ueTtyZXR1cm4gbiouNX1zdGF0aWMgaXNDbG9ja1dpc2UodCl7cmV0dXJuIFduLmFyZWEodCk8MH1zdGF0aWMgdHJpYW5ndWxhdGVTaGFwZSh0LGUpe2NvbnN0IG49W10scz1bXSxyPVtdO3JsKHQpLG9sKG4sdCk7bGV0IG89dC5sZW5ndGg7ZS5mb3JFYWNoKHJsKTtmb3IobGV0IGM9MDtjPGUubGVuZ3RoO2MrKylzLnB1c2gobyksbys9ZVtjXS5sZW5ndGgsb2wobixlW2NdKTtjb25zdCBhPWVkLnRyaWFuZ3VsYXRlKG4scyk7Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKz0zKXIucHVzaChhLnNsaWNlKGMsYyszKSk7cmV0dXJuIHJ9fWZ1bmN0aW9uIHJsKGkpe2NvbnN0IHQ9aS5sZW5ndGg7dD4yJiZpW3QtMV0uZXF1YWxzKGlbMF0pJiZpLnBvcCgpfWZ1bmN0aW9uIG9sKGksdCl7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspaS5wdXNoKHRbZV0ueCksaS5wdXNoKHRbZV0ueSl9Y2xhc3MgVW8gZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PTEsZT0xLG49MSxzPTEpe3N1cGVyKCksdGhpcy50eXBlPSJQbGFuZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOnQsaGVpZ2h0OmUsd2lkdGhTZWdtZW50czpuLGhlaWdodFNlZ21lbnRzOnN9O2NvbnN0IHI9dC8yLG89ZS8yLGE9TWF0aC5mbG9vcihuKSxjPU1hdGguZmxvb3IocyksbD1hKzEsaD1jKzEsdT10L2EsZj1lL2MsZD1bXSxwPVtdLHk9W10sbT1bXTtmb3IobGV0IGc9MDtnPGg7ZysrKXtjb25zdCBiPWcqZi1vO2ZvcihsZXQgeD0wO3g8bDt4Kyspe2NvbnN0IHc9eCp1LXI7cC5wdXNoKHcsLWIsMCkseS5wdXNoKDAsMCwxKSxtLnB1c2goeC9hKSxtLnB1c2goMS1nL2MpfX1mb3IobGV0IGc9MDtnPGM7ZysrKWZvcihsZXQgYj0wO2I8YTtiKyspe2NvbnN0IHg9YitsKmcsdz1iK2wqKGcrMSksTT1iKzErbCooZysxKSxBPWIrMStsKmc7ZC5wdXNoKHgsdyxBKSxkLnB1c2godyxNLEEpfXRoaXMuc2V0SW5kZXgoZCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgRmUocCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IEZlKHksMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IEZlKG0sMikpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IFVvKHQud2lkdGgsdC5oZWlnaHQsdC53aWR0aFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMpfX1jb25zdCBhbD1uZXcgVCxrcz1uZXcgVCxIbj1uZXcgVCxKbj1uZXcgVCxxbz1uZXcgVCxuZD1uZXcgVCxpZD1uZXcgVDtjbGFzcyBRdHtjb25zdHJ1Y3Rvcih0PW5ldyBULGU9bmV3IFQpe3RoaXMuc3RhcnQ9dCx0aGlzLmVuZD1lfXNldCh0LGUpe3JldHVybiB0aGlzLnN0YXJ0LmNvcHkodCksdGhpcy5lbmQuY29weShlKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMuc3RhcnQuY29weSh0LnN0YXJ0KSx0aGlzLmVuZC5jb3B5KHQuZW5kKSx0aGlzfWdldENlbnRlcih0KXtyZXR1cm4gdC5hZGRWZWN0b3JzKHRoaXMuc3RhcnQsdGhpcy5lbmQpLm11bHRpcGx5U2NhbGFyKC41KX1kZWx0YSh0KXtyZXR1cm4gdC5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpfWRpc3RhbmNlU3EoKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmVuZCl9ZGlzdGFuY2UoKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvKHRoaXMuZW5kKX1hdCh0LGUpe3JldHVybiB0aGlzLmRlbHRhKGUpLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnN0YXJ0KX1jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKHQsZSl7YWwuc3ViVmVjdG9ycyh0LHRoaXMuc3RhcnQpLGtzLnN1YlZlY3RvcnModGhpcy5lbmQsdGhpcy5zdGFydCk7Y29uc3Qgbj1rcy5kb3Qoa3MpO2xldCByPWtzLmRvdChhbCkvbjtyZXR1cm4gZSYmKHI9WihyLDAsMSkpLHJ9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUsbil7Y29uc3Qgcz10aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIodCxlKTtyZXR1cm4gdGhpcy5kZWx0YShuKS5tdWx0aXBseVNjYWxhcihzKS5hZGQodGhpcy5zdGFydCl9ZGlzdGFuY2VTcVRvTGluZTModCxlPW5kLG49aWQpe2NvbnN0IHM9MTAwMDAwMDAwMDAwMDAwMDFlLTMyO2xldCByLG87Y29uc3QgYT10aGlzLnN0YXJ0LGM9dC5zdGFydCxsPXRoaXMuZW5kLGg9dC5lbmQ7SG4uc3ViVmVjdG9ycyhsLGEpLEpuLnN1YlZlY3RvcnMoaCxjKSxxby5zdWJWZWN0b3JzKGEsYyk7Y29uc3QgdT1Ibi5kb3QoSG4pLGY9Sm4uZG90KEpuKSxkPUpuLmRvdChxbyk7aWYodTw9cyYmZjw9cylyZXR1cm4gZS5jb3B5KGEpLG4uY29weShjKSxlLnN1YihuKSxlLmRvdChlKTtpZih1PD1zKXI9MCxvPWQvZixvPVoobywwLDEpO2Vsc2V7Y29uc3QgcD1Ibi5kb3QocW8pO2lmKGY8PXMpbz0wLHI9WigtcC91LDAsMSk7ZWxzZXtjb25zdCB5PUhuLmRvdChKbiksbT11KmYteSp5O20hPT0wP3I9WigoeSpkLXAqZikvbSwwLDEpOnI9MCxvPSh5KnIrZCkvZixvPDA/KG89MCxyPVooLXAvdSwwLDEpKTpvPjEmJihvPTEscj1aKCh5LXApL3UsMCwxKSl9fXJldHVybiBlLmNvcHkoYSkuYWRkKEhuLm11bHRpcGx5U2NhbGFyKHIpKSxuLmNvcHkoYykuYWRkKEpuLm11bHRpcGx5U2NhbGFyKG8pKSxlLnN1YihuKSxlLmRvdChlKX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuc3RhcnQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuZW5kLmFwcGx5TWF0cml4NCh0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5zdGFydC5lcXVhbHModGhpcy5zdGFydCkmJnQuZW5kLmVxdWFscyh0aGlzLmVuZCl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX10eXBlb2YgX19USFJFRV9ERVZUT09MU19fIT0idW5kZWZpbmVkIiYmX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJyZWdpc3RlciIse2RldGFpbDp7cmV2aXNpb246Sn19KSksdHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJih3aW5kb3cuX19USFJFRV9fP010KCJXQVJOSU5HOiBNdWx0aXBsZSBpbnN0YW5jZXMgb2YgVGhyZWUuanMgYmVpbmcgaW1wb3J0ZWQuIik6d2luZG93Ll9fVEhSRUVfXz1KKTtjb25zdCBtbj1uZXcgTWFwLHNkPShpPXt9KT0+KHtnZW5lcmF0ZVRvcFVWKHQsZSxuLHMscil7Y29uc3Qgbz1lW24qM10sYT1lW24qMysxXSxjPWVbcyozXSxsPWVbcyozKzFdLGg9ZVtyKjNdLHU9ZVtyKjMrMV07bGV0IGY7aWYobW4uaGFzKHQpKWY9bW4uZ2V0KHQpO2Vsc2V7bGV0IG09aS5ib3gzO2lmKCFtKXttPW5ldyBtdDtjb25zdCB4PXQucGFyYW1ldGVycy5zaGFwZXMuZ2V0UG9pbnRzKCkubWFwKHc9Plt3Lngsdy55LDBdKS5mbGF0KCk7bS5zZXRGcm9tQXJyYXkoeCl9Y29uc3QgZz1tLmdldFNpemUobmV3IFQpO2kuc3BsaXQmJihnLnkvPWkuc3BsaXQpLGY9e2JveDptLHNpemU6Z30sbW4uc2V0KHQsZil9Y29uc3R7Ym94OmQsc2l6ZTpwfT1mLHk9aS5zcGxpdD8xLWkuc3BsaXQ6MDtyZXR1cm5bbmV3IE4oKG8tZC5taW4ueCkvcC54LChhLWQubWluLnkpL3AueSt5KSxuZXcgTigoYy1kLm1pbi54KS9wLngsKGwtZC5taW4ueSkvcC55K3kpLG5ldyBOKChoLWQubWluLngpL3AueCwodS1kLm1pbi55KS9wLnkreSldfSxnZW5lcmF0ZVNpZGVXYWxsVVYodCxlLG4scyxyLG8pe2NvbnN0IGE9ZVtuKjNdLGM9ZVtuKjMrMV0sbD1lW24qMysyXSxoPWVbcyozXSx1PWVbcyozKzFdLGY9ZVtzKjMrMl0sZD1lW3IqM10scD1lW3IqMysxXSx5PWVbciozKzJdLG09ZVtvKjNdLGc9ZVtvKjMrMV0sYj1lW28qMysyXTtsZXQgeDtpZihtbi5oYXMoZSkpeD1tbi5nZXQoZSk7ZWxzZXtjb25zdCBBPW5ldyBtdDtBLnNldEZyb21BcnJheShlKTtjb25zdCBTPUEuZ2V0U2l6ZShuZXcgVCk7aS5zcGxpdCYmKFMuei89MS1pLnNwbGl0KSxpLnNpZGVSZXBlYXQmJihTLnovPWkuc2lkZVJlcGVhdCkseD17Ym94OkEsc2l6ZTpTfSxtbi5zZXQoZSx4KX1jb25zdHtib3g6dyxzaXplOk19PXg7cmV0dXJuIE1hdGguYWJzKGMtdSk8TWF0aC5hYnMoYS1oKT9bbmV3IE4oKGEtdy5taW4ueCkvTS54LChsLXcubWluLnopL00ueiksbmV3IE4oKGgtdy5taW4ueCkvTS54LChmLXcubWluLnopL00ueiksbmV3IE4oKGQtdy5taW4ueCkvTS54LCh5LXcubWluLnopL00ueiksbmV3IE4oKG0tdy5taW4ueCkvTS54LChiLXcubWluLnopL00ueildOltuZXcgTigoYy13Lm1pbi55KS9NLnksKGwtdy5taW4ueikvTS56KSxuZXcgTigodS13Lm1pbi55KS9NLnksKGYtdy5taW4ueikvTS56KSxuZXcgTigocC13Lm1pbi55KS9NLnksKHktdy5taW4ueikvTS56KSxuZXcgTigoZy13Lm1pbi55KS9NLnksKGItdy5taW4ueikvTS56KV19fSkscmQ9KCk9Pnttbi5jbGVhcigpfSxvZD17QXJjQ3VydmU6R2MsQ2F0bXVsbFJvbUN1cnZlMzpaYyxDdWJpY0JlemllckN1cnZlOlJvLEN1YmljQmV6aWVyQ3VydmUzOkhjLEVsbGlwc2VDdXJ2ZTpFcyxMaW5lQ3VydmU6TG8sTGluZUN1cnZlMzpKYyxRdWFkcmF0aWNCZXppZXJDdXJ2ZTpPbyxRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6WWMsU3BsaW5lQ3VydmU6RG99O2NsYXNzIFluIGV4dGVuZHMgeGV7Y29uc3RydWN0b3IodD1uZXcgS2MoW25ldyBOKC41LC41KSxuZXcgTigtLjUsLjUpLG5ldyBOKC0uNSwtLjUpLG5ldyBOKC41LC0uNSldKSxlPXt9KXtzdXBlcigpLHRoaXMudHlwZT0iRXh0cnVkZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3NoYXBlczp0LG9wdGlvbnM6ZX0sdD1BcnJheS5pc0FycmF5KHQpP3Q6W3RdO2NvbnN0IG49dGhpcyxzPVtdLHI9W107Zm9yKGxldCBhPTAsYz10Lmxlbmd0aDthPGM7YSsrKXtjb25zdCBsPXRbYV07byhsKX10aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBGZShzLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBGZShyLDIpKSx0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7ZnVuY3Rpb24gbyhhKXt2YXIgWHUsR3UsWnU7Y29uc3QgYz1bXSxsPWUuY3VydmVTZWdtZW50cyE9PXZvaWQgMD9lLmN1cnZlU2VnbWVudHM6MTIsaD1lLnN0ZXBzIT09dm9pZCAwP2Uuc3RlcHM6MSx1PWUuZGVwdGghPT12b2lkIDA/ZS5kZXB0aDoxO2xldCBmPWUuYmV2ZWxFbmFibGVkIT09dm9pZCAwP2UuYmV2ZWxFbmFibGVkOiEwLGQ9ZS5iZXZlbFRoaWNrbmVzcyE9PXZvaWQgMD9lLmJldmVsVGhpY2tuZXNzOi4yLHA9ZS5iZXZlbFNpemUhPT12b2lkIDA/ZS5iZXZlbFNpemU6ZC0uMSx5PWUuYmV2ZWxPZmZzZXQhPT12b2lkIDA/ZS5iZXZlbE9mZnNldDowLG09ZS5iZXZlbFNlZ21lbnRzIT09dm9pZCAwP2UuYmV2ZWxTZWdtZW50czozO2NvbnN0IGc9ZS5leHRydWRlUGF0aCxiPWUuVVZHZW5lcmF0b3IhPT12b2lkIDA/ZS5VVkdlbmVyYXRvcjphZCx4PShYdT1lLmhhc1RvcCkhPW51bGw/WHU6ITAsdz0oR3U9ZS5oYXNCb3R0b20pIT1udWxsP0d1OiEwLE09KFp1PWUuaGFzU2lkZSkhPW51bGw/WnU6ITA7bGV0IEEsUz0hMSxfLHYsUCx6O2cmJihBPWcuZ2V0U3BhY2VkUG9pbnRzKGgpLFM9ITAsZj0hMSxfPWcuY29tcHV0ZUZyZW5ldEZyYW1lcyhoLCExKSx2PW5ldyBULFA9bmV3IFQsej1uZXcgVCksZnx8KG09MCxkPTAscD0wLHk9MCk7Y29uc3QgRT1hLmV4dHJhY3RQb2ludHMobCk7bGV0IEM9RS5zaGFwZTtjb25zdCBGPUUuaG9sZXM7aWYoIVduLmlzQ2xvY2tXaXNlKEMpKXtDPUMucmV2ZXJzZSgpO2ZvcihsZXQgaz0wLEw9Ri5sZW5ndGg7azxMO2srKyl7Y29uc3QgTz1GW2tdO1duLmlzQ2xvY2tXaXNlKE8pJiYoRltrXT1PLnJldmVyc2UoKSl9fWZ1bmN0aW9uIEkoayl7Y29uc3QgTz0xMDAwMDAwMDAwMDAwMDAwMWUtMzY7bGV0IFU9a1swXTtmb3IobGV0IEQ9MTtEPD1rLmxlbmd0aDtEKyspe2NvbnN0IFk9RCVrLmxlbmd0aCxXPWtbWV0saXQ9Vy54LVUueCxjdD1XLnktVS55LHd0PWl0Kml0K2N0KmN0LEh0PU1hdGgubWF4KE1hdGguYWJzKFcueCksTWF0aC5hYnMoVy55KSxNYXRoLmFicyhVLngpLE1hdGguYWJzKFUueSkpLEZuPU8qSHQqSHQ7aWYod3Q8PUZuKXtrLnNwbGljZShZLDEpLEQtLTtjb250aW51ZX1VPVd9fUkoQyksRi5mb3JFYWNoKEkpO2NvbnN0IFI9Ri5sZW5ndGgsJD1DO2ZvcihsZXQgaz0wO2s8UjtrKyspe2NvbnN0IEw9RltrXTtDPUMuY29uY2F0KEwpfWZ1bmN0aW9uIFYoayxMLE8pe3JldHVybiBMfHxlcnJvcigiRXh0cnVkZUdlb21ldHJ5OiB2ZWMgZG9lcyBub3QgZXhpc3QiKSxrLmNsb25lKCkuYWRkU2NhbGVkVmVjdG9yKEwsTyl9Y29uc3QgbnQ9Qy5sZW5ndGg7ZnVuY3Rpb24geHQoayxMLE8pe2xldCBVLEQsWTtjb25zdCBXPWsueC1MLngsaXQ9ay55LUwueSxjdD1PLngtay54LHd0PU8ueS1rLnksSHQ9VypXK2l0Kml0LEZuPVcqd3QtaXQqY3Q7aWYoTWF0aC5hYnMoRm4pPk51bWJlci5FUFNJTE9OKXtjb25zdCBKdD1NYXRoLnNxcnQoSHQpLFd1PU1hdGguc3FydChjdCpjdCt3dCp3dCksSHU9TC54LWl0L0p0LEp1PUwueStXL0p0LFJnPU8ueC13dC9XdSxMZz1PLnkrY3QvV3UsWXU9KChSZy1IdSkqd3QtKExnLUp1KSpjdCkvKFcqd3QtaXQqY3QpO1U9SHUrVypZdS1rLngsRD1KdStpdCpZdS1rLnk7Y29uc3QganU9VSpVK0QqRDtpZihqdTw9MilyZXR1cm4gbmV3IE4oVSxEKTtZPU1hdGguc3FydChqdS8yKX1lbHNle2xldCBKdD0hMTtXPk51bWJlci5FUFNJTE9OP2N0Pk51bWJlci5FUFNJTE9OJiYoSnQ9ITApOlc8LU51bWJlci5FUFNJTE9OP2N0PC1OdW1iZXIuRVBTSUxPTiYmKEp0PSEwKTpNYXRoLnNpZ24oaXQpPT09TWF0aC5zaWduKHd0KSYmKEp0PSEwKSxKdD8oVT0taXQsRD1XLFk9TWF0aC5zcXJ0KEh0KSk6KFU9VyxEPWl0LFk9TWF0aC5zcXJ0KEh0LzIpKX1yZXR1cm4gbmV3IE4oVS9ZLEQvWSl9Y29uc3Qgb2U9W107Zm9yKGxldCBrPTAsTD0kLmxlbmd0aCxPPUwtMSxVPWsrMTtrPEw7aysrLE8rKyxVKyspTz09PUwmJihPPTApLFU9PT1MJiYoVT0wKSxvZVtrXT14dCgkW2tdLCRbT10sJFtVXSk7Y29uc3QgWnQ9W107bGV0IFd0LG1lPW9lLmNvbmNhdCgpO2ZvcihsZXQgaz0wLEw9UjtrPEw7aysrKXtjb25zdCBPPUZba107V3Q9W107Zm9yKGxldCBVPTAsRD1PLmxlbmd0aCxZPUQtMSxXPVUrMTtVPEQ7VSsrLFkrKyxXKyspWT09PUQmJihZPTApLFc9PT1EJiYoVz0wKSxXdFtVXT14dChPW1VdLE9bWV0sT1tXXSk7WnQucHVzaChXdCksbWU9bWUuY29uY2F0KFd0KX1sZXQgQm47aWYobT09PTApQm49V24udHJpYW5ndWxhdGVTaGFwZSgkLEYpO2Vsc2V7Y29uc3Qgaz1bXSxMPVtdO2ZvcihsZXQgTz0wO088bTtPKyspe2NvbnN0IFU9Ty9tLEQ9ZCpNYXRoLmNvcyhVKk1hdGguUEkvMiksWT1wKk1hdGguc2luKFUqTWF0aC5QSS8yKSt5O2ZvcihsZXQgVz0wLGl0PSQubGVuZ3RoO1c8aXQ7VysrKXtjb25zdCBjdD1WKCRbV10sb2VbV10sWSk7R2UoY3QueCxjdC55LC1EKSxVPT09MCYmay5wdXNoKGN0KX1mb3IobGV0IFc9MCxpdD1SO1c8aXQ7VysrKXtjb25zdCBjdD1GW1ddO1d0PVp0W1ddO2NvbnN0IHd0PVtdO2ZvcihsZXQgSHQ9MCxGbj1jdC5sZW5ndGg7SHQ8Rm47SHQrKyl7Y29uc3QgSnQ9VihjdFtIdF0sV3RbSHRdLFkpO0dlKEp0LngsSnQueSwtRCksVT09PTAmJnd0LnB1c2goSnQpfVU9PT0wJiZMLnB1c2god3QpfX1Cbj1Xbi50cmlhbmd1bGF0ZVNoYXBlKGssTCl9Y29uc3QgZW89Qm4ubGVuZ3RoLFV1PXAreTtmb3IobGV0IGs9MDtrPG50O2srKyl7Y29uc3QgTD1mP1YoQ1trXSxtZVtrXSxVdSk6Q1trXTtTPyhQLmNvcHkoXy5ub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcihMLngpLHYuY29weShfLmJpbm9ybWFsc1swXSkubXVsdGlwbHlTY2FsYXIoTC55KSx6LmNvcHkoQVswXSkuYWRkKFApLmFkZCh2KSxHZSh6Lngsei55LHoueikpOkdlKEwueCxMLnksMCl9Zm9yKGxldCBrPTE7azw9aDtrKyspZm9yKGxldCBMPTA7TDxudDtMKyspe2NvbnN0IE89Zj9WKENbTF0sbWVbTF0sVXUpOkNbTF07Uz8oUC5jb3B5KF8ubm9ybWFsc1trXSkubXVsdGlwbHlTY2FsYXIoTy54KSx2LmNvcHkoXy5iaW5vcm1hbHNba10pLm11bHRpcGx5U2NhbGFyKE8ueSksei5jb3B5KEFba10pLmFkZChQKS5hZGQodiksR2Uoei54LHoueSx6LnopKTpHZShPLngsTy55LHUvaCprKX1mb3IobGV0IGs9bS0xO2s+PTA7ay0tKXtjb25zdCBMPWsvbSxPPWQqTWF0aC5jb3MoTCpNYXRoLlBJLzIpLFU9cCpNYXRoLnNpbihMKk1hdGguUEkvMikreTtmb3IobGV0IEQ9MCxZPSQubGVuZ3RoO0Q8WTtEKyspe2NvbnN0IFc9VigkW0RdLG9lW0RdLFUpO0dlKFcueCxXLnksdStPKX1mb3IobGV0IEQ9MCxZPUYubGVuZ3RoO0Q8WTtEKyspe2NvbnN0IFc9RltEXTtXdD1adFtEXTtmb3IobGV0IGl0PTAsY3Q9Vy5sZW5ndGg7aXQ8Y3Q7aXQrKyl7Y29uc3Qgd3Q9VihXW2l0XSxXdFtpdF0sVSk7Uz9HZSh3dC54LHd0LnkrQVtoLTFdLnksQVtoLTFdLngrTyk6R2Uod3QueCx3dC55LHUrTyl9fX1JZygpLE0mJmtnKCk7ZnVuY3Rpb24gSWcoKXtjb25zdCBrPXMubGVuZ3RoLzM7aWYoZil7bGV0IEw9MCxPPW50Kkw7aWYodylmb3IobGV0IFU9MDtVPGVvO1UrKyl7Y29uc3QgRD1CbltVXTtubyhEWzJdK08sRFsxXStPLERbMF0rTyl9aWYoTD1oK20qMixPPW50KkwseClmb3IobGV0IFU9MDtVPGVvO1UrKyl7Y29uc3QgRD1CbltVXTtubyhEWzBdK08sRFsxXStPLERbMl0rTyl9fWVsc2V7aWYodylmb3IobGV0IEw9MDtMPGVvO0wrKyl7Y29uc3QgTz1CbltMXTtubyhPWzJdLE9bMV0sT1swXSl9aWYoeClmb3IobGV0IEw9MDtMPGVvO0wrKyl7Y29uc3QgTz1CbltMXTtubyhPWzBdK250KmgsT1sxXStudCpoLE9bMl0rbnQqaCl9fW4uYWRkR3JvdXAoayxzLmxlbmd0aC8zLWssMCl9ZnVuY3Rpb24ga2coKXtjb25zdCBrPXMubGVuZ3RoLzM7bGV0IEw9MDtxdSgkLEwpLEwrPSQubGVuZ3RoO2ZvcihsZXQgTz0wLFU9Ri5sZW5ndGg7TzxVO08rKyl7Y29uc3QgRD1GW09dO3F1KEQsTCksTCs9RC5sZW5ndGh9bi5hZGRHcm91cChrLHMubGVuZ3RoLzMtaywxKX1mdW5jdGlvbiBxdShrLEwpe2xldCBPPWsubGVuZ3RoO2Zvcig7LS1PPj0wOyl7Y29uc3QgVT1PO2xldCBEPU8tMTtEPDAmJihEPWsubGVuZ3RoLTEpO2ZvcihsZXQgWT0wLFc9aCttKjI7WTxXO1krKyl7Y29uc3QgaXQ9bnQqWSxjdD1udCooWSsxKSx3dD1MK1UraXQsSHQ9TCtEK2l0LEZuPUwrRCtjdCxKdD1MK1UrY3Q7Tmcod3QsSHQsRm4sSnQpfX19ZnVuY3Rpb24gR2UoayxMLE8pe2MucHVzaChrKSxjLnB1c2goTCksYy5wdXNoKE8pfWZ1bmN0aW9uIG5vKGssTCxPKXtaZShrKSxaZShMKSxaZShPKTtjb25zdCBVPXMubGVuZ3RoLzMsRD1iLmdlbmVyYXRlVG9wVVYobixzLFUtMyxVLTIsVS0xKTtXZShEWzBdKSxXZShEWzFdKSxXZShEWzJdKX1mdW5jdGlvbiBOZyhrLEwsTyxVKXtaZShrKSxaZShMKSxaZShVKSxaZShMKSxaZShPKSxaZShVKTtjb25zdCBEPXMubGVuZ3RoLzMsWT1iLmdlbmVyYXRlU2lkZVdhbGxVVihuLHMsRC02LEQtMyxELTIsRC0xKTtXZShZWzBdKSxXZShZWzFdKSxXZShZWzNdKSxXZShZWzFdKSxXZShZWzJdKSxXZShZWzNdKX1mdW5jdGlvbiBaZShrKXtzLnB1c2goY1trKjMrMF0pLHMucHVzaChjW2sqMysxXSkscy5wdXNoKGNbayozKzJdKX1mdW5jdGlvbiBXZShrKXtyLnB1c2goay54KSxyLnB1c2goay55KX19fWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCksZT10aGlzLnBhcmFtZXRlcnMuc2hhcGVzLG49dGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnM7cmV0dXJuIGNkKGUsbix0KX1zdGF0aWMgZnJvbUpTT04odCxlKXtjb25zdCBuPVtdO2ZvcihsZXQgcj0wLG89dC5zaGFwZXMubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9ZVt0LnNoYXBlc1tyXV07bi5wdXNoKGEpfWNvbnN0IHM9dC5vcHRpb25zLmV4dHJ1ZGVQYXRoO3JldHVybiBzIT09dm9pZCAwJiYodC5vcHRpb25zLmV4dHJ1ZGVQYXRoPW5ldyBvZFtzLnR5cGVdKCkuZnJvbUpTT04ocykpLG5ldyBZbihuLHQub3B0aW9ucyl9fWNvbnN0IGFkPXtnZW5lcmF0ZVRvcFVWOmZ1bmN0aW9uKGksdCxlLG4scyl7Y29uc3Qgcj10W2UqM10sbz10W2UqMysxXSxhPXRbbiozXSxjPXRbbiozKzFdLGw9dFtzKjNdLGg9dFtzKjMrMV07cmV0dXJuW25ldyBOKHIsbyksbmV3IE4oYSxjKSxuZXcgTihsLGgpXX0sZ2VuZXJhdGVTaWRlV2FsbFVWOmZ1bmN0aW9uKGksdCxlLG4scyxyKXtjb25zdCBvPXRbZSozXSxhPXRbZSozKzFdLGM9dFtlKjMrMl0sbD10W24qM10saD10W24qMysxXSx1PXRbbiozKzJdLGY9dFtzKjNdLGQ9dFtzKjMrMV0scD10W3MqMysyXSx5PXRbciozXSxtPXRbciozKzFdLGc9dFtyKjMrMl07cmV0dXJuIE1hdGguYWJzKGEtaCk8TWF0aC5hYnMoby1sKT9bbmV3IE4obywxLWMpLG5ldyBOKGwsMS11KSxuZXcgTihmLDEtcCksbmV3IE4oeSwxLWcpXTpbbmV3IE4oYSwxLWMpLG5ldyBOKGgsMS11KSxuZXcgTihkLDEtcCksbmV3IE4obSwxLWcpXX19O2Z1bmN0aW9uIGNkKGksdCxlKXtpZihlLnNoYXBlcz1bXSxBcnJheS5pc0FycmF5KGkpKWZvcihsZXQgbj0wLHM9aS5sZW5ndGg7bjxzO24rKyl7Y29uc3Qgcj1pW25dO2Uuc2hhcGVzLnB1c2goci51dWlkKX1lbHNlIGUuc2hhcGVzLnB1c2goaS51dWlkKTtyZXR1cm4gZS5vcHRpb25zPU9iamVjdC5hc3NpZ24oe30sdCksdC5leHRydWRlUGF0aCE9PXZvaWQgMCYmKGUub3B0aW9ucy5leHRydWRlUGF0aD10LmV4dHJ1ZGVQYXRoLnRvSlNPTigpKSxlfWNvbnN0IGNsPTAsbGQ9MSxoZD0yLGxsPTIsWG89MS4yNSxobD0xLElpPTYqNCs0KzQsTnM9NjU1MzUsdWQ9TWF0aC5wb3coMiwtMjQpLEdvPVN5bWJvbCgiU0tJUF9HRU5FUkFUSU9OIik7ZnVuY3Rpb24gZmQoaSl7cmV0dXJuIGkuaW5kZXg/aS5pbmRleC5jb3VudDppLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnR9ZnVuY3Rpb24gam4oaSl7cmV0dXJuIGZkKGkpLzN9ZnVuY3Rpb24gZGQoaSx0PUFycmF5QnVmZmVyKXtyZXR1cm4gaT42NTUzNT9uZXcgVWludDMyQXJyYXkobmV3IHQoNCppKSk6bmV3IFVpbnQxNkFycmF5KG5ldyB0KDIqaSkpfWZ1bmN0aW9uIHBkKGksdCl7aWYoIWkuaW5kZXgpe2NvbnN0IGU9aS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50LG49dC51c2VTaGFyZWRBcnJheUJ1ZmZlcj9TaGFyZWRBcnJheUJ1ZmZlcjpBcnJheUJ1ZmZlcixzPWRkKGUsbik7aS5zZXRJbmRleChuZXcgZ3QocywxKSk7Zm9yKGxldCByPTA7cjxlO3IrKylzW3JdPXJ9fWZ1bmN0aW9uIHVsKGksdCl7Y29uc3QgZT1qbihpKSxuPXR8fGkuZHJhd1JhbmdlLHM9bi5zdGFydC8zLHI9KG4uc3RhcnQrbi5jb3VudCkvMyxvPU1hdGgubWF4KDAscyksYT1NYXRoLm1pbihlLHIpLW87cmV0dXJuW3tvZmZzZXQ6TWF0aC5mbG9vcihvKSxjb3VudDpNYXRoLmZsb29yKGEpfV19ZnVuY3Rpb24gZmwoaSx0KXtpZighaS5ncm91cHN8fCFpLmdyb3Vwcy5sZW5ndGgpcmV0dXJuIHVsKGksdCk7Y29uc3QgZT1bXSxuPW5ldyBTZXQscz10fHxpLmRyYXdSYW5nZSxyPXMuc3RhcnQvMyxvPShzLnN0YXJ0K3MuY291bnQpLzM7Zm9yKGNvbnN0IGMgb2YgaS5ncm91cHMpe2NvbnN0IGw9Yy5zdGFydC8zLGg9KGMuc3RhcnQrYy5jb3VudCkvMztuLmFkZChNYXRoLm1heChyLGwpKSxuLmFkZChNYXRoLm1pbihvLGgpKX1jb25zdCBhPUFycmF5LmZyb20obi52YWx1ZXMoKSkuc29ydCgoYyxsKT0+Yy1sKTtmb3IobGV0IGM9MDtjPGEubGVuZ3RoLTE7YysrKXtjb25zdCBsPWFbY10saD1hW2MrMV07ZS5wdXNoKHtvZmZzZXQ6TWF0aC5mbG9vcihsKSxjb3VudDpNYXRoLmZsb29yKGgtbCl9KX1yZXR1cm4gZX1mdW5jdGlvbiB5ZChpLHQpe2NvbnN0IGU9am4oaSksbj1mbChpLHQpLnNvcnQoKG8sYSk9Pm8ub2Zmc2V0LWEub2Zmc2V0KSxzPW5bbi5sZW5ndGgtMV07cy5jb3VudD1NYXRoLm1pbihlLXMub2Zmc2V0LHMuY291bnQpO2xldCByPTA7cmV0dXJuIG4uZm9yRWFjaCgoe2NvdW50Om99KT0+cis9byksZSE9PXJ9ZnVuY3Rpb24gWm8oaSx0LGUsbixzKXtsZXQgcj0xLzAsbz0xLzAsYT0xLzAsYz0tMS8wLGw9LTEvMCxoPS0xLzAsdT0xLzAsZj0xLzAsZD0xLzAscD0tMS8wLHk9LTEvMCxtPS0xLzA7Zm9yKGxldCBnPXQqNixiPSh0K2UpKjY7ZzxiO2crPTYpe2NvbnN0IHg9aVtnKzBdLHc9aVtnKzFdLE09eC13LEE9eCt3O008ciYmKHI9TSksQT5jJiYoYz1BKSx4PHUmJih1PXgpLHg+cCYmKHA9eCk7Y29uc3QgUz1pW2crMl0sXz1pW2crM10sdj1TLV8sUD1TK187djxvJiYobz12KSxQPmwmJihsPVApLFM8ZiYmKGY9UyksUz55JiYoeT1TKTtjb25zdCB6PWlbZys0XSxFPWlbZys1XSxDPXotRSxGPXorRTtDPGEmJihhPUMpLEY+aCYmKGg9RiksejxkJiYoZD16KSx6Pm0mJihtPXopfW5bMF09cixuWzFdPW8sblsyXT1hLG5bM109YyxuWzRdPWwsbls1XT1oLHNbMF09dSxzWzFdPWYsc1syXT1kLHNbM109cCxzWzRdPXksc1s1XT1tfWZ1bmN0aW9uIG1kKGksdD1udWxsLGU9bnVsbCxuPW51bGwpe2NvbnN0IHM9aS5hdHRyaWJ1dGVzLnBvc2l0aW9uLHI9aS5pbmRleD9pLmluZGV4LmFycmF5Om51bGwsbz1qbihpKSxhPXMubm9ybWFsaXplZDtsZXQgYzt0PT09bnVsbD8oYz1uZXcgRmxvYXQzMkFycmF5KG8qNiksZT0wLG49byk6KGM9dCxlPWV8fDAsbj1ufHxvKTtjb25zdCBsPXMuYXJyYXksaD1zLm9mZnNldHx8MDtsZXQgdT0zO3MuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKHU9cy5kYXRhLnN0cmlkZSk7Y29uc3QgZj1bImdldFgiLCJnZXRZIiwiZ2V0WiJdO2ZvcihsZXQgZD1lO2Q8ZStuO2QrKyl7Y29uc3QgcD1kKjMseT1kKjY7bGV0IG09cCswLGc9cCsxLGI9cCsyO3ImJihtPXJbbV0sZz1yW2ddLGI9cltiXSksYXx8KG09bSp1K2gsZz1nKnUraCxiPWIqdStoKTtmb3IobGV0IHg9MDt4PDM7eCsrKXtsZXQgdyxNLEE7YT8odz1zW2ZbeF1dKG0pLE09c1tmW3hdXShnKSxBPXNbZlt4XV0oYikpOih3PWxbbSt4XSxNPWxbZyt4XSxBPWxbYit4XSk7bGV0IFM9dztNPFMmJihTPU0pLEE8UyYmKFM9QSk7bGV0IF89dztNPl8mJihfPU0pLEE+XyYmKF89QSk7Y29uc3Qgdj0oXy1TKS8yLFA9eCoyO2NbeStQKzBdPVMrdixjW3krUCsxXT12KyhNYXRoLmFicyhTKSt2KSp1ZH19cmV0dXJuIGN9ZnVuY3Rpb24gbHQoaSx0LGUpe3JldHVybiBlLm1pbi54PXRbaV0sZS5taW4ueT10W2krMV0sZS5taW4uej10W2krMl0sZS5tYXgueD10W2krM10sZS5tYXgueT10W2krNF0sZS5tYXguej10W2krNV0sZX1mdW5jdGlvbiBkbChpKXtsZXQgdD0tMSxlPS0xLzA7Zm9yKGxldCBuPTA7bjwzO24rKyl7Y29uc3Qgcz1pW24rM10taVtuXTtzPmUmJihlPXMsdD1uKX1yZXR1cm4gdH1mdW5jdGlvbiBwbChpLHQpe3Quc2V0KGkpfWZ1bmN0aW9uIHlsKGksdCxlKXtsZXQgbixzO2ZvcihsZXQgcj0wO3I8MztyKyspe2NvbnN0IG89ciszO249aVtyXSxzPXRbcl0sZVtyXT1uPHM/bjpzLG49aVtvXSxzPXRbb10sZVtvXT1uPnM/bjpzfX1mdW5jdGlvbiBScyhpLHQsZSl7Zm9yKGxldCBuPTA7bjwzO24rKyl7Y29uc3Qgcz10W2krMipuXSxyPXRbaSsyKm4rMV0sbz1zLXIsYT1zK3I7bzxlW25dJiYoZVtuXT1vKSxhPmVbbiszXSYmKGVbbiszXT1hKX19ZnVuY3Rpb24ga2koaSl7Y29uc3QgdD1pWzNdLWlbMF0sZT1pWzRdLWlbMV0sbj1pWzVdLWlbMl07cmV0dXJuIDIqKHQqZStlKm4rbip0KX1jb25zdCBJZT0zMixnZD0oaSx0KT0+aS5jYW5kaWRhdGUtdC5jYW5kaWRhdGUsdG49bmV3IEFycmF5KEllKS5maWxsKCkubWFwKCgpPT4oe2NvdW50OjAsYm91bmRzOm5ldyBGbG9hdDMyQXJyYXkoNikscmlnaHRDYWNoZUJvdW5kczpuZXcgRmxvYXQzMkFycmF5KDYpLGxlZnRDYWNoZUJvdW5kczpuZXcgRmxvYXQzMkFycmF5KDYpLGNhbmRpZGF0ZTowfSkpLExzPW5ldyBGbG9hdDMyQXJyYXkoNik7ZnVuY3Rpb24geGQoaSx0LGUsbixzLHIpe2xldCBvPS0xLGE9MDtpZihyPT09Y2wpbz1kbCh0KSxvIT09LTEmJihhPSh0W29dK3RbbyszXSkvMik7ZWxzZSBpZihyPT09bGQpbz1kbChpKSxvIT09LTEmJihhPXdkKGUsbixzLG8pKTtlbHNlIGlmKHI9PT1oZCl7Y29uc3QgYz1raShpKTtsZXQgbD1YbypzO2NvbnN0IGg9bio2LHU9KG4rcykqNjtmb3IobGV0IGY9MDtmPDM7ZisrKXtjb25zdCBkPXRbZl0sbT0odFtmKzNdLWQpL0llO2lmKHM8SWUvNCl7Y29uc3QgZz1bLi4udG5dO2cubGVuZ3RoPXM7bGV0IGI9MDtmb3IobGV0IHc9aDt3PHU7dys9NixiKyspe2NvbnN0IE09Z1tiXTtNLmNhbmRpZGF0ZT1lW3crMipmXSxNLmNvdW50PTA7Y29uc3R7Ym91bmRzOkEsbGVmdENhY2hlQm91bmRzOlMscmlnaHRDYWNoZUJvdW5kczpffT1NO2ZvcihsZXQgdj0wO3Y8Mzt2KyspX1t2XT0xLzAsX1t2KzNdPS0xLzAsU1t2XT0xLzAsU1t2KzNdPS0xLzAsQVt2XT0xLzAsQVt2KzNdPS0xLzA7UnModyxlLEEpfWcuc29ydChnZCk7bGV0IHg9cztmb3IobGV0IHc9MDt3PHg7dysrKXtjb25zdCBNPWdbd107Zm9yKDt3KzE8eCYmZ1t3KzFdLmNhbmRpZGF0ZT09PU0uY2FuZGlkYXRlOylnLnNwbGljZSh3KzEsMSkseC0tfWZvcihsZXQgdz1oO3c8dTt3Kz02KXtjb25zdCBNPWVbdysyKmZdO2ZvcihsZXQgQT0wO0E8eDtBKyspe2NvbnN0IFM9Z1tBXTtNPj1TLmNhbmRpZGF0ZT9Scyh3LGUsUy5yaWdodENhY2hlQm91bmRzKTooUnModyxlLFMubGVmdENhY2hlQm91bmRzKSxTLmNvdW50KyspfX1mb3IobGV0IHc9MDt3PHg7dysrKXtjb25zdCBNPWdbd10sQT1NLmNvdW50LFM9cy1NLmNvdW50LF89TS5sZWZ0Q2FjaGVCb3VuZHMsdj1NLnJpZ2h0Q2FjaGVCb3VuZHM7bGV0IFA9MDtBIT09MCYmKFA9a2koXykvYyk7bGV0IHo9MDtTIT09MCYmKHo9a2kodikvYyk7Y29uc3QgRT1obCtYbyooUCpBK3oqUyk7RTxsJiYobz1mLGw9RSxhPU0uY2FuZGlkYXRlKX19ZWxzZXtmb3IobGV0IHg9MDt4PEllO3grKyl7Y29uc3Qgdz10blt4XTt3LmNvdW50PTAsdy5jYW5kaWRhdGU9ZCttK3gqbTtjb25zdCBNPXcuYm91bmRzO2ZvcihsZXQgQT0wO0E8MztBKyspTVtBXT0xLzAsTVtBKzNdPS0xLzB9Zm9yKGxldCB4PWg7eDx1O3grPTYpe2xldCBBPX5+KChlW3grMipmXS1kKS9tKTtBPj1JZSYmKEE9SWUtMSk7Y29uc3QgUz10bltBXTtTLmNvdW50KyssUnMoeCxlLFMuYm91bmRzKX1jb25zdCBnPXRuW0llLTFdO3BsKGcuYm91bmRzLGcucmlnaHRDYWNoZUJvdW5kcyk7Zm9yKGxldCB4PUllLTI7eD49MDt4LS0pe2NvbnN0IHc9dG5beF0sTT10blt4KzFdO3lsKHcuYm91bmRzLE0ucmlnaHRDYWNoZUJvdW5kcyx3LnJpZ2h0Q2FjaGVCb3VuZHMpfWxldCBiPTA7Zm9yKGxldCB4PTA7eDxJZS0xO3grKyl7Y29uc3Qgdz10blt4XSxNPXcuY291bnQsQT13LmJvdW5kcyxfPXRuW3grMV0ucmlnaHRDYWNoZUJvdW5kcztNIT09MCYmKGI9PT0wP3BsKEEsTHMpOnlsKEEsTHMsTHMpKSxiKz1NO2xldCB2PTAsUD0wO2IhPT0wJiYodj1raShMcykvYyk7Y29uc3Qgej1zLWI7eiE9PTAmJihQPWtpKF8pL2MpO2NvbnN0IEU9aGwrWG8qKHYqYitQKnopO0U8bCYmKG89ZixsPUUsYT13LmNhbmRpZGF0ZSl9fX19ZWxzZSBjb25zb2xlLndhcm4oYE1lc2hCVkg6IEludmFsaWQgYnVpbGQgc3RyYXRlZ3kgdmFsdWUgJHtyfSB1c2VkLmApO3JldHVybntheGlzOm8scG9zOmF9fWZ1bmN0aW9uIHdkKGksdCxlLG4pe2xldCBzPTA7Zm9yKGxldCByPXQsbz10K2U7cjxvO3IrKylzKz1pW3IqNituKjJdO3JldHVybiBzL2V9Y2xhc3MgV297Y29uc3RydWN0b3IoKXt0aGlzLmJvdW5kaW5nRGF0YT1uZXcgRmxvYXQzMkFycmF5KDYpfX1mdW5jdGlvbiBiZChpLHQsZSxuLHMscil7bGV0IG89bixhPW4rcy0xO2NvbnN0IGM9ci5wb3MsbD1yLmF4aXMqMjtmb3IoOzspe2Zvcig7bzw9YSYmZVtvKjYrbF08YzspbysrO2Zvcig7bzw9YSYmZVthKjYrbF0+PWM7KWEtLTtpZihvPGEpe2ZvcihsZXQgaD0wO2g8MztoKyspe2xldCB1PXRbbyozK2hdO3RbbyozK2hdPXRbYSozK2hdLHRbYSozK2hdPXV9Zm9yKGxldCBoPTA7aDw2O2grKyl7bGV0IHU9ZVtvKjYraF07ZVtvKjYraF09ZVthKjYraF0sZVthKjYraF09dX1vKyssYS0tfWVsc2UgcmV0dXJuIG99fWZ1bmN0aW9uIE1kKGksdCxlLG4scyxyKXtsZXQgbz1uLGE9bitzLTE7Y29uc3QgYz1yLnBvcyxsPXIuYXhpcyoyO2Zvcig7Oyl7Zm9yKDtvPD1hJiZlW28qNitsXTxjOylvKys7Zm9yKDtvPD1hJiZlW2EqNitsXT49YzspYS0tO2lmKG88YSl7bGV0IGg9aVtvXTtpW29dPWlbYV0saVthXT1oO2ZvcihsZXQgdT0wO3U8Njt1Kyspe2xldCBmPWVbbyo2K3VdO2Vbbyo2K3VdPWVbYSo2K3VdLGVbYSo2K3VdPWZ9bysrLGEtLX1lbHNlIHJldHVybiBvfX1mdW5jdGlvbiBOdChpLHQpe3JldHVybiB0W2krMTVdPT09NjU1MzV9ZnVuY3Rpb24gVXQoaSx0KXtyZXR1cm4gdFtpKzZdfWZ1bmN0aW9uIEt0KGksdCl7cmV0dXJuIHRbaSsxNF19ZnVuY3Rpb24gdGUoaSl7cmV0dXJuIGkrOH1mdW5jdGlvbiBlZShpLHQpe3JldHVybiB0W2krNl19ZnVuY3Rpb24gbWwoaSx0KXtyZXR1cm4gdFtpKzddfWZ1bmN0aW9uIHN4KGkpe3JldHVybiBpfWxldCBnbCxOaSxPcyx4bDtjb25zdCBBZD1NYXRoLnBvdygyLDMyKTtmdW5jdGlvbiBIbyhpKXtyZXR1cm4iY291bnQiaW4gaT8xOjErSG8oaS5sZWZ0KStIbyhpLnJpZ2h0KX1mdW5jdGlvbiBTZChpLHQsZSl7cmV0dXJuIGdsPW5ldyBGbG9hdDMyQXJyYXkoZSksTmk9bmV3IFVpbnQzMkFycmF5KGUpLE9zPW5ldyBVaW50MTZBcnJheShlKSx4bD1uZXcgVWludDhBcnJheShlKSxKbyhpLHQpfWZ1bmN0aW9uIEpvKGksdCl7Y29uc3QgZT1pLzQsbj1pLzIscz0iY291bnQiaW4gdCxyPXQuYm91bmRpbmdEYXRhO2ZvcihsZXQgbz0wO288NjtvKyspZ2xbZStvXT1yW29dO2lmKHMpaWYodC5idWZmZXIpe2NvbnN0IG89dC5idWZmZXI7eGwuc2V0KG5ldyBVaW50OEFycmF5KG8pLGkpO2ZvcihsZXQgYT1pLGM9aStvLmJ5dGVMZW5ndGg7YTxjO2ErPUlpKXtjb25zdCBsPWEvMjtOdChsLE9zKXx8KE5pW2EvNCs2XSs9ZSl9cmV0dXJuIGkrby5ieXRlTGVuZ3RofWVsc2V7Y29uc3Qgbz10Lm9mZnNldCxhPXQuY291bnQ7cmV0dXJuIE5pW2UrNl09byxPc1tuKzE0XT1hLE9zW24rMTVdPU5zLGkrSWl9ZWxzZXtjb25zdCBvPXQubGVmdCxhPXQucmlnaHQsYz10LnNwbGl0QXhpcztsZXQgbDtpZihsPUpvKGkrSWksbyksbC80PkFkKXRocm93IG5ldyBFcnJvcigiTWVzaEJWSDogQ2Fubm90IHN0b3JlIGNoaWxkIHBvaW50ZXIgZ3JlYXRlciB0aGFuIDMyIGJpdHMuIik7cmV0dXJuIE5pW2UrNl09bC80LGw9Sm8obCxhKSxOaVtlKzddPWMsbH19ZnVuY3Rpb24gdmQoaSx0KXtjb25zdCBlPShpLmluZGV4P2kuaW5kZXguY291bnQ6aS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50KS8zLG49ZT53aSgyLDE2KSxzPW4/NDoyLHI9dD9uZXcgU2hhcmVkQXJyYXlCdWZmZXIoZSpzKTpuZXcgQXJyYXlCdWZmZXIoZSpzKSxvPW4/bmV3IFVpbnQzMkFycmF5KHIpOm5ldyBVaW50MTZBcnJheShyKTtmb3IobGV0IGE9MCxjPW8ubGVuZ3RoO2E8YzthKyspb1thXT1hO3JldHVybiBvfWZ1bmN0aW9uIF9kKGksdCxlLG4scyl7Y29uc3R7bWF4RGVwdGg6cix2ZXJib3NlOm8sbWF4TGVhZlRyaXM6YSxzdHJhdGVneTpjLG9uUHJvZ3Jlc3M6bCxpbmRpcmVjdDpofT1zLHU9aS5faW5kaXJlY3RCdWZmZXIsZj1pLmdlb21ldHJ5LGQ9Zi5pbmRleD9mLmluZGV4LmFycmF5Om51bGwscD1oP01kOmJkLHk9am4oZiksbT1uZXcgRmxvYXQzMkFycmF5KDYpO2xldCBnPSExO2NvbnN0IGI9bmV3IFdvO3JldHVybiBabyh0LGUsbixiLmJvdW5kaW5nRGF0YSxtKSx3KGIsZSxuLG0pLGI7ZnVuY3Rpb24geChNKXtsJiZsKE0veSl9ZnVuY3Rpb24gdyhNLEEsUyxfPW51bGwsdj0wKXtpZighZyYmdj49ciYmKGc9ITAsbyYmKGNvbnNvbGUud2FybihgTWVzaEJWSDogTWF4IGRlcHRoIG9mICR7cn0gcmVhY2hlZCB3aGVuIGdlbmVyYXRpbmcgQlZILiBDb25zaWRlciBpbmNyZWFzaW5nIG1heERlcHRoLmApLGNvbnNvbGUud2FybihmKSkpLFM8PWF8fHY+PXIpcmV0dXJuIHgoQStTKSxNLm9mZnNldD1BLE0uY291bnQ9UyxNO2NvbnN0IFA9eGQoTS5ib3VuZGluZ0RhdGEsXyx0LEEsUyxjKTtpZihQLmF4aXM9PT0tMSlyZXR1cm4geChBK1MpLE0ub2Zmc2V0PUEsTS5jb3VudD1TLE07Y29uc3Qgej1wKHUsZCx0LEEsUyxQKTtpZih6PT09QXx8ej09PUErUyl4KEErUyksTS5vZmZzZXQ9QSxNLmNvdW50PVM7ZWxzZXtNLnNwbGl0QXhpcz1QLmF4aXM7Y29uc3QgRT1uZXcgV28sQz1BLEY9ei1BO00ubGVmdD1FLFpvKHQsQyxGLEUuYm91bmRpbmdEYXRhLG0pLHcoRSxDLEYsbSx2KzEpO2NvbnN0IEI9bmV3IFdvLEk9eixSPVMtRjtNLnJpZ2h0PUIsWm8odCxJLFIsQi5ib3VuZGluZ0RhdGEsbSksdyhCLEksUixtLHYrMSl9cmV0dXJuIE19fWZ1bmN0aW9uIHpkKGksdCl7Y29uc3QgZT1pLmdlb21ldHJ5O3QuaW5kaXJlY3QmJihpLl9pbmRpcmVjdEJ1ZmZlcj12ZChlLHQudXNlU2hhcmVkQXJyYXlCdWZmZXIpLHlkKGUsdC5yYW5nZSkmJiF0LnZlcmJvc2UmJmNvbnNvbGUud2FybignTWVzaEJWSDogUHJvdmlkZWQgZ2VvbWV0cnkgY29udGFpbnMgZ3JvdXBzIG9yIGEgcmFuZ2UgdGhhdCBkbyBub3QgZnVsbHkgc3BhbiB0aGUgdmVydGV4IGNvbnRlbnRzIHdoaWxlIHVzaW5nIHRoZSAiaW5kaXJlY3QiIG9wdGlvbi4gQlZIIG1heSBpbmNvcnJlY3RseSByZXBvcnQgaW50ZXJzZWN0aW9ucyBvbiB1bnJlbmRlcmVkIHBvcnRpb25zIG9mIHRoZSBnZW9tZXRyeS4nKSksaS5faW5kaXJlY3RCdWZmZXJ8fHBkKGUsdCk7Y29uc3Qgbj10LnVzZVNoYXJlZEFycmF5QnVmZmVyP1NoYXJlZEFycmF5QnVmZmVyOkFycmF5QnVmZmVyLHM9bWQoZSkscj10LmluZGlyZWN0P3VsKGUsdC5yYW5nZSk6ZmwoZSx0LnJhbmdlKTtpLl9yb290cz1yLm1hcChvPT57Y29uc3QgYT1fZChpLHMsby5vZmZzZXQsby5jb3VudCx0KSxjPUhvKGEpLGw9bmV3IG4oSWkqYyk7cmV0dXJuIFNkKDAsYSxsKSxsfSl9Y2xhc3Mga2V7Y29uc3RydWN0b3IoKXt0aGlzLm1pbj0xLzAsdGhpcy5tYXg9LTEvMH1zZXRGcm9tUG9pbnRzRmllbGQodCxlKXtsZXQgbj0xLzAscz0tMS8wO2ZvcihsZXQgcj0wLG89dC5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYz10W3JdW2VdO249YzxuP2M6bixzPWM+cz9jOnN9dGhpcy5taW49bix0aGlzLm1heD1zfXNldEZyb21Qb2ludHModCxlKXtsZXQgbj0xLzAscz0tMS8wO2ZvcihsZXQgcj0wLG89ZS5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT1lW3JdLGM9dC5kb3QoYSk7bj1jPG4/YzpuLHM9Yz5zP2M6c310aGlzLm1pbj1uLHRoaXMubWF4PXN9aXNTZXBhcmF0ZWQodCl7cmV0dXJuIHRoaXMubWluPnQubWF4fHx0Lm1pbj50aGlzLm1heH19a2UucHJvdG90eXBlLnNldEZyb21Cb3g9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBUO3JldHVybiBmdW5jdGlvbihlLG4pe2NvbnN0IHM9bi5taW4scj1uLm1heDtsZXQgbz0xLzAsYT0tMS8wO2ZvcihsZXQgYz0wO2M8PTE7YysrKWZvcihsZXQgbD0wO2w8PTE7bCsrKWZvcihsZXQgaD0wO2g8PTE7aCsrKXtpLng9cy54KmMrci54KigxLWMpLGkueT1zLnkqbCtyLnkqKDEtbCksaS56PXMueipoK3IueiooMS1oKTtjb25zdCB1PWUuZG90KGkpO289TWF0aC5taW4odSxvKSxhPU1hdGgubWF4KHUsYSl9dGhpcy5taW49byx0aGlzLm1heD1hfX0oKTtjb25zdCBUZD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFQsdD1uZXcgVCxlPW5ldyBUO3JldHVybiBmdW5jdGlvbihzLHIsbyl7Y29uc3QgYT1zLnN0YXJ0LGM9aSxsPXIuc3RhcnQsaD10O2Uuc3ViVmVjdG9ycyhhLGwpLGkuc3ViVmVjdG9ycyhzLmVuZCxzLnN0YXJ0KSx0LnN1YlZlY3RvcnMoci5lbmQsci5zdGFydCk7Y29uc3QgdT1lLmRvdChoKSxmPWguZG90KGMpLGQ9aC5kb3QoaCkscD1lLmRvdChjKSxtPWMuZG90KGMpKmQtZipmO2xldCBnLGI7bSE9PTA/Zz0odSpmLXAqZCkvbTpnPTAsYj0odStnKmYpL2Qsby54PWcsby55PWJ9fSgpLFlvPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgTix0PW5ldyBULGU9bmV3IFQ7cmV0dXJuIGZ1bmN0aW9uKHMscixvLGEpe1RkKHMscixpKTtsZXQgYz1pLngsbD1pLnk7aWYoYz49MCYmYzw9MSYmbD49MCYmbDw9MSl7cy5hdChjLG8pLHIuYXQobCxhKTtyZXR1cm59ZWxzZSBpZihjPj0wJiZjPD0xKXtsPDA/ci5hdCgwLGEpOnIuYXQoMSxhKSxzLmNsb3Nlc3RQb2ludFRvUG9pbnQoYSwhMCxvKTtyZXR1cm59ZWxzZSBpZihsPj0wJiZsPD0xKXtjPDA/cy5hdCgwLG8pOnMuYXQoMSxvKSxyLmNsb3Nlc3RQb2ludFRvUG9pbnQobywhMCxhKTtyZXR1cm59ZWxzZXtsZXQgaDtjPDA/aD1zLnN0YXJ0Omg9cy5lbmQ7bGV0IHU7bDwwP3U9ci5zdGFydDp1PXIuZW5kO2NvbnN0IGY9dCxkPWU7aWYocy5jbG9zZXN0UG9pbnRUb1BvaW50KHUsITAsdCksci5jbG9zZXN0UG9pbnRUb1BvaW50KGgsITAsZSksZi5kaXN0YW5jZVRvU3F1YXJlZCh1KTw9ZC5kaXN0YW5jZVRvU3F1YXJlZChoKSl7by5jb3B5KGYpLGEuY29weSh1KTtyZXR1cm59ZWxzZXtvLmNvcHkoaCksYS5jb3B5KGQpO3JldHVybn19fX0oKSxQZD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFQsdD1uZXcgVCxlPW5ldyBCbyxuPW5ldyBRdDtyZXR1cm4gZnVuY3Rpb24ocixvKXtjb25zdHtyYWRpdXM6YSxjZW50ZXI6Y309cix7YTpsLGI6aCxjOnV9PW87aWYobi5zdGFydD1sLG4uZW5kPWgsbi5jbG9zZXN0UG9pbnRUb1BvaW50KGMsITAsaSkuZGlzdGFuY2VUbyhjKTw9YXx8KG4uc3RhcnQ9bCxuLmVuZD11LG4uY2xvc2VzdFBvaW50VG9Qb2ludChjLCEwLGkpLmRpc3RhbmNlVG8oYyk8PWEpfHwobi5zdGFydD1oLG4uZW5kPXUsbi5jbG9zZXN0UG9pbnRUb1BvaW50KGMsITAsaSkuZGlzdGFuY2VUbyhjKTw9YSkpcmV0dXJuITA7Y29uc3QgeT1vLmdldFBsYW5lKGUpO2lmKE1hdGguYWJzKHkuZGlzdGFuY2VUb1BvaW50KGMpKTw9YSl7Y29uc3QgZz15LnByb2plY3RQb2ludChjLHQpO2lmKG8uY29udGFpbnNQb2ludChnKSlyZXR1cm4hMH1yZXR1cm4hMX19KCksQ2Q9MWUtMTU7ZnVuY3Rpb24gam8oaSl7cmV0dXJuIE1hdGguYWJzKGkpPENkfWNsYXNzIG5lIGV4dGVuZHMgdHR7Y29uc3RydWN0b3IoLi4udCl7c3VwZXIoLi4udCksdGhpcy5pc0V4dGVuZGVkVHJpYW5nbGU9ITAsdGhpcy5zYXRBeGVzPW5ldyBBcnJheSg0KS5maWxsKCkubWFwKCgpPT5uZXcgVCksdGhpcy5zYXRCb3VuZHM9bmV3IEFycmF5KDQpLmZpbGwoKS5tYXAoKCk9Pm5ldyBrZSksdGhpcy5wb2ludHM9W3RoaXMuYSx0aGlzLmIsdGhpcy5jXSx0aGlzLnNwaGVyZT1uZXcgcG8sdGhpcy5wbGFuZT1uZXcgQm8sdGhpcy5uZWVkc1VwZGF0ZT0hMH1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiBQZCh0LHRoaXMpfXVwZGF0ZSgpe2NvbnN0IHQ9dGhpcy5hLGU9dGhpcy5iLG49dGhpcy5jLHM9dGhpcy5wb2ludHMscj10aGlzLnNhdEF4ZXMsbz10aGlzLnNhdEJvdW5kcyxhPXJbMF0sYz1vWzBdO3RoaXMuZ2V0Tm9ybWFsKGEpLGMuc2V0RnJvbVBvaW50cyhhLHMpO2NvbnN0IGw9clsxXSxoPW9bMV07bC5zdWJWZWN0b3JzKHQsZSksaC5zZXRGcm9tUG9pbnRzKGwscyk7Y29uc3QgdT1yWzJdLGY9b1syXTt1LnN1YlZlY3RvcnMoZSxuKSxmLnNldEZyb21Qb2ludHModSxzKTtjb25zdCBkPXJbM10scD1vWzNdO2Quc3ViVmVjdG9ycyhuLHQpLHAuc2V0RnJvbVBvaW50cyhkLHMpLHRoaXMuc3BoZXJlLnNldEZyb21Qb2ludHModGhpcy5wb2ludHMpLHRoaXMucGxhbmUuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoYSx0KSx0aGlzLm5lZWRzVXBkYXRlPSExfX1uZS5wcm90b3R5cGUuY2xvc2VzdFBvaW50VG9TZWdtZW50PWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgVCx0PW5ldyBULGU9bmV3IFF0O3JldHVybiBmdW5jdGlvbihzLHI9bnVsbCxvPW51bGwpe2NvbnN0e3N0YXJ0OmEsZW5kOmN9PXMsbD10aGlzLnBvaW50cztsZXQgaCx1PTEvMDtmb3IobGV0IGY9MDtmPDM7ZisrKXtjb25zdCBkPShmKzEpJTM7ZS5zdGFydC5jb3B5KGxbZl0pLGUuZW5kLmNvcHkobFtkXSksWW8oZSxzLGksdCksaD1pLmRpc3RhbmNlVG9TcXVhcmVkKHQpLGg8dSYmKHU9aCxyJiZyLmNvcHkoaSksbyYmby5jb3B5KHQpKX1yZXR1cm4gdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KGEsaSksaD1hLmRpc3RhbmNlVG9TcXVhcmVkKGkpLGg8dSYmKHU9aCxyJiZyLmNvcHkoaSksbyYmby5jb3B5KGEpKSx0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoYyxpKSxoPWMuZGlzdGFuY2VUb1NxdWFyZWQoaSksaDx1JiYodT1oLHImJnIuY29weShpKSxvJiZvLmNvcHkoYykpLE1hdGguc3FydCh1KX19KCksbmUucHJvdG90eXBlLmludGVyc2VjdHNUcmlhbmdsZT1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IG5lLHQ9bmV3IEFycmF5KDMpLGU9bmV3IEFycmF5KDMpLG49bmV3IGtlLHM9bmV3IGtlLHI9bmV3IFQsbz1uZXcgVCxhPW5ldyBULGM9bmV3IFQsbD1uZXcgVCxoPW5ldyBRdCx1PW5ldyBRdCxmPW5ldyBRdCxkPW5ldyBUO2Z1bmN0aW9uIHAoeSxtLGcpe2NvbnN0IGI9eS5wb2ludHM7bGV0IHg9MCx3PS0xO2ZvcihsZXQgTT0wO008MztNKyspe2NvbnN0e3N0YXJ0OkEsZW5kOlN9PWg7QS5jb3B5KGJbTV0pLFMuY29weShiWyhNKzEpJTNdKSxoLmRlbHRhKG8pO2NvbnN0IF89am8obS5kaXN0YW5jZVRvUG9pbnQoQSkpO2lmKGpvKG0ubm9ybWFsLmRvdChvKSkmJl8pe2cuY29weShoKSx4PTI7YnJlYWt9Y29uc3Qgdj1tLmludGVyc2VjdExpbmUoaCxkKTtpZighdiYmXyYmZC5jb3B5KEEpLCh2fHxfKSYmIWpvKGQuZGlzdGFuY2VUbyhTKSkpe2lmKHg8PTEpKHg9PT0xP2cuc3RhcnQ6Zy5lbmQpLmNvcHkoZCksXyYmKHc9eCk7ZWxzZSBpZih4Pj0yKXsodz09PTE/Zy5zdGFydDpnLmVuZCkuY29weShkKSx4PTI7YnJlYWt9aWYoeCsrLHg9PT0yJiZ3PT09LTEpYnJlYWt9fXJldHVybiB4fXJldHVybiBmdW5jdGlvbihtLGc9bnVsbCxiPSExKXt0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLG0uaXNFeHRlbmRlZFRyaWFuZ2xlP20ubmVlZHNVcGRhdGUmJm0udXBkYXRlKCk6KGkuY29weShtKSxpLnVwZGF0ZSgpLG09aSk7Y29uc3QgeD10aGlzLnBsYW5lLHc9bS5wbGFuZTtpZihNYXRoLmFicyh4Lm5vcm1hbC5kb3Qody5ub3JtYWwpKT4xLTFlLTEwKXtjb25zdCBNPXRoaXMuc2F0Qm91bmRzLEE9dGhpcy5zYXRBeGVzO2VbMF09bS5hLGVbMV09bS5iLGVbMl09bS5jO2ZvcihsZXQgdj0wO3Y8NDt2Kyspe2NvbnN0IFA9TVt2XSx6PUFbdl07aWYobi5zZXRGcm9tUG9pbnRzKHosZSksUC5pc1NlcGFyYXRlZChuKSlyZXR1cm4hMX1jb25zdCBTPW0uc2F0Qm91bmRzLF89bS5zYXRBeGVzO3RbMF09dGhpcy5hLHRbMV09dGhpcy5iLHRbMl09dGhpcy5jO2ZvcihsZXQgdj0wO3Y8NDt2Kyspe2NvbnN0IFA9U1t2XSx6PV9bdl07aWYobi5zZXRGcm9tUG9pbnRzKHosdCksUC5pc1NlcGFyYXRlZChuKSlyZXR1cm4hMX1mb3IobGV0IHY9MDt2PDQ7disrKXtjb25zdCBQPUFbdl07Zm9yKGxldCB6PTA7ejw0O3orKyl7Y29uc3QgRT1fW3pdO2lmKHIuY3Jvc3NWZWN0b3JzKFAsRSksbi5zZXRGcm9tUG9pbnRzKHIsdCkscy5zZXRGcm9tUG9pbnRzKHIsZSksbi5pc1NlcGFyYXRlZChzKSlyZXR1cm4hMX19cmV0dXJuIGcmJihifHxjb25zb2xlLndhcm4oIkV4dGVuZGVkVHJpYW5nbGUuaW50ZXJzZWN0c1RyaWFuZ2xlOiBUcmlhbmdsZXMgYXJlIGNvcGxhbmFyIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgYW4gb3V0cHV0IGVkZ2UuIFNldHRpbmcgZWRnZSB0byAwLCAwLCAwLiIpLGcuc3RhcnQuc2V0KDAsMCwwKSxnLmVuZC5zZXQoMCwwLDApKSwhMH1lbHNle2NvbnN0IE09cCh0aGlzLHcsdSk7aWYoTT09PTEmJm0uY29udGFpbnNQb2ludCh1LmVuZCkpcmV0dXJuIGcmJihnLnN0YXJ0LmNvcHkodS5lbmQpLGcuZW5kLmNvcHkodS5lbmQpKSwhMDtpZihNIT09MilyZXR1cm4hMTtjb25zdCBBPXAobSx4LGYpO2lmKEE9PT0xJiZ0aGlzLmNvbnRhaW5zUG9pbnQoZi5lbmQpKXJldHVybiBnJiYoZy5zdGFydC5jb3B5KGYuZW5kKSxnLmVuZC5jb3B5KGYuZW5kKSksITA7aWYoQSE9PTIpcmV0dXJuITE7aWYodS5kZWx0YShhKSxmLmRlbHRhKGMpLGEuZG90KGMpPDApe2xldCBDPWYuc3RhcnQ7Zi5zdGFydD1mLmVuZCxmLmVuZD1DfWNvbnN0IFM9dS5zdGFydC5kb3QoYSksXz11LmVuZC5kb3QoYSksdj1mLnN0YXJ0LmRvdChhKSxQPWYuZW5kLmRvdChhKSx6PV88dixFPVM8UDtyZXR1cm4gUyE9PVAmJnYhPT1fJiZ6PT09RT8hMTooZyYmKGwuc3ViVmVjdG9ycyh1LnN0YXJ0LGYuc3RhcnQpLGwuZG90KGEpPjA/Zy5zdGFydC5jb3B5KHUuc3RhcnQpOmcuc3RhcnQuY29weShmLnN0YXJ0KSxsLnN1YlZlY3RvcnModS5lbmQsZi5lbmQpLGwuZG90KGEpPDA/Zy5lbmQuY29weSh1LmVuZCk6Zy5lbmQuY29weShmLmVuZCkpLCEwKX19fSgpLG5lLnByb3RvdHlwZS5kaXN0YW5jZVRvUG9pbnQ9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBUO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KGUsaSksZS5kaXN0YW5jZVRvKGkpfX0oKSxuZS5wcm90b3R5cGUuZGlzdGFuY2VUb1RyaWFuZ2xlPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgVCx0PW5ldyBULGU9WyJhIiwiYiIsImMiXSxuPW5ldyBRdCxzPW5ldyBRdDtyZXR1cm4gZnVuY3Rpb24obyxhPW51bGwsYz1udWxsKXtjb25zdCBsPWF8fGM/bjpudWxsO2lmKHRoaXMuaW50ZXJzZWN0c1RyaWFuZ2xlKG8sbCkpcmV0dXJuKGF8fGMpJiYoYSYmbC5nZXRDZW50ZXIoYSksYyYmbC5nZXRDZW50ZXIoYykpLDA7bGV0IGg9MS8wO2ZvcihsZXQgdT0wO3U8Mzt1Kyspe2xldCBmO2NvbnN0IGQ9ZVt1XSxwPW9bZF07dGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KHAsaSksZj1wLmRpc3RhbmNlVG9TcXVhcmVkKGkpLGY8aCYmKGg9ZixhJiZhLmNvcHkoaSksYyYmYy5jb3B5KHApKTtjb25zdCB5PXRoaXNbZF07by5jbG9zZXN0UG9pbnRUb1BvaW50KHksaSksZj15LmRpc3RhbmNlVG9TcXVhcmVkKGkpLGY8aCYmKGg9ZixhJiZhLmNvcHkoeSksYyYmYy5jb3B5KGkpKX1mb3IobGV0IHU9MDt1PDM7dSsrKXtjb25zdCBmPWVbdV0sZD1lWyh1KzEpJTNdO24uc2V0KHRoaXNbZl0sdGhpc1tkXSk7Zm9yKGxldCBwPTA7cDwzO3ArKyl7Y29uc3QgeT1lW3BdLG09ZVsocCsxKSUzXTtzLnNldChvW3ldLG9bbV0pLFlvKG4scyxpLHQpO2NvbnN0IGc9aS5kaXN0YW5jZVRvU3F1YXJlZCh0KTtnPGgmJihoPWcsYSYmYS5jb3B5KGkpLGMmJmMuY29weSh0KSl9fXJldHVybiBNYXRoLnNxcnQoaCl9fSgpO2NsYXNzIFR0e2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLmlzT3JpZW50ZWRCb3g9ITAsdGhpcy5taW49bmV3IFQsdGhpcy5tYXg9bmV3IFQsdGhpcy5tYXRyaXg9bmV3IHN0LHRoaXMuaW52TWF0cml4PW5ldyBzdCx0aGlzLnBvaW50cz1uZXcgQXJyYXkoOCkuZmlsbCgpLm1hcCgoKT0+bmV3IFQpLHRoaXMuc2F0QXhlcz1uZXcgQXJyYXkoMykuZmlsbCgpLm1hcCgoKT0+bmV3IFQpLHRoaXMuc2F0Qm91bmRzPW5ldyBBcnJheSgzKS5maWxsKCkubWFwKCgpPT5uZXcga2UpLHRoaXMuYWxpZ25lZFNhdEJvdW5kcz1uZXcgQXJyYXkoMykuZmlsbCgpLm1hcCgoKT0+bmV3IGtlKSx0aGlzLm5lZWRzVXBkYXRlPSExLHQmJnRoaXMubWluLmNvcHkodCksZSYmdGhpcy5tYXguY29weShlKSxuJiZ0aGlzLm1hdHJpeC5jb3B5KG4pfXNldCh0LGUsbil7dGhpcy5taW4uY29weSh0KSx0aGlzLm1heC5jb3B5KGUpLHRoaXMubWF0cml4LmNvcHkobiksdGhpcy5uZWVkc1VwZGF0ZT0hMH1jb3B5KHQpe3RoaXMubWluLmNvcHkodC5taW4pLHRoaXMubWF4LmNvcHkodC5tYXgpLHRoaXMubWF0cml4LmNvcHkodC5tYXRyaXgpLHRoaXMubmVlZHNVcGRhdGU9ITB9fVR0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCB0PXRoaXMubWF0cml4LGU9dGhpcy5taW4sbj10aGlzLm1heCxzPXRoaXMucG9pbnRzO2ZvcihsZXQgbD0wO2w8PTE7bCsrKWZvcihsZXQgaD0wO2g8PTE7aCsrKWZvcihsZXQgdT0wO3U8PTE7dSsrKXtjb25zdCBmPTEqbHwyKmh8NCp1LGQ9c1tmXTtkLng9bD9uLng6ZS54LGQueT1oP24ueTplLnksZC56PXU/bi56OmUueixkLmFwcGx5TWF0cml4NCh0KX1jb25zdCByPXRoaXMuc2F0Qm91bmRzLG89dGhpcy5zYXRBeGVzLGE9c1swXTtmb3IobGV0IGw9MDtsPDM7bCsrKXtjb25zdCBoPW9bbF0sdT1yW2xdLGY9MTw8bCxkPXNbZl07aC5zdWJWZWN0b3JzKGEsZCksdS5zZXRGcm9tUG9pbnRzKGgscyl9Y29uc3QgYz10aGlzLmFsaWduZWRTYXRCb3VuZHM7Y1swXS5zZXRGcm9tUG9pbnRzRmllbGQocywieCIpLGNbMV0uc2V0RnJvbVBvaW50c0ZpZWxkKHMsInkiKSxjWzJdLnNldEZyb21Qb2ludHNGaWVsZChzLCJ6IiksdGhpcy5pbnZNYXRyaXguY29weSh0aGlzLm1hdHJpeCkuaW52ZXJ0KCksdGhpcy5uZWVkc1VwZGF0ZT0hMX19KCksVHQucHJvdG90eXBlLmludGVyc2VjdHNCb3g9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBrZTtyZXR1cm4gZnVuY3Rpb24oZSl7dGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKTtjb25zdCBuPWUubWluLHM9ZS5tYXgscj10aGlzLnNhdEJvdW5kcyxvPXRoaXMuc2F0QXhlcyxhPXRoaXMuYWxpZ25lZFNhdEJvdW5kcztpZihpLm1pbj1uLngsaS5tYXg9cy54LGFbMF0uaXNTZXBhcmF0ZWQoaSl8fChpLm1pbj1uLnksaS5tYXg9cy55LGFbMV0uaXNTZXBhcmF0ZWQoaSkpfHwoaS5taW49bi56LGkubWF4PXMueixhWzJdLmlzU2VwYXJhdGVkKGkpKSlyZXR1cm4hMTtmb3IobGV0IGM9MDtjPDM7YysrKXtjb25zdCBsPW9bY10saD1yW2NdO2lmKGkuc2V0RnJvbUJveChsLGUpLGguaXNTZXBhcmF0ZWQoaSkpcmV0dXJuITF9cmV0dXJuITB9fSgpLFR0LnByb3RvdHlwZS5pbnRlcnNlY3RzVHJpYW5nbGU9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBuZSx0PW5ldyBBcnJheSgzKSxlPW5ldyBrZSxuPW5ldyBrZSxzPW5ldyBUO3JldHVybiBmdW5jdGlvbihvKXt0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLG8uaXNFeHRlbmRlZFRyaWFuZ2xlP28ubmVlZHNVcGRhdGUmJm8udXBkYXRlKCk6KGkuY29weShvKSxpLnVwZGF0ZSgpLG89aSk7Y29uc3QgYT10aGlzLnNhdEJvdW5kcyxjPXRoaXMuc2F0QXhlczt0WzBdPW8uYSx0WzFdPW8uYix0WzJdPW8uYztmb3IobGV0IGY9MDtmPDM7ZisrKXtjb25zdCBkPWFbZl0scD1jW2ZdO2lmKGUuc2V0RnJvbVBvaW50cyhwLHQpLGQuaXNTZXBhcmF0ZWQoZSkpcmV0dXJuITF9Y29uc3QgbD1vLnNhdEJvdW5kcyxoPW8uc2F0QXhlcyx1PXRoaXMucG9pbnRzO2ZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9bFtmXSxwPWhbZl07aWYoZS5zZXRGcm9tUG9pbnRzKHAsdSksZC5pc1NlcGFyYXRlZChlKSlyZXR1cm4hMX1mb3IobGV0IGY9MDtmPDM7ZisrKXtjb25zdCBkPWNbZl07Zm9yKGxldCBwPTA7cDw0O3ArKyl7Y29uc3QgeT1oW3BdO2lmKHMuY3Jvc3NWZWN0b3JzKGQseSksZS5zZXRGcm9tUG9pbnRzKHMsdCksbi5zZXRGcm9tUG9pbnRzKHMsdSksZS5pc1NlcGFyYXRlZChuKSlyZXR1cm4hMX19cmV0dXJuITB9fSgpLFR0LnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb1BvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksZS5jb3B5KHQpLmFwcGx5TWF0cml4NCh0aGlzLmludk1hdHJpeCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeCksZX19KCksVHQucHJvdG90eXBlLmRpc3RhbmNlVG9Qb2ludD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFQ7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoZSxpKSxlLmRpc3RhbmNlVG8oaSl9fSgpLFR0LnByb3RvdHlwZS5kaXN0YW5jZVRvQm94PWZ1bmN0aW9uKCl7Y29uc3QgaT1bIngiLCJ5IiwieiJdLHQ9bmV3IEFycmF5KDEyKS5maWxsKCkubWFwKCgpPT5uZXcgUXQpLGU9bmV3IEFycmF5KDEyKS5maWxsKCkubWFwKCgpPT5uZXcgUXQpLG49bmV3IFQscz1uZXcgVDtyZXR1cm4gZnVuY3Rpb24obyxhPTAsYz1udWxsLGw9bnVsbCl7aWYodGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKSx0aGlzLmludGVyc2VjdHNCb3gobykpcmV0dXJuKGN8fGwpJiYoby5nZXRDZW50ZXIocyksdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KHMsbiksby5jbG9zZXN0UG9pbnRUb1BvaW50KG4scyksYyYmYy5jb3B5KG4pLGwmJmwuY29weShzKSksMDtjb25zdCBoPWEqYSx1PW8ubWluLGY9by5tYXgsZD10aGlzLnBvaW50cztsZXQgcD0xLzA7Zm9yKGxldCBtPTA7bTw4O20rKyl7Y29uc3QgZz1kW21dO3MuY29weShnKS5jbGFtcCh1LGYpO2NvbnN0IGI9Zy5kaXN0YW5jZVRvU3F1YXJlZChzKTtpZihiPHAmJihwPWIsYyYmYy5jb3B5KGcpLGwmJmwuY29weShzKSxiPGgpKXJldHVybiBNYXRoLnNxcnQoYil9bGV0IHk9MDtmb3IobGV0IG09MDttPDM7bSsrKWZvcihsZXQgZz0wO2c8PTE7ZysrKWZvcihsZXQgYj0wO2I8PTE7YisrKXtjb25zdCB4PShtKzEpJTMsdz0obSsyKSUzLE09Zzw8eHxiPDx3LEE9MTw8bXxnPDx4fGI8PHcsUz1kW01dLF89ZFtBXTt0W3ldLnNldChTLF8pO2NvbnN0IFA9aVttXSx6PWlbeF0sRT1pW3ddLEM9ZVt5XSxGPUMuc3RhcnQsQj1DLmVuZDtGW1BdPXVbUF0sRlt6XT1nP3Vbel06Zlt6XSxGW0VdPWI/dVtFXTpmW3pdLEJbUF09ZltQXSxCW3pdPWc/dVt6XTpmW3pdLEJbRV09Yj91W0VdOmZbel0seSsrfWZvcihsZXQgbT0wO208PTE7bSsrKWZvcihsZXQgZz0wO2c8PTE7ZysrKWZvcihsZXQgYj0wO2I8PTE7YisrKXtzLng9bT9mLng6dS54LHMueT1nP2YueTp1Lnkscy56PWI/Zi56OnUueix0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQocyxuKTtjb25zdCB4PXMuZGlzdGFuY2VUb1NxdWFyZWQobik7aWYoeDxwJiYocD14LGMmJmMuY29weShuKSxsJiZsLmNvcHkocykseDxoKSlyZXR1cm4gTWF0aC5zcXJ0KHgpfWZvcihsZXQgbT0wO208MTI7bSsrKXtjb25zdCBnPXRbbV07Zm9yKGxldCBiPTA7YjwxMjtiKyspe2NvbnN0IHg9ZVtiXTtZbyhnLHgsbixzKTtjb25zdCB3PW4uZGlzdGFuY2VUb1NxdWFyZWQocyk7aWYodzxwJiYocD13LGMmJmMuY29weShuKSxsJiZsLmNvcHkocyksdzxoKSlyZXR1cm4gTWF0aC5zcXJ0KHcpfX1yZXR1cm4gTWF0aC5zcXJ0KHApfX0oKTtjbGFzcyBRb3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl9nZXROZXdQcmltaXRpdmU9dCx0aGlzLl9wcmltaXRpdmVzPVtdfWdldFByaW1pdGl2ZSgpe2NvbnN0IHQ9dGhpcy5fcHJpbWl0aXZlcztyZXR1cm4gdC5sZW5ndGg9PT0wP3RoaXMuX2dldE5ld1ByaW1pdGl2ZSgpOnQucG9wKCl9cmVsZWFzZVByaW1pdGl2ZSh0KXt0aGlzLl9wcmltaXRpdmVzLnB1c2godCl9fWNsYXNzIEVkIGV4dGVuZHMgUW97Y29uc3RydWN0b3IoKXtzdXBlcigoKT0+bmV3IG5lKX19Y29uc3QgaWU9bmV3IEVkO2NsYXNzIEJke2NvbnN0cnVjdG9yKCl7dGhpcy5mbG9hdDMyQXJyYXk9bnVsbCx0aGlzLnVpbnQxNkFycmF5PW51bGwsdGhpcy51aW50MzJBcnJheT1udWxsO2NvbnN0IHQ9W107bGV0IGU9bnVsbDt0aGlzLnNldEJ1ZmZlcj1uPT57ZSYmdC5wdXNoKGUpLGU9bix0aGlzLmZsb2F0MzJBcnJheT1uZXcgRmxvYXQzMkFycmF5KG4pLHRoaXMudWludDE2QXJyYXk9bmV3IFVpbnQxNkFycmF5KG4pLHRoaXMudWludDMyQXJyYXk9bmV3IFVpbnQzMkFycmF5KG4pfSx0aGlzLmNsZWFyQnVmZmVyPSgpPT57ZT1udWxsLHRoaXMuZmxvYXQzMkFycmF5PW51bGwsdGhpcy51aW50MTZBcnJheT1udWxsLHRoaXMudWludDMyQXJyYXk9bnVsbCx0Lmxlbmd0aCE9PTAmJnRoaXMuc2V0QnVmZmVyKHQucG9wKCkpfX19Y29uc3QgZXQ9bmV3IEJkO2xldCBlbixRbjtjb25zdCBLbj1bXSxEcz1uZXcgUW8oKCk9Pm5ldyBtdCk7ZnVuY3Rpb24gRmQoaSx0LGUsbixzLHIpe2VuPURzLmdldFByaW1pdGl2ZSgpLFFuPURzLmdldFByaW1pdGl2ZSgpLEtuLnB1c2goZW4sUW4pLGV0LnNldEJ1ZmZlcihpLl9yb290c1t0XSk7Y29uc3Qgbz1LbygwLGkuZ2VvbWV0cnksZSxuLHMscik7ZXQuY2xlYXJCdWZmZXIoKSxEcy5yZWxlYXNlUHJpbWl0aXZlKGVuKSxEcy5yZWxlYXNlUHJpbWl0aXZlKFFuKSxLbi5wb3AoKSxLbi5wb3AoKTtjb25zdCBhPUtuLmxlbmd0aDtyZXR1cm4gYT4wJiYoUW49S25bYS0xXSxlbj1LblthLTJdKSxvfWZ1bmN0aW9uIEtvKGksdCxlLG4scz1udWxsLHI9MCxvPTApe2NvbnN0e2Zsb2F0MzJBcnJheTphLHVpbnQxNkFycmF5OmMsdWludDMyQXJyYXk6bH09ZXQ7bGV0IGg9aSoyO2lmKE50KGgsYykpe2NvbnN0IGY9VXQoaSxsKSxkPUt0KGgsYyk7cmV0dXJuIGx0KGksYSxlbiksbihmLGQsITEsbyxyK2ksZW4pfWVsc2V7bGV0IFA9ZnVuY3Rpb24oRSl7Y29uc3R7dWludDE2QXJyYXk6Qyx1aW50MzJBcnJheTpGfT1ldDtsZXQgQj1FKjI7Zm9yKDshTnQoQixDKTspRT10ZShFKSxCPUUqMjtyZXR1cm4gVXQoRSxGKX0sej1mdW5jdGlvbihFKXtjb25zdHt1aW50MTZBcnJheTpDLHVpbnQzMkFycmF5OkZ9PWV0O2xldCBCPUUqMjtmb3IoOyFOdChCLEMpOylFPWVlKEUsRiksQj1FKjI7cmV0dXJuIFV0KEUsRikrS3QoQixDKX07Y29uc3QgZj10ZShpKSxkPWVlKGksbCk7bGV0IHA9Zix5PWQsbSxnLGIseDtpZihzJiYoYj1lbix4PVFuLGx0KHAsYSxiKSxsdCh5LGEseCksbT1zKGIpLGc9cyh4KSxnPG0pKXtwPWQseT1mO2NvbnN0IEU9bTttPWcsZz1FLGI9eH1ifHwoYj1lbixsdChwLGEsYikpO2NvbnN0IHc9TnQocCoyLGMpLE09ZShiLHcsbSxvKzEscitwKTtsZXQgQTtpZihNPT09bGwpe2NvbnN0IEU9UChwKSxGPXoocCktRTtBPW4oRSxGLCEwLG8rMSxyK3AsYil9ZWxzZSBBPU0mJktvKHAsdCxlLG4scyxyLG8rMSk7aWYoQSlyZXR1cm4hMDt4PVFuLGx0KHksYSx4KTtjb25zdCBTPU50KHkqMixjKSxfPWUoeCxTLGcsbysxLHIreSk7bGV0IHY7aWYoXz09PWxsKXtjb25zdCBFPVAoeSksRj16KHkpLUU7dj1uKEUsRiwhMCxvKzEscit5LHgpfWVsc2Ugdj1fJiZLbyh5LHQsZSxuLHMscixvKzEpO3JldHVybiEhdn19Y29uc3QgUmk9bmV3IFQsdGE9bmV3IFQ7ZnVuY3Rpb24gSWQoaSx0LGU9e30sbj0wLHM9MS8wKXtjb25zdCByPW4qbixvPXMqcztsZXQgYT0xLzAsYz1udWxsO2lmKGkuc2hhcGVjYXN0KHtib3VuZHNUcmF2ZXJzZU9yZGVyOmg9PihSaS5jb3B5KHQpLmNsYW1wKGgubWluLGgubWF4KSxSaS5kaXN0YW5jZVRvU3F1YXJlZCh0KSksaW50ZXJzZWN0c0JvdW5kczooaCx1LGYpPT5mPGEmJmY8byxpbnRlcnNlY3RzVHJpYW5nbGU6KGgsdSk9PntoLmNsb3Nlc3RQb2ludFRvUG9pbnQodCxSaSk7Y29uc3QgZj10LmRpc3RhbmNlVG9TcXVhcmVkKFJpKTtyZXR1cm4gZjxhJiYodGEuY29weShSaSksYT1mLGM9dSksZjxyfX0pLGE9PT0xLzApcmV0dXJuIG51bGw7Y29uc3QgbD1NYXRoLnNxcnQoYSk7cmV0dXJuIGUucG9pbnQ/ZS5wb2ludC5jb3B5KHRhKTplLnBvaW50PXRhLmNsb25lKCksZS5kaXN0YW5jZT1sLGUuZmFjZUluZGV4PWMsZX1jb25zdCBrZD1wYXJzZUludChKKT49MTY5LGduPW5ldyBULHhuPW5ldyBULHduPW5ldyBULCRzPW5ldyBOLFZzPW5ldyBOLFVzPW5ldyBOLHdsPW5ldyBULGJsPW5ldyBULE1sPW5ldyBULExpPW5ldyBUO2Z1bmN0aW9uIE5kKGksdCxlLG4scyxyLG8sYSl7bGV0IGM7aWYocj09PTE/Yz1pLmludGVyc2VjdFRyaWFuZ2xlKG4sZSx0LCEwLHMpOmM9aS5pbnRlcnNlY3RUcmlhbmdsZSh0LGUsbixyIT09MixzKSxjPT09bnVsbClyZXR1cm4gbnVsbDtjb25zdCBsPWkub3JpZ2luLmRpc3RhbmNlVG8ocyk7cmV0dXJuIGw8b3x8bD5hP251bGw6e2Rpc3RhbmNlOmwscG9pbnQ6cy5jbG9uZSgpfX1mdW5jdGlvbiBSZChpLHQsZSxuLHMscixvLGEsYyxsLGgpe2duLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxyKSx4bi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsbyksd24uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGEpO2NvbnN0IHU9TmQoaSxnbix4bix3bixMaSxjLGwsaCk7aWYodSl7Y29uc3QgZj1uZXcgVDt0dC5nZXRCYXJ5Y29vcmQoTGksZ24seG4sd24sZiksbiYmKCRzLmZyb21CdWZmZXJBdHRyaWJ1dGUobixyKSxWcy5mcm9tQnVmZmVyQXR0cmlidXRlKG4sbyksVXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLGEpLHUudXY9dHQuZ2V0SW50ZXJwb2xhdGlvbihMaSxnbix4bix3biwkcyxWcyxVcyxuZXcgTikpLHMmJigkcy5mcm9tQnVmZmVyQXR0cmlidXRlKHMsciksVnMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLG8pLFVzLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxhKSx1LnV2MT10dC5nZXRJbnRlcnBvbGF0aW9uKExpLGduLHhuLHduLCRzLFZzLFVzLG5ldyBOKSksZSYmKHdsLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxyKSxibC5mcm9tQnVmZmVyQXR0cmlidXRlKGUsbyksTWwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGEpLHUubm9ybWFsPXR0LmdldEludGVycG9sYXRpb24oTGksZ24seG4sd24sd2wsYmwsTWwsbmV3IFQpLHUubm9ybWFsLmRvdChpLmRpcmVjdGlvbik+MCYmdS5ub3JtYWwubXVsdGlwbHlTY2FsYXIoLTEpKTtjb25zdCBkPXthOnIsYjpvLGM6YSxub3JtYWw6bmV3IFQsbWF0ZXJpYWxJbmRleDowfTt0dC5nZXROb3JtYWwoZ24seG4sd24sZC5ub3JtYWwpLHUuZmFjZT1kLHUuZmFjZUluZGV4PXIsa2QmJih1LmJhcnljb29yZD1mKX1yZXR1cm4gdX1mdW5jdGlvbiBxcyhpLHQsZSxuLHMscixvKXtjb25zdCBhPW4qMztsZXQgYz1hKzAsbD1hKzEsaD1hKzI7Y29uc3QgdT1pLmluZGV4O2kuaW5kZXgmJihjPXUuZ2V0WChjKSxsPXUuZ2V0WChsKSxoPXUuZ2V0WChoKSk7Y29uc3R7cG9zaXRpb246Zixub3JtYWw6ZCx1djpwLHV2MTp5fT1pLmF0dHJpYnV0ZXMsbT1SZChlLGYsZCxwLHksYyxsLGgsdCxyLG8pO3JldHVybiBtPyhtLmZhY2VJbmRleD1uLHMmJnMucHVzaChtKSxtKTpudWxsfWZ1bmN0aW9uIHB0KGksdCxlLG4pe2NvbnN0IHM9aS5hLHI9aS5iLG89aS5jO2xldCBhPXQsYz10KzEsbD10KzI7ZSYmKGE9ZS5nZXRYKGEpLGM9ZS5nZXRYKGMpLGw9ZS5nZXRYKGwpKSxzLng9bi5nZXRYKGEpLHMueT1uLmdldFkoYSkscy56PW4uZ2V0WihhKSxyLng9bi5nZXRYKGMpLHIueT1uLmdldFkoYyksci56PW4uZ2V0WihjKSxvLng9bi5nZXRYKGwpLG8ueT1uLmdldFkobCksby56PW4uZ2V0WihsKX1mdW5jdGlvbiBMZChpLHQsZSxuLHMscixvLGEpe2NvbnN0e2dlb21ldHJ5OmMsX2luZGlyZWN0QnVmZmVyOmx9PWk7Zm9yKGxldCBoPW4sdT1uK3M7aDx1O2grKylxcyhjLHQsZSxoLHIsbyxhKX1mdW5jdGlvbiBPZChpLHQsZSxuLHMscixvKXtjb25zdHtnZW9tZXRyeTphLF9pbmRpcmVjdEJ1ZmZlcjpjfT1pO2xldCBsPTEvMCxoPW51bGw7Zm9yKGxldCB1PW4sZj1uK3M7dTxmO3UrKyl7bGV0IGQ7ZD1xcyhhLHQsZSx1LG51bGwscixvKSxkJiZkLmRpc3RhbmNlPGwmJihoPWQsbD1kLmRpc3RhbmNlKX1yZXR1cm4gaH1mdW5jdGlvbiBEZChpLHQsZSxuLHMscixvKXtjb25zdHtnZW9tZXRyeTphfT1lLHtpbmRleDpjfT1hLGw9YS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2ZvcihsZXQgaD1pLHU9dCtpO2g8dTtoKyspe2xldCBmO2lmKGY9aCxwdChvLGYqMyxjLGwpLG8ubmVlZHNVcGRhdGU9ITAsbihvLGYscyxyKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiAkZChpLHQ9bnVsbCl7dCYmQXJyYXkuaXNBcnJheSh0KSYmKHQ9bmV3IFNldCh0KSk7Y29uc3QgZT1pLmdlb21ldHJ5LG49ZS5pbmRleD9lLmluZGV4LmFycmF5Om51bGwscz1lLmF0dHJpYnV0ZXMucG9zaXRpb247bGV0IHIsbyxhLGMsbD0wO2NvbnN0IGg9aS5fcm9vdHM7Zm9yKGxldCBmPTAsZD1oLmxlbmd0aDtmPGQ7ZisrKXI9aFtmXSxvPW5ldyBVaW50MzJBcnJheShyKSxhPW5ldyBVaW50MTZBcnJheShyKSxjPW5ldyBGbG9hdDMyQXJyYXkociksdSgwLGwpLGwrPXIuYnl0ZUxlbmd0aDtmdW5jdGlvbiB1KGYsZCxwPSExKXtjb25zdCB5PWYqMjtpZihhW3krMTVdPT09TnMpe2NvbnN0IGc9b1tmKzZdLGI9YVt5KzE0XTtsZXQgeD0xLzAsdz0xLzAsTT0xLzAsQT0tMS8wLFM9LTEvMCxfPS0xLzA7Zm9yKGxldCB2PTMqZyxQPTMqKGcrYik7djxQO3YrKyl7bGV0IHo9blt2XTtjb25zdCBFPXMuZ2V0WCh6KSxDPXMuZ2V0WSh6KSxGPXMuZ2V0Wih6KTtFPHgmJih4PUUpLEU+QSYmKEE9RSksQzx3JiYodz1DKSxDPlMmJihTPUMpLEY8TSYmKE09RiksRj5fJiYoXz1GKX1yZXR1cm4gY1tmKzBdIT09eHx8Y1tmKzFdIT09d3x8Y1tmKzJdIT09TXx8Y1tmKzNdIT09QXx8Y1tmKzRdIT09U3x8Y1tmKzVdIT09Xz8oY1tmKzBdPXgsY1tmKzFdPXcsY1tmKzJdPU0sY1tmKzNdPUEsY1tmKzRdPVMsY1tmKzVdPV8sITApOiExfWVsc2V7Y29uc3QgZz1mKzgsYj1vW2YrNl0seD1nK2Qsdz1iK2Q7bGV0IE09cCxBPSExLFM9ITE7dD9NfHwoQT10Lmhhcyh4KSxTPXQuaGFzKHcpLE09IUEmJiFTKTooQT0hMCxTPSEwKTtjb25zdCBfPU18fEEsdj1NfHxTO2xldCBQPSExO18mJihQPXUoZyxkLE0pKTtsZXQgej0hMTt2JiYoej11KGIsZCxNKSk7Y29uc3QgRT1QfHx6O2lmKEUpZm9yKGxldCBDPTA7QzwzO0MrKyl7Y29uc3QgRj1nK0MsQj1iK0MsST1jW0ZdLFI9Y1tGKzNdLCQ9Y1tCXSxWPWNbQiszXTtjW2YrQ109STwkP0k6JCxjW2YrQyszXT1SPlY/UjpWfXJldHVybiBFfX19ZnVuY3Rpb24gbm4oaSx0LGUsbixzKXtsZXQgcixvLGEsYyxsLGg7Y29uc3QgdT0xL2UuZGlyZWN0aW9uLngsZj0xL2UuZGlyZWN0aW9uLnksZD0xL2UuZGlyZWN0aW9uLnoscD1lLm9yaWdpbi54LHk9ZS5vcmlnaW4ueSxtPWUub3JpZ2luLno7bGV0IGc9dFtpXSxiPXRbaSszXSx4PXRbaSsxXSx3PXRbaSszKzFdLE09dFtpKzJdLEE9dFtpKzMrMl07cmV0dXJuIHU+PTA/KHI9KGctcCkqdSxvPShiLXApKnUpOihyPShiLXApKnUsbz0oZy1wKSp1KSxmPj0wPyhhPSh4LXkpKmYsYz0ody15KSpmKTooYT0ody15KSpmLGM9KHgteSkqZikscj5jfHxhPm98fCgoYT5yfHxpc05hTihyKSkmJihyPWEpLChjPG98fGlzTmFOKG8pKSYmKG89YyksZD49MD8obD0oTS1tKSpkLGg9KEEtbSkqZCk6KGw9KEEtbSkqZCxoPShNLW0pKmQpLHI+aHx8bD5vKT8hMTooKGw+cnx8ciE9PXIpJiYocj1sKSwoaDxvfHxvIT09bykmJihvPWgpLHI8PXMmJm8+PW4pfWZ1bmN0aW9uIFZkKGksdCxlLG4scyxyLG8sYSl7Y29uc3R7Z2VvbWV0cnk6YyxfaW5kaXJlY3RCdWZmZXI6bH09aTtmb3IobGV0IGg9bix1PW4rcztoPHU7aCsrKXtsZXQgZj1sP2xbaF06aDtxcyhjLHQsZSxmLHIsbyxhKX19ZnVuY3Rpb24gVWQoaSx0LGUsbixzLHIsbyl7Y29uc3R7Z2VvbWV0cnk6YSxfaW5kaXJlY3RCdWZmZXI6Y309aTtsZXQgbD0xLzAsaD1udWxsO2ZvcihsZXQgdT1uLGY9bitzO3U8Zjt1Kyspe2xldCBkO2Q9cXMoYSx0LGUsYz9jW3VdOnUsbnVsbCxyLG8pLGQmJmQuZGlzdGFuY2U8bCYmKGg9ZCxsPWQuZGlzdGFuY2UpfXJldHVybiBofWZ1bmN0aW9uIHFkKGksdCxlLG4scyxyLG8pe2NvbnN0e2dlb21ldHJ5OmF9PWUse2luZGV4OmN9PWEsbD1hLmF0dHJpYnV0ZXMucG9zaXRpb247Zm9yKGxldCBoPWksdT10K2k7aDx1O2grKyl7bGV0IGY7aWYoZj1lLnJlc29sdmVUcmlhbmdsZUluZGV4KGgpLHB0KG8sZiozLGMsbCksby5uZWVkc1VwZGF0ZT0hMCxuKG8sZixzLHIpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIFhkKGksdCxlLG4scyxyLG8pe2V0LnNldEJ1ZmZlcihpLl9yb290c1t0XSksZWEoMCxpLGUsbixzLHIsbyksZXQuY2xlYXJCdWZmZXIoKX1mdW5jdGlvbiBlYShpLHQsZSxuLHMscixvKXtjb25zdHtmbG9hdDMyQXJyYXk6YSx1aW50MTZBcnJheTpjLHVpbnQzMkFycmF5Omx9PWV0LGg9aSoyO2lmKE50KGgsYykpe2NvbnN0IGY9VXQoaSxsKSxkPUt0KGgsYyk7TGQodCxlLG4sZixkLHMscixvKX1lbHNle2NvbnN0IGY9dGUoaSk7bm4oZixhLG4scixvKSYmZWEoZix0LGUsbixzLHIsbyk7Y29uc3QgZD1lZShpLGwpO25uKGQsYSxuLHIsbykmJmVhKGQsdCxlLG4scyxyLG8pfX1jb25zdCBHZD1bIngiLCJ5IiwieiJdO2Z1bmN0aW9uIFpkKGksdCxlLG4scyxyKXtldC5zZXRCdWZmZXIoaS5fcm9vdHNbdF0pO2NvbnN0IG89bmEoMCxpLGUsbixzLHIpO3JldHVybiBldC5jbGVhckJ1ZmZlcigpLG99ZnVuY3Rpb24gbmEoaSx0LGUsbixzLHIpe2NvbnN0e2Zsb2F0MzJBcnJheTpvLHVpbnQxNkFycmF5OmEsdWludDMyQXJyYXk6Y309ZXQ7bGV0IGw9aSoyO2lmKE50KGwsYSkpe2NvbnN0IHU9VXQoaSxjKSxmPUt0KGwsYSk7cmV0dXJuIE9kKHQsZSxuLHUsZixzLHIpfWVsc2V7Y29uc3QgdT1tbChpLGMpLGY9R2RbdV0scD1uLmRpcmVjdGlvbltmXT49MDtsZXQgeSxtO3A/KHk9dGUoaSksbT1lZShpLGMpKTooeT1lZShpLGMpLG09dGUoaSkpO2NvbnN0IGI9bm4oeSxvLG4scyxyKT9uYSh5LHQsZSxuLHMscik6bnVsbDtpZihiKXtjb25zdCBNPWIucG9pbnRbZl07aWYocD9NPD1vW20rdV06TT49b1ttK3UrM10pcmV0dXJuIGJ9Y29uc3Qgdz1ubihtLG8sbixzLHIpP25hKG0sdCxlLG4scyxyKTpudWxsO3JldHVybiBiJiZ3P2IuZGlzdGFuY2U8PXcuZGlzdGFuY2U/Yjp3OmJ8fHd8fG51bGx9fWNvbnN0IFhzPW5ldyBtdCx0aT1uZXcgbmUsZWk9bmV3IG5lLE9pPW5ldyBzdCxBbD1uZXcgVHQsR3M9bmV3IFR0O2Z1bmN0aW9uIFdkKGksdCxlLG4pe2V0LnNldEJ1ZmZlcihpLl9yb290c1t0XSk7Y29uc3Qgcz1pYSgwLGksZSxuKTtyZXR1cm4gZXQuY2xlYXJCdWZmZXIoKSxzfWZ1bmN0aW9uIGlhKGksdCxlLG4scz1udWxsKXtjb25zdHtmbG9hdDMyQXJyYXk6cix1aW50MTZBcnJheTpvLHVpbnQzMkFycmF5OmF9PWV0O2xldCBjPWkqMjtpZihzPT09bnVsbCYmKGUuYm91bmRpbmdCb3h8fGUuY29tcHV0ZUJvdW5kaW5nQm94KCksQWwuc2V0KGUuYm91bmRpbmdCb3gubWluLGUuYm91bmRpbmdCb3gubWF4LG4pLHM9QWwpLE50KGMsbykpe2NvbnN0IGg9dC5nZW9tZXRyeSx1PWguaW5kZXgsZj1oLmF0dHJpYnV0ZXMucG9zaXRpb24sZD1lLmluZGV4LHA9ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uLHk9VXQoaSxhKSxtPUt0KGMsbyk7aWYoT2kuY29weShuKS5pbnZlcnQoKSxlLmJvdW5kc1RyZWUpcmV0dXJuIGx0KGkscixHcyksR3MubWF0cml4LmNvcHkoT2kpLEdzLm5lZWRzVXBkYXRlPSEwLGUuYm91bmRzVHJlZS5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6Yj0+R3MuaW50ZXJzZWN0c0JveChiKSxpbnRlcnNlY3RzVHJpYW5nbGU6Yj0+e2IuYS5hcHBseU1hdHJpeDQobiksYi5iLmFwcGx5TWF0cml4NChuKSxiLmMuYXBwbHlNYXRyaXg0KG4pLGIubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCB4PXkqMyx3PShtK3kpKjM7eDx3O3grPTMpaWYocHQoZWkseCx1LGYpLGVpLm5lZWRzVXBkYXRlPSEwLGIuaW50ZXJzZWN0c1RyaWFuZ2xlKGVpKSlyZXR1cm4hMDtyZXR1cm4hMX19KTtmb3IobGV0IGc9eSozLGI9KG0reSkqMztnPGI7Zys9Myl7cHQodGksZyx1LGYpLHRpLmEuYXBwbHlNYXRyaXg0KE9pKSx0aS5iLmFwcGx5TWF0cml4NChPaSksdGkuYy5hcHBseU1hdHJpeDQoT2kpLHRpLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgeD0wLHc9ZC5jb3VudDt4PHc7eCs9MylpZihwdChlaSx4LGQscCksZWkubmVlZHNVcGRhdGU9ITAsdGkuaW50ZXJzZWN0c1RyaWFuZ2xlKGVpKSlyZXR1cm4hMH19ZWxzZXtjb25zdCBoPWkrOCx1PWFbaSs2XTtyZXR1cm4gbHQoaCxyLFhzKSwhIShzLmludGVyc2VjdHNCb3goWHMpJiZpYShoLHQsZSxuLHMpfHwobHQodSxyLFhzKSxzLmludGVyc2VjdHNCb3goWHMpJiZpYSh1LHQsZSxuLHMpKSl9fWNvbnN0IFpzPW5ldyBzdCxzYT1uZXcgVHQsRGk9bmV3IFR0LEhkPW5ldyBULEpkPW5ldyBULFlkPW5ldyBULGpkPW5ldyBUO2Z1bmN0aW9uIFFkKGksdCxlLG49e30scz17fSxyPTAsbz0xLzApe3QuYm91bmRpbmdCb3h8fHQuY29tcHV0ZUJvdW5kaW5nQm94KCksc2Euc2V0KHQuYm91bmRpbmdCb3gubWluLHQuYm91bmRpbmdCb3gubWF4LGUpLHNhLm5lZWRzVXBkYXRlPSEwO2NvbnN0IGE9aS5nZW9tZXRyeSxjPWEuYXR0cmlidXRlcy5wb3NpdGlvbixsPWEuaW5kZXgsaD10LmF0dHJpYnV0ZXMucG9zaXRpb24sdT10LmluZGV4LGY9aWUuZ2V0UHJpbWl0aXZlKCksZD1pZS5nZXRQcmltaXRpdmUoKTtsZXQgcD1IZCx5PUpkLG09bnVsbCxnPW51bGw7cyYmKG09WWQsZz1qZCk7bGV0IGI9MS8wLHg9bnVsbCx3PW51bGw7cmV0dXJuIFpzLmNvcHkoZSkuaW52ZXJ0KCksRGkubWF0cml4LmNvcHkoWnMpLGkuc2hhcGVjYXN0KHtib3VuZHNUcmF2ZXJzZU9yZGVyOk09PnNhLmRpc3RhbmNlVG9Cb3goTSksaW50ZXJzZWN0c0JvdW5kczooTSxBLFMpPT5TPGImJlM8bz8oQSYmKERpLm1pbi5jb3B5KE0ubWluKSxEaS5tYXguY29weShNLm1heCksRGkubmVlZHNVcGRhdGU9ITApLCEwKTohMSxpbnRlcnNlY3RzUmFuZ2U6KE0sQSk9PntpZih0LmJvdW5kc1RyZWUpcmV0dXJuIHQuYm91bmRzVHJlZS5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6Xz0+RGkuZGlzdGFuY2VUb0JveChfKSxpbnRlcnNlY3RzQm91bmRzOihfLHYsUCk9PlA8YiYmUDxvLGludGVyc2VjdHNSYW5nZTooXyx2KT0+e2ZvcihsZXQgUD1fLHo9Xyt2O1A8ejtQKyspe3B0KGQsMypQLHUsaCksZC5hLmFwcGx5TWF0cml4NChlKSxkLmIuYXBwbHlNYXRyaXg0KGUpLGQuYy5hcHBseU1hdHJpeDQoZSksZC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IEU9TSxDPU0rQTtFPEM7RSsrKXtwdChmLDMqRSxsLGMpLGYubmVlZHNVcGRhdGU9ITA7Y29uc3QgRj1mLmRpc3RhbmNlVG9UcmlhbmdsZShkLHAsbSk7aWYoRjxiJiYoeS5jb3B5KHApLGcmJmcuY29weShtKSxiPUYseD1FLHc9UCksRjxyKXJldHVybiEwfX19fSk7e2NvbnN0IFM9am4odCk7Zm9yKGxldCBfPTAsdj1TO188djtfKyspe3B0KGQsMypfLHUsaCksZC5hLmFwcGx5TWF0cml4NChlKSxkLmIuYXBwbHlNYXRyaXg0KGUpLGQuYy5hcHBseU1hdHJpeDQoZSksZC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IFA9TSx6PU0rQTtQPHo7UCsrKXtwdChmLDMqUCxsLGMpLGYubmVlZHNVcGRhdGU9ITA7Y29uc3QgRT1mLmRpc3RhbmNlVG9UcmlhbmdsZShkLHAsbSk7aWYoRTxiJiYoeS5jb3B5KHApLGcmJmcuY29weShtKSxiPUUseD1QLHc9XyksRTxyKXJldHVybiEwfX19fX0pLGllLnJlbGVhc2VQcmltaXRpdmUoZiksaWUucmVsZWFzZVByaW1pdGl2ZShkKSxiPT09MS8wP251bGw6KG4ucG9pbnQ/bi5wb2ludC5jb3B5KHkpOm4ucG9pbnQ9eS5jbG9uZSgpLG4uZGlzdGFuY2U9YixuLmZhY2VJbmRleD14LHMmJihzLnBvaW50P3MucG9pbnQuY29weShnKTpzLnBvaW50PWcuY2xvbmUoKSxzLnBvaW50LmFwcGx5TWF0cml4NChacykseS5hcHBseU1hdHJpeDQoWnMpLHMuZGlzdGFuY2U9eS5zdWIocy5wb2ludCkubGVuZ3RoKCkscy5mYWNlSW5kZXg9dyksbil9ZnVuY3Rpb24gS2QoaSx0PW51bGwpe3QmJkFycmF5LmlzQXJyYXkodCkmJih0PW5ldyBTZXQodCkpO2NvbnN0IGU9aS5nZW9tZXRyeSxuPWUuaW5kZXg/ZS5pbmRleC5hcnJheTpudWxsLHM9ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2xldCByLG8sYSxjLGw9MDtjb25zdCBoPWkuX3Jvb3RzO2ZvcihsZXQgZj0wLGQ9aC5sZW5ndGg7ZjxkO2YrKylyPWhbZl0sbz1uZXcgVWludDMyQXJyYXkociksYT1uZXcgVWludDE2QXJyYXkociksYz1uZXcgRmxvYXQzMkFycmF5KHIpLHUoMCxsKSxsKz1yLmJ5dGVMZW5ndGg7ZnVuY3Rpb24gdShmLGQscD0hMSl7Y29uc3QgeT1mKjI7aWYoYVt5KzE1XT09PU5zKXtjb25zdCBnPW9bZis2XSxiPWFbeSsxNF07bGV0IHg9MS8wLHc9MS8wLE09MS8wLEE9LTEvMCxTPS0xLzAsXz0tMS8wO2ZvcihsZXQgdj1nLFA9ZytiO3Y8UDt2Kyspe2NvbnN0IHo9MyppLnJlc29sdmVUcmlhbmdsZUluZGV4KHYpO2ZvcihsZXQgRT0wO0U8MztFKyspe2xldCBDPXorRTtDPW4/bltDXTpDO2NvbnN0IEY9cy5nZXRYKEMpLEI9cy5nZXRZKEMpLEk9cy5nZXRaKEMpO0Y8eCYmKHg9RiksRj5BJiYoQT1GKSxCPHcmJih3PUIpLEI+UyYmKFM9QiksSTxNJiYoTT1JKSxJPl8mJihfPUkpfX1yZXR1cm4gY1tmKzBdIT09eHx8Y1tmKzFdIT09d3x8Y1tmKzJdIT09TXx8Y1tmKzNdIT09QXx8Y1tmKzRdIT09U3x8Y1tmKzVdIT09Xz8oY1tmKzBdPXgsY1tmKzFdPXcsY1tmKzJdPU0sY1tmKzNdPUEsY1tmKzRdPVMsY1tmKzVdPV8sITApOiExfWVsc2V7Y29uc3QgZz1mKzgsYj1vW2YrNl0seD1nK2Qsdz1iK2Q7bGV0IE09cCxBPSExLFM9ITE7dD9NfHwoQT10Lmhhcyh4KSxTPXQuaGFzKHcpLE09IUEmJiFTKTooQT0hMCxTPSEwKTtjb25zdCBfPU18fEEsdj1NfHxTO2xldCBQPSExO18mJihQPXUoZyxkLE0pKTtsZXQgej0hMTt2JiYoej11KGIsZCxNKSk7Y29uc3QgRT1QfHx6O2lmKEUpZm9yKGxldCBDPTA7QzwzO0MrKyl7Y29uc3QgRj1nK0MsQj1iK0MsST1jW0ZdLFI9Y1tGKzNdLCQ9Y1tCXSxWPWNbQiszXTtjW2YrQ109STwkP0k6JCxjW2YrQyszXT1SPlY/UjpWfXJldHVybiBFfX19ZnVuY3Rpb24gdDAoaSx0LGUsbixzLHIsbyl7ZXQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKSxyYSgwLGksZSxuLHMscixvKSxldC5jbGVhckJ1ZmZlcigpfWZ1bmN0aW9uIHJhKGksdCxlLG4scyxyLG8pe2NvbnN0e2Zsb2F0MzJBcnJheTphLHVpbnQxNkFycmF5OmMsdWludDMyQXJyYXk6bH09ZXQsaD1pKjI7aWYoTnQoaCxjKSl7Y29uc3QgZj1VdChpLGwpLGQ9S3QoaCxjKTtWZCh0LGUsbixmLGQscyxyLG8pfWVsc2V7Y29uc3QgZj10ZShpKTtubihmLGEsbixyLG8pJiZyYShmLHQsZSxuLHMscixvKTtjb25zdCBkPWVlKGksbCk7bm4oZCxhLG4scixvKSYmcmEoZCx0LGUsbixzLHIsbyl9fWNvbnN0IGUwPVsieCIsInkiLCJ6Il07ZnVuY3Rpb24gbjAoaSx0LGUsbixzLHIpe2V0LnNldEJ1ZmZlcihpLl9yb290c1t0XSk7Y29uc3Qgbz1vYSgwLGksZSxuLHMscik7cmV0dXJuIGV0LmNsZWFyQnVmZmVyKCksb31mdW5jdGlvbiBvYShpLHQsZSxuLHMscil7Y29uc3R7ZmxvYXQzMkFycmF5Om8sdWludDE2QXJyYXk6YSx1aW50MzJBcnJheTpjfT1ldDtsZXQgbD1pKjI7aWYoTnQobCxhKSl7Y29uc3QgdT1VdChpLGMpLGY9S3QobCxhKTtyZXR1cm4gVWQodCxlLG4sdSxmLHMscil9ZWxzZXtjb25zdCB1PW1sKGksYyksZj1lMFt1XSxwPW4uZGlyZWN0aW9uW2ZdPj0wO2xldCB5LG07cD8oeT10ZShpKSxtPWVlKGksYykpOih5PWVlKGksYyksbT10ZShpKSk7Y29uc3QgYj1ubih5LG8sbixzLHIpP29hKHksdCxlLG4scyxyKTpudWxsO2lmKGIpe2NvbnN0IE09Yi5wb2ludFtmXTtpZihwP008PW9bbSt1XTpNPj1vW20rdSszXSlyZXR1cm4gYn1jb25zdCB3PW5uKG0sbyxuLHMscik/b2EobSx0LGUsbixzLHIpOm51bGw7cmV0dXJuIGImJnc/Yi5kaXN0YW5jZTw9dy5kaXN0YW5jZT9iOnc6Ynx8d3x8bnVsbH19Y29uc3QgV3M9bmV3IG10LG5pPW5ldyBuZSxpaT1uZXcgbmUsJGk9bmV3IHN0LFNsPW5ldyBUdCxIcz1uZXcgVHQ7ZnVuY3Rpb24gaTAoaSx0LGUsbil7ZXQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKTtjb25zdCBzPWFhKDAsaSxlLG4pO3JldHVybiBldC5jbGVhckJ1ZmZlcigpLHN9ZnVuY3Rpb24gYWEoaSx0LGUsbixzPW51bGwpe2NvbnN0e2Zsb2F0MzJBcnJheTpyLHVpbnQxNkFycmF5Om8sdWludDMyQXJyYXk6YX09ZXQ7bGV0IGM9aSoyO2lmKHM9PT1udWxsJiYoZS5ib3VuZGluZ0JveHx8ZS5jb21wdXRlQm91bmRpbmdCb3goKSxTbC5zZXQoZS5ib3VuZGluZ0JveC5taW4sZS5ib3VuZGluZ0JveC5tYXgsbikscz1TbCksTnQoYyxvKSl7Y29uc3QgaD10Lmdlb21ldHJ5LHU9aC5pbmRleCxmPWguYXR0cmlidXRlcy5wb3NpdGlvbixkPWUuaW5kZXgscD1lLmF0dHJpYnV0ZXMucG9zaXRpb24seT1VdChpLGEpLG09S3QoYyxvKTtpZigkaS5jb3B5KG4pLmludmVydCgpLGUuYm91bmRzVHJlZSlyZXR1cm4gbHQoaSxyLEhzKSxIcy5tYXRyaXguY29weSgkaSksSHMubmVlZHNVcGRhdGU9ITAsZS5ib3VuZHNUcmVlLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczpiPT5Icy5pbnRlcnNlY3RzQm94KGIpLGludGVyc2VjdHNUcmlhbmdsZTpiPT57Yi5hLmFwcGx5TWF0cml4NChuKSxiLmIuYXBwbHlNYXRyaXg0KG4pLGIuYy5hcHBseU1hdHJpeDQobiksYi5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHg9eSx3PW0reTt4PHc7eCsrKWlmKHB0KGlpLDMqdC5yZXNvbHZlVHJpYW5nbGVJbmRleCh4KSx1LGYpLGlpLm5lZWRzVXBkYXRlPSEwLGIuaW50ZXJzZWN0c1RyaWFuZ2xlKGlpKSlyZXR1cm4hMDtyZXR1cm4hMX19KTtmb3IobGV0IGc9eSxiPW0reTtnPGI7ZysrKXtjb25zdCB4PXQucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoZyk7cHQobmksMyp4LHUsZiksbmkuYS5hcHBseU1hdHJpeDQoJGkpLG5pLmIuYXBwbHlNYXRyaXg0KCRpKSxuaS5jLmFwcGx5TWF0cml4NCgkaSksbmkubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCB3PTAsTT1kLmNvdW50O3c8TTt3Kz0zKWlmKHB0KGlpLHcsZCxwKSxpaS5uZWVkc1VwZGF0ZT0hMCxuaS5pbnRlcnNlY3RzVHJpYW5nbGUoaWkpKXJldHVybiEwfX1lbHNle2NvbnN0IGg9aSs4LHU9YVtpKzZdO3JldHVybiBsdChoLHIsV3MpLCEhKHMuaW50ZXJzZWN0c0JveChXcykmJmFhKGgsdCxlLG4scyl8fChsdCh1LHIsV3MpLHMuaW50ZXJzZWN0c0JveChXcykmJmFhKHUsdCxlLG4scykpKX19Y29uc3QgSnM9bmV3IHN0LGNhPW5ldyBUdCxWaT1uZXcgVHQsczA9bmV3IFQscjA9bmV3IFQsbzA9bmV3IFQsYTA9bmV3IFQ7ZnVuY3Rpb24gYzAoaSx0LGUsbj17fSxzPXt9LHI9MCxvPTEvMCl7dC5ib3VuZGluZ0JveHx8dC5jb21wdXRlQm91bmRpbmdCb3goKSxjYS5zZXQodC5ib3VuZGluZ0JveC5taW4sdC5ib3VuZGluZ0JveC5tYXgsZSksY2EubmVlZHNVcGRhdGU9ITA7Y29uc3QgYT1pLmdlb21ldHJ5LGM9YS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGw9YS5pbmRleCxoPXQuYXR0cmlidXRlcy5wb3NpdGlvbix1PXQuaW5kZXgsZj1pZS5nZXRQcmltaXRpdmUoKSxkPWllLmdldFByaW1pdGl2ZSgpO2xldCBwPXMwLHk9cjAsbT1udWxsLGc9bnVsbDtzJiYobT1vMCxnPWEwKTtsZXQgYj0xLzAseD1udWxsLHc9bnVsbDtyZXR1cm4gSnMuY29weShlKS5pbnZlcnQoKSxWaS5tYXRyaXguY29weShKcyksaS5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6TT0+Y2EuZGlzdGFuY2VUb0JveChNKSxpbnRlcnNlY3RzQm91bmRzOihNLEEsUyk9PlM8YiYmUzxvPyhBJiYoVmkubWluLmNvcHkoTS5taW4pLFZpLm1heC5jb3B5KE0ubWF4KSxWaS5uZWVkc1VwZGF0ZT0hMCksITApOiExLGludGVyc2VjdHNSYW5nZTooTSxBKT0+e2lmKHQuYm91bmRzVHJlZSl7Y29uc3QgUz10LmJvdW5kc1RyZWU7cmV0dXJuIFMuc2hhcGVjYXN0KHtib3VuZHNUcmF2ZXJzZU9yZGVyOl89PlZpLmRpc3RhbmNlVG9Cb3goXyksaW50ZXJzZWN0c0JvdW5kczooXyx2LFApPT5QPGImJlA8byxpbnRlcnNlY3RzUmFuZ2U6KF8sdik9Pntmb3IobGV0IFA9Xyx6PV8rdjtQPHo7UCsrKXtjb25zdCBFPVMucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoUCk7cHQoZCwzKkUsdSxoKSxkLmEuYXBwbHlNYXRyaXg0KGUpLGQuYi5hcHBseU1hdHJpeDQoZSksZC5jLmFwcGx5TWF0cml4NChlKSxkLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgQz1NLEY9TStBO0M8RjtDKyspe2NvbnN0IEI9aS5yZXNvbHZlVHJpYW5nbGVJbmRleChDKTtwdChmLDMqQixsLGMpLGYubmVlZHNVcGRhdGU9ITA7Y29uc3QgST1mLmRpc3RhbmNlVG9UcmlhbmdsZShkLHAsbSk7aWYoSTxiJiYoeS5jb3B5KHApLGcmJmcuY29weShtKSxiPUkseD1DLHc9UCksSTxyKXJldHVybiEwfX19fSl9ZWxzZXtjb25zdCBTPWpuKHQpO2ZvcihsZXQgXz0wLHY9UztfPHY7XysrKXtwdChkLDMqXyx1LGgpLGQuYS5hcHBseU1hdHJpeDQoZSksZC5iLmFwcGx5TWF0cml4NChlKSxkLmMuYXBwbHlNYXRyaXg0KGUpLGQubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBQPU0sej1NK0E7UDx6O1ArKyl7Y29uc3QgRT1pLnJlc29sdmVUcmlhbmdsZUluZGV4KFApO3B0KGYsMypFLGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBDPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxtKTtpZihDPGImJih5LmNvcHkocCksZyYmZy5jb3B5KG0pLGI9Qyx4PVAsdz1fKSxDPHIpcmV0dXJuITB9fX19fSksaWUucmVsZWFzZVByaW1pdGl2ZShmKSxpZS5yZWxlYXNlUHJpbWl0aXZlKGQpLGI9PT0xLzA/bnVsbDoobi5wb2ludD9uLnBvaW50LmNvcHkoeSk6bi5wb2ludD15LmNsb25lKCksbi5kaXN0YW5jZT1iLG4uZmFjZUluZGV4PXgscyYmKHMucG9pbnQ/cy5wb2ludC5jb3B5KGcpOnMucG9pbnQ9Zy5jbG9uZSgpLHMucG9pbnQuYXBwbHlNYXRyaXg0KEpzKSx5LmFwcGx5TWF0cml4NChKcykscy5kaXN0YW5jZT15LnN1YihzLnBvaW50KS5sZW5ndGgoKSxzLmZhY2VJbmRleD13KSxuKX1mdW5jdGlvbiBsMCgpe3JldHVybiB0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIhPSJ1bmRlZmluZWQifWNvbnN0IFVpPW5ldyBldC5jb25zdHJ1Y3RvcixZcz1uZXcgZXQuY29uc3RydWN0b3Isc249bmV3IFFvKCgpPT5uZXcgbXQpLHNpPW5ldyBtdCxyaT1uZXcgbXQsbGE9bmV3IG10LGhhPW5ldyBtdDtsZXQgdWE9ITE7ZnVuY3Rpb24gaDAoaSx0LGUsbil7aWYodWEpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBSZWN1cnNpdmUgY2FsbHMgdG8gYnZoY2FzdCBub3Qgc3VwcG9ydGVkLiIpO3VhPSEwO2NvbnN0IHM9aS5fcm9vdHMscj10Ll9yb290cztsZXQgbyxhPTAsYz0wO2NvbnN0IGw9bmV3IHN0KCkuY29weShlKS5pbnZlcnQoKTtmb3IobGV0IGg9MCx1PXMubGVuZ3RoO2g8dTtoKyspe1VpLnNldEJ1ZmZlcihzW2hdKSxjPTA7Y29uc3QgZj1zbi5nZXRQcmltaXRpdmUoKTtsdCgwLFVpLmZsb2F0MzJBcnJheSxmKSxmLmFwcGx5TWF0cml4NChsKTtmb3IobGV0IGQ9MCxwPXIubGVuZ3RoO2Q8cCYmKFlzLnNldEJ1ZmZlcihyW2RdKSxvPWZlKDAsMCxlLGwsbixhLGMsMCwwLGYpLFlzLmNsZWFyQnVmZmVyKCksYys9cltkXS5sZW5ndGgsIW8pO2QrKyk7aWYoc24ucmVsZWFzZVByaW1pdGl2ZShmKSxVaS5jbGVhckJ1ZmZlcigpLGErPXNbaF0ubGVuZ3RoLG8pYnJlYWt9cmV0dXJuIHVhPSExLG99ZnVuY3Rpb24gZmUoaSx0LGUsbixzLHI9MCxvPTAsYT0wLGM9MCxsPW51bGwsaD0hMSl7bGV0IHUsZjtoPyh1PVlzLGY9VWkpOih1PVVpLGY9WXMpO2NvbnN0IGQ9dS5mbG9hdDMyQXJyYXkscD11LnVpbnQzMkFycmF5LHk9dS51aW50MTZBcnJheSxtPWYuZmxvYXQzMkFycmF5LGc9Zi51aW50MzJBcnJheSxiPWYudWludDE2QXJyYXkseD1pKjIsdz10KjIsTT1OdCh4LHkpLEE9TnQodyxiKTtsZXQgUz0hMTtpZihBJiZNKWg/Uz1zKFV0KHQsZyksS3QodCoyLGIpLFV0KGkscCksS3QoaSoyLHkpLGMsbyt0LGEscitpKTpTPXMoVXQoaSxwKSxLdChpKjIseSksVXQodCxnKSxLdCh0KjIsYiksYSxyK2ksYyxvK3QpO2Vsc2UgaWYoQSl7Y29uc3QgXz1zbi5nZXRQcmltaXRpdmUoKTtsdCh0LG0sXyksXy5hcHBseU1hdHJpeDQoZSk7Y29uc3Qgdj10ZShpKSxQPWVlKGkscCk7bHQodixkLHNpKSxsdChQLGQscmkpO2NvbnN0IHo9Xy5pbnRlcnNlY3RzQm94KHNpKSxFPV8uaW50ZXJzZWN0c0JveChyaSk7Uz16JiZmZSh0LHYsbixlLHMsbyxyLGMsYSsxLF8sIWgpfHxFJiZmZSh0LFAsbixlLHMsbyxyLGMsYSsxLF8sIWgpLHNuLnJlbGVhc2VQcmltaXRpdmUoXyl9ZWxzZXtjb25zdCBfPXRlKHQpLHY9ZWUodCxnKTtsdChfLG0sbGEpLGx0KHYsbSxoYSk7Y29uc3QgUD1sLmludGVyc2VjdHNCb3gobGEpLHo9bC5pbnRlcnNlY3RzQm94KGhhKTtpZihQJiZ6KVM9ZmUoaSxfLGUsbixzLHIsbyxhLGMrMSxsLGgpfHxmZShpLHYsZSxuLHMscixvLGEsYysxLGwsaCk7ZWxzZSBpZihQKWlmKE0pUz1mZShpLF8sZSxuLHMscixvLGEsYysxLGwsaCk7ZWxzZXtjb25zdCBFPXNuLmdldFByaW1pdGl2ZSgpO0UuY29weShsYSkuYXBwbHlNYXRyaXg0KGUpO2NvbnN0IEM9dGUoaSksRj1lZShpLHApO2x0KEMsZCxzaSksbHQoRixkLHJpKTtjb25zdCBCPUUuaW50ZXJzZWN0c0JveChzaSksST1FLmludGVyc2VjdHNCb3gocmkpO1M9QiYmZmUoXyxDLG4sZSxzLG8scixjLGErMSxFLCFoKXx8SSYmZmUoXyxGLG4sZSxzLG8scixjLGErMSxFLCFoKSxzbi5yZWxlYXNlUHJpbWl0aXZlKEUpfWVsc2UgaWYoeilpZihNKVM9ZmUoaSx2LGUsbixzLHIsbyxhLGMrMSxsLGgpO2Vsc2V7Y29uc3QgRT1zbi5nZXRQcmltaXRpdmUoKTtFLmNvcHkoaGEpLmFwcGx5TWF0cml4NChlKTtjb25zdCBDPXRlKGkpLEY9ZWUoaSxwKTtsdChDLGQsc2kpLGx0KEYsZCxyaSk7Y29uc3QgQj1FLmludGVyc2VjdHNCb3goc2kpLEk9RS5pbnRlcnNlY3RzQm94KHJpKTtTPUImJmZlKHYsQyxuLGUscyxvLHIsYyxhKzEsRSwhaCl8fEkmJmZlKHYsRixuLGUscyxvLHIsYyxhKzEsRSwhaCksc24ucmVsZWFzZVByaW1pdGl2ZShFKX19cmV0dXJuIFN9Y29uc3QganM9bmV3IFR0LHZsPW5ldyBtdCx1MD17c3RyYXRlZ3k6Y2wsbWF4RGVwdGg6NDAsbWF4TGVhZlRyaXM6MTAsdXNlU2hhcmVkQXJyYXlCdWZmZXI6ITEsc2V0Qm91bmRpbmdCb3g6ITAsb25Qcm9ncmVzczpudWxsLGluZGlyZWN0OiExLHZlcmJvc2U6ITAscmFuZ2U6bnVsbH07Y2xhc3MgZmF7c3RhdGljIHNlcmlhbGl6ZSh0LGU9e30pe2U9SXQoe2Nsb25lQnVmZmVyczohMH0sZSk7Y29uc3Qgbj10Lmdlb21ldHJ5LHM9dC5fcm9vdHMscj10Ll9pbmRpcmVjdEJ1ZmZlcixvPW4uZ2V0SW5kZXgoKTtsZXQgYTtyZXR1cm4gZS5jbG9uZUJ1ZmZlcnM/YT17cm9vdHM6cy5tYXAoYz0+Yy5zbGljZSgpKSxpbmRleDpvP28uYXJyYXkuc2xpY2UoKTpudWxsLGluZGlyZWN0QnVmZmVyOnI/ci5zbGljZSgpOm51bGx9OmE9e3Jvb3RzOnMsaW5kZXg6bz9vLmFycmF5Om51bGwsaW5kaXJlY3RCdWZmZXI6cn0sYX1zdGF0aWMgZGVzZXJpYWxpemUodCxlLG49e30pe249SXQoe3NldEluZGV4OiEwLGluZGlyZWN0OiEhdC5pbmRpcmVjdEJ1ZmZlcn0sbik7Y29uc3R7aW5kZXg6cyxyb290czpyLGluZGlyZWN0QnVmZmVyOm99PXQsYT1uZXcgZmEoZSxIZShJdCh7fSxuKSx7W0dvXTohMH0pKTtpZihhLl9yb290cz1yLGEuX2luZGlyZWN0QnVmZmVyPW98fG51bGwsbi5zZXRJbmRleCl7Y29uc3QgYz1lLmdldEluZGV4KCk7aWYoYz09PW51bGwpe2NvbnN0IGw9bmV3IGd0KHQuaW5kZXgsMSwhMSk7ZS5zZXRJbmRleChsKX1lbHNlIGMuYXJyYXkhPT1zJiYoYy5hcnJheS5zZXQocyksYy5uZWVkc1VwZGF0ZT0hMCl9cmV0dXJuIGF9Z2V0IGluZGlyZWN0KCl7cmV0dXJuISF0aGlzLl9pbmRpcmVjdEJ1ZmZlcn1jb25zdHJ1Y3Rvcih0LGU9e30pe2lmKHQuaXNCdWZmZXJHZW9tZXRyeSl7aWYodC5pbmRleCYmdC5pbmRleC5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXRocm93IG5ldyBFcnJvcigiTWVzaEJWSDogSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhlIGluZGV4IGF0dHJpYnV0ZS4iKX1lbHNlIHRocm93IG5ldyBFcnJvcigiTWVzaEJWSDogT25seSBCdWZmZXJHZW9tZXRyaWVzIGFyZSBzdXBwb3J0ZWQuIik7aWYoZT1PYmplY3QuYXNzaWduKEhlKEl0KHt9LHUwKSx7W0dvXTohMX0pLGUpLGUudXNlU2hhcmVkQXJyYXlCdWZmZXImJiFsMCgpKXRocm93IG5ldyBFcnJvcigiTWVzaEJWSDogU2hhcmVkQXJyYXlCdWZmZXIgaXMgbm90IGF2YWlsYWJsZS4iKTt0aGlzLmdlb21ldHJ5PXQsdGhpcy5fcm9vdHM9bnVsbCx0aGlzLl9pbmRpcmVjdEJ1ZmZlcj1udWxsLGVbR29dfHwoemQodGhpcyxlKSwhdC5ib3VuZGluZ0JveCYmZS5zZXRCb3VuZGluZ0JveCYmKHQuYm91bmRpbmdCb3g9dGhpcy5nZXRCb3VuZGluZ0JveChuZXcgbXQpKSksdGhpcy5yZXNvbHZlVHJpYW5nbGVJbmRleD1lLmluZGlyZWN0P249PnRoaXMuX2luZGlyZWN0QnVmZmVyW25dOm49Pm59cmVmaXQodD1udWxsKXtyZXR1cm4odGhpcy5pbmRpcmVjdD9LZDokZCkodGhpcyx0KX10cmF2ZXJzZSh0LGU9MCl7Y29uc3Qgbj10aGlzLl9yb290c1tlXSxzPW5ldyBVaW50MzJBcnJheShuKSxyPW5ldyBVaW50MTZBcnJheShuKTtvKDApO2Z1bmN0aW9uIG8oYSxjPTApe2NvbnN0IGw9YSoyLGg9cltsKzE1XT09PU5zO2lmKGgpe2NvbnN0IHU9c1thKzZdLGY9cltsKzE0XTt0KGMsaCxuZXcgRmxvYXQzMkFycmF5KG4sYSo0LDYpLHUsZil9ZWxzZXtjb25zdCB1PWErSWkvNCxmPXNbYSs2XSxkPXNbYSs3XTt0KGMsaCxuZXcgRmxvYXQzMkFycmF5KG4sYSo0LDYpLGQpfHwobyh1LGMrMSksbyhmLGMrMSkpfX19cmF5Y2FzdCh0LGU9MCxuPTAscz0xLzApe2NvbnN0IHI9dGhpcy5fcm9vdHMsbz10aGlzLmdlb21ldHJ5LGE9W10sYz1lLmlzTWF0ZXJpYWwsbD1BcnJheS5pc0FycmF5KGUpLGg9by5ncm91cHMsdT1jP2Uuc2lkZTplLGY9dGhpcy5pbmRpcmVjdD90MDpYZDtmb3IobGV0IGQ9MCxwPXIubGVuZ3RoO2Q8cDtkKyspe2NvbnN0IHk9bD9lW2hbZF0ubWF0ZXJpYWxJbmRleF0uc2lkZTp1LG09YS5sZW5ndGg7aWYoZih0aGlzLGQseSx0LGEsbixzKSxsKXtjb25zdCBnPWhbZF0ubWF0ZXJpYWxJbmRleDtmb3IobGV0IGI9bSx4PWEubGVuZ3RoO2I8eDtiKyspYVtiXS5mYWNlLm1hdGVyaWFsSW5kZXg9Z319cmV0dXJuIGF9cmF5Y2FzdEZpcnN0KHQsZT0wLG49MCxzPTEvMCl7Y29uc3Qgcj10aGlzLl9yb290cyxvPXRoaXMuZ2VvbWV0cnksYT1lLmlzTWF0ZXJpYWwsYz1BcnJheS5pc0FycmF5KGUpO2xldCBsPW51bGw7Y29uc3QgaD1vLmdyb3Vwcyx1PWE/ZS5zaWRlOmUsZj10aGlzLmluZGlyZWN0P24wOlpkO2ZvcihsZXQgZD0wLHA9ci5sZW5ndGg7ZDxwO2QrKyl7Y29uc3QgeT1jP2VbaFtkXS5tYXRlcmlhbEluZGV4XS5zaWRlOnUsbT1mKHRoaXMsZCx5LHQsbixzKTttIT1udWxsJiYobD09bnVsbHx8bS5kaXN0YW5jZTxsLmRpc3RhbmNlKSYmKGw9bSxjJiYobS5mYWNlLm1hdGVyaWFsSW5kZXg9aFtkXS5tYXRlcmlhbEluZGV4KSl9cmV0dXJuIGx9aW50ZXJzZWN0c0dlb21ldHJ5KHQsZSl7bGV0IG49ITE7Y29uc3Qgcz10aGlzLl9yb290cyxyPXRoaXMuaW5kaXJlY3Q/aTA6V2Q7Zm9yKGxldCBvPTAsYT1zLmxlbmd0aDtvPGEmJihuPXIodGhpcyxvLHQsZSksIW4pO28rKyk7cmV0dXJuIG59c2hhcGVjYXN0KHQpe2NvbnN0IGU9aWUuZ2V0UHJpbWl0aXZlKCksbj10aGlzLmluZGlyZWN0P3FkOkRkO2xldHtib3VuZHNUcmF2ZXJzZU9yZGVyOnMsaW50ZXJzZWN0c0JvdW5kczpyLGludGVyc2VjdHNSYW5nZTpvLGludGVyc2VjdHNUcmlhbmdsZTphfT10O2lmKG8mJmEpe2NvbnN0IHU9bztvPShmLGQscCx5LG0pPT51KGYsZCxwLHksbSk/ITA6bihmLGQsdGhpcyxhLHAseSxlKX1lbHNlIG98fChhP289KHUsZixkLHApPT5uKHUsZix0aGlzLGEsZCxwLGUpOm89KHUsZixkKT0+ZCk7bGV0IGM9ITEsbD0wO2NvbnN0IGg9dGhpcy5fcm9vdHM7Zm9yKGxldCB1PTAsZj1oLmxlbmd0aDt1PGY7dSsrKXtjb25zdCBkPWhbdV07aWYoYz1GZCh0aGlzLHUscixvLHMsbCksYylicmVhaztsKz1kLmJ5dGVMZW5ndGh9cmV0dXJuIGllLnJlbGVhc2VQcmltaXRpdmUoZSksY31idmhjYXN0KHQsZSxuKXtsZXR7aW50ZXJzZWN0c1JhbmdlczpzLGludGVyc2VjdHNUcmlhbmdsZXM6cn09bjtjb25zdCBvPWllLmdldFByaW1pdGl2ZSgpLGE9dGhpcy5nZW9tZXRyeS5pbmRleCxjPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbixsPXRoaXMuaW5kaXJlY3Q/cD0+e2NvbnN0IHk9dGhpcy5yZXNvbHZlVHJpYW5nbGVJbmRleChwKTtwdChvLHkqMyxhLGMpfTpwPT57cHQobyxwKjMsYSxjKX0saD1pZS5nZXRQcmltaXRpdmUoKSx1PXQuZ2VvbWV0cnkuaW5kZXgsZj10Lmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sZD10LmluZGlyZWN0P3A9Pntjb25zdCB5PXQucmVzb2x2ZVRyaWFuZ2xlSW5kZXgocCk7cHQoaCx5KjMsdSxmKX06cD0+e3B0KGgscCozLHUsZil9O2lmKHIpe2NvbnN0IHA9KHksbSxnLGIseCx3LE0sQSk9Pntmb3IobGV0IFM9ZyxfPWcrYjtTPF87UysrKXtkKFMpLGguYS5hcHBseU1hdHJpeDQoZSksaC5iLmFwcGx5TWF0cml4NChlKSxoLmMuYXBwbHlNYXRyaXg0KGUpLGgubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCB2PXksUD15K207djxQO3YrKylpZihsKHYpLG8ubmVlZHNVcGRhdGU9ITAscihvLGgsdixTLHgsdyxNLEEpKXJldHVybiEwfXJldHVybiExfTtpZihzKXtjb25zdCB5PXM7cz1mdW5jdGlvbihtLGcsYix4LHcsTSxBLFMpe3JldHVybiB5KG0sZyxiLHgsdyxNLEEsUyk/ITA6cChtLGcsYix4LHcsTSxBLFMpfX1lbHNlIHM9cH1yZXR1cm4gaDAodGhpcyx0LGUscyl9aW50ZXJzZWN0c0JveCh0LGUpe3JldHVybiBqcy5zZXQodC5taW4sdC5tYXgsZSksanMubmVlZHNVcGRhdGU9ITAsdGhpcy5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6bj0+anMuaW50ZXJzZWN0c0JveChuKSxpbnRlcnNlY3RzVHJpYW5nbGU6bj0+anMuaW50ZXJzZWN0c1RyaWFuZ2xlKG4pfSl9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6ZT0+dC5pbnRlcnNlY3RzQm94KGUpLGludGVyc2VjdHNUcmlhbmdsZTplPT5lLmludGVyc2VjdHNTcGhlcmUodCl9KX1jbG9zZXN0UG9pbnRUb0dlb21ldHJ5KHQsZSxuPXt9LHM9e30scj0wLG89MS8wKXtyZXR1cm4odGhpcy5pbmRpcmVjdD9jMDpRZCkodGhpcyx0LGUsbixzLHIsbyl9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGU9e30sbj0wLHM9MS8wKXtyZXR1cm4gSWQodGhpcyx0LGUsbixzKX1nZXRCb3VuZGluZ0JveCh0KXtyZXR1cm4gdC5tYWtlRW1wdHkoKSx0aGlzLl9yb290cy5mb3JFYWNoKG49PntsdCgwLG5ldyBGbG9hdDMyQXJyYXkobiksdmwpLHQudW5pb24odmwpfSksdH19Y29uc3QgX2w9MWUtNixmMD1fbCouNSx6bD1NYXRoLnBvdygxMCwtTWF0aC5sb2cxMChfbCkpLGQwPWYwKnpsO2Z1bmN0aW9uIGJlKGkpe3JldHVybn5+KGkqemwrZDApfWZ1bmN0aW9uIHAwKGkpe3JldHVybmAke2JlKGkueCl9LCR7YmUoaS55KX1gfWZ1bmN0aW9uIFRsKGkpe3JldHVybmAke2JlKGkueCl9LCR7YmUoaS55KX0sJHtiZShpLnopfWB9ZnVuY3Rpb24geTAoaSl7cmV0dXJuYCR7YmUoaS54KX0sJHtiZShpLnkpfSwke2JlKGkueil9LCR7YmUoaS53KX1gfWZ1bmN0aW9uIG0wKGksdCxlKXtlLmRpcmVjdGlvbi5zdWJWZWN0b3JzKHQsaSkubm9ybWFsaXplKCk7Y29uc3Qgbj1pLmRvdChlLmRpcmVjdGlvbik7cmV0dXJuIGUub3JpZ2luLmNvcHkoaSkuYWRkU2NhbGVkVmVjdG9yKGUuZGlyZWN0aW9uLC1uKSxlfWZ1bmN0aW9uIFBsKCl7cmV0dXJuIHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciE9InVuZGVmaW5lZCJ9ZnVuY3Rpb24gZzAoaSl7aWYoaS5idWZmZXIgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcilyZXR1cm4gaTtjb25zdCB0PWkuY29uc3RydWN0b3IsZT1pLmJ1ZmZlcixuPW5ldyBTaGFyZWRBcnJheUJ1ZmZlcihlLmJ5dGVMZW5ndGgpLHM9bmV3IFVpbnQ4QXJyYXkoZSk7cmV0dXJuIG5ldyBVaW50OEFycmF5KG4pLnNldChzLDApLG5ldyB0KG4pfWZ1bmN0aW9uIHgwKGksdD1BcnJheUJ1ZmZlcil7cmV0dXJuIGk+NjU1MzU/bmV3IFVpbnQzMkFycmF5KG5ldyB0KDQqaSkpOm5ldyBVaW50MTZBcnJheShuZXcgdCgyKmkpKX1mdW5jdGlvbiB3MChpLHQpe2lmKCFpLmluZGV4KXtjb25zdCBlPWkuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudCxuPXQudXNlU2hhcmVkQXJyYXlCdWZmZXI/U2hhcmVkQXJyYXlCdWZmZXI6QXJyYXlCdWZmZXIscz14MChlLG4pO2kuc2V0SW5kZXgobmV3IGd0KHMsMSkpO2ZvcihsZXQgcj0wO3I8ZTtyKyspc1tyXT1yfX1mdW5jdGlvbiBiMChpKXtyZXR1cm4gaS5pbmRleD9pLmluZGV4LmNvdW50OmkuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudH1mdW5jdGlvbiBkYShpKXtyZXR1cm4gYjAoaSkvM31jb25zdCBNMD0xZS04LEEwPW5ldyBUO2Z1bmN0aW9uIFMwKGkpe3JldHVybn5+KGkvMyl9ZnVuY3Rpb24gdjAoaSl7cmV0dXJuIGklM31mdW5jdGlvbiBDbChpLHQpe3JldHVybiBpLnN0YXJ0LXQuc3RhcnR9ZnVuY3Rpb24gRWwoaSx0KXtyZXR1cm4gQTAuc3ViVmVjdG9ycyh0LGkub3JpZ2luKS5kb3QoaS5kaXJlY3Rpb24pfWZ1bmN0aW9uIF8wKGksdCxlLG49TTApe2kuc29ydChDbCksdC5zb3J0KENsKTtmb3IobGV0IGE9MDthPGkubGVuZ3RoO2ErKyl7Y29uc3QgYz1pW2FdO2ZvcihsZXQgbD0wO2w8dC5sZW5ndGg7bCsrKXtjb25zdCBoPXRbbF07aWYoIShoLnN0YXJ0PmMuZW5kKSl7aWYoYy5lbmQ8aC5zdGFydHx8aC5lbmQ8Yy5zdGFydCljb250aW51ZTtpZihjLnN0YXJ0PD1oLnN0YXJ0JiZjLmVuZD49aC5lbmQpcihoLmVuZCxjLmVuZCl8fGkuc3BsaWNlKGErMSwwLHtzdGFydDpoLmVuZCxlbmQ6Yy5lbmQsaW5kZXg6Yy5pbmRleH0pLGMuZW5kPWguc3RhcnQsaC5zdGFydD0wLGguZW5kPTA7ZWxzZSBpZihjLnN0YXJ0Pj1oLnN0YXJ0JiZjLmVuZDw9aC5lbmQpcihjLmVuZCxoLmVuZCl8fHQuc3BsaWNlKGwrMSwwLHtzdGFydDpjLmVuZCxlbmQ6aC5lbmQsaW5kZXg6aC5pbmRleH0pLGguZW5kPWMuc3RhcnQsYy5zdGFydD0wLGMuZW5kPTA7ZWxzZSBpZihjLnN0YXJ0PD1oLnN0YXJ0JiZjLmVuZDw9aC5lbmQpe2NvbnN0IHU9Yy5lbmQ7Yy5lbmQ9aC5zdGFydCxoLnN0YXJ0PXV9ZWxzZSBpZihjLnN0YXJ0Pj1oLnN0YXJ0JiZjLmVuZD49aC5lbmQpe2NvbnN0IHU9aC5lbmQ7aC5lbmQ9Yy5zdGFydCxjLnN0YXJ0PXV9ZWxzZSB0aHJvdyBuZXcgRXJyb3J9aWYoZS5oYXMoYy5pbmRleCl8fGUuc2V0KGMuaW5kZXgsW10pLGUuaGFzKGguaW5kZXgpfHxlLnNldChoLmluZGV4LFtdKSxlLmdldChjLmluZGV4KS5wdXNoKGguaW5kZXgpLGUuZ2V0KGguaW5kZXgpLnB1c2goYy5pbmRleCksbyhoKSYmKHQuc3BsaWNlKGwsMSksbC0tKSxvKGMpKXtpLnNwbGljZShhLDEpLGEtLTticmVha319fXMoaSkscyh0KTtmdW5jdGlvbiBzKGEpe2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKW8oYVtjXSkmJihhLnNwbGljZShjLDEpLGMtLSl9ZnVuY3Rpb24gcihhLGMpe3JldHVybiBNYXRoLmFicyhjLWEpPG59ZnVuY3Rpb24gbyhhKXtyZXR1cm4gTWF0aC5hYnMoYS5lbmQtYS5zdGFydCk8bn19Y29uc3QgQmw9MWUtNSxGbD0xZS00O2NsYXNzIHowe2NvbnN0cnVjdG9yKCl7dGhpcy5fcmF5cz1bXX1hZGRSYXkodCl7dGhpcy5fcmF5cy5wdXNoKHQpfWZpbmRDbG9zZXN0UmF5KHQpe2NvbnN0IGU9dGhpcy5fcmF5cyxuPXQuY2xvbmUoKTtuLmRpcmVjdGlvbi5tdWx0aXBseVNjYWxhcigtMSk7bGV0IHM9MS8wLHI9bnVsbDtmb3IobGV0IGM9MCxsPWUubGVuZ3RoO2M8bDtjKyspe2NvbnN0IGg9ZVtjXTtpZihvKGgsdCkmJm8oaCxuKSljb250aW51ZTtjb25zdCB1PWEoaCx0KSxmPWEoaCxuKSxkPU1hdGgubWluKHUsZik7ZDxzJiYocz1kLHI9aCl9cmV0dXJuIHI7ZnVuY3Rpb24gbyhjLGwpe2NvbnN0IGg9Yy5vcmlnaW4uZGlzdGFuY2VUbyhsLm9yaWdpbik+Qmw7cmV0dXJuIGMuZGlyZWN0aW9uLmFuZ2xlVG8obC5kaXJlY3Rpb24pPkZsfHxofWZ1bmN0aW9uIGEoYyxsKXtjb25zdCBoPWMub3JpZ2luLmRpc3RhbmNlVG8obC5vcmlnaW4pLHU9Yy5kaXJlY3Rpb24uYW5nbGVUbyhsLmRpcmVjdGlvbik7cmV0dXJuIGgvQmwrdS9GbH19fWNvbnN0IHBhPW5ldyBULHlhPW5ldyBULFFzPW5ldyB4bztmdW5jdGlvbiBUMChpLHQsZSl7Y29uc3Qgbj1pLmF0dHJpYnV0ZXMscz1pLmluZGV4LHI9bi5wb3NpdGlvbixvPW5ldyBNYXAsYT1uZXcgTWFwLGM9QXJyYXkuZnJvbSh0KSxsPW5ldyB6MDtmb3IobGV0IGg9MCx1PWMubGVuZ3RoO2g8dTtoKyspe2NvbnN0IGY9Y1toXSxkPVMwKGYpLHA9djAoZik7bGV0IHk9MypkK3AsbT0zKmQrKHArMSklMztzJiYoeT1zLmdldFgoeSksbT1zLmdldFgobSkpLHBhLmZyb21CdWZmZXJBdHRyaWJ1dGUocix5KSx5YS5mcm9tQnVmZmVyQXR0cmlidXRlKHIsbSksbTAocGEseWEsUXMpO2xldCBnLGI9bC5maW5kQ2xvc2VzdFJheShRcyk7Yj09PW51bGwmJihiPVFzLmNsb25lKCksbC5hZGRSYXkoYikpLGEuaGFzKGIpfHxhLnNldChiLHtmb3J3YXJkOltdLHJldmVyc2U6W10scmF5OmJ9KSxnPWEuZ2V0KGIpO2xldCB4PUVsKGIscGEpLHc9RWwoYix5YSk7eD53JiYoW3gsd109W3cseF0pLFFzLmRpcmVjdGlvbi5kb3QoYi5kaXJlY3Rpb24pPDA/Zy5yZXZlcnNlLnB1c2goe3N0YXJ0OngsZW5kOncsaW5kZXg6Zn0pOmcuZm9yd2FyZC5wdXNoKHtzdGFydDp4LGVuZDp3LGluZGV4OmZ9KX1yZXR1cm4gYS5mb3JFYWNoKCh7Zm9yd2FyZDpoLHJldmVyc2U6dX0sZik9PntfMChoLHUsbyxlKSxoLmxlbmd0aD09PTAmJnUubGVuZ3RoPT09MCYmYS5kZWxldGUoZil9KSx7ZGlzam9pbnRDb25uZWN0aXZpdHlNYXA6byxmcmFnbWVudE1hcDphfX1jb25zdCBQMD1uZXcgTixtYT1uZXcgVCxDMD1uZXcgWXQsZ2E9WyIiLCIiLCIiXTtjbGFzcyBFMHtjb25zdHJ1Y3Rvcih0PW51bGwpe3RoaXMuZGF0YT1udWxsLHRoaXMuZGlzam9pbnRDb25uZWN0aW9ucz1udWxsLHRoaXMudW5tYXRjaGVkRGlzam9pbnRFZGdlcz1udWxsLHRoaXMudW5tYXRjaGVkRWRnZXM9LTEsdGhpcy5tYXRjaGVkRWRnZXM9LTEsdGhpcy51c2VEcmF3UmFuZ2U9ITAsdGhpcy51c2VBbGxBdHRyaWJ1dGVzPSExLHRoaXMubWF0Y2hEaXNqb2ludEVkZ2VzPSExLHRoaXMuZGVnZW5lcmF0ZUVwc2lsb249MWUtOCx0JiZ0aGlzLnVwZGF0ZUZyb20odCl9Z2V0U2libGluZ1RyaWFuZ2xlSW5kZXgodCxlKXtjb25zdCBuPXRoaXMuZGF0YVt0KjMrZV07cmV0dXJuIG49PT0tMT8tMTp+fihuLzMpfWdldFNpYmxpbmdFZGdlSW5kZXgodCxlKXtjb25zdCBuPXRoaXMuZGF0YVt0KjMrZV07cmV0dXJuIG49PT0tMT8tMTpuJTN9Z2V0RGlzam9pbnRTaWJsaW5nVHJpYW5nbGVJbmRpY2VzKHQsZSl7Y29uc3Qgbj10KjMrZSxzPXRoaXMuZGlzam9pbnRDb25uZWN0aW9ucy5nZXQobik7cmV0dXJuIHM/cy5tYXAocj0+fn4oci8zKSk6W119Z2V0RGlzam9pbnRTaWJsaW5nRWRnZUluZGljZXModCxlKXtjb25zdCBuPXQqMytlLHM9dGhpcy5kaXNqb2ludENvbm5lY3Rpb25zLmdldChuKTtyZXR1cm4gcz9zLm1hcChyPT5yJTMpOltdfWlzRnVsbHlDb25uZWN0ZWQoKXtyZXR1cm4gdGhpcy51bm1hdGNoZWRFZGdlcz09PTB9dXBkYXRlRnJvbSh0KXtjb25zdHt1c2VBbGxBdHRyaWJ1dGVzOmUsdXNlRHJhd1JhbmdlOm4sbWF0Y2hEaXNqb2ludEVkZ2VzOnMsZGVnZW5lcmF0ZUVwc2lsb246cn09dGhpcyxvPWU/eDpiLGE9bmV3IE1hcCx7YXR0cmlidXRlczpjfT10LGw9ZT9PYmplY3Qua2V5cyhjKTpudWxsLGg9dC5pbmRleCx1PWMucG9zaXRpb247bGV0IGY9ZGEodCk7Y29uc3QgZD1mO2xldCBwPTA7biYmKHA9dC5kcmF3UmFuZ2Uuc3RhcnQsdC5kcmF3UmFuZ2UuY291bnQhPT0xLzAmJihmPX5+KHQuZHJhd1JhbmdlLmNvdW50LzMpKSk7bGV0IHk9dGhpcy5kYXRhOygheXx8eS5sZW5ndGg8MypkKSYmKHk9bmV3IEludDMyQXJyYXkoMypkKSkseS5maWxsKC0xKTtsZXQgbT0wLGc9bmV3IFNldDtmb3IobGV0IHc9cCxNPWYqMytwO3c8TTt3Kz0zKXtjb25zdCBBPXc7Zm9yKGxldCBTPTA7UzwzO1MrKyl7bGV0IF89QStTO2gmJihfPWguZ2V0WChfKSksZ2FbU109byhfKX1mb3IobGV0IFM9MDtTPDM7UysrKXtjb25zdCBfPShTKzEpJTMsdj1nYVtTXSxQPWdhW19dLHo9YCR7UH1fJHt2fWA7aWYoYS5oYXMoeikpe2NvbnN0IEU9QStTLEM9YS5nZXQoeik7eVtFXT1DLHlbQ109RSxhLmRlbGV0ZSh6KSxtKz0yLGcuZGVsZXRlKEMpfWVsc2V7Y29uc3QgRT1gJHt2fV8ke1B9YCxDPUErUzthLnNldChFLEMpLGcuYWRkKEMpfX19aWYocyl7Y29uc3R7ZnJhZ21lbnRNYXA6dyxkaXNqb2ludENvbm5lY3Rpdml0eU1hcDpNfT1UMCh0LGcscik7Zy5jbGVhcigpLHcuZm9yRWFjaCgoe2ZvcndhcmQ6QSxyZXZlcnNlOlN9KT0+e0EuZm9yRWFjaCgoe2luZGV4Ol99KT0+Zy5hZGQoXykpLFMuZm9yRWFjaCgoe2luZGV4Ol99KT0+Zy5hZGQoXykpfSksdGhpcy51bm1hdGNoZWREaXNqb2ludEVkZ2VzPXcsdGhpcy5kaXNqb2ludENvbm5lY3Rpb25zPU0sbT1mKjMtZy5zaXplfXRoaXMubWF0Y2hlZEVkZ2VzPW0sdGhpcy51bm1hdGNoZWRFZGdlcz1nLnNpemUsdGhpcy5kYXRhPXk7ZnVuY3Rpb24gYih3KXtyZXR1cm4gbWEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh1LHcpLFRsKG1hKX1mdW5jdGlvbiB4KHcpe2xldCBNPSIiO2ZvcihsZXQgQT0wLFM9bC5sZW5ndGg7QTxTO0ErKyl7Y29uc3QgXz1jW2xbQV1dO2xldCB2O3N3aXRjaChfLml0ZW1TaXplKXtjYXNlIDE6dj1iZShfLmdldFgodykpO2JyZWFrO2Nhc2UgMjp2PXAwKFAwLmZyb21CdWZmZXJBdHRyaWJ1dGUoXyx3KSk7YnJlYWs7Y2FzZSAzOnY9VGwobWEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShfLHcpKTticmVhaztjYXNlIDQ6dj15MChDMC5mcm9tQnVmZmVyQXR0cmlidXRlKF8sdykpO2JyZWFrfU0hPT0iIiYmKE0rPSJ8IiksTSs9dn1yZXR1cm4gTX19fWNsYXNzIEtzIGV4dGVuZHMgemZ7Y29uc3RydWN0b3IoLi4udCl7c3VwZXIoLi4udCksdGhpcy5pc0JydXNoPSEwLHRoaXMuX3ByZXZpb3VzTWF0cml4PW5ldyBzdCx0aGlzLl9wcmV2aW91c01hdHJpeC5lbGVtZW50cy5maWxsKDApfW1hcmtVcGRhdGVkKCl7dGhpcy5fcHJldmlvdXNNYXRyaXguY29weSh0aGlzLm1hdHJpeCl9aXNEaXJ0eSgpe2NvbnN0e21hdHJpeDp0LF9wcmV2aW91c01hdHJpeDplfT10aGlzLG49dC5lbGVtZW50cyxzPWUuZWxlbWVudHM7Zm9yKGxldCByPTA7cjwxNjtyKyspaWYobltyXSE9PXNbcl0pcmV0dXJuITA7cmV0dXJuITF9cHJlcGFyZUdlb21ldHJ5KCl7Y29uc3QgdD10aGlzLmdlb21ldHJ5LGU9dC5hdHRyaWJ1dGVzLG49UGwoKTtpZihuKWZvcihjb25zdCBzIGluIGUpe2NvbnN0IHI9ZVtzXTtpZihyLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpdGhyb3cgbmV3IEVycm9yKCJCcnVzaDogSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkLiIpO3IuYXJyYXk9ZzAoci5hcnJheSl9aWYodC5ib3VuZHNUcmVlfHwodzAodCx7dXNlU2hhcmVkQXJyYXlCdWZmZXI6bn0pLHQuYm91bmRzVHJlZT1uZXcgZmEodCx7bWF4TGVhZlRyaXM6MyxpbmRpcmVjdDohMCx1c2VTaGFyZWRBcnJheUJ1ZmZlcjpufSkpLHQuaGFsZkVkZ2VzfHwodC5oYWxmRWRnZXM9bmV3IEUwKHQpKSwhdC5ncm91cEluZGljZXMpe2NvbnN0IHM9ZGEodCkscj1uZXcgVWludDE2QXJyYXkocyksbz10Lmdyb3Vwcztmb3IobGV0IGE9MCxjPW8ubGVuZ3RoO2E8YzthKyspe2NvbnN0e3N0YXJ0OmwsY291bnQ6aH09b1thXTtmb3IobGV0IHU9bC8zLGY9KGwraCkvMzt1PGY7dSsrKXJbdV09YX10Lmdyb3VwSW5kaWNlcz1yfX1kaXNwb3NlQ2FjaGVEYXRhKCl7Y29uc3R7Z2VvbWV0cnk6dH09dGhpczt0LmhhbGZFZGdlcz1udWxsLHQuYm91bmRzVHJlZT1udWxsLHQuZ3JvdXBJbmRpY2VzPW51bGx9fWNvbnN0IEIwPTFlLTE0LHhhPW5ldyBULElsPW5ldyBULGtsPW5ldyBUO2Z1bmN0aW9uIHJuKGksdD1CMCl7eGEuc3ViVmVjdG9ycyhpLmIsaS5hKSxJbC5zdWJWZWN0b3JzKGkuYyxpLmEpLGtsLnN1YlZlY3RvcnMoaS5iLGkuYyk7Y29uc3QgZT14YS5hbmdsZVRvKElsKSxuPXhhLmFuZ2xlVG8oa2wpLHM9TWF0aC5QSS1lLW47cmV0dXJuIE1hdGguYWJzKGUpPHR8fE1hdGguYWJzKG4pPHR8fE1hdGguYWJzKHMpPHR8fGkuYS5kaXN0YW5jZVRvU3F1YXJlZChpLmIpPHR8fGkuYS5kaXN0YW5jZVRvU3F1YXJlZChpLmMpPHR8fGkuYi5kaXN0YW5jZVRvU3F1YXJlZChpLmMpPHR9Y29uc3Qgd2E9MWUtMTAscWk9MWUtMTAsRjA9MWUtMTAsTmU9bmV3IFF0LGZ0PW5ldyBRdCxSZT1uZXcgVCxiYT1uZXcgVCxObD1uZXcgVCx0cj1uZXcgQm8sTWE9bmV3IG5lO2NsYXNzIEkwe2NvbnN0cnVjdG9yKCl7dGhpcy5fcG9vbD1bXSx0aGlzLl9pbmRleD0wfWdldFRyaWFuZ2xlKCl7cmV0dXJuIHRoaXMuX2luZGV4Pj10aGlzLl9wb29sLmxlbmd0aCYmdGhpcy5fcG9vbC5wdXNoKG5ldyB0dCksdGhpcy5fcG9vbFt0aGlzLl9pbmRleCsrXX1jbGVhcigpe3RoaXMuX2luZGV4PTB9cmVzZXQoKXt0aGlzLl9wb29sLmxlbmd0aD0wLHRoaXMuX2luZGV4PTB9fWNsYXNzIGswe2NvbnN0cnVjdG9yKCl7dGhpcy50cmlhbmdsZVBvb2w9bmV3IEkwLHRoaXMudHJpYW5nbGVzPVtdLHRoaXMubm9ybWFsPW5ldyBULHRoaXMuY29wbGFuYXJUcmlhbmdsZVVzZWQ9ITF9aW5pdGlhbGl6ZSh0KXt0aGlzLnJlc2V0KCk7Y29uc3R7dHJpYW5nbGVzOmUsdHJpYW5nbGVQb29sOm4sbm9ybWFsOnN9PXRoaXM7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IobGV0IHI9MCxvPXQubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9dFtyXTtpZihyPT09MClhLmdldE5vcm1hbChzKTtlbHNlIGlmKE1hdGguYWJzKDEtYS5nZXROb3JtYWwoUmUpLmRvdChzKSk+d2EpdGhyb3cgbmV3IEVycm9yKCJUcmlhbmdsZSBTcGxpdHRlcjogQ2Fubm90IGluaXRpYWxpemUgd2l0aCB0cmlhbmdsZXMgdGhhdCBoYXZlIGRpZmZlcmVudCBub3JtYWxzLiIpO2NvbnN0IGM9bi5nZXRUcmlhbmdsZSgpO2MuY29weShhKSxlLnB1c2goYyl9ZWxzZXt0LmdldE5vcm1hbChzKTtjb25zdCByPW4uZ2V0VHJpYW5nbGUoKTtyLmNvcHkodCksZS5wdXNoKHIpfX1zcGxpdEJ5VHJpYW5nbGUodCl7Y29uc3R7bm9ybWFsOmUsdHJpYW5nbGVzOm59PXRoaXM7aWYodC5nZXROb3JtYWwoYmEpLm5vcm1hbGl6ZSgpLE1hdGguYWJzKDEtTWF0aC5hYnMoYmEuZG90KGUpKSk8RjApe3RoaXMuY29wbGFuYXJUcmlhbmdsZVVzZWQ9ITA7Zm9yKGxldCByPTAsbz1uLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPW5bcl07YS5jb3BsYW5hckNvdW50PTB9Y29uc3Qgcz1bdC5hLHQuYix0LmNdO2ZvcihsZXQgcj0wO3I8MztyKyspe2NvbnN0IG89KHIrMSklMyxhPXNbcl0sYz1zW29dO1JlLnN1YlZlY3RvcnMoYyxhKS5ub3JtYWxpemUoKSxObC5jcm9zc1ZlY3RvcnMoYmEsUmUpLHRyLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KE5sLGEpLHRoaXMuc3BsaXRCeVBsYW5lKHRyLHQpfX1lbHNlIHQuZ2V0UGxhbmUodHIpLHRoaXMuc3BsaXRCeVBsYW5lKHRyLHQpfXNwbGl0QnlQbGFuZSh0LGUpe2NvbnN0e3RyaWFuZ2xlczpuLHRyaWFuZ2xlUG9vbDpzfT10aGlzO01hLmNvcHkoZSksTWEubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCByPTAsbz1uLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPW5bcl07aWYoIU1hLmludGVyc2VjdHNUcmlhbmdsZShhLE5lLCEwKSljb250aW51ZTtjb25zdHthOmMsYjpsLGM6aH09YTtsZXQgdT0wLGY9LTEsZD0hMSxwPVtdLHk9W107Y29uc3QgbT1bYyxsLGhdO2ZvcihsZXQgZz0wO2c8MztnKyspe2NvbnN0IGI9KGcrMSklMztOZS5zdGFydC5jb3B5KG1bZ10pLE5lLmVuZC5jb3B5KG1bYl0pO2NvbnN0IHg9dC5kaXN0YW5jZVRvUG9pbnQoTmUuc3RhcnQpLHc9dC5kaXN0YW5jZVRvUG9pbnQoTmUuZW5kKTtpZihNYXRoLmFicyh4KTxxaSYmTWF0aC5hYnModyk8cWkpe2Q9ITA7YnJlYWt9aWYoeD4wP3AucHVzaChnKTp5LnB1c2goZyksTWF0aC5hYnMoeCk8cWkpY29udGludWU7bGV0IE09ISF0LmludGVyc2VjdExpbmUoTmUsUmUpOyFNJiZNYXRoLmFicyh3KTxxaSYmKFJlLmNvcHkoTmUuZW5kKSxNPSEwKSxNJiYhKFJlLmRpc3RhbmNlVG8oTmUuc3RhcnQpPHdhKSYmKFJlLmRpc3RhbmNlVG8oTmUuZW5kKTx3YSYmKGY9ZyksdT09PTA/ZnQuc3RhcnQuY29weShSZSk6ZnQuZW5kLmNvcHkoUmUpLHUrKyl9aWYoIWQmJnU9PT0yJiZmdC5kaXN0YW5jZSgpPnFpKWlmKGYhPT0tMSl7Zj0oZisxKSUzO2xldCBnPTA7Zz09PWYmJihnPShnKzEpJTMpO2xldCBiPWcrMTtiPT09ZiYmKGI9KGIrMSklMyk7Y29uc3QgeD1zLmdldFRyaWFuZ2xlKCk7eC5hLmNvcHkobVtiXSkseC5iLmNvcHkoZnQuZW5kKSx4LmMuY29weShmdC5zdGFydCkscm4oeCl8fG4ucHVzaCh4KSxhLmEuY29weShtW2ddKSxhLmIuY29weShmdC5zdGFydCksYS5jLmNvcHkoZnQuZW5kKSxybihhKSYmKG4uc3BsaWNlKHIsMSksci0tLG8tLSl9ZWxzZXtjb25zdCBnPXAubGVuZ3RoPj0yP3lbMF06cFswXTtpZihnPT09MCl7bGV0IEE9ZnQuc3RhcnQ7ZnQuc3RhcnQ9ZnQuZW5kLGZ0LmVuZD1BfWNvbnN0IGI9KGcrMSklMyx4PShnKzIpJTMsdz1zLmdldFRyaWFuZ2xlKCksTT1zLmdldFRyaWFuZ2xlKCk7bVtiXS5kaXN0YW5jZVRvU3F1YXJlZChmdC5zdGFydCk8bVt4XS5kaXN0YW5jZVRvU3F1YXJlZChmdC5lbmQpPyh3LmEuY29weShtW2JdKSx3LmIuY29weShmdC5zdGFydCksdy5jLmNvcHkoZnQuZW5kKSxNLmEuY29weShtW2JdKSxNLmIuY29weShtW3hdKSxNLmMuY29weShmdC5zdGFydCkpOih3LmEuY29weShtW3hdKSx3LmIuY29weShmdC5zdGFydCksdy5jLmNvcHkoZnQuZW5kKSxNLmEuY29weShtW2JdKSxNLmIuY29weShtW3hdKSxNLmMuY29weShmdC5lbmQpKSxhLmEuY29weShtW2ddKSxhLmIuY29weShmdC5lbmQpLGEuYy5jb3B5KGZ0LnN0YXJ0KSxybih3KXx8bi5wdXNoKHcpLHJuKE0pfHxuLnB1c2goTSkscm4oYSkmJihuLnNwbGljZShyLDEpLHItLSxvLS0pfWVsc2UgdT09PTMmJmNvbnNvbGUud2FybigiVHJpYW5nbGVDbGlwcGVyOiBDb3BsYW5hciBjbGlwIG5vdCBoYW5kbGVkIil9fXJlc2V0KCl7dGhpcy50cmlhbmdsZXMubGVuZ3RoPTAsdGhpcy50cmlhbmdsZVBvb2wuY2xlYXIoKSx0aGlzLmNvcGxhbmFyVHJpYW5nbGVVc2VkPSExfX1mdW5jdGlvbiBOMChpKXtyZXR1cm4gaT1+fmksaSs0LWklNH1jbGFzcyBSbHtjb25zdHJ1Y3Rvcih0LGU9NTAwKXt0aGlzLmV4cGFuc2lvbkZhY3Rvcj0xLjUsdGhpcy50eXBlPXQsdGhpcy5sZW5ndGg9MCx0aGlzLmFycmF5PW51bGwsdGhpcy5zZXRTaXplKGUpfXNldFR5cGUodCl7aWYodGhpcy5sZW5ndGghPT0wKXRocm93IG5ldyBFcnJvcigiVHlwZUJhY2tlZEFycmF5OiBDYW5ub3QgY2hhbmdlIHRoZSB0eXBlIHdoaWxlIHRoZXJlIGlzIHVzZWQgZGF0YSBpbiB0aGUgYnVmZmVyLiIpO2NvbnN0IGU9dGhpcy5hcnJheS5idWZmZXI7dGhpcy5hcnJheT1uZXcgdChlKSx0aGlzLnR5cGU9dH1zZXRTaXplKHQpe2lmKHRoaXMuYXJyYXkmJnQ9PT10aGlzLmFycmF5Lmxlbmd0aClyZXR1cm47Y29uc3QgZT10aGlzLnR5cGUsbj1QbCgpP1NoYXJlZEFycmF5QnVmZmVyOkFycmF5QnVmZmVyLHM9bmV3IGUobmV3IG4oTjAodCplLkJZVEVTX1BFUl9FTEVNRU5UKSkpO3RoaXMuYXJyYXkmJnMuc2V0KHRoaXMuYXJyYXksMCksdGhpcy5hcnJheT1zfWV4cGFuZCgpe2NvbnN0e2FycmF5OnQsZXhwYW5zaW9uRmFjdG9yOmV9PXRoaXM7dGhpcy5zZXRTaXplKHQubGVuZ3RoKmUpfXB1c2goLi4udCl7bGV0e2FycmF5OmUsbGVuZ3RoOm59PXRoaXM7bit0Lmxlbmd0aD5lLmxlbmd0aCYmKHRoaXMuZXhwYW5kKCksZT10aGlzLmFycmF5KTtmb3IobGV0IHM9MCxyPXQubGVuZ3RoO3M8cjtzKyspZVtuK3NdPXRbc107dGhpcy5sZW5ndGgrPXQubGVuZ3RofWNsZWFyKCl7dGhpcy5sZW5ndGg9MH19Y2xhc3MgUjB7Y29uc3RydWN0b3IoKXt0aGlzLmdyb3VwQXR0cmlidXRlcz1be31dLHRoaXMuZ3JvdXBDb3VudD0wfWdldFR5cGUodCl7cmV0dXJuIHRoaXMuZ3JvdXBBdHRyaWJ1dGVzWzBdW3RdLnR5cGV9Z2V0SXRlbVNpemUodCl7cmV0dXJuIHRoaXMuZ3JvdXBBdHRyaWJ1dGVzWzBdW3RdLml0ZW1TaXplfWdldE5vcm1hbGl6ZWQodCl7cmV0dXJuIHRoaXMuZ3JvdXBBdHRyaWJ1dGVzWzBdW3RdLm5vcm1hbGl6ZWR9Z2V0Q291bnQodCl7aWYodGhpcy5ncm91cENvdW50PD10KXJldHVybiAwO2NvbnN0IGU9dGhpcy5nZXRHcm91cEF0dHJBcnJheSgicG9zaXRpb24iLHQpO3JldHVybiBlLmxlbmd0aC9lLml0ZW1TaXplfWdldFRvdGFsTGVuZ3RoKHQpe2NvbnN0e2dyb3VwQ291bnQ6ZSxncm91cEF0dHJpYnV0ZXM6bn09dGhpcztsZXQgcz0wO2ZvcihsZXQgcj0wO3I8ZTtyKyspe2NvbnN0IG89bltyXTtzKz1vW3RdLmxlbmd0aH1yZXR1cm4gc31nZXRHcm91cEF0dHJTZXQodD0wKXtjb25zdHtncm91cEF0dHJpYnV0ZXM6ZX09dGhpcztpZihlW3RdKXJldHVybiB0aGlzLmdyb3VwQ291bnQ9TWF0aC5tYXgodGhpcy5ncm91cENvdW50LHQrMSksZVt0XTtjb25zdCBuPWVbMF07Zm9yKHRoaXMuZ3JvdXBDb3VudD1NYXRoLm1heCh0aGlzLmdyb3VwQ291bnQsdCsxKTt0Pj1lLmxlbmd0aDspe2NvbnN0IHM9e307ZS5wdXNoKHMpO2Zvcihjb25zdCByIGluIG4pe2NvbnN0IG89bltyXSxhPW5ldyBSbChvLnR5cGUpO2EuaXRlbVNpemU9by5pdGVtU2l6ZSxhLm5vcm1hbGl6ZWQ9by5ub3JtYWxpemVkLHNbcl09YX19cmV0dXJuIGVbdF19Z2V0R3JvdXBBdHRyQXJyYXkodCxlPTApe2NvbnN0e2dyb3VwQXR0cmlidXRlczpufT10aGlzO2lmKCFuWzBdW3RdKXRocm93IG5ldyBFcnJvcihgVHlwZWRBdHRyaWJ1dGVEYXRhOiBBdHRyaWJ1dGUgd2l0aCAiJHt0fSIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkYCk7cmV0dXJuIHRoaXMuZ2V0R3JvdXBBdHRyU2V0KGUpW3RdfWluaXRpYWxpemVBcnJheSh0LGUsbixzKXtjb25zdHtncm91cEF0dHJpYnV0ZXM6cn09dGhpcyxhPXJbMF1bdF07aWYoYSl7aWYoYS50eXBlIT09ZSlmb3IobGV0IGM9MCxsPXIubGVuZ3RoO2M8bDtjKyspe2NvbnN0IGg9cltjXVt0XTtoLnNldFR5cGUoZSksaC5pdGVtU2l6ZT1uLGgubm9ybWFsaXplZD1zfX1lbHNlIGZvcihsZXQgYz0wLGw9ci5sZW5ndGg7YzxsO2MrKyl7Y29uc3QgaD1uZXcgUmwoZSk7aC5pdGVtU2l6ZT1uLGgubm9ybWFsaXplZD1zLHJbY11bdF09aH19Y2xlYXIoKXt0aGlzLmdyb3VwQ291bnQ9MDtjb25zdHtncm91cEF0dHJpYnV0ZXM6dH09dGhpczt0LmZvckVhY2goZT0+e2Zvcihjb25zdCBuIGluIGUpZVtuXS5jbGVhcigpfSl9ZGVsZXRlKHQpe3RoaXMuZ3JvdXBBdHRyaWJ1dGVzLmZvckVhY2goZT0+e2RlbGV0ZSBlW3RdfSl9cmVzZXQoKXt0aGlzLmdyb3VwQXR0cmlidXRlcz1bXSx0aGlzLmdyb3VwQ291bnQ9MH19Y2xhc3MgTGx7Y29uc3RydWN0b3IoKXt0aGlzLmludGVyc2VjdGlvblNldD17fSx0aGlzLmlkcz1bXX1hZGQodCxlKXtjb25zdHtpbnRlcnNlY3Rpb25TZXQ6bixpZHM6c309dGhpcztuW3RdfHwoblt0XT1bXSxzLnB1c2godCkpLG5bdF0ucHVzaChlKX19Y29uc3QgTDA9MCxPMD0xLEQwPTIsT2w9MywkMD00LERsPTUsJGw9NixzZT1uZXcgeG8sVmw9bmV3IHN0LFB0PW5ldyB0dCxMZT1uZXcgVCxVbD1uZXcgWXQscWw9bmV3IFl0LFhsPW5ldyBZdCxBYT1uZXcgWXQsZXI9bmV3IFl0LG5yPW5ldyBZdCxHbD1uZXcgUXQsU2E9bmV3IFQsdmE9MWUtOCxWMD0xZS0xNSxibj0tMSxNbj0xLGlyPS0yLHNyPTIsWGk9MCxBbj0xLF9hPTIsVTA9MWUtMTQ7bGV0IHJyPW51bGw7ZnVuY3Rpb24gWmwoaSl7cnI9aX1mdW5jdGlvbiBXbChpLHQpe2kuZ2V0TWlkcG9pbnQoc2Uub3JpZ2luKSxpLmdldE5vcm1hbChzZS5kaXJlY3Rpb24pO2NvbnN0IGU9dC5yYXljYXN0Rmlyc3Qoc2UsMik7cmV0dXJuISEoZSYmc2UuZGlyZWN0aW9uLmRvdChlLmZhY2Uubm9ybWFsKT4wKT9ibjpNbn1mdW5jdGlvbiBxMChpLHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gTWF0aC5yYW5kb20oKS0uNX1pLmdldE5vcm1hbChTYSksc2UuZGlyZWN0aW9uLmNvcHkoU2EpLGkuZ2V0TWlkcG9pbnQoc2Uub3JpZ2luKTtjb25zdCBuPTM7bGV0IHM9MCxyPTEvMDtmb3IobGV0IG89MDtvPG47bysrKXtzZS5kaXJlY3Rpb24ueCs9ZSgpKnZhLHNlLmRpcmVjdGlvbi55Kz1lKCkqdmEsc2UuZGlyZWN0aW9uLnorPWUoKSp2YSxzZS5kaXJlY3Rpb24ubXVsdGlwbHlTY2FsYXIoLTEpO2NvbnN0IGE9dC5yYXljYXN0Rmlyc3Qoc2UsMik7aWYoISEoYSYmc2UuZGlyZWN0aW9uLmRvdChhLmZhY2Uubm9ybWFsKT4wKSYmcysrLGEhPT1udWxsJiYocj1NYXRoLm1pbihyLGEuZGlzdGFuY2UpKSxyPD1WMClyZXR1cm4gYS5mYWNlLm5vcm1hbC5kb3QoU2EpPjA/c3I6aXI7aWYocy9uPi41fHwoby1zKzEpL24+LjUpYnJlYWt9cmV0dXJuIHMvbj4uNT9ibjpNbn1mdW5jdGlvbiBYMChpLHQpe2NvbnN0IGU9bmV3IExsLG49bmV3IExsO3JldHVybiBWbC5jb3B5KGkubWF0cml4V29ybGQpLmludmVydCgpLm11bHRpcGx5KHQubWF0cml4V29ybGQpLGkuZ2VvbWV0cnkuYm91bmRzVHJlZS5idmhjYXN0KHQuZ2VvbWV0cnkuYm91bmRzVHJlZSxWbCx7aW50ZXJzZWN0c1RyaWFuZ2xlcyhzLHIsbyxhKXtpZighcm4ocykmJiFybihyKSl7bGV0IGM9cy5pbnRlcnNlY3RzVHJpYW5nbGUocixHbCwhMCk7aWYoIWMpe2NvbnN0IGw9cy5wbGFuZSxoPXIucGxhbmUsdT1sLm5vcm1hbCxmPWgubm9ybWFsO3UuZG90KGYpPT09MSYmTWF0aC5hYnMobC5jb25zdGFudC1oLmNvbnN0YW50KTxVMCYmKGM9ITApfWlmKGMpe2xldCBsPWkuZ2VvbWV0cnkuYm91bmRzVHJlZS5yZXNvbHZlVHJpYW5nbGVJbmRleChvKSxoPXQuZ2VvbWV0cnkuYm91bmRzVHJlZS5yZXNvbHZlVHJpYW5nbGVJbmRleChhKTtlLmFkZChsLGgpLG4uYWRkKGgsbCkscnImJihyci5hZGRFZGdlKEdsKSxyci5hZGRJbnRlcnNlY3RpbmdUcmlhbmdsZXMobyxzLGEscikpfX1yZXR1cm4hMX19KSx7YUludGVyc2VjdGlvbnM6ZSxiSW50ZXJzZWN0aW9uczpufX1mdW5jdGlvbiBHMChpLHQsZSxuLHMscixvPSExKXtjb25zdCBhPWUuYXR0cmlidXRlcyxjPWUuaW5kZXgsbD1pKjMsaD1jLmdldFgobCswKSx1PWMuZ2V0WChsKzEpLGY9Yy5nZXRYKGwrMik7Zm9yKGNvbnN0IGQgaW4gcil7Y29uc3QgcD1hW2RdLHk9cltkXTtpZighKGQgaW4gYSkpdGhyb3cgbmV3IEVycm9yKGBDU0cgT3BlcmF0aW9uczogQXR0cmlidXRlICR7ZH0gbm90IGF2YWlsYWJsZSBvbiBnZW9tZXRyeS5gKTtjb25zdCBtPXAuaXRlbVNpemU7ZD09PSJwb3NpdGlvbiI/KFB0LmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLGgpLmFwcGx5TWF0cml4NChuKSxQdC5iLmZyb21CdWZmZXJBdHRyaWJ1dGUocCx1KS5hcHBseU1hdHJpeDQobiksUHQuYy5mcm9tQnVmZmVyQXR0cmlidXRlKHAsZikuYXBwbHlNYXRyaXg0KG4pLHphKFB0LmEsUHQuYixQdC5jLHQsMyx5LG8pKTpkPT09Im5vcm1hbCI/KFB0LmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLGgpLmFwcGx5Tm9ybWFsTWF0cml4KHMpLFB0LmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLHUpLmFwcGx5Tm9ybWFsTWF0cml4KHMpLFB0LmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLGYpLmFwcGx5Tm9ybWFsTWF0cml4KHMpLG8mJihQdC5hLm11bHRpcGx5U2NhbGFyKC0xKSxQdC5iLm11bHRpcGx5U2NhbGFyKC0xKSxQdC5jLm11bHRpcGx5U2NhbGFyKC0xKSksemEoUHQuYSxQdC5iLFB0LmMsdCwzLHksbywhMCkpOihVbC5mcm9tQnVmZmVyQXR0cmlidXRlKHAsaCkscWwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLHUpLFhsLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxmKSx6YShVbCxxbCxYbCx0LG0seSxvKSl9fWZ1bmN0aW9uIFowKGksdCxlLG4scyxyLG8sYT0hMSl7VGEoaSxuLHMscixvLGEpLFRhKGE/ZTp0LG4scyxyLG8sYSksVGEoYT90OmUsbixzLHIsbyxhKX1mdW5jdGlvbiBIbChpLHQsZT0hMSl7c3dpdGNoKGkpe2Nhc2UgTDA6aWYodD09PU1ufHx0PT09c3ImJiFlKXJldHVybiBBbjticmVhaztjYXNlIE8wOmlmKGUpe2lmKHQ9PT1ibilyZXR1cm4gWGl9ZWxzZSBpZih0PT09TW58fHQ9PT1pcilyZXR1cm4gQW47YnJlYWs7Y2FzZSBEMDppZihlKXtpZih0PT09TW58fHQ9PT1pcilyZXR1cm4gQW59ZWxzZSBpZih0PT09Ym4pcmV0dXJuIFhpO2JyZWFrO2Nhc2UgJDA6aWYodD09PWJuKXJldHVybiBYaTtpZih0PT09TW4pcmV0dXJuIEFuO2JyZWFrO2Nhc2UgT2w6aWYodD09PWJufHx0PT09c3ImJiFlKXJldHVybiBBbjticmVhaztjYXNlIERsOmlmKCFlJiYodD09PU1ufHx0PT09aXIpKXJldHVybiBBbjticmVhaztjYXNlICRsOmlmKCFlJiYodD09PWJufHx0PT09c3IpKXJldHVybiBBbjticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIENTRyBvcGVyYXRpb24gZW51bSAiJHtpfSIuYCl9cmV0dXJuIF9hfWZ1bmN0aW9uIHphKGksdCxlLG4scyxyLG89ITEsYT0hMSl7Y29uc3QgYz1sPT57ci5wdXNoKGwueCkscz4xJiZyLnB1c2gobC55KSxzPjImJnIucHVzaChsLnopLHM+MyYmci5wdXNoKGwudyl9O0FhLnNldCgwLDAsMCwwKS5hZGRTY2FsZWRWZWN0b3IoaSxuLmEueCkuYWRkU2NhbGVkVmVjdG9yKHQsbi5hLnkpLmFkZFNjYWxlZFZlY3RvcihlLG4uYS56KSxlci5zZXQoMCwwLDAsMCkuYWRkU2NhbGVkVmVjdG9yKGksbi5iLngpLmFkZFNjYWxlZFZlY3Rvcih0LG4uYi55KS5hZGRTY2FsZWRWZWN0b3IoZSxuLmIueiksbnIuc2V0KDAsMCwwLDApLmFkZFNjYWxlZFZlY3RvcihpLG4uYy54KS5hZGRTY2FsZWRWZWN0b3IodCxuLmMueSkuYWRkU2NhbGVkVmVjdG9yKGUsbi5jLnopLGEmJihBYS5ub3JtYWxpemUoKSxlci5ub3JtYWxpemUoKSxuci5ub3JtYWxpemUoKSksYyhBYSksbz8oYyhuciksYyhlcikpOihjKGVyKSxjKG5yKSl9ZnVuY3Rpb24gVGEoaSx0LGUsbixzLHI9ITEpe2Zvcihjb25zdCBvIGluIHMpe2NvbnN0IGE9dFtvXSxjPXNbb107aWYoIShvIGluIHQpKXRocm93IG5ldyBFcnJvcihgQ1NHIE9wZXJhdGlvbnM6IEF0dHJpYnV0ZSAke299IG5vIGF2YWlsYWJsZSBvbiBnZW9tZXRyeS5gKTtjb25zdCBsPWEuaXRlbVNpemU7bz09PSJwb3NpdGlvbiI/KExlLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxpKS5hcHBseU1hdHJpeDQoZSksYy5wdXNoKExlLngsTGUueSxMZS56KSk6bz09PSJub3JtYWwiPyhMZS5mcm9tQnVmZmVyQXR0cmlidXRlKGEsaSkuYXBwbHlOb3JtYWxNYXRyaXgobiksciYmTGUubXVsdGlwbHlTY2FsYXIoLTEpLGMucHVzaChMZS54LExlLnksTGUueikpOihjLnB1c2goYS5nZXRYKGkpKSxsPjEmJmMucHVzaChhLmdldFkoaSkpLGw+MiYmYy5wdXNoKGEuZ2V0WihpKSksbD4zJiZjLnB1c2goYS5nZXRXKGkpKSl9fWNsYXNzIFcwe2NvbnN0cnVjdG9yKHQpe3RoaXMudHJpYW5nbGU9bmV3IHR0KCkuY29weSh0KSx0aGlzLmludGVyc2VjdHM9e319YWRkVHJpYW5nbGUodCxlKXt0aGlzLmludGVyc2VjdHNbdF09bmV3IHR0KCkuY29weShlKX1nZXRJbnRlcnNlY3RBcnJheSgpe2NvbnN0IHQ9W10se2ludGVyc2VjdHM6ZX09dGhpcztmb3IoY29uc3QgbiBpbiBlKXQucHVzaChlW25dKTtyZXR1cm4gdH19Y2xhc3MgSmx7Y29uc3RydWN0b3IoKXt0aGlzLmRhdGE9e319YWRkVHJpYW5nbGVJbnRlcnNlY3Rpb24odCxlLG4scyl7Y29uc3R7ZGF0YTpyfT10aGlzO3JbdF18fChyW3RdPW5ldyBXMChlKSksclt0XS5hZGRUcmlhbmdsZShuLHMpfWdldFRyaWFuZ2xlc0FzQXJyYXkodD1udWxsKXtjb25zdHtkYXRhOmV9PXRoaXMsbj1bXTtpZih0IT09bnVsbCl0IGluIGUmJm4ucHVzaChlW3RdLnRyaWFuZ2xlKTtlbHNlIGZvcihjb25zdCBzIGluIGUpbi5wdXNoKGVbc10udHJpYW5nbGUpO3JldHVybiBufWdldFRyaWFuZ2xlSW5kaWNlcygpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLmRhdGEpLm1hcCh0PT5wYXJzZUludCh0KSl9Z2V0SW50ZXJzZWN0aW9uSW5kaWNlcyh0KXtjb25zdHtkYXRhOmV9PXRoaXM7cmV0dXJuIGVbdF0/T2JqZWN0LmtleXMoZVt0XS5pbnRlcnNlY3RzKS5tYXAobj0+cGFyc2VJbnQobikpOltdfWdldEludGVyc2VjdGlvbnNBc0FycmF5KHQ9bnVsbCxlPW51bGwpe2NvbnN0e2RhdGE6bn09dGhpcyxzPW5ldyBTZXQscj1bXSxvPWE9PntpZihuW2FdKWlmKGUhPT1udWxsKW5bYV0uaW50ZXJzZWN0c1tlXSYmci5wdXNoKG5bYV0uaW50ZXJzZWN0c1tlXSk7ZWxzZXtjb25zdCBjPW5bYV0uaW50ZXJzZWN0cztmb3IoY29uc3QgbCBpbiBjKXMuaGFzKGwpfHwocy5hZGQobCksci5wdXNoKGNbbF0pKX19O2lmKHQhPT1udWxsKW8odCk7ZWxzZSBmb3IoY29uc3QgYSBpbiBuKW8oYSk7cmV0dXJuIHJ9cmVzZXQoKXt0aGlzLmRhdGE9e319fWNsYXNzIEgwe2NvbnN0cnVjdG9yKCl7dGhpcy5lbmFibGVkPSExLHRoaXMudHJpYW5nbGVJbnRlcnNlY3RzQT1uZXcgSmwsdGhpcy50cmlhbmdsZUludGVyc2VjdHNCPW5ldyBKbCx0aGlzLmludGVyc2VjdGlvbkVkZ2VzPVtdfWFkZEludGVyc2VjdGluZ1RyaWFuZ2xlcyh0LGUsbixzKXtjb25zdHt0cmlhbmdsZUludGVyc2VjdHNBOnIsdHJpYW5nbGVJbnRlcnNlY3RzQjpvfT10aGlzO3IuYWRkVHJpYW5nbGVJbnRlcnNlY3Rpb24odCxlLG4scyksby5hZGRUcmlhbmdsZUludGVyc2VjdGlvbihuLHMsdCxlKX1hZGRFZGdlKHQpe3RoaXMuaW50ZXJzZWN0aW9uRWRnZXMucHVzaCh0LmNsb25lKCkpfXJlc2V0KCl7dGhpcy50cmlhbmdsZUludGVyc2VjdHNBLnJlc2V0KCksdGhpcy50cmlhbmdsZUludGVyc2VjdHNCLnJlc2V0KCksdGhpcy5pbnRlcnNlY3Rpb25FZGdlcz1bXX1pbml0KCl7dGhpcy5lbmFibGVkJiYodGhpcy5yZXNldCgpLFpsKHRoaXMpKX1jb21wbGV0ZSgpe3RoaXMuZW5hYmxlZCYmWmwobnVsbCl9fWNvbnN0IG9uPW5ldyBzdCxvcj1uZXcgZ2UsU249bmV3IHR0LGFyPW5ldyB0dCxhbj1uZXcgdHQsY3I9bmV3IHR0LGRlPVtdLHZuPVtdO2Z1bmN0aW9uIEowKGkpe2Zvcihjb25zdCB0IG9mIGkpcmV0dXJuIHR9ZnVuY3Rpb24gWTAoaSx0LGUsbixzLHI9e30pe2NvbnN0e3VzZUdyb3VwczpvPSEwfT1yLHthSW50ZXJzZWN0aW9uczphLGJJbnRlcnNlY3Rpb25zOmN9PVgwKGksdCksbD1bXTtsZXQgaD1udWxsLHU7cmV0dXJuIHU9bz8wOi0xLFlsKGksdCxhLGUsITEsbixzLHUpLGpsKGksdCxhLGUsITEscyx1KSxlLmZpbmRJbmRleChkPT5kIT09JGwmJmQhPT1EbCkhPT0tMSYmKHU9bz9pLmdlb21ldHJ5Lmdyb3Vwcy5sZW5ndGh8fDE6LTEsWWwodCxpLGMsZSwhMCxuLHMsdSksamwodCxpLGMsZSwhMCxzLHUpKSxkZS5sZW5ndGg9MCx2bi5sZW5ndGg9MCx7Z3JvdXBzOmwsbWF0ZXJpYWxzOmh9fWZ1bmN0aW9uIFlsKGksdCxlLG4scyxyLG8sYT0wKXtjb25zdCBjPWkubWF0cml4V29ybGQuZGV0ZXJtaW5hbnQoKTwwO29uLmNvcHkodC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkubXVsdGlwbHkoaS5tYXRyaXhXb3JsZCksb3IuZ2V0Tm9ybWFsTWF0cml4KGkubWF0cml4V29ybGQpLm11bHRpcGx5U2NhbGFyKGM/LTE6MSk7Y29uc3QgbD1pLmdlb21ldHJ5Lmdyb3VwSW5kaWNlcyxoPWkuZ2VvbWV0cnkuaW5kZXgsdT1pLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sZj10Lmdlb21ldHJ5LmJvdW5kc1RyZWUsZD10Lmdlb21ldHJ5LmluZGV4LHA9dC5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLHk9ZS5pZHMsbT1lLmludGVyc2VjdGlvblNldDtmb3IobGV0IGc9MCxiPXkubGVuZ3RoO2c8YjtnKyspe2NvbnN0IHg9eVtnXSx3PWE9PT0tMT8wOmxbeF0rYSxNPTMqeCxBPWguZ2V0WChNKzApLFM9aC5nZXRYKE0rMSksXz1oLmdldFgoTSsyKTtTbi5hLmZyb21CdWZmZXJBdHRyaWJ1dGUodSxBKS5hcHBseU1hdHJpeDQob24pLFNuLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh1LFMpLmFwcGx5TWF0cml4NChvbiksU24uYy5mcm9tQnVmZmVyQXR0cmlidXRlKHUsXykuYXBwbHlNYXRyaXg0KG9uKSxyLnJlc2V0KCksci5pbml0aWFsaXplKFNuKTtjb25zdCB2PW1beF07Zm9yKGxldCB6PTAsRT12Lmxlbmd0aDt6PEU7eisrKXtjb25zdCBDPTMqdlt6XSxGPWQuZ2V0WChDKzApLEI9ZC5nZXRYKEMrMSksST1kLmdldFgoQysyKTthci5hLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxGKSxhci5iLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxCKSxhci5jLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxJKSxyLnNwbGl0QnlUcmlhbmdsZShhcil9Y29uc3QgUD1yLnRyaWFuZ2xlcztmb3IobGV0IHo9MCxFPVAubGVuZ3RoO3o8RTt6Kyspe2NvbnN0IEM9UFt6XSxGPXIuY29wbGFuYXJUcmlhbmdsZVVzZWQ/cTAoQyxmKTpXbChDLGYpO2RlLmxlbmd0aD0wLHZuLmxlbmd0aD0wO2ZvcihsZXQgQj0wLEk9bi5sZW5ndGg7QjxJO0IrKyl7Y29uc3QgUj1IbChuW0JdLEYscyk7UiE9PV9hJiYodm4ucHVzaChSKSxkZS5wdXNoKG9bQl0uZ2V0R3JvdXBBdHRyU2V0KHcpKSl9aWYoZGUubGVuZ3RoIT09MCl7U24uZ2V0QmFyeWNvb3JkKEMuYSxjci5hKSxTbi5nZXRCYXJ5Y29vcmQoQy5iLGNyLmIpLFNuLmdldEJhcnljb29yZChDLmMsY3IuYyk7Zm9yKGxldCBCPTAsST1kZS5sZW5ndGg7QjxJO0IrKyl7Y29uc3QgUj1kZVtCXSxWPXZuW0JdPT09WGk7RzAoeCxjcixpLmdlb21ldHJ5LGkubWF0cml4V29ybGQsb3IsUixjIT09Vil9fX19cmV0dXJuIHkubGVuZ3RofWZ1bmN0aW9uIGpsKGksdCxlLG4scyxyLG89MCl7Y29uc3QgYT1pLm1hdHJpeFdvcmxkLmRldGVybWluYW50KCk8MDtvbi5jb3B5KHQubWF0cml4V29ybGQpLmludmVydCgpLm11bHRpcGx5KGkubWF0cml4V29ybGQpLG9yLmdldE5vcm1hbE1hdHJpeChpLm1hdHJpeFdvcmxkKS5tdWx0aXBseVNjYWxhcihhPy0xOjEpO2NvbnN0IGM9dC5nZW9tZXRyeS5ib3VuZHNUcmVlLGw9aS5nZW9tZXRyeS5ncm91cEluZGljZXMsaD1pLmdlb21ldHJ5LmluZGV4LHU9aS5nZW9tZXRyeS5hdHRyaWJ1dGVzLGY9dS5wb3NpdGlvbixkPVtdLHA9aS5nZW9tZXRyeS5oYWxmRWRnZXMseT1uZXcgU2V0LG09ZGEoaS5nZW9tZXRyeSk7Zm9yKGxldCBnPTAsYj1tO2c8YjtnKyspZyBpbiBlLmludGVyc2VjdGlvblNldHx8eS5hZGQoZyk7Zm9yKDt5LnNpemU+MDspe2NvbnN0IGc9SjAoeSk7eS5kZWxldGUoZyksZC5wdXNoKGcpO2NvbnN0IGI9MypnLHg9aC5nZXRYKGIrMCksdz1oLmdldFgoYisxKSxNPWguZ2V0WChiKzIpO2FuLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLHgpLmFwcGx5TWF0cml4NChvbiksYW4uYi5mcm9tQnVmZmVyQXR0cmlidXRlKGYsdykuYXBwbHlNYXRyaXg0KG9uKSxhbi5jLmZyb21CdWZmZXJBdHRyaWJ1dGUoZixNKS5hcHBseU1hdHJpeDQob24pO2NvbnN0IEE9V2woYW4sYyk7dm4ubGVuZ3RoPTAsZGUubGVuZ3RoPTA7Zm9yKGxldCBTPTAsXz1uLmxlbmd0aDtTPF87UysrKXtjb25zdCB2PUhsKG5bU10sQSxzKTt2IT09X2EmJih2bi5wdXNoKHYpLGRlLnB1c2gocltTXSkpfWZvcig7ZC5sZW5ndGg+MDspe2NvbnN0IFM9ZC5wb3AoKTtmb3IobGV0IF89MDtfPDM7XysrKXtjb25zdCB2PXAuZ2V0U2libGluZ1RyaWFuZ2xlSW5kZXgoUyxfKTt2IT09LTEmJnkuaGFzKHYpJiYoZC5wdXNoKHYpLHkuZGVsZXRlKHYpKX1pZihkZS5sZW5ndGghPT0wKXtjb25zdCBfPTMqUyx2PWguZ2V0WChfKzApLFA9aC5nZXRYKF8rMSksej1oLmdldFgoXysyKSxFPW89PT0tMT8wOmxbU10rbztpZihhbi5hLmZyb21CdWZmZXJBdHRyaWJ1dGUoZix2KSxhbi5iLmZyb21CdWZmZXJBdHRyaWJ1dGUoZixQKSxhbi5jLmZyb21CdWZmZXJBdHRyaWJ1dGUoZix6KSwhcm4oYW4pKWZvcihsZXQgQz0wLEY9ZGUubGVuZ3RoO0M8RjtDKyspe2NvbnN0IEI9dm5bQ10sST1kZVtDXS5nZXRHcm91cEF0dHJTZXQoRSksUj1CPT09WGk7WjAodixQLHosdSxpLm1hdHJpeFdvcmxkLG9yLEksUiE9PWEpfX19fX1mdW5jdGlvbiBqMChpKXtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoLTE7dCsrKXtjb25zdCBlPWlbdF0sbj1pW3QrMV07aWYoZS5tYXRlcmlhbEluZGV4PT09bi5tYXRlcmlhbEluZGV4KXtjb25zdCBzPWUuc3RhcnQscj1uLnN0YXJ0K24uY291bnQ7bi5zdGFydD1zLG4uY291bnQ9ci1zLGkuc3BsaWNlKHQsMSksdC0tfX19ZnVuY3Rpb24gUTAoaSx0LGUsbil7ZS5jbGVhcigpO2NvbnN0IHM9aS5hdHRyaWJ1dGVzO2ZvcihsZXQgcj0wLG89bi5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT1uW3JdLGM9c1thXTtlLmluaXRpYWxpemVBcnJheShhLGMuYXJyYXkuY29uc3RydWN0b3IsYy5pdGVtU2l6ZSxjLm5vcm1hbGl6ZWQpfWZvcihjb25zdCByIGluIGUuYXR0cmlidXRlcyluLmluY2x1ZGVzKHIpfHxlLmRlbGV0ZShyKTtmb3IoY29uc3QgciBpbiB0LmF0dHJpYnV0ZXMpbi5pbmNsdWRlcyhyKXx8KHQuZGVsZXRlQXR0cmlidXRlKHIpLHQuZGlzcG9zZSgpKX1mdW5jdGlvbiBLMChpLHQsZSl7bGV0IG49ITEscz0tMTtjb25zdCByPWkuYXR0cmlidXRlcyxvPXQuZ3JvdXBBdHRyaWJ1dGVzWzBdO2Zvcihjb25zdCBjIGluIG8pe2NvbnN0IGw9dC5nZXRUb3RhbExlbmd0aChjKSxoPXQuZ2V0VHlwZShjKSx1PXQuZ2V0SXRlbVNpemUoYyksZj10LmdldE5vcm1hbGl6ZWQoYyk7bGV0IGQ9cltjXTsoIWR8fGQuYXJyYXkubGVuZ3RoPGwpJiYoZD1uZXcgZ3QobmV3IGgobCksdSxmKSxpLnNldEF0dHJpYnV0ZShjLGQpLG49ITApO2xldCBwPTA7Zm9yKGxldCB5PTAsbT1NYXRoLm1pbihlLmxlbmd0aCx0Lmdyb3VwQ291bnQpO3k8bTt5Kyspe2NvbnN0IGc9ZVt5XS5pbmRleCx7YXJyYXk6Yix0eXBlOngsbGVuZ3RoOnd9PXQuZ3JvdXBBdHRyaWJ1dGVzW2ddW2NdLE09bmV3IHgoYi5idWZmZXIsMCx3KTtkLmFycmF5LnNldChNLHApLHArPU0ubGVuZ3RofWQubmVlZHNVcGRhdGU9ITAscz1sL2QuaXRlbVNpemV9aWYoaS5pbmRleCl7Y29uc3QgYz1pLmluZGV4LmFycmF5O2lmKGMubGVuZ3RoPHMpaS5pbmRleD1udWxsLG49ITA7ZWxzZSBmb3IobGV0IGw9MCxoPWMubGVuZ3RoO2w8aDtsKyspY1tsXT1sfWxldCBhPTA7aS5jbGVhckdyb3VwcygpO2ZvcihsZXQgYz0wLGw9TWF0aC5taW4oZS5sZW5ndGgsdC5ncm91cENvdW50KTtjPGw7YysrKXtjb25zdHtpbmRleDpoLG1hdGVyaWFsSW5kZXg6dX09ZVtjXSxmPXQuZ2V0Q291bnQoaCk7ZiE9PTAmJihpLmFkZEdyb3VwKGEsZix1KSxhKz1mKX1pLnNldERyYXdSYW5nZSgwLHMpLGkuYm91bmRzVHJlZT1udWxsLG4mJmkuZGlzcG9zZSgpfWZ1bmN0aW9uIFFsKGksdCl7bGV0IGU9dDtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KXx8KGU9W10saS5mb3JFYWNoKG49PntlW24ubWF0ZXJpYWxJbmRleF09dH0pKSxlfWNsYXNzIHRwe2NvbnN0cnVjdG9yKCl7dGhpcy50cmlhbmdsZVNwbGl0dGVyPW5ldyBrMCx0aGlzLmF0dHJpYnV0ZURhdGE9W10sdGhpcy5hdHRyaWJ1dGVzPVsicG9zaXRpb24iLCJ1diIsIm5vcm1hbCJdLHRoaXMudXNlR3JvdXBzPSEwLHRoaXMuY29uc29saWRhdGVHcm91cHM9ITAsdGhpcy5kZWJ1Zz1uZXcgSDB9Z2V0R3JvdXBSYW5nZXModCl7cmV0dXJuIXRoaXMudXNlR3JvdXBzfHx0Lmdyb3Vwcy5sZW5ndGg9PT0wP1t7c3RhcnQ6MCxjb3VudDoxLzAsbWF0ZXJpYWxJbmRleDowfV06dC5ncm91cHMubWFwKGU9Pkl0KHt9LGUpKX1ldmFsdWF0ZSh0LGUsbixzPW5ldyBLcyl7bGV0IHI9ITA7aWYoQXJyYXkuaXNBcnJheShuKXx8KG49W25dKSxBcnJheS5pc0FycmF5KHMpfHwocz1bc10scj0hMSkscy5sZW5ndGghPT1uLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkV2YWx1YXRvcjogb3BlcmF0aW9ucyBhbmQgdGFyZ2V0IGFycmF5IHBhc3NlZCBhcyBkaWZmZXJlbnQgc2l6ZXMuIik7dC5wcmVwYXJlR2VvbWV0cnkoKSxlLnByZXBhcmVHZW9tZXRyeSgpO2NvbnN0e3RyaWFuZ2xlU3BsaXR0ZXI6byxhdHRyaWJ1dGVEYXRhOmEsYXR0cmlidXRlczpjLHVzZUdyb3VwczpsLGNvbnNvbGlkYXRlR3JvdXBzOmgsZGVidWc6dX09dGhpcztmb3IoO2EubGVuZ3RoPHMubGVuZ3RoOylhLnB1c2gobmV3IFIwKTtzLmZvckVhY2goKGcsYik9PntRMCh0Lmdlb21ldHJ5LGcuZ2VvbWV0cnksYVtiXSxjKX0pLHUuaW5pdCgpLFkwKHQsZSxuLG8sYSx7dXNlR3JvdXBzOmx9KSx1LmNvbXBsZXRlKCk7Y29uc3QgZj10aGlzLmdldEdyb3VwUmFuZ2VzKHQuZ2VvbWV0cnkpLGQ9UWwoZix0Lm1hdGVyaWFsKSxwPXRoaXMuZ2V0R3JvdXBSYW5nZXMoZS5nZW9tZXRyeSkseT1RbChwLGUubWF0ZXJpYWwpO3AuZm9yRWFjaChnPT5nLm1hdGVyaWFsSW5kZXgrPWQubGVuZ3RoKTtsZXQgbT1bLi4uZiwuLi5wXS5tYXAoKGcsYik9PkhlKEl0KHt9LGcpLHtpbmRleDpifSkpO2lmKGwpe2NvbnN0IGc9Wy4uLmQsLi4ueV07aCYmKG09bS5tYXAoeD0+e2NvbnN0IHc9Z1t4Lm1hdGVyaWFsSW5kZXhdO3JldHVybiB4Lm1hdGVyaWFsSW5kZXg9Zy5pbmRleE9mKHcpLHh9KS5zb3J0KCh4LHcpPT54Lm1hdGVyaWFsSW5kZXgtdy5tYXRlcmlhbEluZGV4KSk7Y29uc3QgYj1bXTtmb3IobGV0IHg9MCx3PWcubGVuZ3RoO3g8dzt4Kyspe2xldCBNPSExO2ZvcihsZXQgQT0wLFM9bS5sZW5ndGg7QTxTO0ErKyl7Y29uc3QgXz1tW0FdO18ubWF0ZXJpYWxJbmRleD09PXgmJihNPSEwLF8ubWF0ZXJpYWxJbmRleD1iLmxlbmd0aCl9TSYmYi5wdXNoKGdbeF0pfXMuZm9yRWFjaCh4PT57eC5tYXRlcmlhbD1ifSl9ZWxzZSBtPVt7c3RhcnQ6MCxjb3VudDoxLzAsaW5kZXg6MCxtYXRlcmlhbEluZGV4OjB9XSxzLmZvckVhY2goZz0+e2cubWF0ZXJpYWw9ZFswXX0pO3JldHVybiBzLmZvckVhY2goKGcsYik9Pntjb25zdCB4PWcuZ2VvbWV0cnk7SzAoeCxhW2JdLG0pLGgmJmowKHguZ3JvdXBzKX0pLHI/czpzWzBdfWV2YWx1YXRlSGllcmFyY2h5KHQsZT1uZXcgS3Mpe3QudXBkYXRlTWF0cml4V29ybGQoITApO2NvbnN0IG49KHIsbyk9Pntjb25zdCBhPXIuY2hpbGRyZW47Zm9yKGxldCBjPTAsbD1hLmxlbmd0aDtjPGw7YysrKXtjb25zdCBoPWFbY107aC5pc09wZXJhdGlvbkdyb3VwP24oaCxvKTpvKGgpfX0scz1yPT57Y29uc3Qgbz1yLmNoaWxkcmVuO2xldCBhPSExO2ZvcihsZXQgbD0wLGg9by5sZW5ndGg7bDxoO2wrKyl7Y29uc3QgdT1vW2xdO2E9cyh1KXx8YX1jb25zdCBjPXIuaXNEaXJ0eSgpO2lmKGMmJnIubWFya1VwZGF0ZWQoKSxhJiYhci5pc09wZXJhdGlvbkdyb3VwKXtsZXQgbDtyZXR1cm4gbihyLGg9PntsP2w9dGhpcy5ldmFsdWF0ZShsLGgsaC5vcGVyYXRpb24pOmw9dGhpcy5ldmFsdWF0ZShyLGgsaC5vcGVyYXRpb24pfSksci5fY2FjaGVkR2VvbWV0cnk9bC5nZW9tZXRyeSxyLl9jYWNoZWRNYXRlcmlhbHM9bC5tYXRlcmlhbCwhMH1lbHNlIHJldHVybiBhfHxjfTtyZXR1cm4gcyh0KSxlLmdlb21ldHJ5PXQuX2NhY2hlZEdlb21ldHJ5LGUubWF0ZXJpYWw9dC5fY2FjaGVkTWF0ZXJpYWxzLGV9cmVzZXQoKXt0aGlzLnRyaWFuZ2xlU3BsaXR0ZXIucmVzZXQoKX19ZnVuY3Rpb24gS2woaSl7bGV0IHQsZSxuLHM9LTEscj0wO2ZvcihsZXQgbD0wO2w8aS5sZW5ndGg7KytsKXtjb25zdCBoPWlbbF07aWYodD09PXZvaWQgMCYmKHQ9aC5hcnJheS5jb25zdHJ1Y3RvciksdCE9PWguYXJyYXkuY29uc3RydWN0b3IpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUF0dHJpYnV0ZXMoKSBmYWlsZWQuIEJ1ZmZlckF0dHJpYnV0ZS5hcnJheSBtdXN0IGJlIG9mIGNvbnNpc3RlbnQgYXJyYXkgdHlwZXMgYWNyb3NzIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIiksbnVsbDtpZihlPT09dm9pZCAwJiYoZT1oLml0ZW1TaXplKSxlIT09aC5pdGVtU2l6ZSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlQXR0cmlidXRlcygpIGZhaWxlZC4gQnVmZmVyQXR0cmlidXRlLml0ZW1TaXplIG11c3QgYmUgY29uc2lzdGVudCBhY3Jvc3MgbWF0Y2hpbmcgYXR0cmlidXRlcy4iKSxudWxsO2lmKG49PT12b2lkIDAmJihuPWgubm9ybWFsaXplZCksbiE9PWgubm9ybWFsaXplZClyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlQXR0cmlidXRlcygpIGZhaWxlZC4gQnVmZmVyQXR0cmlidXRlLm5vcm1hbGl6ZWQgbXVzdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBtYXRjaGluZyBhdHRyaWJ1dGVzLiIpLG51bGw7aWYocz09PS0xJiYocz1oLmdwdVR5cGUpLHMhPT1oLmdwdVR5cGUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUF0dHJpYnV0ZXMoKSBmYWlsZWQuIEJ1ZmZlckF0dHJpYnV0ZS5ncHVUeXBlIG11c3QgYmUgY29uc2lzdGVudCBhY3Jvc3MgbWF0Y2hpbmcgYXR0cmlidXRlcy4iKSxudWxsO3IrPWguY291bnQqZX1jb25zdCBvPW5ldyB0KHIpLGE9bmV3IGd0KG8sZSxuKTtsZXQgYz0wO2ZvcihsZXQgbD0wO2w8aS5sZW5ndGg7KytsKXtjb25zdCBoPWlbbF07aWYoaC5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXtjb25zdCB1PWMvZTtmb3IobGV0IGY9MCxkPWguY291bnQ7ZjxkO2YrKylmb3IobGV0IHA9MDtwPGU7cCsrKXtjb25zdCB5PWguZ2V0Q29tcG9uZW50KGYscCk7YS5zZXRDb21wb25lbnQoZit1LHAseSl9fWVsc2Ugby5zZXQoaC5hcnJheSxjKTtjKz1oLmNvdW50KmV9cmV0dXJuIHMhPT12b2lkIDAmJihhLmdwdVR5cGU9cyksYX1mdW5jdGlvbiBlcChpKXtpZihpLmdyb3Vwcy5sZW5ndGg9PT0wKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHMubWVyZ2VHcm91cHMoKTogTm8gZ3JvdXBzIGFyZSBkZWZpbmVkLiBOb3RoaW5nIHRvIG1lcmdlLiIpLGk7bGV0IHQ9aS5ncm91cHM7aWYodD10LnNvcnQoKG8sYSk9Pm8ubWF0ZXJpYWxJbmRleCE9PWEubWF0ZXJpYWxJbmRleD9vLm1hdGVyaWFsSW5kZXgtYS5tYXRlcmlhbEluZGV4Om8uc3RhcnQtYS5zdGFydCksaS5nZXRJbmRleCgpPT09bnVsbCl7Y29uc3Qgbz1pLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKSxhPVtdO2ZvcihsZXQgYz0wO2M8by5jb3VudDtjKz0zKWEucHVzaChjLGMrMSxjKzIpO2kuc2V0SW5kZXgoYSl9Y29uc3QgZT1pLmdldEluZGV4KCksbj1bXTtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Y29uc3QgYT10W29dLGM9YS5zdGFydCxsPWMrYS5jb3VudDtmb3IobGV0IGg9YztoPGw7aCsrKW4ucHVzaChlLmdldFgoaCkpfWkuZGlzcG9zZSgpLGkuc2V0SW5kZXgobik7bGV0IHM9MDtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Y29uc3QgYT10W29dO2Euc3RhcnQ9cyxzKz1hLmNvdW50fWxldCByPXRbMF07aS5ncm91cHM9W3JdO2ZvcihsZXQgbz0xO288dC5sZW5ndGg7bysrKXtjb25zdCBhPXRbb107ci5tYXRlcmlhbEluZGV4PT09YS5tYXRlcmlhbEluZGV4P3IuY291bnQrPWEuY291bnQ6KHI9YSxpLmdyb3Vwcy5wdXNoKHIpKX1yZXR1cm4gaX1mdW5jdGlvbiB0aChpLHQ9MCl7Y29uc3QgZT1pWzBdLmluZGV4IT09bnVsbCxuPW5ldyBTZXQoT2JqZWN0LmtleXMoaVswXS5hdHRyaWJ1dGVzKSkscz1uZXcgU2V0KE9iamVjdC5rZXlzKGlbMF0ubW9ycGhBdHRyaWJ1dGVzKSkscj17fSxvPXt9LGE9aVswXS5tb3JwaFRhcmdldHNSZWxhdGl2ZSxjPW5ldyB4ZTtsZXQgbD0wO2ZvcihsZXQgaD0wO2g8aS5sZW5ndGg7KytoKXtjb25zdCB1PWlbaF07bGV0IGY9MDtpZihlIT09KHUuaW5kZXghPT1udWxsKSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsiLiBBbGwgZ2VvbWV0cmllcyBtdXN0IGhhdmUgY29tcGF0aWJsZSBhdHRyaWJ1dGVzOyBtYWtlIHN1cmUgaW5kZXggYXR0cmlidXRlIGV4aXN0cyBhbW9uZyBhbGwgZ2VvbWV0cmllcywgb3IgaW4gbm9uZSBvZiB0aGVtLiIpLG51bGw7Zm9yKGNvbnN0IGQgaW4gdS5hdHRyaWJ1dGVzKXtpZighbi5oYXMoZCkpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK2grJy4gQWxsIGdlb21ldHJpZXMgbXVzdCBoYXZlIGNvbXBhdGlibGUgYXR0cmlidXRlczsgbWFrZSBzdXJlICInK2QrJyIgYXR0cmlidXRlIGV4aXN0cyBhbW9uZyBhbGwgZ2VvbWV0cmllcywgb3IgaW4gbm9uZSBvZiB0aGVtLicpLG51bGw7cltkXT09PXZvaWQgMCYmKHJbZF09W10pLHJbZF0ucHVzaCh1LmF0dHJpYnV0ZXNbZF0pLGYrK31pZihmIT09bi5zaXplKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIitoKyIuIE1ha2Ugc3VyZSBhbGwgZ2VvbWV0cmllcyBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBhdHRyaWJ1dGVzLiIpLG51bGw7aWYoYSE9PXUubW9ycGhUYXJnZXRzUmVsYXRpdmUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK2grIi4gLm1vcnBoVGFyZ2V0c1JlbGF0aXZlIG11c3QgYmUgY29uc2lzdGVudCB0aHJvdWdob3V0IGFsbCBnZW9tZXRyaWVzLiIpLG51bGw7Zm9yKGNvbnN0IGQgaW4gdS5tb3JwaEF0dHJpYnV0ZXMpe2lmKCFzLmhhcyhkKSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsiLiAgLm1vcnBoQXR0cmlidXRlcyBtdXN0IGJlIGNvbnNpc3RlbnQgdGhyb3VnaG91dCBhbGwgZ2VvbWV0cmllcy4iKSxudWxsO29bZF09PT12b2lkIDAmJihvW2RdPVtdKSxvW2RdLnB1c2godS5tb3JwaEF0dHJpYnV0ZXNbZF0pfWlmKHQpe2xldCBkO2lmKGUpZD11LmluZGV4LmNvdW50O2Vsc2UgaWYodS5hdHRyaWJ1dGVzLnBvc2l0aW9uIT09dm9pZCAwKWQ9dS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50O2Vsc2UgcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK2grIi4gVGhlIGdlb21ldHJ5IG11c3QgaGF2ZSBlaXRoZXIgYW4gaW5kZXggb3IgYSBwb3NpdGlvbiBhdHRyaWJ1dGUiKSxudWxsO2lmKHQ9PT0xKWMuYWRkR3JvdXAobCxkLGgpO2Vsc2UgaWYodD09PTImJnUuZ3JvdXBzLmxlbmd0aD4wKWZvcihsZXQgcCBvZiB1Lmdyb3Vwcyl7bGV0IHk9cC5tYXRlcmlhbEluZGV4O2MuYWRkR3JvdXAobCtwLnN0YXJ0LE1hdGgubWluKHAuY291bnQsZCkseSl9bCs9ZH19aWYoZSl7bGV0IGg9MDtjb25zdCB1PVtdO2ZvcihsZXQgZj0wO2Y8aS5sZW5ndGg7KytmKXtjb25zdCBkPWlbZl0uaW5kZXg7Zm9yKGxldCBwPTA7cDxkLmNvdW50OysrcCl1LnB1c2goZC5nZXRYKHApK2gpO2grPWlbZl0uYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudH1jLnNldEluZGV4KHUpfWZvcihjb25zdCBoIGluIHIpe2NvbnN0IHU9S2wocltoXSk7aWYoIXUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2hpbGUgdHJ5aW5nIHRvIG1lcmdlIHRoZSAiK2grIiBhdHRyaWJ1dGUuIiksbnVsbDtjLnNldEF0dHJpYnV0ZShoLHUpfWZvcihjb25zdCBoIGluIG8pe2NvbnN0IHU9b1toXVswXS5sZW5ndGg7aWYodT09PTApYnJlYWs7Yy5tb3JwaEF0dHJpYnV0ZXM9Yy5tb3JwaEF0dHJpYnV0ZXN8fHt9LGMubW9ycGhBdHRyaWJ1dGVzW2hdPVtdO2ZvcihsZXQgZj0wO2Y8dTsrK2Ype2NvbnN0IGQ9W107Zm9yKGxldCB5PTA7eTxvW2hdLmxlbmd0aDsrK3kpZC5wdXNoKG9baF1beV1bZl0pO2NvbnN0IHA9S2woZCk7aWYoIXApcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2hpbGUgdHJ5aW5nIHRvIG1lcmdlIHRoZSAiK2grIiBtb3JwaEF0dHJpYnV0ZS4iKSxudWxsO2MubW9ycGhBdHRyaWJ1dGVzW2hdLnB1c2gocCl9fXJldHVybiB0PT09Mj9lcChjKTpjfWNsYXNzIG5wIGV4dGVuZHMgWW57Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpO2NvbnN0IG49bmV3IEtzKG5ldyBZbih0LEhlKEl0KHt9LGUpLHtoYXNUb3A6ITAsaGFzU2lkZTohMCxoYXNCb3R0b206ITF9KSkpO24udXBkYXRlTWF0cml4V29ybGQoKTtjb25zdCBzPW5ldyBtdCgpLnNldEZyb21PYmplY3Qobikscj1uZXcgVDtzLmdldFNpemUocik7Y29uc3Qgbz1uZXcgVChzLm1pbi54K3IueC8yLHMubWluLnkrci55LzIsMCk7bGV0IGE9ZS50b3BTZWdtZW50cyxjPWUuYm94MztpZihjKXtjPWMudW5pb24ocyk7Y29uc3QgZz1uZXcgVDtjLmdldFNpemUoZyk7Y29uc3QgYj1NYXRoLm1heChyLngvZy54LHIueS9nLnkpO2E9TWF0aC5jZWlsKGUudG9wU2VnbWVudHMqYil9aWYoYTw0KXJldHVybiB0aGlzO2NvbnN0IGw9bmV3IFVvKHIueCxyLnksYSxhKSxoPW5ldyBLcyhsKTtoLnBvc2l0aW9uLnNldChvLngsby55LG8ueiksaC51cGRhdGVNYXRyaXhXb3JsZCgpO2NvbnN0IGY9bmV3IHRwKCkuZXZhbHVhdGUoaCxuLE9sKSxkPWYuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLHA9bmV3IEZlKGQuY291bnQqMiwyKTtmb3IobGV0IGc9MDtnPGQuY291bnQ7ZysrKXtjb25zdCBiPWQuZ2V0WihnKTtkLnNldFooZyxlLmRlcHRoK2IpfWlmKGMpe2NvbnN0IGc9Yy5taW4sYj1jLm1heCx4PW5ldyBUKCkuc3ViVmVjdG9ycyhiLGcpO2ZvcihsZXQgdz0wO3c8ZC5jb3VudDt3Kyspe2NvbnN0IE09ZC5nZXRYKHcpLEE9ZC5nZXRZKHcpLFM9KE0tZy54KS94LngsXz0oQS1nLnkpL3gueTtwLnNldFhZKHcsUyxfKX1mLmdlb21ldHJ5LnNldEF0dHJpYnV0ZSgidXYiLHApfWQubmVlZHNVcGRhdGU9ITA7Y29uc3QgeT1uZXcgWW4odCxIZShJdCh7fSxlKSx7aGFzVG9wOiExfSkpLG09dGgoW2YuZ2VvbWV0cnkseV0sMik7dGhpcy5jb3B5KG0udG9Ob25JbmRleGVkKCkpfX12YXIgaXA9aT0+e2NvbnN0e3NwbGl0OnQsZGVwdGg6ZSxwb2ludHM6bixib3gzOnMsaGFzVG9wOnIsaGFzQm90dG9tOm8saGFzU2lkZTphLHNpZGVSZXBlYXQ6Yyx0b3BTZWdtZW50czpsfT1pLGg9bD9ucDpZbix1PW5ldyBoKG5ldyBLYyhuKSx7ZGVwdGg6ZSxiZXZlbEVuYWJsZWQ6ITEsYm94MzpzLFVWR2VuZXJhdG9yOnNkKHtzcGxpdDp0LGJveDM6cyxzaWRlUmVwZWF0OmN9KSxoYXNUb3A6cixoYXNCb3R0b206byxoYXNTaWRlOmEsdG9wU2VnbWVudHM6bH0pO3JldHVybiByZCgpLHV9O2Z1bmN0aW9uIGxyKGksdCl7cmV0dXJuIGk9PW51bGx8fHQ9PW51bGw/TmFOOmk8dD8tMTppPnQ/MTppPj10PzA6TmFOfWZ1bmN0aW9uIHNwKGksdCl7cmV0dXJuIGk9PW51bGx8fHQ9PW51bGw/TmFOOnQ8aT8tMTp0Pmk/MTp0Pj1pPzA6TmFOfWZ1bmN0aW9uIGVoKGkpe2xldCB0LGUsbjtpLmxlbmd0aCE9PTI/KHQ9bHIsZT0oYSxjKT0+bHIoaShhKSxjKSxuPShhLGMpPT5pKGEpLWMpOih0PWk9PT1scnx8aT09PXNwP2k6cnAsZT1pLG49aSk7ZnVuY3Rpb24gcyhhLGMsbD0wLGg9YS5sZW5ndGgpe2lmKGw8aCl7aWYodChjLGMpIT09MClyZXR1cm4gaDtkb3tjb25zdCB1PWwraD4+PjE7ZShhW3VdLGMpPDA/bD11KzE6aD11fXdoaWxlKGw8aCl9cmV0dXJuIGx9ZnVuY3Rpb24gcihhLGMsbD0wLGg9YS5sZW5ndGgpe2lmKGw8aCl7aWYodChjLGMpIT09MClyZXR1cm4gaDtkb3tjb25zdCB1PWwraD4+PjE7ZShhW3VdLGMpPD0wP2w9dSsxOmg9dX13aGlsZShsPGgpfXJldHVybiBsfWZ1bmN0aW9uIG8oYSxjLGw9MCxoPWEubGVuZ3RoKXtjb25zdCB1PXMoYSxjLGwsaC0xKTtyZXR1cm4gdT5sJiZuKGFbdS0xXSxjKT4tbihhW3VdLGMpP3UtMTp1fXJldHVybntsZWZ0OnMsY2VudGVyOm8scmlnaHQ6cn19ZnVuY3Rpb24gcnAoKXtyZXR1cm4gMH1mdW5jdGlvbiBvcChpKXtyZXR1cm4gaT09PW51bGw/TmFOOitpfWNvbnN0IGFwPWVoKGxyKS5yaWdodDtlaChvcCkuY2VudGVyO2Z1bmN0aW9uIGhyKGksdCl7bGV0IGUsbjtpZih0PT09dm9pZCAwKWZvcihjb25zdCBzIG9mIGkpcyE9bnVsbCYmKGU9PT12b2lkIDA/cz49cyYmKGU9bj1zKTooZT5zJiYoZT1zKSxuPHMmJihuPXMpKSk7ZWxzZXtsZXQgcz0tMTtmb3IobGV0IHIgb2YgaSkocj10KHIsKytzLGkpKSE9bnVsbCYmKGU9PT12b2lkIDA/cj49ciYmKGU9bj1yKTooZT5yJiYoZT1yKSxuPHImJihuPXIpKSl9cmV0dXJuW2Usbl19Y2xhc3MgT2V7Y29uc3RydWN0b3IoKXt0aGlzLl9wYXJ0aWFscz1uZXcgRmxvYXQ2NEFycmF5KDMyKSx0aGlzLl9uPTB9YWRkKHQpe2NvbnN0IGU9dGhpcy5fcGFydGlhbHM7bGV0IG49MDtmb3IobGV0IHM9MDtzPHRoaXMuX24mJnM8MzI7cysrKXtjb25zdCByPWVbc10sbz10K3IsYT1NYXRoLmFicyh0KTxNYXRoLmFicyhyKT90LShvLXIpOnItKG8tdCk7YSYmKGVbbisrXT1hKSx0PW99cmV0dXJuIGVbbl09dCx0aGlzLl9uPW4rMSx0aGlzfXZhbHVlT2YoKXtjb25zdCB0PXRoaXMuX3BhcnRpYWxzO2xldCBlPXRoaXMuX24sbixzLHIsbz0wO2lmKGU+MCl7Zm9yKG89dFstLWVdO2U+MCYmKG49byxzPXRbLS1lXSxvPW4rcyxyPXMtKG8tbiksIXIpOyk7ZT4wJiYocjwwJiZ0W2UtMV08MHx8cj4wJiZ0W2UtMV0+MCkmJihzPXIqMixuPW8rcyxzPT1uLW8mJihvPW4pKX1yZXR1cm4gb319Y29uc3QgY3A9TWF0aC5zcXJ0KDUwKSxscD1NYXRoLnNxcnQoMTApLGhwPU1hdGguc3FydCgyKTtmdW5jdGlvbiB1cihpLHQsZSl7Y29uc3Qgbj0odC1pKS9NYXRoLm1heCgwLGUpLHM9TWF0aC5mbG9vcihNYXRoLmxvZzEwKG4pKSxyPW4vTWF0aC5wb3coMTAscyksbz1yPj1jcD8xMDpyPj1scD81OnI+PWhwPzI6MTtsZXQgYSxjLGw7cmV0dXJuIHM8MD8obD1NYXRoLnBvdygxMCwtcykvbyxhPU1hdGgucm91bmQoaSpsKSxjPU1hdGgucm91bmQodCpsKSxhL2w8aSYmKythLGMvbD50JiYtLWMsbD0tbCk6KGw9TWF0aC5wb3coMTAscykqbyxhPU1hdGgucm91bmQoaS9sKSxjPU1hdGgucm91bmQodC9sKSxhKmw8aSYmKythLGMqbD50JiYtLWMpLGM8YSYmLjU8PWUmJmU8Mj91cihpLHQsZSoyKTpbYSxjLGxdfWZ1bmN0aW9uIHVwKGksdCxlKXtpZih0PSt0LGk9K2ksZT0rZSwhKGU+MCkpcmV0dXJuW107aWYoaT09PXQpcmV0dXJuW2ldO2NvbnN0IG49dDxpLFtzLHIsb109bj91cih0LGksZSk6dXIoaSx0LGUpO2lmKCEocj49cykpcmV0dXJuW107Y29uc3QgYT1yLXMrMSxjPW5ldyBBcnJheShhKTtpZihuKWlmKG88MClmb3IobGV0IGw9MDtsPGE7KytsKWNbbF09KHItbCkvLW87ZWxzZSBmb3IobGV0IGw9MDtsPGE7KytsKWNbbF09KHItbCkqbztlbHNlIGlmKG88MClmb3IobGV0IGw9MDtsPGE7KytsKWNbbF09KHMrbCkvLW87ZWxzZSBmb3IobGV0IGw9MDtsPGE7KytsKWNbbF09KHMrbCkqbztyZXR1cm4gY31mdW5jdGlvbiBQYShpLHQsZSl7cmV0dXJuIHQ9K3QsaT0raSxlPStlLHVyKGksdCxlKVsyXX1mdW5jdGlvbiBmcChpLHQsZSl7dD0rdCxpPStpLGU9K2U7Y29uc3Qgbj10PGkscz1uP1BhKHQsaSxlKTpQYShpLHQsZSk7cmV0dXJuKG4/LTE6MSkqKHM8MD8xLy1zOnMpfWZ1bmN0aW9uIGRwKGksdCl7bGV0IGU9MCxuPTA7aWYodD09PXZvaWQgMClmb3IobGV0IHMgb2YgaSlzIT1udWxsJiYocz0rcyk+PXMmJigrK2Usbis9cyk7ZWxzZXtsZXQgcz0tMTtmb3IobGV0IHIgb2YgaSkocj10KHIsKytzLGkpKSE9bnVsbCYmKHI9K3IpPj1yJiYoKytlLG4rPXIpfWlmKGUpcmV0dXJuIG4vZX1mdW5jdGlvbipwcChpKXtmb3IoY29uc3QgdCBvZiBpKXlpZWxkKm5mKHQpfWZ1bmN0aW9uIEdpKGkpe3JldHVybiBBcnJheS5mcm9tKHBwKGkpKX12YXIgUT0xZS02LGZyPTFlLTEyLEg9TWF0aC5QSSxSdD1ILzIsZHI9SC80LEx0PUgqMixodD0xODAvSCxYPUgvMTgwLEs9TWF0aC5hYnMsQ2E9TWF0aC5hdGFuLHJlPU1hdGguYXRhbjIsRz1NYXRoLmNvcyx5cD1NYXRoLmV4cCxFYT1NYXRoLmh5cG90LG1wPU1hdGgubG9nLHE9TWF0aC5zaW4sZ3A9TWF0aC5zaWdufHxmdW5jdGlvbihpKXtyZXR1cm4gaT4wPzE6aTwwPy0xOjB9LERlPU1hdGguc3FydCx4cD1NYXRoLnRhbjtmdW5jdGlvbiB3cChpKXtyZXR1cm4gaT4xPzA6aTwtMT9IOk1hdGguYWNvcyhpKX1mdW5jdGlvbiAkZShpKXtyZXR1cm4gaT4xP1J0Omk8LTE/LVJ0Ok1hdGguYXNpbihpKX1mdW5jdGlvbiBuaChpKXtyZXR1cm4oaT1xKGkvMikpKml9ZnVuY3Rpb24gX3QoKXt9ZnVuY3Rpb24gcHIoaSx0KXtpJiZzaC5oYXNPd25Qcm9wZXJ0eShpLnR5cGUpJiZzaFtpLnR5cGVdKGksdCl9dmFyIGloPXtGZWF0dXJlOmZ1bmN0aW9uKGksdCl7cHIoaS5nZW9tZXRyeSx0KX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5mZWF0dXJlcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KXByKGVbbl0uZ2VvbWV0cnksdCl9fSxzaD17U3BoZXJlOmZ1bmN0aW9uKGksdCl7dC5zcGhlcmUoKX0sUG9pbnQ6ZnVuY3Rpb24oaSx0KXtpPWkuY29vcmRpbmF0ZXMsdC5wb2ludChpWzBdLGlbMV0saVsyXSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5jb29yZGluYXRlcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KWk9ZVtuXSx0LnBvaW50KGlbMF0saVsxXSxpWzJdKX0sTGluZVN0cmluZzpmdW5jdGlvbihpLHQpe0JhKGkuY29vcmRpbmF0ZXMsdCwwKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuY29vcmRpbmF0ZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylCYShlW25dLHQsMCl9LFBvbHlnb246ZnVuY3Rpb24oaSx0KXtyaChpLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5jb29yZGluYXRlcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KXJoKGVbbl0sdCl9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmdlb21ldHJpZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylwcihlW25dLHQpfX07ZnVuY3Rpb24gQmEoaSx0LGUpe3ZhciBuPS0xLHM9aS5sZW5ndGgtZSxyO2Zvcih0LmxpbmVTdGFydCgpOysrbjxzOylyPWlbbl0sdC5wb2ludChyWzBdLHJbMV0sclsyXSk7dC5saW5lRW5kKCl9ZnVuY3Rpb24gcmgoaSx0KXt2YXIgZT0tMSxuPWkubGVuZ3RoO2Zvcih0LnBvbHlnb25TdGFydCgpOysrZTxuOylCYShpW2VdLHQsMSk7dC5wb2x5Z29uRW5kKCl9ZnVuY3Rpb24geXIoaSx0KXtpJiZpaC5oYXNPd25Qcm9wZXJ0eShpLnR5cGUpP2loW2kudHlwZV0oaSx0KTpwcihpLHQpfXZhciBtcj1uZXcgT2Usb2g9bmV3IE9lLGFoLGNoLEZhLElhLGthLFZlPXtwb2ludDpfdCxsaW5lU3RhcnQ6X3QsbGluZUVuZDpfdCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXttcj1uZXcgT2UsVmUubGluZVN0YXJ0PWJwLFZlLmxpbmVFbmQ9TXB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt2YXIgaT0rbXI7b2guYWRkKGk8MD9MdCtpOmkpLHRoaXMubGluZVN0YXJ0PXRoaXMubGluZUVuZD10aGlzLnBvaW50PV90fSxzcGhlcmU6ZnVuY3Rpb24oKXtvaC5hZGQoTHQpfX07ZnVuY3Rpb24gYnAoKXtWZS5wb2ludD1BcH1mdW5jdGlvbiBNcCgpe2xoKGFoLGNoKX1mdW5jdGlvbiBBcChpLHQpe1ZlLnBvaW50PWxoLGFoPWksY2g9dCxpKj1YLHQqPVgsRmE9aSxJYT1HKHQ9dC8yK2RyKSxrYT1xKHQpfWZ1bmN0aW9uIGxoKGksdCl7aSo9WCx0Kj1YLHQ9dC8yK2RyO3ZhciBlPWktRmEsbj1lPj0wPzE6LTEscz1uKmUscj1HKHQpLG89cSh0KSxhPWthKm8sYz1JYSpyK2EqRyhzKSxsPWEqbipxKHMpO21yLmFkZChyZShsLGMpKSxGYT1pLElhPXIsa2E9b31mdW5jdGlvbiBncihpKXtyZXR1cm5bcmUoaVsxXSxpWzBdKSwkZShpWzJdKV19ZnVuY3Rpb24gX24oaSl7dmFyIHQ9aVswXSxlPWlbMV0sbj1HKGUpO3JldHVybltuKkcodCksbipxKHQpLHEoZSldfWZ1bmN0aW9uIHhyKGksdCl7cmV0dXJuIGlbMF0qdFswXStpWzFdKnRbMV0raVsyXSp0WzJdfWZ1bmN0aW9uIG9pKGksdCl7cmV0dXJuW2lbMV0qdFsyXS1pWzJdKnRbMV0saVsyXSp0WzBdLWlbMF0qdFsyXSxpWzBdKnRbMV0taVsxXSp0WzBdXX1mdW5jdGlvbiBOYShpLHQpe2lbMF0rPXRbMF0saVsxXSs9dFsxXSxpWzJdKz10WzJdfWZ1bmN0aW9uIHdyKGksdCl7cmV0dXJuW2lbMF0qdCxpWzFdKnQsaVsyXSp0XX1mdW5jdGlvbiBicihpKXt2YXIgdD1EZShpWzBdKmlbMF0raVsxXSppWzFdK2lbMl0qaVsyXSk7aVswXS89dCxpWzFdLz10LGlbMl0vPXR9dmFyIG90LE90LHV0LHF0LHpuLGhoLHVoLGFpLFppLGNuLFVlLHFlPXtwb2ludDpSYSxsaW5lU3RhcnQ6ZGgsbGluZUVuZDpwaCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtxZS5wb2ludD15aCxxZS5saW5lU3RhcnQ9U3AscWUubGluZUVuZD12cCxaaT1uZXcgT2UsVmUucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtWZS5wb2x5Z29uRW5kKCkscWUucG9pbnQ9UmEscWUubGluZVN0YXJ0PWRoLHFlLmxpbmVFbmQ9cGgsbXI8MD8ob3Q9LSh1dD0xODApLE90PS0ocXQ9OTApKTpaaT5RP3F0PTkwOlppPC1RJiYoT3Q9LTkwKSxVZVswXT1vdCxVZVsxXT11dH0sc3BoZXJlOmZ1bmN0aW9uKCl7b3Q9LSh1dD0xODApLE90PS0ocXQ9OTApfX07ZnVuY3Rpb24gUmEoaSx0KXtjbi5wdXNoKFVlPVtvdD1pLHV0PWldKSx0PE90JiYoT3Q9dCksdD5xdCYmKHF0PXQpfWZ1bmN0aW9uIGZoKGksdCl7dmFyIGU9X24oW2kqWCx0KlhdKTtpZihhaSl7dmFyIG49b2koYWksZSkscz1bblsxXSwtblswXSwwXSxyPW9pKHMsbik7YnIocikscj1ncihyKTt2YXIgbz1pLXpuLGE9bz4wPzE6LTEsYz1yWzBdKmh0KmEsbCxoPUsobyk+MTgwO2heKGEqem48YyYmYzxhKmkpPyhsPXJbMV0qaHQsbD5xdCYmKHF0PWwpKTooYz0oYyszNjApJTM2MC0xODAsaF4oYSp6bjxjJiZjPGEqaSk/KGw9LXJbMV0qaHQsbDxPdCYmKE90PWwpKToodDxPdCYmKE90PXQpLHQ+cXQmJihxdD10KSkpLGg/aTx6bj9YdChvdCxpKT5YdChvdCx1dCkmJih1dD1pKTpYdChpLHV0KT5YdChvdCx1dCkmJihvdD1pKTp1dD49b3Q/KGk8b3QmJihvdD1pKSxpPnV0JiYodXQ9aSkpOmk+em4/WHQob3QsaSk+WHQob3QsdXQpJiYodXQ9aSk6WHQoaSx1dCk+WHQob3QsdXQpJiYob3Q9aSl9ZWxzZSBjbi5wdXNoKFVlPVtvdD1pLHV0PWldKTt0PE90JiYoT3Q9dCksdD5xdCYmKHF0PXQpLGFpPWUsem49aX1mdW5jdGlvbiBkaCgpe3FlLnBvaW50PWZofWZ1bmN0aW9uIHBoKCl7VWVbMF09b3QsVWVbMV09dXQscWUucG9pbnQ9UmEsYWk9bnVsbH1mdW5jdGlvbiB5aChpLHQpe2lmKGFpKXt2YXIgZT1pLXpuO1ppLmFkZChLKGUpPjE4MD9lKyhlPjA/MzYwOi0zNjApOmUpfWVsc2UgaGg9aSx1aD10O1ZlLnBvaW50KGksdCksZmgoaSx0KX1mdW5jdGlvbiBTcCgpe1ZlLmxpbmVTdGFydCgpfWZ1bmN0aW9uIHZwKCl7eWgoaGgsdWgpLFZlLmxpbmVFbmQoKSxLKFppKT5RJiYob3Q9LSh1dD0xODApKSxVZVswXT1vdCxVZVsxXT11dCxhaT1udWxsfWZ1bmN0aW9uIFh0KGksdCl7cmV0dXJuKHQtPWkpPDA/dCszNjA6dH1mdW5jdGlvbiBfcChpLHQpe3JldHVybiBpWzBdLXRbMF19ZnVuY3Rpb24gbWgoaSx0KXtyZXR1cm4gaVswXTw9aVsxXT9pWzBdPD10JiZ0PD1pWzFdOnQ8aVswXXx8aVsxXTx0fWZ1bmN0aW9uIGdoKGkpe3ZhciB0LGUsbixzLHIsbyxhO2lmKHF0PXV0PS0ob3Q9T3Q9MS8wKSxjbj1bXSx5cihpLHFlKSxlPWNuLmxlbmd0aCl7Zm9yKGNuLnNvcnQoX3ApLHQ9MSxuPWNuWzBdLHI9W25dO3Q8ZTsrK3Qpcz1jblt0XSxtaChuLHNbMF0pfHxtaChuLHNbMV0pPyhYdChuWzBdLHNbMV0pPlh0KG5bMF0sblsxXSkmJihuWzFdPXNbMV0pLFh0KHNbMF0sblsxXSk+WHQoblswXSxuWzFdKSYmKG5bMF09c1swXSkpOnIucHVzaChuPXMpO2ZvcihvPS0xLzAsZT1yLmxlbmd0aC0xLHQ9MCxuPXJbZV07dDw9ZTtuPXMsKyt0KXM9clt0XSwoYT1YdChuWzFdLHNbMF0pKT5vJiYobz1hLG90PXNbMF0sdXQ9blsxXSl9cmV0dXJuIGNuPVVlPW51bGwsb3Q9PT0xLzB8fE90PT09MS8wP1tbTmFOLE5hTl0sW05hTixOYU5dXTpbW290LE90XSxbdXQscXRdXX12YXIgV2ksTXIsQXIsU3IsdnIsX3IsenIsVHIsTGEsT2EsRGEseGgsd2gsQ3QsRXQsQnQscGU9e3NwaGVyZTpfdCxwb2ludDokYSxsaW5lU3RhcnQ6YmgsbGluZUVuZDpNaCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtwZS5saW5lU3RhcnQ9UHAscGUubGluZUVuZD1DcH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3BlLmxpbmVTdGFydD1iaCxwZS5saW5lRW5kPU1ofX07ZnVuY3Rpb24gJGEoaSx0KXtpKj1YLHQqPVg7dmFyIGU9Ryh0KTtIaShlKkcoaSksZSpxKGkpLHEodCkpfWZ1bmN0aW9uIEhpKGksdCxlKXsrK1dpLEFyKz0oaS1BcikvV2ksU3IrPSh0LVNyKS9XaSx2cis9KGUtdnIpL1dpfWZ1bmN0aW9uIGJoKCl7cGUucG9pbnQ9enB9ZnVuY3Rpb24genAoaSx0KXtpKj1YLHQqPVg7dmFyIGU9Ryh0KTtDdD1lKkcoaSksRXQ9ZSpxKGkpLEJ0PXEodCkscGUucG9pbnQ9VHAsSGkoQ3QsRXQsQnQpfWZ1bmN0aW9uIFRwKGksdCl7aSo9WCx0Kj1YO3ZhciBlPUcodCksbj1lKkcoaSkscz1lKnEoaSkscj1xKHQpLG89cmUoRGUoKG89RXQqci1CdCpzKSpvKyhvPUJ0Km4tQ3Qqcikqbysobz1DdCpzLUV0Km4pKm8pLEN0Km4rRXQqcytCdCpyKTtNcis9byxfcis9byooQ3QrKEN0PW4pKSx6cis9byooRXQrKEV0PXMpKSxUcis9byooQnQrKEJ0PXIpKSxIaShDdCxFdCxCdCl9ZnVuY3Rpb24gTWgoKXtwZS5wb2ludD0kYX1mdW5jdGlvbiBQcCgpe3BlLnBvaW50PUVwfWZ1bmN0aW9uIENwKCl7QWgoeGgsd2gpLHBlLnBvaW50PSRhfWZ1bmN0aW9uIEVwKGksdCl7eGg9aSx3aD10LGkqPVgsdCo9WCxwZS5wb2ludD1BaDt2YXIgZT1HKHQpO0N0PWUqRyhpKSxFdD1lKnEoaSksQnQ9cSh0KSxIaShDdCxFdCxCdCl9ZnVuY3Rpb24gQWgoaSx0KXtpKj1YLHQqPVg7dmFyIGU9Ryh0KSxuPWUqRyhpKSxzPWUqcShpKSxyPXEodCksbz1FdCpyLUJ0KnMsYT1CdCpuLUN0KnIsYz1DdCpzLUV0Km4sbD1FYShvLGEsYyksaD0kZShsKSx1PWwmJi1oL2w7TGEuYWRkKHUqbyksT2EuYWRkKHUqYSksRGEuYWRkKHUqYyksTXIrPWgsX3IrPWgqKEN0KyhDdD1uKSksenIrPWgqKEV0KyhFdD1zKSksVHIrPWgqKEJ0KyhCdD1yKSksSGkoQ3QsRXQsQnQpfWZ1bmN0aW9uIFNoKGkpe1dpPU1yPUFyPVNyPXZyPV9yPXpyPVRyPTAsTGE9bmV3IE9lLE9hPW5ldyBPZSxEYT1uZXcgT2UseXIoaSxwZSk7dmFyIHQ9K0xhLGU9K09hLG49K0RhLHM9RWEodCxlLG4pO3JldHVybiBzPGZyJiYodD1fcixlPXpyLG49VHIsTXI8USYmKHQ9QXIsZT1TcixuPXZyKSxzPUVhKHQsZSxuKSxzPGZyKT9bTmFOLE5hTl06W3JlKGUsdCkqaHQsJGUobi9zKSpodF19ZnVuY3Rpb24gVmEoaSx0KXtmdW5jdGlvbiBlKG4scyl7cmV0dXJuIG49aShuLHMpLHQoblswXSxuWzFdKX1yZXR1cm4gaS5pbnZlcnQmJnQuaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24obixzKXtyZXR1cm4gbj10LmludmVydChuLHMpLG4mJmkuaW52ZXJ0KG5bMF0sblsxXSl9KSxlfWZ1bmN0aW9uIFVhKGksdCl7cmV0dXJuIEsoaSk+SCYmKGktPU1hdGgucm91bmQoaS9MdCkqTHQpLFtpLHRdfVVhLmludmVydD1VYTtmdW5jdGlvbiB2aChpLHQsZSl7cmV0dXJuKGklPUx0KT90fHxlP1ZhKHpoKGkpLFRoKHQsZSkpOnpoKGkpOnR8fGU/VGgodCxlKTpVYX1mdW5jdGlvbiBfaChpKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdCs9aSxLKHQpPkgmJih0LT1NYXRoLnJvdW5kKHQvTHQpKkx0KSxbdCxlXX19ZnVuY3Rpb24gemgoaSl7dmFyIHQ9X2goaSk7cmV0dXJuIHQuaW52ZXJ0PV9oKC1pKSx0fWZ1bmN0aW9uIFRoKGksdCl7dmFyIGU9RyhpKSxuPXEoaSkscz1HKHQpLHI9cSh0KTtmdW5jdGlvbiBvKGEsYyl7dmFyIGw9RyhjKSxoPUcoYSkqbCx1PXEoYSkqbCxmPXEoYyksZD1mKmUraCpuO3JldHVybltyZSh1KnMtZCpyLGgqZS1mKm4pLCRlKGQqcyt1KnIpXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24oYSxjKXt2YXIgbD1HKGMpLGg9RyhhKSpsLHU9cShhKSpsLGY9cShjKSxkPWYqcy11KnI7cmV0dXJuW3JlKHUqcytmKnIsaCplK2QqbiksJGUoZCplLWgqbildfSxvfWZ1bmN0aW9uIFBoKGkpe2k9dmgoaVswXSpYLGlbMV0qWCxpLmxlbmd0aD4yP2lbMl0qWDowKTtmdW5jdGlvbiB0KGUpe3JldHVybiBlPWkoZVswXSpYLGVbMV0qWCksZVswXSo9aHQsZVsxXSo9aHQsZX1yZXR1cm4gdC5pbnZlcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9aS5pbnZlcnQoZVswXSpYLGVbMV0qWCksZVswXSo9aHQsZVsxXSo9aHQsZX0sdH1mdW5jdGlvbiBCcChpLHQsZSxuLHMscil7aWYoZSl7dmFyIG89Ryh0KSxhPXEodCksYz1uKmU7cz09bnVsbD8ocz10K24qTHQscj10LWMvMik6KHM9Q2gobyxzKSxyPUNoKG8sciksKG4+MD9zPHI6cz5yKSYmKHMrPW4qTHQpKTtmb3IodmFyIGwsaD1zO24+MD9oPnI6aDxyO2gtPWMpbD1ncihbbywtYSpHKGgpLC1hKnEoaCldKSxpLnBvaW50KGxbMF0sbFsxXSl9fWZ1bmN0aW9uIENoKGksdCl7dD1fbih0KSx0WzBdLT1pLGJyKHQpO3ZhciBlPXdwKC10WzFdKTtyZXR1cm4oKC10WzJdPDA/LWU6ZSkrTHQtUSklTHR9ZnVuY3Rpb24gRWgoKXt2YXIgaT1bXSx0O3JldHVybntwb2ludDpmdW5jdGlvbihlLG4scyl7dC5wdXNoKFtlLG4sc10pfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtpLnB1c2godD1bXSl9LGxpbmVFbmQ6X3QscmVqb2luOmZ1bmN0aW9uKCl7aS5sZW5ndGg+MSYmaS5wdXNoKGkucG9wKCkuY29uY2F0KGkuc2hpZnQoKSkpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgZT1pO3JldHVybiBpPVtdLHQ9bnVsbCxlfX19ZnVuY3Rpb24gUHIoaSx0KXtyZXR1cm4gSyhpWzBdLXRbMF0pPFEmJksoaVsxXS10WzFdKTxRfWZ1bmN0aW9uIENyKGksdCxlLG4pe3RoaXMueD1pLHRoaXMuej10LHRoaXMubz1lLHRoaXMuZT1uLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gQmgoaSx0LGUsbixzKXt2YXIgcj1bXSxvPVtdLGEsYztpZihpLmZvckVhY2goZnVuY3Rpb24ocCl7aWYoISgoeT1wLmxlbmd0aC0xKTw9MCkpe3ZhciB5LG09cFswXSxnPXBbeV0sYjtpZihQcihtLGcpKXtpZighbVsyXSYmIWdbMl0pe2ZvcihzLmxpbmVTdGFydCgpLGE9MDthPHk7KythKXMucG9pbnQoKG09cFthXSlbMF0sbVsxXSk7cy5saW5lRW5kKCk7cmV0dXJufWdbMF0rPTIqUX1yLnB1c2goYj1uZXcgQ3IobSxwLG51bGwsITApKSxvLnB1c2goYi5vPW5ldyBDcihtLG51bGwsYiwhMSkpLHIucHVzaChiPW5ldyBDcihnLHAsbnVsbCwhMSkpLG8ucHVzaChiLm89bmV3IENyKGcsbnVsbCxiLCEwKSl9fSksISFyLmxlbmd0aCl7Zm9yKG8uc29ydCh0KSxGaChyKSxGaChvKSxhPTAsYz1vLmxlbmd0aDthPGM7KythKW9bYV0uZT1lPSFlO2Zvcih2YXIgbD1yWzBdLGgsdTs7KXtmb3IodmFyIGY9bCxkPSEwO2YudjspaWYoKGY9Zi5uKT09PWwpcmV0dXJuO2g9Zi56LHMubGluZVN0YXJ0KCk7ZG97aWYoZi52PWYuby52PSEwLGYuZSl7aWYoZClmb3IoYT0wLGM9aC5sZW5ndGg7YTxjOysrYSlzLnBvaW50KCh1PWhbYV0pWzBdLHVbMV0pO2Vsc2UgbihmLngsZi5uLngsMSxzKTtmPWYubn1lbHNle2lmKGQpZm9yKGg9Zi5wLnosYT1oLmxlbmd0aC0xO2E+PTA7LS1hKXMucG9pbnQoKHU9aFthXSlbMF0sdVsxXSk7ZWxzZSBuKGYueCxmLnAueCwtMSxzKTtmPWYucH1mPWYubyxoPWYueixkPSFkfXdoaWxlKCFmLnYpO3MubGluZUVuZCgpfX19ZnVuY3Rpb24gRmgoaSl7aWYodD1pLmxlbmd0aCl7Zm9yKHZhciB0LGU9MCxuPWlbMF0sczsrK2U8dDspbi5uPXM9aVtlXSxzLnA9bixuPXM7bi5uPXM9aVswXSxzLnA9bn19ZnVuY3Rpb24gcWEoaSl7cmV0dXJuIEsoaVswXSk8PUg/aVswXTpncChpWzBdKSooKEsoaVswXSkrSCklTHQtSCl9ZnVuY3Rpb24gSWgoaSx0KXt2YXIgZT1xYSh0KSxuPXRbMV0scz1xKG4pLHI9W3EoZSksLUcoZSksMF0sbz0wLGE9MCxjPW5ldyBPZTtzPT09MT9uPVJ0K1E6cz09PS0xJiYobj0tUnQtUSk7Zm9yKHZhciBsPTAsaD1pLmxlbmd0aDtsPGg7KytsKWlmKGY9KHU9aVtsXSkubGVuZ3RoKWZvcih2YXIgdSxmLGQ9dVtmLTFdLHA9cWEoZCkseT1kWzFdLzIrZHIsbT1xKHkpLGc9Ryh5KSxiPTA7YjxmOysrYixwPXcsbT1BLGc9UyxkPXgpe3ZhciB4PXVbYl0sdz1xYSh4KSxNPXhbMV0vMitkcixBPXEoTSksUz1HKE0pLF89dy1wLHY9Xz49MD8xOi0xLFA9dipfLHo9UD5ILEU9bSpBO2lmKGMuYWRkKHJlKEUqdipxKFApLGcqUytFKkcoUCkpKSxvKz16P18rdipMdDpfLHpecD49ZV53Pj1lKXt2YXIgQz1vaShfbihkKSxfbih4KSk7YnIoQyk7dmFyIEY9b2kocixDKTticihGKTt2YXIgQj0oel5fPj0wPy0xOjEpKiRlKEZbMl0pOyhuPkJ8fG49PT1CJiYoQ1swXXx8Q1sxXSkpJiYoYSs9el5fPj0wPzE6LTEpfX1yZXR1cm4obzwtUXx8bzxRJiZjPC1mcileYSYxfWZ1bmN0aW9uIGtoKGksdCxlLG4pe3JldHVybiBmdW5jdGlvbihzKXt2YXIgcj10KHMpLG89RWgoKSxhPXQobyksYz0hMSxsLGgsdSxmPXtwb2ludDpkLGxpbmVTdGFydDp5LGxpbmVFbmQ6bSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtmLnBvaW50PWcsZi5saW5lU3RhcnQ9YixmLmxpbmVFbmQ9eCxoPVtdLGw9W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtmLnBvaW50PWQsZi5saW5lU3RhcnQ9eSxmLmxpbmVFbmQ9bSxoPUdpKGgpO3ZhciB3PUloKGwsbik7aC5sZW5ndGg/KGN8fChzLnBvbHlnb25TdGFydCgpLGM9ITApLEJoKGgsSXAsdyxlLHMpKTp3JiYoY3x8KHMucG9seWdvblN0YXJ0KCksYz0hMCkscy5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLHMpLHMubGluZUVuZCgpKSxjJiYocy5wb2x5Z29uRW5kKCksYz0hMSksaD1sPW51bGx9LHNwaGVyZTpmdW5jdGlvbigpe3MucG9seWdvblN0YXJ0KCkscy5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLHMpLHMubGluZUVuZCgpLHMucG9seWdvbkVuZCgpfX07ZnVuY3Rpb24gZCh3LE0pe2kodyxNKSYmcy5wb2ludCh3LE0pfWZ1bmN0aW9uIHAodyxNKXtyLnBvaW50KHcsTSl9ZnVuY3Rpb24geSgpe2YucG9pbnQ9cCxyLmxpbmVTdGFydCgpfWZ1bmN0aW9uIG0oKXtmLnBvaW50PWQsci5saW5lRW5kKCl9ZnVuY3Rpb24gZyh3LE0pe3UucHVzaChbdyxNXSksYS5wb2ludCh3LE0pfWZ1bmN0aW9uIGIoKXthLmxpbmVTdGFydCgpLHU9W119ZnVuY3Rpb24geCgpe2codVswXVswXSx1WzBdWzFdKSxhLmxpbmVFbmQoKTt2YXIgdz1hLmNsZWFuKCksTT1vLnJlc3VsdCgpLEEsUz1NLmxlbmd0aCxfLHYsUDtpZih1LnBvcCgpLGwucHVzaCh1KSx1PW51bGwsISFTKXtpZih3JjEpe2lmKHY9TVswXSwoXz12Lmxlbmd0aC0xKT4wKXtmb3IoY3x8KHMucG9seWdvblN0YXJ0KCksYz0hMCkscy5saW5lU3RhcnQoKSxBPTA7QTxfOysrQSlzLnBvaW50KChQPXZbQV0pWzBdLFBbMV0pO3MubGluZUVuZCgpfXJldHVybn1TPjEmJncmMiYmTS5wdXNoKE0ucG9wKCkuY29uY2F0KE0uc2hpZnQoKSkpLGgucHVzaChNLmZpbHRlcihGcCkpfX1yZXR1cm4gZn19ZnVuY3Rpb24gRnAoaSl7cmV0dXJuIGkubGVuZ3RoPjF9ZnVuY3Rpb24gSXAoaSx0KXtyZXR1cm4oKGk9aS54KVswXTwwP2lbMV0tUnQtUTpSdC1pWzFdKS0oKHQ9dC54KVswXTwwP3RbMV0tUnQtUTpSdC10WzFdKX12YXIgTmg9a2goZnVuY3Rpb24oKXtyZXR1cm4hMH0sa3AsUnAsWy1ILC1SdF0pO2Z1bmN0aW9uIGtwKGkpe3ZhciB0PU5hTixlPU5hTixuPU5hTixzO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtpLmxpbmVTdGFydCgpLHM9MX0scG9pbnQ6ZnVuY3Rpb24ocixvKXt2YXIgYT1yPjA/SDotSCxjPUsoci10KTtLKGMtSCk8UT8oaS5wb2ludCh0LGU9KGUrbykvMj4wP1J0Oi1SdCksaS5wb2ludChuLGUpLGkubGluZUVuZCgpLGkubGluZVN0YXJ0KCksaS5wb2ludChhLGUpLGkucG9pbnQocixlKSxzPTApOm4hPT1hJiZjPj1IJiYoSyh0LW4pPFEmJih0LT1uKlEpLEsoci1hKTxRJiYoci09YSpRKSxlPU5wKHQsZSxyLG8pLGkucG9pbnQobixlKSxpLmxpbmVFbmQoKSxpLmxpbmVTdGFydCgpLGkucG9pbnQoYSxlKSxzPTApLGkucG9pbnQodD1yLGU9byksbj1hfSxsaW5lRW5kOmZ1bmN0aW9uKCl7aS5saW5lRW5kKCksdD1lPU5hTn0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gMi1zfX19ZnVuY3Rpb24gTnAoaSx0LGUsbil7dmFyIHMscixvPXEoaS1lKTtyZXR1cm4gSyhvKT5RP0NhKChxKHQpKihyPUcobikpKnEoZSktcShuKSoocz1HKHQpKSpxKGkpKS8ocypyKm8pKToodCtuKS8yfWZ1bmN0aW9uIFJwKGksdCxlLG4pe3ZhciBzO2lmKGk9PW51bGwpcz1lKlJ0LG4ucG9pbnQoLUgscyksbi5wb2ludCgwLHMpLG4ucG9pbnQoSCxzKSxuLnBvaW50KEgsMCksbi5wb2ludChILC1zKSxuLnBvaW50KDAsLXMpLG4ucG9pbnQoLUgsLXMpLG4ucG9pbnQoLUgsMCksbi5wb2ludCgtSCxzKTtlbHNlIGlmKEsoaVswXS10WzBdKT5RKXt2YXIgcj1pWzBdPHRbMF0/SDotSDtzPWUqci8yLG4ucG9pbnQoLXIscyksbi5wb2ludCgwLHMpLG4ucG9pbnQocixzKX1lbHNlIG4ucG9pbnQodFswXSx0WzFdKX1mdW5jdGlvbiBMcChpKXt2YXIgdD1HKGkpLGU9MipYLG49dD4wLHM9Syh0KT5RO2Z1bmN0aW9uIHIoaCx1LGYsZCl7QnAoZCxpLGUsZixoLHUpfWZ1bmN0aW9uIG8oaCx1KXtyZXR1cm4gRyhoKSpHKHUpPnR9ZnVuY3Rpb24gYShoKXt2YXIgdSxmLGQscCx5O3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtwPWQ9ITEseT0xfSxwb2ludDpmdW5jdGlvbihtLGcpe3ZhciBiPVttLGddLHgsdz1vKG0sZyksTT1uP3c/MDpsKG0sZyk6dz9sKG0rKG08MD9IOi1IKSxnKTowO2lmKCF1JiYocD1kPXcpJiZoLmxpbmVTdGFydCgpLHchPT1kJiYoeD1jKHUsYiksKCF4fHxQcih1LHgpfHxQcihiLHgpKSYmKGJbMl09MSkpLHchPT1kKXk9MCx3PyhoLmxpbmVTdGFydCgpLHg9YyhiLHUpLGgucG9pbnQoeFswXSx4WzFdKSk6KHg9Yyh1LGIpLGgucG9pbnQoeFswXSx4WzFdLDIpLGgubGluZUVuZCgpKSx1PXg7ZWxzZSBpZihzJiZ1JiZuXncpe3ZhciBBOyEoTSZmKSYmKEE9YyhiLHUsITApKSYmKHk9MCxuPyhoLmxpbmVTdGFydCgpLGgucG9pbnQoQVswXVswXSxBWzBdWzFdKSxoLnBvaW50KEFbMV1bMF0sQVsxXVsxXSksaC5saW5lRW5kKCkpOihoLnBvaW50KEFbMV1bMF0sQVsxXVsxXSksaC5saW5lRW5kKCksaC5saW5lU3RhcnQoKSxoLnBvaW50KEFbMF1bMF0sQVswXVsxXSwzKSkpfXcmJighdXx8IVByKHUsYikpJiZoLnBvaW50KGJbMF0sYlsxXSksdT1iLGQ9dyxmPU19LGxpbmVFbmQ6ZnVuY3Rpb24oKXtkJiZoLmxpbmVFbmQoKSx1PW51bGx9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIHl8KHAmJmQpPDwxfX19ZnVuY3Rpb24gYyhoLHUsZil7dmFyIGQ9X24oaCkscD1fbih1KSx5PVsxLDAsMF0sbT1vaShkLHApLGc9eHIobSxtKSxiPW1bMF0seD1nLWIqYjtpZigheClyZXR1cm4hZiYmaDt2YXIgdz10KmcveCxNPS10KmIveCxBPW9pKHksbSksUz13cih5LHcpLF89d3IobSxNKTtOYShTLF8pO3ZhciB2PUEsUD14cihTLHYpLHo9eHIodix2KSxFPVAqUC16Kih4cihTLFMpLTEpO2lmKCEoRTwwKSl7dmFyIEM9RGUoRSksRj13cih2LCgtUC1DKS96KTtpZihOYShGLFMpLEY9Z3IoRiksIWYpcmV0dXJuIEY7dmFyIEI9aFswXSxJPXVbMF0sUj1oWzFdLCQ9dVsxXSxWO0k8QiYmKFY9QixCPUksST1WKTt2YXIgbnQ9SS1CLHh0PUsobnQtSCk8USxvZT14dHx8bnQ8UTtpZigheHQmJiQ8UiYmKFY9UixSPSQsJD1WKSxvZT94dD9SKyQ+MF5GWzFdPChLKEZbMF0tQik8UT9SOiQpOlI8PUZbMV0mJkZbMV08PSQ6bnQ+SF4oQjw9RlswXSYmRlswXTw9SSkpe3ZhciBadD13cih2LCgtUCtDKS96KTtyZXR1cm4gTmEoWnQsUyksW0YsZ3IoWnQpXX19fWZ1bmN0aW9uIGwoaCx1KXt2YXIgZj1uP2k6SC1pLGQ9MDtyZXR1cm4gaDwtZj9kfD0xOmg+ZiYmKGR8PTIpLHU8LWY/ZHw9NDp1PmYmJihkfD04KSxkfXJldHVybiBraChvLGEscixuP1swLC1pXTpbLUgsaS1IXSl9ZnVuY3Rpb24gT3AoaSx0LGUsbixzLHIpe3ZhciBvPWlbMF0sYT1pWzFdLGM9dFswXSxsPXRbMV0saD0wLHU9MSxmPWMtbyxkPWwtYSxwO2lmKHA9ZS1vLCEoIWYmJnA+MCkpe2lmKHAvPWYsZjwwKXtpZihwPGgpcmV0dXJuO3A8dSYmKHU9cCl9ZWxzZSBpZihmPjApe2lmKHA+dSlyZXR1cm47cD5oJiYoaD1wKX1pZihwPXMtbywhKCFmJiZwPDApKXtpZihwLz1mLGY8MCl7aWYocD51KXJldHVybjtwPmgmJihoPXApfWVsc2UgaWYoZj4wKXtpZihwPGgpcmV0dXJuO3A8dSYmKHU9cCl9aWYocD1uLWEsISghZCYmcD4wKSl7aWYocC89ZCxkPDApe2lmKHA8aClyZXR1cm47cDx1JiYodT1wKX1lbHNlIGlmKGQ+MCl7aWYocD51KXJldHVybjtwPmgmJihoPXApfWlmKHA9ci1hLCEoIWQmJnA8MCkpe2lmKHAvPWQsZDwwKXtpZihwPnUpcmV0dXJuO3A+aCYmKGg9cCl9ZWxzZSBpZihkPjApe2lmKHA8aClyZXR1cm47cDx1JiYodT1wKX1yZXR1cm4gaD4wJiYoaVswXT1vK2gqZixpWzFdPWEraCpkKSx1PDEmJih0WzBdPW8rdSpmLHRbMV09YSt1KmQpLCEwfX19fX12YXIgSmk9MWU5LEVyPS1KaTtmdW5jdGlvbiBEcChpLHQsZSxuKXtmdW5jdGlvbiBzKGwsaCl7cmV0dXJuIGk8PWwmJmw8PWUmJnQ8PWgmJmg8PW59ZnVuY3Rpb24gcihsLGgsdSxmKXt2YXIgZD0wLHA9MDtpZihsPT1udWxsfHwoZD1vKGwsdSkpIT09KHA9byhoLHUpKXx8YyhsLGgpPDBedT4wKWRvIGYucG9pbnQoZD09PTB8fGQ9PT0zP2k6ZSxkPjE/bjp0KTt3aGlsZSgoZD0oZCt1KzQpJTQpIT09cCk7ZWxzZSBmLnBvaW50KGhbMF0saFsxXSl9ZnVuY3Rpb24gbyhsLGgpe3JldHVybiBLKGxbMF0taSk8UT9oPjA/MDozOksobFswXS1lKTxRP2g+MD8yOjE6SyhsWzFdLXQpPFE/aD4wPzE6MDpoPjA/MzoyfWZ1bmN0aW9uIGEobCxoKXtyZXR1cm4gYyhsLngsaC54KX1mdW5jdGlvbiBjKGwsaCl7dmFyIHU9byhsLDEpLGY9byhoLDEpO3JldHVybiB1IT09Zj91LWY6dT09PTA/aFsxXS1sWzFdOnU9PT0xP2xbMF0taFswXTp1PT09Mj9sWzFdLWhbMV06aFswXS1sWzBdfXJldHVybiBmdW5jdGlvbihsKXt2YXIgaD1sLHU9RWgoKSxmLGQscCx5LG0sZyxiLHgsdyxNLEEsUz17cG9pbnQ6XyxsaW5lU3RhcnQ6RSxsaW5lRW5kOkMscG9seWdvblN0YXJ0OlAscG9seWdvbkVuZDp6fTtmdW5jdGlvbiBfKEIsSSl7cyhCLEkpJiZoLnBvaW50KEIsSSl9ZnVuY3Rpb24gdigpe2Zvcih2YXIgQj0wLEk9MCxSPWQubGVuZ3RoO0k8UjsrK0kpZm9yKHZhciAkPWRbSV0sVj0xLG50PSQubGVuZ3RoLHh0PSRbMF0sb2UsWnQsV3Q9eHRbMF0sbWU9eHRbMV07VjxudDsrK1Ypb2U9V3QsWnQ9bWUseHQ9JFtWXSxXdD14dFswXSxtZT14dFsxXSxadDw9bj9tZT5uJiYoV3Qtb2UpKihuLVp0KT4obWUtWnQpKihpLW9lKSYmKytCOm1lPD1uJiYoV3Qtb2UpKihuLVp0KTwobWUtWnQpKihpLW9lKSYmLS1CO3JldHVybiBCfWZ1bmN0aW9uIFAoKXtoPXUsZj1bXSxkPVtdLEE9ITB9ZnVuY3Rpb24geigpe3ZhciBCPXYoKSxJPUEmJkIsUj0oZj1HaShmKSkubGVuZ3RoOyhJfHxSKSYmKGwucG9seWdvblN0YXJ0KCksSSYmKGwubGluZVN0YXJ0KCkscihudWxsLG51bGwsMSxsKSxsLmxpbmVFbmQoKSksUiYmQmgoZixhLEIscixsKSxsLnBvbHlnb25FbmQoKSksaD1sLGY9ZD1wPW51bGx9ZnVuY3Rpb24gRSgpe1MucG9pbnQ9RixkJiZkLnB1c2gocD1bXSksTT0hMCx3PSExLGI9eD1OYU59ZnVuY3Rpb24gQygpe2YmJihGKHksbSksZyYmdyYmdS5yZWpvaW4oKSxmLnB1c2godS5yZXN1bHQoKSkpLFMucG9pbnQ9Xyx3JiZoLmxpbmVFbmQoKX1mdW5jdGlvbiBGKEIsSSl7dmFyIFI9cyhCLEkpO2lmKGQmJnAucHVzaChbQixJXSksTSl5PUIsbT1JLGc9UixNPSExLFImJihoLmxpbmVTdGFydCgpLGgucG9pbnQoQixJKSk7ZWxzZSBpZihSJiZ3KWgucG9pbnQoQixJKTtlbHNle3ZhciAkPVtiPU1hdGgubWF4KEVyLE1hdGgubWluKEppLGIpKSx4PU1hdGgubWF4KEVyLE1hdGgubWluKEppLHgpKV0sVj1bQj1NYXRoLm1heChFcixNYXRoLm1pbihKaSxCKSksST1NYXRoLm1heChFcixNYXRoLm1pbihKaSxJKSldO09wKCQsVixpLHQsZSxuKT8od3x8KGgubGluZVN0YXJ0KCksaC5wb2ludCgkWzBdLCRbMV0pKSxoLnBvaW50KFZbMF0sVlsxXSksUnx8aC5saW5lRW5kKCksQT0hMSk6UiYmKGgubGluZVN0YXJ0KCksaC5wb2ludChCLEkpLEE9ITEpfWI9Qix4PUksdz1SfXJldHVybiBTfX12YXIgWGEsR2EsQnIsRnIsY2k9e3NwaGVyZTpfdCxwb2ludDpfdCxsaW5lU3RhcnQ6JHAsbGluZUVuZDpfdCxwb2x5Z29uU3RhcnQ6X3QscG9seWdvbkVuZDpfdH07ZnVuY3Rpb24gJHAoKXtjaS5wb2ludD1VcCxjaS5saW5lRW5kPVZwfWZ1bmN0aW9uIFZwKCl7Y2kucG9pbnQ9Y2kubGluZUVuZD1fdH1mdW5jdGlvbiBVcChpLHQpe2kqPVgsdCo9WCxHYT1pLEJyPXEodCksRnI9Ryh0KSxjaS5wb2ludD1xcH1mdW5jdGlvbiBxcChpLHQpe2kqPVgsdCo9WDt2YXIgZT1xKHQpLG49Ryh0KSxzPUsoaS1HYSkscj1HKHMpLG89cShzKSxhPW4qbyxjPUZyKmUtQnIqbipyLGw9QnIqZStGcipuKnI7WGEuYWRkKHJlKERlKGEqYStjKmMpLGwpKSxHYT1pLEJyPWUsRnI9bn1mdW5jdGlvbiBYcChpKXtyZXR1cm4gWGE9bmV3IE9lLHlyKGksY2kpLCtYYX12YXIgWmE9W251bGwsbnVsbF0sR3A9e3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOlphfTtmdW5jdGlvbiBsaShpLHQpe3JldHVybiBaYVswXT1pLFphWzFdPXQsWHAoR3ApfXZhciBSaD17RmVhdHVyZTpmdW5jdGlvbihpLHQpe3JldHVybiBJcihpLmdlb21ldHJ5LHQpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmZlYXR1cmVzLG49LTEscz1lLmxlbmd0aDsrK248czspaWYoSXIoZVtuXS5nZW9tZXRyeSx0KSlyZXR1cm4hMDtyZXR1cm4hMX19LExoPXtTcGhlcmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sUG9pbnQ6ZnVuY3Rpb24oaSx0KXtyZXR1cm4gT2goaS5jb29yZGluYXRlcyx0KX0sTXVsdGlQb2ludDpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscz1lLmxlbmd0aDsrK248czspaWYoT2goZVtuXSx0KSlyZXR1cm4hMDtyZXR1cm4hMX0sTGluZVN0cmluZzpmdW5jdGlvbihpLHQpe3JldHVybiBEaChpLmNvb3JkaW5hdGVzLHQpfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5jb29yZGluYXRlcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KWlmKERoKGVbbl0sdCkpcmV0dXJuITA7cmV0dXJuITF9LFBvbHlnb246ZnVuY3Rpb24oaSx0KXtyZXR1cm4gJGgoaS5jb29yZGluYXRlcyx0KX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuY29vcmRpbmF0ZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylpZigkaChlW25dLHQpKXJldHVybiEwO3JldHVybiExfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5nZW9tZXRyaWVzLG49LTEscz1lLmxlbmd0aDsrK248czspaWYoSXIoZVtuXSx0KSlyZXR1cm4hMDtyZXR1cm4hMX19O2Z1bmN0aW9uIElyKGksdCl7cmV0dXJuIGkmJkxoLmhhc093blByb3BlcnR5KGkudHlwZSk/TGhbaS50eXBlXShpLHQpOiExfWZ1bmN0aW9uIE9oKGksdCl7cmV0dXJuIGxpKGksdCk9PT0wfWZ1bmN0aW9uIERoKGksdCl7Zm9yKHZhciBlLG4scyxyPTAsbz1pLmxlbmd0aDtyPG87cisrKXtpZihuPWxpKGlbcl0sdCksbj09PTB8fHI+MCYmKHM9bGkoaVtyXSxpW3ItMV0pLHM+MCYmZTw9cyYmbjw9cyYmKGUrbi1zKSooMS1NYXRoLnBvdygoZS1uKS9zLDIpKTxmcipzKSlyZXR1cm4hMDtlPW59cmV0dXJuITF9ZnVuY3Rpb24gJGgoaSx0KXtyZXR1cm4hIUloKGkubWFwKFpwKSxWaCh0KSl9ZnVuY3Rpb24gWnAoaSl7cmV0dXJuIGk9aS5tYXAoVmgpLGkucG9wKCksaX1mdW5jdGlvbiBWaChpKXtyZXR1cm5baVswXSpYLGlbMV0qWF19ZnVuY3Rpb24gV3AoaSx0KXtyZXR1cm4oaSYmUmguaGFzT3duUHJvcGVydHkoaS50eXBlKT9SaFtpLnR5cGVdOklyKShpLHQpfWZ1bmN0aW9uIEhwKGksdCl7dmFyIGU9aVswXSpYLG49aVsxXSpYLHM9dFswXSpYLHI9dFsxXSpYLG89RyhuKSxhPXEobiksYz1HKHIpLGw9cShyKSxoPW8qRyhlKSx1PW8qcShlKSxmPWMqRyhzKSxkPWMqcShzKSxwPTIqJGUoRGUobmgoci1uKStvKmMqbmgocy1lKSkpLHk9cShwKSxtPXA/ZnVuY3Rpb24oZyl7dmFyIGI9cShnKj1wKS95LHg9cShwLWcpL3ksdz14KmgrYipmLE09eCp1K2IqZCxBPXgqYStiKmw7cmV0dXJuW3JlKE0sdykqaHQscmUoQSxEZSh3KncrTSpNKSkqaHRdfTpmdW5jdGlvbigpe3JldHVybltlKmh0LG4qaHRdfTtyZXR1cm4gbS5kaXN0YW5jZT1wLG19dmFyIFVoPWk9PmksaGk9MS8wLGtyPWhpLFlpPS1oaSxOcj1ZaSxxaD17cG9pbnQ6SnAsbGluZVN0YXJ0Ol90LGxpbmVFbmQ6X3QscG9seWdvblN0YXJ0Ol90LHBvbHlnb25FbmQ6X3QscmVzdWx0OmZ1bmN0aW9uKCl7dmFyIGk9W1toaSxrcl0sW1lpLE5yXV07cmV0dXJuIFlpPU5yPS0oa3I9aGk9MS8wKSxpfX07ZnVuY3Rpb24gSnAoaSx0KXtpPGhpJiYoaGk9aSksaT5ZaSYmKFlpPWkpLHQ8a3ImJihrcj10KSx0Pk5yJiYoTnI9dCl9ZnVuY3Rpb24gV2EoaSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBIYTtmb3IodmFyIG4gaW4gaSllW25dPWlbbl07cmV0dXJuIGUuc3RyZWFtPXQsZX19ZnVuY3Rpb24gSGEoKXt9SGEucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpIYSxwb2ludDpmdW5jdGlvbihpLHQpe3RoaXMuc3RyZWFtLnBvaW50KGksdCl9LHNwaGVyZTpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBKYShpLHQsZSl7dmFyIG49aS5jbGlwRXh0ZW50JiZpLmNsaXBFeHRlbnQoKTtyZXR1cm4gaS5zY2FsZSgxNTApLnRyYW5zbGF0ZShbMCwwXSksbiE9bnVsbCYmaS5jbGlwRXh0ZW50KG51bGwpLHlyKGUsaS5zdHJlYW0ocWgpKSx0KHFoLnJlc3VsdCgpKSxuIT1udWxsJiZpLmNsaXBFeHRlbnQobiksaX1mdW5jdGlvbiBYaChpLHQsZSl7cmV0dXJuIEphKGksZnVuY3Rpb24obil7dmFyIHM9dFsxXVswXS10WzBdWzBdLHI9dFsxXVsxXS10WzBdWzFdLG89TWF0aC5taW4ocy8oblsxXVswXS1uWzBdWzBdKSxyLyhuWzFdWzFdLW5bMF1bMV0pKSxhPSt0WzBdWzBdKyhzLW8qKG5bMV1bMF0rblswXVswXSkpLzIsYz0rdFswXVsxXSsoci1vKihuWzFdWzFdK25bMF1bMV0pKS8yO2kuc2NhbGUoMTUwKm8pLnRyYW5zbGF0ZShbYSxjXSl9LGUpfWZ1bmN0aW9uIFlwKGksdCxlKXtyZXR1cm4gWGgoaSxbWzAsMF0sdF0sZSl9ZnVuY3Rpb24ganAoaSx0LGUpe3JldHVybiBKYShpLGZ1bmN0aW9uKG4pe3ZhciBzPSt0LHI9cy8oblsxXVswXS1uWzBdWzBdKSxvPShzLXIqKG5bMV1bMF0rblswXVswXSkpLzIsYT0tcipuWzBdWzFdO2kuc2NhbGUoMTUwKnIpLnRyYW5zbGF0ZShbbyxhXSl9LGUpfWZ1bmN0aW9uIFFwKGksdCxlKXtyZXR1cm4gSmEoaSxmdW5jdGlvbihuKXt2YXIgcz0rdCxyPXMvKG5bMV1bMV0tblswXVsxXSksbz0tcipuWzBdWzBdLGE9KHMtciooblsxXVsxXStuWzBdWzFdKSkvMjtpLnNjYWxlKDE1MCpyKS50cmFuc2xhdGUoW28sYV0pfSxlKX12YXIgR2g9MTYsS3A9RygzMCpYKTtmdW5jdGlvbiBaaChpLHQpe3JldHVybit0P2V5KGksdCk6dHkoaSl9ZnVuY3Rpb24gdHkoaSl7cmV0dXJuIFdhKHtwb2ludDpmdW5jdGlvbih0LGUpe3Q9aSh0LGUpLHRoaXMuc3RyZWFtLnBvaW50KHRbMF0sdFsxXSl9fSl9ZnVuY3Rpb24gZXkoaSx0KXtmdW5jdGlvbiBlKG4scyxyLG8sYSxjLGwsaCx1LGYsZCxwLHksbSl7dmFyIGc9bC1uLGI9aC1zLHg9ZypnK2IqYjtpZih4PjQqdCYmeS0tKXt2YXIgdz1vK2YsTT1hK2QsQT1jK3AsUz1EZSh3KncrTSpNK0EqQSksXz0kZShBLz1TKSx2PUsoSyhBKS0xKTxRfHxLKHItdSk8UT8ocit1KS8yOnJlKE0sdyksUD1pKHYsXyksej1QWzBdLEU9UFsxXSxDPXotbixGPUUtcyxCPWIqQy1nKkY7KEIqQi94PnR8fEsoKGcqQytiKkYpL3gtLjUpPi4zfHxvKmYrYSpkK2MqcDxLcCkmJihlKG4scyxyLG8sYSxjLHosRSx2LHcvPVMsTS89UyxBLHksbSksbS5wb2ludCh6LEUpLGUoeixFLHYsdyxNLEEsbCxoLHUsZixkLHAseSxtKSl9fXJldHVybiBmdW5jdGlvbihuKXt2YXIgcyxyLG8sYSxjLGwsaCx1LGYsZCxwLHksbT17cG9pbnQ6ZyxsaW5lU3RhcnQ6YixsaW5lRW5kOncscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7bi5wb2x5Z29uU3RhcnQoKSxtLmxpbmVTdGFydD1NfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7bi5wb2x5Z29uRW5kKCksbS5saW5lU3RhcnQ9Yn19O2Z1bmN0aW9uIGcoXyx2KXtfPWkoXyx2KSxuLnBvaW50KF9bMF0sX1sxXSl9ZnVuY3Rpb24gYigpe3U9TmFOLG0ucG9pbnQ9eCxuLmxpbmVTdGFydCgpfWZ1bmN0aW9uIHgoXyx2KXt2YXIgUD1fbihbXyx2XSksej1pKF8sdik7ZSh1LGYsaCxkLHAseSx1PXpbMF0sZj16WzFdLGg9XyxkPVBbMF0scD1QWzFdLHk9UFsyXSxHaCxuKSxuLnBvaW50KHUsZil9ZnVuY3Rpb24gdygpe20ucG9pbnQ9ZyxuLmxpbmVFbmQoKX1mdW5jdGlvbiBNKCl7YigpLG0ucG9pbnQ9QSxtLmxpbmVFbmQ9U31mdW5jdGlvbiBBKF8sdil7eChzPV8sdikscj11LG89ZixhPWQsYz1wLGw9eSxtLnBvaW50PXh9ZnVuY3Rpb24gUygpe2UodSxmLGgsZCxwLHkscixvLHMsYSxjLGwsR2gsbiksbS5saW5lRW5kPXcsdygpfXJldHVybiBtfX12YXIgbnk9V2Eoe3BvaW50OmZ1bmN0aW9uKGksdCl7dGhpcy5zdHJlYW0ucG9pbnQoaSpYLHQqWCl9fSk7ZnVuY3Rpb24gaXkoaSl7cmV0dXJuIFdhKHtwb2ludDpmdW5jdGlvbih0LGUpe3ZhciBuPWkodCxlKTtyZXR1cm4gdGhpcy5zdHJlYW0ucG9pbnQoblswXSxuWzFdKX19KX1mdW5jdGlvbiBzeShpLHQsZSxuLHMpe2Z1bmN0aW9uIHIobyxhKXtyZXR1cm4gbyo9bixhKj1zLFt0K2kqbyxlLWkqYV19cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKG8sYSl7cmV0dXJuWyhvLXQpL2kqbiwoZS1hKS9pKnNdfSxyfWZ1bmN0aW9uIFdoKGksdCxlLG4scyxyKXtpZighcilyZXR1cm4gc3koaSx0LGUsbixzKTt2YXIgbz1HKHIpLGE9cShyKSxjPW8qaSxsPWEqaSxoPW8vaSx1PWEvaSxmPShhKmUtbyp0KS9pLGQ9KGEqdCtvKmUpL2k7ZnVuY3Rpb24gcCh5LG0pe3JldHVybiB5Kj1uLG0qPXMsW2MqeS1sKm0rdCxlLWwqeS1jKm1dfXJldHVybiBwLmludmVydD1mdW5jdGlvbih5LG0pe3JldHVybltuKihoKnktdSptK2YpLHMqKGQtdSp5LWgqbSldfSxwfWZ1bmN0aW9uIFJyKGkpe3JldHVybiByeShmdW5jdGlvbigpe3JldHVybiBpfSkoKX1mdW5jdGlvbiByeShpKXt2YXIgdCxlPTE1MCxuPTQ4MCxzPTI1MCxyPTAsbz0wLGE9MCxjPTAsbD0wLGgsdT0wLGY9MSxkPTEscD1udWxsLHk9TmgsbT1udWxsLGcsYix4LHc9VWgsTT0uNSxBLFMsXyx2LFA7ZnVuY3Rpb24geihCKXtyZXR1cm4gXyhCWzBdKlgsQlsxXSpYKX1mdW5jdGlvbiBFKEIpe3JldHVybiBCPV8uaW52ZXJ0KEJbMF0sQlsxXSksQiYmW0JbMF0qaHQsQlsxXSpodF19ei5zdHJlYW09ZnVuY3Rpb24oQil7cmV0dXJuIHYmJlA9PT1CP3Y6dj1ueShpeShoKSh5KEEodyhQPUIpKSkpKX0sei5wcmVjbGlwPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PUIscD12b2lkIDAsRigpKTp5fSx6LnBvc3RjbGlwPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh3PUIsbT1nPWI9eD1udWxsLEYoKSk6d30sei5jbGlwQW5nbGU9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9K0I/THAocD1CKlgpOihwPW51bGwsTmgpLEYoKSk6cCpodH0sei5jbGlwRXh0ZW50PWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh3PUI9PW51bGw/KG09Zz1iPXg9bnVsbCxVaCk6RHAobT0rQlswXVswXSxnPStCWzBdWzFdLGI9K0JbMV1bMF0seD0rQlsxXVsxXSksRigpKTptPT1udWxsP251bGw6W1ttLGddLFtiLHhdXX0sei5zY2FsZT1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rQixDKCkpOmV9LHoudHJhbnNsYXRlPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStCWzBdLHM9K0JbMV0sQygpKTpbbixzXX0sei5jZW50ZXI9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9QlswXSUzNjAqWCxvPUJbMV0lMzYwKlgsQygpKTpbcipodCxvKmh0XX0sei5yb3RhdGU9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9QlswXSUzNjAqWCxjPUJbMV0lMzYwKlgsbD1CLmxlbmd0aD4yP0JbMl0lMzYwKlg6MCxDKCkpOlthKmh0LGMqaHQsbCpodF19LHouYW5nbGU9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9QiUzNjAqWCxDKCkpOnUqaHR9LHoucmVmbGVjdFg9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9Qj8tMToxLEMoKSk6ZjwwfSx6LnJlZmxlY3RZPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPUI/LTE6MSxDKCkpOmQ8MH0sei5wcmVjaXNpb249ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEE9WmgoUyxNPUIqQiksRigpKTpEZShNKX0sei5maXRFeHRlbnQ9ZnVuY3Rpb24oQixJKXtyZXR1cm4gWGgoeixCLEkpfSx6LmZpdFNpemU9ZnVuY3Rpb24oQixJKXtyZXR1cm4gWXAoeixCLEkpfSx6LmZpdFdpZHRoPWZ1bmN0aW9uKEIsSSl7cmV0dXJuIGpwKHosQixJKX0sei5maXRIZWlnaHQ9ZnVuY3Rpb24oQixJKXtyZXR1cm4gUXAoeixCLEkpfTtmdW5jdGlvbiBDKCl7dmFyIEI9V2goZSwwLDAsZixkLHUpLmFwcGx5KG51bGwsdChyLG8pKSxJPVdoKGUsbi1CWzBdLHMtQlsxXSxmLGQsdSk7cmV0dXJuIGg9dmgoYSxjLGwpLFM9VmEodCxJKSxfPVZhKGgsUyksQT1aaChTLE0pLEYoKX1mdW5jdGlvbiBGKCl7cmV0dXJuIHY9UD1udWxsLHp9cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyksei5pbnZlcnQ9dC5pbnZlcnQmJkUsQygpfX1mdW5jdGlvbiBveShpKXtyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbj1EZSh0KnQrZSplKSxzPWkobikscj1xKHMpLG89RyhzKTtyZXR1cm5bcmUodCpyLG4qbyksJGUobiYmZSpyL24pXX19ZnVuY3Rpb24gWWEoaSx0KXtyZXR1cm5baSxtcCh4cCgoUnQrdCkvMikpXX1ZYS5pbnZlcnQ9ZnVuY3Rpb24oaSx0KXtyZXR1cm5baSwyKkNhKHlwKHQpKS1SdF19O2Z1bmN0aW9uIGF5KCl7cmV0dXJuIGN5KFlhKS5zY2FsZSg5NjEvTHQpfWZ1bmN0aW9uIGN5KGkpe3ZhciB0PVJyKGkpLGU9dC5jZW50ZXIsbj10LnNjYWxlLHM9dC50cmFuc2xhdGUscj10LmNsaXBFeHRlbnQsbz1udWxsLGEsYyxsO3Quc2NhbGU9ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG4odSksaCgpKTpuKCl9LHQudHJhbnNsYXRlPWZ1bmN0aW9uKHUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzKHUpLGgoKSk6cygpfSx0LmNlbnRlcj1mdW5jdGlvbih1KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZSh1KSxoKCkpOmUoKX0sdC5jbGlwRXh0ZW50PWZ1bmN0aW9uKHUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PT1udWxsP289YT1jPWw9bnVsbDoobz0rdVswXVswXSxhPSt1WzBdWzFdLGM9K3VbMV1bMF0sbD0rdVsxXVsxXSksaCgpKTpvPT1udWxsP251bGw6W1tvLGFdLFtjLGxdXX07ZnVuY3Rpb24gaCgpe3ZhciB1PUgqbigpLGY9dChQaCh0LnJvdGF0ZSgpKS5pbnZlcnQoWzAsMF0pKTtyZXR1cm4gcihvPT1udWxsP1tbZlswXS11LGZbMV0tdV0sW2ZbMF0rdSxmWzFdK3VdXTppPT09WWE/W1tNYXRoLm1heChmWzBdLXUsbyksYV0sW01hdGgubWluKGZbMF0rdSxjKSxsXV06W1tvLE1hdGgubWF4KGZbMV0tdSxhKV0sW2MsTWF0aC5taW4oZlsxXSt1LGwpXV0pfXJldHVybiBoKCl9ZnVuY3Rpb24gamEoaSx0KXtyZXR1cm5baSx0XX1qYS5pbnZlcnQ9amE7ZnVuY3Rpb24gbHkoKXtyZXR1cm4gUnIoamEpLnNjYWxlKDE1Mi42Myl9ZnVuY3Rpb24gSGgoaSx0KXt2YXIgZT1HKHQpLG49MStHKGkpKmU7cmV0dXJuW2UqcShpKS9uLHEodCkvbl19SGguaW52ZXJ0PW95KGZ1bmN0aW9uKGkpe3JldHVybiAyKkNhKGkpfSk7ZnVuY3Rpb24gaHkoKXtyZXR1cm4gUnIoSGgpLnNjYWxlKDI1MCkuY2xpcEFuZ2xlKDE0Mil9dmFyIExyPU1hdGguYWJzLHVpPU1hdGguY29zLE1lPU1hdGguc2luLGppPTFlLTYsT3I9TWF0aC5QSSxRYT1Pci8yO2Z1bmN0aW9uIHV5KGkpe3JldHVybiBpP2kvTWF0aC5zaW4oaSk6MX1mdW5jdGlvbiBLYShpKXtyZXR1cm4gaT4xPzA6aTwtMT9PcjpNYXRoLmFjb3MoaSl9ZnVuY3Rpb24gSmgoaSl7cmV0dXJuIGk+MD9NYXRoLnNxcnQoaSk6MH1mdW5jdGlvbiBZaChpLHQpe3ZhciBlPXVpKHQpLG49dXkoS2EoZSp1aShpLz0yKSkpO3JldHVyblsyKmUqTWUoaSkqbixNZSh0KSpuXX1ZaC5pbnZlcnQ9ZnVuY3Rpb24oaSx0KXtpZighKGkqaSs0KnQqdD5PcipPcitqaSkpe3ZhciBlPWksbj10LHM9MjU7ZG97dmFyIHI9TWUoZSksbz1NZShlLzIpLGE9dWkoZS8yKSxjPU1lKG4pLGw9dWkobiksaD1NZSgyKm4pLHU9YypjLGY9bCpsLGQ9bypvLHA9MS1mKmEqYSx5PXA/S2EobCphKSpKaChtPTEvcCk6bT0wLG0sZz0yKnkqbCpvLWksYj15KmMtdCx4PW0qKGYqZCt5KmwqYSp1KSx3PW0qKC41KnIqaC15KjIqYypvKSxNPW0qLjI1KihoKm8teSpjKmYqciksQT1tKih1KmEreSpkKmwpLFM9dypNLUEqeDtpZighUylicmVhazt2YXIgXz0oYip3LWcqQSkvUyx2PShnKk0tYip4KS9TO2UtPV8sbi09dn13aGlsZSgoTHIoXyk+aml8fExyKHYpPmppKSYmLS1zPjApO3JldHVybltlLG5dfX07ZnVuY3Rpb24gamgoaSx0KXt2YXIgZT1ZaChpLHQpO3JldHVyblsoZVswXStpL1FhKS8yLChlWzFdK3QpLzJdfWpoLmludmVydD1mdW5jdGlvbihpLHQpe3ZhciBlPWksbj10LHM9MjU7ZG97dmFyIHI9dWkobiksbz1NZShuKSxhPU1lKDIqbiksYz1vKm8sbD1yKnIsaD1NZShlKSx1PXVpKGUvMiksZj1NZShlLzIpLGQ9ZipmLHA9MS1sKnUqdSx5PXA/S2Eocip1KSpKaChtPTEvcCk6bT0wLG0sZz0uNSooMip5KnIqZitlL1FhKS1pLGI9LjUqKHkqbytuKS10LHg9LjUqbSoobCpkK3kqcip1KmMpKy41L1FhLHc9bSooaCphLzQteSpvKmYpLE09LjEyNSptKihhKmYteSpvKmwqaCksQT0uNSptKihjKnUreSpkKnIpKy41LFM9dypNLUEqeCxfPShiKnctZypBKS9TLHY9KGcqTS1iKngpL1M7ZS09XyxuLT12fXdoaWxlKChMcihfKT5qaXx8THIodik+amkpJiYtLXM+MCk7cmV0dXJuW2Usbl19O2Z1bmN0aW9uIGZ5KCl7cmV0dXJuIFJyKGpoKS5zY2FsZSgxNTguODM3KX1jb25zdCBkeT17bWVyY2F0b3I6YXksZXF1aXJlY3Rhbmd1bGFyOmx5LHdpbmtlbDM6Znl9LHRjPXt9LFFpPWk9Pnt2YXIgbixzLHI7Y29uc3QgdD1KU09OLnN0cmluZ2lmeShpKTtpZih0Y1t0XSlyZXR1cm4gdGNbdF07Y29uc3QgZT1keVsobj1pLnByb2plY3Rpb25UeXBlKSE9bnVsbD9uOiJtZXJjYXRvciJdKCkuY2VudGVyKGkuY2VudGVyKS5zY2FsZShpLnNjYWxlKS50cmFuc2xhdGUoKHM9aS50cmFuc2xhdGUpIT1udWxsP3M6WzAsMF0pLnByZWNpc2lvbigocj1pLnByZWNpc2lvbikhPW51bGw/cjouMSk7cmV0dXJuIGkucm90YXRlJiZlLnJvdGF0ZShpLnJvdGF0ZSksdGNbdF09ZSxlfTtmdW5jdGlvbiBweShpLHQsZT0wKXtjb25zdCBuPSg5MC10KSpNYXRoLlBJLzE4MCxzPSg5MC1pKSpNYXRoLlBJLzE4MDtyZXR1cm5bZSpNYXRoLnNpbihuKSpNYXRoLmNvcyhzKSxlKk1hdGguY29zKG4pLGUqTWF0aC5zaW4obikqTWF0aC5zaW4ocyldfWNvbnN0IERyPShpLHQpPT5pLm1hcCgoW2Usbl0pPT57bGV0IHM7aWYodCl7Y29uc3RbcixvXT10KFtlLG5dKTtzPW5ldyBOKHIsLW8pfWVsc2Ugcz1uZXcgTihlLG4pO3JldHVybiBzfSksS2k9KHtjb29yZGluYXRlczppLGxlbmd0aHM6dCxkaW1lbnNpb246ZT0yfSk9Pntjb25zdCBuPVtdO2lmKGkmJnQmJmkgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpe2xldCBzPTA7Zm9yKGNvbnN0IHIgb2YgdCl7Y29uc3Qgbz1bXTtmb3IobGV0IGE9MDthPHI7YSsrKW8ucHVzaChBcnJheS5mcm9tKGkuc2xpY2UocyxzK2UpKSkscys9ZTtuLnB1c2gobyl9fXJldHVybiBufTt2YXIgdHM9KGksdCk9Pntjb25zdCBlPXRoKGksdCE9bnVsbD90OjApLG49e30scz1bXSxyPU9iamVjdC5rZXlzKGUuYXR0cmlidXRlcyk7cmV0dXJuIGUuaW5kZXgmJnIucHVzaCgiaW5kZXgiKSxyLmZvckVhY2gobz0+e2NvbnN0IGE9bz09PSJpbmRleCI/ZS5pbmRleDplLmF0dHJpYnV0ZXNbb107bltvXT17YXJyYXk6YS5hcnJheSxpdGVtU2l6ZTphLml0ZW1TaXplfSxzLnB1c2goYS5hcnJheS5idWZmZXIpfSksdCYmKG4uZ3JvdXBzPWUuZ3JvdXBzKSxlLmRpc3Bvc2UoKSxpLmZvckVhY2gobz0+e28uZGlzcG9zZSgpfSkse21lc3NhZ2U6bix0cmFuc2ZlcjpzfX0sZWM9KGksdD0zMDApPT57Y29uc3QgZT1bXTtyZXR1cm4gaS5mb3JFYWNoKG49PntsZXQgcz0hMTtmb3IobGV0IHI9MTtyPG4ubGVuZ3RoO3IrKylpZihNYXRoLmFicyhuW3JdLngtbltyLTFdLngpPnQpe3M9ITA7YnJlYWt9aWYocyl7Y29uc3Qgcj1bXSxvPVtdO24uZm9yRWFjaChhPT57YS54PDA/ci5wdXNoKGEpOm8ucHVzaChhKX0pLGUucHVzaChyLG8pfWVsc2UgZS5wdXNoKG4pfSksZX07ZnVuY3Rpb24geXkoaSx0LGU9MCl7Y29uc3RbbixzLHIsb109aTtsZXQgYT0xLzAsYz0xLzAsbD0tMS8wLGg9LTEvMDtmb3IobGV0IHU9MDt1PD1lO3UrKyl7Y29uc3QgZj1lJiZ1L2U7RHIoW1tuK2YqKHItbiksc10sW24rZiooci1uKSxvXSxbbixzK2YqKG8tcyldLFtyLHMrZiooby1zKV1dLHQpLmZvckVhY2goZD0+e2E9TWF0aC5taW4oYSxkLngpLGM9TWF0aC5taW4oYyxkLnkpLGw9TWF0aC5tYXgobCxkLngpLGg9TWF0aC5tYXgoaCxkLnkpfSl9cmV0dXJuW1thLGNdLFtsLGhdXX1jb25zdCBteT0oe2Nvb3JkaW5hdGVzOmksbGVuZ3Roczp0LHNwbGl0OmUsc2lkZVJlcGVhdDpuLGJib3g6cyxkZXB0aDpyLHo6byxwcm9qZWN0aW9uOmEsdXNlR3JvdXBzOmMsaGFzVG9wOmwsaGFzQm90dG9tOmgsaGFzU2lkZTp1LHNwbGl0UG9seWdvbnM6Zix0b3BTZWdtZW50czpkfSk9Pntjb25zdCBwPWEmJlFpKGEpO2xldCBtPUtpKHtjb29yZGluYXRlczppLGxlbmd0aHM6dH0pLm1hcCh4PT5Ecih4LHApKTtmJiYobT1lYyhtLGYpKTtsZXQgZztpZihzKXtjb25zdFt4LHddPXl5KHMsYSE9bnVsbCYmYS5yb3RhdGU/UWkoSGUoSXQoe30sYSkse3JvdGF0ZTp2b2lkIDB9KSk6cCwoYT09bnVsbD92b2lkIDA6YS5wcm9qZWN0aW9uVHlwZSk9PT0id2lua2VsMyI/MTA6MCk7Zz1uZXcgbXQobmV3IFQoeFswXSx4WzFdLDApLG5ldyBUKHdbMF0sd1sxXSwwKSl9Y29uc3QgYj1tLm1hcCgoeCx3KT0+e3ZhciBBLFMsXztjb25zdCBNPWlwKHtwb2ludHM6eCxzcGxpdDplLHNpZGVSZXBlYXQ6bj8oQT1uW3ddKSE9bnVsbD9BOm5bMF06MSxkZXB0aDooUz1yW3ddKSE9bnVsbD9TOnJbMF0saGFzVG9wOmwsaGFzQm90dG9tOmgsaGFzU2lkZTp1LGJveDM6Zyx0b3BTZWdtZW50czpkfSk7aWYobyl7Y29uc3Qgdj0oXz1vW3ddKSE9bnVsbD9fOm9bMF0sUD1NLmF0dHJpYnV0ZXMucG9zaXRpb247Zm9yKGxldCB6PTA7ejxQLmNvdW50O3orKylQLnNldFooeixQLmdldFooeikrdik7UC5uZWVkc1VwZGF0ZT0hMH1yZXR1cm4gTX0pO3JldHVybiB0cyhiLGMpfTtjbGFzcyBneSBleHRlbmRzIHhle2NvbnN0cnVjdG9yKHQ9W10sZT0ibm9uZSIsbil7c3VwZXIoKSx0aGlzLnR5cGU9Ik1lc2hMaW5lR2VvbWV0cnkiLHRoaXMucG9pbnRDb3VudD0wLHRoaXMuX3BvaW50cz1bXSx0aGlzLnNoYXBlPSJub25lIix0aGlzLnNoYXBlRnVuY3Rpb249cz0+MSx0aGlzLm1hdHJpeFdvcmxkPW5ldyBzdCx0aGlzLnNoYXBlPWUsbiYmKHRoaXMuc2hhcGVGdW5jdGlvbj1uKSx0Lmxlbmd0aD4wJiZ0aGlzLnNldFBvaW50cyh0KX1jb252ZXJ0VG9WZWN0b3IzQXJyYXkodCl7aWYodHlwZW9mIHRbMF09PSJudW1iZXIiKXtjb25zdCBlPVtdLG49dDtmb3IobGV0IHM9MDtzPG4ubGVuZ3RoO3MrPTMpZS5wdXNoKG5ldyBUKG5bc10sbltzKzFdLG5bcysyXSkpO3JldHVybiBlfWVsc2UgcmV0dXJuIHQubWFwKGU9PntpZihlIGluc3RhbmNlb2YgTilyZXR1cm4gbmV3IFQoZS54LGUueSwwKTtpZihlIGluc3RhbmNlb2YgVClyZXR1cm4gZTtpZihBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aD09PTIpcmV0dXJuIG5ldyBUKGVbMF0sZVsxXSwwKTtpZihBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aD09PTMpcmV0dXJuIG5ldyBUKGVbMF0sZVsxXSxlWzJdKX0pLmZpbHRlcihCb29sZWFuKX1zZXRNYXRyaXhXb3JsZCh0KXt0aGlzLm1hdHJpeFdvcmxkPXR9c2V0UG9pbnRzKHQsZSl7IXR8fHQubGVuZ3RoPT09MHx8KHRoaXMuX3BvaW50cz10aGlzLmNvbnZlcnRUb1ZlY3RvcjNBcnJheSh0KSx0aGlzLnBvaW50Q291bnQ9dGhpcy5fcG9pbnRzLmxlbmd0aCxlJiYodGhpcy5zaGFwZUZ1bmN0aW9uPWUsdGhpcy5zaGFwZT0iY3VzdG9tIiksdGhpcy5pbml0aWFsaXplR2VvbWV0cnkoKSx0aGlzLnVwZGF0ZUdlb21ldHJ5KCkpfWluaXRpYWxpemVHZW9tZXRyeSgpe2NvbnN0IHQ9bmV3IGd0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5wb2ludENvdW50KjYpLDMpLGU9bmV3IGd0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5wb2ludENvdW50KjYpLDMpLG49bmV3IGd0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5wb2ludENvdW50KjYpLDMpLHM9bmV3IGd0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5wb2ludENvdW50KjIpLDEpLHI9bmV3IGd0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5wb2ludENvdW50KjIpLDEpLG89bmV3IGd0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5wb2ludENvdW50KjIpLDEpLGE9bmV3IGd0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5wb2ludENvdW50KjQpLDIpLGM9bmV3IGd0KG5ldyBVaW50MTZBcnJheSgodGhpcy5wb2ludENvdW50LTEpKjYpLDEpO3RoaXMuc2hhcGU9PT0idGFwZXIiJiYodGhpcy5zaGFwZUZ1bmN0aW9uPWw9PjEqTWF0aC5wb3coNCpsKigxLWwpLDEpKTtmb3IobGV0IGw9MCxoPTAsdT0wO2w8dGhpcy5wb2ludENvdW50O2wrPTEsaCs9Mix1Kz02KXtzLnNldFgoaCxsL3RoaXMucG9pbnRDb3VudCkscy5zZXRYKGgrMSxsL3RoaXMucG9pbnRDb3VudCksci5zZXRYKGgsMSksci5zZXRYKGgrMSwtMSk7Y29uc3QgZj10aGlzLnNoYXBlPT09Im5vbmUiPzE6dGhpcy5zaGFwZUZ1bmN0aW9uKGwvKHRoaXMucG9pbnRDb3VudC0xKSk7by5zZXRYKGgsZiksby5zZXRYKGgrMSxmKTtjb25zdCBkPWwvKHRoaXMucG9pbnRDb3VudC0xKTtpZihhLnNldFhZKGgsZCwwKSxhLnNldFhZKGgrMSxkLDEpLGw8dGhpcy5wb2ludENvdW50LTEpe2NvbnN0IHA9bCoyO2Muc2V0WCh1KzAscCswKSxjLnNldFgodSsxLHArMSksYy5zZXRYKHUrMixwKzIpLGMuc2V0WCh1KzMscCsyKSxjLnNldFgodSs0LHArMSksYy5zZXRYKHUrNSxwKzMpfX10aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLHQpLHRoaXMuc2V0QXR0cmlidXRlKCJwcmV2aW91cyIsZSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5leHQiLG4pLHRoaXMuc2V0QXR0cmlidXRlKCJjb3VudGVycyIscyksdGhpcy5zZXRBdHRyaWJ1dGUoInNpZGUiLHIpLHRoaXMuc2V0QXR0cmlidXRlKCJ3aWR0aCIsbyksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixhKSx0aGlzLnNldEluZGV4KGMpfXVwZGF0ZUdlb21ldHJ5KCl7aWYoIXRoaXMuX3BvaW50c1swXSlyZXR1cm47Y29uc3QgdD10aGlzLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKSxlPXRoaXMuZ2V0QXR0cmlidXRlKCJwcmV2aW91cyIpLG49dGhpcy5nZXRBdHRyaWJ1dGUoIm5leHQiKTtsZXQgcz0wLHI9MCxvPTA7Y29uc3QgYT10aGlzLl9wb2ludHNbMF07ZS5zZXRYWVoocixhLngsYS55LGEueikscis9MSxlLnNldFhZWihyLGEueCxhLnksYS56KSxyKz0xO2ZvcihsZXQgbD0wO2w8dGhpcy5wb2ludENvdW50O2wrKyl7Y29uc3QgaD10aGlzLl9wb2ludHNbbF07dC5zZXRYWVoocyxoLngsaC55LGgueikscys9MSx0LnNldFhZWihzLGgueCxoLnksaC56KSxzKz0xLGw8dGhpcy5wb2ludENvdW50LTEmJihlLnNldFhZWihyLGgueCxoLnksaC56KSxyKz0xLGUuc2V0WFlaKHIsaC54LGgueSxoLnopLHIrPTEpLGw+MCYmbCsxPD10aGlzLnBvaW50Q291bnQmJihuLnNldFhZWihvLGgueCxoLnksaC56KSxvKz0xLG4uc2V0WFlaKG8saC54LGgueSxoLnopLG8rPTEpfWNvbnN0IGM9dGhpcy5fcG9pbnRzW3RoaXMucG9pbnRDb3VudC0xXTtuLnNldFhZWihvLGMueCxjLnksYy56KSxvKz0xLG4uc2V0WFlaKG8sYy54LGMueSxjLnopLG8rPTEsdC5uZWVkc1VwZGF0ZT0hMCxlLm5lZWRzVXBkYXRlPSEwLG4ubmVlZHNVcGRhdGU9ITAsdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSx0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpfWdldCBwb2ludHMoKXtyZXR1cm4gdGhpcy5fcG9pbnRzfXNldCBwb2ludHModCl7dGhpcy5zZXRQb2ludHModCl9dXBkYXRlUG9pbnRzKHQsZSl7Y29uc3Qgbj10aGlzLmNvbnZlcnRUb1ZlY3RvcjNBcnJheSh0KTtpZihuLmxlbmd0aCE9PXRoaXMucG9pbnRDb3VudCl7Y29uc29sZS53YXJuKCJNZXNoTGluZUdlb21ldHJ5OiBDYW5ub3QgdXBkYXRlIHBvaW50cyB3aXRoIGRpZmZlcmVudCBsZW5ndGguIFVzZSBzZXRQb2ludHMoKSBpbnN0ZWFkLiIpO3JldHVybn10aGlzLl9wb2ludHM9bixlJiYodGhpcy5zaGFwZUZ1bmN0aW9uPWUsdGhpcy5zaGFwZT0iY3VzdG9tIix0aGlzLmluaXRpYWxpemVHZW9tZXRyeSgpKSx0aGlzLnVwZGF0ZUdlb21ldHJ5KCl9c2V0U2hhcGUodCxlKXt0aGlzLnNoYXBlPXQsZSYmKHRoaXMuc2hhcGVGdW5jdGlvbj1lKSx0aGlzLl9wb2ludHMubGVuZ3RoPjAmJih0aGlzLmluaXRpYWxpemVHZW9tZXRyeSgpLHRoaXMudXBkYXRlR2VvbWV0cnkoKSl9fXZhciBRaD1pPT57Y29uc3R7c2V0UG9pbnRXaWR0aDp0LG5vZGVzOmV9PWksbj1uZXcgZ3k7cmV0dXJuIG4uc2V0UG9pbnRzKGUsdCksbn07Y29uc3QgeHk9KHtjb29yZGluYXRlczppLGxlbmd0aHM6dCxwcm9qZWN0aW9uOmUsbGluZVdpZHRoOm4sdXNlR3JvdXBzOnMsc3BsaXRQb2x5Z29uczpyfSk9Pntjb25zdCBvPWUmJlFpKGUpO2xldCBjPUtpKHtjb29yZGluYXRlczppLGxlbmd0aHM6dH0pLm1hcChoPT5EcihoLG8pKTtyJiYoYz1lYyhjLHIpKTtjb25zdCBsPWMubWFwKChoLHUpPT57dmFyIGQ7Y29uc3QgZj0oZD1uW3VdKSE9bnVsbD9kOm5bMF07cmV0dXJuIFFoKHtub2RlczpoLHNldFBvaW50V2lkdGg6KCk9PmZ9KX0pO3JldHVybiB0cyhsLHMpfTt2YXIgd3k9aT0+e2NvbnN0e3BvaW50czp0fT1pLGU9dC5yZWR1Y2UoKHMscixvKT0+KG88dC5sZW5ndGgtMSYmcy5wdXNoKHIsdFtvKzFdKSxzKSxbXSk7cmV0dXJuIG5ldyB4ZSgpLnNldEZyb21Qb2ludHMoZSl9O2NvbnN0IGJ5PSh7Y29vcmRpbmF0ZXM6aSxsZW5ndGhzOnQscHJvamVjdGlvbjplLGxpbmVXaWR0aDpuLHVzZUdyb3VwczpzLHNwbGl0UG9seWdvbnM6cn0pPT57Y29uc3Qgbz1lJiZRaShlKTtsZXQgYz1LaSh7Y29vcmRpbmF0ZXM6aSxsZW5ndGhzOnR9KS5tYXAoaD0+RHIoaCxvKSk7ciYmKGM9ZWMoYyxyKSk7Y29uc3QgbD1jLm1hcCgoaCx1KT0+d3koe3BvaW50czpoLm1hcChmPT5uZXcgVChmLngsZi55LDApKX0pKTtyZXR1cm4gdHMobCxzKX07ZnVuY3Rpb24gTXkoaSx0LGU9Mil7Y29uc3Qgbj10JiZ0Lmxlbmd0aCxzPW4/dFswXSplOmkubGVuZ3RoO2xldCByPUtoKGksMCxzLGUsITApO2NvbnN0IG89W107aWYoIXJ8fHIubmV4dD09PXIucHJldilyZXR1cm4gbztsZXQgYSxjLGw7aWYobiYmKHI9enkoaSx0LHIsZSkpLGkubGVuZ3RoPjgwKmUpe2E9aVswXSxjPWlbMV07bGV0IGg9YSx1PWM7Zm9yKGxldCBmPWU7ZjxzO2YrPWUpe2NvbnN0IGQ9aVtmXSxwPWlbZisxXTtkPGEmJihhPWQpLHA8YyYmKGM9cCksZD5oJiYoaD1kKSxwPnUmJih1PXApfWw9TWF0aC5tYXgoaC1hLHUtYyksbD1sIT09MD8zMjc2Ny9sOjB9cmV0dXJuIGVzKHIsbyxlLGEsYyxsLDApLG99ZnVuY3Rpb24gS2goaSx0LGUsbixzKXtsZXQgcjtpZihzPT09THkoaSx0LGUsbik+MClmb3IobGV0IG89dDtvPGU7bys9bilyPWl1KG8vbnwwLGlbb10saVtvKzFdLHIpO2Vsc2UgZm9yKGxldCBvPWUtbjtvPj10O28tPW4pcj1pdShvL258MCxpW29dLGlbbysxXSxyKTtyZXR1cm4gciYmZmkocixyLm5leHQpJiYoc3Mocikscj1yLm5leHQpLHJ9ZnVuY3Rpb24gVG4oaSx0KXtpZighaSlyZXR1cm4gaTt0fHwodD1pKTtsZXQgZT1pLG47ZG8gaWYobj0hMSwhZS5zdGVpbmVyJiYoZmkoZSxlLm5leHQpfHxhdChlLnByZXYsZSxlLm5leHQpPT09MCkpe2lmKHNzKGUpLGU9dD1lLnByZXYsZT09PWUubmV4dClicmVhaztuPSEwfWVsc2UgZT1lLm5leHQ7d2hpbGUobnx8ZSE9PXQpO3JldHVybiB0fWZ1bmN0aW9uIGVzKGksdCxlLG4scyxyLG8pe2lmKCFpKXJldHVybjshbyYmciYmQnkoaSxuLHMscik7bGV0IGE9aTtmb3IoO2kucHJldiE9PWkubmV4dDspe2NvbnN0IGM9aS5wcmV2LGw9aS5uZXh0O2lmKHI/U3koaSxuLHMscik6QXkoaSkpe3QucHVzaChjLmksaS5pLGwuaSksc3MoaSksaT1sLm5leHQsYT1sLm5leHQ7Y29udGludWV9aWYoaT1sLGk9PT1hKXtvP289PT0xPyhpPXZ5KFRuKGkpLHQpLGVzKGksdCxlLG4scyxyLDIpKTpvPT09MiYmX3koaSx0LGUsbixzLHIpOmVzKFRuKGkpLHQsZSxuLHMsciwxKTticmVha319fWZ1bmN0aW9uIEF5KGkpe2NvbnN0IHQ9aS5wcmV2LGU9aSxuPWkubmV4dDtpZihhdCh0LGUsbik+PTApcmV0dXJuITE7Y29uc3Qgcz10Lngscj1lLngsbz1uLngsYT10LnksYz1lLnksbD1uLnksaD1NYXRoLm1pbihzLHIsbyksdT1NYXRoLm1pbihhLGMsbCksZj1NYXRoLm1heChzLHIsbyksZD1NYXRoLm1heChhLGMsbCk7bGV0IHA9bi5uZXh0O2Zvcig7cCE9PXQ7KXtpZihwLng+PWgmJnAueDw9ZiYmcC55Pj11JiZwLnk8PWQmJm5zKHMsYSxyLGMsbyxsLHAueCxwLnkpJiZhdChwLnByZXYscCxwLm5leHQpPj0wKXJldHVybiExO3A9cC5uZXh0fXJldHVybiEwfWZ1bmN0aW9uIFN5KGksdCxlLG4pe2NvbnN0IHM9aS5wcmV2LHI9aSxvPWkubmV4dDtpZihhdChzLHIsbyk+PTApcmV0dXJuITE7Y29uc3QgYT1zLngsYz1yLngsbD1vLngsaD1zLnksdT1yLnksZj1vLnksZD1NYXRoLm1pbihhLGMsbCkscD1NYXRoLm1pbihoLHUsZikseT1NYXRoLm1heChhLGMsbCksbT1NYXRoLm1heChoLHUsZiksZz1uYyhkLHAsdCxlLG4pLGI9bmMoeSxtLHQsZSxuKTtsZXQgeD1pLnByZXZaLHc9aS5uZXh0Wjtmb3IoO3gmJnguej49ZyYmdyYmdy56PD1iOyl7aWYoeC54Pj1kJiZ4Lng8PXkmJngueT49cCYmeC55PD1tJiZ4IT09cyYmeCE9PW8mJm5zKGEsaCxjLHUsbCxmLHgueCx4LnkpJiZhdCh4LnByZXYseCx4Lm5leHQpPj0wfHwoeD14LnByZXZaLHcueD49ZCYmdy54PD15JiZ3Lnk+PXAmJncueTw9bSYmdyE9PXMmJnchPT1vJiZucyhhLGgsYyx1LGwsZix3Lngsdy55KSYmYXQody5wcmV2LHcsdy5uZXh0KT49MCkpcmV0dXJuITE7dz13Lm5leHRafWZvcig7eCYmeC56Pj1nOyl7aWYoeC54Pj1kJiZ4Lng8PXkmJngueT49cCYmeC55PD1tJiZ4IT09cyYmeCE9PW8mJm5zKGEsaCxjLHUsbCxmLHgueCx4LnkpJiZhdCh4LnByZXYseCx4Lm5leHQpPj0wKXJldHVybiExO3g9eC5wcmV2Wn1mb3IoO3cmJncuejw9Yjspe2lmKHcueD49ZCYmdy54PD15JiZ3Lnk+PXAmJncueTw9bSYmdyE9PXMmJnchPT1vJiZucyhhLGgsYyx1LGwsZix3Lngsdy55KSYmYXQody5wcmV2LHcsdy5uZXh0KT49MClyZXR1cm4hMTt3PXcubmV4dFp9cmV0dXJuITB9ZnVuY3Rpb24gdnkoaSx0KXtsZXQgZT1pO2Rve2NvbnN0IG49ZS5wcmV2LHM9ZS5uZXh0Lm5leHQ7IWZpKG4scykmJmV1KG4sZSxlLm5leHQscykmJmlzKG4scykmJmlzKHMsbikmJih0LnB1c2gobi5pLGUuaSxzLmkpLHNzKGUpLHNzKGUubmV4dCksZT1pPXMpLGU9ZS5uZXh0fXdoaWxlKGUhPT1pKTtyZXR1cm4gVG4oZSl9ZnVuY3Rpb24gX3koaSx0LGUsbixzLHIpe2xldCBvPWk7ZG97bGV0IGE9by5uZXh0Lm5leHQ7Zm9yKDthIT09by5wcmV2Oyl7aWYoby5pIT09YS5pJiZreShvLGEpKXtsZXQgYz1udShvLGEpO289VG4obyxvLm5leHQpLGM9VG4oYyxjLm5leHQpLGVzKG8sdCxlLG4scyxyLDApLGVzKGMsdCxlLG4scyxyLDApO3JldHVybn1hPWEubmV4dH1vPW8ubmV4dH13aGlsZShvIT09aSl9ZnVuY3Rpb24genkoaSx0LGUsbil7Y29uc3Qgcz1bXTtmb3IobGV0IHI9MCxvPXQubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9dFtyXSpuLGM9cjxvLTE/dFtyKzFdKm46aS5sZW5ndGgsbD1LaChpLGEsYyxuLCExKTtsPT09bC5uZXh0JiYobC5zdGVpbmVyPSEwKSxzLnB1c2goSXkobCkpfXMuc29ydChUeSk7Zm9yKGxldCByPTA7cjxzLmxlbmd0aDtyKyspZT1QeShzW3JdLGUpO3JldHVybiBlfWZ1bmN0aW9uIFR5KGksdCl7bGV0IGU9aS54LXQueDtpZihlPT09MCYmKGU9aS55LXQueSxlPT09MCkpe2NvbnN0IG49KGkubmV4dC55LWkueSkvKGkubmV4dC54LWkueCkscz0odC5uZXh0LnktdC55KS8odC5uZXh0LngtdC54KTtlPW4tc31yZXR1cm4gZX1mdW5jdGlvbiBQeShpLHQpe2NvbnN0IGU9Q3koaSx0KTtpZighZSlyZXR1cm4gdDtjb25zdCBuPW51KGUsaSk7cmV0dXJuIFRuKG4sbi5uZXh0KSxUbihlLGUubmV4dCl9ZnVuY3Rpb24gQ3koaSx0KXtsZXQgZT10O2NvbnN0IG49aS54LHM9aS55O2xldCByPS0xLzAsbztpZihmaShpLGUpKXJldHVybiBlO2Rve2lmKGZpKGksZS5uZXh0KSlyZXR1cm4gZS5uZXh0O2lmKHM8PWUueSYmcz49ZS5uZXh0LnkmJmUubmV4dC55IT09ZS55KXtjb25zdCB1PWUueCsocy1lLnkpKihlLm5leHQueC1lLngpLyhlLm5leHQueS1lLnkpO2lmKHU8PW4mJnU+ciYmKHI9dSxvPWUueDxlLm5leHQueD9lOmUubmV4dCx1PT09bikpcmV0dXJuIG99ZT1lLm5leHR9d2hpbGUoZSE9PXQpO2lmKCFvKXJldHVybiBudWxsO2NvbnN0IGE9byxjPW8ueCxsPW8ueTtsZXQgaD0xLzA7ZT1vO2Rve2lmKG4+PWUueCYmZS54Pj1jJiZuIT09ZS54JiZ0dShzPGw/bjpyLHMsYyxsLHM8bD9yOm4scyxlLngsZS55KSl7Y29uc3QgdT1NYXRoLmFicyhzLWUueSkvKG4tZS54KTtpcyhlLGkpJiYodTxofHx1PT09aCYmKGUueD5vLnh8fGUueD09PW8ueCYmRXkobyxlKSkpJiYobz1lLGg9dSl9ZT1lLm5leHR9d2hpbGUoZSE9PWEpO3JldHVybiBvfWZ1bmN0aW9uIEV5KGksdCl7cmV0dXJuIGF0KGkucHJldixpLHQucHJldik8MCYmYXQodC5uZXh0LGksaS5uZXh0KTwwfWZ1bmN0aW9uIEJ5KGksdCxlLG4pe2xldCBzPWk7ZG8gcy56PT09MCYmKHMuej1uYyhzLngscy55LHQsZSxuKSkscy5wcmV2Wj1zLnByZXYscy5uZXh0Wj1zLm5leHQscz1zLm5leHQ7d2hpbGUocyE9PWkpO3MucHJldloubmV4dFo9bnVsbCxzLnByZXZaPW51bGwsRnkocyl9ZnVuY3Rpb24gRnkoaSl7bGV0IHQsZT0xO2Rve2xldCBuPWkscztpPW51bGw7bGV0IHI9bnVsbDtmb3IodD0wO247KXt0Kys7bGV0IG89bixhPTA7Zm9yKGxldCBsPTA7bDxlJiYoYSsrLG89by5uZXh0WiwhIW8pO2wrKyk7bGV0IGM9ZTtmb3IoO2E+MHx8Yz4wJiZvOylhIT09MCYmKGM9PT0wfHwhb3x8bi56PD1vLnopPyhzPW4sbj1uLm5leHRaLGEtLSk6KHM9byxvPW8ubmV4dFosYy0tKSxyP3IubmV4dFo9czppPXMscy5wcmV2Wj1yLHI9cztuPW99ci5uZXh0Wj1udWxsLGUqPTJ9d2hpbGUodD4xKTtyZXR1cm4gaX1mdW5jdGlvbiBuYyhpLHQsZSxuLHMpe3JldHVybiBpPShpLWUpKnN8MCx0PSh0LW4pKnN8MCxpPShpfGk8PDgpJjE2NzExOTM1LGk9KGl8aTw8NCkmMjUyNjQ1MTM1LGk9KGl8aTw8MikmODU4OTkzNDU5LGk9KGl8aTw8MSkmMTQzMTY1NTc2NSx0PSh0fHQ8PDgpJjE2NzExOTM1LHQ9KHR8dDw8NCkmMjUyNjQ1MTM1LHQ9KHR8dDw8MikmODU4OTkzNDU5LHQ9KHR8dDw8MSkmMTQzMTY1NTc2NSxpfHQ8PDF9ZnVuY3Rpb24gSXkoaSl7bGV0IHQ9aSxlPWk7ZG8odC54PGUueHx8dC54PT09ZS54JiZ0Lnk8ZS55KSYmKGU9dCksdD10Lm5leHQ7d2hpbGUodCE9PWkpO3JldHVybiBlfWZ1bmN0aW9uIHR1KGksdCxlLG4scyxyLG8sYSl7cmV0dXJuKHMtbykqKHQtYSk+PShpLW8pKihyLWEpJiYoaS1vKSoobi1hKT49KGUtbykqKHQtYSkmJihlLW8pKihyLWEpPj0ocy1vKSoobi1hKX1mdW5jdGlvbiBucyhpLHQsZSxuLHMscixvLGEpe3JldHVybiEoaT09PW8mJnQ9PT1hKSYmdHUoaSx0LGUsbixzLHIsbyxhKX1mdW5jdGlvbiBreShpLHQpe3JldHVybiBpLm5leHQuaSE9PXQuaSYmaS5wcmV2LmkhPT10LmkmJiFOeShpLHQpJiYoaXMoaSx0KSYmaXModCxpKSYmUnkoaSx0KSYmKGF0KGkucHJldixpLHQucHJldil8fGF0KGksdC5wcmV2LHQpKXx8ZmkoaSx0KSYmYXQoaS5wcmV2LGksaS5uZXh0KT4wJiZhdCh0LnByZXYsdCx0Lm5leHQpPjApfWZ1bmN0aW9uIGF0KGksdCxlKXtyZXR1cm4odC55LWkueSkqKGUueC10LngpLSh0LngtaS54KSooZS55LXQueSl9ZnVuY3Rpb24gZmkoaSx0KXtyZXR1cm4gaS54PT09dC54JiZpLnk9PT10Lnl9ZnVuY3Rpb24gZXUoaSx0LGUsbil7Y29uc3Qgcz1WcihhdChpLHQsZSkpLHI9VnIoYXQoaSx0LG4pKSxvPVZyKGF0KGUsbixpKSksYT1WcihhdChlLG4sdCkpO3JldHVybiEhKHMhPT1yJiZvIT09YXx8cz09PTAmJiRyKGksZSx0KXx8cj09PTAmJiRyKGksbix0KXx8bz09PTAmJiRyKGUsaSxuKXx8YT09PTAmJiRyKGUsdCxuKSl9ZnVuY3Rpb24gJHIoaSx0LGUpe3JldHVybiB0Lng8PU1hdGgubWF4KGkueCxlLngpJiZ0Lng+PU1hdGgubWluKGkueCxlLngpJiZ0Lnk8PU1hdGgubWF4KGkueSxlLnkpJiZ0Lnk+PU1hdGgubWluKGkueSxlLnkpfWZ1bmN0aW9uIFZyKGkpe3JldHVybiBpPjA/MTppPDA/LTE6MH1mdW5jdGlvbiBOeShpLHQpe2xldCBlPWk7ZG97aWYoZS5pIT09aS5pJiZlLm5leHQuaSE9PWkuaSYmZS5pIT09dC5pJiZlLm5leHQuaSE9PXQuaSYmZXUoZSxlLm5leHQsaSx0KSlyZXR1cm4hMDtlPWUubmV4dH13aGlsZShlIT09aSk7cmV0dXJuITF9ZnVuY3Rpb24gaXMoaSx0KXtyZXR1cm4gYXQoaS5wcmV2LGksaS5uZXh0KTwwP2F0KGksdCxpLm5leHQpPj0wJiZhdChpLGkucHJldix0KT49MDphdChpLHQsaS5wcmV2KTwwfHxhdChpLGkubmV4dCx0KTwwfWZ1bmN0aW9uIFJ5KGksdCl7bGV0IGU9aSxuPSExO2NvbnN0IHM9KGkueCt0LngpLzIscj0oaS55K3QueSkvMjtkbyBlLnk+ciE9ZS5uZXh0Lnk+ciYmZS5uZXh0LnkhPT1lLnkmJnM8KGUubmV4dC54LWUueCkqKHItZS55KS8oZS5uZXh0LnktZS55KStlLngmJihuPSFuKSxlPWUubmV4dDt3aGlsZShlIT09aSk7cmV0dXJuIG59ZnVuY3Rpb24gbnUoaSx0KXtjb25zdCBlPWljKGkuaSxpLngsaS55KSxuPWljKHQuaSx0LngsdC55KSxzPWkubmV4dCxyPXQucHJldjtyZXR1cm4gaS5uZXh0PXQsdC5wcmV2PWksZS5uZXh0PXMscy5wcmV2PWUsbi5uZXh0PWUsZS5wcmV2PW4sci5uZXh0PW4sbi5wcmV2PXIsbn1mdW5jdGlvbiBpdShpLHQsZSxuKXtjb25zdCBzPWljKGksdCxlKTtyZXR1cm4gbj8ocy5uZXh0PW4ubmV4dCxzLnByZXY9bixuLm5leHQucHJldj1zLG4ubmV4dD1zKToocy5wcmV2PXMscy5uZXh0PXMpLHN9ZnVuY3Rpb24gc3MoaSl7aS5uZXh0LnByZXY9aS5wcmV2LGkucHJldi5uZXh0PWkubmV4dCxpLnByZXZaJiYoaS5wcmV2Wi5uZXh0Wj1pLm5leHRaKSxpLm5leHRaJiYoaS5uZXh0Wi5wcmV2Wj1pLnByZXZaKX1mdW5jdGlvbiBpYyhpLHQsZSl7cmV0dXJue2kseDp0LHk6ZSxwcmV2Om51bGwsbmV4dDpudWxsLHo6MCxwcmV2WjpudWxsLG5leHRaOm51bGwsc3RlaW5lcjohMX19ZnVuY3Rpb24gTHkoaSx0LGUsbil7bGV0IHM9MDtmb3IobGV0IHI9dCxvPWUtbjtyPGU7cis9bilzKz0oaVtvXS1pW3JdKSooaVtyKzFdK2lbbysxXSksbz1yO3JldHVybiBzfWZ1bmN0aW9uIHN1KGkpe2NvbnN0IHQ9W10sZT1bXSxuPWlbMF1bMF0ubGVuZ3RoO2xldCBzPTAscj0wO2Zvcihjb25zdCBvIG9mIGkpe2Zvcihjb25zdCBhIG9mIG8pZm9yKGxldCBjPTA7YzxuO2MrKyl0LnB1c2goYVtjXSk7ciYmKHMrPXIsZS5wdXNoKHMpKSxyPW8ubGVuZ3RofXJldHVybnt2ZXJ0aWNlczp0LGhvbGVzOmUsZGltZW5zaW9uczpufX1mdW5jdGlvbiBPeShpKXtpZighaSl0aHJvdyBuZXcgRXJyb3IoImNvb3JkIGlzIHJlcXVpcmVkIik7aWYoIUFycmF5LmlzQXJyYXkoaSkpe2lmKGkudHlwZT09PSJGZWF0dXJlIiYmaS5nZW9tZXRyeSE9PW51bGwmJmkuZ2VvbWV0cnkudHlwZT09PSJQb2ludCIpcmV0dXJuWy4uLmkuZ2VvbWV0cnkuY29vcmRpbmF0ZXNdO2lmKGkudHlwZT09PSJQb2ludCIpcmV0dXJuWy4uLmkuY29vcmRpbmF0ZXNdfWlmKEFycmF5LmlzQXJyYXkoaSkmJmkubGVuZ3RoPj0yJiYhQXJyYXkuaXNBcnJheShpWzBdKSYmIUFycmF5LmlzQXJyYXkoaVsxXSkpcmV0dXJuWy4uLmldO3Rocm93IG5ldyBFcnJvcigiY29vcmQgbXVzdCBiZSBHZW9KU09OIFBvaW50IG9yIGFuIEFycmF5IG9mIG51bWJlcnMiKX1mdW5jdGlvbiBEeShpKXtpZihBcnJheS5pc0FycmF5KGkpKXJldHVybiBpO2lmKGkudHlwZT09PSJGZWF0dXJlIil7aWYoaS5nZW9tZXRyeSE9PW51bGwpcmV0dXJuIGkuZ2VvbWV0cnkuY29vcmRpbmF0ZXN9ZWxzZSBpZihpLmNvb3JkaW5hdGVzKXJldHVybiBpLmNvb3JkaW5hdGVzO3Rocm93IG5ldyBFcnJvcigiY29vcmRzIG11c3QgYmUgR2VvSlNPTiBGZWF0dXJlLCBHZW9tZXRyeSBPYmplY3Qgb3IgYW4gQXJyYXkiKX1mdW5jdGlvbiAkeShpKXtyZXR1cm4gaS50eXBlPT09IkZlYXR1cmUiP2kuZ2VvbWV0cnk6aX1mdW5jdGlvbiBWeShpKXtjb25zdCB0PUR5KGkpO2xldCBlPTAsbj0xLHMscjtmb3IoO248dC5sZW5ndGg7KXM9cnx8dFswXSxyPXRbbl0sZSs9KHJbMF0tc1swXSkqKHJbMV0rc1sxXSksbisrO3JldHVybiBlPjB9dmFyIFV5PVZ5O2NvbnN0IFhlPTExMTAyMjMwMjQ2MjUxNTY1ZS0zMix6dD0xMzQyMTc3MjkscXk9KDMrOCpYZSkqWGU7ZnVuY3Rpb24gc2MoaSx0LGUsbixzKXtsZXQgcixvLGEsYyxsPXRbMF0saD1uWzBdLHU9MCxmPTA7aD5sPT1oPi1sPyhyPWwsbD10WysrdV0pOihyPWgsaD1uWysrZl0pO2xldCBkPTA7aWYodTxpJiZmPGUpZm9yKGg+bD09aD4tbD8obz1sK3IsYT1yLShvLWwpLGw9dFsrK3VdKToobz1oK3IsYT1yLShvLWgpLGg9blsrK2ZdKSxyPW8sYSE9PTAmJihzW2QrK109YSk7dTxpJiZmPGU7KWg+bD09aD4tbD8obz1yK2wsYz1vLXIsYT1yLShvLWMpKyhsLWMpLGw9dFsrK3VdKToobz1yK2gsYz1vLXIsYT1yLShvLWMpKyhoLWMpLGg9blsrK2ZdKSxyPW8sYSE9PTAmJihzW2QrK109YSk7Zm9yKDt1PGk7KW89citsLGM9by1yLGE9ci0oby1jKSsobC1jKSxsPXRbKyt1XSxyPW8sYSE9PTAmJihzW2QrK109YSk7Zm9yKDtmPGU7KW89citoLGM9by1yLGE9ci0oby1jKSsoaC1jKSxoPW5bKytmXSxyPW8sYSE9PTAmJihzW2QrK109YSk7cmV0dXJuKHIhPT0wfHxkPT09MCkmJihzW2QrK109ciksZH1mdW5jdGlvbiBYeShpLHQpe2xldCBlPXRbMF07Zm9yKGxldCBuPTE7bjxpO24rKyllKz10W25dO3JldHVybiBlfWZ1bmN0aW9uIHJzKGkpe3JldHVybiBuZXcgRmxvYXQ2NEFycmF5KGkpfWNvbnN0IEd5PSgzKzE2KlhlKSpYZSxaeT0oMisxMipYZSkqWGUsV3k9KDkrNjQqWGUpKlhlKlhlLGRpPXJzKDQpLHJ1PXJzKDgpLG91PXJzKDEyKSxhdT1ycygxNiksRnQ9cnMoNCk7ZnVuY3Rpb24gSHkoaSx0LGUsbixzLHIsbyl7bGV0IGEsYyxsLGgsdSxmLGQscCx5LG0sZyxiLHgsdyxNLEEsUyxfO2NvbnN0IHY9aS1zLFA9ZS1zLHo9dC1yLEU9bi1yO3c9dipFLGY9enQqdixkPWYtKGYtdikscD12LWQsZj16dCpFLHk9Zi0oZi1FKSxtPUUteSxNPXAqbS0ody1kKnktcCp5LWQqbSksQT16KlAsZj16dCp6LGQ9Zi0oZi16KSxwPXotZCxmPXp0KlAseT1mLShmLVApLG09UC15LFM9cCptLShBLWQqeS1wKnktZCptKSxnPU0tUyx1PU0tZyxkaVswXT1NLShnK3UpKyh1LVMpLGI9dytnLHU9Yi13LHg9dy0oYi11KSsoZy11KSxnPXgtQSx1PXgtZyxkaVsxXT14LShnK3UpKyh1LUEpLF89YitnLHU9Xy1iLGRpWzJdPWItKF8tdSkrKGctdSksZGlbM109XztsZXQgQz1YeSg0LGRpKSxGPVp5Km87aWYoQz49Rnx8LUM+PUZ8fCh1PWktdixhPWktKHYrdSkrKHUtcyksdT1lLVAsbD1lLShQK3UpKyh1LXMpLHU9dC16LGM9dC0oeit1KSsodS1yKSx1PW4tRSxoPW4tKEUrdSkrKHUtciksYT09PTAmJmM9PT0wJiZsPT09MCYmaD09PTApfHwoRj1XeSpvK3F5Kk1hdGguYWJzKEMpLEMrPXYqaCtFKmEtKHoqbCtQKmMpLEM+PUZ8fC1DPj1GKSlyZXR1cm4gQzt3PWEqRSxmPXp0KmEsZD1mLShmLWEpLHA9YS1kLGY9enQqRSx5PWYtKGYtRSksbT1FLXksTT1wKm0tKHctZCp5LXAqeS1kKm0pLEE9YypQLGY9enQqYyxkPWYtKGYtYykscD1jLWQsZj16dCpQLHk9Zi0oZi1QKSxtPVAteSxTPXAqbS0oQS1kKnktcCp5LWQqbSksZz1NLVMsdT1NLWcsRnRbMF09TS0oZyt1KSsodS1TKSxiPXcrZyx1PWItdyx4PXctKGItdSkrKGctdSksZz14LUEsdT14LWcsRnRbMV09eC0oZyt1KSsodS1BKSxfPWIrZyx1PV8tYixGdFsyXT1iLShfLXUpKyhnLXUpLEZ0WzNdPV87Y29uc3QgQj1zYyg0LGRpLDQsRnQscnUpO3c9dipoLGY9enQqdixkPWYtKGYtdikscD12LWQsZj16dCpoLHk9Zi0oZi1oKSxtPWgteSxNPXAqbS0ody1kKnktcCp5LWQqbSksQT16KmwsZj16dCp6LGQ9Zi0oZi16KSxwPXotZCxmPXp0KmwseT1mLShmLWwpLG09bC15LFM9cCptLShBLWQqeS1wKnktZCptKSxnPU0tUyx1PU0tZyxGdFswXT1NLShnK3UpKyh1LVMpLGI9dytnLHU9Yi13LHg9dy0oYi11KSsoZy11KSxnPXgtQSx1PXgtZyxGdFsxXT14LShnK3UpKyh1LUEpLF89YitnLHU9Xy1iLEZ0WzJdPWItKF8tdSkrKGctdSksRnRbM109Xztjb25zdCBJPXNjKEIscnUsNCxGdCxvdSk7dz1hKmgsZj16dCphLGQ9Zi0oZi1hKSxwPWEtZCxmPXp0KmgseT1mLShmLWgpLG09aC15LE09cCptLSh3LWQqeS1wKnktZCptKSxBPWMqbCxmPXp0KmMsZD1mLShmLWMpLHA9Yy1kLGY9enQqbCx5PWYtKGYtbCksbT1sLXksUz1wKm0tKEEtZCp5LXAqeS1kKm0pLGc9TS1TLHU9TS1nLEZ0WzBdPU0tKGcrdSkrKHUtUyksYj13K2csdT1iLXcseD13LShiLXUpKyhnLXUpLGc9eC1BLHU9eC1nLEZ0WzFdPXgtKGcrdSkrKHUtQSksXz1iK2csdT1fLWIsRnRbMl09Yi0oXy11KSsoZy11KSxGdFszXT1fO2NvbnN0IFI9c2MoSSxvdSw0LEZ0LGF1KTtyZXR1cm4gYXVbUi0xXX1mdW5jdGlvbiBVcihpLHQsZSxuLHMscil7Y29uc3Qgbz0odC1yKSooZS1zKSxhPShpLXMpKihuLXIpLGM9by1hLGw9TWF0aC5hYnMobythKTtyZXR1cm4gTWF0aC5hYnMoYyk+PUd5Kmw/YzotSHkoaSx0LGUsbixzLHIsbCl9Y29uc3QgY3U9TWF0aC5wb3coMiwtNTIpLHFyPW5ldyBVaW50MzJBcnJheSg1MTIpO2NsYXNzIG9ze3N0YXRpYyBmcm9tKHQsZT1LeSxuPXRtKXtjb25zdCBzPXQubGVuZ3RoLHI9bmV3IEZsb2F0NjRBcnJheShzKjIpO2ZvcihsZXQgbz0wO288cztvKyspe2NvbnN0IGE9dFtvXTtyWzIqb109ZShhKSxyWzIqbysxXT1uKGEpfXJldHVybiBuZXcgb3Mocil9Y29uc3RydWN0b3IodCl7Y29uc3QgZT10Lmxlbmd0aD4+MTtpZihlPjAmJnR5cGVvZiB0WzBdIT0ibnVtYmVyIil0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIGNvb3JkcyB0byBjb250YWluIG51bWJlcnMuIik7dGhpcy5jb29yZHM9dDtjb25zdCBuPU1hdGgubWF4KDIqZS01LDApO3RoaXMuX3RyaWFuZ2xlcz1uZXcgVWludDMyQXJyYXkobiozKSx0aGlzLl9oYWxmZWRnZXM9bmV3IEludDMyQXJyYXkobiozKSx0aGlzLl9oYXNoU2l6ZT1NYXRoLmNlaWwoTWF0aC5zcXJ0KGUpKSx0aGlzLl9odWxsUHJldj1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbE5leHQ9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2h1bGxUcmk9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2h1bGxIYXNoPW5ldyBJbnQzMkFycmF5KHRoaXMuX2hhc2hTaXplKSx0aGlzLl9pZHM9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2Rpc3RzPW5ldyBGbG9hdDY0QXJyYXkoZSksdGhpcy51cGRhdGUoKX11cGRhdGUoKXtjb25zdHtjb29yZHM6dCxfaHVsbFByZXY6ZSxfaHVsbE5leHQ6bixfaHVsbFRyaTpzLF9odWxsSGFzaDpyfT10aGlzLG89dC5sZW5ndGg+PjE7bGV0IGE9MS8wLGM9MS8wLGw9LTEvMCxoPS0xLzA7Zm9yKGxldCB2PTA7djxvO3YrKyl7Y29uc3QgUD10WzIqdl0sej10WzIqdisxXTtQPGEmJihhPVApLHo8YyYmKGM9eiksUD5sJiYobD1QKSx6PmgmJihoPXopLHRoaXMuX2lkc1t2XT12fWNvbnN0IHU9KGErbCkvMixmPShjK2gpLzI7bGV0IGQscCx5O2ZvcihsZXQgdj0wLFA9MS8wO3Y8bzt2Kyspe2NvbnN0IHo9cmModSxmLHRbMip2XSx0WzIqdisxXSk7ejxQJiYoZD12LFA9eil9Y29uc3QgbT10WzIqZF0sZz10WzIqZCsxXTtmb3IobGV0IHY9MCxQPTEvMDt2PG87disrKXtpZih2PT09ZCljb250aW51ZTtjb25zdCB6PXJjKG0sZyx0WzIqdl0sdFsyKnYrMV0pO3o8UCYmej4wJiYocD12LFA9eil9bGV0IGI9dFsyKnBdLHg9dFsyKnArMV0sdz0xLzA7Zm9yKGxldCB2PTA7djxvO3YrKyl7aWYodj09PWR8fHY9PT1wKWNvbnRpbnVlO2NvbnN0IFA9ankobSxnLGIseCx0WzIqdl0sdFsyKnYrMV0pO1A8dyYmKHk9dix3PVApfWxldCBNPXRbMip5XSxBPXRbMip5KzFdO2lmKHc9PT0xLzApe2ZvcihsZXQgej0wO3o8bzt6KyspdGhpcy5fZGlzdHNbel09dFsyKnpdLXRbMF18fHRbMip6KzFdLXRbMV07cGkodGhpcy5faWRzLHRoaXMuX2Rpc3RzLDAsby0xKTtjb25zdCB2PW5ldyBVaW50MzJBcnJheShvKTtsZXQgUD0wO2ZvcihsZXQgej0wLEU9LTEvMDt6PG87eisrKXtjb25zdCBDPXRoaXMuX2lkc1t6XSxGPXRoaXMuX2Rpc3RzW0NdO0Y+RSYmKHZbUCsrXT1DLEU9Ril9dGhpcy5odWxsPXYuc3ViYXJyYXkoMCxQKSx0aGlzLnRyaWFuZ2xlcz1uZXcgVWludDMyQXJyYXkoMCksdGhpcy5oYWxmZWRnZXM9bmV3IFVpbnQzMkFycmF5KDApO3JldHVybn1pZihVcihtLGcsYix4LE0sQSk8MCl7Y29uc3Qgdj1wLFA9Yix6PXg7cD15LGI9TSx4PUEseT12LE09UCxBPXp9Y29uc3QgUz1ReShtLGcsYix4LE0sQSk7dGhpcy5fY3g9Uy54LHRoaXMuX2N5PVMueTtmb3IobGV0IHY9MDt2PG87disrKXRoaXMuX2Rpc3RzW3ZdPXJjKHRbMip2XSx0WzIqdisxXSxTLngsUy55KTtwaSh0aGlzLl9pZHMsdGhpcy5fZGlzdHMsMCxvLTEpLHRoaXMuX2h1bGxTdGFydD1kO2xldCBfPTM7bltkXT1lW3ldPXAsbltwXT1lW2RdPXksblt5XT1lW3BdPWQsc1tkXT0wLHNbcF09MSxzW3ldPTIsci5maWxsKC0xKSxyW3RoaXMuX2hhc2hLZXkobSxnKV09ZCxyW3RoaXMuX2hhc2hLZXkoYix4KV09cCxyW3RoaXMuX2hhc2hLZXkoTSxBKV09eSx0aGlzLnRyaWFuZ2xlc0xlbj0wLHRoaXMuX2FkZFRyaWFuZ2xlKGQscCx5LC0xLC0xLC0xKTtmb3IobGV0IHY9MCxQLHo7djx0aGlzLl9pZHMubGVuZ3RoO3YrKyl7Y29uc3QgRT10aGlzLl9pZHNbdl0sQz10WzIqRV0sRj10WzIqRSsxXTtpZih2PjAmJk1hdGguYWJzKEMtUCk8PWN1JiZNYXRoLmFicyhGLXopPD1jdXx8KFA9Qyx6PUYsRT09PWR8fEU9PT1wfHxFPT09eSkpY29udGludWU7bGV0IEI9MDtmb3IobGV0IG50PTAseHQ9dGhpcy5faGFzaEtleShDLEYpO250PHRoaXMuX2hhc2hTaXplJiYoQj1yWyh4dCtudCkldGhpcy5faGFzaFNpemVdLCEoQiE9PS0xJiZCIT09bltCXSkpO250KyspO0I9ZVtCXTtsZXQgST1CLFI7Zm9yKDtSPW5bSV0sVXIoQyxGLHRbMipJXSx0WzIqSSsxXSx0WzIqUl0sdFsyKlIrMV0pPj0wOylpZihJPVIsST09PUIpe0k9LTE7YnJlYWt9aWYoST09PS0xKWNvbnRpbnVlO2xldCAkPXRoaXMuX2FkZFRyaWFuZ2xlKEksRSxuW0ldLC0xLC0xLHNbSV0pO3NbRV09dGhpcy5fbGVnYWxpemUoJCsyKSxzW0ldPSQsXysrO2xldCBWPW5bSV07Zm9yKDtSPW5bVl0sVXIoQyxGLHRbMipWXSx0WzIqVisxXSx0WzIqUl0sdFsyKlIrMV0pPDA7KSQ9dGhpcy5fYWRkVHJpYW5nbGUoVixFLFIsc1tFXSwtMSxzW1ZdKSxzW0VdPXRoaXMuX2xlZ2FsaXplKCQrMiksbltWXT1WLF8tLSxWPVI7aWYoST09PUIpZm9yKDtSPWVbSV0sVXIoQyxGLHRbMipSXSx0WzIqUisxXSx0WzIqSV0sdFsyKkkrMV0pPDA7KSQ9dGhpcy5fYWRkVHJpYW5nbGUoUixFLEksLTEsc1tJXSxzW1JdKSx0aGlzLl9sZWdhbGl6ZSgkKzIpLHNbUl09JCxuW0ldPUksXy0tLEk9Ujt0aGlzLl9odWxsU3RhcnQ9ZVtFXT1JLG5bSV09ZVtWXT1FLG5bRV09VixyW3RoaXMuX2hhc2hLZXkoQyxGKV09RSxyW3RoaXMuX2hhc2hLZXkodFsyKkldLHRbMipJKzFdKV09SX10aGlzLmh1bGw9bmV3IFVpbnQzMkFycmF5KF8pO2ZvcihsZXQgdj0wLFA9dGhpcy5faHVsbFN0YXJ0O3Y8Xzt2KyspdGhpcy5odWxsW3ZdPVAsUD1uW1BdO3RoaXMudHJpYW5nbGVzPXRoaXMuX3RyaWFuZ2xlcy5zdWJhcnJheSgwLHRoaXMudHJpYW5nbGVzTGVuKSx0aGlzLmhhbGZlZGdlcz10aGlzLl9oYWxmZWRnZXMuc3ViYXJyYXkoMCx0aGlzLnRyaWFuZ2xlc0xlbil9X2hhc2hLZXkodCxlKXtyZXR1cm4gTWF0aC5mbG9vcihKeSh0LXRoaXMuX2N4LGUtdGhpcy5fY3kpKnRoaXMuX2hhc2hTaXplKSV0aGlzLl9oYXNoU2l6ZX1fbGVnYWxpemUodCl7Y29uc3R7X3RyaWFuZ2xlczplLF9oYWxmZWRnZXM6bixjb29yZHM6c309dGhpcztsZXQgcj0wLG89MDtmb3IoOzspe2NvbnN0IGE9blt0XSxjPXQtdCUzO2lmKG89YysodCsyKSUzLGE9PT0tMSl7aWYocj09PTApYnJlYWs7dD1xclstLXJdO2NvbnRpbnVlfWNvbnN0IGw9YS1hJTMsaD1jKyh0KzEpJTMsdT1sKyhhKzIpJTMsZj1lW29dLGQ9ZVt0XSxwPWVbaF0seT1lW3VdO2lmKFl5KHNbMipmXSxzWzIqZisxXSxzWzIqZF0sc1syKmQrMV0sc1syKnBdLHNbMipwKzFdLHNbMip5XSxzWzIqeSsxXSkpe2VbdF09eSxlW2FdPWY7Y29uc3QgZz1uW3VdO2lmKGc9PT0tMSl7bGV0IHg9dGhpcy5faHVsbFN0YXJ0O2Rve2lmKHRoaXMuX2h1bGxUcmlbeF09PT11KXt0aGlzLl9odWxsVHJpW3hdPXQ7YnJlYWt9eD10aGlzLl9odWxsUHJldlt4XX13aGlsZSh4IT09dGhpcy5faHVsbFN0YXJ0KX10aGlzLl9saW5rKHQsZyksdGhpcy5fbGluayhhLG5bb10pLHRoaXMuX2xpbmsobyx1KTtjb25zdCBiPWwrKGErMSklMztyPHFyLmxlbmd0aCYmKHFyW3IrK109Yil9ZWxzZXtpZihyPT09MClicmVhazt0PXFyWy0tcl19fXJldHVybiBvfV9saW5rKHQsZSl7dGhpcy5faGFsZmVkZ2VzW3RdPWUsZSE9PS0xJiYodGhpcy5faGFsZmVkZ2VzW2VdPXQpfV9hZGRUcmlhbmdsZSh0LGUsbixzLHIsbyl7Y29uc3QgYT10aGlzLnRyaWFuZ2xlc0xlbjtyZXR1cm4gdGhpcy5fdHJpYW5nbGVzW2FdPXQsdGhpcy5fdHJpYW5nbGVzW2ErMV09ZSx0aGlzLl90cmlhbmdsZXNbYSsyXT1uLHRoaXMuX2xpbmsoYSxzKSx0aGlzLl9saW5rKGErMSxyKSx0aGlzLl9saW5rKGErMixvKSx0aGlzLnRyaWFuZ2xlc0xlbis9MyxhfX1mdW5jdGlvbiBKeShpLHQpe2NvbnN0IGU9aS8oTWF0aC5hYnMoaSkrTWF0aC5hYnModCkpO3JldHVybih0PjA/My1lOjErZSkvNH1mdW5jdGlvbiByYyhpLHQsZSxuKXtjb25zdCBzPWktZSxyPXQtbjtyZXR1cm4gcypzK3Iqcn1mdW5jdGlvbiBZeShpLHQsZSxuLHMscixvLGEpe2NvbnN0IGM9aS1vLGw9dC1hLGg9ZS1vLHU9bi1hLGY9cy1vLGQ9ci1hLHA9YypjK2wqbCx5PWgqaCt1KnUsbT1mKmYrZCpkO3JldHVybiBjKih1Km0teSpkKS1sKihoKm0teSpmKStwKihoKmQtdSpmKTwwfWZ1bmN0aW9uIGp5KGksdCxlLG4scyxyKXtjb25zdCBvPWUtaSxhPW4tdCxjPXMtaSxsPXItdCxoPW8qbythKmEsdT1jKmMrbCpsLGY9LjUvKG8qbC1hKmMpLGQ9KGwqaC1hKnUpKmYscD0obyp1LWMqaCkqZjtyZXR1cm4gZCpkK3AqcH1mdW5jdGlvbiBReShpLHQsZSxuLHMscil7Y29uc3Qgbz1lLWksYT1uLXQsYz1zLWksbD1yLXQsaD1vKm8rYSphLHU9YypjK2wqbCxmPS41LyhvKmwtYSpjKSxkPWkrKGwqaC1hKnUpKmYscD10KyhvKnUtYypoKSpmO3JldHVybnt4OmQseTpwfX1mdW5jdGlvbiBwaShpLHQsZSxuKXtpZihuLWU8PTIwKWZvcihsZXQgcz1lKzE7czw9bjtzKyspe2NvbnN0IHI9aVtzXSxvPXRbcl07bGV0IGE9cy0xO2Zvcig7YT49ZSYmdFtpW2FdXT5vOylpW2ErMV09aVthLS1dO2lbYSsxXT1yfWVsc2V7Y29uc3Qgcz1lK24+PjE7bGV0IHI9ZSsxLG89bjthcyhpLHMsciksdFtpW2VdXT50W2lbbl1dJiZhcyhpLGUsbiksdFtpW3JdXT50W2lbbl1dJiZhcyhpLHIsbiksdFtpW2VdXT50W2lbcl1dJiZhcyhpLGUscik7Y29uc3QgYT1pW3JdLGM9dFthXTtmb3IoOzspe2RvIHIrKzt3aGlsZSh0W2lbcl1dPGMpO2RvIG8tLTt3aGlsZSh0W2lbb11dPmMpO2lmKG88cilicmVhazthcyhpLHIsbyl9aVtlKzFdPWlbb10saVtvXT1hLG4tcisxPj1vLWU/KHBpKGksdCxyLG4pLHBpKGksdCxlLG8tMSkpOihwaShpLHQsZSxvLTEpLHBpKGksdCxyLG4pKX19ZnVuY3Rpb24gYXMoaSx0LGUpe2NvbnN0IG49aVt0XTtpW3RdPWlbZV0saVtlXT1ufWZ1bmN0aW9uIEt5KGkpe3JldHVybiBpWzBdfWZ1bmN0aW9uIHRtKGkpe3JldHVybiBpWzFdfWZ1bmN0aW9uIGVtKGksdCl7dmFyIGU9MCxuPTAscz0wLHI9MCxvPTAsYT0wLGM9MCxsPTAsaD1udWxsLHU9bnVsbCxmPWlbMF0sZD1pWzFdLHA9dC5sZW5ndGg7Zm9yKGU7ZTxwO2UrKyl7bj0wO3ZhciB5PXRbZV0ubGVuZ3RoLTEsbT10W2VdO2lmKGg9bVswXSxoWzBdIT09bVt5XVswXSYmaFsxXSE9PW1beV1bMV0pdGhyb3cgbmV3IEVycm9yKCJGaXJzdCBhbmQgbGFzdCBjb29yZGluYXRlcyBpbiBhIHJpbmcgbXVzdCBiZSB0aGUgc2FtZSIpO2ZvcihvPWhbMF0tZixhPWhbMV0tZCxuO248eTtuKyspe2lmKHU9bVtuKzFdLGw9dVsxXS1kLGE8MCYmbDwwfHxhPjAmJmw+MCl7aD11LGE9bCxvPWhbMF0tZjtjb250aW51ZX1pZihjPXVbMF0taVswXSxsPjAmJmE8PTApe2lmKHI9bypsLWMqYSxyPjApcz1zKzE7ZWxzZSBpZihyPT09MClyZXR1cm4gMH1lbHNlIGlmKGE+MCYmbDw9MCl7aWYocj1vKmwtYyphLHI8MClzPXMrMTtlbHNlIGlmKHI9PT0wKXJldHVybiAwfWVsc2UgaWYobD09PTAmJmE8MCl7aWYocj1vKmwtYyphLHI9PT0wKXJldHVybiAwfWVsc2UgaWYoYT09PTAmJmw8MCl7aWYocj1vKmwtYyphLHI9PT0wKXJldHVybiAwfWVsc2UgaWYoYT09PTAmJmw9PT0wKXtpZihjPD0wJiZvPj0wKXJldHVybiAwO2lmKG88PTAmJmM+PTApcmV0dXJuIDB9aD11LGE9bCxvPWN9fXJldHVybiBzJTIhPT0wfWZ1bmN0aW9uIG5tKGksdCxlPXt9KXtpZighaSl0aHJvdyBuZXcgRXJyb3IoInBvaW50IGlzIHJlcXVpcmVkIik7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJwb2x5Z29uIGlzIHJlcXVpcmVkIik7Y29uc3Qgbj1PeShpKSxzPSR5KHQpLHI9cy50eXBlLG89dC5iYm94O2xldCBhPXMuY29vcmRpbmF0ZXM7aWYobyYmaW0obixvKT09PSExKXJldHVybiExO3I9PT0iUG9seWdvbiImJihhPVthXSk7bGV0IGM9ITE7Zm9yKHZhciBsPTA7bDxhLmxlbmd0aDsrK2wpe2NvbnN0IGg9ZW0obixhW2xdKTtpZihoPT09MClyZXR1cm4hZS5pZ25vcmVCb3VuZGFyeTtoJiYoYz0hMCl9cmV0dXJuIGN9ZnVuY3Rpb24gaW0oaSx0KXtyZXR1cm4gdFswXTw9aVswXSYmdFsxXTw9aVsxXSYmdFsyXT49aVswXSYmdFszXT49aVsxXX12YXIgc209bm07Y29uc3QgbHU9MWUtNjtjbGFzcyBQbntjb25zdHJ1Y3Rvcigpe3RoaXMuX3gwPXRoaXMuX3kwPXRoaXMuX3gxPXRoaXMuX3kxPW51bGwsdGhpcy5fPSIifW1vdmVUbyh0LGUpe3RoaXMuXys9YE0ke3RoaXMuX3gwPXRoaXMuX3gxPSt0fSwke3RoaXMuX3kwPXRoaXMuX3kxPStlfWB9Y2xvc2VQYXRoKCl7dGhpcy5feDEhPT1udWxsJiYodGhpcy5feDE9dGhpcy5feDAsdGhpcy5feTE9dGhpcy5feTAsdGhpcy5fKz0iWiIpfWxpbmVUbyh0LGUpe3RoaXMuXys9YEwke3RoaXMuX3gxPSt0fSwke3RoaXMuX3kxPStlfWB9YXJjKHQsZSxuKXt0PSt0LGU9K2Usbj0rbjtjb25zdCBzPXQrbixyPWU7aWYobjwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzIik7dGhpcy5feDE9PT1udWxsP3RoaXMuXys9YE0ke3N9LCR7cn1gOihNYXRoLmFicyh0aGlzLl94MS1zKT5sdXx8TWF0aC5hYnModGhpcy5feTEtcik+bHUpJiYodGhpcy5fKz0iTCIrcysiLCIrciksbiYmKHRoaXMuXys9YEEke259LCR7bn0sMCwxLDEsJHt0LW59LCR7ZX1BJHtufSwke259LDAsMSwxLCR7dGhpcy5feDE9c30sJHt0aGlzLl95MT1yfWApfXJlY3QodCxlLG4scyl7dGhpcy5fKz1gTSR7dGhpcy5feDA9dGhpcy5feDE9K3R9LCR7dGhpcy5feTA9dGhpcy5feTE9K2V9aCR7K259diR7K3N9aCR7LW59WmB9dmFsdWUoKXtyZXR1cm4gdGhpcy5ffHxudWxsfX1jbGFzcyBvY3tjb25zdHJ1Y3Rvcigpe3RoaXMuXz1bXX1tb3ZlVG8odCxlKXt0aGlzLl8ucHVzaChbdCxlXSl9Y2xvc2VQYXRoKCl7dGhpcy5fLnB1c2godGhpcy5fWzBdLnNsaWNlKCkpfWxpbmVUbyh0LGUpe3RoaXMuXy5wdXNoKFt0LGVdKX12YWx1ZSgpe3JldHVybiB0aGlzLl8ubGVuZ3RoP3RoaXMuXzpudWxsfX1jbGFzcyBybXtjb25zdHJ1Y3Rvcih0LFtlLG4scyxyXT1bMCwwLDk2MCw1MDBdKXtpZighKChzPStzKT49KGU9K2UpKXx8ISgocj0rcik+PShuPStuKSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGJvdW5kcyIpO3RoaXMuZGVsYXVuYXk9dCx0aGlzLl9jaXJjdW1jZW50ZXJzPW5ldyBGbG9hdDY0QXJyYXkodC5wb2ludHMubGVuZ3RoKjIpLHRoaXMudmVjdG9ycz1uZXcgRmxvYXQ2NEFycmF5KHQucG9pbnRzLmxlbmd0aCoyKSx0aGlzLnhtYXg9cyx0aGlzLnhtaW49ZSx0aGlzLnltYXg9cix0aGlzLnltaW49bix0aGlzLl9pbml0KCl9dXBkYXRlKCl7cmV0dXJuIHRoaXMuZGVsYXVuYXkudXBkYXRlKCksdGhpcy5faW5pdCgpLHRoaXN9X2luaXQoKXtjb25zdHtkZWxhdW5heTp7cG9pbnRzOnQsaHVsbDplLHRyaWFuZ2xlczpufSx2ZWN0b3JzOnN9PXRoaXMscj10aGlzLmNpcmN1bWNlbnRlcnM9dGhpcy5fY2lyY3VtY2VudGVycy5zdWJhcnJheSgwLG4ubGVuZ3RoLzMqMik7Zm9yKGxldCBkPTAscD0wLHk9bi5sZW5ndGgsbSxnO2Q8eTtkKz0zLHArPTIpe2NvbnN0IGI9bltkXSoyLHg9bltkKzFdKjIsdz1uW2QrMl0qMixNPXRbYl0sQT10W2IrMV0sUz10W3hdLF89dFt4KzFdLHY9dFt3XSxQPXRbdysxXSx6PVMtTSxFPV8tQSxDPXYtTSxGPVAtQSxCPSh6KkYtRSpDKSoyO2lmKE1hdGguYWJzKEIpPDFlLTkpe2xldCBJPTFlOTtjb25zdCBSPW5bMF0qMjtJKj1NYXRoLnNpZ24oKHRbUl0tTSkqRi0odFtSKzFdLUEpKkMpLG09KE0rdikvMi1JKkYsZz0oQStQKS8yK0kqQ31lbHNle2NvbnN0IEk9MS9CLFI9eip6K0UqRSwkPUMqQytGKkY7bT1NKyhGKlItRSokKSpJLGc9QSsoeiokLUMqUikqSX1yW3BdPW0scltwKzFdPWd9bGV0IG89ZVtlLmxlbmd0aC0xXSxhLGM9byo0LGwsaD10WzIqb10sdSxmPXRbMipvKzFdO3MuZmlsbCgwKTtmb3IobGV0IGQ9MDtkPGUubGVuZ3RoOysrZClvPWVbZF0sYT1jLGw9aCx1PWYsYz1vKjQsaD10WzIqb10sZj10WzIqbysxXSxzW2ErMl09c1tjXT11LWYsc1thKzNdPXNbYysxXT1oLWx9cmVuZGVyKHQpe2NvbnN0IGU9dD09bnVsbD90PW5ldyBQbjp2b2lkIDAse2RlbGF1bmF5OntoYWxmZWRnZXM6bixpbmVkZ2VzOnMsaHVsbDpyfSxjaXJjdW1jZW50ZXJzOm8sdmVjdG9yczphfT10aGlzO2lmKHIubGVuZ3RoPD0xKXJldHVybiBudWxsO2ZvcihsZXQgaD0wLHU9bi5sZW5ndGg7aDx1OysraCl7Y29uc3QgZj1uW2hdO2lmKGY8aCljb250aW51ZTtjb25zdCBkPU1hdGguZmxvb3IoaC8zKSoyLHA9TWF0aC5mbG9vcihmLzMpKjIseT1vW2RdLG09b1tkKzFdLGc9b1twXSxiPW9bcCsxXTt0aGlzLl9yZW5kZXJTZWdtZW50KHksbSxnLGIsdCl9bGV0IGMsbD1yW3IubGVuZ3RoLTFdO2ZvcihsZXQgaD0wO2g8ci5sZW5ndGg7KytoKXtjPWwsbD1yW2hdO2NvbnN0IHU9TWF0aC5mbG9vcihzW2xdLzMpKjIsZj1vW3VdLGQ9b1t1KzFdLHA9Yyo0LHk9dGhpcy5fcHJvamVjdChmLGQsYVtwKzJdLGFbcCszXSk7eSYmdGhpcy5fcmVuZGVyU2VnbWVudChmLGQseVswXSx5WzFdLHQpfXJldHVybiBlJiZlLnZhbHVlKCl9cmVuZGVyQm91bmRzKHQpe2NvbnN0IGU9dD09bnVsbD90PW5ldyBQbjp2b2lkIDA7cmV0dXJuIHQucmVjdCh0aGlzLnhtaW4sdGhpcy55bWluLHRoaXMueG1heC10aGlzLnhtaW4sdGhpcy55bWF4LXRoaXMueW1pbiksZSYmZS52YWx1ZSgpfXJlbmRlckNlbGwodCxlKXtjb25zdCBuPWU9PW51bGw/ZT1uZXcgUG46dm9pZCAwLHM9dGhpcy5fY2xpcCh0KTtpZihzPT09bnVsbHx8IXMubGVuZ3RoKXJldHVybjtlLm1vdmVUbyhzWzBdLHNbMV0pO2xldCByPXMubGVuZ3RoO2Zvcig7c1swXT09PXNbci0yXSYmc1sxXT09PXNbci0xXSYmcj4xOylyLT0yO2ZvcihsZXQgbz0yO288cjtvKz0yKShzW29dIT09c1tvLTJdfHxzW28rMV0hPT1zW28tMV0pJiZlLmxpbmVUbyhzW29dLHNbbysxXSk7cmV0dXJuIGUuY2xvc2VQYXRoKCksbiYmbi52YWx1ZSgpfSpjZWxsUG9seWdvbnMoKXtjb25zdHtkZWxhdW5heTp7cG9pbnRzOnR9fT10aGlzO2ZvcihsZXQgZT0wLG49dC5sZW5ndGgvMjtlPG47KytlKXtjb25zdCBzPXRoaXMuY2VsbFBvbHlnb24oZSk7cyYmKHMuaW5kZXg9ZSx5aWVsZCBzKX19Y2VsbFBvbHlnb24odCl7Y29uc3QgZT1uZXcgb2M7cmV0dXJuIHRoaXMucmVuZGVyQ2VsbCh0LGUpLGUudmFsdWUoKX1fcmVuZGVyU2VnbWVudCh0LGUsbixzLHIpe2xldCBvO2NvbnN0IGE9dGhpcy5fcmVnaW9uY29kZSh0LGUpLGM9dGhpcy5fcmVnaW9uY29kZShuLHMpO2E9PT0wJiZjPT09MD8oci5tb3ZlVG8odCxlKSxyLmxpbmVUbyhuLHMpKToobz10aGlzLl9jbGlwU2VnbWVudCh0LGUsbixzLGEsYykpJiYoci5tb3ZlVG8ob1swXSxvWzFdKSxyLmxpbmVUbyhvWzJdLG9bM10pKX1jb250YWlucyh0LGUsbil7cmV0dXJuIGU9K2UsZSE9PWV8fChuPStuLG4hPT1uKT8hMTp0aGlzLmRlbGF1bmF5Ll9zdGVwKHQsZSxuKT09PXR9Km5laWdoYm9ycyh0KXtjb25zdCBlPXRoaXMuX2NsaXAodCk7aWYoZSlmb3IoY29uc3QgbiBvZiB0aGlzLmRlbGF1bmF5Lm5laWdoYm9ycyh0KSl7Y29uc3Qgcz10aGlzLl9jbGlwKG4pO2lmKHMpe3Q6Zm9yKGxldCByPTAsbz1lLmxlbmd0aDtyPG87cis9Milmb3IobGV0IGE9MCxjPXMubGVuZ3RoO2E8YzthKz0yKWlmKGVbcl09PXNbYV0mJmVbcisxXT09c1thKzFdJiZlWyhyKzIpJW9dPT1zWyhhK2MtMiklY10mJmVbKHIrMyklb109PXNbKGErYy0xKSVjXSl7eWllbGQgbjticmVhayB0fX19fV9jZWxsKHQpe2NvbnN0e2NpcmN1bWNlbnRlcnM6ZSxkZWxhdW5heTp7aW5lZGdlczpuLGhhbGZlZGdlczpzLHRyaWFuZ2xlczpyfX09dGhpcyxvPW5bdF07aWYobz09PS0xKXJldHVybiBudWxsO2NvbnN0IGE9W107bGV0IGM9bztkb3tjb25zdCBsPU1hdGguZmxvb3IoYy8zKTtpZihhLnB1c2goZVtsKjJdLGVbbCoyKzFdKSxjPWMlMz09PTI/Yy0yOmMrMSxyW2NdIT09dClicmVhaztjPXNbY119d2hpbGUoYyE9PW8mJmMhPT0tMSk7cmV0dXJuIGF9X2NsaXAodCl7aWYodD09PTAmJnRoaXMuZGVsYXVuYXkuaHVsbC5sZW5ndGg9PT0xKXJldHVyblt0aGlzLnhtYXgsdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWluXTtjb25zdCBlPXRoaXMuX2NlbGwodCk7aWYoZT09PW51bGwpcmV0dXJuIG51bGw7Y29uc3R7dmVjdG9yczpufT10aGlzLHM9dCo0O3JldHVybiBuW3NdfHxuW3MrMV0/dGhpcy5fY2xpcEluZmluaXRlKHQsZSxuW3NdLG5bcysxXSxuW3MrMl0sbltzKzNdKTp0aGlzLl9jbGlwRmluaXRlKHQsZSl9X2NsaXBGaW5pdGUodCxlKXtjb25zdCBuPWUubGVuZ3RoO2xldCBzPW51bGwscixvLGE9ZVtuLTJdLGM9ZVtuLTFdLGwsaD10aGlzLl9yZWdpb25jb2RlKGEsYyksdSxmPTA7Zm9yKGxldCBkPTA7ZDxuO2QrPTIpaWYocj1hLG89YyxhPWVbZF0sYz1lW2QrMV0sbD1oLGg9dGhpcy5fcmVnaW9uY29kZShhLGMpLGw9PT0wJiZoPT09MCl1PWYsZj0wLHM/cy5wdXNoKGEsYyk6cz1bYSxjXTtlbHNle2xldCBwLHksbSxnLGI7aWYobD09PTApe2lmKChwPXRoaXMuX2NsaXBTZWdtZW50KHIsbyxhLGMsbCxoKSk9PT1udWxsKWNvbnRpbnVlO1t5LG0sZyxiXT1wfWVsc2V7aWYoKHA9dGhpcy5fY2xpcFNlZ21lbnQoYSxjLHIsbyxoLGwpKT09PW51bGwpY29udGludWU7W2csYix5LG1dPXAsdT1mLGY9dGhpcy5fZWRnZWNvZGUoeSxtKSx1JiZmJiZ0aGlzLl9lZGdlKHQsdSxmLHMscy5sZW5ndGgpLHM/cy5wdXNoKHksbSk6cz1beSxtXX11PWYsZj10aGlzLl9lZGdlY29kZShnLGIpLHUmJmYmJnRoaXMuX2VkZ2UodCx1LGYscyxzLmxlbmd0aCkscz9zLnB1c2goZyxiKTpzPVtnLGJdfWlmKHMpdT1mLGY9dGhpcy5fZWRnZWNvZGUoc1swXSxzWzFdKSx1JiZmJiZ0aGlzLl9lZGdlKHQsdSxmLHMscy5sZW5ndGgpO2Vsc2UgaWYodGhpcy5jb250YWlucyh0LCh0aGlzLnhtaW4rdGhpcy54bWF4KS8yLCh0aGlzLnltaW4rdGhpcy55bWF4KS8yKSlyZXR1cm5bdGhpcy54bWF4LHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1pbl07cmV0dXJuIHN9X2NsaXBTZWdtZW50KHQsZSxuLHMscixvKXtmb3IoOzspe2lmKHI9PT0wJiZvPT09MClyZXR1cm5bdCxlLG4sc107aWYociZvKXJldHVybiBudWxsO2xldCBhLGMsbD1yfHxvO2wmOD8oYT10KyhuLXQpKih0aGlzLnltYXgtZSkvKHMtZSksYz10aGlzLnltYXgpOmwmND8oYT10KyhuLXQpKih0aGlzLnltaW4tZSkvKHMtZSksYz10aGlzLnltaW4pOmwmMj8oYz1lKyhzLWUpKih0aGlzLnhtYXgtdCkvKG4tdCksYT10aGlzLnhtYXgpOihjPWUrKHMtZSkqKHRoaXMueG1pbi10KS8obi10KSxhPXRoaXMueG1pbikscj8odD1hLGU9YyxyPXRoaXMuX3JlZ2lvbmNvZGUodCxlKSk6KG49YSxzPWMsbz10aGlzLl9yZWdpb25jb2RlKG4scykpfX1fY2xpcEluZmluaXRlKHQsZSxuLHMscixvKXtsZXQgYT1BcnJheS5mcm9tKGUpLGM7aWYoKGM9dGhpcy5fcHJvamVjdChhWzBdLGFbMV0sbixzKSkmJmEudW5zaGlmdChjWzBdLGNbMV0pLChjPXRoaXMuX3Byb2plY3QoYVthLmxlbmd0aC0yXSxhW2EubGVuZ3RoLTFdLHIsbykpJiZhLnB1c2goY1swXSxjWzFdKSxhPXRoaXMuX2NsaXBGaW5pdGUodCxhKSlmb3IobGV0IGw9MCxoPWEubGVuZ3RoLHUsZj10aGlzLl9lZGdlY29kZShhW2gtMl0sYVtoLTFdKTtsPGg7bCs9Mil1PWYsZj10aGlzLl9lZGdlY29kZShhW2xdLGFbbCsxXSksdSYmZiYmKGw9dGhpcy5fZWRnZSh0LHUsZixhLGwpLGg9YS5sZW5ndGgpO2Vsc2UgdGhpcy5jb250YWlucyh0LCh0aGlzLnhtaW4rdGhpcy54bWF4KS8yLCh0aGlzLnltaW4rdGhpcy55bWF4KS8yKSYmKGE9W3RoaXMueG1pbix0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltYXhdKTtyZXR1cm4gYX1fZWRnZSh0LGUsbixzLHIpe2Zvcig7ZSE9PW47KXtsZXQgbyxhO3N3aXRjaChlKXtjYXNlIDU6ZT00O2NvbnRpbnVlO2Nhc2UgNDplPTYsbz10aGlzLnhtYXgsYT10aGlzLnltaW47YnJlYWs7Y2FzZSA2OmU9Mjtjb250aW51ZTtjYXNlIDI6ZT0xMCxvPXRoaXMueG1heCxhPXRoaXMueW1heDticmVhaztjYXNlIDEwOmU9ODtjb250aW51ZTtjYXNlIDg6ZT05LG89dGhpcy54bWluLGE9dGhpcy55bWF4O2JyZWFrO2Nhc2UgOTplPTE7Y29udGludWU7Y2FzZSAxOmU9NSxvPXRoaXMueG1pbixhPXRoaXMueW1pbjticmVha30oc1tyXSE9PW98fHNbcisxXSE9PWEpJiZ0aGlzLmNvbnRhaW5zKHQsbyxhKSYmKHMuc3BsaWNlKHIsMCxvLGEpLHIrPTIpfWlmKHMubGVuZ3RoPjQpZm9yKGxldCBvPTA7bzxzLmxlbmd0aDtvKz0yKXtjb25zdCBhPShvKzIpJXMubGVuZ3RoLGM9KG8rNCklcy5sZW5ndGg7KHNbb109PT1zW2FdJiZzW2FdPT09c1tjXXx8c1tvKzFdPT09c1thKzFdJiZzW2ErMV09PT1zW2MrMV0pJiYocy5zcGxpY2UoYSwyKSxvLT0yKX1yZXR1cm4gcn1fcHJvamVjdCh0LGUsbixzKXtsZXQgcj0xLzAsbyxhLGM7aWYoczwwKXtpZihlPD10aGlzLnltaW4pcmV0dXJuIG51bGw7KG89KHRoaXMueW1pbi1lKS9zKTxyJiYoYz10aGlzLnltaW4sYT10KyhyPW8pKm4pfWVsc2UgaWYocz4wKXtpZihlPj10aGlzLnltYXgpcmV0dXJuIG51bGw7KG89KHRoaXMueW1heC1lKS9zKTxyJiYoYz10aGlzLnltYXgsYT10KyhyPW8pKm4pfWlmKG4+MCl7aWYodD49dGhpcy54bWF4KXJldHVybiBudWxsOyhvPSh0aGlzLnhtYXgtdCkvbik8ciYmKGE9dGhpcy54bWF4LGM9ZSsocj1vKSpzKX1lbHNlIGlmKG48MCl7aWYodDw9dGhpcy54bWluKXJldHVybiBudWxsOyhvPSh0aGlzLnhtaW4tdCkvbik8ciYmKGE9dGhpcy54bWluLGM9ZSsocj1vKSpzKX1yZXR1cm5bYSxjXX1fZWRnZWNvZGUodCxlKXtyZXR1cm4odD09PXRoaXMueG1pbj8xOnQ9PT10aGlzLnhtYXg/MjowKXwoZT09PXRoaXMueW1pbj80OmU9PT10aGlzLnltYXg/ODowKX1fcmVnaW9uY29kZSh0LGUpe3JldHVybih0PHRoaXMueG1pbj8xOnQ+dGhpcy54bWF4PzI6MCl8KGU8dGhpcy55bWluPzQ6ZT50aGlzLnltYXg/ODowKX19Y29uc3Qgb209MipNYXRoLlBJLHlpPU1hdGgucG93O2Z1bmN0aW9uIGFtKGkpe3JldHVybiBpWzBdfWZ1bmN0aW9uIGNtKGkpe3JldHVybiBpWzFdfWZ1bmN0aW9uIGxtKGkpe2NvbnN0e3RyaWFuZ2xlczp0LGNvb3JkczplfT1pO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bis9Myl7Y29uc3Qgcz0yKnRbbl0scj0yKnRbbisxXSxvPTIqdFtuKzJdO2lmKChlW29dLWVbc10pKihlW3IrMV0tZVtzKzFdKS0oZVtyXS1lW3NdKSooZVtvKzFdLWVbcysxXSk+MWUtMTApcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gaG0oaSx0LGUpe3JldHVybltpK01hdGguc2luKGkrdCkqZSx0K01hdGguY29zKGktdCkqZV19Y2xhc3MgYWN7c3RhdGljIGZyb20odCxlPWFtLG49Y20scyl7cmV0dXJuIG5ldyBhYygibGVuZ3RoImluIHQ/dW0odCxlLG4scyk6RmxvYXQ2NEFycmF5LmZyb20oZm0odCxlLG4scykpKX1jb25zdHJ1Y3Rvcih0KXt0aGlzLl9kZWxhdW5hdG9yPW5ldyBvcyh0KSx0aGlzLmluZWRnZXM9bmV3IEludDMyQXJyYXkodC5sZW5ndGgvMiksdGhpcy5faHVsbEluZGV4PW5ldyBJbnQzMkFycmF5KHQubGVuZ3RoLzIpLHRoaXMucG9pbnRzPXRoaXMuX2RlbGF1bmF0b3IuY29vcmRzLHRoaXMuX2luaXQoKX11cGRhdGUoKXtyZXR1cm4gdGhpcy5fZGVsYXVuYXRvci51cGRhdGUoKSx0aGlzLl9pbml0KCksdGhpc31faW5pdCgpe2NvbnN0IHQ9dGhpcy5fZGVsYXVuYXRvcixlPXRoaXMucG9pbnRzO2lmKHQuaHVsbCYmdC5odWxsLmxlbmd0aD4yJiZsbSh0KSl7dGhpcy5jb2xsaW5lYXI9SW50MzJBcnJheS5mcm9tKHtsZW5ndGg6ZS5sZW5ndGgvMn0sKGYsZCk9PmQpLnNvcnQoKGYsZCk9PmVbMipmXS1lWzIqZF18fGVbMipmKzFdLWVbMipkKzFdKTtjb25zdCBjPXRoaXMuY29sbGluZWFyWzBdLGw9dGhpcy5jb2xsaW5lYXJbdGhpcy5jb2xsaW5lYXIubGVuZ3RoLTFdLGg9W2VbMipjXSxlWzIqYysxXSxlWzIqbF0sZVsyKmwrMV1dLHU9MWUtOCpNYXRoLmh5cG90KGhbM10taFsxXSxoWzJdLWhbMF0pO2ZvcihsZXQgZj0wLGQ9ZS5sZW5ndGgvMjtmPGQ7KytmKXtjb25zdCBwPWhtKGVbMipmXSxlWzIqZisxXSx1KTtlWzIqZl09cFswXSxlWzIqZisxXT1wWzFdfXRoaXMuX2RlbGF1bmF0b3I9bmV3IG9zKGUpfWVsc2UgZGVsZXRlIHRoaXMuY29sbGluZWFyO2NvbnN0IG49dGhpcy5oYWxmZWRnZXM9dGhpcy5fZGVsYXVuYXRvci5oYWxmZWRnZXMscz10aGlzLmh1bGw9dGhpcy5fZGVsYXVuYXRvci5odWxsLHI9dGhpcy50cmlhbmdsZXM9dGhpcy5fZGVsYXVuYXRvci50cmlhbmdsZXMsbz10aGlzLmluZWRnZXMuZmlsbCgtMSksYT10aGlzLl9odWxsSW5kZXguZmlsbCgtMSk7Zm9yKGxldCBjPTAsbD1uLmxlbmd0aDtjPGw7KytjKXtjb25zdCBoPXJbYyUzPT09Mj9jLTI6YysxXTsobltjXT09PS0xfHxvW2hdPT09LTEpJiYob1toXT1jKX1mb3IobGV0IGM9MCxsPXMubGVuZ3RoO2M8bDsrK2MpYVtzW2NdXT1jO3MubGVuZ3RoPD0yJiZzLmxlbmd0aD4wJiYodGhpcy50cmlhbmdsZXM9bmV3IEludDMyQXJyYXkoMykuZmlsbCgtMSksdGhpcy5oYWxmZWRnZXM9bmV3IEludDMyQXJyYXkoMykuZmlsbCgtMSksdGhpcy50cmlhbmdsZXNbMF09c1swXSxvW3NbMF1dPTEscy5sZW5ndGg9PT0yJiYob1tzWzFdXT0wLHRoaXMudHJpYW5nbGVzWzFdPXNbMV0sdGhpcy50cmlhbmdsZXNbMl09c1sxXSkpfXZvcm9ub2kodCl7cmV0dXJuIG5ldyBybSh0aGlzLHQpfSpuZWlnaGJvcnModCl7Y29uc3R7aW5lZGdlczplLGh1bGw6bixfaHVsbEluZGV4OnMsaGFsZmVkZ2VzOnIsdHJpYW5nbGVzOm8sY29sbGluZWFyOmF9PXRoaXM7aWYoYSl7Y29uc3QgdT1hLmluZGV4T2YodCk7dT4wJiYoeWllbGQgYVt1LTFdKSx1PGEubGVuZ3RoLTEmJih5aWVsZCBhW3UrMV0pO3JldHVybn1jb25zdCBjPWVbdF07aWYoYz09PS0xKXJldHVybjtsZXQgbD1jLGg9LTE7ZG97aWYoeWllbGQgaD1vW2xdLGw9bCUzPT09Mj9sLTI6bCsxLG9bbF0hPT10KXJldHVybjtpZihsPXJbbF0sbD09PS0xKXtjb25zdCB1PW5bKHNbdF0rMSklbi5sZW5ndGhdO3UhPT1oJiYoeWllbGQgdSk7cmV0dXJufX13aGlsZShsIT09Yyl9ZmluZCh0LGUsbj0wKXtpZih0PSt0LHQhPT10fHwoZT0rZSxlIT09ZSkpcmV0dXJuLTE7Y29uc3Qgcz1uO2xldCByO2Zvcig7KHI9dGhpcy5fc3RlcChuLHQsZSkpPj0wJiZyIT09biYmciE9PXM7KW49cjtyZXR1cm4gcn1fc3RlcCh0LGUsbil7Y29uc3R7aW5lZGdlczpzLGh1bGw6cixfaHVsbEluZGV4Om8saGFsZmVkZ2VzOmEsdHJpYW5nbGVzOmMscG9pbnRzOmx9PXRoaXM7aWYoc1t0XT09PS0xfHwhbC5sZW5ndGgpcmV0dXJuKHQrMSklKGwubGVuZ3RoPj4xKTtsZXQgaD10LHU9eWkoZS1sW3QqMl0sMikreWkobi1sW3QqMisxXSwyKTtjb25zdCBmPXNbdF07bGV0IGQ9Zjtkb3tsZXQgcD1jW2RdO2NvbnN0IHk9eWkoZS1sW3AqMl0sMikreWkobi1sW3AqMisxXSwyKTtpZih5PHUmJih1PXksaD1wKSxkPWQlMz09PTI/ZC0yOmQrMSxjW2RdIT09dClicmVhaztpZihkPWFbZF0sZD09PS0xKXtpZihkPXJbKG9bdF0rMSklci5sZW5ndGhdLGQhPT1wJiZ5aShlLWxbZCoyXSwyKSt5aShuLWxbZCoyKzFdLDIpPHUpcmV0dXJuIGQ7YnJlYWt9fXdoaWxlKGQhPT1mKTtyZXR1cm4gaH1yZW5kZXIodCl7Y29uc3QgZT10PT1udWxsP3Q9bmV3IFBuOnZvaWQgMCx7cG9pbnRzOm4saGFsZmVkZ2VzOnMsdHJpYW5nbGVzOnJ9PXRoaXM7Zm9yKGxldCBvPTAsYT1zLmxlbmd0aDtvPGE7KytvKXtjb25zdCBjPXNbb107aWYoYzxvKWNvbnRpbnVlO2NvbnN0IGw9cltvXSoyLGg9cltjXSoyO3QubW92ZVRvKG5bbF0sbltsKzFdKSx0LmxpbmVUbyhuW2hdLG5baCsxXSl9cmV0dXJuIHRoaXMucmVuZGVySHVsbCh0KSxlJiZlLnZhbHVlKCl9cmVuZGVyUG9pbnRzKHQsZSl7ZT09PXZvaWQgMCYmKCF0fHx0eXBlb2YgdC5tb3ZlVG8hPSJmdW5jdGlvbiIpJiYoZT10LHQ9bnVsbCksZT1lPT1udWxsPzI6K2U7Y29uc3Qgbj10PT1udWxsP3Q9bmV3IFBuOnZvaWQgMCx7cG9pbnRzOnN9PXRoaXM7Zm9yKGxldCByPTAsbz1zLmxlbmd0aDtyPG87cis9Mil7Y29uc3QgYT1zW3JdLGM9c1tyKzFdO3QubW92ZVRvKGErZSxjKSx0LmFyYyhhLGMsZSwwLG9tKX1yZXR1cm4gbiYmbi52YWx1ZSgpfXJlbmRlckh1bGwodCl7Y29uc3QgZT10PT1udWxsP3Q9bmV3IFBuOnZvaWQgMCx7aHVsbDpuLHBvaW50czpzfT10aGlzLHI9blswXSoyLG89bi5sZW5ndGg7dC5tb3ZlVG8oc1tyXSxzW3IrMV0pO2ZvcihsZXQgYT0xO2E8bzsrK2Epe2NvbnN0IGM9MipuW2FdO3QubGluZVRvKHNbY10sc1tjKzFdKX1yZXR1cm4gdC5jbG9zZVBhdGgoKSxlJiZlLnZhbHVlKCl9aHVsbFBvbHlnb24oKXtjb25zdCB0PW5ldyBvYztyZXR1cm4gdGhpcy5yZW5kZXJIdWxsKHQpLHQudmFsdWUoKX1yZW5kZXJUcmlhbmdsZSh0LGUpe2NvbnN0IG49ZT09bnVsbD9lPW5ldyBQbjp2b2lkIDAse3BvaW50czpzLHRyaWFuZ2xlczpyfT10aGlzLG89clt0Kj0zXSoyLGE9clt0KzFdKjIsYz1yW3QrMl0qMjtyZXR1cm4gZS5tb3ZlVG8oc1tvXSxzW28rMV0pLGUubGluZVRvKHNbYV0sc1thKzFdKSxlLmxpbmVUbyhzW2NdLHNbYysxXSksZS5jbG9zZVBhdGgoKSxuJiZuLnZhbHVlKCl9KnRyaWFuZ2xlUG9seWdvbnMoKXtjb25zdHt0cmlhbmdsZXM6dH09dGhpcztmb3IobGV0IGU9MCxuPXQubGVuZ3RoLzM7ZTxuOysrZSl5aWVsZCB0aGlzLnRyaWFuZ2xlUG9seWdvbihlKX10cmlhbmdsZVBvbHlnb24odCl7Y29uc3QgZT1uZXcgb2M7cmV0dXJuIHRoaXMucmVuZGVyVHJpYW5nbGUodCxlKSxlLnZhbHVlKCl9fWZ1bmN0aW9uIHVtKGksdCxlLG4pe2NvbnN0IHM9aS5sZW5ndGgscj1uZXcgRmxvYXQ2NEFycmF5KHMqMik7Zm9yKGxldCBvPTA7bzxzOysrbyl7Y29uc3QgYT1pW29dO3JbbyoyXT10LmNhbGwobixhLG8saSkscltvKjIrMV09ZS5jYWxsKG4sYSxvLGkpfXJldHVybiByfWZ1bmN0aW9uKmZtKGksdCxlLG4pe2xldCBzPTA7Zm9yKGNvbnN0IHIgb2YgaSl5aWVsZCB0LmNhbGwobixyLHMsaSkseWllbGQgZS5jYWxsKG4scixzLGkpLCsrc31jb25zdCBjYz1NYXRoLlBJLGh1PWNjLzIsdXU9MTgwL2NjLGZ1PWNjLzE4MCxkbT1NYXRoLmF0YW4yLGR1PU1hdGguY29zLHBtPU1hdGgubWF4LHltPU1hdGgubWluLHB1PU1hdGguc2luLG1tPU1hdGguc2lnbnx8ZnVuY3Rpb24oaSl7cmV0dXJuIGk+MD8xOmk8MD8tMTowfSx5dT1NYXRoLnNxcnQ7ZnVuY3Rpb24gZ20oaSl7cmV0dXJuIGk+MT9odTppPC0xPy1odTpNYXRoLmFzaW4oaSl9ZnVuY3Rpb24gbXUoaSx0KXtyZXR1cm4gaVswXSp0WzBdK2lbMV0qdFsxXStpWzJdKnRbMl19ZnVuY3Rpb24gR3QoaSx0KXtyZXR1cm5baVsxXSp0WzJdLWlbMl0qdFsxXSxpWzJdKnRbMF0taVswXSp0WzJdLGlbMF0qdFsxXS1pWzFdKnRbMF1dfWZ1bmN0aW9uIFhyKGksdCl7cmV0dXJuW2lbMF0rdFswXSxpWzFdK3RbMV0saVsyXSt0WzJdXX1mdW5jdGlvbiBHcihpKXt2YXIgdD15dShpWzBdKmlbMF0raVsxXSppWzFdK2lbMl0qaVsyXSk7cmV0dXJuW2lbMF0vdCxpWzFdL3QsaVsyXS90XX1mdW5jdGlvbiBsYyhpKXtyZXR1cm5bZG0oaVsxXSxpWzBdKSp1dSxnbShwbSgtMSx5bSgxLGlbMl0pKSkqdXVdfWZ1bmN0aW9uIEFlKGkpe2NvbnN0IHQ9aVswXSpmdSxlPWlbMV0qZnUsbj1kdShlKTtyZXR1cm5bbipkdSh0KSxuKnB1KHQpLHB1KGUpXX1mdW5jdGlvbiBoYyhpKXtyZXR1cm4gaT1pLm1hcCh0PT5BZSh0KSksbXUoaVswXSxHdChpWzJdLGlbMV0pKX1mdW5jdGlvbiB4bShpKXtjb25zdCB0PWJtKGkpLGU9QW0odCksbj1NbShlLGkpLHM9dm0oZSxpLmxlbmd0aCkscj13bShzLGkpLG89U20oZSxpKSx7cG9seWdvbnM6YSxjZW50ZXJzOmN9PV9tKG8sZSxpKSxsPXptKGEpLGg9UG0oZSxpKSx1PVRtKG4sZSk7cmV0dXJue2RlbGF1bmF5OnQsZWRnZXM6bix0cmlhbmdsZXM6ZSxjZW50ZXJzOmMsbmVpZ2hib3JzOnMscG9seWdvbnM6YSxtZXNoOmwsaHVsbDpoLHVycXVoYXJ0OnUsZmluZDpyfX1mdW5jdGlvbiB3bShpLHQpe2Z1bmN0aW9uIGUobixzKXtsZXQgcj1uWzBdLXNbMF0sbz1uWzFdLXNbMV0sYT1uWzJdLXNbMl07cmV0dXJuIHIqcitvKm8rYSphfXJldHVybiBmdW5jdGlvbihzLHIsbyl7bz09PXZvaWQgMCYmKG89MCk7bGV0IGEsYyxsPW87Y29uc3QgaD1BZShbcyxyXSk7ZG8gYT1vLG89bnVsbCxjPWUoaCxBZSh0W2FdKSksaVthXS5mb3JFYWNoKHU9PntsZXQgZj1lKGgsQWUodFt1XSkpO2lmKGY8Yyl7Yz1mLG89dSxsPXU7cmV0dXJufX0pO3doaWxlKG8hPT1udWxsKTtyZXR1cm4gbH19ZnVuY3Rpb24gYm0oaSl7aWYoaS5sZW5ndGg8MilyZXR1cm57fTtsZXQgdD0wO2Zvcig7aXNOYU4oaVt0XVswXStpW3RdWzFdKSYmdCsrPGkubGVuZ3RoOyk7Y29uc3QgZT1QaChpW3RdKSxuPWh5KCkudHJhbnNsYXRlKFswLDBdKS5zY2FsZSgxKS5yb3RhdGUoZS5pbnZlcnQoWzE4MCwwXSkpO2k9aS5tYXAobik7Y29uc3Qgcz1bXTtsZXQgcj0xO2ZvcihsZXQgdT0wLGY9aS5sZW5ndGg7dTxmO3UrKyl7bGV0IGQ9d2koaVt1XVswXSwyKSt3aShpW3VdWzFdLDIpOyFpc0Zpbml0ZShkKXx8ZD4xZTMyP3MucHVzaCh1KTpkPnImJihyPWQpfWNvbnN0IG89MWU2Knl1KHIpO3MuZm9yRWFjaCh1PT5pW3VdPVtvLDBdKSxpLnB1c2goWzAsb10pLGkucHVzaChbLW8sMF0pLGkucHVzaChbMCwtb10pO2NvbnN0IGE9YWMuZnJvbShpKTthLnByb2plY3Rpb249bjtjb25zdHt0cmlhbmdsZXM6YyxoYWxmZWRnZXM6bCxpbmVkZ2VzOmh9PWE7Zm9yKGxldCB1PTAsZj1sLmxlbmd0aDt1PGY7dSsrKWlmKGxbdV08MCl7Y29uc3QgZD11JTM9PTI/dS0yOnUrMSxwPXUlMz09MD91KzI6dS0xLHk9bFtkXSxtPWxbcF07bFt5XT1tLGxbbV09eSxsW2RdPWxbcF09LTEsY1t1XT1jW2RdPWNbcF09dCxoW2NbeV1dPXklMz09MD95KzI6eS0xLGhbY1ttXV09bSUzPT0wP20rMjptLTEsdSs9Mi11JTN9ZWxzZSBjW3VdPmkubGVuZ3RoLTMtMSYmKGNbdV09dCk7cmV0dXJuIGF9ZnVuY3Rpb24gTW0oaSx0KXtjb25zdCBlPW5ldyBTZXQ7cmV0dXJuIHQubGVuZ3RoPT09Mj9bWzAsMV1dOihpLmZvckVhY2gobj0+e2lmKG5bMF0hPT1uWzFdJiYhKGhjKG4ubWFwKHM9PnRbc10pKTwwKSlmb3IobGV0IHM9MCxyO3M8MztzKyspcj0ocysxKSUzLGUuYWRkKGhyKFtuW3NdLG5bcl1dKS5qb2luKCItIikpfSksQXJyYXkuZnJvbShlLG49Pm4uc3BsaXQoIi0iKS5tYXAoTnVtYmVyKSkpfWZ1bmN0aW9uIEFtKGkpe2NvbnN0e3RyaWFuZ2xlczp0fT1pO2lmKCF0KXJldHVybltdO2NvbnN0IGU9W107Zm9yKGxldCBuPTAscz10Lmxlbmd0aC8zO248cztuKyspe2NvbnN0IHI9dFszKm5dLG89dFszKm4rMV0sYT10WzMqbisyXTtyIT09byYmbyE9PWEmJmUucHVzaChbcixhLG9dKX1yZXR1cm4gZX1mdW5jdGlvbiBTbShpLHQpe3JldHVybiBpLm1hcChlPT57Y29uc3Qgbj1lLm1hcChyPT50W3JdKS5tYXAoQWUpLHM9WHIoWHIoR3QoblsxXSxuWzBdKSxHdChuWzJdLG5bMV0pKSxHdChuWzBdLG5bMl0pKTtyZXR1cm4gbGMoR3IocykpfSl9ZnVuY3Rpb24gdm0oaSx0KXtjb25zdCBlPVtdO3JldHVybiBpLmZvckVhY2gobj0+e2ZvcihsZXQgcz0wO3M8MztzKyspe2NvbnN0IHI9bltzXSxvPW5bKHMrMSklM107ZVtyXT1lW3JdfHxbXSxlW3JdLnB1c2gobyl9fSksaS5sZW5ndGg9PT0wJiYodD09PTI/KGVbMF09WzFdLGVbMV09WzBdKTp0PT09MSYmKGVbMF09W10pKSxlfWZ1bmN0aW9uIF9tKGksdCxlKXtjb25zdCBuPVtdLHM9aS5zbGljZSgpO2lmKHQubGVuZ3RoPT09MCl7aWYoZS5sZW5ndGg8MilyZXR1cm57cG9seWdvbnM6bixjZW50ZXJzOnN9O2lmKGUubGVuZ3RoPT09Mil7Y29uc3QgYT1BZShlWzBdKSxjPUFlKGVbMV0pLGw9R3IoWHIoYSxjKSksaD1HcihHdChhLGMpKSx1PUd0KGwsaCksZj1bbCxHdChsLHUpLEd0KEd0KGwsdSksdSksR3QoR3QoR3QobCx1KSx1KSx1KV0ubWFwKGxjKS5tYXAobyk7cmV0dXJuIG4ucHVzaChmKSxuLnB1c2goZi5zbGljZSgpLnJldmVyc2UoKSkse3BvbHlnb25zOm4sY2VudGVyczpzfX19dC5mb3JFYWNoKChhLGMpPT57Zm9yKGxldCBsPTA7bDwzO2wrKyl7Y29uc3QgaD1hW2xdLHU9YVsobCsxKSUzXSxmPWFbKGwrMiklM107bltoXT1uW2hdfHxbXSxuW2hdLnB1c2goW3UsZixjLFtoLHUsZl1dKX19KTtjb25zdCByPW4ubWFwKGE9Pntjb25zdCBjPVthWzBdWzJdXTtsZXQgbD1hWzBdWzFdO2ZvcihsZXQgaD0xO2g8YS5sZW5ndGg7aCsrKWZvcihsZXQgdT0wO3U8YS5sZW5ndGg7dSsrKWlmKGFbdV1bMF09PWwpe2w9YVt1XVsxXSxjLnB1c2goYVt1XVsyXSk7YnJlYWt9aWYoYy5sZW5ndGg+MilyZXR1cm4gYztpZihjLmxlbmd0aD09Mil7Y29uc3QgaD1ndShlW2FbMF1bM11bMF1dLGVbYVswXVszXVsxXV0sc1tjWzBdXSksdT1ndShlW2FbMF1bM11bMl1dLGVbYVswXVszXVswXV0sc1tjWzBdXSksZj1vKGgpLGQ9byh1KTtyZXR1cm5bY1swXSxkLGNbMV0sZl19fSk7ZnVuY3Rpb24gbyhhKXtsZXQgYz0tMTtyZXR1cm4gcy5zbGljZSh0Lmxlbmd0aCwxLzApLmZvckVhY2goKGwsaCk9PntsWzBdPT09YVswXSYmbFsxXT09PWFbMV0mJihjPWgrdC5sZW5ndGgpfSksYzwwJiYoYz1zLmxlbmd0aCxzLnB1c2goYSkpLGN9cmV0dXJue3BvbHlnb25zOnIsY2VudGVyczpzfX1mdW5jdGlvbiBndShpLHQsZSl7aT1BZShpKSx0PUFlKHQpLGU9QWUoZSk7Y29uc3Qgbj1tbShtdShHdCh0LGkpLGUpKTtyZXR1cm4gbGMoR3IoWHIoaSx0KSkubWFwKHM9Pm4qcykpfWZ1bmN0aW9uIHptKGkpe2NvbnN0IHQ9W107cmV0dXJuIGkuZm9yRWFjaChlPT57aWYoIWUpcmV0dXJuO2xldCBuPWVbZS5sZW5ndGgtMV07Zm9yKGxldCBzIG9mIGUpcz5uJiZ0LnB1c2goW24sc10pLG49c30pLHR9ZnVuY3Rpb24gVG0oaSx0KXtyZXR1cm4gZnVuY3Rpb24oZSl7Y29uc3Qgbj1uZXcgTWFwLHM9bmV3IE1hcDtyZXR1cm4gaS5mb3JFYWNoKChyLG8pPT57Y29uc3QgYT1yLmpvaW4oIi0iKTtuLnNldChhLGVbb10pLHMuc2V0KGEsITApfSksdC5mb3JFYWNoKHI9PntsZXQgbz0wLGE9LTE7Zm9yKGxldCBjPTA7YzwzO2MrKyl7bGV0IGw9aHIoW3JbY10sclsoYysxKSUzXV0pLmpvaW4oIi0iKTtuLmdldChsKT5vJiYobz1uLmdldChsKSxhPWwpfXMuc2V0KGEsITEpfSksaS5tYXAocj0+cy5nZXQoci5qb2luKCItIikpKX19ZnVuY3Rpb24gUG0oaSx0KXtjb25zdCBlPW5ldyBTZXQsbj1bXTtpLm1hcChhPT57aWYoIShoYyhhLm1hcChjPT50W2M+dC5sZW5ndGg/MDpjXSkpPjFlLTEyKSlmb3IobGV0IGM9MDtjPDM7YysrKXtsZXQgbD1bYVtjXSxhWyhjKzEpJTNdXSxoPWAke2xbMF19LSR7bFsxXX1gO2UuaGFzKGgpP2UuZGVsZXRlKGgpOmUuYWRkKGAke2xbMV19LSR7bFswXX1gKX19KTtjb25zdCBzPW5ldyBNYXA7bGV0IHI7aWYoZS5mb3JFYWNoKGE9PnthPWEuc3BsaXQoIi0iKS5tYXAoTnVtYmVyKSxzLnNldChhWzBdLGFbMV0pLHI9YVswXX0pLHI9PT12b2lkIDApcmV0dXJuIG47bGV0IG89cjtkb3tuLnB1c2gobyk7bGV0IGE9cy5nZXQobyk7cy5zZXQobywtMSksbz1hfXdoaWxlKG8+LTEmJm8hPT1yKTtyZXR1cm4gbn1mdW5jdGlvbiBDbShpKXtjb25zdCB0PWZ1bmN0aW9uKGUpe2lmKHQuZGVsYXVuYXk9bnVsbCx0Ll9kYXRhPWUsdHlwZW9mIHQuX2RhdGE9PSJvYmplY3QiJiZ0Ll9kYXRhLnR5cGU9PT0iRmVhdHVyZUNvbGxlY3Rpb24iJiYodC5fZGF0YT10Ll9kYXRhLmZlYXR1cmVzKSx0eXBlb2YgdC5fZGF0YT09Im9iamVjdCIpe2NvbnN0IG49dC5fZGF0YS5tYXAocz0+W3QuX3Z4KHMpLHQuX3Z5KHMpLHNdKS5maWx0ZXIocz0+aXNGaW5pdGUoc1swXStzWzFdKSk7dC5wb2ludHM9bi5tYXAocz0+W3NbMF0sc1sxXV0pLHQudmFsaWQ9bi5tYXAocz0+c1syXSksdC5kZWxhdW5heT14bSh0LnBvaW50cyl9cmV0dXJuIHR9O3JldHVybiB0Ll92eD1mdW5jdGlvbihlKXtpZih0eXBlb2YgZT09Im9iamVjdCImJiJ0eXBlImluIGUpcmV0dXJuIFNoKGUpWzBdO2lmKDAgaW4gZSlyZXR1cm4gZVswXX0sdC5fdnk9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGU9PSJvYmplY3QiJiYidHlwZSJpbiBlKXJldHVybiBTaChlKVsxXTtpZigxIGluIGUpcmV0dXJuIGVbMV19LHQueD1mdW5jdGlvbihlKXtyZXR1cm4gZT8odC5fdng9ZSx0KTp0Ll92eH0sdC55PWZ1bmN0aW9uKGUpe3JldHVybiBlPyh0Ll92eT1lLHQpOnQuX3Z5fSx0LnBvbHlnb25zPWZ1bmN0aW9uKGUpe2lmKGUhPT12b2lkIDAmJnQoZSksIXQuZGVsYXVuYXkpcmV0dXJuITE7Y29uc3Qgbj17dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24iLGZlYXR1cmVzOltdfTtyZXR1cm4gdC52YWxpZC5sZW5ndGg9PT0wfHwodC5kZWxhdW5heS5wb2x5Z29ucy5mb3JFYWNoKChzLHIpPT5uLmZlYXR1cmVzLnB1c2goe3R5cGU6IkZlYXR1cmUiLGdlb21ldHJ5OnM/e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltbLi4ucyxzWzBdXS5tYXAobz0+dC5kZWxhdW5heS5jZW50ZXJzW29dKV19Om51bGwscHJvcGVydGllczp7c2l0ZTp0LnZhbGlkW3JdLHNpdGVjb29yZGluYXRlczp0LnBvaW50c1tyXSxuZWlnaGJvdXJzOnQuZGVsYXVuYXkubmVpZ2hib3JzW3JdfX0pKSx0LnZhbGlkLmxlbmd0aD09PTEmJm4uZmVhdHVyZXMucHVzaCh7dHlwZToiRmVhdHVyZSIsZ2VvbWV0cnk6e3R5cGU6IlNwaGVyZSJ9LHByb3BlcnRpZXM6e3NpdGU6dC52YWxpZFswXSxzaXRlY29vcmRpbmF0ZXM6dC5wb2ludHNbMF0sbmVpZ2hib3VyczpbXX19KSksbn0sdC50cmlhbmdsZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT12b2lkIDAmJnQoZSksdC5kZWxhdW5heT97dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24iLGZlYXR1cmVzOnQuZGVsYXVuYXkudHJpYW5nbGVzLm1hcCgobixzKT0+KG49bi5tYXAocj0+dC5wb2ludHNbcl0pLG4uY2VudGVyPXQuZGVsYXVuYXkuY2VudGVyc1tzXSxuKSkuZmlsdGVyKG49PmhjKG4pPjApLm1hcChuPT4oe3R5cGU6IkZlYXR1cmUiLHByb3BlcnRpZXM6e2NpcmN1bWNlbnRlcjpuLmNlbnRlcn0sZ2VvbWV0cnk6e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltbLi4ubixuWzBdXV19fSkpfTohMX0sdC5saW5rcz1mdW5jdGlvbihlKXtpZihlIT09dm9pZCAwJiZ0KGUpLCF0LmRlbGF1bmF5KXJldHVybiExO2NvbnN0IG49dC5kZWxhdW5heS5lZGdlcy5tYXAocj0+bGkodC5wb2ludHNbclswXV0sdC5wb2ludHNbclsxXV0pKSxzPXQuZGVsYXVuYXkudXJxdWhhcnQobik7cmV0dXJue3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIixmZWF0dXJlczp0LmRlbGF1bmF5LmVkZ2VzLm1hcCgocixvKT0+KHt0eXBlOiJGZWF0dXJlIixwcm9wZXJ0aWVzOntzb3VyY2U6dC52YWxpZFtyWzBdXSx0YXJnZXQ6dC52YWxpZFtyWzFdXSxsZW5ndGg6bltvXSx1cnF1aGFydDohIXNbb119LGdlb21ldHJ5Ont0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpbdC5wb2ludHNbclswXV0sdC5wb2ludHNbclsxXV1dfX0pKX19LHQubWVzaD1mdW5jdGlvbihlKXtyZXR1cm4gZSE9PXZvaWQgMCYmdChlKSx0LmRlbGF1bmF5P3t0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnQuZGVsYXVuYXkuZWRnZXMubWFwKG49Plt0LnBvaW50c1tuWzBdXSx0LnBvaW50c1tuWzFdXV0pfTohMX0sdC5jZWxsTWVzaD1mdW5jdGlvbihlKXtpZihlIT09dm9pZCAwJiZ0KGUpLCF0LmRlbGF1bmF5KXJldHVybiExO2NvbnN0e2NlbnRlcnM6bixwb2x5Z29uczpzfT10LmRlbGF1bmF5LHI9W107Zm9yKGNvbnN0IG8gb2YgcylpZihvKWZvcihsZXQgYT1vLmxlbmd0aCxjPW9bYS0xXSxsPW9bMF0saD0wO2g8YTtjPWwsbD1vWysraF0pbD5jJiZyLnB1c2goW25bY10sbltsXV0pO3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnJ9fSx0Ll9mb3VuZD12b2lkIDAsdC5maW5kPWZ1bmN0aW9uKGUsbixzKXtpZih0Ll9mb3VuZD10LmRlbGF1bmF5LmZpbmQoZSxuLHQuX2ZvdW5kKSwhc3x8bGkoW2Usbl0sdC5wb2ludHNbdC5fZm91bmRdKTxzKXJldHVybiB0Ll9mb3VuZH0sdC5odWxsPWZ1bmN0aW9uKGUpe2UhPT12b2lkIDAmJnQoZSk7Y29uc3Qgbj10LmRlbGF1bmF5Lmh1bGwscz10LnBvaW50cztyZXR1cm4gbi5sZW5ndGg9PT0wP251bGw6e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltbLi4ubi5tYXAocj0+c1tyXSksc1tuWzBdXV1dfX0saT90KGkpOnR9ZnVuY3Rpb24gRW0oaSx0KXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAwOmJyZWFrO2Nhc2UgMTp0aGlzLnJhbmdlKGkpO2JyZWFrO2RlZmF1bHQ6dGhpcy5yYW5nZSh0KS5kb21haW4oaSk7YnJlYWt9cmV0dXJuIHRoaXN9ZnVuY3Rpb24gdWMoaSx0LGUpe2kucHJvdG90eXBlPXQucHJvdG90eXBlPWUsZS5jb25zdHJ1Y3Rvcj1pfWZ1bmN0aW9uIHh1KGksdCl7dmFyIGU9T2JqZWN0LmNyZWF0ZShpLnByb3RvdHlwZSk7Zm9yKHZhciBuIGluIHQpZVtuXT10W25dO3JldHVybiBlfWZ1bmN0aW9uIGNzKCl7fXZhciBscz0uNyxacj0xL2xzLG1pPSJcXHMqKFsrLV0/XFxkKylcXHMqIixocz0iXFxzKihbKy1dPyg/OlxcZCpcXC4pP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pXFxzKiIsU2U9IlxccyooWystXT8oPzpcXGQqXFwuKT9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixCbT0vXiMoWzAtOWEtZl17Myw4fSkkLyxGbT1uZXcgUmVnRXhwKGBecmdiXFwoJHttaX0sJHttaX0sJHttaX1cXCkkYCksSW09bmV3IFJlZ0V4cChgXnJnYlxcKCR7U2V9LCR7U2V9LCR7U2V9XFwpJGApLGttPW5ldyBSZWdFeHAoYF5yZ2JhXFwoJHttaX0sJHttaX0sJHttaX0sJHtoc31cXCkkYCksTm09bmV3IFJlZ0V4cChgXnJnYmFcXCgke1NlfSwke1NlfSwke1NlfSwke2hzfVxcKSRgKSxSbT1uZXcgUmVnRXhwKGBeaHNsXFwoJHtoc30sJHtTZX0sJHtTZX1cXCkkYCksTG09bmV3IFJlZ0V4cChgXmhzbGFcXCgke2hzfSwke1NlfSwke1NlfSwke2hzfVxcKSRgKSx3dT17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTt1Yyhjcyx1cyx7Y29weShpKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3Rvcix0aGlzLGkpfSxkaXNwbGF5YWJsZSgpe3JldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCl9LGhleDpidSxmb3JtYXRIZXg6YnUsZm9ybWF0SGV4ODpPbSxmb3JtYXRIc2w6RG0sZm9ybWF0UmdiOk11LHRvU3RyaW5nOk11fSk7ZnVuY3Rpb24gYnUoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKX1mdW5jdGlvbiBPbSgpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleDgoKX1mdW5jdGlvbiBEbSgpe3JldHVybiB6dSh0aGlzKS5mb3JtYXRIc2woKX1mdW5jdGlvbiBNdSgpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdFJnYigpfWZ1bmN0aW9uIHVzKGkpe3ZhciB0LGU7cmV0dXJuIGk9KGkrIiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLCh0PUJtLmV4ZWMoaSkpPyhlPXRbMV0ubGVuZ3RoLHQ9cGFyc2VJbnQodFsxXSwxNiksZT09PTY/QXUodCk6ZT09PTM/bmV3IER0KHQ+PjgmMTV8dD4+NCYyNDAsdD4+NCYxNXx0JjI0MCwodCYxNSk8PDR8dCYxNSwxKTplPT09OD9Xcih0Pj4yNCYyNTUsdD4+MTYmMjU1LHQ+PjgmMjU1LCh0JjI1NSkvMjU1KTplPT09ND9Xcih0Pj4xMiYxNXx0Pj44JjI0MCx0Pj44JjE1fHQ+PjQmMjQwLHQ+PjQmMTV8dCYyNDAsKCh0JjE1KTw8NHx0JjE1KS8yNTUpOm51bGwpOih0PUZtLmV4ZWMoaSkpP25ldyBEdCh0WzFdLHRbMl0sdFszXSwxKToodD1JbS5leGVjKGkpKT9uZXcgRHQodFsxXSoyNTUvMTAwLHRbMl0qMjU1LzEwMCx0WzNdKjI1NS8xMDAsMSk6KHQ9a20uZXhlYyhpKSk/V3IodFsxXSx0WzJdLHRbM10sdFs0XSk6KHQ9Tm0uZXhlYyhpKSk/V3IodFsxXSoyNTUvMTAwLHRbMl0qMjU1LzEwMCx0WzNdKjI1NS8xMDAsdFs0XSk6KHQ9Um0uZXhlYyhpKSk/X3UodFsxXSx0WzJdLzEwMCx0WzNdLzEwMCwxKToodD1MbS5leGVjKGkpKT9fdSh0WzFdLHRbMl0vMTAwLHRbM10vMTAwLHRbNF0pOnd1Lmhhc093blByb3BlcnR5KGkpP0F1KHd1W2ldKTppPT09InRyYW5zcGFyZW50Ij9uZXcgRHQoTmFOLE5hTixOYU4sMCk6bnVsbH1mdW5jdGlvbiBBdShpKXtyZXR1cm4gbmV3IER0KGk+PjE2JjI1NSxpPj44JjI1NSxpJjI1NSwxKX1mdW5jdGlvbiBXcihpLHQsZSxuKXtyZXR1cm4gbjw9MCYmKGk9dD1lPU5hTiksbmV3IER0KGksdCxlLG4pfWZ1bmN0aW9uICRtKGkpe3JldHVybiBpIGluc3RhbmNlb2YgY3N8fChpPXVzKGkpKSxpPyhpPWkucmdiKCksbmV3IER0KGkucixpLmcsaS5iLGkub3BhY2l0eSkpOm5ldyBEdH1mdW5jdGlvbiBmYyhpLHQsZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTE/JG0oaSk6bmV3IER0KGksdCxlLG49PW51bGw/MTpuKX1mdW5jdGlvbiBEdChpLHQsZSxuKXt0aGlzLnI9K2ksdGhpcy5nPSt0LHRoaXMuYj0rZSx0aGlzLm9wYWNpdHk9K259dWMoRHQsZmMseHUoY3Mse2JyaWdodGVyKGkpe3JldHVybiBpPWk9PW51bGw/WnI6TWF0aC5wb3coWnIsaSksbmV3IER0KHRoaXMucippLHRoaXMuZyppLHRoaXMuYippLHRoaXMub3BhY2l0eSl9LGRhcmtlcihpKXtyZXR1cm4gaT1pPT1udWxsP2xzOk1hdGgucG93KGxzLGkpLG5ldyBEdCh0aGlzLnIqaSx0aGlzLmcqaSx0aGlzLmIqaSx0aGlzLm9wYWNpdHkpfSxyZ2IoKXtyZXR1cm4gdGhpc30sY2xhbXAoKXtyZXR1cm4gbmV3IER0KENuKHRoaXMuciksQ24odGhpcy5nKSxDbih0aGlzLmIpLEhyKHRoaXMub3BhY2l0eSkpfSxkaXNwbGF5YWJsZSgpe3JldHVybi0uNTw9dGhpcy5yJiZ0aGlzLnI8MjU1LjUmJi0uNTw9dGhpcy5nJiZ0aGlzLmc8MjU1LjUmJi0uNTw9dGhpcy5iJiZ0aGlzLmI8MjU1LjUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxoZXg6U3UsZm9ybWF0SGV4OlN1LGZvcm1hdEhleDg6Vm0sZm9ybWF0UmdiOnZ1LHRvU3RyaW5nOnZ1fSkpO2Z1bmN0aW9uIFN1KCl7cmV0dXJuYCMke0VuKHRoaXMucil9JHtFbih0aGlzLmcpfSR7RW4odGhpcy5iKX1gfWZ1bmN0aW9uIFZtKCl7cmV0dXJuYCMke0VuKHRoaXMucil9JHtFbih0aGlzLmcpfSR7RW4odGhpcy5iKX0ke0VuKChpc05hTih0aGlzLm9wYWNpdHkpPzE6dGhpcy5vcGFjaXR5KSoyNTUpfWB9ZnVuY3Rpb24gdnUoKXtjb25zdCBpPUhyKHRoaXMub3BhY2l0eSk7cmV0dXJuYCR7aT09PTE/InJnYigiOiJyZ2JhKCJ9JHtDbih0aGlzLnIpfSwgJHtDbih0aGlzLmcpfSwgJHtDbih0aGlzLmIpfSR7aT09PTE/IikiOmAsICR7aX0pYH1gfWZ1bmN0aW9uIEhyKGkpe3JldHVybiBpc05hTihpKT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSxpKSl9ZnVuY3Rpb24gQ24oaSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQoaSl8fDApKX1mdW5jdGlvbiBFbihpKXtyZXR1cm4gaT1DbihpKSwoaTwxNj8iMCI6IiIpK2kudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIF91KGksdCxlLG4pe3JldHVybiBuPD0wP2k9dD1lPU5hTjplPD0wfHxlPj0xP2k9dD1OYU46dDw9MCYmKGk9TmFOKSxuZXcgeWUoaSx0LGUsbil9ZnVuY3Rpb24genUoaSl7aWYoaSBpbnN0YW5jZW9mIHllKXJldHVybiBuZXcgeWUoaS5oLGkucyxpLmwsaS5vcGFjaXR5KTtpZihpIGluc3RhbmNlb2YgY3N8fChpPXVzKGkpKSwhaSlyZXR1cm4gbmV3IHllO2lmKGkgaW5zdGFuY2VvZiB5ZSlyZXR1cm4gaTtpPWkucmdiKCk7dmFyIHQ9aS5yLzI1NSxlPWkuZy8yNTUsbj1pLmIvMjU1LHM9TWF0aC5taW4odCxlLG4pLHI9TWF0aC5tYXgodCxlLG4pLG89TmFOLGE9ci1zLGM9KHIrcykvMjtyZXR1cm4gYT8odD09PXI/bz0oZS1uKS9hKyhlPG4pKjY6ZT09PXI/bz0obi10KS9hKzI6bz0odC1lKS9hKzQsYS89YzwuNT9yK3M6Mi1yLXMsbyo9NjApOmE9Yz4wJiZjPDE/MDpvLG5ldyB5ZShvLGEsYyxpLm9wYWNpdHkpfWZ1bmN0aW9uIFVtKGksdCxlLG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MT96dShpKTpuZXcgeWUoaSx0LGUsbj09bnVsbD8xOm4pfWZ1bmN0aW9uIHllKGksdCxlLG4pe3RoaXMuaD0raSx0aGlzLnM9K3QsdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rbn11Yyh5ZSxVbSx4dShjcyx7YnJpZ2h0ZXIoaSl7cmV0dXJuIGk9aT09bnVsbD9acjpNYXRoLnBvdyhacixpKSxuZXcgeWUodGhpcy5oLHRoaXMucyx0aGlzLmwqaSx0aGlzLm9wYWNpdHkpfSxkYXJrZXIoaSl7cmV0dXJuIGk9aT09bnVsbD9sczpNYXRoLnBvdyhscyxpKSxuZXcgeWUodGhpcy5oLHRoaXMucyx0aGlzLmwqaSx0aGlzLm9wYWNpdHkpfSxyZ2IoKXt2YXIgaT10aGlzLmglMzYwKyh0aGlzLmg8MCkqMzYwLHQ9aXNOYU4oaSl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsZT10aGlzLmwsbj1lKyhlPC41P2U6MS1lKSp0LHM9MiplLW47cmV0dXJuIG5ldyBEdChkYyhpPj0yNDA/aS0yNDA6aSsxMjAscyxuKSxkYyhpLHMsbiksZGMoaTwxMjA/aSsyNDA6aS0xMjAscyxuKSx0aGlzLm9wYWNpdHkpfSxjbGFtcCgpe3JldHVybiBuZXcgeWUoVHUodGhpcy5oKSxKcih0aGlzLnMpLEpyKHRoaXMubCksSHIodGhpcy5vcGFjaXR5KSl9LGRpc3BsYXlhYmxlKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxmb3JtYXRIc2woKXtjb25zdCBpPUhyKHRoaXMub3BhY2l0eSk7cmV0dXJuYCR7aT09PTE/ImhzbCgiOiJoc2xhKCJ9JHtUdSh0aGlzLmgpfSwgJHtKcih0aGlzLnMpKjEwMH0lLCAke0pyKHRoaXMubCkqMTAwfSUke2k9PT0xPyIpIjpgLCAke2l9KWB9YH19KSk7ZnVuY3Rpb24gVHUoaSl7cmV0dXJuIGk9KGl8fDApJTM2MCxpPDA/aSszNjA6aX1mdW5jdGlvbiBKcihpKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbigxLGl8fDApKX1mdW5jdGlvbiBkYyhpLHQsZSl7cmV0dXJuKGk8NjA/dCsoZS10KSppLzYwOmk8MTgwP2U6aTwyNDA/dCsoZS10KSooMjQwLWkpLzYwOnQpKjI1NX12YXIgcGM9aT0+KCk9Pmk7ZnVuY3Rpb24gcW0oaSx0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGkrZSp0fX1mdW5jdGlvbiBYbShpLHQsZSl7cmV0dXJuIGk9TWF0aC5wb3coaSxlKSx0PU1hdGgucG93KHQsZSktaSxlPTEvZSxmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5wb3coaStuKnQsZSl9fWZ1bmN0aW9uIEdtKGkpe3JldHVybihpPStpKT09MT9QdTpmdW5jdGlvbih0LGUpe3JldHVybiBlLXQ/WG0odCxlLGkpOnBjKGlzTmFOKHQpP2U6dCl9fWZ1bmN0aW9uIFB1KGksdCl7dmFyIGU9dC1pO3JldHVybiBlP3FtKGksZSk6cGMoaXNOYU4oaSk/dDppKX12YXIgQ3U9ZnVuY3Rpb24gaSh0KXt2YXIgZT1HbSh0KTtmdW5jdGlvbiBuKHMscil7dmFyIG89ZSgocz1mYyhzKSkuciwocj1mYyhyKSkuciksYT1lKHMuZyxyLmcpLGM9ZShzLmIsci5iKSxsPVB1KHMub3BhY2l0eSxyLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbihoKXtyZXR1cm4gcy5yPW8oaCkscy5nPWEoaCkscy5iPWMoaCkscy5vcGFjaXR5PWwoaCkscysiIn19cmV0dXJuIG4uZ2FtbWE9aSxufSgxKTtmdW5jdGlvbiBabShpLHQpe3R8fCh0PVtdKTt2YXIgZT1pP01hdGgubWluKHQubGVuZ3RoLGkubGVuZ3RoKTowLG49dC5zbGljZSgpLHM7cmV0dXJuIGZ1bmN0aW9uKHIpe2ZvcihzPTA7czxlOysrcyluW3NdPWlbc10qKDEtcikrdFtzXSpyO3JldHVybiBufX1mdW5jdGlvbiBXbShpKXtyZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KGkpJiYhKGkgaW5zdGFuY2VvZiBEYXRhVmlldyl9ZnVuY3Rpb24gSG0oaSx0KXt2YXIgZT10P3QubGVuZ3RoOjAsbj1pP01hdGgubWluKGUsaS5sZW5ndGgpOjAscz1uZXcgQXJyYXkobikscj1uZXcgQXJyYXkoZSksbztmb3Iobz0wO288bjsrK28pc1tvXT1nYyhpW29dLHRbb10pO2Zvcig7bzxlOysrbylyW29dPXRbb107cmV0dXJuIGZ1bmN0aW9uKGEpe2ZvcihvPTA7bzxuOysrbylyW29dPXNbb10oYSk7cmV0dXJuIHJ9fWZ1bmN0aW9uIEptKGksdCl7dmFyIGU9bmV3IERhdGU7cmV0dXJuIGk9K2ksdD0rdCxmdW5jdGlvbihuKXtyZXR1cm4gZS5zZXRUaW1lKGkqKDEtbikrdCpuKSxlfX1mdW5jdGlvbiBZcihpLHQpe3JldHVybiBpPStpLHQ9K3QsZnVuY3Rpb24oZSl7cmV0dXJuIGkqKDEtZSkrdCplfX1mdW5jdGlvbiBZbShpLHQpe3ZhciBlPXt9LG49e30sczsoaT09PW51bGx8fHR5cGVvZiBpIT0ib2JqZWN0IikmJihpPXt9KSwodD09PW51bGx8fHR5cGVvZiB0IT0ib2JqZWN0IikmJih0PXt9KTtmb3IocyBpbiB0KXMgaW4gaT9lW3NdPWdjKGlbc10sdFtzXSk6bltzXT10W3NdO3JldHVybiBmdW5jdGlvbihyKXtmb3IocyBpbiBlKW5bc109ZVtzXShyKTtyZXR1cm4gbn19dmFyIHljPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxtYz1uZXcgUmVnRXhwKHljLnNvdXJjZSwiZyIpO2Z1bmN0aW9uIGptKGkpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBpfX1mdW5jdGlvbiBRbShpKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGkodCkrIiJ9fWZ1bmN0aW9uIEttKGksdCl7dmFyIGU9eWMubGFzdEluZGV4PW1jLmxhc3RJbmRleD0wLG4scyxyLG89LTEsYT1bXSxjPVtdO2ZvcihpPWkrIiIsdD10KyIiOyhuPXljLmV4ZWMoaSkpJiYocz1tYy5leGVjKHQpKTspKHI9cy5pbmRleCk+ZSYmKHI9dC5zbGljZShlLHIpLGFbb10/YVtvXSs9cjphWysrb109ciksKG49blswXSk9PT0ocz1zWzBdKT9hW29dP2Fbb10rPXM6YVsrK29dPXM6KGFbKytvXT1udWxsLGMucHVzaCh7aTpvLHg6WXIobixzKX0pKSxlPW1jLmxhc3RJbmRleDtyZXR1cm4gZTx0Lmxlbmd0aCYmKHI9dC5zbGljZShlKSxhW29dP2Fbb10rPXI6YVsrK29dPXIpLGEubGVuZ3RoPDI/Y1swXT9RbShjWzBdLngpOmptKHQpOih0PWMubGVuZ3RoLGZ1bmN0aW9uKGwpe2Zvcih2YXIgaD0wLHU7aDx0OysraClhWyh1PWNbaF0pLmldPXUueChsKTtyZXR1cm4gYS5qb2luKCIiKX0pfWZ1bmN0aW9uIGdjKGksdCl7dmFyIGU9dHlwZW9mIHQsbjtyZXR1cm4gdD09bnVsbHx8ZT09PSJib29sZWFuIj9wYyh0KTooZT09PSJudW1iZXIiP1lyOmU9PT0ic3RyaW5nIj8obj11cyh0KSk/KHQ9bixDdSk6S206dCBpbnN0YW5jZW9mIHVzP0N1OnQgaW5zdGFuY2VvZiBEYXRlP0ptOldtKHQpP1ptOkFycmF5LmlzQXJyYXkodCk/SG06dHlwZW9mIHQudmFsdWVPZiE9ImZ1bmN0aW9uIiYmdHlwZW9mIHQudG9TdHJpbmchPSJmdW5jdGlvbiJ8fGlzTmFOKHQpP1ltOllyKShpLHQpfWZ1bmN0aW9uIHRnKGksdCl7cmV0dXJuIGk9K2ksdD0rdCxmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5yb3VuZChpKigxLWUpK3QqZSl9fWZ1bmN0aW9uIGVnKGkpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBpfX1mdW5jdGlvbiBuZyhpKXtyZXR1cm4raX12YXIgRXU9WzAsMV07ZnVuY3Rpb24gZ2koaSl7cmV0dXJuIGl9ZnVuY3Rpb24geGMoaSx0KXtyZXR1cm4odC09aT0raSk/ZnVuY3Rpb24oZSl7cmV0dXJuKGUtaSkvdH06ZWcoaXNOYU4odCk/TmFOOi41KX1mdW5jdGlvbiBpZyhpLHQpe3ZhciBlO3JldHVybiBpPnQmJihlPWksaT10LHQ9ZSksZnVuY3Rpb24obil7cmV0dXJuIE1hdGgubWF4KGksTWF0aC5taW4odCxuKSl9fWZ1bmN0aW9uIHNnKGksdCxlKXt2YXIgbj1pWzBdLHM9aVsxXSxyPXRbMF0sbz10WzFdO3JldHVybiBzPG4/KG49eGMocyxuKSxyPWUobyxyKSk6KG49eGMobixzKSxyPWUocixvKSksZnVuY3Rpb24oYSl7cmV0dXJuIHIobihhKSl9fWZ1bmN0aW9uIHJnKGksdCxlKXt2YXIgbj1NYXRoLm1pbihpLmxlbmd0aCx0Lmxlbmd0aCktMSxzPW5ldyBBcnJheShuKSxyPW5ldyBBcnJheShuKSxvPS0xO2ZvcihpW25dPGlbMF0mJihpPWkuc2xpY2UoKS5yZXZlcnNlKCksdD10LnNsaWNlKCkucmV2ZXJzZSgpKTsrK288bjspc1tvXT14YyhpW29dLGlbbysxXSkscltvXT1lKHRbb10sdFtvKzFdKTtyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIGM9YXAoaSxhLDEsbiktMTtyZXR1cm4gcltjXShzW2NdKGEpKX19ZnVuY3Rpb24gb2coaSx0KXtyZXR1cm4gdC5kb21haW4oaS5kb21haW4oKSkucmFuZ2UoaS5yYW5nZSgpKS5pbnRlcnBvbGF0ZShpLmludGVycG9sYXRlKCkpLmNsYW1wKGkuY2xhbXAoKSkudW5rbm93bihpLnVua25vd24oKSl9ZnVuY3Rpb24gYWcoKXt2YXIgaT1FdSx0PUV1LGU9Z2MsbixzLHIsbz1naSxhLGMsbDtmdW5jdGlvbiBoKCl7dmFyIGY9TWF0aC5taW4oaS5sZW5ndGgsdC5sZW5ndGgpO3JldHVybiBvIT09Z2kmJihvPWlnKGlbMF0saVtmLTFdKSksYT1mPjI/cmc6c2csYz1sPW51bGwsdX1mdW5jdGlvbiB1KGYpe3JldHVybiBmPT1udWxsfHxpc05hTihmPStmKT9yOihjfHwoYz1hKGkubWFwKG4pLHQsZSkpKShuKG8oZikpKX1yZXR1cm4gdS5pbnZlcnQ9ZnVuY3Rpb24oZil7cmV0dXJuIG8ocygobHx8KGw9YSh0LGkubWFwKG4pLFlyKSkpKGYpKSl9LHUuZG9tYWluPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPUFycmF5LmZyb20oZixuZyksaCgpKTppLnNsaWNlKCl9LHUucmFuZ2U9ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9QXJyYXkuZnJvbShmKSxoKCkpOnQuc2xpY2UoKX0sdS5yYW5nZVJvdW5kPWZ1bmN0aW9uKGYpe3JldHVybiB0PUFycmF5LmZyb20oZiksZT10ZyxoKCl9LHUuY2xhbXA9ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89Zj8hMDpnaSxoKCkpOm8hPT1naX0sdS5pbnRlcnBvbGF0ZT1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1mLGgoKSk6ZX0sdS51bmtub3duPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWYsdSk6cn0sZnVuY3Rpb24oZixkKXtyZXR1cm4gbj1mLHM9ZCxoKCl9fWZ1bmN0aW9uIGNnKCl7cmV0dXJuIGFnKCkoZ2ksZ2kpfWZ1bmN0aW9uIGxnKGkpe3JldHVybiBNYXRoLmFicyhpPU1hdGgucm91bmQoaSkpPj0xZTIxP2kudG9Mb2NhbGVTdHJpbmcoImVuIikucmVwbGFjZSgvLC9nLCIiKTppLnRvU3RyaW5nKDEwKX1mdW5jdGlvbiBqcihpLHQpe2lmKChlPShpPXQ/aS50b0V4cG9uZW50aWFsKHQtMSk6aS50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoImUiKSk8MClyZXR1cm4gbnVsbDt2YXIgZSxuPWkuc2xpY2UoMCxlKTtyZXR1cm5bbi5sZW5ndGg+MT9uWzBdK24uc2xpY2UoMik6biwraS5zbGljZShlKzEpXX1mdW5jdGlvbiB4aShpKXtyZXR1cm4gaT1qcihNYXRoLmFicyhpKSksaT9pWzFdOk5hTn1mdW5jdGlvbiBoZyhpLHQpe3JldHVybiBmdW5jdGlvbihlLG4pe2Zvcih2YXIgcz1lLmxlbmd0aCxyPVtdLG89MCxhPWlbMF0sYz0wO3M+MCYmYT4wJiYoYythKzE+biYmKGE9TWF0aC5tYXgoMSxuLWMpKSxyLnB1c2goZS5zdWJzdHJpbmcocy09YSxzK2EpKSwhKChjKz1hKzEpPm4pKTspYT1pW289KG8rMSklaS5sZW5ndGhdO3JldHVybiByLnJldmVyc2UoKS5qb2luKHQpfX1mdW5jdGlvbiB1ZyhpKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZSgvWzAtOV0vZyxmdW5jdGlvbihlKXtyZXR1cm4gaVsrZV19KX19dmFyIGZnPS9eKD86KC4pPyhbPD49Xl0pKT8oWytcLSggXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuXGQrKT8ofik/KFthLXolXSk/JC9pO2Z1bmN0aW9uIFFyKGkpe2lmKCEodD1mZy5leGVjKGkpKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9ybWF0OiAiK2kpO3ZhciB0O3JldHVybiBuZXcgd2Moe2ZpbGw6dFsxXSxhbGlnbjp0WzJdLHNpZ246dFszXSxzeW1ib2w6dFs0XSx6ZXJvOnRbNV0sd2lkdGg6dFs2XSxjb21tYTp0WzddLHByZWNpc2lvbjp0WzhdJiZ0WzhdLnNsaWNlKDEpLHRyaW06dFs5XSx0eXBlOnRbMTBdfSl9UXIucHJvdG90eXBlPXdjLnByb3RvdHlwZTtmdW5jdGlvbiB3YyhpKXt0aGlzLmZpbGw9aS5maWxsPT09dm9pZCAwPyIgIjppLmZpbGwrIiIsdGhpcy5hbGlnbj1pLmFsaWduPT09dm9pZCAwPyI+IjppLmFsaWduKyIiLHRoaXMuc2lnbj1pLnNpZ249PT12b2lkIDA/Ii0iOmkuc2lnbisiIix0aGlzLnN5bWJvbD1pLnN5bWJvbD09PXZvaWQgMD8iIjppLnN5bWJvbCsiIix0aGlzLnplcm89ISFpLnplcm8sdGhpcy53aWR0aD1pLndpZHRoPT09dm9pZCAwP3ZvaWQgMDoraS53aWR0aCx0aGlzLmNvbW1hPSEhaS5jb21tYSx0aGlzLnByZWNpc2lvbj1pLnByZWNpc2lvbj09PXZvaWQgMD92b2lkIDA6K2kucHJlY2lzaW9uLHRoaXMudHJpbT0hIWkudHJpbSx0aGlzLnR5cGU9aS50eXBlPT09dm9pZCAwPyIiOmkudHlwZSsiIn13Yy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxsK3RoaXMuYWxpZ24rdGhpcy5zaWduK3RoaXMuc3ltYm9sKyh0aGlzLnplcm8/IjAiOiIiKSsodGhpcy53aWR0aD09PXZvaWQgMD8iIjpNYXRoLm1heCgxLHRoaXMud2lkdGh8MCkpKyh0aGlzLmNvbW1hPyIsIjoiIikrKHRoaXMucHJlY2lzaW9uPT09dm9pZCAwPyIiOiIuIitNYXRoLm1heCgwLHRoaXMucHJlY2lzaW9ufDApKSsodGhpcy50cmltPyJ+IjoiIikrdGhpcy50eXBlfTtmdW5jdGlvbiBkZyhpKXt0OmZvcih2YXIgdD1pLmxlbmd0aCxlPTEsbj0tMSxzO2U8dDsrK2Upc3dpdGNoKGlbZV0pe2Nhc2UiLiI6bj1zPWU7YnJlYWs7Y2FzZSIwIjpuPT09MCYmKG49ZSkscz1lO2JyZWFrO2RlZmF1bHQ6aWYoIStpW2VdKWJyZWFrIHQ7bj4wJiYobj0wKTticmVha31yZXR1cm4gbj4wP2kuc2xpY2UoMCxuKStpLnNsaWNlKHMrMSk6aX12YXIgQnU7ZnVuY3Rpb24gcGcoaSx0KXt2YXIgZT1qcihpLHQpO2lmKCFlKXJldHVybiBpKyIiO3ZhciBuPWVbMF0scz1lWzFdLHI9cy0oQnU9TWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKHMvMykpKSozKSsxLG89bi5sZW5ndGg7cmV0dXJuIHI9PT1vP246cj5vP24rbmV3IEFycmF5KHItbysxKS5qb2luKCIwIik6cj4wP24uc2xpY2UoMCxyKSsiLiIrbi5zbGljZShyKToiMC4iK25ldyBBcnJheSgxLXIpLmpvaW4oIjAiKStqcihpLE1hdGgubWF4KDAsdCtyLTEpKVswXX1mdW5jdGlvbiBGdShpLHQpe3ZhciBlPWpyKGksdCk7aWYoIWUpcmV0dXJuIGkrIiI7dmFyIG49ZVswXSxzPWVbMV07cmV0dXJuIHM8MD8iMC4iK25ldyBBcnJheSgtcykuam9pbigiMCIpK246bi5sZW5ndGg+cysxP24uc2xpY2UoMCxzKzEpKyIuIituLnNsaWNlKHMrMSk6bituZXcgQXJyYXkocy1uLmxlbmd0aCsyKS5qb2luKCIwIil9dmFyIEl1PXsiJSI6KGksdCk9PihpKjEwMCkudG9GaXhlZCh0KSxiOmk9Pk1hdGgucm91bmQoaSkudG9TdHJpbmcoMiksYzppPT5pKyIiLGQ6bGcsZTooaSx0KT0+aS50b0V4cG9uZW50aWFsKHQpLGY6KGksdCk9PmkudG9GaXhlZCh0KSxnOihpLHQpPT5pLnRvUHJlY2lzaW9uKHQpLG86aT0+TWF0aC5yb3VuZChpKS50b1N0cmluZyg4KSxwOihpLHQpPT5GdShpKjEwMCx0KSxyOkZ1LHM6cGcsWDppPT5NYXRoLnJvdW5kKGkpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLHg6aT0+TWF0aC5yb3VuZChpKS50b1N0cmluZygxNil9O2Z1bmN0aW9uIGt1KGkpe3JldHVybiBpfXZhciBOdT1BcnJheS5wcm90b3R5cGUubWFwLFJ1PVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTtmdW5jdGlvbiB5ZyhpKXt2YXIgdD1pLmdyb3VwaW5nPT09dm9pZCAwfHxpLnRob3VzYW5kcz09PXZvaWQgMD9rdTpoZyhOdS5jYWxsKGkuZ3JvdXBpbmcsTnVtYmVyKSxpLnRob3VzYW5kcysiIiksZT1pLmN1cnJlbmN5PT09dm9pZCAwPyIiOmkuY3VycmVuY3lbMF0rIiIsbj1pLmN1cnJlbmN5PT09dm9pZCAwPyIiOmkuY3VycmVuY3lbMV0rIiIscz1pLmRlY2ltYWw9PT12b2lkIDA/Ii4iOmkuZGVjaW1hbCsiIixyPWkubnVtZXJhbHM9PT12b2lkIDA/a3U6dWcoTnUuY2FsbChpLm51bWVyYWxzLFN0cmluZykpLG89aS5wZXJjZW50PT09dm9pZCAwPyIlIjppLnBlcmNlbnQrIiIsYT1pLm1pbnVzPT09dm9pZCAwPyLiiJIiOmkubWludXMrIiIsYz1pLm5hbj09PXZvaWQgMD8iTmFOIjppLm5hbisiIjtmdW5jdGlvbiBsKHUpe3U9UXIodSk7dmFyIGY9dS5maWxsLGQ9dS5hbGlnbixwPXUuc2lnbix5PXUuc3ltYm9sLG09dS56ZXJvLGc9dS53aWR0aCxiPXUuY29tbWEseD11LnByZWNpc2lvbix3PXUudHJpbSxNPXUudHlwZTtNPT09Im4iPyhiPSEwLE09ImciKTpJdVtNXXx8KHg9PT12b2lkIDAmJih4PTEyKSx3PSEwLE09ImciKSwobXx8Zj09PSIwIiYmZD09PSI9IikmJihtPSEwLGY9IjAiLGQ9Ij0iKTt2YXIgQT15PT09IiQiP2U6eT09PSIjIiYmL1tib3hYXS8udGVzdChNKT8iMCIrTS50b0xvd2VyQ2FzZSgpOiIiLFM9eT09PSIkIj9uOi9bJXBdLy50ZXN0KE0pP286IiIsXz1JdVtNXSx2PS9bZGVmZ3BycyVdLy50ZXN0KE0pO3g9eD09PXZvaWQgMD82Oi9bZ3Byc10vLnRlc3QoTSk/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSx4KSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCx4KSk7ZnVuY3Rpb24gUCh6KXt2YXIgRT1BLEM9UyxGLEIsSTtpZihNPT09ImMiKUM9Xyh6KStDLHo9IiI7ZWxzZXt6PSt6O3ZhciBSPXo8MHx8MS96PDA7aWYoej1pc05hTih6KT9jOl8oTWF0aC5hYnMoeikseCksdyYmKHo9ZGcoeikpLFImJit6PT0wJiZwIT09IisiJiYoUj0hMSksRT0oUj9wPT09IigiP3A6YTpwPT09Ii0ifHxwPT09IigiPyIiOnApK0UsQz0oTT09PSJzIj9SdVs4K0J1LzNdOiIiKStDKyhSJiZwPT09IigiPyIpIjoiIiksdil7Zm9yKEY9LTEsQj16Lmxlbmd0aDsrK0Y8QjspaWYoST16LmNoYXJDb2RlQXQoRiksNDg+SXx8ST41Nyl7Qz0oST09PTQ2P3Mrei5zbGljZShGKzEpOnouc2xpY2UoRikpK0Msej16LnNsaWNlKDAsRik7YnJlYWt9fX1iJiYhbSYmKHo9dCh6LDEvMCkpO3ZhciAkPUUubGVuZ3RoK3oubGVuZ3RoK0MubGVuZ3RoLFY9JDxnP25ldyBBcnJheShnLSQrMSkuam9pbihmKToiIjtzd2l0Y2goYiYmbSYmKHo9dChWK3osVi5sZW5ndGg/Zy1DLmxlbmd0aDoxLzApLFY9IiIpLGQpe2Nhc2UiPCI6ej1FK3orQytWO2JyZWFrO2Nhc2UiPSI6ej1FK1YreitDO2JyZWFrO2Nhc2UiXiI6ej1WLnNsaWNlKDAsJD1WLmxlbmd0aD4+MSkrRSt6K0MrVi5zbGljZSgkKTticmVhaztkZWZhdWx0Ono9VitFK3orQzticmVha31yZXR1cm4gcih6KX1yZXR1cm4gUC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB1KyIifSxQfWZ1bmN0aW9uIGgodSxmKXt2YXIgZD1sKCh1PVFyKHUpLHUudHlwZT0iZiIsdSkpLHA9TWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKHhpKGYpLzMpKSkqMyx5PU1hdGgucG93KDEwLC1wKSxtPVJ1WzgrcC8zXTtyZXR1cm4gZnVuY3Rpb24oZyl7cmV0dXJuIGQoeSpnKSttfX1yZXR1cm57Zm9ybWF0OmwsZm9ybWF0UHJlZml4Omh9fXZhciBLcixMdSxPdTttZyh7dGhvdXNhbmRzOiIsIixncm91cGluZzpbM10sY3VycmVuY3k6WyIkIiwiIl19KTtmdW5jdGlvbiBtZyhpKXtyZXR1cm4gS3I9eWcoaSksTHU9S3IuZm9ybWF0LE91PUtyLmZvcm1hdFByZWZpeCxLcn1mdW5jdGlvbiBnZyhpKXtyZXR1cm4gTWF0aC5tYXgoMCwteGkoTWF0aC5hYnMoaSkpKX1mdW5jdGlvbiB4ZyhpLHQpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcih4aSh0KS8zKSkpKjMteGkoTWF0aC5hYnMoaSkpKX1mdW5jdGlvbiB3ZyhpLHQpe3JldHVybiBpPU1hdGguYWJzKGkpLHQ9TWF0aC5hYnModCktaSxNYXRoLm1heCgwLHhpKHQpLXhpKGkpKSsxfWZ1bmN0aW9uIGJnKGksdCxlLG4pe3ZhciBzPWZwKGksdCxlKSxyO3N3aXRjaChuPVFyKG49PW51bGw/IixmIjpuKSxuLnR5cGUpe2Nhc2UicyI6e3ZhciBvPU1hdGgubWF4KE1hdGguYWJzKGkpLE1hdGguYWJzKHQpKTtyZXR1cm4gbi5wcmVjaXNpb249PW51bGwmJiFpc05hTihyPXhnKHMsbykpJiYobi5wcmVjaXNpb249ciksT3UobixvKX1jYXNlIiI6Y2FzZSJlIjpjYXNlImciOmNhc2UicCI6Y2FzZSJyIjp7bi5wcmVjaXNpb249PW51bGwmJiFpc05hTihyPXdnKHMsTWF0aC5tYXgoTWF0aC5hYnMoaSksTWF0aC5hYnModCkpKSkmJihuLnByZWNpc2lvbj1yLShuLnR5cGU9PT0iZSIpKTticmVha31jYXNlImYiOmNhc2UiJSI6e24ucHJlY2lzaW9uPT1udWxsJiYhaXNOYU4ocj1nZyhzKSkmJihuLnByZWNpc2lvbj1yLShuLnR5cGU9PT0iJSIpKjIpO2JyZWFrfX1yZXR1cm4gTHUobil9ZnVuY3Rpb24gTWcoaSl7dmFyIHQ9aS5kb21haW47cmV0dXJuIGkudGlja3M9ZnVuY3Rpb24oZSl7dmFyIG49dCgpO3JldHVybiB1cChuWzBdLG5bbi5sZW5ndGgtMV0sZT09bnVsbD8xMDplKX0saS50aWNrRm9ybWF0PWZ1bmN0aW9uKGUsbil7dmFyIHM9dCgpO3JldHVybiBiZyhzWzBdLHNbcy5sZW5ndGgtMV0sZT09bnVsbD8xMDplLG4pfSxpLm5pY2U9ZnVuY3Rpb24oZSl7ZT09bnVsbCYmKGU9MTApO3ZhciBuPXQoKSxzPTAscj1uLmxlbmd0aC0xLG89bltzXSxhPW5bcl0sYyxsLGg9MTA7Zm9yKGE8byYmKGw9byxvPWEsYT1sLGw9cyxzPXIscj1sKTtoLS0gPjA7KXtpZihsPVBhKG8sYSxlKSxsPT09YylyZXR1cm4gbltzXT1vLG5bcl09YSx0KG4pO2lmKGw+MClvPU1hdGguZmxvb3Ioby9sKSpsLGE9TWF0aC5jZWlsKGEvbCkqbDtlbHNlIGlmKGw8MClvPU1hdGguY2VpbChvKmwpL2wsYT1NYXRoLmZsb29yKGEqbCkvbDtlbHNlIGJyZWFrO2M9bH1yZXR1cm4gaX0saX1mdW5jdGlvbiBiYygpe3ZhciBpPWNnKCk7cmV0dXJuIGkuY29weT1mdW5jdGlvbigpe3JldHVybiBvZyhpLGJjKCkpfSxFbS5hcHBseShpLGFyZ3VtZW50cyksTWcoaSl9ZnVuY3Rpb24gQWcoaSx0KXtyZXR1cm4gaS5tYXAoZT0+e2NvbnN0IG49W107bGV0IHM7cmV0dXJuIGUuZm9yRWFjaChyPT57aWYocyl7Y29uc3Qgbz1saShyLHMpKjE4MC9NYXRoLlBJO2lmKG8+dCl7Y29uc3QgYT1IcChzLHIpLGM9MS9NYXRoLmNlaWwoby90KTtsZXQgbD1jO2Zvcig7bDwxOyluLnB1c2goYShsKSksbCs9Y319bi5wdXNoKHM9cil9KSxufSl9ZnVuY3Rpb24gU2coaSx7bWluTG5nOnQsbWF4TG5nOmUsbWluTGF0Om4sbWF4TGF0OnN9PXt9KXtjb25zdCByPU1hdGgucm91bmQod2koMzYwL2ksMikvTWF0aC5QSSksbz0oMStNYXRoLnNxcnQoNSkpLzIsYT1kPT5kL28qMzYwJTM2MC0xODAsYz1kPT5NYXRoLmFjb3MoMipkL3ItMSkvTWF0aC5QSSoxODAtOTAsbD1kPT5yKihNYXRoLmNvcygoZCs5MCkqTWF0aC5QSS8xODApKzEpLzIsaD1bcyE9PXZvaWQgMD9NYXRoLmNlaWwobChzKSk6MCxuIT09dm9pZCAwP01hdGguZmxvb3IobChuKSk6ci0xXSx1PXQ9PT12b2lkIDAmJmU9PT12b2lkIDA/KCk9PiEwOnQ9PT12b2lkIDA/ZD0+ZDw9ZTplPT09dm9pZCAwP2Q9PmQ+PXQ6ZT49dD9kPT5kPj10JiZkPD1lOmQ9PmQ+PXR8fGQ8PWUsZj1bXTtmb3IobGV0IGQ9aFswXTtkPD1oWzFdO2QrKyl7Y29uc3QgcD1hKGQpO3UocCkmJmYucHVzaChbcCxjKGQpXSl9cmV0dXJuIGZ9ZnVuY3Rpb24gTWMoaSx0LGU9ITEpe3JldHVybiBlP1dwKHQsaSk6c20oaSx0KX1mdW5jdGlvbiB2ZyhpLHQpe2NvbnN0IGU9e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOml9LFtbbixzXSxbcixvXV09Z2goZSk7aWYoTWF0aC5taW4oTWF0aC5hYnMoci1uKSxNYXRoLmFicyhvLXMpKTx0KXJldHVybltdO2NvbnN0IGE9bj5yfHxvPj04OXx8czw9LTg5O3JldHVybiBTZyh0LHttaW5Mbmc6bixtYXhMbmc6cixtaW5MYXQ6cyxtYXhMYXQ6b30pLmZpbHRlcihjPT5NYyhjLGUsYSkpfWZ1bmN0aW9uIF9nKGkse3Jlc29sdXRpb246dD0xLzAsYmJveDplLHByb2plY3Rpb246bn09e30pe2NvbnN0IHM9QWcoaSx0KSxyPUdpKHMpLG89dmcoaSx0KSxhPVsuLi5yLC4uLm9dLGM9e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOml9LFtbbCxoXSxbdSxmXV09Z2goYyksZD1sPnV8fGY+PTg5fHxoPD0tODk7bGV0IHA9W107aWYoZCl7Y29uc3QgTT1DbShhKS50cmlhbmdsZXMoKSxBPW5ldyBNYXAoYS5tYXAoKFtTLF9dLHYpPT5bYCR7U30tJHtffWAsdl0pKTtNLmZlYXR1cmVzLmZvckVhY2goUz0+e2NvbnN0IF89Uy5nZW9tZXRyeS5jb29yZGluYXRlc1swXS5zbGljZSgwLDMpLnJldmVyc2UoKSx2PVtdO2lmKF8uZm9yRWFjaCgoW1Asel0pPT57Y29uc3QgRT1gJHtQfS0ke3p9YDtBLmhhcyhFKSYmdi5wdXNoKEEuZ2V0KEUpKX0pLHYubGVuZ3RoPT09Myl7aWYodi5zb21lKFA9PlA8ci5sZW5ndGgpKXtjb25zdCBQPVMucHJvcGVydGllcy5jaXJjdW1jZW50ZXI7aWYoIU1jKFAsYyxkKSlyZXR1cm59cC5wdXNoKC4uLnYpfX0pfWVsc2UgaWYoby5sZW5ndGgpe2NvbnN0IE09b3MuZnJvbShhKTtmb3IobGV0IEE9MCxTPU0udHJpYW5nbGVzLmxlbmd0aDtBPFM7QSs9Myl7Y29uc3QgXz1bMiwxLDBdLm1hcChQPT5NLnRyaWFuZ2xlc1tBK1BdKSx2PV8ubWFwKFA9PmFbUF0pO2lmKF8uc29tZShQPT5QPHIubGVuZ3RoKSl7Y29uc3QgUD1bMCwxXS5tYXAoej0+ZHAodixFPT5FW3pdKSk7aWYoIU1jKFAsYyxkKSljb250aW51ZX1wLnB1c2goLi4uXyl9fWVsc2V7Y29uc3R7dmVydGljZXM6TSxob2xlczpBPVtdfT1zdShzKTtwPU15KE0sQSwyKX1sZXQgeT1lP1tlWzBdLGVbMl1dOmhyKGEsTT0+TVswXSksbT1lP1tlWzFdLGVbM11dOmhyKGEsTT0+TVsxXSk7aWYobil7Y29uc3RbTSxBXT1uKFt5WzBdLG1bMF1dKSxbUyxfXT1uKFt5WzFdLG1bMV1dKTt5PVtNLFNdLG09Wy1BLC1fXX1jb25zdCBnPWJjKHksWzAsMV0pLGI9YmMobSxbMCwxXSkseD1hLm1hcCgoW00sQV0pPT57aWYobil7Y29uc3RbUyxfXT1uKFtNLEFdKTtyZXR1cm5bZyhTKSxiKC1fKV19ZWxzZSByZXR1cm5bZyhNKSxiKEEpXX0pO3JldHVybntjb250b3VyOnMsdHJpYW5nbGVzOntwb2ludHM6YSxpbmRpY2VzOnAsdXZzOnh9fX1jb25zdCBEdT1uZXcgeGUoKS5zZXRBdHRyaWJ1dGU/InNldEF0dHJpYnV0ZSI6ImFkZEF0dHJpYnV0ZSI7ZnVuY3Rpb24gdG8oaSx0LGUsbil7Y29uc3Qgcz1pLm1hcChyPT5yLm1hcCgoW28sYV0pPT57aWYobil7Y29uc3RbYyxsXT1uKFtvLGFdKTtyZXR1cm5bYywtbCx0XX1yZXR1cm4gZT9weShvLGEsdCk6W28sYSx0XX0pKTtyZXR1cm4gc3Uocyl9ZnVuY3Rpb24gemcoaSx0LGUsbixzKXtjb25zdHt2ZXJ0aWNlczpyLGhvbGVzOm99PXRvKGksdCxuLHMpLHt2ZXJ0aWNlczphfT10byhpLGUsbixzKSxjPUdpKFthLHJdKSxsPU1hdGgucm91bmQoYS5sZW5ndGgvMyksaD1uZXcgU2V0KG8pO2xldCB1PTA7Y29uc3QgZj1bXTtmb3IobGV0IHA9MDtwPGw7cCsrKXtsZXQgeT1wKzE7aWYoeT09PWwpeT11O2Vsc2UgaWYoaC5oYXMoeSkpe2NvbnN0IG09eTt5PXUsdT1tfWYucHVzaChwLHArbCx5K2wpLGYucHVzaCh5K2wseSxwKX1jb25zdCBkPVtdO2ZvcihsZXQgcD0xO3A+PTA7cC0tKWZvcihsZXQgeT0wO3k8bDt5Kz0xKWQucHVzaCh5LyhsLTEpLHApO3JldHVybntpbmRpY2VzOmYsdmVydGljZXM6Yyx1dnM6ZCx0b3BWZXJ0czphfX1mdW5jdGlvbiAkdShpLHQsZSxuLHMscil7cmV0dXJue2luZGljZXM6bj9pLmluZGljZXM6aS5pbmRpY2VzLnNsaWNlKCkucmV2ZXJzZSgpLHZlcnRpY2VzOnRvKFtpLnBvaW50c10sdCxzLHIpLnZlcnRpY2VzLHV2czplfX1jb25zdCBWdT0oe3BvbHlnb25HZW9Kc29uOmksc3RhcnRIZWlnaHQ6dCxlbmRIZWlnaHQ6ZSxjdXJ2YXR1cmVSZXNvbHV0aW9uOm49MSxjYXJ0ZXNpYW46cz0hMCxoYXNTaWRlOnI9ITAsaGFzQm90dG9tOm89ITEsaGFzVG9wOmE9ITEscHJvamVjdGlvbjpjLGJib3g6bH0pPT57aS5mb3JFYWNoKGc9PntVeShnKXx8Zy5yZXZlcnNlKCl9KTtjb25zdHtjb250b3VyOmgsdHJpYW5nbGVzOnV9PV9nKGkse3Jlc29sdXRpb246bixiYm94OmwscHJvamVjdGlvbjpjfSk7bGV0IGY9e30sZDtyJiYoZj16ZyhoLHQhPW51bGw/dDplLGUhPW51bGw/ZTp0LHMsYyksZD1mLnRvcFZlcnRzKTtsZXQgcD1bXTsob3x8YSkmJihwPUdpKHUudXZzKSk7bGV0IHk9e307byYmKHk9JHUodSx0LHAsITEscyxjKSk7bGV0IG09e307cmV0dXJuIGEmJihtPSR1KHUsZSxwLCEwLHMsYykpLHtjb250b3VyOmgsdHJpYW5nbGVzOnUsc2lkZVRvcnNvOmYsYm90dG9tQ2FwOnksdG9wQ2FwOm0sdG9wVmVydHM6ZH19O2NsYXNzIFRnIGV4dGVuZHMgeGV7Y29uc3RydWN0b3IodCxlPXt9KXtzdXBlcigpLHRoaXMudHlwZT0iUG9seWdvbkJ1ZmZlckdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9SXQoe3BvbHlnb25HZW9Kc29uOnQsc3RhcnRIZWlnaHQ6MCxlbmRIZWlnaHQ6MSxoYXNUb3A6ITAsdG9wRmlyc3Q6ITEsaGFzQm90dG9tOiEwLGhhc1NpZGU6ITAsY3VydmF0dXJlUmVzb2x1dGlvbjoxLGNhcnRlc2lhbjohMCx1c2VyRGF0YVJzb09mZnNldDowfSxlKTtjb25zdHtlbmRIZWlnaHQ6bixoYXNUb3A6cyx0b3BGaXJzdDpyLGhhc0JvdHRvbTpvLGhhc1NpZGU6YSxjYXJ0ZXNpYW46Yyx1c2VyRGF0YVJzb09mZnNldDpsLHByb2plY3Rpb246aH09dGhpcy5wYXJhbWV0ZXJzLHtjb250b3VyOnUsc2lkZVRvcnNvOmYsdG9wVmVydHM6ZCxib3R0b21DYXA6cCx0b3BDYXA6eX09VnUoSXQoe30sdGhpcy5wYXJhbWV0ZXJzKSk7bGV0IG09W10sZz1bXSxiPVtdLHg9MDtjb25zdCB3PU09Pntjb25zdCBBPU1hdGgucm91bmQobS5sZW5ndGgvMyksUz1iLmxlbmd0aDttPW0uY29uY2F0KE0udmVydGljZXMpLGc9Zy5jb25jYXQoTS51dnMpLGI9Yi5jb25jYXQoQT9NLmluZGljZXMubWFwKF89Pl8rQSk6TS5pbmRpY2VzKSx0aGlzLmFkZEdyb3VwKFMsYi5sZW5ndGgtUyx4KyspfTtzJiZyJiZ3KHkpLGEmJih3KGYpLHRoaXMudXNlckRhdGEudG9wVmVydHM9bD90byh1LG4rbCxjLGgpLnZlcnRpY2VzOmQpLG8mJncocCkscyYmIXImJncoeSksdGhpcy5zZXRJbmRleChiKSx0aGlzW0R1XSgicG9zaXRpb24iLG5ldyBGZShtLDMpKSx0aGlzW0R1XSgidXYiLG5ldyBGZShnLDIpKSx0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCl9fXZhciBQZz1pPT57Y29uc3QgYT1pLHtjb29yZGluYXRlOnQsc3RhcnRIZWlnaHQ6ZSxoZWlnaHQ6bn09YSxzPWVmKGEsWyJjb29yZGluYXRlIiwic3RhcnRIZWlnaHQiLCJoZWlnaHQiXSk7bGV0IHI9ZXx8MDtyZXR1cm4gdHlwZW9mIGUhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbiE9InVuZGVmaW5lZCImJihyPWUrbiksbmV3IFRnKFt0XSxIZShJdCh7fSxzKSx7c3RhcnRIZWlnaHQ6ZSxlbmRIZWlnaHQ6cn0pKX07Y29uc3QgQ2c9KHtjb29yZGluYXRlczppLGxlbmd0aHM6dCxzdGFydDplLGRlcHRoOm4sdXNlR3JvdXBzOnMsaGFzVG9wOnIsdG9wRmlyc3Q6byxoYXNCb3R0b206YSxoYXNTaWRlOmMsY2FydGVzaWFuOmwscHJvamVjdGlvbjpoLGN1cnZhdHVyZVJlc29sdXRpb246dSxiYm94OmZ9KT0+e2NvbnN0IGQ9aCYmUWkoaCk7ZCYmKGw9ITEpLGV8fChlPVswXSk7Y29uc3QgeT1LaSh7Y29vcmRpbmF0ZXM6aSxsZW5ndGhzOnR9KS5tYXAoKG0sZyk9Pnt2YXIgYix4O3JldHVybiBQZyh7Y29vcmRpbmF0ZTptLHByb2plY3Rpb246ZCxzdGFydEhlaWdodDooYj1lW2ddKSE9bnVsbD9iOmVbMF0saGVpZ2h0Oih4PW5bZ10pIT1udWxsP3g6blswXSxoYXNUb3A6ciE9bnVsbD9yOiEwLHRvcEZpcnN0Om8hPW51bGw/bzohMSxoYXNCb3R0b206YSE9bnVsbD9hOiEwLGhhc1NpZGU6YyE9bnVsbD9jOiEwLGNhcnRlc2lhbjpsIT1udWxsP2w6ITAsY3VydmF0dXJlUmVzb2x1dGlvbjp1IT1udWxsP3U6MSxiYm94OmZ9KX0pO3JldHVybiB0cyh5LHMpfSxFZz0oe2Nvb3JkaW5hdGVzOmksbGVuZ3Roczp0LGxpbmVXaWR0aDplLHN0YXJ0Om4sdXNlR3JvdXBzOnN9KT0+e2NvbnN0IGE9S2koe2Nvb3JkaW5hdGVzOmksbGVuZ3Roczp0fSkubWFwKChjLGwpPT57dmFyIGg7cmV0dXJuIFZ1KHtwb2x5Z29uR2VvSnNvbjpbY10sc3RhcnRIZWlnaHQ6KGg9bltsXSkhPW51bGw/aDpuWzBdfSkudG9wVmVydHN9KS5tYXAoKGMsbCk9Pnt2YXIgdTtjb25zdCBoPSh1PWVbbF0pIT1udWxsP3U6ZVswXTtyZXR1cm4gUWgoe25vZGVzOmMsc2V0UG9pbnRXaWR0aDooKT0+aH0pfSk7cmV0dXJuIHRzKGEscyl9O3ZhciBCZz0oaSx0LGUpPT5uZXcgUHJvbWlzZSgobixzKT0+e3ZhciByPWM9Pnt0cnl7YShlLm5leHQoYykpfWNhdGNoKGwpe3MobCl9fSxvPWM9Pnt0cnl7YShlLnRocm93KGMpKX1jYXRjaChsKXtzKGwpfX0sYT1jPT5jLmRvbmU/bihjLnZhbHVlKTpQcm9taXNlLnJlc29sdmUoYy52YWx1ZSkudGhlbihyLG8pO2EoKGU9ZS5hcHBseShpLHQpKS5uZXh0KCkpfSk7ZnVuY3Rpb24gRmcoaSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGkpLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTppW2VdLGVudW1lcmFibGU6ITB9KX0se30pfShpPT57Y29uc3QgdD17cnVuKGUsbil7Y29uc3Qgcz1uZXcgRnVuY3Rpb24oInJldHVybiAoIitlKyIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7Iik7cmV0dXJuIHMuYXBwbHkocyxuKX0sbWV0aG9kcygpe3JldHVybiBPYmplY3Qua2V5cyh0KX19O2FkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGU9PkJnKHZvaWQgMCxbZV0sZnVuY3Rpb24qKHtkYXRhOm59KXt0cnl7Y29uc3Qgcz10W24ubWV0aG9kXTtpZihzKXtjb25zdCByPXlpZWxkIHMuYXBwbHkocyxuLnBhcmFtcyk7ci50cmFuc2ZlciYmci5tZXNzYWdlP3Bvc3RNZXNzYWdlKHtpZDpuLmlkLHJlc3VsdDpyLm1lc3NhZ2UsZXJyb3I6bnVsbH0sci50cmFuc2Zlcik6cG9zdE1lc3NhZ2Uoe2lkOm4uaWQscmVzdWx0OnIsZXJyb3I6bnVsbH0pfWVsc2UgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG1ldGhvZCAiJytuLm1ldGhvZCsnIicpfWNhdGNoKHMpe3Bvc3RNZXNzYWdlKHtpZDpuLmlkLHJlc3VsdDpudWxsLGVycm9yOkZnKHMpfSl9fSkpLE9iamVjdC5rZXlzKGkpLmZvckVhY2goZT0+e3RbZV09aVtlXX0pLHBvc3RNZXNzYWdlKCJyZWFkeSIpfSkoe2V4dHJ1ZGVQb2x5Z29uOm15LGxpbmU6eHksbGluZTI6YnksY29uaWNQb2x5Z29uOkNnLGNvbmljTGluZTpFZ30pfSkoKTsK",N=l=>Uint8Array.from(atob(l),b=>b.charCodeAt(0)),C=typeof window!="undefined"&&window.Blob&&new Blob([N(M)],{type:"text/javascript;charset=utf-8"});function T(l){let b;try{if(b=C&&(window.URL||window.webkitURL).createObjectURL(C),!b)throw"";const d=new Worker(b,{name:l==null?void 0:l.name});return d.addEventListener("error",()=>{(window.URL||window.webkitURL).revokeObjectURL(b)}),d}catch(d){return new Worker("data:text/javascript;base64,"+M,{name:l==null?void 0:l.name})}finally{b&&(window.URL||window.webkitURL).revokeObjectURL(b)}}class J{constructor(b){this.pluginName="worker",this.bufferGeometryLoader=new K.BufferGeometryLoader,this.cacheObj={},this._dispose=!1,this.options=y({dbName:"base",cacheVersion:"1"},b),this.store=Y.createStore(this.options.dbName,"attributes")}install(b){this.pencil=b;const d=new k.WorkerPool(T,{maxWorkers:this.options.maxWorkers});this.pool=d}geoGeometry(b,d){return V(this,null,function*(){const{mesaage:G,coordinatesArr:m,cacheKey:Z,userData:L,cacheVersion:W,cb:X}=y(y({},this.options),d),c=this.pool,{coordinates:p,lengths:i}=this.flattenCoordinates(m),{err:a,res:x}=yield c.exec(b,[y({coordinates:p,lengths:i},G)],{on:()=>{},transfer:[p.buffer]},!0);if(a)throw a;const h=H(x);if(Object.assign(h.userData,y({},L)),X&&(yield X(h)),Z){const{cacheObj:s}=this;s[Z]||(s[Z]={[W]:[]}),s[Z][W].push(y({attributes:x},L))}return h})}getCachedGeometry(b){return V(this,null,function*(){const{cacheKey:d,cacheVersion:G}=b;if(d){const m=yield Y.get(d,this.store),Z=G||this.options.cacheVersion;return m!=null&&m[Z]?m[Z].map(L=>{const p=L,{attributes:W}=p,X=o(p,["attributes"]),c=H(W);return Object.assign(c.userData,y({},X)),c}):[]}else return[]})}saveCache(){Y.setMany(Object.entries(this.cacheObj),this.store)}flattenCoordinates(b,d=2){var W;const G=b.map(X=>X.length),m=G.reduce((X,c)=>X+c,0),Z=new Float32Array(m*d);let L=0;for(const X of b)for(const c of X)for(let p=0;p<d;p++)Z[L++]=(W=c[p])!=null?W:0;return{coordinates:Z,lengths:G}}dispose(){this.cacheObj={},this.pool.dispose(),this._dispose=!0}}exports.Wk=J;
1
+ "use strict";var k=Object.defineProperty;var u=Object.getOwnPropertySymbols;var o=Object.prototype.hasOwnProperty,z=Object.prototype.propertyIsEnumerable;var R=(l,b,d)=>b in l?k(l,b,{enumerable:!0,configurable:!0,writable:!0,value:d}):l[b]=d,L=(l,b)=>{for(var d in b||(b={}))o.call(b,d)&&R(l,d,b[d]);if(u)for(var d of u(b))z.call(b,d)&&R(l,d,b[d]);return l};var H=(l,b)=>{var d={};for(var G in l)o.call(l,G)&&b.indexOf(G)<0&&(d[G]=l[G]);if(l!=null&&u)for(var G of u(l))b.indexOf(G)<0&&z.call(l,G)&&(d[G]=l[G]);return d};var s=(l,b,d)=>new Promise((G,m)=>{var p=X=>{try{W(d.next(X))}catch(Z){m(Z)}},c=X=>{try{W(d.throw(X))}catch(Z){m(Z)}},W=X=>X.done?G(X.value):Promise.resolve(X.value).then(p,c);W((d=d.apply(l,b)).next())});Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const N=require("esus-lite"),Y=require("idb-keyval"),K=require("three"),C=l=>{const b=new K.BufferGeometry;return Object.keys(l).forEach(d=>{d==="groups"?l[d].forEach(G=>{b.addGroup(G.start,G.count,G.materialIndex)}):d==="index"?b.setIndex(new K.BufferAttribute(l[d].array,l[d].itemSize)):b.setAttribute(d,new K.BufferAttribute(l[d].array,l[d].itemSize))}),b},n="dmFyIFVnPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxxZz1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgWGc9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIGFvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIGxmPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksaGY9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgUGM9KEosaik9PihqPVN5bWJvbFtKXSk/ajpTeW1ib2wuZm9yKCJTeW1ib2wuIitKKSxaZz1KPT57dGhyb3cgVHlwZUVycm9yKEopfSx2aT1NYXRoLnBvdyxjZj0oSixqLG10KT0+aiBpbiBKP1VnKEosaix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bXR9KTpKW2pdPW10LFZ0PShKLGopPT57Zm9yKHZhciBtdCBpbiBqfHwoaj17fSkpbGYuY2FsbChqLG10KSYmY2YoSixtdCxqW210XSk7aWYoYW8pZm9yKHZhciBtdCBvZiBhbyhqKSloZi5jYWxsKGosbXQpJiZjZihKLG10LGpbbXRdKTtyZXR1cm4gSn0sS2U9KEosaik9PnFnKEosWGcoaikpO3ZhciB1Zj0oSixqKT0+e3ZhciBtdD17fTtmb3IodmFyIFR0IGluIEopbGYuY2FsbChKLFR0KSYmai5pbmRleE9mKFR0KTwwJiYobXRbVHRdPUpbVHRdKTtpZihKIT1udWxsJiZhbylmb3IodmFyIFR0IG9mIGFvKEopKWouaW5kZXhPZihUdCk8MCYmaGYuY2FsbChKLFR0KSYmKG10W1R0XT1KW1R0XSk7cmV0dXJuIG10fTt2YXIgV2c9ZnVuY3Rpb24oSixqKXt0aGlzWzBdPUosdGhpc1sxXT1qfTt2YXIgZmY9Sj0+e3ZhciBqPUpbUGMoImFzeW5jSXRlcmF0b3IiKV0sbXQ9ITEsVHQscG49e307cmV0dXJuIGo9PW51bGw/KGo9SltQYygiaXRlcmF0b3IiKV0oKSxUdD1QZT0+cG5bUGVdPU9uPT5qW1BlXShPbikpOihqPWouY2FsbChKKSxUdD1QZT0+cG5bUGVdPU9uPT57aWYobXQpe2lmKG10PSExLFBlPT09InRocm93Iil0aHJvdyBPbjtyZXR1cm4gT259cmV0dXJuIG10PSEwLHtkb25lOiExLHZhbHVlOm5ldyBXZyhuZXcgUHJvbWlzZShDYz0+e3ZhciBjbz1qW1BlXShPbik7Y28gaW5zdGFuY2VvZiBPYmplY3R8fFpnKCJPYmplY3QgZXhwZWN0ZWQiKSxDYyhjbyl9KSwxKX19KSxwbltQYygiaXRlcmF0b3IiKV09KCk9PnBuLFR0KCJuZXh0IiksInRocm93ImluIGo/VHQoInRocm93Iik6cG4udGhyb3c9UGU9Pnt0aHJvdyBQZX0sInJldHVybiJpbiBqJiZUdCgicmV0dXJuIikscG59OyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjsvKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IDIwMTAtMjAyNSBUaHJlZS5qcyBBdXRob3JzCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICovY29uc3QgSj0iMTgyIixCYz0iIixmZT0ic3JnYiIsRWM9InNyZ2ItbGluZWFyIixGYz0ibGluZWFyIixsbz0ic3JnYiI7ZnVuY3Rpb24gZGYoaSl7Zm9yKGxldCB0PWkubGVuZ3RoLTE7dD49MDstLXQpaWYoaVt0XT49NjU1MzUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gSWMoaSl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsaSl9Y29uc3QgTmM9e307ZnVuY3Rpb24gdnQoLi4uaSl7Y29uc3QgdD0iVEhSRUUuIitpLnNoaWZ0KCk7Y29uc29sZS53YXJuKHQsLi4uaSl9ZnVuY3Rpb24geW4oLi4uaSl7Y29uc3QgdD0iVEhSRUUuIitpLnNoaWZ0KCk7Y29uc29sZS5lcnJvcih0LC4uLmkpfWZ1bmN0aW9uIGtjKC4uLmkpe2NvbnN0IHQ9aS5qb2luKCIgIik7dCBpbiBOY3x8KE5jW3RdPSEwLHZ0KC4uLmkpKX1jbGFzcyB5c3thZGRFdmVudExpc3RlbmVyKHQsZSl7dGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwJiYodGhpcy5fbGlzdGVuZXJzPXt9KTtjb25zdCBuPXRoaXMuX2xpc3RlbmVycztuW3RdPT09dm9pZCAwJiYoblt0XT1bXSksblt0XS5pbmRleE9mKGUpPT09LTEmJm5bdF0ucHVzaChlKX1oYXNFdmVudExpc3RlbmVyKHQsZSl7Y29uc3Qgbj10aGlzLl9saXN0ZW5lcnM7cmV0dXJuIG49PT12b2lkIDA/ITE6blt0XSE9PXZvaWQgMCYmblt0XS5pbmRleE9mKGUpIT09LTF9cmVtb3ZlRXZlbnRMaXN0ZW5lcih0LGUpe2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzO2lmKG49PT12b2lkIDApcmV0dXJuO2NvbnN0IHM9blt0XTtpZihzIT09dm9pZCAwKXtjb25zdCByPXMuaW5kZXhPZihlKTtyIT09LTEmJnMuc3BsaWNlKHIsMSl9fWRpc3BhdGNoRXZlbnQodCl7Y29uc3QgZT10aGlzLl9saXN0ZW5lcnM7aWYoZT09PXZvaWQgMClyZXR1cm47Y29uc3Qgbj1lW3QudHlwZV07aWYobiE9PXZvaWQgMCl7dC50YXJnZXQ9dGhpcztjb25zdCBzPW4uc2xpY2UoMCk7Zm9yKGxldCByPTAsbz1zLmxlbmd0aDtyPG87cisrKXNbcl0uY2FsbCh0aGlzLHQpO3QudGFyZ2V0PW51bGx9fX1jb25zdCBQdD1bIjAwIiwiMDEiLCIwMiIsIjAzIiwiMDQiLCIwNSIsIjA2IiwiMDciLCIwOCIsIjA5IiwiMGEiLCIwYiIsIjBjIiwiMGQiLCIwZSIsIjBmIiwiMTAiLCIxMSIsIjEyIiwiMTMiLCIxNCIsIjE1IiwiMTYiLCIxNyIsIjE4IiwiMTkiLCIxYSIsIjFiIiwiMWMiLCIxZCIsIjFlIiwiMWYiLCIyMCIsIjIxIiwiMjIiLCIyMyIsIjI0IiwiMjUiLCIyNiIsIjI3IiwiMjgiLCIyOSIsIjJhIiwiMmIiLCIyYyIsIjJkIiwiMmUiLCIyZiIsIjMwIiwiMzEiLCIzMiIsIjMzIiwiMzQiLCIzNSIsIjM2IiwiMzciLCIzOCIsIjM5IiwiM2EiLCIzYiIsIjNjIiwiM2QiLCIzZSIsIjNmIiwiNDAiLCI0MSIsIjQyIiwiNDMiLCI0NCIsIjQ1IiwiNDYiLCI0NyIsIjQ4IiwiNDkiLCI0YSIsIjRiIiwiNGMiLCI0ZCIsIjRlIiwiNGYiLCI1MCIsIjUxIiwiNTIiLCI1MyIsIjU0IiwiNTUiLCI1NiIsIjU3IiwiNTgiLCI1OSIsIjVhIiwiNWIiLCI1YyIsIjVkIiwiNWUiLCI1ZiIsIjYwIiwiNjEiLCI2MiIsIjYzIiwiNjQiLCI2NSIsIjY2IiwiNjciLCI2OCIsIjY5IiwiNmEiLCI2YiIsIjZjIiwiNmQiLCI2ZSIsIjZmIiwiNzAiLCI3MSIsIjcyIiwiNzMiLCI3NCIsIjc1IiwiNzYiLCI3NyIsIjc4IiwiNzkiLCI3YSIsIjdiIiwiN2MiLCI3ZCIsIjdlIiwiN2YiLCI4MCIsIjgxIiwiODIiLCI4MyIsIjg0IiwiODUiLCI4NiIsIjg3IiwiODgiLCI4OSIsIjhhIiwiOGIiLCI4YyIsIjhkIiwiOGUiLCI4ZiIsIjkwIiwiOTEiLCI5MiIsIjkzIiwiOTQiLCI5NSIsIjk2IiwiOTciLCI5OCIsIjk5IiwiOWEiLCI5YiIsIjljIiwiOWQiLCI5ZSIsIjlmIiwiYTAiLCJhMSIsImEyIiwiYTMiLCJhNCIsImE1IiwiYTYiLCJhNyIsImE4IiwiYTkiLCJhYSIsImFiIiwiYWMiLCJhZCIsImFlIiwiYWYiLCJiMCIsImIxIiwiYjIiLCJiMyIsImI0IiwiYjUiLCJiNiIsImI3IiwiYjgiLCJiOSIsImJhIiwiYmIiLCJiYyIsImJkIiwiYmUiLCJiZiIsImMwIiwiYzEiLCJjMiIsImMzIiwiYzQiLCJjNSIsImM2IiwiYzciLCJjOCIsImM5IiwiY2EiLCJjYiIsImNjIiwiY2QiLCJjZSIsImNmIiwiZDAiLCJkMSIsImQyIiwiZDMiLCJkNCIsImQ1IiwiZDYiLCJkNyIsImQ4IiwiZDkiLCJkYSIsImRiIiwiZGMiLCJkZCIsImRlIiwiZGYiLCJlMCIsImUxIiwiZTIiLCJlMyIsImU0IiwiZTUiLCJlNiIsImU3IiwiZTgiLCJlOSIsImVhIiwiZWIiLCJlYyIsImVkIiwiZWUiLCJlZiIsImYwIiwiZjEiLCJmMiIsImYzIiwiZjQiLCJmNSIsImY2IiwiZjciLCJmOCIsImY5IiwiZmEiLCJmYiIsImZjIiwiZmQiLCJmZSIsImZmIl07ZnVuY3Rpb24gRG4oKXtjb25zdCBpPU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5NXwwLHQ9TWF0aC5yYW5kb20oKSo0Mjk0OTY3Mjk1fDAsZT1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MCxuPU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5NXwwO3JldHVybihQdFtpJjI1NV0rUHRbaT4+OCYyNTVdK1B0W2k+PjE2JjI1NV0rUHRbaT4+MjQmMjU1XSsiLSIrUHRbdCYyNTVdK1B0W3Q+PjgmMjU1XSsiLSIrUHRbdD4+MTYmMTV8NjRdK1B0W3Q+PjI0JjI1NV0rIi0iK1B0W2UmNjN8MTI4XStQdFtlPj44JjI1NV0rIi0iK1B0W2U+PjE2JjI1NV0rUHRbZT4+MjQmMjU1XStQdFtuJjI1NV0rUHRbbj4+OCYyNTVdK1B0W24+PjE2JjI1NV0rUHRbbj4+MjQmMjU1XSkudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBXKGksdCxlKXtyZXR1cm4gTWF0aC5tYXgodCxNYXRoLm1pbihlLGkpKX1mdW5jdGlvbiBwZihpLHQpe3JldHVybihpJXQrdCkldH1mdW5jdGlvbiBobyhpLHQsZSl7cmV0dXJuKDEtZSkqaStlKnR9ZnVuY3Rpb24gX2koaSx0KXtzd2l0Y2godC5jb25zdHJ1Y3Rvcil7Y2FzZSBGbG9hdDMyQXJyYXk6cmV0dXJuIGk7Y2FzZSBVaW50MzJBcnJheTpyZXR1cm4gaS80Mjk0OTY3Mjk1O2Nhc2UgVWludDE2QXJyYXk6cmV0dXJuIGkvNjU1MzU7Y2FzZSBVaW50OEFycmF5OnJldHVybiBpLzI1NTtjYXNlIEludDMyQXJyYXk6cmV0dXJuIE1hdGgubWF4KGkvMjE0NzQ4MzY0NywtMSk7Y2FzZSBJbnQxNkFycmF5OnJldHVybiBNYXRoLm1heChpLzMyNzY3LC0xKTtjYXNlIEludDhBcnJheTpyZXR1cm4gTWF0aC5tYXgoaS8xMjcsLTEpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCB0eXBlLiIpfX1mdW5jdGlvbiBVdChpLHQpe3N3aXRjaCh0LmNvbnN0cnVjdG9yKXtjYXNlIEZsb2F0MzJBcnJheTpyZXR1cm4gaTtjYXNlIFVpbnQzMkFycmF5OnJldHVybiBNYXRoLnJvdW5kKGkqNDI5NDk2NzI5NSk7Y2FzZSBVaW50MTZBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChpKjY1NTM1KTtjYXNlIFVpbnQ4QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSoyNTUpO2Nhc2UgSW50MzJBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChpKjIxNDc0ODM2NDcpO2Nhc2UgSW50MTZBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChpKjMyNzY3KTtjYXNlIEludDhBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChpKjEyNyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHR5cGUuIil9fWNsYXNzIE57Y29uc3RydWN0b3IodD0wLGU9MCl7Ti5wcm90b3R5cGUuaXNWZWN0b3IyPSEwLHRoaXMueD10LHRoaXMueT1lfWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnh9c2V0IHdpZHRoKHQpe3RoaXMueD10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy55fXNldCBoZWlnaHQodCl7dGhpcy55PXR9c2V0KHQsZSl7cmV0dXJuIHRoaXMueD10LHRoaXMueT1lLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscz10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9c1swXSplK3NbM10qbitzWzZdLHRoaXMueT1zWzFdKmUrc1s0XSpuK3NbN10sdGhpc31taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9Vyh0aGlzLngsdC54LGUueCksdGhpcy55PVcodGhpcy55LHQueSxlLnkpLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PVcodGhpcy54LHQsZSksdGhpcy55PVcodGhpcy55LHQsZSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IG49dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobnx8MSkubXVsdGlwbHlTY2FsYXIoVyhuLHQsZSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD1NYXRoLnRydW5jKHRoaXMueCksdGhpcy55PU1hdGgudHJ1bmModGhpcy55KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55fWNyb3NzKHQpe3JldHVybiB0aGlzLngqdC55LXRoaXMueSp0Lnh9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55KX1tYW5oYXR0YW5MZW5ndGgoKXtyZXR1cm4gTWF0aC5hYnModGhpcy54KStNYXRoLmFicyh0aGlzLnkpfW5vcm1hbGl6ZSgpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX1hbmdsZSgpe3JldHVybiBNYXRoLmF0YW4yKC10aGlzLnksLXRoaXMueCkrTWF0aC5QSX1hbmdsZVRvKHQpe2NvbnN0IGU9TWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSp0Lmxlbmd0aFNxKCkpO2lmKGU9PT0wKXJldHVybiBNYXRoLlBJLzI7Y29uc3Qgbj10aGlzLmRvdCh0KS9lO3JldHVybiBNYXRoLmFjb3MoVyhuLC0xLDEpKX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LG49dGhpcy55LXQueTtyZXR1cm4gZSplK24qbn1tYW5oYXR0YW5EaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLngtdC54KStNYXRoLmFicyh0aGlzLnktdC55KX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnl9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLng9dC5nZXRYKGUpLHRoaXMueT10LmdldFkoZSksdGhpc31yb3RhdGVBcm91bmQodCxlKXtjb25zdCBuPU1hdGguY29zKGUpLHM9TWF0aC5zaW4oZSkscj10aGlzLngtdC54LG89dGhpcy55LXQueTtyZXR1cm4gdGhpcy54PXIqbi1vKnMrdC54LHRoaXMueT1yKnMrbypuK3QueSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnl9fWNsYXNzIHppe2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0wLHM9MSl7dGhpcy5pc1F1YXRlcm5pb249ITAsdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fdz1zfXN0YXRpYyBzbGVycEZsYXQodCxlLG4scyxyLG8sYSl7bGV0IGM9bltzKzBdLGw9bltzKzFdLGg9bltzKzJdLHU9bltzKzNdLGY9cltvKzBdLGQ9cltvKzFdLHA9cltvKzJdLHk9cltvKzNdO2lmKGE8PTApe3RbZSswXT1jLHRbZSsxXT1sLHRbZSsyXT1oLHRbZSszXT11O3JldHVybn1pZihhPj0xKXt0W2UrMF09Zix0W2UrMV09ZCx0W2UrMl09cCx0W2UrM109eTtyZXR1cm59aWYodSE9PXl8fGMhPT1mfHxsIT09ZHx8aCE9PXApe2xldCBnPWMqZitsKmQraCpwK3UqeTtnPDAmJihmPS1mLGQ9LWQscD0tcCx5PS15LGc9LWcpO2xldCB3PTEtYTtpZihnPC45OTk1KXtjb25zdCBiPU1hdGguYWNvcyhnKSx4PU1hdGguc2luKGIpO3c9TWF0aC5zaW4odypiKS94LGE9TWF0aC5zaW4oYSpiKS94LGM9Yyp3K2YqYSxsPWwqdytkKmEsaD1oKncrcCphLHU9dSp3K3kqYX1lbHNle2M9Yyp3K2YqYSxsPWwqdytkKmEsaD1oKncrcCphLHU9dSp3K3kqYTtjb25zdCBiPTEvTWF0aC5zcXJ0KGMqYytsKmwraCpoK3UqdSk7Yyo9YixsKj1iLGgqPWIsdSo9Yn19dFtlXT1jLHRbZSsxXT1sLHRbZSsyXT1oLHRbZSszXT11fXN0YXRpYyBtdWx0aXBseVF1YXRlcm5pb25zRmxhdCh0LGUsbixzLHIsbyl7Y29uc3QgYT1uW3NdLGM9bltzKzFdLGw9bltzKzJdLGg9bltzKzNdLHU9cltvXSxmPXJbbysxXSxkPXJbbysyXSxwPXJbbyszXTtyZXR1cm4gdFtlXT1hKnAraCp1K2MqZC1sKmYsdFtlKzFdPWMqcCtoKmYrbCp1LWEqZCx0W2UrMl09bCpwK2gqZCthKmYtYyp1LHRbZSszXT1oKnAtYSp1LWMqZi1sKmQsdH1nZXQgeCgpe3JldHVybiB0aGlzLl94fXNldCB4KHQpe3RoaXMuX3g9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHkoKXtyZXR1cm4gdGhpcy5feX1zZXQgeSh0KXt0aGlzLl95PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB6KCl7cmV0dXJuIHRoaXMuX3p9c2V0IHoodCl7dGhpcy5fej10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgdygpe3JldHVybiB0aGlzLl93fXNldCB3KHQpe3RoaXMuX3c9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9c2V0KHQsZSxuLHMpe3JldHVybiB0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl93PXMsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3osdGhpcy5fdyl9Y29weSh0KXtyZXR1cm4gdGhpcy5feD10LngsdGhpcy5feT10LnksdGhpcy5fej10LnosdGhpcy5fdz10LncsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbUV1bGVyKHQsZT0hMCl7Y29uc3Qgbj10Ll94LHM9dC5feSxyPXQuX3osbz10Ll9vcmRlcixhPU1hdGguY29zLGM9TWF0aC5zaW4sbD1hKG4vMiksaD1hKHMvMiksdT1hKHIvMiksZj1jKG4vMiksZD1jKHMvMikscD1jKHIvMik7c3dpdGNoKG8pe2Nhc2UiWFlaIjp0aGlzLl94PWYqaCp1K2wqZCpwLHRoaXMuX3k9bCpkKnUtZipoKnAsdGhpcy5fej1sKmgqcCtmKmQqdSx0aGlzLl93PWwqaCp1LWYqZCpwO2JyZWFrO2Nhc2UiWVhaIjp0aGlzLl94PWYqaCp1K2wqZCpwLHRoaXMuX3k9bCpkKnUtZipoKnAsdGhpcy5fej1sKmgqcC1mKmQqdSx0aGlzLl93PWwqaCp1K2YqZCpwO2JyZWFrO2Nhc2UiWlhZIjp0aGlzLl94PWYqaCp1LWwqZCpwLHRoaXMuX3k9bCpkKnUrZipoKnAsdGhpcy5fej1sKmgqcCtmKmQqdSx0aGlzLl93PWwqaCp1LWYqZCpwO2JyZWFrO2Nhc2UiWllYIjp0aGlzLl94PWYqaCp1LWwqZCpwLHRoaXMuX3k9bCpkKnUrZipoKnAsdGhpcy5fej1sKmgqcC1mKmQqdSx0aGlzLl93PWwqaCp1K2YqZCpwO2JyZWFrO2Nhc2UiWVpYIjp0aGlzLl94PWYqaCp1K2wqZCpwLHRoaXMuX3k9bCpkKnUrZipoKnAsdGhpcy5fej1sKmgqcC1mKmQqdSx0aGlzLl93PWwqaCp1LWYqZCpwO2JyZWFrO2Nhc2UiWFpZIjp0aGlzLl94PWYqaCp1LWwqZCpwLHRoaXMuX3k9bCpkKnUtZipoKnAsdGhpcy5fej1sKmgqcCtmKmQqdSx0aGlzLl93PWwqaCp1K2YqZCpwO2JyZWFrO2RlZmF1bHQ6dnQoIlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIG9yZGVyOiAiK28pfXJldHVybiBlPT09ITAmJnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21BeGlzQW5nbGUodCxlKXtjb25zdCBuPWUvMixzPU1hdGguc2luKG4pO3JldHVybiB0aGlzLl94PXQueCpzLHRoaXMuX3k9dC55KnMsdGhpcy5fej10Lnoqcyx0aGlzLl93PU1hdGguY29zKG4pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Sb3RhdGlvbk1hdHJpeCh0KXtjb25zdCBlPXQuZWxlbWVudHMsbj1lWzBdLHM9ZVs0XSxyPWVbOF0sbz1lWzFdLGE9ZVs1XSxjPWVbOV0sbD1lWzJdLGg9ZVs2XSx1PWVbMTBdLGY9bithK3U7aWYoZj4wKXtjb25zdCBkPS41L01hdGguc3FydChmKzEpO3RoaXMuX3c9LjI1L2QsdGhpcy5feD0oaC1jKSpkLHRoaXMuX3k9KHItbCkqZCx0aGlzLl96PShvLXMpKmR9ZWxzZSBpZihuPmEmJm4+dSl7Y29uc3QgZD0yKk1hdGguc3FydCgxK24tYS11KTt0aGlzLl93PShoLWMpL2QsdGhpcy5feD0uMjUqZCx0aGlzLl95PShzK28pL2QsdGhpcy5fej0ocitsKS9kfWVsc2UgaWYoYT51KXtjb25zdCBkPTIqTWF0aC5zcXJ0KDErYS1uLXUpO3RoaXMuX3c9KHItbCkvZCx0aGlzLl94PShzK28pL2QsdGhpcy5feT0uMjUqZCx0aGlzLl96PShjK2gpL2R9ZWxzZXtjb25zdCBkPTIqTWF0aC5zcXJ0KDErdS1uLWEpO3RoaXMuX3c9KG8tcykvZCx0aGlzLl94PShyK2wpL2QsdGhpcy5feT0oYytoKS9kLHRoaXMuX3o9LjI1KmR9cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Vbml0VmVjdG9ycyh0LGUpe2xldCBuPXQuZG90KGUpKzE7cmV0dXJuIG48MWUtOD8obj0wLE1hdGguYWJzKHQueCk+TWF0aC5hYnModC56KT8odGhpcy5feD0tdC55LHRoaXMuX3k9dC54LHRoaXMuX3o9MCx0aGlzLl93PW4pOih0aGlzLl94PTAsdGhpcy5feT0tdC56LHRoaXMuX3o9dC55LHRoaXMuX3c9bikpOih0aGlzLl94PXQueSplLnotdC56KmUueSx0aGlzLl95PXQueiplLngtdC54KmUueix0aGlzLl96PXQueCplLnktdC55KmUueCx0aGlzLl93PW4pLHRoaXMubm9ybWFsaXplKCl9YW5nbGVUbyh0KXtyZXR1cm4gMipNYXRoLmFjb3MoTWF0aC5hYnMoVyh0aGlzLmRvdCh0KSwtMSwxKSkpfXJvdGF0ZVRvd2FyZHModCxlKXtjb25zdCBuPXRoaXMuYW5nbGVUbyh0KTtpZihuPT09MClyZXR1cm4gdGhpcztjb25zdCBzPU1hdGgubWluKDEsZS9uKTtyZXR1cm4gdGhpcy5zbGVycCh0LHMpLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMSl9aW52ZXJ0KCl7cmV0dXJuIHRoaXMuY29uanVnYXRlKCl9Y29uanVnYXRlKCl7cmV0dXJuIHRoaXMuX3gqPS0xLHRoaXMuX3kqPS0xLHRoaXMuX3oqPS0xLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy5feCp0Ll94K3RoaXMuX3kqdC5feSt0aGlzLl96KnQuX3ordGhpcy5fdyp0Ll93fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fd31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fdyl9bm9ybWFsaXplKCl7bGV0IHQ9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdD09PTA/KHRoaXMuX3g9MCx0aGlzLl95PTAsdGhpcy5fej0wLHRoaXMuX3c9MSk6KHQ9MS90LHRoaXMuX3g9dGhpcy5feCp0LHRoaXMuX3k9dGhpcy5feSp0LHRoaXMuX3o9dGhpcy5feip0LHRoaXMuX3c9dGhpcy5fdyp0KSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0LHRoaXMpfW11bHRpcGx5UXVhdGVybmlvbnModCxlKXtjb25zdCBuPXQuX3gscz10Ll95LHI9dC5feixvPXQuX3csYT1lLl94LGM9ZS5feSxsPWUuX3osaD1lLl93O3JldHVybiB0aGlzLl94PW4qaCtvKmErcypsLXIqYyx0aGlzLl95PXMqaCtvKmMrciphLW4qbCx0aGlzLl96PXIqaCtvKmwrbipjLXMqYSx0aGlzLl93PW8qaC1uKmEtcypjLXIqbCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycCh0LGUpe2lmKGU8PTApcmV0dXJuIHRoaXM7aWYoZT49MSlyZXR1cm4gdGhpcy5jb3B5KHQpO2xldCBuPXQuX3gscz10Ll95LHI9dC5feixvPXQuX3csYT10aGlzLmRvdCh0KTthPDAmJihuPS1uLHM9LXMscj0tcixvPS1vLGE9LWEpO2xldCBjPTEtZTtpZihhPC45OTk1KXtjb25zdCBsPU1hdGguYWNvcyhhKSxoPU1hdGguc2luKGwpO2M9TWF0aC5zaW4oYypsKS9oLGU9TWF0aC5zaW4oZSpsKS9oLHRoaXMuX3g9dGhpcy5feCpjK24qZSx0aGlzLl95PXRoaXMuX3kqYytzKmUsdGhpcy5fej10aGlzLl96KmMrciplLHRoaXMuX3c9dGhpcy5fdypjK28qZSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9ZWxzZSB0aGlzLl94PXRoaXMuX3gqYytuKmUsdGhpcy5feT10aGlzLl95KmMrcyplLHRoaXMuX3o9dGhpcy5feipjK3IqZSx0aGlzLl93PXRoaXMuX3cqYytvKmUsdGhpcy5ub3JtYWxpemUoKTtyZXR1cm4gdGhpc31zbGVycFF1YXRlcm5pb25zKHQsZSxuKXtyZXR1cm4gdGhpcy5jb3B5KHQpLnNsZXJwKGUsbil9cmFuZG9tKCl7Y29uc3QgdD0yKk1hdGguUEkqTWF0aC5yYW5kb20oKSxlPTIqTWF0aC5QSSpNYXRoLnJhbmRvbSgpLG49TWF0aC5yYW5kb20oKSxzPU1hdGguc3FydCgxLW4pLHI9TWF0aC5zcXJ0KG4pO3JldHVybiB0aGlzLnNldChzKk1hdGguc2luKHQpLHMqTWF0aC5jb3ModCkscipNYXRoLnNpbihlKSxyKk1hdGguY29zKGUpKX1lcXVhbHModCl7cmV0dXJuIHQuX3g9PT10aGlzLl94JiZ0Ll95PT09dGhpcy5feSYmdC5fej09PXRoaXMuX3omJnQuX3c9PT10aGlzLl93fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMuX3g9dFtlXSx0aGlzLl95PXRbZSsxXSx0aGlzLl96PXRbZSsyXSx0aGlzLl93PXRbZSszXSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLl94LHRbZSsxXT10aGlzLl95LHRbZSsyXT10aGlzLl96LHRbZSszXT10aGlzLl93LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLl94PXQuZ2V0WChlKSx0aGlzLl95PXQuZ2V0WShlKSx0aGlzLl96PXQuZ2V0WihlKSx0aGlzLl93PXQuZ2V0VyhlKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0pTT04oKXtyZXR1cm4gdGhpcy50b0FycmF5KCl9X29uQ2hhbmdlKHQpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPXQsdGhpc31fb25DaGFuZ2VDYWxsYmFjaygpe30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLl94LHlpZWxkIHRoaXMuX3kseWllbGQgdGhpcy5feix5aWVsZCB0aGlzLl93fX1jbGFzcyBQe2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0wKXtQLnByb3RvdHlwZS5pc1ZlY3RvcjM9ITAsdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PW59c2V0KHQsZSxuKXtyZXR1cm4gbj09PXZvaWQgMCYmKG49dGhpcy56KSx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztjYXNlIDI6dGhpcy56PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQueix0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXN9YWRkVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54K2UueCx0aGlzLnk9dC55K2UueSx0aGlzLno9dC56K2Uueix0aGlzfWFkZFNjYWxlZFZlY3Rvcih0LGUpe3JldHVybiB0aGlzLngrPXQueCplLHRoaXMueSs9dC55KmUsdGhpcy56Kz10LnoqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzLnoqPXQueix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXMueio9dCx0aGlzfW11bHRpcGx5VmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54KmUueCx0aGlzLnk9dC55KmUueSx0aGlzLno9dC56KmUueix0aGlzfWFwcGx5RXVsZXIodCl7cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKFJjLnNldEZyb21FdWxlcih0KSl9YXBwbHlBeGlzQW5nbGUodCxlKXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oUmMuc2V0RnJvbUF4aXNBbmdsZSh0LGUpKX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscz10aGlzLnoscj10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9clswXSplK3JbM10qbityWzZdKnMsdGhpcy55PXJbMV0qZStyWzRdKm4rcls3XSpzLHRoaXMuej1yWzJdKmUrcls1XSpuK3JbOF0qcyx0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4Myh0KS5ub3JtYWxpemUoKX1hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscz10aGlzLnoscj10LmVsZW1lbnRzLG89MS8oclszXSplK3JbN10qbityWzExXSpzK3JbMTVdKTtyZXR1cm4gdGhpcy54PShyWzBdKmUrcls0XSpuK3JbOF0qcytyWzEyXSkqbyx0aGlzLnk9KHJbMV0qZStyWzVdKm4rcls5XSpzK3JbMTNdKSpvLHRoaXMuej0oclsyXSplK3JbNl0qbityWzEwXSpzK3JbMTRdKSpvLHRoaXN9YXBwbHlRdWF0ZXJuaW9uKHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHM9dGhpcy56LHI9dC54LG89dC55LGE9dC56LGM9dC53LGw9MioobypzLWEqbiksaD0yKihhKmUtcipzKSx1PTIqKHIqbi1vKmUpO3JldHVybiB0aGlzLng9ZStjKmwrbyp1LWEqaCx0aGlzLnk9bitjKmgrYSpsLXIqdSx0aGlzLno9cytjKnUrcipoLW8qbCx0aGlzfXByb2plY3QodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGRJbnZlcnNlKS5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4KX11bnByb2plY3QodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KHQucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKX10cmFuc2Zvcm1EaXJlY3Rpb24odCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscz10aGlzLnoscj10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9clswXSplK3JbNF0qbityWzhdKnMsdGhpcy55PXJbMV0qZStyWzVdKm4rcls5XSpzLHRoaXMuej1yWzJdKmUrcls2XSpuK3JbMTBdKnMsdGhpcy5ub3JtYWxpemUoKX1kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXMuei89dC56LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzfW1heCh0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksdC55KSx0aGlzLno9TWF0aC5tYXgodGhpcy56LHQueiksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9Vyh0aGlzLngsdC54LGUueCksdGhpcy55PVcodGhpcy55LHQueSxlLnkpLHRoaXMuej1XKHRoaXMueix0LnosZS56KSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1XKHRoaXMueCx0LGUpLHRoaXMueT1XKHRoaXMueSx0LGUpLHRoaXMuej1XKHRoaXMueix0LGUpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKFcobix0LGUpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpcy56PU1hdGguZmxvb3IodGhpcy56KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzLno9TWF0aC5jZWlsKHRoaXMueiksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpcy56PU1hdGgucm91bmQodGhpcy56KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD1NYXRoLnRydW5jKHRoaXMueCksdGhpcy55PU1hdGgudHJ1bmModGhpcy55KSx0aGlzLno9TWF0aC50cnVuYyh0aGlzLnopLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXMuej0tdGhpcy56LHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLngqdC54K3RoaXMueSp0LnkrdGhpcy56KnQuen1sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMuen1sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56KX1tYW5oYXR0YW5MZW5ndGgoKXtyZXR1cm4gTWF0aC5hYnModGhpcy54KStNYXRoLmFicyh0aGlzLnkpK01hdGguYWJzKHRoaXMueil9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzLnorPSh0LnotdGhpcy56KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpcy56PXQueisoZS56LXQueikqbix0aGlzfWNyb3NzKHQpe3JldHVybiB0aGlzLmNyb3NzVmVjdG9ycyh0aGlzLHQpfWNyb3NzVmVjdG9ycyh0LGUpe2NvbnN0IG49dC54LHM9dC55LHI9dC56LG89ZS54LGE9ZS55LGM9ZS56O3JldHVybiB0aGlzLng9cypjLXIqYSx0aGlzLnk9cipvLW4qYyx0aGlzLno9biphLXMqbyx0aGlzfXByb2plY3RPblZlY3Rvcih0KXtjb25zdCBlPXQubGVuZ3RoU3EoKTtpZihlPT09MClyZXR1cm4gdGhpcy5zZXQoMCwwLDApO2NvbnN0IG49dC5kb3QodGhpcykvZTtyZXR1cm4gdGhpcy5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKG4pfXByb2plY3RPblBsYW5lKHQpe3JldHVybiB1by5jb3B5KHRoaXMpLnByb2plY3RPblZlY3Rvcih0KSx0aGlzLnN1Yih1byl9cmVmbGVjdCh0KXtyZXR1cm4gdGhpcy5zdWIodW8uY29weSh0KS5tdWx0aXBseVNjYWxhcigyKnRoaXMuZG90KHQpKSl9YW5nbGVUbyh0KXtjb25zdCBlPU1hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqdC5sZW5ndGhTcSgpKTtpZihlPT09MClyZXR1cm4gTWF0aC5QSS8yO2NvbnN0IG49dGhpcy5kb3QodCkvZTtyZXR1cm4gTWF0aC5hY29zKFcobiwtMSwxKSl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnkscz10aGlzLnotdC56O3JldHVybiBlKmUrbipuK3Mqc31tYW5oYXR0YW5EaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLngtdC54KStNYXRoLmFicyh0aGlzLnktdC55KStNYXRoLmFicyh0aGlzLnotdC56KX1zZXRGcm9tU3BoZXJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHModC5yYWRpdXMsdC5waGksdC50aGV0YSl9c2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LGUsbil7Y29uc3Qgcz1NYXRoLnNpbihlKSp0O3JldHVybiB0aGlzLng9cypNYXRoLnNpbihuKSx0aGlzLnk9TWF0aC5jb3MoZSkqdCx0aGlzLno9cypNYXRoLmNvcyhuKSx0aGlzfXNldEZyb21DeWxpbmRyaWNhbCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHModC5yYWRpdXMsdC50aGV0YSx0LnkpfXNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LGUsbil7cmV0dXJuIHRoaXMueD10Kk1hdGguc2luKGUpLHRoaXMueT1uLHRoaXMuej10Kk1hdGguY29zKGUpLHRoaXN9c2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWVbMTJdLHRoaXMueT1lWzEzXSx0aGlzLno9ZVsxNF0sdGhpc31zZXRGcm9tTWF0cml4U2NhbGUodCl7Y29uc3QgZT10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwwKS5sZW5ndGgoKSxuPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLHM9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMikubGVuZ3RoKCk7cmV0dXJuIHRoaXMueD1lLHRoaXMueT1uLHRoaXMuej1zLHRoaXN9c2V0RnJvbU1hdHJpeENvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLGUqNCl9c2V0RnJvbU1hdHJpeDNDb2x1bW4odCxlKXtyZXR1cm4gdGhpcy5mcm9tQXJyYXkodC5lbGVtZW50cyxlKjMpfXNldEZyb21FdWxlcih0KXtyZXR1cm4gdGhpcy54PXQuX3gsdGhpcy55PXQuX3ksdGhpcy56PXQuX3osdGhpc31zZXRGcm9tQ29sb3IodCl7cmV0dXJuIHRoaXMueD10LnIsdGhpcy55PXQuZyx0aGlzLno9dC5iLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueSYmdC56PT09dGhpcy56fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpcy56PXRbZSsyXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHRbZSsyXT10aGlzLnosdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXN9cmFuZG9tRGlyZWN0aW9uKCl7Y29uc3QgdD1NYXRoLnJhbmRvbSgpKk1hdGguUEkqMixlPU1hdGgucmFuZG9tKCkqMi0xLG49TWF0aC5zcXJ0KDEtZSplKTtyZXR1cm4gdGhpcy54PW4qTWF0aC5jb3ModCksdGhpcy55PWUsdGhpcy56PW4qTWF0aC5zaW4odCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55LHlpZWxkIHRoaXMuen19Y29uc3QgdW89bmV3IFAsUmM9bmV3IHppO2NsYXNzIE1le2NvbnN0cnVjdG9yKHQsZSxuLHMscixvLGEsYyxsKXtNZS5wcm90b3R5cGUuaXNNYXRyaXgzPSEwLHRoaXMuZWxlbWVudHM9WzEsMCwwLDAsMSwwLDAsMCwxXSx0IT09dm9pZCAwJiZ0aGlzLnNldCh0LGUsbixzLHIsbyxhLGMsbCl9c2V0KHQsZSxuLHMscixvLGEsYyxsKXtjb25zdCBoPXRoaXMuZWxlbWVudHM7cmV0dXJuIGhbMF09dCxoWzFdPXMsaFsyXT1hLGhbM109ZSxoWzRdPXIsaFs1XT1jLGhbNl09bixoWzddPW8saFs4XT1sLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwxLDAsMCwwLDEpLHRoaXN9Y29weSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO3JldHVybiBlWzBdPW5bMF0sZVsxXT1uWzFdLGVbMl09blsyXSxlWzNdPW5bM10sZVs0XT1uWzRdLGVbNV09bls1XSxlWzZdPW5bNl0sZVs3XT1uWzddLGVbOF09bls4XSx0aGlzfWV4dHJhY3RCYXNpcyh0LGUsbil7cmV0dXJuIHQuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywwKSxlLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMSksbi5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDIpLHRoaXN9c2V0RnJvbU1hdHJpeDQodCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnNldChlWzBdLGVbNF0sZVs4XSxlWzFdLGVbNV0sZVs5XSxlWzJdLGVbNl0sZVsxMF0pLHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLHQpfXByZW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModCx0aGlzKX1tdWx0aXBseU1hdHJpY2VzKHQsZSl7Y29uc3Qgbj10LmVsZW1lbnRzLHM9ZS5lbGVtZW50cyxyPXRoaXMuZWxlbWVudHMsbz1uWzBdLGE9blszXSxjPW5bNl0sbD1uWzFdLGg9bls0XSx1PW5bN10sZj1uWzJdLGQ9bls1XSxwPW5bOF0seT1zWzBdLGc9c1szXSx3PXNbNl0sYj1zWzFdLHg9c1s0XSxtPXNbN10sTT1zWzJdLFM9c1s1XSxBPXNbOF07cmV0dXJuIHJbMF09byp5K2EqYitjKk0sclszXT1vKmcrYSp4K2MqUyxyWzZdPW8qdythKm0rYypBLHJbMV09bCp5K2gqYit1Kk0scls0XT1sKmcraCp4K3UqUyxyWzddPWwqdytoKm0rdSpBLHJbMl09Zip5K2QqYitwKk0scls1XT1mKmcrZCp4K3AqUyxyWzhdPWYqdytkKm0rcCpBLHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbM10qPXQsZVs2XSo9dCxlWzFdKj10LGVbNF0qPXQsZVs3XSo9dCxlWzJdKj10LGVbNV0qPXQsZVs4XSo9dCx0aGlzfWRldGVybWluYW50KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbMV0scz10WzJdLHI9dFszXSxvPXRbNF0sYT10WzVdLGM9dFs2XSxsPXRbN10saD10WzhdO3JldHVybiBlKm8qaC1lKmEqbC1uKnIqaCtuKmEqYytzKnIqbC1zKm8qY31pbnZlcnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFsxXSxzPXRbMl0scj10WzNdLG89dFs0XSxhPXRbNV0sYz10WzZdLGw9dFs3XSxoPXRbOF0sdT1oKm8tYSpsLGY9YSpjLWgqcixkPWwqci1vKmMscD1lKnUrbipmK3MqZDtpZihwPT09MClyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDApO2NvbnN0IHk9MS9wO3JldHVybiB0WzBdPXUqeSx0WzFdPShzKmwtaCpuKSp5LHRbMl09KGEqbi1zKm8pKnksdFszXT1mKnksdFs0XT0oaCplLXMqYykqeSx0WzVdPShzKnItYSplKSp5LHRbNl09ZCp5LHRbN109KG4qYy1sKmUpKnksdFs4XT0obyplLW4qcikqeSx0aGlzfXRyYW5zcG9zZSgpe2xldCB0O2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gdD1lWzFdLGVbMV09ZVszXSxlWzNdPXQsdD1lWzJdLGVbMl09ZVs2XSxlWzZdPXQsdD1lWzVdLGVbNV09ZVs3XSxlWzddPXQsdGhpc31nZXROb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeDQodCkuaW52ZXJ0KCkudHJhbnNwb3NlKCl9dHJhbnNwb3NlSW50b0FycmF5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVszXSx0WzJdPWVbNl0sdFszXT1lWzFdLHRbNF09ZVs0XSx0WzVdPWVbN10sdFs2XT1lWzJdLHRbN109ZVs1XSx0WzhdPWVbOF0sdGhpc31zZXRVdlRyYW5zZm9ybSh0LGUsbixzLHIsbyxhKXtjb25zdCBjPU1hdGguY29zKHIpLGw9TWF0aC5zaW4ocik7cmV0dXJuIHRoaXMuc2V0KG4qYyxuKmwsLW4qKGMqbytsKmEpK28rdCwtcypsLHMqYywtcyooLWwqbytjKmEpK2ErZSwwLDAsMSksdGhpc31zY2FsZSh0LGUpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KGZvLm1ha2VTY2FsZSh0LGUpKSx0aGlzfXJvdGF0ZSh0KXtyZXR1cm4gdGhpcy5wcmVtdWx0aXBseShmby5tYWtlUm90YXRpb24oLXQpKSx0aGlzfXRyYW5zbGF0ZSh0LGUpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KGZvLm1ha2VUcmFuc2xhdGlvbih0LGUpKSx0aGlzfW1ha2VUcmFuc2xhdGlvbih0LGUpe3JldHVybiB0LmlzVmVjdG9yMj90aGlzLnNldCgxLDAsdC54LDAsMSx0LnksMCwwLDEpOnRoaXMuc2V0KDEsMCx0LDAsMSxlLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbih0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsLW4sMCxuLGUsMCwwLDAsMSksdGhpc31tYWtlU2NhbGUodCxlKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCxlLDAsMCwwLDEpLHRoaXN9ZXF1YWxzKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7Zm9yKGxldCBzPTA7czw5O3MrKylpZihlW3NdIT09bltzXSlyZXR1cm4hMTtyZXR1cm4hMH1mcm9tQXJyYXkodCxlPTApe2ZvcihsZXQgbj0wO248OTtuKyspdGhpcy5lbGVtZW50c1tuXT10W24rZV07cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO3JldHVybiB0W2VdPW5bMF0sdFtlKzFdPW5bMV0sdFtlKzJdPW5bMl0sdFtlKzNdPW5bM10sdFtlKzRdPW5bNF0sdFtlKzVdPW5bNV0sdFtlKzZdPW5bNl0sdFtlKzddPW5bN10sdFtlKzhdPW5bOF0sdH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmZyb21BcnJheSh0aGlzLmVsZW1lbnRzKX19Y29uc3QgZm89bmV3IE1lLExjPW5ldyBNZSgpLnNldCguNDEyMzkwOCwuMzU3NTg0MywuMTgwNDgwOCwuMjEyNjM5LC43MTUxNjg3LC4wNzIxOTIzLC4wMTkzMzA4LC4xMTkxOTQ4LC45NTA1MzIyKSxPYz1uZXcgTWUoKS5zZXQoMy4yNDA5Njk5LC0xLjUzNzM4MzIsLS40OTg2MTA4LC0uOTY5MjQzNiwxLjg3NTk2NzUsLjA0MTU1NTEsLjA1NTYzMDEsLS4yMDM5NzcsMS4wNTY5NzE1KTtmdW5jdGlvbiB5Zigpe2NvbnN0IGk9e2VuYWJsZWQ6ITAsd29ya2luZ0NvbG9yU3BhY2U6RWMsc3BhY2VzOnt9LGNvbnZlcnQ6ZnVuY3Rpb24ocyxyLG8pe3JldHVybiB0aGlzLmVuYWJsZWQ9PT0hMXx8cj09PW98fCFyfHwhb3x8KHRoaXMuc3BhY2VzW3JdLnRyYW5zZmVyPT09bG8mJihzLnI9Q2Uocy5yKSxzLmc9Q2Uocy5nKSxzLmI9Q2Uocy5iKSksdGhpcy5zcGFjZXNbcl0ucHJpbWFyaWVzIT09dGhpcy5zcGFjZXNbb10ucHJpbWFyaWVzJiYocy5hcHBseU1hdHJpeDModGhpcy5zcGFjZXNbcl0udG9YWVopLHMuYXBwbHlNYXRyaXgzKHRoaXMuc3BhY2VzW29dLmZyb21YWVopKSx0aGlzLnNwYWNlc1tvXS50cmFuc2Zlcj09PWxvJiYocy5yPSRuKHMucikscy5nPSRuKHMuZykscy5iPSRuKHMuYikpKSxzfSx3b3JraW5nVG9Db2xvclNwYWNlOmZ1bmN0aW9uKHMscil7cmV0dXJuIHRoaXMuY29udmVydChzLHRoaXMud29ya2luZ0NvbG9yU3BhY2Uscil9LGNvbG9yU3BhY2VUb1dvcmtpbmc6ZnVuY3Rpb24ocyxyKXtyZXR1cm4gdGhpcy5jb252ZXJ0KHMscix0aGlzLndvcmtpbmdDb2xvclNwYWNlKX0sZ2V0UHJpbWFyaWVzOmZ1bmN0aW9uKHMpe3JldHVybiB0aGlzLnNwYWNlc1tzXS5wcmltYXJpZXN9LGdldFRyYW5zZmVyOmZ1bmN0aW9uKHMpe3JldHVybiBzPT09QmM/RmM6dGhpcy5zcGFjZXNbc10udHJhbnNmZXJ9LGdldFRvbmVNYXBwaW5nTW9kZTpmdW5jdGlvbihzKXtyZXR1cm4gdGhpcy5zcGFjZXNbc10ub3V0cHV0Q29sb3JTcGFjZUNvbmZpZy50b25lTWFwcGluZ01vZGV8fCJzdGFuZGFyZCJ9LGdldEx1bWluYW5jZUNvZWZmaWNpZW50czpmdW5jdGlvbihzLHI9dGhpcy53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHMuZnJvbUFycmF5KHRoaXMuc3BhY2VzW3JdLmx1bWluYW5jZUNvZWZmaWNpZW50cyl9LGRlZmluZTpmdW5jdGlvbihzKXtPYmplY3QuYXNzaWduKHRoaXMuc3BhY2VzLHMpfSxfZ2V0TWF0cml4OmZ1bmN0aW9uKHMscixvKXtyZXR1cm4gcy5jb3B5KHRoaXMuc3BhY2VzW3JdLnRvWFlaKS5tdWx0aXBseSh0aGlzLnNwYWNlc1tvXS5mcm9tWFlaKX0sX2dldERyYXdpbmdCdWZmZXJDb2xvclNwYWNlOmZ1bmN0aW9uKHMpe3JldHVybiB0aGlzLnNwYWNlc1tzXS5vdXRwdXRDb2xvclNwYWNlQ29uZmlnLmRyYXdpbmdCdWZmZXJDb2xvclNwYWNlfSxfZ2V0VW5wYWNrQ29sb3JTcGFjZTpmdW5jdGlvbihzPXRoaXMud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiB0aGlzLnNwYWNlc1tzXS53b3JraW5nQ29sb3JTcGFjZUNvbmZpZy51bnBhY2tDb2xvclNwYWNlfSxmcm9tV29ya2luZ0NvbG9yU3BhY2U6ZnVuY3Rpb24ocyxyKXtyZXR1cm4ga2MoIkNvbG9yTWFuYWdlbWVudDogLmZyb21Xb3JraW5nQ29sb3JTcGFjZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLndvcmtpbmdUb0NvbG9yU3BhY2UoKS4iKSxpLndvcmtpbmdUb0NvbG9yU3BhY2UocyxyKX0sdG9Xb3JraW5nQ29sb3JTcGFjZTpmdW5jdGlvbihzLHIpe3JldHVybiBrYygiQ29sb3JNYW5hZ2VtZW50OiAudG9Xb3JraW5nQ29sb3JTcGFjZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmNvbG9yU3BhY2VUb1dvcmtpbmcoKS4iKSxpLmNvbG9yU3BhY2VUb1dvcmtpbmcocyxyKX19LHQ9Wy42NCwuMzMsLjMsLjYsLjE1LC4wNl0sZT1bLjIxMjYsLjcxNTIsLjA3MjJdLG49Wy4zMTI3LC4zMjldO3JldHVybiBpLmRlZmluZSh7W0VjXTp7cHJpbWFyaWVzOnQsd2hpdGVQb2ludDpuLHRyYW5zZmVyOkZjLHRvWFlaOkxjLGZyb21YWVo6T2MsbHVtaW5hbmNlQ29lZmZpY2llbnRzOmUsd29ya2luZ0NvbG9yU3BhY2VDb25maWc6e3VucGFja0NvbG9yU3BhY2U6ZmV9LG91dHB1dENvbG9yU3BhY2VDb25maWc6e2RyYXdpbmdCdWZmZXJDb2xvclNwYWNlOmZlfX0sW2ZlXTp7cHJpbWFyaWVzOnQsd2hpdGVQb2ludDpuLHRyYW5zZmVyOmxvLHRvWFlaOkxjLGZyb21YWVo6T2MsbHVtaW5hbmNlQ29lZmZpY2llbnRzOmUsb3V0cHV0Q29sb3JTcGFjZUNvbmZpZzp7ZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6ZmV9fX0pLGl9Y29uc3QgZGU9eWYoKTtmdW5jdGlvbiBDZShpKXtyZXR1cm4gaTwuMDQwNDU/aSouMDc3Mzk5MzgwODpNYXRoLnBvdyhpKi45NDc4NjcyOTg2Ky4wNTIxMzI3MDE0LDIuNCl9ZnVuY3Rpb24gJG4oaSl7cmV0dXJuIGk8LjAwMzEzMDg/aSoxMi45MjoxLjA1NSpNYXRoLnBvdyhpLC40MTY2NiktLjA1NX1sZXQgVm47Y2xhc3MgbWZ7c3RhdGljIGdldERhdGFVUkwodCxlPSJpbWFnZS9wbmciKXtpZigvXmRhdGE6L2kudGVzdCh0LnNyYyl8fHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudD09InVuZGVmaW5lZCIpcmV0dXJuIHQuc3JjO2xldCBuO2lmKHQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCluPXQ7ZWxzZXtWbj09PXZvaWQgMCYmKFZuPUljKCJjYW52YXMiKSksVm4ud2lkdGg9dC53aWR0aCxWbi5oZWlnaHQ9dC5oZWlnaHQ7Y29uc3Qgcz1Wbi5nZXRDb250ZXh0KCIyZCIpO3QgaW5zdGFuY2VvZiBJbWFnZURhdGE/cy5wdXRJbWFnZURhdGEodCwwLDApOnMuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpLG49Vm59cmV0dXJuIG4udG9EYXRhVVJMKGUpfXN0YXRpYyBzUkdCVG9MaW5lYXIodCl7aWYodHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQhPSJ1bmRlZmluZWQiJiZ0IGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudHx8dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50IT0idW5kZWZpbmVkIiYmdCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHx0eXBlb2YgSW1hZ2VCaXRtYXAhPSJ1bmRlZmluZWQiJiZ0IGluc3RhbmNlb2YgSW1hZ2VCaXRtYXApe2NvbnN0IGU9SWMoImNhbnZhcyIpO2Uud2lkdGg9dC53aWR0aCxlLmhlaWdodD10LmhlaWdodDtjb25zdCBuPWUuZ2V0Q29udGV4dCgiMmQiKTtuLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KTtjb25zdCBzPW4uZ2V0SW1hZ2VEYXRhKDAsMCx0LndpZHRoLHQuaGVpZ2h0KSxyPXMuZGF0YTtmb3IobGV0IG89MDtvPHIubGVuZ3RoO28rKylyW29dPUNlKHJbb10vMjU1KSoyNTU7cmV0dXJuIG4ucHV0SW1hZ2VEYXRhKHMsMCwwKSxlfWVsc2UgaWYodC5kYXRhKXtjb25zdCBlPXQuZGF0YS5zbGljZSgwKTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyllIGluc3RhbmNlb2YgVWludDhBcnJheXx8ZSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5P2Vbbl09TWF0aC5mbG9vcihDZShlW25dLzI1NSkqMjU1KTplW25dPUNlKGVbbl0pO3JldHVybntkYXRhOmUsd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHR9fWVsc2UgcmV0dXJuIHZ0KCJJbWFnZVV0aWxzLnNSR0JUb0xpbmVhcigpOiBVbnN1cHBvcnRlZCBpbWFnZSB0eXBlLiBObyBjb2xvciBzcGFjZSBjb252ZXJzaW9uIGFwcGxpZWQuIiksdH19bGV0IGdmPTA7Y2xhc3MgeGZ7Y29uc3RydWN0b3IodD1udWxsKXt0aGlzLmlzU291cmNlPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOmdmKyt9KSx0aGlzLnV1aWQ9RG4oKSx0aGlzLmRhdGE9dCx0aGlzLmRhdGFSZWFkeT0hMCx0aGlzLnZlcnNpb249MH1nZXRTaXplKHQpe2NvbnN0IGU9dGhpcy5kYXRhO3JldHVybiB0eXBlb2YgSFRNTFZpZGVvRWxlbWVudCE9InVuZGVmaW5lZCImJmUgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50P3Quc2V0KGUudmlkZW9XaWR0aCxlLnZpZGVvSGVpZ2h0LDApOnR5cGVvZiBWaWRlb0ZyYW1lIT0idW5kZWZpbmVkIiYmZSBpbnN0YW5jZW9mIFZpZGVvRnJhbWU/dC5zZXQoZS5kaXNwbGF5SGVpZ2h0LGUuZGlzcGxheVdpZHRoLDApOmUhPT1udWxsP3Quc2V0KGUud2lkdGgsZS5oZWlnaHQsZS5kZXB0aHx8MCk6dC5zZXQoMCwwLDApLHR9c2V0IG5lZWRzVXBkYXRlKHQpe3Q9PT0hMCYmdGhpcy52ZXJzaW9uKyt9dG9KU09OKHQpe2NvbnN0IGU9dD09PXZvaWQgMHx8dHlwZW9mIHQ9PSJzdHJpbmciO2lmKCFlJiZ0LmltYWdlc1t0aGlzLnV1aWRdIT09dm9pZCAwKXJldHVybiB0LmltYWdlc1t0aGlzLnV1aWRdO2NvbnN0IG49e3V1aWQ6dGhpcy51dWlkLHVybDoiIn0scz10aGlzLmRhdGE7aWYocyE9PW51bGwpe2xldCByO2lmKEFycmF5LmlzQXJyYXkocykpe3I9W107Zm9yKGxldCBvPTAsYT1zLmxlbmd0aDtvPGE7bysrKXNbb10uaXNEYXRhVGV4dHVyZT9yLnB1c2gocG8oc1tvXS5pbWFnZSkpOnIucHVzaChwbyhzW29dKSl9ZWxzZSByPXBvKHMpO24udXJsPXJ9cmV0dXJuIGV8fCh0LmltYWdlc1t0aGlzLnV1aWRdPW4pLG59fWZ1bmN0aW9uIHBvKGkpe3JldHVybiB0eXBlb2YgSFRNTEltYWdlRWxlbWVudCE9InVuZGVmaW5lZCImJmkgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHx0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQhPSJ1bmRlZmluZWQiJiZpIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fHR5cGVvZiBJbWFnZUJpdG1hcCE9InVuZGVmaW5lZCImJmkgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcD9tZi5nZXREYXRhVVJMKGkpOmkuZGF0YT97ZGF0YTpBcnJheS5mcm9tKGkuZGF0YSksd2lkdGg6aS53aWR0aCxoZWlnaHQ6aS5oZWlnaHQsdHlwZTppLmRhdGEuY29uc3RydWN0b3IubmFtZX06KHZ0KCJUZXh0dXJlOiBVbmFibGUgdG8gc2VyaWFsaXplIFRleHR1cmUuIikse30pfWxldCB3Zj0wO2NvbnN0IHlvPW5ldyBQO2NsYXNzIG1uIGV4dGVuZHMgeXN7Y29uc3RydWN0b3IodD1tbi5ERUZBVUxUX0lNQUdFLGU9bW4uREVGQVVMVF9NQVBQSU5HLG49MTAwMSxzPTEwMDEscj0xMDA2LG89MTAwOCxhPTEwMjMsYz0xMDA5LGw9bW4uREVGQVVMVF9BTklTT1RST1BZLGg9QmMpe3N1cGVyKCksdGhpcy5pc1RleHR1cmU9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6d2YrK30pLHRoaXMudXVpZD1EbigpLHRoaXMubmFtZT0iIix0aGlzLnNvdXJjZT1uZXcgeGYodCksdGhpcy5taXBtYXBzPVtdLHRoaXMubWFwcGluZz1lLHRoaXMuY2hhbm5lbD0wLHRoaXMud3JhcFM9bix0aGlzLndyYXBUPXMsdGhpcy5tYWdGaWx0ZXI9cix0aGlzLm1pbkZpbHRlcj1vLHRoaXMuYW5pc290cm9weT1sLHRoaXMuZm9ybWF0PWEsdGhpcy5pbnRlcm5hbEZvcm1hdD1udWxsLHRoaXMudHlwZT1jLHRoaXMub2Zmc2V0PW5ldyBOKDAsMCksdGhpcy5yZXBlYXQ9bmV3IE4oMSwxKSx0aGlzLmNlbnRlcj1uZXcgTigwLDApLHRoaXMucm90YXRpb249MCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITAsdGhpcy5tYXRyaXg9bmV3IE1lLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSEwLHRoaXMucHJlbXVsdGlwbHlBbHBoYT0hMSx0aGlzLmZsaXBZPSEwLHRoaXMudW5wYWNrQWxpZ25tZW50PTQsdGhpcy5jb2xvclNwYWNlPWgsdGhpcy51c2VyRGF0YT17fSx0aGlzLnVwZGF0ZVJhbmdlcz1bXSx0aGlzLnZlcnNpb249MCx0aGlzLm9uVXBkYXRlPW51bGwsdGhpcy5yZW5kZXJUYXJnZXQ9bnVsbCx0aGlzLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMSx0aGlzLmlzQXJyYXlUZXh0dXJlPSEhKHQmJnQuZGVwdGgmJnQuZGVwdGg+MSksdGhpcy5wbXJlbVZlcnNpb249MH1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpcy5zb3VyY2UuZ2V0U2l6ZSh5bykueH1nZXQgaGVpZ2h0KCl7cmV0dXJuIHRoaXMuc291cmNlLmdldFNpemUoeW8pLnl9Z2V0IGRlcHRoKCl7cmV0dXJuIHRoaXMuc291cmNlLmdldFNpemUoeW8pLnp9Z2V0IGltYWdlKCl7cmV0dXJuIHRoaXMuc291cmNlLmRhdGF9c2V0IGltYWdlKHQ9bnVsbCl7dGhpcy5zb3VyY2UuZGF0YT10fXVwZGF0ZU1hdHJpeCgpe3RoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKHRoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueSx0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnksdGhpcy5yb3RhdGlvbix0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnkpfWFkZFVwZGF0ZVJhbmdlKHQsZSl7dGhpcy51cGRhdGVSYW5nZXMucHVzaCh7c3RhcnQ6dCxjb3VudDplfSl9Y2xlYXJVcGRhdGVSYW5nZXMoKXt0aGlzLnVwZGF0ZVJhbmdlcy5sZW5ndGg9MH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5uYW1lPXQubmFtZSx0aGlzLnNvdXJjZT10LnNvdXJjZSx0aGlzLm1pcG1hcHM9dC5taXBtYXBzLnNsaWNlKDApLHRoaXMubWFwcGluZz10Lm1hcHBpbmcsdGhpcy5jaGFubmVsPXQuY2hhbm5lbCx0aGlzLndyYXBTPXQud3JhcFMsdGhpcy53cmFwVD10LndyYXBULHRoaXMubWFnRmlsdGVyPXQubWFnRmlsdGVyLHRoaXMubWluRmlsdGVyPXQubWluRmlsdGVyLHRoaXMuYW5pc290cm9weT10LmFuaXNvdHJvcHksdGhpcy5mb3JtYXQ9dC5mb3JtYXQsdGhpcy5pbnRlcm5hbEZvcm1hdD10LmludGVybmFsRm9ybWF0LHRoaXMudHlwZT10LnR5cGUsdGhpcy5vZmZzZXQuY29weSh0Lm9mZnNldCksdGhpcy5yZXBlYXQuY29weSh0LnJlcGVhdCksdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5yb3RhdGlvbj10LnJvdGF0aW9uLHRoaXMubWF0cml4QXV0b1VwZGF0ZT10Lm1hdHJpeEF1dG9VcGRhdGUsdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5nZW5lcmF0ZU1pcG1hcHM9dC5nZW5lcmF0ZU1pcG1hcHMsdGhpcy5wcmVtdWx0aXBseUFscGhhPXQucHJlbXVsdGlwbHlBbHBoYSx0aGlzLmZsaXBZPXQuZmxpcFksdGhpcy51bnBhY2tBbGlnbm1lbnQ9dC51bnBhY2tBbGlnbm1lbnQsdGhpcy5jb2xvclNwYWNlPXQuY29sb3JTcGFjZSx0aGlzLnJlbmRlclRhcmdldD10LnJlbmRlclRhcmdldCx0aGlzLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT10LmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSx0aGlzLmlzQXJyYXlUZXh0dXJlPXQuaXNBcnJheVRleHR1cmUsdGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQudXNlckRhdGEpKSx0aGlzLm5lZWRzVXBkYXRlPSEwLHRoaXN9c2V0VmFsdWVzKHQpe2Zvcihjb25zdCBlIGluIHQpe2NvbnN0IG49dFtlXTtpZihuPT09dm9pZCAwKXt2dChgVGV4dHVyZS5zZXRWYWx1ZXMoKTogcGFyYW1ldGVyICcke2V9JyBoYXMgdmFsdWUgb2YgdW5kZWZpbmVkLmApO2NvbnRpbnVlfWNvbnN0IHM9dGhpc1tlXTtpZihzPT09dm9pZCAwKXt2dChgVGV4dHVyZS5zZXRWYWx1ZXMoKTogcHJvcGVydHkgJyR7ZX0nIGRvZXMgbm90IGV4aXN0LmApO2NvbnRpbnVlfXMmJm4mJnMuaXNWZWN0b3IyJiZuLmlzVmVjdG9yMnx8cyYmbiYmcy5pc1ZlY3RvcjMmJm4uaXNWZWN0b3IzfHxzJiZuJiZzLmlzTWF0cml4MyYmbi5pc01hdHJpeDM/cy5jb3B5KG4pOnRoaXNbZV09bn19dG9KU09OKHQpe2NvbnN0IGU9dD09PXZvaWQgMHx8dHlwZW9mIHQ9PSJzdHJpbmciO2lmKCFlJiZ0LnRleHR1cmVzW3RoaXMudXVpZF0hPT12b2lkIDApcmV0dXJuIHQudGV4dHVyZXNbdGhpcy51dWlkXTtjb25zdCBuPXttZXRhZGF0YTp7dmVyc2lvbjo0LjcsdHlwZToiVGV4dHVyZSIsZ2VuZXJhdG9yOiJUZXh0dXJlLnRvSlNPTiJ9LHV1aWQ6dGhpcy51dWlkLG5hbWU6dGhpcy5uYW1lLGltYWdlOnRoaXMuc291cmNlLnRvSlNPTih0KS51dWlkLG1hcHBpbmc6dGhpcy5tYXBwaW5nLGNoYW5uZWw6dGhpcy5jaGFubmVsLHJlcGVhdDpbdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55XSxvZmZzZXQ6W3RoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueV0sY2VudGVyOlt0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnldLHJvdGF0aW9uOnRoaXMucm90YXRpb24sd3JhcDpbdGhpcy53cmFwUyx0aGlzLndyYXBUXSxmb3JtYXQ6dGhpcy5mb3JtYXQsaW50ZXJuYWxGb3JtYXQ6dGhpcy5pbnRlcm5hbEZvcm1hdCx0eXBlOnRoaXMudHlwZSxjb2xvclNwYWNlOnRoaXMuY29sb3JTcGFjZSxtaW5GaWx0ZXI6dGhpcy5taW5GaWx0ZXIsbWFnRmlsdGVyOnRoaXMubWFnRmlsdGVyLGFuaXNvdHJvcHk6dGhpcy5hbmlzb3Ryb3B5LGZsaXBZOnRoaXMuZmxpcFksZ2VuZXJhdGVNaXBtYXBzOnRoaXMuZ2VuZXJhdGVNaXBtYXBzLHByZW11bHRpcGx5QWxwaGE6dGhpcy5wcmVtdWx0aXBseUFscGhhLHVucGFja0FsaWdubWVudDp0aGlzLnVucGFja0FsaWdubWVudH07cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYobi51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSxlfHwodC50ZXh0dXJlc1t0aGlzLnV1aWRdPW4pLG59ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX10cmFuc2Zvcm1Vdih0KXtpZih0aGlzLm1hcHBpbmchPT0zMDApcmV0dXJuIHQ7aWYodC5hcHBseU1hdHJpeDModGhpcy5tYXRyaXgpLHQueDwwfHx0Lng+MSlzd2l0Y2godGhpcy53cmFwUyl7Y2FzZSAxZTM6dC54PXQueC1NYXRoLmZsb29yKHQueCk7YnJlYWs7Y2FzZSAxMDAxOnQueD10Lng8MD8wOjE7YnJlYWs7Y2FzZSAxMDAyOk1hdGguYWJzKE1hdGguZmxvb3IodC54KSUyKT09PTE/dC54PU1hdGguY2VpbCh0LngpLXQueDp0Lng9dC54LU1hdGguZmxvb3IodC54KTticmVha31pZih0Lnk8MHx8dC55PjEpc3dpdGNoKHRoaXMud3JhcFQpe2Nhc2UgMWUzOnQueT10LnktTWF0aC5mbG9vcih0LnkpO2JyZWFrO2Nhc2UgMTAwMTp0Lnk9dC55PDA/MDoxO2JyZWFrO2Nhc2UgMTAwMjpNYXRoLmFicyhNYXRoLmZsb29yKHQueSklMik9PT0xP3QueT1NYXRoLmNlaWwodC55KS10Lnk6dC55PXQueS1NYXRoLmZsb29yKHQueSk7YnJlYWt9cmV0dXJuIHRoaXMuZmxpcFkmJih0Lnk9MS10LnkpLHR9c2V0IG5lZWRzVXBkYXRlKHQpe3Q9PT0hMCYmKHRoaXMudmVyc2lvbisrLHRoaXMuc291cmNlLm5lZWRzVXBkYXRlPSEwKX1zZXQgbmVlZHNQTVJFTVVwZGF0ZSh0KXt0PT09ITAmJnRoaXMucG1yZW1WZXJzaW9uKyt9fW1uLkRFRkFVTFRfSU1BR0U9bnVsbCxtbi5ERUZBVUxUX01BUFBJTkc9MzAwLG1uLkRFRkFVTFRfQU5JU09UUk9QWT0xO2NsYXNzIGlle2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0wLHM9MSl7aWUucHJvdG90eXBlLmlzVmVjdG9yND0hMCx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzLnc9c31nZXQgd2lkdGgoKXtyZXR1cm4gdGhpcy56fXNldCB3aWR0aCh0KXt0aGlzLno9dH1nZXQgaGVpZ2h0KCl7cmV0dXJuIHRoaXMud31zZXQgaGVpZ2h0KHQpe3RoaXMudz10fXNldCh0LGUsbixzKXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PW4sdGhpcy53PXMsdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMueD10LHRoaXMueT10LHRoaXMuej10LHRoaXMudz10LHRoaXN9c2V0WCh0KXtyZXR1cm4gdGhpcy54PXQsdGhpc31zZXRZKHQpe3JldHVybiB0aGlzLnk9dCx0aGlzfXNldFoodCl7cmV0dXJuIHRoaXMuej10LHRoaXN9c2V0Vyh0KXtyZXR1cm4gdGhpcy53PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztjYXNlIDI6dGhpcy56PWU7YnJlYWs7Y2FzZSAzOnRoaXMudz1lO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9cmV0dXJuIHRoaXN9Z2V0Q29tcG9uZW50KHQpe3N3aXRjaCh0KXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtjYXNlIDI6cmV0dXJuIHRoaXMuejtjYXNlIDM6cmV0dXJuIHRoaXMudztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55LHRoaXMueix0aGlzLncpfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzLno9dC56LHRoaXMudz10LnchPT12b2lkIDA/dC53OjEsdGhpc31hZGQodCl7cmV0dXJuIHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXMueis9dC56LHRoaXMudys9dC53LHRoaXN9YWRkU2NhbGFyKHQpe3JldHVybiB0aGlzLngrPXQsdGhpcy55Kz10LHRoaXMueis9dCx0aGlzLncrPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXMuej10LnorZS56LHRoaXMudz10LncrZS53LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzLnorPXQueiplLHRoaXMudys9dC53KmUsdGhpc31zdWIodCl7cmV0dXJuIHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXMuei09dC56LHRoaXMudy09dC53LHRoaXN9c3ViU2NhbGFyKHQpe3JldHVybiB0aGlzLngtPXQsdGhpcy55LT10LHRoaXMuei09dCx0aGlzLnctPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXMuej10LnotZS56LHRoaXMudz10LnctZS53LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXMueio9dC56LHRoaXMudyo9dC53LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpcy56Kj10LHRoaXMudyo9dCx0aGlzfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXRoaXMueixyPXRoaXMudyxvPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1vWzBdKmUrb1s0XSpuK29bOF0qcytvWzEyXSpyLHRoaXMueT1vWzFdKmUrb1s1XSpuK29bOV0qcytvWzEzXSpyLHRoaXMuej1vWzJdKmUrb1s2XSpuK29bMTBdKnMrb1sxNF0qcix0aGlzLnc9b1szXSplK29bN10qbitvWzExXSpzK29bMTVdKnIsdGhpc31kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXMuei89dC56LHRoaXMudy89dC53LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9c2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb24odCl7dGhpcy53PTIqTWF0aC5hY29zKHQudyk7Y29uc3QgZT1NYXRoLnNxcnQoMS10LncqdC53KTtyZXR1cm4gZTwxZS00Pyh0aGlzLng9MSx0aGlzLnk9MCx0aGlzLno9MCk6KHRoaXMueD10LngvZSx0aGlzLnk9dC55L2UsdGhpcy56PXQuei9lKSx0aGlzfXNldEF4aXNBbmdsZUZyb21Sb3RhdGlvbk1hdHJpeCh0KXtsZXQgZSxuLHMscjtjb25zdCBjPXQuZWxlbWVudHMsbD1jWzBdLGg9Y1s0XSx1PWNbOF0sZj1jWzFdLGQ9Y1s1XSxwPWNbOV0seT1jWzJdLGc9Y1s2XSx3PWNbMTBdO2lmKE1hdGguYWJzKGgtZik8LjAxJiZNYXRoLmFicyh1LXkpPC4wMSYmTWF0aC5hYnMocC1nKTwuMDEpe2lmKE1hdGguYWJzKGgrZik8LjEmJk1hdGguYWJzKHUreSk8LjEmJk1hdGguYWJzKHArZyk8LjEmJk1hdGguYWJzKGwrZCt3LTMpPC4xKXJldHVybiB0aGlzLnNldCgxLDAsMCwwKSx0aGlzO2U9TWF0aC5QSTtjb25zdCB4PShsKzEpLzIsbT0oZCsxKS8yLE09KHcrMSkvMixTPShoK2YpLzQsQT0odSt5KS80LHY9KHArZykvNDtyZXR1cm4geD5tJiZ4Pk0/eDwuMDE/KG49MCxzPS43MDcxMDY3ODEscj0uNzA3MTA2NzgxKToobj1NYXRoLnNxcnQoeCkscz1TL24scj1BL24pOm0+TT9tPC4wMT8obj0uNzA3MTA2NzgxLHM9MCxyPS43MDcxMDY3ODEpOihzPU1hdGguc3FydChtKSxuPVMvcyxyPXYvcyk6TTwuMDE/KG49LjcwNzEwNjc4MSxzPS43MDcxMDY3ODEscj0wKToocj1NYXRoLnNxcnQoTSksbj1BL3Iscz12L3IpLHRoaXMuc2V0KG4scyxyLGUpLHRoaXN9bGV0IGI9TWF0aC5zcXJ0KChnLXApKihnLXApKyh1LXkpKih1LXkpKyhmLWgpKihmLWgpKTtyZXR1cm4gTWF0aC5hYnMoYik8LjAwMSYmKGI9MSksdGhpcy54PShnLXApL2IsdGhpcy55PSh1LXkpL2IsdGhpcy56PShmLWgpL2IsdGhpcy53PU1hdGguYWNvcygobCtkK3ctMSkvMiksdGhpc31zZXRGcm9tTWF0cml4UG9zaXRpb24odCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9ZVsxMl0sdGhpcy55PWVbMTNdLHRoaXMuej1lWzE0XSx0aGlzLnc9ZVsxNV0sdGhpc31taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpcy56PU1hdGgubWluKHRoaXMueix0LnopLHRoaXMudz1NYXRoLm1pbih0aGlzLncsdC53KSx0aGlzfW1heCh0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksdC55KSx0aGlzLno9TWF0aC5tYXgodGhpcy56LHQueiksdGhpcy53PU1hdGgubWF4KHRoaXMudyx0LncpLHRoaXN9Y2xhbXAodCxlKXtyZXR1cm4gdGhpcy54PVcodGhpcy54LHQueCxlLngpLHRoaXMueT1XKHRoaXMueSx0LnksZS55KSx0aGlzLno9Vyh0aGlzLnosdC56LGUueiksdGhpcy53PVcodGhpcy53LHQudyxlLncpLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PVcodGhpcy54LHQsZSksdGhpcy55PVcodGhpcy55LHQsZSksdGhpcy56PVcodGhpcy56LHQsZSksdGhpcy53PVcodGhpcy53LHQsZSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IG49dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobnx8MSkubXVsdGlwbHlTY2FsYXIoVyhuLHQsZSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXMudz1NYXRoLmZsb29yKHRoaXMudyksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpcy56PU1hdGguY2VpbCh0aGlzLnopLHRoaXMudz1NYXRoLmNlaWwodGhpcy53KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXMudz1NYXRoLnJvdW5kKHRoaXMudyksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9TWF0aC50cnVuYyh0aGlzLngpLHRoaXMueT1NYXRoLnRydW5jKHRoaXMueSksdGhpcy56PU1hdGgudHJ1bmModGhpcy56KSx0aGlzLnc9TWF0aC50cnVuYyh0aGlzLncpLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXMuej0tdGhpcy56LHRoaXMudz0tdGhpcy53LHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLngqdC54K3RoaXMueSp0LnkrdGhpcy56KnQueit0aGlzLncqdC53fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56K3RoaXMudyp0aGlzLnd9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53KX1tYW5oYXR0YW5MZW5ndGgoKXtyZXR1cm4gTWF0aC5hYnModGhpcy54KStNYXRoLmFicyh0aGlzLnkpK01hdGguYWJzKHRoaXMueikrTWF0aC5hYnModGhpcy53KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXMueis9KHQuei10aGlzLnopKmUsdGhpcy53Kz0odC53LXRoaXMudykqZSx0aGlzfWxlcnBWZWN0b3JzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQueCsoZS54LXQueCkqbix0aGlzLnk9dC55KyhlLnktdC55KSpuLHRoaXMuej10LnorKGUuei10LnopKm4sdGhpcy53PXQudysoZS53LXQudykqbix0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnkmJnQuej09PXRoaXMueiYmdC53PT09dGhpcy53fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpcy56PXRbZSsyXSx0aGlzLnc9dFtlKzNdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy54LHRbZSsxXT10aGlzLnksdFtlKzJdPXRoaXMueix0W2UrM109dGhpcy53LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLng9dC5nZXRYKGUpLHRoaXMueT10LmdldFkoZSksdGhpcy56PXQuZ2V0WihlKSx0aGlzLnc9dC5nZXRXKGUpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXMudz1NYXRoLnJhbmRvbSgpLHRoaXN9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy54LHlpZWxkIHRoaXMueSx5aWVsZCB0aGlzLnoseWllbGQgdGhpcy53fX1jbGFzcyBndHtjb25zdHJ1Y3Rvcih0PW5ldyBQKDEvMCwxLzAsMS8wKSxlPW5ldyBQKC0xLzAsLTEvMCwtMS8wKSl7dGhpcy5pc0JveDM9ITAsdGhpcy5taW49dCx0aGlzLm1heD1lfXNldCh0LGUpe3JldHVybiB0aGlzLm1pbi5jb3B5KHQpLHRoaXMubWF4LmNvcHkoZSksdGhpc31zZXRGcm9tQXJyYXkodCl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKz0zKXRoaXMuZXhwYW5kQnlQb2ludChwZS5mcm9tQXJyYXkodCxlKSk7cmV0dXJuIHRoaXN9c2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLG49dC5jb3VudDtlPG47ZSsrKXRoaXMuZXhwYW5kQnlQb2ludChwZS5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSkpO3JldHVybiB0aGlzfXNldEZyb21Qb2ludHModCl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspdGhpcy5leHBhbmRCeVBvaW50KHRbZV0pO3JldHVybiB0aGlzfXNldEZyb21DZW50ZXJBbmRTaXplKHQsZSl7Y29uc3Qgbj1wZS5jb3B5KGUpLm11bHRpcGx5U2NhbGFyKC41KTtyZXR1cm4gdGhpcy5taW4uY29weSh0KS5zdWIobiksdGhpcy5tYXguY29weSh0KS5hZGQobiksdGhpc31zZXRGcm9tT2JqZWN0KHQsZT0hMSl7cmV0dXJuIHRoaXMubWFrZUVtcHR5KCksdGhpcy5leHBhbmRCeU9iamVjdCh0LGUpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLm1pbi5jb3B5KHQubWluKSx0aGlzLm1heC5jb3B5KHQubWF4KSx0aGlzfW1ha2VFbXB0eSgpe3JldHVybiB0aGlzLm1pbi54PXRoaXMubWluLnk9dGhpcy5taW4uej0xLzAsdGhpcy5tYXgueD10aGlzLm1heC55PXRoaXMubWF4Lno9LTEvMCx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5tYXgueDx0aGlzLm1pbi54fHx0aGlzLm1heC55PHRoaXMubWluLnl8fHRoaXMubWF4Lno8dGhpcy5taW4uen1nZXRDZW50ZXIodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3Quc2V0KDAsMCwwKTp0LmFkZFZlY3RvcnModGhpcy5taW4sdGhpcy5tYXgpLm11bHRpcGx5U2NhbGFyKC41KX1nZXRTaXplKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDAsMCk6dC5zdWJWZWN0b3JzKHRoaXMubWF4LHRoaXMubWluKX1leHBhbmRCeVBvaW50KHQpe3JldHVybiB0aGlzLm1pbi5taW4odCksdGhpcy5tYXgubWF4KHQpLHRoaXN9ZXhwYW5kQnlWZWN0b3IodCl7cmV0dXJuIHRoaXMubWluLnN1Yih0KSx0aGlzLm1heC5hZGQodCksdGhpc31leHBhbmRCeVNjYWxhcih0KXtyZXR1cm4gdGhpcy5taW4uYWRkU2NhbGFyKC10KSx0aGlzLm1heC5hZGRTY2FsYXIodCksdGhpc31leHBhbmRCeU9iamVjdCh0LGU9ITEpe3QudXBkYXRlV29ybGRNYXRyaXgoITEsITEpO2NvbnN0IG49dC5nZW9tZXRyeTtpZihuIT09dm9pZCAwKXtjb25zdCByPW4uZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2lmKGU9PT0hMCYmciE9PXZvaWQgMCYmdC5pc0luc3RhbmNlZE1lc2ghPT0hMClmb3IobGV0IG89MCxhPXIuY291bnQ7bzxhO28rKyl0LmlzTWVzaD09PSEwP3QuZ2V0VmVydGV4UG9zaXRpb24obyxwZSk6cGUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLG8pLHBlLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKSx0aGlzLmV4cGFuZEJ5UG9pbnQocGUpO2Vsc2UgdC5ib3VuZGluZ0JveCE9PXZvaWQgMD8odC5ib3VuZGluZ0JveD09PW51bGwmJnQuY29tcHV0ZUJvdW5kaW5nQm94KCksbXMuY29weSh0LmJvdW5kaW5nQm94KSk6KG4uYm91bmRpbmdCb3g9PT1udWxsJiZuLmNvbXB1dGVCb3VuZGluZ0JveCgpLG1zLmNvcHkobi5ib3VuZGluZ0JveCkpLG1zLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKSx0aGlzLnVuaW9uKG1zKX1jb25zdCBzPXQuY2hpbGRyZW47Zm9yKGxldCByPTAsbz1zLmxlbmd0aDtyPG87cisrKXRoaXMuZXhwYW5kQnlPYmplY3Qoc1tyXSxlKTtyZXR1cm4gdGhpc31jb250YWluc1BvaW50KHQpe3JldHVybiB0Lng+PXRoaXMubWluLngmJnQueDw9dGhpcy5tYXgueCYmdC55Pj10aGlzLm1pbi55JiZ0Lnk8PXRoaXMubWF4LnkmJnQuej49dGhpcy5taW4ueiYmdC56PD10aGlzLm1heC56fWNvbnRhaW5zQm94KHQpe3JldHVybiB0aGlzLm1pbi54PD10Lm1pbi54JiZ0Lm1heC54PD10aGlzLm1heC54JiZ0aGlzLm1pbi55PD10Lm1pbi55JiZ0Lm1heC55PD10aGlzLm1heC55JiZ0aGlzLm1pbi56PD10Lm1pbi56JiZ0Lm1heC56PD10aGlzLm1heC56fWdldFBhcmFtZXRlcih0LGUpe3JldHVybiBlLnNldCgodC54LXRoaXMubWluLngpLyh0aGlzLm1heC54LXRoaXMubWluLngpLCh0LnktdGhpcy5taW4ueSkvKHRoaXMubWF4LnktdGhpcy5taW4ueSksKHQuei10aGlzLm1pbi56KS8odGhpcy5tYXguei10aGlzLm1pbi56KSl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5tYXgueD49dGhpcy5taW4ueCYmdC5taW4ueDw9dGhpcy5tYXgueCYmdC5tYXgueT49dGhpcy5taW4ueSYmdC5taW4ueTw9dGhpcy5tYXgueSYmdC5tYXguej49dGhpcy5taW4ueiYmdC5taW4uejw9dGhpcy5tYXguen1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0aGlzLmNsYW1wUG9pbnQodC5jZW50ZXIscGUpLHBlLmRpc3RhbmNlVG9TcXVhcmVkKHQuY2VudGVyKTw9dC5yYWRpdXMqdC5yYWRpdXN9aW50ZXJzZWN0c1BsYW5lKHQpe2xldCBlLG47cmV0dXJuIHQubm9ybWFsLng+MD8oZT10Lm5vcm1hbC54KnRoaXMubWluLngsbj10Lm5vcm1hbC54KnRoaXMubWF4LngpOihlPXQubm9ybWFsLngqdGhpcy5tYXgueCxuPXQubm9ybWFsLngqdGhpcy5taW4ueCksdC5ub3JtYWwueT4wPyhlKz10Lm5vcm1hbC55KnRoaXMubWluLnksbis9dC5ub3JtYWwueSp0aGlzLm1heC55KTooZSs9dC5ub3JtYWwueSp0aGlzLm1heC55LG4rPXQubm9ybWFsLnkqdGhpcy5taW4ueSksdC5ub3JtYWwuej4wPyhlKz10Lm5vcm1hbC56KnRoaXMubWluLnosbis9dC5ub3JtYWwueip0aGlzLm1heC56KTooZSs9dC5ub3JtYWwueip0aGlzLm1heC56LG4rPXQubm9ybWFsLnoqdGhpcy5taW4ueiksZTw9LXQuY29uc3RhbnQmJm4+PS10LmNvbnN0YW50fWludGVyc2VjdHNUcmlhbmdsZSh0KXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4hMTt0aGlzLmdldENlbnRlcihUaSksZ3Muc3ViVmVjdG9ycyh0aGlzLm1heCxUaSksVW4uc3ViVmVjdG9ycyh0LmEsVGkpLHFuLnN1YlZlY3RvcnModC5iLFRpKSxYbi5zdWJWZWN0b3JzKHQuYyxUaSksdG4uc3ViVmVjdG9ycyhxbixVbiksZW4uc3ViVmVjdG9ycyhYbixxbiksZ24uc3ViVmVjdG9ycyhVbixYbik7bGV0IGU9WzAsLXRuLnosdG4ueSwwLC1lbi56LGVuLnksMCwtZ24ueixnbi55LHRuLnosMCwtdG4ueCxlbi56LDAsLWVuLngsZ24ueiwwLC1nbi54LC10bi55LHRuLngsMCwtZW4ueSxlbi54LDAsLWduLnksZ24ueCwwXTtyZXR1cm4hbW8oZSxVbixxbixYbixncyl8fChlPVsxLDAsMCwwLDEsMCwwLDAsMV0sIW1vKGUsVW4scW4sWG4sZ3MpKT8hMTooeHMuY3Jvc3NWZWN0b3JzKHRuLGVuKSxlPVt4cy54LHhzLnkseHMuel0sbW8oZSxVbixxbixYbixncykpfWNsYW1wUG9pbnQodCxlKXtyZXR1cm4gZS5jb3B5KHQpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KX1kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHRoaXMuY2xhbXBQb2ludCh0LHBlKS5kaXN0YW5jZVRvKHQpfWdldEJvdW5kaW5nU3BoZXJlKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90Lm1ha2VFbXB0eSgpOih0aGlzLmdldENlbnRlcih0LmNlbnRlciksdC5yYWRpdXM9dGhpcy5nZXRTaXplKHBlKS5sZW5ndGgoKSouNSksdH1pbnRlcnNlY3QodCl7cmV0dXJuIHRoaXMubWluLm1heCh0Lm1pbiksdGhpcy5tYXgubWluKHQubWF4KSx0aGlzLmlzRW1wdHkoKSYmdGhpcy5tYWtlRW1wdHkoKSx0aGlzfXVuaW9uKHQpe3JldHVybiB0aGlzLm1pbi5taW4odC5taW4pLHRoaXMubWF4Lm1heCh0Lm1heCksdGhpc31hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3RoaXM6KEJlWzBdLnNldCh0aGlzLm1pbi54LHRoaXMubWluLnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLEJlWzFdLnNldCh0aGlzLm1pbi54LHRoaXMubWluLnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLEJlWzJdLnNldCh0aGlzLm1pbi54LHRoaXMubWF4LnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLEJlWzNdLnNldCh0aGlzLm1pbi54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLEJlWzRdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLEJlWzVdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLEJlWzZdLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLEJlWzddLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0RnJvbVBvaW50cyhCZSksdGhpcyl9dHJhbnNsYXRlKHQpe3JldHVybiB0aGlzLm1pbi5hZGQodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm1pbi5lcXVhbHModGhpcy5taW4pJiZ0Lm1heC5lcXVhbHModGhpcy5tYXgpfXRvSlNPTigpe3JldHVybnttaW46dGhpcy5taW4udG9BcnJheSgpLG1heDp0aGlzLm1heC50b0FycmF5KCl9fWZyb21KU09OKHQpe3JldHVybiB0aGlzLm1pbi5mcm9tQXJyYXkodC5taW4pLHRoaXMubWF4LmZyb21BcnJheSh0Lm1heCksdGhpc319Y29uc3QgQmU9W25ldyBQLG5ldyBQLG5ldyBQLG5ldyBQLG5ldyBQLG5ldyBQLG5ldyBQLG5ldyBQXSxwZT1uZXcgUCxtcz1uZXcgZ3QsVW49bmV3IFAscW49bmV3IFAsWG49bmV3IFAsdG49bmV3IFAsZW49bmV3IFAsZ249bmV3IFAsVGk9bmV3IFAsZ3M9bmV3IFAseHM9bmV3IFAseG49bmV3IFA7ZnVuY3Rpb24gbW8oaSx0LGUsbixzKXtmb3IobGV0IHI9MCxvPWkubGVuZ3RoLTM7cjw9bztyKz0zKXt4bi5mcm9tQXJyYXkoaSxyKTtjb25zdCBhPXMueCpNYXRoLmFicyh4bi54KStzLnkqTWF0aC5hYnMoeG4ueSkrcy56Kk1hdGguYWJzKHhuLnopLGM9dC5kb3QoeG4pLGw9ZS5kb3QoeG4pLGg9bi5kb3QoeG4pO2lmKE1hdGgubWF4KC1NYXRoLm1heChjLGwsaCksTWF0aC5taW4oYyxsLGgpKT5hKXJldHVybiExfXJldHVybiEwfWNvbnN0IGJmPW5ldyBndCxQaT1uZXcgUCxnbz1uZXcgUDtjbGFzcyBEY3tjb25zdHJ1Y3Rvcih0PW5ldyBQLGU9LTEpe3RoaXMuaXNTcGhlcmU9ITAsdGhpcy5jZW50ZXI9dCx0aGlzLnJhZGl1cz1lfXNldCh0LGUpe3JldHVybiB0aGlzLmNlbnRlci5jb3B5KHQpLHRoaXMucmFkaXVzPWUsdGhpc31zZXRGcm9tUG9pbnRzKHQsZSl7Y29uc3Qgbj10aGlzLmNlbnRlcjtlIT09dm9pZCAwP24uY29weShlKTpiZi5zZXRGcm9tUG9pbnRzKHQpLmdldENlbnRlcihuKTtsZXQgcz0wO2ZvcihsZXQgcj0wLG89dC5sZW5ndGg7cjxvO3IrKylzPU1hdGgubWF4KHMsbi5kaXN0YW5jZVRvU3F1YXJlZCh0W3JdKSk7cmV0dXJuIHRoaXMucmFkaXVzPU1hdGguc3FydChzKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodC5jZW50ZXIpLHRoaXMucmFkaXVzPXQucmFkaXVzLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLnJhZGl1czwwfW1ha2VFbXB0eSgpe3JldHVybiB0aGlzLmNlbnRlci5zZXQoMCwwLDApLHRoaXMucmFkaXVzPS0xLHRoaXN9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdC5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcik8PXRoaXMucmFkaXVzKnRoaXMucmFkaXVzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdC5kaXN0YW5jZVRvKHRoaXMuY2VudGVyKS10aGlzLnJhZGl1c31pbnRlcnNlY3RzU3BoZXJlKHQpe2NvbnN0IGU9dGhpcy5yYWRpdXMrdC5yYWRpdXM7cmV0dXJuIHQuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9ZSplfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQuaW50ZXJzZWN0c1NwaGVyZSh0aGlzKX1pbnRlcnNlY3RzUGxhbmUodCl7cmV0dXJuIE1hdGguYWJzKHQuZGlzdGFuY2VUb1BvaW50KHRoaXMuY2VudGVyKSk8PXRoaXMucmFkaXVzfWNsYW1wUG9pbnQodCxlKXtjb25zdCBuPXRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHQpO3JldHVybiBlLmNvcHkodCksbj50aGlzLnJhZGl1cyp0aGlzLnJhZGl1cyYmKGUuc3ViKHRoaXMuY2VudGVyKS5ub3JtYWxpemUoKSxlLm11bHRpcGx5U2NhbGFyKHRoaXMucmFkaXVzKS5hZGQodGhpcy5jZW50ZXIpKSxlfWdldEJvdW5kaW5nQm94KHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT8odC5tYWtlRW1wdHkoKSx0KToodC5zZXQodGhpcy5jZW50ZXIsdGhpcy5jZW50ZXIpLHQuZXhwYW5kQnlTY2FsYXIodGhpcy5yYWRpdXMpLHQpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0KHQpLHRoaXMucmFkaXVzPXRoaXMucmFkaXVzKnQuZ2V0TWF4U2NhbGVPbkF4aXMoKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuYWRkKHQpLHRoaXN9ZXhwYW5kQnlQb2ludCh0KXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0KSx0aGlzLnJhZGl1cz0wLHRoaXM7UGkuc3ViVmVjdG9ycyh0LHRoaXMuY2VudGVyKTtjb25zdCBlPVBpLmxlbmd0aFNxKCk7aWYoZT50aGlzLnJhZGl1cyp0aGlzLnJhZGl1cyl7Y29uc3Qgbj1NYXRoLnNxcnQoZSkscz0obi10aGlzLnJhZGl1cykqLjU7dGhpcy5jZW50ZXIuYWRkU2NhbGVkVmVjdG9yKFBpLHMvbiksdGhpcy5yYWRpdXMrPXN9cmV0dXJuIHRoaXN9dW5pb24odCl7cmV0dXJuIHQuaXNFbXB0eSgpP3RoaXM6dGhpcy5pc0VtcHR5KCk/KHRoaXMuY29weSh0KSx0aGlzKToodGhpcy5jZW50ZXIuZXF1YWxzKHQuY2VudGVyKT09PSEwP3RoaXMucmFkaXVzPU1hdGgubWF4KHRoaXMucmFkaXVzLHQucmFkaXVzKTooZ28uc3ViVmVjdG9ycyh0LmNlbnRlcix0aGlzLmNlbnRlcikuc2V0TGVuZ3RoKHQucmFkaXVzKSx0aGlzLmV4cGFuZEJ5UG9pbnQoUGkuY29weSh0LmNlbnRlcikuYWRkKGdvKSksdGhpcy5leHBhbmRCeVBvaW50KFBpLmNvcHkodC5jZW50ZXIpLnN1YihnbykpKSx0aGlzKX1lcXVhbHModCl7cmV0dXJuIHQuY2VudGVyLmVxdWFscyh0aGlzLmNlbnRlcikmJnQucmFkaXVzPT09dGhpcy5yYWRpdXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfXRvSlNPTigpe3JldHVybntyYWRpdXM6dGhpcy5yYWRpdXMsY2VudGVyOnRoaXMuY2VudGVyLnRvQXJyYXkoKX19ZnJvbUpTT04odCl7cmV0dXJuIHRoaXMucmFkaXVzPXQucmFkaXVzLHRoaXMuY2VudGVyLmZyb21BcnJheSh0LmNlbnRlciksdGhpc319Y29uc3QgRWU9bmV3IFAseG89bmV3IFAsd3M9bmV3IFAsbm49bmV3IFAsd289bmV3IFAsYnM9bmV3IFAsYm89bmV3IFA7Y2xhc3MgTW97Y29uc3RydWN0b3IodD1uZXcgUCxlPW5ldyBQKDAsMCwtMSkpe3RoaXMub3JpZ2luPXQsdGhpcy5kaXJlY3Rpb249ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5vcmlnaW4uY29weSh0KSx0aGlzLmRpcmVjdGlvbi5jb3B5KGUpLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5vcmlnaW4uY29weSh0Lm9yaWdpbiksdGhpcy5kaXJlY3Rpb24uY29weSh0LmRpcmVjdGlvbiksdGhpc31hdCh0LGUpe3JldHVybiBlLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbix0KX1sb29rQXQodCl7cmV0dXJuIHRoaXMuZGlyZWN0aW9uLmNvcHkodCkuc3ViKHRoaXMub3JpZ2luKS5ub3JtYWxpemUoKSx0aGlzfXJlY2FzdCh0KXtyZXR1cm4gdGhpcy5vcmlnaW4uY29weSh0aGlzLmF0KHQsRWUpKSx0aGlzfWNsb3Nlc3RQb2ludFRvUG9pbnQodCxlKXtlLnN1YlZlY3RvcnModCx0aGlzLm9yaWdpbik7Y29uc3Qgbj1lLmRvdCh0aGlzLmRpcmVjdGlvbik7cmV0dXJuIG48MD9lLmNvcHkodGhpcy5vcmlnaW4pOmUuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLG4pfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQodCkpfWRpc3RhbmNlU3FUb1BvaW50KHQpe2NvbnN0IGU9RWUuc3ViVmVjdG9ycyh0LHRoaXMub3JpZ2luKS5kb3QodGhpcy5kaXJlY3Rpb24pO3JldHVybiBlPDA/dGhpcy5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQodCk6KEVlLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbixlKSxFZS5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VTcVRvU2VnbWVudCh0LGUsbixzKXt4by5jb3B5KHQpLmFkZChlKS5tdWx0aXBseVNjYWxhciguNSksd3MuY29weShlKS5zdWIodCkubm9ybWFsaXplKCksbm4uY29weSh0aGlzLm9yaWdpbikuc3ViKHhvKTtjb25zdCByPXQuZGlzdGFuY2VUbyhlKSouNSxvPS10aGlzLmRpcmVjdGlvbi5kb3Qod3MpLGE9bm4uZG90KHRoaXMuZGlyZWN0aW9uKSxjPS1ubi5kb3Qod3MpLGw9bm4ubGVuZ3RoU3EoKSxoPU1hdGguYWJzKDEtbypvKTtsZXQgdSxmLGQscDtpZihoPjApaWYodT1vKmMtYSxmPW8qYS1jLHA9cipoLHU+PTApaWYoZj49LXApaWYoZjw9cCl7Y29uc3QgeT0xL2g7dSo9eSxmKj15LGQ9dSoodStvKmYrMiphKStmKihvKnUrZisyKmMpK2x9ZWxzZSBmPXIsdT1NYXRoLm1heCgwLC0obypmK2EpKSxkPS11KnUrZiooZisyKmMpK2w7ZWxzZSBmPS1yLHU9TWF0aC5tYXgoMCwtKG8qZithKSksZD0tdSp1K2YqKGYrMipjKStsO2Vsc2UgZjw9LXA/KHU9TWF0aC5tYXgoMCwtKC1vKnIrYSkpLGY9dT4wPy1yOk1hdGgubWluKE1hdGgubWF4KC1yLC1jKSxyKSxkPS11KnUrZiooZisyKmMpK2wpOmY8PXA/KHU9MCxmPU1hdGgubWluKE1hdGgubWF4KC1yLC1jKSxyKSxkPWYqKGYrMipjKStsKToodT1NYXRoLm1heCgwLC0obypyK2EpKSxmPXU+MD9yOk1hdGgubWluKE1hdGgubWF4KC1yLC1jKSxyKSxkPS11KnUrZiooZisyKmMpK2wpO2Vsc2UgZj1vPjA/LXI6cix1PU1hdGgubWF4KDAsLShvKmYrYSkpLGQ9LXUqdStmKihmKzIqYykrbDtyZXR1cm4gbiYmbi5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sdSkscyYmcy5jb3B5KHhvKS5hZGRTY2FsZWRWZWN0b3Iod3MsZiksZH1pbnRlcnNlY3RTcGhlcmUodCxlKXtFZS5zdWJWZWN0b3JzKHQuY2VudGVyLHRoaXMub3JpZ2luKTtjb25zdCBuPUVlLmRvdCh0aGlzLmRpcmVjdGlvbikscz1FZS5kb3QoRWUpLW4qbixyPXQucmFkaXVzKnQucmFkaXVzO2lmKHM+cilyZXR1cm4gbnVsbDtjb25zdCBvPU1hdGguc3FydChyLXMpLGE9bi1vLGM9bitvO3JldHVybiBjPDA/bnVsbDphPDA/dGhpcy5hdChjLGUpOnRoaXMuYXQoYSxlKX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0LnJhZGl1czwwPyExOnRoaXMuZGlzdGFuY2VTcVRvUG9pbnQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31kaXN0YW5jZVRvUGxhbmUodCl7Y29uc3QgZT10Lm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKGU9PT0wKXJldHVybiB0LmRpc3RhbmNlVG9Qb2ludCh0aGlzLm9yaWdpbik9PT0wPzA6bnVsbDtjb25zdCBuPS0odGhpcy5vcmlnaW4uZG90KHQubm9ybWFsKSt0LmNvbnN0YW50KS9lO3JldHVybiBuPj0wP246bnVsbH1pbnRlcnNlY3RQbGFuZSh0LGUpe2NvbnN0IG49dGhpcy5kaXN0YW5jZVRvUGxhbmUodCk7cmV0dXJuIG49PT1udWxsP251bGw6dGhpcy5hdChuLGUpfWludGVyc2VjdHNQbGFuZSh0KXtjb25zdCBlPXQuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKTtyZXR1cm4gZT09PTB8fHQubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbikqZTwwfWludGVyc2VjdEJveCh0LGUpe2xldCBuLHMscixvLGEsYztjb25zdCBsPTEvdGhpcy5kaXJlY3Rpb24ueCxoPTEvdGhpcy5kaXJlY3Rpb24ueSx1PTEvdGhpcy5kaXJlY3Rpb24ueixmPXRoaXMub3JpZ2luO3JldHVybiBsPj0wPyhuPSh0Lm1pbi54LWYueCkqbCxzPSh0Lm1heC54LWYueCkqbCk6KG49KHQubWF4LngtZi54KSpsLHM9KHQubWluLngtZi54KSpsKSxoPj0wPyhyPSh0Lm1pbi55LWYueSkqaCxvPSh0Lm1heC55LWYueSkqaCk6KHI9KHQubWF4LnktZi55KSpoLG89KHQubWluLnktZi55KSpoKSxuPm98fHI+c3x8KChyPm58fGlzTmFOKG4pKSYmKG49ciksKG88c3x8aXNOYU4ocykpJiYocz1vKSx1Pj0wPyhhPSh0Lm1pbi56LWYueikqdSxjPSh0Lm1heC56LWYueikqdSk6KGE9KHQubWF4LnotZi56KSp1LGM9KHQubWluLnotZi56KSp1KSxuPmN8fGE+cyl8fCgoYT5ufHxuIT09bikmJihuPWEpLChjPHN8fHMhPT1zKSYmKHM9YyksczwwKT9udWxsOnRoaXMuYXQobj49MD9uOnMsZSl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdGhpcy5pbnRlcnNlY3RCb3godCxFZSkhPT1udWxsfWludGVyc2VjdFRyaWFuZ2xlKHQsZSxuLHMscil7d28uc3ViVmVjdG9ycyhlLHQpLGJzLnN1YlZlY3RvcnMobix0KSxiby5jcm9zc1ZlY3RvcnMod28sYnMpO2xldCBvPXRoaXMuZGlyZWN0aW9uLmRvdChibyksYTtpZihvPjApe2lmKHMpcmV0dXJuIG51bGw7YT0xfWVsc2UgaWYobzwwKWE9LTEsbz0tbztlbHNlIHJldHVybiBudWxsO25uLnN1YlZlY3RvcnModGhpcy5vcmlnaW4sdCk7Y29uc3QgYz1hKnRoaXMuZGlyZWN0aW9uLmRvdChicy5jcm9zc1ZlY3RvcnMobm4sYnMpKTtpZihjPDApcmV0dXJuIG51bGw7Y29uc3QgbD1hKnRoaXMuZGlyZWN0aW9uLmRvdCh3by5jcm9zcyhubikpO2lmKGw8MHx8YytsPm8pcmV0dXJuIG51bGw7Y29uc3QgaD0tYSpubi5kb3QoYm8pO3JldHVybiBoPDA/bnVsbDp0aGlzLmF0KGgvbyxyKX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMub3JpZ2luLmFwcGx5TWF0cml4NCh0KSx0aGlzLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24odCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQub3JpZ2luLmVxdWFscyh0aGlzLm9yaWdpbikmJnQuZGlyZWN0aW9uLmVxdWFscyh0aGlzLmRpcmVjdGlvbil9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1jbGFzcyBzdHtjb25zdHJ1Y3Rvcih0LGUsbixzLHIsbyxhLGMsbCxoLHUsZixkLHAseSxnKXtzdC5wcm90b3R5cGUuaXNNYXRyaXg0PSEwLHRoaXMuZWxlbWVudHM9WzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdLHQhPT12b2lkIDAmJnRoaXMuc2V0KHQsZSxuLHMscixvLGEsYyxsLGgsdSxmLGQscCx5LGcpfXNldCh0LGUsbixzLHIsbyxhLGMsbCxoLHUsZixkLHAseSxnKXtjb25zdCB3PXRoaXMuZWxlbWVudHM7cmV0dXJuIHdbMF09dCx3WzRdPWUsd1s4XT1uLHdbMTJdPXMsd1sxXT1yLHdbNV09byx3WzldPWEsd1sxM109Yyx3WzJdPWwsd1s2XT1oLHdbMTBdPXUsd1sxNF09Zix3WzNdPWQsd1s3XT1wLHdbMTFdPXksd1sxNV09Zyx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDEpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHN0KCkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfWNvcHkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVswXT1uWzBdLGVbMV09blsxXSxlWzJdPW5bMl0sZVszXT1uWzNdLGVbNF09bls0XSxlWzVdPW5bNV0sZVs2XT1uWzZdLGVbN109bls3XSxlWzhdPW5bOF0sZVs5XT1uWzldLGVbMTBdPW5bMTBdLGVbMTFdPW5bMTFdLGVbMTJdPW5bMTJdLGVbMTNdPW5bMTNdLGVbMTRdPW5bMTRdLGVbMTVdPW5bMTVdLHRoaXN9Y29weVBvc2l0aW9uKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7cmV0dXJuIGVbMTJdPW5bMTJdLGVbMTNdPW5bMTNdLGVbMTRdPW5bMTRdLHRoaXN9c2V0RnJvbU1hdHJpeDModCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnNldChlWzBdLGVbM10sZVs2XSwwLGVbMV0sZVs0XSxlWzddLDAsZVsyXSxlWzVdLGVbOF0sMCwwLDAsMCwxKSx0aGlzfWV4dHJhY3RCYXNpcyh0LGUsbil7cmV0dXJuIHRoaXMuZGV0ZXJtaW5hbnQoKT09PTA/KHQuc2V0KDEsMCwwKSxlLnNldCgwLDEsMCksbi5zZXQoMCwwLDEpLHRoaXMpOih0LnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywwKSxlLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywxKSxuLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywyKSx0aGlzKX1tYWtlQmFzaXModCxlLG4pe3JldHVybiB0aGlzLnNldCh0LngsZS54LG4ueCwwLHQueSxlLnksbi55LDAsdC56LGUueixuLnosMCwwLDAsMCwxKSx0aGlzfWV4dHJhY3RSb3RhdGlvbih0KXtpZih0LmRldGVybWluYW50KCk9PT0wKXJldHVybiB0aGlzLmlkZW50aXR5KCk7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cyxzPTEvWm4uc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLHI9MS9abi5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMSkubGVuZ3RoKCksbz0xL1puLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gZVswXT1uWzBdKnMsZVsxXT1uWzFdKnMsZVsyXT1uWzJdKnMsZVszXT0wLGVbNF09bls0XSpyLGVbNV09bls1XSpyLGVbNl09bls2XSpyLGVbN109MCxlWzhdPW5bOF0qbyxlWzldPW5bOV0qbyxlWzEwXT1uWzEwXSpvLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21FdWxlcih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10Lngscz10Lnkscj10Lnosbz1NYXRoLmNvcyhuKSxhPU1hdGguc2luKG4pLGM9TWF0aC5jb3MocyksbD1NYXRoLnNpbihzKSxoPU1hdGguY29zKHIpLHU9TWF0aC5zaW4ocik7aWYodC5vcmRlcj09PSJYWVoiKXtjb25zdCBmPW8qaCxkPW8qdSxwPWEqaCx5PWEqdTtlWzBdPWMqaCxlWzRdPS1jKnUsZVs4XT1sLGVbMV09ZCtwKmwsZVs1XT1mLXkqbCxlWzldPS1hKmMsZVsyXT15LWYqbCxlWzZdPXArZCpsLGVbMTBdPW8qY31lbHNlIGlmKHQub3JkZXI9PT0iWVhaIil7Y29uc3QgZj1jKmgsZD1jKnUscD1sKmgseT1sKnU7ZVswXT1mK3kqYSxlWzRdPXAqYS1kLGVbOF09bypsLGVbMV09byp1LGVbNV09bypoLGVbOV09LWEsZVsyXT1kKmEtcCxlWzZdPXkrZiphLGVbMTBdPW8qY31lbHNlIGlmKHQub3JkZXI9PT0iWlhZIil7Y29uc3QgZj1jKmgsZD1jKnUscD1sKmgseT1sKnU7ZVswXT1mLXkqYSxlWzRdPS1vKnUsZVs4XT1wK2QqYSxlWzFdPWQrcCphLGVbNV09bypoLGVbOV09eS1mKmEsZVsyXT0tbypsLGVbNl09YSxlWzEwXT1vKmN9ZWxzZSBpZih0Lm9yZGVyPT09IlpZWCIpe2NvbnN0IGY9bypoLGQ9byp1LHA9YSpoLHk9YSp1O2VbMF09YypoLGVbNF09cCpsLWQsZVs4XT1mKmwreSxlWzFdPWMqdSxlWzVdPXkqbCtmLGVbOV09ZCpsLXAsZVsyXT0tbCxlWzZdPWEqYyxlWzEwXT1vKmN9ZWxzZSBpZih0Lm9yZGVyPT09IllaWCIpe2NvbnN0IGY9bypjLGQ9bypsLHA9YSpjLHk9YSpsO2VbMF09YypoLGVbNF09eS1mKnUsZVs4XT1wKnUrZCxlWzFdPXUsZVs1XT1vKmgsZVs5XT0tYSpoLGVbMl09LWwqaCxlWzZdPWQqdStwLGVbMTBdPWYteSp1fWVsc2UgaWYodC5vcmRlcj09PSJYWlkiKXtjb25zdCBmPW8qYyxkPW8qbCxwPWEqYyx5PWEqbDtlWzBdPWMqaCxlWzRdPS11LGVbOF09bCpoLGVbMV09Zip1K3ksZVs1XT1vKmgsZVs5XT1kKnUtcCxlWzJdPXAqdS1kLGVbNl09YSpoLGVbMTBdPXkqdStmfXJldHVybiBlWzNdPTAsZVs3XT0wLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLmNvbXBvc2UoTWYsdCxBZil9bG9va0F0KHQsZSxuKXtjb25zdCBzPXRoaXMuZWxlbWVudHM7cmV0dXJuIEh0LnN1YlZlY3RvcnModCxlKSxIdC5sZW5ndGhTcSgpPT09MCYmKEh0Lno9MSksSHQubm9ybWFsaXplKCksc24uY3Jvc3NWZWN0b3JzKG4sSHQpLHNuLmxlbmd0aFNxKCk9PT0wJiYoTWF0aC5hYnMobi56KT09PTE/SHQueCs9MWUtNDpIdC56Kz0xZS00LEh0Lm5vcm1hbGl6ZSgpLHNuLmNyb3NzVmVjdG9ycyhuLEh0KSksc24ubm9ybWFsaXplKCksTXMuY3Jvc3NWZWN0b3JzKEh0LHNuKSxzWzBdPXNuLngsc1s0XT1Ncy54LHNbOF09SHQueCxzWzFdPXNuLnksc1s1XT1Ncy55LHNbOV09SHQueSxzWzJdPXNuLnosc1s2XT1Ncy56LHNbMTBdPUh0LnosdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LHRoaXMpfW11bHRpcGx5TWF0cmljZXModCxlKXtjb25zdCBuPXQuZWxlbWVudHMscz1lLmVsZW1lbnRzLHI9dGhpcy5lbGVtZW50cyxvPW5bMF0sYT1uWzRdLGM9bls4XSxsPW5bMTJdLGg9blsxXSx1PW5bNV0sZj1uWzldLGQ9blsxM10scD1uWzJdLHk9bls2XSxnPW5bMTBdLHc9blsxNF0sYj1uWzNdLHg9bls3XSxtPW5bMTFdLE09blsxNV0sUz1zWzBdLEE9c1s0XSx2PXNbOF0sXz1zWzEyXSxUPXNbMV0sej1zWzVdLEM9c1s5XSxCPXNbMTNdLEY9c1syXSxFPXNbNl0sST1zWzEwXSxSPXNbMTRdLFY9c1szXSxVPXNbN10sSz1zWzExXSxjdD1zWzE1XTtyZXR1cm4gclswXT1vKlMrYSpUK2MqRitsKlYscls0XT1vKkErYSp6K2MqRStsKlUscls4XT1vKnYrYSpDK2MqSStsKkssclsxMl09bypfK2EqQitjKlIrbCpjdCxyWzFdPWgqUyt1KlQrZipGK2QqVixyWzVdPWgqQSt1KnorZipFK2QqVSxyWzldPWgqdit1KkMrZipJK2QqSyxyWzEzXT1oKl8rdSpCK2YqUitkKmN0LHJbMl09cCpTK3kqVCtnKkYrdypWLHJbNl09cCpBK3kqeitnKkUrdypVLHJbMTBdPXAqdit5KkMrZypJK3cqSyxyWzE0XT1wKl8reSpCK2cqUit3KmN0LHJbM109YipTK3gqVCttKkYrTSpWLHJbN109YipBK3gqeittKkUrTSpVLHJbMTFdPWIqdit4KkMrbSpJK00qSyxyWzE1XT1iKl8reCpCK20qUitNKmN0LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbNF0qPXQsZVs4XSo9dCxlWzEyXSo9dCxlWzFdKj10LGVbNV0qPXQsZVs5XSo9dCxlWzEzXSo9dCxlWzJdKj10LGVbNl0qPXQsZVsxMF0qPXQsZVsxNF0qPXQsZVszXSo9dCxlWzddKj10LGVbMTFdKj10LGVbMTVdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFs0XSxzPXRbOF0scj10WzEyXSxvPXRbMV0sYT10WzVdLGM9dFs5XSxsPXRbMTNdLGg9dFsyXSx1PXRbNl0sZj10WzEwXSxkPXRbMTRdLHA9dFszXSx5PXRbN10sZz10WzExXSx3PXRbMTVdLGI9YypkLWwqZix4PWEqZC1sKnUsbT1hKmYtYyp1LE09bypkLWwqaCxTPW8qZi1jKmgsQT1vKnUtYSpoO3JldHVybiBlKih5KmItZyp4K3cqbSktbioocCpiLWcqTSt3KlMpK3MqKHAqeC15Kk0rdypBKS1yKihwKm0teSpTK2cqQSl9dHJhbnNwb3NlKCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzO2xldCBlO3JldHVybiBlPXRbMV0sdFsxXT10WzRdLHRbNF09ZSxlPXRbMl0sdFsyXT10WzhdLHRbOF09ZSxlPXRbNl0sdFs2XT10WzldLHRbOV09ZSxlPXRbM10sdFszXT10WzEyXSx0WzEyXT1lLGU9dFs3XSx0WzddPXRbMTNdLHRbMTNdPWUsZT10WzExXSx0WzExXT10WzE0XSx0WzE0XT1lLHRoaXN9c2V0UG9zaXRpb24odCxlLG4pe2NvbnN0IHM9dGhpcy5lbGVtZW50cztyZXR1cm4gdC5pc1ZlY3RvcjM/KHNbMTJdPXQueCxzWzEzXT10Lnksc1sxNF09dC56KTooc1sxMl09dCxzWzEzXT1lLHNbMTRdPW4pLHRoaXN9aW52ZXJ0KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbMV0scz10WzJdLHI9dFszXSxvPXRbNF0sYT10WzVdLGM9dFs2XSxsPXRbN10saD10WzhdLHU9dFs5XSxmPXRbMTBdLGQ9dFsxMV0scD10WzEyXSx5PXRbMTNdLGc9dFsxNF0sdz10WzE1XSxiPXUqZypsLXkqZipsK3kqYypkLWEqZypkLXUqYyp3K2EqZip3LHg9cCpmKmwtaCpnKmwtcCpjKmQrbypnKmQraCpjKnctbypmKncsbT1oKnkqbC1wKnUqbCtwKmEqZC1vKnkqZC1oKmEqdytvKnUqdyxNPXAqdSpjLWgqeSpjLXAqYSpmK28qeSpmK2gqYSpnLW8qdSpnLFM9ZSpiK24qeCtzKm0rcipNO2lmKFM9PT0wKXJldHVybiB0aGlzLnNldCgwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwKTtjb25zdCBBPTEvUztyZXR1cm4gdFswXT1iKkEsdFsxXT0oeSpmKnItdSpnKnIteSpzKmQrbipnKmQrdSpzKnctbipmKncpKkEsdFsyXT0oYSpnKnIteSpjKnIreSpzKmwtbipnKmwtYSpzKncrbipjKncpKkEsdFszXT0odSpjKnItYSpmKnItdSpzKmwrbipmKmwrYSpzKmQtbipjKmQpKkEsdFs0XT14KkEsdFs1XT0oaCpnKnItcCpmKnIrcCpzKmQtZSpnKmQtaCpzKncrZSpmKncpKkEsdFs2XT0ocCpjKnItbypnKnItcCpzKmwrZSpnKmwrbypzKnctZSpjKncpKkEsdFs3XT0obypmKnItaCpjKnIraCpzKmwtZSpmKmwtbypzKmQrZSpjKmQpKkEsdFs4XT1tKkEsdFs5XT0ocCp1KnItaCp5KnItcCpuKmQrZSp5KmQraCpuKnctZSp1KncpKkEsdFsxMF09KG8qeSpyLXAqYSpyK3AqbipsLWUqeSpsLW8qbip3K2UqYSp3KSpBLHRbMTFdPShoKmEqci1vKnUqci1oKm4qbCtlKnUqbCtvKm4qZC1lKmEqZCkqQSx0WzEyXT1NKkEsdFsxM109KGgqeSpzLXAqdSpzK3AqbipmLWUqeSpmLWgqbipnK2UqdSpnKSpBLHRbMTRdPShwKmEqcy1vKnkqcy1wKm4qYytlKnkqYytvKm4qZy1lKmEqZykqQSx0WzE1XT0obyp1KnMtaCphKnMraCpuKmMtZSp1KmMtbypuKmYrZSphKmYpKkEsdGhpc31zY2FsZSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10Lngscz10Lnkscj10Lno7cmV0dXJuIGVbMF0qPW4sZVs0XSo9cyxlWzhdKj1yLGVbMV0qPW4sZVs1XSo9cyxlWzldKj1yLGVbMl0qPW4sZVs2XSo9cyxlWzEwXSo9cixlWzNdKj1uLGVbN10qPXMsZVsxMV0qPXIsdGhpc31nZXRNYXhTY2FsZU9uQXhpcygpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0qdFswXSt0WzFdKnRbMV0rdFsyXSp0WzJdLG49dFs0XSp0WzRdK3RbNV0qdFs1XSt0WzZdKnRbNl0scz10WzhdKnRbOF0rdFs5XSp0WzldK3RbMTBdKnRbMTBdO3JldHVybiBNYXRoLnNxcnQoTWF0aC5tYXgoZSxuLHMpKX1tYWtlVHJhbnNsYXRpb24odCxlLG4pe3JldHVybiB0LmlzVmVjdG9yMz90aGlzLnNldCgxLDAsMCx0LngsMCwxLDAsdC55LDAsMCwxLHQueiwwLDAsMCwxKTp0aGlzLnNldCgxLDAsMCx0LDAsMSwwLGUsMCwwLDEsbiwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvblgodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDAsZSwtbiwwLDAsbixlLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25ZKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoZSwwLG4sMCwwLDEsMCwwLC1uLDAsZSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWih0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsLW4sMCwwLG4sZSwwLDAsMCwwLDEsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbkF4aXModCxlKXtjb25zdCBuPU1hdGguY29zKGUpLHM9TWF0aC5zaW4oZSkscj0xLW4sbz10LngsYT10LnksYz10LnosbD1yKm8saD1yKmE7cmV0dXJuIHRoaXMuc2V0KGwqbytuLGwqYS1zKmMsbCpjK3MqYSwwLGwqYStzKmMsaCphK24saCpjLXMqbywwLGwqYy1zKmEsaCpjK3MqbyxyKmMqYytuLDAsMCwwLDAsMSksdGhpc31tYWtlU2NhbGUodCxlLG4pe3JldHVybiB0aGlzLnNldCh0LDAsMCwwLDAsZSwwLDAsMCwwLG4sMCwwLDAsMCwxKSx0aGlzfW1ha2VTaGVhcih0LGUsbixzLHIsbyl7cmV0dXJuIHRoaXMuc2V0KDEsbixyLDAsdCwxLG8sMCxlLHMsMSwwLDAsMCwwLDEpLHRoaXN9Y29tcG9zZSh0LGUsbil7Y29uc3Qgcz10aGlzLmVsZW1lbnRzLHI9ZS5feCxvPWUuX3ksYT1lLl96LGM9ZS5fdyxsPXIrcixoPW8rbyx1PWErYSxmPXIqbCxkPXIqaCxwPXIqdSx5PW8qaCxnPW8qdSx3PWEqdSxiPWMqbCx4PWMqaCxtPWMqdSxNPW4ueCxTPW4ueSxBPW4uejtyZXR1cm4gc1swXT0oMS0oeSt3KSkqTSxzWzFdPShkK20pKk0sc1syXT0ocC14KSpNLHNbM109MCxzWzRdPShkLW0pKlMsc1s1XT0oMS0oZit3KSkqUyxzWzZdPShnK2IpKlMsc1s3XT0wLHNbOF09KHAreCkqQSxzWzldPShnLWIpKkEsc1sxMF09KDEtKGYreSkpKkEsc1sxMV09MCxzWzEyXT10Lngsc1sxM109dC55LHNbMTRdPXQueixzWzE1XT0xLHRoaXN9ZGVjb21wb3NlKHQsZSxuKXtjb25zdCBzPXRoaXMuZWxlbWVudHM7aWYodC54PXNbMTJdLHQueT1zWzEzXSx0Lno9c1sxNF0sdGhpcy5kZXRlcm1pbmFudCgpPT09MClyZXR1cm4gbi5zZXQoMSwxLDEpLGUuaWRlbnRpdHkoKSx0aGlzO2xldCByPVpuLnNldChzWzBdLHNbMV0sc1syXSkubGVuZ3RoKCk7Y29uc3Qgbz1abi5zZXQoc1s0XSxzWzVdLHNbNl0pLmxlbmd0aCgpLGE9Wm4uc2V0KHNbOF0sc1s5XSxzWzEwXSkubGVuZ3RoKCk7dGhpcy5kZXRlcm1pbmFudCgpPDAmJihyPS1yKSx5ZS5jb3B5KHRoaXMpO2NvbnN0IGw9MS9yLGg9MS9vLHU9MS9hO3JldHVybiB5ZS5lbGVtZW50c1swXSo9bCx5ZS5lbGVtZW50c1sxXSo9bCx5ZS5lbGVtZW50c1syXSo9bCx5ZS5lbGVtZW50c1s0XSo9aCx5ZS5lbGVtZW50c1s1XSo9aCx5ZS5lbGVtZW50c1s2XSo9aCx5ZS5lbGVtZW50c1s4XSo9dSx5ZS5lbGVtZW50c1s5XSo9dSx5ZS5lbGVtZW50c1sxMF0qPXUsZS5zZXRGcm9tUm90YXRpb25NYXRyaXgoeWUpLG4ueD1yLG4ueT1vLG4uej1hLHRoaXN9bWFrZVBlcnNwZWN0aXZlKHQsZSxuLHMscixvLGE9MmUzLGM9ITEpe2NvbnN0IGw9dGhpcy5lbGVtZW50cyxoPTIqci8oZS10KSx1PTIqci8obi1zKSxmPShlK3QpLyhlLXQpLGQ9KG4rcykvKG4tcyk7bGV0IHAseTtpZihjKXA9ci8oby1yKSx5PW8qci8oby1yKTtlbHNlIGlmKGE9PT0yZTMpcD0tKG8rcikvKG8tcikseT0tMipvKnIvKG8tcik7ZWxzZSBpZihhPT09MjAwMSlwPS1vLyhvLXIpLHk9LW8qci8oby1yKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVEhSRUUuTWF0cml4NC5tYWtlUGVyc3BlY3RpdmUoKTogSW52YWxpZCBjb29yZGluYXRlIHN5c3RlbTogIithKTtyZXR1cm4gbFswXT1oLGxbNF09MCxsWzhdPWYsbFsxMl09MCxsWzFdPTAsbFs1XT11LGxbOV09ZCxsWzEzXT0wLGxbMl09MCxsWzZdPTAsbFsxMF09cCxsWzE0XT15LGxbM109MCxsWzddPTAsbFsxMV09LTEsbFsxNV09MCx0aGlzfW1ha2VPcnRob2dyYXBoaWModCxlLG4scyxyLG8sYT0yZTMsYz0hMSl7Y29uc3QgbD10aGlzLmVsZW1lbnRzLGg9Mi8oZS10KSx1PTIvKG4tcyksZj0tKGUrdCkvKGUtdCksZD0tKG4rcykvKG4tcyk7bGV0IHAseTtpZihjKXA9MS8oby1yKSx5PW8vKG8tcik7ZWxzZSBpZihhPT09MmUzKXA9LTIvKG8tcikseT0tKG8rcikvKG8tcik7ZWxzZSBpZihhPT09MjAwMSlwPS0xLyhvLXIpLHk9LXIvKG8tcik7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk1hdHJpeDQubWFrZU9ydGhvZ3JhcGhpYygpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK2EpO3JldHVybiBsWzBdPWgsbFs0XT0wLGxbOF09MCxsWzEyXT1mLGxbMV09MCxsWzVdPXUsbFs5XT0wLGxbMTNdPWQsbFsyXT0wLGxbNl09MCxsWzEwXT1wLGxbMTRdPXksbFszXT0wLGxbN109MCxsWzExXT0wLGxbMTVdPTEsdGhpc31lcXVhbHModCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztmb3IobGV0IHM9MDtzPDE2O3MrKylpZihlW3NdIT09bltzXSlyZXR1cm4hMTtyZXR1cm4hMH1mcm9tQXJyYXkodCxlPTApe2ZvcihsZXQgbj0wO248MTY7bisrKXRoaXMuZWxlbWVudHNbbl09dFtuK2VdO3JldHVybiB0aGlzfXRvQXJyYXkodD1bXSxlPTApe2NvbnN0IG49dGhpcy5lbGVtZW50cztyZXR1cm4gdFtlXT1uWzBdLHRbZSsxXT1uWzFdLHRbZSsyXT1uWzJdLHRbZSszXT1uWzNdLHRbZSs0XT1uWzRdLHRbZSs1XT1uWzVdLHRbZSs2XT1uWzZdLHRbZSs3XT1uWzddLHRbZSs4XT1uWzhdLHRbZSs5XT1uWzldLHRbZSsxMF09blsxMF0sdFtlKzExXT1uWzExXSx0W2UrMTJdPW5bMTJdLHRbZSsxM109blsxM10sdFtlKzE0XT1uWzE0XSx0W2UrMTVdPW5bMTVdLHR9fWNvbnN0IFpuPW5ldyBQLHllPW5ldyBzdCxNZj1uZXcgUCgwLDAsMCksQWY9bmV3IFAoMSwxLDEpLHNuPW5ldyBQLE1zPW5ldyBQLEh0PW5ldyBQLCRjPW5ldyBzdCxWYz1uZXcgemk7Y2xhc3MgQ2l7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAscz1DaS5ERUZBVUxUX09SREVSKXt0aGlzLmlzRXVsZXI9ITAsdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fb3JkZXI9c31nZXQgeCgpe3JldHVybiB0aGlzLl94fXNldCB4KHQpe3RoaXMuX3g9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHkoKXtyZXR1cm4gdGhpcy5feX1zZXQgeSh0KXt0aGlzLl95PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB6KCl7cmV0dXJuIHRoaXMuX3p9c2V0IHoodCl7dGhpcy5fej10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgb3JkZXIoKXtyZXR1cm4gdGhpcy5fb3JkZXJ9c2V0IG9yZGVyKHQpe3RoaXMuX29yZGVyPXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldCh0LGUsbixzPXRoaXMuX29yZGVyKXtyZXR1cm4gdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fb3JkZXI9cyx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl9vcmRlcil9Y29weSh0KXtyZXR1cm4gdGhpcy5feD10Ll94LHRoaXMuX3k9dC5feSx0aGlzLl96PXQuX3osdGhpcy5fb3JkZXI9dC5fb3JkZXIsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVJvdGF0aW9uTWF0cml4KHQsZT10aGlzLl9vcmRlcixuPSEwKXtjb25zdCBzPXQuZWxlbWVudHMscj1zWzBdLG89c1s0XSxhPXNbOF0sYz1zWzFdLGw9c1s1XSxoPXNbOV0sdT1zWzJdLGY9c1s2XSxkPXNbMTBdO3N3aXRjaChlKXtjYXNlIlhZWiI6dGhpcy5feT1NYXRoLmFzaW4oVyhhLC0xLDEpKSxNYXRoLmFicyhhKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1oLGQpLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxyKSk6KHRoaXMuX3g9TWF0aC5hdGFuMihmLGwpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJZWFoiOnRoaXMuX3g9TWF0aC5hc2luKC1XKGgsLTEsMSkpLE1hdGguYWJzKGgpPC45OTk5OTk5Pyh0aGlzLl95PU1hdGguYXRhbjIoYSxkKSx0aGlzLl96PU1hdGguYXRhbjIoYyxsKSk6KHRoaXMuX3k9TWF0aC5hdGFuMigtdSxyKSx0aGlzLl96PTApO2JyZWFrO2Nhc2UiWlhZIjp0aGlzLl94PU1hdGguYXNpbihXKGYsLTEsMSkpLE1hdGguYWJzKGYpPC45OTk5OTk5Pyh0aGlzLl95PU1hdGguYXRhbjIoLXUsZCksdGhpcy5fej1NYXRoLmF0YW4yKC1vLGwpKToodGhpcy5feT0wLHRoaXMuX3o9TWF0aC5hdGFuMihjLHIpKTticmVhaztjYXNlIlpZWCI6dGhpcy5feT1NYXRoLmFzaW4oLVcodSwtMSwxKSksTWF0aC5hYnModSk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMihmLGQpLHRoaXMuX3o9TWF0aC5hdGFuMihjLHIpKToodGhpcy5feD0wLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxsKSk7YnJlYWs7Y2FzZSJZWlgiOnRoaXMuX3o9TWF0aC5hc2luKFcoYywtMSwxKSksTWF0aC5hYnMoYyk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMigtaCxsKSx0aGlzLl95PU1hdGguYXRhbjIoLXUscikpOih0aGlzLl94PTAsdGhpcy5feT1NYXRoLmF0YW4yKGEsZCkpO2JyZWFrO2Nhc2UiWFpZIjp0aGlzLl96PU1hdGguYXNpbigtVyhvLC0xLDEpKSxNYXRoLmFicyhvKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKGYsbCksdGhpcy5feT1NYXRoLmF0YW4yKGEscikpOih0aGlzLl94PU1hdGguYXRhbjIoLWgsZCksdGhpcy5feT0wKTticmVhaztkZWZhdWx0OnZ0KCJFdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrZSl9cmV0dXJuIHRoaXMuX29yZGVyPWUsbj09PSEwJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUXVhdGVybmlvbih0LGUsbil7cmV0dXJuICRjLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCRjLGUsbil9c2V0RnJvbVZlY3RvcjModCxlPXRoaXMuX29yZGVyKXtyZXR1cm4gdGhpcy5zZXQodC54LHQueSx0LnosZSl9cmVvcmRlcih0KXtyZXR1cm4gVmMuc2V0RnJvbUV1bGVyKHRoaXMpLHRoaXMuc2V0RnJvbVF1YXRlcm5pb24oVmMsdCl9ZXF1YWxzKHQpe3JldHVybiB0Ll94PT09dGhpcy5feCYmdC5feT09PXRoaXMuX3kmJnQuX3o9PT10aGlzLl96JiZ0Ll9vcmRlcj09PXRoaXMuX29yZGVyfWZyb21BcnJheSh0KXtyZXR1cm4gdGhpcy5feD10WzBdLHRoaXMuX3k9dFsxXSx0aGlzLl96PXRbMl0sdFszXSE9PXZvaWQgMCYmKHRoaXMuX29yZGVyPXRbM10pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX29yZGVyLHR9X29uQ2hhbmdlKHQpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPXQsdGhpc31fb25DaGFuZ2VDYWxsYmFjaygpe30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLl94LHlpZWxkIHRoaXMuX3kseWllbGQgdGhpcy5feix5aWVsZCB0aGlzLl9vcmRlcn19Q2kuREVGQVVMVF9PUkRFUj0iWFlaIjtjbGFzcyBTZntjb25zdHJ1Y3Rvcigpe3RoaXMubWFzaz0xfXNldCh0KXt0aGlzLm1hc2s9KDE8PHR8MCk+Pj4wfWVuYWJsZSh0KXt0aGlzLm1hc2t8PTE8PHR8MH1lbmFibGVBbGwoKXt0aGlzLm1hc2s9LTF9dG9nZ2xlKHQpe3RoaXMubWFza149MTw8dHwwfWRpc2FibGUodCl7dGhpcy5tYXNrJj1+KDE8PHR8MCl9ZGlzYWJsZUFsbCgpe3RoaXMubWFzaz0wfXRlc3QodCl7cmV0dXJuKHRoaXMubWFzayZ0Lm1hc2spIT09MH1pc0VuYWJsZWQodCl7cmV0dXJuKHRoaXMubWFzayYoMTw8dHwwKSkhPT0wfX1sZXQgdmY9MDtjb25zdCBVYz1uZXcgUCxXbj1uZXcgemksRmU9bmV3IHN0LEFzPW5ldyBQLEJpPW5ldyBQLF9mPW5ldyBQLHpmPW5ldyB6aSxxYz1uZXcgUCgxLDAsMCksWGM9bmV3IFAoMCwxLDApLFpjPW5ldyBQKDAsMCwxKSxXYz17dHlwZToiYWRkZWQifSxUZj17dHlwZToicmVtb3ZlZCJ9LEduPXt0eXBlOiJjaGlsZGFkZGVkIixjaGlsZDpudWxsfSxBbz17dHlwZToiY2hpbGRyZW1vdmVkIixjaGlsZDpudWxsfTtjbGFzcyBJZSBleHRlbmRzIHlze2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzT2JqZWN0M0Q9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6dmYrK30pLHRoaXMudXVpZD1EbigpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9Ik9iamVjdDNEIix0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49W10sdGhpcy51cD1JZS5ERUZBVUxUX1VQLmNsb25lKCk7Y29uc3QgdD1uZXcgUCxlPW5ldyBDaSxuPW5ldyB6aSxzPW5ldyBQKDEsMSwxKTtmdW5jdGlvbiByKCl7bi5zZXRGcm9tRXVsZXIoZSwhMSl9ZnVuY3Rpb24gbygpe2Uuc2V0RnJvbVF1YXRlcm5pb24obix2b2lkIDAsITEpfWUuX29uQ2hhbmdlKHIpLG4uX29uQ2hhbmdlKG8pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3Bvc2l0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTp0fSxyb3RhdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZX0scXVhdGVybmlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bn0sc2NhbGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOnN9LG1vZGVsVmlld01hdHJpeDp7dmFsdWU6bmV3IHN0fSxub3JtYWxNYXRyaXg6e3ZhbHVlOm5ldyBNZX19KSx0aGlzLm1hdHJpeD1uZXcgc3QsdGhpcy5tYXRyaXhXb3JsZD1uZXcgc3QsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPUllLkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFLHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPUllLkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSx0aGlzLmxheWVycz1uZXcgU2YsdGhpcy52aXNpYmxlPSEwLHRoaXMuY2FzdFNoYWRvdz0hMSx0aGlzLnJlY2VpdmVTaGFkb3c9ITEsdGhpcy5mcnVzdHVtQ3VsbGVkPSEwLHRoaXMucmVuZGVyT3JkZXI9MCx0aGlzLmFuaW1hdGlvbnM9W10sdGhpcy5jdXN0b21EZXB0aE1hdGVyaWFsPXZvaWQgMCx0aGlzLmN1c3RvbURpc3RhbmNlTWF0ZXJpYWw9dm9pZCAwLHRoaXMudXNlckRhdGE9e319b25CZWZvcmVTaGFkb3coKXt9b25BZnRlclNoYWRvdygpe31vbkJlZm9yZVJlbmRlcigpe31vbkFmdGVyUmVuZGVyKCl7fWFwcGx5TWF0cml4NCh0KXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5tYXRyaXgucHJlbXVsdGlwbHkodCksdGhpcy5tYXRyaXguZGVjb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpfWFwcGx5UXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KHQpLHRoaXN9c2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlKHQsZSl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUodCxlKX1zZXRSb3RhdGlvbkZyb21FdWxlcih0KXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKHQsITApfXNldFJvdGF0aW9uRnJvbU1hdHJpeCh0KXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KHQpfXNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCl7dGhpcy5xdWF0ZXJuaW9uLmNvcHkodCl9cm90YXRlT25BeGlzKHQsZSl7cmV0dXJuIFduLnNldEZyb21BeGlzQW5nbGUodCxlKSx0aGlzLnF1YXRlcm5pb24ubXVsdGlwbHkoV24pLHRoaXN9cm90YXRlT25Xb3JsZEF4aXModCxlKXtyZXR1cm4gV24uc2V0RnJvbUF4aXNBbmdsZSh0LGUpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShXbiksdGhpc31yb3RhdGVYKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhxYyx0KX1yb3RhdGVZKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhYYyx0KX1yb3RhdGVaKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhaYyx0KX10cmFuc2xhdGVPbkF4aXModCxlKXtyZXR1cm4gVWMuY29weSh0KS5hcHBseVF1YXRlcm5pb24odGhpcy5xdWF0ZXJuaW9uKSx0aGlzLnBvc2l0aW9uLmFkZChVYy5tdWx0aXBseVNjYWxhcihlKSksdGhpc310cmFuc2xhdGVYKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhxYyx0KX10cmFuc2xhdGVZKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhYYyx0KX10cmFuc2xhdGVaKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhaYyx0KX1sb2NhbFRvV29ybGQodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpfXdvcmxkVG9Mb2NhbCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5hcHBseU1hdHJpeDQoRmUuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSl9bG9va0F0KHQsZSxuKXt0LmlzVmVjdG9yMz9Bcy5jb3B5KHQpOkFzLnNldCh0LGUsbik7Y29uc3Qgcz10aGlzLnBhcmVudDt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxCaS5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCksdGhpcy5pc0NhbWVyYXx8dGhpcy5pc0xpZ2h0P0ZlLmxvb2tBdChCaSxBcyx0aGlzLnVwKTpGZS5sb29rQXQoQXMsQmksdGhpcy51cCksdGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeChGZSkscyYmKEZlLmV4dHJhY3RSb3RhdGlvbihzLm1hdHJpeFdvcmxkKSxXbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoRmUpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShXbi5pbnZlcnQoKSkpfWFkZCh0KXtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2ZvcihsZXQgZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdGhpcy5hZGQoYXJndW1lbnRzW2VdKTtyZXR1cm4gdGhpc31yZXR1cm4gdD09PXRoaXM/KHluKCJPYmplY3QzRC5hZGQ6IG9iamVjdCBjYW4ndCBiZSBhZGRlZCBhcyBhIGNoaWxkIG9mIGl0c2VsZi4iLHQpLHRoaXMpOih0JiZ0LmlzT2JqZWN0M0Q/KHQucmVtb3ZlRnJvbVBhcmVudCgpLHQucGFyZW50PXRoaXMsdGhpcy5jaGlsZHJlbi5wdXNoKHQpLHQuZGlzcGF0Y2hFdmVudChXYyksR24uY2hpbGQ9dCx0aGlzLmRpc3BhdGNoRXZlbnQoR24pLEduLmNoaWxkPW51bGwpOnluKCJPYmplY3QzRC5hZGQ6IG9iamVjdCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuT2JqZWN0M0QuIix0KSx0aGlzKX1yZW1vdmUodCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRoaXMucmVtb3ZlKGFyZ3VtZW50c1tuXSk7cmV0dXJuIHRoaXN9Y29uc3QgZT10aGlzLmNoaWxkcmVuLmluZGV4T2YodCk7cmV0dXJuIGUhPT0tMSYmKHQucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbi5zcGxpY2UoZSwxKSx0LmRpc3BhdGNoRXZlbnQoVGYpLEFvLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KEFvKSxBby5jaGlsZD1udWxsKSx0aGlzfXJlbW92ZUZyb21QYXJlbnQoKXtjb25zdCB0PXRoaXMucGFyZW50O3JldHVybiB0IT09bnVsbCYmdC5yZW1vdmUodGhpcyksdGhpc31jbGVhcigpe3JldHVybiB0aGlzLnJlbW92ZSguLi50aGlzLmNoaWxkcmVuKX1hdHRhY2godCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLEZlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksdC5wYXJlbnQhPT1udWxsJiYodC5wYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLEZlLm11bHRpcGx5KHQucGFyZW50Lm1hdHJpeFdvcmxkKSksdC5hcHBseU1hdHJpeDQoRmUpLHQucmVtb3ZlRnJvbVBhcmVudCgpLHQucGFyZW50PXRoaXMsdGhpcy5jaGlsZHJlbi5wdXNoKHQpLHQudXBkYXRlV29ybGRNYXRyaXgoITEsITApLHQuZGlzcGF0Y2hFdmVudChXYyksR24uY2hpbGQ9dCx0aGlzLmRpc3BhdGNoRXZlbnQoR24pLEduLmNoaWxkPW51bGwsdGhpc31nZXRPYmplY3RCeUlkKHQpe3JldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoImlkIix0KX1nZXRPYmplY3RCeU5hbWUodCl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgibmFtZSIsdCl9Z2V0T2JqZWN0QnlQcm9wZXJ0eSh0LGUpe2lmKHRoaXNbdF09PT1lKXJldHVybiB0aGlzO2ZvcihsZXQgbj0wLHM9dGhpcy5jaGlsZHJlbi5sZW5ndGg7bjxzO24rKyl7Y29uc3Qgbz10aGlzLmNoaWxkcmVuW25dLmdldE9iamVjdEJ5UHJvcGVydHkodCxlKTtpZihvIT09dm9pZCAwKXJldHVybiBvfX1nZXRPYmplY3RzQnlQcm9wZXJ0eSh0LGUsbj1bXSl7dGhpc1t0XT09PWUmJm4ucHVzaCh0aGlzKTtjb25zdCBzPXRoaXMuY2hpbGRyZW47Zm9yKGxldCByPTAsbz1zLmxlbmd0aDtyPG87cisrKXNbcl0uZ2V0T2JqZWN0c0J5UHJvcGVydHkodCxlLG4pO3JldHVybiBufWdldFdvcmxkUG9zaXRpb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpfWdldFdvcmxkUXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoQmksdCxfZiksdH1nZXRXb3JsZFNjYWxlKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShCaSx6Zix0KSx0fWdldFdvcmxkRGlyZWN0aW9uKHQpe3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpO2NvbnN0IGU9dGhpcy5tYXRyaXhXb3JsZC5lbGVtZW50cztyZXR1cm4gdC5zZXQoZVs4XSxlWzldLGVbMTBdKS5ub3JtYWxpemUoKX1yYXljYXN0KCl7fXRyYXZlcnNlKHQpe3QodGhpcyk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLHM9ZS5sZW5ndGg7bjxzO24rKyllW25dLnRyYXZlcnNlKHQpfXRyYXZlcnNlVmlzaWJsZSh0KXtpZih0aGlzLnZpc2libGU9PT0hMSlyZXR1cm47dCh0aGlzKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAscz1lLmxlbmd0aDtuPHM7bisrKWVbbl0udHJhdmVyc2VWaXNpYmxlKHQpfXRyYXZlcnNlQW5jZXN0b3JzKHQpe2NvbnN0IGU9dGhpcy5wYXJlbnQ7ZSE9PW51bGwmJih0KGUpLGUudHJhdmVyc2VBbmNlc3RvcnModCkpfXVwZGF0ZU1hdHJpeCgpe3RoaXMubWF0cml4LmNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSksdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfXVwZGF0ZU1hdHJpeFdvcmxkKHQpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSwodGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlfHx0KSYmKHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPT09ITAmJih0aGlzLnBhcmVudD09PW51bGw/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpKSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITEsdD0hMCk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLHM9ZS5sZW5ndGg7bjxzO24rKyllW25dLnVwZGF0ZU1hdHJpeFdvcmxkKHQpfXVwZGF0ZVdvcmxkTWF0cml4KHQsZSl7Y29uc3Qgbj10aGlzLnBhcmVudDtpZih0PT09ITAmJm4hPT1udWxsJiZuLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9PT0hMCYmKHRoaXMucGFyZW50PT09bnVsbD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCkpLGU9PT0hMCl7Y29uc3Qgcz10aGlzLmNoaWxkcmVuO2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrKylzW3JdLnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKX19dG9KU09OKHQpe2NvbnN0IGU9dD09PXZvaWQgMHx8dHlwZW9mIHQ9PSJzdHJpbmciLG49e307ZSYmKHQ9e2dlb21ldHJpZXM6e30sbWF0ZXJpYWxzOnt9LHRleHR1cmVzOnt9LGltYWdlczp7fSxzaGFwZXM6e30sc2tlbGV0b25zOnt9LGFuaW1hdGlvbnM6e30sbm9kZXM6e319LG4ubWV0YWRhdGE9e3ZlcnNpb246NC43LHR5cGU6Ik9iamVjdCIsZ2VuZXJhdG9yOiJPYmplY3QzRC50b0pTT04ifSk7Y29uc3Qgcz17fTtzLnV1aWQ9dGhpcy51dWlkLHMudHlwZT10aGlzLnR5cGUsdGhpcy5uYW1lIT09IiImJihzLm5hbWU9dGhpcy5uYW1lKSx0aGlzLmNhc3RTaGFkb3c9PT0hMCYmKHMuY2FzdFNoYWRvdz0hMCksdGhpcy5yZWNlaXZlU2hhZG93PT09ITAmJihzLnJlY2VpdmVTaGFkb3c9ITApLHRoaXMudmlzaWJsZT09PSExJiYocy52aXNpYmxlPSExKSx0aGlzLmZydXN0dW1DdWxsZWQ9PT0hMSYmKHMuZnJ1c3R1bUN1bGxlZD0hMSksdGhpcy5yZW5kZXJPcmRlciE9PTAmJihzLnJlbmRlck9yZGVyPXRoaXMucmVuZGVyT3JkZXIpLE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYocy51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSxzLmxheWVycz10aGlzLmxheWVycy5tYXNrLHMubWF0cml4PXRoaXMubWF0cml4LnRvQXJyYXkoKSxzLnVwPXRoaXMudXAudG9BcnJheSgpLHRoaXMubWF0cml4QXV0b1VwZGF0ZT09PSExJiYocy5tYXRyaXhBdXRvVXBkYXRlPSExKSx0aGlzLmlzSW5zdGFuY2VkTWVzaCYmKHMudHlwZT0iSW5zdGFuY2VkTWVzaCIscy5jb3VudD10aGlzLmNvdW50LHMuaW5zdGFuY2VNYXRyaXg9dGhpcy5pbnN0YW5jZU1hdHJpeC50b0pTT04oKSx0aGlzLmluc3RhbmNlQ29sb3IhPT1udWxsJiYocy5pbnN0YW5jZUNvbG9yPXRoaXMuaW5zdGFuY2VDb2xvci50b0pTT04oKSkpLHRoaXMuaXNCYXRjaGVkTWVzaCYmKHMudHlwZT0iQmF0Y2hlZE1lc2giLHMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZD10aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQscy5zb3J0T2JqZWN0cz10aGlzLnNvcnRPYmplY3RzLHMuZHJhd1Jhbmdlcz10aGlzLl9kcmF3UmFuZ2VzLHMucmVzZXJ2ZWRSYW5nZXM9dGhpcy5fcmVzZXJ2ZWRSYW5nZXMscy5nZW9tZXRyeUluZm89dGhpcy5fZ2VvbWV0cnlJbmZvLm1hcChhPT5LZShWdCh7fSxhKSx7Ym91bmRpbmdCb3g6YS5ib3VuZGluZ0JveD9hLmJvdW5kaW5nQm94LnRvSlNPTigpOnZvaWQgMCxib3VuZGluZ1NwaGVyZTphLmJvdW5kaW5nU3BoZXJlP2EuYm91bmRpbmdTcGhlcmUudG9KU09OKCk6dm9pZCAwfSkpLHMuaW5zdGFuY2VJbmZvPXRoaXMuX2luc3RhbmNlSW5mby5tYXAoYT0+VnQoe30sYSkpLHMuYXZhaWxhYmxlSW5zdGFuY2VJZHM9dGhpcy5fYXZhaWxhYmxlSW5zdGFuY2VJZHMuc2xpY2UoKSxzLmF2YWlsYWJsZUdlb21ldHJ5SWRzPXRoaXMuX2F2YWlsYWJsZUdlb21ldHJ5SWRzLnNsaWNlKCkscy5uZXh0SW5kZXhTdGFydD10aGlzLl9uZXh0SW5kZXhTdGFydCxzLm5leHRWZXJ0ZXhTdGFydD10aGlzLl9uZXh0VmVydGV4U3RhcnQscy5nZW9tZXRyeUNvdW50PXRoaXMuX2dlb21ldHJ5Q291bnQscy5tYXhJbnN0YW5jZUNvdW50PXRoaXMuX21heEluc3RhbmNlQ291bnQscy5tYXhWZXJ0ZXhDb3VudD10aGlzLl9tYXhWZXJ0ZXhDb3VudCxzLm1heEluZGV4Q291bnQ9dGhpcy5fbWF4SW5kZXhDb3VudCxzLmdlb21ldHJ5SW5pdGlhbGl6ZWQ9dGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZCxzLm1hdHJpY2VzVGV4dHVyZT10aGlzLl9tYXRyaWNlc1RleHR1cmUudG9KU09OKHQpLHMuaW5kaXJlY3RUZXh0dXJlPXRoaXMuX2luZGlyZWN0VGV4dHVyZS50b0pTT04odCksdGhpcy5fY29sb3JzVGV4dHVyZSE9PW51bGwmJihzLmNvbG9yc1RleHR1cmU9dGhpcy5fY29sb3JzVGV4dHVyZS50b0pTT04odCkpLHRoaXMuYm91bmRpbmdTcGhlcmUhPT1udWxsJiYocy5ib3VuZGluZ1NwaGVyZT10aGlzLmJvdW5kaW5nU3BoZXJlLnRvSlNPTigpKSx0aGlzLmJvdW5kaW5nQm94IT09bnVsbCYmKHMuYm91bmRpbmdCb3g9dGhpcy5ib3VuZGluZ0JveC50b0pTT04oKSkpO2Z1bmN0aW9uIHIoYSxjKXtyZXR1cm4gYVtjLnV1aWRdPT09dm9pZCAwJiYoYVtjLnV1aWRdPWMudG9KU09OKHQpKSxjLnV1aWR9aWYodGhpcy5pc1NjZW5lKXRoaXMuYmFja2dyb3VuZCYmKHRoaXMuYmFja2dyb3VuZC5pc0NvbG9yP3MuYmFja2dyb3VuZD10aGlzLmJhY2tncm91bmQudG9KU09OKCk6dGhpcy5iYWNrZ3JvdW5kLmlzVGV4dHVyZSYmKHMuYmFja2dyb3VuZD10aGlzLmJhY2tncm91bmQudG9KU09OKHQpLnV1aWQpKSx0aGlzLmVudmlyb25tZW50JiZ0aGlzLmVudmlyb25tZW50LmlzVGV4dHVyZSYmdGhpcy5lbnZpcm9ubWVudC5pc1JlbmRlclRhcmdldFRleHR1cmUhPT0hMCYmKHMuZW52aXJvbm1lbnQ9dGhpcy5lbnZpcm9ubWVudC50b0pTT04odCkudXVpZCk7ZWxzZSBpZih0aGlzLmlzTWVzaHx8dGhpcy5pc0xpbmV8fHRoaXMuaXNQb2ludHMpe3MuZ2VvbWV0cnk9cih0Lmdlb21ldHJpZXMsdGhpcy5nZW9tZXRyeSk7Y29uc3QgYT10aGlzLmdlb21ldHJ5LnBhcmFtZXRlcnM7aWYoYSE9PXZvaWQgMCYmYS5zaGFwZXMhPT12b2lkIDApe2NvbnN0IGM9YS5zaGFwZXM7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IobGV0IGw9MCxoPWMubGVuZ3RoO2w8aDtsKyspe2NvbnN0IHU9Y1tsXTtyKHQuc2hhcGVzLHUpfWVsc2Ugcih0LnNoYXBlcyxjKX19aWYodGhpcy5pc1NraW5uZWRNZXNoJiYocy5iaW5kTW9kZT10aGlzLmJpbmRNb2RlLHMuYmluZE1hdHJpeD10aGlzLmJpbmRNYXRyaXgudG9BcnJheSgpLHRoaXMuc2tlbGV0b24hPT12b2lkIDAmJihyKHQuc2tlbGV0b25zLHRoaXMuc2tlbGV0b24pLHMuc2tlbGV0b249dGhpcy5za2VsZXRvbi51dWlkKSksdGhpcy5tYXRlcmlhbCE9PXZvaWQgMClpZihBcnJheS5pc0FycmF5KHRoaXMubWF0ZXJpYWwpKXtjb25zdCBhPVtdO2ZvcihsZXQgYz0wLGw9dGhpcy5tYXRlcmlhbC5sZW5ndGg7YzxsO2MrKylhLnB1c2gocih0Lm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsW2NdKSk7cy5tYXRlcmlhbD1hfWVsc2Ugcy5tYXRlcmlhbD1yKHQubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWwpO2lmKHRoaXMuY2hpbGRyZW4ubGVuZ3RoPjApe3MuY2hpbGRyZW49W107Zm9yKGxldCBhPTA7YTx0aGlzLmNoaWxkcmVuLmxlbmd0aDthKyspcy5jaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5bYV0udG9KU09OKHQpLm9iamVjdCl9aWYodGhpcy5hbmltYXRpb25zLmxlbmd0aD4wKXtzLmFuaW1hdGlvbnM9W107Zm9yKGxldCBhPTA7YTx0aGlzLmFuaW1hdGlvbnMubGVuZ3RoO2ErKyl7Y29uc3QgYz10aGlzLmFuaW1hdGlvbnNbYV07cy5hbmltYXRpb25zLnB1c2gocih0LmFuaW1hdGlvbnMsYykpfX1pZihlKXtjb25zdCBhPW8odC5nZW9tZXRyaWVzKSxjPW8odC5tYXRlcmlhbHMpLGw9byh0LnRleHR1cmVzKSxoPW8odC5pbWFnZXMpLHU9byh0LnNoYXBlcyksZj1vKHQuc2tlbGV0b25zKSxkPW8odC5hbmltYXRpb25zKSxwPW8odC5ub2Rlcyk7YS5sZW5ndGg+MCYmKG4uZ2VvbWV0cmllcz1hKSxjLmxlbmd0aD4wJiYobi5tYXRlcmlhbHM9YyksbC5sZW5ndGg+MCYmKG4udGV4dHVyZXM9bCksaC5sZW5ndGg+MCYmKG4uaW1hZ2VzPWgpLHUubGVuZ3RoPjAmJihuLnNoYXBlcz11KSxmLmxlbmd0aD4wJiYobi5za2VsZXRvbnM9ZiksZC5sZW5ndGg+MCYmKG4uYW5pbWF0aW9ucz1kKSxwLmxlbmd0aD4wJiYobi5ub2Rlcz1wKX1yZXR1cm4gbi5vYmplY3Q9cyxuO2Z1bmN0aW9uIG8oYSl7Y29uc3QgYz1bXTtmb3IoY29uc3QgbCBpbiBhKXtjb25zdCBoPWFbbF07ZGVsZXRlIGgubWV0YWRhdGEsYy5wdXNoKGgpfXJldHVybiBjfX1jbG9uZSh0KXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMsdCl9Y29weSh0LGU9ITApe2lmKHRoaXMubmFtZT10Lm5hbWUsdGhpcy51cC5jb3B5KHQudXApLHRoaXMucG9zaXRpb24uY29weSh0LnBvc2l0aW9uKSx0aGlzLnJvdGF0aW9uLm9yZGVyPXQucm90YXRpb24ub3JkZXIsdGhpcy5xdWF0ZXJuaW9uLmNvcHkodC5xdWF0ZXJuaW9uKSx0aGlzLnNjYWxlLmNvcHkodC5zY2FsZSksdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5tYXRyaXhXb3JsZC5jb3B5KHQubWF0cml4V29ybGQpLHRoaXMubWF0cml4QXV0b1VwZGF0ZT10Lm1hdHJpeEF1dG9VcGRhdGUsdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9dC5tYXRyaXhXb3JsZEF1dG9VcGRhdGUsdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPXQubWF0cml4V29ybGROZWVkc1VwZGF0ZSx0aGlzLmxheWVycy5tYXNrPXQubGF5ZXJzLm1hc2ssdGhpcy52aXNpYmxlPXQudmlzaWJsZSx0aGlzLmNhc3RTaGFkb3c9dC5jYXN0U2hhZG93LHRoaXMucmVjZWl2ZVNoYWRvdz10LnJlY2VpdmVTaGFkb3csdGhpcy5mcnVzdHVtQ3VsbGVkPXQuZnJ1c3R1bUN1bGxlZCx0aGlzLnJlbmRlck9yZGVyPXQucmVuZGVyT3JkZXIsdGhpcy5hbmltYXRpb25zPXQuYW5pbWF0aW9ucy5zbGljZSgpLHRoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnVzZXJEYXRhKSksZT09PSEwKWZvcihsZXQgbj0wO248dC5jaGlsZHJlbi5sZW5ndGg7bisrKXtjb25zdCBzPXQuY2hpbGRyZW5bbl07dGhpcy5hZGQocy5jbG9uZSgpKX1yZXR1cm4gdGhpc319SWUuREVGQVVMVF9VUD1uZXcgUCgwLDEsMCksSWUuREVGQVVMVF9NQVRSSVhfQVVUT19VUERBVEU9ITAsSWUuREVGQVVMVF9NQVRSSVhfV09STERfQVVUT19VUERBVEU9ITA7Y29uc3QgbWU9bmV3IFAsTmU9bmV3IFAsU289bmV3IFAsa2U9bmV3IFAsSG49bmV3IFAsSm49bmV3IFAsR2M9bmV3IFAsdm89bmV3IFAsX289bmV3IFAsem89bmV3IFAsVG89bmV3IGllLFBvPW5ldyBpZSxDbz1uZXcgaWU7Y2xhc3MgZXR7Y29uc3RydWN0b3IodD1uZXcgUCxlPW5ldyBQLG49bmV3IFApe3RoaXMuYT10LHRoaXMuYj1lLHRoaXMuYz1ufXN0YXRpYyBnZXROb3JtYWwodCxlLG4scyl7cy5zdWJWZWN0b3JzKG4sZSksbWUuc3ViVmVjdG9ycyh0LGUpLHMuY3Jvc3MobWUpO2NvbnN0IHI9cy5sZW5ndGhTcSgpO3JldHVybiByPjA/cy5tdWx0aXBseVNjYWxhcigxL01hdGguc3FydChyKSk6cy5zZXQoMCwwLDApfXN0YXRpYyBnZXRCYXJ5Y29vcmQodCxlLG4scyxyKXttZS5zdWJWZWN0b3JzKHMsZSksTmUuc3ViVmVjdG9ycyhuLGUpLFNvLnN1YlZlY3RvcnModCxlKTtjb25zdCBvPW1lLmRvdChtZSksYT1tZS5kb3QoTmUpLGM9bWUuZG90KFNvKSxsPU5lLmRvdChOZSksaD1OZS5kb3QoU28pLHU9bypsLWEqYTtpZih1PT09MClyZXR1cm4gci5zZXQoMCwwLDApLG51bGw7Y29uc3QgZj0xL3UsZD0obCpjLWEqaCkqZixwPShvKmgtYSpjKSpmO3JldHVybiByLnNldCgxLWQtcCxwLGQpfXN0YXRpYyBjb250YWluc1BvaW50KHQsZSxuLHMpe3JldHVybiB0aGlzLmdldEJhcnljb29yZCh0LGUsbixzLGtlKT09PW51bGw/ITE6a2UueD49MCYma2UueT49MCYma2UueCtrZS55PD0xfXN0YXRpYyBnZXRJbnRlcnBvbGF0aW9uKHQsZSxuLHMscixvLGEsYyl7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKHQsZSxuLHMsa2UpPT09bnVsbD8oYy54PTAsYy55PTAsInoiaW4gYyYmKGMuej0wKSwidyJpbiBjJiYoYy53PTApLG51bGwpOihjLnNldFNjYWxhcigwKSxjLmFkZFNjYWxlZFZlY3RvcihyLGtlLngpLGMuYWRkU2NhbGVkVmVjdG9yKG8sa2UueSksYy5hZGRTY2FsZWRWZWN0b3IoYSxrZS56KSxjKX1zdGF0aWMgZ2V0SW50ZXJwb2xhdGVkQXR0cmlidXRlKHQsZSxuLHMscixvKXtyZXR1cm4gVG8uc2V0U2NhbGFyKDApLFBvLnNldFNjYWxhcigwKSxDby5zZXRTY2FsYXIoMCksVG8uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpLFBvLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxuKSxDby5mcm9tQnVmZmVyQXR0cmlidXRlKHQscyksby5zZXRTY2FsYXIoMCksby5hZGRTY2FsZWRWZWN0b3IoVG8sci54KSxvLmFkZFNjYWxlZFZlY3RvcihQbyxyLnkpLG8uYWRkU2NhbGVkVmVjdG9yKENvLHIueiksb31zdGF0aWMgaXNGcm9udEZhY2luZyh0LGUsbixzKXtyZXR1cm4gbWUuc3ViVmVjdG9ycyhuLGUpLE5lLnN1YlZlY3RvcnModCxlKSxtZS5jcm9zcyhOZSkuZG90KHMpPDB9c2V0KHQsZSxuKXtyZXR1cm4gdGhpcy5hLmNvcHkodCksdGhpcy5iLmNvcHkoZSksdGhpcy5jLmNvcHkobiksdGhpc31zZXRGcm9tUG9pbnRzQW5kSW5kaWNlcyh0LGUsbixzKXtyZXR1cm4gdGhpcy5hLmNvcHkodFtlXSksdGhpcy5iLmNvcHkodFtuXSksdGhpcy5jLmNvcHkodFtzXSksdGhpc31zZXRGcm9tQXR0cmlidXRlQW5kSW5kaWNlcyh0LGUsbixzKXtyZXR1cm4gdGhpcy5hLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSx0aGlzLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LG4pLHRoaXMuYy5mcm9tQnVmZmVyQXR0cmlidXRlKHQscyksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5hLmNvcHkodC5hKSx0aGlzLmIuY29weSh0LmIpLHRoaXMuYy5jb3B5KHQuYyksdGhpc31nZXRBcmVhKCl7cmV0dXJuIG1lLnN1YlZlY3RvcnModGhpcy5jLHRoaXMuYiksTmUuc3ViVmVjdG9ycyh0aGlzLmEsdGhpcy5iKSxtZS5jcm9zcyhOZSkubGVuZ3RoKCkqLjV9Z2V0TWlkcG9pbnQodCl7cmV0dXJuIHQuYWRkVmVjdG9ycyh0aGlzLmEsdGhpcy5iKS5hZGQodGhpcy5jKS5tdWx0aXBseVNjYWxhcigxLzMpfWdldE5vcm1hbCh0KXtyZXR1cm4gZXQuZ2V0Tm9ybWFsKHRoaXMuYSx0aGlzLmIsdGhpcy5jLHQpfWdldFBsYW5lKHQpe3JldHVybiB0LnNldEZyb21Db3BsYW5hclBvaW50cyh0aGlzLmEsdGhpcy5iLHRoaXMuYyl9Z2V0QmFyeWNvb3JkKHQsZSl7cmV0dXJuIGV0LmdldEJhcnljb29yZCh0LHRoaXMuYSx0aGlzLmIsdGhpcy5jLGUpfWdldEludGVycG9sYXRpb24odCxlLG4scyxyKXtyZXR1cm4gZXQuZ2V0SW50ZXJwb2xhdGlvbih0LHRoaXMuYSx0aGlzLmIsdGhpcy5jLGUsbixzLHIpfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuIGV0LmNvbnRhaW5zUG9pbnQodCx0aGlzLmEsdGhpcy5iLHRoaXMuYyl9aXNGcm9udEZhY2luZyh0KXtyZXR1cm4gZXQuaXNGcm9udEZhY2luZyh0aGlzLmEsdGhpcy5iLHRoaXMuYyx0KX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNUcmlhbmdsZSh0aGlzKX1jbG9zZXN0UG9pbnRUb1BvaW50KHQsZSl7Y29uc3Qgbj10aGlzLmEscz10aGlzLmIscj10aGlzLmM7bGV0IG8sYTtIbi5zdWJWZWN0b3JzKHMsbiksSm4uc3ViVmVjdG9ycyhyLG4pLHZvLnN1YlZlY3RvcnModCxuKTtjb25zdCBjPUhuLmRvdCh2byksbD1Kbi5kb3Qodm8pO2lmKGM8PTAmJmw8PTApcmV0dXJuIGUuY29weShuKTtfby5zdWJWZWN0b3JzKHQscyk7Y29uc3QgaD1Ibi5kb3QoX28pLHU9Sm4uZG90KF9vKTtpZihoPj0wJiZ1PD1oKXJldHVybiBlLmNvcHkocyk7Y29uc3QgZj1jKnUtaCpsO2lmKGY8PTAmJmM+PTAmJmg8PTApcmV0dXJuIG89Yy8oYy1oKSxlLmNvcHkobikuYWRkU2NhbGVkVmVjdG9yKEhuLG8pO3pvLnN1YlZlY3RvcnModCxyKTtjb25zdCBkPUhuLmRvdCh6bykscD1Kbi5kb3Qoem8pO2lmKHA+PTAmJmQ8PXApcmV0dXJuIGUuY29weShyKTtjb25zdCB5PWQqbC1jKnA7aWYoeTw9MCYmbD49MCYmcDw9MClyZXR1cm4gYT1sLyhsLXApLGUuY29weShuKS5hZGRTY2FsZWRWZWN0b3IoSm4sYSk7Y29uc3QgZz1oKnAtZCp1O2lmKGc8PTAmJnUtaD49MCYmZC1wPj0wKXJldHVybiBHYy5zdWJWZWN0b3JzKHIscyksYT0odS1oKS8odS1oKyhkLXApKSxlLmNvcHkocykuYWRkU2NhbGVkVmVjdG9yKEdjLGEpO2NvbnN0IHc9MS8oZyt5K2YpO3JldHVybiBvPXkqdyxhPWYqdyxlLmNvcHkobikuYWRkU2NhbGVkVmVjdG9yKEhuLG8pLmFkZFNjYWxlZFZlY3RvcihKbixhKX1lcXVhbHModCl7cmV0dXJuIHQuYS5lcXVhbHModGhpcy5hKSYmdC5iLmVxdWFscyh0aGlzLmIpJiZ0LmMuZXF1YWxzKHRoaXMuYyl9fWNvbnN0IEhjPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9LHJuPXtoOjAsczowLGw6MH0sU3M9e2g6MCxzOjAsbDowfTtmdW5jdGlvbiBCbyhpLHQsZSl7cmV0dXJuIGU8MCYmKGUrPTEpLGU+MSYmKGUtPTEpLGU8MS82P2krKHQtaSkqNiplOmU8MS8yP3Q6ZTwyLzM/aSsodC1pKSo2KigyLzMtZSk6aX1sZXQgdnM9Y2xhc3N7Y29uc3RydWN0b3IodCxlLG4pe3JldHVybiB0aGlzLmlzQ29sb3I9ITAsdGhpcy5yPTEsdGhpcy5nPTEsdGhpcy5iPTEsdGhpcy5zZXQodCxlLG4pfXNldCh0LGUsbil7aWYoZT09PXZvaWQgMCYmbj09PXZvaWQgMCl7Y29uc3Qgcz10O3MmJnMuaXNDb2xvcj90aGlzLmNvcHkocyk6dHlwZW9mIHM9PSJudW1iZXIiP3RoaXMuc2V0SGV4KHMpOnR5cGVvZiBzPT0ic3RyaW5nIiYmdGhpcy5zZXRTdHlsZShzKX1lbHNlIHRoaXMuc2V0UkdCKHQsZSxuKTtyZXR1cm4gdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMucj10LHRoaXMuZz10LHRoaXMuYj10LHRoaXN9c2V0SGV4KHQsZT1mZSl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSx0aGlzLnI9KHQ+PjE2JjI1NSkvMjU1LHRoaXMuZz0odD4+OCYyNTUpLzI1NSx0aGlzLmI9KHQmMjU1KS8yNTUsZGUuY29sb3JTcGFjZVRvV29ya2luZyh0aGlzLGUpLHRoaXN9c2V0UkdCKHQsZSxuLHM9ZGUud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiB0aGlzLnI9dCx0aGlzLmc9ZSx0aGlzLmI9bixkZS5jb2xvclNwYWNlVG9Xb3JraW5nKHRoaXMscyksdGhpc31zZXRIU0wodCxlLG4scz1kZS53b3JraW5nQ29sb3JTcGFjZSl7aWYodD1wZih0LDEpLGU9VyhlLDAsMSksbj1XKG4sMCwxKSxlPT09MCl0aGlzLnI9dGhpcy5nPXRoaXMuYj1uO2Vsc2V7Y29uc3Qgcj1uPD0uNT9uKigxK2UpOm4rZS1uKmUsbz0yKm4tcjt0aGlzLnI9Qm8obyxyLHQrMS8zKSx0aGlzLmc9Qm8obyxyLHQpLHRoaXMuYj1CbyhvLHIsdC0xLzMpfXJldHVybiBkZS5jb2xvclNwYWNlVG9Xb3JraW5nKHRoaXMscyksdGhpc31zZXRTdHlsZSh0LGU9ZmUpe2Z1bmN0aW9uIG4ocil7ciE9PXZvaWQgMCYmcGFyc2VGbG9hdChyKTwxJiZ2dCgiQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAiK3QrIiB3aWxsIGJlIGlnbm9yZWQuIil9bGV0IHM7aWYocz0vXihcdyspXCgoW15cKV0qKVwpLy5leGVjKHQpKXtsZXQgcjtjb25zdCBvPXNbMV0sYT1zWzJdO3N3aXRjaChvKXtjYXNlInJnYiI6Y2FzZSJyZ2JhIjppZihyPS9eXHMqKFxkKylccyosXHMqKFxkKylccyosXHMqKFxkKylccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIG4ocls0XSksdGhpcy5zZXRSR0IoTWF0aC5taW4oMjU1LHBhcnNlSW50KHJbMV0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KHJbMl0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KHJbM10sMTApKS8yNTUsZSk7aWYocj0vXlxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKGEpKXJldHVybiBuKHJbNF0pLHRoaXMuc2V0UkdCKE1hdGgubWluKDEwMCxwYXJzZUludChyWzFdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludChyWzJdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludChyWzNdLDEwKSkvMTAwLGUpO2JyZWFrO2Nhc2UiaHNsIjpjYXNlImhzbGEiOmlmKHI9L15ccyooXGQqXC4/XGQrKVxzKixccyooXGQqXC4/XGQrKVwlXHMqLFxzKihcZCpcLj9cZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIG4ocls0XSksdGhpcy5zZXRIU0wocGFyc2VGbG9hdChyWzFdKS8zNjAscGFyc2VGbG9hdChyWzJdKS8xMDAscGFyc2VGbG9hdChyWzNdKS8xMDAsZSk7YnJlYWs7ZGVmYXVsdDp2dCgiQ29sb3I6IFVua25vd24gY29sb3IgbW9kZWwgIit0KX19ZWxzZSBpZihzPS9eXCMoW0EtRmEtZlxkXSspJC8uZXhlYyh0KSl7Y29uc3Qgcj1zWzFdLG89ci5sZW5ndGg7aWYobz09PTMpcmV0dXJuIHRoaXMuc2V0UkdCKHBhcnNlSW50KHIuY2hhckF0KDApLDE2KS8xNSxwYXJzZUludChyLmNoYXJBdCgxKSwxNikvMTUscGFyc2VJbnQoci5jaGFyQXQoMiksMTYpLzE1LGUpO2lmKG89PT02KXJldHVybiB0aGlzLnNldEhleChwYXJzZUludChyLDE2KSxlKTt2dCgiQ29sb3I6IEludmFsaWQgaGV4IGNvbG9yICIrdCl9ZWxzZSBpZih0JiZ0Lmxlbmd0aD4wKXJldHVybiB0aGlzLnNldENvbG9yTmFtZSh0LGUpO3JldHVybiB0aGlzfXNldENvbG9yTmFtZSh0LGU9ZmUpe2NvbnN0IG49SGNbdC50b0xvd2VyQ2FzZSgpXTtyZXR1cm4gbiE9PXZvaWQgMD90aGlzLnNldEhleChuLGUpOnZ0KCJDb2xvcjogVW5rbm93biBjb2xvciAiK3QpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5yLHRoaXMuZyx0aGlzLmIpfWNvcHkodCl7cmV0dXJuIHRoaXMucj10LnIsdGhpcy5nPXQuZyx0aGlzLmI9dC5iLHRoaXN9Y29weVNSR0JUb0xpbmVhcih0KXtyZXR1cm4gdGhpcy5yPUNlKHQuciksdGhpcy5nPUNlKHQuZyksdGhpcy5iPUNlKHQuYiksdGhpc31jb3B5TGluZWFyVG9TUkdCKHQpe3JldHVybiB0aGlzLnI9JG4odC5yKSx0aGlzLmc9JG4odC5nKSx0aGlzLmI9JG4odC5iKSx0aGlzfWNvbnZlcnRTUkdCVG9MaW5lYXIoKXtyZXR1cm4gdGhpcy5jb3B5U1JHQlRvTGluZWFyKHRoaXMpLHRoaXN9Y29udmVydExpbmVhclRvU1JHQigpe3JldHVybiB0aGlzLmNvcHlMaW5lYXJUb1NSR0IodGhpcyksdGhpc31nZXRIZXgodD1mZSl7cmV0dXJuIGRlLndvcmtpbmdUb0NvbG9yU3BhY2UoQ3QuY29weSh0aGlzKSx0KSxNYXRoLnJvdW5kKFcoQ3QucioyNTUsMCwyNTUpKSo2NTUzNitNYXRoLnJvdW5kKFcoQ3QuZyoyNTUsMCwyNTUpKSoyNTYrTWF0aC5yb3VuZChXKEN0LmIqMjU1LDAsMjU1KSl9Z2V0SGV4U3RyaW5nKHQ9ZmUpe3JldHVybigiMDAwMDAwIit0aGlzLmdldEhleCh0KS50b1N0cmluZygxNikpLnNsaWNlKC02KX1nZXRIU0wodCxlPWRlLndvcmtpbmdDb2xvclNwYWNlKXtkZS53b3JraW5nVG9Db2xvclNwYWNlKEN0LmNvcHkodGhpcyksZSk7Y29uc3Qgbj1DdC5yLHM9Q3QuZyxyPUN0LmIsbz1NYXRoLm1heChuLHMsciksYT1NYXRoLm1pbihuLHMscik7bGV0IGMsbDtjb25zdCBoPShhK28pLzI7aWYoYT09PW8pYz0wLGw9MDtlbHNle2NvbnN0IHU9by1hO3N3aXRjaChsPWg8PS41P3UvKG8rYSk6dS8oMi1vLWEpLG8pe2Nhc2UgbjpjPShzLXIpL3UrKHM8cj82OjApO2JyZWFrO2Nhc2UgczpjPShyLW4pL3UrMjticmVhaztjYXNlIHI6Yz0obi1zKS91KzQ7YnJlYWt9Yy89Nn1yZXR1cm4gdC5oPWMsdC5zPWwsdC5sPWgsdH1nZXRSR0IodCxlPWRlLndvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gZGUud29ya2luZ1RvQ29sb3JTcGFjZShDdC5jb3B5KHRoaXMpLGUpLHQucj1DdC5yLHQuZz1DdC5nLHQuYj1DdC5iLHR9Z2V0U3R5bGUodD1mZSl7ZGUud29ya2luZ1RvQ29sb3JTcGFjZShDdC5jb3B5KHRoaXMpLHQpO2NvbnN0IGU9Q3QucixuPUN0Lmcscz1DdC5iO3JldHVybiB0IT09ZmU/YGNvbG9yKCR7dH0gJHtlLnRvRml4ZWQoMyl9ICR7bi50b0ZpeGVkKDMpfSAke3MudG9GaXhlZCgzKX0pYDpgcmdiKCR7TWF0aC5yb3VuZChlKjI1NSl9LCR7TWF0aC5yb3VuZChuKjI1NSl9LCR7TWF0aC5yb3VuZChzKjI1NSl9KWB9b2Zmc2V0SFNMKHQsZSxuKXtyZXR1cm4gdGhpcy5nZXRIU0wocm4pLHRoaXMuc2V0SFNMKHJuLmgrdCxybi5zK2Uscm4ubCtuKX1hZGQodCl7cmV0dXJuIHRoaXMucis9dC5yLHRoaXMuZys9dC5nLHRoaXMuYis9dC5iLHRoaXN9YWRkQ29sb3JzKHQsZSl7cmV0dXJuIHRoaXMucj10LnIrZS5yLHRoaXMuZz10LmcrZS5nLHRoaXMuYj10LmIrZS5iLHRoaXN9YWRkU2NhbGFyKHQpe3JldHVybiB0aGlzLnIrPXQsdGhpcy5nKz10LHRoaXMuYis9dCx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy5yPU1hdGgubWF4KDAsdGhpcy5yLXQuciksdGhpcy5nPU1hdGgubWF4KDAsdGhpcy5nLXQuZyksdGhpcy5iPU1hdGgubWF4KDAsdGhpcy5iLXQuYiksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5yKj10LnIsdGhpcy5nKj10LmcsdGhpcy5iKj10LmIsdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy5yKj10LHRoaXMuZyo9dCx0aGlzLmIqPXQsdGhpc31sZXJwKHQsZSl7cmV0dXJuIHRoaXMucis9KHQuci10aGlzLnIpKmUsdGhpcy5nKz0odC5nLXRoaXMuZykqZSx0aGlzLmIrPSh0LmItdGhpcy5iKSplLHRoaXN9bGVycENvbG9ycyh0LGUsbil7cmV0dXJuIHRoaXMucj10LnIrKGUuci10LnIpKm4sdGhpcy5nPXQuZysoZS5nLXQuZykqbix0aGlzLmI9dC5iKyhlLmItdC5iKSpuLHRoaXN9bGVycEhTTCh0LGUpe3RoaXMuZ2V0SFNMKHJuKSx0LmdldEhTTChTcyk7Y29uc3Qgbj1obyhybi5oLFNzLmgsZSkscz1obyhybi5zLFNzLnMsZSkscj1obyhybi5sLFNzLmwsZSk7cmV0dXJuIHRoaXMuc2V0SFNMKG4scyxyKSx0aGlzfXNldEZyb21WZWN0b3IzKHQpe3JldHVybiB0aGlzLnI9dC54LHRoaXMuZz10LnksdGhpcy5iPXQueix0aGlzfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMucixuPXRoaXMuZyxzPXRoaXMuYixyPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMucj1yWzBdKmUrclszXSpuK3JbNl0qcyx0aGlzLmc9clsxXSplK3JbNF0qbityWzddKnMsdGhpcy5iPXJbMl0qZStyWzVdKm4rcls4XSpzLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0LnI9PT10aGlzLnImJnQuZz09PXRoaXMuZyYmdC5iPT09dGhpcy5ifWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMucj10W2VdLHRoaXMuZz10W2UrMV0sdGhpcy5iPXRbZSsyXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMucix0W2UrMV09dGhpcy5nLHRbZSsyXT10aGlzLmIsdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMucj10LmdldFgoZSksdGhpcy5nPXQuZ2V0WShlKSx0aGlzLmI9dC5nZXRaKGUpLHRoaXN9dG9KU09OKCl7cmV0dXJuIHRoaXMuZ2V0SGV4KCl9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5yLHlpZWxkIHRoaXMuZyx5aWVsZCB0aGlzLmJ9fTtjb25zdCBDdD1uZXcgdnM7dnMuTkFNRVM9SGM7bGV0IFBmPTA7Y2xhc3MgQ2YgZXh0ZW5kcyB5c3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc01hdGVyaWFsPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOlBmKyt9KSx0aGlzLnV1aWQ9RG4oKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJNYXRlcmlhbCIsdGhpcy5ibGVuZGluZz0xLHRoaXMuc2lkZT0wLHRoaXMudmVydGV4Q29sb3JzPSExLHRoaXMub3BhY2l0eT0xLHRoaXMudHJhbnNwYXJlbnQ9ITEsdGhpcy5hbHBoYUhhc2g9ITEsdGhpcy5ibGVuZFNyYz0yMDQsdGhpcy5ibGVuZERzdD0yMDUsdGhpcy5ibGVuZEVxdWF0aW9uPTEwMCx0aGlzLmJsZW5kU3JjQWxwaGE9bnVsbCx0aGlzLmJsZW5kRHN0QWxwaGE9bnVsbCx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT1udWxsLHRoaXMuYmxlbmRDb2xvcj1uZXcgdnMoMCwwLDApLHRoaXMuYmxlbmRBbHBoYT0wLHRoaXMuZGVwdGhGdW5jPTMsdGhpcy5kZXB0aFRlc3Q9ITAsdGhpcy5kZXB0aFdyaXRlPSEwLHRoaXMuc3RlbmNpbFdyaXRlTWFzaz0yNTUsdGhpcy5zdGVuY2lsRnVuYz01MTksdGhpcy5zdGVuY2lsUmVmPTAsdGhpcy5zdGVuY2lsRnVuY01hc2s9MjU1LHRoaXMuc3RlbmNpbEZhaWw9NzY4MCx0aGlzLnN0ZW5jaWxaRmFpbD03NjgwLHRoaXMuc3RlbmNpbFpQYXNzPTc2ODAsdGhpcy5zdGVuY2lsV3JpdGU9ITEsdGhpcy5jbGlwcGluZ1BsYW5lcz1udWxsLHRoaXMuY2xpcEludGVyc2VjdGlvbj0hMSx0aGlzLmNsaXBTaGFkb3dzPSExLHRoaXMuc2hhZG93U2lkZT1udWxsLHRoaXMuY29sb3JXcml0ZT0hMCx0aGlzLnByZWNpc2lvbj1udWxsLHRoaXMucG9seWdvbk9mZnNldD0hMSx0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9MCx0aGlzLnBvbHlnb25PZmZzZXRVbml0cz0wLHRoaXMuZGl0aGVyaW5nPSExLHRoaXMuYWxwaGFUb0NvdmVyYWdlPSExLHRoaXMucHJlbXVsdGlwbGllZEFscGhhPSExLHRoaXMuZm9yY2VTaW5nbGVQYXNzPSExLHRoaXMuYWxsb3dPdmVycmlkZT0hMCx0aGlzLnZpc2libGU9ITAsdGhpcy50b25lTWFwcGVkPSEwLHRoaXMudXNlckRhdGE9e30sdGhpcy52ZXJzaW9uPTAsdGhpcy5fYWxwaGFUZXN0PTB9Z2V0IGFscGhhVGVzdCgpe3JldHVybiB0aGlzLl9hbHBoYVRlc3R9c2V0IGFscGhhVGVzdCh0KXt0aGlzLl9hbHBoYVRlc3Q+MCE9dD4wJiZ0aGlzLnZlcnNpb24rKyx0aGlzLl9hbHBoYVRlc3Q9dH1vbkJlZm9yZVJlbmRlcigpe31vbkJlZm9yZUNvbXBpbGUoKXt9Y3VzdG9tUHJvZ3JhbUNhY2hlS2V5KCl7cmV0dXJuIHRoaXMub25CZWZvcmVDb21waWxlLnRvU3RyaW5nKCl9c2V0VmFsdWVzKHQpe2lmKHQhPT12b2lkIDApZm9yKGNvbnN0IGUgaW4gdCl7Y29uc3Qgbj10W2VdO2lmKG49PT12b2lkIDApe3Z0KGBNYXRlcmlhbDogcGFyYW1ldGVyICcke2V9JyBoYXMgdmFsdWUgb2YgdW5kZWZpbmVkLmApO2NvbnRpbnVlfWNvbnN0IHM9dGhpc1tlXTtpZihzPT09dm9pZCAwKXt2dChgTWF0ZXJpYWw6ICcke2V9JyBpcyBub3QgYSBwcm9wZXJ0eSBvZiBUSFJFRS4ke3RoaXMudHlwZX0uYCk7Y29udGludWV9cyYmcy5pc0NvbG9yP3Muc2V0KG4pOnMmJnMuaXNWZWN0b3IzJiZuJiZuLmlzVmVjdG9yMz9zLmNvcHkobik6dGhpc1tlXT1ufX10b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyI7ZSYmKHQ9e3RleHR1cmVzOnt9LGltYWdlczp7fX0pO2NvbnN0IG49e21ldGFkYXRhOnt2ZXJzaW9uOjQuNyx0eXBlOiJNYXRlcmlhbCIsZ2VuZXJhdG9yOiJNYXRlcmlhbC50b0pTT04ifX07bi51dWlkPXRoaXMudXVpZCxuLnR5cGU9dGhpcy50eXBlLHRoaXMubmFtZSE9PSIiJiYobi5uYW1lPXRoaXMubmFtZSksdGhpcy5jb2xvciYmdGhpcy5jb2xvci5pc0NvbG9yJiYobi5jb2xvcj10aGlzLmNvbG9yLmdldEhleCgpKSx0aGlzLnJvdWdobmVzcyE9PXZvaWQgMCYmKG4ucm91Z2huZXNzPXRoaXMucm91Z2huZXNzKSx0aGlzLm1ldGFsbmVzcyE9PXZvaWQgMCYmKG4ubWV0YWxuZXNzPXRoaXMubWV0YWxuZXNzKSx0aGlzLnNoZWVuIT09dm9pZCAwJiYobi5zaGVlbj10aGlzLnNoZWVuKSx0aGlzLnNoZWVuQ29sb3ImJnRoaXMuc2hlZW5Db2xvci5pc0NvbG9yJiYobi5zaGVlbkNvbG9yPXRoaXMuc2hlZW5Db2xvci5nZXRIZXgoKSksdGhpcy5zaGVlblJvdWdobmVzcyE9PXZvaWQgMCYmKG4uc2hlZW5Sb3VnaG5lc3M9dGhpcy5zaGVlblJvdWdobmVzcyksdGhpcy5lbWlzc2l2ZSYmdGhpcy5lbWlzc2l2ZS5pc0NvbG9yJiYobi5lbWlzc2l2ZT10aGlzLmVtaXNzaXZlLmdldEhleCgpKSx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5IT09dm9pZCAwJiZ0aGlzLmVtaXNzaXZlSW50ZW5zaXR5IT09MSYmKG4uZW1pc3NpdmVJbnRlbnNpdHk9dGhpcy5lbWlzc2l2ZUludGVuc2l0eSksdGhpcy5zcGVjdWxhciYmdGhpcy5zcGVjdWxhci5pc0NvbG9yJiYobi5zcGVjdWxhcj10aGlzLnNwZWN1bGFyLmdldEhleCgpKSx0aGlzLnNwZWN1bGFySW50ZW5zaXR5IT09dm9pZCAwJiYobi5zcGVjdWxhckludGVuc2l0eT10aGlzLnNwZWN1bGFySW50ZW5zaXR5KSx0aGlzLnNwZWN1bGFyQ29sb3ImJnRoaXMuc3BlY3VsYXJDb2xvci5pc0NvbG9yJiYobi5zcGVjdWxhckNvbG9yPXRoaXMuc3BlY3VsYXJDb2xvci5nZXRIZXgoKSksdGhpcy5zaGluaW5lc3MhPT12b2lkIDAmJihuLnNoaW5pbmVzcz10aGlzLnNoaW5pbmVzcyksdGhpcy5jbGVhcmNvYXQhPT12b2lkIDAmJihuLmNsZWFyY29hdD10aGlzLmNsZWFyY29hdCksdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MhPT12b2lkIDAmJihuLmNsZWFyY29hdFJvdWdobmVzcz10aGlzLmNsZWFyY29hdFJvdWdobmVzcyksdGhpcy5jbGVhcmNvYXRNYXAmJnRoaXMuY2xlYXJjb2F0TWFwLmlzVGV4dHVyZSYmKG4uY2xlYXJjb2F0TWFwPXRoaXMuY2xlYXJjb2F0TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcCYmdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAuaXNUZXh0dXJlJiYobi5jbGVhcmNvYXRSb3VnaG5lc3NNYXA9dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwJiZ0aGlzLmNsZWFyY29hdE5vcm1hbE1hcC5pc1RleHR1cmUmJihuLmNsZWFyY29hdE5vcm1hbE1hcD10aGlzLmNsZWFyY29hdE5vcm1hbE1hcC50b0pTT04odCkudXVpZCxuLmNsZWFyY29hdE5vcm1hbFNjYWxlPXRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudG9BcnJheSgpKSx0aGlzLnNoZWVuQ29sb3JNYXAmJnRoaXMuc2hlZW5Db2xvck1hcC5pc1RleHR1cmUmJihuLnNoZWVuQ29sb3JNYXA9dGhpcy5zaGVlbkNvbG9yTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnNoZWVuUm91Z2huZXNzTWFwJiZ0aGlzLnNoZWVuUm91Z2huZXNzTWFwLmlzVGV4dHVyZSYmKG4uc2hlZW5Sb3VnaG5lc3NNYXA9dGhpcy5zaGVlblJvdWdobmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5kaXNwZXJzaW9uIT09dm9pZCAwJiYobi5kaXNwZXJzaW9uPXRoaXMuZGlzcGVyc2lvbiksdGhpcy5pcmlkZXNjZW5jZSE9PXZvaWQgMCYmKG4uaXJpZGVzY2VuY2U9dGhpcy5pcmlkZXNjZW5jZSksdGhpcy5pcmlkZXNjZW5jZUlPUiE9PXZvaWQgMCYmKG4uaXJpZGVzY2VuY2VJT1I9dGhpcy5pcmlkZXNjZW5jZUlPUiksdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlIT09dm9pZCAwJiYobi5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlPXRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSksdGhpcy5pcmlkZXNjZW5jZU1hcCYmdGhpcy5pcmlkZXNjZW5jZU1hcC5pc1RleHR1cmUmJihuLmlyaWRlc2NlbmNlTWFwPXRoaXMuaXJpZGVzY2VuY2VNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAmJnRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAuaXNUZXh0dXJlJiYobi5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD10aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmFuaXNvdHJvcHkhPT12b2lkIDAmJihuLmFuaXNvdHJvcHk9dGhpcy5hbmlzb3Ryb3B5KSx0aGlzLmFuaXNvdHJvcHlSb3RhdGlvbiE9PXZvaWQgMCYmKG4uYW5pc290cm9weVJvdGF0aW9uPXRoaXMuYW5pc290cm9weVJvdGF0aW9uKSx0aGlzLmFuaXNvdHJvcHlNYXAmJnRoaXMuYW5pc290cm9weU1hcC5pc1RleHR1cmUmJihuLmFuaXNvdHJvcHlNYXA9dGhpcy5hbmlzb3Ryb3B5TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLm1hcCYmdGhpcy5tYXAuaXNUZXh0dXJlJiYobi5tYXA9dGhpcy5tYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubWF0Y2FwJiZ0aGlzLm1hdGNhcC5pc1RleHR1cmUmJihuLm1hdGNhcD10aGlzLm1hdGNhcC50b0pTT04odCkudXVpZCksdGhpcy5hbHBoYU1hcCYmdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUmJihuLmFscGhhTWFwPXRoaXMuYWxwaGFNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubGlnaHRNYXAmJnRoaXMubGlnaHRNYXAuaXNUZXh0dXJlJiYobi5saWdodE1hcD10aGlzLmxpZ2h0TWFwLnRvSlNPTih0KS51dWlkLG4ubGlnaHRNYXBJbnRlbnNpdHk9dGhpcy5saWdodE1hcEludGVuc2l0eSksdGhpcy5hb01hcCYmdGhpcy5hb01hcC5pc1RleHR1cmUmJihuLmFvTWFwPXRoaXMuYW9NYXAudG9KU09OKHQpLnV1aWQsbi5hb01hcEludGVuc2l0eT10aGlzLmFvTWFwSW50ZW5zaXR5KSx0aGlzLmJ1bXBNYXAmJnRoaXMuYnVtcE1hcC5pc1RleHR1cmUmJihuLmJ1bXBNYXA9dGhpcy5idW1wTWFwLnRvSlNPTih0KS51dWlkLG4uYnVtcFNjYWxlPXRoaXMuYnVtcFNjYWxlKSx0aGlzLm5vcm1hbE1hcCYmdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlJiYobi5ub3JtYWxNYXA9dGhpcy5ub3JtYWxNYXAudG9KU09OKHQpLnV1aWQsbi5ub3JtYWxNYXBUeXBlPXRoaXMubm9ybWFsTWFwVHlwZSxuLm5vcm1hbFNjYWxlPXRoaXMubm9ybWFsU2NhbGUudG9BcnJheSgpKSx0aGlzLmRpc3BsYWNlbWVudE1hcCYmdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlJiYobi5kaXNwbGFjZW1lbnRNYXA9dGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKHQpLnV1aWQsbi5kaXNwbGFjZW1lbnRTY2FsZT10aGlzLmRpc3BsYWNlbWVudFNjYWxlLG4uZGlzcGxhY2VtZW50Qmlhcz10aGlzLmRpc3BsYWNlbWVudEJpYXMpLHRoaXMucm91Z2huZXNzTWFwJiZ0aGlzLnJvdWdobmVzc01hcC5pc1RleHR1cmUmJihuLnJvdWdobmVzc01hcD10aGlzLnJvdWdobmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5tZXRhbG5lc3NNYXAmJnRoaXMubWV0YWxuZXNzTWFwLmlzVGV4dHVyZSYmKG4ubWV0YWxuZXNzTWFwPXRoaXMubWV0YWxuZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVtaXNzaXZlTWFwJiZ0aGlzLmVtaXNzaXZlTWFwLmlzVGV4dHVyZSYmKG4uZW1pc3NpdmVNYXA9dGhpcy5lbWlzc2l2ZU1hcC50b0pTT04odCkudXVpZCksdGhpcy5zcGVjdWxhck1hcCYmdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFyTWFwPXRoaXMuc3BlY3VsYXJNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAmJnRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAuaXNUZXh0dXJlJiYobi5zcGVjdWxhckludGVuc2l0eU1hcD10aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnNwZWN1bGFyQ29sb3JNYXAmJnRoaXMuc3BlY3VsYXJDb2xvck1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFyQ29sb3JNYXA9dGhpcy5zcGVjdWxhckNvbG9yTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVudk1hcCYmdGhpcy5lbnZNYXAuaXNUZXh0dXJlJiYobi5lbnZNYXA9dGhpcy5lbnZNYXAudG9KU09OKHQpLnV1aWQsdGhpcy5jb21iaW5lIT09dm9pZCAwJiYobi5jb21iaW5lPXRoaXMuY29tYmluZSkpLHRoaXMuZW52TWFwUm90YXRpb24hPT12b2lkIDAmJihuLmVudk1hcFJvdGF0aW9uPXRoaXMuZW52TWFwUm90YXRpb24udG9BcnJheSgpKSx0aGlzLmVudk1hcEludGVuc2l0eSE9PXZvaWQgMCYmKG4uZW52TWFwSW50ZW5zaXR5PXRoaXMuZW52TWFwSW50ZW5zaXR5KSx0aGlzLnJlZmxlY3Rpdml0eSE9PXZvaWQgMCYmKG4ucmVmbGVjdGl2aXR5PXRoaXMucmVmbGVjdGl2aXR5KSx0aGlzLnJlZnJhY3Rpb25SYXRpbyE9PXZvaWQgMCYmKG4ucmVmcmFjdGlvblJhdGlvPXRoaXMucmVmcmFjdGlvblJhdGlvKSx0aGlzLmdyYWRpZW50TWFwJiZ0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSYmKG4uZ3JhZGllbnRNYXA9dGhpcy5ncmFkaWVudE1hcC50b0pTT04odCkudXVpZCksdGhpcy50cmFuc21pc3Npb24hPT12b2lkIDAmJihuLnRyYW5zbWlzc2lvbj10aGlzLnRyYW5zbWlzc2lvbiksdGhpcy50cmFuc21pc3Npb25NYXAmJnRoaXMudHJhbnNtaXNzaW9uTWFwLmlzVGV4dHVyZSYmKG4udHJhbnNtaXNzaW9uTWFwPXRoaXMudHJhbnNtaXNzaW9uTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnRoaWNrbmVzcyE9PXZvaWQgMCYmKG4udGhpY2tuZXNzPXRoaXMudGhpY2tuZXNzKSx0aGlzLnRoaWNrbmVzc01hcCYmdGhpcy50aGlja25lc3NNYXAuaXNUZXh0dXJlJiYobi50aGlja25lc3NNYXA9dGhpcy50aGlja25lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSE9PXZvaWQgMCYmdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlIT09MS8wJiYobi5hdHRlbnVhdGlvbkRpc3RhbmNlPXRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSksdGhpcy5hdHRlbnVhdGlvbkNvbG9yIT09dm9pZCAwJiYobi5hdHRlbnVhdGlvbkNvbG9yPXRoaXMuYXR0ZW51YXRpb25Db2xvci5nZXRIZXgoKSksdGhpcy5zaXplIT09dm9pZCAwJiYobi5zaXplPXRoaXMuc2l6ZSksdGhpcy5zaGFkb3dTaWRlIT09bnVsbCYmKG4uc2hhZG93U2lkZT10aGlzLnNoYWRvd1NpZGUpLHRoaXMuc2l6ZUF0dGVudWF0aW9uIT09dm9pZCAwJiYobi5zaXplQXR0ZW51YXRpb249dGhpcy5zaXplQXR0ZW51YXRpb24pLHRoaXMuYmxlbmRpbmchPT0xJiYobi5ibGVuZGluZz10aGlzLmJsZW5kaW5nKSx0aGlzLnNpZGUhPT0wJiYobi5zaWRlPXRoaXMuc2lkZSksdGhpcy52ZXJ0ZXhDb2xvcnM9PT0hMCYmKG4udmVydGV4Q29sb3JzPSEwKSx0aGlzLm9wYWNpdHk8MSYmKG4ub3BhY2l0eT10aGlzLm9wYWNpdHkpLHRoaXMudHJhbnNwYXJlbnQ9PT0hMCYmKG4udHJhbnNwYXJlbnQ9ITApLHRoaXMuYmxlbmRTcmMhPT0yMDQmJihuLmJsZW5kU3JjPXRoaXMuYmxlbmRTcmMpLHRoaXMuYmxlbmREc3QhPT0yMDUmJihuLmJsZW5kRHN0PXRoaXMuYmxlbmREc3QpLHRoaXMuYmxlbmRFcXVhdGlvbiE9PTEwMCYmKG4uYmxlbmRFcXVhdGlvbj10aGlzLmJsZW5kRXF1YXRpb24pLHRoaXMuYmxlbmRTcmNBbHBoYSE9PW51bGwmJihuLmJsZW5kU3JjQWxwaGE9dGhpcy5ibGVuZFNyY0FscGhhKSx0aGlzLmJsZW5kRHN0QWxwaGEhPT1udWxsJiYobi5ibGVuZERzdEFscGhhPXRoaXMuYmxlbmREc3RBbHBoYSksdGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEhPT1udWxsJiYobi5ibGVuZEVxdWF0aW9uQWxwaGE9dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEpLHRoaXMuYmxlbmRDb2xvciYmdGhpcy5ibGVuZENvbG9yLmlzQ29sb3ImJihuLmJsZW5kQ29sb3I9dGhpcy5ibGVuZENvbG9yLmdldEhleCgpKSx0aGlzLmJsZW5kQWxwaGEhPT0wJiYobi5ibGVuZEFscGhhPXRoaXMuYmxlbmRBbHBoYSksdGhpcy5kZXB0aEZ1bmMhPT0zJiYobi5kZXB0aEZ1bmM9dGhpcy5kZXB0aEZ1bmMpLHRoaXMuZGVwdGhUZXN0PT09ITEmJihuLmRlcHRoVGVzdD10aGlzLmRlcHRoVGVzdCksdGhpcy5kZXB0aFdyaXRlPT09ITEmJihuLmRlcHRoV3JpdGU9dGhpcy5kZXB0aFdyaXRlKSx0aGlzLmNvbG9yV3JpdGU9PT0hMSYmKG4uY29sb3JXcml0ZT10aGlzLmNvbG9yV3JpdGUpLHRoaXMuc3RlbmNpbFdyaXRlTWFzayE9PTI1NSYmKG4uc3RlbmNpbFdyaXRlTWFzaz10aGlzLnN0ZW5jaWxXcml0ZU1hc2spLHRoaXMuc3RlbmNpbEZ1bmMhPT01MTkmJihuLnN0ZW5jaWxGdW5jPXRoaXMuc3RlbmNpbEZ1bmMpLHRoaXMuc3RlbmNpbFJlZiE9PTAmJihuLnN0ZW5jaWxSZWY9dGhpcy5zdGVuY2lsUmVmKSx0aGlzLnN0ZW5jaWxGdW5jTWFzayE9PTI1NSYmKG4uc3RlbmNpbEZ1bmNNYXNrPXRoaXMuc3RlbmNpbEZ1bmNNYXNrKSx0aGlzLnN0ZW5jaWxGYWlsIT09NzY4MCYmKG4uc3RlbmNpbEZhaWw9dGhpcy5zdGVuY2lsRmFpbCksdGhpcy5zdGVuY2lsWkZhaWwhPT03NjgwJiYobi5zdGVuY2lsWkZhaWw9dGhpcy5zdGVuY2lsWkZhaWwpLHRoaXMuc3RlbmNpbFpQYXNzIT09NzY4MCYmKG4uc3RlbmNpbFpQYXNzPXRoaXMuc3RlbmNpbFpQYXNzKSx0aGlzLnN0ZW5jaWxXcml0ZT09PSEwJiYobi5zdGVuY2lsV3JpdGU9dGhpcy5zdGVuY2lsV3JpdGUpLHRoaXMucm90YXRpb24hPT12b2lkIDAmJnRoaXMucm90YXRpb24hPT0wJiYobi5yb3RhdGlvbj10aGlzLnJvdGF0aW9uKSx0aGlzLnBvbHlnb25PZmZzZXQ9PT0hMCYmKG4ucG9seWdvbk9mZnNldD0hMCksdGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yIT09MCYmKG4ucG9seWdvbk9mZnNldEZhY3Rvcj10aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IpLHRoaXMucG9seWdvbk9mZnNldFVuaXRzIT09MCYmKG4ucG9seWdvbk9mZnNldFVuaXRzPXRoaXMucG9seWdvbk9mZnNldFVuaXRzKSx0aGlzLmxpbmV3aWR0aCE9PXZvaWQgMCYmdGhpcy5saW5ld2lkdGghPT0xJiYobi5saW5ld2lkdGg9dGhpcy5saW5ld2lkdGgpLHRoaXMuZGFzaFNpemUhPT12b2lkIDAmJihuLmRhc2hTaXplPXRoaXMuZGFzaFNpemUpLHRoaXMuZ2FwU2l6ZSE9PXZvaWQgMCYmKG4uZ2FwU2l6ZT10aGlzLmdhcFNpemUpLHRoaXMuc2NhbGUhPT12b2lkIDAmJihuLnNjYWxlPXRoaXMuc2NhbGUpLHRoaXMuZGl0aGVyaW5nPT09ITAmJihuLmRpdGhlcmluZz0hMCksdGhpcy5hbHBoYVRlc3Q+MCYmKG4uYWxwaGFUZXN0PXRoaXMuYWxwaGFUZXN0KSx0aGlzLmFscGhhSGFzaD09PSEwJiYobi5hbHBoYUhhc2g9ITApLHRoaXMuYWxwaGFUb0NvdmVyYWdlPT09ITAmJihuLmFscGhhVG9Db3ZlcmFnZT0hMCksdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9PT0hMCYmKG4ucHJlbXVsdGlwbGllZEFscGhhPSEwKSx0aGlzLmZvcmNlU2luZ2xlUGFzcz09PSEwJiYobi5mb3JjZVNpbmdsZVBhc3M9ITApLHRoaXMuYWxsb3dPdmVycmlkZT09PSExJiYobi5hbGxvd092ZXJyaWRlPSExKSx0aGlzLndpcmVmcmFtZT09PSEwJiYobi53aXJlZnJhbWU9ITApLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPjEmJihuLndpcmVmcmFtZUxpbmV3aWR0aD10aGlzLndpcmVmcmFtZUxpbmV3aWR0aCksdGhpcy53aXJlZnJhbWVMaW5lY2FwIT09InJvdW5kIiYmKG4ud2lyZWZyYW1lTGluZWNhcD10aGlzLndpcmVmcmFtZUxpbmVjYXApLHRoaXMud2lyZWZyYW1lTGluZWpvaW4hPT0icm91bmQiJiYobi53aXJlZnJhbWVMaW5lam9pbj10aGlzLndpcmVmcmFtZUxpbmVqb2luKSx0aGlzLmZsYXRTaGFkaW5nPT09ITAmJihuLmZsYXRTaGFkaW5nPSEwKSx0aGlzLnZpc2libGU9PT0hMSYmKG4udmlzaWJsZT0hMSksdGhpcy50b25lTWFwcGVkPT09ITEmJihuLnRvbmVNYXBwZWQ9ITEpLHRoaXMuZm9nPT09ITEmJihuLmZvZz0hMSksT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJihuLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpO2Z1bmN0aW9uIHMocil7Y29uc3Qgbz1bXTtmb3IoY29uc3QgYSBpbiByKXtjb25zdCBjPXJbYV07ZGVsZXRlIGMubWV0YWRhdGEsby5wdXNoKGMpfXJldHVybiBvfWlmKGUpe2NvbnN0IHI9cyh0LnRleHR1cmVzKSxvPXModC5pbWFnZXMpO3IubGVuZ3RoPjAmJihuLnRleHR1cmVzPXIpLG8ubGVuZ3RoPjAmJihuLmltYWdlcz1vKX1yZXR1cm4gbn1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXt0aGlzLm5hbWU9dC5uYW1lLHRoaXMuYmxlbmRpbmc9dC5ibGVuZGluZyx0aGlzLnNpZGU9dC5zaWRlLHRoaXMudmVydGV4Q29sb3JzPXQudmVydGV4Q29sb3JzLHRoaXMub3BhY2l0eT10Lm9wYWNpdHksdGhpcy50cmFuc3BhcmVudD10LnRyYW5zcGFyZW50LHRoaXMuYmxlbmRTcmM9dC5ibGVuZFNyYyx0aGlzLmJsZW5kRHN0PXQuYmxlbmREc3QsdGhpcy5ibGVuZEVxdWF0aW9uPXQuYmxlbmRFcXVhdGlvbix0aGlzLmJsZW5kU3JjQWxwaGE9dC5ibGVuZFNyY0FscGhhLHRoaXMuYmxlbmREc3RBbHBoYT10LmJsZW5kRHN0QWxwaGEsdGhpcy5ibGVuZEVxdWF0aW9uQWxwaGE9dC5ibGVuZEVxdWF0aW9uQWxwaGEsdGhpcy5ibGVuZENvbG9yLmNvcHkodC5ibGVuZENvbG9yKSx0aGlzLmJsZW5kQWxwaGE9dC5ibGVuZEFscGhhLHRoaXMuZGVwdGhGdW5jPXQuZGVwdGhGdW5jLHRoaXMuZGVwdGhUZXN0PXQuZGVwdGhUZXN0LHRoaXMuZGVwdGhXcml0ZT10LmRlcHRoV3JpdGUsdGhpcy5zdGVuY2lsV3JpdGVNYXNrPXQuc3RlbmNpbFdyaXRlTWFzayx0aGlzLnN0ZW5jaWxGdW5jPXQuc3RlbmNpbEZ1bmMsdGhpcy5zdGVuY2lsUmVmPXQuc3RlbmNpbFJlZix0aGlzLnN0ZW5jaWxGdW5jTWFzaz10LnN0ZW5jaWxGdW5jTWFzayx0aGlzLnN0ZW5jaWxGYWlsPXQuc3RlbmNpbEZhaWwsdGhpcy5zdGVuY2lsWkZhaWw9dC5zdGVuY2lsWkZhaWwsdGhpcy5zdGVuY2lsWlBhc3M9dC5zdGVuY2lsWlBhc3MsdGhpcy5zdGVuY2lsV3JpdGU9dC5zdGVuY2lsV3JpdGU7Y29uc3QgZT10LmNsaXBwaW5nUGxhbmVzO2xldCBuPW51bGw7aWYoZSE9PW51bGwpe2NvbnN0IHM9ZS5sZW5ndGg7bj1uZXcgQXJyYXkocyk7Zm9yKGxldCByPTA7ciE9PXM7KytyKW5bcl09ZVtyXS5jbG9uZSgpfXJldHVybiB0aGlzLmNsaXBwaW5nUGxhbmVzPW4sdGhpcy5jbGlwSW50ZXJzZWN0aW9uPXQuY2xpcEludGVyc2VjdGlvbix0aGlzLmNsaXBTaGFkb3dzPXQuY2xpcFNoYWRvd3MsdGhpcy5zaGFkb3dTaWRlPXQuc2hhZG93U2lkZSx0aGlzLmNvbG9yV3JpdGU9dC5jb2xvcldyaXRlLHRoaXMucHJlY2lzaW9uPXQucHJlY2lzaW9uLHRoaXMucG9seWdvbk9mZnNldD10LnBvbHlnb25PZmZzZXQsdGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yPXQucG9seWdvbk9mZnNldEZhY3Rvcix0aGlzLnBvbHlnb25PZmZzZXRVbml0cz10LnBvbHlnb25PZmZzZXRVbml0cyx0aGlzLmRpdGhlcmluZz10LmRpdGhlcmluZyx0aGlzLmFscGhhVGVzdD10LmFscGhhVGVzdCx0aGlzLmFscGhhSGFzaD10LmFscGhhSGFzaCx0aGlzLmFscGhhVG9Db3ZlcmFnZT10LmFscGhhVG9Db3ZlcmFnZSx0aGlzLnByZW11bHRpcGxpZWRBbHBoYT10LnByZW11bHRpcGxpZWRBbHBoYSx0aGlzLmZvcmNlU2luZ2xlUGFzcz10LmZvcmNlU2luZ2xlUGFzcyx0aGlzLmFsbG93T3ZlcnJpZGU9dC5hbGxvd092ZXJyaWRlLHRoaXMudmlzaWJsZT10LnZpc2libGUsdGhpcy50b25lTWFwcGVkPXQudG9uZU1hcHBlZCx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLHRoaXN9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK319Y2xhc3MgQmYgZXh0ZW5kcyBDZntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNNZXNoQmFzaWNNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hCYXNpY01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB2cygxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmxpZ2h0TWFwPW51bGwsdGhpcy5saWdodE1hcEludGVuc2l0eT0xLHRoaXMuYW9NYXA9bnVsbCx0aGlzLmFvTWFwSW50ZW5zaXR5PTEsdGhpcy5zcGVjdWxhck1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmVudk1hcD1udWxsLHRoaXMuZW52TWFwUm90YXRpb249bmV3IENpLHRoaXMuY29tYmluZT0wLHRoaXMucmVmbGVjdGl2aXR5PTEsdGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4LHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuZm9nPSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubWFwPXQubWFwLHRoaXMubGlnaHRNYXA9dC5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD10LmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSx0aGlzLnNwZWN1bGFyTWFwPXQuc3BlY3VsYXJNYXAsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMuZW52TWFwPXQuZW52TWFwLHRoaXMuZW52TWFwUm90YXRpb24uY29weSh0LmVudk1hcFJvdGF0aW9uKSx0aGlzLmNvbWJpbmU9dC5jb21iaW5lLHRoaXMucmVmbGVjdGl2aXR5PXQucmVmbGVjdGl2aXR5LHRoaXMucmVmcmFjdGlvblJhdGlvPXQucmVmcmFjdGlvblJhdGlvLHRoaXMud2lyZWZyYW1lPXQud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoLHRoaXMud2lyZWZyYW1lTGluZWNhcD10LndpcmVmcmFtZUxpbmVjYXAsdGhpcy53aXJlZnJhbWVMaW5lam9pbj10LndpcmVmcmFtZUxpbmVqb2luLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWNvbnN0IHB0PW5ldyBQLF9zPW5ldyBOO2xldCBFZj0wO2NsYXNzIHh0e2NvbnN0cnVjdG9yKHQsZSxuPSExKXtpZihBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuIik7dGhpcy5pc0J1ZmZlckF0dHJpYnV0ZT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpFZisrfSksdGhpcy5uYW1lPSIiLHRoaXMuYXJyYXk9dCx0aGlzLml0ZW1TaXplPWUsdGhpcy5jb3VudD10IT09dm9pZCAwP3QubGVuZ3RoL2U6MCx0aGlzLm5vcm1hbGl6ZWQ9bix0aGlzLnVzYWdlPTM1MDQ0LHRoaXMudXBkYXRlUmFuZ2VzPVtdLHRoaXMuZ3B1VHlwZT0xMDE1LHRoaXMudmVyc2lvbj0wfW9uVXBsb2FkQ2FsbGJhY2soKXt9c2V0IG5lZWRzVXBkYXRlKHQpe3Q9PT0hMCYmdGhpcy52ZXJzaW9uKyt9c2V0VXNhZ2UodCl7cmV0dXJuIHRoaXMudXNhZ2U9dCx0aGlzfWFkZFVwZGF0ZVJhbmdlKHQsZSl7dGhpcy51cGRhdGVSYW5nZXMucHVzaCh7c3RhcnQ6dCxjb3VudDplfSl9Y2xlYXJVcGRhdGVSYW5nZXMoKXt0aGlzLnVwZGF0ZVJhbmdlcy5sZW5ndGg9MH1jb3B5KHQpe3JldHVybiB0aGlzLm5hbWU9dC5uYW1lLHRoaXMuYXJyYXk9bmV3IHQuYXJyYXkuY29uc3RydWN0b3IodC5hcnJheSksdGhpcy5pdGVtU2l6ZT10Lml0ZW1TaXplLHRoaXMuY291bnQ9dC5jb3VudCx0aGlzLm5vcm1hbGl6ZWQ9dC5ub3JtYWxpemVkLHRoaXMudXNhZ2U9dC51c2FnZSx0aGlzLmdwdVR5cGU9dC5ncHVUeXBlLHRoaXN9Y29weUF0KHQsZSxuKXt0Kj10aGlzLml0ZW1TaXplLG4qPWUuaXRlbVNpemU7Zm9yKGxldCBzPTAscj10aGlzLml0ZW1TaXplO3M8cjtzKyspdGhpcy5hcnJheVt0K3NdPWUuYXJyYXlbbitzXTtyZXR1cm4gdGhpc31jb3B5QXJyYXkodCl7cmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQpLHRoaXN9YXBwbHlNYXRyaXgzKHQpe2lmKHRoaXMuaXRlbVNpemU9PT0yKWZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKV9zLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxfcy5hcHBseU1hdHJpeDModCksdGhpcy5zZXRYWShlLF9zLngsX3MueSk7ZWxzZSBpZih0aGlzLml0ZW1TaXplPT09Mylmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylwdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSkscHQuYXBwbHlNYXRyaXgzKHQpLHRoaXMuc2V0WFlaKGUscHQueCxwdC55LHB0LnopO3JldHVybiB0aGlzfWFwcGx5TWF0cml4NCh0KXtmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylwdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSkscHQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0WFlaKGUscHQueCxwdC55LHB0LnopO3JldHVybiB0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKXB0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxwdC5hcHBseU5vcm1hbE1hdHJpeCh0KSx0aGlzLnNldFhZWihlLHB0LngscHQueSxwdC56KTtyZXR1cm4gdGhpc310cmFuc2Zvcm1EaXJlY3Rpb24odCl7Zm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspcHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLHB0LnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzLnNldFhZWihlLHB0LngscHQueSxwdC56KTtyZXR1cm4gdGhpc31zZXQodCxlPTApe3JldHVybiB0aGlzLmFycmF5LnNldCh0LGUpLHRoaXN9Z2V0Q29tcG9uZW50KHQsZSl7bGV0IG49dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrZV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKG49X2kobix0aGlzLmFycmF5KSksbn1zZXRDb21wb25lbnQodCxlLG4pe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihuPVV0KG4sdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplK2VdPW4sdGhpc31nZXRYKHQpe2xldCBlPXRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1faShlLHRoaXMuYXJyYXkpKSxlfXNldFgodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1VdChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZV09ZSx0aGlzfWdldFkodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9X2koZSx0aGlzLmFycmF5KSksZX1zZXRZKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9VXQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMV09ZSx0aGlzfWdldFoodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9X2koZSx0aGlzLmFycmF5KSksZX1zZXRaKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9VXQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl09ZSx0aGlzfWdldFcodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrM107cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9X2koZSx0aGlzLmFycmF5KSksZX1zZXRXKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9VXQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrM109ZSx0aGlzfXNldFhZKHQsZSxuKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPVV0KGUsdGhpcy5hcnJheSksbj1VdChuLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzfXNldFhZWih0LGUsbixzKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPVV0KGUsdGhpcy5hcnJheSksbj1VdChuLHRoaXMuYXJyYXkpLHM9VXQocyx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KzBdPWUsdGhpcy5hcnJheVt0KzFdPW4sdGhpcy5hcnJheVt0KzJdPXMsdGhpc31zZXRYWVpXKHQsZSxuLHMscil7cmV0dXJuIHQqPXRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkJiYoZT1VdChlLHRoaXMuYXJyYXkpLG49VXQobix0aGlzLmFycmF5KSxzPVV0KHMsdGhpcy5hcnJheSkscj1VdChyLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzLmFycmF5W3QrMl09cyx0aGlzLmFycmF5W3QrM109cix0aGlzfW9uVXBsb2FkKHQpe3JldHVybiB0aGlzLm9uVXBsb2FkQ2FsbGJhY2s9dCx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuYXJyYXksdGhpcy5pdGVtU2l6ZSkuY29weSh0aGlzKX10b0pTT04oKXtjb25zdCB0PXtpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OkFycmF5LmZyb20odGhpcy5hcnJheSksbm9ybWFsaXplZDp0aGlzLm5vcm1hbGl6ZWR9O3JldHVybiB0aGlzLm5hbWUhPT0iIiYmKHQubmFtZT10aGlzLm5hbWUpLHRoaXMudXNhZ2UhPT0zNTA0NCYmKHQudXNhZ2U9dGhpcy51c2FnZSksdH19Y2xhc3MgRmYgZXh0ZW5kcyB4dHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQxNkFycmF5KHQpLGUsbil9fWNsYXNzIElmIGV4dGVuZHMgeHR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBVaW50MzJBcnJheSh0KSxlLG4pfX1jbGFzcyBSZSBleHRlbmRzIHh0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgRmxvYXQzMkFycmF5KHQpLGUsbil9fWxldCBOZj0wO2NvbnN0IHNlPW5ldyBzdCxFbz1uZXcgSWUsWW49bmV3IFAsSnQ9bmV3IGd0LEVpPW5ldyBndCxidD1uZXcgUDtjbGFzcyBBZSBleHRlbmRzIHlze2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzQnVmZmVyR2VvbWV0cnk9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6TmYrK30pLHRoaXMudXVpZD1EbigpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9IkJ1ZmZlckdlb21ldHJ5Iix0aGlzLmluZGV4PW51bGwsdGhpcy5pbmRpcmVjdD1udWxsLHRoaXMuaW5kaXJlY3RPZmZzZXQ9MCx0aGlzLmF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaEF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT0hMSx0aGlzLmdyb3Vwcz1bXSx0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsLHRoaXMuZHJhd1JhbmdlPXtzdGFydDowLGNvdW50OjEvMH0sdGhpcy51c2VyRGF0YT17fX1nZXRJbmRleCgpe3JldHVybiB0aGlzLmluZGV4fXNldEluZGV4KHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpP3RoaXMuaW5kZXg9bmV3KGRmKHQpP0lmOkZmKSh0LDEpOnRoaXMuaW5kZXg9dCx0aGlzfXNldEluZGlyZWN0KHQsZT0wKXtyZXR1cm4gdGhpcy5pbmRpcmVjdD10LHRoaXMuaW5kaXJlY3RPZmZzZXQ9ZSx0aGlzfWdldEluZGlyZWN0KCl7cmV0dXJuIHRoaXMuaW5kaXJlY3R9Z2V0QXR0cmlidXRlKHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF19c2V0QXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XT1lLHRoaXN9ZGVsZXRlQXR0cmlidXRlKHQpe3JldHVybiBkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW3RdLHRoaXN9aGFzQXR0cmlidXRlKHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF0hPT12b2lkIDB9YWRkR3JvdXAodCxlLG49MCl7dGhpcy5ncm91cHMucHVzaCh7c3RhcnQ6dCxjb3VudDplLG1hdGVyaWFsSW5kZXg6bn0pfWNsZWFyR3JvdXBzKCl7dGhpcy5ncm91cHM9W119c2V0RHJhd1JhbmdlKHQsZSl7dGhpcy5kcmF3UmFuZ2Uuc3RhcnQ9dCx0aGlzLmRyYXdSYW5nZS5jb3VudD1lfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtlIT09dm9pZCAwJiYoZS5hcHBseU1hdHJpeDQodCksZS5uZWVkc1VwZGF0ZT0hMCk7Y29uc3Qgbj10aGlzLmF0dHJpYnV0ZXMubm9ybWFsO2lmKG4hPT12b2lkIDApe2NvbnN0IHI9bmV3IE1lKCkuZ2V0Tm9ybWFsTWF0cml4KHQpO24uYXBwbHlOb3JtYWxNYXRyaXgociksbi5uZWVkc1VwZGF0ZT0hMH1jb25zdCBzPXRoaXMuYXR0cmlidXRlcy50YW5nZW50O3JldHVybiBzIT09dm9pZCAwJiYocy50cmFuc2Zvcm1EaXJlY3Rpb24odCkscy5uZWVkc1VwZGF0ZT0hMCksdGhpcy5ib3VuZGluZ0JveCE9PW51bGwmJnRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCksdGhpcy5ib3VuZGluZ1NwaGVyZSE9PW51bGwmJnRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksdGhpc31hcHBseVF1YXRlcm5pb24odCl7cmV0dXJuIHNlLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuYXBwbHlNYXRyaXg0KHNlKSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIHNlLm1ha2VSb3RhdGlvblgodCksdGhpcy5hcHBseU1hdHJpeDQoc2UpLHRoaXN9cm90YXRlWSh0KXtyZXR1cm4gc2UubWFrZVJvdGF0aW9uWSh0KSx0aGlzLmFwcGx5TWF0cml4NChzZSksdGhpc31yb3RhdGVaKHQpe3JldHVybiBzZS5tYWtlUm90YXRpb25aKHQpLHRoaXMuYXBwbHlNYXRyaXg0KHNlKSx0aGlzfXRyYW5zbGF0ZSh0LGUsbil7cmV0dXJuIHNlLm1ha2VUcmFuc2xhdGlvbih0LGUsbiksdGhpcy5hcHBseU1hdHJpeDQoc2UpLHRoaXN9c2NhbGUodCxlLG4pe3JldHVybiBzZS5tYWtlU2NhbGUodCxlLG4pLHRoaXMuYXBwbHlNYXRyaXg0KHNlKSx0aGlzfWxvb2tBdCh0KXtyZXR1cm4gRW8ubG9va0F0KHQpLEVvLnVwZGF0ZU1hdHJpeCgpLHRoaXMuYXBwbHlNYXRyaXg0KEVvLm1hdHJpeCksdGhpc31jZW50ZXIoKXtyZXR1cm4gdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKSx0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlcihZbikubmVnYXRlKCksdGhpcy50cmFuc2xhdGUoWW4ueCxZbi55LFluLnopLHRoaXN9c2V0RnJvbVBvaW50cyh0KXtjb25zdCBlPXRoaXMuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2lmKGU9PT12b2lkIDApe2NvbnN0IG49W107Zm9yKGxldCBzPTAscj10Lmxlbmd0aDtzPHI7cysrKXtjb25zdCBvPXRbc107bi5wdXNoKG8ueCxvLnksby56fHwwKX10aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBSZShuLDMpKX1lbHNle2NvbnN0IG49TWF0aC5taW4odC5sZW5ndGgsZS5jb3VudCk7Zm9yKGxldCBzPTA7czxuO3MrKyl7Y29uc3Qgcj10W3NdO2Uuc2V0WFlaKHMsci54LHIueSxyLnp8fDApfXQubGVuZ3RoPmUuY291bnQmJnZ0KCJCdWZmZXJHZW9tZXRyeTogQnVmZmVyIHNpemUgdG9vIHNtYWxsIGZvciBwb2ludHMgZGF0YS4gVXNlIC5kaXNwb3NlKCkgYW5kIGNyZWF0ZSBhIG5ldyBnZW9tZXRyeS4iKSxlLm5lZWRzVXBkYXRlPSEwfXJldHVybiB0aGlzfWNvbXB1dGVCb3VuZGluZ0JveCgpe3RoaXMuYm91bmRpbmdCb3g9PT1udWxsJiYodGhpcy5ib3VuZGluZ0JveD1uZXcgZ3QpO2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYodCYmdC5pc0dMQnVmZmVyQXR0cmlidXRlKXt5bigiQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk6IEdMQnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIGEgbWFudWFsIGJvdW5kaW5nIGJveC4iLHRoaXMpLHRoaXMuYm91bmRpbmdCb3guc2V0KG5ldyBQKC0xLzAsLTEvMCwtMS8wKSxuZXcgUCgxLzAsMS8wLDEvMCkpO3JldHVybn1pZih0IT09dm9pZCAwKXtpZih0aGlzLmJvdW5kaW5nQm94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCksZSlmb3IobGV0IG49MCxzPWUubGVuZ3RoO248cztuKyspe2NvbnN0IHI9ZVtuXTtKdC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHIpLHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU/KGJ0LmFkZFZlY3RvcnModGhpcy5ib3VuZGluZ0JveC5taW4sSnQubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoYnQpLGJ0LmFkZFZlY3RvcnModGhpcy5ib3VuZGluZ0JveC5tYXgsSnQubWF4KSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoYnQpKToodGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KEp0Lm1pbiksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KEp0Lm1heCkpfX1lbHNlIHRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7KGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLngpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi55KXx8aXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueikpJiZ5bignQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk6IENvbXB1dGVkIG1pbi9tYXggaGF2ZSBOYU4gdmFsdWVzLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLHRoaXMpfWNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpe3RoaXMuYm91bmRpbmdTcGhlcmU9PT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1uZXcgRGMpO2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYodCYmdC5pc0dMQnVmZmVyQXR0cmlidXRlKXt5bigiQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IEdMQnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIGEgbWFudWFsIGJvdW5kaW5nIHNwaGVyZS4iLHRoaXMpLHRoaXMuYm91bmRpbmdTcGhlcmUuc2V0KG5ldyBQLDEvMCk7cmV0dXJufWlmKHQpe2NvbnN0IG49dGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7aWYoSnQuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KSxlKWZvcihsZXQgcj0wLG89ZS5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT1lW3JdO0VpLnNldEZyb21CdWZmZXJBdHRyaWJ1dGUoYSksdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT8oYnQuYWRkVmVjdG9ycyhKdC5taW4sRWkubWluKSxKdC5leHBhbmRCeVBvaW50KGJ0KSxidC5hZGRWZWN0b3JzKEp0Lm1heCxFaS5tYXgpLEp0LmV4cGFuZEJ5UG9pbnQoYnQpKTooSnQuZXhwYW5kQnlQb2ludChFaS5taW4pLEp0LmV4cGFuZEJ5UG9pbnQoRWkubWF4KSl9SnQuZ2V0Q2VudGVyKG4pO2xldCBzPTA7Zm9yKGxldCByPTAsbz10LmNvdW50O3I8bztyKyspYnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LHIpLHM9TWF0aC5tYXgocyxuLmRpc3RhbmNlVG9TcXVhcmVkKGJ0KSk7aWYoZSlmb3IobGV0IHI9MCxvPWUubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9ZVtyXSxjPXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7Zm9yKGxldCBsPTAsaD1hLmNvdW50O2w8aDtsKyspYnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLGwpLGMmJihZbi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsbCksYnQuYWRkKFluKSkscz1NYXRoLm1heChzLG4uZGlzdGFuY2VUb1NxdWFyZWQoYnQpKX10aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cz1NYXRoLnNxcnQocyksaXNOYU4odGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMpJiZ5bignQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsdGhpcyl9fWNvbXB1dGVUYW5nZW50cygpe2NvbnN0IHQ9dGhpcy5pbmRleCxlPXRoaXMuYXR0cmlidXRlcztpZih0PT09bnVsbHx8ZS5wb3NpdGlvbj09PXZvaWQgMHx8ZS5ub3JtYWw9PT12b2lkIDB8fGUudXY9PT12b2lkIDApe3luKCJCdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGZhaWxlZC4gTWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzIChpbmRleCwgcG9zaXRpb24sIG5vcm1hbCBvciB1dikiKTtyZXR1cm59Y29uc3Qgbj1lLnBvc2l0aW9uLHM9ZS5ub3JtYWwscj1lLnV2O3RoaXMuaGFzQXR0cmlidXRlKCJ0YW5nZW50Iik9PT0hMSYmdGhpcy5zZXRBdHRyaWJ1dGUoInRhbmdlbnQiLG5ldyB4dChuZXcgRmxvYXQzMkFycmF5KDQqbi5jb3VudCksNCkpO2NvbnN0IG89dGhpcy5nZXRBdHRyaWJ1dGUoInRhbmdlbnQiKSxhPVtdLGM9W107Zm9yKGxldCB2PTA7djxuLmNvdW50O3YrKylhW3ZdPW5ldyBQLGNbdl09bmV3IFA7Y29uc3QgbD1uZXcgUCxoPW5ldyBQLHU9bmV3IFAsZj1uZXcgTixkPW5ldyBOLHA9bmV3IE4seT1uZXcgUCxnPW5ldyBQO2Z1bmN0aW9uIHcodixfLFQpe2wuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLHYpLGguZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLF8pLHUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLFQpLGYuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLHYpLGQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLF8pLHAuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLFQpLGguc3ViKGwpLHUuc3ViKGwpLGQuc3ViKGYpLHAuc3ViKGYpO2NvbnN0IHo9MS8oZC54KnAueS1wLngqZC55KTtpc0Zpbml0ZSh6KSYmKHkuY29weShoKS5tdWx0aXBseVNjYWxhcihwLnkpLmFkZFNjYWxlZFZlY3Rvcih1LC1kLnkpLm11bHRpcGx5U2NhbGFyKHopLGcuY29weSh1KS5tdWx0aXBseVNjYWxhcihkLngpLmFkZFNjYWxlZFZlY3RvcihoLC1wLngpLm11bHRpcGx5U2NhbGFyKHopLGFbdl0uYWRkKHkpLGFbX10uYWRkKHkpLGFbVF0uYWRkKHkpLGNbdl0uYWRkKGcpLGNbX10uYWRkKGcpLGNbVF0uYWRkKGcpKX1sZXQgYj10aGlzLmdyb3VwcztiLmxlbmd0aD09PTAmJihiPVt7c3RhcnQ6MCxjb3VudDp0LmNvdW50fV0pO2ZvcihsZXQgdj0wLF89Yi5sZW5ndGg7djxfOysrdil7Y29uc3QgVD1iW3ZdLHo9VC5zdGFydCxDPVQuY291bnQ7Zm9yKGxldCBCPXosRj16K0M7QjxGO0IrPTMpdyh0LmdldFgoQiswKSx0LmdldFgoQisxKSx0LmdldFgoQisyKSl9Y29uc3QgeD1uZXcgUCxtPW5ldyBQLE09bmV3IFAsUz1uZXcgUDtmdW5jdGlvbiBBKHYpe00uZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLHYpLFMuY29weShNKTtjb25zdCBfPWFbdl07eC5jb3B5KF8pLHguc3ViKE0ubXVsdGlwbHlTY2FsYXIoTS5kb3QoXykpKS5ub3JtYWxpemUoKSxtLmNyb3NzVmVjdG9ycyhTLF8pO2NvbnN0IHo9bS5kb3QoY1t2XSk8MD8tMToxO28uc2V0WFlaVyh2LHgueCx4LnkseC56LHopfWZvcihsZXQgdj0wLF89Yi5sZW5ndGg7djxfOysrdil7Y29uc3QgVD1iW3ZdLHo9VC5zdGFydCxDPVQuY291bnQ7Zm9yKGxldCBCPXosRj16K0M7QjxGO0IrPTMpQSh0LmdldFgoQiswKSksQSh0LmdldFgoQisxKSksQSh0LmdldFgoQisyKSl9fWNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCl7Y29uc3QgdD10aGlzLmluZGV4LGU9dGhpcy5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7aWYoZSE9PXZvaWQgMCl7bGV0IG49dGhpcy5nZXRBdHRyaWJ1dGUoIm5vcm1hbCIpO2lmKG49PT12b2lkIDApbj1uZXcgeHQobmV3IEZsb2F0MzJBcnJheShlLmNvdW50KjMpLDMpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG4pO2Vsc2UgZm9yKGxldCBmPTAsZD1uLmNvdW50O2Y8ZDtmKyspbi5zZXRYWVooZiwwLDAsMCk7Y29uc3Qgcz1uZXcgUCxyPW5ldyBQLG89bmV3IFAsYT1uZXcgUCxjPW5ldyBQLGw9bmV3IFAsaD1uZXcgUCx1PW5ldyBQO2lmKHQpZm9yKGxldCBmPTAsZD10LmNvdW50O2Y8ZDtmKz0zKXtjb25zdCBwPXQuZ2V0WChmKzApLHk9dC5nZXRYKGYrMSksZz10LmdldFgoZisyKTtzLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxwKSxyLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSx5KSxvLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxnKSxoLnN1YlZlY3RvcnMobyxyKSx1LnN1YlZlY3RvcnMocyxyKSxoLmNyb3NzKHUpLGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLHApLGMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLHkpLGwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLGcpLGEuYWRkKGgpLGMuYWRkKGgpLGwuYWRkKGgpLG4uc2V0WFlaKHAsYS54LGEueSxhLnopLG4uc2V0WFlaKHksYy54LGMueSxjLnopLG4uc2V0WFlaKGcsbC54LGwueSxsLnopfWVsc2UgZm9yKGxldCBmPTAsZD1lLmNvdW50O2Y8ZDtmKz0zKXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGYrMCksci5mcm9tQnVmZmVyQXR0cmlidXRlKGUsZisxKSxvLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxmKzIpLGguc3ViVmVjdG9ycyhvLHIpLHUuc3ViVmVjdG9ycyhzLHIpLGguY3Jvc3ModSksbi5zZXRYWVooZiswLGgueCxoLnksaC56KSxuLnNldFhZWihmKzEsaC54LGgueSxoLnopLG4uc2V0WFlaKGYrMixoLngsaC55LGgueik7dGhpcy5ub3JtYWxpemVOb3JtYWxzKCksbi5uZWVkc1VwZGF0ZT0hMH19bm9ybWFsaXplTm9ybWFscygpe2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtmb3IobGV0IGU9MCxuPXQuY291bnQ7ZTxuO2UrKylidC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksYnQubm9ybWFsaXplKCksdC5zZXRYWVooZSxidC54LGJ0LnksYnQueil9dG9Ob25JbmRleGVkKCl7ZnVuY3Rpb24gdChhLGMpe2NvbnN0IGw9YS5hcnJheSxoPWEuaXRlbVNpemUsdT1hLm5vcm1hbGl6ZWQsZj1uZXcgbC5jb25zdHJ1Y3RvcihjLmxlbmd0aCpoKTtsZXQgZD0wLHA9MDtmb3IobGV0IHk9MCxnPWMubGVuZ3RoO3k8Zzt5Kyspe2EuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZT9kPWNbeV0qYS5kYXRhLnN0cmlkZSthLm9mZnNldDpkPWNbeV0qaDtmb3IobGV0IHc9MDt3PGg7dysrKWZbcCsrXT1sW2QrK119cmV0dXJuIG5ldyB4dChmLGgsdSl9aWYodGhpcy5pbmRleD09PW51bGwpcmV0dXJuIHZ0KCJCdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTogQnVmZmVyR2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4iKSx0aGlzO2NvbnN0IGU9bmV3IEFlLG49dGhpcy5pbmRleC5hcnJheSxzPXRoaXMuYXR0cmlidXRlcztmb3IoY29uc3QgYSBpbiBzKXtjb25zdCBjPXNbYV0sbD10KGMsbik7ZS5zZXRBdHRyaWJ1dGUoYSxsKX1jb25zdCByPXRoaXMubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCBhIGluIHIpe2NvbnN0IGM9W10sbD1yW2FdO2ZvcihsZXQgaD0wLHU9bC5sZW5ndGg7aDx1O2grKyl7Y29uc3QgZj1sW2hdLGQ9dChmLG4pO2MucHVzaChkKX1lLm1vcnBoQXR0cmlidXRlc1thXT1jfWUubW9ycGhUYXJnZXRzUmVsYXRpdmU9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtjb25zdCBvPXRoaXMuZ3JvdXBzO2ZvcihsZXQgYT0wLGM9by5sZW5ndGg7YTxjO2ErKyl7Y29uc3QgbD1vW2FdO2UuYWRkR3JvdXAobC5zdGFydCxsLmNvdW50LGwubWF0ZXJpYWxJbmRleCl9cmV0dXJuIGV9dG9KU09OKCl7Y29uc3QgdD17bWV0YWRhdGE6e3ZlcnNpb246NC43LHR5cGU6IkJ1ZmZlckdlb21ldHJ5IixnZW5lcmF0b3I6IkJ1ZmZlckdlb21ldHJ5LnRvSlNPTiJ9fTtpZih0LnV1aWQ9dGhpcy51dWlkLHQudHlwZT10aGlzLnR5cGUsdGhpcy5uYW1lIT09IiImJih0Lm5hbWU9dGhpcy5uYW1lKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKHQudXNlckRhdGE9dGhpcy51c2VyRGF0YSksdGhpcy5wYXJhbWV0ZXJzIT09dm9pZCAwKXtjb25zdCBjPXRoaXMucGFyYW1ldGVycztmb3IoY29uc3QgbCBpbiBjKWNbbF0hPT12b2lkIDAmJih0W2xdPWNbbF0pO3JldHVybiB0fXQuZGF0YT17YXR0cmlidXRlczp7fX07Y29uc3QgZT10aGlzLmluZGV4O2UhPT1udWxsJiYodC5kYXRhLmluZGV4PXt0eXBlOmUuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLmFycmF5KX0pO2NvbnN0IG49dGhpcy5hdHRyaWJ1dGVzO2Zvcihjb25zdCBjIGluIG4pe2NvbnN0IGw9bltjXTt0LmRhdGEuYXR0cmlidXRlc1tjXT1sLnRvSlNPTih0LmRhdGEpfWNvbnN0IHM9e307bGV0IHI9ITE7Zm9yKGNvbnN0IGMgaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMpe2NvbnN0IGw9dGhpcy5tb3JwaEF0dHJpYnV0ZXNbY10saD1bXTtmb3IobGV0IHU9MCxmPWwubGVuZ3RoO3U8Zjt1Kyspe2NvbnN0IGQ9bFt1XTtoLnB1c2goZC50b0pTT04odC5kYXRhKSl9aC5sZW5ndGg+MCYmKHNbY109aCxyPSEwKX1yJiYodC5kYXRhLm1vcnBoQXR0cmlidXRlcz1zLHQuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlKTtjb25zdCBvPXRoaXMuZ3JvdXBzO28ubGVuZ3RoPjAmJih0LmRhdGEuZ3JvdXBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobykpKTtjb25zdCBhPXRoaXMuYm91bmRpbmdTcGhlcmU7cmV0dXJuIGEhPT1udWxsJiYodC5kYXRhLmJvdW5kaW5nU3BoZXJlPWEudG9KU09OKCkpLHR9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7dGhpcy5pbmRleD1udWxsLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLmdyb3Vwcz1bXSx0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsO2NvbnN0IGU9e307dGhpcy5uYW1lPXQubmFtZTtjb25zdCBuPXQuaW5kZXg7biE9PW51bGwmJnRoaXMuc2V0SW5kZXgobi5jbG9uZSgpKTtjb25zdCBzPXQuYXR0cmlidXRlcztmb3IoY29uc3QgbCBpbiBzKXtjb25zdCBoPXNbbF07dGhpcy5zZXRBdHRyaWJ1dGUobCxoLmNsb25lKGUpKX1jb25zdCByPXQubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCBsIGluIHIpe2NvbnN0IGg9W10sdT1yW2xdO2ZvcihsZXQgZj0wLGQ9dS5sZW5ndGg7ZjxkO2YrKyloLnB1c2godVtmXS5jbG9uZShlKSk7dGhpcy5tb3JwaEF0dHJpYnV0ZXNbbF09aH10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPXQubW9ycGhUYXJnZXRzUmVsYXRpdmU7Y29uc3Qgbz10Lmdyb3Vwcztmb3IobGV0IGw9MCxoPW8ubGVuZ3RoO2w8aDtsKyspe2NvbnN0IHU9b1tsXTt0aGlzLmFkZEdyb3VwKHUuc3RhcnQsdS5jb3VudCx1Lm1hdGVyaWFsSW5kZXgpfWNvbnN0IGE9dC5ib3VuZGluZ0JveDthIT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9YS5jbG9uZSgpKTtjb25zdCBjPXQuYm91bmRpbmdTcGhlcmU7cmV0dXJuIGMhPT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1jLmNsb25lKCkpLHRoaXMuZHJhd1JhbmdlLnN0YXJ0PXQuZHJhd1JhbmdlLnN0YXJ0LHRoaXMuZHJhd1JhbmdlLmNvdW50PXQuZHJhd1JhbmdlLmNvdW50LHRoaXMudXNlckRhdGE9dC51c2VyRGF0YSx0aGlzfWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fWNvbnN0IEpjPW5ldyBzdCx3bj1uZXcgTW8senM9bmV3IERjLFljPW5ldyBQLFRzPW5ldyBQLFBzPW5ldyBQLENzPW5ldyBQLEZvPW5ldyBQLEJzPW5ldyBQLGpjPW5ldyBQLEVzPW5ldyBQO2NsYXNzIGtmIGV4dGVuZHMgSWV7Y29uc3RydWN0b3IodD1uZXcgQWUsZT1uZXcgQmYpe3N1cGVyKCksdGhpcy5pc01lc2g9ITAsdGhpcy50eXBlPSJNZXNoIix0aGlzLmdlb21ldHJ5PXQsdGhpcy5tYXRlcmlhbD1lLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXZvaWQgMCx0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz12b2lkIDAsdGhpcy5jb3VudD0xLHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdC5tb3JwaFRhcmdldEluZmx1ZW5jZXMhPT12b2lkIDAmJih0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz10Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5zbGljZSgpKSx0Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeSE9PXZvaWQgMCYmKHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PU9iamVjdC5hc3NpZ24oe30sdC5tb3JwaFRhcmdldERpY3Rpb25hcnkpKSx0aGlzLm1hdGVyaWFsPUFycmF5LmlzQXJyYXkodC5tYXRlcmlhbCk/dC5tYXRlcmlhbC5zbGljZSgpOnQubWF0ZXJpYWwsdGhpcy5nZW9tZXRyeT10Lmdlb21ldHJ5LHRoaXN9dXBkYXRlTW9ycGhUYXJnZXRzKCl7Y29uc3QgZT10aGlzLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcyxuPU9iamVjdC5rZXlzKGUpO2lmKG4ubGVuZ3RoPjApe2NvbnN0IHM9ZVtuWzBdXTtpZihzIT09dm9pZCAwKXt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1bXSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT17fTtmb3IobGV0IHI9MCxvPXMubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9c1tyXS5uYW1lfHxTdHJpbmcocik7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCgwKSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVthXT1yfX19fWdldFZlcnRleFBvc2l0aW9uKHQsZSl7Y29uc3Qgbj10aGlzLmdlb21ldHJ5LHM9bi5hdHRyaWJ1dGVzLnBvc2l0aW9uLHI9bi5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24sbz1uLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2UuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLHQpO2NvbnN0IGE9dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM7aWYociYmYSl7QnMuc2V0KDAsMCwwKTtmb3IobGV0IGM9MCxsPXIubGVuZ3RoO2M8bDtjKyspe2NvbnN0IGg9YVtjXSx1PXJbY107aCE9PTAmJihGby5mcm9tQnVmZmVyQXR0cmlidXRlKHUsdCksbz9Ccy5hZGRTY2FsZWRWZWN0b3IoRm8saCk6QnMuYWRkU2NhbGVkVmVjdG9yKEZvLnN1YihlKSxoKSl9ZS5hZGQoQnMpfXJldHVybiBlfXJheWNhc3QodCxlKXtjb25zdCBuPXRoaXMuZ2VvbWV0cnkscz10aGlzLm1hdGVyaWFsLHI9dGhpcy5tYXRyaXhXb3JsZDtzIT09dm9pZCAwJiYobi5ib3VuZGluZ1NwaGVyZT09PW51bGwmJm4uY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksenMuY29weShuLmJvdW5kaW5nU3BoZXJlKSx6cy5hcHBseU1hdHJpeDQociksd24uY29weSh0LnJheSkucmVjYXN0KHQubmVhciksISh6cy5jb250YWluc1BvaW50KHduLm9yaWdpbik9PT0hMSYmKHduLmludGVyc2VjdFNwaGVyZSh6cyxZYyk9PT1udWxsfHx3bi5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQoWWMpPnZpKHQuZmFyLXQubmVhciwyKSkpJiYoSmMuY29weShyKS5pbnZlcnQoKSx3bi5jb3B5KHQucmF5KS5hcHBseU1hdHJpeDQoSmMpLCEobi5ib3VuZGluZ0JveCE9PW51bGwmJnduLmludGVyc2VjdHNCb3gobi5ib3VuZGluZ0JveCk9PT0hMSkmJnRoaXMuX2NvbXB1dGVJbnRlcnNlY3Rpb25zKHQsZSx3bikpKX1fY29tcHV0ZUludGVyc2VjdGlvbnModCxlLG4pe2xldCBzO2NvbnN0IHI9dGhpcy5nZW9tZXRyeSxvPXRoaXMubWF0ZXJpYWwsYT1yLmluZGV4LGM9ci5hdHRyaWJ1dGVzLnBvc2l0aW9uLGw9ci5hdHRyaWJ1dGVzLnV2LGg9ci5hdHRyaWJ1dGVzLnV2MSx1PXIuYXR0cmlidXRlcy5ub3JtYWwsZj1yLmdyb3VwcyxkPXIuZHJhd1JhbmdlO2lmKGEhPT1udWxsKWlmKEFycmF5LmlzQXJyYXkobykpZm9yKGxldCBwPTAseT1mLmxlbmd0aDtwPHk7cCsrKXtjb25zdCBnPWZbcF0sdz1vW2cubWF0ZXJpYWxJbmRleF0sYj1NYXRoLm1heChnLnN0YXJ0LGQuc3RhcnQpLHg9TWF0aC5taW4oYS5jb3VudCxNYXRoLm1pbihnLnN0YXJ0K2cuY291bnQsZC5zdGFydCtkLmNvdW50KSk7Zm9yKGxldCBtPWIsTT14O208TTttKz0zKXtjb25zdCBTPWEuZ2V0WChtKSxBPWEuZ2V0WChtKzEpLHY9YS5nZXRYKG0rMik7cz1Gcyh0aGlzLHcsdCxuLGwsaCx1LFMsQSx2KSxzJiYocy5mYWNlSW5kZXg9TWF0aC5mbG9vcihtLzMpLHMuZmFjZS5tYXRlcmlhbEluZGV4PWcubWF0ZXJpYWxJbmRleCxlLnB1c2gocykpfX1lbHNle2NvbnN0IHA9TWF0aC5tYXgoMCxkLnN0YXJ0KSx5PU1hdGgubWluKGEuY291bnQsZC5zdGFydCtkLmNvdW50KTtmb3IobGV0IGc9cCx3PXk7Zzx3O2crPTMpe2NvbnN0IGI9YS5nZXRYKGcpLHg9YS5nZXRYKGcrMSksbT1hLmdldFgoZysyKTtzPUZzKHRoaXMsbyx0LG4sbCxoLHUsYix4LG0pLHMmJihzLmZhY2VJbmRleD1NYXRoLmZsb29yKGcvMyksZS5wdXNoKHMpKX19ZWxzZSBpZihjIT09dm9pZCAwKWlmKEFycmF5LmlzQXJyYXkobykpZm9yKGxldCBwPTAseT1mLmxlbmd0aDtwPHk7cCsrKXtjb25zdCBnPWZbcF0sdz1vW2cubWF0ZXJpYWxJbmRleF0sYj1NYXRoLm1heChnLnN0YXJ0LGQuc3RhcnQpLHg9TWF0aC5taW4oYy5jb3VudCxNYXRoLm1pbihnLnN0YXJ0K2cuY291bnQsZC5zdGFydCtkLmNvdW50KSk7Zm9yKGxldCBtPWIsTT14O208TTttKz0zKXtjb25zdCBTPW0sQT1tKzEsdj1tKzI7cz1Gcyh0aGlzLHcsdCxuLGwsaCx1LFMsQSx2KSxzJiYocy5mYWNlSW5kZXg9TWF0aC5mbG9vcihtLzMpLHMuZmFjZS5tYXRlcmlhbEluZGV4PWcubWF0ZXJpYWxJbmRleCxlLnB1c2gocykpfX1lbHNle2NvbnN0IHA9TWF0aC5tYXgoMCxkLnN0YXJ0KSx5PU1hdGgubWluKGMuY291bnQsZC5zdGFydCtkLmNvdW50KTtmb3IobGV0IGc9cCx3PXk7Zzx3O2crPTMpe2NvbnN0IGI9Zyx4PWcrMSxtPWcrMjtzPUZzKHRoaXMsbyx0LG4sbCxoLHUsYix4LG0pLHMmJihzLmZhY2VJbmRleD1NYXRoLmZsb29yKGcvMyksZS5wdXNoKHMpKX19fX1mdW5jdGlvbiBSZihpLHQsZSxuLHMscixvLGEpe2xldCBjO2lmKHQuc2lkZT09PTE/Yz1uLmludGVyc2VjdFRyaWFuZ2xlKG8scixzLCEwLGEpOmM9bi5pbnRlcnNlY3RUcmlhbmdsZShzLHIsbyx0LnNpZGU9PT0wLGEpLGM9PT1udWxsKXJldHVybiBudWxsO0VzLmNvcHkoYSksRXMuYXBwbHlNYXRyaXg0KGkubWF0cml4V29ybGQpO2NvbnN0IGw9ZS5yYXkub3JpZ2luLmRpc3RhbmNlVG8oRXMpO3JldHVybiBsPGUubmVhcnx8bD5lLmZhcj9udWxsOntkaXN0YW5jZTpsLHBvaW50OkVzLmNsb25lKCksb2JqZWN0Oml9fWZ1bmN0aW9uIEZzKGksdCxlLG4scyxyLG8sYSxjLGwpe2kuZ2V0VmVydGV4UG9zaXRpb24oYSxUcyksaS5nZXRWZXJ0ZXhQb3NpdGlvbihjLFBzKSxpLmdldFZlcnRleFBvc2l0aW9uKGwsQ3MpO2NvbnN0IGg9UmYoaSx0LGUsbixUcyxQcyxDcyxqYyk7aWYoaCl7Y29uc3QgdT1uZXcgUDtldC5nZXRCYXJ5Y29vcmQoamMsVHMsUHMsQ3MsdSkscyYmKGgudXY9ZXQuZ2V0SW50ZXJwb2xhdGVkQXR0cmlidXRlKHMsYSxjLGwsdSxuZXcgTikpLHImJihoLnV2MT1ldC5nZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUocixhLGMsbCx1LG5ldyBOKSksbyYmKGgubm9ybWFsPWV0LmdldEludGVycG9sYXRlZEF0dHJpYnV0ZShvLGEsYyxsLHUsbmV3IFApLGgubm9ybWFsLmRvdChuLmRpcmVjdGlvbik+MCYmaC5ub3JtYWwubXVsdGlwbHlTY2FsYXIoLTEpKTtjb25zdCBmPXthLGI6YyxjOmwsbm9ybWFsOm5ldyBQLG1hdGVyaWFsSW5kZXg6MH07ZXQuZ2V0Tm9ybWFsKFRzLFBzLENzLGYubm9ybWFsKSxoLmZhY2U9ZixoLmJhcnljb29yZD11fXJldHVybiBofWNvbnN0IElvPW5ldyBQLExmPW5ldyBQLE9mPW5ldyBNZTtjbGFzcyBOb3tjb25zdHJ1Y3Rvcih0PW5ldyBQKDEsMCwwKSxlPTApe3RoaXMuaXNQbGFuZT0hMCx0aGlzLm5vcm1hbD10LHRoaXMuY29uc3RhbnQ9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWwuY29weSh0KSx0aGlzLmNvbnN0YW50PWUsdGhpc31zZXRDb21wb25lbnRzKHQsZSxuLHMpe3JldHVybiB0aGlzLm5vcm1hbC5zZXQodCxlLG4pLHRoaXMuY29uc3RhbnQ9cyx0aGlzfXNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodCksdGhpcy5jb25zdGFudD0tZS5kb3QodGhpcy5ub3JtYWwpLHRoaXN9c2V0RnJvbUNvcGxhbmFyUG9pbnRzKHQsZSxuKXtjb25zdCBzPUlvLnN1YlZlY3RvcnMobixlKS5jcm9zcyhMZi5zdWJWZWN0b3JzKHQsZSkpLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KHMsdCksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQubm9ybWFsKSx0aGlzLmNvbnN0YW50PXQuY29uc3RhbnQsdGhpc31ub3JtYWxpemUoKXtjb25zdCB0PTEvdGhpcy5ub3JtYWwubGVuZ3RoKCk7cmV0dXJuIHRoaXMubm9ybWFsLm11bHRpcGx5U2NhbGFyKHQpLHRoaXMuY29uc3RhbnQqPXQsdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy5jb25zdGFudCo9LTEsdGhpcy5ub3JtYWwubmVnYXRlKCksdGhpc31kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHRoaXMubm9ybWFsLmRvdCh0KSt0aGlzLmNvbnN0YW50fWRpc3RhbmNlVG9TcGhlcmUodCl7cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KHQuY2VudGVyKS10LnJhZGl1c31wcm9qZWN0UG9pbnQodCxlKXtyZXR1cm4gZS5jb3B5KHQpLmFkZFNjYWxlZFZlY3Rvcih0aGlzLm5vcm1hbCwtdGhpcy5kaXN0YW5jZVRvUG9pbnQodCkpfWludGVyc2VjdExpbmUodCxlKXtjb25zdCBuPXQuZGVsdGEoSW8pLHM9dGhpcy5ub3JtYWwuZG90KG4pO2lmKHM9PT0wKXJldHVybiB0aGlzLmRpc3RhbmNlVG9Qb2ludCh0LnN0YXJ0KT09PTA/ZS5jb3B5KHQuc3RhcnQpOm51bGw7Y29uc3Qgcj0tKHQuc3RhcnQuZG90KHRoaXMubm9ybWFsKSt0aGlzLmNvbnN0YW50KS9zO3JldHVybiByPDB8fHI+MT9udWxsOmUuY29weSh0LnN0YXJ0KS5hZGRTY2FsZWRWZWN0b3IobixyKX1pbnRlcnNlY3RzTGluZSh0KXtjb25zdCBlPXRoaXMuZGlzdGFuY2VUb1BvaW50KHQuc3RhcnQpLG49dGhpcy5kaXN0YW5jZVRvUG9pbnQodC5lbmQpO3JldHVybiBlPDAmJm4+MHx8bjwwJiZlPjB9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzUGxhbmUodGhpcyl9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzUGxhbmUodGhpcyl9Y29wbGFuYXJQb2ludCh0KXtyZXR1cm4gdC5jb3B5KHRoaXMubm9ybWFsKS5tdWx0aXBseVNjYWxhcigtdGhpcy5jb25zdGFudCl9YXBwbHlNYXRyaXg0KHQsZSl7Y29uc3Qgbj1lfHxPZi5nZXROb3JtYWxNYXRyaXgodCkscz10aGlzLmNvcGxhbmFyUG9pbnQoSW8pLmFwcGx5TWF0cml4NCh0KSxyPXRoaXMubm9ybWFsLmFwcGx5TWF0cml4MyhuKS5ub3JtYWxpemUoKTtyZXR1cm4gdGhpcy5jb25zdGFudD0tcy5kb3QociksdGhpc310cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMuY29uc3RhbnQtPXQuZG90KHRoaXMubm9ybWFsKSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5ub3JtYWwuZXF1YWxzKHRoaXMubm9ybWFsKSYmdC5jb25zdGFudD09PXRoaXMuY29uc3RhbnR9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1jbGFzcyBTZXtjb25zdHJ1Y3Rvcigpe3RoaXMudHlwZT0iQ3VydmUiLHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPTIwMCx0aGlzLm5lZWRzVXBkYXRlPSExLHRoaXMuY2FjaGVBcmNMZW5ndGhzPW51bGx9Z2V0UG9pbnQoKXt2dCgiQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRlZC4iKX1nZXRQb2ludEF0KHQsZSl7Y29uc3Qgbj10aGlzLmdldFV0b1RtYXBwaW5nKHQpO3JldHVybiB0aGlzLmdldFBvaW50KG4sZSl9Z2V0UG9pbnRzKHQ9NSl7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPD10O24rKyllLnB1c2godGhpcy5nZXRQb2ludChuL3QpKTtyZXR1cm4gZX1nZXRTcGFjZWRQb2ludHModD01KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248PXQ7bisrKWUucHVzaCh0aGlzLmdldFBvaW50QXQobi90KSk7cmV0dXJuIGV9Z2V0TGVuZ3RoKCl7Y29uc3QgdD10aGlzLmdldExlbmd0aHMoKTtyZXR1cm4gdFt0Lmxlbmd0aC0xXX1nZXRMZW5ndGhzKHQ9dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMpe2lmKHRoaXMuY2FjaGVBcmNMZW5ndGhzJiZ0aGlzLmNhY2hlQXJjTGVuZ3Rocy5sZW5ndGg9PT10KzEmJiF0aGlzLm5lZWRzVXBkYXRlKXJldHVybiB0aGlzLmNhY2hlQXJjTGVuZ3Roczt0aGlzLm5lZWRzVXBkYXRlPSExO2NvbnN0IGU9W107bGV0IG4scz10aGlzLmdldFBvaW50KDApLHI9MDtlLnB1c2goMCk7Zm9yKGxldCBvPTE7bzw9dDtvKyspbj10aGlzLmdldFBvaW50KG8vdCkscis9bi5kaXN0YW5jZVRvKHMpLGUucHVzaChyKSxzPW47cmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzPWUsZX11cGRhdGVBcmNMZW5ndGhzKCl7dGhpcy5uZWVkc1VwZGF0ZT0hMCx0aGlzLmdldExlbmd0aHMoKX1nZXRVdG9UbWFwcGluZyh0LGU9bnVsbCl7Y29uc3Qgbj10aGlzLmdldExlbmd0aHMoKTtsZXQgcz0wO2NvbnN0IHI9bi5sZW5ndGg7bGV0IG87ZT9vPWU6bz10Km5bci0xXTtsZXQgYT0wLGM9ci0xLGw7Zm9yKDthPD1jOylpZihzPU1hdGguZmxvb3IoYSsoYy1hKS8yKSxsPW5bc10tbyxsPDApYT1zKzE7ZWxzZSBpZihsPjApYz1zLTE7ZWxzZXtjPXM7YnJlYWt9aWYocz1jLG5bc109PT1vKXJldHVybiBzLyhyLTEpO2NvbnN0IGg9bltzXSxmPW5bcysxXS1oLGQ9KG8taCkvZjtyZXR1cm4ocytkKS8oci0xKX1nZXRUYW5nZW50KHQsZSl7bGV0IHM9dC0xZS00LHI9dCsxZS00O3M8MCYmKHM9MCkscj4xJiYocj0xKTtjb25zdCBvPXRoaXMuZ2V0UG9pbnQocyksYT10aGlzLmdldFBvaW50KHIpLGM9ZXx8KG8uaXNWZWN0b3IyP25ldyBOOm5ldyBQKTtyZXR1cm4gYy5jb3B5KGEpLnN1YihvKS5ub3JtYWxpemUoKSxjfWdldFRhbmdlbnRBdCh0LGUpe2NvbnN0IG49dGhpcy5nZXRVdG9UbWFwcGluZyh0KTtyZXR1cm4gdGhpcy5nZXRUYW5nZW50KG4sZSl9Y29tcHV0ZUZyZW5ldEZyYW1lcyh0LGU9ITEpe2NvbnN0IG49bmV3IFAscz1bXSxyPVtdLG89W10sYT1uZXcgUCxjPW5ldyBzdDtmb3IobGV0IGQ9MDtkPD10O2QrKyl7Y29uc3QgcD1kL3Q7c1tkXT10aGlzLmdldFRhbmdlbnRBdChwLG5ldyBQKX1yWzBdPW5ldyBQLG9bMF09bmV3IFA7bGV0IGw9TnVtYmVyLk1BWF9WQUxVRTtjb25zdCBoPU1hdGguYWJzKHNbMF0ueCksdT1NYXRoLmFicyhzWzBdLnkpLGY9TWF0aC5hYnMoc1swXS56KTtoPD1sJiYobD1oLG4uc2V0KDEsMCwwKSksdTw9bCYmKGw9dSxuLnNldCgwLDEsMCkpLGY8PWwmJm4uc2V0KDAsMCwxKSxhLmNyb3NzVmVjdG9ycyhzWzBdLG4pLm5vcm1hbGl6ZSgpLHJbMF0uY3Jvc3NWZWN0b3JzKHNbMF0sYSksb1swXS5jcm9zc1ZlY3RvcnMoc1swXSxyWzBdKTtmb3IobGV0IGQ9MTtkPD10O2QrKyl7aWYocltkXT1yW2QtMV0uY2xvbmUoKSxvW2RdPW9bZC0xXS5jbG9uZSgpLGEuY3Jvc3NWZWN0b3JzKHNbZC0xXSxzW2RdKSxhLmxlbmd0aCgpPk51bWJlci5FUFNJTE9OKXthLm5vcm1hbGl6ZSgpO2NvbnN0IHA9TWF0aC5hY29zKFcoc1tkLTFdLmRvdChzW2RdKSwtMSwxKSk7cltkXS5hcHBseU1hdHJpeDQoYy5tYWtlUm90YXRpb25BeGlzKGEscCkpfW9bZF0uY3Jvc3NWZWN0b3JzKHNbZF0scltkXSl9aWYoZT09PSEwKXtsZXQgZD1NYXRoLmFjb3MoVyhyWzBdLmRvdChyW3RdKSwtMSwxKSk7ZC89dCxzWzBdLmRvdChhLmNyb3NzVmVjdG9ycyhyWzBdLHJbdF0pKT4wJiYoZD0tZCk7Zm9yKGxldCBwPTE7cDw9dDtwKyspcltwXS5hcHBseU1hdHJpeDQoYy5tYWtlUm90YXRpb25BeGlzKHNbcF0sZCpwKSksb1twXS5jcm9zc1ZlY3RvcnMoc1twXSxyW3BdKX1yZXR1cm57dGFuZ2VudHM6cyxub3JtYWxzOnIsYmlub3JtYWxzOm99fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz10LmFyY0xlbmd0aERpdmlzaW9ucyx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNyx0eXBlOiJDdXJ2ZSIsZ2VuZXJhdG9yOiJDdXJ2ZS50b0pTT04ifX07cmV0dXJuIHQuYXJjTGVuZ3RoRGl2aXNpb25zPXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zLHQudHlwZT10aGlzLnR5cGUsdH1mcm9tSlNPTih0KXtyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9dC5hcmNMZW5ndGhEaXZpc2lvbnMsdGhpc319Y2xhc3MgSXMgZXh0ZW5kcyBTZXtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MSxzPTEscj0wLG89TWF0aC5QSSoyLGE9ITEsYz0wKXtzdXBlcigpLHRoaXMuaXNFbGxpcHNlQ3VydmU9ITAsdGhpcy50eXBlPSJFbGxpcHNlQ3VydmUiLHRoaXMuYVg9dCx0aGlzLmFZPWUsdGhpcy54UmFkaXVzPW4sdGhpcy55UmFkaXVzPXMsdGhpcy5hU3RhcnRBbmdsZT1yLHRoaXMuYUVuZEFuZ2xlPW8sdGhpcy5hQ2xvY2t3aXNlPWEsdGhpcy5hUm90YXRpb249Y31nZXRQb2ludCh0LGU9bmV3IE4pe2NvbnN0IG49ZSxzPU1hdGguUEkqMjtsZXQgcj10aGlzLmFFbmRBbmdsZS10aGlzLmFTdGFydEFuZ2xlO2NvbnN0IG89TWF0aC5hYnMocik8TnVtYmVyLkVQU0lMT047Zm9yKDtyPDA7KXIrPXM7Zm9yKDtyPnM7KXItPXM7cjxOdW1iZXIuRVBTSUxPTiYmKG8/cj0wOnI9cyksdGhpcy5hQ2xvY2t3aXNlPT09ITAmJiFvJiYocj09PXM/cj0tczpyPXItcyk7Y29uc3QgYT10aGlzLmFTdGFydEFuZ2xlK3QqcjtsZXQgYz10aGlzLmFYK3RoaXMueFJhZGl1cypNYXRoLmNvcyhhKSxsPXRoaXMuYVkrdGhpcy55UmFkaXVzKk1hdGguc2luKGEpO2lmKHRoaXMuYVJvdGF0aW9uIT09MCl7Y29uc3QgaD1NYXRoLmNvcyh0aGlzLmFSb3RhdGlvbiksdT1NYXRoLnNpbih0aGlzLmFSb3RhdGlvbiksZj1jLXRoaXMuYVgsZD1sLXRoaXMuYVk7Yz1mKmgtZCp1K3RoaXMuYVgsbD1mKnUrZCpoK3RoaXMuYVl9cmV0dXJuIG4uc2V0KGMsbCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmFYPXQuYVgsdGhpcy5hWT10LmFZLHRoaXMueFJhZGl1cz10LnhSYWRpdXMsdGhpcy55UmFkaXVzPXQueVJhZGl1cyx0aGlzLmFTdGFydEFuZ2xlPXQuYVN0YXJ0QW5nbGUsdGhpcy5hRW5kQW5nbGU9dC5hRW5kQW5nbGUsdGhpcy5hQ2xvY2t3aXNlPXQuYUNsb2Nrd2lzZSx0aGlzLmFSb3RhdGlvbj10LmFSb3RhdGlvbix0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQuYVg9dGhpcy5hWCx0LmFZPXRoaXMuYVksdC54UmFkaXVzPXRoaXMueFJhZGl1cyx0LnlSYWRpdXM9dGhpcy55UmFkaXVzLHQuYVN0YXJ0QW5nbGU9dGhpcy5hU3RhcnRBbmdsZSx0LmFFbmRBbmdsZT10aGlzLmFFbmRBbmdsZSx0LmFDbG9ja3dpc2U9dGhpcy5hQ2xvY2t3aXNlLHQuYVJvdGF0aW9uPXRoaXMuYVJvdGF0aW9uLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMuYVg9dC5hWCx0aGlzLmFZPXQuYVksdGhpcy54UmFkaXVzPXQueFJhZGl1cyx0aGlzLnlSYWRpdXM9dC55UmFkaXVzLHRoaXMuYVN0YXJ0QW5nbGU9dC5hU3RhcnRBbmdsZSx0aGlzLmFFbmRBbmdsZT10LmFFbmRBbmdsZSx0aGlzLmFDbG9ja3dpc2U9dC5hQ2xvY2t3aXNlLHRoaXMuYVJvdGF0aW9uPXQuYVJvdGF0aW9uLHRoaXN9fWNsYXNzIFFjIGV4dGVuZHMgSXN7Y29uc3RydWN0b3IodCxlLG4scyxyLG8pe3N1cGVyKHQsZSxuLG4scyxyLG8pLHRoaXMuaXNBcmNDdXJ2ZT0hMCx0aGlzLnR5cGU9IkFyY0N1cnZlIn19ZnVuY3Rpb24ga28oKXtsZXQgaT0wLHQ9MCxlPTAsbj0wO2Z1bmN0aW9uIHMocixvLGEsYyl7aT1yLHQ9YSxlPS0zKnIrMypvLTIqYS1jLG49MipyLTIqbythK2N9cmV0dXJue2luaXRDYXRtdWxsUm9tOmZ1bmN0aW9uKHIsbyxhLGMsbCl7cyhvLGEsbCooYS1yKSxsKihjLW8pKX0saW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tOmZ1bmN0aW9uKHIsbyxhLGMsbCxoLHUpe2xldCBmPShvLXIpL2wtKGEtcikvKGwraCkrKGEtbykvaCxkPShhLW8pL2gtKGMtbykvKGgrdSkrKGMtYSkvdTtmKj1oLGQqPWgscyhvLGEsZixkKX0sY2FsYzpmdW5jdGlvbihyKXtjb25zdCBvPXIqcixhPW8qcjtyZXR1cm4gaSt0KnIrZSpvK24qYX19fWNvbnN0IE5zPW5ldyBQLFJvPW5ldyBrbyxMbz1uZXcga28sT289bmV3IGtvO2NsYXNzIEtjIGV4dGVuZHMgU2V7Y29uc3RydWN0b3IodD1bXSxlPSExLG49ImNlbnRyaXBldGFsIixzPS41KXtzdXBlcigpLHRoaXMuaXNDYXRtdWxsUm9tQ3VydmUzPSEwLHRoaXMudHlwZT0iQ2F0bXVsbFJvbUN1cnZlMyIsdGhpcy5wb2ludHM9dCx0aGlzLmNsb3NlZD1lLHRoaXMuY3VydmVUeXBlPW4sdGhpcy50ZW5zaW9uPXN9Z2V0UG9pbnQodCxlPW5ldyBQKXtjb25zdCBuPWUscz10aGlzLnBvaW50cyxyPXMubGVuZ3RoLG89KHItKHRoaXMuY2xvc2VkPzA6MSkpKnQ7bGV0IGE9TWF0aC5mbG9vcihvKSxjPW8tYTt0aGlzLmNsb3NlZD9hKz1hPjA/MDooTWF0aC5mbG9vcihNYXRoLmFicyhhKS9yKSsxKSpyOmM9PT0wJiZhPT09ci0xJiYoYT1yLTIsYz0xKTtsZXQgbCxoO3RoaXMuY2xvc2VkfHxhPjA/bD1zWyhhLTEpJXJdOihOcy5zdWJWZWN0b3JzKHNbMF0sc1sxXSkuYWRkKHNbMF0pLGw9TnMpO2NvbnN0IHU9c1thJXJdLGY9c1soYSsxKSVyXTtpZih0aGlzLmNsb3NlZHx8YSsyPHI/aD1zWyhhKzIpJXJdOihOcy5zdWJWZWN0b3JzKHNbci0xXSxzW3ItMl0pLmFkZChzW3ItMV0pLGg9TnMpLHRoaXMuY3VydmVUeXBlPT09ImNlbnRyaXBldGFsInx8dGhpcy5jdXJ2ZVR5cGU9PT0iY2hvcmRhbCIpe2NvbnN0IGQ9dGhpcy5jdXJ2ZVR5cGU9PT0iY2hvcmRhbCI/LjU6LjI1O2xldCBwPU1hdGgucG93KGwuZGlzdGFuY2VUb1NxdWFyZWQodSksZCkseT1NYXRoLnBvdyh1LmRpc3RhbmNlVG9TcXVhcmVkKGYpLGQpLGc9TWF0aC5wb3coZi5kaXN0YW5jZVRvU3F1YXJlZChoKSxkKTt5PDFlLTQmJih5PTEpLHA8MWUtNCYmKHA9eSksZzwxZS00JiYoZz15KSxSby5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20obC54LHUueCxmLngsaC54LHAseSxnKSxMby5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20obC55LHUueSxmLnksaC55LHAseSxnKSxPby5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20obC56LHUueixmLnosaC56LHAseSxnKX1lbHNlIHRoaXMuY3VydmVUeXBlPT09ImNhdG11bGxyb20iJiYoUm8uaW5pdENhdG11bGxSb20obC54LHUueCxmLngsaC54LHRoaXMudGVuc2lvbiksTG8uaW5pdENhdG11bGxSb20obC55LHUueSxmLnksaC55LHRoaXMudGVuc2lvbiksT28uaW5pdENhdG11bGxSb20obC56LHUueixmLnosaC56LHRoaXMudGVuc2lvbikpO3JldHVybiBuLnNldChSby5jYWxjKGMpLExvLmNhbGMoYyksT28uY2FsYyhjKSksbn1jb3B5KHQpe3N1cGVyLmNvcHkodCksdGhpcy5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10LnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10LnBvaW50c1tlXTt0aGlzLnBvaW50cy5wdXNoKHMuY2xvbmUoKSl9cmV0dXJuIHRoaXMuY2xvc2VkPXQuY2xvc2VkLHRoaXMuY3VydmVUeXBlPXQuY3VydmVUeXBlLHRoaXMudGVuc2lvbj10LnRlbnNpb24sdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dGhpcy5wb2ludHNbZV07dC5wb2ludHMucHVzaChzLnRvQXJyYXkoKSl9cmV0dXJuIHQuY2xvc2VkPXRoaXMuY2xvc2VkLHQuY3VydmVUeXBlPXRoaXMuY3VydmVUeXBlLHQudGVuc2lvbj10aGlzLnRlbnNpb24sdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQucG9pbnRzW2VdO3RoaXMucG9pbnRzLnB1c2gobmV3IFAoKS5mcm9tQXJyYXkocykpfXJldHVybiB0aGlzLmNsb3NlZD10LmNsb3NlZCx0aGlzLmN1cnZlVHlwZT10LmN1cnZlVHlwZSx0aGlzLnRlbnNpb249dC50ZW5zaW9uLHRoaXN9fWZ1bmN0aW9uIHRsKGksdCxlLG4scyl7Y29uc3Qgcj0obi10KSouNSxvPShzLWUpKi41LGE9aSppLGM9aSphO3JldHVybigyKmUtMipuK3IrbykqYysoLTMqZSszKm4tMipyLW8pKmErcippK2V9ZnVuY3Rpb24gRGYoaSx0KXtjb25zdCBlPTEtaTtyZXR1cm4gZSplKnR9ZnVuY3Rpb24gJGYoaSx0KXtyZXR1cm4gMiooMS1pKSppKnR9ZnVuY3Rpb24gVmYoaSx0KXtyZXR1cm4gaSppKnR9ZnVuY3Rpb24gRmkoaSx0LGUsbil7cmV0dXJuIERmKGksdCkrJGYoaSxlKStWZihpLG4pfWZ1bmN0aW9uIFVmKGksdCl7Y29uc3QgZT0xLWk7cmV0dXJuIGUqZSplKnR9ZnVuY3Rpb24gcWYoaSx0KXtjb25zdCBlPTEtaTtyZXR1cm4gMyplKmUqaSp0fWZ1bmN0aW9uIFhmKGksdCl7cmV0dXJuIDMqKDEtaSkqaSppKnR9ZnVuY3Rpb24gWmYoaSx0KXtyZXR1cm4gaSppKmkqdH1mdW5jdGlvbiBJaShpLHQsZSxuLHMpe3JldHVybiBVZihpLHQpK3FmKGksZSkrWGYoaSxuKStaZihpLHMpfWNsYXNzIERvIGV4dGVuZHMgU2V7Y29uc3RydWN0b3IodD1uZXcgTixlPW5ldyBOLG49bmV3IE4scz1uZXcgTil7c3VwZXIoKSx0aGlzLmlzQ3ViaWNCZXppZXJDdXJ2ZT0hMCx0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1uLHRoaXMudjM9c31nZXRQb2ludCh0LGU9bmV3IE4pe2NvbnN0IG49ZSxzPXRoaXMudjAscj10aGlzLnYxLG89dGhpcy52MixhPXRoaXMudjM7cmV0dXJuIG4uc2V0KElpKHQscy54LHIueCxvLngsYS54KSxJaSh0LHMueSxyLnksby55LGEueSkpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYwLmNvcHkodC52MCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzLnYzLmNvcHkodC52MyksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0LnYzPXRoaXMudjMudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjAuZnJvbUFycmF5KHQudjApLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXMudjMuZnJvbUFycmF5KHQudjMpLHRoaXN9fWNsYXNzIGVsIGV4dGVuZHMgU2V7Y29uc3RydWN0b3IodD1uZXcgUCxlPW5ldyBQLG49bmV3IFAscz1uZXcgUCl7c3VwZXIoKSx0aGlzLmlzQ3ViaWNCZXppZXJDdXJ2ZTM9ITAsdGhpcy50eXBlPSJDdWJpY0JlemllckN1cnZlMyIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW4sdGhpcy52Mz1zfWdldFBvaW50KHQsZT1uZXcgUCl7Y29uc3Qgbj1lLHM9dGhpcy52MCxyPXRoaXMudjEsbz10aGlzLnYyLGE9dGhpcy52MztyZXR1cm4gbi5zZXQoSWkodCxzLngsci54LG8ueCxhLngpLElpKHQscy55LHIueSxvLnksYS55KSxJaSh0LHMueixyLnosby56LGEueikpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYwLmNvcHkodC52MCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzLnYzLmNvcHkodC52MyksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0LnYzPXRoaXMudjMudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjAuZnJvbUFycmF5KHQudjApLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXMudjMuZnJvbUFycmF5KHQudjMpLHRoaXN9fWNsYXNzICRvIGV4dGVuZHMgU2V7Y29uc3RydWN0b3IodD1uZXcgTixlPW5ldyBOKXtzdXBlcigpLHRoaXMuaXNMaW5lQ3VydmU9ITAsdGhpcy50eXBlPSJMaW5lQ3VydmUiLHRoaXMudjE9dCx0aGlzLnYyPWV9Z2V0UG9pbnQodCxlPW5ldyBOKXtjb25zdCBuPWU7cmV0dXJuIHQ9PT0xP24uY29weSh0aGlzLnYyKToobi5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSxuLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnYxKSksbn1nZXRQb2ludEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQodCxlKX1nZXRUYW5nZW50KHQsZT1uZXcgTil7cmV0dXJuIGUuc3ViVmVjdG9ycyh0aGlzLnYyLHRoaXMudjEpLm5vcm1hbGl6ZSgpfWdldFRhbmdlbnRBdCh0LGUpe3JldHVybiB0aGlzLmdldFRhbmdlbnQodCxlKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpc319Y2xhc3MgbmwgZXh0ZW5kcyBTZXtjb25zdHJ1Y3Rvcih0PW5ldyBQLGU9bmV3IFApe3N1cGVyKCksdGhpcy5pc0xpbmVDdXJ2ZTM9ITAsdGhpcy50eXBlPSJMaW5lQ3VydmUzIix0aGlzLnYxPXQsdGhpcy52Mj1lfWdldFBvaW50KHQsZT1uZXcgUCl7Y29uc3Qgbj1lO3JldHVybiB0PT09MT9uLmNvcHkodGhpcy52Mik6KG4uY29weSh0aGlzLnYyKS5zdWIodGhpcy52MSksbi5tdWx0aXBseVNjYWxhcih0KS5hZGQodGhpcy52MSkpLG59Z2V0UG9pbnRBdCh0LGUpe3JldHVybiB0aGlzLmdldFBvaW50KHQsZSl9Z2V0VGFuZ2VudCh0LGU9bmV3IFApe3JldHVybiBlLnN1YlZlY3RvcnModGhpcy52Mix0aGlzLnYxKS5ub3JtYWxpemUoKX1nZXRUYW5nZW50QXQodCxlKXtyZXR1cm4gdGhpcy5nZXRUYW5nZW50KHQsZSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXN9fWNsYXNzIFZvIGV4dGVuZHMgU2V7Y29uc3RydWN0b3IodD1uZXcgTixlPW5ldyBOLG49bmV3IE4pe3N1cGVyKCksdGhpcy5pc1F1YWRyYXRpY0JlemllckN1cnZlPSEwLHRoaXMudHlwZT0iUXVhZHJhdGljQmV6aWVyQ3VydmUiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1ufWdldFBvaW50KHQsZT1uZXcgTil7Y29uc3Qgbj1lLHM9dGhpcy52MCxyPXRoaXMudjEsbz10aGlzLnYyO3JldHVybiBuLnNldChGaSh0LHMueCxyLngsby54KSxGaSh0LHMueSxyLnksby55KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MD10aGlzLnYwLnRvQXJyYXkoKSx0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpc319Y2xhc3MgaWwgZXh0ZW5kcyBTZXtjb25zdHJ1Y3Rvcih0PW5ldyBQLGU9bmV3IFAsbj1uZXcgUCl7c3VwZXIoKSx0aGlzLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUzPSEwLHRoaXMudHlwZT0iUXVhZHJhdGljQmV6aWVyQ3VydmUzIix0aGlzLnYwPXQsdGhpcy52MT1lLHRoaXMudjI9bn1nZXRQb2ludCh0LGU9bmV3IFApe2NvbnN0IG49ZSxzPXRoaXMudjAscj10aGlzLnYxLG89dGhpcy52MjtyZXR1cm4gbi5zZXQoRmkodCxzLngsci54LG8ueCksRmkodCxzLnksci55LG8ueSksRmkodCxzLnosci56LG8ueikpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYwLmNvcHkodC52MCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjAuZnJvbUFycmF5KHQudjApLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXN9fWNsYXNzIFVvIGV4dGVuZHMgU2V7Y29uc3RydWN0b3IodD1bXSl7c3VwZXIoKSx0aGlzLmlzU3BsaW5lQ3VydmU9ITAsdGhpcy50eXBlPSJTcGxpbmVDdXJ2ZSIsdGhpcy5wb2ludHM9dH1nZXRQb2ludCh0LGU9bmV3IE4pe2NvbnN0IG49ZSxzPXRoaXMucG9pbnRzLHI9KHMubGVuZ3RoLTEpKnQsbz1NYXRoLmZsb29yKHIpLGE9ci1vLGM9c1tvPT09MD9vOm8tMV0sbD1zW29dLGg9c1tvPnMubGVuZ3RoLTI/cy5sZW5ndGgtMTpvKzFdLHU9c1tvPnMubGVuZ3RoLTM/cy5sZW5ndGgtMTpvKzJdO3JldHVybiBuLnNldCh0bChhLGMueCxsLngsaC54LHUueCksdGwoYSxjLnksbC55LGgueSx1LnkpKSxufWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQucG9pbnRzW2VdO3RoaXMucG9pbnRzLnB1c2gocy5jbG9uZSgpKX1yZXR1cm4gdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dGhpcy5wb2ludHNbZV07dC5wb2ludHMucHVzaChzLnRvQXJyYXkoKSl9cmV0dXJuIHR9ZnJvbUpTT04odCl7c3VwZXIuZnJvbUpTT04odCksdGhpcy5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10LnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10LnBvaW50c1tlXTt0aGlzLnBvaW50cy5wdXNoKG5ldyBOKCkuZnJvbUFycmF5KHMpKX1yZXR1cm4gdGhpc319dmFyIHNsPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEFyY0N1cnZlOlFjLENhdG11bGxSb21DdXJ2ZTM6S2MsQ3ViaWNCZXppZXJDdXJ2ZTpEbyxDdWJpY0JlemllckN1cnZlMzplbCxFbGxpcHNlQ3VydmU6SXMsTGluZUN1cnZlOiRvLExpbmVDdXJ2ZTM6bmwsUXVhZHJhdGljQmV6aWVyQ3VydmU6Vm8sUXVhZHJhdGljQmV6aWVyQ3VydmUzOmlsLFNwbGluZUN1cnZlOlVvfSk7Y2xhc3MgV2YgZXh0ZW5kcyBTZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy50eXBlPSJDdXJ2ZVBhdGgiLHRoaXMuY3VydmVzPVtdLHRoaXMuYXV0b0Nsb3NlPSExfWFkZCh0KXt0aGlzLmN1cnZlcy5wdXNoKHQpfWNsb3NlUGF0aCgpe2NvbnN0IHQ9dGhpcy5jdXJ2ZXNbMF0uZ2V0UG9pbnQoMCksZT10aGlzLmN1cnZlc1t0aGlzLmN1cnZlcy5sZW5ndGgtMV0uZ2V0UG9pbnQoMSk7aWYoIXQuZXF1YWxzKGUpKXtjb25zdCBuPXQuaXNWZWN0b3IyPT09ITA/IkxpbmVDdXJ2ZSI6IkxpbmVDdXJ2ZTMiO3RoaXMuY3VydmVzLnB1c2gobmV3IHNsW25dKGUsdCkpfXJldHVybiB0aGlzfWdldFBvaW50KHQsZSl7Y29uc3Qgbj10KnRoaXMuZ2V0TGVuZ3RoKCkscz10aGlzLmdldEN1cnZlTGVuZ3RocygpO2xldCByPTA7Zm9yKDtyPHMubGVuZ3RoOyl7aWYoc1tyXT49bil7Y29uc3Qgbz1zW3JdLW4sYT10aGlzLmN1cnZlc1tyXSxjPWEuZ2V0TGVuZ3RoKCksbD1jPT09MD8wOjEtby9jO3JldHVybiBhLmdldFBvaW50QXQobCxlKX1yKyt9cmV0dXJuIG51bGx9Z2V0TGVuZ3RoKCl7Y29uc3QgdD10aGlzLmdldEN1cnZlTGVuZ3RocygpO3JldHVybiB0W3QubGVuZ3RoLTFdfXVwZGF0ZUFyY0xlbmd0aHMoKXt0aGlzLm5lZWRzVXBkYXRlPSEwLHRoaXMuY2FjaGVMZW5ndGhzPW51bGwsdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKX1nZXRDdXJ2ZUxlbmd0aHMoKXtpZih0aGlzLmNhY2hlTGVuZ3RocyYmdGhpcy5jYWNoZUxlbmd0aHMubGVuZ3RoPT09dGhpcy5jdXJ2ZXMubGVuZ3RoKXJldHVybiB0aGlzLmNhY2hlTGVuZ3Rocztjb25zdCB0PVtdO2xldCBlPTA7Zm9yKGxldCBuPTAscz10aGlzLmN1cnZlcy5sZW5ndGg7bjxzO24rKyllKz10aGlzLmN1cnZlc1tuXS5nZXRMZW5ndGgoKSx0LnB1c2goZSk7cmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzPXQsdH1nZXRTcGFjZWRQb2ludHModD00MCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPD10O24rKyllLnB1c2godGhpcy5nZXRQb2ludChuL3QpKTtyZXR1cm4gdGhpcy5hdXRvQ2xvc2UmJmUucHVzaChlWzBdKSxlfWdldFBvaW50cyh0PTEyKXtjb25zdCBlPVtdO2xldCBuO2ZvcihsZXQgcz0wLHI9dGhpcy5jdXJ2ZXM7czxyLmxlbmd0aDtzKyspe2NvbnN0IG89cltzXSxhPW8uaXNFbGxpcHNlQ3VydmU/dCoyOm8uaXNMaW5lQ3VydmV8fG8uaXNMaW5lQ3VydmUzPzE6by5pc1NwbGluZUN1cnZlP3Qqby5wb2ludHMubGVuZ3RoOnQsYz1vLmdldFBvaW50cyhhKTtmb3IobGV0IGw9MDtsPGMubGVuZ3RoO2wrKyl7Y29uc3QgaD1jW2xdO24mJm4uZXF1YWxzKGgpfHwoZS5wdXNoKGgpLG49aCl9fXJldHVybiB0aGlzLmF1dG9DbG9zZSYmZS5sZW5ndGg+MSYmIWVbZS5sZW5ndGgtMV0uZXF1YWxzKGVbMF0pJiZlLnB1c2goZVswXSksZX1jb3B5KHQpe3N1cGVyLmNvcHkodCksdGhpcy5jdXJ2ZXM9W107Zm9yKGxldCBlPTAsbj10LmN1cnZlcy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10LmN1cnZlc1tlXTt0aGlzLmN1cnZlcy5wdXNoKHMuY2xvbmUoKSl9cmV0dXJuIHRoaXMuYXV0b0Nsb3NlPXQuYXV0b0Nsb3NlLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTt0LmF1dG9DbG9zZT10aGlzLmF1dG9DbG9zZSx0LmN1cnZlcz1bXTtmb3IobGV0IGU9MCxuPXRoaXMuY3VydmVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXRoaXMuY3VydmVzW2VdO3QuY3VydmVzLnB1c2gocy50b0pTT04oKSl9cmV0dXJuIHR9ZnJvbUpTT04odCl7c3VwZXIuZnJvbUpTT04odCksdGhpcy5hdXRvQ2xvc2U9dC5hdXRvQ2xvc2UsdGhpcy5jdXJ2ZXM9W107Zm9yKGxldCBlPTAsbj10LmN1cnZlcy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10LmN1cnZlc1tlXTt0aGlzLmN1cnZlcy5wdXNoKG5ldyBzbFtzLnR5cGVdKCkuZnJvbUpTT04ocykpfXJldHVybiB0aGlzfX1sZXQgcmw9Y2xhc3MgZXh0ZW5kcyBXZntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iUGF0aCIsdGhpcy5jdXJyZW50UG9pbnQ9bmV3IE4sdCYmdGhpcy5zZXRGcm9tUG9pbnRzKHQpfXNldEZyb21Qb2ludHModCl7dGhpcy5tb3ZlVG8odFswXS54LHRbMF0ueSk7Zm9yKGxldCBlPTEsbj10Lmxlbmd0aDtlPG47ZSsrKXRoaXMubGluZVRvKHRbZV0ueCx0W2VdLnkpO3JldHVybiB0aGlzfW1vdmVUbyh0LGUpe3JldHVybiB0aGlzLmN1cnJlbnRQb2ludC5zZXQodCxlKSx0aGlzfWxpbmVUbyh0LGUpe2NvbnN0IG49bmV3ICRvKHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksbmV3IE4odCxlKSk7cmV0dXJuIHRoaXMuY3VydmVzLnB1c2gobiksdGhpcy5jdXJyZW50UG9pbnQuc2V0KHQsZSksdGhpc31xdWFkcmF0aWNDdXJ2ZVRvKHQsZSxuLHMpe2NvbnN0IHI9bmV3IFZvKHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksbmV3IE4odCxlKSxuZXcgTihuLHMpKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChyKSx0aGlzLmN1cnJlbnRQb2ludC5zZXQobixzKSx0aGlzfWJlemllckN1cnZlVG8odCxlLG4scyxyLG8pe2NvbnN0IGE9bmV3IERvKHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksbmV3IE4odCxlKSxuZXcgTihuLHMpLG5ldyBOKHIsbykpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKGEpLHRoaXMuY3VycmVudFBvaW50LnNldChyLG8pLHRoaXN9c3BsaW5lVGhydSh0KXtjb25zdCBlPVt0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpXS5jb25jYXQodCksbj1uZXcgVW8oZSk7cmV0dXJuIHRoaXMuY3VydmVzLnB1c2gobiksdGhpcy5jdXJyZW50UG9pbnQuY29weSh0W3QubGVuZ3RoLTFdKSx0aGlzfWFyYyh0LGUsbixzLHIsbyl7Y29uc3QgYT10aGlzLmN1cnJlbnRQb2ludC54LGM9dGhpcy5jdXJyZW50UG9pbnQueTtyZXR1cm4gdGhpcy5hYnNhcmModCthLGUrYyxuLHMscixvKSx0aGlzfWFic2FyYyh0LGUsbixzLHIsbyl7cmV0dXJuIHRoaXMuYWJzZWxsaXBzZSh0LGUsbixuLHMscixvKSx0aGlzfWVsbGlwc2UodCxlLG4scyxyLG8sYSxjKXtjb25zdCBsPXRoaXMuY3VycmVudFBvaW50LngsaD10aGlzLmN1cnJlbnRQb2ludC55O3JldHVybiB0aGlzLmFic2VsbGlwc2UodCtsLGUraCxuLHMscixvLGEsYyksdGhpc31hYnNlbGxpcHNlKHQsZSxuLHMscixvLGEsYyl7Y29uc3QgbD1uZXcgSXModCxlLG4scyxyLG8sYSxjKTtpZih0aGlzLmN1cnZlcy5sZW5ndGg+MCl7Y29uc3QgdT1sLmdldFBvaW50KDApO3UuZXF1YWxzKHRoaXMuY3VycmVudFBvaW50KXx8dGhpcy5saW5lVG8odS54LHUueSl9dGhpcy5jdXJ2ZXMucHVzaChsKTtjb25zdCBoPWwuZ2V0UG9pbnQoMSk7cmV0dXJuIHRoaXMuY3VycmVudFBvaW50LmNvcHkoaCksdGhpc31jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuY3VycmVudFBvaW50LmNvcHkodC5jdXJyZW50UG9pbnQpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5jdXJyZW50UG9pbnQ9dGhpcy5jdXJyZW50UG9pbnQudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMuY3VycmVudFBvaW50LmZyb21BcnJheSh0LmN1cnJlbnRQb2ludCksdGhpc319O2NsYXNzIG9sIGV4dGVuZHMgcmx7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy51dWlkPURuKCksdGhpcy50eXBlPSJTaGFwZSIsdGhpcy5ob2xlcz1bXX1nZXRQb2ludHNIb2xlcyh0KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wLHM9dGhpcy5ob2xlcy5sZW5ndGg7bjxzO24rKyllW25dPXRoaXMuaG9sZXNbbl0uZ2V0UG9pbnRzKHQpO3JldHVybiBlfWV4dHJhY3RQb2ludHModCl7cmV0dXJue3NoYXBlOnRoaXMuZ2V0UG9pbnRzKHQpLGhvbGVzOnRoaXMuZ2V0UG9pbnRzSG9sZXModCl9fWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLmhvbGVzPVtdO2ZvcihsZXQgZT0wLG49dC5ob2xlcy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10LmhvbGVzW2VdO3RoaXMuaG9sZXMucHVzaChzLmNsb25lKCkpfXJldHVybiB0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC51dWlkPXRoaXMudXVpZCx0LmhvbGVzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5ob2xlcy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10aGlzLmhvbGVzW2VdO3QuaG9sZXMucHVzaChzLnRvSlNPTigpKX1yZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLnV1aWQ9dC51dWlkLHRoaXMuaG9sZXM9W107Zm9yKGxldCBlPTAsbj10LmhvbGVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQuaG9sZXNbZV07dGhpcy5ob2xlcy5wdXNoKG5ldyBybCgpLmZyb21KU09OKHMpKX1yZXR1cm4gdGhpc319ZnVuY3Rpb24gR2YoaSx0LGU9Mil7Y29uc3Qgbj10JiZ0Lmxlbmd0aCxzPW4/dFswXSplOmkubGVuZ3RoO2xldCByPWFsKGksMCxzLGUsITApO2NvbnN0IG89W107aWYoIXJ8fHIubmV4dD09PXIucHJldilyZXR1cm4gbztsZXQgYSxjLGw7aWYobiYmKHI9UWYoaSx0LHIsZSkpLGkubGVuZ3RoPjgwKmUpe2E9aVswXSxjPWlbMV07bGV0IGg9YSx1PWM7Zm9yKGxldCBmPWU7ZjxzO2YrPWUpe2NvbnN0IGQ9aVtmXSxwPWlbZisxXTtkPGEmJihhPWQpLHA8YyYmKGM9cCksZD5oJiYoaD1kKSxwPnUmJih1PXApfWw9TWF0aC5tYXgoaC1hLHUtYyksbD1sIT09MD8zMjc2Ny9sOjB9cmV0dXJuIE5pKHIsbyxlLGEsYyxsLDApLG99ZnVuY3Rpb24gYWwoaSx0LGUsbixzKXtsZXQgcjtpZihzPT09bGQoaSx0LGUsbik+MClmb3IobGV0IG89dDtvPGU7bys9bilyPXVsKG8vbnwwLGlbb10saVtvKzFdLHIpO2Vsc2UgZm9yKGxldCBvPWUtbjtvPj10O28tPW4pcj11bChvL258MCxpW29dLGlbbysxXSxyKTtyZXR1cm4gciYmam4ocixyLm5leHQpJiYoTGkocikscj1yLm5leHQpLHJ9ZnVuY3Rpb24gYm4oaSx0KXtpZighaSlyZXR1cm4gaTt0fHwodD1pKTtsZXQgZT1pLG47ZG8gaWYobj0hMSwhZS5zdGVpbmVyJiYoam4oZSxlLm5leHQpfHxydChlLnByZXYsZSxlLm5leHQpPT09MCkpe2lmKExpKGUpLGU9dD1lLnByZXYsZT09PWUubmV4dClicmVhaztuPSEwfWVsc2UgZT1lLm5leHQ7d2hpbGUobnx8ZSE9PXQpO3JldHVybiB0fWZ1bmN0aW9uIE5pKGksdCxlLG4scyxyLG8pe2lmKCFpKXJldHVybjshbyYmciYmaWQoaSxuLHMscik7bGV0IGE9aTtmb3IoO2kucHJldiE9PWkubmV4dDspe2NvbnN0IGM9aS5wcmV2LGw9aS5uZXh0O2lmKHI/SmYoaSxuLHMscik6SGYoaSkpe3QucHVzaChjLmksaS5pLGwuaSksTGkoaSksaT1sLm5leHQsYT1sLm5leHQ7Y29udGludWV9aWYoaT1sLGk9PT1hKXtvP289PT0xPyhpPVlmKGJuKGkpLHQpLE5pKGksdCxlLG4scyxyLDIpKTpvPT09MiYmamYoaSx0LGUsbixzLHIpOk5pKGJuKGkpLHQsZSxuLHMsciwxKTticmVha319fWZ1bmN0aW9uIEhmKGkpe2NvbnN0IHQ9aS5wcmV2LGU9aSxuPWkubmV4dDtpZihydCh0LGUsbik+PTApcmV0dXJuITE7Y29uc3Qgcz10Lngscj1lLngsbz1uLngsYT10LnksYz1lLnksbD1uLnksaD1NYXRoLm1pbihzLHIsbyksdT1NYXRoLm1pbihhLGMsbCksZj1NYXRoLm1heChzLHIsbyksZD1NYXRoLm1heChhLGMsbCk7bGV0IHA9bi5uZXh0O2Zvcig7cCE9PXQ7KXtpZihwLng+PWgmJnAueDw9ZiYmcC55Pj11JiZwLnk8PWQmJmtpKHMsYSxyLGMsbyxsLHAueCxwLnkpJiZydChwLnByZXYscCxwLm5leHQpPj0wKXJldHVybiExO3A9cC5uZXh0fXJldHVybiEwfWZ1bmN0aW9uIEpmKGksdCxlLG4pe2NvbnN0IHM9aS5wcmV2LHI9aSxvPWkubmV4dDtpZihydChzLHIsbyk+PTApcmV0dXJuITE7Y29uc3QgYT1zLngsYz1yLngsbD1vLngsaD1zLnksdT1yLnksZj1vLnksZD1NYXRoLm1pbihhLGMsbCkscD1NYXRoLm1pbihoLHUsZikseT1NYXRoLm1heChhLGMsbCksZz1NYXRoLm1heChoLHUsZiksdz1xbyhkLHAsdCxlLG4pLGI9cW8oeSxnLHQsZSxuKTtsZXQgeD1pLnByZXZaLG09aS5uZXh0Wjtmb3IoO3gmJnguej49dyYmbSYmbS56PD1iOyl7aWYoeC54Pj1kJiZ4Lng8PXkmJngueT49cCYmeC55PD1nJiZ4IT09cyYmeCE9PW8mJmtpKGEsaCxjLHUsbCxmLHgueCx4LnkpJiZydCh4LnByZXYseCx4Lm5leHQpPj0wfHwoeD14LnByZXZaLG0ueD49ZCYmbS54PD15JiZtLnk+PXAmJm0ueTw9ZyYmbSE9PXMmJm0hPT1vJiZraShhLGgsYyx1LGwsZixtLngsbS55KSYmcnQobS5wcmV2LG0sbS5uZXh0KT49MCkpcmV0dXJuITE7bT1tLm5leHRafWZvcig7eCYmeC56Pj13Oyl7aWYoeC54Pj1kJiZ4Lng8PXkmJngueT49cCYmeC55PD1nJiZ4IT09cyYmeCE9PW8mJmtpKGEsaCxjLHUsbCxmLHgueCx4LnkpJiZydCh4LnByZXYseCx4Lm5leHQpPj0wKXJldHVybiExO3g9eC5wcmV2Wn1mb3IoO20mJm0uejw9Yjspe2lmKG0ueD49ZCYmbS54PD15JiZtLnk+PXAmJm0ueTw9ZyYmbSE9PXMmJm0hPT1vJiZraShhLGgsYyx1LGwsZixtLngsbS55KSYmcnQobS5wcmV2LG0sbS5uZXh0KT49MClyZXR1cm4hMTttPW0ubmV4dFp9cmV0dXJuITB9ZnVuY3Rpb24gWWYoaSx0KXtsZXQgZT1pO2Rve2NvbnN0IG49ZS5wcmV2LHM9ZS5uZXh0Lm5leHQ7IWpuKG4scykmJmxsKG4sZSxlLm5leHQscykmJlJpKG4scykmJlJpKHMsbikmJih0LnB1c2gobi5pLGUuaSxzLmkpLExpKGUpLExpKGUubmV4dCksZT1pPXMpLGU9ZS5uZXh0fXdoaWxlKGUhPT1pKTtyZXR1cm4gYm4oZSl9ZnVuY3Rpb24gamYoaSx0LGUsbixzLHIpe2xldCBvPWk7ZG97bGV0IGE9by5uZXh0Lm5leHQ7Zm9yKDthIT09by5wcmV2Oyl7aWYoby5pIT09YS5pJiZvZChvLGEpKXtsZXQgYz1obChvLGEpO289Ym4obyxvLm5leHQpLGM9Ym4oYyxjLm5leHQpLE5pKG8sdCxlLG4scyxyLDApLE5pKGMsdCxlLG4scyxyLDApO3JldHVybn1hPWEubmV4dH1vPW8ubmV4dH13aGlsZShvIT09aSl9ZnVuY3Rpb24gUWYoaSx0LGUsbil7Y29uc3Qgcz1bXTtmb3IobGV0IHI9MCxvPXQubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9dFtyXSpuLGM9cjxvLTE/dFtyKzFdKm46aS5sZW5ndGgsbD1hbChpLGEsYyxuLCExKTtsPT09bC5uZXh0JiYobC5zdGVpbmVyPSEwKSxzLnB1c2gocmQobCkpfXMuc29ydChLZik7Zm9yKGxldCByPTA7cjxzLmxlbmd0aDtyKyspZT10ZChzW3JdLGUpO3JldHVybiBlfWZ1bmN0aW9uIEtmKGksdCl7bGV0IGU9aS54LXQueDtpZihlPT09MCYmKGU9aS55LXQueSxlPT09MCkpe2NvbnN0IG49KGkubmV4dC55LWkueSkvKGkubmV4dC54LWkueCkscz0odC5uZXh0LnktdC55KS8odC5uZXh0LngtdC54KTtlPW4tc31yZXR1cm4gZX1mdW5jdGlvbiB0ZChpLHQpe2NvbnN0IGU9ZWQoaSx0KTtpZighZSlyZXR1cm4gdDtjb25zdCBuPWhsKGUsaSk7cmV0dXJuIGJuKG4sbi5uZXh0KSxibihlLGUubmV4dCl9ZnVuY3Rpb24gZWQoaSx0KXtsZXQgZT10O2NvbnN0IG49aS54LHM9aS55O2xldCByPS0xLzAsbztpZihqbihpLGUpKXJldHVybiBlO2Rve2lmKGpuKGksZS5uZXh0KSlyZXR1cm4gZS5uZXh0O2lmKHM8PWUueSYmcz49ZS5uZXh0LnkmJmUubmV4dC55IT09ZS55KXtjb25zdCB1PWUueCsocy1lLnkpKihlLm5leHQueC1lLngpLyhlLm5leHQueS1lLnkpO2lmKHU8PW4mJnU+ciYmKHI9dSxvPWUueDxlLm5leHQueD9lOmUubmV4dCx1PT09bikpcmV0dXJuIG99ZT1lLm5leHR9d2hpbGUoZSE9PXQpO2lmKCFvKXJldHVybiBudWxsO2NvbnN0IGE9byxjPW8ueCxsPW8ueTtsZXQgaD0xLzA7ZT1vO2Rve2lmKG4+PWUueCYmZS54Pj1jJiZuIT09ZS54JiZjbChzPGw/bjpyLHMsYyxsLHM8bD9yOm4scyxlLngsZS55KSl7Y29uc3QgdT1NYXRoLmFicyhzLWUueSkvKG4tZS54KTtSaShlLGkpJiYodTxofHx1PT09aCYmKGUueD5vLnh8fGUueD09PW8ueCYmbmQobyxlKSkpJiYobz1lLGg9dSl9ZT1lLm5leHR9d2hpbGUoZSE9PWEpO3JldHVybiBvfWZ1bmN0aW9uIG5kKGksdCl7cmV0dXJuIHJ0KGkucHJldixpLHQucHJldik8MCYmcnQodC5uZXh0LGksaS5uZXh0KTwwfWZ1bmN0aW9uIGlkKGksdCxlLG4pe2xldCBzPWk7ZG8gcy56PT09MCYmKHMuej1xbyhzLngscy55LHQsZSxuKSkscy5wcmV2Wj1zLnByZXYscy5uZXh0Wj1zLm5leHQscz1zLm5leHQ7d2hpbGUocyE9PWkpO3MucHJldloubmV4dFo9bnVsbCxzLnByZXZaPW51bGwsc2Qocyl9ZnVuY3Rpb24gc2QoaSl7bGV0IHQsZT0xO2Rve2xldCBuPWkscztpPW51bGw7bGV0IHI9bnVsbDtmb3IodD0wO247KXt0Kys7bGV0IG89bixhPTA7Zm9yKGxldCBsPTA7bDxlJiYoYSsrLG89by5uZXh0WiwhIW8pO2wrKyk7bGV0IGM9ZTtmb3IoO2E+MHx8Yz4wJiZvOylhIT09MCYmKGM9PT0wfHwhb3x8bi56PD1vLnopPyhzPW4sbj1uLm5leHRaLGEtLSk6KHM9byxvPW8ubmV4dFosYy0tKSxyP3IubmV4dFo9czppPXMscy5wcmV2Wj1yLHI9cztuPW99ci5uZXh0Wj1udWxsLGUqPTJ9d2hpbGUodD4xKTtyZXR1cm4gaX1mdW5jdGlvbiBxbyhpLHQsZSxuLHMpe3JldHVybiBpPShpLWUpKnN8MCx0PSh0LW4pKnN8MCxpPShpfGk8PDgpJjE2NzExOTM1LGk9KGl8aTw8NCkmMjUyNjQ1MTM1LGk9KGl8aTw8MikmODU4OTkzNDU5LGk9KGl8aTw8MSkmMTQzMTY1NTc2NSx0PSh0fHQ8PDgpJjE2NzExOTM1LHQ9KHR8dDw8NCkmMjUyNjQ1MTM1LHQ9KHR8dDw8MikmODU4OTkzNDU5LHQ9KHR8dDw8MSkmMTQzMTY1NTc2NSxpfHQ8PDF9ZnVuY3Rpb24gcmQoaSl7bGV0IHQ9aSxlPWk7ZG8odC54PGUueHx8dC54PT09ZS54JiZ0Lnk8ZS55KSYmKGU9dCksdD10Lm5leHQ7d2hpbGUodCE9PWkpO3JldHVybiBlfWZ1bmN0aW9uIGNsKGksdCxlLG4scyxyLG8sYSl7cmV0dXJuKHMtbykqKHQtYSk+PShpLW8pKihyLWEpJiYoaS1vKSoobi1hKT49KGUtbykqKHQtYSkmJihlLW8pKihyLWEpPj0ocy1vKSoobi1hKX1mdW5jdGlvbiBraShpLHQsZSxuLHMscixvLGEpe3JldHVybiEoaT09PW8mJnQ9PT1hKSYmY2woaSx0LGUsbixzLHIsbyxhKX1mdW5jdGlvbiBvZChpLHQpe3JldHVybiBpLm5leHQuaSE9PXQuaSYmaS5wcmV2LmkhPT10LmkmJiFhZChpLHQpJiYoUmkoaSx0KSYmUmkodCxpKSYmY2QoaSx0KSYmKHJ0KGkucHJldixpLHQucHJldil8fHJ0KGksdC5wcmV2LHQpKXx8am4oaSx0KSYmcnQoaS5wcmV2LGksaS5uZXh0KT4wJiZydCh0LnByZXYsdCx0Lm5leHQpPjApfWZ1bmN0aW9uIHJ0KGksdCxlKXtyZXR1cm4odC55LWkueSkqKGUueC10LngpLSh0LngtaS54KSooZS55LXQueSl9ZnVuY3Rpb24gam4oaSx0KXtyZXR1cm4gaS54PT09dC54JiZpLnk9PT10Lnl9ZnVuY3Rpb24gbGwoaSx0LGUsbil7Y29uc3Qgcz1ScyhydChpLHQsZSkpLHI9UnMocnQoaSx0LG4pKSxvPVJzKHJ0KGUsbixpKSksYT1ScyhydChlLG4sdCkpO3JldHVybiEhKHMhPT1yJiZvIT09YXx8cz09PTAmJmtzKGksZSx0KXx8cj09PTAmJmtzKGksbix0KXx8bz09PTAmJmtzKGUsaSxuKXx8YT09PTAmJmtzKGUsdCxuKSl9ZnVuY3Rpb24ga3MoaSx0LGUpe3JldHVybiB0Lng8PU1hdGgubWF4KGkueCxlLngpJiZ0Lng+PU1hdGgubWluKGkueCxlLngpJiZ0Lnk8PU1hdGgubWF4KGkueSxlLnkpJiZ0Lnk+PU1hdGgubWluKGkueSxlLnkpfWZ1bmN0aW9uIFJzKGkpe3JldHVybiBpPjA/MTppPDA/LTE6MH1mdW5jdGlvbiBhZChpLHQpe2xldCBlPWk7ZG97aWYoZS5pIT09aS5pJiZlLm5leHQuaSE9PWkuaSYmZS5pIT09dC5pJiZlLm5leHQuaSE9PXQuaSYmbGwoZSxlLm5leHQsaSx0KSlyZXR1cm4hMDtlPWUubmV4dH13aGlsZShlIT09aSk7cmV0dXJuITF9ZnVuY3Rpb24gUmkoaSx0KXtyZXR1cm4gcnQoaS5wcmV2LGksaS5uZXh0KTwwP3J0KGksdCxpLm5leHQpPj0wJiZydChpLGkucHJldix0KT49MDpydChpLHQsaS5wcmV2KTwwfHxydChpLGkubmV4dCx0KTwwfWZ1bmN0aW9uIGNkKGksdCl7bGV0IGU9aSxuPSExO2NvbnN0IHM9KGkueCt0LngpLzIscj0oaS55K3QueSkvMjtkbyBlLnk+ciE9ZS5uZXh0Lnk+ciYmZS5uZXh0LnkhPT1lLnkmJnM8KGUubmV4dC54LWUueCkqKHItZS55KS8oZS5uZXh0LnktZS55KStlLngmJihuPSFuKSxlPWUubmV4dDt3aGlsZShlIT09aSk7cmV0dXJuIG59ZnVuY3Rpb24gaGwoaSx0KXtjb25zdCBlPVhvKGkuaSxpLngsaS55KSxuPVhvKHQuaSx0LngsdC55KSxzPWkubmV4dCxyPXQucHJldjtyZXR1cm4gaS5uZXh0PXQsdC5wcmV2PWksZS5uZXh0PXMscy5wcmV2PWUsbi5uZXh0PWUsZS5wcmV2PW4sci5uZXh0PW4sbi5wcmV2PXIsbn1mdW5jdGlvbiB1bChpLHQsZSxuKXtjb25zdCBzPVhvKGksdCxlKTtyZXR1cm4gbj8ocy5uZXh0PW4ubmV4dCxzLnByZXY9bixuLm5leHQucHJldj1zLG4ubmV4dD1zKToocy5wcmV2PXMscy5uZXh0PXMpLHN9ZnVuY3Rpb24gTGkoaSl7aS5uZXh0LnByZXY9aS5wcmV2LGkucHJldi5uZXh0PWkubmV4dCxpLnByZXZaJiYoaS5wcmV2Wi5uZXh0Wj1pLm5leHRaKSxpLm5leHRaJiYoaS5uZXh0Wi5wcmV2Wj1pLnByZXZaKX1mdW5jdGlvbiBYbyhpLHQsZSl7cmV0dXJue2kseDp0LHk6ZSxwcmV2Om51bGwsbmV4dDpudWxsLHo6MCxwcmV2WjpudWxsLG5leHRaOm51bGwsc3RlaW5lcjohMX19ZnVuY3Rpb24gbGQoaSx0LGUsbil7bGV0IHM9MDtmb3IobGV0IHI9dCxvPWUtbjtyPGU7cis9bilzKz0oaVtvXS1pW3JdKSooaVtyKzFdK2lbbysxXSksbz1yO3JldHVybiBzfWNsYXNzIGhke3N0YXRpYyB0cmlhbmd1bGF0ZSh0LGUsbj0yKXtyZXR1cm4gR2YodCxlLG4pfX1jbGFzcyBRbntzdGF0aWMgYXJlYSh0KXtjb25zdCBlPXQubGVuZ3RoO2xldCBuPTA7Zm9yKGxldCBzPWUtMSxyPTA7cjxlO3M9cisrKW4rPXRbc10ueCp0W3JdLnktdFtyXS54KnRbc10ueTtyZXR1cm4gbiouNX1zdGF0aWMgaXNDbG9ja1dpc2UodCl7cmV0dXJuIFFuLmFyZWEodCk8MH1zdGF0aWMgdHJpYW5ndWxhdGVTaGFwZSh0LGUpe2NvbnN0IG49W10scz1bXSxyPVtdO2ZsKHQpLGRsKG4sdCk7bGV0IG89dC5sZW5ndGg7ZS5mb3JFYWNoKGZsKTtmb3IobGV0IGM9MDtjPGUubGVuZ3RoO2MrKylzLnB1c2gobyksbys9ZVtjXS5sZW5ndGgsZGwobixlW2NdKTtjb25zdCBhPWhkLnRyaWFuZ3VsYXRlKG4scyk7Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKz0zKXIucHVzaChhLnNsaWNlKGMsYyszKSk7cmV0dXJuIHJ9fWZ1bmN0aW9uIGZsKGkpe2NvbnN0IHQ9aS5sZW5ndGg7dD4yJiZpW3QtMV0uZXF1YWxzKGlbMF0pJiZpLnBvcCgpfWZ1bmN0aW9uIGRsKGksdCl7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspaS5wdXNoKHRbZV0ueCksaS5wdXNoKHRbZV0ueSl9Y2xhc3MgWm8gZXh0ZW5kcyBBZXtjb25zdHJ1Y3Rvcih0PTEsZT0xLG49MSxzPTEpe3N1cGVyKCksdGhpcy50eXBlPSJQbGFuZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOnQsaGVpZ2h0OmUsd2lkdGhTZWdtZW50czpuLGhlaWdodFNlZ21lbnRzOnN9O2NvbnN0IHI9dC8yLG89ZS8yLGE9TWF0aC5mbG9vcihuKSxjPU1hdGguZmxvb3IocyksbD1hKzEsaD1jKzEsdT10L2EsZj1lL2MsZD1bXSxwPVtdLHk9W10sZz1bXTtmb3IobGV0IHc9MDt3PGg7dysrKXtjb25zdCBiPXcqZi1vO2ZvcihsZXQgeD0wO3g8bDt4Kyspe2NvbnN0IG09eCp1LXI7cC5wdXNoKG0sLWIsMCkseS5wdXNoKDAsMCwxKSxnLnB1c2goeC9hKSxnLnB1c2goMS13L2MpfX1mb3IobGV0IHc9MDt3PGM7dysrKWZvcihsZXQgYj0wO2I8YTtiKyspe2NvbnN0IHg9YitsKncsbT1iK2wqKHcrMSksTT1iKzErbCoodysxKSxTPWIrMStsKnc7ZC5wdXNoKHgsbSxTKSxkLnB1c2gobSxNLFMpfXRoaXMuc2V0SW5kZXgoZCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgUmUocCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFJlKHksMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFJlKGcsMikpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IFpvKHQud2lkdGgsdC5oZWlnaHQsdC53aWR0aFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMpfX1jb25zdCBwbD1uZXcgUCxMcz1uZXcgUCxLbj1uZXcgUCx0aT1uZXcgUCxXbz1uZXcgUCx1ZD1uZXcgUCxmZD1uZXcgUDtjbGFzcyByZXtjb25zdHJ1Y3Rvcih0PW5ldyBQLGU9bmV3IFApe3RoaXMuc3RhcnQ9dCx0aGlzLmVuZD1lfXNldCh0LGUpe3JldHVybiB0aGlzLnN0YXJ0LmNvcHkodCksdGhpcy5lbmQuY29weShlKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMuc3RhcnQuY29weSh0LnN0YXJ0KSx0aGlzLmVuZC5jb3B5KHQuZW5kKSx0aGlzfWdldENlbnRlcih0KXtyZXR1cm4gdC5hZGRWZWN0b3JzKHRoaXMuc3RhcnQsdGhpcy5lbmQpLm11bHRpcGx5U2NhbGFyKC41KX1kZWx0YSh0KXtyZXR1cm4gdC5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpfWRpc3RhbmNlU3EoKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmVuZCl9ZGlzdGFuY2UoKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvKHRoaXMuZW5kKX1hdCh0LGUpe3JldHVybiB0aGlzLmRlbHRhKGUpLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnN0YXJ0KX1jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKHQsZSl7cGwuc3ViVmVjdG9ycyh0LHRoaXMuc3RhcnQpLExzLnN1YlZlY3RvcnModGhpcy5lbmQsdGhpcy5zdGFydCk7Y29uc3Qgbj1Mcy5kb3QoTHMpO2xldCByPUxzLmRvdChwbCkvbjtyZXR1cm4gZSYmKHI9VyhyLDAsMSkpLHJ9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUsbil7Y29uc3Qgcz10aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIodCxlKTtyZXR1cm4gdGhpcy5kZWx0YShuKS5tdWx0aXBseVNjYWxhcihzKS5hZGQodGhpcy5zdGFydCl9ZGlzdGFuY2VTcVRvTGluZTModCxlPXVkLG49ZmQpe2NvbnN0IHM9MTAwMDAwMDAwMDAwMDAwMDFlLTMyO2xldCByLG87Y29uc3QgYT10aGlzLnN0YXJ0LGM9dC5zdGFydCxsPXRoaXMuZW5kLGg9dC5lbmQ7S24uc3ViVmVjdG9ycyhsLGEpLHRpLnN1YlZlY3RvcnMoaCxjKSxXby5zdWJWZWN0b3JzKGEsYyk7Y29uc3QgdT1Lbi5kb3QoS24pLGY9dGkuZG90KHRpKSxkPXRpLmRvdChXbyk7aWYodTw9cyYmZjw9cylyZXR1cm4gZS5jb3B5KGEpLG4uY29weShjKSxlLnN1YihuKSxlLmRvdChlKTtpZih1PD1zKXI9MCxvPWQvZixvPVcobywwLDEpO2Vsc2V7Y29uc3QgcD1Lbi5kb3QoV28pO2lmKGY8PXMpbz0wLHI9VygtcC91LDAsMSk7ZWxzZXtjb25zdCB5PUtuLmRvdCh0aSksZz11KmYteSp5O2chPT0wP3I9VygoeSpkLXAqZikvZywwLDEpOnI9MCxvPSh5KnIrZCkvZixvPDA/KG89MCxyPVcoLXAvdSwwLDEpKTpvPjEmJihvPTEscj1XKCh5LXApL3UsMCwxKSl9fXJldHVybiBlLmNvcHkoYSkuYWRkKEtuLm11bHRpcGx5U2NhbGFyKHIpKSxuLmNvcHkoYykuYWRkKHRpLm11bHRpcGx5U2NhbGFyKG8pKSxlLnN1YihuKSxlLmRvdChlKX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuc3RhcnQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuZW5kLmFwcGx5TWF0cml4NCh0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5zdGFydC5lcXVhbHModGhpcy5zdGFydCkmJnQuZW5kLmVxdWFscyh0aGlzLmVuZCl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX10eXBlb2YgX19USFJFRV9ERVZUT09MU19fIT0idW5kZWZpbmVkIiYmX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJyZWdpc3RlciIse2RldGFpbDp7cmV2aXNpb246Sn19KSksdHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJih3aW5kb3cuX19USFJFRV9fP3Z0KCJXQVJOSU5HOiBNdWx0aXBsZSBpbnN0YW5jZXMgb2YgVGhyZWUuanMgYmVpbmcgaW1wb3J0ZWQuIik6d2luZG93Ll9fVEhSRUVfXz1KKTtjb25zdCBNbj1uZXcgTWFwLGRkPShpPXt9KT0+KHtnZW5lcmF0ZVRvcFVWKHQsZSxuLHMscil7Y29uc3Qgbz1lW24qM10sYT1lW24qMysxXSxjPWVbcyozXSxsPWVbcyozKzFdLGg9ZVtyKjNdLHU9ZVtyKjMrMV07bGV0IGY7aWYoTW4uaGFzKHQpKWY9TW4uZ2V0KHQpO2Vsc2V7bGV0IGc9aS5ib3gzO2lmKCFnKXtnPW5ldyBndDtjb25zdCB4PXQucGFyYW1ldGVycy5zaGFwZXMuZ2V0UG9pbnRzKCkubWFwKG09PlttLngsbS55LDBdKS5mbGF0KCk7Zy5zZXRGcm9tQXJyYXkoeCl9Y29uc3Qgdz1nLmdldFNpemUobmV3IFApO2kuc3BsaXQmJih3LnkvPWkuc3BsaXQpLGY9e2JveDpnLHNpemU6d30sTW4uc2V0KHQsZil9Y29uc3R7Ym94OmQsc2l6ZTpwfT1mLHk9aS5zcGxpdD8xLWkuc3BsaXQ6MDtyZXR1cm5bbmV3IE4oKG8tZC5taW4ueCkvcC54LChhLWQubWluLnkpL3AueSt5KSxuZXcgTigoYy1kLm1pbi54KS9wLngsKGwtZC5taW4ueSkvcC55K3kpLG5ldyBOKChoLWQubWluLngpL3AueCwodS1kLm1pbi55KS9wLnkreSldfSxnZW5lcmF0ZVNpZGVXYWxsVVYodCxlLG4scyxyLG8pe2NvbnN0IGE9ZVtuKjNdLGM9ZVtuKjMrMV0sbD1lW24qMysyXSxoPWVbcyozXSx1PWVbcyozKzFdLGY9ZVtzKjMrMl0sZD1lW3IqM10scD1lW3IqMysxXSx5PWVbciozKzJdLGc9ZVtvKjNdLHc9ZVtvKjMrMV0sYj1lW28qMysyXTtsZXQgeDtpZihNbi5oYXMoZSkpeD1Nbi5nZXQoZSk7ZWxzZXtjb25zdCBTPW5ldyBndDtTLnNldEZyb21BcnJheShlKTtjb25zdCBBPVMuZ2V0U2l6ZShuZXcgUCk7aS5zcGxpdCYmKEEuei89MS1pLnNwbGl0KSxpLnNpZGVSZXBlYXQmJihBLnovPWkuc2lkZVJlcGVhdCkseD17Ym94OlMsc2l6ZTpBfSxNbi5zZXQoZSx4KX1jb25zdHtib3g6bSxzaXplOk19PXg7cmV0dXJuIE1hdGguYWJzKGMtdSk8TWF0aC5hYnMoYS1oKT9bbmV3IE4oKGEtbS5taW4ueCkvTS54LChsLW0ubWluLnopL00ueiksbmV3IE4oKGgtbS5taW4ueCkvTS54LChmLW0ubWluLnopL00ueiksbmV3IE4oKGQtbS5taW4ueCkvTS54LCh5LW0ubWluLnopL00ueiksbmV3IE4oKGctbS5taW4ueCkvTS54LChiLW0ubWluLnopL00ueildOltuZXcgTigoYy1tLm1pbi55KS9NLnksKGwtbS5taW4ueikvTS56KSxuZXcgTigodS1tLm1pbi55KS9NLnksKGYtbS5taW4ueikvTS56KSxuZXcgTigocC1tLm1pbi55KS9NLnksKHktbS5taW4ueikvTS56KSxuZXcgTigody1tLm1pbi55KS9NLnksKGItbS5taW4ueikvTS56KV19fSkscGQ9KCk9PntNbi5jbGVhcigpfSx5ZD17QXJjQ3VydmU6UWMsQ2F0bXVsbFJvbUN1cnZlMzpLYyxDdWJpY0JlemllckN1cnZlOkRvLEN1YmljQmV6aWVyQ3VydmUzOmVsLEVsbGlwc2VDdXJ2ZTpJcyxMaW5lQ3VydmU6JG8sTGluZUN1cnZlMzpubCxRdWFkcmF0aWNCZXppZXJDdXJ2ZTpWbyxRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6aWwsU3BsaW5lQ3VydmU6VW99O2NsYXNzIGVpIGV4dGVuZHMgQWV7Y29uc3RydWN0b3IodD1uZXcgb2woW25ldyBOKC41LC41KSxuZXcgTigtLjUsLjUpLG5ldyBOKC0uNSwtLjUpLG5ldyBOKC41LC0uNSldKSxlPXt9KXtzdXBlcigpLHRoaXMudHlwZT0iRXh0cnVkZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3NoYXBlczp0LG9wdGlvbnM6ZX0sdD1BcnJheS5pc0FycmF5KHQpP3Q6W3RdO2NvbnN0IG49dGhpcyxzPVtdLHI9W107Zm9yKGxldCBhPTAsYz10Lmxlbmd0aDthPGM7YSsrKXtjb25zdCBsPXRbYV07byhsKX10aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBSZShzLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBSZShyLDIpKSx0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7ZnVuY3Rpb24gbyhhKXt2YXIgS3UsdGYsZWY7Y29uc3QgYz1bXSxsPWUuY3VydmVTZWdtZW50cyE9PXZvaWQgMD9lLmN1cnZlU2VnbWVudHM6MTIsaD1lLnN0ZXBzIT09dm9pZCAwP2Uuc3RlcHM6MSx1PWUuZGVwdGghPT12b2lkIDA/ZS5kZXB0aDoxO2xldCBmPWUuYmV2ZWxFbmFibGVkIT09dm9pZCAwP2UuYmV2ZWxFbmFibGVkOiEwLGQ9ZS5iZXZlbFRoaWNrbmVzcyE9PXZvaWQgMD9lLmJldmVsVGhpY2tuZXNzOi4yLHA9ZS5iZXZlbFNpemUhPT12b2lkIDA/ZS5iZXZlbFNpemU6ZC0uMSx5PWUuYmV2ZWxPZmZzZXQhPT12b2lkIDA/ZS5iZXZlbE9mZnNldDowLGc9ZS5iZXZlbFNlZ21lbnRzIT09dm9pZCAwP2UuYmV2ZWxTZWdtZW50czozO2NvbnN0IHc9ZS5leHRydWRlUGF0aCxiPWUuVVZHZW5lcmF0b3IhPT12b2lkIDA/ZS5VVkdlbmVyYXRvcjptZCx4PShLdT1lLmhhc1RvcCkhPW51bGw/S3U6ITAsbT0odGY9ZS5oYXNCb3R0b20pIT1udWxsP3RmOiEwLE09KGVmPWUuaGFzU2lkZSkhPW51bGw/ZWY6ITA7bGV0IFMsQT0hMSx2LF8sVCx6O3cmJihTPXcuZ2V0U3BhY2VkUG9pbnRzKGgpLEE9ITAsZj0hMSx2PXcuY29tcHV0ZUZyZW5ldEZyYW1lcyhoLCExKSxfPW5ldyBQLFQ9bmV3IFAsej1uZXcgUCksZnx8KGc9MCxkPTAscD0wLHk9MCk7Y29uc3QgQz1hLmV4dHJhY3RQb2ludHMobCk7bGV0IEI9Qy5zaGFwZTtjb25zdCBGPUMuaG9sZXM7aWYoIVFuLmlzQ2xvY2tXaXNlKEIpKXtCPUIucmV2ZXJzZSgpO2ZvcihsZXQgaz0wLEw9Ri5sZW5ndGg7azxMO2srKyl7Y29uc3QgTz1GW2tdO1FuLmlzQ2xvY2tXaXNlKE8pJiYoRltrXT1PLnJldmVyc2UoKSl9fWZ1bmN0aW9uIEkoayl7Y29uc3QgTz0xMDAwMDAwMDAwMDAwMDAwMWUtMzY7bGV0ICQ9a1swXTtmb3IobGV0IEQ9MTtEPD1rLmxlbmd0aDtEKyspe2NvbnN0IFk9RCVrLmxlbmd0aCxHPWtbWV0saXQ9Ry54LSQueCxsdD1HLnktJC55LHd0PWl0Kml0K2x0Kmx0LGVlPU1hdGgubWF4KE1hdGguYWJzKEcueCksTWF0aC5hYnMoRy55KSxNYXRoLmFicygkLngpLE1hdGguYWJzKCQueSkpLExuPU8qZWUqZWU7aWYod3Q8PUxuKXtrLnNwbGljZShZLDEpLEQtLTtjb250aW51ZX0kPUd9fUkoQiksRi5mb3JFYWNoKEkpO2NvbnN0IFI9Ri5sZW5ndGgsVj1CO2ZvcihsZXQgaz0wO2s8UjtrKyspe2NvbnN0IEw9RltrXTtCPUIuY29uY2F0KEwpfWZ1bmN0aW9uIFUoayxMLE8pe3JldHVybiBMfHxlcnJvcigiRXh0cnVkZUdlb21ldHJ5OiB2ZWMgZG9lcyBub3QgZXhpc3QiKSxrLmNsb25lKCkuYWRkU2NhbGVkVmVjdG9yKEwsTyl9Y29uc3QgSz1CLmxlbmd0aDtmdW5jdGlvbiBjdChrLEwsTyl7bGV0ICQsRCxZO2NvbnN0IEc9ay54LUwueCxpdD1rLnktTC55LGx0PU8ueC1rLngsd3Q9Ty55LWsueSxlZT1HKkcraXQqaXQsTG49Ryp3dC1pdCpsdDtpZihNYXRoLmFicyhMbik+TnVtYmVyLkVQU0lMT04pe2NvbnN0IG5lPU1hdGguc3FydChlZSksbmY9TWF0aC5zcXJ0KGx0Kmx0K3d0Knd0KSxzZj1MLngtaXQvbmUscmY9TC55K0cvbmUsJGc9Ty54LXd0L25mLFZnPU8ueStsdC9uZixvZj0oKCRnLXNmKSp3dC0oVmctcmYpKmx0KS8oRyp3dC1pdCpsdCk7JD1zZitHKm9mLWsueCxEPXJmK2l0Km9mLWsueTtjb25zdCBhZj0kKiQrRCpEO2lmKGFmPD0yKXJldHVybiBuZXcgTigkLEQpO1k9TWF0aC5zcXJ0KGFmLzIpfWVsc2V7bGV0IG5lPSExO0c+TnVtYmVyLkVQU0lMT04/bHQ+TnVtYmVyLkVQU0lMT04mJihuZT0hMCk6RzwtTnVtYmVyLkVQU0lMT04/bHQ8LU51bWJlci5FUFNJTE9OJiYobmU9ITApOk1hdGguc2lnbihpdCk9PT1NYXRoLnNpZ24od3QpJiYobmU9ITApLG5lPygkPS1pdCxEPUcsWT1NYXRoLnNxcnQoZWUpKTooJD1HLEQ9aXQsWT1NYXRoLnNxcnQoZWUvMikpfXJldHVybiBuZXcgTigkL1ksRC9ZKX1jb25zdCBGdD1bXTtmb3IobGV0IGs9MCxMPVYubGVuZ3RoLE89TC0xLCQ9aysxO2s8TDtrKyssTysrLCQrKylPPT09TCYmKE89MCksJD09PUwmJigkPTApLEZ0W2tdPWN0KFZba10sVltPXSxWWyRdKTtjb25zdCBJdD1bXTtsZXQgR3QsU3Q9RnQuY29uY2F0KCk7Zm9yKGxldCBrPTAsTD1SO2s8TDtrKyspe2NvbnN0IE89RltrXTtHdD1bXTtmb3IobGV0ICQ9MCxEPU8ubGVuZ3RoLFk9RC0xLEc9JCsxOyQ8RDskKyssWSsrLEcrKylZPT09RCYmKFk9MCksRz09PUQmJihHPTApLEd0WyRdPWN0KE9bJF0sT1tZXSxPW0ddKTtJdC5wdXNoKEd0KSxTdD1TdC5jb25jYXQoR3QpfWxldCBZZTtpZihnPT09MClZZT1Rbi50cmlhbmd1bGF0ZVNoYXBlKFYsRik7ZWxzZXtjb25zdCBrPVtdLEw9W107Zm9yKGxldCBPPTA7TzxnO08rKyl7Y29uc3QgJD1PL2csRD1kKk1hdGguY29zKCQqTWF0aC5QSS8yKSxZPXAqTWF0aC5zaW4oJCpNYXRoLlBJLzIpK3k7Zm9yKGxldCBHPTAsaXQ9Vi5sZW5ndGg7RzxpdDtHKyspe2NvbnN0IGx0PVUoVltHXSxGdFtHXSxZKTt0ZShsdC54LGx0LnksLUQpLCQ9PT0wJiZrLnB1c2gobHQpfWZvcihsZXQgRz0wLGl0PVI7RzxpdDtHKyspe2NvbnN0IGx0PUZbR107R3Q9SXRbR107Y29uc3Qgd3Q9W107Zm9yKGxldCBlZT0wLExuPWx0Lmxlbmd0aDtlZTxMbjtlZSsrKXtjb25zdCBuZT1VKGx0W2VlXSxHdFtlZV0sWSk7dGUobmUueCxuZS55LC1EKSwkPT09MCYmd3QucHVzaChuZSl9JD09PTAmJkwucHVzaCh3dCl9fVllPVFuLnRyaWFuZ3VsYXRlU2hhcGUoayxMKX1jb25zdCBTaT1ZZS5sZW5ndGgsc289cCt5O2ZvcihsZXQgaz0wO2s8SztrKyspe2NvbnN0IEw9Zj9VKEJba10sU3Rba10sc28pOkJba107QT8oVC5jb3B5KHYubm9ybWFsc1swXSkubXVsdGlwbHlTY2FsYXIoTC54KSxfLmNvcHkodi5iaW5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKEwueSksei5jb3B5KFNbMF0pLmFkZChUKS5hZGQoXyksdGUoei54LHoueSx6LnopKTp0ZShMLngsTC55LDApfWZvcihsZXQgaz0xO2s8PWg7aysrKWZvcihsZXQgTD0wO0w8SztMKyspe2NvbnN0IE89Zj9VKEJbTF0sU3RbTF0sc28pOkJbTF07QT8oVC5jb3B5KHYubm9ybWFsc1trXSkubXVsdGlwbHlTY2FsYXIoTy54KSxfLmNvcHkodi5iaW5vcm1hbHNba10pLm11bHRpcGx5U2NhbGFyKE8ueSksei5jb3B5KFNba10pLmFkZChUKS5hZGQoXyksdGUoei54LHoueSx6LnopKTp0ZShPLngsTy55LHUvaCprKX1mb3IobGV0IGs9Zy0xO2s+PTA7ay0tKXtjb25zdCBMPWsvZyxPPWQqTWF0aC5jb3MoTCpNYXRoLlBJLzIpLCQ9cCpNYXRoLnNpbihMKk1hdGguUEkvMikreTtmb3IobGV0IEQ9MCxZPVYubGVuZ3RoO0Q8WTtEKyspe2NvbnN0IEc9VShWW0RdLEZ0W0RdLCQpO3RlKEcueCxHLnksdStPKX1mb3IobGV0IEQ9MCxZPUYubGVuZ3RoO0Q8WTtEKyspe2NvbnN0IEc9RltEXTtHdD1JdFtEXTtmb3IobGV0IGl0PTAsbHQ9Ry5sZW5ndGg7aXQ8bHQ7aXQrKyl7Y29uc3Qgd3Q9VShHW2l0XSxHdFtpdF0sJCk7QT90ZSh3dC54LHd0LnkrU1toLTFdLnksU1toLTFdLngrTyk6dGUod3QueCx3dC55LHUrTyl9fX16YygpLE0mJlRjKCk7ZnVuY3Rpb24gemMoKXtjb25zdCBrPXMubGVuZ3RoLzM7aWYoZil7bGV0IEw9MCxPPUsqTDtpZihtKWZvcihsZXQgJD0wOyQ8U2k7JCsrKXtjb25zdCBEPVllWyRdO29vKERbMl0rTyxEWzFdK08sRFswXStPKX1pZihMPWgrZyoyLE89SypMLHgpZm9yKGxldCAkPTA7JDxTaTskKyspe2NvbnN0IEQ9WWVbJF07b28oRFswXStPLERbMV0rTyxEWzJdK08pfX1lbHNle2lmKG0pZm9yKGxldCBMPTA7TDxTaTtMKyspe2NvbnN0IE89WWVbTF07b28oT1syXSxPWzFdLE9bMF0pfWlmKHgpZm9yKGxldCBMPTA7TDxTaTtMKyspe2NvbnN0IE89WWVbTF07b28oT1swXStLKmgsT1sxXStLKmgsT1syXStLKmgpfX1uLmFkZEdyb3VwKGsscy5sZW5ndGgvMy1rLDApfWZ1bmN0aW9uIFRjKCl7Y29uc3Qgaz1zLmxlbmd0aC8zO2xldCBMPTA7cm8oVixMKSxMKz1WLmxlbmd0aDtmb3IobGV0IE89MCwkPUYubGVuZ3RoO088JDtPKyspe2NvbnN0IEQ9RltPXTtybyhELEwpLEwrPUQubGVuZ3RofW4uYWRkR3JvdXAoayxzLmxlbmd0aC8zLWssMSl9ZnVuY3Rpb24gcm8oayxMKXtsZXQgTz1rLmxlbmd0aDtmb3IoOy0tTz49MDspe2NvbnN0ICQ9TztsZXQgRD1PLTE7RDwwJiYoRD1rLmxlbmd0aC0xKTtmb3IobGV0IFk9MCxHPWgrZyoyO1k8RztZKyspe2NvbnN0IGl0PUsqWSxsdD1LKihZKzEpLHd0PUwrJCtpdCxlZT1MK0QraXQsTG49TCtEK2x0LG5lPUwrJCtsdDtEZyh3dCxlZSxMbixuZSl9fX1mdW5jdGlvbiB0ZShrLEwsTyl7Yy5wdXNoKGspLGMucHVzaChMKSxjLnB1c2goTyl9ZnVuY3Rpb24gb28oayxMLE8pe2plKGspLGplKEwpLGplKE8pO2NvbnN0ICQ9cy5sZW5ndGgvMyxEPWIuZ2VuZXJhdGVUb3BVVihuLHMsJC0zLCQtMiwkLTEpO1FlKERbMF0pLFFlKERbMV0pLFFlKERbMl0pfWZ1bmN0aW9uIERnKGssTCxPLCQpe2plKGspLGplKEwpLGplKCQpLGplKEwpLGplKE8pLGplKCQpO2NvbnN0IEQ9cy5sZW5ndGgvMyxZPWIuZ2VuZXJhdGVTaWRlV2FsbFVWKG4scyxELTYsRC0zLEQtMixELTEpO1FlKFlbMF0pLFFlKFlbMV0pLFFlKFlbM10pLFFlKFlbMV0pLFFlKFlbMl0pLFFlKFlbM10pfWZ1bmN0aW9uIGplKGspe3MucHVzaChjW2sqMyswXSkscy5wdXNoKGNbayozKzFdKSxzLnB1c2goY1trKjMrMl0pfWZ1bmN0aW9uIFFlKGspe3IucHVzaChrLngpLHIucHVzaChrLnkpfX19Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtZXRlcnMpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKSxlPXRoaXMucGFyYW1ldGVycy5zaGFwZXMsbj10aGlzLnBhcmFtZXRlcnMub3B0aW9ucztyZXR1cm4gZ2QoZSxuLHQpfXN0YXRpYyBmcm9tSlNPTih0LGUpe2NvbnN0IG49W107Zm9yKGxldCByPTAsbz10LnNoYXBlcy5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT1lW3Quc2hhcGVzW3JdXTtuLnB1c2goYSl9Y29uc3Qgcz10Lm9wdGlvbnMuZXh0cnVkZVBhdGg7cmV0dXJuIHMhPT12b2lkIDAmJih0Lm9wdGlvbnMuZXh0cnVkZVBhdGg9bmV3IHlkW3MudHlwZV0oKS5mcm9tSlNPTihzKSksbmV3IGVpKG4sdC5vcHRpb25zKX19Y29uc3QgbWQ9e2dlbmVyYXRlVG9wVVY6ZnVuY3Rpb24oaSx0LGUsbixzKXtjb25zdCByPXRbZSozXSxvPXRbZSozKzFdLGE9dFtuKjNdLGM9dFtuKjMrMV0sbD10W3MqM10saD10W3MqMysxXTtyZXR1cm5bbmV3IE4ocixvKSxuZXcgTihhLGMpLG5ldyBOKGwsaCldfSxnZW5lcmF0ZVNpZGVXYWxsVVY6ZnVuY3Rpb24oaSx0LGUsbixzLHIpe2NvbnN0IG89dFtlKjNdLGE9dFtlKjMrMV0sYz10W2UqMysyXSxsPXRbbiozXSxoPXRbbiozKzFdLHU9dFtuKjMrMl0sZj10W3MqM10sZD10W3MqMysxXSxwPXRbcyozKzJdLHk9dFtyKjNdLGc9dFtyKjMrMV0sdz10W3IqMysyXTtyZXR1cm4gTWF0aC5hYnMoYS1oKTxNYXRoLmFicyhvLWwpP1tuZXcgTihvLDEtYyksbmV3IE4obCwxLXUpLG5ldyBOKGYsMS1wKSxuZXcgTih5LDEtdyldOltuZXcgTihhLDEtYyksbmV3IE4oaCwxLXUpLG5ldyBOKGQsMS1wKSxuZXcgTihnLDEtdyldfX07ZnVuY3Rpb24gZ2QoaSx0LGUpe2lmKGUuc2hhcGVzPVtdLEFycmF5LmlzQXJyYXkoaSkpZm9yKGxldCBuPTAscz1pLmxlbmd0aDtuPHM7bisrKXtjb25zdCByPWlbbl07ZS5zaGFwZXMucHVzaChyLnV1aWQpfWVsc2UgZS5zaGFwZXMucHVzaChpLnV1aWQpO3JldHVybiBlLm9wdGlvbnM9T2JqZWN0LmFzc2lnbih7fSx0KSx0LmV4dHJ1ZGVQYXRoIT09dm9pZCAwJiYoZS5vcHRpb25zLmV4dHJ1ZGVQYXRoPXQuZXh0cnVkZVBhdGgudG9KU09OKCkpLGV9Y29uc3QgeWw9MCx4ZD0xLHdkPTIsbWw9MixHbz0xLjI1LGdsPTEsTnQ9Nio0KzQrNCxNdD1OdC80LHhsPTY1NTM1LGJkPU1hdGgucG93KDIsLTI0KSxIbz1TeW1ib2woIlNLSVBfR0VORVJBVElPTiIpO2Z1bmN0aW9uIE1kKGkpe3JldHVybiBpLmluZGV4P2kuaW5kZXguY291bnQ6aS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50fWZ1bmN0aW9uIEFuKGkpe3JldHVybiBNZChpKS8zfWZ1bmN0aW9uIEFkKGksdD1BcnJheUJ1ZmZlcil7cmV0dXJuIGk+NjU1MzU/bmV3IFVpbnQzMkFycmF5KG5ldyB0KDQqaSkpOm5ldyBVaW50MTZBcnJheShuZXcgdCgyKmkpKX1mdW5jdGlvbiBTZChpLHQpe2lmKCFpLmluZGV4KXtjb25zdCBlPWkuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudCxuPXQudXNlU2hhcmVkQXJyYXlCdWZmZXI/U2hhcmVkQXJyYXlCdWZmZXI6QXJyYXlCdWZmZXIscz1BZChlLG4pO2kuc2V0SW5kZXgobmV3IHh0KHMsMSkpO2ZvcihsZXQgcj0wO3I8ZTtyKyspc1tyXT1yfX1mdW5jdGlvbiB3bChpLHQpe2NvbnN0IGU9QW4oaSksbj10fHxpLmRyYXdSYW5nZSxzPW4uc3RhcnQvMyxyPShuLnN0YXJ0K24uY291bnQpLzMsbz1NYXRoLm1heCgwLHMpLGE9TWF0aC5taW4oZSxyKS1vO3JldHVyblt7b2Zmc2V0Ok1hdGguZmxvb3IobyksY291bnQ6TWF0aC5mbG9vcihhKX1dfWZ1bmN0aW9uIGJsKGksdCl7aWYoIWkuZ3JvdXBzfHwhaS5ncm91cHMubGVuZ3RoKXJldHVybiB3bChpLHQpO2NvbnN0IGU9W10sbj10fHxpLmRyYXdSYW5nZSxzPW4uc3RhcnQvMyxyPShuLnN0YXJ0K24uY291bnQpLzMsbz1BbihpKSxhPVtdO2Zvcihjb25zdCBoIG9mIGkuZ3JvdXBzKXtjb25zdHtzdGFydDp1LGNvdW50OmZ9PWgsZD11LzMscD1pc0Zpbml0ZShmKT9mOm8qMy11LHk9KHUrcCkvMztkPHImJnk+cyYmKGEucHVzaCh7cG9zOk1hdGgubWF4KHMsZCksaXNTdGFydDohMH0pLGEucHVzaCh7cG9zOk1hdGgubWluKHIseSksaXNTdGFydDohMX0pKX1hLnNvcnQoKGgsdSk9PmgucG9zIT09dS5wb3M/aC5wb3MtdS5wb3M6aC50eXBlPT09ImVuZCI/LTE6MSk7bGV0IGM9MCxsPW51bGw7Zm9yKGNvbnN0IGggb2YgYSl7Y29uc3QgdT1oLnBvcztjIT09MCYmdSE9PWwmJmUucHVzaCh7b2Zmc2V0OmwsY291bnQ6dS1sfSksYys9aC5pc1N0YXJ0PzE6LTEsbD11fXJldHVybiBlfWZ1bmN0aW9uIEpvKGksdCxlLG4scyl7bGV0IHI9MS8wLG89MS8wLGE9MS8wLGM9LTEvMCxsPS0xLzAsaD0tMS8wLHU9MS8wLGY9MS8wLGQ9MS8wLHA9LTEvMCx5PS0xLzAsZz0tMS8wO2NvbnN0IHc9aS5vZmZzZXR8fDA7Zm9yKGxldCBiPSh0LXcpKjYseD0odCtlLXcpKjY7Yjx4O2IrPTYpe2NvbnN0IG09aVtiKzBdLE09aVtiKzFdLFM9bS1NLEE9bStNO1M8ciYmKHI9UyksQT5jJiYoYz1BKSxtPHUmJih1PW0pLG0+cCYmKHA9bSk7Y29uc3Qgdj1pW2IrMl0sXz1pW2IrM10sVD12LV8sej12K187VDxvJiYobz1UKSx6PmwmJihsPXopLHY8ZiYmKGY9diksdj55JiYoeT12KTtjb25zdCBDPWlbYis0XSxCPWlbYis1XSxGPUMtQixFPUMrQjtGPGEmJihhPUYpLEU+aCYmKGg9RSksQzxkJiYoZD1DKSxDPmcmJihnPUMpfW5bMF09cixuWzFdPW8sblsyXT1hLG5bM109YyxuWzRdPWwsbls1XT1oLHNbMF09dSxzWzFdPWYsc1syXT1kLHNbM109cCxzWzRdPXksc1s1XT1nfWZ1bmN0aW9uIE1sKGksdCxlPW51bGwsbj1udWxsLHM9bnVsbCl7Y29uc3Qgcj1pLmF0dHJpYnV0ZXMucG9zaXRpb24sbz1pLmluZGV4P2kuaW5kZXguYXJyYXk6bnVsbCxhPXIubm9ybWFsaXplZDtpZihzPT09bnVsbClzPW5ldyBGbG9hdDMyQXJyYXkoZSo2KSxzLm9mZnNldD10O2Vsc2UgaWYodDwwfHxlK3Q+cy5sZW5ndGgvNil0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IGNvbXB1dGUgdHJpYW5nbGUgYm91bmRzIHJhbmdlIGlzIGludmFsaWQuIik7Y29uc3QgYz1yLmFycmF5LGw9ci5vZmZzZXR8fDA7bGV0IGg9MztyLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihoPXIuZGF0YS5zdHJpZGUpO2NvbnN0IHU9WyJnZXRYIiwiZ2V0WSIsImdldFoiXSxmPXMub2Zmc2V0O2ZvcihsZXQgZD10LHA9dCtlO2Q8cDtkKyspe2NvbnN0IGc9KG4/bltkXTpkKSozLHc9KGQtZikqNjtsZXQgYj1nKzAseD1nKzEsbT1nKzI7byYmKGI9b1tiXSx4PW9beF0sbT1vW21dKSxhfHwoYj1iKmgrbCx4PXgqaCtsLG09bSpoK2wpO2ZvcihsZXQgTT0wO008MztNKyspe2xldCBTLEEsdjthPyhTPXJbdVtNXV0oYiksQT1yW3VbTV1dKHgpLHY9clt1W01dXShtKSk6KFM9Y1tiK01dLEE9Y1t4K01dLHY9Y1ttK01dKTtsZXQgXz1TO0E8XyYmKF89QSksdjxfJiYoXz12KTtsZXQgVD1TO0E+VCYmKFQ9QSksdj5UJiYoVD12KTtjb25zdCB6PShULV8pLzIsQz1NKjI7c1t3K0MrMF09Xyt6LHNbdytDKzFdPXorKE1hdGguYWJzKF8pK3opKmJkfX1yZXR1cm4gc31mdW5jdGlvbiBodChpLHQsZSl7cmV0dXJuIGUubWluLng9dFtpXSxlLm1pbi55PXRbaSsxXSxlLm1pbi56PXRbaSsyXSxlLm1heC54PXRbaSszXSxlLm1heC55PXRbaSs0XSxlLm1heC56PXRbaSs1XSxlfWZ1bmN0aW9uIEFsKGkpe2xldCB0PS0xLGU9LTEvMDtmb3IobGV0IG49MDtuPDM7bisrKXtjb25zdCBzPWlbbiszXS1pW25dO3M+ZSYmKGU9cyx0PW4pfXJldHVybiB0fWZ1bmN0aW9uIFNsKGksdCl7dC5zZXQoaSl9ZnVuY3Rpb24gdmwoaSx0LGUpe2xldCBuLHM7Zm9yKGxldCByPTA7cjwzO3IrKyl7Y29uc3Qgbz1yKzM7bj1pW3JdLHM9dFtyXSxlW3JdPW48cz9uOnMsbj1pW29dLHM9dFtvXSxlW29dPW4+cz9uOnN9fWZ1bmN0aW9uIE9zKGksdCxlKXtmb3IobGV0IG49MDtuPDM7bisrKXtjb25zdCBzPXRbaSsyKm5dLHI9dFtpKzIqbisxXSxvPXMtcixhPXMrcjtvPGVbbl0mJihlW25dPW8pLGE+ZVtuKzNdJiYoZVtuKzNdPWEpfX1mdW5jdGlvbiBPaShpKXtjb25zdCB0PWlbM10taVswXSxlPWlbNF0taVsxXSxuPWlbNV0taVsyXTtyZXR1cm4gMioodCplK2UqbituKnQpfWNvbnN0IExlPTMyLHZkPShpLHQpPT5pLmNhbmRpZGF0ZS10LmNhbmRpZGF0ZSxvbj1uZXcgQXJyYXkoTGUpLmZpbGwoKS5tYXAoKCk9Pih7Y291bnQ6MCxib3VuZHM6bmV3IEZsb2F0MzJBcnJheSg2KSxyaWdodENhY2hlQm91bmRzOm5ldyBGbG9hdDMyQXJyYXkoNiksbGVmdENhY2hlQm91bmRzOm5ldyBGbG9hdDMyQXJyYXkoNiksY2FuZGlkYXRlOjB9KSksRHM9bmV3IEZsb2F0MzJBcnJheSg2KTtmdW5jdGlvbiBfZChpLHQsZSxuLHMscil7bGV0IG89LTEsYT0wO2lmKHI9PT15bClvPUFsKHQpLG8hPT0tMSYmKGE9KHRbb10rdFtvKzNdKS8yKTtlbHNlIGlmKHI9PT14ZClvPUFsKGkpLG8hPT0tMSYmKGE9emQoZSxuLHMsbykpO2Vsc2UgaWYocj09PXdkKXtjb25zdCBjPU9pKGkpO2xldCBsPUdvKnM7Y29uc3QgaD1lLm9mZnNldHx8MCx1PShuLWgpKjYsZj0obitzLWgpKjY7Zm9yKGxldCBkPTA7ZDwzO2QrKyl7Y29uc3QgcD10W2RdLHc9KHRbZCszXS1wKS9MZTtpZihzPExlLzQpe2NvbnN0IGI9Wy4uLm9uXTtiLmxlbmd0aD1zO2xldCB4PTA7Zm9yKGxldCBNPXU7TTxmO00rPTYseCsrKXtjb25zdCBTPWJbeF07Uy5jYW5kaWRhdGU9ZVtNKzIqZF0sUy5jb3VudD0wO2NvbnN0e2JvdW5kczpBLGxlZnRDYWNoZUJvdW5kczp2LHJpZ2h0Q2FjaGVCb3VuZHM6X309Uztmb3IobGV0IFQ9MDtUPDM7VCsrKV9bVF09MS8wLF9bVCszXT0tMS8wLHZbVF09MS8wLHZbVCszXT0tMS8wLEFbVF09MS8wLEFbVCszXT0tMS8wO09zKE0sZSxBKX1iLnNvcnQodmQpO2xldCBtPXM7Zm9yKGxldCBNPTA7TTxtO00rKyl7Y29uc3QgUz1iW01dO2Zvcig7TSsxPG0mJmJbTSsxXS5jYW5kaWRhdGU9PT1TLmNhbmRpZGF0ZTspYi5zcGxpY2UoTSsxLDEpLG0tLX1mb3IobGV0IE09dTtNPGY7TSs9Nil7Y29uc3QgUz1lW00rMipkXTtmb3IobGV0IEE9MDtBPG07QSsrKXtjb25zdCB2PWJbQV07Uz49di5jYW5kaWRhdGU/T3MoTSxlLHYucmlnaHRDYWNoZUJvdW5kcyk6KE9zKE0sZSx2LmxlZnRDYWNoZUJvdW5kcyksdi5jb3VudCsrKX19Zm9yKGxldCBNPTA7TTxtO00rKyl7Y29uc3QgUz1iW01dLEE9Uy5jb3VudCx2PXMtUy5jb3VudCxfPVMubGVmdENhY2hlQm91bmRzLFQ9Uy5yaWdodENhY2hlQm91bmRzO2xldCB6PTA7QSE9PTAmJih6PU9pKF8pL2MpO2xldCBDPTA7diE9PTAmJihDPU9pKFQpL2MpO2NvbnN0IEI9Z2wrR28qKHoqQStDKnYpO0I8bCYmKG89ZCxsPUIsYT1TLmNhbmRpZGF0ZSl9fWVsc2V7Zm9yKGxldCBtPTA7bTxMZTttKyspe2NvbnN0IE09b25bbV07TS5jb3VudD0wLE0uY2FuZGlkYXRlPXArdyttKnc7Y29uc3QgUz1NLmJvdW5kcztmb3IobGV0IEE9MDtBPDM7QSsrKVNbQV09MS8wLFNbQSszXT0tMS8wfWZvcihsZXQgbT11O208ZjttKz02KXtsZXQgQT1+figoZVttKzIqZF0tcCkvdyk7QT49TGUmJihBPUxlLTEpO2NvbnN0IHY9b25bQV07di5jb3VudCsrLE9zKG0sZSx2LmJvdW5kcyl9Y29uc3QgYj1vbltMZS0xXTtTbChiLmJvdW5kcyxiLnJpZ2h0Q2FjaGVCb3VuZHMpO2ZvcihsZXQgbT1MZS0yO20+PTA7bS0tKXtjb25zdCBNPW9uW21dLFM9b25bbSsxXTt2bChNLmJvdW5kcyxTLnJpZ2h0Q2FjaGVCb3VuZHMsTS5yaWdodENhY2hlQm91bmRzKX1sZXQgeD0wO2ZvcihsZXQgbT0wO208TGUtMTttKyspe2NvbnN0IE09b25bbV0sUz1NLmNvdW50LEE9TS5ib3VuZHMsXz1vblttKzFdLnJpZ2h0Q2FjaGVCb3VuZHM7UyE9PTAmJih4PT09MD9TbChBLERzKTp2bChBLERzLERzKSkseCs9UztsZXQgVD0wLHo9MDt4IT09MCYmKFQ9T2koRHMpL2MpO2NvbnN0IEM9cy14O0MhPT0wJiYoej1PaShfKS9jKTtjb25zdCBCPWdsK0dvKihUKngreipDKTtCPGwmJihvPWQsbD1CLGE9TS5jYW5kaWRhdGUpfX19fWVsc2UgY29uc29sZS53YXJuKGBNZXNoQlZIOiBJbnZhbGlkIGJ1aWxkIHN0cmF0ZWd5IHZhbHVlICR7cn0gdXNlZC5gKTtyZXR1cm57YXhpczpvLHBvczphfX1mdW5jdGlvbiB6ZChpLHQsZSxuKXtsZXQgcz0wO2NvbnN0IHI9aS5vZmZzZXQ7Zm9yKGxldCBvPXQsYT10K2U7bzxhO28rKylzKz1pWyhvLXIpKjYrbioyXTtyZXR1cm4gcy9lfWNsYXNzIFlve2NvbnN0cnVjdG9yKCl7dGhpcy5ib3VuZGluZ0RhdGE9bmV3IEZsb2F0MzJBcnJheSg2KX19ZnVuY3Rpb24gVGQoaSx0LGUsbixzLHIpe2xldCBvPW4sYT1uK3MtMTtjb25zdCBjPXIucG9zLGw9ci5heGlzKjIsaD1lLm9mZnNldHx8MDtmb3IoOzspe2Zvcig7bzw9YSYmZVsoby1oKSo2K2xdPGM7KW8rKztmb3IoO288PWEmJmVbKGEtaCkqNitsXT49YzspYS0tO2lmKG88YSl7Zm9yKGxldCB1PTA7dTwzO3UrKyl7bGV0IGY9dFtvKjMrdV07dFtvKjMrdV09dFthKjMrdV0sdFthKjMrdV09Zn1mb3IobGV0IHU9MDt1PDY7dSsrKXtjb25zdCBmPW8taCxkPWEtaCxwPWVbZio2K3VdO2VbZio2K3VdPWVbZCo2K3VdLGVbZCo2K3VdPXB9bysrLGEtLX1lbHNlIHJldHVybiBvfX1mdW5jdGlvbiBQZChpLHQsZSxuLHMscil7bGV0IG89bixhPW4rcy0xO2NvbnN0IGM9ci5wb3MsbD1yLmF4aXMqMixoPWUub2Zmc2V0fHwwO2Zvcig7Oyl7Zm9yKDtvPD1hJiZlWyhvLWgpKjYrbF08YzspbysrO2Zvcig7bzw9YSYmZVsoYS1oKSo2K2xdPj1jOylhLS07aWYobzxhKXtsZXQgdT1pW29dO2lbb109aVthXSxpW2FdPXU7Zm9yKGxldCBmPTA7Zjw2O2YrKyl7Y29uc3QgZD1vLWgscD1hLWgseT1lW2QqNitmXTtlW2QqNitmXT1lW3AqNitmXSxlW3AqNitmXT15fW8rKyxhLS19ZWxzZSByZXR1cm4gb319bGV0IF9sLCRzLGpvLHpsO2NvbnN0IENkPU1hdGgucG93KDIsMzIpO2Z1bmN0aW9uIFFvKGkpe3JldHVybiJjb3VudCJpbiBpPzE6MStRbyhpLmxlZnQpK1FvKGkucmlnaHQpfWZ1bmN0aW9uIEJkKGksdCxlKXtyZXR1cm4gX2w9bmV3IEZsb2F0MzJBcnJheShlKSwkcz1uZXcgVWludDMyQXJyYXkoZSksam89bmV3IFVpbnQxNkFycmF5KGUpLHpsPW5ldyBVaW50OEFycmF5KGUpLEtvKGksdCl9ZnVuY3Rpb24gS28oaSx0KXtjb25zdCBlPWkvNCxuPWkvMixzPSJjb3VudCJpbiB0LHI9dC5ib3VuZGluZ0RhdGE7Zm9yKGxldCBvPTA7bzw2O28rKylfbFtlK29dPXJbb107aWYocylyZXR1cm4gdC5idWZmZXI/KHpsLnNldChuZXcgVWludDhBcnJheSh0LmJ1ZmZlciksaSksaSt0LmJ1ZmZlci5ieXRlTGVuZ3RoKTooJHNbZSs2XT10Lm9mZnNldCxqb1tuKzE0XT10LmNvdW50LGpvW24rMTVdPXhsLGkrTnQpO3tjb25zdHtsZWZ0Om8scmlnaHQ6YSxzcGxpdEF4aXM6Y309dCxsPWkrTnQ7bGV0IGg9S28obCxvKTtjb25zdCB1PWkvTnQsZD1oL050LXU7aWYoZD5DZCl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IENhbm5vdCBzdG9yZSByZWxhdGl2ZSBjaGlsZCBub2RlIG9mZnNldCBncmVhdGVyIHRoYW4gMzIgYml0cy4iKTtyZXR1cm4gJHNbZSs2XT1kLCRzW2UrN109YyxLbyhoLGEpfX1mdW5jdGlvbiBFZChpLHQsZSl7Y29uc3Qgcz0oaS5pbmRleD9pLmluZGV4LmNvdW50OmkuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudCkvMz52aSgyLDE2KSxyPWUucmVkdWNlKChoLHUpPT5oK3UuY291bnQsMCksbz1zPzQ6MixhPXQ/bmV3IFNoYXJlZEFycmF5QnVmZmVyKHIqbyk6bmV3IEFycmF5QnVmZmVyKHIqbyksYz1zP25ldyBVaW50MzJBcnJheShhKTpuZXcgVWludDE2QXJyYXkoYSk7bGV0IGw9MDtmb3IobGV0IGg9MDtoPGUubGVuZ3RoO2grKyl7Y29uc3R7b2Zmc2V0OnUsY291bnQ6Zn09ZVtoXTtmb3IobGV0IGQ9MDtkPGY7ZCsrKWNbbCtkXT11K2Q7bCs9Zn1yZXR1cm4gY31mdW5jdGlvbiBGZChpLHQsZSxuLHMpe2NvbnN0e21heERlcHRoOnIsdmVyYm9zZTpvLG1heExlYWZUcmlzOmEsc3RyYXRlZ3k6YyxvblByb2dyZXNzOmwsaW5kaXJlY3Q6aH09cyx1PWkuX2luZGlyZWN0QnVmZmVyLGY9aS5nZW9tZXRyeSxkPWYuaW5kZXg/Zi5pbmRleC5hcnJheTpudWxsLHA9aD9QZDpUZCx5PUFuKGYpLGc9bmV3IEZsb2F0MzJBcnJheSg2KTtsZXQgdz0hMTtjb25zdCBiPW5ldyBZbztyZXR1cm4gSm8odCxlLG4sYi5ib3VuZGluZ0RhdGEsZyksbShiLGUsbixnKSxiO2Z1bmN0aW9uIHgoTSl7bCYmbChNL3kpfWZ1bmN0aW9uIG0oTSxTLEEsdj1udWxsLF89MCl7aWYoIXcmJl8+PXImJih3PSEwLG8mJihjb25zb2xlLndhcm4oYE1lc2hCVkg6IE1heCBkZXB0aCBvZiAke3J9IHJlYWNoZWQgd2hlbiBnZW5lcmF0aW5nIEJWSC4gQ29uc2lkZXIgaW5jcmVhc2luZyBtYXhEZXB0aC5gKSxjb25zb2xlLndhcm4oZikpKSxBPD1hfHxfPj1yKXJldHVybiB4KFMrQSksTS5vZmZzZXQ9UyxNLmNvdW50PUEsTTtjb25zdCBUPV9kKE0uYm91bmRpbmdEYXRhLHYsdCxTLEEsYyk7aWYoVC5heGlzPT09LTEpcmV0dXJuIHgoUytBKSxNLm9mZnNldD1TLE0uY291bnQ9QSxNO2NvbnN0IHo9cCh1LGQsdCxTLEEsVCk7aWYoej09PVN8fHo9PT1TK0EpeChTK0EpLE0ub2Zmc2V0PVMsTS5jb3VudD1BO2Vsc2V7TS5zcGxpdEF4aXM9VC5heGlzO2NvbnN0IEM9bmV3IFlvLEI9UyxGPXotUztNLmxlZnQ9QyxKbyh0LEIsRixDLmJvdW5kaW5nRGF0YSxnKSxtKEMsQixGLGcsXysxKTtjb25zdCBFPW5ldyBZbyxJPXosUj1BLUY7TS5yaWdodD1FLEpvKHQsSSxSLEUuYm91bmRpbmdEYXRhLGcpLG0oRSxJLFIsZyxfKzEpfXJldHVybiBNfX1mdW5jdGlvbiBJZChpLHQpe2NvbnN0IGU9dC51c2VTaGFyZWRBcnJheUJ1ZmZlcj9TaGFyZWRBcnJheUJ1ZmZlcjpBcnJheUJ1ZmZlcixuPWkuZ2VvbWV0cnk7bGV0IHMscjtpZih0LmluZGlyZWN0KXtjb25zdCBvPWJsKG4sdC5yYW5nZSksYT1FZChuLHQudXNlU2hhcmVkQXJyYXlCdWZmZXIsbyk7aS5faW5kaXJlY3RCdWZmZXI9YSxzPU1sKG4sMCxhLmxlbmd0aCxhKSxyPVt7b2Zmc2V0OjAsY291bnQ6YS5sZW5ndGh9XX1lbHNle1NkKG4sdCk7Y29uc3Qgbz13bChuLHQucmFuZ2UpWzBdO3M9TWwobixvLm9mZnNldCxvLmNvdW50KSxyPWJsKG4sdC5yYW5nZSl9aS5fcm9vdHM9ci5tYXAobz0+e2NvbnN0IGE9RmQoaSxzLG8ub2Zmc2V0LG8uY291bnQsdCksYz1RbyhhKSxsPW5ldyBlKE50KmMpO3JldHVybiBCZCgwLGEsbCksbH0pfWNsYXNzIE9le2NvbnN0cnVjdG9yKCl7dGhpcy5taW49MS8wLHRoaXMubWF4PS0xLzB9c2V0RnJvbVBvaW50c0ZpZWxkKHQsZSl7bGV0IG49MS8wLHM9LTEvMDtmb3IobGV0IHI9MCxvPXQubGVuZ3RoO3I8bztyKyspe2NvbnN0IGM9dFtyXVtlXTtuPWM8bj9jOm4scz1jPnM/YzpzfXRoaXMubWluPW4sdGhpcy5tYXg9c31zZXRGcm9tUG9pbnRzKHQsZSl7bGV0IG49MS8wLHM9LTEvMDtmb3IobGV0IHI9MCxvPWUubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9ZVtyXSxjPXQuZG90KGEpO249YzxuP2M6bixzPWM+cz9jOnN9dGhpcy5taW49bix0aGlzLm1heD1zfWlzU2VwYXJhdGVkKHQpe3JldHVybiB0aGlzLm1pbj50Lm1heHx8dC5taW4+dGhpcy5tYXh9fU9lLnByb3RvdHlwZS5zZXRGcm9tQm94PWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgUDtyZXR1cm4gZnVuY3Rpb24oZSxuKXtjb25zdCBzPW4ubWluLHI9bi5tYXg7bGV0IG89MS8wLGE9LTEvMDtmb3IobGV0IGM9MDtjPD0xO2MrKylmb3IobGV0IGw9MDtsPD0xO2wrKylmb3IobGV0IGg9MDtoPD0xO2grKyl7aS54PXMueCpjK3IueCooMS1jKSxpLnk9cy55Kmwrci55KigxLWwpLGkuej1zLnoqaCtyLnoqKDEtaCk7Y29uc3QgdT1lLmRvdChpKTtvPU1hdGgubWluKHUsbyksYT1NYXRoLm1heCh1LGEpfXRoaXMubWluPW8sdGhpcy5tYXg9YX19KCk7Y29uc3QgTmQ9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBQLHQ9bmV3IFAsZT1uZXcgUDtyZXR1cm4gZnVuY3Rpb24ocyxyLG8pe2NvbnN0IGE9cy5zdGFydCxjPWksbD1yLnN0YXJ0LGg9dDtlLnN1YlZlY3RvcnMoYSxsKSxpLnN1YlZlY3RvcnMocy5lbmQscy5zdGFydCksdC5zdWJWZWN0b3JzKHIuZW5kLHIuc3RhcnQpO2NvbnN0IHU9ZS5kb3QoaCksZj1oLmRvdChjKSxkPWguZG90KGgpLHA9ZS5kb3QoYyksZz1jLmRvdChjKSpkLWYqZjtsZXQgdyxiO2chPT0wP3c9KHUqZi1wKmQpL2c6dz0wLGI9KHUrdypmKS9kLG8ueD13LG8ueT1ifX0oKSx0YT1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IE4sdD1uZXcgUCxlPW5ldyBQO3JldHVybiBmdW5jdGlvbihzLHIsbyxhKXtOZChzLHIsaSk7bGV0IGM9aS54LGw9aS55O2lmKGM+PTAmJmM8PTEmJmw+PTAmJmw8PTEpe3MuYXQoYyxvKSxyLmF0KGwsYSk7cmV0dXJufWVsc2UgaWYoYz49MCYmYzw9MSl7bDwwP3IuYXQoMCxhKTpyLmF0KDEsYSkscy5jbG9zZXN0UG9pbnRUb1BvaW50KGEsITAsbyk7cmV0dXJufWVsc2UgaWYobD49MCYmbDw9MSl7YzwwP3MuYXQoMCxvKTpzLmF0KDEsbyksci5jbG9zZXN0UG9pbnRUb1BvaW50KG8sITAsYSk7cmV0dXJufWVsc2V7bGV0IGg7YzwwP2g9cy5zdGFydDpoPXMuZW5kO2xldCB1O2w8MD91PXIuc3RhcnQ6dT1yLmVuZDtjb25zdCBmPXQsZD1lO2lmKHMuY2xvc2VzdFBvaW50VG9Qb2ludCh1LCEwLHQpLHIuY2xvc2VzdFBvaW50VG9Qb2ludChoLCEwLGUpLGYuZGlzdGFuY2VUb1NxdWFyZWQodSk8PWQuZGlzdGFuY2VUb1NxdWFyZWQoaCkpe28uY29weShmKSxhLmNvcHkodSk7cmV0dXJufWVsc2V7by5jb3B5KGgpLGEuY29weShkKTtyZXR1cm59fX19KCksa2Q9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBQLHQ9bmV3IFAsZT1uZXcgTm8sbj1uZXcgcmU7cmV0dXJuIGZ1bmN0aW9uKHIsbyl7Y29uc3R7cmFkaXVzOmEsY2VudGVyOmN9PXIse2E6bCxiOmgsYzp1fT1vO2lmKG4uc3RhcnQ9bCxuLmVuZD1oLG4uY2xvc2VzdFBvaW50VG9Qb2ludChjLCEwLGkpLmRpc3RhbmNlVG8oYyk8PWF8fChuLnN0YXJ0PWwsbi5lbmQ9dSxuLmNsb3Nlc3RQb2ludFRvUG9pbnQoYywhMCxpKS5kaXN0YW5jZVRvKGMpPD1hKXx8KG4uc3RhcnQ9aCxuLmVuZD11LG4uY2xvc2VzdFBvaW50VG9Qb2ludChjLCEwLGkpLmRpc3RhbmNlVG8oYyk8PWEpKXJldHVybiEwO2NvbnN0IHk9by5nZXRQbGFuZShlKTtpZihNYXRoLmFicyh5LmRpc3RhbmNlVG9Qb2ludChjKSk8PWEpe2NvbnN0IHc9eS5wcm9qZWN0UG9pbnQoYyx0KTtpZihvLmNvbnRhaW5zUG9pbnQodykpcmV0dXJuITB9cmV0dXJuITF9fSgpLFJkPVsieCIsInkiLCJ6Il0sRGU9MWUtMTUsVGw9RGUqRGU7ZnVuY3Rpb24gb2UoaSl7cmV0dXJuIE1hdGguYWJzKGkpPERlfWNsYXNzIGFlIGV4dGVuZHMgZXR7Y29uc3RydWN0b3IoLi4udCl7c3VwZXIoLi4udCksdGhpcy5pc0V4dGVuZGVkVHJpYW5nbGU9ITAsdGhpcy5zYXRBeGVzPW5ldyBBcnJheSg0KS5maWxsKCkubWFwKCgpPT5uZXcgUCksdGhpcy5zYXRCb3VuZHM9bmV3IEFycmF5KDQpLmZpbGwoKS5tYXAoKCk9Pm5ldyBPZSksdGhpcy5wb2ludHM9W3RoaXMuYSx0aGlzLmIsdGhpcy5jXSx0aGlzLnBsYW5lPW5ldyBObyx0aGlzLmlzRGVnZW5lcmF0ZUludG9TZWdtZW50PSExLHRoaXMuaXNEZWdlbmVyYXRlSW50b1BvaW50PSExLHRoaXMuZGVnZW5lcmF0ZVNlZ21lbnQ9bmV3IHJlLHRoaXMubmVlZHNVcGRhdGU9ITB9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4ga2QodCx0aGlzKX11cGRhdGUoKXtjb25zdCB0PXRoaXMuYSxlPXRoaXMuYixuPXRoaXMuYyxzPXRoaXMucG9pbnRzLHI9dGhpcy5zYXRBeGVzLG89dGhpcy5zYXRCb3VuZHMsYT1yWzBdLGM9b1swXTt0aGlzLmdldE5vcm1hbChhKSxjLnNldEZyb21Qb2ludHMoYSxzKTtjb25zdCBsPXJbMV0saD1vWzFdO2wuc3ViVmVjdG9ycyh0LGUpLGguc2V0RnJvbVBvaW50cyhsLHMpO2NvbnN0IHU9clsyXSxmPW9bMl07dS5zdWJWZWN0b3JzKGUsbiksZi5zZXRGcm9tUG9pbnRzKHUscyk7Y29uc3QgZD1yWzNdLHA9b1szXTtkLnN1YlZlY3RvcnMobix0KSxwLnNldEZyb21Qb2ludHMoZCxzKTtjb25zdCB5PWwubGVuZ3RoKCksZz11Lmxlbmd0aCgpLHc9ZC5sZW5ndGgoKTt0aGlzLmlzRGVnZW5lcmF0ZUludG9Qb2ludD0hMSx0aGlzLmlzRGVnZW5lcmF0ZUludG9TZWdtZW50PSExLHk8RGU/ZzxEZXx8dzxEZT90aGlzLmlzRGVnZW5lcmF0ZUludG9Qb2ludD0hMDoodGhpcy5pc0RlZ2VuZXJhdGVJbnRvU2VnbWVudD0hMCx0aGlzLmRlZ2VuZXJhdGVTZWdtZW50LnN0YXJ0LmNvcHkodCksdGhpcy5kZWdlbmVyYXRlU2VnbWVudC5lbmQuY29weShuKSk6ZzxEZT93PERlP3RoaXMuaXNEZWdlbmVyYXRlSW50b1BvaW50PSEwOih0aGlzLmlzRGVnZW5lcmF0ZUludG9TZWdtZW50PSEwLHRoaXMuZGVnZW5lcmF0ZVNlZ21lbnQuc3RhcnQuY29weShlKSx0aGlzLmRlZ2VuZXJhdGVTZWdtZW50LmVuZC5jb3B5KHQpKTp3PERlJiYodGhpcy5pc0RlZ2VuZXJhdGVJbnRvU2VnbWVudD0hMCx0aGlzLmRlZ2VuZXJhdGVTZWdtZW50LnN0YXJ0LmNvcHkobiksdGhpcy5kZWdlbmVyYXRlU2VnbWVudC5lbmQuY29weShlKSksdGhpcy5wbGFuZS5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludChhLHQpLHRoaXMubmVlZHNVcGRhdGU9ITF9fWFlLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb1NlZ21lbnQ9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBQLHQ9bmV3IFAsZT1uZXcgcmU7cmV0dXJuIGZ1bmN0aW9uKHMscj1udWxsLG89bnVsbCl7Y29uc3R7c3RhcnQ6YSxlbmQ6Y309cyxsPXRoaXMucG9pbnRzO2xldCBoLHU9MS8wO2ZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9KGYrMSklMztlLnN0YXJ0LmNvcHkobFtmXSksZS5lbmQuY29weShsW2RdKSx0YShlLHMsaSx0KSxoPWkuZGlzdGFuY2VUb1NxdWFyZWQodCksaDx1JiYodT1oLHImJnIuY29weShpKSxvJiZvLmNvcHkodCkpfXJldHVybiB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoYSxpKSxoPWEuZGlzdGFuY2VUb1NxdWFyZWQoaSksaDx1JiYodT1oLHImJnIuY29weShpKSxvJiZvLmNvcHkoYSkpLHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChjLGkpLGg9Yy5kaXN0YW5jZVRvU3F1YXJlZChpKSxoPHUmJih1PWgsciYmci5jb3B5KGkpLG8mJm8uY29weShjKSksTWF0aC5zcXJ0KHUpfX0oKSxhZS5wcm90b3R5cGUuaW50ZXJzZWN0c1RyaWFuZ2xlPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgYWUsdD1uZXcgT2UsZT1uZXcgT2Usbj1uZXcgUCxzPW5ldyBQLHI9bmV3IFAsbz1uZXcgUCxhPW5ldyByZSxjPW5ldyByZSxsPW5ldyBQLGg9bmV3IE4sdT1uZXcgTjtmdW5jdGlvbiBmKHgsbSxNLFMpe2NvbnN0IEE9bjsheC5pc0RlZ2VuZXJhdGVJbnRvUG9pbnQmJiF4LmlzRGVnZW5lcmF0ZUludG9TZWdtZW50P0EuY29weSh4LnBsYW5lLm5vcm1hbCk6QS5jb3B5KG0ucGxhbmUubm9ybWFsKTtjb25zdCB2PXguc2F0Qm91bmRzLF89eC5zYXRBeGVzO2ZvcihsZXQgQz0xO0M8NDtDKyspe2NvbnN0IEI9dltDXSxGPV9bQ107aWYodC5zZXRGcm9tUG9pbnRzKEYsbS5wb2ludHMpLEIuaXNTZXBhcmF0ZWQodCl8fChvLmNvcHkoQSkuY3Jvc3MoRiksdC5zZXRGcm9tUG9pbnRzKG8seC5wb2ludHMpLGUuc2V0RnJvbVBvaW50cyhvLG0ucG9pbnRzKSx0LmlzU2VwYXJhdGVkKGUpKSlyZXR1cm4hMX1jb25zdCBUPW0uc2F0Qm91bmRzLHo9bS5zYXRBeGVzO2ZvcihsZXQgQz0xO0M8NDtDKyspe2NvbnN0IEI9VFtDXSxGPXpbQ107aWYodC5zZXRGcm9tUG9pbnRzKEYseC5wb2ludHMpLEIuaXNTZXBhcmF0ZWQodCl8fChvLmNyb3NzVmVjdG9ycyhBLEYpLHQuc2V0RnJvbVBvaW50cyhvLHgucG9pbnRzKSxlLnNldEZyb21Qb2ludHMobyxtLnBvaW50cyksdC5pc1NlcGFyYXRlZChlKSkpcmV0dXJuITF9cmV0dXJuIE0mJihTfHxjb25zb2xlLndhcm4oIkV4dGVuZGVkVHJpYW5nbGUuaW50ZXJzZWN0c1RyaWFuZ2xlOiBUcmlhbmdsZXMgYXJlIGNvcGxhbmFyIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgYW4gb3V0cHV0IGVkZ2UuIFNldHRpbmcgZWRnZSB0byAwLCAwLCAwLiIpLE0uc3RhcnQuc2V0KDAsMCwwKSxNLmVuZC5zZXQoMCwwLDApKSwhMH1mdW5jdGlvbiBkKHgsbSxNLFMsQSx2LF8sVCx6LEMsQil7bGV0IEY9Xy8oXy1UKTtDLng9UysoQS1TKSpGLEIuc3RhcnQuc3ViVmVjdG9ycyhtLHgpLm11bHRpcGx5U2NhbGFyKEYpLmFkZCh4KSxGPV8vKF8teiksQy55PVMrKHYtUykqRixCLmVuZC5zdWJWZWN0b3JzKE0seCkubXVsdGlwbHlTY2FsYXIoRikuYWRkKHgpfWZ1bmN0aW9uIHAoeCxtLE0sUyxBLHYsXyxULHosQyxCKXtpZihBPjApZCh4LmMseC5hLHguYixTLG0sTSx6LF8sVCxDLEIpO2Vsc2UgaWYodj4wKWQoeC5iLHguYSx4LmMsTSxtLFMsVCxfLHosQyxCKTtlbHNlIGlmKFQqej4wfHxfIT0wKWQoeC5hLHguYix4LmMsbSxNLFMsXyxULHosQyxCKTtlbHNlIGlmKFQhPTApZCh4LmIseC5hLHguYyxNLG0sUyxULF8seixDLEIpO2Vsc2UgaWYoeiE9MClkKHguYyx4LmEseC5iLFMsbSxNLHosXyxULEMsQik7ZWxzZSByZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiB5KHgsbSxNLFMpe2NvbnN0IEE9bS5kZWdlbmVyYXRlU2VnbWVudCx2PXgucGxhbmUuZGlzdGFuY2VUb1BvaW50KEEuc3RhcnQpLF89eC5wbGFuZS5kaXN0YW5jZVRvUG9pbnQoQS5lbmQpO3JldHVybiBvZSh2KT9vZShfKT9mKHgsbSxNLFMpOihNJiYoTS5zdGFydC5jb3B5KEEuc3RhcnQpLE0uZW5kLmNvcHkoQS5zdGFydCkpLHguY29udGFpbnNQb2ludChBLnN0YXJ0KSk6b2UoXyk/KE0mJihNLnN0YXJ0LmNvcHkoQS5lbmQpLE0uZW5kLmNvcHkoQS5lbmQpKSx4LmNvbnRhaW5zUG9pbnQoQS5lbmQpKTp4LnBsYW5lLmludGVyc2VjdExpbmUoQSxuKSE9bnVsbD8oTSYmKE0uc3RhcnQuY29weShuKSxNLmVuZC5jb3B5KG4pKSx4LmNvbnRhaW5zUG9pbnQobikpOiExfWZ1bmN0aW9uIGcoeCxtLE0pe2NvbnN0IFM9bS5hO3JldHVybiBvZSh4LnBsYW5lLmRpc3RhbmNlVG9Qb2ludChTKSkmJnguY29udGFpbnNQb2ludChTKT8oTSYmKE0uc3RhcnQuY29weShTKSxNLmVuZC5jb3B5KFMpKSwhMCk6ITF9ZnVuY3Rpb24gdyh4LG0sTSl7Y29uc3QgUz14LmRlZ2VuZXJhdGVTZWdtZW50LEE9bS5hO3JldHVybiBTLmNsb3Nlc3RQb2ludFRvUG9pbnQoQSwhMCxuKSxBLmRpc3RhbmNlVG9TcXVhcmVkKG4pPFRsPyhNJiYoTS5zdGFydC5jb3B5KEEpLE0uZW5kLmNvcHkoQSkpLCEwKTohMX1mdW5jdGlvbiBiKHgsbSxNLFMpe2lmKHguaXNEZWdlbmVyYXRlSW50b1NlZ21lbnQpaWYobS5pc0RlZ2VuZXJhdGVJbnRvU2VnbWVudCl7Y29uc3QgQT14LmRlZ2VuZXJhdGVTZWdtZW50LHY9bS5kZWdlbmVyYXRlU2VnbWVudCxfPXMsVD1yO0EuZGVsdGEoXyksdi5kZWx0YShUKTtjb25zdCB6PW4uc3ViVmVjdG9ycyh2LnN0YXJ0LEEuc3RhcnQpLEM9Xy54KlQueS1fLnkqVC54O2lmKG9lKEMpKXJldHVybiExO2NvbnN0IEI9KHoueCpULnktei55KlQueCkvQyxGPS0oXy54KnoueS1fLnkqei54KS9DO2lmKEI8MHx8Qj4xfHxGPDB8fEY+MSlyZXR1cm4hMTtjb25zdCBFPUEuc3RhcnQueitfLnoqQixJPXYuc3RhcnQueitULnoqRjtyZXR1cm4gb2UoRS1JKT8oTSYmKE0uc3RhcnQuY29weShBLnN0YXJ0KS5hZGRTY2FsZWRWZWN0b3IoXyxCKSxNLmVuZC5jb3B5KEEuc3RhcnQpLmFkZFNjYWxlZFZlY3RvcihfLEIpKSwhMCk6ITF9ZWxzZSByZXR1cm4gbS5pc0RlZ2VuZXJhdGVJbnRvUG9pbnQ/dyh4LG0sTSk6eShtLHgsTSxTKTtlbHNle2lmKHguaXNEZWdlbmVyYXRlSW50b1BvaW50KXJldHVybiBtLmlzRGVnZW5lcmF0ZUludG9Qb2ludD9tLmEuZGlzdGFuY2VUb1NxdWFyZWQoeC5hKTxUbD8oTSYmKE0uc3RhcnQuY29weSh4LmEpLE0uZW5kLmNvcHkoeC5hKSksITApOiExOm0uaXNEZWdlbmVyYXRlSW50b1NlZ21lbnQ/dyhtLHgsTSk6ZyhtLHgsTSk7aWYobS5pc0RlZ2VuZXJhdGVJbnRvUG9pbnQpcmV0dXJuIGcoeCxtLE0pO2lmKG0uaXNEZWdlbmVyYXRlSW50b1NlZ21lbnQpcmV0dXJuIHkoeCxtLE0sUyl9fXJldHVybiBmdW5jdGlvbihtLE09bnVsbCxTPSExKXt0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLG0uaXNFeHRlbmRlZFRyaWFuZ2xlP20ubmVlZHNVcGRhdGUmJm0udXBkYXRlKCk6KGkuY29weShtKSxpLnVwZGF0ZSgpLG09aSk7Y29uc3QgQT1iKHRoaXMsbSxNLFMpO2lmKEEhPT12b2lkIDApcmV0dXJuIEE7Y29uc3Qgdj10aGlzLnBsYW5lLF89bS5wbGFuZTtsZXQgVD1fLmRpc3RhbmNlVG9Qb2ludCh0aGlzLmEpLHo9Xy5kaXN0YW5jZVRvUG9pbnQodGhpcy5iKSxDPV8uZGlzdGFuY2VUb1BvaW50KHRoaXMuYyk7b2UoVCkmJihUPTApLG9lKHopJiYoej0wKSxvZShDKSYmKEM9MCk7Y29uc3QgQj1UKnosRj1UKkM7aWYoQj4wJiZGPjApcmV0dXJuITE7bGV0IEU9di5kaXN0YW5jZVRvUG9pbnQobS5hKSxJPXYuZGlzdGFuY2VUb1BvaW50KG0uYiksUj12LmRpc3RhbmNlVG9Qb2ludChtLmMpO29lKEUpJiYoRT0wKSxvZShJKSYmKEk9MCksb2UoUikmJihSPTApO2NvbnN0IFY9RSpJLFU9RSpSO2lmKFY+MCYmVT4wKXJldHVybiExO3MuY29weSh2Lm5vcm1hbCksci5jb3B5KF8ubm9ybWFsKTtjb25zdCBLPXMuY3Jvc3Mocik7bGV0IGN0PTAsRnQ9TWF0aC5hYnMoSy54KTtjb25zdCBJdD1NYXRoLmFicyhLLnkpO0l0PkZ0JiYoRnQ9SXQsY3Q9MSksTWF0aC5hYnMoSy56KT5GdCYmKGN0PTIpO2NvbnN0IFN0PVJkW2N0XSxZZT10aGlzLmFbU3RdLFNpPXRoaXMuYltTdF0sc289dGhpcy5jW1N0XSx6Yz1tLmFbU3RdLFRjPW0uYltTdF0scm89bS5jW1N0XTtpZihwKHRoaXMsWWUsU2ksc28sQixGLFQseixDLGgsYSkpcmV0dXJuIGYodGhpcyxtLE0sUyk7aWYocChtLHpjLFRjLHJvLFYsVSxFLEksUix1LGMpKXJldHVybiBmKHRoaXMsbSxNLFMpO2lmKGgueTxoLngpe2NvbnN0IHRlPWgueTtoLnk9aC54LGgueD10ZSxsLmNvcHkoYS5zdGFydCksYS5zdGFydC5jb3B5KGEuZW5kKSxhLmVuZC5jb3B5KGwpfWlmKHUueTx1Lngpe2NvbnN0IHRlPXUueTt1Lnk9dS54LHUueD10ZSxsLmNvcHkoYy5zdGFydCksYy5zdGFydC5jb3B5KGMuZW5kKSxjLmVuZC5jb3B5KGwpfXJldHVybiBoLnk8dS54fHx1Lnk8aC54PyExOihNJiYodS54PmgueD9NLnN0YXJ0LmNvcHkoYy5zdGFydCk6TS5zdGFydC5jb3B5KGEuc3RhcnQpLHUueTxoLnk/TS5lbmQuY29weShjLmVuZCk6TS5lbmQuY29weShhLmVuZCkpLCEwKX19KCksYWUucHJvdG90eXBlLmRpc3RhbmNlVG9Qb2ludD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFA7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoZSxpKSxlLmRpc3RhbmNlVG8oaSl9fSgpLGFlLnByb3RvdHlwZS5kaXN0YW5jZVRvVHJpYW5nbGU9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBQLHQ9bmV3IFAsZT1bImEiLCJiIiwiYyJdLG49bmV3IHJlLHM9bmV3IHJlO3JldHVybiBmdW5jdGlvbihvLGE9bnVsbCxjPW51bGwpe2NvbnN0IGw9YXx8Yz9uOm51bGw7aWYodGhpcy5pbnRlcnNlY3RzVHJpYW5nbGUobyxsKSlyZXR1cm4oYXx8YykmJihhJiZsLmdldENlbnRlcihhKSxjJiZsLmdldENlbnRlcihjKSksMDtsZXQgaD0xLzA7Zm9yKGxldCB1PTA7dTwzO3UrKyl7bGV0IGY7Y29uc3QgZD1lW3VdLHA9b1tkXTt0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQocCxpKSxmPXAuZGlzdGFuY2VUb1NxdWFyZWQoaSksZjxoJiYoaD1mLGEmJmEuY29weShpKSxjJiZjLmNvcHkocCkpO2NvbnN0IHk9dGhpc1tkXTtvLmNsb3Nlc3RQb2ludFRvUG9pbnQoeSxpKSxmPXkuZGlzdGFuY2VUb1NxdWFyZWQoaSksZjxoJiYoaD1mLGEmJmEuY29weSh5KSxjJiZjLmNvcHkoaSkpfWZvcihsZXQgdT0wO3U8Mzt1Kyspe2NvbnN0IGY9ZVt1XSxkPWVbKHUrMSklM107bi5zZXQodGhpc1tmXSx0aGlzW2RdKTtmb3IobGV0IHA9MDtwPDM7cCsrKXtjb25zdCB5PWVbcF0sZz1lWyhwKzEpJTNdO3Muc2V0KG9beV0sb1tnXSksdGEobixzLGksdCk7Y29uc3Qgdz1pLmRpc3RhbmNlVG9TcXVhcmVkKHQpO3c8aCYmKGg9dyxhJiZhLmNvcHkoaSksYyYmYy5jb3B5KHQpKX19cmV0dXJuIE1hdGguc3FydChoKX19KCk7Y2xhc3Mga3R7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuaXNPcmllbnRlZEJveD0hMCx0aGlzLm1pbj1uZXcgUCx0aGlzLm1heD1uZXcgUCx0aGlzLm1hdHJpeD1uZXcgc3QsdGhpcy5pbnZNYXRyaXg9bmV3IHN0LHRoaXMucG9pbnRzPW5ldyBBcnJheSg4KS5maWxsKCkubWFwKCgpPT5uZXcgUCksdGhpcy5zYXRBeGVzPW5ldyBBcnJheSgzKS5maWxsKCkubWFwKCgpPT5uZXcgUCksdGhpcy5zYXRCb3VuZHM9bmV3IEFycmF5KDMpLmZpbGwoKS5tYXAoKCk9Pm5ldyBPZSksdGhpcy5hbGlnbmVkU2F0Qm91bmRzPW5ldyBBcnJheSgzKS5maWxsKCkubWFwKCgpPT5uZXcgT2UpLHRoaXMubmVlZHNVcGRhdGU9ITEsdCYmdGhpcy5taW4uY29weSh0KSxlJiZ0aGlzLm1heC5jb3B5KGUpLG4mJnRoaXMubWF0cml4LmNvcHkobil9c2V0KHQsZSxuKXt0aGlzLm1pbi5jb3B5KHQpLHRoaXMubWF4LmNvcHkoZSksdGhpcy5tYXRyaXguY29weShuKSx0aGlzLm5lZWRzVXBkYXRlPSEwfWNvcHkodCl7dGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5uZWVkc1VwZGF0ZT0hMH19a3QucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5tYXRyaXgsZT10aGlzLm1pbixuPXRoaXMubWF4LHM9dGhpcy5wb2ludHM7Zm9yKGxldCBsPTA7bDw9MTtsKyspZm9yKGxldCBoPTA7aDw9MTtoKyspZm9yKGxldCB1PTA7dTw9MTt1Kyspe2NvbnN0IGY9MSpsfDIqaHw0KnUsZD1zW2ZdO2QueD1sP24ueDplLngsZC55PWg/bi55OmUueSxkLno9dT9uLno6ZS56LGQuYXBwbHlNYXRyaXg0KHQpfWNvbnN0IHI9dGhpcy5zYXRCb3VuZHMsbz10aGlzLnNhdEF4ZXMsYT1zWzBdO2ZvcihsZXQgbD0wO2w8MztsKyspe2NvbnN0IGg9b1tsXSx1PXJbbF0sZj0xPDxsLGQ9c1tmXTtoLnN1YlZlY3RvcnMoYSxkKSx1LnNldEZyb21Qb2ludHMoaCxzKX1jb25zdCBjPXRoaXMuYWxpZ25lZFNhdEJvdW5kcztjWzBdLnNldEZyb21Qb2ludHNGaWVsZChzLCJ4IiksY1sxXS5zZXRGcm9tUG9pbnRzRmllbGQocywieSIpLGNbMl0uc2V0RnJvbVBvaW50c0ZpZWxkKHMsInoiKSx0aGlzLmludk1hdHJpeC5jb3B5KHRoaXMubWF0cml4KS5pbnZlcnQoKSx0aGlzLm5lZWRzVXBkYXRlPSExfX0oKSxrdC5wcm90b3R5cGUuaW50ZXJzZWN0c0JveD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IE9lO3JldHVybiBmdW5jdGlvbihlKXt0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpO2NvbnN0IG49ZS5taW4scz1lLm1heCxyPXRoaXMuc2F0Qm91bmRzLG89dGhpcy5zYXRBeGVzLGE9dGhpcy5hbGlnbmVkU2F0Qm91bmRzO2lmKGkubWluPW4ueCxpLm1heD1zLngsYVswXS5pc1NlcGFyYXRlZChpKXx8KGkubWluPW4ueSxpLm1heD1zLnksYVsxXS5pc1NlcGFyYXRlZChpKSl8fChpLm1pbj1uLnosaS5tYXg9cy56LGFbMl0uaXNTZXBhcmF0ZWQoaSkpKXJldHVybiExO2ZvcihsZXQgYz0wO2M8MztjKyspe2NvbnN0IGw9b1tjXSxoPXJbY107aWYoaS5zZXRGcm9tQm94KGwsZSksaC5pc1NlcGFyYXRlZChpKSlyZXR1cm4hMX1yZXR1cm4hMH19KCksa3QucHJvdG90eXBlLmludGVyc2VjdHNUcmlhbmdsZT1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IGFlLHQ9bmV3IEFycmF5KDMpLGU9bmV3IE9lLG49bmV3IE9lLHM9bmV3IFA7cmV0dXJuIGZ1bmN0aW9uKG8pe3RoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksby5pc0V4dGVuZGVkVHJpYW5nbGU/by5uZWVkc1VwZGF0ZSYmby51cGRhdGUoKTooaS5jb3B5KG8pLGkudXBkYXRlKCksbz1pKTtjb25zdCBhPXRoaXMuc2F0Qm91bmRzLGM9dGhpcy5zYXRBeGVzO3RbMF09by5hLHRbMV09by5iLHRbMl09by5jO2ZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9YVtmXSxwPWNbZl07aWYoZS5zZXRGcm9tUG9pbnRzKHAsdCksZC5pc1NlcGFyYXRlZChlKSlyZXR1cm4hMX1jb25zdCBsPW8uc2F0Qm91bmRzLGg9by5zYXRBeGVzLHU9dGhpcy5wb2ludHM7Zm9yKGxldCBmPTA7ZjwzO2YrKyl7Y29uc3QgZD1sW2ZdLHA9aFtmXTtpZihlLnNldEZyb21Qb2ludHMocCx1KSxkLmlzU2VwYXJhdGVkKGUpKXJldHVybiExfWZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9Y1tmXTtmb3IobGV0IHA9MDtwPDQ7cCsrKXtjb25zdCB5PWhbcF07aWYocy5jcm9zc1ZlY3RvcnMoZCx5KSxlLnNldEZyb21Qb2ludHMocyx0KSxuLnNldEZyb21Qb2ludHMocyx1KSxlLmlzU2VwYXJhdGVkKG4pKXJldHVybiExfX1yZXR1cm4hMH19KCksa3QucHJvdG90eXBlLmNsb3Nlc3RQb2ludFRvUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKSxlLmNvcHkodCkuYXBwbHlNYXRyaXg0KHRoaXMuaW52TWF0cml4KS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4KSxlfX0oKSxrdC5wcm90b3R5cGUuZGlzdGFuY2VUb1BvaW50PWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgUDtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChlLGkpLGUuZGlzdGFuY2VUbyhpKX19KCksa3QucHJvdG90eXBlLmRpc3RhbmNlVG9Cb3g9ZnVuY3Rpb24oKXtjb25zdCBpPVsieCIsInkiLCJ6Il0sdD1uZXcgQXJyYXkoMTIpLmZpbGwoKS5tYXAoKCk9Pm5ldyByZSksZT1uZXcgQXJyYXkoMTIpLmZpbGwoKS5tYXAoKCk9Pm5ldyByZSksbj1uZXcgUCxzPW5ldyBQO3JldHVybiBmdW5jdGlvbihvLGE9MCxjPW51bGwsbD1udWxsKXtpZih0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLHRoaXMuaW50ZXJzZWN0c0JveChvKSlyZXR1cm4oY3x8bCkmJihvLmdldENlbnRlcihzKSx0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQocyxuKSxvLmNsb3Nlc3RQb2ludFRvUG9pbnQobixzKSxjJiZjLmNvcHkobiksbCYmbC5jb3B5KHMpKSwwO2NvbnN0IGg9YSphLHU9by5taW4sZj1vLm1heCxkPXRoaXMucG9pbnRzO2xldCBwPTEvMDtmb3IobGV0IGc9MDtnPDg7ZysrKXtjb25zdCB3PWRbZ107cy5jb3B5KHcpLmNsYW1wKHUsZik7Y29uc3QgYj13LmRpc3RhbmNlVG9TcXVhcmVkKHMpO2lmKGI8cCYmKHA9YixjJiZjLmNvcHkodyksbCYmbC5jb3B5KHMpLGI8aCkpcmV0dXJuIE1hdGguc3FydChiKX1sZXQgeT0wO2ZvcihsZXQgZz0wO2c8MztnKyspZm9yKGxldCB3PTA7dzw9MTt3KyspZm9yKGxldCBiPTA7Yjw9MTtiKyspe2NvbnN0IHg9KGcrMSklMyxtPShnKzIpJTMsTT13PDx4fGI8PG0sUz0xPDxnfHc8PHh8Yjw8bSxBPWRbTV0sdj1kW1NdO3RbeV0uc2V0KEEsdik7Y29uc3QgVD1pW2ddLHo9aVt4XSxDPWlbbV0sQj1lW3ldLEY9Qi5zdGFydCxFPUIuZW5kO0ZbVF09dVtUXSxGW3pdPXc/dVt6XTpmW3pdLEZbQ109Yj91W0NdOmZbel0sRVtUXT1mW1RdLEVbel09dz91W3pdOmZbel0sRVtDXT1iP3VbQ106Zlt6XSx5Kyt9Zm9yKGxldCBnPTA7Zzw9MTtnKyspZm9yKGxldCB3PTA7dzw9MTt3KyspZm9yKGxldCBiPTA7Yjw9MTtiKyspe3MueD1nP2YueDp1Lngscy55PXc/Zi55OnUueSxzLno9Yj9mLno6dS56LHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChzLG4pO2NvbnN0IHg9cy5kaXN0YW5jZVRvU3F1YXJlZChuKTtpZih4PHAmJihwPXgsYyYmYy5jb3B5KG4pLGwmJmwuY29weShzKSx4PGgpKXJldHVybiBNYXRoLnNxcnQoeCl9Zm9yKGxldCBnPTA7ZzwxMjtnKyspe2NvbnN0IHc9dFtnXTtmb3IobGV0IGI9MDtiPDEyO2IrKyl7Y29uc3QgeD1lW2JdO3RhKHcseCxuLHMpO2NvbnN0IG09bi5kaXN0YW5jZVRvU3F1YXJlZChzKTtpZihtPHAmJihwPW0sYyYmYy5jb3B5KG4pLGwmJmwuY29weShzKSxtPGgpKXJldHVybiBNYXRoLnNxcnQobSl9fXJldHVybiBNYXRoLnNxcnQocCl9fSgpO2NsYXNzIGVhe2NvbnN0cnVjdG9yKHQpe3RoaXMuX2dldE5ld1ByaW1pdGl2ZT10LHRoaXMuX3ByaW1pdGl2ZXM9W119Z2V0UHJpbWl0aXZlKCl7Y29uc3QgdD10aGlzLl9wcmltaXRpdmVzO3JldHVybiB0Lmxlbmd0aD09PTA/dGhpcy5fZ2V0TmV3UHJpbWl0aXZlKCk6dC5wb3AoKX1yZWxlYXNlUHJpbWl0aXZlKHQpe3RoaXMuX3ByaW1pdGl2ZXMucHVzaCh0KX19Y2xhc3MgTGQgZXh0ZW5kcyBlYXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCgpPT5uZXcgYWUpfX1jb25zdCBjZT1uZXcgTGQ7ZnVuY3Rpb24gQXQoaSx0KXtyZXR1cm4gdFtpKzE1XT09PXhsfWZ1bmN0aW9uIFl0KGksdCl7cmV0dXJuIHRbaSs2XX1mdW5jdGlvbiBsZShpLHQpe3JldHVybiB0W2krMTRdfWZ1bmN0aW9uIF90KGkpe3JldHVybiBpK010fWZ1bmN0aW9uIHp0KGksdCl7Y29uc3QgZT10W2krNl07cmV0dXJuIGkrZSpNdH1mdW5jdGlvbiBuYShpLHQpe3JldHVybiB0W2krN119ZnVuY3Rpb24gY3goaSl7cmV0dXJuIGl9Y2xhc3MgT2R7Y29uc3RydWN0b3IoKXt0aGlzLmZsb2F0MzJBcnJheT1udWxsLHRoaXMudWludDE2QXJyYXk9bnVsbCx0aGlzLnVpbnQzMkFycmF5PW51bGw7Y29uc3QgdD1bXTtsZXQgZT1udWxsO3RoaXMuc2V0QnVmZmVyPW49PntlJiZ0LnB1c2goZSksZT1uLHRoaXMuZmxvYXQzMkFycmF5PW5ldyBGbG9hdDMyQXJyYXkobiksdGhpcy51aW50MTZBcnJheT1uZXcgVWludDE2QXJyYXkobiksdGhpcy51aW50MzJBcnJheT1uZXcgVWludDMyQXJyYXkobil9LHRoaXMuY2xlYXJCdWZmZXI9KCk9PntlPW51bGwsdGhpcy5mbG9hdDMyQXJyYXk9bnVsbCx0aGlzLnVpbnQxNkFycmF5PW51bGwsdGhpcy51aW50MzJBcnJheT1udWxsLHQubGVuZ3RoIT09MCYmdGhpcy5zZXRCdWZmZXIodC5wb3AoKSl9fX1jb25zdCBudD1uZXcgT2Q7bGV0IGFuLG5pO2NvbnN0IGlpPVtdLFZzPW5ldyBlYSgoKT0+bmV3IGd0KTtmdW5jdGlvbiBEZChpLHQsZSxuLHMscil7YW49VnMuZ2V0UHJpbWl0aXZlKCksbmk9VnMuZ2V0UHJpbWl0aXZlKCksaWkucHVzaChhbixuaSksbnQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKTtjb25zdCBvPWlhKDAsaS5nZW9tZXRyeSxlLG4scyxyKTtudC5jbGVhckJ1ZmZlcigpLFZzLnJlbGVhc2VQcmltaXRpdmUoYW4pLFZzLnJlbGVhc2VQcmltaXRpdmUobmkpLGlpLnBvcCgpLGlpLnBvcCgpO2NvbnN0IGE9aWkubGVuZ3RoO3JldHVybiBhPjAmJihuaT1paVthLTFdLGFuPWlpW2EtMl0pLG99ZnVuY3Rpb24gaWEoaSx0LGUsbixzPW51bGwscj0wLG89MCl7Y29uc3R7ZmxvYXQzMkFycmF5OmEsdWludDE2QXJyYXk6Yyx1aW50MzJBcnJheTpsfT1udDtsZXQgaD1pKjI7aWYoQXQoaCxjKSl7Y29uc3QgZj1ZdChpLGwpLGQ9bGUoaCxjKTtyZXR1cm4gaHQoaSxhLGFuKSxuKGYsZCwhMSxvLHIraS9NdCxhbil9ZWxzZXtsZXQgVD1mdW5jdGlvbihDKXtjb25zdHt1aW50MTZBcnJheTpCLHVpbnQzMkFycmF5OkZ9PW50O2xldCBFPUMqMjtmb3IoOyFBdChFLEIpOylDPV90KEMpLEU9QyoyO3JldHVybiBZdChDLEYpfSx6PWZ1bmN0aW9uKEMpe2NvbnN0e3VpbnQxNkFycmF5OkIsdWludDMyQXJyYXk6Rn09bnQ7bGV0IEU9QyoyO2Zvcig7IUF0KEUsQik7KUM9enQoQyxGKSxFPUMqMjtyZXR1cm4gWXQoQyxGKStsZShFLEIpfTtjb25zdCBmPV90KGkpLGQ9enQoaSxsKTtsZXQgcD1mLHk9ZCxnLHcsYix4O2lmKHMmJihiPWFuLHg9bmksaHQocCxhLGIpLGh0KHksYSx4KSxnPXMoYiksdz1zKHgpLHc8Zykpe3A9ZCx5PWY7Y29uc3QgQz1nO2c9dyx3PUMsYj14fWJ8fChiPWFuLGh0KHAsYSxiKSk7Y29uc3QgbT1BdChwKjIsYyksTT1lKGIsbSxnLG8rMSxyK3AvTXQpO2xldCBTO2lmKE09PT1tbCl7Y29uc3QgQz1UKHApLEY9eihwKS1DO1M9bihDLEYsITAsbysxLHIrcC9NdCxiKX1lbHNlIFM9TSYmaWEocCx0LGUsbixzLHIsbysxKTtpZihTKXJldHVybiEwO3g9bmksaHQoeSxhLHgpO2NvbnN0IEE9QXQoeSoyLGMpLHY9ZSh4LEEsdyxvKzEscit5L010KTtsZXQgXztpZih2PT09bWwpe2NvbnN0IEM9VCh5KSxGPXooeSktQztfPW4oQyxGLCEwLG8rMSxyK3kvTXQseCl9ZWxzZSBfPXYmJmlhKHksdCxlLG4scyxyLG8rMSk7cmV0dXJuISFffX1jb25zdCBEaT1uZXcgUCxzYT1uZXcgUDtmdW5jdGlvbiAkZChpLHQsZT17fSxuPTAscz0xLzApe2NvbnN0IHI9bipuLG89cypzO2xldCBhPTEvMCxjPW51bGw7aWYoaS5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6aD0+KERpLmNvcHkodCkuY2xhbXAoaC5taW4saC5tYXgpLERpLmRpc3RhbmNlVG9TcXVhcmVkKHQpKSxpbnRlcnNlY3RzQm91bmRzOihoLHUsZik9PmY8YSYmZjxvLGludGVyc2VjdHNUcmlhbmdsZTooaCx1KT0+e2guY2xvc2VzdFBvaW50VG9Qb2ludCh0LERpKTtjb25zdCBmPXQuZGlzdGFuY2VUb1NxdWFyZWQoRGkpO3JldHVybiBmPGEmJihzYS5jb3B5KERpKSxhPWYsYz11KSxmPHJ9fSksYT09PTEvMClyZXR1cm4gbnVsbDtjb25zdCBsPU1hdGguc3FydChhKTtyZXR1cm4gZS5wb2ludD9lLnBvaW50LmNvcHkoc2EpOmUucG9pbnQ9c2EuY2xvbmUoKSxlLmRpc3RhbmNlPWwsZS5mYWNlSW5kZXg9YyxlfWNvbnN0IFVzPXBhcnNlSW50KEopPj0xNjksVmQ9cGFyc2VJbnQoSik8PTE2MSxTbj1uZXcgUCx2bj1uZXcgUCxfbj1uZXcgUCxxcz1uZXcgTixYcz1uZXcgTixacz1uZXcgTixQbD1uZXcgUCxDbD1uZXcgUCxCbD1uZXcgUCwkaT1uZXcgUDtmdW5jdGlvbiBVZChpLHQsZSxuLHMscixvLGEpe2xldCBjO2lmKHI9PT0xP2M9aS5pbnRlcnNlY3RUcmlhbmdsZShuLGUsdCwhMCxzKTpjPWkuaW50ZXJzZWN0VHJpYW5nbGUodCxlLG4sciE9PTIscyksYz09PW51bGwpcmV0dXJuIG51bGw7Y29uc3QgbD1pLm9yaWdpbi5kaXN0YW5jZVRvKHMpO3JldHVybiBsPG98fGw+YT9udWxsOntkaXN0YW5jZTpsLHBvaW50OnMuY2xvbmUoKX19ZnVuY3Rpb24gRWwoaSx0LGUsbixzLHIsbyxhLGMsbCxoKXtTbi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsciksdm4uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LG8pLF9uLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxhKTtjb25zdCB1PVVkKGksU24sdm4sX24sJGksYyxsLGgpO2lmKHUpe2lmKG4pe3FzLmZyb21CdWZmZXJBdHRyaWJ1dGUobixyKSxYcy5mcm9tQnVmZmVyQXR0cmlidXRlKG4sbyksWnMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLGEpLHUudXY9bmV3IE47Y29uc3QgZD1ldC5nZXRJbnRlcnBvbGF0aW9uKCRpLFNuLHZuLF9uLHFzLFhzLFpzLHUudXYpO1VzfHwodS51dj1kKX1pZihzKXtxcy5mcm9tQnVmZmVyQXR0cmlidXRlKHMsciksWHMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLG8pLFpzLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxhKSx1LnV2MT1uZXcgTjtjb25zdCBkPWV0LmdldEludGVycG9sYXRpb24oJGksU24sdm4sX24scXMsWHMsWnMsdS51djEpO1VzfHwodS51djE9ZCksVmQmJih1LnV2Mj11LnV2MSl9aWYoZSl7UGwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHIpLENsLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxvKSxCbC5mcm9tQnVmZmVyQXR0cmlidXRlKGUsYSksdS5ub3JtYWw9bmV3IFA7Y29uc3QgZD1ldC5nZXRJbnRlcnBvbGF0aW9uKCRpLFNuLHZuLF9uLFBsLENsLEJsLHUubm9ybWFsKTt1Lm5vcm1hbC5kb3QoaS5kaXJlY3Rpb24pPjAmJnUubm9ybWFsLm11bHRpcGx5U2NhbGFyKC0xKSxVc3x8KHUubm9ybWFsPWQpfWNvbnN0IGY9e2E6cixiOm8sYzphLG5vcm1hbDpuZXcgUCxtYXRlcmlhbEluZGV4OjB9O2lmKGV0LmdldE5vcm1hbChTbix2bixfbixmLm5vcm1hbCksdS5mYWNlPWYsdS5mYWNlSW5kZXg9cixVcyl7Y29uc3QgZD1uZXcgUDtldC5nZXRCYXJ5Y29vcmQoJGksU24sdm4sX24sZCksdS5iYXJ5Y29vcmQ9ZH19cmV0dXJuIHV9ZnVuY3Rpb24gRmwoaSl7cmV0dXJuIGkmJmkuaXNNYXRlcmlhbD9pLnNpZGU6aX1mdW5jdGlvbiBXcyhpLHQsZSxuLHMscixvKXtjb25zdCBhPW4qMztsZXQgYz1hKzAsbD1hKzEsaD1hKzI7Y29uc3R7aW5kZXg6dSxncm91cHM6Zn09aTtpLmluZGV4JiYoYz11LmdldFgoYyksbD11LmdldFgobCksaD11LmdldFgoaCkpO2NvbnN0e3Bvc2l0aW9uOmQsbm9ybWFsOnAsdXY6eSx1djE6Z309aS5hdHRyaWJ1dGVzO2lmKEFycmF5LmlzQXJyYXkodCkpe2NvbnN0IHc9biozO2ZvcihsZXQgYj0wLHg9Zi5sZW5ndGg7Yjx4O2IrKyl7Y29uc3R7c3RhcnQ6bSxjb3VudDpNLG1hdGVyaWFsSW5kZXg6U309ZltiXTtpZih3Pj1tJiZ3PG0rTSl7Y29uc3QgQT1GbCh0W1NdKSx2PUVsKGUsZCxwLHksZyxjLGwsaCxBLHIsbyk7aWYodilpZih2LmZhY2VJbmRleD1uLHYuZmFjZS5tYXRlcmlhbEluZGV4PVMscylzLnB1c2godik7ZWxzZSByZXR1cm4gdn19fWVsc2V7Y29uc3Qgdz1GbCh0KSxiPUVsKGUsZCxwLHksZyxjLGwsaCx3LHIsbyk7aWYoYilpZihiLmZhY2VJbmRleD1uLGIuZmFjZS5tYXRlcmlhbEluZGV4PTAscylzLnB1c2goYik7ZWxzZSByZXR1cm4gYn1yZXR1cm4gbnVsbH1mdW5jdGlvbiB5dChpLHQsZSxuKXtjb25zdCBzPWkuYSxyPWkuYixvPWkuYztsZXQgYT10LGM9dCsxLGw9dCsyO2UmJihhPWUuZ2V0WChhKSxjPWUuZ2V0WChjKSxsPWUuZ2V0WChsKSkscy54PW4uZ2V0WChhKSxzLnk9bi5nZXRZKGEpLHMuej1uLmdldFooYSksci54PW4uZ2V0WChjKSxyLnk9bi5nZXRZKGMpLHIuej1uLmdldFooYyksby54PW4uZ2V0WChsKSxvLnk9bi5nZXRZKGwpLG8uej1uLmdldFoobCl9ZnVuY3Rpb24gcWQoaSx0LGUsbixzLHIsbyxhKXtjb25zdHtnZW9tZXRyeTpjLF9pbmRpcmVjdEJ1ZmZlcjpsfT1pO2ZvcihsZXQgaD1uLHU9bitzO2g8dTtoKyspV3MoYyx0LGUsaCxyLG8sYSl9ZnVuY3Rpb24gWGQoaSx0LGUsbixzLHIsbyl7Y29uc3R7Z2VvbWV0cnk6YSxfaW5kaXJlY3RCdWZmZXI6Y309aTtsZXQgbD0xLzAsaD1udWxsO2ZvcihsZXQgdT1uLGY9bitzO3U8Zjt1Kyspe2xldCBkO2Q9V3MoYSx0LGUsdSxudWxsLHIsbyksZCYmZC5kaXN0YW5jZTxsJiYoaD1kLGw9ZC5kaXN0YW5jZSl9cmV0dXJuIGh9ZnVuY3Rpb24gWmQoaSx0LGUsbixzLHIsbyl7Y29uc3R7Z2VvbWV0cnk6YX09ZSx7aW5kZXg6Y309YSxsPWEuYXR0cmlidXRlcy5wb3NpdGlvbjtmb3IobGV0IGg9aSx1PXQraTtoPHU7aCsrKXtsZXQgZjtpZihmPWgseXQobyxmKjMsYyxsKSxvLm5lZWRzVXBkYXRlPSEwLG4obyxmLHMscikpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gV2QoaSx0PW51bGwpe3QmJkFycmF5LmlzQXJyYXkodCkmJih0PW5ldyBTZXQodCkpO2NvbnN0IGU9aS5nZW9tZXRyeSxuPWUuaW5kZXg/ZS5pbmRleC5hcnJheTpudWxsLHM9ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2xldCByLG8sYSxjLGw9MDtjb25zdCBoPWkuX3Jvb3RzO2ZvcihsZXQgZj0wLGQ9aC5sZW5ndGg7ZjxkO2YrKylyPWhbZl0sbz1uZXcgVWludDMyQXJyYXkociksYT1uZXcgVWludDE2QXJyYXkociksYz1uZXcgRmxvYXQzMkFycmF5KHIpLHUoMCxsKSxsKz1yLmJ5dGVMZW5ndGg7ZnVuY3Rpb24gdShmLGQscD0hMSl7Y29uc3QgeT1mKjI7aWYoQXQoeSxhKSl7Y29uc3QgZz1vW2YrNl0sdz1hW3krMTRdO2xldCBiPTEvMCx4PTEvMCxtPTEvMCxNPS0xLzAsUz0tMS8wLEE9LTEvMDtmb3IobGV0IHY9MypnLF89MyooZyt3KTt2PF87disrKXtsZXQgVD1uW3ZdO2NvbnN0IHo9cy5nZXRYKFQpLEM9cy5nZXRZKFQpLEI9cy5nZXRaKFQpO3o8YiYmKGI9eiksej5NJiYoTT16KSxDPHgmJih4PUMpLEM+UyYmKFM9QyksQjxtJiYobT1CKSxCPkEmJihBPUIpfXJldHVybiBjW2YrMF0hPT1ifHxjW2YrMV0hPT14fHxjW2YrMl0hPT1tfHxjW2YrM10hPT1NfHxjW2YrNF0hPT1TfHxjW2YrNV0hPT1BPyhjW2YrMF09YixjW2YrMV09eCxjW2YrMl09bSxjW2YrM109TSxjW2YrNF09UyxjW2YrNV09QSwhMCk6ITF9ZWxzZXtjb25zdCBnPV90KGYpLHc9enQoZixvKTtsZXQgYj1wLHg9ITEsbT0hMTtpZih0KXtpZighYil7Y29uc3QgVD1nL010K2QvTnQsej13L010K2QvTnQ7eD10LmhhcyhUKSxtPXQuaGFzKHopLGI9IXgmJiFtfX1lbHNlIHg9ITAsbT0hMDtjb25zdCBNPWJ8fHgsUz1ifHxtO2xldCBBPSExO00mJihBPXUoZyxkLGIpKTtsZXQgdj0hMTtTJiYodj11KHcsZCxiKSk7Y29uc3QgXz1BfHx2O2lmKF8pZm9yKGxldCBUPTA7VDwzO1QrKyl7Y29uc3Qgej1nK1QsQz13K1QsQj1jW3pdLEY9Y1t6KzNdLEU9Y1tDXSxJPWNbQyszXTtjW2YrVF09QjxFP0I6RSxjW2YrVCszXT1GPkk/RjpJfXJldHVybiBffX19ZnVuY3Rpb24gY24oaSx0LGUsbixzKXtsZXQgcixvLGEsYyxsLGg7Y29uc3QgdT0xL2UuZGlyZWN0aW9uLngsZj0xL2UuZGlyZWN0aW9uLnksZD0xL2UuZGlyZWN0aW9uLnoscD1lLm9yaWdpbi54LHk9ZS5vcmlnaW4ueSxnPWUub3JpZ2luLno7bGV0IHc9dFtpXSxiPXRbaSszXSx4PXRbaSsxXSxtPXRbaSszKzFdLE09dFtpKzJdLFM9dFtpKzMrMl07cmV0dXJuIHU+PTA/KHI9KHctcCkqdSxvPShiLXApKnUpOihyPShiLXApKnUsbz0ody1wKSp1KSxmPj0wPyhhPSh4LXkpKmYsYz0obS15KSpmKTooYT0obS15KSpmLGM9KHgteSkqZikscj5jfHxhPm98fCgoYT5yfHxpc05hTihyKSkmJihyPWEpLChjPG98fGlzTmFOKG8pKSYmKG89YyksZD49MD8obD0oTS1nKSpkLGg9KFMtZykqZCk6KGw9KFMtZykqZCxoPShNLWcpKmQpLHI+aHx8bD5vKT8hMTooKGw+cnx8ciE9PXIpJiYocj1sKSwoaDxvfHxvIT09bykmJihvPWgpLHI8PXMmJm8+PW4pfWZ1bmN0aW9uIEdkKGksdCxlLG4scyxyLG8sYSl7Y29uc3R7Z2VvbWV0cnk6YyxfaW5kaXJlY3RCdWZmZXI6bH09aTtmb3IobGV0IGg9bix1PW4rcztoPHU7aCsrKXtsZXQgZj1sP2xbaF06aDtXcyhjLHQsZSxmLHIsbyxhKX19ZnVuY3Rpb24gSGQoaSx0LGUsbixzLHIsbyl7Y29uc3R7Z2VvbWV0cnk6YSxfaW5kaXJlY3RCdWZmZXI6Y309aTtsZXQgbD0xLzAsaD1udWxsO2ZvcihsZXQgdT1uLGY9bitzO3U8Zjt1Kyspe2xldCBkO2Q9V3MoYSx0LGUsYz9jW3VdOnUsbnVsbCxyLG8pLGQmJmQuZGlzdGFuY2U8bCYmKGg9ZCxsPWQuZGlzdGFuY2UpfXJldHVybiBofWZ1bmN0aW9uIEpkKGksdCxlLG4scyxyLG8pe2NvbnN0e2dlb21ldHJ5OmF9PWUse2luZGV4OmN9PWEsbD1hLmF0dHJpYnV0ZXMucG9zaXRpb247Zm9yKGxldCBoPWksdT10K2k7aDx1O2grKyl7bGV0IGY7aWYoZj1lLnJlc29sdmVUcmlhbmdsZUluZGV4KGgpLHl0KG8sZiozLGMsbCksby5uZWVkc1VwZGF0ZT0hMCxuKG8sZixzLHIpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIFlkKGksdCxlLG4scyxyLG8pe250LnNldEJ1ZmZlcihpLl9yb290c1t0XSkscmEoMCxpLGUsbixzLHIsbyksbnQuY2xlYXJCdWZmZXIoKX1mdW5jdGlvbiByYShpLHQsZSxuLHMscixvKXtjb25zdHtmbG9hdDMyQXJyYXk6YSx1aW50MTZBcnJheTpjLHVpbnQzMkFycmF5Omx9PW50LGg9aSoyO2lmKEF0KGgsYykpe2NvbnN0IGY9WXQoaSxsKSxkPWxlKGgsYyk7cWQodCxlLG4sZixkLHMscixvKX1lbHNle2NvbnN0IGY9X3QoaSk7Y24oZixhLG4scixvKSYmcmEoZix0LGUsbixzLHIsbyk7Y29uc3QgZD16dChpLGwpO2NuKGQsYSxuLHIsbykmJnJhKGQsdCxlLG4scyxyLG8pfX1jb25zdCBqZD1bIngiLCJ5IiwieiJdO2Z1bmN0aW9uIFFkKGksdCxlLG4scyxyKXtudC5zZXRCdWZmZXIoaS5fcm9vdHNbdF0pO2NvbnN0IG89b2EoMCxpLGUsbixzLHIpO3JldHVybiBudC5jbGVhckJ1ZmZlcigpLG99ZnVuY3Rpb24gb2EoaSx0LGUsbixzLHIpe2NvbnN0e2Zsb2F0MzJBcnJheTpvLHVpbnQxNkFycmF5OmEsdWludDMyQXJyYXk6Y309bnQ7bGV0IGw9aSoyO2lmKEF0KGwsYSkpe2NvbnN0IHU9WXQoaSxjKSxmPWxlKGwsYSk7cmV0dXJuIFhkKHQsZSxuLHUsZixzLHIpfWVsc2V7Y29uc3QgdT1uYShpLGMpLGY9amRbdV0scD1uLmRpcmVjdGlvbltmXT49MDtsZXQgeSxnO3A/KHk9X3QoaSksZz16dChpLGMpKTooeT16dChpLGMpLGc9X3QoaSkpO2NvbnN0IGI9Y24oeSxvLG4scyxyKT9vYSh5LHQsZSxuLHMscik6bnVsbDtpZihiKXtjb25zdCBNPWIucG9pbnRbZl07aWYocD9NPD1vW2crdV06TT49b1tnK3UrM10pcmV0dXJuIGJ9Y29uc3QgbT1jbihnLG8sbixzLHIpP29hKGcsdCxlLG4scyxyKTpudWxsO3JldHVybiBiJiZtP2IuZGlzdGFuY2U8PW0uZGlzdGFuY2U/YjptOmJ8fG18fG51bGx9fWNvbnN0IEdzPW5ldyBndCxzaT1uZXcgYWUscmk9bmV3IGFlLFZpPW5ldyBzdCxJbD1uZXcga3QsSHM9bmV3IGt0O2Z1bmN0aW9uIEtkKGksdCxlLG4pe250LnNldEJ1ZmZlcihpLl9yb290c1t0XSk7Y29uc3Qgcz1hYSgwLGksZSxuKTtyZXR1cm4gbnQuY2xlYXJCdWZmZXIoKSxzfWZ1bmN0aW9uIGFhKGksdCxlLG4scz1udWxsKXtjb25zdHtmbG9hdDMyQXJyYXk6cix1aW50MTZBcnJheTpvLHVpbnQzMkFycmF5OmF9PW50O2xldCBjPWkqMjtpZihzPT09bnVsbCYmKGUuYm91bmRpbmdCb3h8fGUuY29tcHV0ZUJvdW5kaW5nQm94KCksSWwuc2V0KGUuYm91bmRpbmdCb3gubWluLGUuYm91bmRpbmdCb3gubWF4LG4pLHM9SWwpLEF0KGMsbykpe2NvbnN0IGg9dC5nZW9tZXRyeSx1PWguaW5kZXgsZj1oLmF0dHJpYnV0ZXMucG9zaXRpb24sZD1lLmluZGV4LHA9ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uLHk9WXQoaSxhKSxnPWxlKGMsbyk7aWYoVmkuY29weShuKS5pbnZlcnQoKSxlLmJvdW5kc1RyZWUpcmV0dXJuIGh0KGkscixIcyksSHMubWF0cml4LmNvcHkoVmkpLEhzLm5lZWRzVXBkYXRlPSEwLGUuYm91bmRzVHJlZS5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6Yj0+SHMuaW50ZXJzZWN0c0JveChiKSxpbnRlcnNlY3RzVHJpYW5nbGU6Yj0+e2IuYS5hcHBseU1hdHJpeDQobiksYi5iLmFwcGx5TWF0cml4NChuKSxiLmMuYXBwbHlNYXRyaXg0KG4pLGIubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCB4PXkqMyxtPShnK3kpKjM7eDxtO3grPTMpaWYoeXQocmkseCx1LGYpLHJpLm5lZWRzVXBkYXRlPSEwLGIuaW50ZXJzZWN0c1RyaWFuZ2xlKHJpKSlyZXR1cm4hMDtyZXR1cm4hMX19KTt7Y29uc3Qgdz1BbihlKTtmb3IobGV0IGI9eSozLHg9KGcreSkqMztiPHg7Yis9Myl7eXQoc2ksYix1LGYpLHNpLmEuYXBwbHlNYXRyaXg0KFZpKSxzaS5iLmFwcGx5TWF0cml4NChWaSksc2kuYy5hcHBseU1hdHJpeDQoVmkpLHNpLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgbT0wLE09dyozO208TTttKz0zKWlmKHl0KHJpLG0sZCxwKSxyaS5uZWVkc1VwZGF0ZT0hMCxzaS5pbnRlcnNlY3RzVHJpYW5nbGUocmkpKXJldHVybiEwfX19ZWxzZXtjb25zdCBoPV90KGkpLHU9enQoaSxhKTtyZXR1cm4gaHQoaCxyLEdzKSwhIShzLmludGVyc2VjdHNCb3goR3MpJiZhYShoLHQsZSxuLHMpfHwoaHQodSxyLEdzKSxzLmludGVyc2VjdHNCb3goR3MpJiZhYSh1LHQsZSxuLHMpKSl9fWNvbnN0IEpzPW5ldyBzdCxjYT1uZXcga3QsVWk9bmV3IGt0LHQwPW5ldyBQLGUwPW5ldyBQLG4wPW5ldyBQLGkwPW5ldyBQO2Z1bmN0aW9uIHMwKGksdCxlLG49e30scz17fSxyPTAsbz0xLzApe3QuYm91bmRpbmdCb3h8fHQuY29tcHV0ZUJvdW5kaW5nQm94KCksY2Euc2V0KHQuYm91bmRpbmdCb3gubWluLHQuYm91bmRpbmdCb3gubWF4LGUpLGNhLm5lZWRzVXBkYXRlPSEwO2NvbnN0IGE9aS5nZW9tZXRyeSxjPWEuYXR0cmlidXRlcy5wb3NpdGlvbixsPWEuaW5kZXgsaD10LmF0dHJpYnV0ZXMucG9zaXRpb24sdT10LmluZGV4LGY9Y2UuZ2V0UHJpbWl0aXZlKCksZD1jZS5nZXRQcmltaXRpdmUoKTtsZXQgcD10MCx5PWUwLGc9bnVsbCx3PW51bGw7cyYmKGc9bjAsdz1pMCk7bGV0IGI9MS8wLHg9bnVsbCxtPW51bGw7cmV0dXJuIEpzLmNvcHkoZSkuaW52ZXJ0KCksVWkubWF0cml4LmNvcHkoSnMpLGkuc2hhcGVjYXN0KHtib3VuZHNUcmF2ZXJzZU9yZGVyOk09PmNhLmRpc3RhbmNlVG9Cb3goTSksaW50ZXJzZWN0c0JvdW5kczooTSxTLEEpPT5BPGImJkE8bz8oUyYmKFVpLm1pbi5jb3B5KE0ubWluKSxVaS5tYXguY29weShNLm1heCksVWkubmVlZHNVcGRhdGU9ITApLCEwKTohMSxpbnRlcnNlY3RzUmFuZ2U6KE0sUyk9PntpZih0LmJvdW5kc1RyZWUpcmV0dXJuIHQuYm91bmRzVHJlZS5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6dj0+VWkuZGlzdGFuY2VUb0JveCh2KSxpbnRlcnNlY3RzQm91bmRzOih2LF8sVCk9PlQ8YiYmVDxvLGludGVyc2VjdHNSYW5nZToodixfKT0+e2ZvcihsZXQgVD12LHo9ditfO1Q8ejtUKyspe3l0KGQsMypULHUsaCksZC5hLmFwcGx5TWF0cml4NChlKSxkLmIuYXBwbHlNYXRyaXg0KGUpLGQuYy5hcHBseU1hdHJpeDQoZSksZC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IEM9TSxCPU0rUztDPEI7QysrKXt5dChmLDMqQyxsLGMpLGYubmVlZHNVcGRhdGU9ITA7Y29uc3QgRj1mLmRpc3RhbmNlVG9UcmlhbmdsZShkLHAsZyk7aWYoRjxiJiYoeS5jb3B5KHApLHcmJncuY29weShnKSxiPUYseD1DLG09VCksRjxyKXJldHVybiEwfX19fSk7e2NvbnN0IEE9QW4odCk7Zm9yKGxldCB2PTAsXz1BO3Y8Xzt2Kyspe3l0KGQsMyp2LHUsaCksZC5hLmFwcGx5TWF0cml4NChlKSxkLmIuYXBwbHlNYXRyaXg0KGUpLGQuYy5hcHBseU1hdHJpeDQoZSksZC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IFQ9TSx6PU0rUztUPHo7VCsrKXt5dChmLDMqVCxsLGMpLGYubmVlZHNVcGRhdGU9ITA7Y29uc3QgQz1mLmRpc3RhbmNlVG9UcmlhbmdsZShkLHAsZyk7aWYoQzxiJiYoeS5jb3B5KHApLHcmJncuY29weShnKSxiPUMseD1ULG09diksQzxyKXJldHVybiEwfX19fX0pLGNlLnJlbGVhc2VQcmltaXRpdmUoZiksY2UucmVsZWFzZVByaW1pdGl2ZShkKSxiPT09MS8wP251bGw6KG4ucG9pbnQ/bi5wb2ludC5jb3B5KHkpOm4ucG9pbnQ9eS5jbG9uZSgpLG4uZGlzdGFuY2U9YixuLmZhY2VJbmRleD14LHMmJihzLnBvaW50P3MucG9pbnQuY29weSh3KTpzLnBvaW50PXcuY2xvbmUoKSxzLnBvaW50LmFwcGx5TWF0cml4NChKcykseS5hcHBseU1hdHJpeDQoSnMpLHMuZGlzdGFuY2U9eS5zdWIocy5wb2ludCkubGVuZ3RoKCkscy5mYWNlSW5kZXg9bSksbil9ZnVuY3Rpb24gcjAoaSx0PW51bGwpe3QmJkFycmF5LmlzQXJyYXkodCkmJih0PW5ldyBTZXQodCkpO2NvbnN0IGU9aS5nZW9tZXRyeSxuPWUuaW5kZXg/ZS5pbmRleC5hcnJheTpudWxsLHM9ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2xldCByLG8sYSxjLGw9MDtjb25zdCBoPWkuX3Jvb3RzO2ZvcihsZXQgZj0wLGQ9aC5sZW5ndGg7ZjxkO2YrKylyPWhbZl0sbz1uZXcgVWludDMyQXJyYXkociksYT1uZXcgVWludDE2QXJyYXkociksYz1uZXcgRmxvYXQzMkFycmF5KHIpLHUoMCxsKSxsKz1yLmJ5dGVMZW5ndGg7ZnVuY3Rpb24gdShmLGQscD0hMSl7Y29uc3QgeT1mKjI7aWYoQXQoeSxhKSl7Y29uc3QgZz1vW2YrNl0sdz1hW3krMTRdO2xldCBiPTEvMCx4PTEvMCxtPTEvMCxNPS0xLzAsUz0tMS8wLEE9LTEvMDtmb3IobGV0IHY9ZyxfPWcrdzt2PF87disrKXtjb25zdCBUPTMqaS5yZXNvbHZlVHJpYW5nbGVJbmRleCh2KTtmb3IobGV0IHo9MDt6PDM7eisrKXtsZXQgQz1UK3o7Qz1uP25bQ106Qztjb25zdCBCPXMuZ2V0WChDKSxGPXMuZ2V0WShDKSxFPXMuZ2V0WihDKTtCPGImJihiPUIpLEI+TSYmKE09QiksRjx4JiYoeD1GKSxGPlMmJihTPUYpLEU8bSYmKG09RSksRT5BJiYoQT1FKX19cmV0dXJuIGNbZiswXSE9PWJ8fGNbZisxXSE9PXh8fGNbZisyXSE9PW18fGNbZiszXSE9PU18fGNbZis0XSE9PVN8fGNbZis1XSE9PUE/KGNbZiswXT1iLGNbZisxXT14LGNbZisyXT1tLGNbZiszXT1NLGNbZis0XT1TLGNbZis1XT1BLCEwKTohMX1lbHNle2NvbnN0IGc9X3QoZiksdz16dChmLG8pO2xldCBiPXAseD0hMSxtPSExO2lmKHQpe2lmKCFiKXtjb25zdCBUPWcvTXQrZC9OdCx6PXcvTXQrZC9OdDt4PXQuaGFzKFQpLG09dC5oYXMoeiksYj0heCYmIW19fWVsc2UgeD0hMCxtPSEwO2NvbnN0IE09Ynx8eCxTPWJ8fG07bGV0IEE9ITE7TSYmKEE9dShnLGQsYikpO2xldCB2PSExO1MmJih2PXUodyxkLGIpKTtjb25zdCBfPUF8fHY7aWYoXylmb3IobGV0IFQ9MDtUPDM7VCsrKXtjb25zdCB6PWcrVCxDPXcrVCxCPWNbel0sRj1jW3orM10sRT1jW0NdLEk9Y1tDKzNdO2NbZitUXT1CPEU/QjpFLGNbZitUKzNdPUY+ST9GOkl9cmV0dXJuIF99fX1mdW5jdGlvbiBvMChpLHQsZSxuLHMscixvKXtudC5zZXRCdWZmZXIoaS5fcm9vdHNbdF0pLGxhKDAsaSxlLG4scyxyLG8pLG50LmNsZWFyQnVmZmVyKCl9ZnVuY3Rpb24gbGEoaSx0LGUsbixzLHIsbyl7Y29uc3R7ZmxvYXQzMkFycmF5OmEsdWludDE2QXJyYXk6Yyx1aW50MzJBcnJheTpsfT1udCxoPWkqMjtpZihBdChoLGMpKXtjb25zdCBmPVl0KGksbCksZD1sZShoLGMpO0dkKHQsZSxuLGYsZCxzLHIsbyl9ZWxzZXtjb25zdCBmPV90KGkpO2NuKGYsYSxuLHIsbykmJmxhKGYsdCxlLG4scyxyLG8pO2NvbnN0IGQ9enQoaSxsKTtjbihkLGEsbixyLG8pJiZsYShkLHQsZSxuLHMscixvKX19Y29uc3QgYTA9WyJ4IiwieSIsInoiXTtmdW5jdGlvbiBjMChpLHQsZSxuLHMscil7bnQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKTtjb25zdCBvPWhhKDAsaSxlLG4scyxyKTtyZXR1cm4gbnQuY2xlYXJCdWZmZXIoKSxvfWZ1bmN0aW9uIGhhKGksdCxlLG4scyxyKXtjb25zdHtmbG9hdDMyQXJyYXk6byx1aW50MTZBcnJheTphLHVpbnQzMkFycmF5OmN9PW50O2xldCBsPWkqMjtpZihBdChsLGEpKXtjb25zdCB1PVl0KGksYyksZj1sZShsLGEpO3JldHVybiBIZCh0LGUsbix1LGYscyxyKX1lbHNle2NvbnN0IHU9bmEoaSxjKSxmPWEwW3VdLHA9bi5kaXJlY3Rpb25bZl0+PTA7bGV0IHksZztwPyh5PV90KGkpLGc9enQoaSxjKSk6KHk9enQoaSxjKSxnPV90KGkpKTtjb25zdCBiPWNuKHksbyxuLHMscik/aGEoeSx0LGUsbixzLHIpOm51bGw7aWYoYil7Y29uc3QgTT1iLnBvaW50W2ZdO2lmKHA/TTw9b1tnK3VdOk0+PW9bZyt1KzNdKXJldHVybiBifWNvbnN0IG09Y24oZyxvLG4scyxyKT9oYShnLHQsZSxuLHMscik6bnVsbDtyZXR1cm4gYiYmbT9iLmRpc3RhbmNlPD1tLmRpc3RhbmNlP2I6bTpifHxtfHxudWxsfX1jb25zdCBZcz1uZXcgZ3Qsb2k9bmV3IGFlLGFpPW5ldyBhZSxxaT1uZXcgc3QsTmw9bmV3IGt0LGpzPW5ldyBrdDtmdW5jdGlvbiBsMChpLHQsZSxuKXtudC5zZXRCdWZmZXIoaS5fcm9vdHNbdF0pO2NvbnN0IHM9dWEoMCxpLGUsbik7cmV0dXJuIG50LmNsZWFyQnVmZmVyKCksc31mdW5jdGlvbiB1YShpLHQsZSxuLHM9bnVsbCl7Y29uc3R7ZmxvYXQzMkFycmF5OnIsdWludDE2QXJyYXk6byx1aW50MzJBcnJheTphfT1udDtsZXQgYz1pKjI7aWYocz09PW51bGwmJihlLmJvdW5kaW5nQm94fHxlLmNvbXB1dGVCb3VuZGluZ0JveCgpLE5sLnNldChlLmJvdW5kaW5nQm94Lm1pbixlLmJvdW5kaW5nQm94Lm1heCxuKSxzPU5sKSxBdChjLG8pKXtjb25zdCBoPXQuZ2VvbWV0cnksdT1oLmluZGV4LGY9aC5hdHRyaWJ1dGVzLnBvc2l0aW9uLGQ9ZS5pbmRleCxwPWUuYXR0cmlidXRlcy5wb3NpdGlvbix5PVl0KGksYSksZz1sZShjLG8pO2lmKHFpLmNvcHkobikuaW52ZXJ0KCksZS5ib3VuZHNUcmVlKXJldHVybiBodChpLHIsanMpLGpzLm1hdHJpeC5jb3B5KHFpKSxqcy5uZWVkc1VwZGF0ZT0hMCxlLmJvdW5kc1RyZWUuc2hhcGVjYXN0KHtpbnRlcnNlY3RzQm91bmRzOmI9PmpzLmludGVyc2VjdHNCb3goYiksaW50ZXJzZWN0c1RyaWFuZ2xlOmI9PntiLmEuYXBwbHlNYXRyaXg0KG4pLGIuYi5hcHBseU1hdHJpeDQobiksYi5jLmFwcGx5TWF0cml4NChuKSxiLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgeD15LG09Zyt5O3g8bTt4KyspaWYoeXQoYWksMyp0LnJlc29sdmVUcmlhbmdsZUluZGV4KHgpLHUsZiksYWkubmVlZHNVcGRhdGU9ITAsYi5pbnRlcnNlY3RzVHJpYW5nbGUoYWkpKXJldHVybiEwO3JldHVybiExfX0pO3tjb25zdCB3PUFuKGUpO2ZvcihsZXQgYj15LHg9Zyt5O2I8eDtiKyspe2NvbnN0IG09dC5yZXNvbHZlVHJpYW5nbGVJbmRleChiKTt5dChvaSwzKm0sdSxmKSxvaS5hLmFwcGx5TWF0cml4NChxaSksb2kuYi5hcHBseU1hdHJpeDQocWkpLG9pLmMuYXBwbHlNYXRyaXg0KHFpKSxvaS5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IE09MCxTPXcqMztNPFM7TSs9MylpZih5dChhaSxNLGQscCksYWkubmVlZHNVcGRhdGU9ITAsb2kuaW50ZXJzZWN0c1RyaWFuZ2xlKGFpKSlyZXR1cm4hMH19fWVsc2V7Y29uc3QgaD1fdChpKSx1PXp0KGksYSk7cmV0dXJuIGh0KGgscixZcyksISEocy5pbnRlcnNlY3RzQm94KFlzKSYmdWEoaCx0LGUsbixzKXx8KGh0KHUscixZcykscy5pbnRlcnNlY3RzQm94KFlzKSYmdWEodSx0LGUsbixzKSkpfX1jb25zdCBRcz1uZXcgc3QsZmE9bmV3IGt0LFhpPW5ldyBrdCxoMD1uZXcgUCx1MD1uZXcgUCxmMD1uZXcgUCxkMD1uZXcgUDtmdW5jdGlvbiBwMChpLHQsZSxuPXt9LHM9e30scj0wLG89MS8wKXt0LmJvdW5kaW5nQm94fHx0LmNvbXB1dGVCb3VuZGluZ0JveCgpLGZhLnNldCh0LmJvdW5kaW5nQm94Lm1pbix0LmJvdW5kaW5nQm94Lm1heCxlKSxmYS5uZWVkc1VwZGF0ZT0hMDtjb25zdCBhPWkuZ2VvbWV0cnksYz1hLmF0dHJpYnV0ZXMucG9zaXRpb24sbD1hLmluZGV4LGg9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLHU9dC5pbmRleCxmPWNlLmdldFByaW1pdGl2ZSgpLGQ9Y2UuZ2V0UHJpbWl0aXZlKCk7bGV0IHA9aDAseT11MCxnPW51bGwsdz1udWxsO3MmJihnPWYwLHc9ZDApO2xldCBiPTEvMCx4PW51bGwsbT1udWxsO3JldHVybiBRcy5jb3B5KGUpLmludmVydCgpLFhpLm1hdHJpeC5jb3B5KFFzKSxpLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpNPT5mYS5kaXN0YW5jZVRvQm94KE0pLGludGVyc2VjdHNCb3VuZHM6KE0sUyxBKT0+QTxiJiZBPG8/KFMmJihYaS5taW4uY29weShNLm1pbiksWGkubWF4LmNvcHkoTS5tYXgpLFhpLm5lZWRzVXBkYXRlPSEwKSwhMCk6ITEsaW50ZXJzZWN0c1JhbmdlOihNLFMpPT57aWYodC5ib3VuZHNUcmVlKXtjb25zdCBBPXQuYm91bmRzVHJlZTtyZXR1cm4gQS5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6dj0+WGkuZGlzdGFuY2VUb0JveCh2KSxpbnRlcnNlY3RzQm91bmRzOih2LF8sVCk9PlQ8YiYmVDxvLGludGVyc2VjdHNSYW5nZToodixfKT0+e2ZvcihsZXQgVD12LHo9ditfO1Q8ejtUKyspe2NvbnN0IEM9QS5yZXNvbHZlVHJpYW5nbGVJbmRleChUKTt5dChkLDMqQyx1LGgpLGQuYS5hcHBseU1hdHJpeDQoZSksZC5iLmFwcGx5TWF0cml4NChlKSxkLmMuYXBwbHlNYXRyaXg0KGUpLGQubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBCPU0sRj1NK1M7QjxGO0IrKyl7Y29uc3QgRT1pLnJlc29sdmVUcmlhbmdsZUluZGV4KEIpO3l0KGYsMypFLGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBJPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxnKTtpZihJPGImJih5LmNvcHkocCksdyYmdy5jb3B5KGcpLGI9SSx4PUIsbT1UKSxJPHIpcmV0dXJuITB9fX19KX1lbHNle2NvbnN0IEE9QW4odCk7Zm9yKGxldCB2PTAsXz1BO3Y8Xzt2Kyspe3l0KGQsMyp2LHUsaCksZC5hLmFwcGx5TWF0cml4NChlKSxkLmIuYXBwbHlNYXRyaXg0KGUpLGQuYy5hcHBseU1hdHJpeDQoZSksZC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IFQ9TSx6PU0rUztUPHo7VCsrKXtjb25zdCBDPWkucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoVCk7eXQoZiwzKkMsbCxjKSxmLm5lZWRzVXBkYXRlPSEwO2NvbnN0IEI9Zi5kaXN0YW5jZVRvVHJpYW5nbGUoZCxwLGcpO2lmKEI8YiYmKHkuY29weShwKSx3JiZ3LmNvcHkoZyksYj1CLHg9VCxtPXYpLEI8cilyZXR1cm4hMH19fX19KSxjZS5yZWxlYXNlUHJpbWl0aXZlKGYpLGNlLnJlbGVhc2VQcmltaXRpdmUoZCksYj09PTEvMD9udWxsOihuLnBvaW50P24ucG9pbnQuY29weSh5KTpuLnBvaW50PXkuY2xvbmUoKSxuLmRpc3RhbmNlPWIsbi5mYWNlSW5kZXg9eCxzJiYocy5wb2ludD9zLnBvaW50LmNvcHkodyk6cy5wb2ludD13LmNsb25lKCkscy5wb2ludC5hcHBseU1hdHJpeDQoUXMpLHkuYXBwbHlNYXRyaXg0KFFzKSxzLmRpc3RhbmNlPXkuc3ViKHMucG9pbnQpLmxlbmd0aCgpLHMuZmFjZUluZGV4PW0pLG4pfWZ1bmN0aW9uIHkwKCl7cmV0dXJuIHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciE9InVuZGVmaW5lZCJ9Y29uc3QgWmk9bmV3IG50LmNvbnN0cnVjdG9yLEtzPW5ldyBudC5jb25zdHJ1Y3Rvcixsbj1uZXcgZWEoKCk9Pm5ldyBndCksY2k9bmV3IGd0LGxpPW5ldyBndCxkYT1uZXcgZ3QscGE9bmV3IGd0O2xldCB5YT0hMTtmdW5jdGlvbiBtMChpLHQsZSxuKXtpZih5YSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IFJlY3Vyc2l2ZSBjYWxscyB0byBidmhjYXN0IG5vdCBzdXBwb3J0ZWQuIik7eWE9ITA7Y29uc3Qgcz1pLl9yb290cyxyPXQuX3Jvb3RzO2xldCBvLGE9MCxjPTA7Y29uc3QgbD1uZXcgc3QoKS5jb3B5KGUpLmludmVydCgpO2ZvcihsZXQgaD0wLHU9cy5sZW5ndGg7aDx1O2grKyl7Wmkuc2V0QnVmZmVyKHNbaF0pLGM9MDtjb25zdCBmPWxuLmdldFByaW1pdGl2ZSgpO2h0KDAsWmkuZmxvYXQzMkFycmF5LGYpLGYuYXBwbHlNYXRyaXg0KGwpO2ZvcihsZXQgZD0wLHA9ci5sZW5ndGg7ZDxwJiYoS3Muc2V0QnVmZmVyKHJbZF0pLG89Z2UoMCwwLGUsbCxuLGEsYywwLDAsZiksS3MuY2xlYXJCdWZmZXIoKSxjKz1yW2RdLmJ5dGVMZW5ndGgvTnQsIW8pO2QrKyk7aWYobG4ucmVsZWFzZVByaW1pdGl2ZShmKSxaaS5jbGVhckJ1ZmZlcigpLGErPXNbaF0uYnl0ZUxlbmd0aC9OdCxvKWJyZWFrfXJldHVybiB5YT0hMSxvfWZ1bmN0aW9uIGdlKGksdCxlLG4scyxyPTAsbz0wLGE9MCxjPTAsbD1udWxsLGg9ITEpe2xldCB1LGY7aD8odT1LcyxmPVppKToodT1aaSxmPUtzKTtjb25zdCBkPXUuZmxvYXQzMkFycmF5LHA9dS51aW50MzJBcnJheSx5PXUudWludDE2QXJyYXksZz1mLmZsb2F0MzJBcnJheSx3PWYudWludDMyQXJyYXksYj1mLnVpbnQxNkFycmF5LHg9aSoyLG09dCoyLE09QXQoeCx5KSxTPUF0KG0sYik7bGV0IEE9ITE7aWYoUyYmTSloP0E9cyhZdCh0LHcpLGxlKHQqMixiKSxZdChpLHApLGxlKGkqMix5KSxjLG8rdC9NdCxhLHIraS9NdCk6QT1zKFl0KGkscCksbGUoaSoyLHkpLFl0KHQsdyksbGUodCoyLGIpLGEscitpL010LGMsbyt0L010KTtlbHNlIGlmKFMpe2NvbnN0IHY9bG4uZ2V0UHJpbWl0aXZlKCk7aHQodCxnLHYpLHYuYXBwbHlNYXRyaXg0KGUpO2NvbnN0IF89X3QoaSksVD16dChpLHApO2h0KF8sZCxjaSksaHQoVCxkLGxpKTtjb25zdCB6PXYuaW50ZXJzZWN0c0JveChjaSksQz12LmludGVyc2VjdHNCb3gobGkpO0E9eiYmZ2UodCxfLG4sZSxzLG8scixjLGErMSx2LCFoKXx8QyYmZ2UodCxULG4sZSxzLG8scixjLGErMSx2LCFoKSxsbi5yZWxlYXNlUHJpbWl0aXZlKHYpfWVsc2V7Y29uc3Qgdj1fdCh0KSxfPXp0KHQsdyk7aHQodixnLGRhKSxodChfLGcscGEpO2NvbnN0IFQ9bC5pbnRlcnNlY3RzQm94KGRhKSx6PWwuaW50ZXJzZWN0c0JveChwYSk7aWYoVCYmeilBPWdlKGksdixlLG4scyxyLG8sYSxjKzEsbCxoKXx8Z2UoaSxfLGUsbixzLHIsbyxhLGMrMSxsLGgpO2Vsc2UgaWYoVClpZihNKUE9Z2UoaSx2LGUsbixzLHIsbyxhLGMrMSxsLGgpO2Vsc2V7Y29uc3QgQz1sbi5nZXRQcmltaXRpdmUoKTtDLmNvcHkoZGEpLmFwcGx5TWF0cml4NChlKTtjb25zdCBCPV90KGkpLEY9enQoaSxwKTtodChCLGQsY2kpLGh0KEYsZCxsaSk7Y29uc3QgRT1DLmludGVyc2VjdHNCb3goY2kpLEk9Qy5pbnRlcnNlY3RzQm94KGxpKTtBPUUmJmdlKHYsQixuLGUscyxvLHIsYyxhKzEsQywhaCl8fEkmJmdlKHYsRixuLGUscyxvLHIsYyxhKzEsQywhaCksbG4ucmVsZWFzZVByaW1pdGl2ZShDKX1lbHNlIGlmKHopaWYoTSlBPWdlKGksXyxlLG4scyxyLG8sYSxjKzEsbCxoKTtlbHNle2NvbnN0IEM9bG4uZ2V0UHJpbWl0aXZlKCk7Qy5jb3B5KHBhKS5hcHBseU1hdHJpeDQoZSk7Y29uc3QgQj1fdChpKSxGPXp0KGkscCk7aHQoQixkLGNpKSxodChGLGQsbGkpO2NvbnN0IEU9Qy5pbnRlcnNlY3RzQm94KGNpKSxJPUMuaW50ZXJzZWN0c0JveChsaSk7QT1FJiZnZShfLEIsbixlLHMsbyxyLGMsYSsxLEMsIWgpfHxJJiZnZShfLEYsbixlLHMsbyxyLGMsYSsxLEMsIWgpLGxuLnJlbGVhc2VQcmltaXRpdmUoQyl9fXJldHVybiBBfWNvbnN0IHRyPW5ldyBrdCxrbD1uZXcgZ3QsZzA9e3N0cmF0ZWd5OnlsLG1heERlcHRoOjQwLG1heExlYWZUcmlzOjEwLHVzZVNoYXJlZEFycmF5QnVmZmVyOiExLHNldEJvdW5kaW5nQm94OiEwLG9uUHJvZ3Jlc3M6bnVsbCxpbmRpcmVjdDohMSx2ZXJib3NlOiEwLHJhbmdlOm51bGx9O2NsYXNzIG1he3N0YXRpYyBzZXJpYWxpemUodCxlPXt9KXtlPVZ0KHtjbG9uZUJ1ZmZlcnM6ITB9LGUpO2NvbnN0IG49dC5nZW9tZXRyeSxzPXQuX3Jvb3RzLHI9dC5faW5kaXJlY3RCdWZmZXIsbz1uLmdldEluZGV4KCksYT17dmVyc2lvbjoxLHJvb3RzOm51bGwsaW5kZXg6bnVsbCxpbmRpcmVjdEJ1ZmZlcjpudWxsfTtyZXR1cm4gZS5jbG9uZUJ1ZmZlcnM/KGEucm9vdHM9cy5tYXAoYz0+Yy5zbGljZSgpKSxhLmluZGV4PW8/by5hcnJheS5zbGljZSgpOm51bGwsYS5pbmRpcmVjdEJ1ZmZlcj1yP3Iuc2xpY2UoKTpudWxsKTooYS5yb290cz1zLGEuaW5kZXg9bz9vLmFycmF5Om51bGwsYS5pbmRpcmVjdEJ1ZmZlcj1yKSxhfXN0YXRpYyBkZXNlcmlhbGl6ZSh0LGUsbj17fSl7bj1WdCh7c2V0SW5kZXg6ITAsaW5kaXJlY3Q6ISF0LmluZGlyZWN0QnVmZmVyfSxuKTtjb25zdHtpbmRleDpzLHJvb3RzOnIsaW5kaXJlY3RCdWZmZXI6b309dDt0LnZlcnNpb258fChjb25zb2xlLndhcm4oIk1lc2hCVkguZGVzZXJpYWxpemU6IFNlcmlhbGl6YXRpb24gZm9ybWF0IGhhcyBiZWVuIGNoYW5nZWQgYW5kIHdpbGwgYmUgZml4ZWQgdXAuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHJlZ2VuZXJhdGUgYW55IHN0b3JlZCBzZXJpYWxpemVkIGRhdGEuIiksYyhyKSk7Y29uc3QgYT1uZXcgbWEoZSxLZShWdCh7fSxuKSx7W0hvXTohMH0pKTtpZihhLl9yb290cz1yLGEuX2luZGlyZWN0QnVmZmVyPW98fG51bGwsbi5zZXRJbmRleCl7Y29uc3QgbD1lLmdldEluZGV4KCk7aWYobD09PW51bGwpe2NvbnN0IGg9bmV3IHh0KHQuaW5kZXgsMSwhMSk7ZS5zZXRJbmRleChoKX1lbHNlIGwuYXJyYXkhPT1zJiYobC5hcnJheS5zZXQocyksbC5uZWVkc1VwZGF0ZT0hMCl9cmV0dXJuIGE7ZnVuY3Rpb24gYyhsKXtmb3IobGV0IGg9MDtoPGwubGVuZ3RoO2grKyl7Y29uc3QgdT1sW2hdLGY9bmV3IFVpbnQzMkFycmF5KHUpLGQ9bmV3IFVpbnQxNkFycmF5KHUpO2ZvcihsZXQgcD0wLHk9dS5ieXRlTGVuZ3RoL050O3A8eTtwKyspe2NvbnN0IGc9TXQqcCx3PTIqZztBdCh3LGQpfHwoZltnKzZdPWZbZys2XS9NdC1wKX19fX1nZXQgaW5kaXJlY3QoKXtyZXR1cm4hIXRoaXMuX2luZGlyZWN0QnVmZmVyfWNvbnN0cnVjdG9yKHQsZT17fSl7aWYodC5pc0J1ZmZlckdlb21ldHJ5KXtpZih0LmluZGV4JiZ0LmluZGV4LmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgaW5kZXggYXR0cmlidXRlLiIpfWVsc2UgdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBPbmx5IEJ1ZmZlckdlb21ldHJpZXMgYXJlIHN1cHBvcnRlZC4iKTtpZihlPU9iamVjdC5hc3NpZ24oS2UoVnQoe30sZzApLHtbSG9dOiExfSksZSksZS51c2VTaGFyZWRBcnJheUJ1ZmZlciYmIXkwKCkpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBTaGFyZWRBcnJheUJ1ZmZlciBpcyBub3QgYXZhaWxhYmxlLiIpO3RoaXMuZ2VvbWV0cnk9dCx0aGlzLl9yb290cz1udWxsLHRoaXMuX2luZGlyZWN0QnVmZmVyPW51bGwsZVtIb118fChJZCh0aGlzLGUpLCF0LmJvdW5kaW5nQm94JiZlLnNldEJvdW5kaW5nQm94JiYodC5ib3VuZGluZ0JveD10aGlzLmdldEJvdW5kaW5nQm94KG5ldyBndCkpKSx0aGlzLnJlc29sdmVUcmlhbmdsZUluZGV4PWUuaW5kaXJlY3Q/bj0+dGhpcy5faW5kaXJlY3RCdWZmZXJbbl06bj0+bn1zaGlmdFRyaWFuZ2xlT2Zmc2V0cyh0KXtjb25zdCBlPXRoaXMuX2luZGlyZWN0QnVmZmVyO2lmKGUpZm9yKGxldCBuPTAscz1lLmxlbmd0aDtuPHM7bisrKWVbbl0rPXQ7ZWxzZXtjb25zdCBuPXRoaXMuX3Jvb3RzO2ZvcihsZXQgcz0wO3M8bi5sZW5ndGg7cysrKXtjb25zdCByPW5bc10sbz1uZXcgVWludDMyQXJyYXkociksYT1uZXcgVWludDE2QXJyYXkociksYz1yLmJ5dGVMZW5ndGgvTnQ7Zm9yKGxldCBsPTA7bDxjO2wrKyl7Y29uc3QgaD1NdCpsLHU9MipoO0F0KHUsYSkmJihvW2grNl0rPXQpfX19fXJlZml0KHQ9bnVsbCl7cmV0dXJuKHRoaXMuaW5kaXJlY3Q/cjA6V2QpKHRoaXMsdCl9dHJhdmVyc2UodCxlPTApe2NvbnN0IG49dGhpcy5fcm9vdHNbZV0scz1uZXcgVWludDMyQXJyYXkobikscj1uZXcgVWludDE2QXJyYXkobik7bygwKTtmdW5jdGlvbiBvKGEsYz0wKXtjb25zdCBsPWEqMixoPUF0KGwscik7aWYoaCl7Y29uc3QgdT1zW2ErNl0sZj1yW2wrMTRdO3QoYyxoLG5ldyBGbG9hdDMyQXJyYXkobixhKjQsNiksdSxmKX1lbHNle2NvbnN0IHU9X3QoYSksZj16dChhLHMpLGQ9bmEoYSxzKTt0KGMsaCxuZXcgRmxvYXQzMkFycmF5KG4sYSo0LDYpLGQpfHwobyh1LGMrMSksbyhmLGMrMSkpfX19cmF5Y2FzdCh0LGU9MCxuPTAscz0xLzApe2NvbnN0IHI9dGhpcy5fcm9vdHMsbz1bXSxhPXRoaXMuaW5kaXJlY3Q/bzA6WWQ7Zm9yKGxldCBjPTAsbD1yLmxlbmd0aDtjPGw7YysrKWEodGhpcyxjLGUsdCxvLG4scyk7cmV0dXJuIG99cmF5Y2FzdEZpcnN0KHQsZT0wLG49MCxzPTEvMCl7Y29uc3Qgcj10aGlzLl9yb290cztsZXQgbz1udWxsO2NvbnN0IGE9dGhpcy5pbmRpcmVjdD9jMDpRZDtmb3IobGV0IGM9MCxsPXIubGVuZ3RoO2M8bDtjKyspe2NvbnN0IGg9YSh0aGlzLGMsZSx0LG4scyk7aCE9bnVsbCYmKG89PW51bGx8fGguZGlzdGFuY2U8by5kaXN0YW5jZSkmJihvPWgpfXJldHVybiBvfWludGVyc2VjdHNHZW9tZXRyeSh0LGUpe2xldCBuPSExO2NvbnN0IHM9dGhpcy5fcm9vdHMscj10aGlzLmluZGlyZWN0P2wwOktkO2ZvcihsZXQgbz0wLGE9cy5sZW5ndGg7bzxhJiYobj1yKHRoaXMsbyx0LGUpLCFuKTtvKyspO3JldHVybiBufXNoYXBlY2FzdCh0KXtjb25zdCBlPWNlLmdldFByaW1pdGl2ZSgpLG49dGhpcy5pbmRpcmVjdD9KZDpaZDtsZXR7Ym91bmRzVHJhdmVyc2VPcmRlcjpzLGludGVyc2VjdHNCb3VuZHM6cixpbnRlcnNlY3RzUmFuZ2U6byxpbnRlcnNlY3RzVHJpYW5nbGU6YX09dDtpZihvJiZhKXtjb25zdCB1PW87bz0oZixkLHAseSxnKT0+dShmLGQscCx5LGcpPyEwOm4oZixkLHRoaXMsYSxwLHksZSl9ZWxzZSBvfHwoYT9vPSh1LGYsZCxwKT0+bih1LGYsdGhpcyxhLGQscCxlKTpvPSh1LGYsZCk9PmQpO2xldCBjPSExLGw9MDtjb25zdCBoPXRoaXMuX3Jvb3RzO2ZvcihsZXQgdT0wLGY9aC5sZW5ndGg7dTxmO3UrKyl7Y29uc3QgZD1oW3VdO2lmKGM9RGQodGhpcyx1LHIsbyxzLGwpLGMpYnJlYWs7bCs9ZC5ieXRlTGVuZ3RoL050fXJldHVybiBjZS5yZWxlYXNlUHJpbWl0aXZlKGUpLGN9YnZoY2FzdCh0LGUsbil7bGV0e2ludGVyc2VjdHNSYW5nZXM6cyxpbnRlcnNlY3RzVHJpYW5nbGVzOnJ9PW47Y29uc3Qgbz1jZS5nZXRQcmltaXRpdmUoKSxhPXRoaXMuZ2VvbWV0cnkuaW5kZXgsYz10aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sbD10aGlzLmluZGlyZWN0P3A9Pntjb25zdCB5PXRoaXMucmVzb2x2ZVRyaWFuZ2xlSW5kZXgocCk7eXQobyx5KjMsYSxjKX06cD0+e3l0KG8scCozLGEsYyl9LGg9Y2UuZ2V0UHJpbWl0aXZlKCksdT10Lmdlb21ldHJ5LmluZGV4LGY9dC5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGQ9dC5pbmRpcmVjdD9wPT57Y29uc3QgeT10LnJlc29sdmVUcmlhbmdsZUluZGV4KHApO3l0KGgseSozLHUsZil9OnA9Pnt5dChoLHAqMyx1LGYpfTtpZihyKXtjb25zdCBwPSh5LGcsdyxiLHgsbSxNLFMpPT57Zm9yKGxldCBBPXcsdj13K2I7QTx2O0ErKyl7ZChBKSxoLmEuYXBwbHlNYXRyaXg0KGUpLGguYi5hcHBseU1hdHJpeDQoZSksaC5jLmFwcGx5TWF0cml4NChlKSxoLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgXz15LFQ9eStnO188VDtfKyspaWYobChfKSxvLm5lZWRzVXBkYXRlPSEwLHIobyxoLF8sQSx4LG0sTSxTKSlyZXR1cm4hMH1yZXR1cm4hMX07aWYocyl7Y29uc3QgeT1zO3M9ZnVuY3Rpb24oZyx3LGIseCxtLE0sUyxBKXtyZXR1cm4geShnLHcsYix4LG0sTSxTLEEpPyEwOnAoZyx3LGIseCxtLE0sUyxBKX19ZWxzZSBzPXB9cmV0dXJuIG0wKHRoaXMsdCxlLHMpfWludGVyc2VjdHNCb3godCxlKXtyZXR1cm4gdHIuc2V0KHQubWluLHQubWF4LGUpLHRyLm5lZWRzVXBkYXRlPSEwLHRoaXMuc2hhcGVjYXN0KHtpbnRlcnNlY3RzQm91bmRzOm49PnRyLmludGVyc2VjdHNCb3gobiksaW50ZXJzZWN0c1RyaWFuZ2xlOm49PnRyLmludGVyc2VjdHNUcmlhbmdsZShuKX0pfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHRoaXMuc2hhcGVjYXN0KHtpbnRlcnNlY3RzQm91bmRzOmU9PnQuaW50ZXJzZWN0c0JveChlKSxpbnRlcnNlY3RzVHJpYW5nbGU6ZT0+ZS5pbnRlcnNlY3RzU3BoZXJlKHQpfSl9Y2xvc2VzdFBvaW50VG9HZW9tZXRyeSh0LGUsbj17fSxzPXt9LHI9MCxvPTEvMCl7cmV0dXJuKHRoaXMuaW5kaXJlY3Q/cDA6czApKHRoaXMsdCxlLG4scyxyLG8pfWNsb3Nlc3RQb2ludFRvUG9pbnQodCxlPXt9LG49MCxzPTEvMCl7cmV0dXJuICRkKHRoaXMsdCxlLG4scyl9Z2V0Qm91bmRpbmdCb3godCl7cmV0dXJuIHQubWFrZUVtcHR5KCksdGhpcy5fcm9vdHMuZm9yRWFjaChuPT57aHQoMCxuZXcgRmxvYXQzMkFycmF5KG4pLGtsKSx0LnVuaW9uKGtsKX0pLHR9fWNvbnN0IFJsPTFlLTYseDA9UmwqLjUsTGw9TWF0aC5wb3coMTAsLU1hdGgubG9nMTAoUmwpKSx3MD14MCpMbDtmdW5jdGlvbiB2ZShpKXtyZXR1cm5+fihpKkxsK3cwKX1mdW5jdGlvbiBiMChpKXtyZXR1cm5gJHt2ZShpLngpfSwke3ZlKGkueSl9YH1mdW5jdGlvbiBPbChpKXtyZXR1cm5gJHt2ZShpLngpfSwke3ZlKGkueSl9LCR7dmUoaS56KX1gfWZ1bmN0aW9uIE0wKGkpe3JldHVybmAke3ZlKGkueCl9LCR7dmUoaS55KX0sJHt2ZShpLnopfSwke3ZlKGkudyl9YH1mdW5jdGlvbiBBMChpLHQsZSl7ZS5kaXJlY3Rpb24uc3ViVmVjdG9ycyh0LGkpLm5vcm1hbGl6ZSgpO2NvbnN0IG49aS5kb3QoZS5kaXJlY3Rpb24pO3JldHVybiBlLm9yaWdpbi5jb3B5KGkpLmFkZFNjYWxlZFZlY3RvcihlLmRpcmVjdGlvbiwtbiksZX1mdW5jdGlvbiBEbCgpe3JldHVybiB0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIhPSJ1bmRlZmluZWQifWZ1bmN0aW9uIFMwKGkpe2lmKGkuYnVmZmVyIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpcmV0dXJuIGk7Y29uc3QgdD1pLmNvbnN0cnVjdG9yLGU9aS5idWZmZXIsbj1uZXcgU2hhcmVkQXJyYXlCdWZmZXIoZS5ieXRlTGVuZ3RoKSxzPW5ldyBVaW50OEFycmF5KGUpO3JldHVybiBuZXcgVWludDhBcnJheShuKS5zZXQocywwKSxuZXcgdChuKX1mdW5jdGlvbiB2MChpLHQ9QXJyYXlCdWZmZXIpe3JldHVybiBpPjY1NTM1P25ldyBVaW50MzJBcnJheShuZXcgdCg0KmkpKTpuZXcgVWludDE2QXJyYXkobmV3IHQoMippKSl9ZnVuY3Rpb24gXzAoaSx0KXtpZighaS5pbmRleCl7Y29uc3QgZT1pLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQsbj10LnVzZVNoYXJlZEFycmF5QnVmZmVyP1NoYXJlZEFycmF5QnVmZmVyOkFycmF5QnVmZmVyLHM9djAoZSxuKTtpLnNldEluZGV4KG5ldyB4dChzLDEpKTtmb3IobGV0IHI9MDtyPGU7cisrKXNbcl09cn19ZnVuY3Rpb24gejAoaSl7cmV0dXJuIGkuaW5kZXg/aS5pbmRleC5jb3VudDppLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnR9ZnVuY3Rpb24gZ2EoaSl7cmV0dXJuIHowKGkpLzN9Y29uc3QgVDA9MWUtOCxQMD1uZXcgUDtmdW5jdGlvbiBDMChpKXtyZXR1cm5+fihpLzMpfWZ1bmN0aW9uIEIwKGkpe3JldHVybiBpJTN9ZnVuY3Rpb24gJGwoaSx0KXtyZXR1cm4gaS5zdGFydC10LnN0YXJ0fWZ1bmN0aW9uIFZsKGksdCl7cmV0dXJuIFAwLnN1YlZlY3RvcnModCxpLm9yaWdpbikuZG90KGkuZGlyZWN0aW9uKX1mdW5jdGlvbiBFMChpLHQsZSxuPVQwKXtpLnNvcnQoJGwpLHQuc29ydCgkbCk7Zm9yKGxldCBhPTA7YTxpLmxlbmd0aDthKyspe2NvbnN0IGM9aVthXTtmb3IobGV0IGw9MDtsPHQubGVuZ3RoO2wrKyl7Y29uc3QgaD10W2xdO2lmKCEoaC5zdGFydD5jLmVuZCkpe2lmKGMuZW5kPGguc3RhcnR8fGguZW5kPGMuc3RhcnQpY29udGludWU7aWYoYy5zdGFydDw9aC5zdGFydCYmYy5lbmQ+PWguZW5kKXIoaC5lbmQsYy5lbmQpfHxpLnNwbGljZShhKzEsMCx7c3RhcnQ6aC5lbmQsZW5kOmMuZW5kLGluZGV4OmMuaW5kZXh9KSxjLmVuZD1oLnN0YXJ0LGguc3RhcnQ9MCxoLmVuZD0wO2Vsc2UgaWYoYy5zdGFydD49aC5zdGFydCYmYy5lbmQ8PWguZW5kKXIoYy5lbmQsaC5lbmQpfHx0LnNwbGljZShsKzEsMCx7c3RhcnQ6Yy5lbmQsZW5kOmguZW5kLGluZGV4OmguaW5kZXh9KSxoLmVuZD1jLnN0YXJ0LGMuc3RhcnQ9MCxjLmVuZD0wO2Vsc2UgaWYoYy5zdGFydDw9aC5zdGFydCYmYy5lbmQ8PWguZW5kKXtjb25zdCB1PWMuZW5kO2MuZW5kPWguc3RhcnQsaC5zdGFydD11fWVsc2UgaWYoYy5zdGFydD49aC5zdGFydCYmYy5lbmQ+PWguZW5kKXtjb25zdCB1PWguZW5kO2guZW5kPWMuc3RhcnQsYy5zdGFydD11fWVsc2UgdGhyb3cgbmV3IEVycm9yfWlmKGUuaGFzKGMuaW5kZXgpfHxlLnNldChjLmluZGV4LFtdKSxlLmhhcyhoLmluZGV4KXx8ZS5zZXQoaC5pbmRleCxbXSksZS5nZXQoYy5pbmRleCkucHVzaChoLmluZGV4KSxlLmdldChoLmluZGV4KS5wdXNoKGMuaW5kZXgpLG8oaCkmJih0LnNwbGljZShsLDEpLGwtLSksbyhjKSl7aS5zcGxpY2UoYSwxKSxhLS07YnJlYWt9fX1zKGkpLHModCk7ZnVuY3Rpb24gcyhhKXtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKylvKGFbY10pJiYoYS5zcGxpY2UoYywxKSxjLS0pfWZ1bmN0aW9uIHIoYSxjKXtyZXR1cm4gTWF0aC5hYnMoYy1hKTxufWZ1bmN0aW9uIG8oYSl7cmV0dXJuIE1hdGguYWJzKGEuZW5kLWEuc3RhcnQpPG59fWNvbnN0IFVsPTFlLTUscWw9MWUtNDtjbGFzcyBGMHtjb25zdHJ1Y3Rvcigpe3RoaXMuX3JheXM9W119YWRkUmF5KHQpe3RoaXMuX3JheXMucHVzaCh0KX1maW5kQ2xvc2VzdFJheSh0KXtjb25zdCBlPXRoaXMuX3JheXMsbj10LmNsb25lKCk7bi5kaXJlY3Rpb24ubXVsdGlwbHlTY2FsYXIoLTEpO2xldCBzPTEvMCxyPW51bGw7Zm9yKGxldCBjPTAsbD1lLmxlbmd0aDtjPGw7YysrKXtjb25zdCBoPWVbY107aWYobyhoLHQpJiZvKGgsbikpY29udGludWU7Y29uc3QgdT1hKGgsdCksZj1hKGgsbiksZD1NYXRoLm1pbih1LGYpO2Q8cyYmKHM9ZCxyPWgpfXJldHVybiByO2Z1bmN0aW9uIG8oYyxsKXtjb25zdCBoPWMub3JpZ2luLmRpc3RhbmNlVG8obC5vcmlnaW4pPlVsO3JldHVybiBjLmRpcmVjdGlvbi5hbmdsZVRvKGwuZGlyZWN0aW9uKT5xbHx8aH1mdW5jdGlvbiBhKGMsbCl7Y29uc3QgaD1jLm9yaWdpbi5kaXN0YW5jZVRvKGwub3JpZ2luKSx1PWMuZGlyZWN0aW9uLmFuZ2xlVG8obC5kaXJlY3Rpb24pO3JldHVybiBoL1VsK3UvcWx9fX1jb25zdCB4YT1uZXcgUCx3YT1uZXcgUCxlcj1uZXcgTW87ZnVuY3Rpb24gSTAoaSx0LGUpe2NvbnN0IG49aS5hdHRyaWJ1dGVzLHM9aS5pbmRleCxyPW4ucG9zaXRpb24sbz1uZXcgTWFwLGE9bmV3IE1hcCxjPUFycmF5LmZyb20odCksbD1uZXcgRjA7Zm9yKGxldCBoPTAsdT1jLmxlbmd0aDtoPHU7aCsrKXtjb25zdCBmPWNbaF0sZD1DMChmKSxwPUIwKGYpO2xldCB5PTMqZCtwLGc9MypkKyhwKzEpJTM7cyYmKHk9cy5nZXRYKHkpLGc9cy5nZXRYKGcpKSx4YS5mcm9tQnVmZmVyQXR0cmlidXRlKHIseSksd2EuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLGcpLEEwKHhhLHdhLGVyKTtsZXQgdyxiPWwuZmluZENsb3Nlc3RSYXkoZXIpO2I9PT1udWxsJiYoYj1lci5jbG9uZSgpLGwuYWRkUmF5KGIpKSxhLmhhcyhiKXx8YS5zZXQoYix7Zm9yd2FyZDpbXSxyZXZlcnNlOltdLHJheTpifSksdz1hLmdldChiKTtsZXQgeD1WbChiLHhhKSxtPVZsKGIsd2EpO3g+bSYmKFt4LG1dPVttLHhdKSxlci5kaXJlY3Rpb24uZG90KGIuZGlyZWN0aW9uKTwwP3cucmV2ZXJzZS5wdXNoKHtzdGFydDp4LGVuZDptLGluZGV4OmZ9KTp3LmZvcndhcmQucHVzaCh7c3RhcnQ6eCxlbmQ6bSxpbmRleDpmfSl9cmV0dXJuIGEuZm9yRWFjaCgoe2ZvcndhcmQ6aCxyZXZlcnNlOnV9LGYpPT57RTAoaCx1LG8sZSksaC5sZW5ndGg9PT0wJiZ1Lmxlbmd0aD09PTAmJmEuZGVsZXRlKGYpfSkse2Rpc2pvaW50Q29ubmVjdGl2aXR5TWFwOm8sZnJhZ21lbnRNYXA6YX19Y29uc3QgTjA9bmV3IE4sYmE9bmV3IFAsazA9bmV3IGllLE1hPVsiIiwiIiwiIl07Y2xhc3MgUjB7Y29uc3RydWN0b3IodD1udWxsKXt0aGlzLmRhdGE9bnVsbCx0aGlzLmRpc2pvaW50Q29ubmVjdGlvbnM9bnVsbCx0aGlzLnVubWF0Y2hlZERpc2pvaW50RWRnZXM9bnVsbCx0aGlzLnVubWF0Y2hlZEVkZ2VzPS0xLHRoaXMubWF0Y2hlZEVkZ2VzPS0xLHRoaXMudXNlRHJhd1JhbmdlPSEwLHRoaXMudXNlQWxsQXR0cmlidXRlcz0hMSx0aGlzLm1hdGNoRGlzam9pbnRFZGdlcz0hMSx0aGlzLmRlZ2VuZXJhdGVFcHNpbG9uPTFlLTgsdCYmdGhpcy51cGRhdGVGcm9tKHQpfWdldFNpYmxpbmdUcmlhbmdsZUluZGV4KHQsZSl7Y29uc3Qgbj10aGlzLmRhdGFbdCozK2VdO3JldHVybiBuPT09LTE/LTE6fn4obi8zKX1nZXRTaWJsaW5nRWRnZUluZGV4KHQsZSl7Y29uc3Qgbj10aGlzLmRhdGFbdCozK2VdO3JldHVybiBuPT09LTE/LTE6biUzfWdldERpc2pvaW50U2libGluZ1RyaWFuZ2xlSW5kaWNlcyh0LGUpe2NvbnN0IG49dCozK2Uscz10aGlzLmRpc2pvaW50Q29ubmVjdGlvbnMuZ2V0KG4pO3JldHVybiBzP3MubWFwKHI9Pn5+KHIvMykpOltdfWdldERpc2pvaW50U2libGluZ0VkZ2VJbmRpY2VzKHQsZSl7Y29uc3Qgbj10KjMrZSxzPXRoaXMuZGlzam9pbnRDb25uZWN0aW9ucy5nZXQobik7cmV0dXJuIHM/cy5tYXAocj0+ciUzKTpbXX1pc0Z1bGx5Q29ubmVjdGVkKCl7cmV0dXJuIHRoaXMudW5tYXRjaGVkRWRnZXM9PT0wfXVwZGF0ZUZyb20odCl7Y29uc3R7dXNlQWxsQXR0cmlidXRlczplLHVzZURyYXdSYW5nZTpuLG1hdGNoRGlzam9pbnRFZGdlczpzLGRlZ2VuZXJhdGVFcHNpbG9uOnJ9PXRoaXMsbz1lP3g6YixhPW5ldyBNYXAse2F0dHJpYnV0ZXM6Y309dCxsPWU/T2JqZWN0LmtleXMoYyk6bnVsbCxoPXQuaW5kZXgsdT1jLnBvc2l0aW9uO2xldCBmPWdhKHQpO2NvbnN0IGQ9ZjtsZXQgcD0wO24mJihwPXQuZHJhd1JhbmdlLnN0YXJ0LHQuZHJhd1JhbmdlLmNvdW50IT09MS8wJiYoZj1+fih0LmRyYXdSYW5nZS5jb3VudC8zKSkpO2xldCB5PXRoaXMuZGF0YTsoIXl8fHkubGVuZ3RoPDMqZCkmJih5PW5ldyBJbnQzMkFycmF5KDMqZCkpLHkuZmlsbCgtMSk7bGV0IGc9MCx3PW5ldyBTZXQ7Zm9yKGxldCBtPXAsTT1mKjMrcDttPE07bSs9Myl7Y29uc3QgUz1tO2ZvcihsZXQgQT0wO0E8MztBKyspe2xldCB2PVMrQTtoJiYodj1oLmdldFgodikpLE1hW0FdPW8odil9Zm9yKGxldCBBPTA7QTwzO0ErKyl7Y29uc3Qgdj0oQSsxKSUzLF89TWFbQV0sVD1NYVt2XSx6PWAke1R9XyR7X31gO2lmKGEuaGFzKHopKXtjb25zdCBDPVMrQSxCPWEuZ2V0KHopO3lbQ109Qix5W0JdPUMsYS5kZWxldGUoeiksZys9Mix3LmRlbGV0ZShCKX1lbHNle2NvbnN0IEM9YCR7X31fJHtUfWAsQj1TK0E7YS5zZXQoQyxCKSx3LmFkZChCKX19fWlmKHMpe2NvbnN0e2ZyYWdtZW50TWFwOm0sZGlzam9pbnRDb25uZWN0aXZpdHlNYXA6TX09STAodCx3LHIpO3cuY2xlYXIoKSxtLmZvckVhY2goKHtmb3J3YXJkOlMscmV2ZXJzZTpBfSk9PntTLmZvckVhY2goKHtpbmRleDp2fSk9PncuYWRkKHYpKSxBLmZvckVhY2goKHtpbmRleDp2fSk9PncuYWRkKHYpKX0pLHRoaXMudW5tYXRjaGVkRGlzam9pbnRFZGdlcz1tLHRoaXMuZGlzam9pbnRDb25uZWN0aW9ucz1NLGc9ZiozLXcuc2l6ZX10aGlzLm1hdGNoZWRFZGdlcz1nLHRoaXMudW5tYXRjaGVkRWRnZXM9dy5zaXplLHRoaXMuZGF0YT15O2Z1bmN0aW9uIGIobSl7cmV0dXJuIGJhLmZyb21CdWZmZXJBdHRyaWJ1dGUodSxtKSxPbChiYSl9ZnVuY3Rpb24geChtKXtsZXQgTT0iIjtmb3IobGV0IFM9MCxBPWwubGVuZ3RoO1M8QTtTKyspe2NvbnN0IHY9Y1tsW1NdXTtsZXQgXztzd2l0Y2godi5pdGVtU2l6ZSl7Y2FzZSAxOl89dmUodi5nZXRYKG0pKTticmVhaztjYXNlIDI6Xz1iMChOMC5mcm9tQnVmZmVyQXR0cmlidXRlKHYsbSkpO2JyZWFrO2Nhc2UgMzpfPU9sKGJhLmZyb21CdWZmZXJBdHRyaWJ1dGUodixtKSk7YnJlYWs7Y2FzZSA0Ol89TTAoazAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh2LG0pKTticmVha31NIT09IiImJihNKz0ifCIpLE0rPV99cmV0dXJuIE19fX1jbGFzcyBuciBleHRlbmRzIGtme2NvbnN0cnVjdG9yKC4uLnQpe3N1cGVyKC4uLnQpLHRoaXMuaXNCcnVzaD0hMCx0aGlzLl9wcmV2aW91c01hdHJpeD1uZXcgc3QsdGhpcy5fcHJldmlvdXNNYXRyaXguZWxlbWVudHMuZmlsbCgwKX1tYXJrVXBkYXRlZCgpe3RoaXMuX3ByZXZpb3VzTWF0cml4LmNvcHkodGhpcy5tYXRyaXgpfWlzRGlydHkoKXtjb25zdHttYXRyaXg6dCxfcHJldmlvdXNNYXRyaXg6ZX09dGhpcyxuPXQuZWxlbWVudHMscz1lLmVsZW1lbnRzO2ZvcihsZXQgcj0wO3I8MTY7cisrKWlmKG5bcl0hPT1zW3JdKXJldHVybiEwO3JldHVybiExfXByZXBhcmVHZW9tZXRyeSgpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeSxlPXQuYXR0cmlidXRlcyxuPURsKCk7aWYobilmb3IoY29uc3QgcyBpbiBlKXtjb25zdCByPWVbc107aWYoci5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXRocm93IG5ldyBFcnJvcigiQnJ1c2g6IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZC4iKTtyLmFycmF5PVMwKHIuYXJyYXkpfWlmKHQuYm91bmRzVHJlZXx8KF8wKHQse3VzZVNoYXJlZEFycmF5QnVmZmVyOm59KSx0LmJvdW5kc1RyZWU9bmV3IG1hKHQse21heExlYWZUcmlzOjMsaW5kaXJlY3Q6ITAsdXNlU2hhcmVkQXJyYXlCdWZmZXI6bn0pKSx0LmhhbGZFZGdlc3x8KHQuaGFsZkVkZ2VzPW5ldyBSMCh0KSksIXQuZ3JvdXBJbmRpY2VzKXtjb25zdCBzPWdhKHQpLHI9bmV3IFVpbnQxNkFycmF5KHMpLG89dC5ncm91cHM7Zm9yKGxldCBhPTAsYz1vLmxlbmd0aDthPGM7YSsrKXtjb25zdHtzdGFydDpsLGNvdW50Omh9PW9bYV07Zm9yKGxldCB1PWwvMyxmPShsK2gpLzM7dTxmO3UrKylyW3VdPWF9dC5ncm91cEluZGljZXM9cn19ZGlzcG9zZUNhY2hlRGF0YSgpe2NvbnN0e2dlb21ldHJ5OnR9PXRoaXM7dC5oYWxmRWRnZXM9bnVsbCx0LmJvdW5kc1RyZWU9bnVsbCx0Lmdyb3VwSW5kaWNlcz1udWxsfX1jb25zdCBMMD0xZS0xNCxBYT1uZXcgUCxYbD1uZXcgUCxabD1uZXcgUDtmdW5jdGlvbiBobihpLHQ9TDApe0FhLnN1YlZlY3RvcnMoaS5iLGkuYSksWGwuc3ViVmVjdG9ycyhpLmMsaS5hKSxabC5zdWJWZWN0b3JzKGkuYixpLmMpO2NvbnN0IGU9QWEuYW5nbGVUbyhYbCksbj1BYS5hbmdsZVRvKFpsKSxzPU1hdGguUEktZS1uO3JldHVybiBNYXRoLmFicyhlKTx0fHxNYXRoLmFicyhuKTx0fHxNYXRoLmFicyhzKTx0fHxpLmEuZGlzdGFuY2VUb1NxdWFyZWQoaS5iKTx0fHxpLmEuZGlzdGFuY2VUb1NxdWFyZWQoaS5jKTx0fHxpLmIuZGlzdGFuY2VUb1NxdWFyZWQoaS5jKTx0fWNvbnN0IFNhPTFlLTEwLFdpPTFlLTEwLE8wPTFlLTEwLCRlPW5ldyByZSxkdD1uZXcgcmUsVmU9bmV3IFAsdmE9bmV3IFAsV2w9bmV3IFAsaXI9bmV3IE5vLF9hPW5ldyBhZTtjbGFzcyBEMHtjb25zdHJ1Y3Rvcigpe3RoaXMuX3Bvb2w9W10sdGhpcy5faW5kZXg9MH1nZXRUcmlhbmdsZSgpe3JldHVybiB0aGlzLl9pbmRleD49dGhpcy5fcG9vbC5sZW5ndGgmJnRoaXMuX3Bvb2wucHVzaChuZXcgZXQpLHRoaXMuX3Bvb2xbdGhpcy5faW5kZXgrK119Y2xlYXIoKXt0aGlzLl9pbmRleD0wfXJlc2V0KCl7dGhpcy5fcG9vbC5sZW5ndGg9MCx0aGlzLl9pbmRleD0wfX1jbGFzcyAkMHtjb25zdHJ1Y3Rvcigpe3RoaXMudHJpYW5nbGVQb29sPW5ldyBEMCx0aGlzLnRyaWFuZ2xlcz1bXSx0aGlzLm5vcm1hbD1uZXcgUCx0aGlzLmNvcGxhbmFyVHJpYW5nbGVVc2VkPSExfWluaXRpYWxpemUodCl7dGhpcy5yZXNldCgpO2NvbnN0e3RyaWFuZ2xlczplLHRyaWFuZ2xlUG9vbDpuLG5vcm1hbDpzfT10aGlzO2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKGxldCByPTAsbz10Lmxlbmd0aDtyPG87cisrKXtjb25zdCBhPXRbcl07aWYocj09PTApYS5nZXROb3JtYWwocyk7ZWxzZSBpZihNYXRoLmFicygxLWEuZ2V0Tm9ybWFsKFZlKS5kb3QocykpPlNhKXRocm93IG5ldyBFcnJvcigiVHJpYW5nbGUgU3BsaXR0ZXI6IENhbm5vdCBpbml0aWFsaXplIHdpdGggdHJpYW5nbGVzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgbm9ybWFscy4iKTtjb25zdCBjPW4uZ2V0VHJpYW5nbGUoKTtjLmNvcHkoYSksZS5wdXNoKGMpfWVsc2V7dC5nZXROb3JtYWwocyk7Y29uc3Qgcj1uLmdldFRyaWFuZ2xlKCk7ci5jb3B5KHQpLGUucHVzaChyKX19c3BsaXRCeVRyaWFuZ2xlKHQpe2NvbnN0e25vcm1hbDplLHRyaWFuZ2xlczpufT10aGlzO2lmKHQuZ2V0Tm9ybWFsKHZhKS5ub3JtYWxpemUoKSxNYXRoLmFicygxLU1hdGguYWJzKHZhLmRvdChlKSkpPE8wKXt0aGlzLmNvcGxhbmFyVHJpYW5nbGVVc2VkPSEwO2ZvcihsZXQgcj0wLG89bi5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT1uW3JdO2EuY29wbGFuYXJDb3VudD0wfWNvbnN0IHM9W3QuYSx0LmIsdC5jXTtmb3IobGV0IHI9MDtyPDM7cisrKXtjb25zdCBvPShyKzEpJTMsYT1zW3JdLGM9c1tvXTtWZS5zdWJWZWN0b3JzKGMsYSkubm9ybWFsaXplKCksV2wuY3Jvc3NWZWN0b3JzKHZhLFZlKSxpci5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludChXbCxhKSx0aGlzLnNwbGl0QnlQbGFuZShpcix0KX19ZWxzZSB0LmdldFBsYW5lKGlyKSx0aGlzLnNwbGl0QnlQbGFuZShpcix0KX1zcGxpdEJ5UGxhbmUodCxlKXtjb25zdHt0cmlhbmdsZXM6bix0cmlhbmdsZVBvb2w6c309dGhpcztfYS5jb3B5KGUpLF9hLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgcj0wLG89bi5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT1uW3JdO2lmKCFfYS5pbnRlcnNlY3RzVHJpYW5nbGUoYSwkZSwhMCkpY29udGludWU7Y29uc3R7YTpjLGI6bCxjOmh9PWE7bGV0IHU9MCxmPS0xLGQ9ITEscD1bXSx5PVtdO2NvbnN0IGc9W2MsbCxoXTtmb3IobGV0IHc9MDt3PDM7dysrKXtjb25zdCBiPSh3KzEpJTM7JGUuc3RhcnQuY29weShnW3ddKSwkZS5lbmQuY29weShnW2JdKTtjb25zdCB4PXQuZGlzdGFuY2VUb1BvaW50KCRlLnN0YXJ0KSxtPXQuZGlzdGFuY2VUb1BvaW50KCRlLmVuZCk7aWYoTWF0aC5hYnMoeCk8V2kmJk1hdGguYWJzKG0pPFdpKXtkPSEwO2JyZWFrfWlmKHg+MD9wLnB1c2godyk6eS5wdXNoKHcpLE1hdGguYWJzKHgpPFdpKWNvbnRpbnVlO2xldCBNPSEhdC5pbnRlcnNlY3RMaW5lKCRlLFZlKTshTSYmTWF0aC5hYnMobSk8V2kmJihWZS5jb3B5KCRlLmVuZCksTT0hMCksTSYmIShWZS5kaXN0YW5jZVRvKCRlLnN0YXJ0KTxTYSkmJihWZS5kaXN0YW5jZVRvKCRlLmVuZCk8U2EmJihmPXcpLHU9PT0wP2R0LnN0YXJ0LmNvcHkoVmUpOmR0LmVuZC5jb3B5KFZlKSx1KyspfWlmKCFkJiZ1PT09MiYmZHQuZGlzdGFuY2UoKT5XaSlpZihmIT09LTEpe2Y9KGYrMSklMztsZXQgdz0wO3c9PT1mJiYodz0odysxKSUzKTtsZXQgYj13KzE7Yj09PWYmJihiPShiKzEpJTMpO2NvbnN0IHg9cy5nZXRUcmlhbmdsZSgpO3guYS5jb3B5KGdbYl0pLHguYi5jb3B5KGR0LmVuZCkseC5jLmNvcHkoZHQuc3RhcnQpLGhuKHgpfHxuLnB1c2goeCksYS5hLmNvcHkoZ1t3XSksYS5iLmNvcHkoZHQuc3RhcnQpLGEuYy5jb3B5KGR0LmVuZCksaG4oYSkmJihuLnNwbGljZShyLDEpLHItLSxvLS0pfWVsc2V7Y29uc3Qgdz1wLmxlbmd0aD49Mj95WzBdOnBbMF07aWYodz09PTApe2xldCBTPWR0LnN0YXJ0O2R0LnN0YXJ0PWR0LmVuZCxkdC5lbmQ9U31jb25zdCBiPSh3KzEpJTMseD0odysyKSUzLG09cy5nZXRUcmlhbmdsZSgpLE09cy5nZXRUcmlhbmdsZSgpO2dbYl0uZGlzdGFuY2VUb1NxdWFyZWQoZHQuc3RhcnQpPGdbeF0uZGlzdGFuY2VUb1NxdWFyZWQoZHQuZW5kKT8obS5hLmNvcHkoZ1tiXSksbS5iLmNvcHkoZHQuc3RhcnQpLG0uYy5jb3B5KGR0LmVuZCksTS5hLmNvcHkoZ1tiXSksTS5iLmNvcHkoZ1t4XSksTS5jLmNvcHkoZHQuc3RhcnQpKToobS5hLmNvcHkoZ1t4XSksbS5iLmNvcHkoZHQuc3RhcnQpLG0uYy5jb3B5KGR0LmVuZCksTS5hLmNvcHkoZ1tiXSksTS5iLmNvcHkoZ1t4XSksTS5jLmNvcHkoZHQuZW5kKSksYS5hLmNvcHkoZ1t3XSksYS5iLmNvcHkoZHQuZW5kKSxhLmMuY29weShkdC5zdGFydCksaG4obSl8fG4ucHVzaChtKSxobihNKXx8bi5wdXNoKE0pLGhuKGEpJiYobi5zcGxpY2UociwxKSxyLS0sby0tKX1lbHNlIHU9PT0zJiZjb25zb2xlLndhcm4oIlRyaWFuZ2xlQ2xpcHBlcjogQ29wbGFuYXIgY2xpcCBub3QgaGFuZGxlZCIpfX1yZXNldCgpe3RoaXMudHJpYW5nbGVzLmxlbmd0aD0wLHRoaXMudHJpYW5nbGVQb29sLmNsZWFyKCksdGhpcy5jb3BsYW5hclRyaWFuZ2xlVXNlZD0hMX19ZnVuY3Rpb24gVjAoaSl7cmV0dXJuIGk9fn5pLGkrNC1pJTR9Y2xhc3MgR2x7Y29uc3RydWN0b3IodCxlPTUwMCl7dGhpcy5leHBhbnNpb25GYWN0b3I9MS41LHRoaXMudHlwZT10LHRoaXMubGVuZ3RoPTAsdGhpcy5hcnJheT1udWxsLHRoaXMuc2V0U2l6ZShlKX1zZXRUeXBlKHQpe2lmKHRoaXMubGVuZ3RoIT09MCl0aHJvdyBuZXcgRXJyb3IoIlR5cGVCYWNrZWRBcnJheTogQ2Fubm90IGNoYW5nZSB0aGUgdHlwZSB3aGlsZSB0aGVyZSBpcyB1c2VkIGRhdGEgaW4gdGhlIGJ1ZmZlci4iKTtjb25zdCBlPXRoaXMuYXJyYXkuYnVmZmVyO3RoaXMuYXJyYXk9bmV3IHQoZSksdGhpcy50eXBlPXR9c2V0U2l6ZSh0KXtpZih0aGlzLmFycmF5JiZ0PT09dGhpcy5hcnJheS5sZW5ndGgpcmV0dXJuO2NvbnN0IGU9dGhpcy50eXBlLG49RGwoKT9TaGFyZWRBcnJheUJ1ZmZlcjpBcnJheUJ1ZmZlcixzPW5ldyBlKG5ldyBuKFYwKHQqZS5CWVRFU19QRVJfRUxFTUVOVCkpKTt0aGlzLmFycmF5JiZzLnNldCh0aGlzLmFycmF5LDApLHRoaXMuYXJyYXk9c31leHBhbmQoKXtjb25zdHthcnJheTp0LGV4cGFuc2lvbkZhY3RvcjplfT10aGlzO3RoaXMuc2V0U2l6ZSh0Lmxlbmd0aCplKX1wdXNoKC4uLnQpe2xldHthcnJheTplLGxlbmd0aDpufT10aGlzO24rdC5sZW5ndGg+ZS5sZW5ndGgmJih0aGlzLmV4cGFuZCgpLGU9dGhpcy5hcnJheSk7Zm9yKGxldCBzPTAscj10Lmxlbmd0aDtzPHI7cysrKWVbbitzXT10W3NdO3RoaXMubGVuZ3RoKz10Lmxlbmd0aH1jbGVhcigpe3RoaXMubGVuZ3RoPTB9fWNsYXNzIFUwe2NvbnN0cnVjdG9yKCl7dGhpcy5ncm91cEF0dHJpYnV0ZXM9W3t9XSx0aGlzLmdyb3VwQ291bnQ9MH1nZXRUeXBlKHQpe3JldHVybiB0aGlzLmdyb3VwQXR0cmlidXRlc1swXVt0XS50eXBlfWdldEl0ZW1TaXplKHQpe3JldHVybiB0aGlzLmdyb3VwQXR0cmlidXRlc1swXVt0XS5pdGVtU2l6ZX1nZXROb3JtYWxpemVkKHQpe3JldHVybiB0aGlzLmdyb3VwQXR0cmlidXRlc1swXVt0XS5ub3JtYWxpemVkfWdldENvdW50KHQpe2lmKHRoaXMuZ3JvdXBDb3VudDw9dClyZXR1cm4gMDtjb25zdCBlPXRoaXMuZ2V0R3JvdXBBdHRyQXJyYXkoInBvc2l0aW9uIix0KTtyZXR1cm4gZS5sZW5ndGgvZS5pdGVtU2l6ZX1nZXRUb3RhbExlbmd0aCh0KXtjb25zdHtncm91cENvdW50OmUsZ3JvdXBBdHRyaWJ1dGVzOm59PXRoaXM7bGV0IHM9MDtmb3IobGV0IHI9MDtyPGU7cisrKXtjb25zdCBvPW5bcl07cys9b1t0XS5sZW5ndGh9cmV0dXJuIHN9Z2V0R3JvdXBBdHRyU2V0KHQ9MCl7Y29uc3R7Z3JvdXBBdHRyaWJ1dGVzOmV9PXRoaXM7aWYoZVt0XSlyZXR1cm4gdGhpcy5ncm91cENvdW50PU1hdGgubWF4KHRoaXMuZ3JvdXBDb3VudCx0KzEpLGVbdF07Y29uc3Qgbj1lWzBdO2Zvcih0aGlzLmdyb3VwQ291bnQ9TWF0aC5tYXgodGhpcy5ncm91cENvdW50LHQrMSk7dD49ZS5sZW5ndGg7KXtjb25zdCBzPXt9O2UucHVzaChzKTtmb3IoY29uc3QgciBpbiBuKXtjb25zdCBvPW5bcl0sYT1uZXcgR2woby50eXBlKTthLml0ZW1TaXplPW8uaXRlbVNpemUsYS5ub3JtYWxpemVkPW8ubm9ybWFsaXplZCxzW3JdPWF9fXJldHVybiBlW3RdfWdldEdyb3VwQXR0ckFycmF5KHQsZT0wKXtjb25zdHtncm91cEF0dHJpYnV0ZXM6bn09dGhpcztpZighblswXVt0XSl0aHJvdyBuZXcgRXJyb3IoYFR5cGVkQXR0cmlidXRlRGF0YTogQXR0cmlidXRlIHdpdGggIiR7dH0iIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZGApO3JldHVybiB0aGlzLmdldEdyb3VwQXR0clNldChlKVt0XX1pbml0aWFsaXplQXJyYXkodCxlLG4scyl7Y29uc3R7Z3JvdXBBdHRyaWJ1dGVzOnJ9PXRoaXMsYT1yWzBdW3RdO2lmKGEpe2lmKGEudHlwZSE9PWUpZm9yKGxldCBjPTAsbD1yLmxlbmd0aDtjPGw7YysrKXtjb25zdCBoPXJbY11bdF07aC5zZXRUeXBlKGUpLGguaXRlbVNpemU9bixoLm5vcm1hbGl6ZWQ9c319ZWxzZSBmb3IobGV0IGM9MCxsPXIubGVuZ3RoO2M8bDtjKyspe2NvbnN0IGg9bmV3IEdsKGUpO2guaXRlbVNpemU9bixoLm5vcm1hbGl6ZWQ9cyxyW2NdW3RdPWh9fWNsZWFyKCl7dGhpcy5ncm91cENvdW50PTA7Y29uc3R7Z3JvdXBBdHRyaWJ1dGVzOnR9PXRoaXM7dC5mb3JFYWNoKGU9Pntmb3IoY29uc3QgbiBpbiBlKWVbbl0uY2xlYXIoKX0pfWRlbGV0ZSh0KXt0aGlzLmdyb3VwQXR0cmlidXRlcy5mb3JFYWNoKGU9PntkZWxldGUgZVt0XX0pfXJlc2V0KCl7dGhpcy5ncm91cEF0dHJpYnV0ZXM9W10sdGhpcy5ncm91cENvdW50PTB9fWNsYXNzIEhse2NvbnN0cnVjdG9yKCl7dGhpcy5pbnRlcnNlY3Rpb25TZXQ9e30sdGhpcy5pZHM9W119YWRkKHQsZSl7Y29uc3R7aW50ZXJzZWN0aW9uU2V0Om4saWRzOnN9PXRoaXM7blt0XXx8KG5bdF09W10scy5wdXNoKHQpKSxuW3RdLnB1c2goZSl9fWNvbnN0IHEwPTAsWDA9MSxaMD0yLEpsPTMsVzA9NCxZbD01LGpsPTYsaGU9bmV3IE1vLFFsPW5ldyBzdCxSdD1uZXcgZXQsVWU9bmV3IFAsS2w9bmV3IGllLHRoPW5ldyBpZSxlaD1uZXcgaWUsemE9bmV3IGllLHNyPW5ldyBpZSxycj1uZXcgaWUsbmg9bmV3IHJlLFRhPW5ldyBQLFBhPTFlLTgsRzA9MWUtMTUsem49LTEsVG49MSxvcj0tMixhcj0yLEdpPTAsUG49MSxDYT0yLEgwPTFlLTE0O2xldCBjcj1udWxsO2Z1bmN0aW9uIGloKGkpe2NyPWl9ZnVuY3Rpb24gc2goaSx0KXtpLmdldE1pZHBvaW50KGhlLm9yaWdpbiksaS5nZXROb3JtYWwoaGUuZGlyZWN0aW9uKTtjb25zdCBlPXQucmF5Y2FzdEZpcnN0KGhlLDIpO3JldHVybiEhKGUmJmhlLmRpcmVjdGlvbi5kb3QoZS5mYWNlLm5vcm1hbCk+MCk/em46VG59ZnVuY3Rpb24gSjAoaSx0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIE1hdGgucmFuZG9tKCktLjV9aS5nZXROb3JtYWwoVGEpLGhlLmRpcmVjdGlvbi5jb3B5KFRhKSxpLmdldE1pZHBvaW50KGhlLm9yaWdpbik7Y29uc3Qgbj0zO2xldCBzPTAscj0xLzA7Zm9yKGxldCBvPTA7bzxuO28rKyl7aGUuZGlyZWN0aW9uLngrPWUoKSpQYSxoZS5kaXJlY3Rpb24ueSs9ZSgpKlBhLGhlLmRpcmVjdGlvbi56Kz1lKCkqUGEsaGUuZGlyZWN0aW9uLm11bHRpcGx5U2NhbGFyKC0xKTtjb25zdCBhPXQucmF5Y2FzdEZpcnN0KGhlLDIpO2lmKCEhKGEmJmhlLmRpcmVjdGlvbi5kb3QoYS5mYWNlLm5vcm1hbCk+MCkmJnMrKyxhIT09bnVsbCYmKHI9TWF0aC5taW4ocixhLmRpc3RhbmNlKSkscjw9RzApcmV0dXJuIGEuZmFjZS5ub3JtYWwuZG90KFRhKT4wP2FyOm9yO2lmKHMvbj4uNXx8KG8tcysxKS9uPi41KWJyZWFrfXJldHVybiBzL24+LjU/em46VG59ZnVuY3Rpb24gWTAoaSx0KXtjb25zdCBlPW5ldyBIbCxuPW5ldyBIbDtyZXR1cm4gUWwuY29weShpLm1hdHJpeFdvcmxkKS5pbnZlcnQoKS5tdWx0aXBseSh0Lm1hdHJpeFdvcmxkKSxpLmdlb21ldHJ5LmJvdW5kc1RyZWUuYnZoY2FzdCh0Lmdlb21ldHJ5LmJvdW5kc1RyZWUsUWwse2ludGVyc2VjdHNUcmlhbmdsZXMocyxyLG8sYSl7aWYoIWhuKHMpJiYhaG4ocikpe2xldCBjPXMuaW50ZXJzZWN0c1RyaWFuZ2xlKHIsbmgsITApO2lmKCFjKXtjb25zdCBsPXMucGxhbmUsaD1yLnBsYW5lLHU9bC5ub3JtYWwsZj1oLm5vcm1hbDt1LmRvdChmKT09PTEmJk1hdGguYWJzKGwuY29uc3RhbnQtaC5jb25zdGFudCk8SDAmJihjPSEwKX1pZihjKXtsZXQgbD1pLmdlb21ldHJ5LmJvdW5kc1RyZWUucmVzb2x2ZVRyaWFuZ2xlSW5kZXgobyksaD10Lmdlb21ldHJ5LmJvdW5kc1RyZWUucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoYSk7ZS5hZGQobCxoKSxuLmFkZChoLGwpLGNyJiYoY3IuYWRkRWRnZShuaCksY3IuYWRkSW50ZXJzZWN0aW5nVHJpYW5nbGVzKG8scyxhLHIpKX19cmV0dXJuITF9fSkse2FJbnRlcnNlY3Rpb25zOmUsYkludGVyc2VjdGlvbnM6bn19ZnVuY3Rpb24gajAoaSx0LGUsbixzLHIsbz0hMSl7Y29uc3QgYT1lLmF0dHJpYnV0ZXMsYz1lLmluZGV4LGw9aSozLGg9Yy5nZXRYKGwrMCksdT1jLmdldFgobCsxKSxmPWMuZ2V0WChsKzIpO2Zvcihjb25zdCBkIGluIHIpe2NvbnN0IHA9YVtkXSx5PXJbZF07aWYoIShkIGluIGEpKXRocm93IG5ldyBFcnJvcihgQ1NHIE9wZXJhdGlvbnM6IEF0dHJpYnV0ZSAke2R9IG5vdCBhdmFpbGFibGUgb24gZ2VvbWV0cnkuYCk7Y29uc3QgZz1wLml0ZW1TaXplO2Q9PT0icG9zaXRpb24iPyhSdC5hLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxoKS5hcHBseU1hdHJpeDQobiksUnQuYi5mcm9tQnVmZmVyQXR0cmlidXRlKHAsdSkuYXBwbHlNYXRyaXg0KG4pLFJ0LmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLGYpLmFwcGx5TWF0cml4NChuKSxCYShSdC5hLFJ0LmIsUnQuYyx0LDMseSxvKSk6ZD09PSJub3JtYWwiPyhSdC5hLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxoKS5hcHBseU5vcm1hbE1hdHJpeChzKSxSdC5iLmZyb21CdWZmZXJBdHRyaWJ1dGUocCx1KS5hcHBseU5vcm1hbE1hdHJpeChzKSxSdC5jLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxmKS5hcHBseU5vcm1hbE1hdHJpeChzKSxvJiYoUnQuYS5tdWx0aXBseVNjYWxhcigtMSksUnQuYi5tdWx0aXBseVNjYWxhcigtMSksUnQuYy5tdWx0aXBseVNjYWxhcigtMSkpLEJhKFJ0LmEsUnQuYixSdC5jLHQsMyx5LG8sITApKTooS2wuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLGgpLHRoLmZyb21CdWZmZXJBdHRyaWJ1dGUocCx1KSxlaC5mcm9tQnVmZmVyQXR0cmlidXRlKHAsZiksQmEoS2wsdGgsZWgsdCxnLHksbykpfX1mdW5jdGlvbiBRMChpLHQsZSxuLHMscixvLGE9ITEpe0VhKGksbixzLHIsbyxhKSxFYShhP2U6dCxuLHMscixvLGEpLEVhKGE/dDplLG4scyxyLG8sYSl9ZnVuY3Rpb24gcmgoaSx0LGU9ITEpe3N3aXRjaChpKXtjYXNlIHEwOmlmKHQ9PT1Ubnx8dD09PWFyJiYhZSlyZXR1cm4gUG47YnJlYWs7Y2FzZSBYMDppZihlKXtpZih0PT09em4pcmV0dXJuIEdpfWVsc2UgaWYodD09PVRufHx0PT09b3IpcmV0dXJuIFBuO2JyZWFrO2Nhc2UgWjA6aWYoZSl7aWYodD09PVRufHx0PT09b3IpcmV0dXJuIFBufWVsc2UgaWYodD09PXpuKXJldHVybiBHaTticmVhaztjYXNlIFcwOmlmKHQ9PT16bilyZXR1cm4gR2k7aWYodD09PVRuKXJldHVybiBQbjticmVhaztjYXNlIEpsOmlmKHQ9PT16bnx8dD09PWFyJiYhZSlyZXR1cm4gUG47YnJlYWs7Y2FzZSBZbDppZighZSYmKHQ9PT1Ubnx8dD09PW9yKSlyZXR1cm4gUG47YnJlYWs7Y2FzZSBqbDppZighZSYmKHQ9PT16bnx8dD09PWFyKSlyZXR1cm4gUG47YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBDU0cgb3BlcmF0aW9uIGVudW0gIiR7aX0iLmApfXJldHVybiBDYX1mdW5jdGlvbiBCYShpLHQsZSxuLHMscixvPSExLGE9ITEpe2NvbnN0IGM9bD0+e3IucHVzaChsLngpLHM+MSYmci5wdXNoKGwueSkscz4yJiZyLnB1c2gobC56KSxzPjMmJnIucHVzaChsLncpfTt6YS5zZXQoMCwwLDAsMCkuYWRkU2NhbGVkVmVjdG9yKGksbi5hLngpLmFkZFNjYWxlZFZlY3Rvcih0LG4uYS55KS5hZGRTY2FsZWRWZWN0b3IoZSxuLmEueiksc3Iuc2V0KDAsMCwwLDApLmFkZFNjYWxlZFZlY3RvcihpLG4uYi54KS5hZGRTY2FsZWRWZWN0b3IodCxuLmIueSkuYWRkU2NhbGVkVmVjdG9yKGUsbi5iLnopLHJyLnNldCgwLDAsMCwwKS5hZGRTY2FsZWRWZWN0b3IoaSxuLmMueCkuYWRkU2NhbGVkVmVjdG9yKHQsbi5jLnkpLmFkZFNjYWxlZFZlY3RvcihlLG4uYy56KSxhJiYoemEubm9ybWFsaXplKCksc3Iubm9ybWFsaXplKCkscnIubm9ybWFsaXplKCkpLGMoemEpLG8/KGMocnIpLGMoc3IpKTooYyhzciksYyhycikpfWZ1bmN0aW9uIEVhKGksdCxlLG4scyxyPSExKXtmb3IoY29uc3QgbyBpbiBzKXtjb25zdCBhPXRbb10sYz1zW29dO2lmKCEobyBpbiB0KSl0aHJvdyBuZXcgRXJyb3IoYENTRyBPcGVyYXRpb25zOiBBdHRyaWJ1dGUgJHtvfSBubyBhdmFpbGFibGUgb24gZ2VvbWV0cnkuYCk7Y29uc3QgbD1hLml0ZW1TaXplO289PT0icG9zaXRpb24iPyhVZS5mcm9tQnVmZmVyQXR0cmlidXRlKGEsaSkuYXBwbHlNYXRyaXg0KGUpLGMucHVzaChVZS54LFVlLnksVWUueikpOm89PT0ibm9ybWFsIj8oVWUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLGkpLmFwcGx5Tm9ybWFsTWF0cml4KG4pLHImJlVlLm11bHRpcGx5U2NhbGFyKC0xKSxjLnB1c2goVWUueCxVZS55LFVlLnopKTooYy5wdXNoKGEuZ2V0WChpKSksbD4xJiZjLnB1c2goYS5nZXRZKGkpKSxsPjImJmMucHVzaChhLmdldFooaSkpLGw+MyYmYy5wdXNoKGEuZ2V0VyhpKSkpfX1jbGFzcyBLMHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnRyaWFuZ2xlPW5ldyBldCgpLmNvcHkodCksdGhpcy5pbnRlcnNlY3RzPXt9fWFkZFRyaWFuZ2xlKHQsZSl7dGhpcy5pbnRlcnNlY3RzW3RdPW5ldyBldCgpLmNvcHkoZSl9Z2V0SW50ZXJzZWN0QXJyYXkoKXtjb25zdCB0PVtdLHtpbnRlcnNlY3RzOmV9PXRoaXM7Zm9yKGNvbnN0IG4gaW4gZSl0LnB1c2goZVtuXSk7cmV0dXJuIHR9fWNsYXNzIG9oe2NvbnN0cnVjdG9yKCl7dGhpcy5kYXRhPXt9fWFkZFRyaWFuZ2xlSW50ZXJzZWN0aW9uKHQsZSxuLHMpe2NvbnN0e2RhdGE6cn09dGhpcztyW3RdfHwoclt0XT1uZXcgSzAoZSkpLHJbdF0uYWRkVHJpYW5nbGUobixzKX1nZXRUcmlhbmdsZXNBc0FycmF5KHQ9bnVsbCl7Y29uc3R7ZGF0YTplfT10aGlzLG49W107aWYodCE9PW51bGwpdCBpbiBlJiZuLnB1c2goZVt0XS50cmlhbmdsZSk7ZWxzZSBmb3IoY29uc3QgcyBpbiBlKW4ucHVzaChlW3NdLnRyaWFuZ2xlKTtyZXR1cm4gbn1nZXRUcmlhbmdsZUluZGljZXMoKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5kYXRhKS5tYXAodD0+cGFyc2VJbnQodCkpfWdldEludGVyc2VjdGlvbkluZGljZXModCl7Y29uc3R7ZGF0YTplfT10aGlzO3JldHVybiBlW3RdP09iamVjdC5rZXlzKGVbdF0uaW50ZXJzZWN0cykubWFwKG49PnBhcnNlSW50KG4pKTpbXX1nZXRJbnRlcnNlY3Rpb25zQXNBcnJheSh0PW51bGwsZT1udWxsKXtjb25zdHtkYXRhOm59PXRoaXMscz1uZXcgU2V0LHI9W10sbz1hPT57aWYoblthXSlpZihlIT09bnVsbCluW2FdLmludGVyc2VjdHNbZV0mJnIucHVzaChuW2FdLmludGVyc2VjdHNbZV0pO2Vsc2V7Y29uc3QgYz1uW2FdLmludGVyc2VjdHM7Zm9yKGNvbnN0IGwgaW4gYylzLmhhcyhsKXx8KHMuYWRkKGwpLHIucHVzaChjW2xdKSl9fTtpZih0IT09bnVsbClvKHQpO2Vsc2UgZm9yKGNvbnN0IGEgaW4gbilvKGEpO3JldHVybiByfXJlc2V0KCl7dGhpcy5kYXRhPXt9fX1jbGFzcyB0cHtjb25zdHJ1Y3Rvcigpe3RoaXMuZW5hYmxlZD0hMSx0aGlzLnRyaWFuZ2xlSW50ZXJzZWN0c0E9bmV3IG9oLHRoaXMudHJpYW5nbGVJbnRlcnNlY3RzQj1uZXcgb2gsdGhpcy5pbnRlcnNlY3Rpb25FZGdlcz1bXX1hZGRJbnRlcnNlY3RpbmdUcmlhbmdsZXModCxlLG4scyl7Y29uc3R7dHJpYW5nbGVJbnRlcnNlY3RzQTpyLHRyaWFuZ2xlSW50ZXJzZWN0c0I6b309dGhpcztyLmFkZFRyaWFuZ2xlSW50ZXJzZWN0aW9uKHQsZSxuLHMpLG8uYWRkVHJpYW5nbGVJbnRlcnNlY3Rpb24obixzLHQsZSl9YWRkRWRnZSh0KXt0aGlzLmludGVyc2VjdGlvbkVkZ2VzLnB1c2godC5jbG9uZSgpKX1yZXNldCgpe3RoaXMudHJpYW5nbGVJbnRlcnNlY3RzQS5yZXNldCgpLHRoaXMudHJpYW5nbGVJbnRlcnNlY3RzQi5yZXNldCgpLHRoaXMuaW50ZXJzZWN0aW9uRWRnZXM9W119aW5pdCgpe3RoaXMuZW5hYmxlZCYmKHRoaXMucmVzZXQoKSxpaCh0aGlzKSl9Y29tcGxldGUoKXt0aGlzLmVuYWJsZWQmJmloKG51bGwpfX1jb25zdCB1bj1uZXcgc3QsbHI9bmV3IE1lLENuPW5ldyBldCxocj1uZXcgZXQsZm49bmV3IGV0LHVyPW5ldyBldCx4ZT1bXSxCbj1bXTtmdW5jdGlvbiBlcChpKXtmb3IoY29uc3QgdCBvZiBpKXJldHVybiB0fWZ1bmN0aW9uIG5wKGksdCxlLG4scyxyPXt9KXtjb25zdHt1c2VHcm91cHM6bz0hMH09cix7YUludGVyc2VjdGlvbnM6YSxiSW50ZXJzZWN0aW9uczpjfT1ZMChpLHQpLGw9W107bGV0IGg9bnVsbCx1O3JldHVybiB1PW8/MDotMSxhaChpLHQsYSxlLCExLG4scyx1KSxjaChpLHQsYSxlLCExLHMsdSksZS5maW5kSW5kZXgoZD0+ZCE9PWpsJiZkIT09WWwpIT09LTEmJih1PW8/aS5nZW9tZXRyeS5ncm91cHMubGVuZ3RofHwxOi0xLGFoKHQsaSxjLGUsITAsbixzLHUpLGNoKHQsaSxjLGUsITAscyx1KSkseGUubGVuZ3RoPTAsQm4ubGVuZ3RoPTAse2dyb3VwczpsLG1hdGVyaWFsczpofX1mdW5jdGlvbiBhaChpLHQsZSxuLHMscixvLGE9MCl7Y29uc3QgYz1pLm1hdHJpeFdvcmxkLmRldGVybWluYW50KCk8MDt1bi5jb3B5KHQubWF0cml4V29ybGQpLmludmVydCgpLm11bHRpcGx5KGkubWF0cml4V29ybGQpLGxyLmdldE5vcm1hbE1hdHJpeChpLm1hdHJpeFdvcmxkKS5tdWx0aXBseVNjYWxhcihjPy0xOjEpO2NvbnN0IGw9aS5nZW9tZXRyeS5ncm91cEluZGljZXMsaD1pLmdlb21ldHJ5LmluZGV4LHU9aS5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGY9dC5nZW9tZXRyeS5ib3VuZHNUcmVlLGQ9dC5nZW9tZXRyeS5pbmRleCxwPXQuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbix5PWUuaWRzLGc9ZS5pbnRlcnNlY3Rpb25TZXQ7Zm9yKGxldCB3PTAsYj15Lmxlbmd0aDt3PGI7dysrKXtjb25zdCB4PXlbd10sbT1hPT09LTE/MDpsW3hdK2EsTT0zKngsUz1oLmdldFgoTSswKSxBPWguZ2V0WChNKzEpLHY9aC5nZXRYKE0rMik7Q24uYS5mcm9tQnVmZmVyQXR0cmlidXRlKHUsUykuYXBwbHlNYXRyaXg0KHVuKSxDbi5iLmZyb21CdWZmZXJBdHRyaWJ1dGUodSxBKS5hcHBseU1hdHJpeDQodW4pLENuLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh1LHYpLmFwcGx5TWF0cml4NCh1biksci5yZXNldCgpLHIuaW5pdGlhbGl6ZShDbik7Y29uc3QgXz1nW3hdO2ZvcihsZXQgej0wLEM9Xy5sZW5ndGg7ejxDO3orKyl7Y29uc3QgQj0zKl9bel0sRj1kLmdldFgoQiswKSxFPWQuZ2V0WChCKzEpLEk9ZC5nZXRYKEIrMik7aHIuYS5mcm9tQnVmZmVyQXR0cmlidXRlKHAsRiksaHIuYi5mcm9tQnVmZmVyQXR0cmlidXRlKHAsRSksaHIuYy5mcm9tQnVmZmVyQXR0cmlidXRlKHAsSSksci5zcGxpdEJ5VHJpYW5nbGUoaHIpfWNvbnN0IFQ9ci50cmlhbmdsZXM7Zm9yKGxldCB6PTAsQz1ULmxlbmd0aDt6PEM7eisrKXtjb25zdCBCPVRbel0sRj1yLmNvcGxhbmFyVHJpYW5nbGVVc2VkP0owKEIsZik6c2goQixmKTt4ZS5sZW5ndGg9MCxCbi5sZW5ndGg9MDtmb3IobGV0IEU9MCxJPW4ubGVuZ3RoO0U8STtFKyspe2NvbnN0IFI9cmgobltFXSxGLHMpO1IhPT1DYSYmKEJuLnB1c2goUikseGUucHVzaChvW0VdLmdldEdyb3VwQXR0clNldChtKSkpfWlmKHhlLmxlbmd0aCE9PTApe0NuLmdldEJhcnljb29yZChCLmEsdXIuYSksQ24uZ2V0QmFyeWNvb3JkKEIuYix1ci5iKSxDbi5nZXRCYXJ5Y29vcmQoQi5jLHVyLmMpO2ZvcihsZXQgRT0wLEk9eGUubGVuZ3RoO0U8STtFKyspe2NvbnN0IFI9eGVbRV0sVT1CbltFXT09PUdpO2owKHgsdXIsaS5nZW9tZXRyeSxpLm1hdHJpeFdvcmxkLGxyLFIsYyE9PVUpfX19fXJldHVybiB5Lmxlbmd0aH1mdW5jdGlvbiBjaChpLHQsZSxuLHMscixvPTApe2NvbnN0IGE9aS5tYXRyaXhXb3JsZC5kZXRlcm1pbmFudCgpPDA7dW4uY29weSh0Lm1hdHJpeFdvcmxkKS5pbnZlcnQoKS5tdWx0aXBseShpLm1hdHJpeFdvcmxkKSxsci5nZXROb3JtYWxNYXRyaXgoaS5tYXRyaXhXb3JsZCkubXVsdGlwbHlTY2FsYXIoYT8tMToxKTtjb25zdCBjPXQuZ2VvbWV0cnkuYm91bmRzVHJlZSxsPWkuZ2VvbWV0cnkuZ3JvdXBJbmRpY2VzLGg9aS5nZW9tZXRyeS5pbmRleCx1PWkuZ2VvbWV0cnkuYXR0cmlidXRlcyxmPXUucG9zaXRpb24sZD1bXSxwPWkuZ2VvbWV0cnkuaGFsZkVkZ2VzLHk9bmV3IFNldCxnPWdhKGkuZ2VvbWV0cnkpO2ZvcihsZXQgdz0wLGI9Zzt3PGI7dysrKXcgaW4gZS5pbnRlcnNlY3Rpb25TZXR8fHkuYWRkKHcpO2Zvcig7eS5zaXplPjA7KXtjb25zdCB3PWVwKHkpO3kuZGVsZXRlKHcpLGQucHVzaCh3KTtjb25zdCBiPTMqdyx4PWguZ2V0WChiKzApLG09aC5nZXRYKGIrMSksTT1oLmdldFgoYisyKTtmbi5hLmZyb21CdWZmZXJBdHRyaWJ1dGUoZix4KS5hcHBseU1hdHJpeDQodW4pLGZuLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLG0pLmFwcGx5TWF0cml4NCh1biksZm4uYy5mcm9tQnVmZmVyQXR0cmlidXRlKGYsTSkuYXBwbHlNYXRyaXg0KHVuKTtjb25zdCBTPXNoKGZuLGMpO0JuLmxlbmd0aD0wLHhlLmxlbmd0aD0wO2ZvcihsZXQgQT0wLHY9bi5sZW5ndGg7QTx2O0ErKyl7Y29uc3QgXz1yaChuW0FdLFMscyk7XyE9PUNhJiYoQm4ucHVzaChfKSx4ZS5wdXNoKHJbQV0pKX1mb3IoO2QubGVuZ3RoPjA7KXtjb25zdCBBPWQucG9wKCk7Zm9yKGxldCB2PTA7djwzO3YrKyl7Y29uc3QgXz1wLmdldFNpYmxpbmdUcmlhbmdsZUluZGV4KEEsdik7XyE9PS0xJiZ5LmhhcyhfKSYmKGQucHVzaChfKSx5LmRlbGV0ZShfKSl9aWYoeGUubGVuZ3RoIT09MCl7Y29uc3Qgdj0zKkEsXz1oLmdldFgodiswKSxUPWguZ2V0WCh2KzEpLHo9aC5nZXRYKHYrMiksQz1vPT09LTE/MDpsW0FdK287aWYoZm4uYS5mcm9tQnVmZmVyQXR0cmlidXRlKGYsXyksZm4uYi5mcm9tQnVmZmVyQXR0cmlidXRlKGYsVCksZm4uYy5mcm9tQnVmZmVyQXR0cmlidXRlKGYseiksIWhuKGZuKSlmb3IobGV0IEI9MCxGPXhlLmxlbmd0aDtCPEY7QisrKXtjb25zdCBFPUJuW0JdLEk9eGVbQl0uZ2V0R3JvdXBBdHRyU2V0KEMpLFI9RT09PUdpO1EwKF8sVCx6LHUsaS5tYXRyaXhXb3JsZCxscixJLFIhPT1hKX19fX19ZnVuY3Rpb24gaXAoaSl7Zm9yKGxldCB0PTA7dDxpLmxlbmd0aC0xO3QrKyl7Y29uc3QgZT1pW3RdLG49aVt0KzFdO2lmKGUubWF0ZXJpYWxJbmRleD09PW4ubWF0ZXJpYWxJbmRleCl7Y29uc3Qgcz1lLnN0YXJ0LHI9bi5zdGFydCtuLmNvdW50O24uc3RhcnQ9cyxuLmNvdW50PXItcyxpLnNwbGljZSh0LDEpLHQtLX19fWZ1bmN0aW9uIHNwKGksdCxlLG4pe2UuY2xlYXIoKTtjb25zdCBzPWkuYXR0cmlidXRlcztmb3IobGV0IHI9MCxvPW4ubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9bltyXSxjPXNbYV07ZS5pbml0aWFsaXplQXJyYXkoYSxjLmFycmF5LmNvbnN0cnVjdG9yLGMuaXRlbVNpemUsYy5ub3JtYWxpemVkKX1mb3IoY29uc3QgciBpbiBlLmF0dHJpYnV0ZXMpbi5pbmNsdWRlcyhyKXx8ZS5kZWxldGUocik7Zm9yKGNvbnN0IHIgaW4gdC5hdHRyaWJ1dGVzKW4uaW5jbHVkZXMocil8fCh0LmRlbGV0ZUF0dHJpYnV0ZShyKSx0LmRpc3Bvc2UoKSl9ZnVuY3Rpb24gcnAoaSx0LGUpe2xldCBuPSExLHM9LTE7Y29uc3Qgcj1pLmF0dHJpYnV0ZXMsbz10Lmdyb3VwQXR0cmlidXRlc1swXTtmb3IoY29uc3QgYyBpbiBvKXtjb25zdCBsPXQuZ2V0VG90YWxMZW5ndGgoYyksaD10LmdldFR5cGUoYyksdT10LmdldEl0ZW1TaXplKGMpLGY9dC5nZXROb3JtYWxpemVkKGMpO2xldCBkPXJbY107KCFkfHxkLmFycmF5Lmxlbmd0aDxsKSYmKGQ9bmV3IHh0KG5ldyBoKGwpLHUsZiksaS5zZXRBdHRyaWJ1dGUoYyxkKSxuPSEwKTtsZXQgcD0wO2ZvcihsZXQgeT0wLGc9TWF0aC5taW4oZS5sZW5ndGgsdC5ncm91cENvdW50KTt5PGc7eSsrKXtjb25zdCB3PWVbeV0uaW5kZXgse2FycmF5OmIsdHlwZTp4LGxlbmd0aDptfT10Lmdyb3VwQXR0cmlidXRlc1t3XVtjXSxNPW5ldyB4KGIuYnVmZmVyLDAsbSk7ZC5hcnJheS5zZXQoTSxwKSxwKz1NLmxlbmd0aH1kLm5lZWRzVXBkYXRlPSEwLHM9bC9kLml0ZW1TaXplfWlmKGkuaW5kZXgpe2NvbnN0IGM9aS5pbmRleC5hcnJheTtpZihjLmxlbmd0aDxzKWkuaW5kZXg9bnVsbCxuPSEwO2Vsc2UgZm9yKGxldCBsPTAsaD1jLmxlbmd0aDtsPGg7bCsrKWNbbF09bH1sZXQgYT0wO2kuY2xlYXJHcm91cHMoKTtmb3IobGV0IGM9MCxsPU1hdGgubWluKGUubGVuZ3RoLHQuZ3JvdXBDb3VudCk7YzxsO2MrKyl7Y29uc3R7aW5kZXg6aCxtYXRlcmlhbEluZGV4OnV9PWVbY10sZj10LmdldENvdW50KGgpO2YhPT0wJiYoaS5hZGRHcm91cChhLGYsdSksYSs9Zil9aS5zZXREcmF3UmFuZ2UoMCxzKSxpLmJvdW5kc1RyZWU9bnVsbCxuJiZpLmRpc3Bvc2UoKX1mdW5jdGlvbiBsaChpLHQpe2xldCBlPXQ7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl8fChlPVtdLGkuZm9yRWFjaChuPT57ZVtuLm1hdGVyaWFsSW5kZXhdPXR9KSksZX1jbGFzcyBvcHtjb25zdHJ1Y3Rvcigpe3RoaXMudHJpYW5nbGVTcGxpdHRlcj1uZXcgJDAsdGhpcy5hdHRyaWJ1dGVEYXRhPVtdLHRoaXMuYXR0cmlidXRlcz1bInBvc2l0aW9uIiwidXYiLCJub3JtYWwiXSx0aGlzLnVzZUdyb3Vwcz0hMCx0aGlzLmNvbnNvbGlkYXRlR3JvdXBzPSEwLHRoaXMuZGVidWc9bmV3IHRwfWdldEdyb3VwUmFuZ2VzKHQpe3JldHVybiF0aGlzLnVzZUdyb3Vwc3x8dC5ncm91cHMubGVuZ3RoPT09MD9be3N0YXJ0OjAsY291bnQ6MS8wLG1hdGVyaWFsSW5kZXg6MH1dOnQuZ3JvdXBzLm1hcChlPT5WdCh7fSxlKSl9ZXZhbHVhdGUodCxlLG4scz1uZXcgbnIpe2xldCByPSEwO2lmKEFycmF5LmlzQXJyYXkobil8fChuPVtuXSksQXJyYXkuaXNBcnJheShzKXx8KHM9W3NdLHI9ITEpLHMubGVuZ3RoIT09bi5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJFdmFsdWF0b3I6IG9wZXJhdGlvbnMgYW5kIHRhcmdldCBhcnJheSBwYXNzZWQgYXMgZGlmZmVyZW50IHNpemVzLiIpO3QucHJlcGFyZUdlb21ldHJ5KCksZS5wcmVwYXJlR2VvbWV0cnkoKTtjb25zdHt0cmlhbmdsZVNwbGl0dGVyOm8sYXR0cmlidXRlRGF0YTphLGF0dHJpYnV0ZXM6Yyx1c2VHcm91cHM6bCxjb25zb2xpZGF0ZUdyb3VwczpoLGRlYnVnOnV9PXRoaXM7Zm9yKDthLmxlbmd0aDxzLmxlbmd0aDspYS5wdXNoKG5ldyBVMCk7cy5mb3JFYWNoKCh3LGIpPT57c3AodC5nZW9tZXRyeSx3Lmdlb21ldHJ5LGFbYl0sYyl9KSx1LmluaXQoKSxucCh0LGUsbixvLGEse3VzZUdyb3VwczpsfSksdS5jb21wbGV0ZSgpO2NvbnN0IGY9dGhpcy5nZXRHcm91cFJhbmdlcyh0Lmdlb21ldHJ5KSxkPWxoKGYsdC5tYXRlcmlhbCkscD10aGlzLmdldEdyb3VwUmFuZ2VzKGUuZ2VvbWV0cnkpLHk9bGgocCxlLm1hdGVyaWFsKTtwLmZvckVhY2godz0+dy5tYXRlcmlhbEluZGV4Kz1kLmxlbmd0aCk7bGV0IGc9Wy4uLmYsLi4ucF0ubWFwKCh3LGIpPT5LZShWdCh7fSx3KSx7aW5kZXg6Yn0pKTtpZihsKXtjb25zdCB3PVsuLi5kLC4uLnldO2gmJihnPWcubWFwKHg9Pntjb25zdCBtPXdbeC5tYXRlcmlhbEluZGV4XTtyZXR1cm4geC5tYXRlcmlhbEluZGV4PXcuaW5kZXhPZihtKSx4fSkuc29ydCgoeCxtKT0+eC5tYXRlcmlhbEluZGV4LW0ubWF0ZXJpYWxJbmRleCkpO2NvbnN0IGI9W107Zm9yKGxldCB4PTAsbT13Lmxlbmd0aDt4PG07eCsrKXtsZXQgTT0hMTtmb3IobGV0IFM9MCxBPWcubGVuZ3RoO1M8QTtTKyspe2NvbnN0IHY9Z1tTXTt2Lm1hdGVyaWFsSW5kZXg9PT14JiYoTT0hMCx2Lm1hdGVyaWFsSW5kZXg9Yi5sZW5ndGgpfU0mJmIucHVzaCh3W3hdKX1zLmZvckVhY2goeD0+e3gubWF0ZXJpYWw9Yn0pfWVsc2UgZz1be3N0YXJ0OjAsY291bnQ6MS8wLGluZGV4OjAsbWF0ZXJpYWxJbmRleDowfV0scy5mb3JFYWNoKHc9Pnt3Lm1hdGVyaWFsPWRbMF19KTtyZXR1cm4gcy5mb3JFYWNoKCh3LGIpPT57Y29uc3QgeD13Lmdlb21ldHJ5O3JwKHgsYVtiXSxnKSxoJiZpcCh4Lmdyb3Vwcyl9KSxyP3M6c1swXX1ldmFsdWF0ZUhpZXJhcmNoeSh0LGU9bmV3IG5yKXt0LnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTtjb25zdCBuPShyLG8pPT57Y29uc3QgYT1yLmNoaWxkcmVuO2ZvcihsZXQgYz0wLGw9YS5sZW5ndGg7YzxsO2MrKyl7Y29uc3QgaD1hW2NdO2guaXNPcGVyYXRpb25Hcm91cD9uKGgsbyk6byhoKX19LHM9cj0+e2NvbnN0IG89ci5jaGlsZHJlbjtsZXQgYT0hMTtmb3IobGV0IGw9MCxoPW8ubGVuZ3RoO2w8aDtsKyspe2NvbnN0IHU9b1tsXTthPXModSl8fGF9Y29uc3QgYz1yLmlzRGlydHkoKTtpZihjJiZyLm1hcmtVcGRhdGVkKCksYSYmIXIuaXNPcGVyYXRpb25Hcm91cCl7bGV0IGw7cmV0dXJuIG4ocixoPT57bD9sPXRoaXMuZXZhbHVhdGUobCxoLGgub3BlcmF0aW9uKTpsPXRoaXMuZXZhbHVhdGUocixoLGgub3BlcmF0aW9uKX0pLHIuX2NhY2hlZEdlb21ldHJ5PWwuZ2VvbWV0cnksci5fY2FjaGVkTWF0ZXJpYWxzPWwubWF0ZXJpYWwsITB9ZWxzZSByZXR1cm4gYXx8Y307cmV0dXJuIHModCksZS5nZW9tZXRyeT10Ll9jYWNoZWRHZW9tZXRyeSxlLm1hdGVyaWFsPXQuX2NhY2hlZE1hdGVyaWFscyxlfXJlc2V0KCl7dGhpcy50cmlhbmdsZVNwbGl0dGVyLnJlc2V0KCl9fWZ1bmN0aW9uIGhoKGkpe2xldCB0LGUsbixzPS0xLHI9MDtmb3IobGV0IGw9MDtsPGkubGVuZ3RoOysrbCl7Y29uc3QgaD1pW2xdO2lmKHQ9PT12b2lkIDAmJih0PWguYXJyYXkuY29uc3RydWN0b3IpLHQhPT1oLmFycmF5LmNvbnN0cnVjdG9yKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBCdWZmZXJBdHRyaWJ1dGUuYXJyYXkgbXVzdCBiZSBvZiBjb25zaXN0ZW50IGFycmF5IHR5cGVzIGFjcm9zcyBtYXRjaGluZyBhdHRyaWJ1dGVzLiIpLG51bGw7aWYoZT09PXZvaWQgMCYmKGU9aC5pdGVtU2l6ZSksZSE9PWguaXRlbVNpemUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUF0dHJpYnV0ZXMoKSBmYWlsZWQuIEJ1ZmZlckF0dHJpYnV0ZS5pdGVtU2l6ZSBtdXN0IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIiksbnVsbDtpZihuPT09dm9pZCAwJiYobj1oLm5vcm1hbGl6ZWQpLG4hPT1oLm5vcm1hbGl6ZWQpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUF0dHJpYnV0ZXMoKSBmYWlsZWQuIEJ1ZmZlckF0dHJpYnV0ZS5ub3JtYWxpemVkIG11c3QgYmUgY29uc2lzdGVudCBhY3Jvc3MgbWF0Y2hpbmcgYXR0cmlidXRlcy4iKSxudWxsO2lmKHM9PT0tMSYmKHM9aC5ncHVUeXBlKSxzIT09aC5ncHVUeXBlKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBCdWZmZXJBdHRyaWJ1dGUuZ3B1VHlwZSBtdXN0IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIiksbnVsbDtyKz1oLmNvdW50KmV9Y29uc3Qgbz1uZXcgdChyKSxhPW5ldyB4dChvLGUsbik7bGV0IGM9MDtmb3IobGV0IGw9MDtsPGkubGVuZ3RoOysrbCl7Y29uc3QgaD1pW2xdO2lmKGguaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSl7Y29uc3QgdT1jL2U7Zm9yKGxldCBmPTAsZD1oLmNvdW50O2Y8ZDtmKyspZm9yKGxldCBwPTA7cDxlO3ArKyl7Y29uc3QgeT1oLmdldENvbXBvbmVudChmLHApO2Euc2V0Q29tcG9uZW50KGYrdSxwLHkpfX1lbHNlIG8uc2V0KGguYXJyYXksYyk7Yys9aC5jb3VudCplfXJldHVybiBzIT09dm9pZCAwJiYoYS5ncHVUeXBlPXMpLGF9ZnVuY3Rpb24gYXAoaSl7aWYoaS5ncm91cHMubGVuZ3RoPT09MClyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzLm1lcmdlR3JvdXBzKCk6IE5vIGdyb3VwcyBhcmUgZGVmaW5lZC4gTm90aGluZyB0byBtZXJnZS4iKSxpO2xldCB0PWkuZ3JvdXBzO2lmKHQ9dC5zb3J0KChvLGEpPT5vLm1hdGVyaWFsSW5kZXghPT1hLm1hdGVyaWFsSW5kZXg/by5tYXRlcmlhbEluZGV4LWEubWF0ZXJpYWxJbmRleDpvLnN0YXJ0LWEuc3RhcnQpLGkuZ2V0SW5kZXgoKT09PW51bGwpe2NvbnN0IG89aS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiksYT1bXTtmb3IobGV0IGM9MDtjPG8uY291bnQ7Yys9MylhLnB1c2goYyxjKzEsYysyKTtpLnNldEluZGV4KGEpfWNvbnN0IGU9aS5nZXRJbmRleCgpLG49W107Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGE9dFtvXSxjPWEuc3RhcnQsbD1jK2EuY291bnQ7Zm9yKGxldCBoPWM7aDxsO2grKyluLnB1c2goZS5nZXRYKGgpKX1pLmRpc3Bvc2UoKSxpLnNldEluZGV4KG4pO2xldCBzPTA7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGE9dFtvXTthLnN0YXJ0PXMscys9YS5jb3VudH1sZXQgcj10WzBdO2kuZ3JvdXBzPVtyXTtmb3IobGV0IG89MTtvPHQubGVuZ3RoO28rKyl7Y29uc3QgYT10W29dO3IubWF0ZXJpYWxJbmRleD09PWEubWF0ZXJpYWxJbmRleD9yLmNvdW50Kz1hLmNvdW50OihyPWEsaS5ncm91cHMucHVzaChyKSl9cmV0dXJuIGl9ZnVuY3Rpb24gdWgoaSx0PTApe2NvbnN0IGU9aVswXS5pbmRleCE9PW51bGwsbj1uZXcgU2V0KE9iamVjdC5rZXlzKGlbMF0uYXR0cmlidXRlcykpLHM9bmV3IFNldChPYmplY3Qua2V5cyhpWzBdLm1vcnBoQXR0cmlidXRlcykpLHI9e30sbz17fSxhPWlbMF0ubW9ycGhUYXJnZXRzUmVsYXRpdmUsYz1uZXcgQWU7bGV0IGw9MDtmb3IobGV0IGg9MDtoPGkubGVuZ3RoOysraCl7Y29uc3QgdT1pW2hdO2xldCBmPTA7aWYoZSE9PSh1LmluZGV4IT09bnVsbCkpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK2grIi4gQWxsIGdlb21ldHJpZXMgbXVzdCBoYXZlIGNvbXBhdGlibGUgYXR0cmlidXRlczsgbWFrZSBzdXJlIGluZGV4IGF0dHJpYnV0ZSBleGlzdHMgYW1vbmcgYWxsIGdlb21ldHJpZXMsIG9yIGluIG5vbmUgb2YgdGhlbS4iKSxudWxsO2Zvcihjb25zdCBkIGluIHUuYXR0cmlidXRlcyl7aWYoIW4uaGFzKGQpKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIitoKycuIEFsbCBnZW9tZXRyaWVzIG11c3QgaGF2ZSBjb21wYXRpYmxlIGF0dHJpYnV0ZXM7IG1ha2Ugc3VyZSAiJytkKyciIGF0dHJpYnV0ZSBleGlzdHMgYW1vbmcgYWxsIGdlb21ldHJpZXMsIG9yIGluIG5vbmUgb2YgdGhlbS4nKSxudWxsO3JbZF09PT12b2lkIDAmJihyW2RdPVtdKSxyW2RdLnB1c2godS5hdHRyaWJ1dGVzW2RdKSxmKyt9aWYoZiE9PW4uc2l6ZSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsiLiBNYWtlIHN1cmUgYWxsIGdlb21ldHJpZXMgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgYXR0cmlidXRlcy4iKSxudWxsO2lmKGEhPT11Lm1vcnBoVGFyZ2V0c1JlbGF0aXZlKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIitoKyIuIC5tb3JwaFRhcmdldHNSZWxhdGl2ZSBtdXN0IGJlIGNvbnNpc3RlbnQgdGhyb3VnaG91dCBhbGwgZ2VvbWV0cmllcy4iKSxudWxsO2Zvcihjb25zdCBkIGluIHUubW9ycGhBdHRyaWJ1dGVzKXtpZighcy5oYXMoZCkpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK2grIi4gIC5tb3JwaEF0dHJpYnV0ZXMgbXVzdCBiZSBjb25zaXN0ZW50IHRocm91Z2hvdXQgYWxsIGdlb21ldHJpZXMuIiksbnVsbDtvW2RdPT09dm9pZCAwJiYob1tkXT1bXSksb1tkXS5wdXNoKHUubW9ycGhBdHRyaWJ1dGVzW2RdKX1pZih0KXtsZXQgZDtpZihlKWQ9dS5pbmRleC5jb3VudDtlbHNlIGlmKHUuYXR0cmlidXRlcy5wb3NpdGlvbiE9PXZvaWQgMClkPXUuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudDtlbHNlIHJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIitoKyIuIFRoZSBnZW9tZXRyeSBtdXN0IGhhdmUgZWl0aGVyIGFuIGluZGV4IG9yIGEgcG9zaXRpb24gYXR0cmlidXRlIiksbnVsbDtpZih0PT09MSljLmFkZEdyb3VwKGwsZCxoKTtlbHNlIGlmKHQ9PT0yJiZ1Lmdyb3Vwcy5sZW5ndGg+MClmb3IobGV0IHAgb2YgdS5ncm91cHMpe2xldCB5PXAubWF0ZXJpYWxJbmRleDtjLmFkZEdyb3VwKGwrcC5zdGFydCxNYXRoLm1pbihwLmNvdW50LGQpLHkpfWwrPWR9fWlmKGUpe2xldCBoPTA7Y29uc3QgdT1bXTtmb3IobGV0IGY9MDtmPGkubGVuZ3RoOysrZil7Y29uc3QgZD1pW2ZdLmluZGV4O2ZvcihsZXQgcD0wO3A8ZC5jb3VudDsrK3ApdS5wdXNoKGQuZ2V0WChwKStoKTtoKz1pW2ZdLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnR9Yy5zZXRJbmRleCh1KX1mb3IoY29uc3QgaCBpbiByKXtjb25zdCB1PWhoKHJbaF0pO2lmKCF1KXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdoaWxlIHRyeWluZyB0byBtZXJnZSB0aGUgIitoKyIgYXR0cmlidXRlLiIpLG51bGw7Yy5zZXRBdHRyaWJ1dGUoaCx1KX1mb3IoY29uc3QgaCBpbiBvKXtjb25zdCB1PW9baF1bMF0ubGVuZ3RoO2lmKHU9PT0wKWJyZWFrO2MubW9ycGhBdHRyaWJ1dGVzPWMubW9ycGhBdHRyaWJ1dGVzfHx7fSxjLm1vcnBoQXR0cmlidXRlc1toXT1bXTtmb3IobGV0IGY9MDtmPHU7KytmKXtjb25zdCBkPVtdO2ZvcihsZXQgeT0wO3k8b1toXS5sZW5ndGg7Kyt5KWQucHVzaChvW2hdW3ldW2ZdKTtjb25zdCBwPWhoKGQpO2lmKCFwKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdoaWxlIHRyeWluZyB0byBtZXJnZSB0aGUgIitoKyIgbW9ycGhBdHRyaWJ1dGUuIiksbnVsbDtjLm1vcnBoQXR0cmlidXRlc1toXS5wdXNoKHApfX1yZXR1cm4gdD09PTI/YXAoYyk6Y31jbGFzcyBjcCBleHRlbmRzIGVpe2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKTtjb25zdCBuPW5ldyBucihuZXcgZWkodCxLZShWdCh7fSxlKSx7aGFzVG9wOiEwLGhhc1NpZGU6ITAsaGFzQm90dG9tOiExfSkpKTtuLnVwZGF0ZU1hdHJpeFdvcmxkKCk7Y29uc3Qgcz1uZXcgZ3QoKS5zZXRGcm9tT2JqZWN0KG4pLHI9bmV3IFA7cy5nZXRTaXplKHIpO2NvbnN0IG89bmV3IFAocy5taW4ueCtyLngvMixzLm1pbi55K3IueS8yLDApO2xldCBhPWUudG9wU2VnbWVudHMsYz1lLmJveDM7aWYoYyl7Yz1jLnVuaW9uKHMpO2NvbnN0IHc9bmV3IFA7Yy5nZXRTaXplKHcpO2NvbnN0IGI9TWF0aC5tYXgoci54L3cueCxyLnkvdy55KTthPU1hdGguY2VpbChlLnRvcFNlZ21lbnRzKmIpfWlmKGE8NClyZXR1cm4gdGhpcztjb25zdCBsPW5ldyBabyhyLngsci55LGEsYSksaD1uZXcgbnIobCk7aC5wb3NpdGlvbi5zZXQoby54LG8ueSxvLnopLGgudXBkYXRlTWF0cml4V29ybGQoKTtjb25zdCBmPW5ldyBvcCgpLmV2YWx1YXRlKGgsbixKbCksZD1mLmdlb21ldHJ5LmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKSxwPW5ldyBSZShkLmNvdW50KjIsMik7Zm9yKGxldCB3PTA7dzxkLmNvdW50O3crKyl7Y29uc3QgYj1kLmdldFoodyk7ZC5zZXRaKHcsZS5kZXB0aCtiKX1pZihjKXtjb25zdCB3PWMubWluLGI9Yy5tYXgseD1uZXcgUCgpLnN1YlZlY3RvcnMoYix3KTtmb3IobGV0IG09MDttPGQuY291bnQ7bSsrKXtjb25zdCBNPWQuZ2V0WChtKSxTPWQuZ2V0WShtKSxBPShNLXcueCkveC54LHY9KFMtdy55KS94Lnk7cC5zZXRYWShtLEEsdil9Zi5nZW9tZXRyeS5zZXRBdHRyaWJ1dGUoInV2IixwKX1kLm5lZWRzVXBkYXRlPSEwO2NvbnN0IHk9bmV3IGVpKHQsS2UoVnQoe30sZSkse2hhc1RvcDohMX0pKSxnPXVoKFtmLmdlb21ldHJ5LHldLDIpO3RoaXMuY29weShnLnRvTm9uSW5kZXhlZCgpKX19dmFyIGxwPWk9Pntjb25zdHtzcGxpdDp0LGRlcHRoOmUscG9pbnRzOm4sYm94MzpzLGhhc1RvcDpyLGhhc0JvdHRvbTpvLGhhc1NpZGU6YSxzaWRlUmVwZWF0OmMsdG9wU2VnbWVudHM6bH09aSxoPWw/Y3A6ZWksdT1uZXcgaChuZXcgb2wobikse2RlcHRoOmUsYmV2ZWxFbmFibGVkOiExLGJveDM6cyxVVkdlbmVyYXRvcjpkZCh7c3BsaXQ6dCxib3gzOnMsc2lkZVJlcGVhdDpjfSksaGFzVG9wOnIsaGFzQm90dG9tOm8saGFzU2lkZTphLHRvcFNlZ21lbnRzOmx9KTtyZXR1cm4gcGQoKSx1fTtmdW5jdGlvbiBmcihpLHQpe3JldHVybiBpPT1udWxsfHx0PT1udWxsP05hTjppPHQ/LTE6aT50PzE6aT49dD8wOk5hTn1mdW5jdGlvbiBocChpLHQpe3JldHVybiBpPT1udWxsfHx0PT1udWxsP05hTjp0PGk/LTE6dD5pPzE6dD49aT8wOk5hTn1mdW5jdGlvbiBmaChpKXtsZXQgdCxlLG47aS5sZW5ndGghPT0yPyh0PWZyLGU9KGEsYyk9PmZyKGkoYSksYyksbj0oYSxjKT0+aShhKS1jKToodD1pPT09ZnJ8fGk9PT1ocD9pOnVwLGU9aSxuPWkpO2Z1bmN0aW9uIHMoYSxjLGw9MCxoPWEubGVuZ3RoKXtpZihsPGgpe2lmKHQoYyxjKSE9PTApcmV0dXJuIGg7ZG97Y29uc3QgdT1sK2g+Pj4xO2UoYVt1XSxjKTwwP2w9dSsxOmg9dX13aGlsZShsPGgpfXJldHVybiBsfWZ1bmN0aW9uIHIoYSxjLGw9MCxoPWEubGVuZ3RoKXtpZihsPGgpe2lmKHQoYyxjKSE9PTApcmV0dXJuIGg7ZG97Y29uc3QgdT1sK2g+Pj4xO2UoYVt1XSxjKTw9MD9sPXUrMTpoPXV9d2hpbGUobDxoKX1yZXR1cm4gbH1mdW5jdGlvbiBvKGEsYyxsPTAsaD1hLmxlbmd0aCl7Y29uc3QgdT1zKGEsYyxsLGgtMSk7cmV0dXJuIHU+bCYmbihhW3UtMV0sYyk+LW4oYVt1XSxjKT91LTE6dX1yZXR1cm57bGVmdDpzLGNlbnRlcjpvLHJpZ2h0OnJ9fWZ1bmN0aW9uIHVwKCl7cmV0dXJuIDB9ZnVuY3Rpb24gZnAoaSl7cmV0dXJuIGk9PT1udWxsP05hTjoraX1jb25zdCBkcD1maChmcikucmlnaHQ7ZmgoZnApLmNlbnRlcjtmdW5jdGlvbiBkcihpLHQpe2xldCBlLG47aWYodD09PXZvaWQgMClmb3IoY29uc3QgcyBvZiBpKXMhPW51bGwmJihlPT09dm9pZCAwP3M+PXMmJihlPW49cyk6KGU+cyYmKGU9cyksbjxzJiYobj1zKSkpO2Vsc2V7bGV0IHM9LTE7Zm9yKGxldCByIG9mIGkpKHI9dChyLCsrcyxpKSkhPW51bGwmJihlPT09dm9pZCAwP3I+PXImJihlPW49cik6KGU+ciYmKGU9ciksbjxyJiYobj1yKSkpfXJldHVybltlLG5dfWNsYXNzIHFle2NvbnN0cnVjdG9yKCl7dGhpcy5fcGFydGlhbHM9bmV3IEZsb2F0NjRBcnJheSgzMiksdGhpcy5fbj0wfWFkZCh0KXtjb25zdCBlPXRoaXMuX3BhcnRpYWxzO2xldCBuPTA7Zm9yKGxldCBzPTA7czx0aGlzLl9uJiZzPDMyO3MrKyl7Y29uc3Qgcj1lW3NdLG89dCtyLGE9TWF0aC5hYnModCk8TWF0aC5hYnMocik/dC0oby1yKTpyLShvLXQpO2EmJihlW24rK109YSksdD1vfXJldHVybiBlW25dPXQsdGhpcy5fbj1uKzEsdGhpc312YWx1ZU9mKCl7Y29uc3QgdD10aGlzLl9wYXJ0aWFscztsZXQgZT10aGlzLl9uLG4scyxyLG89MDtpZihlPjApe2ZvcihvPXRbLS1lXTtlPjAmJihuPW8scz10Wy0tZV0sbz1uK3Mscj1zLShvLW4pLCFyKTspO2U+MCYmKHI8MCYmdFtlLTFdPDB8fHI+MCYmdFtlLTFdPjApJiYocz1yKjIsbj1vK3Mscz09bi1vJiYobz1uKSl9cmV0dXJuIG99fWNvbnN0IHBwPU1hdGguc3FydCg1MCkseXA9TWF0aC5zcXJ0KDEwKSxtcD1NYXRoLnNxcnQoMik7ZnVuY3Rpb24gcHIoaSx0LGUpe2NvbnN0IG49KHQtaSkvTWF0aC5tYXgoMCxlKSxzPU1hdGguZmxvb3IoTWF0aC5sb2cxMChuKSkscj1uL01hdGgucG93KDEwLHMpLG89cj49cHA/MTA6cj49eXA/NTpyPj1tcD8yOjE7bGV0IGEsYyxsO3JldHVybiBzPDA/KGw9TWF0aC5wb3coMTAsLXMpL28sYT1NYXRoLnJvdW5kKGkqbCksYz1NYXRoLnJvdW5kKHQqbCksYS9sPGkmJisrYSxjL2w+dCYmLS1jLGw9LWwpOihsPU1hdGgucG93KDEwLHMpKm8sYT1NYXRoLnJvdW5kKGkvbCksYz1NYXRoLnJvdW5kKHQvbCksYSpsPGkmJisrYSxjKmw+dCYmLS1jKSxjPGEmJi41PD1lJiZlPDI/cHIoaSx0LGUqMik6W2EsYyxsXX1mdW5jdGlvbiBncChpLHQsZSl7aWYodD0rdCxpPStpLGU9K2UsIShlPjApKXJldHVybltdO2lmKGk9PT10KXJldHVybltpXTtjb25zdCBuPXQ8aSxbcyxyLG9dPW4/cHIodCxpLGUpOnByKGksdCxlKTtpZighKHI+PXMpKXJldHVybltdO2NvbnN0IGE9ci1zKzEsYz1uZXcgQXJyYXkoYSk7aWYobilpZihvPDApZm9yKGxldCBsPTA7bDxhOysrbCljW2xdPShyLWwpLy1vO2Vsc2UgZm9yKGxldCBsPTA7bDxhOysrbCljW2xdPShyLWwpKm87ZWxzZSBpZihvPDApZm9yKGxldCBsPTA7bDxhOysrbCljW2xdPShzK2wpLy1vO2Vsc2UgZm9yKGxldCBsPTA7bDxhOysrbCljW2xdPShzK2wpKm87cmV0dXJuIGN9ZnVuY3Rpb24gRmEoaSx0LGUpe3JldHVybiB0PSt0LGk9K2ksZT0rZSxwcihpLHQsZSlbMl19ZnVuY3Rpb24geHAoaSx0LGUpe3Q9K3QsaT0raSxlPStlO2NvbnN0IG49dDxpLHM9bj9GYSh0LGksZSk6RmEoaSx0LGUpO3JldHVybihuPy0xOjEpKihzPDA/MS8tczpzKX1mdW5jdGlvbiB3cChpLHQpe2xldCBlPTAsbj0wO2lmKHQ9PT12b2lkIDApZm9yKGxldCBzIG9mIGkpcyE9bnVsbCYmKHM9K3MpPj1zJiYoKytlLG4rPXMpO2Vsc2V7bGV0IHM9LTE7Zm9yKGxldCByIG9mIGkpKHI9dChyLCsrcyxpKSkhPW51bGwmJihyPStyKT49ciYmKCsrZSxuKz1yKX1pZihlKXJldHVybiBuL2V9ZnVuY3Rpb24qYnAoaSl7Zm9yKGNvbnN0IHQgb2YgaSl5aWVsZCpmZih0KX1mdW5jdGlvbiBIaShpKXtyZXR1cm4gQXJyYXkuZnJvbShicChpKSl9dmFyIFE9MWUtNix5cj0xZS0xMixIPU1hdGguUEkscXQ9SC8yLG1yPUgvNCxYdD1IKjIsdXQ9MTgwL0gsWD1ILzE4MCx0dD1NYXRoLmFicyxJYT1NYXRoLmF0YW4sdWU9TWF0aC5hdGFuMixaPU1hdGguY29zLE1wPU1hdGguZXhwLE5hPU1hdGguaHlwb3QsQXA9TWF0aC5sb2cscT1NYXRoLnNpbixTcD1NYXRoLnNpZ258fGZ1bmN0aW9uKGkpe3JldHVybiBpPjA/MTppPDA/LTE6MH0sWGU9TWF0aC5zcXJ0LHZwPU1hdGgudGFuO2Z1bmN0aW9uIF9wKGkpe3JldHVybiBpPjE/MDppPC0xP0g6TWF0aC5hY29zKGkpfWZ1bmN0aW9uIFplKGkpe3JldHVybiBpPjE/cXQ6aTwtMT8tcXQ6TWF0aC5hc2luKGkpfWZ1bmN0aW9uIGRoKGkpe3JldHVybihpPXEoaS8yKSkqaX1mdW5jdGlvbiBCdCgpe31mdW5jdGlvbiBncihpLHQpe2kmJnloLmhhc093blByb3BlcnR5KGkudHlwZSkmJnloW2kudHlwZV0oaSx0KX12YXIgcGg9e0ZlYXR1cmU6ZnVuY3Rpb24oaSx0KXtncihpLmdlb21ldHJ5LHQpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmZlYXR1cmVzLG49LTEscz1lLmxlbmd0aDsrK248czspZ3IoZVtuXS5nZW9tZXRyeSx0KX19LHloPXtTcGhlcmU6ZnVuY3Rpb24oaSx0KXt0LnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbihpLHQpe2k9aS5jb29yZGluYXRlcyx0LnBvaW50KGlbMF0saVsxXSxpWzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscz1lLmxlbmd0aDsrK248czspaT1lW25dLHQucG9pbnQoaVswXSxpWzFdLGlbMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKGksdCl7a2EoaS5jb29yZGluYXRlcyx0LDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5jb29yZGluYXRlcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KWthKGVbbl0sdCwwKX0sUG9seWdvbjpmdW5jdGlvbihpLHQpe21oKGkuY29vcmRpbmF0ZXMsdCl9LE11bHRpUG9seWdvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscz1lLmxlbmd0aDsrK248czspbWgoZVtuXSx0KX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuZ2VvbWV0cmllcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KWdyKGVbbl0sdCl9fTtmdW5jdGlvbiBrYShpLHQsZSl7dmFyIG49LTEscz1pLmxlbmd0aC1lLHI7Zm9yKHQubGluZVN0YXJ0KCk7KytuPHM7KXI9aVtuXSx0LnBvaW50KHJbMF0sclsxXSxyWzJdKTt0LmxpbmVFbmQoKX1mdW5jdGlvbiBtaChpLHQpe3ZhciBlPS0xLG49aS5sZW5ndGg7Zm9yKHQucG9seWdvblN0YXJ0KCk7KytlPG47KWthKGlbZV0sdCwxKTt0LnBvbHlnb25FbmQoKX1mdW5jdGlvbiB4cihpLHQpe2kmJnBoLmhhc093blByb3BlcnR5KGkudHlwZSk/cGhbaS50eXBlXShpLHQpOmdyKGksdCl9dmFyIHdyPW5ldyBxZSxnaD1uZXcgcWUseGgsd2gsUmEsTGEsT2EsV2U9e3BvaW50OkJ0LGxpbmVTdGFydDpCdCxsaW5lRW5kOkJ0LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3dyPW5ldyBxZSxXZS5saW5lU3RhcnQ9enAsV2UubGluZUVuZD1UcH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciBpPSt3cjtnaC5hZGQoaTwwP1h0K2k6aSksdGhpcy5saW5lU3RhcnQ9dGhpcy5saW5lRW5kPXRoaXMucG9pbnQ9QnR9LHNwaGVyZTpmdW5jdGlvbigpe2doLmFkZChYdCl9fTtmdW5jdGlvbiB6cCgpe1dlLnBvaW50PVBwfWZ1bmN0aW9uIFRwKCl7YmgoeGgsd2gpfWZ1bmN0aW9uIFBwKGksdCl7V2UucG9pbnQ9YmgseGg9aSx3aD10LGkqPVgsdCo9WCxSYT1pLExhPVoodD10LzIrbXIpLE9hPXEodCl9ZnVuY3Rpb24gYmgoaSx0KXtpKj1YLHQqPVgsdD10LzIrbXI7dmFyIGU9aS1SYSxuPWU+PTA/MTotMSxzPW4qZSxyPVoodCksbz1xKHQpLGE9T2EqbyxjPUxhKnIrYSpaKHMpLGw9YSpuKnEocyk7d3IuYWRkKHVlKGwsYykpLFJhPWksTGE9cixPYT1vfWZ1bmN0aW9uIGJyKGkpe3JldHVyblt1ZShpWzFdLGlbMF0pLFplKGlbMl0pXX1mdW5jdGlvbiBFbihpKXt2YXIgdD1pWzBdLGU9aVsxXSxuPVooZSk7cmV0dXJuW24qWih0KSxuKnEodCkscShlKV19ZnVuY3Rpb24gTXIoaSx0KXtyZXR1cm4gaVswXSp0WzBdK2lbMV0qdFsxXStpWzJdKnRbMl19ZnVuY3Rpb24gaGkoaSx0KXtyZXR1cm5baVsxXSp0WzJdLWlbMl0qdFsxXSxpWzJdKnRbMF0taVswXSp0WzJdLGlbMF0qdFsxXS1pWzFdKnRbMF1dfWZ1bmN0aW9uIERhKGksdCl7aVswXSs9dFswXSxpWzFdKz10WzFdLGlbMl0rPXRbMl19ZnVuY3Rpb24gQXIoaSx0KXtyZXR1cm5baVswXSp0LGlbMV0qdCxpWzJdKnRdfWZ1bmN0aW9uIFNyKGkpe3ZhciB0PVhlKGlbMF0qaVswXStpWzFdKmlbMV0raVsyXSppWzJdKTtpWzBdLz10LGlbMV0vPXQsaVsyXS89dH12YXIgb3QsWnQsZnQsanQsRm4sTWgsQWgsdWksSmksZG4sR2UsSGU9e3BvaW50OiRhLGxpbmVTdGFydDp2aCxsaW5lRW5kOl9oLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe0hlLnBvaW50PXpoLEhlLmxpbmVTdGFydD1DcCxIZS5saW5lRW5kPUJwLEppPW5ldyBxZSxXZS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe1dlLnBvbHlnb25FbmQoKSxIZS5wb2ludD0kYSxIZS5saW5lU3RhcnQ9dmgsSGUubGluZUVuZD1faCx3cjwwPyhvdD0tKGZ0PTE4MCksWnQ9LShqdD05MCkpOkppPlE/anQ9OTA6Smk8LVEmJihadD0tOTApLEdlWzBdPW90LEdlWzFdPWZ0fSxzcGhlcmU6ZnVuY3Rpb24oKXtvdD0tKGZ0PTE4MCksWnQ9LShqdD05MCl9fTtmdW5jdGlvbiAkYShpLHQpe2RuLnB1c2goR2U9W290PWksZnQ9aV0pLHQ8WnQmJihadD10KSx0Pmp0JiYoanQ9dCl9ZnVuY3Rpb24gU2goaSx0KXt2YXIgZT1FbihbaSpYLHQqWF0pO2lmKHVpKXt2YXIgbj1oaSh1aSxlKSxzPVtuWzFdLC1uWzBdLDBdLHI9aGkocyxuKTtTcihyKSxyPWJyKHIpO3ZhciBvPWktRm4sYT1vPjA/MTotMSxjPXJbMF0qdXQqYSxsLGg9dHQobyk+MTgwO2heKGEqRm48YyYmYzxhKmkpPyhsPXJbMV0qdXQsbD5qdCYmKGp0PWwpKTooYz0oYyszNjApJTM2MC0xODAsaF4oYSpGbjxjJiZjPGEqaSk/KGw9LXJbMV0qdXQsbDxadCYmKFp0PWwpKToodDxadCYmKFp0PXQpLHQ+anQmJihqdD10KSkpLGg/aTxGbj9RdChvdCxpKT5RdChvdCxmdCkmJihmdD1pKTpRdChpLGZ0KT5RdChvdCxmdCkmJihvdD1pKTpmdD49b3Q/KGk8b3QmJihvdD1pKSxpPmZ0JiYoZnQ9aSkpOmk+Rm4/UXQob3QsaSk+UXQob3QsZnQpJiYoZnQ9aSk6UXQoaSxmdCk+UXQob3QsZnQpJiYob3Q9aSl9ZWxzZSBkbi5wdXNoKEdlPVtvdD1pLGZ0PWldKTt0PFp0JiYoWnQ9dCksdD5qdCYmKGp0PXQpLHVpPWUsRm49aX1mdW5jdGlvbiB2aCgpe0hlLnBvaW50PVNofWZ1bmN0aW9uIF9oKCl7R2VbMF09b3QsR2VbMV09ZnQsSGUucG9pbnQ9JGEsdWk9bnVsbH1mdW5jdGlvbiB6aChpLHQpe2lmKHVpKXt2YXIgZT1pLUZuO0ppLmFkZCh0dChlKT4xODA/ZSsoZT4wPzM2MDotMzYwKTplKX1lbHNlIE1oPWksQWg9dDtXZS5wb2ludChpLHQpLFNoKGksdCl9ZnVuY3Rpb24gQ3AoKXtXZS5saW5lU3RhcnQoKX1mdW5jdGlvbiBCcCgpe3poKE1oLEFoKSxXZS5saW5lRW5kKCksdHQoSmkpPlEmJihvdD0tKGZ0PTE4MCkpLEdlWzBdPW90LEdlWzFdPWZ0LHVpPW51bGx9ZnVuY3Rpb24gUXQoaSx0KXtyZXR1cm4odC09aSk8MD90KzM2MDp0fWZ1bmN0aW9uIEVwKGksdCl7cmV0dXJuIGlbMF0tdFswXX1mdW5jdGlvbiBUaChpLHQpe3JldHVybiBpWzBdPD1pWzFdP2lbMF08PXQmJnQ8PWlbMV06dDxpWzBdfHxpWzFdPHR9ZnVuY3Rpb24gUGgoaSl7dmFyIHQsZSxuLHMscixvLGE7aWYoanQ9ZnQ9LShvdD1adD0xLzApLGRuPVtdLHhyKGksSGUpLGU9ZG4ubGVuZ3RoKXtmb3IoZG4uc29ydChFcCksdD0xLG49ZG5bMF0scj1bbl07dDxlOysrdClzPWRuW3RdLFRoKG4sc1swXSl8fFRoKG4sc1sxXSk/KFF0KG5bMF0sc1sxXSk+UXQoblswXSxuWzFdKSYmKG5bMV09c1sxXSksUXQoc1swXSxuWzFdKT5RdChuWzBdLG5bMV0pJiYoblswXT1zWzBdKSk6ci5wdXNoKG49cyk7Zm9yKG89LTEvMCxlPXIubGVuZ3RoLTEsdD0wLG49cltlXTt0PD1lO249cywrK3Qpcz1yW3RdLChhPVF0KG5bMV0sc1swXSkpPm8mJihvPWEsb3Q9c1swXSxmdD1uWzFdKX1yZXR1cm4gZG49R2U9bnVsbCxvdD09PTEvMHx8WnQ9PT0xLzA/W1tOYU4sTmFOXSxbTmFOLE5hTl1dOltbb3QsWnRdLFtmdCxqdF1dfXZhciBZaSx2cixfcix6cixUcixQcixDcixCcixWYSxVYSxxYSxDaCxCaCxMdCxPdCxEdCx3ZT17c3BoZXJlOkJ0LHBvaW50OlhhLGxpbmVTdGFydDpFaCxsaW5lRW5kOkZoLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3dlLmxpbmVTdGFydD1OcCx3ZS5saW5lRW5kPWtwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7d2UubGluZVN0YXJ0PUVoLHdlLmxpbmVFbmQ9Rmh9fTtmdW5jdGlvbiBYYShpLHQpe2kqPVgsdCo9WDt2YXIgZT1aKHQpO2ppKGUqWihpKSxlKnEoaSkscSh0KSl9ZnVuY3Rpb24gamkoaSx0LGUpeysrWWksX3IrPShpLV9yKS9ZaSx6cis9KHQtenIpL1lpLFRyKz0oZS1UcikvWWl9ZnVuY3Rpb24gRWgoKXt3ZS5wb2ludD1GcH1mdW5jdGlvbiBGcChpLHQpe2kqPVgsdCo9WDt2YXIgZT1aKHQpO0x0PWUqWihpKSxPdD1lKnEoaSksRHQ9cSh0KSx3ZS5wb2ludD1JcCxqaShMdCxPdCxEdCl9ZnVuY3Rpb24gSXAoaSx0KXtpKj1YLHQqPVg7dmFyIGU9Wih0KSxuPWUqWihpKSxzPWUqcShpKSxyPXEodCksbz11ZShYZSgobz1PdCpyLUR0KnMpKm8rKG89RHQqbi1MdCpyKSpvKyhvPUx0KnMtT3QqbikqbyksTHQqbitPdCpzK0R0KnIpO3ZyKz1vLFByKz1vKihMdCsoTHQ9bikpLENyKz1vKihPdCsoT3Q9cykpLEJyKz1vKihEdCsoRHQ9cikpLGppKEx0LE90LER0KX1mdW5jdGlvbiBGaCgpe3dlLnBvaW50PVhhfWZ1bmN0aW9uIE5wKCl7d2UucG9pbnQ9UnB9ZnVuY3Rpb24ga3AoKXtJaChDaCxCaCksd2UucG9pbnQ9WGF9ZnVuY3Rpb24gUnAoaSx0KXtDaD1pLEJoPXQsaSo9WCx0Kj1YLHdlLnBvaW50PUloO3ZhciBlPVoodCk7THQ9ZSpaKGkpLE90PWUqcShpKSxEdD1xKHQpLGppKEx0LE90LER0KX1mdW5jdGlvbiBJaChpLHQpe2kqPVgsdCo9WDt2YXIgZT1aKHQpLG49ZSpaKGkpLHM9ZSpxKGkpLHI9cSh0KSxvPU90KnItRHQqcyxhPUR0Km4tTHQqcixjPUx0KnMtT3QqbixsPU5hKG8sYSxjKSxoPVplKGwpLHU9bCYmLWgvbDtWYS5hZGQodSpvKSxVYS5hZGQodSphKSxxYS5hZGQodSpjKSx2cis9aCxQcis9aCooTHQrKEx0PW4pKSxDcis9aCooT3QrKE90PXMpKSxCcis9aCooRHQrKER0PXIpKSxqaShMdCxPdCxEdCl9ZnVuY3Rpb24gTmgoaSl7WWk9dnI9X3I9enI9VHI9UHI9Q3I9QnI9MCxWYT1uZXcgcWUsVWE9bmV3IHFlLHFhPW5ldyBxZSx4cihpLHdlKTt2YXIgdD0rVmEsZT0rVWEsbj0rcWEscz1OYSh0LGUsbik7cmV0dXJuIHM8eXImJih0PVByLGU9Q3Isbj1Ccix2cjxRJiYodD1fcixlPXpyLG49VHIpLHM9TmEodCxlLG4pLHM8eXIpP1tOYU4sTmFOXTpbdWUoZSx0KSp1dCxaZShuL3MpKnV0XX1mdW5jdGlvbiBaYShpLHQpe2Z1bmN0aW9uIGUobixzKXtyZXR1cm4gbj1pKG4scyksdChuWzBdLG5bMV0pfXJldHVybiBpLmludmVydCYmdC5pbnZlcnQmJihlLmludmVydD1mdW5jdGlvbihuLHMpe3JldHVybiBuPXQuaW52ZXJ0KG4scyksbiYmaS5pbnZlcnQoblswXSxuWzFdKX0pLGV9ZnVuY3Rpb24gV2EoaSx0KXtyZXR1cm4gdHQoaSk+SCYmKGktPU1hdGgucm91bmQoaS9YdCkqWHQpLFtpLHRdfVdhLmludmVydD1XYTtmdW5jdGlvbiBraChpLHQsZSl7cmV0dXJuKGklPVh0KT90fHxlP1phKExoKGkpLE9oKHQsZSkpOkxoKGkpOnR8fGU/T2godCxlKTpXYX1mdW5jdGlvbiBSaChpKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdCs9aSx0dCh0KT5IJiYodC09TWF0aC5yb3VuZCh0L1h0KSpYdCksW3QsZV19fWZ1bmN0aW9uIExoKGkpe3ZhciB0PVJoKGkpO3JldHVybiB0LmludmVydD1SaCgtaSksdH1mdW5jdGlvbiBPaChpLHQpe3ZhciBlPVooaSksbj1xKGkpLHM9Wih0KSxyPXEodCk7ZnVuY3Rpb24gbyhhLGMpe3ZhciBsPVooYyksaD1aKGEpKmwsdT1xKGEpKmwsZj1xKGMpLGQ9ZiplK2gqbjtyZXR1cm5bdWUodSpzLWQqcixoKmUtZipuKSxaZShkKnMrdSpyKV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKGEsYyl7dmFyIGw9WihjKSxoPVooYSkqbCx1PXEoYSkqbCxmPXEoYyksZD1mKnMtdSpyO3JldHVyblt1ZSh1KnMrZipyLGgqZStkKm4pLFplKGQqZS1oKm4pXX0sb31mdW5jdGlvbiBEaChpKXtpPWtoKGlbMF0qWCxpWzFdKlgsaS5sZW5ndGg+Mj9pWzJdKlg6MCk7ZnVuY3Rpb24gdChlKXtyZXR1cm4gZT1pKGVbMF0qWCxlWzFdKlgpLGVbMF0qPXV0LGVbMV0qPXV0LGV9cmV0dXJuIHQuaW52ZXJ0PWZ1bmN0aW9uKGUpe3JldHVybiBlPWkuaW52ZXJ0KGVbMF0qWCxlWzFdKlgpLGVbMF0qPXV0LGVbMV0qPXV0LGV9LHR9ZnVuY3Rpb24gTHAoaSx0LGUsbixzLHIpe2lmKGUpe3ZhciBvPVoodCksYT1xKHQpLGM9biplO3M9PW51bGw/KHM9dCtuKlh0LHI9dC1jLzIpOihzPSRoKG8scykscj0kaChvLHIpLChuPjA/czxyOnM+cikmJihzKz1uKlh0KSk7Zm9yKHZhciBsLGg9cztuPjA/aD5yOmg8cjtoLT1jKWw9YnIoW28sLWEqWihoKSwtYSpxKGgpXSksaS5wb2ludChsWzBdLGxbMV0pfX1mdW5jdGlvbiAkaChpLHQpe3Q9RW4odCksdFswXS09aSxTcih0KTt2YXIgZT1fcCgtdFsxXSk7cmV0dXJuKCgtdFsyXTwwPy1lOmUpK1h0LVEpJVh0fWZ1bmN0aW9uIFZoKCl7dmFyIGk9W10sdDtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24oZSxuLHMpe3QucHVzaChbZSxuLHNdKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7aS5wdXNoKHQ9W10pfSxsaW5lRW5kOkJ0LHJlam9pbjpmdW5jdGlvbigpe2kubGVuZ3RoPjEmJmkucHVzaChpLnBvcCgpLmNvbmNhdChpLnNoaWZ0KCkpKX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIGU9aTtyZXR1cm4gaT1bXSx0PW51bGwsZX19fWZ1bmN0aW9uIEVyKGksdCl7cmV0dXJuIHR0KGlbMF0tdFswXSk8USYmdHQoaVsxXS10WzFdKTxRfWZ1bmN0aW9uIEZyKGksdCxlLG4pe3RoaXMueD1pLHRoaXMuej10LHRoaXMubz1lLHRoaXMuZT1uLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gVWgoaSx0LGUsbixzKXt2YXIgcj1bXSxvPVtdLGEsYztpZihpLmZvckVhY2goZnVuY3Rpb24ocCl7aWYoISgoeT1wLmxlbmd0aC0xKTw9MCkpe3ZhciB5LGc9cFswXSx3PXBbeV0sYjtpZihFcihnLHcpKXtpZighZ1syXSYmIXdbMl0pe2ZvcihzLmxpbmVTdGFydCgpLGE9MDthPHk7KythKXMucG9pbnQoKGc9cFthXSlbMF0sZ1sxXSk7cy5saW5lRW5kKCk7cmV0dXJufXdbMF0rPTIqUX1yLnB1c2goYj1uZXcgRnIoZyxwLG51bGwsITApKSxvLnB1c2goYi5vPW5ldyBGcihnLG51bGwsYiwhMSkpLHIucHVzaChiPW5ldyBGcih3LHAsbnVsbCwhMSkpLG8ucHVzaChiLm89bmV3IEZyKHcsbnVsbCxiLCEwKSl9fSksISFyLmxlbmd0aCl7Zm9yKG8uc29ydCh0KSxxaChyKSxxaChvKSxhPTAsYz1vLmxlbmd0aDthPGM7KythKW9bYV0uZT1lPSFlO2Zvcih2YXIgbD1yWzBdLGgsdTs7KXtmb3IodmFyIGY9bCxkPSEwO2YudjspaWYoKGY9Zi5uKT09PWwpcmV0dXJuO2g9Zi56LHMubGluZVN0YXJ0KCk7ZG97aWYoZi52PWYuby52PSEwLGYuZSl7aWYoZClmb3IoYT0wLGM9aC5sZW5ndGg7YTxjOysrYSlzLnBvaW50KCh1PWhbYV0pWzBdLHVbMV0pO2Vsc2UgbihmLngsZi5uLngsMSxzKTtmPWYubn1lbHNle2lmKGQpZm9yKGg9Zi5wLnosYT1oLmxlbmd0aC0xO2E+PTA7LS1hKXMucG9pbnQoKHU9aFthXSlbMF0sdVsxXSk7ZWxzZSBuKGYueCxmLnAueCwtMSxzKTtmPWYucH1mPWYubyxoPWYueixkPSFkfXdoaWxlKCFmLnYpO3MubGluZUVuZCgpfX19ZnVuY3Rpb24gcWgoaSl7aWYodD1pLmxlbmd0aCl7Zm9yKHZhciB0LGU9MCxuPWlbMF0sczsrK2U8dDspbi5uPXM9aVtlXSxzLnA9bixuPXM7bi5uPXM9aVswXSxzLnA9bn19ZnVuY3Rpb24gR2EoaSl7cmV0dXJuIHR0KGlbMF0pPD1IP2lbMF06U3AoaVswXSkqKCh0dChpWzBdKStIKSVYdC1IKX1mdW5jdGlvbiBYaChpLHQpe3ZhciBlPUdhKHQpLG49dFsxXSxzPXEobikscj1bcShlKSwtWihlKSwwXSxvPTAsYT0wLGM9bmV3IHFlO3M9PT0xP249cXQrUTpzPT09LTEmJihuPS1xdC1RKTtmb3IodmFyIGw9MCxoPWkubGVuZ3RoO2w8aDsrK2wpaWYoZj0odT1pW2xdKS5sZW5ndGgpZm9yKHZhciB1LGYsZD11W2YtMV0scD1HYShkKSx5PWRbMV0vMittcixnPXEoeSksdz1aKHkpLGI9MDtiPGY7KytiLHA9bSxnPVMsdz1BLGQ9eCl7dmFyIHg9dVtiXSxtPUdhKHgpLE09eFsxXS8yK21yLFM9cShNKSxBPVooTSksdj1tLXAsXz12Pj0wPzE6LTEsVD1fKnYsej1UPkgsQz1nKlM7aWYoYy5hZGQodWUoQypfKnEoVCksdypBK0MqWihUKSkpLG8rPXo/ditfKlh0OnYsel5wPj1lXm0+PWUpe3ZhciBCPWhpKEVuKGQpLEVuKHgpKTtTcihCKTt2YXIgRj1oaShyLEIpO1NyKEYpO3ZhciBFPSh6XnY+PTA/LTE6MSkqWmUoRlsyXSk7KG4+RXx8bj09PUUmJihCWzBdfHxCWzFdKSkmJihhKz16XnY+PTA/MTotMSl9fXJldHVybihvPC1RfHxvPFEmJmM8LXlyKV5hJjF9ZnVuY3Rpb24gWmgoaSx0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKHMpe3ZhciByPXQocyksbz1WaCgpLGE9dChvKSxjPSExLGwsaCx1LGY9e3BvaW50OmQsbGluZVN0YXJ0OnksbGluZUVuZDpnLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2YucG9pbnQ9dyxmLmxpbmVTdGFydD1iLGYubGluZUVuZD14LGg9W10sbD1bXX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2YucG9pbnQ9ZCxmLmxpbmVTdGFydD15LGYubGluZUVuZD1nLGg9SGkoaCk7dmFyIG09WGgobCxuKTtoLmxlbmd0aD8oY3x8KHMucG9seWdvblN0YXJ0KCksYz0hMCksVWgoaCxEcCxtLGUscykpOm0mJihjfHwocy5wb2x5Z29uU3RhcnQoKSxjPSEwKSxzLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEscykscy5saW5lRW5kKCkpLGMmJihzLnBvbHlnb25FbmQoKSxjPSExKSxoPWw9bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7cy5wb2x5Z29uU3RhcnQoKSxzLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEscykscy5saW5lRW5kKCkscy5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBkKG0sTSl7aShtLE0pJiZzLnBvaW50KG0sTSl9ZnVuY3Rpb24gcChtLE0pe3IucG9pbnQobSxNKX1mdW5jdGlvbiB5KCl7Zi5wb2ludD1wLHIubGluZVN0YXJ0KCl9ZnVuY3Rpb24gZygpe2YucG9pbnQ9ZCxyLmxpbmVFbmQoKX1mdW5jdGlvbiB3KG0sTSl7dS5wdXNoKFttLE1dKSxhLnBvaW50KG0sTSl9ZnVuY3Rpb24gYigpe2EubGluZVN0YXJ0KCksdT1bXX1mdW5jdGlvbiB4KCl7dyh1WzBdWzBdLHVbMF1bMV0pLGEubGluZUVuZCgpO3ZhciBtPWEuY2xlYW4oKSxNPW8ucmVzdWx0KCksUyxBPU0ubGVuZ3RoLHYsXyxUO2lmKHUucG9wKCksbC5wdXNoKHUpLHU9bnVsbCwhIUEpe2lmKG0mMSl7aWYoXz1NWzBdLCh2PV8ubGVuZ3RoLTEpPjApe2ZvcihjfHwocy5wb2x5Z29uU3RhcnQoKSxjPSEwKSxzLmxpbmVTdGFydCgpLFM9MDtTPHY7KytTKXMucG9pbnQoKFQ9X1tTXSlbMF0sVFsxXSk7cy5saW5lRW5kKCl9cmV0dXJufUE+MSYmbSYyJiZNLnB1c2goTS5wb3AoKS5jb25jYXQoTS5zaGlmdCgpKSksaC5wdXNoKE0uZmlsdGVyKE9wKSl9fXJldHVybiBmfX1mdW5jdGlvbiBPcChpKXtyZXR1cm4gaS5sZW5ndGg+MX1mdW5jdGlvbiBEcChpLHQpe3JldHVybigoaT1pLngpWzBdPDA/aVsxXS1xdC1ROnF0LWlbMV0pLSgodD10LngpWzBdPDA/dFsxXS1xdC1ROnF0LXRbMV0pfXZhciBXaD1aaChmdW5jdGlvbigpe3JldHVybiEwfSwkcCxVcCxbLUgsLXF0XSk7ZnVuY3Rpb24gJHAoaSl7dmFyIHQ9TmFOLGU9TmFOLG49TmFOLHM7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2kubGluZVN0YXJ0KCkscz0xfSxwb2ludDpmdW5jdGlvbihyLG8pe3ZhciBhPXI+MD9IOi1ILGM9dHQoci10KTt0dChjLUgpPFE/KGkucG9pbnQodCxlPShlK28pLzI+MD9xdDotcXQpLGkucG9pbnQobixlKSxpLmxpbmVFbmQoKSxpLmxpbmVTdGFydCgpLGkucG9pbnQoYSxlKSxpLnBvaW50KHIsZSkscz0wKTpuIT09YSYmYz49SCYmKHR0KHQtbik8USYmKHQtPW4qUSksdHQoci1hKTxRJiYoci09YSpRKSxlPVZwKHQsZSxyLG8pLGkucG9pbnQobixlKSxpLmxpbmVFbmQoKSxpLmxpbmVTdGFydCgpLGkucG9pbnQoYSxlKSxzPTApLGkucG9pbnQodD1yLGU9byksbj1hfSxsaW5lRW5kOmZ1bmN0aW9uKCl7aS5saW5lRW5kKCksdD1lPU5hTn0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gMi1zfX19ZnVuY3Rpb24gVnAoaSx0LGUsbil7dmFyIHMscixvPXEoaS1lKTtyZXR1cm4gdHQobyk+UT9JYSgocSh0KSoocj1aKG4pKSpxKGUpLXEobikqKHM9Wih0KSkqcShpKSkvKHMqcipvKSk6KHQrbikvMn1mdW5jdGlvbiBVcChpLHQsZSxuKXt2YXIgcztpZihpPT1udWxsKXM9ZSpxdCxuLnBvaW50KC1ILHMpLG4ucG9pbnQoMCxzKSxuLnBvaW50KEgscyksbi5wb2ludChILDApLG4ucG9pbnQoSCwtcyksbi5wb2ludCgwLC1zKSxuLnBvaW50KC1ILC1zKSxuLnBvaW50KC1ILDApLG4ucG9pbnQoLUgscyk7ZWxzZSBpZih0dChpWzBdLXRbMF0pPlEpe3ZhciByPWlbMF08dFswXT9IOi1IO3M9ZSpyLzIsbi5wb2ludCgtcixzKSxuLnBvaW50KDAscyksbi5wb2ludChyLHMpfWVsc2Ugbi5wb2ludCh0WzBdLHRbMV0pfWZ1bmN0aW9uIHFwKGkpe3ZhciB0PVooaSksZT0yKlgsbj10PjAscz10dCh0KT5RO2Z1bmN0aW9uIHIoaCx1LGYsZCl7THAoZCxpLGUsZixoLHUpfWZ1bmN0aW9uIG8oaCx1KXtyZXR1cm4gWihoKSpaKHUpPnR9ZnVuY3Rpb24gYShoKXt2YXIgdSxmLGQscCx5O3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtwPWQ9ITEseT0xfSxwb2ludDpmdW5jdGlvbihnLHcpe3ZhciBiPVtnLHddLHgsbT1vKGcsdyksTT1uP20/MDpsKGcsdyk6bT9sKGcrKGc8MD9IOi1IKSx3KTowO2lmKCF1JiYocD1kPW0pJiZoLmxpbmVTdGFydCgpLG0hPT1kJiYoeD1jKHUsYiksKCF4fHxFcih1LHgpfHxFcihiLHgpKSYmKGJbMl09MSkpLG0hPT1kKXk9MCxtPyhoLmxpbmVTdGFydCgpLHg9YyhiLHUpLGgucG9pbnQoeFswXSx4WzFdKSk6KHg9Yyh1LGIpLGgucG9pbnQoeFswXSx4WzFdLDIpLGgubGluZUVuZCgpKSx1PXg7ZWxzZSBpZihzJiZ1JiZuXm0pe3ZhciBTOyEoTSZmKSYmKFM9YyhiLHUsITApKSYmKHk9MCxuPyhoLmxpbmVTdGFydCgpLGgucG9pbnQoU1swXVswXSxTWzBdWzFdKSxoLnBvaW50KFNbMV1bMF0sU1sxXVsxXSksaC5saW5lRW5kKCkpOihoLnBvaW50KFNbMV1bMF0sU1sxXVsxXSksaC5saW5lRW5kKCksaC5saW5lU3RhcnQoKSxoLnBvaW50KFNbMF1bMF0sU1swXVsxXSwzKSkpfW0mJighdXx8IUVyKHUsYikpJiZoLnBvaW50KGJbMF0sYlsxXSksdT1iLGQ9bSxmPU19LGxpbmVFbmQ6ZnVuY3Rpb24oKXtkJiZoLmxpbmVFbmQoKSx1PW51bGx9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIHl8KHAmJmQpPDwxfX19ZnVuY3Rpb24gYyhoLHUsZil7dmFyIGQ9RW4oaCkscD1Fbih1KSx5PVsxLDAsMF0sZz1oaShkLHApLHc9TXIoZyxnKSxiPWdbMF0seD13LWIqYjtpZigheClyZXR1cm4hZiYmaDt2YXIgbT10KncveCxNPS10KmIveCxTPWhpKHksZyksQT1Bcih5LG0pLHY9QXIoZyxNKTtEYShBLHYpO3ZhciBfPVMsVD1NcihBLF8pLHo9TXIoXyxfKSxDPVQqVC16KihNcihBLEEpLTEpO2lmKCEoQzwwKSl7dmFyIEI9WGUoQyksRj1BcihfLCgtVC1CKS96KTtpZihEYShGLEEpLEY9YnIoRiksIWYpcmV0dXJuIEY7dmFyIEU9aFswXSxJPXVbMF0sUj1oWzFdLFY9dVsxXSxVO0k8RSYmKFU9RSxFPUksST1VKTt2YXIgSz1JLUUsY3Q9dHQoSy1IKTxRLEZ0PWN0fHxLPFE7aWYoIWN0JiZWPFImJihVPVIsUj1WLFY9VSksRnQ/Y3Q/UitWPjBeRlsxXTwodHQoRlswXS1FKTxRP1I6Vik6Ujw9RlsxXSYmRlsxXTw9VjpLPkheKEU8PUZbMF0mJkZbMF08PUkpKXt2YXIgSXQ9QXIoXywoLVQrQikveik7cmV0dXJuIERhKEl0LEEpLFtGLGJyKEl0KV19fX1mdW5jdGlvbiBsKGgsdSl7dmFyIGY9bj9pOkgtaSxkPTA7cmV0dXJuIGg8LWY/ZHw9MTpoPmYmJihkfD0yKSx1PC1mP2R8PTQ6dT5mJiYoZHw9OCksZH1yZXR1cm4gWmgobyxhLHIsbj9bMCwtaV06Wy1ILGktSF0pfWZ1bmN0aW9uIFhwKGksdCxlLG4scyxyKXt2YXIgbz1pWzBdLGE9aVsxXSxjPXRbMF0sbD10WzFdLGg9MCx1PTEsZj1jLW8sZD1sLWEscDtpZihwPWUtbywhKCFmJiZwPjApKXtpZihwLz1mLGY8MCl7aWYocDxoKXJldHVybjtwPHUmJih1PXApfWVsc2UgaWYoZj4wKXtpZihwPnUpcmV0dXJuO3A+aCYmKGg9cCl9aWYocD1zLW8sISghZiYmcDwwKSl7aWYocC89ZixmPDApe2lmKHA+dSlyZXR1cm47cD5oJiYoaD1wKX1lbHNlIGlmKGY+MCl7aWYocDxoKXJldHVybjtwPHUmJih1PXApfWlmKHA9bi1hLCEoIWQmJnA+MCkpe2lmKHAvPWQsZDwwKXtpZihwPGgpcmV0dXJuO3A8dSYmKHU9cCl9ZWxzZSBpZihkPjApe2lmKHA+dSlyZXR1cm47cD5oJiYoaD1wKX1pZihwPXItYSwhKCFkJiZwPDApKXtpZihwLz1kLGQ8MCl7aWYocD51KXJldHVybjtwPmgmJihoPXApfWVsc2UgaWYoZD4wKXtpZihwPGgpcmV0dXJuO3A8dSYmKHU9cCl9cmV0dXJuIGg+MCYmKGlbMF09bytoKmYsaVsxXT1hK2gqZCksdTwxJiYodFswXT1vK3UqZix0WzFdPWErdSpkKSwhMH19fX19dmFyIFFpPTFlOSxJcj0tUWk7ZnVuY3Rpb24gWnAoaSx0LGUsbil7ZnVuY3Rpb24gcyhsLGgpe3JldHVybiBpPD1sJiZsPD1lJiZ0PD1oJiZoPD1ufWZ1bmN0aW9uIHIobCxoLHUsZil7dmFyIGQ9MCxwPTA7aWYobD09bnVsbHx8KGQ9byhsLHUpKSE9PShwPW8oaCx1KSl8fGMobCxoKTwwXnU+MClkbyBmLnBvaW50KGQ9PT0wfHxkPT09Mz9pOmUsZD4xP246dCk7d2hpbGUoKGQ9KGQrdSs0KSU0KSE9PXApO2Vsc2UgZi5wb2ludChoWzBdLGhbMV0pfWZ1bmN0aW9uIG8obCxoKXtyZXR1cm4gdHQobFswXS1pKTxRP2g+MD8wOjM6dHQobFswXS1lKTxRP2g+MD8yOjE6dHQobFsxXS10KTxRP2g+MD8xOjA6aD4wPzM6Mn1mdW5jdGlvbiBhKGwsaCl7cmV0dXJuIGMobC54LGgueCl9ZnVuY3Rpb24gYyhsLGgpe3ZhciB1PW8obCwxKSxmPW8oaCwxKTtyZXR1cm4gdSE9PWY/dS1mOnU9PT0wP2hbMV0tbFsxXTp1PT09MT9sWzBdLWhbMF06dT09PTI/bFsxXS1oWzFdOmhbMF0tbFswXX1yZXR1cm4gZnVuY3Rpb24obCl7dmFyIGg9bCx1PVZoKCksZixkLHAseSxnLHcsYix4LG0sTSxTLEE9e3BvaW50OnYsbGluZVN0YXJ0OkMsbGluZUVuZDpCLHBvbHlnb25TdGFydDpULHBvbHlnb25FbmQ6en07ZnVuY3Rpb24gdihFLEkpe3MoRSxJKSYmaC5wb2ludChFLEkpfWZ1bmN0aW9uIF8oKXtmb3IodmFyIEU9MCxJPTAsUj1kLmxlbmd0aDtJPFI7KytJKWZvcih2YXIgVj1kW0ldLFU9MSxLPVYubGVuZ3RoLGN0PVZbMF0sRnQsSXQsR3Q9Y3RbMF0sU3Q9Y3RbMV07VTxLOysrVSlGdD1HdCxJdD1TdCxjdD1WW1VdLEd0PWN0WzBdLFN0PWN0WzFdLEl0PD1uP1N0Pm4mJihHdC1GdCkqKG4tSXQpPihTdC1JdCkqKGktRnQpJiYrK0U6U3Q8PW4mJihHdC1GdCkqKG4tSXQpPChTdC1JdCkqKGktRnQpJiYtLUU7cmV0dXJuIEV9ZnVuY3Rpb24gVCgpe2g9dSxmPVtdLGQ9W10sUz0hMH1mdW5jdGlvbiB6KCl7dmFyIEU9XygpLEk9UyYmRSxSPShmPUhpKGYpKS5sZW5ndGg7KEl8fFIpJiYobC5wb2x5Z29uU3RhcnQoKSxJJiYobC5saW5lU3RhcnQoKSxyKG51bGwsbnVsbCwxLGwpLGwubGluZUVuZCgpKSxSJiZVaChmLGEsRSxyLGwpLGwucG9seWdvbkVuZCgpKSxoPWwsZj1kPXA9bnVsbH1mdW5jdGlvbiBDKCl7QS5wb2ludD1GLGQmJmQucHVzaChwPVtdKSxNPSEwLG09ITEsYj14PU5hTn1mdW5jdGlvbiBCKCl7ZiYmKEYoeSxnKSx3JiZtJiZ1LnJlam9pbigpLGYucHVzaCh1LnJlc3VsdCgpKSksQS5wb2ludD12LG0mJmgubGluZUVuZCgpfWZ1bmN0aW9uIEYoRSxJKXt2YXIgUj1zKEUsSSk7aWYoZCYmcC5wdXNoKFtFLEldKSxNKXk9RSxnPUksdz1SLE09ITEsUiYmKGgubGluZVN0YXJ0KCksaC5wb2ludChFLEkpKTtlbHNlIGlmKFImJm0paC5wb2ludChFLEkpO2Vsc2V7dmFyIFY9W2I9TWF0aC5tYXgoSXIsTWF0aC5taW4oUWksYikpLHg9TWF0aC5tYXgoSXIsTWF0aC5taW4oUWkseCkpXSxVPVtFPU1hdGgubWF4KElyLE1hdGgubWluKFFpLEUpKSxJPU1hdGgubWF4KElyLE1hdGgubWluKFFpLEkpKV07WHAoVixVLGksdCxlLG4pPyhtfHwoaC5saW5lU3RhcnQoKSxoLnBvaW50KFZbMF0sVlsxXSkpLGgucG9pbnQoVVswXSxVWzFdKSxSfHxoLmxpbmVFbmQoKSxTPSExKTpSJiYoaC5saW5lU3RhcnQoKSxoLnBvaW50KEUsSSksUz0hMSl9Yj1FLHg9SSxtPVJ9cmV0dXJuIEF9fXZhciBIYSxKYSxOcixrcixmaT17c3BoZXJlOkJ0LHBvaW50OkJ0LGxpbmVTdGFydDpXcCxsaW5lRW5kOkJ0LHBvbHlnb25TdGFydDpCdCxwb2x5Z29uRW5kOkJ0fTtmdW5jdGlvbiBXcCgpe2ZpLnBvaW50PUhwLGZpLmxpbmVFbmQ9R3B9ZnVuY3Rpb24gR3AoKXtmaS5wb2ludD1maS5saW5lRW5kPUJ0fWZ1bmN0aW9uIEhwKGksdCl7aSo9WCx0Kj1YLEphPWksTnI9cSh0KSxrcj1aKHQpLGZpLnBvaW50PUpwfWZ1bmN0aW9uIEpwKGksdCl7aSo9WCx0Kj1YO3ZhciBlPXEodCksbj1aKHQpLHM9dHQoaS1KYSkscj1aKHMpLG89cShzKSxhPW4qbyxjPWtyKmUtTnIqbipyLGw9TnIqZStrcipuKnI7SGEuYWRkKHVlKFhlKGEqYStjKmMpLGwpKSxKYT1pLE5yPWUsa3I9bn1mdW5jdGlvbiBZcChpKXtyZXR1cm4gSGE9bmV3IHFlLHhyKGksZmkpLCtIYX12YXIgWWE9W251bGwsbnVsbF0sanA9e3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOllhfTtmdW5jdGlvbiBkaShpLHQpe3JldHVybiBZYVswXT1pLFlhWzFdPXQsWXAoanApfXZhciBHaD17RmVhdHVyZTpmdW5jdGlvbihpLHQpe3JldHVybiBScihpLmdlb21ldHJ5LHQpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmZlYXR1cmVzLG49LTEscz1lLmxlbmd0aDsrK248czspaWYoUnIoZVtuXS5nZW9tZXRyeSx0KSlyZXR1cm4hMDtyZXR1cm4hMX19LEhoPXtTcGhlcmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sUG9pbnQ6ZnVuY3Rpb24oaSx0KXtyZXR1cm4gSmgoaS5jb29yZGluYXRlcyx0KX0sTXVsdGlQb2ludDpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscz1lLmxlbmd0aDsrK248czspaWYoSmgoZVtuXSx0KSlyZXR1cm4hMDtyZXR1cm4hMX0sTGluZVN0cmluZzpmdW5jdGlvbihpLHQpe3JldHVybiBZaChpLmNvb3JkaW5hdGVzLHQpfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5jb29yZGluYXRlcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KWlmKFloKGVbbl0sdCkpcmV0dXJuITA7cmV0dXJuITF9LFBvbHlnb246ZnVuY3Rpb24oaSx0KXtyZXR1cm4gamgoaS5jb29yZGluYXRlcyx0KX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuY29vcmRpbmF0ZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylpZihqaChlW25dLHQpKXJldHVybiEwO3JldHVybiExfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5nZW9tZXRyaWVzLG49LTEscz1lLmxlbmd0aDsrK248czspaWYoUnIoZVtuXSx0KSlyZXR1cm4hMDtyZXR1cm4hMX19O2Z1bmN0aW9uIFJyKGksdCl7cmV0dXJuIGkmJkhoLmhhc093blByb3BlcnR5KGkudHlwZSk/SGhbaS50eXBlXShpLHQpOiExfWZ1bmN0aW9uIEpoKGksdCl7cmV0dXJuIGRpKGksdCk9PT0wfWZ1bmN0aW9uIFloKGksdCl7Zm9yKHZhciBlLG4scyxyPTAsbz1pLmxlbmd0aDtyPG87cisrKXtpZihuPWRpKGlbcl0sdCksbj09PTB8fHI+MCYmKHM9ZGkoaVtyXSxpW3ItMV0pLHM+MCYmZTw9cyYmbjw9cyYmKGUrbi1zKSooMS1NYXRoLnBvdygoZS1uKS9zLDIpKTx5cipzKSlyZXR1cm4hMDtlPW59cmV0dXJuITF9ZnVuY3Rpb24gamgoaSx0KXtyZXR1cm4hIVhoKGkubWFwKFFwKSxRaCh0KSl9ZnVuY3Rpb24gUXAoaSl7cmV0dXJuIGk9aS5tYXAoUWgpLGkucG9wKCksaX1mdW5jdGlvbiBRaChpKXtyZXR1cm5baVswXSpYLGlbMV0qWF19ZnVuY3Rpb24gS3AoaSx0KXtyZXR1cm4oaSYmR2guaGFzT3duUHJvcGVydHkoaS50eXBlKT9HaFtpLnR5cGVdOlJyKShpLHQpfWZ1bmN0aW9uIHR5KGksdCl7dmFyIGU9aVswXSpYLG49aVsxXSpYLHM9dFswXSpYLHI9dFsxXSpYLG89WihuKSxhPXEobiksYz1aKHIpLGw9cShyKSxoPW8qWihlKSx1PW8qcShlKSxmPWMqWihzKSxkPWMqcShzKSxwPTIqWmUoWGUoZGgoci1uKStvKmMqZGgocy1lKSkpLHk9cShwKSxnPXA/ZnVuY3Rpb24odyl7dmFyIGI9cSh3Kj1wKS95LHg9cShwLXcpL3ksbT14KmgrYipmLE09eCp1K2IqZCxTPXgqYStiKmw7cmV0dXJuW3VlKE0sbSkqdXQsdWUoUyxYZShtKm0rTSpNKSkqdXRdfTpmdW5jdGlvbigpe3JldHVybltlKnV0LG4qdXRdfTtyZXR1cm4gZy5kaXN0YW5jZT1wLGd9dmFyIEtoPWk9PmkscGk9MS8wLExyPXBpLEtpPS1waSxPcj1LaSx0dT17cG9pbnQ6ZXksbGluZVN0YXJ0OkJ0LGxpbmVFbmQ6QnQscG9seWdvblN0YXJ0OkJ0LHBvbHlnb25FbmQ6QnQscmVzdWx0OmZ1bmN0aW9uKCl7dmFyIGk9W1twaSxMcl0sW0tpLE9yXV07cmV0dXJuIEtpPU9yPS0oTHI9cGk9MS8wKSxpfX07ZnVuY3Rpb24gZXkoaSx0KXtpPHBpJiYocGk9aSksaT5LaSYmKEtpPWkpLHQ8THImJihMcj10KSx0Pk9yJiYoT3I9dCl9ZnVuY3Rpb24gamEoaSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBRYTtmb3IodmFyIG4gaW4gaSllW25dPWlbbl07cmV0dXJuIGUuc3RyZWFtPXQsZX19ZnVuY3Rpb24gUWEoKXt9UWEucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpRYSxwb2ludDpmdW5jdGlvbihpLHQpe3RoaXMuc3RyZWFtLnBvaW50KGksdCl9LHNwaGVyZTpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBLYShpLHQsZSl7dmFyIG49aS5jbGlwRXh0ZW50JiZpLmNsaXBFeHRlbnQoKTtyZXR1cm4gaS5zY2FsZSgxNTApLnRyYW5zbGF0ZShbMCwwXSksbiE9bnVsbCYmaS5jbGlwRXh0ZW50KG51bGwpLHhyKGUsaS5zdHJlYW0odHUpKSx0KHR1LnJlc3VsdCgpKSxuIT1udWxsJiZpLmNsaXBFeHRlbnQobiksaX1mdW5jdGlvbiBldShpLHQsZSl7cmV0dXJuIEthKGksZnVuY3Rpb24obil7dmFyIHM9dFsxXVswXS10WzBdWzBdLHI9dFsxXVsxXS10WzBdWzFdLG89TWF0aC5taW4ocy8oblsxXVswXS1uWzBdWzBdKSxyLyhuWzFdWzFdLW5bMF1bMV0pKSxhPSt0WzBdWzBdKyhzLW8qKG5bMV1bMF0rblswXVswXSkpLzIsYz0rdFswXVsxXSsoci1vKihuWzFdWzFdK25bMF1bMV0pKS8yO2kuc2NhbGUoMTUwKm8pLnRyYW5zbGF0ZShbYSxjXSl9LGUpfWZ1bmN0aW9uIG55KGksdCxlKXtyZXR1cm4gZXUoaSxbWzAsMF0sdF0sZSl9ZnVuY3Rpb24gaXkoaSx0LGUpe3JldHVybiBLYShpLGZ1bmN0aW9uKG4pe3ZhciBzPSt0LHI9cy8oblsxXVswXS1uWzBdWzBdKSxvPShzLXIqKG5bMV1bMF0rblswXVswXSkpLzIsYT0tcipuWzBdWzFdO2kuc2NhbGUoMTUwKnIpLnRyYW5zbGF0ZShbbyxhXSl9LGUpfWZ1bmN0aW9uIHN5KGksdCxlKXtyZXR1cm4gS2EoaSxmdW5jdGlvbihuKXt2YXIgcz0rdCxyPXMvKG5bMV1bMV0tblswXVsxXSksbz0tcipuWzBdWzBdLGE9KHMtciooblsxXVsxXStuWzBdWzFdKSkvMjtpLnNjYWxlKDE1MCpyKS50cmFuc2xhdGUoW28sYV0pfSxlKX12YXIgbnU9MTYscnk9WigzMCpYKTtmdW5jdGlvbiBpdShpLHQpe3JldHVybit0P2F5KGksdCk6b3koaSl9ZnVuY3Rpb24gb3koaSl7cmV0dXJuIGphKHtwb2ludDpmdW5jdGlvbih0LGUpe3Q9aSh0LGUpLHRoaXMuc3RyZWFtLnBvaW50KHRbMF0sdFsxXSl9fSl9ZnVuY3Rpb24gYXkoaSx0KXtmdW5jdGlvbiBlKG4scyxyLG8sYSxjLGwsaCx1LGYsZCxwLHksZyl7dmFyIHc9bC1uLGI9aC1zLHg9dyp3K2IqYjtpZih4PjQqdCYmeS0tKXt2YXIgbT1vK2YsTT1hK2QsUz1jK3AsQT1YZShtKm0rTSpNK1MqUyksdj1aZShTLz1BKSxfPXR0KHR0KFMpLTEpPFF8fHR0KHItdSk8UT8ocit1KS8yOnVlKE0sbSksVD1pKF8sdiksej1UWzBdLEM9VFsxXSxCPXotbixGPUMtcyxFPWIqQi13KkY7KEUqRS94PnR8fHR0KCh3KkIrYipGKS94LS41KT4uM3x8bypmK2EqZCtjKnA8cnkpJiYoZShuLHMscixvLGEsYyx6LEMsXyxtLz1BLE0vPUEsUyx5LGcpLGcucG9pbnQoeixDKSxlKHosQyxfLG0sTSxTLGwsaCx1LGYsZCxwLHksZykpfX1yZXR1cm4gZnVuY3Rpb24obil7dmFyIHMscixvLGEsYyxsLGgsdSxmLGQscCx5LGc9e3BvaW50OncsbGluZVN0YXJ0OmIsbGluZUVuZDptLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe24ucG9seWdvblN0YXJ0KCksZy5saW5lU3RhcnQ9TX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpLGcubGluZVN0YXJ0PWJ9fTtmdW5jdGlvbiB3KHYsXyl7dj1pKHYsXyksbi5wb2ludCh2WzBdLHZbMV0pfWZ1bmN0aW9uIGIoKXt1PU5hTixnLnBvaW50PXgsbi5saW5lU3RhcnQoKX1mdW5jdGlvbiB4KHYsXyl7dmFyIFQ9RW4oW3YsX10pLHo9aSh2LF8pO2UodSxmLGgsZCxwLHksdT16WzBdLGY9elsxXSxoPXYsZD1UWzBdLHA9VFsxXSx5PVRbMl0sbnUsbiksbi5wb2ludCh1LGYpfWZ1bmN0aW9uIG0oKXtnLnBvaW50PXcsbi5saW5lRW5kKCl9ZnVuY3Rpb24gTSgpe2IoKSxnLnBvaW50PVMsZy5saW5lRW5kPUF9ZnVuY3Rpb24gUyh2LF8pe3gocz12LF8pLHI9dSxvPWYsYT1kLGM9cCxsPXksZy5wb2ludD14fWZ1bmN0aW9uIEEoKXtlKHUsZixoLGQscCx5LHIsbyxzLGEsYyxsLG51LG4pLGcubGluZUVuZD1tLG0oKX1yZXR1cm4gZ319dmFyIGN5PWphKHtwb2ludDpmdW5jdGlvbihpLHQpe3RoaXMuc3RyZWFtLnBvaW50KGkqWCx0KlgpfX0pO2Z1bmN0aW9uIGx5KGkpe3JldHVybiBqYSh7cG9pbnQ6ZnVuY3Rpb24odCxlKXt2YXIgbj1pKHQsZSk7cmV0dXJuIHRoaXMuc3RyZWFtLnBvaW50KG5bMF0sblsxXSl9fSl9ZnVuY3Rpb24gaHkoaSx0LGUsbixzKXtmdW5jdGlvbiByKG8sYSl7cmV0dXJuIG8qPW4sYSo9cyxbdCtpKm8sZS1pKmFdfXJldHVybiByLmludmVydD1mdW5jdGlvbihvLGEpe3JldHVyblsoby10KS9pKm4sKGUtYSkvaSpzXX0scn1mdW5jdGlvbiBzdShpLHQsZSxuLHMscil7aWYoIXIpcmV0dXJuIGh5KGksdCxlLG4scyk7dmFyIG89WihyKSxhPXEociksYz1vKmksbD1hKmksaD1vL2ksdT1hL2ksZj0oYSplLW8qdCkvaSxkPShhKnQrbyplKS9pO2Z1bmN0aW9uIHAoeSxnKXtyZXR1cm4geSo9bixnKj1zLFtjKnktbCpnK3QsZS1sKnktYypnXX1yZXR1cm4gcC5pbnZlcnQ9ZnVuY3Rpb24oeSxnKXtyZXR1cm5bbiooaCp5LXUqZytmKSxzKihkLXUqeS1oKmcpXX0scH1mdW5jdGlvbiBEcihpKXtyZXR1cm4gdXkoZnVuY3Rpb24oKXtyZXR1cm4gaX0pKCl9ZnVuY3Rpb24gdXkoaSl7dmFyIHQsZT0xNTAsbj00ODAscz0yNTAscj0wLG89MCxhPTAsYz0wLGw9MCxoLHU9MCxmPTEsZD0xLHA9bnVsbCx5PVdoLGc9bnVsbCx3LGIseCxtPUtoLE09LjUsUyxBLHYsXyxUO2Z1bmN0aW9uIHooRSl7cmV0dXJuIHYoRVswXSpYLEVbMV0qWCl9ZnVuY3Rpb24gQyhFKXtyZXR1cm4gRT12LmludmVydChFWzBdLEVbMV0pLEUmJltFWzBdKnV0LEVbMV0qdXRdfXouc3RyZWFtPWZ1bmN0aW9uKEUpe3JldHVybiBfJiZUPT09RT9fOl89Y3kobHkoaCkoeShTKG0oVD1FKSkpKSl9LHoucHJlY2xpcD1mdW5jdGlvbihFKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT1FLHA9dm9pZCAwLEYoKSk6eX0sei5wb3N0Y2xpcD1mdW5jdGlvbihFKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT1FLGc9dz1iPXg9bnVsbCxGKCkpOm19LHouY2xpcEFuZ2xlPWZ1bmN0aW9uKEUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PStFP3FwKHA9RSpYKToocD1udWxsLFdoKSxGKCkpOnAqdXR9LHouY2xpcEV4dGVudD1mdW5jdGlvbihFKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT1FPT1udWxsPyhnPXc9Yj14PW51bGwsS2gpOlpwKGc9K0VbMF1bMF0sdz0rRVswXVsxXSxiPStFWzFdWzBdLHg9K0VbMV1bMV0pLEYoKSk6Zz09bnVsbD9udWxsOltbZyx3XSxbYix4XV19LHouc2NhbGU9ZnVuY3Rpb24oRSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K0UsQigpKTplfSx6LnRyYW5zbGF0ZT1mdW5jdGlvbihFKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rRVswXSxzPStFWzFdLEIoKSk6W24sc119LHouY2VudGVyPWZ1bmN0aW9uKEUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPUVbMF0lMzYwKlgsbz1FWzFdJTM2MCpYLEIoKSk6W3IqdXQsbyp1dF19LHoucm90YXRlPWZ1bmN0aW9uKEUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPUVbMF0lMzYwKlgsYz1FWzFdJTM2MCpYLGw9RS5sZW5ndGg+Mj9FWzJdJTM2MCpYOjAsQigpKTpbYSp1dCxjKnV0LGwqdXRdfSx6LmFuZ2xlPWZ1bmN0aW9uKEUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PUUlMzYwKlgsQigpKTp1KnV0fSx6LnJlZmxlY3RYPWZ1bmN0aW9uKEUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPUU/LTE6MSxCKCkpOmY8MH0sei5yZWZsZWN0WT1mdW5jdGlvbihFKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1FPy0xOjEsQigpKTpkPDB9LHoucHJlY2lzaW9uPWZ1bmN0aW9uKEUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhTPWl1KEEsTT1FKkUpLEYoKSk6WGUoTSl9LHouZml0RXh0ZW50PWZ1bmN0aW9uKEUsSSl7cmV0dXJuIGV1KHosRSxJKX0sei5maXRTaXplPWZ1bmN0aW9uKEUsSSl7cmV0dXJuIG55KHosRSxJKX0sei5maXRXaWR0aD1mdW5jdGlvbihFLEkpe3JldHVybiBpeSh6LEUsSSl9LHouZml0SGVpZ2h0PWZ1bmN0aW9uKEUsSSl7cmV0dXJuIHN5KHosRSxJKX07ZnVuY3Rpb24gQigpe3ZhciBFPXN1KGUsMCwwLGYsZCx1KS5hcHBseShudWxsLHQocixvKSksST1zdShlLG4tRVswXSxzLUVbMV0sZixkLHUpO3JldHVybiBoPWtoKGEsYyxsKSxBPVphKHQsSSksdj1aYShoLEEpLFM9aXUoQSxNKSxGKCl9ZnVuY3Rpb24gRigpe3JldHVybiBfPVQ9bnVsbCx6fXJldHVybiBmdW5jdGlvbigpe3JldHVybiB0PWkuYXBwbHkodGhpcyxhcmd1bWVudHMpLHouaW52ZXJ0PXQuaW52ZXJ0JiZDLEIoKX19ZnVuY3Rpb24gZnkoaSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dmFyIG49WGUodCp0K2UqZSkscz1pKG4pLHI9cShzKSxvPVoocyk7cmV0dXJuW3VlKHQqcixuKm8pLFplKG4mJmUqci9uKV19fWZ1bmN0aW9uIHRjKGksdCl7cmV0dXJuW2ksQXAodnAoKHF0K3QpLzIpKV19dGMuaW52ZXJ0PWZ1bmN0aW9uKGksdCl7cmV0dXJuW2ksMipJYShNcCh0KSktcXRdfTtmdW5jdGlvbiBkeSgpe3JldHVybiBweSh0Yykuc2NhbGUoOTYxL1h0KX1mdW5jdGlvbiBweShpKXt2YXIgdD1EcihpKSxlPXQuY2VudGVyLG49dC5zY2FsZSxzPXQudHJhbnNsYXRlLHI9dC5jbGlwRXh0ZW50LG89bnVsbCxhLGMsbDt0LnNjYWxlPWZ1bmN0aW9uKHUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuKHUpLGgoKSk6bigpfSx0LnRyYW5zbGF0ZT1mdW5jdGlvbih1KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocyh1KSxoKCkpOnMoKX0sdC5jZW50ZXI9ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGUodSksaCgpKTplKCl9LHQuY2xpcEV4dGVudD1mdW5jdGlvbih1KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT09bnVsbD9vPWE9Yz1sPW51bGw6KG89K3VbMF1bMF0sYT0rdVswXVsxXSxjPSt1WzFdWzBdLGw9K3VbMV1bMV0pLGgoKSk6bz09bnVsbD9udWxsOltbbyxhXSxbYyxsXV19O2Z1bmN0aW9uIGgoKXt2YXIgdT1IKm4oKSxmPXQoRGgodC5yb3RhdGUoKSkuaW52ZXJ0KFswLDBdKSk7cmV0dXJuIHIobz09bnVsbD9bW2ZbMF0tdSxmWzFdLXVdLFtmWzBdK3UsZlsxXSt1XV06aT09PXRjP1tbTWF0aC5tYXgoZlswXS11LG8pLGFdLFtNYXRoLm1pbihmWzBdK3UsYyksbF1dOltbbyxNYXRoLm1heChmWzFdLXUsYSldLFtjLE1hdGgubWluKGZbMV0rdSxsKV1dKX1yZXR1cm4gaCgpfWZ1bmN0aW9uIGVjKGksdCl7cmV0dXJuW2ksdF19ZWMuaW52ZXJ0PWVjO2Z1bmN0aW9uIHl5KCl7cmV0dXJuIERyKGVjKS5zY2FsZSgxNTIuNjMpfWZ1bmN0aW9uIHJ1KGksdCl7dmFyIGU9Wih0KSxuPTErWihpKSplO3JldHVybltlKnEoaSkvbixxKHQpL25dfXJ1LmludmVydD1meShmdW5jdGlvbihpKXtyZXR1cm4gMipJYShpKX0pO2Z1bmN0aW9uIG15KCl7cmV0dXJuIERyKHJ1KS5zY2FsZSgyNTApLmNsaXBBbmdsZSgxNDIpfXZhciAkcj1NYXRoLmFicyx5aT1NYXRoLmNvcyxfZT1NYXRoLnNpbix0cz0xZS02LFZyPU1hdGguUEksbmM9VnIvMjtmdW5jdGlvbiBneShpKXtyZXR1cm4gaT9pL01hdGguc2luKGkpOjF9ZnVuY3Rpb24gaWMoaSl7cmV0dXJuIGk+MT8wOmk8LTE/VnI6TWF0aC5hY29zKGkpfWZ1bmN0aW9uIG91KGkpe3JldHVybiBpPjA/TWF0aC5zcXJ0KGkpOjB9ZnVuY3Rpb24gYXUoaSx0KXt2YXIgZT15aSh0KSxuPWd5KGljKGUqeWkoaS89MikpKTtyZXR1cm5bMiplKl9lKGkpKm4sX2UodCkqbl19YXUuaW52ZXJ0PWZ1bmN0aW9uKGksdCl7aWYoIShpKmkrNCp0KnQ+VnIqVnIrdHMpKXt2YXIgZT1pLG49dCxzPTI1O2Rve3ZhciByPV9lKGUpLG89X2UoZS8yKSxhPXlpKGUvMiksYz1fZShuKSxsPXlpKG4pLGg9X2UoMipuKSx1PWMqYyxmPWwqbCxkPW8qbyxwPTEtZiphKmEseT1wP2ljKGwqYSkqb3UoZz0xL3ApOmc9MCxnLHc9Mip5Kmwqby1pLGI9eSpjLXQseD1nKihmKmQreSpsKmEqdSksbT1nKiguNSpyKmgteSoyKmMqbyksTT1nKi4yNSooaCpvLXkqYypmKnIpLFM9ZyoodSphK3kqZCpsKSxBPW0qTS1TKng7aWYoIUEpYnJlYWs7dmFyIHY9KGIqbS13KlMpL0EsXz0odypNLWIqeCkvQTtlLT12LG4tPV99d2hpbGUoKCRyKHYpPnRzfHwkcihfKT50cykmJi0tcz4wKTtyZXR1cm5bZSxuXX19O2Z1bmN0aW9uIGN1KGksdCl7dmFyIGU9YXUoaSx0KTtyZXR1cm5bKGVbMF0raS9uYykvMiwoZVsxXSt0KS8yXX1jdS5pbnZlcnQ9ZnVuY3Rpb24oaSx0KXt2YXIgZT1pLG49dCxzPTI1O2Rve3ZhciByPXlpKG4pLG89X2UobiksYT1fZSgyKm4pLGM9bypvLGw9cipyLGg9X2UoZSksdT15aShlLzIpLGY9X2UoZS8yKSxkPWYqZixwPTEtbCp1KnUseT1wP2ljKHIqdSkqb3UoZz0xL3ApOmc9MCxnLHc9LjUqKDIqeSpyKmYrZS9uYyktaSxiPS41Kih5Km8rbiktdCx4PS41KmcqKGwqZCt5KnIqdSpjKSsuNS9uYyxtPWcqKGgqYS80LXkqbypmKSxNPS4xMjUqZyooYSpmLXkqbypsKmgpLFM9LjUqZyooYyp1K3kqZCpyKSsuNSxBPW0qTS1TKngsdj0oYiptLXcqUykvQSxfPSh3Kk0tYip4KS9BO2UtPXYsbi09X313aGlsZSgoJHIodik+dHN8fCRyKF8pPnRzKSYmLS1zPjApO3JldHVybltlLG5dfTtmdW5jdGlvbiB4eSgpe3JldHVybiBEcihjdSkuc2NhbGUoMTU4LjgzNyl9Y29uc3Qgd3k9e21lcmNhdG9yOmR5LGVxdWlyZWN0YW5ndWxhcjp5eSx3aW5rZWwzOnh5fSxzYz17fSxlcz1pPT57dmFyIG4scyxyO2NvbnN0IHQ9SlNPTi5zdHJpbmdpZnkoaSk7aWYoc2NbdF0pcmV0dXJuIHNjW3RdO2NvbnN0IGU9d3lbKG49aS5wcm9qZWN0aW9uVHlwZSkhPW51bGw/bjoibWVyY2F0b3IiXSgpLmNlbnRlcihpLmNlbnRlcikuc2NhbGUoaS5zY2FsZSkudHJhbnNsYXRlKChzPWkudHJhbnNsYXRlKSE9bnVsbD9zOlswLDBdKS5wcmVjaXNpb24oKHI9aS5wcmVjaXNpb24pIT1udWxsP3I6LjEpO3JldHVybiBpLnJvdGF0ZSYmZS5yb3RhdGUoaS5yb3RhdGUpLHNjW3RdPWUsZX07ZnVuY3Rpb24gYnkoaSx0LGU9MCl7Y29uc3Qgbj0oOTAtdCkqTWF0aC5QSS8xODAscz0oOTAtaSkqTWF0aC5QSS8xODA7cmV0dXJuW2UqTWF0aC5zaW4obikqTWF0aC5jb3MocyksZSpNYXRoLmNvcyhuKSxlKk1hdGguc2luKG4pKk1hdGguc2luKHMpXX1jb25zdCBVcj0oaSx0KT0+aS5tYXAoKFtlLG5dKT0+e2xldCBzO2lmKHQpe2NvbnN0W3Isb109dChbZSxuXSk7cz1uZXcgTihyLC1vKX1lbHNlIHM9bmV3IE4oZSxuKTtyZXR1cm4gc30pLG5zPSh7Y29vcmRpbmF0ZXM6aSxsZW5ndGhzOnQsbWV0YUxlbmd0aDplLGRpbWVuc2lvbjpuPTJ9KT0+e2NvbnN0IHM9W10scj1bXTtpZihpJiZ0JiZpIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5KXtsZXQgbz0wO3MubGVuZ3RoPXQubGVuZ3RoO2ZvcihsZXQgYT0wO2E8dC5sZW5ndGg7YSsrKXtjb25zdCBjPXRbYV0sbD1uZXcgQXJyYXkoYyk7Zm9yKGxldCBoPTA7aDxjO2grKylsW2hdPUFycmF5LmZyb20oaS5zdWJhcnJheShvLG8rbikpLG8rPW47c1thXT1sfWlmKGUpe2NvbnN0IGE9KGkubGVuZ3RoLW8pL2U7ci5sZW5ndGg9YTtmb3IobGV0IGM9MDtjPGE7YysrKXJbY109QXJyYXkuZnJvbShpLnN1YmFycmF5KG8sbytlKSksbys9ZX19cmV0dXJue2Nvb3JkaW5hdGVzQXJyOnMsbWV0YUFycmF5OnJ9fTt2YXIgaXM9KGksdCk9Pntjb25zdCBlPXVoKGksdCE9bnVsbD90OjApLG49e30scz1bXSxyPU9iamVjdC5rZXlzKGUuYXR0cmlidXRlcyk7cmV0dXJuIGUuaW5kZXgmJnIucHVzaCgiaW5kZXgiKSxyLmZvckVhY2gobz0+e2NvbnN0IGE9bz09PSJpbmRleCI/ZS5pbmRleDplLmF0dHJpYnV0ZXNbb107bltvXT17YXJyYXk6YS5hcnJheSxpdGVtU2l6ZTphLml0ZW1TaXplfSxzLnB1c2goYS5hcnJheS5idWZmZXIpfSksdCYmKG4uZ3JvdXBzPWUuZ3JvdXBzKSxlLmRpc3Bvc2UoKSxpLmZvckVhY2gobz0+e28uZGlzcG9zZSgpfSkse21lc3NhZ2U6bix0cmFuc2ZlcjpzfX0scmM9KGksdD0zMDAsZSk9Pntjb25zdCBuPVtdLHM9W107cmV0dXJuIGkuZm9yRWFjaCgocixvKT0+e2xldCBhPSExO2ZvcihsZXQgYz0xO2M8ci5sZW5ndGg7YysrKWlmKE1hdGguYWJzKHJbY10ueC1yW2MtMV0ueCk+dCl7YT0hMDticmVha31pZihhKXtjb25zdCBjPVtdLGw9W107ci5mb3JFYWNoKGg9PntoLng8MD9jLnB1c2goaCk6bC5wdXNoKGgpfSksbi5wdXNoKGMsbCksZSYmcy5wdXNoKGVbb10sZVtvXSl9ZWxzZSBuLnB1c2gociksZSYmcy5wdXNoKGVbb10pfSkse3NwbGl0UG9seWdvbnM6bixzcGxpdE1ldGE6c319O2Z1bmN0aW9uIE15KGksdCxlPTApe2NvbnN0W24scyxyLG9dPWk7bGV0IGE9MS8wLGM9MS8wLGw9LTEvMCxoPS0xLzA7Zm9yKGxldCB1PTA7dTw9ZTt1Kyspe2NvbnN0IGY9ZSYmdS9lO1VyKFtbbitmKihyLW4pLHNdLFtuK2YqKHItbiksb10sW24scytmKihvLXMpXSxbcixzK2YqKG8tcyldXSx0KS5mb3JFYWNoKGQ9PnthPU1hdGgubWluKGEsZC54KSxjPU1hdGgubWluKGMsZC55KSxsPU1hdGgubWF4KGwsZC54KSxoPU1hdGgubWF4KGgsZC55KX0pfXJldHVybltbYSxjXSxbbCxoXV19Y29uc3QgQXk9KHtjb29yZGluYXRlczppLGxlbmd0aHM6dCxtZXRhTGVuZ3RoOmUsc3BsaXQ6bixiYm94OnMscHJvamVjdGlvbjpyLHVzZUdyb3VwczpvLGhhc1RvcDphLGhhc0JvdHRvbTpjLGhhc1NpZGU6bCxzcGxpdFBvbHlnb25zOmgsdG9wU2VnbWVudHM6dX0pPT57Y29uc3QgZj1yJiZlcyhyKSx7Y29vcmRpbmF0ZXNBcnI6ZCxtZXRhQXJyYXk6cH09bnMoe2Nvb3JkaW5hdGVzOmksbGVuZ3Roczp0LG1ldGFMZW5ndGg6ZX0pO2xldCB5PWQubWFwKHg9PlVyKHgsZikpLGc9cDtpZihoKXtjb25zdCB4PXJjKHksaCxwKTt5PXguc3BsaXRQb2x5Z29ucyxnPXguc3BsaXRNZXRhfWxldCB3O2lmKHMpe2NvbnN0IHg9c1swXT09PS0xODAmJnNbMl09PT0xODAmJihyPT1udWxsP3ZvaWQgMDpyLnJvdGF0ZSksW20sTV09TXkocyx4P2VzKEtlKFZ0KHt9LHIpLHtyb3RhdGU6dm9pZCAwfSkpOmYsKHI9PW51bGw/dm9pZCAwOnIucHJvamVjdGlvblR5cGUpPT09IndpbmtlbDMiPzEwOjApO3c9bmV3IGd0KG5ldyBQKG1bMF0sbVsxXSwwKSxuZXcgUChNWzBdLE1bMV0sMCkpfWNvbnN0IGI9eS5tYXAoKHgsbSk9Pntjb25zdCBNPWdbbV1bMF0sUz1nW21dWzFdfHwwLEE9Z1ttXVsyXXx8MSx2PWxwKHtwb2ludHM6eCxzcGxpdDpuLHNpZGVSZXBlYXQ6QSxkZXB0aDpNLGhhc1RvcDphLGhhc0JvdHRvbTpjLGhhc1NpZGU6bCxib3gzOncsdG9wU2VnbWVudHM6dX0pO2lmKFMpe2NvbnN0IF89di5hdHRyaWJ1dGVzLnBvc2l0aW9uO2ZvcihsZXQgVD0wO1Q8Xy5jb3VudDtUKyspXy5zZXRaKFQsXy5nZXRaKFQpK1MpO18ubmVlZHNVcGRhdGU9ITB9cmV0dXJuIHZ9KTtyZXR1cm4gaXMoYixvKX07Y2xhc3MgU3kgZXh0ZW5kcyBBZXtjb25zdHJ1Y3Rvcih0PVtdLGU9Im5vbmUiLG4pe3N1cGVyKCksdGhpcy50eXBlPSJNZXNoTGluZUdlb21ldHJ5Iix0aGlzLnBvaW50Q291bnQ9MCx0aGlzLl9wb2ludHM9W10sdGhpcy5zaGFwZT0ibm9uZSIsdGhpcy5zaGFwZUZ1bmN0aW9uPXM9PjEsdGhpcy5tYXRyaXhXb3JsZD1uZXcgc3QsdGhpcy5zaGFwZT1lLG4mJih0aGlzLnNoYXBlRnVuY3Rpb249biksdC5sZW5ndGg+MCYmdGhpcy5zZXRQb2ludHModCl9Y29udmVydFRvVmVjdG9yM0FycmF5KHQpe2lmKHR5cGVvZiB0WzBdPT0ibnVtYmVyIil7Y29uc3QgZT1bXSxuPXQ7Zm9yKGxldCBzPTA7czxuLmxlbmd0aDtzKz0zKWUucHVzaChuZXcgUChuW3NdLG5bcysxXSxuW3MrMl0pKTtyZXR1cm4gZX1lbHNlIHJldHVybiB0Lm1hcChlPT57aWYoZSBpbnN0YW5jZW9mIE4pcmV0dXJuIG5ldyBQKGUueCxlLnksMCk7aWYoZSBpbnN0YW5jZW9mIFApcmV0dXJuIGU7aWYoQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGg9PT0yKXJldHVybiBuZXcgUChlWzBdLGVbMV0sMCk7aWYoQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGg9PT0zKXJldHVybiBuZXcgUChlWzBdLGVbMV0sZVsyXSl9KS5maWx0ZXIoQm9vbGVhbil9c2V0TWF0cml4V29ybGQodCl7dGhpcy5tYXRyaXhXb3JsZD10fXNldFBvaW50cyh0LGUpeyF0fHx0Lmxlbmd0aD09PTB8fCh0aGlzLl9wb2ludHM9dGhpcy5jb252ZXJ0VG9WZWN0b3IzQXJyYXkodCksdGhpcy5wb2ludENvdW50PXRoaXMuX3BvaW50cy5sZW5ndGgsZSYmKHRoaXMuc2hhcGVGdW5jdGlvbj1lLHRoaXMuc2hhcGU9ImN1c3RvbSIpLHRoaXMuaW5pdGlhbGl6ZUdlb21ldHJ5KCksdGhpcy51cGRhdGVHZW9tZXRyeSgpKX1pbml0aWFsaXplR2VvbWV0cnkoKXtjb25zdCB0PW5ldyB4dChuZXcgRmxvYXQzMkFycmF5KHRoaXMucG9pbnRDb3VudCo2KSwzKSxlPW5ldyB4dChuZXcgRmxvYXQzMkFycmF5KHRoaXMucG9pbnRDb3VudCo2KSwzKSxuPW5ldyB4dChuZXcgRmxvYXQzMkFycmF5KHRoaXMucG9pbnRDb3VudCo2KSwzKSxzPW5ldyB4dChuZXcgRmxvYXQzMkFycmF5KHRoaXMucG9pbnRDb3VudCoyKSwxKSxyPW5ldyB4dChuZXcgRmxvYXQzMkFycmF5KHRoaXMucG9pbnRDb3VudCoyKSwxKSxvPW5ldyB4dChuZXcgRmxvYXQzMkFycmF5KHRoaXMucG9pbnRDb3VudCoyKSwxKSxhPW5ldyB4dChuZXcgRmxvYXQzMkFycmF5KHRoaXMucG9pbnRDb3VudCo0KSwyKSxjPW5ldyB4dChuZXcgVWludDE2QXJyYXkoKHRoaXMucG9pbnRDb3VudC0xKSo2KSwxKTt0aGlzLnNoYXBlPT09InRhcGVyIiYmKHRoaXMuc2hhcGVGdW5jdGlvbj1sPT4xKk1hdGgucG93KDQqbCooMS1sKSwxKSk7Zm9yKGxldCBsPTAsaD0wLHU9MDtsPHRoaXMucG9pbnRDb3VudDtsKz0xLGgrPTIsdSs9Nil7cy5zZXRYKGgsbC90aGlzLnBvaW50Q291bnQpLHMuc2V0WChoKzEsbC90aGlzLnBvaW50Q291bnQpLHIuc2V0WChoLDEpLHIuc2V0WChoKzEsLTEpO2NvbnN0IGY9dGhpcy5zaGFwZT09PSJub25lIj8xOnRoaXMuc2hhcGVGdW5jdGlvbihsLyh0aGlzLnBvaW50Q291bnQtMSkpO28uc2V0WChoLGYpLG8uc2V0WChoKzEsZik7Y29uc3QgZD1sLyh0aGlzLnBvaW50Q291bnQtMSk7aWYoYS5zZXRYWShoLGQsMCksYS5zZXRYWShoKzEsZCwxKSxsPHRoaXMucG9pbnRDb3VudC0xKXtjb25zdCBwPWwqMjtjLnNldFgodSswLHArMCksYy5zZXRYKHUrMSxwKzEpLGMuc2V0WCh1KzIscCsyKSxjLnNldFgodSszLHArMiksYy5zZXRYKHUrNCxwKzEpLGMuc2V0WCh1KzUscCszKX19dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIix0KSx0aGlzLnNldEF0dHJpYnV0ZSgicHJldmlvdXMiLGUpLHRoaXMuc2V0QXR0cmlidXRlKCJuZXh0IixuKSx0aGlzLnNldEF0dHJpYnV0ZSgiY291bnRlcnMiLHMpLHRoaXMuc2V0QXR0cmlidXRlKCJzaWRlIixyKSx0aGlzLnNldEF0dHJpYnV0ZSgid2lkdGgiLG8pLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsYSksdGhpcy5zZXRJbmRleChjKX11cGRhdGVHZW9tZXRyeSgpe2lmKCF0aGlzLl9wb2ludHNbMF0pcmV0dXJuO2NvbnN0IHQ9dGhpcy5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiksZT10aGlzLmdldEF0dHJpYnV0ZSgicHJldmlvdXMiKSxuPXRoaXMuZ2V0QXR0cmlidXRlKCJuZXh0Iik7bGV0IHM9MCxyPTAsbz0wO2NvbnN0IGE9dGhpcy5fcG9pbnRzWzBdO2Uuc2V0WFlaKHIsYS54LGEueSxhLnopLHIrPTEsZS5zZXRYWVoocixhLngsYS55LGEueikscis9MTtmb3IobGV0IGw9MDtsPHRoaXMucG9pbnRDb3VudDtsKyspe2NvbnN0IGg9dGhpcy5fcG9pbnRzW2xdO3Quc2V0WFlaKHMsaC54LGgueSxoLnopLHMrPTEsdC5zZXRYWVoocyxoLngsaC55LGgueikscys9MSxsPHRoaXMucG9pbnRDb3VudC0xJiYoZS5zZXRYWVoocixoLngsaC55LGgueikscis9MSxlLnNldFhZWihyLGgueCxoLnksaC56KSxyKz0xKSxsPjAmJmwrMTw9dGhpcy5wb2ludENvdW50JiYobi5zZXRYWVoobyxoLngsaC55LGgueiksbys9MSxuLnNldFhZWihvLGgueCxoLnksaC56KSxvKz0xKX1jb25zdCBjPXRoaXMuX3BvaW50c1t0aGlzLnBvaW50Q291bnQtMV07bi5zZXRYWVoobyxjLngsYy55LGMueiksbys9MSxuLnNldFhZWihvLGMueCxjLnksYy56KSxvKz0xLHQubmVlZHNVcGRhdGU9ITAsZS5uZWVkc1VwZGF0ZT0hMCxuLm5lZWRzVXBkYXRlPSEwLHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKX1nZXQgcG9pbnRzKCl7cmV0dXJuIHRoaXMuX3BvaW50c31zZXQgcG9pbnRzKHQpe3RoaXMuc2V0UG9pbnRzKHQpfXVwZGF0ZVBvaW50cyh0LGUpe2NvbnN0IG49dGhpcy5jb252ZXJ0VG9WZWN0b3IzQXJyYXkodCk7aWYobi5sZW5ndGghPT10aGlzLnBvaW50Q291bnQpe2NvbnNvbGUud2FybigiTWVzaExpbmVHZW9tZXRyeTogQ2Fubm90IHVwZGF0ZSBwb2ludHMgd2l0aCBkaWZmZXJlbnQgbGVuZ3RoLiBVc2Ugc2V0UG9pbnRzKCkgaW5zdGVhZC4iKTtyZXR1cm59dGhpcy5fcG9pbnRzPW4sZSYmKHRoaXMuc2hhcGVGdW5jdGlvbj1lLHRoaXMuc2hhcGU9ImN1c3RvbSIsdGhpcy5pbml0aWFsaXplR2VvbWV0cnkoKSksdGhpcy51cGRhdGVHZW9tZXRyeSgpfXNldFNoYXBlKHQsZSl7dGhpcy5zaGFwZT10LGUmJih0aGlzLnNoYXBlRnVuY3Rpb249ZSksdGhpcy5fcG9pbnRzLmxlbmd0aD4wJiYodGhpcy5pbml0aWFsaXplR2VvbWV0cnkoKSx0aGlzLnVwZGF0ZUdlb21ldHJ5KCkpfX12YXIgbHU9aT0+e2NvbnN0e3NldFBvaW50V2lkdGg6dCxub2RlczplfT1pLG49bmV3IFN5O3JldHVybiBuLnNldFBvaW50cyhlLHQpLG59O2NvbnN0IHZ5PSh7Y29vcmRpbmF0ZXM6aSxsZW5ndGhzOnQsbWV0YUxlbmd0aDplLHByb2plY3Rpb246bix1c2VHcm91cHM6cyxzcGxpdFBvbHlnb25zOnJ9KT0+e2NvbnN0IG89biYmZXMobikse2Nvb3JkaW5hdGVzQXJyOmEsbWV0YUFycmF5OmN9PW5zKHtjb29yZGluYXRlczppLGxlbmd0aHM6dCxtZXRhTGVuZ3RoOmV9KTtsZXQgbD1hLm1hcChmPT5VcihmLG8pKSxoPWM7aWYocil7Y29uc3QgZj1yYyhsLHIsaCk7bD1mLnNwbGl0UG9seWdvbnMsaD1mLnNwbGl0TWV0YX1jb25zdCB1PWwubWFwKChmLGQpPT57Y29uc3QgcD1oW2RdWzBdfHwxO3JldHVybiBsdSh7bm9kZXM6ZixzZXRQb2ludFdpZHRoOigpPT5wfSl9KTtyZXR1cm4gaXModSxzKX07dmFyIF95PWk9Pntjb25zdHtwb2ludHM6dH09aSxlPXQucmVkdWNlKChzLHIsbyk9PihvPHQubGVuZ3RoLTEmJnMucHVzaChyLHRbbysxXSkscyksW10pO3JldHVybiBuZXcgQWUoKS5zZXRGcm9tUG9pbnRzKGUpfTtjb25zdCB6eT0oe2Nvb3JkaW5hdGVzOmksbGVuZ3Roczp0LG1ldGFMZW5ndGg6ZSxwcm9qZWN0aW9uOm4sdXNlR3JvdXBzOnMsc3BsaXRQb2x5Z29uczpyfSk9Pntjb25zdCBvPW4mJmVzKG4pLHtjb29yZGluYXRlc0FycjphLG1ldGFBcnJheTpjfT1ucyh7Y29vcmRpbmF0ZXM6aSxsZW5ndGhzOnQsbWV0YUxlbmd0aDplfSk7bGV0IGw9YS5tYXAodT0+VXIodSxvKSk7ciYmKGw9cmMobCxyLGMpLnNwbGl0UG9seWdvbnMpO2NvbnN0IGg9bC5tYXAoKHUsZik9Pl95KHtwb2ludHM6dS5tYXAoZD0+bmV3IFAoZC54LGQueSwwKSl9KSk7cmV0dXJuIGlzKGgscyl9O2Z1bmN0aW9uIFR5KGksdCxlPTIpe2NvbnN0IG49dCYmdC5sZW5ndGgscz1uP3RbMF0qZTppLmxlbmd0aDtsZXQgcj1odShpLDAscyxlLCEwKTtjb25zdCBvPVtdO2lmKCFyfHxyLm5leHQ9PT1yLnByZXYpcmV0dXJuIG87bGV0IGEsYyxsO2lmKG4mJihyPUZ5KGksdCxyLGUpKSxpLmxlbmd0aD44MCplKXthPWlbMF0sYz1pWzFdO2xldCBoPWEsdT1jO2ZvcihsZXQgZj1lO2Y8cztmKz1lKXtjb25zdCBkPWlbZl0scD1pW2YrMV07ZDxhJiYoYT1kKSxwPGMmJihjPXApLGQ+aCYmKGg9ZCkscD51JiYodT1wKX1sPU1hdGgubWF4KGgtYSx1LWMpLGw9bCE9PTA/MzI3NjcvbDowfXJldHVybiBzcyhyLG8sZSxhLGMsbCwwKSxvfWZ1bmN0aW9uIGh1KGksdCxlLG4scyl7bGV0IHI7aWYocz09PXF5KGksdCxlLG4pPjApZm9yKGxldCBvPXQ7bzxlO28rPW4pcj1wdShvL258MCxpW29dLGlbbysxXSxyKTtlbHNlIGZvcihsZXQgbz1lLW47bz49dDtvLT1uKXI9cHUoby9ufDAsaVtvXSxpW28rMV0scik7cmV0dXJuIHImJm1pKHIsci5uZXh0KSYmKGFzKHIpLHI9ci5uZXh0KSxyfWZ1bmN0aW9uIEluKGksdCl7aWYoIWkpcmV0dXJuIGk7dHx8KHQ9aSk7bGV0IGU9aSxuO2RvIGlmKG49ITEsIWUuc3RlaW5lciYmKG1pKGUsZS5uZXh0KXx8YXQoZS5wcmV2LGUsZS5uZXh0KT09PTApKXtpZihhcyhlKSxlPXQ9ZS5wcmV2LGU9PT1lLm5leHQpYnJlYWs7bj0hMH1lbHNlIGU9ZS5uZXh0O3doaWxlKG58fGUhPT10KTtyZXR1cm4gdH1mdW5jdGlvbiBzcyhpLHQsZSxuLHMscixvKXtpZighaSlyZXR1cm47IW8mJnImJkx5KGksbixzLHIpO2xldCBhPWk7Zm9yKDtpLnByZXYhPT1pLm5leHQ7KXtjb25zdCBjPWkucHJldixsPWkubmV4dDtpZihyP0N5KGksbixzLHIpOlB5KGkpKXt0LnB1c2goYy5pLGkuaSxsLmkpLGFzKGkpLGk9bC5uZXh0LGE9bC5uZXh0O2NvbnRpbnVlfWlmKGk9bCxpPT09YSl7bz9vPT09MT8oaT1CeShJbihpKSx0KSxzcyhpLHQsZSxuLHMsciwyKSk6bz09PTImJkV5KGksdCxlLG4scyxyKTpzcyhJbihpKSx0LGUsbixzLHIsMSk7YnJlYWt9fX1mdW5jdGlvbiBQeShpKXtjb25zdCB0PWkucHJldixlPWksbj1pLm5leHQ7aWYoYXQodCxlLG4pPj0wKXJldHVybiExO2NvbnN0IHM9dC54LHI9ZS54LG89bi54LGE9dC55LGM9ZS55LGw9bi55LGg9TWF0aC5taW4ocyxyLG8pLHU9TWF0aC5taW4oYSxjLGwpLGY9TWF0aC5tYXgocyxyLG8pLGQ9TWF0aC5tYXgoYSxjLGwpO2xldCBwPW4ubmV4dDtmb3IoO3AhPT10Oyl7aWYocC54Pj1oJiZwLng8PWYmJnAueT49dSYmcC55PD1kJiZycyhzLGEscixjLG8sbCxwLngscC55KSYmYXQocC5wcmV2LHAscC5uZXh0KT49MClyZXR1cm4hMTtwPXAubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiBDeShpLHQsZSxuKXtjb25zdCBzPWkucHJldixyPWksbz1pLm5leHQ7aWYoYXQocyxyLG8pPj0wKXJldHVybiExO2NvbnN0IGE9cy54LGM9ci54LGw9by54LGg9cy55LHU9ci55LGY9by55LGQ9TWF0aC5taW4oYSxjLGwpLHA9TWF0aC5taW4oaCx1LGYpLHk9TWF0aC5tYXgoYSxjLGwpLGc9TWF0aC5tYXgoaCx1LGYpLHc9b2MoZCxwLHQsZSxuKSxiPW9jKHksZyx0LGUsbik7bGV0IHg9aS5wcmV2WixtPWkubmV4dFo7Zm9yKDt4JiZ4Lno+PXcmJm0mJm0uejw9Yjspe2lmKHgueD49ZCYmeC54PD15JiZ4Lnk+PXAmJngueTw9ZyYmeCE9PXMmJnghPT1vJiZycyhhLGgsYyx1LGwsZix4LngseC55KSYmYXQoeC5wcmV2LHgseC5uZXh0KT49MHx8KHg9eC5wcmV2WixtLng+PWQmJm0ueDw9eSYmbS55Pj1wJiZtLnk8PWcmJm0hPT1zJiZtIT09byYmcnMoYSxoLGMsdSxsLGYsbS54LG0ueSkmJmF0KG0ucHJldixtLG0ubmV4dCk+PTApKXJldHVybiExO209bS5uZXh0Wn1mb3IoO3gmJnguej49dzspe2lmKHgueD49ZCYmeC54PD15JiZ4Lnk+PXAmJngueTw9ZyYmeCE9PXMmJnghPT1vJiZycyhhLGgsYyx1LGwsZix4LngseC55KSYmYXQoeC5wcmV2LHgseC5uZXh0KT49MClyZXR1cm4hMTt4PXgucHJldlp9Zm9yKDttJiZtLno8PWI7KXtpZihtLng+PWQmJm0ueDw9eSYmbS55Pj1wJiZtLnk8PWcmJm0hPT1zJiZtIT09byYmcnMoYSxoLGMsdSxsLGYsbS54LG0ueSkmJmF0KG0ucHJldixtLG0ubmV4dCk+PTApcmV0dXJuITE7bT1tLm5leHRafXJldHVybiEwfWZ1bmN0aW9uIEJ5KGksdCl7bGV0IGU9aTtkb3tjb25zdCBuPWUucHJldixzPWUubmV4dC5uZXh0OyFtaShuLHMpJiZmdShuLGUsZS5uZXh0LHMpJiZvcyhuLHMpJiZvcyhzLG4pJiYodC5wdXNoKG4uaSxlLmkscy5pKSxhcyhlKSxhcyhlLm5leHQpLGU9aT1zKSxlPWUubmV4dH13aGlsZShlIT09aSk7cmV0dXJuIEluKGUpfWZ1bmN0aW9uIEV5KGksdCxlLG4scyxyKXtsZXQgbz1pO2Rve2xldCBhPW8ubmV4dC5uZXh0O2Zvcig7YSE9PW8ucHJldjspe2lmKG8uaSE9PWEuaSYmJHkobyxhKSl7bGV0IGM9ZHUobyxhKTtvPUluKG8sby5uZXh0KSxjPUluKGMsYy5uZXh0KSxzcyhvLHQsZSxuLHMsciwwKSxzcyhjLHQsZSxuLHMsciwwKTtyZXR1cm59YT1hLm5leHR9bz1vLm5leHR9d2hpbGUobyE9PWkpfWZ1bmN0aW9uIEZ5KGksdCxlLG4pe2NvbnN0IHM9W107Zm9yKGxldCByPTAsbz10Lmxlbmd0aDtyPG87cisrKXtjb25zdCBhPXRbcl0qbixjPXI8by0xP3RbcisxXSpuOmkubGVuZ3RoLGw9aHUoaSxhLGMsbiwhMSk7bD09PWwubmV4dCYmKGwuc3RlaW5lcj0hMCkscy5wdXNoKER5KGwpKX1zLnNvcnQoSXkpO2ZvcihsZXQgcj0wO3I8cy5sZW5ndGg7cisrKWU9Tnkoc1tyXSxlKTtyZXR1cm4gZX1mdW5jdGlvbiBJeShpLHQpe2xldCBlPWkueC10Lng7aWYoZT09PTAmJihlPWkueS10LnksZT09PTApKXtjb25zdCBuPShpLm5leHQueS1pLnkpLyhpLm5leHQueC1pLngpLHM9KHQubmV4dC55LXQueSkvKHQubmV4dC54LXQueCk7ZT1uLXN9cmV0dXJuIGV9ZnVuY3Rpb24gTnkoaSx0KXtjb25zdCBlPWt5KGksdCk7aWYoIWUpcmV0dXJuIHQ7Y29uc3Qgbj1kdShlLGkpO3JldHVybiBJbihuLG4ubmV4dCksSW4oZSxlLm5leHQpfWZ1bmN0aW9uIGt5KGksdCl7bGV0IGU9dDtjb25zdCBuPWkueCxzPWkueTtsZXQgcj0tMS8wLG87aWYobWkoaSxlKSlyZXR1cm4gZTtkb3tpZihtaShpLGUubmV4dCkpcmV0dXJuIGUubmV4dDtpZihzPD1lLnkmJnM+PWUubmV4dC55JiZlLm5leHQueSE9PWUueSl7Y29uc3QgdT1lLngrKHMtZS55KSooZS5uZXh0LngtZS54KS8oZS5uZXh0LnktZS55KTtpZih1PD1uJiZ1PnImJihyPXUsbz1lLng8ZS5uZXh0Lng/ZTplLm5leHQsdT09PW4pKXJldHVybiBvfWU9ZS5uZXh0fXdoaWxlKGUhPT10KTtpZighbylyZXR1cm4gbnVsbDtjb25zdCBhPW8sYz1vLngsbD1vLnk7bGV0IGg9MS8wO2U9bztkb3tpZihuPj1lLngmJmUueD49YyYmbiE9PWUueCYmdXUoczxsP246cixzLGMsbCxzPGw/cjpuLHMsZS54LGUueSkpe2NvbnN0IHU9TWF0aC5hYnMocy1lLnkpLyhuLWUueCk7b3MoZSxpKSYmKHU8aHx8dT09PWgmJihlLng+by54fHxlLng9PT1vLngmJlJ5KG8sZSkpKSYmKG89ZSxoPXUpfWU9ZS5uZXh0fXdoaWxlKGUhPT1hKTtyZXR1cm4gb31mdW5jdGlvbiBSeShpLHQpe3JldHVybiBhdChpLnByZXYsaSx0LnByZXYpPDAmJmF0KHQubmV4dCxpLGkubmV4dCk8MH1mdW5jdGlvbiBMeShpLHQsZSxuKXtsZXQgcz1pO2RvIHMuej09PTAmJihzLno9b2Mocy54LHMueSx0LGUsbikpLHMucHJldlo9cy5wcmV2LHMubmV4dFo9cy5uZXh0LHM9cy5uZXh0O3doaWxlKHMhPT1pKTtzLnByZXZaLm5leHRaPW51bGwscy5wcmV2Wj1udWxsLE95KHMpfWZ1bmN0aW9uIE95KGkpe2xldCB0LGU9MTtkb3tsZXQgbj1pLHM7aT1udWxsO2xldCByPW51bGw7Zm9yKHQ9MDtuOyl7dCsrO2xldCBvPW4sYT0wO2ZvcihsZXQgbD0wO2w8ZSYmKGErKyxvPW8ubmV4dFosISFvKTtsKyspO2xldCBjPWU7Zm9yKDthPjB8fGM+MCYmbzspYSE9PTAmJihjPT09MHx8IW98fG4uejw9by56KT8ocz1uLG49bi5uZXh0WixhLS0pOihzPW8sbz1vLm5leHRaLGMtLSkscj9yLm5leHRaPXM6aT1zLHMucHJldlo9cixyPXM7bj1vfXIubmV4dFo9bnVsbCxlKj0yfXdoaWxlKHQ+MSk7cmV0dXJuIGl9ZnVuY3Rpb24gb2MoaSx0LGUsbixzKXtyZXR1cm4gaT0oaS1lKSpzfDAsdD0odC1uKSpzfDAsaT0oaXxpPDw4KSYxNjcxMTkzNSxpPShpfGk8PDQpJjI1MjY0NTEzNSxpPShpfGk8PDIpJjg1ODk5MzQ1OSxpPShpfGk8PDEpJjE0MzE2NTU3NjUsdD0odHx0PDw4KSYxNjcxMTkzNSx0PSh0fHQ8PDQpJjI1MjY0NTEzNSx0PSh0fHQ8PDIpJjg1ODk5MzQ1OSx0PSh0fHQ8PDEpJjE0MzE2NTU3NjUsaXx0PDwxfWZ1bmN0aW9uIER5KGkpe2xldCB0PWksZT1pO2RvKHQueDxlLnh8fHQueD09PWUueCYmdC55PGUueSkmJihlPXQpLHQ9dC5uZXh0O3doaWxlKHQhPT1pKTtyZXR1cm4gZX1mdW5jdGlvbiB1dShpLHQsZSxuLHMscixvLGEpe3JldHVybihzLW8pKih0LWEpPj0oaS1vKSooci1hKSYmKGktbykqKG4tYSk+PShlLW8pKih0LWEpJiYoZS1vKSooci1hKT49KHMtbykqKG4tYSl9ZnVuY3Rpb24gcnMoaSx0LGUsbixzLHIsbyxhKXtyZXR1cm4hKGk9PT1vJiZ0PT09YSkmJnV1KGksdCxlLG4scyxyLG8sYSl9ZnVuY3Rpb24gJHkoaSx0KXtyZXR1cm4gaS5uZXh0LmkhPT10LmkmJmkucHJldi5pIT09dC5pJiYhVnkoaSx0KSYmKG9zKGksdCkmJm9zKHQsaSkmJlV5KGksdCkmJihhdChpLnByZXYsaSx0LnByZXYpfHxhdChpLHQucHJldix0KSl8fG1pKGksdCkmJmF0KGkucHJldixpLGkubmV4dCk+MCYmYXQodC5wcmV2LHQsdC5uZXh0KT4wKX1mdW5jdGlvbiBhdChpLHQsZSl7cmV0dXJuKHQueS1pLnkpKihlLngtdC54KS0odC54LWkueCkqKGUueS10LnkpfWZ1bmN0aW9uIG1pKGksdCl7cmV0dXJuIGkueD09PXQueCYmaS55PT09dC55fWZ1bmN0aW9uIGZ1KGksdCxlLG4pe2NvbnN0IHM9WHIoYXQoaSx0LGUpKSxyPVhyKGF0KGksdCxuKSksbz1YcihhdChlLG4saSkpLGE9WHIoYXQoZSxuLHQpKTtyZXR1cm4hIShzIT09ciYmbyE9PWF8fHM9PT0wJiZxcihpLGUsdCl8fHI9PT0wJiZxcihpLG4sdCl8fG89PT0wJiZxcihlLGksbil8fGE9PT0wJiZxcihlLHQsbikpfWZ1bmN0aW9uIHFyKGksdCxlKXtyZXR1cm4gdC54PD1NYXRoLm1heChpLngsZS54KSYmdC54Pj1NYXRoLm1pbihpLngsZS54KSYmdC55PD1NYXRoLm1heChpLnksZS55KSYmdC55Pj1NYXRoLm1pbihpLnksZS55KX1mdW5jdGlvbiBYcihpKXtyZXR1cm4gaT4wPzE6aTwwPy0xOjB9ZnVuY3Rpb24gVnkoaSx0KXtsZXQgZT1pO2Rve2lmKGUuaSE9PWkuaSYmZS5uZXh0LmkhPT1pLmkmJmUuaSE9PXQuaSYmZS5uZXh0LmkhPT10LmkmJmZ1KGUsZS5uZXh0LGksdCkpcmV0dXJuITA7ZT1lLm5leHR9d2hpbGUoZSE9PWkpO3JldHVybiExfWZ1bmN0aW9uIG9zKGksdCl7cmV0dXJuIGF0KGkucHJldixpLGkubmV4dCk8MD9hdChpLHQsaS5uZXh0KT49MCYmYXQoaSxpLnByZXYsdCk+PTA6YXQoaSx0LGkucHJldik8MHx8YXQoaSxpLm5leHQsdCk8MH1mdW5jdGlvbiBVeShpLHQpe2xldCBlPWksbj0hMTtjb25zdCBzPShpLngrdC54KS8yLHI9KGkueSt0LnkpLzI7ZG8gZS55PnIhPWUubmV4dC55PnImJmUubmV4dC55IT09ZS55JiZzPChlLm5leHQueC1lLngpKihyLWUueSkvKGUubmV4dC55LWUueSkrZS54JiYobj0hbiksZT1lLm5leHQ7d2hpbGUoZSE9PWkpO3JldHVybiBufWZ1bmN0aW9uIGR1KGksdCl7Y29uc3QgZT1hYyhpLmksaS54LGkueSksbj1hYyh0LmksdC54LHQueSkscz1pLm5leHQscj10LnByZXY7cmV0dXJuIGkubmV4dD10LHQucHJldj1pLGUubmV4dD1zLHMucHJldj1lLG4ubmV4dD1lLGUucHJldj1uLHIubmV4dD1uLG4ucHJldj1yLG59ZnVuY3Rpb24gcHUoaSx0LGUsbil7Y29uc3Qgcz1hYyhpLHQsZSk7cmV0dXJuIG4/KHMubmV4dD1uLm5leHQscy5wcmV2PW4sbi5uZXh0LnByZXY9cyxuLm5leHQ9cyk6KHMucHJldj1zLHMubmV4dD1zKSxzfWZ1bmN0aW9uIGFzKGkpe2kubmV4dC5wcmV2PWkucHJldixpLnByZXYubmV4dD1pLm5leHQsaS5wcmV2WiYmKGkucHJldloubmV4dFo9aS5uZXh0WiksaS5uZXh0WiYmKGkubmV4dFoucHJldlo9aS5wcmV2Wil9ZnVuY3Rpb24gYWMoaSx0LGUpe3JldHVybntpLHg6dCx5OmUscHJldjpudWxsLG5leHQ6bnVsbCx6OjAscHJldlo6bnVsbCxuZXh0WjpudWxsLHN0ZWluZXI6ITF9fWZ1bmN0aW9uIHF5KGksdCxlLG4pe2xldCBzPTA7Zm9yKGxldCByPXQsbz1lLW47cjxlO3IrPW4pcys9KGlbb10taVtyXSkqKGlbcisxXStpW28rMV0pLG89cjtyZXR1cm4gc31mdW5jdGlvbiB5dShpKXtjb25zdCB0PVtdLGU9W10sbj1pWzBdWzBdLmxlbmd0aDtsZXQgcz0wLHI9MDtmb3IoY29uc3QgbyBvZiBpKXtmb3IoY29uc3QgYSBvZiBvKWZvcihsZXQgYz0wO2M8bjtjKyspdC5wdXNoKGFbY10pO3ImJihzKz1yLGUucHVzaChzKSkscj1vLmxlbmd0aH1yZXR1cm57dmVydGljZXM6dCxob2xlczplLGRpbWVuc2lvbnM6bn19ZnVuY3Rpb24gWHkoaSl7aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJjb29yZCBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KGkpKXtpZihpLnR5cGU9PT0iRmVhdHVyZSImJmkuZ2VvbWV0cnkhPT1udWxsJiZpLmdlb21ldHJ5LnR5cGU9PT0iUG9pbnQiKXJldHVyblsuLi5pLmdlb21ldHJ5LmNvb3JkaW5hdGVzXTtpZihpLnR5cGU9PT0iUG9pbnQiKXJldHVyblsuLi5pLmNvb3JkaW5hdGVzXX1pZihBcnJheS5pc0FycmF5KGkpJiZpLmxlbmd0aD49MiYmIUFycmF5LmlzQXJyYXkoaVswXSkmJiFBcnJheS5pc0FycmF5KGlbMV0pKXJldHVyblsuLi5pXTt0aHJvdyBuZXcgRXJyb3IoImNvb3JkIG11c3QgYmUgR2VvSlNPTiBQb2ludCBvciBhbiBBcnJheSBvZiBudW1iZXJzIil9ZnVuY3Rpb24gWnkoaSl7aWYoQXJyYXkuaXNBcnJheShpKSlyZXR1cm4gaTtpZihpLnR5cGU9PT0iRmVhdHVyZSIpe2lmKGkuZ2VvbWV0cnkhPT1udWxsKXJldHVybiBpLmdlb21ldHJ5LmNvb3JkaW5hdGVzfWVsc2UgaWYoaS5jb29yZGluYXRlcylyZXR1cm4gaS5jb29yZGluYXRlczt0aHJvdyBuZXcgRXJyb3IoImNvb3JkcyBtdXN0IGJlIEdlb0pTT04gRmVhdHVyZSwgR2VvbWV0cnkgT2JqZWN0IG9yIGFuIEFycmF5Iil9ZnVuY3Rpb24gV3koaSl7cmV0dXJuIGkudHlwZT09PSJGZWF0dXJlIj9pLmdlb21ldHJ5Oml9ZnVuY3Rpb24gR3koaSl7Y29uc3QgdD1aeShpKTtsZXQgZT0wLG49MSxzLHI7Zm9yKDtuPHQubGVuZ3RoOylzPXJ8fHRbMF0scj10W25dLGUrPShyWzBdLXNbMF0pKihyWzFdK3NbMV0pLG4rKztyZXR1cm4gZT4wfXZhciBIeT1HeTtjb25zdCBKZT0xMTEwMjIzMDI0NjI1MTU2NWUtMzIsRXQ9MTM0MjE3NzI5LEp5PSgzKzgqSmUpKkplO2Z1bmN0aW9uIGNjKGksdCxlLG4scyl7bGV0IHIsbyxhLGMsbD10WzBdLGg9blswXSx1PTAsZj0wO2g+bD09aD4tbD8ocj1sLGw9dFsrK3VdKToocj1oLGg9blsrK2ZdKTtsZXQgZD0wO2lmKHU8aSYmZjxlKWZvcihoPmw9PWg+LWw/KG89bCtyLGE9ci0oby1sKSxsPXRbKyt1XSk6KG89aCtyLGE9ci0oby1oKSxoPW5bKytmXSkscj1vLGEhPT0wJiYoc1tkKytdPWEpO3U8aSYmZjxlOyloPmw9PWg+LWw/KG89citsLGM9by1yLGE9ci0oby1jKSsobC1jKSxsPXRbKyt1XSk6KG89citoLGM9by1yLGE9ci0oby1jKSsoaC1jKSxoPW5bKytmXSkscj1vLGEhPT0wJiYoc1tkKytdPWEpO2Zvcig7dTxpOylvPXIrbCxjPW8tcixhPXItKG8tYykrKGwtYyksbD10WysrdV0scj1vLGEhPT0wJiYoc1tkKytdPWEpO2Zvcig7ZjxlOylvPXIraCxjPW8tcixhPXItKG8tYykrKGgtYyksaD1uWysrZl0scj1vLGEhPT0wJiYoc1tkKytdPWEpO3JldHVybihyIT09MHx8ZD09PTApJiYoc1tkKytdPXIpLGR9ZnVuY3Rpb24gWXkoaSx0KXtsZXQgZT10WzBdO2ZvcihsZXQgbj0xO248aTtuKyspZSs9dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBjcyhpKXtyZXR1cm4gbmV3IEZsb2F0NjRBcnJheShpKX1jb25zdCBqeT0oMysxNipKZSkqSmUsUXk9KDIrMTIqSmUpKkplLEt5PSg5KzY0KkplKSpKZSpKZSxnaT1jcyg0KSxtdT1jcyg4KSxndT1jcygxMikseHU9Y3MoMTYpLCR0PWNzKDQpO2Z1bmN0aW9uIHRtKGksdCxlLG4scyxyLG8pe2xldCBhLGMsbCxoLHUsZixkLHAseSxnLHcsYix4LG0sTSxTLEEsdjtjb25zdCBfPWktcyxUPWUtcyx6PXQtcixDPW4tcjttPV8qQyxmPUV0Kl8sZD1mLShmLV8pLHA9Xy1kLGY9RXQqQyx5PWYtKGYtQyksZz1DLXksTT1wKmctKG0tZCp5LXAqeS1kKmcpLFM9eipULGY9RXQqeixkPWYtKGYteikscD16LWQsZj1FdCpULHk9Zi0oZi1UKSxnPVQteSxBPXAqZy0oUy1kKnktcCp5LWQqZyksdz1NLUEsdT1NLXcsZ2lbMF09TS0odyt1KSsodS1BKSxiPW0rdyx1PWItbSx4PW0tKGItdSkrKHctdSksdz14LVMsdT14LXcsZ2lbMV09eC0odyt1KSsodS1TKSx2PWIrdyx1PXYtYixnaVsyXT1iLSh2LXUpKyh3LXUpLGdpWzNdPXY7bGV0IEI9WXkoNCxnaSksRj1ReSpvO2lmKEI+PUZ8fC1CPj1GfHwodT1pLV8sYT1pLShfK3UpKyh1LXMpLHU9ZS1ULGw9ZS0oVCt1KSsodS1zKSx1PXQteixjPXQtKHordSkrKHUtciksdT1uLUMsaD1uLShDK3UpKyh1LXIpLGE9PT0wJiZjPT09MCYmbD09PTAmJmg9PT0wKXx8KEY9S3kqbytKeSpNYXRoLmFicyhCKSxCKz1fKmgrQyphLSh6KmwrVCpjKSxCPj1GfHwtQj49RikpcmV0dXJuIEI7bT1hKkMsZj1FdCphLGQ9Zi0oZi1hKSxwPWEtZCxmPUV0KkMseT1mLShmLUMpLGc9Qy15LE09cCpnLShtLWQqeS1wKnktZCpnKSxTPWMqVCxmPUV0KmMsZD1mLShmLWMpLHA9Yy1kLGY9RXQqVCx5PWYtKGYtVCksZz1ULXksQT1wKmctKFMtZCp5LXAqeS1kKmcpLHc9TS1BLHU9TS13LCR0WzBdPU0tKHcrdSkrKHUtQSksYj1tK3csdT1iLW0seD1tLShiLXUpKyh3LXUpLHc9eC1TLHU9eC13LCR0WzFdPXgtKHcrdSkrKHUtUyksdj1iK3csdT12LWIsJHRbMl09Yi0odi11KSsody11KSwkdFszXT12O2NvbnN0IEU9Y2MoNCxnaSw0LCR0LG11KTttPV8qaCxmPUV0Kl8sZD1mLShmLV8pLHA9Xy1kLGY9RXQqaCx5PWYtKGYtaCksZz1oLXksTT1wKmctKG0tZCp5LXAqeS1kKmcpLFM9eipsLGY9RXQqeixkPWYtKGYteikscD16LWQsZj1FdCpsLHk9Zi0oZi1sKSxnPWwteSxBPXAqZy0oUy1kKnktcCp5LWQqZyksdz1NLUEsdT1NLXcsJHRbMF09TS0odyt1KSsodS1BKSxiPW0rdyx1PWItbSx4PW0tKGItdSkrKHctdSksdz14LVMsdT14LXcsJHRbMV09eC0odyt1KSsodS1TKSx2PWIrdyx1PXYtYiwkdFsyXT1iLSh2LXUpKyh3LXUpLCR0WzNdPXY7Y29uc3QgST1jYyhFLG11LDQsJHQsZ3UpO209YSpoLGY9RXQqYSxkPWYtKGYtYSkscD1hLWQsZj1FdCpoLHk9Zi0oZi1oKSxnPWgteSxNPXAqZy0obS1kKnktcCp5LWQqZyksUz1jKmwsZj1FdCpjLGQ9Zi0oZi1jKSxwPWMtZCxmPUV0KmwseT1mLShmLWwpLGc9bC15LEE9cCpnLShTLWQqeS1wKnktZCpnKSx3PU0tQSx1PU0tdywkdFswXT1NLSh3K3UpKyh1LUEpLGI9bSt3LHU9Yi1tLHg9bS0oYi11KSsody11KSx3PXgtUyx1PXgtdywkdFsxXT14LSh3K3UpKyh1LVMpLHY9Yit3LHU9di1iLCR0WzJdPWItKHYtdSkrKHctdSksJHRbM109djtjb25zdCBSPWNjKEksZ3UsNCwkdCx4dSk7cmV0dXJuIHh1W1ItMV19ZnVuY3Rpb24gWnIoaSx0LGUsbixzLHIpe2NvbnN0IG89KHQtcikqKGUtcyksYT0oaS1zKSoobi1yKSxjPW8tYSxsPU1hdGguYWJzKG8rYSk7cmV0dXJuIE1hdGguYWJzKGMpPj1qeSpsP2M6LXRtKGksdCxlLG4scyxyLGwpfWNvbnN0IHd1PU1hdGgucG93KDIsLTUyKSxXcj1uZXcgVWludDMyQXJyYXkoNTEyKTtjbGFzcyBsc3tzdGF0aWMgZnJvbSh0LGU9cm0sbj1vbSl7Y29uc3Qgcz10Lmxlbmd0aCxyPW5ldyBGbG9hdDY0QXJyYXkocyoyKTtmb3IobGV0IG89MDtvPHM7bysrKXtjb25zdCBhPXRbb107clsyKm9dPWUoYSksclsyKm8rMV09bihhKX1yZXR1cm4gbmV3IGxzKHIpfWNvbnN0cnVjdG9yKHQpe2NvbnN0IGU9dC5sZW5ndGg+PjE7aWYoZT4wJiZ0eXBlb2YgdFswXSE9Im51bWJlciIpdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBjb29yZHMgdG8gY29udGFpbiBudW1iZXJzLiIpO3RoaXMuY29vcmRzPXQ7Y29uc3Qgbj1NYXRoLm1heCgyKmUtNSwwKTt0aGlzLl90cmlhbmdsZXM9bmV3IFVpbnQzMkFycmF5KG4qMyksdGhpcy5faGFsZmVkZ2VzPW5ldyBJbnQzMkFycmF5KG4qMyksdGhpcy5faGFzaFNpemU9TWF0aC5jZWlsKE1hdGguc3FydChlKSksdGhpcy5faHVsbFByZXY9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2h1bGxOZXh0PW5ldyBVaW50MzJBcnJheShlKSx0aGlzLl9odWxsVHJpPW5ldyBVaW50MzJBcnJheShlKSx0aGlzLl9odWxsSGFzaD1uZXcgSW50MzJBcnJheSh0aGlzLl9oYXNoU2l6ZSksdGhpcy5faWRzPW5ldyBVaW50MzJBcnJheShlKSx0aGlzLl9kaXN0cz1uZXcgRmxvYXQ2NEFycmF5KGUpLHRoaXMudXBkYXRlKCl9dXBkYXRlKCl7Y29uc3R7Y29vcmRzOnQsX2h1bGxQcmV2OmUsX2h1bGxOZXh0Om4sX2h1bGxUcmk6cyxfaHVsbEhhc2g6cn09dGhpcyxvPXQubGVuZ3RoPj4xO2xldCBhPTEvMCxjPTEvMCxsPS0xLzAsaD0tMS8wO2ZvcihsZXQgXz0wO188bztfKyspe2NvbnN0IFQ9dFsyKl9dLHo9dFsyKl8rMV07VDxhJiYoYT1UKSx6PGMmJihjPXopLFQ+bCYmKGw9VCksej5oJiYoaD16KSx0aGlzLl9pZHNbX109X31jb25zdCB1PShhK2wpLzIsZj0oYytoKS8yO2xldCBkLHAseTtmb3IobGV0IF89MCxUPTEvMDtfPG87XysrKXtjb25zdCB6PWxjKHUsZix0WzIqX10sdFsyKl8rMV0pO3o8VCYmKGQ9XyxUPXopfWNvbnN0IGc9dFsyKmRdLHc9dFsyKmQrMV07Zm9yKGxldCBfPTAsVD0xLzA7XzxvO18rKyl7aWYoXz09PWQpY29udGludWU7Y29uc3Qgej1sYyhnLHcsdFsyKl9dLHRbMipfKzFdKTt6PFQmJno+MCYmKHA9XyxUPXopfWxldCBiPXRbMipwXSx4PXRbMipwKzFdLG09MS8wO2ZvcihsZXQgXz0wO188bztfKyspe2lmKF89PT1kfHxfPT09cCljb250aW51ZTtjb25zdCBUPWltKGcsdyxiLHgsdFsyKl9dLHRbMipfKzFdKTtUPG0mJih5PV8sbT1UKX1sZXQgTT10WzIqeV0sUz10WzIqeSsxXTtpZihtPT09MS8wKXtmb3IobGV0IHo9MDt6PG87eisrKXRoaXMuX2Rpc3RzW3pdPXRbMip6XS10WzBdfHx0WzIqeisxXS10WzFdO3hpKHRoaXMuX2lkcyx0aGlzLl9kaXN0cywwLG8tMSk7Y29uc3QgXz1uZXcgVWludDMyQXJyYXkobyk7bGV0IFQ9MDtmb3IobGV0IHo9MCxDPS0xLzA7ejxvO3orKyl7Y29uc3QgQj10aGlzLl9pZHNbel0sRj10aGlzLl9kaXN0c1tCXTtGPkMmJihfW1QrK109QixDPUYpfXRoaXMuaHVsbD1fLnN1YmFycmF5KDAsVCksdGhpcy50cmlhbmdsZXM9bmV3IFVpbnQzMkFycmF5KDApLHRoaXMuaGFsZmVkZ2VzPW5ldyBVaW50MzJBcnJheSgwKTtyZXR1cm59aWYoWnIoZyx3LGIseCxNLFMpPDApe2NvbnN0IF89cCxUPWIsej14O3A9eSxiPU0seD1TLHk9XyxNPVQsUz16fWNvbnN0IEE9c20oZyx3LGIseCxNLFMpO3RoaXMuX2N4PUEueCx0aGlzLl9jeT1BLnk7Zm9yKGxldCBfPTA7XzxvO18rKyl0aGlzLl9kaXN0c1tfXT1sYyh0WzIqX10sdFsyKl8rMV0sQS54LEEueSk7eGkodGhpcy5faWRzLHRoaXMuX2Rpc3RzLDAsby0xKSx0aGlzLl9odWxsU3RhcnQ9ZDtsZXQgdj0zO25bZF09ZVt5XT1wLG5bcF09ZVtkXT15LG5beV09ZVtwXT1kLHNbZF09MCxzW3BdPTEsc1t5XT0yLHIuZmlsbCgtMSksclt0aGlzLl9oYXNoS2V5KGcsdyldPWQsclt0aGlzLl9oYXNoS2V5KGIseCldPXAsclt0aGlzLl9oYXNoS2V5KE0sUyldPXksdGhpcy50cmlhbmdsZXNMZW49MCx0aGlzLl9hZGRUcmlhbmdsZShkLHAseSwtMSwtMSwtMSk7Zm9yKGxldCBfPTAsVCx6O188dGhpcy5faWRzLmxlbmd0aDtfKyspe2NvbnN0IEM9dGhpcy5faWRzW19dLEI9dFsyKkNdLEY9dFsyKkMrMV07aWYoXz4wJiZNYXRoLmFicyhCLVQpPD13dSYmTWF0aC5hYnMoRi16KTw9d3V8fChUPUIsej1GLEM9PT1kfHxDPT09cHx8Qz09PXkpKWNvbnRpbnVlO2xldCBFPTA7Zm9yKGxldCBLPTAsY3Q9dGhpcy5faGFzaEtleShCLEYpO0s8dGhpcy5faGFzaFNpemUmJihFPXJbKGN0K0spJXRoaXMuX2hhc2hTaXplXSwhKEUhPT0tMSYmRSE9PW5bRV0pKTtLKyspO0U9ZVtFXTtsZXQgST1FLFI7Zm9yKDtSPW5bSV0sWnIoQixGLHRbMipJXSx0WzIqSSsxXSx0WzIqUl0sdFsyKlIrMV0pPj0wOylpZihJPVIsST09PUUpe0k9LTE7YnJlYWt9aWYoST09PS0xKWNvbnRpbnVlO2xldCBWPXRoaXMuX2FkZFRyaWFuZ2xlKEksQyxuW0ldLC0xLC0xLHNbSV0pO3NbQ109dGhpcy5fbGVnYWxpemUoVisyKSxzW0ldPVYsdisrO2xldCBVPW5bSV07Zm9yKDtSPW5bVV0sWnIoQixGLHRbMipVXSx0WzIqVSsxXSx0WzIqUl0sdFsyKlIrMV0pPDA7KVY9dGhpcy5fYWRkVHJpYW5nbGUoVSxDLFIsc1tDXSwtMSxzW1VdKSxzW0NdPXRoaXMuX2xlZ2FsaXplKFYrMiksbltVXT1VLHYtLSxVPVI7aWYoST09PUUpZm9yKDtSPWVbSV0sWnIoQixGLHRbMipSXSx0WzIqUisxXSx0WzIqSV0sdFsyKkkrMV0pPDA7KVY9dGhpcy5fYWRkVHJpYW5nbGUoUixDLEksLTEsc1tJXSxzW1JdKSx0aGlzLl9sZWdhbGl6ZShWKzIpLHNbUl09VixuW0ldPUksdi0tLEk9Ujt0aGlzLl9odWxsU3RhcnQ9ZVtDXT1JLG5bSV09ZVtVXT1DLG5bQ109VSxyW3RoaXMuX2hhc2hLZXkoQixGKV09QyxyW3RoaXMuX2hhc2hLZXkodFsyKkldLHRbMipJKzFdKV09SX10aGlzLmh1bGw9bmV3IFVpbnQzMkFycmF5KHYpO2ZvcihsZXQgXz0wLFQ9dGhpcy5faHVsbFN0YXJ0O188djtfKyspdGhpcy5odWxsW19dPVQsVD1uW1RdO3RoaXMudHJpYW5nbGVzPXRoaXMuX3RyaWFuZ2xlcy5zdWJhcnJheSgwLHRoaXMudHJpYW5nbGVzTGVuKSx0aGlzLmhhbGZlZGdlcz10aGlzLl9oYWxmZWRnZXMuc3ViYXJyYXkoMCx0aGlzLnRyaWFuZ2xlc0xlbil9X2hhc2hLZXkodCxlKXtyZXR1cm4gTWF0aC5mbG9vcihlbSh0LXRoaXMuX2N4LGUtdGhpcy5fY3kpKnRoaXMuX2hhc2hTaXplKSV0aGlzLl9oYXNoU2l6ZX1fbGVnYWxpemUodCl7Y29uc3R7X3RyaWFuZ2xlczplLF9oYWxmZWRnZXM6bixjb29yZHM6c309dGhpcztsZXQgcj0wLG89MDtmb3IoOzspe2NvbnN0IGE9blt0XSxjPXQtdCUzO2lmKG89YysodCsyKSUzLGE9PT0tMSl7aWYocj09PTApYnJlYWs7dD1XclstLXJdO2NvbnRpbnVlfWNvbnN0IGw9YS1hJTMsaD1jKyh0KzEpJTMsdT1sKyhhKzIpJTMsZj1lW29dLGQ9ZVt0XSxwPWVbaF0seT1lW3VdO2lmKG5tKHNbMipmXSxzWzIqZisxXSxzWzIqZF0sc1syKmQrMV0sc1syKnBdLHNbMipwKzFdLHNbMip5XSxzWzIqeSsxXSkpe2VbdF09eSxlW2FdPWY7Y29uc3Qgdz1uW3VdO2lmKHc9PT0tMSl7bGV0IHg9dGhpcy5faHVsbFN0YXJ0O2Rve2lmKHRoaXMuX2h1bGxUcmlbeF09PT11KXt0aGlzLl9odWxsVHJpW3hdPXQ7YnJlYWt9eD10aGlzLl9odWxsUHJldlt4XX13aGlsZSh4IT09dGhpcy5faHVsbFN0YXJ0KX10aGlzLl9saW5rKHQsdyksdGhpcy5fbGluayhhLG5bb10pLHRoaXMuX2xpbmsobyx1KTtjb25zdCBiPWwrKGErMSklMztyPFdyLmxlbmd0aCYmKFdyW3IrK109Yil9ZWxzZXtpZihyPT09MClicmVhazt0PVdyWy0tcl19fXJldHVybiBvfV9saW5rKHQsZSl7dGhpcy5faGFsZmVkZ2VzW3RdPWUsZSE9PS0xJiYodGhpcy5faGFsZmVkZ2VzW2VdPXQpfV9hZGRUcmlhbmdsZSh0LGUsbixzLHIsbyl7Y29uc3QgYT10aGlzLnRyaWFuZ2xlc0xlbjtyZXR1cm4gdGhpcy5fdHJpYW5nbGVzW2FdPXQsdGhpcy5fdHJpYW5nbGVzW2ErMV09ZSx0aGlzLl90cmlhbmdsZXNbYSsyXT1uLHRoaXMuX2xpbmsoYSxzKSx0aGlzLl9saW5rKGErMSxyKSx0aGlzLl9saW5rKGErMixvKSx0aGlzLnRyaWFuZ2xlc0xlbis9MyxhfX1mdW5jdGlvbiBlbShpLHQpe2NvbnN0IGU9aS8oTWF0aC5hYnMoaSkrTWF0aC5hYnModCkpO3JldHVybih0PjA/My1lOjErZSkvNH1mdW5jdGlvbiBsYyhpLHQsZSxuKXtjb25zdCBzPWktZSxyPXQtbjtyZXR1cm4gcypzK3Iqcn1mdW5jdGlvbiBubShpLHQsZSxuLHMscixvLGEpe2NvbnN0IGM9aS1vLGw9dC1hLGg9ZS1vLHU9bi1hLGY9cy1vLGQ9ci1hLHA9YypjK2wqbCx5PWgqaCt1KnUsZz1mKmYrZCpkO3JldHVybiBjKih1KmcteSpkKS1sKihoKmcteSpmKStwKihoKmQtdSpmKTwwfWZ1bmN0aW9uIGltKGksdCxlLG4scyxyKXtjb25zdCBvPWUtaSxhPW4tdCxjPXMtaSxsPXItdCxoPW8qbythKmEsdT1jKmMrbCpsLGY9LjUvKG8qbC1hKmMpLGQ9KGwqaC1hKnUpKmYscD0obyp1LWMqaCkqZjtyZXR1cm4gZCpkK3AqcH1mdW5jdGlvbiBzbShpLHQsZSxuLHMscil7Y29uc3Qgbz1lLWksYT1uLXQsYz1zLWksbD1yLXQsaD1vKm8rYSphLHU9YypjK2wqbCxmPS41LyhvKmwtYSpjKSxkPWkrKGwqaC1hKnUpKmYscD10KyhvKnUtYypoKSpmO3JldHVybnt4OmQseTpwfX1mdW5jdGlvbiB4aShpLHQsZSxuKXtpZihuLWU8PTIwKWZvcihsZXQgcz1lKzE7czw9bjtzKyspe2NvbnN0IHI9aVtzXSxvPXRbcl07bGV0IGE9cy0xO2Zvcig7YT49ZSYmdFtpW2FdXT5vOylpW2ErMV09aVthLS1dO2lbYSsxXT1yfWVsc2V7Y29uc3Qgcz1lK24+PjE7bGV0IHI9ZSsxLG89bjtocyhpLHMsciksdFtpW2VdXT50W2lbbl1dJiZocyhpLGUsbiksdFtpW3JdXT50W2lbbl1dJiZocyhpLHIsbiksdFtpW2VdXT50W2lbcl1dJiZocyhpLGUscik7Y29uc3QgYT1pW3JdLGM9dFthXTtmb3IoOzspe2RvIHIrKzt3aGlsZSh0W2lbcl1dPGMpO2RvIG8tLTt3aGlsZSh0W2lbb11dPmMpO2lmKG88cilicmVhaztocyhpLHIsbyl9aVtlKzFdPWlbb10saVtvXT1hLG4tcisxPj1vLWU/KHhpKGksdCxyLG4pLHhpKGksdCxlLG8tMSkpOih4aShpLHQsZSxvLTEpLHhpKGksdCxyLG4pKX19ZnVuY3Rpb24gaHMoaSx0LGUpe2NvbnN0IG49aVt0XTtpW3RdPWlbZV0saVtlXT1ufWZ1bmN0aW9uIHJtKGkpe3JldHVybiBpWzBdfWZ1bmN0aW9uIG9tKGkpe3JldHVybiBpWzFdfWZ1bmN0aW9uIGFtKGksdCl7dmFyIGU9MCxuPTAscz0wLHI9MCxvPTAsYT0wLGM9MCxsPTAsaD1udWxsLHU9bnVsbCxmPWlbMF0sZD1pWzFdLHA9dC5sZW5ndGg7Zm9yKGU7ZTxwO2UrKyl7bj0wO3ZhciB5PXRbZV0ubGVuZ3RoLTEsZz10W2VdO2lmKGg9Z1swXSxoWzBdIT09Z1t5XVswXSYmaFsxXSE9PWdbeV1bMV0pdGhyb3cgbmV3IEVycm9yKCJGaXJzdCBhbmQgbGFzdCBjb29yZGluYXRlcyBpbiBhIHJpbmcgbXVzdCBiZSB0aGUgc2FtZSIpO2ZvcihvPWhbMF0tZixhPWhbMV0tZCxuO248eTtuKyspe2lmKHU9Z1tuKzFdLGw9dVsxXS1kLGE8MCYmbDwwfHxhPjAmJmw+MCl7aD11LGE9bCxvPWhbMF0tZjtjb250aW51ZX1pZihjPXVbMF0taVswXSxsPjAmJmE8PTApe2lmKHI9bypsLWMqYSxyPjApcz1zKzE7ZWxzZSBpZihyPT09MClyZXR1cm4gMH1lbHNlIGlmKGE+MCYmbDw9MCl7aWYocj1vKmwtYyphLHI8MClzPXMrMTtlbHNlIGlmKHI9PT0wKXJldHVybiAwfWVsc2UgaWYobD09PTAmJmE8MCl7aWYocj1vKmwtYyphLHI9PT0wKXJldHVybiAwfWVsc2UgaWYoYT09PTAmJmw8MCl7aWYocj1vKmwtYyphLHI9PT0wKXJldHVybiAwfWVsc2UgaWYoYT09PTAmJmw9PT0wKXtpZihjPD0wJiZvPj0wKXJldHVybiAwO2lmKG88PTAmJmM+PTApcmV0dXJuIDB9aD11LGE9bCxvPWN9fXJldHVybiBzJTIhPT0wfWZ1bmN0aW9uIGNtKGksdCxlPXt9KXtpZighaSl0aHJvdyBuZXcgRXJyb3IoInBvaW50IGlzIHJlcXVpcmVkIik7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJwb2x5Z29uIGlzIHJlcXVpcmVkIik7Y29uc3Qgbj1YeShpKSxzPVd5KHQpLHI9cy50eXBlLG89dC5iYm94O2xldCBhPXMuY29vcmRpbmF0ZXM7aWYobyYmbG0obixvKT09PSExKXJldHVybiExO3I9PT0iUG9seWdvbiImJihhPVthXSk7bGV0IGM9ITE7Zm9yKHZhciBsPTA7bDxhLmxlbmd0aDsrK2wpe2NvbnN0IGg9YW0obixhW2xdKTtpZihoPT09MClyZXR1cm4hZS5pZ25vcmVCb3VuZGFyeTtoJiYoYz0hMCl9cmV0dXJuIGN9ZnVuY3Rpb24gbG0oaSx0KXtyZXR1cm4gdFswXTw9aVswXSYmdFsxXTw9aVsxXSYmdFsyXT49aVswXSYmdFszXT49aVsxXX12YXIgaG09Y207Y29uc3QgYnU9MWUtNjtjbGFzcyBObntjb25zdHJ1Y3Rvcigpe3RoaXMuX3gwPXRoaXMuX3kwPXRoaXMuX3gxPXRoaXMuX3kxPW51bGwsdGhpcy5fPSIifW1vdmVUbyh0LGUpe3RoaXMuXys9YE0ke3RoaXMuX3gwPXRoaXMuX3gxPSt0fSwke3RoaXMuX3kwPXRoaXMuX3kxPStlfWB9Y2xvc2VQYXRoKCl7dGhpcy5feDEhPT1udWxsJiYodGhpcy5feDE9dGhpcy5feDAsdGhpcy5feTE9dGhpcy5feTAsdGhpcy5fKz0iWiIpfWxpbmVUbyh0LGUpe3RoaXMuXys9YEwke3RoaXMuX3gxPSt0fSwke3RoaXMuX3kxPStlfWB9YXJjKHQsZSxuKXt0PSt0LGU9K2Usbj0rbjtjb25zdCBzPXQrbixyPWU7aWYobjwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzIik7dGhpcy5feDE9PT1udWxsP3RoaXMuXys9YE0ke3N9LCR7cn1gOihNYXRoLmFicyh0aGlzLl94MS1zKT5idXx8TWF0aC5hYnModGhpcy5feTEtcik+YnUpJiYodGhpcy5fKz0iTCIrcysiLCIrciksbiYmKHRoaXMuXys9YEEke259LCR7bn0sMCwxLDEsJHt0LW59LCR7ZX1BJHtufSwke259LDAsMSwxLCR7dGhpcy5feDE9c30sJHt0aGlzLl95MT1yfWApfXJlY3QodCxlLG4scyl7dGhpcy5fKz1gTSR7dGhpcy5feDA9dGhpcy5feDE9K3R9LCR7dGhpcy5feTA9dGhpcy5feTE9K2V9aCR7K259diR7K3N9aCR7LW59WmB9dmFsdWUoKXtyZXR1cm4gdGhpcy5ffHxudWxsfX1jbGFzcyBoY3tjb25zdHJ1Y3Rvcigpe3RoaXMuXz1bXX1tb3ZlVG8odCxlKXt0aGlzLl8ucHVzaChbdCxlXSl9Y2xvc2VQYXRoKCl7dGhpcy5fLnB1c2godGhpcy5fWzBdLnNsaWNlKCkpfWxpbmVUbyh0LGUpe3RoaXMuXy5wdXNoKFt0LGVdKX12YWx1ZSgpe3JldHVybiB0aGlzLl8ubGVuZ3RoP3RoaXMuXzpudWxsfX1jbGFzcyB1bXtjb25zdHJ1Y3Rvcih0LFtlLG4scyxyXT1bMCwwLDk2MCw1MDBdKXtpZighKChzPStzKT49KGU9K2UpKXx8ISgocj0rcik+PShuPStuKSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGJvdW5kcyIpO3RoaXMuZGVsYXVuYXk9dCx0aGlzLl9jaXJjdW1jZW50ZXJzPW5ldyBGbG9hdDY0QXJyYXkodC5wb2ludHMubGVuZ3RoKjIpLHRoaXMudmVjdG9ycz1uZXcgRmxvYXQ2NEFycmF5KHQucG9pbnRzLmxlbmd0aCoyKSx0aGlzLnhtYXg9cyx0aGlzLnhtaW49ZSx0aGlzLnltYXg9cix0aGlzLnltaW49bix0aGlzLl9pbml0KCl9dXBkYXRlKCl7cmV0dXJuIHRoaXMuZGVsYXVuYXkudXBkYXRlKCksdGhpcy5faW5pdCgpLHRoaXN9X2luaXQoKXtjb25zdHtkZWxhdW5heTp7cG9pbnRzOnQsaHVsbDplLHRyaWFuZ2xlczpufSx2ZWN0b3JzOnN9PXRoaXMscj10aGlzLmNpcmN1bWNlbnRlcnM9dGhpcy5fY2lyY3VtY2VudGVycy5zdWJhcnJheSgwLG4ubGVuZ3RoLzMqMik7Zm9yKGxldCBkPTAscD0wLHk9bi5sZW5ndGgsZyx3O2Q8eTtkKz0zLHArPTIpe2NvbnN0IGI9bltkXSoyLHg9bltkKzFdKjIsbT1uW2QrMl0qMixNPXRbYl0sUz10W2IrMV0sQT10W3hdLHY9dFt4KzFdLF89dFttXSxUPXRbbSsxXSx6PUEtTSxDPXYtUyxCPV8tTSxGPVQtUyxFPSh6KkYtQypCKSoyO2lmKE1hdGguYWJzKEUpPDFlLTkpe2xldCBJPTFlOTtjb25zdCBSPW5bMF0qMjtJKj1NYXRoLnNpZ24oKHRbUl0tTSkqRi0odFtSKzFdLVMpKkIpLGc9KE0rXykvMi1JKkYsdz0oUytUKS8yK0kqQn1lbHNle2NvbnN0IEk9MS9FLFI9eip6K0MqQyxWPUIqQitGKkY7Zz1NKyhGKlItQypWKSpJLHc9UysoeipWLUIqUikqSX1yW3BdPWcscltwKzFdPXd9bGV0IG89ZVtlLmxlbmd0aC0xXSxhLGM9byo0LGwsaD10WzIqb10sdSxmPXRbMipvKzFdO3MuZmlsbCgwKTtmb3IobGV0IGQ9MDtkPGUubGVuZ3RoOysrZClvPWVbZF0sYT1jLGw9aCx1PWYsYz1vKjQsaD10WzIqb10sZj10WzIqbysxXSxzW2ErMl09c1tjXT11LWYsc1thKzNdPXNbYysxXT1oLWx9cmVuZGVyKHQpe2NvbnN0IGU9dD09bnVsbD90PW5ldyBObjp2b2lkIDAse2RlbGF1bmF5OntoYWxmZWRnZXM6bixpbmVkZ2VzOnMsaHVsbDpyfSxjaXJjdW1jZW50ZXJzOm8sdmVjdG9yczphfT10aGlzO2lmKHIubGVuZ3RoPD0xKXJldHVybiBudWxsO2ZvcihsZXQgaD0wLHU9bi5sZW5ndGg7aDx1OysraCl7Y29uc3QgZj1uW2hdO2lmKGY8aCljb250aW51ZTtjb25zdCBkPU1hdGguZmxvb3IoaC8zKSoyLHA9TWF0aC5mbG9vcihmLzMpKjIseT1vW2RdLGc9b1tkKzFdLHc9b1twXSxiPW9bcCsxXTt0aGlzLl9yZW5kZXJTZWdtZW50KHksZyx3LGIsdCl9bGV0IGMsbD1yW3IubGVuZ3RoLTFdO2ZvcihsZXQgaD0wO2g8ci5sZW5ndGg7KytoKXtjPWwsbD1yW2hdO2NvbnN0IHU9TWF0aC5mbG9vcihzW2xdLzMpKjIsZj1vW3VdLGQ9b1t1KzFdLHA9Yyo0LHk9dGhpcy5fcHJvamVjdChmLGQsYVtwKzJdLGFbcCszXSk7eSYmdGhpcy5fcmVuZGVyU2VnbWVudChmLGQseVswXSx5WzFdLHQpfXJldHVybiBlJiZlLnZhbHVlKCl9cmVuZGVyQm91bmRzKHQpe2NvbnN0IGU9dD09bnVsbD90PW5ldyBObjp2b2lkIDA7cmV0dXJuIHQucmVjdCh0aGlzLnhtaW4sdGhpcy55bWluLHRoaXMueG1heC10aGlzLnhtaW4sdGhpcy55bWF4LXRoaXMueW1pbiksZSYmZS52YWx1ZSgpfXJlbmRlckNlbGwodCxlKXtjb25zdCBuPWU9PW51bGw/ZT1uZXcgTm46dm9pZCAwLHM9dGhpcy5fY2xpcCh0KTtpZihzPT09bnVsbHx8IXMubGVuZ3RoKXJldHVybjtlLm1vdmVUbyhzWzBdLHNbMV0pO2xldCByPXMubGVuZ3RoO2Zvcig7c1swXT09PXNbci0yXSYmc1sxXT09PXNbci0xXSYmcj4xOylyLT0yO2ZvcihsZXQgbz0yO288cjtvKz0yKShzW29dIT09c1tvLTJdfHxzW28rMV0hPT1zW28tMV0pJiZlLmxpbmVUbyhzW29dLHNbbysxXSk7cmV0dXJuIGUuY2xvc2VQYXRoKCksbiYmbi52YWx1ZSgpfSpjZWxsUG9seWdvbnMoKXtjb25zdHtkZWxhdW5heTp7cG9pbnRzOnR9fT10aGlzO2ZvcihsZXQgZT0wLG49dC5sZW5ndGgvMjtlPG47KytlKXtjb25zdCBzPXRoaXMuY2VsbFBvbHlnb24oZSk7cyYmKHMuaW5kZXg9ZSx5aWVsZCBzKX19Y2VsbFBvbHlnb24odCl7Y29uc3QgZT1uZXcgaGM7cmV0dXJuIHRoaXMucmVuZGVyQ2VsbCh0LGUpLGUudmFsdWUoKX1fcmVuZGVyU2VnbWVudCh0LGUsbixzLHIpe2xldCBvO2NvbnN0IGE9dGhpcy5fcmVnaW9uY29kZSh0LGUpLGM9dGhpcy5fcmVnaW9uY29kZShuLHMpO2E9PT0wJiZjPT09MD8oci5tb3ZlVG8odCxlKSxyLmxpbmVUbyhuLHMpKToobz10aGlzLl9jbGlwU2VnbWVudCh0LGUsbixzLGEsYykpJiYoci5tb3ZlVG8ob1swXSxvWzFdKSxyLmxpbmVUbyhvWzJdLG9bM10pKX1jb250YWlucyh0LGUsbil7cmV0dXJuIGU9K2UsZSE9PWV8fChuPStuLG4hPT1uKT8hMTp0aGlzLmRlbGF1bmF5Ll9zdGVwKHQsZSxuKT09PXR9Km5laWdoYm9ycyh0KXtjb25zdCBlPXRoaXMuX2NsaXAodCk7aWYoZSlmb3IoY29uc3QgbiBvZiB0aGlzLmRlbGF1bmF5Lm5laWdoYm9ycyh0KSl7Y29uc3Qgcz10aGlzLl9jbGlwKG4pO2lmKHMpe3Q6Zm9yKGxldCByPTAsbz1lLmxlbmd0aDtyPG87cis9Milmb3IobGV0IGE9MCxjPXMubGVuZ3RoO2E8YzthKz0yKWlmKGVbcl09PXNbYV0mJmVbcisxXT09c1thKzFdJiZlWyhyKzIpJW9dPT1zWyhhK2MtMiklY10mJmVbKHIrMyklb109PXNbKGErYy0xKSVjXSl7eWllbGQgbjticmVhayB0fX19fV9jZWxsKHQpe2NvbnN0e2NpcmN1bWNlbnRlcnM6ZSxkZWxhdW5heTp7aW5lZGdlczpuLGhhbGZlZGdlczpzLHRyaWFuZ2xlczpyfX09dGhpcyxvPW5bdF07aWYobz09PS0xKXJldHVybiBudWxsO2NvbnN0IGE9W107bGV0IGM9bztkb3tjb25zdCBsPU1hdGguZmxvb3IoYy8zKTtpZihhLnB1c2goZVtsKjJdLGVbbCoyKzFdKSxjPWMlMz09PTI/Yy0yOmMrMSxyW2NdIT09dClicmVhaztjPXNbY119d2hpbGUoYyE9PW8mJmMhPT0tMSk7cmV0dXJuIGF9X2NsaXAodCl7aWYodD09PTAmJnRoaXMuZGVsYXVuYXkuaHVsbC5sZW5ndGg9PT0xKXJldHVyblt0aGlzLnhtYXgsdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWluXTtjb25zdCBlPXRoaXMuX2NlbGwodCk7aWYoZT09PW51bGwpcmV0dXJuIG51bGw7Y29uc3R7dmVjdG9yczpufT10aGlzLHM9dCo0O3JldHVybiBuW3NdfHxuW3MrMV0/dGhpcy5fY2xpcEluZmluaXRlKHQsZSxuW3NdLG5bcysxXSxuW3MrMl0sbltzKzNdKTp0aGlzLl9jbGlwRmluaXRlKHQsZSl9X2NsaXBGaW5pdGUodCxlKXtjb25zdCBuPWUubGVuZ3RoO2xldCBzPW51bGwscixvLGE9ZVtuLTJdLGM9ZVtuLTFdLGwsaD10aGlzLl9yZWdpb25jb2RlKGEsYyksdSxmPTA7Zm9yKGxldCBkPTA7ZDxuO2QrPTIpaWYocj1hLG89YyxhPWVbZF0sYz1lW2QrMV0sbD1oLGg9dGhpcy5fcmVnaW9uY29kZShhLGMpLGw9PT0wJiZoPT09MCl1PWYsZj0wLHM/cy5wdXNoKGEsYyk6cz1bYSxjXTtlbHNle2xldCBwLHksZyx3LGI7aWYobD09PTApe2lmKChwPXRoaXMuX2NsaXBTZWdtZW50KHIsbyxhLGMsbCxoKSk9PT1udWxsKWNvbnRpbnVlO1t5LGcsdyxiXT1wfWVsc2V7aWYoKHA9dGhpcy5fY2xpcFNlZ21lbnQoYSxjLHIsbyxoLGwpKT09PW51bGwpY29udGludWU7W3csYix5LGddPXAsdT1mLGY9dGhpcy5fZWRnZWNvZGUoeSxnKSx1JiZmJiZ0aGlzLl9lZGdlKHQsdSxmLHMscy5sZW5ndGgpLHM/cy5wdXNoKHksZyk6cz1beSxnXX11PWYsZj10aGlzLl9lZGdlY29kZSh3LGIpLHUmJmYmJnRoaXMuX2VkZ2UodCx1LGYscyxzLmxlbmd0aCkscz9zLnB1c2godyxiKTpzPVt3LGJdfWlmKHMpdT1mLGY9dGhpcy5fZWRnZWNvZGUoc1swXSxzWzFdKSx1JiZmJiZ0aGlzLl9lZGdlKHQsdSxmLHMscy5sZW5ndGgpO2Vsc2UgaWYodGhpcy5jb250YWlucyh0LCh0aGlzLnhtaW4rdGhpcy54bWF4KS8yLCh0aGlzLnltaW4rdGhpcy55bWF4KS8yKSlyZXR1cm5bdGhpcy54bWF4LHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1pbl07cmV0dXJuIHN9X2NsaXBTZWdtZW50KHQsZSxuLHMscixvKXtmb3IoOzspe2lmKHI9PT0wJiZvPT09MClyZXR1cm5bdCxlLG4sc107aWYociZvKXJldHVybiBudWxsO2xldCBhLGMsbD1yfHxvO2wmOD8oYT10KyhuLXQpKih0aGlzLnltYXgtZSkvKHMtZSksYz10aGlzLnltYXgpOmwmND8oYT10KyhuLXQpKih0aGlzLnltaW4tZSkvKHMtZSksYz10aGlzLnltaW4pOmwmMj8oYz1lKyhzLWUpKih0aGlzLnhtYXgtdCkvKG4tdCksYT10aGlzLnhtYXgpOihjPWUrKHMtZSkqKHRoaXMueG1pbi10KS8obi10KSxhPXRoaXMueG1pbikscj8odD1hLGU9YyxyPXRoaXMuX3JlZ2lvbmNvZGUodCxlKSk6KG49YSxzPWMsbz10aGlzLl9yZWdpb25jb2RlKG4scykpfX1fY2xpcEluZmluaXRlKHQsZSxuLHMscixvKXtsZXQgYT1BcnJheS5mcm9tKGUpLGM7aWYoKGM9dGhpcy5fcHJvamVjdChhWzBdLGFbMV0sbixzKSkmJmEudW5zaGlmdChjWzBdLGNbMV0pLChjPXRoaXMuX3Byb2plY3QoYVthLmxlbmd0aC0yXSxhW2EubGVuZ3RoLTFdLHIsbykpJiZhLnB1c2goY1swXSxjWzFdKSxhPXRoaXMuX2NsaXBGaW5pdGUodCxhKSlmb3IobGV0IGw9MCxoPWEubGVuZ3RoLHUsZj10aGlzLl9lZGdlY29kZShhW2gtMl0sYVtoLTFdKTtsPGg7bCs9Mil1PWYsZj10aGlzLl9lZGdlY29kZShhW2xdLGFbbCsxXSksdSYmZiYmKGw9dGhpcy5fZWRnZSh0LHUsZixhLGwpLGg9YS5sZW5ndGgpO2Vsc2UgdGhpcy5jb250YWlucyh0LCh0aGlzLnhtaW4rdGhpcy54bWF4KS8yLCh0aGlzLnltaW4rdGhpcy55bWF4KS8yKSYmKGE9W3RoaXMueG1pbix0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltYXhdKTtyZXR1cm4gYX1fZWRnZSh0LGUsbixzLHIpe2Zvcig7ZSE9PW47KXtsZXQgbyxhO3N3aXRjaChlKXtjYXNlIDU6ZT00O2NvbnRpbnVlO2Nhc2UgNDplPTYsbz10aGlzLnhtYXgsYT10aGlzLnltaW47YnJlYWs7Y2FzZSA2OmU9Mjtjb250aW51ZTtjYXNlIDI6ZT0xMCxvPXRoaXMueG1heCxhPXRoaXMueW1heDticmVhaztjYXNlIDEwOmU9ODtjb250aW51ZTtjYXNlIDg6ZT05LG89dGhpcy54bWluLGE9dGhpcy55bWF4O2JyZWFrO2Nhc2UgOTplPTE7Y29udGludWU7Y2FzZSAxOmU9NSxvPXRoaXMueG1pbixhPXRoaXMueW1pbjticmVha30oc1tyXSE9PW98fHNbcisxXSE9PWEpJiZ0aGlzLmNvbnRhaW5zKHQsbyxhKSYmKHMuc3BsaWNlKHIsMCxvLGEpLHIrPTIpfWlmKHMubGVuZ3RoPjQpZm9yKGxldCBvPTA7bzxzLmxlbmd0aDtvKz0yKXtjb25zdCBhPShvKzIpJXMubGVuZ3RoLGM9KG8rNCklcy5sZW5ndGg7KHNbb109PT1zW2FdJiZzW2FdPT09c1tjXXx8c1tvKzFdPT09c1thKzFdJiZzW2ErMV09PT1zW2MrMV0pJiYocy5zcGxpY2UoYSwyKSxvLT0yKX1yZXR1cm4gcn1fcHJvamVjdCh0LGUsbixzKXtsZXQgcj0xLzAsbyxhLGM7aWYoczwwKXtpZihlPD10aGlzLnltaW4pcmV0dXJuIG51bGw7KG89KHRoaXMueW1pbi1lKS9zKTxyJiYoYz10aGlzLnltaW4sYT10KyhyPW8pKm4pfWVsc2UgaWYocz4wKXtpZihlPj10aGlzLnltYXgpcmV0dXJuIG51bGw7KG89KHRoaXMueW1heC1lKS9zKTxyJiYoYz10aGlzLnltYXgsYT10KyhyPW8pKm4pfWlmKG4+MCl7aWYodD49dGhpcy54bWF4KXJldHVybiBudWxsOyhvPSh0aGlzLnhtYXgtdCkvbik8ciYmKGE9dGhpcy54bWF4LGM9ZSsocj1vKSpzKX1lbHNlIGlmKG48MCl7aWYodDw9dGhpcy54bWluKXJldHVybiBudWxsOyhvPSh0aGlzLnhtaW4tdCkvbik8ciYmKGE9dGhpcy54bWluLGM9ZSsocj1vKSpzKX1yZXR1cm5bYSxjXX1fZWRnZWNvZGUodCxlKXtyZXR1cm4odD09PXRoaXMueG1pbj8xOnQ9PT10aGlzLnhtYXg/MjowKXwoZT09PXRoaXMueW1pbj80OmU9PT10aGlzLnltYXg/ODowKX1fcmVnaW9uY29kZSh0LGUpe3JldHVybih0PHRoaXMueG1pbj8xOnQ+dGhpcy54bWF4PzI6MCl8KGU8dGhpcy55bWluPzQ6ZT50aGlzLnltYXg/ODowKX19Y29uc3QgZm09MipNYXRoLlBJLHdpPU1hdGgucG93O2Z1bmN0aW9uIGRtKGkpe3JldHVybiBpWzBdfWZ1bmN0aW9uIHBtKGkpe3JldHVybiBpWzFdfWZ1bmN0aW9uIHltKGkpe2NvbnN0e3RyaWFuZ2xlczp0LGNvb3JkczplfT1pO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bis9Myl7Y29uc3Qgcz0yKnRbbl0scj0yKnRbbisxXSxvPTIqdFtuKzJdO2lmKChlW29dLWVbc10pKihlW3IrMV0tZVtzKzFdKS0oZVtyXS1lW3NdKSooZVtvKzFdLWVbcysxXSk+MWUtMTApcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gbW0oaSx0LGUpe3JldHVybltpK01hdGguc2luKGkrdCkqZSx0K01hdGguY29zKGktdCkqZV19Y2xhc3MgdWN7c3RhdGljIGZyb20odCxlPWRtLG49cG0scyl7cmV0dXJuIG5ldyB1YygibGVuZ3RoImluIHQ/Z20odCxlLG4scyk6RmxvYXQ2NEFycmF5LmZyb20oeG0odCxlLG4scykpKX1jb25zdHJ1Y3Rvcih0KXt0aGlzLl9kZWxhdW5hdG9yPW5ldyBscyh0KSx0aGlzLmluZWRnZXM9bmV3IEludDMyQXJyYXkodC5sZW5ndGgvMiksdGhpcy5faHVsbEluZGV4PW5ldyBJbnQzMkFycmF5KHQubGVuZ3RoLzIpLHRoaXMucG9pbnRzPXRoaXMuX2RlbGF1bmF0b3IuY29vcmRzLHRoaXMuX2luaXQoKX11cGRhdGUoKXtyZXR1cm4gdGhpcy5fZGVsYXVuYXRvci51cGRhdGUoKSx0aGlzLl9pbml0KCksdGhpc31faW5pdCgpe2NvbnN0IHQ9dGhpcy5fZGVsYXVuYXRvcixlPXRoaXMucG9pbnRzO2lmKHQuaHVsbCYmdC5odWxsLmxlbmd0aD4yJiZ5bSh0KSl7dGhpcy5jb2xsaW5lYXI9SW50MzJBcnJheS5mcm9tKHtsZW5ndGg6ZS5sZW5ndGgvMn0sKGYsZCk9PmQpLnNvcnQoKGYsZCk9PmVbMipmXS1lWzIqZF18fGVbMipmKzFdLWVbMipkKzFdKTtjb25zdCBjPXRoaXMuY29sbGluZWFyWzBdLGw9dGhpcy5jb2xsaW5lYXJbdGhpcy5jb2xsaW5lYXIubGVuZ3RoLTFdLGg9W2VbMipjXSxlWzIqYysxXSxlWzIqbF0sZVsyKmwrMV1dLHU9MWUtOCpNYXRoLmh5cG90KGhbM10taFsxXSxoWzJdLWhbMF0pO2ZvcihsZXQgZj0wLGQ9ZS5sZW5ndGgvMjtmPGQ7KytmKXtjb25zdCBwPW1tKGVbMipmXSxlWzIqZisxXSx1KTtlWzIqZl09cFswXSxlWzIqZisxXT1wWzFdfXRoaXMuX2RlbGF1bmF0b3I9bmV3IGxzKGUpfWVsc2UgZGVsZXRlIHRoaXMuY29sbGluZWFyO2NvbnN0IG49dGhpcy5oYWxmZWRnZXM9dGhpcy5fZGVsYXVuYXRvci5oYWxmZWRnZXMscz10aGlzLmh1bGw9dGhpcy5fZGVsYXVuYXRvci5odWxsLHI9dGhpcy50cmlhbmdsZXM9dGhpcy5fZGVsYXVuYXRvci50cmlhbmdsZXMsbz10aGlzLmluZWRnZXMuZmlsbCgtMSksYT10aGlzLl9odWxsSW5kZXguZmlsbCgtMSk7Zm9yKGxldCBjPTAsbD1uLmxlbmd0aDtjPGw7KytjKXtjb25zdCBoPXJbYyUzPT09Mj9jLTI6YysxXTsobltjXT09PS0xfHxvW2hdPT09LTEpJiYob1toXT1jKX1mb3IobGV0IGM9MCxsPXMubGVuZ3RoO2M8bDsrK2MpYVtzW2NdXT1jO3MubGVuZ3RoPD0yJiZzLmxlbmd0aD4wJiYodGhpcy50cmlhbmdsZXM9bmV3IEludDMyQXJyYXkoMykuZmlsbCgtMSksdGhpcy5oYWxmZWRnZXM9bmV3IEludDMyQXJyYXkoMykuZmlsbCgtMSksdGhpcy50cmlhbmdsZXNbMF09c1swXSxvW3NbMF1dPTEscy5sZW5ndGg9PT0yJiYob1tzWzFdXT0wLHRoaXMudHJpYW5nbGVzWzFdPXNbMV0sdGhpcy50cmlhbmdsZXNbMl09c1sxXSkpfXZvcm9ub2kodCl7cmV0dXJuIG5ldyB1bSh0aGlzLHQpfSpuZWlnaGJvcnModCl7Y29uc3R7aW5lZGdlczplLGh1bGw6bixfaHVsbEluZGV4OnMsaGFsZmVkZ2VzOnIsdHJpYW5nbGVzOm8sY29sbGluZWFyOmF9PXRoaXM7aWYoYSl7Y29uc3QgdT1hLmluZGV4T2YodCk7dT4wJiYoeWllbGQgYVt1LTFdKSx1PGEubGVuZ3RoLTEmJih5aWVsZCBhW3UrMV0pO3JldHVybn1jb25zdCBjPWVbdF07aWYoYz09PS0xKXJldHVybjtsZXQgbD1jLGg9LTE7ZG97aWYoeWllbGQgaD1vW2xdLGw9bCUzPT09Mj9sLTI6bCsxLG9bbF0hPT10KXJldHVybjtpZihsPXJbbF0sbD09PS0xKXtjb25zdCB1PW5bKHNbdF0rMSklbi5sZW5ndGhdO3UhPT1oJiYoeWllbGQgdSk7cmV0dXJufX13aGlsZShsIT09Yyl9ZmluZCh0LGUsbj0wKXtpZih0PSt0LHQhPT10fHwoZT0rZSxlIT09ZSkpcmV0dXJuLTE7Y29uc3Qgcz1uO2xldCByO2Zvcig7KHI9dGhpcy5fc3RlcChuLHQsZSkpPj0wJiZyIT09biYmciE9PXM7KW49cjtyZXR1cm4gcn1fc3RlcCh0LGUsbil7Y29uc3R7aW5lZGdlczpzLGh1bGw6cixfaHVsbEluZGV4Om8saGFsZmVkZ2VzOmEsdHJpYW5nbGVzOmMscG9pbnRzOmx9PXRoaXM7aWYoc1t0XT09PS0xfHwhbC5sZW5ndGgpcmV0dXJuKHQrMSklKGwubGVuZ3RoPj4xKTtsZXQgaD10LHU9d2koZS1sW3QqMl0sMikrd2kobi1sW3QqMisxXSwyKTtjb25zdCBmPXNbdF07bGV0IGQ9Zjtkb3tsZXQgcD1jW2RdO2NvbnN0IHk9d2koZS1sW3AqMl0sMikrd2kobi1sW3AqMisxXSwyKTtpZih5PHUmJih1PXksaD1wKSxkPWQlMz09PTI/ZC0yOmQrMSxjW2RdIT09dClicmVhaztpZihkPWFbZF0sZD09PS0xKXtpZihkPXJbKG9bdF0rMSklci5sZW5ndGhdLGQhPT1wJiZ3aShlLWxbZCoyXSwyKSt3aShuLWxbZCoyKzFdLDIpPHUpcmV0dXJuIGQ7YnJlYWt9fXdoaWxlKGQhPT1mKTtyZXR1cm4gaH1yZW5kZXIodCl7Y29uc3QgZT10PT1udWxsP3Q9bmV3IE5uOnZvaWQgMCx7cG9pbnRzOm4saGFsZmVkZ2VzOnMsdHJpYW5nbGVzOnJ9PXRoaXM7Zm9yKGxldCBvPTAsYT1zLmxlbmd0aDtvPGE7KytvKXtjb25zdCBjPXNbb107aWYoYzxvKWNvbnRpbnVlO2NvbnN0IGw9cltvXSoyLGg9cltjXSoyO3QubW92ZVRvKG5bbF0sbltsKzFdKSx0LmxpbmVUbyhuW2hdLG5baCsxXSl9cmV0dXJuIHRoaXMucmVuZGVySHVsbCh0KSxlJiZlLnZhbHVlKCl9cmVuZGVyUG9pbnRzKHQsZSl7ZT09PXZvaWQgMCYmKCF0fHx0eXBlb2YgdC5tb3ZlVG8hPSJmdW5jdGlvbiIpJiYoZT10LHQ9bnVsbCksZT1lPT1udWxsPzI6K2U7Y29uc3Qgbj10PT1udWxsP3Q9bmV3IE5uOnZvaWQgMCx7cG9pbnRzOnN9PXRoaXM7Zm9yKGxldCByPTAsbz1zLmxlbmd0aDtyPG87cis9Mil7Y29uc3QgYT1zW3JdLGM9c1tyKzFdO3QubW92ZVRvKGErZSxjKSx0LmFyYyhhLGMsZSwwLGZtKX1yZXR1cm4gbiYmbi52YWx1ZSgpfXJlbmRlckh1bGwodCl7Y29uc3QgZT10PT1udWxsP3Q9bmV3IE5uOnZvaWQgMCx7aHVsbDpuLHBvaW50czpzfT10aGlzLHI9blswXSoyLG89bi5sZW5ndGg7dC5tb3ZlVG8oc1tyXSxzW3IrMV0pO2ZvcihsZXQgYT0xO2E8bzsrK2Epe2NvbnN0IGM9MipuW2FdO3QubGluZVRvKHNbY10sc1tjKzFdKX1yZXR1cm4gdC5jbG9zZVBhdGgoKSxlJiZlLnZhbHVlKCl9aHVsbFBvbHlnb24oKXtjb25zdCB0PW5ldyBoYztyZXR1cm4gdGhpcy5yZW5kZXJIdWxsKHQpLHQudmFsdWUoKX1yZW5kZXJUcmlhbmdsZSh0LGUpe2NvbnN0IG49ZT09bnVsbD9lPW5ldyBObjp2b2lkIDAse3BvaW50czpzLHRyaWFuZ2xlczpyfT10aGlzLG89clt0Kj0zXSoyLGE9clt0KzFdKjIsYz1yW3QrMl0qMjtyZXR1cm4gZS5tb3ZlVG8oc1tvXSxzW28rMV0pLGUubGluZVRvKHNbYV0sc1thKzFdKSxlLmxpbmVUbyhzW2NdLHNbYysxXSksZS5jbG9zZVBhdGgoKSxuJiZuLnZhbHVlKCl9KnRyaWFuZ2xlUG9seWdvbnMoKXtjb25zdHt0cmlhbmdsZXM6dH09dGhpcztmb3IobGV0IGU9MCxuPXQubGVuZ3RoLzM7ZTxuOysrZSl5aWVsZCB0aGlzLnRyaWFuZ2xlUG9seWdvbihlKX10cmlhbmdsZVBvbHlnb24odCl7Y29uc3QgZT1uZXcgaGM7cmV0dXJuIHRoaXMucmVuZGVyVHJpYW5nbGUodCxlKSxlLnZhbHVlKCl9fWZ1bmN0aW9uIGdtKGksdCxlLG4pe2NvbnN0IHM9aS5sZW5ndGgscj1uZXcgRmxvYXQ2NEFycmF5KHMqMik7Zm9yKGxldCBvPTA7bzxzOysrbyl7Y29uc3QgYT1pW29dO3JbbyoyXT10LmNhbGwobixhLG8saSkscltvKjIrMV09ZS5jYWxsKG4sYSxvLGkpfXJldHVybiByfWZ1bmN0aW9uKnhtKGksdCxlLG4pe2xldCBzPTA7Zm9yKGNvbnN0IHIgb2YgaSl5aWVsZCB0LmNhbGwobixyLHMsaSkseWllbGQgZS5jYWxsKG4scixzLGkpLCsrc31jb25zdCBmYz1NYXRoLlBJLE11PWZjLzIsQXU9MTgwL2ZjLFN1PWZjLzE4MCx3bT1NYXRoLmF0YW4yLHZ1PU1hdGguY29zLGJtPU1hdGgubWF4LE1tPU1hdGgubWluLF91PU1hdGguc2luLEFtPU1hdGguc2lnbnx8ZnVuY3Rpb24oaSl7cmV0dXJuIGk+MD8xOmk8MD8tMTowfSx6dT1NYXRoLnNxcnQ7ZnVuY3Rpb24gU20oaSl7cmV0dXJuIGk+MT9NdTppPC0xPy1NdTpNYXRoLmFzaW4oaSl9ZnVuY3Rpb24gVHUoaSx0KXtyZXR1cm4gaVswXSp0WzBdK2lbMV0qdFsxXStpWzJdKnRbMl19ZnVuY3Rpb24gS3QoaSx0KXtyZXR1cm5baVsxXSp0WzJdLWlbMl0qdFsxXSxpWzJdKnRbMF0taVswXSp0WzJdLGlbMF0qdFsxXS1pWzFdKnRbMF1dfWZ1bmN0aW9uIEdyKGksdCl7cmV0dXJuW2lbMF0rdFswXSxpWzFdK3RbMV0saVsyXSt0WzJdXX1mdW5jdGlvbiBIcihpKXt2YXIgdD16dShpWzBdKmlbMF0raVsxXSppWzFdK2lbMl0qaVsyXSk7cmV0dXJuW2lbMF0vdCxpWzFdL3QsaVsyXS90XX1mdW5jdGlvbiBkYyhpKXtyZXR1cm5bd20oaVsxXSxpWzBdKSpBdSxTbShibSgtMSxNbSgxLGlbMl0pKSkqQXVdfWZ1bmN0aW9uIHplKGkpe2NvbnN0IHQ9aVswXSpTdSxlPWlbMV0qU3Usbj12dShlKTtyZXR1cm5bbip2dSh0KSxuKl91KHQpLF91KGUpXX1mdW5jdGlvbiBwYyhpKXtyZXR1cm4gaT1pLm1hcCh0PT56ZSh0KSksVHUoaVswXSxLdChpWzJdLGlbMV0pKX1mdW5jdGlvbiB2bShpKXtjb25zdCB0PXptKGkpLGU9UG0odCksbj1UbShlLGkpLHM9Qm0oZSxpLmxlbmd0aCkscj1fbShzLGkpLG89Q20oZSxpKSx7cG9seWdvbnM6YSxjZW50ZXJzOmN9PUVtKG8sZSxpKSxsPUZtKGEpLGg9Tm0oZSxpKSx1PUltKG4sZSk7cmV0dXJue2RlbGF1bmF5OnQsZWRnZXM6bix0cmlhbmdsZXM6ZSxjZW50ZXJzOmMsbmVpZ2hib3JzOnMscG9seWdvbnM6YSxtZXNoOmwsaHVsbDpoLHVycXVoYXJ0OnUsZmluZDpyfX1mdW5jdGlvbiBfbShpLHQpe2Z1bmN0aW9uIGUobixzKXtsZXQgcj1uWzBdLXNbMF0sbz1uWzFdLXNbMV0sYT1uWzJdLXNbMl07cmV0dXJuIHIqcitvKm8rYSphfXJldHVybiBmdW5jdGlvbihzLHIsbyl7bz09PXZvaWQgMCYmKG89MCk7bGV0IGEsYyxsPW87Y29uc3QgaD16ZShbcyxyXSk7ZG8gYT1vLG89bnVsbCxjPWUoaCx6ZSh0W2FdKSksaVthXS5mb3JFYWNoKHU9PntsZXQgZj1lKGgsemUodFt1XSkpO2lmKGY8Yyl7Yz1mLG89dSxsPXU7cmV0dXJufX0pO3doaWxlKG8hPT1udWxsKTtyZXR1cm4gbH19ZnVuY3Rpb24gem0oaSl7aWYoaS5sZW5ndGg8MilyZXR1cm57fTtsZXQgdD0wO2Zvcig7aXNOYU4oaVt0XVswXStpW3RdWzFdKSYmdCsrPGkubGVuZ3RoOyk7Y29uc3QgZT1EaChpW3RdKSxuPW15KCkudHJhbnNsYXRlKFswLDBdKS5zY2FsZSgxKS5yb3RhdGUoZS5pbnZlcnQoWzE4MCwwXSkpO2k9aS5tYXAobik7Y29uc3Qgcz1bXTtsZXQgcj0xO2ZvcihsZXQgdT0wLGY9aS5sZW5ndGg7dTxmO3UrKyl7bGV0IGQ9dmkoaVt1XVswXSwyKSt2aShpW3VdWzFdLDIpOyFpc0Zpbml0ZShkKXx8ZD4xZTMyP3MucHVzaCh1KTpkPnImJihyPWQpfWNvbnN0IG89MWU2Knp1KHIpO3MuZm9yRWFjaCh1PT5pW3VdPVtvLDBdKSxpLnB1c2goWzAsb10pLGkucHVzaChbLW8sMF0pLGkucHVzaChbMCwtb10pO2NvbnN0IGE9dWMuZnJvbShpKTthLnByb2plY3Rpb249bjtjb25zdHt0cmlhbmdsZXM6YyxoYWxmZWRnZXM6bCxpbmVkZ2VzOmh9PWE7Zm9yKGxldCB1PTAsZj1sLmxlbmd0aDt1PGY7dSsrKWlmKGxbdV08MCl7Y29uc3QgZD11JTM9PTI/dS0yOnUrMSxwPXUlMz09MD91KzI6dS0xLHk9bFtkXSxnPWxbcF07bFt5XT1nLGxbZ109eSxsW2RdPWxbcF09LTEsY1t1XT1jW2RdPWNbcF09dCxoW2NbeV1dPXklMz09MD95KzI6eS0xLGhbY1tnXV09ZyUzPT0wP2crMjpnLTEsdSs9Mi11JTN9ZWxzZSBjW3VdPmkubGVuZ3RoLTMtMSYmKGNbdV09dCk7cmV0dXJuIGF9ZnVuY3Rpb24gVG0oaSx0KXtjb25zdCBlPW5ldyBTZXQ7cmV0dXJuIHQubGVuZ3RoPT09Mj9bWzAsMV1dOihpLmZvckVhY2gobj0+e2lmKG5bMF0hPT1uWzFdJiYhKHBjKG4ubWFwKHM9PnRbc10pKTwwKSlmb3IobGV0IHM9MCxyO3M8MztzKyspcj0ocysxKSUzLGUuYWRkKGRyKFtuW3NdLG5bcl1dKS5qb2luKCItIikpfSksQXJyYXkuZnJvbShlLG49Pm4uc3BsaXQoIi0iKS5tYXAoTnVtYmVyKSkpfWZ1bmN0aW9uIFBtKGkpe2NvbnN0e3RyaWFuZ2xlczp0fT1pO2lmKCF0KXJldHVybltdO2NvbnN0IGU9W107Zm9yKGxldCBuPTAscz10Lmxlbmd0aC8zO248cztuKyspe2NvbnN0IHI9dFszKm5dLG89dFszKm4rMV0sYT10WzMqbisyXTtyIT09byYmbyE9PWEmJmUucHVzaChbcixhLG9dKX1yZXR1cm4gZX1mdW5jdGlvbiBDbShpLHQpe3JldHVybiBpLm1hcChlPT57Y29uc3Qgbj1lLm1hcChyPT50W3JdKS5tYXAoemUpLHM9R3IoR3IoS3QoblsxXSxuWzBdKSxLdChuWzJdLG5bMV0pKSxLdChuWzBdLG5bMl0pKTtyZXR1cm4gZGMoSHIocykpfSl9ZnVuY3Rpb24gQm0oaSx0KXtjb25zdCBlPVtdO3JldHVybiBpLmZvckVhY2gobj0+e2ZvcihsZXQgcz0wO3M8MztzKyspe2NvbnN0IHI9bltzXSxvPW5bKHMrMSklM107ZVtyXT1lW3JdfHxbXSxlW3JdLnB1c2gobyl9fSksaS5sZW5ndGg9PT0wJiYodD09PTI/KGVbMF09WzFdLGVbMV09WzBdKTp0PT09MSYmKGVbMF09W10pKSxlfWZ1bmN0aW9uIEVtKGksdCxlKXtjb25zdCBuPVtdLHM9aS5zbGljZSgpO2lmKHQubGVuZ3RoPT09MCl7aWYoZS5sZW5ndGg8MilyZXR1cm57cG9seWdvbnM6bixjZW50ZXJzOnN9O2lmKGUubGVuZ3RoPT09Mil7Y29uc3QgYT16ZShlWzBdKSxjPXplKGVbMV0pLGw9SHIoR3IoYSxjKSksaD1IcihLdChhLGMpKSx1PUt0KGwsaCksZj1bbCxLdChsLHUpLEt0KEt0KGwsdSksdSksS3QoS3QoS3QobCx1KSx1KSx1KV0ubWFwKGRjKS5tYXAobyk7cmV0dXJuIG4ucHVzaChmKSxuLnB1c2goZi5zbGljZSgpLnJldmVyc2UoKSkse3BvbHlnb25zOm4sY2VudGVyczpzfX19dC5mb3JFYWNoKChhLGMpPT57Zm9yKGxldCBsPTA7bDwzO2wrKyl7Y29uc3QgaD1hW2xdLHU9YVsobCsxKSUzXSxmPWFbKGwrMiklM107bltoXT1uW2hdfHxbXSxuW2hdLnB1c2goW3UsZixjLFtoLHUsZl1dKX19KTtjb25zdCByPW4ubWFwKGE9Pntjb25zdCBjPVthWzBdWzJdXTtsZXQgbD1hWzBdWzFdO2ZvcihsZXQgaD0xO2g8YS5sZW5ndGg7aCsrKWZvcihsZXQgdT0wO3U8YS5sZW5ndGg7dSsrKWlmKGFbdV1bMF09PWwpe2w9YVt1XVsxXSxjLnB1c2goYVt1XVsyXSk7YnJlYWt9aWYoYy5sZW5ndGg+MilyZXR1cm4gYztpZihjLmxlbmd0aD09Mil7Y29uc3QgaD1QdShlW2FbMF1bM11bMF1dLGVbYVswXVszXVsxXV0sc1tjWzBdXSksdT1QdShlW2FbMF1bM11bMl1dLGVbYVswXVszXVswXV0sc1tjWzBdXSksZj1vKGgpLGQ9byh1KTtyZXR1cm5bY1swXSxkLGNbMV0sZl19fSk7ZnVuY3Rpb24gbyhhKXtsZXQgYz0tMTtyZXR1cm4gcy5zbGljZSh0Lmxlbmd0aCwxLzApLmZvckVhY2goKGwsaCk9PntsWzBdPT09YVswXSYmbFsxXT09PWFbMV0mJihjPWgrdC5sZW5ndGgpfSksYzwwJiYoYz1zLmxlbmd0aCxzLnB1c2goYSkpLGN9cmV0dXJue3BvbHlnb25zOnIsY2VudGVyczpzfX1mdW5jdGlvbiBQdShpLHQsZSl7aT16ZShpKSx0PXplKHQpLGU9emUoZSk7Y29uc3Qgbj1BbShUdShLdCh0LGkpLGUpKTtyZXR1cm4gZGMoSHIoR3IoaSx0KSkubWFwKHM9Pm4qcykpfWZ1bmN0aW9uIEZtKGkpe2NvbnN0IHQ9W107cmV0dXJuIGkuZm9yRWFjaChlPT57aWYoIWUpcmV0dXJuO2xldCBuPWVbZS5sZW5ndGgtMV07Zm9yKGxldCBzIG9mIGUpcz5uJiZ0LnB1c2goW24sc10pLG49c30pLHR9ZnVuY3Rpb24gSW0oaSx0KXtyZXR1cm4gZnVuY3Rpb24oZSl7Y29uc3Qgbj1uZXcgTWFwLHM9bmV3IE1hcDtyZXR1cm4gaS5mb3JFYWNoKChyLG8pPT57Y29uc3QgYT1yLmpvaW4oIi0iKTtuLnNldChhLGVbb10pLHMuc2V0KGEsITApfSksdC5mb3JFYWNoKHI9PntsZXQgbz0wLGE9LTE7Zm9yKGxldCBjPTA7YzwzO2MrKyl7bGV0IGw9ZHIoW3JbY10sclsoYysxKSUzXV0pLmpvaW4oIi0iKTtuLmdldChsKT5vJiYobz1uLmdldChsKSxhPWwpfXMuc2V0KGEsITEpfSksaS5tYXAocj0+cy5nZXQoci5qb2luKCItIikpKX19ZnVuY3Rpb24gTm0oaSx0KXtjb25zdCBlPW5ldyBTZXQsbj1bXTtpLm1hcChhPT57aWYoIShwYyhhLm1hcChjPT50W2M+dC5sZW5ndGg/MDpjXSkpPjFlLTEyKSlmb3IobGV0IGM9MDtjPDM7YysrKXtsZXQgbD1bYVtjXSxhWyhjKzEpJTNdXSxoPWAke2xbMF19LSR7bFsxXX1gO2UuaGFzKGgpP2UuZGVsZXRlKGgpOmUuYWRkKGAke2xbMV19LSR7bFswXX1gKX19KTtjb25zdCBzPW5ldyBNYXA7bGV0IHI7aWYoZS5mb3JFYWNoKGE9PnthPWEuc3BsaXQoIi0iKS5tYXAoTnVtYmVyKSxzLnNldChhWzBdLGFbMV0pLHI9YVswXX0pLHI9PT12b2lkIDApcmV0dXJuIG47bGV0IG89cjtkb3tuLnB1c2gobyk7bGV0IGE9cy5nZXQobyk7cy5zZXQobywtMSksbz1hfXdoaWxlKG8+LTEmJm8hPT1yKTtyZXR1cm4gbn1mdW5jdGlvbiBrbShpKXtjb25zdCB0PWZ1bmN0aW9uKGUpe2lmKHQuZGVsYXVuYXk9bnVsbCx0Ll9kYXRhPWUsdHlwZW9mIHQuX2RhdGE9PSJvYmplY3QiJiZ0Ll9kYXRhLnR5cGU9PT0iRmVhdHVyZUNvbGxlY3Rpb24iJiYodC5fZGF0YT10Ll9kYXRhLmZlYXR1cmVzKSx0eXBlb2YgdC5fZGF0YT09Im9iamVjdCIpe2NvbnN0IG49dC5fZGF0YS5tYXAocz0+W3QuX3Z4KHMpLHQuX3Z5KHMpLHNdKS5maWx0ZXIocz0+aXNGaW5pdGUoc1swXStzWzFdKSk7dC5wb2ludHM9bi5tYXAocz0+W3NbMF0sc1sxXV0pLHQudmFsaWQ9bi5tYXAocz0+c1syXSksdC5kZWxhdW5heT12bSh0LnBvaW50cyl9cmV0dXJuIHR9O3JldHVybiB0Ll92eD1mdW5jdGlvbihlKXtpZih0eXBlb2YgZT09Im9iamVjdCImJiJ0eXBlImluIGUpcmV0dXJuIE5oKGUpWzBdO2lmKDAgaW4gZSlyZXR1cm4gZVswXX0sdC5fdnk9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGU9PSJvYmplY3QiJiYidHlwZSJpbiBlKXJldHVybiBOaChlKVsxXTtpZigxIGluIGUpcmV0dXJuIGVbMV19LHQueD1mdW5jdGlvbihlKXtyZXR1cm4gZT8odC5fdng9ZSx0KTp0Ll92eH0sdC55PWZ1bmN0aW9uKGUpe3JldHVybiBlPyh0Ll92eT1lLHQpOnQuX3Z5fSx0LnBvbHlnb25zPWZ1bmN0aW9uKGUpe2lmKGUhPT12b2lkIDAmJnQoZSksIXQuZGVsYXVuYXkpcmV0dXJuITE7Y29uc3Qgbj17dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24iLGZlYXR1cmVzOltdfTtyZXR1cm4gdC52YWxpZC5sZW5ndGg9PT0wfHwodC5kZWxhdW5heS5wb2x5Z29ucy5mb3JFYWNoKChzLHIpPT5uLmZlYXR1cmVzLnB1c2goe3R5cGU6IkZlYXR1cmUiLGdlb21ldHJ5OnM/e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltbLi4ucyxzWzBdXS5tYXAobz0+dC5kZWxhdW5heS5jZW50ZXJzW29dKV19Om51bGwscHJvcGVydGllczp7c2l0ZTp0LnZhbGlkW3JdLHNpdGVjb29yZGluYXRlczp0LnBvaW50c1tyXSxuZWlnaGJvdXJzOnQuZGVsYXVuYXkubmVpZ2hib3JzW3JdfX0pKSx0LnZhbGlkLmxlbmd0aD09PTEmJm4uZmVhdHVyZXMucHVzaCh7dHlwZToiRmVhdHVyZSIsZ2VvbWV0cnk6e3R5cGU6IlNwaGVyZSJ9LHByb3BlcnRpZXM6e3NpdGU6dC52YWxpZFswXSxzaXRlY29vcmRpbmF0ZXM6dC5wb2ludHNbMF0sbmVpZ2hib3VyczpbXX19KSksbn0sdC50cmlhbmdsZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT12b2lkIDAmJnQoZSksdC5kZWxhdW5heT97dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24iLGZlYXR1cmVzOnQuZGVsYXVuYXkudHJpYW5nbGVzLm1hcCgobixzKT0+KG49bi5tYXAocj0+dC5wb2ludHNbcl0pLG4uY2VudGVyPXQuZGVsYXVuYXkuY2VudGVyc1tzXSxuKSkuZmlsdGVyKG49PnBjKG4pPjApLm1hcChuPT4oe3R5cGU6IkZlYXR1cmUiLHByb3BlcnRpZXM6e2NpcmN1bWNlbnRlcjpuLmNlbnRlcn0sZ2VvbWV0cnk6e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltbLi4ubixuWzBdXV19fSkpfTohMX0sdC5saW5rcz1mdW5jdGlvbihlKXtpZihlIT09dm9pZCAwJiZ0KGUpLCF0LmRlbGF1bmF5KXJldHVybiExO2NvbnN0IG49dC5kZWxhdW5heS5lZGdlcy5tYXAocj0+ZGkodC5wb2ludHNbclswXV0sdC5wb2ludHNbclsxXV0pKSxzPXQuZGVsYXVuYXkudXJxdWhhcnQobik7cmV0dXJue3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIixmZWF0dXJlczp0LmRlbGF1bmF5LmVkZ2VzLm1hcCgocixvKT0+KHt0eXBlOiJGZWF0dXJlIixwcm9wZXJ0aWVzOntzb3VyY2U6dC52YWxpZFtyWzBdXSx0YXJnZXQ6dC52YWxpZFtyWzFdXSxsZW5ndGg6bltvXSx1cnF1aGFydDohIXNbb119LGdlb21ldHJ5Ont0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpbdC5wb2ludHNbclswXV0sdC5wb2ludHNbclsxXV1dfX0pKX19LHQubWVzaD1mdW5jdGlvbihlKXtyZXR1cm4gZSE9PXZvaWQgMCYmdChlKSx0LmRlbGF1bmF5P3t0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnQuZGVsYXVuYXkuZWRnZXMubWFwKG49Plt0LnBvaW50c1tuWzBdXSx0LnBvaW50c1tuWzFdXV0pfTohMX0sdC5jZWxsTWVzaD1mdW5jdGlvbihlKXtpZihlIT09dm9pZCAwJiZ0KGUpLCF0LmRlbGF1bmF5KXJldHVybiExO2NvbnN0e2NlbnRlcnM6bixwb2x5Z29uczpzfT10LmRlbGF1bmF5LHI9W107Zm9yKGNvbnN0IG8gb2YgcylpZihvKWZvcihsZXQgYT1vLmxlbmd0aCxjPW9bYS0xXSxsPW9bMF0saD0wO2g8YTtjPWwsbD1vWysraF0pbD5jJiZyLnB1c2goW25bY10sbltsXV0pO3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnJ9fSx0Ll9mb3VuZD12b2lkIDAsdC5maW5kPWZ1bmN0aW9uKGUsbixzKXtpZih0Ll9mb3VuZD10LmRlbGF1bmF5LmZpbmQoZSxuLHQuX2ZvdW5kKSwhc3x8ZGkoW2Usbl0sdC5wb2ludHNbdC5fZm91bmRdKTxzKXJldHVybiB0Ll9mb3VuZH0sdC5odWxsPWZ1bmN0aW9uKGUpe2UhPT12b2lkIDAmJnQoZSk7Y29uc3Qgbj10LmRlbGF1bmF5Lmh1bGwscz10LnBvaW50cztyZXR1cm4gbi5sZW5ndGg9PT0wP251bGw6e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltbLi4ubi5tYXAocj0+c1tyXSksc1tuWzBdXV1dfX0saT90KGkpOnR9ZnVuY3Rpb24gUm0oaSx0KXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAwOmJyZWFrO2Nhc2UgMTp0aGlzLnJhbmdlKGkpO2JyZWFrO2RlZmF1bHQ6dGhpcy5yYW5nZSh0KS5kb21haW4oaSk7YnJlYWt9cmV0dXJuIHRoaXN9ZnVuY3Rpb24geWMoaSx0LGUpe2kucHJvdG90eXBlPXQucHJvdG90eXBlPWUsZS5jb25zdHJ1Y3Rvcj1pfWZ1bmN0aW9uIEN1KGksdCl7dmFyIGU9T2JqZWN0LmNyZWF0ZShpLnByb3RvdHlwZSk7Zm9yKHZhciBuIGluIHQpZVtuXT10W25dO3JldHVybiBlfWZ1bmN0aW9uIHVzKCl7fXZhciBmcz0uNyxKcj0xL2ZzLGJpPSJcXHMqKFsrLV0/XFxkKylcXHMqIixkcz0iXFxzKihbKy1dPyg/OlxcZCpcXC4pP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pXFxzKiIsVGU9IlxccyooWystXT8oPzpcXGQqXFwuKT9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixMbT0vXiMoWzAtOWEtZl17Myw4fSkkLyxPbT1uZXcgUmVnRXhwKGBecmdiXFwoJHtiaX0sJHtiaX0sJHtiaX1cXCkkYCksRG09bmV3IFJlZ0V4cChgXnJnYlxcKCR7VGV9LCR7VGV9LCR7VGV9XFwpJGApLCRtPW5ldyBSZWdFeHAoYF5yZ2JhXFwoJHtiaX0sJHtiaX0sJHtiaX0sJHtkc31cXCkkYCksVm09bmV3IFJlZ0V4cChgXnJnYmFcXCgke1RlfSwke1RlfSwke1RlfSwke2RzfVxcKSRgKSxVbT1uZXcgUmVnRXhwKGBeaHNsXFwoJHtkc30sJHtUZX0sJHtUZX1cXCkkYCkscW09bmV3IFJlZ0V4cChgXmhzbGFcXCgke2RzfSwke1RlfSwke1RlfSwke2RzfVxcKSRgKSxCdT17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTt5Yyh1cyxwcyx7Y29weShpKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3Rvcix0aGlzLGkpfSxkaXNwbGF5YWJsZSgpe3JldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCl9LGhleDpFdSxmb3JtYXRIZXg6RXUsZm9ybWF0SGV4ODpYbSxmb3JtYXRIc2w6Wm0sZm9ybWF0UmdiOkZ1LHRvU3RyaW5nOkZ1fSk7ZnVuY3Rpb24gRXUoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKX1mdW5jdGlvbiBYbSgpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleDgoKX1mdW5jdGlvbiBabSgpe3JldHVybiBMdSh0aGlzKS5mb3JtYXRIc2woKX1mdW5jdGlvbiBGdSgpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdFJnYigpfWZ1bmN0aW9uIHBzKGkpe3ZhciB0LGU7cmV0dXJuIGk9KGkrIiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLCh0PUxtLmV4ZWMoaSkpPyhlPXRbMV0ubGVuZ3RoLHQ9cGFyc2VJbnQodFsxXSwxNiksZT09PTY/SXUodCk6ZT09PTM/bmV3IFd0KHQ+PjgmMTV8dD4+NCYyNDAsdD4+NCYxNXx0JjI0MCwodCYxNSk8PDR8dCYxNSwxKTplPT09OD9Zcih0Pj4yNCYyNTUsdD4+MTYmMjU1LHQ+PjgmMjU1LCh0JjI1NSkvMjU1KTplPT09ND9Zcih0Pj4xMiYxNXx0Pj44JjI0MCx0Pj44JjE1fHQ+PjQmMjQwLHQ+PjQmMTV8dCYyNDAsKCh0JjE1KTw8NHx0JjE1KS8yNTUpOm51bGwpOih0PU9tLmV4ZWMoaSkpP25ldyBXdCh0WzFdLHRbMl0sdFszXSwxKToodD1EbS5leGVjKGkpKT9uZXcgV3QodFsxXSoyNTUvMTAwLHRbMl0qMjU1LzEwMCx0WzNdKjI1NS8xMDAsMSk6KHQ9JG0uZXhlYyhpKSk/WXIodFsxXSx0WzJdLHRbM10sdFs0XSk6KHQ9Vm0uZXhlYyhpKSk/WXIodFsxXSoyNTUvMTAwLHRbMl0qMjU1LzEwMCx0WzNdKjI1NS8xMDAsdFs0XSk6KHQ9VW0uZXhlYyhpKSk/UnUodFsxXSx0WzJdLzEwMCx0WzNdLzEwMCwxKToodD1xbS5leGVjKGkpKT9SdSh0WzFdLHRbMl0vMTAwLHRbM10vMTAwLHRbNF0pOkJ1Lmhhc093blByb3BlcnR5KGkpP0l1KEJ1W2ldKTppPT09InRyYW5zcGFyZW50Ij9uZXcgV3QoTmFOLE5hTixOYU4sMCk6bnVsbH1mdW5jdGlvbiBJdShpKXtyZXR1cm4gbmV3IFd0KGk+PjE2JjI1NSxpPj44JjI1NSxpJjI1NSwxKX1mdW5jdGlvbiBZcihpLHQsZSxuKXtyZXR1cm4gbjw9MCYmKGk9dD1lPU5hTiksbmV3IFd0KGksdCxlLG4pfWZ1bmN0aW9uIFdtKGkpe3JldHVybiBpIGluc3RhbmNlb2YgdXN8fChpPXBzKGkpKSxpPyhpPWkucmdiKCksbmV3IFd0KGkucixpLmcsaS5iLGkub3BhY2l0eSkpOm5ldyBXdH1mdW5jdGlvbiBtYyhpLHQsZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTE/V20oaSk6bmV3IFd0KGksdCxlLG49PW51bGw/MTpuKX1mdW5jdGlvbiBXdChpLHQsZSxuKXt0aGlzLnI9K2ksdGhpcy5nPSt0LHRoaXMuYj0rZSx0aGlzLm9wYWNpdHk9K259eWMoV3QsbWMsQ3UodXMse2JyaWdodGVyKGkpe3JldHVybiBpPWk9PW51bGw/SnI6TWF0aC5wb3coSnIsaSksbmV3IFd0KHRoaXMucippLHRoaXMuZyppLHRoaXMuYippLHRoaXMub3BhY2l0eSl9LGRhcmtlcihpKXtyZXR1cm4gaT1pPT1udWxsP2ZzOk1hdGgucG93KGZzLGkpLG5ldyBXdCh0aGlzLnIqaSx0aGlzLmcqaSx0aGlzLmIqaSx0aGlzLm9wYWNpdHkpfSxyZ2IoKXtyZXR1cm4gdGhpc30sY2xhbXAoKXtyZXR1cm4gbmV3IFd0KGtuKHRoaXMuciksa24odGhpcy5nKSxrbih0aGlzLmIpLGpyKHRoaXMub3BhY2l0eSkpfSxkaXNwbGF5YWJsZSgpe3JldHVybi0uNTw9dGhpcy5yJiZ0aGlzLnI8MjU1LjUmJi0uNTw9dGhpcy5nJiZ0aGlzLmc8MjU1LjUmJi0uNTw9dGhpcy5iJiZ0aGlzLmI8MjU1LjUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxoZXg6TnUsZm9ybWF0SGV4Ok51LGZvcm1hdEhleDg6R20sZm9ybWF0UmdiOmt1LHRvU3RyaW5nOmt1fSkpO2Z1bmN0aW9uIE51KCl7cmV0dXJuYCMke1JuKHRoaXMucil9JHtSbih0aGlzLmcpfSR7Um4odGhpcy5iKX1gfWZ1bmN0aW9uIEdtKCl7cmV0dXJuYCMke1JuKHRoaXMucil9JHtSbih0aGlzLmcpfSR7Um4odGhpcy5iKX0ke1JuKChpc05hTih0aGlzLm9wYWNpdHkpPzE6dGhpcy5vcGFjaXR5KSoyNTUpfWB9ZnVuY3Rpb24ga3UoKXtjb25zdCBpPWpyKHRoaXMub3BhY2l0eSk7cmV0dXJuYCR7aT09PTE/InJnYigiOiJyZ2JhKCJ9JHtrbih0aGlzLnIpfSwgJHtrbih0aGlzLmcpfSwgJHtrbih0aGlzLmIpfSR7aT09PTE/IikiOmAsICR7aX0pYH1gfWZ1bmN0aW9uIGpyKGkpe3JldHVybiBpc05hTihpKT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSxpKSl9ZnVuY3Rpb24ga24oaSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQoaSl8fDApKX1mdW5jdGlvbiBSbihpKXtyZXR1cm4gaT1rbihpKSwoaTwxNj8iMCI6IiIpK2kudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIFJ1KGksdCxlLG4pe3JldHVybiBuPD0wP2k9dD1lPU5hTjplPD0wfHxlPj0xP2k9dD1OYU46dDw9MCYmKGk9TmFOKSxuZXcgYmUoaSx0LGUsbil9ZnVuY3Rpb24gTHUoaSl7aWYoaSBpbnN0YW5jZW9mIGJlKXJldHVybiBuZXcgYmUoaS5oLGkucyxpLmwsaS5vcGFjaXR5KTtpZihpIGluc3RhbmNlb2YgdXN8fChpPXBzKGkpKSwhaSlyZXR1cm4gbmV3IGJlO2lmKGkgaW5zdGFuY2VvZiBiZSlyZXR1cm4gaTtpPWkucmdiKCk7dmFyIHQ9aS5yLzI1NSxlPWkuZy8yNTUsbj1pLmIvMjU1LHM9TWF0aC5taW4odCxlLG4pLHI9TWF0aC5tYXgodCxlLG4pLG89TmFOLGE9ci1zLGM9KHIrcykvMjtyZXR1cm4gYT8odD09PXI/bz0oZS1uKS9hKyhlPG4pKjY6ZT09PXI/bz0obi10KS9hKzI6bz0odC1lKS9hKzQsYS89YzwuNT9yK3M6Mi1yLXMsbyo9NjApOmE9Yz4wJiZjPDE/MDpvLG5ldyBiZShvLGEsYyxpLm9wYWNpdHkpfWZ1bmN0aW9uIEhtKGksdCxlLG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MT9MdShpKTpuZXcgYmUoaSx0LGUsbj09bnVsbD8xOm4pfWZ1bmN0aW9uIGJlKGksdCxlLG4pe3RoaXMuaD0raSx0aGlzLnM9K3QsdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rbn15YyhiZSxIbSxDdSh1cyx7YnJpZ2h0ZXIoaSl7cmV0dXJuIGk9aT09bnVsbD9KcjpNYXRoLnBvdyhKcixpKSxuZXcgYmUodGhpcy5oLHRoaXMucyx0aGlzLmwqaSx0aGlzLm9wYWNpdHkpfSxkYXJrZXIoaSl7cmV0dXJuIGk9aT09bnVsbD9mczpNYXRoLnBvdyhmcyxpKSxuZXcgYmUodGhpcy5oLHRoaXMucyx0aGlzLmwqaSx0aGlzLm9wYWNpdHkpfSxyZ2IoKXt2YXIgaT10aGlzLmglMzYwKyh0aGlzLmg8MCkqMzYwLHQ9aXNOYU4oaSl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsZT10aGlzLmwsbj1lKyhlPC41P2U6MS1lKSp0LHM9MiplLW47cmV0dXJuIG5ldyBXdChnYyhpPj0yNDA/aS0yNDA6aSsxMjAscyxuKSxnYyhpLHMsbiksZ2MoaTwxMjA/aSsyNDA6aS0xMjAscyxuKSx0aGlzLm9wYWNpdHkpfSxjbGFtcCgpe3JldHVybiBuZXcgYmUoT3UodGhpcy5oKSxRcih0aGlzLnMpLFFyKHRoaXMubCksanIodGhpcy5vcGFjaXR5KSl9LGRpc3BsYXlhYmxlKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxmb3JtYXRIc2woKXtjb25zdCBpPWpyKHRoaXMub3BhY2l0eSk7cmV0dXJuYCR7aT09PTE/ImhzbCgiOiJoc2xhKCJ9JHtPdSh0aGlzLmgpfSwgJHtRcih0aGlzLnMpKjEwMH0lLCAke1FyKHRoaXMubCkqMTAwfSUke2k9PT0xPyIpIjpgLCAke2l9KWB9YH19KSk7ZnVuY3Rpb24gT3UoaSl7cmV0dXJuIGk9KGl8fDApJTM2MCxpPDA/aSszNjA6aX1mdW5jdGlvbiBRcihpKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbigxLGl8fDApKX1mdW5jdGlvbiBnYyhpLHQsZSl7cmV0dXJuKGk8NjA/dCsoZS10KSppLzYwOmk8MTgwP2U6aTwyNDA/dCsoZS10KSooMjQwLWkpLzYwOnQpKjI1NX12YXIgeGM9aT0+KCk9Pmk7ZnVuY3Rpb24gSm0oaSx0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGkrZSp0fX1mdW5jdGlvbiBZbShpLHQsZSl7cmV0dXJuIGk9TWF0aC5wb3coaSxlKSx0PU1hdGgucG93KHQsZSktaSxlPTEvZSxmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5wb3coaStuKnQsZSl9fWZ1bmN0aW9uIGptKGkpe3JldHVybihpPStpKT09MT9EdTpmdW5jdGlvbih0LGUpe3JldHVybiBlLXQ/WW0odCxlLGkpOnhjKGlzTmFOKHQpP2U6dCl9fWZ1bmN0aW9uIER1KGksdCl7dmFyIGU9dC1pO3JldHVybiBlP0ptKGksZSk6eGMoaXNOYU4oaSk/dDppKX12YXIgJHU9ZnVuY3Rpb24gaSh0KXt2YXIgZT1qbSh0KTtmdW5jdGlvbiBuKHMscil7dmFyIG89ZSgocz1tYyhzKSkuciwocj1tYyhyKSkuciksYT1lKHMuZyxyLmcpLGM9ZShzLmIsci5iKSxsPUR1KHMub3BhY2l0eSxyLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbihoKXtyZXR1cm4gcy5yPW8oaCkscy5nPWEoaCkscy5iPWMoaCkscy5vcGFjaXR5PWwoaCkscysiIn19cmV0dXJuIG4uZ2FtbWE9aSxufSgxKTtmdW5jdGlvbiBRbShpLHQpe3R8fCh0PVtdKTt2YXIgZT1pP01hdGgubWluKHQubGVuZ3RoLGkubGVuZ3RoKTowLG49dC5zbGljZSgpLHM7cmV0dXJuIGZ1bmN0aW9uKHIpe2ZvcihzPTA7czxlOysrcyluW3NdPWlbc10qKDEtcikrdFtzXSpyO3JldHVybiBufX1mdW5jdGlvbiBLbShpKXtyZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KGkpJiYhKGkgaW5zdGFuY2VvZiBEYXRhVmlldyl9ZnVuY3Rpb24gdGcoaSx0KXt2YXIgZT10P3QubGVuZ3RoOjAsbj1pP01hdGgubWluKGUsaS5sZW5ndGgpOjAscz1uZXcgQXJyYXkobikscj1uZXcgQXJyYXkoZSksbztmb3Iobz0wO288bjsrK28pc1tvXT1NYyhpW29dLHRbb10pO2Zvcig7bzxlOysrbylyW29dPXRbb107cmV0dXJuIGZ1bmN0aW9uKGEpe2ZvcihvPTA7bzxuOysrbylyW29dPXNbb10oYSk7cmV0dXJuIHJ9fWZ1bmN0aW9uIGVnKGksdCl7dmFyIGU9bmV3IERhdGU7cmV0dXJuIGk9K2ksdD0rdCxmdW5jdGlvbihuKXtyZXR1cm4gZS5zZXRUaW1lKGkqKDEtbikrdCpuKSxlfX1mdW5jdGlvbiBLcihpLHQpe3JldHVybiBpPStpLHQ9K3QsZnVuY3Rpb24oZSl7cmV0dXJuIGkqKDEtZSkrdCplfX1mdW5jdGlvbiBuZyhpLHQpe3ZhciBlPXt9LG49e30sczsoaT09PW51bGx8fHR5cGVvZiBpIT0ib2JqZWN0IikmJihpPXt9KSwodD09PW51bGx8fHR5cGVvZiB0IT0ib2JqZWN0IikmJih0PXt9KTtmb3IocyBpbiB0KXMgaW4gaT9lW3NdPU1jKGlbc10sdFtzXSk6bltzXT10W3NdO3JldHVybiBmdW5jdGlvbihyKXtmb3IocyBpbiBlKW5bc109ZVtzXShyKTtyZXR1cm4gbn19dmFyIHdjPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxiYz1uZXcgUmVnRXhwKHdjLnNvdXJjZSwiZyIpO2Z1bmN0aW9uIGlnKGkpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBpfX1mdW5jdGlvbiBzZyhpKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGkodCkrIiJ9fWZ1bmN0aW9uIHJnKGksdCl7dmFyIGU9d2MubGFzdEluZGV4PWJjLmxhc3RJbmRleD0wLG4scyxyLG89LTEsYT1bXSxjPVtdO2ZvcihpPWkrIiIsdD10KyIiOyhuPXdjLmV4ZWMoaSkpJiYocz1iYy5leGVjKHQpKTspKHI9cy5pbmRleCk+ZSYmKHI9dC5zbGljZShlLHIpLGFbb10/YVtvXSs9cjphWysrb109ciksKG49blswXSk9PT0ocz1zWzBdKT9hW29dP2Fbb10rPXM6YVsrK29dPXM6KGFbKytvXT1udWxsLGMucHVzaCh7aTpvLHg6S3IobixzKX0pKSxlPWJjLmxhc3RJbmRleDtyZXR1cm4gZTx0Lmxlbmd0aCYmKHI9dC5zbGljZShlKSxhW29dP2Fbb10rPXI6YVsrK29dPXIpLGEubGVuZ3RoPDI/Y1swXT9zZyhjWzBdLngpOmlnKHQpOih0PWMubGVuZ3RoLGZ1bmN0aW9uKGwpe2Zvcih2YXIgaD0wLHU7aDx0OysraClhWyh1PWNbaF0pLmldPXUueChsKTtyZXR1cm4gYS5qb2luKCIiKX0pfWZ1bmN0aW9uIE1jKGksdCl7dmFyIGU9dHlwZW9mIHQsbjtyZXR1cm4gdD09bnVsbHx8ZT09PSJib29sZWFuIj94Yyh0KTooZT09PSJudW1iZXIiP0tyOmU9PT0ic3RyaW5nIj8obj1wcyh0KSk/KHQ9biwkdSk6cmc6dCBpbnN0YW5jZW9mIHBzPyR1OnQgaW5zdGFuY2VvZiBEYXRlP2VnOkttKHQpP1FtOkFycmF5LmlzQXJyYXkodCk/dGc6dHlwZW9mIHQudmFsdWVPZiE9ImZ1bmN0aW9uIiYmdHlwZW9mIHQudG9TdHJpbmchPSJmdW5jdGlvbiJ8fGlzTmFOKHQpP25nOktyKShpLHQpfWZ1bmN0aW9uIG9nKGksdCl7cmV0dXJuIGk9K2ksdD0rdCxmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5yb3VuZChpKigxLWUpK3QqZSl9fWZ1bmN0aW9uIGFnKGkpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBpfX1mdW5jdGlvbiBjZyhpKXtyZXR1cm4raX12YXIgVnU9WzAsMV07ZnVuY3Rpb24gTWkoaSl7cmV0dXJuIGl9ZnVuY3Rpb24gQWMoaSx0KXtyZXR1cm4odC09aT0raSk/ZnVuY3Rpb24oZSl7cmV0dXJuKGUtaSkvdH06YWcoaXNOYU4odCk/TmFOOi41KX1mdW5jdGlvbiBsZyhpLHQpe3ZhciBlO3JldHVybiBpPnQmJihlPWksaT10LHQ9ZSksZnVuY3Rpb24obil7cmV0dXJuIE1hdGgubWF4KGksTWF0aC5taW4odCxuKSl9fWZ1bmN0aW9uIGhnKGksdCxlKXt2YXIgbj1pWzBdLHM9aVsxXSxyPXRbMF0sbz10WzFdO3JldHVybiBzPG4/KG49QWMocyxuKSxyPWUobyxyKSk6KG49QWMobixzKSxyPWUocixvKSksZnVuY3Rpb24oYSl7cmV0dXJuIHIobihhKSl9fWZ1bmN0aW9uIHVnKGksdCxlKXt2YXIgbj1NYXRoLm1pbihpLmxlbmd0aCx0Lmxlbmd0aCktMSxzPW5ldyBBcnJheShuKSxyPW5ldyBBcnJheShuKSxvPS0xO2ZvcihpW25dPGlbMF0mJihpPWkuc2xpY2UoKS5yZXZlcnNlKCksdD10LnNsaWNlKCkucmV2ZXJzZSgpKTsrK288bjspc1tvXT1BYyhpW29dLGlbbysxXSkscltvXT1lKHRbb10sdFtvKzFdKTtyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIGM9ZHAoaSxhLDEsbiktMTtyZXR1cm4gcltjXShzW2NdKGEpKX19ZnVuY3Rpb24gZmcoaSx0KXtyZXR1cm4gdC5kb21haW4oaS5kb21haW4oKSkucmFuZ2UoaS5yYW5nZSgpKS5pbnRlcnBvbGF0ZShpLmludGVycG9sYXRlKCkpLmNsYW1wKGkuY2xhbXAoKSkudW5rbm93bihpLnVua25vd24oKSl9ZnVuY3Rpb24gZGcoKXt2YXIgaT1WdSx0PVZ1LGU9TWMsbixzLHIsbz1NaSxhLGMsbDtmdW5jdGlvbiBoKCl7dmFyIGY9TWF0aC5taW4oaS5sZW5ndGgsdC5sZW5ndGgpO3JldHVybiBvIT09TWkmJihvPWxnKGlbMF0saVtmLTFdKSksYT1mPjI/dWc6aGcsYz1sPW51bGwsdX1mdW5jdGlvbiB1KGYpe3JldHVybiBmPT1udWxsfHxpc05hTihmPStmKT9yOihjfHwoYz1hKGkubWFwKG4pLHQsZSkpKShuKG8oZikpKX1yZXR1cm4gdS5pbnZlcnQ9ZnVuY3Rpb24oZil7cmV0dXJuIG8ocygobHx8KGw9YSh0LGkubWFwKG4pLEtyKSkpKGYpKSl9LHUuZG9tYWluPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPUFycmF5LmZyb20oZixjZyksaCgpKTppLnNsaWNlKCl9LHUucmFuZ2U9ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9QXJyYXkuZnJvbShmKSxoKCkpOnQuc2xpY2UoKX0sdS5yYW5nZVJvdW5kPWZ1bmN0aW9uKGYpe3JldHVybiB0PUFycmF5LmZyb20oZiksZT1vZyxoKCl9LHUuY2xhbXA9ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89Zj8hMDpNaSxoKCkpOm8hPT1NaX0sdS5pbnRlcnBvbGF0ZT1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1mLGgoKSk6ZX0sdS51bmtub3duPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWYsdSk6cn0sZnVuY3Rpb24oZixkKXtyZXR1cm4gbj1mLHM9ZCxoKCl9fWZ1bmN0aW9uIHBnKCl7cmV0dXJuIGRnKCkoTWksTWkpfWZ1bmN0aW9uIHlnKGkpe3JldHVybiBNYXRoLmFicyhpPU1hdGgucm91bmQoaSkpPj0xZTIxP2kudG9Mb2NhbGVTdHJpbmcoImVuIikucmVwbGFjZSgvLC9nLCIiKTppLnRvU3RyaW5nKDEwKX1mdW5jdGlvbiB0byhpLHQpe2lmKChlPShpPXQ/aS50b0V4cG9uZW50aWFsKHQtMSk6aS50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoImUiKSk8MClyZXR1cm4gbnVsbDt2YXIgZSxuPWkuc2xpY2UoMCxlKTtyZXR1cm5bbi5sZW5ndGg+MT9uWzBdK24uc2xpY2UoMik6biwraS5zbGljZShlKzEpXX1mdW5jdGlvbiBBaShpKXtyZXR1cm4gaT10byhNYXRoLmFicyhpKSksaT9pWzFdOk5hTn1mdW5jdGlvbiBtZyhpLHQpe3JldHVybiBmdW5jdGlvbihlLG4pe2Zvcih2YXIgcz1lLmxlbmd0aCxyPVtdLG89MCxhPWlbMF0sYz0wO3M+MCYmYT4wJiYoYythKzE+biYmKGE9TWF0aC5tYXgoMSxuLWMpKSxyLnB1c2goZS5zdWJzdHJpbmcocy09YSxzK2EpKSwhKChjKz1hKzEpPm4pKTspYT1pW289KG8rMSklaS5sZW5ndGhdO3JldHVybiByLnJldmVyc2UoKS5qb2luKHQpfX1mdW5jdGlvbiBnZyhpKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZSgvWzAtOV0vZyxmdW5jdGlvbihlKXtyZXR1cm4gaVsrZV19KX19dmFyIHhnPS9eKD86KC4pPyhbPD49Xl0pKT8oWytcLSggXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuXGQrKT8ofik/KFthLXolXSk/JC9pO2Z1bmN0aW9uIGVvKGkpe2lmKCEodD14Zy5leGVjKGkpKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9ybWF0OiAiK2kpO3ZhciB0O3JldHVybiBuZXcgU2Moe2ZpbGw6dFsxXSxhbGlnbjp0WzJdLHNpZ246dFszXSxzeW1ib2w6dFs0XSx6ZXJvOnRbNV0sd2lkdGg6dFs2XSxjb21tYTp0WzddLHByZWNpc2lvbjp0WzhdJiZ0WzhdLnNsaWNlKDEpLHRyaW06dFs5XSx0eXBlOnRbMTBdfSl9ZW8ucHJvdG90eXBlPVNjLnByb3RvdHlwZTtmdW5jdGlvbiBTYyhpKXt0aGlzLmZpbGw9aS5maWxsPT09dm9pZCAwPyIgIjppLmZpbGwrIiIsdGhpcy5hbGlnbj1pLmFsaWduPT09dm9pZCAwPyI+IjppLmFsaWduKyIiLHRoaXMuc2lnbj1pLnNpZ249PT12b2lkIDA/Ii0iOmkuc2lnbisiIix0aGlzLnN5bWJvbD1pLnN5bWJvbD09PXZvaWQgMD8iIjppLnN5bWJvbCsiIix0aGlzLnplcm89ISFpLnplcm8sdGhpcy53aWR0aD1pLndpZHRoPT09dm9pZCAwP3ZvaWQgMDoraS53aWR0aCx0aGlzLmNvbW1hPSEhaS5jb21tYSx0aGlzLnByZWNpc2lvbj1pLnByZWNpc2lvbj09PXZvaWQgMD92b2lkIDA6K2kucHJlY2lzaW9uLHRoaXMudHJpbT0hIWkudHJpbSx0aGlzLnR5cGU9aS50eXBlPT09dm9pZCAwPyIiOmkudHlwZSsiIn1TYy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxsK3RoaXMuYWxpZ24rdGhpcy5zaWduK3RoaXMuc3ltYm9sKyh0aGlzLnplcm8/IjAiOiIiKSsodGhpcy53aWR0aD09PXZvaWQgMD8iIjpNYXRoLm1heCgxLHRoaXMud2lkdGh8MCkpKyh0aGlzLmNvbW1hPyIsIjoiIikrKHRoaXMucHJlY2lzaW9uPT09dm9pZCAwPyIiOiIuIitNYXRoLm1heCgwLHRoaXMucHJlY2lzaW9ufDApKSsodGhpcy50cmltPyJ+IjoiIikrdGhpcy50eXBlfTtmdW5jdGlvbiB3ZyhpKXt0OmZvcih2YXIgdD1pLmxlbmd0aCxlPTEsbj0tMSxzO2U8dDsrK2Upc3dpdGNoKGlbZV0pe2Nhc2UiLiI6bj1zPWU7YnJlYWs7Y2FzZSIwIjpuPT09MCYmKG49ZSkscz1lO2JyZWFrO2RlZmF1bHQ6aWYoIStpW2VdKWJyZWFrIHQ7bj4wJiYobj0wKTticmVha31yZXR1cm4gbj4wP2kuc2xpY2UoMCxuKStpLnNsaWNlKHMrMSk6aX12YXIgVXU7ZnVuY3Rpb24gYmcoaSx0KXt2YXIgZT10byhpLHQpO2lmKCFlKXJldHVybiBpKyIiO3ZhciBuPWVbMF0scz1lWzFdLHI9cy0oVXU9TWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKHMvMykpKSozKSsxLG89bi5sZW5ndGg7cmV0dXJuIHI9PT1vP246cj5vP24rbmV3IEFycmF5KHItbysxKS5qb2luKCIwIik6cj4wP24uc2xpY2UoMCxyKSsiLiIrbi5zbGljZShyKToiMC4iK25ldyBBcnJheSgxLXIpLmpvaW4oIjAiKSt0byhpLE1hdGgubWF4KDAsdCtyLTEpKVswXX1mdW5jdGlvbiBxdShpLHQpe3ZhciBlPXRvKGksdCk7aWYoIWUpcmV0dXJuIGkrIiI7dmFyIG49ZVswXSxzPWVbMV07cmV0dXJuIHM8MD8iMC4iK25ldyBBcnJheSgtcykuam9pbigiMCIpK246bi5sZW5ndGg+cysxP24uc2xpY2UoMCxzKzEpKyIuIituLnNsaWNlKHMrMSk6bituZXcgQXJyYXkocy1uLmxlbmd0aCsyKS5qb2luKCIwIil9dmFyIFh1PXsiJSI6KGksdCk9PihpKjEwMCkudG9GaXhlZCh0KSxiOmk9Pk1hdGgucm91bmQoaSkudG9TdHJpbmcoMiksYzppPT5pKyIiLGQ6eWcsZTooaSx0KT0+aS50b0V4cG9uZW50aWFsKHQpLGY6KGksdCk9PmkudG9GaXhlZCh0KSxnOihpLHQpPT5pLnRvUHJlY2lzaW9uKHQpLG86aT0+TWF0aC5yb3VuZChpKS50b1N0cmluZyg4KSxwOihpLHQpPT5xdShpKjEwMCx0KSxyOnF1LHM6YmcsWDppPT5NYXRoLnJvdW5kKGkpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLHg6aT0+TWF0aC5yb3VuZChpKS50b1N0cmluZygxNil9O2Z1bmN0aW9uIFp1KGkpe3JldHVybiBpfXZhciBXdT1BcnJheS5wcm90b3R5cGUubWFwLEd1PVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTtmdW5jdGlvbiBNZyhpKXt2YXIgdD1pLmdyb3VwaW5nPT09dm9pZCAwfHxpLnRob3VzYW5kcz09PXZvaWQgMD9adTptZyhXdS5jYWxsKGkuZ3JvdXBpbmcsTnVtYmVyKSxpLnRob3VzYW5kcysiIiksZT1pLmN1cnJlbmN5PT09dm9pZCAwPyIiOmkuY3VycmVuY3lbMF0rIiIsbj1pLmN1cnJlbmN5PT09dm9pZCAwPyIiOmkuY3VycmVuY3lbMV0rIiIscz1pLmRlY2ltYWw9PT12b2lkIDA/Ii4iOmkuZGVjaW1hbCsiIixyPWkubnVtZXJhbHM9PT12b2lkIDA/WnU6Z2coV3UuY2FsbChpLm51bWVyYWxzLFN0cmluZykpLG89aS5wZXJjZW50PT09dm9pZCAwPyIlIjppLnBlcmNlbnQrIiIsYT1pLm1pbnVzPT09dm9pZCAwPyLiiJIiOmkubWludXMrIiIsYz1pLm5hbj09PXZvaWQgMD8iTmFOIjppLm5hbisiIjtmdW5jdGlvbiBsKHUpe3U9ZW8odSk7dmFyIGY9dS5maWxsLGQ9dS5hbGlnbixwPXUuc2lnbix5PXUuc3ltYm9sLGc9dS56ZXJvLHc9dS53aWR0aCxiPXUuY29tbWEseD11LnByZWNpc2lvbixtPXUudHJpbSxNPXUudHlwZTtNPT09Im4iPyhiPSEwLE09ImciKTpYdVtNXXx8KHg9PT12b2lkIDAmJih4PTEyKSxtPSEwLE09ImciKSwoZ3x8Zj09PSIwIiYmZD09PSI9IikmJihnPSEwLGY9IjAiLGQ9Ij0iKTt2YXIgUz15PT09IiQiP2U6eT09PSIjIiYmL1tib3hYXS8udGVzdChNKT8iMCIrTS50b0xvd2VyQ2FzZSgpOiIiLEE9eT09PSIkIj9uOi9bJXBdLy50ZXN0KE0pP286IiIsdj1YdVtNXSxfPS9bZGVmZ3BycyVdLy50ZXN0KE0pO3g9eD09PXZvaWQgMD82Oi9bZ3Byc10vLnRlc3QoTSk/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSx4KSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCx4KSk7ZnVuY3Rpb24gVCh6KXt2YXIgQz1TLEI9QSxGLEUsSTtpZihNPT09ImMiKUI9dih6KStCLHo9IiI7ZWxzZXt6PSt6O3ZhciBSPXo8MHx8MS96PDA7aWYoej1pc05hTih6KT9jOnYoTWF0aC5hYnMoeikseCksbSYmKHo9d2coeikpLFImJit6PT0wJiZwIT09IisiJiYoUj0hMSksQz0oUj9wPT09IigiP3A6YTpwPT09Ii0ifHxwPT09IigiPyIiOnApK0MsQj0oTT09PSJzIj9HdVs4K1V1LzNdOiIiKStCKyhSJiZwPT09IigiPyIpIjoiIiksXyl7Zm9yKEY9LTEsRT16Lmxlbmd0aDsrK0Y8RTspaWYoST16LmNoYXJDb2RlQXQoRiksNDg+SXx8ST41Nyl7Qj0oST09PTQ2P3Mrei5zbGljZShGKzEpOnouc2xpY2UoRikpK0Isej16LnNsaWNlKDAsRik7YnJlYWt9fX1iJiYhZyYmKHo9dCh6LDEvMCkpO3ZhciBWPUMubGVuZ3RoK3oubGVuZ3RoK0IubGVuZ3RoLFU9Vjx3P25ldyBBcnJheSh3LVYrMSkuam9pbihmKToiIjtzd2l0Y2goYiYmZyYmKHo9dChVK3osVS5sZW5ndGg/dy1CLmxlbmd0aDoxLzApLFU9IiIpLGQpe2Nhc2UiPCI6ej1DK3orQitVO2JyZWFrO2Nhc2UiPSI6ej1DK1UreitCO2JyZWFrO2Nhc2UiXiI6ej1VLnNsaWNlKDAsVj1VLmxlbmd0aD4+MSkrQyt6K0IrVS5zbGljZShWKTticmVhaztkZWZhdWx0Ono9VStDK3orQjticmVha31yZXR1cm4gcih6KX1yZXR1cm4gVC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB1KyIifSxUfWZ1bmN0aW9uIGgodSxmKXt2YXIgZD1sKCh1PWVvKHUpLHUudHlwZT0iZiIsdSkpLHA9TWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKEFpKGYpLzMpKSkqMyx5PU1hdGgucG93KDEwLC1wKSxnPUd1WzgrcC8zXTtyZXR1cm4gZnVuY3Rpb24odyl7cmV0dXJuIGQoeSp3KStnfX1yZXR1cm57Zm9ybWF0OmwsZm9ybWF0UHJlZml4Omh9fXZhciBubyxIdSxKdTtBZyh7dGhvdXNhbmRzOiIsIixncm91cGluZzpbM10sY3VycmVuY3k6WyIkIiwiIl19KTtmdW5jdGlvbiBBZyhpKXtyZXR1cm4gbm89TWcoaSksSHU9bm8uZm9ybWF0LEp1PW5vLmZvcm1hdFByZWZpeCxub31mdW5jdGlvbiBTZyhpKXtyZXR1cm4gTWF0aC5tYXgoMCwtQWkoTWF0aC5hYnMoaSkpKX1mdW5jdGlvbiB2ZyhpLHQpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihBaSh0KS8zKSkpKjMtQWkoTWF0aC5hYnMoaSkpKX1mdW5jdGlvbiBfZyhpLHQpe3JldHVybiBpPU1hdGguYWJzKGkpLHQ9TWF0aC5hYnModCktaSxNYXRoLm1heCgwLEFpKHQpLUFpKGkpKSsxfWZ1bmN0aW9uIHpnKGksdCxlLG4pe3ZhciBzPXhwKGksdCxlKSxyO3N3aXRjaChuPWVvKG49PW51bGw/IixmIjpuKSxuLnR5cGUpe2Nhc2UicyI6e3ZhciBvPU1hdGgubWF4KE1hdGguYWJzKGkpLE1hdGguYWJzKHQpKTtyZXR1cm4gbi5wcmVjaXNpb249PW51bGwmJiFpc05hTihyPXZnKHMsbykpJiYobi5wcmVjaXNpb249ciksSnUobixvKX1jYXNlIiI6Y2FzZSJlIjpjYXNlImciOmNhc2UicCI6Y2FzZSJyIjp7bi5wcmVjaXNpb249PW51bGwmJiFpc05hTihyPV9nKHMsTWF0aC5tYXgoTWF0aC5hYnMoaSksTWF0aC5hYnModCkpKSkmJihuLnByZWNpc2lvbj1yLShuLnR5cGU9PT0iZSIpKTticmVha31jYXNlImYiOmNhc2UiJSI6e24ucHJlY2lzaW9uPT1udWxsJiYhaXNOYU4ocj1TZyhzKSkmJihuLnByZWNpc2lvbj1yLShuLnR5cGU9PT0iJSIpKjIpO2JyZWFrfX1yZXR1cm4gSHUobil9ZnVuY3Rpb24gVGcoaSl7dmFyIHQ9aS5kb21haW47cmV0dXJuIGkudGlja3M9ZnVuY3Rpb24oZSl7dmFyIG49dCgpO3JldHVybiBncChuWzBdLG5bbi5sZW5ndGgtMV0sZT09bnVsbD8xMDplKX0saS50aWNrRm9ybWF0PWZ1bmN0aW9uKGUsbil7dmFyIHM9dCgpO3JldHVybiB6ZyhzWzBdLHNbcy5sZW5ndGgtMV0sZT09bnVsbD8xMDplLG4pfSxpLm5pY2U9ZnVuY3Rpb24oZSl7ZT09bnVsbCYmKGU9MTApO3ZhciBuPXQoKSxzPTAscj1uLmxlbmd0aC0xLG89bltzXSxhPW5bcl0sYyxsLGg9MTA7Zm9yKGE8byYmKGw9byxvPWEsYT1sLGw9cyxzPXIscj1sKTtoLS0gPjA7KXtpZihsPUZhKG8sYSxlKSxsPT09YylyZXR1cm4gbltzXT1vLG5bcl09YSx0KG4pO2lmKGw+MClvPU1hdGguZmxvb3Ioby9sKSpsLGE9TWF0aC5jZWlsKGEvbCkqbDtlbHNlIGlmKGw8MClvPU1hdGguY2VpbChvKmwpL2wsYT1NYXRoLmZsb29yKGEqbCkvbDtlbHNlIGJyZWFrO2M9bH1yZXR1cm4gaX0saX1mdW5jdGlvbiB2Yygpe3ZhciBpPXBnKCk7cmV0dXJuIGkuY29weT1mdW5jdGlvbigpe3JldHVybiBmZyhpLHZjKCkpfSxSbS5hcHBseShpLGFyZ3VtZW50cyksVGcoaSl9ZnVuY3Rpb24gUGcoaSx0KXtyZXR1cm4gaS5tYXAoZT0+e2NvbnN0IG49W107bGV0IHM7cmV0dXJuIGUuZm9yRWFjaChyPT57aWYocyl7Y29uc3Qgbz1kaShyLHMpKjE4MC9NYXRoLlBJO2lmKG8+dCl7Y29uc3QgYT10eShzLHIpLGM9MS9NYXRoLmNlaWwoby90KTtsZXQgbD1jO2Zvcig7bDwxOyluLnB1c2goYShsKSksbCs9Y319bi5wdXNoKHM9cil9KSxufSl9ZnVuY3Rpb24gQ2coaSx7bWluTG5nOnQsbWF4TG5nOmUsbWluTGF0Om4sbWF4TGF0OnN9PXt9KXtjb25zdCByPU1hdGgucm91bmQodmkoMzYwL2ksMikvTWF0aC5QSSksbz0oMStNYXRoLnNxcnQoNSkpLzIsYT1kPT5kL28qMzYwJTM2MC0xODAsYz1kPT5NYXRoLmFjb3MoMipkL3ItMSkvTWF0aC5QSSoxODAtOTAsbD1kPT5yKihNYXRoLmNvcygoZCs5MCkqTWF0aC5QSS8xODApKzEpLzIsaD1bcyE9PXZvaWQgMD9NYXRoLmNlaWwobChzKSk6MCxuIT09dm9pZCAwP01hdGguZmxvb3IobChuKSk6ci0xXSx1PXQ9PT12b2lkIDAmJmU9PT12b2lkIDA/KCk9PiEwOnQ9PT12b2lkIDA/ZD0+ZDw9ZTplPT09dm9pZCAwP2Q9PmQ+PXQ6ZT49dD9kPT5kPj10JiZkPD1lOmQ9PmQ+PXR8fGQ8PWUsZj1bXTtmb3IobGV0IGQ9aFswXTtkPD1oWzFdO2QrKyl7Y29uc3QgcD1hKGQpO3UocCkmJmYucHVzaChbcCxjKGQpXSl9cmV0dXJuIGZ9ZnVuY3Rpb24gX2MoaSx0LGU9ITEpe3JldHVybiBlP0twKHQsaSk6aG0oaSx0KX1mdW5jdGlvbiBCZyhpLHQpe2NvbnN0IGU9e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOml9LFtbbixzXSxbcixvXV09UGgoZSk7aWYoTWF0aC5taW4oTWF0aC5hYnMoci1uKSxNYXRoLmFicyhvLXMpKTx0KXJldHVybltdO2NvbnN0IGE9bj5yfHxvPj04OXx8czw9LTg5O3JldHVybiBDZyh0LHttaW5Mbmc6bixtYXhMbmc6cixtaW5MYXQ6cyxtYXhMYXQ6b30pLmZpbHRlcihjPT5fYyhjLGUsYSkpfWZ1bmN0aW9uIEVnKGkse3Jlc29sdXRpb246dD0xLzAsYmJveDplLHByb2plY3Rpb246bn09e30pe2NvbnN0IHM9UGcoaSx0KSxyPUhpKHMpLG89QmcoaSx0KSxhPVsuLi5yLC4uLm9dLGM9e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOml9LFtbbCxoXSxbdSxmXV09UGgoYyksZD1sPnV8fGY+PTg5fHxoPD0tODk7bGV0IHA9W107aWYoZCl7Y29uc3QgTT1rbShhKS50cmlhbmdsZXMoKSxTPW5ldyBNYXAoYS5tYXAoKFtBLHZdLF8pPT5bYCR7QX0tJHt2fWAsX10pKTtNLmZlYXR1cmVzLmZvckVhY2goQT0+e2NvbnN0IHY9QS5nZW9tZXRyeS5jb29yZGluYXRlc1swXS5zbGljZSgwLDMpLnJldmVyc2UoKSxfPVtdO2lmKHYuZm9yRWFjaCgoW1Qsel0pPT57Y29uc3QgQz1gJHtUfS0ke3p9YDtTLmhhcyhDKSYmXy5wdXNoKFMuZ2V0KEMpKX0pLF8ubGVuZ3RoPT09Myl7aWYoXy5zb21lKFQ9PlQ8ci5sZW5ndGgpKXtjb25zdCBUPUEucHJvcGVydGllcy5jaXJjdW1jZW50ZXI7aWYoIV9jKFQsYyxkKSlyZXR1cm59cC5wdXNoKC4uLl8pfX0pfWVsc2UgaWYoby5sZW5ndGgpe2NvbnN0IE09bHMuZnJvbShhKTtmb3IobGV0IFM9MCxBPU0udHJpYW5nbGVzLmxlbmd0aDtTPEE7Uys9Myl7Y29uc3Qgdj1bMiwxLDBdLm1hcChUPT5NLnRyaWFuZ2xlc1tTK1RdKSxfPXYubWFwKFQ9PmFbVF0pO2lmKHYuc29tZShUPT5UPHIubGVuZ3RoKSl7Y29uc3QgVD1bMCwxXS5tYXAoej0+d3AoXyxDPT5DW3pdKSk7aWYoIV9jKFQsYyxkKSljb250aW51ZX1wLnB1c2goLi4udil9fWVsc2V7Y29uc3R7dmVydGljZXM6TSxob2xlczpTPVtdfT15dShzKTtwPVR5KE0sUywyKX1sZXQgeT1lP1tlWzBdLGVbMl1dOmRyKGEsTT0+TVswXSksZz1lP1tlWzFdLGVbM11dOmRyKGEsTT0+TVsxXSk7aWYobil7Y29uc3RbTSxTXT1uKFt5WzBdLGdbMF1dKSxbQSx2XT1uKFt5WzFdLGdbMV1dKTt5PVtNLEFdLGc9Wy1TLC12XX1jb25zdCB3PXZjKHksWzAsMV0pLGI9dmMoZyxbMCwxXSkseD1hLm1hcCgoW00sU10pPT57aWYobil7Y29uc3RbQSx2XT1uKFtNLFNdKTtyZXR1cm5bdyhBKSxiKC12KV19ZWxzZSByZXR1cm5bdyhNKSxiKFMpXX0pO3JldHVybntjb250b3VyOnMsdHJpYW5nbGVzOntwb2ludHM6YSxpbmRpY2VzOnAsdXZzOnh9fX1jb25zdCBZdT1uZXcgQWUoKS5zZXRBdHRyaWJ1dGU/InNldEF0dHJpYnV0ZSI6ImFkZEF0dHJpYnV0ZSI7ZnVuY3Rpb24gaW8oaSx0LGUsbil7Y29uc3Qgcz1pLm1hcChyPT5yLm1hcCgoW28sYV0pPT57aWYobil7Y29uc3RbYyxsXT1uKFtvLGFdKTtyZXR1cm5bYywtbCx0XX1yZXR1cm4gZT9ieShvLGEsdCk6W28sYSx0XX0pKTtyZXR1cm4geXUocyl9ZnVuY3Rpb24gRmcoaSx0LGUsbixzKXtjb25zdHt2ZXJ0aWNlczpyLGhvbGVzOm99PWlvKGksdCxuLHMpLHt2ZXJ0aWNlczphfT1pbyhpLGUsbixzKSxjPUhpKFthLHJdKSxsPU1hdGgucm91bmQoYS5sZW5ndGgvMyksaD1uZXcgU2V0KG8pO2xldCB1PTA7Y29uc3QgZj1bXTtmb3IobGV0IHA9MDtwPGw7cCsrKXtsZXQgeT1wKzE7aWYoeT09PWwpeT11O2Vsc2UgaWYoaC5oYXMoeSkpe2NvbnN0IGc9eTt5PXUsdT1nfWYucHVzaChwLHArbCx5K2wpLGYucHVzaCh5K2wseSxwKX1jb25zdCBkPVtdO2ZvcihsZXQgcD0xO3A+PTA7cC0tKWZvcihsZXQgeT0wO3k8bDt5Kz0xKWQucHVzaCh5LyhsLTEpLHApO3JldHVybntpbmRpY2VzOmYsdmVydGljZXM6Yyx1dnM6ZCx0b3BWZXJ0czphfX1mdW5jdGlvbiBqdShpLHQsZSxuLHMscil7cmV0dXJue2luZGljZXM6bj9pLmluZGljZXM6aS5pbmRpY2VzLnNsaWNlKCkucmV2ZXJzZSgpLHZlcnRpY2VzOmlvKFtpLnBvaW50c10sdCxzLHIpLnZlcnRpY2VzLHV2czplfX1jb25zdCBRdT0oe3BvbHlnb25HZW9Kc29uOmksc3RhcnRIZWlnaHQ6dCxlbmRIZWlnaHQ6ZSxjdXJ2YXR1cmVSZXNvbHV0aW9uOm49MSxjYXJ0ZXNpYW46cz0hMCxoYXNTaWRlOnI9ITAsaGFzQm90dG9tOm89ITEsaGFzVG9wOmE9ITEscHJvamVjdGlvbjpjLGJib3g6bH0pPT57aS5mb3JFYWNoKHc9PntIeSh3KXx8dy5yZXZlcnNlKCl9KTtjb25zdHtjb250b3VyOmgsdHJpYW5nbGVzOnV9PUVnKGkse3Jlc29sdXRpb246bixiYm94OmwscHJvamVjdGlvbjpjfSk7bGV0IGY9e30sZDtyJiYoZj1GZyhoLHQhPW51bGw/dDplLGUhPW51bGw/ZTp0LHMsYyksZD1mLnRvcFZlcnRzKTtsZXQgcD1bXTsob3x8YSkmJihwPUhpKHUudXZzKSk7bGV0IHk9e307byYmKHk9anUodSx0LHAsITEscyxjKSk7bGV0IGc9e307cmV0dXJuIGEmJihnPWp1KHUsZSxwLCEwLHMsYykpLHtjb250b3VyOmgsdHJpYW5nbGVzOnUsc2lkZVRvcnNvOmYsYm90dG9tQ2FwOnksdG9wQ2FwOmcsdG9wVmVydHM6ZH19O2NsYXNzIElnIGV4dGVuZHMgQWV7Y29uc3RydWN0b3IodCxlPXt9KXtzdXBlcigpLHRoaXMudHlwZT0iUG9seWdvbkJ1ZmZlckdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9VnQoe3BvbHlnb25HZW9Kc29uOnQsc3RhcnRIZWlnaHQ6MCxlbmRIZWlnaHQ6MSxoYXNUb3A6ITAsdG9wRmlyc3Q6ITEsaGFzQm90dG9tOiEwLGhhc1NpZGU6ITAsY3VydmF0dXJlUmVzb2x1dGlvbjoxLGNhcnRlc2lhbjohMCx1c2VyRGF0YVJzb09mZnNldDowfSxlKTtjb25zdHtlbmRIZWlnaHQ6bixoYXNUb3A6cyx0b3BGaXJzdDpyLGhhc0JvdHRvbTpvLGhhc1NpZGU6YSxjYXJ0ZXNpYW46Yyx1c2VyRGF0YVJzb09mZnNldDpsLHByb2plY3Rpb246aH09dGhpcy5wYXJhbWV0ZXJzLHtjb250b3VyOnUsc2lkZVRvcnNvOmYsdG9wVmVydHM6ZCxib3R0b21DYXA6cCx0b3BDYXA6eX09UXUoVnQoe30sdGhpcy5wYXJhbWV0ZXJzKSk7bGV0IGc9W10sdz1bXSxiPVtdLHg9MDtjb25zdCBtPU09Pntjb25zdCBTPU1hdGgucm91bmQoZy5sZW5ndGgvMyksQT1iLmxlbmd0aDtnPWcuY29uY2F0KE0udmVydGljZXMpLHc9dy5jb25jYXQoTS51dnMpLGI9Yi5jb25jYXQoUz9NLmluZGljZXMubWFwKHY9PnYrUyk6TS5pbmRpY2VzKSx0aGlzLmFkZEdyb3VwKEEsYi5sZW5ndGgtQSx4KyspfTtzJiZyJiZtKHkpLGEmJihtKGYpLHRoaXMudXNlckRhdGEudG9wVmVydHM9bD9pbyh1LG4rbCxjLGgpLnZlcnRpY2VzOmQpLG8mJm0ocCkscyYmIXImJm0oeSksdGhpcy5zZXRJbmRleChiKSx0aGlzW1l1XSgicG9zaXRpb24iLG5ldyBSZShnLDMpKSx0aGlzW1l1XSgidXYiLG5ldyBSZSh3LDIpKSx0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCl9fXZhciBOZz1pPT57Y29uc3QgYT1pLHtjb29yZGluYXRlOnQsc3RhcnRIZWlnaHQ6ZSxoZWlnaHQ6bn09YSxzPXVmKGEsWyJjb29yZGluYXRlIiwic3RhcnRIZWlnaHQiLCJoZWlnaHQiXSk7bGV0IHI9ZXx8MDtyZXR1cm4gdHlwZW9mIGUhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbiE9InVuZGVmaW5lZCImJihyPWUrbiksbmV3IElnKFt0XSxLZShWdCh7fSxzKSx7c3RhcnRIZWlnaHQ6ZSxlbmRIZWlnaHQ6cn0pKX07Y29uc3Qga2c9KHtjb29yZGluYXRlczppLGxlbmd0aHM6dCxtZXRhTGVuZ3RoOmUsdXNlR3JvdXBzOm4saGFzVG9wOnMsdG9wRmlyc3Q6cixoYXNCb3R0b206byxoYXNTaWRlOmEsY2FydGVzaWFuOmMscHJvamVjdGlvbjpsLGN1cnZhdHVyZVJlc29sdXRpb246aCxiYm94OnV9KT0+e2NvbnN0IGY9bCYmZXMobCk7ZiYmKGM9ITEpO2NvbnN0e2Nvb3JkaW5hdGVzQXJyOmQsbWV0YUFycmF5OnB9PW5zKHtjb29yZGluYXRlczppLGxlbmd0aHM6dCxtZXRhTGVuZ3RoOmV9KSx5PWQubWFwKChnLHcpPT57Y29uc3QgYj1wW3ddWzBdLHg9cFt3XVsxXXx8MDtyZXR1cm4gTmcoe2Nvb3JkaW5hdGU6Zyxwcm9qZWN0aW9uOmYsc3RhcnRIZWlnaHQ6eCxoZWlnaHQ6YixoYXNUb3A6cyE9bnVsbD9zOiEwLHRvcEZpcnN0OnIhPW51bGw/cjohMSxoYXNCb3R0b206byE9bnVsbD9vOiEwLGhhc1NpZGU6YSE9bnVsbD9hOiEwLGNhcnRlc2lhbjpjIT1udWxsP2M6ITAsY3VydmF0dXJlUmVzb2x1dGlvbjpoIT1udWxsP2g6MSxiYm94OnV9KX0pO3JldHVybiBpcyh5LG4pfSxSZz0oe2Nvb3JkaW5hdGVzOmksbGVuZ3Roczp0LG1ldGFMZW5ndGg6ZSx1c2VHcm91cHM6bn0pPT57Y29uc3R7Y29vcmRpbmF0ZXNBcnI6cyxtZXRhQXJyYXk6cn09bnMoe2Nvb3JkaW5hdGVzOmksbGVuZ3Roczp0LG1ldGFMZW5ndGg6ZX0pLGE9cy5tYXAoKGMsbCk9Pntjb25zdCBoPXJbbF1bMV18fDA7cmV0dXJuIFF1KHtwb2x5Z29uR2VvSnNvbjpbY10sc3RhcnRIZWlnaHQ6aH0pLnRvcFZlcnRzfSkubWFwKChjLGwpPT57Y29uc3QgaD1yW2xdWzBdO3JldHVybiBsdSh7bm9kZXM6YyxzZXRQb2ludFdpZHRoOigpPT5ofSl9KTtyZXR1cm4gaXMoYSxuKX07dmFyIExnPShpLHQsZSk9Pm5ldyBQcm9taXNlKChuLHMpPT57dmFyIHI9Yz0+e3RyeXthKGUubmV4dChjKSl9Y2F0Y2gobCl7cyhsKX19LG89Yz0+e3RyeXthKGUudGhyb3coYykpfWNhdGNoKGwpe3MobCl9fSxhPWM9PmMuZG9uZT9uKGMudmFsdWUpOlByb21pc2UucmVzb2x2ZShjLnZhbHVlKS50aGVuKHIsbyk7YSgoZT1lLmFwcGx5KGksdCkpLm5leHQoKSl9KTtmdW5jdGlvbiBPZyhpKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaSkucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOmlbZV0sZW51bWVyYWJsZTohMH0pfSx7fSl9KGk9Pntjb25zdCB0PXtydW4oZSxuKXtjb25zdCBzPW5ldyBGdW5jdGlvbigicmV0dXJuICgiK2UrIikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsiKTtyZXR1cm4gcy5hcHBseShzLG4pfSxtZXRob2RzKCl7cmV0dXJuIE9iamVjdC5rZXlzKHQpfX07YWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZT0+TGcodm9pZCAwLFtlXSxmdW5jdGlvbiooe2RhdGE6bn0pe3RyeXtjb25zdCBzPXRbbi5tZXRob2RdO2lmKHMpe2NvbnN0IHI9eWllbGQgcy5hcHBseShzLG4ucGFyYW1zKTtyLnRyYW5zZmVyJiZyLm1lc3NhZ2U/cG9zdE1lc3NhZ2Uoe2lkOm4uaWQscmVzdWx0OnIubWVzc2FnZSxlcnJvcjpudWxsfSxyLnRyYW5zZmVyKTpwb3N0TWVzc2FnZSh7aWQ6bi5pZCxyZXN1bHQ6cixlcnJvcjpudWxsfSl9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbWV0aG9kICInK24ubWV0aG9kKyciJyl9Y2F0Y2gocyl7cG9zdE1lc3NhZ2Uoe2lkOm4uaWQscmVzdWx0Om51bGwsZXJyb3I6T2cocyl9KX19KSksT2JqZWN0LmtleXMoaSkuZm9yRWFjaChlPT57dFtlXT1pW2VdfSkscG9zdE1lc3NhZ2UoInJlYWR5Iil9KSh7ZXh0cnVkZVBvbHlnb246QXksbGluZTp2eSxsaW5lMjp6eSxjb25pY1BvbHlnb246a2csY29uaWNMaW5lOlJnfSl9KSgpOwo=",J=l=>Uint8Array.from(atob(l),b=>b.charCodeAt(0)),M=typeof window!="undefined"&&window.Blob&&new Blob([J(n)],{type:"text/javascript;charset=utf-8"});function T(l){let b;try{if(b=M&&(window.URL||window.webkitURL).createObjectURL(M),!b)throw"";const d=new Worker(b,{name:l==null?void 0:l.name});return d.addEventListener("error",()=>{(window.URL||window.webkitURL).revokeObjectURL(b)}),d}catch(d){return new Worker("data:text/javascript;base64,"+n,{name:l==null?void 0:l.name})}finally{b&&(window.URL||window.webkitURL).revokeObjectURL(b)}}class t{constructor(b){this.pluginName="worker",this.bufferGeometryLoader=new K.BufferGeometryLoader,this.cacheObj={},this.options=L({dbName:"base",cacheVersion:"1"},b),this.store=Y.createStore(this.options.dbName,"attributes")}install(b){this.pencil=b;const d=new N.WorkerPool(T,{maxWorkers:this.options.maxWorkers});this.pool=d}geoGeometry(b,d){return s(this,null,function*(){const{mesaage:G,coordinatesArr:m,metaArray:p,cacheKey:c,userData:W,cacheVersion:X,cb:Z}=L(L({},this.options),d),y=this.pool,{flat:a,lengths:i}=this.flattenCoordinates(m,p),{err:x,res:S}=yield y.exec(b,[L({coordinates:a,lengths:i,metaLength:p?p[0].length:0},G)],{on:()=>{},transfer:[a.buffer]},!0);if(x)throw x;const h=C(S);if(Object.assign(h.userData,L({},W)),Z&&(yield Z(h)),c){const{cacheObj:V}=this;V[c]||(V[c]={[X]:[]}),V[c][X].push(L({attributes:S},W))}return h})}getCachedGeometry(b){return s(this,null,function*(){const{cacheKey:d,cacheVersion:G}=b;if(d){const m=yield Y.get(d,this.store),p=G||this.options.cacheVersion;return m!=null&&m[p]?m[p].map(c=>{const y=c,{attributes:W}=y,X=H(y,["attributes"]),Z=C(W);return Object.assign(Z.userData,L({},X)),Z}):[]}else return[]})}saveCache(){Y.setMany(Object.entries(this.cacheObj),this.store)}flattenCoordinates(b,d){const G=[];let m=0;for(const X of b){const Z=X.length;G.push(Z),m+=Z}const p=d?d.reduce((X,Z)=>X+Z.length,0):0,c=new Float32Array(m*2+p);let W=0;for(const X of b)for(const[Z,y]of X)c[W++]=Z,c[W++]=y;if(d)for(const X of d)for(const Z of X)c[W++]=Z;return{flat:c,lengths:G}}dispose(){this.cacheObj={},this.pool.dispose(),this.pool.workers.length=0}}exports.Wk=t;