mars3d-cesium
Version:
CesiumJS是一个JavaScript库,用于在web浏览器中无需插件创建3D地球仪和2D地图,mars3d-cesium是火星科技修改版本的CesiumJS。
26 lines (25 loc) • 5.17 MB
JavaScript
/**
* @license
* Cesium - https://github.com/CesiumGS/cesium
* Version 1.128
*
* Copyright 2011-2022 Cesium Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Columbus View (Pat. Pend.)
*
* Portions licensed separately.
* See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details.
*/
var Cesium=(()=>{var o1e=Object.create;var $M=Object.defineProperty;var r1e=Object.getOwnPropertyDescriptor;var s1e=Object.getOwnPropertyNames;var a1e=Object.getPrototypeOf,c1e=Object.prototype.hasOwnProperty;var eN=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var ad=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),l1e=(e,t)=>{for(var n in t)$M(e,n,{get:t[n],enumerable:!0})},_q=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of s1e(t))!c1e.call(e,o)&&o!==n&&$M(e,o,{get:()=>t[o],enumerable:!(i=r1e(t,o))||i.enumerable});return e};var _=(e,t,n)=>(n=e!=null?o1e(a1e(e)):{},_q(t||!e||!e.__esModule?$M(n,"default",{value:e,enumerable:!0}):n,e)),d1e=e=>_q($M({},"__esModule",{value:!0}),e);var T=ad(()=>{globalThis.CESIUM_WORKERS=atob("dmFyIENlc2l1bVdvcmtlcnM9KCgpPT57dmFyIFdTPU9iamVjdC5jcmVhdGU7dmFyIEJsPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgWFM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgWVM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyICRTPU9iamVjdC5nZXRQcm90b3R5cGVPZixaUz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBwcj0odD0+dHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6dHlwZW9mIFByb3h5PCJ1Ij9uZXcgUHJveHkodCx7Z2V0OihlLG4pPT4odHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6ZSlbbl19KTp0KShmdW5jdGlvbih0KXtpZih0eXBlb2YgcmVxdWlyZTwidSIpcmV0dXJuIHJlcXVpcmUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3Rocm93IEVycm9yKCdEeW5hbWljIHJlcXVpcmUgb2YgIicrdCsnIiBpcyBub3Qgc3VwcG9ydGVkJyl9KSxsMT10PT5lPT57dmFyIG49dFtlXTtpZihuKXJldHVybiBuKCk7dGhyb3cgbmV3IEVycm9yKCJNb2R1bGUgbm90IGZvdW5kIGluIGJ1bmRsZTogIitlKX07dmFyICQ9KHQsZSk9PigpPT4odCYmKGU9dCh0PTApKSxlKTt2YXIgWG49KHQsZSk9PigpPT4oZXx8dCgoZT17ZXhwb3J0czp7fX0pLmV4cG9ydHMsZSksZS5leHBvcnRzKSxkZT0odCxlKT0+e2Zvcih2YXIgbiBpbiBlKUJsKHQsbix7Z2V0OmVbbl0sZW51bWVyYWJsZTohMH0pfSxwMT0odCxlLG4sbyk9PntpZihlJiZ0eXBlb2YgZT09Im9iamVjdCJ8fHR5cGVvZiBlPT0iZnVuY3Rpb24iKWZvcihsZXQgciBvZiBZUyhlKSkhWlMuY2FsbCh0LHIpJiZyIT09biYmQmwodCxyLHtnZXQ6KCk9PmVbcl0sZW51bWVyYWJsZTohKG89WFMoZSxyKSl8fG8uZW51bWVyYWJsZX0pO3JldHVybiB0fTt2YXIgZHI9KHQsZSxuKT0+KG49dCE9bnVsbD9XUygkUyh0KSk6e30scDEoZXx8IXR8fCF0Ll9fZXNNb2R1bGU/QmwobiwiZGVmYXVsdCIse3ZhbHVlOnQsZW51bWVyYWJsZTohMH0pOm4sdCkpLFFTPXQ9PnAxKEJsKHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0KTtmdW5jdGlvbiBKUyh0KXtyZXR1cm4gdCE9bnVsbH12YXIgaCxmdD0kKCgpPT57aD1KU30pO2Z1bmN0aW9uIGtzKHQpe3RoaXMubmFtZT0iRGV2ZWxvcGVyRXJyb3IiLHRoaXMubWVzc2FnZT10O2xldCBlO3RyeXt0aHJvdyBuZXcgRXJyb3J9Y2F0Y2gobil7ZT1uLnN0YWNrfXRoaXMuc3RhY2s9ZX12YXIgRCxqdD0kKCgpPT57ZnQoKTtoKE9iamVjdC5jcmVhdGUpJiYoa3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSxrcy5wcm90b3R5cGUuY29uc3RydWN0b3I9a3MpO2tzLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2xldCB0PWAke3RoaXMubmFtZX06ICR7dGhpcy5tZXNzYWdlfWA7cmV0dXJuIGgodGhpcy5zdGFjaykmJih0Kz1gCiR7dGhpcy5zdGFjay50b1N0cmluZygpfWApLHR9O2tzLnRocm93SW5zdGFudGlhdGlvbkVycm9yPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IGtzKCJUaGlzIGZ1bmN0aW9uIGRlZmluZXMgYW4gaW50ZXJmYWNlIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4iKX07RD1rc30pO2Z1bmN0aW9uIHRDKHQpe3JldHVybmAke3R9IGlzIHJlcXVpcmVkLCBhY3R1YWwgdmFsdWUgd2FzIHVuZGVmaW5lZGB9ZnVuY3Rpb24gemModCxlLG4pe3JldHVybmBFeHBlY3RlZCAke259IHRvIGJlIHR5cGVvZiAke2V9LCBhY3R1YWwgdHlwZW9mIHdhcyAke3R9YH12YXIgWW4seSxXdD0kKCgpPT57ZnQoKTtqdCgpO1luPXt9O1luLnR5cGVPZj17fTtZbi5kZWZpbmVkPWZ1bmN0aW9uKHQsZSl7aWYoIWgoZSkpdGhyb3cgbmV3IEQodEModCkpfTtZbi50eXBlT2YuZnVuYz1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0iZnVuY3Rpb24iKXRocm93IG5ldyBEKHpjKHR5cGVvZiBlLCJmdW5jdGlvbiIsdCkpfTtZbi50eXBlT2Yuc3RyaW5nPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJzdHJpbmciKXRocm93IG5ldyBEKHpjKHR5cGVvZiBlLCJzdHJpbmciLHQpKX07WW4udHlwZU9mLm51bWJlcj1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0ibnVtYmVyIil0aHJvdyBuZXcgRCh6Yyh0eXBlb2YgZSwibnVtYmVyIix0KSl9O1luLnR5cGVPZi5udW1iZXIubGVzc1RoYW49ZnVuY3Rpb24odCxlLG4pe2lmKFluLnR5cGVPZi5udW1iZXIodCxlKSxlPj1uKXRocm93IG5ldyBEKGBFeHBlY3RlZCAke3R9IHRvIGJlIGxlc3MgdGhhbiAke259LCBhY3R1YWwgdmFsdWUgd2FzICR7ZX1gKX07WW4udHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzPWZ1bmN0aW9uKHQsZSxuKXtpZihZbi50eXBlT2YubnVtYmVyKHQsZSksZT5uKXRocm93IG5ldyBEKGBFeHBlY3RlZCAke3R9IHRvIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAke259LCBhY3R1YWwgdmFsdWUgd2FzICR7ZX1gKX07WW4udHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbj1mdW5jdGlvbih0LGUsbil7aWYoWW4udHlwZU9mLm51bWJlcih0LGUpLGU8PW4pdGhyb3cgbmV3IEQoYEV4cGVjdGVkICR7dH0gdG8gYmUgZ3JlYXRlciB0aGFuICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfTtZbi50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKFluLnR5cGVPZi5udW1iZXIodCxlKSxlPG4pdGhyb3cgbmV3IEQoYEV4cGVjdGVkICR7dH0gdG8gYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfTtZbi50eXBlT2Yub2JqZWN0PWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJvYmplY3QiKXRocm93IG5ldyBEKHpjKHR5cGVvZiBlLCJvYmplY3QiLHQpKX07WW4udHlwZU9mLmJvb2w9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9ImJvb2xlYW4iKXRocm93IG5ldyBEKHpjKHR5cGVvZiBlLCJib29sZWFuIix0KSl9O1luLnR5cGVPZi5iaWdpbnQ9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9ImJpZ2ludCIpdGhyb3cgbmV3IEQoemModHlwZW9mIGUsImJpZ2ludCIsdCkpfTtZbi50eXBlT2YubnVtYmVyLmVxdWFscz1mdW5jdGlvbih0LGUsbixvKXtpZihZbi50eXBlT2YubnVtYmVyKHQsbiksWW4udHlwZU9mLm51bWJlcihlLG8pLG4hPT1vKXRocm93IG5ldyBEKGAke3R9IG11c3QgYmUgZXF1YWwgdG8gJHtlfSwgdGhlIGFjdHVhbCB2YWx1ZXMgYXJlICR7bn0gYW5kICR7b31gKX07eT1Zbn0pO3ZhciBtMT1YbigoSGssZDEpPT57dmFyIFJpPWZ1bmN0aW9uKHQpe3Q9PW51bGwmJih0PW5ldyBEYXRlKCkuZ2V0VGltZSgpKSx0aGlzLk49NjI0LHRoaXMuTT0zOTcsdGhpcy5NQVRSSVhfQT0yNTY3NDgzNjE1LHRoaXMuVVBQRVJfTUFTSz0yMTQ3NDgzNjQ4LHRoaXMuTE9XRVJfTUFTSz0yMTQ3NDgzNjQ3LHRoaXMubXQ9bmV3IEFycmF5KHRoaXMuTiksdGhpcy5tdGk9dGhpcy5OKzEsdC5jb25zdHJ1Y3Rvcj09QXJyYXk/dGhpcy5pbml0X2J5X2FycmF5KHQsdC5sZW5ndGgpOnRoaXMuaW5pdF9zZWVkKHQpfTtSaS5wcm90b3R5cGUuaW5pdF9zZWVkPWZ1bmN0aW9uKHQpe2Zvcih0aGlzLm10WzBdPXQ+Pj4wLHRoaXMubXRpPTE7dGhpcy5tdGk8dGhpcy5OO3RoaXMubXRpKyspe3ZhciB0PXRoaXMubXRbdGhpcy5tdGktMV1edGhpcy5tdFt0aGlzLm10aS0xXT4+PjMwO3RoaXMubXRbdGhpcy5tdGldPSgoKHQmNDI5NDkwMTc2MCk+Pj4xNikqMTgxMjQzMzI1Mzw8MTYpKyh0JjY1NTM1KSoxODEyNDMzMjUzK3RoaXMubXRpLHRoaXMubXRbdGhpcy5tdGldPj4+PTB9fTtSaS5wcm90b3R5cGUuaW5pdF9ieV9hcnJheT1mdW5jdGlvbih0LGUpe3ZhciBuLG8scjtmb3IodGhpcy5pbml0X3NlZWQoMTk2NTAyMTgpLG49MSxvPTAscj10aGlzLk4+ZT90aGlzLk46ZTtyO3ItLSl7dmFyIGk9dGhpcy5tdFtuLTFdXnRoaXMubXRbbi0xXT4+PjMwO3RoaXMubXRbbl09KHRoaXMubXRbbl1eKCgoaSY0Mjk0OTAxNzYwKT4+PjE2KSoxNjY0NTI1PDwxNikrKGkmNjU1MzUpKjE2NjQ1MjUpK3Rbb10rbyx0aGlzLm10W25dPj4+PTAsbisrLG8rKyxuPj10aGlzLk4mJih0aGlzLm10WzBdPXRoaXMubXRbdGhpcy5OLTFdLG49MSksbz49ZSYmKG89MCl9Zm9yKHI9dGhpcy5OLTE7cjtyLS0pe3ZhciBpPXRoaXMubXRbbi0xXV50aGlzLm10W24tMV0+Pj4zMDt0aGlzLm10W25dPSh0aGlzLm10W25dXigoKGkmNDI5NDkwMTc2MCk+Pj4xNikqMTU2NjA4Mzk0MTw8MTYpKyhpJjY1NTM1KSoxNTY2MDgzOTQxKS1uLHRoaXMubXRbbl0+Pj49MCxuKyssbj49dGhpcy5OJiYodGhpcy5tdFswXT10aGlzLm10W3RoaXMuTi0xXSxuPTEpfXRoaXMubXRbMF09MjE0NzQ4MzY0OH07UmkucHJvdG90eXBlLnJhbmRvbV9pbnQ9ZnVuY3Rpb24oKXt2YXIgdCxlPW5ldyBBcnJheSgwLHRoaXMuTUFUUklYX0EpO2lmKHRoaXMubXRpPj10aGlzLk4pe3ZhciBuO2Zvcih0aGlzLm10aT09dGhpcy5OKzEmJnRoaXMuaW5pdF9zZWVkKDU0ODkpLG49MDtuPHRoaXMuTi10aGlzLk07bisrKXQ9dGhpcy5tdFtuXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFtuKzFdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W25dPXRoaXMubXRbbit0aGlzLk1dXnQ+Pj4xXmVbdCYxXTtmb3IoO248dGhpcy5OLTE7bisrKXQ9dGhpcy5tdFtuXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFtuKzFdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W25dPXRoaXMubXRbbisodGhpcy5NLXRoaXMuTildXnQ+Pj4xXmVbdCYxXTt0PXRoaXMubXRbdGhpcy5OLTFdJnRoaXMuVVBQRVJfTUFTS3x0aGlzLm10WzBdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W3RoaXMuTi0xXT10aGlzLm10W3RoaXMuTS0xXV50Pj4+MV5lW3QmMV0sdGhpcy5tdGk9MH1yZXR1cm4gdD10aGlzLm10W3RoaXMubXRpKytdLHRePXQ+Pj4xMSx0Xj10PDw3JjI2MzY5Mjg2NDAsdF49dDw8MTUmNDAyMjczMDc1Mix0Xj10Pj4+MTgsdD4+PjB9O1JpLnByb3RvdHlwZS5yYW5kb21faW50MzE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYW5kb21faW50KCk+Pj4xfTtSaS5wcm90b3R5cGUucmFuZG9tX2luY2w9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYW5kb21faW50KCkqKDEvNDI5NDk2NzI5NSl9O1JpLnByb3RvdHlwZS5yYW5kb209ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYW5kb21faW50KCkqKDEvNDI5NDk2NzI5Nil9O1JpLnByb3RvdHlwZS5yYW5kb21fZXhjbD1mdW5jdGlvbigpe3JldHVybih0aGlzLnJhbmRvbV9pbnQoKSsuNSkqKDEvNDI5NDk2NzI5Nil9O1JpLnByb3RvdHlwZS5yYW5kb21fbG9uZz1mdW5jdGlvbigpe3ZhciB0PXRoaXMucmFuZG9tX2ludCgpPj4+NSxlPXRoaXMucmFuZG9tX2ludCgpPj4+NjtyZXR1cm4odCo2NzEwODg2NCtlKSooMS85MDA3MTk5MjU0NzQwOTkyKX07ZDEuZXhwb3J0cz1SaX0pO3ZhciB3bSx4dCxVbCxoMSxQLEt0PSQoKCk9Pnt3bT1kcihtMSgpLDEpO1d0KCk7ZnQoKTtqdCgpO3h0PXt9O3h0LkVQU0lMT04xPS4xO3h0LkVQU0lMT04yPS4wMTt4dC5FUFNJTE9OMz0uMDAxO3h0LkVQU0lMT040PTFlLTQ7eHQuRVBTSUxPTjU9MWUtNTt4dC5FUFNJTE9ONj0xZS02O3h0LkVQU0lMT043PTFlLTc7eHQuRVBTSUxPTjg9MWUtODt4dC5FUFNJTE9OOT0xZS05O3h0LkVQU0lMT04xMD0xZS0xMDt4dC5FUFNJTE9OMTE9MWUtMTE7eHQuRVBTSUxPTjEyPTFlLTEyO3h0LkVQU0lMT04xMz0xZS0xMzt4dC5FUFNJTE9OMTQ9MWUtMTQ7eHQuRVBTSUxPTjE1PTFlLTE1O3h0LkVQU0lMT04xNj0xZS0xNjt4dC5FUFNJTE9OMTc9MWUtMTc7eHQuRVBTSUxPTjE4PTFlLTE4O3h0LkVQU0lMT04xOT0xZS0xOTt4dC5FUFNJTE9OMjA9MWUtMjA7eHQuRVBTSUxPTjIxPTFlLTIxO3h0LkdSQVZJVEFUSU9OQUxQQVJBTUVURVI9Mzk4NjAwNDQxOGU1O3h0LlNPTEFSX1JBRElVUz02OTU1ZTU7eHQuTFVOQVJfUkFESVVTPTE3Mzc0MDA7eHQuU0lYVFlfRk9VUl9LSUxPQllURVM9NjQqMTAyNDt4dC5GT1VSX0dJR0FCWVRFUz00KjEwMjQqMTAyNCoxMDI0O3h0LnNpZ249TWF0aC5zaWduPz9mdW5jdGlvbihlKXtyZXR1cm4gZT0rZSxlPT09MHx8ZSE9PWU/ZTplPjA/MTotMX07eHQuc2lnbk5vdFplcm89ZnVuY3Rpb24odCl7cmV0dXJuIHQ8MD8tMToxfTt4dC50b1NOb3JtPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9ZT8/MjU1LE1hdGgucm91bmQoKHh0LmNsYW1wKHQsLTEsMSkqLjUrLjUpKmUpfTt4dC5mcm9tU05vcm09ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT1lPz8yNTUseHQuY2xhbXAodCwwLGUpL2UqMi0xfTt4dC5ub3JtYWxpemU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuPU1hdGgubWF4KG4tZSwwKSxuPT09MD8wOnh0LmNsYW1wKCh0LWUpL24sMCwxKX07eHQuc2luaD1NYXRoLnNpbmg/P2Z1bmN0aW9uKGUpe3JldHVybihNYXRoLmV4cChlKS1NYXRoLmV4cCgtZSkpLzJ9O3h0LmNvc2g9TWF0aC5jb3NoPz9mdW5jdGlvbihlKXtyZXR1cm4oTWF0aC5leHAoZSkrTWF0aC5leHAoLWUpKS8yfTt4dC5sZXJwPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4oMS1uKSp0K24qZX07eHQuUEk9TWF0aC5QSTt4dC5PTkVfT1ZFUl9QST0xL01hdGguUEk7eHQuUElfT1ZFUl9UV089TWF0aC5QSS8yO3h0LlBJX09WRVJfVEhSRUU9TWF0aC5QSS8zO3h0LlBJX09WRVJfRk9VUj1NYXRoLlBJLzQ7eHQuUElfT1ZFUl9TSVg9TWF0aC5QSS82O3h0LlRIUkVFX1BJX09WRVJfVFdPPTMqTWF0aC5QSS8yO3h0LlRXT19QST0yKk1hdGguUEk7eHQuT05FX09WRVJfVFdPX1BJPTEvKDIqTWF0aC5QSSk7eHQuUkFESUFOU19QRVJfREVHUkVFPU1hdGguUEkvMTgwO3h0LkRFR1JFRVNfUEVSX1JBRElBTj0xODAvTWF0aC5QSTt4dC5SQURJQU5TX1BFUl9BUkNTRUNPTkQ9eHQuUkFESUFOU19QRVJfREVHUkVFLzM2MDA7eHQudG9SYWRpYW5zPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBEKCJkZWdyZWVzIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0Knh0LlJBRElBTlNfUEVSX0RFR1JFRX07eHQudG9EZWdyZWVzPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBEKCJyYWRpYW5zIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0Knh0LkRFR1JFRVNfUEVSX1JBRElBTn07eHQuY29udmVydExvbmdpdHVkZVJhbmdlPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBEKCJhbmdsZSBpcyByZXF1aXJlZC4iKTtsZXQgZT14dC5UV09fUEksbj10LU1hdGguZmxvb3IodC9lKSplO3JldHVybiBuPC1NYXRoLlBJP24rZTpuPj1NYXRoLlBJP24tZTpufTt4dC5jbGFtcFRvTGF0aXR1ZGVSYW5nZT1mdW5jdGlvbih0KXtpZighaCh0KSl0aHJvdyBuZXcgRCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHh0LmNsYW1wKHQsLTEqeHQuUElfT1ZFUl9UV08seHQuUElfT1ZFUl9UV08pfTt4dC5uZWdhdGl2ZVBpVG9QaT1mdW5jdGlvbih0KXtpZighaCh0KSl0aHJvdyBuZXcgRCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQ+PS14dC5QSSYmdDw9eHQuUEk/dDp4dC56ZXJvVG9Ud29QaSh0K3h0LlBJKS14dC5QSX07eHQuemVyb1RvVHdvUGk9ZnVuY3Rpb24odCl7aWYoIWgodCkpdGhyb3cgbmV3IEQoImFuZ2xlIGlzIHJlcXVpcmVkLiIpO2lmKHQ+PTAmJnQ8PXh0LlRXT19QSSlyZXR1cm4gdDtsZXQgZT14dC5tb2QodCx4dC5UV09fUEkpO3JldHVybiBNYXRoLmFicyhlKTx4dC5FUFNJTE9OMTQmJk1hdGguYWJzKHQpPnh0LkVQU0lMT04xND94dC5UV09fUEk6ZX07eHQubW9kPWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEQoIm0gaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEQoIm4gaXMgcmVxdWlyZWQuIik7aWYoZT09PTApdGhyb3cgbmV3IEQoImRpdmlzb3IgY2Fubm90IGJlIDAuIik7cmV0dXJuIHh0LnNpZ24odCk9PT14dC5zaWduKGUpJiZNYXRoLmFicyh0KTxNYXRoLmFicyhlKT90Oih0JWUrZSklZX07eHQuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbixvKXtpZighaCh0KSl0aHJvdyBuZXcgRCgibGVmdCBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgRCgicmlnaHQgaXMgcmVxdWlyZWQuIik7bj1uPz8wLG89bz8/bjtsZXQgcj1NYXRoLmFicyh0LWUpO3JldHVybiByPD1vfHxyPD1uKk1hdGgubWF4KE1hdGguYWJzKHQpLE1hdGguYWJzKGUpKX07eHQubGVzc1RoYW49ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBEKCJmaXJzdCBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgRCgic2Vjb25kIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBEKCJhYnNvbHV0ZUVwc2lsb24gaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQtZTwtbn07eHQubGVzc1RoYW5PckVxdWFscz1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEQoImZpcnN0IGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBEKCJzZWNvbmQgaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEQoImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdC1lPG59O3h0LmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgRCgiZmlyc3QgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEQoInNlY29uZCBpcyByZXF1aXJlZC4iKTtpZighaChuKSl0aHJvdyBuZXcgRCgiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0LWU+bn07eHQuZ3JlYXRlclRoYW5PckVxdWFscz1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEQoImZpcnN0IGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBEKCJzZWNvbmQgaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEQoImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdC1lPi1ufTtVbD1bMV07eHQuZmFjdG9yaWFsPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwKXRocm93IG5ldyBEKCJBIG51bWJlciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCBpcyByZXF1aXJlZC4iKTtsZXQgZT1VbC5sZW5ndGg7aWYodD49ZSl7bGV0IG49VWxbZS0xXTtmb3IobGV0IG89ZTtvPD10O28rKyl7bGV0IHI9bipvO1VsLnB1c2gociksbj1yfX1yZXR1cm4gVWxbdF19O3h0LmluY3JlbWVudFdyYXA9ZnVuY3Rpb24odCxlLG4pe2lmKG49bj8/MCwhaCh0KSl0aHJvdyBuZXcgRCgibiBpcyByZXF1aXJlZC4iKTtpZihlPD1uKXRocm93IG5ldyBEKCJtYXhpbXVtVmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gbWluaW11bVZhbHVlLiIpO3JldHVybisrdCx0PmUmJih0PW4pLHR9O3h0LmlzUG93ZXJPZlR3bz1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MHx8dD40Mjk0OTY3Mjk1KXRocm93IG5ldyBEKCJBIG51bWJlciBiZXR3ZWVuIDAgYW5kICgyXjMyKS0xIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0IT09MCYmKHQmdC0xKT09PTB9O3h0Lm5leHRQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjIxNDc0ODM2NDgpdGhyb3cgbmV3IEQoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMl4zMSBpcyByZXF1aXJlZC4iKTtyZXR1cm4tLXQsdHw9dD4+MSx0fD10Pj4yLHR8PXQ+PjQsdHw9dD4+OCx0fD10Pj4xNiwrK3QsdH07eHQucHJldmlvdXNQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjQyOTQ5NjcyOTUpdGhyb3cgbmV3IEQoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHR8PXQ+PjEsdHw9dD4+Mix0fD10Pj40LHR8PXQ+PjgsdHw9dD4+MTYsdHw9dD4+MzIsdD0odD4+PjApLSh0Pj4+MSksdH07eHQuY2xhbXA9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5udW1iZXIoInZhbHVlIix0KSx5LnR5cGVPZi5udW1iZXIoIm1pbiIsZSkseS50eXBlT2YubnVtYmVyKCJtYXgiLG4pLHQ8ZT9lOnQ+bj9uOnR9O2gxPW5ldyB3bS5kZWZhdWx0O3h0LnNldFJhbmRvbU51bWJlclNlZWQ9ZnVuY3Rpb24odCl7aWYoIWgodCkpdGhyb3cgbmV3IEQoInNlZWQgaXMgcmVxdWlyZWQuIik7aDE9bmV3IHdtLmRlZmF1bHQodCl9O3h0Lm5leHRSYW5kb21OdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gaDEucmFuZG9tKCl9O3h0LnJhbmRvbUJldHdlZW49ZnVuY3Rpb24odCxlKXtyZXR1cm4geHQubmV4dFJhbmRvbU51bWJlcigpKihlLXQpK3R9O3h0LmFjb3NDbGFtcGVkPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBEKCJ2YWx1ZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gTWF0aC5hY29zKHh0LmNsYW1wKHQsLTEsMSkpfTt4dC5hc2luQ2xhbXBlZD1mdW5jdGlvbih0KXtpZighaCh0KSl0aHJvdyBuZXcgRCgidmFsdWUgaXMgcmVxdWlyZWQuIik7cmV0dXJuIE1hdGguYXNpbih4dC5jbGFtcCh0LC0xLDEpKX07eHQuY2hvcmRMZW5ndGg9ZnVuY3Rpb24odCxlKXtpZighaCh0KSl0aHJvdyBuZXcgRCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEQoInJhZGl1cyBpcyByZXF1aXJlZC4iKTtyZXR1cm4gMiplKk1hdGguc2luKHQqLjUpfTt4dC5sb2dCYXNlPWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEQoIm51bWJlciBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgRCgiYmFzZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gTWF0aC5sb2codCkvTWF0aC5sb2coZSl9O3h0LmNicnQ9TWF0aC5jYnJ0Pz9mdW5jdGlvbihlKXtsZXQgbj1NYXRoLnBvdyhNYXRoLmFicyhlKSwuMzMzMzMzMzMzMzMzMzMzMyk7cmV0dXJuIGU8MD8tbjpufTt4dC5sb2cyPU1hdGgubG9nMj8/ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubG9nKGUpKk1hdGguTE9HMkV9O3h0LmZvZz1mdW5jdGlvbih0LGUpe2xldCBuPXQqZTtyZXR1cm4gMS1NYXRoLmV4cCgtKG4qbikpfTt4dC5mYXN0QXBwcm94aW1hdGVBdGFuPWZ1bmN0aW9uKHQpe3JldHVybiB5LnR5cGVPZi5udW1iZXIoIngiLHQpLHQqKC0uMTc4NCpNYXRoLmFicyh0KS0uMDY2Myp0KnQrMS4wMzAxKX07eHQuZmFzdEFwcHJveGltYXRlQXRhbjI9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5udW1iZXIoIngiLHQpLHkudHlwZU9mLm51bWJlcigieSIsZSk7bGV0IG4sbz1NYXRoLmFicyh0KTtuPU1hdGguYWJzKGUpO2xldCByPU1hdGgubWF4KG8sbik7bj1NYXRoLm1pbihvLG4pO2xldCBpPW4vcjtpZihpc05hTihpKSl0aHJvdyBuZXcgRCgiZWl0aGVyIHggb3IgeSBtdXN0IGJlIG5vbnplcm8iKTtyZXR1cm4gbz14dC5mYXN0QXBwcm94aW1hdGVBdGFuKGkpLG89TWF0aC5hYnMoZSk+TWF0aC5hYnModCk/eHQuUElfT1ZFUl9UV08tbzpvLG89dDwwP3h0LlBJLW86byxvPWU8MD8tbzpvLG99O1A9eHR9KTtmdW5jdGlvbiBBdCh0LGUsbil7dGhpcy54PXQ/PzAsdGhpcy55PWU/PzAsdGhpcy56PW4/PzB9dmFyIEdsLF8xLGtsLE9tLGVDLG1yLGpjLGEsTHQ9JCgoKT0+e1d0KCk7ZnQoKTtqdCgpO0t0KCk7QXQuZnJvbVNwaGVyaWNhbD1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgic3BoZXJpY2FsIix0KSxoKGUpfHwoZT1uZXcgQXQpO2xldCBuPXQuY2xvY2ssbz10LmNvbmUscj10Lm1hZ25pdHVkZT8/MSxpPXIqTWF0aC5zaW4obyk7cmV0dXJuIGUueD1pKk1hdGguY29zKG4pLGUueT1pKk1hdGguc2luKG4pLGUuej1yKk1hdGguY29zKG8pLGV9O0F0LmZyb21FbGVtZW50cz1mdW5jdGlvbih0LGUsbixvKXtyZXR1cm4gaChvKT8oby54PXQsby55PWUsby56PW4sbyk6bmV3IEF0KHQsZSxuKX07QXQuY2xvbmU9ZnVuY3Rpb24odCxlKXtpZihoKHQpKXJldHVybiBoKGUpPyhlLng9dC54LGUueT10LnksZS56PXQueixlKTpuZXcgQXQodC54LHQueSx0LnopfTtBdC5mcm9tQ2FydGVzaWFuND1BdC5jbG9uZTtBdC5wYWNrZWRMZW5ndGg9MztBdC5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCkseS5kZWZpbmVkKCJhcnJheSIsZSksbj1uPz8wLGVbbisrXT10LngsZVtuKytdPXQueSxlW25dPXQueixlfTtBdC51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LmRlZmluZWQoImFycmF5Iix0KSxlPWU/PzAsaChuKXx8KG49bmV3IEF0KSxuLng9dFtlKytdLG4ueT10W2UrK10sbi56PXRbZV0sbn07QXQucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJhcnJheSIsdCk7bGV0IG49dC5sZW5ndGgsbz1uKjM7aWYoIWgoZSkpZT1uZXcgQXJyYXkobyk7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1vKXRocm93IG5ldyBEKCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMyBlbGVtZW50cyIpO2UubGVuZ3RoIT09byYmKGUubGVuZ3RoPW8pfWZvcihsZXQgcj0wO3I8bjsrK3IpQXQucGFjayh0W3JdLGUsciozKTtyZXR1cm4gZX07QXQudW5wYWNrQXJyYXk9ZnVuY3Rpb24odCxlKXtpZih5LmRlZmluZWQoImFycmF5Iix0KSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiYXJyYXkubGVuZ3RoIix0Lmxlbmd0aCwzKSx0Lmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgRCgiYXJyYXkgbGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzLiIpO2xldCBuPXQubGVuZ3RoO2goZSk/ZS5sZW5ndGg9bi8zOmU9bmV3IEFycmF5KG4vMyk7Zm9yKGxldCBvPTA7bzxuO28rPTMpe2xldCByPW8vMztlW3JdPUF0LnVucGFjayh0LG8sZVtyXSl9cmV0dXJuIGV9O0F0LmZyb21BcnJheT1BdC51bnBhY2s7QXQubWF4aW11bUNvbXBvbmVudD1mdW5jdGlvbih0KXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLE1hdGgubWF4KHQueCx0LnksdC56KX07QXQubWluaW11bUNvbXBvbmVudD1mdW5jdGlvbih0KXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLE1hdGgubWluKHQueCx0LnksdC56KX07QXQubWluaW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCkseS50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5taW4odC54LGUueCksbi55PU1hdGgubWluKHQueSxlLnkpLG4uej1NYXRoLm1pbih0LnosZS56KSxufTtBdC5tYXhpbXVtQnlDb21wb25lbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImZpcnN0Iix0KSx5LnR5cGVPZi5vYmplY3QoInNlY29uZCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD1NYXRoLm1heCh0LngsZS54KSxuLnk9TWF0aC5tYXgodC55LGUueSksbi56PU1hdGgubWF4KHQueixlLnopLG59O0F0LmNsYW1wPWZ1bmN0aW9uKHQsZSxuLG8pe3kudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkudHlwZU9mLm9iamVjdCgibWluIixlKSx5LnR5cGVPZi5vYmplY3QoIm1heCIsbikseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG8pO2xldCByPVAuY2xhbXAodC54LGUueCxuLngpLGk9UC5jbGFtcCh0LnksZS55LG4ueSkscz1QLmNsYW1wKHQueixlLnosbi56KTtyZXR1cm4gby54PXIsby55PWksby56PXMsb307QXQubWFnbml0dWRlU3F1YXJlZD1mdW5jdGlvbih0KXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHQueCp0LngrdC55KnQueSt0LnoqdC56fTtBdC5tYWduaXR1ZGU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChBdC5tYWduaXR1ZGVTcXVhcmVkKHQpKX07R2w9bmV3IEF0O0F0LmRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksQXQuc3VidHJhY3QodCxlLEdsKSxBdC5tYWduaXR1ZGUoR2wpfTtBdC5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxBdC5zdWJ0cmFjdCh0LGUsR2wpLEF0Lm1hZ25pdHVkZVNxdWFyZWQoR2wpfTtBdC5ub3JtYWxpemU9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2xldCBuPUF0Lm1hZ25pdHVkZSh0KTtpZihlLng9dC54L24sZS55PXQueS9uLGUuej10Lnovbixpc05hTihlLngpfHxpc05hTihlLnkpfHxpc05hTihlLnopKXRocm93IG5ldyBEKCJub3JtYWxpemVkIHJlc3VsdCBpcyBub3QgYSBudW1iZXIiKTtyZXR1cm4gZX07QXQuZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueCt0LnkqZS55K3QueiplLnp9O0F0Lm11bHRpcGx5Q29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZS54LG4ueT10LnkqZS55LG4uej10LnoqZS56LG59O0F0LmRpdmlkZUNvbXBvbmVudHM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54L2UueCxuLnk9dC55L2UueSxuLno9dC56L2UueixufTtBdC5hZGQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54K2UueCxuLnk9dC55K2UueSxuLno9dC56K2UueixufTtBdC5zdWJ0cmFjdD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngtZS54LG4ueT10LnktZS55LG4uej10LnotZS56LG59O0F0Lm11bHRpcGx5QnlTY2FsYXI9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCkseS50eXBlT2YubnVtYmVyKCJzY2FsYXIiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54KmUsbi55PXQueSplLG4uej10LnoqZSxufTtBdC5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbi56PXQuei9lLG59O0F0Lm5lZ2F0ZT1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGUueD0tdC54LGUueT0tdC55LGUuej0tdC56LGV9O0F0LmFicz1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGUueD1NYXRoLmFicyh0LngpLGUueT1NYXRoLmFicyh0LnkpLGUuej1NYXRoLmFicyh0LnopLGV9O18xPW5ldyBBdDtBdC5sZXJwPWZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInN0YXJ0Iix0KSx5LnR5cGVPZi5vYmplY3QoImVuZCIsZSkseS50eXBlT2YubnVtYmVyKCJ0IixuKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbyksQXQubXVsdGlwbHlCeVNjYWxhcihlLG4sXzEpLG89QXQubXVsdGlwbHlCeVNjYWxhcih0LDEtbixvKSxBdC5hZGQoXzEsbyxvKX07a2w9bmV3IEF0LE9tPW5ldyBBdDtBdC5hbmdsZUJldHdlZW49ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLEF0Lm5vcm1hbGl6ZSh0LGtsKSxBdC5ub3JtYWxpemUoZSxPbSk7bGV0IG49QXQuZG90KGtsLE9tKSxvPUF0Lm1hZ25pdHVkZShBdC5jcm9zcyhrbCxPbSxrbCkpO3JldHVybiBNYXRoLmF0YW4yKG8sbil9O2VDPW5ldyBBdDtBdC5tb3N0T3J0aG9nb25hbEF4aXM9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2xldCBuPUF0Lm5vcm1hbGl6ZSh0LGVDKTtyZXR1cm4gQXQuYWJzKG4sbiksbi54PD1uLnk/bi54PD1uLno/ZT1BdC5jbG9uZShBdC5VTklUX1gsZSk6ZT1BdC5jbG9uZShBdC5VTklUX1osZSk6bi55PD1uLno/ZT1BdC5jbG9uZShBdC5VTklUX1ksZSk6ZT1BdC5jbG9uZShBdC5VTklUX1osZSksZX07QXQucHJvamVjdFZlY3Rvcj1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJhIix0KSx5LmRlZmluZWQoImIiLGUpLHkuZGVmaW5lZCgicmVzdWx0IixuKTtsZXQgbz1BdC5kb3QodCxlKS9BdC5kb3QoZSxlKTtyZXR1cm4gQXQubXVsdGlwbHlCeVNjYWxhcihlLG8sbil9O0F0LmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8aCh0KSYmaChlKSYmdC54PT09ZS54JiZ0Lnk9PT1lLnkmJnQuej09PWUuen07QXQuZXF1YWxzQXJyYXk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0Lng9PT1lW25dJiZ0Lnk9PT1lW24rMV0mJnQuej09PWVbbisyXX07QXQuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbixvKXtyZXR1cm4gdD09PWV8fGgodCkmJmgoZSkmJlAuZXF1YWxzRXBzaWxvbih0LngsZS54LG4sbykmJlAuZXF1YWxzRXBzaWxvbih0LnksZS55LG4sbykmJlAuZXF1YWxzRXBzaWxvbih0LnosZS56LG4sbyl9O0F0LmNyb3NzPWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz10Lngscj10LnksaT10Lnoscz1lLngsZj1lLnksdT1lLnosYz1yKnUtaSpmLGw9aSpzLW8qdSxwPW8qZi1yKnM7cmV0dXJuIG4ueD1jLG4ueT1sLG4uej1wLG59O0F0Lm1pZHBvaW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PSh0LngrZS54KSouNSxuLnk9KHQueStlLnkpKi41LG4uej0odC56K2UueikqLjUsbn07QXQuZnJvbURlZ3JlZXM9ZnVuY3Rpb24odCxlLG4sbyxyKXtyZXR1cm4geS50eXBlT2YubnVtYmVyKCJsb25naXR1ZGUiLHQpLHkudHlwZU9mLm51bWJlcigibGF0aXR1ZGUiLGUpLHQ9UC50b1JhZGlhbnModCksZT1QLnRvUmFkaWFucyhlKSxBdC5mcm9tUmFkaWFucyh0LGUsbixvLHIpfTttcj1uZXcgQXQsamM9bmV3IEF0O0F0Ll9lbGxpcHNvaWRSYWRpaVNxdWFyZWQ9bmV3IEF0KDYzNzgxMzcqNjM3ODEzNyw2Mzc4MTM3KjYzNzgxMzcsNjM1Njc1MjMxNDI0NTE3OWUtOSo2MzU2NzUyMzE0MjQ1MTc5ZS05KTtBdC5mcm9tUmFkaWFucz1mdW5jdGlvbih0LGUsbixvLHIpe3kudHlwZU9mLm51bWJlcigibG9uZ2l0dWRlIix0KSx5LnR5cGVPZi5udW1iZXIoImxhdGl0dWRlIixlKSxuPW4/PzA7bGV0IGk9aChvKT9vLnJhZGlpU3F1YXJlZDpBdC5fZWxsaXBzb2lkUmFkaWlTcXVhcmVkLHM9TWF0aC5jb3MoZSk7bXIueD1zKk1hdGguY29zKHQpLG1yLnk9cypNYXRoLnNpbih0KSxtci56PU1hdGguc2luKGUpLG1yPUF0Lm5vcm1hbGl6ZShtcixtciksQXQubXVsdGlwbHlDb21wb25lbnRzKGksbXIsamMpO2xldCBmPU1hdGguc3FydChBdC5kb3QobXIsamMpKTtyZXR1cm4gamM9QXQuZGl2aWRlQnlTY2FsYXIoamMsZixqYyksbXI9QXQubXVsdGlwbHlCeVNjYWxhcihtcixuLG1yKSxoKHIpfHwocj1uZXcgQXQpLEF0LmFkZChqYyxtcixyKX07QXQuZnJvbURlZ3JlZXNBcnJheT1mdW5jdGlvbih0LGUsbil7aWYoeS5kZWZpbmVkKCJjb29yZGluYXRlcyIsdCksdC5sZW5ndGg8Mnx8dC5sZW5ndGglMiE9PTApdGhyb3cgbmV3IEQoInRoZSBudW1iZXIgb2YgY29vcmRpbmF0ZXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIgYW5kIGF0IGxlYXN0IDIiKTtsZXQgbz10Lmxlbmd0aDtoKG4pP24ubGVuZ3RoPW8vMjpuPW5ldyBBcnJheShvLzIpO2ZvcihsZXQgcj0wO3I8bztyKz0yKXtsZXQgaT10W3JdLHM9dFtyKzFdLGY9ci8yO25bZl09QXQuZnJvbURlZ3JlZXMoaSxzLDAsZSxuW2ZdKX1yZXR1cm4gbn07QXQuZnJvbVJhZGlhbnNBcnJheT1mdW5jdGlvbih0LGUsbil7aWYoeS5kZWZpbmVkKCJjb29yZGluYXRlcyIsdCksdC5sZW5ndGg8Mnx8dC5sZW5ndGglMiE9PTApdGhyb3cgbmV3IEQoInRoZSBudW1iZXIgb2YgY29vcmRpbmF0ZXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIgYW5kIGF0IGxlYXN0IDIiKTtsZXQgbz10Lmxlbmd0aDtoKG4pP24ubGVuZ3RoPW8vMjpuPW5ldyBBcnJheShvLzIpO2ZvcihsZXQgcj0wO3I8bztyKz0yKXtsZXQgaT10W3JdLHM9dFtyKzFdLGY9ci8yO25bZl09QXQuZnJvbVJhZGlhbnMoaSxzLDAsZSxuW2ZdKX1yZXR1cm4gbn07QXQuZnJvbURlZ3JlZXNBcnJheUhlaWdodHM9ZnVuY3Rpb24odCxlLG4pe2lmKHkuZGVmaW5lZCgiY29vcmRpbmF0ZXMiLHQpLHQubGVuZ3RoPDN8fHQubGVuZ3RoJTMhPT0wKXRocm93IG5ldyBEKCJ0aGUgbnVtYmVyIG9mIGNvb3JkaW5hdGVzIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzIGFuZCBhdCBsZWFzdCAzIik7bGV0IG89dC5sZW5ndGg7aChuKT9uLmxlbmd0aD1vLzM6bj1uZXcgQXJyYXkoby8zKTtmb3IobGV0IHI9MDtyPG87cis9Myl7bGV0IGk9dFtyXSxzPXRbcisxXSxmPXRbcisyXSx1PXIvMztuW3VdPUF0LmZyb21EZWdyZWVzKGkscyxmLGUsblt1XSl9cmV0dXJuIG59O0F0LmZyb21SYWRpYW5zQXJyYXlIZWlnaHRzPWZ1bmN0aW9uKHQsZSxuKXtpZih5LmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwzfHx0Lmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgRCgidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMyBhbmQgYXQgbGVhc3QgMyIpO2xldCBvPXQubGVuZ3RoO2gobik/bi5sZW5ndGg9by8zOm49bmV3IEFycmF5KG8vMyk7Zm9yKGxldCByPTA7cjxvO3IrPTMpe2xldCBpPXRbcl0scz10W3IrMV0sZj10W3IrMl0sdT1yLzM7blt1XT1BdC5mcm9tUmFkaWFucyhpLHMsZixlLG5bdV0pfXJldHVybiBufTtBdC5aRVJPPU9iamVjdC5mcmVlemUobmV3IEF0KDAsMCwwKSk7QXQuT05FPU9iamVjdC5mcmVlemUobmV3IEF0KDEsMSwxKSk7QXQuVU5JVF9YPU9iamVjdC5mcmVlemUobmV3IEF0KDEsMCwwKSk7QXQuVU5JVF9ZPU9iamVjdC5mcmVlemUobmV3IEF0KDAsMSwwKSk7QXQuVU5JVF9aPU9iamVjdC5mcmVlemUobmV3IEF0KDAsMCwxKSk7QXQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiBBdC5jbG9uZSh0aGlzLHQpfTtBdC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBBdC5lcXVhbHModGhpcyx0KX07QXQucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiBBdC5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlLG4pfTtBdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5gKCR7dGhpcy54fSwgJHt0aGlzLnl9LCAke3RoaXMuen0pYH07YT1BdH0pO2Z1bmN0aW9uIHJDKHQsZSxuLG8scil7aWYoIWgodCkpdGhyb3cgbmV3IEQoImNhcnRlc2lhbiBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgRCgib25lT3ZlclJhZGlpIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBEKCJvbmVPdmVyUmFkaWlTcXVhcmVkIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG8pKXRocm93IG5ldyBEKCJjZW50ZXJUb2xlcmFuY2VTcXVhcmVkIGlzIHJlcXVpcmVkLiIpO2xldCBpPXQueCxzPXQueSxmPXQueix1PWUueCxjPWUueSxsPWUueixwPWkqaSp1KnUsZD1zKnMqYypjLG09ZipmKmwqbCxfPXArZCttLGc9TWF0aC5zcXJ0KDEvXyksYj1hLm11bHRpcGx5QnlTY2FsYXIodCxnLG5DKTtpZihfPG8pcmV0dXJuIGlzRmluaXRlKGcpP2EuY2xvbmUoYixyKTp2b2lkIDA7bGV0IFQ9bi54LE89bi55LEU9bi56LHc9b0M7dy54PWIueCpUKjIsdy55PWIueSpPKjIsdy56PWIueipFKjI7bGV0IEM9KDEtZykqYS5tYWduaXR1ZGUodCkvKC41KmEubWFnbml0dWRlKHcpKSxNPTAsTixGLEksdixCLEEsUyx4LEwseixqO2Rve0MtPU0sST0xLygxK0MqVCksdj0xLygxK0MqTyksQj0xLygxK0MqRSksQT1JKkksUz12KnYseD1CKkIsTD1BKkksej1TKnYsaj14KkIsTj1wKkErZCpTK20qeC0xLEY9cCpMKlQrZCp6Kk8rbSpqKkU7bGV0IGs9LTIqRjtNPU4va313aGlsZShNYXRoLmFicyhOKT5QLkVQU0lMT04xMik7cmV0dXJuIGgocik/KHIueD1pKkksci55PXMqdixyLno9ZipCLHIpOm5ldyBhKGkqSSxzKnYsZipCKX12YXIgbkMsb0MsVmwsRW09JCgoKT0+e0x0KCk7ZnQoKTtqdCgpO0t0KCk7bkM9bmV3IGEsb0M9bmV3IGE7Vmw9ckN9KTtmdW5jdGlvbiBfbih0LGUsbil7dGhpcy5sb25naXR1ZGU9dD8/MCx0aGlzLmxhdGl0dWRlPWU/PzAsdGhpcy5oZWlnaHQ9bj8/MH12YXIgaUMsc0MsY0MsY3QsSWU9JCgoKT0+e0x0KCk7V3QoKTtmdCgpO0t0KCk7RW0oKTtfbi5mcm9tUmFkaWFucz1mdW5jdGlvbih0LGUsbixvKXtyZXR1cm4geS50eXBlT2YubnVtYmVyKCJsb25naXR1ZGUiLHQpLHkudHlwZU9mLm51bWJlcigibGF0aXR1ZGUiLGUpLG49bj8/MCxoKG8pPyhvLmxvbmdpdHVkZT10LG8ubGF0aXR1ZGU9ZSxvLmhlaWdodD1uLG8pOm5ldyBfbih0LGUsbil9O19uLmZyb21EZWdyZWVzPWZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiB5LnR5cGVPZi5udW1iZXIoImxvbmdpdHVkZSIsdCkseS50eXBlT2YubnVtYmVyKCJsYXRpdHVkZSIsZSksdD1QLnRvUmFkaWFucyh0KSxlPVAudG9SYWRpYW5zKGUpLF9uLmZyb21SYWRpYW5zKHQsZSxuLG8pfTtpQz1uZXcgYSxzQz1uZXcgYSxjQz1uZXcgYTtfbi5fZWxsaXBzb2lkT25lT3ZlclJhZGlpPW5ldyBhKDEvNjM3ODEzNywxLzYzNzgxMzcsMS82MzU2NzUyMzE0MjQ1MTc5ZS05KTtfbi5fZWxsaXBzb2lkT25lT3ZlclJhZGlpU3F1YXJlZD1uZXcgYSgxLyg2Mzc4MTM3KjYzNzgxMzcpLDEvKDYzNzgxMzcqNjM3ODEzNyksMS8oNjM1Njc1MjMxNDI0NTE3OWUtOSo2MzU2NzUyMzE0MjQ1MTc5ZS05KSk7X24uX2VsbGlwc29pZENlbnRlclRvbGVyYW5jZVNxdWFyZWQ9UC5FUFNJTE9OMTtfbi5mcm9tQ2FydGVzaWFuPWZ1bmN0aW9uKHQsZSxuKXtsZXQgbz1oKGUpP2Uub25lT3ZlclJhZGlpOl9uLl9lbGxpcHNvaWRPbmVPdmVyUmFkaWkscj1oKGUpP2Uub25lT3ZlclJhZGlpU3F1YXJlZDpfbi5fZWxsaXBzb2lkT25lT3ZlclJhZGlpU3F1YXJlZCxpPWgoZSk/ZS5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZDpfbi5fZWxsaXBzb2lkQ2VudGVyVG9sZXJhbmNlU3F1YXJlZCxzPVZsKHQsbyxyLGksc0MpO2lmKCFoKHMpKXJldHVybjtsZXQgZj1hLm11bHRpcGx5Q29tcG9uZW50cyhzLHIsaUMpO2Y9YS5ub3JtYWxpemUoZixmKTtsZXQgdT1hLnN1YnRyYWN0KHQscyxjQyksYz1NYXRoLmF0YW4yKGYueSxmLngpLGw9TWF0aC5hc2luKGYueikscD1QLnNpZ24oYS5kb3QodSx0KSkqYS5tYWduaXR1ZGUodSk7cmV0dXJuIGgobik/KG4ubG9uZ2l0dWRlPWMsbi5sYXRpdHVkZT1sLG4uaGVpZ2h0PXAsbik6bmV3IF9uKGMsbCxwKX07X24udG9DYXJ0ZXNpYW49ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LmRlZmluZWQoImNhcnRvZ3JhcGhpYyIsdCksYS5mcm9tUmFkaWFucyh0LmxvbmdpdHVkZSx0LmxhdGl0dWRlLHQuaGVpZ2h0LGUsbil9O19uLmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYoaCh0KSlyZXR1cm4gaChlKT8oZS5sb25naXR1ZGU9dC5sb25naXR1ZGUsZS5sYXRpdHVkZT10LmxhdGl0dWRlLGUuaGVpZ2h0PXQuaGVpZ2h0LGUpOm5ldyBfbih0LmxvbmdpdHVkZSx0LmxhdGl0dWRlLHQuaGVpZ2h0KX07X24uZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxoKHQpJiZoKGUpJiZ0LmxvbmdpdHVkZT09PWUubG9uZ2l0dWRlJiZ0LmxhdGl0dWRlPT09ZS5sYXRpdHVkZSYmdC5oZWlnaHQ9PT1lLmhlaWdodH07X24uZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG49bj8/MCx0PT09ZXx8aCh0KSYmaChlKSYmTWF0aC5hYnModC5sb25naXR1ZGUtZS5sb25naXR1ZGUpPD1uJiZNYXRoLmFicyh0LmxhdGl0dWRlLWUubGF0aXR1ZGUpPD1uJiZNYXRoLmFicyh0LmhlaWdodC1lLmhlaWdodCk8PW59O19uLlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgX24oMCwwLDApKTtfbi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIF9uLmNsb25lKHRoaXMsdCl9O19uLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIF9uLmVxdWFscyh0aGlzLHQpfTtfbi5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUpe3JldHVybiBfbi5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlKX07X24ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuYCgke3RoaXMubG9uZ2l0dWRlfSwgJHt0aGlzLmxhdGl0dWRlfSwgJHt0aGlzLmhlaWdodH0pYH07Y3Q9X259KTtmdW5jdGlvbiB6dCh0LGUpe3RoaXMueD10Pz8wLHRoaXMueT1lPz8wfXZhciB6bCx5MSxnMSxBMSxhQyxKLFVlPSQoKCk9PntXdCgpO2Z0KCk7anQoKTtLdCgpO3p0LmZyb21FbGVtZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgobik/KG4ueD10LG4ueT1lLG4pOm5ldyB6dCh0LGUpfTt6dC5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKGgodCkpcmV0dXJuIGgoZSk/KGUueD10LngsZS55PXQueSxlKTpuZXcgenQodC54LHQueSl9O3p0LmZyb21DYXJ0ZXNpYW4zPXp0LmNsb25lO3p0LmZyb21DYXJ0ZXNpYW40PXp0LmNsb25lO3p0LnBhY2tlZExlbmd0aD0yO3p0LnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxuPW4/PzAsZVtuKytdPXQueCxlW25dPXQueSxlfTt6dC51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LmRlZmluZWQoImFycmF5Iix0KSxlPWU/PzAsaChuKXx8KG49bmV3IHp0KSxuLng9dFtlKytdLG4ueT10W2VdLG59O3p0LnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe3kuZGVmaW5lZCgiYXJyYXkiLHQpO2xldCBuPXQubGVuZ3RoLG89bioyO2lmKCFoKGUpKWU9bmV3IEFycmF5KG8pO2Vsc2V7aWYoIUFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoIT09byl0aHJvdyBuZXcgRCgiSWYgcmVzdWx0IGlzIGEgdHlwZWQgYXJyYXksIGl0IG11c3QgaGF2ZSBleGFjdGx5IGFycmF5Lmxlbmd0aCAqIDIgZWxlbWVudHMiKTtlLmxlbmd0aCE9PW8mJihlLmxlbmd0aD1vKX1mb3IobGV0IHI9MDtyPG47KytyKXp0LnBhY2sodFtyXSxlLHIqMik7cmV0dXJuIGV9O3p0LnVucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7aWYoeS5kZWZpbmVkKCJhcnJheSIsdCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImFycmF5Lmxlbmd0aCIsdC5sZW5ndGgsMiksdC5sZW5ndGglMiE9PTApdGhyb3cgbmV3IEQoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMi4iKTtsZXQgbj10Lmxlbmd0aDtoKGUpP2UubGVuZ3RoPW4vMjplPW5ldyBBcnJheShuLzIpO2ZvcihsZXQgbz0wO288bjtvKz0yKXtsZXQgcj1vLzI7ZVtyXT16dC51bnBhY2sodCxvLGVbcl0pfXJldHVybiBlfTt6dC5mcm9tQXJyYXk9enQudW5wYWNrO3p0Lm1heGltdW1Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxNYXRoLm1heCh0LngsdC55KX07enQubWluaW11bUNvbXBvbmVudD1mdW5jdGlvbih0KXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLE1hdGgubWluKHQueCx0LnkpfTt6dC5taW5pbXVtQnlDb21wb25lbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImZpcnN0Iix0KSx5LnR5cGVPZi5vYmplY3QoInNlY29uZCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD1NYXRoLm1pbih0LngsZS54KSxuLnk9TWF0aC5taW4odC55LGUueSksbn07enQubWF4aW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCkseS50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5tYXgodC54LGUueCksbi55PU1hdGgubWF4KHQueSxlLnkpLG59O3p0LmNsYW1wPWZ1bmN0aW9uKHQsZSxuLG8pe3kudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkudHlwZU9mLm9iamVjdCgibWluIixlKSx5LnR5cGVPZi5vYmplY3QoIm1heCIsbikseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG8pO2xldCByPVAuY2xhbXAodC54LGUueCxuLngpLGk9UC5jbGFtcCh0LnksZS55LG4ueSk7cmV0dXJuIG8ueD1yLG8ueT1pLG99O3p0Lm1hZ25pdHVkZVNxdWFyZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx0LngqdC54K3QueSp0Lnl9O3p0Lm1hZ25pdHVkZT1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KHp0Lm1hZ25pdHVkZVNxdWFyZWQodCkpfTt6bD1uZXcgenQ7enQuZGlzdGFuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx6dC5zdWJ0cmFjdCh0LGUsemwpLHp0Lm1hZ25pdHVkZSh6bCl9O3p0LmRpc3RhbmNlU3F1YXJlZD1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHp0LnN1YnRyYWN0KHQsZSx6bCksenQubWFnbml0dWRlU3F1YXJlZCh6bCl9O3p0Lm5vcm1hbGl6ZT1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7bGV0IG49enQubWFnbml0dWRlKHQpO2lmKGUueD10LngvbixlLnk9dC55L24saXNOYU4oZS54KXx8aXNOYU4oZS55KSl0aHJvdyBuZXcgRCgibm9ybWFsaXplZCByZXN1bHQgaXMgbm90IGEgbnVtYmVyIik7cmV0dXJuIGV9O3p0LmRvdD1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHQueCplLngrdC55KmUueX07enQuY3Jvc3M9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx0LngqZS55LXQueSplLnh9O3p0Lm11bHRpcGx5Q29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZS54LG4ueT10LnkqZS55LG59O3p0LmRpdmlkZUNvbXBvbmVudHM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54L2UueCxuLnk9dC55L2UueSxufTt6dC5hZGQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54K2UueCxuLnk9dC55K2UueSxufTt6dC5zdWJ0cmFjdD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngtZS54LG4ueT10LnktZS55LG59O3p0Lm11bHRpcGx5QnlTY2FsYXI9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCkseS50eXBlT2YubnVtYmVyKCJzY2FsYXIiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54KmUsbi55PXQueSplLG59O3p0LmRpdmlkZUJ5U2NhbGFyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHkudHlwZU9mLm51bWJlcigic2NhbGFyIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC9lLG4ueT10LnkvZSxufTt6dC5uZWdhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9LXQueCxlLnk9LXQueSxlfTt6dC5hYnM9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9TWF0aC5hYnModC54KSxlLnk9TWF0aC5hYnModC55KSxlfTt5MT1uZXcgenQ7enQubGVycD1mdW5jdGlvbih0LGUsbixvKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJzdGFydCIsdCkseS50eXBlT2Yub2JqZWN0KCJlbmQiLGUpLHkudHlwZU9mLm51bWJlcigidCIsbikseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG8pLHp0Lm11bHRpcGx5QnlTY2FsYXIoZSxuLHkxKSxvPXp0Lm11bHRpcGx5QnlTY2FsYXIodCwxLW4sbyksenQuYWRkKHkxLG8sbyl9O2cxPW5ldyB6dCxBMT1uZXcgenQ7enQuYW5nbGVCZXR3ZWVuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksenQubm9ybWFsaXplKHQsZzEpLHp0Lm5vcm1hbGl6ZShlLEExKSxQLmFjb3NDbGFtcGVkKHp0LmRvdChnMSxBMSkpfTthQz1uZXcgenQ7enQubW9zdE9ydGhvZ29uYWxBeGlzPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKTtsZXQgbj16dC5ub3JtYWxpemUodCxhQyk7cmV0dXJuIHp0LmFicyhuLG4pLG4ueDw9bi55P2U9enQuY2xvbmUoenQuVU5JVF9YLGUpOmU9enQuY2xvbmUoenQuVU5JVF9ZLGUpLGV9O3p0LmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8aCh0KSYmaChlKSYmdC54PT09ZS54JiZ0Lnk9PT1lLnl9O3p0LmVxdWFsc0FycmF5PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdC54PT09ZVtuXSYmdC55PT09ZVtuKzFdfTt6dC5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiB0PT09ZXx8aCh0KSYmaChlKSYmUC5lcXVhbHNFcHNpbG9uKHQueCxlLngsbixvKSYmUC5lcXVhbHNFcHNpbG9uKHQueSxlLnksbixvKX07enQuWkVSTz1PYmplY3QuZnJlZXplKG5ldyB6dCgwLDApKTt6dC5PTkU9T2JqZWN0LmZyZWV6ZShuZXcgenQoMSwxKSk7enQuVU5JVF9YPU9iamVjdC5mcmVlemUobmV3IHp0KDEsMCkpO3p0LlVOSVRfWT1PYmplY3QuZnJlZXplKG5ldyB6dCgwLDEpKTt6dC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIHp0LmNsb25lKHRoaXMsdCl9O3p0LnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIHp0LmVxdWFscyh0aGlzLHQpfTt6dC5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHp0LmVxdWFsc0Vwc2lsb24odGhpcyx0LGUsbil9O3p0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzLnh9LCAke3RoaXMueX0pYH07Sj16dH0pO2Z1bmN0aW9uIFQxKHQsZSxuLG8pe2U9ZT8/MCxuPW4/PzAsbz1vPz8wLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJ4IixlLDApLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJ5IixuLDApLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJ6IixvLDApLHQuX3JhZGlpPW5ldyBhKGUsbixvKSx0Ll9yYWRpaVNxdWFyZWQ9bmV3IGEoZSplLG4qbixvKm8pLHQuX3JhZGlpVG9UaGVGb3VydGg9bmV3IGEoZSplKmUqZSxuKm4qbipuLG8qbypvKm8pLHQuX29uZU92ZXJSYWRpaT1uZXcgYShlPT09MD8wOjEvZSxuPT09MD8wOjEvbixvPT09MD8wOjEvbyksdC5fb25lT3ZlclJhZGlpU3F1YXJlZD1uZXcgYShlPT09MD8wOjEvKGUqZSksbj09PTA/MDoxLyhuKm4pLG89PT0wPzA6MS8obypvKSksdC5fbWluaW11bVJhZGl1cz1NYXRoLm1pbihlLG4sbyksdC5fbWF4aW11bVJhZGl1cz1NYXRoLm1heChlLG4sbyksdC5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZD1QLkVQU0lMT04xLHQuX3JhZGlpU3F1YXJlZC56IT09MCYmKHQuX3NxdWFyZWRYT3ZlclNxdWFyZWRaPXQuX3JhZGlpU3F1YXJlZC54L3QuX3JhZGlpU3F1YXJlZC56KX1mdW5jdGlvbiB4ZSh0LGUsbil7dGhpcy5fcmFkaWk9dm9pZCAwLHRoaXMuX3JhZGlpU3F1YXJlZD12b2lkIDAsdGhpcy5fcmFkaWlUb1RoZUZvdXJ0aD12b2lkIDAsdGhpcy5fb25lT3ZlclJhZGlpPXZvaWQgMCx0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkPXZvaWQgMCx0aGlzLl9taW5pbXVtUmFkaXVzPXZvaWQgMCx0aGlzLl9tYXhpbXVtUmFkaXVzPXZvaWQgMCx0aGlzLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkPXZvaWQgMCx0aGlzLl9zcXVhcmVkWE92ZXJTcXVhcmVkWj12b2lkIDAsVDEodGhpcyx0LGUsbil9ZnVuY3Rpb24gYjEodCxlLG4pe3kudHlwZU9mLm51bWJlcigiYSIsdCkseS50eXBlT2YubnVtYmVyKCJiIixlKSx5LnR5cGVPZi5mdW5jKCJmdW5jIixuKTtsZXQgbz0uNSooZSt0KSxyPS41KihlLXQpLGk9MDtmb3IobGV0IHM9MDtzPDU7cysrKXtsZXQgZj1yKmhDW3NdO2krPV9DW3NdKihuKG8rZikrbihvLWYpKX1yZXR1cm4gaSo9cixpfXZhciBmQyx1QyxsQyxwQyxkQyxtQyxoQyxfQyxZLCR0PSQoKCk9PntVZSgpO0x0KCk7SWUoKTtXdCgpO2Z0KCk7anQoKTtLdCgpO0VtKCk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeGUucHJvdG90eXBlLHtyYWRpaTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpfX0scmFkaWlTcXVhcmVkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaWlTcXVhcmVkfX0scmFkaWlUb1RoZUZvdXJ0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpVG9UaGVGb3VydGh9fSxvbmVPdmVyUmFkaWk6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbmVPdmVyUmFkaWl9fSxvbmVPdmVyUmFkaWlTcXVhcmVkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25lT3ZlclJhZGlpU3F1YXJlZH19LG1pbmltdW1SYWRpdXM6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9taW5pbXVtUmFkaXVzfX0sbWF4aW11bVJhZGl1czp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heGltdW1SYWRpdXN9fX0pO3hlLmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpcmV0dXJuO2xldCBuPXQuX3JhZGlpO3JldHVybiBoKGUpPyhhLmNsb25lKG4sZS5fcmFkaWkpLGEuY2xvbmUodC5fcmFkaWlTcXVhcmVkLGUuX3JhZGlpU3F1YXJlZCksYS5jbG9uZSh0Ll9yYWRpaVRvVGhlRm91cnRoLGUuX3JhZGlpVG9UaGVGb3VydGgpLGEuY2xvbmUodC5fb25lT3ZlclJhZGlpLGUuX29uZU92ZXJSYWRpaSksYS5jbG9uZSh0Ll9vbmVPdmVyUmFkaWlTcXVhcmVkLGUuX29uZU92ZXJSYWRpaVNxdWFyZWQpLGUuX21pbmltdW1SYWRpdXM9dC5fbWluaW11bVJhZGl1cyxlLl9tYXhpbXVtUmFkaXVzPXQuX21heGltdW1SYWRpdXMsZS5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZD10Ll9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkLGUpOm5ldyB4ZShuLngsbi55LG4ueil9O3hlLmZyb21DYXJ0ZXNpYW4zPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgoZSl8fChlPW5ldyB4ZSksaCh0KSYmVDEoZSx0LngsdC55LHQueiksZX07eGUuV0dTODQ9T2JqZWN0LmZyZWV6ZShuZXcgeGUoNjM3ODEzNyw2Mzc4MTM3LDYzNTY3NTIzMTQyNDUxNzllLTkpKTt4ZS5VTklUX1NQSEVSRT1PYmplY3QuZnJlZXplKG5ldyB4ZSgxLDEsMSkpO3hlLk1PT049T2JqZWN0LmZyZWV6ZShuZXcgeGUoUC5MVU5BUl9SQURJVVMsUC5MVU5BUl9SQURJVVMsUC5MVU5BUl9SQURJVVMpKTt4ZS5fZGVmYXVsdD14ZS5XR1M4NDtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh4ZSx7ZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHhlLl9kZWZhdWx0fSxzZXQ6ZnVuY3Rpb24odCl7eS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCkseGUuX2RlZmF1bHQ9dCxhLl9lbGxpcHNvaWRSYWRpaVNxdWFyZWQ9dC5yYWRpaVNxdWFyZWQsY3QuX2VsbGlwc29pZE9uZU92ZXJSYWRpaT10Lm9uZU92ZXJSYWRpaSxjdC5fZWxsaXBzb2lkT25lT3ZlclJhZGlpU3F1YXJlZD10Lm9uZU92ZXJSYWRpaVNxdWFyZWQsY3QuX2VsbGlwc29pZENlbnRlclRvbGVyYW5jZVNxdWFyZWQ9dC5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZH19fSk7eGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiB4ZS5jbG9uZSh0aGlzLHQpfTt4ZS5wYWNrZWRMZW5ndGg9YS5wYWNrZWRMZW5ndGg7eGUucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49bj8/MCxhLnBhY2sodC5fcmFkaWksZSxuKSxlfTt4ZS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3kuZGVmaW5lZCgiYXJyYXkiLHQpLGU9ZT8/MDtsZXQgbz1hLnVucGFjayh0LGUpO3JldHVybiB4ZS5mcm9tQ2FydGVzaWFuMyhvLG4pfTt4ZS5wcm90b3R5cGUuZ2VvY2VudHJpY1N1cmZhY2VOb3JtYWw9YS5ub3JtYWxpemU7eGUucHJvdG90eXBlLmdlb2RldGljU3VyZmFjZU5vcm1hbENhcnRvZ3JhcGhpYz1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgiY2FydG9ncmFwaGljIix0KTtsZXQgbj10LmxvbmdpdHVkZSxvPXQubGF0aXR1ZGUscj1NYXRoLmNvcyhvKSxpPXIqTWF0aC5jb3Mobikscz1yKk1hdGguc2luKG4pLGY9TWF0aC5zaW4obyk7cmV0dXJuIGgoZSl8fChlPW5ldyBhKSxlLng9aSxlLnk9cyxlLno9ZixhLm5vcm1hbGl6ZShlLGUpfTt4ZS5wcm90b3R5cGUuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsPWZ1bmN0aW9uKHQsZSl7aWYoeS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGlzTmFOKHQueCl8fGlzTmFOKHQueSl8fGlzTmFOKHQueikpdGhyb3cgbmV3IEQoImNhcnRlc2lhbiBoYXMgYSBOYU4gY29tcG9uZW50Iik7aWYoIWEuZXF1YWxzRXBzaWxvbih0LGEuWkVSTyxQLkVQU0lMT04xNCkpcmV0dXJuIGgoZSl8fChlPW5ldyBhKSxlPWEubXVsdGlwbHlDb21wb25lbnRzKHQsdGhpcy5fb25lT3ZlclJhZGlpU3F1YXJlZCxlKSxhLm5vcm1hbGl6ZShlLGUpfTtmQz1uZXcgYSx1Qz1uZXcgYTt4ZS5wcm90b3R5cGUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW49ZnVuY3Rpb24odCxlKXtsZXQgbj1mQyxvPXVDO3RoaXMuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsQ2FydG9ncmFwaGljKHQsbiksYS5tdWx0aXBseUNvbXBvbmVudHModGhpcy5fcmFkaWlTcXVhcmVkLG4sbyk7bGV0IHI9TWF0aC5zcXJ0KGEuZG90KG4sbykpO3JldHVybiBhLmRpdmlkZUJ5U2NhbGFyKG8scixvKSxhLm11bHRpcGx5QnlTY2FsYXIobix0LmhlaWdodCxuKSxoKGUpfHwoZT1uZXcgYSksYS5hZGQobyxuLGUpfTt4ZS5wcm90b3R5cGUuY2FydG9ncmFwaGljQXJyYXlUb0NhcnRlc2lhbkFycmF5PWZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJjYXJ0b2dyYXBoaWNzIix0KTtsZXQgbj10Lmxlbmd0aDtoKGUpP2UubGVuZ3RoPW46ZT1uZXcgQXJyYXkobik7Zm9yKGxldCBvPTA7bzxuO28rKyllW29dPXRoaXMuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4odFtvXSxlW29dKTtyZXR1cm4gZX07bEM9bmV3IGEscEM9bmV3IGEsZEM9bmV3IGE7eGUucHJvdG90eXBlLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljPWZ1bmN0aW9uKHQsZSl7bGV0IG49dGhpcy5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKHQscEMpO2lmKCFoKG4pKXJldHVybjtsZXQgbz10aGlzLmdlb2RldGljU3VyZmFjZU5vcm1hbChuLGxDKSxyPWEuc3VidHJhY3QodCxuLGRDKSxpPU1hdGguYXRhbjIoby55LG8ueCkscz1NYXRoLmFzaW4oby56KSxmPVAuc2lnbihhLmRvdChyLHQpKSphLm1hZ25pdHVkZShyKTtyZXR1cm4gaChlKT8oZS5sb25naXR1ZGU9aSxlLmxhdGl0dWRlPXMsZS5oZWlnaHQ9ZixlKTpuZXcgY3QoaSxzLGYpfTt4ZS5wcm90b3R5cGUuY2FydGVzaWFuQXJyYXlUb0NhcnRvZ3JhcGhpY0FycmF5PWZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJjYXJ0ZXNpYW5zIix0KTtsZXQgbj10Lmxlbmd0aDtoKGUpP2UubGVuZ3RoPW46ZT1uZXcgQXJyYXkobik7Zm9yKGxldCBvPTA7bzxuOysrbyllW29dPXRoaXMuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWModFtvXSxlW29dKTtyZXR1cm4gZX07eGUucHJvdG90eXBlLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gVmwodCx0aGlzLl9vbmVPdmVyUmFkaWksdGhpcy5fb25lT3ZlclJhZGlpU3F1YXJlZCx0aGlzLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkLGUpfTt4ZS5wcm90b3R5cGUuc2NhbGVUb0dlb2NlbnRyaWNTdXJmYWNlPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgoZSl8fChlPW5ldyBhKTtsZXQgbj10Lngsbz10Lnkscj10LnosaT10aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkLHM9MS9NYXRoLnNxcnQobipuKmkueCtvKm8qaS55K3IqcippLnopO3JldHVybiBhLm11bHRpcGx5QnlTY2FsYXIodCxzLGUpfTt4ZS5wcm90b3R5cGUudHJhbnNmb3JtUG9zaXRpb25Ub1NjYWxlZFNwYWNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgoZSl8fChlPW5ldyBhKSxhLm11bHRpcGx5Q29tcG9uZW50cyh0LHRoaXMuX29uZU92ZXJSYWRpaSxlKX07eGUucHJvdG90eXBlLnRyYW5zZm9ybVBvc2l0aW9uRnJvbVNjYWxlZFNwYWNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgoZSl8fChlPW5ldyBhKSxhLm11bHRpcGx5Q29tcG9uZW50cyh0LHRoaXMuX3JhZGlpLGUpfTt4ZS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzPT09dHx8aCh0KSYmYS5lcXVhbHModGhpcy5fcmFkaWksdC5fcmFkaWkpfTt4ZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaWkudG9TdHJpbmcoKX07eGUucHJvdG90eXBlLmdldFN1cmZhY2VOb3JtYWxJbnRlcnNlY3Rpb25XaXRoWkF4aXM9ZnVuY3Rpb24odCxlLG4pe2lmKHkudHlwZU9mLm9iamVjdCgicG9zaXRpb24iLHQpLCFQLmVxdWFsc0Vwc2lsb24odGhpcy5fcmFkaWkueCx0aGlzLl9yYWRpaS55LFAuRVBTSUxPTjE1KSl0aHJvdyBuZXcgRCgiRWxsaXBzb2lkIG11c3QgYmUgYW4gZWxsaXBzb2lkIG9mIHJldm9sdXRpb24gKHJhZGlpLnggPT0gcmFkaWkueSkiKTt5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW4oIkVsbGlwc29pZC5yYWRpaS56Iix0aGlzLl9yYWRpaS56LDApLGU9ZT8/MDtsZXQgbz10aGlzLl9zcXVhcmVkWE92ZXJTcXVhcmVkWjtpZihoKG4pfHwobj1uZXcgYSksbi54PTAsbi55PTAsbi56PXQueiooMS1vKSwhKE1hdGguYWJzKG4ueik+PXRoaXMuX3JhZGlpLnotZSkpcmV0dXJuIG59O21DPW5ldyBhO3hlLnByb3RvdHlwZS5nZXRMb2NhbEN1cnZhdHVyZT1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgic3VyZmFjZVBvc2l0aW9uIix0KSxoKGUpfHwoZT1uZXcgSik7bGV0IG49dGhpcy5nZXRTdXJmYWNlTm9ybWFsSW50ZXJzZWN0aW9uV2l0aFpBeGlzKHQsMCxtQyksbz1hLmRpc3RhbmNlKHQsbikscj10aGlzLm1pbmltdW1SYWRpdXMqby90aGlzLm1heGltdW1SYWRpdXMqKjIsaT1vKnIqKjI7cmV0dXJuIEouZnJvbUVsZW1lbnRzKDEvbywxL2ksZSl9O2hDPVsuMTQ4ODc0MzM4OTgxNjMsLjQzMzM5NTM5NDEyOTI1LC42Nzk0MDk1NjgyOTkwMiwuODY1MDYzMzY2Njg4OTgsLjk3MzkwNjUyODUxNzE3LDBdLF9DPVsuMjk1NTI0MjI0NzE0NzUsLjI2OTI2NjcxOTMwOTk5LC4yMTkwODYzNjI1MTU5OCwuMTQ5NDUxMzQ5MTUwNTgsLjA2NjY3MTM0NDMwODY4NCwwXTt4ZS5wcm90b3R5cGUuc3VyZmFjZUFyZWE9ZnVuY3Rpb24odCl7eS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpO2xldCBlPXQud2VzdCxuPXQuZWFzdCxvPXQuc291dGgscj10Lm5vcnRoO2Zvcig7bjxlOyluKz1QLlRXT19QSTtsZXQgaT10aGlzLl9yYWRpaVNxdWFyZWQscz1pLngsZj1pLnksdT1pLnosYz1zKmY7cmV0dXJuIGIxKG8scixmdW5jdGlvbihsKXtsZXQgcD1NYXRoLmNvcyhsKSxkPU1hdGguc2luKGwpO3JldHVybiBNYXRoLmNvcyhsKSpiMShlLG4sZnVuY3Rpb24obSl7bGV0IF89TWF0aC5jb3MobSksZz1NYXRoLnNpbihtKTtyZXR1cm4gTWF0aC5zcXJ0KGMqZCpkK3UqKGYqXypfK3MqZypnKSpwKnApfSl9KX07WT14ZX0pO2Z1bmN0aW9uIGpsKHQpe3RoaXMuX2VsbGlwc29pZD10Pz9ZLmRlZmF1bHQsdGhpcy5fc2VtaW1ham9yQXhpcz10aGlzLl9lbGxpcHNvaWQubWF4aW11bVJhZGl1cyx0aGlzLl9vbmVPdmVyU2VtaW1ham9yQXhpcz0xL3RoaXMuX3NlbWltYWpvckF4aXN9dmFyIEpuLFNpPSQoKCk9PntMdCgpO0llKCk7ZnQoKTtqdCgpOyR0KCk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoamwucHJvdG90eXBlLHtlbGxpcHNvaWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbGxpcHNvaWR9fX0pO2psLnByb3RvdHlwZS5wcm9qZWN0PWZ1bmN0aW9uKHQsZSl7bGV0IG49dGhpcy5fc2VtaW1ham9yQXhpcyxvPXQubG9uZ2l0dWRlKm4scj10LmxhdGl0dWRlKm4saT10LmhlaWdodDtyZXR1cm4gaChlKT8oZS54PW8sZS55PXIsZS56PWksZSk6bmV3IGEobyxyLGkpfTtqbC5wcm90b3R5cGUudW5wcm9qZWN0PWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEQoImNhcnRlc2lhbiBpcyByZXF1aXJlZCIpO2xldCBuPXRoaXMuX29uZU92ZXJTZW1pbWFqb3JBeGlzLG89dC54Km4scj10LnkqbixpPXQuejtyZXR1cm4gaChlKT8oZS5sb25naXR1ZGU9byxlLmxhdGl0dWRlPXIsZS5oZWlnaHQ9aSxlKTpuZXcgY3QobyxyLGkpfTtKbj1qbH0pO3ZhciB5QyxTbixHcz0kKCgpPT57eUM9e09VVFNJREU6LTEsSU5URVJTRUNUSU5HOjAsSU5TSURFOjF9LFNuPU9iamVjdC5mcmVlemUoeUMpfSk7ZnVuY3Rpb24gZ0ModCxlKXt0aGlzLnN0YXJ0PXQ/PzAsdGhpcy5zdG9wPWU/PzB9dmFyIFFyLEhsPSQoKCk9PntRcj1nQ30pO2Z1bmN0aW9uIFR0KHQsZSxuLG8scixpLHMsZix1KXt0aGlzWzBdPXQ/PzAsdGhpc1sxXT1vPz8wLHRoaXNbMl09cz8/MCx0aGlzWzNdPWU/PzAsdGhpc1s0XT1yPz8wLHRoaXNbNV09Zj8/MCx0aGlzWzZdPW4/PzAsdGhpc1s3XT1pPz8wLHRoaXNbOF09dT8/MH1mdW5jdGlvbiBPQyh0KXtsZXQgZT0wO2ZvcihsZXQgbj0wO248OTsrK24pe2xldCBvPXRbbl07ZSs9bypvfXJldHVybiBNYXRoLnNxcnQoZSl9ZnVuY3Rpb24gRUModCl7bGV0IGU9MDtmb3IobGV0IG49MDtuPDM7KytuKXtsZXQgbz10W1R0LmdldEVsZW1lbnRJbmRleChDbVtuXSxTbVtuXSldO2UrPTIqbypvfXJldHVybiBNYXRoLnNxcnQoZSl9ZnVuY3Rpb24gUkModCxlKXtsZXQgbj1QLkVQU0lMT04xNSxvPTAscj0xO2ZvcihsZXQgYz0wO2M8MzsrK2Mpe2xldCBsPU1hdGguYWJzKHRbVHQuZ2V0RWxlbWVudEluZGV4KENtW2NdLFNtW2NdKV0pO2w+byYmKHI9YyxvPWwpfWxldCBpPTEscz0wLGY9U21bcl0sdT1DbVtyXTtpZihNYXRoLmFicyh0W1R0LmdldEVsZW1lbnRJbmRleCh1LGYpXSk+bil7bGV0IGM9dFtUdC5nZXRFbGVtZW50SW5kZXgodSx1KV0sbD10W1R0LmdldEVsZW1lbnRJbmRleChmLGYpXSxwPXRbVHQuZ2V0RWxlbWVudEluZGV4KHUsZildLGQ9KGMtbCkvMi9wLG07ZDwwP209LTEvKC1kK01hdGguc3FydCgxK2QqZCkpOm09MS8oZCtNYXRoLnNxcnQoMStkKmQpKSxpPTEvTWF0aC5zcXJ0KDErbSptKSxzPW0qaX1yZXR1cm4gZT1UdC5jbG9uZShUdC5JREVOVElUWSxlKSxlW1R0LmdldEVsZW1lbnRJbmRleChmLGYpXT1lW1R0LmdldEVsZW1lbnRJbmRleCh1LHUpXT1pLGVbVHQuZ2V0RWxlbWVudEluZGV4KHUsZildPXMsZVtUdC5nZXRFbGVtZW50SW5kZXgoZix1KV09LXMsZX12YXIgQUMsYkMsUm0sdzEsVEMsd0MsU20sQ20scWwsTzEsU0MsWixCbj0kKCgpPT57THQoKTtXdCgpO2Z0KCk7anQoKTtLdCgpO1R0LnBhY2tlZExlbmd0aD05O1R0LnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxuPW4/PzAsZVtuKytdPXRbMF0sZVtuKytdPXRbMV0sZVtuKytdPXRbMl0sZVtuKytdPXRbM10sZVtuKytdPXRbNF0sZVtuKytdPXRbNV0sZVtuKytdPXRbNl0sZVtuKytdPXRbN10sZVtuKytdPXRbOF