/** * @license * Cesium - https://github.com/CesiumGS/cesium 案例https://sandcastle.cesium.com/ 有问题搜https://community.cesium.com/ * Version 1.118 更新于2024.6 * * 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 JSe=Object.create;var yM=Object.defineProperty;var QSe=Object.getOwnPropertyDescriptor;var jSe=Object.getOwnPropertyNames;var qSe=Object.getPrototypeOf,$Se=Object.prototype.hasOwnProperty;var xM=(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 Ic=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),eCe=(e,t)=>{for(var n in t)yM(e,n,{get:t[n],enumerable:!0})},z6=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of jSe(t))!$Se.call(e,o)&&o!==n&&yM(e,o,{get:()=>t[o],enumerable:!(i=QSe(t,o))||i.enumerable});return e};var T=(e,t,n)=>(n=e!=null?JSe(qSe(e)):{},z6(t||!e||!e.__esModule?yM(n,"default",{value:e,enumerable:!0}):n,e)),tCe=e=>z6(yM({},"__esModule",{value:!0}),e);var S=Ic(()=>{globalThis.CESIUM_WORKERS=atob("dmFyIENlc2l1bVdvcmtlcnM9KCgpPT57dmFyIHFTPU9iamVjdC5jcmVhdGU7dmFyIERsPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgS1M9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgV1M9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIFhTPU9iamVjdC5nZXRQcm90b3R5cGVPZixZUz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBkcj0odD0+dHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6dHlwZW9mIFByb3h5PCJ1Ij9uZXcgUHJveHkodCx7Z2V0OihlLG4pPT4odHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6ZSlbbl19KTp0KShmdW5jdGlvbih0KXtpZih0eXBlb2YgcmVxdWlyZTwidSIpcmV0dXJuIHJlcXVpcmUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3Rocm93IEVycm9yKCdEeW5hbWljIHJlcXVpcmUgb2YgIicrdCsnIiBpcyBub3Qgc3VwcG9ydGVkJyl9KSxwMT10PT5lPT57dmFyIG49dFtlXTtpZihuKXJldHVybiBuKCk7dGhyb3cgbmV3IEVycm9yKCJNb2R1bGUgbm90IGZvdW5kIGluIGJ1bmRsZTogIitlKX07dmFyIFo9KHQsZSk9PigpPT4odCYmKGU9dCh0PTApKSxlKTt2YXIgVm49KHQsZSk9PigpPT4oZXx8dCgoZT17ZXhwb3J0czp7fX0pLmV4cG9ydHMsZSksZS5leHBvcnRzKSxkZT0odCxlKT0+e2Zvcih2YXIgbiBpbiBlKURsKHQsbix7Z2V0OmVbbl0sZW51bWVyYWJsZTohMH0pfSxkMT0odCxlLG4sbyk9PntpZihlJiZ0eXBlb2YgZT09Im9iamVjdCJ8fHR5cGVvZiBlPT0iZnVuY3Rpb24iKWZvcihsZXQgciBvZiBXUyhlKSkhWVMuY2FsbCh0LHIpJiZyIT09biYmRGwodCxyLHtnZXQ6KCk9PmVbcl0sZW51bWVyYWJsZTohKG89S1MoZSxyKSl8fG8uZW51bWVyYWJsZX0pO3JldHVybiB0fTt2YXIgcnI9KHQsZSxuKT0+KG49dCE9bnVsbD9xUyhYUyh0KSk6e30sZDEoZXx8IXR8fCF0Ll9fZXNNb2R1bGU/RGwobiwiZGVmYXVsdCIse3ZhbHVlOnQsZW51bWVyYWJsZTohMH0pOm4sdCkpLCRTPXQ9PmQxKERsKHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0KTtmdW5jdGlvbiBaUyh0KXtyZXR1cm4gdCE9bnVsbH12YXIgaCxmdD1aKCgpPT57aD1aU30pO2Z1bmN0aW9uIFZzKHQpe3RoaXMubmFtZT0iRGV2ZWxvcGVyRXJyb3IiLHRoaXMubWVzc2FnZT10O2xldCBlO3RyeXt0aHJvdyBuZXcgRXJyb3J9Y2F0Y2gobil7ZT1uLnN0YWNrfXRoaXMuc3RhY2s9ZX12YXIgRixIdD1aKCgpPT57ZnQoKTtoKE9iamVjdC5jcmVhdGUpJiYoVnMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSxWcy5wcm90b3R5cGUuY29uc3RydWN0b3I9VnMpO1ZzLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2xldCB0PWAke3RoaXMubmFtZX06ICR7dGhpcy5tZXNzYWdlfWA7cmV0dXJuIGgodGhpcy5zdGFjaykmJih0Kz1gCiR7dGhpcy5zdGFjay50b1N0cmluZygpfWApLHR9O1ZzLnRocm93SW5zdGFudGlhdGlvbkVycm9yPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFZzKCJUaGlzIGZ1bmN0aW9uIGRlZmluZXMgYW4gaW50ZXJmYWNlIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4iKX07Rj1Wc30pO2Z1bmN0aW9uIFFTKHQpe3JldHVybmAke3R9IGlzIHJlcXVpcmVkLCBhY3R1YWwgdmFsdWUgd2FzIHVuZGVmaW5lZGB9ZnVuY3Rpb24gemModCxlLG4pe3JldHVybmBFeHBlY3RlZCAke259IHRvIGJlIHR5cGVvZiAke2V9LCBhY3R1YWwgdHlwZW9mIHdhcyAke3R9YH12YXIgWG4seSxYdD1aKCgpPT57ZnQoKTtIdCgpO1huPXt9O1huLnR5cGVPZj17fTtYbi5kZWZpbmVkPWZ1bmN0aW9uKHQsZSl7aWYoIWgoZSkpdGhyb3cgbmV3IEYoUVModCkpfTtYbi50eXBlT2YuZnVuYz1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0iZnVuY3Rpb24iKXRocm93IG5ldyBGKHpjKHR5cGVvZiBlLCJmdW5jdGlvbiIsdCkpfTtYbi50eXBlT2Yuc3RyaW5nPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJzdHJpbmciKXRocm93IG5ldyBGKHpjKHR5cGVvZiBlLCJzdHJpbmciLHQpKX07WG4udHlwZU9mLm51bWJlcj1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0ibnVtYmVyIil0aHJvdyBuZXcgRih6Yyh0eXBlb2YgZSwibnVtYmVyIix0KSl9O1huLnR5cGVPZi5udW1iZXIubGVzc1RoYW49ZnVuY3Rpb24odCxlLG4pe2lmKFhuLnR5cGVPZi5udW1iZXIodCxlKSxlPj1uKXRocm93IG5ldyBGKGBFeHBlY3RlZCAke3R9IHRvIGJlIGxlc3MgdGhhbiAke259LCBhY3R1YWwgdmFsdWUgd2FzICR7ZX1gKX07WG4udHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzPWZ1bmN0aW9uKHQsZSxuKXtpZihYbi50eXBlT2YubnVtYmVyKHQsZSksZT5uKXRocm93IG5ldyBGKGBFeHBlY3RlZCAke3R9IHRvIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAke259LCBhY3R1YWwgdmFsdWUgd2FzICR7ZX1gKX07WG4udHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbj1mdW5jdGlvbih0LGUsbil7aWYoWG4udHlwZU9mLm51bWJlcih0LGUpLGU8PW4pdGhyb3cgbmV3IEYoYEV4cGVjdGVkICR7dH0gdG8gYmUgZ3JlYXRlciB0aGFuICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfTtYbi50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKFhuLnR5cGVPZi5udW1iZXIodCxlKSxlPG4pdGhyb3cgbmV3IEYoYEV4cGVjdGVkICR7dH0gdG8gYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfTtYbi50eXBlT2Yub2JqZWN0PWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJvYmplY3QiKXRocm93IG5ldyBGKHpjKHR5cGVvZiBlLCJvYmplY3QiLHQpKX07WG4udHlwZU9mLmJvb2w9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9ImJvb2xlYW4iKXRocm93IG5ldyBGKHpjKHR5cGVvZiBlLCJib29sZWFuIix0KSl9O1huLnR5cGVPZi5iaWdpbnQ9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9ImJpZ2ludCIpdGhyb3cgbmV3IEYoemModHlwZW9mIGUsImJpZ2ludCIsdCkpfTtYbi50eXBlT2YubnVtYmVyLmVxdWFscz1mdW5jdGlvbih0LGUsbixvKXtpZihYbi50eXBlT2YubnVtYmVyKHQsbiksWG4udHlwZU9mLm51bWJlcihlLG8pLG4hPT1vKXRocm93IG5ldyBGKGAke3R9IG11c3QgYmUgZXF1YWwgdG8gJHtlfSwgdGhlIGFjdHVhbCB2YWx1ZXMgYXJlICR7bn0gYW5kICR7b31gKX07eT1Ybn0pO2Z1bmN0aW9uIG0xKHQsZSl7cmV0dXJuIHQ/P2V9dmFyIHgsSXQ9WigoKT0+e20xLkVNUFRZX09CSkVDVD1PYmplY3QuZnJlZXplKHt9KTt4PW0xfSk7dmFyIF8xPVZuKChxVixoMSk9Pnt2YXIgUmk9ZnVuY3Rpb24odCl7dD09bnVsbCYmKHQ9bmV3IERhdGUoKS5nZXRUaW1lKCkpLHRoaXMuTj02MjQsdGhpcy5NPTM5Nyx0aGlzLk1BVFJJWF9BPTI1Njc0ODM2MTUsdGhpcy5VUFBFUl9NQVNLPTIxNDc0ODM2NDgsdGhpcy5MT1dFUl9NQVNLPTIxNDc0ODM2NDcsdGhpcy5tdD1uZXcgQXJyYXkodGhpcy5OKSx0aGlzLm10aT10aGlzLk4rMSx0LmNvbnN0cnVjdG9yPT1BcnJheT90aGlzLmluaXRfYnlfYXJyYXkodCx0Lmxlbmd0aCk6dGhpcy5pbml0X3NlZWQodCl9O1JpLnByb3RvdHlwZS5pbml0X3NlZWQ9ZnVuY3Rpb24odCl7Zm9yKHRoaXMubXRbMF09dD4+PjAsdGhpcy5tdGk9MTt0aGlzLm10aTx0aGlzLk47dGhpcy5tdGkrKyl7dmFyIHQ9dGhpcy5tdFt0aGlzLm10aS0xXV50aGlzLm10W3RoaXMubXRpLTFdPj4+MzA7dGhpcy5tdFt0aGlzLm10aV09KCgodCY0Mjk0OTAxNzYwKT4+PjE2KSoxODEyNDMzMjUzPDwxNikrKHQmNjU1MzUpKjE4MTI0MzMyNTMrdGhpcy5tdGksdGhpcy5tdFt0aGlzLm10aV0+Pj49MH19O1JpLnByb3RvdHlwZS5pbml0X2J5X2FycmF5PWZ1bmN0aW9uKHQsZSl7dmFyIG4sbyxyO2Zvcih0aGlzLmluaXRfc2VlZCgxOTY1MDIxOCksbj0xLG89MCxyPXRoaXMuTj5lP3RoaXMuTjplO3I7ci0tKXt2YXIgaT10aGlzLm10W24tMV1edGhpcy5tdFtuLTFdPj4+MzA7dGhpcy5tdFtuXT0odGhpcy5tdFtuXV4oKChpJjQyOTQ5MDE3NjApPj4+MTYpKjE2NjQ1MjU8PDE2KSsoaSY2NTUzNSkqMTY2NDUyNSkrdFtvXStvLHRoaXMubXRbbl0+Pj49MCxuKyssbysrLG4+PXRoaXMuTiYmKHRoaXMubXRbMF09dGhpcy5tdFt0aGlzLk4tMV0sbj0xKSxvPj1lJiYobz0wKX1mb3Iocj10aGlzLk4tMTtyO3ItLSl7dmFyIGk9dGhpcy5tdFtuLTFdXnRoaXMubXRbbi0xXT4+PjMwO3RoaXMubXRbbl09KHRoaXMubXRbbl1eKCgoaSY0Mjk0OTAxNzYwKT4+PjE2KSoxNTY2MDgzOTQxPDwxNikrKGkmNjU1MzUpKjE1NjYwODM5NDEpLW4sdGhpcy5tdFtuXT4+Pj0wLG4rKyxuPj10aGlzLk4mJih0aGlzLm10WzBdPXRoaXMubXRbdGhpcy5OLTFdLG49MSl9dGhpcy5tdFswXT0yMTQ3NDgzNjQ4fTtSaS5wcm90b3R5cGUucmFuZG9tX2ludD1mdW5jdGlvbigpe3ZhciB0LGU9bmV3IEFycmF5KDAsdGhpcy5NQVRSSVhfQSk7aWYodGhpcy5tdGk+PXRoaXMuTil7dmFyIG47Zm9yKHRoaXMubXRpPT10aGlzLk4rMSYmdGhpcy5pbml0X3NlZWQoNTQ4OSksbj0wO248dGhpcy5OLXRoaXMuTTtuKyspdD10aGlzLm10W25dJnRoaXMuVVBQRVJfTUFTS3x0aGlzLm10W24rMV0mdGhpcy5MT1dFUl9NQVNLLHRoaXMubXRbbl09dGhpcy5tdFtuK3RoaXMuTV1edD4+PjFeZVt0JjFdO2Zvcig7bjx0aGlzLk4tMTtuKyspdD10aGlzLm10W25dJnRoaXMuVVBQRVJfTUFTS3x0aGlzLm10W24rMV0mdGhpcy5MT1dFUl9NQVNLLHRoaXMubXRbbl09dGhpcy5tdFtuKyh0aGlzLk0tdGhpcy5OKV1edD4+PjFeZVt0JjFdO3Q9dGhpcy5tdFt0aGlzLk4tMV0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbMF0mdGhpcy5MT1dFUl9NQVNLLHRoaXMubXRbdGhpcy5OLTFdPXRoaXMubXRbdGhpcy5NLTFdXnQ+Pj4xXmVbdCYxXSx0aGlzLm10aT0wfXJldHVybiB0PXRoaXMubXRbdGhpcy5tdGkrK10sdF49dD4+PjExLHRePXQ8PDcmMjYzNjkyODY0MCx0Xj10PDwxNSY0MDIyNzMwNzUyLHRePXQ+Pj4xOCx0Pj4+MH07UmkucHJvdG90eXBlLnJhbmRvbV9pbnQzMT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJhbmRvbV9pbnQoKT4+PjF9O1JpLnByb3RvdHlwZS5yYW5kb21faW5jbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJhbmRvbV9pbnQoKSooMS80Mjk0OTY3Mjk1KX07UmkucHJvdG90eXBlLnJhbmRvbT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJhbmRvbV9pbnQoKSooMS80Mjk0OTY3Mjk2KX07UmkucHJvdG90eXBlLnJhbmRvbV9leGNsPWZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMucmFuZG9tX2ludCgpKy41KSooMS80Mjk0OTY3Mjk2KX07UmkucHJvdG90eXBlLnJhbmRvbV9sb25nPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yYW5kb21faW50KCk+Pj41LGU9dGhpcy5yYW5kb21faW50KCk+Pj42O3JldHVybih0KjY3MTA4ODY0K2UpKigxLzkwMDcxOTkyNTQ3NDA5OTIpfTtoMS5leHBvcnRzPVJpfSk7dmFyIGJtLHh0LEZsLHkxLE0sV3Q9WigoKT0+e2JtPXJyKF8xKCksMSk7WHQoKTtJdCgpO2Z0KCk7SHQoKTt4dD17fTt4dC5FUFNJTE9OMT0uMTt4dC5FUFNJTE9OMj0uMDE7eHQuRVBTSUxPTjM9LjAwMTt4dC5FUFNJTE9OND0xZS00O3h0LkVQU0lMT041PTFlLTU7eHQuRVBTSUxPTjY9MWUtNjt4dC5FUFNJTE9ONz0xZS03O3h0LkVQU0lMT044PTFlLTg7eHQuRVBTSUxPTjk9MWUtOTt4dC5FUFNJTE9OMTA9MWUtMTA7eHQuRVBTSUxPTjExPTFlLTExO3h0LkVQU0lMT04xMj0xZS0xMjt4dC5FUFNJTE9OMTM9MWUtMTM7eHQuRVBTSUxPTjE0PTFlLTE0O3h0LkVQU0lMT04xNT0xZS0xNTt4dC5FUFNJTE9OMTY9MWUtMTY7eHQuRVBTSUxPTjE3PTFlLTE3O3h0LkVQU0lMT04xOD0xZS0xODt4dC5FUFNJTE9OMTk9MWUtMTk7eHQuRVBTSUxPTjIwPTFlLTIwO3h0LkVQU0lMT04yMT0xZS0yMTt4dC5HUkFWSVRBVElPTkFMUEFSQU1FVEVSPTM5ODYwMDQ0MThlNTt4dC5TT0xBUl9SQURJVVM9Njk1NWU1O3h0LkxVTkFSX1JBRElVUz0xNzM3NDAwO3h0LlNJWFRZX0ZPVVJfS0lMT0JZVEVTPTY0KjEwMjQ7eHQuRk9VUl9HSUdBQllURVM9NCoxMDI0KjEwMjQqMTAyNDt4dC5zaWduPXgoTWF0aC5zaWduLGZ1bmN0aW9uKGUpe3JldHVybiBlPStlLGU9PT0wfHxlIT09ZT9lOmU+MD8xOi0xfSk7eHQuc2lnbk5vdFplcm89ZnVuY3Rpb24odCl7cmV0dXJuIHQ8MD8tMToxfTt4dC50b1NOb3JtPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9eChlLDI1NSksTWF0aC5yb3VuZCgoeHQuY2xhbXAodCwtMSwxKSouNSsuNSkqZSl9O3h0LmZyb21TTm9ybT1mdW5jdGlvbih0LGUpe3JldHVybiBlPXgoZSwyNTUpLHh0LmNsYW1wKHQsMCxlKS9lKjItMX07eHQubm9ybWFsaXplPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbj1NYXRoLm1heChuLWUsMCksbj09PTA/MDp4dC5jbGFtcCgodC1lKS9uLDAsMSl9O3h0LnNpbmg9eChNYXRoLnNpbmgsZnVuY3Rpb24oZSl7cmV0dXJuKE1hdGguZXhwKGUpLU1hdGguZXhwKC1lKSkvMn0pO3h0LmNvc2g9eChNYXRoLmNvc2gsZnVuY3Rpb24oZSl7cmV0dXJuKE1hdGguZXhwKGUpK01hdGguZXhwKC1lKSkvMn0pO3h0LmxlcnA9ZnVuY3Rpb24odCxlLG4pe3JldHVybigxLW4pKnQrbiplfTt4dC5QST1NYXRoLlBJO3h0Lk9ORV9PVkVSX1BJPTEvTWF0aC5QSTt4dC5QSV9PVkVSX1RXTz1NYXRoLlBJLzI7eHQuUElfT1ZFUl9USFJFRT1NYXRoLlBJLzM7eHQuUElfT1ZFUl9GT1VSPU1hdGguUEkvNDt4dC5QSV9PVkVSX1NJWD1NYXRoLlBJLzY7eHQuVEhSRUVfUElfT1ZFUl9UV089MypNYXRoLlBJLzI7eHQuVFdPX1BJPTIqTWF0aC5QSTt4dC5PTkVfT1ZFUl9UV09fUEk9MS8oMipNYXRoLlBJKTt4dC5SQURJQU5TX1BFUl9ERUdSRUU9TWF0aC5QSS8xODA7eHQuREVHUkVFU19QRVJfUkFESUFOPTE4MC9NYXRoLlBJO3h0LlJBRElBTlNfUEVSX0FSQ1NFQ09ORD14dC5SQURJQU5TX1BFUl9ERUdSRUUvMzYwMDt4dC50b1JhZGlhbnM9ZnVuY3Rpb24odCl7aWYoIWgodCkpdGhyb3cgbmV3IEYoImRlZ3JlZXMgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQqeHQuUkFESUFOU19QRVJfREVHUkVFfTt4dC50b0RlZ3JlZXM9ZnVuY3Rpb24odCl7aWYoIWgodCkpdGhyb3cgbmV3IEYoInJhZGlhbnMgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQqeHQuREVHUkVFU19QRVJfUkFESUFOfTt4dC5jb252ZXJ0TG9uZ2l0dWRlUmFuZ2U9ZnVuY3Rpb24odCl7aWYoIWgodCkpdGhyb3cgbmV3IEYoImFuZ2xlIGlzIHJlcXVpcmVkLiIpO2xldCBlPXh0LlRXT19QSSxuPXQtTWF0aC5mbG9vcih0L2UpKmU7cmV0dXJuIG48LU1hdGguUEk/bitlOm4+PU1hdGguUEk/bi1lOm59O3h0LmNsYW1wVG9MYXRpdHVkZVJhbmdlPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBGKCJhbmdsZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4geHQuY2xhbXAodCwtMSp4dC5QSV9PVkVSX1RXTyx4dC5QSV9PVkVSX1RXTyl9O3h0Lm5lZ2F0aXZlUGlUb1BpPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBGKCJhbmdsZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdD49LXh0LlBJJiZ0PD14dC5QST90Onh0Lnplcm9Ub1R3b1BpKHQreHQuUEkpLXh0LlBJfTt4dC56ZXJvVG9Ud29QaT1mdW5jdGlvbih0KXtpZighaCh0KSl0aHJvdyBuZXcgRigiYW5nbGUgaXMgcmVxdWlyZWQuIik7aWYodD49MCYmdDw9eHQuVFdPX1BJKXJldHVybiB0O2xldCBlPXh0Lm1vZCh0LHh0LlRXT19QSSk7cmV0dXJuIE1hdGguYWJzKGUpPHh0LkVQU0lMT04xNCYmTWF0aC5hYnModCk+eHQuRVBTSUxPTjE0P3h0LlRXT19QSTplfTt4dC5tb2Q9ZnVuY3Rpb24odCxlKXtpZighaCh0KSl0aHJvdyBuZXcgRigibSBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgRigibiBpcyByZXF1aXJlZC4iKTtpZihlPT09MCl0aHJvdyBuZXcgRigiZGl2aXNvciBjYW5ub3QgYmUgMC4iKTtyZXR1cm4geHQuc2lnbih0KT09PXh0LnNpZ24oZSkmJk1hdGguYWJzKHQpPE1hdGguYWJzKGUpP3Q6KHQlZStlKSVlfTt4dC5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuLG8pe2lmKCFoKHQpKXRocm93IG5ldyBGKCJsZWZ0IGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBGKCJyaWdodCBpcyByZXF1aXJlZC4iKTtuPXgobiwwKSxvPXgobyxuKTtsZXQgcj1NYXRoLmFicyh0LWUpO3JldHVybiByPD1vfHxyPD1uKk1hdGgubWF4KE1hdGguYWJzKHQpLE1hdGguYWJzKGUpKX07eHQubGVzc1RoYW49ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBGKCJmaXJzdCBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgRigic2Vjb25kIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBGKCJhYnNvbHV0ZUVwc2lsb24gaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQtZTwtbn07eHQubGVzc1RoYW5PckVxdWFscz1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEYoImZpcnN0IGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBGKCJzZWNvbmQgaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEYoImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdC1lPG59O3h0LmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgRigiZmlyc3QgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEYoInNlY29uZCBpcyByZXF1aXJlZC4iKTtpZighaChuKSl0aHJvdyBuZXcgRigiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0LWU+bn07eHQuZ3JlYXRlclRoYW5PckVxdWFscz1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEYoImZpcnN0IGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBGKCJzZWNvbmQgaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEYoImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdC1lPi1ufTtGbD1bMV07eHQuZmFjdG9yaWFsPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwKXRocm93IG5ldyBGKCJBIG51bWJlciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCBpcyByZXF1aXJlZC4iKTtsZXQgZT1GbC5sZW5ndGg7aWYodD49ZSl7bGV0IG49RmxbZS0xXTtmb3IobGV0IG89ZTtvPD10O28rKyl7bGV0IHI9bipvO0ZsLnB1c2gociksbj1yfX1yZXR1cm4gRmxbdF19O3h0LmluY3JlbWVudFdyYXA9ZnVuY3Rpb24odCxlLG4pe2lmKG49eChuLDApLCFoKHQpKXRocm93IG5ldyBGKCJuIGlzIHJlcXVpcmVkLiIpO2lmKGU8PW4pdGhyb3cgbmV3IEYoIm1heGltdW1WYWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBtaW5pbXVtVmFsdWUuIik7cmV0dXJuKyt0LHQ+ZSYmKHQ9biksdH07eHQuaXNQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjQyOTQ5NjcyOTUpdGhyb3cgbmV3IEYoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQhPT0wJiYodCZ0LTEpPT09MH07eHQubmV4dFBvd2VyT2ZUd289ZnVuY3Rpb24odCl7aWYodHlwZW9mIHQhPSJudW1iZXIifHx0PDB8fHQ+MjE0NzQ4MzY0OCl0aHJvdyBuZXcgRigiQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAyXjMxIGlzIHJlcXVpcmVkLiIpO3JldHVybi0tdCx0fD10Pj4xLHR8PXQ+PjIsdHw9dD4+NCx0fD10Pj44LHR8PXQ+PjE2LCsrdCx0fTt4dC5wcmV2aW91c1Bvd2VyT2ZUd289ZnVuY3Rpb24odCl7aWYodHlwZW9mIHQhPSJudW1iZXIifHx0PDB8fHQ+NDI5NDk2NzI5NSl0aHJvdyBuZXcgRigiQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAoMl4zMiktMSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdHw9dD4+MSx0fD10Pj4yLHR8PXQ+PjQsdHw9dD4+OCx0fD10Pj4xNix0fD10Pj4zMix0PSh0Pj4+MCktKHQ+Pj4xKSx0fTt4dC5jbGFtcD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm51bWJlcigidmFsdWUiLHQpLHkudHlwZU9mLm51bWJlcigibWluIixlKSx5LnR5cGVPZi5udW1iZXIoIm1heCIsbiksdDxlP2U6dD5uP246dH07eTE9bmV3IGJtLmRlZmF1bHQ7eHQuc2V0UmFuZG9tTnVtYmVyU2VlZD1mdW5jdGlvbih0KXtpZighaCh0KSl0aHJvdyBuZXcgRigic2VlZCBpcyByZXF1aXJlZC4iKTt5MT1uZXcgYm0uZGVmYXVsdCh0KX07eHQubmV4dFJhbmRvbU51bWJlcj1mdW5jdGlvbigpe3JldHVybiB5MS5yYW5kb20oKX07eHQucmFuZG9tQmV0d2Vlbj1mdW5jdGlvbih0LGUpe3JldHVybiB4dC5uZXh0UmFuZG9tTnVtYmVyKCkqKGUtdCkrdH07eHQuYWNvc0NsYW1wZWQ9ZnVuY3Rpb24odCl7aWYoIWgodCkpdGhyb3cgbmV3IEYoInZhbHVlIGlzIHJlcXVpcmVkLiIpO3JldHVybiBNYXRoLmFjb3MoeHQuY2xhbXAodCwtMSwxKSl9O3h0LmFzaW5DbGFtcGVkPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBGKCJ2YWx1ZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gTWF0aC5hc2luKHh0LmNsYW1wKHQsLTEsMSkpfTt4dC5jaG9yZExlbmd0aD1mdW5jdGlvbih0LGUpe2lmKCFoKHQpKXRocm93IG5ldyBGKCJhbmdsZSBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgRigicmFkaXVzIGlzIHJlcXVpcmVkLiIpO3JldHVybiAyKmUqTWF0aC5zaW4odCouNSl9O3h0LmxvZ0Jhc2U9ZnVuY3Rpb24odCxlKXtpZighaCh0KSl0aHJvdyBuZXcgRigibnVtYmVyIGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBGKCJiYXNlIGlzIHJlcXVpcmVkLiIpO3JldHVybiBNYXRoLmxvZyh0KS9NYXRoLmxvZyhlKX07eHQuY2JydD14KE1hdGguY2JydCxmdW5jdGlvbihlKXtsZXQgbj1NYXRoLnBvdyhNYXRoLmFicyhlKSwuMzMzMzMzMzMzMzMzMzMzMyk7cmV0dXJuIGU8MD8tbjpufSk7eHQubG9nMj14KE1hdGgubG9nMixmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5sb2coZSkqTWF0aC5MT0cyRX0pO3h0LmZvZz1mdW5jdGlvbih0LGUpe2xldCBuPXQqZTtyZXR1cm4gMS1NYXRoLmV4cCgtKG4qbikpfTt4dC5mYXN0QXBwcm94aW1hdGVBdGFuPWZ1bmN0aW9uKHQpe3JldHVybiB5LnR5cGVPZi5udW1iZXIoIngiLHQpLHQqKC0uMTc4NCpNYXRoLmFicyh0KS0uMDY2Myp0KnQrMS4wMzAxKX07eHQuZmFzdEFwcHJveGltYXRlQXRhbjI9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5udW1iZXIoIngiLHQpLHkudHlwZU9mLm51bWJlcigieSIsZSk7bGV0IG4sbz1NYXRoLmFicyh0KTtuPU1hdGguYWJzKGUpO2xldCByPU1hdGgubWF4KG8sbik7bj1NYXRoLm1pbihvLG4pO2xldCBpPW4vcjtpZihpc05hTihpKSl0aHJvdyBuZXcgRigiZWl0aGVyIHggb3IgeSBtdXN0IGJlIG5vbnplcm8iKTtyZXR1cm4gbz14dC5mYXN0QXBwcm94aW1hdGVBdGFuKGkpLG89TWF0aC5hYnMoZSk+TWF0aC5hYnModCk/eHQuUElfT1ZFUl9UV08tbzpvLG89dDwwP3h0LlBJLW86byxvPWU8MD8tbzpvLG99O009eHR9KTtmdW5jdGlvbiB3dCh0LGUsbil7dGhpcy54PXgodCwwKSx0aGlzLnk9eChlLDApLHRoaXMuej14KG4sMCl9dmFyIFVsLGcxLEJsLHdtLEpTLG1yLGpjLHRDLGEsRnQ9WigoKT0+e1h0KCk7SXQoKTtmdCgpO0h0KCk7V3QoKTt3dC5mcm9tU3BoZXJpY2FsPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJzcGhlcmljYWwiLHQpLGgoZSl8fChlPW5ldyB3dCk7bGV0IG49dC5jbG9jayxvPXQuY29uZSxyPXgodC5tYWduaXR1ZGUsMSksaT1yKk1hdGguc2luKG8pO3JldHVybiBlLng9aSpNYXRoLmNvcyhuKSxlLnk9aSpNYXRoLnNpbihuKSxlLno9cipNYXRoLmNvcyhvKSxlfTt3dC5mcm9tRWxlbWVudHM9ZnVuY3Rpb24odCxlLG4sbyl7cmV0dXJuIGgobyk/KG8ueD10LG8ueT1lLG8uej1uLG8pOm5ldyB3dCh0LGUsbil9O3d0LmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYoaCh0KSlyZXR1cm4gaChlKT8oZS54PXQueCxlLnk9dC55LGUuej10LnosZSk6bmV3IHd0KHQueCx0LnksdC56KX07d3QuZnJvbUNhcnRlc2lhbjQ9d3QuY2xvbmU7d3QucGFja2VkTGVuZ3RoPTM7d3QucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49eChuLDApLGVbbisrXT10LngsZVtuKytdPXQueSxlW25dPXQueixlfTt3dC51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LmRlZmluZWQoImFycmF5Iix0KSxlPXgoZSwwKSxoKG4pfHwobj1uZXcgd3QpLG4ueD10W2UrK10sbi55PXRbZSsrXSxuLno9dFtlXSxufTt3dC5wYWNrQXJyYXk9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoImFycmF5Iix0KTtsZXQgbj10Lmxlbmd0aCxvPW4qMztpZighaChlKSllPW5ldyBBcnJheShvKTtlbHNle2lmKCFBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aCE9PW8pdGhyb3cgbmV3IEYoIklmIHJlc3VsdCBpcyBhIHR5cGVkIGFycmF5LCBpdCBtdXN0IGhhdmUgZXhhY3RseSBhcnJheS5sZW5ndGggKiAzIGVsZW1lbnRzIik7ZS5sZW5ndGghPT1vJiYoZS5sZW5ndGg9byl9Zm9yKGxldCByPTA7cjxuOysrcil3dC5wYWNrKHRbcl0sZSxyKjMpO3JldHVybiBlfTt3dC51bnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe2lmKHkuZGVmaW5lZCgiYXJyYXkiLHQpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJhcnJheS5sZW5ndGgiLHQubGVuZ3RoLDMpLHQubGVuZ3RoJTMhPT0wKXRocm93IG5ldyBGKCJhcnJheSBsZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMuIik7bGV0IG49dC5sZW5ndGg7aChlKT9lLmxlbmd0aD1uLzM6ZT1uZXcgQXJyYXkobi8zKTtmb3IobGV0IG89MDtvPG47bys9Myl7bGV0IHI9by8zO2Vbcl09d3QudW5wYWNrKHQsbyxlW3JdKX1yZXR1cm4gZX07d3QuZnJvbUFycmF5PXd0LnVucGFjazt3dC5tYXhpbXVtQ29tcG9uZW50PWZ1bmN0aW9uKHQpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksTWF0aC5tYXgodC54LHQueSx0LnopfTt3dC5taW5pbXVtQ29tcG9uZW50PWZ1bmN0aW9uKHQpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksTWF0aC5taW4odC54LHQueSx0LnopfTt3dC5taW5pbXVtQnlDb21wb25lbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImZpcnN0Iix0KSx5LnR5cGVPZi5vYmplY3QoInNlY29uZCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD1NYXRoLm1pbih0LngsZS54KSxuLnk9TWF0aC5taW4odC55LGUueSksbi56PU1hdGgubWluKHQueixlLnopLG59O3d0Lm1heGltdW1CeUNvbXBvbmVudD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiZmlyc3QiLHQpLHkudHlwZU9mLm9iamVjdCgic2Vjb25kIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PU1hdGgubWF4KHQueCxlLngpLG4ueT1NYXRoLm1heCh0LnksZS55KSxuLno9TWF0aC5tYXgodC56LGUueiksbn07d3QuY2xhbXA9ZnVuY3Rpb24odCxlLG4sbyl7eS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCkseS50eXBlT2Yub2JqZWN0KCJtaW4iLGUpLHkudHlwZU9mLm9iamVjdCgibWF4IixuKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbyk7bGV0IHI9TS5jbGFtcCh0LngsZS54LG4ueCksaT1NLmNsYW1wKHQueSxlLnksbi55KSxzPU0uY2xhbXAodC56LGUueixuLnopO3JldHVybiBvLng9cixvLnk9aSxvLno9cyxvfTt3dC5tYWduaXR1ZGVTcXVhcmVkPWZ1bmN0aW9uKHQpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksdC54KnQueCt0LnkqdC55K3Queip0Lnp9O3d0Lm1hZ25pdHVkZT1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KHd0Lm1hZ25pdHVkZVNxdWFyZWQodCkpfTtVbD1uZXcgd3Q7d3QuZGlzdGFuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx3dC5zdWJ0cmFjdCh0LGUsVWwpLHd0Lm1hZ25pdHVkZShVbCl9O3d0LmRpc3RhbmNlU3F1YXJlZD1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHd0LnN1YnRyYWN0KHQsZSxVbCksd3QubWFnbml0dWRlU3F1YXJlZChVbCl9O3d0Lm5vcm1hbGl6ZT1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7bGV0IG49d3QubWFnbml0dWRlKHQpO2lmKGUueD10LngvbixlLnk9dC55L24sZS56PXQuei9uLGlzTmFOKGUueCl8fGlzTmFOKGUueSl8fGlzTmFOKGUueikpdGhyb3cgbmV3IEYoIm5vcm1hbGl6ZWQgcmVzdWx0IGlzIG5vdCBhIG51bWJlciIpO3JldHVybiBlfTt3dC5kb3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx0LngqZS54K3QueSplLnkrdC56KmUuen07d3QubXVsdGlwbHlDb21wb25lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLngsbi55PXQueSplLnksbi56PXQueiplLnosbn07d3QuZGl2aWRlQ29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZS54LG4ueT10LnkvZS55LG4uej10LnovZS56LG59O3d0LmFkZD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngrZS54LG4ueT10LnkrZS55LG4uej10LnorZS56LG59O3d0LnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC1lLngsbi55PXQueS1lLnksbi56PXQuei1lLnosbn07d3QubXVsdGlwbHlCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZSxuLnk9dC55KmUsbi56PXQueiplLG59O3d0LmRpdmlkZUJ5U2NhbGFyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHkudHlwZU9mLm51bWJlcigic2NhbGFyIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC9lLG4ueT10LnkvZSxuLno9dC56L2Usbn07d3QubmVnYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZS54PS10LngsZS55PS10LnksZS56PS10LnosZX07d3QuYWJzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZS54PU1hdGguYWJzKHQueCksZS55PU1hdGguYWJzKHQueSksZS56PU1hdGguYWJzKHQueiksZX07ZzE9bmV3IHd0O3d0LmxlcnA9ZnVuY3Rpb24odCxlLG4sbyl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgic3RhcnQiLHQpLHkudHlwZU9mLm9iamVjdCgiZW5kIixlKSx5LnR5cGVPZi5udW1iZXIoInQiLG4pLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixvKSx3dC5tdWx0aXBseUJ5U2NhbGFyKGUsbixnMSksbz13dC5tdWx0aXBseUJ5U2NhbGFyKHQsMS1uLG8pLHd0LmFkZChnMSxvLG8pfTtCbD1uZXcgd3Qsd209bmV3IHd0O3d0LmFuZ2xlQmV0d2Vlbj1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksd3Qubm9ybWFsaXplKHQsQmwpLHd0Lm5vcm1hbGl6ZShlLHdtKTtsZXQgbj13dC5kb3QoQmwsd20pLG89d3QubWFnbml0dWRlKHd0LmNyb3NzKEJsLHdtLEJsKSk7cmV0dXJuIE1hdGguYXRhbjIobyxuKX07SlM9bmV3IHd0O3d0Lm1vc3RPcnRob2dvbmFsQXhpcz1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7bGV0IG49d3Qubm9ybWFsaXplKHQsSlMpO3JldHVybiB3dC5hYnMobixuKSxuLng8PW4ueT9uLng8PW4uej9lPXd0LmNsb25lKHd0LlVOSVRfWCxlKTplPXd0LmNsb25lKHd0LlVOSVRfWixlKTpuLnk8PW4uej9lPXd0LmNsb25lKHd0LlVOSVRfWSxlKTplPXd0LmNsb25lKHd0LlVOSVRfWixlKSxlfTt3dC5wcm9qZWN0VmVjdG9yPWZ1bmN0aW9uKHQsZSxuKXt5LmRlZmluZWQoImEiLHQpLHkuZGVmaW5lZCgiYiIsZSkseS5kZWZpbmVkKCJyZXN1bHQiLG4pO2xldCBvPXd0LmRvdCh0LGUpL3d0LmRvdChlLGUpO3JldHVybiB3dC5tdWx0aXBseUJ5U2NhbGFyKGUsbyxuKX07d3QuZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxoKHQpJiZoKGUpJiZ0Lng9PT1lLngmJnQueT09PWUueSYmdC56PT09ZS56fTt3dC5lcXVhbHNBcnJheT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQueD09PWVbbl0mJnQueT09PWVbbisxXSYmdC56PT09ZVtuKzJdfTt3dC5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiB0PT09ZXx8aCh0KSYmaChlKSYmTS5lcXVhbHNFcHNpbG9uKHQueCxlLngsbixvKSYmTS5lcXVhbHNFcHNpbG9uKHQueSxlLnksbixvKSYmTS5lcXVhbHNFcHNpbG9uKHQueixlLnosbixvKX07d3QuY3Jvc3M9ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pO2xldCBvPXQueCxyPXQueSxpPXQueixzPWUueCxmPWUueSx1PWUueixjPXIqdS1pKmYsbD1pKnMtbyp1LHA9bypmLXIqcztyZXR1cm4gbi54PWMsbi55PWwsbi56PXAsbn07d3QubWlkcG9pbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9KHQueCtlLngpKi41LG4ueT0odC55K2UueSkqLjUsbi56PSh0LnorZS56KSouNSxufTt3dC5mcm9tRGVncmVlcz1mdW5jdGlvbih0LGUsbixvLHIpe3JldHVybiB5LnR5cGVPZi5udW1iZXIoImxvbmdpdHVkZSIsdCkseS50eXBlT2YubnVtYmVyKCJsYXRpdHVkZSIsZSksdD1NLnRvUmFkaWFucyh0KSxlPU0udG9SYWRpYW5zKGUpLHd0LmZyb21SYWRpYW5zKHQsZSxuLG8scil9O21yPW5ldyB3dCxqYz1uZXcgd3QsdEM9bmV3IHd0KDYzNzgxMzcqNjM3ODEzNyw2Mzc4MTM3KjYzNzgxMzcsNjM1Njc1MjMxNDI0NTE3OWUtOSo2MzU2NzUyMzE0MjQ1MTc5ZS05KTt3dC5mcm9tUmFkaWFucz1mdW5jdGlvbih0LGUsbixvLHIpe3kudHlwZU9mLm51bWJlcigibG9uZ2l0dWRlIix0KSx5LnR5cGVPZi5udW1iZXIoImxhdGl0dWRlIixlKSxuPXgobiwwKTtsZXQgaT1oKG8pP28ucmFkaWlTcXVhcmVkOnRDLHM9TWF0aC5jb3MoZSk7bXIueD1zKk1hdGguY29zKHQpLG1yLnk9cypNYXRoLnNpbih0KSxtci56PU1hdGguc2luKGUpLG1yPXd0Lm5vcm1hbGl6ZShtcixtciksd3QubXVsdGlwbHlDb21wb25lbnRzKGksbXIsamMpO2xldCBmPU1hdGguc3FydCh3dC5kb3QobXIsamMpKTtyZXR1cm4gamM9d3QuZGl2aWRlQnlTY2FsYXIoamMsZixqYyksbXI9d3QubXVsdGlwbHlCeVNjYWxhcihtcixuLG1yKSxoKHIpfHwocj1uZXcgd3QpLHd0LmFkZChqYyxtcixyKX07d3QuZnJvbURlZ3JlZXNBcnJheT1mdW5jdGlvbih0LGUsbil7aWYoeS5kZWZpbmVkKCJjb29yZGluYXRlcyIsdCksdC5sZW5ndGg8Mnx8dC5sZW5ndGglMiE9PTApdGhyb3cgbmV3IEYoInRoZSBudW1iZXIgb2YgY29vcmRpbmF0ZXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIgYW5kIGF0IGxlYXN0IDIiKTtsZXQgbz10Lmxlbmd0aDtoKG4pP24ubGVuZ3RoPW8vMjpuPW5ldyBBcnJheShvLzIpO2ZvcihsZXQgcj0wO3I8bztyKz0yKXtsZXQgaT10W3JdLHM9dFtyKzFdLGY9ci8yO25bZl09d3QuZnJvbURlZ3JlZXMoaSxzLDAsZSxuW2ZdKX1yZXR1cm4gbn07d3QuZnJvbVJhZGlhbnNBcnJheT1mdW5jdGlvbih0LGUsbil7aWYoeS5kZWZpbmVkKCJjb29yZGluYXRlcyIsdCksdC5sZW5ndGg8Mnx8dC5sZW5ndGglMiE9PTApdGhyb3cgbmV3IEYoInRoZSBudW1iZXIgb2YgY29vcmRpbmF0ZXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIgYW5kIGF0IGxlYXN0IDIiKTtsZXQgbz10Lmxlbmd0aDtoKG4pP24ubGVuZ3RoPW8vMjpuPW5ldyBBcnJheShvLzIpO2ZvcihsZXQgcj0wO3I8bztyKz0yKXtsZXQgaT10W3JdLHM9dFtyKzFdLGY9ci8yO25bZl09d3QuZnJvbVJhZGlhbnMoaSxzLDAsZSxuW2ZdKX1yZXR1cm4gbn07d3QuZnJvbURlZ3JlZXNBcnJheUhlaWdodHM9ZnVuY3Rpb24odCxlLG4pe2lmKHkuZGVmaW5lZCgiY29vcmRpbmF0ZXMiLHQpLHQubGVuZ3RoPDN8fHQubGVuZ3RoJTMhPT0wKXRocm93IG5ldyBGKCJ0aGUgbnVtYmVyIG9mIGNvb3JkaW5hdGVzIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzIGFuZCBhdCBsZWFzdCAzIik7bGV0IG89dC5sZW5ndGg7aChuKT9uLmxlbmd0aD1vLzM6bj1uZXcgQXJyYXkoby8zKTtmb3IobGV0IHI9MDtyPG87cis9Myl7bGV0IGk9dFtyXSxzPXRbcisxXSxmPXRbcisyXSx1PXIvMztuW3VdPXd0LmZyb21EZWdyZWVzKGkscyxmLGUsblt1XSl9cmV0dXJuIG59O3d0LmZyb21SYWRpYW5zQXJyYXlIZWlnaHRzPWZ1bmN0aW9uKHQsZSxuKXtpZih5LmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwzfHx0Lmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgRigidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMyBhbmQgYXQgbGVhc3QgMyIpO2xldCBvPXQubGVuZ3RoO2gobik/bi5sZW5ndGg9by8zOm49bmV3IEFycmF5KG8vMyk7Zm9yKGxldCByPTA7cjxvO3IrPTMpe2xldCBpPXRbcl0scz10W3IrMV0sZj10W3IrMl0sdT1yLzM7blt1XT13dC5mcm9tUmFkaWFucyhpLHMsZixlLG5bdV0pfXJldHVybiBufTt3dC5aRVJPPU9iamVjdC5mcmVlemUobmV3IHd0KDAsMCwwKSk7d3QuT05FPU9iamVjdC5mcmVlemUobmV3IHd0KDEsMSwxKSk7d3QuVU5JVF9YPU9iamVjdC5mcmVlemUobmV3IHd0KDEsMCwwKSk7d3QuVU5JVF9ZPU9iamVjdC5mcmVlemUobmV3IHd0KDAsMSwwKSk7d3QuVU5JVF9aPU9iamVjdC5mcmVlemUobmV3IHd0KDAsMCwxKSk7d3QucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiB3dC5jbG9uZSh0aGlzLHQpfTt3dC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiB3dC5lcXVhbHModGhpcyx0KX07d3QucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiB3dC5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlLG4pfTt3dC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5gKCR7dGhpcy54fSwgJHt0aGlzLnl9LCAke3RoaXMuen0pYH07YT13dH0pO2Z1bmN0aW9uIG9DKHQsZSxuLG8scil7aWYoIWgodCkpdGhyb3cgbmV3IEYoImNhcnRlc2lhbiBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgRigib25lT3ZlclJhZGlpIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBGKCJvbmVPdmVyUmFkaWlTcXVhcmVkIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG8pKXRocm93IG5ldyBGKCJjZW50ZXJUb2xlcmFuY2VTcXVhcmVkIGlzIHJlcXVpcmVkLiIpO2xldCBpPXQueCxzPXQueSxmPXQueix1PWUueCxjPWUueSxsPWUueixwPWkqaSp1KnUsZD1zKnMqYypjLG09ZipmKmwqbCxfPXArZCttLGc9TWF0aC5zcXJ0KDEvXyksYj1hLm11bHRpcGx5QnlTY2FsYXIodCxnLGVDKTtpZihfPG8pcmV0dXJuIGlzRmluaXRlKGcpP2EuY2xvbmUoYixyKTp2b2lkIDA7bGV0IHc9bi54LE89bi55LEU9bi56LFQ9bkM7VC54PWIueCp3KjIsVC55PWIueSpPKjIsVC56PWIueipFKjI7bGV0IEM9KDEtZykqYS5tYWduaXR1ZGUodCkvKC41KmEubWFnbml0dWRlKFQpKSxOPTAsSSxELHYsTCxVLEEsUyxQLEIsaixIO2Rve0MtPU4sdj0xLygxK0MqdyksTD0xLygxK0MqTyksVT0xLygxK0MqRSksQT12KnYsUz1MKkwsUD1VKlUsQj1BKnYsaj1TKkwsSD1QKlUsST1wKkErZCpTK20qUC0xLEQ9cCpCKncrZCpqKk8rbSpIKkU7bGV0IGs9LTIqRDtOPUkva313aGlsZShNYXRoLmFicyhJKT5NLkVQU0lMT04xMik7cmV0dXJuIGgocik/KHIueD1pKnYsci55PXMqTCxyLno9ZipVLHIpOm5ldyBhKGkqdixzKkwsZipVKX12YXIgZUMsbkMsVmwsVG09WigoKT0+e0Z0KCk7ZnQoKTtIdCgpO1d0KCk7ZUM9bmV3IGEsbkM9bmV3IGE7Vmw9b0N9KTtmdW5jdGlvbiBrbih0LGUsbil7dGhpcy5sb25naXR1ZGU9eCh0LDApLHRoaXMubGF0aXR1ZGU9eChlLDApLHRoaXMuaGVpZ2h0PXgobiwwKX12YXIgckMsaUMsc0MsY0MsYUMsZkMsYXQsUGU9WigoKT0+e0Z0KCk7WHQoKTtJdCgpO2Z0KCk7V3QoKTtUbSgpO2tuLmZyb21SYWRpYW5zPWZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiB5LnR5cGVPZi5udW1iZXIoImxvbmdpdHVkZSIsdCkseS50eXBlT2YubnVtYmVyKCJsYXRpdHVkZSIsZSksbj14KG4sMCksaChvKT8oby5sb25naXR1ZGU9dCxvLmxhdGl0dWRlPWUsby5oZWlnaHQ9bixvKTpuZXcga24odCxlLG4pfTtrbi5mcm9tRGVncmVlcz1mdW5jdGlvbih0LGUsbixvKXtyZXR1cm4geS50eXBlT2YubnVtYmVyKCJsb25naXR1ZGUiLHQpLHkudHlwZU9mLm51bWJlcigibGF0aXR1ZGUiLGUpLHQ9TS50b1JhZGlhbnModCksZT1NLnRvUmFkaWFucyhlKSxrbi5mcm9tUmFkaWFucyh0LGUsbixvKX07ckM9bmV3IGEsaUM9bmV3IGEsc0M9bmV3IGEsY0M9bmV3IGEoMS82Mzc4MTM3LDEvNjM3ODEzNywxLzYzNTY3NTIzMTQyNDUxNzllLTkpLGFDPW5ldyBhKDEvKDYzNzgxMzcqNjM3ODEzNyksMS8oNjM3ODEzNyo2Mzc4MTM3KSwxLyg2MzU2NzUyMzE0MjQ1MTc5ZS05KjYzNTY3NTIzMTQyNDUxNzllLTkpKSxmQz1NLkVQU0lMT04xO2tuLmZyb21DYXJ0ZXNpYW49ZnVuY3Rpb24odCxlLG4pe2xldCBvPWgoZSk/ZS5vbmVPdmVyUmFkaWk6Y0Mscj1oKGUpP2Uub25lT3ZlclJhZGlpU3F1YXJlZDphQyxpPWgoZSk/ZS5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZDpmQyxzPVZsKHQsbyxyLGksaUMpO2lmKCFoKHMpKXJldHVybjtsZXQgZj1hLm11bHRpcGx5Q29tcG9uZW50cyhzLHIsckMpO2Y9YS5ub3JtYWxpemUoZixmKTtsZXQgdT1hLnN1YnRyYWN0KHQscyxzQyksYz1NYXRoLmF0YW4yKGYueSxmLngpLGw9TWF0aC5hc2luKGYueikscD1NLnNpZ24oYS5kb3QodSx0KSkqYS5tYWduaXR1ZGUodSk7cmV0dXJuIGgobik/KG4ubG9uZ2l0dWRlPWMsbi5sYXRpdHVkZT1sLG4uaGVpZ2h0PXAsbik6bmV3IGtuKGMsbCxwKX07a24udG9DYXJ0ZXNpYW49ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LmRlZmluZWQoImNhcnRvZ3JhcGhpYyIsdCksYS5mcm9tUmFkaWFucyh0LmxvbmdpdHVkZSx0LmxhdGl0dWRlLHQuaGVpZ2h0LGUsbil9O2tuLmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYoaCh0KSlyZXR1cm4gaChlKT8oZS5sb25naXR1ZGU9dC5sb25naXR1ZGUsZS5sYXRpdHVkZT10LmxhdGl0dWRlLGUuaGVpZ2h0PXQuaGVpZ2h0LGUpOm5ldyBrbih0LmxvbmdpdHVkZSx0LmxhdGl0dWRlLHQuaGVpZ2h0KX07a24uZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxoKHQpJiZoKGUpJiZ0LmxvbmdpdHVkZT09PWUubG9uZ2l0dWRlJiZ0LmxhdGl0dWRlPT09ZS5sYXRpdHVkZSYmdC5oZWlnaHQ9PT1lLmhlaWdodH07a24uZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG49eChuLDApLHQ9PT1lfHxoKHQpJiZoKGUpJiZNYXRoLmFicyh0LmxvbmdpdHVkZS1lLmxvbmdpdHVkZSk8PW4mJk1hdGguYWJzKHQubGF0aXR1ZGUtZS5sYXRpdHVkZSk8PW4mJk1hdGguYWJzKHQuaGVpZ2h0LWUuaGVpZ2h0KTw9bn07a24uWkVSTz1PYmplY3QuZnJlZXplKG5ldyBrbigwLDAsMCkpO2tuLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4ga24uY2xvbmUodGhpcyx0KX07a24ucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtyZXR1cm4ga24uZXF1YWxzKHRoaXMsdCl9O2tuLnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGtuLmVxdWFsc0Vwc2lsb24odGhpcyx0LGUpfTtrbi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5gKCR7dGhpcy5sb25naXR1ZGV9LCAke3RoaXMubGF0aXR1ZGV9LCAke3RoaXMuaGVpZ2h0fSlgfTthdD1rbn0pO2Z1bmN0aW9uIGp0KHQsZSl7dGhpcy54PXgodCwwKSx0aGlzLnk9eChlLDApfXZhciBrbCxBMSxiMSx3MSx1Qyx0dCxGZT1aKCgpPT57WHQoKTtJdCgpO2Z0KCk7SHQoKTtXdCgpO2p0LmZyb21FbGVtZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgobik/KG4ueD10LG4ueT1lLG4pOm5ldyBqdCh0LGUpfTtqdC5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKGgodCkpcmV0dXJuIGgoZSk/KGUueD10LngsZS55PXQueSxlKTpuZXcganQodC54LHQueSl9O2p0LmZyb21DYXJ0ZXNpYW4zPWp0LmNsb25lO2p0LmZyb21DYXJ0ZXNpYW40PWp0LmNsb25lO2p0LnBhY2tlZExlbmd0aD0yO2p0LnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxuPXgobiwwKSxlW24rK109dC54LGVbbl09dC55LGV9O2p0LnVucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkuZGVmaW5lZCgiYXJyYXkiLHQpLGU9eChlLDApLGgobil8fChuPW5ldyBqdCksbi54PXRbZSsrXSxuLnk9dFtlXSxufTtqdC5wYWNrQXJyYXk9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoImFycmF5Iix0KTtsZXQgbj10Lmxlbmd0aCxvPW4qMjtpZighaChlKSllPW5ldyBBcnJheShvKTtlbHNle2lmKCFBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aCE9PW8pdGhyb3cgbmV3IEYoIklmIHJlc3VsdCBpcyBhIHR5cGVkIGFycmF5LCBpdCBtdXN0IGhhdmUgZXhhY3RseSBhcnJheS5sZW5ndGggKiAyIGVsZW1lbnRzIik7ZS5sZW5ndGghPT1vJiYoZS5sZW5ndGg9byl9Zm9yKGxldCByPTA7cjxuOysrcilqdC5wYWNrKHRbcl0sZSxyKjIpO3JldHVybiBlfTtqdC51bnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe2lmKHkuZGVmaW5lZCgiYXJyYXkiLHQpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJhcnJheS5sZW5ndGgiLHQubGVuZ3RoLDIpLHQubGVuZ3RoJTIhPT0wKXRocm93IG5ldyBGKCJhcnJheSBsZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIuIik7bGV0IG49dC5sZW5ndGg7aChlKT9lLmxlbmd0aD1uLzI6ZT1uZXcgQXJyYXkobi8yKTtmb3IobGV0IG89MDtvPG47bys9Mil7bGV0IHI9by8yO2Vbcl09anQudW5wYWNrKHQsbyxlW3JdKX1yZXR1cm4gZX07anQuZnJvbUFycmF5PWp0LnVucGFjaztqdC5tYXhpbXVtQ29tcG9uZW50PWZ1bmN0aW9uKHQpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksTWF0aC5tYXgodC54LHQueSl9O2p0Lm1pbmltdW1Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxNYXRoLm1pbih0LngsdC55KX07anQubWluaW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCkseS50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5taW4odC54LGUueCksbi55PU1hdGgubWluKHQueSxlLnkpLG59O2p0Lm1heGltdW1CeUNvbXBvbmVudD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiZmlyc3QiLHQpLHkudHlwZU9mLm9iamVjdCgic2Vjb25kIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PU1hdGgubWF4KHQueCxlLngpLG4ueT1NYXRoLm1heCh0LnksZS55KSxufTtqdC5jbGFtcD1mdW5jdGlvbih0LGUsbixvKXt5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LnR5cGVPZi5vYmplY3QoIm1pbiIsZSkseS50eXBlT2Yub2JqZWN0KCJtYXgiLG4pLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixvKTtsZXQgcj1NLmNsYW1wKHQueCxlLngsbi54KSxpPU0uY2xhbXAodC55LGUueSxuLnkpO3JldHVybiBvLng9cixvLnk9aSxvfTtqdC5tYWduaXR1ZGVTcXVhcmVkPWZ1bmN0aW9uKHQpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksdC54KnQueCt0LnkqdC55fTtqdC5tYWduaXR1ZGU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChqdC5tYWduaXR1ZGVTcXVhcmVkKHQpKX07a2w9bmV3IGp0O2p0LmRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksanQuc3VidHJhY3QodCxlLGtsKSxqdC5tYWduaXR1ZGUoa2wpfTtqdC5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxqdC5zdWJ0cmFjdCh0LGUsa2wpLGp0Lm1hZ25pdHVkZVNxdWFyZWQoa2wpfTtqdC5ub3JtYWxpemU9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2xldCBuPWp0Lm1hZ25pdHVkZSh0KTtpZihlLng9dC54L24sZS55PXQueS9uLGlzTmFOKGUueCl8fGlzTmFOKGUueSkpdGhyb3cgbmV3IEYoIm5vcm1hbGl6ZWQgcmVzdWx0IGlzIG5vdCBhIG51bWJlciIpO3JldHVybiBlfTtqdC5kb3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx0LngqZS54K3QueSplLnl9O2p0LmNyb3NzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueS10LnkqZS54fTtqdC5tdWx0aXBseUNvbXBvbmVudHM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54KmUueCxuLnk9dC55KmUueSxufTtqdC5kaXZpZGVDb21wb25lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC9lLngsbi55PXQueS9lLnksbn07anQuYWRkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCtlLngsbi55PXQueStlLnksbn07anQuc3VidHJhY3Q9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54LWUueCxuLnk9dC55LWUueSxufTtqdC5tdWx0aXBseUJ5U2NhbGFyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHkudHlwZU9mLm51bWJlcigic2NhbGFyIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLG4ueT10LnkqZSxufTtqdC5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbn07anQubmVnYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZS54PS10LngsZS55PS10LnksZX07anQuYWJzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZS54PU1hdGguYWJzKHQueCksZS55PU1hdGguYWJzKHQueSksZX07QTE9bmV3IGp0O2p0LmxlcnA9ZnVuY3Rpb24odCxlLG4sbyl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgic3RhcnQiLHQpLHkudHlwZU9mLm9iamVjdCgiZW5kIixlKSx5LnR5cGVPZi5udW1iZXIoInQiLG4pLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixvKSxqdC5tdWx0aXBseUJ5U2NhbGFyKGUsbixBMSksbz1qdC5tdWx0aXBseUJ5U2NhbGFyKHQsMS1uLG8pLGp0LmFkZChBMSxvLG8pfTtiMT1uZXcganQsdzE9bmV3IGp0O2p0LmFuZ2xlQmV0d2Vlbj1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLGp0Lm5vcm1hbGl6ZSh0LGIxKSxqdC5ub3JtYWxpemUoZSx3MSksTS5hY29zQ2xhbXBlZChqdC5kb3QoYjEsdzEpKX07dUM9bmV3IGp0O2p0Lm1vc3RPcnRob2dvbmFsQXhpcz1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7bGV0IG49anQubm9ybWFsaXplKHQsdUMpO3JldHVybiBqdC5hYnMobixuKSxuLng8PW4ueT9lPWp0LmNsb25lKGp0LlVOSVRfWCxlKTplPWp0LmNsb25lKGp0LlVOSVRfWSxlKSxlfTtqdC5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fGgodCkmJmgoZSkmJnQueD09PWUueCYmdC55PT09ZS55fTtqdC5lcXVhbHNBcnJheT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQueD09PWVbbl0mJnQueT09PWVbbisxXX07anQuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbixvKXtyZXR1cm4gdD09PWV8fGgodCkmJmgoZSkmJk0uZXF1YWxzRXBzaWxvbih0LngsZS54LG4sbykmJk0uZXF1YWxzRXBzaWxvbih0LnksZS55LG4sbyl9O2p0LlpFUk89T2JqZWN0LmZyZWV6ZShuZXcganQoMCwwKSk7anQuT05FPU9iamVjdC5mcmVlemUobmV3IGp0KDEsMSkpO2p0LlVOSVRfWD1PYmplY3QuZnJlZXplKG5ldyBqdCgxLDApKTtqdC5VTklUX1k9T2JqZWN0LmZyZWV6ZShuZXcganQoMCwxKSk7anQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiBqdC5jbG9uZSh0aGlzLHQpfTtqdC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBqdC5lcXVhbHModGhpcyx0KX07anQucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiBqdC5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlLG4pfTtqdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5gKCR7dGhpcy54fSwgJHt0aGlzLnl9KWB9O3R0PWp0fSk7ZnVuY3Rpb24gTzEodCxlLG4sbyl7ZT14KGUsMCksbj14KG4sMCksbz14KG8sMCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIngiLGUsMCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoInkiLG4sMCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoInoiLG8sMCksdC5fcmFkaWk9bmV3IGEoZSxuLG8pLHQuX3JhZGlpU3F1YXJlZD1uZXcgYShlKmUsbipuLG8qbyksdC5fcmFkaWlUb1RoZUZvdXJ0aD1uZXcgYShlKmUqZSplLG4qbipuKm4sbypvKm8qbyksdC5fb25lT3ZlclJhZGlpPW5ldyBhKGU9PT0wPzA6MS9lLG49PT0wPzA6MS9uLG89PT0wPzA6MS9vKSx0Ll9vbmVPdmVyUmFkaWlTcXVhcmVkPW5ldyBhKGU9PT0wPzA6MS8oZSplKSxuPT09MD8wOjEvKG4qbiksbz09PTA/MDoxLyhvKm8pKSx0Ll9taW5pbXVtUmFkaXVzPU1hdGgubWluKGUsbixvKSx0Ll9tYXhpbXVtUmFkaXVzPU1hdGgubWF4KGUsbixvKSx0Ll9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkPU0uRVBTSUxPTjEsdC5fcmFkaWlTcXVhcmVkLnohPT0wJiYodC5fc3F1YXJlZFhPdmVyU3F1YXJlZFo9dC5fcmFkaWlTcXVhcmVkLngvdC5fcmFkaWlTcXVhcmVkLnopfWZ1bmN0aW9uIEJlKHQsZSxuKXt0aGlzLl9yYWRpaT12b2lkIDAsdGhpcy5fcmFkaWlTcXVhcmVkPXZvaWQgMCx0aGlzLl9yYWRpaVRvVGhlRm91cnRoPXZvaWQgMCx0aGlzLl9vbmVPdmVyUmFkaWk9dm9pZCAwLHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQ9dm9pZCAwLHRoaXMuX21pbmltdW1SYWRpdXM9dm9pZCAwLHRoaXMuX21heGltdW1SYWRpdXM9dm9pZCAwLHRoaXMuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ9dm9pZCAwLHRoaXMuX3NxdWFyZWRYT3ZlclNxdWFyZWRaPXZvaWQgMCxPMSh0aGlzLHQsZSxuKX1mdW5jdGlvbiBUMSh0LGUsbil7eS50eXBlT2YubnVtYmVyKCJhIix0KSx5LnR5cGVPZi5udW1iZXIoImIiLGUpLHkudHlwZU9mLmZ1bmMoImZ1bmMiLG4pO2xldCBvPS41KihlK3QpLHI9LjUqKGUtdCksaT0wO2ZvcihsZXQgcz0wO3M8NTtzKyspe2xldCBmPXIqeUNbc107aSs9Z0Nbc10qKG4obytmKStuKG8tZikpfXJldHVybiBpKj1yLGl9dmFyIGxDLHBDLGRDLG1DLGhDLF9DLHlDLGdDLCQsWnQ9WigoKT0+e0ZlKCk7RnQoKTtQZSgpO1h0KCk7SXQoKTtmdCgpO0h0KCk7V3QoKTtUbSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEJlLnByb3RvdHlwZSx7cmFkaWk6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpaX19LHJhZGlpU3F1YXJlZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpU3F1YXJlZH19LHJhZGlpVG9UaGVGb3VydGg6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpaVRvVGhlRm91cnRofX0sb25lT3ZlclJhZGlpOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25lT3ZlclJhZGlpfX0sb25lT3ZlclJhZGlpU3F1YXJlZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWR9fSxtaW5pbXVtUmFkaXVzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWluaW11bVJhZGl1c319LG1heGltdW1SYWRpdXM6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhpbXVtUmFkaXVzfX19KTtCZS5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKCFoKHQpKXJldHVybjtsZXQgbj10Ll9yYWRpaTtyZXR1cm4gaChlKT8oYS5jbG9uZShuLGUuX3JhZGlpKSxhLmNsb25lKHQuX3JhZGlpU3F1YXJlZCxlLl9yYWRpaVNxdWFyZWQpLGEuY2xvbmUodC5fcmFkaWlUb1RoZUZvdXJ0aCxlLl9yYWRpaVRvVGhlRm91cnRoKSxhLmNsb25lKHQuX29uZU92ZXJSYWRpaSxlLl9vbmVPdmVyUmFkaWkpLGEuY2xvbmUodC5fb25lT3ZlclJhZGlpU3F1YXJlZCxlLl9vbmVPdmVyUmFkaWlTcXVhcmVkKSxlLl9taW5pbXVtUmFkaXVzPXQuX21pbmltdW1SYWRpdXMsZS5fbWF4aW11bVJhZGl1cz10Ll9tYXhpbXVtUmFkaXVzLGUuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ9dC5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZCxlKTpuZXcgQmUobi54LG4ueSxuLnopfTtCZS5mcm9tQ2FydGVzaWFuMz1mdW5jdGlvbih0LGUpe3JldHVybiBoKGUpfHwoZT1uZXcgQmUpLGgodCkmJk8xKGUsdC54LHQueSx0LnopLGV9O0JlLldHUzg0PU9iamVjdC5mcmVlemUobmV3IEJlKDYzNzgxMzcsNjM3ODEzNyw2MzU2NzUyMzE0MjQ1MTc5ZS05KSk7QmUuVU5JVF9TUEhFUkU9T2JqZWN0LmZyZWV6ZShuZXcgQmUoMSwxLDEpKTtCZS5NT09OPU9iamVjdC5mcmVlemUobmV3IEJlKE0uTFVOQVJfUkFESVVTLE0uTFVOQVJfUkFESVVTLE0uTFVOQVJfUkFESVVTKSk7QmUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiBCZS5jbG9uZSh0aGlzLHQpfTtCZS5wYWNrZWRMZW5ndGg9YS5wYWNrZWRMZW5ndGg7QmUucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49eChuLDApLGEucGFjayh0Ll9yYWRpaSxlLG4pLGV9O0JlLnVucGFjaz1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCk7bGV0IG89YS51bnBhY2sodCxlKTtyZXR1cm4gQmUuZnJvbUNhcnRlc2lhbjMobyxuKX07QmUucHJvdG90eXBlLmdlb2NlbnRyaWNTdXJmYWNlTm9ybWFsPWEubm9ybWFsaXplO0JlLnByb3RvdHlwZS5nZW9kZXRpY1N1cmZhY2VOb3JtYWxDYXJ0b2dyYXBoaWM9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoImNhcnRvZ3JhcGhpYyIsdCk7bGV0IG49dC5sb25naXR1ZGUsbz10LmxhdGl0dWRlLHI9TWF0aC5jb3MobyksaT1yKk1hdGguY29zKG4pLHM9cipNYXRoLnNpbihuKSxmPU1hdGguc2luKG8pO3JldHVybiBoKGUpfHwoZT1uZXcgYSksZS54PWksZS55PXMsZS56PWYsYS5ub3JtYWxpemUoZSxlKX07QmUucHJvdG90eXBlLmdlb2RldGljU3VyZmFjZU5vcm1hbD1mdW5jdGlvbih0LGUpe2lmKHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxpc05hTih0LngpfHxpc05hTih0LnkpfHxpc05hTih0LnopKXRocm93IG5ldyBGKCJjYXJ0ZXNpYW4gaGFzIGEgTmFOIGNvbXBvbmVudCIpO2lmKCFhLmVxdWFsc0Vwc2lsb24odCxhLlpFUk8sTS5FUFNJTE9OMTQpKXJldHVybiBoKGUpfHwoZT1uZXcgYSksZT1hLm11bHRpcGx5Q29tcG9uZW50cyh0LHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQsZSksYS5ub3JtYWxpemUoZSxlKX07bEM9bmV3IGEscEM9bmV3IGE7QmUucHJvdG90eXBlLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuPWZ1bmN0aW9uKHQsZSl7bGV0IG49bEMsbz1wQzt0aGlzLmdlb2RldGljU3VyZmFjZU5vcm1hbENhcnRvZ3JhcGhpYyh0LG4pLGEubXVsdGlwbHlDb21wb25lbnRzKHRoaXMuX3JhZGlpU3F1YXJlZCxuLG8pO2xldCByPU1hdGguc3FydChhLmRvdChuLG8pKTtyZXR1cm4gYS5kaXZpZGVCeVNjYWxhcihvLHIsbyksYS5tdWx0aXBseUJ5U2NhbGFyKG4sdC5oZWlnaHQsbiksaChlKXx8KGU9bmV3IGEpLGEuYWRkKG8sbixlKX07QmUucHJvdG90eXBlLmNhcnRvZ3JhcGhpY0FycmF5VG9DYXJ0ZXNpYW5BcnJheT1mdW5jdGlvbih0LGUpe3kuZGVmaW5lZCgiY2FydG9ncmFwaGljcyIsdCk7bGV0IG49dC5sZW5ndGg7aChlKT9lLmxlbmd0aD1uOmU9bmV3IEFycmF5KG4pO2ZvcihsZXQgbz0wO288bjtvKyspZVtvXT10aGlzLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKHRbb10sZVtvXSk7cmV0dXJuIGV9O2RDPW5ldyBhLG1DPW5ldyBhLGhDPW5ldyBhO0JlLnByb3RvdHlwZS5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYz1mdW5jdGlvbih0LGUpe2xldCBuPXRoaXMuc2NhbGVUb0dlb2RldGljU3VyZmFjZSh0LG1DKTtpZighaChuKSlyZXR1cm47bGV0IG89dGhpcy5nZW9kZXRpY1N1cmZhY2VOb3JtYWwobixkQykscj1hLnN1YnRyYWN0KHQsbixoQyksaT1NYXRoLmF0YW4yKG8ueSxvLngpLHM9TWF0aC5hc2luKG8ueiksZj1NLnNpZ24oYS5kb3Qocix0KSkqYS5tYWduaXR1ZGUocik7cmV0dXJuIGgoZSk/KGUubG9uZ2l0dWRlPWksZS5sYXRpdHVkZT1zLGUuaGVpZ2h0PWYsZSk6bmV3IGF0KGkscyxmKX07QmUucHJvdG90eXBlLmNhcnRlc2lhbkFycmF5VG9DYXJ0b2dyYXBoaWNBcnJheT1mdW5jdGlvbih0LGUpe3kuZGVmaW5lZCgiY2FydGVzaWFucyIsdCk7bGV0IG49dC5sZW5ndGg7aChlKT9lLmxlbmd0aD1uOmU9bmV3IEFycmF5KG4pO2ZvcihsZXQgbz0wO288bjsrK28pZVtvXT10aGlzLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKHRbb10sZVtvXSk7cmV0dXJuIGV9O0JlLnByb3RvdHlwZS5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFZsKHQsdGhpcy5fb25lT3ZlclJhZGlpLHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQsdGhpcy5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZCxlKX07QmUucHJvdG90eXBlLnNjYWxlVG9HZW9jZW50cmljU3VyZmFjZT1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoKGUpfHwoZT1uZXcgYSk7bGV0IG49dC54LG89dC55LHI9dC56LGk9dGhpcy5fb25lT3ZlclJhZGlpU3F1YXJlZCxzPTEvTWF0aC5zcXJ0KG4qbippLngrbypvKmkueStyKnIqaS56KTtyZXR1cm4gYS5tdWx0aXBseUJ5U2NhbGFyKHQscyxlKX07QmUucHJvdG90eXBlLnRyYW5zZm9ybVBvc2l0aW9uVG9TY2FsZWRTcGFjZT1mdW5jdGlvbih0LGUpe3JldHVybiBoKGUpfHwoZT1uZXcgYSksYS5tdWx0aXBseUNvbXBvbmVudHModCx0aGlzLl9vbmVPdmVyUmFkaWksZSl9O0JlLnByb3RvdHlwZS50cmFuc2Zvcm1Qb3NpdGlvbkZyb21TY2FsZWRTcGFjZT1mdW5jdGlvbih0LGUpe3JldHVybiBoKGUpfHwoZT1uZXcgYSksYS5tdWx0aXBseUNvbXBvbmVudHModCx0aGlzLl9yYWRpaSxlKX07QmUucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcz09PXR8fGgodCkmJmEuZXF1YWxzKHRoaXMuX3JhZGlpLHQuX3JhZGlpKX07QmUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpLnRvU3RyaW5nKCl9O0JlLnByb3RvdHlwZS5nZXRTdXJmYWNlTm9ybWFsSW50ZXJzZWN0aW9uV2l0aFpBeGlzPWZ1bmN0aW9uKHQsZSxuKXtpZih5LnR5cGVPZi5vYmplY3QoInBvc2l0aW9uIix0KSwhTS5lcXVhbHNFcHNpbG9uKHRoaXMuX3JhZGlpLngsdGhpcy5fcmFkaWkueSxNLkVQU0lMT04xNSkpdGhyb3cgbmV3IEYoIkVsbGlwc29pZCBtdXN0IGJlIGFuIGVsbGlwc29pZCBvZiByZXZvbHV0aW9uIChyYWRpaS54ID09IHJhZGlpLnkpIik7eS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuKCJFbGxpcHNvaWQucmFkaWkueiIsdGhpcy5fcmFkaWkueiwwKSxlPXgoZSwwKTtsZXQgbz10aGlzLl9zcXVhcmVkWE92ZXJTcXVhcmVkWjtpZihoKG4pfHwobj1uZXcgYSksbi54PTAsbi55PTAsbi56PXQueiooMS1vKSwhKE1hdGguYWJzKG4ueik+PXRoaXMuX3JhZGlpLnotZSkpcmV0dXJuIG59O19DPW5ldyBhO0JlLnByb3RvdHlwZS5nZXRMb2NhbEN1cnZhdHVyZT1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgic3VyZmFjZVBvc2l0aW9uIix0KSxoKGUpfHwoZT1uZXcgdHQpO2xldCBuPXRoaXMuZ2V0U3VyZmFjZU5vcm1hbEludGVyc2VjdGlvbldpdGhaQXhpcyh0LDAsX0MpLG89YS5kaXN0YW5jZSh0LG4pLHI9dGhpcy5taW5pbXVtUmFkaXVzKm8vdGhpcy5tYXhpbXVtUmFkaXVzKioyLGk9bypyKioyO3JldHVybiB0dC5mcm9tRWxlbWVudHMoMS9vLDEvaSxlKX07eUM9Wy4xNDg4NzQzMzg5ODE2MywuNDMzMzk1Mzk0MTI5MjUsLjY3OTQwOTU2ODI5OTAyLC44NjUwNjMzNjY2ODg5OCwuOTczOTA2NTI4NTE3MTcsMF0sZ0M9Wy4yOTU1MjQyMjQ3MTQ3NSwuMjY5MjY2NzE5MzA5OTksLjIxOTA4NjM2MjUxNTk4LC4xNDk0NTEzNDkxNTA1OCwuMDY2NjcxMzQ0MzA4Njg0LDBdO0JlLnByb3RvdHlwZS5zdXJmYWNlQXJlYT1mdW5jdGlvbih0KXt5LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCk7bGV0IGU9dC53ZXN0LG49dC5lYXN0LG89dC5zb3V0aCxyPXQubm9ydGg7Zm9yKDtuPGU7KW4rPU0uVFdPX1BJO2xldCBpPXRoaXMuX3JhZGlpU3F1YXJlZCxzPWkueCxmPWkueSx1PWkueixjPXMqZjtyZXR1cm4gVDEobyxyLGZ1bmN0aW9uKGwpe2xldCBwPU1hdGguY29zKGwpLGQ9TWF0aC5zaW4obCk7cmV0dXJuIE1hdGguY29zKGwpKlQxKGUsbixmdW5jdGlvbihtKXtsZXQgXz1NYXRoLmNvcyhtKSxnPU1hdGguc2luKG0pO3JldHVybiBNYXRoLnNxcnQoYypkKmQrdSooZipfKl8rcypnKmcpKnAqcCl9KX0pfTskPUJlfSk7ZnVuY3Rpb24gR2wodCl7dGhpcy5fZWxsaXBzb2lkPXgodCwkLldHUzg0KSx0aGlzLl9zZW1pbWFqb3JBeGlzPXRoaXMuX2VsbGlwc29pZC5tYXhpbXVtUmFkaXVzLHRoaXMuX29uZU92ZXJTZW1pbWFqb3JBeGlzPTEvdGhpcy5fc2VtaW1ham9yQXhpc312YXIgUW4sU2k9WigoKT0+e0Z0KCk7UGUoKTtJdCgpO2Z0KCk7SHQoKTtadCgpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEdsLnByb3RvdHlwZSx7ZWxsaXBzb2lkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxsaXBzb2lkfX19KTtHbC5wcm90b3R5cGUucHJvamVjdD1mdW5jdGlvbih0LGUpe2xldCBuPXRoaXMuX3NlbWltYWpvckF4aXMsbz10LmxvbmdpdHVkZSpuLHI9dC5sYXRpdHVkZSpuLGk9dC5oZWlnaHQ7cmV0dXJuIGgoZSk/KGUueD1vLGUueT1yLGUuej1pLGUpOm5ldyBhKG8scixpKX07R2wucHJvdG90eXBlLnVucHJvamVjdD1mdW5jdGlvbih0LGUpe2lmKCFoKHQpKXRocm93IG5ldyBGKCJjYXJ0ZXNpYW4gaXMgcmVxdWlyZWQiKTtsZXQgbj10aGlzLl9vbmVPdmVyU2VtaW1ham9yQXhpcyxvPXQueCpuLHI9dC55Km4saT10Lno7cmV0dXJuIGgoZSk/KGUubG9uZ2l0dWRlPW8sZS5sYXRpdHVkZT1yLGUuaGVpZ2h0PWksZSk6bmV3IGF0KG8scixpKX07UW49R2x9KTt2YXIgQUMsUm4sa3M9WigoKT0+e0FDPXtPVVRTSURFOi0xLElOVEVSU0VDVElORzowLElOU0lERToxfSxSbj1PYmplY3QuZnJlZXplKEFDKX0pO2Z1bmN0aW9uIGJDKHQsZSl7dGhpcy5zdGFydD14KHQsMCksdGhpcy5zdG9wPXgoZSwwKX12YXIgUXIsemw9WigoKT0+e0l0KCk7UXI9YkN9KTtmdW5jdGlvbiBUdCh0LGUsbixvLHIsaSxzLGYsdSl7dGhpc1swXT14KHQsMCksdGhpc1sxXT14KG8sMCksdGhpc1syXT14KHMsMCksdGhpc1szXT14KGUsMCksdGhpc1s0XT14KHIsMCksdGhpc1s1XT14KGYsMCksdGhpc1s2XT14KG4sMCksdGhpc1s3XT14KGksMCksdGhpc1s4XT14KHUsMCl9ZnVuY3Rpb24gUkModCl7bGV0IGU9MDtmb3IobGV0IG49MDtuPDk7KytuKXtsZXQgbz10W25dO2UrPW8qb31yZXR1cm4gTWF0aC5zcXJ0KGUpfWZ1bmN0aW9uIFNDKHQpe2xldCBlPTA7Zm9yKGxldCBuPTA7bjwzOysrbil7bGV0IG89dFtUdC5nZXRFbGVtZW50SW5kZXgoUm1bbl0sRW1bbl0pXTtlKz0yKm8qb31yZXR1cm4gTWF0aC5zcXJ0KGUpfWZ1bmN0aW9uIENDKHQsZSl7bGV0IG49TS5FUFNJTE9OMTUsbz0wLHI9MTtmb3IobGV0IGM9MDtjPDM7KytjKXtsZXQgbD1NYXRoLmFicyh0W1R0LmdldEVsZW1lbnRJbmRleChSbVtjXSxFbVtjXSldKTtsPm8mJihyPWMsbz1sKX1sZXQgaT0xLHM9MCxmPUVtW3JdLHU9Um1bcl07aWYoTWF0aC5hYnModFtUdC5nZXRFbGVtZW50SW5kZXgodSxmKV0pPm4pe2xldCBjPXRbVHQuZ2V0RWxlbWVudEluZGV4KHUsdSldLGw9dFtUdC5nZXRFbGVtZW50SW5kZXgoZixmKV0scD10W1R0LmdldEVsZW1lbnRJbmRleCh1LGYpXSxkPShjLWwpLzIvcCxtO2Q8MD9tPS0xLygtZCtNYXRoLnNxcnQoMStkKmQpKTptPTEvKGQrTWF0aC5zcXJ0KDErZCpkKSksaT0xL01hdGguc3FydCgxK20qbSkscz1tKml9cmV0dXJuIGU9VHQuY2xvbmUoVHQuSURFTlRJVFksZSksZVtUdC5nZXRFbGVtZW50SW5kZXgoZixmKV09ZVtUdC5nZXRFbGVtZW50SW5kZXgodSx1KV09aSxlW1R0LmdldEVsZW1lbnRJbmRleCh1LGYpXT1zLGVbVHQuZ2V0RWxlbWVudEluZGV4KGYsdSldPS1zLGV9dmFyIHdDLFRDLE9tLEUxLE9DLEVDLEVtLFJtLGpsLFIxLHhDLEosRm49WigoKT0+e0Z0KCk7WHQoKTtJdCgpO2Z0KCk7SHQoKTtXdCgpO1R0LnBhY2tlZExlbmd0aD05O1R0LnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxuPXgobiwwKSxlW24rK109dFswXSxlW24rK109dFsxXSxlW24rK109dFsyXSxlW24rK109dFszXSxlW24rK109dFs0XSxlW24rK109dFs1XSxlW24rK109dFs2XSxlW24rK109dFs3XSxlW24rK109dFs4XSxlfTtUdC51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LmRlZmluZWQoImFycmF5Iix0KSxlPXgoZSwwKSxoKG4pfHwobj1uZXcgVHQpLG5bMF09dFtlKytdLG5bMV09dFtlKytdLG5bMl09dFtlKytdLG5bM109dFtlKytdLG5bNF09dFtlKytdLG5bNV09dFtlKytdLG5bNl09dFtlKytdLG5bN109dFtlKytdLG5bOF09dFtlKytdLG59O1R0LnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe3kuZGVmaW5lZCgiYXJyYXkiLHQpO2xldCBuPXQubGVuZ3RoLG89bio5O2lmKCFoKGUpKWU9bmV3IEFycmF5KG8pO2Vsc2V7aWYoIUFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoIT09byl0aHJvdyBuZXcgRigiSWYgcmVzdWx0IGlzIGEgdHlwZWQgYXJyYXksIGl0IG11c3QgaGF2ZSBleGFjdGx5IGFycmF5Lmxlbmd0aCAqIDkgZWxlbWVudHMiKTtlLmxlbmd0aCE9PW8mJihlLmxlbmd0aD1vKX1mb3IobGV0IHI9MDtyPG47KytyKVR0LnBhY2sodFtyXSxlLHIqOSk7cmV0dXJuIGV9O1R0LnVucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7aWYoeS5kZWZpbmVkKCJhcnJheSIsdCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImFycmF5Lmxlbmd0aCIsdC5sZW5ndGgsOSksdC5sZW5ndGglOSE9PTApdGhyb3cgbmV3IEYoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOS4iKTtsZXQgbj10Lmxlbmd0aDtoKGUpP2UubGVuZ3RoPW4vOTplPW5ldyBBcnJheShuLzkpO2ZvcihsZXQgbz0wO288bjtvKz05KXtsZXQgcj1vLzk7ZVtyXT1UdC51bnBhY2sodCxvLGVbcl0pfXJldHVybiBlfTtUdC5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKGgodCkpcmV0dXJuIGgoZSk/KGVbMF09dFswXSxlWzFdPXRbMV0sZVsyXT10WzJdLGVbM109dFszXSxlWzRdPXRbNF0sZVs1XT10WzVdLGVbNl09dFs2XSxlWzddPXRbN10sZVs4XT10WzhdLGUpOm5ldyBUdCh0WzBdLHRbM10sdFs2XSx0WzFdLHRbNF0sdFs3XSx0WzJdLHRbNV0sdFs4XSl9O1R0LmZyb21BcnJheT1UdC51bnBhY2s7VHQuZnJvbUNvbHVtbk1ham9yQXJyYXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS5kZWZpbmVkKCJ2YWx1ZXMiLHQpLFR0LmNsb25lKHQsZSl9O1R0LmZyb21Sb3dNYWpvckFycmF5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkuZGVmaW5lZCgidmFsdWVzIix0KSxoKGUpPyhlWzBdPXRbMF0sZVsxXT10WzNdLGVbMl09dFs2XSxlWzNdPXRbMV0sZVs0XT10WzRdLGVbNV09dFs3XSxlWzZdPXRbMl0sZVs3XT10WzVdLGVbOF09dFs4XSxlKTpuZXcgVHQodFswXSx0WzFdLHRbMl0sdFszXSx0WzRdLHRbNV0sdFs2XSx0WzddLHRbOF0pfTtUdC5mcm9tUXVhdGVybmlvbj1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgicXVhdGVybmlvbiIsdCk7bGV0IG49dC54KnQueCxvPXQueCp0Lnkscj10LngqdC56LGk9dC54KnQudyxzPXQueSp0LnksZj10LnkqdC56LHU9dC55KnQudyxjPXQueip0LnosbD10LnoqdC53LHA9dC53KnQudyxkPW4tcy1jK3AsbT0yKihvLWwpLF89Mioocit1KSxnPTIqKG8rbCksYj0tbitzLWMrcCx3PTIqKGYtaSksTz0yKihyLXUpLEU9MiooZitpKSxUPS1uLXMrYytwO3JldHVybiBoKGUpPyhlWzBdPWQsZVsxXT1nLGVbMl09TyxlWzNdPW0sZVs0XT1iLGVbNV09RSxlWzZdPV8sZVs3XT13LGVbOF09VCxlKTpuZXcgVHQoZCxtLF8sZyxiLHcsTyxFLFQpfTtUdC5mcm9tSGVhZGluZ1BpdGNoUm9sbD1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgiaGVhZGluZ1BpdGNoUm9sbCIsdCk7bGV0IG49TWF0aC5jb3MoLXQucGl0Y2gpLG89TWF0aC5jb3MoLXQuaGVhZGluZykscj1NYXRoLmNvcyh0LnJvbGwpLGk9TWF0aC5zaW4oLXQucGl0Y2gpLHM9TWF0aC5zaW4oLXQuaGVhZGluZyksZj1NYXRoLnNpbih0LnJvbGwpLHU9bipvLGM9LXIqcytmKmkqbyxsPWYqcytyKmkqbyxwPW4qcyxkPXIqbytmKmkqcyxtPS1mKm8rcippKnMsXz0taSxnPWYqbixiPXIqbjtyZXR1cm4gaChlKT8oZVswXT11LGVbMV09cCxlWzJdPV8sZVszXT1jLGVbNF09ZCxlWzVdPWcsZVs2XT1sLGVbN109bSxlWzhdPWIsZSk6bmV3IFR0KHUsYyxsLHAsZCxtLF8sZyxiKX07VHQuZnJvbVNjYWxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgic2NhbGUiLHQpLGgoZSk/KGVbMF09dC54LGVbMV09MCxlWzJdPTAsZVszXT0wLGVbNF09dC55LGVbNV09MCxlWzZdPTAsZVs3XT0wLGVbOF09dC56LGUpOm5ldyBUdCh0LngsMCwwLDAsdC55LDAsMCwwLHQueil9O1R0LmZyb21Vbmlmb3JtU2NhbGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2YubnVtYmVyKCJzY2FsZSIsdCksaChlKT8oZVswXT10LGVbMV09MCxlWzJdPTAsZVszXT0wLGVbNF09dCxlWzVdPTAsZVs2XT0wLGVbN109MCxlWzhdPXQsZSk6bmV3IFR0KHQsMCwwLDAsdCwwLDAsMCx0KX07VHQuZnJvbUNyb3NzUHJvZHVjdD1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZlY3RvciIsdCksaChlKT8oZVswXT0wLGVbMV09dC56LGVbMl09LXQueSxlWzNdPS10LnosZVs0XT0wLGVbNV09dC54LGVbNl09dC55LGVbN109LXQueCxlWzhdPTAsZSk6bmV3IFR0KDAsLXQueix0LnksdC56LDAsLXQueCwtdC55LHQueCwwKX07VHQuZnJvbVJvdGF0aW9uWD1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm51bWJlcigiYW5nbGUiLHQpO2xldCBuPU1hdGguY29zKHQpLG89TWF0aC5zaW4odCk7cmV0dXJuIGgoZSk/KGVbMF09MSxlWzFdPTAsZVsyXT0wLGVbM109MCxlWzRdPW4sZVs1XT1vLGVbNl09MCxlWzddPS1vLGVbOF09bixlKTpuZXcgVHQoMSwwLDAsMCxuLC1vLDAsbyxuKX07VHQuZnJvbVJvdGF0aW9uWT1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm51bWJlcigiYW5nbGUiLHQpO2xldCBuPU1hdGguY29zKHQpLG89TWF0aC5zaW4odCk7cmV0dXJuIGgoZSk/KGVbMF09bixlWzFdPTAsZVsyXT0tbyxlWzNdPTAsZVs0XT0xLGVbNV09MCxlWzZdPW8sZVs3XT0wLGVbOF09bixlKTpuZXcgVHQobiwwLG8sMCwxLDAsLW8sMCxuKX07VHQuZnJvbVJvdGF0aW9uWj1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm51bWJlcigiYW5nbGUiLHQpO2xldCBuPU1hdGguY29zKHQpLG89TWF0aC5zaW4odCk7cmV0dXJuIGgoZSk/KGVbMF09bixlWzFdPW8sZVsyXT0wLGVbM109LW8sZVs0XT1uLGVbNV09MCxlWzZdPTAsZVs3XT0wLGVbOF09MSxlKTpuZXcgVHQobiwtbywwLG8sbiwwLDAsMCwxKX07VHQudG9BcnJheT1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCksaChlKT8oZVswXT10WzBdLGVbMV09dFsxXSxlWzJdPXRbMl0sZVszXT10WzNdLGVbNF09dFs0XSxlWzVdPXRbNV0sZVs2XT10WzZdLGVbN109dFs3XSxlWzhdPXRbOF0sZSk6W3RbMF0sdFsxXSx0WzJdLHRbM10sdFs0XSx0WzVdLHRbNl0sdFs3XSx0WzhdXX07VHQuZ2V0RWxlbWVudEluZGV4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJyb3ciLGUsMCkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoInJvdyIsZSwyKSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiY29sdW1uIix0LDApLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJjb2x1bW4iLHQsMiksdCozK2V9O1R0LmdldENvbHVtbj1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJpbmRleCIsZSwwKSx5LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygiaW5kZXgiLGUsMikseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pO2xldCBvPWUqMyxyPXRbb10saT10W28rMV0scz10W28rMl07cmV0dXJuIG4ueD1yLG4ueT1pLG4uej1zLG59O1R0LnNldENvbHVtbj1mdW5jdGlvbih0LGUsbixvKXt5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImluZGV4IixlLDApLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJpbmRleCIsZSwyKSx5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsbikseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG8pLG89VHQuY2xvbmUodCxvKTtsZXQgcj1lKjM7cmV0dXJuIG9bcl09bi54LG9bcisxXT1uLnksb1tyKzJdPW4ueixvfTtUdC5nZXRSb3c9ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiaW5kZXgiLGUsMCkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImluZGV4IixlLDIpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz10W2VdLHI9dFtlKzNdLGk9dFtlKzZdO3JldHVybiBuLng9byxuLnk9cixuLno9aSxufTtUdC5zZXRSb3c9ZnVuY3Rpb24odCxlLG4sbyl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiaW5kZXgiLGUsMCkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImluZGV4IixlLDIpLHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIixuKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbyksbz1UdC5jbG9uZSh0LG8pLG9bZV09bi54LG9bZSszXT1uLnksb1tlKzZdPW4ueixvfTt3Qz1uZXcgYTtUdC5zZXRTY2FsZT1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgic2NhbGUiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz1UdC5nZXRTY2FsZSh0LHdDKSxyPWUueC9vLngsaT1lLnkvby55LHM9ZS56L28uejtyZXR1cm4gblswXT10WzBdKnIsblsxXT10WzFdKnIsblsyXT10WzJdKnIsblszXT10WzNdKmksbls0XT10WzRdKmksbls1XT10WzVdKmksbls2XT10WzZdKnMsbls3XT10WzddKnMsbls4XT10WzhdKnMsbn07VEM9bmV3IGE7VHQuc2V0VW5pZm9ybVNjYWxlPWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2YubnVtYmVyKCJzY2FsZSIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pO2xldCBvPVR0LmdldFNjYWxlKHQsVEMpLHI9ZS9vLngsaT1lL28ueSxzPWUvby56O3JldHVybiBuWzBdPXRbMF0qcixuWzFdPXRbMV0qcixuWzJdPXRbMl0qcixuWzNdPXRbM10qaSxuWzRdPXRbNF0qaSxuWzVdPXRbNV0qaSxuWzZdPXRbNl0qcyxuWzddPXRbN10qcyxuWzhdPXRbOF0qcyxufTtPbT1uZXcgYTtUdC5nZXRTY2FsZT1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGUueD1hLm1hZ25pdHVkZShhLmZyb21FbGVtZW50cyh0WzBdLHRbMV0sdFsyXSxPbSkpLGUueT1hLm1hZ25pdHVkZShhLmZyb21FbGVtZW50cyh0WzNdLHRbNF0sdFs1XSxPbSkpLGUuej1hLm1hZ25pdHVkZShhLmZyb21FbGVtZW50cyh0WzZdLHRbN10sdFs4XSxPbSkpLGV9O0UxPW5ldyBhO1R0LmdldE1heGltdW1TY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gVHQuZ2V0U2NhbGUodCxFMSksYS5tYXhpbXVtQ29tcG9uZW50KEUxKX07T0M9bmV3IGE7VHQuc2V0Um90YXRpb249ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7bGV0IG89VHQuZ2V0U2NhbGUodCxPQyk7cmV0dXJuIG5bMF09ZVswXSpvLngsblsxXT1lWzFdKm8ueCxuWzJdPWVbMl0qby54LG5bM109ZVszXSpvLnksbls0XT1lWzRdKm8ueSxuWzVdPWVbNV0qby55LG5bNl09ZVs2XSpvLnosbls3XT1lWzddKm8ueixuWzhdPWVbOF0qby56LG59O0VDPW5ldyBhO1R0LmdldFJvdGF0aW9uPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKTtsZXQgbj1UdC5nZXRTY2FsZSh0LEVDKTtyZXR1cm4gZVswXT10WzBdL24ueCxlWzFdPXRbMV0vbi54LGVbMl09dFsyXS9uLngsZVszXT10WzNdL24ueSxlWzRdPXRbNF0vbi55LGVbNV09dFs1XS9uLnksZVs2XT10WzZdL24ueixlWzddPXRbN10vbi56LGVbOF09dFs4XS9uLnosZX07VHQubXVsdGlwbHk9ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pO2xldCBvPXRbMF0qZVswXSt0WzNdKmVbMV0rdFs2XSplWzJdLHI9dFsxXSplWzBdK3RbNF0qZVsxXSt0WzddKmVbMl0saT10WzJdKmVbMF0rdFs1XSplWzFdK3RbOF0qZVsyXSxzPXRbMF0qZVszXSt0WzNdKmVbNF0rdFs2XSplWzVdLGY9dFsxXSplWzNdK3RbNF0qZVs0XSt0WzddKmVbNV0sdT10WzJdKmVbM10rdFs1XSplWzRdK3RbOF0qZVs1XSxjPXRbMF0qZVs2XSt0WzNdKmVbN10rdFs2XSplWzhdLGw9dFsxXSplWzZdK3RbNF0qZVs3XSt0WzddKmVbOF0scD10WzJdKmVbNl0rdFs1XSplWzddK3RbOF0qZVs4XTtyZXR1cm4gblswXT1vLG5bMV09cixuWzJdPWksblszXT1zLG5bNF09ZixuWzVdPXUsbls2XT1jLG5bN109bCxuWzhdPXAsbn07VHQuYWRkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksblswXT10WzBdK2VbMF0sblsxXT10WzFdK2VbMV0sblsyXT10WzJdK2VbMl0sblszXT10WzNdK2VbM10sbls0XT10WzRdK2VbNF0sbls1XT10WzVdK2VbNV0sbls2XT10WzZdK2VbNl0sbls3XT10WzddK2VbN10sbls4XT10WzhdK2VbOF0sbn07VHQuc3VidHJhY3Q9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuWzBdPXRbMF0tZVswXSxuWzFdPXRbMV0tZVsxXSxuWzJdPXRbMl0tZVsyXSxuWzNdPXRbM10tZVszXSxuWzRdPXRbNF0tZVs0XSxuWzVdPXRbNV0tZVs1XSxuWzZdPXRbNl0tZVs2XSxuWzddPXRbN10tZVs3XSxuWzhdPXRbOF0tZVs4XSxufTtUdC5tdWx0aXBseUJ5VmVjdG9yPWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz1lLngscj1lLnksaT1lLnoscz10WzBdKm8rdFszXSpyK3RbNl0qaSxmPXRbMV0qbyt0WzRdKnIrdFs3XSppLHU9dFsyXSpvK3RbNV0qcit0WzhdKmk7cmV0dXJuIG4ueD1zLG4ueT1mLG4uej11LG59O1R0Lm11bHRpcGx5QnlTY2FsYXI9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2YubnVtYmVyKCJzY2FsYXIiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuWzBdPXRbMF0qZSxuWzFdPXRbMV0qZSxuWzJdPXRbMl0qZSxuWzNdPXRbM10qZSxuWzRdPXRbNF0qZSxuWzVdPXRbNV0qZSxuWzZdPXRbNl0qZSxuWzddPXRbN10qZSxuWzhdPXRbOF0qZSxufTtUdC5tdWx0aXBseUJ5U2NhbGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJzY2FsZSIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG5bMF09dFswXSplLngsblsxXT10WzFdKmUueCxuWzJdPXRbMl0qZS54LG5bM109dFszXSplLnksbls0XT10WzRdKmUueSxuWzVdPXRbNV0qZS55LG5bNl09dFs2XSplLnosbls3XT10WzddKmUueixuWzhdPXRbOF0qZS56LG59O1R0Lm11bHRpcGx5QnlVbmlmb3JtU2NhbGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2YubnVtYmVyKCJzY2FsZSIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG5bMF09dFswXSplLG5bMV09dFsxXSplLG5bMl09dFsyXSplLG5bM109dFszXSplLG5bNF09dFs0XSplLG5bNV09dFs1XSplLG5bNl09dFs2XSplLG5bN109dFs3XSplLG5bOF09dFs4XSplLG59O1R0Lm5lZ2F0ZT1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGVbMF09LXRbMF0sZVsxXT0tdFsxXSxlWzJdPS10WzJdLGVbM109LXRbM10sZVs0XT0tdFs0XSxlWzVdPS10WzVdLGVbNl09LXRbNl0sZVs3XT0tdFs3XSxlWzhdPS10WzhdLGV9O1R0LnRyYW5zcG9zZT1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7bGV0IG49dFswXSxvPXRbM10scj10WzZdLGk9dFsxXSxzPXRbNF0sZj10WzddLHU9dFsyXSxjPXRbNV0sbD10WzhdO3JldHVybiBlWzBdPW4sZVsxXT1vLGVbMl09cixlWzNdPWksZVs0XT1zLGVbNV09ZixlWzZdPXUsZVs3XT1jLGVbOF09bCxlfTtFbT1bMSwwLDBdLFJtPVsyLDIsMV07amw9bmV3IFR0LFIxPW5ldyBUdDtUdC5jb21wdXRlRWlnZW5EZWNvbXBvc2l0aW9uPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpO2xldCBuPU0uRVBTSUxPTjIwLG89MTAscj0wLGk9MDtoKGUpfHwoZT17fSk7bGV0IHM9ZS51bml0YXJ5PVR0LmNsb25lKFR0LklERU5USVRZLGUudW5pdGFyeSksZj1lLmRpYWdvbmFsPVR0LmNsb25lKHQsZS5kaWFnb25hbCksdT1uKlJDKGYpO2Zvcig7aTxvJiZTQyhmKT51OylDQyhmLGpsKSxUdC50cmFuc3Bvc2UoamwsUjEpLFR0Lm11bHRpcGx5KGYsamwsZiksVHQubXVsdGlwbHkoUjEsZixmKSxUdC5tdWx0aXBseShzLGpsLHMpLCsrcj4yJiYoKytpLHI9MCk7cmV0dXJuIGV9O1R0LmFicz1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGVbMF09TWF0aC5hYnModFswXSksZVsxXT1NYXRoLmFicyh0WzFdKSxlWzJdPU1hdGguYWJzKHRbMl0pLGVbM109TWF0aC5hYnModFszXSksZVs0XT1NYXRoLmFicyh0WzRdKSxlWzVdPU1hdGguYWJzKHRbNV0pLGVbNl09TWF0aC5hYnModFs2XSksZVs3XT1NYXRoLmFicyh0WzddKSxlWzhdPU1hdGguYWJzKHRbOF0pLGV9O1R0LmRldGVybWluYW50PWZ1bmN0aW9uKHQpe3kudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KTtsZXQgZT10WzBdLG49dFszXSxvPXRbNl0scj10WzFdLGk9dFs0XSxzPXRbN10sZj10WzJdLHU9dFs1XSxjPXRbOF07cmV0dXJuIGUqKGkqYy11KnMpK3IqKHUqby1uKmMpK2YqKG4qcy1pKm8pfTtUdC5pbnZlcnNlPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKTtsZXQgbj10WzBdLG89dFsxXSxyPXRbMl0saT10WzNdLHM9dFs0XSxmPXRbNV0sdT10WzZdLGM9dFs3XSxsPXRbOF0scD1UdC5kZXRlcm1pbmFudCh0KTtpZihNYXRoLmFicyhwKTw9TS5FUFNJTE9OMTUpdGhyb3cgbmV3IEYoIm1hdHJpeCBpcyBub3QgaW52ZXJ0aWJsZSIpO2VbMF09cypsLWMqZixlWzFdPWMqci1vKmwsZVsyXT1vKmYtcypyLGVbM109dSpmLWkqbCxlWzRdPW4qbC11KnIsZVs1XT1pKnItbipmLGVbNl09aSpjLXUqcyxlWzddPXUqby1uKmMsZVs4XT1uKnMtaSpvO2xldCBkPTEvcDtyZXR1cm4gVHQubXVsdGlwbHlCeVNjYWxhcihlLGQsZSl9O3hDPW5ldyBUdDtUdC5pbnZlcnNlVHJhbnNwb3NlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksVHQuaW52ZXJzZShUdC50cmFuc3Bvc2UodCx4QyksZSl9O1R0LmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8aCh0KSYmaChlKSYmdFswXT09PWVbMF0mJnRbMV09PT1lWzFdJiZ0WzJdPT09ZVsyXSYmdFszXT09PWVbM10mJnRbNF09PT1lWzRdJiZ0WzVdPT09ZVs1XSYmdFs2XT09PWVbNl0mJnRbN109PT1lWzddJiZ0WzhdPT09ZVs4XX07VHQuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG49eChuLDApLHQ9PT1lfHxoKHQpJiZoKGUpJiZNYXRoLmFicyh0WzBdLWVbMF0pPD1uJiZNYXRoLmFicyh0WzFdLWVbMV0pPD1uJiZNYXRoLmFicyh0WzJdLWVbMl0pPD1uJiZNYXRoLmFicyh0WzNdLWVbM10pPD1uJiZNYXRoLmFicyh0WzRdLWVbNF0pPD1uJiZNYXRoLmFicyh0WzVdLWVbNV0pPD1uJiZNYXRoLmFicyh0WzZdLWVbNl0pPD1uJiZNYXRoLmFicyh0WzddLWVbN10pPD1uJiZNYXRoLmFicyh0WzhdLWVbOF0pPD1ufTtUdC5JREVOVElUWT1PYmplY3QuZnJlZXplKG5ldyBUdCgxLDAsMCwwLDEsMCwwLDAsMSkpO1R0LlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgVHQoMCwwLDAsMCwwLDAsMCwwLDApKTtUdC5DT0xVTU4wUk9XMD0wO1R0LkNPTFVNTjBST1cxPTE7VHQuQ09MVU1OMFJPVzI9MjtUdC5DT0xVTU4xUk9XMD0zO1R0LkNPTFVNTjFST1cxPTQ7VHQuQ09MVU1OMVJPVzI9NTtUdC5DT0xVTU4yUk9XMD02O1R0LkNPTFVNTjJST1cxPTc7VHQuQ09MVU1OMlJPVzI9ODtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhUdC5wcm90b3R5cGUse2xlbmd0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFR0LnBhY2tlZExlbmd0aH19fSk7VHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiBUdC5jbG9uZSh0aGlzLHQpfTtUdC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBUdC5lcXVhbHModGhpcyx0KX07VHQuZXF1YWxzQXJyYXk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0WzBdPT09ZVtuXSYmdFsxXT09PWVbbisxXSYmdFsyXT09PWVbbisyXSYmdFszXT09PWVbbiszXSYmdFs0XT09PWVbbis0XSYmdFs1XT09PWVbbis1XSYmdFs2XT09PWVbbis2XSYmdFs3XT09PWVbbis3XSYmdFs4XT09PWVbbis4XX07VHQucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gVHQuZXF1YWxzRXBzaWxvbih0aGlzLHQsZSl9O1R0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzWzBdfSwgJHt0aGlzWzNdfSwgJHt0aGlzWzZdfSkKKCR7dGhpc1sxXX0sICR7dGhpc1s0XX0sICR7dGhpc1s3XX0pCigke3RoaXNbMl19LCAke3RoaXNbNV19LCAke3RoaXNbOF19KWB9O0o9VHR9KTtmdW5jdGlvbiBMdCh0LGUsbixvKXt0aGlzLng9eCh0LDApLHRoaXMueT14KGUsMCksdGhpcy56PXgobiwwKSx0aGlzLnc9eChvLDApfXZhciBIbCxTMSxQQyxTbSxBbyxNQyxOQyxDMSxoZSxocj1aKCgpPT57WHQoKTtJdCgpO2Z0KCk7SHQoKTtXdCgpO0x0LmZyb21FbGVtZW50cz1mdW5jdGlvbih0LGUsbixvLHIpe3JldHVybiBoKHIpPyhyLng9dCxyLnk9ZSxyLno9bixyLnc9byxyKTpuZXcgTHQodCxlLG4sbyl9O0x0LmZyb21Db2xvcj1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNvbG9yIix0KSxoKGUpPyhlLng9dC5yZWQsZS55PXQuZ3JlZW4sZS56PXQuYmx1ZSxlLnc9dC5hbHBoYSxlKTpuZXcgTHQodC5yZWQsdC5ncmVlbix0LmJsdWUsdC5hbHBoYSl9O0x0LmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYoaCh0KSlyZXR1cm4gaChlKT8oZS54PXQueCxlLnk9dC55LGUuej10LnosZS53PXQudyxlKTpuZXcgTHQodC54LHQueSx0LnosdC53KX07THQucGFja2VkTGVuZ3RoPTQ7THQucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49eChuLDApLGVbbisrXT10LngsZVtuKytdPXQueSxlW24rK109dC56LGVbbl09dC53LGV9O0x0LnVucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkuZGVmaW5lZCgiYXJyYXkiLHQpLGU9eChlLDApLGgobil8fChuPW5ldyBMdCksbi54PXRbZSsrXSxuLnk9dFtlKytdLG4uej10W2UrK10sbi53PXRbZV0sbn07THQucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJhcnJheSIsdCk7bGV0IG49dC5sZW5ndGgsbz1uKjQ7aWYoIWgoZSkpZT1uZXcgQXJyYXkobyk7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1vKXRocm93IG5ldyBGKCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogNCBlbGVtZW50cyIpO2UubGVuZ3RoIT09byYmKGUubGVuZ3RoPW8pfWZvcihsZXQgcj0wO3I8bjsrK3IpTHQucGFjayh0W3JdLGUscio0KTtyZXR1cm4gZX07THQudW5wYWNrQXJyYXk9ZnVuY3Rpb24odCxlKXtpZih5LmRlZmluZWQoImFycmF5Iix0KSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiYXJyYXkubGVuZ3RoIix0Lmxlbmd0aCw0KSx0Lmxlbmd0aCU0IT09MCl0aHJvdyBuZXcgRigiYXJyYXkgbGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiIpO2xldCBuPXQubGVuZ3RoO2goZSk/ZS5sZW5ndGg9bi80OmU9bmV3IEFycmF5KG4vNCk7Zm9yKGxldCBvPTA7bzxuO28rPTQpe2xldCByPW8vNDtlW3JdPUx0LnVucGFjayh0LG8sZVtyXSl9cmV0dXJuIGV9O0x0LmZyb21BcnJheT1MdC51bnBhY2s7THQubWF4aW11bUNvbXBvbmVudD1mdW5jdGlvbih0KXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLE1hdGgubWF4KHQueCx0LnksdC56LHQudyl9O0x0Lm1pbmltdW1Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxNYXRoLm1pbih0LngsdC55LHQueix0LncpfTtMdC5taW5pbXVtQnlDb21wb25lbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImZpcnN0Iix0KSx5LnR5cGVPZi5vYmplY3QoInNlY29uZCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD1NYXRoLm1pbih0LngsZS54KSxuLnk9TWF0aC5taW4odC55LGUueSksbi56PU1hdGgubWluKHQueixlLnopLG4udz1NYXRoLm1pbih0LncsZS53KSxufTtMdC5tYXhpbXVtQnlDb21wb25lbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImZpcnN0Iix0KSx5LnR5cGVPZi5vYmplY3QoInNlY29uZCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD1NYXRoLm1heCh0LngsZS54KSxuLnk9TWF0aC5tYXgodC55LGUueSksbi56PU1hdGgubWF4KHQueixlLnopLG4udz1NYXRoLm1heCh0LncsZS53KSxufTtMdC5jbGFtcD1mdW5jdGlvbih0LGUsbixvKXt5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LnR5cGVPZi5vYmplY3QoIm1pbiIsZSkseS50eXBlT2Yub2JqZWN0KCJtYXgiLG4pLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixvKTtsZXQgcj1NLmNsYW1wKHQueCxlLngsbi54KSxpPU0uY2xhbXAodC55LGUueSxuLnkpLHM9TS5jbGFtcCh0LnosZS56LG4ueiksZj1NLmNsYW1wKHQudyxlLncsbi53KTtyZXR1cm4gby54PXIsby55PWksby56PXMsby53PWYsb307THQubWFnbml0dWRlU3F1YXJlZD1mdW5jdGlvbih0KXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHQueCp0LngrdC55KnQueSt0LnoqdC56K3Qudyp0Lnd9O0x0Lm1hZ25pdHVkZT1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KEx0Lm1hZ25pdHVkZVNxdWFyZWQodCkpfTtIbD1uZXcgTHQ7THQuZGlzdGFuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxMdC5zdWJ0cmFjdCh0LGUsSGwpLEx0Lm1hZ25pdHVkZShIbCl9O0x0LmRpc3RhbmNlU3F1YXJlZD1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLEx0LnN1YnRyYWN0KHQsZSxIbCksTHQubWFnbml0dWRlU3F1YXJlZChIbCl9O0x0Lm5vcm1hbGl6ZT1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7bGV0IG49THQubWFnbml0dWRlKHQpO2lmKGUueD10LngvbixlLnk9dC55L24sZS56PXQuei9uLGUudz10Lncvbixpc05hTihlLngpfHxpc05hTihlLnkpfHxpc05hTihlLnopfHxpc05hTihlLncpKXRocm93IG5ldyBGKCJub3JtYWxpemVkIHJlc3VsdCBpcyBub3QgYSBudW1iZXIiKTtyZXR1cm4gZX07THQuZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueCt0LnkqZS55K3QueiplLnordC53KmUud307THQubXVsdGlwbHlDb21wb25lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLngsbi55PXQueSplLnksbi56PXQueiplLnosbi53PXQudyplLncsbn07THQuZGl2aWRlQ29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZS54LG4ueT10LnkvZS55LG4uej10LnovZS56LG4udz10LncvZS53LG59O0x0LmFkZD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngrZS54LG4ueT10LnkrZS55LG4uej10LnorZS56LG4udz10LncrZS53LG59O0x0LnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC1lLngsbi55PXQueS1lLnksbi56PXQuei1lLnosbi53PXQudy1lLncsbn07THQubXVsdGlwbHlCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZSxuLnk9dC55KmUsbi56PXQueiplLG4udz10LncqZSxufTtMdC5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbi56PXQuei9lLG4udz10LncvZSxufTtMdC5uZWdhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9LXQueCxlLnk9LXQueSxlLno9LXQueixlLnc9LXQudyxlfTtMdC5hYnM9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9TWF0aC5hYnModC54KSxlLnk9TWF0aC5hYnModC55KSxlLno9TWF0aC5hYnModC56KSxlLnc9TWF0aC5hYnModC53KSxlfTtTMT1uZXcgTHQ7THQubGVycD1mdW5jdGlvbih0LGUsbixvKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJzdGFydCIsdCkseS50eXBlT2Yub2JqZWN0KCJlbmQiLGUpLHkudHlwZU9mLm51bWJlcigidCIsbikseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG8pLEx0Lm11bHRpcGx5QnlTY2FsYXIoZSxuLFMxKSxvPUx0Lm11bHRpcGx5QnlTY2FsYXIodCwxLW4sbyksTHQuYWRkKFMxLG8sbyl9O1BDPW5ldyBMdDtMdC5tb3N0T3J0aG9nb25hbEF4aXM9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2xldCBuPUx0Lm5vcm1hbGl6ZSh0LFBDKTtyZXR1cm4gTHQuYWJzKG4sbiksbi54PD1uLnk/bi54PD1uLno/bi54PD1uLnc/ZT1MdC5jbG9uZShMdC5VTklUX1gsZSk6ZT1MdC5jbG9uZShMdC5VTklUX1csZSk6bi56PD1uLnc/ZT1MdC5jbG9uZShMdC5VTklUX1osZSk6ZT1MdC5jbG9uZShMdC5VTklUX1csZSk6bi55PD1uLno/bi55PD1uLnc/ZT1MdC5jbG9uZShMdC5VTklUX1ksZSk6ZT1MdC5jbG9uZShMdC5VTklUX1csZSk6bi56PD1uLnc/ZT1MdC5jbG9uZShMdC5VTklUX1osZSk6ZT1MdC5jbG9uZShMdC5VTklUX1csZSksZX07THQuZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxoKHQpJiZoKGUpJiZ0Lng9PT1lLngmJnQueT09PWUueSYmdC56PT09ZS56JiZ0Lnc9PT1lLnd9O0x0LmVxdWFsc0FycmF5PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdC54PT09ZVtuXSYmdC55PT09ZVtuKzFdJiZ0Lno9PT1lW24rMl0mJnQudz09PWVbbiszXX07THQuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbixvKXtyZXR1cm4gdD09PWV8fGgodCkmJmgoZSkmJk0uZXF1YWxzRXBzaWxvbih0LngsZS54LG4sbykmJk0uZXF1YWxzRXBzaWxvbih0LnksZS55LG4sbykmJk0uZXF1YWxzRXBzaWxvbih0LnosZS56LG4sbykmJk0uZXF1YWxzRXBzaWxvbih0LncsZS53LG4sbyl9O0x0LlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgTHQoMCwwLDAsMCkpO0x0Lk9ORT1PYmplY3QuZnJlZXplKG5ldyBMdCgxLDEsMSwxKSk7THQuVU5JVF9YPU9iamVjdC5mcmVlemUobmV3IEx0KDEsMCwwLDApKTtMdC5VTklUX1k9T2JqZWN0LmZyZWV6ZShuZXcgTHQoMCwxLDAsMCkpO0x0LlVOSVRfWj1PYmplY3QuZnJlZXplKG5ldyBMdCgwLDAsMSwwKSk7THQuVU5JVF9XPU9iamVjdC5mcmVlemUobmV3IEx0KDAsMCwwLDEpKTtMdC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIEx0LmNsb25lKHRoaXMsdCl9O0x0LnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIEx0LmVxdWFscyh0aGlzLHQpfTtMdC5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIEx0LmVxdWFsc0Vwc2lsb24odGhpcyx0LGUsbil9O0x0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzLnh9LCAke3RoaXMueX0sICR7dGhpcy56fSwgJHt0aGlzLnd9KWB9O1NtPW5ldyBGbG9hdDMyQXJyYXkoMSksQW89bmV3IFVpbnQ4QXJyYXkoU20uYnVmZmVyKSxNQz1uZXcgVWludDMyQXJyYXkoWzI4NzQ1NDAyMF0pLE5DPW5ldyBVaW50OEFycmF5KE1DLmJ1ZmZlciksQzE9TkNbMF09PT02ODtMdC5wYWNrRmxvYXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2YubnVtYmVyKCJ2YWx1ZSIsdCksaChlKXx8KGU9bmV3IEx0KSxTbVswXT10LEMxPyhlLng9QW9bMF0sZS55PUFvWzFdLGUuej1Bb1syXSxlLnc9QW9bM10pOihlLng9QW9bM10sZS55PUFvWzJdLGUuej1Bb1sxXSxlLnc9QW9bMF0pLGV9O0x0LnVucGFja0Zsb2F0PWZ1bmN0aW9uKHQpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInBhY2tlZEZsb2F0Iix0KSxDMT8oQW9bMF09dC54LEFvWzFdPXQueSxBb1syXT10LnosQW9bM109dC53KTooQW9bMF09dC53LEFvWzFdPXQueixBb1syXT10LnksQW9bM109dC54KSxTbVswXX07aGU9THR9KTtmdW5jdGlvbiByZih0KXt0aGlzLm5hbWU9IlJ1bnRpbWVFcnJvciIsdGhpcy5tZXNzYWdlPXQ7bGV0IGU7dHJ5e3Rocm93IG5ldyBFcnJvcn1jYXRjaChuKXtlPW4uc3RhY2t9dGhpcy5zdGFjaz1lfXZhciBBZSxKcj1aKCgpPT57ZnQoKTtoKE9iamVjdC5jcmVhdGUpJiYocmYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSxyZi5wcm90b3R5cGUuY29uc3RydWN0b3I9cmYpO3JmLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2xldCB0PWAke3RoaXMubmFtZX06ICR7dGhpcy5tZXNzYWdlfWA7cmV0dXJuIGgodGhpcy5zdGFjaykmJih0Kz1gCiR7dGhpcy5zdGFjay50b1N0cmluZygpfWApLHR9O0FlPXJmfSk7ZnVuY3Rpb24gYnQodCxlLG4sbyxyLGkscyxmLHUsYyxsLHAsZCxtLF8sZyl7dGhpc1swXT14KHQsMCksdGhpc1sxXT14KHIsMCksdGhpc1syXT14KHUsMCksdGhpc1szXT14KGQsMCksdGhpc1s0XT14KGUsMCksdGhpc1s1XT14KGksMCksdGhpc1s2XT14KGMsMCksdGhpc1s3XT14KG0sMCksdGhpc1s4XT14KG4sMCksdGhpc1s5XT14KHMsMCksdGhpc1sxMF09eChsLDApLHRoaXNbMTFdPXgoXywwKSx0aGlzWzEyXT14KG8sMCksdGhpc1sxM109eChmLDApLHRoaXNbMTRdPXgocCwwKSx0aGlzWzE1XT14KGcsMCl9dmFyIEhjLHFjLHNmLElDLHZDLENtLHgxLExDLERDLEZDLEJDLFVDLFZDLGtDLHN0LEJuPVooKCk9PntGdCgpO2hyKCk7WHQoKTtJdCgpO2Z0KCk7SHQoKTtXdCgpO0ZuKCk7SnIoKTtidC5wYWNrZWRMZW5ndGg9MTY7YnQucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49eChuLDApLGVbbisrXT10WzBdLGVbbisrXT10WzFdLGVbbisrXT10WzJdLGVbbisrXT10WzNdLGVbbisrXT10WzRdLGVbbisrXT10WzVdLGVbbisrXT10WzZdLGVbbisrXT10WzddLGVbbisrXT10WzhdLGVbbisrXT10WzldLGVbbisrXT10WzEwXSxlW24rK109dFsxMV0sZVtuKytdPXRbMTJdLGVbbisrXT10WzEzXSxlW24rK109dFsxNF0sZVtuXT10WzE1XSxlfTtidC51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LmRlZmluZWQoImFycmF5Iix0KSxlPXgoZSwwKSxoKG4pfHwobj1uZXcgYnQpLG5bMF09dFtlKytdLG5bMV09dFtlKytdLG5bMl09dFtlKytdLG5bM109dFtlKytdLG5bNF09dFtlKytdLG5bNV09dFtlKytdLG5bNl09dFtlKytdLG5bN109dFtlKytdLG5bOF09dFtlKytdLG5bOV09dFtlKytdLG5bMTBdPXRbZSsrXSxuWzExXT10W2UrK10sblsxMl09dFtlKytdLG5bMTNdPXRbZSsrXSxuWzE0XT10W2UrK10sblsxNV09dFtlXSxufTtidC5wYWNrQXJyYXk9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoImFycmF5Iix0KTtsZXQgbj10Lmxlbmd0aCxvPW4qMTY7aWYoIWgoZSkpZT1uZXcgQXJyYXkobyk7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1vKXRocm93IG5ldyBGKCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMTYgZWxlbWVudHMiKTtlLmxlbmd0aCE9PW8mJihlLmxlbmd0aD1vKX1mb3IobGV0IHI9MDtyPG47KytyKWJ0LnBhY2sodFtyXSxlLHIqMTYpO3JldHVybiBlfTtidC51bnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe2lmKHkuZGVmaW5lZCgiYXJyYXkiLHQpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJhcnJheS5sZW5ndGgiLHQubGVuZ3RoLDE2KSx0Lmxlbmd0aCUxNiE9PTApdGhyb3cgbmV3IEYoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIik7bGV0IG49dC5sZW5ndGg7aChlKT9lLmxlbmd0aD1uLzE2OmU9bmV3IEFycmF5KG4vMTYpO2ZvcihsZXQgbz0wO288bjtvKz0xNil7bGV0IHI9by8xNjtlW3JdPWJ0LnVucGFjayh0LG8sZVtyXSl9cmV0dXJuIGV9O2J0LmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYoaCh0KSlyZXR1cm4gaChlKT8oZVswXT10WzBdLGVbMV09dFsxXSxlWzJdPXRbMl0sZVszXT10WzNdLGVbNF09dFs0XSxlWzVdPXRbNV0sZVs2XT10WzZdLGVbN109dFs3XSxlWzhdPXRbOF0sZVs5XT10WzldLGVbMTBdPXRbMTBdLGVbMTFdPXRbMTFdLGVbMTJdPXRbMTJdLGVbMTNdPXRbMTNdLGVbMTRdPXRbMTRdLGVbMTVdPXRbMTVdLGUpOm5ldyBidCh0WzBdLHRbNF0sdFs4XSx0WzEyXSx0WzFdLHRbNV0sdFs5XSx0WzEzXSx0WzJdLHRbNl0sdFsxMF0sdFsxNF0sdFszXSx0WzddLHRbMTFdLHRbMTVdKX07YnQuZnJvbUFycmF5PWJ0LnVucGFjaztidC5mcm9tQ29sdW1uTWFqb3JBcnJheT1mdW5jdGlvbih0LGUpe3JldHVybiB5LmRlZmluZWQoInZhbHVlcyIsdCksYnQuY2xvbmUodCxlKX07YnQuZnJvbVJvd01ham9yQXJyYXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS5kZWZpbmVkKCJ2YWx1ZXMiLHQpLGgoZSk/KGVbMF09dFswXSxlWzFdPXRbNF0sZVsyXT10WzhdLGVbM109dFsxMl0sZVs0XT10WzFdLGVbNV09dFs1XSxlWzZdPXRbOV0sZVs3XT10WzEzXSxlWzhdPXRbMl0sZVs5XT10WzZdLGVbMTBdPXRbMTBdLGVbMTFdPXRbMTRdLGVbMTJdPXRbM10sZVsxM109dFs3XSxlWzE0XT10WzExXSxlWzE1XT10WzE1XSxlKTpuZXcgYnQodFswXSx0WzFdLHRbMl0sdFszXSx0WzRdLHRbNV0sdFs2XSx0WzddLHRbOF0sdFs5XSx0WzEwXSx0WzExXSx0WzEyXSx0WzEzXSx0WzE0XSx0WzE1XSl9O2J0LmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJyb3RhdGlvbiIsdCksZT14KGUsYS5aRVJPKSxoKG4pPyhuWzBdPXRbMF0sblsxXT10WzFdLG5bMl09dFsyXSxuWzNdPTAsbls0XT10WzNdLG5bNV09dFs0XSxuWzZdPXRbNV0sbls3XT0wLG5bOF09dFs2XSxuWzldPXRbN10sblsxMF09dFs4XSxuWzExXT0wLG5bMTJdPWUueCxuWzEzXT1lLnksblsxNF09ZS56LG5bMTVdPTEsbik6bmV3IGJ0KHRbMF0sdFszXSx0WzZdLGUueCx0WzFdLHRbNF0sdFs3XSxlLnksdFsyXSx0WzVdLHRbOF0sZS56LDAsMCwwLDEpfTtidC5mcm9tVHJhbnNsYXRpb25RdWF0ZXJuaW9uUm90YXRpb25TY2FsZT1mdW5jdGlvbih0LGUsbixvKXt5LnR5cGVPZi5vYmplY3QoInRyYW5zbGF0aW9uIix0KSx5LnR5cGVPZi5vYmplY3QoInJvdGF0aW9uIixlKSx5LnR5cGVPZi5vYmplY3QoInNjYWxlIixuKSxoKG8pfHwobz1uZXcgYnQpO2xldCByPW4ueCxpPW4ueSxzPW4ueixmPWUueCplLngsdT1lLngqZS55LGM9ZS54KmUueixsPWUueCplLncscD1lLnkqZS55LGQ9ZS55KmUueixtPWUueSplLncsXz1lLnoqZS56LGc9ZS56KmUudyxiPWUudyplLncsdz1mLXAtXytiLE89MioodS1nKSxFPTIqKGMrbSksVD0yKih1K2cpLEM9LWYrcC1fK2IsTj0yKihkLWwpLEk9MiooYy1tKSxEPTIqKGQrbCksdj0tZi1wK18rYjtyZXR1cm4gb1swXT13KnIsb1sxXT1UKnIsb1syXT1JKnIsb1szXT0wLG9bNF09TyppLG9bNV09QyppLG9bNl09RCppLG9bN109MCxvWzhdPUUqcyxvWzldPU4qcyxvWzEwXT12KnMsb1sxMV09MCxvWzEyXT10Lngsb1sxM109dC55LG9bMTRdPXQueixvWzE1XT0xLG99O2J0LmZyb21UcmFuc2xhdGlvblJvdGF0aW9uU2NhbGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJ0cmFuc2xhdGlvblJvdGF0aW9uU2NhbGUiLHQpLGJ0LmZyb21UcmFuc2xhdGlvblF1YXRlcm5pb25Sb3RhdGlvblNjYWxlKHQudHJhbnNsYXRpb24sdC5yb3RhdGlvbix0LnNjYWxlLGUpfTtidC5mcm9tVHJhbnNsYXRpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJ0cmFuc2xhdGlvbiIsdCksYnQuZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24oSi5JREVOVElUWSx0LGUpfTtidC5mcm9tU2NhbGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJzY2FsZSIsdCksaChlKT8oZVswXT10LngsZVsxXT0wLGVbMl09MCxlWzNdPTAsZVs0XT0wLGVbNV09dC55LGVbNl09MCxlWzddPTAsZVs4XT0wLGVbOV09MCxlWzEwXT10LnosZVsxMV09MCxlWzEyXT0wLGVbMTNdPTAsZVsxNF09MCxlWzE1XT0xLGUpOm5ldyBidCh0LngsMCwwLDAsMCx0LnksMCwwLDAsMCx0LnosMCwwLDAsMCwxKX07YnQuZnJvbVVuaWZvcm1TY2FsZT1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5udW1iZXIoInNjYWxlIix0KSxoKGUpPyhlWzBdPXQsZVsxXT0wLGVbMl09MCxlWzNdPTAsZVs0XT0wLGVbNV09dCxlWzZdPTAsZVs3XT0wLGVbOF09MCxlWzldPTAsZVsxMF09dCxlWzExXT0wLGVbMTJdPTAsZVsxM109MCxlWzE0XT0wLGVbMTVdPTEsZSk6bmV3IGJ0KHQsMCwwLDAsMCx0LDAsMCwwLDAsdCwwLDAsMCwwLDEpfTtidC5mcm9tUm90YXRpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJyb3RhdGlvbiIsdCksaChlKXx8KGU9bmV3IGJ0KSxlWzBdPXRbMF0sZVsxXT10WzFdLGVbMl09dFsyXSxlWzNdPTAsZVs0XT10WzNdLGVbNV09dFs0XSxlWzZdPXRbNV0sZVs3XT0wLGVbOF09dFs2XSxlWzldPXRbN10sZVsxMF09dFs4XSxlWzExXT0wLGVbMTJdPTAsZVsxM109MCxlWzE0XT0wLGVbMTVdPTEsZX07SGM9bmV3IGEscWM9bmV3IGEsc2Y9bmV3IGE7YnQuZnJvbUNhbWVyYT1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgiY2FtZXJhIix0KTtsZXQgbj10LnBvc2l0aW9uLG89dC5kaXJlY3Rpb24scj10LnVwO3kudHlwZU9mLm9iamVjdCgiY2FtZXJhLnBvc2l0aW9uIixuKSx5LnR5cGVPZi5vYmplY3QoImNhbWVyYS5kaXJlY3Rpb24iLG8pLHkudHlwZU9mLm9iamVjdCgiY2FtZXJhLnVwIixyKSxhLm5vcm1hbGl6ZShvLEhjKSxhLm5vcm1hbGl6ZShhLmNyb3NzKEhjLHIscWMpLHFjKSxhLm5vcm1hbGl6ZShhLmNyb3NzKHFjLEhjLHNmKSxzZik7bGV0IGk9cWMueCxzPXFjLnksZj1xYy56LHU9SGMueCxjPUhjLnksbD1IYy56LHA9c2YueCxkPXNmLnksbT1zZi56LF89bi54LGc9bi55LGI9bi56LHc9aSotXytzKi1nK2YqLWIsTz1wKi1fK2QqLWcrbSotYixFPXUqXytjKmcrbCpiO3JldHVybiBoKGUpPyhlWzBdPWksZVsxXT1wLGVbMl09LXUsZVszXT0wLGVbNF09cyxlWzVdPWQsZVs2XT0tYyxlWzddPTAsZVs4XT1mLGVbOV09bSxlWzEwXT0tbCxlWzExXT0wLGVbMTJdPXcsZVsxM109TyxlWzE0XT1FLGVbMTVdPTEsZSk6bmV3IGJ0KGkscyxmLHcscCxkLG0sTywtdSwtYywtbCxFLDAsMCwwLDEpfTtidC5jb21wdXRlUGVyc3BlY3RpdmVGaWVsZE9mVmlldz1mdW5jdGlvbih0LGUsbixvLHIpe3kudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbigiZm92WSIsdCwwKSx5LnR5cGVPZi5udW1iZXIubGVzc1RoYW4oImZvdlkiLHQsTWF0aC5QSSkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuKCJuZWFyIixuLDApLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbigiZmFyIixvLDApLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixyKTtsZXQgcz0xL01hdGgudGFuKHQqLjUpLGY9cy9lLHU9KG8rbikvKG4tbyksYz0yKm8qbi8obi1vKTtyZXR1cm4gclswXT1mLHJbMV09MCxyWzJdPTAsclszXT0wLHJbNF09MCxyWzVdPXMscls2XT0wLHJbN109MCxyWzhdPTAscls5XT0wLHJbMTBdPXUsclsxMV09LTEsclsxMl09MCxyWzEzXT0wLHJbMTRdPWMsclsxNV09MCxyfTtidC5jb21wdXRlT3J0aG9ncmFwaGljT2ZmQ2VudGVyPWZ1bmN0aW9uKHQsZSxuLG8scixpLHMpe3kudHlwZU9mLm51bWJlcigibGVmdCIsdCkseS50eXBlT2YubnVtYmVyKCJyaWdodCIsZSkseS50eXBlT2YubnVtYmVyKCJib3R0b20iLG4pLHkudHlwZU9mLm51bWJlcigidG9wIixvKSx5LnR5cGVPZi5udW1iZXIoIm5lYXIiLHIpLHkudHlwZU9mLm51bWJlcigiZmFyIixpKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIscyk7bGV0IGY9MS8oZS10KSx1PTEvKG8tbiksYz0xLyhpLXIpLGw9LShlK3QpKmYscD0tKG8rbikqdSxkPS0oaStyKSpjO3JldHVybiBmKj0yLHUqPTIsYyo9LTIsc1swXT1mLHNbMV09MCxzWzJdPTAsc1szXT0wLHNbNF09MCxzWzVdPXUsc1s2XT0wLHNbN109MCxzWzhdPTAsc1s5XT0wLHNbMTBdPWMsc1sxMV09MCxzWzEyXT1sLHNbMTNdPXAsc1sxNF09ZCxzWzE1XT0xLHN9O2J0LmNvbXB1dGVQZXJzcGVjdGl2ZU9mZkNlbnRlcj1mdW5jdGlvbih0LGUsbixvLHIsaSxzKXt5LnR5cGVPZi5udW1iZXIoImxlZnQiLHQpLHkudHlwZU9mLm51bWJlcigicmlnaHQiLGUpLHkudHlwZU9mLm51bWJlcigiYm90dG9tIixuKSx5LnR5cGVPZi5udW1iZXIoInRvcCIsbykseS50eXBlT2YubnVtYmVyKCJuZWFyIixyKSx5LnR5cGVPZi5udW1iZXIoImZhciIsaSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLHMpO2xldCBmPTIqci8oZS10KSx1PTIqci8oby1uKSxjPShlK3QpLyhlLXQpLGw9KG8rbikvKG8tbikscD0tKGkrcikvKGktciksZD0tMSxtPS0yKmkqci8oaS1yKTtyZXR1cm4gc1swXT1mLHNbMV09MCxzWzJdPTAsc1szXT0wLHNbNF09MCxzWzVdPXUsc1s2XT0wLHNbN109MCxzWzhdPWMsc1s5XT1sLHNbMTBdPXAsc1sxMV09ZCxzWzEyXT0wLHNbMTNdPTAsc1sxNF09bSxzWzE1XT0wLHN9O2J0LmNvbXB1dGVJbmZpbml0ZVBlcnNwZWN0aXZlT2ZmQ2VudGVyPWZ1bmN0aW9uKHQsZSxuLG8scixpKXt5LnR5cGVPZi5udW1iZXIoImxlZnQiLHQpLHkudHlwZU9mLm51bWJlcigicmlnaHQiLGUpLHkudHlwZU9mLm51bWJlcigiYm90dG9tIixuKSx5LnR5cGVPZi5udW1iZXIoInRvcCIsbykseS50eXBlT2YubnVtYmVyKCJuZWFyIixyKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsaSk7bGV0IHM9MipyLyhlLXQpLGY9MipyLyhvLW4pLHU9KGUrdCkvKGUtdCksYz0obytuKS8oby1uKSxsPS0xLHA9LTEsZD0tMipyO3JldHVybiBpWzBdPXMsaVsxXT0wLGlbMl09MCxpWzNdPTAsaVs0XT0wLGlbNV09ZixpWzZdPTAsaVs3XT0wLGlbOF09dSxpWzldPWMsaVsxMF09bCxpWzExXT1wLGlbMTJdPTAsaVsxM109MCxpWzE0XT1kLGlbMTVdPTAsaX07YnQuY29tcHV0ZVZpZXdwb3J0VHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odCxlLG4sbyl7aChvKXx8KG89bmV3IGJ0KSx0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IHI9eCh0LngsMCksaT14KHQueSwwKSxzPXgodC53aWR0aCwwKSxmPXgodC5oZWlnaHQsMCk7ZT14KGUsMCksbj14KG4sMSk7bGV0IHU9cyouNSxjPWYqLjUsbD0obi1lKSouNSxwPXUsZD1jLG09bCxfPXIrdSxnPWkrYyxiPWUrbCx3PTE7cmV0dXJuIG9bMF09cCxvWzFdPTAsb1syXT0wLG9bM109MCxvWzRdPTAsb1s1XT1kLG9bNl09MCxvWzddPTAsb1s4XT0wLG9bOV09MCxvWzEwXT1tLG9bMTFdPTAsb1sxMl09XyxvWzEzXT1nLG9bMTRdPWIsb1sxNV09dyxvfTtidC5jb21wdXRlVmlldz1mdW5jdGlvbih0LGUsbixvLHIpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInBvc2l0aW9uIix0KSx5LnR5cGVPZi5vYmplY3QoImRpcmVjdGlvbiIsZSkseS50eXBlT2Yub2JqZWN0KCJ1cCIsbikseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsbykseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLHIpLHJbMF09by54LHJbMV09bi54LHJbMl09LWUueCxyWzNdPTAscls0XT1vLnkscls1XT1uLnkscls2XT0tZS55LHJbN109MCxyWzhdPW8ueixyWzldPW4ueixyWzEwXT0tZS56LHJbMTFdPTAsclsxMl09LWEuZG90KG8sdCksclsxM109LWEuZG90KG4sdCksclsxNF09YS5kb3QoZSx0KSxyWzE1XT0xLHJ9O2J0LnRvQXJyYXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLGgoZSk/KGVbMF09dFswXSxlWzFdPXRbMV0sZVsyXT10WzJdLGVbM109dFszXSxlWzRdPXRbNF0sZVs1XT10WzVdLGVbNl09dFs2XSxlWzddPXRbN10sZVs4XT10WzhdLGVbOV09dFs5XSxlWzEwXT10WzEwXSxlWzExXT10WzExXSxlWzEyXT10WzEyXSxlWzEzXT10WzEzXSxlWzE0XT10WzE0XSxlWzE1XT10WzE1XSxlKTpbdFswXSx0WzFdLHRbMl0sdFszXSx0WzRdLHRbNV0sdFs2XSx0WzddLHRbOF0sdFs5XSx0WzEwXSx0WzExXSx0WzEyXSx0WzEzXSx0WzE0XSx0WzE1XV19O2J0LmdldEVsZW1lbnRJbmRleD1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygicm93IixlLDApLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJyb3ciLGUsMykseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImNvbHVtbiIsdCwwKSx5LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygiY29sdW1uIix0LDMpLHQqNCtlfTtidC5nZXRDb2x1bW49ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiaW5kZXgiLGUsMCkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImluZGV4IixlLDMpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz1lKjQscj10W29dLGk9dFtvKzFdLHM9dFtvKzJdLGY9dFtvKzNdO3JldHVybiBuLng9cixuLnk9aSxuLno9cyxuLnc9ZixufTtidC5zZXRDb2x1bW49ZnVuY3Rpb24odCxlLG4sbyl7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJpbmRleCIsZSwwKSx5LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygiaW5kZXgiLGUsMykseS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLG4pLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixvKSxvPWJ0LmNsb25lKHQsbyk7bGV0IHI9ZSo0O3JldHVybiBvW3JdPW4ueCxvW3IrMV09bi55LG9bcisyXT1uLnosb1tyKzNdPW4udyxvfTtidC5nZXRSb3c9ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiaW5kZXgiLGUsMCkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImluZGV4IixlLDMpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz10W2VdLHI9dFtlKzRdLGk9dFtlKzhdLHM9dFtlKzEyXTtyZXR1cm4gbi54PW8sbi55PXIsbi56PWksbi53PXMsbn07YnQuc2V0Um93PWZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImluZGV4IixlLDApLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJpbmRleCIsZSwzKSx5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsbikseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG8pLG89YnQuY2xvbmUodCxvKSxvW2VdPW4ueCxvW2UrNF09bi55LG9bZSs4XT1uLnosb1tlKzEyXT1uLncsb307YnQuc2V0VHJhbnNsYXRpb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJ0cmFuc2xhdGlvbiIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG5bMF09dFswXSxuWzFdPXRbMV0sblsyXT10WzJdLG5bM109dFszXSxuWzRdPXRbNF0sbls1XT10WzVdLG5bNl09dFs2XSxuWzddPXRbN10sbls4XT10WzhdLG5bOV09dFs5XSxuWzEwXT10WzEwXSxuWzExXT10WzExXSxuWzEyXT1lLngsblsxM109ZS55LG5bMTRdPWUueixuWzE1XT10WzE1XSxufTtJQz1uZXcgYTtidC5zZXRTY2FsZT1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgic2NhbGUiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz1idC5nZXRTY2FsZSh0LElDKSxyPWUueC9vLngsaT1lLnkvby55LHM9ZS56L28uejtyZXR1cm4gblswXT10WzBdKnIsblsxXT10WzFdKnIsblsyXT10WzJdKnIsblszXT10WzNdLG5bNF09dFs0XSppLG5bNV09dFs1XSppLG5bNl09dFs2XSppLG5bN109dFs3XSxuWzhdPXRbOF0qcyxuWzldPXRbOV0qcyxuWzEwXT10WzEwXSpzLG5bMTFdPXRbMTFdLG5bMTJdPXRbMTJdLG5bMTNdPXRbMTNdLG5bMTRdPXRbMTRdLG5bMTVdPXRbMTVdLG59O3ZDPW5ldyBhO2J0LnNldFVuaWZvcm1TY2FsZT1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm51bWJlcigic2NhbGUiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz1idC5nZXRTY2FsZSh0LHZDKSxyPWUvby54LGk9ZS9vLnkscz1lL28uejtyZXR1cm4gblswXT10WzBdKnIsblsxXT10WzFdKnIsblsyXT10WzJdKnIsblszXT10WzNdLG5bNF09dFs0XSppLG5bNV09dFs1XSppLG5bNl09dFs2XSppLG5bN109dFs3XSxuWzhdPXRbOF0qcyxuWzldPXRbOV0qcyxuWzEwXT10WzEwXSpzLG5bMTFdPXRbMTFdLG5bMTJdPXRbMTJdLG5bMTNdPXRbMTNdLG5bMTRdPXRbMTRdLG5bMTVdPXRbMTVdLG59O0NtPW5ldyBhO2J0LmdldFNjYWxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZS54PWEubWFnbml0dWRlKGEuZnJvbUVsZW1lbnRzKHRbMF0sdFsxXSx0WzJdLENtKSksZS55PWEubWFnbml0dWRlKGEuZnJvbUVsZW1lbnRzKHRbNF0sdFs1XSx0WzZdLENtKSksZS56PWEubWFnbml0dWRlKGEuZnJvbUVsZW1lbnRzKHRbOF0sdFs5XSx0WzEwXSxDbSkpLGV9O3gxPW5ldyBhO2J0LmdldE1heGltdW1TY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYnQuZ2V0U2NhbGUodCx4MSksYS5tYXhpbXVtQ29tcG9uZW50KHgxKX07TEM9bmV3IGE7YnQuc2V0Um90YXRpb249ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7bGV0IG89YnQuZ2V0U2NhbGUodCxMQyk7cmV0dXJuIG5bMF09ZVswXSpvLngsblsxXT1lWzFdKm8ueCxuWzJdPWVbMl0qby54LG5bM109dFszXSxuWzRdPWVbM10qby55LG5bNV09ZVs0XSpvLnksbls2XT1lWzVdKm8ueSxuWzddPXRbN10sbls4XT1lWzZdKm8ueixuWzldPWVbN10qby56LG5bMTBdPWVbOF0qby56LG5bMTFdPXRbMTFdLG5bMTJdPXRbMTJdLG5bMTNdPXRbMTNdLG5bMTRdPXRbMTRdLG5bMTVdPXRbMTVdLG59O0RDPW5ldyBhO2J0LmdldFJvdGF0aW9uPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKTtsZXQgbj1idC5nZXRTY2FsZSh0LERDKTtyZXR1cm4gZVswXT10WzBdL24ueCxlWzFdPXRbMV0vbi54LGVbMl09dFsyXS9uLngsZVszXT10WzRdL24ueSxlWzRdPXRbNV0vbi55LGVbNV09dFs2XS9uLnksZVs2XT10WzhdL24ueixlWzddPXRbOV0vbi56LGVbOF09dFsxMF0vbi56LGV9O2J0Lm11bHRpcGx5PWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz10WzBdLHI9dFsxXSxpPXRbMl0scz10WzNdLGY9dFs0XSx1PXRbNV0sYz10WzZdLGw9dFs3XSxwPXRbOF0sZD10WzldLG09dFsxMF0sXz10WzExXSxnPXRbMTJdLGI9dFsxM10sdz10WzE0XSxPPXRbMTVdLEU9ZVswXSxUPWVbMV0sQz1lWzJdLE49ZVszXSxJPWVbNF0sRD1lWzVdLHY9ZVs2XSxMPWVbN10sVT1lWzhdLEE9ZVs5XSxTPWVbMTBdLFA9ZVsxMV0sQj1lWzEyXSxqPWVbMTNdLEg9ZVsxNF0saz1lWzE1XSxLPW8qRStmKlQrcCpDK2cqTixYPXIqRSt1KlQrZCpDK2IqTixSPWkqRStjKlQrbSpDK3cqTixvdD1zKkUrbCpUK18qQytPKk4sY3Q9bypJK2YqRCtwKnYrZypMLHB0PXIqSSt1KkQrZCp2K2IqTCx5dD1pKkkrYypEK20qdit3KkwscnQ9cypJK2wqRCtfKnYrTypMLFB0PW8qVStmKkErcCpTK2cqUCxndD1yKlUrdSpBK2QqUytiKlAsQ3Q9aSpVK2MqQSttKlMrdypQLG10PXMqVStsKkErXypTK08qUCx1dD1vKkIrZipqK3AqSCtnKmssdnQ9cipCK3UqaitkKkgrYiprLHp0PWkqQitjKmorbSpIK3cqayxtZT1zKkIrbCpqK18qSCtPKms7cmV0dXJuIG5bMF09SyxuWzFdPVgsblsyXT1SLG5bM109b3Qsbls0XT1jdCxuWzVdPXB0LG5bNl09eXQsbls3XT1ydCxuWzhdPVB0LG5bOV09Z3QsblsxMF09Q3QsblsxMV09bXQsblsxMl09dXQsblsxM109dnQsblsxNF09enQsblsxNV09bWUsbn07YnQuYWRkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksblswXT10WzBdK2VbMF0sblsxXT10WzFdK2VbMV0sblsyXT10WzJdK2VbMl0sblszXT10WzNdK2VbM10sbls0XT10WzRdK2VbNF0sbls1XT10WzVdK2VbNV0sbls2XT10WzZdK2VbNl0sbls3XT10WzddK2VbN10sbls4XT10WzhdK2VbOF0sbls5XT10WzldK2VbOV0sblsxMF09dFsxMF0rZVsxMF0sblsxMV09dFsxMV0rZVsxMV0sblsxMl09dFsxMl0rZVsxMl0sblsxM109dFsxM10rZVsxM10sblsxNF09dFsxNF0rZVsxNF0sblsxNV09dFsxNV0rZVsxNV0sbn07YnQuc3VidHJhY3Q9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuWzBdPXRbMF0tZVswXSxuWzFdPXRbMV0tZVsxXSxuWzJdPXRbMl0tZVsyXSxuWzNdPXRbM10tZVszXSxuWzRdPXRbNF0tZVs0XSxuWzVdPXRbNV0tZVs1XSxuWzZdPXRbNl0tZVs2XSxuWzddPXRbN10tZVs3XSxuWzhdPXRbOF0tZVs4XSxuWzldPXRbOV0tZVs5XSxuWzEwXT10WzEwXS1lWzEwXSxuWzExXT10WzExXS1lWzExXSxuWzEyXT10WzEyXS1lWzEyXSxuWzEzXT10WzEzXS1lWzEzXSxuWzE0XT10WzE0XS1lWzE0XSxuWzE1XT10WzE1XS1lWzE1XSxufTtidC5tdWx0aXBseVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz10WzBdLHI9dFsxXSxpPXRbMl0scz10WzRdLGY9dFs1XSx1PXRbNl0sYz10WzhdLGw9dFs5XSxwPXRbMTBdLGQ9dFsxMl0sbT10WzEzXSxfPXRbMTRdLGc9ZVswXSxiPWVbMV0sdz1lWzJdLE89ZVs0XSxFPWVbNV0sVD1lWzZdLEM9ZVs4XSxOPWVbOV0sST1lWzEwXSxEPWVbMTJdLHY9ZVsxM10sTD1lWzE0XSxVPW8qZytzKmIrYyp3LEE9cipnK2YqYitsKncsUz1pKmcrdSpiK3AqdyxQPW8qTytzKkUrYypULEI9cipPK2YqRStsKlQsaj1pKk8rdSpFK3AqVCxIPW8qQytzKk4rYypJLGs9cipDK2YqTitsKkksSz1pKkMrdSpOK3AqSSxYPW8qRCtzKnYrYypMK2QsUj1yKkQrZip2K2wqTCttLG90PWkqRCt1KnYrcCpMK187cmV0dXJuIG5bMF09VSxuWzFdPUEsblsyXT1TLG5bM109MCxuWzRdPVAsbls1XT1CLG5bNl09aixuWzddPTAsbls4XT1ILG5bOV09ayxuWzEwXT1LLG5bMTFdPTAsblsxMl09WCxuWzEzXT1SLG5bMTRdPW90LG5bMTVdPTEsbn07YnQubXVsdGlwbHlCeU1hdHJpeDM9ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5vYmplY3QoInJvdGF0aW9uIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7bGV0IG89dFswXSxyPXRbMV0saT10WzJdLHM9dFs0XSxmPXRbNV0sdT10WzZdLGM9dFs4XSxsPXRbOV0scD10WzEwXSxkPWVbMF0sbT1lWzFdLF89ZVsyXSxnPWVbM10sYj1lWzRdLHc9ZVs1XSxPPWVbNl0sRT1lWzddLFQ9ZVs4XSxDPW8qZCtzKm0rYypfLE49cipkK2YqbStsKl8sST1pKmQrdSptK3AqXyxEPW8qZytzKmIrYyp3LHY9cipnK2YqYitsKncsTD1pKmcrdSpiK3AqdyxVPW8qTytzKkUrYypULEE9cipPK2YqRStsKlQsUz1pKk8rdSpFK3AqVDtyZXR1cm4gblswXT1DLG5bMV09TixuWzJdPUksblszXT0wLG5bNF09RCxuWzVdPXYsbls2XT1MLG5bN109MCxuWzhdPVUsbls5XT1BLG5bMTBdPVMsblsxMV09MCxuWzEyXT10WzEyXSxuWzEzXT10WzEzXSxuWzE0XT10WzE0XSxuWzE1XT10WzE1XSxufTtidC5tdWx0aXBseUJ5VHJhbnNsYXRpb249ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5vYmplY3QoInRyYW5zbGF0aW9uIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7bGV0IG89ZS54LHI9ZS55LGk9ZS56LHM9byp0WzBdK3IqdFs0XStpKnRbOF0rdFsxMl0sZj1vKnRbMV0rcip0WzVdK2kqdFs5XSt0WzEzXSx1PW8qdFsyXStyKnRbNl0raSp0WzEwXSt0WzE0XTtyZXR1cm4gblswXT10WzBdLG5bMV09dFsxXSxuWzJdPXRbMl0sblszXT10WzNdLG5bNF09dFs0XSxuWzVdPXRbNV0sbls2XT10WzZdLG5bN109dFs3XSxuWzhdPXRbOF0sbls5XT10WzldLG5bMTBdPXRbMTBdLG5bMTFdPXRbMTFdLG5bMTJdPXMsblsxM109ZixuWzE0XT11LG5bMTVdPXRbMTVdLG59O2J0Lm11bHRpcGx5QnlTY2FsZT1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgic2NhbGUiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz1lLngscj1lLnksaT1lLno7cmV0dXJuIG89PT0xJiZyPT09MSYmaT09PTE/YnQuY2xvbmUodCxuKTooblswXT1vKnRbMF0sblsxXT1vKnRbMV0sblsyXT1vKnRbMl0sblszXT10WzNdLG5bNF09cip0WzRdLG5bNV09cip0WzVdLG5bNl09cip0WzZdLG5bN109dFs3XSxuWzhdPWkqdFs4XSxuWzldPWkqdFs5XSxuWzEwXT1pKnRbMTBdLG5bMTFdPXRbMTFdLG5bMTJdPXRbMTJdLG5bMTNdPXRbMTNdLG5bMTRdPXRbMTRdLG5bMTVdPXRbMTVdLG4pfTtidC5tdWx0aXBseUJ5VW5pZm9ybVNjYWxlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm51bWJlcigic2NhbGUiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuWzBdPXRbMF0qZSxuWzFdPXRbMV0qZSxuWzJdPXRbMl0qZSxuWzNdPXRbM10sbls0XT10WzRdKmUsbls1XT10WzVdKmUsbls2XT10WzZdKmUsbls3XT10WzddLG5bOF09dFs4XSplLG5bOV09dFs5XSplLG5bMTBdPXRbMTBdKmUsblsxMV09dFsxMV0sblsxMl09dFsxMl0sblsxM109dFsxM10sblsxNF09dFsxNF0sblsxNV09dFsxNV0sbn07YnQubXVsdGlwbHlCeVZlY3Rvcj1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7bGV0IG89ZS54LHI9ZS55LGk9ZS56LHM9ZS53LGY9dFswXSpvK3RbNF0qcit0WzhdKmkrdFsxMl0qcyx1PXRbMV0qbyt0WzVdKnIrdFs5XSppK3RbMTNdKnMsYz10WzJdKm8rdFs2XSpyK3RbMTBdKmkrdFsxNF0qcyxsPXRbM10qbyt0WzddKnIrdFsxMV0qaSt0WzE1XSpzO3JldHVybiBuLng9ZixuLnk9dSxuLno9YyxuLnc9bCxufTtidC5tdWx0aXBseUJ5UG9pbnRBc1ZlY3Rvcj1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7bGV0IG89ZS54LHI9ZS55LGk9ZS56LHM9dFswXSpvK3RbNF0qcit0WzhdKmksZj10WzFdKm8rdFs1XSpyK3RbOV0qaSx1PXRbMl0qbyt0WzZdKnIrdFsxMF0qaTtyZXR1cm4gbi54PXMsbi55PWYsbi56PXUsbn07YnQubXVsdGlwbHlCeVBvaW50PWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz1lLngscj1lLnksaT1lLnoscz10WzBdKm8rdFs0XSpyK3RbOF0qaSt0WzEyXSxmPXRbMV0qbyt0WzVdKnIrdFs5XSppK3RbMTNdLHU9dFsyXSpvK3RbNl0qcit0WzEwXSppK3RbMTRdO3JldHVybiBuLng9cyxuLnk9ZixuLno9dSxufTtidC5tdWx0aXBseUJ5U2NhbGFyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm51bWJlcigic2NhbGFyIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksblswXT10WzBdKmUsblsxXT10WzFdKmUsblsyXT10WzJdKmUsblszXT10WzNdKmUsbls0XT10WzRdKmUsbls1XT10WzVdKmUsbls2XT10WzZdKmUsbls3XT10WzddKmUsbls4XT10WzhdKmUsbls5XT10WzldKmUsblsxMF09dFsxMF0qZSxuWzExXT10WzExXSplLG5bMTJdPXRbMTJdKmUsblsxM109dFsxM10qZSxuWzE0XT10WzE0XSplLG5bMTVdPXRbMTVdKmUsbn07YnQubmVnYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZVswXT0tdFswXSxlWzFdPS10WzFdLGVbMl09LXRbMl0sZVszXT0tdFszXSxlWzRdPS10WzRdLGVbNV09LXRbNV0sZVs2XT0tdFs2XSxlWzddPS10WzddLGVbOF09LXRbOF0sZVs5XT0tdFs5XSxlWzEwXT0tdFsxMF0sZVsxMV09LXRbMTFdLGVbMTJdPS10WzEyXSxlWzEzXT0tdFsxM10sZVsxNF09LXRbMTRdLGVbMTVdPS10WzE1XSxlfTtidC50cmFuc3Bvc2U9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2xldCBuPXRbMV0sbz10WzJdLHI9dFszXSxpPXRbNl0scz10WzddLGY9dFsxMV07cmV0dXJuIGVbMF09dFswXSxlWzFdPXRbNF0sZVsyXT10WzhdLGVbM109dFsxMl0sZVs0XT1uLGVbNV09dFs1XSxlWzZdPXRbOV0sZVs3XT10WzEzXSxlWzhdPW8sZVs5XT1pLGVbMTBdPXRbMTBdLGVbMTFdPXRbMTRdLGVbMTJdPXIsZVsxM109cyxlWzE0XT1mLGVbMTVdPXRbMTVdLGV9O2J0LmFicz1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGVbMF09TWF0aC5hYnModFswXSksZVsxXT1NYXRoLmFicyh0WzFdKSxlWzJdPU1hdGguYWJzKHRbMl0pLGVbM109TWF0aC5hYnModFszXSksZVs0XT1NYXRoLmFicyh0WzRdKSxlWzVdPU1hdGguYWJzKHRbNV0pLGVbNl09TWF0aC5hYnModFs2XSksZVs3XT1NYXRoLmFicyh0WzddKSxlWzhdPU1hdGguYWJzKHRbOF0pLGVbOV09TWF0aC5hYnModFs5XSksZVsxMF09TWF0aC5hYnModFsxMF0pLGVbMTFdPU1hdGguYWJzKHRbMTFdKSxlWzEyXT1NYXRoLmFicyh0WzEyXSksZVsxM109TWF0aC5hYnModFsxM10pLGVbMTRdPU1hdGguYWJzKHRbMTRdKSxlWzE1XT1NYXRoLmFicyh0WzE1XSksZX07YnQuZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxoKHQpJiZoKGUpJiZ0WzEyXT09PWVbMTJdJiZ0WzEzXT09PWVbMTNdJiZ0WzE0XT09PWVbMTRdJiZ0WzBdPT09ZVswXSYmdFsxXT09PWVbMV0mJnRbMl09PT1lWzJdJiZ0WzRdPT09ZVs0XSYmdFs1XT09PWVbNV0mJnRbNl09PT1lWzZdJiZ0WzhdPT09ZVs4XSYmdFs5XT09PWVbOV0mJnRbMTBdPT09ZVsxMF0mJnRbM109PT1lWzNdJiZ0WzddPT09ZVs3XSYmdFsxMV09PT1lWzExXSYmdFsxNV09PT1lWzE1XX07YnQuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG49eChuLDApLHQ9PT1lfHxoKHQpJiZoKGUpJiZNYXRoLmFicyh0WzBdLWVbMF0pPD1uJiZNYXRoLmFicyh0WzFdLWVbMV0pPD1uJiZNYXRoLmFicyh0WzJdLWVbMl0pPD1uJiZNYXRoLmFicyh0WzNdLWVbM10pPD1uJiZNYXRoLmFicyh0WzRdLWVbNF0pPD1uJiZNYXRoLmFicyh0WzVdLWVbNV0pPD1uJiZNYXRoLmFicyh0WzZdLWVbNl0pPD1uJiZNYXRoLmFicyh0WzddLWVbN10pPD1uJiZNYXRoLmFicyh0WzhdLWVbOF0pPD1uJiZNYXRoLmFicyh0WzldLWVbOV0pPD1uJiZNYXRoLmFicyh0WzEwXS1lWzEwXSk8PW4mJk1hdGguYWJzKHRbMTFdLWVbMTFdKTw9biYmTWF0aC5hYnModFsxMl0tZVsxMl0pPD1uJiZNYXRoLmFicyh0WzEzXS1lWzEzXSk8PW4mJk1hdGguYWJzKHRbMTRdLWVbMTRdKTw9biYmTWF0aC5hYnModFsxNV0tZVsxNV0pPD1ufTtidC5nZXRUcmFuc2xhdGlvbj1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGUueD10WzEyXSxlLnk9dFsxM10sZS56PXRbMTRdLGV9O2J0LmdldE1hdHJpeDM9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlWzBdPXRbMF0sZVsxXT10WzFdLGVbMl09dFsyXSxlWzNdPXRbNF0sZVs0XT10WzVdLGVbNV09dFs2XSxlWzZdPXRbOF0sZVs3XT10WzldLGVbOF09dFsxMF0sZX07RkM9bmV3IEosQkM9bmV3IEosVUM9bmV3IGhlLFZDPW5ldyBoZSgwLDAsMCwxKTtidC5pbnZlcnNlPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKTtsZXQgbj10WzBdLG89dFs0XSxyPXRbOF0saT10WzEyXSxzPXRbMV0sZj10WzVdLHU9dFs5XSxjPXRbMTNdLGw9dFsyXSxwPXRbNl0sZD10WzEwXSxtPXRbMTRdLF89dFszXSxnPXRbN10sYj10WzExXSx3PXRbMTVdLE89ZCp3LEU9bSpiLFQ9cCp3LEM9bSpnLE49cCpiLEk9ZCpnLEQ9bCp3LHY9bSpfLEw9bCpiLFU9ZCpfLEE9bCpnLFM9cCpfLFA9TypmK0MqdStOKmMtKEUqZitUKnUrSSpjKSxCPUUqcytEKnUrVSpjLShPKnMrdip1K0wqYyksaj1UKnMrdipmK0EqYy0oQypzK0QqZitTKmMpLEg9SSpzK0wqZitTKnUtKE4qcytVKmYrQSp1KSxrPUUqbytUKnIrSSppLShPKm8rQypyK04qaSksSz1PKm4rdipyK0wqaS0oRSpuK0QqcitVKmkpLFg9QypuK0QqbytTKmktKFQqbit2Km8rQSppKSxSPU4qbitVKm8rQSpyLShJKm4rTCpvK1Mqcik7Tz1yKmMsRT1pKnUsVD1vKmMsQz1pKmYsTj1vKnUsST1yKmYsRD1uKmMsdj1pKnMsTD1uKnUsVT1yKnMsQT1uKmYsUz1vKnM7bGV0IG90PU8qZytDKmIrTip3LShFKmcrVCpiK0kqdyksY3Q9RSpfK0QqYitVKnctKE8qXyt2KmIrTCp3KSxwdD1UKl8rdipnK0Eqdy0oQypfK0QqZytTKncpLHl0PUkqXytMKmcrUypiLShOKl8rVSpnK0EqYikscnQ9VCpkK0kqbStFKnAtKE4qbStPKnArQypkKSxQdD1MKm0rTypsK3YqZC0oRCpkK1UqbStFKmwpLGd0PUQqcCtTKm0rQypsLShBKm0rVCpsK3YqcCksQ3Q9QSpkK04qbCtVKnAtKEwqcCtTKmQrSSpsKSxtdD1uKlArbypCK3IqaitpKkg7aWYoTWF0aC5hYnMobXQpPE0uRVBTSUxPTjIxKXtpZihKLmVxdWFsc0Vwc2lsb24oYnQuZ2V0TWF0cml4Myh0LEZDKSxCQyxNLkVQU0lMT043KSYmaGUuZXF1YWxzKGJ0LmdldFJvdyh0LDMsVUMpLFZDKSlyZXR1cm4gZVswXT0wLGVbMV09MCxlWzJdPTAsZVszXT0wLGVbNF09MCxlWzVdPTAsZVs2XT0wLGVbN109MCxlWzhdPTAsZVs5XT0wLGVbMTBdPTAsZVsxMV09MCxlWzEyXT0tdFsxMl0sZVsxM109LXRbMTNdLGVbMTRdPS10WzE0XSxlWzE1XT0xLGU7dGhyb3cgbmV3IEFlKCJtYXRyaXggaXMgbm90IGludmVydGlibGUgYmVjYXVzZSBpdHMgZGV0ZXJtaW5hdGUgaXMgemVyby4iKX1yZXR1cm4gbXQ9MS9tdCxlWzBdPVAqbXQsZVsxXT1CKm10LGVbMl09aiptdCxlWzNdPUgqbXQsZVs0XT1rKm10LGVbNV09SyptdCxlWzZdPVgqbXQsZVs3XT1SKm10LGVbOF09b3QqbXQsZVs5XT1jdCptdCxlWzEwXT1wdCptdCxlWzExXT15dCptdCxlWzEyXT1ydCptdCxlWzEzXT1QdCptdCxlWzE0XT1ndCptdCxlWzE1XT1DdCptdCxlfTtidC5pbnZlcnNlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2xldCBuPXRbMF0sbz10WzFdLHI9dFsyXSxpPXRbNF0scz10WzVdLGY9dFs2XSx1PXRbOF0sYz10WzldLGw9dFsxMF0scD10WzEyXSxkPXRbMTNdLG09dFsxNF0sXz0tbipwLW8qZC1yKm0sZz0taSpwLXMqZC1mKm0sYj0tdSpwLWMqZC1sKm07cmV0dXJuIGVbMF09bixlWzFdPWksZVsyXT11LGVbM109MCxlWzRdPW8sZVs1XT1zLGVbNl09YyxlWzddPTAsZVs4XT1yLGVbOV09ZixlWzEwXT1sLGVbMTFdPTAsZVsxMl09XyxlWzEzXT1nLGVbMTRdPWIsZVsxNV09MSxlfTtrQz1uZXcgYnQ7YnQuaW52ZXJzZVRyYW5zcG9zZT1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGJ0LmludmVyc2UoYnQudHJhbnNwb3NlKHQsa0MpLGUpfTtidC5JREVOVElUWT1PYmplY3QuZnJlZXplKG5ldyBidCgxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxKSk7YnQuWkVSTz1PYmplY3QuZnJlZXplKG5ldyBidCgwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwKSk7YnQuQ09MVU1OMFJPVzA9MDtidC5DT0xVTU4wUk9XMT0xO2J0LkNPTFVNTjBST1cyPTI7YnQuQ09MVU1OMFJPVzM9MztidC5DT0xVTU4xUk9XMD00O2J0LkNPTFVNTjFST1cxPTU7YnQuQ09MVU1OMVJPVzI9NjtidC5DT0xVTU4xUk9XMz03O2J0LkNPTFVNTjJST1cwPTg7YnQuQ09MVU1OMlJPVzE9OTtidC5DT0xVTU4yUk9XMj0xMDtidC5DT0xVTU4yUk9XMz0xMTtidC5DT0xVTU4zUk9XMD0xMjtidC5DT0xVTU4zUk9XMT0xMztidC5DT0xVTU4zUk9XMj0xNDtidC5DT0xVTU4zUk9XMz0xNTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhidC5wcm90b3R5cGUse2xlbmd0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGJ0LnBhY2tlZExlbmd0aH19fSk7YnQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiBidC5jbG9uZSh0aGlzLHQpfTtidC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBidC5lcXVhbHModGhpcyx0KX07YnQuZXF1YWxzQXJyYXk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0WzBdPT09ZVtuXSYmdFsxXT09PWVbbisxXSYmdFsyXT09PWVbbisyXSYmdFszXT09PWVbbiszXSYmdFs0XT09PWVbbis0XSYmdFs1XT09PWVbbis1XSYmdFs2XT09PWVbbis2XSYmdFs3XT09PWVbbis3XSYmdFs4XT09PWVbbis4XSYmdFs5XT09PWVbbis5XSYmdFsxMF09PT1lW24rMTBdJiZ0WzExXT09PWVbbisxMV0mJnRbMTJdPT09ZVtuKzEyXSYmdFsxM109PT1lW24rMTNdJiZ0WzE0XT09PWVbbisxNF0mJnRbMTVdPT09ZVtuKzE1XX07YnQucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gYnQuZXF1YWxzRXBzaWxvbih0aGlzLHQsZSl9O2J0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzWzBdfSwgJHt0aGlzWzRdfSwgJHt0aGlzWzhdfSwgJHt0aGlzWzEyXX0pCigke3RoaXNbMV19LCAke3RoaXNbNV19LCAke3RoaXNbOV19LCAke3RoaXNbMTNdfSkKKCR7dGhpc1syXX0sICR7dGhpc1s2XX0sICR7dGhpc1sxMF19LCAke3RoaXNbMTRdfSkKKCR7dGhpc1szXX0sICR7dGhpc1s3XX0sICR7dGhpc1sxMV19LCAke3RoaXNbMTVdfSlgfTtzdD1idH0pO2Z1bmN0aW9uIEdDKHQsZSxuKXt5LmRlZmluZWQoImFycmF5Iix0KSx5LmRlZmluZWQoIml0ZW1Ub0ZpbmQiLGUpLHkuZGVmaW5lZCgiY29tcGFyYXRvciIsbik7bGV0IG89MCxyPXQubGVuZ3RoLTEsaSxzO2Zvcig7bzw9cjspe2lmKGk9fn4oKG8rcikvMikscz1uKHRbaV0sZSksczwwKXtvPWkrMTtjb250aW51ZX1pZihzPjApe3I9aS0xO2NvbnRpbnVlfXJldHVybiBpfXJldHVybn4ocisxKX12YXIgR3MseG09WigoKT0+e1h0KCk7R3M9R0N9KTtmdW5jdGlvbiB6Qyh0LGUsbixvLHIpe3RoaXMueFBvbGVXYW5kZXI9dCx0aGlzLnlQb2xlV2FuZGVyPWUsdGhpcy54UG9sZU9mZnNldD1uLHRoaXMueVBvbGVPZmZzZXQ9byx0aGlzLnV0MU1pbnVzVXRjPXJ9dmFyIGNmLFBtPVooKCk9PntjZj16Q30pO2Z1bmN0aW9uIGpDKHQpe2lmKHQ9PT1udWxsfHxpc05hTih0KSl0aHJvdyBuZXcgRigieWVhciBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhIG51bWJlci4iKTtyZXR1cm4gdCU0PT09MCYmdCUxMDAhPT0wfHx0JTQwMD09PTB9dmFyIGFmLE1tPVooKCk9PntIdCgpO2FmPWpDfSk7ZnVuY3Rpb24gSEModCxlLG4sbyxyLGkscyxmKXt0PXgodCwxKSxlPXgoZSwxKSxuPXgobiwxKSxvPXgobywwKSxyPXgociwwKSxpPXgoaSwwKSxzPXgocywwKSxmPXgoZiwhMSksZygpLGIoKSx0aGlzLnllYXI9dCx0aGlzLm1vbnRoPWUsdGhpcy5kYXk9bix0aGlzLmhvdXI9byx0aGlzLm1pbnV0ZT1yLHRoaXMuc2Vjb25kPWksdGhpcy5taWxsaXNlY29uZD1zLHRoaXMuaXNMZWFwU2Vjb25kPWY7ZnVuY3Rpb24gZygpe3kudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJZZWFyIix0LDEpLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJZZWFyIix0LDk5OTkpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJNb250aCIsZSwxKSx5LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygiTW9udGgiLGUsMTIpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJEYXkiLG4sMSkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIkRheSIsbiwzMSkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIkhvdXIiLG8sMCkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIkhvdXIiLG8sMjMpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJNaW51dGUiLHIsMCkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIk1pbnV0ZSIsciw1OSkseS50eXBlT2YuYm9vbCgiSXNMZWFwU2Vjb25kIixmKSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiU2Vjb25kIixpLDApLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJTZWNvbmQiLGksZj82MDo1OSkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIk1pbGxpc2Vjb25kIixzLDApLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbigiTWlsbGlzZWNvbmQiLHMsMWUzKX1mdW5jdGlvbiBiKCl7bGV0IHc9ZT09PTImJmFmKHQpP1AxW2UtMV0rMTpQMVtlLTFdO2lmKG4+dyl0aHJvdyBuZXcgRigiTW9udGggYW5kIERheSByZXByZXNlbnRzIGludmFsaWQgZGF0ZSIpfX12YXIgUDEscWwsTTE9WigoKT0+e1h0KCk7SXQoKTtIdCgpO01tKCk7UDE9WzMxLDI4LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXTtxbD1IQ30pO2Z1bmN0aW9uIHFDKHQsZSl7dGhpcy5qdWxpYW5EYXRlPXQsdGhpcy5vZmZzZXQ9ZX12YXIgV2UsTm09WigoKT0+e1dlPXFDfSk7dmFyIEtDLF9uLEtsPVooKCk9PntLQz17U0VDT05EU19QRVJfTUlMTElTRUNPTkQ6LjAwMSxTRUNPTkRTX1BFUl9NSU5VVEU6NjAsTUlOVVRFU19QRVJfSE9VUjo2MCxIT1VSU19QRVJfREFZOjI0LFNFQ09ORFNfUEVSX0hPVVI6MzYwMCxNSU5VVEVTX1BFUl9EQVk6MTQ0MCxTRUNPTkRTX1BFUl9EQVk6ODY0MDAsREFZU19QRVJfSlVMSUFOX0NFTlRVUlk6MzY1MjUsUElDT1NFQ09ORDoxZS05LE1PRElGSUVEX0pVTElBTl9EQVRFX0RJRkZFUkVOQ0U6MjQwMDAwMDVlLTF9LF9uPU9iamVjdC5mcmVlemUoS0MpfSk7dmFyIFdDLE9lLFdsPVooKCk9PntXQz17VVRDOjAsVEFJOjF9LE9lPU9iamVjdC5mcmVlemUoV0MpfSk7ZnVuY3Rpb24gSW0odCxlKXtyZXR1cm4gR3QuY29tcGFyZSh0Lmp1bGlhbkRhdGUsZS5qdWxpYW5EYXRlKX1mdW5jdGlvbiBabCh0KXtLYy5qdWxpYW5EYXRlPXQ7bGV0IGU9R3QubGVhcFNlY29uZHMsbj1HcyhlLEtjLEltKTtuPDAmJihuPX5uKSxuPj1lLmxlbmd0aCYmKG49ZS5sZW5ndGgtMSk7bGV0IG89ZVtuXS5vZmZzZXQ7bj4wJiZHdC5zZWNvbmRzRGlmZmVyZW5jZShlW25dLmp1bGlhbkRhdGUsdCk+byYmKG4tLSxvPWVbbl0ub2Zmc2V0KSxHdC5hZGRTZWNvbmRzKHQsbyx0KX1mdW5jdGlvbiBOMSh0LGUpe0tjLmp1bGlhbkRhdGU9dDtsZXQgbj1HdC5sZWFwU2Vjb25kcyxvPUdzKG4sS2MsSW0pO2lmKG88MCYmKG89fm8pLG89PT0wKXJldHVybiBHdC5hZGRTZWNvbmRzKHQsLW5bMF0ub2Zmc2V0LGUpO2lmKG8+PW4ubGVuZ3RoKXJldHVybiBHdC5hZGRTZWNvbmRzKHQsLW5bby0xXS5vZmZzZXQsZSk7bGV0IHI9R3Quc2Vjb25kc0RpZmZlcmVuY2UobltvXS5qdWxpYW5EYXRlLHQpO2lmKHI9PT0wKXJldHVybiBHdC5hZGRTZWNvbmRzKHQsLW5bb10ub2Zmc2V0LGUpO2lmKCEocjw9MSkpcmV0dXJuIEd0LmFkZFNlY29uZHModCwtblstLW9dLm9mZnNldCxlKX1mdW5jdGlvbiBucyh0LGUsbil7bGV0IG89ZS9fbi5TRUNPTkRTX1BFUl9EQVl8MDtyZXR1cm4gdCs9byxlLT1fbi5TRUNPTkRTX1BFUl9EQVkqbyxlPDAmJih0LS0sZSs9X24uU0VDT05EU19QRVJfREFZKSxuLmRheU51bWJlcj10LG4uc2Vjb25kc09mRGF5PWUsbn1mdW5jdGlvbiB2bSh0LGUsbixvLHIsaSxzKXtsZXQgZj0oZS0xNCkvMTJ8MCx1PXQrNDgwMCtmLGM9KDE0NjEqdS80fDApKygzNjcqKGUtMi0xMipmKS8xMnwwKS0oMyooKHUrMTAwKS8xMDB8MCkvNHwwKStuLTMyMDc1O289by0xMixvPDAmJihvKz0yNCk7bGV0IGw9aSsobypfbi5TRUNPTkRTX1BFUl9IT1VSK3IqX24uU0VDT05EU19QRVJfTUlOVVRFK3MqX24uU0VDT05EU19QRVJfTUlMTElTRUNPTkQpO3JldHVybiBsPj00MzIwMCYmKGMtPTEpLFtjLGxdfWZ1bmN0aW9uIEd0KHQsZSxuKXt0aGlzLmRheU51bWJlcj12b2lkIDAsdGhpcy5zZWNvbmRzT2ZEYXk9dm9pZCAwLHQ9eCh0LDApLGU9eChlLDApLG49eChuLE9lLlVUQyk7bGV0IG89dHwwO2U9ZSsodC1vKSpfbi5TRUNPTkRTX1BFUl9EQVksbnMobyxlLHRoaXMpLG49PT1PZS5VVEMmJlpsKHRoaXMpfXZhciBJMSxYbCxZbCxLYyxYQyxZQywkQyxaQyxRQyxMbSxKQyx0eCxleCxEciwkbCxybyxRbD1aKCgpPT57eG0oKTtJdCgpO2Z0KCk7SHQoKTtNMSgpO01tKCk7Tm0oKTtLbCgpO1dsKCk7STE9bmV3IHFsLFhsPVszMSwyOCwzMSwzMCwzMSwzMCwzMSwzMSwzMCwzMSwzMCwzMV0sWWw9Mjk7S2M9bmV3IFdlO1hDPS9eKFxkezR9KSQvLFlDPS9eKFxkezR9KS0oXGR7Mn0pJC8sJEM9L14oXGR7NH0pLT8oXGR7M30pJC8sWkM9L14oXGR7NH0pLT9XKFxkezJ9KS0/KFxkezF9KT8kLyxRQz0vXihcZHs0fSktPyhcZHsyfSktPyhcZHsyfSkkLyxMbT0vKFtaK1wtXSk/KFxkezJ9KT86PyhcZHsyfSk/JC8sSkM9L14oXGR7Mn0pKFwuXGQrKT8vLnNvdXJjZStMbS5zb3VyY2UsdHg9L14oXGR7Mn0pOj8oXGR7Mn0pKFwuXGQrKT8vLnNvdXJjZStMbS5zb3VyY2UsZXg9L14oXGR7Mn0pOj8oXGR7Mn0pOj8oXGR7Mn0pKFwuXGQrKT8vLnNvdXJjZStMbS5zb3VyY2UsRHI9IkludmFsaWQgSVNPIDg2MDEgZGF0ZS4iO0d0LmZyb21HcmVnb3JpYW5EYXRlPWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgcWwpKXRocm93IG5ldyBGKCJkYXRlIG11c3QgYmUgYSB2YWxpZCBHcmVnb3JpYW5EYXRlLiIpO2xldCBuPXZtKHQueWVhcix0Lm1vbnRoLHQuZGF5LHQuaG91cix0Lm1pbnV0ZSx0LnNlY29uZCx0Lm1pbGxpc2Vjb25kKTtyZXR1cm4gaChlKT8obnMoblswXSxuWzFdLGUpLFpsKGUpLGUpOm5ldyBHdChuWzBdLG5bMV0sT2UuVVRDKX07R3QuZnJvbURhdGU9ZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBEYXRlKXx8aXNOYU4odC5nZXRUaW1lKCkpKXRocm93IG5ldyBGKCJkYXRlIG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IERhdGUuIik7bGV0IG49dm0odC5nZXRVVENGdWxsWWVhcigpLHQuZ2V0VVRDTW9udGgoKSsxLHQuZ2V0VVRDRGF0ZSgpLHQuZ2V0VVRDSG91cnMoKSx0LmdldFVUQ01pbnV0ZXMoKSx0LmdldFVUQ1NlY29uZHMoKSx0LmdldFVUQ01pbGxpc2Vjb25kcygpKTtyZXR1cm4gaChlKT8obnMoblswXSxuWzFdLGUpLFpsKGUpLGUpOm5ldyBHdChuWzBdLG5bMV0sT2UuVVRDKX07R3QuZnJvbUlzbzg2MDE9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgdCE9InN0cmluZyIpdGhyb3cgbmV3IEYoRHIpO3Q9dC5yZXBsYWNlKCIsIiwiLiIpO2xldCBuPXQuc3BsaXQoIlQiKSxvLHI9MSxpPTEscz0wLGY9MCx1PTAsYz0wLGw9blswXSxwPW5bMV0sZCxtO2lmKCFoKGwpKXRocm93IG5ldyBGKERyKTtsZXQgXztpZihuPWwubWF0Y2goUUMpLG4hPT1udWxsKXtpZihfPWwuc3BsaXQoIi0iKS5sZW5ndGgtMSxfPjAmJl8hPT0yKXRocm93IG5ldyBGKERyKTtvPStuWzFdLHI9K25bMl0saT0rblszXX1lbHNlIGlmKG49bC5tYXRjaChZQyksbiE9PW51bGwpbz0rblsxXSxyPStuWzJdO2Vsc2UgaWYobj1sLm1hdGNoKFhDKSxuIT09bnVsbClvPStuWzFdO2Vsc2V7bGV0IE87aWYobj1sLm1hdGNoKCRDKSxuIT09bnVsbCl7aWYobz0rblsxXSxPPStuWzJdLG09YWYobyksTzwxfHxtJiZPPjM2Nnx8IW0mJk8+MzY1KXRocm93IG5ldyBGKERyKX1lbHNlIGlmKG49bC5tYXRjaChaQyksbiE9PW51bGwpe289K25bMV07bGV0IEU9K25bMl0sVD0rblszXXx8MDtpZihfPWwuc3BsaXQoIi0iKS5sZW5ndGgtMSxfPjAmJighaChuWzNdKSYmXyE9PTF8fGgoblszXSkmJl8hPT0yKSl0aHJvdyBuZXcgRihEcik7bGV0IEM9bmV3IERhdGUoRGF0ZS5VVEMobywwLDQpKTtPPUUqNytULUMuZ2V0VVRDRGF5KCktM31lbHNlIHRocm93IG5ldyBGKERyKTtkPW5ldyBEYXRlKERhdGUuVVRDKG8sMCwxKSksZC5zZXRVVENEYXRlKE8pLHI9ZC5nZXRVVENNb250aCgpKzEsaT1kLmdldFVUQ0RhdGUoKX1pZihtPWFmKG8pLHI8MXx8cj4xMnx8aTwxfHwociE9PTJ8fCFtKSYmaT5YbFtyLTFdfHxtJiZyPT09MiYmaT5ZbCl0aHJvdyBuZXcgRihEcik7bGV0IGc7aWYoaChwKSl7aWYobj1wLm1hdGNoKGV4KSxuIT09bnVsbCl7aWYoXz1wLnNwbGl0KCI6IikubGVuZ3RoLTEsXz4wJiZfIT09MiYmXyE9PTMpdGhyb3cgbmV3IEYoRHIpO3M9K25bMV0sZj0rblsyXSx1PStuWzNdLGM9KyhuWzRdfHwwKSoxZTMsZz01fWVsc2UgaWYobj1wLm1hdGNoKHR4KSxuIT09bnVsbCl7aWYoXz1wLnNwbGl0KCI6IikubGVuZ3RoLTEsXz4yKXRocm93IG5ldyBGKERyKTtzPStuWzFdLGY9K25bMl0sdT0rKG5bM118fDApKjYwLGc9NH1lbHNlIGlmKG49cC5tYXRjaChKQyksbiE9PW51bGwpcz0rblsxXSxmPSsoblsyXXx8MCkqNjAsZz0zO2Vsc2UgdGhyb3cgbmV3IEYoRHIpO2lmKGY+PTYwfHx1Pj02MXx8cz4yNHx8cz09PTI0JiYoZj4wfHx1PjB8fGM+MCkpdGhyb3cgbmV3IEYoRHIpO2xldCBPPW5bZ10sRT0rbltnKzFdLFQ9KyhuW2crMl18fDApO3N3aXRjaChPKXtjYXNlIisiOnM9cy1FLGY9Zi1UO2JyZWFrO2Nhc2UiLSI6cz1zK0UsZj1mK1Q7YnJlYWs7Y2FzZSJaIjpicmVhaztkZWZhdWx0OmY9ZituZXcgRGF0ZShEYXRlLlVUQyhvLHItMSxpLHMsZikpLmdldFRpbWV6b25lT2Zmc2V0KCk7YnJlYWt9fWxldCBiPXU9PT02MDtmb3IoYiYmdS0tO2Y+PTYwOylmLT02MCxzKys7Zm9yKDtzPj0yNDspcy09MjQsaSsrO2ZvcihkPW0mJnI9PT0yP1lsOlhsW3ItMV07aT5kOylpLT1kLHIrKyxyPjEyJiYoci09MTIsbysrKSxkPW0mJnI9PT0yP1lsOlhsW3ItMV07Zm9yKDtmPDA7KWYrPTYwLHMtLTtmb3IoO3M8MDspcys9MjQsaS0tO2Zvcig7aTwxOylyLS0scjwxJiYocis9MTIsby0tKSxkPW0mJnI9PT0yP1lsOlhsW3ItMV0saSs9ZDtsZXQgdz12bShvLHIsaSxzLGYsdSxjKTtyZXR1cm4gaChlKT8obnMod1swXSx3WzFdLGUpLFpsKGUpKTplPW5ldyBHdCh3WzBdLHdbMV0sT2UuVVRDKSxiJiZHdC5hZGRTZWNvbmRzKGUsMSxlKSxlfTtHdC5ub3c9ZnVuY3Rpb24odCl7cmV0dXJuIEd0LmZyb21EYXRlKG5ldyBEYXRlLHQpfTskbD1uZXcgR3QoMCwwLE9lLlRBSSk7R3QudG9HcmVnb3JpYW5EYXRlPWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEYoImp1bGlhbkRhdGUgaXMgcmVxdWlyZWQuIik7bGV0IG49ITEsbz1OMSh0LCRsKTtoKG8pfHwoR3QuYWRkU2Vjb25kcyh0LC0xLCRsKSxvPU4xKCRsLCRsKSxuPSEwKTtsZXQgcj1vLmRheU51bWJlcixpPW8uc2Vjb25kc09mRGF5O2k+PTQzMjAwJiYocis9MSk7bGV0IHM9cis2ODU2OXwwLGY9NCpzLzE0NjA5N3wwO3M9cy0oKDE0NjA5NypmKzMpLzR8MCl8MDtsZXQgdT00ZTMqKHMrMSkvMTQ2MTAwMXwwO3M9cy0oMTQ2MSp1LzR8MCkrMzF8MDtsZXQgYz04MCpzLzI0NDd8MCxsPXMtKDI0NDcqYy84MHwwKXwwO3M9Yy8xMXwwO2xldCBwPWMrMi0xMipzfDAsZD0xMDAqKGYtNDkpK3Urc3wwLG09aS9fbi5TRUNPTkRTX1BFUl9IT1VSfDAsXz1pLW0qX24uU0VDT05EU19QRVJfSE9VUixnPV8vX24uU0VDT05EU19QRVJfTUlOVVRFfDA7Xz1fLWcqX24uU0VDT05EU19QRVJfTUlOVVRFO2xldCBiPV98MCx3PShfLWIpL19uLlNFQ09ORFNfUEVSX01JTExJU0VDT05EO3JldHVybiBtKz0xMixtPjIzJiYobS09MjQpLG4mJihiKz0xKSxoKGUpPyhlLnllYXI9ZCxlLm1vbnRoPXAsZS5kYXk9bCxlLmhvdXI9bSxlLm1pbnV0ZT1nLGUuc2Vjb25kPWIsZS5taWxsaXNlY29uZD13LGUuaXNMZWFwU2Vjb25kPW4sZSk6bmV3IHFsKGQscCxsLG0sZyxiLHcsbil9O0d0LnRvRGF0ZT1mdW5jdGlvbih0KXtpZighaCh0KSl0aHJvdyBuZXcgRigianVsaWFuRGF0ZSBpcyByZXF1aXJlZC4iKTtsZXQgZT1HdC50b0dyZWdvcmlhbkRhdGUodCxJMSksbj1lLnNlY29uZDtyZXR1cm4gZS5pc0xlYXBTZWNvbmQmJihuLT0xKSxuZXcgRGF0ZShEYXRlLlVUQyhlLnllYXIsZS5tb250aC0xLGUuZGF5LGUuaG91cixlLm1pbnV0ZSxuLGUubWlsbGlzZWNvbmQpKX07R3QudG9Jc284NjAxPWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEYoImp1bGlhbkRhdGUgaXMgcmVxdWlyZWQuIik7bGV0IG49R3QudG9HcmVnb3JpYW5EYXRlKHQsSTEpLG89bi55ZWFyLHI9bi5tb250aCxpPW4uZGF5LHM9bi5ob3VyLGY9bi5taW51dGUsdT1uLnNlY29uZCxjPW4ubWlsbGlzZWNvbmQ7bz09PTFlNCYmcj09PTEmJmk9PT0xJiZzPT09MCYmZj09PTAmJnU9PT0wJiZjPT09MCYmKG89OTk5OSxyPTEyLGk9MzEscz0yNCk7bGV0IGw7cmV0dXJuIWgoZSkmJmMhPT0wPyhsPShjKi4wMSkudG9TdHJpbmcoKS5yZXBsYWNlKCIuIiwiIiksYCR7by50b1N0cmluZygpLnBhZFN0YXJ0KDQsIjAiKX0tJHtyLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpfS0ke2kudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIil9VCR7cy50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKX06JHtmLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpfToke3UudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIil9LiR7bH1aYCk6IWgoZSl8fGU9PT0wP2Ake28udG9TdHJpbmcoKS5wYWRTdGFydCg0LCIwIil9LSR7ci50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKX0tJHtpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpfVQke3MudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIil9OiR7Zi50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKX06JHt1LnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpfVpgOihsPShjKi4wMSkudG9GaXhlZChlKS5yZXBsYWNlKCIuIiwiIikuc2xpY2UoMCxlKSxgJHtvLnRvU3RyaW5nKCkucGFkU3RhcnQoNCwiMCIpfS0ke3IudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIil9LSR7aS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKX1UJHtzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpfToke2YudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIil9OiR7dS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKX0uJHtsfVpgKX07R3QuY2xvbmU9ZnVuY3Rpb24odCxlKXtpZihoKHQpKXJldHVybiBoKGUpPyhlLmRheU51bWJlcj10LmRheU51bWJlcixlLnNlY29uZHNPZkRheT10LnNlY29uZHNPZkRheSxlKTpuZXcgR3QodC5kYXlOdW1iZXIsdC5zZWNvbmRzT2ZEYXksT2UuVEFJKX07R3QuY29tcGFyZT1mdW5jdGlvbih0LGUpe2lmKCFoKHQpKXRocm93IG5ldyBGKCJsZWZ0IGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBGKCJyaWdodCBpcyByZXF1aXJlZC4iKTtsZXQgbj10LmRheU51bWJlci1lLmRheU51bWJlcjtyZXR1cm4gbiE9PTA/bjp0LnNlY29uZHNPZkRheS1lLnNlY29uZHNPZkRheX07R3QuZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxoKHQpJiZoKGUpJiZ0LmRheU51bWJlcj09PWUuZGF5TnVtYmVyJiZ0LnNlY29uZHNPZkRheT09PWUuc2Vjb25kc09mRGF5fTtHdC5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbj14KG4sMCksdD09PWV8fGgodCkmJmgoZSkmJk1hdGguYWJzKEd0LnNlY29uZHNEaWZmZXJlbmNlKHQsZSkpPD1ufTtHdC50b3RhbERheXM9ZnVuY3Rpb24odCl7aWYoIWgodCkpdGhyb3cgbmV3IEYoImp1bGlhbkRhdGUgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQuZGF5TnVtYmVyK3Quc2Vjb25kc09mRGF5L19uLlNFQ09ORFNfUEVSX0RBWX07R3Quc2Vjb25kc0RpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtpZighaCh0KSl0aHJvdyBuZXcgRigibGVmdCBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgRigicmlnaHQgaXMgcmVxdWlyZWQuIik7cmV0dXJuKHQuZGF5TnVtYmVyLWUuZGF5TnVtYmVyKSpfbi5TRUNPTkRTX1BFUl9EQVkrKHQuc2Vjb25kc09mRGF5LWUuc2Vjb25kc09mRGF5KX07R3QuZGF5c0RpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtpZighaCh0KSl0aHJvdyBuZXcgRigibGVmdCBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgRigicmlnaHQgaXMgcmVxdWlyZWQuIik7bGV0IG49dC5kYXlOdW1iZXItZS5kYXlOdW1iZXIsbz0odC5zZWNvbmRzT2ZEYXktZS5zZWNvbmRzT2ZEYXkpL19uLlNFQ09ORFNfUEVSX0RBWTtyZXR1cm4gbitvfTtHdC5jb21wdXRlVGFpTWludXNVdGM9ZnVuY3Rpb24odCl7S2MuanVsaWFuRGF0ZT10O2xldCBlPUd0LmxlYXBTZWNvbmRzLG49R3MoZSxLYyxJbSk7cmV0dXJuIG48MCYmKG49fm4sLS1uLG48MCYmKG49MCkpLGVbbl0ub2Zmc2V0fTtHdC5hZGRTZWNvbmRzPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgRigianVsaWFuRGF0ZSBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgRigic2Vjb25kcyBpcyByZXF1aXJlZC4iKTtpZighaChuKSl0aHJvdyBuZXcgRigicmVzdWx0IGlzIHJlcXVpcmVkLiIpO3JldHVybiBucyh0LmRheU51bWJlcix0LnNlY29uZHNPZkRheStlLG4pfTtHdC5hZGRNaW51dGVzPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgRigianVsaWFuRGF0ZSBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgRigibWludXRlcyBpcyByZXF1aXJlZC4iKTtpZighaChuKSl0aHJvdyBuZXcgRigicmVzdWx0IGlzIHJlcXVpcmVkLiIpO2xldCBvPXQuc2Vjb25kc09mRGF5K2UqX24uU0VDT05EU19QRVJfTUlOVVRFO3JldHVybiBucyh0LmRheU51bWJlcixvLG4pfTtHdC5hZGRIb3Vycz1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEYoImp1bGlhbkRhdGUgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEYoImhvdXJzIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBGKCJyZXN1bHQgaXMgcmVxdWlyZWQuIik7bGV0IG89dC5zZWNvbmRzT2ZEYXkrZSpfbi5TRUNPTkRTX1BFUl9IT1VSO3JldHVybiBucyh0LmRheU51bWJlcixvLG4pfTtHdC5hZGREYXlzPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgRigianVsaWFuRGF0ZSBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgRigiZGF5cyBpcyByZXF1aXJlZC4iKTtpZighaChuKSl0aHJvdyBuZXcgRigicmVzdWx0IGlzIHJlcXVpcmVkLiIpO2xldCBvPXQuZGF5TnVtYmVyK2U7cmV0dXJuIG5zKG8sdC5zZWNvbmRzT2ZEYXksbil9O0d0Lmxlc3NUaGFuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0LmNvbXBhcmUodCxlKTwwfTtHdC5sZXNzVGhhbk9yRXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0LmNvbXBhcmUodCxlKTw9MH07R3QuZ3JlYXRlclRoYW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gR3QuY29tcGFyZSh0LGUpPjB9O0d0LmdyZWF0ZXJUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gR3QuY29tcGFyZSh0LGUpPj0wfTtHdC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIEd0LmNsb25lKHRoaXMsdCl9O0d0LnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIEd0LmVxdWFscyh0aGlzLHQpfTtHdC5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUpe3JldHVybiBHdC5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlKX07R3QucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIEd0LnRvSXNvODYwMSh0aGlzKX07R3QubGVhcFNlY29uZHM9W25ldyBXZShuZXcgR3QoMjQ0MTMxNyw0MzIxMCxPZS5UQUkpLDEwKSxuZXcgV2UobmV3IEd0KDI0NDE0OTksNDMyMTEsT2UuVEFJKSwxMSksbmV3IFdlKG5ldyBHdCgyNDQxNjgzLDQzMjEyLE9lLlRBSSksMTIpLG5ldyBXZShuZXcgR3QoMjQ0MjA0OCw0MzIxMyxPZS5UQUkpLDEzKSxuZXcgV2UobmV3IEd0KDI0NDI0MTMsNDMyMTQsT2UuVEFJKSwxNCksbmV3IFdlKG5ldyBHdCgyNDQyNzc4LDQzMjE1LE9lLlRBSSksMTUpLG5ldyBXZShuZXcgR3QoMjQ0MzE0NCw0MzIxNixPZS5UQUkpLDE2KSxuZXcgV2UobmV3IEd0KDI0NDM1MDksNDMyMTcsT2UuVEFJKSwxNyksbmV3IFdlKG5ldyBHdCgyNDQzODc0LDQzMjE4LE9lLlRBSSksMTgpLG5ldyBXZShuZXcgR3QoMjQ0NDIzOSw0MzIxOSxPZS5UQUkpLDE5KSxuZXcgV2UobmV3IEd0KDI0NDQ3ODYsNDMyMjAsT2UuVEFJKSwyMCksbmV3IFdlKG5ldyBHdCgyNDQ1MTUxLDQzMjIxLE9lLlRBSSksMjEpLG5ldyBXZShuZXcgR3QoMjQ0NTUxNiw0MzIyMixPZS5UQUkpLDIyKSxuZXcgV2UobmV3IEd0KDI0NDYyNDcsNDMyMjMsT2UuVEFJKSwyMyksbmV3IFdlKG5ldyBHdCgyNDQ3MTYxLDQzMjI0LE9lLlRBSSksMjQpLG5ldyBXZShuZXcgR3QoMjQ0Nzg5Miw0MzIyNSxPZS5UQUkpLDI1KSxuZXcgV2UobmV3IEd0KDI0NDgyNTcsNDMyMjYsT2UuVEFJKSwyNiksbmV3IFdlKG5ldyBHdCgyNDQ4ODA0LDQzMjI3LE9lLlRBSSksMjcpLG5ldyBXZShuZXcgR3QoMjQ0OTE2OSw0MzIyOCxPZS5UQUkpLDI4KSxuZXcgV2UobmV3IEd0KDI0NDk1MzQsNDMyMjksT2UuVEFJKSwyOSksbmV3IFdlKG5ldyBHdCgyNDUwMDgzLDQzMjMwLE9lLlRBSSksMzApLG5ldyBXZShuZXcgR3QoMjQ1MDYzMCw0MzIzMSxPZS5UQUkpLDMxKSxuZXcgV2UobmV3IEd0KDI0NTExNzksNDMyMzIsT2UuVEFJKSwzMiksbmV3IFdlKG5ldyBHdCgyNDUzNzM2LDQzMjMzLE9lLlRBSSksMzMpLG5ldyBXZShuZXcgR3QoMjQ1NDgzMiw0MzIzNCxPZS5UQUkpLDM0KSxuZXcgV2UobmV3IEd0KDI0NTYxMDksNDMyMzUsT2UuVEFJKSwzNSksbmV3IFdlKG5ldyBHdCgyNDU3MjA0LDQzMjM2LE9lLlRBSSksMzYpLG5ldyBXZShuZXcgR3QoMjQ1Nzc1NCw0MzIzNyxPZS5UQUkpLDM3KV07cm89R3R9KTt2YXIgdjE9Vm4oKFdjLFhjKT0+ey8qISBodHRwczovL210aHMuYmUvcHVueWNvZGUgdjEuNC4wIGJ5IEBtYXRoaWFzICovKGZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiBXYz09Im9iamVjdCImJldjJiYhV2Mubm9kZVR5cGUmJldjLG49dHlwZW9mIFhjPT0ib2JqZWN0IiYmWGMmJiFYYy5ub2RlVHlwZSYmWGMsbz10eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsOyhvLmdsb2JhbD09PW98fG8ud2luZG93PT09b3x8by5zZWxmPT09bykmJih0PW8pO3ZhciByLGk9MjE0NzQ4MzY0NyxzPTM2LGY9MSx1PTI2LGM9MzgsbD03MDAscD03MixkPTEyOCxtPSItIixfPS9eeG4tLS8sZz0vW15ceDIwLVx4N0VdLyxiPS9bXHgyRVx1MzAwMlx1RkYwRVx1RkY2MV0vZyx3PXtvdmVyZmxvdzoiT3ZlcmZsb3c6IGlucHV0IG5lZWRzIHdpZGVyIGludGVnZXJzIHRvIHByb2Nlc3MiLCJub3QtYmFzaWMiOiJJbGxlZ2FsIGlucHV0ID49IDB4ODAgKG5vdCBhIGJhc2ljIGNvZGUgcG9pbnQpIiwiaW52YWxpZC1pbnB1dCI6IkludmFsaWQgaW5wdXQifSxPPXMtZixFPU1hdGguZmxvb3IsVD1TdHJpbmcuZnJvbUNoYXJDb2RlLEM7ZnVuY3Rpb24gTihrKXt0aHJvdyBuZXcgUmFuZ2VFcnJvcih3W2tdKX1mdW5jdGlvbiBJKGssSyl7Zm9yKHZhciBYPWsubGVuZ3RoLFI9W107WC0tOylSW1hdPUsoa1tYXSk7cmV0dXJuIFJ9ZnVuY3Rpb24gRChrLEspe3ZhciBYPWsuc3BsaXQoIkAiKSxSPSIiO1gubGVuZ3RoPjEmJihSPVhbMF0rIkAiLGs9WFsxXSksaz1rLnJlcGxhY2UoYiwiLiIpO3ZhciBvdD1rLnNwbGl0KCIuIiksY3Q9SShvdCxLKS5qb2luKCIuIik7cmV0dXJuIFIrY3R9ZnVuY3Rpb24gdihrKXtmb3IodmFyIEs9W10sWD0wLFI9ay5sZW5ndGgsb3QsY3Q7WDxSOylvdD1rLmNoYXJDb2RlQXQoWCsrKSxvdD49NTUyOTYmJm90PD01NjMxOSYmWDxSPyhjdD1rLmNoYXJDb2RlQXQoWCsrKSwoY3QmNjQ1MTIpPT01NjMyMD9LLnB1c2goKChvdCYxMDIzKTw8MTApKyhjdCYxMDIzKSs2NTUzNik6KEsucHVzaChvdCksWC0tKSk6Sy5wdXNoKG90KTtyZXR1cm4gS31mdW5jdGlvbiBMKGspe3JldHVybiBJKGssZnVuY3Rpb24oSyl7dmFyIFg9IiI7cmV0dXJuIEs+NjU1MzUmJihLLT02NTUzNixYKz1UKEs+Pj4xMCYxMDIzfDU1Mjk2KSxLPTU2MzIwfEsmMTAyMyksWCs9VChLKSxYfSkuam9pbigiIil9ZnVuY3Rpb24gVShrKXtyZXR1cm4gay00ODwxMD9rLTIyOmstNjU8MjY/ay02NTprLTk3PDI2P2stOTc6c31mdW5jdGlvbiBBKGssSyl7cmV0dXJuIGsrMjIrNzUqKGs8MjYpLSgoSyE9MCk8PDUpfWZ1bmN0aW9uIFMoayxLLFgpe3ZhciBSPTA7Zm9yKGs9WD9FKGsvbCk6az4+MSxrKz1FKGsvSyk7az5PKnU+PjE7Uis9cylrPUUoay9PKTtyZXR1cm4gRShSKyhPKzEpKmsvKGsrYykpfWZ1bmN0aW9uIFAoayl7dmFyIEs9W10sWD1rLmxlbmd0aCxSLG90PTAsY3Q9ZCxwdD1wLHl0LHJ0LFB0LGd0LEN0LG10LHV0LHZ0LHp0O2Zvcih5dD1rLmxhc3RJbmRleE9mKG0pLHl0PDAmJih5dD0wKSxydD0wO3J0PHl0OysrcnQpay5jaGFyQ29kZUF0KHJ0KT49MTI4JiZOKCJub3QtYmFzaWMiKSxLLnB1c2goay5jaGFyQ29kZUF0KHJ0KSk7Zm9yKFB0PXl0PjA/eXQrMTowO1B0PFg7KXtmb3IoZ3Q9b3QsQ3Q9MSxtdD1zO1B0Pj1YJiZOKCJpbnZhbGlkLWlucHV0IiksdXQ9VShrLmNoYXJDb2RlQXQoUHQrKykpLCh1dD49c3x8dXQ+RSgoaS1vdCkvQ3QpKSYmTigib3ZlcmZsb3ciKSxvdCs9dXQqQ3QsdnQ9bXQ8PXB0P2Y6bXQ+PXB0K3U/dTptdC1wdCwhKHV0PHZ0KTttdCs9cyl6dD1zLXZ0LEN0PkUoaS96dCkmJk4oIm92ZXJmbG93IiksQ3QqPXp0O1I9Sy5sZW5ndGgrMSxwdD1TKG90LWd0LFIsZ3Q9PTApLEUob3QvUik+aS1jdCYmTigib3ZlcmZsb3ciKSxjdCs9RShvdC9SKSxvdCU9UixLLnNwbGljZShvdCsrLDAsY3QpfXJldHVybiBMKEspfWZ1bmN0aW9uIEIoayl7dmFyIEssWCxSLG90LGN0LHB0LHl0LHJ0LFB0LGd0LEN0LG10PVtdLHV0LHZ0LHp0LG1lO2ZvcihrPXYoayksdXQ9ay5sZW5ndGgsSz1kLFg9MCxjdD1wLHB0PTA7cHQ8dXQ7KytwdClDdD1rW3B0XSxDdDwxMjgmJm10LnB1c2goVChDdCkpO2ZvcihSPW90PW10Lmxlbmd0aCxvdCYmbXQucHVzaChtKTtSPHV0Oyl7Zm9yKHl0PWkscHQ9MDtwdDx1dDsrK3B0KUN0PWtbcHRdLEN0Pj1LJiZDdDx5dCYmKHl0PUN0KTtmb3IodnQ9UisxLHl0LUs+RSgoaS1YKS92dCkmJk4oIm92ZXJmbG93IiksWCs9KHl0LUspKnZ0LEs9eXQscHQ9MDtwdDx1dDsrK3B0KWlmKEN0PWtbcHRdLEN0PEsmJisrWD5pJiZOKCJvdmVyZmxvdyIpLEN0PT1LKXtmb3IocnQ9WCxQdD1zO2d0PVB0PD1jdD9mOlB0Pj1jdCt1P3U6UHQtY3QsIShydDxndCk7UHQrPXMpbWU9cnQtZ3QsenQ9cy1ndCxtdC5wdXNoKFQoQShndCttZSV6dCwwKSkpLHJ0PUUobWUvenQpO210LnB1c2goVChBKHJ0LDApKSksY3Q9UyhYLHZ0LFI9PW90KSxYPTAsKytSfSsrWCwrK0t9cmV0dXJuIG10LmpvaW4oIiIpfWZ1bmN0aW9uIGooayl7cmV0dXJuIEQoayxmdW5jdGlvbihLKXtyZXR1cm4gXy50ZXN0KEspP1AoSy5zbGljZSg0KS50b0xvd2VyQ2FzZSgpKTpLfSl9ZnVuY3Rpb24gSChrKXtyZXR1cm4gRChrLGZ1bmN0aW9uKEspe3JldHVybiBnLnRlc3QoSyk/InhuLS0iK0IoSyk6S30pfWlmKHI9e3ZlcnNpb246IjEuMy4yIix1Y3MyOntkZWNvZGU6dixlbmNvZGU6TH0sZGVjb2RlOlAsZW5jb2RlOkIsdG9BU0NJSTpILHRvVW5pY29kZTpqfSx0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZ0eXBlb2YgZGVmaW5lLmFtZD09Im9iamVjdCImJmRlZmluZS5hbWQpZGVmaW5lKCJwdW55Y29kZSIsZnVuY3Rpb24oKXtyZXR1cm4gcn0pO2Vsc2UgaWYoZSYmbilpZihYYy5leHBvcnRzPT1lKW4uZXhwb3J0cz1yO2Vsc2UgZm9yKEMgaW4gcilyLmhhc093blByb3BlcnR5KEMpJiYoZVtDXT1yW0NdKTtlbHNlIHQucHVueWNvZGU9cn0pKFdjKX0pO3ZhciBEMT1WbigoTDEsSmwpPT57LyohCiAqIFVSSS5qcyAtIE11dGF0aW5nIFVSTHMKICogSVB2NiBTdXBwb3J0CiAqCiAqIFZlcnNpb246IDEuMTkuMTEKICoKICogQXV0aG9yOiBSb2RuZXkgUmVobQogKiBXZWI6IGh0dHA6Ly9tZWRpYWxpemUuZ2l0aHViLmlvL1VSSS5qcy8KICoKICogTGljZW5zZWQgdW5kZXIKICogICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlCiAqCiAqLyhmdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0Ijt0eXBlb2YgSmw9PSJvYmplY3QiJiZKbC5leHBvcnRzP0psLmV4cG9ydHM9ZSgpOnR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQ/ZGVmaW5lKGUpOnQuSVB2Nj1lKHQpfSkoTDEsZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO3ZhciBlPXQmJnQuSVB2NjtmdW5jdGlvbiBuKHIpe3ZhciBpPXIudG9Mb3dlckNhc2UoKSxzPWkuc3BsaXQoIjoiKSxmPXMubGVuZ3RoLHU9ODtzWzBdPT09IiImJnNbMV09PT0iIiYmc1syXT09PSIiPyhzLnNoaWZ0KCkscy5zaGlmdCgpKTpzWzBdPT09IiImJnNbMV09PT0iIj9zLnNoaWZ0KCk6c1tmLTFdPT09IiImJnNbZi0yXT09PSIiJiZzLnBvcCgpLGY9cy5sZW5ndGgsc1tmLTFdLmluZGV4T2YoIi4iKSE9PS0xJiYodT03KTt2YXIgYztmb3IoYz0wO2M8ZiYmc1tjXSE9PSIiO2MrKyk7aWYoYzx1KWZvcihzLnNwbGljZShjLDEsIjAwMDAiKTtzLmxlbmd0aDx1OylzLnNwbGljZShjLDAsIjAwMDAiKTtmb3IodmFyIGwscD0wO3A8dTtwKyspe2w9c1twXS5zcGxpdCgiIik7Zm9yKHZhciBkPTA7ZDwzJiYobFswXT09PSIwIiYmbC5sZW5ndGg+MSk7ZCsrKWwuc3BsaWNlKDAsMSk7c1twXT1sLmpvaW4oIiIpfXZhciBtPS0xLF89MCxnPTAsYj0tMSx3PSExO2ZvcihwPTA7cDx1O3ArKyl3P3NbcF09PT0iMCI/Zys9MToodz0hMSxnPl8mJihtPWIsXz1nKSk6c1twXT09PSIwIiYmKHc9ITAsYj1wLGc9MSk7Zz5fJiYobT1iLF89ZyksXz4xJiZzLnNwbGljZShtLF8sIiIpLGY9cy5sZW5ndGg7dmFyIE89IiI7Zm9yKHNbMF09PT0iIiYmKE89IjoiKSxwPTA7cDxmJiYoTys9c1twXSxwIT09Zi0xKTtwKyspTys9IjoiO3JldHVybiBzW2YtMV09PT0iIiYmKE8rPSI6IiksT31mdW5jdGlvbiBvKCl7cmV0dXJuIHQuSVB2Nj09PXRoaXMmJih0LklQdjY9ZSksdGhpc31yZXR1cm57YmVzdDpuLG5vQ29uZmxpY3Q6b319KX0pO3ZhciBCMT1WbigoRjEsdHApPT57LyohCiAqIFVSSS5qcyAtIE11dGF0aW5nIFVSTHMKICogU2Vjb25kIExldmVsIERvbWFpbiAoU0xEKSBTdXBwb3J0CiAqCiAqIFZlcnNpb246IDEuMTkuMTEKICoKICogQXV0aG9yOiBSb2RuZXkgUmVobQogKiBXZWI6IGh0dHA6Ly9tZWRpYWxpemUuZ2l0aHViLmlvL1VSSS5qcy8KICoKICogTGljZW5zZWQgdW5kZXIKICogICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlCiAqCiAqLyhmdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0Ijt0eXBlb2YgdHA9PSJvYmplY3QiJiZ0cC5leHBvcnRzP3RwLmV4cG9ydHM9ZSgpOnR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQ/ZGVmaW5lKGUpOnQuU2Vjb25kTGV2ZWxEb21haW5zPWUodCl9KShGMSxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7dmFyIGU9dCYmdC5TZWNvbmRMZXZlbERvbWFpbnMsbj17bGlzdDp7YWM6IiBjb20gZ292IG1pbCBuZXQgb3JnICIsYWU6IiBhYyBjbyBnb3YgbWlsIG5hbWUgbmV0IG9yZyBwcm8gc2NoICIsYWY6IiBjb20gZWR1IGdvdiBuZXQgb3JnICIsYWw6IiBjb20gZWR1IGdvdiBtaWwgbmV0IG9yZyAiLGFvOiIgY28gZWQgZ3YgaXQgb2cgcGIgIixhcjoiIGNvbSBlZHUgZ29iIGdvdiBpbnQgbWlsIG5ldCBvcmcgdHVyICIsYXQ6IiBhYyBjbyBndiBvciAiLGF1OiIgYXNuIGNvbSBjc2lybyBlZHUgZ292IGlkIG5ldCBvcmcgIixiYToiIGNvIGNvbSBlZHUgZ292IG1pbCBuZXQgb3JnIHJzIHVuYmkgdW5tbyB1bnNhIHVudHogdW56ZSAiLGJiOiIgYml6IGNvIGNvbSBlZHUgZ292IGluZm8gbmV0IG9yZyBzdG9yZSB0diAiLGJoOiIgYml6IGNjIGNvbSBlZHUgZ292IGluZm8gbmV0IG9yZyAiLGJuOiIgY29tIGVkdSBnb3YgbmV0IG9yZyAiLGJvOiIgY29tIGVkdSBnb2IgZ292IGludCBtaWwgbmV0IG9yZyB0diAiLGJyOiIgYWRtIGFkdiBhZ3IgYW0gYXJxIGFydCBhdG8gYiBiaW8gYmxvZyBibWQgY2ltIGNuZyBjbnQgY29tIGNvb3AgZWNuIGVkdSBlbmcgZXNwIGV0YyBldGkgZmFyIGZsb2cgZm0gZm5kIGZvdCBmc3QgZzEyIGdnZiBnb3YgaW1iIGluZCBpbmYgam9yIGp1cyBsZWwgbWF0IG1lZCBtaWwgbXVzIG5ldCBub20gbm90IG50ciBvZG8gb3JnIHBwZyBwcm8gcHNjIHBzaSBxc2wgcmVjIHNsZyBzcnYgdG1wIHRyZCB0dXIgdHYgdmV0IHZsb2cgd2lraSB6bGcgIixiczoiIGNvbSBlZHUgZ292IG5ldCBvcmcgIixiejoiIGR1IGV0IG9tIG92IHJnICIsY2E6IiBhYiBiYyBtYiBuYiBuZiBubCBucyBudCBudSBvbiBwZSBxYyBzayB5ayAiLGNrOiIgYml6IGNvIGVkdSBnZW4gZ292IGluZm8gbmV0IG9yZyAiLGNuOiIgYWMgYWggYmogY29tIGNxIGVkdSBmaiBnZCBnb3YgZ3MgZ3ggZ3ogaGEgaGIgaGUgaGkgaGwgaG4gamwganMganggbG4gbWlsIG5ldCBubSBueCBvcmcgcWggc2Mgc2Qgc2ggc24gc3ggdGogdHcgeGogeHogeW4gemogIixjbzoiIGNvbSBlZHUgZ292IG1pbCBuZXQgbm9tIG9yZyAiLGNyOiIgYWMgYyBjbyBlZCBmaSBnbyBvciBzYSAiLGN5OiIgYWMgYml6IGNvbSBla2xvZ2VzIGdvdiBsdGQgbmFtZSBuZXQgb3JnIHBhcmxpYW1lbnQgcHJlc3MgcHJvIHRtICIsZG86IiBhcnQgY29tIGVkdSBnb2IgZ292IG1pbCBuZXQgb3JnIHNsZCB3ZWIgIixkejoiIGFydCBhc3NvIGNvbSBlZHUgZ292IG5ldCBvcmcgcG9sICIsZWM6IiBjb20gZWR1IGZpbiBnb3YgaW5mbyBtZWQgbWlsIG5ldCBvcmcgcHJvICIsZWc6IiBjb20gZWR1IGV1biBnb3YgbWlsIG5hbWUgbmV0IG9yZyBzY2kgIixlcjoiIGNvbSBlZHUgZ292IGluZCBtaWwgbmV0IG9yZyByb2NoZXN0IHcgIixlczoiIGNvbSBlZHUgZ29iIG5vbSBvcmcgIixldDoiIGJpeiBjb20gZWR1IGdvdiBpbmZvIG5hbWUgbmV0IG9yZyAiLGZqOiIgYWMgYml6IGNvbSBpbmZvIG1pbCBuYW1lIG5ldCBvcmcgcHJvICIsZms6IiBhYyBjbyBnb3YgbmV0IG5vbSBvcmcgIixmcjoiIGFzc28gY29tIGYgZ291diBub20gcHJkIHByZXNzZSB0bSAiLGdnOiIgY28gbmV0IG9yZyAiLGdoOiIgY29tIGVkdSBnb3YgbWlsIG9yZyAiLGduOiIgYWMgY29tIGdvdiBuZXQgb3JnICIsZ3I6IiBjb20gZWR1IGdvdiBtaWwgbmV0IG9yZyAiLGd0OiIgY29tIGVkdSBnb2IgaW5kIG1pbCBuZXQgb3JnICIsZ3U6IiBjb20gZWR1IGdvdiBuZXQgb3JnICIsaGs6IiBjb20gZWR1IGdvdiBpZHYgbmV0IG9yZyAiLGh1OiIgMjAwMCBhZ3JhciBib2x0IGNhc2lubyBjaXR5IGNvIGVyb3RpY2EgZXJvdGlrYSBmaWxtIGZvcnVtIGdhbWVzIGhvdGVsIGluZm8gaW5nYXRsYW4gam9nYXN6IGtvbnl2ZWxvIGxha2FzIG1lZGlhIG5ld3Mgb3JnIHByaXYgcmVrbGFtIHNleCBzaG9wIHNwb3J0IHN1bGkgc3pleCB0bSB0b3pzZGUgdXRhemFzIHZpZGVvICIsaWQ6IiBhYyBjbyBnbyBtaWwgbmV0IG9yIHNjaCB3ZWIgIixpbDoiIGFjIGNvIGdvdiBpZGYgazEyIG11bmkgbmV0IG9yZyAiLGluOiIgYWMgY28gZWR1IGVybmV0IGZpcm0gZ2VuIGdvdiBpIGluZCBtaWwgbmV0IG5pYyBvcmcgcmVzICIsaXE6IiBjb20gZWR1IGdvdiBpIG1pbCBuZXQgb3JnICIsaXI6IiBhYyBjbyBkbnNzZWMgZ292IGkgaWQgbmV0IG9yZyBzY2ggIixpdDoiIGVkdSBnb3YgIixqZToiIGNvIG5ldCBvcmcgIixqbzoiIGNvbSBlZHUgZ292IG1pbCBuYW1lIG5ldCBvcmcgc2NoICIsanA6IiBhYyBhZCBjbyBlZCBnbyBnciBsZyBuZSBvciAiLGtlOiIgYWMgY28gZ28gaW5mbyBtZSBtb2JpIG5lIG9yIHNjICIsa2g6IiBjb20gZWR1IGdvdiBtaWwgbmV0IG9yZyBwZXIgIixraToiIGJpeiBjb20gZGUgZWR1IGdvdiBpbmZvIG1vYiBuZXQgb3JnIHRlbCAiLGttOiIgYXNzbyBjb20gY29vcCBlZHUgZ291diBrIG1lZGVjaW4gbWlsIG5vbSBub3RhaXJlcyBwaGFybWFjaWVucyBwcmVzc2UgdG0gdmV0ZXJpbmFpcmUgIixrbjoiIGVkdSBnb3YgbmV0IG9yZyAiLGtyOiIgYWMgYnVzYW4gY2h1bmdidWsgY2h1bmduYW0gY28gZGFlZ3UgZGFlamVvbiBlcyBnYW5nd29uIGdvIGd3YW5nanUgZ3llb25nYnVrIGd5ZW9uZ2dpIGd5ZW9uZ25hbSBocyBpbmNoZW9uIGplanUgamVvbmJ1ayBqZW9ubmFtIGsga2cgbWlsIG1zIG5lIG9yIHBlIHJlIHNjIHNlb3VsIHVsc2FuICIsa3c6IiBjb20gZWR1IGdvdiBuZXQgb3JnICIsa3k6IiBjb20gZWR1IGdvdiBuZXQgb3JnICIsa3o6IiBjb20gZWR1IGdvdiBtaWwgbmV0IG9yZyAiLGxiOiIgY29tIGVkdSBnb3YgbmV0IG9yZyAiLGxrOiIgYXNzbiBjb20gZWR1IGdvdiBncnAgaG90ZWwgaW50IGx0ZCBuZXQgbmdvIG9yZyBzY2ggc29jIHdlYiAiLGxyOiIgY29tIGVkdSBnb3YgbmV0IG9yZyAiLGx2OiIgYXNuIGNvbSBjb25mIGVkdSBnb3YgaWQgbWlsIG5ldCBvcmcgIixseToiIGNvbSBlZHUgZ292IGlkIG1lZCBuZXQgb3JnIHBsYyBzY2ggIixtYToiIGFjIGNvIGdvdiBtIG5ldCBvcmcgcHJlc3MgIixtYzoiIGFzc28gdG0gIixtZToiIGFjIGNvIGVkdSBnb3YgaXRzIG5ldCBvcmcgcHJpdiAiLG1nOiIgY29tIGVkdSBnb3YgbWlsIG5vbSBvcmcgcHJkIHRtICIsbWs6IiBjb20gZWR1IGdvdiBpbmYgbmFtZSBuZXQgb3JnIHBybyAiLG1sOiIgY29tIGVkdSBnb3YgbmV0IG9yZyBwcmVzc2UgIixtbjoiIGVkdSBnb3Ygb3JnICIsbW86IiBjb20gZWR1IGdvdiBuZXQgb3JnICIsbXQ6IiBjb20gZWR1IGdvdiBuZXQgb3JnICIsbXY6IiBhZXJvIGJpeiBjb20gY29vcCBlZHUgZ292IGluZm8gaW50IG1pbCBtdXNldW0gbmFtZSBuZXQgb3JnIHBybyAiLG13OiIgYWMgY28gY29tIGNvb3AgZWR1IGdvdiBpbnQgbXVzZXVtIG5ldCBvcmcgIixteDoiIGNvbSBlZHUgZ29iIG5ldCBvcmcgIixteToiIGNvbSBlZHUgZ292IG1pbCBuYW1lIG5ldCBvcmcgc2NoICIsbmY6IiBhcnRzIGNvbSBmaXJtIGluZm8gbmV0IG90aGVyIHBlciByZWMgc3RvcmUgd2ViICIsbmc6IiBiaXogY29tIGVkdSBnb3YgbWlsIG1vYmkgbmFtZSBuZXQgb3JnIHNjaCAiLG5pOiIgYWMgY28gY29tIGVkdSBnb2IgbWlsIG5ldCBub20gb3JnICIsbnA6IiBjb20gZWR1IGdvdiBtaWwgbmV0IG9yZyAiLG5yOiIgYml6IGNvbSBlZHUgZ292IGluZm8gbmV0IG9yZyAiLG9tOiIgYWMgYml6IGNvIGNvbSBlZHUgZ292IG1lZCBtaWwgbXVzZXVtIG5ldCBvcmcgcHJvIHNjaCAiLHBlOiIgY29tIGVkdSBnb2IgbWlsIG5ldCBub20gb3JnIHNsZCAiLHBoOiIgY29tIGVkdSBnb3YgaSBtaWwgbmV0IG5nbyBvcmcgIixwazoiIGJpeiBjb20gZWR1IGZhbSBnb2IgZ29rIGdvbiBnb3AgZ29zIGdvdiBuZXQgb3JnIHdlYiAiLHBsOiIgYXJ0IGJpYWx5c3RvayBiaXogY29tIGVkdSBnZGEgZ2RhbnNrIGdvcnpvdyBnb3YgaW5mbyBrYXRvd2ljZSBrcmFrb3cgbG9keiBsdWJsaW4gbWlsIG5ldCBuZ28gb2xzenR5biBvcmcgcG96bmFuIHB3ciByYWRvbSBzbHVwc2sgc3pjemVjaW4gdG9ydW4gd2Fyc3phd2Egd2F3IHdyb2Mgd3JvY2xhdyB6Z29yYSAiLHByOiIgYWMgYml6IGNvbSBlZHUgZXN0IGdvdiBpbmZvIGlzbGEgbmFtZSBuZXQgb3JnIHBybyBwcm9mICIscHM6IiBjb20gZWR1IGdvdiBuZXQgb3JnIHBsbyBzZWMgIixwdzoiIGJlbGF1IGNvIGVkIGdvIG5lIG9yICIscm86IiBhcnRzIGNvbSBmaXJtIGluZm8gbm9tIG50IG9yZyByZWMgc3RvcmUgdG0gd3d3ICIscnM6IiBhYyBjbyBlZHUgZ292IGluIG9yZyAiLHNiOiIgY29tIGVkdSBnb3YgbmV0IG9yZyAiLHNjOiIgY29tIGVkdSBnb3YgbmV0IG9yZyAiLHNoOiIgY28gY29tIGVkdSBnb3YgbmV0IG5vbSBvcmcgIixzbDoiIGNvbSBlZHUgZ292IG5ldCBvcmcgIixzdDoiIGNvIGNvbSBjb25zdWxhZG8gZWR1IGVtYmFpeGFkYSBnb3YgbWlsIG5ldCBvcmcgcHJpbmNpcGUgc2FvdG9tZSBzdG9yZSAiLHN2OiIgY29tIGVkdSBnb2Igb3JnIHJlZCAiLHN6OiIgYWMgY28gb3JnICIsdHI6IiBhdiBiYnMgYmVsIGJpeiBjb20gZHIgZWR1IGdlbiBnb3YgaW5mbyBrMTIgbmFtZSBuZXQgb3JnIHBvbCB0ZWwgdHNrIHR2IHdlYiAiLHR0OiIgYWVybyBiaXogY2F0IGNvIGNvbSBjb29wIGVkdSBnb3YgaW5mbyBpbnQgam9icyBtaWwgbW9iaSBtdXNldW0gbmFtZSBuZXQgb3JnIHBybyB0ZWwgdHJhdmVsICIsdHc6IiBjbHViIGNvbSBlYml6IGVkdSBnYW1lIGdvdiBpZHYgbWlsIG5ldCBvcmcgIixtdToiIGFjIGNvIGNvbSBnb3YgbmV0IG9yIG9yZyAiLG16OiIgYWMgY28gZWR1IGdvdiBvcmcgIixuYToiIGNvIGNvbSAiLG56OiIgYWMgY28gY3JpIGdlZWsgZ2VuIGdvdnQgaGVhbHRoIGl3aSBtYW9yaSBtaWwgbmV0IG9yZyBwYXJsaWFtZW50IHNjaG9vbCAiLHBhOiIgYWJvIGFjIGNvbSBlZHUgZ29iIGluZyBtZWQgbmV0IG5vbSBvcmcgc2xkICIscHQ6IiBjb20gZWR1IGdvdiBpbnQgbmV0IG5vbWUgb3JnIHB1YmwgIixweToiIGNvbSBlZHUgZ292IG1pbCBuZXQgb3JnICIscWE6IiBjb20gZWR1IGdvdiBtaWwgbmV0IG9yZyAiLHJlOiIgYXNzbyBjb20gbm9tICIscnU6IiBhYyBhZHlnZXlhIGFsdGFpIGFtdXIgYXJraGFuZ2Vsc2sgYXN0cmFraGFuIGJhc2hraXJpYSBiZWxnb3JvZCBiaXIgYnJ5YW5zayBidXJ5YXRpYSBjYmcgY2hlbCBjaGVseWFiaW5zayBjaGl0YSBjaHVrb3RrYSBjaHV2YXNoaWEgY29tIGRhZ2VzdGFuIGUtYnVyZyBlZHUgZ292IGdyb3pueSBpbnQgaXJrdXRzayBpdmFub3ZvIGl6aGV2c2sgamFyIGpvc2hrYXItb2xhIGthbG15a2lhIGthbHVnYSBrYW1jaGF0a2Ega2FyZWxpYSBrYXphbiBrY2hyIGtlbWVyb3ZvIGtoYWJhcm92c2sga2hha2Fzc2lhIGtodiBraXJvdiBrb2VuaWcga29taSBrb3N0cm9tYSBrcmFub3lhcnNrIGt1YmFuIGt1cmdhbiBrdXJzayBsaXBldHNrIG1hZ2FkYW4gbWFyaSBtYXJpLWVsIG1hcmluZSBtaWwgbW9yZG92aWEgbW9zcmVnIG1zayBtdXJtYW5zayBuYWxjaGlrIG5ldCBubm92IG5vdiBub3Zvc2liaXJzayBuc2sgb21zayBvcmVuYnVyZyBvcmcgb3J5b2wgcGVuemEgcGVybSBwcCBwc2tvdiBwdHogcm5kIHJ5YXphbiBzYWtoYWxpbiBzYW1hcmEgc2FyYXRvdiBzaW1iaXJzayBzbW9sZW5zayBzcGIgc3RhdnJvcG9sIHN0diBzdXJndXQgdGFtYm92IHRhdGFyc3RhbiB0b20gdG9tc2sgdHNhcml0c3luIHRzayB0dWxhIHR1dmEgdHZlciB0eXVtZW4gdWRtIHVkbXVydGlhIHVsYW4tdWRlIHZsYWRpa2F2a2F6IHZsYWRpbWlyIHZsYWRpdm9zdG9rIHZvbGdvZ3JhZCB2b2xvZ2RhIHZvcm9uZXpoIHZybiB2eWF0a2EgeWFrdXRpYSB5YW1hbCB5ZWthdGVyaW5idXJnIHl1emhuby1zYWtoYWxpbnNrICIscnc6IiBhYyBjbyBjb20gZWR1IGdvdXYgZ292IGludCBtaWwgbmV0ICIsc2E6IiBjb20gZWR1IGdvdiBtZWQgbmV0IG9yZyBwdWIgc2NoICIsc2Q6IiBjb20gZWR1IGdvdiBpbmZvIG1lZCBuZXQgb3JnIHR2ICIsc2U6IiBhIGFjIGIgYmQgYyBkIGUgZiBnIGggaSBrIGwgbSBuIG8gb3JnIHAgcGFydGkgcHAgcHJlc3MgciBzIHQgdG0gdSB3IHggeSB6ICIsc2c6IiBjb20gZWR1IGdvdiBpZG4gbmV0IG9yZyBwZXIgIixzbjoiIGFydCBjb20gZWR1IGdvdXYgb3JnIHBlcnNvIHVuaXYgIixzeToiIGNvbSBlZHUgZ292IG1pbCBuZXQgbmV3cyBvcmcgIix0aDoiIGFjIGNvIGdvIGluIG1pIG5ldCBvciAiLHRqOiIgYWMgYml6IGNvIGNvbSBlZHUgZ28gZ292IGluZm8gaW50IG1pbCBuYW1lIG5ldCBuaWMgb3JnIHRlc3Qgd2ViICIsdG46IiBhZ3JpbmV0IGNvbSBkZWZlbnNlIGVkdW5ldCBlbnMgZmluIGdvdiBpbmQgaW5mbyBpbnRsIG1pbmNvbSBuYXQgbmV0IG9yZyBwZXJzbyBybnJ0IHJucyBybnUgdG91cmlzbSAiLHR6OiIgYWMgY28gZ28gbmUgb3IgIix1YToiIGJpeiBjaGVya2Fzc3kgY2hlcm5pZ292IGNoZXJub3Z0c3kgY2sgY24gY28gY29tIGNyaW1lYSBjdiBkbiBkbmVwcm9wZXRyb3ZzayBkb25ldHNrIGRwIGVkdSBnb3YgaWYgaW4gaXZhbm8tZnJhbmtpdnNrIGtoIGtoYXJrb3Yga2hlcnNvbiBraG1lbG5pdHNraXkga2lldiBraXJvdm9ncmFkIGttIGtyIGtzIGt2IGxnIGx1Z2Fuc2sgbHV0c2sgbHZpdiBtZSBtayBuZXQgbmlrb2xhZXYgb2Qgb2Rlc3NhIG9yZyBwbCBwb2x0YXZhIHBwIHJvdm5vIHJ2IHNlYmFzdG9wb2wgc3VteSB0ZSB0ZXJub3BpbCB1emhnb3JvZCB2aW5uaWNhIHZuIHphcG9yaXpoemhlIHpoaXRvbWlyIHpwIHp0ICIsdWc6IiBhYyBjbyBnbyBuZSBvciBvcmcgc2MgIix1azoiIGFjIGJsIGJyaXRpc2gtbGlicmFyeSBjbyBjeW0gZ292IGdvdnQgaWNuZXQgamV0IGxlYSBsdGQgbWUgbWlsIG1vZCBuYXRpb25hbC1saWJyYXJ5LXNjb3RsYW5kIG5lbCBuZXQgbmhzIG5pYyBubHMgb3JnIG9yZ24gcGFybGlhbWVudCBwbGMgcG9saWNlIHNjaCBzY290IHNvYyAiLHVzOiIgZG5pIGZlZCBpc2Ega2lkcyBuc24gIix1eToiIGNvbSBlZHUgZ3ViIG1pbCBuZXQgb3JnICIsdmU6IiBjbyBjb20gZWR1IGdvYiBpbmZvIG1pbCBuZXQgb3JnIHdlYiAiLHZpOiIgY28gY29tIGsxMiBuZXQgb3JnICIsdm46IiBhYyBiaXogY29tIGVkdSBnb3YgaGVhbHRoIGluZm8gaW50IG5hbWUgbmV0IG9yZyBwcm8gIix5ZToiIGNvIGNvbSBnb3YgbHRkIG1lIG5ldCBvcmcgcGxjICIseXU6IiBhYyBjbyBlZHUgZ292IG9yZyAiLHphOiIgYWMgYWdyaWMgYWx0IGJvdXJzZSBjaXR5IGNvIGN5YmVybmV0IGRiIGVkdSBnb3YgZ3JvbmRhciBpYWNjZXNzIGltdCBpbmNhIGxhbmRlc2lnbiBsYXcgbWlsIG5ldCBuZ28gbmlzIG5vbSBvbGl2ZXR0aSBvcmcgcGl4IHNjaG9vbCB0bSB3ZWIgIix6bToiIGFjIGNvIGNvbSBlZHUgZ292IG5ldCBvcmcgc2NoICIsY29tOiJhciBiciBjbiBkZSBldSBnYiBnciBodSBqcG4ga3Igbm8gcWMgcnUgc2Egc2UgdWsgdXMgdXkgemEgIixuZXQ6ImdiIGpwIHNlIHVrICIsb3JnOiJhZSIsZGU6ImNvbSAifSxoYXM6ZnVuY3Rpb24obyl7dmFyIHI9by5sYXN0SW5kZXhPZigiLiIpO2lmKHI8PTB8fHI+PW8ubGVuZ3RoLTEpcmV0dXJuITE7dmFyIGk9by5sYXN0SW5kZXhPZigiLiIsci0xKTtpZihpPD0wfHxpPj1yLTEpcmV0dXJuITE7dmFyIHM9bi5saXN0W28uc2xpY2UocisxKV07cmV0dXJuIHM/cy5pbmRleE9mKCIgIitvLnNsaWNlKGkrMSxyKSsiICIpPj0wOiExfSxpczpmdW5jdGlvbihvKXt2YXIgcj1vLmxhc3RJbmRleE9mKCIuIik7aWYocjw9MHx8cj49by5sZW5ndGgtMSlyZXR1cm4hMTt2YXIgaT1vLmxhc3RJbmRleE9mKCIuIixyLTEpO2lmKGk+PTApcmV0dXJuITE7dmFyIHM9bi5saXN0W28uc2xpY2UocisxKV07cmV0dXJuIHM/cy5pbmRleE9mKCIgIitvLnNsaWNlKDAscikrIiAiKT49MDohMX0sZ2V0OmZ1bmN0aW9uKG8pe3ZhciByPW8ubGFzdEluZGV4T2YoIi4iKTtpZihyPD0wfHxyPj1vLmxlbmd0aC0xKXJldHVybiBudWxsO3ZhciBpPW8ubGFzdEluZGV4T2YoIi4iLHItMSk7aWYoaTw9MHx8aT49ci0xKXJldHVybiBudWxsO3ZhciBzPW4ubGlzdFtvLnNsaWNlKHIrMSldO3JldHVybiFzfHxzLmluZGV4T2YoIiAiK28uc2xpY2UoaSsxLHIpKyIgIik8MD9udWxsOm8uc2xpY2UoaSsxKX0sbm9Db25mbGljdDpmdW5jdGlvbigpe3JldHVybiB0LlNlY29uZExldmVsRG9tYWlucz09PXRoaXMmJih0LlNlY29uZExldmVsRG9tYWlucz1lKSx0aGlzfX07cmV0dXJuIG59KX0pO3ZhciB6cz1WbigoVTEsZXApPT57LyohCiAqIFVSSS5qcyAtIE11dGF0aW5nIFVSTHMKICoKICogVmVyc2lvbjogMS4xOS4xMQogKgogKiBBdXRob3I6IFJvZG5leSBSZWhtCiAqIFdlYjogaHR0cDovL21lZGlhbGl6ZS5naXRodWIuaW8vVVJJLmpzLwogKgogKiBMaWNlbnNlZCB1bmRlcgogKiAgIE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UKICoKICovKGZ1bmN0aW9uKHQsZSl7InVzZSBzdHJpY3QiO3R5cGVvZiBlcD09Im9iamVjdCImJmVwLmV4cG9ydHM/ZXAuZXhwb3J0cz1lKHYxKCksRDEoKSxCMSgpKTp0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kP2RlZmluZShbIi4vcHVueWNvZGUiLCIuL0lQdjYiLCIuL1NlY29uZExldmVsRG9tYWlucyJdLGUpOnQuVVJJPWUodC5wdW55Y29kZSx0LklQdjYsdC5TZWNvbmRMZXZlbERvbWFpbnMsdCl9KShVMSxmdW5jdGlvbih0LGUsbixvKXsidXNlIHN0cmljdCI7dmFyIHI9byYmby5VUkk7ZnVuY3Rpb24gaShBLFMpe3ZhciBQPWFyZ3VtZW50cy5sZW5ndGg+PTEsQj1hcmd1bWVudHMubGVuZ3RoPj0yO2lmKCEodGhpcyBpbnN0YW5jZW9mIGkpKXJldHVybiBQP0I/bmV3IGkoQSxTKTpuZXcgaShBKTpuZXcgaTtpZihBPT09dm9pZCAwKXtpZihQKXRocm93IG5ldyBUeXBlRXJyb3IoInVuZGVmaW5lZCBpcyBub3QgYSB2YWxpZCBhcmd1bWVudCBmb3IgVVJJIik7dHlwZW9mIGxvY2F0aW9uPCJ1Ij9BPWxvY2F0aW9uLmhyZWYrIiI6QT0iIn1pZihBPT09bnVsbCYmUCl0aHJvdyBuZXcgVHlwZUVycm9yKCJudWxsIGlzIG5vdCBhIHZhbGlkIGFyZ3VtZW50IGZvciBVUkkiKTtyZXR1cm4gdGhpcy5ocmVmKEEpLFMhPT12b2lkIDA/dGhpcy5hYnNvbHV0ZVRvKFMpOnRoaXN9ZnVuY3Rpb24gcyhBKXtyZXR1cm4vXlswLTldKyQvLnRlc3QoQSl9aS52ZXJzaW9uPSIxLjE5LjExIjt2YXIgZj1pLnByb3RvdHlwZSx1PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gYyhBKXtyZXR1cm4gQS5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9KCl8W1xdXC9cXF0pL2csIlxcJDEiKX1mdW5jdGlvbiBsKEEpe3JldHVybiBBPT09dm9pZCAwPyJVbmRlZmluZWQiOlN0cmluZyhPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoQSkpLnNsaWNlKDgsLTEpfWZ1bmN0aW9uIHAoQSl7cmV0dXJuIGwoQSk9PT0iQXJyYXkifWZ1bmN0aW9uIGQoQSxTKXt2YXIgUD17fSxCLGo7aWYobChTKT09PSJSZWdFeHAiKVA9bnVsbDtlbHNlIGlmKHAoUykpZm9yKEI9MCxqPVMubGVuZ3RoO0I8ajtCKyspUFtTW0JdXT0hMDtlbHNlIFBbU109ITA7Zm9yKEI9MCxqPUEubGVuZ3RoO0I8ajtCKyspe3ZhciBIPVAmJlBbQVtCXV0hPT12b2lkIDB8fCFQJiZTLnRlc3QoQVtCXSk7SCYmKEEuc3BsaWNlKEIsMSksai0tLEItLSl9cmV0dXJuIEF9ZnVuY3Rpb24gbShBLFMpe3ZhciBQLEI7aWYocChTKSl7Zm9yKFA9MCxCPVMubGVuZ3RoO1A8QjtQKyspaWYoIW0oQSxTW1BdKSlyZXR1cm4hMTtyZXR1cm4hMH12YXIgaj1sKFMpO2ZvcihQPTAsQj1BLmxlbmd0aDtQPEI7UCsrKWlmKGo9PT0iUmVnRXhwIil7aWYodHlwZW9mIEFbUF09PSJzdHJpbmciJiZBW1BdLm1hdGNoKFMpKXJldHVybiEwfWVsc2UgaWYoQVtQXT09PVMpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gXyhBLFMpe2lmKCFwKEEpfHwhcChTKXx8QS5sZW5ndGghPT1TLmxlbmd0aClyZXR1cm4hMTtBLnNvcnQoKSxTLnNvcnQoKTtmb3IodmFyIFA9MCxCPUEubGVuZ3RoO1A8QjtQKyspaWYoQVtQXSE9PVNbUF0pcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gZyhBKXt2YXIgUz0vXlwvK3xcLyskL2c7cmV0dXJuIEEucmVwbGFjZShTLCIiKX1pLl9wYXJ0cz1mdW5jdGlvbigpe3JldHVybntwcm90b2NvbDpudWxsLHVzZXJuYW1lOm51bGwscGFzc3dvcmQ6bnVsbCxob3N0bmFtZTpudWxsLHVybjpudWxsLHBvcnQ6bnVsbCxwYXRoOm51bGwscXVlcnk6bnVsbCxmcmFnbWVudDpudWxsLHByZXZlbnRJbnZhbGlkSG9zdG5hbWU6aS5wcmV2ZW50SW52YWxpZEhvc3RuYW1lLGR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVyczppLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycyxlc2NhcGVRdWVyeVNwYWNlOmkuZXNjYXBlUXVlcnlTcGFjZX19LGkucHJldmVudEludmFsaWRIb3N0bmFtZT0hMSxpLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycz0hMSxpLmVzY2FwZVF1ZXJ5U3BhY2U9ITAsaS5wcm90b2NvbF9leHByZXNzaW9uPS9eW2Etel1bYS16MC05ListXSokL2ksaS5pZG5fZXhwcmVzc2lvbj0vW15hLXowLTlcLl8tXS9pLGkucHVueWNvZGVfZXhwcmVzc2lvbj0vKHhuLS0pL2ksaS5pcDRfZXhwcmVzc2lvbj0vXlxkezEsM31cLlxkezEsM31cLlxkezEsM31cLlxkezEsM30kLyxpLmlwNl9leHByZXNzaW9uPS9eXHMqKCgoWzAtOUEtRmEtZl17MSw0fTopezd9KFswLTlBLUZhLWZdezEsNH18OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezZ9KDpbMC05QS1GYS1mXXsxLDR9fCgoMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkoXC4oMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkpezN9KXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7NX0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSwyfSl8OigoMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkoXC4oMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkpezN9KXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7NH0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSwzfSl8KCg6WzAtOUEtRmEtZl17MSw0fSk/OigoMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkoXC4oMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkpezN9KSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezN9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsNH0pfCgoOlswLTlBLUZhLWZdezEsNH0pezAsMn06KCgyNVswLTVdfDJbMC00XVxkfDFcZFxkfFsxLTldP1xkKShcLigyNVswLTVdfDJbMC00XVxkfDFcZFxkfFsxLTldP1xkKSl7M30pKXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7Mn0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSw1fSl8KCg6WzAtOUEtRmEtZl17MSw0fSl7MCwzfTooKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKFwuKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKXszfSkpfDopKXwoKFswLTlBLUZhLWZdezEsNH06KXsxfSgoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDZ9KXwoKDpbMC05QS1GYS1mXXsxLDR9KXswLDR9OigoMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkoXC4oMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkpezN9KSl8OikpfCg6KCgoOlswLTlBLUZhLWZdezEsNH0pezEsN30pfCgoOlswLTlBLUZhLWZdezEsNH0pezAsNX06KCgyNVswLTVdfDJbMC00XVxkfDFcZFxkfFsxLTldP1xkKShcLigyNVswLTVdfDJbMC00XVxkfDFcZFxkfFsxLTldP1xkKSl7M30pKXw6KSkpKCUuKyk/XHMqJC8saS5maW5kX3VyaV9leHByZXNzaW9uPS9cYigoPzpbYS16XVtcdy1dKzooPzpcL3sxLDN9fFthLXowLTklXSl8d3d3XGR7MCwzfVsuXXxbYS16MC05LlwtXStbLl1bYS16XXsyLDR9XC8pKD86W15ccygpPD5dK3xcKChbXlxzKCk8Pl0rfChcKFteXHMoKTw+XStcKSkpKlwpKSsoPzpcKChbXlxzKCk8Pl0rfChcKFteXHMoKTw+XStcKSkpKlwpfFteXHNgISgpXFtcXXt9OzonIi4sPD4/wqvCu+KAnOKAneKAmOKAmV0pKS9pZyxpLmZpbmRVcmk9e3N0YXJ0Oi9cYig/OihbYS16XVthLXowLTkuKy1dKjpcL1wvKXx3d3dcLikvZ2ksZW5kOi9bXHNcclxuXXwkLyx0cmltOi9bYCEoKVxbXF17fTs6JyIuLDw+P8KrwrvigJzigJ3igJ7igJjigJldKyQvLHBhcmVuczovKFwoW15cKV0qXCl8XFtbXlxdXSpcXXxce1tefV0qXH18PFtePl0qPikvZ30saS5sZWFkaW5nX3doaXRlc3BhY2VfZXhwcmVzc2lvbj0vXltceDAwLVx4MjBcdTAwYTBcdTE2ODBcdTIwMDAtXHUyMDBhXHUyMDI4XHUyMDI5XHUyMDJmXHUyMDVmXHUzMDAwXHVmZWZmXSsvLGkuYXNjaWlfdGFiX3doaXRlc3BhY2U9L1tcdTAwMDlcdTAwMEFcdTAwMERdKy9nLGkuZGVmYXVsdFBvcnRzPXtodHRwOiI4MCIsaHR0cHM6IjQ0MyIsZnRwOiIyMSIsZ29waGVyOiI3MCIsd3M6IjgwIix3c3M6IjQ0MyJ9LGkuaG9zdFByb3RvY29scz1bImh0dHAiLCJodHRwcyJdLGkuaW52YWxpZF9ob3N0bmFtZV9jaGFyYWN0ZXJzPS9bXmEtekEtWjAtOVwuXC06X10vLGkuZG9tQXR0cmlidXRlcz17YToiaHJlZiIsYmxvY2txdW90ZToiY2l0ZSIsbGluazoiaHJlZiIsYmFzZToiaHJlZiIsc2NyaXB0OiJzcmMiLGZvcm06ImFjdGlvbiIsaW1nOiJzcmMiLGFyZWE6ImhyZWYiLGlmcmFtZToic3JjIixlbWJlZDoic3JjIixzb3VyY2U6InNyYyIsdHJhY2s6InNyYyIsaW5wdXQ6InNyYyIsYXVkaW86InNyYyIsdmlkZW86InNyYyJ9LGkuZ2V0RG9tQXR0cmlidXRlPWZ1bmN0aW9uKEEpe2lmKCEoIUF8fCFBLm5vZGVOYW1lKSl7dmFyIFM9QS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKCEoUz09PSJpbnB1dCImJkEudHlwZSE9PSJpbWFnZSIpKXJldHVybiBpLmRvbUF0dHJpYnV0ZXNbU119fTtmdW5jdGlvbiBiKEEpe3JldHVybiBlc2NhcGUoQSl9ZnVuY3Rpb24gdyhBKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEEpLnJlcGxhY2UoL1shJygpKl0vZyxiKS5yZXBsYWNlKC9cKi9nLCIlMkEiKX1pLmVuY29kZT13LGkuZGVjb2RlPWRlY29kZVVSSUNvbXBvbmVudCxpLmlzbzg4NTk9ZnVuY3Rpb24oKXtpLmVuY29kZT1lc2NhcGUsaS5kZWNvZGU9dW5lc2NhcGV9LGkudW5pY29kZT1mdW5jdGlvbigpe2kuZW5jb2RlPXcsaS5kZWNvZGU9ZGVjb2RlVVJJQ29tcG9uZW50fSxpLmNoYXJhY3RlcnM9e3BhdGhuYW1lOntlbmNvZGU6e2V4cHJlc3Npb246LyUoMjR8MjZ8MkJ8MkN8M0J8M0R8M0F8NDApL2lnLG1hcDp7IiUyNCI6IiQiLCIlMjYiOiImIiwiJTJCIjoiKyIsIiUyQyI6IiwiLCIlM0IiOiI7IiwiJTNEIjoiPSIsIiUzQSI6IjoiLCIlNDAiOiJAIn19LGRlY29kZTp7ZXhwcmVzc2lvbjovW1wvXD8jXS9nLG1hcDp7Ii8iOiIlMkYiLCI/IjoiJTNGIiwiIyI6IiUyMyJ9fX0scmVzZXJ2ZWQ6e2VuY29kZTp7ZXhwcmVzc2lvbjovJSgyMXwyM3wyNHwyNnwyN3wyOHwyOXwyQXwyQnwyQ3wyRnwzQXwzQnwzRHwzRnw0MHw1Qnw1RCkvaWcsbWFwOnsiJTNBIjoiOiIsIiUyRiI6Ii8iLCIlM0YiOiI/IiwiJTIzIjoiIyIsIiU1QiI6IlsiLCIlNUQiOiJdIiwiJTQwIjoiQCIsIiUyMSI6IiEiLCIlMjQiOiIkIiwiJTI2IjoiJiIsIiUyNyI6IiciLCIlMjgiOiIoIiwiJTI5IjoiKSIsIiUyQSI6IioiLCIlMkIiOiIrIiwiJTJDIjoiLCIsIiUzQiI6IjsiLCIlM0QiOiI9In19fSx1cm5wYXRoOntlbmNvZGU6e2V4cHJlc3Npb246LyUoMjF8MjR8Mjd8Mjh8Mjl8MkF8MkJ8MkN8M0J8M0R8NDApL2lnLG1hcDp7IiUyMSI6IiEiLCIlMjQiOiIkIiwiJTI3IjoiJyIsIiUyOCI6IigiLCIlMjkiOiIpIiwiJTJBIjoiKiIsIiUyQiI6IisiLCIlMkMiOiIsIiwiJTNCIjoiOyIsIiUzRCI6Ij0iLCIlNDAiOiJAIn19LGRlY29kZTp7ZXhwcmVzc2lvbjovW1wvXD8jOl0vZyxtYXA6eyIvIjoiJTJGIiwiPyI6IiUzRiIsIiMiOiIlMjMiLCI6IjoiJTNBIn19fX0saS5lbmNvZGVRdWVyeT1mdW5jdGlvbihBLFMpe3ZhciBQPWkuZW5jb2RlKEErIiIpO3JldHVybiBTPT09dm9pZCAwJiYoUz1pLmVzY2FwZVF1ZXJ5U3BhY2UpLFM/UC5yZXBsYWNlKC8lMjAvZywiKyIpOlB9LGkuZGVjb2RlUXVlcnk9ZnVuY3Rpb24oQSxTKXtBKz0iIixTPT09dm9pZCAwJiYoUz1pLmVzY2FwZVF1ZXJ5U3BhY2UpO3RyeXtyZXR1cm4gaS5kZWNvZGUoUz9BLnJlcGxhY2UoL1wrL2csIiUyMCIpOkEpfWNhdGNoe3JldHVybiBBfX07dmFyIE89e2VuY29kZToiZW5jb2RlIixkZWNvZGU6ImRlY29kZSJ9LEUsVD1mdW5jdGlvbihBLFMpe3JldHVybiBmdW5jdGlvbihQKXt0cnl7cmV0dXJuIGlbU10oUCsiIikucmVwbGFjZShpLmNoYXJhY3RlcnNbQV1bU10uZXhwcmVzc2lvbixmdW5jdGlvbihCKXtyZXR1cm4gaS5jaGFyYWN0ZXJzW0FdW1NdLm1hcFtCXX0pfWNhdGNoe3JldHVybiBQfX19O2ZvcihFIGluIE8paVtFKyJQYXRoU2VnbWVudCJdPVQoInBhdGhuYW1lIixPW0VdKSxpW0UrIlVyblBhdGhTZWdtZW50Il09VCgidXJucGF0aCIsT1tFXSk7dmFyIEM9ZnVuY3Rpb24oQSxTLFApe3JldHVybiBmdW5jdGlvbihCKXt2YXIgajtQP2o9ZnVuY3Rpb24oWCl7cmV0dXJuIGlbU10oaVtQXShYKSl9Omo9aVtTXTtmb3IodmFyIEg9KEIrIiIpLnNwbGl0KEEpLGs9MCxLPUgubGVuZ3RoO2s8SztrKyspSFtrXT1qKEhba10pO3JldHVybiBILmpvaW4oQSl9fTtpLmRlY29kZVBhdGg9QygiLyIsImRlY29kZVBhdGhTZWdtZW50IiksaS5kZWNvZGVVcm5QYXRoPUMoIjoiLCJkZWNvZGVVcm5QYXRoU2VnbWVudCIpLGkucmVjb2RlUGF0aD1DKCIvIiwiZW5jb2RlUGF0aFNlZ21lbnQiLCJkZWNvZGUiKSxpLnJlY29kZVVyblBhdGg9QygiOiIsImVuY29kZVVyblBhdGhTZWdtZW50IiwiZGVjb2RlIiksaS5lbmNvZGVSZXNlcnZlZD1UKCJyZXNlcnZlZCIsImVuY29kZSIpLGkucGFyc2U9ZnVuY3Rpb24oQSxTKXt2YXIgUDtyZXR1cm4gU3x8KFM9e3ByZXZlbnRJbnZhbGlkSG9zdG5hbWU6aS5wcmV2ZW50SW52YWxpZEhvc3RuYW1lfSksQT1BLnJlcGxhY2UoaS5sZWFkaW5nX3doaXRlc3BhY2VfZXhwcmVzc2lvbiwiIiksQT1BLnJlcGxhY2UoaS5hc2NpaV90YWJfd2hpdGVzcGFjZSwiIiksUD1BLmluZGV4T2YoIiMiKSxQPi0xJiYoUy5mcmFnbWVudD1BLnN1YnN0cmluZyhQKzEpfHxudWxsLEE9QS5zdWJzdHJpbmcoMCxQKSksUD1BLmluZGV4T2YoIj8iKSxQPi0xJiYoUy5xdWVyeT1BLnN1YnN0cmluZyhQKzEpfHxudWxsLEE9QS5zdWJzdHJpbmcoMCxQKSksQT1BLnJlcGxhY2UoL14oaHR0cHM/fGZ0cHx3c3M/KT86K1svXFxdKi9pLCIkMTovLyIpLEE9QS5yZXBsYWNlKC9eWy9cXF17Mix9L2ksIi8vIiksQS5zdWJzdHJpbmcoMCwyKT09PSIvLyI/KFMucHJvdG9jb2w9bnVsbCxBPUEuc3Vic3RyaW5nKDIpLEE9aS5wYXJzZUF1dGhvcml0eShBLFMpKTooUD1BLmluZGV4T2YoIjoiKSxQPi0xJiYoUy5wcm90b2NvbD1BLnN1YnN0cmluZygwLFApfHxudWxsLFMucHJvdG9jb2wmJiFTLnByb3RvY29sLm1hdGNoKGkucHJvdG9jb2xfZXhwcmVzc2lvbik/Uy5wcm90b2NvbD12b2lkIDA6QS5zdWJzdHJpbmcoUCsxLFArMykucmVwbGFjZSgvXFwvZywiLyIpPT09Ii8vIj8oQT1BLnN1YnN0cmluZyhQKzMpLEE9aS5wYXJzZUF1dGhvcml0eShBLFMpKTooQT1BLnN1YnN0cmluZyhQKzEpLFMudXJuPSEwKSkpLFMucGF0aD1BLFN9LGkucGFyc2VIb3N0PWZ1bmN0aW9uKEEsUyl7QXx8KEE9IiIpLEE9QS5yZXBsYWNlKC9cXC9nLCIvIik7dmFyIFA9QS5pbmRleE9mKCIvIiksQixqO2lmKFA9PT0tMSYmKFA9QS5sZW5ndGgpLEEuY2hhckF0KDApPT09IlsiKUI9QS5pbmRleE9mKCJdIiksUy5ob3N0bmFtZT1BLnN1YnN0cmluZygxLEIpfHxudWxsLFMucG9ydD1BLnN1YnN0cmluZyhCKzIsUCl8fG51bGwsUy5wb3J0PT09Ii8iJiYoUy5wb3J0PW51bGwpO2Vsc2V7dmFyIEg9QS5pbmRleE9mKCI6Iiksaz1BLmluZGV4T2YoIi8iKSxLPUEuaW5kZXhPZigiOiIsSCsxKTtLIT09LTEmJihrPT09LTF8fEs8ayk/KFMuaG9zdG5hbWU9QS5zdWJzdHJpbmcoMCxQKXx8bnVsbCxTLnBvcnQ9bnVsbCk6KGo9QS5zdWJzdHJpbmcoMCxQKS5zcGxpdCgiOiIpLFMuaG9zdG5hbWU9alswXXx8bnVsbCxTLnBvcnQ9alsxXXx8bnVsbCl9cmV0dXJuIFMuaG9zdG5hbWUmJkEuc3Vic3RyaW5nKFApLmNoYXJBdCgwKSE9PSIvIiYmKFArKyxBPSIvIitBKSxTLnByZXZlbnRJbnZhbGlkSG9zdG5hbWUmJmkuZW5zdXJlVmFsaWRIb3N0bmFtZShTLmhvc3RuYW1lLFMucHJvdG9jb2wpLFMucG9ydCYmaS5lbnN1cmVWYWxpZFBvcnQoUy5wb3J0KSxBLnN1YnN0cmluZyhQKXx8Ii8ifSxpLnBhcnNlQXV0aG9yaXR5PWZ1bmN0aW9uKEEsUyl7cmV0dXJuIEE9aS5wYXJzZVVzZXJpbmZvKEEsUyksaS5wYXJzZUhvc3QoQSxTKX0saS5wYXJzZVVzZXJpbmZvPWZ1bmN0aW9uKEEsUyl7dmFyIFA9QSxCPUEuaW5kZXhPZigiXFwiKTtCIT09LTEmJihBPUEucmVwbGFjZSgvXFwvZywiLyIpKTt2YXIgaj1BLmluZGV4T2YoIi8iKSxIPUEubGFzdEluZGV4T2YoIkAiLGo+LTE/ajpBLmxlbmd0aC0xKSxrO3JldHVybiBIPi0xJiYoaj09PS0xfHxIPGopPyhrPUEuc3Vic3RyaW5nKDAsSCkuc3BsaXQoIjoiKSxTLnVzZXJuYW1lPWtbMF0/aS5kZWNvZGUoa1swXSk6bnVsbCxrLnNoaWZ0KCksUy5wYXNzd29yZD1rWzBdP2kuZGVjb2RlKGsuam9pbigiOiIpKTpudWxsLEE9UC5zdWJzdHJpbmcoSCsxKSk6KFMudXNlcm5hbWU9bnVsbCxTLnBhc3N3b3JkPW51bGwpLEF9LGkucGFyc2VRdWVyeT1mdW5jdGlvbihBLFMpe2lmKCFBKXJldHVybnt9O2lmKEE9QS5yZXBsYWNlKC8mKy9nLCImIikucmVwbGFjZSgvXlw/KiYqfCYrJC9nLCIiKSwhQSlyZXR1cm57fTtmb3IodmFyIFA9e30sQj1BLnNwbGl0KCImIiksaj1CLmxlbmd0aCxILGssSyxYPTA7WDxqO1grKylIPUJbWF0uc3BsaXQoIj0iKSxrPWkuZGVjb2RlUXVlcnkoSC5zaGlmdCgpLFMpLEs9SC5sZW5ndGg/aS5kZWNvZGVRdWVyeShILmpvaW4oIj0iKSxTKTpudWxsLGshPT0iX19wcm90b19fIiYmKHUuY2FsbChQLGspPygodHlwZW9mIFBba109PSJzdHJpbmcifHxQW2tdPT09bnVsbCkmJihQW2tdPVtQW2tdXSksUFtrXS5wdXNoKEspKTpQW2tdPUspO3JldHVybiBQfSxpLmJ1aWxkPWZ1bmN0aW9uKEEpe3ZhciBTPSIiLFA9ITE7cmV0dXJuIEEucHJvdG9jb2wmJihTKz1BLnByb3RvY29sKyI6IiksIUEudXJuJiYoU3x8QS5ob3N0bmFtZSkmJihTKz0iLy8iLFA9ITApLFMrPWkuYnVpbGRBdXRob3JpdHkoQSl8fCIiLHR5cGVvZiBBLnBhdGg9PSJzdHJpbmciJiYoQS5wYXRoLmNoYXJBdCgwKSE9PSIvIiYmUCYmKFMrPSIvIiksUys9QS5wYXRoKSx0eXBlb2YgQS5xdWVyeT09InN0cmluZyImJkEucXVlcnkmJihTKz0iPyIrQS5xdWVyeSksdHlwZW9mIEEuZnJhZ21lbnQ9PSJzdHJpbmciJiZBLmZyYWdtZW50JiYoUys9IiMiK0EuZnJhZ21lbnQpLFN9LGkuYnVpbGRIb3N0PWZ1bmN0aW9uKEEpe3ZhciBTPSIiO2lmKEEuaG9zdG5hbWUpaS5pcDZfZXhwcmVzc2lvbi50ZXN0KEEuaG9zdG5hbWUpP1MrPSJbIitBLmhvc3RuYW1lKyJdIjpTKz1BLmhvc3RuYW1lO2Vsc2UgcmV0dXJuIiI7cmV0dXJuIEEucG9ydCYmKFMrPSI6IitBLnBvcnQpLFN9LGkuYnVpbGRBdXRob3JpdHk9ZnVuY3Rpb24oQSl7cmV0dXJuIGkuYnVpbGRVc2VyaW5mbyhBKStpLmJ1aWxkSG9zdChBKX0saS5idWlsZFVzZXJpbmZvPWZ1bmN0aW9uKEEpe3ZhciBTPSIiO3JldHVybiBBLnVzZXJuYW1lJiYoUys9aS5lbmNvZGUoQS51c2VybmFtZSkpLEEucGFzc3dvcmQmJihTKz0iOiIraS5lbmNvZGUoQS5wYXNzd29yZCkpLFMmJihTKz0iQCIpLFN9LGkuYnVpbGRRdWVyeT1mdW5jdGlvbihBLFMsUCl7dmFyIEI9IiIsaixILGssSztmb3IoSCBpbiBBKWlmKEghPT0iX19wcm90b19fIiYmdS5jYWxsKEEsSCkpaWYocChBW0hdKSlmb3Ioaj17fSxrPTAsSz1BW0hdLmxlbmd0aDtrPEs7aysrKUFbSF1ba10hPT12b2lkIDAmJmpbQVtIXVtrXSsiIl09PT12b2lkIDAmJihCKz0iJiIraS5idWlsZFF1ZXJ5UGFyYW1ldGVyKEgsQVtIXVtrXSxQKSxTIT09ITAmJihqW0FbSF1ba10rIiJdPSEwKSk7ZWxzZSBBW0hdIT09dm9pZCAwJiYoQis9IiYiK2kuYnVpbGRRdWVyeVBhcmFtZXRlcihILEFbSF0sUCkpO3JldHVybiBCLnN1YnN0cmluZygxKX0saS5idWlsZFF1ZXJ5UGFyYW1ldGVyPWZ1bmN0aW9uKEEsUyxQKXtyZXR1cm4gaS5lbmNvZGVRdWVyeShBLFApKyhTIT09bnVsbD8iPSIraS5lbmNvZGVRdWVyeShTLFApOiIiKX0saS5hZGRRdWVyeT1mdW5jdGlvbihBLFMsUCl7aWYodHlwZW9mIFM9PSJvYmplY3QiKWZvcih2YXIgQiBpbiBTKXUuY2FsbChTLEIpJiZpLmFkZFF1ZXJ5KEEsQixTW0JdKTtlbHNlIGlmKHR5cGVvZiBTPT0ic3RyaW5nIil7aWYoQVtTXT09PXZvaWQgMCl7QVtTXT1QO3JldHVybn1lbHNlIHR5cGVvZiBBW1NdPT0ic3RyaW5nIiYmKEFbU109W0FbU11dKTtwKFApfHwoUD1bUF0pLEFbU109KEFbU118fFtdKS5jb25jYXQoUCl9ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCJVUkkuYWRkUXVlcnkoKSBhY2NlcHRzIGFuIG9iamVjdCwgc3RyaW5nIGFzIHRoZSBuYW1lIHBhcmFtZXRlciIpfSxpLnNldFF1ZXJ5PWZ1bmN0aW9uKEEsUyxQKXtpZih0eXBlb2YgUz09Im9iamVjdCIpZm9yKHZhciBCIGluIFMpdS5jYWxsKFMsQikmJmkuc2V0UXVlcnkoQSxCLFNbQl0pO2Vsc2UgaWYodHlwZW9mIFM9PSJzdHJpbmciKUFbU109UD09PXZvaWQgMD9udWxsOlA7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCJVUkkuc2V0UXVlcnkoKSBhY2NlcHRzIGFuIG9iamVjdCwgc3RyaW5nIGFzIHRoZSBuYW1lIHBhcmFtZXRlciIpfSxpLnJlbW92ZVF1ZXJ5PWZ1bmN0aW9uKEEsUyxQKXt2YXIgQixqLEg7aWYocChTKSlmb3IoQj0wLGo9Uy5sZW5ndGg7QjxqO0IrKylBW1NbQl1dPXZvaWQgMDtlbHNlIGlmKGwoUyk9PT0iUmVnRXhwIilmb3IoSCBpbiBBKVMudGVzdChIKSYmKEFbSF09dm9pZCAwKTtlbHNlIGlmKHR5cGVvZiBTPT0ib2JqZWN0Iilmb3IoSCBpbiBTKXUuY2FsbChTLEgpJiZpLnJlbW92ZVF1ZXJ5KEEsSCxTW0hdKTtlbHNlIGlmKHR5cGVvZiBTPT0ic3RyaW5nIilQIT09dm9pZCAwP2woUCk9PT0iUmVnRXhwIj8hcChBW1NdKSYmUC50ZXN0KEFbU10pP0FbU109dm9pZCAwOkFbU109ZChBW1NdLFApOkFbU109PT1TdHJpbmcoUCkmJighcChQKXx8UC5sZW5ndGg9PT0xKT9BW1NdPXZvaWQgMDpwKEFbU10pJiYoQVtTXT1kKEFbU10sUCkpOkFbU109dm9pZCAwO2Vsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcigiVVJJLnJlbW92ZVF1ZXJ5KCkgYWNjZXB0cyBhbiBvYmplY3QsIHN0cmluZywgUmVnRXhwIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIiKX0saS5oYXNRdWVyeT1mdW5jdGlvbihBLFMsUCxCKXtzd2l0Y2gobChTKSl7Y2FzZSJTdHJpbmciOmJyZWFrO2Nhc2UiUmVnRXhwIjpmb3IodmFyIGogaW4gQSlpZih1LmNhbGwoQSxqKSYmUy50ZXN0KGopJiYoUD09PXZvaWQgMHx8aS5oYXNRdWVyeShBLGosUCkpKXJldHVybiEwO3JldHVybiExO2Nhc2UiT2JqZWN0Ijpmb3IodmFyIEggaW4gUylpZih1LmNhbGwoUyxIKSYmIWkuaGFzUXVlcnkoQSxILFNbSF0pKXJldHVybiExO3JldHVybiEwO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiVVJJLmhhc1F1ZXJ5KCkgYWNjZXB0cyBhIHN0cmluZywgcmVndWxhciBleHByZXNzaW9uIG9yIG9iamVjdCBhcyB0aGUgbmFtZSBwYXJhbWV0ZXIiKX1zd2l0Y2gobChQKSl7Y2FzZSJVbmRlZmluZWQiOnJldHVybiBTIGluIEE7Y2FzZSJCb29sZWFuIjp2YXIgaz0hIShwKEFbU10pP0FbU10ubGVuZ3RoOkFbU10pO3JldHVybiBQPT09aztjYXNlIkZ1bmN0aW9uIjpyZXR1cm4hIVAoQVtTXSxTLEEpO2Nhc2UiQXJyYXkiOmlmKCFwKEFbU10pKXJldHVybiExO3ZhciBLPUI/bTpfO3JldHVybiBLKEFbU10sUCk7Y2FzZSJSZWdFeHAiOnJldHVybiBwKEFbU10pP0I/bShBW1NdLFApOiExOiEhKEFbU10mJkFbU10ubWF0Y2goUCkpO2Nhc2UiTnVtYmVyIjpQPVN0cmluZyhQKTtjYXNlIlN0cmluZyI6cmV0dXJuIHAoQVtTXSk/Qj9tKEFbU10sUCk6ITE6QVtTXT09PVA7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJVUkkuaGFzUXVlcnkoKSBhY2NlcHRzIHVuZGVmaW5lZCwgYm9vbGVhbiwgc3RyaW5nLCBudW1iZXIsIFJlZ0V4cCwgRnVuY3Rpb24gYXMgdGhlIHZhbHVlIHBhcmFtZXRlciIpfX0saS5qb2luUGF0aHM9ZnVuY3Rpb24oKXtmb3IodmFyIEE9W10sUz1bXSxQPTAsQj0wO0I8YXJndW1lbnRzLmxlbmd0aDtCKyspe3ZhciBqPW5ldyBpKGFyZ3VtZW50c1tCXSk7QS5wdXNoKGopO2Zvcih2YXIgSD1qLnNlZ21lbnQoKSxrPTA7azxILmxlbmd0aDtrKyspdHlwZW9mIEhba109PSJzdHJpbmciJiZTLnB1c2goSFtrXSksSFtrXSYmUCsrfWlmKCFTLmxlbmd0aHx8IVApcmV0dXJuIG5ldyBpKCIiKTt2YXIgSz1uZXcgaSgiIikuc2VnbWVudChTKTtyZXR1cm4oQVswXS5wYXRoKCk9PT0iInx8QVswXS5wYXRoKCkuc2xpY2UoMCwxKT09PSIvIikmJksucGF0aCgiLyIrSy5wYXRoKCkpLEsubm9ybWFsaXplKCl9LGkuY29tbW9uUGF0aD1mdW5jdGlvbihBLFMpe3ZhciBQPU1hdGgubWluKEEubGVuZ3RoLFMubGVuZ3RoKSxCO2ZvcihCPTA7QjxQO0IrKylpZihBLmNoYXJBdChCKSE9PVMuY2hhckF0KEIpKXtCLS07YnJlYWt9cmV0dXJuIEI8MT9BLmNoYXJBdCgwKT09PVMuY2hhckF0KDApJiZBLmNoYXJBdCgwKT09PSIvIj8iLyI6IiI6KChBLmNoYXJBdChCKSE9PSIvInx8Uy5jaGFyQXQoQikhPT0iLyIpJiYoQj1BLnN1YnN0cmluZygwLEIpLmxhc3RJbmRleE9mKCIvIikpLEEuc3Vic3RyaW5nKDAsQisxKSl9LGkud2l0aGluU3RyaW5nPWZ1bmN0aW9uKEEsUyxQKXtQfHwoUD17fSk7dmFyIEI9UC5zdGFydHx8aS5maW5kVXJpLnN0YXJ0LGo9UC5lbmR8fGkuZmluZFVyaS5lbmQsSD1QLnRyaW18fGkuZmluZFVyaS50cmltLGs9UC5wYXJlbnN8fGkuZmluZFVyaS5wYXJlbnMsSz0vW2EtejAtOS1dPVsiJ10/JC9pO2ZvcihCLmxhc3RJbmRleD0wOzspe3ZhciBYPUIuZXhlYyhBKTtpZighWClicmVhazt2YXIgUj1YLmluZGV4O2lmKFAuaWdub3JlSHRtbCl7dmFyIG90PUEuc2xpY2UoTWF0aC5tYXgoUi0zLDApLFIpO2lmKG90JiZLLnRlc3Qob3QpKWNvbnRpbnVlfWZvcih2YXIgY3Q9UitBLnNsaWNlKFIpLnNlYXJjaChqKSxwdD1BLnNsaWNlKFIsY3QpLHl0PS0xOzspe3ZhciBydD1rLmV4ZWMocHQpO2lmKCFydClicmVhazt2YXIgUHQ9cnQuaW5kZXgrcnRbMF0ubGVuZ3RoO3l0PU1hdGgubWF4KHl0LFB0KX1pZih5dD4tMT9wdD1wdC5zbGljZSgwLHl0KStwdC5zbGljZSh5dCkucmVwbGFjZShILCIiKTpwdD1wdC5yZXBsYWNlKEgsIiIpLCEocHQubGVuZ3RoPD1YWzBdLmxlbmd0aCkmJiEoUC5pZ25vcmUmJlAuaWdub3JlLnRlc3QocHQpKSl7Y3Q9UitwdC5sZW5ndGg7dmFyIGd0PVMocHQsUixjdCxBKTtpZihndD09PXZvaWQgMCl7Qi5sYXN0SW5kZXg9Y3Q7Y29udGludWV9Z3Q9U3RyaW5nKGd0KSxBPUEuc2xpY2UoMCxSKStndCtBLnNsaWNlKGN0KSxCLmxhc3RJbmRleD1SK2d0Lmxlbmd0aH19cmV0dXJuIEIubGFzdEluZGV4PTAsQX0saS5lbnN1cmVWYWxpZEhvc3RuYW1lPWZ1bmN0aW9uKEEsUyl7dmFyIFA9ISFBLEI9ISFTLGo9ITE7aWYoQiYmKGo9bShpLmhvc3RQcm90b2NvbHMsUykpLGomJiFQKXRocm93IG5ldyBUeXBlRXJyb3IoIkhvc3RuYW1lIGNhbm5vdCBiZSBlbXB0eSwgaWYgcHJvdG9jb2wgaXMgIitTKTtpZihBJiZBLm1hdGNoKGkuaW52YWxpZF9ob3N0bmFtZV9jaGFyYWN0ZXJzKSl7aWYoIXQpdGhyb3cgbmV3IFR5cGVFcnJvcignSG9zdG5hbWUgIicrQSsnIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOS4tOl9dIGFuZCBQdW55Y29kZS5qcyBpcyBub3QgYXZhaWxhYmxlJyk7aWYodC50b0FTQ0lJKEEpLm1hdGNoKGkuaW52YWxpZF9ob3N0bmFtZV9jaGFyYWN0ZXJzKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdIb3N0bmFtZSAiJytBKyciIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBbQS1aMC05Li06X10nKX19LGkuZW5zdXJlVmFsaWRQb3J0PWZ1bmN0aW9uKEEpe2lmKEEpe3ZhciBTPU51bWJlcihBKTtpZighKHMoUykmJlM+MCYmUzw2NTUzNikpdGhyb3cgbmV3IFR5cGVFcnJvcignUG9ydCAiJytBKyciIGlzIG5vdCBhIHZhbGlkIHBvcnQnKX19LGkubm9Db25mbGljdD1mdW5jdGlvbihBKXtpZihBKXt2YXIgUz17VVJJOnRoaXMubm9Db25mbGljdCgpfTtyZXR1cm4gby5VUklUZW1wbGF0ZSYmdHlwZW9mIG8uVVJJVGVtcGxhdGUubm9Db25mbGljdD09ImZ1bmN0aW9uIiYmKFMuVVJJVGVtcGxhdGU9by5VUklUZW1wbGF0ZS5ub0NvbmZsaWN0KCkpLG8uSVB2NiYmdHlwZW9mIG8uSVB2Ni5ub0NvbmZsaWN0PT0iZnVuY3Rpb24iJiYoUy5JUHY2PW8uSVB2Ni5ub0NvbmZsaWN0KCkpLG8uU2Vjb25kTGV2ZWxEb21haW5zJiZ0eXBlb2Ygby5TZWNvbmRMZXZlbERvbWFpbnMubm9Db25mbGljdD09ImZ1bmN0aW9uIiYmKFMuU2Vjb25kTGV2ZWxEb21haW5zPW8uU2Vjb25kTGV2ZWxEb21haW5zLm5vQ29uZmxpY3QoKSksU31lbHNlIG8uVVJJPT09dGhpcyYmKG8uVVJJPXIpO3JldHVybiB0aGlzfSxmLmJ1aWxkPWZ1bmN0aW9uKEEpe3JldHVybiBBPT09ITA/dGhpcy5fZGVmZXJyZWRfYnVpbGQ9ITA6KEE9PT12b2lkIDB8fHRoaXMuX2RlZmVycmVkX2J1aWxkKSYmKHRoaXMuX3N0cmluZz1pLmJ1aWxkKHRoaXMuX3BhcnRzKSx0aGlzLl9kZWZlcnJlZF9idWlsZD0hMSksdGhpc30sZi5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgaSh0aGlzKX0sZi52YWx1ZU9mPWYudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idWlsZCghMSkuX3N0cmluZ307ZnVuY3Rpb24gTihBKXtyZXR1cm4gZnVuY3Rpb24oUyxQKXtyZXR1cm4gUz09PXZvaWQgMD90aGlzLl9wYXJ0c1tBXXx8IiI6KHRoaXMuX3BhcnRzW0FdPVN8fG51bGwsdGhpcy5idWlsZCghUCksdGhpcyl9fWZ1bmN0aW9uIEkoQSxTKXtyZXR1cm4gZnVuY3Rpb24oUCxCKXtyZXR1cm4gUD09PXZvaWQgMD90aGlzLl9wYXJ0c1tBXXx8IiI6KFAhPT1udWxsJiYoUD1QKyIiLFAuY2hhckF0KDApPT09UyYmKFA9UC5zdWJzdHJpbmcoMSkpKSx0aGlzLl9wYXJ0c1tBXT1QLHRoaXMuYnVpbGQoIUIpLHRoaXMpfX1mLnByb3RvY29sPU4oInByb3RvY29sIiksZi51c2VybmFtZT1OKCJ1c2VybmFtZSIpLGYucGFzc3dvcmQ9TigicGFzc3dvcmQiKSxmLmhvc3RuYW1lPU4oImhvc3RuYW1lIiksZi5wb3J0PU4oInBvcnQiKSxmLnF1ZXJ5PUkoInF1ZXJ5IiwiPyIpLGYuZnJhZ21lbnQ9SSgiZnJhZ21lbnQiLCIjIiksZi5zZWFyY2g9ZnVuY3Rpb24oQSxTKXt2YXIgUD10aGlzLnF1ZXJ5KEEsUyk7cmV0dXJuIHR5cGVvZiBQPT0ic3RyaW5nIiYmUC5sZW5ndGg/Ij8iK1A6UH0sZi5oYXNoPWZ1bmN0aW9uKEEsUyl7dmFyIFA9dGhpcy5mcmFnbWVudChBLFMpO3JldHVybiB0eXBlb2YgUD09InN0cmluZyImJlAubGVuZ3RoPyIjIitQOlB9LGYucGF0aG5hbWU9ZnVuY3Rpb24oQSxTKXtpZihBPT09dm9pZCAwfHxBPT09ITApe3ZhciBQPXRoaXMuX3BhcnRzLnBhdGh8fCh0aGlzLl9wYXJ0cy5ob3N0bmFtZT8iLyI6IiIpO3JldHVybiBBPyh0aGlzLl9wYXJ0cy51cm4/aS5kZWNvZGVVcm5QYXRoOmkuZGVjb2RlUGF0aCkoUCk6UH1lbHNlIHJldHVybiB0aGlzLl9wYXJ0cy51cm4/dGhpcy5fcGFydHMucGF0aD1BP2kucmVjb2RlVXJuUGF0aChBKToiIjp0aGlzLl9wYXJ0cy5wYXRoPUE/aS5yZWNvZGVQYXRoKEEpOiIvIix0aGlzLmJ1aWxkKCFTKSx0aGlzfSxmLnBhdGg9Zi5wYXRobmFtZSxmLmhyZWY9ZnVuY3Rpb24oQSxTKXt2YXIgUDtpZihBPT09dm9pZCAwKXJldHVybiB0aGlzLnRvU3RyaW5nKCk7dGhpcy5fc3RyaW5nPSIiLHRoaXMuX3BhcnRzPWkuX3BhcnRzKCk7dmFyIEI9QSBpbnN0YW5jZW9mIGksaj10eXBlb2YgQT09Im9iamVjdCImJihBLmhvc3RuYW1lfHxBLnBhdGh8fEEucGF0aG5hbWUpO2lmKEEubm9kZU5hbWUpe3ZhciBIPWkuZ2V0RG9tQXR0cmlidXRlKEEpO0E9QVtIXXx8IiIsaj0hMX1pZighQiYmaiYmQS5wYXRobmFtZSE9PXZvaWQgMCYmKEE9QS50b1N0cmluZygpKSx0eXBlb2YgQT09InN0cmluZyJ8fEEgaW5zdGFuY2VvZiBTdHJpbmcpdGhpcy5fcGFydHM9aS5wYXJzZShTdHJpbmcoQSksdGhpcy5fcGFydHMpO2Vsc2UgaWYoQnx8ail7dmFyIGs9Qj9BLl9wYXJ0czpBO2ZvcihQIGluIGspUCE9PSJxdWVyeSImJnUuY2FsbCh0aGlzLl9wYXJ0cyxQKSYmKHRoaXMuX3BhcnRzW1BdPWtbUF0pO2sucXVlcnkmJnRoaXMucXVlcnkoay5xdWVyeSwhMSl9ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIGlucHV0Iik7cmV0dXJuIHRoaXMuYnVpbGQoIVMpLHRoaXN9LGYuaXM9ZnVuY3Rpb24oQSl7dmFyIFM9ITEsUD0hMSxCPSExLGo9ITEsSD0hMSxrPSExLEs9ITEsWD0hdGhpcy5fcGFydHMudXJuO3N3aXRjaCh0aGlzLl9wYXJ0cy5ob3N0bmFtZSYmKFg9ITEsUD1pLmlwNF9leHByZXNzaW9uLnRlc3QodGhpcy5fcGFydHMuaG9zdG5hbWUpLEI9aS5pcDZfZXhwcmVzc2lvbi50ZXN0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKSxTPVB8fEIsaj0hUyxIPWomJm4mJm4uaGFzKHRoaXMuX3BhcnRzLmhvc3RuYW1lKSxrPWomJmkuaWRuX2V4cHJlc3Npb24udGVzdCh0aGlzLl9wYXJ0cy5ob3N0bmFtZSksSz1qJiZpLnB1bnljb2RlX2V4cHJlc3Npb24udGVzdCh0aGlzLl9wYXJ0cy5ob3N0bmFtZSkpLEEudG9Mb3dlckNhc2UoKSl7Y2FzZSJyZWxhdGl2ZSI6cmV0dXJuIFg7Y2FzZSJhYnNvbHV0ZSI6cmV0dXJuIVg7Y2FzZSJkb21haW4iOmNhc2UibmFtZSI6cmV0dXJuIGo7Y2FzZSJzbGQiOnJldHVybiBIO2Nhc2UiaXAiOnJldHVybiBTO2Nhc2UiaXA0IjpjYXNlImlwdjQiOmNhc2UiaW5ldDQiOnJldHVybiBQO2Nhc2UiaXA2IjpjYXNlImlwdjYiOmNhc2UiaW5ldDYiOnJldHVybiBCO2Nhc2UiaWRuIjpyZXR1cm4gaztjYXNlInVybCI6cmV0dXJuIXRoaXMuX3BhcnRzLnVybjtjYXNlInVybiI6cmV0dXJuISF0aGlzLl9wYXJ0cy51cm47Y2FzZSJwdW55Y29kZSI6cmV0dXJuIEt9cmV0dXJuIG51bGx9O3ZhciBEPWYucHJvdG9jb2wsdj1mLnBvcnQsTD1mLmhvc3RuYW1lO2YucHJvdG9jb2w9ZnVuY3Rpb24oQSxTKXtpZihBJiYoQT1BLnJlcGxhY2UoLzooXC9cLyk/JC8sIiIpLCFBLm1hdGNoKGkucHJvdG9jb2xfZXhwcmVzc2lvbikpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1Byb3RvY29sICInK0ErYCIgY29udGFpbnMgY2hhcmFjdGVycyBvdGhlciB0aGFuIFtBLVowLTkuKy1dIG9yIGRvZXNuJ3Qgc3RhcnQgd2l0aCBbQS1aXWApO3JldHVybiBELmNhbGwodGhpcyxBLFMpfSxmLnNjaGVtZT1mLnByb3RvY29sLGYucG9ydD1mdW5jdGlvbihBLFMpe3JldHVybiB0aGlzLl9wYXJ0cy51cm4/QT09PXZvaWQgMD8iIjp0aGlzOihBIT09dm9pZCAwJiYoQT09PTAmJihBPW51bGwpLEEmJihBKz0iIixBLmNoYXJBdCgwKT09PSI6IiYmKEE9QS5zdWJzdHJpbmcoMSkpLGkuZW5zdXJlVmFsaWRQb3J0KEEpKSksdi5jYWxsKHRoaXMsQSxTKSl9LGYuaG9zdG5hbWU9ZnVuY3Rpb24oQSxTKXtpZih0aGlzLl9wYXJ0cy51cm4pcmV0dXJuIEE9PT12b2lkIDA/IiI6dGhpcztpZihBIT09dm9pZCAwKXt2YXIgUD17cHJldmVudEludmFsaWRIb3N0bmFtZTp0aGlzLl9wYXJ0cy5wcmV2ZW50SW52YWxpZEhvc3RuYW1lfSxCPWkucGFyc2VIb3N0KEEsUCk7aWYoQiE9PSIvIil0aHJvdyBuZXcgVHlwZUVycm9yKCdIb3N0bmFtZSAiJytBKyciIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBbQS1aMC05Li1dJyk7QT1QLmhvc3RuYW1lLHRoaXMuX3BhcnRzLnByZXZlbnRJbnZhbGlkSG9zdG5hbWUmJmkuZW5zdXJlVmFsaWRIb3N0bmFtZShBLHRoaXMuX3BhcnRzLnByb3RvY29sKX1yZXR1cm4gTC5jYWxsKHRoaXMsQSxTKX0sZi5vcmlnaW49ZnVuY3Rpb24oQSxTKXtpZih0aGlzLl9wYXJ0cy51cm4pcmV0dXJuIEE9PT12b2lkIDA/IiI6dGhpcztpZihBPT09dm9pZCAwKXt2YXIgUD10aGlzLnByb3RvY29sKCksQj10aGlzLmF1dGhvcml0eSgpO3JldHVybiBCPyhQP1ArIjovLyI6IiIpK3RoaXMuYXV0aG9yaXR5KCk6IiJ9ZWxzZXt2YXIgaj1pKEEpO3JldHVybiB0aGlzLnByb3RvY29sKGoucHJvdG9jb2woKSkuYXV0aG9yaXR5KGouYXV0aG9yaXR5KCkpLmJ1aWxkKCFTKSx0aGlzfX0sZi5ob3N0PWZ1bmN0aW9uKEEsUyl7aWYodGhpcy5fcGFydHMudXJuKXJldHVybiBBPT09dm9pZCAwPyIiOnRoaXM7aWYoQT09PXZvaWQgMClyZXR1cm4gdGhpcy5fcGFydHMuaG9zdG5hbWU/aS5idWlsZEhvc3QodGhpcy5fcGFydHMpOiIiO3ZhciBQPWkucGFyc2VIb3N0KEEsdGhpcy5fcGFydHMpO2lmKFAhPT0iLyIpdGhyb3cgbmV3IFR5cGVFcnJvcignSG9zdG5hbWUgIicrQSsnIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOS4tXScpO3JldHVybiB0aGlzLmJ1aWxkKCFTKSx0aGlzfSxmLmF1dGhvcml0eT1mdW5jdGlvbihBLFMpe2lmKHRoaXMuX3BhcnRzLnVybilyZXR1cm4gQT09PXZvaWQgMD8iIjp0aGlzO2lmKEE9PT12b2lkIDApcmV0dXJuIHRoaXMuX3BhcnRzLmhvc3RuYW1lP2kuYnVpbGRBdXRob3JpdHkodGhpcy5fcGFydHMpOiIiO3ZhciBQPWkucGFyc2VBdXRob3JpdHkoQSx0aGlzLl9wYXJ0cyk7aWYoUCE9PSIvIil0aHJvdyBuZXcgVHlwZUVycm9yKCdIb3N0bmFtZSAiJytBKyciIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBbQS1aMC05Li1dJyk7cmV0dXJuIHRoaXMuYnVpbGQoIVMpLHRoaXN9LGYudXNlcmluZm89ZnVuY3Rpb24oQSxTKXtpZih0aGlzLl9wYXJ0cy51cm4pcmV0dXJuIEE9PT12b2lkIDA/IiI6dGhpcztpZihBPT09dm9pZCAwKXt2YXIgUD1pLmJ1aWxkVXNlcmluZm8odGhpcy5fcGFydHMpO3JldHVybiBQJiZQLnN1YnN0cmluZygwLFAubGVuZ3RoLTEpfWVsc2UgcmV0dXJuIEFbQS5sZW5ndGgtMV0hPT0iQCImJihBKz0iQCIpLGkucGFyc2VVc2VyaW5mbyhBLHRoaXMuX3BhcnRzKSx0aGlzLmJ1aWxkKCFTKSx0aGlzfSxmLnJlc291cmNlPWZ1bmN0aW9uKEEsUyl7dmFyIFA7cmV0dXJuIEE9PT12b2lkIDA/dGhpcy5wYXRoKCkrdGhpcy5zZWFyY2goKSt0aGlzLmhhc2goKTooUD1pLnBhcnNlKEEpLHRoaXMuX3BhcnRzLnBhdGg9UC5wYXRoLHRoaXMuX3BhcnRzLnF1ZXJ5PVAucXVlcnksdGhpcy5fcGFydHMuZnJhZ21lbnQ9UC5mcmFnbWVudCx0aGlzLmJ1aWxkKCFTKSx0aGlzKX0sZi5zdWJkb21haW49ZnVuY3Rpb24oQSxTKXtpZih0aGlzLl9wYXJ0cy51cm4pcmV0dXJuIEE9PT12b2lkIDA/IiI6dGhpcztpZihBPT09dm9pZCAwKXtpZighdGhpcy5fcGFydHMuaG9zdG5hbWV8fHRoaXMuaXMoIklQIikpcmV0dXJuIiI7dmFyIFA9dGhpcy5fcGFydHMuaG9zdG5hbWUubGVuZ3RoLXRoaXMuZG9tYWluKCkubGVuZ3RoLTE7cmV0dXJuIHRoaXMuX3BhcnRzLmhvc3RuYW1lLnN1YnN0cmluZygwLFApfHwiIn1lbHNle3ZhciBCPXRoaXMuX3BhcnRzLmhvc3RuYW1lLmxlbmd0aC10aGlzLmRvbWFpbigpLmxlbmd0aCxqPXRoaXMuX3BhcnRzLmhvc3RuYW1lLnN1YnN0cmluZygwLEIpLEg9bmV3IFJlZ0V4cCgiXiIrYyhqKSk7aWYoQSYmQS5jaGFyQXQoQS5sZW5ndGgtMSkhPT0iLiImJihBKz0iLiIpLEEuaW5kZXhPZigiOiIpIT09LTEpdGhyb3cgbmV3IFR5cGVFcnJvcigiRG9tYWlucyBjYW5ub3QgY29udGFpbiBjb2xvbnMiKTtyZXR1cm4gQSYmaS5lbnN1cmVWYWxpZEhvc3RuYW1lKEEsdGhpcy5fcGFydHMucHJvdG9jb2wpLHRoaXMuX3BhcnRzLmhvc3RuYW1lPXRoaXMuX3BhcnRzLmhvc3RuYW1lLnJlcGxhY2UoSCxBKSx0aGlzLmJ1aWxkKCFTKSx0aGlzfX0sZi5kb21haW49ZnVuY3Rpb24oQSxTKXtpZih0aGlzLl9wYXJ0cy51cm4pcmV0dXJuIEE9PT12b2lkIDA/IiI6dGhpcztpZih0eXBlb2YgQT09ImJvb2xlYW4iJiYoUz1BLEE9dm9pZCAwKSxBPT09dm9pZCAwKXtpZighdGhpcy5fcGFydHMuaG9zdG5hbWV8fHRoaXMuaXMoIklQIikpcmV0dXJuIiI7dmFyIFA9dGhpcy5fcGFydHMuaG9zdG5hbWUubWF0Y2goL1wuL2cpO2lmKFAmJlAubGVuZ3RoPDIpcmV0dXJuIHRoaXMuX3BhcnRzLmhvc3RuYW1lO3ZhciBCPXRoaXMuX3BhcnRzLmhvc3RuYW1lLmxlbmd0aC10aGlzLnRsZChTKS5sZW5ndGgtMTtyZXR1cm4gQj10aGlzLl9wYXJ0cy5ob3N0bmFtZS5sYXN0SW5kZXhPZigiLiIsQi0xKSsxLHRoaXMuX3BhcnRzLmhvc3RuYW1lLnN1YnN0cmluZyhCKXx8IiJ9ZWxzZXtpZighQSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYW5ub3Qgc2V0IGRvbWFpbiBlbXB0eSIpO2lmKEEuaW5kZXhPZigiOiIpIT09LTEpdGhyb3cgbmV3IFR5cGVFcnJvcigiRG9tYWlucyBjYW5ub3QgY29udGFpbiBjb2xvbnMiKTtpZihpLmVuc3VyZVZhbGlkSG9zdG5hbWUoQSx0aGlzLl9wYXJ0cy5wcm90b2NvbCksIXRoaXMuX3BhcnRzLmhvc3RuYW1lfHx0aGlzLmlzKCJJUCIpKXRoaXMuX3BhcnRzLmhvc3RuYW1lPUE7ZWxzZXt2YXIgaj1uZXcgUmVnRXhwKGModGhpcy5kb21haW4oKSkrIiQiKTt0aGlzLl9wYXJ0cy5ob3N0bmFtZT10aGlzLl9wYXJ0cy5ob3N0bmFtZS5yZXBsYWNlKGosQSl9cmV0dXJuIHRoaXMuYnVpbGQoIVMpLHRoaXN9fSxmLnRsZD1mdW5jdGlvbihBLFMpe2lmKHRoaXMuX3BhcnRzLnVybilyZXR1cm4gQT09PXZvaWQgMD8iIjp0aGlzO2lmKHR5cGVvZiBBPT0iYm9vbGVhbiImJihTPUEsQT12b2lkIDApLEE9PT12b2lkIDApe2lmKCF0aGlzLl9wYXJ0cy5ob3N0bmFtZXx8dGhpcy5pcygiSVAiKSlyZXR1cm4iIjt2YXIgUD10aGlzLl9wYXJ0cy5ob3N0bmFtZS5sYXN0SW5kZXhPZigiLiIpLEI9dGhpcy5fcGFydHMuaG9zdG5hbWUuc3Vic3RyaW5nKFArMSk7cmV0dXJuIFMhPT0hMCYmbiYmbi5saXN0W0IudG9Mb3dlckNhc2UoKV0mJm4uZ2V0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKXx8Qn1lbHNle3ZhciBqO2lmKEEpaWYoQS5tYXRjaCgvW15hLXpBLVowLTktXS8pKWlmKG4mJm4uaXMoQSkpaj1uZXcgUmVnRXhwKGModGhpcy50bGQoKSkrIiQiKSx0aGlzLl9wYXJ0cy5ob3N0bmFtZT10aGlzLl9wYXJ0cy5ob3N0bmFtZS5yZXBsYWNlKGosQSk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCdUTEQgIicrQSsnIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOV0nKTtlbHNle2lmKCF0aGlzLl9wYXJ0cy5ob3N0bmFtZXx8dGhpcy5pcygiSVAiKSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoImNhbm5vdCBzZXQgVExEIG9uIG5vbi1kb21haW4gaG9zdCIpO2o9bmV3IFJlZ0V4cChjKHRoaXMudGxkKCkpKyIkIiksdGhpcy5fcGFydHMuaG9zdG5hbWU9dGhpcy5fcGFydHMuaG9zdG5hbWUucmVwbGFjZShqLEEpfWVsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcigiY2Fubm90IHNldCBUTEQgZW1wdHkiKTtyZXR1cm4gdGhpcy5idWlsZCghUyksdGhpc319LGYuZGlyZWN0b3J5PWZ1bmN0aW9uKEEsUyl7aWYodGhpcy5fcGFydHMudXJuKXJldHVybiBBPT09dm9pZCAwPyIiOnRoaXM7aWYoQT09PXZvaWQgMHx8QT09PSEwKXtpZighdGhpcy5fcGFydHMucGF0aCYmIXRoaXMuX3BhcnRzLmhvc3RuYW1lKXJldHVybiIiO2lmKHRoaXMuX3BhcnRzLnBhdGg9PT0iLyIpcmV0dXJuIi8iO3ZhciBQPXRoaXMuX3BhcnRzLnBhdGgubGVuZ3RoLXRoaXMuZmlsZW5hbWUoKS5sZW5ndGgtMSxCPXRoaXMuX3BhcnRzLnBhdGguc3Vic3RyaW5nKDAsUCl8fCh0aGlzLl9wYXJ0cy5ob3N0bmFtZT8iLyI6IiIpO3JldHVybiBBP2kuZGVjb2RlUGF0aChCKTpCfWVsc2V7dmFyIGo9dGhpcy5fcGFydHMucGF0aC5sZW5ndGgtdGhpcy5maWxlbmFtZSgpLmxlbmd0aCxIPXRoaXMuX3BhcnRzLnBhdGguc3Vic3RyaW5nKDAsaiksaz1uZXcgUmVnRXhwKCJeIitjKEgpKTtyZXR1cm4gdGhpcy5pcygicmVsYXRpdmUiKXx8KEF8fChBPSIvIiksQS5jaGFyQXQoMCkhPT0iLyImJihBPSIvIitBKSksQSYmQS5jaGFyQXQoQS5sZW5ndGgtMSkhPT0iLyImJihBKz0iLyIpLEE9aS5yZWNvZGVQYXRoKEEpLHRoaXMuX3BhcnRzLnBhdGg9dGhpcy5fcGFydHMucGF0aC5yZXBsYWNlKGssQSksdGhpcy5idWlsZCghUyksdGhpc319LGYuZmlsZW5hbWU9ZnVuY3Rpb24oQSxTKXtpZih0aGlzLl9wYXJ0cy51cm4pcmV0dXJuIEE9PT12b2lkIDA/IiI6dGhpcztpZih0eXBlb2YgQSE9InN0cmluZyIpe2lmKCF0aGlzLl9wYXJ0cy5wYXRofHx0aGlzLl9wYXJ0cy5wYXRoPT09Ii8iKXJldHVybiIiO3ZhciBQPXRoaXMuX3BhcnRzLnBhdGgubGFzdEluZGV4T2YoIi8iKSxCPXRoaXMuX3BhcnRzLnBhdGguc3Vic3RyaW5nKFArMSk7cmV0dXJuIEE/aS5kZWNvZGVQYXRoU2VnbWVudChCKTpCfWVsc2V7dmFyIGo9ITE7QS5jaGFyQXQoMCk9PT0iLyImJihBPUEuc3Vic3RyaW5nKDEpKSxBLm1hdGNoKC9cLj9cLy8pJiYoaj0hMCk7dmFyIEg9bmV3IFJlZ0V4cChjKHRoaXMuZmlsZW5hbWUoKSkrIiQiKTtyZXR1cm4gQT1pLnJlY29kZVBhdGgoQSksdGhpcy5fcGFydHMucGF0aD10aGlzLl9wYXJ0cy5wYXRoLnJlcGxhY2UoSCxBKSxqP3RoaXMubm9ybWFsaXplUGF0aChTKTp0aGlzLmJ1aWxkKCFTKSx0aGlzfX0sZi5zdWZmaXg9ZnVuY3Rpb24oQSxTKXtpZih0aGlzLl9wYXJ0cy51cm4pcmV0dXJuIEE9PT12b2lkIDA/IiI6dGhpcztpZihBPT09dm9pZCAwfHxBPT09ITApe2lmKCF0aGlzLl9wYXJ0cy5wYXRofHx0aGlzLl9wYXJ0cy5wYXRoPT09Ii8iKXJldHVybiIiO3ZhciBQPXRoaXMuZmlsZW5hbWUoKSxCPVAubGFzdEluZGV4T2YoIi4iKSxqLEg7cmV0dXJuIEI9PT0tMT8iIjooaj1QLnN1YnN0cmluZyhCKzEpLEg9L15bYS16MC05JV0rJC9pLnRlc3Qoaik/ajoiIixBP2kuZGVjb2RlUGF0aFNlZ21lbnQoSCk6SCl9ZWxzZXtBLmNoYXJBdCgwKT09PSIuIiYmKEE9QS5zdWJzdHJpbmcoMSkpO3ZhciBrPXRoaXMuc3VmZml4KCksSztpZihrKUE/Sz1uZXcgUmVnRXhwKGMoaykrIiQiKTpLPW5ldyBSZWdFeHAoYygiLiIraykrIiQiKTtlbHNle2lmKCFBKXJldHVybiB0aGlzO3RoaXMuX3BhcnRzLnBhdGgrPSIuIitpLnJlY29kZVBhdGgoQSl9cmV0dXJuIEsmJihBPWkucmVjb2RlUGF0aChBKSx0aGlzLl9wYXJ0cy5wYXRoPXRoaXMuX3BhcnRzLnBhdGgucmVwbGFjZShLLEEpKSx0aGlzLmJ1aWxkKCFTKSx0aGlzfX0sZi5zZWdtZW50PWZ1bmN0aW9uKEEsUyxQKXt2YXIgQj10aGlzLl9wYXJ0cy51cm4/IjoiOiIvIixqPXRoaXMucGF0aCgpLEg9ai5zdWJzdHJpbmcoMCwxKT09PSIvIixrPWouc3BsaXQoQik7aWYoQSE9PXZvaWQgMCYmdHlwZW9mIEEhPSJudW1iZXIiJiYoUD1TLFM9QSxBPXZvaWQgMCksQSE9PXZvaWQgMCYmdHlwZW9mIEEhPSJudW1iZXIiKXRocm93IG5ldyBFcnJvcignQmFkIHNlZ21lbnQgIicrQSsnIiwgbXVzdCBiZSAwLWJhc2VkIGludGVnZXInKTtpZihIJiZrLnNoaWZ0KCksQTwwJiYoQT1NYXRoLm1heChrLmxlbmd0aCtBLDApKSxTPT09dm9pZCAwKXJldHVybiBBPT09dm9pZCAwP2s6a1tBXTtpZihBPT09bnVsbHx8a1tBXT09PXZvaWQgMClpZihwKFMpKXtrPVtdO2Zvcih2YXIgSz0wLFg9Uy5sZW5ndGg7SzxYO0srKykhU1tLXS5sZW5ndGgmJighay5sZW5ndGh8fCFrW2subGVuZ3RoLTFdLmxlbmd0aCl8fChrLmxlbmd0aCYmIWtbay5sZW5ndGgtMV0ubGVuZ3RoJiZrLnBvcCgpLGsucHVzaChnKFNbS10pKSl9ZWxzZShTfHx0eXBlb2YgUz09InN0cmluZyIpJiYoUz1nKFMpLGtbay5sZW5ndGgtMV09PT0iIj9rW2subGVuZ3RoLTFdPVM6ay5wdXNoKFMpKTtlbHNlIFM/a1tBXT1nKFMpOmsuc3BsaWNlKEEsMSk7cmV0dXJuIEgmJmsudW5zaGlmdCgiIiksdGhpcy5wYXRoKGsuam9pbihCKSxQKX0sZi5zZWdtZW50Q29kZWQ9ZnVuY3Rpb24oQSxTLFApe3ZhciBCLGosSDtpZih0eXBlb2YgQSE9Im51bWJlciImJihQPVMsUz1BLEE9dm9pZCAwKSxTPT09dm9pZCAwKXtpZihCPXRoaXMuc2VnbWVudChBLFMsUCksIXAoQikpQj1CIT09dm9pZCAwP2kuZGVjb2RlKEIpOnZvaWQgMDtlbHNlIGZvcihqPTAsSD1CLmxlbmd0aDtqPEg7aisrKUJbal09aS5kZWNvZGUoQltqXSk7cmV0dXJuIEJ9aWYoIXAoUykpUz10eXBlb2YgUz09InN0cmluZyJ8fFMgaW5zdGFuY2VvZiBTdHJpbmc/aS5lbmNvZGUoUyk6UztlbHNlIGZvcihqPTAsSD1TLmxlbmd0aDtqPEg7aisrKVNbal09aS5lbmNvZGUoU1tqXSk7cmV0dXJuIHRoaXMuc2VnbWVudChBLFMsUCl9O3ZhciBVPWYucXVlcnk7cmV0dXJuIGYucXVlcnk9ZnVuY3Rpb24oQSxTKXtpZihBPT09ITApcmV0dXJuIGkucGFyc2VRdWVyeSh0aGlzLl9wYXJ0cy5xdWVyeSx0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtpZih0eXBlb2YgQT09ImZ1bmN0aW9uIil7dmFyIFA9aS5wYXJzZVF1ZXJ5KHRoaXMuX3BhcnRzLnF1ZXJ5LHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpLEI9QS5jYWxsKHRoaXMsUCk7cmV0dXJuIHRoaXMuX3BhcnRzLnF1ZXJ5PWkuYnVpbGRRdWVyeShCfHxQLHRoaXMuX3BhcnRzLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycyx0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKSx0aGlzLmJ1aWxkKCFTKSx0aGlzfWVsc2UgcmV0dXJuIEEhPT12b2lkIDAmJnR5cGVvZiBBIT0ic3RyaW5nIj8odGhpcy5fcGFydHMucXVlcnk9aS5idWlsZFF1ZXJ5KEEsdGhpcy5fcGFydHMuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzLHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpLHRoaXMuYnVpbGQoIVMpLHRoaXMpOlUuY2FsbCh0aGlzLEEsUyl9LGYuc2V0UXVlcnk9ZnVuY3Rpb24oQSxTLFApe3ZhciBCPWkucGFyc2VRdWVyeSh0aGlzLl9wYXJ0cy5xdWVyeSx0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtpZih0eXBlb2YgQT09InN0cmluZyJ8fEEgaW5zdGFuY2VvZiBTdHJpbmcpQltBXT1TIT09dm9pZCAwP1M6bnVsbDtlbHNlIGlmKHR5cGVvZiBBPT0ib2JqZWN0Iilmb3IodmFyIGogaW4gQSl1LmNhbGwoQSxqKSYmKEJbal09QVtqXSk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCJVUkkuYWRkUXVlcnkoKSBhY2NlcHRzIGFuIG9iamVjdCwgc3RyaW5nIGFzIHRoZSBuYW1lIHBhcmFtZXRlciIpO3JldHVybiB0aGlzLl9wYXJ0cy5xdWVyeT1pLmJ1aWxkUXVlcnkoQix0aGlzLl9wYXJ0cy5kdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnMsdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSksdHlwZW9mIEEhPSJzdHJpbmciJiYoUD1TKSx0aGlzLmJ1aWxkKCFQKSx0aGlzfSxmLmFkZFF1ZXJ5PWZ1bmN0aW9uKEEsUyxQKXt2YXIgQj1pLnBhcnNlUXVlcnkodGhpcy5fcGFydHMucXVlcnksdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSk7cmV0dXJuIGkuYWRkUXVlcnkoQixBLFM9PT12b2lkIDA/bnVsbDpTKSx0aGlzLl9wYXJ0cy5xdWVyeT1pLmJ1aWxkUXVlcnkoQix0aGlzLl9wYXJ0cy5kdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnMsdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSksdHlwZW9mIEEhPSJzdHJpbmciJiYoUD1TKSx0aGlzLmJ1aWxkKCFQKSx0aGlzfSxmLnJlbW92ZVF1ZXJ5PWZ1bmN0aW9uKEEsUyxQKXt2YXIgQj1pLnBhcnNlUXVlcnkodGhpcy5fcGFydHMucXVlcnksdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSk7cmV0dXJuIGkucmVtb3ZlUXVlcnkoQixBLFMpLHRoaXMuX3BhcnRzLnF1ZXJ5PWkuYnVpbGRRdWVyeShCLHRoaXMuX3BhcnRzLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycyx0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKSx0eXBlb2YgQSE9InN0cmluZyImJihQPVMpLHRoaXMuYnVpbGQoIVApLHRoaXN9LGYuaGFzUXVlcnk9ZnVuY3Rpb24oQSxTLFApe3ZhciBCPWkucGFyc2VRdWVyeSh0aGlzLl9wYXJ0cy5xdWVyeSx0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtyZXR1cm4gaS5oYXNRdWVyeShCLEEsUyxQKX0sZi5zZXRTZWFyY2g9Zi5zZXRRdWVyeSxmLmFkZFNlYXJjaD1mLmFkZFF1ZXJ5LGYucmVtb3ZlU2VhcmNoPWYucmVtb3ZlUXVlcnksZi5oYXNTZWFyY2g9Zi5oYXNRdWVyeSxmLm5vcm1hbGl6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYXJ0cy51cm4/dGhpcy5ub3JtYWxpemVQcm90b2NvbCghMSkubm9ybWFsaXplUGF0aCghMSkubm9ybWFsaXplUXVlcnkoITEpLm5vcm1hbGl6ZUZyYWdtZW50KCExKS5idWlsZCgpOnRoaXMubm9ybWFsaXplUHJvdG9jb2woITEpLm5vcm1hbGl6ZUhvc3RuYW1lKCExKS5ub3JtYWxpemVQb3J0KCExKS5ub3JtYWxpemVQYXRoKCExKS5ub3JtYWxpemVRdWVyeSghMSkubm9ybWFsaXplRnJhZ21lbnQoITEpLmJ1aWxkKCl9LGYubm9ybWFsaXplUHJvdG9jb2w9ZnVuY3Rpb24oQSl7cmV0dXJuIHR5cGVvZiB0aGlzLl9wYXJ0cy5wcm90b2NvbD09InN0cmluZyImJih0aGlzLl9wYXJ0cy5wcm90b2NvbD10aGlzLl9wYXJ0cy5wcm90b2NvbC50b0xvd2VyQ2FzZSgpLHRoaXMuYnVpbGQoIUEpKSx0aGlzfSxmLm5vcm1hbGl6ZUhvc3RuYW1lPWZ1bmN0aW9uKEEpe3JldHVybiB0aGlzLl9wYXJ0cy5ob3N0bmFtZSYmKHRoaXMuaXMoIklETiIpJiZ0P3RoaXMuX3BhcnRzLmhvc3RuYW1lPXQudG9BU0NJSSh0aGlzLl9wYXJ0cy5ob3N0bmFtZSk6dGhpcy5pcygiSVB2NiIpJiZlJiYodGhpcy5fcGFydHMuaG9zdG5hbWU9ZS5iZXN0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKSksdGhpcy5fcGFydHMuaG9zdG5hbWU9dGhpcy5fcGFydHMuaG9zdG5hbWUudG9Mb3dlckNhc2UoKSx0aGlzLmJ1aWxkKCFBKSksdGhpc30sZi5ub3JtYWxpemVQb3J0PWZ1bmN0aW9uKEEpe3JldHVybiB0eXBlb2YgdGhpcy5fcGFydHMucHJvdG9jb2w9PSJzdHJpbmciJiZ0aGlzLl9wYXJ0cy5wb3J0PT09aS5kZWZhdWx0UG9ydHNbdGhpcy5fcGFydHMucHJvdG9jb2xdJiYodGhpcy5fcGFydHMucG9ydD1udWxsLHRoaXMuYnVpbGQoIUEpKSx0aGlzfSxmLm5vcm1hbGl6ZVBhdGg9ZnVuY3Rpb24oQSl7dmFyIFM9dGhpcy5fcGFydHMucGF0aDtpZighUylyZXR1cm4gdGhpcztpZih0aGlzLl9wYXJ0cy51cm4pcmV0dXJuIHRoaXMuX3BhcnRzLnBhdGg9aS5yZWNvZGVVcm5QYXRoKHRoaXMuX3BhcnRzLnBhdGgpLHRoaXMuYnVpbGQoIUEpLHRoaXM7aWYodGhpcy5fcGFydHMucGF0aD09PSIvIilyZXR1cm4gdGhpcztTPWkucmVjb2RlUGF0aChTKTt2YXIgUCxCPSIiLGosSDtmb3IoUy5jaGFyQXQoMCkhPT0iLyImJihQPSEwLFM9Ii8iK1MpLChTLnNsaWNlKC0zKT09PSIvLi4ifHxTLnNsaWNlKC0yKT09PSIvLiIpJiYoUys9Ii8iKSxTPVMucmVwbGFjZSgvKFwvKFwuXC8pKyl8KFwvXC4kKS9nLCIvIikucmVwbGFjZSgvXC97Mix9L2csIi8iKSxQJiYoQj1TLnN1YnN0cmluZygxKS5tYXRjaCgvXihcLlwuXC8pKy8pfHwiIixCJiYoQj1CWzBdKSk7aj1TLnNlYXJjaCgvXC9cLlwuKFwvfCQpLyksaiE9PS0xOyl7aWYoaj09PTApe1M9Uy5zdWJzdHJpbmcoMyk7Y29udGludWV9SD1TLnN1YnN0cmluZygwLGopLmxhc3RJbmRleE9mKCIvIiksSD09PS0xJiYoSD1qKSxTPVMuc3Vic3RyaW5nKDAsSCkrUy5zdWJzdHJpbmcoaiszKX1yZXR1cm4gUCYmdGhpcy5pcygicmVsYXRpdmUiKSYmKFM9QitTLnN1YnN0cmluZygxKSksdGhpcy5fcGFydHMucGF0aD1TLHRoaXMuYnVpbGQoIUEpLHRoaXN9LGYubm9ybWFsaXplUGF0aG5hbWU9Zi5ub3JtYWxpemVQYXRoLGYubm9ybWFsaXplUXVlcnk9ZnVuY3Rpb24oQSl7cmV0dXJuIHR5cGVvZiB0aGlzLl9wYXJ0cy5xdWVyeT09InN0cmluZyImJih0aGlzLl9wYXJ0cy5xdWVyeS5sZW5ndGg/dGhpcy5xdWVyeShpLnBhcnNlUXVlcnkodGhpcy5fcGFydHMucXVlcnksdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSkpOnRoaXMuX3BhcnRzLnF1ZXJ5PW51bGwsdGhpcy5idWlsZCghQSkpLHRoaXN9LGYubm9ybWFsaXplRnJhZ21lbnQ9ZnVuY3Rpb24oQSl7cmV0dXJuIHRoaXMuX3BhcnRzLmZyYWdtZW50fHwodGhpcy5fcGFydHMuZnJhZ21lbnQ9bnVsbCx0aGlzLmJ1aWxkKCFBKSksdGhpc30sZi5ub3JtYWxpemVTZWFyY2g9Zi5ub3JtYWxpemVRdWVyeSxmLm5vcm1hbGl6ZUhhc2g9Zi5ub3JtYWxpemVGcmFnbWVudCxmLmlzbzg4NTk9ZnVuY3Rpb24oKXt2YXIgQT1pLmVuY29kZSxTPWkuZGVjb2RlO2kuZW5jb2RlPWVzY2FwZSxpLmRlY29kZT1kZWNvZGVVUklDb21wb25lbnQ7dHJ5e3RoaXMubm9ybWFsaXplKCl9ZmluYWxseXtpLmVuY29kZT1BLGkuZGVjb2RlPVN9cmV0dXJuIHRoaXN9LGYudW5pY29kZT1mdW5jdGlvbigpe3ZhciBBPWkuZW5jb2RlLFM9aS5kZWNvZGU7aS5lbmNvZGU9dyxpLmRlY29kZT11bmVzY2FwZTt0cnl7dGhpcy5ub3JtYWxpemUoKX1maW5hbGx5e2kuZW5jb2RlPUEsaS5kZWNvZGU9U31yZXR1cm4gdGhpc30sZi5yZWFkYWJsZT1mdW5jdGlvbigpe3ZhciBBPXRoaXMuY2xvbmUoKTtBLnVzZXJuYW1lKCIiKS5wYXNzd29yZCgiIikubm9ybWFsaXplKCk7dmFyIFM9IiI7aWYoQS5fcGFydHMucHJvdG9jb2wmJihTKz1BLl9wYXJ0cy5wcm90b2NvbCsiOi8vIiksQS5fcGFydHMuaG9zdG5hbWUmJihBLmlzKCJwdW55Y29kZSIpJiZ0PyhTKz10LnRvVW5pY29kZShBLl9wYXJ0cy5ob3N0bmFtZSksQS5fcGFydHMucG9ydCYmKFMrPSI6IitBLl9wYXJ0cy5wb3J0KSk6Uys9QS5ob3N0KCkpLEEuX3BhcnRzLmhvc3RuYW1lJiZBLl9wYXJ0cy5wYXRoJiZBLl9wYXJ0cy5wYXRoLmNoYXJBdCgwKSE9PSIvIiYmKFMrPSIvIiksUys9QS5wYXRoKCEwKSxBLl9wYXJ0cy5xdWVyeSl7Zm9yKHZhciBQPSIiLEI9MCxqPUEuX3BhcnRzLnF1ZXJ5LnNwbGl0KCImIiksSD1qLmxlbmd0aDtCPEg7QisrKXt2YXIgaz0oaltCXXx8IiIpLnNwbGl0KCI9Iik7UCs9IiYiK2kuZGVjb2RlUXVlcnkoa1swXSx0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKS5yZXBsYWNlKC8mL2csIiUyNiIpLGtbMV0hPT12b2lkIDAmJihQKz0iPSIraS5kZWNvZGVRdWVyeShrWzFdLHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpLnJlcGxhY2UoLyYvZywiJTI2IikpfVMrPSI/IitQLnN1YnN0cmluZygxKX1yZXR1cm4gUys9aS5kZWNvZGVRdWVyeShBLmhhc2goKSwhMCksU30sZi5hYnNvbHV0ZVRvPWZ1bmN0aW9uKEEpe3ZhciBTPXRoaXMuY2xvbmUoKSxQPVsicHJvdG9jb2wiLCJ1c2VybmFtZSIsInBhc3N3b3JkIiwiaG9zdG5hbWUiLCJwb3J0Il0sQixqLEg7aWYodGhpcy5fcGFydHMudXJuKXRocm93IG5ldyBFcnJvcigiVVJOcyBkbyBub3QgaGF2ZSBhbnkgZ2VuZXJhbGx5IGRlZmluZWQgaGllcmFyY2hpY2FsIGNvbXBvbmVudHMiKTtpZihBIGluc3RhbmNlb2YgaXx8KEE9bmV3IGkoQSkpLFMuX3BhcnRzLnByb3RvY29sfHwoUy5fcGFydHMucHJvdG9jb2w9QS5fcGFydHMucHJvdG9jb2wsdGhpcy5fcGFydHMuaG9zdG5hbWUpKXJldHVybiBTO2ZvcihqPTA7SD1QW2pdO2orKylTLl9wYXJ0c1tIXT1BLl9wYXJ0c1tIXTtyZXR1cm4gUy5fcGFydHMucGF0aD8oUy5fcGFydHMucGF0aC5zdWJzdHJpbmcoLTIpPT09Ii4uIiYmKFMuX3BhcnRzLnBhdGgrPSIvIiksUy5wYXRoKCkuY2hhckF0KDApIT09Ii8iJiYoQj1BLmRpcmVjdG9yeSgpLEI9Qnx8KEEucGF0aCgpLmluZGV4T2YoIi8iKT09PTA/Ii8iOiIiKSxTLl9wYXJ0cy5wYXRoPShCP0IrIi8iOiIiKStTLl9wYXJ0cy5wYXRoLFMubm9ybWFsaXplUGF0aCgpKSk6KFMuX3BhcnRzLnBhdGg9QS5fcGFydHMucGF0aCxTLl9wYXJ0cy5xdWVyeXx8KFMuX3BhcnRzLnF1ZXJ5PUEuX3BhcnRzLnF1ZXJ5KSksUy5idWlsZCgpLFN9LGYucmVsYXRpdmVUbz1mdW5jdGlvbihBKXt2YXIgUz10aGlzLmNsb25lKCkubm9ybWFsaXplKCksUCxCLGosSCxrO2lmKFMuX3BhcnRzLnVybil0aHJvdyBuZXcgRXJyb3IoIlVSTnMgZG8gbm90IGhhdmUgYW55IGdlbmVyYWxseSBkZWZpbmVkIGhpZXJhcmNoaWNhbCBjb21wb25lbnRzIik7aWYoQT1uZXcgaShBKS5ub3JtYWxpemUoKSxQPVMuX3BhcnRzLEI9QS5fcGFydHMsSD1TLnBhdGgoKSxrPUEucGF0aCgpLEguY2hhckF0KDApIT09Ii8iKXRocm93IG5ldyBFcnJvcigiVVJJIGlzIGFscmVhZHkgcmVsYXRpdmUiKTtpZihrLmNoYXJBdCgwKSE9PSIvIil0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjYWxjdWxhdGUgYSBVUkkgcmVsYXRpdmUgdG8gYW5vdGhlciByZWxhdGl2ZSBVUkkiKTtpZihQLnByb3RvY29sPT09Qi5wcm90b2NvbCYmKFAucHJvdG9jb2w9bnVsbCksUC51c2VybmFtZSE9PUIudXNlcm5hbWV8fFAucGFzc3dvcmQhPT1CLnBhc3N3b3JkfHxQLnByb3RvY29sIT09bnVsbHx8UC51c2VybmFtZSE9PW51bGx8fFAucGFzc3dvcmQhPT1udWxsKXJldHVybiBTLmJ1aWxkKCk7aWYoUC5ob3N0bmFtZT09PUIuaG9zdG5hbWUmJlAucG9ydD09PUIucG9ydClQLmhvc3RuYW1lPW51bGwsUC5wb3J0PW51bGw7ZWxzZSByZXR1cm4gUy5idWlsZCgpO2lmKEg9PT1rKXJldHVybiBQLnBhdGg9IiIsUy5idWlsZCgpO2lmKGo9aS5jb21tb25QYXRoKEgsayksIWopcmV0dXJuIFMuYnVpbGQoKTt2YXIgSz1CLnBhdGguc3Vic3RyaW5nKGoubGVuZ3RoKS5yZXBsYWNlKC9bXlwvXSokLywiIikucmVwbGFjZSgvLio/XC8vZywiLi4vIik7cmV0dXJuIFAucGF0aD1LK1AucGF0aC5zdWJzdHJpbmcoai5sZW5ndGgpfHwiLi8iLFMuYnVpbGQoKX0sZi5lcXVhbHM9ZnVuY3Rpb24oQSl7dmFyIFM9dGhpcy5jbG9uZSgpLFA9bmV3IGkoQSksQj17fSxqPXt9LEg9e30sayxLLFg7aWYoUy5ub3JtYWxpemUoKSxQLm5vcm1hbGl6ZSgpLFMudG9TdHJpbmcoKT09PVAudG9TdHJpbmcoKSlyZXR1cm4hMDtpZihrPVMucXVlcnkoKSxLPVAucXVlcnkoKSxTLnF1ZXJ5KCIiKSxQLnF1ZXJ5KCIiKSxTLnRvU3RyaW5nKCkhPT1QLnRvU3RyaW5nKCl8fGsubGVuZ3RoIT09Sy5sZW5ndGgpcmV0dXJuITE7Qj1pLnBhcnNlUXVlcnkoayx0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKSxqPWkucGFyc2VRdWVyeShLLHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO2ZvcihYIGluIEIpaWYodS5jYWxsKEIsWCkpe2lmKHAoQltYXSkpe2lmKCFfKEJbWF0saltYXSkpcmV0dXJuITF9ZWxzZSBpZihCW1hdIT09altYXSlyZXR1cm4hMTtIW1hdPSEwfWZvcihYIGluIGopaWYodS5jYWxsKGosWCkmJiFIW1hdKXJldHVybiExO3JldHVybiEwfSxmLnByZXZlbnRJbnZhbGlkSG9zdG5hbWU9ZnVuY3Rpb24oQSl7cmV0dXJuIHRoaXMuX3BhcnRzLnByZXZlbnRJbnZhbGlkSG9zdG5hbWU9ISFBLHRoaXN9LGYuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzPWZ1bmN0aW9uKEEpe3JldHVybiB0aGlzLl9wYXJ0cy5kdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnM9ISFBLHRoaXN9LGYuZXNjYXBlUXVlcnlTcGFjZT1mdW5jdGlvbihBKXtyZXR1cm4gdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZT0hIUEsdGhpc30saX0pfSk7ZnVuY3Rpb24gbngodCl7cmV0dXJuKHQubGVuZ3RoPT09MHx8dFt0Lmxlbmd0aC0xXSE9PSIvIikmJih0PWAke3R9L2ApLHR9dmFyIFYxLGsxPVooKCk9PntWMT1ueH0pO2Z1bmN0aW9uIEcxKHQsZSl7aWYodD09PW51bGx8fHR5cGVvZiB0IT0ib2JqZWN0IilyZXR1cm4gdDtlPXgoZSwhMSk7bGV0IG49bmV3IHQuY29uc3RydWN0b3I7Zm9yKGxldCBvIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShvKSl7bGV0IHI9dFtvXTtlJiYocj1HMShyLGUpKSxuW29dPXJ9cmV0dXJuIG59dmFyIFljLHoxPVooKCk9PntJdCgpO1ljPUcxfSk7ZnVuY3Rpb24gajEodCxlLG4pe249eChuLCExKTtsZXQgbz17fSxyPWgodCksaT1oKGUpLHMsZix1O2lmKHIpZm9yKHMgaW4gdCl0Lmhhc093blByb3BlcnR5KHMpJiYoZj10W3NdLGkmJm4mJnR5cGVvZiBmPT0ib2JqZWN0IiYmZS5oYXNPd25Qcm9wZXJ0eShzKT8odT1lW3NdLHR5cGVvZiB1PT0ib2JqZWN0Ij9vW3NdPWoxKGYsdSxuKTpvW3NdPWYpOm9bc109Zik7aWYoaSlmb3IocyBpbiBlKWUuaGFzT3duUHJvcGVydHkocykmJiFvLmhhc093blByb3BlcnR5KHMpJiYodT1lW3NdLG9bc109dSk7cmV0dXJuIG99dmFyIF9yLG5wPVooKCk9PntJdCgpO2Z0KCk7X3I9ajF9KTtmdW5jdGlvbiBveCgpe2xldCB0LGUsbj1uZXcgUHJvbWlzZShmdW5jdGlvbihvLHIpe3Q9byxlPXJ9KTtyZXR1cm57cmVzb2x2ZTp0LHJlamVjdDplLHByb21pc2U6bn19dmFyIGpzLERtPVooKCk9Pntqcz1veH0pO2Z1bmN0aW9uIEZtKHQsZSl7bGV0IG47cmV0dXJuIHR5cGVvZiBkb2N1bWVudDwidSImJihuPWRvY3VtZW50KSxGbS5faW1wbGVtZW50YXRpb24odCxlLG4pfXZhciBIMSxmZixCbT1aKCgpPT57SDE9cnIoenMoKSwxKTtJdCgpO2Z0KCk7SHQoKTtGbS5faW1wbGVtZW50YXRpb249ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBGKCJyZWxhdGl2ZSB1cmkgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpe2lmKHR5cGVvZiBuPiJ1IilyZXR1cm4gdDtlPXgobi5iYXNlVVJJLG4ubG9jYXRpb24uaHJlZil9bGV0IG89bmV3IEgxLmRlZmF1bHQodCk7cmV0dXJuIG8uc2NoZW1lKCkhPT0iIj9vLnRvU3RyaW5nKCk6by5hYnNvbHV0ZVRvKGUpLnRvU3RyaW5nKCl9O2ZmPUZtfSk7ZnVuY3Rpb24gcngodCxlKXtpZighaCh0KSl0aHJvdyBuZXcgRigidXJpIGlzIHJlcXVpcmVkLiIpO2xldCBuPSIiLG89dC5sYXN0SW5kZXhPZigiLyIpO3JldHVybiBvIT09LTEmJihuPXQuc3Vic3RyaW5nKDAsbysxKSksZSYmKHQ9bmV3IHExLmRlZmF1bHQodCksdC5xdWVyeSgpLmxlbmd0aCE9PTAmJihuKz1gPyR7dC5xdWVyeSgpfWApLHQuZnJhZ21lbnQoKS5sZW5ndGghPT0wJiYobis9YCMke3QuZnJhZ21lbnQoKX1gKSksbn12YXIgcTEsSzEsVzE9WigoKT0+e3ExPXJyKHpzKCksMSk7ZnQoKTtIdCgpO0sxPXJ4fSk7ZnVuY3Rpb24gaXgodCl7aWYoIWgodCkpdGhyb3cgbmV3IEYoInVyaSBpcyByZXF1aXJlZC4iKTtsZXQgZT1uZXcgWDEuZGVmYXVsdCh0KTtlLm5vcm1hbGl6ZSgpO2xldCBuPWUucGF0aCgpLG89bi5sYXN0SW5kZXhPZigiLyIpO3JldHVybiBvIT09LTEmJihuPW4uc3Vic3RyKG8rMSkpLG89bi5sYXN0SW5kZXhPZigiLiIpLG89PT0tMT9uPSIiOm49bi5zdWJzdHIobysxKSxufXZhciBYMSxZMSwkMT1aKCgpPT57WDE9cnIoenMoKSwxKTtmdCgpO0h0KCk7WTE9aXh9KTtmdW5jdGlvbiBzeCh0LGUsbil7aChlKXx8KGU9dC53aWR0aCksaChuKXx8KG49dC5oZWlnaHQpO2xldCBvPVoxW2VdO2gobyl8fChvPXt9LFoxW2VdPW8pO2xldCByPW9bbl07aWYoIWgocikpe2xldCBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO2kud2lkdGg9ZSxpLmhlaWdodD1uLHI9aS5nZXRDb250ZXh0KCIyZCIse3dpbGxSZWFkRnJlcXVlbnRseTohMH0pLHIuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJjb3B5IixvW25dPXJ9cmV0dXJuIHIuZHJhd0ltYWdlKHQsMCwwLGUsbiksci5nZXRJbWFnZURhdGEoMCwwLGUsbikuZGF0YX12YXIgWjEsVW0sUTE9WigoKT0+e2Z0KCk7WjE9e307VW09c3h9KTtmdW5jdGlvbiBheCh0KXtyZXR1cm4geS50eXBlT2Yuc3RyaW5nKCJ1cmkiLHQpLGN4LnRlc3QodCl9dmFyIGN4LG9wLFZtPVooKCk9PntYdCgpO2N4PS9eYmxvYjovaTtvcD1heH0pO2Z1bmN0aW9uIGZ4KHQpe2godGkpfHwodGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpKSx0aS5ocmVmPXdpbmRvdy5sb2NhdGlvbi5ocmVmO2xldCBlPXRpLmhvc3Qsbj10aS5wcm90b2NvbDtyZXR1cm4gdGkuaHJlZj10LHRpLmhyZWY9dGkuaHJlZixuIT09dGkucHJvdG9jb2x8fGUhPT10aS5ob3N0fXZhciB0aSxKMSx0QT1aKCgpPT57ZnQoKTtKMT1meH0pO2Z1bmN0aW9uIGx4KHQpe3JldHVybiB5LnR5cGVPZi5zdHJpbmcoInVyaSIsdCksdXgudGVzdCh0KX12YXIgdXgscnAsa209WigoKT0+e1h0KCk7dXg9L15kYXRhOi9pO3JwPWx4fSk7ZnVuY3Rpb24gcHgodCl7bGV0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7cmV0dXJuIGUuYXN5bmM9ITAsZS5zcmM9dCxuZXcgUHJvbWlzZSgobixvKT0+e3dpbmRvdy5jcm9zc09yaWdpbklzb2xhdGVkJiZlLnNldEF0dHJpYnV0ZSgiY3Jvc3NvcmlnaW4iLCJhbm9ueW1vdXMiKTtsZXQgcj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdO2Uub25sb2FkPWZ1bmN0aW9uKCl7ZS5vbmxvYWQ9dm9pZCAwLHIucmVtb3ZlQ2hpbGQoZSksbigpfSxlLm9uZXJyb3I9ZnVuY3Rpb24oaSl7byhpKX0sci5hcHBlbmRDaGlsZChlKX0pfXZhciBlQSxuQT1aKCgpPT57ZUE9cHh9KTtmdW5jdGlvbiBkeCh0KXtpZighaCh0KSl0aHJvdyBuZXcgRigib2JqIGlzIHJlcXVpcmVkLiIpO2xldCBlPSIiO2ZvcihsZXQgbiBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkobikpe2xldCBvPXRbbl0scj1gJHtlbmNvZGVVUklDb21wb25lbnQobil9PWA7aWYoQXJyYXkuaXNBcnJheShvKSlmb3IobGV0IGk9MCxzPW8ubGVuZ3RoO2k8czsrK2kpZSs9YCR7citlbmNvZGVVUklDb21wb25lbnQob1tpXSl9JmA7ZWxzZSBlKz1gJHtyK2VuY29kZVVSSUNvbXBvbmVudChvKX0mYH1yZXR1cm4gZT1lLnNsaWNlKDAsLTEpLGV9dmFyIG9BLHJBPVooKCk9PntmdCgpO0h0KCk7b0E9ZHh9KTtmdW5jdGlvbiBteCh0KXtpZighaCh0KSl0aHJvdyBuZXcgRigicXVlcnlTdHJpbmcgaXMgcmVxdWlyZWQuIik7bGV0IGU9e307aWYodD09PSIiKXJldHVybiBlO2xldCBuPXQucmVwbGFjZSgvXCsvZywiJTIwIikuc3BsaXQoL1smO10vKTtmb3IobGV0IG89MCxyPW4ubGVuZ3RoO288cjsrK28pe2xldCBpPW5bb10uc3BsaXQoIj0iKSxzPWRlY29kZVVSSUNvbXBvbmVudChpWzBdKSxmPWlbMV07aChmKT9mPWRlY29kZVVSSUNvbXBvbmVudChmKTpmPSIiO2xldCB1PWVbc107dHlwZW9mIHU9PSJzdHJpbmciP2Vbc109W3UsZl06QXJyYXkuaXNBcnJheSh1KT91LnB1c2goZik6ZVtzXT1mfXJldHVybiBlfXZhciBpQSxzQT1aKCgpPT57ZnQoKTtIdCgpO2lBPW14fSk7dmFyIGh4LFNuLGlwPVooKCk9PntoeD17VU5JU1NVRUQ6MCxJU1NVRUQ6MSxBQ1RJVkU6MixSRUNFSVZFRDozLENBTkNFTExFRDo0LEZBSUxFRDo1fSxTbj1PYmplY3QuZnJlZXplKGh4KX0pO3ZhciBfeCxjQSxhQT1aKCgpPT57X3g9e1RFUlJBSU46MCxJTUFHRVJZOjEsVElMRVMzRDoyLE9USEVSOjN9LGNBPU9iamVjdC5mcmVlemUoX3gpfSk7ZnVuY3Rpb24gc3AodCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXgodC50aHJvdHRsZUJ5U2VydmVyLCExKSxuPXgodC50aHJvdHRsZSwhMSk7dGhpcy51cmw9dC51cmwsdGhpcy5yZXF1ZXN0RnVuY3Rpb249dC5yZXF1ZXN0RnVuY3Rpb24sdGhpcy5jYW5jZWxGdW5jdGlvbj10LmNhbmNlbEZ1bmN0aW9uLHRoaXMucHJpb3JpdHlGdW5jdGlvbj10LnByaW9yaXR5RnVuY3Rpb24sdGhpcy5wcmlvcml0eT14KHQucHJpb3JpdHksMCksdGhpcy50aHJvdHRsZT1uLHRoaXMudGhyb3R0bGVCeVNlcnZlcj1lLHRoaXMudHlwZT14KHQudHlwZSxjQS5PVEhFUiksdGhpcy5zZXJ2ZXJLZXk9dC5zZXJ2ZXJLZXksdGhpcy5zdGF0ZT1Tbi5VTklTU1VFRCx0aGlzLmRlZmVycmVkPXZvaWQgMCx0aGlzLmNhbmNlbGxlZD0hMX12YXIgZkEsdUE9WigoKT0+e0l0KCk7ZnQoKTtpcCgpO2FBKCk7c3AucHJvdG90eXBlLmNhbmNlbD1mdW5jdGlvbigpe3RoaXMuY2FuY2VsbGVkPSEwfTtzcC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIGgodCk/KHQudXJsPXRoaXMudXJsLHQucmVxdWVzdEZ1bmN0aW9uPXRoaXMucmVxdWVzdEZ1bmN0aW9uLHQuY2FuY2VsRnVuY3Rpb249dGhpcy5jYW5jZWxGdW5jdGlvbix0LnByaW9yaXR5RnVuY3Rpb249dGhpcy5wcmlvcml0eUZ1bmN0aW9uLHQucHJpb3JpdHk9dGhpcy5wcmlvcml0eSx0LnRocm90dGxlPXRoaXMudGhyb3R0bGUsdC50aHJvdHRsZUJ5U2VydmVyPXRoaXMudGhyb3R0bGVCeVNlcnZlcix0LnR5cGU9dGhpcy50eXBlLHQuc2VydmVyS2V5PXRoaXMuc2VydmVyS2V5LHQuc3RhdGU9U24uVU5JU1NVRUQsdC5kZWZlcnJlZD12b2lkIDAsdC5jYW5jZWxsZWQ9ITEsdCk6bmV3IHNwKHRoaXMpfTtmQT1zcH0pO2Z1bmN0aW9uIHl4KHQpe2xldCBlPXt9O2lmKCF0KXJldHVybiBlO2xldCBuPXQuc3BsaXQoYFxyCmApO2ZvcihsZXQgbz0wO288bi5sZW5ndGg7KytvKXtsZXQgcj1uW29dLGk9ci5pbmRleE9mKCI6ICIpO2lmKGk+MCl7bGV0IHM9ci5zdWJzdHJpbmcoMCxpKSxmPXIuc3Vic3RyaW5nKGkrMik7ZVtzXT1mfX1yZXR1cm4gZX12YXIgbEEscEE9WigoKT0+e2xBPXl4fSk7ZnVuY3Rpb24gZEEodCxlLG4pe3RoaXMuc3RhdHVzQ29kZT10LHRoaXMucmVzcG9uc2U9ZSx0aGlzLnJlc3BvbnNlSGVhZGVycz1uLHR5cGVvZiB0aGlzLnJlc3BvbnNlSGVhZGVycz09InN0cmluZyImJih0aGlzLnJlc3BvbnNlSGVhZGVycz1sQSh0aGlzLnJlc3BvbnNlSGVhZGVycykpfXZhciB1ZixtQT1aKCgpPT57ZnQoKTtwQSgpO2RBLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2xldCB0PSJSZXF1ZXN0IGhhcyBmYWlsZWQuIjtyZXR1cm4gaCh0aGlzLnN0YXR1c0NvZGUpJiYodCs9YCBTdGF0dXMgQ29kZTogJHt0aGlzLnN0YXR1c0NvZGV9YCksdH07dWY9ZEF9KTtmdW5jdGlvbiBsZigpe3RoaXMuX2xpc3RlbmVycz1bXSx0aGlzLl9zY29wZXM9W10sdGhpcy5fdG9SZW1vdmU9W10sdGhpcy5faW5zaWRlUmFpc2VFdmVudD0hMX1mdW5jdGlvbiBneCh0LGUpe3JldHVybiBlLXR9dmFyIGhBLF9BPVooKCk9PntYdCgpO2Z0KCk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobGYucHJvdG90eXBlLHtudW1iZXJPZkxpc3RlbmVyczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xpc3RlbmVycy5sZW5ndGgtdGhpcy5fdG9SZW1vdmUubGVuZ3RofX19KTtsZi5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3kudHlwZU9mLmZ1bmMoImxpc3RlbmVyIix0KSx0aGlzLl9saXN0ZW5lcnMucHVzaCh0KSx0aGlzLl9zY29wZXMucHVzaChlKTtsZXQgbj10aGlzO3JldHVybiBmdW5jdGlvbigpe24ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LGUpfX07bGYucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5mdW5jKCJsaXN0ZW5lciIsdCk7bGV0IG49dGhpcy5fbGlzdGVuZXJzLG89dGhpcy5fc2NvcGVzLHI9LTE7Zm9yKGxldCBpPTA7aTxuLmxlbmd0aDtpKyspaWYobltpXT09PXQmJm9baV09PT1lKXtyPWk7YnJlYWt9cmV0dXJuIHIhPT0tMT8odGhpcy5faW5zaWRlUmFpc2VFdmVudD8odGhpcy5fdG9SZW1vdmUucHVzaChyKSxuW3JdPXZvaWQgMCxvW3JdPXZvaWQgMCk6KG4uc3BsaWNlKHIsMSksby5zcGxpY2UociwxKSksITApOiExfTtsZi5wcm90b3R5cGUucmFpc2VFdmVudD1mdW5jdGlvbigpe3RoaXMuX2luc2lkZVJhaXNlRXZlbnQ9ITA7bGV0IHQsZT10aGlzLl9saXN0ZW5lcnMsbj10aGlzLl9zY29wZXMsbz1lLmxlbmd0aDtmb3IodD0wO3Q8bzt0Kyspe2xldCBpPWVbdF07aChpKSYmZVt0XS5hcHBseShuW3RdLGFyZ3VtZW50cyl9bGV0IHI9dGhpcy5fdG9SZW1vdmU7aWYobz1yLmxlbmd0aCxvPjApe2ZvcihyLnNvcnQoZ3gpLHQ9MDt0PG87dCsrKXtsZXQgaT1yW3RdO2Uuc3BsaWNlKGksMSksbi5zcGxpY2UoaSwxKX1yLmxlbmd0aD0wfXRoaXMuX2luc2lkZVJhaXNlRXZlbnQ9ITF9O2hBPWxmfSk7ZnVuY3Rpb24gSHModCl7eS50eXBlT2Yub2JqZWN0KCJvcHRpb25zIix0KSx5LmRlZmluZWQoIm9wdGlvbnMuY29tcGFyYXRvciIsdC5jb21wYXJhdG9yKSx0aGlzLl9jb21wYXJhdG9yPXQuY29tcGFyYXRvcix0aGlzLl9hcnJheT1bXSx0aGlzLl9sZW5ndGg9MCx0aGlzLl9tYXhpbXVtTGVuZ3RoPXZvaWQgMH1mdW5jdGlvbiBHbSh0LGUsbil7bGV0IG89dFtlXTt0W2VdPXRbbl0sdFtuXT1vfXZhciB5QSxnQT1aKCgpPT57WHQoKTtJdCgpO2Z0KCk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoSHMucHJvdG90eXBlLHtsZW5ndGg6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sZW5ndGh9fSxpbnRlcm5hbEFycmF5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXJyYXl9fSxtYXhpbXVtTGVuZ3RoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4aW11bUxlbmd0aH0sc2V0OmZ1bmN0aW9uKHQpe3kudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJtYXhpbXVtTGVuZ3RoIix0LDApO2xldCBlPXRoaXMuX2xlbmd0aDtpZih0PGUpe2xldCBuPXRoaXMuX2FycmF5O2ZvcihsZXQgbz10O288ZTsrK28pbltvXT12b2lkIDA7dGhpcy5fbGVuZ3RoPXQsbi5sZW5ndGg9dH10aGlzLl9tYXhpbXVtTGVuZ3RoPXR9fSxjb21wYXJhdG9yOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29tcGFyYXRvcn19fSk7SHMucHJvdG90eXBlLnJlc2VydmU9ZnVuY3Rpb24odCl7dD14KHQsdGhpcy5fbGVuZ3RoKSx0aGlzLl9hcnJheS5sZW5ndGg9dH07SHMucHJvdG90eXBlLmhlYXBpZnk9ZnVuY3Rpb24odCl7dD14KHQsMCk7bGV0IGU9dGhpcy5fbGVuZ3RoLG49dGhpcy5fY29tcGFyYXRvcixvPXRoaXMuX2FycmF5LHI9LTEsaT0hMDtmb3IoO2k7KXtsZXQgcz0yKih0KzEpLGY9cy0xO2Y8ZSYmbihvW2ZdLG9bdF0pPDA/cj1mOnI9dCxzPGUmJm4ob1tzXSxvW3JdKTwwJiYocj1zKSxyIT09dD8oR20obyxyLHQpLHQ9cik6aT0hMX19O0hzLnByb3RvdHlwZS5yZXNvcnQ9ZnVuY3Rpb24oKXtsZXQgdD10aGlzLl9sZW5ndGg7Zm9yKGxldCBlPU1hdGguY2VpbCh0LzIpO2U+PTA7LS1lKXRoaXMuaGVhcGlmeShlKX07SHMucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0KXt5LmRlZmluZWQoImVsZW1lbnQiLHQpO2xldCBlPXRoaXMuX2FycmF5LG49dGhpcy5fY29tcGFyYXRvcixvPXRoaXMuX21heGltdW1MZW5ndGgscj10aGlzLl9sZW5ndGgrKztmb3IocjxlLmxlbmd0aD9lW3JdPXQ6ZS5wdXNoKHQpO3IhPT0wOyl7bGV0IHM9TWF0aC5mbG9vcigoci0xKS8yKTtpZihuKGVbcl0sZVtzXSk8MClHbShlLHIscykscj1zO2Vsc2UgYnJlYWt9bGV0IGk7cmV0dXJuIGgobykmJnRoaXMuX2xlbmd0aD5vJiYoaT1lW29dLHRoaXMuX2xlbmd0aD1vKSxpfTtIcy5wcm90b3R5cGUucG9wPWZ1bmN0aW9uKHQpe2lmKHQ9eCh0LDApLHRoaXMuX2xlbmd0aD09PTApcmV0dXJuO3kudHlwZU9mLm51bWJlci5sZXNzVGhhbigiaW5kZXgiLHQsdGhpcy5fbGVuZ3RoKTtsZXQgZT10aGlzLl9hcnJheSxuPWVbdF07cmV0dXJuIEdtKGUsdCwtLXRoaXMuX2xlbmd0aCksdGhpcy5oZWFwaWZ5KHQpLGVbdGhpcy5fbGVuZ3RoXT12b2lkIDAsbn07eUE9SHN9KTtmdW5jdGlvbiBBeCh0LGUpe3JldHVybiB0LnByaW9yaXR5LWUucHJpb3JpdHl9ZnVuY3Rpb24gYm4oKXt9ZnVuY3Rpb24gQUEodCl7aCh0LnByaW9yaXR5RnVuY3Rpb24pJiYodC5wcmlvcml0eT10LnByaW9yaXR5RnVuY3Rpb24oKSl9ZnVuY3Rpb24gYkEodCl7cmV0dXJuIHQuc3RhdGU9PT1Tbi5VTklTU1VFRCYmKHQuc3RhdGU9U24uSVNTVUVELHQuZGVmZXJyZWQ9anMoKSksdC5kZWZlcnJlZC5wcm9taXNlfWZ1bmN0aW9uIHd4KHQpe3JldHVybiBmdW5jdGlvbihlKXtpZih0LnN0YXRlPT09U24uQ0FOQ0VMTEVEKXJldHVybjtsZXQgbj10LmRlZmVycmVkOy0tamUubnVtYmVyT2ZBY3RpdmVSZXF1ZXN0cywtLUNpW3Quc2VydmVyS2V5XSxhcC5yYWlzZUV2ZW50KCksdC5zdGF0ZT1Tbi5SRUNFSVZFRCx0LmRlZmVycmVkPXZvaWQgMCxuLnJlc29sdmUoZSl9fWZ1bmN0aW9uIFR4KHQpe3JldHVybiBmdW5jdGlvbihlKXt0LnN0YXRlIT09U24uQ0FOQ0VMTEVEJiYoKytqZS5udW1iZXJPZkZhaWxlZFJlcXVlc3RzLC0tamUubnVtYmVyT2ZBY3RpdmVSZXF1ZXN0cywtLUNpW3Quc2VydmVyS2V5XSxhcC5yYWlzZUV2ZW50KGUpLHQuc3RhdGU9U24uRkFJTEVELHQuZGVmZXJyZWQucmVqZWN0KGUpKX19ZnVuY3Rpb24gd0EodCl7bGV0IGU9YkEodCk7cmV0dXJuIHQuc3RhdGU9U24uQUNUSVZFLGVpLnB1c2godCksKytqZS5udW1iZXJPZkFjdGl2ZVJlcXVlc3RzLCsramUubnVtYmVyT2ZBY3RpdmVSZXF1ZXN0c0V2ZXIsKytDaVt0LnNlcnZlcktleV0sdC5yZXF1ZXN0RnVuY3Rpb24oKS50aGVuKHd4KHQpKS5jYXRjaChUeCh0KSksZX1mdW5jdGlvbiBxcyh0KXtsZXQgZT10LnN0YXRlPT09U24uQUNUSVZFO2lmKHQuc3RhdGU9U24uQ0FOQ0VMTEVELCsramUubnVtYmVyT2ZDYW5jZWxsZWRSZXF1ZXN0cyxoKHQuZGVmZXJyZWQpKXtsZXQgbj10LmRlZmVycmVkO3QuZGVmZXJyZWQ9dm9pZCAwLG4ucmVqZWN0KCl9ZSYmKC0tamUubnVtYmVyT2ZBY3RpdmVSZXF1ZXN0cywtLUNpW3Quc2VydmVyS2V5XSwrK2plLm51bWJlck9mQ2FuY2VsbGVkQWN0aXZlUmVxdWVzdHMpLGgodC5jYW5jZWxGdW5jdGlvbikmJnQuY2FuY2VsRnVuY3Rpb24oKX1mdW5jdGlvbiBPeCgpe2JuLmRlYnVnU2hvd1N0YXRpc3RpY3MmJihqZS5udW1iZXJPZkFjdGl2ZVJlcXVlc3RzPT09MCYmamUubGFzdE51bWJlck9mQWN0aXZlUmVxdWVzdHM+MCYmKGplLm51bWJlck9mQXR0ZW1wdGVkUmVxdWVzdHM+MCYmKGNvbnNvbGUubG9nKGBOdW1iZXIgb2YgYXR0ZW1wdGVkIHJlcXVlc3RzOiAke2plLm51bWJlck9mQXR0ZW1wdGVkUmVxdWVzdHN9YCksamUubnVtYmVyT2ZBdHRlbXB0ZWRSZXF1ZXN0cz0wKSxqZS5udW1iZXJPZkNhbmNlbGxlZFJlcXVlc3RzPjAmJihjb25zb2xlLmxvZyhgTnVtYmVyIG9mIGNhbmNlbGxlZCByZXF1ZXN0czogJHtqZS5udW1iZXJPZkNhbmNlbGxlZFJlcXVlc3RzfWApLGplLm51bWJlck9mQ2FuY2VsbGVkUmVxdWVzdHM9MCksamUubnVtYmVyT2ZDYW5jZWxsZWRBY3RpdmVSZXF1ZXN0cz4wJiYoY29uc29sZS5sb2coYE51bWJlciBvZiBjYW5jZWxsZWQgYWN0aXZlIHJlcXVlc3RzOiAke2plLm51bWJlck9mQ2FuY2VsbGVkQWN0aXZlUmVxdWVzdHN9YCksamUubnVtYmVyT2ZDYW5jZWxsZWRBY3RpdmVSZXF1ZXN0cz0wKSxqZS5udW1iZXJPZkZhaWxlZFJlcXVlc3RzPjAmJihjb25zb2xlLmxvZyhgTnVtYmVyIG9mIGZhaWxlZCByZXF1ZXN0czogJHtqZS5udW1iZXJPZkZhaWxlZFJlcXVlc3RzfWApLGplLm51bWJlck9mRmFpbGVkUmVxdWVzdHM9MCkpLGplLmxhc3ROdW1iZXJPZkFjdGl2ZVJlcXVlc3RzPWplLm51bWJlck9mQWN0aXZlUmVxdWVzdHMpfXZhciBjcCxqZSwkYyxibyxlaSxDaSxieCxhcCxmcCxUQT1aKCgpPT57Y3A9cnIoenMoKSwxKTtYdCgpO0l0KCk7RG0oKTtmdCgpO19BKCk7Z0EoKTtWbSgpO2ttKCk7aXAoKTtqZT17bnVtYmVyT2ZBdHRlbXB0ZWRSZXF1ZXN0czowLG51bWJlck9mQWN0aXZlUmVxdWVzdHM6MCxudW1iZXJPZkNhbmNlbGxlZFJlcXVlc3RzOjAsbnVtYmVyT2ZDYW5jZWxsZWRBY3RpdmVSZXF1ZXN0czowLG51bWJlck9mRmFpbGVkUmVxdWVzdHM6MCxudW1iZXJPZkFjdGl2ZVJlcXVlc3RzRXZlcjowLGxhc3ROdW1iZXJPZkFjdGl2ZVJlcXVlc3RzOjB9LCRjPTIwLGJvPW5ldyB5QSh7Y29tcGFyYXRvcjpBeH0pO2JvLm1heGltdW1MZW5ndGg9JGM7Ym8ucmVzZXJ2ZSgkYyk7ZWk9W10sQ2k9e30sYng9dHlwZW9mIGRvY3VtZW50PCJ1Ij9uZXcgY3AuZGVmYXVsdChkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTpuZXcgY3AuZGVmYXVsdCxhcD1uZXcgaEE7Ym4ubWF4aW11bVJlcXVlc3RzPTUwO2JuLm1heGltdW1SZXF1ZXN0c1BlclNlcnZlcj0xODtibi5yZXF1ZXN0c0J5U2VydmVyPXt9O2JuLnRocm90dGxlUmVxdWVzdHM9ITA7Ym4uZGVidWdTaG93U3RhdGlzdGljcz0hMTtibi5yZXF1ZXN0Q29tcGxldGVkRXZlbnQ9YXA7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYm4se3N0YXRpc3RpY3M6e2dldDpmdW5jdGlvbigpe3JldHVybiBqZX19LHByaW9yaXR5SGVhcExlbmd0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuICRjfSxzZXQ6ZnVuY3Rpb24odCl7aWYodDwkYylmb3IoO2JvLmxlbmd0aD50Oyl7bGV0IGU9Ym8ucG9wKCk7cXMoZSl9JGM9dCxiby5tYXhpbXVtTGVuZ3RoPXQsYm8ucmVzZXJ2ZSh0KX19fSk7Ym4uc2VydmVySGFzT3BlblNsb3RzPWZ1bmN0aW9uKHQsZSl7ZT14KGUsMSk7bGV0IG49eChibi5yZXF1ZXN0c0J5U2VydmVyW3RdLGJuLm1heGltdW1SZXF1ZXN0c1BlclNlcnZlcik7cmV0dXJuIENpW3RdK2U8PW59O2JuLmhlYXBIYXNPcGVuU2xvdHM9ZnVuY3Rpb24odCl7cmV0dXJuIGJvLmxlbmd0aCt0PD0kY307Ym4udXBkYXRlPWZ1bmN0aW9uKCl7bGV0IHQsZSxuPTAsbz1laS5sZW5ndGg7Zm9yKHQ9MDt0PG87Kyt0KXtpZihlPWVpW3RdLGUuY2FuY2VsbGVkJiZxcyhlKSxlLnN0YXRlIT09U24uQUNUSVZFKXsrK247Y29udGludWV9bj4wJiYoZWlbdC1uXT1lKX1laS5sZW5ndGgtPW47bGV0IHI9Ym8uaW50ZXJuYWxBcnJheSxpPWJvLmxlbmd0aDtmb3IodD0wO3Q8aTsrK3QpQUEoclt0XSk7Ym8ucmVzb3J0KCk7bGV0IHM9TWF0aC5tYXgoYm4ubWF4aW11bVJlcXVlc3RzLWVpLmxlbmd0aCwwKSxmPTA7Zm9yKDtmPHMmJmJvLmxlbmd0aD4wOyl7aWYoZT1iby5wb3AoKSxlLmNhbmNlbGxlZCl7cXMoZSk7Y29udGludWV9aWYoZS50aHJvdHRsZUJ5U2VydmVyJiYhYm4uc2VydmVySGFzT3BlblNsb3RzKGUuc2VydmVyS2V5KSl7cXMoZSk7Y29udGludWV9d0EoZSksKytmfU94KCl9O2JuLmdldFNlcnZlcktleT1mdW5jdGlvbih0KXt5LnR5cGVPZi5zdHJpbmcoInVybCIsdCk7bGV0IGU9bmV3IGNwLmRlZmF1bHQodCk7ZS5zY2hlbWUoKT09PSIiJiYoZT1lLmFic29sdXRlVG8oYngpLGUubm9ybWFsaXplKCkpO2xldCBuPWUuYXV0aG9yaXR5KCk7LzovLnRlc3Qobil8fChuPWAke259OiR7ZS5zY2hlbWUoKT09PSJodHRwcyI/IjQ0MyI6IjgwIn1gKTtsZXQgbz1DaVtuXTtyZXR1cm4gaChvKXx8KENpW25dPTApLG59O2JuLnJlcXVlc3Q9ZnVuY3Rpb24odCl7aWYoeS50eXBlT2Yub2JqZWN0KCJyZXF1ZXN0Iix0KSx5LnR5cGVPZi5zdHJpbmcoInJlcXVlc3QudXJsIix0LnVybCkseS50eXBlT2YuZnVuYygicmVxdWVzdC5yZXF1ZXN0RnVuY3Rpb24iLHQucmVxdWVzdEZ1bmN0aW9uKSxycCh0LnVybCl8fG9wKHQudXJsKSlyZXR1cm4gYXAucmFpc2VFdmVudCgpLHQuc3RhdGU9U24uUkVDRUlWRUQsdC5yZXF1ZXN0RnVuY3Rpb24oKTtpZigrK2plLm51bWJlck9mQXR0ZW1wdGVkUmVxdWVzdHMsaCh0LnNlcnZlcktleSl8fCh0LnNlcnZlcktleT1ibi5nZXRTZXJ2ZXJLZXkodC51cmwpKSxibi50aHJvdHRsZVJlcXVlc3RzJiZ0LnRocm90dGxlQnlTZXJ2ZXImJiFibi5zZXJ2ZXJIYXNPcGVuU2xvdHModC5zZXJ2ZXJLZXkpKXJldHVybjtpZighYm4udGhyb3R0bGVSZXF1ZXN0c3x8IXQudGhyb3R0bGUpcmV0dXJuIHdBKHQpO2lmKGVpLmxlbmd0aD49Ym4ubWF4aW11bVJlcXVlc3RzKXJldHVybjtBQSh0KTtsZXQgZT1iby5pbnNlcnQodCk7aWYoaChlKSl7aWYoZT09PXQpcmV0dXJuO3FzKGUpfXJldHVybiBiQSh0KX07Ym4uY2xlYXJGb3JTcGVjcz1mdW5jdGlvbigpe2Zvcig7Ym8ubGVuZ3RoPjA7KXtsZXQgZT1iby5wb3AoKTtxcyhlKX1sZXQgdD1laS5sZW5ndGg7Zm9yKGxldCBlPTA7ZTx0OysrZSlxcyhlaVtlXSk7ZWkubGVuZ3RoPTAsQ2k9e30samUubnVtYmVyT2ZBdHRlbXB0ZWRSZXF1ZXN0cz0wLGplLm51bWJlck9mQWN0aXZlUmVxdWVzdHM9MCxqZS5udW1iZXJPZkNhbmNlbGxlZFJlcXVlc3RzPTAsamUubnVtYmVyT2ZDYW5jZWxsZWRBY3RpdmVSZXF1ZXN0cz0wLGplLm51bWJlck9mRmFpbGVkUmVxdWVzdHM9MCxqZS5udW1iZXJPZkFjdGl2ZVJlcXVlc3RzRXZlcj0wLGplLmxhc3ROdW1iZXJPZkFjdGl2ZVJlcXVlc3RzPTB9O2JuLm51bWJlck9mQWN0aXZlUmVxdWVzdHNCeVNlcnZlcj1mdW5jdGlvbih0KXtyZXR1cm4gQ2lbdF19O2JuLnJlcXVlc3RIZWFwPWJvO2ZwPWJufSk7ZnVuY3Rpb24gRXgodCl7bGV0IGU9bmV3IE9BLmRlZmF1bHQodCk7ZS5ub3JtYWxpemUoKTtsZXQgbj1lLmF1dGhvcml0eSgpO2lmKG4ubGVuZ3RoIT09MCl7aWYoZS5hdXRob3JpdHkobiksbi5pbmRleE9mKCJAIikhPT0tMSYmKG49bi5zcGxpdCgiQCIpWzFdKSxuLmluZGV4T2YoIjoiKT09PS0xKXtsZXQgbz1lLnNjaGVtZSgpO2lmKG8ubGVuZ3RoPT09MCYmKG89d2luZG93LmxvY2F0aW9uLnByb3RvY29sLG89by5zdWJzdHJpbmcoMCxvLmxlbmd0aC0xKSksbz09PSJodHRwIiluKz0iOjgwIjtlbHNlIGlmKG89PT0iaHR0cHMiKW4rPSI6NDQzIjtlbHNlIHJldHVybn1yZXR1cm4gbn19dmFyIE9BLHBmLFpjLHptLEVBPVooKCk9PntPQT1ycih6cygpLDEpO2Z0KCk7SHQoKTtwZj17fSxaYz17fTtwZi5hZGQ9ZnVuY3Rpb24odCxlKXtpZighaCh0KSl0aHJvdyBuZXcgRigiaG9zdCBpcyByZXF1aXJlZC4iKTtpZighaChlKXx8ZTw9MCl0aHJvdyBuZXcgRigicG9ydCBpcyByZXF1aXJlZCB0byBiZSBncmVhdGVyIHRoYW4gMC4iKTtsZXQgbj1gJHt0LnRvTG93ZXJDYXNlKCl9OiR7ZX1gO2goWmNbbl0pfHwoWmNbbl09ITApfTtwZi5yZW1vdmU9ZnVuY3Rpb24odCxlKXtpZighaCh0KSl0aHJvdyBuZXcgRigiaG9zdCBpcyByZXF1aXJlZC4iKTtpZighaChlKXx8ZTw9MCl0aHJvdyBuZXcgRigicG9ydCBpcyByZXF1aXJlZCB0byBiZSBncmVhdGVyIHRoYW4gMC4iKTtsZXQgbj1gJHt0LnRvTG93ZXJDYXNlKCl9OiR7ZX1gO2goWmNbbl0pJiZkZWxldGUgWmNbbl19O3BmLmNvbnRhaW5zPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBGKCJ1cmwgaXMgcmVxdWlyZWQuIik7bGV0IGU9RXgodCk7cmV0dXJuISEoaChlKSYmaChaY1tlXSkpfTtwZi5jbGVhcj1mdW5jdGlvbigpe1pjPXt9fTt6bT1wZn0pO2Z1bmN0aW9uIGt0KHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKSx0eXBlb2YgdD09InN0cmluZyImJih0PXt1cmw6dH0pLHkudHlwZU9mLnN0cmluZygib3B0aW9ucy51cmwiLHQudXJsKSx0aGlzLl91cmw9dm9pZCAwLHRoaXMuX3RlbXBsYXRlVmFsdWVzPW5pKHQudGVtcGxhdGVWYWx1ZXMse30pLHRoaXMuX3F1ZXJ5UGFyYW1ldGVycz1uaSh0LnF1ZXJ5UGFyYW1ldGVycyx7fSksdGhpcy5oZWFkZXJzPW5pKHQuaGVhZGVycyx7fSksdGhpcy5yZXF1ZXN0PXgodC5yZXF1ZXN0LG5ldyBmQSksdGhpcy5wcm94eT10LnByb3h5LHRoaXMucmV0cnlDYWxsYmFjaz10LnJldHJ5Q2FsbGJhY2ssdGhpcy5yZXRyeUF0dGVtcHRzPXgodC5yZXRyeUF0dGVtcHRzLDApLHRoaXMuX3JldHJ5Q291bnQ9MCx4KHQucGFyc2VVcmwsITApP3RoaXMucGFyc2VVcmwodC51cmwsITAsITApOnRoaXMuX3VybD10LnVybCx0aGlzLl9jcmVkaXRzPXQuY3JlZGl0c31mdW5jdGlvbiBuaSh0LGUpe3JldHVybiBoKHQpP1ljKHQpOmV9ZnVuY3Rpb24gUngodCl7cmV0dXJuIHQubGVuZ3RoPT09MD97fTp0LmluZGV4T2YoIj0iKT09PS0xP3tbdF06dm9pZCAwfTppQSh0KX1mdW5jdGlvbiBscCh0LGUsbil7aWYoIW4pcmV0dXJuIF9yKHQsZSk7bGV0IG89WWModCwhMCk7Zm9yKGxldCByIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShyKSl7bGV0IGk9b1tyXSxzPWVbcl07aChpKT8oQXJyYXkuaXNBcnJheShpKXx8KGk9b1tyXT1baV0pLG9bcl09aS5jb25jYXQocykpOm9bcl09QXJyYXkuaXNBcnJheShzKT9zLnNsaWNlKCk6c31yZXR1cm4gb31mdW5jdGlvbiBTeCh0KXtsZXQgZT1PYmplY3Qua2V5cyh0KTtyZXR1cm4gZS5sZW5ndGg9PT0wPyIiOmUubGVuZ3RoPT09MSYmIWgodFtlWzBdXSk/YD8ke2VbMF19YDpgPyR7b0EodCl9YH1mdW5jdGlvbiBqbSh0KXtsZXQgZT10LnJlc291cmNlLG49dC5mbGlwWSxvPXQuc2tpcENvbG9yU3BhY2VDb252ZXJzaW9uLHI9dC5wcmVmZXJJbWFnZUJpdG1hcCxpPWUucmVxdWVzdDtpLnVybD1lLnVybCxpLnJlcXVlc3RGdW5jdGlvbj1mdW5jdGlvbigpe2xldCBmPSExOyFlLmlzRGF0YVVyaSYmIWUuaXNCbG9iVXJpJiYoZj1lLmlzQ3Jvc3NPcmlnaW5VcmwpO2xldCB1PWpzKCk7cmV0dXJuIGt0Ll9JbXBsZW1lbnRhdGlvbnMuY3JlYXRlSW1hZ2UoaSxmLHUsbixvLHIpLHUucHJvbWlzZX07bGV0IHM9ZnAucmVxdWVzdChpKTtpZihoKHMpKXJldHVybiBzLmNhdGNoKGZ1bmN0aW9uKGYpe3JldHVybiBpLnN0YXRlIT09U24uRkFJTEVEP1Byb21pc2UucmVqZWN0KGYpOmUucmV0cnlPbkVycm9yKGYpLnRoZW4oZnVuY3Rpb24odSl7cmV0dXJuIHU/KGkuc3RhdGU9U24uVU5JU1NVRUQsaS5kZWZlcnJlZD12b2lkIDAsam0oe3Jlc291cmNlOmUsZmxpcFk6bixza2lwQ29sb3JTcGFjZUNvbnZlcnNpb246byxwcmVmZXJJbWFnZUJpdG1hcDpyfSkpOlByb21pc2UucmVqZWN0KGYpfSl9KX1mdW5jdGlvbiB4QSh0LGUsbil7bGV0IG89e307b1tlXT1uLHQuc2V0UXVlcnlQYXJhbWV0ZXJzKG8pO2xldCByPXQucmVxdWVzdCxpPXQudXJsO3IudXJsPWksci5yZXF1ZXN0RnVuY3Rpb249ZnVuY3Rpb24oKXtsZXQgZj1qcygpO3JldHVybiB3aW5kb3dbbl09ZnVuY3Rpb24odSl7Zi5yZXNvbHZlKHUpO3RyeXtkZWxldGUgd2luZG93W25dfWNhdGNoe3dpbmRvd1tuXT12b2lkIDB9fSxrdC5fSW1wbGVtZW50YXRpb25zLmxvYWRBbmRFeGVjdXRlU2NyaXB0KGksbixmKSxmLnByb21pc2V9O2xldCBzPWZwLnJlcXVlc3Qocik7aWYoaChzKSlyZXR1cm4gcy5jYXRjaChmdW5jdGlvbihmKXtyZXR1cm4gci5zdGF0ZSE9PVNuLkZBSUxFRD9Qcm9taXNlLnJlamVjdChmKTp0LnJldHJ5T25FcnJvcihmKS50aGVuKGZ1bmN0aW9uKHUpe3JldHVybiB1PyhyLnN0YXRlPVNuLlVOSVNTVUVELHIuZGVmZXJyZWQ9dm9pZCAwLHhBKHQsZSxuKSk6UHJvbWlzZS5yZWplY3QoZil9KX0pfWZ1bmN0aW9uIEhtKHQpe2lmKHQuc3RhdGU9PT1Tbi5JU1NVRUR8fHQuc3RhdGU9PT1Tbi5BQ1RJVkUpdGhyb3cgbmV3IEFlKCJUaGUgUmVzb3VyY2UgaXMgYWxyZWFkeSBiZWluZyBmZXRjaGVkLiIpO3Quc3RhdGU9U24uVU5JU1NVRUQsdC5kZWZlcnJlZD12b2lkIDB9ZnVuY3Rpb24gdXAodCxlKXtsZXQgbj1kZWNvZGVVUklDb21wb25lbnQoZSk7cmV0dXJuIHQ/YXRvYihuKTpufWZ1bmN0aW9uIFJBKHQsZSl7bGV0IG49dXAodCxlKSxvPW5ldyBBcnJheUJ1ZmZlcihuLmxlbmd0aCkscj1uZXcgVWludDhBcnJheShvKTtmb3IobGV0IGk9MDtpPG4ubGVuZ3RoO2krKylyW2ldPW4uY2hhckNvZGVBdChpKTtyZXR1cm4gb31mdW5jdGlvbiB4eCh0LGUpe2U9eChlLCIiKTtsZXQgbj10WzFdLG89ISF0WzJdLHI9dFszXSxpLHM7c3dpdGNoKGUpe2Nhc2UiIjpjYXNlInRleHQiOnJldHVybiB1cChvLHIpO2Nhc2UiYXJyYXlidWZmZXIiOnJldHVybiBSQShvLHIpO2Nhc2UiYmxvYiI6cmV0dXJuIGk9UkEobyxyKSxuZXcgQmxvYihbaV0se3R5cGU6bn0pO2Nhc2UiZG9jdW1lbnQiOnJldHVybiBzPW5ldyBET01QYXJzZXIscy5wYXJzZUZyb21TdHJpbmcodXAobyxyKSxuKTtjYXNlImpzb24iOnJldHVybiBKU09OLnBhcnNlKHVwKG8scikpO2RlZmF1bHQ6dGhyb3cgbmV3IEYoYFVuaGFuZGxlZCByZXNwb25zZVR5cGU6ICR7ZX1gKX19ZnVuY3Rpb24gUHgodCxlLG4sbyxyLGkscyl7ZmV0Y2godCx7bWV0aG9kOm4saGVhZGVyczpyfSkudGhlbihhc3luYyBmPT57aWYoIWYub2spe2xldCB1PXt9O2YuaGVhZGVycy5mb3JFYWNoKChjLGwpPT57dVtsXT1jfSksaS5yZWplY3QobmV3IHVmKGYuc3RhdHVzLGYsdSkpO3JldHVybn1zd2l0Y2goZSl7Y2FzZSJ0ZXh0IjppLnJlc29sdmUoZi50ZXh0KCkpO2JyZWFrO2Nhc2UianNvbiI6aS5yZXNvbHZlKGYuanNvbigpKTticmVhaztkZWZhdWx0OmkucmVzb2x2ZShuZXcgVWludDhBcnJheShhd2FpdCBmLmFycmF5QnVmZmVyKCkpLmJ1ZmZlcik7YnJlYWt9fSkuY2F0Y2goKCk9PntpLnJlamVjdChuZXcgdWYpfSl9dmFyIFNBLENBLFFjLEN4LE14LG9pLGRmPVooKCk9PntTQT1ycih6cygpLDEpO2sxKCk7WHQoKTt6MSgpO25wKCk7SXQoKTtEbSgpO2Z0KCk7SHQoKTtCbSgpO1cxKCk7JDEoKTtRMSgpO1ZtKCk7dEEoKTtrbSgpO25BKCk7V3QoKTtyQSgpO3NBKCk7dUEoKTttQSgpO1RBKCk7aXAoKTtKcigpO0VBKCk7Q0E9ZnVuY3Rpb24oKXt0cnl7bGV0IHQ9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiB0Lm9wZW4oIkdFVCIsIiMiLCEwKSx0LnJlc3BvbnNlVHlwZT0iYmxvYiIsdC5yZXNwb25zZVR5cGU9PT0iYmxvYiJ9Y2F0Y2h7cmV0dXJuITF9fSgpO2t0LmNyZWF0ZUlmTmVlZGVkPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2Yga3Q/dC5nZXREZXJpdmVkUmVzb3VyY2Uoe3JlcXVlc3Q6dC5yZXF1ZXN0fSk6dHlwZW9mIHQhPSJzdHJpbmciP3Q6bmV3IGt0KHt1cmw6dH0pfTtrdC5zdXBwb3J0c0ltYWdlQml0bWFwT3B0aW9ucz1mdW5jdGlvbigpe3JldHVybiBoKFFjKT9RYzp0eXBlb2YgY3JlYXRlSW1hZ2VCaXRtYXAhPSJmdW5jdGlvbiI/KFFjPVByb21pc2UucmVzb2x2ZSghMSksUWMpOihRYz1rdC5mZXRjaEJsb2Ioe3VybDoiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBRUFBQUFCQ0FJQUFBQ1FkMVBlQUFBQUJHZEJUVUVBQUU0ZzNyRWlEZ0FBQUNCalNGSk5BQUI2SmdBQWdJUUFBUG9BQUFDQTZBQUFkVEFBQU9wZ0FBQTZtQUFBRjNDY3VsRThBQUFBREVsRVFWUUkxMk5nNkdBQUFBRVVBSW5nRTNaaUFBQUFBRWxGVGtTdVFtQ0MifSkudGhlbihmdW5jdGlvbihlKXtsZXQgbj17aW1hZ2VPcmllbnRhdGlvbjoiZmxpcFkiLHByZW11bHRpcGx5QWxwaGE6Im5vbmUiLGNvbG9yU3BhY2VDb252ZXJzaW9uOiJub25lIn07cmV0dXJuIFByb21pc2UuYWxsKFtjcmVhdGVJbWFnZUJpdG1hcChlLG4pLGNyZWF0ZUltYWdlQml0bWFwKGUpXSl9KS50aGVuKGZ1bmN0aW9uKGUpe2xldCBuPVVtKGVbMF0pLG89VW0oZVsxXSk7cmV0dXJuIG5bMV0hPT1vWzFdfSkuY2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4hMX0pLFFjKX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoa3Qse2lzQmxvYlN1cHBvcnRlZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIENBfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhrdC5wcm90b3R5cGUse3F1ZXJ5UGFyYW1ldGVyczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3F1ZXJ5UGFyYW1ldGVyc319LHRlbXBsYXRlVmFsdWVzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGVtcGxhdGVWYWx1ZXN9fSx1cmw6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFVybENvbXBvbmVudCghMCwhMCl9LHNldDpmdW5jdGlvbih0KXt0aGlzLnBhcnNlVXJsKHQsITEsITEpfX0sZXh0ZW5zaW9uOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gWTEodGhpcy5fdXJsKX19LGlzRGF0YVVyaTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHJwKHRoaXMuX3VybCl9fSxpc0Jsb2JVcmk6e2dldDpmdW5jdGlvbigpe3JldHVybiBvcCh0aGlzLl91cmwpfX0saXNDcm9zc09yaWdpblVybDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEoxKHRoaXMuX3VybCl9fSxoYXNIZWFkZXJzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5oZWFkZXJzKS5sZW5ndGg+MH19LGNyZWRpdHM6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jcmVkaXRzfX19KTtrdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRVcmxDb21wb25lbnQoITAsITApfTtrdC5wcm90b3R5cGUucGFyc2VVcmw9ZnVuY3Rpb24odCxlLG4sbyl7bGV0IHI9bmV3IFNBLmRlZmF1bHQodCksaT1SeChyLnF1ZXJ5KCkpO3RoaXMuX3F1ZXJ5UGFyYW1ldGVycz1lP2xwKGksdGhpcy5xdWVyeVBhcmFtZXRlcnMsbik6aSxyLnNlYXJjaCgiIiksci5mcmFnbWVudCgiIiksaChvKSYmci5zY2hlbWUoKT09PSIiJiYocj1yLmFic29sdXRlVG8oZmYobykpKSx0aGlzLl91cmw9ci50b1N0cmluZygpfTtrdC5wcm90b3R5cGUuZ2V0VXJsQ29tcG9uZW50PWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5pc0RhdGFVcmkpcmV0dXJuIHRoaXMuX3VybDtsZXQgbj10aGlzLl91cmw7dCYmKG49YCR7bn0ke1N4KHRoaXMucXVlcnlQYXJhbWV0ZXJzKX1gKSxuPW4ucmVwbGFjZSgvJTdCL2csInsiKS5yZXBsYWNlKC8lN0QvZywifSIpO2xldCBvPXRoaXMuX3RlbXBsYXRlVmFsdWVzO3JldHVybiBPYmplY3Qua2V5cyhvKS5sZW5ndGg+MCYmKG49bi5yZXBsYWNlKC97KC4qPyl9L2csZnVuY3Rpb24ocixpKXtsZXQgcz1vW2ldO3JldHVybiBoKHMpP2VuY29kZVVSSUNvbXBvbmVudChzKTpyfSkpLGUmJmgodGhpcy5wcm94eSkmJihuPXRoaXMucHJveHkuZ2V0VVJMKG4pKSxufTtrdC5wcm90b3R5cGUuc2V0UXVlcnlQYXJhbWV0ZXJzPWZ1bmN0aW9uKHQsZSl7ZT90aGlzLl9xdWVyeVBhcmFtZXRlcnM9bHAodGhpcy5fcXVlcnlQYXJhbWV0ZXJzLHQsITEpOnRoaXMuX3F1ZXJ5UGFyYW1ldGVycz1scCh0LHRoaXMuX3F1ZXJ5UGFyYW1ldGVycywhMSl9O2t0LnByb3RvdHlwZS5hcHBlbmRRdWVyeVBhcmFtZXRlcnM9ZnVuY3Rpb24odCl7dGhpcy5fcXVlcnlQYXJhbWV0ZXJzPWxwKHQsdGhpcy5fcXVlcnlQYXJhbWV0ZXJzLCEwKX07a3QucHJvdG90eXBlLnNldFRlbXBsYXRlVmFsdWVzPWZ1bmN0aW9uKHQsZSl7ZT90aGlzLl90ZW1wbGF0ZVZhbHVlcz1fcih0aGlzLl90ZW1wbGF0ZVZhbHVlcyx0KTp0aGlzLl90ZW1wbGF0ZVZhbHVlcz1fcih0LHRoaXMuX3RlbXBsYXRlVmFsdWVzKX07a3QucHJvdG90eXBlLmdldERlcml2ZWRSZXNvdXJjZT1mdW5jdGlvbih0KXtsZXQgZT10aGlzLmNsb25lKCk7aWYoZS5fcmV0cnlDb3VudD0wLGgodC51cmwpKXtsZXQgbj14KHQucHJlc2VydmVRdWVyeVBhcmFtZXRlcnMsITEpO2UucGFyc2VVcmwodC51cmwsITAsbix0aGlzLl91cmwpfXJldHVybiBoKHQucXVlcnlQYXJhbWV0ZXJzKSYmKGUuX3F1ZXJ5UGFyYW1ldGVycz1fcih0LnF1ZXJ5UGFyYW1ldGVycyxlLnF1ZXJ5UGFyYW1ldGVycykpLGgodC50ZW1wbGF0ZVZhbHVlcykmJihlLl90ZW1wbGF0ZVZhbHVlcz1fcih0LnRlbXBsYXRlVmFsdWVzLGUudGVtcGxhdGVWYWx1ZXMpKSxoKHQuaGVhZGVycykmJihlLmhlYWRlcnM9X3IodC5oZWFkZXJzLGUuaGVhZGVycykpLGgodC5wcm94eSkmJihlLnByb3h5PXQucHJveHkpLGgodC5yZXF1ZXN0KSYmKGUucmVxdWVzdD10LnJlcXVlc3QpLGgodC5yZXRyeUNhbGxiYWNrKSYmKGUucmV0cnlDYWxsYmFjaz10LnJldHJ5Q2FsbGJhY2spLGgodC5yZXRyeUF0dGVtcHRzKSYmKGUucmV0cnlBdHRlbXB0cz10LnJldHJ5QXR0ZW1wdHMpLGV9O2t0LnByb3RvdHlwZS5yZXRyeU9uRXJyb3I9ZnVuY3Rpb24odCl7bGV0IGU9dGhpcy5yZXRyeUNhbGxiYWNrO2lmKHR5cGVvZiBlIT0iZnVuY3Rpb24ifHx0aGlzLl9yZXRyeUNvdW50Pj10aGlzLnJldHJ5QXR0ZW1wdHMpcmV0dXJuIFByb21pc2UucmVzb2x2ZSghMSk7bGV0IG49dGhpcztyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUodGhpcyx0KSkudGhlbihmdW5jdGlvbihvKXtyZXR1cm4rK24uX3JldHJ5Q291bnQsb30pfTtrdC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIGgodCk/KHQuX3VybD10aGlzLl91cmwsdC5fcXVlcnlQYXJhbWV0ZXJzPVljKHRoaXMuX3F1ZXJ5UGFyYW1ldGVycyksdC5fdGVtcGxhdGVWYWx1ZXM9WWModGhpcy5fdGVtcGxhdGVWYWx1ZXMpLHQuaGVhZGVycz1ZYyh0aGlzLmhlYWRlcnMpLHQucHJveHk9dGhpcy5wcm94eSx0LnJldHJ5Q2FsbGJhY2s9dGhpcy5yZXRyeUNhbGxiYWNrLHQucmV0cnlBdHRlbXB0cz10aGlzLnJldHJ5QXR0ZW1wdHMsdC5fcmV0cnlDb3VudD0wLHQucmVxdWVzdD10aGlzLnJlcXVlc3QuY2xvbmUoKSx0KTpuZXcga3Qoe3VybDp0aGlzLl91cmwscXVlcnlQYXJhbWV0ZXJzOnRoaXMucXVlcnlQYXJhbWV0ZXJzLHRlbXBsYXRlVmFsdWVzOnRoaXMudGVtcGxhdGVWYWx1ZXMsaGVhZGVyczp0aGlzLmhlYWRlcnMscHJveHk6dGhpcy5wcm94eSxyZXRyeUNhbGxiYWNrOnRoaXMucmV0cnlDYWxsYmFjayxyZXRyeUF0dGVtcHRzOnRoaXMucmV0cnlBdHRlbXB0cyxyZXF1ZXN0OnRoaXMucmVxdWVzdC5jbG9uZSgpLHBhcnNlVXJsOiExLGNyZWRpdHM6aCh0aGlzLmNyZWRpdHMpP3RoaXMuY3JlZGl0cy5zbGljZSgpOnZvaWQgMH0pfTtrdC5wcm90b3R5cGUuZ2V0QmFzZVVyaT1mdW5jdGlvbih0KXtyZXR1cm4gSzEodGhpcy5nZXRVcmxDb21wb25lbnQodCksdCl9O2t0LnByb3RvdHlwZS5hcHBlbmRGb3J3YXJkU2xhc2g9ZnVuY3Rpb24oKXt0aGlzLl91cmw9VjEodGhpcy5fdXJsKX07a3QucHJvdG90eXBlLmZldGNoQXJyYXlCdWZmZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mZXRjaCh7cmVzcG9uc2VUeXBlOiJhcnJheWJ1ZmZlciJ9KX07a3QuZmV0Y2hBcnJheUJ1ZmZlcj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGt0KHQpLmZldGNoQXJyYXlCdWZmZXIoKX07a3QucHJvdG90eXBlLmZldGNoQmxvYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZldGNoKHtyZXNwb25zZVR5cGU6ImJsb2IifSl9O2t0LmZldGNoQmxvYj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGt0KHQpLmZldGNoQmxvYigpfTtrdC5wcm90b3R5cGUuZmV0Y2hJbWFnZT1mdW5jdGlvbih0KXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IGU9eCh0LnByZWZlckltYWdlQml0bWFwLCExKSxuPXgodC5wcmVmZXJCbG9iLCExKSxvPXgodC5mbGlwWSwhMSkscj14KHQuc2tpcENvbG9yU3BhY2VDb252ZXJzaW9uLCExKTtpZihIbSh0aGlzLnJlcXVlc3QpLCFDQXx8dGhpcy5pc0RhdGFVcml8fHRoaXMuaXNCbG9iVXJpfHwhdGhpcy5oYXNIZWFkZXJzJiYhbilyZXR1cm4gam0oe3Jlc291cmNlOnRoaXMsZmxpcFk6byxza2lwQ29sb3JTcGFjZUNvbnZlcnNpb246cixwcmVmZXJJbWFnZUJpdG1hcDplfSk7bGV0IGk9dGhpcy5mZXRjaEJsb2IoKTtpZighaChpKSlyZXR1cm47bGV0IHMsZix1LGM7cmV0dXJuIGt0LnN1cHBvcnRzSW1hZ2VCaXRtYXBPcHRpb25zKCkudGhlbihmdW5jdGlvbihsKXtyZXR1cm4gcz1sLGY9cyYmZSxpfSkudGhlbihmdW5jdGlvbihsKXtpZighaChsKSlyZXR1cm47aWYoYz1sLGYpcmV0dXJuIGt0LmNyZWF0ZUltYWdlQml0bWFwRnJvbUJsb2IobCx7ZmxpcFk6byxwcmVtdWx0aXBseUFscGhhOiExLHNraXBDb2xvclNwYWNlQ29udmVyc2lvbjpyfSk7bGV0IHA9d2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwobCk7cmV0dXJuIHU9bmV3IGt0KHt1cmw6cH0pLGptKHtyZXNvdXJjZTp1LGZsaXBZOm8sc2tpcENvbG9yU3BhY2VDb252ZXJzaW9uOnIscHJlZmVySW1hZ2VCaXRtYXA6ITF9KX0pLnRoZW4oZnVuY3Rpb24obCl7aWYoaChsKSlyZXR1cm4gbC5ibG9iPWMsZnx8d2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodS51cmwpLGx9KS5jYXRjaChmdW5jdGlvbihsKXtyZXR1cm4gaCh1KSYmd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodS51cmwpLGwuYmxvYj1jLFByb21pc2UucmVqZWN0KGwpfSl9O2t0LmZldGNoSW1hZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBrdCh0KS5mZXRjaEltYWdlKHtmbGlwWTp0LmZsaXBZLHNraXBDb2xvclNwYWNlQ29udmVyc2lvbjp0LnNraXBDb2xvclNwYWNlQ29udmVyc2lvbixwcmVmZXJCbG9iOnQucHJlZmVyQmxvYixwcmVmZXJJbWFnZUJpdG1hcDp0LnByZWZlckltYWdlQml0bWFwfSl9O2t0LnByb3RvdHlwZS5mZXRjaFRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mZXRjaCh7cmVzcG9uc2VUeXBlOiJ0ZXh0In0pfTtrdC5mZXRjaFRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBrdCh0KS5mZXRjaFRleHQoKX07a3QucHJvdG90eXBlLmZldGNoSnNvbj1mdW5jdGlvbigpe2xldCB0PXRoaXMuZmV0Y2goe3Jlc3BvbnNlVHlwZToidGV4dCIsaGVhZGVyczp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCovKjtxPTAuMDEifX0pO2lmKGgodCkpcmV0dXJuIHQudGhlbihmdW5jdGlvbihlKXtpZihoKGUpKXJldHVybiBKU09OLnBhcnNlKGUpfSl9O2t0LmZldGNoSnNvbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGt0KHQpLmZldGNoSnNvbigpfTtrdC5wcm90b3R5cGUuZmV0Y2hYTUw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mZXRjaCh7cmVzcG9uc2VUeXBlOiJkb2N1bWVudCIsb3ZlcnJpZGVNaW1lVHlwZToidGV4dC94bWwifSl9O2t0LmZldGNoWE1MPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcga3QodCkuZmV0Y2hYTUwoKX07a3QucHJvdG90eXBlLmZldGNoSnNvbnA9ZnVuY3Rpb24odCl7dD14KHQsImNhbGxiYWNrIiksSG0odGhpcy5yZXF1ZXN0KTtsZXQgZTtkbyBlPWBsb2FkSnNvbnAke00ubmV4dFJhbmRvbU51bWJlcigpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIsOCl9YDt3aGlsZShoKHdpbmRvd1tlXSkpO3JldHVybiB4QSh0aGlzLHQsZSl9O2t0LmZldGNoSnNvbnA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBrdCh0KS5mZXRjaEpzb25wKHQuY2FsbGJhY2tQYXJhbWV0ZXJOYW1lKX07a3QucHJvdG90eXBlLl9tYWtlUmVxdWVzdD1mdW5jdGlvbih0KXtsZXQgZT10aGlzO0htKGUucmVxdWVzdCk7bGV0IG49ZS5yZXF1ZXN0LG89ZS51cmw7bi51cmw9byxuLnJlcXVlc3RGdW5jdGlvbj1mdW5jdGlvbigpe2xldCBpPXQucmVzcG9uc2VUeXBlLHM9X3IodC5oZWFkZXJzLGUuaGVhZGVycyksZj10Lm92ZXJyaWRlTWltZVR5cGUsdT10Lm1ldGhvZCxjPXQuZGF0YSxsPWpzKCkscD1rdC5fSW1wbGVtZW50YXRpb25zLmxvYWRXaXRoWGhyKG8saSx1LGMscyxsLGYpO3JldHVybiBoKHApJiZoKHAuYWJvcnQpJiYobi5jYW5jZWxGdW5jdGlvbj1mdW5jdGlvbigpe3AuYWJvcnQoKX0pLGwucHJvbWlzZX07bGV0IHI9ZnAucmVxdWVzdChuKTtpZihoKHIpKXJldHVybiByLnRoZW4oZnVuY3Rpb24oaSl7cmV0dXJuIG4uY2FuY2VsRnVuY3Rpb249dm9pZCAwLGl9KS5jYXRjaChmdW5jdGlvbihpKXtyZXR1cm4gbi5jYW5jZWxGdW5jdGlvbj12b2lkIDAsbi5zdGF0ZSE9PVNuLkZBSUxFRD9Qcm9taXNlLnJlamVjdChpKTplLnJldHJ5T25FcnJvcihpKS50aGVuKGZ1bmN0aW9uKHMpe3JldHVybiBzPyhuLnN0YXRlPVNuLlVOSVNTVUVELG4uZGVmZXJyZWQ9dm9pZCAwLGUuZmV0Y2godCkpOlByb21pc2UucmVqZWN0KGkpfSl9KX07Q3g9L15kYXRhOiguKj8pKDtiYXNlNjQpPywoLiopJC87a3QucHJvdG90eXBlLmZldGNoPWZ1bmN0aW9uKHQpe3JldHVybiB0PW5pKHQse30pLHQubWV0aG9kPSJHRVQiLHRoaXMuX21ha2VSZXF1ZXN0KHQpfTtrdC5mZXRjaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGt0KHQpLmZldGNoKHtyZXNwb25zZVR5cGU6dC5yZXNwb25zZVR5cGUsb3ZlcnJpZGVNaW1lVHlwZTp0Lm92ZXJyaWRlTWltZVR5cGV9KX07a3QucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdD1uaSh0LHt9KSx0Lm1ldGhvZD0iREVMRVRFIix0aGlzLl9tYWtlUmVxdWVzdCh0KX07a3QuZGVsZXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcga3QodCkuZGVsZXRlKHtyZXNwb25zZVR5cGU6dC5yZXNwb25zZVR5cGUsb3ZlcnJpZGVNaW1lVHlwZTp0Lm92ZXJyaWRlTWltZVR5cGUsZGF0YTp0LmRhdGF9KX07a3QucHJvdG90eXBlLmhlYWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bmkodCx7fSksdC5tZXRob2Q9IkhFQUQiLHRoaXMuX21ha2VSZXF1ZXN0KHQpfTtrdC5oZWFkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcga3QodCkuaGVhZCh7cmVzcG9uc2VUeXBlOnQucmVzcG9uc2VUeXBlLG92ZXJyaWRlTWltZVR5cGU6dC5vdmVycmlkZU1pbWVUeXBlfSl9O2t0LnByb3RvdHlwZS5vcHRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiB0PW5pKHQse30pLHQubWV0aG9kPSJPUFRJT05TIix0aGlzLl9tYWtlUmVxdWVzdCh0KX07a3Qub3B0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGt0KHQpLm9wdGlvbnMoe3Jlc3BvbnNlVHlwZTp0LnJlc3BvbnNlVHlwZSxvdmVycmlkZU1pbWVUeXBlOnQub3ZlcnJpZGVNaW1lVHlwZX0pfTtrdC5wcm90b3R5cGUucG9zdD1mdW5jdGlvbih0LGUpe3JldHVybiB5LmRlZmluZWQoImRhdGEiLHQpLGU9bmkoZSx7fSksZS5tZXRob2Q9IlBPU1QiLGUuZGF0YT10LHRoaXMuX21ha2VSZXF1ZXN0KGUpfTtrdC5wb3N0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcga3QodCkucG9zdCh0LmRhdGEse3Jlc3BvbnNlVHlwZTp0LnJlc3BvbnNlVHlwZSxvdmVycmlkZU1pbWVUeXBlOnQub3ZlcnJpZGVNaW1lVHlwZX0pfTtrdC5wcm90b3R5cGUucHV0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkuZGVmaW5lZCgiZGF0YSIsdCksZT1uaShlLHt9KSxlLm1ldGhvZD0iUFVUIixlLmRhdGE9dCx0aGlzLl9tYWtlUmVxdWVzdChlKX07a3QucHV0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcga3QodCkucHV0KHQuZGF0YSx7cmVzcG9uc2VUeXBlOnQucmVzcG9uc2VUeXBlLG92ZXJyaWRlTWltZVR5cGU6dC5vdmVycmlkZU1pbWVUeXBlfSl9O2t0LnByb3RvdHlwZS5wYXRjaD1mdW5jdGlvbih0LGUpe3JldHVybiB5LmRlZmluZWQoImRhdGEiLHQpLGU9bmkoZSx7fSksZS5tZXRob2Q9IlBBVENIIixlLmRhdGE9dCx0aGlzLl9tYWtlUmVxdWVzdChlKX07a3QucGF0Y2g9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBrdCh0KS5wYXRjaCh0LmRhdGEse3Jlc3BvbnNlVHlwZTp0LnJlc3BvbnNlVHlwZSxvdmVycmlkZU1pbWVUeXBlOnQub3ZlcnJpZGVNaW1lVHlwZX0pfTtrdC5fSW1wbGVtZW50YXRpb25zPXt9O2t0Ll9JbXBsZW1lbnRhdGlvbnMubG9hZEltYWdlRWxlbWVudD1mdW5jdGlvbih0LGUsbil7bGV0IG89bmV3IEltYWdlO28ub25sb2FkPWZ1bmN0aW9uKCl7by5uYXR1cmFsV2lkdGg9PT0wJiZvLm5hdHVyYWxIZWlnaHQ9PT0wJiZvLndpZHRoPT09MCYmby5oZWlnaHQ9PT0wJiYoby53aWR0aD0zMDAsby5oZWlnaHQ9MTUwKSxuLnJlc29sdmUobyl9LG8ub25lcnJvcj1mdW5jdGlvbihyKXtuLnJlamVjdChyKX0sZSYmKHptLmNvbnRhaW5zKHQpP28uY3Jvc3NPcmlnaW49InVzZS1jcmVkZW50aWFscyI6by5jcm9zc09yaWdpbj0iIiksby5zcmM9dH07a3QuX0ltcGxlbWVudGF0aW9ucy5jcmVhdGVJbWFnZT1mdW5jdGlvbih0LGUsbixvLHIsaSl7bGV0IHM9dC51cmw7a3Quc3VwcG9ydHNJbWFnZUJpdG1hcE9wdGlvbnMoKS50aGVuKGZ1bmN0aW9uKGYpe2lmKCEoZiYmaSkpe2t0Ll9JbXBsZW1lbnRhdGlvbnMubG9hZEltYWdlRWxlbWVudChzLGUsbik7cmV0dXJufWxldCB1PSJibG9iIixjPSJHRVQiLGw9anMoKSxwPWt0Ll9JbXBsZW1lbnRhdGlvbnMubG9hZFdpdGhYaHIocyx1LGMsdm9pZCAwLHZvaWQgMCxsLHZvaWQgMCx2b2lkIDAsdm9pZCAwKTtyZXR1cm4gaChwKSYmaChwLmFib3J0KSYmKHQuY2FuY2VsRnVuY3Rpb249ZnVuY3Rpb24oKXtwLmFib3J0KCl9KSxsLnByb21pc2UudGhlbihmdW5jdGlvbihkKXtpZighaChkKSl7bi5yZWplY3QobmV3IEFlKGBTdWNjZXNzZnVsbHkgcmV0cmlldmVkICR7c30gYnV0IGl0IGNvbnRhaW5lZCBubyBjb250ZW50LmApKTtyZXR1cm59cmV0dXJuIGt0LmNyZWF0ZUltYWdlQml0bWFwRnJvbUJsb2IoZCx7ZmxpcFk6byxwcmVtdWx0aXBseUFscGhhOiExLHNraXBDb2xvclNwYWNlQ29udmVyc2lvbjpyfSl9KS50aGVuKGZ1bmN0aW9uKGQpe24ucmVzb2x2ZShkKX0pfSkuY2F0Y2goZnVuY3Rpb24oZil7bi5yZWplY3QoZil9KX07a3QuY3JlYXRlSW1hZ2VCaXRtYXBGcm9tQmxvYj1mdW5jdGlvbih0LGUpe3JldHVybiB5LmRlZmluZWQoIm9wdGlvbnMiLGUpLHkudHlwZU9mLmJvb2woIm9wdGlvbnMuZmxpcFkiLGUuZmxpcFkpLHkudHlwZU9mLmJvb2woIm9wdGlvbnMucHJlbXVsdGlwbHlBbHBoYSIsZS5wcmVtdWx0aXBseUFscGhhKSx5LnR5cGVPZi5ib29sKCJvcHRpb25zLnNraXBDb2xvclNwYWNlQ29udmVyc2lvbiIsZS5za2lwQ29sb3JTcGFjZUNvbnZlcnNpb24pLGNyZWF0ZUltYWdlQml0bWFwKHQse2ltYWdlT3JpZW50YXRpb246ZS5mbGlwWT8iZmxpcFkiOiJub25lIixwcmVtdWx0aXBseUFscGhhOmUucHJlbXVsdGlwbHlBbHBoYT8icHJlbXVsdGlwbHkiOiJub25lIixjb2xvclNwYWNlQ29udmVyc2lvbjplLnNraXBDb2xvclNwYWNlQ29udmVyc2lvbj8ibm9uZSI6ImRlZmF1bHQifSl9O014PXR5cGVvZiBYTUxIdHRwUmVxdWVzdD4idSI7a3QuX0ltcGxlbWVudGF0aW9ucy5sb2FkV2l0aFhocj1mdW5jdGlvbih0LGUsbixvLHIsaSxzKXtsZXQgZj1DeC5leGVjKHQpO2lmKGYhPT1udWxsKXtpLnJlc29sdmUoeHgoZixlKSk7cmV0dXJufWlmKE14KXtQeCh0LGUsbixvLHIsaSxzKTtyZXR1cm59bGV0IHU9bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKHptLmNvbnRhaW5zKHQpJiYodS53aXRoQ3JlZGVudGlhbHM9ITApLHUub3BlbihuLHQsITApLGgocykmJmgodS5vdmVycmlkZU1pbWVUeXBlKSYmdS5vdmVycmlkZU1pbWVUeXBlKHMpLGgocikpZm9yKGxldCBsIGluIHIpci5oYXNPd25Qcm9wZXJ0eShsKSYmdS5zZXRSZXF1ZXN0SGVhZGVyKGwscltsXSk7aChlKSYmKHUucmVzcG9uc2VUeXBlPWUpO2xldCBjPSExO3JldHVybiB0eXBlb2YgdD09InN0cmluZyImJihjPXQuaW5kZXhPZigiZmlsZTovLyIpPT09MHx8dHlwZW9mIHdpbmRvdzwidSImJndpbmRvdy5sb2NhdGlvbi5vcmlnaW49PT0iZmlsZTovLyIpLHUub25sb2FkPWZ1bmN0aW9uKCl7aWYoKHUuc3RhdHVzPDIwMHx8dS5zdGF0dXM+PTMwMCkmJiEoYyYmdS5zdGF0dXM9PT0wKSl7aS5yZWplY3QobmV3IHVmKHUuc3RhdHVzLHUucmVzcG9uc2UsdS5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpO3JldHVybn1sZXQgbD11LnJlc3BvbnNlLHA9dS5yZXNwb25zZVR5cGU7aWYobj09PSJIRUFEInx8bj09PSJPUFRJT05TIil7bGV0IG09dS5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS50cmltKCkuc3BsaXQoL1tcclxuXSsvKSxfPXt9O20uZm9yRWFjaChmdW5jdGlvbihnKXtsZXQgYj1nLnNwbGl0KCI6ICIpLHc9Yi5zaGlmdCgpO19bd109Yi5qb2luKCI6ICIpfSksaS5yZXNvbHZlKF8pO3JldHVybn1pZih1LnN0YXR1cz09PTIwNClpLnJlc29sdmUodm9pZCAwKTtlbHNlIGlmKGgobCkmJighaChlKXx8cD09PWUpKWkucmVzb2x2ZShsKTtlbHNlIGlmKGU9PT0ianNvbiImJnR5cGVvZiBsPT0ic3RyaW5nIil0cnl7aS5yZXNvbHZlKEpTT04ucGFyc2UobCkpfWNhdGNoKGQpe2kucmVqZWN0KGQpfWVsc2UocD09PSIifHxwPT09ImRvY3VtZW50IikmJmgodS5yZXNwb25zZVhNTCkmJnUucmVzcG9uc2VYTUwuaGFzQ2hpbGROb2RlcygpP2kucmVzb2x2ZSh1LnJlc3BvbnNlWE1MKToocD09PSIifHxwPT09InRleHQiKSYmaCh1LnJlc3BvbnNlVGV4dCk/aS5yZXNvbHZlKHUucmVzcG9uc2VUZXh0KTppLnJlamVjdChuZXcgQWUoIkludmFsaWQgWE1MSHR0cFJlcXVlc3QgcmVzcG9uc2UgdHlwZS4iKSl9LHUub25lcnJvcj1mdW5jdGlvbihsKXtpLnJlamVjdChuZXcgdWYpfSx1LnNlbmQobyksdX07a3QuX0ltcGxlbWVudGF0aW9ucy5sb2FkQW5kRXhlY3V0ZVNjcmlwdD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGVBKHQsZSkuY2F0Y2goZnVuY3Rpb24obyl7bi5yZWplY3Qobyl9KX07a3QuX0RlZmF1bHRJbXBsZW1lbnRhdGlvbnM9e307a3QuX0RlZmF1bHRJbXBsZW1lbnRhdGlvbnMuY3JlYXRlSW1hZ2U9a3QuX0ltcGxlbWVudGF0aW9ucy5jcmVhdGVJbWFnZTtrdC5fRGVmYXVsdEltcGxlbWVudGF0aW9ucy5sb2FkV2l0aFhocj1rdC5fSW1wbGVtZW50YXRpb25zLmxvYWRXaXRoWGhyO2t0Ll9EZWZhdWx0SW1wbGVtZW50YXRpb25zLmxvYWRBbmRFeGVjdXRlU2NyaXB0PWt0Ll9JbXBsZW1lbnRhdGlvbnMubG9hZEFuZEV4ZWN1dGVTY3JpcHQ7a3QuREVGQVVMVD1PYmplY3QuZnJlZXplKG5ldyBrdCh7dXJsOnR5cGVvZiBkb2N1bWVudD4idSI/IiI6ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5zcGxpdCgiPyIpWzBdfSkpO29pPWt0fSk7ZnVuY3Rpb24gaGYodCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpLHRoaXMuX2RhdGVzPXZvaWQgMCx0aGlzLl9zYW1wbGVzPXZvaWQgMCx0aGlzLl9kYXRlQ29sdW1uPS0xLHRoaXMuX3hQb2xlV2FuZGVyUmFkaWFuc0NvbHVtbj0tMSx0aGlzLl95UG9sZVdhbmRlclJhZGlhbnNDb2x1bW49LTEsdGhpcy5fdXQxTWludXNVdGNTZWNvbmRzQ29sdW1uPS0xLHRoaXMuX3hDZWxlc3RpYWxQb2xlT2Zmc2V0UmFkaWFuc0NvbHVtbj0tMSx0aGlzLl95Q2VsZXN0aWFsUG9sZU9mZnNldFJhZGlhbnNDb2x1bW49LTEsdGhpcy5fdGFpTWludXNVdGNTZWNvbmRzQ29sdW1uPS0xLHRoaXMuX2NvbHVtbkNvdW50PTAsdGhpcy5fbGFzdEluZGV4PS0xLHRoaXMuX2FkZE5ld0xlYXBTZWNvbmRzPXgodC5hZGROZXdMZWFwU2Vjb25kcywhMCksaCh0LmRhdGEpP1BBKHRoaXMsdC5kYXRhKTpQQSh0aGlzLHtjb2x1bW5OYW1lczpbImRhdGVJc284NjAxIiwibW9kaWZpZWRKdWxpYW5EYXRlVXRjIiwieFBvbGVXYW5kZXJSYWRpYW5zIiwieVBvbGVXYW5kZXJSYWRpYW5zIiwidXQxTWludXNVdGNTZWNvbmRzIiwibGVuZ3RoT2ZEYXlDb3JyZWN0aW9uU2Vjb25kcyIsInhDZWxlc3RpYWxQb2xlT2Zmc2V0UmFkaWFucyIsInlDZWxlc3RpYWxQb2xlT2Zmc2V0UmFkaWFucyIsInRhaU1pbnVzVXRjU2Vjb25kcyJdLHNhbXBsZXM6W119KX1mdW5jdGlvbiBOeCh0LGUpe3JldHVybiByby5jb21wYXJlKHQuanVsaWFuRGF0ZSxlKX1mdW5jdGlvbiBQQSh0LGUpe2lmKCFoKGUuY29sdW1uTmFtZXMpKXRocm93IG5ldyBBZSgiRXJyb3IgaW4gbG9hZGVkIEVPUCBkYXRhOiBUaGUgY29sdW1uTmFtZXMgcHJvcGVydHkgaXMgcmVxdWlyZWQuIik7aWYoIWgoZS5zYW1wbGVzKSl0aHJvdyBuZXcgQWUoIkVycm9yIGluIGxvYWRlZCBFT1AgZGF0YTogVGhlIHNhbXBsZXMgcHJvcGVydHkgaXMgcmVxdWlyZWQuIik7bGV0IG49ZS5jb2x1bW5OYW1lcy5pbmRleE9mKCJtb2RpZmllZEp1bGlhbkRhdGVVdGMiKSxvPWUuY29sdW1uTmFtZXMuaW5kZXhPZigieFBvbGVXYW5kZXJSYWRpYW5zIikscj1lLmNvbHVtbk5hbWVzLmluZGV4T2YoInlQb2xlV2FuZGVyUmFkaWFucyIpLGk9ZS5jb2x1bW5OYW1lcy5pbmRleE9mKCJ1dDFNaW51c1V0Y1NlY29uZHMiKSxzPWUuY29sdW1uTmFtZXMuaW5kZXhPZigieENlbGVzdGlhbFBvbGVPZmZzZXRSYWRpYW5zIiksZj1lLmNvbHVtbk5hbWVzLmluZGV4T2YoInlDZWxlc3RpYWxQb2xlT2Zmc2V0UmFkaWFucyIpLHU9ZS5jb2x1bW5OYW1lcy5pbmRleE9mKCJ0YWlNaW51c1V0Y1NlY29uZHMiKTtpZihuPDB8fG88MHx8cjwwfHxpPDB8fHM8MHx8ZjwwfHx1PDApdGhyb3cgbmV3IEFlKCJFcnJvciBpbiBsb2FkZWQgRU9QIGRhdGE6IFRoZSBjb2x1bW5OYW1lcyBwcm9wZXJ0eSBtdXN0IGluY2x1ZGUgbW9kaWZpZWRKdWxpYW5EYXRlVXRjLCB4UG9sZVdhbmRlclJhZGlhbnMsIHlQb2xlV2FuZGVyUmFkaWFucywgdXQxTWludXNVdGNTZWNvbmRzLCB4Q2VsZXN0aWFsUG9sZU9mZnNldFJhZGlhbnMsIHlDZWxlc3RpYWxQb2xlT2Zmc2V0UmFkaWFucywgYW5kIHRhaU1pbnVzVXRjU2Vjb25kcyBjb2x1bW5zIik7bGV0IGM9dC5fc2FtcGxlcz1lLnNhbXBsZXMsbD10Ll9kYXRlcz1bXTt0Ll9kYXRlQ29sdW1uPW4sdC5feFBvbGVXYW5kZXJSYWRpYW5zQ29sdW1uPW8sdC5feVBvbGVXYW5kZXJSYWRpYW5zQ29sdW1uPXIsdC5fdXQxTWludXNVdGNTZWNvbmRzQ29sdW1uPWksdC5feENlbGVzdGlhbFBvbGVPZmZzZXRSYWRpYW5zQ29sdW1uPXMsdC5feUNlbGVzdGlhbFBvbGVPZmZzZXRSYWRpYW5zQ29sdW1uPWYsdC5fdGFpTWludXNVdGNTZWNvbmRzQ29sdW1uPXUsdC5fY29sdW1uQ291bnQ9ZS5jb2x1bW5OYW1lcy5sZW5ndGgsdC5fbGFzdEluZGV4PXZvaWQgMDtsZXQgcCxkPXQuX2FkZE5ld0xlYXBTZWNvbmRzO2ZvcihsZXQgbT0wLF89Yy5sZW5ndGg7bTxfO20rPXQuX2NvbHVtbkNvdW50KXtsZXQgZz1jW20rbl0sYj1jW20rdV0sdz1nK19uLk1PRElGSUVEX0pVTElBTl9EQVRFX0RJRkZFUkVOQ0UsTz1uZXcgcm8odyxiLE9lLlRBSSk7aWYobC5wdXNoKE8pLGQpe2lmKGIhPT1wJiZoKHApKXtsZXQgRT1yby5sZWFwU2Vjb25kcyxUPUdzKEUsTyxOeCk7aWYoVDwwKXtsZXQgQz1uZXcgV2UoTyxiKTtFLnNwbGljZSh+VCwwLEMpfX1wPWJ9fX1mdW5jdGlvbiBNQSh0LGUsbixvLHIpe2xldCBpPW4qbztyLnhQb2xlV2FuZGVyPWVbaSt0Ll94UG9sZVdhbmRlclJhZGlhbnNDb2x1bW5dLHIueVBvbGVXYW5kZXI9ZVtpK3QuX3lQb2xlV2FuZGVyUmFkaWFuc0NvbHVtbl0sci54UG9sZU9mZnNldD1lW2krdC5feENlbGVzdGlhbFBvbGVPZmZzZXRSYWRpYW5zQ29sdW1uXSxyLnlQb2xlT2Zmc2V0PWVbaSt0Ll95Q2VsZXN0aWFsUG9sZU9mZnNldFJhZGlhbnNDb2x1bW5dLHIudXQxTWludXNVdGM9ZVtpK3QuX3V0MU1pbnVzVXRjU2Vjb25kc0NvbHVtbl19ZnVuY3Rpb24gbWYodCxlLG4pe3JldHVybiBlK3QqKG4tZSl9ZnVuY3Rpb24gTkEodCxlLG4sbyxyLGkscyl7bGV0IGY9dC5fY29sdW1uQ291bnQ7aWYoaT5lLmxlbmd0aC0xKXJldHVybiBzLnhQb2xlV2FuZGVyPTAscy55UG9sZVdhbmRlcj0wLHMueFBvbGVPZmZzZXQ9MCxzLnlQb2xlT2Zmc2V0PTAscy51dDFNaW51c1V0Yz0wLHM7bGV0IHU9ZVtyXSxjPWVbaV07aWYodS5lcXVhbHMoYyl8fG8uZXF1YWxzKHUpKXJldHVybiBNQSh0LG4scixmLHMpLHM7aWYoby5lcXVhbHMoYykpcmV0dXJuIE1BKHQsbixpLGYscykscztsZXQgbD1yby5zZWNvbmRzRGlmZmVyZW5jZShvLHUpL3JvLnNlY29uZHNEaWZmZXJlbmNlKGMsdSkscD1yKmYsZD1pKmYsbT1uW3ArdC5fdXQxTWludXNVdGNTZWNvbmRzQ29sdW1uXSxfPW5bZCt0Ll91dDFNaW51c1V0Y1NlY29uZHNDb2x1bW5dLGc9Xy1tO2lmKGc+LjV8fGc8LS41KXtsZXQgYj1uW3ArdC5fdGFpTWludXNVdGNTZWNvbmRzQ29sdW1uXSx3PW5bZCt0Ll90YWlNaW51c1V0Y1NlY29uZHNDb2x1bW5dO2IhPT13JiYoYy5lcXVhbHMobyk/bT1fOl8tPXctYil9cmV0dXJuIHMueFBvbGVXYW5kZXI9bWYobCxuW3ArdC5feFBvbGVXYW5kZXJSYWRpYW5zQ29sdW1uXSxuW2QrdC5feFBvbGVXYW5kZXJSYWRpYW5zQ29sdW1uXSkscy55UG9sZVdhbmRlcj1tZihsLG5bcCt0Ll95UG9sZVdhbmRlclJhZGlhbnNDb2x1bW5dLG5bZCt0Ll95UG9sZVdhbmRlclJhZGlhbnNDb2x1bW5dKSxzLnhQb2xlT2Zmc2V0PW1mKGwsbltwK3QuX3hDZWxlc3RpYWxQb2xlT2Zmc2V0UmFkaWFuc0NvbHVtbl0sbltkK3QuX3hDZWxlc3RpYWxQb2xlT2Zmc2V0UmFkaWFuc0NvbHVtbl0pLHMueVBvbGVPZmZzZXQ9bWYobCxuW3ArdC5feUNlbGVzdGlhbFBvbGVPZmZzZXRSYWRpYW5zQ29sdW1uXSxuW2QrdC5feUNlbGVzdGlhbFBvbGVPZmZzZXRSYWRpYW5zQ29sdW1uXSkscy51dDFNaW51c1V0Yz1tZihsLG0sXyksc312YXIgSUEsdkE9WigoKT0+e3htKCk7WHQoKTtJdCgpO2Z0KCk7UG0oKTtRbCgpO05tKCk7ZGYoKTtKcigpO0tsKCk7V2woKTtoZi5mcm9tVXJsPWFzeW5jIGZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJ1cmwiLHQpLGU9eChlLHguRU1QVFlfT0JKRUNUKTtsZXQgbj1vaS5jcmVhdGVJZk5lZWRlZCh0KSxvO3RyeXtvPWF3YWl0IG4uZmV0Y2hKc29uKCl9Y2F0Y2h7dGhyb3cgbmV3IEFlKGBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSByZXRyaWV2aW5nIHRoZSBFT1AgZGF0YSBmcm9tIHRoZSBVUkwgJHtuLnVybH0uYCl9cmV0dXJuIG5ldyBoZih7YWRkTmV3TGVhcFNlY29uZHM6ZS5hZGROZXdMZWFwU2Vjb25kcyxkYXRhOm99KX07aGYuTk9ORT1PYmplY3QuZnJlZXplKHtjb21wdXRlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgoZSk/KGUueFBvbGVXYW5kZXI9MCxlLnlQb2xlV2FuZGVyPTAsZS54UG9sZU9mZnNldD0wLGUueVBvbGVPZmZzZXQ9MCxlLnV0MU1pbnVzVXRjPTApOmU9bmV3IGNmKDAsMCwwLDAsMCksZX19KTtoZi5wcm90b3R5cGUuY29tcHV0ZT1mdW5jdGlvbih0LGUpe2lmKCFoKHRoaXMuX3NhbXBsZXMpKXJldHVybjtpZihoKGUpfHwoZT1uZXcgY2YoMCwwLDAsMCwwKSksdGhpcy5fc2FtcGxlcy5sZW5ndGg9PT0wKXJldHVybiBlLnhQb2xlV2FuZGVyPTAsZS55UG9sZVdhbmRlcj0wLGUueFBvbGVPZmZzZXQ9MCxlLnlQb2xlT2Zmc2V0PTAsZS51dDFNaW51c1V0Yz0wLGU7bGV0IG49dGhpcy5fZGF0ZXMsbz10aGlzLl9sYXN0SW5kZXgscj0wLGk9MDtpZihoKG8pKXtsZXQgZj1uW29dLHU9bltvKzFdLGM9cm8ubGVzc1RoYW5PckVxdWFscyhmLHQpLGw9IWgodSkscD1sfHxyby5ncmVhdGVyVGhhbk9yRXF1YWxzKHUsdCk7aWYoYyYmcClyZXR1cm4gcj1vLCFsJiZ1LmVxdWFscyh0KSYmKytyLGk9cisxLE5BKHRoaXMsbix0aGlzLl9zYW1wbGVzLHQscixpLGUpLGV9bGV0IHM9R3Mobix0LHJvLmNvbXBhcmUsdGhpcy5fZGF0ZUNvbHVtbik7cmV0dXJuIHM+PTA/KHM8bi5sZW5ndGgtMSYmbltzKzFdLmVxdWFscyh0KSYmKytzLHI9cyxpPXMpOihpPX5zLHI9aS0xLHI8MCYmKHI9MCkpLHRoaXMuX2xhc3RJbmRleD1yLE5BKHRoaXMsbix0aGlzLl9zYW1wbGVzLHQscixpLGUpLGV9O0lBPWhmfSk7ZnVuY3Rpb24gd28odCxlLG4pe3RoaXMuaGVhZGluZz14KHQsMCksdGhpcy5waXRjaD14KGUsMCksdGhpcy5yb2xsPXgobiwwKX12YXIgcW0sTEE9WigoKT0+e0l0KCk7ZnQoKTtIdCgpO1d0KCk7d28uZnJvbVF1YXRlcm5pb249ZnVuY3Rpb24odCxlKXtpZighaCh0KSl0aHJvdyBuZXcgRigicXVhdGVybmlvbiBpcyByZXF1aXJlZCIpO2goZSl8fChlPW5ldyB3byk7bGV0IG49MioodC53KnQueS10LnoqdC54KSxvPTEtMioodC54KnQueCt0LnkqdC55KSxyPTIqKHQudyp0LngrdC55KnQueiksaT0xLTIqKHQueSp0LnkrdC56KnQueikscz0yKih0LncqdC56K3QueCp0LnkpO3JldHVybiBlLmhlYWRpbmc9LU1hdGguYXRhbjIocyxpKSxlLnJvbGw9TWF0aC5hdGFuMihyLG8pLGUucGl0Y2g9LU0uYXNpbkNsYW1wZWQobiksZX07d28uZnJvbURlZ3JlZXM9ZnVuY3Rpb24odCxlLG4sbyl7aWYoIWgodCkpdGhyb3cgbmV3IEYoImhlYWRpbmcgaXMgcmVxdWlyZWQiKTtpZighaChlKSl0aHJvdyBuZXcgRigicGl0Y2ggaXMgcmVxdWlyZWQiKTtpZighaChuKSl0aHJvdyBuZXcgRigicm9sbCBpcyByZXF1aXJlZCIpO3JldHVybiBoKG8pfHwobz1uZXcgd28pLG8uaGVhZGluZz10Kk0uUkFESUFOU19QRVJfREVHUkVFLG8ucGl0Y2g9ZSpNLlJBRElBTlNfUEVSX0RFR1JFRSxvLnJvbGw9bipNLlJBRElBTlNfUEVSX0RFR1JFRSxvfTt3by5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKGgodCkpcmV0dXJuIGgoZSk/KGUuaGVhZGluZz10LmhlYWRpbmcsZS5waXRjaD10LnBpdGNoLGUucm9sbD10LnJvbGwsZSk6bmV3IHdvKHQuaGVhZGluZyx0LnBpdGNoLHQucm9sbCl9O3dvLmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8aCh0KSYmaChlKSYmdC5oZWFkaW5nPT09ZS5oZWFkaW5nJiZ0LnBpdGNoPT09ZS5waXRjaCYmdC5yb2xsPT09ZS5yb2xsfTt3by5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiB0PT09ZXx8aCh0KSYmaChlKSYmTS5lcXVhbHNFcHNpbG9uKHQuaGVhZGluZyxlLmhlYWRpbmcsbixvKSYmTS5lcXVhbHNFcHNpbG9uKHQucGl0Y2gsZS5waXRjaCxuLG8pJiZNLmVxdWFsc0Vwc2lsb24odC5yb2xsLGUucm9sbCxuLG8pfTt3by5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIHdvLmNsb25lKHRoaXMsdCl9O3dvLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIHdvLmVxdWFscyh0aGlzLHQpfTt3by5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHdvLmVxdWFsc0Vwc2lsb24odGhpcyx0LGUsbil9O3dvLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzLmhlYWRpbmd9LCAke3RoaXMucGl0Y2h9LCAke3RoaXMucm9sbH0pYH07cW09d299KTtmdW5jdGlvbiBJeCgpe2xldCB0PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKTtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjsrK2Upe2xldCBvPXRbZV0uZ2V0QXR0cmlidXRlKCJzcmMiKSxyPUZBLmV4ZWMobyk7aWYociE9PW51bGwpcmV0dXJuIHJbMV19fWZ1bmN0aW9uIEJBKHQpe3JldHVybiB0eXBlb2YgZG9jdW1lbnQ+InUiP3Q6KGgocHApfHwocHA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpKSxwcC5ocmVmPXQscHAuaHJlZil9ZnVuY3Rpb24gVUEoKXtpZihoKEtzKSlyZXR1cm4gS3M7bGV0IHQ7aWYodHlwZW9mIENFU0lVTV9CQVNFX1VSTDwidSI/dD1DRVNJVU1fQkFTRV9VUkw6aChEQT8udXJsKT90PWZmKCIuIixEQS51cmwpOnR5cGVvZiBkZWZpbmU9PSJvYmplY3QiJiZoKGRlZmluZS5hbWQpJiYhZGVmaW5lLmFtZC50b1VybFVuZGVmaW5lZCYmaChkci50b1VybCk/dD1mZigiLi4iLFdzKCJDb3JlL2J1aWxkTW9kdWxlVXJsLmpzIikpOnQ9SXgoKSwhaCh0KSl0aHJvdyBuZXcgRigiVW5hYmxlIHRvIGRldGVybWluZSBDZXNpdW0gYmFzZSBVUkwgYXV0b21hdGljYWxseSwgdHJ5IGRlZmluaW5nIGEgZ2xvYmFsIHZhcmlhYmxlIGNhbGxlZCBDRVNJVU1fQkFTRV9VUkwuIik7cmV0dXJuIEtzPW5ldyBvaSh7dXJsOkJBKHQpfSksS3MuYXBwZW5kRm9yd2FyZFNsYXNoKCksS3N9ZnVuY3Rpb24gdngodCl7cmV0dXJuIEJBKGRyLnRvVXJsKGAuLi8ke3R9YCkpfWZ1bmN0aW9uIFZBKHQpe3JldHVybiBVQSgpLmdldERlcml2ZWRSZXNvdXJjZSh7dXJsOnR9KS51cmx9ZnVuY3Rpb24gV3ModCl7cmV0dXJuIGgoZHApfHwodHlwZW9mIGRlZmluZT09Im9iamVjdCImJmgoZGVmaW5lLmFtZCkmJiFkZWZpbmUuYW1kLnRvVXJsVW5kZWZpbmVkJiZoKGRyLnRvVXJsKT9kcD12eDpkcD1WQSksZHAodCl9dmFyIERBLEZBLHBwLEtzLGRwLG1wLEttPVooKCk9PntmdCgpO0h0KCk7Qm0oKTtkZigpO0RBPXt9LEZBPS8oKD86LipcLyl8XilDZXNpdW1cLmpzKD86XD98XCN8JCkvO1dzLl9jZXNpdW1TY3JpcHRSZWdleD1GQTtXcy5fYnVpbGRNb2R1bGVVcmxGcm9tQmFzZVVybD1WQTtXcy5fY2xlYXJCYXNlUmVzb3VyY2U9ZnVuY3Rpb24oKXtLcz12b2lkIDB9O1dzLnNldEJhc2VVcmw9ZnVuY3Rpb24odCl7S3M9b2kuREVGQVVMVC5nZXREZXJpdmVkUmVzb3VyY2Uoe3VybDp0fSl9O1dzLmdldENlc2l1bUJhc2VVcmw9VUE7bXA9V3N9KTtmdW5jdGlvbiBMeCh0LGUsbil7dGhpcy54PXQsdGhpcy55PWUsdGhpcy5zPW59dmFyIGhwLFdtPVooKCk9PntocD1MeH0pO2Z1bmN0aW9uICRtKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKSx0aGlzLl94eXNGaWxlVXJsVGVtcGxhdGU9b2kuY3JlYXRlSWZOZWVkZWQodC54eXNGaWxlVXJsVGVtcGxhdGUpLHRoaXMuX2ludGVycG9sYXRpb25PcmRlcj14KHQuaW50ZXJwb2xhdGlvbk9yZGVyLDkpLHRoaXMuX3NhbXBsZVplcm9KdWxpYW5FcGhlbWVyaXNEYXRlPXgodC5zYW1wbGVaZXJvSnVsaWFuRXBoZW1lcmlzRGF0ZSwyNDQyMzk2NWUtMSksdGhpcy5fc2FtcGxlWmVyb0RhdGVUVD1uZXcgcm8odGhpcy5fc2FtcGxlWmVyb0p1bGlhbkVwaGVtZXJpc0RhdGUsMCxPZS5UQUkpLHRoaXMuX3N0ZXBTaXplRGF5cz14KHQuc3RlcFNpemVEYXlzLDEpLHRoaXMuX3NhbXBsZXNQZXJYeXNGaWxlPXgodC5zYW1wbGVzUGVyWHlzRmlsZSwxZTMpLHRoaXMuX3RvdGFsU2FtcGxlcz14KHQudG90YWxTYW1wbGVzLDI3NDI2KSx0aGlzLl9zYW1wbGVzPW5ldyBBcnJheSh0aGlzLl90b3RhbFNhbXBsZXMqMyksdGhpcy5fY2h1bmtEb3dubG9hZHNJblByb2dyZXNzPVtdO2xldCBlPXRoaXMuX2ludGVycG9sYXRpb25PcmRlcixuPXRoaXMuX2Rlbm9taW5hdG9ycz1uZXcgQXJyYXkoZSsxKSxvPXRoaXMuX3hUYWJsZT1uZXcgQXJyYXkoZSsxKSxyPU1hdGgucG93KHRoaXMuX3N0ZXBTaXplRGF5cyxlKTtmb3IobGV0IGk9MDtpPD1lOysraSl7bltpXT1yLG9baV09aSp0aGlzLl9zdGVwU2l6ZURheXM7Zm9yKGxldCBzPTA7czw9ZTsrK3MpcyE9PWkmJihuW2ldKj1pLXMpO25baV09MS9uW2ldfXRoaXMuX3dvcms9bmV3IEFycmF5KGUrMSksdGhpcy5fY29lZj1uZXcgQXJyYXkoZSsxKX1mdW5jdGlvbiBYbSh0LGUsbil7bGV0IG89RHg7cmV0dXJuIG8uZGF5TnVtYmVyPWUsby5zZWNvbmRzT2ZEYXk9bixyby5kYXlzRGlmZmVyZW5jZShvLHQuX3NhbXBsZVplcm9EYXRlVFQpfWZ1bmN0aW9uIFltKHQsZSl7aWYodC5fY2h1bmtEb3dubG9hZHNJblByb2dyZXNzW2VdKXJldHVybiB0Ll9jaHVua0Rvd25sb2Fkc0luUHJvZ3Jlc3NbZV07bGV0IG4sbz10Ll94eXNGaWxlVXJsVGVtcGxhdGU7aChvKT9uPW8uZ2V0RGVyaXZlZFJlc291cmNlKHt0ZW1wbGF0ZVZhbHVlczp7MDplfX0pOm49bmV3IG9pKHt1cmw6bXAoYEFzc2V0cy9JQVUyMDA2X1hZUy9JQVUyMDA2X1hZU18ke2V9Lmpzb25gKX0pO2xldCByPW4uZmV0Y2hKc29uKCkudGhlbihmdW5jdGlvbihpKXt0Ll9jaHVua0Rvd25sb2Fkc0luUHJvZ3Jlc3NbZV09ITE7bGV0IHM9dC5fc2FtcGxlcyxmPWkuc2FtcGxlcyx1PWUqdC5fc2FtcGxlc1Blclh5c0ZpbGUqMztmb3IobGV0IGM9MCxsPWYubGVuZ3RoO2M8bDsrK2Mpc1t1K2NdPWZbY119KTtyZXR1cm4gdC5fY2h1bmtEb3dubG9hZHNJblByb2dyZXNzW2VdPXIscn12YXIgRHgsa0EsR0E9WigoKT0+e0ttKCk7SXQoKTtmdCgpO1dtKCk7UWwoKTtkZigpO1dsKCk7RHg9bmV3IHJvKDAsMCxPZS5UQUkpOyRtLnByb3RvdHlwZS5wcmVsb2FkPWZ1bmN0aW9uKHQsZSxuLG8pe2xldCByPVhtKHRoaXMsdCxlKSxpPVhtKHRoaXMsbixvKSxzPXIvdGhpcy5fc3RlcFNpemVEYXlzLXRoaXMuX2ludGVycG9sYXRpb25PcmRlci8yfDA7czwwJiYocz0wKTtsZXQgZj1pL3RoaXMuX3N0ZXBTaXplRGF5cy10aGlzLl9pbnRlcnBvbGF0aW9uT3JkZXIvMnwwK3RoaXMuX2ludGVycG9sYXRpb25PcmRlcjtmPj10aGlzLl90b3RhbFNhbXBsZXMmJihmPXRoaXMuX3RvdGFsU2FtcGxlcy0xKTtsZXQgdT1zL3RoaXMuX3NhbXBsZXNQZXJYeXNGaWxlfDAsYz1mL3RoaXMuX3NhbXBsZXNQZXJYeXNGaWxlfDAsbD1bXTtmb3IobGV0IHA9dTtwPD1jOysrcClsLnB1c2goWW0odGhpcyxwKSk7cmV0dXJuIFByb21pc2UuYWxsKGwpfTskbS5wcm90b3R5cGUuY29tcHV0ZVh5c1JhZGlhbnM9ZnVuY3Rpb24odCxlLG4pe2xldCBvPVhtKHRoaXMsdCxlKTtpZihvPDApcmV0dXJuO2xldCByPW8vdGhpcy5fc3RlcFNpemVEYXlzfDA7aWYocj49dGhpcy5fdG90YWxTYW1wbGVzKXJldHVybjtsZXQgaT10aGlzLl9pbnRlcnBvbGF0aW9uT3JkZXIscz1yLShpLzJ8MCk7czwwJiYocz0wKTtsZXQgZj1zK2k7Zj49dGhpcy5fdG90YWxTYW1wbGVzJiYoZj10aGlzLl90b3RhbFNhbXBsZXMtMSxzPWYtaSxzPDAmJihzPTApKTtsZXQgdT0hMSxjPXRoaXMuX3NhbXBsZXM7aWYoaChjW3MqM10pfHwoWW0odGhpcyxzL3RoaXMuX3NhbXBsZXNQZXJYeXNGaWxlfDApLHU9ITApLGgoY1tmKjNdKXx8KFltKHRoaXMsZi90aGlzLl9zYW1wbGVzUGVyWHlzRmlsZXwwKSx1PSEwKSx1KXJldHVybjtoKG4pPyhuLng9MCxuLnk9MCxuLnM9MCk6bj1uZXcgaHAoMCwwLDApO2xldCBsPW8tcyp0aGlzLl9zdGVwU2l6ZURheXMscD10aGlzLl93b3JrLGQ9dGhpcy5fZGVub21pbmF0b3JzLG09dGhpcy5fY29lZixfPXRoaXMuX3hUYWJsZSxnLGI7Zm9yKGc9MDtnPD1pOysrZylwW2ddPWwtX1tnXTtmb3IoZz0wO2c8PWk7KytnKXtmb3IobVtnXT0xLGI9MDtiPD1pOysrYiliIT09ZyYmKG1bZ10qPXBbYl0pO21bZ10qPWRbZ107bGV0IHc9KHMrZykqMztuLngrPW1bZ10qY1t3KytdLG4ueSs9bVtnXSpjW3crK10sbi5zKz1tW2ddKmNbd119cmV0dXJuIG59O2tBPSRtfSk7dmFyIG9zLE1uLEtvLHpBLGpBPVooKCk9PntmdCgpO01uPXtyZXF1ZXN0RnVsbHNjcmVlbjp2b2lkIDAsZXhpdEZ1bGxzY3JlZW46dm9pZCAwLGZ1bGxzY3JlZW5FbmFibGVkOnZvaWQgMCxmdWxsc2NyZWVuRWxlbWVudDp2b2lkIDAsZnVsbHNjcmVlbmNoYW5nZTp2b2lkIDAsZnVsbHNjcmVlbmVycm9yOnZvaWQgMH0sS289e307T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoS28se2VsZW1lbnQ6e2dldDpmdW5jdGlvbigpe2lmKEtvLnN1cHBvcnRzRnVsbHNjcmVlbigpKXJldHVybiBkb2N1bWVudFtNbi5mdWxsc2NyZWVuRWxlbWVudF19fSxjaGFuZ2VFdmVudE5hbWU6e2dldDpmdW5jdGlvbigpe2lmKEtvLnN1cHBvcnRzRnVsbHNjcmVlbigpKXJldHVybiBNbi5mdWxsc2NyZWVuY2hhbmdlfX0sZXJyb3JFdmVudE5hbWU6e2dldDpmdW5jdGlvbigpe2lmKEtvLnN1cHBvcnRzRnVsbHNjcmVlbigpKXJldHVybiBNbi5mdWxsc2NyZWVuZXJyb3J9fSxlbmFibGVkOntnZXQ6ZnVuY3Rpb24oKXtpZihLby5zdXBwb3J0c0Z1bGxzY3JlZW4oKSlyZXR1cm4gZG9jdW1lbnRbTW4uZnVsbHNjcmVlbkVuYWJsZWRdfX0sZnVsbHNjcmVlbjp7Z2V0OmZ1bmN0aW9uKCl7aWYoS28uc3VwcG9ydHNGdWxsc2NyZWVuKCkpcmV0dXJuIEtvLmVsZW1lbnQhPT1udWxsfX19KTtLby5zdXBwb3J0c0Z1bGxzY3JlZW49ZnVuY3Rpb24oKXtpZihoKG9zKSlyZXR1cm4gb3M7b3M9ITE7bGV0IHQ9ZG9jdW1lbnQuYm9keTtpZih0eXBlb2YgdC5yZXF1ZXN0RnVsbHNjcmVlbj09ImZ1bmN0aW9uIilyZXR1cm4gTW4ucmVxdWVzdEZ1bGxzY3JlZW49InJlcXVlc3RGdWxsc2NyZWVuIixNbi5leGl0RnVsbHNjcmVlbj0iZXhpdEZ1bGxzY3JlZW4iLE1uLmZ1bGxzY3JlZW5FbmFibGVkPSJmdWxsc2NyZWVuRW5hYmxlZCIsTW4uZnVsbHNjcmVlbkVsZW1lbnQ9ImZ1bGxzY3JlZW5FbGVtZW50IixNbi5mdWxsc2NyZWVuY2hhbmdlPSJmdWxsc2NyZWVuY2hhbmdlIixNbi5mdWxsc2NyZWVuZXJyb3I9ImZ1bGxzY3JlZW5lcnJvciIsb3M9ITAsb3M7bGV0IGU9WyJ3ZWJraXQiLCJtb3oiLCJvIiwibXMiLCJraHRtbCJdLG47Zm9yKGxldCBvPTAscj1lLmxlbmd0aDtvPHI7KytvKXtsZXQgaT1lW29dO249YCR7aX1SZXF1ZXN0RnVsbHNjcmVlbmAsdHlwZW9mIHRbbl09PSJmdW5jdGlvbiI/KE1uLnJlcXVlc3RGdWxsc2NyZWVuPW4sb3M9ITApOihuPWAke2l9UmVxdWVzdEZ1bGxTY3JlZW5gLHR5cGVvZiB0W25dPT0iZnVuY3Rpb24iJiYoTW4ucmVxdWVzdEZ1bGxzY3JlZW49bixvcz0hMCkpLG49YCR7aX1FeGl0RnVsbHNjcmVlbmAsdHlwZW9mIGRvY3VtZW50W25dPT0iZnVuY3Rpb24iP01uLmV4aXRGdWxsc2NyZWVuPW46KG49YCR7aX1DYW5jZWxGdWxsU2NyZWVuYCx0eXBlb2YgZG9jdW1lbnRbbl09PSJmdW5jdGlvbiImJihNbi5leGl0RnVsbHNjcmVlbj1uKSksbj1gJHtpfUZ1bGxzY3JlZW5FbmFibGVkYCxkb2N1bWVudFtuXSE9PXZvaWQgMD9Nbi5mdWxsc2NyZWVuRW5hYmxlZD1uOihuPWAke2l9RnVsbFNjcmVlbkVuYWJsZWRgLGRvY3VtZW50W25dIT09dm9pZCAwJiYoTW4uZnVsbHNjcmVlbkVuYWJsZWQ9bikpLG49YCR7aX1GdWxsc2NyZWVuRWxlbWVudGAsZG9jdW1lbnRbbl0hPT12b2lkIDA/TW4uZnVsbHNjcmVlbkVsZW1lbnQ9bjoobj1gJHtpfUZ1bGxTY3JlZW5FbGVtZW50YCxkb2N1bWVudFtuXSE9PXZvaWQgMCYmKE1uLmZ1bGxzY3JlZW5FbGVtZW50PW4pKSxuPWAke2l9ZnVsbHNjcmVlbmNoYW5nZWAsZG9jdW1lbnRbYG9uJHtufWBdIT09dm9pZCAwJiYoaT09PSJtcyImJihuPSJNU0Z1bGxzY3JlZW5DaGFuZ2UiKSxNbi5mdWxsc2NyZWVuY2hhbmdlPW4pLG49YCR7aX1mdWxsc2NyZWVuZXJyb3JgLGRvY3VtZW50W2BvbiR7bn1gXSE9PXZvaWQgMCYmKGk9PT0ibXMiJiYobj0iTVNGdWxsc2NyZWVuRXJyb3IiKSxNbi5mdWxsc2NyZWVuZXJyb3I9bil9cmV0dXJuIG9zfTtLby5yZXF1ZXN0RnVsbHNjcmVlbj1mdW5jdGlvbih0LGUpe0tvLnN1cHBvcnRzRnVsbHNjcmVlbigpJiZ0W01uLnJlcXVlc3RGdWxsc2NyZWVuXSh7dnJEaXNwbGF5OmV9KX07S28uZXhpdEZ1bGxzY3JlZW49ZnVuY3Rpb24oKXtLby5zdXBwb3J0c0Z1bGxzY3JlZW4oKSYmZG9jdW1lbnRbTW4uZXhpdEZ1bGxzY3JlZW5dKCl9O0tvLl9uYW1lcz1Nbjt6QT1Lb30pO2Z1bmN0aW9uIFhzKHQpe2xldCBlPXQuc3BsaXQoIi4iKTtmb3IobGV0IG49MCxvPWUubGVuZ3RoO248bzsrK24pZVtuXT1wYXJzZUludChlW25dLDEwKTtyZXR1cm4gZX1mdW5jdGlvbiBuaCgpe2lmKCFoKF9wKSYmKF9wPSExLCFUcCgpKSl7bGV0IHQ9LyBDaHJvbWVcLyhbXC4wLTldKykvLmV4ZWMoT28udXNlckFnZW50KTt0IT09bnVsbCYmKF9wPSEwLEhBPVhzKHRbMV0pKX1yZXR1cm4gX3B9ZnVuY3Rpb24gRngoKXtyZXR1cm4gbmgoKSYmSEF9ZnVuY3Rpb24gS0EoKXtpZighaCh5cCkmJih5cD0hMSwhbmgoKSYmIVRwKCkmJi8gU2FmYXJpXC9bXC4wLTldKy8udGVzdChPby51c2VyQWdlbnQpKSl7bGV0IHQ9LyBWZXJzaW9uXC8oW1wuMC05XSspLy5leGVjKE9vLnVzZXJBZ2VudCk7dCE9PW51bGwmJih5cD0hMCxxQT1Ycyh0WzFdKSl9cmV0dXJuIHlwfWZ1bmN0aW9uIEJ4KCl7cmV0dXJuIEtBKCkmJnFBfWZ1bmN0aW9uIFdBKCl7aWYoIWgoZ3ApKXtncD0hMTtsZXQgdD0vIEFwcGxlV2ViS2l0XC8oW1wuMC05XSspKFwrPykvLmV4ZWMoT28udXNlckFnZW50KTt0IT09bnVsbCYmKGdwPSEwLHRoPVhzKHRbMV0pLHRoLmlzTmlnaHRseT0hIXRbMl0pfXJldHVybiBncH1mdW5jdGlvbiBVeCgpe3JldHVybiBXQSgpJiZ0aH1mdW5jdGlvbiBYQSgpe2lmKCFoKF9mKSl7X2Y9ITE7bGV0IHQ7T28uYXBwTmFtZT09PSJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiPyh0PS9NU0lFIChbMC05XXsxLH1bXC4wLTldezAsfSkvLmV4ZWMoT28udXNlckFnZW50KSx0IT09bnVsbCYmKF9mPSEwLGVoPVhzKHRbMV0pKSk6T28uYXBwTmFtZT09PSJOZXRzY2FwZSImJih0PS9UcmlkZW50XC8uKnJ2OihbMC05XXsxLH1bXC4wLTldezAsfSkvLmV4ZWMoT28udXNlckFnZW50KSx0IT09bnVsbCYmKF9mPSEwLGVoPVhzKHRbMV0pKSl9cmV0dXJuIF9mfWZ1bmN0aW9uIFZ4KCl7cmV0dXJuIFhBKCkmJmVofWZ1bmN0aW9uIFRwKCl7aWYoIWgoQXApKXtBcD0hMTtsZXQgdD0vIEVkZ1wvKFtcLjAtOV0rKS8uZXhlYyhPby51c2VyQWdlbnQpO3QhPT1udWxsJiYoQXA9ITAsWUE9WHModFsxXSkpfXJldHVybiBBcH1mdW5jdGlvbiBreCgpe3JldHVybiBUcCgpJiZZQX1mdW5jdGlvbiBPcCgpe2lmKCFoKGJwKSl7YnA9ITE7bGV0IHQ9L0ZpcmVmb3hcLyhbXC4wLTldKykvLmV4ZWMoT28udXNlckFnZW50KTt0IT09bnVsbCYmKGJwPSEwLG9oPVhzKHRbMV0pKX1yZXR1cm4gYnB9ZnVuY3Rpb24gR3goKXtyZXR1cm4gaChabSl8fChabT0vV2luZG93cy9pLnRlc3QoT28uYXBwVmVyc2lvbikpLFptfWZ1bmN0aW9uIHp4KCl7cmV0dXJuIGgoUW0pfHwoUW09bmF2aWdhdG9yLnBsYXRmb3JtPT09ImlQaG9uZSJ8fG5hdmlnYXRvci5wbGF0Zm9ybT09PSJpUG9kInx8bmF2aWdhdG9yLnBsYXRmb3JtPT09ImlQYWQiKSxRbX1mdW5jdGlvbiBqeCgpe3JldHVybiBPcCgpJiZvaH1mdW5jdGlvbiBIeCgpe3JldHVybiBoKEptKXx8KEptPSFPcCgpJiZ0eXBlb2YgUG9pbnRlckV2ZW50PCJ1IiYmKCFoKE9vLnBvaW50ZXJFbmFibGVkKXx8T28ucG9pbnRlckVuYWJsZWQpKSxKbX1mdW5jdGlvbiBaQSgpe2lmKCFoKHdwKSl7bGV0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7dC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiaW1hZ2UtcmVuZGVyaW5nOiAtbW96LWNyaXNwLWVkZ2VzO2ltYWdlLXJlbmRlcmluZzogcGl4ZWxhdGVkOyIpO2xldCBlPXQuc3R5bGUuaW1hZ2VSZW5kZXJpbmc7d3A9aChlKSYmZSE9PSIiLHdwJiYoJEE9ZSl9cmV0dXJuIHdwfWZ1bmN0aW9uIHF4KCl7cmV0dXJuIFpBKCk/JEE6dm9pZCAwfWZ1bmN0aW9uIFRvKCl7aWYoIVRvLmluaXRpYWxpemVkKXRocm93IG5ldyBGKCJZb3UgbXVzdCBjYWxsIEZlYXR1cmVEZXRlY3Rpb24uc3VwcG9ydHNXZWJQLmluaXRpYWxpemUgYW5kIHdhaXQgZm9yIHRoZSBwcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGNhbGxpbmcgRmVhdHVyZURldGVjdGlvbi5zdXBwb3J0c1dlYlAiKTtyZXR1cm4gVG8uX3Jlc3VsdH12YXIgT28sX3AsSEEseXAscUEsZ3AsdGgsX2YsZWgsQXAsWUEsYnAsb2gsWm0sUW0sSm0sJEEsd3AsSmMseXIsWXMscmg9WigoKT0+e1h0KCk7SXQoKTtmdCgpO0h0KCk7akEoKTt0eXBlb2YgbmF2aWdhdG9yPCJ1Ij9Pbz1uYXZpZ2F0b3I6T289e307VG8uX3Byb21pc2U9dm9pZCAwO1RvLl9yZXN1bHQ9dm9pZCAwO1RvLmluaXRpYWxpemU9ZnVuY3Rpb24oKXtyZXR1cm4gaChUby5fcHJvbWlzZSl8fChUby5fcHJvbWlzZT1uZXcgUHJvbWlzZSh0PT57bGV0IGU9bmV3IEltYWdlO2Uub25sb2FkPWZ1bmN0aW9uKCl7VG8uX3Jlc3VsdD1lLndpZHRoPjAmJmUuaGVpZ2h0PjAsdChUby5fcmVzdWx0KX0sZS5vbmVycm9yPWZ1bmN0aW9uKCl7VG8uX3Jlc3VsdD0hMSx0KFRvLl9yZXN1bHQpfSxlLnNyYz0iZGF0YTppbWFnZS93ZWJwO2Jhc2U2NCxVa2xHUmlJQUFBQlhSVUpRVmxBNElCWUFBQUF3QVFDZEFTb0JBQUVBRHNEK0phUUFBM0FBQUFBQSJ9KSksVG8uX3Byb21pc2V9O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFRvLHtpbml0aWFsaXplZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGgoVG8uX3Jlc3VsdCl9fX0pO0pjPVtdO3R5cGVvZiBBcnJheUJ1ZmZlcjwidSImJihKYy5wdXNoKEludDhBcnJheSxVaW50OEFycmF5LEludDE2QXJyYXksVWludDE2QXJyYXksSW50MzJBcnJheSxVaW50MzJBcnJheSxGbG9hdDMyQXJyYXksRmxvYXQ2NEFycmF5KSx0eXBlb2YgVWludDhDbGFtcGVkQXJyYXk8InUiJiZKYy5wdXNoKFVpbnQ4Q2xhbXBlZEFycmF5KSx0eXBlb2YgVWludDhDbGFtcGVkQXJyYXk8InUiJiZKYy5wdXNoKFVpbnQ4Q2xhbXBlZEFycmF5KSx0eXBlb2YgQmlnSW50NjRBcnJheTwidSImJkpjLnB1c2goQmlnSW50NjRBcnJheSksdHlwZW9mIEJpZ1VpbnQ2NEFycmF5PCJ1IiYmSmMucHVzaChCaWdVaW50NjRBcnJheSkpO3lyPXtpc0Nocm9tZTpuaCxjaHJvbWVWZXJzaW9uOkZ4LGlzU2FmYXJpOktBLHNhZmFyaVZlcnNpb246QngsaXNXZWJraXQ6V0Esd2Via2l0VmVyc2lvbjpVeCxpc0ludGVybmV0RXhwbG9yZXI6WEEsaW50ZXJuZXRFeHBsb3JlclZlcnNpb246VngsaXNFZGdlOlRwLGVkZ2VWZXJzaW9uOmt4LGlzRmlyZWZveDpPcCxmaXJlZm94VmVyc2lvbjpqeCxpc1dpbmRvd3M6R3gsaXNJUGFkT3JJT1M6engsaGFyZHdhcmVDb25jdXJyZW5jeTp4KE9vLmhhcmR3YXJlQ29uY3VycmVuY3ksMyksc3VwcG9ydHNQb2ludGVyRXZlbnRzOkh4LHN1cHBvcnRzSW1hZ2VSZW5kZXJpbmdQaXhlbGF0ZWQ6WkEsc3VwcG9ydHNXZWJQOlRvLGltYWdlUmVuZGVyaW5nVmFsdWU6cXgsdHlwZWRBcnJheVR5cGVzOkpjfTt5ci5zdXBwb3J0c0Jhc2lzPWZ1bmN0aW9uKHQpe3JldHVybiB5ci5zdXBwb3J0c1dlYkFzc2VtYmx5KCkmJnQuY29udGV4dC5zdXBwb3J0c0Jhc2lzfTt5ci5zdXBwb3J0c0Z1bGxzY3JlZW49ZnVuY3Rpb24oKXtyZXR1cm4gekEuc3VwcG9ydHNGdWxsc2NyZWVuKCl9O3lyLnN1cHBvcnRzVHlwZWRBcnJheXM9ZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyPCJ1In07eXIuc3VwcG9ydHNCaWdJbnQ2NEFycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIHR5cGVvZiBCaWdJbnQ2NEFycmF5PCJ1In07eXIuc3VwcG9ydHNCaWdVaW50NjRBcnJheT1mdW5jdGlvbigpe3JldHVybiB0eXBlb2YgQmlnVWludDY0QXJyYXk8InUifTt5ci5zdXBwb3J0c0JpZ0ludD1mdW5jdGlvbigpe3JldHVybiB0eXBlb2YgQmlnSW50PCJ1In07eXIuc3VwcG9ydHNXZWJXb3JrZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHR5cGVvZiBXb3JrZXI8InUifTt5ci5zdXBwb3J0c1dlYkFzc2VtYmx5PWZ1bmN0aW9uKCl7cmV0dXJuIHR5cGVvZiBXZWJBc3NlbWJseTwidSJ9O3lyLnN1cHBvcnRzV2ViZ2wyPWZ1bmN0aW9uKHQpe3JldHVybiB5LmRlZmluZWQoInNjZW5lIix0KSx0LmNvbnRleHQud2ViZ2wyfTt5ci5zdXBwb3J0c0VzbVdlYldvcmtlcnM9ZnVuY3Rpb24oKXtyZXR1cm4hT3AoKXx8cGFyc2VJbnQob2gpPj0xMTR9O1lzPXlyfSk7ZnVuY3Rpb24gRXQodCxlLG4sbyl7dGhpcy54PXgodCwwKSx0aGlzLnk9eChlLDApLHRoaXMuej14KG4sMCksdGhpcy53PXgobywwKX12YXIgeWYsS3gsV3gsUUEsSkEsaWgsdGIsRXAsc2gsRnIsZWIsUnAsY2gsbmIsYWgsZmgsWHgsWXgsZ2YsdGEsJHgsb2IsU3AsQ3AseGksUGksZWUsV289WigoKT0+e0Z0KCk7WHQoKTtJdCgpO2Z0KCk7cmgoKTtXdCgpO0ZuKCk7eWY9bmV3IGE7RXQuZnJvbUF4aXNBbmdsZT1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJheGlzIix0KSx5LnR5cGVPZi5udW1iZXIoImFuZ2xlIixlKTtsZXQgbz1lLzIscj1NYXRoLnNpbihvKTt5Zj1hLm5vcm1hbGl6ZSh0LHlmKTtsZXQgaT15Zi54KnIscz15Zi55KnIsZj15Zi56KnIsdT1NYXRoLmNvcyhvKTtyZXR1cm4gaChuKT8obi54PWksbi55PXMsbi56PWYsbi53PXUsbik6bmV3IEV0KGkscyxmLHUpfTtLeD1bMSwyLDBdLFd4PW5ldyBBcnJheSgzKTtFdC5mcm9tUm90YXRpb25NYXRyaXg9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCk7bGV0IG4sbyxyLGkscyxmPXRbSi5DT0xVTU4wUk9XMF0sdT10W0ouQ09MVU1OMVJPVzFdLGM9dFtKLkNPTFVNTjJST1cyXSxsPWYrdStjO2lmKGw+MCluPU1hdGguc3FydChsKzEpLHM9LjUqbixuPS41L24sbz0odFtKLkNPTFVNTjFST1cyXS10W0ouQ09MVU1OMlJPVzFdKSpuLHI9KHRbSi5DT0xVTU4yUk9XMF0tdFtKLkNPTFVNTjBST1cyXSkqbixpPSh0W0ouQ09MVU1OMFJPVzFdLXRbSi5DT0xVTU4xUk9XMF0pKm47ZWxzZXtsZXQgcD1LeCxkPTA7dT5mJiYoZD0xKSxjPmYmJmM+dSYmKGQ9Mik7bGV0IG09cFtkXSxfPXBbbV07bj1NYXRoLnNxcnQodFtKLmdldEVsZW1lbnRJbmRleChkLGQpXS10W0ouZ2V0RWxlbWVudEluZGV4KG0sbSldLXRbSi5nZXRFbGVtZW50SW5kZXgoXyxfKV0rMSk7bGV0IGc9V3g7Z1tkXT0uNSpuLG49LjUvbixzPSh0W0ouZ2V0RWxlbWVudEluZGV4KF8sbSldLXRbSi5nZXRFbGVtZW50SW5kZXgobSxfKV0pKm4sZ1ttXT0odFtKLmdldEVsZW1lbnRJbmRleChtLGQpXSt0W0ouZ2V0RWxlbWVudEluZGV4KGQsbSldKSpuLGdbX109KHRbSi5nZXRFbGVtZW50SW5kZXgoXyxkKV0rdFtKLmdldEVsZW1lbnRJbmRleChkLF8pXSkqbixvPS1nWzBdLHI9LWdbMV0saT0tZ1syXX1yZXR1cm4gaChlKT8oZS54PW8sZS55PXIsZS56PWksZS53PXMsZSk6bmV3IEV0KG8scixpLHMpfTtRQT1uZXcgRXQsSkE9bmV3IEV0LGloPW5ldyBFdCx0Yj1uZXcgRXQ7RXQuZnJvbUhlYWRpbmdQaXRjaFJvbGw9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJoZWFkaW5nUGl0Y2hSb2xsIix0KSx0Yj1FdC5mcm9tQXhpc0FuZ2xlKGEuVU5JVF9YLHQucm9sbCxRQSksaWg9RXQuZnJvbUF4aXNBbmdsZShhLlVOSVRfWSwtdC5waXRjaCxlKSxlPUV0Lm11bHRpcGx5KGloLHRiLGloKSxKQT1FdC5mcm9tQXhpc0FuZ2xlKGEuVU5JVF9aLC10LmhlYWRpbmcsUUEpLEV0Lm11bHRpcGx5KEpBLGUsZSl9O0VwPW5ldyBhLHNoPW5ldyBhLEZyPW5ldyBFdCxlYj1uZXcgRXQsUnA9bmV3IEV0O0V0LnBhY2tlZExlbmd0aD00O0V0LnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxuPXgobiwwKSxlW24rK109dC54LGVbbisrXT10LnksZVtuKytdPXQueixlW25dPXQudyxlfTtFdC51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LmRlZmluZWQoImFycmF5Iix0KSxlPXgoZSwwKSxoKG4pfHwobj1uZXcgRXQpLG4ueD10W2VdLG4ueT10W2UrMV0sbi56PXRbZSsyXSxuLnc9dFtlKzNdLG59O0V0LnBhY2tlZEludGVycG9sYXRpb25MZW5ndGg9MztFdC5jb252ZXJ0UGFja2VkQXJyYXlGb3JJbnRlcnBvbGF0aW9uPWZ1bmN0aW9uKHQsZSxuLG8pe0V0LnVucGFjayh0LG4qNCxScCksRXQuY29uanVnYXRlKFJwLFJwKTtmb3IobGV0IHI9MCxpPW4tZSsxO3I8aTtyKyspe2xldCBzPXIqMztFdC51bnBhY2sodCwoZStyKSo0LEZyKSxFdC5tdWx0aXBseShGcixScCxGciksRnIudzwwJiZFdC5uZWdhdGUoRnIsRnIpLEV0LmNvbXB1dGVBeGlzKEZyLEVwKTtsZXQgZj1FdC5jb21wdXRlQW5nbGUoRnIpO2gobyl8fChvPVtdKSxvW3NdPUVwLngqZixvW3MrMV09RXAueSpmLG9bcysyXT1FcC56KmZ9fTtFdC51bnBhY2tJbnRlcnBvbGF0aW9uUmVzdWx0PWZ1bmN0aW9uKHQsZSxuLG8scil7aChyKXx8KHI9bmV3IEV0KSxhLmZyb21BcnJheSh0LDAsc2gpO2xldCBpPWEubWFnbml0dWRlKHNoKTtyZXR1cm4gRXQudW5wYWNrKGUsbyo0LGViKSxpPT09MD9FdC5jbG9uZShFdC5JREVOVElUWSxGcik6RXQuZnJvbUF4aXNBbmdsZShzaCxpLEZyKSxFdC5tdWx0aXBseShGcixlYixyKX07RXQuY2xvbmU9ZnVuY3Rpb24odCxlKXtpZihoKHQpKXJldHVybiBoKGUpPyhlLng9dC54LGUueT10LnksZS56PXQueixlLnc9dC53LGUpOm5ldyBFdCh0LngsdC55LHQueix0LncpfTtFdC5jb25qdWdhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJxdWF0ZXJuaW9uIix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZS54PS10LngsZS55PS10LnksZS56PS10LnosZS53PXQudyxlfTtFdC5tYWduaXR1ZGVTcXVhcmVkPWZ1bmN0aW9uKHQpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInF1YXRlcm5pb24iLHQpLHQueCp0LngrdC55KnQueSt0LnoqdC56K3Qudyp0Lnd9O0V0Lm1hZ25pdHVkZT1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KEV0Lm1hZ25pdHVkZVNxdWFyZWQodCkpfTtFdC5ub3JtYWxpemU9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7bGV0IG49MS9FdC5tYWduaXR1ZGUodCksbz10LngqbixyPXQueSpuLGk9dC56Km4scz10LncqbjtyZXR1cm4gZS54PW8sZS55PXIsZS56PWksZS53PXMsZX07RXQuaW52ZXJzZT1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKTtsZXQgbj1FdC5tYWduaXR1ZGVTcXVhcmVkKHQpO3JldHVybiBlPUV0LmNvbmp1Z2F0ZSh0LGUpLEV0Lm11bHRpcGx5QnlTY2FsYXIoZSwxL24sZSl9O0V0LmFkZD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngrZS54LG4ueT10LnkrZS55LG4uej10LnorZS56LG4udz10LncrZS53LG59O0V0LnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC1lLngsbi55PXQueS1lLnksbi56PXQuei1lLnosbi53PXQudy1lLncsbn07RXQubmVnYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgicXVhdGVybmlvbiIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGUueD0tdC54LGUueT0tdC55LGUuej0tdC56LGUudz0tdC53LGV9O0V0LmRvdD1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHQueCplLngrdC55KmUueSt0LnoqZS56K3QudyplLnd9O0V0Lm11bHRpcGx5PWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz10Lngscj10LnksaT10Lnoscz10LncsZj1lLngsdT1lLnksYz1lLnosbD1lLncscD1zKmYrbypsK3IqYy1pKnUsZD1zKnUtbypjK3IqbCtpKmYsbT1zKmMrbyp1LXIqZitpKmwsXz1zKmwtbypmLXIqdS1pKmM7cmV0dXJuIG4ueD1wLG4ueT1kLG4uej1tLG4udz1fLG59O0V0Lm11bHRpcGx5QnlTY2FsYXI9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInF1YXRlcm5pb24iLHQpLHkudHlwZU9mLm51bWJlcigic2NhbGFyIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLG4ueT10LnkqZSxuLno9dC56KmUsbi53PXQudyplLG59O0V0LmRpdmlkZUJ5U2NhbGFyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJxdWF0ZXJuaW9uIix0KSx5LnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbi56PXQuei9lLG4udz10LncvZSxufTtFdC5jb21wdXRlQXhpcz1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgicXVhdGVybmlvbiIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2xldCBuPXQudztpZihNYXRoLmFicyhuLTEpPE0uRVBTSUxPTjZ8fE1hdGguYWJzKG4rMSk8TS5FUFNJTE9ONilyZXR1cm4gZS54PTEsZS55PWUuej0wLGU7bGV0IG89MS9NYXRoLnNxcnQoMS1uKm4pO3JldHVybiBlLng9dC54Km8sZS55PXQueSpvLGUuej10LnoqbyxlfTtFdC5jb21wdXRlQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgicXVhdGVybmlvbiIsdCksTWF0aC5hYnModC53LTEpPE0uRVBTSUxPTjY/MDoyKk1hdGguYWNvcyh0LncpfTtjaD1uZXcgRXQ7RXQubGVycD1mdW5jdGlvbih0LGUsbixvKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJzdGFydCIsdCkseS50eXBlT2Yub2JqZWN0KCJlbmQiLGUpLHkudHlwZU9mLm51bWJlcigidCIsbikseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG8pLGNoPUV0Lm11bHRpcGx5QnlTY2FsYXIoZSxuLGNoKSxvPUV0Lm11bHRpcGx5QnlTY2FsYXIodCwxLW4sbyksRXQuYWRkKGNoLG8sbyl9O25iPW5ldyBFdCxhaD1uZXcgRXQsZmg9bmV3IEV0O0V0LnNsZXJwPWZ1bmN0aW9uKHQsZSxuLG8pe3kudHlwZU9mLm9iamVjdCgic3RhcnQiLHQpLHkudHlwZU9mLm9iamVjdCgiZW5kIixlKSx5LnR5cGVPZi5udW1iZXIoInQiLG4pLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixvKTtsZXQgcj1FdC5kb3QodCxlKSxpPWU7aWYocjwwJiYocj0tcixpPW5iPUV0Lm5lZ2F0ZShlLG5iKSksMS1yPE0uRVBTSUxPTjYpcmV0dXJuIEV0LmxlcnAodCxpLG4sbyk7bGV0IHM9TWF0aC5hY29zKHIpO3JldHVybiBhaD1FdC5tdWx0aXBseUJ5U2NhbGFyKHQsTWF0aC5zaW4oKDEtbikqcyksYWgpLGZoPUV0Lm11bHRpcGx5QnlTY2FsYXIoaSxNYXRoLnNpbihuKnMpLGZoKSxvPUV0LmFkZChhaCxmaCxvKSxFdC5tdWx0aXBseUJ5U2NhbGFyKG8sMS9NYXRoLnNpbihzKSxvKX07RXQubG9nPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJxdWF0ZXJuaW9uIix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7bGV0IG49TS5hY29zQ2xhbXBlZCh0LncpLG89MDtyZXR1cm4gbiE9PTAmJihvPW4vTWF0aC5zaW4obikpLGEubXVsdGlwbHlCeVNjYWxhcih0LG8sZSl9O0V0LmV4cD1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7bGV0IG49YS5tYWduaXR1ZGUodCksbz0wO3JldHVybiBuIT09MCYmKG89TWF0aC5zaW4obikvbiksZS54PXQueCpvLGUueT10LnkqbyxlLno9dC56Km8sZS53PU1hdGguY29zKG4pLGV9O1h4PW5ldyBhLFl4PW5ldyBhLGdmPW5ldyBFdCx0YT1uZXcgRXQ7RXQuY29tcHV0ZUlubmVyUXVhZHJhbmdsZT1mdW5jdGlvbih0LGUsbixvKXt5LnR5cGVPZi5vYmplY3QoInEwIix0KSx5LnR5cGVPZi5vYmplY3QoInExIixlKSx5LnR5cGVPZi5vYmplY3QoInEyIixuKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbyk7bGV0IHI9RXQuY29uanVnYXRlKGUsZ2YpO0V0Lm11bHRpcGx5KHIsbix0YSk7bGV0IGk9RXQubG9nKHRhLFh4KTtFdC5tdWx0aXBseShyLHQsdGEpO2xldCBzPUV0LmxvZyh0YSxZeCk7cmV0dXJuIGEuYWRkKGkscyxpKSxhLm11bHRpcGx5QnlTY2FsYXIoaSwuMjUsaSksYS5uZWdhdGUoaSxpKSxFdC5leHAoaSxnZiksRXQubXVsdGlwbHkoZSxnZixvKX07RXQuc3F1YWQ9ZnVuY3Rpb24odCxlLG4sbyxyLGkpe3kudHlwZU9mLm9iamVjdCgicTAiLHQpLHkudHlwZU9mLm9iamVjdCgicTEiLGUpLHkudHlwZU9mLm9iamVjdCgiczAiLG4pLHkudHlwZU9mLm9iamVjdCgiczEiLG8pLHkudHlwZU9mLm51bWJlcigidCIscikseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGkpO2xldCBzPUV0LnNsZXJwKHQsZSxyLGdmKSxmPUV0LnNsZXJwKG4sbyxyLHRhKTtyZXR1cm4gRXQuc2xlcnAocyxmLDIqciooMS1yKSxpKX07JHg9bmV3IEV0LG9iPTEuOTAxMTA3NDUzNTE3MzAwMyxTcD1Zcy5zdXBwb3J0c1R5cGVkQXJyYXlzKCk/bmV3IEZsb2F0MzJBcnJheSg4KTpbXSxDcD1Zcy5zdXBwb3J0c1R5cGVkQXJyYXlzKCk/bmV3IEZsb2F0MzJBcnJheSg4KTpbXSx4aT1Zcy5zdXBwb3J0c1R5cGVkQXJyYXlzKCk/bmV3IEZsb2F0MzJBcnJheSg4KTpbXSxQaT1Zcy5zdXBwb3J0c1R5cGVkQXJyYXlzKCk/bmV3IEZsb2F0MzJBcnJheSg4KTpbXTtmb3IobGV0IHQ9MDt0PDc7Kyt0KXtsZXQgZT10KzEsbj0yKmUrMTtTcFt0XT0xLyhlKm4pLENwW3RdPWUvbn1TcFs3XT1vYi8oOCoxNyk7Q3BbN109b2IqOC8xNztFdC5mYXN0U2xlcnA9ZnVuY3Rpb24odCxlLG4sbyl7eS50eXBlT2Yub2JqZWN0KCJzdGFydCIsdCkseS50eXBlT2Yub2JqZWN0KCJlbmQiLGUpLHkudHlwZU9mLm51bWJlcigidCIsbikseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG8pO2xldCByPUV0LmRvdCh0LGUpLGk7cj49MD9pPTE6KGk9LTEscj0tcik7bGV0IHM9ci0xLGY9MS1uLHU9bipuLGM9ZipmO2ZvcihsZXQgbT03O20+PTA7LS1tKXhpW21dPShTcFttXSp1LUNwW21dKSpzLFBpW21dPShTcFttXSpjLUNwW21dKSpzO2xldCBsPWkqbiooMSt4aVswXSooMSt4aVsxXSooMSt4aVsyXSooMSt4aVszXSooMSt4aVs0XSooMSt4aVs1XSooMSt4aVs2XSooMSt4aVs3XSkpKSkpKSkpLHA9ZiooMStQaVswXSooMStQaVsxXSooMStQaVsyXSooMStQaVszXSooMStQaVs0XSooMStQaVs1XSooMStQaVs2XSooMStQaVs3XSkpKSkpKSkpLGQ9RXQubXVsdGlwbHlCeVNjYWxhcih0LHAsJHgpO3JldHVybiBFdC5tdWx0aXBseUJ5U2NhbGFyKGUsbCxvKSxFdC5hZGQoZCxvLG8pfTtFdC5mYXN0U3F1YWQ9ZnVuY3Rpb24odCxlLG4sbyxyLGkpe3kudHlwZU9mLm9iamVjdCgicTAiLHQpLHkudHlwZU9mLm9iamVjdCgicTEiLGUpLHkudHlwZU9mLm9iamVjdCgiczAiLG4pLHkudHlwZU9mLm9iamVjdCgiczEiLG8pLHkudHlwZU9mLm51bWJlcigidCIscikseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGkpO2xldCBzPUV0LmZhc3RTbGVycCh0LGUscixnZiksZj1FdC5mYXN0U2xlcnAobixvLHIsdGEpO3JldHVybiBFdC5mYXN0U2xlcnAocyxmLDIqciooMS1yKSxpKX07RXQuZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxoKHQpJiZoKGUpJiZ0Lng9PT1lLngmJnQueT09PWUueSYmdC56PT09ZS56JiZ0Lnc9PT1lLnd9O0V0LmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuPXgobiwwKSx0PT09ZXx8aCh0KSYmaChlKSYmTWF0aC5hYnModC54LWUueCk8PW4mJk1hdGguYWJzKHQueS1lLnkpPD1uJiZNYXRoLmFicyh0LnotZS56KTw9biYmTWF0aC5hYnModC53LWUudyk8PW59O0V0LlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgRXQoMCwwLDAsMCkpO0V0LklERU5USVRZPU9iamVjdC5mcmVlemUobmV3IEV0KDAsMCwwLDEpKTtFdC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIEV0LmNsb25lKHRoaXMsdCl9O0V0LnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIEV0LmVxdWFscyh0aGlzLHQpfTtFdC5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUpe3JldHVybiBFdC5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlKX07RXQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuYCgke3RoaXMueH0sICR7dGhpcy55fSwgJHt0aGlzLnp9LCAke3RoaXMud30pYH07ZWU9RXR9KTt2YXIgVWUsdWgsZWEsbGgsWG8scnMsaXMsc3MsWngsUXgsSngsdFAsZVAsblAsb1AscmIsclAsaVAsc1AsY1AsYVAsZlAsdVAsbFAscFAsZFAseHAsbWgsbVAsaFAsX1AscGgsZGgseVAsZ1AsQVAsYlAsaWIsc2IsaGgsd1AsVFAsX2gsY2IsWW8sY3M9WigoKT0+e0ZlKCk7RnQoKTtocigpO1BlKCk7WHQoKTtJdCgpO2Z0KCk7SHQoKTt2QSgpO1BtKCk7WnQoKTtMQSgpO0dBKCk7V20oKTtRbCgpO1d0KCk7Rm4oKTtCbigpO1dvKCk7S2woKTtVZT17fSx1aD17dXA6e3NvdXRoOiJlYXN0Iixub3J0aDoid2VzdCIsd2VzdDoic291dGgiLGVhc3Q6Im5vcnRoIn0sZG93bjp7c291dGg6Indlc3QiLG5vcnRoOiJlYXN0Iix3ZXN0OiJub3J0aCIsZWFzdDoic291dGgifSxzb3V0aDp7dXA6Indlc3QiLGRvd246ImVhc3QiLHdlc3Q6ImRvd24iLGVhc3Q6InVwIn0sbm9ydGg6e3VwOiJlYXN0Iixkb3duOiJ3ZXN0Iix3ZXN0OiJ1cCIsZWFzdDoiZG93biJ9LHdlc3Q6e3VwOiJub3J0aCIsZG93bjoic291dGgiLG5vcnRoOiJkb3duIixzb3V0aDoidXAifSxlYXN0Ont1cDoic291dGgiLGRvd246Im5vcnRoIixub3J0aDoidXAiLHNvdXRoOiJkb3duIn19LGVhPXtub3J0aDpbLTEsMCwwXSxlYXN0OlswLDEsMF0sdXA6WzAsMCwxXSxzb3V0aDpbMSwwLDBdLHdlc3Q6WzAsLTEsMF0sZG93bjpbMCwwLC0xXX0sbGg9e30sWG89e2Vhc3Q6bmV3IGEsbm9ydGg6bmV3IGEsdXA6bmV3IGEsd2VzdDpuZXcgYSxzb3V0aDpuZXcgYSxkb3duOm5ldyBhfSxycz1uZXcgYSxpcz1uZXcgYSxzcz1uZXcgYTtVZS5sb2NhbEZyYW1lVG9GaXhlZEZyYW1lR2VuZXJhdG9yPWZ1bmN0aW9uKHQsZSl7aWYoIXVoLmhhc093blByb3BlcnR5KHQpfHwhdWhbdF0uaGFzT3duUHJvcGVydHkoZSkpdGhyb3cgbmV3IEYoImZpcnN0QXhpcyBhbmQgc2Vjb25kQXhpcyBtdXN0IGJlIGVhc3QsIG5vcnRoLCB1cCwgd2VzdCwgc291dGggb3IgZG93bi4iKTtsZXQgbj11aFt0XVtlXSxvLHI9dCtlO3JldHVybiBoKGxoW3JdKT9vPWxoW3JdOihvPWZ1bmN0aW9uKGkscyxmKXtpZighaChpKSl0aHJvdyBuZXcgRigib3JpZ2luIGlzIHJlcXVpcmVkLiIpO2lmKGlzTmFOKGkueCl8fGlzTmFOKGkueSl8fGlzTmFOKGkueikpdGhyb3cgbmV3IEYoIm9yaWdpbiBoYXMgYSBOYU4gY29tcG9uZW50Iik7aWYoaChmKXx8KGY9bmV3IHN0KSxhLmVxdWFsc0Vwc2lsb24oaSxhLlpFUk8sTS5FUFNJTE9OMTQpKWEudW5wYWNrKGVhW3RdLDAscnMpLGEudW5wYWNrKGVhW2VdLDAsaXMpLGEudW5wYWNrKGVhW25dLDAsc3MpO2Vsc2UgaWYoTS5lcXVhbHNFcHNpbG9uKGkueCwwLE0uRVBTSUxPTjE0KSYmTS5lcXVhbHNFcHNpbG9uKGkueSwwLE0uRVBTSUxPTjE0KSl7bGV0IHU9TS5zaWduKGkueik7YS51bnBhY2soZWFbdF0sMCxycyksdCE9PSJlYXN0IiYmdCE9PSJ3ZXN0IiYmYS5tdWx0aXBseUJ5U2NhbGFyKHJzLHUscnMpLGEudW5wYWNrKGVhW2VdLDAsaXMpLGUhPT0iZWFzdCImJmUhPT0id2VzdCImJmEubXVsdGlwbHlCeVNjYWxhcihpcyx1LGlzKSxhLnVucGFjayhlYVtuXSwwLHNzKSxuIT09ImVhc3QiJiZuIT09Indlc3QiJiZhLm11bHRpcGx5QnlTY2FsYXIoc3MsdSxzcyl9ZWxzZXtzPXgocywkLldHUzg0KSxzLmdlb2RldGljU3VyZmFjZU5vcm1hbChpLFhvLnVwKTtsZXQgdT1Yby51cCxjPVhvLmVhc3Q7Yy54PS1pLnksYy55PWkueCxjLno9MCxhLm5vcm1hbGl6ZShjLFhvLmVhc3QpLGEuY3Jvc3ModSxjLFhvLm5vcnRoKSxhLm11bHRpcGx5QnlTY2FsYXIoWG8udXAsLTEsWG8uZG93biksYS5tdWx0aXBseUJ5U2NhbGFyKFhvLmVhc3QsLTEsWG8ud2VzdCksYS5tdWx0aXBseUJ5U2NhbGFyKFhvLm5vcnRoLC0xLFhvLnNvdXRoKSxycz1Yb1t0XSxpcz1Yb1tlXSxzcz1Yb1tuXX1yZXR1cm4gZlswXT1ycy54LGZbMV09cnMueSxmWzJdPXJzLnosZlszXT0wLGZbNF09aXMueCxmWzVdPWlzLnksZls2XT1pcy56LGZbN109MCxmWzhdPXNzLngsZls5XT1zcy55LGZbMTBdPXNzLnosZlsxMV09MCxmWzEyXT1pLngsZlsxM109aS55LGZbMTRdPWkueixmWzE1XT0xLGZ9LGxoW3JdPW8pLG99O1VlLmVhc3ROb3J0aFVwVG9GaXhlZEZyYW1lPVVlLmxvY2FsRnJhbWVUb0ZpeGVkRnJhbWVHZW5lcmF0b3IoImVhc3QiLCJub3J0aCIpO1VlLm5vcnRoRWFzdERvd25Ub0ZpeGVkRnJhbWU9VWUubG9jYWxGcmFtZVRvRml4ZWRGcmFtZUdlbmVyYXRvcigibm9ydGgiLCJlYXN0Iik7VWUubm9ydGhVcEVhc3RUb0ZpeGVkRnJhbWU9VWUubG9jYWxGcmFtZVRvRml4ZWRGcmFtZUdlbmVyYXRvcigibm9ydGgiLCJ1cCIpO1VlLm5vcnRoV2VzdFVwVG9GaXhlZEZyYW1lPVVlLmxvY2FsRnJhbWVUb0ZpeGVkRnJhbWVHZW5lcmF0b3IoIm5vcnRoIiwid2VzdCIpO1p4PW5ldyBlZSxReD1uZXcgYSgxLDEsMSksSng9bmV3IHN0O1VlLmhlYWRpbmdQaXRjaFJvbGxUb0ZpeGVkRnJhbWU9ZnVuY3Rpb24odCxlLG4sbyxyKXt5LnR5cGVPZi5vYmplY3QoIkhlYWRpbmdQaXRjaFJvbGwiLGUpLG89eChvLFVlLmVhc3ROb3J0aFVwVG9GaXhlZEZyYW1lKTtsZXQgaT1lZS5mcm9tSGVhZGluZ1BpdGNoUm9sbChlLFp4KSxzPXN0LmZyb21UcmFuc2xhdGlvblF1YXRlcm5pb25Sb3RhdGlvblNjYWxlKGEuWkVSTyxpLFF4LEp4KTtyZXR1cm4gcj1vKHQsbixyKSxzdC5tdWx0aXBseShyLHMscil9O3RQPW5ldyBzdCxlUD1uZXcgSjtVZS5oZWFkaW5nUGl0Y2hSb2xsUXVhdGVybmlvbj1mdW5jdGlvbih0LGUsbixvLHIpe3kudHlwZU9mLm9iamVjdCgiSGVhZGluZ1BpdGNoUm9sbCIsZSk7bGV0IGk9VWUuaGVhZGluZ1BpdGNoUm9sbFRvRml4ZWRGcmFtZSh0LGUsbixvLHRQKSxzPXN0LmdldE1hdHJpeDMoaSxlUCk7cmV0dXJuIGVlLmZyb21Sb3RhdGlvbk1hdHJpeChzLHIpfTtuUD1uZXcgYSgxLDEsMSksb1A9bmV3IGEscmI9bmV3IHN0LHJQPW5ldyBzdCxpUD1uZXcgSixzUD1uZXcgZWU7VWUuZml4ZWRGcmFtZVRvSGVhZGluZ1BpdGNoUm9sbD1mdW5jdGlvbih0LGUsbixvKXt5LmRlZmluZWQoInRyYW5zZm9ybSIsdCksZT14KGUsJC5XR1M4NCksbj14KG4sVWUuZWFzdE5vcnRoVXBUb0ZpeGVkRnJhbWUpLGgobyl8fChvPW5ldyBxbSk7bGV0IHI9c3QuZ2V0VHJhbnNsYXRpb24odCxvUCk7aWYoYS5lcXVhbHMocixhLlpFUk8pKXJldHVybiBvLmhlYWRpbmc9MCxvLnBpdGNoPTAsby5yb2xsPTAsbztsZXQgaT1zdC5pbnZlcnNlVHJhbnNmb3JtYXRpb24obihyLGUscmIpLHJiKSxzPXN0LnNldFNjYWxlKHQsblAsclApO3M9c3Quc2V0VHJhbnNsYXRpb24ocyxhLlpFUk8scyksaT1zdC5tdWx0aXBseShpLHMsaSk7bGV0IGY9ZWUuZnJvbVJvdGF0aW9uTWF0cml4KHN0LmdldE1hdHJpeDMoaSxpUCksc1ApO3JldHVybiBmPWVlLm5vcm1hbGl6ZShmLGYpLHFtLmZyb21RdWF0ZXJuaW9uKGYsbyl9O2NQPTYqMzYwMCs0MSo2MCs1MC41NDg0MSxhUD04NjQwMTg0ODEyODY2ZS02LGZQPS4wOTMxMDQsdVA9LTYyZS03LGxQPTExNzcyNzU4Mzg0NjY4ZS0zMixwUD03MjkyMTE1ODU1M2UtMTUsZFA9TS5UV09fUEkvODY0MDAseHA9bmV3IHJvO1VlLmNvbXB1dGVUZW1lVG9Qc2V1ZG9GaXhlZE1hdHJpeD1mdW5jdGlvbih0LGUpe2lmKCFoKHQpKXRocm93IG5ldyBGKCJkYXRlIGlzIHJlcXVpcmVkLiIpO3hwPXJvLmFkZFNlY29uZHModCwtcm8uY29tcHV0ZVRhaU1pbnVzVXRjKHQpLHhwKTtsZXQgbj14cC5kYXlOdW1iZXIsbz14cC5zZWNvbmRzT2ZEYXkscixpPW4tMjQ1MTU0NTtvPj00MzIwMD9yPShpKy41KS9fbi5EQVlTX1BFUl9KVUxJQU5fQ0VOVFVSWTpyPShpLS41KS9fbi5EQVlTX1BFUl9KVUxJQU5fQ0VOVFVSWTtsZXQgZj0oY1ArciooYVArciooZlArcip1UCkpKSpkUCVNLlRXT19QSSx1PXBQK2xQKihuLTI0NTE1NDU1ZS0xKSxjPShvK19uLlNFQ09ORFNfUEVSX0RBWSouNSklX24uU0VDT05EU19QRVJfREFZLGw9Zit1KmMscD1NYXRoLmNvcyhsKSxkPU1hdGguc2luKGwpO3JldHVybiBoKGUpPyhlWzBdPXAsZVsxXT0tZCxlWzJdPTAsZVszXT1kLGVbNF09cCxlWzVdPTAsZVs2XT0wLGVbN109MCxlWzhdPTEsZSk6bmV3IEoocCxkLDAsLWQscCwwLDAsMCwxKX07VWUuaWF1MjAwNlh5c0RhdGE9bmV3IGtBO1VlLmVhcnRoT3JpZW50YXRpb25QYXJhbWV0ZXJzPUlBLk5PTkU7bWg9MzIuMTg0LG1QPTI0NTE1NDU7VWUucHJlbG9hZEljcmZGaXhlZD1mdW5jdGlvbih0KXtsZXQgZT10LnN0YXJ0LmRheU51bWJlcixuPXQuc3RhcnQuc2Vjb25kc09mRGF5K21oLG89dC5zdG9wLmRheU51bWJlcixyPXQuc3RvcC5zZWNvbmRzT2ZEYXkrbWg7cmV0dXJuIFVlLmlhdTIwMDZYeXNEYXRhLnByZWxvYWQoZSxuLG8scil9O1VlLmNvbXB1dGVJY3JmVG9GaXhlZE1hdHJpeD1mdW5jdGlvbih0LGUpe2lmKCFoKHQpKXRocm93IG5ldyBGKCJkYXRlIGlzIHJlcXVpcmVkLiIpO2goZSl8fChlPW5ldyBKKTtsZXQgbj1VZS5jb21wdXRlRml4ZWRUb0ljcmZNYXRyaXgodCxlKTtpZihoKG4pKXJldHVybiBKLnRyYW5zcG9zZShuLGUpfTtoUD1uZXcgaHAoMCwwLDApLF9QPW5ldyBjZigwLDAsMCwwLDAsMCkscGg9bmV3IEosZGg9bmV3IEo7VWUuY29tcHV0ZUZpeGVkVG9JY3JmTWF0cml4PWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEYoImRhdGUgaXMgcmVxdWlyZWQuIik7aChlKXx8KGU9bmV3IEopO2xldCBuPVVlLmVhcnRoT3JpZW50YXRpb25QYXJhbWV0ZXJzLmNvbXB1dGUodCxfUCk7aWYoIWgobikpcmV0dXJuO2xldCBvPXQuZGF5TnVtYmVyLHI9dC5zZWNvbmRzT2ZEYXkrbWgsaT1VZS5pYXUyMDA2WHlzRGF0YS5jb21wdXRlWHlzUmFkaWFucyhvLHIsaFApO2lmKCFoKGkpKXJldHVybjtsZXQgcz1pLngrbi54UG9sZU9mZnNldCxmPWkueStuLnlQb2xlT2Zmc2V0LHU9MS8oMStNYXRoLnNxcnQoMS1zKnMtZipmKSksYz1waDtjWzBdPTEtdSpzKnMsY1szXT0tdSpzKmYsY1s2XT1zLGNbMV09LXUqcypmLGNbNF09MS11KmYqZixjWzddPWYsY1syXT0tcyxjWzVdPS1mLGNbOF09MS11KihzKnMrZipmKTtsZXQgbD1KLmZyb21Sb3RhdGlvblooLWkucyxkaCkscD1KLm11bHRpcGx5KGMsbCxwaCksZD10LmRheU51bWJlcixtPXQuc2Vjb25kc09mRGF5LXJvLmNvbXB1dGVUYWlNaW51c1V0Yyh0KStuLnV0MU1pbnVzVXRjLF89ZC0yNDUxNTQ1LGc9bS9fbi5TRUNPTkRTX1BFUl9EQVksYj0uNzc5MDU3MjczMjY0K2crLjAwMjczNzgxMTkxMTM1NDQ4KihfK2cpO2I9YiUxKk0uVFdPX1BJO2xldCB3PUouZnJvbVJvdGF0aW9uWihiLGRoKSxPPUoubXVsdGlwbHkocCx3LHBoKSxFPU1hdGguY29zKG4ueFBvbGVXYW5kZXIpLFQ9TWF0aC5jb3Mobi55UG9sZVdhbmRlciksQz1NYXRoLnNpbihuLnhQb2xlV2FuZGVyKSxOPU1hdGguc2luKG4ueVBvbGVXYW5kZXIpLEk9by1tUCtyL19uLlNFQ09ORFNfUEVSX0RBWTtJLz0zNjUyNTtsZXQgRD0tNDdlLTYqSSpNLlJBRElBTlNfUEVSX0RFR1JFRS8zNjAwLHY9TWF0aC5jb3MoRCksTD1NYXRoLnNpbihEKSxVPWRoO3JldHVybiBVWzBdPUUqdixVWzFdPUUqTCxVWzJdPUMsVVszXT0tVCpMK04qQyp2LFVbNF09VCp2K04qQypMLFVbNV09LU4qRSxVWzZdPS1OKkwtVCpDKnYsVVs3XT1OKnYtVCpDKkwsVVs4XT1UKkUsSi5tdWx0aXBseShPLFUsZSl9O3lQPW5ldyBoZTtVZS5wb2ludFRvV2luZG93Q29vcmRpbmF0ZXM9ZnVuY3Rpb24odCxlLG4sbyl7cmV0dXJuIG89VWUucG9pbnRUb0dMV2luZG93Q29vcmRpbmF0ZXModCxlLG4sbyksby55PTIqZVs1XS1vLnksb307VWUucG9pbnRUb0dMV2luZG93Q29vcmRpbmF0ZXM9ZnVuY3Rpb24odCxlLG4sbyl7aWYoIWgodCkpdGhyb3cgbmV3IEYoIm1vZGVsVmlld1Byb2plY3Rpb25NYXRyaXggaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEYoInZpZXdwb3J0VHJhbnNmb3JtYXRpb24gaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEYoInBvaW50IGlzIHJlcXVpcmVkLiIpO2gobyl8fChvPW5ldyB0dCk7bGV0IHI9eVA7cmV0dXJuIHN0Lm11bHRpcGx5QnlWZWN0b3IodCxoZS5mcm9tRWxlbWVudHMobi54LG4ueSxuLnosMSxyKSxyKSxoZS5tdWx0aXBseUJ5U2NhbGFyKHIsMS9yLncsciksc3QubXVsdGlwbHlCeVZlY3RvcihlLHIsciksdHQuZnJvbUNhcnRlc2lhbjQocixvKX07Z1A9bmV3IGEsQVA9bmV3IGEsYlA9bmV3IGE7VWUucm90YXRpb25NYXRyaXhGcm9tUG9zaXRpb25WZWxvY2l0eT1mdW5jdGlvbih0LGUsbixvKXtpZighaCh0KSl0aHJvdyBuZXcgRigicG9zaXRpb24gaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEYoInZlbG9jaXR5IGlzIHJlcXVpcmVkLiIpO2xldCByPXgobiwkLldHUzg0KS5nZW9kZXRpY1N1cmZhY2VOb3JtYWwodCxnUCksaT1hLmNyb3NzKGUscixBUCk7YS5lcXVhbHNFcHNpbG9uKGksYS5aRVJPLE0uRVBTSUxPTjYpJiYoaT1hLmNsb25lKGEuVU5JVF9YLGkpKTtsZXQgcz1hLmNyb3NzKGksZSxiUCk7cmV0dXJuIGEubm9ybWFsaXplKHMscyksYS5jcm9zcyhlLHMsaSksYS5uZWdhdGUoaSxpKSxhLm5vcm1hbGl6ZShpLGkpLGgobyl8fChvPW5ldyBKKSxvWzBdPWUueCxvWzFdPWUueSxvWzJdPWUueixvWzNdPWkueCxvWzRdPWkueSxvWzVdPWkueixvWzZdPXMueCxvWzddPXMueSxvWzhdPXMueixvfTtpYj1uZXcgc3QoMCwwLDEsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSksc2I9bmV3IGF0LGhoPW5ldyBhLHdQPW5ldyBhLFRQPW5ldyBKLF9oPW5ldyBzdCxjYj1uZXcgc3Q7VWUuYmFzaXNUbzJEPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgRigicHJvamVjdGlvbiBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgRigibWF0cml4IGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBGKCJyZXN1bHQgaXMgcmVxdWlyZWQuIik7bGV0IG89c3QuZ2V0VHJhbnNsYXRpb24oZSx3UCkscj10LmVsbGlwc29pZCxpO2lmKGEuZXF1YWxzKG8sYS5aRVJPKSlpPWEuY2xvbmUoYS5aRVJPLGhoKTtlbHNle2xldCBsPXIuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMobyxzYik7aT10LnByb2plY3QobCxoaCksYS5mcm9tRWxlbWVudHMoaS56LGkueCxpLnksaSl9bGV0IHM9VWUuZWFzdE5vcnRoVXBUb0ZpeGVkRnJhbWUobyxyLF9oKSxmPXN0LmludmVyc2VUcmFuc2Zvcm1hdGlvbihzLGNiKSx1PXN0LmdldE1hdHJpeDMoZSxUUCksYz1zdC5tdWx0aXBseUJ5TWF0cml4MyhmLHUsbik7cmV0dXJuIHN0Lm11bHRpcGx5KGliLGMsbiksc3Quc2V0VHJhbnNsYXRpb24obixpLG4pLG59O1VlLndnczg0VG8yRE1vZGVsTWF0cml4PWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgRigicHJvamVjdGlvbiBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgRigiY2VudGVyIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBGKCJyZXN1bHQgaXMgcmVxdWlyZWQuIik7bGV0IG89dC5lbGxpcHNvaWQscj1VZS5lYXN0Tm9ydGhVcFRvRml4ZWRGcmFtZShlLG8sX2gpLGk9c3QuaW52ZXJzZVRyYW5zZm9ybWF0aW9uKHIsY2IpLHM9by5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhlLHNiKSxmPXQucHJvamVjdChzLGhoKTthLmZyb21FbGVtZW50cyhmLnosZi54LGYueSxmKTtsZXQgdT1zdC5mcm9tVHJhbnNsYXRpb24oZixfaCk7cmV0dXJuIHN0Lm11bHRpcGx5KGliLGksbiksc3QubXVsdGlwbHkodSxuLG4pLG59O1lvPVVlfSk7ZnVuY3Rpb24gYWUodCxlLG4sbyl7dGhpcy53ZXN0PXgodCwwKSx0aGlzLnNvdXRoPXgoZSwwKSx0aGlzLmVhc3Q9eChuLDApLHRoaXMubm9ydGg9eChvLDApfXZhciBPUCxFUCxSUCxTUCxDUCx5aCx4UCxOdCx3bj1aKCgpPT57RnQoKTtQZSgpO1h0KCk7SXQoKTtmdCgpO1p0KCk7V3QoKTtjcygpO0JuKCk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYWUucHJvdG90eXBlLHt3aWR0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGFlLmNvbXB1dGVXaWR0aCh0aGlzKX19LGhlaWdodDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGFlLmNvbXB1dGVIZWlnaHQodGhpcyl9fX0pO2FlLnBhY2tlZExlbmd0aD00O2FlLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxuPXgobiwwKSxlW24rK109dC53ZXN0LGVbbisrXT10LnNvdXRoLGVbbisrXT10LmVhc3QsZVtuXT10Lm5vcnRoLGV9O2FlLnVucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkuZGVmaW5lZCgiYXJyYXkiLHQpLGU9eChlLDApLGgobil8fChuPW5ldyBhZSksbi53ZXN0PXRbZSsrXSxuLnNvdXRoPXRbZSsrXSxuLmVhc3Q9dFtlKytdLG4ubm9ydGg9dFtlXSxufTthZS5jb21wdXRlV2lkdGg9ZnVuY3Rpb24odCl7eS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpO2xldCBlPXQuZWFzdCxuPXQud2VzdDtyZXR1cm4gZTxuJiYoZSs9TS5UV09fUEkpLGUtbn07YWUuY29tcHV0ZUhlaWdodD1mdW5jdGlvbih0KXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHQubm9ydGgtdC5zb3V0aH07YWUuZnJvbURlZ3JlZXM9ZnVuY3Rpb24odCxlLG4sbyxyKXtyZXR1cm4gdD1NLnRvUmFkaWFucyh4KHQsMCkpLGU9TS50b1JhZGlhbnMoeChlLDApKSxuPU0udG9SYWRpYW5zKHgobiwwKSksbz1NLnRvUmFkaWFucyh4KG8sMCkpLGgocik/KHIud2VzdD10LHIuc291dGg9ZSxyLmVhc3Q9bixyLm5vcnRoPW8scik6bmV3IGFlKHQsZSxuLG8pfTthZS5mcm9tUmFkaWFucz1mdW5jdGlvbih0LGUsbixvLHIpe3JldHVybiBoKHIpPyhyLndlc3Q9eCh0LDApLHIuc291dGg9eChlLDApLHIuZWFzdD14KG4sMCksci5ub3J0aD14KG8sMCkscik6bmV3IGFlKHQsZSxuLG8pfTthZS5mcm9tQ2FydG9ncmFwaGljQXJyYXk9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoImNhcnRvZ3JhcGhpY3MiLHQpO2xldCBuPU51bWJlci5NQVhfVkFMVUUsbz0tTnVtYmVyLk1BWF9WQUxVRSxyPU51bWJlci5NQVhfVkFMVUUsaT0tTnVtYmVyLk1BWF9WQUxVRSxzPU51bWJlci5NQVhfVkFMVUUsZj0tTnVtYmVyLk1BWF9WQUxVRTtmb3IobGV0IHU9MCxjPXQubGVuZ3RoO3U8Yzt1Kyspe2xldCBsPXRbdV07bj1NYXRoLm1pbihuLGwubG9uZ2l0dWRlKSxvPU1hdGgubWF4KG8sbC5sb25naXR1ZGUpLHM9TWF0aC5taW4ocyxsLmxhdGl0dWRlKSxmPU1hdGgubWF4KGYsbC5sYXRpdHVkZSk7bGV0IHA9bC5sb25naXR1ZGU+PTA/bC5sb25naXR1ZGU6bC5sb25naXR1ZGUrTS5UV09fUEk7cj1NYXRoLm1pbihyLHApLGk9TWF0aC5tYXgoaSxwKX1yZXR1cm4gby1uPmktciYmKG49cixvPWksbz5NLlBJJiYobz1vLU0uVFdPX1BJKSxuPk0uUEkmJihuPW4tTS5UV09fUEkpKSxoKGUpPyhlLndlc3Q9bixlLnNvdXRoPXMsZS5lYXN0PW8sZS5ub3J0aD1mLGUpOm5ldyBhZShuLHMsbyxmKX07YWUuZnJvbUNhcnRlc2lhbkFycmF5PWZ1bmN0aW9uKHQsZSxuKXt5LmRlZmluZWQoImNhcnRlc2lhbnMiLHQpLGU9eChlLCQuV0dTODQpO2xldCBvPU51bWJlci5NQVhfVkFMVUUscj0tTnVtYmVyLk1BWF9WQUxVRSxpPU51bWJlci5NQVhfVkFMVUUscz0tTnVtYmVyLk1BWF9WQUxVRSxmPU51bWJlci5NQVhfVkFMVUUsdT0tTnVtYmVyLk1BWF9WQUxVRTtmb3IobGV0IGM9MCxsPXQubGVuZ3RoO2M8bDtjKyspe2xldCBwPWUuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWModFtjXSk7bz1NYXRoLm1pbihvLHAubG9uZ2l0dWRlKSxyPU1hdGgubWF4KHIscC5sb25naXR1ZGUpLGY9TWF0aC5taW4oZixwLmxhdGl0dWRlKSx1PU1hdGgubWF4KHUscC5sYXRpdHVkZSk7bGV0IGQ9cC5sb25naXR1ZGU+PTA/cC5sb25naXR1ZGU6cC5sb25naXR1ZGUrTS5UV09fUEk7aT1NYXRoLm1pbihpLGQpLHM9TWF0aC5tYXgocyxkKX1yZXR1cm4gci1vPnMtaSYmKG89aSxyPXMscj5NLlBJJiYocj1yLU0uVFdPX1BJKSxvPk0uUEkmJihvPW8tTS5UV09fUEkpKSxoKG4pPyhuLndlc3Q9byxuLnNvdXRoPWYsbi5lYXN0PXIsbi5ub3J0aD11LG4pOm5ldyBhZShvLGYscix1KX07T1A9bmV3IGEsRVA9bmV3IGEsUlA9bmV3IGEsU1A9bmV3IGEsQ1A9bmV3IGEseWg9bmV3IEFycmF5KDUpO2ZvcihsZXQgdD0wO3Q8eWgubGVuZ3RoOysrdCl5aFt0XT1uZXcgYTthZS5mcm9tQm91bmRpbmdTcGhlcmU9ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgiYm91bmRpbmdTcGhlcmUiLHQpO2xldCBvPXQuY2VudGVyLHI9dC5yYWRpdXM7aWYoaChlKXx8KGU9JC5XR1M4NCksaChuKXx8KG49bmV3IGFlKSxhLmVxdWFscyhvLGEuWkVSTykpcmV0dXJuIGFlLmNsb25lKGFlLk1BWF9WQUxVRSxuKSxuO2xldCBpPVlvLmVhc3ROb3J0aFVwVG9GaXhlZEZyYW1lKG8sZSxPUCkscz1zdC5tdWx0aXBseUJ5UG9pbnRBc1ZlY3RvcihpLGEuVU5JVF9YLEVQKTthLm5vcm1hbGl6ZShzLHMpO2xldCBmPXN0Lm11bHRpcGx5QnlQb2ludEFzVmVjdG9yKGksYS5VTklUX1ksUlApO2Eubm9ybWFsaXplKGYsZiksYS5tdWx0aXBseUJ5U2NhbGFyKGYscixmKSxhLm11bHRpcGx5QnlTY2FsYXIocyxyLHMpO2xldCB1PWEubmVnYXRlKGYsQ1ApLGM9YS5uZWdhdGUocyxTUCksbD15aCxwPWxbMF07cmV0dXJuIGEuYWRkKG8sZixwKSxwPWxbMV0sYS5hZGQobyxjLHApLHA9bFsyXSxhLmFkZChvLHUscCkscD1sWzNdLGEuYWRkKG8scyxwKSxsWzRdPW8sYWUuZnJvbUNhcnRlc2lhbkFycmF5KGwsZSxuKX07YWUuY2xvbmU9ZnVuY3Rpb24odCxlKXtpZihoKHQpKXJldHVybiBoKGUpPyhlLndlc3Q9dC53ZXN0LGUuc291dGg9dC5zb3V0aCxlLmVhc3Q9dC5lYXN0LGUubm9ydGg9dC5ub3J0aCxlKTpuZXcgYWUodC53ZXN0LHQuc291dGgsdC5lYXN0LHQubm9ydGgpfTthZS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbj14KG4sMCksdD09PWV8fGgodCkmJmgoZSkmJk1hdGguYWJzKHQud2VzdC1lLndlc3QpPD1uJiZNYXRoLmFicyh0LnNvdXRoLWUuc291dGgpPD1uJiZNYXRoLmFicyh0LmVhc3QtZS5lYXN0KTw9biYmTWF0aC5hYnModC5ub3J0aC1lLm5vcnRoKTw9bn07YWUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiBhZS5jbG9uZSh0aGlzLHQpfTthZS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBhZS5lcXVhbHModGhpcyx0KX07YWUuZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxoKHQpJiZoKGUpJiZ0Lndlc3Q9PT1lLndlc3QmJnQuc291dGg9PT1lLnNvdXRoJiZ0LmVhc3Q9PT1lLmVhc3QmJnQubm9ydGg9PT1lLm5vcnRofTthZS5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUpe3JldHVybiBhZS5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlKX07YWUudmFsaWRhdGU9ZnVuY3Rpb24odCl7eS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpO2xldCBlPXQubm9ydGg7eS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIm5vcnRoIixlLC1NLlBJX09WRVJfVFdPKSx5LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygibm9ydGgiLGUsTS5QSV9PVkVSX1RXTyk7bGV0IG49dC5zb3V0aDt5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygic291dGgiLG4sLU0uUElfT1ZFUl9UV08pLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJzb3V0aCIsbixNLlBJX09WRVJfVFdPKTtsZXQgbz10Lndlc3Q7eS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIndlc3QiLG8sLU1hdGguUEkpLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJ3ZXN0IixvLE1hdGguUEkpO2xldCByPXQuZWFzdDt5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiZWFzdCIsciwtTWF0aC5QSSkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImVhc3QiLHIsTWF0aC5QSSl9O2FlLnNvdXRod2VzdD1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaChlKT8oZS5sb25naXR1ZGU9dC53ZXN0LGUubGF0aXR1ZGU9dC5zb3V0aCxlLmhlaWdodD0wLGUpOm5ldyBhdCh0Lndlc3QsdC5zb3V0aCl9O2FlLm5vcnRod2VzdD1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaChlKT8oZS5sb25naXR1ZGU9dC53ZXN0LGUubGF0aXR1ZGU9dC5ub3J0aCxlLmhlaWdodD0wLGUpOm5ldyBhdCh0Lndlc3QsdC5ub3J0aCl9O2FlLm5vcnRoZWFzdD1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaChlKT8oZS5sb25naXR1ZGU9dC5lYXN0LGUubGF0aXR1ZGU9dC5ub3J0aCxlLmhlaWdodD0wLGUpOm5ldyBhdCh0LmVhc3QsdC5ub3J0aCl9O2FlLnNvdXRoZWFzdD1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaChlKT8oZS5sb25naXR1ZGU9dC5lYXN0LGUubGF0aXR1ZGU9dC5zb3V0aCxlLmhlaWdodD0wLGUpOm5ldyBhdCh0LmVhc3QsdC5zb3V0aCl9O2FlLmNlbnRlcj1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtsZXQgbj10LmVhc3Qsbz10Lndlc3Q7bjxvJiYobis9TS5UV09fUEkpO2xldCByPU0ubmVnYXRpdmVQaVRvUGkoKG8rbikqLjUpLGk9KHQuc291dGgrdC5ub3J0aCkqLjU7cmV0dXJuIGgoZSk/KGUubG9uZ2l0dWRlPXIsZS5sYXRpdHVkZT1pLGUuaGVpZ2h0PTAsZSk6bmV3IGF0KHIsaSl9O2FlLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHkudHlwZU9mLm9iamVjdCgib3RoZXJSZWN0YW5nbGUiLGUpO2xldCBvPXQuZWFzdCxyPXQud2VzdCxpPWUuZWFzdCxzPWUud2VzdDtvPHImJmk+MD9vKz1NLlRXT19QSTppPHMmJm8+MCYmKGkrPU0uVFdPX1BJKSxvPHImJnM8MD9zKz1NLlRXT19QSTppPHMmJnI8MCYmKHIrPU0uVFdPX1BJKTtsZXQgZj1NLm5lZ2F0aXZlUGlUb1BpKE1hdGgubWF4KHIscykpLHU9TS5uZWdhdGl2ZVBpVG9QaShNYXRoLm1pbihvLGkpKTtpZigodC53ZXN0PHQuZWFzdHx8ZS53ZXN0PGUuZWFzdCkmJnU8PWYpcmV0dXJuO2xldCBjPU1hdGgubWF4KHQuc291dGgsZS5zb3V0aCksbD1NYXRoLm1pbih0Lm5vcnRoLGUubm9ydGgpO2lmKCEoYz49bCkpcmV0dXJuIGgobik/KG4ud2VzdD1mLG4uc291dGg9YyxuLmVhc3Q9dSxuLm5vcnRoPWwsbik6bmV3IGFlKGYsYyx1LGwpfTthZS5zaW1wbGVJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSx5LnR5cGVPZi5vYmplY3QoIm90aGVyUmVjdGFuZ2xlIixlKTtsZXQgbz1NYXRoLm1heCh0Lndlc3QsZS53ZXN0KSxyPU1hdGgubWF4KHQuc291dGgsZS5zb3V0aCksaT1NYXRoLm1pbih0LmVhc3QsZS5lYXN0KSxzPU1hdGgubWluKHQubm9ydGgsZS5ub3J0aCk7aWYoIShyPj1zfHxvPj1pKSlyZXR1cm4gaChuKT8obi53ZXN0PW8sbi5zb3V0aD1yLG4uZWFzdD1pLG4ubm9ydGg9cyxuKTpuZXcgYWUobyxyLGkscyl9O2FlLnVuaW9uPWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCkseS50eXBlT2Yub2JqZWN0KCJvdGhlclJlY3RhbmdsZSIsZSksaChuKXx8KG49bmV3IGFlKTtsZXQgbz10LmVhc3Qscj10Lndlc3QsaT1lLmVhc3Qscz1lLndlc3Q7bzxyJiZpPjA/bys9TS5UV09fUEk6aTxzJiZvPjAmJihpKz1NLlRXT19QSSksbzxyJiZzPDA/cys9TS5UV09fUEk6aTxzJiZyPDAmJihyKz1NLlRXT19QSSk7bGV0IGY9TS5uZWdhdGl2ZVBpVG9QaShNYXRoLm1pbihyLHMpKSx1PU0ubmVnYXRpdmVQaVRvUGkoTWF0aC5tYXgobyxpKSk7cmV0dXJuIG4ud2VzdD1mLG4uc291dGg9TWF0aC5taW4odC5zb3V0aCxlLnNvdXRoKSxuLmVhc3Q9dSxuLm5vcnRoPU1hdGgubWF4KHQubm9ydGgsZS5ub3J0aCksbn07YWUuZXhwYW5kPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHkudHlwZU9mLm9iamVjdCgiY2FydG9ncmFwaGljIixlKSxoKG4pfHwobj1uZXcgYWUpLG4ud2VzdD1NYXRoLm1pbih0Lndlc3QsZS5sb25naXR1ZGUpLG4uc291dGg9TWF0aC5taW4odC5zb3V0aCxlLmxhdGl0dWRlKSxuLmVhc3Q9TWF0aC5tYXgodC5lYXN0LGUubG9uZ2l0dWRlKSxuLm5vcnRoPU1hdGgubWF4KHQubm9ydGgsZS5sYXRpdHVkZSksbn07YWUuY29udGFpbnM9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCkseS50eXBlT2Yub2JqZWN0KCJjYXJ0b2dyYXBoaWMiLGUpO2xldCBuPWUubG9uZ2l0dWRlLG89ZS5sYXRpdHVkZSxyPXQud2VzdCxpPXQuZWFzdDtyZXR1cm4gaTxyJiYoaSs9TS5UV09fUEksbjwwJiYobis9TS5UV09fUEkpKSwobj5yfHxNLmVxdWFsc0Vwc2lsb24obixyLE0uRVBTSUxPTjE0KSkmJihuPGl8fE0uZXF1YWxzRXBzaWxvbihuLGksTS5FUFNJTE9OMTQpKSYmbz49dC5zb3V0aCYmbzw9dC5ub3J0aH07eFA9bmV3IGF0O2FlLnN1YnNhbXBsZT1mdW5jdGlvbih0LGUsbixvKXt5LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksZT14KGUsJC5XR1M4NCksbj14KG4sMCksaChvKXx8KG89W10pO2xldCByPTAsaT10Lm5vcnRoLHM9dC5zb3V0aCxmPXQuZWFzdCx1PXQud2VzdCxjPXhQO2MuaGVpZ2h0PW4sYy5sb25naXR1ZGU9dSxjLmxhdGl0dWRlPWksb1tyXT1lLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGMsb1tyXSkscisrLGMubG9uZ2l0dWRlPWYsb1tyXT1lLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGMsb1tyXSkscisrLGMubGF0aXR1ZGU9cyxvW3JdPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oYyxvW3JdKSxyKyssYy5sb25naXR1ZGU9dSxvW3JdPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oYyxvW3JdKSxyKyssaTwwP2MubGF0aXR1ZGU9aTpzPjA/Yy5sYXRpdHVkZT1zOmMubGF0aXR1ZGU9MDtmb3IobGV0IGw9MTtsPDg7KytsKWMubG9uZ2l0dWRlPS1NYXRoLlBJK2wqTS5QSV9PVkVSX1RXTyxhZS5jb250YWlucyh0LGMpJiYob1tyXT1lLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGMsb1tyXSkscisrKTtyZXR1cm4gYy5sYXRpdHVkZT09PTAmJihjLmxvbmdpdHVkZT11LG9bcl09ZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihjLG9bcl0pLHIrKyxjLmxvbmdpdHVkZT1mLG9bcl09ZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihjLG9bcl0pLHIrKyksby5sZW5ndGg9cixvfTthZS5zdWJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLG8scixpKXtpZih5LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIndlc3RMZXJwIixlLDApLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJ3ZXN0TGVycCIsZSwxKSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygic291dGhMZXJwIixuLDApLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJzb3V0aExlcnAiLG4sMSkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImVhc3RMZXJwIixvLDApLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJlYXN0TGVycCIsbywxKSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygibm9ydGhMZXJwIixyLDApLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJub3J0aExlcnAiLHIsMSkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIndlc3RMZXJwIixlLG8pLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJzb3V0aExlcnAiLG4sciksaChpKXx8KGk9bmV3IGFlKSx0Lndlc3Q8PXQuZWFzdCl7bGV0IGY9dC5lYXN0LXQud2VzdDtpLndlc3Q9dC53ZXN0K2UqZixpLmVhc3Q9dC53ZXN0K28qZn1lbHNle2xldCBmPU0uVFdPX1BJK3QuZWFzdC10Lndlc3Q7aS53ZXN0PU0ubmVnYXRpdmVQaVRvUGkodC53ZXN0K2UqZiksaS5lYXN0PU0ubmVnYXRpdmVQaVRvUGkodC53ZXN0K28qZil9bGV0IHM9dC5ub3J0aC10LnNvdXRoO3JldHVybiBpLnNvdXRoPXQuc291dGgrbipzLGkubm9ydGg9dC5zb3V0aCtyKnMsZT09PTEmJihpLndlc3Q9dC5lYXN0KSxvPT09MSYmKGkuZWFzdD10LmVhc3QpLG49PT0xJiYoaS5zb3V0aD10Lm5vcnRoKSxyPT09MSYmKGkubm9ydGg9dC5ub3J0aCksaX07YWUuTUFYX1ZBTFVFPU9iamVjdC5mcmVlemUobmV3IGFlKC1NYXRoLlBJLC1NLlBJX09WRVJfVFdPLE1hdGguUEksTS5QSV9PVkVSX1RXTykpO050PWFlfSk7ZnVuY3Rpb24gbmUodCxlKXt0aGlzLmNlbnRlcj1hLmNsb25lKHgodCxhLlpFUk8pKSx0aGlzLnJhZGl1cz14KGUsMCl9dmFyIGJoLHdoLFRoLE9oLEVoLFJoLFNoLGlvLENoLHhoLFBoLE1oLFBQLE1QLE5QLElQLGdoLEFoLHZQLExQLERQLEZQLEJQLFVQLFZQLGtQLEdQLHpQLGpQLEhQLGFiLHFQLEtQLFdQLFhQLFlQLGZiLCRQLEF0LE1lPVooKCk9PntGdCgpO1BlKCk7WHQoKTtJdCgpO2Z0KCk7WnQoKTtTaSgpO2tzKCk7emwoKTtXdCgpO0ZuKCk7Qm4oKTt3bigpO2JoPW5ldyBhLHdoPW5ldyBhLFRoPW5ldyBhLE9oPW5ldyBhLEVoPW5ldyBhLFJoPW5ldyBhLFNoPW5ldyBhLGlvPW5ldyBhLENoPW5ldyBhLHhoPW5ldyBhLFBoPW5ldyBhLE1oPW5ldyBhLFBQPTQvMypNLlBJO25lLmZyb21Qb2ludHM9ZnVuY3Rpb24odCxlKXtpZihoKGUpfHwoZT1uZXcgbmUpLCFoKHQpfHx0Lmxlbmd0aD09PTApcmV0dXJuIGUuY2VudGVyPWEuY2xvbmUoYS5aRVJPLGUuY2VudGVyKSxlLnJhZGl1cz0wLGU7bGV0IG49YS5jbG9uZSh0WzBdLFNoKSxvPWEuY2xvbmUobixiaCkscj1hLmNsb25lKG4sd2gpLGk9YS5jbG9uZShuLFRoKSxzPWEuY2xvbmUobixPaCksZj1hLmNsb25lKG4sRWgpLHU9YS5jbG9uZShuLFJoKSxjPXQubGVuZ3RoLGw7Zm9yKGw9MTtsPGM7bCsrKXthLmNsb25lKHRbbF0sbik7bGV0IEQ9bi54LHY9bi55LEw9bi56O0Q8by54JiZhLmNsb25lKG4sbyksRD5zLngmJmEuY2xvbmUobixzKSx2PHIueSYmYS5jbG9uZShuLHIpLHY+Zi55JiZhLmNsb25lKG4sZiksTDxpLnomJmEuY2xvbmUobixpKSxMPnUueiYmYS5jbG9uZShuLHUpfWxldCBwPWEubWFnbml0dWRlU3F1YXJlZChhLnN1YnRyYWN0KHMsbyxpbykpLGQ9YS5tYWduaXR1ZGVTcXVhcmVkKGEuc3VidHJhY3QoZixyLGlvKSksbT1hLm1hZ25pdHVkZVNxdWFyZWQoYS5zdWJ0cmFjdCh1LGksaW8pKSxfPW8sZz1zLGI9cDtkPmImJihiPWQsXz1yLGc9ZiksbT5iJiYoYj1tLF89aSxnPXUpO2xldCB3PUNoO3cueD0oXy54K2cueCkqLjUsdy55PShfLnkrZy55KSouNSx3Lno9KF8ueitnLnopKi41O2xldCBPPWEubWFnbml0dWRlU3F1YXJlZChhLnN1YnRyYWN0KGcsdyxpbykpLEU9TWF0aC5zcXJ0KE8pLFQ9eGg7VC54PW8ueCxULnk9ci55LFQuej1pLno7bGV0IEM9UGg7Qy54PXMueCxDLnk9Zi55LEMuej11Lno7bGV0IE49YS5taWRwb2ludChULEMsTWgpLEk9MDtmb3IobD0wO2w8YztsKyspe2EuY2xvbmUodFtsXSxuKTtsZXQgRD1hLm1hZ25pdHVkZShhLnN1YnRyYWN0KG4sTixpbykpO0Q+SSYmKEk9RCk7bGV0IHY9YS5tYWduaXR1ZGVTcXVhcmVkKGEuc3VidHJhY3Qobix3LGlvKSk7aWYodj5PKXtsZXQgTD1NYXRoLnNxcnQodik7RT0oRStMKSouNSxPPUUqRTtsZXQgVT1MLUU7dy54PShFKncueCtVKm4ueCkvTCx3Lnk9KEUqdy55K1Uqbi55KS9MLHcuej0oRSp3LnorVSpuLnopL0x9fXJldHVybiBFPEk/KGEuY2xvbmUodyxlLmNlbnRlciksZS5yYWRpdXM9RSk6KGEuY2xvbmUoTixlLmNlbnRlciksZS5yYWRpdXM9SSksZX07TVA9bmV3IFFuLE5QPW5ldyBhLElQPW5ldyBhLGdoPW5ldyBhdCxBaD1uZXcgYXQ7bmUuZnJvbVJlY3RhbmdsZTJEPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmUuZnJvbVJlY3RhbmdsZVdpdGhIZWlnaHRzMkQodCxlLDAsMCxuKX07bmUuZnJvbVJlY3RhbmdsZVdpdGhIZWlnaHRzMkQ9ZnVuY3Rpb24odCxlLG4sbyxyKXtpZihoKHIpfHwocj1uZXcgbmUpLCFoKHQpKXJldHVybiByLmNlbnRlcj1hLmNsb25lKGEuWkVSTyxyLmNlbnRlciksci5yYWRpdXM9MCxyO2U9eChlLE1QKSxOdC5zb3V0aHdlc3QodCxnaCksZ2guaGVpZ2h0PW4sTnQubm9ydGhlYXN0KHQsQWgpLEFoLmhlaWdodD1vO2xldCBpPWUucHJvamVjdChnaCxOUCkscz1lLnByb2plY3QoQWgsSVApLGY9cy54LWkueCx1PXMueS1pLnksYz1zLnotaS56O3IucmFkaXVzPU1hdGguc3FydChmKmYrdSp1K2MqYykqLjU7bGV0IGw9ci5jZW50ZXI7cmV0dXJuIGwueD1pLngrZiouNSxsLnk9aS55K3UqLjUsbC56PWkueitjKi41LHJ9O3ZQPVtdO25lLmZyb21SZWN0YW5nbGUzRD1mdW5jdGlvbih0LGUsbixvKXtpZihlPXgoZSwkLldHUzg0KSxuPXgobiwwKSxoKG8pfHwobz1uZXcgbmUpLCFoKHQpKXJldHVybiBvLmNlbnRlcj1hLmNsb25lKGEuWkVSTyxvLmNlbnRlciksby5yYWRpdXM9MCxvO2xldCByPU50LnN1YnNhbXBsZSh0LGUsbix2UCk7cmV0dXJuIG5lLmZyb21Qb2ludHMocixvKX07bmUuZnJvbVZlcnRpY2VzPWZ1bmN0aW9uKHQsZSxuLG8pe2lmKGgobyl8fChvPW5ldyBuZSksIWgodCl8fHQubGVuZ3RoPT09MClyZXR1cm4gby5jZW50ZXI9YS5jbG9uZShhLlpFUk8sby5jZW50ZXIpLG8ucmFkaXVzPTAsbztlPXgoZSxhLlpFUk8pLG49eChuLDMpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJzdHJpZGUiLG4sMyk7bGV0IHI9U2g7ci54PXRbMF0rZS54LHIueT10WzFdK2UueSxyLno9dFsyXStlLno7bGV0IGk9YS5jbG9uZShyLGJoKSxzPWEuY2xvbmUocix3aCksZj1hLmNsb25lKHIsVGgpLHU9YS5jbG9uZShyLE9oKSxjPWEuY2xvbmUocixFaCksbD1hLmNsb25lKHIsUmgpLHA9dC5sZW5ndGgsZDtmb3IoZD0wO2Q8cDtkKz1uKXtsZXQgTD10W2RdK2UueCxVPXRbZCsxXStlLnksQT10W2QrMl0rZS56O3IueD1MLHIueT1VLHIuej1BLEw8aS54JiZhLmNsb25lKHIsaSksTD51LngmJmEuY2xvbmUocix1KSxVPHMueSYmYS5jbG9uZShyLHMpLFU+Yy55JiZhLmNsb25lKHIsYyksQTxmLnomJmEuY2xvbmUocixmKSxBPmwueiYmYS5jbG9uZShyLGwpfWxldCBtPWEubWFnbml0dWRlU3F1YXJlZChhLnN1YnRyYWN0KHUsaSxpbykpLF89YS5tYWduaXR1ZGVTcXVhcmVkKGEuc3VidHJhY3QoYyxzLGlvKSksZz1hLm1hZ25pdHVkZVNxdWFyZWQoYS5zdWJ0cmFjdChsLGYsaW8pKSxiPWksdz11LE89bTtfPk8mJihPPV8sYj1zLHc9YyksZz5PJiYoTz1nLGI9Zix3PWwpO2xldCBFPUNoO0UueD0oYi54K3cueCkqLjUsRS55PShiLnkrdy55KSouNSxFLno9KGIueit3LnopKi41O2xldCBUPWEubWFnbml0dWRlU3F1YXJlZChhLnN1YnRyYWN0KHcsRSxpbykpLEM9TWF0aC5zcXJ0KFQpLE49eGg7Ti54PWkueCxOLnk9cy55LE4uej1mLno7bGV0IEk9UGg7SS54PXUueCxJLnk9Yy55LEkuej1sLno7bGV0IEQ9YS5taWRwb2ludChOLEksTWgpLHY9MDtmb3IoZD0wO2Q8cDtkKz1uKXtyLng9dFtkXStlLngsci55PXRbZCsxXStlLnksci56PXRbZCsyXStlLno7bGV0IEw9YS5tYWduaXR1ZGUoYS5zdWJ0cmFjdChyLEQsaW8pKTtMPnYmJih2PUwpO2xldCBVPWEubWFnbml0dWRlU3F1YXJlZChhLnN1YnRyYWN0KHIsRSxpbykpO2lmKFU+VCl7bGV0IEE9TWF0aC5zcXJ0KFUpO0M9KEMrQSkqLjUsVD1DKkM7bGV0IFM9QS1DO0UueD0oQypFLngrUypyLngpL0EsRS55PShDKkUueStTKnIueSkvQSxFLno9KEMqRS56K1Mqci56KS9BfX1yZXR1cm4gQzx2PyhhLmNsb25lKEUsby5jZW50ZXIpLG8ucmFkaXVzPUMpOihhLmNsb25lKEQsby5jZW50ZXIpLG8ucmFkaXVzPXYpLG99O25lLmZyb21FbmNvZGVkQ2FydGVzaWFuVmVydGljZXM9ZnVuY3Rpb24odCxlLG4pe2lmKGgobil8fChuPW5ldyBuZSksIWgodCl8fCFoKGUpfHx0Lmxlbmd0aCE9PWUubGVuZ3RofHx0Lmxlbmd0aD09PTApcmV0dXJuIG4uY2VudGVyPWEuY2xvbmUoYS5aRVJPLG4uY2VudGVyKSxuLnJhZGl1cz0wLG47bGV0IG89U2g7by54PXRbMF0rZVswXSxvLnk9dFsxXStlWzFdLG8uej10WzJdK2VbMl07bGV0IHI9YS5jbG9uZShvLGJoKSxpPWEuY2xvbmUobyx3aCkscz1hLmNsb25lKG8sVGgpLGY9YS5jbG9uZShvLE9oKSx1PWEuY2xvbmUobyxFaCksYz1hLmNsb25lKG8sUmgpLGw9dC5sZW5ndGgscDtmb3IocD0wO3A8bDtwKz0zKXtsZXQgdj10W3BdK2VbcF0sTD10W3ArMV0rZVtwKzFdLFU9dFtwKzJdK2VbcCsyXTtvLng9dixvLnk9TCxvLno9VSx2PHIueCYmYS5jbG9uZShvLHIpLHY+Zi54JiZhLmNsb25lKG8sZiksTDxpLnkmJmEuY2xvbmUobyxpKSxMPnUueSYmYS5jbG9uZShvLHUpLFU8cy56JiZhLmNsb25lKG8scyksVT5jLnomJmEuY2xvbmUobyxjKX1sZXQgZD1hLm1hZ25pdHVkZVNxdWFyZWQoYS5zdWJ0cmFjdChmLHIsaW8pKSxtPWEubWFnbml0dWRlU3F1YXJlZChhLnN1YnRyYWN0KHUsaSxpbykpLF89YS5tYWduaXR1ZGVTcXVhcmVkKGEuc3VidHJhY3QoYyxzLGlvKSksZz1yLGI9Zix3PWQ7bT53JiYodz1tLGc9aSxiPXUpLF8+dyYmKHc9XyxnPXMsYj1jKTtsZXQgTz1DaDtPLng9KGcueCtiLngpKi41LE8ueT0oZy55K2IueSkqLjUsTy56PShnLnorYi56KSouNTtsZXQgRT1hLm1hZ25pdHVkZVNxdWFyZWQoYS5zdWJ0cmFjdChiLE8saW8pKSxUPU1hdGguc3FydChFKSxDPXhoO0MueD1yLngsQy55PWkueSxDLno9cy56O2xldCBOPVBoO04ueD1mLngsTi55PXUueSxOLno9Yy56O2xldCBJPWEubWlkcG9pbnQoQyxOLE1oKSxEPTA7Zm9yKHA9MDtwPGw7cCs9Myl7by54PXRbcF0rZVtwXSxvLnk9dFtwKzFdK2VbcCsxXSxvLno9dFtwKzJdK2VbcCsyXTtsZXQgdj1hLm1hZ25pdHVkZShhLnN1YnRyYWN0KG8sSSxpbykpO3Y+RCYmKEQ9dik7bGV0IEw9YS5tYWduaXR1ZGVTcXVhcmVkKGEuc3VidHJhY3QobyxPLGlvKSk7aWYoTD5FKXtsZXQgVT1NYXRoLnNxcnQoTCk7VD0oVCtVKSouNSxFPVQqVDtsZXQgQT1VLVQ7Ty54PShUKk8ueCtBKm8ueCkvVSxPLnk9KFQqTy55K0Eqby55KS9VLE8uej0oVCpPLnorQSpvLnopL1V9fXJldHVybiBUPEQ/KGEuY2xvbmUoTyxuLmNlbnRlciksbi5yYWRpdXM9VCk6KGEuY2xvbmUoSSxuLmNlbnRlciksbi5yYWRpdXM9RCksbn07bmUuZnJvbUNvcm5lclBvaW50cz1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJjb3JuZXIiLHQpLHkudHlwZU9mLm9iamVjdCgib3Bwb3NpdGVDb3JuZXIiLGUpLGgobil8fChuPW5ldyBuZSk7bGV0IG89YS5taWRwb2ludCh0LGUsbi5jZW50ZXIpO3JldHVybiBuLnJhZGl1cz1hLmRpc3RhbmNlKG8sZSksbn07bmUuZnJvbUVsbGlwc29pZD1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImVsbGlwc29pZCIsdCksaChlKXx8KGU9bmV3IG5lKSxhLmNsb25lKGEuWkVSTyxlLmNlbnRlciksZS5yYWRpdXM9dC5tYXhpbXVtUmFkaXVzLGV9O0xQPW5ldyBhO25lLmZyb21Cb3VuZGluZ1NwaGVyZXM9ZnVuY3Rpb24odCxlKXtpZihoKGUpfHwoZT1uZXcgbmUpLCFoKHQpfHx0Lmxlbmd0aD09PTApcmV0dXJuIGUuY2VudGVyPWEuY2xvbmUoYS5aRVJPLGUuY2VudGVyKSxlLnJhZGl1cz0wLGU7bGV0IG49dC5sZW5ndGg7aWYobj09PTEpcmV0dXJuIG5lLmNsb25lKHRbMF0sZSk7aWYobj09PTIpcmV0dXJuIG5lLnVuaW9uKHRbMF0sdFsxXSxlKTtsZXQgbz1bXSxyO2ZvcihyPTA7cjxuO3IrKylvLnB1c2godFtyXS5jZW50ZXIpO2U9bmUuZnJvbVBvaW50cyhvLGUpO2xldCBpPWUuY2VudGVyLHM9ZS5yYWRpdXM7Zm9yKHI9MDtyPG47cisrKXtsZXQgZj10W3JdO3M9TWF0aC5tYXgocyxhLmRpc3RhbmNlKGksZi5jZW50ZXIsTFApK2YucmFkaXVzKX1yZXR1cm4gZS5yYWRpdXM9cyxlfTtEUD1uZXcgYSxGUD1uZXcgYSxCUD1uZXcgYTtuZS5mcm9tT3JpZW50ZWRCb3VuZGluZ0JveD1mdW5jdGlvbih0LGUpe3kuZGVmaW5lZCgib3JpZW50ZWRCb3VuZGluZ0JveCIsdCksaChlKXx8KGU9bmV3IG5lKTtsZXQgbj10LmhhbGZBeGVzLG89Si5nZXRDb2x1bW4obiwwLERQKSxyPUouZ2V0Q29sdW1uKG4sMSxGUCksaT1KLmdldENvbHVtbihuLDIsQlApO3JldHVybiBhLmFkZChvLHIsbyksYS5hZGQobyxpLG8pLGUuY2VudGVyPWEuY2xvbmUodC5jZW50ZXIsZS5jZW50ZXIpLGUucmFkaXVzPWEubWFnbml0dWRlKG8pLGV9O1VQPW5ldyBhLFZQPW5ldyBhO25lLmZyb21UcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgidHJhbnNmb3JtYXRpb24iLHQpLGgoZSl8fChlPW5ldyBuZSk7bGV0IG49c3QuZ2V0VHJhbnNsYXRpb24odCxVUCksbz1zdC5nZXRTY2FsZSh0LFZQKSxyPS41KmEubWFnbml0dWRlKG8pO3JldHVybiBlLmNlbnRlcj1hLmNsb25lKG4sZS5jZW50ZXIpLGUucmFkaXVzPXIsZX07bmUuY2xvbmU9ZnVuY3Rpb24odCxlKXtpZihoKHQpKXJldHVybiBoKGUpPyhlLmNlbnRlcj1hLmNsb25lKHQuY2VudGVyLGUuY2VudGVyKSxlLnJhZGl1cz10LnJhZGl1cyxlKTpuZXcgbmUodC5jZW50ZXIsdC5yYWRpdXMpfTtuZS5wYWNrZWRMZW5ndGg9NDtuZS5wYWNrPWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxuPXgobiwwKTtsZXQgbz10LmNlbnRlcjtyZXR1cm4gZVtuKytdPW8ueCxlW24rK109by55LGVbbisrXT1vLnosZVtuXT10LnJhZGl1cyxlfTtuZS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3kuZGVmaW5lZCgiYXJyYXkiLHQpLGU9eChlLDApLGgobil8fChuPW5ldyBuZSk7bGV0IG89bi5jZW50ZXI7cmV0dXJuIG8ueD10W2UrK10sby55PXRbZSsrXSxvLno9dFtlKytdLG4ucmFkaXVzPXRbZV0sbn07a1A9bmV3IGEsR1A9bmV3IGE7bmUudW5pb249ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksaChuKXx8KG49bmV3IG5lKTtsZXQgbz10LmNlbnRlcixyPXQucmFkaXVzLGk9ZS5jZW50ZXIscz1lLnJhZGl1cyxmPWEuc3VidHJhY3QoaSxvLGtQKSx1PWEubWFnbml0dWRlKGYpO2lmKHI+PXUrcylyZXR1cm4gdC5jbG9uZShuKSxuO2lmKHM+PXUrcilyZXR1cm4gZS5jbG9uZShuKSxuO2xldCBjPShyK3UrcykqLjUsbD1hLm11bHRpcGx5QnlTY2FsYXIoZiwoLXIrYykvdSxHUCk7cmV0dXJuIGEuYWRkKGwsbyxsKSxhLmNsb25lKGwsbi5jZW50ZXIpLG4ucmFkaXVzPWMsbn07elA9bmV3IGE7bmUuZXhwYW5kPWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoInNwaGVyZSIsdCkseS50eXBlT2Yub2JqZWN0KCJwb2ludCIsZSksbj1uZS5jbG9uZSh0LG4pO2xldCBvPWEubWFnbml0dWRlKGEuc3VidHJhY3QoZSxuLmNlbnRlcix6UCkpO3JldHVybiBvPm4ucmFkaXVzJiYobi5yYWRpdXM9byksbn07bmUuaW50ZXJzZWN0UGxhbmU9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoInNwaGVyZSIsdCkseS50eXBlT2Yub2JqZWN0KCJwbGFuZSIsZSk7bGV0IG49dC5jZW50ZXIsbz10LnJhZGl1cyxyPWUubm9ybWFsLGk9YS5kb3QocixuKStlLmRpc3RhbmNlO3JldHVybiBpPC1vP1JuLk9VVFNJREU6aTxvP1JuLklOVEVSU0VDVElORzpSbi5JTlNJREV9O25lLnRyYW5zZm9ybT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgic3BoZXJlIix0KSx5LnR5cGVPZi5vYmplY3QoInRyYW5zZm9ybSIsZSksaChuKXx8KG49bmV3IG5lKSxuLmNlbnRlcj1zdC5tdWx0aXBseUJ5UG9pbnQoZSx0LmNlbnRlcixuLmNlbnRlciksbi5yYWRpdXM9c3QuZ2V0TWF4aW11bVNjYWxlKGUpKnQucmFkaXVzLG59O2pQPW5ldyBhO25lLmRpc3RhbmNlU3F1YXJlZFRvPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJzcGhlcmUiLHQpLHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIixlKTtsZXQgbj1hLnN1YnRyYWN0KHQuY2VudGVyLGUsalApLG89YS5tYWduaXR1ZGUobiktdC5yYWRpdXM7cmV0dXJuIG88PTA/MDpvKm99O25lLnRyYW5zZm9ybVdpdGhvdXRTY2FsZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgic3BoZXJlIix0KSx5LnR5cGVPZi5vYmplY3QoInRyYW5zZm9ybSIsZSksaChuKXx8KG49bmV3IG5lKSxuLmNlbnRlcj1zdC5tdWx0aXBseUJ5UG9pbnQoZSx0LmNlbnRlcixuLmNlbnRlciksbi5yYWRpdXM9dC5yYWRpdXMsbn07SFA9bmV3IGE7bmUuY29tcHV0ZVBsYW5lRGlzdGFuY2VzPWZ1bmN0aW9uKHQsZSxuLG8pe3kudHlwZU9mLm9iamVjdCgic3BoZXJlIix0KSx5LnR5cGVPZi5vYmplY3QoInBvc2l0aW9uIixlKSx5LnR5cGVPZi5vYmplY3QoImRpcmVjdGlvbiIsbiksaChvKXx8KG89bmV3IFFyKTtsZXQgcj1hLnN1YnRyYWN0KHQuY2VudGVyLGUsSFApLGk9YS5kb3QobixyKTtyZXR1cm4gby5zdGFydD1pLXQucmFkaXVzLG8uc3RvcD1pK3QucmFkaXVzLG99O2FiPW5ldyBhLHFQPW5ldyBhLEtQPW5ldyBhLFdQPW5ldyBhLFhQPW5ldyBhLFlQPW5ldyBhdCxmYj1uZXcgQXJyYXkoOCk7Zm9yKGxldCB0PTA7dDw4OysrdClmYlt0XT1uZXcgYTskUD1uZXcgUW47bmUucHJvamVjdFRvMkQ9ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgic3BoZXJlIix0KSxlPXgoZSwkUCk7bGV0IG89ZS5lbGxpcHNvaWQscj10LmNlbnRlcixpPXQucmFkaXVzLHM7YS5lcXVhbHMocixhLlpFUk8pP3M9YS5jbG9uZShhLlVOSVRfWCxhYik6cz1vLmdlb2RldGljU3VyZmFjZU5vcm1hbChyLGFiKTtsZXQgZj1hLmNyb3NzKGEuVU5JVF9aLHMscVApO2Eubm9ybWFsaXplKGYsZik7bGV0IHU9YS5jcm9zcyhzLGYsS1ApO2Eubm9ybWFsaXplKHUsdSksYS5tdWx0aXBseUJ5U2NhbGFyKHMsaSxzKSxhLm11bHRpcGx5QnlTY2FsYXIodSxpLHUpLGEubXVsdGlwbHlCeVNjYWxhcihmLGksZik7bGV0IGM9YS5uZWdhdGUodSxYUCksbD1hLm5lZ2F0ZShmLFdQKSxwPWZiLGQ9cFswXTthLmFkZChzLHUsZCksYS5hZGQoZCxmLGQpLGQ9cFsxXSxhLmFkZChzLHUsZCksYS5hZGQoZCxsLGQpLGQ9cFsyXSxhLmFkZChzLGMsZCksYS5hZGQoZCxsLGQpLGQ9cFszXSxhLmFkZChzLGMsZCksYS5hZGQoZCxmLGQpLGEubmVnYXRlKHMscyksZD1wWzRdLGEuYWRkKHMsdSxkKSxhLmFkZChkLGYsZCksZD1wWzVdLGEuYWRkKHMsdSxkKSxhLmFkZChkLGwsZCksZD1wWzZdLGEuYWRkKHMsYyxkKSxhLmFkZChkLGwsZCksZD1wWzddLGEuYWRkKHMsYyxkKSxhLmFkZChkLGYsZCk7bGV0IG09cC5sZW5ndGg7Zm9yKGxldCB3PTA7dzxtOysrdyl7bGV0IE89cFt3XTthLmFkZChyLE8sTyk7bGV0IEU9by5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhPLFlQKTtlLnByb2plY3QoRSxPKX1uPW5lLmZyb21Qb2ludHMocCxuKSxyPW4uY2VudGVyO2xldCBfPXIueCxnPXIueSxiPXIuejtyZXR1cm4gci54PWIsci55PV8sci56PWcsbn07bmUuaXNPY2NsdWRlZD1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInNwaGVyZSIsdCkseS50eXBlT2Yub2JqZWN0KCJvY2NsdWRlciIsZSksIWUuaXNCb3VuZGluZ1NwaGVyZVZpc2libGUodCl9O25lLmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8aCh0KSYmaChlKSYmYS5lcXVhbHModC5jZW50ZXIsZS5jZW50ZXIpJiZ0LnJhZGl1cz09PWUucmFkaXVzfTtuZS5wcm90b3R5cGUuaW50ZXJzZWN0UGxhbmU9ZnVuY3Rpb24odCl7cmV0dXJuIG5lLmludGVyc2VjdFBsYW5lKHRoaXMsdCl9O25lLnByb3RvdHlwZS5kaXN0YW5jZVNxdWFyZWRUbz1mdW5jdGlvbih0KXtyZXR1cm4gbmUuZGlzdGFuY2VTcXVhcmVkVG8odGhpcyx0KX07bmUucHJvdG90eXBlLmNvbXB1dGVQbGFuZURpc3RhbmNlcz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG5lLmNvbXB1dGVQbGFuZURpc3RhbmNlcyh0aGlzLHQsZSxuKX07bmUucHJvdG90eXBlLmlzT2NjbHVkZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5lLmlzT2NjbHVkZWQodGhpcyx0KX07bmUucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtyZXR1cm4gbmUuZXF1YWxzKHRoaXMsdCl9O25lLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gbmUuY2xvbmUodGhpcyx0KX07bmUucHJvdG90eXBlLnZvbHVtZT1mdW5jdGlvbigpe2xldCB0PXRoaXMucmFkaXVzO3JldHVybiBQUCp0KnQqdH07QXQ9bmV9KTt2YXIgWlAscXQsJHM9WigoKT0+e1pQPXtERVBUSF9CVUZGRVJfQklUOjI1NixTVEVOQ0lMX0JVRkZFUl9CSVQ6MTAyNCxDT0xPUl9CVUZGRVJfQklUOjE2Mzg0LFBPSU5UUzowLExJTkVTOjEsTElORV9MT09QOjIsTElORV9TVFJJUDozLFRSSUFOR0xFUzo0LFRSSUFOR0xFX1NUUklQOjUsVFJJQU5HTEVfRkFOOjYsWkVSTzowLE9ORToxLFNSQ19DT0xPUjo3NjgsT05FX01JTlVTX1NSQ19DT0xPUjo3NjksU1JDX0FMUEhBOjc3MCxPTkVfTUlOVVNfU1JDX0FMUEhBOjc3MSxEU1RfQUxQSEE6NzcyLE9ORV9NSU5VU19EU1RfQUxQSEE6NzczLERTVF9DT0xPUjo3NzQsT05FX01JTlVTX0RTVF9DT0xPUjo3NzUsU1JDX0FMUEhBX1NBVFVSQVRFOjc3NixGVU5DX0FERDozMjc3NCxCTEVORF9FUVVBVElPTjozMjc3NyxCTEVORF9FUVVBVElPTl9SR0I6MzI3NzcsQkxFTkRfRVFVQVRJT05fQUxQSEE6MzQ4NzcsRlVOQ19TVUJUUkFDVDozMjc3OCxGVU5DX1JFVkVSU0VfU1VCVFJBQ1Q6MzI3NzksQkxFTkRfRFNUX1JHQjozMjk2OCxCTEVORF9TUkNfUkdCOjMyOTY5LEJMRU5EX0RTVF9BTFBIQTozMjk3MCxCTEVORF9TUkNfQUxQSEE6MzI5NzEsQ09OU1RBTlRfQ09MT1I6MzI3NjksT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SOjMyNzcwLENPTlNUQU5UX0FMUEhBOjMyNzcxLE9ORV9NSU5VU19DT05TVEFOVF9BTFBIQTozMjc3MixCTEVORF9DT0xPUjozMjc3MyxBUlJBWV9CVUZGRVI6MzQ5NjIsRUxFTUVOVF9BUlJBWV9CVUZGRVI6MzQ5NjMsQVJSQVlfQlVGRkVSX0JJTkRJTkc6MzQ5NjQsRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORzozNDk2NSxTVFJFQU1fRFJBVzozNTA0MCxTVEFUSUNfRFJBVzozNTA0NCxEWU5BTUlDX0RSQVc6MzUwNDgsQlVGRkVSX1NJWkU6MzQ2NjAsQlVGRkVSX1VTQUdFOjM0NjYxLENVUlJFTlRfVkVSVEVYX0FUVFJJQjozNDM0MixGUk9OVDoxMDI4LEJBQ0s6MTAyOSxGUk9OVF9BTkRfQkFDSzoxMDMyLENVTExfRkFDRToyODg0LEJMRU5EOjMwNDIsRElUSEVSOjMwMjQsU1RFTkNJTF9URVNUOjI5NjAsREVQVEhfVEVTVDoyOTI5LFNDSVNTT1JfVEVTVDozMDg5LFBPTFlHT05fT0ZGU0VUX0ZJTEw6MzI4MjMsU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFOjMyOTI2LFNBTVBMRV9DT1ZFUkFHRTozMjkyOCxOT19FUlJPUjowLElOVkFMSURfRU5VTToxMjgwLElOVkFMSURfVkFMVUU6MTI4MSxJTlZBTElEX09QRVJBVElPTjoxMjgyLE9VVF9PRl9NRU1PUlk6MTI4NSxDVzoyMzA0LENDVzoyMzA1LExJTkVfV0lEVEg6Mjg0OSxBTElBU0VEX1BPSU5UX1NJWkVfUkFOR0U6MzM5MDEsQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFOjMzOTAyLENVTExfRkFDRV9NT0RFOjI4ODUsRlJPTlRfRkFDRToyODg2LERFUFRIX1JBTkdFOjI5MjgsREVQVEhfV1JJVEVNQVNLOjI5MzAsREVQVEhfQ0xFQVJfVkFMVUU6MjkzMSxERVBUSF9GVU5DOjI5MzIsU1RFTkNJTF9DTEVBUl9WQUxVRToyOTYxLFNURU5DSUxfRlVOQzoyOTYyLFNURU5DSUxfRkFJTDoyOTY0LFNURU5DSUxfUEFTU19ERVBUSF9GQUlMOjI5NjUsU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1M6Mjk2NixTVEVOQ0lMX1JFRjoyOTY3LFNURU5DSUxfVkFMVUVfTUFTSzoyOTYzLFNURU5DSUxfV1JJVEVNQVNLOjI5NjgsU1RFTkNJTF9CQUNLX0ZVTkM6MzQ4MTYsU1RFTkNJTF9CQUNLX0ZBSUw6MzQ4MTcsU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfRkFJTDozNDgxOCxTVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9QQVNTOjM0ODE5LFNURU5DSUxfQkFDS19SRUY6MzYwMDMsU1RFTkNJTF9CQUNLX1ZBTFVFX01BU0s6MzYwMDQsU1RFTkNJTF9CQUNLX1dSSVRFTUFTSzozNjAwNSxWSUVXUE9SVDoyOTc4LFNDSVNTT1JfQk9YOjMwODgsQ09MT1JfQ0xFQVJfVkFMVUU6MzEwNixDT0xPUl9XUklURU1BU0s6MzEwNyxVTlBBQ0tfQUxJR05NRU5UOjMzMTcsUEFDS19BTElHTk1FTlQ6MzMzMyxNQVhfVEVYVFVSRV9TSVpFOjMzNzksTUFYX1ZJRVdQT1JUX0RJTVM6MzM4NixTVUJQSVhFTF9CSVRTOjM0MDgsUkVEX0JJVFM6MzQxMCxHUkVFTl9CSVRTOjM0MTEsQkxVRV9CSVRTOjM0MTIsQUxQSEFfQklUUzozNDEzLERFUFRIX0JJVFM6MzQxNCxTVEVOQ0lMX0JJVFM6MzQxNSxQT0xZR09OX09GRlNFVF9VTklUUzoxMDc1MixQT0xZR09OX09GRlNFVF9GQUNUT1I6MzI4MjQsVEVYVFVSRV9CSU5ESU5HXzJEOjMyODczLFNBTVBMRV9CVUZGRVJTOjMyOTM2LFNBTVBMRVM6MzI5MzcsU0FNUExFX0NPVkVSQUdFX1ZBTFVFOjMyOTM4LFNBTVBMRV9DT1ZFUkFHRV9JTlZFUlQ6MzI5MzksQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM6MzQ0NjcsRE9OVF9DQVJFOjQzNTIsRkFTVEVTVDo0MzUzLE5JQ0VTVDo0MzU0LEdFTkVSQVRFX01JUE1BUF9ISU5UOjMzMTcwLEJZVEU6NTEyMCxVTlNJR05FRF9CWVRFOjUxMjEsU0hPUlQ6NTEyMixVTlNJR05FRF9TSE9SVDo1MTIzLElOVDo1MTI0LFVOU0lHTkVEX0lOVDo1MTI1LEZMT0FUOjUxMjYsREVQVEhfQ09NUE9ORU5UOjY0MDIsQUxQSEE6NjQwNixSR0I6NjQwNyxSR0JBOjY0MDgsTFVNSU5BTkNFOjY0MDksTFVNSU5BTkNFX0FMUEhBOjY0MTAsVU5TSUdORURfU0hPUlRfNF80XzRfNDozMjgxOSxVTlNJR05FRF9TSE9SVF81XzVfNV8xOjMyODIwLFVOU0lHTkVEX1NIT1JUXzVfNl81OjMzNjM1LEZSQUdNRU5UX1NIQURFUjozNTYzMixWRVJURVhfU0hBREVSOjM1NjMzLE1BWF9WRVJURVhfQVRUUklCUzozNDkyMSxNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUzozNjM0NyxNQVhfVkFSWUlOR19WRUNUT1JTOjM2MzQ4LE1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTOjM1NjYxLE1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUzozNTY2MCxNQVhfVEVYVFVSRV9JTUFHRV9VTklUUzozNDkzMCxNQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTOjM2MzQ5LFNIQURFUl9UWVBFOjM1NjYzLERFTEVURV9TVEFUVVM6MzU3MTIsTElOS19TVEFUVVM6MzU3MTQsVkFMSURBVEVfU1RBVFVTOjM1NzE1LEFUVEFDSEVEX1NIQURFUlM6MzU3MTcsQUNUSVZFX1VOSUZPUk1TOjM1NzE4LEFDVElWRV9BVFRSSUJVVEVTOjM1NzIxLFNIQURJTkdfTEFOR1VBR0VfVkVSU0lPTjozNTcyNCxDVVJSRU5UX1BST0dSQU06MzU3MjUsTkVWRVI6NTEyLExFU1M6NTEzLEVRVUFMOjUxNCxMRVFVQUw6NTE1LEdSRUFURVI6NTE2LE5PVEVRVUFMOjUxNyxHRVFVQUw6NTE4LEFMV0FZUzo1MTksS0VFUDo3NjgwLFJFUExBQ0U6NzY4MSxJTkNSOjc2ODIsREVDUjo3NjgzLElOVkVSVDo1Mzg2LElOQ1JfV1JBUDozNDA1NSxERUNSX1dSQVA6MzQwNTYsVkVORE9SOjc5MzYsUkVOREVSRVI6NzkzNyxWRVJTSU9OOjc5MzgsTkVBUkVTVDo5NzI4LExJTkVBUjo5NzI5LE5FQVJFU1RfTUlQTUFQX05FQVJFU1Q6OTk4NCxMSU5FQVJfTUlQTUFQX05FQVJFU1Q6OTk4NSxORUFSRVNUX01JUE1BUF9MSU5FQVI6OTk4NixMSU5FQVJfTUlQTUFQX0xJTkVBUjo5OTg3LFRFWFRVUkVfTUFHX0ZJTFRFUjoxMDI0MCxURVhUVVJFX01JTl9GSUxURVI6MTAyNDEsVEVYVFVSRV9XUkFQX1M6MTAyNDIsVEVYVFVSRV9XUkFQX1Q6MTAyNDMsVEVYVFVSRV8yRDozNTUzLFRFWFRVUkU6NTg5MCxURVhUVVJFX0NVQkVfTUFQOjM0MDY3LFRFWFRVUkVfQklORElOR19DVUJFX01BUDozNDA2OCxURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1g6MzQwNjksVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YOjM0MDcwLFRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWTozNDA3MSxURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1k6MzQwNzIsVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aOjM0MDczLFRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWjozNDA3NCxNQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFOjM0MDc2LFRFWFRVUkUwOjMzOTg0LFRFWFRVUkUxOjMzOTg1LFRFWFRVUkUyOjMzOTg2LFRFWFRVUkUzOjMzOTg3LFRFWFRVUkU0OjMzOTg4LFRFWFRVUkU1OjMzOTg5LFRFWFRVUkU2OjMzOTkwLFRFWFRVUkU3OjMzOTkxLFRFWFRVUkU4OjMzOTkyLFRFWFRVUkU5OjMzOTkzLFRFWFRVUkUxMDozMzk5NCxURVhUVVJFMTE6MzM5OTUsVEVYVFVSRTEyOjMzOTk2LFRFWFRVUkUxMzozMzk5NyxURVhUVVJFMTQ6MzM5OTgsVEVYVFVSRTE1OjMzOTk5LFRFWFRVUkUxNjozNGUzLFRFWFRVUkUxNzozNDAwMSxURVhUVVJFMTg6MzQwMDIsVEVYVFVSRTE5OjM0MDAzLFRFWFRVUkUyMDozNDAwNCxURVhUVVJFMjE6MzQwMDUsVEVYVFVSRTIyOjM0MDA2LFRFWFRVUkUyMzozNDAwNyxURVhUVVJFMjQ6MzQwMDgsVEVYVFVSRTI1OjM0MDA5LFRFWFRVUkUyNjozNDAxMCxURVhUVVJFMjc6MzQwMTEsVEVYVFVSRTI4OjM0MDEyLFRFWFRVUkUyOTozNDAxMyxURVhUVVJFMzA6MzQwMTQsVEVYVFVSRTMxOjM0MDE1LEFDVElWRV9URVhUVVJFOjM0MDE2LFJFUEVBVDoxMDQ5NyxDTEFNUF9UT19FREdFOjMzMDcxLE1JUlJPUkVEX1JFUEVBVDozMzY0OCxGTE9BVF9WRUMyOjM1NjY0LEZMT0FUX1ZFQzM6MzU2NjUsRkxPQVRfVkVDNDozNTY2NixJTlRfVkVDMjozNTY2NyxJTlRfVkVDMzozNTY2OCxJTlRfVkVDNDozNTY2OSxCT09MOjM1NjcwLEJPT0xfVkVDMjozNTY3MSxCT09MX1ZFQzM6MzU2NzIsQk9PTF9WRUM0OjM1NjczLEZMT0FUX01BVDI6MzU2NzQsRkxPQVRfTUFUMzozNTY3NSxGTE9BVF9NQVQ0OjM1Njc2LFNBTVBMRVJfMkQ6MzU2NzgsU0FNUExFUl9DVUJFOjM1NjgwLFZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRDozNDMzOCxWRVJURVhfQVRUUklCX0FSUkFZX1NJWkU6MzQzMzksVkVSVEVYX0FUVFJJQl9BUlJBWV9TVFJJREU6MzQzNDAsVkVSVEVYX0FUVFJJQl9BUlJBWV9UWVBFOjM0MzQxLFZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRDozNDkyMixWRVJURVhfQVRUUklCX0FSUkFZX1BPSU5URVI6MzQzNzMsVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElORzozNDk3NSxJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEU6MzU3MzgsSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQ6MzU3MzksQ09NUElMRV9TVEFUVVM6MzU3MTMsTE9XX0ZMT0FUOjM2MzM2LE1FRElVTV9GTE9BVDozNjMzNyxISUdIX0ZMT0FUOjM2MzM4LExPV19JTlQ6MzYzMzksTUVESVVNX0lOVDozNjM0MCxISUdIX0lOVDozNjM0MSxGUkFNRUJVRkZFUjozNjE2MCxSRU5ERVJCVUZGRVI6MzYxNjEsUkdCQTQ6MzI4NTQsUkdCNV9BMTozMjg1NSxSR0I1NjU6MzYxOTQsREVQVEhfQ09NUE9ORU5UMTY6MzMxODksU1RFTkNJTF9JTkRFWDo2NDAxLFNURU5DSUxfSU5ERVg4OjM2MTY4LERFUFRIX1NURU5DSUw6MzQwNDEsUkVOREVSQlVGRkVSX1dJRFRIOjM2MTYyLFJFTkRFUkJVRkZFUl9IRUlHSFQ6MzYxNjMsUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVDozNjE2NCxSRU5ERVJCVUZGRVJfUkVEX1NJWkU6MzYxNzYsUkVOREVSQlVGRkVSX0dSRUVOX1NJWkU6MzYxNzcsUkVOREVSQlVGRkVSX0JMVUVfU0laRTozNjE3OCxSRU5ERVJCVUZGRVJfQUxQSEFfU0laRTozNjE3OSxSRU5ERVJCVUZGRVJfREVQVEhfU0laRTozNjE4MCxSRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFOjM2MTgxLEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEU6MzYwNDgsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRTozNjA0OSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUw6MzYwNTAsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0U6MzYwNTEsQ09MT1JfQVRUQUNITUVOVDA6MzYwNjQsREVQVEhfQVRUQUNITUVOVDozNjA5NixTVEVOQ0lMX0FUVEFDSE1FTlQ6MzYxMjgsREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UOjMzMzA2LE5PTkU6MCxGUkFNRUJVRkZFUl9DT01QTEVURTozNjA1MyxGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQ6MzYwNTQsRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQ6MzYwNTUsRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TOjM2MDU3LEZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEOjM2MDYxLEZSQU1FQlVGRkVSX0JJTkRJTkc6MzYwMDYsUkVOREVSQlVGRkVSX0JJTkRJTkc6MzYwMDcsTUFYX1JFTkRFUkJVRkZFUl9TSVpFOjM0MDI0LElOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OOjEyODYsVU5QQUNLX0ZMSVBfWV9XRUJHTDozNzQ0MCxVTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0w6Mzc0NDEsQ09OVEVYVF9MT1NUX1dFQkdMOjM3NDQyLFVOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0w6Mzc0NDMsQlJPV1NFUl9ERUZBVUxUX1dFQkdMOjM3NDQ0LENPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ6MzM3NzYsQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ6MzM3NzcsQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ6MzM3NzgsQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQ6MzM3NzksQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRzozNTg0MCxDT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HOjM1ODQxLENPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HOjM1ODQyLENPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HOjM1ODQzLENPTVBSRVNTRURfUkdCQV9BU1RDXzR4NF9XRUJHTDozNzgwOCxDT01QUkVTU0VEX1JHQl9FVEMxX1dFQkdMOjM2MTk2LENPTVBSRVNTRURfUkdCQV9CUFRDX1VOT1JNOjM2NDkyLEhBTEZfRkxPQVRfT0VTOjM2MTkzLERPVUJMRTo1MTMwLFJFQURfQlVGRkVSOjMwNzQsVU5QQUNLX1JPV19MRU5HVEg6MzMxNCxVTlBBQ0tfU0tJUF9ST1dTOjMzMTUsVU5QQUNLX1NLSVBfUElYRUxTOjMzMTYsUEFDS19ST1dfTEVOR1RIOjMzMzAsUEFDS19TS0lQX1JPV1M6MzMzMSxQQUNLX1NLSVBfUElYRUxTOjMzMzIsQ09MT1I6NjE0NCxERVBUSDo2MTQ1LFNURU5DSUw6NjE0NixSRUQ6NjQwMyxSR0I4OjMyODQ5LFJHQkE4OjMyODU2LFJHQjEwX0EyOjMyODU3LFRFWFRVUkVfQklORElOR18zRDozMjg3NCxVTlBBQ0tfU0tJUF9JTUFHRVM6MzI4NzcsVU5QQUNLX0lNQUdFX0hFSUdIVDozMjg3OCxURVhUVVJFXzNEOjMyODc5LFRFWFRVUkVfV1JBUF9SOjMyODgyLE1BWF8zRF9URVhUVVJFX1NJWkU6MzI4ODMsVU5TSUdORURfSU5UXzJfMTBfMTBfMTBfUkVWOjMzNjQwLE1BWF9FTEVNRU5UU19WRVJUSUNFUzozM2UzLE1BWF9FTEVNRU5UU19JTkRJQ0VTOjMzMDAxLFRFWFRVUkVfTUlOX0xPRDozMzA4MixURVhUVVJFX01BWF9MT0Q6MzMwODMsVEVYVFVSRV9CQVNFX0xFVkVMOjMzMDg0LFRFWFRVUkVfTUFYX0xFVkVMOjMzMDg1LE1JTjozMjc3NSxNQVg6MzI3NzYsREVQVEhfQ09NUE9ORU5UMjQ6MzMxOTAsTUFYX1RFWFRVUkVfTE9EX0JJQVM6MzQwNDUsVEVYVFVSRV9DT01QQVJFX01PREU6MzQ4OTIsVEVYVFVSRV9DT01QQVJFX0ZVTkM6MzQ4OTMsQ1VSUkVOVF9RVUVSWTozNDkxNyxRVUVSWV9SRVNVTFQ6MzQ5MTgsUVVFUllfUkVTVUxUX0FWQUlMQUJMRTozNDkxOSxTVFJFQU1fUkVBRDozNTA0MSxTVFJFQU1fQ09QWTozNTA0MixTVEFUSUNfUkVBRDozNTA0NSxTVEFUSUNfQ09QWTozNTA0NixEWU5BTUlDX1JFQUQ6MzUwNDksRFlOQU1JQ19DT1BZOjM1MDUwLE1BWF9EUkFXX0JVRkZFUlM6MzQ4NTIsRFJBV19CVUZGRVIwOjM0ODUzLERSQVdfQlVGRkVSMTozNDg1NCxEUkFXX0JVRkZFUjI6MzQ4NTUsRFJBV19CVUZGRVIzOjM0ODU2LERSQVdfQlVGRkVSNDozNDg1NyxEUkFXX0JVRkZFUjU6MzQ4NTgsRFJBV19CVUZGRVI2OjM0ODU5LERSQVdfQlVGRkVSNzozNDg2MCxEUkFXX0JVRkZFUjg6MzQ4NjEsRFJBV19CVUZGRVI5OjM0ODYyLERSQVdfQlVGRkVSMTA6MzQ4NjMsRFJBV19CVUZGRVIxMTozNDg2NCxEUkFXX0JVRkZFUjEyOjM0ODY1LERSQVdfQlVGRkVSMTM6MzQ4NjYsRFJBV19CVUZGRVIxNDozNDg2NyxEUkFXX0JVRkZFUjE1OjM0ODY4LE1BWF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFM6MzU2NTcsTUFYX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFM6MzU2NTgsU0FNUExFUl8zRDozNTY3OSxTQU1QTEVSXzJEX1NIQURPVzozNTY4MixGUkFHTUVOVF9TSEFERVJfREVSSVZBVElWRV9ISU5UOjM1NzIzLFBJWEVMX1BBQ0tfQlVGRkVSOjM1MDUxLFBJWEVMX1VOUEFDS19CVUZGRVI6MzUwNTIsUElYRUxfUEFDS19CVUZGRVJfQklORElORzozNTA1MyxQSVhFTF9VTlBBQ0tfQlVGRkVSX0JJTkRJTkc6MzUwNTUsRkxPQVRfTUFUMngzOjM1Njg1LEZMT0FUX01BVDJ4NDozNTY4NixGTE9BVF9NQVQzeDI6MzU2ODcsRkxPQVRfTUFUM3g0OjM1Njg4LEZMT0FUX01BVDR4MjozNTY4OSxGTE9BVF9NQVQ0eDM6MzU2OTAsU1JHQjozNTkwNCxTUkdCODozNTkwNSxTUkdCOF9BTFBIQTg6MzU5MDcsQ09NUEFSRV9SRUZfVE9fVEVYVFVSRTozNDg5NCxSR0JBMzJGOjM0ODM2LFJHQjMyRjozNDgzNyxSR0JBMTZGOjM0ODQyLFJHQjE2RjozNDg0MyxWRVJURVhfQVRUUklCX0FSUkFZX0lOVEVHRVI6MzUwNjksTUFYX0FSUkFZX1RFWFRVUkVfTEFZRVJTOjM1MDcxLE1JTl9QUk9HUkFNX1RFWEVMX09GRlNFVDozNTA3NixNQVhfUFJPR1JBTV9URVhFTF9PRkZTRVQ6MzUwNzcsTUFYX1ZBUllJTkdfQ09NUE9ORU5UUzozNTY1OSxURVhUVVJFXzJEX0FSUkFZOjM1ODY2LFRFWFRVUkVfQklORElOR18yRF9BUlJBWTozNTg2OSxSMTFGX0cxMUZfQjEwRjozNTg5OCxVTlNJR05FRF9JTlRfMTBGXzExRl8xMUZfUkVWOjM1ODk5LFJHQjlfRTU6MzU5MDEsVU5TSUdORURfSU5UXzVfOV85XzlfUkVWOjM1OTAyLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfTU9ERTozNTk2NyxNQVhfVFJBTlNGT1JNX0ZFRURCQUNLX1NFUEFSQVRFX0NPTVBPTkVOVFM6MzU5NjgsVFJBTlNGT1JNX0ZFRURCQUNLX1ZBUllJTkdTOjM1OTcxLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfU1RBUlQ6MzU5NzIsVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9TSVpFOjM1OTczLFRSQU5TRk9STV9GRUVEQkFDS19QUklNSVRJVkVTX1dSSVRURU46MzU5NzYsUkFTVEVSSVpFUl9ESVNDQVJEOjM1OTc3LE1BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfSU5URVJMRUFWRURfQ09NUE9ORU5UUzozNTk3OCxNQVhfVFJBTlNGT1JNX0ZFRURCQUNLX1NFUEFSQVRFX0FUVFJJQlM6MzU5NzksSU5URVJMRUFWRURfQVRUUklCUzozNTk4MCxTRVBBUkFURV9BVFRSSUJTOjM1OTgxLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVI6MzU5ODIsVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9CSU5ESU5HOjM1OTgzLFJHQkEzMlVJOjM2MjA4LFJHQjMyVUk6MzYyMDksUkdCQTE2VUk6MzYyMTQsUkdCMTZVSTozNjIxNSxSR0JBOFVJOjM2MjIwLFJHQjhVSTozNjIyMSxSR0JBMzJJOjM2MjI2LFJHQjMySTozNjIyNyxSR0JBMTZJOjM2MjMyLFJHQjE2STozNjIzMyxSR0JBOEk6MzYyMzgsUkdCOEk6MzYyMzksUkVEX0lOVEVHRVI6MzYyNDQsUkdCX0lOVEVHRVI6MzYyNDgsUkdCQV9JTlRFR0VSOjM2MjQ5LFNBTVBMRVJfMkRfQVJSQVk6MzYyODksU0FNUExFUl8yRF9BUlJBWV9TSEFET1c6MzYyOTIsU0FNUExFUl9DVUJFX1NIQURPVzozNjI5MyxVTlNJR05FRF9JTlRfVkVDMjozNjI5NCxVTlNJR05FRF9JTlRfVkVDMzozNjI5NSxVTlNJR05FRF9JTlRfVkVDNDozNjI5NixJTlRfU0FNUExFUl8yRDozNjI5OCxJTlRfU0FNUExFUl8zRDozNjI5OSxJTlRfU0FNUExFUl9DVUJFOjM2MzAwLElOVF9TQU1QTEVSXzJEX0FSUkFZOjM2MzAzLFVOU0lHTkVEX0lOVF9TQU1QTEVSXzJEOjM2MzA2LFVOU0lHTkVEX0lOVF9TQU1QTEVSXzNEOjM2MzA3LFVOU0lHTkVEX0lOVF9TQU1QTEVSX0NVQkU6MzYzMDgsVU5TSUdORURfSU5UX1NBTVBMRVJfMkRfQVJSQVk6MzYzMTEsREVQVEhfQ09NUE9ORU5UMzJGOjM2MDEyLERFUFRIMzJGX1NURU5DSUw4OjM2MDEzLEZMT0FUXzMyX1VOU0lHTkVEX0lOVF8yNF84X1JFVjozNjI2OSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0NPTE9SX0VOQ09ESU5HOjMzMjk2LEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQ09NUE9ORU5UX1RZUEU6MzMyOTcsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9SRURfU0laRTozMzI5OCxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0dSRUVOX1NJWkU6MzMyOTksRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9CTFVFX1NJWkU6MzMzMDAsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9BTFBIQV9TSVpFOjMzMzAxLEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfREVQVEhfU0laRTozMzMwMixGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1NURU5DSUxfU0laRTozMzMwMyxGUkFNRUJVRkZFUl9ERUZBVUxUOjMzMzA0LFVOU0lHTkVEX0lOVF8yNF84OjM0MDQyLERFUFRIMjRfU1RFTkNJTDg6MzUwNTYsVU5TSUdORURfTk9STUFMSVpFRDozNTg2MyxEUkFXX0ZSQU1FQlVGRkVSX0JJTkRJTkc6MzYwMDYsUkVBRF9GUkFNRUJVRkZFUjozNjAwOCxEUkFXX0ZSQU1FQlVGRkVSOjM2MDA5LFJFQURfRlJBTUVCVUZGRVJfQklORElORzozNjAxMCxSRU5ERVJCVUZGRVJfU0FNUExFUzozNjAxMSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEFZRVI6MzYwNTIsTUFYX0NPTE9SX0FUVEFDSE1FTlRTOjM2MDYzLENPTE9SX0FUVEFDSE1FTlQxOjM2MDY1LENPTE9SX0FUVEFDSE1FTlQyOjM2MDY2LENPTE9SX0FUVEFDSE1FTlQzOjM2MDY3LENPTE9SX0FUVEFDSE1FTlQ0OjM2MDY4LENPTE9SX0FUVEFDSE1FTlQ1OjM2MDY5LENPTE9SX0FUVEFDSE1FTlQ2OjM2MDcwLENPTE9SX0FUVEFDSE1FTlQ3OjM2MDcxLENPTE9SX0FUVEFDSE1FTlQ4OjM2MDcyLENPTE9SX0FUVEFDSE1FTlQ5OjM2MDczLENPTE9SX0FUVEFDSE1FTlQxMDozNjA3NCxDT0xPUl9BVFRBQ0hNRU5UMTE6MzYwNzUsQ09MT1JfQVRUQUNITUVOVDEyOjM2MDc2LENPTE9SX0FUVEFDSE1FTlQxMzozNjA3NyxDT0xPUl9BVFRBQ0hNRU5UMTQ6MzYwNzgsQ09MT1JfQVRUQUNITUVOVDE1OjM2MDc5LEZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTVVMVElTQU1QTEU6MzYxODIsTUFYX1NBTVBMRVM6MzYxODMsSEFMRl9GTE9BVDo1MTMxLFJHOjMzMzE5LFJHX0lOVEVHRVI6MzMzMjAsUjg6MzMzMjEsUkc4OjMzMzIzLFIxNkY6MzMzMjUsUjMyRjozMzMyNixSRzE2RjozMzMyNyxSRzMyRjozMzMyOCxSOEk6MzMzMjksUjhVSTozMzMzMCxSMTZJOjMzMzMxLFIxNlVJOjMzMzMyLFIzMkk6MzMzMzMsUjMyVUk6MzMzMzQsUkc4STozMzMzNSxSRzhVSTozMzMzNixSRzE2STozMzMzNyxSRzE2VUk6MzMzMzgsUkczMkk6MzMzMzksUkczMlVJOjMzMzQwLFZFUlRFWF9BUlJBWV9CSU5ESU5HOjM0MjI5LFI4X1NOT1JNOjM2NzU2LFJHOF9TTk9STTozNjc1NyxSR0I4X1NOT1JNOjM2NzU4LFJHQkE4X1NOT1JNOjM2NzU5LFNJR05FRF9OT1JNQUxJWkVEOjM2NzY0LENPUFlfUkVBRF9CVUZGRVI6MzY2NjIsQ09QWV9XUklURV9CVUZGRVI6MzY2NjMsQ09QWV9SRUFEX0JVRkZFUl9CSU5ESU5HOjM2NjYyLENPUFlfV1JJVEVfQlVGRkVSX0JJTkRJTkc6MzY2NjMsVU5JRk9STV9CVUZGRVI6MzUzNDUsVU5JRk9STV9CVUZGRVJfQklORElORzozNTM2OCxVTklGT1JNX0JVRkZFUl9TVEFSVDozNTM2OSxVTklGT1JNX0JVRkZFUl9TSVpFOjM1MzcwLE1BWF9WRVJURVhfVU5JRk9STV9CTE9DS1M6MzUzNzEsTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQkxPQ0tTOjM1MzczLE1BWF9DT01CSU5FRF9VTklGT1JNX0JMT0NLUzozNTM3NCxNQVhfVU5JRk9STV9CVUZGRVJfQklORElOR1M6MzUzNzUsTUFYX1VOSUZPUk1fQkxPQ0tfU0laRTozNTM3NixNQVhfQ09NQklORURfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UUzozNTM3NyxNQVhfQ09NQklORURfRlJBR01FTlRfVU5JRk9STV9DT01QT05FTlRTOjM1Mzc5LFVOSUZPUk1fQlVGRkVSX09GRlNFVF9BTElHTk1FTlQ6MzUzODAsQUNUSVZFX1VOSUZPUk1fQkxPQ0tTOjM1MzgyLFVOSUZPUk1fVFlQRTozNTM4MyxVTklGT1JNX1NJWkU6MzUzODQsVU5JRk9STV9CTE9DS19JTkRFWDozNTM4NixVTklGT1JNX09GRlNFVDozNTM4NyxVTklGT1JNX0FSUkFZX1NUUklERTozNTM4OCxVTklGT1JNX01BVFJJWF9TVFJJREU6MzUzODksVU5JRk9STV9JU19ST1dfTUFKT1I6MzUzOTAsVU5JRk9STV9CTE9DS19CSU5ESU5HOjM1MzkxLFVOSUZPUk1fQkxPQ0tfREFUQV9TSVpFOjM1MzkyLFVOSUZPUk1fQkxPQ0tfQUNUSVZFX1VOSUZPUk1TOjM1Mzk0LFVOSUZPUk1fQkxPQ0tfQUNUSVZFX1VOSUZPUk1fSU5ESUNFUzozNTM5NSxVTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfVkVSVEVYX1NIQURFUjozNTM5NixVTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfRlJBR01FTlRfU0hBREVSOjM1Mzk4LElOVkFMSURfSU5ERVg6NDI5NDk2NzI5NSxNQVhfVkVSVEVYX09VVFBVVF9DT01QT05FTlRTOjM3MTU0LE1BWF9GUkFHTUVOVF9JTlBVVF9DT01QT05FTlRTOjM3MTU3LE1BWF9TRVJWRVJfV0FJVF9USU1FT1VUOjM3MTM3LE9CSkVDVF9UWVBFOjM3MTM4LFNZTkNfQ09ORElUSU9OOjM3MTM5LFNZTkNfU1RBVFVTOjM3MTQwLFNZTkNfRkxBR1M6MzcxNDEsU1lOQ19GRU5DRTozNzE0MixTWU5DX0dQVV9DT01NQU5EU19DT01QTEVURTozNzE0MyxVTlNJR05BTEVEOjM3MTQ0LFNJR05BTEVEOjM3MTQ1LEFMUkVBRFlfU0lHTkFMRUQ6MzcxNDYsVElNRU9VVF9FWFBJUkVEOjM3MTQ3LENPTkRJVElPTl9TQVRJU0ZJRUQ6MzcxNDgsV0FJVF9GQUlMRUQ6MzcxNDksU1lOQ19GTFVTSF9DT01NQU5EU19CSVQ6MSxWRVJURVhfQVRUUklCX0FSUkFZX0RJVklTT1I6MzUwNzAsQU5ZX1NBTVBMRVNfUEFTU0VEOjM1ODg3LEFOWV9TQU1QTEVTX1BBU1NFRF9DT05TRVJWQVRJVkU6MzYyMDIsU0FNUExFUl9CSU5ESU5HOjM1MDk3LFJHQjEwX0EyVUk6MzY5NzUsSU5UXzJfMTBfMTBfMTBfUkVWOjM2MjU1LFRSQU5TRk9STV9GRUVEQkFDSzozNjM4NixUUkFOU0ZPUk1fRkVFREJBQ0tfUEFVU0VEOjM2Mzg3LFRSQU5TRk9STV9GRUVEQkFDS19BQ1RJVkU6MzYzODgsVFJBTlNGT1JNX0ZFRURCQUNLX0JJTkRJTkc6MzYzODksQ09NUFJFU1NFRF9SMTFfRUFDOjM3NDg4LENPTVBSRVNTRURfU0lHTkVEX1IxMV9FQUM6Mzc0ODksQ09NUFJFU1NFRF9SRzExX0VBQzozNzQ5MCxDT01QUkVTU0VEX1NJR05FRF9SRzExX0VBQzozNzQ5MSxDT01QUkVTU0VEX1JHQjhfRVRDMjozNzQ5MixDT01QUkVTU0VEX1NSR0I4X0VUQzI6Mzc0OTMsQ09NUFJFU1NFRF9SR0I4X1BVTkNIVEhST1VHSF9BTFBIQTFfRVRDMjozNzQ5NCxDT01QUkVTU0VEX1NSR0I4X1BVTkNIVEhST1VHSF9BTFBIQTFfRVRDMjozNzQ5NSxDT01QUkVTU0VEX1JHQkE4X0VUQzJfRUFDOjM3NDk2LENPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0VUQzJfRUFDOjM3NDk3LFRFWFRVUkVfSU1NVVRBQkxFX0ZPUk1BVDozNzE2NyxNQVhfRUxFTUVOVF9JTkRFWDozNjIwMyxURVhUVVJFX0lNTVVUQUJMRV9MRVZFTFM6MzM1MDMsTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUOjM0MDQ3fSxxdD1PYmplY3QuZnJlZXplKFpQKX0pO3ZhciBzZSxudCxMZT1aKCgpPT57SXQoKTtmdCgpO0h0KCk7JHMoKTtzZT17QllURTpxdC5CWVRFLFVOU0lHTkVEX0JZVEU6cXQuVU5TSUdORURfQllURSxTSE9SVDpxdC5TSE9SVCxVTlNJR05FRF9TSE9SVDpxdC5VTlNJR05FRF9TSE9SVCxJTlQ6cXQuSU5ULFVOU0lHTkVEX0lOVDpxdC5VTlNJR05FRF9JTlQsRkxPQVQ6cXQuRkxPQVQsRE9VQkxFOnF0LkRPVUJMRX07c2UuZ2V0U2l6ZUluQnl0ZXM9ZnVuY3Rpb24odCl7aWYoIWgodCkpdGhyb3cgbmV3IEYoInZhbHVlIGlzIHJlcXVpcmVkLiIpO3N3aXRjaCh0KXtjYXNlIHNlLkJZVEU6cmV0dXJuIEludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtjYXNlIHNlLlVOU0lHTkVEX0JZVEU6cmV0dXJuIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7Y2FzZSBzZS5TSE9SVDpyZXR1cm4gSW50MTZBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtjYXNlIHNlLlVOU0lHTkVEX1NIT1JUOnJldHVybiBVaW50MTZBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtjYXNlIHNlLklOVDpyZXR1cm4gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtjYXNlIHNlLlVOU0lHTkVEX0lOVDpyZXR1cm4gVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7Y2FzZSBzZS5GTE9BVDpyZXR1cm4gRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO2Nhc2Ugc2UuRE9VQkxFOnJldHVybiBGbG9hdDY0QXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7ZGVmYXVsdDp0aHJvdyBuZXcgRigiY29tcG9uZW50RGF0YXR5cGUgaXMgbm90IGEgdmFsaWQgdmFsdWUuIil9fTtzZS5mcm9tVHlwZWRBcnJheT1mdW5jdGlvbih0KXtpZih0IGluc3RhbmNlb2YgSW50OEFycmF5KXJldHVybiBzZS5CWVRFO2lmKHQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBzZS5VTlNJR05FRF9CWVRFO2lmKHQgaW5zdGFuY2VvZiBJbnQxNkFycmF5KXJldHVybiBzZS5TSE9SVDtpZih0IGluc3RhbmNlb2YgVWludDE2QXJyYXkpcmV0dXJuIHNlLlVOU0lHTkVEX1NIT1JUO2lmKHQgaW5zdGFuY2VvZiBJbnQzMkFycmF5KXJldHVybiBzZS5JTlQ7aWYodCBpbnN0YW5jZW9mIFVpbnQzMkFycmF5KXJldHVybiBzZS5VTlNJR05FRF9JTlQ7aWYodCBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSlyZXR1cm4gc2UuRkxPQVQ7aWYodCBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSlyZXR1cm4gc2UuRE9VQkxFO3Rocm93IG5ldyBGKCJhcnJheSBtdXN0IGJlIGFuIEludDhBcnJheSwgVWludDhBcnJheSwgSW50MTZBcnJheSwgVWludDE2QXJyYXksIEludDMyQXJyYXksIFVpbnQzMkFycmF5LCBGbG9hdDMyQXJyYXksIG9yIEZsb2F0NjRBcnJheS4iKX07c2UudmFsaWRhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGgodCkmJih0PT09c2UuQllURXx8dD09PXNlLlVOU0lHTkVEX0JZVEV8fHQ9PT1zZS5TSE9SVHx8dD09PXNlLlVOU0lHTkVEX1NIT1JUfHx0PT09c2UuSU5UfHx0PT09c2UuVU5TSUdORURfSU5UfHx0PT09c2UuRkxPQVR8fHQ9PT1zZS5ET1VCTEUpfTtzZS5jcmVhdGVUeXBlZEFycmF5PWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEYoImNvbXBvbmVudERhdGF0eXBlIGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBGKCJ2YWx1ZXNPckxlbmd0aCBpcyByZXF1aXJlZC4iKTtzd2l0Y2godCl7Y2FzZSBzZS5CWVRFOnJldHVybiBuZXcgSW50OEFycmF5KGUpO2Nhc2Ugc2UuVU5TSUdORURfQllURTpyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSk7Y2FzZSBzZS5TSE9SVDpyZXR1cm4gbmV3IEludDE2QXJyYXkoZSk7Y2FzZSBzZS5VTlNJR05FRF9TSE9SVDpyZXR1cm4gbmV3IFVpbnQxNkFycmF5KGUpO2Nhc2Ugc2UuSU5UOnJldHVybiBuZXcgSW50MzJBcnJheShlKTtjYXNlIHNlLlVOU0lHTkVEX0lOVDpyZXR1cm4gbmV3IFVpbnQzMkFycmF5KGUpO2Nhc2Ugc2UuRkxPQVQ6cmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoZSk7Y2FzZSBzZS5ET1VCTEU6cmV0dXJuIG5ldyBGbG9hdDY0QXJyYXkoZSk7ZGVmYXVsdDp0aHJvdyBuZXcgRigiY29tcG9uZW50RGF0YXR5cGUgaXMgbm90IGEgdmFsaWQgdmFsdWUuIil9fTtzZS5jcmVhdGVBcnJheUJ1ZmZlclZpZXc9ZnVuY3Rpb24odCxlLG4sbyl7aWYoIWgodCkpdGhyb3cgbmV3IEYoImNvbXBvbmVudERhdGF0eXBlIGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBGKCJidWZmZXIgaXMgcmVxdWlyZWQuIik7c3dpdGNoKG49eChuLDApLG89eChvLChlLmJ5dGVMZW5ndGgtbikvc2UuZ2V0U2l6ZUluQnl0ZXModCkpLHQpe2Nhc2Ugc2UuQllURTpyZXR1cm4gbmV3IEludDhBcnJheShlLG4sbyk7Y2FzZSBzZS5VTlNJR05FRF9CWVRFOnJldHVybiBuZXcgVWludDhBcnJheShlLG4sbyk7Y2FzZSBzZS5TSE9SVDpyZXR1cm4gbmV3IEludDE2QXJyYXkoZSxuLG8pO2Nhc2Ugc2UuVU5TSUdORURfU0hPUlQ6cmV0dXJuIG5ldyBVaW50MTZBcnJheShlLG4sbyk7Y2FzZSBzZS5JTlQ6cmV0dXJuIG5ldyBJbnQzMkFycmF5KGUsbixvKTtjYXNlIHNlLlVOU0lHTkVEX0lOVDpyZXR1cm4gbmV3IFVpbnQzMkFycmF5KGUsbixvKTtjYXNlIHNlLkZMT0FUOnJldHVybiBuZXcgRmxvYXQzMkFycmF5KGUsbixvKTtjYXNlIHNlLkRPVUJMRTpyZXR1cm4gbmV3IEZsb2F0NjRBcnJheShlLG4sbyk7ZGVmYXVsdDp0aHJvdyBuZXcgRigiY29tcG9uZW50RGF0YXR5cGUgaXMgbm90IGEgdmFsaWQgdmFsdWUuIil9fTtzZS5mcm9tTmFtZT1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSJCWVRFIjpyZXR1cm4gc2UuQllURTtjYXNlIlVOU0lHTkVEX0JZVEUiOnJldHVybiBzZS5VTlNJR05FRF9CWVRFO2Nhc2UiU0hPUlQiOnJldHVybiBzZS5TSE9SVDtjYXNlIlVOU0lHTkVEX1NIT1JUIjpyZXR1cm4gc2UuVU5TSUdORURfU0hPUlQ7Y2FzZSJJTlQiOnJldHVybiBzZS5JTlQ7Y2FzZSJVTlNJR05FRF9JTlQiOnJldHVybiBzZS5VTlNJR05FRF9JTlQ7Y2FzZSJGTE9BVCI6cmV0dXJuIHNlLkZMT0FUO2Nhc2UiRE9VQkxFIjpyZXR1cm4gc2UuRE9VQkxFO2RlZmF1bHQ6dGhyb3cgbmV3IEYoIm5hbWUgaXMgbm90IGEgdmFsaWQgdmFsdWUuIil9fTtudD1PYmplY3QuZnJlZXplKHNlKX0pO3ZhciBRUCxNaSxQcD1aKCgpPT57UVA9e05PTkU6MCxUUklBTkdMRVM6MSxMSU5FUzoyLFBPTFlMSU5FUzozfSxNaT1PYmplY3QuZnJlZXplKFFQKX0pO2Z1bmN0aW9uIFl0KHQsZSxuLG8pe3RoaXNbMF09eCh0LDApLHRoaXNbMV09eChuLDApLHRoaXNbMl09eChlLDApLHRoaXNbM109eChvLDApfXZhciBKUCx0Myx1YixsYixlMyxuMywkbyxBZj1aKCgpPT57RmUoKTtYdCgpO0l0KCk7ZnQoKTtIdCgpO1l0LnBhY2tlZExlbmd0aD00O1l0LnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxuPXgobiwwKSxlW24rK109dFswXSxlW24rK109dFsxXSxlW24rK109dFsyXSxlW24rK109dFszXSxlfTtZdC51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LmRlZmluZWQoImFycmF5Iix0KSxlPXgoZSwwKSxoKG4pfHwobj1uZXcgWXQpLG5bMF09dFtlKytdLG5bMV09dFtlKytdLG5bMl09dFtlKytdLG5bM109dFtlKytdLG59O1l0LnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe3kuZGVmaW5lZCgiYXJyYXkiLHQpO2xldCBuPXQubGVuZ3RoLG89bio0O2lmKCFoKGUpKWU9bmV3IEFycmF5KG8pO2Vsc2V7aWYoIUFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoIT09byl0aHJvdyBuZXcgRigiSWYgcmVzdWx0IGlzIGEgdHlwZWQgYXJyYXksIGl0IG11c3QgaGF2ZSBleGFjdGx5IGFycmF5Lmxlbmd0aCAqIDQgZWxlbWVudHMiKTtlLmxlbmd0aCE9PW8mJihlLmxlbmd0aD1vKX1mb3IobGV0IHI9MDtyPG47KytyKVl0LnBhY2sodFtyXSxlLHIqNCk7cmV0dXJuIGV9O1l0LnVucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7aWYoeS5kZWZpbmVkKCJhcnJheSIsdCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImFycmF5Lmxlbmd0aCIsdC5sZW5ndGgsNCksdC5sZW5ndGglNCE9PTApdGhyb3cgbmV3IEYoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4iKTtsZXQgbj10Lmxlbmd0aDtoKGUpP2UubGVuZ3RoPW4vNDplPW5ldyBBcnJheShuLzQpO2ZvcihsZXQgbz0wO288bjtvKz00KXtsZXQgcj1vLzQ7ZVtyXT1ZdC51bnBhY2sodCxvLGVbcl0pfXJldHVybiBlfTtZdC5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKGgodCkpcmV0dXJuIGgoZSk/KGVbMF09dFswXSxlWzFdPXRbMV0sZVsyXT10WzJdLGVbM109dFszXSxlKTpuZXcgWXQodFswXSx0WzJdLHRbMV0sdFszXSl9O1l0LmZyb21BcnJheT1ZdC51bnBhY2s7WXQuZnJvbUNvbHVtbk1ham9yQXJyYXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS5kZWZpbmVkKCJ2YWx1ZXMiLHQpLFl0LmNsb25lKHQsZSl9O1l0LmZyb21Sb3dNYWpvckFycmF5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkuZGVmaW5lZCgidmFsdWVzIix0KSxoKGUpPyhlWzBdPXRbMF0sZVsxXT10WzJdLGVbMl09dFsxXSxlWzNdPXRbM10sZSk6bmV3IFl0KHRbMF0sdFsxXSx0WzJdLHRbM10pfTtZdC5mcm9tU2NhbGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJzY2FsZSIsdCksaChlKT8oZVswXT10LngsZVsxXT0wLGVbMl09MCxlWzNdPXQueSxlKTpuZXcgWXQodC54LDAsMCx0LnkpfTtZdC5mcm9tVW5pZm9ybVNjYWxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm51bWJlcigic2NhbGUiLHQpLGgoZSk/KGVbMF09dCxlWzFdPTAsZVsyXT0wLGVbM109dCxlKTpuZXcgWXQodCwwLDAsdCl9O1l0LmZyb21Sb3RhdGlvbj1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm51bWJlcigiYW5nbGUiLHQpO2xldCBuPU1hdGguY29zKHQpLG89TWF0aC5zaW4odCk7cmV0dXJuIGgoZSk/KGVbMF09bixlWzFdPW8sZVsyXT0tbyxlWzNdPW4sZSk6bmV3IFl0KG4sLW8sbyxuKX07WXQudG9BcnJheT1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCksaChlKT8oZVswXT10WzBdLGVbMV09dFsxXSxlWzJdPXRbMl0sZVszXT10WzNdLGUpOlt0WzBdLHRbMV0sdFsyXSx0WzNdXX07WXQuZ2V0RWxlbWVudEluZGV4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJyb3ciLGUsMCkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoInJvdyIsZSwxKSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiY29sdW1uIix0LDApLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJjb2x1bW4iLHQsMSksdCoyK2V9O1l0LmdldENvbHVtbj1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJpbmRleCIsZSwwKSx5LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygiaW5kZXgiLGUsMSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pO2xldCBvPWUqMixyPXRbb10saT10W28rMV07cmV0dXJuIG4ueD1yLG4ueT1pLG59O1l0LnNldENvbHVtbj1mdW5jdGlvbih0LGUsbixvKXt5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImluZGV4IixlLDApLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJpbmRleCIsZSwxKSx5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsbikseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG8pLG89WXQuY2xvbmUodCxvKTtsZXQgcj1lKjI7cmV0dXJuIG9bcl09bi54LG9bcisxXT1uLnksb307WXQuZ2V0Um93PWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImluZGV4IixlLDApLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJpbmRleCIsZSwxKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7bGV0IG89dFtlXSxyPXRbZSsyXTtyZXR1cm4gbi54PW8sbi55PXIsbn07WXQuc2V0Um93PWZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImluZGV4IixlLDApLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJpbmRleCIsZSwxKSx5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsbikseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG8pLG89WXQuY2xvbmUodCxvKSxvW2VdPW4ueCxvW2UrMl09bi55LG99O0pQPW5ldyB0dDtZdC5zZXRTY2FsZT1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgic2NhbGUiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz1ZdC5nZXRTY2FsZSh0LEpQKSxyPWUueC9vLngsaT1lLnkvby55O3JldHVybiBuWzBdPXRbMF0qcixuWzFdPXRbMV0qcixuWzJdPXRbMl0qaSxuWzNdPXRbM10qaSxufTt0Mz1uZXcgdHQ7WXQuc2V0VW5pZm9ybVNjYWxlPWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2YubnVtYmVyKCJzY2FsZSIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pO2xldCBvPVl0LmdldFNjYWxlKHQsdDMpLHI9ZS9vLngsaT1lL28ueTtyZXR1cm4gblswXT10WzBdKnIsblsxXT10WzFdKnIsblsyXT10WzJdKmksblszXT10WzNdKmksbn07dWI9bmV3IHR0O1l0LmdldFNjYWxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZS54PXR0Lm1hZ25pdHVkZSh0dC5mcm9tRWxlbWVudHModFswXSx0WzFdLHViKSksZS55PXR0Lm1hZ25pdHVkZSh0dC5mcm9tRWxlbWVudHModFsyXSx0WzNdLHViKSksZX07bGI9bmV3IHR0O1l0LmdldE1heGltdW1TY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gWXQuZ2V0U2NhbGUodCxsYiksdHQubWF4aW11bUNvbXBvbmVudChsYil9O2UzPW5ldyB0dDtZdC5zZXRSb3RhdGlvbj1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz1ZdC5nZXRTY2FsZSh0LGUzKTtyZXR1cm4gblswXT1lWzBdKm8ueCxuWzFdPWVbMV0qby54LG5bMl09ZVsyXSpvLnksblszXT1lWzNdKm8ueSxufTtuMz1uZXcgdHQ7WXQuZ2V0Um90YXRpb249ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2xldCBuPVl0LmdldFNjYWxlKHQsbjMpO3JldHVybiBlWzBdPXRbMF0vbi54LGVbMV09dFsxXS9uLngsZVsyXT10WzJdL24ueSxlWzNdPXRbM10vbi55LGV9O1l0Lm11bHRpcGx5PWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz10WzBdKmVbMF0rdFsyXSplWzFdLHI9dFswXSplWzJdK3RbMl0qZVszXSxpPXRbMV0qZVswXSt0WzNdKmVbMV0scz10WzFdKmVbMl0rdFszXSplWzNdO3JldHVybiBuWzBdPW8sblsxXT1pLG5bMl09cixuWzNdPXMsbn07WXQuYWRkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksblswXT10WzBdK2VbMF0sblsxXT10WzFdK2VbMV0sblsyXT10WzJdK2VbMl0sblszXT10WzNdK2VbM10sbn07WXQuc3VidHJhY3Q9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuWzBdPXRbMF0tZVswXSxuWzFdPXRbMV0tZVsxXSxuWzJdPXRbMl0tZVsyXSxuWzNdPXRbM10tZVszXSxufTtZdC5tdWx0aXBseUJ5VmVjdG9yPWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz10WzBdKmUueCt0WzJdKmUueSxyPXRbMV0qZS54K3RbM10qZS55O3JldHVybiBuLng9byxuLnk9cixufTtZdC5tdWx0aXBseUJ5U2NhbGFyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm51bWJlcigic2NhbGFyIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksblswXT10WzBdKmUsblsxXT10WzFdKmUsblsyXT10WzJdKmUsblszXT10WzNdKmUsbn07WXQubXVsdGlwbHlCeVNjYWxlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgic2NhbGUiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuWzBdPXRbMF0qZS54LG5bMV09dFsxXSplLngsblsyXT10WzJdKmUueSxuWzNdPXRbM10qZS55LG59O1l0Lm11bHRpcGx5QnlVbmlmb3JtU2NhbGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2YubnVtYmVyKCJzY2FsZSIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG5bMF09dFswXSplLG5bMV09dFsxXSplLG5bMl09dFsyXSplLG5bM109dFszXSplLG59O1l0Lm5lZ2F0ZT1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGVbMF09LXRbMF0sZVsxXT0tdFsxXSxlWzJdPS10WzJdLGVbM109LXRbM10sZX07WXQudHJhbnNwb3NlPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKTtsZXQgbj10WzBdLG89dFsyXSxyPXRbMV0saT10WzNdO3JldHVybiBlWzBdPW4sZVsxXT1vLGVbMl09cixlWzNdPWksZX07WXQuYWJzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZVswXT1NYXRoLmFicyh0WzBdKSxlWzFdPU1hdGguYWJzKHRbMV0pLGVbMl09TWF0aC5hYnModFsyXSksZVszXT1NYXRoLmFicyh0WzNdKSxlfTtZdC5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fGgodCkmJmgoZSkmJnRbMF09PT1lWzBdJiZ0WzFdPT09ZVsxXSYmdFsyXT09PWVbMl0mJnRbM109PT1lWzNdfTtZdC5lcXVhbHNBcnJheT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRbMF09PT1lW25dJiZ0WzFdPT09ZVtuKzFdJiZ0WzJdPT09ZVtuKzJdJiZ0WzNdPT09ZVtuKzNdfTtZdC5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbj14KG4sMCksdD09PWV8fGgodCkmJmgoZSkmJk1hdGguYWJzKHRbMF0tZVswXSk8PW4mJk1hdGguYWJzKHRbMV0tZVsxXSk8PW4mJk1hdGguYWJzKHRbMl0tZVsyXSk8PW4mJk1hdGguYWJzKHRbM10tZVszXSk8PW59O1l0LklERU5USVRZPU9iamVjdC5mcmVlemUobmV3IFl0KDEsMCwwLDEpKTtZdC5aRVJPPU9iamVjdC5mcmVlemUobmV3IFl0KDAsMCwwLDApKTtZdC5DT0xVTU4wUk9XMD0wO1l0LkNPTFVNTjBST1cxPTE7WXQuQ09MVU1OMVJPVzA9MjtZdC5DT0xVTU4xUk9XMT0zO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFl0LnByb3RvdHlwZSx7bGVuZ3RoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gWXQucGFja2VkTGVuZ3RofX19KTtZdC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIFl0LmNsb25lKHRoaXMsdCl9O1l0LnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIFl0LmVxdWFscyh0aGlzLHQpfTtZdC5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUpe3JldHVybiBZdC5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlKX07WXQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuYCgke3RoaXNbMF19LCAke3RoaXNbMl19KQooJHt0aGlzWzFdfSwgJHt0aGlzWzNdfSlgfTskbz1ZdH0pO3ZhciBtbyxCdCx0bj1aKCgpPT57JHMoKTttbz17UE9JTlRTOnF0LlBPSU5UUyxMSU5FUzpxdC5MSU5FUyxMSU5FX0xPT1A6cXQuTElORV9MT09QLExJTkVfU1RSSVA6cXQuTElORV9TVFJJUCxUUklBTkdMRVM6cXQuVFJJQU5HTEVTLFRSSUFOR0xFX1NUUklQOnF0LlRSSUFOR0xFX1NUUklQLFRSSUFOR0xFX0ZBTjpxdC5UUklBTkdMRV9GQU59O21vLmlzTGluZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1tby5MSU5FU3x8dD09PW1vLkxJTkVfTE9PUHx8dD09PW1vLkxJTkVfU1RSSVB9O21vLmlzVHJpYW5nbGVzPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09bW8uVFJJQU5HTEVTfHx0PT09bW8uVFJJQU5HTEVfU1RSSVB8fHQ9PT1tby5UUklBTkdMRV9GQU59O21vLnZhbGlkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09bW8uUE9JTlRTfHx0PT09bW8uTElORVN8fHQ9PT1tby5MSU5FX0xPT1B8fHQ9PT1tby5MSU5FX1NUUklQfHx0PT09bW8uVFJJQU5HTEVTfHx0PT09bW8uVFJJQU5HTEVfU1RSSVB8fHQ9PT1tby5UUklBTkdMRV9GQU59O0J0PU9iamVjdC5mcmVlemUobW8pfSk7ZnVuY3Rpb24gTmgodCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpLHkudHlwZU9mLm9iamVjdCgib3B0aW9ucy5hdHRyaWJ1dGVzIix0LmF0dHJpYnV0ZXMpLHRoaXMuYXR0cmlidXRlcz10LmF0dHJpYnV0ZXMsdGhpcy5pbmRpY2VzPXQuaW5kaWNlcyx0aGlzLnByaW1pdGl2ZVR5cGU9eCh0LnByaW1pdGl2ZVR5cGUsQnQuVFJJQU5HTEVTKSx0aGlzLmJvdW5kaW5nU3BoZXJlPXQuYm91bmRpbmdTcGhlcmUsdGhpcy5nZW9tZXRyeVR5cGU9eCh0Lmdlb21ldHJ5VHlwZSxNaS5OT05FKSx0aGlzLmJvdW5kaW5nU3BoZXJlQ1Y9dC5ib3VuZGluZ1NwaGVyZUNWLHRoaXMub2Zmc2V0QXR0cmlidXRlPXQub2Zmc2V0QXR0cmlidXRlfXZhciBvMyxyMyxwYixpMyxzMyxjMyxhMyxmMyx1MyxsMyxVdCxYZT1aKCgpPT57RmUoKTtGdCgpO1BlKCk7WHQoKTtJdCgpO2Z0KCk7SHQoKTtQcCgpO0FmKCk7Rm4oKTtCbigpO3RuKCk7V28oKTt3bigpO2NzKCk7TmguY29tcHV0ZU51bWJlck9mVmVydGljZXM9ZnVuY3Rpb24odCl7eS50eXBlT2Yub2JqZWN0KCJnZW9tZXRyeSIsdCk7bGV0IGU9LTE7Zm9yKGxldCBuIGluIHQuYXR0cmlidXRlcylpZih0LmF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkobikmJmgodC5hdHRyaWJ1dGVzW25dKSYmaCh0LmF0dHJpYnV0ZXNbbl0udmFsdWVzKSl7bGV0IG89dC5hdHRyaWJ1dGVzW25dLHI9by52YWx1ZXMubGVuZ3RoL28uY29tcG9uZW50c1BlckF0dHJpYnV0ZTtpZihlIT09ciYmZSE9PS0xKXRocm93IG5ldyBGKCJBbGwgYXR0cmlidXRlIGxpc3RzIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgYXR0cmlidXRlcy4iKTtlPXJ9cmV0dXJuIGV9O28zPW5ldyBhdCxyMz1uZXcgYSxwYj1uZXcgc3QsaTM9W25ldyBhdCxuZXcgYXQsbmV3IGF0XSxzMz1bbmV3IHR0LG5ldyB0dCxuZXcgdHRdLGMzPVtuZXcgdHQsbmV3IHR0LG5ldyB0dF0sYTM9bmV3IGEsZjM9bmV3IGVlLHUzPW5ldyBzdCxsMz1uZXcgJG87TmguX3RleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHM9ZnVuY3Rpb24odCxlLG4sbyl7bGV0IHIsaT1OdC5jZW50ZXIobyxvMykscz1hdC50b0NhcnRlc2lhbihpLG4scjMpLGY9WW8uZWFzdE5vcnRoVXBUb0ZpeGVkRnJhbWUocyxuLHBiKSx1PXN0LmludmVyc2UoZixwYiksYz1zMyxsPWkzO2xbMF0ubG9uZ2l0dWRlPW8ud2VzdCxsWzBdLmxhdGl0dWRlPW8uc291dGgsbFsxXS5sb25naXR1ZGU9by53ZXN0LGxbMV0ubGF0aXR1ZGU9by5ub3J0aCxsWzJdLmxvbmdpdHVkZT1vLmVhc3QsbFsyXS5sYXRpdHVkZT1vLnNvdXRoO2xldCBwPWEzO2ZvcihyPTA7cjwzO3IrKylhdC50b0NhcnRlc2lhbihsW3JdLG4scCkscD1zdC5tdWx0aXBseUJ5UG9pbnRBc1ZlY3Rvcih1LHAscCksY1tyXS54PXAueCxjW3JdLnk9cC55O2xldCBkPWVlLmZyb21BeGlzQW5nbGUoYS5VTklUX1osLWUsZjMpLG09Si5mcm9tUXVhdGVybmlvbihkLHUzKSxfPXQubGVuZ3RoLGc9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGI9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLHc9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLE89TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO2ZvcihyPTA7cjxfO3IrKylwPXN0Lm11bHRpcGx5QnlQb2ludEFzVmVjdG9yKHUsdFtyXSxwKSxwPUoubXVsdGlwbHlCeVZlY3RvcihtLHAscCksZz1NYXRoLm1pbihnLHAueCksYj1NYXRoLm1pbihiLHAueSksdz1NYXRoLm1heCh3LHAueCksTz1NYXRoLm1heChPLHAueSk7bGV0IEU9JG8uZnJvbVJvdGF0aW9uKGUsbDMpLFQ9YzM7VFswXS54PWcsVFswXS55PWIsVFsxXS54PWcsVFsxXS55PU8sVFsyXS54PXcsVFsyXS55PWI7bGV0IEM9Y1swXSxOPWNbMl0ueC1DLngsST1jWzFdLnktQy55O2ZvcihyPTA7cjwzO3IrKyl7bGV0IEE9VFtyXTskby5tdWx0aXBseUJ5VmVjdG9yKEUsQSxBKSxBLng9KEEueC1DLngpL04sQS55PShBLnktQy55KS9JfWxldCBEPVRbMF0sdj1UWzFdLEw9VFsyXSxVPW5ldyBBcnJheSg2KTtyZXR1cm4gdHQucGFjayhELFUpLHR0LnBhY2sodixVLDIpLHR0LnBhY2soTCxVLDQpLFV9O1V0PU5ofSk7ZnVuY3Rpb24gcDModCl7aWYodD14KHQseC5FTVBUWV9PQkpFQ1QpLCFoKHQuY29tcG9uZW50RGF0YXR5cGUpKXRocm93IG5ldyBGKCJvcHRpb25zLmNvbXBvbmVudERhdGF0eXBlIGlzIHJlcXVpcmVkLiIpO2lmKCFoKHQuY29tcG9uZW50c1BlckF0dHJpYnV0ZSkpdGhyb3cgbmV3IEYoIm9wdGlvbnMuY29tcG9uZW50c1BlckF0dHJpYnV0ZSBpcyByZXF1aXJlZC4iKTtpZih0LmNvbXBvbmVudHNQZXJBdHRyaWJ1dGU8MXx8dC5jb21wb25lbnRzUGVyQXR0cmlidXRlPjQpdGhyb3cgbmV3IEYoIm9wdGlvbnMuY29tcG9uZW50c1BlckF0dHJpYnV0ZSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNC4iKTtpZighaCh0LnZhbHVlcykpdGhyb3cgbmV3IEYoIm9wdGlvbnMudmFsdWVzIGlzIHJlcXVpcmVkLiIpO3RoaXMuY29tcG9uZW50RGF0YXR5cGU9dC5jb21wb25lbnREYXRhdHlwZSx0aGlzLmNvbXBvbmVudHNQZXJBdHRyaWJ1dGU9dC5jb21wb25lbnRzUGVyQXR0cmlidXRlLHRoaXMubm9ybWFsaXplPXgodC5ub3JtYWxpemUsITEpLHRoaXMudmFsdWVzPXQudmFsdWVzfXZhciBpdCxZZT1aKCgpPT57SXQoKTtmdCgpO0h0KCk7aXQ9cDN9KTtmdW5jdGlvbiBkMyh0KXt0PXgodCx4LkVNUFRZX09CSkVDVCksdGhpcy5wb3NpdGlvbj10LnBvc2l0aW9uLHRoaXMubm9ybWFsPXQubm9ybWFsLHRoaXMuc3Q9dC5zdCx0aGlzLmJpdGFuZ2VudD10LmJpdGFuZ2VudCx0aGlzLnRhbmdlbnQ9dC50YW5nZW50LHRoaXMuY29sb3I9dC5jb2xvcn12YXIgaWUsYW49WigoKT0+e0l0KCk7aWU9ZDN9KTt2YXIgSGUsZGIsbWI9WigoKT0+e0ZlKCk7RnQoKTtocigpO1h0KCk7SHQoKTtBZigpO0ZuKCk7Qm4oKTtIZT17U0NBTEFSOiJTQ0FMQVIiLFZFQzI6IlZFQzIiLFZFQzM6IlZFQzMiLFZFQzQ6IlZFQzQiLE1BVDI6Ik1BVDIiLE1BVDM6Ik1BVDMiLE1BVDQ6Ik1BVDQifTtIZS5nZXRNYXRoVHlwZT1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSBIZS5TQ0FMQVI6cmV0dXJuIE51bWJlcjtjYXNlIEhlLlZFQzI6cmV0dXJuIHR0O2Nhc2UgSGUuVkVDMzpyZXR1cm4gYTtjYXNlIEhlLlZFQzQ6cmV0dXJuIGhlO2Nhc2UgSGUuTUFUMjpyZXR1cm4gJG87Y2FzZSBIZS5NQVQzOnJldHVybiBKO2Nhc2UgSGUuTUFUNDpyZXR1cm4gc3Q7ZGVmYXVsdDp0aHJvdyBuZXcgRigiYXR0cmlidXRlVHlwZSBpcyBub3QgYSB2YWxpZCB2YWx1ZS4iKX19O0hlLmdldE51bWJlck9mQ29tcG9uZW50cz1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSBIZS5TQ0FMQVI6cmV0dXJuIDE7Y2FzZSBIZS5WRUMyOnJldHVybiAyO2Nhc2UgSGUuVkVDMzpyZXR1cm4gMztjYXNlIEhlLlZFQzQ6Y2FzZSBIZS5NQVQyOnJldHVybiA0O2Nhc2UgSGUuTUFUMzpyZXR1cm4gOTtjYXNlIEhlLk1BVDQ6cmV0dXJuIDE2O2RlZmF1bHQ6dGhyb3cgbmV3IEYoImF0dHJpYnV0ZVR5cGUgaXMgbm90IGEgdmFsaWQgdmFsdWUuIil9fTtIZS5nZXRBdHRyaWJ1dGVMb2NhdGlvbkNvdW50PWZ1bmN0aW9uKHQpe3N3aXRjaCh0KXtjYXNlIEhlLlNDQUxBUjpjYXNlIEhlLlZFQzI6Y2FzZSBIZS5WRUMzOmNhc2UgSGUuVkVDNDpyZXR1cm4gMTtjYXNlIEhlLk1BVDI6cmV0dXJuIDI7Y2FzZSBIZS5NQVQzOnJldHVybiAzO2Nhc2UgSGUuTUFUNDpyZXR1cm4gNDtkZWZhdWx0OnRocm93IG5ldyBGKCJhdHRyaWJ1dGVUeXBlIGlzIG5vdCBhIHZhbGlkIHZhbHVlLiIpfX07SGUuZ2V0R2xzbFR5cGU9ZnVuY3Rpb24odCl7c3dpdGNoKHkudHlwZU9mLnN0cmluZygiYXR0cmlidXRlVHlwZSIsdCksdCl7Y2FzZSBIZS5TQ0FMQVI6cmV0dXJuImZsb2F0IjtjYXNlIEhlLlZFQzI6cmV0dXJuInZlYzIiO2Nhc2UgSGUuVkVDMzpyZXR1cm4idmVjMyI7Y2FzZSBIZS5WRUM0OnJldHVybiJ2ZWM0IjtjYXNlIEhlLk1BVDI6cmV0dXJuIm1hdDIiO2Nhc2UgSGUuTUFUMzpyZXR1cm4ibWF0MyI7Y2FzZSBIZS5NQVQ0OnJldHVybiJtYXQ0IjtkZWZhdWx0OnRocm93IG5ldyBGKCJhdHRyaWJ1dGVUeXBlIGlzIG5vdCBhIHZhbGlkIHZhbHVlLiIpfX07ZGI9T2JqZWN0LmZyZWV6ZShIZSl9KTtmdW5jdGlvbiBNcCh0KXtyZXR1cm4geWJbMF09dCx5YlswXX1mdW5jdGlvbiBJaCh0KXtyZXR1cm4gdD4+MV4tKHQmMSl9dmFyIGhiLF9iLGVuLGJmLHliLHZoLG5uLGFzPVooKCk9PntGZSgpO0Z0KCk7TGUoKTtYdCgpO2Z0KCk7SHQoKTtXdCgpO21iKCk7aGI9MS8yNTYsX2I9MjU2LGVuPXt9O2VuLm9jdEVuY29kZUluUmFuZ2U9ZnVuY3Rpb24odCxlLG4pe3kuZGVmaW5lZCgidmVjdG9yIix0KSx5LmRlZmluZWQoInJlc3VsdCIsbik7bGV0IG89YS5tYWduaXR1ZGVTcXVhcmVkKHQpO2lmKE1hdGguYWJzKG8tMSk+TS5FUFNJTE9ONil0aHJvdyBuZXcgRigidmVjdG9yIG11c3QgYmUgbm9ybWFsaXplZC4iKTtpZihuLng9dC54LyhNYXRoLmFicyh0LngpK01hdGguYWJzKHQueSkrTWF0aC5hYnModC56KSksbi55PXQueS8oTWF0aC5hYnModC54KStNYXRoLmFicyh0LnkpK01hdGguYWJzKHQueikpLHQuejwwKXtsZXQgcj1uLngsaT1uLnk7bi54PSgxLU1hdGguYWJzKGkpKSpNLnNpZ25Ob3RaZXJvKHIpLG4ueT0oMS1NYXRoLmFicyhyKSkqTS5zaWduTm90WmVybyhpKX1yZXR1cm4gbi54PU0udG9TTm9ybShuLngsZSksbi55PU0udG9TTm9ybShuLnksZSksbn07ZW4ub2N0RW5jb2RlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGVuLm9jdEVuY29kZUluUmFuZ2UodCwyNTUsZSl9O2JmPW5ldyB0dCx5Yj1uZXcgVWludDhBcnJheSgxKTtlbi5vY3RFbmNvZGVUb0NhcnRlc2lhbjQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZW4ub2N0RW5jb2RlSW5SYW5nZSh0LDY1NTM1LGJmKSxlLng9TXAoYmYueCpoYiksZS55PU1wKGJmLngpLGUuej1NcChiZi55KmhiKSxlLnc9TXAoYmYueSksZX07ZW4ub2N0RGVjb2RlSW5SYW5nZT1mdW5jdGlvbih0LGUsbixvKXtpZih5LmRlZmluZWQoInJlc3VsdCIsbyksdDwwfHx0Pm58fGU8MHx8ZT5uKXRocm93IG5ldyBGKGB4IGFuZCB5IG11c3QgYmUgdW5zaWduZWQgbm9ybWFsaXplZCBpbnRlZ2VycyBiZXR3ZWVuIDAgYW5kICR7bn1gKTtpZihvLng9TS5mcm9tU05vcm0odCxuKSxvLnk9TS5mcm9tU05vcm0oZSxuKSxvLno9MS0oTWF0aC5hYnMoby54KStNYXRoLmFicyhvLnkpKSxvLno8MCl7bGV0IHI9by54O28ueD0oMS1NYXRoLmFicyhvLnkpKSpNLnNpZ25Ob3RaZXJvKHIpLG8ueT0oMS1NYXRoLmFicyhyKSkqTS5zaWduTm90WmVybyhvLnkpfXJldHVybiBhLm5vcm1hbGl6ZShvLG8pfTtlbi5vY3REZWNvZGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBlbi5vY3REZWNvZGVJblJhbmdlKHQsZSwyNTUsbil9O2VuLm9jdERlY29kZUZyb21DYXJ0ZXNpYW40PWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJlbmNvZGVkIix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7bGV0IG49dC54LG89dC55LHI9dC56LGk9dC53O2lmKG48MHx8bj4yNTV8fG88MHx8bz4yNTV8fHI8MHx8cj4yNTV8fGk8MHx8aT4yNTUpdGhyb3cgbmV3IEYoIngsIHksIHosIGFuZCB3IG11c3QgYmUgdW5zaWduZWQgbm9ybWFsaXplZCBpbnRlZ2VycyBiZXR3ZWVuIDAgYW5kIDI1NSIpO2xldCBzPW4qX2IrbyxmPXIqX2IraTtyZXR1cm4gZW4ub2N0RGVjb2RlSW5SYW5nZShzLGYsNjU1MzUsZSl9O2VuLm9jdFBhY2tGbG9hdD1mdW5jdGlvbih0KXtyZXR1cm4geS5kZWZpbmVkKCJlbmNvZGVkIix0KSwyNTYqdC54K3QueX07dmg9bmV3IHR0O2VuLm9jdEVuY29kZUZsb2F0PWZ1bmN0aW9uKHQpe3JldHVybiBlbi5vY3RFbmNvZGUodCx2aCksZW4ub2N0UGFja0Zsb2F0KHZoKX07ZW4ub2N0RGVjb2RlRmxvYXQ9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoInZhbHVlIix0KTtsZXQgbj10LzI1NixvPU1hdGguZmxvb3Iobikscj0obi1vKSoyNTY7cmV0dXJuIGVuLm9jdERlY29kZShvLHIsZSl9O2VuLm9jdFBhY2s9ZnVuY3Rpb24odCxlLG4sbyl7eS5kZWZpbmVkKCJ2MSIsdCkseS5kZWZpbmVkKCJ2MiIsZSkseS5kZWZpbmVkKCJ2MyIsbikseS5kZWZpbmVkKCJyZXN1bHQiLG8pO2xldCByPWVuLm9jdEVuY29kZUZsb2F0KHQpLGk9ZW4ub2N0RW5jb2RlRmxvYXQoZSkscz1lbi5vY3RFbmNvZGUobix2aCk7cmV0dXJuIG8ueD02NTUzNipzLngrcixvLnk9NjU1MzYqcy55K2ksb307ZW4ub2N0VW5wYWNrPWZ1bmN0aW9uKHQsZSxuLG8pe3kuZGVmaW5lZCgicGFja2VkIix0KSx5LmRlZmluZWQoInYxIixlKSx5LmRlZmluZWQoInYyIixuKSx5LmRlZmluZWQoInYzIixvKTtsZXQgcj10LngvNjU1MzYsaT1NYXRoLmZsb29yKHIpLHM9KHItaSkqNjU1MzY7cj10LnkvNjU1MzY7bGV0IGY9TWF0aC5mbG9vcihyKSx1PShyLWYpKjY1NTM2O2VuLm9jdERlY29kZUZsb2F0KHMsZSksZW4ub2N0RGVjb2RlRmxvYXQodSxuKSxlbi5vY3REZWNvZGUoaSxmLG8pfTtlbi5jb21wcmVzc1RleHR1cmVDb29yZGluYXRlcz1mdW5jdGlvbih0KXt5LmRlZmluZWQoInRleHR1cmVDb29yZGluYXRlcyIsdCk7bGV0IGU9dC54KjQwOTV8MCxuPXQueSo0MDk1fDA7cmV0dXJuIDQwOTYqZStufTtlbi5kZWNvbXByZXNzVGV4dHVyZUNvb3JkaW5hdGVzPWZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJjb21wcmVzc2VkIix0KSx5LmRlZmluZWQoInJlc3VsdCIsZSk7bGV0IG49dC80MDk2LG89TWF0aC5mbG9vcihuKTtyZXR1cm4gZS54PW8vNDA5NSxlLnk9KHQtbyo0MDk2KS80MDk1LGV9O2VuLnppZ1phZ0RlbHRhRGVjb2RlPWZ1bmN0aW9uKHQsZSxuKXt5LmRlZmluZWQoInVCdWZmZXIiLHQpLHkuZGVmaW5lZCgidkJ1ZmZlciIsZSkseS50eXBlT2YubnVtYmVyLmVxdWFscygidUJ1ZmZlci5sZW5ndGgiLCJ2QnVmZmVyLmxlbmd0aCIsdC5sZW5ndGgsZS5sZW5ndGgpLGgobikmJnkudHlwZU9mLm51bWJlci5lcXVhbHMoInVCdWZmZXIubGVuZ3RoIiwiaGVpZ2h0QnVmZmVyLmxlbmd0aCIsdC5sZW5ndGgsbi5sZW5ndGgpO2xldCBvPXQubGVuZ3RoLHI9MCxpPTAscz0wO2ZvcihsZXQgZj0wO2Y8bzsrK2Ypcis9SWgodFtmXSksaSs9SWgoZVtmXSksdFtmXT1yLGVbZl09aSxoKG4pJiYocys9SWgobltmXSksbltmXT1zKX07ZW4uZGVxdWFudGl6ZT1mdW5jdGlvbih0LGUsbixvKXt5LmRlZmluZWQoInR5cGVkQXJyYXkiLHQpLHkuZGVmaW5lZCgiY29tcG9uZW50RGF0YXR5cGUiLGUpLHkuZGVmaW5lZCgidHlwZSIsbikseS5kZWZpbmVkKCJjb3VudCIsbyk7bGV0IHI9ZGIuZ2V0TnVtYmVyT2ZDb21wb25lbnRzKG4pLGk7c3dpdGNoKGUpe2Nhc2UgbnQuQllURTppPTEyNzticmVhaztjYXNlIG50LlVOU0lHTkVEX0JZVEU6aT0yNTU7YnJlYWs7Y2FzZSBudC5TSE9SVDppPTMyNzY3O2JyZWFrO2Nhc2UgbnQuVU5TSUdORURfU0hPUlQ6aT02NTUzNTticmVhaztjYXNlIG50LklOVDppPTIxNDc0ODM2NDc7YnJlYWs7Y2FzZSBudC5VTlNJR05FRF9JTlQ6aT00Mjk0OTY3Mjk1O2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEYoYENhbm5vdCBkZXF1YW50aXplIGNvbXBvbmVudCBkYXRhdHlwZTogJHtlfWApfWxldCBzPW5ldyBGbG9hdDMyQXJyYXkobypyKTtmb3IobGV0IGY9MDtmPG87ZisrKWZvcihsZXQgdT0wO3U8cjt1Kyspe2xldCBjPWYqcit1O3NbY109TWF0aC5tYXgodFtjXS9pLC0xKX1yZXR1cm4gc307ZW4uZGVjb2RlUkdCNTY1PWZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJ0eXBlZEFycmF5Iix0KTtsZXQgbj10Lmxlbmd0aCozO2goZSkmJnkudHlwZU9mLm51bWJlci5lcXVhbHMoInJlc3VsdC5sZW5ndGgiLCJ0eXBlZEFycmF5Lmxlbmd0aCAqIDMiLGUubGVuZ3RoLG4pO2xldCBvPXQubGVuZ3RoO2goZSl8fChlPW5ldyBGbG9hdDMyQXJyYXkobyozKSk7bGV0IHI9MzEsaT02MyxzPTEvMzEsZj0xLzYzO2ZvcihsZXQgdT0wO3U8bzt1Kyspe2xldCBjPXRbdV0sbD1jPj4xMSxwPWM+PjUmaSxkPWMmcixtPTMqdTtlW21dPWwqcyxlW20rMV09cCpmLGVbbSsyXT1kKnN9cmV0dXJuIGV9O25uPWVufSk7ZnVuY3Rpb24gbTModCxlLG4sbyxyKXt5LmRlZmluZWQoInBvaW50Iix0KSx5LmRlZmluZWQoInAwIixlKSx5LmRlZmluZWQoInAxIixuKSx5LmRlZmluZWQoInAyIixvKSxoKHIpfHwocj1uZXcgYSk7bGV0IGkscyxmLHUsYyxsLHAsZDtpZihoKGUueikpe2lmKGEuZXF1YWxzRXBzaWxvbih0LGUsTS5FUFNJTE9OMTQpKXJldHVybiBhLmNsb25lKGEuVU5JVF9YLHIpO2lmKGEuZXF1YWxzRXBzaWxvbih0LG4sTS5FUFNJTE9OMTQpKXJldHVybiBhLmNsb25lKGEuVU5JVF9ZLHIpO2lmKGEuZXF1YWxzRXBzaWxvbih0LG8sTS5FUFNJTE9OMTQpKXJldHVybiBhLmNsb25lKGEuVU5JVF9aLHIpO2k9YS5zdWJ0cmFjdChuLGUsZ2IpLHM9YS5zdWJ0cmFjdChvLGUsQWIpLGY9YS5zdWJ0cmFjdCh0LGUsYmIpLHU9YS5kb3QoaSxpKSxjPWEuZG90KGkscyksbD1hLmRvdChpLGYpLHA9YS5kb3QocyxzKSxkPWEuZG90KHMsZil9ZWxzZXtpZih0dC5lcXVhbHNFcHNpbG9uKHQsZSxNLkVQU0lMT04xNCkpcmV0dXJuIGEuY2xvbmUoYS5VTklUX1gscik7aWYodHQuZXF1YWxzRXBzaWxvbih0LG4sTS5FUFNJTE9OMTQpKXJldHVybiBhLmNsb25lKGEuVU5JVF9ZLHIpO2lmKHR0LmVxdWFsc0Vwc2lsb24odCxvLE0uRVBTSUxPTjE0KSlyZXR1cm4gYS5jbG9uZShhLlVOSVRfWixyKTtpPXR0LnN1YnRyYWN0KG4sZSxnYikscz10dC5zdWJ0cmFjdChvLGUsQWIpLGY9dHQuc3VidHJhY3QodCxlLGJiKSx1PXR0LmRvdChpLGkpLGM9dHQuZG90KGkscyksbD10dC5kb3QoaSxmKSxwPXR0LmRvdChzLHMpLGQ9dHQuZG90KHMsZil9ci55PXAqbC1jKmQsci56PXUqZC1jKmw7bGV0IG09dSpwLWMqYztpZihtIT09MClyZXR1cm4gci55Lz1tLHIuei89bSxyLng9MS1yLnktci56LHJ9dmFyIGdiLEFiLGJiLHdiLFRiPVooKCk9PntGZSgpO0Z0KCk7WHQoKTtmdCgpO1d0KCk7Z2I9bmV3IGEsQWI9bmV3IGEsYmI9bmV3IGE7d2I9bTN9KTtmdW5jdGlvbiByaSgpe3RoaXMuaGlnaD1hLmNsb25lKGEuWkVSTyksdGhpcy5sb3c9YS5jbG9uZShhLlpFUk8pfXZhciBOaSxMaCxacyxEaD1aKCgpPT57RnQoKTtYdCgpO2Z0KCk7cmkuZW5jb2RlPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2YubnVtYmVyKCJ2YWx1ZSIsdCksaChlKXx8KGU9e2hpZ2g6MCxsb3c6MH0pO2xldCBuO3JldHVybiB0Pj0wPyhuPU1hdGguZmxvb3IodC82NTUzNikqNjU1MzYsZS5oaWdoPW4sZS5sb3c9dC1uKToobj1NYXRoLmZsb29yKC10LzY1NTM2KSo2NTUzNixlLmhpZ2g9LW4sZS5sb3c9dCtuKSxlfTtOaT17aGlnaDowLGxvdzowfTtyaS5mcm9tQ2FydGVzaWFuPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgoZSl8fChlPW5ldyByaSk7bGV0IG49ZS5oaWdoLG89ZS5sb3c7cmV0dXJuIHJpLmVuY29kZSh0LngsTmkpLG4ueD1OaS5oaWdoLG8ueD1OaS5sb3cscmkuZW5jb2RlKHQueSxOaSksbi55PU5pLmhpZ2gsby55PU5pLmxvdyxyaS5lbmNvZGUodC56LE5pKSxuLno9TmkuaGlnaCxvLno9TmkubG93LGV9O0xoPW5ldyByaTtyaS53cml0ZUVsZW1lbnRzPWZ1bmN0aW9uKHQsZSxuKXt5LmRlZmluZWQoImNhcnRlc2lhbkFycmF5IixlKSx5LnR5cGVPZi5udW1iZXIoImluZGV4IixuKSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiaW5kZXgiLG4sMCkscmkuZnJvbUNhcnRlc2lhbih0LExoKTtsZXQgbz1MaC5oaWdoLHI9TGgubG93O2Vbbl09by54LGVbbisxXT1vLnksZVtuKzJdPW8ueixlW24rM109ci54LGVbbis0XT1yLnksZVtuKzVdPXIuen07WnM9cml9KTt2YXIgSm4sRHQsJGU9WigoKT0+e2Z0KCk7SHQoKTtXdCgpOyRzKCk7Sm49e1VOU0lHTkVEX0JZVEU6cXQuVU5TSUdORURfQllURSxVTlNJR05FRF9TSE9SVDpxdC5VTlNJR05FRF9TSE9SVCxVTlNJR05FRF9JTlQ6cXQuVU5TSUdORURfSU5UfTtKbi5nZXRTaXplSW5CeXRlcz1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSBKbi5VTlNJR05FRF9CWVRFOnJldHVybiBVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO2Nhc2UgSm4uVU5TSUdORURfU0hPUlQ6cmV0dXJuIFVpbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO2Nhc2UgSm4uVU5TSUdORURfSU5UOnJldHVybiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVH10aHJvdyBuZXcgRigiaW5kZXhEYXRhdHlwZSBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhIHZhbGlkIEluZGV4RGF0YXR5cGUgY29uc3RhbnQuIil9O0puLmZyb21TaXplSW5CeXRlcz1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSAyOnJldHVybiBKbi5VTlNJR05FRF9TSE9SVDtjYXNlIDQ6cmV0dXJuIEpuLlVOU0lHTkVEX0lOVDtjYXNlIDE6cmV0dXJuIEpuLlVOU0lHTkVEX0JZVEU7ZGVmYXVsdDp0aHJvdyBuZXcgRigiU2l6ZSBpbiBieXRlcyBjYW5ub3QgYmUgbWFwcGVkIHRvIGFuIEluZGV4RGF0YXR5cGUiKX19O0puLnZhbGlkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBoKHQpJiYodD09PUpuLlVOU0lHTkVEX0JZVEV8fHQ9PT1Kbi5VTlNJR05FRF9TSE9SVHx8dD09PUpuLlVOU0lHTkVEX0lOVCl9O0puLmNyZWF0ZVR5cGVkQXJyYXk9ZnVuY3Rpb24odCxlKXtpZighaCh0KSl0aHJvdyBuZXcgRigibnVtYmVyT2ZWZXJ0aWNlcyBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdD49TS5TSVhUWV9GT1VSX0tJTE9CWVRFUz9uZXcgVWludDMyQXJyYXkoZSk6bmV3IFVpbnQxNkFycmF5KGUpfTtKbi5jcmVhdGVUeXBlZEFycmF5RnJvbUFycmF5QnVmZmVyPWZ1bmN0aW9uKHQsZSxuLG8pe2lmKCFoKHQpKXRocm93IG5ldyBGKCJudW1iZXJPZlZlcnRpY2VzIGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBGKCJzb3VyY2VBcnJheSBpcyByZXF1aXJlZC4iKTtpZighaChuKSl0aHJvdyBuZXcgRigiYnl0ZU9mZnNldCBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdD49TS5TSVhUWV9GT1VSX0tJTE9CWVRFUz9uZXcgVWludDMyQXJyYXkoZSxuLG8pOm5ldyBVaW50MTZBcnJheShlLG4sbyl9O0puLmZyb21UeXBlZEFycmF5PWZ1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBKbi5VTlNJR05FRF9CWVRFO2lmKHQgaW5zdGFuY2VvZiBVaW50MTZBcnJheSlyZXR1cm4gSm4uVU5TSUdORURfU0hPUlQ7aWYodCBpbnN0YW5jZW9mIFVpbnQzMkFycmF5KXJldHVybiBKbi5VTlNJR05FRF9JTlQ7dGhyb3cgbmV3IEYoImFycmF5IG11c3QgYmUgYSBVaW50OEFycmF5LCBVaW50MTZBcnJheSwgb3IgVWludDMyQXJyYXkuIil9O0R0PU9iamVjdC5mcmVlemUoSm4pfSk7ZnVuY3Rpb24gT2IodCxlLG4pe2xldCBvPXQrZTtyZXR1cm4gTS5zaWduKHQpIT09TS5zaWduKGUpJiZNYXRoLmFicyhvL01hdGgubWF4KE1hdGguYWJzKHQpLE1hdGguYWJzKGUpKSk8bj8wOm99dmFyIEZoLGdyLE5wPVooKCk9PntIdCgpO1d0KCk7Rmg9e307RmguY29tcHV0ZURpc2NyaW1pbmFudD1mdW5jdGlvbih0LGUsbil7aWYodHlwZW9mIHQhPSJudW1iZXIiKXRocm93IG5ldyBGKCJhIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpO2lmKHR5cGVvZiBlIT0ibnVtYmVyIil0aHJvdyBuZXcgRigiYiBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTtpZih0eXBlb2YgbiE9Im51bWJlciIpdGhyb3cgbmV3IEYoImMgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7cmV0dXJuIGUqZS00KnQqbn07RmguY29tcHV0ZVJlYWxSb290cz1mdW5jdGlvbih0LGUsbil7aWYodHlwZW9mIHQhPSJudW1iZXIiKXRocm93IG5ldyBGKCJhIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpO2lmKHR5cGVvZiBlIT0ibnVtYmVyIil0aHJvdyBuZXcgRigiYiBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTtpZih0eXBlb2YgbiE9Im51bWJlciIpdGhyb3cgbmV3IEYoImMgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7bGV0IG87aWYodD09PTApcmV0dXJuIGU9PT0wP1tdOlstbi9lXTtpZihlPT09MCl7aWYobj09PTApcmV0dXJuWzAsMF07bGV0IHU9TWF0aC5hYnMobiksYz1NYXRoLmFicyh0KTtpZih1PGMmJnUvYzxNLkVQU0lMT04xNClyZXR1cm5bMCwwXTtpZih1PmMmJmMvdTxNLkVQU0lMT04xNClyZXR1cm5bXTtpZihvPS1uL3QsbzwwKXJldHVybltdO2xldCBsPU1hdGguc3FydChvKTtyZXR1cm5bLWwsbF19ZWxzZSBpZihuPT09MClyZXR1cm4gbz0tZS90LG88MD9bbywwXTpbMCxvXTtsZXQgcj1lKmUsaT00KnQqbixzPU9iKHIsLWksTS5FUFNJTE9OMTQpO2lmKHM8MClyZXR1cm5bXTtsZXQgZj0tLjUqT2IoZSxNLnNpZ24oZSkqTWF0aC5zcXJ0KHMpLE0uRVBTSUxPTjE0KTtyZXR1cm4gZT4wP1tmL3Qsbi9mXTpbbi9mLGYvdF19O2dyPUZofSk7ZnVuY3Rpb24gQmgodCxlLG4sbyl7bGV0IHI9dCxpPWUvMyxzPW4vMyxmPW8sdT1yKnMsYz1pKmYsbD1pKmkscD1zKnMsZD1yKnMtbCxtPXIqZi1pKnMsXz1pKmYtcCxnPTQqZCpfLW0qbSxiLHc7aWYoZzwwKXtsZXQgUixvdCxjdDtsKmM+PXUqcD8oUj1yLG90PWQsY3Q9LTIqaSpkK3IqbSk6KFI9ZixvdD1fLGN0PS1mKm0rMipzKl8pO2xldCB5dD0tKGN0PDA/LTE6MSkqTWF0aC5hYnMoUikqTWF0aC5zcXJ0KC1nKTt3PS1jdCt5dDtsZXQgcnQ9dy8yLFB0PXJ0PDA/LU1hdGgucG93KC1ydCwxLzMpOk1hdGgucG93KHJ0LDEvMyksZ3Q9dz09PXl0Py1QdDotb3QvUHQ7cmV0dXJuIGI9b3Q8PTA/UHQrZ3Q6LWN0LyhQdCpQdCtndCpndCtvdCksbCpjPj11KnA/WyhiLWkpL3JdOlstZi8oYitzKV19bGV0IE89ZCxFPS0yKmkqZCtyKm0sVD1fLEM9LWYqbSsyKnMqXyxOPU1hdGguc3FydChnKSxJPU1hdGguc3FydCgzKS8yLEQ9TWF0aC5hYnMoTWF0aC5hdGFuMihyKk4sLUUpLzMpO2I9MipNYXRoLnNxcnQoLU8pO2xldCB2PU1hdGguY29zKEQpO3c9Yip2O2xldCBMPWIqKC12LzItSSpNYXRoLnNpbihEKSksVT13K0w+MippP3ctaTpMLWksQT1yLFM9VS9BO0Q9TWF0aC5hYnMoTWF0aC5hdGFuMihmKk4sLUMpLzMpLGI9MipNYXRoLnNxcnQoLVQpLHY9TWF0aC5jb3MoRCksdz1iKnYsTD1iKigtdi8yLUkqTWF0aC5zaW4oRCkpO2xldCBQPS1mLEI9dytMPDIqcz93K3M6TCtzLGo9UC9CLEg9QSpCLGs9LVUqQi1BKlAsSz1VKlAsWD0ocyprLWkqSykvKC1pKmsrcypIKTtyZXR1cm4gUzw9WD9TPD1qP1g8PWo/W1MsWCxqXTpbUyxqLFhdOltqLFMsWF06Uzw9aj9bWCxTLGpdOlg8PWo/W1gsaixTXTpbaixYLFNdfXZhciBVaCxJcCxFYj1aKCgpPT57SHQoKTtOcCgpO1VoPXt9O1VoLmNvbXB1dGVEaXNjcmltaW5hbnQ9ZnVuY3Rpb24odCxlLG4sbyl7aWYodHlwZW9mIHQhPSJudW1iZXIiKXRocm93IG5ldyBGKCJhIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpO2lmKHR5cGVvZiBlIT0ibnVtYmVyIil0aHJvdyBuZXcgRigiYiBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTtpZih0eXBlb2YgbiE9Im51bWJlciIpdGhyb3cgbmV3IEYoImMgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7aWYodHlwZW9mIG8hPSJudW1iZXIiKXRocm93IG5ldyBGKCJkIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpO2xldCByPXQqdCxpPWUqZSxzPW4qbixmPW8qbztyZXR1cm4gMTgqdCplKm4qbytpKnMtMjcqcipmLTQqKHQqcypuK2kqZSpvKX07VWguY29tcHV0ZVJlYWxSb290cz1mdW5jdGlvbih0LGUsbixvKXtpZih0eXBlb2YgdCE9Im51bWJlciIpdGhyb3cgbmV3IEYoImEgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7aWYodHlwZW9mIGUhPSJudW1iZXIiKXRocm93IG5ldyBGKCJiIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpO2lmKHR5cGVvZiBuIT0ibnVtYmVyIil0aHJvdyBuZXcgRigiYyBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTtpZih0eXBlb2YgbyE9Im51bWJlciIpdGhyb3cgbmV3IEYoImQgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7bGV0IHIsaTtpZih0PT09MClyZXR1cm4gZ3IuY29tcHV0ZVJlYWxSb290cyhlLG4sbyk7aWYoZT09PTApe2lmKG49PT0wKXtpZihvPT09MClyZXR1cm5bMCwwLDBdO2k9LW8vdDtsZXQgcz1pPDA/LU1hdGgucG93KC1pLDEvMyk6TWF0aC5wb3coaSwxLzMpO3JldHVybltzLHMsc119ZWxzZSBpZihvPT09MClyZXR1cm4gcj1nci5jb21wdXRlUmVhbFJvb3RzKHQsMCxuKSxyLkxlbmd0aD09PTA/WzBdOltyWzBdLDAsclsxXV07cmV0dXJuIEJoKHQsMCxuLG8pfWVsc2V7aWYobj09PTApcmV0dXJuIG89PT0wPyhpPS1lL3QsaTwwP1tpLDAsMF06WzAsMCxpXSk6QmgodCxlLDAsbyk7aWYobz09PTApcmV0dXJuIHI9Z3IuY29tcHV0ZVJlYWxSb290cyh0LGUsbiksci5sZW5ndGg9PT0wP1swXTpyWzFdPD0wP1tyWzBdLHJbMV0sMF06clswXT49MD9bMCxyWzBdLHJbMV1dOltyWzBdLDAsclsxXV19cmV0dXJuIEJoKHQsZSxuLG8pfTtJcD1VaH0pO2Z1bmN0aW9uIEJyKHQsZSxuLG8pe2xldCByPXQqdCxpPWUtMypyLzgscz1uLWUqdC8yK3IqdC84LGY9by1uKnQvNCtlKnIvMTYtMypyKnIvMjU2LHU9SXAuY29tcHV0ZVJlYWxSb290cygxLDIqaSxpKmktNCpmLC1zKnMpO2lmKHUubGVuZ3RoPjApe2xldCBjPS10LzQsbD11W3UubGVuZ3RoLTFdO2lmKE1hdGguYWJzKGwpPE0uRVBTSUxPTjE0KXtsZXQgcD1nci5jb21wdXRlUmVhbFJvb3RzKDEsaSxmKTtpZihwLmxlbmd0aD09PTIpe2xldCBkPXBbMF0sbT1wWzFdLF87aWYoZD49MCYmbT49MCl7bGV0IGc9TWF0aC5zcXJ0KGQpLGI9TWF0aC5zcXJ0KG0pO3JldHVybltjLWIsYy1nLGMrZyxjK2JdfWVsc2V7aWYoZD49MCYmbTwwKXJldHVybiBfPU1hdGguc3FydChkKSxbYy1fLGMrX107aWYoZDwwJiZtPj0wKXJldHVybiBfPU1hdGguc3FydChtKSxbYy1fLGMrX119fXJldHVybltdfWVsc2UgaWYobD4wKXtsZXQgcD1NYXRoLnNxcnQobCksZD0oaStsLXMvcCkvMixtPShpK2wrcy9wKS8yLF89Z3IuY29tcHV0ZVJlYWxSb290cygxLHAsZCksZz1nci5jb21wdXRlUmVhbFJvb3RzKDEsLXAsbSk7cmV0dXJuIF8ubGVuZ3RoIT09MD8oX1swXSs9YyxfWzFdKz1jLGcubGVuZ3RoIT09MD8oZ1swXSs9YyxnWzFdKz1jLF9bMV08PWdbMF0/W19bMF0sX1sxXSxnWzBdLGdbMV1dOmdbMV08PV9bMF0/W2dbMF0sZ1sxXSxfWzBdLF9bMV1dOl9bMF0+PWdbMF0mJl9bMV08PWdbMV0/W2dbMF0sX1swXSxfWzFdLGdbMV1dOmdbMF0+PV9bMF0mJmdbMV08PV9bMV0/W19bMF0sZ1swXSxnWzFdLF9bMV1dOl9bMF0+Z1swXSYmX1swXTxnWzFdP1tnWzBdLF9bMF0sZ1sxXSxfWzFdXTpbX1swXSxnWzBdLF9bMV0sZ1sxXV0pOl8pOmcubGVuZ3RoIT09MD8oZ1swXSs9YyxnWzFdKz1jLGcpOltdfX1yZXR1cm5bXX1mdW5jdGlvbiB3Zih0LGUsbixvKXtsZXQgcj1uKm4saT1lKmUscz10KnQsZj0tMiplLHU9bip0K2ktNCpvLGM9cypvLW4qZSp0K3IsbD1JcC5jb21wdXRlUmVhbFJvb3RzKDEsZix1LGMpO2lmKGwubGVuZ3RoPjApe2xldCBwPWxbMF0sZD1lLXAsbT1kKmQsXz10LzIsZz1kLzIsYj1tLTQqbyx3PW0rNCpNYXRoLmFicyhvKSxPPXMtNCpwLEU9cys0Kk1hdGguYWJzKHApLFQsQztpZihwPDB8fGIqRTxPKncpe2xldCBBPU1hdGguc3FydChPKTtUPUEvMixDPUE9PT0wPzA6KHQqZy1uKS9BfWVsc2V7bGV0IEE9TWF0aC5zcXJ0KGIpO1Q9QT09PTA/MDoodCpnLW4pL0EsQz1BLzJ9bGV0IE4sSTtfPT09MCYmVD09PTA/KE49MCxJPTApOk0uc2lnbihfKT09PU0uc2lnbihUKT8oTj1fK1QsST1wL04pOihJPV8tVCxOPXAvSSk7bGV0IEQsdjtnPT09MCYmQz09PTA/KEQ9MCx2PTApOk0uc2lnbihnKT09PU0uc2lnbihDKT8oRD1nK0Msdj1vL0QpOih2PWctQyxEPW8vdik7bGV0IEw9Z3IuY29tcHV0ZVJlYWxSb290cygxLE4sRCksVT1nci5jb21wdXRlUmVhbFJvb3RzKDEsSSx2KTtpZihMLmxlbmd0aCE9PTApcmV0dXJuIFUubGVuZ3RoIT09MD9MWzFdPD1VWzBdP1tMWzBdLExbMV0sVVswXSxVWzFdXTpVWzFdPD1MWzBdP1tVWzBdLFVbMV0sTFswXSxMWzFdXTpMWzBdPj1VWzBdJiZMWzFdPD1VWzFdP1tVWzBdLExbMF0sTFsxXSxVWzFdXTpVWzBdPj1MWzBdJiZVWzFdPD1MWzFdP1tMWzBdLFVbMF0sVVsxXSxMWzFdXTpMWzBdPlVbMF0mJkxbMF08VVsxXT9bVVswXSxMWzBdLFVbMV0sTFsxXV06W0xbMF0sVVswXSxMWzFdLFVbMV1dOkw7aWYoVS5sZW5ndGghPT0wKXJldHVybiBVfXJldHVybltdfXZhciBWaCxSYixTYj1aKCgpPT57RWIoKTtIdCgpO1d0KCk7TnAoKTtWaD17fTtWaC5jb21wdXRlRGlzY3JpbWluYW50PWZ1bmN0aW9uKHQsZSxuLG8scil7aWYodHlwZW9mIHQhPSJudW1iZXIiKXRocm93IG5ldyBGKCJhIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpO2lmKHR5cGVvZiBlIT0ibnVtYmVyIil0aHJvdyBuZXcgRigiYiBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTtpZih0eXBlb2YgbiE9Im51bWJlciIpdGhyb3cgbmV3IEYoImMgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7aWYodHlwZW9mIG8hPSJudW1iZXIiKXRocm93IG5ldyBGKCJkIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpO2lmKHR5cGVvZiByIT0ibnVtYmVyIil0aHJvdyBuZXcgRigiZSBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTtsZXQgaT10KnQscz1pKnQsZj1lKmUsdT1mKmUsYz1uKm4sbD1jKm4scD1vKm8sZD1wKm8sbT1yKnIsXz1tKnI7cmV0dXJuIGYqYypwLTQqdSpkLTQqdCpsKnArMTgqdCplKm4qZC0yNyppKnAqcCsyNTYqcypfK3IqKDE4KnUqbipvLTQqZipsKzE2KnQqYypjLTgwKnQqZSpjKm8tNip0KmYqcCsxNDQqaSpuKnApK20qKDE0NCp0KmYqbi0yNypmKmYtMTI4KmkqYy0xOTIqaSplKm8pfTtWaC5jb21wdXRlUmVhbFJvb3RzPWZ1bmN0aW9uKHQsZSxuLG8scil7aWYodHlwZW9mIHQhPSJudW1iZXIiKXRocm93IG5ldyBGKCJhIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpO2lmKHR5cGVvZiBlIT0ibnVtYmVyIil0aHJvdyBuZXcgRigiYiBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTtpZih0eXBlb2YgbiE9Im51bWJlciIpdGhyb3cgbmV3IEYoImMgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7aWYodHlwZW9mIG8hPSJudW1iZXIiKXRocm93IG5ldyBGKCJkIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpO2lmKHR5cGVvZiByIT0ibnVtYmVyIil0aHJvdyBuZXcgRigiZSBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTtpZihNYXRoLmFicyh0KTxNLkVQU0lMT04xNSlyZXR1cm4gSXAuY29tcHV0ZVJlYWxSb290cyhlLG4sbyxyKTtsZXQgaT1lL3Qscz1uL3QsZj1vL3QsdT1yL3QsYz1pPDA/MTowO3N3aXRjaChjKz1zPDA/YysxOmMsYys9ZjwwP2MrMTpjLGMrPXU8MD9jKzE6YyxjKXtjYXNlIDA6cmV0dXJuIEJyKGkscyxmLHUpO2Nhc2UgMTpyZXR1cm4gd2YoaSxzLGYsdSk7Y2FzZSAyOnJldHVybiB3ZihpLHMsZix1KTtjYXNlIDM6cmV0dXJuIEJyKGkscyxmLHUpO2Nhc2UgNDpyZXR1cm4gQnIoaSxzLGYsdSk7Y2FzZSA1OnJldHVybiB3ZihpLHMsZix1KTtjYXNlIDY6cmV0dXJuIEJyKGkscyxmLHUpO2Nhc2UgNzpyZXR1cm4gQnIoaSxzLGYsdSk7Y2FzZSA4OnJldHVybiB3ZihpLHMsZix1KTtjYXNlIDk6cmV0dXJuIEJyKGkscyxmLHUpO2Nhc2UgMTA6cmV0dXJuIEJyKGkscyxmLHUpO2Nhc2UgMTE6cmV0dXJuIHdmKGkscyxmLHUpO2Nhc2UgMTI6cmV0dXJuIEJyKGkscyxmLHUpO2Nhc2UgMTM6cmV0dXJuIEJyKGkscyxmLHUpO2Nhc2UgMTQ6cmV0dXJuIEJyKGkscyxmLHUpO2Nhc2UgMTU6cmV0dXJuIEJyKGkscyxmLHUpO2RlZmF1bHQ6cmV0dXJufX07UmI9Vmh9KTtmdW5jdGlvbiB2cCh0LGUpe2U9YS5jbG9uZSh4KGUsYS5aRVJPKSksYS5lcXVhbHMoZSxhLlpFUk8pfHxhLm5vcm1hbGl6ZShlLGUpLHRoaXMub3JpZ2luPWEuY2xvbmUoeCh0LGEuWkVSTykpLHRoaXMuZGlyZWN0aW9uPWV9dmFyIFFzLExwPVooKCk9PntGdCgpO1h0KCk7SXQoKTtmdCgpO3ZwLmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYoaCh0KSlyZXR1cm4gaChlKT8oZS5vcmlnaW49YS5jbG9uZSh0Lm9yaWdpbiksZS5kaXJlY3Rpb249YS5jbG9uZSh0LmRpcmVjdGlvbiksZSk6bmV3IHZwKHQub3JpZ2luLHQuZGlyZWN0aW9uKX07dnAuZ2V0UG9pbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInJheSIsdCkseS50eXBlT2YubnVtYmVyKCJ0IixlKSxoKG4pfHwobj1uZXcgYSksbj1hLm11bHRpcGx5QnlTY2FsYXIodC5kaXJlY3Rpb24sZSxuKSxhLmFkZCh0Lm9yaWdpbixuLG4pfTtRcz12cH0pO2Z1bmN0aW9uIGczKHQsZSxuLG8pe2xldCByPWUqZS00KnQqbjtpZihyPDApcmV0dXJuO2lmKHI+MCl7bGV0IHM9MS8oMip0KSxmPU1hdGguc3FydChyKSx1PSgtZStmKSpzLGM9KC1lLWYpKnM7cmV0dXJuIHU8Yz8oby5yb290MD11LG8ucm9vdDE9Yyk6KG8ucm9vdDA9YyxvLnJvb3QxPXUpLG99bGV0IGk9LWUvKDIqdCk7aWYoaSE9PTApcmV0dXJuIG8ucm9vdDA9by5yb290MT1pLG99ZnVuY3Rpb24gRGIodCxlLG4pe2gobil8fChuPW5ldyBRcik7bGV0IG89dC5vcmlnaW4scj10LmRpcmVjdGlvbixpPWUuY2VudGVyLHM9ZS5yYWRpdXMqZS5yYWRpdXMsZj1hLnN1YnRyYWN0KG8saSxMYiksdT1hLmRvdChyLHIpLGM9MiphLmRvdChyLGYpLGw9YS5tYWduaXR1ZGVTcXVhcmVkKGYpLXMscD1nMyh1LGMsbCxBMyk7aWYoaChwKSlyZXR1cm4gbi5zdGFydD1wLnJvb3QwLG4uc3RvcD1wLnJvb3QxLG59ZnVuY3Rpb24gSnModCxlLG4pe2xldCBvPXQrZTtyZXR1cm4gTS5zaWduKHQpIT09TS5zaWduKGUpJiZNYXRoLmFicyhvL01hdGgubWF4KE1hdGguYWJzKHQpLE1hdGguYWJzKGUpKSk8bj8wOm99dmFyIHluLGgzLF8zLExiLENiLHhiLHkzLEEzLGIzLHczLFQzLGtoLFBiLE1iLERwLE8zLEUzLFIzLFMzLEMzLHgzLE5iLEliLHZiLFAzLE0zLE4zLGhvLHRjPVooKCk9PntGdCgpO1BlKCk7SXQoKTtmdCgpO0h0KCk7emwoKTtXdCgpO0ZuKCk7TnAoKTtTYigpO0xwKCk7eW49e307eW4ucmF5UGxhbmU9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBGKCJyYXkgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEYoInBsYW5lIGlzIHJlcXVpcmVkLiIpO2gobil8fChuPW5ldyBhKTtsZXQgbz10Lm9yaWdpbixyPXQuZGlyZWN0aW9uLGk9ZS5ub3JtYWwscz1hLmRvdChpLHIpO2lmKE1hdGguYWJzKHMpPE0uRVBTSUxPTjE1KXJldHVybjtsZXQgZj0oLWUuZGlzdGFuY2UtYS5kb3QoaSxvKSkvcztpZighKGY8MCkpcmV0dXJuIG49YS5tdWx0aXBseUJ5U2NhbGFyKHIsZixuKSxhLmFkZChvLG4sbil9O2gzPW5ldyBhLF8zPW5ldyBhLExiPW5ldyBhLENiPW5ldyBhLHhiPW5ldyBhO3luLnJheVRyaWFuZ2xlUGFyYW1ldHJpYz1mdW5jdGlvbih0LGUsbixvLHIpe2lmKCFoKHQpKXRocm93IG5ldyBGKCJyYXkgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEYoInAwIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBGKCJwMSBpcyByZXF1aXJlZC4iKTtpZighaChvKSl0aHJvdyBuZXcgRigicDIgaXMgcmVxdWlyZWQuIik7cj14KHIsITEpO2xldCBpPXQub3JpZ2luLHM9dC5kaXJlY3Rpb24sZj1hLnN1YnRyYWN0KG4sZSxoMyksdT1hLnN1YnRyYWN0KG8sZSxfMyksYz1hLmNyb3NzKHMsdSxMYiksbD1hLmRvdChmLGMpLHAsZCxtLF8sZztpZihyKXtpZihsPE0uRVBTSUxPTjZ8fChwPWEuc3VidHJhY3QoaSxlLENiKSxtPWEuZG90KHAsYyksbTwwfHxtPmwpfHwoZD1hLmNyb3NzKHAsZix4YiksXz1hLmRvdChzLGQpLF88MHx8bStfPmwpKXJldHVybjtnPWEuZG90KHUsZCkvbH1lbHNle2lmKE1hdGguYWJzKGwpPE0uRVBTSUxPTjYpcmV0dXJuO2xldCBiPTEvbDtpZihwPWEuc3VidHJhY3QoaSxlLENiKSxtPWEuZG90KHAsYykqYixtPDB8fG0+MXx8KGQ9YS5jcm9zcyhwLGYseGIpLF89YS5kb3QocyxkKSpiLF88MHx8bStfPjEpKXJldHVybjtnPWEuZG90KHUsZCkqYn1yZXR1cm4gZ307eW4ucmF5VHJpYW5nbGU9ZnVuY3Rpb24odCxlLG4sbyxyLGkpe2xldCBzPXluLnJheVRyaWFuZ2xlUGFyYW1ldHJpYyh0LGUsbixvLHIpO2lmKCEoIWgocyl8fHM8MCkpcmV0dXJuIGgoaSl8fChpPW5ldyBhKSxhLm11bHRpcGx5QnlTY2FsYXIodC5kaXJlY3Rpb24scyxpKSxhLmFkZCh0Lm9yaWdpbixpLGkpfTt5Mz1uZXcgUXM7eW4ubGluZVNlZ21lbnRUcmlhbmdsZT1mdW5jdGlvbih0LGUsbixvLHIsaSxzKXtpZighaCh0KSl0aHJvdyBuZXcgRigidjAgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEYoInYxIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBGKCJwMCBpcyByZXF1aXJlZC4iKTtpZighaChvKSl0aHJvdyBuZXcgRigicDEgaXMgcmVxdWlyZWQuIik7aWYoIWgocikpdGhyb3cgbmV3IEYoInAyIGlzIHJlcXVpcmVkLiIpO2xldCBmPXkzO2EuY2xvbmUodCxmLm9yaWdpbiksYS5zdWJ0cmFjdChlLHQsZi5kaXJlY3Rpb24pLGEubm9ybWFsaXplKGYuZGlyZWN0aW9uLGYuZGlyZWN0aW9uKTtsZXQgdT15bi5yYXlUcmlhbmdsZVBhcmFtZXRyaWMoZixuLG8scixpKTtpZighKCFoKHUpfHx1PDB8fHU+YS5kaXN0YW5jZSh0LGUpKSlyZXR1cm4gaChzKXx8KHM9bmV3IGEpLGEubXVsdGlwbHlCeVNjYWxhcihmLmRpcmVjdGlvbix1LHMpLGEuYWRkKGYub3JpZ2luLHMscyl9O0EzPXtyb290MDowLHJvb3QxOjB9O3luLnJheVNwaGVyZT1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEYoInJheSBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgRigic3BoZXJlIGlzIHJlcXVpcmVkLiIpO2lmKG49RGIodCxlLG4pLCEoIWgobil8fG4uc3RvcDwwKSlyZXR1cm4gbi5zdGFydD1NYXRoLm1heChuLnN0YXJ0LDApLG59O2IzPW5ldyBRczt5bi5saW5lU2VnbWVudFNwaGVyZT1mdW5jdGlvbih0LGUsbixvKXtpZighaCh0KSl0aHJvdyBuZXcgRigicDAgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEYoInAxIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBGKCJzcGhlcmUgaXMgcmVxdWlyZWQuIik7bGV0IHI9YjM7YS5jbG9uZSh0LHIub3JpZ2luKTtsZXQgaT1hLnN1YnRyYWN0KGUsdCxyLmRpcmVjdGlvbikscz1hLm1hZ25pdHVkZShpKTtpZihhLm5vcm1hbGl6ZShpLGkpLG89RGIocixuLG8pLCEoIWgobyl8fG8uc3RvcDwwfHxvLnN0YXJ0PnMpKXJldHVybiBvLnN0YXJ0PU1hdGgubWF4KG8uc3RhcnQsMCksby5zdG9wPU1hdGgubWluKG8uc3RvcCxzKSxvfTt3Mz1uZXcgYSxUMz1uZXcgYTt5bi5yYXlFbGxpcHNvaWQ9ZnVuY3Rpb24odCxlKXtpZighaCh0KSl0aHJvdyBuZXcgRigicmF5IGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBGKCJlbGxpcHNvaWQgaXMgcmVxdWlyZWQuIik7bGV0IG49ZS5vbmVPdmVyUmFkaWksbz1hLm11bHRpcGx5Q29tcG9uZW50cyhuLHQub3JpZ2luLHczKSxyPWEubXVsdGlwbHlDb21wb25lbnRzKG4sdC5kaXJlY3Rpb24sVDMpLGk9YS5tYWduaXR1ZGVTcXVhcmVkKG8pLHM9YS5kb3QobyxyKSxmLHUsYyxsLHA7aWYoaT4xKXtpZihzPj0wKXJldHVybjtsZXQgZD1zKnM7aWYoZj1pLTEsdT1hLm1hZ25pdHVkZVNxdWFyZWQociksYz11KmYsZDxjKXJldHVybjtpZihkPmMpe2w9cypzLWMscD0tcytNYXRoLnNxcnQobCk7bGV0IF89cC91LGc9Zi9wO3JldHVybiBfPGc/bmV3IFFyKF8sZyk6e3N0YXJ0Omcsc3RvcDpffX1sZXQgbT1NYXRoLnNxcnQoZi91KTtyZXR1cm4gbmV3IFFyKG0sbSl9ZWxzZSBpZihpPDEpcmV0dXJuIGY9aS0xLHU9YS5tYWduaXR1ZGVTcXVhcmVkKHIpLGM9dSpmLGw9cypzLWMscD0tcytNYXRoLnNxcnQobCksbmV3IFFyKDAscC91KTtpZihzPDApcmV0dXJuIHU9YS5tYWduaXR1ZGVTcXVhcmVkKHIpLG5ldyBRcigwLC1zL3UpfTt5bi5xdWFkcmF0aWNWZWN0b3JFeHByZXNzaW9uPWZ1bmN0aW9uKHQsZSxuLG8scil7bGV0IGk9bypvLHM9cipyLGY9KHRbSi5DT0xVTU4xUk9XMV0tdFtKLkNPTFVNTjJST1cyXSkqcyx1PXIqKG8qSnModFtKLkNPTFVNTjFST1cwXSx0W0ouQ09MVU1OMFJPVzFdLE0uRVBTSUxPTjE1KStlLnkpLGM9dFtKLkNPTFVNTjBST1cwXSppK3RbSi5DT0xVTU4yUk9XMl0qcytvKmUueCtuLGw9cypKcyh0W0ouQ09MVU1OMlJPVzFdLHRbSi5DT0xVTU4xUk9XMl0sTS5FUFNJTE9OMTUpLHA9cioobypKcyh0W0ouQ09MVU1OMlJPVzBdLHRbSi5DT0xVTU4wUk9XMl0pK2UueiksZCxtPVtdO2lmKHA9PT0wJiZsPT09MCl7aWYoZD1nci5jb21wdXRlUmVhbFJvb3RzKGYsdSxjKSxkLmxlbmd0aD09PTApcmV0dXJuIG07bGV0IEQ9ZFswXSx2PU1hdGguc3FydChNYXRoLm1heCgxLUQqRCwwKSk7aWYobS5wdXNoKG5ldyBhKG8scipELHIqLXYpKSxtLnB1c2gobmV3IGEobyxyKkQscip2KSksZC5sZW5ndGg9PT0yKXtsZXQgTD1kWzFdLFU9TWF0aC5zcXJ0KE1hdGgubWF4KDEtTCpMLDApKTttLnB1c2gobmV3IGEobyxyKkwsciotVSkpLG0ucHVzaChuZXcgYShvLHIqTCxyKlUpKX1yZXR1cm4gbX1sZXQgXz1wKnAsZz1sKmwsYj1mKmYsdz1wKmwsTz1iK2csRT0yKih1KmYrdyksVD0yKmMqZit1KnUtZytfLEM9MiooYyp1LXcpLE49YypjLV87aWYoTz09PTAmJkU9PT0wJiZUPT09MCYmQz09PTApcmV0dXJuIG07ZD1SYi5jb21wdXRlUmVhbFJvb3RzKE8sRSxULEMsTik7bGV0IEk9ZC5sZW5ndGg7aWYoST09PTApcmV0dXJuIG07Zm9yKGxldCBEPTA7RDxJOysrRCl7bGV0IHY9ZFtEXSxMPXYqdixVPU1hdGgubWF4KDEtTCwwKSxBPU1hdGguc3FydChVKSxTO00uc2lnbihmKT09PU0uc2lnbihjKT9TPUpzKGYqTCtjLHUqdixNLkVQU0lMT04xMik6TS5zaWduKGMpPT09TS5zaWduKHUqdik/Uz1KcyhmKkwsdSp2K2MsTS5FUFNJTE9OMTIpOlM9SnMoZipMK3UqdixjLE0uRVBTSUxPTjEyKTtsZXQgUD1KcyhsKnYscCxNLkVQU0lMT04xNSksQj1TKlA7QjwwP20ucHVzaChuZXcgYShvLHIqdixyKkEpKTpCPjA/bS5wdXNoKG5ldyBhKG8scip2LHIqLUEpKTpBIT09MD8obS5wdXNoKG5ldyBhKG8scip2LHIqLUEpKSxtLnB1c2gobmV3IGEobyxyKnYscipBKSksKytEKTptLnB1c2gobmV3IGEobyxyKnYscipBKSl9cmV0dXJuIG19O2toPW5ldyBhLFBiPW5ldyBhLE1iPW5ldyBhLERwPW5ldyBhLE8zPW5ldyBhLEUzPW5ldyBKLFIzPW5ldyBKLFMzPW5ldyBKLEMzPW5ldyBKLHgzPW5ldyBKLE5iPW5ldyBKLEliPW5ldyBKLHZiPW5ldyBhLFAzPW5ldyBhLE0zPW5ldyBhdDt5bi5ncmF6aW5nQWx0aXR1ZGVMb2NhdGlvbj1mdW5jdGlvbih0LGUpe2lmKCFoKHQpKXRocm93IG5ldyBGKCJyYXkgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEYoImVsbGlwc29pZCBpcyByZXF1aXJlZC4iKTtsZXQgbj10Lm9yaWdpbixvPXQuZGlyZWN0aW9uO2lmKCFhLmVxdWFscyhuLGEuWkVSTykpe2xldCBOPWUuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKG4sa2gpO2lmKGEuZG90KG8sTik+PTApcmV0dXJuIG59bGV0IHI9aCh0aGlzLnJheUVsbGlwc29pZCh0LGUpKSxpPWUudHJhbnNmb3JtUG9zaXRpb25Ub1NjYWxlZFNwYWNlKG8sa2gpLHM9YS5ub3JtYWxpemUoaSxpKSxmPWEubW9zdE9ydGhvZ29uYWxBeGlzKGksRHApLHU9YS5ub3JtYWxpemUoYS5jcm9zcyhmLHMsUGIpLFBiKSxjPWEubm9ybWFsaXplKGEuY3Jvc3Mocyx1LE1iKSxNYiksbD1FMztsWzBdPXMueCxsWzFdPXMueSxsWzJdPXMueixsWzNdPXUueCxsWzRdPXUueSxsWzVdPXUueixsWzZdPWMueCxsWzddPWMueSxsWzhdPWMuejtsZXQgcD1KLnRyYW5zcG9zZShsLFIzKSxkPUouZnJvbVNjYWxlKGUucmFkaWksUzMpLG09Si5mcm9tU2NhbGUoZS5vbmVPdmVyUmFkaWksQzMpLF89eDM7X1swXT0wLF9bMV09LW8ueixfWzJdPW8ueSxfWzNdPW8ueixfWzRdPTAsX1s1XT0tby54LF9bNl09LW8ueSxfWzddPW8ueCxfWzhdPTA7bGV0IGc9Si5tdWx0aXBseShKLm11bHRpcGx5KHAsbSxOYiksXyxOYiksYj1KLm11bHRpcGx5KEoubXVsdGlwbHkoZyxkLEliKSxsLEliKSx3PUoubXVsdGlwbHlCeVZlY3RvcihnLG4sTzMpLE89eW4ucXVhZHJhdGljVmVjdG9yRXhwcmVzc2lvbihiLGEubmVnYXRlKHcsa2gpLDAsMCwxKSxFLFQsQz1PLmxlbmd0aDtpZihDPjApe2xldCBOPWEuY2xvbmUoYS5aRVJPLFAzKSxJPU51bWJlci5ORUdBVElWRV9JTkZJTklUWTtmb3IobGV0IHY9MDt2PEM7Kyt2KXtFPUoubXVsdGlwbHlCeVZlY3RvcihkLEoubXVsdGlwbHlCeVZlY3RvcihsLE9bdl0sdmIpLHZiKTtsZXQgTD1hLm5vcm1hbGl6ZShhLnN1YnRyYWN0KEUsbixEcCksRHApLFU9YS5kb3QoTCxvKTtVPkkmJihJPVUsTj1hLmNsb25lKEUsTikpfWxldCBEPWUuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoTixNMyk7cmV0dXJuIEk9TS5jbGFtcChJLDAsMSksVD1hLm1hZ25pdHVkZShhLnN1YnRyYWN0KE4sbixEcCkpKk1hdGguc3FydCgxLUkqSSksVD1yPy1UOlQsRC5oZWlnaHQ9VCxlLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKEQsbmV3IGEpfX07TjM9bmV3IGE7eW4ubGluZVNlZ21lbnRQbGFuZT1mdW5jdGlvbih0LGUsbixvKXtpZighaCh0KSl0aHJvdyBuZXcgRigiZW5kUG9pbnQwIGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBGKCJlbmRQb2ludDEgaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEYoInBsYW5lIGlzIHJlcXVpcmVkLiIpO2gobyl8fChvPW5ldyBhKTtsZXQgcj1hLnN1YnRyYWN0KGUsdCxOMyksaT1uLm5vcm1hbCxzPWEuZG90KGkscik7aWYoTWF0aC5hYnMocyk8TS5FUFNJTE9ONilyZXR1cm47bGV0IGY9YS5kb3QoaSx0KSx1PS0obi5kaXN0YW5jZStmKS9zO2lmKCEodTwwfHx1PjEpKXJldHVybiBhLm11bHRpcGx5QnlTY2FsYXIocix1LG8pLGEuYWRkKHQsbyxvKSxvfTt5bi50cmlhbmdsZVBsYW5lSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLG8pe2lmKCFoKHQpfHwhaChlKXx8IWgobil8fCFoKG8pKXRocm93IG5ldyBGKCJwMCwgcDEsIHAyLCBhbmQgcGxhbmUgYXJlIHJlcXVpcmVkLiIpO2xldCByPW8ubm9ybWFsLGk9by5kaXN0YW5jZSxzPWEuZG90KHIsdCkraTwwLGY9YS5kb3QocixlKStpPDAsdT1hLmRvdChyLG4pK2k8MCxjPTA7Yys9cz8xOjAsYys9Zj8xOjAsYys9dT8xOjA7bGV0IGwscDtpZigoYz09PTF8fGM9PT0yKSYmKGw9bmV3IGEscD1uZXcgYSksYz09PTEpe2lmKHMpcmV0dXJuIHluLmxpbmVTZWdtZW50UGxhbmUodCxlLG8sbCkseW4ubGluZVNlZ21lbnRQbGFuZSh0LG4sbyxwKSx7cG9zaXRpb25zOlt0LGUsbixsLHBdLGluZGljZXM6WzAsMyw0LDEsMiw0LDEsNCwzXX07aWYoZilyZXR1cm4geW4ubGluZVNlZ21lbnRQbGFuZShlLG4sbyxsKSx5bi5saW5lU2VnbWVudFBsYW5lKGUsdCxvLHApLHtwb3NpdGlvbnM6W3QsZSxuLGwscF0saW5kaWNlczpbMSwzLDQsMiwwLDQsMiw0LDNdfTtpZih1KXJldHVybiB5bi5saW5lU2VnbWVudFBsYW5lKG4sdCxvLGwpLHluLmxpbmVTZWdtZW50UGxhbmUobixlLG8scCkse3Bvc2l0aW9uczpbdCxlLG4sbCxwXSxpbmRpY2VzOlsyLDMsNCwwLDEsNCwwLDQsM119fWVsc2UgaWYoYz09PTIpaWYocylpZihmKXtpZighdSlyZXR1cm4geW4ubGluZVNlZ21lbnRQbGFuZSh0LG4sbyxsKSx5bi5saW5lU2VnbWVudFBsYW5lKGUsbixvLHApLHtwb3NpdGlvbnM6W3QsZSxuLGwscF0saW5kaWNlczpbMCwxLDQsMCw0LDMsMiwzLDRdfX1lbHNlIHJldHVybiB5bi5saW5lU2VnbWVudFBsYW5lKG4sZSxvLGwpLHluLmxpbmVTZWdtZW50UGxhbmUodCxlLG8scCkse3Bvc2l0aW9uczpbdCxlLG4sbCxwXSxpbmRpY2VzOlsyLDAsNCwyLDQsMywxLDMsNF19O2Vsc2UgcmV0dXJuIHluLmxpbmVTZWdtZW50UGxhbmUoZSx0LG8sbCkseW4ubGluZVNlZ21lbnRQbGFuZShuLHQsbyxwKSx7cG9zaXRpb25zOlt0LGUsbixsLHBdLGluZGljZXM6WzEsMiw0LDEsNCwzLDAsMyw0XX19O2hvPXlufSk7ZnVuY3Rpb24gdG8odCxlKXtpZih5LnR5cGVPZi5vYmplY3QoIm5vcm1hbCIsdCksIU0uZXF1YWxzRXBzaWxvbihhLm1hZ25pdHVkZSh0KSwxLE0uRVBTSUxPTjYpKXRocm93IG5ldyBGKCJub3JtYWwgbXVzdCBiZSBub3JtYWxpemVkLiIpO3kudHlwZU9mLm51bWJlcigiZGlzdGFuY2UiLGUpLHRoaXMubm9ybWFsPWEuY2xvbmUodCksdGhpcy5kaXN0YW5jZT1lfXZhciBJMyx2MyxMMyxEMyxGMyxvbixmcz1aKCgpPT57RnQoKTtocigpO1h0KCk7ZnQoKTtIdCgpO1d0KCk7Qm4oKTt0by5mcm9tUG9pbnROb3JtYWw9ZnVuY3Rpb24odCxlLG4pe2lmKHkudHlwZU9mLm9iamVjdCgicG9pbnQiLHQpLHkudHlwZU9mLm9iamVjdCgibm9ybWFsIixlKSwhTS5lcXVhbHNFcHNpbG9uKGEubWFnbml0dWRlKGUpLDEsTS5FUFNJTE9ONikpdGhyb3cgbmV3IEYoIm5vcm1hbCBtdXN0IGJlIG5vcm1hbGl6ZWQuIik7bGV0IG89LWEuZG90KGUsdCk7cmV0dXJuIGgobik/KGEuY2xvbmUoZSxuLm5vcm1hbCksbi5kaXN0YW5jZT1vLG4pOm5ldyB0byhlLG8pfTtJMz1uZXcgYTt0by5mcm9tQ2FydGVzaWFuND1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgiY29lZmZpY2llbnRzIix0KTtsZXQgbj1hLmZyb21DYXJ0ZXNpYW40KHQsSTMpLG89dC53O2lmKCFNLmVxdWFsc0Vwc2lsb24oYS5tYWduaXR1ZGUobiksMSxNLkVQU0lMT042KSl0aHJvdyBuZXcgRigibm9ybWFsIG11c3QgYmUgbm9ybWFsaXplZC4iKTtyZXR1cm4gaChlKT8oYS5jbG9uZShuLGUubm9ybWFsKSxlLmRpc3RhbmNlPW8sZSk6bmV3IHRvKG4sbyl9O3RvLmdldFBvaW50RGlzdGFuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJwbGFuZSIsdCkseS50eXBlT2Yub2JqZWN0KCJwb2ludCIsZSksYS5kb3QodC5ub3JtYWwsZSkrdC5kaXN0YW5jZX07djM9bmV3IGE7dG8ucHJvamVjdFBvaW50T250b1BsYW5lPWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoInBsYW5lIix0KSx5LnR5cGVPZi5vYmplY3QoInBvaW50IixlKSxoKG4pfHwobj1uZXcgYSk7bGV0IG89dG8uZ2V0UG9pbnREaXN0YW5jZSh0LGUpLHI9YS5tdWx0aXBseUJ5U2NhbGFyKHQubm9ybWFsLG8sdjMpO3JldHVybiBhLnN1YnRyYWN0KGUscixuKX07TDM9bmV3IHN0LEQzPW5ldyBoZSxGMz1uZXcgYTt0by50cmFuc2Zvcm09ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgicGxhbmUiLHQpLHkudHlwZU9mLm9iamVjdCgidHJhbnNmb3JtIixlKTtsZXQgbz10Lm5vcm1hbCxyPXQuZGlzdGFuY2UsaT1zdC5pbnZlcnNlVHJhbnNwb3NlKGUsTDMpLHM9aGUuZnJvbUVsZW1lbnRzKG8ueCxvLnksby56LHIsRDMpO3M9c3QubXVsdGlwbHlCeVZlY3RvcihpLHMscyk7bGV0IGY9YS5mcm9tQ2FydGVzaWFuNChzLEYzKTtyZXR1cm4gcz1oZS5kaXZpZGVCeVNjYWxhcihzLGEubWFnbml0dWRlKGYpLHMpLHRvLmZyb21DYXJ0ZXNpYW40KHMsbil9O3RvLmNsb25lPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgicGxhbmUiLHQpLGgoZSk/KGEuY2xvbmUodC5ub3JtYWwsZS5ub3JtYWwpLGUuZGlzdGFuY2U9dC5kaXN0YW5jZSxlKTpuZXcgdG8odC5ub3JtYWwsdC5kaXN0YW5jZSl9O3RvLmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHQuZGlzdGFuY2U9PT1lLmRpc3RhbmNlJiZhLmVxdWFscyh0Lm5vcm1hbCxlLm5vcm1hbCl9O3RvLk9SSUdJTl9YWV9QTEFORT1PYmplY3QuZnJlZXplKG5ldyB0byhhLlVOSVRfWiwwKSk7dG8uT1JJR0lOX1laX1BMQU5FPU9iamVjdC5mcmVlemUobmV3IHRvKGEuVU5JVF9YLDApKTt0by5PUklHSU5fWlhfUExBTkU9T2JqZWN0LmZyZWV6ZShuZXcgdG8oYS5VTklUX1ksMCkpO29uPXRvfSk7dmFyIEdoLEZiLEJiPVooKCk9PntJdCgpO2Z0KCk7SHQoKTtHaD17fTtHaC5jYWxjdWxhdGVBQ01SPWZ1bmN0aW9uKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKTtsZXQgZT10LmluZGljZXMsbj10Lm1heGltdW1JbmRleCxvPXgodC5jYWNoZVNpemUsMjQpO2lmKCFoKGUpKXRocm93IG5ldyBGKCJpbmRpY2VzIGlzIHJlcXVpcmVkLiIpO2xldCByPWUubGVuZ3RoO2lmKHI8M3x8ciUzIT09MCl0aHJvdyBuZXcgRigiaW5kaWNlcyBsZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRocmVlLiIpO2lmKG48PTApdGhyb3cgbmV3IEYoIm1heGltdW1JbmRleCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpO2lmKG88Myl0aHJvdyBuZXcgRigiY2FjaGVTaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIHR3by4iKTtpZighaChuKSl7bj0wO2xldCBmPTAsdT1lW2ZdO2Zvcig7ZjxyOyl1Pm4mJihuPXUpLCsrZix1PWVbZl19bGV0IGk9W107Zm9yKGxldCBmPTA7ZjxuKzE7ZisrKWlbZl09MDtsZXQgcz1vKzE7Zm9yKGxldCBmPTA7ZjxyOysrZilzLWlbZVtmXV0+byYmKGlbZVtmXV09cywrK3MpO3JldHVybihzLW8rMSkvKHIvMyl9O0doLnRpcHNpZnk9ZnVuY3Rpb24odCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXQuaW5kaWNlcyxuPXQubWF4aW11bUluZGV4LG89eCh0LmNhY2hlU2l6ZSwyNCkscjtmdW5jdGlvbiBpKFUsQSxTLFApe2Zvcig7QS5sZW5ndGg+PTE7KXtsZXQgQj1BW0EubGVuZ3RoLTFdO2lmKEEuc3BsaWNlKEEubGVuZ3RoLTEsMSksVVtCXS5udW1MaXZlVHJpYW5nbGVzPjApcmV0dXJuIEJ9Zm9yKDtyPFA7KXtpZihVW3JdLm51bUxpdmVUcmlhbmdsZXM+MClyZXR1cm4rK3Isci0xOysrcn1yZXR1cm4tMX1mdW5jdGlvbiBzKFUsQSxTLFAsQixqLEgpe2xldCBrPS0xLEssWD0tMSxSPTA7Zm9yKDtSPFMubGVuZ3RoOyl7bGV0IG90PVNbUl07UFtvdF0ubnVtTGl2ZVRyaWFuZ2xlcyYmKEs9MCxCLVBbb3RdLnRpbWVTdGFtcCsyKlBbb3RdLm51bUxpdmVUcmlhbmdsZXM8PUEmJihLPUItUFtvdF0udGltZVN0YW1wKSwoSz5YfHxYPT09LTEpJiYoWD1LLGs9b3QpKSwrK1J9cmV0dXJuIGs9PT0tMT9pKFAsaixVLEgpOmt9aWYoIWgoZSkpdGhyb3cgbmV3IEYoImluZGljZXMgaXMgcmVxdWlyZWQuIik7bGV0IGY9ZS5sZW5ndGg7aWYoZjwzfHxmJTMhPT0wKXRocm93IG5ldyBGKCJpbmRpY2VzIGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhyZWUuIik7aWYobjw9MCl0aHJvdyBuZXcgRigibWF4aW11bUluZGV4IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7aWYobzwzKXRocm93IG5ldyBGKCJjYWNoZVNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gdHdvLiIpO2xldCB1PTAsYz0wLGw9ZVtjXSxwPWY7aWYoaChuKSl1PW4rMTtlbHNle2Zvcig7YzxwOylsPnUmJih1PWwpLCsrYyxsPWVbY107aWYodT09PS0xKXJldHVybiAwOysrdX1sZXQgZD1bXSxtO2ZvcihtPTA7bTx1O20rKylkW21dPXtudW1MaXZlVHJpYW5nbGVzOjAsdGltZVN0YW1wOjAsdmVydGV4VHJpYW5nbGVzOltdfTtjPTA7bGV0IF89MDtmb3IoO2M8cDspZFtlW2NdXS52ZXJ0ZXhUcmlhbmdsZXMucHVzaChfKSwrK2RbZVtjXV0ubnVtTGl2ZVRyaWFuZ2xlcyxkW2VbYysxXV0udmVydGV4VHJpYW5nbGVzLnB1c2goXyksKytkW2VbYysxXV0ubnVtTGl2ZVRyaWFuZ2xlcyxkW2VbYysyXV0udmVydGV4VHJpYW5nbGVzLnB1c2goXyksKytkW2VbYysyXV0ubnVtTGl2ZVRyaWFuZ2xlcywrK18sYys9MztsZXQgZz0wLGI9bysxO3I9MTtsZXQgdz1bXSxPPVtdLEUsVCxDPTAsTj1bXSxJPWYvMyxEPVtdO2ZvcihtPTA7bTxJO20rKylEW21dPSExO2xldCB2LEw7Zm9yKDtnIT09LTE7KXt3PVtdLFQ9ZFtnXSxMPVQudmVydGV4VHJpYW5nbGVzLmxlbmd0aDtmb3IobGV0IFU9MDtVPEw7KytVKWlmKF89VC52ZXJ0ZXhUcmlhbmdsZXNbVV0sIURbX10pe0RbX109ITAsYz1fK18rXztmb3IobGV0IEE9MDtBPDM7KytBKXY9ZVtjXSx3LnB1c2godiksTy5wdXNoKHYpLE5bQ109diwrK0MsRT1kW3ZdLC0tRS5udW1MaXZlVHJpYW5nbGVzLGItRS50aW1lU3RhbXA+byYmKEUudGltZVN0YW1wPWIsKytiKSwrK2N9Zz1zKGUsbyx3LGQsYixPLHUpfXJldHVybiBOfTtGYj1HaH0pO2Z1bmN0aW9uIHpwKHQsZSxuLG8scil7dFtlKytdPW4sdFtlKytdPW8sdFtlKytdPW8sdFtlKytdPXIsdFtlKytdPXIsdFtlXT1ufWZ1bmN0aW9uIEIzKHQpe2xldCBlPXQubGVuZ3RoLG49ZS8zKjYsbz1EdC5jcmVhdGVUeXBlZEFycmF5KGUsbikscj0wO2ZvcihsZXQgaT0wO2k8ZTtpKz0zLHIrPTYpenAobyxyLHRbaV0sdFtpKzFdLHRbaSsyXSk7cmV0dXJuIG99ZnVuY3Rpb24gVTModCl7bGV0IGU9dC5sZW5ndGg7aWYoZT49Myl7bGV0IG49KGUtMikqNixvPUR0LmNyZWF0ZVR5cGVkQXJyYXkoZSxuKTt6cChvLDAsdFswXSx0WzFdLHRbMl0pO2xldCByPTY7Zm9yKGxldCBpPTM7aTxlOysraSxyKz02KXpwKG8scix0W2ktMV0sdFtpXSx0W2ktMl0pO3JldHVybiBvfXJldHVybiBuZXcgVWludDE2QXJyYXl9ZnVuY3Rpb24gVjModCl7aWYodC5sZW5ndGg+MCl7bGV0IGU9dC5sZW5ndGgtMSxuPShlLTEpKjYsbz1EdC5jcmVhdGVUeXBlZEFycmF5KGUsbikscj10WzBdLGk9MDtmb3IobGV0IHM9MTtzPGU7KytzLGkrPTYpenAobyxpLHIsdFtzXSx0W3MrMV0pO3JldHVybiBvfXJldHVybiBuZXcgVWludDE2QXJyYXl9ZnVuY3Rpb24gVWIodCl7bGV0IGU9e307Zm9yKGxldCBuIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShuKSYmaCh0W25dKSYmaCh0W25dLnZhbHVlcykpe2xldCBvPXRbbl07ZVtuXT1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm8uY29tcG9uZW50RGF0YXR5cGUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTpvLmNvbXBvbmVudHNQZXJBdHRyaWJ1dGUsbm9ybWFsaXplOm8ubm9ybWFsaXplLHZhbHVlczpbXX0pfXJldHVybiBlfWZ1bmN0aW9uIGszKHQsZSxuKXtmb3IobGV0IG8gaW4gZSlpZihlLmhhc093blByb3BlcnR5KG8pJiZoKGVbb10pJiZoKGVbb10udmFsdWVzKSl7bGV0IHI9ZVtvXTtmb3IobGV0IGk9MDtpPHIuY29tcG9uZW50c1BlckF0dHJpYnV0ZTsrK2kpdFtvXS52YWx1ZXMucHVzaChyLnZhbHVlc1tuKnIuY29tcG9uZW50c1BlckF0dHJpYnV0ZStpXSl9fWZ1bmN0aW9uIGpoKHQsZSl7aWYoaChlKSl7bGV0IG49ZS52YWx1ZXMsbz1uLmxlbmd0aDtmb3IobGV0IHI9MDtyPG87cis9MylhLnVucGFjayhuLHIsVnIpLHN0Lm11bHRpcGx5QnlQb2ludCh0LFZyLFZyKSxhLnBhY2soVnIsbixyKX19ZnVuY3Rpb24gSGgodCxlKXtpZihoKGUpKXtsZXQgbj1lLnZhbHVlcyxvPW4ubGVuZ3RoO2ZvcihsZXQgcj0wO3I8bztyKz0zKWEudW5wYWNrKG4scixWciksSi5tdWx0aXBseUJ5VmVjdG9yKHQsVnIsVnIpLFZyPWEubm9ybWFsaXplKFZyLFZyKSxhLnBhY2soVnIsbixyKX19ZnVuY3Rpb24gejModCxlKXtsZXQgbj10Lmxlbmd0aCxvPXt9LHI9dFswXVtlXS5hdHRyaWJ1dGVzLGk7Zm9yKGkgaW4gcilpZihyLmhhc093blByb3BlcnR5KGkpJiZoKHJbaV0pJiZoKHJbaV0udmFsdWVzKSl7bGV0IHM9cltpXSxmPXMudmFsdWVzLmxlbmd0aCx1PSEwO2ZvcihsZXQgYz0xO2M8bjsrK2Mpe2xldCBsPXRbY11bZV0uYXR0cmlidXRlc1tpXTtpZighaChsKXx8cy5jb21wb25lbnREYXRhdHlwZSE9PWwuY29tcG9uZW50RGF0YXR5cGV8fHMuY29tcG9uZW50c1BlckF0dHJpYnV0ZSE9PWwuY29tcG9uZW50c1BlckF0dHJpYnV0ZXx8cy5ub3JtYWxpemUhPT1sLm5vcm1hbGl6ZSl7dT0hMTticmVha31mKz1sLnZhbHVlcy5sZW5ndGh9dSYmKG9baV09bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpzLmNvbXBvbmVudERhdGF0eXBlLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6cy5jb21wb25lbnRzUGVyQXR0cmlidXRlLG5vcm1hbGl6ZTpzLm5vcm1hbGl6ZSx2YWx1ZXM6bnQuY3JlYXRlVHlwZWRBcnJheShzLmNvbXBvbmVudERhdGF0eXBlLGYpfSkpfXJldHVybiBvfWZ1bmN0aW9uIHFoKHQsZSl7bGV0IG49dC5sZW5ndGgsbyxyLGkscyxmPXRbMF0ubW9kZWxNYXRyaXgsdT1oKHRbMF1bZV0uaW5kaWNlcyksYz10WzBdW2VdLnByaW1pdGl2ZVR5cGU7Zm9yKHI9MTtyPG47KytyKXtpZighc3QuZXF1YWxzKHRbcl0ubW9kZWxNYXRyaXgsZikpdGhyb3cgbmV3IEYoIkFsbCBpbnN0YW5jZXMgbXVzdCBoYXZlIHRoZSBzYW1lIG1vZGVsTWF0cml4LiIpO2lmKGgodFtyXVtlXS5pbmRpY2VzKSE9PXUpdGhyb3cgbmV3IEYoIkFsbCBpbnN0YW5jZSBnZW9tZXRyaWVzIG11c3QgaGF2ZSBhbiBpbmRpY2VzIG9yIG5vdCBoYXZlIG9uZS4iKTtpZih0W3JdW2VdLnByaW1pdGl2ZVR5cGUhPT1jKXRocm93IG5ldyBGKCJBbGwgaW5zdGFuY2UgZ2VvbWV0cmllcyBtdXN0IGhhdmUgdGhlIHNhbWUgcHJpbWl0aXZlVHlwZS4iKX1sZXQgbD16Myh0LGUpLHAsZCxtO2ZvcihvIGluIGwpaWYobC5oYXNPd25Qcm9wZXJ0eShvKSlmb3IocD1sW29dLnZhbHVlcyxzPTAscj0wO3I8bjsrK3IpZm9yKGQ9dFtyXVtlXS5hdHRyaWJ1dGVzW29dLnZhbHVlcyxtPWQubGVuZ3RoLGk9MDtpPG07KytpKXBbcysrXT1kW2ldO2xldCBfO2lmKHUpe2xldCBPPTA7Zm9yKHI9MDtyPG47KytyKU8rPXRbcl1bZV0uaW5kaWNlcy5sZW5ndGg7bGV0IEU9VXQuY29tcHV0ZU51bWJlck9mVmVydGljZXMobmV3IFV0KHthdHRyaWJ1dGVzOmwscHJpbWl0aXZlVHlwZTpCdC5QT0lOVFN9KSksVD1EdC5jcmVhdGVUeXBlZEFycmF5KEUsTyksQz0wLE49MDtmb3Iocj0wO3I8bjsrK3Ipe2xldCBJPXRbcl1bZV0uaW5kaWNlcyxEPUkubGVuZ3RoO2ZvcihzPTA7czxEOysrcylUW0MrK109TitJW3NdO04rPVV0LmNvbXB1dGVOdW1iZXJPZlZlcnRpY2VzKHRbcl1bZV0pfV89VH1sZXQgZz1uZXcgYSxiPTAsdztmb3Iocj0wO3I8bjsrK3Ipe2lmKHc9dFtyXVtlXS5ib3VuZGluZ1NwaGVyZSwhaCh3KSl7Zz12b2lkIDA7YnJlYWt9YS5hZGQody5jZW50ZXIsZyxnKX1pZihoKGcpKWZvcihhLmRpdmlkZUJ5U2NhbGFyKGcsbixnKSxyPTA7cjxuOysrcil7dz10W3JdW2VdLmJvdW5kaW5nU3BoZXJlO2xldCBPPWEubWFnbml0dWRlKGEuc3VidHJhY3Qody5jZW50ZXIsZyxqMykpK3cucmFkaXVzO08+YiYmKGI9Tyl9cmV0dXJuIG5ldyBVdCh7YXR0cmlidXRlczpsLGluZGljZXM6XyxwcmltaXRpdmVUeXBlOmMsYm91bmRpbmdTcGhlcmU6aChnKT9uZXcgQXQoZyxiKTp2b2lkIDB9KX1mdW5jdGlvbiBLMyh0KXtpZihoKHQuaW5kaWNlcykpcmV0dXJuIHQ7bGV0IGU9VXQuY29tcHV0ZU51bWJlck9mVmVydGljZXModCk7aWYoZTwzKXRocm93IG5ldyBGKCJUaGUgbnVtYmVyIG9mIHZlcnRpY2VzIG11c3QgYmUgYXQgbGVhc3QgdGhyZWUuIik7aWYoZSUzIT09MCl0aHJvdyBuZXcgRigiVGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhyZWUuIik7bGV0IG49RHQuY3JlYXRlVHlwZWRBcnJheShlLGUpO2ZvcihsZXQgbz0wO288ZTsrK28pbltvXT1vO3JldHVybiB0LmluZGljZXM9bix0fWZ1bmN0aW9uIFczKHQpe2xldCBlPVV0LmNvbXB1dGVOdW1iZXJPZlZlcnRpY2VzKHQpO2lmKGU8Myl0aHJvdyBuZXcgRigiVGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBtdXN0IGJlIGF0IGxlYXN0IHRocmVlLiIpO2xldCBuPUR0LmNyZWF0ZVR5cGVkQXJyYXkoZSwoZS0yKSozKTtuWzBdPTEsblsxXT0wLG5bMl09MjtsZXQgbz0zO2ZvcihsZXQgcj0zO3I8ZTsrK3IpbltvKytdPXItMSxuW28rK109MCxuW28rK109cjtyZXR1cm4gdC5pbmRpY2VzPW4sdC5wcmltaXRpdmVUeXBlPUJ0LlRSSUFOR0xFUyx0fWZ1bmN0aW9uIFgzKHQpe2xldCBlPVV0LmNvbXB1dGVOdW1iZXJPZlZlcnRpY2VzKHQpO2lmKGU8Myl0aHJvdyBuZXcgRigiVGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBtdXN0IGJlIGF0IGxlYXN0IDMuIik7bGV0IG49RHQuY3JlYXRlVHlwZWRBcnJheShlLChlLTIpKjMpO25bMF09MCxuWzFdPTEsblsyXT0yLGU+MyYmKG5bM109MCxuWzRdPTIsbls1XT0zKTtsZXQgbz02O2ZvcihsZXQgcj0zO3I8ZS0xO3IrPTIpbltvKytdPXIsbltvKytdPXItMSxuW28rK109cisxLHIrMjxlJiYobltvKytdPXIsbltvKytdPXIrMSxuW28rK109cisyKTtyZXR1cm4gdC5pbmRpY2VzPW4sdC5wcmltaXRpdmVUeXBlPUJ0LlRSSUFOR0xFUyx0fWZ1bmN0aW9uIFkzKHQpe2lmKGgodC5pbmRpY2VzKSlyZXR1cm4gdDtsZXQgZT1VdC5jb21wdXRlTnVtYmVyT2ZWZXJ0aWNlcyh0KTtpZihlPDIpdGhyb3cgbmV3IEYoIlRoZSBudW1iZXIgb2YgdmVydGljZXMgbXVzdCBiZSBhdCBsZWFzdCB0d28uIik7aWYoZSUyIT09MCl0aHJvdyBuZXcgRigiVGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMi4iKTtsZXQgbj1EdC5jcmVhdGVUeXBlZEFycmF5KGUsZSk7Zm9yKGxldCBvPTA7bzxlOysrbyluW29dPW87cmV0dXJuIHQuaW5kaWNlcz1uLHR9ZnVuY3Rpb24gJDModCl7bGV0IGU9VXQuY29tcHV0ZU51bWJlck9mVmVydGljZXModCk7aWYoZTwyKXRocm93IG5ldyBGKCJUaGUgbnVtYmVyIG9mIHZlcnRpY2VzIG11c3QgYmUgYXQgbGVhc3QgdHdvLiIpO2xldCBuPUR0LmNyZWF0ZVR5cGVkQXJyYXkoZSwoZS0xKSoyKTtuWzBdPTAsblsxXT0xO2xldCBvPTI7Zm9yKGxldCByPTI7cjxlOysrciluW28rK109ci0xLG5bbysrXT1yO3JldHVybiB0LmluZGljZXM9bix0LnByaW1pdGl2ZVR5cGU9QnQuTElORVMsdH1mdW5jdGlvbiBaMyh0KXtsZXQgZT1VdC5jb21wdXRlTnVtYmVyT2ZWZXJ0aWNlcyh0KTtpZihlPDIpdGhyb3cgbmV3IEYoIlRoZSBudW1iZXIgb2YgdmVydGljZXMgbXVzdCBiZSBhdCBsZWFzdCB0d28uIik7bGV0IG49RHQuY3JlYXRlVHlwZWRBcnJheShlLGUqMik7blswXT0wLG5bMV09MTtsZXQgbz0yO2ZvcihsZXQgcj0yO3I8ZTsrK3IpbltvKytdPXItMSxuW28rK109cjtyZXR1cm4gbltvKytdPWUtMSxuW29dPTAsdC5pbmRpY2VzPW4sdC5wcmltaXRpdmVUeXBlPUJ0LkxJTkVTLHR9ZnVuY3Rpb24gUTModCl7c3dpdGNoKHQucHJpbWl0aXZlVHlwZSl7Y2FzZSBCdC5UUklBTkdMRV9GQU46cmV0dXJuIFczKHQpO2Nhc2UgQnQuVFJJQU5HTEVfU1RSSVA6cmV0dXJuIFgzKHQpO2Nhc2UgQnQuVFJJQU5HTEVTOnJldHVybiBLMyh0KTtjYXNlIEJ0LkxJTkVfU1RSSVA6cmV0dXJuICQzKHQpO2Nhc2UgQnQuTElORV9MT09QOnJldHVybiBaMyh0KTtjYXNlIEJ0LkxJTkVTOnJldHVybiBZMyh0KX1yZXR1cm4gdH1mdW5jdGlvbiB1cyh0LGUpe01hdGguYWJzKHQueSk8TS5FUFNJTE9ONiYmKGU/dC55PS1NLkVQU0lMT042OnQueT1NLkVQU0lMT042KX1mdW5jdGlvbiBKMyh0LGUsbil7aWYodC55IT09MCYmZS55IT09MCYmbi55IT09MCl7dXModCx0Lnk8MCksdXMoZSxlLnk8MCksdXMobixuLnk8MCk7cmV0dXJufWxldCBvPU1hdGguYWJzKHQueSkscj1NYXRoLmFicyhlLnkpLGk9TWF0aC5hYnMobi55KSxzO28+cj9vPmk/cz1NLnNpZ24odC55KTpzPU0uc2lnbihuLnkpOnI+aT9zPU0uc2lnbihlLnkpOnM9TS5zaWduKG4ueSk7bGV0IGY9czwwO3VzKHQsZiksdXMoZSxmKSx1cyhuLGYpfWZ1bmN0aW9uIGJyKHQsZSxuLG8pe2EuYWRkKHQsYS5tdWx0aXBseUJ5U2NhbGFyKGEuc3VidHJhY3QoZSx0LGpiKSx0LnkvKHQueS1lLnkpLGpiKSxuKSxhLmNsb25lKG4sbyksdXMobiwhMCksdXMobywhMSl9ZnVuY3Rpb24gdE0odCxlLG4pe2lmKHQueD49MHx8ZS54Pj0wfHxuLng+PTApcmV0dXJuO0ozKHQsZSxuKTtsZXQgbz10Lnk8MCxyPWUueTwwLGk9bi55PDAscz0wO3MrPW8/MTowLHMrPXI/MTowLHMrPWk/MTowO2xldCBmPUtoLmluZGljZXM7cz09PTE/KGZbMV09MyxmWzJdPTQsZls1XT02LGZbN109NixmWzhdPTUsbz8oYnIodCxlLGVjLG9jKSxicih0LG4sbmMscmMpLGZbMF09MCxmWzNdPTEsZls0XT0yLGZbNl09MSk6cj8oYnIoZSxuLGVjLG9jKSxicihlLHQsbmMscmMpLGZbMF09MSxmWzNdPTIsZls0XT0wLGZbNl09Mik6aSYmKGJyKG4sdCxlYyxvYyksYnIobixlLG5jLHJjKSxmWzBdPTIsZlszXT0wLGZbNF09MSxmWzZdPTApKTpzPT09MiYmKGZbMl09NCxmWzRdPTQsZls1XT0zLGZbN109NSxmWzhdPTYsbz9yP2l8fChicihuLHQsZWMsb2MpLGJyKG4sZSxuYyxyYyksZlswXT0wLGZbMV09MSxmWzNdPTAsZls2XT0yKTooYnIoZSxuLGVjLG9jKSxicihlLHQsbmMscmMpLGZbMF09MixmWzFdPTAsZlszXT0yLGZbNl09MSk6KGJyKHQsZSxlYyxvYyksYnIodCxuLG5jLHJjKSxmWzBdPTEsZlsxXT0yLGZbM109MSxmWzZdPTApKTtsZXQgdT1LaC5wb3NpdGlvbnM7cmV0dXJuIHVbMF09dCx1WzFdPWUsdVsyXT1uLHUubGVuZ3RoPTMsKHM9PT0xfHxzPT09MikmJih1WzNdPWVjLHVbNF09bmMsdVs1XT1vYyx1WzZdPXJjLHUubGVuZ3RoPTcpLEtofWZ1bmN0aW9uIEhiKHQsZSl7bGV0IG49dC5hdHRyaWJ1dGVzO2lmKG4ucG9zaXRpb24udmFsdWVzLmxlbmd0aD09PTApcmV0dXJuO2ZvcihsZXQgciBpbiBuKWlmKG4uaGFzT3duUHJvcGVydHkocikmJmgobltyXSkmJmgobltyXS52YWx1ZXMpKXtsZXQgaT1uW3JdO2kudmFsdWVzPW50LmNyZWF0ZVR5cGVkQXJyYXkoaS5jb21wb25lbnREYXRhdHlwZSxpLnZhbHVlcyl9bGV0IG89VXQuY29tcHV0ZU51bWJlck9mVmVydGljZXModCk7cmV0dXJuIHQuaW5kaWNlcz1EdC5jcmVhdGVUeXBlZEFycmF5KG8sdC5pbmRpY2VzKSxlJiYodC5ib3VuZGluZ1NwaGVyZT1BdC5mcm9tVmVydGljZXMobi5wb3NpdGlvbi52YWx1ZXMpKSx0fWZ1bmN0aW9uIGlhKHQpe2xldCBlPXQuYXR0cmlidXRlcyxuPXt9O2ZvcihsZXQgbyBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkobykmJmgoZVtvXSkmJmgoZVtvXS52YWx1ZXMpKXtsZXQgcj1lW29dO25bb109bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpyLmNvbXBvbmVudERhdGF0eXBlLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6ci5jb21wb25lbnRzUGVyQXR0cmlidXRlLG5vcm1hbGl6ZTpyLm5vcm1hbGl6ZSx2YWx1ZXM6W119KX1yZXR1cm4gbmV3IFV0KHthdHRyaWJ1dGVzOm4saW5kaWNlczpbXSxwcmltaXRpdmVUeXBlOnQucHJpbWl0aXZlVHlwZX0pfWZ1bmN0aW9uICRoKHQsZSxuKXtsZXQgbz1oKHQuZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUpO2U9SGIoZSxvKSxuPUhiKG4sbyksaChuKSYmIWgoZSk/dC5nZW9tZXRyeT1uOiFoKG4pJiZoKGUpP3QuZ2VvbWV0cnk9ZToodC53ZXN0SGVtaXNwaGVyZUdlb21ldHJ5PWUsdC5lYXN0SGVtaXNwaGVyZUdlb21ldHJ5PW4sdC5nZW9tZXRyeT12b2lkIDApfWZ1bmN0aW9uIFpoKHQsZSl7bGV0IG49bmV3IHQsbz1uZXcgdCxyPW5ldyB0O3JldHVybiBmdW5jdGlvbihpLHMsZix1LGMsbCxwLGQpe2xldCBtPXQuZnJvbUFycmF5KGMsaSplLG4pLF89dC5mcm9tQXJyYXkoYyxzKmUsbyksZz10LmZyb21BcnJheShjLGYqZSxyKTt0Lm11bHRpcGx5QnlTY2FsYXIobSx1LngsbSksdC5tdWx0aXBseUJ5U2NhbGFyKF8sdS55LF8pLHQubXVsdGlwbHlCeVNjYWxhcihnLHUueixnKTtsZXQgYj10LmFkZChtLF8sbSk7dC5hZGQoYixnLGIpLGQmJnQubm9ybWFsaXplKGIsYiksdC5wYWNrKGIsbCxwKmUpfX1mdW5jdGlvbiBWcCh0LGUsbixvLHIsaSxzLGYsdSxjLGwscCxkLG0sXyxnKXtpZighaChpKSYmIWgocykmJiFoKGYpJiYhaCh1KSYmIWgoYykmJm09PT0wKXJldHVybjtsZXQgYj1hLmZyb21BcnJheShyLHQqMyxFZiksdz1hLmZyb21BcnJheShyLGUqMyxXaCksTz1hLmZyb21BcnJheShyLG4qMyxYaCksRT13YihvLGIsdyxPLG9NKTtpZihoKEUpKXtpZihoKGkpJiZHcCh0LGUsbixFLGkscC5ub3JtYWwudmFsdWVzLGcsITApLGgoYykpe2xldCBUPWEuZnJvbUFycmF5KGMsdCozLEVmKSxDPWEuZnJvbUFycmF5KGMsZSozLFdoKSxOPWEuZnJvbUFycmF5KGMsbiozLFhoKTthLm11bHRpcGx5QnlTY2FsYXIoVCxFLngsVCksYS5tdWx0aXBseUJ5U2NhbGFyKEMsRS55LEMpLGEubXVsdGlwbHlCeVNjYWxhcihOLEUueixOKTtsZXQgSTshYS5lcXVhbHMoVCxhLlpFUk8pfHwhYS5lcXVhbHMoQyxhLlpFUk8pfHwhYS5lcXVhbHMoTixhLlpFUk8pPyhJPWEuYWRkKFQsQyxUKSxhLmFkZChJLE4sSSksYS5ub3JtYWxpemUoSSxJKSk6KEk9RWYsSS54PTAsSS55PTAsSS56PTApLGEucGFjayhJLHAuZXh0cnVkZURpcmVjdGlvbi52YWx1ZXMsZyozKX1pZihoKGwpJiZuTSh0LGUsbixFLGwscC5hcHBseU9mZnNldC52YWx1ZXMsZyksaChzKSYmR3AodCxlLG4sRSxzLHAudGFuZ2VudC52YWx1ZXMsZywhMCksaChmKSYmR3AodCxlLG4sRSxmLHAuYml0YW5nZW50LnZhbHVlcyxnLCEwKSxoKHUpJiYkYih0LGUsbixFLHUscC5zdC52YWx1ZXMsZyksbT4wKWZvcihsZXQgVD0wO1Q8bTtUKyspe2xldCBDPWRbVF07ck0odCxlLG4sRSxnLF9bQ10scFtDXSl9fX1mdW5jdGlvbiByTSh0LGUsbixvLHIsaSxzKXtsZXQgZj1pLmNvbXBvbmVudHNQZXJBdHRyaWJ1dGUsdT1pLnZhbHVlcyxjPXMudmFsdWVzO3N3aXRjaChmKXtjYXNlIDQ6ZU0odCxlLG4sbyx1LGMsciwhMSk7YnJlYWs7Y2FzZSAzOkdwKHQsZSxuLG8sdSxjLHIsITEpO2JyZWFrO2Nhc2UgMjokYih0LGUsbixvLHUsYyxyLCExKTticmVhaztkZWZhdWx0OmNbcl09dVt0XSpvLngrdVtlXSpvLnkrdVtuXSpvLnp9fWZ1bmN0aW9uIGlpKHQsZSxuLG8scixpKXtsZXQgcz10LnBvc2l0aW9uLnZhbHVlcy5sZW5ndGgvMztpZihyIT09LTEpe2xldCBmPW9bcl0sdT1uW2ZdO3JldHVybiB1PT09LTE/KG5bZl09cyx0LnBvc2l0aW9uLnZhbHVlcy5wdXNoKGkueCxpLnksaS56KSxlLnB1c2gocykscyk6KGUucHVzaCh1KSx1KX1yZXR1cm4gdC5wb3NpdGlvbi52YWx1ZXMucHVzaChpLngsaS55LGkueiksZS5wdXNoKHMpLHN9ZnVuY3Rpb24gcWIodCl7bGV0IGU9dC5nZW9tZXRyeSxuPWUuYXR0cmlidXRlcyxvPW4ucG9zaXRpb24udmFsdWVzLHI9aChuLm5vcm1hbCk/bi5ub3JtYWwudmFsdWVzOnZvaWQgMCxpPWgobi5iaXRhbmdlbnQpP24uYml0YW5nZW50LnZhbHVlczp2b2lkIDAscz1oKG4udGFuZ2VudCk/bi50YW5nZW50LnZhbHVlczp2b2lkIDAsZj1oKG4uc3QpP24uc3QudmFsdWVzOnZvaWQgMCx1PWgobi5leHRydWRlRGlyZWN0aW9uKT9uLmV4dHJ1ZGVEaXJlY3Rpb24udmFsdWVzOnZvaWQgMCxjPWgobi5hcHBseU9mZnNldCk/bi5hcHBseU9mZnNldC52YWx1ZXM6dm9pZCAwLGw9ZS5pbmRpY2VzLHA9W107Zm9yKGxldCBJIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShJKSYmIWlNW0ldJiZoKG5bSV0pJiZwLnB1c2goSSk7bGV0IGQ9cC5sZW5ndGgsbT1pYShlKSxfPWlhKGUpLGcsYix3LE8sRSxUPVtdO1QubGVuZ3RoPW8ubGVuZ3RoLzM7bGV0IEM9W107Zm9yKEMubGVuZ3RoPW8ubGVuZ3RoLzMsRT0wO0U8VC5sZW5ndGg7KytFKVRbRV09LTEsQ1tFXT0tMTtsZXQgTj1sLmxlbmd0aDtmb3IoRT0wO0U8TjtFKz0zKXtsZXQgST1sW0VdLEQ9bFtFKzFdLHY9bFtFKzJdLEw9YS5mcm9tQXJyYXkobyxJKjMpLFU9YS5mcm9tQXJyYXkobyxEKjMpLEE9YS5mcm9tQXJyYXkobyx2KjMpLFM9dE0oTCxVLEEpO2lmKGgoUykmJlMucG9zaXRpb25zLmxlbmd0aD4zKXtsZXQgUD1TLnBvc2l0aW9ucyxCPVMuaW5kaWNlcyxqPUIubGVuZ3RoO2ZvcihsZXQgSD0wO0g8ajsrK0gpe2xldCBrPUJbSF0sSz1QW2tdO0sueTwwPyhnPV8uYXR0cmlidXRlcyxiPV8uaW5kaWNlcyx3PVQpOihnPW0uYXR0cmlidXRlcyxiPW0uaW5kaWNlcyx3PUMpLE89aWkoZyxiLHcsbCxrPDM/RStrOi0xLEspLFZwKEksRCx2LEssbyxyLHMsaSxmLHUsYyxnLHAsZCxuLE8pfX1lbHNlIGgoUykmJihMPVMucG9zaXRpb25zWzBdLFU9Uy5wb3NpdGlvbnNbMV0sQT1TLnBvc2l0aW9uc1syXSksTC55PDA/KGc9Xy5hdHRyaWJ1dGVzLGI9Xy5pbmRpY2VzLHc9VCk6KGc9bS5hdHRyaWJ1dGVzLGI9bS5pbmRpY2VzLHc9QyksTz1paShnLGIsdyxsLEUsTCksVnAoSSxELHYsTCxvLHIscyxpLGYsdSxjLGcscCxkLG4sTyksTz1paShnLGIsdyxsLEUrMSxVKSxWcChJLEQsdixVLG8scixzLGksZix1LGMsZyxwLGQsbixPKSxPPWlpKGcsYix3LGwsRSsyLEEpLFZwKEksRCx2LEEsbyxyLHMsaSxmLHUsYyxnLHAsZCxuLE8pfSRoKHQsXyxtKX1mdW5jdGlvbiByYSh0LGUsbixvLHIsaSxzKXtpZighaChzKSlyZXR1cm47bGV0IGY9YS5mcm9tQXJyYXkobyx0KjMsRWYpO2EuZXF1YWxzRXBzaWxvbihmLG4sTS5FUFNJTE9OMTApP2kuYXBwbHlPZmZzZXQudmFsdWVzW3JdPXNbdF06aS5hcHBseU9mZnNldC52YWx1ZXNbcl09c1tlXX1mdW5jdGlvbiBLYih0KXtsZXQgZT10Lmdlb21ldHJ5LG49ZS5hdHRyaWJ1dGVzLG89bi5wb3NpdGlvbi52YWx1ZXMscj1oKG4uYXBwbHlPZmZzZXQpP24uYXBwbHlPZmZzZXQudmFsdWVzOnZvaWQgMCxpPWUuaW5kaWNlcyxzPWlhKGUpLGY9aWEoZSksdSxjPWkubGVuZ3RoLGw9W107bC5sZW5ndGg9by5sZW5ndGgvMztsZXQgcD1bXTtmb3IocC5sZW5ndGg9by5sZW5ndGgvMyx1PTA7dTxsLmxlbmd0aDsrK3UpbFt1XT0tMSxwW3VdPS0xO2Zvcih1PTA7dTxjO3UrPTIpe2xldCBkPWlbdV0sbT1pW3UrMV0sXz1hLmZyb21BcnJheShvLGQqMyxFZiksZz1hLmZyb21BcnJheShvLG0qMyxXaCksYjtNYXRoLmFicyhfLnkpPE0uRVBTSUxPTjYmJihfLnk8MD9fLnk9LU0uRVBTSUxPTjY6Xy55PU0uRVBTSUxPTjYpLE1hdGguYWJzKGcueSk8TS5FUFNJTE9ONiYmKGcueTwwP2cueT0tTS5FUFNJTE9ONjpnLnk9TS5FUFNJTE9ONik7bGV0IHc9cy5hdHRyaWJ1dGVzLE89cy5pbmRpY2VzLEU9cCxUPWYuYXR0cmlidXRlcyxDPWYuaW5kaWNlcyxOPWwsST1oby5saW5lU2VnbWVudFBsYW5lKF8sZyxaYixYaCk7aWYoaChJKSl7bGV0IEQ9YS5tdWx0aXBseUJ5U2NhbGFyKGEuVU5JVF9ZLDUqTS5FUFNJTE9OOSxzTSk7Xy55PDAmJihhLm5lZ2F0ZShELEQpLHc9Zi5hdHRyaWJ1dGVzLE89Zi5pbmRpY2VzLEU9bCxUPXMuYXR0cmlidXRlcyxDPXMuaW5kaWNlcyxOPXApO2xldCB2PWEuYWRkKEksRCxjTSk7Yj1paSh3LE8sRSxpLHUsXykscmEoZCxtLF8sbyxiLHcsciksYj1paSh3LE8sRSxpLC0xLHYpLHJhKGQsbSx2LG8sYix3LHIpLGEubmVnYXRlKEQsRCksYS5hZGQoSSxELHYpLGI9aWkoVCxDLE4saSwtMSx2KSxyYShkLG0sdixvLGIsVCxyKSxiPWlpKFQsQyxOLGksdSsxLGcpLHJhKGQsbSxnLG8sYixULHIpfWVsc2V7bGV0IEQsdixMO18ueTwwPyhEPWYuYXR0cmlidXRlcyx2PWYuaW5kaWNlcyxMPWwpOihEPXMuYXR0cmlidXRlcyx2PXMuaW5kaWNlcyxMPXApLGI9aWkoRCx2LEwsaSx1LF8pLHJhKGQsbSxfLG8sYixELHIpLGI9aWkoRCx2LEwsaSx1KzEsZykscmEoZCxtLGcsbyxiLEQscil9fSRoKHQsZixzKX1mdW5jdGlvbiBZYih0KXtsZXQgZT10LmF0dHJpYnV0ZXMsbj1lLnBvc2l0aW9uLnZhbHVlcyxvPWUucHJldlBvc2l0aW9uLnZhbHVlcyxyPWUubmV4dFBvc2l0aW9uLnZhbHVlcyxpPW4ubGVuZ3RoO2ZvcihsZXQgcz0wO3M8aTtzKz0zKXtsZXQgZj1hLnVucGFjayhuLHMsUWIpO2lmKGYueD4wKWNvbnRpbnVlO2xldCB1PWEudW5wYWNrKG8scyxKYik7KGYueTwwJiZ1Lnk+MHx8Zi55PjAmJnUueTwwKSYmKHMtMz4wPyhvW3NdPW5bcy0zXSxvW3MrMV09bltzLTJdLG9bcysyXT1uW3MtMV0pOmEucGFjayhmLG8scykpO2xldCBjPWEudW5wYWNrKHIscyxZaCk7KGYueTwwJiZjLnk+MHx8Zi55PjAmJmMueTwwKSYmKHMrMzxpPyhyW3NdPW5bcyszXSxyW3MrMV09bltzKzRdLHJbcysyXT1uW3MrNV0pOmEucGFjayhmLHIscykpfX1mdW5jdGlvbiBkTSh0KXtsZXQgZT10Lmdlb21ldHJ5LG49ZS5hdHRyaWJ1dGVzLG89bi5wb3NpdGlvbi52YWx1ZXMscj1uLnByZXZQb3NpdGlvbi52YWx1ZXMsaT1uLm5leHRQb3NpdGlvbi52YWx1ZXMscz1uLmV4cGFuZEFuZFdpZHRoLnZhbHVlcyxmPWgobi5zdCk/bi5zdC52YWx1ZXM6dm9pZCAwLHU9aChuLmNvbG9yKT9uLmNvbG9yLnZhbHVlczp2b2lkIDAsYz1pYShlKSxsPWlhKGUpLHAsZCxtLF89ITEsZz1vLmxlbmd0aC8zO2ZvcihwPTA7cDxnO3ArPTQpe2xldCBiPXAsdz1wKzIsTz1hLmZyb21BcnJheShvLGIqMyxRYiksRT1hLmZyb21BcnJheShvLHcqMyxKYik7aWYoTWF0aC5hYnMoTy55KTxrcClmb3IoTy55PWtwKihFLnk8MD8tMToxKSxvW3AqMysxXT1PLnksb1socCsxKSozKzFdPU8ueSxkPWIqMztkPGIqMys0KjM7ZCs9MylyW2RdPW9bcCozXSxyW2QrMV09b1twKjMrMV0scltkKzJdPW9bcCozKzJdO2lmKE1hdGguYWJzKEUueSk8a3ApZm9yKEUueT1rcCooTy55PDA/LTE6MSksb1socCsyKSozKzFdPUUueSxvWyhwKzMpKjMrMV09RS55LGQ9YiozO2Q8YiozKzQqMztkKz0zKWlbZF09b1socCsyKSozXSxpW2QrMV09b1socCsyKSozKzFdLGlbZCsyXT1vWyhwKzIpKjMrMl07bGV0IFQ9Yy5hdHRyaWJ1dGVzLEM9Yy5pbmRpY2VzLE49bC5hdHRyaWJ1dGVzLEk9bC5pbmRpY2VzLEQ9aG8ubGluZVNlZ21lbnRQbGFuZShPLEUsWmIsZk0pO2lmKGgoRCkpe189ITA7bGV0IHY9YS5tdWx0aXBseUJ5U2NhbGFyKGEuVU5JVF9ZLHBNLHVNKTtPLnk8MCYmKGEubmVnYXRlKHYsdiksVD1sLmF0dHJpYnV0ZXMsQz1sLmluZGljZXMsTj1jLmF0dHJpYnV0ZXMsST1jLmluZGljZXMpO2xldCBMPWEuYWRkKEQsdixsTSk7VC5wb3NpdGlvbi52YWx1ZXMucHVzaChPLngsTy55LE8ueixPLngsTy55LE8ueiksVC5wb3NpdGlvbi52YWx1ZXMucHVzaChMLngsTC55LEwueiksVC5wb3NpdGlvbi52YWx1ZXMucHVzaChMLngsTC55LEwueiksVC5wcmV2UG9zaXRpb24udmFsdWVzLnB1c2gocltiKjNdLHJbYiozKzFdLHJbYiozKzJdKSxULnByZXZQb3NpdGlvbi52YWx1ZXMucHVzaChyW2IqMyszXSxyW2IqMys0XSxyW2IqMys1XSksVC5wcmV2UG9zaXRpb24udmFsdWVzLnB1c2goTy54LE8ueSxPLnosTy54LE8ueSxPLnopLFQubmV4dFBvc2l0aW9uLnZhbHVlcy5wdXNoKEwueCxMLnksTC56KSxULm5leHRQb3NpdGlvbi52YWx1ZXMucHVzaChMLngsTC55LEwueiksVC5uZXh0UG9zaXRpb24udmFsdWVzLnB1c2goTC54LEwueSxMLnopLFQubmV4dFBvc2l0aW9uLnZhbHVlcy5wdXNoKEwueCxMLnksTC56KSxhLm5lZ2F0ZSh2LHYpLGEuYWRkKEQsdixMKSxOLnBvc2l0aW9uLnZhbHVlcy5wdXNoKEwueCxMLnksTC56KSxOLnBvc2l0aW9uLnZhbHVlcy5wdXNoKEwueCxMLnksTC56KSxOLnBvc2l0aW9uLnZhbHVlcy5wdXNoKEUueCxFLnksRS56LEUueCxFLnksRS56KSxOLnByZXZQb3NpdGlvbi52YWx1ZXMucHVzaChMLngsTC55LEwueiksTi5wcmV2UG9zaXRpb24udmFsdWVzLnB1c2goTC54LEwueSxMLnopLE4ucHJldlBvc2l0aW9uLnZhbHVlcy5wdXNoKEwueCxMLnksTC56KSxOLnByZXZQb3NpdGlvbi52YWx1ZXMucHVzaChMLngsTC55LEwueiksTi5uZXh0UG9zaXRpb24udmFsdWVzLnB1c2goRS54LEUueSxFLnosRS54LEUueSxFLnopLE4ubmV4dFBvc2l0aW9uLnZhbHVlcy5wdXNoKGlbdyozXSxpW3cqMysxXSxpW3cqMysyXSksTi5uZXh0UG9zaXRpb24udmFsdWVzLnB1c2goaVt3KjMrM10saVt3KjMrNF0saVt3KjMrNV0pO2xldCBVPXR0LmZyb21BcnJheShzLGIqMixXYiksQT1NYXRoLmFicyhVLnkpO1QuZXhwYW5kQW5kV2lkdGgudmFsdWVzLnB1c2goLTEsQSwxLEEpLFQuZXhwYW5kQW5kV2lkdGgudmFsdWVzLnB1c2goLTEsLUEsMSwtQSksTi5leHBhbmRBbmRXaWR0aC52YWx1ZXMucHVzaCgtMSxBLDEsQSksTi5leHBhbmRBbmRXaWR0aC52YWx1ZXMucHVzaCgtMSwtQSwxLC1BKTtsZXQgUz1hLm1hZ25pdHVkZVNxdWFyZWQoYS5zdWJ0cmFjdChELE8sWWgpKTtpZihTLz1hLm1hZ25pdHVkZVNxdWFyZWQoYS5zdWJ0cmFjdChFLE8sWWgpKSxoKHUpKXtsZXQgUD1oZS5mcm9tQXJyYXkodSxiKjQsWGIpLEI9aGUuZnJvbUFycmF5KHUsdyo0LFhiKSxqPU0ubGVycChQLngsQi54LFMpLEg9TS5sZXJwKFAueSxCLnksUyksaz1NLmxlcnAoUC56LEIueixTKSxLPU0ubGVycChQLncsQi53LFMpO2ZvcihkPWIqNDtkPGIqNCsyKjQ7KytkKVQuY29sb3IudmFsdWVzLnB1c2godVtkXSk7Zm9yKFQuY29sb3IudmFsdWVzLnB1c2goaixILGssSyksVC5jb2xvci52YWx1ZXMucHVzaChqLEgsayxLKSxOLmNvbG9yLnZhbHVlcy5wdXNoKGosSCxrLEspLE4uY29sb3IudmFsdWVzLnB1c2goaixILGssSyksZD13KjQ7ZDx3KjQrMio0OysrZClOLmNvbG9yLnZhbHVlcy5wdXNoKHVbZF0pfWlmKGgoZikpe2xldCBQPXR0LmZyb21BcnJheShmLGIqMixXYiksQj10dC5mcm9tQXJyYXkoZiwocCszKSoyLGFNKSxqPU0ubGVycChQLngsQi54LFMpO2ZvcihkPWIqMjtkPGIqMisyKjI7KytkKVQuc3QudmFsdWVzLnB1c2goZltkXSk7Zm9yKFQuc3QudmFsdWVzLnB1c2goaixQLnkpLFQuc3QudmFsdWVzLnB1c2goaixCLnkpLE4uc3QudmFsdWVzLnB1c2goaixQLnkpLE4uc3QudmFsdWVzLnB1c2goaixCLnkpLGQ9dyoyO2Q8dyoyKzIqMjsrK2QpTi5zdC52YWx1ZXMucHVzaChmW2RdKX1tPVQucG9zaXRpb24udmFsdWVzLmxlbmd0aC8zLTQsQy5wdXNoKG0sbSsyLG0rMSksQy5wdXNoKG0rMSxtKzIsbSszKSxtPU4ucG9zaXRpb24udmFsdWVzLmxlbmd0aC8zLTQsSS5wdXNoKG0sbSsyLG0rMSksSS5wdXNoKG0rMSxtKzIsbSszKX1lbHNle2xldCB2LEw7Zm9yKE8ueTwwPyh2PWwuYXR0cmlidXRlcyxMPWwuaW5kaWNlcyk6KHY9Yy5hdHRyaWJ1dGVzLEw9Yy5pbmRpY2VzKSx2LnBvc2l0aW9uLnZhbHVlcy5wdXNoKE8ueCxPLnksTy56KSx2LnBvc2l0aW9uLnZhbHVlcy5wdXNoKE8ueCxPLnksTy56KSx2LnBvc2l0aW9uLnZhbHVlcy5wdXNoKEUueCxFLnksRS56KSx2LnBvc2l0aW9uLnZhbHVlcy5wdXNoKEUueCxFLnksRS56KSxkPXAqMztkPHAqMys0KjM7KytkKXYucHJldlBvc2l0aW9uLnZhbHVlcy5wdXNoKHJbZF0pLHYubmV4dFBvc2l0aW9uLnZhbHVlcy5wdXNoKGlbZF0pO2ZvcihkPXAqMjtkPHAqMis0KjI7KytkKXYuZXhwYW5kQW5kV2lkdGgudmFsdWVzLnB1c2goc1tkXSksaChmKSYmdi5zdC52YWx1ZXMucHVzaChmW2RdKTtpZihoKHUpKWZvcihkPXAqNDtkPHAqNCs0KjQ7KytkKXYuY29sb3IudmFsdWVzLnB1c2godVtkXSk7bT12LnBvc2l0aW9uLnZhbHVlcy5sZW5ndGgvMy00LEwucHVzaChtLG0rMixtKzEpLEwucHVzaChtKzEsbSsyLG0rMyl9fV8mJihZYihsKSxZYihjKSksJGgodCxsLGMpfXZhciB2byxWYixHMyx6aCxWcixGcCxCcCxqMyxBcixUZixuYSxvYSxIMyxrYixxMyxPZixVcixHYix6YixVcCxqYixlYyxuYyxvYyxyYyxLaCxlTSxHcCwkYixuTSxFZixXaCxYaCxvTSxpTSxaYixzTSxjTSxXYixhTSxRYixKYixZaCxmTSx1TSxsTSxYYixwTSxrcCxWZSxzaT1aKCgpPT57YXMoKTtUYigpO01lKCk7RmUoKTtGdCgpO2hyKCk7UGUoKTtMZSgpO0l0KCk7ZnQoKTtIdCgpO0RoKCk7U2koKTtYZSgpO1llKCk7UHAoKTskZSgpO2tzKCk7dGMoKTtXdCgpO0ZuKCk7Qm4oKTtmcygpO3RuKCk7QmIoKTt2bz17fTt2by50b1dpcmVmcmFtZT1mdW5jdGlvbih0KXtpZighaCh0KSl0aHJvdyBuZXcgRigiZ2VvbWV0cnkgaXMgcmVxdWlyZWQuIik7bGV0IGU9dC5pbmRpY2VzO2lmKGgoZSkpe3N3aXRjaCh0LnByaW1pdGl2ZVR5cGUpe2Nhc2UgQnQuVFJJQU5HTEVTOnQuaW5kaWNlcz1CMyhlKTticmVhaztjYXNlIEJ0LlRSSUFOR0xFX1NUUklQOnQuaW5kaWNlcz1VMyhlKTticmVhaztjYXNlIEJ0LlRSSUFOR0xFX0ZBTjp0LmluZGljZXM9VjMoZSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRigiZ2VvbWV0cnkucHJpbWl0aXZlVHlwZSBtdXN0IGJlIFRSSUFOR0xFUywgVFJJQU5HTEVfU1RSSVAsIG9yIFRSSUFOR0xFX0ZBTi4iKX10LnByaW1pdGl2ZVR5cGU9QnQuTElORVN9cmV0dXJuIHR9O3ZvLmNyZWF0ZUxpbmVTZWdtZW50c0ZvclZlY3RvcnM9ZnVuY3Rpb24odCxlLG4pe2lmKGU9eChlLCJub3JtYWwiKSwhaCh0KSl0aHJvdyBuZXcgRigiZ2VvbWV0cnkgaXMgcmVxdWlyZWQuIik7aWYoIWgodC5hdHRyaWJ1dGVzLnBvc2l0aW9uKSl0aHJvdyBuZXcgRigiZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbiBpcyByZXF1aXJlZC4iKTtpZighaCh0LmF0dHJpYnV0ZXNbZV0pKXRocm93IG5ldyBGKGBnZW9tZXRyeS5hdHRyaWJ1dGVzIG11c3QgaGF2ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBhdHRyaWJ1dGVOYW1lIHBhcmFtZXRlciwgJHtlfS5gKTtuPXgobiwxZTQpO2xldCBvPXQuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMscj10LmF0dHJpYnV0ZXNbZV0udmFsdWVzLGk9by5sZW5ndGgscz1uZXcgRmxvYXQ2NEFycmF5KDIqaSksZj0wO2ZvcihsZXQgbD0wO2w8aTtsKz0zKXNbZisrXT1vW2xdLHNbZisrXT1vW2wrMV0sc1tmKytdPW9bbCsyXSxzW2YrK109b1tsXStyW2xdKm4sc1tmKytdPW9bbCsxXStyW2wrMV0qbixzW2YrK109b1tsKzJdK3JbbCsyXSpuO2xldCB1LGM9dC5ib3VuZGluZ1NwaGVyZTtyZXR1cm4gaChjKSYmKHU9bmV3IEF0KGMuY2VudGVyLGMucmFkaXVzK24pKSxuZXcgVXQoe2F0dHJpYnV0ZXM6e3Bvc2l0aW9uOm5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6c30pfSxwcmltaXRpdmVUeXBlOkJ0LkxJTkVTLGJvdW5kaW5nU3BoZXJlOnV9KX07dm8uY3JlYXRlQXR0cmlidXRlTG9jYXRpb25zPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBGKCJnZW9tZXRyeSBpcyByZXF1aXJlZC4iKTtsZXQgZT1bInBvc2l0aW9uIiwicG9zaXRpb25IaWdoIiwicG9zaXRpb25Mb3ciLCJwb3NpdGlvbjNESGlnaCIsInBvc2l0aW9uM0RMb3ciLCJwb3NpdGlvbjJESGlnaCIsInBvc2l0aW9uMkRMb3ciLCJwaWNrQ29sb3IiLCJub3JtYWwiLCJzdCIsInRhbmdlbnQiLCJiaXRhbmdlbnQiLCJleHRydWRlRGlyZWN0aW9uIiwiY29tcHJlc3NlZEF0dHJpYnV0ZXMiXSxuPXQuYXR0cmlidXRlcyxvPXt9LHI9MCxpLHM9ZS5sZW5ndGg7Zm9yKGk9MDtpPHM7KytpKXtsZXQgZj1lW2ldO2gobltmXSkmJihvW2ZdPXIrKyl9Zm9yKGxldCBmIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShmKSYmIWgob1tmXSkmJihvW2ZdPXIrKyk7cmV0dXJuIG99O3ZvLnJlb3JkZXJGb3JQcmVWZXJ0ZXhDYWNoZT1mdW5jdGlvbih0KXtpZighaCh0KSl0aHJvdyBuZXcgRigiZ2VvbWV0cnkgaXMgcmVxdWlyZWQuIik7bGV0IGU9VXQuY29tcHV0ZU51bWJlck9mVmVydGljZXModCksbj10LmluZGljZXM7aWYoaChuKSl7bGV0IG89bmV3IEludDMyQXJyYXkoZSk7Zm9yKGxldCBkPTA7ZDxlO2QrKylvW2RdPS0xO2xldCByPW4saT1yLmxlbmd0aCxzPUR0LmNyZWF0ZVR5cGVkQXJyYXkoZSxpKSxmPTAsdT0wLGM9MCxsO2Zvcig7ZjxpOylsPW9bcltmXV0sbCE9PS0xP3NbdV09bDoobD1yW2ZdLG9bbF09YyxzW3VdPWMsKytjKSwrK2YsKyt1O3QuaW5kaWNlcz1zO2xldCBwPXQuYXR0cmlidXRlcztmb3IobGV0IGQgaW4gcClpZihwLmhhc093blByb3BlcnR5KGQpJiZoKHBbZF0pJiZoKHBbZF0udmFsdWVzKSl7bGV0IG09cFtkXSxfPW0udmFsdWVzLGc9MCxiPW0uY29tcG9uZW50c1BlckF0dHJpYnV0ZSx3PW50LmNyZWF0ZVR5cGVkQXJyYXkobS5jb21wb25lbnREYXRhdHlwZSxjKmIpO2Zvcig7ZzxlOyl7bGV0IE89b1tnXTtpZihPIT09LTEpZm9yKGxldCBFPTA7RTxiO0UrKyl3W2IqTytFXT1fW2IqZytFXTsrK2d9bS52YWx1ZXM9d319cmV0dXJuIHR9O3ZvLnJlb3JkZXJGb3JQb3N0VmVydGV4Q2FjaGU9ZnVuY3Rpb24odCxlKXtpZighaCh0KSl0aHJvdyBuZXcgRigiZ2VvbWV0cnkgaXMgcmVxdWlyZWQuIik7bGV0IG49dC5pbmRpY2VzO2lmKHQucHJpbWl0aXZlVHlwZT09PUJ0LlRSSUFOR0xFUyYmaChuKSl7bGV0IG89bi5sZW5ndGgscj0wO2ZvcihsZXQgaT0wO2k8bztpKyspbltpXT5yJiYocj1uW2ldKTt0LmluZGljZXM9RmIudGlwc2lmeSh7aW5kaWNlczpuLG1heGltdW1JbmRleDpyLGNhY2hlU2l6ZTplfSl9cmV0dXJuIHR9O3ZvLmZpdFRvVW5zaWduZWRTaG9ydEluZGljZXM9ZnVuY3Rpb24odCl7aWYoIWgodCkpdGhyb3cgbmV3IEYoImdlb21ldHJ5IGlzIHJlcXVpcmVkLiIpO2lmKGgodC5pbmRpY2VzKSYmdC5wcmltaXRpdmVUeXBlIT09QnQuVFJJQU5HTEVTJiZ0LnByaW1pdGl2ZVR5cGUhPT1CdC5MSU5FUyYmdC5wcmltaXRpdmVUeXBlIT09QnQuUE9JTlRTKXRocm93IG5ldyBGKCJnZW9tZXRyeS5wcmltaXRpdmVUeXBlIG11c3QgZXF1YWwgdG8gUHJpbWl0aXZlVHlwZS5UUklBTkdMRVMsIFByaW1pdGl2ZVR5cGUuTElORVMsIG9yIFByaW1pdGl2ZVR5cGUuUE9JTlRTLiIpO2xldCBlPVtdLG49VXQuY29tcHV0ZU51bWJlck9mVmVydGljZXModCk7aWYoaCh0LmluZGljZXMpJiZuPj1NLlNJWFRZX0ZPVVJfS0lMT0JZVEVTKXtsZXQgbz1bXSxyPVtdLGk9MCxzPVViKHQuYXR0cmlidXRlcyksZj10LmluZGljZXMsdT1mLmxlbmd0aCxjO3QucHJpbWl0aXZlVHlwZT09PUJ0LlRSSUFOR0xFUz9jPTM6dC5wcmltaXRpdmVUeXBlPT09QnQuTElORVM/Yz0yOnQucHJpbWl0aXZlVHlwZT09PUJ0LlBPSU5UUyYmKGM9MSk7Zm9yKGxldCBsPTA7bDx1O2wrPWMpe2ZvcihsZXQgcD0wO3A8YzsrK3Ape2xldCBkPWZbbCtwXSxtPW9bZF07aChtKXx8KG09aSsrLG9bZF09bSxrMyhzLHQuYXR0cmlidXRlcyxkKSksci5wdXNoKG0pfWkrYz49TS5TSVhUWV9GT1VSX0tJTE9CWVRFUyYmKGUucHVzaChuZXcgVXQoe2F0dHJpYnV0ZXM6cyxpbmRpY2VzOnIscHJpbWl0aXZlVHlwZTp0LnByaW1pdGl2ZVR5cGUsYm91bmRpbmdTcGhlcmU6dC5ib3VuZGluZ1NwaGVyZSxib3VuZGluZ1NwaGVyZUNWOnQuYm91bmRpbmdTcGhlcmVDVn0pKSxvPVtdLHI9W10saT0wLHM9VWIodC5hdHRyaWJ1dGVzKSl9ci5sZW5ndGghPT0wJiZlLnB1c2gobmV3IFV0KHthdHRyaWJ1dGVzOnMsaW5kaWNlczpyLHByaW1pdGl2ZVR5cGU6dC5wcmltaXRpdmVUeXBlLGJvdW5kaW5nU3BoZXJlOnQuYm91bmRpbmdTcGhlcmUsYm91bmRpbmdTcGhlcmVDVjp0LmJvdW5kaW5nU3BoZXJlQ1Z9KSl9ZWxzZSBlLnB1c2godCk7cmV0dXJuIGV9O1ZiPW5ldyBhLEczPW5ldyBhdDt2by5wcm9qZWN0VG8yRD1mdW5jdGlvbih0LGUsbixvLHIpe2lmKCFoKHQpKXRocm93IG5ldyBGKCJnZW9tZXRyeSBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgRigiYXR0cmlidXRlTmFtZSBpcyByZXF1aXJlZC4iKTtpZighaChuKSl0aHJvdyBuZXcgRigiYXR0cmlidXRlTmFtZTNEIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG8pKXRocm93IG5ldyBGKCJhdHRyaWJ1dGVOYW1lMkQgaXMgcmVxdWlyZWQuIik7aWYoIWgodC5hdHRyaWJ1dGVzW2VdKSl0aHJvdyBuZXcgRihgZ2VvbWV0cnkgbXVzdCBoYXZlIGF0dHJpYnV0ZSBtYXRjaGluZyB0aGUgYXR0cmlidXRlTmFtZSBhcmd1bWVudDogJHtlfS5gKTtpZih0LmF0dHJpYnV0ZXNbZV0uY29tcG9uZW50RGF0YXR5cGUhPT1udC5ET1VCTEUpdGhyb3cgbmV3IEYoIlRoZSBhdHRyaWJ1dGUgY29tcG9uZW50RGF0YXR5cGUgbXVzdCBiZSBDb21wb25lbnREYXRhdHlwZS5ET1VCTEUuIik7bGV0IGk9dC5hdHRyaWJ1dGVzW2VdO3I9aChyKT9yOm5ldyBRbjtsZXQgcz1yLmVsbGlwc29pZCxmPWkudmFsdWVzLHU9bmV3IEZsb2F0NjRBcnJheShmLmxlbmd0aCksYz0wO2ZvcihsZXQgbD0wO2w8Zi5sZW5ndGg7bCs9Myl7bGV0IHA9YS5mcm9tQXJyYXkoZixsLFZiKSxkPXMuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMocCxHMyk7aWYoIWgoZCkpdGhyb3cgbmV3IEYoYENvdWxkIG5vdCBwcm9qZWN0IHBvaW50ICgke3AueH0sICR7cC55fSwgJHtwLnp9KSB0byAyRC5gKTtsZXQgbT1yLnByb2plY3QoZCxWYik7dVtjKytdPW0ueCx1W2MrK109bS55LHVbYysrXT1tLnp9cmV0dXJuIHQuYXR0cmlidXRlc1tuXT1pLHQuYXR0cmlidXRlc1tvXT1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkRPVUJMRSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOnV9KSxkZWxldGUgdC5hdHRyaWJ1dGVzW2VdLHR9O3poPXtoaWdoOjAsbG93OjB9O3ZvLmVuY29kZUF0dHJpYnV0ZT1mdW5jdGlvbih0LGUsbixvKXtpZighaCh0KSl0aHJvdyBuZXcgRigiZ2VvbWV0cnkgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEYoImF0dHJpYnV0ZU5hbWUgaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEYoImF0dHJpYnV0ZUhpZ2hOYW1lIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG8pKXRocm93IG5ldyBGKCJhdHRyaWJ1dGVMb3dOYW1lIGlzIHJlcXVpcmVkLiIpO2lmKCFoKHQuYXR0cmlidXRlc1tlXSkpdGhyb3cgbmV3IEYoYGdlb21ldHJ5IG11c3QgaGF2ZSBhdHRyaWJ1dGUgbWF0Y2hpbmcgdGhlIGF0dHJpYnV0ZU5hbWUgYXJndW1lbnQ6ICR7ZX0uYCk7aWYodC5hdHRyaWJ1dGVzW2VdLmNvbXBvbmVudERhdGF0eXBlIT09bnQuRE9VQkxFKXRocm93IG5ldyBGKCJUaGUgYXR0cmlidXRlIGNvbXBvbmVudERhdGF0eXBlIG11c3QgYmUgQ29tcG9uZW50RGF0YXR5cGUuRE9VQkxFLiIpO2xldCByPXQuYXR0cmlidXRlc1tlXSxpPXIudmFsdWVzLHM9aS5sZW5ndGgsZj1uZXcgRmxvYXQzMkFycmF5KHMpLHU9bmV3IEZsb2F0MzJBcnJheShzKTtmb3IobGV0IGw9MDtsPHM7KytsKVpzLmVuY29kZShpW2xdLHpoKSxmW2xdPXpoLmhpZ2gsdVtsXT16aC5sb3c7bGV0IGM9ci5jb21wb25lbnRzUGVyQXR0cmlidXRlO3JldHVybiB0LmF0dHJpYnV0ZXNbbl09bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOmMsdmFsdWVzOmZ9KSx0LmF0dHJpYnV0ZXNbb109bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOmMsdmFsdWVzOnV9KSxkZWxldGUgdC5hdHRyaWJ1dGVzW2VdLHR9O1ZyPW5ldyBhO0ZwPW5ldyBzdCxCcD1uZXcgSjt2by50cmFuc2Zvcm1Ub1dvcmxkQ29vcmRpbmF0ZXM9ZnVuY3Rpb24odCl7aWYoIWgodCkpdGhyb3cgbmV3IEYoImluc3RhbmNlIGlzIHJlcXVpcmVkLiIpO2xldCBlPXQubW9kZWxNYXRyaXg7aWYoc3QuZXF1YWxzKGUsc3QuSURFTlRJVFkpKXJldHVybiB0O2xldCBuPXQuZ2VvbWV0cnkuYXR0cmlidXRlcztqaChlLG4ucG9zaXRpb24pLGpoKGUsbi5wcmV2UG9zaXRpb24pLGpoKGUsbi5uZXh0UG9zaXRpb24pLChoKG4ubm9ybWFsKXx8aChuLnRhbmdlbnQpfHxoKG4uYml0YW5nZW50KSkmJihzdC5pbnZlcnNlKGUsRnApLHN0LnRyYW5zcG9zZShGcCxGcCksc3QuZ2V0TWF0cml4MyhGcCxCcCksSGgoQnAsbi5ub3JtYWwpLEhoKEJwLG4udGFuZ2VudCksSGgoQnAsbi5iaXRhbmdlbnQpKTtsZXQgbz10Lmdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlO3JldHVybiBoKG8pJiYodC5nZW9tZXRyeS5ib3VuZGluZ1NwaGVyZT1BdC50cmFuc2Zvcm0obyxlLG8pKSx0Lm1vZGVsTWF0cml4PXN0LmNsb25lKHN0LklERU5USVRZKSx0fTtqMz1uZXcgYTt2by5jb21iaW5lSW5zdGFuY2VzPWZ1bmN0aW9uKHQpe2lmKCFoKHQpfHx0Lmxlbmd0aDwxKXRocm93IG5ldyBGKCJpbnN0YW5jZXMgaXMgcmVxdWlyZWQgYW5kIG11c3QgaGF2ZSBsZW5ndGggZ3JlYXRlciB0aGFuIHplcm8uIik7bGV0IGU9W10sbj1bXSxvPXQubGVuZ3RoO2ZvcihsZXQgaT0wO2k8bzsrK2kpe2xldCBzPXRbaV07aChzLmdlb21ldHJ5KT9lLnB1c2gocyk6aChzLndlc3RIZW1pc3BoZXJlR2VvbWV0cnkpJiZoKHMuZWFzdEhlbWlzcGhlcmVHZW9tZXRyeSkmJm4ucHVzaChzKX1sZXQgcj1bXTtyZXR1cm4gZS5sZW5ndGg+MCYmci5wdXNoKHFoKGUsImdlb21ldHJ5IikpLG4ubGVuZ3RoPjAmJihyLnB1c2gocWgobiwid2VzdEhlbWlzcGhlcmVHZW9tZXRyeSIpKSxyLnB1c2gocWgobiwiZWFzdEhlbWlzcGhlcmVHZW9tZXRyeSIpKSkscn07QXI9bmV3IGEsVGY9bmV3IGEsbmE9bmV3IGEsb2E9bmV3IGE7dm8uY29tcHV0ZU5vcm1hbD1mdW5jdGlvbih0KXtpZighaCh0KSl0aHJvdyBuZXcgRigiZ2VvbWV0cnkgaXMgcmVxdWlyZWQuIik7aWYoIWgodC5hdHRyaWJ1dGVzLnBvc2l0aW9uKXx8IWgodC5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcykpdGhyb3cgbmV3IEYoImdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzIGlzIHJlcXVpcmVkLiIpO2lmKCFoKHQuaW5kaWNlcykpdGhyb3cgbmV3IEYoImdlb21ldHJ5LmluZGljZXMgaXMgcmVxdWlyZWQuIik7aWYodC5pbmRpY2VzLmxlbmd0aDwyfHx0LmluZGljZXMubGVuZ3RoJTMhPT0wKXRocm93IG5ldyBGKCJnZW9tZXRyeS5pbmRpY2VzIGxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIGFuZCBiZSBhIG11bHRpcGxlIG9mIDMuIik7aWYodC5wcmltaXRpdmVUeXBlIT09QnQuVFJJQU5HTEVTKXRocm93IG5ldyBGKCJnZW9tZXRyeS5wcmltaXRpdmVUeXBlIG11c3QgYmUgUHJpbWl0aXZlVHlwZS5UUklBTkdMRVMuIik7bGV0IGU9dC5pbmRpY2VzLG49dC5hdHRyaWJ1dGVzLG89bi5wb3NpdGlvbi52YWx1ZXMscj1uLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGgvMyxpPWUubGVuZ3RoLHM9bmV3IEFycmF5KHIpLGY9bmV3IEFycmF5KGkvMyksdT1uZXcgQXJyYXkoaSksYztmb3IoYz0wO2M8cjtjKyspc1tjXT17aW5kZXhPZmZzZXQ6MCxjb3VudDowLGN1cnJlbnRDb3VudDowfTtsZXQgbD0wO2ZvcihjPTA7YzxpO2MrPTMpe2xldCBfPWVbY10sZz1lW2MrMV0sYj1lW2MrMl0sdz1fKjMsTz1nKjMsRT1iKjM7VGYueD1vW3ddLFRmLnk9b1t3KzFdLFRmLno9b1t3KzJdLG5hLng9b1tPXSxuYS55PW9bTysxXSxuYS56PW9bTysyXSxvYS54PW9bRV0sb2EueT1vW0UrMV0sb2Euej1vW0UrMl0sc1tfXS5jb3VudCsrLHNbZ10uY291bnQrKyxzW2JdLmNvdW50KyssYS5zdWJ0cmFjdChuYSxUZixuYSksYS5zdWJ0cmFjdChvYSxUZixvYSksZltsXT1hLmNyb3NzKG5hLG9hLG5ldyBhKSxsKyt9bGV0IHA9MDtmb3IoYz0wO2M8cjtjKyspc1tjXS5pbmRleE9mZnNldCs9cCxwKz1zW2NdLmNvdW50O2w9MDtsZXQgZDtmb3IoYz0wO2M8aTtjKz0zKXtkPXNbZVtjXV07bGV0IF89ZC5pbmRleE9mZnNldCtkLmN1cnJlbnRDb3VudDt1W19dPWwsZC5jdXJyZW50Q291bnQrKyxkPXNbZVtjKzFdXSxfPWQuaW5kZXhPZmZzZXQrZC5jdXJyZW50Q291bnQsdVtfXT1sLGQuY3VycmVudENvdW50KyssZD1zW2VbYysyXV0sXz1kLmluZGV4T2Zmc2V0K2QuY3VycmVudENvdW50LHVbX109bCxkLmN1cnJlbnRDb3VudCsrLGwrK31sZXQgbT1uZXcgRmxvYXQzMkFycmF5KHIqMyk7Zm9yKGM9MDtjPHI7YysrKXtsZXQgXz1jKjM7aWYoZD1zW2NdLGEuY2xvbmUoYS5aRVJPLEFyKSxkLmNvdW50PjApe2ZvcihsPTA7bDxkLmNvdW50O2wrKylhLmFkZChBcixmW3VbZC5pbmRleE9mZnNldCtsXV0sQXIpO2EuZXF1YWxzRXBzaWxvbihhLlpFUk8sQXIsTS5FUFNJTE9OMTApJiZhLmNsb25lKGZbdVtkLmluZGV4T2Zmc2V0XV0sQXIpfWEuZXF1YWxzRXBzaWxvbihhLlpFUk8sQXIsTS5FUFNJTE9OMTApJiYoQXIuej0xKSxhLm5vcm1hbGl6ZShBcixBciksbVtfXT1Bci54LG1bXysxXT1Bci55LG1bXysyXT1Bci56fXJldHVybiB0LmF0dHJpYnV0ZXMubm9ybWFsPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczptfSksdH07SDM9bmV3IGEsa2I9bmV3IGEscTM9bmV3IGE7dm8uY29tcHV0ZVRhbmdlbnRBbmRCaXRhbmdlbnQ9ZnVuY3Rpb24odCl7aWYoIWgodCkpdGhyb3cgbmV3IEYoImdlb21ldHJ5IGlzIHJlcXVpcmVkLiIpO2xldCBlPXQuYXR0cmlidXRlcyxuPXQuaW5kaWNlcztpZighaChlLnBvc2l0aW9uKXx8IWgoZS5wb3NpdGlvbi52YWx1ZXMpKXRocm93IG5ldyBGKCJnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyBpcyByZXF1aXJlZC4iKTtpZighaChlLm5vcm1hbCl8fCFoKGUubm9ybWFsLnZhbHVlcykpdGhyb3cgbmV3IEYoImdlb21ldHJ5LmF0dHJpYnV0ZXMubm9ybWFsLnZhbHVlcyBpcyByZXF1aXJlZC4iKTtpZighaChlLnN0KXx8IWgoZS5zdC52YWx1ZXMpKXRocm93IG5ldyBGKCJnZW9tZXRyeS5hdHRyaWJ1dGVzLnN0LnZhbHVlcyBpcyByZXF1aXJlZC4iKTtpZighaChuKSl0aHJvdyBuZXcgRigiZ2VvbWV0cnkuaW5kaWNlcyBpcyByZXF1aXJlZC4iKTtpZihuLmxlbmd0aDwyfHxuLmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgRigiZ2VvbWV0cnkuaW5kaWNlcyBsZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gMCBhbmQgYmUgYSBtdWx0aXBsZSBvZiAzLiIpO2lmKHQucHJpbWl0aXZlVHlwZSE9PUJ0LlRSSUFOR0xFUyl0aHJvdyBuZXcgRigiZ2VvbWV0cnkucHJpbWl0aXZlVHlwZSBtdXN0IGJlIFByaW1pdGl2ZVR5cGUuVFJJQU5HTEVTLiIpO2xldCBvPXQuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMscj10LmF0dHJpYnV0ZXMubm9ybWFsLnZhbHVlcyxpPXQuYXR0cmlidXRlcy5zdC52YWx1ZXMscz10LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLmxlbmd0aC8zLGY9bi5sZW5ndGgsdT1uZXcgQXJyYXkocyozKSxjO2ZvcihjPTA7Yzx1Lmxlbmd0aDtjKyspdVtjXT0wO2xldCBsLHAsZDtmb3IoYz0wO2M8ZjtjKz0zKXtsZXQgZz1uW2NdLGI9bltjKzFdLHc9bltjKzJdO2w9ZyozLHA9YiozLGQ9dyozO2xldCBPPWcqMixFPWIqMixUPXcqMixDPW9bbF0sTj1vW2wrMV0sST1vW2wrMl0sRD1pW09dLHY9aVtPKzFdLEw9aVtFKzFdLXYsVT1pW1QrMV0tdixBPTEvKChpW0VdLUQpKlUtKGlbVF0tRCkqTCksUz0oVSoob1twXS1DKS1MKihvW2RdLUMpKSpBLFA9KFUqKG9bcCsxXS1OKS1MKihvW2QrMV0tTikpKkEsQj0oVSoob1twKzJdLUkpLUwqKG9bZCsyXS1JKSkqQTt1W2xdKz1TLHVbbCsxXSs9UCx1W2wrMl0rPUIsdVtwXSs9Uyx1W3ArMV0rPVAsdVtwKzJdKz1CLHVbZF0rPVMsdVtkKzFdKz1QLHVbZCsyXSs9Qn1sZXQgbT1uZXcgRmxvYXQzMkFycmF5KHMqMyksXz1uZXcgRmxvYXQzMkFycmF5KHMqMyk7Zm9yKGM9MDtjPHM7YysrKXtsPWMqMyxwPWwrMSxkPWwrMjtsZXQgZz1hLmZyb21BcnJheShyLGwsSDMpLGI9YS5mcm9tQXJyYXkodSxsLHEzKSx3PWEuZG90KGcsYik7YS5tdWx0aXBseUJ5U2NhbGFyKGcsdyxrYiksYS5ub3JtYWxpemUoYS5zdWJ0cmFjdChiLGtiLGIpLGIpLG1bbF09Yi54LG1bcF09Yi55LG1bZF09Yi56LGEubm9ybWFsaXplKGEuY3Jvc3MoZyxiLGIpLGIpLF9bbF09Yi54LF9bcF09Yi55LF9bZF09Yi56fXJldHVybiB0LmF0dHJpYnV0ZXMudGFuZ2VudD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6bX0pLHQuYXR0cmlidXRlcy5iaXRhbmdlbnQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOl99KSx0fTtPZj1uZXcgdHQsVXI9bmV3IGEsR2I9bmV3IGEsemI9bmV3IGEsVXA9bmV3IHR0O3ZvLmNvbXByZXNzVmVydGljZXM9ZnVuY3Rpb24odCl7aWYoIWgodCkpdGhyb3cgbmV3IEYoImdlb21ldHJ5IGlzIHJlcXVpcmVkLiIpO2xldCBlPXQuYXR0cmlidXRlcy5leHRydWRlRGlyZWN0aW9uLG4sbztpZihoKGUpKXtsZXQgTj1lLnZhbHVlcztvPU4ubGVuZ3RoLzM7bGV0IEk9bmV3IEZsb2F0MzJBcnJheShvKjIpLEQ9MDtmb3Iobj0wO248bzsrK24pe2lmKGEuZnJvbUFycmF5KE4sbiozLFVyKSxhLmVxdWFscyhVcixhLlpFUk8pKXtEKz0yO2NvbnRpbnVlfVVwPW5uLm9jdEVuY29kZUluUmFuZ2UoVXIsNjU1MzUsVXApLElbRCsrXT1VcC54LElbRCsrXT1VcC55fXJldHVybiB0LmF0dHJpYnV0ZXMuY29tcHJlc3NlZEF0dHJpYnV0ZXM9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjIsdmFsdWVzOkl9KSxkZWxldGUgdC5hdHRyaWJ1dGVzLmV4dHJ1ZGVEaXJlY3Rpb24sdH1sZXQgcj10LmF0dHJpYnV0ZXMubm9ybWFsLGk9dC5hdHRyaWJ1dGVzLnN0LHM9aChyKSxmPWgoaSk7aWYoIXMmJiFmKXJldHVybiB0O2xldCB1PXQuYXR0cmlidXRlcy50YW5nZW50LGM9dC5hdHRyaWJ1dGVzLmJpdGFuZ2VudCxsPWgodSkscD1oKGMpLGQsbSxfLGc7cyYmKGQ9ci52YWx1ZXMpLGYmJihtPWkudmFsdWVzKSxsJiYoXz11LnZhbHVlcykscCYmKGc9Yy52YWx1ZXMpLG89KHM/ZC5sZW5ndGg6bS5sZW5ndGgpLyhzPzM6Mik7bGV0IE89byxFPWYmJnM/MjoxO0UrPWx8fHA/MTowLE8qPUU7bGV0IFQ9bmV3IEZsb2F0MzJBcnJheShPKSxDPTA7Zm9yKG49MDtuPG87KytuKXtmJiYodHQuZnJvbUFycmF5KG0sbioyLE9mKSxUW0MrK109bm4uY29tcHJlc3NUZXh0dXJlQ29vcmRpbmF0ZXMoT2YpKTtsZXQgTj1uKjM7cyYmaChfKSYmaChnKT8oYS5mcm9tQXJyYXkoZCxOLFVyKSxhLmZyb21BcnJheShfLE4sR2IpLGEuZnJvbUFycmF5KGcsTix6Yiksbm4ub2N0UGFjayhVcixHYix6YixPZiksVFtDKytdPU9mLngsVFtDKytdPU9mLnkpOihzJiYoYS5mcm9tQXJyYXkoZCxOLFVyKSxUW0MrK109bm4ub2N0RW5jb2RlRmxvYXQoVXIpKSxsJiYoYS5mcm9tQXJyYXkoXyxOLFVyKSxUW0MrK109bm4ub2N0RW5jb2RlRmxvYXQoVXIpKSxwJiYoYS5mcm9tQXJyYXkoZyxOLFVyKSxUW0MrK109bm4ub2N0RW5jb2RlRmxvYXQoVXIpKSl9cmV0dXJuIHQuYXR0cmlidXRlcy5jb21wcmVzc2VkQXR0cmlidXRlcz1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6RSx2YWx1ZXM6VH0pLHMmJmRlbGV0ZSB0LmF0dHJpYnV0ZXMubm9ybWFsLGYmJmRlbGV0ZSB0LmF0dHJpYnV0ZXMuc3QscCYmZGVsZXRlIHQuYXR0cmlidXRlcy5iaXRhbmdlbnQsbCYmZGVsZXRlIHQuYXR0cmlidXRlcy50YW5nZW50LHR9O2piPW5ldyBhO2VjPW5ldyBhLG5jPW5ldyBhLG9jPW5ldyBhLHJjPW5ldyBhLEtoPXtwb3NpdGlvbnM6bmV3IEFycmF5KDcpLGluZGljZXM6bmV3IEFycmF5KDMqMyl9O2VNPVpoKGhlLDQpLEdwPVpoKGEsMyksJGI9WmgodHQsMiksbk09ZnVuY3Rpb24odCxlLG4sbyxyLGkscyl7bGV0IGY9clt0XSpvLngsdT1yW2VdKm8ueSxjPXJbbl0qby56O2lbc109Zit1K2M+TS5FUFNJTE9ONj8xOjB9LEVmPW5ldyBhLFdoPW5ldyBhLFhoPW5ldyBhLG9NPW5ldyBhO2lNPXtwb3NpdGlvbjohMCxub3JtYWw6ITAsYml0YW5nZW50OiEwLHRhbmdlbnQ6ITAsc3Q6ITAsZXh0cnVkZURpcmVjdGlvbjohMCxhcHBseU9mZnNldDohMH07WmI9b24uZnJvbVBvaW50Tm9ybWFsKGEuWkVSTyxhLlVOSVRfWSksc009bmV3IGEsY009bmV3IGE7V2I9bmV3IHR0LGFNPW5ldyB0dCxRYj1uZXcgYSxKYj1uZXcgYSxZaD1uZXcgYSxmTT1uZXcgYSx1TT1uZXcgYSxsTT1uZXcgYSxYYj1uZXcgaGU7cE09NSpNLkVQU0lMT045LGtwPU0uRVBTSUxPTjY7dm8uc3BsaXRMb25naXR1ZGU9ZnVuY3Rpb24odCl7aWYoIWgodCkpdGhyb3cgbmV3IEYoImluc3RhbmNlIGlzIHJlcXVpcmVkLiIpO2xldCBlPXQuZ2VvbWV0cnksbj1lLmJvdW5kaW5nU3BoZXJlO2lmKGgobikmJihuLmNlbnRlci54LW4ucmFkaXVzPjB8fEF0LmludGVyc2VjdFBsYW5lKG4sb24uT1JJR0lOX1pYX1BMQU5FKSE9PVJuLklOVEVSU0VDVElORykpcmV0dXJuIHQ7aWYoZS5nZW9tZXRyeVR5cGUhPT1NaS5OT05FKXN3aXRjaChlLmdlb21ldHJ5VHlwZSl7Y2FzZSBNaS5QT0xZTElORVM6ZE0odCk7YnJlYWs7Y2FzZSBNaS5UUklBTkdMRVM6cWIodCk7YnJlYWs7Y2FzZSBNaS5MSU5FUzpLYih0KTticmVha31lbHNlIFEzKGUpLGUucHJpbWl0aXZlVHlwZT09PUJ0LlRSSUFOR0xFUz9xYih0KTplLnByaW1pdGl2ZVR5cGU9PT1CdC5MSU5FUyYmS2IodCk7cmV0dXJuIHR9O1ZlPXZvfSk7ZnVuY3Rpb24gUmYodCxlLG4pe3Q9eCh0LDApLGU9eChlLDApLG49eChuLDApLHRoaXMudmFsdWU9bmV3IEZsb2F0MzJBcnJheShbdCxlLG5dKX12YXIgdHcsZXc9WigoKT0+e1h0KCk7TGUoKTtJdCgpO2Z0KCk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmYucHJvdG90eXBlLHtjb21wb25lbnREYXRhdHlwZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG50LkZMT0FUfX0sY29tcG9uZW50c1BlckF0dHJpYnV0ZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDN9fSxub3JtYWxpemU6e2dldDpmdW5jdGlvbigpe3JldHVybiExfX19KTtSZi5mcm9tQ2FydGVzaWFuMz1mdW5jdGlvbih0KXtyZXR1cm4geS5kZWZpbmVkKCJvZmZzZXQiLHQpLG5ldyBSZih0LngsdC55LHQueil9O1JmLnRvVmFsdWU9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS5kZWZpbmVkKCJvZmZzZXQiLHQpLGgoZSl8fChlPW5ldyBGbG9hdDMyQXJyYXkoW3QueCx0LnksdC56XSkpLGVbMF09dC54LGVbMV09dC55LGVbMl09dC56LGV9O3R3PVJmfSk7ZnVuY3Rpb24gWm8odCl7dGhpcy5fZWxsaXBzb2lkPXgodCwkLldHUzg0KSx0aGlzLl9zZW1pbWFqb3JBeGlzPXRoaXMuX2VsbGlwc29pZC5tYXhpbXVtUmFkaXVzLHRoaXMuX29uZU92ZXJTZW1pbWFqb3JBeGlzPTEvdGhpcy5fc2VtaW1ham9yQXhpc312YXIgZW8saWM9WigoKT0+e0Z0KCk7UGUoKTtJdCgpO2Z0KCk7SHQoKTtadCgpO1d0KCk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoWm8ucHJvdG90eXBlLHtlbGxpcHNvaWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbGxpcHNvaWR9fX0pO1pvLm1lcmNhdG9yQW5nbGVUb0dlb2RldGljTGF0aXR1ZGU9ZnVuY3Rpb24odCl7cmV0dXJuIE0uUElfT1ZFUl9UV08tMipNYXRoLmF0YW4oTWF0aC5leHAoLXQpKX07Wm8uZ2VvZGV0aWNMYXRpdHVkZVRvTWVyY2F0b3JBbmdsZT1mdW5jdGlvbih0KXt0PlpvLk1heGltdW1MYXRpdHVkZT90PVpvLk1heGltdW1MYXRpdHVkZTp0PC1aby5NYXhpbXVtTGF0aXR1ZGUmJih0PS1aby5NYXhpbXVtTGF0aXR1ZGUpO2xldCBlPU1hdGguc2luKHQpO3JldHVybiAuNSpNYXRoLmxvZygoMStlKS8oMS1lKSl9O1pvLk1heGltdW1MYXRpdHVkZT1aby5tZXJjYXRvckFuZ2xlVG9HZW9kZXRpY0xhdGl0dWRlKE1hdGguUEkpO1pvLnByb3RvdHlwZS5wcm9qZWN0PWZ1bmN0aW9uKHQsZSl7bGV0IG49dGhpcy5fc2VtaW1ham9yQXhpcyxvPXQubG9uZ2l0dWRlKm4scj1aby5nZW9kZXRpY0xhdGl0dWRlVG9NZXJjYXRvckFuZ2xlKHQubGF0aXR1ZGUpKm4saT10LmhlaWdodDtyZXR1cm4gaChlKT8oZS54PW8sZS55PXIsZS56PWksZSk6bmV3IGEobyxyLGkpfTtaby5wcm90b3R5cGUudW5wcm9qZWN0PWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEYoImNhcnRlc2lhbiBpcyByZXF1aXJlZCIpO2xldCBuPXRoaXMuX29uZU92ZXJTZW1pbWFqb3JBeGlzLG89dC54Km4scj1aby5tZXJjYXRvckFuZ2xlVG9HZW9kZXRpY0xhdGl0dWRlKHQueSpuKSxpPXQuejtyZXR1cm4gaChlKT8oZS5sb25naXR1ZGU9byxlLmxhdGl0dWRlPXIsZS5oZWlnaHQ9aSxlKTpuZXcgYXQobyxyLGkpfTtlbz1ab30pO2Z1bmN0aW9uIG1NKHQsZSxuKXtsZXQgbz0hbixyPXQubGVuZ3RoLGk7aWYoIW8mJnI+MSl7bGV0IHM9dFswXS5tb2RlbE1hdHJpeDtmb3IoaT0xO2k8cjsrK2kpaWYoIXN0LmVxdWFscyhzLHRbaV0ubW9kZWxNYXRyaXgpKXtvPSEwO2JyZWFrfX1pZihvKWZvcihpPTA7aTxyOysraSloKHRbaV0uZ2VvbWV0cnkpJiZWZS50cmFuc2Zvcm1Ub1dvcmxkQ29vcmRpbmF0ZXModFtpXSk7ZWxzZSBzdC5tdWx0aXBseVRyYW5zZm9ybWF0aW9uKGUsdFswXS5tb2RlbE1hdHJpeCxlKX1mdW5jdGlvbiBRaCh0LGUpe2xldCBuPXQuYXR0cmlidXRlcyxvPW4ucG9zaXRpb24scj1vLnZhbHVlcy5sZW5ndGgvby5jb21wb25lbnRzUGVyQXR0cmlidXRlO24uYmF0Y2hJZD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6MSx2YWx1ZXM6bmV3IEZsb2F0MzJBcnJheShyKX0pO2xldCBpPW4uYmF0Y2hJZC52YWx1ZXM7Zm9yKGxldCBzPTA7czxyOysrcylpW3NdPWV9ZnVuY3Rpb24gaE0odCl7bGV0IGU9dC5sZW5ndGg7Zm9yKGxldCBuPTA7bjxlOysrbil7bGV0IG89dFtuXTtoKG8uZ2VvbWV0cnkpP1FoKG8uZ2VvbWV0cnksbik6aChvLndlc3RIZW1pc3BoZXJlR2VvbWV0cnkpJiZoKG8uZWFzdEhlbWlzcGhlcmVHZW9tZXRyeSkmJihRaChvLndlc3RIZW1pc3BoZXJlR2VvbWV0cnksbiksUWgoby5lYXN0SGVtaXNwaGVyZUdlb21ldHJ5LG4pKX19ZnVuY3Rpb24gX00odCl7bGV0IGU9dC5pbnN0YW5jZXMsbj10LnByb2plY3Rpb24sbz10LmVsZW1lbnRJbmRleFVpbnRTdXBwb3J0ZWQscj10LnNjZW5lM0RPbmx5LGk9dC52ZXJ0ZXhDYWNoZU9wdGltaXplLHM9dC5jb21wcmVzc1ZlcnRpY2VzLGY9dC5tb2RlbE1hdHJpeCx1LGMsbCxwPWUubGVuZ3RoO2Zvcih1PTA7dTxwOysrdSlpZihoKGVbdV0uZ2VvbWV0cnkpKXtsPWVbdV0uZ2VvbWV0cnkucHJpbWl0aXZlVHlwZTticmVha31mb3IodT0xO3U8cDsrK3UpaWYoaChlW3VdLmdlb21ldHJ5KSYmZVt1XS5nZW9tZXRyeS5wcmltaXRpdmVUeXBlIT09bCl0aHJvdyBuZXcgRigiQWxsIGluc3RhbmNlIGdlb21ldHJpZXMgbXVzdCBoYXZlIHRoZSBzYW1lIHByaW1pdGl2ZVR5cGUuIik7aWYobU0oZSxmLHIpLCFyKWZvcih1PTA7dTxwOysrdSloKGVbdV0uZ2VvbWV0cnkpJiZWZS5zcGxpdExvbmdpdHVkZShlW3VdKTtpZihoTShlKSxpKWZvcih1PTA7dTxwOysrdSl7bGV0IG09ZVt1XTtoKG0uZ2VvbWV0cnkpPyhWZS5yZW9yZGVyRm9yUG9zdFZlcnRleENhY2hlKG0uZ2VvbWV0cnkpLFZlLnJlb3JkZXJGb3JQcmVWZXJ0ZXhDYWNoZShtLmdlb21ldHJ5KSk6aChtLndlc3RIZW1pc3BoZXJlR2VvbWV0cnkpJiZoKG0uZWFzdEhlbWlzcGhlcmVHZW9tZXRyeSkmJihWZS5yZW9yZGVyRm9yUG9zdFZlcnRleENhY2hlKG0ud2VzdEhlbWlzcGhlcmVHZW9tZXRyeSksVmUucmVvcmRlckZvclByZVZlcnRleENhY2hlKG0ud2VzdEhlbWlzcGhlcmVHZW9tZXRyeSksVmUucmVvcmRlckZvclBvc3RWZXJ0ZXhDYWNoZShtLmVhc3RIZW1pc3BoZXJlR2VvbWV0cnkpLFZlLnJlb3JkZXJGb3JQcmVWZXJ0ZXhDYWNoZShtLmVhc3RIZW1pc3BoZXJlR2VvbWV0cnkpKX1sZXQgZD1WZS5jb21iaW5lSW5zdGFuY2VzKGUpO2ZvcihwPWQubGVuZ3RoLHU9MDt1PHA7Kyt1KXtjPWRbdV07bGV0IG09Yy5hdHRyaWJ1dGVzO2lmKHIpZm9yKGxldCBfIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShfKSYmbVtfXS5jb21wb25lbnREYXRhdHlwZT09PW50LkRPVUJMRSYmVmUuZW5jb2RlQXR0cmlidXRlKGMsXyxgJHtffTNESGlnaGAsYCR7X30zRExvd2ApO2Vsc2UgZm9yKGxldCBfIGluIG0paWYobS5oYXNPd25Qcm9wZXJ0eShfKSYmbVtfXS5jb21wb25lbnREYXRhdHlwZT09PW50LkRPVUJMRSl7bGV0IGc9YCR7X30zRGAsYj1gJHtffTJEYDtWZS5wcm9qZWN0VG8yRChjLF8sZyxiLG4pLGgoYy5ib3VuZGluZ1NwaGVyZSkmJl89PT0icG9zaXRpb24iJiYoYy5ib3VuZGluZ1NwaGVyZUNWPUF0LmZyb21WZXJ0aWNlcyhjLmF0dHJpYnV0ZXMucG9zaXRpb24yRC52YWx1ZXMpKSxWZS5lbmNvZGVBdHRyaWJ1dGUoYyxnLGAke2d9SGlnaGAsYCR7Z31Mb3dgKSxWZS5lbmNvZGVBdHRyaWJ1dGUoYyxiLGAke2J9SGlnaGAsYCR7Yn1Mb3dgKX1zJiZWZS5jb21wcmVzc1ZlcnRpY2VzKGMpfWlmKCFvKXtsZXQgbT1bXTtmb3IocD1kLmxlbmd0aCx1PTA7dTxwOysrdSljPWRbdV0sbT1tLmNvbmNhdChWZS5maXRUb1Vuc2lnbmVkU2hvcnRJbmRpY2VzKGMpKTtkPW19cmV0dXJuIGR9ZnVuY3Rpb24gSmgodCxlLG4sbyl7bGV0IHIsaSxzLGY9by5sZW5ndGgtMTtpZihmPj0wKXtsZXQgYz1vW2ZdO3I9Yy5vZmZzZXQrYy5jb3VudCxzPWMuaW5kZXgsaT1uW3NdLmluZGljZXMubGVuZ3RofWVsc2Ugcj0wLHM9MCxpPW5bc10uaW5kaWNlcy5sZW5ndGg7bGV0IHU9dC5sZW5ndGg7Zm9yKGxldCBjPTA7Yzx1OysrYyl7bGV0IHA9dFtjXVtlXTtpZighaChwKSljb250aW51ZTtsZXQgZD1wLmluZGljZXMubGVuZ3RoO3IrZD5pJiYocj0wLGk9blsrK3NdLmluZGljZXMubGVuZ3RoKSxvLnB1c2goe2luZGV4OnMsb2Zmc2V0OnIsY291bnQ6ZH0pLHIrPWR9fWZ1bmN0aW9uIHlNKHQsZSl7bGV0IG49W107cmV0dXJuIEpoKHQsImdlb21ldHJ5IixlLG4pLEpoKHQsIndlc3RIZW1pc3BoZXJlR2VvbWV0cnkiLGUsbiksSmgodCwiZWFzdEhlbWlzcGhlcmVHZW9tZXRyeSIsZSxuKSxufWZ1bmN0aW9uIGdNKHQsZSl7bGV0IG49dC5hdHRyaWJ1dGVzO2ZvcihsZXQgbyBpbiBuKWlmKG4uaGFzT3duUHJvcGVydHkobykpe2xldCByPW5bb107aChyKSYmaChyLnZhbHVlcykmJmUucHVzaChyLnZhbHVlcy5idWZmZXIpfWgodC5pbmRpY2VzKSYmZS5wdXNoKHQuaW5kaWNlcy5idWZmZXIpfWZ1bmN0aW9uIEFNKHQsZSl7bGV0IG49dC5sZW5ndGg7Zm9yKGxldCBvPTA7bzxuOysrbylnTSh0W29dLGUpfWZ1bmN0aW9uIGJNKHQpe2xldCBlPTEsbj10Lmxlbmd0aDtmb3IobGV0IG89MDtvPG47bysrKXtsZXQgcj10W29dO2lmKCsrZSwhaChyKSljb250aW51ZTtsZXQgaT1yLmF0dHJpYnV0ZXM7ZSs9NysyKkF0LnBhY2tlZExlbmd0aCsoaChyLmluZGljZXMpP3IuaW5kaWNlcy5sZW5ndGg6MCk7Zm9yKGxldCBzIGluIGkpaWYoaS5oYXNPd25Qcm9wZXJ0eShzKSYmaChpW3NdKSl7bGV0IGY9aVtzXTtlKz01K2YudmFsdWVzLmxlbmd0aH19cmV0dXJuIGV9ZnVuY3Rpb24gd00odCxlKXtsZXQgbj10Lmxlbmd0aCxvPW5ldyBGbG9hdDY0QXJyYXkoMStuKjE5KSxyPTA7b1tyKytdPW47Zm9yKGxldCBpPTA7aTxuO2krKyl7bGV0IHM9dFtpXTtpZihzdC5wYWNrKHMubW9kZWxNYXRyaXgsbyxyKSxyKz1zdC5wYWNrZWRMZW5ndGgsaChzLmF0dHJpYnV0ZXMpJiZoKHMuYXR0cmlidXRlcy5vZmZzZXQpKXtsZXQgZj1zLmF0dHJpYnV0ZXMub2Zmc2V0LnZhbHVlO29bcl09ZlswXSxvW3IrMV09ZlsxXSxvW3IrMl09ZlsyXX1yKz0zfXJldHVybiBlLnB1c2goby5idWZmZXIpLG99ZnVuY3Rpb24gVE0odCl7bGV0IGU9dCxuPW5ldyBBcnJheShlWzBdKSxvPTAscj0xO2Zvcig7cjxlLmxlbmd0aDspe2xldCBpPXN0LnVucGFjayhlLHIpLHM7cis9c3QucGFja2VkTGVuZ3RoLGgoZVtyXSkmJihzPXtvZmZzZXQ6bmV3IHR3KGVbcl0sZVtyKzFdLGVbcisyXSl9KSxyKz0zLG5bbysrXT17bW9kZWxNYXRyaXg6aSxhdHRyaWJ1dGVzOnN9fXJldHVybiBufWZ1bmN0aW9uIG53KHQpe2xldCBlPXQubGVuZ3RoLG49MSsoQXQucGFja2VkTGVuZ3RoKzEpKmUsbz1uZXcgRmxvYXQzMkFycmF5KG4pLHI9MDtvW3IrK109ZTtmb3IobGV0IGk9MDtpPGU7KytpKXtsZXQgcz10W2ldO2gocyk/KG9bcisrXT0xLEF0LnBhY2sodFtpXSxvLHIpKTpvW3IrK109MCxyKz1BdC5wYWNrZWRMZW5ndGh9cmV0dXJuIG99ZnVuY3Rpb24gb3codCl7bGV0IGU9bmV3IEFycmF5KHRbMF0pLG49MCxvPTE7Zm9yKDtvPHQubGVuZ3RoOyl0W28rK109PT0xJiYoZVtuXT1BdC51bnBhY2sodCxvKSksKytuLG8rPUF0LnBhY2tlZExlbmd0aDtyZXR1cm4gZX12YXIgSWksc2EsdDA9WigoKT0+e01lKCk7TGUoKTtJdCgpO2Z0KCk7SHQoKTtadCgpO1NpKCk7WGUoKTtZZSgpO2FuKCk7c2koKTskZSgpO0JuKCk7ZXcoKTtpYygpO0lpPXt9O0lpLmNvbWJpbmVHZW9tZXRyeT1mdW5jdGlvbih0KXtsZXQgZSxuLG89dC5pbnN0YW5jZXMscj1vLmxlbmd0aCxpLHMsZj0hMTtyPjAmJihlPV9NKHQpLGUubGVuZ3RoPjAmJihuPVZlLmNyZWF0ZUF0dHJpYnV0ZUxvY2F0aW9ucyhlWzBdKSx0LmNyZWF0ZVBpY2tPZmZzZXRzJiYoaT15TShvLGUpKSksaChvWzBdLmF0dHJpYnV0ZXMpJiZoKG9bMF0uYXR0cmlidXRlcy5vZmZzZXQpJiYocz1uZXcgQXJyYXkociksZj0hMCkpO2xldCB1PW5ldyBBcnJheShyKSxjPW5ldyBBcnJheShyKTtmb3IobGV0IGw9MDtsPHI7KytsKXtsZXQgcD1vW2xdLGQ9cC5nZW9tZXRyeTtoKGQpJiYodVtsXT1kLmJvdW5kaW5nU3BoZXJlLGNbbF09ZC5ib3VuZGluZ1NwaGVyZUNWLGYmJihzW2xdPXAuZ2VvbWV0cnkub2Zmc2V0QXR0cmlidXRlKSk7bGV0IG09cC5lYXN0SGVtaXNwaGVyZUdlb21ldHJ5LF89cC53ZXN0SGVtaXNwaGVyZUdlb21ldHJ5O2gobSkmJmgoXykmJihoKG0uYm91bmRpbmdTcGhlcmUpJiZoKF8uYm91bmRpbmdTcGhlcmUpJiYodVtsXT1BdC51bmlvbihtLmJvdW5kaW5nU3BoZXJlLF8uYm91bmRpbmdTcGhlcmUpKSxoKG0uYm91bmRpbmdTcGhlcmVDVikmJmgoXy5ib3VuZGluZ1NwaGVyZUNWKSYmKGNbbF09QXQudW5pb24obS5ib3VuZGluZ1NwaGVyZUNWLF8uYm91bmRpbmdTcGhlcmVDVikpKX1yZXR1cm57Z2VvbWV0cmllczplLG1vZGVsTWF0cml4OnQubW9kZWxNYXRyaXgsYXR0cmlidXRlTG9jYXRpb25zOm4scGlja09mZnNldHM6aSxvZmZzZXRJbnN0YW5jZUV4dGVuZDpzLGJvdW5kaW5nU3BoZXJlczp1LGJvdW5kaW5nU3BoZXJlc0NWOmN9fTtJaS5wYWNrQ3JlYXRlR2VvbWV0cnlSZXN1bHRzPWZ1bmN0aW9uKHQsZSl7bGV0IG49bmV3IEZsb2F0NjRBcnJheShiTSh0KSksbz1bXSxyPXt9LGk9dC5sZW5ndGgscz0wO25bcysrXT1pO2ZvcihsZXQgZj0wO2Y8aTtmKyspe2xldCB1PXRbZl0sYz1oKHUpO2lmKG5bcysrXT1jPzE6MCwhYyljb250aW51ZTtuW3MrK109dS5wcmltaXRpdmVUeXBlLG5bcysrXT11Lmdlb21ldHJ5VHlwZSxuW3MrK109eCh1Lm9mZnNldEF0dHJpYnV0ZSwtMSk7bGV0IGw9aCh1LmJvdW5kaW5nU3BoZXJlKT8xOjA7bltzKytdPWwsbCYmQXQucGFjayh1LmJvdW5kaW5nU3BoZXJlLG4scykscys9QXQucGFja2VkTGVuZ3RoO2xldCBwPWgodS5ib3VuZGluZ1NwaGVyZUNWKT8xOjA7bltzKytdPXAscCYmQXQucGFjayh1LmJvdW5kaW5nU3BoZXJlQ1YsbixzKSxzKz1BdC5wYWNrZWRMZW5ndGg7bGV0IGQ9dS5hdHRyaWJ1dGVzLG09W107Zm9yKGxldCBnIGluIGQpZC5oYXNPd25Qcm9wZXJ0eShnKSYmaChkW2ddKSYmKG0ucHVzaChnKSxoKHJbZ10pfHwocltnXT1vLmxlbmd0aCxvLnB1c2goZykpKTtuW3MrK109bS5sZW5ndGg7Zm9yKGxldCBnPTA7ZzxtLmxlbmd0aDtnKyspe2xldCBiPW1bZ10sdz1kW2JdO25bcysrXT1yW2JdLG5bcysrXT13LmNvbXBvbmVudERhdGF0eXBlLG5bcysrXT13LmNvbXBvbmVudHNQZXJBdHRyaWJ1dGUsbltzKytdPXcubm9ybWFsaXplPzE6MCxuW3MrK109dy52YWx1ZXMubGVuZ3RoLG4uc2V0KHcudmFsdWVzLHMpLHMrPXcudmFsdWVzLmxlbmd0aH1sZXQgXz1oKHUuaW5kaWNlcyk/dS5pbmRpY2VzLmxlbmd0aDowO25bcysrXT1fLF8+MCYmKG4uc2V0KHUuaW5kaWNlcyxzKSxzKz1fKX1yZXR1cm4gZS5wdXNoKG4uYnVmZmVyKSx7c3RyaW5nVGFibGU6byxwYWNrZWREYXRhOm59fTtJaS51bnBhY2tDcmVhdGVHZW9tZXRyeVJlc3VsdHM9ZnVuY3Rpb24odCl7bGV0IGU9dC5zdHJpbmdUYWJsZSxuPXQucGFja2VkRGF0YSxvLHI9bmV3IEFycmF5KG5bMF0pLGk9MCxzPTE7Zm9yKDtzPG4ubGVuZ3RoOyl7aWYoIShuW3MrK109PT0xKSl7cltpKytdPXZvaWQgMDtjb250aW51ZX1sZXQgdT1uW3MrK10sYz1uW3MrK10sbD1uW3MrK107bD09PS0xJiYobD12b2lkIDApO2xldCBwLGQ7bltzKytdPT09MSYmKHA9QXQudW5wYWNrKG4scykpLHMrPUF0LnBhY2tlZExlbmd0aCxuW3MrK109PT0xJiYoZD1BdC51bnBhY2sobixzKSkscys9QXQucGFja2VkTGVuZ3RoO2xldCBnLGIsdyxPPW5ldyBpZSxFPW5bcysrXTtmb3Iobz0wO288RTtvKyspe2xldCBDPWVbbltzKytdXSxOPW5bcysrXTt3PW5bcysrXTtsZXQgST1uW3MrK10hPT0wO2c9bltzKytdLGI9bnQuY3JlYXRlVHlwZWRBcnJheShOLGcpO2ZvcihsZXQgRD0wO0Q8ZztEKyspYltEXT1uW3MrK107T1tDXT1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOk4sY29tcG9uZW50c1BlckF0dHJpYnV0ZTp3LG5vcm1hbGl6ZTpJLHZhbHVlczpifSl9bGV0IFQ7aWYoZz1uW3MrK10sZz4wKXtsZXQgQz1iLmxlbmd0aC93O2ZvcihUPUR0LmNyZWF0ZVR5cGVkQXJyYXkoQyxnKSxvPTA7bzxnO28rKylUW29dPW5bcysrXX1yW2krK109bmV3IFV0KHtwcmltaXRpdmVUeXBlOnUsZ2VvbWV0cnlUeXBlOmMsYm91bmRpbmdTcGhlcmU6cCxib3VuZGluZ1NwaGVyZUNWOmQsaW5kaWNlczpULGF0dHJpYnV0ZXM6TyxvZmZzZXRBdHRyaWJ1dGU6bH0pfXJldHVybiByfTtJaS5wYWNrQ29tYmluZUdlb21ldHJ5UGFyYW1ldGVycz1mdW5jdGlvbih0LGUpe2xldCBuPXQuY3JlYXRlR2VvbWV0cnlSZXN1bHRzLG89bi5sZW5ndGg7Zm9yKGxldCByPTA7cjxvO3IrKyllLnB1c2gobltyXS5wYWNrZWREYXRhLmJ1ZmZlcik7cmV0dXJue2NyZWF0ZUdlb21ldHJ5UmVzdWx0czp0LmNyZWF0ZUdlb21ldHJ5UmVzdWx0cyxwYWNrZWRJbnN0YW5jZXM6d00odC5pbnN0YW5jZXMsZSksZWxsaXBzb2lkOnQuZWxsaXBzb2lkLGlzR2VvZ3JhcGhpYzp0LnByb2plY3Rpb24gaW5zdGFuY2VvZiBRbixlbGVtZW50SW5kZXhVaW50U3VwcG9ydGVkOnQuZWxlbWVudEluZGV4VWludFN1cHBvcnRlZCxzY2VuZTNET25seTp0LnNjZW5lM0RPbmx5LHZlcnRleENhY2hlT3B0aW1pemU6dC52ZXJ0ZXhDYWNoZU9wdGltaXplLGNvbXByZXNzVmVydGljZXM6dC5jb21wcmVzc1ZlcnRpY2VzLG1vZGVsTWF0cml4OnQubW9kZWxNYXRyaXgsY3JlYXRlUGlja09mZnNldHM6dC5jcmVhdGVQaWNrT2Zmc2V0c319O0lpLnVucGFja0NvbWJpbmVHZW9tZXRyeVBhcmFtZXRlcnM9ZnVuY3Rpb24odCl7bGV0IGU9VE0odC5wYWNrZWRJbnN0YW5jZXMpLG49dC5jcmVhdGVHZW9tZXRyeVJlc3VsdHMsbz1uLmxlbmd0aCxyPTA7Zm9yKGxldCBmPTA7ZjxvO2YrKyl7bGV0IHU9SWkudW5wYWNrQ3JlYXRlR2VvbWV0cnlSZXN1bHRzKG5bZl0pLGM9dS5sZW5ndGg7Zm9yKGxldCBsPTA7bDxjO2wrKyl7bGV0IHA9dVtsXSxkPWVbcl07ZC5nZW9tZXRyeT1wLCsrcn19bGV0IGk9JC5jbG9uZSh0LmVsbGlwc29pZCkscz10LmlzR2VvZ3JhcGhpYz9uZXcgUW4oaSk6bmV3IGVvKGkpO3JldHVybntpbnN0YW5jZXM6ZSxlbGxpcHNvaWQ6aSxwcm9qZWN0aW9uOnMsZWxlbWVudEluZGV4VWludFN1cHBvcnRlZDp0LmVsZW1lbnRJbmRleFVpbnRTdXBwb3J0ZWQsc2NlbmUzRE9ubHk6dC5zY2VuZTNET25seSx2ZXJ0ZXhDYWNoZU9wdGltaXplOnQudmVydGV4Q2FjaGVPcHRpbWl6ZSxjb21wcmVzc1ZlcnRpY2VzOnQuY29tcHJlc3NWZXJ0aWNlcyxtb2RlbE1hdHJpeDpzdC5jbG9uZSh0Lm1vZGVsTWF0cml4KSxjcmVhdGVQaWNrT2Zmc2V0czp0LmNyZWF0ZVBpY2tPZmZzZXRzfX07SWkucGFja0NvbWJpbmVHZW9tZXRyeVJlc3VsdHM9ZnVuY3Rpb24odCxlKXtoKHQuZ2VvbWV0cmllcykmJkFNKHQuZ2VvbWV0cmllcyxlKTtsZXQgbj1udyh0LmJvdW5kaW5nU3BoZXJlcyksbz1udyh0LmJvdW5kaW5nU3BoZXJlc0NWKTtyZXR1cm4gZS5wdXNoKG4uYnVmZmVyLG8uYnVmZmVyKSx7Z2VvbWV0cmllczp0Lmdlb21ldHJpZXMsYXR0cmlidXRlTG9jYXRpb25zOnQuYXR0cmlidXRlTG9jYXRpb25zLG1vZGVsTWF0cml4OnQubW9kZWxNYXRyaXgscGlja09mZnNldHM6dC5waWNrT2Zmc2V0cyxvZmZzZXRJbnN0YW5jZUV4dGVuZDp0Lm9mZnNldEluc3RhbmNlRXh0ZW5kLGJvdW5kaW5nU3BoZXJlczpuLGJvdW5kaW5nU3BoZXJlc0NWOm99fTtJaS51bnBhY2tDb21iaW5lR2VvbWV0cnlSZXN1bHRzPWZ1bmN0aW9uKHQpe3JldHVybntnZW9tZXRyaWVzOnQuZ2VvbWV0cmllcyxhdHRyaWJ1dGVMb2NhdGlvbnM6dC5hdHRyaWJ1dGVMb2NhdGlvbnMsbW9kZWxNYXRyaXg6dC5tb2RlbE1hdHJpeCxwaWNrT2Zmc2V0czp0LnBpY2tPZmZzZXRzLG9mZnNldEluc3RhbmNlRXh0ZW5kOnQub2Zmc2V0SW5zdGFuY2VFeHRlbmQsYm91bmRpbmdTcGhlcmVzOm93KHQuYm91bmRpbmdTcGhlcmVzKSxib3VuZGluZ1NwaGVyZXNDVjpvdyh0LmJvdW5kaW5nU3BoZXJlc0NWKX19O3NhPUlpfSk7ZnVuY3Rpb24gT00odCl7bGV0IGUsbj10Lm5hbWUsbz10Lm1lc3NhZ2U7aChuKSYmaChvKT9lPWAke259OiAke299YDplPXQudG9TdHJpbmcoKTtsZXQgcj10LnN0YWNrO3JldHVybiBoKHIpJiYoZSs9YAoke3J9YCksZX12YXIgcncsaXc9WigoKT0+e2Z0KCk7cnc9T019KTt2YXIgZTA9e307ZGUoZTAse2RlZmF1bHQ6KCk9PlFlfSk7ZnVuY3Rpb24gRU0odCl7YXN5bmMgZnVuY3Rpb24gZSh7ZGF0YTpvfSl7bGV0IHI9W10saT17aWQ6by5pZCxyZXN1bHQ6dm9pZCAwLGVycm9yOnZvaWQgMH07c2VsZi5DRVNJVU1fQkFTRV9VUkw9by5iYXNlVXJsO3RyeXtsZXQgcz1hd2FpdCB0KG8ucGFyYW1ldGVycyxyKTtpLnJlc3VsdD1zfWNhdGNoKHMpe3MgaW5zdGFuY2VvZiBFcnJvcj9pLmVycm9yPXtuYW1lOnMubmFtZSxtZXNzYWdlOnMubWVzc2FnZSxzdGFjazpzLnN0YWNrfTppLmVycm9yPXN9by5jYW5UcmFuc2ZlckFycmF5QnVmZmVyfHwoci5sZW5ndGg9MCk7dHJ5e3Bvc3RNZXNzYWdlKGkscil9Y2F0Y2gocyl7aS5yZXN1bHQ9dm9pZCAwLGkuZXJyb3I9YHBvc3RNZXNzYWdlIGZhaWxlZCB3aXRoIGVycm9yOiAke3J3KHMpfQogIHdpdGggcmVzcG9uc2VNZXNzYWdlOiAke0pTT04uc3RyaW5naWZ5KGkpfWAscG9zdE1lc3NhZ2UoaSl9fWZ1bmN0aW9uIG4obyl7cG9zdE1lc3NhZ2Uoe2lkOm8uZGF0YT8uaWQsZXJyb3I6YHBvc3RNZXNzYWdlIGZhaWxlZCB3aXRoIGVycm9yOiAke0pTT04uc3RyaW5naWZ5KG8pfWB9KX1yZXR1cm4gc2VsZi5vbm1lc3NhZ2U9ZSxzZWxmLm9ubWVzc2FnZWVycm9yPW4sc2VsZn12YXIgUWUsc289WigoKT0+e2l3KCk7UWU9RU19KTt2YXIgbjA9e307ZGUobjAse2RlZmF1bHQ6KCk9PlNNfSk7ZnVuY3Rpb24gUk0odCxlKXtsZXQgbj1zYS51bnBhY2tDb21iaW5lR2VvbWV0cnlQYXJhbWV0ZXJzKHQpLG89c2EuY29tYmluZUdlb21ldHJ5KG4pO3JldHVybiBzYS5wYWNrQ29tYmluZUdlb21ldHJ5UmVzdWx0cyhvLGUpfXZhciBTTSxvMD1aKCgpPT57dDAoKTtzbygpO1NNPVFlKFJNKX0pO3ZhciBDTSxmZSxMbz1aKCgpPT57Q009e05PTkU6MCxUT1A6MSxBTEw6Mn0sZmU9T2JqZWN0LmZyZWV6ZShDTSl9KTtmdW5jdGlvbiBHbih0KXt0PXgodCx4LkVNUFRZX09CSkVDVCksdGhpcy5wb3NpdGlvbj14KHQucG9zaXRpb24sITEpLHRoaXMubm9ybWFsPXgodC5ub3JtYWwsITEpLHRoaXMuc3Q9eCh0LnN0LCExKSx0aGlzLmJpdGFuZ2VudD14KHQuYml0YW5nZW50LCExKSx0aGlzLnRhbmdlbnQ9eCh0LnRhbmdlbnQsITEpLHRoaXMuY29sb3I9eCh0LmNvbG9yLCExKX12YXIgZHQsRW89WigoKT0+e0l0KCk7ZnQoKTtIdCgpO0duLlBPU0lUSU9OX09OTFk9T2JqZWN0LmZyZWV6ZShuZXcgR24oe3Bvc2l0aW9uOiEwfSkpO0duLlBPU0lUSU9OX0FORF9OT1JNQUw9T2JqZWN0LmZyZWV6ZShuZXcgR24oe3Bvc2l0aW9uOiEwLG5vcm1hbDohMH0pKTtHbi5QT1NJVElPTl9OT1JNQUxfQU5EX1NUPU9iamVjdC5mcmVlemUobmV3IEduKHtwb3NpdGlvbjohMCxub3JtYWw6ITAsc3Q6ITB9KSk7R24uUE9TSVRJT05fQU5EX1NUPU9iamVjdC5mcmVlemUobmV3IEduKHtwb3NpdGlvbjohMCxzdDohMH0pKTtHbi5QT1NJVElPTl9BTkRfQ09MT1I9T2JqZWN0LmZyZWV6ZShuZXcgR24oe3Bvc2l0aW9uOiEwLGNvbG9yOiEwfSkpO0duLkFMTD1PYmplY3QuZnJlZXplKG5ldyBHbih7cG9zaXRpb246ITAsbm9ybWFsOiEwLHN0OiEwLHRhbmdlbnQ6ITAsYml0YW5nZW50OiEwfSkpO0duLkRFRkFVTFQ9R24uUE9TSVRJT05fTk9STUFMX0FORF9TVDtHbi5wYWNrZWRMZW5ndGg9NjtHbi5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgRigidmFsdWUgaXMgcmVxdWlyZWQiKTtpZighaChlKSl0aHJvdyBuZXcgRigiYXJyYXkgaXMgcmVxdWlyZWQiKTtyZXR1cm4gbj14KG4sMCksZVtuKytdPXQucG9zaXRpb24/MTowLGVbbisrXT10Lm5vcm1hbD8xOjAsZVtuKytdPXQuc3Q/MTowLGVbbisrXT10LnRhbmdlbnQ/MTowLGVbbisrXT10LmJpdGFuZ2VudD8xOjAsZVtuXT10LmNvbG9yPzE6MCxlfTtHbi51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBGKCJhcnJheSBpcyByZXF1aXJlZCIpO3JldHVybiBlPXgoZSwwKSxoKG4pfHwobj1uZXcgR24pLG4ucG9zaXRpb249dFtlKytdPT09MSxuLm5vcm1hbD10W2UrK109PT0xLG4uc3Q9dFtlKytdPT09MSxuLnRhbmdlbnQ9dFtlKytdPT09MSxuLmJpdGFuZ2VudD10W2UrK109PT0xLG4uY29sb3I9dFtlXT09PTEsbn07R24uY2xvbmU9ZnVuY3Rpb24odCxlKXtpZihoKHQpKXJldHVybiBoKGUpfHwoZT1uZXcgR24pLGUucG9zaXRpb249dC5wb3NpdGlvbixlLm5vcm1hbD10Lm5vcm1hbCxlLnN0PXQuc3QsZS50YW5nZW50PXQudGFuZ2VudCxlLmJpdGFuZ2VudD10LmJpdGFuZ2VudCxlLmNvbG9yPXQuY29sb3IsZX07ZHQ9R259KTtmdW5jdGlvbiBpcih0KXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IGU9dC5taW5pbXVtLG49dC5tYXhpbXVtO2lmKHkudHlwZU9mLm9iamVjdCgibWluIixlKSx5LnR5cGVPZi5vYmplY3QoIm1heCIsbiksaCh0Lm9mZnNldEF0dHJpYnV0ZSkmJnQub2Zmc2V0QXR0cmlidXRlPT09ZmUuVE9QKXRocm93IG5ldyBGKCJHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZS5UT1AgaXMgbm90IGEgc3VwcG9ydGVkIG9wdGlvbnMub2Zmc2V0QXR0cmlidXRlIGZvciB0aGlzIGdlb21ldHJ5LiIpO2xldCBvPXgodC52ZXJ0ZXhGb3JtYXQsZHQuREVGQVVMVCk7dGhpcy5fbWluaW11bT1hLmNsb25lKGUpLHRoaXMuX21heGltdW09YS5jbG9uZShuKSx0aGlzLl92ZXJ0ZXhGb3JtYXQ9byx0aGlzLl9vZmZzZXRBdHRyaWJ1dGU9dC5vZmZzZXRBdHRyaWJ1dGUsdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlQm94R2VvbWV0cnkifXZhciB4TSxjdyxhdyxmdyxzdyxyMCxTZixpMD1aKCgpPT57TWUoKTtGdCgpO1h0KCk7TGUoKTtJdCgpO2Z0KCk7SHQoKTtYZSgpO1llKCk7YW4oKTtMbygpO3RuKCk7RW8oKTt4TT1uZXcgYTtpci5mcm9tRGltZW5zaW9ucz1mdW5jdGlvbih0KXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IGU9dC5kaW1lbnNpb25zO3kudHlwZU9mLm9iamVjdCgiZGltZW5zaW9ucyIsZSkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImRpbWVuc2lvbnMueCIsZS54LDApLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJkaW1lbnNpb25zLnkiLGUueSwwKSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiZGltZW5zaW9ucy56IixlLnosMCk7bGV0IG49YS5tdWx0aXBseUJ5U2NhbGFyKGUsLjUsbmV3IGEpO3JldHVybiBuZXcgaXIoe21pbmltdW06YS5uZWdhdGUobixuZXcgYSksbWF4aW11bTpuLHZlcnRleEZvcm1hdDp0LnZlcnRleEZvcm1hdCxvZmZzZXRBdHRyaWJ1dGU6dC5vZmZzZXRBdHRyaWJ1dGV9KX07aXIuZnJvbUF4aXNBbGlnbmVkQm91bmRpbmdCb3g9ZnVuY3Rpb24odCl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiYm91bmRpbmdCb3giLHQpLG5ldyBpcih7bWluaW11bTp0Lm1pbmltdW0sbWF4aW11bTp0Lm1heGltdW19KX07aXIucGFja2VkTGVuZ3RoPTIqYS5wYWNrZWRMZW5ndGgrZHQucGFja2VkTGVuZ3RoKzE7aXIucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49eChuLDApLGEucGFjayh0Ll9taW5pbXVtLGUsbiksYS5wYWNrKHQuX21heGltdW0sZSxuK2EucGFja2VkTGVuZ3RoKSxkdC5wYWNrKHQuX3ZlcnRleEZvcm1hdCxlLG4rMiphLnBhY2tlZExlbmd0aCksZVtuKzIqYS5wYWNrZWRMZW5ndGgrZHQucGFja2VkTGVuZ3RoXT14KHQuX29mZnNldEF0dHJpYnV0ZSwtMSksZX07Y3c9bmV3IGEsYXc9bmV3IGEsZnc9bmV3IGR0LHN3PXttaW5pbXVtOmN3LG1heGltdW06YXcsdmVydGV4Rm9ybWF0OmZ3LG9mZnNldEF0dHJpYnV0ZTp2b2lkIDB9O2lyLnVucGFjaz1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCk7bGV0IG89YS51bnBhY2sodCxlLGN3KSxyPWEudW5wYWNrKHQsZSthLnBhY2tlZExlbmd0aCxhdyksaT1kdC51bnBhY2sodCxlKzIqYS5wYWNrZWRMZW5ndGgsZncpLHM9dFtlKzIqYS5wYWNrZWRMZW5ndGgrZHQucGFja2VkTGVuZ3RoXTtyZXR1cm4gaChuKT8obi5fbWluaW11bT1hLmNsb25lKG8sbi5fbWluaW11bSksbi5fbWF4aW11bT1hLmNsb25lKHIsbi5fbWF4aW11bSksbi5fdmVydGV4Rm9ybWF0PWR0LmNsb25lKGksbi5fdmVydGV4Rm9ybWF0KSxuLl9vZmZzZXRBdHRyaWJ1dGU9cz09PS0xP3ZvaWQgMDpzLG4pOihzdy5vZmZzZXRBdHRyaWJ1dGU9cz09PS0xP3ZvaWQgMDpzLG5ldyBpcihzdykpfTtpci5jcmVhdGVHZW9tZXRyeT1mdW5jdGlvbih0KXtsZXQgZT10Ll9taW5pbXVtLG49dC5fbWF4aW11bSxvPXQuX3ZlcnRleEZvcm1hdDtpZihhLmVxdWFscyhlLG4pKXJldHVybjtsZXQgcj1uZXcgaWUsaSxzO2lmKG8ucG9zaXRpb24mJihvLnN0fHxvLm5vcm1hbHx8by50YW5nZW50fHxvLmJpdGFuZ2VudCkpe2lmKG8ucG9zaXRpb24mJihzPW5ldyBGbG9hdDY0QXJyYXkoNio0KjMpLHNbMF09ZS54LHNbMV09ZS55LHNbMl09bi56LHNbM109bi54LHNbNF09ZS55LHNbNV09bi56LHNbNl09bi54LHNbN109bi55LHNbOF09bi56LHNbOV09ZS54LHNbMTBdPW4ueSxzWzExXT1uLnosc1sxMl09ZS54LHNbMTNdPWUueSxzWzE0XT1lLnosc1sxNV09bi54LHNbMTZdPWUueSxzWzE3XT1lLnosc1sxOF09bi54LHNbMTldPW4ueSxzWzIwXT1lLnosc1syMV09ZS54LHNbMjJdPW4ueSxzWzIzXT1lLnosc1syNF09bi54LHNbMjVdPWUueSxzWzI2XT1lLnosc1syN109bi54LHNbMjhdPW4ueSxzWzI5XT1lLnosc1szMF09bi54LHNbMzFdPW4ueSxzWzMyXT1uLnosc1szM109bi54LHNbMzRdPWUueSxzWzM1XT1uLnosc1szNl09ZS54LHNbMzddPWUueSxzWzM4XT1lLnosc1szOV09ZS54LHNbNDBdPW4ueSxzWzQxXT1lLnosc1s0Ml09ZS54LHNbNDNdPW4ueSxzWzQ0XT1uLnosc1s0NV09ZS54LHNbNDZdPWUueSxzWzQ3XT1uLnosc1s0OF09ZS54LHNbNDldPW4ueSxzWzUwXT1lLnosc1s1MV09bi54LHNbNTJdPW4ueSxzWzUzXT1lLnosc1s1NF09bi54LHNbNTVdPW4ueSxzWzU2XT1uLnosc1s1N109ZS54LHNbNThdPW4ueSxzWzU5XT1uLnosc1s2MF09ZS54LHNbNjFdPWUueSxzWzYyXT1lLnosc1s2M109bi54LHNbNjRdPWUueSxzWzY1XT1lLnosc1s2Nl09bi54LHNbNjddPWUueSxzWzY4XT1uLnosc1s2OV09ZS54LHNbNzBdPWUueSxzWzcxXT1uLnosci5wb3NpdGlvbj1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkRPVUJMRSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOnN9KSksby5ub3JtYWwpe2xldCBjPW5ldyBGbG9hdDMyQXJyYXkoNzIpO2NbMF09MCxjWzFdPTAsY1syXT0xLGNbM109MCxjWzRdPTAsY1s1XT0xLGNbNl09MCxjWzddPTAsY1s4XT0xLGNbOV09MCxjWzEwXT0wLGNbMTFdPTEsY1sxMl09MCxjWzEzXT0wLGNbMTRdPS0xLGNbMTVdPTAsY1sxNl09MCxjWzE3XT0tMSxjWzE4XT0wLGNbMTldPTAsY1syMF09LTEsY1syMV09MCxjWzIyXT0wLGNbMjNdPS0xLGNbMjRdPTEsY1syNV09MCxjWzI2XT0wLGNbMjddPTEsY1syOF09MCxjWzI5XT0wLGNbMzBdPTEsY1szMV09MCxjWzMyXT0wLGNbMzNdPTEsY1szNF09MCxjWzM1XT0wLGNbMzZdPS0xLGNbMzddPTAsY1szOF09MCxjWzM5XT0tMSxjWzQwXT0wLGNbNDFdPTAsY1s0Ml09LTEsY1s0M109MCxjWzQ0XT0wLGNbNDVdPS0xLGNbNDZdPTAsY1s0N109MCxjWzQ4XT0wLGNbNDldPTEsY1s1MF09MCxjWzUxXT0wLGNbNTJdPTEsY1s1M109MCxjWzU0XT0wLGNbNTVdPTEsY1s1Nl09MCxjWzU3XT0wLGNbNThdPTEsY1s1OV09MCxjWzYwXT0wLGNbNjFdPS0xLGNbNjJdPTAsY1s2M109MCxjWzY0XT0tMSxjWzY1XT0wLGNbNjZdPTAsY1s2N109LTEsY1s2OF09MCxjWzY5XT0wLGNbNzBdPS0xLGNbNzFdPTAsci5ub3JtYWw9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOmN9KX1pZihvLnN0KXtsZXQgYz1uZXcgRmxvYXQzMkFycmF5KDQ4KTtjWzBdPTAsY1sxXT0wLGNbMl09MSxjWzNdPTAsY1s0XT0xLGNbNV09MSxjWzZdPTAsY1s3XT0xLGNbOF09MSxjWzldPTAsY1sxMF09MCxjWzExXT0wLGNbMTJdPTAsY1sxM109MSxjWzE0XT0xLGNbMTVdPTEsY1sxNl09MCxjWzE3XT0wLGNbMThdPTEsY1sxOV09MCxjWzIwXT0xLGNbMjFdPTEsY1syMl09MCxjWzIzXT0xLGNbMjRdPTEsY1syNV09MCxjWzI2XT0wLGNbMjddPTAsY1syOF09MCxjWzI5XT0xLGNbMzBdPTEsY1szMV09MSxjWzMyXT0xLGNbMzNdPTAsY1szNF09MCxjWzM1XT0wLGNbMzZdPTAsY1szN109MSxjWzM4XT0xLGNbMzldPTEsY1s0MF09MCxjWzQxXT0wLGNbNDJdPTEsY1s0M109MCxjWzQ0XT0xLGNbNDVdPTEsY1s0Nl09MCxjWzQ3XT0xLHIuc3Q9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjIsdmFsdWVzOmN9KX1pZihvLnRhbmdlbnQpe2xldCBjPW5ldyBGbG9hdDMyQXJyYXkoNzIpO2NbMF09MSxjWzFdPTAsY1syXT0wLGNbM109MSxjWzRdPTAsY1s1XT0wLGNbNl09MSxjWzddPTAsY1s4XT0wLGNbOV09MSxjWzEwXT0wLGNbMTFdPTAsY1sxMl09LTEsY1sxM109MCxjWzE0XT0wLGNbMTVdPS0xLGNbMTZdPTAsY1sxN109MCxjWzE4XT0tMSxjWzE5XT0wLGNbMjBdPTAsY1syMV09LTEsY1syMl09MCxjWzIzXT0wLGNbMjRdPTAsY1syNV09MSxjWzI2XT0wLGNbMjddPTAsY1syOF09MSxjWzI5XT0wLGNbMzBdPTAsY1szMV09MSxjWzMyXT0wLGNbMzNdPTAsY1szNF09MSxjWzM1XT0wLGNbMzZdPTAsY1szN109LTEsY1szOF09MCxjWzM5XT0wLGNbNDBdPS0xLGNbNDFdPTAsY1s0Ml09MCxjWzQzXT0tMSxjWzQ0XT0wLGNbNDVdPTAsY1s0Nl09LTEsY1s0N109MCxjWzQ4XT0tMSxjWzQ5XT0wLGNbNTBdPTAsY1s1MV09LTEsY1s1Ml09MCxjWzUzXT0wLGNbNTRdPS0xLGNbNTVdPTAsY1s1Nl09MCxjWzU3XT0tMSxjWzU4XT0wLGNbNTldPTAsY1s2MF09MSxjWzYxXT0wLGNbNjJdPTAsY1s2M109MSxjWzY0XT0wLGNbNjVdPTAsY1s2Nl09MSxjWzY3XT0wLGNbNjhdPTAsY1s2OV09MSxjWzcwXT0wLGNbNzFdPTAsci50YW5nZW50PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpjfSl9aWYoby5iaXRhbmdlbnQpe2xldCBjPW5ldyBGbG9hdDMyQXJyYXkoNzIpO2NbMF09MCxjWzFdPTEsY1syXT0wLGNbM109MCxjWzRdPTEsY1s1XT0wLGNbNl09MCxjWzddPTEsY1s4XT0wLGNbOV09MCxjWzEwXT0xLGNbMTFdPTAsY1sxMl09MCxjWzEzXT0xLGNbMTRdPTAsY1sxNV09MCxjWzE2XT0xLGNbMTddPTAsY1sxOF09MCxjWzE5XT0xLGNbMjBdPTAsY1syMV09MCxjWzIyXT0xLGNbMjNdPTAsY1syNF09MCxjWzI1XT0wLGNbMjZdPTEsY1syN109MCxjWzI4XT0wLGNbMjldPTEsY1szMF09MCxjWzMxXT0wLGNbMzJdPTEsY1szM109MCxjWzM0XT0wLGNbMzVdPTEsY1szNl09MCxjWzM3XT0wLGNbMzhdPTEsY1szOV09MCxjWzQwXT0wLGNbNDFdPTEsY1s0Ml09MCxjWzQzXT0wLGNbNDRdPTEsY1s0NV09MCxjWzQ2XT0wLGNbNDddPTEsY1s0OF09MCxjWzQ5XT0wLGNbNTBdPTEsY1s1MV09MCxjWzUyXT0wLGNbNTNdPTEsY1s1NF09MCxjWzU1XT0wLGNbNTZdPTEsY1s1N109MCxjWzU4XT0wLGNbNTldPTEsY1s2MF09MCxjWzYxXT0wLGNbNjJdPTEsY1s2M109MCxjWzY0XT0wLGNbNjVdPTEsY1s2Nl09MCxjWzY3XT0wLGNbNjhdPTEsY1s2OV09MCxjWzcwXT0wLGNbNzFdPTEsci5iaXRhbmdlbnQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOmN9KX1pPW5ldyBVaW50MTZBcnJheSg2KjIqMyksaVswXT0wLGlbMV09MSxpWzJdPTIsaVszXT0wLGlbNF09MixpWzVdPTMsaVs2XT02LGlbN109NSxpWzhdPTQsaVs5XT03LGlbMTBdPTYsaVsxMV09NCxpWzEyXT04LGlbMTNdPTksaVsxNF09MTAsaVsxNV09OCxpWzE2XT0xMCxpWzE3XT0xMSxpWzE4XT0xNCxpWzE5XT0xMyxpWzIwXT0xMixpWzIxXT0xNSxpWzIyXT0xNCxpWzIzXT0xMixpWzI0XT0xOCxpWzI1XT0xNyxpWzI2XT0xNixpWzI3XT0xOSxpWzI4XT0xOCxpWzI5XT0xNixpWzMwXT0yMCxpWzMxXT0yMSxpWzMyXT0yMixpWzMzXT0yMCxpWzM0XT0yMixpWzM1XT0yM31lbHNlIHM9bmV3IEZsb2F0NjRBcnJheSg4KjMpLHNbMF09ZS54LHNbMV09ZS55LHNbMl09ZS56LHNbM109bi54LHNbNF09ZS55LHNbNV09ZS56LHNbNl09bi54LHNbN109bi55LHNbOF09ZS56LHNbOV09ZS54LHNbMTBdPW4ueSxzWzExXT1lLnosc1sxMl09ZS54LHNbMTNdPWUueSxzWzE0XT1uLnosc1sxNV09bi54LHNbMTZdPWUueSxzWzE3XT1uLnosc1sxOF09bi54LHNbMTldPW4ueSxzWzIwXT1uLnosc1syMV09ZS54LHNbMjJdPW4ueSxzWzIzXT1uLnosci5wb3NpdGlvbj1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkRPVUJMRSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOnN9KSxpPW5ldyBVaW50MTZBcnJheSg2KjIqMyksaVswXT00LGlbMV09NSxpWzJdPTYsaVszXT00LGlbNF09NixpWzVdPTcsaVs2XT0xLGlbN109MCxpWzhdPTMsaVs5XT0xLGlbMTBdPTMsaVsxMV09MixpWzEyXT0xLGlbMTNdPTYsaVsxNF09NSxpWzE1XT0xLGlbMTZdPTIsaVsxN109NixpWzE4XT0yLGlbMTldPTMsaVsyMF09NyxpWzIxXT0yLGlbMjJdPTcsaVsyM109NixpWzI0XT0zLGlbMjVdPTAsaVsyNl09NCxpWzI3XT0zLGlbMjhdPTQsaVsyOV09NyxpWzMwXT0wLGlbMzFdPTEsaVszMl09NSxpWzMzXT0wLGlbMzRdPTUsaVszNV09NDtsZXQgZj1hLnN1YnRyYWN0KG4sZSx4TSksdT1hLm1hZ25pdHVkZShmKSouNTtpZihoKHQuX29mZnNldEF0dHJpYnV0ZSkpe2xldCBjPXMubGVuZ3RoLGw9dC5fb2Zmc2V0QXR0cmlidXRlPT09ZmUuTk9ORT8wOjEscD1uZXcgVWludDhBcnJheShjLzMpLmZpbGwobCk7ci5hcHBseU9mZnNldD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LlVOU0lHTkVEX0JZVEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZToxLHZhbHVlczpwfSl9cmV0dXJuIG5ldyBVdCh7YXR0cmlidXRlczpyLGluZGljZXM6aSxwcmltaXRpdmVUeXBlOkJ0LlRSSUFOR0xFUyxib3VuZGluZ1NwaGVyZTpuZXcgQXQoYS5aRVJPLHUpLG9mZnNldEF0dHJpYnV0ZTp0Ll9vZmZzZXRBdHRyaWJ1dGV9KX07aXIuZ2V0VW5pdEJveD1mdW5jdGlvbigpe3JldHVybiBoKHIwKXx8KHIwPWlyLmNyZWF0ZUdlb21ldHJ5KGlyLmZyb21EaW1lbnNpb25zKHtkaW1lbnNpb25zOm5ldyBhKDEsMSwxKSx2ZXJ0ZXhGb3JtYXQ6ZHQuUE9TSVRJT05fT05MWX0pKSkscjB9O1NmPWlyfSk7dmFyIHMwPXt9O2RlKHMwLHtkZWZhdWx0OigpPT5NTX0pO2Z1bmN0aW9uIFBNKHQsZSl7cmV0dXJuIGgoZSkmJih0PVNmLnVucGFjayh0LGUpKSxTZi5jcmVhdGVHZW9tZXRyeSh0KX12YXIgTU0sYzA9WigoKT0+e2kwKCk7ZnQoKTtNTT1QTX0pO2Z1bmN0aW9uIGNpKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKTtsZXQgZT10Lm1pbmltdW0sbj10Lm1heGltdW07aWYoeS50eXBlT2Yub2JqZWN0KCJtaW4iLGUpLHkudHlwZU9mLm9iamVjdCgibWF4IixuKSxoKHQub2Zmc2V0QXR0cmlidXRlKSYmdC5vZmZzZXRBdHRyaWJ1dGU9PT1mZS5UT1ApdGhyb3cgbmV3IEYoIkdlb21ldHJ5T2Zmc2V0QXR0cmlidXRlLlRPUCBpcyBub3QgYSBzdXBwb3J0ZWQgb3B0aW9ucy5vZmZzZXRBdHRyaWJ1dGUgZm9yIHRoaXMgZ2VvbWV0cnkuIik7dGhpcy5fbWluPWEuY2xvbmUoZSksdGhpcy5fbWF4PWEuY2xvbmUobiksdGhpcy5fb2Zmc2V0QXR0cmlidXRlPXQub2Zmc2V0QXR0cmlidXRlLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZUJveE91dGxpbmVHZW9tZXRyeSJ9dmFyIE5NLGx3LHB3LHV3LGEwLGR3PVooKCk9PntNZSgpO0Z0KCk7WHQoKTtMZSgpO0l0KCk7ZnQoKTtIdCgpO1hlKCk7WWUoKTthbigpO0xvKCk7dG4oKTtOTT1uZXcgYTtjaS5mcm9tRGltZW5zaW9ucz1mdW5jdGlvbih0KXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IGU9dC5kaW1lbnNpb25zO3kudHlwZU9mLm9iamVjdCgiZGltZW5zaW9ucyIsZSkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImRpbWVuc2lvbnMueCIsZS54LDApLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJkaW1lbnNpb25zLnkiLGUueSwwKSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiZGltZW5zaW9ucy56IixlLnosMCk7bGV0IG49YS5tdWx0aXBseUJ5U2NhbGFyKGUsLjUsbmV3IGEpO3JldHVybiBuZXcgY2koe21pbmltdW06YS5uZWdhdGUobixuZXcgYSksbWF4aW11bTpuLG9mZnNldEF0dHJpYnV0ZTp0Lm9mZnNldEF0dHJpYnV0ZX0pfTtjaS5mcm9tQXhpc0FsaWduZWRCb3VuZGluZ0JveD1mdW5jdGlvbih0KXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJib3VuZGluZEJveCIsdCksbmV3IGNpKHttaW5pbXVtOnQubWluaW11bSxtYXhpbXVtOnQubWF4aW11bX0pfTtjaS5wYWNrZWRMZW5ndGg9MiphLnBhY2tlZExlbmd0aCsxO2NpLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxuPXgobiwwKSxhLnBhY2sodC5fbWluLGUsbiksYS5wYWNrKHQuX21heCxlLG4rYS5wYWNrZWRMZW5ndGgpLGVbbithLnBhY2tlZExlbmd0aCoyXT14KHQuX29mZnNldEF0dHJpYnV0ZSwtMSksZX07bHc9bmV3IGEscHc9bmV3IGEsdXc9e21pbmltdW06bHcsbWF4aW11bTpwdyxvZmZzZXRBdHRyaWJ1dGU6dm9pZCAwfTtjaS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3kuZGVmaW5lZCgiYXJyYXkiLHQpLGU9eChlLDApO2xldCBvPWEudW5wYWNrKHQsZSxsdykscj1hLnVucGFjayh0LGUrYS5wYWNrZWRMZW5ndGgscHcpLGk9dFtlK2EucGFja2VkTGVuZ3RoKjJdO3JldHVybiBoKG4pPyhuLl9taW49YS5jbG9uZShvLG4uX21pbiksbi5fbWF4PWEuY2xvbmUocixuLl9tYXgpLG4uX29mZnNldEF0dHJpYnV0ZT1pPT09LTE/dm9pZCAwOmksbik6KHV3Lm9mZnNldEF0dHJpYnV0ZT1pPT09LTE/dm9pZCAwOmksbmV3IGNpKHV3KSl9O2NpLmNyZWF0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQpe2xldCBlPXQuX21pbixuPXQuX21heDtpZihhLmVxdWFscyhlLG4pKXJldHVybjtsZXQgbz1uZXcgaWUscj1uZXcgVWludDE2QXJyYXkoMTIqMiksaT1uZXcgRmxvYXQ2NEFycmF5KDgqMyk7aVswXT1lLngsaVsxXT1lLnksaVsyXT1lLnosaVszXT1uLngsaVs0XT1lLnksaVs1XT1lLnosaVs2XT1uLngsaVs3XT1uLnksaVs4XT1lLnosaVs5XT1lLngsaVsxMF09bi55LGlbMTFdPWUueixpWzEyXT1lLngsaVsxM109ZS55LGlbMTRdPW4ueixpWzE1XT1uLngsaVsxNl09ZS55LGlbMTddPW4ueixpWzE4XT1uLngsaVsxOV09bi55LGlbMjBdPW4ueixpWzIxXT1lLngsaVsyMl09bi55LGlbMjNdPW4ueixvLnBvc2l0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6aX0pLHJbMF09NCxyWzFdPTUsclsyXT01LHJbM109NixyWzRdPTYscls1XT03LHJbNl09NyxyWzddPTQscls4XT0wLHJbOV09MSxyWzEwXT0xLHJbMTFdPTIsclsxMl09MixyWzEzXT0zLHJbMTRdPTMsclsxNV09MCxyWzE2XT0wLHJbMTddPTQsclsxOF09MSxyWzE5XT01LHJbMjBdPTIsclsyMV09NixyWzIyXT0zLHJbMjNdPTc7bGV0IHM9YS5zdWJ0cmFjdChuLGUsTk0pLGY9YS5tYWduaXR1ZGUocykqLjU7aWYoaCh0Ll9vZmZzZXRBdHRyaWJ1dGUpKXtsZXQgdT1pLmxlbmd0aCxjPXQuX29mZnNldEF0dHJpYnV0ZT09PWZlLk5PTkU/MDoxLGw9bmV3IFVpbnQ4QXJyYXkodS8zKS5maWxsKGMpO28uYXBwbHlPZmZzZXQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5VTlNJR05FRF9CWVRFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6MSx2YWx1ZXM6bH0pfXJldHVybiBuZXcgVXQoe2F0dHJpYnV0ZXM6byxpbmRpY2VzOnIscHJpbWl0aXZlVHlwZTpCdC5MSU5FUyxib3VuZGluZ1NwaGVyZTpuZXcgQXQoYS5aRVJPLGYpLG9mZnNldEF0dHJpYnV0ZTp0Ll9vZmZzZXRBdHRyaWJ1dGV9KX07YTA9Y2l9KTt2YXIgZjA9e307ZGUoZjAse2RlZmF1bHQ6KCk9PnZNfSk7ZnVuY3Rpb24gSU0odCxlKXtyZXR1cm4gaChlKSYmKHQ9YTAudW5wYWNrKHQsZSkpLGEwLmNyZWF0ZUdlb21ldHJ5KHQpfXZhciB2TSx1MD1aKCgpPT57ZHcoKTtmdCgpO3ZNPUlNfSk7ZnVuY3Rpb24gY2EodCxlLG4sbyxyLGkscyxmLHUsYyl7bGV0IGw9dCtlO2EubXVsdGlwbHlCeVNjYWxhcihvLE1hdGguY29zKGwpLGpwKSxhLm11bHRpcGx5QnlTY2FsYXIobixNYXRoLnNpbihsKSxtdyksYS5hZGQoanAsbXcsanApO2xldCBwPU1hdGguY29zKHQpO3A9cCpwO2xldCBkPU1hdGguc2luKHQpO2Q9ZCpkO2xldCBfPWkvTWF0aC5zcXJ0KHMqcCtyKmQpL2Y7cmV0dXJuIGVlLmZyb21BeGlzQW5nbGUoanAsXyxodyksSi5mcm9tUXVhdGVybmlvbihodyxfdyksSi5tdWx0aXBseUJ5VmVjdG9yKF93LHUsYyksYS5ub3JtYWxpemUoYyxjKSxhLm11bHRpcGx5QnlTY2FsYXIoYyxmLGMpLGN9dmFyIHAwLGpwLG13LGh3LF93LHl3LGd3LGwwLExNLERNLEZNLEJNLGtyLGQwPVooKCk9PntGdCgpO1d0KCk7Rm4oKTtXbygpO3AwPXt9LGpwPW5ldyBhLG13PW5ldyBhLGh3PW5ldyBlZSxfdz1uZXcgSjt5dz1uZXcgYSxndz1uZXcgYSxsMD1uZXcgYSxMTT1uZXcgYTtwMC5yYWlzZVBvc2l0aW9uc1RvSGVpZ2h0PWZ1bmN0aW9uKHQsZSxuKXtsZXQgbz1lLmVsbGlwc29pZCxyPWUuaGVpZ2h0LGk9ZS5leHRydWRlZEhlaWdodCxzPW4/dC5sZW5ndGgvMyoyOnQubGVuZ3RoLzMsZj1uZXcgRmxvYXQ2NEFycmF5KHMqMyksdT10Lmxlbmd0aCxjPW4/dTowO2ZvcihsZXQgbD0wO2w8dTtsKz0zKXtsZXQgcD1sKzEsZD1sKzIsbT1hLmZyb21BcnJheSh0LGwseXcpO28uc2NhbGVUb0dlb2RldGljU3VyZmFjZShtLG0pO2xldCBfPWEuY2xvbmUobSxndyksZz1vLmdlb2RldGljU3VyZmFjZU5vcm1hbChtLExNKSxiPWEubXVsdGlwbHlCeVNjYWxhcihnLHIsbDApO2EuYWRkKG0sYixtKSxuJiYoYS5tdWx0aXBseUJ5U2NhbGFyKGcsaSxiKSxhLmFkZChfLGIsXyksZltsK2NdPV8ueCxmW3ArY109Xy55LGZbZCtjXT1fLnopLGZbbF09bS54LGZbcF09bS55LGZbZF09bS56fXJldHVybiBmfTtETT1uZXcgYSxGTT1uZXcgYSxCTT1uZXcgYTtwMC5jb21wdXRlRWxsaXBzZVBvc2l0aW9ucz1mdW5jdGlvbih0LGUsbil7bGV0IG89dC5zZW1pTWlub3JBeGlzLHI9dC5zZW1pTWFqb3JBeGlzLGk9dC5yb3RhdGlvbixzPXQuY2VudGVyLGY9dC5ncmFudWxhcml0eSo4LHU9bypvLGM9cipyLGw9cipvLHA9YS5tYWduaXR1ZGUocyksZD1hLm5vcm1hbGl6ZShzLERNKSxtPWEuY3Jvc3MoYS5VTklUX1oscyxGTSk7bT1hLm5vcm1hbGl6ZShtLG0pO2xldCBfPWEuY3Jvc3MoZCxtLEJNKSxnPTErTWF0aC5jZWlsKE0uUElfT1ZFUl9UV08vZiksYj1NLlBJX09WRVJfVFdPLyhnLTEpLHc9TS5QSV9PVkVSX1RXTy1nKmI7dzwwJiYoZy09TWF0aC5jZWlsKE1hdGguYWJzKHcpL2IpKTtsZXQgTz0yKihnKihnKzIpKSxFPWU/bmV3IEFycmF5KE8qMyk6dm9pZCAwLFQ9MCxDPXl3LE49Z3csST1nKjQqMyxEPUktMSx2PTAsTD1uP25ldyBBcnJheShJKTp2b2lkIDAsVSxBLFMsUCxCO2Zvcih3PU0uUElfT1ZFUl9UV08sQz1jYSh3LGksXyxtLHUsbCxjLHAsZCxDKSxlJiYoRVtUKytdPUMueCxFW1QrK109Qy55LEVbVCsrXT1DLnopLG4mJihMW0QtLV09Qy56LExbRC0tXT1DLnksTFtELS1dPUMueCksdz1NLlBJX09WRVJfVFdPLWIsVT0xO1U8ZysxOysrVSl7aWYoQz1jYSh3LGksXyxtLHUsbCxjLHAsZCxDKSxOPWNhKE1hdGguUEktdyxpLF8sbSx1LGwsYyxwLGQsTiksZSl7Zm9yKEVbVCsrXT1DLngsRVtUKytdPUMueSxFW1QrK109Qy56LFM9MipVKzIsQT0xO0E8Uy0xOysrQSlQPUEvKFMtMSksQj1hLmxlcnAoQyxOLFAsbDApLEVbVCsrXT1CLngsRVtUKytdPUIueSxFW1QrK109Qi56O0VbVCsrXT1OLngsRVtUKytdPU4ueSxFW1QrK109Ti56fW4mJihMW0QtLV09Qy56LExbRC0tXT1DLnksTFtELS1dPUMueCxMW3YrK109Ti54LExbdisrXT1OLnksTFt2KytdPU4ueiksdz1NLlBJX09WRVJfVFdPLShVKzEpKmJ9Zm9yKFU9ZztVPjE7LS1VKXtpZih3PU0uUElfT1ZFUl9UV08tKFUtMSkqYixDPWNhKC13LGksXyxtLHUsbCxjLHAsZCxDKSxOPWNhKHcrTWF0aC5QSSxpLF8sbSx1LGwsYyxwLGQsTiksZSl7Zm9yKEVbVCsrXT1DLngsRVtUKytdPUMueSxFW1QrK109Qy56LFM9MiooVS0xKSsyLEE9MTtBPFMtMTsrK0EpUD1BLyhTLTEpLEI9YS5sZXJwKEMsTixQLGwwKSxFW1QrK109Qi54LEVbVCsrXT1CLnksRVtUKytdPUIuejtFW1QrK109Ti54LEVbVCsrXT1OLnksRVtUKytdPU4uen1uJiYoTFtELS1dPUMueixMW0QtLV09Qy55LExbRC0tXT1DLngsTFt2KytdPU4ueCxMW3YrK109Ti55LExbdisrXT1OLnopfXc9TS5QSV9PVkVSX1RXTyxDPWNhKC13LGksXyxtLHUsbCxjLHAsZCxDKTtsZXQgaj17fTtyZXR1cm4gZSYmKEVbVCsrXT1DLngsRVtUKytdPUMueSxFW1QrK109Qy56LGoucG9zaXRpb25zPUUsai5udW1QdHM9ZyksbiYmKExbRC0tXT1DLnosTFtELS1dPUMueSxMW0QtLV09Qy54LGoub3V0ZXJQb3NpdGlvbnM9TCksan07a3I9cDB9KTtmdW5jdGlvbiBVTSh0KXtpZih0PXgodCx4LkVNUFRZX09CSkVDVCksIWgodC5nZW9tZXRyeSkpdGhyb3cgbmV3IEYoIm9wdGlvbnMuZ2VvbWV0cnkgaXMgcmVxdWlyZWQuIik7dGhpcy5nZW9tZXRyeT10Lmdlb21ldHJ5LHRoaXMubW9kZWxNYXRyaXg9c3QuY2xvbmUoeCh0Lm1vZGVsTWF0cml4LHN0LklERU5USVRZKSksdGhpcy5pZD10LmlkLHRoaXMucGlja1ByaW1pdGl2ZT10LnBpY2tQcmltaXRpdmUsdGhpcy5hdHRyaWJ1dGVzPXgodC5hdHRyaWJ1dGVzLHt9KSx0aGlzLndlc3RIZW1pc3BoZXJlR2VvbWV0cnk9dm9pZCAwLHRoaXMuZWFzdEhlbWlzcGhlcmVHZW9tZXRyeT12b2lkIDB9dmFyIGNvLHNjPVooKCk9PntJdCgpO2Z0KCk7SHQoKTtCbigpO2NvPVVNfSk7ZnVuY3Rpb24gQ3codCxlLG4pe2xldCBvPWUudmVydGV4Rm9ybWF0LHI9ZS5jZW50ZXIsaT1lLnNlbWlNYWpvckF4aXMscz1lLnNlbWlNaW5vckF4aXMsZj1lLmVsbGlwc29pZCx1PWUuc3RSb3RhdGlvbixjPW4/dC5sZW5ndGgvMyoyOnQubGVuZ3RoLzMsbD1lLnNoYWRvd1ZvbHVtZSxwPW8uc3Q/bmV3IEZsb2F0MzJBcnJheShjKjIpOnZvaWQgMCxkPW8ubm9ybWFsP25ldyBGbG9hdDMyQXJyYXkoYyozKTp2b2lkIDAsbT1vLnRhbmdlbnQ/bmV3IEZsb2F0MzJBcnJheShjKjMpOnZvaWQgMCxfPW8uYml0YW5nZW50P25ldyBGbG9hdDMyQXJyYXkoYyozKTp2b2lkIDAsZz1sP25ldyBGbG9hdDMyQXJyYXkoYyozKTp2b2lkIDAsYj0wLHc9d3csTz1UdyxFPU93LFQ9bmV3IFFuKGYpLEM9VC5wcm9qZWN0KGYuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMocixLcCksRXcpLE49Zi5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKHIsYWEpO2YuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKE4sTik7bGV0IEk9YncsRD1WTTtpZih1IT09MCl7bGV0IEI9ZWUuZnJvbUF4aXNBbmdsZShOLHUsXzApO0k9Si5mcm9tUXVhdGVybmlvbihCLEkpLEI9ZWUuZnJvbUF4aXNBbmdsZShOLC11LF8wKSxEPUouZnJvbVF1YXRlcm5pb24oQixEKX1lbHNlIEk9Si5jbG9uZShKLklERU5USVRZLEkpLEQ9Si5jbG9uZShKLklERU5USVRZLEQpO2xldCB2PXR0LmZyb21FbGVtZW50cyhOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFJ3KSxMPXR0LmZyb21FbGVtZW50cyhOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLFN3KSxVPXQubGVuZ3RoLEE9bj9VOjAsUz1BLzMqMjtmb3IobGV0IEI9MDtCPFU7Qis9Myl7bGV0IGo9QisxLEg9QisyLGs9YS5mcm9tQXJyYXkodCxCLGFhKTtpZihvLnN0KXtsZXQgSz1KLm11bHRpcGx5QnlWZWN0b3IoSSxrLG0wKSxYPVQucHJvamVjdChmLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKEssS3ApLGgwKTthLnN1YnRyYWN0KFgsQyxYKSxZbi54PShYLngraSkvKDIqaSksWW4ueT0oWC55K3MpLygyKnMpLHYueD1NYXRoLm1pbihZbi54LHYueCksdi55PU1hdGgubWluKFluLnksdi55KSxMLng9TWF0aC5tYXgoWW4ueCxMLngpLEwueT1NYXRoLm1heChZbi55LEwueSksbiYmKHBbYitTXT1Zbi54LHBbYisxK1NdPVluLnkpLHBbYisrXT1Zbi54LHBbYisrXT1Zbi55fShvLm5vcm1hbHx8by50YW5nZW50fHxvLmJpdGFuZ2VudHx8bCkmJih3PWYuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGssdyksbCYmKGdbQitBXT0tdy54LGdbaitBXT0tdy55LGdbSCtBXT0tdy56KSwoby5ub3JtYWx8fG8udGFuZ2VudHx8by5iaXRhbmdlbnQpJiYoKG8udGFuZ2VudHx8by5iaXRhbmdlbnQpJiYoTz1hLm5vcm1hbGl6ZShhLmNyb3NzKGEuVU5JVF9aLHcsTyksTyksSi5tdWx0aXBseUJ5VmVjdG9yKEQsTyxPKSksby5ub3JtYWwmJihkW0JdPXcueCxkW2pdPXcueSxkW0hdPXcueixuJiYoZFtCK0FdPS13LngsZFtqK0FdPS13LnksZFtIK0FdPS13LnopKSxvLnRhbmdlbnQmJihtW0JdPU8ueCxtW2pdPU8ueSxtW0hdPU8ueixuJiYobVtCK0FdPS1PLngsbVtqK0FdPS1PLnksbVtIK0FdPS1PLnopKSxvLmJpdGFuZ2VudCYmKEU9YS5ub3JtYWxpemUoYS5jcm9zcyh3LE8sRSksRSksX1tCXT1FLngsX1tqXT1FLnksX1tIXT1FLnosbiYmKF9bQitBXT1FLngsX1tqK0FdPUUueSxfW0grQV09RS56KSkpKX1pZihvLnN0KXtVPXAubGVuZ3RoO2ZvcihsZXQgQj0wO0I8VTtCKz0yKXBbQl09KHBbQl0tdi54KS8oTC54LXYueCkscFtCKzFdPShwW0IrMV0tdi55KS8oTC55LXYueSl9bGV0IFA9bmV3IGllO2lmKG8ucG9zaXRpb24pe2xldCBCPWtyLnJhaXNlUG9zaXRpb25zVG9IZWlnaHQodCxlLG4pO1AucG9zaXRpb249bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpCfSl9aWYoby5zdCYmKFAuc3Q9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjIsdmFsdWVzOnB9KSksby5ub3JtYWwmJihQLm5vcm1hbD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6ZH0pKSxvLnRhbmdlbnQmJihQLnRhbmdlbnQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOm19KSksby5iaXRhbmdlbnQmJihQLmJpdGFuZ2VudD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6X30pKSxsJiYoUC5leHRydWRlRGlyZWN0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpnfSkpLG4mJmgoZS5vZmZzZXRBdHRyaWJ1dGUpKXtsZXQgQj1uZXcgVWludDhBcnJheShjKTtpZihlLm9mZnNldEF0dHJpYnV0ZT09PWZlLlRPUClCPUIuZmlsbCgxLDAsYy8yKTtlbHNle2xldCBqPWUub2Zmc2V0QXR0cmlidXRlPT09ZmUuTk9ORT8wOjE7Qj1CLmZpbGwoail9UC5hcHBseU9mZnNldD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LlVOU0lHTkVEX0JZVEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZToxLHZhbHVlczpCfSl9cmV0dXJuIFB9ZnVuY3Rpb24geHcodCl7bGV0IGU9bmV3IEFycmF5KDEyKih0Kih0KzEpKS02KSxuPTAsbyxyLGkscyxmO2ZvcihvPTAsaT0xLHM9MDtzPDM7cysrKWVbbisrXT1pKyssZVtuKytdPW8sZVtuKytdPWk7Zm9yKHM9MjtzPHQrMTsrK3Mpe2ZvcihpPXMqKHMrMSktMSxvPShzLTEpKnMtMSxlW24rK109aSsrLGVbbisrXT1vLGVbbisrXT1pLHI9MipzLGY9MDtmPHItMTsrK2YpZVtuKytdPWksZVtuKytdPW8rKyxlW24rK109byxlW24rK109aSsrLGVbbisrXT1vLGVbbisrXT1pO2VbbisrXT1pKyssZVtuKytdPW8sZVtuKytdPWl9Zm9yKHI9dCoyLCsraSwrK28scz0wO3M8ci0xOysrcyllW24rK109aSxlW24rK109bysrLGVbbisrXT1vLGVbbisrXT1pKyssZVtuKytdPW8sZVtuKytdPWk7Zm9yKGVbbisrXT1pLGVbbisrXT1vKyssZVtuKytdPW8sZVtuKytdPWkrKyxlW24rK109bysrLGVbbisrXT1vLCsrbyxzPXQtMTtzPjE7LS1zKXtmb3IoZVtuKytdPW8rKyxlW24rK109byxlW24rK109aSxyPTIqcyxmPTA7ZjxyLTE7KytmKWVbbisrXT1pLGVbbisrXT1vKyssZVtuKytdPW8sZVtuKytdPWkrKyxlW24rK109byxlW24rK109aTtlW24rK109bysrLGVbbisrXT1vKyssZVtuKytdPWkrK31mb3Iocz0wO3M8MztzKyspZVtuKytdPW8rKyxlW24rK109byxlW24rK109aTtyZXR1cm4gZX1mdW5jdGlvbiBrTSh0KXtsZXQgZT10LmNlbnRlcjtjYz1hLm11bHRpcGx5QnlTY2FsYXIodC5lbGxpcHNvaWQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGUsY2MpLHQuaGVpZ2h0LGNjKSxjYz1hLmFkZChlLGNjLGNjKTtsZXQgbj1uZXcgQXQoY2MsdC5zZW1pTWFqb3JBeGlzKSxvPWtyLmNvbXB1dGVFbGxpcHNlUG9zaXRpb25zKHQsITAsITEpLHI9by5wb3NpdGlvbnMsaT1vLm51bVB0cyxzPUN3KHIsdCwhMSksZj14dyhpKTtyZXR1cm4gZj1EdC5jcmVhdGVUeXBlZEFycmF5KHIubGVuZ3RoLzMsZikse2JvdW5kaW5nU3BoZXJlOm4sYXR0cmlidXRlczpzLGluZGljZXM6Zn19ZnVuY3Rpb24gR00odCxlKXtsZXQgbj1lLnZlcnRleEZvcm1hdCxvPWUuY2VudGVyLHI9ZS5zZW1pTWFqb3JBeGlzLGk9ZS5zZW1pTWlub3JBeGlzLHM9ZS5lbGxpcHNvaWQsZj1lLmhlaWdodCx1PWUuZXh0cnVkZWRIZWlnaHQsYz1lLnN0Um90YXRpb24sbD10Lmxlbmd0aC8zKjIscD1uZXcgRmxvYXQ2NEFycmF5KGwqMyksZD1uLnN0P25ldyBGbG9hdDMyQXJyYXkobCoyKTp2b2lkIDAsbT1uLm5vcm1hbD9uZXcgRmxvYXQzMkFycmF5KGwqMyk6dm9pZCAwLF89bi50YW5nZW50P25ldyBGbG9hdDMyQXJyYXkobCozKTp2b2lkIDAsZz1uLmJpdGFuZ2VudD9uZXcgRmxvYXQzMkFycmF5KGwqMyk6dm9pZCAwLGI9ZS5zaGFkb3dWb2x1bWUsdz1iP25ldyBGbG9hdDMyQXJyYXkobCozKTp2b2lkIDAsTz0wLEU9d3csVD1UdyxDPU93LE49bmV3IFFuKHMpLEk9Ti5wcm9qZWN0KHMuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMobyxLcCksRXcpLEQ9cy5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKG8sYWEpO3MuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKEQsRCk7bGV0IHY9ZWUuZnJvbUF4aXNBbmdsZShELGMsXzApLEw9Si5mcm9tUXVhdGVybmlvbih2LGJ3KSxVPXR0LmZyb21FbGVtZW50cyhOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFJ3KSxBPXR0LmZyb21FbGVtZW50cyhOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLFN3KSxTPXQubGVuZ3RoLFA9Uy8zKjI7Zm9yKGxldCBqPTA7ajxTO2orPTMpe2xldCBIPWorMSxrPWorMixLPWEuZnJvbUFycmF5KHQsaixhYSksWDtpZihuLnN0KXtsZXQgb3Q9Si5tdWx0aXBseUJ5VmVjdG9yKEwsSyxtMCksY3Q9Ti5wcm9qZWN0KHMuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMob3QsS3ApLGgwKTthLnN1YnRyYWN0KGN0LEksY3QpLFluLng9KGN0LngrcikvKDIqciksWW4ueT0oY3QueStpKS8oMippKSxVLng9TWF0aC5taW4oWW4ueCxVLngpLFUueT1NYXRoLm1pbihZbi55LFUueSksQS54PU1hdGgubWF4KFluLngsQS54KSxBLnk9TWF0aC5tYXgoWW4ueSxBLnkpLGRbTytQXT1Zbi54LGRbTysxK1BdPVluLnksZFtPKytdPVluLngsZFtPKytdPVluLnl9Sz1zLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UoSyxLKSxYPWEuY2xvbmUoSyxtMCksRT1zLmdlb2RldGljU3VyZmFjZU5vcm1hbChLLEUpLGImJih3W2orU109LUUueCx3W0grU109LUUueSx3W2srU109LUUueik7bGV0IFI9YS5tdWx0aXBseUJ5U2NhbGFyKEUsZixBdyk7aWYoSz1hLmFkZChLLFIsSyksUj1hLm11bHRpcGx5QnlTY2FsYXIoRSx1LFIpLFg9YS5hZGQoWCxSLFgpLG4ucG9zaXRpb24mJihwW2orU109WC54LHBbSCtTXT1YLnkscFtrK1NdPVgueixwW2pdPUsueCxwW0hdPUsueSxwW2tdPUsueiksbi5ub3JtYWx8fG4udGFuZ2VudHx8bi5iaXRhbmdlbnQpe0M9YS5jbG9uZShFLEMpO2xldCBvdD1hLmZyb21BcnJheSh0LChqKzMpJVMsQXcpO2Euc3VidHJhY3Qob3QsSyxvdCk7bGV0IGN0PWEuc3VidHJhY3QoWCxLLGgwKTtFPWEubm9ybWFsaXplKGEuY3Jvc3MoY3Qsb3QsRSksRSksbi5ub3JtYWwmJihtW2pdPUUueCxtW0hdPUUueSxtW2tdPUUueixtW2orU109RS54LG1bSCtTXT1FLnksbVtrK1NdPUUueiksbi50YW5nZW50JiYoVD1hLm5vcm1hbGl6ZShhLmNyb3NzKEMsRSxUKSxUKSxfW2pdPVQueCxfW0hdPVQueSxfW2tdPVQueixfW2orU109VC54LF9baisxK1NdPVQueSxfW2orMitTXT1ULnopLG4uYml0YW5nZW50JiYoZ1tqXT1DLngsZ1tIXT1DLnksZ1trXT1DLnosZ1tqK1NdPUMueCxnW0grU109Qy55LGdbaytTXT1DLnopfX1pZihuLnN0KXtTPWQubGVuZ3RoO2ZvcihsZXQgaj0wO2o8UztqKz0yKWRbal09KGRbal0tVS54KS8oQS54LVUueCksZFtqKzFdPShkW2orMV0tVS55KS8oQS55LVUueSl9bGV0IEI9bmV3IGllO2lmKG4ucG9zaXRpb24mJihCLnBvc2l0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6cH0pKSxuLnN0JiYoQi5zdD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Mix2YWx1ZXM6ZH0pKSxuLm5vcm1hbCYmKEIubm9ybWFsPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczptfSkpLG4udGFuZ2VudCYmKEIudGFuZ2VudD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6X30pKSxuLmJpdGFuZ2VudCYmKEIuYml0YW5nZW50PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpnfSkpLGImJihCLmV4dHJ1ZGVEaXJlY3Rpb249bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOnd9KSksaChlLm9mZnNldEF0dHJpYnV0ZSkpe2xldCBqPW5ldyBVaW50OEFycmF5KGwpO2lmKGUub2Zmc2V0QXR0cmlidXRlPT09ZmUuVE9QKWo9ai5maWxsKDEsMCxsLzIpO2Vsc2V7bGV0IEg9ZS5vZmZzZXRBdHRyaWJ1dGU9PT1mZS5OT05FPzA6MTtqPWouZmlsbChIKX1CLmFwcGx5T2Zmc2V0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuVU5TSUdORURfQllURSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjEsdmFsdWVzOmp9KX1yZXR1cm4gQn1mdW5jdGlvbiB6TSh0KXtsZXQgZT10Lmxlbmd0aC8zLG49RHQuY3JlYXRlVHlwZWRBcnJheShlLGUqNiksbz0wO2ZvcihsZXQgcj0wO3I8ZTtyKyspe2xldCBpPXIscz1yK2UsZj0oaSsxKSVlLHU9ZitlO25bbysrXT1pLG5bbysrXT1zLG5bbysrXT1mLG5bbysrXT1mLG5bbysrXT1zLG5bbysrXT11fXJldHVybiBufWZ1bmN0aW9uIGpNKHQpe2xldCBlPXQuY2VudGVyLG49dC5lbGxpcHNvaWQsbz10LnNlbWlNYWpvckF4aXMscj1hLm11bHRpcGx5QnlTY2FsYXIobi5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoZSxhYSksdC5oZWlnaHQsYWEpO0hwLmNlbnRlcj1hLmFkZChlLHIsSHAuY2VudGVyKSxIcC5yYWRpdXM9byxyPWEubXVsdGlwbHlCeVNjYWxhcihuLmdlb2RldGljU3VyZmFjZU5vcm1hbChlLHIpLHQuZXh0cnVkZWRIZWlnaHQscikscXAuY2VudGVyPWEuYWRkKGUscixxcC5jZW50ZXIpLHFwLnJhZGl1cz1vO2xldCBpPWtyLmNvbXB1dGVFbGxpcHNlUG9zaXRpb25zKHQsITAsITApLHM9aS5wb3NpdGlvbnMsZj1pLm51bVB0cyx1PWkub3V0ZXJQb3NpdGlvbnMsYz1BdC51bmlvbihIcCxxcCksbD1DdyhzLHQsITApLHA9eHcoZiksZD1wLmxlbmd0aDtwLmxlbmd0aD1kKjI7bGV0IG09cy5sZW5ndGgvMztmb3IobGV0IFQ9MDtUPGQ7VCs9MylwW1QrZF09cFtUKzJdK20scFtUKzErZF09cFtUKzFdK20scFtUKzIrZF09cFtUXSttO2xldCBfPUR0LmNyZWF0ZVR5cGVkQXJyYXkobSoyLzMscCksZz1uZXcgVXQoe2F0dHJpYnV0ZXM6bCxpbmRpY2VzOl8scHJpbWl0aXZlVHlwZTpCdC5UUklBTkdMRVN9KSxiPUdNKHUsdCk7cD16TSh1KTtsZXQgdz1EdC5jcmVhdGVUeXBlZEFycmF5KHUubGVuZ3RoKjIvMyxwKSxPPW5ldyBVdCh7YXR0cmlidXRlczpiLGluZGljZXM6dyxwcmltaXRpdmVUeXBlOkJ0LlRSSUFOR0xFU30pLEU9VmUuY29tYmluZUluc3RhbmNlcyhbbmV3IGNvKHtnZW9tZXRyeTpnfSksbmV3IGNvKHtnZW9tZXRyeTpPfSldKTtyZXR1cm57Ym91bmRpbmdTcGhlcmU6YyxhdHRyaWJ1dGVzOkVbMF0uYXR0cmlidXRlcyxpbmRpY2VzOkVbMF0uaW5kaWNlc319ZnVuY3Rpb24gUHcodCxlLG4sbyxyLGkscyl7bGV0IHU9a3IuY29tcHV0ZUVsbGlwc2VQb3NpdGlvbnMoe2NlbnRlcjp0LHNlbWlNYWpvckF4aXM6ZSxzZW1pTWlub3JBeGlzOm4scm90YXRpb246byxncmFudWxhcml0eTpyfSwhMSwhMCkub3V0ZXJQb3NpdGlvbnMsYz11Lmxlbmd0aC8zLGw9bmV3IEFycmF5KGMpO2ZvcihsZXQgZD0wO2Q8YzsrK2QpbFtkXT1hLmZyb21BcnJheSh1LGQqMyk7bGV0IHA9TnQuZnJvbUNhcnRlc2lhbkFycmF5KGwsaSxzKTtyZXR1cm4gcC53aWR0aD5NLlBJJiYocC5ub3J0aD1wLm5vcnRoPjA/TS5QSV9PVkVSX1RXTy1NLkVQU0lMT043OnAubm9ydGgscC5zb3V0aD1wLnNvdXRoPDA/TS5FUFNJTE9ONy1NLlBJX09WRVJfVFdPOnAuc291dGgscC5lYXN0PU0uUEkscC53ZXN0PS1NLlBJKSxwfWZ1bmN0aW9uIGZpKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKTtsZXQgZT10LmNlbnRlcixuPXgodC5lbGxpcHNvaWQsJC5XR1M4NCksbz10LnNlbWlNYWpvckF4aXMscj10LnNlbWlNaW5vckF4aXMsaT14KHQuZ3JhbnVsYXJpdHksTS5SQURJQU5TX1BFUl9ERUdSRUUpLHM9eCh0LnZlcnRleEZvcm1hdCxkdC5ERUZBVUxUKTtpZih5LmRlZmluZWQoIm9wdGlvbnMuY2VudGVyIixlKSx5LnR5cGVPZi5udW1iZXIoIm9wdGlvbnMuc2VtaU1ham9yQXhpcyIsbykseS50eXBlT2YubnVtYmVyKCJvcHRpb25zLnNlbWlNaW5vckF4aXMiLHIpLG88cil0aHJvdyBuZXcgRigic2VtaU1ham9yQXhpcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc2VtaU1pbm9yQXhpcy4iKTtpZihpPD0wKXRocm93IG5ldyBGKCJncmFudWxhcml0eSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpO2xldCBmPXgodC5oZWlnaHQsMCksdT14KHQuZXh0cnVkZWRIZWlnaHQsZik7dGhpcy5fY2VudGVyPWEuY2xvbmUoZSksdGhpcy5fc2VtaU1ham9yQXhpcz1vLHRoaXMuX3NlbWlNaW5vckF4aXM9cix0aGlzLl9lbGxpcHNvaWQ9JC5jbG9uZShuKSx0aGlzLl9yb3RhdGlvbj14KHQucm90YXRpb24sMCksdGhpcy5fc3RSb3RhdGlvbj14KHQuc3RSb3RhdGlvbiwwKSx0aGlzLl9oZWlnaHQ9TWF0aC5tYXgodSxmKSx0aGlzLl9ncmFudWxhcml0eT1pLHRoaXMuX3ZlcnRleEZvcm1hdD1kdC5jbG9uZShzKSx0aGlzLl9leHRydWRlZEhlaWdodD1NYXRoLm1pbih1LGYpLHRoaXMuX3NoYWRvd1ZvbHVtZT14KHQuc2hhZG93Vm9sdW1lLCExKSx0aGlzLl93b3JrZXJOYW1lPSJjcmVhdGVFbGxpcHNlR2VvbWV0cnkiLHRoaXMuX29mZnNldEF0dHJpYnV0ZT10Lm9mZnNldEF0dHJpYnV0ZSx0aGlzLl9yZWN0YW5nbGU9dm9pZCAwLHRoaXMuX3RleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHM9dm9pZCAwfWZ1bmN0aW9uIEhNKHQpe2xldCBlPS10Ll9zdFJvdGF0aW9uO2lmKGU9PT0wKXJldHVyblswLDAsMCwxLDEsMF07bGV0IG89a3IuY29tcHV0ZUVsbGlwc2VQb3NpdGlvbnMoe2NlbnRlcjp0Ll9jZW50ZXIsc2VtaU1ham9yQXhpczp0Ll9zZW1pTWFqb3JBeGlzLHNlbWlNaW5vckF4aXM6dC5fc2VtaU1pbm9yQXhpcyxyb3RhdGlvbjp0Ll9yb3RhdGlvbixncmFudWxhcml0eTp0Ll9ncmFudWxhcml0eX0sITEsITApLm91dGVyUG9zaXRpb25zLHI9by5sZW5ndGgvMyxpPW5ldyBBcnJheShyKTtmb3IobGV0IHU9MDt1PHI7Kyt1KWlbdV09YS5mcm9tQXJyYXkobyx1KjMpO2xldCBzPXQuX2VsbGlwc29pZCxmPXQucmVjdGFuZ2xlO3JldHVybiBVdC5fdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50cyhpLGUscyxmKX12YXIgYWEsbTAsaDAsQXcsWW4sYncsVk0sXzAsd3csVHcsT3csS3AsRXcsUncsU3csY2MsSHAscXAsTXcsTncsSXcsYWksR3IseTA9WigoKT0+e01lKCk7RmUoKTtGdCgpO1BlKCk7WHQoKTtMZSgpO0l0KCk7ZnQoKTtIdCgpO2QwKCk7WnQoKTtTaSgpO1hlKCk7WWUoKTthbigpO3NjKCk7TG8oKTtzaSgpOyRlKCk7V3QoKTtGbigpO3RuKCk7V28oKTt3bigpO0VvKCk7YWE9bmV3IGEsbTA9bmV3IGEsaDA9bmV3IGEsQXc9bmV3IGEsWW49bmV3IHR0LGJ3PW5ldyBKLFZNPW5ldyBKLF8wPW5ldyBlZSx3dz1uZXcgYSxUdz1uZXcgYSxPdz1uZXcgYSxLcD1uZXcgYXQsRXc9bmV3IGEsUnc9bmV3IHR0LFN3PW5ldyB0dDtjYz1uZXcgYTtIcD1uZXcgQXQscXA9bmV3IEF0O2ZpLnBhY2tlZExlbmd0aD1hLnBhY2tlZExlbmd0aCskLnBhY2tlZExlbmd0aCtkdC5wYWNrZWRMZW5ndGgrOTtmaS5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS5kZWZpbmVkKCJ2YWx1ZSIsdCkseS5kZWZpbmVkKCJhcnJheSIsZSksbj14KG4sMCksYS5wYWNrKHQuX2NlbnRlcixlLG4pLG4rPWEucGFja2VkTGVuZ3RoLCQucGFjayh0Ll9lbGxpcHNvaWQsZSxuKSxuKz0kLnBhY2tlZExlbmd0aCxkdC5wYWNrKHQuX3ZlcnRleEZvcm1hdCxlLG4pLG4rPWR0LnBhY2tlZExlbmd0aCxlW24rK109dC5fc2VtaU1ham9yQXhpcyxlW24rK109dC5fc2VtaU1pbm9yQXhpcyxlW24rK109dC5fcm90YXRpb24sZVtuKytdPXQuX3N0Um90YXRpb24sZVtuKytdPXQuX2hlaWdodCxlW24rK109dC5fZ3JhbnVsYXJpdHksZVtuKytdPXQuX2V4dHJ1ZGVkSGVpZ2h0LGVbbisrXT10Ll9zaGFkb3dWb2x1bWU/MTowLGVbbl09eCh0Ll9vZmZzZXRBdHRyaWJ1dGUsLTEpLGV9O013PW5ldyBhLE53PW5ldyAkLEl3PW5ldyBkdCxhaT17Y2VudGVyOk13LGVsbGlwc29pZDpOdyx2ZXJ0ZXhGb3JtYXQ6SXcsc2VtaU1ham9yQXhpczp2b2lkIDAsc2VtaU1pbm9yQXhpczp2b2lkIDAscm90YXRpb246dm9pZCAwLHN0Um90YXRpb246dm9pZCAwLGhlaWdodDp2b2lkIDAsZ3JhbnVsYXJpdHk6dm9pZCAwLGV4dHJ1ZGVkSGVpZ2h0OnZvaWQgMCxzaGFkb3dWb2x1bWU6dm9pZCAwLG9mZnNldEF0dHJpYnV0ZTp2b2lkIDB9O2ZpLnVucGFjaz1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCk7bGV0IG89YS51bnBhY2sodCxlLE13KTtlKz1hLnBhY2tlZExlbmd0aDtsZXQgcj0kLnVucGFjayh0LGUsTncpO2UrPSQucGFja2VkTGVuZ3RoO2xldCBpPWR0LnVucGFjayh0LGUsSXcpO2UrPWR0LnBhY2tlZExlbmd0aDtsZXQgcz10W2UrK10sZj10W2UrK10sdT10W2UrK10sYz10W2UrK10sbD10W2UrK10scD10W2UrK10sZD10W2UrK10sbT10W2UrK109PT0xLF89dFtlXTtyZXR1cm4gaChuKT8obi5fY2VudGVyPWEuY2xvbmUobyxuLl9jZW50ZXIpLG4uX2VsbGlwc29pZD0kLmNsb25lKHIsbi5fZWxsaXBzb2lkKSxuLl92ZXJ0ZXhGb3JtYXQ9ZHQuY2xvbmUoaSxuLl92ZXJ0ZXhGb3JtYXQpLG4uX3NlbWlNYWpvckF4aXM9cyxuLl9zZW1pTWlub3JBeGlzPWYsbi5fcm90YXRpb249dSxuLl9zdFJvdGF0aW9uPWMsbi5faGVpZ2h0PWwsbi5fZ3JhbnVsYXJpdHk9cCxuLl9leHRydWRlZEhlaWdodD1kLG4uX3NoYWRvd1ZvbHVtZT1tLG4uX29mZnNldEF0dHJpYnV0ZT1fPT09LTE/dm9pZCAwOl8sbik6KGFpLmhlaWdodD1sLGFpLmV4dHJ1ZGVkSGVpZ2h0PWQsYWkuZ3JhbnVsYXJpdHk9cCxhaS5zdFJvdGF0aW9uPWMsYWkucm90YXRpb249dSxhaS5zZW1pTWFqb3JBeGlzPXMsYWkuc2VtaU1pbm9yQXhpcz1mLGFpLnNoYWRvd1ZvbHVtZT1tLGFpLm9mZnNldEF0dHJpYnV0ZT1fPT09LTE/dm9pZCAwOl8sbmV3IGZpKGFpKSl9O2ZpLmNvbXB1dGVSZWN0YW5nbGU9ZnVuY3Rpb24odCxlKXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IG49dC5jZW50ZXIsbz14KHQuZWxsaXBzb2lkLCQuV0dTODQpLHI9dC5zZW1pTWFqb3JBeGlzLGk9dC5zZW1pTWlub3JBeGlzLHM9eCh0LmdyYW51bGFyaXR5LE0uUkFESUFOU19QRVJfREVHUkVFKSxmPXgodC5yb3RhdGlvbiwwKTtpZih5LmRlZmluZWQoIm9wdGlvbnMuY2VudGVyIixuKSx5LnR5cGVPZi5udW1iZXIoIm9wdGlvbnMuc2VtaU1ham9yQXhpcyIscikseS50eXBlT2YubnVtYmVyKCJvcHRpb25zLnNlbWlNaW5vckF4aXMiLGkpLHI8aSl0aHJvdyBuZXcgRigic2VtaU1ham9yQXhpcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc2VtaU1pbm9yQXhpcy4iKTtpZihzPD0wKXRocm93IG5ldyBGKCJncmFudWxhcml0eSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpO3JldHVybiBQdyhuLHIsaSxmLHMsbyxlKX07ZmkuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7aWYodC5fc2VtaU1ham9yQXhpczw9MHx8dC5fc2VtaU1pbm9yQXhpczw9MClyZXR1cm47bGV0IGU9dC5faGVpZ2h0LG49dC5fZXh0cnVkZWRIZWlnaHQsbz0hTS5lcXVhbHNFcHNpbG9uKGUsbiwwLE0uRVBTSUxPTjIpO3QuX2NlbnRlcj10Ll9lbGxpcHNvaWQuc2NhbGVUb0dlb2RldGljU3VyZmFjZSh0Ll9jZW50ZXIsdC5fY2VudGVyKTtsZXQgcj17Y2VudGVyOnQuX2NlbnRlcixzZW1pTWFqb3JBeGlzOnQuX3NlbWlNYWpvckF4aXMsc2VtaU1pbm9yQXhpczp0Ll9zZW1pTWlub3JBeGlzLGVsbGlwc29pZDp0Ll9lbGxpcHNvaWQscm90YXRpb246dC5fcm90YXRpb24saGVpZ2h0OmUsZ3JhbnVsYXJpdHk6dC5fZ3JhbnVsYXJpdHksdmVydGV4Rm9ybWF0OnQuX3ZlcnRleEZvcm1hdCxzdFJvdGF0aW9uOnQuX3N0Um90YXRpb259LGk7aWYobylyLmV4dHJ1ZGVkSGVpZ2h0PW4sci5zaGFkb3dWb2x1bWU9dC5fc2hhZG93Vm9sdW1lLHIub2Zmc2V0QXR0cmlidXRlPXQuX29mZnNldEF0dHJpYnV0ZSxpPWpNKHIpO2Vsc2UgaWYoaT1rTShyKSxoKHQuX29mZnNldEF0dHJpYnV0ZSkpe2xldCBzPWkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMubGVuZ3RoLGY9dC5fb2Zmc2V0QXR0cmlidXRlPT09ZmUuTk9ORT8wOjEsdT1uZXcgVWludDhBcnJheShzLzMpLmZpbGwoZik7aS5hdHRyaWJ1dGVzLmFwcGx5T2Zmc2V0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuVU5TSUdORURfQllURSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjEsdmFsdWVzOnV9KX1yZXR1cm4gbmV3IFV0KHthdHRyaWJ1dGVzOmkuYXR0cmlidXRlcyxpbmRpY2VzOmkuaW5kaWNlcyxwcmltaXRpdmVUeXBlOkJ0LlRSSUFOR0xFUyxib3VuZGluZ1NwaGVyZTppLmJvdW5kaW5nU3BoZXJlLG9mZnNldEF0dHJpYnV0ZTp0Ll9vZmZzZXRBdHRyaWJ1dGV9KX07ZmkuY3JlYXRlU2hhZG93Vm9sdW1lPWZ1bmN0aW9uKHQsZSxuKXtsZXQgbz10Ll9ncmFudWxhcml0eSxyPXQuX2VsbGlwc29pZCxpPWUobyxyKSxzPW4obyxyKTtyZXR1cm4gbmV3IGZpKHtjZW50ZXI6dC5fY2VudGVyLHNlbWlNYWpvckF4aXM6dC5fc2VtaU1ham9yQXhpcyxzZW1pTWlub3JBeGlzOnQuX3NlbWlNaW5vckF4aXMsZWxsaXBzb2lkOnIscm90YXRpb246dC5fcm90YXRpb24sc3RSb3RhdGlvbjp0Ll9zdFJvdGF0aW9uLGdyYW51bGFyaXR5Om8sZXh0cnVkZWRIZWlnaHQ6aSxoZWlnaHQ6cyx2ZXJ0ZXhGb3JtYXQ6ZHQuUE9TSVRJT05fT05MWSxzaGFkb3dWb2x1bWU6ITB9KX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZmkucHJvdG90eXBlLHtyZWN0YW5nbGU6e2dldDpmdW5jdGlvbigpe3JldHVybiBoKHRoaXMuX3JlY3RhbmdsZSl8fCh0aGlzLl9yZWN0YW5nbGU9UHcodGhpcy5fY2VudGVyLHRoaXMuX3NlbWlNYWpvckF4aXMsdGhpcy5fc2VtaU1pbm9yQXhpcyx0aGlzLl9yb3RhdGlvbix0aGlzLl9ncmFudWxhcml0eSx0aGlzLl9lbGxpcHNvaWQpKSx0aGlzLl9yZWN0YW5nbGV9fSx0ZXh0dXJlQ29vcmRpbmF0ZVJvdGF0aW9uUG9pbnRzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaCh0aGlzLl90ZXh0dXJlQ29vcmRpbmF0ZVJvdGF0aW9uUG9pbnRzKXx8KHRoaXMuX3RleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHM9SE0odGhpcykpLHRoaXMuX3RleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHN9fX0pO0dyPWZpfSk7ZnVuY3Rpb24gdmkodCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXQucmFkaXVzO3kudHlwZU9mLm51bWJlcigicmFkaXVzIixlKTtsZXQgbj17Y2VudGVyOnQuY2VudGVyLHNlbWlNYWpvckF4aXM6ZSxzZW1pTWlub3JBeGlzOmUsZWxsaXBzb2lkOnQuZWxsaXBzb2lkLGhlaWdodDp0LmhlaWdodCxleHRydWRlZEhlaWdodDp0LmV4dHJ1ZGVkSGVpZ2h0LGdyYW51bGFyaXR5OnQuZ3JhbnVsYXJpdHksdmVydGV4Rm9ybWF0OnQudmVydGV4Rm9ybWF0LHN0Um90YXRpb246dC5zdFJvdGF0aW9uLHNoYWRvd1ZvbHVtZTp0LnNoYWRvd1ZvbHVtZX07dGhpcy5fZWxsaXBzZUdlb21ldHJ5PW5ldyBHcihuKSx0aGlzLl93b3JrZXJOYW1lPSJjcmVhdGVDaXJjbGVHZW9tZXRyeSJ9dmFyIHFNLFJvLGcwLHZ3PVooKCk9PntGdCgpO1h0KCk7SXQoKTtmdCgpO3kwKCk7WnQoKTtFbygpO3ZpLnBhY2tlZExlbmd0aD1Hci5wYWNrZWRMZW5ndGg7dmkucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLEdyLnBhY2sodC5fZWxsaXBzZUdlb21ldHJ5LGUsbil9O3FNPW5ldyBHcih7Y2VudGVyOm5ldyBhLHNlbWlNYWpvckF4aXM6MSxzZW1pTWlub3JBeGlzOjF9KSxSbz17Y2VudGVyOm5ldyBhLHJhZGl1czp2b2lkIDAsZWxsaXBzb2lkOiQuY2xvbmUoJC5VTklUX1NQSEVSRSksaGVpZ2h0OnZvaWQgMCxleHRydWRlZEhlaWdodDp2b2lkIDAsZ3JhbnVsYXJpdHk6dm9pZCAwLHZlcnRleEZvcm1hdDpuZXcgZHQsc3RSb3RhdGlvbjp2b2lkIDAsc2VtaU1ham9yQXhpczp2b2lkIDAsc2VtaU1pbm9yQXhpczp2b2lkIDAsc2hhZG93Vm9sdW1lOnZvaWQgMH07dmkudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtsZXQgbz1Hci51bnBhY2sodCxlLHFNKTtyZXR1cm4gUm8uY2VudGVyPWEuY2xvbmUoby5fY2VudGVyLFJvLmNlbnRlciksUm8uZWxsaXBzb2lkPSQuY2xvbmUoby5fZWxsaXBzb2lkLFJvLmVsbGlwc29pZCksUm8uaGVpZ2h0PW8uX2hlaWdodCxSby5leHRydWRlZEhlaWdodD1vLl9leHRydWRlZEhlaWdodCxSby5ncmFudWxhcml0eT1vLl9ncmFudWxhcml0eSxSby52ZXJ0ZXhGb3JtYXQ9ZHQuY2xvbmUoby5fdmVydGV4Rm9ybWF0LFJvLnZlcnRleEZvcm1hdCksUm8uc3RSb3RhdGlvbj1vLl9zdFJvdGF0aW9uLFJvLnNoYWRvd1ZvbHVtZT1vLl9zaGFkb3dWb2x1bWUsaChuKT8oUm8uc2VtaU1ham9yQXhpcz1vLl9zZW1pTWFqb3JBeGlzLFJvLnNlbWlNaW5vckF4aXM9by5fc2VtaU1pbm9yQXhpcyxuLl9lbGxpcHNlR2VvbWV0cnk9bmV3IEdyKFJvKSxuKTooUm8ucmFkaXVzPW8uX3NlbWlNYWpvckF4aXMsbmV3IHZpKFJvKSl9O3ZpLmNyZWF0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQpe3JldHVybiBHci5jcmVhdGVHZW9tZXRyeSh0Ll9lbGxpcHNlR2VvbWV0cnkpfTt2aS5jcmVhdGVTaGFkb3dWb2x1bWU9ZnVuY3Rpb24odCxlLG4pe2xldCBvPXQuX2VsbGlwc2VHZW9tZXRyeS5fZ3JhbnVsYXJpdHkscj10Ll9lbGxpcHNlR2VvbWV0cnkuX2VsbGlwc29pZCxpPWUobyxyKSxzPW4obyxyKTtyZXR1cm4gbmV3IHZpKHtjZW50ZXI6dC5fZWxsaXBzZUdlb21ldHJ5Ll9jZW50ZXIscmFkaXVzOnQuX2VsbGlwc2VHZW9tZXRyeS5fc2VtaU1ham9yQXhpcyxlbGxpcHNvaWQ6cixzdFJvdGF0aW9uOnQuX2VsbGlwc2VHZW9tZXRyeS5fc3RSb3RhdGlvbixncmFudWxhcml0eTpvLGV4dHJ1ZGVkSGVpZ2h0OmksaGVpZ2h0OnMsdmVydGV4Rm9ybWF0OmR0LlBPU0lUSU9OX09OTFksc2hhZG93Vm9sdW1lOiEwfSl9O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHZpLnByb3RvdHlwZSx7cmVjdGFuZ2xlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxsaXBzZUdlb21ldHJ5LnJlY3RhbmdsZX19LHRleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHM6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbGxpcHNlR2VvbWV0cnkudGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50c319fSk7ZzA9dml9KTt2YXIgQTA9e307ZGUoQTAse2RlZmF1bHQ6KCk9PldNfSk7ZnVuY3Rpb24gS00odCxlKXtyZXR1cm4gaChlKSYmKHQ9ZzAudW5wYWNrKHQsZSkpLHQuX2VsbGlwc2VHZW9tZXRyeS5fY2VudGVyPWEuY2xvbmUodC5fZWxsaXBzZUdlb21ldHJ5Ll9jZW50ZXIpLHQuX2VsbGlwc2VHZW9tZXRyeS5fZWxsaXBzb2lkPSQuY2xvbmUodC5fZWxsaXBzZUdlb21ldHJ5Ll9lbGxpcHNvaWQpLGcwLmNyZWF0ZUdlb21ldHJ5KHQpfXZhciBXTSxiMD1aKCgpPT57RnQoKTt2dygpO2Z0KCk7WnQoKTtXTT1LTX0pO2Z1bmN0aW9uIFhNKHQpe2xldCBlPXQuY2VudGVyO2FjPWEubXVsdGlwbHlCeVNjYWxhcih0LmVsbGlwc29pZC5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoZSxhYyksdC5oZWlnaHQsYWMpLGFjPWEuYWRkKGUsYWMsYWMpO2xldCBuPW5ldyBBdChhYyx0LnNlbWlNYWpvckF4aXMpLG89a3IuY29tcHV0ZUVsbGlwc2VQb3NpdGlvbnModCwhMSwhMCkub3V0ZXJQb3NpdGlvbnMscj1uZXcgaWUoe3Bvc2l0aW9uOm5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6a3IucmFpc2VQb3NpdGlvbnNUb0hlaWdodChvLHQsITEpfSl9KSxpPW8ubGVuZ3RoLzMscz1EdC5jcmVhdGVUeXBlZEFycmF5KGksaSoyKSxmPTA7Zm9yKGxldCB1PTA7dTxpOysrdSlzW2YrK109dSxzW2YrK109KHUrMSklaTtyZXR1cm57Ym91bmRpbmdTcGhlcmU6bixhdHRyaWJ1dGVzOnIsaW5kaWNlczpzfX1mdW5jdGlvbiBZTSh0KXtsZXQgZT10LmNlbnRlcixuPXQuZWxsaXBzb2lkLG89dC5zZW1pTWFqb3JBeGlzLHI9YS5tdWx0aXBseUJ5U2NhbGFyKG4uZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGUsTHcpLHQuaGVpZ2h0LEx3KTtXcC5jZW50ZXI9YS5hZGQoZSxyLFdwLmNlbnRlciksV3AucmFkaXVzPW8scj1hLm11bHRpcGx5QnlTY2FsYXIobi5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoZSxyKSx0LmV4dHJ1ZGVkSGVpZ2h0LHIpLFhwLmNlbnRlcj1hLmFkZChlLHIsWHAuY2VudGVyKSxYcC5yYWRpdXM9bztsZXQgaT1rci5jb21wdXRlRWxsaXBzZVBvc2l0aW9ucyh0LCExLCEwKS5vdXRlclBvc2l0aW9ucyxzPW5ldyBpZSh7cG9zaXRpb246bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczprci5yYWlzZVBvc2l0aW9uc1RvSGVpZ2h0KGksdCwhMCl9KX0pO2k9cy5wb3NpdGlvbi52YWx1ZXM7bGV0IGY9QXQudW5pb24oV3AsWHApLHU9aS5sZW5ndGgvMztpZihoKHQub2Zmc2V0QXR0cmlidXRlKSl7bGV0IF89bmV3IFVpbnQ4QXJyYXkodSk7aWYodC5vZmZzZXRBdHRyaWJ1dGU9PT1mZS5UT1ApXz1fLmZpbGwoMSwwLHUvMik7ZWxzZXtsZXQgZz10Lm9mZnNldEF0dHJpYnV0ZT09PWZlLk5PTkU/MDoxO189Xy5maWxsKGcpfXMuYXBwbHlPZmZzZXQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5VTlNJR05FRF9CWVRFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6MSx2YWx1ZXM6X30pfWxldCBjPXgodC5udW1iZXJPZlZlcnRpY2FsTGluZXMsMTYpO2M9TS5jbGFtcChjLDAsdS8yKTtsZXQgbD1EdC5jcmVhdGVUeXBlZEFycmF5KHUsdSoyK2MqMik7dS89MjtsZXQgcD0wLGQ7Zm9yKGQ9MDtkPHU7KytkKWxbcCsrXT1kLGxbcCsrXT0oZCsxKSV1LGxbcCsrXT1kK3UsbFtwKytdPShkKzEpJXUrdTtsZXQgbTtpZihjPjApe2xldCBfPU1hdGgubWluKGMsdSk7bT1NYXRoLnJvdW5kKHUvXyk7bGV0IGc9TWF0aC5taW4obSpjLHUpO2ZvcihkPTA7ZDxnO2QrPW0pbFtwKytdPWQsbFtwKytdPWQrdX1yZXR1cm57Ym91bmRpbmdTcGhlcmU6ZixhdHRyaWJ1dGVzOnMsaW5kaWNlczpsfX1mdW5jdGlvbiBmYSh0KXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IGU9dC5jZW50ZXIsbj14KHQuZWxsaXBzb2lkLCQuV0dTODQpLG89dC5zZW1pTWFqb3JBeGlzLHI9dC5zZW1pTWlub3JBeGlzLGk9eCh0LmdyYW51bGFyaXR5LE0uUkFESUFOU19QRVJfREVHUkVFKTtpZighaChlKSl0aHJvdyBuZXcgRigiY2VudGVyIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG8pKXRocm93IG5ldyBGKCJzZW1pTWFqb3JBeGlzIGlzIHJlcXVpcmVkLiIpO2lmKCFoKHIpKXRocm93IG5ldyBGKCJzZW1pTWlub3JBeGlzIGlzIHJlcXVpcmVkLiIpO2lmKG88cil0aHJvdyBuZXcgRigic2VtaU1ham9yQXhpcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc2VtaU1pbm9yQXhpcy4iKTtpZihpPD0wKXRocm93IG5ldyBGKCJncmFudWxhcml0eSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpO2xldCBzPXgodC5oZWlnaHQsMCksZj14KHQuZXh0cnVkZWRIZWlnaHQscyk7dGhpcy5fY2VudGVyPWEuY2xvbmUoZSksdGhpcy5fc2VtaU1ham9yQXhpcz1vLHRoaXMuX3NlbWlNaW5vckF4aXM9cix0aGlzLl9lbGxpcHNvaWQ9JC5jbG9uZShuKSx0aGlzLl9yb3RhdGlvbj14KHQucm90YXRpb24sMCksdGhpcy5faGVpZ2h0PU1hdGgubWF4KGYscyksdGhpcy5fZ3JhbnVsYXJpdHk9aSx0aGlzLl9leHRydWRlZEhlaWdodD1NYXRoLm1pbihmLHMpLHRoaXMuX251bWJlck9mVmVydGljYWxMaW5lcz1NYXRoLm1heCh4KHQubnVtYmVyT2ZWZXJ0aWNhbExpbmVzLDE2KSwwKSx0aGlzLl9vZmZzZXRBdHRyaWJ1dGU9dC5vZmZzZXRBdHRyaWJ1dGUsdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlRWxsaXBzZU91dGxpbmVHZW9tZXRyeSJ9dmFyIEx3LGFjLFdwLFhwLER3LEZ3LExpLHpyLHcwPVooKCk9PntNZSgpO0Z0KCk7TGUoKTtJdCgpO2Z0KCk7SHQoKTtkMCgpO1p0KCk7WGUoKTtZZSgpO2FuKCk7TG8oKTskZSgpO1d0KCk7dG4oKTtMdz1uZXcgYSxhYz1uZXcgYTtXcD1uZXcgQXQsWHA9bmV3IEF0O2ZhLnBhY2tlZExlbmd0aD1hLnBhY2tlZExlbmd0aCskLnBhY2tlZExlbmd0aCs4O2ZhLnBhY2s9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBGKCJ2YWx1ZSBpcyByZXF1aXJlZCIpO2lmKCFoKGUpKXRocm93IG5ldyBGKCJhcnJheSBpcyByZXF1aXJlZCIpO3JldHVybiBuPXgobiwwKSxhLnBhY2sodC5fY2VudGVyLGUsbiksbis9YS5wYWNrZWRMZW5ndGgsJC5wYWNrKHQuX2VsbGlwc29pZCxlLG4pLG4rPSQucGFja2VkTGVuZ3RoLGVbbisrXT10Ll9zZW1pTWFqb3JBeGlzLGVbbisrXT10Ll9zZW1pTWlub3JBeGlzLGVbbisrXT10Ll9yb3RhdGlvbixlW24rK109dC5faGVpZ2h0LGVbbisrXT10Ll9ncmFudWxhcml0eSxlW24rK109dC5fZXh0cnVkZWRIZWlnaHQsZVtuKytdPXQuX251bWJlck9mVmVydGljYWxMaW5lcyxlW25dPXgodC5fb2Zmc2V0QXR0cmlidXRlLC0xKSxlfTtEdz1uZXcgYSxGdz1uZXcgJCxMaT17Y2VudGVyOkR3LGVsbGlwc29pZDpGdyxzZW1pTWFqb3JBeGlzOnZvaWQgMCxzZW1pTWlub3JBeGlzOnZvaWQgMCxyb3RhdGlvbjp2b2lkIDAsaGVpZ2h0OnZvaWQgMCxncmFudWxhcml0eTp2b2lkIDAsZXh0cnVkZWRIZWlnaHQ6dm9pZCAwLG51bWJlck9mVmVydGljYWxMaW5lczp2b2lkIDAsb2Zmc2V0QXR0cmlidXRlOnZvaWQgMH07ZmEudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgRigiYXJyYXkgaXMgcmVxdWlyZWQiKTtlPXgoZSwwKTtsZXQgbz1hLnVucGFjayh0LGUsRHcpO2UrPWEucGFja2VkTGVuZ3RoO2xldCByPSQudW5wYWNrKHQsZSxGdyk7ZSs9JC5wYWNrZWRMZW5ndGg7bGV0IGk9dFtlKytdLHM9dFtlKytdLGY9dFtlKytdLHU9dFtlKytdLGM9dFtlKytdLGw9dFtlKytdLHA9dFtlKytdLGQ9dFtlXTtyZXR1cm4gaChuKT8obi5fY2VudGVyPWEuY2xvbmUobyxuLl9jZW50ZXIpLG4uX2VsbGlwc29pZD0kLmNsb25lKHIsbi5fZWxsaXBzb2lkKSxuLl9zZW1pTWFqb3JBeGlzPWksbi5fc2VtaU1pbm9yQXhpcz1zLG4uX3JvdGF0aW9uPWYsbi5faGVpZ2h0PXUsbi5fZ3JhbnVsYXJpdHk9YyxuLl9leHRydWRlZEhlaWdodD1sLG4uX251bWJlck9mVmVydGljYWxMaW5lcz1wLG4uX29mZnNldEF0dHJpYnV0ZT1kPT09LTE/dm9pZCAwOmQsbik6KExpLmhlaWdodD11LExpLmV4dHJ1ZGVkSGVpZ2h0PWwsTGkuZ3JhbnVsYXJpdHk9YyxMaS5yb3RhdGlvbj1mLExpLnNlbWlNYWpvckF4aXM9aSxMaS5zZW1pTWlub3JBeGlzPXMsTGkubnVtYmVyT2ZWZXJ0aWNhbExpbmVzPXAsTGkub2Zmc2V0QXR0cmlidXRlPWQ9PT0tMT92b2lkIDA6ZCxuZXcgZmEoTGkpKX07ZmEuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7aWYodC5fc2VtaU1ham9yQXhpczw9MHx8dC5fc2VtaU1pbm9yQXhpczw9MClyZXR1cm47bGV0IGU9dC5faGVpZ2h0LG49dC5fZXh0cnVkZWRIZWlnaHQsbz0hTS5lcXVhbHNFcHNpbG9uKGUsbiwwLE0uRVBTSUxPTjIpO3QuX2NlbnRlcj10Ll9lbGxpcHNvaWQuc2NhbGVUb0dlb2RldGljU3VyZmFjZSh0Ll9jZW50ZXIsdC5fY2VudGVyKTtsZXQgcj17Y2VudGVyOnQuX2NlbnRlcixzZW1pTWFqb3JBeGlzOnQuX3NlbWlNYWpvckF4aXMsc2VtaU1pbm9yQXhpczp0Ll9zZW1pTWlub3JBeGlzLGVsbGlwc29pZDp0Ll9lbGxpcHNvaWQscm90YXRpb246dC5fcm90YXRpb24saGVpZ2h0OmUsZ3JhbnVsYXJpdHk6dC5fZ3JhbnVsYXJpdHksbnVtYmVyT2ZWZXJ0aWNhbExpbmVzOnQuX251bWJlck9mVmVydGljYWxMaW5lc30saTtpZihvKXIuZXh0cnVkZWRIZWlnaHQ9bixyLm9mZnNldEF0dHJpYnV0ZT10Ll9vZmZzZXRBdHRyaWJ1dGUsaT1ZTShyKTtlbHNlIGlmKGk9WE0ociksaCh0Ll9vZmZzZXRBdHRyaWJ1dGUpKXtsZXQgcz1pLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLmxlbmd0aCxmPXQuX29mZnNldEF0dHJpYnV0ZT09PWZlLk5PTkU/MDoxLHU9bmV3IFVpbnQ4QXJyYXkocy8zKS5maWxsKGYpO2kuYXR0cmlidXRlcy5hcHBseU9mZnNldD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LlVOU0lHTkVEX0JZVEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZToxLHZhbHVlczp1fSl9cmV0dXJuIG5ldyBVdCh7YXR0cmlidXRlczppLmF0dHJpYnV0ZXMsaW5kaWNlczppLmluZGljZXMscHJpbWl0aXZlVHlwZTpCdC5MSU5FUyxib3VuZGluZ1NwaGVyZTppLmJvdW5kaW5nU3BoZXJlLG9mZnNldEF0dHJpYnV0ZTp0Ll9vZmZzZXRBdHRyaWJ1dGV9KX07enI9ZmF9KTtmdW5jdGlvbiB1YSh0KXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IGU9dC5yYWRpdXM7eS50eXBlT2YubnVtYmVyKCJyYWRpdXMiLGUpO2xldCBuPXtjZW50ZXI6dC5jZW50ZXIsc2VtaU1ham9yQXhpczplLHNlbWlNaW5vckF4aXM6ZSxlbGxpcHNvaWQ6dC5lbGxpcHNvaWQsaGVpZ2h0OnQuaGVpZ2h0LGV4dHJ1ZGVkSGVpZ2h0OnQuZXh0cnVkZWRIZWlnaHQsZ3JhbnVsYXJpdHk6dC5ncmFudWxhcml0eSxudW1iZXJPZlZlcnRpY2FsTGluZXM6dC5udW1iZXJPZlZlcnRpY2FsTGluZXN9O3RoaXMuX2VsbGlwc2VHZW9tZXRyeT1uZXcgenIobiksdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlQ2lyY2xlT3V0bGluZUdlb21ldHJ5In12YXIgJE0sc3IsVDAsQnc9WigoKT0+e0Z0KCk7WHQoKTtJdCgpO2Z0KCk7dzAoKTtadCgpO3VhLnBhY2tlZExlbmd0aD16ci5wYWNrZWRMZW5ndGg7dWEucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHpyLnBhY2sodC5fZWxsaXBzZUdlb21ldHJ5LGUsbil9OyRNPW5ldyB6cih7Y2VudGVyOm5ldyBhLHNlbWlNYWpvckF4aXM6MSxzZW1pTWlub3JBeGlzOjF9KSxzcj17Y2VudGVyOm5ldyBhLHJhZGl1czp2b2lkIDAsZWxsaXBzb2lkOiQuY2xvbmUoJC5VTklUX1NQSEVSRSksaGVpZ2h0OnZvaWQgMCxleHRydWRlZEhlaWdodDp2b2lkIDAsZ3JhbnVsYXJpdHk6dm9pZCAwLG51bWJlck9mVmVydGljYWxMaW5lczp2b2lkIDAsc2VtaU1ham9yQXhpczp2b2lkIDAsc2VtaU1pbm9yQXhpczp2b2lkIDB9O3VhLnVucGFjaz1mdW5jdGlvbih0LGUsbil7bGV0IG89enIudW5wYWNrKHQsZSwkTSk7cmV0dXJuIHNyLmNlbnRlcj1hLmNsb25lKG8uX2NlbnRlcixzci5jZW50ZXIpLHNyLmVsbGlwc29pZD0kLmNsb25lKG8uX2VsbGlwc29pZCxzci5lbGxpcHNvaWQpLHNyLmhlaWdodD1vLl9oZWlnaHQsc3IuZXh0cnVkZWRIZWlnaHQ9by5fZXh0cnVkZWRIZWlnaHQsc3IuZ3JhbnVsYXJpdHk9by5fZ3JhbnVsYXJpdHksc3IubnVtYmVyT2ZWZXJ0aWNhbExpbmVzPW8uX251bWJlck9mVmVydGljYWxMaW5lcyxoKG4pPyhzci5zZW1pTWFqb3JBeGlzPW8uX3NlbWlNYWpvckF4aXMsc3Iuc2VtaU1pbm9yQXhpcz1vLl9zZW1pTWlub3JBeGlzLG4uX2VsbGlwc2VHZW9tZXRyeT1uZXcgenIoc3IpLG4pOihzci5yYWRpdXM9by5fc2VtaU1ham9yQXhpcyxuZXcgdWEoc3IpKX07dWEuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7cmV0dXJuIHpyLmNyZWF0ZUdlb21ldHJ5KHQuX2VsbGlwc2VHZW9tZXRyeSl9O1QwPXVhfSk7dmFyIE8wPXt9O2RlKE8wLHtkZWZhdWx0OigpPT5RTX0pO2Z1bmN0aW9uIFpNKHQsZSl7cmV0dXJuIGgoZSkmJih0PVQwLnVucGFjayh0LGUpKSx0Ll9lbGxpcHNlR2VvbWV0cnkuX2NlbnRlcj1hLmNsb25lKHQuX2VsbGlwc2VHZW9tZXRyeS5fY2VudGVyKSx0Ll9lbGxpcHNlR2VvbWV0cnkuX2VsbGlwc29pZD0kLmNsb25lKHQuX2VsbGlwc2VHZW9tZXRyeS5fZWxsaXBzb2lkKSxUMC5jcmVhdGVHZW9tZXRyeSh0KX12YXIgUU0sRTA9WigoKT0+e0Z0KCk7QncoKTtmdCgpO1p0KCk7UU09Wk19KTtmdW5jdGlvbiBKTSh0LGUsbixvKXtpZih5LmRlZmluZWQoImVxdWFsc0Vwc2lsb24iLGUpLCFoKHQpKXJldHVybjtuPXgobiwhMSk7bGV0IHI9aChvKSxpPXQubGVuZ3RoO2lmKGk8MilyZXR1cm4gdDtsZXQgcyxmPXRbMF0sdSxjLGw9MCxwPS0xO2ZvcihzPTE7czxpOysrcyl1PXRbc10sZShmLHUsVXcpPyhoKGMpfHwoYz10LnNsaWNlKDAscyksbD1zLTEscD0wKSxyJiZvLnB1c2gocykpOihoKGMpJiYoYy5wdXNoKHUpLGw9cyxyJiYocD1vLmxlbmd0aCkpLGY9dSk7cmV0dXJuIG4mJmUodFswXSx0W2ktMV0sVXcpJiYociYmKGgoYyk/by5zcGxpY2UocCwwLGwpOm8ucHVzaChpLTEpKSxoKGMpP2MubGVuZ3RoLT0xOmM9dC5zbGljZSgwLC0xKSksaChjKT9jOnR9dmFyIFV3LENuLGpyPVooKCk9PntYdCgpO0l0KCk7ZnQoKTtXdCgpO1V3PU0uRVBTSUxPTjEwO0NuPUpNfSk7ZnVuY3Rpb24gTm4odCxlLG4sbyl7dGhpcy54PXgodCwwKSx0aGlzLnk9eChlLDApLHRoaXMud2lkdGg9eChuLDApLHRoaXMuaGVpZ2h0PXgobywwKX12YXIgdE4sZU4sbk4sSHIsQ2Y9WigoKT0+e0ZlKCk7UGUoKTtYdCgpO0l0KCk7ZnQoKTtTaSgpO2tzKCk7d24oKTtObi5wYWNrZWRMZW5ndGg9NDtObi5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCkseS5kZWZpbmVkKCJhcnJheSIsZSksbj14KG4sMCksZVtuKytdPXQueCxlW24rK109dC55LGVbbisrXT10LndpZHRoLGVbbl09dC5oZWlnaHQsZX07Tm4udW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCksaChuKXx8KG49bmV3IE5uKSxuLng9dFtlKytdLG4ueT10W2UrK10sbi53aWR0aD10W2UrK10sbi5oZWlnaHQ9dFtlXSxufTtObi5mcm9tUG9pbnRzPWZ1bmN0aW9uKHQsZSl7aWYoaChlKXx8KGU9bmV3IE5uKSwhaCh0KXx8dC5sZW5ndGg9PT0wKXJldHVybiBlLng9MCxlLnk9MCxlLndpZHRoPTAsZS5oZWlnaHQ9MCxlO2xldCBuPXQubGVuZ3RoLG89dFswXS54LHI9dFswXS55LGk9dFswXS54LHM9dFswXS55O2ZvcihsZXQgZj0xO2Y8bjtmKyspe2xldCB1PXRbZl0sYz11LngsbD11Lnk7bz1NYXRoLm1pbihjLG8pLGk9TWF0aC5tYXgoYyxpKSxyPU1hdGgubWluKGwscikscz1NYXRoLm1heChsLHMpfXJldHVybiBlLng9byxlLnk9cixlLndpZHRoPWktbyxlLmhlaWdodD1zLXIsZX07dE49bmV3IFFuLGVOPW5ldyBhdCxuTj1uZXcgYXQ7Tm4uZnJvbVJlY3RhbmdsZT1mdW5jdGlvbih0LGUsbil7aWYoaChuKXx8KG49bmV3IE5uKSwhaCh0KSlyZXR1cm4gbi54PTAsbi55PTAsbi53aWR0aD0wLG4uaGVpZ2h0PTAsbjtlPXgoZSx0Tik7bGV0IG89ZS5wcm9qZWN0KE50LnNvdXRod2VzdCh0LGVOKSkscj1lLnByb2plY3QoTnQubm9ydGhlYXN0KHQsbk4pKTtyZXR1cm4gdHQuc3VidHJhY3QocixvLHIpLG4ueD1vLngsbi55PW8ueSxuLndpZHRoPXIueCxuLmhlaWdodD1yLnksbn07Tm4uY2xvbmU9ZnVuY3Rpb24odCxlKXtpZihoKHQpKXJldHVybiBoKGUpPyhlLng9dC54LGUueT10LnksZS53aWR0aD10LndpZHRoLGUuaGVpZ2h0PXQuaGVpZ2h0LGUpOm5ldyBObih0LngsdC55LHQud2lkdGgsdC5oZWlnaHQpfTtObi51bmlvbj1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoKG4pfHwobj1uZXcgTm4pO2xldCBvPU1hdGgubWluKHQueCxlLngpLHI9TWF0aC5taW4odC55LGUueSksaT1NYXRoLm1heCh0LngrdC53aWR0aCxlLngrZS53aWR0aCkscz1NYXRoLm1heCh0LnkrdC5oZWlnaHQsZS55K2UuaGVpZ2h0KTtyZXR1cm4gbi54PW8sbi55PXIsbi53aWR0aD1pLW8sbi5oZWlnaHQ9cy1yLG59O05uLmV4cGFuZD1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHkudHlwZU9mLm9iamVjdCgicG9pbnQiLGUpLG49Tm4uY2xvbmUodCxuKTtsZXQgbz1lLngtbi54LHI9ZS55LW4ueTtyZXR1cm4gbz5uLndpZHRoP24ud2lkdGg9bzpvPDAmJihuLndpZHRoLT1vLG4ueD1lLngpLHI+bi5oZWlnaHQ/bi5oZWlnaHQ9cjpyPDAmJihuLmhlaWdodC09cixuLnk9ZS55KSxufTtObi5pbnRlcnNlY3Q9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpO2xldCBuPXQueCxvPXQueSxyPWUueCxpPWUueTtyZXR1cm4gbj5yK2Uud2lkdGh8fG4rdC53aWR0aDxyfHxvK3QuaGVpZ2h0PGl8fG8+aStlLmhlaWdodD9Sbi5PVVRTSURFOlJuLklOVEVSU0VDVElOR307Tm4uZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxoKHQpJiZoKGUpJiZ0Lng9PT1lLngmJnQueT09PWUueSYmdC53aWR0aD09PWUud2lkdGgmJnQuaGVpZ2h0PT09ZS5oZWlnaHR9O05uLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gTm4uY2xvbmUodGhpcyx0KX07Tm4ucHJvdG90eXBlLmludGVyc2VjdD1mdW5jdGlvbih0KXtyZXR1cm4gTm4uaW50ZXJzZWN0KHRoaXMsdCl9O05uLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIE5uLmVxdWFscyh0aGlzLHQpfTtIcj1Obn0pO2Z1bmN0aW9uIERvKHQsZSxuKXt0aGlzLm1pbmltdW09YS5jbG9uZSh4KHQsYS5aRVJPKSksdGhpcy5tYXhpbXVtPWEuY2xvbmUoeChlLGEuWkVSTykpLGgobik/bj1hLmNsb25lKG4pOm49YS5taWRwb2ludCh0aGlzLm1pbmltdW0sdGhpcy5tYXhpbXVtLG5ldyBhKSx0aGlzLmNlbnRlcj1ufXZhciBZcCxEaSx4Zj1aKCgpPT57RnQoKTtYdCgpO0l0KCk7ZnQoKTtrcygpO0RvLmZyb21Db3JuZXJzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS5kZWZpbmVkKCJtaW5pbXVtIix0KSx5LmRlZmluZWQoIm1heGltdW0iLGUpLGgobil8fChuPW5ldyBEbyksbi5taW5pbXVtPWEuY2xvbmUodCxuLm1pbmltdW0pLG4ubWF4aW11bT1hLmNsb25lKGUsbi5tYXhpbXVtKSxuLmNlbnRlcj1hLm1pZHBvaW50KHQsZSxuLmNlbnRlciksbn07RG8uZnJvbVBvaW50cz1mdW5jdGlvbih0LGUpe2lmKGgoZSl8fChlPW5ldyBEbyksIWgodCl8fHQubGVuZ3RoPT09MClyZXR1cm4gZS5taW5pbXVtPWEuY2xvbmUoYS5aRVJPLGUubWluaW11bSksZS5tYXhpbXVtPWEuY2xvbmUoYS5aRVJPLGUubWF4aW11bSksZS5jZW50ZXI9YS5jbG9uZShhLlpFUk8sZS5jZW50ZXIpLGU7bGV0IG49dFswXS54LG89dFswXS55LHI9dFswXS56LGk9dFswXS54LHM9dFswXS55LGY9dFswXS56LHU9dC5sZW5ndGg7Zm9yKGxldCBwPTE7cDx1O3ArKyl7bGV0IGQ9dFtwXSxtPWQueCxfPWQueSxnPWQuejtuPU1hdGgubWluKG0sbiksaT1NYXRoLm1heChtLGkpLG89TWF0aC5taW4oXyxvKSxzPU1hdGgubWF4KF8scykscj1NYXRoLm1pbihnLHIpLGY9TWF0aC5tYXgoZyxmKX1sZXQgYz1lLm1pbmltdW07Yy54PW4sYy55PW8sYy56PXI7bGV0IGw9ZS5tYXhpbXVtO3JldHVybiBsLng9aSxsLnk9cyxsLno9ZixlLmNlbnRlcj1hLm1pZHBvaW50KGMsbCxlLmNlbnRlciksZX07RG8uY2xvbmU9ZnVuY3Rpb24odCxlKXtpZihoKHQpKXJldHVybiBoKGUpPyhlLm1pbmltdW09YS5jbG9uZSh0Lm1pbmltdW0sZS5taW5pbXVtKSxlLm1heGltdW09YS5jbG9uZSh0Lm1heGltdW0sZS5tYXhpbXVtKSxlLmNlbnRlcj1hLmNsb25lKHQuY2VudGVyLGUuY2VudGVyKSxlKTpuZXcgRG8odC5taW5pbXVtLHQubWF4aW11bSx0LmNlbnRlcil9O0RvLmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8aCh0KSYmaChlKSYmYS5lcXVhbHModC5jZW50ZXIsZS5jZW50ZXIpJiZhLmVxdWFscyh0Lm1pbmltdW0sZS5taW5pbXVtKSYmYS5lcXVhbHModC5tYXhpbXVtLGUubWF4aW11bSl9O1lwPW5ldyBhO0RvLmludGVyc2VjdFBsYW5lPWZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJib3giLHQpLHkuZGVmaW5lZCgicGxhbmUiLGUpLFlwPWEuc3VidHJhY3QodC5tYXhpbXVtLHQubWluaW11bSxZcCk7bGV0IG49YS5tdWx0aXBseUJ5U2NhbGFyKFlwLC41LFlwKSxvPWUubm9ybWFsLHI9bi54Kk1hdGguYWJzKG8ueCkrbi55Kk1hdGguYWJzKG8ueSkrbi56Kk1hdGguYWJzKG8ueiksaT1hLmRvdCh0LmNlbnRlcixvKStlLmRpc3RhbmNlO3JldHVybiBpLXI+MD9Sbi5JTlNJREU6aStyPDA/Um4uT1VUU0lERTpSbi5JTlRFUlNFQ1RJTkd9O0RvLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gRG8uY2xvbmUodGhpcyx0KX07RG8ucHJvdG90eXBlLmludGVyc2VjdFBsYW5lPWZ1bmN0aW9uKHQpe3JldHVybiBEby5pbnRlcnNlY3RQbGFuZSh0aGlzLHQpfTtEby5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBEby5lcXVhbHModGhpcyx0KX07RGk9RG99KTtmdW5jdGlvbiB1aSh0LGUpe2lmKHkuZGVmaW5lZCgib3JpZ2luIix0KSxlPXgoZSwkLldHUzg0KSx0PWUuc2NhbGVUb0dlb2RldGljU3VyZmFjZSh0KSwhaCh0KSl0aHJvdyBuZXcgRigib3JpZ2luIG11c3Qgbm90IGJlIGF0IHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc29pZC4iKTtsZXQgbj1Zby5lYXN0Tm9ydGhVcFRvRml4ZWRGcmFtZSh0LGUpO3RoaXMuX2VsbGlwc29pZD1lLHRoaXMuX29yaWdpbj10LHRoaXMuX3hBeGlzPWEuZnJvbUNhcnRlc2lhbjQoc3QuZ2V0Q29sdW1uKG4sMCxSMCkpLHRoaXMuX3lBeGlzPWEuZnJvbUNhcnRlc2lhbjQoc3QuZ2V0Q29sdW1uKG4sMSxSMCkpO2xldCBvPWEuZnJvbUNhcnRlc2lhbjQoc3QuZ2V0Q29sdW1uKG4sMixSMCkpO3RoaXMuX3BsYW5lPW9uLmZyb21Qb2ludE5vcm1hbCh0LG8pfXZhciBSMCxvTixWdywkcCxyTixfbyxsYT1aKCgpPT57eGYoKTtGZSgpO0Z0KCk7aHIoKTtYdCgpO0l0KCk7ZnQoKTtIdCgpO1p0KCk7dGMoKTtCbigpO2ZzKCk7THAoKTtjcygpO1IwPW5ldyBoZTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh1aS5wcm90b3R5cGUse2VsbGlwc29pZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VsbGlwc29pZH19LG9yaWdpbjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWdpbn19LHBsYW5lOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGxhbmV9fSx4QXhpczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3hBeGlzfX0seUF4aXM6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl95QXhpc319LHpBeGlzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGxhbmUubm9ybWFsfX19KTtvTj1uZXcgRGk7dWkuZnJvbVBvaW50cz1mdW5jdGlvbih0LGUpe3kuZGVmaW5lZCgiY2FydGVzaWFucyIsdCk7bGV0IG49RGkuZnJvbVBvaW50cyh0LG9OKTtyZXR1cm4gbmV3IHVpKG4uY2VudGVyLGUpfTtWdz1uZXcgUXMsJHA9bmV3IGE7dWkucHJvdG90eXBlLnByb2plY3RQb2ludE9udG9QbGFuZT1mdW5jdGlvbih0LGUpe3kuZGVmaW5lZCgiY2FydGVzaWFuIix0KTtsZXQgbj1WdztuLm9yaWdpbj10LGEubm9ybWFsaXplKHQsbi5kaXJlY3Rpb24pO2xldCBvPWhvLnJheVBsYW5lKG4sdGhpcy5fcGxhbmUsJHApO2lmKGgobyl8fChhLm5lZ2F0ZShuLmRpcmVjdGlvbixuLmRpcmVjdGlvbiksbz1oby5yYXlQbGFuZShuLHRoaXMuX3BsYW5lLCRwKSksaChvKSl7bGV0IHI9YS5zdWJ0cmFjdChvLHRoaXMuX29yaWdpbixvKSxpPWEuZG90KHRoaXMuX3hBeGlzLHIpLHM9YS5kb3QodGhpcy5feUF4aXMscik7cmV0dXJuIGgoZSk/KGUueD1pLGUueT1zLGUpOm5ldyB0dChpLHMpfX07dWkucHJvdG90eXBlLnByb2plY3RQb2ludHNPbnRvUGxhbmU9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoImNhcnRlc2lhbnMiLHQpLGgoZSl8fChlPVtdKTtsZXQgbj0wLG89dC5sZW5ndGg7Zm9yKGxldCByPTA7cjxvO3IrKyl7bGV0IGk9dGhpcy5wcm9qZWN0UG9pbnRPbnRvUGxhbmUodFtyXSxlW25dKTtoKGkpJiYoZVtuXT1pLG4rKyl9cmV0dXJuIGUubGVuZ3RoPW4sZX07dWkucHJvdG90eXBlLnByb2plY3RQb2ludFRvTmVhcmVzdE9uUGxhbmU9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoImNhcnRlc2lhbiIsdCksaChlKXx8KGU9bmV3IHR0KTtsZXQgbj1WdztuLm9yaWdpbj10LGEuY2xvbmUodGhpcy5fcGxhbmUubm9ybWFsLG4uZGlyZWN0aW9uKTtsZXQgbz1oby5yYXlQbGFuZShuLHRoaXMuX3BsYW5lLCRwKTtoKG8pfHwoYS5uZWdhdGUobi5kaXJlY3Rpb24sbi5kaXJlY3Rpb24pLG89aG8ucmF5UGxhbmUobix0aGlzLl9wbGFuZSwkcCkpO2xldCByPWEuc3VidHJhY3Qobyx0aGlzLl9vcmlnaW4sbyksaT1hLmRvdCh0aGlzLl94QXhpcyxyKSxzPWEuZG90KHRoaXMuX3lBeGlzLHIpO3JldHVybiBlLng9aSxlLnk9cyxlfTt1aS5wcm90b3R5cGUucHJvamVjdFBvaW50c1RvTmVhcmVzdE9uUGxhbmU9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoImNhcnRlc2lhbnMiLHQpLGgoZSl8fChlPVtdKTtsZXQgbj10Lmxlbmd0aDtlLmxlbmd0aD1uO2ZvcihsZXQgbz0wO288bjtvKyspZVtvXT10aGlzLnByb2plY3RQb2ludFRvTmVhcmVzdE9uUGxhbmUodFtvXSxlW29dKTtyZXR1cm4gZX07ck49bmV3IGE7dWkucHJvdG90eXBlLnByb2plY3RQb2ludE9udG9FbGxpcHNvaWQ9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoImNhcnRlc2lhbiIsdCksaChlKXx8KGU9bmV3IGEpO2xldCBuPXRoaXMuX2VsbGlwc29pZCxvPXRoaXMuX29yaWdpbixyPXRoaXMuX3hBeGlzLGk9dGhpcy5feUF4aXMscz1yTjtyZXR1cm4gYS5tdWx0aXBseUJ5U2NhbGFyKHIsdC54LHMpLGU9YS5hZGQobyxzLGUpLGEubXVsdGlwbHlCeVNjYWxhcihpLHQueSxzKSxhLmFkZChlLHMsZSksbi5zY2FsZVRvR2VvY2VudHJpY1N1cmZhY2UoZSxlKSxlfTt1aS5wcm90b3R5cGUucHJvamVjdFBvaW50c09udG9FbGxpcHNvaWQ9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoImNhcnRlc2lhbnMiLHQpO2xldCBuPXQubGVuZ3RoO2goZSk/ZS5sZW5ndGg9bjplPW5ldyBBcnJheShuKTtmb3IobGV0IG89MDtvPG47KytvKWVbb109dGhpcy5wcm9qZWN0UG9pbnRPbnRvRWxsaXBzb2lkKHRbb10sZVtvXSk7cmV0dXJuIGV9O19vPXVpfSk7ZnVuY3Rpb24gRGUodCxlKXt0aGlzLmNlbnRlcj1hLmNsb25lKHgodCxhLlpFUk8pKSx0aGlzLmhhbGZBeGVzPUouY2xvbmUoeChlLEouWkVSTykpfWZ1bmN0aW9uIGt3KHQsZSxuLG8scixpLHMsZix1LGMsbCl7aWYoIWgocil8fCFoKGkpfHwhaChzKXx8IWgoZil8fCFoKHUpfHwhaChjKSl0aHJvdyBuZXcgRigiYWxsIGV4dGVudHMgKG1pbmltdW0vbWF4aW11bSBYL1kvWikgYXJlIHJlcXVpcmVkLiIpO2gobCl8fChsPW5ldyBEZSk7bGV0IHA9bC5oYWxmQXhlcztKLnNldENvbHVtbihwLDAsZSxwKSxKLnNldENvbHVtbihwLDEsbixwKSxKLnNldENvbHVtbihwLDIsbyxwKTtsZXQgZD1xdztkLng9KHIraSkvMixkLnk9KHMrZikvMixkLno9KHUrYykvMjtsZXQgbT1kTjttLng9KGktcikvMixtLnk9KGYtcykvMixtLno9KGMtdSkvMjtsZXQgXz1sLmNlbnRlcjtyZXR1cm4gZD1KLm11bHRpcGx5QnlWZWN0b3IocCxkLGQpLGEuYWRkKHQsZCxfKSxKLm11bHRpcGx5QnlTY2FsZShwLG0scCksbH12YXIgaU4sc04sY04sYU4sZk4sdU4sbE4scE4scXcsZE4sR3csbU4saE4sX04seU4sZ04sQU4sYk4sencsd04sancsVE4sT04sRU4sUk4sU04sQ04seE4sUE4sTU4sTk4sSU4sdk4sTE4sRE4sRk4sS3csV3csWHcsQk4sSHcsVU4sVk4sa04sR04sek4sak4sSE4scU4sU28scGE9WigoKT0+e01lKCk7RmUoKTtGdCgpO1BlKCk7WHQoKTtJdCgpO2Z0KCk7SHQoKTtadCgpO2xhKCk7a3MoKTt6bCgpO1d0KCk7Rm4oKTtCbigpO2ZzKCk7d24oKTtEZS5wYWNrZWRMZW5ndGg9YS5wYWNrZWRMZW5ndGgrSi5wYWNrZWRMZW5ndGg7RGUucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49eChuLDApLGEucGFjayh0LmNlbnRlcixlLG4pLEoucGFjayh0LmhhbGZBeGVzLGUsbithLnBhY2tlZExlbmd0aCksZX07RGUudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCksaChuKXx8KG49bmV3IERlKSxhLnVucGFjayh0LGUsbi5jZW50ZXIpLEoudW5wYWNrKHQsZSthLnBhY2tlZExlbmd0aCxuLmhhbGZBeGVzKSxufTtpTj1uZXcgYSxzTj1uZXcgYSxjTj1uZXcgYSxhTj1uZXcgYSxmTj1uZXcgYSx1Tj1uZXcgYSxsTj1uZXcgSixwTj17dW5pdGFyeTpuZXcgSixkaWFnb25hbDpuZXcgSn07RGUuZnJvbVBvaW50cz1mdW5jdGlvbih0LGUpe2lmKGgoZSl8fChlPW5ldyBEZSksIWgodCl8fHQubGVuZ3RoPT09MClyZXR1cm4gZS5oYWxmQXhlcz1KLlpFUk8sZS5jZW50ZXI9YS5aRVJPLGU7bGV0IG4sbz10Lmxlbmd0aCxyPWEuY2xvbmUodFswXSxpTik7Zm9yKG49MTtuPG87bisrKWEuYWRkKHIsdFtuXSxyKTtsZXQgaT0xL287YS5tdWx0aXBseUJ5U2NhbGFyKHIsaSxyKTtsZXQgcz0wLGY9MCx1PTAsYz0wLGw9MCxwPTAsZDtmb3Iobj0wO248bztuKyspZD1hLnN1YnRyYWN0KHRbbl0scixzTikscys9ZC54KmQueCxmKz1kLngqZC55LHUrPWQueCpkLnosYys9ZC55KmQueSxsKz1kLnkqZC56LHArPWQueipkLno7cyo9aSxmKj1pLHUqPWksYyo9aSxsKj1pLHAqPWk7bGV0IG09bE47bVswXT1zLG1bMV09ZixtWzJdPXUsbVszXT1mLG1bNF09YyxtWzVdPWwsbVs2XT11LG1bN109bCxtWzhdPXA7bGV0IF89Si5jb21wdXRlRWlnZW5EZWNvbXBvc2l0aW9uKG0scE4pLGc9Si5jbG9uZShfLnVuaXRhcnksZS5oYWxmQXhlcyksYj1KLmdldENvbHVtbihnLDAsYU4pLHc9Si5nZXRDb2x1bW4oZywxLGZOKSxPPUouZ2V0Q29sdW1uKGcsMix1TiksRT0tTnVtYmVyLk1BWF9WQUxVRSxUPS1OdW1iZXIuTUFYX1ZBTFVFLEM9LU51bWJlci5NQVhfVkFMVUUsTj1OdW1iZXIuTUFYX1ZBTFVFLEk9TnVtYmVyLk1BWF9WQUxVRSxEPU51bWJlci5NQVhfVkFMVUU7Zm9yKG49MDtuPG87bisrKWQ9dFtuXSxFPU1hdGgubWF4KGEuZG90KGIsZCksRSksVD1NYXRoLm1heChhLmRvdCh3LGQpLFQpLEM9TWF0aC5tYXgoYS5kb3QoTyxkKSxDKSxOPU1hdGgubWluKGEuZG90KGIsZCksTiksST1NYXRoLm1pbihhLmRvdCh3LGQpLEkpLEQ9TWF0aC5taW4oYS5kb3QoTyxkKSxEKTtiPWEubXVsdGlwbHlCeVNjYWxhcihiLC41KihOK0UpLGIpLHc9YS5tdWx0aXBseUJ5U2NhbGFyKHcsLjUqKEkrVCksdyksTz1hLm11bHRpcGx5QnlTY2FsYXIoTywuNSooRCtDKSxPKTtsZXQgdj1hLmFkZChiLHcsZS5jZW50ZXIpO2EuYWRkKHYsTyx2KTtsZXQgTD1jTjtyZXR1cm4gTC54PUUtTixMLnk9VC1JLEwuej1DLUQsYS5tdWx0aXBseUJ5U2NhbGFyKEwsLjUsTCksSi5tdWx0aXBseUJ5U2NhbGUoZS5oYWxmQXhlcyxMLGUuaGFsZkF4ZXMpLGV9O3F3PW5ldyBhLGROPW5ldyBhO0d3PW5ldyBhdCxtTj1uZXcgYSxoTj1uZXcgYXQsX049bmV3IGF0LHlOPW5ldyBhdCxnTj1uZXcgYXQsQU49bmV3IGF0LGJOPW5ldyBhLHp3PW5ldyBhLHdOPW5ldyBhLGp3PW5ldyBhLFROPW5ldyBhLE9OPW5ldyB0dCxFTj1uZXcgdHQsUk49bmV3IHR0LFNOPW5ldyB0dCxDTj1uZXcgdHQseE49bmV3IGEsUE49bmV3IGEsTU49bmV3IGEsTk49bmV3IGEsSU49bmV3IHR0LHZOPW5ldyBhLExOPW5ldyBhLEROPW5ldyBhLEZOPW5ldyBvbihhLlVOSVRfWCwwKTtEZS5mcm9tUmVjdGFuZ2xlPWZ1bmN0aW9uKHQsZSxuLG8scil7aWYoIWgodCkpdGhyb3cgbmV3IEYoInJlY3RhbmdsZSBpcyByZXF1aXJlZCIpO2lmKHQud2lkdGg8MHx8dC53aWR0aD5NLlRXT19QSSl0aHJvdyBuZXcgRigiUmVjdGFuZ2xlIHdpZHRoIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyICogcGkiKTtpZih0LmhlaWdodDwwfHx0LmhlaWdodD5NLlBJKXRocm93IG5ldyBGKCJSZWN0YW5nbGUgaGVpZ2h0IG11c3QgYmUgYmV0d2VlbiAwIGFuZCBwaSIpO2lmKGgobykmJiFNLmVxdWFsc0Vwc2lsb24oby5yYWRpaS54LG8ucmFkaWkueSxNLkVQU0lMT04xNSkpdGhyb3cgbmV3IEYoIkVsbGlwc29pZCBtdXN0IGJlIGFuIGVsbGlwc29pZCBvZiByZXZvbHV0aW9uIChyYWRpaS54ID09IHJhZGlpLnkpIik7ZT14KGUsMCksbj14KG4sMCksbz14KG8sJC5XR1M4NCk7bGV0IGkscyxmLHUsYyxsLHA7aWYodC53aWR0aDw9TS5QSSl7bGV0IEk9TnQuY2VudGVyKHQsR3cpLEQ9by5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihJLG1OKSx2PW5ldyBfbyhELG8pO3A9di5wbGFuZTtsZXQgTD1JLmxvbmdpdHVkZSxVPXQuc291dGg8MCYmdC5ub3J0aD4wPzA6SS5sYXRpdHVkZSxBPWF0LmZyb21SYWRpYW5zKEwsdC5ub3J0aCxuLGhOKSxTPWF0LmZyb21SYWRpYW5zKHQud2VzdCx0Lm5vcnRoLG4sX04pLFA9YXQuZnJvbVJhZGlhbnModC53ZXN0LFUsbix5TiksQj1hdC5mcm9tUmFkaWFucyh0Lndlc3QsdC5zb3V0aCxuLGdOKSxqPWF0LmZyb21SYWRpYW5zKEwsdC5zb3V0aCxuLEFOKSxIPW8uY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oQSxiTiksaz1vLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKFMsencpLEs9by5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihQLHdOKSxYPW8uY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oQixqdyksUj1vLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGosVE4pLG90PXYucHJvamVjdFBvaW50VG9OZWFyZXN0T25QbGFuZShILE9OKSxjdD12LnByb2plY3RQb2ludFRvTmVhcmVzdE9uUGxhbmUoayxFTikscHQ9di5wcm9qZWN0UG9pbnRUb05lYXJlc3RPblBsYW5lKEssUk4pLHl0PXYucHJvamVjdFBvaW50VG9OZWFyZXN0T25QbGFuZShYLFNOKSxydD12LnByb2plY3RQb2ludFRvTmVhcmVzdE9uUGxhbmUoUixDTik7cmV0dXJuIGk9TWF0aC5taW4oY3QueCxwdC54LHl0LngpLHM9LWksdT1NYXRoLm1heChjdC55LG90LnkpLGY9TWF0aC5taW4oeXQueSxydC55KSxTLmhlaWdodD1CLmhlaWdodD1lLGs9by5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihTLHp3KSxYPW8uY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oQixqdyksYz1NYXRoLm1pbihvbi5nZXRQb2ludERpc3RhbmNlKHAsayksb24uZ2V0UG9pbnREaXN0YW5jZShwLFgpKSxsPW4sa3codi5vcmlnaW4sdi54QXhpcyx2LnlBeGlzLHYuekF4aXMsaSxzLGYsdSxjLGwscil9bGV0IGQ9dC5zb3V0aD4wLG09dC5ub3J0aDwwLF89ZD90LnNvdXRoOm0/dC5ub3J0aDowLGc9TnQuY2VudGVyKHQsR3cpLmxvbmdpdHVkZSxiPWEuZnJvbVJhZGlhbnMoZyxfLG4sbyx4Tik7Yi56PTA7bGV0IE89TWF0aC5hYnMoYi54KTxNLkVQU0lMT04xMCYmTWF0aC5hYnMoYi55KTxNLkVQU0lMT04xMD9hLlVOSVRfWDphLm5vcm1hbGl6ZShiLFBOKSxFPWEuVU5JVF9aLFQ9YS5jcm9zcyhPLEUsTU4pO3A9b24uZnJvbVBvaW50Tm9ybWFsKGIsTyxGTik7bGV0IEM9YS5mcm9tUmFkaWFucyhnK00uUElfT1ZFUl9UV08sXyxuLG8sTk4pO3M9YS5kb3Qob24ucHJvamVjdFBvaW50T250b1BsYW5lKHAsQyxJTiksVCksaT0tcyx1PWEuZnJvbVJhZGlhbnMoMCx0Lm5vcnRoLG0/ZTpuLG8sdk4pLnosZj1hLmZyb21SYWRpYW5zKDAsdC5zb3V0aCxkP2U6bixvLExOKS56O2xldCBOPWEuZnJvbVJhZGlhbnModC5lYXN0LF8sbixvLEROKTtyZXR1cm4gYz1vbi5nZXRQb2ludERpc3RhbmNlKHAsTiksbD0wLGt3KGIsVCxFLE8saSxzLGYsdSxjLGwscil9O0RlLmZyb21UcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInRyYW5zZm9ybWF0aW9uIix0KSxoKGUpfHwoZT1uZXcgRGUpLGUuY2VudGVyPXN0LmdldFRyYW5zbGF0aW9uKHQsZS5jZW50ZXIpLGUuaGFsZkF4ZXM9c3QuZ2V0TWF0cml4Myh0LGUuaGFsZkF4ZXMpLGUuaGFsZkF4ZXM9Si5tdWx0aXBseUJ5U2NhbGFyKGUuaGFsZkF4ZXMsLjUsZS5oYWxmQXhlcyksZX07RGUuY2xvbmU9ZnVuY3Rpb24odCxlKXtpZihoKHQpKXJldHVybiBoKGUpPyhhLmNsb25lKHQuY2VudGVyLGUuY2VudGVyKSxKLmNsb25lKHQuaGFsZkF4ZXMsZS5oYWxmQXhlcyksZSk6bmV3IERlKHQuY2VudGVyLHQuaGFsZkF4ZXMpfTtEZS5pbnRlcnNlY3RQbGFuZT1mdW5jdGlvbih0LGUpe2lmKCFoKHQpKXRocm93IG5ldyBGKCJib3ggaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEYoInBsYW5lIGlzIHJlcXVpcmVkLiIpO2xldCBuPXQuY2VudGVyLG89ZS5ub3JtYWwscj10LmhhbGZBeGVzLGk9by54LHM9by55LGY9by56LHU9TWF0aC5hYnMoaSpyW0ouQ09MVU1OMFJPVzBdK3MqcltKLkNPTFVNTjBST1cxXStmKnJbSi5DT0xVTU4wUk9XMl0pK01hdGguYWJzKGkqcltKLkNPTFVNTjFST1cwXStzKnJbSi5DT0xVTU4xUk9XMV0rZipyW0ouQ09MVU1OMVJPVzJdKStNYXRoLmFicyhpKnJbSi5DT0xVTU4yUk9XMF0rcypyW0ouQ09MVU1OMlJPVzFdK2YqcltKLkNPTFVNTjJST1cyXSksYz1hLmRvdChvLG4pK2UuZGlzdGFuY2U7cmV0dXJuIGM8PS11P1JuLk9VVFNJREU6Yz49dT9Sbi5JTlNJREU6Um4uSU5URVJTRUNUSU5HfTtLdz1uZXcgYSxXdz1uZXcgYSxYdz1uZXcgYSxCTj1uZXcgYSxIdz1uZXcgYSxVTj1uZXcgYTtEZS5kaXN0YW5jZVNxdWFyZWRUbz1mdW5jdGlvbih0LGUpe2lmKCFoKHQpKXRocm93IG5ldyBGKCJib3ggaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEYoImNhcnRlc2lhbiBpcyByZXF1aXJlZC4iKTtsZXQgbj1hLnN1YnRyYWN0KGUsdC5jZW50ZXIscXcpLG89dC5oYWxmQXhlcyxyPUouZ2V0Q29sdW1uKG8sMCxLdyksaT1KLmdldENvbHVtbihvLDEsV3cpLHM9Si5nZXRDb2x1bW4obywyLFh3KSxmPWEubWFnbml0dWRlKHIpLHU9YS5tYWduaXR1ZGUoaSksYz1hLm1hZ25pdHVkZShzKSxsPSEwLHA9ITAsZD0hMDtmPjA/YS5kaXZpZGVCeVNjYWxhcihyLGYscik6bD0hMSx1PjA/YS5kaXZpZGVCeVNjYWxhcihpLHUsaSk6cD0hMSxjPjA/YS5kaXZpZGVCeVNjYWxhcihzLGMscyk6ZD0hMTtsZXQgbT0hbCshcCshZCxfLGcsYjtpZihtPT09MSl7bGV0IFQ9cjtfPWksZz1zLHA/ZHx8KFQ9cyxnPXIpOihUPWksXz1yKSxiPWEuY3Jvc3MoXyxnLEh3KSxUPT09cj9yPWI6VD09PWk/aT1iOlQ9PT1zJiYocz1iKX1lbHNlIGlmKG09PT0yKXtfPXIscD9fPWk6ZCYmKF89cyk7bGV0IFQ9YS5VTklUX1k7VC5lcXVhbHNFcHNpbG9uKF8sTS5FUFNJTE9OMykmJihUPWEuVU5JVF9YKSxnPWEuY3Jvc3MoXyxULEJOKSxhLm5vcm1hbGl6ZShnLGcpLGI9YS5jcm9zcyhfLGcsSHcpLGEubm9ybWFsaXplKGIsYiksXz09PXI/KGk9ZyxzPWIpOl89PT1pPyhzPWcscj1iKTpfPT09cyYmKHI9ZyxpPWIpfWVsc2UgbT09PTMmJihyPWEuVU5JVF9YLGk9YS5VTklUX1kscz1hLlVOSVRfWik7bGV0IHc9VU47dy54PWEuZG90KG4sciksdy55PWEuZG90KG4saSksdy56PWEuZG90KG4scyk7bGV0IE89MCxFO3JldHVybiB3Lng8LWY/KEU9dy54K2YsTys9RSpFKTp3Lng+ZiYmKEU9dy54LWYsTys9RSpFKSx3Lnk8LXU/KEU9dy55K3UsTys9RSpFKTp3Lnk+dSYmKEU9dy55LXUsTys9RSpFKSx3Lno8LWM/KEU9dy56K2MsTys9RSpFKTp3Lno+YyYmKEU9dy56LWMsTys9RSpFKSxPfTtWTj1uZXcgYSxrTj1uZXcgYTtEZS5jb21wdXRlUGxhbmVEaXN0YW5jZXM9ZnVuY3Rpb24odCxlLG4sbyl7aWYoIWgodCkpdGhyb3cgbmV3IEYoImJveCBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgRigicG9zaXRpb24gaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEYoImRpcmVjdGlvbiBpcyByZXF1aXJlZC4iKTtoKG8pfHwobz1uZXcgUXIpO2xldCByPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxpPU51bWJlci5ORUdBVElWRV9JTkZJTklUWSxzPXQuY2VudGVyLGY9dC5oYWxmQXhlcyx1PUouZ2V0Q29sdW1uKGYsMCxLdyksYz1KLmdldENvbHVtbihmLDEsV3cpLGw9Si5nZXRDb2x1bW4oZiwyLFh3KSxwPWEuYWRkKHUsYyxWTik7YS5hZGQocCxsLHApLGEuYWRkKHAscyxwKTtsZXQgZD1hLnN1YnRyYWN0KHAsZSxrTiksbT1hLmRvdChuLGQpO3JldHVybiByPU1hdGgubWluKG0sciksaT1NYXRoLm1heChtLGkpLGEuYWRkKHMsdSxwKSxhLmFkZChwLGMscCksYS5zdWJ0cmFjdChwLGwscCksYS5zdWJ0cmFjdChwLGUsZCksbT1hLmRvdChuLGQpLHI9TWF0aC5taW4obSxyKSxpPU1hdGgubWF4KG0saSksYS5hZGQocyx1LHApLGEuc3VidHJhY3QocCxjLHApLGEuYWRkKHAsbCxwKSxhLnN1YnRyYWN0KHAsZSxkKSxtPWEuZG90KG4sZCkscj1NYXRoLm1pbihtLHIpLGk9TWF0aC5tYXgobSxpKSxhLmFkZChzLHUscCksYS5zdWJ0cmFjdChwLGMscCksYS5zdWJ0cmFjdChwLGwscCksYS5zdWJ0cmFjdChwLGUsZCksbT1hLmRvdChuLGQpLHI9TWF0aC5taW4obSxyKSxpPU1hdGgubWF4KG0saSksYS5zdWJ0cmFjdChzLHUscCksYS5hZGQocCxjLHApLGEuYWRkKHAsbCxwKSxhLnN1YnRyYWN0KHAsZSxkKSxtPWEuZG90KG4sZCkscj1NYXRoLm1pbihtLHIpLGk9TWF0aC5tYXgobSxpKSxhLnN1YnRyYWN0KHMsdSxwKSxhLmFkZChwLGMscCksYS5zdWJ0cmFjdChwLGwscCksYS5zdWJ0cmFjdChwLGUsZCksbT1hLmRvdChuLGQpLHI9TWF0aC5taW4obSxyKSxpPU1hdGgubWF4KG0saSksYS5zdWJ0cmFjdChzLHUscCksYS5zdWJ0cmFjdChwLGMscCksYS5hZGQocCxsLHApLGEuc3VidHJhY3QocCxlLGQpLG09YS5kb3QobixkKSxyPU1hdGgubWluKG0sciksaT1NYXRoLm1heChtLGkpLGEuc3VidHJhY3Qocyx1LHApLGEuc3VidHJhY3QocCxjLHApLGEuc3VidHJhY3QocCxsLHApLGEuc3VidHJhY3QocCxlLGQpLG09YS5kb3QobixkKSxyPU1hdGgubWluKG0sciksaT1NYXRoLm1heChtLGkpLG8uc3RhcnQ9cixvLnN0b3A9aSxvfTtHTj1uZXcgYSx6Tj1uZXcgYSxqTj1uZXcgYTtEZS5jb21wdXRlQ29ybmVycz1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgiYm94Iix0KSxoKGUpfHwoZT1bbmV3IGEsbmV3IGEsbmV3IGEsbmV3IGEsbmV3IGEsbmV3IGEsbmV3IGEsbmV3IGFdKTtsZXQgbj10LmNlbnRlcixvPXQuaGFsZkF4ZXMscj1KLmdldENvbHVtbihvLDAsR04pLGk9Si5nZXRDb2x1bW4obywxLHpOKSxzPUouZ2V0Q29sdW1uKG8sMixqTik7cmV0dXJuIGEuY2xvbmUobixlWzBdKSxhLnN1YnRyYWN0KGVbMF0scixlWzBdKSxhLnN1YnRyYWN0KGVbMF0saSxlWzBdKSxhLnN1YnRyYWN0KGVbMF0scyxlWzBdKSxhLmNsb25lKG4sZVsxXSksYS5zdWJ0cmFjdChlWzFdLHIsZVsxXSksYS5zdWJ0cmFjdChlWzFdLGksZVsxXSksYS5hZGQoZVsxXSxzLGVbMV0pLGEuY2xvbmUobixlWzJdKSxhLnN1YnRyYWN0KGVbMl0scixlWzJdKSxhLmFkZChlWzJdLGksZVsyXSksYS5zdWJ0cmFjdChlWzJdLHMsZVsyXSksYS5jbG9uZShuLGVbM10pLGEuc3VidHJhY3QoZVszXSxyLGVbM10pLGEuYWRkKGVbM10saSxlWzNdKSxhLmFkZChlWzNdLHMsZVszXSksYS5jbG9uZShuLGVbNF0pLGEuYWRkKGVbNF0scixlWzRdKSxhLnN1YnRyYWN0KGVbNF0saSxlWzRdKSxhLnN1YnRyYWN0KGVbNF0scyxlWzRdKSxhLmNsb25lKG4sZVs1XSksYS5hZGQoZVs1XSxyLGVbNV0pLGEuc3VidHJhY3QoZVs1XSxpLGVbNV0pLGEuYWRkKGVbNV0scyxlWzVdKSxhLmNsb25lKG4sZVs2XSksYS5hZGQoZVs2XSxyLGVbNl0pLGEuYWRkKGVbNl0saSxlWzZdKSxhLnN1YnRyYWN0KGVbNl0scyxlWzZdKSxhLmNsb25lKG4sZVs3XSksYS5hZGQoZVs3XSxyLGVbN10pLGEuYWRkKGVbN10saSxlWzddKSxhLmFkZChlWzddLHMsZVs3XSksZX07SE49bmV3IEo7RGUuY29tcHV0ZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJib3giLHQpLGgoZSl8fChlPW5ldyBzdCk7bGV0IG49dC5jZW50ZXIsbz1KLm11bHRpcGx5QnlVbmlmb3JtU2NhbGUodC5oYWxmQXhlcywyLEhOKTtyZXR1cm4gc3QuZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24obyxuLGUpfTtxTj1uZXcgQXQ7RGUuaXNPY2NsdWRlZD1mdW5jdGlvbih0LGUpe2lmKCFoKHQpKXRocm93IG5ldyBGKCJib3ggaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEYoIm9jY2x1ZGVyIGlzIHJlcXVpcmVkLiIpO2xldCBuPUF0LmZyb21PcmllbnRlZEJvdW5kaW5nQm94KHQscU4pO3JldHVybiFlLmlzQm91bmRpbmdTcGhlcmVWaXNpYmxlKG4pfTtEZS5wcm90b3R5cGUuaW50ZXJzZWN0UGxhbmU9ZnVuY3Rpb24odCl7cmV0dXJuIERlLmludGVyc2VjdFBsYW5lKHRoaXMsdCl9O0RlLnByb3RvdHlwZS5kaXN0YW5jZVNxdWFyZWRUbz1mdW5jdGlvbih0KXtyZXR1cm4gRGUuZGlzdGFuY2VTcXVhcmVkVG8odGhpcyx0KX07RGUucHJvdG90eXBlLmNvbXB1dGVQbGFuZURpc3RhbmNlcz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIERlLmNvbXB1dGVQbGFuZURpc3RhbmNlcyh0aGlzLHQsZSxuKX07RGUucHJvdG90eXBlLmNvbXB1dGVDb3JuZXJzPWZ1bmN0aW9uKHQpe3JldHVybiBEZS5jb21wdXRlQ29ybmVycyh0aGlzLHQpfTtEZS5wcm90b3R5cGUuY29tcHV0ZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBEZS5jb21wdXRlVHJhbnNmb3JtYXRpb24odGhpcyx0KX07RGUucHJvdG90eXBlLmlzT2NjbHVkZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIERlLmlzT2NjbHVkZWQodGhpcyx0KX07RGUuZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxoKHQpJiZoKGUpJiZhLmVxdWFscyh0LmNlbnRlcixlLmNlbnRlcikmJkouZXF1YWxzKHQuaGFsZkF4ZXMsZS5oYWxmQXhlcyl9O0RlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gRGUuY2xvbmUodGhpcyx0KX07RGUucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtyZXR1cm4gRGUuZXF1YWxzKHRoaXMsdCl9O1NvPURlfSk7ZnVuY3Rpb24gSncodCxlLG4sbyxyKXtsZXQgaT1hLnN1YnRyYWN0KHQsZSxLTikscz1hLmRvdChuLGkpLGY9YS5kb3QobyxpKTtyZXR1cm4gdHQuZnJvbUVsZW1lbnRzKHMsZixyKX12YXIgUGYsS04sWXcsJHcsWncsUXcsZGEsUzA9WigoKT0+e0ZlKCk7RnQoKTtYdCgpO0ZuKCk7cGEoKTtQZj17fSxLTj1uZXcgYSxZdz1uZXcgYSwkdz1uZXcgYSxadz1uZXcgYSxRdz1uZXcgU287UGYudmFsaWRPdXRsaW5lPWZ1bmN0aW9uKHQpe3kuZGVmaW5lZCgicG9zaXRpb25zIix0KTtsZXQgbj1Tby5mcm9tUG9pbnRzKHQsUXcpLmhhbGZBeGVzLG89Si5nZXRDb2x1bW4obiwwLFl3KSxyPUouZ2V0Q29sdW1uKG4sMSwkdyksaT1KLmdldENvbHVtbihuLDIsWncpLHM9YS5tYWduaXR1ZGUobyksZj1hLm1hZ25pdHVkZShyKSx1PWEubWFnbml0dWRlKGkpO3JldHVybiEocz09PTAmJihmPT09MHx8dT09PTApfHxmPT09MCYmdT09PTApfTtQZi5jb21wdXRlUHJvamVjdFRvMkRBcmd1bWVudHM9ZnVuY3Rpb24odCxlLG4sbyl7eS5kZWZpbmVkKCJwb3NpdGlvbnMiLHQpLHkuZGVmaW5lZCgiY2VudGVyUmVzdWx0IixlKSx5LmRlZmluZWQoInBsYW5lQXhpczFSZXN1bHQiLG4pLHkuZGVmaW5lZCgicGxhbmVBeGlzMlJlc3VsdCIsbyk7bGV0IHI9U28uZnJvbVBvaW50cyh0LFF3KSxpPXIuaGFsZkF4ZXMscz1KLmdldENvbHVtbihpLDAsWXcpLGY9Si5nZXRDb2x1bW4oaSwxLCR3KSx1PUouZ2V0Q29sdW1uKGksMixadyksYz1hLm1hZ25pdHVkZShzKSxsPWEubWFnbml0dWRlKGYpLHA9YS5tYWduaXR1ZGUodSksZD1NYXRoLm1pbihjLGwscCk7aWYoYz09PTAmJihsPT09MHx8cD09PTApfHxsPT09MCYmcD09PTApcmV0dXJuITE7bGV0IG0sXztyZXR1cm4oZD09PWx8fGQ9PT1wKSYmKG09cyksZD09PWM/bT1mOmQ9PT1wJiYoXz1mKSwoZD09PWN8fGQ9PT1sKSYmKF89dSksYS5ub3JtYWxpemUobSxuKSxhLm5vcm1hbGl6ZShfLG8pLGEuY2xvbmUoci5jZW50ZXIsZSksITB9O1BmLmNyZWF0ZVByb2plY3RQb2ludHNUbzJERnVuY3Rpb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiBmdW5jdGlvbihvKXtsZXQgcj1uZXcgQXJyYXkoby5sZW5ndGgpO2ZvcihsZXQgaT0wO2k8by5sZW5ndGg7aSsrKXJbaV09Sncob1tpXSx0LGUsbik7cmV0dXJuIHJ9fTtQZi5jcmVhdGVQcm9qZWN0UG9pbnRUbzJERnVuY3Rpb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiBmdW5jdGlvbihvLHIpe3JldHVybiBKdyhvLHQsZSxuLHIpfX07ZGE9UGZ9KTt2YXIgV04sX2UsZmM9WigoKT0+e1dOPXtOT05FOjAsR0VPREVTSUM6MSxSSFVNQjoyfSxfZT1PYmplY3QuZnJlZXplKFdOKX0pO2Z1bmN0aW9uIHgwKHQsZSxuKXtpZih0PT09MClyZXR1cm4gZSpuO2xldCBvPXQqdCxyPW8qbyxpPXIqbyxzPWkqbyxmPXMqbyx1PWYqbyxjPW4sbD1NYXRoLnNpbigyKmMpLHA9TWF0aC5zaW4oNCpjKSxkPU1hdGguc2luKDYqYyksbT1NYXRoLnNpbig4KmMpLF89TWF0aC5zaW4oMTAqYyksZz1NYXRoLnNpbigxMipjKTtyZXR1cm4gZSooKDEtby80LTMqci82NC01KmkvMjU2LTE3NSpzLzE2Mzg0LTQ0MSpmLzY1NTM2LTQ4NTEqdS8xMDQ4NTc2KSpjLSgzKm8vOCszKnIvMzIrNDUqaS8xMDI0KzEwNSpzLzQwOTYrMjIwNSpmLzEzMTA3Mis2MjM3KnUvNTI0Mjg4KSpsKygxNSpyLzI1Nis0NSppLzEwMjQrNTI1KnMvMTYzODQrMTU3NSpmLzY1NTM2KzE1NTkyNSp1LzgzODg2MDgpKnAtKDM1KmkvMzA3MisxNzUqcy8xMjI4OCszNjc1KmYvMjYyMTQ0KzEzNDc1KnUvMTA0ODU3NikqZCsoMzE1KnMvMTMxMDcyKzIyMDUqZi81MjQyODgrNDM2NTkqdS84Mzg4NjA4KSptLSg2OTMqZi8xMzEwNzIwKzYyMzcqdS81MjQyODgwKSpfKzEwMDEqdS84Mzg4NjA4KmcpfWZ1bmN0aW9uIFhOKHQsZSxuKXtsZXQgbz10L247aWYoZT09PTApcmV0dXJuIG87bGV0IHI9bypvLGk9cipvLHM9aSpvLGY9ZSx1PWYqZixjPXUqdSxsPWMqdSxwPWwqdSxkPXAqdSxtPWQqdSxfPU1hdGguc2luKDIqbyksZz1NYXRoLmNvcygyKm8pLGI9TWF0aC5zaW4oNCpvKSx3PU1hdGguY29zKDQqbyksTz1NYXRoLnNpbig2Km8pLEU9TWF0aC5jb3MoNipvKSxUPU1hdGguc2luKDgqbyksQz1NYXRoLmNvcyg4Km8pLE49TWF0aC5zaW4oMTAqbyksST1NYXRoLmNvcygxMCpvKSxEPU1hdGguc2luKDEyKm8pO3JldHVybiBvK28qdS80KzcqbypjLzY0KzE1Km8qbC8yNTYrNTc5Km8qcC8xNjM4NCsxNTE1Km8qZC82NTUzNisxNjgzNypvKm0vMTA0ODU3NisoMypvKmMvMTYrNDUqbypsLzI1Ni1vKigzMipyLTU2MSkqcC80MDk2LW8qKDIzMipyLTE2NzcpKmQvMTYzODQrbyooMzk5OTg1LTkwNTYwKnIrNTEyKnMpKm0vNTI0Mjg4MCkqZysoMjEqbypsLzI1Nis0ODMqbypwLzQwOTYtbyooMjI0KnItMTk2OSkqZC8xNjM4NC1vKigzMzE1MipyLTExMjU5OSkqbS8xMDQ4NTc2KSp3KygxNTEqbypwLzQwOTYrNDY4MSpvKmQvNjU1MzYrMTQ3OSpvKm0vMTYzODQtNDUzKmkqbS8zMjc2OCkqRSsoMTA5NypvKmQvNjU1MzYrNDI3ODMqbyptLzEwNDg1NzYpKkMrODAxMSpvKm0vMTA0ODU3NipJKygzKnUvOCszKmMvMTYrMjEzKmwvMjA0OC0zKnIqbC82NCsyNTUqcC80MDk2LTMzKnIqcC81MTIrMjA4NjEqZC81MjQyODgtMzMqcipkLzUxMitzKmQvMTAyNCsyODI3MyptLzEwNDg1NzYtNDcxKnIqbS84MTkyKzkqcyptLzQwOTYpKl8rKDIxKmMvMjU2KzIxKmwvMjU2KzUzMypwLzgxOTItMjEqcipwLzUxMisxOTcqZC80MDk2LTMxNSpyKmQvNDA5Nis1ODQwMzkqbS8xNjc3NzIxNi0xMjUxNypyKm0vMTMxMDcyKzcqcyptLzIwNDgpKmIrKDE1MSpsLzYxNDQrMTUxKnAvNDA5Nis1MDE5KmQvMTMxMDcyLTQ1MypyKmQvMTYzODQrMjY5NjUqbS83ODY0MzItODYwNypyKm0vMTMxMDcyKSpPKygxMDk3KnAvMTMxMDcyKzEwOTcqZC82NTUzNisyMjU3OTcqbS8xMDQ4NTc2MC0xMDk3KnIqbS82NTUzNikqVCsoODAxMSpkLzI2MjE0NDArODAxMSptLzEwNDg1NzYpKk4rMjkzMzkzKm0vMjUxNjU4MjQwKkR9ZnVuY3Rpb24gbWEodCxlKXtpZih0PT09MClyZXR1cm4gTWF0aC5sb2coTWF0aC50YW4oLjUqKE0uUElfT1ZFUl9UV08rZSkpKTtsZXQgbj10Kk1hdGguc2luKGUpO3JldHVybiBNYXRoLmxvZyhNYXRoLnRhbiguNSooTS5QSV9PVkVSX1RXTytlKSkpLXQvMipNYXRoLmxvZygoMStuKS8oMS1uKSl9ZnVuY3Rpb24gWU4odCxlLG4sbyxyKXtsZXQgaT1tYSh0Ll9lbGxpcHRpY2l0eSxuKSxzPW1hKHQuX2VsbGlwdGljaXR5LHIpO3JldHVybiBNYXRoLmF0YW4yKE0ubmVnYXRpdmVQaVRvUGkoby1lKSxzLWkpfWZ1bmN0aW9uICROKHQsZSxuLG8scixpLHMpe2xldCBmPXQuX2hlYWRpbmcsdT1pLW8sYz0wO2lmKE0uZXF1YWxzRXBzaWxvbihNYXRoLmFicyhmKSxNLlBJX09WRVJfVFdPLE0uRVBTSUxPTjgpKWlmKGU9PT1uKWM9ZSpNYXRoLmNvcyhyKSpNLm5lZ2F0aXZlUGlUb1BpKHUpO2Vsc2V7bGV0IGw9TWF0aC5zaW4ocik7Yz1lKk1hdGguY29zKHIpKk0ubmVnYXRpdmVQaVRvUGkodSkvTWF0aC5zcXJ0KDEtdC5fZWxsaXB0aWNpdHlTcXVhcmVkKmwqbCl9ZWxzZXtsZXQgbD14MCh0Ll9lbGxpcHRpY2l0eSxlLHIpO2M9KHgwKHQuX2VsbGlwdGljaXR5LGUscyktbCkvTWF0aC5jb3MoZil9cmV0dXJuIE1hdGguYWJzKGMpfWZ1bmN0aW9uIHRUKHQsZSxuLG8pe2xldCByPWEubm9ybWFsaXplKG8uY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oZSxDMCksWk4pLGk9YS5ub3JtYWxpemUoby5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihuLEMwKSxDMCk7eS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoInZhbHVlIixNYXRoLmFicyhNYXRoLmFicyhhLmFuZ2xlQmV0d2VlbihyLGkpKS1NYXRoLlBJKSwuMDEyNSk7bGV0IHM9by5tYXhpbXVtUmFkaXVzLGY9by5taW5pbXVtUmFkaXVzLHU9cypzLGM9ZipmO3QuX2VsbGlwdGljaXR5U3F1YXJlZD0odS1jKS91LHQuX2VsbGlwdGljaXR5PU1hdGguc3FydCh0Ll9lbGxpcHRpY2l0eVNxdWFyZWQpLHQuX3N0YXJ0PWF0LmNsb25lKGUsdC5fc3RhcnQpLHQuX3N0YXJ0LmhlaWdodD0wLHQuX2VuZD1hdC5jbG9uZShuLHQuX2VuZCksdC5fZW5kLmhlaWdodD0wLHQuX2hlYWRpbmc9WU4odCxlLmxvbmdpdHVkZSxlLmxhdGl0dWRlLG4ubG9uZ2l0dWRlLG4ubGF0aXR1ZGUpLHQuX2Rpc3RhbmNlPSROKHQsby5tYXhpbXVtUmFkaXVzLG8ubWluaW11bVJhZGl1cyxlLmxvbmdpdHVkZSxlLmxhdGl0dWRlLG4ubG9uZ2l0dWRlLG4ubGF0aXR1ZGUpfWZ1bmN0aW9uIGVUKHQsZSxuLG8scixpKXtpZihuPT09MClyZXR1cm4gYXQuY2xvbmUodCxpKTtsZXQgcz1yKnIsZix1LGM7aWYoTWF0aC5hYnMoTS5QSV9PVkVSX1RXTy1NYXRoLmFicyhlKSk+TS5FUFNJTE9OOCl7bGV0IGw9eDAocixvLHQubGF0aXR1ZGUpLHA9bipNYXRoLmNvcyhlKSxkPWwrcDtpZih1PVhOKGQscixvKSxNYXRoLmFicyhlKTxNLkVQU0lMT04xMClmPU0ubmVnYXRpdmVQaVRvUGkodC5sb25naXR1ZGUpO2Vsc2V7bGV0IG09bWEocix0LmxhdGl0dWRlKSxfPW1hKHIsdSk7Yz1NYXRoLnRhbihlKSooXy1tKSxmPU0ubmVnYXRpdmVQaVRvUGkodC5sb25naXR1ZGUrYyl9fWVsc2V7dT10LmxhdGl0dWRlO2xldCBsO2lmKHI9PT0wKWw9bypNYXRoLmNvcyh0LmxhdGl0dWRlKTtlbHNle2xldCBwPU1hdGguc2luKHQubGF0aXR1ZGUpO2w9bypNYXRoLmNvcyh0LmxhdGl0dWRlKS9NYXRoLnNxcnQoMS1zKnAqcCl9Yz1uL2wsZT4wP2Y9TS5uZWdhdGl2ZVBpVG9QaSh0LmxvbmdpdHVkZStjKTpmPU0ubmVnYXRpdmVQaVRvUGkodC5sb25naXR1ZGUtYyl9cmV0dXJuIGgoaSk/KGkubG9uZ2l0dWRlPWYsaS5sYXRpdHVkZT11LGkuaGVpZ2h0PTAsaSk6bmV3IGF0KGYsdSwwKX1mdW5jdGlvbiBGaSh0LGUsbil7bGV0IG89eChuLCQuV0dTODQpO3RoaXMuX2VsbGlwc29pZD1vLHRoaXMuX3N0YXJ0PW5ldyBhdCx0aGlzLl9lbmQ9bmV3IGF0LHRoaXMuX2hlYWRpbmc9dm9pZCAwLHRoaXMuX2Rpc3RhbmNlPXZvaWQgMCx0aGlzLl9lbGxpcHRpY2l0eT12b2lkIDAsdGhpcy5fZWxsaXB0aWNpdHlTcXVhcmVkPXZvaWQgMCxoKHQpJiZoKGUpJiZ0VCh0aGlzLHQsZSxvKX12YXIgWk4sQzAsUW8sTWY9WigoKT0+e0Z0KCk7UGUoKTtYdCgpO0l0KCk7ZnQoKTtIdCgpO1p0KCk7V3QoKTtaTj1uZXcgYSxDMD1uZXcgYTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhGaS5wcm90b3R5cGUse2VsbGlwc29pZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VsbGlwc29pZH19LHN1cmZhY2VEaXN0YW5jZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkuZGVmaW5lZCgiZGlzdGFuY2UiLHRoaXMuX2Rpc3RhbmNlKSx0aGlzLl9kaXN0YW5jZX19LHN0YXJ0OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RhcnR9fSxlbmQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbmR9fSxoZWFkaW5nOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS5kZWZpbmVkKCJkaXN0YW5jZSIsdGhpcy5fZGlzdGFuY2UpLHRoaXMuX2hlYWRpbmd9fX0pO0ZpLmZyb21TdGFydEhlYWRpbmdEaXN0YW5jZT1mdW5jdGlvbih0LGUsbixvLHIpe3kuZGVmaW5lZCgic3RhcnQiLHQpLHkuZGVmaW5lZCgiaGVhZGluZyIsZSkseS5kZWZpbmVkKCJkaXN0YW5jZSIsbikseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuKCJkaXN0YW5jZSIsbiwwKTtsZXQgaT14KG8sJC5XR1M4NCkscz1pLm1heGltdW1SYWRpdXMsZj1pLm1pbmltdW1SYWRpdXMsdT1zKnMsYz1mKmYsbD1NYXRoLnNxcnQoKHUtYykvdSk7ZT1NLm5lZ2F0aXZlUGlUb1BpKGUpO2xldCBwPWVUKHQsZSxuLGkubWF4aW11bVJhZGl1cyxsKTtyZXR1cm4haChyKXx8aChvKSYmIW8uZXF1YWxzKHIuZWxsaXBzb2lkKT9uZXcgRmkodCxwLGkpOihyLnNldEVuZFBvaW50cyh0LHApLHIpfTtGaS5wcm90b3R5cGUuc2V0RW5kUG9pbnRzPWZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJzdGFydCIsdCkseS5kZWZpbmVkKCJlbmQiLGUpLHRUKHRoaXMsdCxlLHRoaXMuX2VsbGlwc29pZCl9O0ZpLnByb3RvdHlwZS5pbnRlcnBvbGF0ZVVzaW5nRnJhY3Rpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5pbnRlcnBvbGF0ZVVzaW5nU3VyZmFjZURpc3RhbmNlKHQqdGhpcy5fZGlzdGFuY2UsZSl9O0ZpLnByb3RvdHlwZS5pbnRlcnBvbGF0ZVVzaW5nU3VyZmFjZURpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7aWYoeS50eXBlT2YubnVtYmVyKCJkaXN0YW5jZSIsdCksIWgodGhpcy5fZGlzdGFuY2UpfHx0aGlzLl9kaXN0YW5jZT09PTApdGhyb3cgbmV3IEYoIkVsbGlwc29pZFJodW1iTGluZSBtdXN0IGhhdmUgZGlzdGluY3Qgc3RhcnQgYW5kIGVuZCBzZXQuIik7cmV0dXJuIGVUKHRoaXMuX3N0YXJ0LHRoaXMuX2hlYWRpbmcsdCx0aGlzLl9lbGxpcHNvaWQubWF4aW11bVJhZGl1cyx0aGlzLl9lbGxpcHRpY2l0eSxlKX07RmkucHJvdG90eXBlLmZpbmRJbnRlcnNlY3Rpb25XaXRoTG9uZ2l0dWRlPWZ1bmN0aW9uKHQsZSl7aWYoeS50eXBlT2YubnVtYmVyKCJpbnRlcnNlY3Rpb25Mb25naXR1ZGUiLHQpLCFoKHRoaXMuX2Rpc3RhbmNlKXx8dGhpcy5fZGlzdGFuY2U9PT0wKXRocm93IG5ldyBGKCJFbGxpcHNvaWRSaHVtYkxpbmUgbXVzdCBoYXZlIGRpc3RpbmN0IHN0YXJ0IGFuZCBlbmQgc2V0LiIpO2xldCBuPXRoaXMuX2VsbGlwdGljaXR5LG89dGhpcy5faGVhZGluZyxyPU1hdGguYWJzKG8pLGk9dGhpcy5fc3RhcnQ7aWYodD1NLm5lZ2F0aXZlUGlUb1BpKHQpLE0uZXF1YWxzRXBzaWxvbihNYXRoLmFicyh0KSxNYXRoLlBJLE0uRVBTSUxPTjE0KSYmKHQ9TS5zaWduKGkubG9uZ2l0dWRlKSpNYXRoLlBJKSxoKGUpfHwoZT1uZXcgYXQpLE1hdGguYWJzKE0uUElfT1ZFUl9UV08tcik8PU0uRVBTSUxPTjgpcmV0dXJuIGUubG9uZ2l0dWRlPXQsZS5sYXRpdHVkZT1pLmxhdGl0dWRlLGUuaGVpZ2h0PTAsZTtpZihNLmVxdWFsc0Vwc2lsb24oTWF0aC5hYnMoTS5QSV9PVkVSX1RXTy1yKSxNLlBJX09WRVJfVFdPLE0uRVBTSUxPTjgpKXJldHVybiBNLmVxdWFsc0Vwc2lsb24odCxpLmxvbmdpdHVkZSxNLkVQU0lMT04xMik/dm9pZCAwOihlLmxvbmdpdHVkZT10LGUubGF0aXR1ZGU9TS5QSV9PVkVSX1RXTypNLnNpZ24oTS5QSV9PVkVSX1RXTy1vKSxlLmhlaWdodD0wLGUpO2xldCBzPWkubGF0aXR1ZGUsZj1uKk1hdGguc2luKHMpLHU9TWF0aC50YW4oLjUqKE0uUElfT1ZFUl9UV08rcykpKk1hdGguZXhwKCh0LWkubG9uZ2l0dWRlKS9NYXRoLnRhbihvKSksYz0oMStmKS8oMS1mKSxsPWkubGF0aXR1ZGUscDtkb3twPWw7bGV0IGQ9bipNYXRoLnNpbihwKSxtPSgxK2QpLygxLWQpO2w9MipNYXRoLmF0YW4odSpNYXRoLnBvdyhtL2Msbi8yKSktTS5QSV9PVkVSX1RXT313aGlsZSghTS5lcXVhbHNFcHNpbG9uKGwscCxNLkVQU0lMT04xMikpO3JldHVybiBlLmxvbmdpdHVkZT10LGUubGF0aXR1ZGU9bCxlLmhlaWdodD0wLGV9O0ZpLnByb3RvdHlwZS5maW5kSW50ZXJzZWN0aW9uV2l0aExhdGl0dWRlPWZ1bmN0aW9uKHQsZSl7aWYoeS50eXBlT2YubnVtYmVyKCJpbnRlcnNlY3Rpb25MYXRpdHVkZSIsdCksIWgodGhpcy5fZGlzdGFuY2UpfHx0aGlzLl9kaXN0YW5jZT09PTApdGhyb3cgbmV3IEYoIkVsbGlwc29pZFJodW1iTGluZSBtdXN0IGhhdmUgZGlzdGluY3Qgc3RhcnQgYW5kIGVuZCBzZXQuIik7bGV0IG49dGhpcy5fZWxsaXB0aWNpdHksbz10aGlzLl9oZWFkaW5nLHI9dGhpcy5fc3RhcnQ7aWYoTS5lcXVhbHNFcHNpbG9uKE1hdGguYWJzKG8pLE0uUElfT1ZFUl9UV08sTS5FUFNJTE9OOCkpcmV0dXJuO2xldCBpPW1hKG4sci5sYXRpdHVkZSkscz1tYShuLHQpLGY9TWF0aC50YW4obykqKHMtaSksdT1NLm5lZ2F0aXZlUGlUb1BpKHIubG9uZ2l0dWRlK2YpO3JldHVybiBoKGUpPyhlLmxvbmdpdHVkZT11LGUubGF0aXR1ZGU9dCxlLmhlaWdodD0wLGUpOm5ldyBhdCh1LHQsMCl9O1FvPUZpfSk7ZnVuY3Rpb24gUU4odCxlKXt0aGlzLnBvc2l0aW9ucz1oKHQpP3Q6W10sdGhpcy5ob2xlcz1oKGUpP2U6W119dmFyIG5ULG9UPVooKCk9PntmdCgpO25UPVFOfSk7dmFyIGFUPVZuKChQWCxJMCk9PnsidXNlIHN0cmljdCI7STAuZXhwb3J0cz1KcDtJMC5leHBvcnRzLmRlZmF1bHQ9SnA7ZnVuY3Rpb24gSnAodCxlLG4pe249bnx8Mjt2YXIgbz1lJiZlLmxlbmd0aCxyPW8/ZVswXSpuOnQubGVuZ3RoLGk9aVQodCwwLHIsbiwhMCkscz1bXTtpZighaXx8aS5uZXh0PT09aS5wcmV2KXJldHVybiBzO3ZhciBmLHUsYyxsLHAsZCxtO2lmKG8mJihpPW9JKHQsZSxpLG4pKSx0Lmxlbmd0aD44MCpuKXtmPWM9dFswXSx1PWw9dFsxXTtmb3IodmFyIF89bjtfPHI7Xys9bilwPXRbX10sZD10W18rMV0scDxmJiYoZj1wKSxkPHUmJih1PWQpLHA+YyYmKGM9cCksZD5sJiYobD1kKTttPU1hdGgubWF4KGMtZixsLXUpLG09bSE9PTA/MzI3NjcvbTowfXJldHVybiBOZihpLHMsbixmLHUsbSwwKSxzfWZ1bmN0aW9uIGlUKHQsZSxuLG8scil7dmFyIGkscztpZihyPT09TjAodCxlLG4sbyk+MClmb3IoaT1lO2k8bjtpKz1vKXM9clQoaSx0W2ldLHRbaSsxXSxzKTtlbHNlIGZvcihpPW4tbztpPj1lO2ktPW8pcz1yVChpLHRbaV0sdFtpKzFdLHMpO3JldHVybiBzJiZ0ZChzLHMubmV4dCkmJih2ZihzKSxzPXMubmV4dCksc31mdW5jdGlvbiB1Yyh0LGUpe2lmKCF0KXJldHVybiB0O2V8fChlPXQpO3ZhciBuPXQsbztkbyBpZihvPSExLCFuLnN0ZWluZXImJih0ZChuLG4ubmV4dCl8fEluKG4ucHJldixuLG4ubmV4dCk9PT0wKSl7aWYodmYobiksbj1lPW4ucHJldixuPT09bi5uZXh0KWJyZWFrO289ITB9ZWxzZSBuPW4ubmV4dDt3aGlsZShvfHxuIT09ZSk7cmV0dXJuIGV9ZnVuY3Rpb24gTmYodCxlLG4sbyxyLGkscyl7aWYodCl7IXMmJmkmJmFJKHQsbyxyLGkpO2Zvcih2YXIgZj10LHUsYzt0LnByZXYhPT10Lm5leHQ7KXtpZih1PXQucHJldixjPXQubmV4dCxpP3RJKHQsbyxyLGkpOkpOKHQpKXtlLnB1c2godS5pL258MCksZS5wdXNoKHQuaS9ufDApLGUucHVzaChjLmkvbnwwKSx2Zih0KSx0PWMubmV4dCxmPWMubmV4dDtjb250aW51ZX1pZih0PWMsdD09PWYpe3M/cz09PTE/KHQ9ZUkodWModCksZSxuKSxOZih0LGUsbixvLHIsaSwyKSk6cz09PTImJm5JKHQsZSxuLG8scixpKTpOZih1Yyh0KSxlLG4sbyxyLGksMSk7YnJlYWt9fX19ZnVuY3Rpb24gSk4odCl7dmFyIGU9dC5wcmV2LG49dCxvPXQubmV4dDtpZihJbihlLG4sbyk+PTApcmV0dXJuITE7Zm9yKHZhciByPWUueCxpPW4ueCxzPW8ueCxmPWUueSx1PW4ueSxjPW8ueSxsPXI8aT9yPHM/cjpzOmk8cz9pOnMscD1mPHU/ZjxjP2Y6Yzp1PGM/dTpjLGQ9cj5pP3I+cz9yOnM6aT5zP2k6cyxtPWY+dT9mPmM/ZjpjOnU+Yz91OmMsXz1vLm5leHQ7XyE9PWU7KXtpZihfLng+PWwmJl8ueDw9ZCYmXy55Pj1wJiZfLnk8PW0mJmhhKHIsZixpLHUscyxjLF8ueCxfLnkpJiZJbihfLnByZXYsXyxfLm5leHQpPj0wKXJldHVybiExO189Xy5uZXh0fXJldHVybiEwfWZ1bmN0aW9uIHRJKHQsZSxuLG8pe3ZhciByPXQucHJldixpPXQscz10Lm5leHQ7aWYoSW4ocixpLHMpPj0wKXJldHVybiExO2Zvcih2YXIgZj1yLngsdT1pLngsYz1zLngsbD1yLnkscD1pLnksZD1zLnksbT1mPHU/ZjxjP2Y6Yzp1PGM/dTpjLF89bDxwP2w8ZD9sOmQ6cDxkP3A6ZCxnPWY+dT9mPmM/ZjpjOnU+Yz91OmMsYj1sPnA/bD5kP2w6ZDpwPmQ/cDpkLHc9UDAobSxfLGUsbixvKSxPPVAwKGcsYixlLG4sbyksRT10LnByZXZaLFQ9dC5uZXh0WjtFJiZFLno+PXcmJlQmJlQuejw9Tzspe2lmKEUueD49bSYmRS54PD1nJiZFLnk+PV8mJkUueTw9YiYmRSE9PXImJkUhPT1zJiZoYShmLGwsdSxwLGMsZCxFLngsRS55KSYmSW4oRS5wcmV2LEUsRS5uZXh0KT49MHx8KEU9RS5wcmV2WixULng+PW0mJlQueDw9ZyYmVC55Pj1fJiZULnk8PWImJlQhPT1yJiZUIT09cyYmaGEoZixsLHUscCxjLGQsVC54LFQueSkmJkluKFQucHJldixULFQubmV4dCk+PTApKXJldHVybiExO1Q9VC5uZXh0Wn1mb3IoO0UmJkUuej49dzspe2lmKEUueD49bSYmRS54PD1nJiZFLnk+PV8mJkUueTw9YiYmRSE9PXImJkUhPT1zJiZoYShmLGwsdSxwLGMsZCxFLngsRS55KSYmSW4oRS5wcmV2LEUsRS5uZXh0KT49MClyZXR1cm4hMTtFPUUucHJldlp9Zm9yKDtUJiZULno8PU87KXtpZihULng+PW0mJlQueDw9ZyYmVC55Pj1fJiZULnk8PWImJlQhPT1yJiZUIT09cyYmaGEoZixsLHUscCxjLGQsVC54LFQueSkmJkluKFQucHJldixULFQubmV4dCk+PTApcmV0dXJuITE7VD1ULm5leHRafXJldHVybiEwfWZ1bmN0aW9uIGVJKHQsZSxuKXt2YXIgbz10O2Rve3ZhciByPW8ucHJldixpPW8ubmV4dC5uZXh0OyF0ZChyLGkpJiZzVChyLG8sby5uZXh0LGkpJiZJZihyLGkpJiZJZihpLHIpJiYoZS5wdXNoKHIuaS9ufDApLGUucHVzaChvLmkvbnwwKSxlLnB1c2goaS5pL258MCksdmYobyksdmYoby5uZXh0KSxvPXQ9aSksbz1vLm5leHR9d2hpbGUobyE9PXQpO3JldHVybiB1YyhvKX1mdW5jdGlvbiBuSSh0LGUsbixvLHIsaSl7dmFyIHM9dDtkb3tmb3IodmFyIGY9cy5uZXh0Lm5leHQ7ZiE9PXMucHJldjspe2lmKHMuaSE9PWYuaSYmbEkocyxmKSl7dmFyIHU9Y1QocyxmKTtzPXVjKHMscy5uZXh0KSx1PXVjKHUsdS5uZXh0KSxOZihzLGUsbixvLHIsaSwwKSxOZih1LGUsbixvLHIsaSwwKTtyZXR1cm59Zj1mLm5leHR9cz1zLm5leHR9d2hpbGUocyE9PXQpfWZ1bmN0aW9uIG9JKHQsZSxuLG8pe3ZhciByPVtdLGkscyxmLHUsYztmb3IoaT0wLHM9ZS5sZW5ndGg7aTxzO2krKylmPWVbaV0qbyx1PWk8cy0xP2VbaSsxXSpvOnQubGVuZ3RoLGM9aVQodCxmLHUsbywhMSksYz09PWMubmV4dCYmKGMuc3RlaW5lcj0hMCksci5wdXNoKHVJKGMpKTtmb3Ioci5zb3J0KHJJKSxpPTA7aTxyLmxlbmd0aDtpKyspbj1pSShyW2ldLG4pO3JldHVybiBufWZ1bmN0aW9uIHJJKHQsZSl7cmV0dXJuIHQueC1lLnh9ZnVuY3Rpb24gaUkodCxlKXt2YXIgbj1zSSh0LGUpO2lmKCFuKXJldHVybiBlO3ZhciBvPWNUKG4sdCk7cmV0dXJuIHVjKG8sby5uZXh0KSx1YyhuLG4ubmV4dCl9ZnVuY3Rpb24gc0kodCxlKXt2YXIgbj1lLG89dC54LHI9dC55LGk9LTEvMCxzO2Rve2lmKHI8PW4ueSYmcj49bi5uZXh0LnkmJm4ubmV4dC55IT09bi55KXt2YXIgZj1uLngrKHItbi55KSoobi5uZXh0Lngtbi54KS8obi5uZXh0Lnktbi55KTtpZihmPD1vJiZmPmkmJihpPWYscz1uLng8bi5uZXh0Lng/bjpuLm5leHQsZj09PW8pKXJldHVybiBzfW49bi5uZXh0fXdoaWxlKG4hPT1lKTtpZighcylyZXR1cm4gbnVsbDt2YXIgdT1zLGM9cy54LGw9cy55LHA9MS8wLGQ7bj1zO2RvIG8+PW4ueCYmbi54Pj1jJiZvIT09bi54JiZoYShyPGw/bzppLHIsYyxsLHI8bD9pOm8scixuLngsbi55KSYmKGQ9TWF0aC5hYnMoci1uLnkpLyhvLW4ueCksSWYobix0KSYmKGQ8cHx8ZD09PXAmJihuLng+cy54fHxuLng9PT1zLngmJmNJKHMsbikpKSYmKHM9bixwPWQpKSxuPW4ubmV4dDt3aGlsZShuIT09dSk7cmV0dXJuIHN9ZnVuY3Rpb24gY0kodCxlKXtyZXR1cm4gSW4odC5wcmV2LHQsZS5wcmV2KTwwJiZJbihlLm5leHQsdCx0Lm5leHQpPDB9ZnVuY3Rpb24gYUkodCxlLG4sbyl7dmFyIHI9dDtkbyByLno9PT0wJiYoci56PVAwKHIueCxyLnksZSxuLG8pKSxyLnByZXZaPXIucHJldixyLm5leHRaPXIubmV4dCxyPXIubmV4dDt3aGlsZShyIT09dCk7ci5wcmV2Wi5uZXh0Wj1udWxsLHIucHJldlo9bnVsbCxmSShyKX1mdW5jdGlvbiBmSSh0KXt2YXIgZSxuLG8scixpLHMsZix1LGM9MTtkb3tmb3Iobj10LHQ9bnVsbCxpPW51bGwscz0wO247KXtmb3IocysrLG89bixmPTAsZT0wO2U8YyYmKGYrKyxvPW8ubmV4dFosISFvKTtlKyspO2Zvcih1PWM7Zj4wfHx1PjAmJm87KWYhPT0wJiYodT09PTB8fCFvfHxuLno8PW8ueik/KHI9bixuPW4ubmV4dFosZi0tKToocj1vLG89by5uZXh0Wix1LS0pLGk/aS5uZXh0Wj1yOnQ9cixyLnByZXZaPWksaT1yO249b31pLm5leHRaPW51bGwsYyo9Mn13aGlsZShzPjEpO3JldHVybiB0fWZ1bmN0aW9uIFAwKHQsZSxuLG8scil7cmV0dXJuIHQ9KHQtbikqcnwwLGU9KGUtbykqcnwwLHQ9KHR8dDw8OCkmMTY3MTE5MzUsdD0odHx0PDw0KSYyNTI2NDUxMzUsdD0odHx0PDwyKSY4NTg5OTM0NTksdD0odHx0PDwxKSYxNDMxNjU1NzY1LGU9KGV8ZTw8OCkmMTY3MTE5MzUsZT0oZXxlPDw0KSYyNTI2NDUxMzUsZT0oZXxlPDwyKSY4NTg5OTM0NTksZT0oZXxlPDwxKSYxNDMxNjU1NzY1LHR8ZTw8MX1mdW5jdGlvbiB1SSh0KXt2YXIgZT10LG49dDtkbyhlLng8bi54fHxlLng9PT1uLngmJmUueTxuLnkpJiYobj1lKSxlPWUubmV4dDt3aGlsZShlIT09dCk7cmV0dXJuIG59ZnVuY3Rpb24gaGEodCxlLG4sbyxyLGkscyxmKXtyZXR1cm4oci1zKSooZS1mKT49KHQtcykqKGktZikmJih0LXMpKihvLWYpPj0obi1zKSooZS1mKSYmKG4tcykqKGktZik+PShyLXMpKihvLWYpfWZ1bmN0aW9uIGxJKHQsZSl7cmV0dXJuIHQubmV4dC5pIT09ZS5pJiZ0LnByZXYuaSE9PWUuaSYmIXBJKHQsZSkmJihJZih0LGUpJiZJZihlLHQpJiZkSSh0LGUpJiYoSW4odC5wcmV2LHQsZS5wcmV2KXx8SW4odCxlLnByZXYsZSkpfHx0ZCh0LGUpJiZJbih0LnByZXYsdCx0Lm5leHQpPjAmJkluKGUucHJldixlLGUubmV4dCk+MCl9ZnVuY3Rpb24gSW4odCxlLG4pe3JldHVybihlLnktdC55KSoobi54LWUueCktKGUueC10LngpKihuLnktZS55KX1mdW5jdGlvbiB0ZCh0LGUpe3JldHVybiB0Lng9PT1lLngmJnQueT09PWUueX1mdW5jdGlvbiBzVCh0LGUsbixvKXt2YXIgcj1RcChJbih0LGUsbikpLGk9UXAoSW4odCxlLG8pKSxzPVFwKEluKG4sbyx0KSksZj1RcChJbihuLG8sZSkpO3JldHVybiEhKHIhPT1pJiZzIT09Znx8cj09PTAmJlpwKHQsbixlKXx8aT09PTAmJlpwKHQsbyxlKXx8cz09PTAmJlpwKG4sdCxvKXx8Zj09PTAmJlpwKG4sZSxvKSl9ZnVuY3Rpb24gWnAodCxlLG4pe3JldHVybiBlLng8PU1hdGgubWF4KHQueCxuLngpJiZlLng+PU1hdGgubWluKHQueCxuLngpJiZlLnk8PU1hdGgubWF4KHQueSxuLnkpJiZlLnk+PU1hdGgubWluKHQueSxuLnkpfWZ1bmN0aW9uIFFwKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH1mdW5jdGlvbiBwSSh0LGUpe3ZhciBuPXQ7ZG97aWYobi5pIT09dC5pJiZuLm5leHQuaSE9PXQuaSYmbi5pIT09ZS5pJiZuLm5leHQuaSE9PWUuaSYmc1QobixuLm5leHQsdCxlKSlyZXR1cm4hMDtuPW4ubmV4dH13aGlsZShuIT09dCk7cmV0dXJuITF9ZnVuY3Rpb24gSWYodCxlKXtyZXR1cm4gSW4odC5wcmV2LHQsdC5uZXh0KTwwP0luKHQsZSx0Lm5leHQpPj0wJiZJbih0LHQucHJldixlKT49MDpJbih0LGUsdC5wcmV2KTwwfHxJbih0LHQubmV4dCxlKTwwfWZ1bmN0aW9uIGRJKHQsZSl7dmFyIG49dCxvPSExLHI9KHQueCtlLngpLzIsaT0odC55K2UueSkvMjtkbyBuLnk+aSE9bi5uZXh0Lnk+aSYmbi5uZXh0LnkhPT1uLnkmJnI8KG4ubmV4dC54LW4ueCkqKGktbi55KS8obi5uZXh0Lnktbi55KStuLngmJihvPSFvKSxuPW4ubmV4dDt3aGlsZShuIT09dCk7cmV0dXJuIG99ZnVuY3Rpb24gY1QodCxlKXt2YXIgbj1uZXcgTTAodC5pLHQueCx0LnkpLG89bmV3IE0wKGUuaSxlLngsZS55KSxyPXQubmV4dCxpPWUucHJldjtyZXR1cm4gdC5uZXh0PWUsZS5wcmV2PXQsbi5uZXh0PXIsci5wcmV2PW4sby5uZXh0PW4sbi5wcmV2PW8saS5uZXh0PW8sby5wcmV2PWksb31mdW5jdGlvbiByVCh0LGUsbixvKXt2YXIgcj1uZXcgTTAodCxlLG4pO3JldHVybiBvPyhyLm5leHQ9by5uZXh0LHIucHJldj1vLG8ubmV4dC5wcmV2PXIsby5uZXh0PXIpOihyLnByZXY9cixyLm5leHQ9cikscn1mdW5jdGlvbiB2Zih0KXt0Lm5leHQucHJldj10LnByZXYsdC5wcmV2Lm5leHQ9dC5uZXh0LHQucHJldlomJih0LnByZXZaLm5leHRaPXQubmV4dFopLHQubmV4dFomJih0Lm5leHRaLnByZXZaPXQucHJldlopfWZ1bmN0aW9uIE0wKHQsZSxuKXt0aGlzLmk9dCx0aGlzLng9ZSx0aGlzLnk9bix0aGlzLnByZXY9bnVsbCx0aGlzLm5leHQ9bnVsbCx0aGlzLno9MCx0aGlzLnByZXZaPW51bGwsdGhpcy5uZXh0Wj1udWxsLHRoaXMuc3RlaW5lcj0hMX1KcC5kZXZpYXRpb249ZnVuY3Rpb24odCxlLG4sbyl7dmFyIHI9ZSYmZS5sZW5ndGgsaT1yP2VbMF0qbjp0Lmxlbmd0aCxzPU1hdGguYWJzKE4wKHQsMCxpLG4pKTtpZihyKWZvcih2YXIgZj0wLHU9ZS5sZW5ndGg7Zjx1O2YrKyl7dmFyIGM9ZVtmXSpuLGw9Zjx1LTE/ZVtmKzFdKm46dC5sZW5ndGg7cy09TWF0aC5hYnMoTjAodCxjLGwsbikpfXZhciBwPTA7Zm9yKGY9MDtmPG8ubGVuZ3RoO2YrPTMpe3ZhciBkPW9bZl0qbixtPW9bZisxXSpuLF89b1tmKzJdKm47cCs9TWF0aC5hYnMoKHRbZF0tdFtfXSkqKHRbbSsxXS10W2QrMV0pLSh0W2RdLXRbbV0pKih0W18rMV0tdFtkKzFdKSl9cmV0dXJuIHM9PT0wJiZwPT09MD8wOk1hdGguYWJzKChwLXMpL3MpfTtmdW5jdGlvbiBOMCh0LGUsbixvKXtmb3IodmFyIHI9MCxpPWUscz1uLW87aTxuO2krPW8pcis9KHRbc10tdFtpXSkqKHRbaSsxXSt0W3MrMV0pLHM9aTtyZXR1cm4gcn1KcC5mbGF0dGVuPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10WzBdWzBdLmxlbmd0aCxuPXt2ZXJ0aWNlczpbXSxob2xlczpbXSxkaW1lbnNpb25zOmV9LG89MCxyPTA7cjx0Lmxlbmd0aDtyKyspe2Zvcih2YXIgaT0wO2k8dFtyXS5sZW5ndGg7aSsrKWZvcih2YXIgcz0wO3M8ZTtzKyspbi52ZXJ0aWNlcy5wdXNoKHRbcl1baV1bc10pO3I+MCYmKG8rPXRbci0xXS5sZW5ndGgsbi5ob2xlcy5wdXNoKG8pKX1yZXR1cm4gbn19KTt2YXIgZWQsQ28sbGM9WigoKT0+eyRzKCk7ZWQ9e0NMT0NLV0lTRTpxdC5DVyxDT1VOVEVSX0NMT0NLV0lTRTpxdC5DQ1d9O2VkLnZhbGlkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09ZWQuQ0xPQ0tXSVNFfHx0PT09ZWQuQ09VTlRFUl9DTE9DS1dJU0V9O0NvPU9iamVjdC5mcmVlemUoZWQpfSk7dmFyIHBULG1JLGhJLGxzLGRULG1ULGhULGZULHVULGxULEJpLF9ULHlULGdULF9hLF9JLHlJLGdJLHYwLFNlLHFyPVooKCk9PntwVD1ycihhVCgpLDEpO0ZlKCk7RnQoKTtQZSgpO1h0KCk7TGUoKTtJdCgpO2Z0KCk7WnQoKTtNZigpO1hlKCk7WWUoKTtXdCgpO3RuKCk7bGMoKTttST1uZXcgYSxoST1uZXcgYSxscz17fTtscy5jb21wdXRlQXJlYTJEPWZ1bmN0aW9uKHQpe3kuZGVmaW5lZCgicG9zaXRpb25zIix0KSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygicG9zaXRpb25zLmxlbmd0aCIsdC5sZW5ndGgsMyk7bGV0IGU9dC5sZW5ndGgsbj0wO2ZvcihsZXQgbz1lLTEscj0wO3I8ZTtvPXIrKyl7bGV0IGk9dFtvXSxzPXRbcl07bis9aS54KnMueS1zLngqaS55fXJldHVybiBuKi41fTtscy5jb21wdXRlV2luZGluZ09yZGVyMkQ9ZnVuY3Rpb24odCl7cmV0dXJuIGxzLmNvbXB1dGVBcmVhMkQodCk+MD9Dby5DT1VOVEVSX0NMT0NLV0lTRTpDby5DTE9DS1dJU0V9O2xzLnRyaWFuZ3VsYXRlPWZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJwb3NpdGlvbnMiLHQpO2xldCBuPXR0LnBhY2tBcnJheSh0KTtyZXR1cm4oMCxwVC5kZWZhdWx0KShuLGUsMil9O2RUPW5ldyBhLG1UPW5ldyBhLGhUPW5ldyBhLGZUPW5ldyBhLHVUPW5ldyBhLGxUPW5ldyBhLEJpPW5ldyBhLF9UPW5ldyB0dCx5VD1uZXcgdHQsZ1Q9bmV3IHR0LF9hPW5ldyB0dDtscy5jb21wdXRlU3ViZGl2aXNpb249ZnVuY3Rpb24odCxlLG4sbyxyKXtyPXgocixNLlJBRElBTlNfUEVSX0RFR1JFRSk7bGV0IGk9aChvKTt5LnR5cGVPZi5vYmplY3QoImVsbGlwc29pZCIsdCkseS5kZWZpbmVkKCJwb3NpdGlvbnMiLGUpLHkuZGVmaW5lZCgiaW5kaWNlcyIsbikseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImluZGljZXMubGVuZ3RoIixuLmxlbmd0aCwzKSx5LnR5cGVPZi5udW1iZXIuZXF1YWxzKCJpbmRpY2VzLmxlbmd0aCAlIDMiLCIwIixuLmxlbmd0aCUzLDApLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbigiZ3JhbnVsYXJpdHkiLHIsMCk7bGV0IHM9bi5zbGljZSgwKSxmLHU9ZS5sZW5ndGgsYz1uZXcgQXJyYXkodSozKSxsPW5ldyBBcnJheSh1KjIpLHA9MCxkPTA7Zm9yKGY9MDtmPHU7ZisrKXtsZXQgRT1lW2ZdO2lmKGNbcCsrXT1FLngsY1twKytdPUUueSxjW3ArK109RS56LGkpe2xldCBUPW9bZl07bFtkKytdPVQueCxsW2QrK109VC55fX1sZXQgbT1bXSxfPXt9LGc9dC5tYXhpbXVtUmFkaXVzLGI9TS5jaG9yZExlbmd0aChyLGcpLHc9YipiO2Zvcig7cy5sZW5ndGg+MDspe2xldCBFPXMucG9wKCksVD1zLnBvcCgpLEM9cy5wb3AoKSxOPWEuZnJvbUFycmF5KGMsQyozLGRUKSxJPWEuZnJvbUFycmF5KGMsVCozLG1UKSxEPWEuZnJvbUFycmF5KGMsRSozLGhUKSx2LEwsVTtpJiYodj10dC5mcm9tQXJyYXkobCxDKjIsX1QpLEw9dHQuZnJvbUFycmF5KGwsVCoyLHlUKSxVPXR0LmZyb21BcnJheShsLEUqMixnVCkpO2xldCBBPWEubXVsdGlwbHlCeVNjYWxhcihhLm5vcm1hbGl6ZShOLGZUKSxnLGZUKSxTPWEubXVsdGlwbHlCeVNjYWxhcihhLm5vcm1hbGl6ZShJLHVUKSxnLHVUKSxQPWEubXVsdGlwbHlCeVNjYWxhcihhLm5vcm1hbGl6ZShELGxUKSxnLGxUKSxCPWEubWFnbml0dWRlU3F1YXJlZChhLnN1YnRyYWN0KEEsUyxCaSkpLGo9YS5tYWduaXR1ZGVTcXVhcmVkKGEuc3VidHJhY3QoUyxQLEJpKSksSD1hLm1hZ25pdHVkZVNxdWFyZWQoYS5zdWJ0cmFjdChQLEEsQmkpKSxrPU1hdGgubWF4KEIsaixIKSxLLFgsUjtrPnc/Qj09PWs/KEs9YCR7TWF0aC5taW4oQyxUKX0gJHtNYXRoLm1heChDLFQpfWAsZj1fW0tdLGgoZil8fChYPWEuYWRkKE4sSSxCaSksYS5tdWx0aXBseUJ5U2NhbGFyKFgsLjUsWCksYy5wdXNoKFgueCxYLnksWC56KSxmPWMubGVuZ3RoLzMtMSxfW0tdPWYsaSYmKFI9dHQuYWRkKHYsTCxfYSksdHQubXVsdGlwbHlCeVNjYWxhcihSLC41LFIpLGwucHVzaChSLngsUi55KSkpLHMucHVzaChDLGYsRSkscy5wdXNoKGYsVCxFKSk6aj09PWs/KEs9YCR7TWF0aC5taW4oVCxFKX0gJHtNYXRoLm1heChULEUpfWAsZj1fW0tdLGgoZil8fChYPWEuYWRkKEksRCxCaSksYS5tdWx0aXBseUJ5U2NhbGFyKFgsLjUsWCksYy5wdXNoKFgueCxYLnksWC56KSxmPWMubGVuZ3RoLzMtMSxfW0tdPWYsaSYmKFI9dHQuYWRkKEwsVSxfYSksdHQubXVsdGlwbHlCeVNjYWxhcihSLC41LFIpLGwucHVzaChSLngsUi55KSkpLHMucHVzaChULGYsQykscy5wdXNoKGYsRSxDKSk6SD09PWsmJihLPWAke01hdGgubWluKEUsQyl9ICR7TWF0aC5tYXgoRSxDKX1gLGY9X1tLXSxoKGYpfHwoWD1hLmFkZChELE4sQmkpLGEubXVsdGlwbHlCeVNjYWxhcihYLC41LFgpLGMucHVzaChYLngsWC55LFgueiksZj1jLmxlbmd0aC8zLTEsX1tLXT1mLGkmJihSPXR0LmFkZChVLHYsX2EpLHR0Lm11bHRpcGx5QnlTY2FsYXIoUiwuNSxSKSxsLnB1c2goUi54LFIueSkpKSxzLnB1c2goRSxmLFQpLHMucHVzaChmLEMsVCkpOihtLnB1c2goQyksbS5wdXNoKFQpLG0ucHVzaChFKSl9bGV0IE89e2F0dHJpYnV0ZXM6e3Bvc2l0aW9uOm5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6Y30pfSxpbmRpY2VzOm0scHJpbWl0aXZlVHlwZTpCdC5UUklBTkdMRVN9O3JldHVybiBpJiYoTy5hdHRyaWJ1dGVzLnN0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZToyLHZhbHVlczpsfSkpLG5ldyBVdChPKX07X0k9bmV3IGF0LHlJPW5ldyBhdCxnST1uZXcgYXQsdjA9bmV3IGF0O2xzLmNvbXB1dGVSaHVtYkxpbmVTdWJkaXZpc2lvbj1mdW5jdGlvbih0LGUsbixvLHIpe3I9eChyLE0uUkFESUFOU19QRVJfREVHUkVFKTtsZXQgaT1oKG8pO3kudHlwZU9mLm9iamVjdCgiZWxsaXBzb2lkIix0KSx5LmRlZmluZWQoInBvc2l0aW9ucyIsZSkseS5kZWZpbmVkKCJpbmRpY2VzIixuKSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiaW5kaWNlcy5sZW5ndGgiLG4ubGVuZ3RoLDMpLHkudHlwZU9mLm51bWJlci5lcXVhbHMoImluZGljZXMubGVuZ3RoICUgMyIsIjAiLG4ubGVuZ3RoJTMsMCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuKCJncmFudWxhcml0eSIsciwwKTtsZXQgcz1uLnNsaWNlKDApLGYsdT1lLmxlbmd0aCxjPW5ldyBBcnJheSh1KjMpLGw9bmV3IEFycmF5KHUqMikscD0wLGQ9MDtmb3IoZj0wO2Y8dTtmKyspe2xldCBDPWVbZl07aWYoY1twKytdPUMueCxjW3ArK109Qy55LGNbcCsrXT1DLnosaSl7bGV0IE49b1tmXTtsW2QrK109Ti54LGxbZCsrXT1OLnl9fWxldCBtPVtdLF89e30sZz10Lm1heGltdW1SYWRpdXMsYj1NLmNob3JkTGVuZ3RoKHIsZyksdz1uZXcgUW8odm9pZCAwLHZvaWQgMCx0KSxPPW5ldyBRbyh2b2lkIDAsdm9pZCAwLHQpLEU9bmV3IFFvKHZvaWQgMCx2b2lkIDAsdCk7Zm9yKDtzLmxlbmd0aD4wOyl7bGV0IEM9cy5wb3AoKSxOPXMucG9wKCksST1zLnBvcCgpLEQ9YS5mcm9tQXJyYXkoYyxJKjMsZFQpLHY9YS5mcm9tQXJyYXkoYyxOKjMsbVQpLEw9YS5mcm9tQXJyYXkoYyxDKjMsaFQpLFUsQSxTO2kmJihVPXR0LmZyb21BcnJheShsLEkqMixfVCksQT10dC5mcm9tQXJyYXkobCxOKjIseVQpLFM9dHQuZnJvbUFycmF5KGwsQyoyLGdUKSk7bGV0IFA9dC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhELF9JKSxCPXQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWModix5SSksaj10LmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKEwsZ0kpO3cuc2V0RW5kUG9pbnRzKFAsQik7bGV0IEg9dy5zdXJmYWNlRGlzdGFuY2U7Ty5zZXRFbmRQb2ludHMoQixqKTtsZXQgaz1PLnN1cmZhY2VEaXN0YW5jZTtFLnNldEVuZFBvaW50cyhqLFApO2xldCBLPUUuc3VyZmFjZURpc3RhbmNlLFg9TWF0aC5tYXgoSCxrLEspLFIsb3QsY3QscHQseXQ7WD5iP0g9PT1YPyhSPWAke01hdGgubWluKEksTil9ICR7TWF0aC5tYXgoSSxOKX1gLGY9X1tSXSxoKGYpfHwob3Q9dy5pbnRlcnBvbGF0ZVVzaW5nRnJhY3Rpb24oLjUsdjApLGN0PShQLmhlaWdodCtCLmhlaWdodCkqLjUscHQ9YS5mcm9tUmFkaWFucyhvdC5sb25naXR1ZGUsb3QubGF0aXR1ZGUsY3QsdCxCaSksYy5wdXNoKHB0LngscHQueSxwdC56KSxmPWMubGVuZ3RoLzMtMSxfW1JdPWYsaSYmKHl0PXR0LmFkZChVLEEsX2EpLHR0Lm11bHRpcGx5QnlTY2FsYXIoeXQsLjUseXQpLGwucHVzaCh5dC54LHl0LnkpKSkscy5wdXNoKEksZixDKSxzLnB1c2goZixOLEMpKTprPT09WD8oUj1gJHtNYXRoLm1pbihOLEMpfSAke01hdGgubWF4KE4sQyl9YCxmPV9bUl0saChmKXx8KG90PU8uaW50ZXJwb2xhdGVVc2luZ0ZyYWN0aW9uKC41LHYwKSxjdD0oQi5oZWlnaHQrai5oZWlnaHQpKi41LHB0PWEuZnJvbVJhZGlhbnMob3QubG9uZ2l0dWRlLG90LmxhdGl0dWRlLGN0LHQsQmkpLGMucHVzaChwdC54LHB0LnkscHQueiksZj1jLmxlbmd0aC8zLTEsX1tSXT1mLGkmJih5dD10dC5hZGQoQSxTLF9hKSx0dC5tdWx0aXBseUJ5U2NhbGFyKHl0LC41LHl0KSxsLnB1c2goeXQueCx5dC55KSkpLHMucHVzaChOLGYsSSkscy5wdXNoKGYsQyxJKSk6Sz09PVgmJihSPWAke01hdGgubWluKEMsSSl9ICR7TWF0aC5tYXgoQyxJKX1gLGY9X1tSXSxoKGYpfHwob3Q9RS5pbnRlcnBvbGF0ZVVzaW5nRnJhY3Rpb24oLjUsdjApLGN0PShqLmhlaWdodCtQLmhlaWdodCkqLjUscHQ9YS5mcm9tUmFkaWFucyhvdC5sb25naXR1ZGUsb3QubGF0aXR1ZGUsY3QsdCxCaSksYy5wdXNoKHB0LngscHQueSxwdC56KSxmPWMubGVuZ3RoLzMtMSxfW1JdPWYsaSYmKHl0PXR0LmFkZChTLFUsX2EpLHR0Lm11bHRpcGx5QnlTY2FsYXIoeXQsLjUseXQpLGwucHVzaCh5dC54LHl0LnkpKSkscy5wdXNoKEMsZixOKSxzLnB1c2goZixJLE4pKToobS5wdXNoKEkpLG0ucHVzaChOKSxtLnB1c2goQykpfWxldCBUPXthdHRyaWJ1dGVzOntwb3NpdGlvbjpuZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkRPVUJMRSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOmN9KX0saW5kaWNlczptLHByaW1pdGl2ZVR5cGU6QnQuVFJJQU5HTEVTfTtyZXR1cm4gaSYmKFQuYXR0cmlidXRlcy5zdD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Mix2YWx1ZXM6bH0pKSxuZXcgVXQoVCl9O2xzLnNjYWxlVG9HZW9kZXRpY0hlaWdodD1mdW5jdGlvbih0LGUsbixvKXtuPXgobiwkLldHUzg0KTtsZXQgcj1tSSxpPWhJO2lmKGU9eChlLDApLG89eChvLCEwKSxoKHQpKXtsZXQgcz10Lmxlbmd0aDtmb3IobGV0IGY9MDtmPHM7Zis9MylhLmZyb21BcnJheSh0LGYsaSksbyYmKGk9bi5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKGksaSkpLGUhPT0wJiYocj1uLmdlb2RldGljU3VyZmFjZU5vcm1hbChpLHIpLGEubXVsdGlwbHlCeVNjYWxhcihyLGUsciksYS5hZGQoaSxyLGkpKSx0W2ZdPWkueCx0W2YrMV09aS55LHRbZisyXT1pLnp9cmV0dXJuIHR9O1NlPWxzfSk7ZnVuY3Rpb24gcHMoKXt0aGlzLl9hcnJheT1bXSx0aGlzLl9vZmZzZXQ9MCx0aGlzLl9sZW5ndGg9MH12YXIgTDAsQVQ9WigoKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHBzLnByb3RvdHlwZSx7bGVuZ3RoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGVuZ3RofX19KTtwcy5wcm90b3R5cGUuZW5xdWV1ZT1mdW5jdGlvbih0KXt0aGlzLl9hcnJheS5wdXNoKHQpLHRoaXMuX2xlbmd0aCsrfTtwcy5wcm90b3R5cGUuZGVxdWV1ZT1mdW5jdGlvbigpe2lmKHRoaXMuX2xlbmd0aD09PTApcmV0dXJuO2xldCB0PXRoaXMuX2FycmF5LGU9dGhpcy5fb2Zmc2V0LG49dFtlXTtyZXR1cm4gdFtlXT12b2lkIDAsZSsrLGU+MTAmJmUqMj50Lmxlbmd0aCYmKHRoaXMuX2FycmF5PXQuc2xpY2UoZSksZT0wKSx0aGlzLl9vZmZzZXQ9ZSx0aGlzLl9sZW5ndGgtLSxufTtwcy5wcm90b3R5cGUucGVlaz1mdW5jdGlvbigpe2lmKHRoaXMuX2xlbmd0aCE9PTApcmV0dXJuIHRoaXMuX2FycmF5W3RoaXMuX29mZnNldF19O3BzLnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYXJyYXkuaW5kZXhPZih0KSE9PS0xfTtwcy5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9hcnJheS5sZW5ndGg9dGhpcy5fb2Zmc2V0PXRoaXMuX2xlbmd0aD0wfTtwcy5wcm90b3R5cGUuc29ydD1mdW5jdGlvbih0KXt0aGlzLl9vZmZzZXQ+MCYmKHRoaXMuX2FycmF5PXRoaXMuX2FycmF5LnNsaWNlKHRoaXMuX29mZnNldCksdGhpcy5fb2Zmc2V0PTApLHRoaXMuX2FycmF5LnNvcnQodCl9O0wwPXBzfSk7ZnVuY3Rpb24gVFQodCxlLG4sbyl7cmV0dXJuIHR0LnN1YnRyYWN0KGUsdCxwYyksdHQubXVsdGlwbHlCeVNjYWxhcihwYyxuL28scGMpLHR0LmFkZCh0LHBjLHBjKSxbcGMueCxwYy55XX1mdW5jdGlvbiBBSSh0LGUsbixvKXtyZXR1cm4gYS5zdWJ0cmFjdChlLHQsZHMpLGEubXVsdGlwbHlCeVNjYWxhcihkcyxuL28sZHMpLGEuYWRkKHQsZHMsZHMpLFtkcy54LGRzLnksZHMuel19ZnVuY3Rpb24gQ0kodCxlLG4pe2xldCBvPW4uY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWModCxvZCkscj1uLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKGUscmQpO2lmKE1hdGguc2lnbihvLmxhdGl0dWRlKT09PU1hdGguc2lnbihyLmxhdGl0dWRlKSlyZXR1cm47bmQuc2V0RW5kUG9pbnRzKG8scik7bGV0IGk9bmQuZmluZEludGVyc2VjdGlvbldpdGhMYXRpdHVkZSgwLFNJKTtpZighaChpKSlyZXR1cm47bGV0IHM9TWF0aC5taW4oby5sb25naXR1ZGUsci5sb25naXR1ZGUpLGY9TWF0aC5tYXgoby5sb25naXR1ZGUsci5sb25naXR1ZGUpO2lmKE1hdGguYWJzKGYtcyk+TS5QSSl7bGV0IHU9cztzPWYsZj11fWlmKCEoaS5sb25naXR1ZGU8c3x8aS5sb25naXR1ZGU+ZikpcmV0dXJuIG4uY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oaSl9ZnVuY3Rpb24geEkodCxlLG4sbyl7aWYobz09PV9lLlJIVU1CKXJldHVybiBDSSh0LGUsbik7bGV0IHI9aG8ubGluZVNlZ21lbnRQbGFuZSh0LGUsb24uT1JJR0lOX1hZX1BMQU5FKTtpZihoKHIpKXJldHVybiBuLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UocixyKX1mdW5jdGlvbiBNSSh0LGUsbil7bGV0IG89W10scixpLHMsZix1LGM9MDtmb3IoO2M8dC5sZW5ndGg7KXtyPXRbY10saT10WyhjKzEpJXQubGVuZ3RoXSxzPU0uc2lnbihyLnopLGY9TS5zaWduKGkueik7bGV0IGw9cD0+ZS5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhwLFBJKS5sb25naXR1ZGU7aWYocz09PTApby5wdXNoKHtwb3NpdGlvbjpjLHR5cGU6cyx2aXNpdGVkOiExLG5leHQ6Zix0aGV0YTpsKHIpfSk7ZWxzZSBpZihmIT09MCl7aWYodT14SShyLGksZSxuKSwrK2MsIWgodSkpY29udGludWU7dC5zcGxpY2UoYywwLHUpLG8ucHVzaCh7cG9zaXRpb246Yyx0eXBlOnMsdmlzaXRlZDohMSxuZXh0OmYsdGhldGE6bCh1KX0pfSsrY31yZXR1cm4gb31mdW5jdGlvbiBPVCh0LGUsbixvLHIsaSxzKXtsZXQgZj1bXSx1PWksYz1wPT5kPT5kLnBvc2l0aW9uPT09cCxsPVtdO2Rve2xldCBwPW5bdV07Zi5wdXNoKHApO2xldCBkPW8uZmluZEluZGV4KGModSkpLG09b1tkXTtpZighaChtKSl7Kyt1O2NvbnRpbnVlfWxldHt2aXNpdGVkOl8sdHlwZTpnLG5leHQ6Yn09bTtpZihtLnZpc2l0ZWQ9ITAsZz09PTApe2lmKGI9PT0wKXtsZXQgVD1vW2QtKHM/MTotMSldO2lmKFQ/LnBvc2l0aW9uPT09dSsxKVQudmlzaXRlZD0hMDtlbHNleysrdTtjb250aW51ZX19aWYoIV8mJnMmJmI+MHx8aT09PXUmJiFzJiZiPDApeysrdTtjb250aW51ZX19aWYoIShzP2c+PTA6Zzw9MCkpeysrdTtjb250aW51ZX1ffHxsLnB1c2godSk7bGV0IE89ZCsocz8xOi0xKSxFPW9bT107aWYoIWgoRSkpeysrdTtjb250aW51ZX11PUUucG9zaXRpb259d2hpbGUodTxuLmxlbmd0aCYmdT49MCYmdSE9PWkmJmYubGVuZ3RoPG4ubGVuZ3RoKTt0LnNwbGljZShlLHIsZik7Zm9yKGxldCBwIG9mIGwpZT1PVCh0LCsrZSxuLG8sMCxwLCFzKTtyZXR1cm4gZX12YXIgVG4scGMsZHMsb2QscmQsYkksd0ksbmQsVEksT0ksRUksUkksU0ksUEksTkksSUksdkksTEksYlQsd1QsREksRkkseWUsTGY9WigoKT0+e2ZjKCk7anIoKTtGZSgpO0Z0KCk7UGUoKTtMZSgpO0l0KCk7ZnQoKTtadCgpO01mKCk7WGUoKTtZZSgpO2FuKCk7c2koKTskZSgpO3RjKCk7V3QoKTtGbigpO2ZzKCk7b1QoKTtxcigpO3RuKCk7V28oKTtBVCgpO2xjKCk7VG49e307VG4uY29tcHV0ZUhpZXJhcmNoeVBhY2tlZExlbmd0aD1mdW5jdGlvbih0LGUpe2xldCBuPTAsbz1bdF07Zm9yKDtvLmxlbmd0aD4wOyl7bGV0IHI9by5wb3AoKTtpZighaChyKSljb250aW51ZTtuKz0yO2xldCBpPXIucG9zaXRpb25zLHM9ci5ob2xlcztpZihoKGkpJiZpLmxlbmd0aD4wJiYobis9aS5sZW5ndGgqZS5wYWNrZWRMZW5ndGgpLGgocykpe2xldCBmPXMubGVuZ3RoO2ZvcihsZXQgdT0wO3U8ZjsrK3Upby5wdXNoKHNbdV0pfX1yZXR1cm4gbn07VG4ucGFja1BvbHlnb25IaWVyYXJjaHk9ZnVuY3Rpb24odCxlLG4sbyl7bGV0IHI9W3RdO2Zvcig7ci5sZW5ndGg+MDspe2xldCBpPXIucG9wKCk7aWYoIWgoaSkpY29udGludWU7bGV0IHM9aS5wb3NpdGlvbnMsZj1pLmhvbGVzO2lmKGVbbisrXT1oKHMpP3MubGVuZ3RoOjAsZVtuKytdPWgoZik/Zi5sZW5ndGg6MCxoKHMpKXtsZXQgdT1zLmxlbmd0aDtmb3IobGV0IGM9MDtjPHU7KytjLG4rPW8ucGFja2VkTGVuZ3RoKW8ucGFjayhzW2NdLGUsbil9aWYoaChmKSl7bGV0IHU9Zi5sZW5ndGg7Zm9yKGxldCBjPTA7Yzx1OysrYylyLnB1c2goZltjXSl9fXJldHVybiBufTtUbi51bnBhY2tQb2x5Z29uSGllcmFyY2h5PWZ1bmN0aW9uKHQsZSxuKXtsZXQgbz10W2UrK10scj10W2UrK10saT1uZXcgQXJyYXkobykscz1yPjA/bmV3IEFycmF5KHIpOnZvaWQgMDtmb3IobGV0IGY9MDtmPG87KytmLGUrPW4ucGFja2VkTGVuZ3RoKWlbZl09bi51bnBhY2sodCxlKTtmb3IobGV0IGY9MDtmPHI7KytmKXNbZl09VG4udW5wYWNrUG9seWdvbkhpZXJhcmNoeSh0LGUsbiksZT1zW2ZdLnN0YXJ0aW5nSW5kZXgsZGVsZXRlIHNbZl0uc3RhcnRpbmdJbmRleDtyZXR1cm57cG9zaXRpb25zOmksaG9sZXM6cyxzdGFydGluZ0luZGV4OmV9fTtwYz1uZXcgdHQ7ZHM9bmV3IGE7VG4uc3ViZGl2aWRlTGluZUNvdW50PWZ1bmN0aW9uKHQsZSxuKXtsZXQgcj1hLmRpc3RhbmNlKHQsZSkvbixpPU1hdGgubWF4KDAsTWF0aC5jZWlsKE0ubG9nMihyKSkpO3JldHVybiBNYXRoLnBvdygyLGkpfTtvZD1uZXcgYXQscmQ9bmV3IGF0LGJJPW5ldyBhdCx3ST1uZXcgYSxuZD1uZXcgUW87VG4uc3ViZGl2aWRlUmh1bWJMaW5lQ291bnQ9ZnVuY3Rpb24odCxlLG4sbyl7bGV0IHI9dC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhlLG9kKSxpPXQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMobixyZCksZj1uZXcgUW8ocixpLHQpLnN1cmZhY2VEaXN0YW5jZS9vLHU9TWF0aC5tYXgoMCxNYXRoLmNlaWwoTS5sb2cyKGYpKSk7cmV0dXJuIE1hdGgucG93KDIsdSl9O1RuLnN1YmRpdmlkZVRleGNvb3JkTGluZT1mdW5jdGlvbih0LGUsbixvLHIsaSl7bGV0IHM9VG4uc3ViZGl2aWRlTGluZUNvdW50KG4sbyxyKSxmPXR0LmRpc3RhbmNlKHQsZSksdT1mL3MsYz1pO2MubGVuZ3RoPXMqMjtsZXQgbD0wO2ZvcihsZXQgcD0wO3A8cztwKyspe2xldCBkPVRUKHQsZSxwKnUsZik7Y1tsKytdPWRbMF0sY1tsKytdPWRbMV19cmV0dXJuIGN9O1RuLnN1YmRpdmlkZUxpbmU9ZnVuY3Rpb24odCxlLG4sbyl7bGV0IHI9VG4uc3ViZGl2aWRlTGluZUNvdW50KHQsZSxuKSxpPWEuZGlzdGFuY2UodCxlKSxzPWkvcjtoKG8pfHwobz1bXSk7bGV0IGY9bztmLmxlbmd0aD1yKjM7bGV0IHU9MDtmb3IobGV0IGM9MDtjPHI7YysrKXtsZXQgbD1BSSh0LGUsYypzLGkpO2ZbdSsrXT1sWzBdLGZbdSsrXT1sWzFdLGZbdSsrXT1sWzJdfXJldHVybiBmfTtUbi5zdWJkaXZpZGVUZXhjb29yZFJodW1iTGluZT1mdW5jdGlvbih0LGUsbixvLHIsaSxzKXtsZXQgZj1uLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKG8sb2QpLHU9bi5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhyLHJkKTtuZC5zZXRFbmRQb2ludHMoZix1KTtsZXQgYz1uZC5zdXJmYWNlRGlzdGFuY2UvaSxsPU1hdGgubWF4KDAsTWF0aC5jZWlsKE0ubG9nMihjKSkpLHA9TWF0aC5wb3coMixsKSxkPXR0LmRpc3RhbmNlKHQsZSksbT1kL3AsXz1zO18ubGVuZ3RoPXAqMjtsZXQgZz0wO2ZvcihsZXQgYj0wO2I8cDtiKyspe2xldCB3PVRUKHQsZSxiKm0sZCk7X1tnKytdPXdbMF0sX1tnKytdPXdbMV19cmV0dXJuIF99O1RuLnN1YmRpdmlkZVJodW1iTGluZT1mdW5jdGlvbih0LGUsbixvLHIpe2xldCBpPXQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoZSxvZCkscz10LmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKG4scmQpLGY9bmV3IFFvKGkscyx0KSx1PWYuc3VyZmFjZURpc3RhbmNlL28sYz1NYXRoLm1heCgwLE1hdGguY2VpbChNLmxvZzIodSkpKSxsPU1hdGgucG93KDIsYykscD1mLnN1cmZhY2VEaXN0YW5jZS9sO2gocil8fChyPVtdKTtsZXQgZD1yO2QubGVuZ3RoPWwqMztsZXQgbT0wO2ZvcihsZXQgXz0wO188bDtfKyspe2xldCBnPWYuaW50ZXJwb2xhdGVVc2luZ1N1cmZhY2VEaXN0YW5jZShfKnAsYkkpLGI9dC5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihnLHdJKTtkW20rK109Yi54LGRbbSsrXT1iLnksZFttKytdPWIuen1yZXR1cm4gZH07VEk9bmV3IGEsT0k9bmV3IGEsRUk9bmV3IGEsUkk9bmV3IGE7VG4uc2NhbGVUb0dlb2RldGljSGVpZ2h0RXh0cnVkZWQ9ZnVuY3Rpb24odCxlLG4sbyxyKXtvPXgobywkLldHUzg0KTtsZXQgaT1USSxzPU9JLGY9RUksdT1SSTtpZihoKHQpJiZoKHQuYXR0cmlidXRlcykmJmgodC5hdHRyaWJ1dGVzLnBvc2l0aW9uKSl7bGV0IGM9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyxsPWMubGVuZ3RoLzI7Zm9yKGxldCBwPTA7cDxsO3ArPTMpYS5mcm9tQXJyYXkoYyxwLGYpLG8uZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGYsaSksdT1vLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UoZix1KSxzPWEubXVsdGlwbHlCeVNjYWxhcihpLG4scykscz1hLmFkZCh1LHMscyksY1twK2xdPXMueCxjW3ArMStsXT1zLnksY1twKzIrbF09cy56LHImJih1PWEuY2xvbmUoZix1KSkscz1hLm11bHRpcGx5QnlTY2FsYXIoaSxlLHMpLHM9YS5hZGQodSxzLHMpLGNbcF09cy54LGNbcCsxXT1zLnksY1twKzJdPXMuen1yZXR1cm4gdH07VG4ucG9seWdvbk91dGxpbmVzRnJvbUhpZXJhcmNoeT1mdW5jdGlvbih0LGUsbil7bGV0IG89W10scj1uZXcgTDA7ci5lbnF1ZXVlKHQpO2xldCBpLHMsZjtmb3IoO3IubGVuZ3RoIT09MDspe2xldCB1PXIuZGVxdWV1ZSgpLGM9dS5wb3NpdGlvbnM7aWYoZSlmb3IoZj1jLmxlbmd0aCxpPTA7aTxmO2krKyluLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UoY1tpXSxjW2ldKTtpZihjPUNuKGMsYS5lcXVhbHNFcHNpbG9uLCEwKSxjLmxlbmd0aDwzKWNvbnRpbnVlO2xldCBsPXUuaG9sZXM/dS5ob2xlcy5sZW5ndGg6MDtmb3IoaT0wO2k8bDtpKyspe2xldCBwPXUuaG9sZXNbaV0sZD1wLnBvc2l0aW9ucztpZihlKWZvcihmPWQubGVuZ3RoLHM9MDtzPGY7KytzKW4uc2NhbGVUb0dlb2RldGljU3VyZmFjZShkW3NdLGRbc10pO2lmKGQ9Q24oZCxhLmVxdWFsc0Vwc2lsb24sITApLGQubGVuZ3RoPDMpY29udGludWU7by5wdXNoKGQpO2xldCBtPTA7Zm9yKGgocC5ob2xlcykmJihtPXAuaG9sZXMubGVuZ3RoKSxzPTA7czxtO3MrKylyLmVucXVldWUocC5ob2xlc1tzXSl9by5wdXNoKGMpfXJldHVybiBvfTtTST1uZXcgYXQ7UEk9bmV3IGF0O1RuLnNwbGl0UG9seWdvbnNPbkVxdWF0b3I9ZnVuY3Rpb24odCxlLG4sbyl7aChvKXx8KG89W10pLG8uc3BsaWNlKDAsMCwuLi50KSxvLmxlbmd0aD10Lmxlbmd0aDtsZXQgcj0wO2Zvcig7cjxvLmxlbmd0aDspe2xldCBpPW9bcl0scz1pLnNsaWNlKCk7aWYoaS5sZW5ndGg8Myl7b1tyXT1zLCsrcjtjb250aW51ZX1sZXQgZj1NSShzLGUsbik7aWYocy5sZW5ndGg9PT1pLmxlbmd0aHx8Zi5sZW5ndGg8PTEpe29bcl09cywrK3I7Y29udGludWV9Zi5zb3J0KChjLGwpPT5jLnRoZXRhLWwudGhldGEpO2xldCB1PXNbMF0uej49MDtyPU9UKG8scixzLGYsMSwwLHUpfXJldHVybiBvfTtUbi5wb2x5Z29uc0Zyb21IaWVyYXJjaHk9ZnVuY3Rpb24odCxlLG4sbyxyLGkpe2xldCBzPVtdLGY9W10sdT1uZXcgTDA7dS5lbnF1ZXVlKHQpO2xldCBjPWgoaSk7Zm9yKDt1Lmxlbmd0aCE9PTA7KXtsZXQgbD11LmRlcXVldWUoKSxwPWwucG9zaXRpb25zLGQ9bC5ob2xlcyxtLF87aWYobylmb3IoXz1wLmxlbmd0aCxtPTA7bTxfO20rKylyLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UocFttXSxwW21dKTtpZihlfHwocD1DbihwLGEuZXF1YWxzRXBzaWxvbiwhMCkpLHAubGVuZ3RoPDMpY29udGludWU7bGV0IGc9bihwKTtpZighaChnKSljb250aW51ZTtsZXQgYj1bXSx3PVNlLmNvbXB1dGVXaW5kaW5nT3JkZXIyRChnKTtpZih3PT09Q28uQ0xPQ0tXSVNFJiYoZy5yZXZlcnNlKCkscD1wLnNsaWNlKCkucmV2ZXJzZSgpKSxjKXtjPSExO2xldCBOPVtwXTtpZihOPWkoTixOKSxOLmxlbmd0aD4xKXtmb3IobGV0IEkgb2YgTil1LmVucXVldWUobmV3IG5UKEksZCkpO2NvbnRpbnVlfX1sZXQgTz1wLnNsaWNlKCksRT1oKGQpP2QubGVuZ3RoOjAsVD1bXSxDO2ZvcihtPTA7bTxFO20rKyl7bGV0IE49ZFttXSxJPU4ucG9zaXRpb25zO2lmKG8pZm9yKF89SS5sZW5ndGgsQz0wO0M8XzsrK0Mpci5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKElbQ10sSVtDXSk7aWYoZXx8KEk9Q24oSSxhLmVxdWFsc0Vwc2lsb24sITApKSxJLmxlbmd0aDwzKWNvbnRpbnVlO2xldCBEPW4oSSk7aWYoIWgoRCkpY29udGludWU7dz1TZS5jb21wdXRlV2luZGluZ09yZGVyMkQoRCksdz09PUNvLkNMT0NLV0lTRSYmKEQucmV2ZXJzZSgpLEk9SS5zbGljZSgpLnJldmVyc2UoKSksVC5wdXNoKEkpLGIucHVzaChPLmxlbmd0aCksTz1PLmNvbmNhdChJKSxnPWcuY29uY2F0KEQpO2xldCB2PTA7Zm9yKGgoTi5ob2xlcykmJih2PU4uaG9sZXMubGVuZ3RoKSxDPTA7Qzx2O0MrKyl1LmVucXVldWUoTi5ob2xlc1tDXSl9cy5wdXNoKHtvdXRlclJpbmc6cCxob2xlczpUfSksZi5wdXNoKHtwb3NpdGlvbnM6Tyxwb3NpdGlvbnMyRDpnLGhvbGVzOmJ9KX1yZXR1cm57aGllcmFyY2h5OnMscG9seWdvbnM6Zn19O05JPW5ldyB0dCxJST1uZXcgYSx2ST1uZXcgZWUsTEk9bmV3IEo7VG4uY29tcHV0ZUJvdW5kaW5nUmVjdGFuZ2xlPWZ1bmN0aW9uKHQsZSxuLG8scil7bGV0IGk9ZWUuZnJvbUF4aXNBbmdsZSh0LG8sdkkpLHM9Si5mcm9tUXVhdGVybmlvbihpLExJKSxmPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSx1PU51bWJlci5ORUdBVElWRV9JTkZJTklUWSxjPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxsPU51bWJlci5ORUdBVElWRV9JTkZJTklUWSxwPW4ubGVuZ3RoO2ZvcihsZXQgZD0wO2Q8cDsrK2Qpe2xldCBtPWEuY2xvbmUobltkXSxJSSk7Si5tdWx0aXBseUJ5VmVjdG9yKHMsbSxtKTtsZXQgXz1lKG0sTkkpO2goXykmJihmPU1hdGgubWluKGYsXy54KSx1PU1hdGgubWF4KHUsXy54KSxjPU1hdGgubWluKGMsXy55KSxsPU1hdGgubWF4KGwsXy55KSl9cmV0dXJuIHIueD1mLHIueT1jLHIud2lkdGg9dS1mLHIuaGVpZ2h0PWwtYyxyfTtUbi5jcmVhdGVHZW9tZXRyeUZyb21Qb3NpdGlvbnM9ZnVuY3Rpb24odCxlLG4sbyxyLGkscyl7bGV0IGY9U2UudHJpYW5ndWxhdGUoZS5wb3NpdGlvbnMyRCxlLmhvbGVzKTtmLmxlbmd0aDwzJiYoZj1bMCwxLDJdKTtsZXQgdT1lLnBvc2l0aW9ucyxjPWgobiksbD1jP24ucG9zaXRpb25zOnZvaWQgMDtpZihyKXtsZXQgcD11Lmxlbmd0aCxkPW5ldyBBcnJheShwKjMpLG09MDtmb3IobGV0IGI9MDtiPHA7YisrKXtsZXQgdz11W2JdO2RbbSsrXT13LngsZFttKytdPXcueSxkW20rK109dy56fWxldCBfPXthdHRyaWJ1dGVzOntwb3NpdGlvbjpuZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkRPVUJMRSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOmR9KX0saW5kaWNlczpmLHByaW1pdGl2ZVR5cGU6QnQuVFJJQU5HTEVTfTtjJiYoXy5hdHRyaWJ1dGVzLnN0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZToyLHZhbHVlczp0dC5wYWNrQXJyYXkobCl9KSk7bGV0IGc9bmV3IFV0KF8pO3JldHVybiBpLm5vcm1hbD9WZS5jb21wdXRlTm9ybWFsKGcpOmd9aWYocz09PV9lLkdFT0RFU0lDKXJldHVybiBTZS5jb21wdXRlU3ViZGl2aXNpb24odCx1LGYsbCxvKTtpZihzPT09X2UuUkhVTUIpcmV0dXJuIFNlLmNvbXB1dGVSaHVtYkxpbmVTdWJkaXZpc2lvbih0LHUsZixsLG8pfTtiVD1bXSx3VD1bXSxEST1uZXcgYSxGST1uZXcgYTtUbi5jb21wdXRlV2FsbEdlb21ldHJ5PWZ1bmN0aW9uKHQsZSxuLG8scixpKXtsZXQgcyxmLHUsYyxsLHAsZCxtLF8sZz10Lmxlbmd0aCxiPTAsdz0wLE89aChlKSxFPU8/ZS5wb3NpdGlvbnM6dm9pZCAwO2lmKHIpZm9yKGY9ZyozKjIscz1uZXcgQXJyYXkoZioyKSxPJiYoXz1nKjIqMixtPW5ldyBBcnJheShfKjIpKSx1PTA7dTxnO3UrKyljPXRbdV0sbD10Wyh1KzEpJWddLHNbYl09c1tiK2ZdPWMueCwrK2Isc1tiXT1zW2IrZl09Yy55LCsrYixzW2JdPXNbYitmXT1jLnosKytiLHNbYl09c1tiK2ZdPWwueCwrK2Isc1tiXT1zW2IrZl09bC55LCsrYixzW2JdPXNbYitmXT1sLnosKytiLE8mJihwPUVbdV0sZD1FWyh1KzEpJWddLG1bd109bVt3K19dPXAueCwrK3csbVt3XT1tW3crX109cC55LCsrdyxtW3ddPW1bdytfXT1kLngsKyt3LG1bd109bVt3K19dPWQueSwrK3cpO2Vsc2V7bGV0IEQ9TS5jaG9yZExlbmd0aChvLG4ubWF4aW11bVJhZGl1cyksdj0wO2lmKGk9PT1fZS5HRU9ERVNJQylmb3IodT0wO3U8Zzt1Kyspdis9VG4uc3ViZGl2aWRlTGluZUNvdW50KHRbdV0sdFsodSsxKSVnXSxEKTtlbHNlIGlmKGk9PT1fZS5SSFVNQilmb3IodT0wO3U8Zzt1Kyspdis9VG4uc3ViZGl2aWRlUmh1bWJMaW5lQ291bnQobix0W3VdLHRbKHUrMSklZ10sRCk7Zm9yKGY9KHYrZykqMyxzPW5ldyBBcnJheShmKjIpLE8mJihfPSh2K2cpKjIsbT1uZXcgQXJyYXkoXyoyKSksdT0wO3U8Zzt1Kyspe2M9dFt1XSxsPXRbKHUrMSklZ107bGV0IEwsVTtPJiYocD1FW3VdLGQ9RVsodSsxKSVnXSksaT09PV9lLkdFT0RFU0lDPyhMPVRuLnN1YmRpdmlkZUxpbmUoYyxsLEQsd1QpLE8mJihVPVRuLnN1YmRpdmlkZVRleGNvb3JkTGluZShwLGQsYyxsLEQsYlQpKSk6aT09PV9lLlJIVU1CJiYoTD1Ubi5zdWJkaXZpZGVSaHVtYkxpbmUobixjLGwsRCx3VCksTyYmKFU9VG4uc3ViZGl2aWRlVGV4Y29vcmRSaHVtYkxpbmUocCxkLG4sYyxsLEQsYlQpKSk7bGV0IEE9TC5sZW5ndGg7Zm9yKGxldCBTPTA7UzxBOysrUywrK2Ipc1tiXT1MW1NdLHNbYitmXT1MW1NdO2lmKHNbYl09bC54LHNbYitmXT1sLngsKytiLHNbYl09bC55LHNbYitmXT1sLnksKytiLHNbYl09bC56LHNbYitmXT1sLnosKytiLE8pe2xldCBTPVUubGVuZ3RoO2ZvcihsZXQgUD0wO1A8UzsrK1AsKyt3KW1bd109VVtQXSxtW3crX109VVtQXTttW3ddPWQueCxtW3crX109ZC54LCsrdyxtW3ddPWQueSxtW3crX109ZC55LCsrd319fWc9cy5sZW5ndGg7bGV0IFQ9RHQuY3JlYXRlVHlwZWRBcnJheShnLzMsZy10Lmxlbmd0aCo2KSxDPTA7Zm9yKGcvPTYsdT0wO3U8Zzt1Kyspe2xldCBEPXUsdj1EKzEsTD1EK2csVT1MKzE7Yz1hLmZyb21BcnJheShzLEQqMyxESSksbD1hLmZyb21BcnJheShzLHYqMyxGSSksIWEuZXF1YWxzRXBzaWxvbihjLGwsTS5FUFNJTE9OMTAsTS5FUFNJTE9OMTApJiYoVFtDKytdPUQsVFtDKytdPUwsVFtDKytdPXYsVFtDKytdPXYsVFtDKytdPUwsVFtDKytdPVUpfWxldCBOPXthdHRyaWJ1dGVzOm5ldyBpZSh7cG9zaXRpb246bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpzfSl9KSxpbmRpY2VzOlQscHJpbWl0aXZlVHlwZTpCdC5UUklBTkdMRVN9O3JldHVybiBPJiYoTi5hdHRyaWJ1dGVzLnN0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZToyLHZhbHVlczptfSkpLG5ldyBVdChOKX07eWU9VG59KTtmdW5jdGlvbiBZSSh0LGUsbixvLHIsaSxzLGYsdSl7bGV0IGM9dC5wb3NpdGlvbnMsbD1TZS50cmlhbmd1bGF0ZSh0LnBvc2l0aW9uczJELHQuaG9sZXMpO2wubGVuZ3RoPDMmJihsPVswLDEsMl0pO2xldCBwPUR0LmNyZWF0ZVR5cGVkQXJyYXkoYy5sZW5ndGgsbC5sZW5ndGgpO3Auc2V0KGwpO2xldCBkPUtJO2lmKG8hPT0wKXtsZXQgVT1lZS5mcm9tQXhpc0FuZ2xlKHMsbyxFVCk7aWYoZD1KLmZyb21RdWF0ZXJuaW9uKFUsZCksZS50YW5nZW50fHxlLmJpdGFuZ2VudCl7VT1lZS5mcm9tQXhpc0FuZ2xlKHMsLW8sRVQpO2xldCBBPUouZnJvbVF1YXRlcm5pb24oVSxXSSk7Zj1hLm5vcm1hbGl6ZShKLm11bHRpcGx5QnlWZWN0b3IoQSxmLGYpLGYpLGUuYml0YW5nZW50JiYodT1hLm5vcm1hbGl6ZShhLmNyb3NzKHMsZix1KSx1KSl9fWVsc2UgZD1KLmNsb25lKEouSURFTlRJVFksZCk7bGV0IG09a0k7ZS5zdCYmKG0ueD1uLngsbS55PW4ueSk7bGV0IF89Yy5sZW5ndGgsZz1fKjMsYj1uZXcgRmxvYXQ2NEFycmF5KGcpLHc9ZS5ub3JtYWw/bmV3IEZsb2F0MzJBcnJheShnKTp2b2lkIDAsTz1lLnRhbmdlbnQ/bmV3IEZsb2F0MzJBcnJheShnKTp2b2lkIDAsRT1lLmJpdGFuZ2VudD9uZXcgRmxvYXQzMkFycmF5KGcpOnZvaWQgMCxUPWUuc3Q/bmV3IEZsb2F0MzJBcnJheShfKjIpOnZvaWQgMCxDPTAsTj0wLEk9MCxEPTAsdj0wO2ZvcihsZXQgVT0wO1U8XztVKyspe2xldCBBPWNbVV07aWYoYltDKytdPUEueCxiW0MrK109QS55LGJbQysrXT1BLnosZS5zdClpZihoKHIpJiZyLnBvc2l0aW9ucy5sZW5ndGg9PT1fKVRbdisrXT1yLnBvc2l0aW9uc1tVXS54LFRbdisrXT1yLnBvc2l0aW9uc1tVXS55O2Vsc2V7bGV0IFM9Si5tdWx0aXBseUJ5VmVjdG9yKGQsQSxCSSksUD1pKFMsVkkpO3R0LnN1YnRyYWN0KFAsbSxQKTtsZXQgQj1NLmNsYW1wKFAueC9uLndpZHRoLDAsMSksaj1NLmNsYW1wKFAueS9uLmhlaWdodCwwLDEpO1RbdisrXT1CLFRbdisrXT1qfWUubm9ybWFsJiYod1tOKytdPXMueCx3W04rK109cy55LHdbTisrXT1zLnopLGUudGFuZ2VudCYmKE9bRCsrXT1mLngsT1tEKytdPWYueSxPW0QrK109Zi56KSxlLmJpdGFuZ2VudCYmKEVbSSsrXT11LngsRVtJKytdPXUueSxFW0krK109dS56KX1sZXQgTD1uZXcgaWU7cmV0dXJuIGUucG9zaXRpb24mJihMLnBvc2l0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6Yn0pKSxlLm5vcm1hbCYmKEwubm9ybWFsPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczp3fSkpLGUudGFuZ2VudCYmKEwudGFuZ2VudD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6T30pKSxlLmJpdGFuZ2VudCYmKEwuYml0YW5nZW50PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpFfSkpLGUuc3QmJihMLnN0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZToyLHZhbHVlczpUfSkpLG5ldyBVdCh7YXR0cmlidXRlczpMLGluZGljZXM6cCxwcmltaXRpdmVUeXBlOkJ0LlRSSUFOR0xFU30pfWZ1bmN0aW9uIGRjKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKTtsZXQgZT10LnBvbHlnb25IaWVyYXJjaHksbj10LnRleHR1cmVDb29yZGluYXRlczt5LmRlZmluZWQoIm9wdGlvbnMucG9seWdvbkhpZXJhcmNoeSIsZSk7bGV0IG89eCh0LnZlcnRleEZvcm1hdCxkdC5ERUZBVUxUKTt0aGlzLl92ZXJ0ZXhGb3JtYXQ9ZHQuY2xvbmUobyksdGhpcy5fcG9seWdvbkhpZXJhcmNoeT1lLHRoaXMuX3N0Um90YXRpb249eCh0LnN0Um90YXRpb24sMCksdGhpcy5fZWxsaXBzb2lkPSQuY2xvbmUoeCh0LmVsbGlwc29pZCwkLldHUzg0KSksdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlQ29wbGFuYXJQb2x5Z29uR2VvbWV0cnkiLHRoaXMuX3RleHR1cmVDb29yZGluYXRlcz1uLHRoaXMucGFja2VkTGVuZ3RoPXllLmNvbXB1dGVIaWVyYXJjaHlQYWNrZWRMZW5ndGgoZSxhKStkdC5wYWNrZWRMZW5ndGgrJC5wYWNrZWRMZW5ndGgrKGgobik/eWUuY29tcHV0ZUhpZXJhcmNoeVBhY2tlZExlbmd0aChuLHR0KToxKSsyfXZhciBCSSxVSSxWSSxrSSxHSSx6SSxqSSxEZixISSxxSSxFVCxLSSxXSSxYSSwkSSxaSSxRSSxEMCxSVD1aKCgpPT57anIoKTtDZigpO01lKCk7RmUoKTtGdCgpO1h0KCk7TGUoKTtTMCgpO0l0KCk7ZnQoKTtadCgpO1hlKCk7WWUoKTthbigpO3NjKCk7c2koKTskZSgpO1d0KCk7Rm4oKTtMZigpO3FyKCk7dG4oKTtXbygpO0VvKCk7Qkk9bmV3IGEsVUk9bmV3IEhyLFZJPW5ldyB0dCxrST1uZXcgdHQsR0k9bmV3IGEsekk9bmV3IGEsakk9bmV3IGEsRGY9bmV3IGEsSEk9bmV3IGEscUk9bmV3IGEsRVQ9bmV3IGVlLEtJPW5ldyBKLFdJPW5ldyBKLFhJPW5ldyBhO2RjLmZyb21Qb3NpdGlvbnM9ZnVuY3Rpb24odCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpLHkuZGVmaW5lZCgib3B0aW9ucy5wb3NpdGlvbnMiLHQucG9zaXRpb25zKTtsZXQgZT17cG9seWdvbkhpZXJhcmNoeTp7cG9zaXRpb25zOnQucG9zaXRpb25zfSx2ZXJ0ZXhGb3JtYXQ6dC52ZXJ0ZXhGb3JtYXQsc3RSb3RhdGlvbjp0LnN0Um90YXRpb24sZWxsaXBzb2lkOnQuZWxsaXBzb2lkLHRleHR1cmVDb29yZGluYXRlczp0LnRleHR1cmVDb29yZGluYXRlc307cmV0dXJuIG5ldyBkYyhlKX07ZGMucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49eChuLDApLG49eWUucGFja1BvbHlnb25IaWVyYXJjaHkodC5fcG9seWdvbkhpZXJhcmNoeSxlLG4sYSksJC5wYWNrKHQuX2VsbGlwc29pZCxlLG4pLG4rPSQucGFja2VkTGVuZ3RoLGR0LnBhY2sodC5fdmVydGV4Rm9ybWF0LGUsbiksbis9ZHQucGFja2VkTGVuZ3RoLGVbbisrXT10Ll9zdFJvdGF0aW9uLGgodC5fdGV4dHVyZUNvb3JkaW5hdGVzKT9uPXllLnBhY2tQb2x5Z29uSGllcmFyY2h5KHQuX3RleHR1cmVDb29yZGluYXRlcyxlLG4sdHQpOmVbbisrXT0tMSxlW24rK109dC5wYWNrZWRMZW5ndGgsZX07JEk9JC5jbG9uZSgkLlVOSVRfU1BIRVJFKSxaST1uZXcgZHQsUUk9e3BvbHlnb25IaWVyYXJjaHk6e319O2RjLnVucGFjaz1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCk7bGV0IG89eWUudW5wYWNrUG9seWdvbkhpZXJhcmNoeSh0LGUsYSk7ZT1vLnN0YXJ0aW5nSW5kZXgsZGVsZXRlIG8uc3RhcnRpbmdJbmRleDtsZXQgcj0kLnVucGFjayh0LGUsJEkpO2UrPSQucGFja2VkTGVuZ3RoO2xldCBpPWR0LnVucGFjayh0LGUsWkkpO2UrPWR0LnBhY2tlZExlbmd0aDtsZXQgcz10W2UrK10sZj10W2VdPT09LTE/dm9pZCAwOnllLnVucGFja1BvbHlnb25IaWVyYXJjaHkodCxlLHR0KTtoKGYpPyhlPWYuc3RhcnRpbmdJbmRleCxkZWxldGUgZi5zdGFydGluZ0luZGV4KTplKys7bGV0IHU9dFtlKytdO3JldHVybiBoKG4pfHwobj1uZXcgZGMoUUkpKSxuLl9wb2x5Z29uSGllcmFyY2h5PW8sbi5fZWxsaXBzb2lkPSQuY2xvbmUocixuLl9lbGxpcHNvaWQpLG4uX3ZlcnRleEZvcm1hdD1kdC5jbG9uZShpLG4uX3ZlcnRleEZvcm1hdCksbi5fc3RSb3RhdGlvbj1zLG4uX3RleHR1cmVDb29yZGluYXRlcz1mLG4ucGFja2VkTGVuZ3RoPXUsbn07ZGMuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fdmVydGV4Rm9ybWF0LG49dC5fcG9seWdvbkhpZXJhcmNoeSxvPXQuX3N0Um90YXRpb24scj10Ll90ZXh0dXJlQ29vcmRpbmF0ZXMsaT1oKHIpLHM9bi5wb3NpdGlvbnM7aWYocz1DbihzLGEuZXF1YWxzRXBzaWxvbiwhMCkscy5sZW5ndGg8MylyZXR1cm47bGV0IGY9R0ksdT16SSxjPWpJLGw9SEkscD1xSTtpZighZGEuY29tcHV0ZVByb2plY3RUbzJEQXJndW1lbnRzKHMsRGYsbCxwKSlyZXR1cm47aWYoZj1hLmNyb3NzKGwscCxmKSxmPWEubm9ybWFsaXplKGYsZiksIWEuZXF1YWxzRXBzaWxvbihEZixhLlpFUk8sTS5FUFNJTE9ONikpe2xldCB2PXQuX2VsbGlwc29pZC5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoRGYsWEkpO2EuZG90KGYsdik8MCYmKGY9YS5uZWdhdGUoZixmKSxsPWEubmVnYXRlKGwsbCkpfWxldCBtPWRhLmNyZWF0ZVByb2plY3RQb2ludHNUbzJERnVuY3Rpb24oRGYsbCxwKSxfPWRhLmNyZWF0ZVByb2plY3RQb2ludFRvMkRGdW5jdGlvbihEZixsLHApO2UudGFuZ2VudCYmKHU9YS5jbG9uZShsLHUpKSxlLmJpdGFuZ2VudCYmKGM9YS5jbG9uZShwLGMpKTtsZXQgZz15ZS5wb2x5Z29uc0Zyb21IaWVyYXJjaHkobixpLG0sITEpLGI9Zy5oaWVyYXJjaHksdz1nLnBvbHlnb25zLE89ZnVuY3Rpb24odil7cmV0dXJuIHZ9LEU9aT95ZS5wb2x5Z29uc0Zyb21IaWVyYXJjaHkociwhMCxPLCExKS5wb2x5Z29uczp2b2lkIDA7aWYoYi5sZW5ndGg9PT0wKXJldHVybjtzPWJbMF0ub3V0ZXJSaW5nO2xldCBUPUF0LmZyb21Qb2ludHMocyksQz15ZS5jb21wdXRlQm91bmRpbmdSZWN0YW5nbGUoZixfLHMsbyxVSSksTj1bXTtmb3IobGV0IHY9MDt2PHcubGVuZ3RoO3YrKyl7bGV0IEw9bmV3IGNvKHtnZW9tZXRyeTpZSSh3W3ZdLGUsQyxvLGk/RVt2XTp2b2lkIDAsXyxmLHUsYyl9KTtOLnB1c2goTCl9bGV0IEk9VmUuY29tYmluZUluc3RhbmNlcyhOKVswXTtJLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzPW5ldyBGbG9hdDY0QXJyYXkoSS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyksSS5pbmRpY2VzPUR0LmNyZWF0ZVR5cGVkQXJyYXkoSS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGgvMyxJLmluZGljZXMpO2xldCBEPUkuYXR0cmlidXRlcztyZXR1cm4gZS5wb3NpdGlvbnx8ZGVsZXRlIEQucG9zaXRpb24sbmV3IFV0KHthdHRyaWJ1dGVzOkQsaW5kaWNlczpJLmluZGljZXMscHJpbWl0aXZlVHlwZTpJLnByaW1pdGl2ZVR5cGUsYm91bmRpbmdTcGhlcmU6VH0pfTtEMD1kY30pO3ZhciBGMD17fTtkZShGMCx7ZGVmYXVsdDooKT0+dHZ9KTtmdW5jdGlvbiBKSSh0LGUpe3JldHVybiBoKGUpJiYodD1EMC51bnBhY2sodCxlKSksRDAuY3JlYXRlR2VvbWV0cnkodCl9dmFyIHR2LEIwPVooKCk9PntSVCgpO2Z0KCk7dHY9Skl9KTtmdW5jdGlvbiBldih0KXtsZXQgZT10Lmxlbmd0aCxuPW5ldyBGbG9hdDY0QXJyYXkoZSozKSxvPUR0LmNyZWF0ZVR5cGVkQXJyYXkoZSxlKjIpLHI9MCxpPTA7Zm9yKGxldCBmPTA7ZjxlO2YrKyl7bGV0IHU9dFtmXTtuW3IrK109dS54LG5bcisrXT11LnksbltyKytdPXUueixvW2krK109ZixvW2krK109KGYrMSklZX1sZXQgcz1uZXcgaWUoe3Bvc2l0aW9uOm5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6bn0pfSk7cmV0dXJuIG5ldyBVdCh7YXR0cmlidXRlczpzLGluZGljZXM6byxwcmltaXRpdmVUeXBlOkJ0LkxJTkVTfSl9ZnVuY3Rpb24gbWModCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXQucG9seWdvbkhpZXJhcmNoeTt5LmRlZmluZWQoIm9wdGlvbnMucG9seWdvbkhpZXJhcmNoeSIsZSksdGhpcy5fcG9seWdvbkhpZXJhcmNoeT1lLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZUNvcGxhbmFyUG9seWdvbk91dGxpbmVHZW9tZXRyeSIsdGhpcy5wYWNrZWRMZW5ndGg9eWUuY29tcHV0ZUhpZXJhcmNoeVBhY2tlZExlbmd0aChlLGEpKzF9dmFyIG52LFUwLFNUPVooKCk9PntqcigpO01lKCk7RnQoKTtYdCgpO0xlKCk7UzAoKTtJdCgpO2Z0KCk7WGUoKTtZZSgpO2FuKCk7c2MoKTtzaSgpOyRlKCk7TGYoKTt0bigpO21jLmZyb21Qb3NpdGlvbnM9ZnVuY3Rpb24odCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpLHkuZGVmaW5lZCgib3B0aW9ucy5wb3NpdGlvbnMiLHQucG9zaXRpb25zKTtsZXQgZT17cG9seWdvbkhpZXJhcmNoeTp7cG9zaXRpb25zOnQucG9zaXRpb25zfX07cmV0dXJuIG5ldyBtYyhlKX07bWMucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49eChuLDApLG49eWUucGFja1BvbHlnb25IaWVyYXJjaHkodC5fcG9seWdvbkhpZXJhcmNoeSxlLG4sYSksZVtuXT10LnBhY2tlZExlbmd0aCxlfTtudj17cG9seWdvbkhpZXJhcmNoeTp7fX07bWMudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXt5LmRlZmluZWQoImFycmF5Iix0KSxlPXgoZSwwKTtsZXQgbz15ZS51bnBhY2tQb2x5Z29uSGllcmFyY2h5KHQsZSxhKTtlPW8uc3RhcnRpbmdJbmRleCxkZWxldGUgby5zdGFydGluZ0luZGV4O2xldCByPXRbZV07cmV0dXJuIGgobil8fChuPW5ldyBtYyhudikpLG4uX3BvbHlnb25IaWVyYXJjaHk9byxuLnBhY2tlZExlbmd0aD1yLG59O21jLmNyZWF0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQpe2xldCBlPXQuX3BvbHlnb25IaWVyYXJjaHksbj1lLnBvc2l0aW9ucztpZihuPUNuKG4sYS5lcXVhbHNFcHNpbG9uLCEwKSxuLmxlbmd0aDwzfHwhZGEudmFsaWRPdXRsaW5lKG4pKXJldHVybjtsZXQgcj15ZS5wb2x5Z29uT3V0bGluZXNGcm9tSGllcmFyY2h5KGUsITEpO2lmKHIubGVuZ3RoPT09MClyZXR1cm47bGV0IGk9W107Zm9yKGxldCB1PTA7dTxyLmxlbmd0aDt1Kyspe2xldCBjPW5ldyBjbyh7Z2VvbWV0cnk6ZXYoclt1XSl9KTtpLnB1c2goYyl9bGV0IHM9VmUuY29tYmluZUluc3RhbmNlcyhpKVswXSxmPUF0LmZyb21Qb2ludHMoZS5wb3NpdGlvbnMpO3JldHVybiBuZXcgVXQoe2F0dHJpYnV0ZXM6cy5hdHRyaWJ1dGVzLGluZGljZXM6cy5pbmRpY2VzLHByaW1pdGl2ZVR5cGU6cy5wcmltaXRpdmVUeXBlLGJvdW5kaW5nU3BoZXJlOmZ9KX07VTA9bWN9KTt2YXIgVjA9e307ZGUoVjAse2RlZmF1bHQ6KCk9PnJ2fSk7ZnVuY3Rpb24gb3YodCxlKXtyZXR1cm4gaChlKSYmKHQ9VTAudW5wYWNrKHQsZSkpLHQuX2VsbGlwc29pZD0kLmNsb25lKHQuX2VsbGlwc29pZCksVTAuY3JlYXRlR2VvbWV0cnkodCl9dmFyIHJ2LGswPVooKCk9PntTVCgpO2Z0KCk7WnQoKTtydj1vdn0pO3ZhciBpdixmbixoYz1aKCgpPT57aXY9e1JPVU5ERUQ6MCxNSVRFUkVEOjEsQkVWRUxFRDoyfSxmbj1PYmplY3QuZnJlZXplKGl2KX0pO2Z1bmN0aW9uIHN2KHQpe2xldCBlPXQuX3VTcXVhcmVkLG49dC5fZWxsaXBzb2lkLm1heGltdW1SYWRpdXMsbz10Ll9lbGxpcHNvaWQubWluaW11bVJhZGl1cyxyPShuLW8pL24saT1NYXRoLmNvcyh0Ll9zdGFydEhlYWRpbmcpLHM9TWF0aC5zaW4odC5fc3RhcnRIZWFkaW5nKSxmPSgxLXIpKk1hdGgudGFuKHQuX3N0YXJ0LmxhdGl0dWRlKSx1PTEvTWF0aC5zcXJ0KDErZipmKSxjPXUqZixsPU1hdGguYXRhbjIoZixpKSxwPXUqcyxkPXAqcCxtPTEtZCxfPU1hdGguc3FydChtKSxnPWUvNCxiPWcqZyx3PWIqZyxPPWIqYixFPTErZy0zKmIvNCs1KncvNC0xNzUqTy82NCxUPTEtZysxNSpiLzgtMzUqdy84LEM9MS0zKmcrMzUqYi80LE49MS01KmcsST1FKmwtVCpNYXRoLnNpbigyKmwpKmcvMi1DKk1hdGguc2luKDQqbCkqYi8xNi1OKk1hdGguc2luKDYqbCkqdy80OC1NYXRoLnNpbig4KmwpKjUqTy81MTIsRD10Ll9jb25zdGFudHM7RC5hPW4sRC5iPW8sRC5mPXIsRC5jb3NpbmVIZWFkaW5nPWksRC5zaW5lSGVhZGluZz1zLEQudGFuVT1mLEQuY29zaW5lVT11LEQuc2luZVU9YyxELnNpZ21hPWwsRC5zaW5lQWxwaGE9cCxELnNpbmVTcXVhcmVkQWxwaGE9ZCxELmNvc2luZVNxdWFyZWRBbHBoYT1tLEQuY29zaW5lQWxwaGE9XyxELnUyT3ZlcjQ9ZyxELnU0T3ZlcjE2PWIsRC51Nk92ZXI2ND13LEQudThPdmVyMjU2PU8sRC5hMD1FLEQuYTE9VCxELmEyPUMsRC5hMz1OLEQuZGlzdGFuY2VSYXRpbz1JfWZ1bmN0aW9uIGN2KHQsZSl7cmV0dXJuIHQqZSooNCt0Kig0LTMqZSkpLzE2fWZ1bmN0aW9uIENUKHQsZSxuLG8scixpLHMpe2xldCBmPWN2KHQsbik7cmV0dXJuKDEtZikqdCplKihvK2YqcioocytmKmkqKDIqcypzLTEpKSl9ZnVuY3Rpb24gYXYodCxlLG4sbyxyLGkscyl7bGV0IGY9KGUtbikvZSx1PWktbyxjPU1hdGguYXRhbigoMS1mKSpNYXRoLnRhbihyKSksbD1NYXRoLmF0YW4oKDEtZikqTWF0aC50YW4ocykpLHA9TWF0aC5jb3MoYyksZD1NYXRoLnNpbihjKSxtPU1hdGguY29zKGwpLF89TWF0aC5zaW4obCksZz1wKm0sYj1wKl8sdz1kKl8sTz1kKm0sRT11LFQ9TS5UV09fUEksQz1NYXRoLmNvcyhFKSxOPU1hdGguc2luKEUpLEksRCx2LEwsVTtkb3tDPU1hdGguY29zKEUpLE49TWF0aC5zaW4oRSk7bGV0IFg9Yi1PKkM7dj1NYXRoLnNxcnQobSptKk4qTitYKlgpLEQ9dytnKkMsST1NYXRoLmF0YW4yKHYsRCk7bGV0IFI7dj09PTA/KFI9MCxMPTEpOihSPWcqTi92LEw9MS1SKlIpLFQ9RSxVPUQtMip3L0wsaXNGaW5pdGUoVSl8fChVPTApLEU9dStDVChmLFIsTCxJLHYsRCxVKX13aGlsZShNYXRoLmFicyhFLVQpPk0uRVBTSUxPTjEyKTtsZXQgQT1MKihlKmUtbipuKS8obipuKSxTPTErQSooNDA5NitBKihBKigzMjAtMTc1KkEpLTc2OCkpLzE2Mzg0LFA9QSooMjU2K0EqKEEqKDc0LTQ3KkEpLTEyOCkpLzEwMjQsQj1VKlUsaj1QKnYqKFUrUCooRCooMipCLTEpLVAqVSooNCp2KnYtMykqKDQqQi0zKS82KS80KSxIPW4qUyooSS1qKSxrPU1hdGguYXRhbjIobSpOLGItTypDKSxLPU1hdGguYXRhbjIocCpOLGIqQy1PKTt0Ll9kaXN0YW5jZT1ILHQuX3N0YXJ0SGVhZGluZz1rLHQuX2VuZEhlYWRpbmc9Syx0Ll91U3F1YXJlZD1BfWZ1bmN0aW9uIHhUKHQsZSxuLG8pe2xldCByPWEubm9ybWFsaXplKG8uY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oZSxHMCksZnYpLGk9YS5ub3JtYWxpemUoby5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihuLEcwKSxHMCk7eS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoInZhbHVlIixNYXRoLmFicyhNYXRoLmFicyhhLmFuZ2xlQmV0d2VlbihyLGkpKS1NYXRoLlBJKSwuMDEyNSksYXYodCxvLm1heGltdW1SYWRpdXMsby5taW5pbXVtUmFkaXVzLGUubG9uZ2l0dWRlLGUubGF0aXR1ZGUsbi5sb25naXR1ZGUsbi5sYXRpdHVkZSksdC5fc3RhcnQ9YXQuY2xvbmUoZSx0Ll9zdGFydCksdC5fZW5kPWF0LmNsb25lKG4sdC5fZW5kKSx0Ll9zdGFydC5oZWlnaHQ9MCx0Ll9lbmQuaGVpZ2h0PTAsc3YodCl9ZnVuY3Rpb24gRmYodCxlLG4pe2xldCBvPXgobiwkLldHUzg0KTt0aGlzLl9lbGxpcHNvaWQ9byx0aGlzLl9zdGFydD1uZXcgYXQsdGhpcy5fZW5kPW5ldyBhdCx0aGlzLl9jb25zdGFudHM9e30sdGhpcy5fc3RhcnRIZWFkaW5nPXZvaWQgMCx0aGlzLl9lbmRIZWFkaW5nPXZvaWQgMCx0aGlzLl9kaXN0YW5jZT12b2lkIDAsdGhpcy5fdVNxdWFyZWQ9dm9pZCAwLGgodCkmJmgoZSkmJnhUKHRoaXMsdCxlLG8pfXZhciBmdixHMCxpZCx6MD1aKCgpPT57RnQoKTtQZSgpO1h0KCk7SXQoKTtmdCgpO1p0KCk7V3QoKTtmdj1uZXcgYSxHMD1uZXcgYTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhGZi5wcm90b3R5cGUse2VsbGlwc29pZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VsbGlwc29pZH19LHN1cmZhY2VEaXN0YW5jZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkuZGVmaW5lZCgiZGlzdGFuY2UiLHRoaXMuX2Rpc3RhbmNlKSx0aGlzLl9kaXN0YW5jZX19LHN0YXJ0OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RhcnR9fSxlbmQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbmR9fSxzdGFydEhlYWRpbmc6e2dldDpmdW5jdGlvbigpe3JldHVybiB5LmRlZmluZWQoImRpc3RhbmNlIix0aGlzLl9kaXN0YW5jZSksdGhpcy5fc3RhcnRIZWFkaW5nfX0sZW5kSGVhZGluZzp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkuZGVmaW5lZCgiZGlzdGFuY2UiLHRoaXMuX2Rpc3RhbmNlKSx0aGlzLl9lbmRIZWFkaW5nfX19KTtGZi5wcm90b3R5cGUuc2V0RW5kUG9pbnRzPWZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJzdGFydCIsdCkseS5kZWZpbmVkKCJlbmQiLGUpLHhUKHRoaXMsdCxlLHRoaXMuX2VsbGlwc29pZCl9O0ZmLnByb3RvdHlwZS5pbnRlcnBvbGF0ZVVzaW5nRnJhY3Rpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5pbnRlcnBvbGF0ZVVzaW5nU3VyZmFjZURpc3RhbmNlKHRoaXMuX2Rpc3RhbmNlKnQsZSl9O0ZmLnByb3RvdHlwZS5pbnRlcnBvbGF0ZVVzaW5nU3VyZmFjZURpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJkaXN0YW5jZSIsdGhpcy5fZGlzdGFuY2UpO2xldCBuPXRoaXMuX2NvbnN0YW50cyxvPW4uZGlzdGFuY2VSYXRpbyt0L24uYixyPU1hdGguY29zKDIqbyksaT1NYXRoLmNvcyg0Km8pLHM9TWF0aC5jb3MoNipvKSxmPU1hdGguc2luKDIqbyksdT1NYXRoLnNpbig0Km8pLGM9TWF0aC5zaW4oNipvKSxsPU1hdGguc2luKDgqbykscD1vKm8sZD1vKnAsbT1uLnU4T3ZlcjI1NixfPW4udTJPdmVyNCxnPW4udTZPdmVyNjQsYj1uLnU0T3ZlcjE2LHc9MipkKm0qci8zK28qKDEtXys3KmIvNC0xNSpnLzQrNTc5Km0vNjQtKGItMTUqZy80KzE4NyptLzE2KSpyLSg1KmcvNC0xMTUqbS8xNikqaS0yOSptKnMvMTYpKyhfLzItYis3MSpnLzMyLTg1Km0vMTYpKmYrKDUqYi8xNi01KmcvNCszODMqbS85NikqdS1wKigoZy0xMSptLzIpKmYrNSptKnUvMikrKDI5KmcvOTYtMjkqbS8xNikqYys1MzkqbSpsLzE1MzYsTz1NYXRoLmFzaW4oTWF0aC5zaW4odykqbi5jb3NpbmVBbHBoYSksRT1NYXRoLmF0YW4obi5hL24uYipNYXRoLnRhbihPKSk7dz13LW4uc2lnbWE7bGV0IFQ9TWF0aC5jb3MoMipuLnNpZ21hK3cpLEM9TWF0aC5zaW4odyksTj1NYXRoLmNvcyh3KSxJPW4uY29zaW5lVSpOLEQ9bi5zaW5lVSpDLEw9TWF0aC5hdGFuMihDKm4uc2luZUhlYWRpbmcsSS1EKm4uY29zaW5lSGVhZGluZyktQ1Qobi5mLG4uc2luZUFscGhhLG4uY29zaW5lU3F1YXJlZEFscGhhLHcsQyxOLFQpO3JldHVybiBoKGUpPyhlLmxvbmdpdHVkZT10aGlzLl9zdGFydC5sb25naXR1ZGUrTCxlLmxhdGl0dWRlPUUsZS5oZWlnaHQ9MCxlKTpuZXcgYXQodGhpcy5fc3RhcnQubG9uZ2l0dWRlK0wsRSwwKX07aWQ9RmZ9KTtmdW5jdGlvbiBJVCh0LGUsbil7bGV0IG89SDA7by5sZW5ndGg9dDtsZXQgcjtpZihlPT09bil7Zm9yKHI9MDtyPHQ7cisrKW9bcl09ZTtyZXR1cm4gb31sZXQgcz0obi1lKS90O2ZvcihyPTA7cjx0O3IrKyl7bGV0IGY9ZStyKnM7b1tyXT1mfXJldHVybiBvfWZ1bmN0aW9uIGd2KHQsZSxuLG8scixpLHMsZil7bGV0IHU9by5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKHQscTApLGM9by5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKGUseXYpLGw9Rm8ubnVtYmVyT2ZQb2ludHModCxlLG4pLHA9by5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyh1LGNkKSxkPW8uY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoYyxzZCksbT1JVChsLHIsaSk7ajAuc2V0RW5kUG9pbnRzKHAsZCk7bGV0IF89ajAuc3VyZmFjZURpc3RhbmNlL2wsZz1mO3AuaGVpZ2h0PXI7bGV0IGI9by5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihwLG1zKTthLnBhY2soYixzLGcpLGcrPTM7Zm9yKGxldCB3PTE7dzxsO3crKyl7bGV0IE89ajAuaW50ZXJwb2xhdGVVc2luZ1N1cmZhY2VEaXN0YW5jZSh3Kl8sc2QpO08uaGVpZ2h0PW1bd10sYj1vLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKE8sbXMpLGEucGFjayhiLHMsZyksZys9M31yZXR1cm4gZ31mdW5jdGlvbiBBdih0LGUsbixvLHIsaSxzLGYpe2xldCB1PW8uY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWModCxjZCksYz1vLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKGUsc2QpLGw9Rm8ubnVtYmVyT2ZQb2ludHNSaHVtYkxpbmUodSxjLG4pO3UuaGVpZ2h0PTAsYy5oZWlnaHQ9MDtsZXQgcD1JVChsLHIsaSk7QmYuZWxsaXBzb2lkLmVxdWFscyhvKXx8KEJmPW5ldyBRbyh2b2lkIDAsdm9pZCAwLG8pKSxCZi5zZXRFbmRQb2ludHModSxjKTtsZXQgZD1CZi5zdXJmYWNlRGlzdGFuY2UvbCxtPWY7dS5oZWlnaHQ9cjtsZXQgXz1vLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKHUsbXMpO2EucGFjayhfLHMsbSksbSs9Mztmb3IobGV0IGc9MTtnPGw7ZysrKXtsZXQgYj1CZi5pbnRlcnBvbGF0ZVVzaW5nU3VyZmFjZURpc3RhbmNlKGcqZCxzZCk7Yi5oZWlnaHQ9cFtnXSxfPW8uY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oYixtcyksYS5wYWNrKF8scyxtKSxtKz0zfXJldHVybiBtfXZhciBGbyx1dixsdixwdixQVCxkdixNVCxtdixodixfdixIMCxjZCxzZCxtcyxxMCx5dixqMCxCZixOVCxidixnbix5YT1aKCgpPT57RnQoKTtQZSgpO0l0KCk7ZnQoKTtIdCgpO1p0KCk7ejAoKTtNZigpO3RjKCk7V3QoKTtCbigpO2ZzKCk7Rm89e307Rm8ubnVtYmVyT2ZQb2ludHM9ZnVuY3Rpb24odCxlLG4pe2xldCBvPWEuZGlzdGFuY2UodCxlKTtyZXR1cm4gTWF0aC5jZWlsKG8vbil9O0ZvLm51bWJlck9mUG9pbnRzUmh1bWJMaW5lPWZ1bmN0aW9uKHQsZSxuKXtsZXQgbz1NYXRoLnBvdyh0LmxvbmdpdHVkZS1lLmxvbmdpdHVkZSwyKStNYXRoLnBvdyh0LmxhdGl0dWRlLWUubGF0aXR1ZGUsMik7cmV0dXJuIE1hdGgubWF4KDEsTWF0aC5jZWlsKE1hdGguc3FydChvLyhuKm4pKSkpfTt1dj1uZXcgYXQ7Rm8uZXh0cmFjdEhlaWdodHM9ZnVuY3Rpb24odCxlKXtsZXQgbj10Lmxlbmd0aCxvPW5ldyBBcnJheShuKTtmb3IobGV0IHI9MDtyPG47cisrKXtsZXQgaT10W3JdO29bcl09ZS5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhpLHV2KS5oZWlnaHR9cmV0dXJuIG99O2x2PW5ldyBzdCxwdj1uZXcgYSxQVD1uZXcgYSxkdj1uZXcgb24oYS5VTklUX1gsMCksTVQ9bmV3IGEsbXY9bmV3IG9uKGEuVU5JVF9YLDApLGh2PW5ldyBhLF92PW5ldyBhLEgwPVtdO2NkPW5ldyBhdCxzZD1uZXcgYXQsbXM9bmV3IGEscTA9bmV3IGEseXY9bmV3IGEsajA9bmV3IGlkLEJmPW5ldyBRbztGby53cmFwTG9uZ2l0dWRlPWZ1bmN0aW9uKHQsZSl7bGV0IG49W10sbz1bXTtpZihoKHQpJiZ0Lmxlbmd0aD4wKXtlPXgoZSxzdC5JREVOVElUWSk7bGV0IHI9c3QuaW52ZXJzZVRyYW5zZm9ybWF0aW9uKGUsbHYpLGk9c3QubXVsdGlwbHlCeVBvaW50KHIsYS5aRVJPLHB2KSxzPWEubm9ybWFsaXplKHN0Lm11bHRpcGx5QnlQb2ludEFzVmVjdG9yKHIsYS5VTklUX1ksUFQpLFBUKSxmPW9uLmZyb21Qb2ludE5vcm1hbChpLHMsZHYpLHU9YS5ub3JtYWxpemUoc3QubXVsdGlwbHlCeVBvaW50QXNWZWN0b3IocixhLlVOSVRfWCxNVCksTVQpLGM9b24uZnJvbVBvaW50Tm9ybWFsKGksdSxtdiksbD0xO24ucHVzaChhLmNsb25lKHRbMF0pKTtsZXQgcD1uWzBdLGQ9dC5sZW5ndGg7Zm9yKGxldCBtPTE7bTxkOysrbSl7bGV0IF89dFttXTtpZihvbi5nZXRQb2ludERpc3RhbmNlKGMscCk8MHx8b24uZ2V0UG9pbnREaXN0YW5jZShjLF8pPDApe2xldCBnPWhvLmxpbmVTZWdtZW50UGxhbmUocCxfLGYsaHYpO2lmKGgoZykpe2xldCBiPWEubXVsdGlwbHlCeVNjYWxhcihzLDVlLTksX3YpO29uLmdldFBvaW50RGlzdGFuY2UoZixwKTwwJiZhLm5lZ2F0ZShiLGIpLG4ucHVzaChhLmFkZChnLGIsbmV3IGEpKSxvLnB1c2gobCsxKSxhLm5lZ2F0ZShiLGIpLG4ucHVzaChhLmFkZChnLGIsbmV3IGEpKSxsPTF9fW4ucHVzaChhLmNsb25lKHRbbV0pKSxsKysscD1ffW8ucHVzaChsKX1yZXR1cm57cG9zaXRpb25zOm4sbGVuZ3RoczpvfX07Rm8uZ2VuZXJhdGVBcmM9ZnVuY3Rpb24odCl7aCh0KXx8KHQ9e30pO2xldCBlPXQucG9zaXRpb25zO2lmKCFoKGUpKXRocm93IG5ldyBGKCJvcHRpb25zLnBvc2l0aW9ucyBpcyByZXF1aXJlZC4iKTtsZXQgbj1lLmxlbmd0aCxvPXgodC5lbGxpcHNvaWQsJC5XR1M4NCkscj14KHQuaGVpZ2h0LDApLGk9QXJyYXkuaXNBcnJheShyKTtpZihuPDEpcmV0dXJuW107aWYobj09PTEpe2xldCBnPW8uc2NhbGVUb0dlb2RldGljU3VyZmFjZShlWzBdLHEwKTtpZihyPWk/clswXTpyLHIhPT0wKXtsZXQgYj1vLmdlb2RldGljU3VyZmFjZU5vcm1hbChnLG1zKTthLm11bHRpcGx5QnlTY2FsYXIoYixyLGIpLGEuYWRkKGcsYixnKX1yZXR1cm5bZy54LGcueSxnLnpdfWxldCBzPXQubWluRGlzdGFuY2U7aWYoIWgocykpe2xldCBnPXgodC5ncmFudWxhcml0eSxNLlJBRElBTlNfUEVSX0RFR1JFRSk7cz1NLmNob3JkTGVuZ3RoKGcsby5tYXhpbXVtUmFkaXVzKX1sZXQgZj0wLHU7Zm9yKHU9MDt1PG4tMTt1KyspZis9Rm8ubnVtYmVyT2ZQb2ludHMoZVt1XSxlW3UrMV0scyk7bGV0IGM9KGYrMSkqMyxsPW5ldyBBcnJheShjKSxwPTA7Zm9yKHU9MDt1PG4tMTt1Kyspe2xldCBnPWVbdV0sYj1lW3UrMV0sdz1pP3JbdV06cixPPWk/clt1KzFdOnI7cD1ndihnLGIscyxvLHcsTyxsLHApfUgwLmxlbmd0aD0wO2xldCBkPWVbbi0xXSxtPW8uY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoZCxjZCk7bS5oZWlnaHQ9aT9yW24tMV06cjtsZXQgXz1vLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKG0sbXMpO3JldHVybiBhLnBhY2soXyxsLGMtMyksbH07TlQ9bmV3IGF0LGJ2PW5ldyBhdDtGby5nZW5lcmF0ZVJodW1iQXJjPWZ1bmN0aW9uKHQpe2godCl8fCh0PXt9KTtsZXQgZT10LnBvc2l0aW9ucztpZighaChlKSl0aHJvdyBuZXcgRigib3B0aW9ucy5wb3NpdGlvbnMgaXMgcmVxdWlyZWQuIik7bGV0IG49ZS5sZW5ndGgsbz14KHQuZWxsaXBzb2lkLCQuV0dTODQpLHI9eCh0LmhlaWdodCwwKSxpPUFycmF5LmlzQXJyYXkocik7aWYobjwxKXJldHVybltdO2lmKG49PT0xKXtsZXQgdz1vLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UoZVswXSxxMCk7aWYocj1pP3JbMF06cixyIT09MCl7bGV0IE89by5nZW9kZXRpY1N1cmZhY2VOb3JtYWwodyxtcyk7YS5tdWx0aXBseUJ5U2NhbGFyKE8scixPKSxhLmFkZCh3LE8sdyl9cmV0dXJuW3cueCx3Lnksdy56XX1sZXQgcz14KHQuZ3JhbnVsYXJpdHksTS5SQURJQU5TX1BFUl9ERUdSRUUpLGY9MCx1LGM9by5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhlWzBdLE5UKSxsO2Zvcih1PTA7dTxuLTE7dSsrKWw9by5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhlW3UrMV0sYnYpLGYrPUZvLm51bWJlck9mUG9pbnRzUmh1bWJMaW5lKGMsbCxzKSxjPWF0LmNsb25lKGwsTlQpO2xldCBwPShmKzEpKjMsZD1uZXcgQXJyYXkocCksbT0wO2Zvcih1PTA7dTxuLTE7dSsrKXtsZXQgdz1lW3VdLE89ZVt1KzFdLEU9aT9yW3VdOnIsVD1pP3JbdSsxXTpyO209QXYodyxPLHMsbyxFLFQsZCxtKX1IMC5sZW5ndGg9MDtsZXQgXz1lW24tMV0sZz1vLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKF8sY2QpO2cuaGVpZ2h0PWk/cltuLTFdOnI7bGV0IGI9by5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihnLG1zKTtyZXR1cm4gYS5wYWNrKGIsZCxwLTMpLGR9O0ZvLmdlbmVyYXRlQ2FydGVzaWFuQXJjPWZ1bmN0aW9uKHQpe2xldCBlPUZvLmdlbmVyYXRlQXJjKHQpLG49ZS5sZW5ndGgvMyxvPW5ldyBBcnJheShuKTtmb3IobGV0IHI9MDtyPG47cisrKW9bcl09YS51bnBhY2soZSxyKjMpO3JldHVybiBvfTtGby5nZW5lcmF0ZUNhcnRlc2lhblJodW1iQXJjPWZ1bmN0aW9uKHQpe2xldCBlPUZvLmdlbmVyYXRlUmh1bWJBcmModCksbj1lLmxlbmd0aC8zLG89bmV3IEFycmF5KG4pO2ZvcihsZXQgcj0wO3I8bjtyKyspb1tyXT1hLnVucGFjayhlLHIqMyk7cmV0dXJuIG99O2duPUZvfSk7ZnVuY3Rpb24gVWYodCxlKXtpZighaCh0KSl0aHJvdyBuZXcgRigiaWRlbnRpZmllciBpcyByZXF1aXJlZC4iKTtoKHZUW3RdKXx8KHZUW3RdPSEwLGNvbnNvbGUud2Fybih4KGUsdCkpKX12YXIgdlQsYWQsSzA9WigoKT0+e0l0KCk7ZnQoKTtIdCgpO3ZUPXt9O1VmLmdlb21ldHJ5T3V0bGluZXM9IkVudGl0eSBnZW9tZXRyeSBvdXRsaW5lcyBhcmUgdW5zdXBwb3J0ZWQgb24gdGVycmFpbi4gT3V0bGluZXMgd2lsbCBiZSBkaXNhYmxlZC4gVG8gZW5hYmxlIG91dGxpbmVzLCBkaXNhYmxlIGdlb21ldHJ5IHRlcnJhaW4gY2xhbXBpbmcgYnkgZXhwbGljaXRseSBzZXR0aW5nIGhlaWdodCB0byAwLiI7VWYuZ2VvbWV0cnlaSW5kZXg9IkVudGl0eSBnZW9tZXRyeSB3aXRoIHpJbmRleCBhcmUgdW5zdXBwb3J0ZWQgd2hlbiBoZWlnaHQgb3IgZXh0cnVkZWRIZWlnaHQgYXJlIGRlZmluZWQuICB6SW5kZXggd2lsbCBiZSBpZ25vcmVkIjtVZi5nZW9tZXRyeUhlaWdodFJlZmVyZW5jZT0iRW50aXR5IGNvcnJpZG9yLCBlbGxpcHNlLCBwb2x5Z29uIG9yIHJlY3RhbmdsZSB3aXRoIGhlaWdodFJlZmVyZW5jZSBtdXN0IGFsc28gaGF2ZSBhIGRlZmluZWQgaGVpZ2h0LiAgaGVpZ2h0UmVmZXJlbmNlIHdpbGwgYmUgaWdub3JlZCI7VWYuZ2VvbWV0cnlFeHRydWRlZEhlaWdodFJlZmVyZW5jZT0iRW50aXR5IGNvcnJpZG9yLCBlbGxpcHNlLCBwb2x5Z29uIG9yIHJlY3RhbmdsZSB3aXRoIGV4dHJ1ZGVkSGVpZ2h0UmVmZXJlbmNlIG11c3QgYWxzbyBoYXZlIGEgZGVmaW5lZCBleHRydWRlZEhlaWdodC4gIGV4dHJ1ZGVkSGVpZ2h0UmVmZXJlbmNlIHdpbGwgYmUgaWdub3JlZCI7YWQ9VWZ9KTtmdW5jdGlvbiBNdih0LGUpe2xldCBuPW5ldyBBcnJheSh0Lmxlbmd0aCk7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2xldCByPXRbb107VzA9ZS5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhyLFcwKSxuW29dPVcwLmhlaWdodCx0W29dPWUuc2NhbGVUb0dlb2RldGljU3VyZmFjZShyLHIpfXJldHVybiBufWZ1bmN0aW9uIFgwKHQsZSxuLG8pe2xldCByPXRbMF0saT10WzFdLHM9YS5hbmdsZUJldHdlZW4ocixpKSxmPU1hdGguY2VpbChzL28pLHU9bmV3IEFycmF5KGYpLGM7aWYoZT09PW4pe2ZvcihjPTA7YzxmO2MrKyl1W2NdPWU7cmV0dXJuIHUucHVzaChuKSx1fWxldCBwPShuLWUpL2Y7Zm9yKGM9MTtjPGY7YysrKXtsZXQgZD1lK2MqcDt1W2NdPWR9cmV0dXJuIHVbMF09ZSx1LnB1c2gobiksdX1mdW5jdGlvbiBOdih0LGUsbixvKXtsZXQgcj1uZXcgX28obixvKSxpPXIucHJvamVjdFBvaW50T250b1BsYW5lKGEuYWRkKG4sdCx1ZCksdWQpLHM9ci5wcm9qZWN0UG9pbnRPbnRvUGxhbmUoYS5hZGQobixlLGxkKSxsZCksZj10dC5hbmdsZUJldHdlZW4oaSxzKTtyZXR1cm4gcy54KmkueS1zLnkqaS54Pj0wPy1mOmZ9ZnVuY3Rpb24gVWkodCxlLG4sbyxyLGkscyxmKXtsZXQgdT1EdixjPUZ2O19jPVlvLmVhc3ROb3J0aFVwVG9GaXhlZEZyYW1lKHQscixfYyksdT1zdC5tdWx0aXBseUJ5UG9pbnRBc1ZlY3RvcihfYyxJdix1KSx1PWEubm9ybWFsaXplKHUsdSk7bGV0IGw9TnYodSxlLHQscik7WTA9Si5mcm9tUm90YXRpb25aKGwsWTApLExULno9aSxfYz1zdC5tdWx0aXBseVRyYW5zZm9ybWF0aW9uKF9jLHN0LmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uKFkwLExULHZ2KSxfYyk7bGV0IHA9THY7cFswXT1zO2ZvcihsZXQgZD0wO2Q8ZjtkKyspZm9yKGxldCBtPTA7bTxuLmxlbmd0aDttKz0zKWM9YS5mcm9tQXJyYXkobixtLGMpLGM9Si5tdWx0aXBseUJ5VmVjdG9yKHAsYyxjKSxjPXN0Lm11bHRpcGx5QnlQb2ludChfYyxjLGMpLG8ucHVzaChjLngsYy55LGMueik7cmV0dXJuIG99ZnVuY3Rpb24gJDAodCxlLG4sbyxyLGkscyl7Zm9yKGxldCBmPTA7Zjx0Lmxlbmd0aDtmKz0zKXtsZXQgdT1hLmZyb21BcnJheSh0LGYsQnYpO289VWkodSxlLG4sbyxyLGlbZi8zXSxzLDEpfXJldHVybiBvfWZ1bmN0aW9uIFV2KHQsZSl7bGV0IG49dC5sZW5ndGgsbz1uZXcgQXJyYXkobio2KSxyPTAsaT1lLngrZS53aWR0aC8yLHM9ZS55K2UuaGVpZ2h0LzIsZj10WzBdO29bcisrXT1mLngtaSxvW3IrK109MCxvW3IrK109Zi55LXM7Zm9yKGxldCB1PTE7dTxuO3UrKyl7Zj10W3VdO2xldCBjPWYueC1pLGw9Zi55LXM7b1tyKytdPWMsb1tyKytdPTAsb1tyKytdPWwsb1tyKytdPWMsb1tyKytdPTAsb1tyKytdPWx9cmV0dXJuIGY9dFswXSxvW3IrK109Zi54LWksb1tyKytdPTAsb1tyKytdPWYueS1zLG99ZnVuY3Rpb24gRFQodCxlKXtsZXQgbj10Lmxlbmd0aCxvPW5ldyBBcnJheShuKjMpLHI9MCxpPWUueCtlLndpZHRoLzIscz1lLnkrZS5oZWlnaHQvMjtmb3IobGV0IGY9MDtmPG47ZisrKW9bcisrXT10W2ZdLngtaSxvW3IrK109MCxvW3IrK109dFtmXS55LXM7cmV0dXJuIG99ZnVuY3Rpb24gVlQodCxlLG4sbyxyLGkscyxmLHUsYyl7bGV0IGw9YS5hbmdsZUJldHdlZW4oYS5zdWJ0cmFjdChlLHQsZ2EpLGEuc3VidHJhY3Qobix0LGZkKSkscD1vPT09Zm4uQkVWRUxFRD8wOk1hdGguY2VpbChsL00udG9SYWRpYW5zKDUpKSxkO3I/ZD1KLmZyb21RdWF0ZXJuaW9uKGVlLmZyb21BeGlzQW5nbGUoYS5uZWdhdGUodCxnYSksbC8ocCsxKSxGVCksVVQpOmQ9Si5mcm9tUXVhdGVybmlvbihlZS5mcm9tQXhpc0FuZ2xlKHQsbC8ocCsxKSxGVCksVVQpO2xldCBtLF87aWYoZT1hLmNsb25lKGUsQlQpLHA+MCl7bGV0IGc9Yz8yOjE7Zm9yKGxldCBiPTA7YjxwO2IrKyllPUoubXVsdGlwbHlCeVZlY3RvcihkLGUsZSksbT1hLnN1YnRyYWN0KGUsdCxnYSksbT1hLm5vcm1hbGl6ZShtLG0pLHJ8fChtPWEubmVnYXRlKG0sbSkpLF89aS5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKGUsZmQpLHM9VWkoXyxtLGYscyxpLHUsMSxnKX1lbHNlIG09YS5zdWJ0cmFjdChlLHQsZ2EpLG09YS5ub3JtYWxpemUobSxtKSxyfHwobT1hLm5lZ2F0ZShtLG0pKSxfPWkuc2NhbGVUb0dlb2RldGljU3VyZmFjZShlLGZkKSxzPVVpKF8sbSxmLHMsaSx1LDEsMSksbj1hLmNsb25lKG4sQlQpLG09YS5zdWJ0cmFjdChuLHQsZ2EpLG09YS5ub3JtYWxpemUobSxtKSxyfHwobT1hLm5lZ2F0ZShtLG0pKSxfPWkuc2NhbGVUb0dlb2RldGljU3VyZmFjZShuLGZkKSxzPVVpKF8sbSxmLHMsaSx1LDEsMSk7cmV0dXJuIHN9dmFyIGFvLHd2LFR2LE92LEV2LFJ2LFN2LEN2LHh2LFB2LGdhLGZkLFZmLFcwLHVkLGxkLEl2LF9jLHZ2LFkwLEx2LER2LEZ2LExULEJ2LEZULEJULFVULFZ2LGt2LGhzLHBkPVooKCk9PntGZSgpO0Z0KCk7aHIoKTtQZSgpO2hjKCk7bGEoKTtXdCgpO0ZuKCk7Qm4oKTt5YSgpO1dvKCk7Y3MoKTtLMCgpO2FvPVtuZXcgYSxuZXcgYV0sd3Y9bmV3IGEsVHY9bmV3IGEsT3Y9bmV3IGEsRXY9bmV3IGEsUnY9bmV3IGEsU3Y9bmV3IGEsQ3Y9bmV3IGEseHY9bmV3IGEsUHY9bmV3IGEsZ2E9bmV3IGEsZmQ9bmV3IGEsVmY9e30sVzA9bmV3IGF0O3VkPW5ldyBhLGxkPW5ldyBhO0l2PW5ldyBhKC0xLDAsMCksX2M9bmV3IHN0LHZ2PW5ldyBzdCxZMD1uZXcgSixMdj1KLklERU5USVRZLmNsb25lKCksRHY9bmV3IGEsRnY9bmV3IGhlLExUPW5ldyBhO0J2PW5ldyBhO0ZUPW5ldyBlZSxCVD1uZXcgYSxVVD1uZXcgSjtWZi5yZW1vdmVEdXBsaWNhdGVzRnJvbVNoYXBlPWZ1bmN0aW9uKHQpe2xldCBlPXQubGVuZ3RoLG49W107Zm9yKGxldCBvPWUtMSxyPTA7cjxlO289cisrKXtsZXQgaT10W29dLHM9dFtyXTt0dC5lcXVhbHMoaSxzKXx8bi5wdXNoKHMpfXJldHVybiBufTtWZi5hbmdsZUlzR3JlYXRlclRoYW5QaT1mdW5jdGlvbih0LGUsbixvKXtsZXQgcj1uZXcgX28obixvKSxpPXIucHJvamVjdFBvaW50T250b1BsYW5lKGEuYWRkKG4sdCx1ZCksdWQpLHM9ci5wcm9qZWN0UG9pbnRPbnRvUGxhbmUoYS5hZGQobixlLGxkKSxsZCk7cmV0dXJuIHMueCppLnktcy55KmkueD49MH07VnY9bmV3IGEsa3Y9bmV3IGE7VmYuY29tcHV0ZVBvc2l0aW9ucz1mdW5jdGlvbih0LGUsbixvLHIpe2xldCBpPW8uX2VsbGlwc29pZCxzPU12KHQsaSksZj1vLl9ncmFudWxhcml0eSx1PW8uX2Nvcm5lclR5cGUsYz1yP1V2KGUsbik6RFQoZSxuKSxsPXI/RFQoZSxuKTp2b2lkIDAscD1uLmhlaWdodC8yLGQ9bi53aWR0aC8yLG09dC5sZW5ndGgsXz1bXSxnPXI/W106dm9pZCAwLGI9d3Ysdz1UdixPPU92LEU9RXYsVD1SdixDPVN2LE49Q3YsST14dixEPVB2LHY9dFswXSxMPXRbMV07RT1pLmdlb2RldGljU3VyZmFjZU5vcm1hbCh2LEUpLGI9YS5zdWJ0cmFjdChMLHYsYiksYj1hLm5vcm1hbGl6ZShiLGIpLEk9YS5jcm9zcyhFLGIsSSksST1hLm5vcm1hbGl6ZShJLEkpO2xldCBVPXNbMF0sQT1zWzFdO3ImJihnPVVpKHYsSSxsLGcsaSxVK3AsMSwxKSksRD1hLmNsb25lKHYsRCksdj1MLHc9YS5uZWdhdGUoYix3KTtsZXQgUyxQO2ZvcihsZXQgSD0xO0g8bS0xO0grKyl7bGV0IGs9cj8yOjE7aWYoTD10W0grMV0sdi5lcXVhbHMoTCkpe2FkKCJQb3NpdGlvbnMgYXJlIHRvbyBjbG9zZSBhbmQgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudCB3aXRoIHJvdW5kaW5nIGVycm9yLiIpO2NvbnRpbnVlfWI9YS5zdWJ0cmFjdChMLHYsYiksYj1hLm5vcm1hbGl6ZShiLGIpLE89YS5hZGQoYix3LE8pLE89YS5ub3JtYWxpemUoTyxPKSxFPWkuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKHYsRSk7bGV0IEs9YS5tdWx0aXBseUJ5U2NhbGFyKEUsYS5kb3QoYixFKSxWdik7YS5zdWJ0cmFjdChiLEssSyksYS5ub3JtYWxpemUoSyxLKTtsZXQgWD1hLm11bHRpcGx5QnlTY2FsYXIoRSxhLmRvdCh3LEUpLGt2KTtpZihhLnN1YnRyYWN0KHcsWCxYKSxhLm5vcm1hbGl6ZShYLFgpLCFNLmVxdWFsc0Vwc2lsb24oTWF0aC5hYnMoYS5kb3QoSyxYKSksMSxNLkVQU0lMT043KSl7Tz1hLmNyb3NzKE8sRSxPKSxPPWEuY3Jvc3MoRSxPLE8pLE89YS5ub3JtYWxpemUoTyxPKTtsZXQgb3Q9MS9NYXRoLm1heCguMjUsYS5tYWduaXR1ZGUoYS5jcm9zcyhPLHcsZ2EpKSksY3Q9VmYuYW5nbGVJc0dyZWF0ZXJUaGFuUGkoYix3LHYsaSk7Y3Q/KFQ9YS5hZGQodixhLm11bHRpcGx5QnlTY2FsYXIoTyxvdCpkLE8pLFQpLEM9YS5hZGQoVCxhLm11bHRpcGx5QnlTY2FsYXIoSSxkLEMpLEMpLGFvWzBdPWEuY2xvbmUoRCxhb1swXSksYW9bMV09YS5jbG9uZShDLGFvWzFdKSxTPVgwKGFvLFUrcCxBK3AsZiksUD1nbi5nZW5lcmF0ZUFyYyh7cG9zaXRpb25zOmFvLGdyYW51bGFyaXR5OmYsZWxsaXBzb2lkOml9KSxfPSQwKFAsSSxjLF8saSxTLDEpLEk9YS5jcm9zcyhFLGIsSSksST1hLm5vcm1hbGl6ZShJLEkpLE49YS5hZGQoVCxhLm11bHRpcGx5QnlTY2FsYXIoSSxkLE4pLE4pLHU9PT1mbi5ST1VOREVEfHx1PT09Zm4uQkVWRUxFRD9WVChULEMsTix1LGN0LGksXyxjLEErcCxyKTooTz1hLm5lZ2F0ZShPLE8pLF89VWkodixPLGMsXyxpLEErcCxvdCxrKSksRD1hLmNsb25lKE4sRCkpOihUPWEuYWRkKHYsYS5tdWx0aXBseUJ5U2NhbGFyKE8sb3QqZCxPKSxUKSxDPWEuYWRkKFQsYS5tdWx0aXBseUJ5U2NhbGFyKEksLWQsQyksQyksYW9bMF09YS5jbG9uZShELGFvWzBdKSxhb1sxXT1hLmNsb25lKEMsYW9bMV0pLFM9WDAoYW8sVStwLEErcCxmKSxQPWduLmdlbmVyYXRlQXJjKHtwb3NpdGlvbnM6YW8sZ3JhbnVsYXJpdHk6ZixlbGxpcHNvaWQ6aX0pLF89JDAoUCxJLGMsXyxpLFMsMSksST1hLmNyb3NzKEUsYixJKSxJPWEubm9ybWFsaXplKEksSSksTj1hLmFkZChULGEubXVsdGlwbHlCeVNjYWxhcihJLC1kLE4pLE4pLHU9PT1mbi5ST1VOREVEfHx1PT09Zm4uQkVWRUxFRD9WVChULEMsTix1LGN0LGksXyxjLEErcCxyKTpfPVVpKHYsTyxjLF8saSxBK3Asb3QsayksRD1hLmNsb25lKE4sRCkpLHc9YS5uZWdhdGUoYix3KX1lbHNlIF89VWkoRCxJLGMsXyxpLFUrcCwxLDEpLEQ9djtVPUEsQT1zW0grMV0sdj1MfWFvWzBdPWEuY2xvbmUoRCxhb1swXSksYW9bMV09YS5jbG9uZSh2LGFvWzFdKSxTPVgwKGFvLFUrcCxBK3AsZiksUD1nbi5nZW5lcmF0ZUFyYyh7cG9zaXRpb25zOmFvLGdyYW51bGFyaXR5OmYsZWxsaXBzb2lkOml9KSxfPSQwKFAsSSxjLF8saSxTLDEpLHImJihnPVVpKHYsSSxsLGcsaSxBK3AsMSwxKSksbT1fLmxlbmd0aDtsZXQgQj1yP20rZy5sZW5ndGg6bSxqPW5ldyBGbG9hdDY0QXJyYXkoQik7cmV0dXJuIGouc2V0KF8pLHImJmouc2V0KGcsbSksan07aHM9VmZ9KTtmdW5jdGlvbiBkZCh0LGUsbixvLHIpe2xldCBpPWEuYW5nbGVCZXR3ZWVuKGEuc3VidHJhY3QoZSx0LEFhKSxhLnN1YnRyYWN0KG4sdCxIVCkpLHM9bz09PWZuLkJFVkVMRUQ/MTpNYXRoLmNlaWwoaS9NLnRvUmFkaWFucyg1KSkrMSxmPXMqMyx1PW5ldyBBcnJheShmKTt1W2YtM109bi54LHVbZi0yXT1uLnksdVtmLTFdPW4uejtsZXQgYztyP2M9Si5mcm9tUXVhdGVybmlvbihlZS5mcm9tQXhpc0FuZ2xlKGEubmVnYXRlKHQsQWEpLGkvcyxHVCkselQpOmM9Si5mcm9tUXVhdGVybmlvbihlZS5mcm9tQXhpc0FuZ2xlKHQsaS9zLEdUKSx6VCk7bGV0IGw9MDtlPWEuY2xvbmUoZSxBYSk7Zm9yKGxldCBwPTA7cDxzO3ArKyllPUoubXVsdGlwbHlCeVZlY3RvcihjLGUsZSksdVtsKytdPWUueCx1W2wrK109ZS55LHVbbCsrXT1lLno7cmV0dXJuIHV9ZnVuY3Rpb24gWXYodCl7bGV0IGU9cVQsbj1LVCxvPVdULHI9dFsxXTtuPWEuZnJvbUFycmF5KHRbMV0sci5sZW5ndGgtMyxuKSxvPWEuZnJvbUFycmF5KHRbMF0sMCxvKSxlPWEubWlkcG9pbnQobixvLGUpO2xldCBpPWRkKGUsbixvLGZuLlJPVU5ERUQsITEpLHM9dC5sZW5ndGgtMSxmPXRbcy0xXTtyPXRbc10sbj1hLmZyb21BcnJheShmLGYubGVuZ3RoLTMsbiksbz1hLmZyb21BcnJheShyLDAsbyksZT1hLm1pZHBvaW50KG4sbyxlKTtsZXQgdT1kZChlLG4sbyxmbi5ST1VOREVELCExKTtyZXR1cm5baSx1XX1mdW5jdGlvbiBqVCh0LGUsbixvKXtsZXQgcj1BYTtyZXR1cm4gbz9yPWEuYWRkKHQsZSxyKTooZT1hLm5lZ2F0ZShlLGUpLHI9YS5hZGQodCxlLHIpKSxbci54LHIueSxyLnosbi54LG4ueSxuLnpdfWZ1bmN0aW9uIFowKHQsZSxuLG8pe2xldCByPW5ldyBBcnJheSh0Lmxlbmd0aCksaT1uZXcgQXJyYXkodC5sZW5ndGgpLHM9YS5tdWx0aXBseUJ5U2NhbGFyKGUsbixBYSksZj1hLm5lZ2F0ZShzLEhUKSx1PTAsYz10Lmxlbmd0aC0xO2ZvcihsZXQgbD0wO2w8dC5sZW5ndGg7bCs9Myl7bGV0IHA9YS5mcm9tQXJyYXkodCxsLEd2KSxkPWEuYWRkKHAsZixrVCk7clt1KytdPWQueCxyW3UrK109ZC55LHJbdSsrXT1kLno7bGV0IG09YS5hZGQocCxzLGtUKTtpW2MtLV09bS56LGlbYy0tXT1tLnksaVtjLS1dPW0ueH1yZXR1cm4gby5wdXNoKHIsaSksb312YXIgUTAsQWEsSFQsR3Ysa1QsQm8scVQsS1QsV1QsenYsanYsSHYscXYsS3YsV3YsWHYsR1QselQsJHYsWnYscWUsSjA9WigoKT0+e0Z0KCk7aGMoKTtmdCgpO1d0KCk7Rm4oKTt5YSgpO3BkKCk7V28oKTtRMD17fSxBYT1uZXcgYSxIVD1uZXcgYSxHdj1uZXcgYSxrVD1uZXcgYSxCbz1bbmV3IGEsbmV3IGFdLHFUPW5ldyBhLEtUPW5ldyBhLFdUPW5ldyBhLHp2PW5ldyBhLGp2PW5ldyBhLEh2PW5ldyBhLHF2PW5ldyBhLEt2PW5ldyBhLFd2PW5ldyBhLFh2PW5ldyBhLEdUPW5ldyBlZSx6VD1uZXcgSjtRMC5hZGRBdHRyaWJ1dGU9ZnVuY3Rpb24odCxlLG4sbyl7bGV0IHI9ZS54LGk9ZS55LHM9ZS56O2gobikmJih0W25dPXIsdFtuKzFdPWksdFtuKzJdPXMpLGgobykmJih0W29dPXMsdFtvLTFdPWksdFtvLTJdPXIpfTskdj1uZXcgYSxadj1uZXcgYTtRMC5jb21wdXRlUG9zaXRpb25zPWZ1bmN0aW9uKHQpe2xldCBlPXQuZ3JhbnVsYXJpdHksbj10LnBvc2l0aW9ucyxvPXQuZWxsaXBzb2lkLHI9dC53aWR0aC8yLGk9dC5jb3JuZXJUeXBlLHM9dC5zYXZlQXR0cmlidXRlcyxmPXFULHU9S1QsYz1XVCxsPXp2LHA9anYsZD1IdixtPXF2LF89S3YsZz1XdixiPVh2LHc9W10sTz1zP1tdOnZvaWQgMCxFPXM/W106dm9pZCAwLFQ9blswXSxDPW5bMV07dT1hLm5vcm1hbGl6ZShhLnN1YnRyYWN0KEMsVCx1KSx1KSxmPW8uZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKFQsZiksbD1hLm5vcm1hbGl6ZShhLmNyb3NzKGYsdSxsKSxsKSxzJiYoTy5wdXNoKGwueCxsLnksbC56KSxFLnB1c2goZi54LGYueSxmLnopKSxtPWEuY2xvbmUoVCxtKSxUPUMsYz1hLm5lZ2F0ZSh1LGMpO2xldCBOLEk9W10sRCx2PW4ubGVuZ3RoO2ZvcihEPTE7RDx2LTE7RCsrKXtmPW8uZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKFQsZiksQz1uW0QrMV0sdT1hLm5vcm1hbGl6ZShhLnN1YnRyYWN0KEMsVCx1KSx1KSxwPWEubm9ybWFsaXplKGEuYWRkKHUsYyxwKSxwKTtsZXQgVT1hLm11bHRpcGx5QnlTY2FsYXIoZixhLmRvdCh1LGYpLCR2KTthLnN1YnRyYWN0KHUsVSxVKSxhLm5vcm1hbGl6ZShVLFUpO2xldCBBPWEubXVsdGlwbHlCeVNjYWxhcihmLGEuZG90KGMsZiksWnYpO2lmKGEuc3VidHJhY3QoYyxBLEEpLGEubm9ybWFsaXplKEEsQSksIU0uZXF1YWxzRXBzaWxvbihNYXRoLmFicyhhLmRvdChVLEEpKSwxLE0uRVBTSUxPTjcpKXtwPWEuY3Jvc3MocCxmLHApLHA9YS5jcm9zcyhmLHAscCkscD1hLm5vcm1hbGl6ZShwLHApO2xldCBQPXIvTWF0aC5tYXgoLjI1LGEubWFnbml0dWRlKGEuY3Jvc3MocCxjLEFhKSkpLEI9aHMuYW5nbGVJc0dyZWF0ZXJUaGFuUGkodSxjLFQsbyk7cD1hLm11bHRpcGx5QnlTY2FsYXIocCxQLHApLEI/KF89YS5hZGQoVCxwLF8pLGI9YS5hZGQoXyxhLm11bHRpcGx5QnlTY2FsYXIobCxyLGIpLGIpLGc9YS5hZGQoXyxhLm11bHRpcGx5QnlTY2FsYXIobCxyKjIsZyksZyksQm9bMF09YS5jbG9uZShtLEJvWzBdKSxCb1sxXT1hLmNsb25lKGIsQm9bMV0pLE49Z24uZ2VuZXJhdGVBcmMoe3Bvc2l0aW9uczpCbyxncmFudWxhcml0eTplLGVsbGlwc29pZDpvfSksdz1aMChOLGwscix3KSxzJiYoTy5wdXNoKGwueCxsLnksbC56KSxFLnB1c2goZi54LGYueSxmLnopKSxkPWEuY2xvbmUoZyxkKSxsPWEubm9ybWFsaXplKGEuY3Jvc3MoZix1LGwpLGwpLGc9YS5hZGQoXyxhLm11bHRpcGx5QnlTY2FsYXIobCxyKjIsZyksZyksbT1hLmFkZChfLGEubXVsdGlwbHlCeVNjYWxhcihsLHIsbSksbSksaT09PWZuLlJPVU5ERUR8fGk9PT1mbi5CRVZFTEVEP0kucHVzaCh7bGVmdFBvc2l0aW9uczpkZChfLGQsZyxpLEIpfSk6SS5wdXNoKHtsZWZ0UG9zaXRpb25zOmpUKFQsYS5uZWdhdGUocCxwKSxnLEIpfSkpOihnPWEuYWRkKFQscCxnKSxiPWEuYWRkKGcsYS5uZWdhdGUoYS5tdWx0aXBseUJ5U2NhbGFyKGwscixiKSxiKSxiKSxfPWEuYWRkKGcsYS5uZWdhdGUoYS5tdWx0aXBseUJ5U2NhbGFyKGwscioyLF8pLF8pLF8pLEJvWzBdPWEuY2xvbmUobSxCb1swXSksQm9bMV09YS5jbG9uZShiLEJvWzFdKSxOPWduLmdlbmVyYXRlQXJjKHtwb3NpdGlvbnM6Qm8sZ3JhbnVsYXJpdHk6ZSxlbGxpcHNvaWQ6b30pLHc9WjAoTixsLHIsdykscyYmKE8ucHVzaChsLngsbC55LGwueiksRS5wdXNoKGYueCxmLnksZi56KSksZD1hLmNsb25lKF8sZCksbD1hLm5vcm1hbGl6ZShhLmNyb3NzKGYsdSxsKSxsKSxfPWEuYWRkKGcsYS5uZWdhdGUoYS5tdWx0aXBseUJ5U2NhbGFyKGwscioyLF8pLF8pLF8pLG09YS5hZGQoZyxhLm5lZ2F0ZShhLm11bHRpcGx5QnlTY2FsYXIobCxyLG0pLG0pLG0pLGk9PT1mbi5ST1VOREVEfHxpPT09Zm4uQkVWRUxFRD9JLnB1c2goe3JpZ2h0UG9zaXRpb25zOmRkKGcsZCxfLGksQil9KTpJLnB1c2goe3JpZ2h0UG9zaXRpb25zOmpUKFQscCxfLEIpfSkpLGM9YS5uZWdhdGUodSxjKX1UPUN9Zj1vLmdlb2RldGljU3VyZmFjZU5vcm1hbChULGYpLEJvWzBdPWEuY2xvbmUobSxCb1swXSksQm9bMV09YS5jbG9uZShULEJvWzFdKSxOPWduLmdlbmVyYXRlQXJjKHtwb3NpdGlvbnM6Qm8sZ3JhbnVsYXJpdHk6ZSxlbGxpcHNvaWQ6b30pLHc9WjAoTixsLHIsdykscyYmKE8ucHVzaChsLngsbC55LGwueiksRS5wdXNoKGYueCxmLnksZi56KSk7bGV0IEw7cmV0dXJuIGk9PT1mbi5ST1VOREVEJiYoTD1Zdih3KSkse3Bvc2l0aW9uczp3LGNvcm5lcnM6SSxsZWZ0czpPLG5vcm1hbHM6RSxlbmRQb3NpdGlvbnM6TH19O3FlPVEwfSk7ZnVuY3Rpb24gSlQodCxlKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl0W25dPWUuc2NhbGVUb0dlb2RldGljU3VyZmFjZSh0W25dLHRbbl0pO3JldHVybiB0fWZ1bmN0aW9uIEtyKHQsZSxuLG8scixpKXtsZXQgcz10Lm5vcm1hbHMsZj10LnRhbmdlbnRzLHU9dC5iaXRhbmdlbnRzLGM9YS5ub3JtYWxpemUoYS5jcm9zcyhuLGUsX3MpLF9zKTtpLm5vcm1hbCYmcWUuYWRkQXR0cmlidXRlKHMsZSxvLHIpLGkudGFuZ2VudCYmcWUuYWRkQXR0cmlidXRlKGYsYyxvLHIpLGkuYml0YW5nZW50JiZxZS5hZGRBdHRyaWJ1dGUodSxuLG8scil9ZnVuY3Rpb24gdE8odCxlLG4pe2xldCBvPXQucG9zaXRpb25zLHI9dC5jb3JuZXJzLGk9dC5lbmRQb3NpdGlvbnMscz10LmxlZnRzLGY9dC5ub3JtYWxzLHU9bmV3IGllLGMsbD0wLHA9MCxkLG09MCxfO2ZvcihkPTA7ZDxvLmxlbmd0aDtkKz0yKV89b1tkXS5sZW5ndGgtMyxsKz1fLG0rPV8qMixwKz1vW2QrMV0ubGVuZ3RoLTM7Zm9yKGwrPTMscCs9MyxkPTA7ZDxyLmxlbmd0aDtkKyspe2M9cltkXTtsZXQgcnQ9cltkXS5sZWZ0UG9zaXRpb25zO2gocnQpPyhfPXJ0Lmxlbmd0aCxsKz1fLG0rPV8pOihfPXJbZF0ucmlnaHRQb3NpdGlvbnMubGVuZ3RoLHArPV8sbSs9Xyl9bGV0IGc9aChpKSxiO2cmJihiPWlbMF0ubGVuZ3RoLTMsbCs9YixwKz1iLGIvPTMsbSs9Yio2KTtsZXQgdz1sK3AsTz1uZXcgRmxvYXQ2NEFycmF5KHcpLEU9ZS5ub3JtYWw/bmV3IEZsb2F0MzJBcnJheSh3KTp2b2lkIDAsVD1lLnRhbmdlbnQ/bmV3IEZsb2F0MzJBcnJheSh3KTp2b2lkIDAsQz1lLmJpdGFuZ2VudD9uZXcgRmxvYXQzMkFycmF5KHcpOnZvaWQgMCxOPXtub3JtYWxzOkUsdGFuZ2VudHM6VCxiaXRhbmdlbnRzOkN9LEk9MCxEPXctMSx2LEwsVSxBLFM9JFQsUD1aVCxCLGosSD1iLzIsaz1EdC5jcmVhdGVUeXBlZEFycmF5KHcvMyxtKSxLPTA7aWYoZyl7aj1tZCxCPWhkO2xldCBydD1pWzBdO2ZvcihTPWEuZnJvbUFycmF5KGYsMCxTKSxQPWEuZnJvbUFycmF5KHMsMCxQKSxkPTA7ZDxIO2QrKylqPWEuZnJvbUFycmF5KHJ0LChILTEtZCkqMyxqKSxCPWEuZnJvbUFycmF5KHJ0LChIK2QpKjMsQikscWUuYWRkQXR0cmlidXRlKE8sQixJKSxxZS5hZGRBdHRyaWJ1dGUoTyxqLHZvaWQgMCxEKSxLcihOLFMsUCxJLEQsZSksTD1JLzMsQT1MKzEsdj0oRC0yKS8zLFU9di0xLGtbSysrXT12LGtbSysrXT1MLGtbSysrXT1VLGtbSysrXT1VLGtbSysrXT1MLGtbSysrXT1BLEkrPTMsRC09M31sZXQgWD0wLFI9MCxvdD1vW1grK10sY3Q9b1tYKytdO08uc2V0KG90LEkpLE8uc2V0KGN0LEQtY3QubGVuZ3RoKzEpLFA9YS5mcm9tQXJyYXkocyxSLFApO2xldCBwdCx5dDtmb3IoXz1jdC5sZW5ndGgtMyxkPTA7ZDxfO2QrPTMpcHQ9bi5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoYS5mcm9tQXJyYXkob3QsZCxfcyksX3MpLHl0PW4uZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGEuZnJvbUFycmF5KGN0LF8tZCxiYSksYmEpLFM9YS5ub3JtYWxpemUoYS5hZGQocHQseXQsUyksUyksS3IoTixTLFAsSSxELGUpLEw9SS8zLEE9TCsxLHY9KEQtMikvMyxVPXYtMSxrW0srK109dixrW0srK109TCxrW0srK109VSxrW0srK109VSxrW0srK109TCxrW0srK109QSxJKz0zLEQtPTM7Zm9yKHB0PW4uZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGEuZnJvbUFycmF5KG90LF8sX3MpLF9zKSx5dD1uLmdlb2RldGljU3VyZmFjZU5vcm1hbChhLmZyb21BcnJheShjdCxfLGJhKSxiYSksUz1hLm5vcm1hbGl6ZShhLmFkZChwdCx5dCxTKSxTKSxSKz0zLGQ9MDtkPHIubGVuZ3RoO2QrKyl7bGV0IHJ0O2M9cltkXTtsZXQgUHQ9Yy5sZWZ0UG9zaXRpb25zLGd0PWMucmlnaHRQb3NpdGlvbnMsQ3QsbXQsdXQ9UVQsdnQ9bWQsenQ9aGQ7aWYoUz1hLmZyb21BcnJheShmLFIsUyksaChQdCkpe2ZvcihLcihOLFMsUCx2b2lkIDAsRCxlKSxELT0zLEN0PUEsbXQ9VSxydD0wO3J0PFB0Lmxlbmd0aC8zO3J0KyspdXQ9YS5mcm9tQXJyYXkoUHQscnQqMyx1dCksa1tLKytdPUN0LGtbSysrXT1tdC1ydC0xLGtbSysrXT1tdC1ydCxxZS5hZGRBdHRyaWJ1dGUoTyx1dCx2b2lkIDAsRCksdnQ9YS5mcm9tQXJyYXkoTywobXQtcnQtMSkqMyx2dCksenQ9YS5mcm9tQXJyYXkoTyxDdCozLHp0KSxQPWEubm9ybWFsaXplKGEuc3VidHJhY3QodnQsenQsUCksUCksS3IoTixTLFAsdm9pZCAwLEQsZSksRC09Mzt1dD1hLmZyb21BcnJheShPLEN0KjMsdXQpLHZ0PWEuc3VidHJhY3QoYS5mcm9tQXJyYXkoTyxtdCozLHZ0KSx1dCx2dCksenQ9YS5zdWJ0cmFjdChhLmZyb21BcnJheShPLChtdC1ydCkqMyx6dCksdXQsenQpLFA9YS5ub3JtYWxpemUoYS5hZGQodnQsenQsUCksUCksS3IoTixTLFAsSSx2b2lkIDAsZSksSSs9M31lbHNle2ZvcihLcihOLFMsUCxJLHZvaWQgMCxlKSxJKz0zLEN0PVUsbXQ9QSxydD0wO3J0PGd0Lmxlbmd0aC8zO3J0KyspdXQ9YS5mcm9tQXJyYXkoZ3QscnQqMyx1dCksa1tLKytdPUN0LGtbSysrXT1tdCtydCxrW0srK109bXQrcnQrMSxxZS5hZGRBdHRyaWJ1dGUoTyx1dCxJKSx2dD1hLmZyb21BcnJheShPLEN0KjMsdnQpLHp0PWEuZnJvbUFycmF5KE8sKG10K3J0KSozLHp0KSxQPWEubm9ybWFsaXplKGEuc3VidHJhY3QodnQsenQsUCksUCksS3IoTixTLFAsSSx2b2lkIDAsZSksSSs9Mzt1dD1hLmZyb21BcnJheShPLEN0KjMsdXQpLHZ0PWEuc3VidHJhY3QoYS5mcm9tQXJyYXkoTywobXQrcnQpKjMsdnQpLHV0LHZ0KSx6dD1hLnN1YnRyYWN0KGEuZnJvbUFycmF5KE8sbXQqMyx6dCksdXQsenQpLFA9YS5ub3JtYWxpemUoYS5uZWdhdGUoYS5hZGQoenQsdnQsUCksUCksUCksS3IoTixTLFAsdm9pZCAwLEQsZSksRC09M31mb3Iob3Q9b1tYKytdLGN0PW9bWCsrXSxvdC5zcGxpY2UoMCwzKSxjdC5zcGxpY2UoY3QubGVuZ3RoLTMsMyksTy5zZXQob3QsSSksTy5zZXQoY3QsRC1jdC5sZW5ndGgrMSksXz1jdC5sZW5ndGgtMyxSKz0zLFA9YS5mcm9tQXJyYXkocyxSLFApLHJ0PTA7cnQ8Y3QubGVuZ3RoO3J0Kz0zKXB0PW4uZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGEuZnJvbUFycmF5KG90LHJ0LF9zKSxfcykseXQ9bi5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoYS5mcm9tQXJyYXkoY3QsXy1ydCxiYSksYmEpLFM9YS5ub3JtYWxpemUoYS5hZGQocHQseXQsUyksUyksS3IoTixTLFAsSSxELGUpLEE9SS8zLEw9QS0xLFU9KEQtMikvMyx2PVUrMSxrW0srK109dixrW0srK109TCxrW0srK109VSxrW0srK109VSxrW0srK109TCxrW0srK109QSxJKz0zLEQtPTM7SS09MyxEKz0zfWlmKFM9YS5mcm9tQXJyYXkoZixmLmxlbmd0aC0zLFMpLEtyKE4sUyxQLEksRCxlKSxnKXtJKz0zLEQtPTMsaj1tZCxCPWhkO2xldCBydD1pWzFdO2ZvcihkPTA7ZDxIO2QrKylqPWEuZnJvbUFycmF5KHJ0LChiLWQtMSkqMyxqKSxCPWEuZnJvbUFycmF5KHJ0LGQqMyxCKSxxZS5hZGRBdHRyaWJ1dGUoTyxqLHZvaWQgMCxEKSxxZS5hZGRBdHRyaWJ1dGUoTyxCLEkpLEtyKE4sUyxQLEksRCxlKSxBPUkvMyxMPUEtMSxVPShELTIpLzMsdj1VKzEsa1tLKytdPXYsa1tLKytdPUwsa1tLKytdPVUsa1tLKytdPVUsa1tLKytdPUwsa1tLKytdPUEsSSs9MyxELT0zfWlmKHUucG9zaXRpb249bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpPfSksZS5zdCl7bGV0IHJ0PW5ldyBGbG9hdDMyQXJyYXkody8zKjIpLFB0LGd0LEN0PTA7aWYoZyl7bC89MyxwLz0zO2xldCBtdD1NYXRoLlBJLyhiKzEpO2d0PTEvKGwtYisxKSxQdD0xLyhwLWIrMSk7bGV0IHV0LHZ0PWIvMjtmb3IoZD12dCsxO2Q8YisxO2QrKyl1dD1NLlBJX09WRVJfVFdPK210KmQscnRbQ3QrK109UHQqKDErTWF0aC5jb3ModXQpKSxydFtDdCsrXT0uNSooMStNYXRoLnNpbih1dCkpO2ZvcihkPTE7ZDxwLWIrMTtkKyspcnRbQ3QrK109ZCpQdCxydFtDdCsrXT0wO2ZvcihkPWI7ZD52dDtkLS0pdXQ9TS5QSV9PVkVSX1RXTy1kKm10LHJ0W0N0KytdPTEtUHQqKDErTWF0aC5jb3ModXQpKSxydFtDdCsrXT0uNSooMStNYXRoLnNpbih1dCkpO2ZvcihkPXZ0O2Q+MDtkLS0pdXQ9TS5QSV9PVkVSX1RXTy1tdCpkLHJ0W0N0KytdPTEtZ3QqKDErTWF0aC5jb3ModXQpKSxydFtDdCsrXT0uNSooMStNYXRoLnNpbih1dCkpO2ZvcihkPWwtYjtkPjA7ZC0tKXJ0W0N0KytdPWQqZ3QscnRbQ3QrK109MTtmb3IoZD0xO2Q8dnQrMTtkKyspdXQ9TS5QSV9PVkVSX1RXTyttdCpkLHJ0W0N0KytdPWd0KigxK01hdGguY29zKHV0KSkscnRbQ3QrK109LjUqKDErTWF0aC5zaW4odXQpKX1lbHNle2ZvcihsLz0zLHAvPTMsZ3Q9MS8obC0xKSxQdD0xLyhwLTEpLGQ9MDtkPHA7ZCsrKXJ0W0N0KytdPWQqUHQscnRbQ3QrK109MDtmb3IoZD1sO2Q+MDtkLS0pcnRbQ3QrK109KGQtMSkqZ3QscnRbQ3QrK109MX11LnN0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZToyLHZhbHVlczpydH0pfXJldHVybiBlLm5vcm1hbCYmKHUubm9ybWFsPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpOLm5vcm1hbHN9KSksZS50YW5nZW50JiYodS50YW5nZW50PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpOLnRhbmdlbnRzfSkpLGUuYml0YW5nZW50JiYodS5iaXRhbmdlbnQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOk4uYml0YW5nZW50c30pKSx7YXR0cmlidXRlczp1LGluZGljZXM6a319ZnVuY3Rpb24gSnYodCxlKXtpZighZS5ub3JtYWwmJiFlLnRhbmdlbnQmJiFlLmJpdGFuZ2VudCYmIWUuc3QpcmV0dXJuIHQ7bGV0IG49dC5wb3NpdGlvbi52YWx1ZXMsbyxyOyhlLm5vcm1hbHx8ZS5iaXRhbmdlbnQpJiYobz10Lm5vcm1hbC52YWx1ZXMscj10LmJpdGFuZ2VudC52YWx1ZXMpO2xldCBpPXQucG9zaXRpb24udmFsdWVzLmxlbmd0aC8xOCxzPWkqMyxmPWkqMix1PXMqMixjO2lmKGUubm9ybWFsfHxlLmJpdGFuZ2VudHx8ZS50YW5nZW50KXtsZXQgbD1lLm5vcm1hbD9uZXcgRmxvYXQzMkFycmF5KHMqNik6dm9pZCAwLHA9ZS50YW5nZW50P25ldyBGbG9hdDMyQXJyYXkocyo2KTp2b2lkIDAsZD1lLmJpdGFuZ2VudD9uZXcgRmxvYXQzMkFycmF5KHMqNik6dm9pZCAwLG09JFQsXz1aVCxnPW1kLGI9aGQsdz1RdixPPVFULEU9dTtmb3IoYz0wO2M8cztjKz0zKXtsZXQgVD1FK3U7bT1hLmZyb21BcnJheShuLGMsbSksXz1hLmZyb21BcnJheShuLGMrcyxfKSxnPWEuZnJvbUFycmF5KG4sKGMrMyklcyxnKSxfPWEuc3VidHJhY3QoXyxtLF8pLGc9YS5zdWJ0cmFjdChnLG0sZyksYj1hLm5vcm1hbGl6ZShhLmNyb3NzKF8sZyxiKSxiKSxlLm5vcm1hbCYmKHFlLmFkZEF0dHJpYnV0ZShsLGIsVCkscWUuYWRkQXR0cmlidXRlKGwsYixUKzMpLHFlLmFkZEF0dHJpYnV0ZShsLGIsRSkscWUuYWRkQXR0cmlidXRlKGwsYixFKzMpKSwoZS50YW5nZW50fHxlLmJpdGFuZ2VudCkmJihPPWEuZnJvbUFycmF5KG8sYyxPKSxlLmJpdGFuZ2VudCYmKHFlLmFkZEF0dHJpYnV0ZShkLE8sVCkscWUuYWRkQXR0cmlidXRlKGQsTyxUKzMpLHFlLmFkZEF0dHJpYnV0ZShkLE8sRSkscWUuYWRkQXR0cmlidXRlKGQsTyxFKzMpKSxlLnRhbmdlbnQmJih3PWEubm9ybWFsaXplKGEuY3Jvc3MoTyxiLHcpLHcpLHFlLmFkZEF0dHJpYnV0ZShwLHcsVCkscWUuYWRkQXR0cmlidXRlKHAsdyxUKzMpLHFlLmFkZEF0dHJpYnV0ZShwLHcsRSkscWUuYWRkQXR0cmlidXRlKHAsdyxFKzMpKSksRSs9Nn1pZihlLm5vcm1hbCl7Zm9yKGwuc2V0KG8pLGM9MDtjPHM7Yys9MylsW2Mrc109LW9bY10sbFtjK3MrMV09LW9bYysxXSxsW2MrcysyXT0tb1tjKzJdO3Qubm9ybWFsLnZhbHVlcz1sfWVsc2UgdC5ub3JtYWw9dm9pZCAwO2lmKGUuYml0YW5nZW50PyhkLnNldChyKSxkLnNldChyLHMpLHQuYml0YW5nZW50LnZhbHVlcz1kKTp0LmJpdGFuZ2VudD12b2lkIDAsZS50YW5nZW50KXtsZXQgVD10LnRhbmdlbnQudmFsdWVzO3Auc2V0KFQpLHAuc2V0KFQscyksdC50YW5nZW50LnZhbHVlcz1wfX1pZihlLnN0KXtsZXQgbD10LnN0LnZhbHVlcyxwPW5ldyBGbG9hdDMyQXJyYXkoZio2KTtwLnNldChsKSxwLnNldChsLGYpO2xldCBkPWYqMjtmb3IobGV0IG09MDttPDI7bSsrKXtmb3IocFtkKytdPWxbMF0scFtkKytdPWxbMV0sYz0yO2M8ZjtjKz0yKXtsZXQgXz1sW2NdLGc9bFtjKzFdO3BbZCsrXT1fLHBbZCsrXT1nLHBbZCsrXT1fLHBbZCsrXT1nfXBbZCsrXT1sWzBdLHBbZCsrXT1sWzFdfXQuc3QudmFsdWVzPXB9cmV0dXJuIHR9ZnVuY3Rpb24gdF8odCxlLG4pe25bZSsrXT10WzBdLG5bZSsrXT10WzFdLG5bZSsrXT10WzJdO2ZvcihsZXQgbz0zO288dC5sZW5ndGg7bys9Myl7bGV0IHI9dFtvXSxpPXRbbysxXSxzPXRbbysyXTtuW2UrK109cixuW2UrK109aSxuW2UrK109cyxuW2UrK109cixuW2UrK109aSxuW2UrK109c31yZXR1cm4gbltlKytdPXRbMF0sbltlKytdPXRbMV0sbltlKytdPXRbMl0sbn1mdW5jdGlvbiB0TCh0LGUpe2xldCBuPW5ldyBkdCh7cG9zaXRpb246ZS5wb3NpdGlvbixub3JtYWw6ZS5ub3JtYWx8fGUuYml0YW5nZW50fHx0LnNoYWRvd1ZvbHVtZSx0YW5nZW50OmUudGFuZ2VudCxiaXRhbmdlbnQ6ZS5ub3JtYWx8fGUuYml0YW5nZW50LHN0OmUuc3R9KSxvPXQuZWxsaXBzb2lkLHI9cWUuY29tcHV0ZVBvc2l0aW9ucyh0KSxpPXRPKHIsbixvKSxzPXQuaGVpZ2h0LGY9dC5leHRydWRlZEhlaWdodCx1PWkuYXR0cmlidXRlcyxjPWkuaW5kaWNlcyxsPXUucG9zaXRpb24udmFsdWVzLHA9bC5sZW5ndGgsZD1uZXcgRmxvYXQ2NEFycmF5KHAqNiksbT1uZXcgRmxvYXQ2NEFycmF5KHApO20uc2V0KGwpO2xldCBfPW5ldyBGbG9hdDY0QXJyYXkocCo0KTtsPVNlLnNjYWxlVG9HZW9kZXRpY0hlaWdodChsLHMsbyksXz10XyhsLDAsXyksbT1TZS5zY2FsZVRvR2VvZGV0aWNIZWlnaHQobSxmLG8pLF89dF8obSxwKjIsXyksZC5zZXQobCksZC5zZXQobSxwKSxkLnNldChfLHAqMiksdS5wb3NpdGlvbi52YWx1ZXM9ZCx1PUp2KHUsZSk7bGV0IGcsYj1wLzM7aWYodC5zaGFkb3dWb2x1bWUpe2xldCB2PXUubm9ybWFsLnZhbHVlcztwPXYubGVuZ3RoO2xldCBMPW5ldyBGbG9hdDMyQXJyYXkocCo2KTtmb3IoZz0wO2c8cDtnKyspdltnXT0tdltnXTtMLnNldCh2LHApLEw9dF8odixwKjQsTCksdS5leHRydWRlRGlyZWN0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpMfSksZS5ub3JtYWx8fCh1Lm5vcm1hbD12b2lkIDApfWlmKGgodC5vZmZzZXRBdHRyaWJ1dGUpKXtsZXQgdj1uZXcgVWludDhBcnJheShiKjYpO2lmKHQub2Zmc2V0QXR0cmlidXRlPT09ZmUuVE9QKXY9di5maWxsKDEsMCxiKS5maWxsKDEsYioyLGIqNCk7ZWxzZXtsZXQgTD10Lm9mZnNldEF0dHJpYnV0ZT09PWZlLk5PTkU/MDoxO3Y9di5maWxsKEwpfXUuYXBwbHlPZmZzZXQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5VTlNJR05FRF9CWVRFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6MSx2YWx1ZXM6dn0pfWxldCB3PWMubGVuZ3RoLE89YitiLEU9RHQuY3JlYXRlVHlwZWRBcnJheShkLmxlbmd0aC8zLHcqMitPKjMpO0Uuc2V0KGMpO2xldCBUPXc7Zm9yKGc9MDtnPHc7Zys9Myl7bGV0IHY9Y1tnXSxMPWNbZysxXSxVPWNbZysyXTtFW1QrK109VStiLEVbVCsrXT1MK2IsRVtUKytdPXYrYn1sZXQgQyxOLEksRDtmb3IoZz0wO2c8TztnKz0yKUM9ZytPLE49QytPLEk9QysxLEQ9TisxLEVbVCsrXT1DLEVbVCsrXT1OLEVbVCsrXT1JLEVbVCsrXT1JLEVbVCsrXT1OLEVbVCsrXT1EO3JldHVybnthdHRyaWJ1dGVzOnUsaW5kaWNlczpFfX1mdW5jdGlvbiBZVCh0LGUsbixvLHIsaSl7bGV0IHM9YS5zdWJ0cmFjdChlLHQsWFQpO2Eubm9ybWFsaXplKHMscyk7bGV0IGY9bi5nZW9kZXRpY1N1cmZhY2VOb3JtYWwodCxrZiksdT1hLmNyb3NzKHMsZixYVCk7YS5tdWx0aXBseUJ5U2NhbGFyKHUsbyx1KTtsZXQgYz1yLmxhdGl0dWRlLGw9ci5sb25naXR1ZGUscD1pLmxhdGl0dWRlLGQ9aS5sb25naXR1ZGU7YS5hZGQodCx1LGtmKSxuLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKGtmLFRyKTtsZXQgbT1Uci5sYXRpdHVkZSxfPVRyLmxvbmdpdHVkZTtjPU1hdGgubWluKGMsbSksbD1NYXRoLm1pbihsLF8pLHA9TWF0aC5tYXgocCxtKSxkPU1hdGgubWF4KGQsXyksYS5zdWJ0cmFjdCh0LHUsa2YpLG4uY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoa2YsVHIpLG09VHIubGF0aXR1ZGUsXz1Uci5sb25naXR1ZGUsYz1NYXRoLm1pbihjLG0pLGw9TWF0aC5taW4obCxfKSxwPU1hdGgubWF4KHAsbSksZD1NYXRoLm1heChkLF8pLHIubGF0aXR1ZGU9YyxyLmxvbmdpdHVkZT1sLGkubGF0aXR1ZGU9cCxpLmxvbmdpdHVkZT1kfWZ1bmN0aW9uIGVPKHQsZSxuLG8scil7dD1KVCh0LGUpO2xldCBpPUNuKHQsYS5lcXVhbHNFcHNpbG9uKSxzPWkubGVuZ3RoO2lmKHM8Mnx8bjw9MClyZXR1cm4gbmV3IE50O2xldCBmPW4qLjU7Sm8ubGF0aXR1ZGU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLEpvLmxvbmdpdHVkZT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksdHIubGF0aXR1ZGU9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLHRyLmxvbmdpdHVkZT1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7bGV0IHUsYztpZihvPT09Zm4uUk9VTkRFRCl7bGV0IGQ9aVswXTthLnN1YnRyYWN0KGQsaVsxXSx3ciksYS5ub3JtYWxpemUod3Isd3IpLGEubXVsdGlwbHlCeVNjYWxhcih3cixmLHdyKSxhLmFkZChkLHdyLEdmKSxlLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKEdmLFRyKSx1PVRyLmxhdGl0dWRlLGM9VHIubG9uZ2l0dWRlLEpvLmxhdGl0dWRlPU1hdGgubWluKEpvLmxhdGl0dWRlLHUpLEpvLmxvbmdpdHVkZT1NYXRoLm1pbihKby5sb25naXR1ZGUsYyksdHIubGF0aXR1ZGU9TWF0aC5tYXgodHIubGF0aXR1ZGUsdSksdHIubG9uZ2l0dWRlPU1hdGgubWF4KHRyLmxvbmdpdHVkZSxjKX1mb3IobGV0IGQ9MDtkPHMtMTsrK2QpWVQoaVtkXSxpW2QrMV0sZSxmLEpvLHRyKTtsZXQgbD1pW3MtMV07YS5zdWJ0cmFjdChsLGlbcy0yXSx3ciksYS5ub3JtYWxpemUod3Isd3IpLGEubXVsdGlwbHlCeVNjYWxhcih3cixmLHdyKSxhLmFkZChsLHdyLEdmKSxZVChsLEdmLGUsZixKbyx0ciksbz09PWZuLlJPVU5ERUQmJihlLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKEdmLFRyKSx1PVRyLmxhdGl0dWRlLGM9VHIubG9uZ2l0dWRlLEpvLmxhdGl0dWRlPU1hdGgubWluKEpvLmxhdGl0dWRlLHUpLEpvLmxvbmdpdHVkZT1NYXRoLm1pbihKby5sb25naXR1ZGUsYyksdHIubGF0aXR1ZGU9TWF0aC5tYXgodHIubGF0aXR1ZGUsdSksdHIubG9uZ2l0dWRlPU1hdGgubWF4KHRyLmxvbmdpdHVkZSxjKSk7bGV0IHA9aChyKT9yOm5ldyBOdDtyZXR1cm4gcC5ub3J0aD10ci5sYXRpdHVkZSxwLnNvdXRoPUpvLmxhdGl0dWRlLHAuZWFzdD10ci5sb25naXR1ZGUscC53ZXN0PUpvLmxvbmdpdHVkZSxwfWZ1bmN0aW9uIGtpKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKTtsZXQgZT10LnBvc2l0aW9ucyxuPXQud2lkdGg7eS5kZWZpbmVkKCJvcHRpb25zLnBvc2l0aW9ucyIsZSkseS5kZWZpbmVkKCJvcHRpb25zLndpZHRoIixuKTtsZXQgbz14KHQuaGVpZ2h0LDApLHI9eCh0LmV4dHJ1ZGVkSGVpZ2h0LG8pO3RoaXMuX3Bvc2l0aW9ucz1lLHRoaXMuX2VsbGlwc29pZD0kLmNsb25lKHgodC5lbGxpcHNvaWQsJC5XR1M4NCkpLHRoaXMuX3ZlcnRleEZvcm1hdD1kdC5jbG9uZSh4KHQudmVydGV4Rm9ybWF0LGR0LkRFRkFVTFQpKSx0aGlzLl93aWR0aD1uLHRoaXMuX2hlaWdodD1NYXRoLm1heChvLHIpLHRoaXMuX2V4dHJ1ZGVkSGVpZ2h0PU1hdGgubWluKG8sciksdGhpcy5fY29ybmVyVHlwZT14KHQuY29ybmVyVHlwZSxmbi5ST1VOREVEKSx0aGlzLl9ncmFudWxhcml0eT14KHQuZ3JhbnVsYXJpdHksTS5SQURJQU5TX1BFUl9ERUdSRUUpLHRoaXMuX3NoYWRvd1ZvbHVtZT14KHQuc2hhZG93Vm9sdW1lLCExKSx0aGlzLl93b3JrZXJOYW1lPSJjcmVhdGVDb3JyaWRvckdlb21ldHJ5Iix0aGlzLl9vZmZzZXRBdHRyaWJ1dGU9dC5vZmZzZXRBdHRyaWJ1dGUsdGhpcy5fcmVjdGFuZ2xlPXZvaWQgMCx0aGlzLnBhY2tlZExlbmd0aD0xK2UubGVuZ3RoKmEucGFja2VkTGVuZ3RoKyQucGFja2VkTGVuZ3RoK2R0LnBhY2tlZExlbmd0aCs3fXZhciAkVCxaVCxtZCxoZCxRdixRVCxfcyxiYSxYVCxrZixUcix3cixHZixKbyx0cixuTyxvTyxWaSxlXyxyTz1aKCgpPT57anIoKTtNZSgpO0Z0KCk7UGUoKTtYdCgpO0xlKCk7aGMoKTtKMCgpO0l0KCk7ZnQoKTtadCgpO1hlKCk7WWUoKTthbigpO0xvKCk7JGUoKTtXdCgpO3FyKCk7dG4oKTt3bigpO0VvKCk7JFQ9bmV3IGEsWlQ9bmV3IGEsbWQ9bmV3IGEsaGQ9bmV3IGEsUXY9bmV3IGEsUVQ9bmV3IGEsX3M9bmV3IGEsYmE9bmV3IGE7WFQ9bmV3IGEsa2Y9bmV3IGEsVHI9bmV3IGF0O3dyPW5ldyBhLEdmPW5ldyBhLEpvPW5ldyBhdCx0cj1uZXcgYXQ7a2kucGFjaz1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJ2YWx1ZSIsdCkseS5kZWZpbmVkKCJhcnJheSIsZSksbj14KG4sMCk7bGV0IG89dC5fcG9zaXRpb25zLHI9by5sZW5ndGg7ZVtuKytdPXI7Zm9yKGxldCBpPTA7aTxyOysraSxuKz1hLnBhY2tlZExlbmd0aClhLnBhY2sob1tpXSxlLG4pO3JldHVybiAkLnBhY2sodC5fZWxsaXBzb2lkLGUsbiksbis9JC5wYWNrZWRMZW5ndGgsZHQucGFjayh0Ll92ZXJ0ZXhGb3JtYXQsZSxuKSxuKz1kdC5wYWNrZWRMZW5ndGgsZVtuKytdPXQuX3dpZHRoLGVbbisrXT10Ll9oZWlnaHQsZVtuKytdPXQuX2V4dHJ1ZGVkSGVpZ2h0LGVbbisrXT10Ll9jb3JuZXJUeXBlLGVbbisrXT10Ll9ncmFudWxhcml0eSxlW24rK109dC5fc2hhZG93Vm9sdW1lPzE6MCxlW25dPXgodC5fb2Zmc2V0QXR0cmlidXRlLC0xKSxlfTtuTz0kLmNsb25lKCQuVU5JVF9TUEhFUkUpLG9PPW5ldyBkdCxWaT17cG9zaXRpb25zOnZvaWQgMCxlbGxpcHNvaWQ6bk8sdmVydGV4Rm9ybWF0Om9PLHdpZHRoOnZvaWQgMCxoZWlnaHQ6dm9pZCAwLGV4dHJ1ZGVkSGVpZ2h0OnZvaWQgMCxjb3JuZXJUeXBlOnZvaWQgMCxncmFudWxhcml0eTp2b2lkIDAsc2hhZG93Vm9sdW1lOnZvaWQgMCxvZmZzZXRBdHRyaWJ1dGU6dm9pZCAwfTtraS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3kuZGVmaW5lZCgiYXJyYXkiLHQpLGU9eChlLDApO2xldCBvPXRbZSsrXSxyPW5ldyBBcnJheShvKTtmb3IobGV0IF89MDtfPG87KytfLGUrPWEucGFja2VkTGVuZ3RoKXJbX109YS51bnBhY2sodCxlKTtsZXQgaT0kLnVucGFjayh0LGUsbk8pO2UrPSQucGFja2VkTGVuZ3RoO2xldCBzPWR0LnVucGFjayh0LGUsb08pO2UrPWR0LnBhY2tlZExlbmd0aDtsZXQgZj10W2UrK10sdT10W2UrK10sYz10W2UrK10sbD10W2UrK10scD10W2UrK10sZD10W2UrK109PT0xLG09dFtlXTtyZXR1cm4gaChuKT8obi5fcG9zaXRpb25zPXIsbi5fZWxsaXBzb2lkPSQuY2xvbmUoaSxuLl9lbGxpcHNvaWQpLG4uX3ZlcnRleEZvcm1hdD1kdC5jbG9uZShzLG4uX3ZlcnRleEZvcm1hdCksbi5fd2lkdGg9ZixuLl9oZWlnaHQ9dSxuLl9leHRydWRlZEhlaWdodD1jLG4uX2Nvcm5lclR5cGU9bCxuLl9ncmFudWxhcml0eT1wLG4uX3NoYWRvd1ZvbHVtZT1kLG4uX29mZnNldEF0dHJpYnV0ZT1tPT09LTE/dm9pZCAwOm0sbik6KFZpLnBvc2l0aW9ucz1yLFZpLndpZHRoPWYsVmkuaGVpZ2h0PXUsVmkuZXh0cnVkZWRIZWlnaHQ9YyxWaS5jb3JuZXJUeXBlPWwsVmkuZ3JhbnVsYXJpdHk9cCxWaS5zaGFkb3dWb2x1bWU9ZCxWaS5vZmZzZXRBdHRyaWJ1dGU9bT09PS0xP3ZvaWQgMDptLG5ldyBraShWaSkpfTtraS5jb21wdXRlUmVjdGFuZ2xlPWZ1bmN0aW9uKHQsZSl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBuPXQucG9zaXRpb25zLG89dC53aWR0aDt5LmRlZmluZWQoIm9wdGlvbnMucG9zaXRpb25zIixuKSx5LmRlZmluZWQoIm9wdGlvbnMud2lkdGgiLG8pO2xldCByPXgodC5lbGxpcHNvaWQsJC5XR1M4NCksaT14KHQuY29ybmVyVHlwZSxmbi5ST1VOREVEKTtyZXR1cm4gZU8obixyLG8saSxlKX07a2kuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fcG9zaXRpb25zLG49dC5fd2lkdGgsbz10Ll9lbGxpcHNvaWQ7ZT1KVChlLG8pO2xldCByPUNuKGUsYS5lcXVhbHNFcHNpbG9uKTtpZihyLmxlbmd0aDwyfHxuPD0wKXJldHVybjtsZXQgaT10Ll9oZWlnaHQscz10Ll9leHRydWRlZEhlaWdodCxmPSFNLmVxdWFsc0Vwc2lsb24oaSxzLDAsTS5FUFNJTE9OMiksdT10Ll92ZXJ0ZXhGb3JtYXQsYz17ZWxsaXBzb2lkOm8scG9zaXRpb25zOnIsd2lkdGg6bixjb3JuZXJUeXBlOnQuX2Nvcm5lclR5cGUsZ3JhbnVsYXJpdHk6dC5fZ3JhbnVsYXJpdHksc2F2ZUF0dHJpYnV0ZXM6ITB9LGw7aWYoZiljLmhlaWdodD1pLGMuZXh0cnVkZWRIZWlnaHQ9cyxjLnNoYWRvd1ZvbHVtZT10Ll9zaGFkb3dWb2x1bWUsYy5vZmZzZXRBdHRyaWJ1dGU9dC5fb2Zmc2V0QXR0cmlidXRlLGw9dEwoYyx1KTtlbHNle2xldCBtPXFlLmNvbXB1dGVQb3NpdGlvbnMoYyk7aWYobD10TyhtLHUsbyksbC5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcz1TZS5zY2FsZVRvR2VvZGV0aWNIZWlnaHQobC5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyxpLG8pLGgodC5fb2Zmc2V0QXR0cmlidXRlKSl7bGV0IF89dC5fb2Zmc2V0QXR0cmlidXRlPT09ZmUuTk9ORT8wOjEsZz1sLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLmxlbmd0aCxiPW5ldyBVaW50OEFycmF5KGcvMykuZmlsbChfKTtsLmF0dHJpYnV0ZXMuYXBwbHlPZmZzZXQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5VTlNJR05FRF9CWVRFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6MSx2YWx1ZXM6Yn0pfX1sZXQgcD1sLmF0dHJpYnV0ZXMsZD1BdC5mcm9tVmVydGljZXMocC5wb3NpdGlvbi52YWx1ZXMsdm9pZCAwLDMpO3JldHVybiB1LnBvc2l0aW9ufHwobC5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcz12b2lkIDApLG5ldyBVdCh7YXR0cmlidXRlczpwLGluZGljZXM6bC5pbmRpY2VzLHByaW1pdGl2ZVR5cGU6QnQuVFJJQU5HTEVTLGJvdW5kaW5nU3BoZXJlOmQsb2Zmc2V0QXR0cmlidXRlOnQuX29mZnNldEF0dHJpYnV0ZX0pfTtraS5jcmVhdGVTaGFkb3dWb2x1bWU9ZnVuY3Rpb24odCxlLG4pe2xldCBvPXQuX2dyYW51bGFyaXR5LHI9dC5fZWxsaXBzb2lkLGk9ZShvLHIpLHM9bihvLHIpO3JldHVybiBuZXcga2koe3Bvc2l0aW9uczp0Ll9wb3NpdGlvbnMsd2lkdGg6dC5fd2lkdGgsY29ybmVyVHlwZTp0Ll9jb3JuZXJUeXBlLGVsbGlwc29pZDpyLGdyYW51bGFyaXR5Om8sZXh0cnVkZWRIZWlnaHQ6aSxoZWlnaHQ6cyx2ZXJ0ZXhGb3JtYXQ6ZHQuUE9TSVRJT05fT05MWSxzaGFkb3dWb2x1bWU6ITB9KX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoa2kucHJvdG90eXBlLHtyZWN0YW5nbGU6e2dldDpmdW5jdGlvbigpe3JldHVybiBoKHRoaXMuX3JlY3RhbmdsZSl8fCh0aGlzLl9yZWN0YW5nbGU9ZU8odGhpcy5fcG9zaXRpb25zLHRoaXMuX2VsbGlwc29pZCx0aGlzLl93aWR0aCx0aGlzLl9jb3JuZXJUeXBlKSksdGhpcy5fcmVjdGFuZ2xlfX0sdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50czp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuWzAsMCwwLDEsMSwwXX19fSk7ZV89a2l9KTt2YXIgbl89e307ZGUobl8se2RlZmF1bHQ6KCk9Pm5MfSk7ZnVuY3Rpb24gZUwodCxlKXtyZXR1cm4gaChlKSYmKHQ9ZV8udW5wYWNrKHQsZSkpLHQuX2VsbGlwc29pZD0kLmNsb25lKHQuX2VsbGlwc29pZCksZV8uY3JlYXRlR2VvbWV0cnkodCl9dmFyIG5MLG9fPVooKCk9PntyTygpO2Z0KCk7WnQoKTtuTD1lTH0pO2Z1bmN0aW9uIHJMKHQsZSl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXT1lLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UodFtuXSx0W25dKTtyZXR1cm4gdH1mdW5jdGlvbiBjTyh0LGUpe2xldCBuPVtdLG89dC5wb3NpdGlvbnMscj10LmNvcm5lcnMsaT10LmVuZFBvc2l0aW9ucyxzPW5ldyBpZSxmLHU9MCxjPTAsbCxwPTAsZDtmb3IobD0wO2w8by5sZW5ndGg7bCs9MilkPW9bbF0ubGVuZ3RoLTMsdSs9ZCxwKz1kLzMqNCxjKz1vW2wrMV0ubGVuZ3RoLTM7Zm9yKHUrPTMsYys9MyxsPTA7bDxyLmxlbmd0aDtsKyspe2Y9cltsXTtsZXQgQj1yW2xdLmxlZnRQb3NpdGlvbnM7aChCKT8oZD1CLmxlbmd0aCx1Kz1kLHArPWQvMyoyKTooZD1yW2xdLnJpZ2h0UG9zaXRpb25zLmxlbmd0aCxjKz1kLHArPWQvMyoyKX1sZXQgbT1oKGkpLF87bSYmKF89aVswXS5sZW5ndGgtMyx1Kz1fLGMrPV8sXy89MyxwKz1fKjQpO2xldCBnPXUrYyxiPW5ldyBGbG9hdDY0QXJyYXkoZyksdz0wLE89Zy0xLEUsVCxDLE4sSSxELHY9Xy8yLEw9RHQuY3JlYXRlVHlwZWRBcnJheShnLzMscCs0KSxVPTA7aWYoTFtVKytdPXcvMyxMW1UrK109KE8tMikvMyxtKXtuLnB1c2gody8zKSxEPWlPLEk9c087bGV0IEI9aVswXTtmb3IobD0wO2w8djtsKyspRD1hLmZyb21BcnJheShCLCh2LTEtbCkqMyxEKSxJPWEuZnJvbUFycmF5KEIsKHYrbCkqMyxJKSxxZS5hZGRBdHRyaWJ1dGUoYixJLHcpLHFlLmFkZEF0dHJpYnV0ZShiLEQsdm9pZCAwLE8pLFQ9dy8zLE49VCsxLEU9KE8tMikvMyxDPUUtMSxMW1UrK109RSxMW1UrK109QyxMW1UrK109VCxMW1UrK109Tix3Kz0zLE8tPTN9bGV0IEE9MCxTPW9bQSsrXSxQPW9bQSsrXTtmb3IoYi5zZXQoUyx3KSxiLnNldChQLE8tUC5sZW5ndGgrMSksZD1QLmxlbmd0aC0zLG4ucHVzaCh3LzMsKE8tMikvMyksbD0wO2w8ZDtsKz0zKVQ9dy8zLE49VCsxLEU9KE8tMikvMyxDPUUtMSxMW1UrK109RSxMW1UrK109QyxMW1UrK109VCxMW1UrK109Tix3Kz0zLE8tPTM7Zm9yKGw9MDtsPHIubGVuZ3RoO2wrKyl7bGV0IEI7Zj1yW2xdO2xldCBqPWYubGVmdFBvc2l0aW9ucyxIPWYucmlnaHRQb3NpdGlvbnMsayxLPW9MO2lmKGgoaikpe2ZvcihPLT0zLGs9QyxuLnB1c2goTiksQj0wO0I8ai5sZW5ndGgvMztCKyspSz1hLmZyb21BcnJheShqLEIqMyxLKSxMW1UrK109ay1CLTEsTFtVKytdPWstQixxZS5hZGRBdHRyaWJ1dGUoYixLLHZvaWQgMCxPKSxPLT0zO24ucHVzaChrLU1hdGguZmxvb3Ioai5sZW5ndGgvNikpLGU9PT1mbi5CRVZFTEVEJiZuLnB1c2goKE8tMikvMysxKSx3Kz0zfWVsc2V7Zm9yKHcrPTMsaz1OLG4ucHVzaChDKSxCPTA7QjxILmxlbmd0aC8zO0IrKylLPWEuZnJvbUFycmF5KEgsQiozLEspLExbVSsrXT1rK0IsTFtVKytdPWsrQisxLHFlLmFkZEF0dHJpYnV0ZShiLEssdyksdys9MztuLnB1c2goaytNYXRoLmZsb29yKEgubGVuZ3RoLzYpKSxlPT09Zm4uQkVWRUxFRCYmbi5wdXNoKHcvMy0xKSxPLT0zfWZvcihTPW9bQSsrXSxQPW9bQSsrXSxTLnNwbGljZSgwLDMpLFAuc3BsaWNlKFAubGVuZ3RoLTMsMyksYi5zZXQoUyx3KSxiLnNldChQLE8tUC5sZW5ndGgrMSksZD1QLmxlbmd0aC0zLEI9MDtCPFAubGVuZ3RoO0IrPTMpTj13LzMsVD1OLTEsQz0oTy0yKS8zLEU9QysxLExbVSsrXT1FLExbVSsrXT1DLExbVSsrXT1ULExbVSsrXT1OLHcrPTMsTy09Mzt3LT0zLE8rPTMsbi5wdXNoKHcvMywoTy0yKS8zKX1pZihtKXt3Kz0zLE8tPTMsRD1pTyxJPXNPO2xldCBCPWlbMV07Zm9yKGw9MDtsPHY7bCsrKUQ9YS5mcm9tQXJyYXkoQiwoXy1sLTEpKjMsRCksST1hLmZyb21BcnJheShCLGwqMyxJKSxxZS5hZGRBdHRyaWJ1dGUoYixELHZvaWQgMCxPKSxxZS5hZGRBdHRyaWJ1dGUoYixJLHcpLE49dy8zLFQ9Ti0xLEM9KE8tMikvMyxFPUMrMSxMW1UrK109RSxMW1UrK109QyxMW1UrK109VCxMW1UrK109Tix3Kz0zLE8tPTM7bi5wdXNoKHcvMyl9ZWxzZSBuLnB1c2gody8zLChPLTIpLzMpO3JldHVybiBMW1UrK109dy8zLExbVSsrXT0oTy0yKS8zLHMucG9zaXRpb249bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpifSkse2F0dHJpYnV0ZXM6cyxpbmRpY2VzOkwsd2FsbEluZGljZXM6bn19ZnVuY3Rpb24gaUwodCl7bGV0IGU9dC5lbGxpcHNvaWQsbj1xZS5jb21wdXRlUG9zaXRpb25zKHQpLG89Y08obix0LmNvcm5lclR5cGUpLHI9by53YWxsSW5kaWNlcyxpPXQuaGVpZ2h0LHM9dC5leHRydWRlZEhlaWdodCxmPW8uYXR0cmlidXRlcyx1PW8uaW5kaWNlcyxjPWYucG9zaXRpb24udmFsdWVzLGw9Yy5sZW5ndGgscD1uZXcgRmxvYXQ2NEFycmF5KGwpO3Auc2V0KGMpO2xldCBkPW5ldyBGbG9hdDY0QXJyYXkobCoyKTtpZihjPVNlLnNjYWxlVG9HZW9kZXRpY0hlaWdodChjLGksZSkscD1TZS5zY2FsZVRvR2VvZGV0aWNIZWlnaHQocCxzLGUpLGQuc2V0KGMpLGQuc2V0KHAsbCksZi5wb3NpdGlvbi52YWx1ZXM9ZCxsLz0zLGgodC5vZmZzZXRBdHRyaWJ1dGUpKXtsZXQgRT1uZXcgVWludDhBcnJheShsKjIpO2lmKHQub2Zmc2V0QXR0cmlidXRlPT09ZmUuVE9QKUU9RS5maWxsKDEsMCxsKTtlbHNle2xldCBUPXQub2Zmc2V0QXR0cmlidXRlPT09ZmUuTk9ORT8wOjE7RT1FLmZpbGwoVCl9Zi5hcHBseU9mZnNldD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LlVOU0lHTkVEX0JZVEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZToxLHZhbHVlczpFfSl9bGV0IG0sXz11Lmxlbmd0aCxnPUR0LmNyZWF0ZVR5cGVkQXJyYXkoZC5sZW5ndGgvMywoXytyLmxlbmd0aCkqMik7Zy5zZXQodSk7bGV0IGI9Xztmb3IobT0wO208XzttKz0yKXtsZXQgRT11W21dLFQ9dVttKzFdO2dbYisrXT1FK2wsZ1tiKytdPVQrbH1sZXQgdyxPO2ZvcihtPTA7bTxyLmxlbmd0aDttKyspdz1yW21dLE89dytsLGdbYisrXT13LGdbYisrXT1PO3JldHVybnthdHRyaWJ1dGVzOmYsaW5kaWNlczpnfX1mdW5jdGlvbiB6Zih0KXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IGU9dC5wb3NpdGlvbnMsbj10LndpZHRoO3kudHlwZU9mLm9iamVjdCgib3B0aW9ucy5wb3NpdGlvbnMiLGUpLHkudHlwZU9mLm51bWJlcigib3B0aW9ucy53aWR0aCIsbik7bGV0IG89eCh0LmhlaWdodCwwKSxyPXgodC5leHRydWRlZEhlaWdodCxvKTt0aGlzLl9wb3NpdGlvbnM9ZSx0aGlzLl9lbGxpcHNvaWQ9JC5jbG9uZSh4KHQuZWxsaXBzb2lkLCQuV0dTODQpKSx0aGlzLl93aWR0aD1uLHRoaXMuX2hlaWdodD1NYXRoLm1heChvLHIpLHRoaXMuX2V4dHJ1ZGVkSGVpZ2h0PU1hdGgubWluKG8sciksdGhpcy5fY29ybmVyVHlwZT14KHQuY29ybmVyVHlwZSxmbi5ST1VOREVEKSx0aGlzLl9ncmFudWxhcml0eT14KHQuZ3JhbnVsYXJpdHksTS5SQURJQU5TX1BFUl9ERUdSRUUpLHRoaXMuX29mZnNldEF0dHJpYnV0ZT10Lm9mZnNldEF0dHJpYnV0ZSx0aGlzLl93b3JrZXJOYW1lPSJjcmVhdGVDb3JyaWRvck91dGxpbmVHZW9tZXRyeSIsdGhpcy5wYWNrZWRMZW5ndGg9MStlLmxlbmd0aCphLnBhY2tlZExlbmd0aCskLnBhY2tlZExlbmd0aCs2fXZhciBpTyxzTyxvTCxhTyx5cyxyXyxmTz1aKCgpPT57anIoKTtNZSgpO0Z0KCk7WHQoKTtMZSgpO2hjKCk7SjAoKTtJdCgpO2Z0KCk7WnQoKTtYZSgpO1llKCk7YW4oKTtMbygpOyRlKCk7V3QoKTtxcigpO3RuKCk7aU89bmV3IGEsc089bmV3IGEsb0w9bmV3IGE7emYucGFjaz1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCkseS50eXBlT2Yub2JqZWN0KCJhcnJheSIsZSksbj14KG4sMCk7bGV0IG89dC5fcG9zaXRpb25zLHI9by5sZW5ndGg7ZVtuKytdPXI7Zm9yKGxldCBpPTA7aTxyOysraSxuKz1hLnBhY2tlZExlbmd0aClhLnBhY2sob1tpXSxlLG4pO3JldHVybiAkLnBhY2sodC5fZWxsaXBzb2lkLGUsbiksbis9JC5wYWNrZWRMZW5ndGgsZVtuKytdPXQuX3dpZHRoLGVbbisrXT10Ll9oZWlnaHQsZVtuKytdPXQuX2V4dHJ1ZGVkSGVpZ2h0LGVbbisrXT10Ll9jb3JuZXJUeXBlLGVbbisrXT10Ll9ncmFudWxhcml0eSxlW25dPXgodC5fb2Zmc2V0QXR0cmlidXRlLC0xKSxlfTthTz0kLmNsb25lKCQuVU5JVF9TUEhFUkUpLHlzPXtwb3NpdGlvbnM6dm9pZCAwLGVsbGlwc29pZDphTyx3aWR0aDp2b2lkIDAsaGVpZ2h0OnZvaWQgMCxleHRydWRlZEhlaWdodDp2b2lkIDAsY29ybmVyVHlwZTp2b2lkIDAsZ3JhbnVsYXJpdHk6dm9pZCAwLG9mZnNldEF0dHJpYnV0ZTp2b2lkIDB9O3pmLnVucGFjaz1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJhcnJheSIsdCksZT14KGUsMCk7bGV0IG89dFtlKytdLHI9bmV3IEFycmF5KG8pO2ZvcihsZXQgZD0wO2Q8bzsrK2QsZSs9YS5wYWNrZWRMZW5ndGgpcltkXT1hLnVucGFjayh0LGUpO2xldCBpPSQudW5wYWNrKHQsZSxhTyk7ZSs9JC5wYWNrZWRMZW5ndGg7bGV0IHM9dFtlKytdLGY9dFtlKytdLHU9dFtlKytdLGM9dFtlKytdLGw9dFtlKytdLHA9dFtlXTtyZXR1cm4gaChuKT8obi5fcG9zaXRpb25zPXIsbi5fZWxsaXBzb2lkPSQuY2xvbmUoaSxuLl9lbGxpcHNvaWQpLG4uX3dpZHRoPXMsbi5faGVpZ2h0PWYsbi5fZXh0cnVkZWRIZWlnaHQ9dSxuLl9jb3JuZXJUeXBlPWMsbi5fZ3JhbnVsYXJpdHk9bCxuLl9vZmZzZXRBdHRyaWJ1dGU9cD09PS0xP3ZvaWQgMDpwLG4pOih5cy5wb3NpdGlvbnM9cix5cy53aWR0aD1zLHlzLmhlaWdodD1mLHlzLmV4dHJ1ZGVkSGVpZ2h0PXUseXMuY29ybmVyVHlwZT1jLHlzLmdyYW51bGFyaXR5PWwseXMub2Zmc2V0QXR0cmlidXRlPXA9PT0tMT92b2lkIDA6cCxuZXcgemYoeXMpKX07emYuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fcG9zaXRpb25zLG49dC5fd2lkdGgsbz10Ll9lbGxpcHNvaWQ7ZT1yTChlLG8pO2xldCByPUNuKGUsYS5lcXVhbHNFcHNpbG9uKTtpZihyLmxlbmd0aDwyfHxuPD0wKXJldHVybjtsZXQgaT10Ll9oZWlnaHQscz10Ll9leHRydWRlZEhlaWdodCxmPSFNLmVxdWFsc0Vwc2lsb24oaSxzLDAsTS5FUFNJTE9OMiksdT17ZWxsaXBzb2lkOm8scG9zaXRpb25zOnIsd2lkdGg6bixjb3JuZXJUeXBlOnQuX2Nvcm5lclR5cGUsZ3JhbnVsYXJpdHk6dC5fZ3JhbnVsYXJpdHksc2F2ZUF0dHJpYnV0ZXM6ITF9LGM7aWYoZil1LmhlaWdodD1pLHUuZXh0cnVkZWRIZWlnaHQ9cyx1Lm9mZnNldEF0dHJpYnV0ZT10Ll9vZmZzZXRBdHRyaWJ1dGUsYz1pTCh1KTtlbHNle2xldCBkPXFlLmNvbXB1dGVQb3NpdGlvbnModSk7aWYoYz1jTyhkLHUuY29ybmVyVHlwZSksYy5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcz1TZS5zY2FsZVRvR2VvZGV0aWNIZWlnaHQoYy5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyxpLG8pLGgodC5fb2Zmc2V0QXR0cmlidXRlKSl7bGV0IG09Yy5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGgsXz10Ll9vZmZzZXRBdHRyaWJ1dGU9PT1mZS5OT05FPzA6MSxnPW5ldyBVaW50OEFycmF5KG0vMykuZmlsbChfKTtjLmF0dHJpYnV0ZXMuYXBwbHlPZmZzZXQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5VTlNJR05FRF9CWVRFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6MSx2YWx1ZXM6Z30pfX1sZXQgbD1jLmF0dHJpYnV0ZXMscD1BdC5mcm9tVmVydGljZXMobC5wb3NpdGlvbi52YWx1ZXMsdm9pZCAwLDMpO3JldHVybiBuZXcgVXQoe2F0dHJpYnV0ZXM6bCxpbmRpY2VzOmMuaW5kaWNlcyxwcmltaXRpdmVUeXBlOkJ0LkxJTkVTLGJvdW5kaW5nU3BoZXJlOnAsb2Zmc2V0QXR0cmlidXRlOnQuX29mZnNldEF0dHJpYnV0ZX0pfTtyXz16Zn0pO3ZhciBpXz17fTtkZShpXyx7ZGVmYXVsdDooKT0+Y0x9KTtmdW5jdGlvbiBzTCh0LGUpe3JldHVybiBoKGUpJiYodD1yXy51bnBhY2sodCxlKSksdC5fZWxsaXBzb2lkPSQuY2xvbmUodC5fZWxsaXBzb2lkKSxyXy5jcmVhdGVHZW9tZXRyeSh0KX12YXIgY0wsc189WigoKT0+e2ZPKCk7ZnQoKTtadCgpO2NMPXNMfSk7dmFyIHVPLF9kLGNfPVooKCk9PntXdCgpO3VPPXt9O3VPLmNvbXB1dGVQb3NpdGlvbnM9ZnVuY3Rpb24odCxlLG4sbyxyKXtsZXQgaT10Ki41LHM9LWksZj1vK28sdT1yPzIqZjpmLGM9bmV3IEZsb2F0NjRBcnJheSh1KjMpLGwscD0wLGQ9MCxtPXI/ZiozOjAsXz1yPyhmK28pKjM6byozO2ZvcihsPTA7bDxvO2wrKyl7bGV0IGc9bC9vKk0uVFdPX1BJLGI9TWF0aC5jb3MoZyksdz1NYXRoLnNpbihnKSxPPWIqbixFPXcqbixUPWIqZSxDPXcqZTtjW2QrbV09TyxjW2QrbSsxXT1FLGNbZCttKzJdPXMsY1tkK19dPVQsY1tkK18rMV09QyxjW2QrXysyXT1pLGQrPTMsciYmKGNbcCsrXT1PLGNbcCsrXT1FLGNbcCsrXT1zLGNbcCsrXT1ULGNbcCsrXT1DLGNbcCsrXT1pKX1yZXR1cm4gY307X2Q9dU99KTtmdW5jdGlvbiBHaSh0KXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IGU9dC5sZW5ndGgsbj10LnRvcFJhZGl1cyxvPXQuYm90dG9tUmFkaXVzLHI9eCh0LnZlcnRleEZvcm1hdCxkdC5ERUZBVUxUKSxpPXgodC5zbGljZXMsMTI4KTtpZighaChlKSl0aHJvdyBuZXcgRigib3B0aW9ucy5sZW5ndGggbXVzdCBiZSBkZWZpbmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBGKCJvcHRpb25zLnRvcFJhZGl1cyBtdXN0IGJlIGRlZmluZWQuIik7aWYoIWgobykpdGhyb3cgbmV3IEYoIm9wdGlvbnMuYm90dG9tUmFkaXVzIG11c3QgYmUgZGVmaW5lZC4iKTtpZihpPDMpdGhyb3cgbmV3IEYoIm9wdGlvbnMuc2xpY2VzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDMuIik7aWYoaCh0Lm9mZnNldEF0dHJpYnV0ZSkmJnQub2Zmc2V0QXR0cmlidXRlPT09ZmUuVE9QKXRocm93IG5ldyBGKCJHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZS5UT1AgaXMgbm90IGEgc3VwcG9ydGVkIG9wdGlvbnMub2Zmc2V0QXR0cmlidXRlIGZvciB0aGlzIGdlb21ldHJ5LiIpO3RoaXMuX2xlbmd0aD1lLHRoaXMuX3RvcFJhZGl1cz1uLHRoaXMuX2JvdHRvbVJhZGl1cz1vLHRoaXMuX3ZlcnRleEZvcm1hdD1kdC5jbG9uZShyKSx0aGlzLl9zbGljZXM9aSx0aGlzLl9vZmZzZXRBdHRyaWJ1dGU9dC5vZmZzZXRBdHRyaWJ1dGUsdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlQ3lsaW5kZXJHZW9tZXRyeSJ9dmFyIGFfLGFMLGZMLHVMLGxMLGxPLHdhLGZfLGpmLHVfPVooKCk9PntNZSgpO0ZlKCk7RnQoKTtMZSgpO2NfKCk7SXQoKTtmdCgpO0h0KCk7WGUoKTtZZSgpO2FuKCk7TG8oKTskZSgpO1d0KCk7dG4oKTtFbygpO2FfPW5ldyB0dCxhTD1uZXcgYSxmTD1uZXcgYSx1TD1uZXcgYSxsTD1uZXcgYTtHaS5wYWNrZWRMZW5ndGg9ZHQucGFja2VkTGVuZ3RoKzU7R2kucGFjaz1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEYoInZhbHVlIGlzIHJlcXVpcmVkIik7aWYoIWgoZSkpdGhyb3cgbmV3IEYoImFycmF5IGlzIHJlcXVpcmVkIik7cmV0dXJuIG49eChuLDApLGR0LnBhY2sodC5fdmVydGV4Rm9ybWF0LGUsbiksbis9ZHQucGFja2VkTGVuZ3RoLGVbbisrXT10Ll9sZW5ndGgsZVtuKytdPXQuX3RvcFJhZGl1cyxlW24rK109dC5fYm90dG9tUmFkaXVzLGVbbisrXT10Ll9zbGljZXMsZVtuXT14KHQuX29mZnNldEF0dHJpYnV0ZSwtMSksZX07bE89bmV3IGR0LHdhPXt2ZXJ0ZXhGb3JtYXQ6bE8sbGVuZ3RoOnZvaWQgMCx0b3BSYWRpdXM6dm9pZCAwLGJvdHRvbVJhZGl1czp2b2lkIDAsc2xpY2VzOnZvaWQgMCxvZmZzZXRBdHRyaWJ1dGU6dm9pZCAwfTtHaS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBGKCJhcnJheSBpcyByZXF1aXJlZCIpO2U9eChlLDApO2xldCBvPWR0LnVucGFjayh0LGUsbE8pO2UrPWR0LnBhY2tlZExlbmd0aDtsZXQgcj10W2UrK10saT10W2UrK10scz10W2UrK10sZj10W2UrK10sdT10W2VdO3JldHVybiBoKG4pPyhuLl92ZXJ0ZXhGb3JtYXQ9ZHQuY2xvbmUobyxuLl92ZXJ0ZXhGb3JtYXQpLG4uX2xlbmd0aD1yLG4uX3RvcFJhZGl1cz1pLG4uX2JvdHRvbVJhZGl1cz1zLG4uX3NsaWNlcz1mLG4uX29mZnNldEF0dHJpYnV0ZT11PT09LTE/dm9pZCAwOnUsbik6KHdhLmxlbmd0aD1yLHdhLnRvcFJhZGl1cz1pLHdhLmJvdHRvbVJhZGl1cz1zLHdhLnNsaWNlcz1mLHdhLm9mZnNldEF0dHJpYnV0ZT11PT09LTE/dm9pZCAwOnUsbmV3IEdpKHdhKSl9O0dpLmNyZWF0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQpe2xldCBlPXQuX2xlbmd0aCxuPXQuX3RvcFJhZGl1cyxvPXQuX2JvdHRvbVJhZGl1cyxyPXQuX3ZlcnRleEZvcm1hdCxpPXQuX3NsaWNlcztpZihlPD0wfHxuPDB8fG88MHx8bj09PTAmJm89PT0wKXJldHVybjtsZXQgcz1pK2ksZj1pK3MsdT1zK3MsYz1fZC5jb21wdXRlUG9zaXRpb25zKGUsbixvLGksITApLGw9ci5zdD9uZXcgRmxvYXQzMkFycmF5KHUqMik6dm9pZCAwLHA9ci5ub3JtYWw/bmV3IEZsb2F0MzJBcnJheSh1KjMpOnZvaWQgMCxkPXIudGFuZ2VudD9uZXcgRmxvYXQzMkFycmF5KHUqMyk6dm9pZCAwLG09ci5iaXRhbmdlbnQ/bmV3IEZsb2F0MzJBcnJheSh1KjMpOnZvaWQgMCxfLGc9ci5ub3JtYWx8fHIudGFuZ2VudHx8ci5iaXRhbmdlbnQ7aWYoZyl7bGV0IEk9ci50YW5nZW50fHxyLmJpdGFuZ2VudCxEPTAsdj0wLEw9MCxVPU1hdGguYXRhbjIoby1uLGUpLEE9YUw7QS56PU1hdGguc2luKFUpO2xldCBTPU1hdGguY29zKFUpLFA9dUwsQj1mTDtmb3IoXz0wO188aTtfKyspe2xldCBqPV8vaSpNLlRXT19QSSxIPVMqTWF0aC5jb3Moaiksaz1TKk1hdGguc2luKGopO2cmJihBLng9SCxBLnk9ayxJJiYoUD1hLm5vcm1hbGl6ZShhLmNyb3NzKGEuVU5JVF9aLEEsUCksUCkpLHIubm9ybWFsJiYocFtEKytdPUEueCxwW0QrK109QS55LHBbRCsrXT1BLnoscFtEKytdPUEueCxwW0QrK109QS55LHBbRCsrXT1BLnopLHIudGFuZ2VudCYmKGRbdisrXT1QLngsZFt2KytdPVAueSxkW3YrK109UC56LGRbdisrXT1QLngsZFt2KytdPVAueSxkW3YrK109UC56KSxyLmJpdGFuZ2VudCYmKEI9YS5ub3JtYWxpemUoYS5jcm9zcyhBLFAsQiksQiksbVtMKytdPUIueCxtW0wrK109Qi55LG1bTCsrXT1CLnosbVtMKytdPUIueCxtW0wrK109Qi55LG1bTCsrXT1CLnopKX1mb3IoXz0wO188aTtfKyspci5ub3JtYWwmJihwW0QrK109MCxwW0QrK109MCxwW0QrK109LTEpLHIudGFuZ2VudCYmKGRbdisrXT0xLGRbdisrXT0wLGRbdisrXT0wKSxyLmJpdGFuZ2VudCYmKG1bTCsrXT0wLG1bTCsrXT0tMSxtW0wrK109MCk7Zm9yKF89MDtfPGk7XysrKXIubm9ybWFsJiYocFtEKytdPTAscFtEKytdPTAscFtEKytdPTEpLHIudGFuZ2VudCYmKGRbdisrXT0xLGRbdisrXT0wLGRbdisrXT0wKSxyLmJpdGFuZ2VudCYmKG1bTCsrXT0wLG1bTCsrXT0xLG1bTCsrXT0wKX1sZXQgYj0xMippLTEyLHc9RHQuY3JlYXRlVHlwZWRBcnJheSh1LGIpLE89MCxFPTA7Zm9yKF89MDtfPGktMTtfKyspd1tPKytdPUUsd1tPKytdPUUrMix3W08rK109RSszLHdbTysrXT1FLHdbTysrXT1FKzMsd1tPKytdPUUrMSxFKz0yO2Zvcih3W08rK109cy0yLHdbTysrXT0wLHdbTysrXT0xLHdbTysrXT1zLTIsd1tPKytdPTEsd1tPKytdPXMtMSxfPTE7XzxpLTE7XysrKXdbTysrXT1zK18rMSx3W08rK109cytfLHdbTysrXT1zO2ZvcihfPTE7XzxpLTE7XysrKXdbTysrXT1mLHdbTysrXT1mK18sd1tPKytdPWYrXysxO2xldCBUPTA7aWYoci5zdCl7bGV0IEk9TWF0aC5tYXgobixvKTtmb3IoXz0wO188dTtfKyspe2xldCBEPWEuZnJvbUFycmF5KGMsXyozLGxMKTtsW1QrK109KEQueCtJKS8oMipJKSxsW1QrK109KEQueStJKS8oMipJKX19bGV0IEM9bmV3IGllO3IucG9zaXRpb24mJihDLnBvc2l0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6Y30pKSxyLm5vcm1hbCYmKEMubm9ybWFsPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpwfSkpLHIudGFuZ2VudCYmKEMudGFuZ2VudD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6ZH0pKSxyLmJpdGFuZ2VudCYmKEMuYml0YW5nZW50PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczptfSkpLHIuc3QmJihDLnN0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZToyLHZhbHVlczpsfSkpLGFfLng9ZSouNSxhXy55PU1hdGgubWF4KG8sbik7bGV0IE49bmV3IEF0KGEuWkVSTyx0dC5tYWduaXR1ZGUoYV8pKTtpZihoKHQuX29mZnNldEF0dHJpYnV0ZSkpe2U9Yy5sZW5ndGg7bGV0IEk9dC5fb2Zmc2V0QXR0cmlidXRlPT09ZmUuTk9ORT8wOjEsRD1uZXcgVWludDhBcnJheShlLzMpLmZpbGwoSSk7Qy5hcHBseU9mZnNldD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LlVOU0lHTkVEX0JZVEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZToxLHZhbHVlczpEfSl9cmV0dXJuIG5ldyBVdCh7YXR0cmlidXRlczpDLGluZGljZXM6dyxwcmltaXRpdmVUeXBlOkJ0LlRSSUFOR0xFUyxib3VuZGluZ1NwaGVyZTpOLG9mZnNldEF0dHJpYnV0ZTp0Ll9vZmZzZXRBdHRyaWJ1dGV9KX07R2kuZ2V0VW5pdEN5bGluZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGgoZl8pfHwoZl89R2kuY3JlYXRlR2VvbWV0cnkobmV3IEdpKHt0b3BSYWRpdXM6MSxib3R0b21SYWRpdXM6MSxsZW5ndGg6MSx2ZXJ0ZXhGb3JtYXQ6ZHQuUE9TSVRJT05fT05MWX0pKSksZl99O2pmPUdpfSk7dmFyIGxfPXt9O2RlKGxfLHtkZWZhdWx0OigpPT5kTH0pO2Z1bmN0aW9uIHBMKHQsZSl7cmV0dXJuIGgoZSkmJih0PWpmLnVucGFjayh0LGUpKSxqZi5jcmVhdGVHZW9tZXRyeSh0KX12YXIgZEwscF89WigoKT0+e3VfKCk7ZnQoKTtkTD1wTH0pO2Z1bmN0aW9uIFRhKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKTtsZXQgZT10Lmxlbmd0aCxuPXQudG9wUmFkaXVzLG89dC5ib3R0b21SYWRpdXMscj14KHQuc2xpY2VzLDEyOCksaT1NYXRoLm1heCh4KHQubnVtYmVyT2ZWZXJ0aWNhbExpbmVzLDE2KSwwKTtpZih5LnR5cGVPZi5udW1iZXIoIm9wdGlvbnMucG9zaXRpb25zIixlKSx5LnR5cGVPZi5udW1iZXIoIm9wdGlvbnMudG9wUmFkaXVzIixuKSx5LnR5cGVPZi5udW1iZXIoIm9wdGlvbnMuYm90dG9tUmFkaXVzIixvKSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygib3B0aW9ucy5zbGljZXMiLHIsMyksaCh0Lm9mZnNldEF0dHJpYnV0ZSkmJnQub2Zmc2V0QXR0cmlidXRlPT09ZmUuVE9QKXRocm93IG5ldyBGKCJHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZS5UT1AgaXMgbm90IGEgc3VwcG9ydGVkIG9wdGlvbnMub2Zmc2V0QXR0cmlidXRlIGZvciB0aGlzIGdlb21ldHJ5LiIpO3RoaXMuX2xlbmd0aD1lLHRoaXMuX3RvcFJhZGl1cz1uLHRoaXMuX2JvdHRvbVJhZGl1cz1vLHRoaXMuX3NsaWNlcz1yLHRoaXMuX251bWJlck9mVmVydGljYWxMaW5lcz1pLHRoaXMuX29mZnNldEF0dHJpYnV0ZT10Lm9mZnNldEF0dHJpYnV0ZSx0aGlzLl93b3JrZXJOYW1lPSJjcmVhdGVDeWxpbmRlck91dGxpbmVHZW9tZXRyeSJ9dmFyIGRfLHljLG1fLHBPPVooKCk9PntNZSgpO0ZlKCk7RnQoKTtYdCgpO0xlKCk7Y18oKTtJdCgpO2Z0KCk7SHQoKTtYZSgpO1llKCk7YW4oKTtMbygpOyRlKCk7dG4oKTtkXz1uZXcgdHQ7VGEucGFja2VkTGVuZ3RoPTY7VGEucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49eChuLDApLGVbbisrXT10Ll9sZW5ndGgsZVtuKytdPXQuX3RvcFJhZGl1cyxlW24rK109dC5fYm90dG9tUmFkaXVzLGVbbisrXT10Ll9zbGljZXMsZVtuKytdPXQuX251bWJlck9mVmVydGljYWxMaW5lcyxlW25dPXgodC5fb2Zmc2V0QXR0cmlidXRlLC0xKSxlfTt5Yz17bGVuZ3RoOnZvaWQgMCx0b3BSYWRpdXM6dm9pZCAwLGJvdHRvbVJhZGl1czp2b2lkIDAsc2xpY2VzOnZvaWQgMCxudW1iZXJPZlZlcnRpY2FsTGluZXM6dm9pZCAwLG9mZnNldEF0dHJpYnV0ZTp2b2lkIDB9O1RhLnVucGFjaz1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCk7bGV0IG89dFtlKytdLHI9dFtlKytdLGk9dFtlKytdLHM9dFtlKytdLGY9dFtlKytdLHU9dFtlXTtyZXR1cm4gaChuKT8obi5fbGVuZ3RoPW8sbi5fdG9wUmFkaXVzPXIsbi5fYm90dG9tUmFkaXVzPWksbi5fc2xpY2VzPXMsbi5fbnVtYmVyT2ZWZXJ0aWNhbExpbmVzPWYsbi5fb2Zmc2V0QXR0cmlidXRlPXU9PT0tMT92b2lkIDA6dSxuKTooeWMubGVuZ3RoPW8seWMudG9wUmFkaXVzPXIseWMuYm90dG9tUmFkaXVzPWkseWMuc2xpY2VzPXMseWMubnVtYmVyT2ZWZXJ0aWNhbExpbmVzPWYseWMub2Zmc2V0QXR0cmlidXRlPXU9PT0tMT92b2lkIDA6dSxuZXcgVGEoeWMpKX07VGEuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fbGVuZ3RoLG49dC5fdG9wUmFkaXVzLG89dC5fYm90dG9tUmFkaXVzLHI9dC5fc2xpY2VzLGk9dC5fbnVtYmVyT2ZWZXJ0aWNhbExpbmVzO2lmKGU8PTB8fG48MHx8bzwwfHxuPT09MCYmbz09PTApcmV0dXJuO2xldCBzPXIqMixmPV9kLmNvbXB1dGVQb3NpdGlvbnMoZSxuLG8sciwhMSksdT1yKjIsYztpZihpPjApe2xldCBnPU1hdGgubWluKGkscik7Yz1NYXRoLnJvdW5kKHIvZyksdSs9Z31sZXQgbD1EdC5jcmVhdGVUeXBlZEFycmF5KHMsdSoyKSxwPTAsZDtmb3IoZD0wO2Q8ci0xO2QrKylsW3ArK109ZCxsW3ArK109ZCsxLGxbcCsrXT1kK3IsbFtwKytdPWQrMStyO2lmKGxbcCsrXT1yLTEsbFtwKytdPTAsbFtwKytdPXIrci0xLGxbcCsrXT1yLGk+MClmb3IoZD0wO2Q8cjtkKz1jKWxbcCsrXT1kLGxbcCsrXT1kK3I7bGV0IG09bmV3IGllO20ucG9zaXRpb249bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpmfSksZF8ueD1lKi41LGRfLnk9TWF0aC5tYXgobyxuKTtsZXQgXz1uZXcgQXQoYS5aRVJPLHR0Lm1hZ25pdHVkZShkXykpO2lmKGgodC5fb2Zmc2V0QXR0cmlidXRlKSl7ZT1mLmxlbmd0aDtsZXQgZz10Ll9vZmZzZXRBdHRyaWJ1dGU9PT1mZS5OT05FPzA6MSxiPW5ldyBVaW50OEFycmF5KGUvMykuZmlsbChnKTttLmFwcGx5T2Zmc2V0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuVU5TSUdORURfQllURSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjEsdmFsdWVzOmJ9KX1yZXR1cm4gbmV3IFV0KHthdHRyaWJ1dGVzOm0saW5kaWNlczpsLHByaW1pdGl2ZVR5cGU6QnQuTElORVMsYm91bmRpbmdTcGhlcmU6XyxvZmZzZXRBdHRyaWJ1dGU6dC5fb2Zmc2V0QXR0cmlidXRlfSl9O21fPVRhfSk7dmFyIGhfPXt9O2RlKGhfLHtkZWZhdWx0OigpPT5oTH0pO2Z1bmN0aW9uIG1MKHQsZSl7cmV0dXJuIGgoZSkmJih0PW1fLnVucGFjayh0LGUpKSxtXy5jcmVhdGVHZW9tZXRyeSh0KX12YXIgaEwsX189WigoKT0+e3BPKCk7ZnQoKTtoTD1tTH0pO3ZhciB5Xz17fTtkZSh5Xyx7ZGVmYXVsdDooKT0+eUx9KTtmdW5jdGlvbiBfTCh0LGUpe3JldHVybiBoKGUpJiYodD1Hci51bnBhY2sodCxlKSksdC5fY2VudGVyPWEuY2xvbmUodC5fY2VudGVyKSx0Ll9lbGxpcHNvaWQ9JC5jbG9uZSh0Ll9lbGxpcHNvaWQpLEdyLmNyZWF0ZUdlb21ldHJ5KHQpfXZhciB5TCxnXz1aKCgpPT57RnQoKTtmdCgpO3kwKCk7WnQoKTt5TD1fTH0pO3ZhciBBXz17fTtkZShBXyx7ZGVmYXVsdDooKT0+QUx9KTtmdW5jdGlvbiBnTCh0LGUpe3JldHVybiBoKGUpJiYodD16ci51bnBhY2sodCxlKSksdC5fY2VudGVyPWEuY2xvbmUodC5fY2VudGVyKSx0Ll9lbGxpcHNvaWQ9JC5jbG9uZSh0Ll9lbGxpcHNvaWQpLHpyLmNyZWF0ZUdlb21ldHJ5KHQpfXZhciBBTCxiXz1aKCgpPT57RnQoKTtmdCgpO3cwKCk7WnQoKTtBTD1nTH0pO2Z1bmN0aW9uIHppKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKTtsZXQgZT14KHQucmFkaWksUkwpLG49eCh0LmlubmVyUmFkaWksZSksbz14KHQubWluaW11bUNsb2NrLDApLHI9eCh0Lm1heGltdW1DbG9jayxNLlRXT19QSSksaT14KHQubWluaW11bUNvbmUsMCkscz14KHQubWF4aW11bUNvbmUsTS5QSSksZj1NYXRoLnJvdW5kKHgodC5zdGFja1BhcnRpdGlvbnMsNjQpKSx1PU1hdGgucm91bmQoeCh0LnNsaWNlUGFydGl0aW9ucyw2NCkpLGM9eCh0LnZlcnRleEZvcm1hdCxkdC5ERUZBVUxUKTtpZih1PDMpdGhyb3cgbmV3IEYoIm9wdGlvbnMuc2xpY2VQYXJ0aXRpb25zIGNhbm5vdCBiZSBsZXNzIHRoYW4gdGhyZWUuIik7aWYoZjwzKXRocm93IG5ldyBGKCJvcHRpb25zLnN0YWNrUGFydGl0aW9ucyBjYW5ub3QgYmUgbGVzcyB0aGFuIHRocmVlLiIpO3RoaXMuX3JhZGlpPWEuY2xvbmUoZSksdGhpcy5faW5uZXJSYWRpaT1hLmNsb25lKG4pLHRoaXMuX21pbmltdW1DbG9jaz1vLHRoaXMuX21heGltdW1DbG9jaz1yLHRoaXMuX21pbmltdW1Db25lPWksdGhpcy5fbWF4aW11bUNvbmU9cyx0aGlzLl9zdGFja1BhcnRpdGlvbnM9Zix0aGlzLl9zbGljZVBhcnRpdGlvbnM9dSx0aGlzLl92ZXJ0ZXhGb3JtYXQ9ZHQuY2xvbmUoYyksdGhpcy5fb2Zmc2V0QXR0cmlidXRlPXQub2Zmc2V0QXR0cmlidXRlLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZUVsbGlwc29pZEdlb21ldHJ5In12YXIgYkwsd0wsVEwsT0wsRUwsUkwsZE8sbU8saE8sX08seU8sZ3Msd18sY3IseWQ9WigoKT0+e01lKCk7RmUoKTtGdCgpO0xlKCk7SXQoKTtmdCgpO0h0KCk7WnQoKTtYZSgpO1llKCk7YW4oKTtMbygpOyRlKCk7V3QoKTt0bigpO0VvKCk7Ykw9bmV3IGEsd0w9bmV3IGEsVEw9bmV3IGEsT0w9bmV3IGEsRUw9bmV3IGEsUkw9bmV3IGEoMSwxLDEpLGRPPU1hdGguY29zLG1PPU1hdGguc2luO3ppLnBhY2tlZExlbmd0aD0yKmEucGFja2VkTGVuZ3RoK2R0LnBhY2tlZExlbmd0aCs3O3ppLnBhY2s9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBGKCJ2YWx1ZSBpcyByZXF1aXJlZCIpO2lmKCFoKGUpKXRocm93IG5ldyBGKCJhcnJheSBpcyByZXF1aXJlZCIpO3JldHVybiBuPXgobiwwKSxhLnBhY2sodC5fcmFkaWksZSxuKSxuKz1hLnBhY2tlZExlbmd0aCxhLnBhY2sodC5faW5uZXJSYWRpaSxlLG4pLG4rPWEucGFja2VkTGVuZ3RoLGR0LnBhY2sodC5fdmVydGV4Rm9ybWF0LGUsbiksbis9ZHQucGFja2VkTGVuZ3RoLGVbbisrXT10Ll9taW5pbXVtQ2xvY2ssZVtuKytdPXQuX21heGltdW1DbG9jayxlW24rK109dC5fbWluaW11bUNvbmUsZVtuKytdPXQuX21heGltdW1Db25lLGVbbisrXT10Ll9zdGFja1BhcnRpdGlvbnMsZVtuKytdPXQuX3NsaWNlUGFydGl0aW9ucyxlW25dPXgodC5fb2Zmc2V0QXR0cmlidXRlLC0xKSxlfTtoTz1uZXcgYSxfTz1uZXcgYSx5Tz1uZXcgZHQsZ3M9e3JhZGlpOmhPLGlubmVyUmFkaWk6X08sdmVydGV4Rm9ybWF0OnlPLG1pbmltdW1DbG9jazp2b2lkIDAsbWF4aW11bUNsb2NrOnZvaWQgMCxtaW5pbXVtQ29uZTp2b2lkIDAsbWF4aW11bUNvbmU6dm9pZCAwLHN0YWNrUGFydGl0aW9uczp2b2lkIDAsc2xpY2VQYXJ0aXRpb25zOnZvaWQgMCxvZmZzZXRBdHRyaWJ1dGU6dm9pZCAwfTt6aS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBGKCJhcnJheSBpcyByZXF1aXJlZCIpO2U9eChlLDApO2xldCBvPWEudW5wYWNrKHQsZSxoTyk7ZSs9YS5wYWNrZWRMZW5ndGg7bGV0IHI9YS51bnBhY2sodCxlLF9PKTtlKz1hLnBhY2tlZExlbmd0aDtsZXQgaT1kdC51bnBhY2sodCxlLHlPKTtlKz1kdC5wYWNrZWRMZW5ndGg7bGV0IHM9dFtlKytdLGY9dFtlKytdLHU9dFtlKytdLGM9dFtlKytdLGw9dFtlKytdLHA9dFtlKytdLGQ9dFtlXTtyZXR1cm4gaChuKT8obi5fcmFkaWk9YS5jbG9uZShvLG4uX3JhZGlpKSxuLl9pbm5lclJhZGlpPWEuY2xvbmUocixuLl9pbm5lclJhZGlpKSxuLl92ZXJ0ZXhGb3JtYXQ9ZHQuY2xvbmUoaSxuLl92ZXJ0ZXhGb3JtYXQpLG4uX21pbmltdW1DbG9jaz1zLG4uX21heGltdW1DbG9jaz1mLG4uX21pbmltdW1Db25lPXUsbi5fbWF4aW11bUNvbmU9YyxuLl9zdGFja1BhcnRpdGlvbnM9bCxuLl9zbGljZVBhcnRpdGlvbnM9cCxuLl9vZmZzZXRBdHRyaWJ1dGU9ZD09PS0xP3ZvaWQgMDpkLG4pOihncy5taW5pbXVtQ2xvY2s9cyxncy5tYXhpbXVtQ2xvY2s9Zixncy5taW5pbXVtQ29uZT11LGdzLm1heGltdW1Db25lPWMsZ3Muc3RhY2tQYXJ0aXRpb25zPWwsZ3Muc2xpY2VQYXJ0aXRpb25zPXAsZ3Mub2Zmc2V0QXR0cmlidXRlPWQ9PT0tMT92b2lkIDA6ZCxuZXcgemkoZ3MpKX07emkuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fcmFkaWk7aWYoZS54PD0wfHxlLnk8PTB8fGUuejw9MClyZXR1cm47bGV0IG49dC5faW5uZXJSYWRpaTtpZihuLng8PTB8fG4ueTw9MHx8bi56PD0wKXJldHVybjtsZXQgbz10Ll9taW5pbXVtQ2xvY2sscj10Ll9tYXhpbXVtQ2xvY2ssaT10Ll9taW5pbXVtQ29uZSxzPXQuX21heGltdW1Db25lLGY9dC5fdmVydGV4Rm9ybWF0LHU9dC5fc2xpY2VQYXJ0aXRpb25zKzEsYz10Ll9zdGFja1BhcnRpdGlvbnMrMTt1PU1hdGgucm91bmQodSpNYXRoLmFicyhyLW8pL00uVFdPX1BJKSxjPU1hdGgucm91bmQoYypNYXRoLmFicyhzLWkpL00uUEkpLHU8MiYmKHU9MiksYzwyJiYoYz0yKTtsZXQgbCxwLGQ9MCxtPVtpXSxfPVtvXTtmb3IobD0wO2w8YztsKyspbS5wdXNoKGkrbCoocy1pKS8oYy0xKSk7Zm9yKG0ucHVzaChzKSxwPTA7cDx1O3ArKylfLnB1c2gobytwKihyLW8pLyh1LTEpKTtfLnB1c2gocik7bGV0IGc9bS5sZW5ndGgsYj1fLmxlbmd0aCx3PTAsTz0xLEU9bi54IT09ZS54fHxuLnkhPT1lLnl8fG4ueiE9PWUueixUPSExLEM9ITEsTj0hMTtFJiYoTz0yLGk+MCYmKFQ9ITAsdys9dS0xKSxzPE1hdGguUEkmJihDPSEwLHcrPXUtMSksKHItbyklTS5UV09fUEk/KE49ITAsdys9KGMtMSkqMisxKTp3Kz0xKTtsZXQgST1iKmcqTyxEPW5ldyBGbG9hdDY0QXJyYXkoSSozKSx2PW5ldyBBcnJheShJKS5maWxsKCExKSxMPW5ldyBBcnJheShJKS5maWxsKCExKSxVPXUqYypPLEE9NiooVSt3KzEtKHUrYykqTyksUz1EdC5jcmVhdGVUeXBlZEFycmF5KFUsQSksUD1mLm5vcm1hbD9uZXcgRmxvYXQzMkFycmF5KEkqMyk6dm9pZCAwLEI9Zi50YW5nZW50P25ldyBGbG9hdDMyQXJyYXkoSSozKTp2b2lkIDAsaj1mLmJpdGFuZ2VudD9uZXcgRmxvYXQzMkFycmF5KEkqMyk6dm9pZCAwLEg9Zi5zdD9uZXcgRmxvYXQzMkFycmF5KEkqMik6dm9pZCAwLGs9bmV3IEFycmF5KGcpLEs9bmV3IEFycmF5KGcpO2ZvcihsPTA7bDxnO2wrKylrW2xdPW1PKG1bbF0pLEtbbF09ZE8obVtsXSk7bGV0IFg9bmV3IEFycmF5KGIpLFI9bmV3IEFycmF5KGIpO2ZvcihwPTA7cDxiO3ArKylSW3BdPWRPKF9bcF0pLFhbcF09bU8oX1twXSk7Zm9yKGw9MDtsPGc7bCsrKWZvcihwPTA7cDxiO3ArKylEW2QrK109ZS54KmtbbF0qUltwXSxEW2QrK109ZS55KmtbbF0qWFtwXSxEW2QrK109ZS56KktbbF07bGV0IG90PUkvMjtpZihFKWZvcihsPTA7bDxnO2wrKylmb3IocD0wO3A8YjtwKyspRFtkKytdPW4ueCprW2xdKlJbcF0sRFtkKytdPW4ueSprW2xdKlhbcF0sRFtkKytdPW4ueipLW2xdLHZbb3RdPSEwLGw+MCYmbCE9PWctMSYmcCE9PTAmJnAhPT1iLTEmJihMW290XT0hMCksb3QrKztkPTA7bGV0IGN0LHB0O2ZvcihsPTE7bDxnLTI7bCsrKWZvcihjdD1sKmIscHQ9KGwrMSkqYixwPTE7cDxiLTI7cCsrKVNbZCsrXT1wdCtwLFNbZCsrXT1wdCtwKzEsU1tkKytdPWN0K3ArMSxTW2QrK109cHQrcCxTW2QrK109Y3QrcCsxLFNbZCsrXT1jdCtwO2lmKEUpe2xldCBwZT1nKmI7Zm9yKGw9MTtsPGctMjtsKyspZm9yKGN0PXBlK2wqYixwdD1wZSsobCsxKSpiLHA9MTtwPGItMjtwKyspU1tkKytdPXB0K3AsU1tkKytdPWN0K3AsU1tkKytdPWN0K3ArMSxTW2QrK109cHQrcCxTW2QrK109Y3QrcCsxLFNbZCsrXT1wdCtwKzF9bGV0IHl0LHJ0O2lmKEUpe2lmKFQpZm9yKHJ0PWcqYixsPTE7bDxiLTI7bCsrKVNbZCsrXT1sLFNbZCsrXT1sKzEsU1tkKytdPXJ0K2wrMSxTW2QrK109bCxTW2QrK109cnQrbCsxLFNbZCsrXT1ydCtsO2lmKEMpZm9yKHl0PWcqYi1iLHJ0PWcqYipPLWIsbD0xO2w8Yi0yO2wrKylTW2QrK109eXQrbCsxLFNbZCsrXT15dCtsLFNbZCsrXT1ydCtsLFNbZCsrXT15dCtsKzEsU1tkKytdPXJ0K2wsU1tkKytdPXJ0K2wrMX1pZihOKXtmb3IobD0xO2w8Zy0yO2wrKylydD1iKmcrYipsLHl0PWIqbCxTW2QrK109cnQsU1tkKytdPXl0K2IsU1tkKytdPXl0LFNbZCsrXT1ydCxTW2QrK109cnQrYixTW2QrK109eXQrYjtmb3IobD0xO2w8Zy0yO2wrKylydD1iKmcrYioobCsxKS0xLHl0PWIqKGwrMSktMSxTW2QrK109eXQrYixTW2QrK109cnQsU1tkKytdPXl0LFNbZCsrXT15dCtiLFNbZCsrXT1ydCtiLFNbZCsrXT1ydH1sZXQgUHQ9bmV3IGllO2YucG9zaXRpb24mJihQdC5wb3NpdGlvbj1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkRPVUJMRSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOkR9KSk7bGV0IGd0PTAsQ3Q9MCxtdD0wLHV0PTAsdnQ9SS8yLHp0LG1lPSQuZnJvbUNhcnRlc2lhbjMoZSksY2U9JC5mcm9tQ2FydGVzaWFuMyhuKTtpZihmLnN0fHxmLm5vcm1hbHx8Zi50YW5nZW50fHxmLmJpdGFuZ2VudCl7Zm9yKGw9MDtsPEk7bCsrKXt6dD12W2xdP2NlOm1lO2xldCBwZT1hLmZyb21BcnJheShELGwqMyxiTCksdWU9enQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKHBlLHdMKTtpZihMW2xdJiZhLm5lZ2F0ZSh1ZSx1ZSksZi5zdCl7bGV0IFF0PXR0Lm5lZ2F0ZSh1ZSxFTCk7SFtndCsrXT1NYXRoLmF0YW4yKFF0LnksUXQueCkvTS5UV09fUEkrLjUsSFtndCsrXT1NYXRoLmFzaW4odWUueikvTWF0aC5QSSsuNX1pZihmLm5vcm1hbCYmKFBbQ3QrK109dWUueCxQW0N0KytdPXVlLnksUFtDdCsrXT11ZS56KSxmLnRhbmdlbnR8fGYuYml0YW5nZW50KXtsZXQgUXQ9VEwsSnQ9MCx4ZTtpZih2W2xdJiYoSnQ9dnQpLCFUJiZsPj1KdCYmbDxKdCtiKjI/eGU9YS5VTklUX1g6eGU9YS5VTklUX1osYS5jcm9zcyh4ZSx1ZSxRdCksYS5ub3JtYWxpemUoUXQsUXQpLGYudGFuZ2VudCYmKEJbbXQrK109UXQueCxCW210KytdPVF0LnksQlttdCsrXT1RdC56KSxmLmJpdGFuZ2VudCl7bGV0IGdlPWEuY3Jvc3ModWUsUXQsT0wpO2Eubm9ybWFsaXplKGdlLGdlKSxqW3V0KytdPWdlLngsalt1dCsrXT1nZS55LGpbdXQrK109Z2Uuen19fWYuc3QmJihQdC5zdD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Mix2YWx1ZXM6SH0pKSxmLm5vcm1hbCYmKFB0Lm5vcm1hbD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6UH0pKSxmLnRhbmdlbnQmJihQdC50YW5nZW50PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpCfSkpLGYuYml0YW5nZW50JiYoUHQuYml0YW5nZW50PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpqfSkpfWlmKGgodC5fb2Zmc2V0QXR0cmlidXRlKSl7bGV0IHBlPUQubGVuZ3RoLHVlPXQuX29mZnNldEF0dHJpYnV0ZT09PWZlLk5PTkU/MDoxLFF0PW5ldyBVaW50OEFycmF5KHBlLzMpLmZpbGwodWUpO1B0LmFwcGx5T2Zmc2V0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuVU5TSUdORURfQllURSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjEsdmFsdWVzOlF0fSl9cmV0dXJuIG5ldyBVdCh7YXR0cmlidXRlczpQdCxpbmRpY2VzOlMscHJpbWl0aXZlVHlwZTpCdC5UUklBTkdMRVMsYm91bmRpbmdTcGhlcmU6QXQuZnJvbUVsbGlwc29pZChtZSksb2Zmc2V0QXR0cmlidXRlOnQuX29mZnNldEF0dHJpYnV0ZX0pfTt6aS5nZXRVbml0RWxsaXBzb2lkPWZ1bmN0aW9uKCl7cmV0dXJuIGgod18pfHwod189emkuY3JlYXRlR2VvbWV0cnkobmV3IHppKHtyYWRpaTpuZXcgYSgxLDEsMSksdmVydGV4Rm9ybWF0OmR0LlBPU0lUSU9OX09OTFl9KSkpLHdffTtjcj16aX0pO3ZhciBUXz17fTtkZShUXyx7ZGVmYXVsdDooKT0+Q0x9KTtmdW5jdGlvbiBTTCh0LGUpe3JldHVybiBoKGUpJiYodD1jci51bnBhY2sodCxlKSksY3IuY3JlYXRlR2VvbWV0cnkodCl9dmFyIENMLE9fPVooKCk9PntmdCgpO3lkKCk7Q0w9U0x9KTtmdW5jdGlvbiBPYSh0KXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IGU9eCh0LnJhZGlpLHhMKSxuPXgodC5pbm5lclJhZGlpLGUpLG89eCh0Lm1pbmltdW1DbG9jaywwKSxyPXgodC5tYXhpbXVtQ2xvY2ssTS5UV09fUEkpLGk9eCh0Lm1pbmltdW1Db25lLDApLHM9eCh0Lm1heGltdW1Db25lLE0uUEkpLGY9TWF0aC5yb3VuZCh4KHQuc3RhY2tQYXJ0aXRpb25zLDEwKSksdT1NYXRoLnJvdW5kKHgodC5zbGljZVBhcnRpdGlvbnMsOCkpLGM9TWF0aC5yb3VuZCh4KHQuc3ViZGl2aXNpb25zLDEyOCkpO2lmKGY8MSl0aHJvdyBuZXcgRigib3B0aW9ucy5zdGFja1BhcnRpdGlvbnMgY2Fubm90IGJlIGxlc3MgdGhhbiAxIik7aWYodTwwKXRocm93IG5ldyBGKCJvcHRpb25zLnNsaWNlUGFydGl0aW9ucyBjYW5ub3QgYmUgbGVzcyB0aGFuIDAiKTtpZihjPDApdGhyb3cgbmV3IEYoIm9wdGlvbnMuc3ViZGl2aXNpb25zIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHplcm8uIik7aWYoaCh0Lm9mZnNldEF0dHJpYnV0ZSkmJnQub2Zmc2V0QXR0cmlidXRlPT09ZmUuVE9QKXRocm93IG5ldyBGKCJHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZS5UT1AgaXMgbm90IGEgc3VwcG9ydGVkIG9wdGlvbnMub2Zmc2V0QXR0cmlidXRlIGZvciB0aGlzIGdlb21ldHJ5LiIpO3RoaXMuX3JhZGlpPWEuY2xvbmUoZSksdGhpcy5faW5uZXJSYWRpaT1hLmNsb25lKG4pLHRoaXMuX21pbmltdW1DbG9jaz1vLHRoaXMuX21heGltdW1DbG9jaz1yLHRoaXMuX21pbmltdW1Db25lPWksdGhpcy5fbWF4aW11bUNvbmU9cyx0aGlzLl9zdGFja1BhcnRpdGlvbnM9Zix0aGlzLl9zbGljZVBhcnRpdGlvbnM9dSx0aGlzLl9zdWJkaXZpc2lvbnM9Yyx0aGlzLl9vZmZzZXRBdHRyaWJ1dGU9dC5vZmZzZXRBdHRyaWJ1dGUsdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5In12YXIgeEwsZ2QsQWQsZ08sQU8samksV3IsRV89WigoKT0+e01lKCk7RnQoKTtMZSgpO0l0KCk7ZnQoKTtIdCgpO1p0KCk7WGUoKTtZZSgpO2FuKCk7TG8oKTskZSgpO1d0KCk7dG4oKTt4TD1uZXcgYSgxLDEsMSksZ2Q9TWF0aC5jb3MsQWQ9TWF0aC5zaW47T2EucGFja2VkTGVuZ3RoPTIqYS5wYWNrZWRMZW5ndGgrODtPYS5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgRigidmFsdWUgaXMgcmVxdWlyZWQiKTtpZighaChlKSl0aHJvdyBuZXcgRigiYXJyYXkgaXMgcmVxdWlyZWQiKTtyZXR1cm4gbj14KG4sMCksYS5wYWNrKHQuX3JhZGlpLGUsbiksbis9YS5wYWNrZWRMZW5ndGgsYS5wYWNrKHQuX2lubmVyUmFkaWksZSxuKSxuKz1hLnBhY2tlZExlbmd0aCxlW24rK109dC5fbWluaW11bUNsb2NrLGVbbisrXT10Ll9tYXhpbXVtQ2xvY2ssZVtuKytdPXQuX21pbmltdW1Db25lLGVbbisrXT10Ll9tYXhpbXVtQ29uZSxlW24rK109dC5fc3RhY2tQYXJ0aXRpb25zLGVbbisrXT10Ll9zbGljZVBhcnRpdGlvbnMsZVtuKytdPXQuX3N1YmRpdmlzaW9ucyxlW25dPXgodC5fb2Zmc2V0QXR0cmlidXRlLC0xKSxlfTtnTz1uZXcgYSxBTz1uZXcgYSxqaT17cmFkaWk6Z08saW5uZXJSYWRpaTpBTyxtaW5pbXVtQ2xvY2s6dm9pZCAwLG1heGltdW1DbG9jazp2b2lkIDAsbWluaW11bUNvbmU6dm9pZCAwLG1heGltdW1Db25lOnZvaWQgMCxzdGFja1BhcnRpdGlvbnM6dm9pZCAwLHNsaWNlUGFydGl0aW9uczp2b2lkIDAsc3ViZGl2aXNpb25zOnZvaWQgMCxvZmZzZXRBdHRyaWJ1dGU6dm9pZCAwfTtPYS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBGKCJhcnJheSBpcyByZXF1aXJlZCIpO2U9eChlLDApO2xldCBvPWEudW5wYWNrKHQsZSxnTyk7ZSs9YS5wYWNrZWRMZW5ndGg7bGV0IHI9YS51bnBhY2sodCxlLEFPKTtlKz1hLnBhY2tlZExlbmd0aDtsZXQgaT10W2UrK10scz10W2UrK10sZj10W2UrK10sdT10W2UrK10sYz10W2UrK10sbD10W2UrK10scD10W2UrK10sZD10W2VdO3JldHVybiBoKG4pPyhuLl9yYWRpaT1hLmNsb25lKG8sbi5fcmFkaWkpLG4uX2lubmVyUmFkaWk9YS5jbG9uZShyLG4uX2lubmVyUmFkaWkpLG4uX21pbmltdW1DbG9jaz1pLG4uX21heGltdW1DbG9jaz1zLG4uX21pbmltdW1Db25lPWYsbi5fbWF4aW11bUNvbmU9dSxuLl9zdGFja1BhcnRpdGlvbnM9YyxuLl9zbGljZVBhcnRpdGlvbnM9bCxuLl9zdWJkaXZpc2lvbnM9cCxuLl9vZmZzZXRBdHRyaWJ1dGU9ZD09PS0xP3ZvaWQgMDpkLG4pOihqaS5taW5pbXVtQ2xvY2s9aSxqaS5tYXhpbXVtQ2xvY2s9cyxqaS5taW5pbXVtQ29uZT1mLGppLm1heGltdW1Db25lPXUsamkuc3RhY2tQYXJ0aXRpb25zPWMsamkuc2xpY2VQYXJ0aXRpb25zPWwsamkuc3ViZGl2aXNpb25zPXAsamkub2Zmc2V0QXR0cmlidXRlPWQ9PT0tMT92b2lkIDA6ZCxuZXcgT2EoamkpKX07T2EuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fcmFkaWk7aWYoZS54PD0wfHxlLnk8PTB8fGUuejw9MClyZXR1cm47bGV0IG49dC5faW5uZXJSYWRpaTtpZihuLng8PTB8fG4ueTw9MHx8bi56PD0wKXJldHVybjtsZXQgbz10Ll9taW5pbXVtQ2xvY2sscj10Ll9tYXhpbXVtQ2xvY2ssaT10Ll9taW5pbXVtQ29uZSxzPXQuX21heGltdW1Db25lLGY9dC5fc3ViZGl2aXNpb25zLHU9JC5mcm9tQ2FydGVzaWFuMyhlKSxjPXQuX3NsaWNlUGFydGl0aW9ucysxLGw9dC5fc3RhY2tQYXJ0aXRpb25zKzE7Yz1NYXRoLnJvdW5kKGMqTWF0aC5hYnMoci1vKS9NLlRXT19QSSksbD1NYXRoLnJvdW5kKGwqTWF0aC5hYnMocy1pKS9NLlBJKSxjPDImJihjPTIpLGw8MiYmKGw9Mik7bGV0IHA9MCxkPTEsbT1uLnghPT1lLnh8fG4ueSE9PWUueXx8bi56IT09ZS56LF89ITEsZz0hMTttJiYoZD0yLGk+MCYmKF89ITAscCs9YyksczxNYXRoLlBJJiYoZz0hMCxwKz1jKSk7bGV0IGI9ZipkKihsK2MpLHc9bmV3IEZsb2F0NjRBcnJheShiKjMpLE89MiooYitwLShjK2wpKmQpLEU9RHQuY3JlYXRlVHlwZWRBcnJheShiLE8pLFQsQyxOLEksRD0wLHY9bmV3IEFycmF5KGwpLEw9bmV3IEFycmF5KGwpO2ZvcihUPTA7VDxsO1QrKylJPWkrVCoocy1pKS8obC0xKSx2W1RdPUFkKEkpLExbVF09Z2QoSSk7bGV0IFU9bmV3IEFycmF5KGYpLEE9bmV3IEFycmF5KGYpO2ZvcihUPTA7VDxmO1QrKylOPW8rVCooci1vKS8oZi0xKSxVW1RdPUFkKE4pLEFbVF09Z2QoTik7Zm9yKFQ9MDtUPGw7VCsrKWZvcihDPTA7QzxmO0MrKyl3W0QrK109ZS54KnZbVF0qQVtDXSx3W0QrK109ZS55KnZbVF0qVVtDXSx3W0QrK109ZS56KkxbVF07aWYobSlmb3IoVD0wO1Q8bDtUKyspZm9yKEM9MDtDPGY7QysrKXdbRCsrXT1uLngqdltUXSpBW0NdLHdbRCsrXT1uLnkqdltUXSpVW0NdLHdbRCsrXT1uLnoqTFtUXTtmb3Iodi5sZW5ndGg9ZixMLmxlbmd0aD1mLFQ9MDtUPGY7VCsrKUk9aStUKihzLWkpLyhmLTEpLHZbVF09QWQoSSksTFtUXT1nZChJKTtmb3IoVS5sZW5ndGg9YyxBLmxlbmd0aD1jLFQ9MDtUPGM7VCsrKU49bytUKihyLW8pLyhjLTEpLFVbVF09QWQoTiksQVtUXT1nZChOKTtmb3IoVD0wO1Q8ZjtUKyspZm9yKEM9MDtDPGM7QysrKXdbRCsrXT1lLngqdltUXSpBW0NdLHdbRCsrXT1lLnkqdltUXSpVW0NdLHdbRCsrXT1lLnoqTFtUXTtpZihtKWZvcihUPTA7VDxmO1QrKylmb3IoQz0wO0M8YztDKyspd1tEKytdPW4ueCp2W1RdKkFbQ10sd1tEKytdPW4ueSp2W1RdKlVbQ10sd1tEKytdPW4ueipMW1RdO2ZvcihEPTAsVD0wO1Q8bCpkO1QrKyl7bGV0IEI9VCpmO2ZvcihDPTA7QzxmLTE7QysrKUVbRCsrXT1CK0MsRVtEKytdPUIrQysxfWxldCBTPWwqZipkO2ZvcihUPTA7VDxjO1QrKylmb3IoQz0wO0M8Zi0xO0MrKylFW0QrK109UytUK0MqYyxFW0QrK109UytUKyhDKzEpKmM7aWYobSlmb3IoUz1sKmYqZCtjKmYsVD0wO1Q8YztUKyspZm9yKEM9MDtDPGYtMTtDKyspRVtEKytdPVMrVCtDKmMsRVtEKytdPVMrVCsoQysxKSpjO2lmKG0pe2xldCBCPWwqZipkLGo9QitmKmM7aWYoXylmb3IoVD0wO1Q8YztUKyspRVtEKytdPUIrVCxFW0QrK109aitUO2lmKGcpZm9yKEIrPWYqYy1jLGorPWYqYy1jLFQ9MDtUPGM7VCsrKUVbRCsrXT1CK1QsRVtEKytdPWorVH1sZXQgUD1uZXcgaWUoe3Bvc2l0aW9uOm5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6d30pfSk7aWYoaCh0Ll9vZmZzZXRBdHRyaWJ1dGUpKXtsZXQgQj13Lmxlbmd0aCxqPXQuX29mZnNldEF0dHJpYnV0ZT09PWZlLk5PTkU/MDoxLEg9bmV3IFVpbnQ4QXJyYXkoQi8zKS5maWxsKGopO1AuYXBwbHlPZmZzZXQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5VTlNJR05FRF9CWVRFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6MSx2YWx1ZXM6SH0pfXJldHVybiBuZXcgVXQoe2F0dHJpYnV0ZXM6UCxpbmRpY2VzOkUscHJpbWl0aXZlVHlwZTpCdC5MSU5FUyxib3VuZGluZ1NwaGVyZTpBdC5mcm9tRWxsaXBzb2lkKHUpLG9mZnNldEF0dHJpYnV0ZTp0Ll9vZmZzZXRBdHRyaWJ1dGV9KX07V3I9T2F9KTt2YXIgUl89e307ZGUoUl8se2RlZmF1bHQ6KCk9Pk1MfSk7ZnVuY3Rpb24gUEwodCxlKXtyZXR1cm4gaCh0LmJ1ZmZlcixlKSYmKHQ9V3IudW5wYWNrKHQsZSkpLFdyLmNyZWF0ZUdlb21ldHJ5KHQpfXZhciBNTCxTXz1aKCgpPT57ZnQoKTtFXygpO01MPVBMfSk7ZnVuY3Rpb24gT3IodCl7dGhpcy5wbGFuZXM9eCh0LFtdKX12YXIgSGYsQXMsTkwsYk8sYmQsQ189WigoKT0+e0Z0KCk7aHIoKTtJdCgpO2Z0KCk7SHQoKTtrcygpO2ZzKCk7SGY9W25ldyBhLG5ldyBhLG5ldyBhXTthLmNsb25lKGEuVU5JVF9YLEhmWzBdKTthLmNsb25lKGEuVU5JVF9ZLEhmWzFdKTthLmNsb25lKGEuVU5JVF9aLEhmWzJdKTtBcz1uZXcgYSxOTD1uZXcgYSxiTz1uZXcgb24obmV3IGEoMSwwLDApLDApO09yLmZyb21Cb3VuZGluZ1NwaGVyZT1mdW5jdGlvbih0LGUpe2lmKCFoKHQpKXRocm93IG5ldyBGKCJib3VuZGluZ1NwaGVyZSBpcyByZXF1aXJlZC4iKTtoKGUpfHwoZT1uZXcgT3IpO2xldCBuPUhmLmxlbmd0aCxvPWUucGxhbmVzO28ubGVuZ3RoPTIqbjtsZXQgcj10LmNlbnRlcixpPXQucmFkaXVzLHM9MDtmb3IobGV0IGY9MDtmPG47KytmKXtsZXQgdT1IZltmXSxjPW9bc10sbD1vW3MrMV07aChjKXx8KGM9b1tzXT1uZXcgaGUpLGgobCl8fChsPW9bcysxXT1uZXcgaGUpLGEubXVsdGlwbHlCeVNjYWxhcih1LC1pLEFzKSxhLmFkZChyLEFzLEFzKSxjLng9dS54LGMueT11LnksYy56PXUueixjLnc9LWEuZG90KHUsQXMpLGEubXVsdGlwbHlCeVNjYWxhcih1LGksQXMpLGEuYWRkKHIsQXMsQXMpLGwueD0tdS54LGwueT0tdS55LGwuej0tdS56LGwudz0tYS5kb3QoYS5uZWdhdGUodSxOTCksQXMpLHMrPTJ9cmV0dXJuIGV9O09yLnByb3RvdHlwZS5jb21wdXRlVmlzaWJpbGl0eT1mdW5jdGlvbih0KXtpZighaCh0KSl0aHJvdyBuZXcgRigiYm91bmRpbmdWb2x1bWUgaXMgcmVxdWlyZWQuIik7bGV0IGU9dGhpcy5wbGFuZXMsbj0hMTtmb3IobGV0IG89MCxyPWUubGVuZ3RoO288cjsrK28pe2xldCBpPXQuaW50ZXJzZWN0UGxhbmUob24uZnJvbUNhcnRlc2lhbjQoZVtvXSxiTykpO2lmKGk9PT1Sbi5PVVRTSURFKXJldHVybiBSbi5PVVRTSURFO2k9PT1Sbi5JTlRFUlNFQ1RJTkcmJihuPSEwKX1yZXR1cm4gbj9Sbi5JTlRFUlNFQ1RJTkc6Um4uSU5TSURFfTtPci5wcm90b3R5cGUuY29tcHV0ZVZpc2liaWxpdHlXaXRoUGxhbmVNYXNrPWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEYoImJvdW5kaW5nVm9sdW1lIGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBGKCJwYXJlbnRQbGFuZU1hc2sgaXMgcmVxdWlyZWQuIik7aWYoZT09PU9yLk1BU0tfT1VUU0lERXx8ZT09PU9yLk1BU0tfSU5TSURFKXJldHVybiBlO2xldCBuPU9yLk1BU0tfSU5TSURFLG89dGhpcy5wbGFuZXM7Zm9yKGxldCByPTAsaT1vLmxlbmd0aDtyPGk7KytyKXtsZXQgcz1yPDMxPzE8PHI6MDtpZihyPDMxJiYhKGUmcykpY29udGludWU7bGV0IGY9dC5pbnRlcnNlY3RQbGFuZShvbi5mcm9tQ2FydGVzaWFuNChvW3JdLGJPKSk7aWYoZj09PVJuLk9VVFNJREUpcmV0dXJuIE9yLk1BU0tfT1VUU0lERTtmPT09Um4uSU5URVJTRUNUSU5HJiYobnw9cyl9cmV0dXJuIG59O09yLk1BU0tfT1VUU0lERT00Mjk0OTY3Mjk1O09yLk1BU0tfSU5TSURFPTA7T3IuTUFTS19JTkRFVEVSTUlOQVRFPTIxNDc0ODM2NDc7YmQ9T3J9KTtmdW5jdGlvbiBsaSh0KXt0PXgodCx4LkVNUFRZX09CSkVDVCksdGhpcy5sZWZ0PXQubGVmdCx0aGlzLl9sZWZ0PXZvaWQgMCx0aGlzLnJpZ2h0PXQucmlnaHQsdGhpcy5fcmlnaHQ9dm9pZCAwLHRoaXMudG9wPXQudG9wLHRoaXMuX3RvcD12b2lkIDAsdGhpcy5ib3R0b209dC5ib3R0b20sdGhpcy5fYm90dG9tPXZvaWQgMCx0aGlzLm5lYXI9eCh0Lm5lYXIsMSksdGhpcy5fbmVhcj10aGlzLm5lYXIsdGhpcy5mYXI9eCh0LmZhciw1ZTgpLHRoaXMuX2Zhcj10aGlzLmZhcix0aGlzLl9jdWxsaW5nVm9sdW1lPW5ldyBiZCx0aGlzLl9vcnRob2dyYXBoaWNNYXRyaXg9bmV3IHN0fWZ1bmN0aW9uIHdPKHQpe2lmKCFoKHQucmlnaHQpfHwhaCh0LmxlZnQpfHwhaCh0LnRvcCl8fCFoKHQuYm90dG9tKXx8IWgodC5uZWFyKXx8IWgodC5mYXIpKXRocm93IG5ldyBGKCJyaWdodCwgbGVmdCwgdG9wLCBib3R0b20sIG5lYXIsIG9yIGZhciBwYXJhbWV0ZXJzIGFyZSBub3Qgc2V0LiIpO2lmKHQudG9wIT09dC5fdG9wfHx0LmJvdHRvbSE9PXQuX2JvdHRvbXx8dC5sZWZ0IT09dC5fbGVmdHx8dC5yaWdodCE9PXQuX3JpZ2h0fHx0Lm5lYXIhPT10Ll9uZWFyfHx0LmZhciE9PXQuX2Zhcil7aWYodC5sZWZ0PnQucmlnaHQpdGhyb3cgbmV3IEYoInJpZ2h0IG11c3QgYmUgZ3JlYXRlciB0aGFuIGxlZnQuIik7aWYodC5ib3R0b20+dC50b3ApdGhyb3cgbmV3IEYoInRvcCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBib3R0b20uIik7aWYodC5uZWFyPD0wfHx0Lm5lYXI+dC5mYXIpdGhyb3cgbmV3IEYoIm5lYXIgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyBhbmQgbGVzcyB0aGFuIGZhci4iKTt0Ll9sZWZ0PXQubGVmdCx0Ll9yaWdodD10LnJpZ2h0LHQuX3RvcD10LnRvcCx0Ll9ib3R0b209dC5ib3R0b20sdC5fbmVhcj10Lm5lYXIsdC5fZmFyPXQuZmFyLHQuX29ydGhvZ3JhcGhpY01hdHJpeD1zdC5jb21wdXRlT3J0aG9ncmFwaGljT2ZmQ2VudGVyKHQubGVmdCx0LnJpZ2h0LHQuYm90dG9tLHQudG9wLHQubmVhcix0LmZhcix0Ll9vcnRob2dyYXBoaWNNYXRyaXgpfX12YXIgSUwsdkwsTEwseF8sVE8sT089WigoKT0+e0Z0KCk7aHIoKTtDXygpO0l0KCk7ZnQoKTtIdCgpO1d0KCk7Qm4oKTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhsaS5wcm90b3R5cGUse3Byb2plY3Rpb25NYXRyaXg6e2dldDpmdW5jdGlvbigpe3JldHVybiB3Tyh0aGlzKSx0aGlzLl9vcnRob2dyYXBoaWNNYXRyaXh9fX0pO0lMPW5ldyBhLHZMPW5ldyBhLExMPW5ldyBhLHhfPW5ldyBhO2xpLnByb3RvdHlwZS5jb21wdXRlQ3VsbGluZ1ZvbHVtZT1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEYoInBvc2l0aW9uIGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBGKCJkaXJlY3Rpb24gaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEYoInVwIGlzIHJlcXVpcmVkLiIpO2xldCBvPXRoaXMuX2N1bGxpbmdWb2x1bWUucGxhbmVzLHI9dGhpcy50b3AsaT10aGlzLmJvdHRvbSxzPXRoaXMucmlnaHQsZj10aGlzLmxlZnQsdT10aGlzLm5lYXIsYz10aGlzLmZhcixsPWEuY3Jvc3MoZSxuLElMKTthLm5vcm1hbGl6ZShsLGwpO2xldCBwPXZMO2EubXVsdGlwbHlCeVNjYWxhcihlLHUscCksYS5hZGQodCxwLHApO2xldCBkPUxMO2EubXVsdGlwbHlCeVNjYWxhcihsLGYsZCksYS5hZGQocCxkLGQpO2xldCBtPW9bMF07cmV0dXJuIGgobSl8fChtPW9bMF09bmV3IGhlKSxtLng9bC54LG0ueT1sLnksbS56PWwueixtLnc9LWEuZG90KGwsZCksYS5tdWx0aXBseUJ5U2NhbGFyKGwscyxkKSxhLmFkZChwLGQsZCksbT1vWzFdLGgobSl8fChtPW9bMV09bmV3IGhlKSxtLng9LWwueCxtLnk9LWwueSxtLno9LWwueixtLnc9LWEuZG90KGEubmVnYXRlKGwseF8pLGQpLGEubXVsdGlwbHlCeVNjYWxhcihuLGksZCksYS5hZGQocCxkLGQpLG09b1syXSxoKG0pfHwobT1vWzJdPW5ldyBoZSksbS54PW4ueCxtLnk9bi55LG0uej1uLnosbS53PS1hLmRvdChuLGQpLGEubXVsdGlwbHlCeVNjYWxhcihuLHIsZCksYS5hZGQocCxkLGQpLG09b1szXSxoKG0pfHwobT1vWzNdPW5ldyBoZSksbS54PS1uLngsbS55PS1uLnksbS56PS1uLnosbS53PS1hLmRvdChhLm5lZ2F0ZShuLHhfKSxkKSxtPW9bNF0saChtKXx8KG09b1s0XT1uZXcgaGUpLG0ueD1lLngsbS55PWUueSxtLno9ZS56LG0udz0tYS5kb3QoZSxwKSxhLm11bHRpcGx5QnlTY2FsYXIoZSxjLGQpLGEuYWRkKHQsZCxkKSxtPW9bNV0saChtKXx8KG09b1s1XT1uZXcgaGUpLG0ueD0tZS54LG0ueT0tZS55LG0uej0tZS56LG0udz0tYS5kb3QoYS5uZWdhdGUoZSx4XyksZCksdGhpcy5fY3VsbGluZ1ZvbHVtZX07bGkucHJvdG90eXBlLmdldFBpeGVsRGltZW5zaW9ucz1mdW5jdGlvbih0LGUsbixvLHIpe2lmKHdPKHRoaXMpLCFoKHQpfHwhaChlKSl0aHJvdyBuZXcgRigiQm90aCBkcmF3aW5nQnVmZmVyV2lkdGggYW5kIGRyYXdpbmdCdWZmZXJIZWlnaHQgYXJlIHJlcXVpcmVkLiIpO2lmKHQ8PTApdGhyb3cgbmV3IEYoImRyYXdpbmdCdWZmZXJXaWR0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpO2lmKGU8PTApdGhyb3cgbmV3IEYoImRyYXdpbmdCdWZmZXJIZWlnaHQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTtpZighaChuKSl0aHJvdyBuZXcgRigiZGlzdGFuY2UgaXMgcmVxdWlyZWQuIik7aWYoIWgobykpdGhyb3cgbmV3IEYoInBpeGVsUmF0aW8gaXMgcmVxdWlyZWQuIik7aWYobzw9MCl0aHJvdyBuZXcgRigicGl4ZWxSYXRpbyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpO2lmKCFoKHIpKXRocm93IG5ldyBGKCJBIHJlc3VsdCBvYmplY3QgaXMgcmVxdWlyZWQuIik7bGV0IGk9dGhpcy5yaWdodC10aGlzLmxlZnQscz10aGlzLnRvcC10aGlzLmJvdHRvbSxmPW8qaS90LHU9bypzL2U7cmV0dXJuIHIueD1mLHIueT11LHJ9O2xpLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gaCh0KXx8KHQ9bmV3IGxpKSx0LmxlZnQ9dGhpcy5sZWZ0LHQucmlnaHQ9dGhpcy5yaWdodCx0LnRvcD10aGlzLnRvcCx0LmJvdHRvbT10aGlzLmJvdHRvbSx0Lm5lYXI9dGhpcy5uZWFyLHQuZmFyPXRoaXMuZmFyLHQuX2xlZnQ9dm9pZCAwLHQuX3JpZ2h0PXZvaWQgMCx0Ll90b3A9dm9pZCAwLHQuX2JvdHRvbT12b2lkIDAsdC5fbmVhcj12b2lkIDAsdC5fZmFyPXZvaWQgMCx0fTtsaS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBoKHQpJiZ0IGluc3RhbmNlb2YgbGkmJnRoaXMucmlnaHQ9PT10LnJpZ2h0JiZ0aGlzLmxlZnQ9PT10LmxlZnQmJnRoaXMudG9wPT09dC50b3AmJnRoaXMuYm90dG9tPT09dC5ib3R0b20mJnRoaXMubmVhcj09PXQubmVhciYmdGhpcy5mYXI9PT10LmZhcn07bGkucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PT09dGhpc3x8aCh0KSYmdCBpbnN0YW5jZW9mIGxpJiZNLmVxdWFsc0Vwc2lsb24odGhpcy5yaWdodCx0LnJpZ2h0LGUsbikmJk0uZXF1YWxzRXBzaWxvbih0aGlzLmxlZnQsdC5sZWZ0LGUsbikmJk0uZXF1YWxzRXBzaWxvbih0aGlzLnRvcCx0LnRvcCxlLG4pJiZNLmVxdWFsc0Vwc2lsb24odGhpcy5ib3R0b20sdC5ib3R0b20sZSxuKSYmTS5lcXVhbHNFcHNpbG9uKHRoaXMubmVhcix0Lm5lYXIsZSxuKSYmTS5lcXVhbHNFcHNpbG9uKHRoaXMuZmFyLHQuZmFyLGUsbil9O1RPPWxpfSk7ZnVuY3Rpb24gZXIodCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpLHRoaXMuX29mZkNlbnRlckZydXN0dW09bmV3IFRPLHRoaXMud2lkdGg9dC53aWR0aCx0aGlzLl93aWR0aD12b2lkIDAsdGhpcy5hc3BlY3RSYXRpbz10LmFzcGVjdFJhdGlvLHRoaXMuX2FzcGVjdFJhdGlvPXZvaWQgMCx0aGlzLm5lYXI9eCh0Lm5lYXIsMSksdGhpcy5fbmVhcj10aGlzLm5lYXIsdGhpcy5mYXI9eCh0LmZhciw1ZTgpLHRoaXMuX2Zhcj10aGlzLmZhcn1mdW5jdGlvbiBicyh0KXtpZighaCh0LndpZHRoKXx8IWgodC5hc3BlY3RSYXRpbyl8fCFoKHQubmVhcil8fCFoKHQuZmFyKSl0aHJvdyBuZXcgRigid2lkdGgsIGFzcGVjdFJhdGlvLCBuZWFyLCBvciBmYXIgcGFyYW1ldGVycyBhcmUgbm90IHNldC4iKTtsZXQgZT10Ll9vZmZDZW50ZXJGcnVzdHVtO2lmKHQud2lkdGghPT10Ll93aWR0aHx8dC5hc3BlY3RSYXRpbyE9PXQuX2FzcGVjdFJhdGlvfHx0Lm5lYXIhPT10Ll9uZWFyfHx0LmZhciE9PXQuX2Zhcil7aWYodC5hc3BlY3RSYXRpbzwwKXRocm93IG5ldyBGKCJhc3BlY3RSYXRpbyBtdXN0IGJlIHBvc2l0aXZlLiIpO2lmKHQubmVhcjwwfHx0Lm5lYXI+dC5mYXIpdGhyb3cgbmV3IEYoIm5lYXIgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyBhbmQgbGVzcyB0aGFuIGZhci4iKTt0Ll9hc3BlY3RSYXRpbz10LmFzcGVjdFJhdGlvLHQuX3dpZHRoPXQud2lkdGgsdC5fbmVhcj10Lm5lYXIsdC5fZmFyPXQuZmFyO2xldCBuPTEvdC5hc3BlY3RSYXRpbztlLnJpZ2h0PXQud2lkdGgqLjUsZS5sZWZ0PS1lLnJpZ2h0LGUudG9wPW4qZS5yaWdodCxlLmJvdHRvbT0tZS50b3AsZS5uZWFyPXQubmVhcixlLmZhcj10LmZhcn19dmFyIHhvLFBfPVooKCk9PntYdCgpO0l0KCk7ZnQoKTtIdCgpO1d0KCk7T08oKTtlci5wYWNrZWRMZW5ndGg9NDtlci5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCkseS5kZWZpbmVkKCJhcnJheSIsZSksbj14KG4sMCksZVtuKytdPXQud2lkdGgsZVtuKytdPXQuYXNwZWN0UmF0aW8sZVtuKytdPXQubmVhcixlW25dPXQuZmFyLGV9O2VyLnVucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkuZGVmaW5lZCgiYXJyYXkiLHQpLGU9eChlLDApLGgobil8fChuPW5ldyBlciksbi53aWR0aD10W2UrK10sbi5hc3BlY3RSYXRpbz10W2UrK10sbi5uZWFyPXRbZSsrXSxuLmZhcj10W2VdLG59O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGVyLnByb3RvdHlwZSx7cHJvamVjdGlvbk1hdHJpeDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGJzKHRoaXMpLHRoaXMuX29mZkNlbnRlckZydXN0dW0ucHJvamVjdGlvbk1hdHJpeH19LG9mZkNlbnRlckZydXN0dW06e2dldDpmdW5jdGlvbigpe3JldHVybiBicyh0aGlzKSx0aGlzLl9vZmZDZW50ZXJGcnVzdHVtfX19KTtlci5wcm90b3R5cGUuY29tcHV0ZUN1bGxpbmdWb2x1bWU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBicyh0aGlzKSx0aGlzLl9vZmZDZW50ZXJGcnVzdHVtLmNvbXB1dGVDdWxsaW5nVm9sdW1lKHQsZSxuKX07ZXIucHJvdG90eXBlLmdldFBpeGVsRGltZW5zaW9ucz1mdW5jdGlvbih0LGUsbixvLHIpe3JldHVybiBicyh0aGlzKSx0aGlzLl9vZmZDZW50ZXJGcnVzdHVtLmdldFBpeGVsRGltZW5zaW9ucyh0LGUsbixvLHIpfTtlci5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIGgodCl8fCh0PW5ldyBlciksdC5hc3BlY3RSYXRpbz10aGlzLmFzcGVjdFJhdGlvLHQud2lkdGg9dGhpcy53aWR0aCx0Lm5lYXI9dGhpcy5uZWFyLHQuZmFyPXRoaXMuZmFyLHQuX2FzcGVjdFJhdGlvPXZvaWQgMCx0Ll93aWR0aD12b2lkIDAsdC5fbmVhcj12b2lkIDAsdC5fZmFyPXZvaWQgMCx0aGlzLl9vZmZDZW50ZXJGcnVzdHVtLmNsb25lKHQuX29mZkNlbnRlckZydXN0dW0pLHR9O2VyLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIWgodCl8fCEodCBpbnN0YW5jZW9mIGVyKT8hMTooYnModGhpcyksYnModCksdGhpcy53aWR0aD09PXQud2lkdGgmJnRoaXMuYXNwZWN0UmF0aW89PT10LmFzcGVjdFJhdGlvJiZ0aGlzLl9vZmZDZW50ZXJGcnVzdHVtLmVxdWFscyh0Ll9vZmZDZW50ZXJGcnVzdHVtKSl9O2VyLnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4haCh0KXx8ISh0IGluc3RhbmNlb2YgZXIpPyExOihicyh0aGlzKSxicyh0KSxNLmVxdWFsc0Vwc2lsb24odGhpcy53aWR0aCx0LndpZHRoLGUsbikmJk0uZXF1YWxzRXBzaWxvbih0aGlzLmFzcGVjdFJhdGlvLHQuYXNwZWN0UmF0aW8sZSxuKSYmdGhpcy5fb2ZmQ2VudGVyRnJ1c3R1bS5lcXVhbHNFcHNpbG9uKHQuX29mZkNlbnRlckZydXN0dW0sZSxuKSl9O3hvPWVyfSk7ZnVuY3Rpb24gcGkodCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpLHRoaXMubGVmdD10LmxlZnQsdGhpcy5fbGVmdD12b2lkIDAsdGhpcy5yaWdodD10LnJpZ2h0LHRoaXMuX3JpZ2h0PXZvaWQgMCx0aGlzLnRvcD10LnRvcCx0aGlzLl90b3A9dm9pZCAwLHRoaXMuYm90dG9tPXQuYm90dG9tLHRoaXMuX2JvdHRvbT12b2lkIDAsdGhpcy5uZWFyPXgodC5uZWFyLDEpLHRoaXMuX25lYXI9dGhpcy5uZWFyLHRoaXMuZmFyPXgodC5mYXIsNWU4KSx0aGlzLl9mYXI9dGhpcy5mYXIsdGhpcy5fY3VsbGluZ1ZvbHVtZT1uZXcgYmQsdGhpcy5fcGVyc3BlY3RpdmVNYXRyaXg9bmV3IHN0LHRoaXMuX2luZmluaXRlUGVyc3BlY3RpdmU9bmV3IHN0fWZ1bmN0aW9uIE1fKHQpe2lmKCFoKHQucmlnaHQpfHwhaCh0LmxlZnQpfHwhaCh0LnRvcCl8fCFoKHQuYm90dG9tKXx8IWgodC5uZWFyKXx8IWgodC5mYXIpKXRocm93IG5ldyBGKCJyaWdodCwgbGVmdCwgdG9wLCBib3R0b20sIG5lYXIsIG9yIGZhciBwYXJhbWV0ZXJzIGFyZSBub3Qgc2V0LiIpO2xldCBlPXQudG9wLG49dC5ib3R0b20sbz10LnJpZ2h0LHI9dC5sZWZ0LGk9dC5uZWFyLHM9dC5mYXI7aWYoZSE9PXQuX3RvcHx8biE9PXQuX2JvdHRvbXx8ciE9PXQuX2xlZnR8fG8hPT10Ll9yaWdodHx8aSE9PXQuX25lYXJ8fHMhPT10Ll9mYXIpe2lmKHQubmVhcjw9MHx8dC5uZWFyPnQuZmFyKXRocm93IG5ldyBGKCJuZWFyIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8gYW5kIGxlc3MgdGhhbiBmYXIuIik7dC5fbGVmdD1yLHQuX3JpZ2h0PW8sdC5fdG9wPWUsdC5fYm90dG9tPW4sdC5fbmVhcj1pLHQuX2Zhcj1zLHQuX3BlcnNwZWN0aXZlTWF0cml4PXN0LmNvbXB1dGVQZXJzcGVjdGl2ZU9mZkNlbnRlcihyLG8sbixlLGkscyx0Ll9wZXJzcGVjdGl2ZU1hdHJpeCksdC5faW5maW5pdGVQZXJzcGVjdGl2ZT1zdC5jb21wdXRlSW5maW5pdGVQZXJzcGVjdGl2ZU9mZkNlbnRlcihyLG8sbixlLGksdC5faW5maW5pdGVQZXJzcGVjdGl2ZSl9fXZhciBETCxGTCxCTCxVTCxFTyxSTz1aKCgpPT57RnQoKTtocigpO0NfKCk7SXQoKTtmdCgpO0h0KCk7V3QoKTtCbigpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHBpLnByb3RvdHlwZSx7cHJvamVjdGlvbk1hdHJpeDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE1fKHRoaXMpLHRoaXMuX3BlcnNwZWN0aXZlTWF0cml4fX0saW5maW5pdGVQcm9qZWN0aW9uTWF0cml4OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gTV8odGhpcyksdGhpcy5faW5maW5pdGVQZXJzcGVjdGl2ZX19fSk7REw9bmV3IGEsRkw9bmV3IGEsQkw9bmV3IGEsVUw9bmV3IGE7cGkucHJvdG90eXBlLmNvbXB1dGVDdWxsaW5nVm9sdW1lPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgRigicG9zaXRpb24gaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEYoImRpcmVjdGlvbiBpcyByZXF1aXJlZC4iKTtpZighaChuKSl0aHJvdyBuZXcgRigidXAgaXMgcmVxdWlyZWQuIik7bGV0IG89dGhpcy5fY3VsbGluZ1ZvbHVtZS5wbGFuZXMscj10aGlzLnRvcCxpPXRoaXMuYm90dG9tLHM9dGhpcy5yaWdodCxmPXRoaXMubGVmdCx1PXRoaXMubmVhcixjPXRoaXMuZmFyLGw9YS5jcm9zcyhlLG4sREwpLHA9Rkw7YS5tdWx0aXBseUJ5U2NhbGFyKGUsdSxwKSxhLmFkZCh0LHAscCk7bGV0IGQ9Qkw7YS5tdWx0aXBseUJ5U2NhbGFyKGUsYyxkKSxhLmFkZCh0LGQsZCk7bGV0IG09VUw7YS5tdWx0aXBseUJ5U2NhbGFyKGwsZixtKSxhLmFkZChwLG0sbSksYS5zdWJ0cmFjdChtLHQsbSksYS5ub3JtYWxpemUobSxtKSxhLmNyb3NzKG0sbixtKSxhLm5vcm1hbGl6ZShtLG0pO2xldCBfPW9bMF07cmV0dXJuIGgoXyl8fChfPW9bMF09bmV3IGhlKSxfLng9bS54LF8ueT1tLnksXy56PW0ueixfLnc9LWEuZG90KG0sdCksYS5tdWx0aXBseUJ5U2NhbGFyKGwscyxtKSxhLmFkZChwLG0sbSksYS5zdWJ0cmFjdChtLHQsbSksYS5jcm9zcyhuLG0sbSksYS5ub3JtYWxpemUobSxtKSxfPW9bMV0saChfKXx8KF89b1sxXT1uZXcgaGUpLF8ueD1tLngsXy55PW0ueSxfLno9bS56LF8udz0tYS5kb3QobSx0KSxhLm11bHRpcGx5QnlTY2FsYXIobixpLG0pLGEuYWRkKHAsbSxtKSxhLnN1YnRyYWN0KG0sdCxtKSxhLmNyb3NzKGwsbSxtKSxhLm5vcm1hbGl6ZShtLG0pLF89b1syXSxoKF8pfHwoXz1vWzJdPW5ldyBoZSksXy54PW0ueCxfLnk9bS55LF8uej1tLnosXy53PS1hLmRvdChtLHQpLGEubXVsdGlwbHlCeVNjYWxhcihuLHIsbSksYS5hZGQocCxtLG0pLGEuc3VidHJhY3QobSx0LG0pLGEuY3Jvc3MobSxsLG0pLGEubm9ybWFsaXplKG0sbSksXz1vWzNdLGgoXyl8fChfPW9bM109bmV3IGhlKSxfLng9bS54LF8ueT1tLnksXy56PW0ueixfLnc9LWEuZG90KG0sdCksXz1vWzRdLGgoXyl8fChfPW9bNF09bmV3IGhlKSxfLng9ZS54LF8ueT1lLnksXy56PWUueixfLnc9LWEuZG90KGUscCksYS5uZWdhdGUoZSxtKSxfPW9bNV0saChfKXx8KF89b1s1XT1uZXcgaGUpLF8ueD1tLngsXy55PW0ueSxfLno9bS56LF8udz0tYS5kb3QobSxkKSx0aGlzLl9jdWxsaW5nVm9sdW1lfTtwaS5wcm90b3R5cGUuZ2V0UGl4ZWxEaW1lbnNpb25zPWZ1bmN0aW9uKHQsZSxuLG8scil7aWYoTV8odGhpcyksIWgodCl8fCFoKGUpKXRocm93IG5ldyBGKCJCb3RoIGRyYXdpbmdCdWZmZXJXaWR0aCBhbmQgZHJhd2luZ0J1ZmZlckhlaWdodCBhcmUgcmVxdWlyZWQuIik7aWYodDw9MCl0aHJvdyBuZXcgRigiZHJhd2luZ0J1ZmZlcldpZHRoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7aWYoZTw9MCl0aHJvdyBuZXcgRigiZHJhd2luZ0J1ZmZlckhlaWdodCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpO2lmKCFoKG4pKXRocm93IG5ldyBGKCJkaXN0YW5jZSBpcyByZXF1aXJlZC4iKTtpZighaChvKSl0aHJvdyBuZXcgRigicGl4ZWxSYXRpbyBpcyByZXF1aXJlZCIpO2lmKG88PTApdGhyb3cgbmV3IEYoInBpeGVsUmF0aW8gbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTtpZighaChyKSl0aHJvdyBuZXcgRigiQSByZXN1bHQgb2JqZWN0IGlzIHJlcXVpcmVkLiIpO2xldCBpPTEvdGhpcy5uZWFyLHM9dGhpcy50b3AqaSxmPTIqbypuKnMvZTtzPXRoaXMucmlnaHQqaTtsZXQgdT0yKm8qbipzL3Q7cmV0dXJuIHIueD11LHIueT1mLHJ9O3BpLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gaCh0KXx8KHQ9bmV3IHBpKSx0LnJpZ2h0PXRoaXMucmlnaHQsdC5sZWZ0PXRoaXMubGVmdCx0LnRvcD10aGlzLnRvcCx0LmJvdHRvbT10aGlzLmJvdHRvbSx0Lm5lYXI9dGhpcy5uZWFyLHQuZmFyPXRoaXMuZmFyLHQuX2xlZnQ9dm9pZCAwLHQuX3JpZ2h0PXZvaWQgMCx0Ll90b3A9dm9pZCAwLHQuX2JvdHRvbT12b2lkIDAsdC5fbmVhcj12b2lkIDAsdC5fZmFyPXZvaWQgMCx0fTtwaS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBoKHQpJiZ0IGluc3RhbmNlb2YgcGkmJnRoaXMucmlnaHQ9PT10LnJpZ2h0JiZ0aGlzLmxlZnQ9PT10LmxlZnQmJnRoaXMudG9wPT09dC50b3AmJnRoaXMuYm90dG9tPT09dC5ib3R0b20mJnRoaXMubmVhcj09PXQubmVhciYmdGhpcy5mYXI9PT10LmZhcn07cGkucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PT09dGhpc3x8aCh0KSYmdCBpbnN0YW5jZW9mIHBpJiZNLmVxdWFsc0Vwc2lsb24odGhpcy5yaWdodCx0LnJpZ2h0LGUsbikmJk0uZXF1YWxzRXBzaWxvbih0aGlzLmxlZnQsdC5sZWZ0LGUsbikmJk0uZXF1YWxzRXBzaWxvbih0aGlzLnRvcCx0LnRvcCxlLG4pJiZNLmVxdWFsc0Vwc2lsb24odGhpcy5ib3R0b20sdC5ib3R0b20sZSxuKSYmTS5lcXVhbHNFcHNpbG9uKHRoaXMubmVhcix0Lm5lYXIsZSxuKSYmTS5lcXVhbHNFcHNpbG9uKHRoaXMuZmFyLHQuZmFyLGUsbil9O0VPPXBpfSk7ZnVuY3Rpb24gbnIodCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpLHRoaXMuX29mZkNlbnRlckZydXN0dW09bmV3IEVPLHRoaXMuZm92PXQuZm92LHRoaXMuX2Zvdj12b2lkIDAsdGhpcy5fZm92eT12b2lkIDAsdGhpcy5fc3NlRGVub21pbmF0b3I9dm9pZCAwLHRoaXMuYXNwZWN0UmF0aW89dC5hc3BlY3RSYXRpbyx0aGlzLl9hc3BlY3RSYXRpbz12b2lkIDAsdGhpcy5uZWFyPXgodC5uZWFyLDEpLHRoaXMuX25lYXI9dGhpcy5uZWFyLHRoaXMuZmFyPXgodC5mYXIsNWU4KSx0aGlzLl9mYXI9dGhpcy5mYXIsdGhpcy54T2Zmc2V0PXgodC54T2Zmc2V0LDApLHRoaXMuX3hPZmZzZXQ9dGhpcy54T2Zmc2V0LHRoaXMueU9mZnNldD14KHQueU9mZnNldCwwKSx0aGlzLl95T2Zmc2V0PXRoaXMueU9mZnNldH1mdW5jdGlvbiBYcih0KXtpZighaCh0LmZvdil8fCFoKHQuYXNwZWN0UmF0aW8pfHwhaCh0Lm5lYXIpfHwhaCh0LmZhcikpdGhyb3cgbmV3IEYoImZvdiwgYXNwZWN0UmF0aW8sIG5lYXIsIG9yIGZhciBwYXJhbWV0ZXJzIGFyZSBub3Qgc2V0LiIpO2xldCBlPXQuX29mZkNlbnRlckZydXN0dW07aWYodC5mb3YhPT10Ll9mb3Z8fHQuYXNwZWN0UmF0aW8hPT10Ll9hc3BlY3RSYXRpb3x8dC5uZWFyIT09dC5fbmVhcnx8dC5mYXIhPT10Ll9mYXJ8fHQueE9mZnNldCE9PXQuX3hPZmZzZXR8fHQueU9mZnNldCE9PXQuX3lPZmZzZXQpe2lmKHQuZm92PDB8fHQuZm92Pj1NYXRoLlBJKXRocm93IG5ldyBGKCJmb3YgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsIFBJKS4iKTtpZih0LmFzcGVjdFJhdGlvPDApdGhyb3cgbmV3IEYoImFzcGVjdFJhdGlvIG11c3QgYmUgcG9zaXRpdmUuIik7aWYodC5uZWFyPDB8fHQubmVhcj50LmZhcil0aHJvdyBuZXcgRigibmVhciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCBsZXNzIHRoYW4gZmFyLiIpO3QuX2FzcGVjdFJhdGlvPXQuYXNwZWN0UmF0aW8sdC5fZm92PXQuZm92LHQuX2Zvdnk9dC5hc3BlY3RSYXRpbzw9MT90LmZvdjpNYXRoLmF0YW4oTWF0aC50YW4odC5mb3YqLjUpL3QuYXNwZWN0UmF0aW8pKjIsdC5fbmVhcj10Lm5lYXIsdC5fZmFyPXQuZmFyLHQuX3NzZURlbm9taW5hdG9yPTIqTWF0aC50YW4oLjUqdC5fZm92eSksdC5feE9mZnNldD10LnhPZmZzZXQsdC5feU9mZnNldD10LnlPZmZzZXQsZS50b3A9dC5uZWFyKk1hdGgudGFuKC41KnQuX2ZvdnkpLGUuYm90dG9tPS1lLnRvcCxlLnJpZ2h0PXQuYXNwZWN0UmF0aW8qZS50b3AsZS5sZWZ0PS1lLnJpZ2h0LGUubmVhcj10Lm5lYXIsZS5mYXI9dC5mYXIsZS5yaWdodCs9dC54T2Zmc2V0LGUubGVmdCs9dC54T2Zmc2V0LGUudG9wKz10LnlPZmZzZXQsZS5ib3R0b20rPXQueU9mZnNldH19dmFyIFBvLE5fPVooKCk9PntYdCgpO0l0KCk7ZnQoKTtIdCgpO1d0KCk7Uk8oKTtuci5wYWNrZWRMZW5ndGg9Njtuci5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCkseS5kZWZpbmVkKCJhcnJheSIsZSksbj14KG4sMCksZVtuKytdPXQuZm92LGVbbisrXT10LmFzcGVjdFJhdGlvLGVbbisrXT10Lm5lYXIsZVtuKytdPXQuZmFyLGVbbisrXT10LnhPZmZzZXQsZVtuXT10LnlPZmZzZXQsZX07bnIudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCksaChuKXx8KG49bmV3IG5yKSxuLmZvdj10W2UrK10sbi5hc3BlY3RSYXRpbz10W2UrK10sbi5uZWFyPXRbZSsrXSxuLmZhcj10W2UrK10sbi54T2Zmc2V0PXRbZSsrXSxuLnlPZmZzZXQ9dFtlXSxufTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhuci5wcm90b3R5cGUse3Byb2plY3Rpb25NYXRyaXg6e2dldDpmdW5jdGlvbigpe3JldHVybiBYcih0aGlzKSx0aGlzLl9vZmZDZW50ZXJGcnVzdHVtLnByb2plY3Rpb25NYXRyaXh9fSxpbmZpbml0ZVByb2plY3Rpb25NYXRyaXg6e2dldDpmdW5jdGlvbigpe3JldHVybiBYcih0aGlzKSx0aGlzLl9vZmZDZW50ZXJGcnVzdHVtLmluZmluaXRlUHJvamVjdGlvbk1hdHJpeH19LGZvdnk6e2dldDpmdW5jdGlvbigpe3JldHVybiBYcih0aGlzKSx0aGlzLl9mb3Z5fX0sc3NlRGVub21pbmF0b3I6e2dldDpmdW5jdGlvbigpe3JldHVybiBYcih0aGlzKSx0aGlzLl9zc2VEZW5vbWluYXRvcn19LG9mZkNlbnRlckZydXN0dW06e2dldDpmdW5jdGlvbigpe3JldHVybiBYcih0aGlzKSx0aGlzLl9vZmZDZW50ZXJGcnVzdHVtfX19KTtuci5wcm90b3R5cGUuY29tcHV0ZUN1bGxpbmdWb2x1bWU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBYcih0aGlzKSx0aGlzLl9vZmZDZW50ZXJGcnVzdHVtLmNvbXB1dGVDdWxsaW5nVm9sdW1lKHQsZSxuKX07bnIucHJvdG90eXBlLmdldFBpeGVsRGltZW5zaW9ucz1mdW5jdGlvbih0LGUsbixvLHIpe3JldHVybiBYcih0aGlzKSx0aGlzLl9vZmZDZW50ZXJGcnVzdHVtLmdldFBpeGVsRGltZW5zaW9ucyh0LGUsbixvLHIpfTtuci5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIGgodCl8fCh0PW5ldyBuciksdC5hc3BlY3RSYXRpbz10aGlzLmFzcGVjdFJhdGlvLHQuZm92PXRoaXMuZm92LHQubmVhcj10aGlzLm5lYXIsdC5mYXI9dGhpcy5mYXIsdC5fYXNwZWN0UmF0aW89dm9pZCAwLHQuX2Zvdj12b2lkIDAsdC5fbmVhcj12b2lkIDAsdC5fZmFyPXZvaWQgMCx0aGlzLl9vZmZDZW50ZXJGcnVzdHVtLmNsb25lKHQuX29mZkNlbnRlckZydXN0dW0pLHR9O25yLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIWgodCl8fCEodCBpbnN0YW5jZW9mIG5yKT8hMTooWHIodGhpcyksWHIodCksdGhpcy5mb3Y9PT10LmZvdiYmdGhpcy5hc3BlY3RSYXRpbz09PXQuYXNwZWN0UmF0aW8mJnRoaXMuX29mZkNlbnRlckZydXN0dW0uZXF1YWxzKHQuX29mZkNlbnRlckZydXN0dW0pKX07bnIucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiFoKHQpfHwhKHQgaW5zdGFuY2VvZiBucik/ITE6KFhyKHRoaXMpLFhyKHQpLE0uZXF1YWxzRXBzaWxvbih0aGlzLmZvdix0LmZvdixlLG4pJiZNLmVxdWFsc0Vwc2lsb24odGhpcy5hc3BlY3RSYXRpbyx0LmFzcGVjdFJhdGlvLGUsbikmJnRoaXMuX29mZkNlbnRlckZydXN0dW0uZXF1YWxzRXBzaWxvbih0Ll9vZmZDZW50ZXJGcnVzdHVtLGUsbikpfTtQbz1ucn0pO2Z1bmN0aW9uIGdjKHQpe3kudHlwZU9mLm9iamVjdCgib3B0aW9ucyIsdCkseS50eXBlT2Yub2JqZWN0KCJvcHRpb25zLmZydXN0dW0iLHQuZnJ1c3R1bSkseS50eXBlT2Yub2JqZWN0KCJvcHRpb25zLm9yaWdpbiIsdC5vcmlnaW4pLHkudHlwZU9mLm9iamVjdCgib3B0aW9ucy5vcmllbnRhdGlvbiIsdC5vcmllbnRhdGlvbik7bGV0IGU9dC5mcnVzdHVtLG49dC5vcmllbnRhdGlvbixvPXQub3JpZ2luLHI9eCh0LnZlcnRleEZvcm1hdCxkdC5ERUZBVUxUKSxpPXgodC5fZHJhd05lYXJQbGFuZSwhMCkscyxmO2UgaW5zdGFuY2VvZiBQbz8ocz13ZCxmPVBvLnBhY2tlZExlbmd0aCk6ZSBpbnN0YW5jZW9mIHhvJiYocz1WTCxmPXhvLnBhY2tlZExlbmd0aCksdGhpcy5fZnJ1c3R1bVR5cGU9cyx0aGlzLl9mcnVzdHVtPWUuY2xvbmUoKSx0aGlzLl9vcmlnaW49YS5jbG9uZShvKSx0aGlzLl9vcmllbnRhdGlvbj1lZS5jbG9uZShuKSx0aGlzLl9kcmF3TmVhclBsYW5lPWksdGhpcy5fdmVydGV4Rm9ybWF0PXIsdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlRnJ1c3R1bUdlb21ldHJ5Iix0aGlzLnBhY2tlZExlbmd0aD0yK2YrYS5wYWNrZWRMZW5ndGgrZWUucGFja2VkTGVuZ3RoK2R0LnBhY2tlZExlbmd0aH1mdW5jdGlvbiBFYSh0LGUsbixvLHIsaSxzLGYpe2xldCB1PXQvMyoyO2ZvcihsZXQgYz0wO2M8NDsrK2MpaChlKSYmKGVbdF09aS54LGVbdCsxXT1pLnksZVt0KzJdPWkueiksaChuKSYmKG5bdF09cy54LG5bdCsxXT1zLnksblt0KzJdPXMueiksaChvKSYmKG9bdF09Zi54LG9bdCsxXT1mLnksb1t0KzJdPWYueiksdCs9MztyW3VdPTAsclt1KzFdPTAsclt1KzJdPTEsclt1KzNdPTAsclt1KzRdPTEsclt1KzVdPTEsclt1KzZdPTAsclt1KzddPTF9dmFyIHdkLFZMLGtMLEdMLHpMLGpMLEhMLHFMLEtMLElfLFNPLENPLHhPLFdMLFhMLFlMLHdzLHFmLFBPLEtmLHZfPVooKCk9PntNZSgpO0Z0KCk7aHIoKTtYdCgpO0xlKCk7SXQoKTtmdCgpO1hlKCk7WWUoKTthbigpO0ZuKCk7Qm4oKTtQXygpO05fKCk7dG4oKTtXbygpO0VvKCk7d2Q9MCxWTD0xO2djLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49eChuLDApO2xldCBvPXQuX2ZydXN0dW1UeXBlLHI9dC5fZnJ1c3R1bTtyZXR1cm4gZVtuKytdPW8sbz09PXdkPyhQby5wYWNrKHIsZSxuKSxuKz1Qby5wYWNrZWRMZW5ndGgpOih4by5wYWNrKHIsZSxuKSxuKz14by5wYWNrZWRMZW5ndGgpLGEucGFjayh0Ll9vcmlnaW4sZSxuKSxuKz1hLnBhY2tlZExlbmd0aCxlZS5wYWNrKHQuX29yaWVudGF0aW9uLGUsbiksbis9ZWUucGFja2VkTGVuZ3RoLGR0LnBhY2sodC5fdmVydGV4Rm9ybWF0LGUsbiksbis9ZHQucGFja2VkTGVuZ3RoLGVbbl09dC5fZHJhd05lYXJQbGFuZT8xOjAsZX07a0w9bmV3IFBvLEdMPW5ldyB4byx6TD1uZXcgZWUsakw9bmV3IGEsSEw9bmV3IGR0O2djLnVucGFjaz1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCk7bGV0IG89dFtlKytdLHI7bz09PXdkPyhyPVBvLnVucGFjayh0LGUsa0wpLGUrPVBvLnBhY2tlZExlbmd0aCk6KHI9eG8udW5wYWNrKHQsZSxHTCksZSs9eG8ucGFja2VkTGVuZ3RoKTtsZXQgaT1hLnVucGFjayh0LGUsakwpO2UrPWEucGFja2VkTGVuZ3RoO2xldCBzPWVlLnVucGFjayh0LGUsekwpO2UrPWVlLnBhY2tlZExlbmd0aDtsZXQgZj1kdC51bnBhY2sodCxlLEhMKTtlKz1kdC5wYWNrZWRMZW5ndGg7bGV0IHU9dFtlXT09PTE7aWYoIWgobikpcmV0dXJuIG5ldyBnYyh7ZnJ1c3R1bTpyLG9yaWdpbjppLG9yaWVudGF0aW9uOnMsdmVydGV4Rm9ybWF0OmYsX2RyYXdOZWFyUGxhbmU6dX0pO2xldCBjPW89PT1uLl9mcnVzdHVtVHlwZT9uLl9mcnVzdHVtOnZvaWQgMDtyZXR1cm4gbi5fZnJ1c3R1bT1yLmNsb25lKGMpLG4uX2ZydXN0dW1UeXBlPW8sbi5fb3JpZ2luPWEuY2xvbmUoaSxuLl9vcmlnaW4pLG4uX29yaWVudGF0aW9uPWVlLmNsb25lKHMsbi5fb3JpZW50YXRpb24pLG4uX3ZlcnRleEZvcm1hdD1kdC5jbG9uZShmLG4uX3ZlcnRleEZvcm1hdCksbi5fZHJhd05lYXJQbGFuZT11LG59O3FMPW5ldyBKLEtMPW5ldyBzdCxJXz1uZXcgc3QsU089bmV3IGEsQ089bmV3IGEseE89bmV3IGEsV0w9bmV3IGEsWEw9bmV3IGEsWUw9bmV3IGEsd3M9bmV3IEFycmF5KDMpLHFmPW5ldyBBcnJheSg0KTtxZlswXT1uZXcgaGUoLTEsLTEsMSwxKTtxZlsxXT1uZXcgaGUoMSwtMSwxLDEpO3FmWzJdPW5ldyBoZSgxLDEsMSwxKTtxZlszXT1uZXcgaGUoLTEsMSwxLDEpO1BPPW5ldyBBcnJheSg0KTtmb3IobGV0IHQ9MDt0PDQ7Kyt0KVBPW3RdPW5ldyBoZTtnYy5fY29tcHV0ZU5lYXJGYXJQbGFuZXM9ZnVuY3Rpb24odCxlLG4sbyxyLGkscyxmKXtsZXQgdT1KLmZyb21RdWF0ZXJuaW9uKGUscUwpLGM9eChpLFNPKSxsPXgocyxDTykscD14KGYseE8pO2M9Si5nZXRDb2x1bW4odSwwLGMpLGw9Si5nZXRDb2x1bW4odSwxLGwpLHA9Si5nZXRDb2x1bW4odSwyLHApLGEubm9ybWFsaXplKGMsYyksYS5ub3JtYWxpemUobCxsKSxhLm5vcm1hbGl6ZShwLHApLGEubmVnYXRlKGMsYyk7bGV0IGQ9c3QuY29tcHV0ZVZpZXcodCxwLGwsYyxLTCksbSxfLGc9by5wcm9qZWN0aW9uTWF0cml4O2lmKG49PT13ZCl7bGV0IGI9c3QubXVsdGlwbHkoZyxkLElfKTtfPXN0LmludmVyc2UoYixJXyl9ZWxzZSBtPXN0LmludmVyc2VUcmFuc2Zvcm1hdGlvbihkLElfKTtoKF8pPyh3c1swXT1vLm5lYXIsd3NbMV09by5mYXIpOih3c1swXT0wLHdzWzFdPW8ubmVhcix3c1syXT1vLmZhcik7Zm9yKGxldCBiPTA7YjwyOysrYilmb3IobGV0IHc9MDt3PDQ7Kyt3KXtsZXQgTz1oZS5jbG9uZShxZlt3XSxQT1t3XSk7aWYoaChfKSl7Tz1zdC5tdWx0aXBseUJ5VmVjdG9yKF8sTyxPKTtsZXQgRT0xL08udzthLm11bHRpcGx5QnlTY2FsYXIoTyxFLE8pLGEuc3VidHJhY3QoTyx0LE8pLGEubm9ybWFsaXplKE8sTyk7bGV0IFQ9YS5kb3QocCxPKTthLm11bHRpcGx5QnlTY2FsYXIoTyx3c1tiXS9ULE8pLGEuYWRkKE8sdCxPKX1lbHNle2xldCBFPW8ub2ZmQ2VudGVyRnJ1c3R1bTtoKEUpJiYobz1FKTtsZXQgVD13c1tiXSxDPXdzW2IrMV07Ty54PShPLngqKG8ucmlnaHQtby5sZWZ0KStvLmxlZnQrby5yaWdodCkqLjUsTy55PShPLnkqKG8udG9wLW8uYm90dG9tKStvLmJvdHRvbStvLnRvcCkqLjUsTy56PShPLnoqKFQtQyktVC1DKSouNSxPLnc9MSxzdC5tdWx0aXBseUJ5VmVjdG9yKG0sTyxPKX1yWzEyKmIrdyozXT1PLngsclsxMipiK3cqMysxXT1PLnksclsxMipiK3cqMysyXT1PLnp9fTtnYy5jcmVhdGVHZW9tZXRyeT1mdW5jdGlvbih0KXtsZXQgZT10Ll9mcnVzdHVtVHlwZSxuPXQuX2ZydXN0dW0sbz10Ll9vcmlnaW4scj10Ll9vcmllbnRhdGlvbixpPXQuX2RyYXdOZWFyUGxhbmUscz10Ll92ZXJ0ZXhGb3JtYXQsZj1pPzY6NSx1PW5ldyBGbG9hdDY0QXJyYXkoMyo0KjYpO2djLl9jb21wdXRlTmVhckZhclBsYW5lcyhvLHIsZSxuLHUpO2xldCBjPTMqNCoyO3VbY109dVszKjRdLHVbYysxXT11WzMqNCsxXSx1W2MrMl09dVszKjQrMl0sdVtjKzNdPXVbMF0sdVtjKzRdPXVbMV0sdVtjKzVdPXVbMl0sdVtjKzZdPXVbMyozXSx1W2MrN109dVszKjMrMV0sdVtjKzhdPXVbMyozKzJdLHVbYys5XT11WzMqN10sdVtjKzEwXT11WzMqNysxXSx1W2MrMTFdPXVbMyo3KzJdLGMrPTMqNCx1W2NdPXVbMyo1XSx1W2MrMV09dVszKjUrMV0sdVtjKzJdPXVbMyo1KzJdLHVbYyszXT11WzNdLHVbYys0XT11WzRdLHVbYys1XT11WzVdLHVbYys2XT11WzBdLHVbYys3XT11WzFdLHVbYys4XT11WzJdLHVbYys5XT11WzMqNF0sdVtjKzEwXT11WzMqNCsxXSx1W2MrMTFdPXVbMyo0KzJdLGMrPTMqNCx1W2NdPXVbM10sdVtjKzFdPXVbNF0sdVtjKzJdPXVbNV0sdVtjKzNdPXVbMyo1XSx1W2MrNF09dVszKjUrMV0sdVtjKzVdPXVbMyo1KzJdLHVbYys2XT11WzMqNl0sdVtjKzddPXVbMyo2KzFdLHVbYys4XT11WzMqNisyXSx1W2MrOV09dVszKjJdLHVbYysxMF09dVszKjIrMV0sdVtjKzExXT11WzMqMisyXSxjKz0zKjQsdVtjXT11WzMqMl0sdVtjKzFdPXVbMyoyKzFdLHVbYysyXT11WzMqMisyXSx1W2MrM109dVszKjZdLHVbYys0XT11WzMqNisxXSx1W2MrNV09dVszKjYrMl0sdVtjKzZdPXVbMyo3XSx1W2MrN109dVszKjcrMV0sdVtjKzhdPXVbMyo3KzJdLHVbYys5XT11WzMqM10sdVtjKzEwXT11WzMqMysxXSx1W2MrMTFdPXVbMyozKzJdLGl8fCh1PXUuc3ViYXJyYXkoMyo0KSk7bGV0IGw9bmV3IGllKHtwb3NpdGlvbjpuZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkRPVUJMRSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOnV9KX0pO2lmKGgocy5ub3JtYWwpfHxoKHMudGFuZ2VudCl8fGgocy5iaXRhbmdlbnQpfHxoKHMuc3QpKXtsZXQgZD1oKHMubm9ybWFsKT9uZXcgRmxvYXQzMkFycmF5KDEyKmYpOnZvaWQgMCxtPWgocy50YW5nZW50KT9uZXcgRmxvYXQzMkFycmF5KDMqNCpmKTp2b2lkIDAsXz1oKHMuYml0YW5nZW50KT9uZXcgRmxvYXQzMkFycmF5KDMqNCpmKTp2b2lkIDAsZz1oKHMuc3QpP25ldyBGbG9hdDMyQXJyYXkoMio0KmYpOnZvaWQgMCxiPVNPLHc9Q08sTz14TyxFPWEubmVnYXRlKGIsV0wpLFQ9YS5uZWdhdGUodyxYTCksQz1hLm5lZ2F0ZShPLFlMKTtjPTAsaSYmKEVhKGMsZCxtLF8sZyxDLGIsdyksYys9Myo0KSxFYShjLGQsbSxfLGcsTyxFLHcpLGMrPTMqNCxFYShjLGQsbSxfLGcsRSxDLHcpLGMrPTMqNCxFYShjLGQsbSxfLGcsVCxDLEUpLGMrPTMqNCxFYShjLGQsbSxfLGcsYixPLHcpLGMrPTMqNCxFYShjLGQsbSxfLGcsdyxPLEUpLGgoZCkmJihsLm5vcm1hbD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6ZH0pKSxoKG0pJiYobC50YW5nZW50PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczptfSkpLGgoXykmJihsLmJpdGFuZ2VudD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6X30pKSxoKGcpJiYobC5zdD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Mix2YWx1ZXM6Z30pKX1sZXQgcD1uZXcgVWludDE2QXJyYXkoNipmKTtmb3IobGV0IGQ9MDtkPGY7KytkKXtsZXQgbT1kKjYsXz1kKjQ7cFttXT1fLHBbbSsxXT1fKzEscFttKzJdPV8rMixwW20rM109XyxwW20rNF09XysyLHBbbSs1XT1fKzN9cmV0dXJuIG5ldyBVdCh7YXR0cmlidXRlczpsLGluZGljZXM6cCxwcmltaXRpdmVUeXBlOkJ0LlRSSUFOR0xFUyxib3VuZGluZ1NwaGVyZTpBdC5mcm9tVmVydGljZXModSl9KX07S2Y9Z2N9KTt2YXIgTF89e307ZGUoTF8se2RlZmF1bHQ6KCk9PlpMfSk7ZnVuY3Rpb24gJEwodCxlKXtyZXR1cm4gaChlKSYmKHQ9S2YudW5wYWNrKHQsZSkpLEtmLmNyZWF0ZUdlb21ldHJ5KHQpfXZhciBaTCxEXz1aKCgpPT57ZnQoKTt2XygpO1pMPSRMfSk7ZnVuY3Rpb24gV2YodCl7eS50eXBlT2Yub2JqZWN0KCJvcHRpb25zIix0KSx5LnR5cGVPZi5vYmplY3QoIm9wdGlvbnMuZnJ1c3R1bSIsdC5mcnVzdHVtKSx5LnR5cGVPZi5vYmplY3QoIm9wdGlvbnMub3JpZ2luIix0Lm9yaWdpbikseS50eXBlT2Yub2JqZWN0KCJvcHRpb25zLm9yaWVudGF0aW9uIix0Lm9yaWVudGF0aW9uKTtsZXQgZT10LmZydXN0dW0sbj10Lm9yaWVudGF0aW9uLG89dC5vcmlnaW4scj14KHQuX2RyYXdOZWFyUGxhbmUsITApLGkscztlIGluc3RhbmNlb2YgUG8/KGk9Rl8scz1Qby5wYWNrZWRMZW5ndGgpOmUgaW5zdGFuY2VvZiB4byYmKGk9UUwscz14by5wYWNrZWRMZW5ndGgpLHRoaXMuX2ZydXN0dW1UeXBlPWksdGhpcy5fZnJ1c3R1bT1lLmNsb25lKCksdGhpcy5fb3JpZ2luPWEuY2xvbmUobyksdGhpcy5fb3JpZW50YXRpb249ZWUuY2xvbmUobiksdGhpcy5fZHJhd05lYXJQbGFuZT1yLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZUZydXN0dW1PdXRsaW5lR2VvbWV0cnkiLHRoaXMucGFja2VkTGVuZ3RoPTIrcythLnBhY2tlZExlbmd0aCtlZS5wYWNrZWRMZW5ndGh9dmFyIEZfLFFMLEpMLHRELGVELG5ELEJfLE1PPVooKCk9PntNZSgpO0Z0KCk7WHQoKTtMZSgpO0l0KCk7ZnQoKTt2XygpO1hlKCk7WWUoKTthbigpO1BfKCk7Tl8oKTt0bigpO1dvKCk7Rl89MCxRTD0xO1dmLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49eChuLDApO2xldCBvPXQuX2ZydXN0dW1UeXBlLHI9dC5fZnJ1c3R1bTtyZXR1cm4gZVtuKytdPW8sbz09PUZfPyhQby5wYWNrKHIsZSxuKSxuKz1Qby5wYWNrZWRMZW5ndGgpOih4by5wYWNrKHIsZSxuKSxuKz14by5wYWNrZWRMZW5ndGgpLGEucGFjayh0Ll9vcmlnaW4sZSxuKSxuKz1hLnBhY2tlZExlbmd0aCxlZS5wYWNrKHQuX29yaWVudGF0aW9uLGUsbiksbis9ZWUucGFja2VkTGVuZ3RoLGVbbl09dC5fZHJhd05lYXJQbGFuZT8xOjAsZX07Skw9bmV3IFBvLHREPW5ldyB4byxlRD1uZXcgZWUsbkQ9bmV3IGE7V2YudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXt5LmRlZmluZWQoImFycmF5Iix0KSxlPXgoZSwwKTtsZXQgbz10W2UrK10scjtvPT09Rl8/KHI9UG8udW5wYWNrKHQsZSxKTCksZSs9UG8ucGFja2VkTGVuZ3RoKToocj14by51bnBhY2sodCxlLHREKSxlKz14by5wYWNrZWRMZW5ndGgpO2xldCBpPWEudW5wYWNrKHQsZSxuRCk7ZSs9YS5wYWNrZWRMZW5ndGg7bGV0IHM9ZWUudW5wYWNrKHQsZSxlRCk7ZSs9ZWUucGFja2VkTGVuZ3RoO2xldCBmPXRbZV09PT0xO2lmKCFoKG4pKXJldHVybiBuZXcgV2Yoe2ZydXN0dW06cixvcmlnaW46aSxvcmllbnRhdGlvbjpzLF9kcmF3TmVhclBsYW5lOmZ9KTtsZXQgdT1vPT09bi5fZnJ1c3R1bVR5cGU/bi5fZnJ1c3R1bTp2b2lkIDA7cmV0dXJuIG4uX2ZydXN0dW09ci5jbG9uZSh1KSxuLl9mcnVzdHVtVHlwZT1vLG4uX29yaWdpbj1hLmNsb25lKGksbi5fb3JpZ2luKSxuLl9vcmllbnRhdGlvbj1lZS5jbG9uZShzLG4uX29yaWVudGF0aW9uKSxuLl9kcmF3TmVhclBsYW5lPWYsbn07V2YuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fZnJ1c3R1bVR5cGUsbj10Ll9mcnVzdHVtLG89dC5fb3JpZ2luLHI9dC5fb3JpZW50YXRpb24saT10Ll9kcmF3TmVhclBsYW5lLHM9bmV3IEZsb2F0NjRBcnJheSgzKjQqMik7S2YuX2NvbXB1dGVOZWFyRmFyUGxhbmVzKG8scixlLG4scyk7bGV0IGY9bmV3IGllKHtwb3NpdGlvbjpuZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkRPVUJMRSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOnN9KX0pLHUsYyxsPWk/MjoxLHA9bmV3IFVpbnQxNkFycmF5KDgqKGwrMSkpLGQ9aT8wOjE7Zm9yKDtkPDI7KytkKXU9aT9kKjg6MCxjPWQqNCxwW3VdPWMscFt1KzFdPWMrMSxwW3UrMl09YysxLHBbdSszXT1jKzIscFt1KzRdPWMrMixwW3UrNV09YyszLHBbdSs2XT1jKzMscFt1KzddPWM7Zm9yKGQ9MDtkPDI7KytkKXU9KGwrZCkqOCxjPWQqNCxwW3VdPWMscFt1KzFdPWMrNCxwW3UrMl09YysxLHBbdSszXT1jKzUscFt1KzRdPWMrMixwW3UrNV09Yys2LHBbdSs2XT1jKzMscFt1KzddPWMrNztyZXR1cm4gbmV3IFV0KHthdHRyaWJ1dGVzOmYsaW5kaWNlczpwLHByaW1pdGl2ZVR5cGU6QnQuTElORVMsYm91bmRpbmdTcGhlcmU6QXQuZnJvbVZlcnRpY2VzKHMpfSl9O0JfPVdmfSk7dmFyIFVfPXt9O2RlKFVfLHtkZWZhdWx0OigpPT5yRH0pO2Z1bmN0aW9uIG9EKHQsZSl7cmV0dXJuIGgoZSkmJih0PUJfLnVucGFjayh0LGUpKSxCXy5jcmVhdGVHZW9tZXRyeSh0KX12YXIgckQsVl89WigoKT0+e2Z0KCk7TU8oKTtyRD1vRH0pO2Z1bmN0aW9uIFRzKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKSx0aGlzLl9lbGxpcHNvaWQ9eCh0LmVsbGlwc29pZCwkLldHUzg0KSx0aGlzLl9yZWN0YW5nbGU9eCh0LnJlY3RhbmdsZSxOdC5NQVhfVkFMVUUpLHRoaXMuX3Byb2plY3Rpb249bmV3IFFuKHRoaXMuX2VsbGlwc29pZCksdGhpcy5fbnVtYmVyT2ZMZXZlbFplcm9UaWxlc1g9eCh0Lm51bWJlck9mTGV2ZWxaZXJvVGlsZXNYLDIpLHRoaXMuX251bWJlck9mTGV2ZWxaZXJvVGlsZXNZPXgodC5udW1iZXJPZkxldmVsWmVyb1RpbGVzWSwxKX12YXIgTk8sSU89WigoKT0+e0ZlKCk7WHQoKTtJdCgpO2Z0KCk7WnQoKTtTaSgpO1d0KCk7d24oKTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhUcy5wcm90b3R5cGUse2VsbGlwc29pZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VsbGlwc29pZH19LHJlY3RhbmdsZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlY3RhbmdsZX19LHByb2plY3Rpb246e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9qZWN0aW9ufX19KTtUcy5wcm90b3R5cGUuZ2V0TnVtYmVyT2ZYVGlsZXNBdExldmVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9udW1iZXJPZkxldmVsWmVyb1RpbGVzWDw8dH07VHMucHJvdG90eXBlLmdldE51bWJlck9mWVRpbGVzQXRMZXZlbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbnVtYmVyT2ZMZXZlbFplcm9UaWxlc1k8PHR9O1RzLnByb3RvdHlwZS5yZWN0YW5nbGVUb05hdGl2ZVJlY3RhbmdsZT1mdW5jdGlvbih0LGUpe3kuZGVmaW5lZCgicmVjdGFuZ2xlIix0KTtsZXQgbj1NLnRvRGVncmVlcyh0Lndlc3QpLG89TS50b0RlZ3JlZXModC5zb3V0aCkscj1NLnRvRGVncmVlcyh0LmVhc3QpLGk9TS50b0RlZ3JlZXModC5ub3J0aCk7cmV0dXJuIGgoZSk/KGUud2VzdD1uLGUuc291dGg9byxlLmVhc3Q9cixlLm5vcnRoPWksZSk6bmV3IE50KG4sbyxyLGkpfTtUcy5wcm90b3R5cGUudGlsZVhZVG9OYXRpdmVSZWN0YW5nbGU9ZnVuY3Rpb24odCxlLG4sbyl7bGV0IHI9dGhpcy50aWxlWFlUb1JlY3RhbmdsZSh0LGUsbixvKTtyZXR1cm4gci53ZXN0PU0udG9EZWdyZWVzKHIud2VzdCksci5zb3V0aD1NLnRvRGVncmVlcyhyLnNvdXRoKSxyLmVhc3Q9TS50b0RlZ3JlZXMoci5lYXN0KSxyLm5vcnRoPU0udG9EZWdyZWVzKHIubm9ydGgpLHJ9O1RzLnByb3RvdHlwZS50aWxlWFlUb1JlY3RhbmdsZT1mdW5jdGlvbih0LGUsbixvKXtsZXQgcj10aGlzLl9yZWN0YW5nbGUsaT10aGlzLmdldE51bWJlck9mWFRpbGVzQXRMZXZlbChuKSxzPXRoaXMuZ2V0TnVtYmVyT2ZZVGlsZXNBdExldmVsKG4pLGY9ci53aWR0aC9pLHU9dCpmK3Iud2VzdCxjPSh0KzEpKmYrci53ZXN0LGw9ci5oZWlnaHQvcyxwPXIubm9ydGgtZSpsLGQ9ci5ub3J0aC0oZSsxKSpsO3JldHVybiBoKG8pfHwobz1uZXcgTnQodSxkLGMscCkpLG8ud2VzdD11LG8uc291dGg9ZCxvLmVhc3Q9YyxvLm5vcnRoPXAsb307VHMucHJvdG90eXBlLnBvc2l0aW9uVG9UaWxlWFk9ZnVuY3Rpb24odCxlLG4pe2xldCBvPXRoaXMuX3JlY3RhbmdsZTtpZighTnQuY29udGFpbnMobyx0KSlyZXR1cm47bGV0IHI9dGhpcy5nZXROdW1iZXJPZlhUaWxlc0F0TGV2ZWwoZSksaT10aGlzLmdldE51bWJlck9mWVRpbGVzQXRMZXZlbChlKSxzPW8ud2lkdGgvcixmPW8uaGVpZ2h0L2ksdT10LmxvbmdpdHVkZTtvLmVhc3Q8by53ZXN0JiYodSs9TS5UV09fUEkpO2xldCBjPSh1LW8ud2VzdCkvc3wwO2M+PXImJihjPXItMSk7bGV0IGw9KG8ubm9ydGgtdC5sYXRpdHVkZSkvZnwwO3JldHVybiBsPj1pJiYobD1pLTEpLGgobik/KG4ueD1jLG4ueT1sLG4pOm5ldyB0dChjLGwpfTtOTz1Uc30pO2Z1bmN0aW9uIEJPKHQpe2F0LmZyb21SYWRpYW5zKHQuZWFzdCx0Lm5vcnRoLDAsWGZbMF0pLGF0LmZyb21SYWRpYW5zKHQud2VzdCx0Lm5vcnRoLDAsWGZbMV0pLGF0LmZyb21SYWRpYW5zKHQuZWFzdCx0LnNvdXRoLDAsWGZbMl0pLGF0LmZyb21SYWRpYW5zKHQud2VzdCx0LnNvdXRoLDAsWGZbM10pO2xldCBlPTAsbj0wLG89MCxyPTAsaT14bi5fdGVycmFpbkhlaWdodHNNYXhMZXZlbCxzO2ZvcihzPTA7czw9aTsrK3Mpe2xldCBmPSExO2ZvcihsZXQgdT0wO3U8NDsrK3Upe2xldCBjPVhmW3VdO2lmKHNELnBvc2l0aW9uVG9UaWxlWFkoYyxzLFlmKSx1PT09MClvPVlmLngscj1ZZi55O2Vsc2UgaWYobyE9PVlmLnh8fHIhPT1ZZi55KXtmPSEwO2JyZWFrfX1pZihmKWJyZWFrO2U9byxuPXJ9aWYocyE9PTApcmV0dXJue3g6ZSx5Om4sbGV2ZWw6cz5pP2k6cy0xfX12YXIgdk8sTE8sRE8sa18saUQsRk8sc0QsWGYsWWYseG4sVGQsR189WigoKT0+e01lKCk7S20oKTtGZSgpO0Z0KCk7UGUoKTtYdCgpO0l0KCk7ZnQoKTtIdCgpO1p0KCk7SU8oKTt3bigpO2RmKCk7dk89bmV3IGEsTE89bmV3IGEsRE89bmV3IGF0LGtfPW5ldyBhLGlEPW5ldyBhLEZPPW5ldyBBdCxzRD1uZXcgTk8sWGY9W25ldyBhdCxuZXcgYXQsbmV3IGF0LG5ldyBhdF0sWWY9bmV3IHR0LHhuPXt9O3huLmluaXRpYWxpemU9ZnVuY3Rpb24oKXtsZXQgdD14bi5faW5pdFByb21pc2U7cmV0dXJuIGgodCl8fCh0PW9pLmZldGNoSnNvbihtcCgiQXNzZXRzL2FwcHJveGltYXRlVGVycmFpbkhlaWdodHMuanNvbiIpKS50aGVuKGZ1bmN0aW9uKGUpe3huLl90ZXJyYWluSGVpZ2h0cz1lfSkseG4uX2luaXRQcm9taXNlPXQpLHR9O3huLmdldE1pbmltdW1NYXhpbXVtSGVpZ2h0cz1mdW5jdGlvbih0LGUpe2lmKHkuZGVmaW5lZCgicmVjdGFuZ2xlIix0KSwhaCh4bi5fdGVycmFpbkhlaWdodHMpKXRocm93IG5ldyBGKCJZb3UgbXVzdCBjYWxsIEFwcHJveGltYXRlVGVycmFpbkhlaWdodHMuaW5pdGlhbGl6ZSBhbmQgd2FpdCBmb3IgdGhlIHByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgdXNpbmcgdGhpcyBmdW5jdGlvbiIpO2U9eChlLCQuV0dTODQpO2xldCBuPUJPKHQpLG89eG4uX2RlZmF1bHRNaW5UZXJyYWluSGVpZ2h0LHI9eG4uX2RlZmF1bHRNYXhUZXJyYWluSGVpZ2h0O2lmKGgobikpe2xldCBpPWAke24ubGV2ZWx9LSR7bi54fS0ke24ueX1gLHM9eG4uX3RlcnJhaW5IZWlnaHRzW2ldO2gocykmJihvPXNbMF0scj1zWzFdKSxlLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKE50Lm5vcnRoZWFzdCh0LERPKSx2TyksZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihOdC5zb3V0aHdlc3QodCxETyksTE8pLGEubWlkcG9pbnQoTE8sdk8sa18pO2xldCBmPWUuc2NhbGVUb0dlb2RldGljU3VyZmFjZShrXyxpRCk7aWYoaChmKSl7bGV0IHU9YS5kaXN0YW5jZShrXyxmKTtvPU1hdGgubWluKG8sLXUpfWVsc2Ugbz14bi5fZGVmYXVsdE1pblRlcnJhaW5IZWlnaHR9cmV0dXJuIG89TWF0aC5tYXgoeG4uX2RlZmF1bHRNaW5UZXJyYWluSGVpZ2h0LG8pLHttaW5pbXVtVGVycmFpbkhlaWdodDpvLG1heGltdW1UZXJyYWluSGVpZ2h0OnJ9fTt4bi5nZXRCb3VuZGluZ1NwaGVyZT1mdW5jdGlvbih0LGUpe2lmKHkuZGVmaW5lZCgicmVjdGFuZ2xlIix0KSwhaCh4bi5fdGVycmFpbkhlaWdodHMpKXRocm93IG5ldyBGKCJZb3UgbXVzdCBjYWxsIEFwcHJveGltYXRlVGVycmFpbkhlaWdodHMuaW5pdGlhbGl6ZSBhbmQgd2FpdCBmb3IgdGhlIHByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgdXNpbmcgdGhpcyBmdW5jdGlvbiIpO2U9eChlLCQuV0dTODQpO2xldCBuPUJPKHQpLG89eG4uX2RlZmF1bHRNYXhUZXJyYWluSGVpZ2h0O2lmKGgobikpe2xldCBpPWAke24ubGV2ZWx9LSR7bi54fS0ke24ueX1gLHM9eG4uX3RlcnJhaW5IZWlnaHRzW2ldO2gocykmJihvPXNbMV0pfWxldCByPUF0LmZyb21SZWN0YW5nbGUzRCh0LGUsMCk7cmV0dXJuIEF0LmZyb21SZWN0YW5nbGUzRCh0LGUsbyxGTyksQXQudW5pb24ocixGTyxyKX07eG4uX3RlcnJhaW5IZWlnaHRzTWF4TGV2ZWw9Njt4bi5fZGVmYXVsdE1heFRlcnJhaW5IZWlnaHQ9OWUzO3huLl9kZWZhdWx0TWluVGVycmFpbkhlaWdodD0tMWU1O3huLl90ZXJyYWluSGVpZ2h0cz12b2lkIDA7eG4uX2luaXRQcm9taXNlPXZvaWQgMDtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh4bix7aW5pdGlhbGl6ZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBoKHhuLl90ZXJyYWluSGVpZ2h0cyl9fX0pO1RkPXhufSk7ZnVuY3Rpb24gRXModCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXQucG9zaXRpb25zO2lmKCFoKGUpfHxlLmxlbmd0aDwyKXRocm93IG5ldyBGKCJBdCBsZWFzdCB0d28gcG9zaXRpb25zIGFyZSByZXF1aXJlZC4iKTtpZihoKHQuYXJjVHlwZSkmJnQuYXJjVHlwZSE9PV9lLkdFT0RFU0lDJiZ0LmFyY1R5cGUhPT1fZS5SSFVNQil0aHJvdyBuZXcgRigiVmFsaWQgb3B0aW9ucyBmb3IgYXJjVHlwZSBhcmUgQXJjVHlwZS5HRU9ERVNJQyBhbmQgQXJjVHlwZS5SSFVNQi4iKTt0aGlzLndpZHRoPXgodC53aWR0aCwxKSx0aGlzLl9wb3NpdGlvbnM9ZSx0aGlzLmdyYW51bGFyaXR5PXgodC5ncmFudWxhcml0eSw5OTk5KSx0aGlzLmxvb3A9eCh0Lmxvb3AsITEpLHRoaXMuYXJjVHlwZT14KHQuYXJjVHlwZSxfZS5HRU9ERVNJQyksdGhpcy5fZWxsaXBzb2lkPSQuV0dTODQsdGhpcy5fcHJvamVjdGlvbkluZGV4PTAsdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlR3JvdW5kUG9seWxpbmVHZW9tZXRyeSIsdGhpcy5fc2NlbmUzRE9ubHk9ITF9ZnVuY3Rpb24gWF8odCxlLG4sbyxyKXtsZXQgaT1VbyhvLHQsMCxhRCkscz1VbyhvLHQsbixWTyksZj1VbyhvLGUsMCxrTyksdT1IaShzLGksVk8pLGM9SGkoZixpLGtPKTtyZXR1cm4gYS5jcm9zcyhjLHUsciksYS5ub3JtYWxpemUocixyKX1mdW5jdGlvbiB6Xyh0LGUsbixvLHIsaSxzLGYsdSxjLGwpe2lmKHI9PT0wKXJldHVybjtsZXQgcDtpPT09X2UuR0VPREVTSUM/cD1uZXcgaWQodCxlLHMpOmk9PT1fZS5SSFVNQiYmKHA9bmV3IFFvKHQsZSxzKSk7bGV0IGQ9cC5zdXJmYWNlRGlzdGFuY2U7aWYoZDxyKXJldHVybjtsZXQgbT1YXyh0LGUsbyxzLHBEKSxfPU1hdGguY2VpbChkL3IpLGc9ZC9fLGI9Zyx3PV8tMSxPPWYubGVuZ3RoO2ZvcihsZXQgRT0wO0U8dztFKyspe2xldCBUPXAuaW50ZXJwb2xhdGVVc2luZ1N1cmZhY2VEaXN0YW5jZShiLGZEKSxDPVVvKHMsVCxuLHVEKSxOPVVvKHMsVCxvLGxEKTthLnBhY2sobSxmLE8pLGEucGFjayhDLHUsTyksYS5wYWNrKE4sYyxPKSxsLnB1c2goVC5sYXRpdHVkZSksbC5wdXNoKFQubG9uZ2l0dWRlKSxPKz0zLGIrPWd9fWZ1bmN0aW9uIFVvKHQsZSxuLG8pe3JldHVybiBhdC5jbG9uZShlLGpfKSxqXy5oZWlnaHQ9bixhdC50b0NhcnRlc2lhbihqXyx0LG8pfWZ1bmN0aW9uIEhpKHQsZSxuKXtyZXR1cm4gYS5zdWJ0cmFjdCh0LGUsbiksYS5ub3JtYWxpemUobixuKSxufWZ1bmN0aW9uIEdPKHQsZSxuLG8pe3JldHVybiBvPUhpKHQsZSxvKSxvPWEuY3Jvc3MobyxuLG8pLG89YS5ub3JtYWxpemUobyxvKSxvPWEuY3Jvc3MobixvLG8pLG99ZnVuY3Rpb24gSF8odCxlLG4sbyxyKXtsZXQgaT1IaShuLGUsc0UpLHM9R08odCxlLGksZEQpLGY9R08obyxlLGksbUQpO2lmKE0uZXF1YWxzRXBzaWxvbihhLmRvdChzLGYpLHlELE0uRVBTSUxPTjUpKXJldHVybiByPWEuY3Jvc3MoaSxzLHIpLHI9YS5ub3JtYWxpemUocixyKSxyO3I9YS5hZGQoZixzLHIpLHI9YS5ub3JtYWxpemUocixyKTtsZXQgdT1hLmNyb3NzKGkscixoRCk7cmV0dXJuIGEuZG90KGYsdSk8X0QmJihyPWEubmVnYXRlKHIscikpLHJ9ZnVuY3Rpb24gSE8odCxlLG4sbyl7bGV0IHI9SGkobixlLE9EKSxpPWEuZG90KHIsdCk7aWYoaT5vRXx8aTxVTyl7bGV0IHM9SGkobyxuLHNFKSxmPWk8VU8/TS5QSV9PVkVSX1RXTzotTS5QSV9PVkVSX1RXTyx1PWVlLmZyb21BeGlzQW5nbGUocyxmLFJEKSxjPUouZnJvbVF1YXRlcm5pb24odSxFRCk7cmV0dXJuIEoubXVsdGlwbHlCeVZlY3RvcihjLHQsdCksITB9cmV0dXJuITF9ZnVuY3Rpb24gJGYodCxlLG4sbyxyKXtsZXQgaT1hdC50b0NhcnRlc2lhbihlLHQuX2VsbGlwc29pZCxTRCkscz1hLmFkZChpLG4sS08pLGY9ITEsdT10Ll9lbGxpcHNvaWQsYz11LmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKHMscU8pO01hdGguYWJzKGUubG9uZ2l0dWRlLWMubG9uZ2l0dWRlKT5NLlBJX09WRVJfVFdPJiYoZj0hMCxzPWEuc3VidHJhY3QoaSxuLEtPKSxjPXUuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMocyxxTykpLGMuaGVpZ2h0PTA7bGV0IGw9dC5wcm9qZWN0KGMscik7cmV0dXJuIHI9YS5zdWJ0cmFjdChsLG8sciksci56PTAscj1hLm5vcm1hbGl6ZShyLHIpLGYmJmEubmVnYXRlKHIscikscn1mdW5jdGlvbiBYTyh0LGUsbixvLHIsaSl7bGV0IHM9YS5zdWJ0cmFjdChlLHQsQ0QpO2Eubm9ybWFsaXplKHMscyk7bGV0IGY9bi1yRSx1PWEubXVsdGlwbHlCeVNjYWxhcihzLGYsV08pO2EuYWRkKHQsdSxyKTtsZXQgYz1vLWlFO3U9YS5tdWx0aXBseUJ5U2NhbGFyKHMsYyxXTyksYS5hZGQoZSx1LGkpfWZ1bmN0aW9uIFJkKHQsZSl7bGV0IG49b24uZ2V0UG9pbnREaXN0YW5jZShTZCx0KSxvPW9uLmdldFBvaW50RGlzdGFuY2UoU2QsZSkscj14RDtNLmVxdWFsc0Vwc2lsb24obiwwLE0uRVBTSUxPTjIpPyhyPUhpKGUsdCxyKSxhLm11bHRpcGx5QnlTY2FsYXIocixNLkVQU0lMT04yLHIpLGEuYWRkKHQscix0KSk6TS5lcXVhbHNFcHNpbG9uKG8sMCxNLkVQU0lMT04yKSYmKHI9SGkodCxlLHIpLGEubXVsdGlwbHlCeVNjYWxhcihyLE0uRVBTSUxPTjIsciksYS5hZGQoZSxyLGUpKX1mdW5jdGlvbiBQRCh0LGUpe2xldCBuPU1hdGguYWJzKHQubG9uZ2l0dWRlKSxvPU1hdGguYWJzKGUubG9uZ2l0dWRlKTtpZihNLmVxdWFsc0Vwc2lsb24obixNLlBJLE0uRVBTSUxPTjExKSl7bGV0IHI9TS5zaWduKGUubG9uZ2l0dWRlKTtyZXR1cm4gdC5sb25naXR1ZGU9cioobi1NLkVQU0lMT04xMSksMX1lbHNlIGlmKE0uZXF1YWxzRXBzaWxvbihvLE0uUEksTS5FUFNJTE9OMTEpKXtsZXQgcj1NLnNpZ24odC5sb25naXR1ZGUpO3JldHVybiBlLmxvbmdpdHVkZT1yKihvLU0uRVBTSUxPTjExKSwyfXJldHVybiAwfWZ1bmN0aW9uIFhEKHQsZSxuLG8scixpLHMpe2xldCBmLHUsYz1lLl9lbGxpcHNvaWQsbD1uLmxlbmd0aC8zLTEscD1sKjgsZD1wKjQsbT1sKjM2LF89cD42NTUzNT9uZXcgVWludDMyQXJyYXkobSk6bmV3IFVpbnQxNkFycmF5KG0pLGc9bmV3IEZsb2F0NjRBcnJheShwKjMpLGI9bmV3IEZsb2F0MzJBcnJheShkKSx3PW5ldyBGbG9hdDMyQXJyYXkoZCksTz1uZXcgRmxvYXQzMkFycmF5KGQpLEU9bmV3IEZsb2F0MzJBcnJheShkKSxUPW5ldyBGbG9hdDMyQXJyYXkoZCksQyxOLEksRDtzJiYoQz1uZXcgRmxvYXQzMkFycmF5KGQpLE49bmV3IEZsb2F0MzJBcnJheShkKSxJPW5ldyBGbG9hdDMyQXJyYXkoZCksRD1uZXcgRmxvYXQzMkFycmF5KHAqMikpO2xldCB2PWkubGVuZ3RoLzIsTD0wLFU9Y0U7VS5oZWlnaHQ9MDtsZXQgQT1hRTtBLmhlaWdodD0wO2xldCBTPVlPLFA9cV87aWYocylmb3IodT0wLGY9MTtmPHY7ZisrKVUubGF0aXR1ZGU9aVt1XSxVLmxvbmdpdHVkZT1pW3UrMV0sQS5sYXRpdHVkZT1pW3UrMl0sQS5sb25naXR1ZGU9aVt1KzNdLFM9ZS5wcm9qZWN0KFUsUyksUD1lLnByb2plY3QoQSxQKSxMKz1hLmRpc3RhbmNlKFMsUCksdSs9MjtsZXQgQj1vLmxlbmd0aC8zO1A9YS51bnBhY2sobywwLFApO2xldCBqPTA7Zm9yKHU9MyxmPTE7ZjxCO2YrKylTPWEuY2xvbmUoUCxTKSxQPWEudW5wYWNrKG8sdSxQKSxqKz1hLmRpc3RhbmNlKFMsUCksdSs9MztsZXQgSDt1PTM7bGV0IGs9MCxLPTAsWD0wLFI9MCxvdD0hMSxjdD1hLnVucGFjayhuLDAsWk8pLHB0PWEudW5wYWNrKG8sMCxxXykseXQ9YS51bnBhY2sociwwLFFPKTtpZih0KXtsZXQgenQ9YS51bnBhY2sobixuLmxlbmd0aC02LCRPKTtITyh5dCx6dCxjdCxwdCkmJih5dD1hLm5lZ2F0ZSh5dCx5dCkpfWxldCBydD0wLFB0PTAsZ3Q9MDtmb3IoZj0wO2Y8bDtmKyspe2xldCB6dD1hLmNsb25lKGN0LCRPKSxtZT1hLmNsb25lKHB0LFlPKSxjZT1hLmNsb25lKHl0LE1EKTtvdCYmKGNlPWEubmVnYXRlKGNlLGNlKSksY3Q9YS51bnBhY2sobix1LFpPKSxwdD1hLnVucGFjayhvLHUscV8pLHl0PWEudW5wYWNrKHIsdSxRTyksb3Q9SE8oeXQsenQsY3QscHQpLFUubGF0aXR1ZGU9aVtrXSxVLmxvbmdpdHVkZT1pW2srMV0sQS5sYXRpdHVkZT1pW2srMl0sQS5sb25naXR1ZGU9aVtrKzNdO2xldCBwZSx1ZSxRdCxKdDtpZihzKXtsZXQgSWU9UEQoVSxBKTtwZT1lLnByb2plY3QoVSxCRCksdWU9ZS5wcm9qZWN0KEEsVUQpO2xldCBMbj1IaSh1ZSxwZSx0RSk7TG4ueT1NYXRoLmFicyhMbi55KSxRdD1LXyxKdD1XXyxJZT09PTB8fGEuZG90KExuLGEuVU5JVF9ZKT5vRT8oUXQ9JGYoZSxVLGNlLHBlLEtfKSxKdD0kZihlLEEseXQsdWUsV18pKTpJZT09PTE/KEp0PSRmKGUsQSx5dCx1ZSxXXyksUXQueD0wLFF0Lnk9TS5zaWduKFUubG9uZ2l0dWRlLU1hdGguYWJzKEEubG9uZ2l0dWRlKSksUXQuej0wKTooUXQ9JGYoZSxVLGNlLHBlLEtfKSxKdC54PTAsSnQueT1NLnNpZ24oVS5sb25naXR1ZGUtQS5sb25naXR1ZGUpLEp0Lno9MCl9bGV0IHhlPWEuZGlzdGFuY2UobWUscHQpLGdlPVpzLmZyb21DYXJ0ZXNpYW4oenQsSEQpLEVlPWEuc3VidHJhY3QoY3QsenQsVkQpLHVuPWEubm9ybWFsaXplKEVlLEpPKSxrZT1hLnN1YnRyYWN0KG1lLHp0LGtEKTtrZT1hLm5vcm1hbGl6ZShrZSxrZSk7bGV0IGJlPWEuY3Jvc3ModW4sa2UsSk8pO2JlPWEubm9ybWFsaXplKGJlLGJlKTtsZXQgbG49YS5jcm9zcyhrZSxjZSx6RCk7bG49YS5ub3JtYWxpemUobG4sbG4pO2xldCBwbj1hLnN1YnRyYWN0KHB0LGN0LEdEKTtwbj1hLm5vcm1hbGl6ZShwbixwbik7bGV0IE9uPWEuY3Jvc3MoeXQscG4sakQpO09uPWEubm9ybWFsaXplKE9uLE9uKTtsZXQgcmU9eGUvaiwkdD1ydC9qLEdlPTAsZG4sc24sbW4sZm89MCxIbj0wO2lmKHMpe0dlPWEuZGlzdGFuY2UocGUsdWUpLGRuPVpzLmZyb21DYXJ0ZXNpYW4ocGUscUQpLHNuPWEuc3VidHJhY3QodWUscGUsdEUpLG1uPWEubm9ybWFsaXplKHNuLEtEKTtsZXQgSWU9bW4ueDttbi54PW1uLnksbW4ueT0tSWUsZm89R2UvTCxIbj1QdC9MfWZvcihIPTA7SDw4O0grKyl7bGV0IEllPVIrSCo0LExuPUsrSCoyLFduPUllKzMsam89SDw0PzE6LTEscm49SD09PTJ8fEg9PT0zfHxIPT09Nnx8SD09PTc/MTotMTthLnBhY2soZ2UuaGlnaCxiLEllKSxiW1duXT1FZS54LGEucGFjayhnZS5sb3csdyxJZSksd1tXbl09RWUueSxhLnBhY2sobG4sTyxJZSksT1tXbl09RWUueixhLnBhY2soT24sRSxJZSksRVtXbl09cmUqam8sYS5wYWNrKGJlLFQsSWUpO2xldCBFbj0kdCpybjtFbj09PTAmJnJuPDAmJihFbj05KSxUW1duXT1FbixzJiYoQ1tJZV09ZG4uaGlnaC54LENbSWUrMV09ZG4uaGlnaC55LENbSWUrMl09ZG4ubG93LngsQ1tJZSszXT1kbi5sb3cueSxJW0llXT0tUXQueSxJW0llKzFdPVF0LngsSVtJZSsyXT1KdC55LElbSWUrM109LUp0LngsTltJZV09c24ueCxOW0llKzFdPXNuLnksTltJZSsyXT1tbi54LE5bSWUrM109bW4ueSxEW0xuXT1mbypqbyxFbj1IbipybixFbj09PTAmJnJuPDAmJihFbj05KSxEW0xuKzFdPUVuKX1sZXQgWmU9REQsY249RkQsS2U9dkQsaG49TEQsdW89TnQuZnJvbUNhcnRvZ3JhcGhpY0FycmF5KE5ELElEKSxxbj1UZC5nZXRNaW5pbXVtTWF4aW11bUhlaWdodHModW8sYyksS249cW4ubWluaW11bVRlcnJhaW5IZWlnaHQsbG89cW4ubWF4aW11bVRlcnJhaW5IZWlnaHQ7Z3QrPU1hdGguYWJzKEtuKSxndCs9TWF0aC5hYnMobG8pLFhPKHp0LG1lLEtuLGxvLFplLEtlKSxYTyhjdCxwdCxLbixsbyxjbixobik7bGV0IHplPWEubXVsdGlwbHlCeVNjYWxhcihiZSxNLkVQU0lMT041LGVFKTthLmFkZChaZSx6ZSxaZSksYS5hZGQoY24semUsY24pLGEuYWRkKEtlLHplLEtlKSxhLmFkZChobix6ZSxobiksUmQoWmUsY24pLFJkKEtlLGhuKSxhLnBhY2soWmUsZyxYKSxhLnBhY2soY24sZyxYKzMpLGEucGFjayhobixnLFgrNiksYS5wYWNrKEtlLGcsWCs5KSx6ZT1hLm11bHRpcGx5QnlTY2FsYXIoYmUsLTIqTS5FUFNJTE9ONSxlRSksYS5hZGQoWmUsemUsWmUpLGEuYWRkKGNuLHplLGNuKSxhLmFkZChLZSx6ZSxLZSksYS5hZGQoaG4semUsaG4pLFJkKFplLGNuKSxSZChLZSxobiksYS5wYWNrKFplLGcsWCsxMiksYS5wYWNrKGNuLGcsWCsxNSksYS5wYWNrKGhuLGcsWCsxOCksYS5wYWNrKEtlLGcsWCsyMSksays9Mix1Kz0zLEsrPTE2LFgrPTI0LFIrPTMyLHJ0Kz14ZSxQdCs9R2V9dT0wO2xldCBDdD0wO2ZvcihmPTA7ZjxsO2YrKyl7Zm9yKEg9MDtIPG5FO0grKylfW3UrSF09ZkVbSF0rQ3Q7Q3QrPTgsdSs9bkV9bGV0IG10PVdEO0F0LmZyb21WZXJ0aWNlcyhuLGEuWkVSTywzLG10WzBdKSxBdC5mcm9tVmVydGljZXMobyxhLlpFUk8sMyxtdFsxXSk7bGV0IHV0PUF0LmZyb21Cb3VuZGluZ1NwaGVyZXMobXQpO3V0LnJhZGl1cys9Z3QvKGwqMik7bGV0IHZ0PXtwb3NpdGlvbjpuZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkRPVUJMRSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsbm9ybWFsaXplOiExLHZhbHVlczpnfSksc3RhcnRIaUFuZEZvcndhcmRPZmZzZXRYOk9zKGIpLHN0YXJ0TG9BbmRGb3J3YXJkT2Zmc2V0WTpPcyh3KSxzdGFydE5vcm1hbEFuZEZvcndhcmRPZmZzZXRaOk9zKE8pLGVuZE5vcm1hbEFuZFRleHR1cmVDb29yZGluYXRlTm9ybWFsaXphdGlvblg6T3MoRSkscmlnaHROb3JtYWxBbmRUZXh0dXJlQ29vcmRpbmF0ZU5vcm1hbGl6YXRpb25ZOk9zKFQpfTtyZXR1cm4gcyYmKHZ0LnN0YXJ0SGlMbzJEPU9zKEMpLHZ0Lm9mZnNldEFuZFJpZ2h0MkQ9T3MoTiksdnQuc3RhcnRFbmROb3JtYWxzMkQ9T3MoSSksdnQudGV4Y29vcmROb3JtYWxpemF0aW9uMkQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjIsbm9ybWFsaXplOiExLHZhbHVlczpEfSkpLG5ldyBVdCh7YXR0cmlidXRlczp2dCxpbmRpY2VzOl8sYm91bmRpbmdTcGhlcmU6dXR9KX1mdW5jdGlvbiBPcyh0KXtyZXR1cm4gbmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjQsbm9ybWFsaXplOiExLHZhbHVlczp0fSl9dmFyIFlfLGNELG9FLFVPLHJFLGlFLGFELFZPLGtPLGZELHVELGxELHBELGpfLGRELG1ELGhELHNFLF9ELHlELFNkLGdELEFELGJELHdELFRELE9kLEVkLHpPLGpPLE9ELEVELFJELHFPLFNELEtPLENELFdPLHhELGNFLGFFLFlPLHFfLCRPLFpPLE1ELFFPLE5ELElELHZELExELERELEZELEJELFVELEtfLFdfLFZELGtELEdELEpPLHpELGpELEhELHFELHRFLEtELGVFLFdELGZFLG5FLCRfLHVFPVooKCk9PntHXygpO2ZjKCk7anIoKTtNZSgpO0Z0KCk7UGUoKTtYdCgpO0xlKCk7SXQoKTtmdCgpO0h0KCk7WnQoKTt6MCgpO01mKCk7RGgoKTtTaSgpO1hlKCk7WWUoKTt0YygpO1d0KCk7Rm4oKTtmcygpO1dvKCk7d24oKTtpYygpO1lfPVtRbixlb10sY0Q9WV8ubGVuZ3RoLG9FPU1hdGguY29zKE0udG9SYWRpYW5zKDMwKSksVU89TWF0aC5jb3MoTS50b1JhZGlhbnMoMTUwKSksckU9MCxpRT0xZTM7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRXMucHJvdG90eXBlLHtwYWNrZWRMZW5ndGg6e2dldDpmdW5jdGlvbigpe3JldHVybiAxK3RoaXMuX3Bvc2l0aW9ucy5sZW5ndGgqMysxKzErMSskLnBhY2tlZExlbmd0aCsxKzF9fX0pO0VzLnNldFByb2plY3Rpb25BbmRFbGxpcHNvaWQ9ZnVuY3Rpb24odCxlKXtsZXQgbj0wO2ZvcihsZXQgbz0wO288Y0Q7bysrKWlmKGUgaW5zdGFuY2VvZiBZX1tvXSl7bj1vO2JyZWFrfXQuX3Byb2plY3Rpb25JbmRleD1uLHQuX2VsbGlwc29pZD1lLmVsbGlwc29pZH07YUQ9bmV3IGEsVk89bmV3IGEsa089bmV3IGE7ZkQ9bmV3IGF0LHVEPW5ldyBhLGxEPW5ldyBhLHBEPW5ldyBhO2pfPW5ldyBhdDtFcy5wYWNrPWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKTtsZXQgbz14KG4sMCkscj10Ll9wb3NpdGlvbnMsaT1yLmxlbmd0aDtlW28rK109aTtmb3IobGV0IHM9MDtzPGk7KytzKXtsZXQgZj1yW3NdO2EucGFjayhmLGUsbyksbys9M31yZXR1cm4gZVtvKytdPXQuZ3JhbnVsYXJpdHksZVtvKytdPXQubG9vcD8xOjAsZVtvKytdPXQuYXJjVHlwZSwkLnBhY2sodC5fZWxsaXBzb2lkLGUsbyksbys9JC5wYWNrZWRMZW5ndGgsZVtvKytdPXQuX3Byb2plY3Rpb25JbmRleCxlW28rK109dC5fc2NlbmUzRE9ubHk/MTowLGV9O0VzLnVucGFjaz1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJhcnJheSIsdCk7bGV0IG89eChlLDApLHI9dFtvKytdLGk9bmV3IEFycmF5KHIpO2ZvcihsZXQgZD0wO2Q8cjtkKyspaVtkXT1hLnVucGFjayh0LG8pLG8rPTM7bGV0IHM9dFtvKytdLGY9dFtvKytdPT09MSx1PXRbbysrXSxjPSQudW5wYWNrKHQsbyk7bys9JC5wYWNrZWRMZW5ndGg7bGV0IGw9dFtvKytdLHA9dFtvKytdPT09MTtyZXR1cm4gaChuKXx8KG49bmV3IEVzKHtwb3NpdGlvbnM6aX0pKSxuLl9wb3NpdGlvbnM9aSxuLmdyYW51bGFyaXR5PXMsbi5sb29wPWYsbi5hcmNUeXBlPXUsbi5fZWxsaXBzb2lkPWMsbi5fcHJvamVjdGlvbkluZGV4PWwsbi5fc2NlbmUzRE9ubHk9cCxufTtkRD1uZXcgYSxtRD1uZXcgYSxoRD1uZXcgYSxzRT1uZXcgYSxfRD0wLHlEPS0xO1NkPW9uLmZyb21Qb2ludE5vcm1hbChhLlpFUk8sYS5VTklUX1kpLGdEPW5ldyBhLEFEPW5ldyBhLGJEPW5ldyBhLHdEPW5ldyBhLFREPW5ldyBhLE9kPW5ldyBhLEVkPW5ldyBhdCx6Tz1uZXcgYXQsak89bmV3IGF0O0VzLmNyZWF0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQpe2xldCBlPSF0Ll9zY2VuZTNET25seSxuPXQubG9vcCxvPXQuX2VsbGlwc29pZCxyPXQuZ3JhbnVsYXJpdHksaT10LmFyY1R5cGUscz1uZXcgWV9bdC5fcHJvamVjdGlvbkluZGV4XShvKSxmPXJFLHU9aUUsYyxsLHA9dC5fcG9zaXRpb25zLGQ9cC5sZW5ndGg7ZD09PTImJihuPSExKTtsZXQgbSxfLGcsYix3PW5ldyBRbyh2b2lkIDAsdm9pZCAwLG8pLE8sRSxULEM9W3BbMF1dO2ZvcihsPTA7bDxkLTE7bCsrKW09cFtsXSxfPXBbbCsxXSxPPWhvLmxpbmVTZWdtZW50UGxhbmUobSxfLFNkLE9kKSxoKE8pJiYhYS5lcXVhbHNFcHNpbG9uKE8sbSxNLkVQU0lMT043KSYmIWEuZXF1YWxzRXBzaWxvbihPLF8sTS5FUFNJTE9ONykmJih0LmFyY1R5cGU9PT1fZS5HRU9ERVNJQz9DLnB1c2goYS5jbG9uZShPKSk6dC5hcmNUeXBlPT09X2UuUkhVTUImJihUPW8uY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoTyxFZCkubG9uZ2l0dWRlLGc9by5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhtLEVkKSxiPW8uY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoXyx6Tyksdy5zZXRFbmRQb2ludHMoZyxiKSxFPXcuZmluZEludGVyc2VjdGlvbldpdGhMb25naXR1ZGUoVCxqTyksTz1vLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKEUsT2QpLGgoTykmJiFhLmVxdWFsc0Vwc2lsb24oTyxtLE0uRVBTSUxPTjcpJiYhYS5lcXVhbHNFcHNpbG9uKE8sXyxNLkVQU0lMT043KSYmQy5wdXNoKGEuY2xvbmUoTykpKSksQy5wdXNoKF8pO24mJihtPXBbZC0xXSxfPXBbMF0sTz1oby5saW5lU2VnbWVudFBsYW5lKG0sXyxTZCxPZCksaChPKSYmIWEuZXF1YWxzRXBzaWxvbihPLG0sTS5FUFNJTE9ONykmJiFhLmVxdWFsc0Vwc2lsb24oTyxfLE0uRVBTSUxPTjcpJiYodC5hcmNUeXBlPT09X2UuR0VPREVTSUM/Qy5wdXNoKGEuY2xvbmUoTykpOnQuYXJjVHlwZT09PV9lLlJIVU1CJiYoVD1vLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKE8sRWQpLmxvbmdpdHVkZSxnPW8uY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMobSxFZCksYj1vLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKF8sek8pLHcuc2V0RW5kUG9pbnRzKGcsYiksRT13LmZpbmRJbnRlcnNlY3Rpb25XaXRoTG9uZ2l0dWRlKFQsak8pLE89by5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihFLE9kKSxoKE8pJiYhYS5lcXVhbHNFcHNpbG9uKE8sbSxNLkVQU0lMT043KSYmIWEuZXF1YWxzRXBzaWxvbihPLF8sTS5FUFNJTE9ONykmJkMucHVzaChhLmNsb25lKE8pKSkpKTtsZXQgTj1DLmxlbmd0aCxJPW5ldyBBcnJheShOKTtmb3IobD0wO2w8TjtsKyspe2xldCBvdD1hdC5mcm9tQ2FydGVzaWFuKENbbF0sbyk7b3QuaGVpZ2h0PTAsSVtsXT1vdH1pZihJPUNuKEksYXQuZXF1YWxzRXBzaWxvbiksTj1JLmxlbmd0aCxOPDIpcmV0dXJuO2xldCBEPVtdLHY9W10sTD1bXSxVPVtdLEE9Z0QsUz1BRCxQPWJELEI9d0Qsaj1URCxIPUlbMF0saz1JWzFdLEs9SVtOLTFdO2ZvcihBPVVvKG8sSyxmLEEpLEI9VW8obyxrLGYsQiksUz1VbyhvLEgsZixTKSxQPVVvKG8sSCx1LFApLG4/aj1IXyhBLFMsUCxCLGopOmo9WF8oSCxrLHUsbyxqKSxhLnBhY2soaix2LDApLGEucGFjayhTLEwsMCksYS5wYWNrKFAsVSwwKSxELnB1c2goSC5sYXRpdHVkZSksRC5wdXNoKEgubG9uZ2l0dWRlKSx6XyhILGssZix1LHIsaSxvLHYsTCxVLEQpLGw9MTtsPE4tMTsrK2wpe0E9YS5jbG9uZShTLEEpLFM9YS5jbG9uZShCLFMpO2xldCBvdD1JW2xdO1VvKG8sb3QsdSxQKSxVbyhvLElbbCsxXSxmLEIpLEhfKEEsUyxQLEIsaiksYz12Lmxlbmd0aCxhLnBhY2soaix2LGMpLGEucGFjayhTLEwsYyksYS5wYWNrKFAsVSxjKSxELnB1c2gob3QubGF0aXR1ZGUpLEQucHVzaChvdC5sb25naXR1ZGUpLHpfKElbbF0sSVtsKzFdLGYsdSxyLGksbyx2LEwsVSxEKX1sZXQgWD1JW04tMV0sUj1JW04tMl07aWYoUz1VbyhvLFgsZixTKSxQPVVvKG8sWCx1LFApLG4pe2xldCBvdD1JWzBdO0E9VW8obyxSLGYsQSksQj1VbyhvLG90LGYsQiksaj1IXyhBLFMsUCxCLGopfWVsc2Ugaj1YXyhSLFgsdSxvLGopO2lmKGM9di5sZW5ndGgsYS5wYWNrKGosdixjKSxhLnBhY2soUyxMLGMpLGEucGFjayhQLFUsYyksRC5wdXNoKFgubGF0aXR1ZGUpLEQucHVzaChYLmxvbmdpdHVkZSksbil7Zm9yKHpfKFgsSCxmLHUscixpLG8sdixMLFUsRCksYz12Lmxlbmd0aCxsPTA7bDwzOysrbCl2W2MrbF09dltsXSxMW2MrbF09TFtsXSxVW2MrbF09VVtsXTtELnB1c2goSC5sYXRpdHVkZSksRC5wdXNoKEgubG9uZ2l0dWRlKX1yZXR1cm4gWEQobixzLEwsVSx2LEQsZSl9O09EPW5ldyBhLEVEPW5ldyBKLFJEPW5ldyBlZTtxTz1uZXcgYXQsU0Q9bmV3IGEsS089bmV3IGE7Q0Q9bmV3IGEsV089bmV3IGE7eEQ9bmV3IGE7Y0U9bmV3IGF0LGFFPW5ldyBhdCxZTz1uZXcgYSxxXz1uZXcgYSwkTz1uZXcgYSxaTz1uZXcgYSxNRD1uZXcgYSxRTz1uZXcgYSxORD1bY0UsYUVdLElEPW5ldyBOdCx2RD1uZXcgYSxMRD1uZXcgYSxERD1uZXcgYSxGRD1uZXcgYSxCRD1uZXcgYSxVRD1uZXcgYSxLXz1uZXcgYSxXXz1uZXcgYSxWRD1uZXcgYSxrRD1uZXcgYSxHRD1uZXcgYSxKTz1uZXcgYSx6RD1uZXcgYSxqRD1uZXcgYSxIRD1uZXcgWnMscUQ9bmV3IFpzLHRFPW5ldyBhLEtEPW5ldyBhLGVFPW5ldyBhLFdEPVtuZXcgQXQsbmV3IEF0XSxmRT1bMCwyLDEsMCwzLDIsMCw3LDMsMCw0LDcsMCw1LDQsMCwxLDUsNSw3LDQsNSw2LDcsNSwyLDYsNSwxLDIsMyw2LDIsMyw3LDZdLG5FPWZFLmxlbmd0aDtFcy5fcHJvamVjdE5vcm1hbD0kZjskXz1Fc30pO3ZhciBaXz17fTtkZShaXyx7ZGVmYXVsdDooKT0+JER9KTtmdW5jdGlvbiBZRCh0LGUpe3JldHVybiBUZC5pbml0aWFsaXplKCkudGhlbihmdW5jdGlvbigpe3JldHVybiBoKGUpJiYodD0kXy51bnBhY2sodCxlKSksJF8uY3JlYXRlR2VvbWV0cnkodCl9KX12YXIgJEQsUV89WigoKT0+e0dfKCk7ZnQoKTt1RSgpOyREPVlEfSk7ZnVuY3Rpb24gUmEodCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXgodC52ZXJ0ZXhGb3JtYXQsZHQuREVGQVVMVCk7dGhpcy5fdmVydGV4Rm9ybWF0PWUsdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlUGxhbmVHZW9tZXRyeSJ9dmFyIGxFLFpELENkLHhkLEpfLHBFPVooKCk9PntNZSgpO0Z0KCk7WHQoKTtMZSgpO0l0KCk7ZnQoKTtYZSgpO1llKCk7YW4oKTt0bigpO0VvKCk7UmEucGFja2VkTGVuZ3RoPWR0LnBhY2tlZExlbmd0aDtSYS5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCkseS5kZWZpbmVkKCJhcnJheSIsZSksbj14KG4sMCksZHQucGFjayh0Ll92ZXJ0ZXhGb3JtYXQsZSxuKSxlfTtsRT1uZXcgZHQsWkQ9e3ZlcnRleEZvcm1hdDpsRX07UmEudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXt5LmRlZmluZWQoImFycmF5Iix0KSxlPXgoZSwwKTtsZXQgbz1kdC51bnBhY2sodCxlLGxFKTtyZXR1cm4gaChuKT8obi5fdmVydGV4Rm9ybWF0PWR0LmNsb25lKG8sbi5fdmVydGV4Rm9ybWF0KSxuKTpuZXcgUmEoWkQpfTtDZD1uZXcgYSgtLjUsLS41LDApLHhkPW5ldyBhKC41LC41LDApO1JhLmNyZWF0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQpe2xldCBlPXQuX3ZlcnRleEZvcm1hdCxuPW5ldyBpZSxvLHI7aWYoZS5wb3NpdGlvbil7aWYocj1uZXcgRmxvYXQ2NEFycmF5KDQqMyksclswXT1DZC54LHJbMV09Q2QueSxyWzJdPTAsclszXT14ZC54LHJbNF09Q2QueSxyWzVdPTAscls2XT14ZC54LHJbN109eGQueSxyWzhdPTAscls5XT1DZC54LHJbMTBdPXhkLnksclsxMV09MCxuLnBvc2l0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6cn0pLGUubm9ybWFsKXtsZXQgaT1uZXcgRmxvYXQzMkFycmF5KDEyKTtpWzBdPTAsaVsxXT0wLGlbMl09MSxpWzNdPTAsaVs0XT0wLGlbNV09MSxpWzZdPTAsaVs3XT0wLGlbOF09MSxpWzldPTAsaVsxMF09MCxpWzExXT0xLG4ubm9ybWFsPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczppfSl9aWYoZS5zdCl7bGV0IGk9bmV3IEZsb2F0MzJBcnJheSg4KTtpWzBdPTAsaVsxXT0wLGlbMl09MSxpWzNdPTAsaVs0XT0xLGlbNV09MSxpWzZdPTAsaVs3XT0xLG4uc3Q9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjIsdmFsdWVzOml9KX1pZihlLnRhbmdlbnQpe2xldCBpPW5ldyBGbG9hdDMyQXJyYXkoMTIpO2lbMF09MSxpWzFdPTAsaVsyXT0wLGlbM109MSxpWzRdPTAsaVs1XT0wLGlbNl09MSxpWzddPTAsaVs4XT0wLGlbOV09MSxpWzEwXT0wLGlbMTFdPTAsbi50YW5nZW50PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczppfSl9aWYoZS5iaXRhbmdlbnQpe2xldCBpPW5ldyBGbG9hdDMyQXJyYXkoMTIpO2lbMF09MCxpWzFdPTEsaVsyXT0wLGlbM109MCxpWzRdPTEsaVs1XT0wLGlbNl09MCxpWzddPTEsaVs4XT0wLGlbOV09MCxpWzEwXT0xLGlbMTFdPTAsbi5iaXRhbmdlbnQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOml9KX1vPW5ldyBVaW50MTZBcnJheSgyKjMpLG9bMF09MCxvWzFdPTEsb1syXT0yLG9bM109MCxvWzRdPTIsb1s1XT0zfXJldHVybiBuZXcgVXQoe2F0dHJpYnV0ZXM6bixpbmRpY2VzOm8scHJpbWl0aXZlVHlwZTpCdC5UUklBTkdMRVMsYm91bmRpbmdTcGhlcmU6bmV3IEF0KGEuWkVSTyxNYXRoLnNxcnQoMikpfSl9O0pfPVJhfSk7dmFyIHR5PXt9O2RlKHR5LHtkZWZhdWx0OigpPT5KRH0pO2Z1bmN0aW9uIFFEKHQsZSl7cmV0dXJuIGgoZSkmJih0PUpfLnVucGFjayh0LGUpKSxKXy5jcmVhdGVHZW9tZXRyeSh0KX12YXIgSkQsZXk9WigoKT0+e2Z0KCk7cEUoKTtKRD1RRH0pO2Z1bmN0aW9uIFNhKCl7dGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlUGxhbmVPdXRsaW5lR2VvbWV0cnkifXZhciBScyxQZCxueSxkRT1aKCgpPT57TWUoKTtGdCgpO1h0KCk7TGUoKTtmdCgpO1hlKCk7WWUoKTthbigpO3RuKCk7U2EucGFja2VkTGVuZ3RoPTA7U2EucGFjaz1mdW5jdGlvbih0LGUpe3JldHVybiB5LmRlZmluZWQoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxlfTtTYS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LmRlZmluZWQoImFycmF5Iix0KSxoKG4pP246bmV3IFNhfTtScz1uZXcgYSgtLjUsLS41LDApLFBkPW5ldyBhKC41LC41LDApO1NhLmNyZWF0ZUdlb21ldHJ5PWZ1bmN0aW9uKCl7bGV0IHQ9bmV3IGllLGU9bmV3IFVpbnQxNkFycmF5KDQqMiksbj1uZXcgRmxvYXQ2NEFycmF5KDQqMyk7cmV0dXJuIG5bMF09UnMueCxuWzFdPVJzLnksblsyXT1Scy56LG5bM109UGQueCxuWzRdPVJzLnksbls1XT1Scy56LG5bNl09UGQueCxuWzddPVBkLnksbls4XT1Scy56LG5bOV09UnMueCxuWzEwXT1QZC55LG5bMTFdPVJzLnosdC5wb3NpdGlvbj1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkRPVUJMRSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOm59KSxlWzBdPTAsZVsxXT0xLGVbMl09MSxlWzNdPTIsZVs0XT0yLGVbNV09MyxlWzZdPTMsZVs3XT0wLG5ldyBVdCh7YXR0cmlidXRlczp0LGluZGljZXM6ZSxwcmltaXRpdmVUeXBlOkJ0LkxJTkVTLGJvdW5kaW5nU3BoZXJlOm5ldyBBdChhLlpFUk8sTWF0aC5zcXJ0KDIpKX0pfTtueT1TYX0pO3ZhciBveT17fTtkZShveSx7ZGVmYXVsdDooKT0+ZUZ9KTtmdW5jdGlvbiB0Rih0LGUpe3JldHVybiBoKGUpJiYodD1ueS51bnBhY2sodCxlKSksbnkuY3JlYXRlR2VvbWV0cnkodCl9dmFyIGVGLHJ5PVooKCk9PntmdCgpO2RFKCk7ZUY9dEZ9KTtmdW5jdGlvbiB2bih0LGUpe3RoaXMucG9zaXRpb249dCxoKHRoaXMucG9zaXRpb24pfHwodGhpcy5wb3NpdGlvbj1uZXcgdHQpLHRoaXMudGFuZ2VudFBsYW5lPWUsaCh0aGlzLnRhbmdlbnRQbGFuZSl8fCh0aGlzLnRhbmdlbnRQbGFuZT12bi5OT1JUSF9QT0xFX1RBTkdFTlRfUExBTkUpfXZhciBDYSxuRixvRixyRixpRixhcixtRT1aKCgpPT57RmUoKTtGdCgpO1BlKCk7WHQoKTtmdCgpO1p0KCk7bGEoKTt0YygpO1d0KCk7THAoKTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh2bi5wcm90b3R5cGUse2VsbGlwc29pZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFuZ2VudFBsYW5lLmVsbGlwc29pZH19LHg6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBvc2l0aW9uLnh9fSx5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wb3NpdGlvbi55fX0sY29uZm9ybWFsTGF0aXR1ZGU6e2dldDpmdW5jdGlvbigpe2xldCB0PXR0Lm1hZ25pdHVkZSh0aGlzLnBvc2l0aW9uKSxlPTIqdGhpcy5lbGxpcHNvaWQubWF4aW11bVJhZGl1cztyZXR1cm4gdGhpcy50YW5nZW50UGxhbmUucGxhbmUubm9ybWFsLnoqKE0uUElfT1ZFUl9UV08tMipNYXRoLmF0YW4yKHQsZSkpfX0sbG9uZ2l0dWRlOntnZXQ6ZnVuY3Rpb24oKXtsZXQgdD1NLlBJX09WRVJfVFdPK01hdGguYXRhbjIodGhpcy55LHRoaXMueCk7cmV0dXJuIHQ+TWF0aC5QSSYmKHQtPU0uVFdPX1BJKSx0fX19KTtDYT1uZXcgYXQsbkY9bmV3IGE7dm4ucHJvdG90eXBlLmdldExhdGl0dWRlPWZ1bmN0aW9uKHQpe2godCl8fCh0PSQuV0dTODQpLENhLmxhdGl0dWRlPXRoaXMuY29uZm9ybWFsTGF0aXR1ZGUsQ2EubG9uZ2l0dWRlPXRoaXMubG9uZ2l0dWRlLENhLmhlaWdodD0wO2xldCBlPXRoaXMuZWxsaXBzb2lkLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKENhLG5GKTtyZXR1cm4gdC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhlLENhKSxDYS5sYXRpdHVkZX07b0Y9bmV3IFFzLHJGPW5ldyBhLGlGPW5ldyBhO3ZuLmZyb21DYXJ0ZXNpYW49ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoImNhcnRlc2lhbiIsdCk7bGV0IG49TS5zaWduTm90WmVybyh0LnopLG89dm4uTk9SVEhfUE9MRV9UQU5HRU5UX1BMQU5FLHI9dm4uU09VVEhfUE9MRTtuPDAmJihvPXZuLlNPVVRIX1BPTEVfVEFOR0VOVF9QTEFORSxyPXZuLk5PUlRIX1BPTEUpO2xldCBpPW9GO2kub3JpZ2luPW8uZWxsaXBzb2lkLnNjYWxlVG9HZW9jZW50cmljU3VyZmFjZSh0LGkub3JpZ2luKSxpLmRpcmVjdGlvbj1hLnN1YnRyYWN0KGkub3JpZ2luLHIsckYpLGEubm9ybWFsaXplKGkuZGlyZWN0aW9uLGkuZGlyZWN0aW9uKTtsZXQgcz1oby5yYXlQbGFuZShpLG8ucGxhbmUsaUYpLGY9YS5zdWJ0cmFjdChzLHIscyksdT1hLmRvdChvLnhBeGlzLGYpLGM9biphLmRvdChvLnlBeGlzLGYpO3JldHVybiBoKGUpPyhlLnBvc2l0aW9uPW5ldyB0dCh1LGMpLGUudGFuZ2VudFBsYW5lPW8sZSk6bmV3IHZuKG5ldyB0dCh1LGMpLG8pfTt2bi5mcm9tQ2FydGVzaWFuQXJyYXk9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoImNhcnRlc2lhbnMiLHQpO2xldCBuPXQubGVuZ3RoO2goZSk/ZS5sZW5ndGg9bjplPW5ldyBBcnJheShuKTtmb3IobGV0IG89MDtvPG47bysrKWVbb109dm4uZnJvbUNhcnRlc2lhbih0W29dLGVbb10pO3JldHVybiBlfTt2bi5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKGgodCkpcmV0dXJuIGgoZSk/KGUucG9zaXRpb249dC5wb3NpdGlvbixlLnRhbmdlbnRQbGFuZT10LnRhbmdlbnRQbGFuZSxlKTpuZXcgdm4odC5wb3NpdGlvbix0LnRhbmdlbnRQbGFuZSl9O3ZuLkhBTEZfVU5JVF9TUEhFUkU9T2JqZWN0LmZyZWV6ZShuZXcgJCguNSwuNSwuNSkpO3ZuLk5PUlRIX1BPTEU9T2JqZWN0LmZyZWV6ZShuZXcgYSgwLDAsLjUpKTt2bi5TT1VUSF9QT0xFPU9iamVjdC5mcmVlemUobmV3IGEoMCwwLC0uNSkpO3ZuLk5PUlRIX1BPTEVfVEFOR0VOVF9QTEFORT1PYmplY3QuZnJlZXplKG5ldyBfbyh2bi5OT1JUSF9QT0xFLHZuLkhBTEZfVU5JVF9TUEhFUkUpKTt2bi5TT1VUSF9QT0xFX1RBTkdFTlRfUExBTkU9T2JqZWN0LmZyZWV6ZShuZXcgX28odm4uU09VVEhfUE9MRSx2bi5IQUxGX1VOSVRfU1BIRVJFKSk7YXI9dm59KTtmdW5jdGlvbiBjRih0LGUsbixvKXtsZXQgaT1vLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKHQsc0YpLmhlaWdodCxzPW8uY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoZSxoRSk7cy5oZWlnaHQ9aSxvLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKHMsZSk7bGV0IGY9by5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhuLGhFKTtmLmhlaWdodD1pLTEwMCxvLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGYsbil9ZnVuY3Rpb24gaXkodCl7bGV0IGU9dC52ZXJ0ZXhGb3JtYXQsbj10Lmdlb21ldHJ5LG89dC5zaGFkb3dWb2x1bWUscj1uLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLGk9aChuLmF0dHJpYnV0ZXMuc3QpP24uYXR0cmlidXRlcy5zdC52YWx1ZXM6dm9pZCAwLHM9ci5sZW5ndGgsZj10LndhbGwsdT10LnRvcHx8ZixjPXQuYm90dG9tfHxmO2lmKGUuc3R8fGUubm9ybWFsfHxlLnRhbmdlbnR8fGUuYml0YW5nZW50fHxvKXtsZXQgbD10LmJvdW5kaW5nUmVjdGFuZ2xlLHA9dC5yb3RhdGlvbkF4aXMsZD10LnByb2plY3RUbzJkLG09dC5lbGxpcHNvaWQsXz10LnN0Um90YXRpb24sZz10LnBlclBvc2l0aW9uSGVpZ2h0LGI9bUY7Yi54PWwueCxiLnk9bC55O2xldCB3PWUuc3Q/bmV3IEZsb2F0MzJBcnJheSgyKihzLzMpKTp2b2lkIDAsTztlLm5vcm1hbCYmKGcmJnUmJiFmP089bi5hdHRyaWJ1dGVzLm5vcm1hbC52YWx1ZXM6Tz1uZXcgRmxvYXQzMkFycmF5KHMpKTtsZXQgRT1lLnRhbmdlbnQ/bmV3IEZsb2F0MzJBcnJheShzKTp2b2lkIDAsVD1lLmJpdGFuZ2VudD9uZXcgRmxvYXQzMkFycmF5KHMpOnZvaWQgMCxDPW8/bmV3IEZsb2F0MzJBcnJheShzKTp2b2lkIDAsTj0wLEk9MCxEPWZGLHY9dUYsTD1sRixVPSEwLEE9eUYsUz1nRjtpZihfIT09MCl7bGV0IGo9ZWUuZnJvbUF4aXNBbmdsZShwLF8seUUpO0E9Si5mcm9tUXVhdGVybmlvbihqLEEpLGo9ZWUuZnJvbUF4aXNBbmdsZShwLC1fLHlFKSxTPUouZnJvbVF1YXRlcm5pb24oaixTKX1lbHNlIEE9Si5jbG9uZShKLklERU5USVRZLEEpLFM9Si5jbG9uZShKLklERU5USVRZLFMpO2xldCBQPTAsQj0wO3UmJmMmJihQPXMvMixCPXMvMyxzLz0yKTtmb3IobGV0IGo9MDtqPHM7ais9Myl7bGV0IEg9YS5mcm9tQXJyYXkocixqLF9GKTtpZihlLnN0JiYhaChpKSl7bGV0IGs9Si5tdWx0aXBseUJ5VmVjdG9yKEEsSCxhRik7az1tLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UoayxrKTtsZXQgSz1kKFtrXSxoRilbMF07dHQuc3VidHJhY3QoSyxiLEspO2xldCBYPU0uY2xhbXAoSy54L2wud2lkdGgsMCwxKSxSPU0uY2xhbXAoSy55L2wuaGVpZ2h0LDAsMSk7YyYmKHdbTitCXT1YLHdbTisxK0JdPVIpLHUmJih3W05dPVgsd1tOKzFdPVIpLE4rPTJ9aWYoZS5ub3JtYWx8fGUudGFuZ2VudHx8ZS5iaXRhbmdlbnR8fG8pe2xldCBrPUkrMSxLPUkrMjtpZihmKXtpZihqKzM8cyl7bGV0IFg9YS5mcm9tQXJyYXkocixqKzMscEYpO2lmKFUpe2xldCBSPWEuZnJvbUFycmF5KHIsaitzLGRGKTtnJiZjRihILFgsUixtKSxhLnN1YnRyYWN0KFgsSCxYKSxhLnN1YnRyYWN0KFIsSCxSKSxEPWEubm9ybWFsaXplKGEuY3Jvc3MoUixYLEQpLEQpLFU9ITF9YS5lcXVhbHNFcHNpbG9uKFgsSCxNLkVQU0lMT04xMCkmJihVPSEwKX0oZS50YW5nZW50fHxlLmJpdGFuZ2VudCkmJihMPW0uZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKEgsTCksZS50YW5nZW50JiYodj1hLm5vcm1hbGl6ZShhLmNyb3NzKEwsRCx2KSx2KSkpfWVsc2UgRD1tLmdlb2RldGljU3VyZmFjZU5vcm1hbChILEQpLChlLnRhbmdlbnR8fGUuYml0YW5nZW50KSYmKGcmJihNZD1hLmZyb21BcnJheShPLEksTWQpLGRpPWEuY3Jvc3MoYS5VTklUX1osTWQsZGkpLGRpPWEubm9ybWFsaXplKEoubXVsdGlwbHlCeVZlY3RvcihTLGRpLGRpKSxkaSksZS5iaXRhbmdlbnQmJih4YT1hLm5vcm1hbGl6ZShhLmNyb3NzKE1kLGRpLHhhKSx4YSkpKSx2PWEuY3Jvc3MoYS5VTklUX1osRCx2KSx2PWEubm9ybWFsaXplKEoubXVsdGlwbHlCeVZlY3RvcihTLHYsdiksdiksZS5iaXRhbmdlbnQmJihMPWEubm9ybWFsaXplKGEuY3Jvc3MoRCx2LEwpLEwpKSk7ZS5ub3JtYWwmJih0LndhbGw/KE9bSStQXT1ELngsT1trK1BdPUQueSxPW0srUF09RC56KTpjJiYoT1tJK1BdPS1ELngsT1trK1BdPS1ELnksT1tLK1BdPS1ELnopLCh1JiYhZ3x8ZikmJihPW0ldPUQueCxPW2tdPUQueSxPW0tdPUQueikpLG8mJihmJiYoRD1tLmdlb2RldGljU3VyZmFjZU5vcm1hbChILEQpKSxDW0krUF09LUQueCxDW2srUF09LUQueSxDW0srUF09LUQueiksZS50YW5nZW50JiYodC53YWxsPyhFW0krUF09di54LEVbaytQXT12LnksRVtLK1BdPXYueik6YyYmKEVbSStQXT0tdi54LEVbaytQXT0tdi55LEVbSytQXT0tdi56KSx1JiYoZz8oRVtJXT1kaS54LEVba109ZGkueSxFW0tdPWRpLnopOihFW0ldPXYueCxFW2tdPXYueSxFW0tdPXYueikpKSxlLmJpdGFuZ2VudCYmKGMmJihUW0krUF09TC54LFRbaytQXT1MLnksVFtLK1BdPUwueiksdSYmKGc/KFRbSV09eGEueCxUW2tdPXhhLnksVFtLXT14YS56KTooVFtJXT1MLngsVFtrXT1MLnksVFtLXT1MLnopKSksSSs9M319ZS5zdCYmIWgoaSkmJihuLmF0dHJpYnV0ZXMuc3Q9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjIsdmFsdWVzOnd9KSksZS5ub3JtYWwmJihuLmF0dHJpYnV0ZXMubm9ybWFsPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpPfSkpLGUudGFuZ2VudCYmKG4uYXR0cmlidXRlcy50YW5nZW50PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpFfSkpLGUuYml0YW5nZW50JiYobi5hdHRyaWJ1dGVzLmJpdGFuZ2VudD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6VH0pKSxvJiYobi5hdHRyaWJ1dGVzLmV4dHJ1ZGVEaXJlY3Rpb249bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOkN9KSl9aWYodC5leHRydWRlJiZoKHQub2Zmc2V0QXR0cmlidXRlKSl7bGV0IGw9ci5sZW5ndGgvMyxwPW5ldyBVaW50OEFycmF5KGwpO2lmKHQub2Zmc2V0QXR0cmlidXRlPT09ZmUuVE9QKXUmJmN8fGY/cD1wLmZpbGwoMSwwLGwvMik6dSYmKHA9cC5maWxsKDEpKTtlbHNle2xldCBkPXQub2Zmc2V0QXR0cmlidXRlPT09ZmUuTk9ORT8wOjE7cD1wLmZpbGwoZCl9bi5hdHRyaWJ1dGVzLmFwcGx5T2Zmc2V0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuVU5TSUdORURfQllURSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjEsdmFsdWVzOnB9KX1yZXR1cm4gbn1mdW5jdGlvbiBBRih0LGUsbixvLHIsaSxzLGYsdSxjKXtsZXQgbD17d2FsbHM6W119LHA7aWYoc3x8Zil7bGV0IE89eWUuY3JlYXRlR2VvbWV0cnlGcm9tUG9zaXRpb25zKHQsZSxuLG8saSx1LGMpLEU9Ty5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyxUPU8uaW5kaWNlcyxDLE47aWYocyYmZil7bGV0IEk9RS5jb25jYXQoRSk7Qz1JLmxlbmd0aC8zLE49RHQuY3JlYXRlVHlwZWRBcnJheShDLFQubGVuZ3RoKjIpLE4uc2V0KFQpO2xldCBEPVQubGVuZ3RoLHY9Qy8yO2ZvcihwPTA7cDxEO3ArPTMpe2xldCBMPU5bcF0rdixVPU5bcCsxXSt2LEE9TltwKzJdK3Y7TltwK0RdPUEsTltwKzErRF09VSxOW3ArMitEXT1MfWlmKE8uYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXM9SSxpJiZ1Lm5vcm1hbCl7bGV0IEw9Ty5hdHRyaWJ1dGVzLm5vcm1hbC52YWx1ZXM7Ty5hdHRyaWJ1dGVzLm5vcm1hbC52YWx1ZXM9bmV3IEZsb2F0MzJBcnJheShJLmxlbmd0aCksTy5hdHRyaWJ1dGVzLm5vcm1hbC52YWx1ZXMuc2V0KEwpfWlmKHUuc3QmJmgobikpe2xldCBMPU8uYXR0cmlidXRlcy5zdC52YWx1ZXM7Ty5hdHRyaWJ1dGVzLnN0LnZhbHVlcz1uZXcgRmxvYXQzMkFycmF5KEMqMiksTy5hdHRyaWJ1dGVzLnN0LnZhbHVlcz1MLmNvbmNhdChMKX1PLmluZGljZXM9Tn1lbHNlIGlmKGYpe2ZvcihDPUUubGVuZ3RoLzMsTj1EdC5jcmVhdGVUeXBlZEFycmF5KEMsVC5sZW5ndGgpLHA9MDtwPFQubGVuZ3RoO3ArPTMpTltwXT1UW3ArMl0sTltwKzFdPVRbcCsxXSxOW3ArMl09VFtwXTtPLmluZGljZXM9Tn1sLnRvcEFuZEJvdHRvbT1uZXcgY28oe2dlb21ldHJ5Ok99KX1sZXQgZD1yLm91dGVyUmluZyxtPV9vLmZyb21Qb2ludHMoZCx0KSxfPW0ucHJvamVjdFBvaW50c09udG9QbGFuZShkLGdFKSxnPVNlLmNvbXB1dGVXaW5kaW5nT3JkZXIyRChfKTtnPT09Q28uQ0xPQ0tXSVNFJiYoZD1kLnNsaWNlKCkucmV2ZXJzZSgpKTtsZXQgYj15ZS5jb21wdXRlV2FsbEdlb21ldHJ5KGQsbix0LG8saSxjKTtsLndhbGxzLnB1c2gobmV3IGNvKHtnZW9tZXRyeTpifSkpO2xldCB3PXIuaG9sZXM7Zm9yKHA9MDtwPHcubGVuZ3RoO3ArKyl7bGV0IE89d1twXTtfPW0ucHJvamVjdFBvaW50c09udG9QbGFuZShPLGdFKSxnPVNlLmNvbXB1dGVXaW5kaW5nT3JkZXIyRChfKSxnPT09Q28uQ09VTlRFUl9DTE9DS1dJU0UmJihPPU8uc2xpY2UoKS5yZXZlcnNlKCkpLGI9eWUuY29tcHV0ZVdhbGxHZW9tZXRyeShPLG4sdCxvLGksYyksbC53YWxscy5wdXNoKG5ldyBjbyh7Z2VvbWV0cnk6Yn0pKX1yZXR1cm4gbH1mdW5jdGlvbiBScih0KXtpZih5LnR5cGVPZi5vYmplY3QoIm9wdGlvbnMiLHQpLHkudHlwZU9mLm9iamVjdCgib3B0aW9ucy5wb2x5Z29uSGllcmFyY2h5Iix0LnBvbHlnb25IaWVyYXJjaHkpLGgodC5wZXJQb3NpdGlvbkhlaWdodCkmJnQucGVyUG9zaXRpb25IZWlnaHQmJmgodC5oZWlnaHQpKXRocm93IG5ldyBGKCJDYW5ub3QgdXNlIGJvdGggb3B0aW9ucy5wZXJQb3NpdGlvbkhlaWdodCBhbmQgb3B0aW9ucy5oZWlnaHQiKTtpZihoKHQuYXJjVHlwZSkmJnQuYXJjVHlwZSE9PV9lLkdFT0RFU0lDJiZ0LmFyY1R5cGUhPT1fZS5SSFVNQil0aHJvdyBuZXcgRigiSW52YWxpZCBhcmNUeXBlLiBWYWxpZCBvcHRpb25zIGFyZSBBcmNUeXBlLkdFT0RFU0lDIGFuZCBBcmNUeXBlLlJIVU1CLiIpO2xldCBlPXQucG9seWdvbkhpZXJhcmNoeSxuPXgodC52ZXJ0ZXhGb3JtYXQsZHQuREVGQVVMVCksbz14KHQuZWxsaXBzb2lkLCQuV0dTODQpLHI9eCh0LmdyYW51bGFyaXR5LE0uUkFESUFOU19QRVJfREVHUkVFKSxpPXgodC5zdFJvdGF0aW9uLDApLHM9dC50ZXh0dXJlQ29vcmRpbmF0ZXMsZj14KHQucGVyUG9zaXRpb25IZWlnaHQsITEpLHU9ZiYmaCh0LmV4dHJ1ZGVkSGVpZ2h0KSxjPXgodC5oZWlnaHQsMCksbD14KHQuZXh0cnVkZWRIZWlnaHQsYyk7aWYoIXUpe2xldCBwPU1hdGgubWF4KGMsbCk7bD1NYXRoLm1pbihjLGwpLGM9cH10aGlzLl92ZXJ0ZXhGb3JtYXQ9ZHQuY2xvbmUobiksdGhpcy5fZWxsaXBzb2lkPSQuY2xvbmUobyksdGhpcy5fZ3JhbnVsYXJpdHk9cix0aGlzLl9zdFJvdGF0aW9uPWksdGhpcy5faGVpZ2h0PWMsdGhpcy5fZXh0cnVkZWRIZWlnaHQ9bCx0aGlzLl9jbG9zZVRvcD14KHQuY2xvc2VUb3AsITApLHRoaXMuX2Nsb3NlQm90dG9tPXgodC5jbG9zZUJvdHRvbSwhMCksdGhpcy5fcG9seWdvbkhpZXJhcmNoeT1lLHRoaXMuX3BlclBvc2l0aW9uSGVpZ2h0PWYsdGhpcy5fcGVyUG9zaXRpb25IZWlnaHRFeHRydWRlPXUsdGhpcy5fc2hhZG93Vm9sdW1lPXgodC5zaGFkb3dWb2x1bWUsITEpLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZVBvbHlnb25HZW9tZXRyeSIsdGhpcy5fb2Zmc2V0QXR0cmlidXRlPXQub2Zmc2V0QXR0cmlidXRlLHRoaXMuX2FyY1R5cGU9eCh0LmFyY1R5cGUsX2UuR0VPREVTSUMpLHRoaXMuX3JlY3RhbmdsZT12b2lkIDAsdGhpcy5fdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50cz12b2lkIDAsdGhpcy5fdGV4dHVyZUNvb3JkaW5hdGVzPXMsdGhpcy5wYWNrZWRMZW5ndGg9eWUuY29tcHV0ZUhpZXJhcmNoeVBhY2tlZExlbmd0aChlLGEpKyQucGFja2VkTGVuZ3RoK2R0LnBhY2tlZExlbmd0aCsocz95ZS5jb21wdXRlSGllcmFyY2h5UGFja2VkTGVuZ3RoKHMsdHQpOjEpKzEyfWZ1bmN0aW9uIEFFKHQsZSxuLG8scixpKXtsZXQgcz10LmxvbmdpdHVkZSxmPXM+PTA/czpzK00uVFdPX1BJO3Iud2VzdE92ZXJJZGw9TWF0aC5taW4oci53ZXN0T3ZlcklkbCxmKSxyLmVhc3RPdmVySWRsPU1hdGgubWF4KHIuZWFzdE92ZXJJZGwsZiksaS53ZXN0PU1hdGgubWluKGkud2VzdCxzKSxpLmVhc3Q9TWF0aC5tYXgoaS5lYXN0LHMpO2xldCB1PXQuZ2V0TGF0aXR1ZGUobiksYz11O2lmKGkuc291dGg9TWF0aC5taW4oaS5zb3V0aCx1KSxpLm5vcnRoPU1hdGgubWF4KGkubm9ydGgsdSksbyE9PV9lLlJIVU1CKXtsZXQgZD10dC5zdWJ0cmFjdChlLnBvc2l0aW9uLHQucG9zaXRpb24sT0YpLG09dHQuZG90KGUucG9zaXRpb24sZCkvdHQuZG90KGQsZCk7aWYobT4wJiZtPDEpe2xldCBfPXR0LmFkZChlLnBvc2l0aW9uLHR0Lm11bHRpcGx5QnlTY2FsYXIoZCwtbSxkKSxFRiksZz1hci5jbG9uZShlLFJGKTtnLnBvc2l0aW9uPV87bGV0IGI9Zy5nZXRMYXRpdHVkZShuKTtpLnNvdXRoPU1hdGgubWluKGkuc291dGgsYiksaS5ub3J0aD1NYXRoLm1heChpLm5vcnRoLGIpLE1hdGguYWJzKHUpPk1hdGguYWJzKGIpJiYoYz1iKX19bGV0IGw9ZS54KnQueS10LngqZS55LHA9TWF0aC5zaWduKGwpO3AhPT0wJiYocCo9dHQuYW5nbGVCZXR3ZWVuKGUucG9zaXRpb24sdC5wb3NpdGlvbikpLGM+PTAmJihyLm5vcnRoQW5nbGUrPXApLGM8PTAmJihyLnNvdXRoQW5nbGUrPXApfWZ1bmN0aW9uIHhGKHQsZSxuKXtyZXR1cm4gdC5oZWlnaHQ+PU0uUEl8fHQud2lkdGg+PU0uUEk/YXIuZnJvbUNhcnRlc2lhbihlWzBdLENGKS50YW5nZW50UGxhbmU6X28uZnJvbVBvaW50cyhlLG4pfWZ1bmN0aW9uIFBGKHQsZSxuKXtyZXR1cm4obyxyKT0+e2lmKHQuaGVpZ2h0Pj1NLlBJfHx0LndpZHRoPj1NLlBJKXtpZih0LnNvdXRoPDAmJnQubm9ydGg+MCl7aChyKXx8KHI9W10pO2ZvcihsZXQgcz0wO3M8by5sZW5ndGg7KytzKXtsZXQgZj1uLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKG9bc10sd0UpO3Jbc109bmV3IHR0KGYubG9uZ2l0dWRlL00uUEksZi5sYXRpdHVkZS9NLlBJX09WRVJfVFdPKX1yZXR1cm4gci5sZW5ndGg9by5sZW5ndGgscn1yZXR1cm4gYXIuZnJvbUNhcnRlc2lhbkFycmF5KG8scil9cmV0dXJuIF9vLmZyb21Qb2ludHMoZSxuKS5wcm9qZWN0UG9pbnRzT250b1BsYW5lKG8scil9fWZ1bmN0aW9uIE1GKHQsZSxuKXtpZih0LmhlaWdodD49TS5QSXx8dC53aWR0aD49TS5QSSlyZXR1cm4ocixpKT0+e2lmKHQuc291dGg8MCYmdC5ub3J0aD4wKXtsZXQgcz1uLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKHIsd0UpO3JldHVybiBoKGkpfHwoaT1uZXcgdHQpLGkueD1zLmxvbmdpdHVkZS9NLlBJLGkueT1zLmxhdGl0dWRlL00uUElfT1ZFUl9UV08saX1yZXR1cm4gYXIuZnJvbUNhcnRlc2lhbihyLGkpfTtsZXQgbz1fby5mcm9tUG9pbnRzKGUsbik7cmV0dXJuKHIsaSk9Pm8ucHJvamVjdFBvaW50c09udG9QbGFuZShyLGkpfWZ1bmN0aW9uIE5GKHQsZSxuLG8pe3JldHVybihyLGkpPT4hbyYmKHQuaGVpZ2h0Pj1NLlBJX09WRVJfVFdPfHx0LndpZHRoPj0yKk0uUElfT1ZFUl9USFJFRSk/eWUuc3BsaXRQb2x5Z29uc09uRXF1YXRvcihyLGUsbixpKTpyfWZ1bmN0aW9uIElGKHQsZSxuLG8pe2lmKGUuaGVpZ2h0Pj1NLlBJfHxlLndpZHRoPj1NLlBJKXJldHVybiBIci5mcm9tUmVjdGFuZ2xlKGUsdm9pZCAwLF9FKTtsZXQgcj10LGk9X28uZnJvbVBvaW50cyhyLG4pO3JldHVybiB5ZS5jb21wdXRlQm91bmRpbmdSZWN0YW5nbGUoaS5wbGFuZS5ub3JtYWwsaS5wcm9qZWN0UG9pbnRPbnRvUGxhbmUuYmluZChpKSxyLG8sX0UpfWZ1bmN0aW9uIHZGKHQpe2xldCBlPS10Ll9zdFJvdGF0aW9uO2lmKGU9PT0wKXJldHVyblswLDAsMCwxLDEsMF07bGV0IG49dC5fZWxsaXBzb2lkLG89dC5fcG9seWdvbkhpZXJhcmNoeS5wb3NpdGlvbnMscj10LnJlY3RhbmdsZTtyZXR1cm4gVXQuX3RleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHMobyxlLG4scil9dmFyIHNGLGhFLF9FLGFGLGZGLHVGLGxGLHBGLGRGLE1kLGRpLHhhLG1GLGhGLF9GLHlFLHlGLGdGLGdFLGJGLHdGLFRGLE9GLEVGLFJGLGJFLFNGLEVyLENGLHdFLHN5LFRFPVooKCk9PntmYygpO0NmKCk7TWUoKTtGZSgpO0Z0KCk7UGUoKTtYdCgpO0xlKCk7SXQoKTtmdCgpO0h0KCk7WnQoKTtsYSgpO1hlKCk7WWUoKTtzYygpO0xvKCk7c2koKTskZSgpO1d0KCk7Rm4oKTtMZigpO3FyKCk7V28oKTt3bigpO21FKCk7RW8oKTtsYygpO3NGPW5ldyBhdCxoRT1uZXcgYXQ7X0U9bmV3IEhyLGFGPW5ldyBhLGZGPW5ldyBhLHVGPW5ldyBhLGxGPW5ldyBhLHBGPW5ldyBhLGRGPW5ldyBhLE1kPW5ldyBhLGRpPW5ldyBhLHhhPW5ldyBhLG1GPW5ldyB0dCxoRj1uZXcgdHQsX0Y9bmV3IGEseUU9bmV3IGVlLHlGPW5ldyBKLGdGPW5ldyBKO2dFPVtdO1JyLmZyb21Qb3NpdGlvbnM9ZnVuY3Rpb24odCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpLHkuZGVmaW5lZCgib3B0aW9ucy5wb3NpdGlvbnMiLHQucG9zaXRpb25zKTtsZXQgZT17cG9seWdvbkhpZXJhcmNoeTp7cG9zaXRpb25zOnQucG9zaXRpb25zfSxoZWlnaHQ6dC5oZWlnaHQsZXh0cnVkZWRIZWlnaHQ6dC5leHRydWRlZEhlaWdodCx2ZXJ0ZXhGb3JtYXQ6dC52ZXJ0ZXhGb3JtYXQsc3RSb3RhdGlvbjp0LnN0Um90YXRpb24sZWxsaXBzb2lkOnQuZWxsaXBzb2lkLGdyYW51bGFyaXR5OnQuZ3JhbnVsYXJpdHkscGVyUG9zaXRpb25IZWlnaHQ6dC5wZXJQb3NpdGlvbkhlaWdodCxjbG9zZVRvcDp0LmNsb3NlVG9wLGNsb3NlQm90dG9tOnQuY2xvc2VCb3R0b20sb2Zmc2V0QXR0cmlidXRlOnQub2Zmc2V0QXR0cmlidXRlLGFyY1R5cGU6dC5hcmNUeXBlLHRleHR1cmVDb29yZGluYXRlczp0LnRleHR1cmVDb29yZGluYXRlc307cmV0dXJuIG5ldyBScihlKX07UnIucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49eChuLDApLG49eWUucGFja1BvbHlnb25IaWVyYXJjaHkodC5fcG9seWdvbkhpZXJhcmNoeSxlLG4sYSksJC5wYWNrKHQuX2VsbGlwc29pZCxlLG4pLG4rPSQucGFja2VkTGVuZ3RoLGR0LnBhY2sodC5fdmVydGV4Rm9ybWF0LGUsbiksbis9ZHQucGFja2VkTGVuZ3RoLGVbbisrXT10Ll9oZWlnaHQsZVtuKytdPXQuX2V4dHJ1ZGVkSGVpZ2h0LGVbbisrXT10Ll9ncmFudWxhcml0eSxlW24rK109dC5fc3RSb3RhdGlvbixlW24rK109dC5fcGVyUG9zaXRpb25IZWlnaHRFeHRydWRlPzE6MCxlW24rK109dC5fcGVyUG9zaXRpb25IZWlnaHQ/MTowLGVbbisrXT10Ll9jbG9zZVRvcD8xOjAsZVtuKytdPXQuX2Nsb3NlQm90dG9tPzE6MCxlW24rK109dC5fc2hhZG93Vm9sdW1lPzE6MCxlW24rK109eCh0Ll9vZmZzZXRBdHRyaWJ1dGUsLTEpLGVbbisrXT10Ll9hcmNUeXBlLGgodC5fdGV4dHVyZUNvb3JkaW5hdGVzKT9uPXllLnBhY2tQb2x5Z29uSGllcmFyY2h5KHQuX3RleHR1cmVDb29yZGluYXRlcyxlLG4sdHQpOmVbbisrXT0tMSxlW24rK109dC5wYWNrZWRMZW5ndGgsZX07YkY9JC5jbG9uZSgkLlVOSVRfU1BIRVJFKSx3Rj1uZXcgZHQsVEY9e3BvbHlnb25IaWVyYXJjaHk6e319O1JyLnVucGFjaz1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCk7bGV0IG89eWUudW5wYWNrUG9seWdvbkhpZXJhcmNoeSh0LGUsYSk7ZT1vLnN0YXJ0aW5nSW5kZXgsZGVsZXRlIG8uc3RhcnRpbmdJbmRleDtsZXQgcj0kLnVucGFjayh0LGUsYkYpO2UrPSQucGFja2VkTGVuZ3RoO2xldCBpPWR0LnVucGFjayh0LGUsd0YpO2UrPWR0LnBhY2tlZExlbmd0aDtsZXQgcz10W2UrK10sZj10W2UrK10sdT10W2UrK10sYz10W2UrK10sbD10W2UrK109PT0xLHA9dFtlKytdPT09MSxkPXRbZSsrXT09PTEsbT10W2UrK109PT0xLF89dFtlKytdPT09MSxnPXRbZSsrXSxiPXRbZSsrXSx3PXRbZV09PT0tMT92b2lkIDA6eWUudW5wYWNrUG9seWdvbkhpZXJhcmNoeSh0LGUsdHQpO2godyk/KGU9dy5zdGFydGluZ0luZGV4LGRlbGV0ZSB3LnN0YXJ0aW5nSW5kZXgpOmUrKztsZXQgTz10W2UrK107cmV0dXJuIGgobil8fChuPW5ldyBScihURikpLG4uX3BvbHlnb25IaWVyYXJjaHk9byxuLl9lbGxpcHNvaWQ9JC5jbG9uZShyLG4uX2VsbGlwc29pZCksbi5fdmVydGV4Rm9ybWF0PWR0LmNsb25lKGksbi5fdmVydGV4Rm9ybWF0KSxuLl9oZWlnaHQ9cyxuLl9leHRydWRlZEhlaWdodD1mLG4uX2dyYW51bGFyaXR5PXUsbi5fc3RSb3RhdGlvbj1jLG4uX3BlclBvc2l0aW9uSGVpZ2h0RXh0cnVkZT1sLG4uX3BlclBvc2l0aW9uSGVpZ2h0PXAsbi5fY2xvc2VUb3A9ZCxuLl9jbG9zZUJvdHRvbT1tLG4uX3NoYWRvd1ZvbHVtZT1fLG4uX29mZnNldEF0dHJpYnV0ZT1nPT09LTE/dm9pZCAwOmcsbi5fYXJjVHlwZT1iLG4uX3RleHR1cmVDb29yZGluYXRlcz13LG4ucGFja2VkTGVuZ3RoPU8sbn07T0Y9bmV3IHR0LEVGPW5ldyB0dCxSRj1uZXcgYXI7YkU9bmV3IGFyLFNGPW5ldyBhcixFcj17bm9ydGhBbmdsZTowLHNvdXRoQW5nbGU6MCx3ZXN0T3ZlcklkbDowLGVhc3RPdmVySWRsOjB9O1JyLmNvbXB1dGVSZWN0YW5nbGVGcm9tUG9zaXRpb25zPWZ1bmN0aW9uKHQsZSxuLG8pe2lmKHkuZGVmaW5lZCgicG9zaXRpb25zIix0KSxoKG8pfHwobz1uZXcgTnQpLHQubGVuZ3RoPDMpcmV0dXJuIG87by53ZXN0PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxvLmVhc3Q9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLG8uc291dGg9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLG8ubm9ydGg9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLEVyLm5vcnRoQW5nbGU9MCxFci5zb3V0aEFuZ2xlPTAsRXIud2VzdE92ZXJJZGw9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLEVyLmVhc3RPdmVySWRsPU51bWJlci5ORUdBVElWRV9JTkZJTklUWTtsZXQgcj10Lmxlbmd0aCxpPWFyLmZyb21DYXJ0ZXNpYW4odFswXSxTRik7Zm9yKGxldCBzPTE7czxyO3MrKyl7bGV0IGY9YXIuZnJvbUNhcnRlc2lhbih0W3NdLGJFKTtBRShmLGksZSxuLEVyLG8pLGk9YXIuY2xvbmUoZixpKX1yZXR1cm4gQUUoYXIuZnJvbUNhcnRlc2lhbih0WzBdLGJFKSxpLGUsbixFcixvKSxvLmVhc3Qtby53ZXN0PkVyLmVhc3RPdmVySWRsLUVyLndlc3RPdmVySWRsJiYoby53ZXN0PUVyLndlc3RPdmVySWRsLG8uZWFzdD1Fci5lYXN0T3ZlcklkbCxvLmVhc3Q+TS5QSSYmKG8uZWFzdD1vLmVhc3QtTS5UV09fUEkpLG8ud2VzdD5NLlBJJiYoby53ZXN0PW8ud2VzdC1NLlRXT19QSSkpLE0uZXF1YWxzRXBzaWxvbihNYXRoLmFicyhFci5ub3J0aEFuZ2xlKSxNLlRXT19QSSxNLkVQU0lMT04xMCkmJihvLm5vcnRoPU0uUElfT1ZFUl9UV08sby5lYXN0PU0uUEksby53ZXN0PS1NLlBJKSxNLmVxdWFsc0Vwc2lsb24oTWF0aC5hYnMoRXIuc291dGhBbmdsZSksTS5UV09fUEksTS5FUFNJTE9OMTApJiYoby5zb3V0aD0tTS5QSV9PVkVSX1RXTyxvLmVhc3Q9TS5QSSxvLndlc3Q9LU0uUEkpLG99O0NGPW5ldyBhcjt3RT1uZXcgYXQ7UnIuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fdmVydGV4Rm9ybWF0LG49dC5fZWxsaXBzb2lkLG89dC5fZ3JhbnVsYXJpdHkscj10Ll9zdFJvdGF0aW9uLGk9dC5fcG9seWdvbkhpZXJhcmNoeSxzPXQuX3BlclBvc2l0aW9uSGVpZ2h0LGY9dC5fY2xvc2VUb3AsdT10Ll9jbG9zZUJvdHRvbSxjPXQuX2FyY1R5cGUsbD10Ll90ZXh0dXJlQ29vcmRpbmF0ZXMscD1oKGwpLGQ9aS5wb3NpdGlvbnM7aWYoZC5sZW5ndGg8MylyZXR1cm47bGV0IG09dC5yZWN0YW5nbGUsXz15ZS5wb2x5Z29uc0Zyb21IaWVyYXJjaHkoaSxwLFBGKG0sZCxuKSwhcyxuLE5GKG0sbixjLHMpKSxnPV8uaGllcmFyY2h5LGI9Xy5wb2x5Z29ucyx3PWZ1bmN0aW9uKFApe3JldHVybiBQfSxPPXA/eWUucG9seWdvbnNGcm9tSGllcmFyY2h5KGwsITAsdywhMSxuKS5wb2x5Z29uczp2b2lkIDA7aWYoZy5sZW5ndGg9PT0wKXJldHVybjtsZXQgRT1nWzBdLm91dGVyUmluZyxUPUlGKEUsbSxuLHIpLEM9W10sTj10Ll9oZWlnaHQsST10Ll9leHRydWRlZEhlaWdodCxEPXQuX3BlclBvc2l0aW9uSGVpZ2h0RXh0cnVkZXx8IU0uZXF1YWxzRXBzaWxvbihOLEksMCxNLkVQU0lMT04yKSx2PXtwZXJQb3NpdGlvbkhlaWdodDpzLHZlcnRleEZvcm1hdDplLGdlb21ldHJ5OnZvaWQgMCxyb3RhdGlvbkF4aXM6eEYobSxFLG4pLnBsYW5lLm5vcm1hbCxwcm9qZWN0VG8yZDpNRihtLEUsbiksYm91bmRpbmdSZWN0YW5nbGU6VCxlbGxpcHNvaWQ6bixzdFJvdGF0aW9uOnIsdGV4dHVyZUNvb3JkaW5hdGVzOnZvaWQgMCxib3R0b206ITEsdG9wOiEwLHdhbGw6ITEsZXh0cnVkZTohMSxhcmNUeXBlOmN9LEw7aWYoRClmb3Iodi5leHRydWRlPSEwLHYudG9wPWYsdi5ib3R0b209dSx2LnNoYWRvd1ZvbHVtZT10Ll9zaGFkb3dWb2x1bWUsdi5vZmZzZXRBdHRyaWJ1dGU9dC5fb2Zmc2V0QXR0cmlidXRlLEw9MDtMPGIubGVuZ3RoO0wrKyl7bGV0IFA9QUYobixiW0xdLHA/T1tMXTp2b2lkIDAsbyxnW0xdLHMsZix1LGUsYyksQjtmJiZ1PyhCPVAudG9wQW5kQm90dG9tLHYuZ2VvbWV0cnk9eWUuc2NhbGVUb0dlb2RldGljSGVpZ2h0RXh0cnVkZWQoQi5nZW9tZXRyeSxOLEksbixzKSk6Zj8oQj1QLnRvcEFuZEJvdHRvbSxCLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzPVNlLnNjYWxlVG9HZW9kZXRpY0hlaWdodChCLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLE4sbiwhcyksdi5nZW9tZXRyeT1CLmdlb21ldHJ5KTp1JiYoQj1QLnRvcEFuZEJvdHRvbSxCLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzPVNlLnNjYWxlVG9HZW9kZXRpY0hlaWdodChCLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLEksbiwhMCksdi5nZW9tZXRyeT1CLmdlb21ldHJ5KSwoZnx8dSkmJih2LndhbGw9ITEsQi5nZW9tZXRyeT1peSh2KSxDLnB1c2goQikpO2xldCBqPVAud2FsbHM7di53YWxsPSEwO2ZvcihsZXQgSD0wO0g8ai5sZW5ndGg7SCsrKXtsZXQgaz1qW0hdO3YuZ2VvbWV0cnk9eWUuc2NhbGVUb0dlb2RldGljSGVpZ2h0RXh0cnVkZWQoay5nZW9tZXRyeSxOLEksbixzKSxrLmdlb21ldHJ5PWl5KHYpLEMucHVzaChrKX19ZWxzZSBmb3IoTD0wO0w8Yi5sZW5ndGg7TCsrKXtsZXQgUD1uZXcgY28oe2dlb21ldHJ5OnllLmNyZWF0ZUdlb21ldHJ5RnJvbVBvc2l0aW9ucyhuLGJbTF0scD9PW0xdOnZvaWQgMCxvLHMsZSxjKX0pO2lmKFAuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXM9U2Uuc2NhbGVUb0dlb2RldGljSGVpZ2h0KFAuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMsTixuLCFzKSx2Lmdlb21ldHJ5PVAuZ2VvbWV0cnksUC5nZW9tZXRyeT1peSh2KSxoKHQuX29mZnNldEF0dHJpYnV0ZSkpe2xldCBCPVAuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMubGVuZ3RoLGo9dC5fb2Zmc2V0QXR0cmlidXRlPT09ZmUuTk9ORT8wOjEsSD1uZXcgVWludDhBcnJheShCLzMpLmZpbGwoaik7UC5nZW9tZXRyeS5hdHRyaWJ1dGVzLmFwcGx5T2Zmc2V0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuVU5TSUdORURfQllURSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjEsdmFsdWVzOkh9KX1DLnB1c2goUCl9bGV0IFU9VmUuY29tYmluZUluc3RhbmNlcyhDKVswXTtVLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzPW5ldyBGbG9hdDY0QXJyYXkoVS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyksVS5pbmRpY2VzPUR0LmNyZWF0ZVR5cGVkQXJyYXkoVS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGgvMyxVLmluZGljZXMpO2xldCBBPVUuYXR0cmlidXRlcyxTPUF0LmZyb21WZXJ0aWNlcyhBLnBvc2l0aW9uLnZhbHVlcyk7cmV0dXJuIGUucG9zaXRpb258fGRlbGV0ZSBBLnBvc2l0aW9uLG5ldyBVdCh7YXR0cmlidXRlczpBLGluZGljZXM6VS5pbmRpY2VzLHByaW1pdGl2ZVR5cGU6VS5wcmltaXRpdmVUeXBlLGJvdW5kaW5nU3BoZXJlOlMsb2Zmc2V0QXR0cmlidXRlOnQuX29mZnNldEF0dHJpYnV0ZX0pfTtSci5jcmVhdGVTaGFkb3dWb2x1bWU9ZnVuY3Rpb24odCxlLG4pe2xldCBvPXQuX2dyYW51bGFyaXR5LHI9dC5fZWxsaXBzb2lkLGk9ZShvLHIpLHM9bihvLHIpO3JldHVybiBuZXcgUnIoe3BvbHlnb25IaWVyYXJjaHk6dC5fcG9seWdvbkhpZXJhcmNoeSxlbGxpcHNvaWQ6cixzdFJvdGF0aW9uOnQuX3N0Um90YXRpb24sZ3JhbnVsYXJpdHk6byxwZXJQb3NpdGlvbkhlaWdodDohMSxleHRydWRlZEhlaWdodDppLGhlaWdodDpzLHZlcnRleEZvcm1hdDpkdC5QT1NJVElPTl9PTkxZLHNoYWRvd1ZvbHVtZTohMCxhcmNUeXBlOnQuX2FyY1R5cGV9KX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUnIucHJvdG90eXBlLHtyZWN0YW5nbGU6e2dldDpmdW5jdGlvbigpe2lmKCFoKHRoaXMuX3JlY3RhbmdsZSkpe2xldCB0PXRoaXMuX3BvbHlnb25IaWVyYXJjaHkucG9zaXRpb25zO3RoaXMuX3JlY3RhbmdsZT1Sci5jb21wdXRlUmVjdGFuZ2xlRnJvbVBvc2l0aW9ucyh0LHRoaXMuX2VsbGlwc29pZCx0aGlzLl9hcmNUeXBlKX1yZXR1cm4gdGhpcy5fcmVjdGFuZ2xlfX0sdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50czp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGgodGhpcy5fdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50cyl8fCh0aGlzLl90ZXh0dXJlQ29vcmRpbmF0ZVJvdGF0aW9uUG9pbnRzPXZGKHRoaXMpKSx0aGlzLl90ZXh0dXJlQ29vcmRpbmF0ZVJvdGF0aW9uUG9pbnRzfX19KTtzeT1Scn0pO3ZhciBjeT17fTtkZShjeSx7ZGVmYXVsdDooKT0+REZ9KTtmdW5jdGlvbiBMRih0LGUpe3JldHVybiBoKGUpJiYodD1zeS51bnBhY2sodCxlKSksdC5fZWxsaXBzb2lkPSQuY2xvbmUodC5fZWxsaXBzb2lkKSxzeS5jcmVhdGVHZW9tZXRyeSh0KX12YXIgREYsYXk9WigoKT0+e2Z0KCk7WnQoKTtURSgpO0RGPUxGfSk7ZnVuY3Rpb24gRkYodCxlLG4sbyxyKXtsZXQgcz1fby5mcm9tUG9pbnRzKGUsdCkucHJvamVjdFBvaW50c09udG9QbGFuZShlLE9FKTtTZS5jb21wdXRlV2luZGluZ09yZGVyMkQocyk9PT1Dby5DTE9DS1dJU0UmJihzLnJldmVyc2UoKSxlPWUuc2xpY2UoKS5yZXZlcnNlKCkpO2xldCB1LGMsbD1lLmxlbmd0aCxwPTA7aWYobylmb3IodT1uZXcgRmxvYXQ2NEFycmF5KGwqMiozKSxjPTA7YzxsO2MrKyl7bGV0IF89ZVtjXSxnPWVbKGMrMSklbF07dVtwKytdPV8ueCx1W3ArK109Xy55LHVbcCsrXT1fLnosdVtwKytdPWcueCx1W3ArK109Zy55LHVbcCsrXT1nLnp9ZWxzZXtsZXQgXz0wO2lmKHI9PT1fZS5HRU9ERVNJQylmb3IoYz0wO2M8bDtjKyspXys9eWUuc3ViZGl2aWRlTGluZUNvdW50KGVbY10sZVsoYysxKSVsXSxuKTtlbHNlIGlmKHI9PT1fZS5SSFVNQilmb3IoYz0wO2M8bDtjKyspXys9eWUuc3ViZGl2aWRlUmh1bWJMaW5lQ291bnQodCxlW2NdLGVbKGMrMSklbF0sbik7Zm9yKHU9bmV3IEZsb2F0NjRBcnJheShfKjMpLGM9MDtjPGw7YysrKXtsZXQgZztyPT09X2UuR0VPREVTSUM/Zz15ZS5zdWJkaXZpZGVMaW5lKGVbY10sZVsoYysxKSVsXSxuLE5kKTpyPT09X2UuUkhVTUImJihnPXllLnN1YmRpdmlkZVJodW1iTGluZSh0LGVbY10sZVsoYysxKSVsXSxuLE5kKSk7bGV0IGI9Zy5sZW5ndGg7Zm9yKGxldCB3PTA7dzxiOysrdyl1W3ArK109Z1t3XX19bD11Lmxlbmd0aC8zO2xldCBkPWwqMixtPUR0LmNyZWF0ZVR5cGVkQXJyYXkobCxkKTtmb3IocD0wLGM9MDtjPGwtMTtjKyspbVtwKytdPWMsbVtwKytdPWMrMTtyZXR1cm4gbVtwKytdPWwtMSxtW3ArK109MCxuZXcgY28oe2dlb21ldHJ5Om5ldyBVdCh7YXR0cmlidXRlczpuZXcgaWUoe3Bvc2l0aW9uOm5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6dX0pfSksaW5kaWNlczptLHByaW1pdGl2ZVR5cGU6QnQuTElORVN9KX0pfWZ1bmN0aW9uIEJGKHQsZSxuLG8scil7bGV0IHM9X28uZnJvbVBvaW50cyhlLHQpLnByb2plY3RQb2ludHNPbnRvUGxhbmUoZSxPRSk7U2UuY29tcHV0ZVdpbmRpbmdPcmRlcjJEKHMpPT09Q28uQ0xPQ0tXSVNFJiYocy5yZXZlcnNlKCksZT1lLnNsaWNlKCkucmV2ZXJzZSgpKTtsZXQgdSxjLGw9ZS5sZW5ndGgscD1uZXcgQXJyYXkobCksZD0wO2lmKG8pZm9yKHU9bmV3IEZsb2F0NjRBcnJheShsKjIqMyoyKSxjPTA7YzxsOysrYyl7cFtjXT1kLzM7bGV0IGI9ZVtjXSx3PWVbKGMrMSklbF07dVtkKytdPWIueCx1W2QrK109Yi55LHVbZCsrXT1iLnosdVtkKytdPXcueCx1W2QrK109dy55LHVbZCsrXT13Lnp9ZWxzZXtsZXQgYj0wO2lmKHI9PT1fZS5HRU9ERVNJQylmb3IoYz0wO2M8bDtjKyspYis9eWUuc3ViZGl2aWRlTGluZUNvdW50KGVbY10sZVsoYysxKSVsXSxuKTtlbHNlIGlmKHI9PT1fZS5SSFVNQilmb3IoYz0wO2M8bDtjKyspYis9eWUuc3ViZGl2aWRlUmh1bWJMaW5lQ291bnQodCxlW2NdLGVbKGMrMSklbF0sbik7Zm9yKHU9bmV3IEZsb2F0NjRBcnJheShiKjMqMiksYz0wO2M8bDsrK2Mpe3BbY109ZC8zO2xldCB3O3I9PT1fZS5HRU9ERVNJQz93PXllLnN1YmRpdmlkZUxpbmUoZVtjXSxlWyhjKzEpJWxdLG4sTmQpOnI9PT1fZS5SSFVNQiYmKHc9eWUuc3ViZGl2aWRlUmh1bWJMaW5lKHQsZVtjXSxlWyhjKzEpJWxdLG4sTmQpKTtsZXQgTz13Lmxlbmd0aDtmb3IobGV0IEU9MDtFPE87KytFKXVbZCsrXT13W0VdfX1sPXUubGVuZ3RoLygzKjIpO2xldCBtPXAubGVuZ3RoLF89KGwqMittKSoyLGc9RHQuY3JlYXRlVHlwZWRBcnJheShsK20sXyk7Zm9yKGQ9MCxjPTA7YzxsOysrYylnW2QrK109YyxnW2QrK109KGMrMSklbCxnW2QrK109YytsLGdbZCsrXT0oYysxKSVsK2w7Zm9yKGM9MDtjPG07YysrKXtsZXQgYj1wW2NdO2dbZCsrXT1iLGdbZCsrXT1iK2x9cmV0dXJuIG5ldyBjbyh7Z2VvbWV0cnk6bmV3IFV0KHthdHRyaWJ1dGVzOm5ldyBpZSh7cG9zaXRpb246bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczp1fSl9KSxpbmRpY2VzOmcscHJpbWl0aXZlVHlwZTpCdC5MSU5FU30pfSl9ZnVuY3Rpb24gQWModCl7aWYoeS50eXBlT2Yub2JqZWN0KCJvcHRpb25zIix0KSx5LnR5cGVPZi5vYmplY3QoIm9wdGlvbnMucG9seWdvbkhpZXJhcmNoeSIsdC5wb2x5Z29uSGllcmFyY2h5KSx0LnBlclBvc2l0aW9uSGVpZ2h0JiZoKHQuaGVpZ2h0KSl0aHJvdyBuZXcgRigiQ2Fubm90IHVzZSBib3RoIG9wdGlvbnMucGVyUG9zaXRpb25IZWlnaHQgYW5kIG9wdGlvbnMuaGVpZ2h0Iik7aWYoaCh0LmFyY1R5cGUpJiZ0LmFyY1R5cGUhPT1fZS5HRU9ERVNJQyYmdC5hcmNUeXBlIT09X2UuUkhVTUIpdGhyb3cgbmV3IEYoIkludmFsaWQgYXJjVHlwZS4gVmFsaWQgb3B0aW9ucyBhcmUgQXJjVHlwZS5HRU9ERVNJQyBhbmQgQXJjVHlwZS5SSFVNQi4iKTtsZXQgZT10LnBvbHlnb25IaWVyYXJjaHksbj14KHQuZWxsaXBzb2lkLCQuV0dTODQpLG89eCh0LmdyYW51bGFyaXR5LE0uUkFESUFOU19QRVJfREVHUkVFKSxyPXgodC5wZXJQb3NpdGlvbkhlaWdodCwhMSksaT1yJiZoKHQuZXh0cnVkZWRIZWlnaHQpLHM9eCh0LmFyY1R5cGUsX2UuR0VPREVTSUMpLGY9eCh0LmhlaWdodCwwKSx1PXgodC5leHRydWRlZEhlaWdodCxmKTtpZighaSl7bGV0IGM9TWF0aC5tYXgoZix1KTt1PU1hdGgubWluKGYsdSksZj1jfXRoaXMuX2VsbGlwc29pZD0kLmNsb25lKG4pLHRoaXMuX2dyYW51bGFyaXR5PW8sdGhpcy5faGVpZ2h0PWYsdGhpcy5fZXh0cnVkZWRIZWlnaHQ9dSx0aGlzLl9hcmNUeXBlPXMsdGhpcy5fcG9seWdvbkhpZXJhcmNoeT1lLHRoaXMuX3BlclBvc2l0aW9uSGVpZ2h0PXIsdGhpcy5fcGVyUG9zaXRpb25IZWlnaHRFeHRydWRlPWksdGhpcy5fb2Zmc2V0QXR0cmlidXRlPXQub2Zmc2V0QXR0cmlidXRlLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZVBvbHlnb25PdXRsaW5lR2VvbWV0cnkiLHRoaXMucGFja2VkTGVuZ3RoPXllLmNvbXB1dGVIaWVyYXJjaHlQYWNrZWRMZW5ndGgoZSxhKSskLnBhY2tlZExlbmd0aCs4fXZhciBPRSxOZCxVRixWRixmeSxFRT1aKCgpPT57ZmMoKTtNZSgpO0Z0KCk7WHQoKTtMZSgpO0l0KCk7ZnQoKTtIdCgpO1p0KCk7bGEoKTtYZSgpO1llKCk7YW4oKTtzYygpO0xvKCk7c2koKTskZSgpO1d0KCk7TGYoKTtxcigpO3RuKCk7bGMoKTtPRT1bXSxOZD1bXTtBYy5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCkseS5kZWZpbmVkKCJhcnJheSIsZSksbj14KG4sMCksbj15ZS5wYWNrUG9seWdvbkhpZXJhcmNoeSh0Ll9wb2x5Z29uSGllcmFyY2h5LGUsbixhKSwkLnBhY2sodC5fZWxsaXBzb2lkLGUsbiksbis9JC5wYWNrZWRMZW5ndGgsZVtuKytdPXQuX2hlaWdodCxlW24rK109dC5fZXh0cnVkZWRIZWlnaHQsZVtuKytdPXQuX2dyYW51bGFyaXR5LGVbbisrXT10Ll9wZXJQb3NpdGlvbkhlaWdodEV4dHJ1ZGU/MTowLGVbbisrXT10Ll9wZXJQb3NpdGlvbkhlaWdodD8xOjAsZVtuKytdPXQuX2FyY1R5cGUsZVtuKytdPXgodC5fb2Zmc2V0QXR0cmlidXRlLC0xKSxlW25dPXQucGFja2VkTGVuZ3RoLGV9O1VGPSQuY2xvbmUoJC5VTklUX1NQSEVSRSksVkY9e3BvbHlnb25IaWVyYXJjaHk6e319O0FjLnVucGFjaz1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCk7bGV0IG89eWUudW5wYWNrUG9seWdvbkhpZXJhcmNoeSh0LGUsYSk7ZT1vLnN0YXJ0aW5nSW5kZXgsZGVsZXRlIG8uc3RhcnRpbmdJbmRleDtsZXQgcj0kLnVucGFjayh0LGUsVUYpO2UrPSQucGFja2VkTGVuZ3RoO2xldCBpPXRbZSsrXSxzPXRbZSsrXSxmPXRbZSsrXSx1PXRbZSsrXT09PTEsYz10W2UrK109PT0xLGw9dFtlKytdLHA9dFtlKytdLGQ9dFtlXTtyZXR1cm4gaChuKXx8KG49bmV3IEFjKFZGKSksbi5fcG9seWdvbkhpZXJhcmNoeT1vLG4uX2VsbGlwc29pZD0kLmNsb25lKHIsbi5fZWxsaXBzb2lkKSxuLl9oZWlnaHQ9aSxuLl9leHRydWRlZEhlaWdodD1zLG4uX2dyYW51bGFyaXR5PWYsbi5fcGVyUG9zaXRpb25IZWlnaHQ9YyxuLl9wZXJQb3NpdGlvbkhlaWdodEV4dHJ1ZGU9dSxuLl9hcmNUeXBlPWwsbi5fb2Zmc2V0QXR0cmlidXRlPXA9PT0tMT92b2lkIDA6cCxuLnBhY2tlZExlbmd0aD1kLG59O0FjLmZyb21Qb3NpdGlvbnM9ZnVuY3Rpb24odCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpLHkuZGVmaW5lZCgib3B0aW9ucy5wb3NpdGlvbnMiLHQucG9zaXRpb25zKTtsZXQgZT17cG9seWdvbkhpZXJhcmNoeTp7cG9zaXRpb25zOnQucG9zaXRpb25zfSxoZWlnaHQ6dC5oZWlnaHQsZXh0cnVkZWRIZWlnaHQ6dC5leHRydWRlZEhlaWdodCxlbGxpcHNvaWQ6dC5lbGxpcHNvaWQsZ3JhbnVsYXJpdHk6dC5ncmFudWxhcml0eSxwZXJQb3NpdGlvbkhlaWdodDp0LnBlclBvc2l0aW9uSGVpZ2h0LGFyY1R5cGU6dC5hcmNUeXBlLG9mZnNldEF0dHJpYnV0ZTp0Lm9mZnNldEF0dHJpYnV0ZX07cmV0dXJuIG5ldyBBYyhlKX07QWMuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fZWxsaXBzb2lkLG49dC5fZ3JhbnVsYXJpdHksbz10Ll9wb2x5Z29uSGllcmFyY2h5LHI9dC5fcGVyUG9zaXRpb25IZWlnaHQsaT10Ll9hcmNUeXBlLHM9eWUucG9seWdvbk91dGxpbmVzRnJvbUhpZXJhcmNoeShvLCFyLGUpO2lmKHMubGVuZ3RoPT09MClyZXR1cm47bGV0IGYsdT1bXSxjPU0uY2hvcmRMZW5ndGgobixlLm1heGltdW1SYWRpdXMpLGw9dC5faGVpZ2h0LHA9dC5fZXh0cnVkZWRIZWlnaHQsZD10Ll9wZXJQb3NpdGlvbkhlaWdodEV4dHJ1ZGV8fCFNLmVxdWFsc0Vwc2lsb24obCxwLDAsTS5FUFNJTE9OMiksbSxfO2lmKGQpZm9yKF89MDtfPHMubGVuZ3RoO18rKyl7aWYoZj1CRihlLHNbX10sYyxyLGkpLGYuZ2VvbWV0cnk9eWUuc2NhbGVUb0dlb2RldGljSGVpZ2h0RXh0cnVkZWQoZi5nZW9tZXRyeSxsLHAsZSxyKSxoKHQuX29mZnNldEF0dHJpYnV0ZSkpe2xldCB3PWYuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMubGVuZ3RoLzMsTz1uZXcgVWludDhBcnJheSh3KTt0Ll9vZmZzZXRBdHRyaWJ1dGU9PT1mZS5UT1A/Tz1PLmZpbGwoMSwwLHcvMik6KG09dC5fb2Zmc2V0QXR0cmlidXRlPT09ZmUuTk9ORT8wOjEsTz1PLmZpbGwobSkpLGYuZ2VvbWV0cnkuYXR0cmlidXRlcy5hcHBseU9mZnNldD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LlVOU0lHTkVEX0JZVEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZToxLHZhbHVlczpPfSl9dS5wdXNoKGYpfWVsc2UgZm9yKF89MDtfPHMubGVuZ3RoO18rKyl7aWYoZj1GRihlLHNbX10sYyxyLGkpLGYuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXM9U2Uuc2NhbGVUb0dlb2RldGljSGVpZ2h0KGYuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMsbCxlLCFyKSxoKHQuX29mZnNldEF0dHJpYnV0ZSkpe2xldCB3PWYuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMubGVuZ3RoO209dC5fb2Zmc2V0QXR0cmlidXRlPT09ZmUuTk9ORT8wOjE7bGV0IE89bmV3IFVpbnQ4QXJyYXkody8zKS5maWxsKG0pO2YuZ2VvbWV0cnkuYXR0cmlidXRlcy5hcHBseU9mZnNldD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LlVOU0lHTkVEX0JZVEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZToxLHZhbHVlczpPfSl9dS5wdXNoKGYpfWxldCBnPVZlLmNvbWJpbmVJbnN0YW5jZXModSlbMF0sYj1BdC5mcm9tVmVydGljZXMoZy5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyk7cmV0dXJuIG5ldyBVdCh7YXR0cmlidXRlczpnLmF0dHJpYnV0ZXMsaW5kaWNlczpnLmluZGljZXMscHJpbWl0aXZlVHlwZTpnLnByaW1pdGl2ZVR5cGUsYm91bmRpbmdTcGhlcmU6YixvZmZzZXRBdHRyaWJ1dGU6dC5fb2Zmc2V0QXR0cmlidXRlfSl9O2Z5PUFjfSk7dmFyIHV5PXt9O2RlKHV5LHtkZWZhdWx0OigpPT5HRn0pO2Z1bmN0aW9uIGtGKHQsZSl7cmV0dXJuIGgoZSkmJih0PWZ5LnVucGFjayh0LGUpKSx0Ll9lbGxpcHNvaWQ9JC5jbG9uZSh0Ll9lbGxpcHNvaWQpLGZ5LmNyZWF0ZUdlb21ldHJ5KHQpfXZhciBHRixseT1aKCgpPT57ZnQoKTtadCgpO0VFKCk7R0Y9a0Z9KTtmdW5jdGlvbiBweSh0LGUsbil7cmV0dXJuIG48MCYmKG4rPTEpLG4+MSYmKG4tPTEpLG4qNjwxP3QrKGUtdCkqNipuOm4qMjwxP2U6biozPDI/dCsoZS10KSooMi8zLW4pKjY6dH1mdW5jdGlvbiBxKHQsZSxuLG8pe3RoaXMucmVkPXgodCwxKSx0aGlzLmdyZWVuPXgoZSwxKSx0aGlzLmJsdWU9eChuLDEpLHRoaXMuYWxwaGE9eChvLDEpfXZhciBkeSxteSxxaSx6RixqRixIRixxRixvZSxQYT1aKCgpPT57WHQoKTtJdCgpO2Z0KCk7cmgoKTtXdCgpO3EuZnJvbUNhcnRlc2lhbjQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgoZSk/KGUucmVkPXQueCxlLmdyZWVuPXQueSxlLmJsdWU9dC56LGUuYWxwaGE9dC53LGUpOm5ldyBxKHQueCx0LnksdC56LHQudyl9O3EuZnJvbUJ5dGVzPWZ1bmN0aW9uKHQsZSxuLG8scil7cmV0dXJuIHQ9cS5ieXRlVG9GbG9hdCh4KHQsMjU1KSksZT1xLmJ5dGVUb0Zsb2F0KHgoZSwyNTUpKSxuPXEuYnl0ZVRvRmxvYXQoeChuLDI1NSkpLG89cS5ieXRlVG9GbG9hdCh4KG8sMjU1KSksaChyKT8oci5yZWQ9dCxyLmdyZWVuPWUsci5ibHVlPW4sci5hbHBoYT1vLHIpOm5ldyBxKHQsZSxuLG8pfTtxLmZyb21BbHBoYT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY29sb3IiLHQpLHkudHlwZU9mLm51bWJlcigiYWxwaGEiLGUpLGgobik/KG4ucmVkPXQucmVkLG4uZ3JlZW49dC5ncmVlbixuLmJsdWU9dC5ibHVlLG4uYWxwaGE9ZSxuKTpuZXcgcSh0LnJlZCx0LmdyZWVuLHQuYmx1ZSxlKX07WXMuc3VwcG9ydHNUeXBlZEFycmF5cygpJiYoZHk9bmV3IEFycmF5QnVmZmVyKDQpLG15PW5ldyBVaW50MzJBcnJheShkeSkscWk9bmV3IFVpbnQ4QXJyYXkoZHkpKTtxLmZyb21SZ2JhPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG15WzBdPXQscS5mcm9tQnl0ZXMocWlbMF0scWlbMV0scWlbMl0scWlbM10sZSl9O3EuZnJvbUhzbD1mdW5jdGlvbih0LGUsbixvLHIpe3Q9eCh0LDApJTEsZT14KGUsMCksbj14KG4sMCksbz14KG8sMSk7bGV0IGk9bixzPW4sZj1uO2lmKGUhPT0wKXtsZXQgdTtuPC41P3U9biooMStlKTp1PW4rZS1uKmU7bGV0IGM9MipuLXU7aT1weShjLHUsdCsxLzMpLHM9cHkoYyx1LHQpLGY9cHkoYyx1LHQtMS8zKX1yZXR1cm4gaChyKT8oci5yZWQ9aSxyLmdyZWVuPXMsci5ibHVlPWYsci5hbHBoYT1vLHIpOm5ldyBxKGkscyxmLG8pfTtxLmZyb21SYW5kb209ZnVuY3Rpb24odCxlKXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IG49dC5yZWQ7aWYoIWgobikpe2xldCBzPXgodC5taW5pbXVtUmVkLDApLGY9eCh0Lm1heGltdW1SZWQsMSk7eS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIm1pbmltdW1SZWQiLHMsZiksbj1zK00ubmV4dFJhbmRvbU51bWJlcigpKihmLXMpfWxldCBvPXQuZ3JlZW47aWYoIWgobykpe2xldCBzPXgodC5taW5pbXVtR3JlZW4sMCksZj14KHQubWF4aW11bUdyZWVuLDEpO3kudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJtaW5pbXVtR3JlZW4iLHMsZiksbz1zK00ubmV4dFJhbmRvbU51bWJlcigpKihmLXMpfWxldCByPXQuYmx1ZTtpZighaChyKSl7bGV0IHM9eCh0Lm1pbmltdW1CbHVlLDApLGY9eCh0Lm1heGltdW1CbHVlLDEpO3kudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJtaW5pbXVtQmx1ZSIscyxmKSxyPXMrTS5uZXh0UmFuZG9tTnVtYmVyKCkqKGYtcyl9bGV0IGk9dC5hbHBoYTtpZighaChpKSl7bGV0IHM9eCh0Lm1pbmltdW1BbHBoYSwwKSxmPXgodC5tYXhpbXVtQWxwaGEsMSk7eS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIm1pbnVtdW1BbHBoYSIscyxmKSxpPXMrTS5uZXh0UmFuZG9tTnVtYmVyKCkqKGYtcyl9cmV0dXJuIGgoZSk/KGUucmVkPW4sZS5ncmVlbj1vLGUuYmx1ZT1yLGUuYWxwaGE9aSxlKTpuZXcgcShuLG8scixpKX07ekY9L14jKFswLTlhLWZdKShbMC05YS1mXSkoWzAtOWEtZl0pKFswLTlhLWZdKT8kL2ksakY9L14jKFswLTlhLWZdezJ9KShbMC05YS1mXXsyfSkoWzAtOWEtZl17Mn0pKFswLTlhLWZdezJ9KT8kL2ksSEY9L15yZ2JhP1xzKlwoXHMqKFswLTkuXSslPylccypbLFxzXStccyooWzAtOS5dKyU/KVxzKlssXHNdK1xzKihbMC05Ll0rJT8pKD86XHMqWyxccy9dK1xzKihbMC05Ll0rKSk/XHMqXCkkL2kscUY9L15oc2xhP1xzKlwoXHMqKFswLTkuXSspXHMqWyxcc10rXHMqKFswLTkuXSslKVxzKlssXHNdK1xzKihbMC05Ll0rJSkoPzpccypbLFxzL10rXHMqKFswLTkuXSspKT9ccypcKSQvaTtxLmZyb21Dc3NDb2xvclN0cmluZz1mdW5jdGlvbih0LGUpe3kudHlwZU9mLnN0cmluZygiY29sb3IiLHQpLGgoZSl8fChlPW5ldyBxKSx0PXQudHJpbSgpO2xldCBuPXFbdC50b1VwcGVyQ2FzZSgpXTtpZihoKG4pKXJldHVybiBxLmNsb25lKG4sZSksZTtsZXQgbz16Ri5leGVjKHQpO3JldHVybiBvIT09bnVsbD8oZS5yZWQ9cGFyc2VJbnQob1sxXSwxNikvMTUsZS5ncmVlbj1wYXJzZUludChvWzJdLDE2KS8xNSxlLmJsdWU9cGFyc2VJbnQob1szXSwxNikvMTUsZS5hbHBoYT1wYXJzZUludCh4KG9bNF0sImYiKSwxNikvMTUsZSk6KG89akYuZXhlYyh0KSxvIT09bnVsbD8oZS5yZWQ9cGFyc2VJbnQob1sxXSwxNikvMjU1LGUuZ3JlZW49cGFyc2VJbnQob1syXSwxNikvMjU1LGUuYmx1ZT1wYXJzZUludChvWzNdLDE2KS8yNTUsZS5hbHBoYT1wYXJzZUludCh4KG9bNF0sImZmIiksMTYpLzI1NSxlKToobz1IRi5leGVjKHQpLG8hPT1udWxsPyhlLnJlZD1wYXJzZUZsb2F0KG9bMV0pLyhvWzFdLnN1YnN0cigtMSk9PT0iJSI/MTAwOjI1NSksZS5ncmVlbj1wYXJzZUZsb2F0KG9bMl0pLyhvWzJdLnN1YnN0cigtMSk9PT0iJSI/MTAwOjI1NSksZS5ibHVlPXBhcnNlRmxvYXQob1szXSkvKG9bM10uc3Vic3RyKC0xKT09PSIlIj8xMDA6MjU1KSxlLmFscGhhPXBhcnNlRmxvYXQoeChvWzRdLCIxLjAiKSksZSk6KG89cUYuZXhlYyh0KSxvIT09bnVsbD9xLmZyb21Ic2wocGFyc2VGbG9hdChvWzFdKS8zNjAscGFyc2VGbG9hdChvWzJdKS8xMDAscGFyc2VGbG9hdChvWzNdKS8xMDAscGFyc2VGbG9hdCh4KG9bNF0sIjEuMCIpKSxlKTooZT12b2lkIDAsZSkpKSl9O3EucGFja2VkTGVuZ3RoPTQ7cS5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCkseS5kZWZpbmVkKCJhcnJheSIsZSksbj14KG4sMCksZVtuKytdPXQucmVkLGVbbisrXT10LmdyZWVuLGVbbisrXT10LmJsdWUsZVtuXT10LmFscGhhLGV9O3EudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCksaChuKXx8KG49bmV3IHEpLG4ucmVkPXRbZSsrXSxuLmdyZWVuPXRbZSsrXSxuLmJsdWU9dFtlKytdLG4uYWxwaGE9dFtlXSxufTtxLmJ5dGVUb0Zsb2F0PWZ1bmN0aW9uKHQpe3JldHVybiB0LzI1NX07cS5mbG9hdFRvQnl0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdD09PTE/MjU1OnQqMjU2fDB9O3EuY2xvbmU9ZnVuY3Rpb24odCxlKXtpZihoKHQpKXJldHVybiBoKGUpPyhlLnJlZD10LnJlZCxlLmdyZWVuPXQuZ3JlZW4sZS5ibHVlPXQuYmx1ZSxlLmFscGhhPXQuYWxwaGEsZSk6bmV3IHEodC5yZWQsdC5ncmVlbix0LmJsdWUsdC5hbHBoYSl9O3EuZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxoKHQpJiZoKGUpJiZ0LnJlZD09PWUucmVkJiZ0LmdyZWVuPT09ZS5ncmVlbiYmdC5ibHVlPT09ZS5ibHVlJiZ0LmFscGhhPT09ZS5hbHBoYX07cS5lcXVhbHNBcnJheT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQucmVkPT09ZVtuXSYmdC5ncmVlbj09PWVbbisxXSYmdC5ibHVlPT09ZVtuKzJdJiZ0LmFscGhhPT09ZVtuKzNdfTtxLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gcS5jbG9uZSh0aGlzLHQpfTtxLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIHEuZXF1YWxzKHRoaXMsdCl9O3EucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcz09PXR8fGgodCkmJk1hdGguYWJzKHRoaXMucmVkLXQucmVkKTw9ZSYmTWF0aC5hYnModGhpcy5ncmVlbi10LmdyZWVuKTw9ZSYmTWF0aC5hYnModGhpcy5ibHVlLXQuYmx1ZSk8PWUmJk1hdGguYWJzKHRoaXMuYWxwaGEtdC5hbHBoYSk8PWV9O3EucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuYCgke3RoaXMucmVkfSwgJHt0aGlzLmdyZWVufSwgJHt0aGlzLmJsdWV9LCAke3RoaXMuYWxwaGF9KWB9O3EucHJvdG90eXBlLnRvQ3NzQ29sb3JTdHJpbmc9ZnVuY3Rpb24oKXtsZXQgdD1xLmZsb2F0VG9CeXRlKHRoaXMucmVkKSxlPXEuZmxvYXRUb0J5dGUodGhpcy5ncmVlbiksbj1xLmZsb2F0VG9CeXRlKHRoaXMuYmx1ZSk7cmV0dXJuIHRoaXMuYWxwaGE9PT0xP2ByZ2IoJHt0fSwke2V9LCR7bn0pYDpgcmdiYSgke3R9LCR7ZX0sJHtufSwke3RoaXMuYWxwaGF9KWB9O3EucHJvdG90eXBlLnRvQ3NzSGV4U3RyaW5nPWZ1bmN0aW9uKCl7bGV0IHQ9cS5mbG9hdFRvQnl0ZSh0aGlzLnJlZCkudG9TdHJpbmcoMTYpO3QubGVuZ3RoPDImJih0PWAwJHt0fWApO2xldCBlPXEuZmxvYXRUb0J5dGUodGhpcy5ncmVlbikudG9TdHJpbmcoMTYpO2UubGVuZ3RoPDImJihlPWAwJHtlfWApO2xldCBuPXEuZmxvYXRUb0J5dGUodGhpcy5ibHVlKS50b1N0cmluZygxNik7aWYobi5sZW5ndGg8MiYmKG49YDAke259YCksdGhpcy5hbHBoYTwxKXtsZXQgbz1xLmZsb2F0VG9CeXRlKHRoaXMuYWxwaGEpLnRvU3RyaW5nKDE2KTtyZXR1cm4gby5sZW5ndGg8MiYmKG89YDAke299YCksYCMke3R9JHtlfSR7bn0ke299YH1yZXR1cm5gIyR7dH0ke2V9JHtufWB9O3EucHJvdG90eXBlLnRvQnl0ZXM9ZnVuY3Rpb24odCl7bGV0IGU9cS5mbG9hdFRvQnl0ZSh0aGlzLnJlZCksbj1xLmZsb2F0VG9CeXRlKHRoaXMuZ3JlZW4pLG89cS5mbG9hdFRvQnl0ZSh0aGlzLmJsdWUpLHI9cS5mbG9hdFRvQnl0ZSh0aGlzLmFscGhhKTtyZXR1cm4gaCh0KT8odFswXT1lLHRbMV09bix0WzJdPW8sdFszXT1yLHQpOltlLG4sbyxyXX07cS5wcm90b3R5cGUudG9SZ2JhPWZ1bmN0aW9uKCl7cmV0dXJuIHFpWzBdPXEuZmxvYXRUb0J5dGUodGhpcy5yZWQpLHFpWzFdPXEuZmxvYXRUb0J5dGUodGhpcy5ncmVlbikscWlbMl09cS5mbG9hdFRvQnl0ZSh0aGlzLmJsdWUpLHFpWzNdPXEuZmxvYXRUb0J5dGUodGhpcy5hbHBoYSksbXlbMF19O3EucHJvdG90eXBlLmJyaWdodGVuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm51bWJlcigibWFnbml0dWRlIix0KSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygibWFnbml0dWRlIix0LDApLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSx0PTEtdCxlLnJlZD0xLSgxLXRoaXMucmVkKSp0LGUuZ3JlZW49MS0oMS10aGlzLmdyZWVuKSp0LGUuYmx1ZT0xLSgxLXRoaXMuYmx1ZSkqdCxlLmFscGhhPXRoaXMuYWxwaGEsZX07cS5wcm90b3R5cGUuZGFya2VuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm51bWJlcigibWFnbml0dWRlIix0KSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygibWFnbml0dWRlIix0LDApLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSx0PTEtdCxlLnJlZD10aGlzLnJlZCp0LGUuZ3JlZW49dGhpcy5ncmVlbip0LGUuYmx1ZT10aGlzLmJsdWUqdCxlLmFscGhhPXRoaXMuYWxwaGEsZX07cS5wcm90b3R5cGUud2l0aEFscGhhPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHEuZnJvbUFscGhhKHRoaXMsdCxlKX07cS5hZGQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLnJlZD10LnJlZCtlLnJlZCxuLmdyZWVuPXQuZ3JlZW4rZS5ncmVlbixuLmJsdWU9dC5ibHVlK2UuYmx1ZSxuLmFscGhhPXQuYWxwaGErZS5hbHBoYSxufTtxLnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi5yZWQ9dC5yZWQtZS5yZWQsbi5ncmVlbj10LmdyZWVuLWUuZ3JlZW4sbi5ibHVlPXQuYmx1ZS1lLmJsdWUsbi5hbHBoYT10LmFscGhhLWUuYWxwaGEsbn07cS5tdWx0aXBseT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ucmVkPXQucmVkKmUucmVkLG4uZ3JlZW49dC5ncmVlbiplLmdyZWVuLG4uYmx1ZT10LmJsdWUqZS5ibHVlLG4uYWxwaGE9dC5hbHBoYSplLmFscGhhLG59O3EuZGl2aWRlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi5yZWQ9dC5yZWQvZS5yZWQsbi5ncmVlbj10LmdyZWVuL2UuZ3JlZW4sbi5ibHVlPXQuYmx1ZS9lLmJsdWUsbi5hbHBoYT10LmFscGhhL2UuYWxwaGEsbn07cS5tb2Q9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLnJlZD10LnJlZCVlLnJlZCxuLmdyZWVuPXQuZ3JlZW4lZS5ncmVlbixuLmJsdWU9dC5ibHVlJWUuYmx1ZSxuLmFscGhhPXQuYWxwaGElZS5hbHBoYSxufTtxLmxlcnA9ZnVuY3Rpb24odCxlLG4sbyl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgic3RhcnQiLHQpLHkudHlwZU9mLm9iamVjdCgiZW5kIixlKSx5LnR5cGVPZi5udW1iZXIoInQiLG4pLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixvKSxvLnJlZD1NLmxlcnAodC5yZWQsZS5yZWQsbiksby5ncmVlbj1NLmxlcnAodC5ncmVlbixlLmdyZWVuLG4pLG8uYmx1ZT1NLmxlcnAodC5ibHVlLGUuYmx1ZSxuKSxvLmFscGhhPU0ubGVycCh0LmFscGhhLGUuYWxwaGEsbiksb307cS5tdWx0aXBseUJ5U2NhbGFyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjb2xvciIsdCkseS50eXBlT2YubnVtYmVyKCJzY2FsYXIiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLnJlZD10LnJlZCplLG4uZ3JlZW49dC5ncmVlbiplLG4uYmx1ZT10LmJsdWUqZSxuLmFscGhhPXQuYWxwaGEqZSxufTtxLmRpdmlkZUJ5U2NhbGFyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjb2xvciIsdCkseS50eXBlT2YubnVtYmVyKCJzY2FsYXIiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLnJlZD10LnJlZC9lLG4uZ3JlZW49dC5ncmVlbi9lLG4uYmx1ZT10LmJsdWUvZSxuLmFscGhhPXQuYWxwaGEvZSxufTtxLkFMSUNFQkxVRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRjBGOEZGIikpO3EuQU5USVFVRVdISVRFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGQUVCRDciKSk7cS5BUVVBPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMwMEZGRkYiKSk7cS5BUVVBTUFSSU5FPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM3RkZGRDQiKSk7cS5BWlVSRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRjBGRkZGIikpO3EuQkVJR0U9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0Y1RjVEQyIpKTtxLkJJU1FVRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZFNEM0IikpO3EuQkxBQ0s9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzAwMDAwMCIpKTtxLkJMQU5DSEVEQUxNT05EPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGRkVCQ0QiKSk7cS5CTFVFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMwMDAwRkYiKSk7cS5CTFVFVklPTEVUPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM4QTJCRTIiKSk7cS5CUk9XTj1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjQTUyQTJBIikpO3EuQlVSTFlXT09EPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNERUI4ODciKSk7cS5DQURFVEJMVUU9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzVGOUVBMCIpKTtxLkNIQVJUUkVVU0U9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzdGRkYwMCIpKTtxLkNIT0NPTEFURT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRDI2OTFFIikpO3EuQ09SQUw9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGN0Y1MCIpKTtxLkNPUk5GTE9XRVJCTFVFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM2NDk1RUQiKSk7cS5DT1JOU0lMSz1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZGOERDIikpO3EuQ1JJTVNPTj1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjREMxNDNDIikpO3EuQ1lBTj1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjMDBGRkZGIikpO3EuREFSS0JMVUU9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzAwMDA4QiIpKTtxLkRBUktDWUFOPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMwMDhCOEIiKSk7cS5EQVJLR09MREVOUk9EPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNCODg2MEIiKSk7cS5EQVJLR1JBWT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjQTlBOUE5IikpO3EuREFSS0dSRUVOPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMwMDY0MDAiKSk7cS5EQVJLR1JFWT1xLkRBUktHUkFZO3EuREFSS0tIQUtJPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNCREI3NkIiKSk7cS5EQVJLTUFHRU5UQT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjOEIwMDhCIikpO3EuREFSS09MSVZFR1JFRU49T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzU1NkIyRiIpKTtxLkRBUktPUkFOR0U9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGOEMwMCIpKTtxLkRBUktPUkNISUQ9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzk5MzJDQyIpKTtxLkRBUktSRUQ9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzhCMDAwMCIpKTtxLkRBUktTQUxNT049T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0U5OTY3QSIpKTtxLkRBUktTRUFHUkVFTj1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjOEZCQzhGIikpO3EuREFSS1NMQVRFQkxVRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjNDgzRDhCIikpO3EuREFSS1NMQVRFR1JBWT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjMkY0RjRGIikpO3EuREFSS1NMQVRFR1JFWT1xLkRBUktTTEFURUdSQVk7cS5EQVJLVFVSUVVPSVNFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMwMENFRDEiKSk7cS5EQVJLVklPTEVUPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM5NDAwRDMiKSk7cS5ERUVQUElOSz1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkYxNDkzIikpO3EuREVFUFNLWUJMVUU9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzAwQkZGRiIpKTtxLkRJTUdSQVk9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzY5Njk2OSIpKTtxLkRJTUdSRVk9cS5ESU1HUkFZO3EuRE9ER0VSQkxVRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjMUU5MEZGIikpO3EuRklSRUJSSUNLPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNCMjIyMjIiKSk7cS5GTE9SQUxXSElURT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZGQUYwIikpO3EuRk9SRVNUR1JFRU49T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzIyOEIyMiIpKTtxLkZVQ0hTSUE9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGMDBGRiIpKTtxLkdBSU5TQk9STz1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRENEQ0RDIikpO3EuR0hPU1RXSElURT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRjhGOEZGIikpO3EuR09MRD1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZENzAwIikpO3EuR09MREVOUk9EPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNEQUE1MjAiKSk7cS5HUkFZPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM4MDgwODAiKSk7cS5HUkVFTj1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjMDA4MDAwIikpO3EuR1JFRU5ZRUxMT1c9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0FERkYyRiIpKTtxLkdSRVk9cS5HUkFZO3EuSE9ORVlERVc9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0YwRkZGMCIpKTtxLkhPVFBJTks9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGNjlCNCIpKTtxLklORElBTlJFRD1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjQ0Q1QzVDIikpO3EuSU5ESUdPPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM0QjAwODIiKSk7cS5JVk9SWT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZGRkYwIikpO3EuS0hBS0k9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0YwRTY4QyIpKTtxLkxBVkVOREVSPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNFNkU2RkEiKSk7cS5MQVZFTkRBUl9CTFVTSD1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZGMEY1IikpO3EuTEFXTkdSRUVOPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM3Q0ZDMDAiKSk7cS5MRU1PTkNISUZGT049T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGRkFDRCIpKTtxLkxJR0hUQkxVRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjQUREOEU2IikpO3EuTElHSFRDT1JBTD1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRjA4MDgwIikpO3EuTElHSFRDWUFOPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNFMEZGRkYiKSk7cS5MSUdIVEdPTERFTlJPRFlFTExPVz1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkFGQUQyIikpO3EuTElHSFRHUkFZPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNEM0QzRDMiKSk7cS5MSUdIVEdSRUVOPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM5MEVFOTAiKSk7cS5MSUdIVEdSRVk9cS5MSUdIVEdSQVk7cS5MSUdIVFBJTks9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGQjZDMSIpKTtxLkxJR0hUU0VBR1JFRU49T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzIwQjJBQSIpKTtxLkxJR0hUU0tZQkxVRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjODdDRUZBIikpO3EuTElHSFRTTEFURUdSQVk9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzc3ODg5OSIpKTtxLkxJR0hUU0xBVEVHUkVZPXEuTElHSFRTTEFURUdSQVk7cS5MSUdIVFNURUVMQkxVRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjQjBDNERFIikpO3EuTElHSFRZRUxMT1c9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGRkZFMCIpKTtxLkxJTUU9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzAwRkYwMCIpKTtxLkxJTUVHUkVFTj1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjMzJDRDMyIikpO3EuTElORU49T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0ZBRjBFNiIpKTtxLk1BR0VOVEE9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGMDBGRiIpKTtxLk1BUk9PTj1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjODAwMDAwIikpO3EuTUVESVVNQVFVQU1BUklORT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjNjZDREFBIikpO3EuTUVESVVNQkxVRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjMDAwMENEIikpO3EuTUVESVVNT1JDSElEPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNCQTU1RDMiKSk7cS5NRURJVU1QVVJQTEU9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzkzNzBEQiIpKTtxLk1FRElVTVNFQUdSRUVOPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMzQ0IzNzEiKSk7cS5NRURJVU1TTEFURUJMVUU9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzdCNjhFRSIpKTtxLk1FRElVTVNQUklOR0dSRUVOPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMwMEZBOUEiKSk7cS5NRURJVU1UVVJRVU9JU0U9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzQ4RDFDQyIpKTtxLk1FRElVTVZJT0xFVFJFRD1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjQzcxNTg1IikpO3EuTUlETklHSFRCTFVFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMxOTE5NzAiKSk7cS5NSU5UQ1JFQU09T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0Y1RkZGQSIpKTtxLk1JU1RZUk9TRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZFNEUxIikpO3EuTU9DQ0FTSU49T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGRTRCNSIpKTtxLk5BVkFKT1dISVRFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGRkRFQUQiKSk7cS5OQVZZPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMwMDAwODAiKSk7cS5PTERMQUNFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGREY1RTYiKSk7cS5PTElWRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjODA4MDAwIikpO3EuT0xJVkVEUkFCPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM2QjhFMjMiKSk7cS5PUkFOR0U9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGQTUwMCIpKTtxLk9SQU5HRVJFRD1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkY0NTAwIikpO3EuT1JDSElEPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNEQTcwRDYiKSk7cS5QQUxFR09MREVOUk9EPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNFRUU4QUEiKSk7cS5QQUxFR1JFRU49T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzk4RkI5OCIpKTtxLlBBTEVUVVJRVU9JU0U9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0FGRUVFRSIpKTtxLlBBTEVWSU9MRVRSRUQ9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0RCNzA5MyIpKTtxLlBBUEFZQVdISVA9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGRUZENSIpKTtxLlBFQUNIUFVGRj1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZEQUI5IikpO3EuUEVSVT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjQ0Q4NTNGIikpO3EuUElOSz1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZDMENCIikpO3EuUExVTT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRERBMEREIikpO3EuUE9XREVSQkxVRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjQjBFMEU2IikpO3EuUFVSUExFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM4MDAwODAiKSk7cS5SRUQ9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGMDAwMCIpKTtxLlJPU1lCUk9XTj1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjQkM4RjhGIikpO3EuUk9ZQUxCTFVFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM0MTY5RTEiKSk7cS5TQURETEVCUk9XTj1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjOEI0NTEzIikpO3EuU0FMTU9OPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGQTgwNzIiKSk7cS5TQU5EWUJST1dOPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGNEE0NjAiKSk7cS5TRUFHUkVFTj1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjMkU4QjU3IikpO3EuU0VBU0hFTEw9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGRjVFRSIpKTtxLlNJRU5OQT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjQTA1MjJEIikpO3EuU0lMVkVSPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNDMEMwQzAiKSk7cS5TS1lCTFVFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM4N0NFRUIiKSk7cS5TTEFURUJMVUU9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzZBNUFDRCIpKTtxLlNMQVRFR1JBWT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjNzA4MDkwIikpO3EuU0xBVEVHUkVZPXEuU0xBVEVHUkFZO3EuU05PVz1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZGQUZBIikpO3EuU1BSSU5HR1JFRU49T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzAwRkY3RiIpKTtxLlNURUVMQkxVRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjNDY4MkI0IikpO3EuVEFOPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNEMkI0OEMiKSk7cS5URUFMPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMwMDgwODAiKSk7cS5USElTVExFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNEOEJGRDgiKSk7cS5UT01BVE89T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGNjM0NyIpKTtxLlRVUlFVT0lTRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjNDBFMEQwIikpO3EuVklPTEVUPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNFRTgyRUUiKSk7cS5XSEVBVD1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRjVERUIzIikpO3EuV0hJVEU9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGRkZGRiIpKTtxLldISVRFU01PS0U9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0Y1RjVGNSIpKTtxLllFTExPVz1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZGRjAwIikpO3EuWUVMTE9XR1JFRU49T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzlBQ0QzMiIpKTtxLlRSQU5TUEFSRU5UPU9iamVjdC5mcmVlemUobmV3IHEoMCwwLDAsMCkpO29lPXF9KTtmdW5jdGlvbiBLRih0LGUsbixvLHIpe2xldCBpPVBFO2kubGVuZ3RoPXI7bGV0IHMsZj1uLnJlZCx1PW4uZ3JlZW4sYz1uLmJsdWUsbD1uLmFscGhhLHA9by5yZWQsZD1vLmdyZWVuLG09by5ibHVlLF89by5hbHBoYTtpZihvZS5lcXVhbHMobixvKSl7Zm9yKHM9MDtzPHI7cysrKWlbc109b2UuY2xvbmUobik7cmV0dXJuIGl9bGV0IGc9KHAtZikvcixiPShkLXUpL3Isdz0obS1jKS9yLE89KF8tbCkvcjtmb3Iocz0wO3M8cjtzKyspaVtzXT1uZXcgb2UoZitzKmcsdStzKmIsYytzKncsbCtzKk8pO3JldHVybiBpfWZ1bmN0aW9uIFpmKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKTtsZXQgZT10LnBvc2l0aW9ucyxuPXQuY29sb3JzLG89eCh0LndpZHRoLDEpLHI9eCh0LmNvbG9yc1BlclZlcnRleCwhMSk7aWYoIWgoZSl8fGUubGVuZ3RoPDIpdGhyb3cgbmV3IEYoIkF0IGxlYXN0IHR3byBwb3NpdGlvbnMgYXJlIHJlcXVpcmVkLiIpO2lmKHR5cGVvZiBvIT0ibnVtYmVyIil0aHJvdyBuZXcgRigid2lkdGggbXVzdCBiZSBhIG51bWJlciIpO2lmKGgobikmJihyJiZuLmxlbmd0aDxlLmxlbmd0aHx8IXImJm4ubGVuZ3RoPGUubGVuZ3RoLTEpKXRocm93IG5ldyBGKCJjb2xvcnMgaGFzIGFuIGludmFsaWQgbGVuZ3RoLiIpO3RoaXMuX3Bvc2l0aW9ucz1lLHRoaXMuX2NvbG9ycz1uLHRoaXMuX3dpZHRoPW8sdGhpcy5fY29sb3JzUGVyVmVydGV4PXIsdGhpcy5fdmVydGV4Rm9ybWF0PWR0LmNsb25lKHgodC52ZXJ0ZXhGb3JtYXQsZHQuREVGQVVMVCkpLHRoaXMuX2FyY1R5cGU9eCh0LmFyY1R5cGUsX2UuR0VPREVTSUMpLHRoaXMuX2dyYW51bGFyaXR5PXgodC5ncmFudWxhcml0eSxNLlJBRElBTlNfUEVSX0RFR1JFRSksdGhpcy5fZWxsaXBzb2lkPSQuY2xvbmUoeCh0LmVsbGlwc29pZCwkLldHUzg0KSksdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlUG9seWxpbmVHZW9tZXRyeSI7bGV0IGk9MStlLmxlbmd0aCphLnBhY2tlZExlbmd0aDtpKz1oKG4pPzErbi5sZW5ndGgqb2UucGFja2VkTGVuZ3RoOjEsdGhpcy5wYWNrZWRMZW5ndGg9aSskLnBhY2tlZExlbmd0aCtkdC5wYWNrZWRMZW5ndGgrNH12YXIgUEUsTUUsTkUsYmMsUkUsU0UsQ0UseEUsaHksSUU9WigoKT0+e2ZjKCk7anIoKTtNZSgpO0Z0KCk7UGEoKTtMZSgpO0l0KCk7ZnQoKTtIdCgpO1p0KCk7WGUoKTtZZSgpO2FuKCk7UHAoKTskZSgpO1d0KCk7eWEoKTt0bigpO0VvKCk7UEU9W107WmYucGFjaz1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEYoInZhbHVlIGlzIHJlcXVpcmVkIik7aWYoIWgoZSkpdGhyb3cgbmV3IEYoImFycmF5IGlzIHJlcXVpcmVkIik7bj14KG4sMCk7bGV0IG8scj10Ll9wb3NpdGlvbnMsaT1yLmxlbmd0aDtmb3IoZVtuKytdPWksbz0wO288aTsrK28sbis9YS5wYWNrZWRMZW5ndGgpYS5wYWNrKHJbb10sZSxuKTtsZXQgcz10Ll9jb2xvcnM7Zm9yKGk9aChzKT9zLmxlbmd0aDowLGVbbisrXT1pLG89MDtvPGk7KytvLG4rPW9lLnBhY2tlZExlbmd0aClvZS5wYWNrKHNbb10sZSxuKTtyZXR1cm4gJC5wYWNrKHQuX2VsbGlwc29pZCxlLG4pLG4rPSQucGFja2VkTGVuZ3RoLGR0LnBhY2sodC5fdmVydGV4Rm9ybWF0LGUsbiksbis9ZHQucGFja2VkTGVuZ3RoLGVbbisrXT10Ll93aWR0aCxlW24rK109dC5fY29sb3JzUGVyVmVydGV4PzE6MCxlW24rK109dC5fYXJjVHlwZSxlW25dPXQuX2dyYW51bGFyaXR5LGV9O01FPSQuY2xvbmUoJC5VTklUX1NQSEVSRSksTkU9bmV3IGR0LGJjPXtwb3NpdGlvbnM6dm9pZCAwLGNvbG9yczp2b2lkIDAsZWxsaXBzb2lkOk1FLHZlcnRleEZvcm1hdDpORSx3aWR0aDp2b2lkIDAsY29sb3JzUGVyVmVydGV4OnZvaWQgMCxhcmNUeXBlOnZvaWQgMCxncmFudWxhcml0eTp2b2lkIDB9O1pmLnVucGFjaz1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEYoImFycmF5IGlzIHJlcXVpcmVkIik7ZT14KGUsMCk7bGV0IG8scj10W2UrK10saT1uZXcgQXJyYXkocik7Zm9yKG89MDtvPHI7KytvLGUrPWEucGFja2VkTGVuZ3RoKWlbb109YS51bnBhY2sodCxlKTtyPXRbZSsrXTtsZXQgcz1yPjA/bmV3IEFycmF5KHIpOnZvaWQgMDtmb3Iobz0wO288cjsrK28sZSs9b2UucGFja2VkTGVuZ3RoKXNbb109b2UudW5wYWNrKHQsZSk7bGV0IGY9JC51bnBhY2sodCxlLE1FKTtlKz0kLnBhY2tlZExlbmd0aDtsZXQgdT1kdC51bnBhY2sodCxlLE5FKTtlKz1kdC5wYWNrZWRMZW5ndGg7bGV0IGM9dFtlKytdLGw9dFtlKytdPT09MSxwPXRbZSsrXSxkPXRbZV07cmV0dXJuIGgobik/KG4uX3Bvc2l0aW9ucz1pLG4uX2NvbG9ycz1zLG4uX2VsbGlwc29pZD0kLmNsb25lKGYsbi5fZWxsaXBzb2lkKSxuLl92ZXJ0ZXhGb3JtYXQ9ZHQuY2xvbmUodSxuLl92ZXJ0ZXhGb3JtYXQpLG4uX3dpZHRoPWMsbi5fY29sb3JzUGVyVmVydGV4PWwsbi5fYXJjVHlwZT1wLG4uX2dyYW51bGFyaXR5PWQsbik6KGJjLnBvc2l0aW9ucz1pLGJjLmNvbG9ycz1zLGJjLndpZHRoPWMsYmMuY29sb3JzUGVyVmVydGV4PWwsYmMuYXJjVHlwZT1wLGJjLmdyYW51bGFyaXR5PWQsbmV3IFpmKGJjKSl9O1JFPW5ldyBhLFNFPW5ldyBhLENFPW5ldyBhLHhFPW5ldyBhO1pmLmNyZWF0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQpe2xldCBlPXQuX3dpZHRoLG49dC5fdmVydGV4Rm9ybWF0LG89dC5fY29sb3JzLHI9dC5fY29sb3JzUGVyVmVydGV4LGk9dC5fYXJjVHlwZSxzPXQuX2dyYW51bGFyaXR5LGY9dC5fZWxsaXBzb2lkLHUsYyxsLHA9W10sZD1Dbih0Ll9wb3NpdGlvbnMsYS5lcXVhbHNFcHNpbG9uLCExLHApO2lmKGgobykmJnAubGVuZ3RoPjApe2xldCBCPTAsaj1wWzBdO289by5maWx0ZXIoZnVuY3Rpb24oSCxrKXtsZXQgSz0hMTtyZXR1cm4gcj9LPWs9PT1qfHxrPT09MCYmaj09PTE6Sz1rKzE9PT1qLEs/KEIrKyxqPXBbQl0sITEpOiEwfSl9bGV0IG09ZC5sZW5ndGg7aWYobTwyfHxlPD0wKXJldHVybjtpZihpPT09X2UuR0VPREVTSUN8fGk9PT1fZS5SSFVNQil7bGV0IEIsajtpPT09X2UuR0VPREVTSUM/KEI9TS5jaG9yZExlbmd0aChzLGYubWF4aW11bVJhZGl1cyksaj1nbi5udW1iZXJPZlBvaW50cyk6KEI9cyxqPWduLm51bWJlck9mUG9pbnRzUmh1bWJMaW5lKTtsZXQgSD1nbi5leHRyYWN0SGVpZ2h0cyhkLGYpO2lmKGgobykpe2xldCBrPTE7Zm9yKHU9MDt1PG0tMTsrK3Upays9aihkW3VdLGRbdSsxXSxCKTtsZXQgSz1uZXcgQXJyYXkoayksWD0wO2Zvcih1PTA7dTxtLTE7Kyt1KXtsZXQgUj1kW3VdLG90PWRbdSsxXSxjdD1vW3VdLHB0PWooUixvdCxCKTtpZihyJiZ1PGspe2xldCB5dD1vW3UrMV0scnQ9S0YoUixvdCxjdCx5dCxwdCksUHQ9cnQubGVuZ3RoO2ZvcihjPTA7YzxQdDsrK2MpS1tYKytdPXJ0W2NdfWVsc2UgZm9yKGM9MDtjPHB0OysrYylLW1grK109b2UuY2xvbmUoY3QpfUtbWF09b2UuY2xvbmUob1tvLmxlbmd0aC0xXSksbz1LLFBFLmxlbmd0aD0wfWk9PT1fZS5HRU9ERVNJQz9kPWduLmdlbmVyYXRlQ2FydGVzaWFuQXJjKHtwb3NpdGlvbnM6ZCxtaW5EaXN0YW5jZTpCLGVsbGlwc29pZDpmLGhlaWdodDpIfSk6ZD1nbi5nZW5lcmF0ZUNhcnRlc2lhblJodW1iQXJjKHtwb3NpdGlvbnM6ZCxncmFudWxhcml0eTpCLGVsbGlwc29pZDpmLGhlaWdodDpIfSl9bT1kLmxlbmd0aDtsZXQgXz1tKjQtNCxnPW5ldyBGbG9hdDY0QXJyYXkoXyozKSxiPW5ldyBGbG9hdDY0QXJyYXkoXyozKSx3PW5ldyBGbG9hdDY0QXJyYXkoXyozKSxPPW5ldyBGbG9hdDMyQXJyYXkoXyoyKSxFPW4uc3Q/bmV3IEZsb2F0MzJBcnJheShfKjIpOnZvaWQgMCxUPWgobyk/bmV3IFVpbnQ4QXJyYXkoXyo0KTp2b2lkIDAsQz0wLE49MCxJPTAsRD0wLHY7Zm9yKGM9MDtjPG07KytjKXtjPT09MD8odj1SRSxhLnN1YnRyYWN0KGRbMF0sZFsxXSx2KSxhLmFkZChkWzBdLHYsdikpOnY9ZFtjLTFdLGEuY2xvbmUodixDRSksYS5jbG9uZShkW2NdLFNFKSxjPT09bS0xPyh2PVJFLGEuc3VidHJhY3QoZFttLTFdLGRbbS0yXSx2KSxhLmFkZChkW20tMV0sdix2KSk6dj1kW2MrMV0sYS5jbG9uZSh2LHhFKTtsZXQgQixqO2goVCkmJihjIT09MCYmIXI/Qj1vW2MtMV06Qj1vW2NdLGMhPT1tLTEmJihqPW9bY10pKTtsZXQgSD1jPT09MD8yOjAsaz1jPT09bS0xPzI6NDtmb3IobD1IO2w8azsrK2wpe2EucGFjayhTRSxnLEMpLGEucGFjayhDRSxiLEMpLGEucGFjayh4RSx3LEMpLEMrPTM7bGV0IEs9bC0yPDA/LTE6MTtpZihPW04rK109MioobCUyKS0xLE9bTisrXT1LKmUsbi5zdCYmKEVbSSsrXT1jLyhtLTEpLEVbSSsrXT1NYXRoLm1heChPW04tMl0sMCkpLGgoVCkpe2xldCBYPWw8Mj9COmo7VFtEKytdPW9lLmZsb2F0VG9CeXRlKFgucmVkKSxUW0QrK109b2UuZmxvYXRUb0J5dGUoWC5ncmVlbiksVFtEKytdPW9lLmZsb2F0VG9CeXRlKFguYmx1ZSksVFtEKytdPW9lLmZsb2F0VG9CeXRlKFguYWxwaGEpfX19bGV0IEw9bmV3IGllO0wucG9zaXRpb249bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpnfSksTC5wcmV2UG9zaXRpb249bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpifSksTC5uZXh0UG9zaXRpb249bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczp3fSksTC5leHBhbmRBbmRXaWR0aD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Mix2YWx1ZXM6T30pLG4uc3QmJihMLnN0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZToyLHZhbHVlczpFfSkpLGgoVCkmJihMLmNvbG9yPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuVU5TSUdORURfQllURSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjQsdmFsdWVzOlQsbm9ybWFsaXplOiEwfSkpO2xldCBVPUR0LmNyZWF0ZVR5cGVkQXJyYXkoXyxtKjYtNiksQT0wLFM9MCxQPW0tMTtmb3IoYz0wO2M8UDsrK2MpVVtTKytdPUEsVVtTKytdPUErMixVW1MrK109QSsxLFVbUysrXT1BKzEsVVtTKytdPUErMixVW1MrK109QSszLEErPTQ7cmV0dXJuIG5ldyBVdCh7YXR0cmlidXRlczpMLGluZGljZXM6VSxwcmltaXRpdmVUeXBlOkJ0LlRSSUFOR0xFUyxib3VuZGluZ1NwaGVyZTpBdC5mcm9tUG9pbnRzKGQpLGdlb21ldHJ5VHlwZTpNaS5QT0xZTElORVN9KX07aHk9WmZ9KTt2YXIgX3k9e307ZGUoX3kse2RlZmF1bHQ6KCk9PlhGfSk7ZnVuY3Rpb24gV0YodCxlKXtyZXR1cm4gaChlKSYmKHQ9aHkudW5wYWNrKHQsZSkpLHQuX2VsbGlwc29pZD0kLmNsb25lKHQuX2VsbGlwc29pZCksaHkuY3JlYXRlR2VvbWV0cnkodCl9dmFyIFhGLHl5PVooKCk9PntmdCgpO1p0KCk7SUUoKTtYRj1XRn0pO2Z1bmN0aW9uIFlGKHQsZSxuLG8pe2xldCByPW5ldyBpZTtvLnBvc2l0aW9uJiYoci5wb3NpdGlvbj1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkRPVUJMRSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOnR9KSk7bGV0IGk9ZS5sZW5ndGgscz10Lmxlbmd0aC8zLGY9KHMtaSoyKS8oaSoyKSx1PVNlLnRyaWFuZ3VsYXRlKGUpLGM9KGYtMSkqaSo2K3UubGVuZ3RoKjIsbD1EdC5jcmVhdGVUeXBlZEFycmF5KHMsYykscCxkLG0sXyxnLGIsdz1pKjIsTz0wO2ZvcihwPTA7cDxmLTE7cCsrKXtmb3IoZD0wO2Q8aS0xO2QrKyltPWQqMitwKmkqMixiPW0rdyxfPW0rMSxnPV8rdyxsW08rK109XyxsW08rK109bSxsW08rK109ZyxsW08rK109ZyxsW08rK109bSxsW08rK109YjttPWkqMi0yK3AqaSoyLF89bSsxLGc9Xyt3LGI9bSt3LGxbTysrXT1fLGxbTysrXT1tLGxbTysrXT1nLGxbTysrXT1nLGxbTysrXT1tLGxbTysrXT1ifWlmKG8uc3R8fG8udGFuZ2VudHx8by5iaXRhbmdlbnQpe2xldCBDPW5ldyBGbG9hdDMyQXJyYXkocyoyKSxOPTEvKGYtMSksST0xL24uaGVpZ2h0LEQ9bi5oZWlnaHQvMix2LEwsVT0wO2ZvcihwPTA7cDxmO3ArKyl7Zm9yKHY9cCpOLEw9SSooZVswXS55K0QpLENbVSsrXT12LENbVSsrXT1MLGQ9MTtkPGk7ZCsrKUw9SSooZVtkXS55K0QpLENbVSsrXT12LENbVSsrXT1MLENbVSsrXT12LENbVSsrXT1MO0w9SSooZVswXS55K0QpLENbVSsrXT12LENbVSsrXT1MfWZvcihkPTA7ZDxpO2QrKyl2PTAsTD1JKihlW2RdLnkrRCksQ1tVKytdPXYsQ1tVKytdPUw7Zm9yKGQ9MDtkPGk7ZCsrKXY9KGYtMSkqTixMPUkqKGVbZF0ueStEKSxDW1UrK109dixDW1UrK109TDtyLnN0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZToyLHZhbHVlczpuZXcgRmxvYXQzMkFycmF5KEMpfSl9bGV0IEU9cy1pKjI7Zm9yKHA9MDtwPHUubGVuZ3RoO3ArPTMpe2xldCBDPXVbcF0rRSxOPXVbcCsxXStFLEk9dVtwKzJdK0U7bFtPKytdPUMsbFtPKytdPU4sbFtPKytdPUksbFtPKytdPUkraSxsW08rK109TitpLGxbTysrXT1DK2l9bGV0IFQ9bmV3IFV0KHthdHRyaWJ1dGVzOnIsaW5kaWNlczpsLGJvdW5kaW5nU3BoZXJlOkF0LmZyb21WZXJ0aWNlcyh0KSxwcmltaXRpdmVUeXBlOkJ0LlRSSUFOR0xFU30pO2lmKG8ubm9ybWFsJiYoVD1WZS5jb21wdXRlTm9ybWFsKFQpKSxvLnRhbmdlbnR8fG8uYml0YW5nZW50KXt0cnl7VD1WZS5jb21wdXRlVGFuZ2VudEFuZEJpdGFuZ2VudChUKX1jYXRjaHthZCgicG9seWxpbmUtdm9sdW1lLXRhbmdlbnQtYml0YW5nZW50IiwiVW5hYmxlIHRvIGNvbXB1dGUgdGFuZ2VudHMgYW5kIGJpdGFuZ2VudHMgZm9yIHBvbHlsaW5lIHZvbHVtZSBnZW9tZXRyeSIpfW8udGFuZ2VudHx8KFQuYXR0cmlidXRlcy50YW5nZW50PXZvaWQgMCksby5iaXRhbmdlbnR8fChULmF0dHJpYnV0ZXMuYml0YW5nZW50PXZvaWQgMCksby5zdHx8KFQuYXR0cmlidXRlcy5zdD12b2lkIDApfXJldHVybiBUfWZ1bmN0aW9uIEpmKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKTtsZXQgZT10LnBvbHlsaW5lUG9zaXRpb25zLG49dC5zaGFwZVBvc2l0aW9ucztpZighaChlKSl0aHJvdyBuZXcgRigib3B0aW9ucy5wb2x5bGluZVBvc2l0aW9ucyBpcyByZXF1aXJlZC4iKTtpZighaChuKSl0aHJvdyBuZXcgRigib3B0aW9ucy5zaGFwZVBvc2l0aW9ucyBpcyByZXF1aXJlZC4iKTt0aGlzLl9wb3NpdGlvbnM9ZSx0aGlzLl9zaGFwZT1uLHRoaXMuX2VsbGlwc29pZD0kLmNsb25lKHgodC5lbGxpcHNvaWQsJC5XR1M4NCkpLHRoaXMuX2Nvcm5lclR5cGU9eCh0LmNvcm5lclR5cGUsZm4uUk9VTkRFRCksdGhpcy5fdmVydGV4Rm9ybWF0PWR0LmNsb25lKHgodC52ZXJ0ZXhGb3JtYXQsZHQuREVGQVVMVCkpLHRoaXMuX2dyYW51bGFyaXR5PXgodC5ncmFudWxhcml0eSxNLlJBRElBTlNfUEVSX0RFR1JFRSksdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlUG9seWxpbmVWb2x1bWVHZW9tZXRyeSI7bGV0IG89MStlLmxlbmd0aCphLnBhY2tlZExlbmd0aDtvKz0xK24ubGVuZ3RoKnR0LnBhY2tlZExlbmd0aCx0aGlzLnBhY2tlZExlbmd0aD1vKyQucGFja2VkTGVuZ3RoK2R0LnBhY2tlZExlbmd0aCsyfXZhciB2RSxMRSxRZiwkRixneSxERT1aKCgpPT57anIoKTtDZigpO01lKCk7RmUoKTtGdCgpO0xlKCk7aGMoKTtJdCgpO2Z0KCk7SHQoKTtadCgpO1hlKCk7WWUoKTthbigpO3NpKCk7JGUoKTtXdCgpO0swKCk7cXIoKTtwZCgpO3RuKCk7RW8oKTtsYygpO0pmLnBhY2s9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBGKCJ2YWx1ZSBpcyByZXF1aXJlZCIpO2lmKCFoKGUpKXRocm93IG5ldyBGKCJhcnJheSBpcyByZXF1aXJlZCIpO249eChuLDApO2xldCBvLHI9dC5fcG9zaXRpb25zLGk9ci5sZW5ndGg7Zm9yKGVbbisrXT1pLG89MDtvPGk7KytvLG4rPWEucGFja2VkTGVuZ3RoKWEucGFjayhyW29dLGUsbik7bGV0IHM9dC5fc2hhcGU7Zm9yKGk9cy5sZW5ndGgsZVtuKytdPWksbz0wO288aTsrK28sbis9dHQucGFja2VkTGVuZ3RoKXR0LnBhY2soc1tvXSxlLG4pO3JldHVybiAkLnBhY2sodC5fZWxsaXBzb2lkLGUsbiksbis9JC5wYWNrZWRMZW5ndGgsZHQucGFjayh0Ll92ZXJ0ZXhGb3JtYXQsZSxuKSxuKz1kdC5wYWNrZWRMZW5ndGgsZVtuKytdPXQuX2Nvcm5lclR5cGUsZVtuXT10Ll9ncmFudWxhcml0eSxlfTt2RT0kLmNsb25lKCQuVU5JVF9TUEhFUkUpLExFPW5ldyBkdCxRZj17cG9seWxpbmVQb3NpdGlvbnM6dm9pZCAwLHNoYXBlUG9zaXRpb25zOnZvaWQgMCxlbGxpcHNvaWQ6dkUsdmVydGV4Rm9ybWF0OkxFLGNvcm5lclR5cGU6dm9pZCAwLGdyYW51bGFyaXR5OnZvaWQgMH07SmYudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgRigiYXJyYXkgaXMgcmVxdWlyZWQiKTtlPXgoZSwwKTtsZXQgbyxyPXRbZSsrXSxpPW5ldyBBcnJheShyKTtmb3Iobz0wO288cjsrK28sZSs9YS5wYWNrZWRMZW5ndGgpaVtvXT1hLnVucGFjayh0LGUpO3I9dFtlKytdO2xldCBzPW5ldyBBcnJheShyKTtmb3Iobz0wO288cjsrK28sZSs9dHQucGFja2VkTGVuZ3RoKXNbb109dHQudW5wYWNrKHQsZSk7bGV0IGY9JC51bnBhY2sodCxlLHZFKTtlKz0kLnBhY2tlZExlbmd0aDtsZXQgdT1kdC51bnBhY2sodCxlLExFKTtlKz1kdC5wYWNrZWRMZW5ndGg7bGV0IGM9dFtlKytdLGw9dFtlXTtyZXR1cm4gaChuKT8obi5fcG9zaXRpb25zPWksbi5fc2hhcGU9cyxuLl9lbGxpcHNvaWQ9JC5jbG9uZShmLG4uX2VsbGlwc29pZCksbi5fdmVydGV4Rm9ybWF0PWR0LmNsb25lKHUsbi5fdmVydGV4Rm9ybWF0KSxuLl9jb3JuZXJUeXBlPWMsbi5fZ3JhbnVsYXJpdHk9bCxuKTooUWYucG9seWxpbmVQb3NpdGlvbnM9aSxRZi5zaGFwZVBvc2l0aW9ucz1zLFFmLmNvcm5lclR5cGU9YyxRZi5ncmFudWxhcml0eT1sLG5ldyBKZihRZikpfTskRj1uZXcgSHI7SmYuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fcG9zaXRpb25zLG49Q24oZSxhLmVxdWFsc0Vwc2lsb24pLG89dC5fc2hhcGU7aWYobz1ocy5yZW1vdmVEdXBsaWNhdGVzRnJvbVNoYXBlKG8pLG4ubGVuZ3RoPDJ8fG8ubGVuZ3RoPDMpcmV0dXJuO1NlLmNvbXB1dGVXaW5kaW5nT3JkZXIyRChvKT09PUNvLkNMT0NLV0lTRSYmby5yZXZlcnNlKCk7bGV0IHI9SHIuZnJvbVBvaW50cyhvLCRGKSxpPWhzLmNvbXB1dGVQb3NpdGlvbnMobixvLHIsdCwhMCk7cmV0dXJuIFlGKGksbyxyLHQuX3ZlcnRleEZvcm1hdCl9O2d5PUpmfSk7dmFyIEF5PXt9O2RlKEF5LHtkZWZhdWx0OigpPT5RRn0pO2Z1bmN0aW9uIFpGKHQsZSl7cmV0dXJuIGgoZSkmJih0PWd5LnVucGFjayh0LGUpKSx0Ll9lbGxpcHNvaWQ9JC5jbG9uZSh0Ll9lbGxpcHNvaWQpLGd5LmNyZWF0ZUdlb21ldHJ5KHQpfXZhciBRRixieT1aKCgpPT57ZnQoKTtadCgpO0RFKCk7UUY9WkZ9KTtmdW5jdGlvbiBKRih0LGUpe2xldCBuPW5ldyBpZTtuLnBvc2l0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6dH0pO2xldCBvPWUubGVuZ3RoLHI9bi5wb3NpdGlvbi52YWx1ZXMubGVuZ3RoLzMscz10Lmxlbmd0aC8zL28sZj1EdC5jcmVhdGVUeXBlZEFycmF5KHIsMipvKihzKzEpKSx1LGMsbD0wO3U9MDtsZXQgcD11Km87Zm9yKGM9MDtjPG8tMTtjKyspZltsKytdPWMrcCxmW2wrK109YytwKzE7Zm9yKGZbbCsrXT1vLTErcCxmW2wrK109cCx1PXMtMSxwPXUqbyxjPTA7YzxvLTE7YysrKWZbbCsrXT1jK3AsZltsKytdPWMrcCsxO2ZvcihmW2wrK109by0xK3AsZltsKytdPXAsdT0wO3U8cy0xO3UrKyl7bGV0IG09byp1LF89bStvO2ZvcihjPTA7YzxvO2MrKylmW2wrK109YyttLGZbbCsrXT1jK199cmV0dXJuIG5ldyBVdCh7YXR0cmlidXRlczpuLGluZGljZXM6RHQuY3JlYXRlVHlwZWRBcnJheShyLGYpLGJvdW5kaW5nU3BoZXJlOkF0LmZyb21WZXJ0aWNlcyh0KSxwcmltaXRpdmVUeXBlOkJ0LkxJTkVTfSl9ZnVuY3Rpb24gZXUodCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXQucG9seWxpbmVQb3NpdGlvbnMsbj10LnNoYXBlUG9zaXRpb25zO2lmKCFoKGUpKXRocm93IG5ldyBGKCJvcHRpb25zLnBvbHlsaW5lUG9zaXRpb25zIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBGKCJvcHRpb25zLnNoYXBlUG9zaXRpb25zIGlzIHJlcXVpcmVkLiIpO3RoaXMuX3Bvc2l0aW9ucz1lLHRoaXMuX3NoYXBlPW4sdGhpcy5fZWxsaXBzb2lkPSQuY2xvbmUoeCh0LmVsbGlwc29pZCwkLldHUzg0KSksdGhpcy5fY29ybmVyVHlwZT14KHQuY29ybmVyVHlwZSxmbi5ST1VOREVEKSx0aGlzLl9ncmFudWxhcml0eT14KHQuZ3JhbnVsYXJpdHksTS5SQURJQU5TX1BFUl9ERUdSRUUpLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZVBvbHlsaW5lVm9sdW1lT3V0bGluZUdlb21ldHJ5IjtsZXQgbz0xK2UubGVuZ3RoKmEucGFja2VkTGVuZ3RoO28rPTErbi5sZW5ndGgqdHQucGFja2VkTGVuZ3RoLHRoaXMucGFja2VkTGVuZ3RoPW8rJC5wYWNrZWRMZW5ndGgrMn12YXIgRkUsdHUsdEIsd3ksQkU9WigoKT0+e2pyKCk7Q2YoKTtNZSgpO0ZlKCk7RnQoKTtMZSgpO2hjKCk7SXQoKTtmdCgpO0h0KCk7WnQoKTtYZSgpO1llKCk7YW4oKTskZSgpO1d0KCk7cXIoKTtwZCgpO3RuKCk7bGMoKTtldS5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgRigidmFsdWUgaXMgcmVxdWlyZWQiKTtpZighaChlKSl0aHJvdyBuZXcgRigiYXJyYXkgaXMgcmVxdWlyZWQiKTtuPXgobiwwKTtsZXQgbyxyPXQuX3Bvc2l0aW9ucyxpPXIubGVuZ3RoO2ZvcihlW24rK109aSxvPTA7bzxpOysrbyxuKz1hLnBhY2tlZExlbmd0aClhLnBhY2socltvXSxlLG4pO2xldCBzPXQuX3NoYXBlO2ZvcihpPXMubGVuZ3RoLGVbbisrXT1pLG89MDtvPGk7KytvLG4rPXR0LnBhY2tlZExlbmd0aCl0dC5wYWNrKHNbb10sZSxuKTtyZXR1cm4gJC5wYWNrKHQuX2VsbGlwc29pZCxlLG4pLG4rPSQucGFja2VkTGVuZ3RoLGVbbisrXT10Ll9jb3JuZXJUeXBlLGVbbl09dC5fZ3JhbnVsYXJpdHksZX07RkU9JC5jbG9uZSgkLlVOSVRfU1BIRVJFKSx0dT17cG9seWxpbmVQb3NpdGlvbnM6dm9pZCAwLHNoYXBlUG9zaXRpb25zOnZvaWQgMCxlbGxpcHNvaWQ6RkUsaGVpZ2h0OnZvaWQgMCxjb3JuZXJUeXBlOnZvaWQgMCxncmFudWxhcml0eTp2b2lkIDB9O2V1LnVucGFjaz1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEYoImFycmF5IGlzIHJlcXVpcmVkIik7ZT14KGUsMCk7bGV0IG8scj10W2UrK10saT1uZXcgQXJyYXkocik7Zm9yKG89MDtvPHI7KytvLGUrPWEucGFja2VkTGVuZ3RoKWlbb109YS51bnBhY2sodCxlKTtyPXRbZSsrXTtsZXQgcz1uZXcgQXJyYXkocik7Zm9yKG89MDtvPHI7KytvLGUrPXR0LnBhY2tlZExlbmd0aClzW29dPXR0LnVucGFjayh0LGUpO2xldCBmPSQudW5wYWNrKHQsZSxGRSk7ZSs9JC5wYWNrZWRMZW5ndGg7bGV0IHU9dFtlKytdLGM9dFtlXTtyZXR1cm4gaChuKT8obi5fcG9zaXRpb25zPWksbi5fc2hhcGU9cyxuLl9lbGxpcHNvaWQ9JC5jbG9uZShmLG4uX2VsbGlwc29pZCksbi5fY29ybmVyVHlwZT11LG4uX2dyYW51bGFyaXR5PWMsbik6KHR1LnBvbHlsaW5lUG9zaXRpb25zPWksdHUuc2hhcGVQb3NpdGlvbnM9cyx0dS5jb3JuZXJUeXBlPXUsdHUuZ3JhbnVsYXJpdHk9YyxuZXcgZXUodHUpKX07dEI9bmV3IEhyO2V1LmNyZWF0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQpe2xldCBlPXQuX3Bvc2l0aW9ucyxuPUNuKGUsYS5lcXVhbHNFcHNpbG9uKSxvPXQuX3NoYXBlO2lmKG89aHMucmVtb3ZlRHVwbGljYXRlc0Zyb21TaGFwZShvKSxuLmxlbmd0aDwyfHxvLmxlbmd0aDwzKXJldHVybjtTZS5jb21wdXRlV2luZGluZ09yZGVyMkQobyk9PT1Dby5DTE9DS1dJU0UmJm8ucmV2ZXJzZSgpO2xldCByPUhyLmZyb21Qb2ludHMobyx0QiksaT1ocy5jb21wdXRlUG9zaXRpb25zKG4sbyxyLHQsITEpO3JldHVybiBKRihpLG8pfTt3eT1ldX0pO3ZhciBUeT17fTtkZShUeSx7ZGVmYXVsdDooKT0+bkJ9KTtmdW5jdGlvbiBlQih0LGUpe3JldHVybiBoKGUpJiYodD13eS51bnBhY2sodCxlKSksdC5fZWxsaXBzb2lkPSQuY2xvbmUodC5fZWxsaXBzb2lkKSx3eS5jcmVhdGVHZW9tZXRyeSh0KX12YXIgbkIsT3k9WigoKT0+e2Z0KCk7WnQoKTtCRSgpO25CPWVCfSk7ZnVuY3Rpb24ga0UodCxlLG4sbyxyLGkscyl7bGV0IGY9TWF0aC5jb3MoZSksdT1vKmYsYz1uKmYsbD1NYXRoLnNpbihlKSxwPW8qbCxkPW4qbDtTcj1FeS5wcm9qZWN0KHQsU3IpLFNyPWEuc3VidHJhY3QoU3IsSWQsU3IpO2xldCBtPSRvLmZyb21Sb3RhdGlvbihlLHJCKTtTcj0kby5tdWx0aXBseUJ5VmVjdG9yKG0sU3IsU3IpLFNyPWEuYWRkKFNyLElkLFNyKSx0PUV5LnVucHJvamVjdChTcix0KSxpLT0xLHMtPTE7bGV0IF89dC5sYXRpdHVkZSxnPV8raSpkLGI9Xy11KnMsdz1fLXUqcytpKmQsTz1NYXRoLm1heChfLGcsYix3KSxFPU1hdGgubWluKF8sZyxiLHcpLFQ9dC5sb25naXR1ZGUsQz1UK2kqYyxOPVQrcypwLEk9VCtzKnAraSpjLEQ9TWF0aC5tYXgoVCxDLE4sSSksdj1NYXRoLm1pbihULEMsTixJKTtyZXR1cm57bm9ydGg6Tyxzb3V0aDpFLGVhc3Q6RCx3ZXN0OnYsZ3JhbllDb3M6dSxncmFuWVNpbjpwLGdyYW5YQ29zOmMsZ3JhblhTaW46ZCxud0Nvcm5lcjp0fX12YXIgVUUsVkUsb0IsUnksckIsU3IsaUIsSWQsRXkseW8sU3k9WigoKT0+e0Z0KCk7UGUoKTtmdCgpO0h0KCk7U2koKTtXdCgpO0FmKCk7d24oKTtVRT1NYXRoLmNvcyxWRT1NYXRoLnNpbixvQj1NYXRoLnNxcnQsUnk9e307UnkuY29tcHV0ZVBvc2l0aW9uPWZ1bmN0aW9uKHQsZSxuLG8scixpLHMpe2xldCBmPWUucmFkaWlTcXVhcmVkLHU9dC5ud0Nvcm5lcixjPXQuYm91bmRpbmdSZWN0YW5nbGUsbD11LmxhdGl0dWRlLXQuZ3JhbllDb3MqbytyKnQuZ3JhblhTaW4scD1VRShsKSxkPVZFKGwpLG09Zi56KmQsXz11LmxvbmdpdHVkZStvKnQuZ3JhbllTaW4rcip0LmdyYW5YQ29zLGc9cCpVRShfKSxiPXAqVkUoXyksdz1mLngqZyxPPWYueSpiLEU9b0IodypnK08qYittKmQpO2lmKGkueD13L0UsaS55PU8vRSxpLno9bS9FLG4pe2xldCBUPXQuc3ROd0Nvcm5lcjtoKFQpPyhsPVQubGF0aXR1ZGUtdC5zdEdyYW5ZQ29zKm8rcip0LnN0R3JhblhTaW4sXz1ULmxvbmdpdHVkZStvKnQuc3RHcmFuWVNpbityKnQuc3RHcmFuWENvcyxzLng9KF8tdC5zdFdlc3QpKnQubG9uU2NhbGFyLHMueT0obC10LnN0U291dGgpKnQubGF0U2NhbGFyKToocy54PShfLWMud2VzdCkqdC5sb25TY2FsYXIscy55PShsLWMuc291dGgpKnQubGF0U2NhbGFyKX19O3JCPW5ldyAkbyxTcj1uZXcgYSxpQj1uZXcgYXQsSWQ9bmV3IGEsRXk9bmV3IFFuO1J5LmNvbXB1dGVPcHRpb25zPWZ1bmN0aW9uKHQsZSxuLG8scixpLHMpe2xldCBmPXQuZWFzdCx1PXQud2VzdCxjPXQubm9ydGgsbD10LnNvdXRoLHA9ITEsZD0hMTtjPT09TS5QSV9PVkVSX1RXTyYmKHA9ITApLGw9PT0tTS5QSV9PVkVSX1RXTyYmKGQ9ITApO2xldCBtLF89Yy1sO3U+Zj9tPU0uVFdPX1BJLXUrZjptPWYtdTtsZXQgZz1NYXRoLmNlaWwobS9lKSsxLGI9TWF0aC5jZWlsKF8vZSkrMSx3PW0vKGctMSksTz1fLyhiLTEpLEU9TnQubm9ydGh3ZXN0KHQsaSksVD1OdC5jZW50ZXIodCxpQik7KG4hPT0wfHxvIT09MCkmJihULmxvbmdpdHVkZTxFLmxvbmdpdHVkZSYmKFQubG9uZ2l0dWRlKz1NLlRXT19QSSksSWQ9RXkucHJvamVjdChULElkKSk7bGV0IEM9TyxOPXcsST0wLEQ9MCx2PU50LmNsb25lKHQsciksTD17Z3JhbllDb3M6QyxncmFuWVNpbjpJLGdyYW5YQ29zOk4sZ3JhblhTaW46RCxud0Nvcm5lcjpFLGJvdW5kaW5nUmVjdGFuZ2xlOnYsd2lkdGg6ZyxoZWlnaHQ6Yixub3J0aENhcDpwLHNvdXRoQ2FwOmR9O2lmKG4hPT0wKXtsZXQgVT1rRShFLG4sdyxPLFQsZyxiKTtpZihjPVUubm9ydGgsbD1VLnNvdXRoLGY9VS5lYXN0LHU9VS53ZXN0LGM8LU0uUElfT1ZFUl9UV098fGM+TS5QSV9PVkVSX1RXT3x8bDwtTS5QSV9PVkVSX1RXT3x8bD5NLlBJX09WRVJfVFdPKXRocm93IG5ldyBGKCJSb3RhdGVkIHJlY3RhbmdsZSBpcyBpbnZhbGlkLiAgSXQgY3Jvc3NlcyBvdmVyIGVpdGhlciB0aGUgbm9ydGggb3Igc291dGggcG9sZS4iKTtMLmdyYW5ZQ29zPVUuZ3JhbllDb3MsTC5ncmFuWVNpbj1VLmdyYW5ZU2luLEwuZ3JhblhDb3M9VS5ncmFuWENvcyxMLmdyYW5YU2luPVUuZ3JhblhTaW4sdi5ub3J0aD1jLHYuc291dGg9bCx2LmVhc3Q9Zix2Lndlc3Q9dX1pZihvIT09MCl7bj1uLW87bGV0IFU9TnQubm9ydGh3ZXN0KHYscyksQT1rRShVLG4sdyxPLFQsZyxiKTtMLnN0R3JhbllDb3M9QS5ncmFuWUNvcyxMLnN0R3JhblhDb3M9QS5ncmFuWENvcyxMLnN0R3JhbllTaW49QS5ncmFuWVNpbixMLnN0R3JhblhTaW49QS5ncmFuWFNpbixMLnN0TndDb3JuZXI9VSxMLnN0V2VzdD1BLndlc3QsTC5zdFNvdXRoPUEuc291dGh9cmV0dXJuIEx9O3lvPVJ5fSk7ZnVuY3Rpb24gV0UodCxlKXtsZXQgbj1uZXcgVXQoe2F0dHJpYnV0ZXM6bmV3IGllLHByaW1pdGl2ZVR5cGU6QnQuVFJJQU5HTEVTfSk7cmV0dXJuIG4uYXR0cmlidXRlcy5wb3NpdGlvbj1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkRPVUJMRSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOmUucG9zaXRpb25zfSksdC5ub3JtYWwmJihuLmF0dHJpYnV0ZXMubm9ybWFsPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczplLm5vcm1hbHN9KSksdC50YW5nZW50JiYobi5hdHRyaWJ1dGVzLnRhbmdlbnQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOmUudGFuZ2VudHN9KSksdC5iaXRhbmdlbnQmJihuLmF0dHJpYnV0ZXMuYml0YW5nZW50PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczplLmJpdGFuZ2VudHN9KSksbn1mdW5jdGlvbiBmQih0LGUsbixvKXtsZXQgcj10Lmxlbmd0aCxpPWUubm9ybWFsP25ldyBGbG9hdDMyQXJyYXkocik6dm9pZCAwLHM9ZS50YW5nZW50P25ldyBGbG9hdDMyQXJyYXkocik6dm9pZCAwLGY9ZS5iaXRhbmdlbnQ/bmV3IEZsb2F0MzJBcnJheShyKTp2b2lkIDAsdT0wLGM9cUUsbD1IRSxwPWpFO2lmKGUubm9ybWFsfHxlLnRhbmdlbnR8fGUuYml0YW5nZW50KWZvcihsZXQgZD0wO2Q8cjtkKz0zKXtsZXQgbT1hLmZyb21BcnJheSh0LGQsQ3kpLF89dSsxLGc9dSsyO3A9bi5nZW9kZXRpY1N1cmZhY2VOb3JtYWwobSxwKSwoZS50YW5nZW50fHxlLmJpdGFuZ2VudCkmJihhLmNyb3NzKGEuVU5JVF9aLHAsbCksSi5tdWx0aXBseUJ5VmVjdG9yKG8sbCxsKSxhLm5vcm1hbGl6ZShsLGwpLGUuYml0YW5nZW50JiZhLm5vcm1hbGl6ZShhLmNyb3NzKHAsbCxjKSxjKSksZS5ub3JtYWwmJihpW3VdPXAueCxpW19dPXAueSxpW2ddPXAueiksZS50YW5nZW50JiYoc1t1XT1sLngsc1tfXT1sLnksc1tnXT1sLnopLGUuYml0YW5nZW50JiYoZlt1XT1jLngsZltfXT1jLnksZltnXT1jLnopLHUrPTN9cmV0dXJuIFdFKGUse3Bvc2l0aW9uczp0LG5vcm1hbHM6aSx0YW5nZW50czpzLGJpdGFuZ2VudHM6Zn0pfWZ1bmN0aW9uIHVCKHQsZSxuKXtsZXQgbz10Lmxlbmd0aCxyPWUubm9ybWFsP25ldyBGbG9hdDMyQXJyYXkobyk6dm9pZCAwLGk9ZS50YW5nZW50P25ldyBGbG9hdDMyQXJyYXkobyk6dm9pZCAwLHM9ZS5iaXRhbmdlbnQ/bmV3IEZsb2F0MzJBcnJheShvKTp2b2lkIDAsZj0wLHU9MCxjPTAsbD0hMCxwPXFFLGQ9SEUsbT1qRTtpZihlLm5vcm1hbHx8ZS50YW5nZW50fHxlLmJpdGFuZ2VudClmb3IobGV0IF89MDtfPG87Xys9Nil7bGV0IGc9YS5mcm9tQXJyYXkodCxfLEN5KSxiPWEuZnJvbUFycmF5KHQsKF8rNiklbyx4eSk7aWYobCl7bGV0IHc9YS5mcm9tQXJyYXkodCwoXyszKSVvLFhFKTthLnN1YnRyYWN0KGIsZyxiKSxhLnN1YnRyYWN0KHcsZyx3KSxtPWEubm9ybWFsaXplKGEuY3Jvc3ModyxiLG0pLG0pLGw9ITF9YS5lcXVhbHNFcHNpbG9uKGIsZyxNLkVQU0lMT04xMCkmJihsPSEwKSwoZS50YW5nZW50fHxlLmJpdGFuZ2VudCkmJihwPW4uZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGcscCksZS50YW5nZW50JiYoZD1hLm5vcm1hbGl6ZShhLmNyb3NzKHAsbSxkKSxkKSkpLGUubm9ybWFsJiYocltmKytdPW0ueCxyW2YrK109bS55LHJbZisrXT1tLnoscltmKytdPW0ueCxyW2YrK109bS55LHJbZisrXT1tLnopLGUudGFuZ2VudCYmKGlbdSsrXT1kLngsaVt1KytdPWQueSxpW3UrK109ZC56LGlbdSsrXT1kLngsaVt1KytdPWQueSxpW3UrK109ZC56KSxlLmJpdGFuZ2VudCYmKHNbYysrXT1wLngsc1tjKytdPXAueSxzW2MrK109cC56LHNbYysrXT1wLngsc1tjKytdPXAueSxzW2MrK109cC56KX1yZXR1cm4gV0UoZSx7cG9zaXRpb25zOnQsbm9ybWFsczpyLHRhbmdlbnRzOmksYml0YW5nZW50czpzfSl9ZnVuY3Rpb24gWUUodCxlKXtsZXQgbj10Ll92ZXJ0ZXhGb3JtYXQsbz10Ll9lbGxpcHNvaWQscj1lLmhlaWdodCxpPWUud2lkdGgscz1lLm5vcnRoQ2FwLGY9ZS5zb3V0aENhcCx1PTAsYz1yLGw9cixwPTA7cyYmKHU9MSxsLT0xLHArPTEpLGYmJihjLT0xLGwtPTEscCs9MSkscCs9aSpsO2xldCBkPW4ucG9zaXRpb24/bmV3IEZsb2F0NjRBcnJheShwKjMpOnZvaWQgMCxtPW4uc3Q/bmV3IEZsb2F0MzJBcnJheShwKjIpOnZvaWQgMCxfPTAsZz0wLGI9Q3ksdz1zQixPPU51bWJlci5NQVhfVkFMVUUsRT1OdW1iZXIuTUFYX1ZBTFVFLFQ9LU51bWJlci5NQVhfVkFMVUUsQz0tTnVtYmVyLk1BWF9WQUxVRTtmb3IobGV0IEE9dTtBPGM7KytBKWZvcihsZXQgUz0wO1M8aTsrK1MpeW8uY29tcHV0ZVBvc2l0aW9uKGUsbyxuLnN0LEEsUyxiLHcpLGRbXysrXT1iLngsZFtfKytdPWIueSxkW18rK109Yi56LG4uc3QmJihtW2crK109dy54LG1bZysrXT13LnksTz1NYXRoLm1pbihPLHcueCksRT1NYXRoLm1pbihFLHcueSksVD1NYXRoLm1heChULHcueCksQz1NYXRoLm1heChDLHcueSkpO2lmKHMmJih5by5jb21wdXRlUG9zaXRpb24oZSxvLG4uc3QsMCwwLGIsdyksZFtfKytdPWIueCxkW18rK109Yi55LGRbXysrXT1iLnosbi5zdCYmKG1bZysrXT13LngsbVtnKytdPXcueSxPPXcueCxFPXcueSxUPXcueCxDPXcueSkpLGYmJih5by5jb21wdXRlUG9zaXRpb24oZSxvLG4uc3Qsci0xLDAsYix3KSxkW18rK109Yi54LGRbXysrXT1iLnksZFtfXT1iLnosbi5zdCYmKG1bZysrXT13LngsbVtnXT13LnksTz1NYXRoLm1pbihPLHcueCksRT1NYXRoLm1pbihFLHcueSksVD1NYXRoLm1heChULHcueCksQz1NYXRoLm1heChDLHcueSkpKSxuLnN0JiYoTzwwfHxFPDB8fFQ+MXx8Qz4xKSlmb3IobGV0IEE9MDtBPG0ubGVuZ3RoO0ErPTIpbVtBXT0obVtBXS1PKS8oVC1PKSxtW0ErMV09KG1bQSsxXS1FKS8oQy1FKTtsZXQgTj1mQihkLG4sbyxlLnRhbmdlbnRSb3RhdGlvbk1hdHJpeCksST02KihpLTEpKihsLTEpO3MmJihJKz0zKihpLTEpKSxmJiYoSSs9MyooaS0xKSk7bGV0IEQ9RHQuY3JlYXRlVHlwZWRBcnJheShwLEkpLHY9MCxMPTAsVTtmb3IoVT0wO1U8bC0xOysrVSl7Zm9yKGxldCBBPTA7QTxpLTE7KytBKXtsZXQgUz12LFA9UytpLEI9UCsxLGo9UysxO0RbTCsrXT1TLERbTCsrXT1QLERbTCsrXT1qLERbTCsrXT1qLERbTCsrXT1QLERbTCsrXT1CLCsrdn0rK3Z9aWYoc3x8Zil7bGV0IEE9cC0xLFM9cC0xO3MmJmYmJihBPXAtMik7bGV0IFAsQjtpZih2PTAscylmb3IoVT0wO1U8aS0xO1UrKylQPXYsQj1QKzEsRFtMKytdPUEsRFtMKytdPVAsRFtMKytdPUIsKyt2O2lmKGYpZm9yKHY9KGwtMSkqaSxVPTA7VTxpLTE7VSsrKVA9dixCPVArMSxEW0wrK109UCxEW0wrK109UyxEW0wrK109QiwrK3Z9cmV0dXJuIE4uaW5kaWNlcz1ELG4uc3QmJihOLmF0dHJpYnV0ZXMuc3Q9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjIsdmFsdWVzOm19KSksTn1mdW5jdGlvbiBNYSh0LGUsbixvLHIpe3JldHVybiB0W2UrK109b1tuXSx0W2UrK109b1tuKzFdLHRbZSsrXT1vW24rMl0sdFtlKytdPXJbbl0sdFtlKytdPXJbbisxXSx0W2VdPXJbbisyXSx0fWZ1bmN0aW9uIE5hKHQsZSxuLG8pe3JldHVybiB0W2UrK109b1tuXSx0W2UrK109b1tuKzFdLHRbZSsrXT1vW25dLHRbZV09b1tuKzFdLHR9ZnVuY3Rpb24gbEIodCxlKXtsZXQgbj10Ll9zaGFkb3dWb2x1bWUsbz10Ll9vZmZzZXRBdHRyaWJ1dGUscj10Ll92ZXJ0ZXhGb3JtYXQsaT10Ll9leHRydWRlZEhlaWdodCxzPXQuX3N1cmZhY2VIZWlnaHQsZj10Ll9lbGxpcHNvaWQsdT1lLmhlaWdodCxjPWUud2lkdGgsbDtpZihuKXtsZXQgSnQ9ZHQuY2xvbmUocixQeSk7SnQubm9ybWFsPSEwLHQuX3ZlcnRleEZvcm1hdD1KdH1sZXQgcD1ZRSh0LGUpO24mJih0Ll92ZXJ0ZXhGb3JtYXQ9cik7bGV0IGQ9U2Uuc2NhbGVUb0dlb2RldGljSGVpZ2h0KHAuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMscyxmLCExKTtkPW5ldyBGbG9hdDY0QXJyYXkoZCk7bGV0IG09ZC5sZW5ndGgsXz1tKjIsZz1uZXcgRmxvYXQ2NEFycmF5KF8pO2cuc2V0KGQpO2xldCBiPVNlLnNjYWxlVG9HZW9kZXRpY0hlaWdodChwLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLGksZik7Zy5zZXQoYixtKSxwLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzPWc7bGV0IHc9ci5ub3JtYWw/bmV3IEZsb2F0MzJBcnJheShfKTp2b2lkIDAsTz1yLnRhbmdlbnQ/bmV3IEZsb2F0MzJBcnJheShfKTp2b2lkIDAsRT1yLmJpdGFuZ2VudD9uZXcgRmxvYXQzMkFycmF5KF8pOnZvaWQgMCxUPXIuc3Q/bmV3IEZsb2F0MzJBcnJheShfLzMqMik6dm9pZCAwLEMsTjtpZihyLm5vcm1hbCl7Zm9yKE49cC5hdHRyaWJ1dGVzLm5vcm1hbC52YWx1ZXMsdy5zZXQoTiksbD0wO2w8bTtsKyspTltsXT0tTltsXTt3LnNldChOLG0pLHAuYXR0cmlidXRlcy5ub3JtYWwudmFsdWVzPXd9aWYobil7Tj1wLmF0dHJpYnV0ZXMubm9ybWFsLnZhbHVlcyxyLm5vcm1hbHx8KHAuYXR0cmlidXRlcy5ub3JtYWw9dm9pZCAwKTtsZXQgSnQ9bmV3IEZsb2F0MzJBcnJheShfKTtmb3IobD0wO2w8bTtsKyspTltsXT0tTltsXTtKdC5zZXQoTixtKSxwLmF0dHJpYnV0ZXMuZXh0cnVkZURpcmVjdGlvbj1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6SnR9KX1sZXQgSSxEPWgobyk7aWYoRCl7bGV0IEp0PW0vMyoyLHhlPW5ldyBVaW50OEFycmF5KEp0KTtvPT09ZmUuVE9QP3hlPXhlLmZpbGwoMSwwLEp0LzIpOihJPW89PT1mZS5OT05FPzA6MSx4ZT14ZS5maWxsKEkpKSxwLmF0dHJpYnV0ZXMuYXBwbHlPZmZzZXQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5VTlNJR05FRF9CWVRFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6MSx2YWx1ZXM6eGV9KX1pZihyLnRhbmdlbnQpe2xldCBKdD1wLmF0dHJpYnV0ZXMudGFuZ2VudC52YWx1ZXM7Zm9yKE8uc2V0KEp0KSxsPTA7bDxtO2wrKylKdFtsXT0tSnRbbF07Ty5zZXQoSnQsbSkscC5hdHRyaWJ1dGVzLnRhbmdlbnQudmFsdWVzPU99aWYoci5iaXRhbmdlbnQpe2xldCBKdD1wLmF0dHJpYnV0ZXMuYml0YW5nZW50LnZhbHVlcztFLnNldChKdCksRS5zZXQoSnQsbSkscC5hdHRyaWJ1dGVzLmJpdGFuZ2VudC52YWx1ZXM9RX1yLnN0JiYoQz1wLmF0dHJpYnV0ZXMuc3QudmFsdWVzLFQuc2V0KEMpLFQuc2V0KEMsbS8zKjIpLHAuYXR0cmlidXRlcy5zdC52YWx1ZXM9VCk7bGV0IHY9cC5pbmRpY2VzLEw9di5sZW5ndGgsVT1tLzMsQT1EdC5jcmVhdGVUeXBlZEFycmF5KF8vMyxMKjIpO2ZvcihBLnNldCh2KSxsPTA7bDxMO2wrPTMpQVtsK0xdPXZbbCsyXStVLEFbbCsxK0xdPXZbbCsxXStVLEFbbCsyK0xdPXZbbF0rVTtwLmluZGljZXM9QTtsZXQgUz1lLm5vcnRoQ2FwLFA9ZS5zb3V0aENhcCxCPXUsaj0yLEg9MCxrPTQsSz00O1MmJihqLT0xLEItPTEsSCs9MSxrLT0yLEstPTEpLFAmJihqLT0xLEItPTEsSCs9MSxrLT0yLEstPTEpLEgrPWoqYysyKkItaztsZXQgWD0oSCtLKSoyLFI9bmV3IEZsb2F0NjRBcnJheShYKjMpLG90PW4/bmV3IEZsb2F0MzJBcnJheShYKjMpOnZvaWQgMCxjdD1EP25ldyBVaW50OEFycmF5KFgpOnZvaWQgMCxwdD1yLnN0P25ldyBGbG9hdDMyQXJyYXkoWCoyKTp2b2lkIDAseXQ9bz09PWZlLlRPUDtEJiYheXQmJihJPW89PT1mZS5BTEw/MTowLGN0PWN0LmZpbGwoSSkpO2xldCBydD0wLFB0PTAsZ3Q9MCxDdD0wLG10PWMqQix1dDtmb3IobD0wO2w8bXQ7bCs9Yyl1dD1sKjMsUj1NYShSLHJ0LHV0LGQsYikscnQrPTYsci5zdCYmKHB0PU5hKHB0LFB0LGwqMixDKSxQdCs9NCksbiYmKGd0Kz0zLG90W2d0KytdPU5bdXRdLG90W2d0KytdPU5bdXQrMV0sb3RbZ3QrK109Tlt1dCsyXSkseXQmJihjdFtDdCsrXT0xLEN0Kz0xKTtpZihQKXtsZXQgSnQ9Uz9tdCsxOm10O2Zvcih1dD1KdCozLGw9MDtsPDI7bCsrKVI9TWEoUixydCx1dCxkLGIpLHJ0Kz02LHIuc3QmJihwdD1OYShwdCxQdCxKdCoyLEMpLFB0Kz00KSxuJiYoZ3QrPTMsb3RbZ3QrK109Tlt1dF0sb3RbZ3QrK109Tlt1dCsxXSxvdFtndCsrXT1OW3V0KzJdKSx5dCYmKGN0W0N0KytdPTEsQ3QrPTEpfWVsc2UgZm9yKGw9bXQtYztsPG10O2wrKyl1dD1sKjMsUj1NYShSLHJ0LHV0LGQsYikscnQrPTYsci5zdCYmKHB0PU5hKHB0LFB0LGwqMixDKSxQdCs9NCksbiYmKGd0Kz0zLG90W2d0KytdPU5bdXRdLG90W2d0KytdPU5bdXQrMV0sb3RbZ3QrK109Tlt1dCsyXSkseXQmJihjdFtDdCsrXT0xLEN0Kz0xKTtmb3IobD1tdC0xO2w+MDtsLT1jKXV0PWwqMyxSPU1hKFIscnQsdXQsZCxiKSxydCs9NixyLnN0JiYocHQ9TmEocHQsUHQsbCoyLEMpLFB0Kz00KSxuJiYoZ3QrPTMsb3RbZ3QrK109Tlt1dF0sb3RbZ3QrK109Tlt1dCsxXSxvdFtndCsrXT1OW3V0KzJdKSx5dCYmKGN0W0N0KytdPTEsQ3QrPTEpO2lmKFMpe2xldCBKdD1tdDtmb3IodXQ9SnQqMyxsPTA7bDwyO2wrKylSPU1hKFIscnQsdXQsZCxiKSxydCs9NixyLnN0JiYocHQ9TmEocHQsUHQsSnQqMixDKSxQdCs9NCksbiYmKGd0Kz0zLG90W2d0KytdPU5bdXRdLG90W2d0KytdPU5bdXQrMV0sb3RbZ3QrK109Tlt1dCsyXSkseXQmJihjdFtDdCsrXT0xLEN0Kz0xKX1lbHNlIGZvcihsPWMtMTtsPj0wO2wtLSl1dD1sKjMsUj1NYShSLHJ0LHV0LGQsYikscnQrPTYsci5zdCYmKHB0PU5hKHB0LFB0LGwqMixDKSxQdCs9NCksbiYmKGd0Kz0zLG90W2d0KytdPU5bdXRdLG90W2d0KytdPU5bdXQrMV0sb3RbZ3QrK109Tlt1dCsyXSkseXQmJihjdFtDdCsrXT0xLEN0Kz0xKTtsZXQgdnQ9dUIoUixyLGYpO3Iuc3QmJih2dC5hdHRyaWJ1dGVzLnN0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZToyLHZhbHVlczpwdH0pKSxuJiYodnQuYXR0cmlidXRlcy5leHRydWRlRGlyZWN0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpvdH0pKSxEJiYodnQuYXR0cmlidXRlcy5hcHBseU9mZnNldD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LlVOU0lHTkVEX0JZVEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZToxLHZhbHVlczpjdH0pKTtsZXQgenQ9RHQuY3JlYXRlVHlwZWRBcnJheShYLEgqNiksbWUsY2UscGUsdWU7bT1SLmxlbmd0aC8zO2xldCBRdD0wO2ZvcihsPTA7bDxtLTE7bCs9Mil7bWU9bCx1ZT0obWUrMiklbTtsZXQgSnQ9YS5mcm9tQXJyYXkoUixtZSozLHh5KSx4ZT1hLmZyb21BcnJheShSLHVlKjMsWEUpO2EuZXF1YWxzRXBzaWxvbihKdCx4ZSxNLkVQU0lMT04xMCl8fChjZT0obWUrMSklbSxwZT0oY2UrMiklbSx6dFtRdCsrXT1tZSx6dFtRdCsrXT1jZSx6dFtRdCsrXT11ZSx6dFtRdCsrXT11ZSx6dFtRdCsrXT1jZSx6dFtRdCsrXT1wZSl9cmV0dXJuIHZ0LmluZGljZXM9enQsdnQ9VmUuY29tYmluZUluc3RhbmNlcyhbbmV3IGNvKHtnZW9tZXRyeTpwfSksbmV3IGNvKHtnZW9tZXRyeTp2dH0pXSksdnRbMF19ZnVuY3Rpb24gTXkodCxlLG4sbyxyKXtpZihuPT09MClyZXR1cm4gTnQuY2xvbmUodCxyKTtsZXQgaT15by5jb21wdXRlT3B0aW9ucyh0LGUsbiwwLEtFLCRFKSxzPWkuaGVpZ2h0LGY9aS53aWR0aCx1PXBCO3JldHVybiB5by5jb21wdXRlUG9zaXRpb24oaSxvLCExLDAsMCx1WzBdKSx5by5jb21wdXRlUG9zaXRpb24oaSxvLCExLDAsZi0xLHVbMV0pLHlvLmNvbXB1dGVQb3NpdGlvbihpLG8sITEscy0xLDAsdVsyXSkseW8uY29tcHV0ZVBvc2l0aW9uKGksbywhMSxzLTEsZi0xLHVbM10pLE50LmZyb21DYXJ0ZXNpYW5BcnJheSh1LG8scil9ZnVuY3Rpb24gbWkodCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXQucmVjdGFuZ2xlO2lmKHkudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIixlKSxOdC52YWxpZGF0ZShlKSxlLm5vcnRoPGUuc291dGgpdGhyb3cgbmV3IEYoIm9wdGlvbnMucmVjdGFuZ2xlLm5vcnRoIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG9wdGlvbnMucmVjdGFuZ2xlLnNvdXRoIik7bGV0IG49eCh0LmhlaWdodCwwKSxvPXgodC5leHRydWRlZEhlaWdodCxuKTt0aGlzLl9yZWN0YW5nbGU9TnQuY2xvbmUoZSksdGhpcy5fZ3JhbnVsYXJpdHk9eCh0LmdyYW51bGFyaXR5LE0uUkFESUFOU19QRVJfREVHUkVFKSx0aGlzLl9lbGxpcHNvaWQ9JC5jbG9uZSh4KHQuZWxsaXBzb2lkLCQuV0dTODQpKSx0aGlzLl9zdXJmYWNlSGVpZ2h0PU1hdGgubWF4KG4sbyksdGhpcy5fcm90YXRpb249eCh0LnJvdGF0aW9uLDApLHRoaXMuX3N0Um90YXRpb249eCh0LnN0Um90YXRpb24sMCksdGhpcy5fdmVydGV4Rm9ybWF0PWR0LmNsb25lKHgodC52ZXJ0ZXhGb3JtYXQsZHQuREVGQVVMVCkpLHRoaXMuX2V4dHJ1ZGVkSGVpZ2h0PU1hdGgubWluKG4sbyksdGhpcy5fc2hhZG93Vm9sdW1lPXgodC5zaGFkb3dWb2x1bWUsITEpLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZVJlY3RhbmdsZUdlb21ldHJ5Iix0aGlzLl9vZmZzZXRBdHRyaWJ1dGU9dC5vZmZzZXRBdHRyaWJ1dGUsdGhpcy5fcm90YXRlZFJlY3RhbmdsZT12b2lkIDAsdGhpcy5fdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50cz12b2lkIDB9ZnVuY3Rpb24gQUIodCl7aWYodC5fc3RSb3RhdGlvbj09PTApcmV0dXJuWzAsMCwwLDEsMSwwXTtsZXQgZT1OdC5jbG9uZSh0Ll9yZWN0YW5nbGUsekUpLG49dC5fZ3JhbnVsYXJpdHksbz10Ll9lbGxpcHNvaWQscj10Ll9yb3RhdGlvbi10Ll9zdFJvdGF0aW9uLGk9TXkoZSxuLHIsbyx6RSkscz1fQjtzWzBdLng9aS53ZXN0LHNbMF0ueT1pLnNvdXRoLHNbMV0ueD1pLndlc3Qsc1sxXS55PWkubm9ydGgsc1syXS54PWkuZWFzdCxzWzJdLnk9aS5zb3V0aDtsZXQgZj10LnJlY3RhbmdsZSx1PSRvLmZyb21Sb3RhdGlvbih0Ll9zdFJvdGF0aW9uLHlCKSxjPU50LmNlbnRlcihmLGdCKTtmb3IobGV0IF89MDtfPDM7KytfKXtsZXQgZz1zW19dO2cueC09Yy5sb25naXR1ZGUsZy55LT1jLmxhdGl0dWRlLCRvLm11bHRpcGx5QnlWZWN0b3IodSxnLGcpLGcueCs9Yy5sb25naXR1ZGUsZy55Kz1jLmxhdGl0dWRlLGcueD0oZy54LWYud2VzdCkvZi53aWR0aCxnLnk9KGcueS1mLnNvdXRoKS9mLmhlaWdodH1sZXQgbD1zWzBdLHA9c1sxXSxkPXNbMl0sbT1uZXcgQXJyYXkoNik7cmV0dXJuIHR0LnBhY2sobCxtKSx0dC5wYWNrKHAsbSwyKSx0dC5wYWNrKGQsbSw0KSxtfXZhciBDeSxqRSxIRSxxRSxLRSxzQixjQixhQix4eSxYRSxQeSxwQiwkRSxkQixaRSxRRSxTcyxtQixHRSxoQix6RSxfQix5QixnQixOeSxKRT1aKCgpPT57TWUoKTtGZSgpO0Z0KCk7UGUoKTtYdCgpO0xlKCk7SXQoKTtmdCgpO0h0KCk7WnQoKTtYZSgpO1llKCk7YW4oKTtzYygpO0xvKCk7c2koKTskZSgpO1d0KCk7QWYoKTtGbigpO3FyKCk7dG4oKTtXbygpO3duKCk7U3koKTtFbygpO0N5PW5ldyBhLGpFPW5ldyBhLEhFPW5ldyBhLHFFPW5ldyBhLEtFPW5ldyBOdCxzQj1uZXcgdHQsY0I9bmV3IEF0LGFCPW5ldyBBdDt4eT1uZXcgYSxYRT1uZXcgYTtQeT1uZXcgZHQ7cEI9W25ldyBhLG5ldyBhLG5ldyBhLG5ldyBhXSwkRT1uZXcgYXQsZEI9bmV3IGF0O21pLnBhY2tlZExlbmd0aD1OdC5wYWNrZWRMZW5ndGgrJC5wYWNrZWRMZW5ndGgrZHQucGFja2VkTGVuZ3RoKzc7bWkucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49eChuLDApLE50LnBhY2sodC5fcmVjdGFuZ2xlLGUsbiksbis9TnQucGFja2VkTGVuZ3RoLCQucGFjayh0Ll9lbGxpcHNvaWQsZSxuKSxuKz0kLnBhY2tlZExlbmd0aCxkdC5wYWNrKHQuX3ZlcnRleEZvcm1hdCxlLG4pLG4rPWR0LnBhY2tlZExlbmd0aCxlW24rK109dC5fZ3JhbnVsYXJpdHksZVtuKytdPXQuX3N1cmZhY2VIZWlnaHQsZVtuKytdPXQuX3JvdGF0aW9uLGVbbisrXT10Ll9zdFJvdGF0aW9uLGVbbisrXT10Ll9leHRydWRlZEhlaWdodCxlW24rK109dC5fc2hhZG93Vm9sdW1lPzE6MCxlW25dPXgodC5fb2Zmc2V0QXR0cmlidXRlLC0xKSxlfTtaRT1uZXcgTnQsUUU9JC5jbG9uZSgkLlVOSVRfU1BIRVJFKSxTcz17cmVjdGFuZ2xlOlpFLGVsbGlwc29pZDpRRSx2ZXJ0ZXhGb3JtYXQ6UHksZ3JhbnVsYXJpdHk6dm9pZCAwLGhlaWdodDp2b2lkIDAscm90YXRpb246dm9pZCAwLHN0Um90YXRpb246dm9pZCAwLGV4dHJ1ZGVkSGVpZ2h0OnZvaWQgMCxzaGFkb3dWb2x1bWU6dm9pZCAwLG9mZnNldEF0dHJpYnV0ZTp2b2lkIDB9O21pLnVucGFjaz1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCk7bGV0IG89TnQudW5wYWNrKHQsZSxaRSk7ZSs9TnQucGFja2VkTGVuZ3RoO2xldCByPSQudW5wYWNrKHQsZSxRRSk7ZSs9JC5wYWNrZWRMZW5ndGg7bGV0IGk9ZHQudW5wYWNrKHQsZSxQeSk7ZSs9ZHQucGFja2VkTGVuZ3RoO2xldCBzPXRbZSsrXSxmPXRbZSsrXSx1PXRbZSsrXSxjPXRbZSsrXSxsPXRbZSsrXSxwPXRbZSsrXT09PTEsZD10W2VdO3JldHVybiBoKG4pPyhuLl9yZWN0YW5nbGU9TnQuY2xvbmUobyxuLl9yZWN0YW5nbGUpLG4uX2VsbGlwc29pZD0kLmNsb25lKHIsbi5fZWxsaXBzb2lkKSxuLl92ZXJ0ZXhGb3JtYXQ9ZHQuY2xvbmUoaSxuLl92ZXJ0ZXhGb3JtYXQpLG4uX2dyYW51bGFyaXR5PXMsbi5fc3VyZmFjZUhlaWdodD1mLG4uX3JvdGF0aW9uPXUsbi5fc3RSb3RhdGlvbj1jLG4uX2V4dHJ1ZGVkSGVpZ2h0PWwsbi5fc2hhZG93Vm9sdW1lPXAsbi5fb2Zmc2V0QXR0cmlidXRlPWQ9PT0tMT92b2lkIDA6ZCxuKTooU3MuZ3JhbnVsYXJpdHk9cyxTcy5oZWlnaHQ9ZixTcy5yb3RhdGlvbj11LFNzLnN0Um90YXRpb249YyxTcy5leHRydWRlZEhlaWdodD1sLFNzLnNoYWRvd1ZvbHVtZT1wLFNzLm9mZnNldEF0dHJpYnV0ZT1kPT09LTE/dm9pZCAwOmQsbmV3IG1pKFNzKSl9O21pLmNvbXB1dGVSZWN0YW5nbGU9ZnVuY3Rpb24odCxlKXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IG49dC5yZWN0YW5nbGU7aWYoeS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLG4pLE50LnZhbGlkYXRlKG4pLG4ubm9ydGg8bi5zb3V0aCl0aHJvdyBuZXcgRigib3B0aW9ucy5yZWN0YW5nbGUubm9ydGggbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gb3B0aW9ucy5yZWN0YW5nbGUuc291dGgiKTtsZXQgbz14KHQuZ3JhbnVsYXJpdHksTS5SQURJQU5TX1BFUl9ERUdSRUUpLHI9eCh0LmVsbGlwc29pZCwkLldHUzg0KSxpPXgodC5yb3RhdGlvbiwwKTtyZXR1cm4gTXkobixvLGkscixlKX07bUI9bmV3IEosR0U9bmV3IGVlLGhCPW5ldyBhdDttaS5jcmVhdGVHZW9tZXRyeT1mdW5jdGlvbih0KXtpZihNLmVxdWFsc0Vwc2lsb24odC5fcmVjdGFuZ2xlLm5vcnRoLHQuX3JlY3RhbmdsZS5zb3V0aCxNLkVQU0lMT04xMCl8fE0uZXF1YWxzRXBzaWxvbih0Ll9yZWN0YW5nbGUuZWFzdCx0Ll9yZWN0YW5nbGUud2VzdCxNLkVQU0lMT04xMCkpcmV0dXJuO2xldCBlPXQuX3JlY3RhbmdsZSxuPXQuX2VsbGlwc29pZCxvPXQuX3JvdGF0aW9uLHI9dC5fc3RSb3RhdGlvbixpPXQuX3ZlcnRleEZvcm1hdCxzPXlvLmNvbXB1dGVPcHRpb25zKGUsdC5fZ3JhbnVsYXJpdHksbyxyLEtFLCRFLGRCKSxmPW1CO2lmKHIhPT0wfHxvIT09MCl7bGV0IG09TnQuY2VudGVyKGUsaEIpLF89bi5nZW9kZXRpY1N1cmZhY2VOb3JtYWxDYXJ0b2dyYXBoaWMobSx4eSk7ZWUuZnJvbUF4aXNBbmdsZShfLC1yLEdFKSxKLmZyb21RdWF0ZXJuaW9uKEdFLGYpfWVsc2UgSi5jbG9uZShKLklERU5USVRZLGYpO2xldCB1PXQuX3N1cmZhY2VIZWlnaHQsYz10Ll9leHRydWRlZEhlaWdodCxsPSFNLmVxdWFsc0Vwc2lsb24odSxjLDAsTS5FUFNJTE9OMik7cy5sb25TY2FsYXI9MS90Ll9yZWN0YW5nbGUud2lkdGgscy5sYXRTY2FsYXI9MS90Ll9yZWN0YW5nbGUuaGVpZ2h0LHMudGFuZ2VudFJvdGF0aW9uTWF0cml4PWY7bGV0IHAsZDtpZihlPXQuX3JlY3RhbmdsZSxsKXtwPWxCKHQscyk7bGV0IG09QXQuZnJvbVJlY3RhbmdsZTNEKGUsbix1LGFCKSxfPUF0LmZyb21SZWN0YW5nbGUzRChlLG4sYyxjQik7ZD1BdC51bmlvbihtLF8pfWVsc2V7aWYocD1ZRSh0LHMpLHAuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXM9U2Uuc2NhbGVUb0dlb2RldGljSGVpZ2h0KHAuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMsdSxuLCExKSxoKHQuX29mZnNldEF0dHJpYnV0ZSkpe2xldCBtPXAuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMubGVuZ3RoLF89dC5fb2Zmc2V0QXR0cmlidXRlPT09ZmUuTk9ORT8wOjEsZz1uZXcgVWludDhBcnJheShtLzMpLmZpbGwoXyk7cC5hdHRyaWJ1dGVzLmFwcGx5T2Zmc2V0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuVU5TSUdORURfQllURSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjEsdmFsdWVzOmd9KX1kPUF0LmZyb21SZWN0YW5nbGUzRChlLG4sdSl9cmV0dXJuIGkucG9zaXRpb258fGRlbGV0ZSBwLmF0dHJpYnV0ZXMucG9zaXRpb24sbmV3IFV0KHthdHRyaWJ1dGVzOnAuYXR0cmlidXRlcyxpbmRpY2VzOnAuaW5kaWNlcyxwcmltaXRpdmVUeXBlOnAucHJpbWl0aXZlVHlwZSxib3VuZGluZ1NwaGVyZTpkLG9mZnNldEF0dHJpYnV0ZTp0Ll9vZmZzZXRBdHRyaWJ1dGV9KX07bWkuY3JlYXRlU2hhZG93Vm9sdW1lPWZ1bmN0aW9uKHQsZSxuKXtsZXQgbz10Ll9ncmFudWxhcml0eSxyPXQuX2VsbGlwc29pZCxpPWUobyxyKSxzPW4obyxyKTtyZXR1cm4gbmV3IG1pKHtyZWN0YW5nbGU6dC5fcmVjdGFuZ2xlLHJvdGF0aW9uOnQuX3JvdGF0aW9uLGVsbGlwc29pZDpyLHN0Um90YXRpb246dC5fc3RSb3RhdGlvbixncmFudWxhcml0eTpvLGV4dHJ1ZGVkSGVpZ2h0OnMsaGVpZ2h0OmksdmVydGV4Rm9ybWF0OmR0LlBPU0lUSU9OX09OTFksc2hhZG93Vm9sdW1lOiEwfSl9O3pFPW5ldyBOdCxfQj1bbmV3IHR0LG5ldyB0dCxuZXcgdHRdLHlCPW5ldyAkbyxnQj1uZXcgYXQ7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobWkucHJvdG90eXBlLHtyZWN0YW5nbGU6e2dldDpmdW5jdGlvbigpe3JldHVybiBoKHRoaXMuX3JvdGF0ZWRSZWN0YW5nbGUpfHwodGhpcy5fcm90YXRlZFJlY3RhbmdsZT1NeSh0aGlzLl9yZWN0YW5nbGUsdGhpcy5fZ3JhbnVsYXJpdHksdGhpcy5fcm90YXRpb24sdGhpcy5fZWxsaXBzb2lkKSksdGhpcy5fcm90YXRlZFJlY3RhbmdsZX19LHRleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHM6e2dldDpmdW5jdGlvbigpe3JldHVybiBoKHRoaXMuX3RleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHMpfHwodGhpcy5fdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50cz1BQih0aGlzKSksdGhpcy5fdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50c319fSk7Tnk9bWl9KTt2YXIgSXk9e307ZGUoSXkse2RlZmF1bHQ6KCk9PndCfSk7ZnVuY3Rpb24gYkIodCxlKXtyZXR1cm4gaChlKSYmKHQ9TnkudW5wYWNrKHQsZSkpLHQuX2VsbGlwc29pZD0kLmNsb25lKHQuX2VsbGlwc29pZCksdC5fcmVjdGFuZ2xlPU50LmNsb25lKHQuX3JlY3RhbmdsZSksTnkuY3JlYXRlR2VvbWV0cnkodCl9dmFyIHdCLHZ5PVooKCk9PntmdCgpO1p0KCk7d24oKTtKRSgpO3dCPWJCfSk7ZnVuY3Rpb24gdFIodCxlKXtsZXQgbj10Ll9lbGxpcHNvaWQsbz1lLmhlaWdodCxyPWUud2lkdGgsaT1lLm5vcnRoQ2FwLHM9ZS5zb3V0aENhcCxmPW8sdT0yLGM9MCxsPTQ7aSYmKHUtPTEsZi09MSxjKz0xLGwtPTIpLHMmJih1LT0xLGYtPTEsYys9MSxsLT0yKSxjKz11KnIrMipmLWw7bGV0IHA9bmV3IEZsb2F0NjRBcnJheShjKjMpLGQ9MCxtPTAsXyxnPUVCO2lmKGkpeW8uY29tcHV0ZVBvc2l0aW9uKGUsbiwhMSxtLDAsZykscFtkKytdPWcueCxwW2QrK109Zy55LHBbZCsrXT1nLno7ZWxzZSBmb3IoXz0wO188cjtfKyspeW8uY29tcHV0ZVBvc2l0aW9uKGUsbiwhMSxtLF8sZykscFtkKytdPWcueCxwW2QrK109Zy55LHBbZCsrXT1nLno7Zm9yKF89ci0xLG09MTttPG87bSsrKXlvLmNvbXB1dGVQb3NpdGlvbihlLG4sITEsbSxfLGcpLHBbZCsrXT1nLngscFtkKytdPWcueSxwW2QrK109Zy56O2lmKG09by0xLCFzKWZvcihfPXItMjtfPj0wO18tLSl5by5jb21wdXRlUG9zaXRpb24oZSxuLCExLG0sXyxnKSxwW2QrK109Zy54LHBbZCsrXT1nLnkscFtkKytdPWcuejtmb3IoXz0wLG09by0yO20+MDttLS0peW8uY29tcHV0ZVBvc2l0aW9uKGUsbiwhMSxtLF8sZykscFtkKytdPWcueCxwW2QrK109Zy55LHBbZCsrXT1nLno7bGV0IGI9cC5sZW5ndGgvMyoyLHc9RHQuY3JlYXRlVHlwZWRBcnJheShwLmxlbmd0aC8zLGIpLE89MDtmb3IobGV0IFQ9MDtUPHAubGVuZ3RoLzMtMTtUKyspd1tPKytdPVQsd1tPKytdPVQrMTt3W08rK109cC5sZW5ndGgvMy0xLHdbTysrXT0wO2xldCBFPW5ldyBVdCh7YXR0cmlidXRlczpuZXcgaWUscHJpbWl0aXZlVHlwZTpCdC5MSU5FU30pO3JldHVybiBFLmF0dHJpYnV0ZXMucG9zaXRpb249bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpwfSksRS5pbmRpY2VzPXcsRX1mdW5jdGlvbiBTQih0LGUpe2xldCBuPXQuX3N1cmZhY2VIZWlnaHQsbz10Ll9leHRydWRlZEhlaWdodCxyPXQuX2VsbGlwc29pZCxpPXRSKHQsZSkscz1lLmhlaWdodCxmPWUud2lkdGgsdT1TZS5zY2FsZVRvR2VvZGV0aWNIZWlnaHQoaS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyxuLHIsITEpLGM9dS5sZW5ndGgsbD1uZXcgRmxvYXQ2NEFycmF5KGMqMik7bC5zZXQodSk7bGV0IHA9U2Uuc2NhbGVUb0dlb2RldGljSGVpZ2h0KGkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMsbyxyKTtsLnNldChwLGMpLGkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXM9bDtsZXQgZD1lLm5vcnRoQ2FwLG09ZS5zb3V0aENhcCxfPTQ7ZCYmKF8tPTEpLG0mJihfLT0xKTtsZXQgZz0obC5sZW5ndGgvMytfKSoyLGI9RHQuY3JlYXRlVHlwZWRBcnJheShsLmxlbmd0aC8zLGcpO2M9bC5sZW5ndGgvNjtsZXQgdz0wO2ZvcihsZXQgRT0wO0U8Yy0xO0UrKyliW3crK109RSxiW3crK109RSsxLGJbdysrXT1FK2MsYlt3KytdPUUrYysxO2JbdysrXT1jLTEsYlt3KytdPTAsYlt3KytdPWMrYy0xLGJbdysrXT1jLGJbdysrXT0wLGJbdysrXT1jO2xldCBPO2lmKGQpTz1zLTE7ZWxzZXtsZXQgRT1mLTE7Ylt3KytdPUUsYlt3KytdPUUrYyxPPWYrcy0yfWlmKGJbdysrXT1PLGJbdysrXT1PK2MsIW0pe2xldCBFPWYrTy0xO2JbdysrXT1FLGJbd109RStjfXJldHVybiBpLmluZGljZXM9YixpfWZ1bmN0aW9uIHZhKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKTtsZXQgZT10LnJlY3RhbmdsZSxuPXgodC5ncmFudWxhcml0eSxNLlJBRElBTlNfUEVSX0RFR1JFRSksbz14KHQuZWxsaXBzb2lkLCQuV0dTODQpLHI9eCh0LnJvdGF0aW9uLDApO2lmKCFoKGUpKXRocm93IG5ldyBGKCJyZWN0YW5nbGUgaXMgcmVxdWlyZWQuIik7aWYoTnQudmFsaWRhdGUoZSksZS5ub3J0aDxlLnNvdXRoKXRocm93IG5ldyBGKCJvcHRpb25zLnJlY3RhbmdsZS5ub3J0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvcHRpb25zLnJlY3RhbmdsZS5zb3V0aCIpO2xldCBpPXgodC5oZWlnaHQsMCkscz14KHQuZXh0cnVkZWRIZWlnaHQsaSk7dGhpcy5fcmVjdGFuZ2xlPU50LmNsb25lKGUpLHRoaXMuX2dyYW51bGFyaXR5PW4sdGhpcy5fZWxsaXBzb2lkPW8sdGhpcy5fc3VyZmFjZUhlaWdodD1NYXRoLm1heChpLHMpLHRoaXMuX3JvdGF0aW9uPXIsdGhpcy5fZXh0cnVkZWRIZWlnaHQ9TWF0aC5taW4oaSxzKSx0aGlzLl9vZmZzZXRBdHRyaWJ1dGU9dC5vZmZzZXRBdHRyaWJ1dGUsdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlUmVjdGFuZ2xlT3V0bGluZUdlb21ldHJ5In12YXIgVEIsT0IsRUIsUkIsZVIsblIsSWEsQ0IsTHksb1I9WigoKT0+e01lKCk7RnQoKTtQZSgpO0xlKCk7SXQoKTtmdCgpO0h0KCk7WnQoKTtYZSgpO1llKCk7YW4oKTtMbygpOyRlKCk7V3QoKTtxcigpO3RuKCk7d24oKTtTeSgpO1RCPW5ldyBBdCxPQj1uZXcgQXQsRUI9bmV3IGEsUkI9bmV3IE50O3ZhLnBhY2tlZExlbmd0aD1OdC5wYWNrZWRMZW5ndGgrJC5wYWNrZWRMZW5ndGgrNTt2YS5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgRigidmFsdWUgaXMgcmVxdWlyZWQiKTtpZighaChlKSl0aHJvdyBuZXcgRigiYXJyYXkgaXMgcmVxdWlyZWQiKTtyZXR1cm4gbj14KG4sMCksTnQucGFjayh0Ll9yZWN0YW5nbGUsZSxuKSxuKz1OdC5wYWNrZWRMZW5ndGgsJC5wYWNrKHQuX2VsbGlwc29pZCxlLG4pLG4rPSQucGFja2VkTGVuZ3RoLGVbbisrXT10Ll9ncmFudWxhcml0eSxlW24rK109dC5fc3VyZmFjZUhlaWdodCxlW24rK109dC5fcm90YXRpb24sZVtuKytdPXQuX2V4dHJ1ZGVkSGVpZ2h0LGVbbl09eCh0Ll9vZmZzZXRBdHRyaWJ1dGUsLTEpLGV9O2VSPW5ldyBOdCxuUj0kLmNsb25lKCQuVU5JVF9TUEhFUkUpLElhPXtyZWN0YW5nbGU6ZVIsZWxsaXBzb2lkOm5SLGdyYW51bGFyaXR5OnZvaWQgMCxoZWlnaHQ6dm9pZCAwLHJvdGF0aW9uOnZvaWQgMCxleHRydWRlZEhlaWdodDp2b2lkIDAsb2Zmc2V0QXR0cmlidXRlOnZvaWQgMH07dmEudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgRigiYXJyYXkgaXMgcmVxdWlyZWQiKTtlPXgoZSwwKTtsZXQgbz1OdC51bnBhY2sodCxlLGVSKTtlKz1OdC5wYWNrZWRMZW5ndGg7bGV0IHI9JC51bnBhY2sodCxlLG5SKTtlKz0kLnBhY2tlZExlbmd0aDtsZXQgaT10W2UrK10scz10W2UrK10sZj10W2UrK10sdT10W2UrK10sYz10W2VdO3JldHVybiBoKG4pPyhuLl9yZWN0YW5nbGU9TnQuY2xvbmUobyxuLl9yZWN0YW5nbGUpLG4uX2VsbGlwc29pZD0kLmNsb25lKHIsbi5fZWxsaXBzb2lkKSxuLl9zdXJmYWNlSGVpZ2h0PXMsbi5fcm90YXRpb249ZixuLl9leHRydWRlZEhlaWdodD11LG4uX29mZnNldEF0dHJpYnV0ZT1jPT09LTE/dm9pZCAwOmMsbik6KElhLmdyYW51bGFyaXR5PWksSWEuaGVpZ2h0PXMsSWEucm90YXRpb249ZixJYS5leHRydWRlZEhlaWdodD11LElhLm9mZnNldEF0dHJpYnV0ZT1jPT09LTE/dm9pZCAwOmMsbmV3IHZhKElhKSl9O0NCPW5ldyBhdDt2YS5jcmVhdGVHZW9tZXRyeT1mdW5jdGlvbih0KXtsZXQgZT10Ll9yZWN0YW5nbGUsbj10Ll9lbGxpcHNvaWQsbz15by5jb21wdXRlT3B0aW9ucyhlLHQuX2dyYW51bGFyaXR5LHQuX3JvdGF0aW9uLDAsUkIsQ0IpLHIsaTtpZihNLmVxdWFsc0Vwc2lsb24oZS5ub3J0aCxlLnNvdXRoLE0uRVBTSUxPTjEwKXx8TS5lcXVhbHNFcHNpbG9uKGUuZWFzdCxlLndlc3QsTS5FUFNJTE9OMTApKXJldHVybjtsZXQgcz10Ll9zdXJmYWNlSGVpZ2h0LGY9dC5fZXh0cnVkZWRIZWlnaHQsdT0hTS5lcXVhbHNFcHNpbG9uKHMsZiwwLE0uRVBTSUxPTjIpLGM7aWYodSl7aWYocj1TQih0LG8pLGgodC5fb2Zmc2V0QXR0cmlidXRlKSl7bGV0IGQ9ci5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGgvMyxtPW5ldyBVaW50OEFycmF5KGQpO3QuX29mZnNldEF0dHJpYnV0ZT09PWZlLlRPUD9tPW0uZmlsbCgxLDAsZC8yKTooYz10Ll9vZmZzZXRBdHRyaWJ1dGU9PT1mZS5OT05FPzA6MSxtPW0uZmlsbChjKSksci5hdHRyaWJ1dGVzLmFwcGx5T2Zmc2V0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuVU5TSUdORURfQllURSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjEsdmFsdWVzOm19KX1sZXQgbD1BdC5mcm9tUmVjdGFuZ2xlM0QoZSxuLHMsT0IpLHA9QXQuZnJvbVJlY3RhbmdsZTNEKGUsbixmLFRCKTtpPUF0LnVuaW9uKGwscCl9ZWxzZXtpZihyPXRSKHQsbyksci5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcz1TZS5zY2FsZVRvR2VvZGV0aWNIZWlnaHQoci5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyxzLG4sITEpLGgodC5fb2Zmc2V0QXR0cmlidXRlKSl7bGV0IGw9ci5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGg7Yz10Ll9vZmZzZXRBdHRyaWJ1dGU9PT1mZS5OT05FPzA6MTtsZXQgcD1uZXcgVWludDhBcnJheShsLzMpLmZpbGwoYyk7ci5hdHRyaWJ1dGVzLmFwcGx5T2Zmc2V0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuVU5TSUdORURfQllURSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjEsdmFsdWVzOnB9KX1pPUF0LmZyb21SZWN0YW5nbGUzRChlLG4scyl9cmV0dXJuIG5ldyBVdCh7YXR0cmlidXRlczpyLmF0dHJpYnV0ZXMsaW5kaWNlczpyLmluZGljZXMscHJpbWl0aXZlVHlwZTpCdC5MSU5FUyxib3VuZGluZ1NwaGVyZTppLG9mZnNldEF0dHJpYnV0ZTp0Ll9vZmZzZXRBdHRyaWJ1dGV9KX07THk9dmF9KTt2YXIgRHk9e307ZGUoRHkse2RlZmF1bHQ6KCk9PlBCfSk7ZnVuY3Rpb24geEIodCxlKXtyZXR1cm4gaChlKSYmKHQ9THkudW5wYWNrKHQsZSkpLHQuX2VsbGlwc29pZD0kLmNsb25lKHQuX2VsbGlwc29pZCksdC5fcmVjdGFuZ2xlPU50LmNsb25lKHQuX3JlY3RhbmdsZSksTHkuY3JlYXRlR2VvbWV0cnkodCl9dmFyIFBCLEZ5PVooKCk9PntmdCgpO1p0KCk7d24oKTtvUigpO1BCPXhCfSk7ZnVuY3Rpb24gTUIodCxlLG4sbyxyLGkscyl7bGV0IGY9Z24ubnVtYmVyT2ZQb2ludHModCxlLHIpLHUsYz1uLnJlZCxsPW4uZ3JlZW4scD1uLmJsdWUsZD1uLmFscGhhLG09by5yZWQsXz1vLmdyZWVuLGc9by5ibHVlLGI9by5hbHBoYTtpZihvZS5lcXVhbHMobixvKSl7Zm9yKHU9MDt1PGY7dSsrKWlbcysrXT1vZS5mbG9hdFRvQnl0ZShjKSxpW3MrK109b2UuZmxvYXRUb0J5dGUobCksaVtzKytdPW9lLmZsb2F0VG9CeXRlKHApLGlbcysrXT1vZS5mbG9hdFRvQnl0ZShkKTtyZXR1cm4gc31sZXQgdz0obS1jKS9mLE89KF8tbCkvZixFPShnLXApL2YsVD0oYi1kKS9mLEM9cztmb3IodT0wO3U8Zjt1KyspaVtDKytdPW9lLmZsb2F0VG9CeXRlKGMrdSp3KSxpW0MrK109b2UuZmxvYXRUb0J5dGUobCt1Kk8pLGlbQysrXT1vZS5mbG9hdFRvQnl0ZShwK3UqRSksaVtDKytdPW9lLmZsb2F0VG9CeXRlKGQrdSpUKTtyZXR1cm4gQ31mdW5jdGlvbiBudSh0KXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IGU9dC5wb3NpdGlvbnMsbj10LmNvbG9ycyxvPXgodC5jb2xvcnNQZXJWZXJ0ZXgsITEpO2lmKCFoKGUpfHxlLmxlbmd0aDwyKXRocm93IG5ldyBGKCJBdCBsZWFzdCB0d28gcG9zaXRpb25zIGFyZSByZXF1aXJlZC4iKTtpZihoKG4pJiYobyYmbi5sZW5ndGg8ZS5sZW5ndGh8fCFvJiZuLmxlbmd0aDxlLmxlbmd0aC0xKSl0aHJvdyBuZXcgRigiY29sb3JzIGhhcyBhbiBpbnZhbGlkIGxlbmd0aC4iKTt0aGlzLl9wb3NpdGlvbnM9ZSx0aGlzLl9jb2xvcnM9bix0aGlzLl9jb2xvcnNQZXJWZXJ0ZXg9byx0aGlzLl9hcmNUeXBlPXgodC5hcmNUeXBlLF9lLkdFT0RFU0lDKSx0aGlzLl9ncmFudWxhcml0eT14KHQuZ3JhbnVsYXJpdHksTS5SQURJQU5TX1BFUl9ERUdSRUUpLHRoaXMuX2VsbGlwc29pZD14KHQuZWxsaXBzb2lkLCQuV0dTODQpLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZVNpbXBsZVBvbHlsaW5lR2VvbWV0cnkiO2xldCByPTErZS5sZW5ndGgqYS5wYWNrZWRMZW5ndGg7cis9aChuKT8xK24ubGVuZ3RoKm9lLnBhY2tlZExlbmd0aDoxLHRoaXMucGFja2VkTGVuZ3RoPXIrJC5wYWNrZWRMZW5ndGgrM312YXIgdmQsTGQsTkIsQnksclI9WigoKT0+e2ZjKCk7TWUoKTtGdCgpO1BhKCk7TGUoKTtJdCgpO2Z0KCk7SHQoKTtadCgpO1hlKCk7WWUoKTthbigpOyRlKCk7V3QoKTt5YSgpO3RuKCk7bnUucGFjaz1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEYoInZhbHVlIGlzIHJlcXVpcmVkIik7aWYoIWgoZSkpdGhyb3cgbmV3IEYoImFycmF5IGlzIHJlcXVpcmVkIik7bj14KG4sMCk7bGV0IG8scj10Ll9wb3NpdGlvbnMsaT1yLmxlbmd0aDtmb3IoZVtuKytdPWksbz0wO288aTsrK28sbis9YS5wYWNrZWRMZW5ndGgpYS5wYWNrKHJbb10sZSxuKTtsZXQgcz10Ll9jb2xvcnM7Zm9yKGk9aChzKT9zLmxlbmd0aDowLGVbbisrXT1pLG89MDtvPGk7KytvLG4rPW9lLnBhY2tlZExlbmd0aClvZS5wYWNrKHNbb10sZSxuKTtyZXR1cm4gJC5wYWNrKHQuX2VsbGlwc29pZCxlLG4pLG4rPSQucGFja2VkTGVuZ3RoLGVbbisrXT10Ll9jb2xvcnNQZXJWZXJ0ZXg/MTowLGVbbisrXT10Ll9hcmNUeXBlLGVbbl09dC5fZ3JhbnVsYXJpdHksZX07bnUudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgRigiYXJyYXkgaXMgcmVxdWlyZWQiKTtlPXgoZSwwKTtsZXQgbyxyPXRbZSsrXSxpPW5ldyBBcnJheShyKTtmb3Iobz0wO288cjsrK28sZSs9YS5wYWNrZWRMZW5ndGgpaVtvXT1hLnVucGFjayh0LGUpO3I9dFtlKytdO2xldCBzPXI+MD9uZXcgQXJyYXkocik6dm9pZCAwO2ZvcihvPTA7bzxyOysrbyxlKz1vZS5wYWNrZWRMZW5ndGgpc1tvXT1vZS51bnBhY2sodCxlKTtsZXQgZj0kLnVucGFjayh0LGUpO2UrPSQucGFja2VkTGVuZ3RoO2xldCB1PXRbZSsrXT09PTEsYz10W2UrK10sbD10W2VdO3JldHVybiBoKG4pPyhuLl9wb3NpdGlvbnM9aSxuLl9jb2xvcnM9cyxuLl9lbGxpcHNvaWQ9ZixuLl9jb2xvcnNQZXJWZXJ0ZXg9dSxuLl9hcmNUeXBlPWMsbi5fZ3JhbnVsYXJpdHk9bCxuKTpuZXcgbnUoe3Bvc2l0aW9uczppLGNvbG9yczpzLGVsbGlwc29pZDpmLGNvbG9yc1BlclZlcnRleDp1LGFyY1R5cGU6YyxncmFudWxhcml0eTpsfSl9O3ZkPW5ldyBBcnJheSgyKSxMZD1uZXcgQXJyYXkoMiksTkI9e3Bvc2l0aW9uczp2ZCxoZWlnaHQ6TGQsZWxsaXBzb2lkOnZvaWQgMCxtaW5EaXN0YW5jZTp2b2lkIDAsZ3JhbnVsYXJpdHk6dm9pZCAwfTtudS5jcmVhdGVHZW9tZXRyeT1mdW5jdGlvbih0KXtsZXQgZT10Ll9wb3NpdGlvbnMsbj10Ll9jb2xvcnMsbz10Ll9jb2xvcnNQZXJWZXJ0ZXgscj10Ll9hcmNUeXBlLGk9dC5fZ3JhbnVsYXJpdHkscz10Ll9lbGxpcHNvaWQsZj1NLmNob3JkTGVuZ3RoKGkscy5tYXhpbXVtUmFkaXVzKSx1PWgobikmJiFvLGMsbD1lLmxlbmd0aCxwLGQsbSxfLGc9MDtpZihyPT09X2UuR0VPREVTSUN8fHI9PT1fZS5SSFVNQil7bGV0IFQsQyxOO3I9PT1fZS5HRU9ERVNJQz8oVD1NLmNob3JkTGVuZ3RoKGkscy5tYXhpbXVtUmFkaXVzKSxDPWduLm51bWJlck9mUG9pbnRzLE49Z24uZ2VuZXJhdGVBcmMpOihUPWksQz1nbi5udW1iZXJPZlBvaW50c1JodW1iTGluZSxOPWduLmdlbmVyYXRlUmh1bWJBcmMpO2xldCBJPWduLmV4dHJhY3RIZWlnaHRzKGUscyksRD1OQjtpZihyPT09X2UuR0VPREVTSUM/RC5taW5EaXN0YW5jZT1mOkQuZ3JhbnVsYXJpdHk9aSxELmVsbGlwc29pZD1zLHUpe2xldCB2PTA7Zm9yKGM9MDtjPGwtMTtjKyspdis9QyhlW2NdLGVbYysxXSxUKSsxO3A9bmV3IEZsb2F0NjRBcnJheSh2KjMpLG09bmV3IFVpbnQ4QXJyYXkodio0KSxELnBvc2l0aW9ucz12ZCxELmhlaWdodD1MZDtsZXQgTD0wO2ZvcihjPTA7YzxsLTE7KytjKXt2ZFswXT1lW2NdLHZkWzFdPWVbYysxXSxMZFswXT1JW2NdLExkWzFdPUlbYysxXTtsZXQgVT1OKEQpO2lmKGgobikpe2xldCBBPVUubGVuZ3RoLzM7Xz1uW2NdO2ZvcihsZXQgUz0wO1M8QTsrK1MpbVtMKytdPW9lLmZsb2F0VG9CeXRlKF8ucmVkKSxtW0wrK109b2UuZmxvYXRUb0J5dGUoXy5ncmVlbiksbVtMKytdPW9lLmZsb2F0VG9CeXRlKF8uYmx1ZSksbVtMKytdPW9lLmZsb2F0VG9CeXRlKF8uYWxwaGEpfXAuc2V0KFUsZyksZys9VS5sZW5ndGh9fWVsc2UgaWYoRC5wb3NpdGlvbnM9ZSxELmhlaWdodD1JLHA9bmV3IEZsb2F0NjRBcnJheShOKEQpKSxoKG4pKXtmb3IobT1uZXcgVWludDhBcnJheShwLmxlbmd0aC8zKjQpLGM9MDtjPGwtMTsrK2Mpe2xldCBMPWVbY10sVT1lW2MrMV0sQT1uW2NdLFM9bltjKzFdO2c9TUIoTCxVLEEsUyxmLG0sZyl9bGV0IHY9bltsLTFdO21bZysrXT1vZS5mbG9hdFRvQnl0ZSh2LnJlZCksbVtnKytdPW9lLmZsb2F0VG9CeXRlKHYuZ3JlZW4pLG1bZysrXT1vZS5mbG9hdFRvQnl0ZSh2LmJsdWUpLG1bZysrXT1vZS5mbG9hdFRvQnl0ZSh2LmFscGhhKX19ZWxzZXtkPXU/bCoyLTI6bCxwPW5ldyBGbG9hdDY0QXJyYXkoZCozKSxtPWgobik/bmV3IFVpbnQ4QXJyYXkoZCo0KTp2b2lkIDA7bGV0IFQ9MCxDPTA7Zm9yKGM9MDtjPGw7KytjKXtsZXQgTj1lW2NdO2lmKHUmJmM+MCYmKGEucGFjayhOLHAsVCksVCs9MyxfPW5bYy0xXSxtW0MrK109b2UuZmxvYXRUb0J5dGUoXy5yZWQpLG1bQysrXT1vZS5mbG9hdFRvQnl0ZShfLmdyZWVuKSxtW0MrK109b2UuZmxvYXRUb0J5dGUoXy5ibHVlKSxtW0MrK109b2UuZmxvYXRUb0J5dGUoXy5hbHBoYSkpLHUmJmM9PT1sLTEpYnJlYWs7YS5wYWNrKE4scCxUKSxUKz0zLGgobikmJihfPW5bY10sbVtDKytdPW9lLmZsb2F0VG9CeXRlKF8ucmVkKSxtW0MrK109b2UuZmxvYXRUb0J5dGUoXy5ncmVlbiksbVtDKytdPW9lLmZsb2F0VG9CeXRlKF8uYmx1ZSksbVtDKytdPW9lLmZsb2F0VG9CeXRlKF8uYWxwaGEpKX19bGV0IGI9bmV3IGllO2IucG9zaXRpb249bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpwfSksaChuKSYmKGIuY29sb3I9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5VTlNJR05FRF9CWVRFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6NCx2YWx1ZXM6bSxub3JtYWxpemU6ITB9KSksZD1wLmxlbmd0aC8zO2xldCB3PShkLTEpKjIsTz1EdC5jcmVhdGVUeXBlZEFycmF5KGQsdyksRT0wO2ZvcihjPTA7YzxkLTE7KytjKU9bRSsrXT1jLE9bRSsrXT1jKzE7cmV0dXJuIG5ldyBVdCh7YXR0cmlidXRlczpiLGluZGljZXM6TyxwcmltaXRpdmVUeXBlOkJ0LkxJTkVTLGJvdW5kaW5nU3BoZXJlOkF0LmZyb21Qb2ludHMoZSl9KX07Qnk9bnV9KTt2YXIgVXk9e307ZGUoVXkse2RlZmF1bHQ6KCk9PnZCfSk7ZnVuY3Rpb24gSUIodCxlKXtyZXR1cm4gaChlKSYmKHQ9QnkudW5wYWNrKHQsZSkpLHQuX2VsbGlwc29pZD0kLmNsb25lKHQuX2VsbGlwc29pZCksQnkuY3JlYXRlR2VvbWV0cnkodCl9dmFyIHZCLFZ5PVooKCk9PntmdCgpO1p0KCk7clIoKTt2Qj1JQn0pO2Z1bmN0aW9uIExhKHQpe2xldCBlPXgodC5yYWRpdXMsMSksbz17cmFkaWk6bmV3IGEoZSxlLGUpLHN0YWNrUGFydGl0aW9uczp0LnN0YWNrUGFydGl0aW9ucyxzbGljZVBhcnRpdGlvbnM6dC5zbGljZVBhcnRpdGlvbnMsdmVydGV4Rm9ybWF0OnQudmVydGV4Rm9ybWF0fTt0aGlzLl9lbGxpcHNvaWRHZW9tZXRyeT1uZXcgY3IobyksdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlU3BoZXJlR2VvbWV0cnkifXZhciBMQixDcyxreSxpUj1aKCgpPT57RnQoKTtYdCgpO0l0KCk7ZnQoKTt5ZCgpO0VvKCk7TGEucGFja2VkTGVuZ3RoPWNyLnBhY2tlZExlbmd0aDtMYS5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksY3IucGFjayh0Ll9lbGxpcHNvaWRHZW9tZXRyeSxlLG4pfTtMQj1uZXcgY3IsQ3M9e3JhZGl1czp2b2lkIDAscmFkaWk6bmV3IGEsdmVydGV4Rm9ybWF0Om5ldyBkdCxzdGFja1BhcnRpdGlvbnM6dm9pZCAwLHNsaWNlUGFydGl0aW9uczp2b2lkIDB9O0xhLnVucGFjaz1mdW5jdGlvbih0LGUsbil7bGV0IG89Y3IudW5wYWNrKHQsZSxMQik7cmV0dXJuIENzLnZlcnRleEZvcm1hdD1kdC5jbG9uZShvLl92ZXJ0ZXhGb3JtYXQsQ3MudmVydGV4Rm9ybWF0KSxDcy5zdGFja1BhcnRpdGlvbnM9by5fc3RhY2tQYXJ0aXRpb25zLENzLnNsaWNlUGFydGl0aW9ucz1vLl9zbGljZVBhcnRpdGlvbnMsaChuKT8oYS5jbG9uZShvLl9yYWRpaSxDcy5yYWRpaSksbi5fZWxsaXBzb2lkR2VvbWV0cnk9bmV3IGNyKENzKSxuKTooQ3MucmFkaXVzPW8uX3JhZGlpLngsbmV3IExhKENzKSl9O0xhLmNyZWF0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQpe3JldHVybiBjci5jcmVhdGVHZW9tZXRyeSh0Ll9lbGxpcHNvaWRHZW9tZXRyeSl9O2t5PUxhfSk7dmFyIEd5PXt9O2RlKEd5LHtkZWZhdWx0OigpPT5GQn0pO2Z1bmN0aW9uIERCKHQsZSl7cmV0dXJuIGgoZSkmJih0PWt5LnVucGFjayh0LGUpKSxreS5jcmVhdGVHZW9tZXRyeSh0KX12YXIgRkIsenk9WigoKT0+e2Z0KCk7aVIoKTtGQj1EQn0pO2Z1bmN0aW9uIERhKHQpe2xldCBlPXgodC5yYWRpdXMsMSksbz17cmFkaWk6bmV3IGEoZSxlLGUpLHN0YWNrUGFydGl0aW9uczp0LnN0YWNrUGFydGl0aW9ucyxzbGljZVBhcnRpdGlvbnM6dC5zbGljZVBhcnRpdGlvbnMsc3ViZGl2aXNpb25zOnQuc3ViZGl2aXNpb25zfTt0aGlzLl9lbGxpcHNvaWRHZW9tZXRyeT1uZXcgV3IobyksdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlU3BoZXJlT3V0bGluZUdlb21ldHJ5In12YXIgQkIsd2Msanksc1I9WigoKT0+e0Z0KCk7WHQoKTtJdCgpO2Z0KCk7RV8oKTtEYS5wYWNrZWRMZW5ndGg9V3IucGFja2VkTGVuZ3RoO0RhLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSxXci5wYWNrKHQuX2VsbGlwc29pZEdlb21ldHJ5LGUsbil9O0JCPW5ldyBXcix3Yz17cmFkaXVzOnZvaWQgMCxyYWRpaTpuZXcgYSxzdGFja1BhcnRpdGlvbnM6dm9pZCAwLHNsaWNlUGFydGl0aW9uczp2b2lkIDAsc3ViZGl2aXNpb25zOnZvaWQgMH07RGEudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtsZXQgbz1Xci51bnBhY2sodCxlLEJCKTtyZXR1cm4gd2Muc3RhY2tQYXJ0aXRpb25zPW8uX3N0YWNrUGFydGl0aW9ucyx3Yy5zbGljZVBhcnRpdGlvbnM9by5fc2xpY2VQYXJ0aXRpb25zLHdjLnN1YmRpdmlzaW9ucz1vLl9zdWJkaXZpc2lvbnMsaChuKT8oYS5jbG9uZShvLl9yYWRpaSx3Yy5yYWRpaSksbi5fZWxsaXBzb2lkR2VvbWV0cnk9bmV3IFdyKHdjKSxuKTood2MucmFkaXVzPW8uX3JhZGlpLngsbmV3IERhKHdjKSl9O0RhLmNyZWF0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQpe3JldHVybiBXci5jcmVhdGVHZW9tZXRyeSh0Ll9lbGxpcHNvaWRHZW9tZXRyeSl9O2p5PURhfSk7dmFyIEh5PXt9O2RlKEh5LHtkZWZhdWx0OigpPT5WQn0pO2Z1bmN0aW9uIFVCKHQsZSl7cmV0dXJuIGgoZSkmJih0PWp5LnVucGFjayh0LGUpKSxqeS5jcmVhdGVHZW9tZXRyeSh0KX12YXIgVkIscXk9WigoKT0+e2Z0KCk7c1IoKTtWQj1VQn0pO3ZhciBLeT17fTtkZShLeSx7ZGVmYXVsdDooKT0+aTR9KTtmdW5jdGlvbiBqQih0LGUsbixvLHIsaSxzKXtsZXQgZj10Lmxlbmd0aCx1PW5ldyBGbG9hdDY0QXJyYXkoZiozKTtmb3IobGV0IGM9MDtjPGY7KytjKXtsZXQgbD10W2NdLHA9ZVtjXSxkPW5bY10sbT1NLmxlcnAoby53ZXN0LG8uZWFzdCxsL291KSxfPU0ubGVycChvLnNvdXRoLG8ubm9ydGgscC9vdSksZz1NLmxlcnAocixpLGQvb3UpLGI9YXQuZnJvbVJhZGlhbnMobSxfLGcsR0IpLHc9cy5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihiLHpCKTthLnBhY2sodyx1LGMqMyl9cmV0dXJuIHV9ZnVuY3Rpb24gSEIodCl7bGV0IGU9dC5sZW5ndGgsbj1uZXcgVWludDMyQXJyYXkoZSsxKSxvPTA7Zm9yKGxldCByPTA7cjxlOysrciluW3JdPW8sbys9dFtyXTtyZXR1cm4gbltlXT1vLG59ZnVuY3Rpb24gV0IodCxlLG4sbyl7bGV0IHI9by5sZW5ndGgsaT10Lmxlbmd0aCxzPW5ldyBVaW50OEFycmF5KGkpLGY9cUIsdT1LQixjPTA7Zm9yKGxldCBwPTA7cDxyO3ArKyl7bGV0IGQ9b1twXSxtPWQ7Zm9yKGxldCBfPTE7XzxkO18rKyl7bGV0IGc9YytfLGI9Zy0xO3UubG9uZ2l0dWRlPXRbZ10sdS5sYXRpdHVkZT1lW2ddLGYubG9uZ2l0dWRlPXRbYl0sZi5sYXRpdHVkZT1lW2JdLGF0LmVxdWFscyh1LGYpJiYobS0tLHNbYl09MSl9b1twXT1tLGMrPWR9bGV0IGw9MDtmb3IobGV0IHA9MDtwPGk7cCsrKXNbcF0hPT0xJiYodFtsXT10W3BdLGVbbF09ZVtwXSxuW2xdPW5bcF0sbCsrKX1mdW5jdGlvbiBsUih0KXtsZXQgZT10Kjgsbj1lKjMsbz1lKjQ7dGhpcy5zdGFydEVsbGlwc29pZE5vcm1hbHM9bmV3IEZsb2F0MzJBcnJheShuKSx0aGlzLmVuZEVsbGlwc29pZE5vcm1hbHM9bmV3IEZsb2F0MzJBcnJheShuKSx0aGlzLnN0YXJ0UG9zaXRpb25BbmRIZWlnaHRzPW5ldyBGbG9hdDMyQXJyYXkobyksdGhpcy5zdGFydEZhY2VOb3JtYWxBbmRWZXJ0ZXhDb3JuZXJJZHM9bmV3IEZsb2F0MzJBcnJheShvKSx0aGlzLmVuZFBvc2l0aW9uQW5kSGVpZ2h0cz1uZXcgRmxvYXQzMkFycmF5KG8pLHRoaXMuZW5kRmFjZU5vcm1hbEFuZEhhbGZXaWR0aHM9bmV3IEZsb2F0MzJBcnJheShvKSx0aGlzLnZlcnRleEJhdGNoSWRzPW5ldyBVaW50MTZBcnJheShlKSx0aGlzLmluZGljZXM9RHQuY3JlYXRlVHlwZWRBcnJheShlLDM2KnQpLHRoaXMudmVjM09mZnNldD0wLHRoaXMudmVjNE9mZnNldD0wLHRoaXMuYmF0Y2hJZE9mZnNldD0wLHRoaXMuaW5kZXhPZmZzZXQ9MCx0aGlzLnZvbHVtZVN0YXJ0SW5kZXg9MH1mdW5jdGlvbiBhUih0LGUsbixvLHIpe2xldCBpPWEuc3VidHJhY3QobixlLFhCKSxzPWEuc3VidHJhY3QoZSx0LGNSKTtyZXR1cm4gYS5ub3JtYWxpemUoaSxpKSxhLm5vcm1hbGl6ZShzLHMpLGEuZG90KGkscyk8a0ImJihzPWEubXVsdGlwbHlCeVNjYWxhcihzLC0xLGNSKSksYS5hZGQoaSxzLHIpLGEuZXF1YWxzKHIsYS5aRVJPKSYmKHI9YS5zdWJ0cmFjdCh0LGUpKSxhLmNyb3NzKHIsbyxyKSxhLmNyb3NzKG8scixyKSxhLm5vcm1hbGl6ZShyLHIpLHJ9ZnVuY3Rpb24gcjQodCxlKXtsZXQgbj1uZXcgVWludDE2QXJyYXkodC5wb3NpdGlvbnMpLG89bmV3IFVpbnQxNkFycmF5KHQud2lkdGhzKSxyPW5ldyBVaW50MzJBcnJheSh0LmNvdW50cyksaT1uZXcgVWludDE2QXJyYXkodC5iYXRjaElkcykscz1KQixmPXQ0LHU9ZTQsYz1uZXcgRmxvYXQ2NEFycmF5KHQucGFja2VkQnVmZmVyKSxsPTAscD1jW2wrK10sZD1jW2wrK107TnQudW5wYWNrKGMsbCxzKSxsKz1OdC5wYWNrZWRMZW5ndGgsJC51bnBhY2soYyxsLGYpLGwrPSQucGFja2VkTGVuZ3RoLGEudW5wYWNrKGMsbCx1KTtsZXQgbSxfPW4ubGVuZ3RoLzMsZz1uLnN1YmFycmF5KDAsXyksYj1uLnN1YmFycmF5KF8sMipfKSx3PW4uc3ViYXJyYXkoMipfLDMqXyk7bm4uemlnWmFnRGVsdGFEZWNvZGUoZyxiLHcpLFdCKGcsYix3LHIpO2xldCBPPXIubGVuZ3RoLEU9MDtmb3IobT0wO208TzttKyspe2xldCBVPXJbbV07RSs9VS0xfWxldCBUPW5ldyBsUihFKSxDPWpCKGcsYix3LHMscCxkLGYsdSk7Xz1nLmxlbmd0aDtsZXQgTj1uZXcgRmxvYXQzMkFycmF5KF8qMyk7Zm9yKG09MDttPF87KyttKU5bbSozXT1DW20qM10tdS54LE5bbSozKzFdPUNbbSozKzFdLXUueSxOW20qMysyXT1DW20qMysyXS11Lno7bGV0IEk9MCxEPTA7Zm9yKG09MDttPE87bSsrKXtsZXQgVT1yW21dLTEsQT1vW21dKi41LFM9aVttXSxQPUk7Zm9yKGxldCBCPTA7QjxVO0IrKyl7bGV0IGo9YS51bnBhY2soTixJLG40KSxIPWEudW5wYWNrKE4sSSszLG80KSxrPXdbRF0sSz13W0QrMV07az1NLmxlcnAocCxkLGsvb3UpLEs9TS5sZXJwKHAsZCxLL291KSxEKys7bGV0IFg9RGQsUj1GZDtpZihCPT09MCl7bGV0IG90PVArVSozLGN0PWEudW5wYWNrKE4sb3QsRGQpO2lmKGEuZXF1YWxzKGN0LGopKWEudW5wYWNrKE4sb3QtMyxYKTtlbHNle2xldCBwdD1hLnN1YnRyYWN0KGosSCxEZCk7WD1hLmFkZChwdCxqLERkKX19ZWxzZSBhLnVucGFjayhOLEktMyxYKTtpZihCPT09VS0xKXtsZXQgb3Q9YS51bnBhY2soTixQLEZkKTtpZihhLmVxdWFscyhvdCxIKSlhLnVucGFjayhOLFArMyxSKTtlbHNle2xldCBjdD1hLnN1YnRyYWN0KEgsaixGZCk7Uj1hLmFkZChjdCxILEZkKX19ZWxzZSBhLnVucGFjayhOLEkrNixSKTtULmFkZFZvbHVtZShYLGosSCxSLGssSyxBLFMsdSxmKSxJKz0zfUkrPTMsRCsrfWxldCB2PVQuaW5kaWNlcztlLnB1c2goVC5zdGFydEVsbGlwc29pZE5vcm1hbHMuYnVmZmVyKSxlLnB1c2goVC5lbmRFbGxpcHNvaWROb3JtYWxzLmJ1ZmZlciksZS5wdXNoKFQuc3RhcnRQb3NpdGlvbkFuZEhlaWdodHMuYnVmZmVyKSxlLnB1c2goVC5zdGFydEZhY2VOb3JtYWxBbmRWZXJ0ZXhDb3JuZXJJZHMuYnVmZmVyKSxlLnB1c2goVC5lbmRQb3NpdGlvbkFuZEhlaWdodHMuYnVmZmVyKSxlLnB1c2goVC5lbmRGYWNlTm9ybWFsQW5kSGFsZldpZHRocy5idWZmZXIpLGUucHVzaChULnZlcnRleEJhdGNoSWRzLmJ1ZmZlciksZS5wdXNoKHYuYnVmZmVyKTtsZXQgTD17aW5kZXhEYXRhdHlwZTp2LkJZVEVTX1BFUl9FTEVNRU5UPT09Mj9EdC5VTlNJR05FRF9TSE9SVDpEdC5VTlNJR05FRF9JTlQsc3RhcnRFbGxpcHNvaWROb3JtYWxzOlQuc3RhcnRFbGxpcHNvaWROb3JtYWxzLmJ1ZmZlcixlbmRFbGxpcHNvaWROb3JtYWxzOlQuZW5kRWxsaXBzb2lkTm9ybWFscy5idWZmZXIsc3RhcnRQb3NpdGlvbkFuZEhlaWdodHM6VC5zdGFydFBvc2l0aW9uQW5kSGVpZ2h0cy5idWZmZXIsc3RhcnRGYWNlTm9ybWFsQW5kVmVydGV4Q29ybmVySWRzOlQuc3RhcnRGYWNlTm9ybWFsQW5kVmVydGV4Q29ybmVySWRzLmJ1ZmZlcixlbmRQb3NpdGlvbkFuZEhlaWdodHM6VC5lbmRQb3NpdGlvbkFuZEhlaWdodHMuYnVmZmVyLGVuZEZhY2VOb3JtYWxBbmRIYWxmV2lkdGhzOlQuZW5kRmFjZU5vcm1hbEFuZEhhbGZXaWR0aHMuYnVmZmVyLHZlcnRleEJhdGNoSWRzOlQudmVydGV4QmF0Y2hJZHMuYnVmZmVyLGluZGljZXM6di5idWZmZXJ9O2lmKHQua2VlcERlY29kZWRQb3NpdGlvbnMpe2xldCBVPUhCKHIpO2UucHVzaChDLmJ1ZmZlcixVLmJ1ZmZlciksTD1fcihMLHtkZWNvZGVkUG9zaXRpb25zOkMuYnVmZmVyLGRlY29kZWRQb3NpdGlvbk9mZnNldHM6VS5idWZmZXJ9KX1yZXR1cm4gTH12YXIgb3Usa0IsR0IsekIscUIsS0IsY1IsWEIscFIsZlIsdVIsWUIsJEIsWkIsUUIsSkIsdDQsZTQsRGQsbjQsbzQsRmQsaTQsV3k9WigoKT0+e2FzKCk7RnQoKTtQZSgpO25wKCk7WnQoKTskZSgpO1d0KCk7d24oKTtzbygpO291PTMyNzY3LGtCPU1hdGguY29zKE0udG9SYWRpYW5zKDE1MCkpLEdCPW5ldyBhdCx6Qj1uZXcgYTtxQj1uZXcgYXQsS0I9bmV3IGF0O2NSPW5ldyBhLFhCPW5ldyBhO3BSPVswLDIsNiwwLDYsNCwwLDEsMywwLDMsMiwwLDQsNSwwLDUsMSw1LDMsMSw1LDcsMyw3LDUsNCw3LDQsNiw3LDYsMiw3LDIsM10sZlI9cFIubGVuZ3RoLHVSPW5ldyBhLFlCPW5ldyBhLCRCPW5ldyBhLFpCPW5ldyBhLFFCPW5ldyBhO2xSLnByb3RvdHlwZS5hZGRWb2x1bWU9ZnVuY3Rpb24odCxlLG4sbyxyLGkscyxmLHUsYyl7bGV0IGw9YS5hZGQoZSx1LHVSKSxwPWMuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGwsWUIpO2w9YS5hZGQobix1LHVSKTtsZXQgZD1jLmdlb2RldGljU3VyZmFjZU5vcm1hbChsLFpCKSxtPWFSKHQsZSxuLHAsJEIpLF89YVIobyxuLGUsZCxRQiksZz10aGlzLnN0YXJ0RWxsaXBzb2lkTm9ybWFscyxiPXRoaXMuZW5kRWxsaXBzb2lkTm9ybWFscyx3PXRoaXMuc3RhcnRQb3NpdGlvbkFuZEhlaWdodHMsTz10aGlzLnN0YXJ0RmFjZU5vcm1hbEFuZFZlcnRleENvcm5lcklkcyxFPXRoaXMuZW5kUG9zaXRpb25BbmRIZWlnaHRzLFQ9dGhpcy5lbmRGYWNlTm9ybWFsQW5kSGFsZldpZHRocyxDPXRoaXMudmVydGV4QmF0Y2hJZHMsTj10aGlzLmJhdGNoSWRPZmZzZXQsST10aGlzLnZlYzNPZmZzZXQsRD10aGlzLnZlYzRPZmZzZXQsdjtmb3Iodj0wO3Y8ODt2KyspYS5wYWNrKHAsZyxJKSxhLnBhY2soZCxiLEkpLGEucGFjayhlLHcsRCksd1tEKzNdPXIsYS5wYWNrKG4sRSxEKSxFW0QrM109aSxhLnBhY2sobSxPLEQpLE9bRCszXT12LGEucGFjayhfLFQsRCksVFtEKzNdPXMsQ1tOKytdPWYsSSs9MyxEKz00O3RoaXMuYmF0Y2hJZE9mZnNldD1OLHRoaXMudmVjM09mZnNldD1JLHRoaXMudmVjNE9mZnNldD1EO2xldCBMPXRoaXMuaW5kaWNlcyxVPXRoaXMudm9sdW1lU3RhcnRJbmRleCxBPXRoaXMuaW5kZXhPZmZzZXQ7Zm9yKHY9MDt2PGZSO3YrKylMW0Erdl09cFJbdl0rVTt0aGlzLnZvbHVtZVN0YXJ0SW5kZXgrPTgsdGhpcy5pbmRleE9mZnNldCs9ZlJ9O0pCPW5ldyBOdCx0ND1uZXcgJCxlND1uZXcgYSxEZD1uZXcgYSxuND1uZXcgYSxvND1uZXcgYSxGZD1uZXcgYTtpND1RZShyNCl9KTtmdW5jdGlvbiBzNCh0KXt0aGlzLm9mZnNldD10Lm9mZnNldCx0aGlzLmNvdW50PXQuY291bnQsdGhpcy5jb2xvcj10LmNvbG9yLHRoaXMuYmF0Y2hJZHM9dC5iYXRjaElkc312YXIgZFIsbVI9WigoKT0+e2RSPXM0fSk7dmFyIFh5PXt9O2RlKFh5LHtkZWZhdWx0OigpPT5iNH0pO2Z1bmN0aW9uIGw0KHQsZSl7bGV0IG49ZSpjNCxvPWEudW5wYWNrKHQsbixVZCk7bis9YS5wYWNrZWRMZW5ndGg7bGV0IHI9c3QudW5wYWNrKHQsbixDci5tb2RlbE1hdHJpeCk7c3QubXVsdGlwbHlCeVNjYWxlKHIsbyxyKTtsZXQgaT1Dci5ib3VuZGluZ1ZvbHVtZTtyZXR1cm4gYS5jbG9uZShhLlpFUk8saS5jZW50ZXIpLGkucmFkaXVzPU1hdGguc3FydCgzKSxDcn1mdW5jdGlvbiBwNCh0LGUpe2xldCBuPWUqYTQsbz10W24rK10scj10W24rK10saT1hLmZyb21FbGVtZW50cyhvLG8scixVZCkscz1zdC51bnBhY2sodCxuLENyLm1vZGVsTWF0cml4KTtzdC5tdWx0aXBseUJ5U2NhbGUocyxpLHMpO2xldCBmPUNyLmJvdW5kaW5nVm9sdW1lO3JldHVybiBhLmNsb25lKGEuWkVSTyxmLmNlbnRlciksZi5yYWRpdXM9TWF0aC5zcXJ0KDIpLENyfWZ1bmN0aW9uIGQ0KHQsZSl7bGV0IG49ZSpmNCxvPWEudW5wYWNrKHQsbixVZCk7bis9YS5wYWNrZWRMZW5ndGg7bGV0IHI9c3QudW5wYWNrKHQsbixDci5tb2RlbE1hdHJpeCk7c3QubXVsdGlwbHlCeVNjYWxlKHIsbyxyKTtsZXQgaT1Dci5ib3VuZGluZ1ZvbHVtZTtyZXR1cm4gYS5jbG9uZShhLlpFUk8saS5jZW50ZXIpLGkucmFkaXVzPTEsQ3J9ZnVuY3Rpb24gbTQodCxlKXtsZXQgbj1lKnU0LG89dFtuKytdLHI9YS51bnBhY2sodCxuLFVkKSxpPXN0LmZyb21UcmFuc2xhdGlvbihyLENyLm1vZGVsTWF0cml4KTtzdC5tdWx0aXBseUJ5VW5pZm9ybVNjYWxlKGksbyxpKTtsZXQgcz1Dci5ib3VuZGluZ1ZvbHVtZTtyZXR1cm4gYS5jbG9uZShhLlpFUk8scy5jZW50ZXIpLHMucmFkaXVzPTEsQ3J9ZnVuY3Rpb24gQmQodCxlLG4sbyxyKXtpZighaChlKSlyZXR1cm47bGV0IGk9bi5sZW5ndGgscz1vLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLGY9by5pbmRpY2VzLHU9dC5wb3NpdGlvbnMsYz10LnZlcnRleEJhdGNoSWRzLGw9dC5pbmRpY2VzLHA9dC5iYXRjaElkcyxkPXQuYmF0Y2hUYWJsZUNvbG9ycyxtPXQuYmF0Y2hlZEluZGljZXMsXz10LmluZGV4T2Zmc2V0cyxnPXQuaW5kZXhDb3VudHMsYj10LmJvdW5kaW5nVm9sdW1lcyx3PXQubW9kZWxNYXRyaXgsTz10LmNlbnRlcixFPXQucG9zaXRpb25PZmZzZXQsVD10LmJhdGNoSWRJbmRleCxDPXQuaW5kZXhPZmZzZXQsTj10LmJhdGNoZWRJbmRpY2VzT2Zmc2V0O2ZvcihsZXQgST0wO0k8aTsrK0kpe2xldCBEPXIoZSxJKSx2PUQubW9kZWxNYXRyaXg7c3QubXVsdGlwbHkodyx2LHYpO2xldCBMPW5bSV0sVT1zLmxlbmd0aDtmb3IobGV0IFA9MDtQPFU7UCs9Myl7bGV0IEI9YS51bnBhY2socyxQLGg0KTtzdC5tdWx0aXBseUJ5UG9pbnQodixCLEIpLGEuc3VidHJhY3QoQixPLEIpLGEucGFjayhCLHUsRSozK1ApLGNbVCsrXT1MfWxldCBBPWYubGVuZ3RoO2ZvcihsZXQgUD0wO1A8QTsrK1ApbFtDK1BdPWZbUF0rRTtsZXQgUz1JK047bVtTXT1uZXcgZFIoe29mZnNldDpDLGNvdW50OkEsY29sb3I6b2UuZnJvbVJnYmEoZFtMXSksYmF0Y2hJZHM6W0xdfSkscFtTXT1MLF9bU109QyxnW1NdPUEsYltTXT1BdC50cmFuc2Zvcm0oRC5ib3VuZGluZ1ZvbHVtZSx2KSxFKz1VLzMsQys9QX10LnBvc2l0aW9uT2Zmc2V0PUUsdC5iYXRjaElkSW5kZXg9VCx0LmluZGV4T2Zmc2V0PUMsdC5iYXRjaGVkSW5kaWNlc09mZnNldCs9aX1mdW5jdGlvbiBfNCh0KXtsZXQgZT1uZXcgRmxvYXQ2NEFycmF5KHQpLG49MDthLnVucGFjayhlLG4saFIpLG4rPWEucGFja2VkTGVuZ3RoLHN0LnVucGFjayhlLG4sX1IpfWZ1bmN0aW9uIHk0KHQpe2xldCBlPXQubGVuZ3RoLG49MDtmb3IobGV0IG89MDtvPGU7KytvKW4rPW9lLnBhY2tlZExlbmd0aCszK3Rbb10uYmF0Y2hJZHMubGVuZ3RoO3JldHVybiBufWZ1bmN0aW9uIGc0KHQsZSxuKXtsZXQgbz1uLmxlbmd0aCxyPTIrbypBdC5wYWNrZWRMZW5ndGgrMSt5NChlKSxpPW5ldyBGbG9hdDY0QXJyYXkocikscz0wO2lbcysrXT10LGlbcysrXT1vO2ZvcihsZXQgdT0wO3U8bzsrK3UpQXQucGFjayhuW3VdLGkscykscys9QXQucGFja2VkTGVuZ3RoO2xldCBmPWUubGVuZ3RoO2lbcysrXT1mO2ZvcihsZXQgdT0wO3U8ZjsrK3Upe2xldCBjPWVbdV07b2UucGFjayhjLmNvbG9yLGkscykscys9b2UucGFja2VkTGVuZ3RoLGlbcysrXT1jLm9mZnNldCxpW3MrK109Yy5jb3VudDtsZXQgbD1jLmJhdGNoSWRzLHA9bC5sZW5ndGg7aVtzKytdPXA7Zm9yKGxldCBkPTA7ZDxwOysrZClpW3MrK109bFtkXX1yZXR1cm4gaX1mdW5jdGlvbiBBNCh0LGUpe2xldCBuPWgodC5ib3hlcyk/bmV3IEZsb2F0MzJBcnJheSh0LmJveGVzKTp2b2lkIDAsbz1oKHQuYm94QmF0Y2hJZHMpP25ldyBVaW50MTZBcnJheSh0LmJveEJhdGNoSWRzKTp2b2lkIDAscj1oKHQuY3lsaW5kZXJzKT9uZXcgRmxvYXQzMkFycmF5KHQuY3lsaW5kZXJzKTp2b2lkIDAsaT1oKHQuY3lsaW5kZXJCYXRjaElkcyk/bmV3IFVpbnQxNkFycmF5KHQuY3lsaW5kZXJCYXRjaElkcyk6dm9pZCAwLHM9aCh0LmVsbGlwc29pZHMpP25ldyBGbG9hdDMyQXJyYXkodC5lbGxpcHNvaWRzKTp2b2lkIDAsZj1oKHQuZWxsaXBzb2lkQmF0Y2hJZHMpP25ldyBVaW50MTZBcnJheSh0LmVsbGlwc29pZEJhdGNoSWRzKTp2b2lkIDAsdT1oKHQuc3BoZXJlcyk/bmV3IEZsb2F0MzJBcnJheSh0LnNwaGVyZXMpOnZvaWQgMCxjPWgodC5zcGhlcmVCYXRjaElkcyk/bmV3IFVpbnQxNkFycmF5KHQuc3BoZXJlQmF0Y2hJZHMpOnZvaWQgMCxsPWgobik/by5sZW5ndGg6MCxwPWgocik/aS5sZW5ndGg6MCxkPWgocyk/Zi5sZW5ndGg6MCxtPWgodSk/Yy5sZW5ndGg6MCxfPVNmLmdldFVuaXRCb3goKSxnPWpmLmdldFVuaXRDeWxpbmRlcigpLGI9Y3IuZ2V0VW5pdEVsbGlwc29pZCgpLHc9Xy5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyxPPWcuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMsRT1iLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLFQ9dy5sZW5ndGgqbDtUKz1PLmxlbmd0aCpwLFQrPUUubGVuZ3RoKihkK20pO2xldCBDPV8uaW5kaWNlcyxOPWcuaW5kaWNlcyxJPWIuaW5kaWNlcyxEPUMubGVuZ3RoKmw7RCs9Ti5sZW5ndGgqcCxEKz1JLmxlbmd0aCooZCttKTtsZXQgdj1uZXcgRmxvYXQzMkFycmF5KFQpLEw9bmV3IFVpbnQxNkFycmF5KFQvMyksVT1EdC5jcmVhdGVUeXBlZEFycmF5KFQvMyxEKSxBPWwrcCtkK20sUz1uZXcgVWludDE2QXJyYXkoQSksUD1uZXcgQXJyYXkoQSksQj1uZXcgVWludDMyQXJyYXkoQSksaj1uZXcgVWludDMyQXJyYXkoQSksSD1uZXcgQXJyYXkoQSk7XzQodC5wYWNrZWRCdWZmZXIpO2xldCBrPXtiYXRjaFRhYmxlQ29sb3JzOm5ldyBVaW50MzJBcnJheSh0LmJhdGNoVGFibGVDb2xvcnMpLHBvc2l0aW9uczp2LHZlcnRleEJhdGNoSWRzOkwsaW5kaWNlczpVLGJhdGNoSWRzOlMsYmF0Y2hlZEluZGljZXM6UCxpbmRleE9mZnNldHM6QixpbmRleENvdW50czpqLGJvdW5kaW5nVm9sdW1lczpILHBvc2l0aW9uT2Zmc2V0OjAsYmF0Y2hJZEluZGV4OjAsaW5kZXhPZmZzZXQ6MCxiYXRjaGVkSW5kaWNlc09mZnNldDowLG1vZGVsTWF0cml4Ol9SLGNlbnRlcjpoUn07QmQoayxuLG8sXyxsNCksQmQoayxyLGksZyxwNCksQmQoayxzLGYsYixkNCksQmQoayx1LGMsYixtNCk7bGV0IEs9ZzQoVS5CWVRFU19QRVJfRUxFTUVOVCxQLEgpO3JldHVybiBlLnB1c2godi5idWZmZXIsTC5idWZmZXIsVS5idWZmZXIpLGUucHVzaChTLmJ1ZmZlcixCLmJ1ZmZlcixqLmJ1ZmZlciksZS5wdXNoKEsuYnVmZmVyKSx7cG9zaXRpb25zOnYuYnVmZmVyLHZlcnRleEJhdGNoSWRzOkwuYnVmZmVyLGluZGljZXM6VS5idWZmZXIsaW5kZXhPZmZzZXRzOkIuYnVmZmVyLGluZGV4Q291bnRzOmouYnVmZmVyLGJhdGNoSWRzOlMuYnVmZmVyLHBhY2tlZEJ1ZmZlcjpLLmJ1ZmZlcn19dmFyIFVkLGM0LGE0LGY0LHU0LENyLGg0LGhSLF9SLGI0LFl5PVooKCk9PntNZSgpO2kwKCk7RnQoKTtQYSgpO3VfKCk7ZnQoKTt5ZCgpOyRlKCk7Qm4oKTttUigpO3NvKCk7VWQ9bmV3IGEsYzQ9c3QucGFja2VkTGVuZ3RoK2EucGFja2VkTGVuZ3RoLGE0PXN0LnBhY2tlZExlbmd0aCsyLGY0PXN0LnBhY2tlZExlbmd0aCthLnBhY2tlZExlbmd0aCx1ND1hLnBhY2tlZExlbmd0aCsxLENyPXttb2RlbE1hdHJpeDpuZXcgc3QsYm91bmRpbmdWb2x1bWU6bmV3IEF0fTtoND1uZXcgYTtoUj1uZXcgYSxfUj1uZXcgc3Q7YjQ9UWUoQTQpfSk7dmFyIFp5PXt9O2RlKFp5LHtkZWZhdWx0OigpPT5SNH0pO2Z1bmN0aW9uIE80KHQpe3Q9bmV3IEZsb2F0NjRBcnJheSh0KTtsZXQgZT0wO1ZkLm1pbj10W2UrK10sVmQubWF4PXRbZSsrXSxOdC51bnBhY2sodCxlLHlSKSxlKz1OdC5wYWNrZWRMZW5ndGgsJC51bnBhY2sodCxlLGdSKX1mdW5jdGlvbiBFNCh0LGUpe2xldCBuPW5ldyBVaW50MTZBcnJheSh0LnBvc2l0aW9ucyk7TzQodC5wYWNrZWRCdWZmZXIpO2xldCBvPXlSLHI9Z1IsaT1WZC5taW4scz1WZC5tYXgsZj1uLmxlbmd0aC8zLHU9bi5zdWJhcnJheSgwLGYpLGM9bi5zdWJhcnJheShmLDIqZiksbD1uLnN1YmFycmF5KDIqZiwzKmYpO25uLnppZ1phZ0RlbHRhRGVjb2RlKHUsYyxsKTtsZXQgcD1uZXcgRmxvYXQ2NEFycmF5KG4ubGVuZ3RoKTtmb3IobGV0IGQ9MDtkPGY7KytkKXtsZXQgbT11W2RdLF89Y1tkXSxnPWxbZF0sYj1NLmxlcnAoby53ZXN0LG8uZWFzdCxtLyR5KSx3PU0ubGVycChvLnNvdXRoLG8ubm9ydGgsXy8keSksTz1NLmxlcnAoaSxzLGcvJHkpLEU9YXQuZnJvbVJhZGlhbnMoYix3LE8sdzQpLFQ9ci5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihFLFQ0KTthLnBhY2soVCxwLGQqMyl9cmV0dXJuIGUucHVzaChwLmJ1ZmZlcikse3Bvc2l0aW9uczpwLmJ1ZmZlcn19dmFyICR5LHc0LFQ0LHlSLGdSLFZkLFI0LFF5PVooKCk9PnthcygpO0Z0KCk7UGUoKTtadCgpO1d0KCk7d24oKTtzbygpOyR5PTMyNzY3LHc0PW5ldyBhdCxUND1uZXcgYSx5Uj1uZXcgTnQsZ1I9bmV3ICQsVmQ9e21pbjp2b2lkIDAsbWF4OnZvaWQgMH07UjQ9UWUoRTQpfSk7dmFyIEp5PXt9O2RlKEp5LHtkZWZhdWx0OigpPT5ENH0pO2Z1bmN0aW9uIFM0KHQpe2xldCBlPW5ldyBGbG9hdDY0QXJyYXkodCksbj0wO0ZhLmluZGV4Qnl0ZXNQZXJFbGVtZW50PWVbbisrXSxGYS5taW49ZVtuKytdLEZhLm1heD1lW24rK10sYS51bnBhY2soZSxuLFRSKSxuKz1hLnBhY2tlZExlbmd0aCwkLnVucGFjayhlLG4sT1IpLG4rPSQucGFja2VkTGVuZ3RoLE50LnVucGFjayhlLG4sRVIpfWZ1bmN0aW9uIEM0KHQpe2xldCBlPXQubGVuZ3RoLG49MDtmb3IobGV0IG89MDtvPGU7KytvKW4rPW9lLnBhY2tlZExlbmd0aCszK3Rbb10uYmF0Y2hJZHMubGVuZ3RoO3JldHVybiBufWZ1bmN0aW9uIHg0KHQsZSxuKXtsZXQgbz1lLmxlbmd0aCxyPTIrbypTby5wYWNrZWRMZW5ndGgrMStDNChuKSxpPW5ldyBGbG9hdDY0QXJyYXkocikscz0wO2lbcysrXT10LGlbcysrXT1vO2ZvcihsZXQgdT0wO3U8bzsrK3UpU28ucGFjayhlW3VdLGkscykscys9U28ucGFja2VkTGVuZ3RoO2xldCBmPW4ubGVuZ3RoO2lbcysrXT1mO2ZvcihsZXQgdT0wO3U8ZjsrK3Upe2xldCBjPW5bdV07b2UucGFjayhjLmNvbG9yLGkscykscys9b2UucGFja2VkTGVuZ3RoLGlbcysrXT1jLm9mZnNldCxpW3MrK109Yy5jb3VudDtsZXQgbD1jLmJhdGNoSWRzLHA9bC5sZW5ndGg7aVtzKytdPXA7Zm9yKGxldCBkPTA7ZDxwOysrZClpW3MrK109bFtkXX1yZXR1cm4gaX1mdW5jdGlvbiBMNCh0LGUpe1M0KHQucGFja2VkQnVmZmVyKTtsZXQgbjtGYS5pbmRleEJ5dGVzUGVyRWxlbWVudD09PTI/bj1uZXcgVWludDE2QXJyYXkodC5pbmRpY2VzKTpuPW5ldyBVaW50MzJBcnJheSh0LmluZGljZXMpO2xldCByPW5ldyBVaW50MTZBcnJheSh0LnBvc2l0aW9ucyksaT1uZXcgVWludDMyQXJyYXkodC5jb3VudHMpLHM9bmV3IFVpbnQzMkFycmF5KHQuaW5kZXhDb3VudHMpLGY9bmV3IFVpbnQzMkFycmF5KHQuYmF0Y2hJZHMpLHU9bmV3IFVpbnQzMkFycmF5KHQuYmF0Y2hUYWJsZUNvbG9ycyksYz1uZXcgQXJyYXkoaS5sZW5ndGgpLGw9VFIscD1PUixkPUVSLG09RmEubWluLF89RmEubWF4LGc9dC5taW5pbXVtSGVpZ2h0cyxiPXQubWF4aW11bUhlaWdodHM7aChnKSYmaChiKSYmKGc9bmV3IEZsb2F0MzJBcnJheShnKSxiPW5ldyBGbG9hdDMyQXJyYXkoYikpO2xldCB3LE8sRSxUPXIubGVuZ3RoLzIsQz1yLnN1YmFycmF5KDAsVCksTj1yLnN1YmFycmF5KFQsMipUKTtubi56aWdaYWdEZWx0YURlY29kZShDLE4pO2xldCBJPW5ldyBGbG9hdDY0QXJyYXkoVCozKTtmb3Iodz0wO3c8VDsrK3cpe2xldCBydD1DW3ddLFB0PU5bd10sZ3Q9TS5sZXJwKGQud2VzdCxkLmVhc3QscnQvQVIpLEN0PU0ubGVycChkLnNvdXRoLGQubm9ydGgsUHQvQVIpLG10PWF0LmZyb21SYWRpYW5zKGd0LEN0LDAsd1IpLHV0PXAuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obXQsYlIpO2EucGFjayh1dCxJLHcqMyl9bGV0IEQ9aS5sZW5ndGgsdj1uZXcgQXJyYXkoRCksTD1uZXcgQXJyYXkoRCksVT0wLEE9MDtmb3Iodz0wO3c8RDsrK3cpdlt3XT1VLExbd109QSxVKz1pW3ddLEErPXNbd107bGV0IFM9bmV3IEZsb2F0MzJBcnJheShUKjMqMiksUD1uZXcgVWludDE2QXJyYXkoVCoyKSxCPW5ldyBVaW50MzJBcnJheShMLmxlbmd0aCksaj1uZXcgVWludDMyQXJyYXkocy5sZW5ndGgpLEg9W10saz17fTtmb3Iodz0wO3c8RDsrK3cpRT11W3ddLGgoa1tFXSk/KGtbRV0ucG9zaXRpb25MZW5ndGgrPWlbd10sa1tFXS5pbmRleExlbmd0aCs9c1t3XSxrW0VdLmJhdGNoSWRzLnB1c2godykpOmtbRV09e3Bvc2l0aW9uTGVuZ3RoOmlbd10saW5kZXhMZW5ndGg6c1t3XSxvZmZzZXQ6MCxpbmRleE9mZnNldDowLGJhdGNoSWRzOlt3XX07bGV0IEssWD0wLFI9MDtmb3IoRSBpbiBrKWlmKGsuaGFzT3duUHJvcGVydHkoRSkpe0s9a1tFXSxLLm9mZnNldD1YLEsuaW5kZXhPZmZzZXQ9UjtsZXQgcnQ9Sy5wb3NpdGlvbkxlbmd0aCoyLFB0PUsuaW5kZXhMZW5ndGgqMitLLnBvc2l0aW9uTGVuZ3RoKjY7WCs9cnQsUis9UHQsSy5pbmRleExlbmd0aD1QdH1sZXQgb3Q9W107Zm9yKEUgaW4gaylrLmhhc093blByb3BlcnR5KEUpJiYoSz1rW0VdLG90LnB1c2goe2NvbG9yOm9lLmZyb21SZ2JhKHBhcnNlSW50KEUpKSxvZmZzZXQ6Sy5pbmRleE9mZnNldCxjb3VudDpLLmluZGV4TGVuZ3RoLGJhdGNoSWRzOksuYmF0Y2hJZHN9KSk7Zm9yKHc9MDt3PEQ7Kyt3KXtFPXVbd10sSz1rW0VdO2xldCBydD1LLm9mZnNldCxQdD1ydCozLGd0PXJ0LEN0PXZbd10sbXQ9aVt3XSx1dD1mW3ddLHZ0PW0senQ9XztoKGcpJiZoKGIpJiYodnQ9Z1t3XSx6dD1iW3ddKTtsZXQgbWU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGNlPU51bWJlci5ORUdBVElWRV9JTkZJTklUWSxwZT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksdWU9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO2ZvcihPPTA7TzxtdDsrK08pe2xldCBnZT1hLnVucGFjayhJLEN0KjMrTyozLGJSKTtwLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UoZ2UsZ2UpO2xldCBFZT1wLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKGdlLHdSKSx1bj1FZS5sYXRpdHVkZSxrZT1FZS5sb25naXR1ZGU7bWU9TWF0aC5taW4odW4sbWUpLGNlPU1hdGgubWF4KHVuLGNlKSxwZT1NYXRoLm1pbihrZSxwZSksdWU9TWF0aC5tYXgoa2UsdWUpO2xldCBiZT1wLmdlb2RldGljU3VyZmFjZU5vcm1hbChnZSxQNCksbG49YS5tdWx0aXBseUJ5U2NhbGFyKGJlLHZ0LE00KSxwbj1hLmFkZChnZSxsbixONCk7bG49YS5tdWx0aXBseUJ5U2NhbGFyKGJlLHp0LGxuKTtsZXQgT249YS5hZGQoZ2UsbG4sSTQpO2Euc3VidHJhY3QoT24sbCxPbiksYS5zdWJ0cmFjdChwbixsLHBuKSxhLnBhY2soT24sUyxQdCksYS5wYWNrKHBuLFMsUHQrMyksUFtndF09dXQsUFtndCsxXT11dCxQdCs9NixndCs9Mn1kPXY0LGQud2VzdD1wZSxkLmVhc3Q9dWUsZC5zb3V0aD1tZSxkLm5vcnRoPWNlLGNbd109U28uZnJvbVJlY3RhbmdsZShkLG0sXyxwKTtsZXQgUXQ9Sy5pbmRleE9mZnNldCxKdD1MW3ddLHhlPXNbd107Zm9yKEJbd109UXQsTz0wO088eGU7Tys9Myl7bGV0IGdlPW5bSnQrT10tQ3QsRWU9bltKdCtPKzFdLUN0LHVuPW5bSnQrTysyXS1DdDtIW1F0KytdPWdlKjIrcnQsSFtRdCsrXT1FZSoyK3J0LEhbUXQrK109dW4qMitydCxIW1F0KytdPXVuKjIrMStydCxIW1F0KytdPUVlKjIrMStydCxIW1F0KytdPWdlKjIrMStydH1mb3IoTz0wO088bXQ7KytPKXtsZXQgZ2U9TyxFZT0oTysxKSVtdDtIW1F0KytdPWdlKjIrMStydCxIW1F0KytdPUVlKjIrcnQsSFtRdCsrXT1nZSoyK3J0LEhbUXQrK109Z2UqMisxK3J0LEhbUXQrK109RWUqMisxK3J0LEhbUXQrK109RWUqMitydH1LLm9mZnNldCs9bXQqMixLLmluZGV4T2Zmc2V0PVF0LGpbd109UXQtQlt3XX1IPUR0LmNyZWF0ZVR5cGVkQXJyYXkoUy5sZW5ndGgvMyxIKTtsZXQgY3Q9b3QubGVuZ3RoO2ZvcihsZXQgcnQ9MDtydDxjdDsrK3J0KXtsZXQgUHQ9b3RbcnRdLmJhdGNoSWRzLGd0PTAsQ3Q9UHQubGVuZ3RoO2ZvcihsZXQgbXQ9MDttdDxDdDsrK210KWd0Kz1qW1B0W210XV07b3RbcnRdLmNvdW50PWd0fWxldCBwdD1ILkJZVEVTX1BFUl9FTEVNRU5UPT09Mj9EdC5VTlNJR05FRF9TSE9SVDpEdC5VTlNJR05FRF9JTlQseXQ9eDQocHQsYyxvdCk7cmV0dXJuIGUucHVzaChTLmJ1ZmZlcixILmJ1ZmZlcixCLmJ1ZmZlcixqLmJ1ZmZlcixQLmJ1ZmZlcix5dC5idWZmZXIpLHtwb3NpdGlvbnM6Uy5idWZmZXIsaW5kaWNlczpILmJ1ZmZlcixpbmRleE9mZnNldHM6Qi5idWZmZXIsaW5kZXhDb3VudHM6ai5idWZmZXIsYmF0Y2hJZHM6UC5idWZmZXIscGFja2VkQnVmZmVyOnl0LmJ1ZmZlcn19dmFyIFRSLE9SLEVSLEZhLEFSLGJSLFA0LE00LE40LEk0LHdSLHY0LEQ0LHRnPVooKCk9PnthcygpO0Z0KCk7UGUoKTtQYSgpO2Z0KCk7WnQoKTskZSgpO1d0KCk7cGEoKTt3bigpO3NvKCk7VFI9bmV3IGEsT1I9bmV3ICQsRVI9bmV3IE50LEZhPXttaW46dm9pZCAwLG1heDp2b2lkIDAsaW5kZXhCeXRlc1BlckVsZW1lbnQ6dm9pZCAwfTtBUj0zMjc2NyxiUj1uZXcgYSxQND1uZXcgYSxNND1uZXcgYSxOND1uZXcgYSxJND1uZXcgYSx3Uj1uZXcgYXQsdjQ9bmV3IE50O0Q0PVFlKEw0KX0pO2Z1bmN0aW9uIFU0KHQsZSxuLG8scil7bGV0IGk9dC5sZW5ndGgvMyxzPXQuc3ViYXJyYXkoMCxpKSxmPXQuc3ViYXJyYXkoaSwyKmkpLHU9dC5zdWJhcnJheSgyKmksMyppKTtubi56aWdaYWdEZWx0YURlY29kZShzLGYsdSk7bGV0IGM9bmV3IEZsb2F0NjRBcnJheSh0Lmxlbmd0aCk7Zm9yKGxldCBsPTA7bDxpOysrbCl7bGV0IHA9c1tsXSxkPWZbbF0sbT11W2xdLF89TS5sZXJwKGUud2VzdCxlLmVhc3QscC9lZyksZz1NLmxlcnAoZS5zb3V0aCxlLm5vcnRoLGQvZWcpLGI9TS5sZXJwKG4sbyxtL2VnKSx3PWF0LmZyb21SYWRpYW5zKF8sZyxiLEY0KSxPPXIuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4odyxCNCk7YS5wYWNrKE8sYyxsKjMpfXJldHVybiBjfXZhciBlZyxGNCxCNCxSUixTUj1aKCgpPT57YXMoKTtGdCgpO1BlKCk7V3QoKTtlZz0zMjc2NyxGND1uZXcgYXQsQjQ9bmV3IGE7UlI9VTR9KTt2YXIgbmc9e307ZGUobmcse2RlZmF1bHQ6KCk9Pmo0fSk7ZnVuY3Rpb24gVjQodCl7dD1uZXcgRmxvYXQ2NEFycmF5KHQpO2xldCBlPTA7a2QubWluPXRbZSsrXSxrZC5tYXg9dFtlKytdLE50LnVucGFjayh0LGUsTlIpLGUrPU50LnBhY2tlZExlbmd0aCwkLnVucGFjayh0LGUsSVIpLGUrPSQucGFja2VkTGVuZ3RoLGEudW5wYWNrKHQsZSx2Uil9ZnVuY3Rpb24gazQodCl7bGV0IGU9dC5sZW5ndGgsbj1uZXcgVWludDMyQXJyYXkoZSsxKSxvPTA7Zm9yKGxldCByPTA7cjxlOysrciluW3JdPW8sbys9dFtyXTtyZXR1cm4gbltlXT1vLG59ZnVuY3Rpb24gejQodCxlKXtsZXQgbj1uZXcgVWludDE2QXJyYXkodC5wb3NpdGlvbnMpLG89bmV3IFVpbnQxNkFycmF5KHQud2lkdGhzKSxyPW5ldyBVaW50MzJBcnJheSh0LmNvdW50cyksaT1uZXcgVWludDE2QXJyYXkodC5iYXRjaElkcyk7VjQodC5wYWNrZWRCdWZmZXIpO2xldCBzPU5SLGY9SVIsdT12UixjPWtkLm1pbixsPWtkLm1heCxwPVJSKG4scyxjLGwsZiksZD1wLmxlbmd0aC8zLG09ZCo0LTQsXz1uZXcgRmxvYXQzMkFycmF5KG0qMyksZz1uZXcgRmxvYXQzMkFycmF5KG0qMyksYj1uZXcgRmxvYXQzMkFycmF5KG0qMyksdz1uZXcgRmxvYXQzMkFycmF5KG0qMiksTz1uZXcgVWludDE2QXJyYXkobSksRT0wLFQ9MCxDPTAsTixJPTAsRD1yLmxlbmd0aDtmb3IoTj0wO048RDsrK04pe2xldCBTPXJbTl0sUD1vW05dLEI9aVtOXTtmb3IobGV0IGo9MDtqPFM7KytqKXtsZXQgSDtpZihqPT09MCl7bGV0IG90PWEudW5wYWNrKHAsSSozLENSKSxjdD1hLnVucGFjayhwLChJKzEpKjMseFIpO0g9YS5zdWJ0cmFjdChvdCxjdCxQUiksYS5hZGQob3QsSCxIKX1lbHNlIEg9YS51bnBhY2socCwoSStqLTEpKjMsUFIpO2xldCBrPWEudW5wYWNrKHAsKEkraikqMyxHNCksSztpZihqPT09Uy0xKXtsZXQgb3Q9YS51bnBhY2socCwoSStTLTEpKjMsQ1IpLGN0PWEudW5wYWNrKHAsKEkrUy0yKSozLHhSKTtLPWEuc3VidHJhY3Qob3QsY3QsTVIpLGEuYWRkKG90LEssSyl9ZWxzZSBLPWEudW5wYWNrKHAsKEkraisxKSozLE1SKTthLnN1YnRyYWN0KEgsdSxIKSxhLnN1YnRyYWN0KGssdSxrKSxhLnN1YnRyYWN0KEssdSxLKTtsZXQgWD1qPT09MD8yOjAsUj1qPT09Uy0xPzI6NDtmb3IobGV0IG90PVg7b3Q8UjsrK290KXthLnBhY2soayxfLEUpLGEucGFjayhILGcsRSksYS5wYWNrKEssYixFKSxFKz0zO2xldCBjdD1vdC0yPDA/LTE6MTt3W1QrK109Mioob3QlMiktMSx3W1QrK109Y3QqUCxPW0MrK109Qn19SSs9U31sZXQgdj1EdC5jcmVhdGVUeXBlZEFycmF5KG0sZCo2LTYpLEw9MCxVPTA7Zm9yKEQ9ZC0xLE49MDtOPEQ7KytOKXZbVSsrXT1MLHZbVSsrXT1MKzIsdltVKytdPUwrMSx2W1UrK109TCsxLHZbVSsrXT1MKzIsdltVKytdPUwrMyxMKz00O2UucHVzaChfLmJ1ZmZlcixnLmJ1ZmZlcixiLmJ1ZmZlciksZS5wdXNoKHcuYnVmZmVyLE8uYnVmZmVyLHYuYnVmZmVyKTtsZXQgQT17aW5kZXhEYXRhdHlwZTp2LkJZVEVTX1BFUl9FTEVNRU5UPT09Mj9EdC5VTlNJR05FRF9TSE9SVDpEdC5VTlNJR05FRF9JTlQsY3VycmVudFBvc2l0aW9uczpfLmJ1ZmZlcixwcmV2aW91c1Bvc2l0aW9uczpnLmJ1ZmZlcixuZXh0UG9zaXRpb25zOmIuYnVmZmVyLGV4cGFuZEFuZFdpZHRoOncuYnVmZmVyLGJhdGNoSWRzOk8uYnVmZmVyLGluZGljZXM6di5idWZmZXJ9O2lmKHQua2VlcERlY29kZWRQb3NpdGlvbnMpe2xldCBTPWs0KHIpO2UucHVzaChwLmJ1ZmZlcixTLmJ1ZmZlciksQT1fcihBLHtkZWNvZGVkUG9zaXRpb25zOnAuYnVmZmVyLGRlY29kZWRQb3NpdGlvbk9mZnNldHM6Uy5idWZmZXJ9KX1yZXR1cm4gQX12YXIgTlIsSVIsdlIsa2QsQ1IseFIsUFIsRzQsTVIsajQsb2c9WigoKT0+e0Z0KCk7bnAoKTtTUigpO1p0KCk7JGUoKTt3bigpO3NvKCk7TlI9bmV3IE50LElSPW5ldyAkLHZSPW5ldyBhLGtkPXttaW46dm9pZCAwLG1heDp2b2lkIDB9O0NSPW5ldyBhLHhSPW5ldyBhLFBSPW5ldyBhLEc0PW5ldyBhLE1SPW5ldyBhO2o0PVFlKHo0KX0pO2Z1bmN0aW9uIGhpKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJlbGxpcHNvaWQiLHQpLHRoaXMuX2VsbGlwc29pZD10LHRoaXMuX2NhbWVyYVBvc2l0aW9uPW5ldyBhLHRoaXMuX2NhbWVyYVBvc2l0aW9uSW5TY2FsZWRTcGFjZT1uZXcgYSx0aGlzLl9kaXN0YW5jZVRvTGltYkluU2NhbGVkU3BhY2VTcXVhcmVkPTAsaChlKSYmKHRoaXMuY2FtZXJhUG9zaXRpb249ZSl9ZnVuY3Rpb24gRlIodCxlLG4pe2lmKGgoZSkmJmU8MCYmdC5taW5pbXVtUmFkaXVzPi1lKXtsZXQgbz1hLmZyb21FbGVtZW50cyh0LnJhZGlpLngrZSx0LnJhZGlpLnkrZSx0LnJhZGlpLnorZSxLNCk7dD0kLmZyb21DYXJ0ZXNpYW4zKG8sbil9cmV0dXJuIHR9ZnVuY3Rpb24gQlIodCxlLG4sbyl7eS50eXBlT2Yub2JqZWN0KCJkaXJlY3Rpb25Ub1BvaW50IixlKSx5LmRlZmluZWQoInBvc2l0aW9ucyIsbiksaChvKXx8KG89bmV3IGEpO2xldCByPUdSKHQsZSksaT0wO2ZvcihsZXQgcz0wLGY9bi5sZW5ndGg7czxmOysrcyl7bGV0IHU9bltzXSxjPVZSKHQsdSxyKTtpZihjPDApcmV0dXJuO2k9TWF0aC5tYXgoaSxjKX1yZXR1cm4ga1IocixpLG8pfWZ1bmN0aW9uIFVSKHQsZSxuLG8scixpKXt5LnR5cGVPZi5vYmplY3QoImRpcmVjdGlvblRvUG9pbnQiLGUpLHkuZGVmaW5lZCgidmVydGljZXMiLG4pLHkudHlwZU9mLm51bWJlcigic3RyaWRlIixvKSxoKGkpfHwoaT1uZXcgYSksbz14KG8sMykscj14KHIsYS5aRVJPKTtsZXQgcz1HUih0LGUpLGY9MDtmb3IobGV0IHU9MCxjPW4ubGVuZ3RoO3U8Yzt1Kz1vKXtHZC54PW5bdV0rci54LEdkLnk9blt1KzFdK3IueSxHZC56PW5bdSsyXStyLno7bGV0IGw9VlIodCxHZCxzKTtpZihsPDApcmV0dXJuO2Y9TWF0aC5tYXgoZixsKX1yZXR1cm4ga1IocyxmLGkpfWZ1bmN0aW9uIGlnKHQsZSxuKXtsZXQgbz1lLHI9bixpPWEuc3VidHJhY3QodCxvLExSKSxzPS1hLmRvdChpLG8pO3JldHVybiEocjwwP3M+MDpzPnImJnMqcy9hLm1hZ25pdHVkZVNxdWFyZWQoaSk+cil9ZnVuY3Rpb24gVlIodCxlLG4pe2xldCBvPXQudHJhbnNmb3JtUG9zaXRpb25Ub1NjYWxlZFNwYWNlKGUsVzQpLHI9YS5tYWduaXR1ZGVTcXVhcmVkKG8pLGk9TWF0aC5zcXJ0KHIpLHM9YS5kaXZpZGVCeVNjYWxhcihvLGksWDQpO3I9TWF0aC5tYXgoMSxyKSxpPU1hdGgubWF4KDEsaSk7bGV0IGY9YS5kb3QocyxuKSx1PWEubWFnbml0dWRlKGEuY3Jvc3MocyxuLHMpKSxjPTEvaSxsPU1hdGguc3FydChyLTEpKmM7cmV0dXJuIDEvKGYqYy11KmwpfWZ1bmN0aW9uIGtSKHQsZSxuKXtpZighKGU8PTB8fGU9PT0xLzB8fGUhPT1lKSlyZXR1cm4gYS5tdWx0aXBseUJ5U2NhbGFyKHQsZSxuKX1mdW5jdGlvbiBHUih0LGUpe3JldHVybiBhLmVxdWFscyhlLGEuWkVSTyk/ZToodC50cmFuc2Zvcm1Qb3NpdGlvblRvU2NhbGVkU3BhY2UoZSxyZyksYS5ub3JtYWxpemUocmcscmcpKX12YXIgTFIsSDQsRFIscTQsSzQsR2QsVzQsWDQscmcseHMscnU9WigoKT0+e01lKCk7RnQoKTtYdCgpO0l0KCk7ZnQoKTtadCgpO3duKCk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaGkucHJvdG90eXBlLHtlbGxpcHNvaWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbGxpcHNvaWR9fSxjYW1lcmFQb3NpdGlvbjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NhbWVyYVBvc2l0aW9ufSxzZXQ6ZnVuY3Rpb24odCl7bGV0IG49dGhpcy5fZWxsaXBzb2lkLnRyYW5zZm9ybVBvc2l0aW9uVG9TY2FsZWRTcGFjZSh0LHRoaXMuX2NhbWVyYVBvc2l0aW9uSW5TY2FsZWRTcGFjZSksbz1hLm1hZ25pdHVkZVNxdWFyZWQobiktMTthLmNsb25lKHQsdGhpcy5fY2FtZXJhUG9zaXRpb24pLHRoaXMuX2NhbWVyYVBvc2l0aW9uSW5TY2FsZWRTcGFjZT1uLHRoaXMuX2Rpc3RhbmNlVG9MaW1iSW5TY2FsZWRTcGFjZVNxdWFyZWQ9b319fSk7TFI9bmV3IGE7aGkucHJvdG90eXBlLmlzUG9pbnRWaXNpYmxlPWZ1bmN0aW9uKHQpe2xldCBuPXRoaXMuX2VsbGlwc29pZC50cmFuc2Zvcm1Qb3NpdGlvblRvU2NhbGVkU3BhY2UodCxMUik7cmV0dXJuIGlnKG4sdGhpcy5fY2FtZXJhUG9zaXRpb25JblNjYWxlZFNwYWNlLHRoaXMuX2Rpc3RhbmNlVG9MaW1iSW5TY2FsZWRTcGFjZVNxdWFyZWQpfTtoaS5wcm90b3R5cGUuaXNTY2FsZWRTcGFjZVBvaW50VmlzaWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gaWcodCx0aGlzLl9jYW1lcmFQb3NpdGlvbkluU2NhbGVkU3BhY2UsdGhpcy5fZGlzdGFuY2VUb0xpbWJJblNjYWxlZFNwYWNlU3F1YXJlZCl9O0g0PW5ldyBhO2hpLnByb3RvdHlwZS5pc1NjYWxlZFNwYWNlUG9pbnRWaXNpYmxlUG9zc2libHlVbmRlckVsbGlwc29pZD1mdW5jdGlvbih0LGUpe2xldCBuPXRoaXMuX2VsbGlwc29pZCxvLHI7cmV0dXJuIGgoZSkmJmU8MCYmbi5taW5pbXVtUmFkaXVzPi1lPyhyPUg0LHIueD10aGlzLl9jYW1lcmFQb3NpdGlvbi54LyhuLnJhZGlpLngrZSksci55PXRoaXMuX2NhbWVyYVBvc2l0aW9uLnkvKG4ucmFkaWkueStlKSxyLno9dGhpcy5fY2FtZXJhUG9zaXRpb24uei8obi5yYWRpaS56K2UpLG89ci54KnIueCtyLnkqci55K3IueipyLnotMSk6KHI9dGhpcy5fY2FtZXJhUG9zaXRpb25JblNjYWxlZFNwYWNlLG89dGhpcy5fZGlzdGFuY2VUb0xpbWJJblNjYWxlZFNwYWNlU3F1YXJlZCksaWcodCxyLG8pfTtoaS5wcm90b3R5cGUuY29tcHV0ZUhvcml6b25DdWxsaW5nUG9pbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBCUih0aGlzLl9lbGxpcHNvaWQsdCxlLG4pfTtEUj0kLmNsb25lKCQuVU5JVF9TUEhFUkUpO2hpLnByb3RvdHlwZS5jb21wdXRlSG9yaXpvbkN1bGxpbmdQb2ludFBvc3NpYmx5VW5kZXJFbGxpcHNvaWQ9ZnVuY3Rpb24odCxlLG4sbyl7bGV0IHI9RlIodGhpcy5fZWxsaXBzb2lkLG4sRFIpO3JldHVybiBCUihyLHQsZSxvKX07aGkucHJvdG90eXBlLmNvbXB1dGVIb3Jpem9uQ3VsbGluZ1BvaW50RnJvbVZlcnRpY2VzPWZ1bmN0aW9uKHQsZSxuLG8scil7cmV0dXJuIFVSKHRoaXMuX2VsbGlwc29pZCx0LGUsbixvLHIpfTtoaS5wcm90b3R5cGUuY29tcHV0ZUhvcml6b25DdWxsaW5nUG9pbnRGcm9tVmVydGljZXNQb3NzaWJseVVuZGVyRWxsaXBzb2lkPWZ1bmN0aW9uKHQsZSxuLG8scixpKXtsZXQgcz1GUih0aGlzLl9lbGxpcHNvaWQscixEUik7cmV0dXJuIFVSKHMsdCxlLG4sbyxpKX07cTQ9W107aGkucHJvdG90eXBlLmNvbXB1dGVIb3Jpem9uQ3VsbGluZ1BvaW50RnJvbVJlY3RhbmdsZT1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpO2xldCBvPU50LnN1YnNhbXBsZSh0LGUsMCxxNCkscj1BdC5mcm9tUG9pbnRzKG8pO2lmKCEoYS5tYWduaXR1ZGUoci5jZW50ZXIpPC4xKmUubWluaW11bVJhZGl1cykpcmV0dXJuIHRoaXMuY29tcHV0ZUhvcml6b25DdWxsaW5nUG9pbnQoci5jZW50ZXIsbyxuKX07SzQ9bmV3IGE7R2Q9bmV3IGE7VzQ9bmV3IGEsWDQ9bmV3IGE7cmc9bmV3IGE7eHM9aGl9KTt2YXIgemQsWTQselIsalI9WigoKT0+e0Z0KCk7UGUoKTtIdCgpO2Z0KCk7emQ9e307emQuZ2V0SGVpZ2h0PWZ1bmN0aW9uKHQsZSxuKXtpZighTnVtYmVyLmlzRmluaXRlKGUpKXRocm93IG5ldyBGKCJzY2FsZSBtdXN0IGJlIGEgZmluaXRlIG51bWJlci4iKTtpZighTnVtYmVyLmlzRmluaXRlKG4pKXRocm93IG5ldyBGKCJyZWxhdGl2ZUhlaWdodCBtdXN0IGJlIGEgZmluaXRlIG51bWJlci4iKTtyZXR1cm4odC1uKSplK259O1k0PW5ldyBhdDt6ZC5nZXRQb3NpdGlvbj1mdW5jdGlvbih0LGUsbixvLHIpe2xldCBpPWUuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWModCxZNCk7aWYoIWgoaSkpcmV0dXJuIGEuY2xvbmUodCxyKTtsZXQgcz16ZC5nZXRIZWlnaHQoaS5oZWlnaHQsbixvKTtyZXR1cm4gYS5mcm9tUmFkaWFucyhpLmxvbmdpdHVkZSxpLmxhdGl0dWRlLHMsZSxyKX07elI9emR9KTt2YXIgJDQseHIsSFI9WigoKT0+eyQ0PXtOT05FOjAsQklUUzEyOjF9LHhyPU9iamVjdC5mcmVlemUoJDQpfSk7ZnVuY3Rpb24gTW8odCxlLG4sbyxyLGkscyxmLHUsYyl7bGV0IGw9eHIuTk9ORSxwLGQ7aWYoaChlKSYmaChuKSYmaChvKSYmaChyKSl7bGV0IG09ZS5taW5pbXVtLF89ZS5tYXhpbXVtLGc9YS5zdWJ0cmFjdChfLG0sWjQpLGI9by1uO01hdGgubWF4KGEubWF4aW11bUNvbXBvbmVudChnKSxiKTxKNC0xP2w9eHIuQklUUzEyOmw9eHIuTk9ORSxwPXN0LmludmVyc2VUcmFuc2Zvcm1hdGlvbihyLG5ldyBzdCk7bGV0IE89YS5uZWdhdGUobSxUYyk7c3QubXVsdGlwbHkoc3QuZnJvbVRyYW5zbGF0aW9uKE8samQpLHAscCk7bGV0IEU9VGM7RS54PTEvZy54LEUueT0xL2cueSxFLno9MS9nLnosc3QubXVsdGlwbHkoc3QuZnJvbVNjYWxlKEUsamQpLHAscCksZD1zdC5jbG9uZShyKSxzdC5zZXRUcmFuc2xhdGlvbihkLGEuWkVSTyxkKSxyPXN0LmNsb25lKHIsbmV3IHN0KTtsZXQgVD1zdC5mcm9tVHJhbnNsYXRpb24obSxqZCksQz1zdC5mcm9tU2NhbGUoZyxRNCksTj1zdC5tdWx0aXBseShULEMsamQpO3N0Lm11bHRpcGx5KHIsTixyKSxzdC5tdWx0aXBseShkLE4sZCl9dGhpcy5xdWFudGl6YXRpb249bCx0aGlzLm1pbmltdW1IZWlnaHQ9bix0aGlzLm1heGltdW1IZWlnaHQ9byx0aGlzLmNlbnRlcj1hLmNsb25lKHQpLHRoaXMudG9TY2FsZWRFTlU9cCx0aGlzLmZyb21TY2FsZWRFTlU9cix0aGlzLm1hdHJpeD1kLHRoaXMuaGFzVmVydGV4Tm9ybWFscz1pLHRoaXMuaGFzV2ViTWVyY2F0b3JUPXgocywhMSksdGhpcy5oYXNHZW9kZXRpY1N1cmZhY2VOb3JtYWxzPXgoZiwhMSksdGhpcy5leGFnZ2VyYXRpb249eCh1LDEpLHRoaXMuZXhhZ2dlcmF0aW9uUmVsYXRpdmVIZWlnaHQ9eChjLDApLHRoaXMuc3RyaWRlPTAsdGhpcy5fb2Zmc2V0R2VvZGV0aWNTdXJmYWNlTm9ybWFsPTAsdGhpcy5fb2Zmc2V0VmVydGV4Tm9ybWFsPTAsdGhpcy5fY2FsY3VsYXRlU3RyaWRlQW5kT2Zmc2V0cygpfXZhciBUYyxaNCxQcixqZCxRNCxKNCx0VSxxUixIZCxxZCxQcyxpdT1aKCgpPT57YXMoKTtGZSgpO0Z0KCk7TGUoKTtJdCgpO2Z0KCk7V3QoKTtCbigpO2pSKCk7SFIoKTtUYz1uZXcgYSxaND1uZXcgYSxQcj1uZXcgdHQsamQ9bmV3IHN0LFE0PW5ldyBzdCxKND1NYXRoLnBvdygyLDEyKTtNby5wcm90b3R5cGUuZW5jb2RlPWZ1bmN0aW9uKHQsZSxuLG8scixpLHMsZil7bGV0IHU9by54LGM9by55O2lmKHRoaXMucXVhbnRpemF0aW9uPT09eHIuQklUUzEyKXtuPXN0Lm11bHRpcGx5QnlQb2ludCh0aGlzLnRvU2NhbGVkRU5VLG4sVGMpLG4ueD1NLmNsYW1wKG4ueCwwLDEpLG4ueT1NLmNsYW1wKG4ueSwwLDEpLG4uej1NLmNsYW1wKG4ueiwwLDEpO2xldCBsPXRoaXMubWF4aW11bUhlaWdodC10aGlzLm1pbmltdW1IZWlnaHQscD1NLmNsYW1wKChyLXRoaXMubWluaW11bUhlaWdodCkvbCwwLDEpO3R0LmZyb21FbGVtZW50cyhuLngsbi55LFByKTtsZXQgZD1ubi5jb21wcmVzc1RleHR1cmVDb29yZGluYXRlcyhQcik7dHQuZnJvbUVsZW1lbnRzKG4ueixwLFByKTtsZXQgbT1ubi5jb21wcmVzc1RleHR1cmVDb29yZGluYXRlcyhQcik7dHQuZnJvbUVsZW1lbnRzKHUsYyxQcik7bGV0IF89bm4uY29tcHJlc3NUZXh0dXJlQ29vcmRpbmF0ZXMoUHIpO2lmKHRbZSsrXT1kLHRbZSsrXT1tLHRbZSsrXT1fLHRoaXMuaGFzV2ViTWVyY2F0b3JUKXt0dC5mcm9tRWxlbWVudHMocywwLFByKTtsZXQgZz1ubi5jb21wcmVzc1RleHR1cmVDb29yZGluYXRlcyhQcik7dFtlKytdPWd9fWVsc2UgYS5zdWJ0cmFjdChuLHRoaXMuY2VudGVyLFRjKSx0W2UrK109VGMueCx0W2UrK109VGMueSx0W2UrK109VGMueix0W2UrK109cix0W2UrK109dSx0W2UrK109Yyx0aGlzLmhhc1dlYk1lcmNhdG9yVCYmKHRbZSsrXT1zKTtyZXR1cm4gdGhpcy5oYXNWZXJ0ZXhOb3JtYWxzJiYodFtlKytdPW5uLm9jdFBhY2tGbG9hdChpKSksdGhpcy5oYXNHZW9kZXRpY1N1cmZhY2VOb3JtYWxzJiYodFtlKytdPWYueCx0W2UrK109Zi55LHRbZSsrXT1mLnopLGV9O3RVPW5ldyBhLHFSPW5ldyBhO01vLnByb3RvdHlwZS5hZGRHZW9kZXRpY1N1cmZhY2VOb3JtYWxzPWZ1bmN0aW9uKHQsZSxuKXtpZih0aGlzLmhhc0dlb2RldGljU3VyZmFjZU5vcm1hbHMpcmV0dXJuO2xldCBvPXRoaXMuc3RyaWRlLHI9dC5sZW5ndGgvbzt0aGlzLmhhc0dlb2RldGljU3VyZmFjZU5vcm1hbHM9ITAsdGhpcy5fY2FsY3VsYXRlU3RyaWRlQW5kT2Zmc2V0cygpO2xldCBpPXRoaXMuc3RyaWRlO2ZvcihsZXQgcz0wO3M8cjtzKyspe2ZvcihsZXQgbD0wO2w8bztsKyspe2xldCBwPXMqbytsLGQ9cyppK2w7ZVtkXT10W3BdfWxldCBmPXRoaXMuZGVjb2RlUG9zaXRpb24oZSxzLHRVKSx1PW4uZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGYscVIpLGM9cyppK3RoaXMuX29mZnNldEdlb2RldGljU3VyZmFjZU5vcm1hbDtlW2NdPXUueCxlW2MrMV09dS55LGVbYysyXT11Lnp9fTtNby5wcm90b3R5cGUucmVtb3ZlR2VvZGV0aWNTdXJmYWNlTm9ybWFscz1mdW5jdGlvbih0LGUpe2lmKCF0aGlzLmhhc0dlb2RldGljU3VyZmFjZU5vcm1hbHMpcmV0dXJuO2xldCBuPXRoaXMuc3RyaWRlLG89dC5sZW5ndGgvbjt0aGlzLmhhc0dlb2RldGljU3VyZmFjZU5vcm1hbHM9ITEsdGhpcy5fY2FsY3VsYXRlU3RyaWRlQW5kT2Zmc2V0cygpO2xldCByPXRoaXMuc3RyaWRlO2ZvcihsZXQgaT0wO2k8bztpKyspZm9yKGxldCBzPTA7czxyO3MrKyl7bGV0IGY9aSpuK3MsdT1pKnIrcztlW3VdPXRbZl19fTtNby5wcm90b3R5cGUuZGVjb2RlUG9zaXRpb249ZnVuY3Rpb24odCxlLG4pe2lmKGgobil8fChuPW5ldyBhKSxlKj10aGlzLnN0cmlkZSx0aGlzLnF1YW50aXphdGlvbj09PXhyLkJJVFMxMil7bGV0IG89bm4uZGVjb21wcmVzc1RleHR1cmVDb29yZGluYXRlcyh0W2VdLFByKTtuLng9by54LG4ueT1vLnk7bGV0IHI9bm4uZGVjb21wcmVzc1RleHR1cmVDb29yZGluYXRlcyh0W2UrMV0sUHIpO3JldHVybiBuLno9ci54LHN0Lm11bHRpcGx5QnlQb2ludCh0aGlzLmZyb21TY2FsZWRFTlUsbixuKX1yZXR1cm4gbi54PXRbZV0sbi55PXRbZSsxXSxuLno9dFtlKzJdLGEuYWRkKG4sdGhpcy5jZW50ZXIsbil9O01vLnByb3RvdHlwZS5nZXRFeGFnZ2VyYXRlZFBvc2l0aW9uPWZ1bmN0aW9uKHQsZSxuKXtuPXRoaXMuZGVjb2RlUG9zaXRpb24odCxlLG4pO2xldCBvPXRoaXMuZXhhZ2dlcmF0aW9uLHI9dGhpcy5leGFnZ2VyYXRpb25SZWxhdGl2ZUhlaWdodDtpZihvIT09MSYmdGhpcy5oYXNHZW9kZXRpY1N1cmZhY2VOb3JtYWxzKXtsZXQgcz10aGlzLmRlY29kZUdlb2RldGljU3VyZmFjZU5vcm1hbCh0LGUscVIpLGY9dGhpcy5kZWNvZGVIZWlnaHQodCxlKSx1PXpSLmdldEhlaWdodChmLG8sciktZjtuLngrPXMueCp1LG4ueSs9cy55KnUsbi56Kz1zLnoqdX1yZXR1cm4gbn07TW8ucHJvdG90eXBlLmRlY29kZVRleHR1cmVDb29yZGluYXRlcz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgobil8fChuPW5ldyB0dCksZSo9dGhpcy5zdHJpZGUsdGhpcy5xdWFudGl6YXRpb249PT14ci5CSVRTMTI/bm4uZGVjb21wcmVzc1RleHR1cmVDb29yZGluYXRlcyh0W2UrMl0sbik6dHQuZnJvbUVsZW1lbnRzKHRbZSs0XSx0W2UrNV0sbil9O01vLnByb3RvdHlwZS5kZWNvZGVIZWlnaHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZSo9dGhpcy5zdHJpZGUsdGhpcy5xdWFudGl6YXRpb249PT14ci5CSVRTMTI/bm4uZGVjb21wcmVzc1RleHR1cmVDb29yZGluYXRlcyh0W2UrMV0sUHIpLnkqKHRoaXMubWF4aW11bUhlaWdodC10aGlzLm1pbmltdW1IZWlnaHQpK3RoaXMubWluaW11bUhlaWdodDp0W2UrM119O01vLnByb3RvdHlwZS5kZWNvZGVXZWJNZXJjYXRvclQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZSo9dGhpcy5zdHJpZGUsdGhpcy5xdWFudGl6YXRpb249PT14ci5CSVRTMTI/bm4uZGVjb21wcmVzc1RleHR1cmVDb29yZGluYXRlcyh0W2UrM10sUHIpLng6dFtlKzZdfTtNby5wcm90b3R5cGUuZ2V0T2N0RW5jb2RlZE5vcm1hbD1mdW5jdGlvbih0LGUsbil7ZT1lKnRoaXMuc3RyaWRlK3RoaXMuX29mZnNldFZlcnRleE5vcm1hbDtsZXQgbz10W2VdLzI1NixyPU1hdGguZmxvb3IobyksaT0oby1yKSoyNTY7cmV0dXJuIHR0LmZyb21FbGVtZW50cyhyLGksbil9O01vLnByb3RvdHlwZS5kZWNvZGVHZW9kZXRpY1N1cmZhY2VOb3JtYWw9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBlPWUqdGhpcy5zdHJpZGUrdGhpcy5fb2Zmc2V0R2VvZGV0aWNTdXJmYWNlTm9ybWFsLG4ueD10W2VdLG4ueT10W2UrMV0sbi56PXRbZSsyXSxufTtNby5wcm90b3R5cGUuX2NhbGN1bGF0ZVN0cmlkZUFuZE9mZnNldHM9ZnVuY3Rpb24oKXtsZXQgdD0wO3N3aXRjaCh0aGlzLnF1YW50aXphdGlvbil7Y2FzZSB4ci5CSVRTMTI6dCs9MzticmVhaztkZWZhdWx0OnQrPTZ9dGhpcy5oYXNXZWJNZXJjYXRvclQmJih0Kz0xKSx0aGlzLmhhc1ZlcnRleE5vcm1hbHMmJih0aGlzLl9vZmZzZXRWZXJ0ZXhOb3JtYWw9dCx0Kz0xKSx0aGlzLmhhc0dlb2RldGljU3VyZmFjZU5vcm1hbHMmJih0aGlzLl9vZmZzZXRHZW9kZXRpY1N1cmZhY2VOb3JtYWw9dCx0Kz0zKSx0aGlzLnN0cmlkZT10fTtIZD17cG9zaXRpb24zREFuZEhlaWdodDowLHRleHR1cmVDb29yZEFuZEVuY29kZWROb3JtYWxzOjEsZ2VvZGV0aWNTdXJmYWNlTm9ybWFsOjJ9LHFkPXtjb21wcmVzc2VkMDowLGNvbXByZXNzZWQxOjEsZ2VvZGV0aWNTdXJmYWNlTm9ybWFsOjJ9O01vLnByb3RvdHlwZS5nZXRBdHRyaWJ1dGVzPWZ1bmN0aW9uKHQpe2xldCBlPW50LkZMT0FULG49bnQuZ2V0U2l6ZUluQnl0ZXMoZSksbz10aGlzLnN0cmlkZSpuLHI9MCxpPVtdO2Z1bmN0aW9uIHMoZix1KXtpLnB1c2goe2luZGV4OmYsdmVydGV4QnVmZmVyOnQsY29tcG9uZW50RGF0YXR5cGU6ZSxjb21wb25lbnRzUGVyQXR0cmlidXRlOnUsb2Zmc2V0SW5CeXRlczpyLHN0cmlkZUluQnl0ZXM6b30pLHIrPXUqbn1pZih0aGlzLnF1YW50aXphdGlvbj09PXhyLk5PTkUpe3MoSGQucG9zaXRpb24zREFuZEhlaWdodCw0KTtsZXQgZj0yO2YrPXRoaXMuaGFzV2ViTWVyY2F0b3JUPzE6MCxmKz10aGlzLmhhc1ZlcnRleE5vcm1hbHM/MTowLHMoSGQudGV4dHVyZUNvb3JkQW5kRW5jb2RlZE5vcm1hbHMsZiksdGhpcy5oYXNHZW9kZXRpY1N1cmZhY2VOb3JtYWxzJiZzKEhkLmdlb2RldGljU3VyZmFjZU5vcm1hbCwzKX1lbHNle2xldCBmPXRoaXMuaGFzV2ViTWVyY2F0b3JUfHx0aGlzLmhhc1ZlcnRleE5vcm1hbHMsdT10aGlzLmhhc1dlYk1lcmNhdG9yVCYmdGhpcy5oYXNWZXJ0ZXhOb3JtYWxzO3MocWQuY29tcHJlc3NlZDAsZj80OjMpLHUmJnMocWQuY29tcHJlc3NlZDEsMSksdGhpcy5oYXNHZW9kZXRpY1N1cmZhY2VOb3JtYWxzJiZzKHFkLmdlb2RldGljU3VyZmFjZU5vcm1hbCwzKX1yZXR1cm4gaX07TW8ucHJvdG90eXBlLmdldEF0dHJpYnV0ZUxvY2F0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnF1YW50aXphdGlvbj09PXhyLk5PTkU/SGQ6cWR9O01vLmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYoaCh0KSlyZXR1cm4gaChlKXx8KGU9bmV3IE1vKSxlLnF1YW50aXphdGlvbj10LnF1YW50aXphdGlvbixlLm1pbmltdW1IZWlnaHQ9dC5taW5pbXVtSGVpZ2h0LGUubWF4aW11bUhlaWdodD10Lm1heGltdW1IZWlnaHQsZS5jZW50ZXI9YS5jbG9uZSh0LmNlbnRlciksZS50b1NjYWxlZEVOVT1zdC5jbG9uZSh0LnRvU2NhbGVkRU5VKSxlLmZyb21TY2FsZWRFTlU9c3QuY2xvbmUodC5mcm9tU2NhbGVkRU5VKSxlLm1hdHJpeD1zdC5jbG9uZSh0Lm1hdHJpeCksZS5oYXNWZXJ0ZXhOb3JtYWxzPXQuaGFzVmVydGV4Tm9ybWFscyxlLmhhc1dlYk1lcmNhdG9yVD10Lmhhc1dlYk1lcmNhdG9yVCxlLmhhc0dlb2RldGljU3VyZmFjZU5vcm1hbHM9dC5oYXNHZW9kZXRpY1N1cmZhY2VOb3JtYWxzLGUuZXhhZ2dlcmF0aW9uPXQuZXhhZ2dlcmF0aW9uLGUuZXhhZ2dlcmF0aW9uUmVsYXRpdmVIZWlnaHQ9dC5leGFnZ2VyYXRpb25SZWxhdGl2ZUhlaWdodCxlLl9jYWxjdWxhdGVTdHJpZGVBbmRPZmZzZXRzKCksZX07UHM9TW99KTt2YXIgY2c9e307ZGUoY2cse2RlZmF1bHQ6KCk9PmFVfSk7ZnVuY3Rpb24gc3UodCxlLG4pe249eChuLE0pO2xldCBvPXQubGVuZ3RoO2ZvcihsZXQgcj0wO3I8bzsrK3IpaWYobi5lcXVhbHNFcHNpbG9uKHRbcl0sZSxNLkVQU0lMT04xMikpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gb1UodCxlKXt0LmVsbGlwc29pZD0kLmNsb25lKHQuZWxsaXBzb2lkKSx0LnJlY3RhbmdsZT1OdC5jbG9uZSh0LnJlY3RhbmdsZSk7bGV0IG49Y1UodC5idWZmZXIsdC5yZWxhdGl2ZVRvQ2VudGVyLHQuZWxsaXBzb2lkLHQucmVjdGFuZ2xlLHQubmF0aXZlUmVjdGFuZ2xlLHQuZXhhZ2dlcmF0aW9uLHQuZXhhZ2dlcmF0aW9uUmVsYXRpdmVIZWlnaHQsdC5za2lydEhlaWdodCx0LmluY2x1ZGVXZWJNZXJjYXRvclQsdC5uZWdhdGl2ZUFsdGl0dWRlRXhwb25lbnRCaWFzLHQubmVnYXRpdmVFbGV2YXRpb25UaHJlc2hvbGQpLG89bi52ZXJ0aWNlcztlLnB1c2goby5idWZmZXIpO2xldCByPW4uaW5kaWNlcztyZXR1cm4gZS5wdXNoKHIuYnVmZmVyKSx7dmVydGljZXM6by5idWZmZXIsaW5kaWNlczpyLmJ1ZmZlcixudW1iZXJPZkF0dHJpYnV0ZXM6bi5lbmNvZGluZy5zdHJpZGUsbWluaW11bUhlaWdodDpuLm1pbmltdW1IZWlnaHQsbWF4aW11bUhlaWdodDpuLm1heGltdW1IZWlnaHQsYm91bmRpbmdTcGhlcmUzRDpuLmJvdW5kaW5nU3BoZXJlM0Qsb3JpZW50ZWRCb3VuZGluZ0JveDpuLm9yaWVudGVkQm91bmRpbmdCb3gsb2NjbHVkZWVQb2ludEluU2NhbGVkU3BhY2U6bi5vY2NsdWRlZVBvaW50SW5TY2FsZWRTcGFjZSxlbmNvZGluZzpuLmVuY29kaW5nLHZlcnRleENvdW50V2l0aG91dFNraXJ0czpuLnZlcnRleENvdW50V2l0aG91dFNraXJ0cyxpbmRleENvdW50V2l0aG91dFNraXJ0czpuLmluZGV4Q291bnRXaXRob3V0U2tpcnRzLHdlc3RJbmRpY2VzU291dGhUb05vcnRoOm4ud2VzdEluZGljZXNTb3V0aFRvTm9ydGgsc291dGhJbmRpY2VzRWFzdFRvV2VzdDpuLnNvdXRoSW5kaWNlc0Vhc3RUb1dlc3QsZWFzdEluZGljZXNOb3J0aFRvU291dGg6bi5lYXN0SW5kaWNlc05vcnRoVG9Tb3V0aCxub3J0aEluZGljZXNXZXN0VG9FYXN0Om4ubm9ydGhJbmRpY2VzV2VzdFRvRWFzdH19ZnVuY3Rpb24gY1UodCxlLG4sbyxyLGkscyxmLHUsYyxsKXtsZXQgcCxkLG0sXyxnLGI7aChvKT8ocD1vLndlc3QsZD1vLnNvdXRoLG09by5lYXN0LF89by5ub3J0aCxnPW8ud2lkdGgsYj1vLmhlaWdodCk6KHA9TS50b1JhZGlhbnMoci53ZXN0KSxkPU0udG9SYWRpYW5zKHIuc291dGgpLG09TS50b1JhZGlhbnMoci5lYXN0KSxfPU0udG9SYWRpYW5zKHIubm9ydGgpLGc9TS50b1JhZGlhbnMoby53aWR0aCksYj1NLnRvUmFkaWFucyhvLmhlaWdodCkpO2xldCB3PVtkLF9dLE89W3AsbV0sRT1Zby5lYXN0Tm9ydGhVcFRvRml4ZWRGcmFtZShlLG4pLFQ9c3QuaW52ZXJzZVRyYW5zZm9ybWF0aW9uKEUsc1UpLEMsTjt1JiYoQz1lby5nZW9kZXRpY0xhdGl0dWRlVG9NZXJjYXRvckFuZ2xlKGQpLE49MS8oZW8uZ2VvZGV0aWNMYXRpdHVkZVRvTWVyY2F0b3JBbmdsZShfKS1DKSk7bGV0IEQ9aSE9PTEsdj1uZXcgRGF0YVZpZXcodCksTD1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksVT1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksQT1yVTtBLng9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLEEueT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksQS56PU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtsZXQgUz1pVTtTLng9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLFMueT1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksUy56PU51bWJlci5ORUdBVElWRV9JTkZJTklUWTtsZXQgUD0wLEI9MCxqPTAsSCxrO2ZvcihrPTA7azw0Oysrayl7bGV0IHJlPVA7SD12LmdldFVpbnQzMihyZSwhMCkscmUrPXNnO2xldCAkdD1NLnRvUmFkaWFucyh2LmdldEZsb2F0NjQocmUsITApKjE4MCk7cmUrPU9jLHN1KE8sJHQpPT09LTEmJk8ucHVzaCgkdCk7bGV0IEdlPU0udG9SYWRpYW5zKHYuZ2V0RmxvYXQ2NChyZSwhMCkqMTgwKTtyZSs9T2Msc3UodyxHZSk9PT0tMSYmdy5wdXNoKEdlKSxyZSs9MipPYztsZXQgZG49di5nZXRJbnQzMihyZSwhMCk7cmUrPUtkLEIrPWRuLGRuPXYuZ2V0SW50MzIocmUsITApLGorPWRuKjMsUCs9SCtzZ31sZXQgSz1bXSxYPVtdLFI9bmV3IEFycmF5KEIpLG90PW5ldyBBcnJheShCKSxjdD1uZXcgQXJyYXkoQikscHQ9dT9uZXcgQXJyYXkoQik6W10seXQ9RD9uZXcgQXJyYXkoQik6W10scnQ9bmV3IEFycmF5KGopLFB0PVtdLGd0PVtdLEN0PVtdLG10PVtdLHV0PTAsdnQ9MDtmb3IoUD0wLGs9MDtrPDQ7KytrKXtIPXYuZ2V0VWludDMyKFAsITApLFArPXNnO2xldCByZT1QLCR0PU0udG9SYWRpYW5zKHYuZ2V0RmxvYXQ2NChQLCEwKSoxODApO1ArPU9jO2xldCBHZT1NLnRvUmFkaWFucyh2LmdldEZsb2F0NjQoUCwhMCkqMTgwKTtQKz1PYztsZXQgZG49TS50b1JhZGlhbnModi5nZXRGbG9hdDY0KFAsITApKjE4MCksc249ZG4qLjU7UCs9T2M7bGV0IG1uPU0udG9SYWRpYW5zKHYuZ2V0RmxvYXQ2NChQLCEwKSoxODApLGZvPW1uKi41O1ArPU9jO2xldCBIbj12LmdldEludDMyKFAsITApO1ArPUtkO2xldCBaZT12LmdldEludDMyKFAsITApO1ArPUtkLFArPUtkO2xldCBjbj1uZXcgQXJyYXkoSG4pO2ZvcihsZXQgaG49MDtobjxIbjsrK2huKXtsZXQgdW89JHQrdi5nZXRVaW50OChQKyspKmRuO05vLmxvbmdpdHVkZT11bztsZXQgcW49R2Urdi5nZXRVaW50OChQKyspKm1uO05vLmxhdGl0dWRlPXFuO2xldCBLbj12LmdldEZsb2F0MzIoUCwhMCk7aWYoUCs9blUsS24hPT0wJiZLbjxsJiYoS24qPS1NYXRoLnBvdygyLGMpKSxLbio9NjM3MTAxMCxOby5oZWlnaHQ9S24sc3UoTyx1bykhPT0tMXx8c3UodyxxbikhPT0tMSl7bGV0IExuPXN1KEssTm8sYXQpO2lmKExuPT09LTEpSy5wdXNoKGF0LmNsb25lKE5vKSksWC5wdXNoKHV0KTtlbHNle2NuW2huXT1YW0xuXTtjb250aW51ZX19Y25baG5dPXV0LE1hdGguYWJzKHVvLXApPHNuP1B0LnB1c2goe2luZGV4OnV0LGNhcnRvZ3JhcGhpYzphdC5jbG9uZShObyl9KTpNYXRoLmFicyh1by1tKTxzbj9DdC5wdXNoKHtpbmRleDp1dCxjYXJ0b2dyYXBoaWM6YXQuY2xvbmUoTm8pfSk6TWF0aC5hYnMocW4tZCk8Zm8/Z3QucHVzaCh7aW5kZXg6dXQsY2FydG9ncmFwaGljOmF0LmNsb25lKE5vKX0pOk1hdGguYWJzKHFuLV8pPGZvJiZtdC5wdXNoKHtpbmRleDp1dCxjYXJ0b2dyYXBoaWM6YXQuY2xvbmUoTm8pfSksTD1NYXRoLm1pbihLbixMKSxVPU1hdGgubWF4KEtuLFUpLGN0W3V0XT1LbjtsZXQgbG89bi5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihObyk7aWYoUlt1dF09bG8sdSYmKHB0W3V0XT0oZW8uZ2VvZGV0aWNMYXRpdHVkZVRvTWVyY2F0b3JBbmdsZShxbiktQykqTiksRCl7bGV0IExuPW4uZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGxvKTt5dFt1dF09TG59c3QubXVsdGlwbHlCeVBvaW50KFQsbG8sQmEpLGEubWluaW11bUJ5Q29tcG9uZW50KEJhLEEsQSksYS5tYXhpbXVtQnlDb21wb25lbnQoQmEsUyxTKTtsZXQgemU9KHVvLXApLyhtLXApO3plPU0uY2xhbXAoemUsMCwxKTtsZXQgSWU9KHFuLWQpLyhfLWQpO0llPU0uY2xhbXAoSWUsMCwxKSxvdFt1dF09bmV3IHR0KHplLEllKSwrK3V0fWxldCBLZT1aZSozO2ZvcihsZXQgaG49MDtobjxLZTsrK2huLCsrdnQpcnRbdnRdPWNuW3YuZ2V0VWludDE2KFAsITApXSxQKz1lVTtpZihIIT09UC1yZSl0aHJvdyBuZXcgQWUoIkludmFsaWQgdGVycmFpbiB0aWxlLiIpfVIubGVuZ3RoPXV0LG90Lmxlbmd0aD11dCxjdC5sZW5ndGg9dXQsdSYmKHB0Lmxlbmd0aD11dCksRCYmKHl0Lmxlbmd0aD11dCk7bGV0IHp0PXV0LG1lPXZ0LGNlPXtoTWluOkwsbGFzdEJvcmRlclBvaW50OnZvaWQgMCxza2lydEhlaWdodDpmLHRvRU5VOlQsZWxsaXBzb2lkOm4sbWluaW11bTpBLG1heGltdW06U307UHQuc29ydChmdW5jdGlvbihyZSwkdCl7cmV0dXJuICR0LmNhcnRvZ3JhcGhpYy5sYXRpdHVkZS1yZS5jYXJ0b2dyYXBoaWMubGF0aXR1ZGV9KSxndC5zb3J0KGZ1bmN0aW9uKHJlLCR0KXtyZXR1cm4gcmUuY2FydG9ncmFwaGljLmxvbmdpdHVkZS0kdC5jYXJ0b2dyYXBoaWMubG9uZ2l0dWRlfSksQ3Quc29ydChmdW5jdGlvbihyZSwkdCl7cmV0dXJuIHJlLmNhcnRvZ3JhcGhpYy5sYXRpdHVkZS0kdC5jYXJ0b2dyYXBoaWMubGF0aXR1ZGV9KSxtdC5zb3J0KGZ1bmN0aW9uKHJlLCR0KXtyZXR1cm4gJHQuY2FydG9ncmFwaGljLmxvbmdpdHVkZS1yZS5jYXJ0b2dyYXBoaWMubG9uZ2l0dWRlfSk7bGV0IHBlPTFlLTU7aWYoV2QoUixjdCxvdCxwdCx5dCxydCxjZSxQdCwtcGUqZywhMCwtcGUqYiksV2QoUixjdCxvdCxwdCx5dCxydCxjZSxndCwtcGUqYiwhMSksV2QoUixjdCxvdCxwdCx5dCxydCxjZSxDdCxwZSpnLCEwLHBlKmIpLFdkKFIsY3Qsb3QscHQseXQscnQsY2UsbXQscGUqYiwhMSksUHQubGVuZ3RoPjAmJm10Lmxlbmd0aD4wKXtsZXQgcmU9UHRbMF0uaW5kZXgsJHQ9enQsR2U9bXRbbXQubGVuZ3RoLTFdLmluZGV4LGRuPVIubGVuZ3RoLTE7cnQucHVzaChHZSxkbiwkdCwkdCxyZSxHZSl9Qj1SLmxlbmd0aDtsZXQgdWU9QXQuZnJvbVBvaW50cyhSKSxRdDtoKG8pJiYoUXQ9U28uZnJvbVJlY3RhbmdsZShvLEwsVSxuKSk7bGV0IHhlPW5ldyB4cyhuKS5jb21wdXRlSG9yaXpvbkN1bGxpbmdQb2ludFBvc3NpYmx5VW5kZXJFbGxpcHNvaWQoZSxSLEwpLGdlPW5ldyBEaShBLFMsZSksRWU9bmV3IFBzKGUsZ2UsY2UuaE1pbixVLEUsITEsdSxELGkscyksdW49bmV3IEZsb2F0MzJBcnJheShCKkVlLnN0cmlkZSksa2U9MDtmb3IobGV0IHJlPTA7cmU8QjsrK3JlKWtlPUVlLmVuY29kZSh1bixrZSxSW3JlXSxvdFtyZV0sY3RbcmVdLHZvaWQgMCxwdFtyZV0seXRbcmVdKTtsZXQgYmU9UHQubWFwKGZ1bmN0aW9uKHJlKXtyZXR1cm4gcmUuaW5kZXh9KS5yZXZlcnNlKCksbG49Z3QubWFwKGZ1bmN0aW9uKHJlKXtyZXR1cm4gcmUuaW5kZXh9KS5yZXZlcnNlKCkscG49Q3QubWFwKGZ1bmN0aW9uKHJlKXtyZXR1cm4gcmUuaW5kZXh9KS5yZXZlcnNlKCksT249bXQubWFwKGZ1bmN0aW9uKHJlKXtyZXR1cm4gcmUuaW5kZXh9KS5yZXZlcnNlKCk7cmV0dXJuIGxuLnVuc2hpZnQocG5bcG4ubGVuZ3RoLTFdKSxsbi5wdXNoKGJlWzBdKSxPbi51bnNoaWZ0KGJlW2JlLmxlbmd0aC0xXSksT24ucHVzaChwblswXSkse3ZlcnRpY2VzOnVuLGluZGljZXM6bmV3IFVpbnQxNkFycmF5KHJ0KSxtYXhpbXVtSGVpZ2h0OlUsbWluaW11bUhlaWdodDpMLGVuY29kaW5nOkVlLGJvdW5kaW5nU3BoZXJlM0Q6dWUsb3JpZW50ZWRCb3VuZGluZ0JveDpRdCxvY2NsdWRlZVBvaW50SW5TY2FsZWRTcGFjZTp4ZSx2ZXJ0ZXhDb3VudFdpdGhvdXRTa2lydHM6enQsaW5kZXhDb3VudFdpdGhvdXRTa2lydHM6bWUsd2VzdEluZGljZXNTb3V0aFRvTm9ydGg6YmUsc291dGhJbmRpY2VzRWFzdFRvV2VzdDpsbixlYXN0SW5kaWNlc05vcnRoVG9Tb3V0aDpwbixub3J0aEluZGljZXNXZXN0VG9FYXN0Ok9ufX1mdW5jdGlvbiBXZCh0LGUsbixvLHIsaSxzLGYsdSxjLGwpe2xldCBwPWYubGVuZ3RoO2ZvcihsZXQgZD0wO2Q8cDsrK2Qpe2xldCBtPWZbZF0sXz1tLmNhcnRvZ3JhcGhpYyxnPW0uaW5kZXgsYj10Lmxlbmd0aCx3PV8ubG9uZ2l0dWRlLE89Xy5sYXRpdHVkZTtPPU0uY2xhbXAoTywtTS5QSV9PVkVSX1RXTyxNLlBJX09WRVJfVFdPKTtsZXQgRT1fLmhlaWdodC1zLnNraXJ0SGVpZ2h0O3MuaE1pbj1NYXRoLm1pbihzLmhNaW4sRSksYXQuZnJvbVJhZGlhbnModyxPLEUsTm8pLGMmJihOby5sb25naXR1ZGUrPXUpLGM/ZD09PXAtMT9Oby5sYXRpdHVkZSs9bDpkPT09MCYmKE5vLmxhdGl0dWRlLT1sKTpOby5sYXRpdHVkZSs9dTtsZXQgVD1zLmVsbGlwc29pZC5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihObyk7dC5wdXNoKFQpLGUucHVzaChFKSxuLnB1c2godHQuY2xvbmUobltnXSkpLG8ubGVuZ3RoPjAmJm8ucHVzaChvW2ddKSxyLmxlbmd0aD4wJiZyLnB1c2gocltnXSksc3QubXVsdGlwbHlCeVBvaW50KHMudG9FTlUsVCxCYSk7bGV0IEM9cy5taW5pbXVtLE49cy5tYXhpbXVtO2EubWluaW11bUJ5Q29tcG9uZW50KEJhLEMsQyksYS5tYXhpbXVtQnlDb21wb25lbnQoQmEsTixOKTtsZXQgST1zLmxhc3RCb3JkZXJQb2ludDtpZihoKEkpKXtsZXQgRD1JLmluZGV4O2kucHVzaChELGItMSxiLGIsZyxEKX1zLmxhc3RCb3JkZXJQb2ludD1tfX12YXIgZVUsS2Qsc2csblUsT2MsTm8sQmEsclUsaVUsc1UsYVUsYWc9WigoKT0+e3hmKCk7TWUoKTtGZSgpO0Z0KCk7UGUoKTtJdCgpO2Z0KCk7WnQoKTtydSgpO1d0KCk7Qm4oKTtwYSgpO3duKCk7SnIoKTtpdSgpO2NzKCk7aWMoKTtzbygpO2VVPVVpbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULEtkPUludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsc2c9VWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsblU9RmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULE9jPUZsb2F0NjRBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtObz1uZXcgYXQsQmE9bmV3IGEsclU9bmV3IGEsaVU9bmV3IGEsc1U9bmV3IHN0O2FVPVFlKG9VKX0pO3ZhciBmVSxLUixXUj1aKCgpPT57ZlU9e05PTkU6MCxMRVJDOjF9LEtSPU9iamVjdC5mcmVlemUoZlUpfSk7dmFyIF9pLGZnLHVVLGxVLHBVLFhSLFlSPVooKCk9Pnt4ZigpO01lKCk7RmUoKTtGdCgpO0l0KCk7ZnQoKTtIdCgpO1p0KCk7cnUoKTtXdCgpO0JuKCk7cGEoKTt3bigpO2l1KCk7Y3MoKTtpYygpO19pPXt9O19pLkRFRkFVTFRfU1RSVUNUVVJFPU9iamVjdC5mcmVlemUoe2hlaWdodFNjYWxlOjEsaGVpZ2h0T2Zmc2V0OjAsZWxlbWVudHNQZXJIZWlnaHQ6MSxzdHJpZGU6MSxlbGVtZW50TXVsdGlwbGllcjoyNTYsaXNCaWdFbmRpYW46ITF9KTtmZz1uZXcgYSx1VT1uZXcgc3QsbFU9bmV3IGEscFU9bmV3IGE7X2kuY29tcHV0ZVZlcnRpY2VzPWZ1bmN0aW9uKHQpe2lmKCFoKHQpfHwhaCh0LmhlaWdodG1hcCkpdGhyb3cgbmV3IEYoIm9wdGlvbnMuaGVpZ2h0bWFwIGlzIHJlcXVpcmVkLiIpO2lmKCFoKHQud2lkdGgpfHwhaCh0LmhlaWdodCkpdGhyb3cgbmV3IEYoIm9wdGlvbnMud2lkdGggYW5kIG9wdGlvbnMuaGVpZ2h0IGFyZSByZXF1aXJlZC4iKTtpZighaCh0Lm5hdGl2ZVJlY3RhbmdsZSkpdGhyb3cgbmV3IEYoIm9wdGlvbnMubmF0aXZlUmVjdGFuZ2xlIGlzIHJlcXVpcmVkLiIpO2lmKCFoKHQuc2tpcnRIZWlnaHQpKXRocm93IG5ldyBGKCJvcHRpb25zLnNraXJ0SGVpZ2h0IGlzIHJlcXVpcmVkLiIpO2xldCBlPU1hdGguY29zLG49TWF0aC5zaW4sbz1NYXRoLnNxcnQscj1NYXRoLmF0YW4saT1NYXRoLmV4cCxzPU0uUElfT1ZFUl9UV08sZj1NLnRvUmFkaWFucyx1PXQuaGVpZ2h0bWFwLGM9dC53aWR0aCxsPXQuaGVpZ2h0LHA9dC5za2lydEhlaWdodCxkPXA+MCxtPXgodC5pc0dlb2dyYXBoaWMsITApLF89eCh0LmVsbGlwc29pZCwkLldHUzg0KSxnPTEvXy5tYXhpbXVtUmFkaXVzLGI9TnQuY2xvbmUodC5uYXRpdmVSZWN0YW5nbGUpLHc9TnQuY2xvbmUodC5yZWN0YW5nbGUpLE8sRSxULEM7aCh3KT8oTz13Lndlc3QsRT13LnNvdXRoLFQ9dy5lYXN0LEM9dy5ub3J0aCk6bT8oTz1mKGIud2VzdCksRT1mKGIuc291dGgpLFQ9ZihiLmVhc3QpLEM9ZihiLm5vcnRoKSk6KE89Yi53ZXN0KmcsRT1zLTIqcihpKC1iLnNvdXRoKmcpKSxUPWIuZWFzdCpnLEM9cy0yKnIoaSgtYi5ub3J0aCpnKSkpO2xldCBOPXQucmVsYXRpdmVUb0NlbnRlcixJPWgoTik7Tj1JP046YS5aRVJPO2xldCBEPXgodC5pbmNsdWRlV2ViTWVyY2F0b3JULCExKSx2PXgodC5leGFnZ2VyYXRpb24sMSksTD14KHQuZXhhZ2dlcmF0aW9uUmVsYXRpdmVIZWlnaHQsMCksQT12IT09MSxTPXgodC5zdHJ1Y3R1cmUsX2kuREVGQVVMVF9TVFJVQ1RVUkUpLFA9eChTLmhlaWdodFNjYWxlLF9pLkRFRkFVTFRfU1RSVUNUVVJFLmhlaWdodFNjYWxlKSxCPXgoUy5oZWlnaHRPZmZzZXQsX2kuREVGQVVMVF9TVFJVQ1RVUkUuaGVpZ2h0T2Zmc2V0KSxqPXgoUy5lbGVtZW50c1BlckhlaWdodCxfaS5ERUZBVUxUX1NUUlVDVFVSRS5lbGVtZW50c1BlckhlaWdodCksSD14KFMuc3RyaWRlLF9pLkRFRkFVTFRfU1RSVUNUVVJFLnN0cmlkZSksaz14KFMuZWxlbWVudE11bHRpcGxpZXIsX2kuREVGQVVMVF9TVFJVQ1RVUkUuZWxlbWVudE11bHRpcGxpZXIpLEs9eChTLmlzQmlnRW5kaWFuLF9pLkRFRkFVTFRfU1RSVUNUVVJFLmlzQmlnRW5kaWFuKSxYPU50LmNvbXB1dGVXaWR0aChiKSxSPU50LmNvbXB1dGVIZWlnaHQoYiksb3Q9WC8oYy0xKSxjdD1SLyhsLTEpO218fChYKj1nLFIqPWcpO2xldCBwdD1fLnJhZGlpU3F1YXJlZCx5dD1wdC54LHJ0PXB0LnksUHQ9cHQueixndD02NTUzNixDdD0tNjU1MzYsbXQ9WW8uZWFzdE5vcnRoVXBUb0ZpeGVkRnJhbWUoTixfKSx1dD1zdC5pbnZlcnNlVHJhbnNmb3JtYXRpb24obXQsdVUpLHZ0LHp0O0QmJih2dD1lby5nZW9kZXRpY0xhdGl0dWRlVG9NZXJjYXRvckFuZ2xlKEUpLHp0PTEvKGVvLmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGUoQyktdnQpKTtsZXQgbWU9bFU7bWUueD1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksbWUueT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksbWUuej1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7bGV0IGNlPXBVO2NlLng9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLGNlLnk9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLGNlLno9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO2xldCBwZT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksdWU9YypsLFF0PXA+MD9jKjIrbCoyOjAsSnQ9dWUrUXQseGU9bmV3IEFycmF5KEp0KSxnZT1uZXcgQXJyYXkoSnQpLEVlPW5ldyBBcnJheShKdCksdW49RD9uZXcgQXJyYXkoSnQpOltdLGtlPUE/bmV3IEFycmF5KEp0KTpbXSxiZT0wLGxuPWwscG49MCxPbj1jO2QmJigtLWJlLCsrbG4sLS1wbiwrK09uKTtsZXQgcmU9MWUtNTtmb3IobGV0IFplPWJlO1plPGxuOysrWmUpe2xldCBjbj1aZTtjbjwwJiYoY249MCksY24+PWwmJihjbj1sLTEpO2xldCBLZT1iLm5vcnRoLWN0KmNuO20/S2U9ZihLZSk6S2U9cy0yKnIoaSgtS2UqZykpO2xldCBobj0oS2UtRSkvKEMtRSk7aG49TS5jbGFtcChobiwwLDEpO2xldCB1bz1aZT09PWJlLHFuPVplPT09bG4tMTtwPjAmJih1bz9LZSs9cmUqUjpxbiYmKEtlLT1yZSpSKSk7bGV0IEtuPWUoS2UpLGxvPW4oS2UpLHplPVB0KmxvLEllO0QmJihJZT0oZW8uZ2VvZGV0aWNMYXRpdHVkZVRvTWVyY2F0b3JBbmdsZShLZSktdnQpKnp0KTtmb3IobGV0IExuPXBuO0xuPE9uOysrTG4pe2xldCBXbj1MbjtXbjwwJiYoV249MCksV24+PWMmJihXbj1jLTEpO2xldCBqbz1jbiooYypIKStXbipILHJuO2lmKGo9PT0xKXJuPXVbam9dO2Vsc2V7cm49MDtsZXQgcG87aWYoSylmb3IocG89MDtwbzxqOysrcG8pcm49cm4qayt1W2pvK3BvXTtlbHNlIGZvcihwbz1qLTE7cG8+PTA7LS1wbylybj1ybiprK3Vbam8rcG9dfXJuPXJuKlArQixDdD1NYXRoLm1heChDdCxybiksZ3Q9TWF0aC5taW4oZ3Qscm4pO2xldCBFbj1iLndlc3Qrb3QqV247bT9Fbj1mKEVuKTpFbj1FbipnO2xldCBmcj0oRW4tTykvKFQtTyk7ZnI9TS5jbGFtcChmciwwLDEpO2xldCBabj1jbipjK1duO2lmKHA+MCl7bGV0IHBvPUxuPT09cG4sdnI9TG49PT1Pbi0xLE1jPXVvfHxxbnx8cG98fHZyO2lmKCh1b3x8cW4pJiYocG98fHZyKSljb250aW51ZTtNYyYmKHJuLT1wLHBvPyhabj11ZSsobC1jbi0xKSxFbi09cmUqWCk6cW4/Wm49dWUrbCsoYy1Xbi0xKTp2cj8oWm49dWUrbCtjK2NuLEVuKz1yZSpYKTp1byYmKFpuPXVlK2wrYytsK1duKSl9bGV0IEhvPUtuKmUoRW4pLE5yPUtuKm4oRW4pLE5zPXl0KkhvLElzPXJ0Kk5yLElyPTEvbyhOcypIbytJcypOcit6ZSpsbyksJGk9TnMqSXIsdnM9SXMqSXIsYmk9emUqSXIsbm89bmV3IGE7bm8ueD0kaStIbypybixuby55PXZzK05yKnJuLG5vLno9YmkrbG8qcm4sc3QubXVsdGlwbHlCeVBvaW50KHV0LG5vLGZnKSxhLm1pbmltdW1CeUNvbXBvbmVudChmZyxtZSxtZSksYS5tYXhpbXVtQnlDb21wb25lbnQoZmcsY2UsY2UpLHBlPU1hdGgubWluKHBlLHJuKSx4ZVtabl09bm8sRWVbWm5dPW5ldyB0dChmcixobiksZ2VbWm5dPXJuLEQmJih1bltabl09SWUpLEEmJihrZVtabl09Xy5nZW9kZXRpY1N1cmZhY2VOb3JtYWwobm8pKX19bGV0ICR0PUF0LmZyb21Qb2ludHMoeGUpLEdlO2godykmJihHZT1Tby5mcm9tUmVjdGFuZ2xlKHcsZ3QsQ3QsXykpO2xldCBkbjtJJiYoZG49bmV3IHhzKF8pLmNvbXB1dGVIb3Jpem9uQ3VsbGluZ1BvaW50UG9zc2libHlVbmRlckVsbGlwc29pZChOLHhlLGd0KSk7bGV0IHNuPW5ldyBEaShtZSxjZSxOKSxtbj1uZXcgUHMoTixzbixwZSxDdCxtdCwhMSxELEEsdixMKSxmbz1uZXcgRmxvYXQzMkFycmF5KEp0Km1uLnN0cmlkZSksSG49MDtmb3IobGV0IFplPTA7WmU8SnQ7KytaZSlIbj1tbi5lbmNvZGUoZm8sSG4seGVbWmVdLEVlW1plXSxnZVtaZV0sdm9pZCAwLHVuW1plXSxrZVtaZV0pO3JldHVybnt2ZXJ0aWNlczpmbyxtYXhpbXVtSGVpZ2h0OkN0LG1pbmltdW1IZWlnaHQ6Z3QsZW5jb2Rpbmc6bW4sYm91bmRpbmdTcGhlcmUzRDokdCxvcmllbnRlZEJvdW5kaW5nQm94OkdlLG9jY2x1ZGVlUG9pbnRJblNjYWxlZFNwYWNlOmRufX07WFI9X2l9KTt2YXIgJFI9Vm4oKGNmdCxYZCk9PnsvKiBDb3B5cmlnaHQgMjAxNS0yMDE4IEVzcmkuIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgQHByZXNlcnZlICovKGZ1bmN0aW9uKCl7dmFyIHQ9ZnVuY3Rpb24oKXt2YXIgcj17fTtyLmRlZmF1bHROb0RhdGFWYWx1ZT0tMzQwMjc5OTkzODc5MDE0ODRlMjIsci5kZWNvZGU9ZnVuY3Rpb24obCxwKXtwPXB8fHt9O3ZhciBkPXAuZW5jb2RlZE1hc2tEYXRhfHxwLmVuY29kZWRNYXNrRGF0YT09PW51bGwsbT11KGwscC5pbnB1dE9mZnNldHx8MCxkKSxfPXAubm9EYXRhVmFsdWUhPT1udWxsP3Aubm9EYXRhVmFsdWU6ci5kZWZhdWx0Tm9EYXRhVmFsdWUsZz1pKG0scC5waXhlbFR5cGV8fEZsb2F0MzJBcnJheSxwLmVuY29kZWRNYXNrRGF0YSxfLHAucmV0dXJuTWFzayksYj17d2lkdGg6bS53aWR0aCxoZWlnaHQ6bS5oZWlnaHQscGl4ZWxEYXRhOmcucmVzdWx0UGl4ZWxzLG1pblZhbHVlOmcubWluVmFsdWUsbWF4VmFsdWU6bS5waXhlbHMubWF4VmFsdWUsbm9EYXRhVmFsdWU6X307cmV0dXJuIGcucmVzdWx0TWFzayYmKGIubWFza0RhdGE9Zy5yZXN1bHRNYXNrKSxwLnJldHVybkVuY29kZWRNYXNrJiZtLm1hc2smJihiLmVuY29kZWRNYXNrRGF0YT1tLm1hc2suYml0c2V0P20ubWFzay5iaXRzZXQ6bnVsbCkscC5yZXR1cm5GaWxlSW5mbyYmKGIuZmlsZUluZm89cyhtKSxwLmNvbXB1dGVVc2VkQml0RGVwdGhzJiYoYi5maWxlSW5mby5iaXREZXB0aHM9ZihtKSkpLGJ9O3ZhciBpPWZ1bmN0aW9uKGwscCxkLG0sXyl7dmFyIGc9MCxiPWwucGl4ZWxzLm51bUJsb2Nrc1gsdz1sLnBpeGVscy5udW1CbG9ja3NZLE89TWF0aC5mbG9vcihsLndpZHRoL2IpLEU9TWF0aC5mbG9vcihsLmhlaWdodC93KSxUPTIqbC5tYXhaRXJyb3IsQz1OdW1iZXIuTUFYX1ZBTFVFLE47ZD1kfHwobC5tYXNrP2wubWFzay5iaXRzZXQ6bnVsbCk7dmFyIEksRDtJPW5ldyBwKGwud2lkdGgqbC5oZWlnaHQpLF8mJmQmJihEPW5ldyBVaW50OEFycmF5KGwud2lkdGgqbC5oZWlnaHQpKTtmb3IodmFyIHY9bmV3IEZsb2F0MzJBcnJheShPKkUpLEwsVSxBPTA7QTw9dztBKyspe3ZhciBTPUEhPT13P0U6bC5oZWlnaHQldztpZihTIT09MClmb3IodmFyIFA9MDtQPD1iO1ArKyl7dmFyIEI9UCE9PWI/TzpsLndpZHRoJWI7aWYoQiE9PTApe3ZhciBqPUEqbC53aWR0aCpFK1AqTyxIPWwud2lkdGgtQixrPWwucGl4ZWxzLmJsb2Nrc1tnXSxLLFgsUjtrLmVuY29kaW5nPDI/KGsuZW5jb2Rpbmc9PT0wP0s9ay5yYXdEYXRhOihjKGsuc3R1ZmZlZERhdGEsay5iaXRzUGVyUGl4ZWwsay5udW1WYWxpZFBpeGVscyxrLm9mZnNldCxULHYsbC5waXhlbHMubWF4VmFsdWUpLEs9diksWD0wKTprLmVuY29kaW5nPT09Mj9SPTA6Uj1rLm9mZnNldDt2YXIgb3Q7aWYoZClmb3IoVT0wO1U8UztVKyspe2ZvcihqJjcmJihvdD1kW2o+PjNdLG90PDw9aiY3KSxMPTA7TDxCO0wrKylqJjd8fChvdD1kW2o+PjNdKSxvdCYxMjg/KEQmJihEW2pdPTEpLE49ay5lbmNvZGluZzwyP0tbWCsrXTpSLEM9Qz5OP046QyxJW2orK109Tik6KEQmJihEW2pdPTApLElbaisrXT1tKSxvdDw8PTE7ais9SH1lbHNlIGlmKGsuZW5jb2Rpbmc8Milmb3IoVT0wO1U8UztVKyspe2ZvcihMPTA7TDxCO0wrKylOPUtbWCsrXSxDPUM+Tj9OOkMsSVtqKytdPU47ais9SH1lbHNlIGZvcihDPUM+Uj9SOkMsVT0wO1U8UztVKyspe2ZvcihMPTA7TDxCO0wrKylJW2orK109UjtqKz1IfWlmKGsuZW5jb2Rpbmc9PT0xJiZYIT09ay5udW1WYWxpZFBpeGVscyl0aHJvdyJCbG9jayBhbmQgTWFzayBkbyBub3QgbWF0Y2giO2crK319fXJldHVybntyZXN1bHRQaXhlbHM6SSxyZXN1bHRNYXNrOkQsbWluVmFsdWU6Q319LHM9ZnVuY3Rpb24obCl7cmV0dXJue2ZpbGVJZGVudGlmaWVyU3RyaW5nOmwuZmlsZUlkZW50aWZpZXJTdHJpbmcsZmlsZVZlcnNpb246bC5maWxlVmVyc2lvbixpbWFnZVR5cGU6bC5pbWFnZVR5cGUsaGVpZ2h0OmwuaGVpZ2h0LHdpZHRoOmwud2lkdGgsbWF4WkVycm9yOmwubWF4WkVycm9yLGVvZk9mZnNldDpsLmVvZk9mZnNldCxtYXNrOmwubWFzaz97bnVtQmxvY2tzWDpsLm1hc2subnVtQmxvY2tzWCxudW1CbG9ja3NZOmwubWFzay5udW1CbG9ja3NZLG51bUJ5dGVzOmwubWFzay5udW1CeXRlcyxtYXhWYWx1ZTpsLm1hc2subWF4VmFsdWV9Om51bGwscGl4ZWxzOntudW1CbG9ja3NYOmwucGl4ZWxzLm51bUJsb2Nrc1gsbnVtQmxvY2tzWTpsLnBpeGVscy5udW1CbG9ja3NZLG51bUJ5dGVzOmwucGl4ZWxzLm51bUJ5dGVzLG1heFZhbHVlOmwucGl4ZWxzLm1heFZhbHVlLG5vRGF0YVZhbHVlOmwubm9EYXRhVmFsdWV9fX0sZj1mdW5jdGlvbihsKXtmb3IodmFyIHA9bC5waXhlbHMubnVtQmxvY2tzWCpsLnBpeGVscy5udW1CbG9ja3NZLGQ9e30sbT0wO208cDttKyspe3ZhciBfPWwucGl4ZWxzLmJsb2Nrc1ttXTtfLmVuY29kaW5nPT09MD9kLmZsb2F0MzI9ITA6Xy5lbmNvZGluZz09PTE/ZFtfLmJpdHNQZXJQaXhlbF09ITA6ZFswXT0hMH1yZXR1cm4gT2JqZWN0LmtleXMoZCl9LHU9ZnVuY3Rpb24obCxwLGQpe3ZhciBtPXt9LF89bmV3IFVpbnQ4QXJyYXkobCxwLDEwKTtpZihtLmZpbGVJZGVudGlmaWVyU3RyaW5nPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxfKSxtLmZpbGVJZGVudGlmaWVyU3RyaW5nLnRyaW0oKSE9PSJDbnRaSW1hZ2UiKXRocm93IlVuZXhwZWN0ZWQgZmlsZSBpZGVudGlmaWVyIHN0cmluZzogIittLmZpbGVJZGVudGlmaWVyU3RyaW5nO3ArPTEwO3ZhciBnPW5ldyBEYXRhVmlldyhsLHAsMjQpO2lmKG0uZmlsZVZlcnNpb249Zy5nZXRJbnQzMigwLCEwKSxtLmltYWdlVHlwZT1nLmdldEludDMyKDQsITApLG0uaGVpZ2h0PWcuZ2V0VWludDMyKDgsITApLG0ud2lkdGg9Zy5nZXRVaW50MzIoMTIsITApLG0ubWF4WkVycm9yPWcuZ2V0RmxvYXQ2NCgxNiwhMCkscCs9MjQsIWQpaWYoZz1uZXcgRGF0YVZpZXcobCxwLDE2KSxtLm1hc2s9e30sbS5tYXNrLm51bUJsb2Nrc1k9Zy5nZXRVaW50MzIoMCwhMCksbS5tYXNrLm51bUJsb2Nrc1g9Zy5nZXRVaW50MzIoNCwhMCksbS5tYXNrLm51bUJ5dGVzPWcuZ2V0VWludDMyKDgsITApLG0ubWFzay5tYXhWYWx1ZT1nLmdldEZsb2F0MzIoMTIsITApLHArPTE2LG0ubWFzay5udW1CeXRlcz4wKXt2YXIgYj1uZXcgVWludDhBcnJheShNYXRoLmNlaWwobS53aWR0aCptLmhlaWdodC84KSk7Zz1uZXcgRGF0YVZpZXcobCxwLG0ubWFzay5udW1CeXRlcyk7dmFyIHc9Zy5nZXRJbnQxNigwLCEwKSxPPTIsRT0wO2Rve2lmKHc+MClmb3IoO3ctLTspYltFKytdPWcuZ2V0VWludDgoTysrKTtlbHNle3ZhciBUPWcuZ2V0VWludDgoTysrKTtmb3Iodz0tdzt3LS07KWJbRSsrXT1UfXc9Zy5nZXRJbnQxNihPLCEwKSxPKz0yfXdoaWxlKE88bS5tYXNrLm51bUJ5dGVzKTtpZih3IT09LTMyNzY4fHxFPGIubGVuZ3RoKXRocm93IlVuZXhwZWN0ZWQgZW5kIG9mIG1hc2sgUkxFIGVuY29kaW5nIjttLm1hc2suYml0c2V0PWIscCs9bS5tYXNrLm51bUJ5dGVzfWVsc2UgbS5tYXNrLm51bUJ5dGVzfG0ubWFzay5udW1CbG9ja3NZfG0ubWFzay5tYXhWYWx1ZXx8KG0ubWFzay5iaXRzZXQ9bmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKG0ud2lkdGgqbS5oZWlnaHQvOCkpKTtnPW5ldyBEYXRhVmlldyhsLHAsMTYpLG0ucGl4ZWxzPXt9LG0ucGl4ZWxzLm51bUJsb2Nrc1k9Zy5nZXRVaW50MzIoMCwhMCksbS5waXhlbHMubnVtQmxvY2tzWD1nLmdldFVpbnQzMig0LCEwKSxtLnBpeGVscy5udW1CeXRlcz1nLmdldFVpbnQzMig4LCEwKSxtLnBpeGVscy5tYXhWYWx1ZT1nLmdldEZsb2F0MzIoMTIsITApLHArPTE2O3ZhciBDPW0ucGl4ZWxzLm51bUJsb2Nrc1gsTj1tLnBpeGVscy5udW1CbG9ja3NZLEk9QysobS53aWR0aCVDPjA/MTowKSxEPU4rKG0uaGVpZ2h0JU4+MD8xOjApO20ucGl4ZWxzLmJsb2Nrcz1uZXcgQXJyYXkoSSpEKTtmb3IodmFyIHY9MCxMPTA7TDxEO0wrKylmb3IodmFyIFU9MDtVPEk7VSsrKXt2YXIgQT0wLFM9bC5ieXRlTGVuZ3RoLXA7Zz1uZXcgRGF0YVZpZXcobCxwLE1hdGgubWluKDEwLFMpKTt2YXIgUD17fTttLnBpeGVscy5ibG9ja3NbdisrXT1QO3ZhciBCPWcuZ2V0VWludDgoMCk7aWYoQSsrLFAuZW5jb2Rpbmc9QiY2MyxQLmVuY29kaW5nPjMpdGhyb3ciSW52YWxpZCBibG9jayBlbmNvZGluZyAoIitQLmVuY29kaW5nKyIpIjtpZihQLmVuY29kaW5nPT09Mil7cCsrO2NvbnRpbnVlfWlmKEIhPT0wJiZCIT09Mil7aWYoQj4+PTYsUC5vZmZzZXRUeXBlPUIsQj09PTIpUC5vZmZzZXQ9Zy5nZXRJbnQ4KDEpLEErKztlbHNlIGlmKEI9PT0xKVAub2Zmc2V0PWcuZ2V0SW50MTYoMSwhMCksQSs9MjtlbHNlIGlmKEI9PT0wKVAub2Zmc2V0PWcuZ2V0RmxvYXQzMigxLCEwKSxBKz00O2Vsc2UgdGhyb3ciSW52YWxpZCBibG9jayBvZmZzZXQgdHlwZSI7aWYoUC5lbmNvZGluZz09PTEpaWYoQj1nLmdldFVpbnQ4KEEpLEErKyxQLmJpdHNQZXJQaXhlbD1CJjYzLEI+Pj02LFAubnVtVmFsaWRQaXhlbHNUeXBlPUIsQj09PTIpUC5udW1WYWxpZFBpeGVscz1nLmdldFVpbnQ4KEEpLEErKztlbHNlIGlmKEI9PT0xKVAubnVtVmFsaWRQaXhlbHM9Zy5nZXRVaW50MTYoQSwhMCksQSs9MjtlbHNlIGlmKEI9PT0wKVAubnVtVmFsaWRQaXhlbHM9Zy5nZXRVaW50MzIoQSwhMCksQSs9NDtlbHNlIHRocm93IkludmFsaWQgdmFsaWQgcGl4ZWwgY291bnQgdHlwZSJ9aWYocCs9QSxQLmVuY29kaW5nIT09Myl7dmFyIGosSDtpZihQLmVuY29kaW5nPT09MCl7dmFyIGs9KG0ucGl4ZWxzLm51bUJ5dGVzLTEpLzQ7aWYoayE9PU1hdGguZmxvb3IoaykpdGhyb3cidW5jb21wcmVzc2VkIGJsb2NrIGhhcyBpbnZhbGlkIGxlbmd0aCI7aj1uZXcgQXJyYXlCdWZmZXIoayo0KSxIPW5ldyBVaW50OEFycmF5KGopLEguc2V0KG5ldyBVaW50OEFycmF5KGwscCxrKjQpKTt2YXIgSz1uZXcgRmxvYXQzMkFycmF5KGopO1AucmF3RGF0YT1LLHArPWsqNH1lbHNlIGlmKFAuZW5jb2Rpbmc9PT0xKXt2YXIgWD1NYXRoLmNlaWwoUC5udW1WYWxpZFBpeGVscypQLmJpdHNQZXJQaXhlbC84KSxSPU1hdGguY2VpbChYLzQpO2o9bmV3IEFycmF5QnVmZmVyKFIqNCksSD1uZXcgVWludDhBcnJheShqKSxILnNldChuZXcgVWludDhBcnJheShsLHAsWCkpLFAuc3R1ZmZlZERhdGE9bmV3IFVpbnQzMkFycmF5KGopLHArPVh9fX1yZXR1cm4gbS5lb2ZPZmZzZXQ9cCxtfSxjPWZ1bmN0aW9uKGwscCxkLG0sXyxnLGIpe3ZhciB3PSgxPDxwKS0xLE89MCxFLFQ9MCxDLE4sST1NYXRoLmNlaWwoKGItbSkvXyksRD1sLmxlbmd0aCo0LU1hdGguY2VpbChwKmQvOCk7Zm9yKGxbbC5sZW5ndGgtMV08PD04KkQsRT0wO0U8ZDtFKyspe2lmKFQ9PT0wJiYoTj1sW08rK10sVD0zMiksVD49cClDPU4+Pj5ULXAmdyxULT1wO2Vsc2V7dmFyIHY9cC1UO0M9KE4mdyk8PHYmdyxOPWxbTysrXSxUPTMyLXYsQys9Tj4+PlR9Z1tFXT1DPEk/bStDKl86Yn1yZXR1cm4gZ307cmV0dXJuIHJ9KCksZT1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgcj17dW5zdHVmZjpmdW5jdGlvbih1LGMsbCxwLGQsbSxfLGcpe3ZhciBiPSgxPDxsKS0xLHc9MCxPLEU9MCxULEMsTixJLEQ9dS5sZW5ndGgqNC1NYXRoLmNlaWwobCpwLzgpO2lmKHVbdS5sZW5ndGgtMV08PD04KkQsZClmb3IoTz0wO088cDtPKyspRT09PTAmJihDPXVbdysrXSxFPTMyKSxFPj1sPyhUPUM+Pj5FLWwmYixFLT1sKTooTj1sLUUsVD0oQyZiKTw8TiZiLEM9dVt3KytdLEU9MzItTixUKz1DPj4+RSksY1tPXT1kW1RdO2Vsc2UgZm9yKEk9TWF0aC5jZWlsKChnLW0pL18pLE89MDtPPHA7TysrKUU9PT0wJiYoQz11W3crK10sRT0zMiksRT49bD8oVD1DPj4+RS1sJmIsRS09bCk6KE49bC1FLFQ9KEMmYik8PE4mYixDPXVbdysrXSxFPTMyLU4sVCs9Qz4+PkUpLGNbT109VDxJP20rVCpfOmd9LHVuc3R1ZmZMVVQ6ZnVuY3Rpb24odSxjLGwscCxkLG0pe3ZhciBfPSgxPDxjKS0xLGc9MCxiPTAsdz0wLE89MCxFPTAsVCxDPVtdLE49dS5sZW5ndGgqNC1NYXRoLmNlaWwoYypsLzgpO3VbdS5sZW5ndGgtMV08PD04Kk47dmFyIEk9TWF0aC5jZWlsKChtLXApL2QpO2ZvcihiPTA7YjxsO2IrKylPPT09MCYmKFQ9dVtnKytdLE89MzIpLE8+PWM/KEU9VD4+Pk8tYyZfLE8tPWMpOih3PWMtTyxFPShUJl8pPDx3Jl8sVD11W2crK10sTz0zMi13LEUrPVQ+Pj5PKSxDW2JdPUU8ST9wK0UqZDptO3JldHVybiBDLnVuc2hpZnQocCksQ30sdW5zdHVmZjI6ZnVuY3Rpb24odSxjLGwscCxkLG0sXyxnKXt2YXIgYj0oMTw8bCktMSx3PTAsTyxFPTAsVD0wLEMsTixJO2lmKGQpZm9yKE89MDtPPHA7TysrKUU9PT0wJiYoTj11W3crK10sRT0zMixUPTApLEU+PWw/KEM9Tj4+PlQmYixFLT1sLFQrPWwpOihJPWwtRSxDPU4+Pj5UJmIsTj11W3crK10sRT0zMi1JLEN8PShOJigxPDxJKS0xKTw8bC1JLFQ9SSksY1tPXT1kW0NdO2Vsc2V7dmFyIEQ9TWF0aC5jZWlsKChnLW0pL18pO2ZvcihPPTA7TzxwO08rKylFPT09MCYmKE49dVt3KytdLEU9MzIsVD0wKSxFPj1sPyhDPU4+Pj5UJmIsRS09bCxUKz1sKTooST1sLUUsQz1OPj4+VCZiLE49dVt3KytdLEU9MzItSSxDfD0oTiYoMTw8SSktMSk8PGwtSSxUPUkpLGNbT109QzxEP20rQypfOmd9cmV0dXJuIGN9LHVuc3R1ZmZMVVQyOmZ1bmN0aW9uKHUsYyxsLHAsZCxtKXt2YXIgXz0oMTw8YyktMSxnPTAsYj0wLHc9MCxPPTAsRT0wLFQ9MCxDLE49W10sST1NYXRoLmNlaWwoKG0tcCkvZCk7Zm9yKGI9MDtiPGw7YisrKU89PT0wJiYoQz11W2crK10sTz0zMixUPTApLE8+PWM/KEU9Qz4+PlQmXyxPLT1jLFQrPWMpOih3PWMtTyxFPUM+Pj5UJl8sQz11W2crK10sTz0zMi13LEV8PShDJigxPDx3KS0xKTw8Yy13LFQ9dyksTltiXT1FPEk/cCtFKmQ6bTtyZXR1cm4gTi51bnNoaWZ0KHApLE59LG9yaWdpbmFsVW5zdHVmZjpmdW5jdGlvbih1LGMsbCxwKXt2YXIgZD0oMTw8bCktMSxtPTAsXyxnPTAsYix3LE8sRT11Lmxlbmd0aCo0LU1hdGguY2VpbChsKnAvOCk7Zm9yKHVbdS5sZW5ndGgtMV08PD04KkUsXz0wO188cDtfKyspZz09PTAmJih3PXVbbSsrXSxnPTMyKSxnPj1sPyhiPXc+Pj5nLWwmZCxnLT1sKTooTz1sLWcsYj0odyZkKTw8TyZkLHc9dVttKytdLGc9MzItTyxiKz13Pj4+ZyksY1tfXT1iO3JldHVybiBjfSxvcmlnaW5hbFVuc3R1ZmYyOmZ1bmN0aW9uKHUsYyxsLHApe3ZhciBkPSgxPDxsKS0xLG09MCxfLGc9MCxiPTAsdyxPLEU7Zm9yKF89MDtfPHA7XysrKWc9PT0wJiYoTz11W20rK10sZz0zMixiPTApLGc+PWw/KHc9Tz4+PmImZCxnLT1sLGIrPWwpOihFPWwtZyx3PU8+Pj5iJmQsTz11W20rK10sZz0zMi1FLHd8PShPJigxPDxFKS0xKTw8bC1FLGI9RSksY1tfXT13O3JldHVybiBjfX0saT17SFVGRk1BTl9MVVRfQklUU19NQVg6MTIsY29tcHV0ZUNoZWNrc3VtRmxldGNoZXIzMjpmdW5jdGlvbih1KXtmb3IodmFyIGM9NjU1MzUsbD02NTUzNSxwPXUubGVuZ3RoLGQ9TWF0aC5mbG9vcihwLzIpLG09MDtkOyl7dmFyIF89ZD49MzU5PzM1OTpkO2QtPV87ZG8gYys9dVttKytdPDw4LGwrPWMrPXVbbSsrXTt3aGlsZSgtLV8pO2M9KGMmNjU1MzUpKyhjPj4+MTYpLGw9KGwmNjU1MzUpKyhsPj4+MTYpfXJldHVybiBwJjEmJihsKz1jKz11W21dPDw4KSxjPShjJjY1NTM1KSsoYz4+PjE2KSxsPShsJjY1NTM1KSsobD4+PjE2KSwobDw8MTZ8Yyk+Pj4wfSxyZWFkSGVhZGVySW5mbzpmdW5jdGlvbih1LGMpe3ZhciBsPWMucHRyLHA9bmV3IFVpbnQ4QXJyYXkodSxsLDYpLGQ9e307aWYoZC5maWxlSWRlbnRpZmllclN0cmluZz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwscCksZC5maWxlSWRlbnRpZmllclN0cmluZy5sYXN0SW5kZXhPZigiTGVyYzIiLDApIT09MCl0aHJvdyJVbmV4cGVjdGVkIGZpbGUgaWRlbnRpZmllciBzdHJpbmcgKGV4cGVjdCBMZXJjMiApOiAiK2QuZmlsZUlkZW50aWZpZXJTdHJpbmc7bCs9Njt2YXIgbT1uZXcgRGF0YVZpZXcodSxsLDgpLF89bS5nZXRJbnQzMigwLCEwKTtkLmZpbGVWZXJzaW9uPV8sbCs9NCxfPj0zJiYoZC5jaGVja3N1bT1tLmdldFVpbnQzMig0LCEwKSxsKz00KSxtPW5ldyBEYXRhVmlldyh1LGwsMTIpLGQuaGVpZ2h0PW0uZ2V0VWludDMyKDAsITApLGQud2lkdGg9bS5nZXRVaW50MzIoNCwhMCksbCs9OCxfPj00PyhkLm51bURpbXM9bS5nZXRVaW50MzIoOCwhMCksbCs9NCk6ZC5udW1EaW1zPTEsbT1uZXcgRGF0YVZpZXcodSxsLDQwKSxkLm51bVZhbGlkUGl4ZWw9bS5nZXRVaW50MzIoMCwhMCksZC5taWNyb0Jsb2NrU2l6ZT1tLmdldEludDMyKDQsITApLGQuYmxvYlNpemU9bS5nZXRJbnQzMig4LCEwKSxkLmltYWdlVHlwZT1tLmdldEludDMyKDEyLCEwKSxkLm1heFpFcnJvcj1tLmdldEZsb2F0NjQoMTYsITApLGQuek1pbj1tLmdldEZsb2F0NjQoMjQsITApLGQuek1heD1tLmdldEZsb2F0NjQoMzIsITApLGwrPTQwLGMuaGVhZGVySW5mbz1kLGMucHRyPWw7dmFyIGcsYjtpZihfPj0zJiYoYj1fPj00PzUyOjQ4LGc9dGhpcy5jb21wdXRlQ2hlY2tzdW1GbGV0Y2hlcjMyKG5ldyBVaW50OEFycmF5KHUsbC1iLGQuYmxvYlNpemUtMTQpKSxnIT09ZC5jaGVja3N1bSkpdGhyb3ciQ2hlY2tzdW0gZmFpbGVkLiI7cmV0dXJuITB9LGNoZWNrTWluTWF4UmFuZ2VzOmZ1bmN0aW9uKHUsYyl7dmFyIGw9Yy5oZWFkZXJJbmZvLHA9dGhpcy5nZXREYXRhVHlwZUFycmF5KGwuaW1hZ2VUeXBlKSxkPWwubnVtRGltcyp0aGlzLmdldERhdGFUeXBlU2l6ZShsLmltYWdlVHlwZSksbT10aGlzLnJlYWRTdWJBcnJheSh1LGMucHRyLHAsZCksXz10aGlzLnJlYWRTdWJBcnJheSh1LGMucHRyK2QscCxkKTtjLnB0cis9MipkO3ZhciBnLGI9ITA7Zm9yKGc9MDtnPGwubnVtRGltcztnKyspaWYobVtnXSE9PV9bZ10pe2I9ITE7YnJlYWt9cmV0dXJuIGwubWluVmFsdWVzPW0sbC5tYXhWYWx1ZXM9XyxifSxyZWFkU3ViQXJyYXk6ZnVuY3Rpb24odSxjLGwscCl7dmFyIGQ7aWYobD09PVVpbnQ4QXJyYXkpZD1uZXcgVWludDhBcnJheSh1LGMscCk7ZWxzZXt2YXIgbT1uZXcgQXJyYXlCdWZmZXIocCksXz1uZXcgVWludDhBcnJheShtKTtfLnNldChuZXcgVWludDhBcnJheSh1LGMscCkpLGQ9bmV3IGwobSl9cmV0dXJuIGR9LHJlYWRNYXNrOmZ1bmN0aW9uKHUsYyl7dmFyIGw9Yy5wdHIscD1jLmhlYWRlckluZm8sZD1wLndpZHRoKnAuaGVpZ2h0LG09cC5udW1WYWxpZFBpeGVsLF89bmV3IERhdGFWaWV3KHUsbCw0KSxnPXt9O2lmKGcubnVtQnl0ZXM9Xy5nZXRVaW50MzIoMCwhMCksbCs9NCwobT09PTB8fGQ9PT1tKSYmZy5udW1CeXRlcyE9PTApdGhyb3ciaW52YWxpZCBtYXNrIjt2YXIgYix3O2lmKG09PT0wKWI9bmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKGQvOCkpLGcuYml0c2V0PWIsdz1uZXcgVWludDhBcnJheShkKSxjLnBpeGVscy5yZXN1bHRNYXNrPXcsbCs9Zy5udW1CeXRlcztlbHNlIGlmKGcubnVtQnl0ZXM+MCl7Yj1uZXcgVWludDhBcnJheShNYXRoLmNlaWwoZC84KSksXz1uZXcgRGF0YVZpZXcodSxsLGcubnVtQnl0ZXMpO3ZhciBPPV8uZ2V0SW50MTYoMCwhMCksRT0yLFQ9MCxDPTA7ZG97aWYoTz4wKWZvcig7Ty0tOyliW1QrK109Xy5nZXRVaW50OChFKyspO2Vsc2UgZm9yKEM9Xy5nZXRVaW50OChFKyspLE89LU87Ty0tOyliW1QrK109QztPPV8uZ2V0SW50MTYoRSwhMCksRSs9Mn13aGlsZShFPGcubnVtQnl0ZXMpO2lmKE8hPT0tMzI3Njh8fFQ8Yi5sZW5ndGgpdGhyb3ciVW5leHBlY3RlZCBlbmQgb2YgbWFzayBSTEUgZW5jb2RpbmciO3c9bmV3IFVpbnQ4QXJyYXkoZCk7dmFyIE49MCxJPTA7Zm9yKEk9MDtJPGQ7SSsrKUkmNz8oTj1iW0k+PjNdLE48PD1JJjcpOk49YltJPj4zXSxOJjEyOCYmKHdbSV09MSk7Yy5waXhlbHMucmVzdWx0TWFzaz13LGcuYml0c2V0PWIsbCs9Zy5udW1CeXRlc31yZXR1cm4gYy5wdHI9bCxjLm1hc2s9ZywhMH0scmVhZERhdGFPbmVTd2VlcDpmdW5jdGlvbih1LGMsbCl7dmFyIHA9Yy5wdHIsZD1jLmhlYWRlckluZm8sbT1kLm51bURpbXMsXz1kLndpZHRoKmQuaGVpZ2h0LGc9ZC5pbWFnZVR5cGUsYj1kLm51bVZhbGlkUGl4ZWwqaS5nZXREYXRhVHlwZVNpemUoZykqbSx3LE89Yy5waXhlbHMucmVzdWx0TWFzaztpZihsPT09VWludDhBcnJheSl3PW5ldyBVaW50OEFycmF5KHUscCxiKTtlbHNle3ZhciBFPW5ldyBBcnJheUJ1ZmZlcihiKSxUPW5ldyBVaW50OEFycmF5KEUpO1Quc2V0KG5ldyBVaW50OEFycmF5KHUscCxiKSksdz1uZXcgbChFKX1pZih3Lmxlbmd0aD09PV8qbSljLnBpeGVscy5yZXN1bHRQaXhlbHM9dztlbHNle2MucGl4ZWxzLnJlc3VsdFBpeGVscz1uZXcgbChfKm0pO3ZhciBDPTAsTj0wLEk9MCxEPTA7aWYobT4xKWZvcihJPTA7STxtO0krKylmb3IoRD1JKl8sTj0wO048XztOKyspT1tOXSYmKGMucGl4ZWxzLnJlc3VsdFBpeGVsc1tEK05dPXdbQysrXSk7ZWxzZSBmb3IoTj0wO048XztOKyspT1tOXSYmKGMucGl4ZWxzLnJlc3VsdFBpeGVsc1tOXT13W0MrK10pfXJldHVybiBwKz1iLGMucHRyPXAsITB9LHJlYWRIdWZmbWFuVHJlZTpmdW5jdGlvbih1LGMpe3ZhciBsPXRoaXMuSFVGRk1BTl9MVVRfQklUU19NQVgscD1uZXcgRGF0YVZpZXcodSxjLnB0ciwxNik7Yy5wdHIrPTE2O3ZhciBkPXAuZ2V0SW50MzIoMCwhMCk7aWYoZDwyKXRocm93InVuc3VwcG9ydGVkIEh1ZmZtYW4gdmVyc2lvbiI7dmFyIG09cC5nZXRJbnQzMig0LCEwKSxfPXAuZ2V0SW50MzIoOCwhMCksZz1wLmdldEludDMyKDEyLCEwKTtpZihfPj1nKXJldHVybiExO3ZhciBiPW5ldyBVaW50MzJBcnJheShnLV8pO2kuZGVjb2RlQml0cyh1LGMsYik7dmFyIHc9W10sTyxFLFQsQztmb3IoTz1fO088ZztPKyspRT1PLShPPG0/MDptKSx3W0VdPXtmaXJzdDpiW08tX10sc2Vjb25kOm51bGx9O3ZhciBOPXUuYnl0ZUxlbmd0aC1jLnB0cixJPU1hdGguY2VpbChOLzQpLEQ9bmV3IEFycmF5QnVmZmVyKEkqNCksdj1uZXcgVWludDhBcnJheShEKTt2LnNldChuZXcgVWludDhBcnJheSh1LGMucHRyLE4pKTt2YXIgTD1uZXcgVWludDMyQXJyYXkoRCksVT0wLEEsUz0wO2ZvcihBPUxbMF0sTz1fO088ZztPKyspRT1PLShPPG0/MDptKSxDPXdbRV0uZmlyc3QsQz4wJiYod1tFXS5zZWNvbmQ9QTw8VT4+PjMyLUMsMzItVT49Qz8oVSs9QyxVPT09MzImJihVPTAsUysrLEE9TFtTXSkpOihVKz1DLTMyLFMrKyxBPUxbU10sd1tFXS5zZWNvbmR8PUE+Pj4zMi1VKSk7dmFyIFA9MCxCPTAsaj1uZXcgcztmb3IoTz0wO088dy5sZW5ndGg7TysrKXdbT10hPT12b2lkIDAmJihQPU1hdGgubWF4KFAsd1tPXS5maXJzdCkpO1A+PWw/Qj1sOkI9UCxQPj0zMCYmY29uc29sZS5sb2coIldBUm5pbmcsIGxhcmdlIE5VTSBMVVQgQklUUyBJUyAiK1ApO3ZhciBIPVtdLGssSyxYLFIsb3QsY3Q7Zm9yKE89XztPPGc7TysrKWlmKEU9Ty0oTzxtPzA6bSksQz13W0VdLmZpcnN0LEM+MClpZihrPVtDLEVdLEM8PUIpZm9yKEs9d1tFXS5zZWNvbmQ8PEItQyxYPTE8PEItQyxUPTA7VDxYO1QrKylIW0t8VF09aztlbHNlIGZvcihLPXdbRV0uc2Vjb25kLGN0PWosUj1DLTE7Uj49MDtSLS0pb3Q9Sz4+PlImMSxvdD8oY3QucmlnaHR8fChjdC5yaWdodD1uZXcgcyksY3Q9Y3QucmlnaHQpOihjdC5sZWZ0fHwoY3QubGVmdD1uZXcgcyksY3Q9Y3QubGVmdCksUj09PTAmJiFjdC52YWwmJihjdC52YWw9a1sxXSk7cmV0dXJue2RlY29kZUx1dDpILG51bUJpdHNMVVRRaWNrOkIsbnVtQml0c0xVVDpQLHRyZWU6aixzdHVmZmVkRGF0YTpMLHNyY1B0cjpTLGJpdFBvczpVfX0scmVhZEh1ZmZtYW46ZnVuY3Rpb24odSxjLGwpe3ZhciBwPWMuaGVhZGVySW5mbyxkPXAubnVtRGltcyxtPWMuaGVhZGVySW5mby5oZWlnaHQsXz1jLmhlYWRlckluZm8ud2lkdGgsZz1fKm0sYj10aGlzLnJlYWRIdWZmbWFuVHJlZSh1LGMpLHc9Yi5kZWNvZGVMdXQsTz1iLnRyZWUsRT1iLnN0dWZmZWREYXRhLFQ9Yi5zcmNQdHIsQz1iLmJpdFBvcyxOPWIubnVtQml0c0xVVFFpY2ssST1iLm51bUJpdHNMVVQsRD1jLmhlYWRlckluZm8uaW1hZ2VUeXBlPT09MD8xMjg6MCx2LEwsVSxBPWMucGl4ZWxzLnJlc3VsdE1hc2ssUyxQLEIsaixILGssSyxYPTA7Qz4wJiYoVCsrLEM9MCk7dmFyIFI9RVtUXSxvdD1jLmVuY29kZU1vZGU9PT0xLGN0PW5ldyBsKGcqZCkscHQ9Y3QseXQ7Zm9yKHl0PTA7eXQ8cC5udW1EaW1zO3l0Kyspe2lmKGQ+MSYmKHB0PW5ldyBsKGN0LmJ1ZmZlcixnKnl0LGcpLFg9MCksYy5oZWFkZXJJbmZvLm51bVZhbGlkUGl4ZWw9PT1fKm0pZm9yKGs9MCxqPTA7ajxtO2orKylmb3IoSD0wO0g8XztIKyssaysrKXtpZihMPTAsUz1SPDxDPj4+MzItTixQPVMsMzItQzxOJiYoU3w9RVtUKzFdPj4+NjQtQy1OLFA9Uyksd1tQXSlMPXdbUF1bMV0sQys9d1tQXVswXTtlbHNlIGZvcihTPVI8PEM+Pj4zMi1JLFA9UywzMi1DPEkmJihTfD1FW1QrMV0+Pj42NC1DLUksUD1TKSx2PU8sSz0wO0s8STtLKyspaWYoQj1TPj4+SS1LLTEmMSx2PUI/di5yaWdodDp2LmxlZnQsISh2LmxlZnR8fHYucmlnaHQpKXtMPXYudmFsLEM9QytLKzE7YnJlYWt9Qz49MzImJihDLT0zMixUKyssUj1FW1RdKSxVPUwtRCxvdD8oSD4wP1UrPVg6aj4wP1UrPXB0W2stX106VSs9WCxVJj0yNTUscHRba109VSxYPVUpOnB0W2tdPVV9ZWxzZSBmb3Ioaz0wLGo9MDtqPG07aisrKWZvcihIPTA7SDxfO0grKyxrKyspaWYoQVtrXSl7aWYoTD0wLFM9Ujw8Qz4+PjMyLU4sUD1TLDMyLUM8TiYmKFN8PUVbVCsxXT4+PjY0LUMtTixQPVMpLHdbUF0pTD13W1BdWzFdLEMrPXdbUF1bMF07ZWxzZSBmb3IoUz1SPDxDPj4+MzItSSxQPVMsMzItQzxJJiYoU3w9RVtUKzFdPj4+NjQtQy1JLFA9Uyksdj1PLEs9MDtLPEk7SysrKWlmKEI9Uz4+PkktSy0xJjEsdj1CP3YucmlnaHQ6di5sZWZ0LCEodi5sZWZ0fHx2LnJpZ2h0KSl7TD12LnZhbCxDPUMrSysxO2JyZWFrfUM+PTMyJiYoQy09MzIsVCsrLFI9RVtUXSksVT1MLUQsb3Q/KEg+MCYmQVtrLTFdP1UrPVg6aj4wJiZBW2stX10/VSs9cHRbay1fXTpVKz1YLFUmPTI1NSxwdFtrXT1VLFg9VSk6cHRba109VX1jLnB0cj1jLnB0cisoVCsxKSo0KyhDPjA/NDowKX1jLnBpeGVscy5yZXN1bHRQaXhlbHM9Y3R9LGRlY29kZUJpdHM6ZnVuY3Rpb24odSxjLGwscCxkKXt7dmFyIG09Yy5oZWFkZXJJbmZvLF89bS5maWxlVmVyc2lvbixnPTAsYj1uZXcgRGF0YVZpZXcodSxjLnB0ciw1KSx3PWIuZ2V0VWludDgoMCk7ZysrO3ZhciBPPXc+PjYsRT1PPT09MD80OjMtTyxUPSh3JjMyKT4wLEM9dyYzMSxOPTA7aWYoRT09PTEpTj1iLmdldFVpbnQ4KGcpLGcrKztlbHNlIGlmKEU9PT0yKU49Yi5nZXRVaW50MTYoZywhMCksZys9MjtlbHNlIGlmKEU9PT00KU49Yi5nZXRVaW50MzIoZywhMCksZys9NDtlbHNlIHRocm93IkludmFsaWQgdmFsaWQgcGl4ZWwgY291bnQgdHlwZSI7dmFyIEk9MiptLm1heFpFcnJvcixELHYsTCxVLEEsUyxQLEIsaixILGs9bS5udW1EaW1zPjE/bS5tYXhWYWx1ZXNbZF06bS56TWF4O2lmKFQpe2ZvcihjLmNvdW50ZXIubHV0KyssQj1iLmdldFVpbnQ4KGcpLGo9QyxnKyssVT1NYXRoLmNlaWwoKEItMSkqQy84KSxBPU1hdGguY2VpbChVLzQpLHY9bmV3IEFycmF5QnVmZmVyKEEqNCksTD1uZXcgVWludDhBcnJheSh2KSxjLnB0cis9ZyxMLnNldChuZXcgVWludDhBcnJheSh1LGMucHRyLFUpKSxQPW5ldyBVaW50MzJBcnJheSh2KSxjLnB0cis9VSxIPTA7Qi0xPj4+SDspSCsrO1U9TWF0aC5jZWlsKE4qSC84KSxBPU1hdGguY2VpbChVLzQpLHY9bmV3IEFycmF5QnVmZmVyKEEqNCksTD1uZXcgVWludDhBcnJheSh2KSxMLnNldChuZXcgVWludDhBcnJheSh1LGMucHRyLFUpKSxEPW5ldyBVaW50MzJBcnJheSh2KSxjLnB0cis9VSxfPj0zP1M9ci51bnN0dWZmTFVUMihQLEMsQi0xLHAsSSxrKTpTPXIudW5zdHVmZkxVVChQLEMsQi0xLHAsSSxrKSxfPj0zP3IudW5zdHVmZjIoRCxsLEgsTixTKTpyLnVuc3R1ZmYoRCxsLEgsTixTKX1lbHNlIGMuY291bnRlci5iaXRzdHVmZmVyKyssSD1DLGMucHRyKz1nLEg+MCYmKFU9TWF0aC5jZWlsKE4qSC84KSxBPU1hdGguY2VpbChVLzQpLHY9bmV3IEFycmF5QnVmZmVyKEEqNCksTD1uZXcgVWludDhBcnJheSh2KSxMLnNldChuZXcgVWludDhBcnJheSh1LGMucHRyLFUpKSxEPW5ldyBVaW50MzJBcnJheSh2KSxjLnB0cis9VSxfPj0zP3A9PW51bGw/ci5vcmlnaW5hbFVuc3R1ZmYyKEQsbCxILE4pOnIudW5zdHVmZjIoRCxsLEgsTiwhMSxwLEksayk6cD09bnVsbD9yLm9yaWdpbmFsVW5zdHVmZihELGwsSCxOKTpyLnVuc3R1ZmYoRCxsLEgsTiwhMSxwLEksaykpfX0scmVhZFRpbGVzOmZ1bmN0aW9uKHUsYyxsKXt2YXIgcD1jLmhlYWRlckluZm8sZD1wLndpZHRoLG09cC5oZWlnaHQsXz1wLm1pY3JvQmxvY2tTaXplLGc9cC5pbWFnZVR5cGUsYj1pLmdldERhdGFUeXBlU2l6ZShnKSx3PU1hdGguY2VpbChkL18pLE89TWF0aC5jZWlsKG0vXyk7Yy5waXhlbHMubnVtQmxvY2tzWT1PLGMucGl4ZWxzLm51bUJsb2Nrc1g9dyxjLnBpeGVscy5wdHI9MDt2YXIgRT0wLFQ9MCxDPTAsTj0wLEk9MCxEPTAsdj0wLEw9MCxVPTAsQT0wLFM9MCxQPTAsQj0wLGo9MCxIPTAsaz0wLEssWCxSLG90LGN0LHB0LHl0PW5ldyBsKF8qXykscnQ9bSVffHxfLFB0PWQlX3x8XyxndCxDdCxtdD1wLm51bURpbXMsdXQsdnQ9Yy5waXhlbHMucmVzdWx0TWFzayx6dD1jLnBpeGVscy5yZXN1bHRQaXhlbHM7Zm9yKEM9MDtDPE87QysrKWZvcihJPUMhPT1PLTE/XzpydCxOPTA7Tjx3O04rKylmb3IoRD1OIT09dy0xP186UHQsUz1DKmQqXytOKl8sUD1kLUQsdXQ9MDt1dDxtdDt1dCsrKXtpZihtdD4xJiYoenQ9bmV3IGwoYy5waXhlbHMucmVzdWx0UGl4ZWxzLmJ1ZmZlcixkKm0qdXQqYixkKm0pKSx2PXUuYnl0ZUxlbmd0aC1jLnB0cixLPW5ldyBEYXRhVmlldyh1LGMucHRyLE1hdGgubWluKDEwLHYpKSxYPXt9LGs9MCxMPUsuZ2V0VWludDgoMCksaysrLFU9TD4+NiYyNTUsQT1MPj4yJjE1LEEhPT0oTipfPj4zJjE1KSl0aHJvdyJpbnRlZ3JpdHkgaXNzdWUiO2lmKHB0PUwmMyxwdD4zKXRocm93IGMucHRyKz1rLCJJbnZhbGlkIGJsb2NrIGVuY29kaW5nICgiK3B0KyIpIjtpZihwdD09PTIpe2MuY291bnRlci5jb25zdGFudCsrLGMucHRyKz1rO2NvbnRpbnVlfWVsc2UgaWYocHQ9PT0wKXtpZihjLmNvdW50ZXIudW5jb21wcmVzc2VkKyssYy5wdHIrPWssQj1JKkQqYixqPXUuYnl0ZUxlbmd0aC1jLnB0cixCPUI8aj9COmosUj1uZXcgQXJyYXlCdWZmZXIoQiViPT09MD9COkIrYi1CJWIpLG90PW5ldyBVaW50OEFycmF5KFIpLG90LnNldChuZXcgVWludDhBcnJheSh1LGMucHRyLEIpKSxjdD1uZXcgbChSKSxIPTAsdnQpZm9yKEU9MDtFPEk7RSsrKXtmb3IoVD0wO1Q8RDtUKyspdnRbU10mJih6dFtTXT1jdFtIKytdKSxTKys7Uys9UH1lbHNlIGZvcihFPTA7RTxJO0UrKyl7Zm9yKFQ9MDtUPEQ7VCsrKXp0W1MrK109Y3RbSCsrXTtTKz1QfWMucHRyKz1IKmJ9ZWxzZSBpZihndD1pLmdldERhdGFUeXBlVXNlZChnLFUpLEN0PWkuZ2V0T25lUGl4ZWwoWCxrLGd0LEspLGsrPWkuZ2V0RGF0YVR5cGVTaXplKGd0KSxwdD09PTMpaWYoYy5wdHIrPWssYy5jb3VudGVyLmNvbnN0YW50b2Zmc2V0KyssdnQpZm9yKEU9MDtFPEk7RSsrKXtmb3IoVD0wO1Q8RDtUKyspdnRbU10mJih6dFtTXT1DdCksUysrO1MrPVB9ZWxzZSBmb3IoRT0wO0U8STtFKyspe2ZvcihUPTA7VDxEO1QrKyl6dFtTKytdPUN0O1MrPVB9ZWxzZSBpZihjLnB0cis9ayxpLmRlY29kZUJpdHModSxjLHl0LEN0LHV0KSxrPTAsdnQpZm9yKEU9MDtFPEk7RSsrKXtmb3IoVD0wO1Q8RDtUKyspdnRbU10mJih6dFtTXT15dFtrKytdKSxTKys7Uys9UH1lbHNlIGZvcihFPTA7RTxJO0UrKyl7Zm9yKFQ9MDtUPEQ7VCsrKXp0W1MrK109eXRbaysrXTtTKz1QfX19LGZvcm1hdEZpbGVJbmZvOmZ1bmN0aW9uKHUpe3JldHVybntmaWxlSWRlbnRpZmllclN0cmluZzp1LmhlYWRlckluZm8uZmlsZUlkZW50aWZpZXJTdHJpbmcsZmlsZVZlcnNpb246dS5oZWFkZXJJbmZvLmZpbGVWZXJzaW9uLGltYWdlVHlwZTp1LmhlYWRlckluZm8uaW1hZ2VUeXBlLGhlaWdodDp1LmhlYWRlckluZm8uaGVpZ2h0LHdpZHRoOnUuaGVhZGVySW5mby53aWR0aCxudW1WYWxpZFBpeGVsOnUuaGVhZGVySW5mby5udW1WYWxpZFBpeGVsLG1pY3JvQmxvY2tTaXplOnUuaGVhZGVySW5mby5taWNyb0Jsb2NrU2l6ZSxibG9iU2l6ZTp1LmhlYWRlckluZm8uYmxvYlNpemUsbWF4WkVycm9yOnUuaGVhZGVySW5mby5tYXhaRXJyb3IscGl4ZWxUeXBlOmkuZ2V0UGl4ZWxUeXBlKHUuaGVhZGVySW5mby5pbWFnZVR5cGUpLGVvZk9mZnNldDp1LmVvZk9mZnNldCxtYXNrOnUubWFzaz97bnVtQnl0ZXM6dS5tYXNrLm51bUJ5dGVzfTpudWxsLHBpeGVsczp7bnVtQmxvY2tzWDp1LnBpeGVscy5udW1CbG9ja3NYLG51bUJsb2Nrc1k6dS5waXhlbHMubnVtQmxvY2tzWSxtYXhWYWx1ZTp1LmhlYWRlckluZm8uek1heCxtaW5WYWx1ZTp1LmhlYWRlckluZm8uek1pbixub0RhdGFWYWx1ZTp1Lm5vRGF0YVZhbHVlfX19LGNvbnN0cnVjdENvbnN0YW50U3VyZmFjZTpmdW5jdGlvbih1KXt2YXIgYz11LmhlYWRlckluZm8uek1heCxsPXUuaGVhZGVySW5mby5udW1EaW1zLHA9dS5oZWFkZXJJbmZvLmhlaWdodCp1LmhlYWRlckluZm8ud2lkdGgsZD1wKmwsbT0wLF89MCxnPTAsYj11LnBpeGVscy5yZXN1bHRNYXNrO2lmKGIpaWYobD4xKWZvcihtPTA7bTxsO20rKylmb3IoZz1tKnAsXz0wO188cDtfKyspYltfXSYmKHUucGl4ZWxzLnJlc3VsdFBpeGVsc1tnK19dPWMpO2Vsc2UgZm9yKF89MDtfPHA7XysrKWJbX10mJih1LnBpeGVscy5yZXN1bHRQaXhlbHNbX109Yyk7ZWxzZSBpZih1LnBpeGVscy5yZXN1bHRQaXhlbHMuZmlsbCl1LnBpeGVscy5yZXN1bHRQaXhlbHMuZmlsbChjKTtlbHNlIGZvcihfPTA7XzxkO18rKyl1LnBpeGVscy5yZXN1bHRQaXhlbHNbX109Y30sZ2V0RGF0YVR5cGVBcnJheTpmdW5jdGlvbih1KXt2YXIgYztzd2l0Y2godSl7Y2FzZSAwOmM9SW50OEFycmF5O2JyZWFrO2Nhc2UgMTpjPVVpbnQ4QXJyYXk7YnJlYWs7Y2FzZSAyOmM9SW50MTZBcnJheTticmVhaztjYXNlIDM6Yz1VaW50MTZBcnJheTticmVhaztjYXNlIDQ6Yz1JbnQzMkFycmF5O2JyZWFrO2Nhc2UgNTpjPVVpbnQzMkFycmF5O2JyZWFrO2Nhc2UgNjpjPUZsb2F0MzJBcnJheTticmVhaztjYXNlIDc6Yz1GbG9hdDY0QXJyYXk7YnJlYWs7ZGVmYXVsdDpjPUZsb2F0MzJBcnJheX1yZXR1cm4gY30sZ2V0UGl4ZWxUeXBlOmZ1bmN0aW9uKHUpe3ZhciBjO3N3aXRjaCh1KXtjYXNlIDA6Yz0iUzgiO2JyZWFrO2Nhc2UgMTpjPSJVOCI7YnJlYWs7Y2FzZSAyOmM9IlMxNiI7YnJlYWs7Y2FzZSAzOmM9IlUxNiI7YnJlYWs7Y2FzZSA0OmM9IlMzMiI7YnJlYWs7Y2FzZSA1OmM9IlUzMiI7YnJlYWs7Y2FzZSA2OmM9IkYzMiI7YnJlYWs7Y2FzZSA3OmM9IkY2NCI7YnJlYWs7ZGVmYXVsdDpjPSJGMzIifXJldHVybiBjfSxpc1ZhbGlkUGl4ZWxWYWx1ZTpmdW5jdGlvbih1LGMpe2lmKGM9PW51bGwpcmV0dXJuITE7dmFyIGw7c3dpdGNoKHUpe2Nhc2UgMDpsPWM+PS0xMjgmJmM8PTEyNzticmVhaztjYXNlIDE6bD1jPj0wJiZjPD0yNTU7YnJlYWs7Y2FzZSAyOmw9Yz49LTMyNzY4JiZjPD0zMjc2NzticmVhaztjYXNlIDM6bD1jPj0wJiZjPD02NTUzNjticmVhaztjYXNlIDQ6bD1jPj0tMjE0NzQ4MzY0OCYmYzw9MjE0NzQ4MzY0NzticmVhaztjYXNlIDU6bD1jPj0wJiZjPD00Mjk0OTY3Mjk2O2JyZWFrO2Nhc2UgNjpsPWM+PS0zNDAyNzk5OTM4NzkwMTQ4NGUyMiYmYzw9MzQwMjc5OTkzODc5MDE0ODRlMjI7YnJlYWs7Y2FzZSA3Omw9Yz49NWUtMzI0JiZjPD0xNzk3NjkzMTM0ODYyMzE1N2UyOTI7YnJlYWs7ZGVmYXVsdDpsPSExfXJldHVybiBsfSxnZXREYXRhVHlwZVNpemU6ZnVuY3Rpb24odSl7dmFyIGM9MDtzd2l0Y2godSl7Y2FzZSAwOmNhc2UgMTpjPTE7YnJlYWs7Y2FzZSAyOmNhc2UgMzpjPTI7YnJlYWs7Y2FzZSA0OmNhc2UgNTpjYXNlIDY6Yz00O2JyZWFrO2Nhc2UgNzpjPTg7YnJlYWs7ZGVmYXVsdDpjPXV9cmV0dXJuIGN9LGdldERhdGFUeXBlVXNlZDpmdW5jdGlvbih1LGMpe3ZhciBsPXU7c3dpdGNoKHUpe2Nhc2UgMjpjYXNlIDQ6bD11LWM7YnJlYWs7Y2FzZSAzOmNhc2UgNTpsPXUtMipjO2JyZWFrO2Nhc2UgNjpjPT09MD9sPXU6Yz09PTE/bD0yOmw9MTticmVhaztjYXNlIDc6Yz09PTA/bD11Omw9dS0yKmMrMTticmVhaztkZWZhdWx0Omw9dTticmVha31yZXR1cm4gbH0sZ2V0T25lUGl4ZWw6ZnVuY3Rpb24odSxjLGwscCl7dmFyIGQ9MDtzd2l0Y2gobCl7Y2FzZSAwOmQ9cC5nZXRJbnQ4KGMpO2JyZWFrO2Nhc2UgMTpkPXAuZ2V0VWludDgoYyk7YnJlYWs7Y2FzZSAyOmQ9cC5nZXRJbnQxNihjLCEwKTticmVhaztjYXNlIDM6ZD1wLmdldFVpbnQxNihjLCEwKTticmVhaztjYXNlIDQ6ZD1wLmdldEludDMyKGMsITApO2JyZWFrO2Nhc2UgNTpkPXAuZ2V0VUludDMyKGMsITApO2JyZWFrO2Nhc2UgNjpkPXAuZ2V0RmxvYXQzMihjLCEwKTticmVhaztjYXNlIDc6ZD1wLmdldEZsb2F0NjQoYywhMCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyJ0aGUgZGVjb2RlciBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoaXMgcGl4ZWwgdHlwZSJ9cmV0dXJuIGR9fSxzPWZ1bmN0aW9uKHUsYyxsKXt0aGlzLnZhbD11LHRoaXMubGVmdD1jLHRoaXMucmlnaHQ9bH0sZj17ZGVjb2RlOmZ1bmN0aW9uKHUsYyl7Yz1jfHx7fTt2YXIgbD1jLm5vRGF0YVZhbHVlLHA9MCxkPXt9O2lmKGQucHRyPWMuaW5wdXRPZmZzZXR8fDAsZC5waXhlbHM9e30sISFpLnJlYWRIZWFkZXJJbmZvKHUsZCkpe3ZhciBtPWQuaGVhZGVySW5mbyxfPW0uZmlsZVZlcnNpb24sZz1pLmdldERhdGFUeXBlQXJyYXkobS5pbWFnZVR5cGUpO2kucmVhZE1hc2sodSxkKSxtLm51bVZhbGlkUGl4ZWwhPT1tLndpZHRoKm0uaGVpZ2h0JiYhZC5waXhlbHMucmVzdWx0TWFzayYmKGQucGl4ZWxzLnJlc3VsdE1hc2s9Yy5tYXNrRGF0YSk7dmFyIGI9bS53aWR0aCptLmhlaWdodDtpZihkLnBpeGVscy5yZXN1bHRQaXhlbHM9bmV3IGcoYiptLm51bURpbXMpLGQuY291bnRlcj17b25lc3dlZXA6MCx1bmNvbXByZXNzZWQ6MCxsdXQ6MCxiaXRzdHVmZmVyOjAsY29uc3RhbnQ6MCxjb25zdGFudG9mZnNldDowfSxtLm51bVZhbGlkUGl4ZWwhPT0wKWlmKG0uek1heD09PW0uek1pbilpLmNvbnN0cnVjdENvbnN0YW50U3VyZmFjZShkKTtlbHNlIGlmKF8+PTQmJmkuY2hlY2tNaW5NYXhSYW5nZXModSxkKSlpLmNvbnN0cnVjdENvbnN0YW50U3VyZmFjZShkKTtlbHNle3ZhciB3PW5ldyBEYXRhVmlldyh1LGQucHRyLDIpLE89dy5nZXRVaW50OCgwKTtpZihkLnB0cisrLE8paS5yZWFkRGF0YU9uZVN3ZWVwKHUsZCxnKTtlbHNlIGlmKF8+MSYmbS5pbWFnZVR5cGU8PTEmJk1hdGguYWJzKG0ubWF4WkVycm9yLS41KTwxZS01KXt2YXIgRT13LmdldFVpbnQ4KDEpO2lmKGQucHRyKyssZC5lbmNvZGVNb2RlPUUsRT4yfHxfPDQmJkU+MSl0aHJvdyJJbnZhbGlkIEh1ZmZtYW4gZmxhZyAiK0U7RT9pLnJlYWRIdWZmbWFuKHUsZCxnKTppLnJlYWRUaWxlcyh1LGQsZyl9ZWxzZSBpLnJlYWRUaWxlcyh1LGQsZyl9ZC5lb2ZPZmZzZXQ9ZC5wdHI7dmFyIFQ7Yy5pbnB1dE9mZnNldD8oVD1kLmhlYWRlckluZm8uYmxvYlNpemUrYy5pbnB1dE9mZnNldC1kLnB0cixNYXRoLmFicyhUKT49MSYmKGQuZW9mT2Zmc2V0PWMuaW5wdXRPZmZzZXQrZC5oZWFkZXJJbmZvLmJsb2JTaXplKSk6KFQ9ZC5oZWFkZXJJbmZvLmJsb2JTaXplLWQucHRyLE1hdGguYWJzKFQpPj0xJiYoZC5lb2ZPZmZzZXQ9ZC5oZWFkZXJJbmZvLmJsb2JTaXplKSk7dmFyIEM9e3dpZHRoOm0ud2lkdGgsaGVpZ2h0Om0uaGVpZ2h0LHBpeGVsRGF0YTpkLnBpeGVscy5yZXN1bHRQaXhlbHMsbWluVmFsdWU6bS56TWluLG1heFZhbHVlOm0uek1heCx2YWxpZFBpeGVsQ291bnQ6bS5udW1WYWxpZFBpeGVsLGRpbUNvdW50Om0ubnVtRGltcyxkaW1TdGF0czp7bWluVmFsdWVzOm0ubWluVmFsdWVzLG1heFZhbHVlczptLm1heFZhbHVlc30sbWFza0RhdGE6ZC5waXhlbHMucmVzdWx0TWFza307aWYoZC5waXhlbHMucmVzdWx0TWFzayYmaS5pc1ZhbGlkUGl4ZWxWYWx1ZShtLmltYWdlVHlwZSxsKSl7dmFyIE49ZC5waXhlbHMucmVzdWx0TWFzaztmb3IocD0wO3A8YjtwKyspTltwXXx8KEMucGl4ZWxEYXRhW3BdPWwpO0Mubm9EYXRhVmFsdWU9bH1yZXR1cm4gZC5ub0RhdGFWYWx1ZT1sLGMucmV0dXJuRmlsZUluZm8mJihDLmZpbGVJbmZvPWkuZm9ybWF0RmlsZUluZm8oZCkpLEN9fSxnZXRCYW5kQ291bnQ6ZnVuY3Rpb24odSl7dmFyIGM9MCxsPTAscD17fTtmb3IocC5wdHI9MCxwLnBpeGVscz17fTtsPHUuYnl0ZUxlbmd0aC01ODspaS5yZWFkSGVhZGVySW5mbyh1LHApLGwrPXAuaGVhZGVySW5mby5ibG9iU2l6ZSxjKysscC5wdHI9bDtyZXR1cm4gY319O3JldHVybiBmfSgpLG49ZnVuY3Rpb24oKXt2YXIgcj1uZXcgQXJyYXlCdWZmZXIoNCksaT1uZXcgVWludDhBcnJheShyKSxzPW5ldyBVaW50MzJBcnJheShyKTtyZXR1cm4gc1swXT0xLGlbMF09PT0xfSgpLG89e2RlY29kZTpmdW5jdGlvbihyLGkpe2lmKCFuKXRocm93IkJpZyBlbmRpYW4gc3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQuIjtpPWl8fHt9O3ZhciBzPWkuaW5wdXRPZmZzZXR8fDAsZj1uZXcgVWludDhBcnJheShyLHMsMTApLHU9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGYpLGMsbDtpZih1LnRyaW0oKT09PSJDbnRaSW1hZ2UiKWM9dCxsPTE7ZWxzZSBpZih1LnN1YnN0cmluZygwLDUpPT09IkxlcmMyIiljPWUsbD0yO2Vsc2UgdGhyb3ciVW5leHBlY3RlZCBmaWxlIGlkZW50aWZpZXIgc3RyaW5nOiAiK3U7Zm9yKHZhciBwPTAsZD1yLmJ5dGVMZW5ndGgtMTAsbSxfPVtdLGcsYix3PXt3aWR0aDowLGhlaWdodDowLHBpeGVsczpbXSxwaXhlbFR5cGU6aS5waXhlbFR5cGUsbWFzazpudWxsLHN0YXRpc3RpY3M6W119O3M8ZDspe3ZhciBPPWMuZGVjb2RlKHIse2lucHV0T2Zmc2V0OnMsZW5jb2RlZE1hc2tEYXRhOm0sbWFza0RhdGE6YixyZXR1cm5NYXNrOnA9PT0wLHJldHVybkVuY29kZWRNYXNrOnA9PT0wLHJldHVybkZpbGVJbmZvOiEwLHBpeGVsVHlwZTppLnBpeGVsVHlwZXx8bnVsbCxub0RhdGFWYWx1ZTppLm5vRGF0YVZhbHVlfHxudWxsfSk7cz1PLmZpbGVJbmZvLmVvZk9mZnNldCxwPT09MCYmKG09Ty5lbmNvZGVkTWFza0RhdGEsYj1PLm1hc2tEYXRhLHcud2lkdGg9Ty53aWR0aCx3LmhlaWdodD1PLmhlaWdodCx3LmRpbUNvdW50PU8uZGltQ291bnR8fDEsdy5waXhlbFR5cGU9Ty5waXhlbFR5cGV8fE8uZmlsZUluZm8ucGl4ZWxUeXBlLHcubWFzaz1PLm1hc2tEYXRhKSxsPjEmJk8uZmlsZUluZm8ubWFzayYmTy5maWxlSW5mby5tYXNrLm51bUJ5dGVzPjAmJl8ucHVzaChPLm1hc2tEYXRhKSxwKyssdy5waXhlbHMucHVzaChPLnBpeGVsRGF0YSksdy5zdGF0aXN0aWNzLnB1c2goe21pblZhbHVlOk8ubWluVmFsdWUsbWF4VmFsdWU6Ty5tYXhWYWx1ZSxub0RhdGFWYWx1ZTpPLm5vRGF0YVZhbHVlLGRpbVN0YXRzOk8uZGltU3RhdHN9KX12YXIgRSxULEM7aWYobD4xJiZfLmxlbmd0aD4xKXtmb3IoQz13LndpZHRoKncuaGVpZ2h0LHcuYmFuZE1hc2tzPV8sYj1uZXcgVWludDhBcnJheShDKSxiLnNldChfWzBdKSxFPTE7RTxfLmxlbmd0aDtFKyspZm9yKGc9X1tFXSxUPTA7VDxDO1QrKyliW1RdPWJbVF0mZ1tUXTt3Lm1hc2tEYXRhPWJ9cmV0dXJuIHd9fTt0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kP2RlZmluZShbXSxmdW5jdGlvbigpe3JldHVybiBvfSk6dHlwZW9mIFhkPCJ1IiYmWGQuZXhwb3J0cz9YZC5leHBvcnRzPW86dGhpcy5MZXJjPW99KSgpfSk7dmFyIHVnPXt9O2RlKHVnLHtkZWZhdWx0OigpPT5tVX0pO2Z1bmN0aW9uIGRVKHQsZSl7aWYodC5lbmNvZGluZz09PUtSLkxFUkMpe2xldCByO3RyeXtyPVpSLmRlZmF1bHQuZGVjb2RlKHQuaGVpZ2h0bWFwKX1jYXRjaChzKXt0aHJvdyBuZXcgQWUocyl9aWYoci5zdGF0aXN0aWNzWzBdLm1pblZhbHVlPT09TnVtYmVyLk1BWF9WQUxVRSl0aHJvdyBuZXcgQWUoIkludmFsaWQgdGlsZSBkYXRhIik7dC5oZWlnaHRtYXA9ci5waXhlbHNbMF0sdC53aWR0aD1yLndpZHRoLHQuaGVpZ2h0PXIuaGVpZ2h0fXQuZWxsaXBzb2lkPSQuY2xvbmUodC5lbGxpcHNvaWQpLHQucmVjdGFuZ2xlPU50LmNsb25lKHQucmVjdGFuZ2xlKTtsZXQgbj1YUi5jb21wdXRlVmVydGljZXModCksbz1uLnZlcnRpY2VzO3JldHVybiBlLnB1c2goby5idWZmZXIpLHt2ZXJ0aWNlczpvLmJ1ZmZlcixudW1iZXJPZkF0dHJpYnV0ZXM6bi5lbmNvZGluZy5zdHJpZGUsbWluaW11bUhlaWdodDpuLm1pbmltdW1IZWlnaHQsbWF4aW11bUhlaWdodDpuLm1heGltdW1IZWlnaHQsZ3JpZFdpZHRoOnQud2lkdGgsZ3JpZEhlaWdodDp0LmhlaWdodCxib3VuZGluZ1NwaGVyZTNEOm4uYm91bmRpbmdTcGhlcmUzRCxvcmllbnRlZEJvdW5kaW5nQm94Om4ub3JpZW50ZWRCb3VuZGluZ0JveCxvY2NsdWRlZVBvaW50SW5TY2FsZWRTcGFjZTpuLm9jY2x1ZGVlUG9pbnRJblNjYWxlZFNwYWNlLGVuY29kaW5nOm4uZW5jb2Rpbmcsd2VzdEluZGljZXNTb3V0aFRvTm9ydGg6bi53ZXN0SW5kaWNlc1NvdXRoVG9Ob3J0aCxzb3V0aEluZGljZXNFYXN0VG9XZXN0Om4uc291dGhJbmRpY2VzRWFzdFRvV2VzdCxlYXN0SW5kaWNlc05vcnRoVG9Tb3V0aDpuLmVhc3RJbmRpY2VzTm9ydGhUb1NvdXRoLG5vcnRoSW5kaWNlc1dlc3RUb0Vhc3Q6bi5ub3J0aEluZGljZXNXZXN0VG9FYXN0fX12YXIgWlIsbVUsbGc9WigoKT0+e1p0KCk7V1IoKTtZUigpO3duKCk7SnIoKTtaUj1ycigkUigpLDEpO3NvKCk7bVU9UWUoZFUpfSk7ZnVuY3Rpb24gVm8oKXtGLnRocm93SW5zdGFudGlhdGlvbkVycm9yKCl9ZnVuY3Rpb24gZTIodCxlKXtsZXQgbj1uZXcgQXJyYXkoZSksbz1uZXcgQXJyYXkodCkscj1uZXcgQXJyYXkoZSksaT1uZXcgQXJyYXkodCkscztmb3Iocz0wO3M8dDsrK3MpaVtzXT1zLG9bc109dCplLTEtcztmb3Iocz0wO3M8ZTsrK3MpcltzXT0ocysxKSp0LTEsbltzXT0oZS1zLTEpKnQ7cmV0dXJue3dlc3RJbmRpY2VzU291dGhUb05vcnRoOm4sc291dGhJbmRpY2VzRWFzdFRvV2VzdDpvLGVhc3RJbmRpY2VzTm9ydGhUb1NvdXRoOnIsbm9ydGhJbmRpY2VzV2VzdFRvRWFzdDppfX1mdW5jdGlvbiBuMih0LGUsbixvKXtsZXQgcj0wO2ZvcihsZXQgaT0wO2k8ZS0xOysraSl7Zm9yKGxldCBzPTA7czx0LTE7KytzKXtsZXQgZj1yLHU9Zit0LGM9dSsxLGw9ZisxO25bbysrXT1mLG5bbysrXT11LG5bbysrXT1sLG5bbysrXT1sLG5bbysrXT11LG5bbysrXT1jLCsrcn0rK3J9fWZ1bmN0aW9uIFlkKHQsZSxuLG8pe2xldCByPXRbMF0saT10Lmxlbmd0aDtmb3IobGV0IHM9MTtzPGk7KytzKXtsZXQgZj10W3NdO25bbysrXT1yLG5bbysrXT1mLG5bbysrXT1lLG5bbysrXT1lLG5bbysrXT1mLG5bbysrXT1lKzEscj1mLCsrZX1yZXR1cm4gb312YXIgUVIsSlIsdDIsbzIscjI9WigoKT0+e2Z0KCk7SHQoKTskZSgpO1d0KCk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoVm8ucHJvdG90eXBlLHtlcnJvckV2ZW50OntnZXQ6Ri50aHJvd0luc3RhbnRpYXRpb25FcnJvcn0sY3JlZGl0OntnZXQ6Ri50aHJvd0luc3RhbnRpYXRpb25FcnJvcn0sdGlsaW5nU2NoZW1lOntnZXQ6Ri50aHJvd0luc3RhbnRpYXRpb25FcnJvcn0saGFzV2F0ZXJNYXNrOntnZXQ6Ri50aHJvd0luc3RhbnRpYXRpb25FcnJvcn0saGFzVmVydGV4Tm9ybWFsczp7Z2V0OkYudGhyb3dJbnN0YW50aWF0aW9uRXJyb3J9LGF2YWlsYWJpbGl0eTp7Z2V0OkYudGhyb3dJbnN0YW50aWF0aW9uRXJyb3J9fSk7UVI9W107Vm8uZ2V0UmVndWxhckdyaWRJbmRpY2VzPWZ1bmN0aW9uKHQsZSl7aWYodCplPj1NLkZPVVJfR0lHQUJZVEVTKXRocm93IG5ldyBGKCJUaGUgdG90YWwgbnVtYmVyIG9mIHZlcnRpY2VzICh3aWR0aCAqIGhlaWdodCkgbXVzdCBiZSBsZXNzIHRoYW4gNCwyOTQsOTY3LDI5Ni4iKTtsZXQgbj1RUlt0XTtoKG4pfHwoUVJbdF09bj1bXSk7bGV0IG89bltlXTtyZXR1cm4gaChvKXx8KHQqZTxNLlNJWFRZX0ZPVVJfS0lMT0JZVEVTP289bltlXT1uZXcgVWludDE2QXJyYXkoKHQtMSkqKGUtMSkqNik6bz1uW2VdPW5ldyBVaW50MzJBcnJheSgodC0xKSooZS0xKSo2KSxuMih0LGUsbywwKSksb307SlI9W107Vm8uZ2V0UmVndWxhckdyaWRJbmRpY2VzQW5kRWRnZUluZGljZXM9ZnVuY3Rpb24odCxlKXtpZih0KmU+PU0uRk9VUl9HSUdBQllURVMpdGhyb3cgbmV3IEYoIlRoZSB0b3RhbCBudW1iZXIgb2YgdmVydGljZXMgKHdpZHRoICogaGVpZ2h0KSBtdXN0IGJlIGxlc3MgdGhhbiA0LDI5NCw5NjcsMjk2LiIpO2xldCBuPUpSW3RdO2gobil8fChKUlt0XT1uPVtdKTtsZXQgbz1uW2VdO2lmKCFoKG8pKXtsZXQgcj1Wby5nZXRSZWd1bGFyR3JpZEluZGljZXModCxlKSxpPWUyKHQsZSkscz1pLndlc3RJbmRpY2VzU291dGhUb05vcnRoLGY9aS5zb3V0aEluZGljZXNFYXN0VG9XZXN0LHU9aS5lYXN0SW5kaWNlc05vcnRoVG9Tb3V0aCxjPWkubm9ydGhJbmRpY2VzV2VzdFRvRWFzdDtvPW5bZV09e2luZGljZXM6cix3ZXN0SW5kaWNlc1NvdXRoVG9Ob3J0aDpzLHNvdXRoSW5kaWNlc0Vhc3RUb1dlc3Q6ZixlYXN0SW5kaWNlc05vcnRoVG9Tb3V0aDp1LG5vcnRoSW5kaWNlc1dlc3RUb0Vhc3Q6Y319cmV0dXJuIG99O3QyPVtdO1ZvLmdldFJlZ3VsYXJHcmlkQW5kU2tpcnRJbmRpY2VzQW5kRWRnZUluZGljZXM9ZnVuY3Rpb24odCxlKXtpZih0KmU+PU0uRk9VUl9HSUdBQllURVMpdGhyb3cgbmV3IEYoIlRoZSB0b3RhbCBudW1iZXIgb2YgdmVydGljZXMgKHdpZHRoICogaGVpZ2h0KSBtdXN0IGJlIGxlc3MgdGhhbiA0LDI5NCw5NjcsMjk2LiIpO2xldCBuPXQyW3RdO2gobil8fCh0Mlt0XT1uPVtdKTtsZXQgbz1uW2VdO2lmKCFoKG8pKXtsZXQgcj10KmUsaT0odC0xKSooZS0xKSo2LHM9dCoyK2UqMixmPU1hdGgubWF4KDAscy00KSo2LHU9citzLGM9aStmLGw9ZTIodCxlKSxwPWwud2VzdEluZGljZXNTb3V0aFRvTm9ydGgsZD1sLnNvdXRoSW5kaWNlc0Vhc3RUb1dlc3QsbT1sLmVhc3RJbmRpY2VzTm9ydGhUb1NvdXRoLF89bC5ub3J0aEluZGljZXNXZXN0VG9FYXN0LGc9RHQuY3JlYXRlVHlwZWRBcnJheSh1LGMpO24yKHQsZSxnLDApLFZvLmFkZFNraXJ0SW5kaWNlcyhwLGQsbSxfLHIsZyxpKSxvPW5bZV09e2luZGljZXM6Zyx3ZXN0SW5kaWNlc1NvdXRoVG9Ob3J0aDpwLHNvdXRoSW5kaWNlc0Vhc3RUb1dlc3Q6ZCxlYXN0SW5kaWNlc05vcnRoVG9Tb3V0aDptLG5vcnRoSW5kaWNlc1dlc3RUb0Vhc3Q6XyxpbmRleENvdW50V2l0aG91dFNraXJ0czppfX1yZXR1cm4gb307Vm8uYWRkU2tpcnRJbmRpY2VzPWZ1bmN0aW9uKHQsZSxuLG8scixpLHMpe2xldCBmPXI7cz1ZZCh0LGYsaSxzKSxmKz10Lmxlbmd0aCxzPVlkKGUsZixpLHMpLGYrPWUubGVuZ3RoLHM9WWQobixmLGkscyksZis9bi5sZW5ndGgsWWQobyxmLGkscyl9O1ZvLmhlaWdodG1hcFRlcnJhaW5RdWFsaXR5PS4yNTtWby5nZXRFc3RpbWF0ZWRMZXZlbFplcm9HZW9tZXRyaWNFcnJvckZvckFIZWlnaHRtYXA9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0Lm1heGltdW1SYWRpdXMqMipNYXRoLlBJKlZvLmhlaWdodG1hcFRlcnJhaW5RdWFsaXR5LyhlKm4pfTtWby5wcm90b3R5cGUucmVxdWVzdFRpbGVHZW9tZXRyeT1GLnRocm93SW5zdGFudGlhdGlvbkVycm9yO1ZvLnByb3RvdHlwZS5nZXRMZXZlbE1heGltdW1HZW9tZXRyaWNFcnJvcj1GLnRocm93SW5zdGFudGlhdGlvbkVycm9yO1ZvLnByb3RvdHlwZS5nZXRUaWxlRGF0YUF2YWlsYWJsZT1GLnRocm93SW5zdGFudGlhdGlvbkVycm9yO1ZvLnByb3RvdHlwZS5sb2FkVGlsZURhdGFBdmFpbGFiaWxpdHk9Ri50aHJvd0luc3RhbnRpYXRpb25FcnJvcjtvMj1Wb30pO3ZhciBkZz17fTtkZShkZyx7ZGVmYXVsdDooKT0+Z1V9KTtmdW5jdGlvbiB5VSh0LGUpe2xldCBuPXQucXVhbnRpemVkVmVydGljZXMsbz1uLmxlbmd0aC8zLHI9dC5vY3RFbmNvZGVkTm9ybWFscyxpPXQud2VzdEluZGljZXMubGVuZ3RoK3QuZWFzdEluZGljZXMubGVuZ3RoK3Quc291dGhJbmRpY2VzLmxlbmd0aCt0Lm5vcnRoSW5kaWNlcy5sZW5ndGgscz10LmluY2x1ZGVXZWJNZXJjYXRvclQsZj10LmV4YWdnZXJhdGlvbix1PXQuZXhhZ2dlcmF0aW9uUmVsYXRpdmVIZWlnaHQsbD1mIT09MSxwPU50LmNsb25lKHQucmVjdGFuZ2xlKSxkPXAud2VzdCxtPXAuc291dGgsXz1wLmVhc3QsZz1wLm5vcnRoLGI9JC5jbG9uZSh0LmVsbGlwc29pZCksdz10Lm1pbmltdW1IZWlnaHQsTz10Lm1heGltdW1IZWlnaHQsRT10LnJlbGF0aXZlVG9DZW50ZXIsVD1Zby5lYXN0Tm9ydGhVcFRvRml4ZWRGcmFtZShFLGIpLEM9c3QuaW52ZXJzZVRyYW5zZm9ybWF0aW9uKFQsbmV3IHN0KSxOLEk7cyYmKE49ZW8uZ2VvZGV0aWNMYXRpdHVkZVRvTWVyY2F0b3JBbmdsZShtKSxJPTEvKGVvLmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGUoZyktTikpO2xldCBEPW4uc3ViYXJyYXkoMCxvKSx2PW4uc3ViYXJyYXkobywyKm8pLEw9bi5zdWJhcnJheShvKjIsMypvKSxVPWgociksQT1uZXcgQXJyYXkobyksUz1uZXcgQXJyYXkobyksUD1uZXcgQXJyYXkobyksQj1zP25ldyBBcnJheShvKTpbXSxqPWw/bmV3IEFycmF5KG8pOltdLEg9aFU7SC54PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxILnk9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLEguej1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7bGV0IGs9X1U7ay54PU51bWJlci5ORUdBVElWRV9JTkZJTklUWSxrLnk9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLGsuej1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7bGV0IEs9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFg9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLFI9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLG90PU51bWJlci5ORUdBVElWRV9JTkZJTklUWTtmb3IobGV0ICR0PTA7JHQ8bzsrKyR0KXtsZXQgR2U9RFskdF0sZG49dlskdF0sc249R2UvcGcsbW49ZG4vcGcsZm89TS5sZXJwKHcsTyxMWyR0XS9wZyk7JG4ubG9uZ2l0dWRlPU0ubGVycChkLF8sc24pLCRuLmxhdGl0dWRlPU0ubGVycChtLGcsbW4pLCRuLmhlaWdodD1mbyxLPU1hdGgubWluKCRuLmxvbmdpdHVkZSxLKSxYPU1hdGgubWF4KCRuLmxvbmdpdHVkZSxYKSxSPU1hdGgubWluKCRuLmxhdGl0dWRlLFIpLG90PU1hdGgubWF4KCRuLmxhdGl0dWRlLG90KTtsZXQgSG49Yi5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbigkbik7QVskdF09bmV3IHR0KHNuLG1uKSxTWyR0XT1mbyxQWyR0XT1IbixzJiYoQlskdF09KGVvLmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGUoJG4ubGF0aXR1ZGUpLU4pKkkpLGwmJihqWyR0XT1iLmdlb2RldGljU3VyZmFjZU5vcm1hbChIbikpLHN0Lm11bHRpcGx5QnlQb2ludChDLEhuLGN1KSxhLm1pbmltdW1CeUNvbXBvbmVudChjdSxILEgpLGEubWF4aW11bUJ5Q29tcG9uZW50KGN1LGssayl9bGV0IGN0PVFkKHQud2VzdEluZGljZXMsZnVuY3Rpb24oJHQsR2Upe3JldHVybiBBWyR0XS55LUFbR2VdLnl9KSxwdD1RZCh0LmVhc3RJbmRpY2VzLGZ1bmN0aW9uKCR0LEdlKXtyZXR1cm4gQVtHZV0ueS1BWyR0XS55fSkseXQ9UWQodC5zb3V0aEluZGljZXMsZnVuY3Rpb24oJHQsR2Upe3JldHVybiBBW0dlXS54LUFbJHRdLnh9KSxydD1RZCh0Lm5vcnRoSW5kaWNlcyxmdW5jdGlvbigkdCxHZSl7cmV0dXJuIEFbJHRdLngtQVtHZV0ueH0pLFB0O3c8MCYmKFB0PW5ldyB4cyhiKS5jb21wdXRlSG9yaXpvbkN1bGxpbmdQb2ludFBvc3NpYmx5VW5kZXJFbGxpcHNvaWQoRSxQLHcpKTtsZXQgZ3Q9dztndD1NYXRoLm1pbihndCwkZCh0Lndlc3RJbmRpY2VzLHQud2VzdFNraXJ0SGVpZ2h0LFMsQSxwLGIsQyxILGspKSxndD1NYXRoLm1pbihndCwkZCh0LnNvdXRoSW5kaWNlcyx0LnNvdXRoU2tpcnRIZWlnaHQsUyxBLHAsYixDLEgsaykpLGd0PU1hdGgubWluKGd0LCRkKHQuZWFzdEluZGljZXMsdC5lYXN0U2tpcnRIZWlnaHQsUyxBLHAsYixDLEgsaykpLGd0PU1hdGgubWluKGd0LCRkKHQubm9ydGhJbmRpY2VzLHQubm9ydGhTa2lydEhlaWdodCxTLEEscCxiLEMsSCxrKSk7bGV0IEN0PW5ldyBEaShILGssRSksbXQ9bmV3IFBzKEUsQ3QsZ3QsTyxULFUscyxsLGYsdSksdXQ9bXQuc3RyaWRlLHZ0PW8qdXQraSp1dCx6dD1uZXcgRmxvYXQzMkFycmF5KHZ0KSxtZT0wO2ZvcihsZXQgJHQ9MDskdDxvOysrJHQpe2lmKFUpe2xldCBHZT0kdCoyO1VhLng9cltHZV0sVWEueT1yW0dlKzFdfW1lPW10LmVuY29kZSh6dCxtZSxQWyR0XSxBWyR0XSxTWyR0XSxVYSxCWyR0XSxqWyR0XSl9bGV0IGNlPU1hdGgubWF4KDAsKGktNCkqMikscGU9dC5pbmRpY2VzLmxlbmd0aCtjZSozLHVlPUR0LmNyZWF0ZVR5cGVkQXJyYXkobytpLHBlKTt1ZS5zZXQodC5pbmRpY2VzLDApO2xldCBRdD0xZS00LEp0PShYLUspKlF0LHhlPShvdC1SKSpRdCxnZT0tSnQsRWU9MCx1bj1KdCxrZT0wLGJlPTAsbG49eGUscG49MCxPbj0teGUscmU9byp1dDtyZXR1cm4gWmQoenQscmUsY3QsbXQsUyxBLHIsYixwLHQud2VzdFNraXJ0SGVpZ2h0LE4sSSxnZSxFZSkscmUrPXQud2VzdEluZGljZXMubGVuZ3RoKnV0LFpkKHp0LHJlLHl0LG10LFMsQSxyLGIscCx0LnNvdXRoU2tpcnRIZWlnaHQsTixJLHBuLE9uKSxyZSs9dC5zb3V0aEluZGljZXMubGVuZ3RoKnV0LFpkKHp0LHJlLHB0LG10LFMsQSxyLGIscCx0LmVhc3RTa2lydEhlaWdodCxOLEksdW4sa2UpLHJlKz10LmVhc3RJbmRpY2VzLmxlbmd0aCp1dCxaZCh6dCxyZSxydCxtdCxTLEEscixiLHAsdC5ub3J0aFNraXJ0SGVpZ2h0LE4sSSxiZSxsbiksbzIuYWRkU2tpcnRJbmRpY2VzKGN0LHl0LHB0LHJ0LG8sdWUsdC5pbmRpY2VzLmxlbmd0aCksZS5wdXNoKHp0LmJ1ZmZlcix1ZS5idWZmZXIpLHt2ZXJ0aWNlczp6dC5idWZmZXIsaW5kaWNlczp1ZS5idWZmZXIsd2VzdEluZGljZXNTb3V0aFRvTm9ydGg6Y3Qsc291dGhJbmRpY2VzRWFzdFRvV2VzdDp5dCxlYXN0SW5kaWNlc05vcnRoVG9Tb3V0aDpwdCxub3J0aEluZGljZXNXZXN0VG9FYXN0OnJ0LHZlcnRleFN0cmlkZTp1dCxjZW50ZXI6RSxtaW5pbXVtSGVpZ2h0OncsbWF4aW11bUhlaWdodDpPLG9jY2x1ZGVlUG9pbnRJblNjYWxlZFNwYWNlOlB0LGVuY29kaW5nOm10LGluZGV4Q291bnRXaXRob3V0U2tpcnRzOnQuaW5kaWNlcy5sZW5ndGh9fWZ1bmN0aW9uICRkKHQsZSxuLG8scixpLHMsZix1KXtsZXQgYz1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksbD1yLm5vcnRoLHA9ci5zb3V0aCxkPXIuZWFzdCxtPXIud2VzdDtkPG0mJihkKz1NLlRXT19QSSk7bGV0IF89dC5sZW5ndGg7Zm9yKGxldCBnPTA7ZzxfOysrZyl7bGV0IGI9dFtnXSx3PW5bYl0sTz1vW2JdOyRuLmxvbmdpdHVkZT1NLmxlcnAobSxkLE8ueCksJG4ubGF0aXR1ZGU9TS5sZXJwKHAsbCxPLnkpLCRuLmhlaWdodD13LWU7bGV0IEU9aS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbigkbixjdSk7c3QubXVsdGlwbHlCeVBvaW50KHMsRSxFKSxhLm1pbmltdW1CeUNvbXBvbmVudChFLGYsZiksYS5tYXhpbXVtQnlDb21wb25lbnQoRSx1LHUpLGM9TWF0aC5taW4oYywkbi5oZWlnaHQpfXJldHVybiBjfWZ1bmN0aW9uIFpkKHQsZSxuLG8scixpLHMsZix1LGMsbCxwLGQsbSl7bGV0IF89aChzKSxnPXUubm9ydGgsYj11LnNvdXRoLHc9dS5lYXN0LE89dS53ZXN0O3c8TyYmKHcrPU0uVFdPX1BJKTtsZXQgRT1uLmxlbmd0aDtmb3IobGV0IFQ9MDtUPEU7KytUKXtsZXQgQz1uW1RdLE49cltDXSxJPWlbQ107JG4ubG9uZ2l0dWRlPU0ubGVycChPLHcsSS54KStkLCRuLmxhdGl0dWRlPU0ubGVycChiLGcsSS55KSttLCRuLmhlaWdodD1OLWM7bGV0IEQ9Zi5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbigkbixjdSk7aWYoXyl7bGV0IFU9QyoyO1VhLng9c1tVXSxVYS55PXNbVSsxXX1sZXQgdjtvLmhhc1dlYk1lcmNhdG9yVCYmKHY9KGVvLmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGUoJG4ubGF0aXR1ZGUpLWwpKnApO2xldCBMO28uaGFzR2VvZGV0aWNTdXJmYWNlTm9ybWFscyYmKEw9Zi5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoRCkpLGU9by5lbmNvZGUodCxlLEQsSSwkbi5oZWlnaHQsVWEsdixMKX19ZnVuY3Rpb24gUWQodCxlKXtsZXQgbjtyZXR1cm4gdHlwZW9mIHQuc2xpY2U9PSJmdW5jdGlvbiImJihuPXQuc2xpY2UoKSx0eXBlb2Ygbi5zb3J0IT0iZnVuY3Rpb24iJiYobj12b2lkIDApKSxoKG4pfHwobj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0KSksbi5zb3J0KGUpLG59dmFyIHBnLGN1LGhVLF9VLCRuLFVhLGdVLG1nPVooKCk9Pnt4ZigpO0ZlKCk7RnQoKTtQZSgpO2Z0KCk7WnQoKTtydSgpOyRlKCk7V3QoKTtCbigpO3duKCk7aXUoKTtyMigpO2NzKCk7aWMoKTtzbygpO3BnPTMyNzY3LGN1PW5ldyBhLGhVPW5ldyBhLF9VPW5ldyBhLCRuPW5ldyBhdCxVYT1uZXcgdHQ7Z1U9UWUoeVUpfSk7ZnVuY3Rpb24gQVUodCxlKXtyZXR1cm4gTS5lcXVhbHNFcHNpbG9uKHQubGF0aXR1ZGUsZS5sYXRpdHVkZSxNLkVQU0lMT04xMCkmJk0uZXF1YWxzRXBzaWxvbih0LmxvbmdpdHVkZSxlLmxvbmdpdHVkZSxNLkVQU0lMT04xMCl9ZnVuY3Rpb24gVFUodCxlLG4sbyl7ZT1DbihlLGEuZXF1YWxzRXBzaWxvbik7bGV0IHI9ZS5sZW5ndGg7aWYocjwyKXJldHVybjtsZXQgaT1oKG8pLHM9aChuKSxmPW5ldyBBcnJheShyKSx1PW5ldyBBcnJheShyKSxjPW5ldyBBcnJheShyKSxsPWVbMF07ZlswXT1sO2xldCBwPXQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMobCxiVSk7cyYmKHAuaGVpZ2h0PW5bMF0pLHVbMF09cC5oZWlnaHQsaT9jWzBdPW9bMF06Y1swXT0wO2xldCBkPXVbMF0sbT1jWzBdLF89ZD09PW0sZz0xO2ZvcihsZXQgYj0xO2I8cjsrK2Ipe2xldCB3PWVbYl0sTz10LmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKHcsd1UpO3MmJihPLmhlaWdodD1uW2JdKSxfPV8mJk8uaGVpZ2h0PT09MCxBVShwLE8pP3AuaGVpZ2h0PE8uaGVpZ2h0JiYodVtnLTFdPU8uaGVpZ2h0KTooZltnXT13LHVbZ109Ty5oZWlnaHQsaT9jW2ddPW9bYl06Y1tnXT0wLF89XyYmdVtnXT09PWNbZ10sYXQuY2xvbmUoTyxwKSwrK2cpfWlmKCEoX3x8ZzwyKSlyZXR1cm4gZi5sZW5ndGg9Zyx1Lmxlbmd0aD1nLGMubGVuZ3RoPWcse3Bvc2l0aW9uczpmLHRvcEhlaWdodHM6dSxib3R0b21IZWlnaHRzOmN9fXZhciBpMixiVSx3VSxPVSxFVSxSVSxKZCxoZz1aKCgpPT57anIoKTtGdCgpO1BlKCk7ZnQoKTtXdCgpO3lhKCk7aTI9e307YlU9bmV3IGF0LHdVPW5ldyBhdDtPVT1uZXcgQXJyYXkoMiksRVU9bmV3IEFycmF5KDIpLFJVPXtwb3NpdGlvbnM6dm9pZCAwLGhlaWdodDp2b2lkIDAsZ3JhbnVsYXJpdHk6dm9pZCAwLGVsbGlwc29pZDp2b2lkIDB9O2kyLmNvbXB1dGVQb3NpdGlvbnM9ZnVuY3Rpb24odCxlLG4sbyxyLGkpe2xldCBzPVRVKHQsZSxuLG8pO2lmKCFoKHMpKXJldHVybjtlPXMucG9zaXRpb25zLG49cy50b3BIZWlnaHRzLG89cy5ib3R0b21IZWlnaHRzO2xldCBmPWUubGVuZ3RoLHU9Zi0yLGMsbCxwPU0uY2hvcmRMZW5ndGgocix0Lm1heGltdW1SYWRpdXMpLGQ9UlU7aWYoZC5taW5EaXN0YW5jZT1wLGQuZWxsaXBzb2lkPXQsaSl7bGV0IG09MCxfO2ZvcihfPTA7XzxmLTE7XysrKW0rPWduLm51bWJlck9mUG9pbnRzKGVbX10sZVtfKzFdLHApKzE7Yz1uZXcgRmxvYXQ2NEFycmF5KG0qMyksbD1uZXcgRmxvYXQ2NEFycmF5KG0qMyk7bGV0IGc9T1UsYj1FVTtkLnBvc2l0aW9ucz1nLGQuaGVpZ2h0PWI7bGV0IHc9MDtmb3IoXz0wO188Zi0xO18rKyl7Z1swXT1lW19dLGdbMV09ZVtfKzFdLGJbMF09bltfXSxiWzFdPW5bXysxXTtsZXQgTz1nbi5nZW5lcmF0ZUFyYyhkKTtjLnNldChPLHcpLGJbMF09b1tfXSxiWzFdPW9bXysxXSxsLnNldChnbi5nZW5lcmF0ZUFyYyhkKSx3KSx3Kz1PLmxlbmd0aH19ZWxzZSBkLnBvc2l0aW9ucz1lLGQuaGVpZ2h0PW4sYz1uZXcgRmxvYXQ2NEFycmF5KGduLmdlbmVyYXRlQXJjKGQpKSxkLmhlaWdodD1vLGw9bmV3IEZsb2F0NjRBcnJheShnbi5nZW5lcmF0ZUFyYyhkKSk7cmV0dXJue2JvdHRvbVBvc2l0aW9uczpsLHRvcFBvc2l0aW9uczpjLG51bUNvcm5lcnM6dX19O0pkPWkyfSk7ZnVuY3Rpb24gRWModCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXQucG9zaXRpb25zLG49dC5tYXhpbXVtSGVpZ2h0cyxvPXQubWluaW11bUhlaWdodHM7aWYoIWgoZSkpdGhyb3cgbmV3IEYoIm9wdGlvbnMucG9zaXRpb25zIGlzIHJlcXVpcmVkLiIpO2lmKGgobikmJm4ubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEYoIm9wdGlvbnMucG9zaXRpb25zIGFuZCBvcHRpb25zLm1heGltdW1IZWlnaHRzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGguIik7aWYoaChvKSYmby5sZW5ndGghPT1lLmxlbmd0aCl0aHJvdyBuZXcgRigib3B0aW9ucy5wb3NpdGlvbnMgYW5kIG9wdGlvbnMubWluaW11bUhlaWdodHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aC4iKTtsZXQgcj14KHQudmVydGV4Rm9ybWF0LGR0LkRFRkFVTFQpLGk9eCh0LmdyYW51bGFyaXR5LE0uUkFESUFOU19QRVJfREVHUkVFKSxzPXgodC5lbGxpcHNvaWQsJC5XR1M4NCk7dGhpcy5fcG9zaXRpb25zPWUsdGhpcy5fbWluaW11bUhlaWdodHM9byx0aGlzLl9tYXhpbXVtSGVpZ2h0cz1uLHRoaXMuX3ZlcnRleEZvcm1hdD1kdC5jbG9uZShyKSx0aGlzLl9ncmFudWxhcml0eT1pLHRoaXMuX2VsbGlwc29pZD0kLmNsb25lKHMpLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZVdhbGxHZW9tZXRyeSI7bGV0IGY9MStlLmxlbmd0aCphLnBhY2tlZExlbmd0aCsyO2gobykmJihmKz1vLmxlbmd0aCksaChuKSYmKGYrPW4ubGVuZ3RoKSx0aGlzLnBhY2tlZExlbmd0aD1mKyQucGFja2VkTGVuZ3RoK2R0LnBhY2tlZExlbmd0aCsxfXZhciBfZyx0bSxTVSxzMixDVSx4VSxQVSxjMixhMixhdSx5ZyxmMj1aKCgpPT57TWUoKTtGdCgpO0xlKCk7SXQoKTtmdCgpO0h0KCk7WnQoKTtYZSgpO1llKCk7YW4oKTskZSgpO1d0KCk7dG4oKTtFbygpO2hnKCk7X2c9bmV3IGEsdG09bmV3IGEsU1U9bmV3IGEsczI9bmV3IGEsQ1U9bmV3IGEseFU9bmV3IGEsUFU9bmV3IGE7RWMucGFjaz1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEYoInZhbHVlIGlzIHJlcXVpcmVkIik7aWYoIWgoZSkpdGhyb3cgbmV3IEYoImFycmF5IGlzIHJlcXVpcmVkIik7bj14KG4sMCk7bGV0IG8scj10Ll9wb3NpdGlvbnMsaT1yLmxlbmd0aDtmb3IoZVtuKytdPWksbz0wO288aTsrK28sbis9YS5wYWNrZWRMZW5ndGgpYS5wYWNrKHJbb10sZSxuKTtsZXQgcz10Ll9taW5pbXVtSGVpZ2h0cztpZihpPWgocyk/cy5sZW5ndGg6MCxlW24rK109aSxoKHMpKWZvcihvPTA7bzxpOysrbyllW24rK109c1tvXTtsZXQgZj10Ll9tYXhpbXVtSGVpZ2h0cztpZihpPWgoZik/Zi5sZW5ndGg6MCxlW24rK109aSxoKGYpKWZvcihvPTA7bzxpOysrbyllW24rK109ZltvXTtyZXR1cm4gJC5wYWNrKHQuX2VsbGlwc29pZCxlLG4pLG4rPSQucGFja2VkTGVuZ3RoLGR0LnBhY2sodC5fdmVydGV4Rm9ybWF0LGUsbiksbis9ZHQucGFja2VkTGVuZ3RoLGVbbl09dC5fZ3JhbnVsYXJpdHksZX07YzI9JC5jbG9uZSgkLlVOSVRfU1BIRVJFKSxhMj1uZXcgZHQsYXU9e3Bvc2l0aW9uczp2b2lkIDAsbWluaW11bUhlaWdodHM6dm9pZCAwLG1heGltdW1IZWlnaHRzOnZvaWQgMCxlbGxpcHNvaWQ6YzIsdmVydGV4Rm9ybWF0OmEyLGdyYW51bGFyaXR5OnZvaWQgMH07RWMudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgRigiYXJyYXkgaXMgcmVxdWlyZWQiKTtlPXgoZSwwKTtsZXQgbyxyPXRbZSsrXSxpPW5ldyBBcnJheShyKTtmb3Iobz0wO288cjsrK28sZSs9YS5wYWNrZWRMZW5ndGgpaVtvXT1hLnVucGFjayh0LGUpO3I9dFtlKytdO2xldCBzO2lmKHI+MClmb3Iocz1uZXcgQXJyYXkociksbz0wO288cjsrK28pc1tvXT10W2UrK107cj10W2UrK107bGV0IGY7aWYocj4wKWZvcihmPW5ldyBBcnJheShyKSxvPTA7bzxyOysrbylmW29dPXRbZSsrXTtsZXQgdT0kLnVucGFjayh0LGUsYzIpO2UrPSQucGFja2VkTGVuZ3RoO2xldCBjPWR0LnVucGFjayh0LGUsYTIpO2UrPWR0LnBhY2tlZExlbmd0aDtsZXQgbD10W2VdO3JldHVybiBoKG4pPyhuLl9wb3NpdGlvbnM9aSxuLl9taW5pbXVtSGVpZ2h0cz1zLG4uX21heGltdW1IZWlnaHRzPWYsbi5fZWxsaXBzb2lkPSQuY2xvbmUodSxuLl9lbGxpcHNvaWQpLG4uX3ZlcnRleEZvcm1hdD1kdC5jbG9uZShjLG4uX3ZlcnRleEZvcm1hdCksbi5fZ3JhbnVsYXJpdHk9bCxuKTooYXUucG9zaXRpb25zPWksYXUubWluaW11bUhlaWdodHM9cyxhdS5tYXhpbXVtSGVpZ2h0cz1mLGF1LmdyYW51bGFyaXR5PWwsbmV3IEVjKGF1KSl9O0VjLmZyb21Db25zdGFudEhlaWdodHM9ZnVuY3Rpb24odCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXQucG9zaXRpb25zO2lmKCFoKGUpKXRocm93IG5ldyBGKCJvcHRpb25zLnBvc2l0aW9ucyBpcyByZXF1aXJlZC4iKTtsZXQgbixvLHI9dC5taW5pbXVtSGVpZ2h0LGk9dC5tYXhpbXVtSGVpZ2h0LHM9aChyKSxmPWgoaSk7aWYoc3x8Zil7bGV0IGM9ZS5sZW5ndGg7bj1zP25ldyBBcnJheShjKTp2b2lkIDAsbz1mP25ldyBBcnJheShjKTp2b2lkIDA7Zm9yKGxldCBsPTA7bDxjOysrbClzJiYobltsXT1yKSxmJiYob1tsXT1pKX1sZXQgdT17cG9zaXRpb25zOmUsbWF4aW11bUhlaWdodHM6byxtaW5pbXVtSGVpZ2h0czpuLGVsbGlwc29pZDp0LmVsbGlwc29pZCx2ZXJ0ZXhGb3JtYXQ6dC52ZXJ0ZXhGb3JtYXR9O3JldHVybiBuZXcgRWModSl9O0VjLmNyZWF0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQpe2xldCBlPXQuX3Bvc2l0aW9ucyxuPXQuX21pbmltdW1IZWlnaHRzLG89dC5fbWF4aW11bUhlaWdodHMscj10Ll92ZXJ0ZXhGb3JtYXQsaT10Ll9ncmFudWxhcml0eSxzPXQuX2VsbGlwc29pZCxmPUpkLmNvbXB1dGVQb3NpdGlvbnMocyxlLG8sbixpLCEwKTtpZighaChmKSlyZXR1cm47bGV0IHU9Zi5ib3R0b21Qb3NpdGlvbnMsYz1mLnRvcFBvc2l0aW9ucyxsPWYubnVtQ29ybmVycyxwPWMubGVuZ3RoLGQ9cCoyLG09ci5wb3NpdGlvbj9uZXcgRmxvYXQ2NEFycmF5KGQpOnZvaWQgMCxfPXIubm9ybWFsP25ldyBGbG9hdDMyQXJyYXkoZCk6dm9pZCAwLGc9ci50YW5nZW50P25ldyBGbG9hdDMyQXJyYXkoZCk6dm9pZCAwLGI9ci5iaXRhbmdlbnQ/bmV3IEZsb2F0MzJBcnJheShkKTp2b2lkIDAsdz1yLnN0P25ldyBGbG9hdDMyQXJyYXkoZC8zKjIpOnZvaWQgMCxPPTAsRT0wLFQ9MCxDPTAsTj0wLEk9UFUsRD14VSx2PUNVLEw9ITA7cC89MztsZXQgVSxBPTAsUz0xLyhwLWwtMSk7Zm9yKFU9MDtVPHA7KytVKXtsZXQgaz1VKjMsSz1hLmZyb21BcnJheShjLGssX2cpLFg9YS5mcm9tQXJyYXkodSxrLHRtKTtpZihyLnBvc2l0aW9uJiYobVtPKytdPVgueCxtW08rK109WC55LG1bTysrXT1YLnosbVtPKytdPUsueCxtW08rK109Sy55LG1bTysrXT1LLnopLHIuc3QmJih3W04rK109QSx3W04rK109MCx3W04rK109QSx3W04rK109MSksci5ub3JtYWx8fHIudGFuZ2VudHx8ci5iaXRhbmdlbnQpe2xldCBSPWEuY2xvbmUoYS5aRVJPLHMyKSxvdD1hLnN1YnRyYWN0KEsscy5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoSyx0bSksdG0pO2lmKFUrMTxwJiYoUj1hLmZyb21BcnJheShjLGsrMyxzMikpLEwpe2xldCBjdD1hLnN1YnRyYWN0KFIsSyxTVSkscHQ9YS5zdWJ0cmFjdChvdCxLLF9nKTtJPWEubm9ybWFsaXplKGEuY3Jvc3MocHQsY3QsSSksSSksTD0hMX1hLmVxdWFsc0Vwc2lsb24oSyxSLE0uRVBTSUxPTjEwKT9MPSEwOihBKz1TLHIudGFuZ2VudCYmKEQ9YS5ub3JtYWxpemUoYS5zdWJ0cmFjdChSLEssRCksRCkpLHIuYml0YW5nZW50JiYodj1hLm5vcm1hbGl6ZShhLmNyb3NzKEksRCx2KSx2KSkpLHIubm9ybWFsJiYoX1tFKytdPUkueCxfW0UrK109SS55LF9bRSsrXT1JLnosX1tFKytdPUkueCxfW0UrK109SS55LF9bRSsrXT1JLnopLHIudGFuZ2VudCYmKGdbQysrXT1ELngsZ1tDKytdPUQueSxnW0MrK109RC56LGdbQysrXT1ELngsZ1tDKytdPUQueSxnW0MrK109RC56KSxyLmJpdGFuZ2VudCYmKGJbVCsrXT12LngsYltUKytdPXYueSxiW1QrK109di56LGJbVCsrXT12LngsYltUKytdPXYueSxiW1QrK109di56KX19bGV0IFA9bmV3IGllO3IucG9zaXRpb24mJihQLnBvc2l0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6bX0pKSxyLm5vcm1hbCYmKFAubm9ybWFsPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpffSkpLHIudGFuZ2VudCYmKFAudGFuZ2VudD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6Z30pKSxyLmJpdGFuZ2VudCYmKFAuYml0YW5nZW50PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpifSkpLHIuc3QmJihQLnN0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZToyLHZhbHVlczp3fSkpO2xldCBCPWQvMztkLT02KihsKzEpO2xldCBqPUR0LmNyZWF0ZVR5cGVkQXJyYXkoQixkKSxIPTA7Zm9yKFU9MDtVPEItMjtVKz0yKXtsZXQgaz1VLEs9VSsyLFg9YS5mcm9tQXJyYXkobSxrKjMsX2cpLFI9YS5mcm9tQXJyYXkobSxLKjMsdG0pO2lmKGEuZXF1YWxzRXBzaWxvbihYLFIsTS5FUFNJTE9OMTApKWNvbnRpbnVlO2xldCBvdD1VKzEsY3Q9VSszO2pbSCsrXT1vdCxqW0grK109ayxqW0grK109Y3QsaltIKytdPWN0LGpbSCsrXT1rLGpbSCsrXT1LfXJldHVybiBuZXcgVXQoe2F0dHJpYnV0ZXM6UCxpbmRpY2VzOmoscHJpbWl0aXZlVHlwZTpCdC5UUklBTkdMRVMsYm91bmRpbmdTcGhlcmU6bmV3IEF0LmZyb21WZXJ0aWNlcyhtKX0pfTt5Zz1FY30pO3ZhciBnZz17fTtkZShnZyx7ZGVmYXVsdDooKT0+TlV9KTtmdW5jdGlvbiBNVSh0LGUpe3JldHVybiBoKGUpJiYodD15Zy51bnBhY2sodCxlKSksdC5fZWxsaXBzb2lkPSQuY2xvbmUodC5fZWxsaXBzb2lkKSx5Zy5jcmVhdGVHZW9tZXRyeSh0KX12YXIgTlUsQWc9WigoKT0+e2Z0KCk7WnQoKTtmMigpO05VPU1VfSk7ZnVuY3Rpb24gUmModCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXQucG9zaXRpb25zLG49dC5tYXhpbXVtSGVpZ2h0cyxvPXQubWluaW11bUhlaWdodHM7aWYoIWgoZSkpdGhyb3cgbmV3IEYoIm9wdGlvbnMucG9zaXRpb25zIGlzIHJlcXVpcmVkLiIpO2lmKGgobikmJm4ubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEYoIm9wdGlvbnMucG9zaXRpb25zIGFuZCBvcHRpb25zLm1heGltdW1IZWlnaHRzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGguIik7aWYoaChvKSYmby5sZW5ndGghPT1lLmxlbmd0aCl0aHJvdyBuZXcgRigib3B0aW9ucy5wb3NpdGlvbnMgYW5kIG9wdGlvbnMubWluaW11bUhlaWdodHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aC4iKTtsZXQgcj14KHQuZ3JhbnVsYXJpdHksTS5SQURJQU5TX1BFUl9ERUdSRUUpLGk9eCh0LmVsbGlwc29pZCwkLldHUzg0KTt0aGlzLl9wb3NpdGlvbnM9ZSx0aGlzLl9taW5pbXVtSGVpZ2h0cz1vLHRoaXMuX21heGltdW1IZWlnaHRzPW4sdGhpcy5fZ3JhbnVsYXJpdHk9cix0aGlzLl9lbGxpcHNvaWQ9JC5jbG9uZShpKSx0aGlzLl93b3JrZXJOYW1lPSJjcmVhdGVXYWxsT3V0bGluZUdlb21ldHJ5IjtsZXQgcz0xK2UubGVuZ3RoKmEucGFja2VkTGVuZ3RoKzI7aChvKSYmKHMrPW8ubGVuZ3RoKSxoKG4pJiYocys9bi5sZW5ndGgpLHRoaXMucGFja2VkTGVuZ3RoPXMrJC5wYWNrZWRMZW5ndGgrMX12YXIgdTIsbDIscDIsZnUsYmcsZDI9WigoKT0+e01lKCk7RnQoKTtMZSgpO0l0KCk7ZnQoKTtIdCgpO1p0KCk7WGUoKTtZZSgpO2FuKCk7JGUoKTtXdCgpO3RuKCk7aGcoKTt1Mj1uZXcgYSxsMj1uZXcgYTtSYy5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgRigidmFsdWUgaXMgcmVxdWlyZWQiKTtpZighaChlKSl0aHJvdyBuZXcgRigiYXJyYXkgaXMgcmVxdWlyZWQiKTtuPXgobiwwKTtsZXQgbyxyPXQuX3Bvc2l0aW9ucyxpPXIubGVuZ3RoO2ZvcihlW24rK109aSxvPTA7bzxpOysrbyxuKz1hLnBhY2tlZExlbmd0aClhLnBhY2socltvXSxlLG4pO2xldCBzPXQuX21pbmltdW1IZWlnaHRzO2lmKGk9aChzKT9zLmxlbmd0aDowLGVbbisrXT1pLGgocykpZm9yKG89MDtvPGk7KytvKWVbbisrXT1zW29dO2xldCBmPXQuX21heGltdW1IZWlnaHRzO2lmKGk9aChmKT9mLmxlbmd0aDowLGVbbisrXT1pLGgoZikpZm9yKG89MDtvPGk7KytvKWVbbisrXT1mW29dO3JldHVybiAkLnBhY2sodC5fZWxsaXBzb2lkLGUsbiksbis9JC5wYWNrZWRMZW5ndGgsZVtuXT10Ll9ncmFudWxhcml0eSxlfTtwMj0kLmNsb25lKCQuVU5JVF9TUEhFUkUpLGZ1PXtwb3NpdGlvbnM6dm9pZCAwLG1pbmltdW1IZWlnaHRzOnZvaWQgMCxtYXhpbXVtSGVpZ2h0czp2b2lkIDAsZWxsaXBzb2lkOnAyLGdyYW51bGFyaXR5OnZvaWQgMH07UmMudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgRigiYXJyYXkgaXMgcmVxdWlyZWQiKTtlPXgoZSwwKTtsZXQgbyxyPXRbZSsrXSxpPW5ldyBBcnJheShyKTtmb3Iobz0wO288cjsrK28sZSs9YS5wYWNrZWRMZW5ndGgpaVtvXT1hLnVucGFjayh0LGUpO3I9dFtlKytdO2xldCBzO2lmKHI+MClmb3Iocz1uZXcgQXJyYXkociksbz0wO288cjsrK28pc1tvXT10W2UrK107cj10W2UrK107bGV0IGY7aWYocj4wKWZvcihmPW5ldyBBcnJheShyKSxvPTA7bzxyOysrbylmW29dPXRbZSsrXTtsZXQgdT0kLnVucGFjayh0LGUscDIpO2UrPSQucGFja2VkTGVuZ3RoO2xldCBjPXRbZV07cmV0dXJuIGgobik/KG4uX3Bvc2l0aW9ucz1pLG4uX21pbmltdW1IZWlnaHRzPXMsbi5fbWF4aW11bUhlaWdodHM9ZixuLl9lbGxpcHNvaWQ9JC5jbG9uZSh1LG4uX2VsbGlwc29pZCksbi5fZ3JhbnVsYXJpdHk9YyxuKTooZnUucG9zaXRpb25zPWksZnUubWluaW11bUhlaWdodHM9cyxmdS5tYXhpbXVtSGVpZ2h0cz1mLGZ1LmdyYW51bGFyaXR5PWMsbmV3IFJjKGZ1KSl9O1JjLmZyb21Db25zdGFudEhlaWdodHM9ZnVuY3Rpb24odCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXQucG9zaXRpb25zO2lmKCFoKGUpKXRocm93IG5ldyBGKCJvcHRpb25zLnBvc2l0aW9ucyBpcyByZXF1aXJlZC4iKTtsZXQgbixvLHI9dC5taW5pbXVtSGVpZ2h0LGk9dC5tYXhpbXVtSGVpZ2h0LHM9aChyKSxmPWgoaSk7aWYoc3x8Zil7bGV0IGM9ZS5sZW5ndGg7bj1zP25ldyBBcnJheShjKTp2b2lkIDAsbz1mP25ldyBBcnJheShjKTp2b2lkIDA7Zm9yKGxldCBsPTA7bDxjOysrbClzJiYobltsXT1yKSxmJiYob1tsXT1pKX1sZXQgdT17cG9zaXRpb25zOmUsbWF4aW11bUhlaWdodHM6byxtaW5pbXVtSGVpZ2h0czpuLGVsbGlwc29pZDp0LmVsbGlwc29pZH07cmV0dXJuIG5ldyBSYyh1KX07UmMuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fcG9zaXRpb25zLG49dC5fbWluaW11bUhlaWdodHMsbz10Ll9tYXhpbXVtSGVpZ2h0cyxyPXQuX2dyYW51bGFyaXR5LGk9dC5fZWxsaXBzb2lkLHM9SmQuY29tcHV0ZVBvc2l0aW9ucyhpLGUsbyxuLHIsITEpO2lmKCFoKHMpKXJldHVybjtsZXQgZj1zLmJvdHRvbVBvc2l0aW9ucyx1PXMudG9wUG9zaXRpb25zLGM9dS5sZW5ndGgsbD1jKjIscD1uZXcgRmxvYXQ2NEFycmF5KGwpLGQ9MDtjLz0zO2xldCBtO2ZvcihtPTA7bTxjOysrbSl7bGV0IE89bSozLEU9YS5mcm9tQXJyYXkodSxPLHUyKSxUPWEuZnJvbUFycmF5KGYsTyxsMik7cFtkKytdPVQueCxwW2QrK109VC55LHBbZCsrXT1ULnoscFtkKytdPUUueCxwW2QrK109RS55LHBbZCsrXT1FLnp9bGV0IF89bmV3IGllKHtwb3NpdGlvbjpuZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkRPVUJMRSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOnB9KX0pLGc9bC8zO2w9MipnLTQrZztsZXQgYj1EdC5jcmVhdGVUeXBlZEFycmF5KGcsbCksdz0wO2ZvcihtPTA7bTxnLTI7bSs9Mil7bGV0IE89bSxFPW0rMixUPWEuZnJvbUFycmF5KHAsTyozLHUyKSxDPWEuZnJvbUFycmF5KHAsRSozLGwyKTtpZihhLmVxdWFsc0Vwc2lsb24oVCxDLE0uRVBTSUxPTjEwKSljb250aW51ZTtsZXQgTj1tKzEsST1tKzM7Ylt3KytdPU4sYlt3KytdPU8sYlt3KytdPU4sYlt3KytdPUksYlt3KytdPU8sYlt3KytdPUV9cmV0dXJuIGJbdysrXT1nLTIsYlt3KytdPWctMSxuZXcgVXQoe2F0dHJpYnV0ZXM6XyxpbmRpY2VzOmIscHJpbWl0aXZlVHlwZTpCdC5MSU5FUyxib3VuZGluZ1NwaGVyZTpuZXcgQXQuZnJvbVZlcnRpY2VzKHApfSl9O2JnPVJjfSk7dmFyIHdnPXt9O2RlKHdnLHtkZWZhdWx0OigpPT52VX0pO2Z1bmN0aW9uIElVKHQsZSl7cmV0dXJuIGgoZSkmJih0PWJnLnVucGFjayh0LGUpKSx0Ll9lbGxpcHNvaWQ9JC5jbG9uZSh0Ll9lbGxpcHNvaWQpLGJnLmNyZWF0ZUdlb21ldHJ5KHQpfXZhciB2VSxUZz1aKCgpPT57ZnQoKTtadCgpO2QyKCk7dlU9SVV9KTt2YXIgUmc9Vm4oKHV1LEVnKT0+e3ZhciBWdD1WdHx8e307VnQuc2NvcGU9e307VnQuYXJyYXlJdGVyYXRvckltcGw9ZnVuY3Rpb24odCl7dmFyIGU9MDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZTx0Lmxlbmd0aD97ZG9uZTohMSx2YWx1ZTp0W2UrK119Ontkb25lOiEwfX19O1Z0LmFycmF5SXRlcmF0b3I9ZnVuY3Rpb24odCl7cmV0dXJue25leHQ6VnQuYXJyYXlJdGVyYXRvckltcGwodCl9fTtWdC5tYWtlSXRlcmF0b3I9ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5pdGVyYXRvciYmdFtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBlP2UuY2FsbCh0KTpWdC5hcnJheUl0ZXJhdG9yKHQpfTtWdC5BU1NVTUVfRVM1PSExO1Z0LkFTU1VNRV9OT19OQVRJVkVfTUFQPSExO1Z0LkFTU1VNRV9OT19OQVRJVkVfU0VUPSExO1Z0LlNJTVBMRV9GUk9VTkRfUE9MWUZJTEw9ITE7VnQuSVNPTEFURV9QT0xZRklMTFM9ITE7VnQuRk9SQ0VfUE9MWUZJTExfUFJPTUlTRT0hMTtWdC5GT1JDRV9QT0xZRklMTF9QUk9NSVNFX1dIRU5fTk9fVU5IQU5ETEVEX1JFSkVDVElPTj0hMTtWdC5nZXRHbG9iYWw9ZnVuY3Rpb24odCl7dD1bdHlwZW9mIGdsb2JhbFRoaXM9PSJvYmplY3QiJiZnbG9iYWxUaGlzLHQsdHlwZW9mIHdpbmRvdz09Im9iamVjdCImJndpbmRvdyx0eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYsdHlwZW9mIGdsb2JhbD09Im9iamVjdCImJmdsb2JhbF07Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDsrK2Upe3ZhciBuPXRbZV07aWYobiYmbi5NYXRoPT1NYXRoKXJldHVybiBufXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iil9O1Z0Lmdsb2JhbD1WdC5nZXRHbG9iYWwodXUpO1Z0LmRlZmluZVByb3BlcnR5PVZ0LkFTU1VNRV9FUzV8fHR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydGllcz09ImZ1bmN0aW9uIj9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PT1BcnJheS5wcm90b3R5cGV8fHQ9PU9iamVjdC5wcm90b3R5cGV8fCh0W2VdPW4udmFsdWUpLHR9O1Z0LklTX1NZTUJPTF9OQVRJVkU9dHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmdHlwZW9mIFN5bWJvbCgieCIpPT0ic3ltYm9sIjtWdC5UUlVTVF9FUzZfUE9MWUZJTExTPSFWdC5JU09MQVRFX1BPTFlGSUxMU3x8VnQuSVNfU1lNQk9MX05BVElWRTtWdC5wb2x5ZmlsbHM9e307VnQucHJvcGVydHlUb1BvbHlmaWxsU3ltYm9sPXt9O1Z0LlBPTFlGSUxMX1BSRUZJWD0iJGpzY3AkIjtWdC5wb2x5ZmlsbD1mdW5jdGlvbih0LGUsbixvKXtlJiYoVnQuSVNPTEFURV9QT0xZRklMTFM/VnQucG9seWZpbGxJc29sYXRlZCh0LGUsbixvKTpWdC5wb2x5ZmlsbFVuaXNvbGF0ZWQodCxlLG4sbykpfTtWdC5wb2x5ZmlsbFVuaXNvbGF0ZWQ9ZnVuY3Rpb24odCxlLG4sbyl7Zm9yKG49VnQuZ2xvYmFsLHQ9dC5zcGxpdCgiLiIpLG89MDtvPHQubGVuZ3RoLTE7bysrKXt2YXIgcj10W29dO2lmKCEociBpbiBuKSlyZXR1cm47bj1uW3JdfXQ9dFt0Lmxlbmd0aC0xXSxvPW5bdF0sZT1lKG8pLGUhPW8mJmUhPW51bGwmJlZ0LmRlZmluZVByb3BlcnR5KG4sdCx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmV9KX07VnQucG9seWZpbGxJc29sYXRlZD1mdW5jdGlvbih0LGUsbixvKXt2YXIgcj10LnNwbGl0KCIuIik7dD1yLmxlbmd0aD09PTEsbz1yWzBdLG89IXQmJm8gaW4gVnQucG9seWZpbGxzP1Z0LnBvbHlmaWxsczpWdC5nbG9iYWw7Zm9yKHZhciBpPTA7aTxyLmxlbmd0aC0xO2krKyl7dmFyIHM9cltpXTtpZighKHMgaW4gbykpcmV0dXJuO289b1tzXX1yPXJbci5sZW5ndGgtMV0sbj1WdC5JU19TWU1CT0xfTkFUSVZFJiZuPT09ImVzNiI/b1tyXTpudWxsLGU9ZShuKSxlIT1udWxsJiYodD9WdC5kZWZpbmVQcm9wZXJ0eShWdC5wb2x5ZmlsbHMscix7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmV9KTplIT09biYmKFZ0LnByb3BlcnR5VG9Qb2x5ZmlsbFN5bWJvbFtyXT09PXZvaWQgMCYmKG49MWU5Kk1hdGgucmFuZG9tKCk+Pj4wLFZ0LnByb3BlcnR5VG9Qb2x5ZmlsbFN5bWJvbFtyXT1WdC5JU19TWU1CT0xfTkFUSVZFP1Z0Lmdsb2JhbC5TeW1ib2wocik6VnQuUE9MWUZJTExfUFJFRklYK24rIiQiK3IpLFZ0LmRlZmluZVByb3BlcnR5KG8sVnQucHJvcGVydHlUb1BvbHlmaWxsU3ltYm9sW3JdLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZX0pKSl9O1Z0LnBvbHlmaWxsKCJQcm9taXNlIixmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dGhpcy5iYXRjaF89bnVsbH1mdW5jdGlvbiBuKHMpe3JldHVybiBzIGluc3RhbmNlb2Ygcj9zOm5ldyByKGZ1bmN0aW9uKGYsdSl7ZihzKX0pfWlmKHQmJighKFZ0LkZPUkNFX1BPTFlGSUxMX1BST01JU0V8fFZ0LkZPUkNFX1BPTFlGSUxMX1BST01JU0VfV0hFTl9OT19VTkhBTkRMRURfUkVKRUNUSU9OJiZ0eXBlb2YgVnQuZ2xvYmFsLlByb21pc2VSZWplY3Rpb25FdmVudD4idSIpfHwhVnQuZ2xvYmFsLlByb21pc2V8fFZ0Lmdsb2JhbC5Qcm9taXNlLnRvU3RyaW5nKCkuaW5kZXhPZigiW25hdGl2ZSBjb2RlXSIpPT09LTEpKXJldHVybiB0O2UucHJvdG90eXBlLmFzeW5jRXhlY3V0ZT1mdW5jdGlvbihzKXtpZih0aGlzLmJhdGNoXz09bnVsbCl7dGhpcy5iYXRjaF89W107dmFyIGY9dGhpczt0aGlzLmFzeW5jRXhlY3V0ZUZ1bmN0aW9uKGZ1bmN0aW9uKCl7Zi5leGVjdXRlQmF0Y2hfKCl9KX10aGlzLmJhdGNoXy5wdXNoKHMpfTt2YXIgbz1WdC5nbG9iYWwuc2V0VGltZW91dDtlLnByb3RvdHlwZS5hc3luY0V4ZWN1dGVGdW5jdGlvbj1mdW5jdGlvbihzKXtvKHMsMCl9LGUucHJvdG90eXBlLmV4ZWN1dGVCYXRjaF89ZnVuY3Rpb24oKXtmb3IoO3RoaXMuYmF0Y2hfJiZ0aGlzLmJhdGNoXy5sZW5ndGg7KXt2YXIgcz10aGlzLmJhdGNoXzt0aGlzLmJhdGNoXz1bXTtmb3IodmFyIGY9MDtmPHMubGVuZ3RoOysrZil7dmFyIHU9c1tmXTtzW2ZdPW51bGw7dHJ5e3UoKX1jYXRjaChjKXt0aGlzLmFzeW5jVGhyb3dfKGMpfX19dGhpcy5iYXRjaF89bnVsbH0sZS5wcm90b3R5cGUuYXN5bmNUaHJvd189ZnVuY3Rpb24ocyl7dGhpcy5hc3luY0V4ZWN1dGVGdW5jdGlvbihmdW5jdGlvbigpe3Rocm93IHN9KX07dmFyIHI9ZnVuY3Rpb24ocyl7dGhpcy5zdGF0ZV89MCx0aGlzLnJlc3VsdF89dm9pZCAwLHRoaXMub25TZXR0bGVkQ2FsbGJhY2tzXz1bXSx0aGlzLmlzUmVqZWN0aW9uSGFuZGxlZF89ITE7dmFyIGY9dGhpcy5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0XygpO3RyeXtzKGYucmVzb2x2ZSxmLnJlamVjdCl9Y2F0Y2godSl7Zi5yZWplY3QodSl9fTtyLnByb3RvdHlwZS5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0Xz1mdW5jdGlvbigpe2Z1bmN0aW9uIHMoYyl7cmV0dXJuIGZ1bmN0aW9uKGwpe3V8fCh1PSEwLGMuY2FsbChmLGwpKX19dmFyIGY9dGhpcyx1PSExO3JldHVybntyZXNvbHZlOnModGhpcy5yZXNvbHZlVG9fKSxyZWplY3Q6cyh0aGlzLnJlamVjdF8pfX0sci5wcm90b3R5cGUucmVzb2x2ZVRvXz1mdW5jdGlvbihzKXtpZihzPT09dGhpcyl0aGlzLnJlamVjdF8obmV3IFR5cGVFcnJvcigiQSBQcm9taXNlIGNhbm5vdCByZXNvbHZlIHRvIGl0c2VsZiIpKTtlbHNlIGlmKHMgaW5zdGFuY2VvZiByKXRoaXMuc2V0dGxlU2FtZUFzUHJvbWlzZV8ocyk7ZWxzZXt0OnN3aXRjaCh0eXBlb2Ygcyl7Y2FzZSJvYmplY3QiOnZhciBmPXMhPW51bGw7YnJlYWsgdDtjYXNlImZ1bmN0aW9uIjpmPSEwO2JyZWFrIHQ7ZGVmYXVsdDpmPSExfWY/dGhpcy5yZXNvbHZlVG9Ob25Qcm9taXNlT2JqXyhzKTp0aGlzLmZ1bGZpbGxfKHMpfX0sci5wcm90b3R5cGUucmVzb2x2ZVRvTm9uUHJvbWlzZU9ial89ZnVuY3Rpb24ocyl7dmFyIGY9dm9pZCAwO3RyeXtmPXMudGhlbn1jYXRjaCh1KXt0aGlzLnJlamVjdF8odSk7cmV0dXJufXR5cGVvZiBmPT0iZnVuY3Rpb24iP3RoaXMuc2V0dGxlU2FtZUFzVGhlbmFibGVfKGYscyk6dGhpcy5mdWxmaWxsXyhzKX0sci5wcm90b3R5cGUucmVqZWN0Xz1mdW5jdGlvbihzKXt0aGlzLnNldHRsZV8oMixzKX0sci5wcm90b3R5cGUuZnVsZmlsbF89ZnVuY3Rpb24ocyl7dGhpcy5zZXR0bGVfKDEscyl9LHIucHJvdG90eXBlLnNldHRsZV89ZnVuY3Rpb24ocyxmKXtpZih0aGlzLnN0YXRlXyE9MCl0aHJvdyBFcnJvcigiQ2Fubm90IHNldHRsZSgiK3MrIiwgIitmKyIpOiBQcm9taXNlIGFscmVhZHkgc2V0dGxlZCBpbiBzdGF0ZSIrdGhpcy5zdGF0ZV8pO3RoaXMuc3RhdGVfPXMsdGhpcy5yZXN1bHRfPWYsdGhpcy5zdGF0ZV89PT0yJiZ0aGlzLnNjaGVkdWxlVW5oYW5kbGVkUmVqZWN0aW9uQ2hlY2tfKCksdGhpcy5leGVjdXRlT25TZXR0bGVkQ2FsbGJhY2tzXygpfSxyLnByb3RvdHlwZS5zY2hlZHVsZVVuaGFuZGxlZFJlamVjdGlvbkNoZWNrXz1mdW5jdGlvbigpe3ZhciBzPXRoaXM7byhmdW5jdGlvbigpe2lmKHMubm90aWZ5VW5oYW5kbGVkUmVqZWN0aW9uXygpKXt2YXIgZj1WdC5nbG9iYWwuY29uc29sZTt0eXBlb2YgZjwidSImJmYuZXJyb3Iocy5yZXN1bHRfKX19LDEpfSxyLnByb3RvdHlwZS5ub3RpZnlVbmhhbmRsZWRSZWplY3Rpb25fPWZ1bmN0aW9uKCl7aWYodGhpcy5pc1JlamVjdGlvbkhhbmRsZWRfKXJldHVybiExO3ZhciBzPVZ0Lmdsb2JhbC5DdXN0b21FdmVudCxmPVZ0Lmdsb2JhbC5FdmVudCx1PVZ0Lmdsb2JhbC5kaXNwYXRjaEV2ZW50O3JldHVybiB0eXBlb2YgdT4idSI/ITA6KHR5cGVvZiBzPT0iZnVuY3Rpb24iP3M9bmV3IHMoInVuaGFuZGxlZHJlamVjdGlvbiIse2NhbmNlbGFibGU6ITB9KTp0eXBlb2YgZj09ImZ1bmN0aW9uIj9zPW5ldyBmKCJ1bmhhbmRsZWRyZWplY3Rpb24iLHtjYW5jZWxhYmxlOiEwfSk6KHM9VnQuZ2xvYmFsLmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLHMuaW5pdEN1c3RvbUV2ZW50KCJ1bmhhbmRsZWRyZWplY3Rpb24iLCExLCEwLHMpKSxzLnByb21pc2U9dGhpcyxzLnJlYXNvbj10aGlzLnJlc3VsdF8sdShzKSl9LHIucHJvdG90eXBlLmV4ZWN1dGVPblNldHRsZWRDYWxsYmFja3NfPWZ1bmN0aW9uKCl7aWYodGhpcy5vblNldHRsZWRDYWxsYmFja3NfIT1udWxsKXtmb3IodmFyIHM9MDtzPHRoaXMub25TZXR0bGVkQ2FsbGJhY2tzXy5sZW5ndGg7KytzKWkuYXN5bmNFeGVjdXRlKHRoaXMub25TZXR0bGVkQ2FsbGJhY2tzX1tzXSk7dGhpcy5vblNldHRsZWRDYWxsYmFja3NfPW51bGx9fTt2YXIgaT1uZXcgZTtyZXR1cm4gci5wcm90b3R5cGUuc2V0dGxlU2FtZUFzUHJvbWlzZV89ZnVuY3Rpb24ocyl7dmFyIGY9dGhpcy5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0XygpO3MuY2FsbFdoZW5TZXR0bGVkXyhmLnJlc29sdmUsZi5yZWplY3QpfSxyLnByb3RvdHlwZS5zZXR0bGVTYW1lQXNUaGVuYWJsZV89ZnVuY3Rpb24ocyxmKXt2YXIgdT10aGlzLmNyZWF0ZVJlc29sdmVBbmRSZWplY3RfKCk7dHJ5e3MuY2FsbChmLHUucmVzb2x2ZSx1LnJlamVjdCl9Y2F0Y2goYyl7dS5yZWplY3QoYyl9fSxyLnByb3RvdHlwZS50aGVuPWZ1bmN0aW9uKHMsZil7ZnVuY3Rpb24gdShkLG0pe3JldHVybiB0eXBlb2YgZD09ImZ1bmN0aW9uIj9mdW5jdGlvbihfKXt0cnl7YyhkKF8pKX1jYXRjaChnKXtsKGcpfX06bX12YXIgYyxsLHA9bmV3IHIoZnVuY3Rpb24oZCxtKXtjPWQsbD1tfSk7cmV0dXJuIHRoaXMuY2FsbFdoZW5TZXR0bGVkXyh1KHMsYyksdShmLGwpKSxwfSxyLnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbihzKXtyZXR1cm4gdGhpcy50aGVuKHZvaWQgMCxzKX0sci5wcm90b3R5cGUuY2FsbFdoZW5TZXR0bGVkXz1mdW5jdGlvbihzLGYpe2Z1bmN0aW9uIHUoKXtzd2l0Y2goYy5zdGF0ZV8pe2Nhc2UgMTpzKGMucmVzdWx0Xyk7YnJlYWs7Y2FzZSAyOmYoYy5yZXN1bHRfKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJVbmV4cGVjdGVkIHN0YXRlOiAiK2Muc3RhdGVfKX19dmFyIGM9dGhpczt0aGlzLm9uU2V0dGxlZENhbGxiYWNrc189PW51bGw/aS5hc3luY0V4ZWN1dGUodSk6dGhpcy5vblNldHRsZWRDYWxsYmFja3NfLnB1c2godSksdGhpcy5pc1JlamVjdGlvbkhhbmRsZWRfPSEwfSxyLnJlc29sdmU9bixyLnJlamVjdD1mdW5jdGlvbihzKXtyZXR1cm4gbmV3IHIoZnVuY3Rpb24oZix1KXt1KHMpfSl9LHIucmFjZT1mdW5jdGlvbihzKXtyZXR1cm4gbmV3IHIoZnVuY3Rpb24oZix1KXtmb3IodmFyIGM9VnQubWFrZUl0ZXJhdG9yKHMpLGw9Yy5uZXh0KCk7IWwuZG9uZTtsPWMubmV4dCgpKW4obC52YWx1ZSkuY2FsbFdoZW5TZXR0bGVkXyhmLHUpfSl9LHIuYWxsPWZ1bmN0aW9uKHMpe3ZhciBmPVZ0Lm1ha2VJdGVyYXRvcihzKSx1PWYubmV4dCgpO3JldHVybiB1LmRvbmU/bihbXSk6bmV3IHIoZnVuY3Rpb24oYyxsKXtmdW5jdGlvbiBwKF8pe3JldHVybiBmdW5jdGlvbihnKXtkW19dPWcsbS0tLG09PTAmJmMoZCl9fXZhciBkPVtdLG09MDtkbyBkLnB1c2godm9pZCAwKSxtKyssbih1LnZhbHVlKS5jYWxsV2hlblNldHRsZWRfKHAoZC5sZW5ndGgtMSksbCksdT1mLm5leHQoKTt3aGlsZSghdS5kb25lKX0pfSxyfSwiZXM2IiwiZXMzIik7VnQub3ducz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX07VnQuYXNzaWduPVZ0LlRSVVNUX0VTNl9QT0xZRklMTFMmJnR5cGVvZiBPYmplY3QuYXNzaWduPT0iZnVuY3Rpb24iP09iamVjdC5hc3NpZ246ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXt2YXIgbz1hcmd1bWVudHNbbl07aWYobylmb3IodmFyIHIgaW4gbylWdC5vd25zKG8scikmJih0W3JdPW9bcl0pfXJldHVybiB0fTtWdC5wb2x5ZmlsbCgiT2JqZWN0LmFzc2lnbiIsZnVuY3Rpb24odCl7cmV0dXJuIHR8fFZ0LmFzc2lnbn0sImVzNiIsImVzMyIpO1Z0LmNoZWNrU3RyaW5nQXJncz1mdW5jdGlvbih0LGUsbil7aWYodD09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgJ3RoaXMnIHZhbHVlIGZvciBTdHJpbmcucHJvdG90eXBlLiIrbisiIG11c3Qgbm90IGJlIG51bGwgb3IgdW5kZWZpbmVkIik7aWYoZSBpbnN0YW5jZW9mIFJlZ0V4cCl0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCB0byBTdHJpbmcucHJvdG90eXBlLiIrbisiIG11c3Qgbm90IGJlIGEgcmVndWxhciBleHByZXNzaW9uIik7cmV0dXJuIHQrIiJ9O1Z0LnBvbHlmaWxsKCJTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGgiLGZ1bmN0aW9uKHQpe3JldHVybiB0fHxmdW5jdGlvbihlLG4pe3ZhciBvPVZ0LmNoZWNrU3RyaW5nQXJncyh0aGlzLGUsInN0YXJ0c1dpdGgiKTtlKz0iIjt2YXIgcj1vLmxlbmd0aCxpPWUubGVuZ3RoO249TWF0aC5tYXgoMCxNYXRoLm1pbihufDAsby5sZW5ndGgpKTtmb3IodmFyIHM9MDtzPGkmJm48cjspaWYob1tuKytdIT1lW3MrK10pcmV0dXJuITE7cmV0dXJuIHM+PWl9fSwiZXM2IiwiZXMzIik7VnQucG9seWZpbGwoIkFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluIixmdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3JldHVybiBuPU51bWJlcihuKSxuPT09MS8wfHxuPT09LTEvMD9uOm58MH1yZXR1cm4gdHx8ZnVuY3Rpb24obixvLHIpe3ZhciBpPXRoaXMubGVuZ3RoO2lmKG49ZShuKSxvPWUobykscj1yPT09dm9pZCAwP2k6ZShyKSxuPTA+bj9NYXRoLm1heChpK24sMCk6TWF0aC5taW4obixpKSxvPTA+bz9NYXRoLm1heChpK28sMCk6TWF0aC5taW4obyxpKSxyPTA+cj9NYXRoLm1heChpK3IsMCk6TWF0aC5taW4ocixpKSxuPG8pZm9yKDtvPHI7KW8gaW4gdGhpcz90aGlzW24rK109dGhpc1tvKytdOihkZWxldGUgdGhpc1tuKytdLG8rKyk7ZWxzZSBmb3Iocj1NYXRoLm1pbihyLGkrby1uKSxuKz1yLW87cj5vOyktLXIgaW4gdGhpcz90aGlzWy0tbl09dGhpc1tyXTpkZWxldGUgdGhpc1stLW5dO3JldHVybiB0aGlzfX0sImVzNiIsImVzMyIpO1Z0LnR5cGVkQXJyYXlDb3B5V2l0aGluPWZ1bmN0aW9uKHQpe3JldHVybiB0fHxBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbn07VnQucG9seWZpbGwoIkludDhBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbiIsVnQudHlwZWRBcnJheUNvcHlXaXRoaW4sImVzNiIsImVzNSIpO1Z0LnBvbHlmaWxsKCJVaW50OEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluIixWdC50eXBlZEFycmF5Q29weVdpdGhpbiwiZXM2IiwiZXM1Iik7VnQucG9seWZpbGwoIlVpbnQ4Q2xhbXBlZEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluIixWdC50eXBlZEFycmF5Q29weVdpdGhpbiwiZXM2IiwiZXM1Iik7VnQucG9seWZpbGwoIkludDE2QXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4iLFZ0LnR5cGVkQXJyYXlDb3B5V2l0aGluLCJlczYiLCJlczUiKTtWdC5wb2x5ZmlsbCgiVWludDE2QXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4iLFZ0LnR5cGVkQXJyYXlDb3B5V2l0aGluLCJlczYiLCJlczUiKTtWdC5wb2x5ZmlsbCgiSW50MzJBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbiIsVnQudHlwZWRBcnJheUNvcHlXaXRoaW4sImVzNiIsImVzNSIpO1Z0LnBvbHlmaWxsKCJVaW50MzJBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbiIsVnQudHlwZWRBcnJheUNvcHlXaXRoaW4sImVzNiIsImVzNSIpO1Z0LnBvbHlmaWxsKCJGbG9hdDMyQXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4iLFZ0LnR5cGVkQXJyYXlDb3B5V2l0aGluLCJlczYiLCJlczUiKTtWdC5wb2x5ZmlsbCgiRmxvYXQ2NEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluIixWdC50eXBlZEFycmF5Q29weVdpdGhpbiwiZXM2IiwiZXM1Iik7dmFyIE9nPWZ1bmN0aW9uKCl7dmFyIHQ9dHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQuY3VycmVudFNjcmlwdD9kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYzp2b2lkIDA7cmV0dXJuIHR5cGVvZiBfX2ZpbGVuYW1lPCJ1IiYmKHQ9dHx8X19maWxlbmFtZSksZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih6KXtyZXR1cm4gUi5sb2NhdGVGaWxlP1IubG9jYXRlRmlsZSh6LG10KTptdCt6fWZ1bmN0aW9uIG8oeixXLGV0KXt2YXIgTXQ9VytldDtmb3IoZXQ9Vzt6W2V0XSYmIShldD49TXQpOykrK2V0O2lmKDE2PGV0LVcmJnouYnVmZmVyJiZnZSlyZXR1cm4gZ2UuZGVjb2RlKHouc3ViYXJyYXkoVyxldCkpO2ZvcihNdD0iIjtXPGV0Oyl7dmFyIGxlPXpbVysrXTtpZihsZSYxMjgpe3ZhciB3ZT16W1crK10mNjM7aWYoKGxlJjIyNCk9PTE5MilNdCs9U3RyaW5nLmZyb21DaGFyQ29kZSgobGUmMzEpPDw2fHdlKTtlbHNle3ZhciBPaT16W1crK10mNjM7bGU9KGxlJjI0MCk9PTIyND8obGUmMTUpPDwxMnx3ZTw8NnxPaToobGUmNyk8PDE4fHdlPDwxMnxPaTw8Nnx6W1crK10mNjMsNjU1MzY+bGU/TXQrPVN0cmluZy5mcm9tQ2hhckNvZGUobGUpOihsZS09NjU1MzYsTXQrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8bGU+PjEwLDU2MzIwfGxlJjEwMjMpKX19ZWxzZSBNdCs9U3RyaW5nLmZyb21DaGFyQ29kZShsZSl9cmV0dXJuIE10fWZ1bmN0aW9uIHIoeixXKXtyZXR1cm4gej9vKHVuLHosVyk6IiJ9ZnVuY3Rpb24gaSgpe3ZhciB6PUp0LmJ1ZmZlcjtSLkhFQVA4PUVlPW5ldyBJbnQ4QXJyYXkoeiksUi5IRUFQMTY9bmV3IEludDE2QXJyYXkoeiksUi5IRUFQMzI9a2U9bmV3IEludDMyQXJyYXkoeiksUi5IRUFQVTg9dW49bmV3IFVpbnQ4QXJyYXkoeiksUi5IRUFQVTE2PW5ldyBVaW50MTZBcnJheSh6KSxSLkhFQVBVMzI9YmU9bmV3IFVpbnQzMkFycmF5KHopLFIuSEVBUEYzMj1uZXcgRmxvYXQzMkFycmF5KHopLFIuSEVBUEY2ND1uZXcgRmxvYXQ2NEFycmF5KHopfWZ1bmN0aW9uIHMoeil7dGhyb3cgUi5vbkFib3J0JiZSLm9uQWJvcnQoeiksej0iQWJvcnRlZCgiK3orIikiLHVlKHopLHhlPSEwLHo9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcih6KyIuIEJ1aWxkIHdpdGggLXNBU1NFUlRJT05TIGZvciBtb3JlIGluZm8uIiksY3Qoeiksen1mdW5jdGlvbiBmKHope3RyeXtpZih6PT1zbiYmUXQpcmV0dXJuIG5ldyBVaW50OEFycmF5KFF0KTtpZihtZSlyZXR1cm4gbWUoeik7dGhyb3ciYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQifWNhdGNoKFcpe3MoVyl9fWZ1bmN0aW9uIHUoKXtpZighUXQmJihQdHx8Z3QpKXtpZih0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiImJiFzbi5zdGFydHNXaXRoKCJmaWxlOi8vIikpcmV0dXJuIGZldGNoKHNuLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbihmdW5jdGlvbih6KXtpZighei5vayl0aHJvdyJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICciK3NuKyInIjtyZXR1cm4gei5hcnJheUJ1ZmZlcigpfSkuY2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gZihzbil9KTtpZihjZSlyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oeixXKXtjZShzbixmdW5jdGlvbihldCl7eihuZXcgVWludDhBcnJheShldCkpfSxXKX0pfXJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGYoc24pfSl9ZnVuY3Rpb24gYyh6KXtmb3IoOzA8ei5sZW5ndGg7KXouc2hpZnQoKShSKX1mdW5jdGlvbiBsKHope3RoaXMuZXhjUHRyPXosdGhpcy5wdHI9ei0yNCx0aGlzLnNldF90eXBlPWZ1bmN0aW9uKFcpe2JlW3RoaXMucHRyKzQ+PjJdPVd9LHRoaXMuZ2V0X3R5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gYmVbdGhpcy5wdHIrND4+Ml19LHRoaXMuc2V0X2Rlc3RydWN0b3I9ZnVuY3Rpb24oVyl7YmVbdGhpcy5wdHIrOD4+Ml09V30sdGhpcy5nZXRfZGVzdHJ1Y3Rvcj1mdW5jdGlvbigpe3JldHVybiBiZVt0aGlzLnB0cis4Pj4yXX0sdGhpcy5zZXRfcmVmY291bnQ9ZnVuY3Rpb24oVyl7a2VbdGhpcy5wdHI+PjJdPVd9LHRoaXMuc2V0X2NhdWdodD1mdW5jdGlvbihXKXtFZVt0aGlzLnB0cisxMj4+MF09Vz8xOjB9LHRoaXMuZ2V0X2NhdWdodD1mdW5jdGlvbigpe3JldHVybiBFZVt0aGlzLnB0cisxMj4+MF0hPTB9LHRoaXMuc2V0X3JldGhyb3duPWZ1bmN0aW9uKFcpe0VlW3RoaXMucHRyKzEzPj4wXT1XPzE6MH0sdGhpcy5nZXRfcmV0aHJvd249ZnVuY3Rpb24oKXtyZXR1cm4gRWVbdGhpcy5wdHIrMTM+PjBdIT0wfSx0aGlzLmluaXQ9ZnVuY3Rpb24oVyxldCl7dGhpcy5zZXRfYWRqdXN0ZWRfcHRyKDApLHRoaXMuc2V0X3R5cGUoVyksdGhpcy5zZXRfZGVzdHJ1Y3RvcihldCksdGhpcy5zZXRfcmVmY291bnQoMCksdGhpcy5zZXRfY2F1Z2h0KCExKSx0aGlzLnNldF9yZXRocm93bighMSl9LHRoaXMuYWRkX3JlZj1mdW5jdGlvbigpe2tlW3RoaXMucHRyPj4yXSs9MX0sdGhpcy5yZWxlYXNlX3JlZj1mdW5jdGlvbigpe3ZhciBXPWtlW3RoaXMucHRyPj4yXTtyZXR1cm4ga2VbdGhpcy5wdHI+PjJdPVctMSxXPT09MX0sdGhpcy5zZXRfYWRqdXN0ZWRfcHRyPWZ1bmN0aW9uKFcpe2JlW3RoaXMucHRyKzE2Pj4yXT1XfSx0aGlzLmdldF9hZGp1c3RlZF9wdHI9ZnVuY3Rpb24oKXtyZXR1cm4gYmVbdGhpcy5wdHIrMTY+PjJdfSx0aGlzLmdldF9leGNlcHRpb25fcHRyPWZ1bmN0aW9uKCl7aWYoTGwodGhpcy5nZXRfdHlwZSgpKSlyZXR1cm4gYmVbdGhpcy5leGNQdHI+PjJdO3ZhciBXPXRoaXMuZ2V0X2FkanVzdGVkX3B0cigpO3JldHVybiBXIT09MD9XOnRoaXMuZXhjUHRyfX1mdW5jdGlvbiBwKCl7ZnVuY3Rpb24geigpe2lmKCFuZiYmKG5mPSEwLFIuY2FsbGVkUnVuPSEwLCF4ZSkpe2lmKHJlPSEwLGMocG4pLG90KFIpLFIub25SdW50aW1lSW5pdGlhbGl6ZWQmJlIub25SdW50aW1lSW5pdGlhbGl6ZWQoKSxSLnBvc3RSdW4pZm9yKHR5cGVvZiBSLnBvc3RSdW49PSJmdW5jdGlvbiImJihSLnBvc3RSdW49W1IucG9zdFJ1bl0pO1IucG9zdFJ1bi5sZW5ndGg7KU9uLnVuc2hpZnQoUi5wb3N0UnVuLnNoaWZ0KCkpO2MoT24pfX1pZighKDA8JHQpKXtpZihSLnByZVJ1bilmb3IodHlwZW9mIFIucHJlUnVuPT0iZnVuY3Rpb24iJiYoUi5wcmVSdW49W1IucHJlUnVuXSk7Ui5wcmVSdW4ubGVuZ3RoOylsbi51bnNoaWZ0KFIucHJlUnVuLnNoaWZ0KCkpO2MobG4pLDA8JHR8fChSLnNldFN0YXR1cz8oUi5zZXRTdGF0dXMoIlJ1bm5pbmcuLi4iKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe1Iuc2V0U3RhdHVzKCIiKX0sMSkseigpfSwxKSk6eigpKX19ZnVuY3Rpb24gZCgpe31mdW5jdGlvbiBtKHope3JldHVybih6fHxkKS5fX2NhY2hlX199ZnVuY3Rpb24gXyh6LFcpe3ZhciBldD1tKFcpLE10PWV0W3pdO3JldHVybiBNdHx8KE10PU9iamVjdC5jcmVhdGUoKFd8fGQpLnByb3RvdHlwZSksTXQucHRyPXosZXRbel09TXQpfWZ1bmN0aW9uIGcoeil7aWYodHlwZW9mIHo9PSJzdHJpbmciKXtmb3IodmFyIFc9MCxldD0wO2V0PHoubGVuZ3RoOysrZXQpe3ZhciBNdD16LmNoYXJDb2RlQXQoZXQpOzEyNz49TXQ/VysrOjIwNDc+PU10P1crPTI6NTUyOTY8PU10JiY1NzM0Mz49TXQ/KFcrPTQsKytldCk6Vys9M31pZihXPUFycmF5KFcrMSksZXQ9MCxNdD1XLmxlbmd0aCwwPE10KXtNdD1ldCtNdC0xO2Zvcih2YXIgbGU9MDtsZTx6Lmxlbmd0aDsrK2xlKXt2YXIgd2U9ei5jaGFyQ29kZUF0KGxlKTtpZig1NTI5Njw9d2UmJjU3MzQzPj13ZSl7dmFyIE9pPXouY2hhckNvZGVBdCgrK2xlKTt3ZT02NTUzNisoKHdlJjEwMjMpPDwxMCl8T2kmMTAyM31pZigxMjc+PXdlKXtpZihldD49TXQpYnJlYWs7V1tldCsrXT13ZX1lbHNle2lmKDIwNDc+PXdlKXtpZihldCsxPj1NdClicmVhaztXW2V0KytdPTE5Mnx3ZT4+Nn1lbHNle2lmKDY1NTM1Pj13ZSl7aWYoZXQrMj49TXQpYnJlYWs7V1tldCsrXT0yMjR8d2U+PjEyfWVsc2V7aWYoZXQrMz49TXQpYnJlYWs7V1tldCsrXT0yNDB8d2U+PjE4LFdbZXQrK109MTI4fHdlPj4xMiY2M31XW2V0KytdPTEyOHx3ZT4+NiY2M31XW2V0KytdPTEyOHx3ZSY2M319V1tldF09MH1yZXR1cm4gej1SZS5hbGxvYyhXLEVlKSxSZS5jb3B5KFcsRWUseiksen1yZXR1cm4gen1mdW5jdGlvbiBiKHope2lmKHR5cGVvZiB6PT0ib2JqZWN0Iil7dmFyIFc9UmUuYWxsb2MoeixFZSk7cmV0dXJuIFJlLmNvcHkoeixFZSxXKSxXfXJldHVybiB6fWZ1bmN0aW9uIHcoKXt0aHJvdyJjYW5ub3QgY29uc3RydWN0IGEgVm9pZFB0ciwgbm8gY29uc3RydWN0b3IgaW4gSURMIn1mdW5jdGlvbiBPKCl7dGhpcy5wdHI9Y24oKSxtKE8pW3RoaXMucHRyXT10aGlzfWZ1bmN0aW9uIEUoKXt0aGlzLnB0cj11bygpLG0oRSlbdGhpcy5wdHJdPXRoaXN9ZnVuY3Rpb24gVCgpe3RoaXMucHRyPWxvKCksbShUKVt0aGlzLnB0cl09dGhpc31mdW5jdGlvbiBDKCl7dGhpcy5wdHI9SWUoKSxtKEMpW3RoaXMucHRyXT10aGlzfWZ1bmN0aW9uIE4oKXt0aGlzLnB0cj1JcygpLG0oTilbdGhpcy5wdHJdPXRoaXN9ZnVuY3Rpb24gSSgpe3RoaXMucHRyPW5vKCksbShJKVt0aGlzLnB0cl09dGhpc31mdW5jdGlvbiBEKCl7dGhpcy5wdHI9TmMoKSxtKEQpW3RoaXMucHRyXT10aGlzfWZ1bmN0aW9uIHYoKXt0aGlzLnB0cj1vcigpLG0odilbdGhpcy5wdHJdPXRoaXN9ZnVuY3Rpb24gTCgpe3RoaXMucHRyPXZjKCksbShMKVt0aGlzLnB0cl09dGhpc31mdW5jdGlvbiBVKCl7dGhyb3ciY2Fubm90IGNvbnN0cnVjdCBhIFN0YXR1cywgbm8gY29uc3RydWN0b3IgaW4gSURMIn1mdW5jdGlvbiBBKCl7dGhpcy5wdHI9VHUoKSxtKEEpW3RoaXMucHRyXT10aGlzfWZ1bmN0aW9uIFMoKXt0aGlzLnB0cj1MYygpLG0oUylbdGhpcy5wdHJdPXRoaXN9ZnVuY3Rpb24gUCgpe3RoaXMucHRyPUthKCksbShQKVt0aGlzLnB0cl09dGhpc31mdW5jdGlvbiBCKCl7dGhpcy5wdHI9RmMoKSxtKEIpW3RoaXMucHRyXT10aGlzfWZ1bmN0aW9uIGooKXt0aGlzLnB0cj1NdSgpLG0oailbdGhpcy5wdHJdPXRoaXN9ZnVuY3Rpb24gSCgpe3RoaXMucHRyPXZ1KCksbShIKVt0aGlzLnB0cl09dGhpc31mdW5jdGlvbiBrKCl7dGhpcy5wdHI9dHMoKSxtKGspW3RoaXMucHRyXT10aGlzfWZ1bmN0aW9uIEsoKXt0aGlzLnB0cj1WdSgpLG0oSylbdGhpcy5wdHJdPXRoaXN9ZnVuY3Rpb24gWCgpe3RoaXMucHRyPVphKCksbShYKVt0aGlzLnB0cl09dGhpc31lPWU9PT12b2lkIDA/e306ZTt2YXIgUj10eXBlb2YgZTwidSI/ZTp7fSxvdCxjdDtSLnJlYWR5PW5ldyBQcm9taXNlKGZ1bmN0aW9uKHosVyl7b3Q9eixjdD1XfSk7dmFyIHB0PSExLHl0PSExO1Iub25SdW50aW1lSW5pdGlhbGl6ZWQ9ZnVuY3Rpb24oKXtwdD0hMCx5dCYmdHlwZW9mIFIub25Nb2R1bGVMb2FkZWQ9PSJmdW5jdGlvbiImJlIub25Nb2R1bGVMb2FkZWQoUil9LFIub25Nb2R1bGVQYXJzZWQ9ZnVuY3Rpb24oKXt5dD0hMCxwdCYmdHlwZW9mIFIub25Nb2R1bGVMb2FkZWQ9PSJmdW5jdGlvbiImJlIub25Nb2R1bGVMb2FkZWQoUil9LFIuaXNWZXJzaW9uU3VwcG9ydGVkPWZ1bmN0aW9uKHope3JldHVybiB0eXBlb2YgeiE9InN0cmluZyI/ITE6KHo9ei5zcGxpdCgiLiIpLDI+ei5sZW5ndGh8fDM8ei5sZW5ndGg/ITE6elswXT09MSYmMDw9elsxXSYmNT49elsxXT8hMDohKHpbMF0hPTB8fDEwPHpbMV0pKX07dmFyIHJ0PU9iamVjdC5hc3NpZ24oe30sUiksUHQ9dHlwZW9mIHdpbmRvdz09Im9iamVjdCIsZ3Q9dHlwZW9mIGltcG9ydFNjcmlwdHM9PSJmdW5jdGlvbiIsQ3Q9dHlwZW9mIHByb2Nlc3M9PSJvYmplY3QiJiZ0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucz09Im9iamVjdCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGU9PSJzdHJpbmciLG10PSIiO2lmKEN0KXt2YXIgdXQ9ZHIoImZzIiksdnQ9ZHIoInBhdGgiKTttdD1ndD92dC5kaXJuYW1lKG10KSsiLyI6X19kaXJuYW1lKyIvIjt2YXIgenQ9ZnVuY3Rpb24oeixXKXtyZXR1cm4gej16LnN0YXJ0c1dpdGgoImZpbGU6Ly8iKT9uZXcgVVJMKHopOnZ0Lm5vcm1hbGl6ZSh6KSx1dC5yZWFkRmlsZVN5bmMoeixXP3ZvaWQgMDoidXRmOCIpfSxtZT1mdW5jdGlvbih6KXtyZXR1cm4gej16dCh6LCEwKSx6LmJ1ZmZlcnx8KHo9bmV3IFVpbnQ4QXJyYXkoeikpLHp9LGNlPWZ1bmN0aW9uKHosVyxldCl7ej16LnN0YXJ0c1dpdGgoImZpbGU6Ly8iKT9uZXcgVVJMKHopOnZ0Lm5vcm1hbGl6ZSh6KSx1dC5yZWFkRmlsZSh6LGZ1bmN0aW9uKE10LGxlKXtNdD9ldChNdCk6VyhsZS5idWZmZXIpfSl9OzE8cHJvY2Vzcy5hcmd2Lmxlbmd0aCYmcHJvY2Vzcy5hcmd2WzFdLnJlcGxhY2UoL1xcL2csIi8iKSxwcm9jZXNzLmFyZ3Yuc2xpY2UoMiksUi5pbnNwZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIn19ZWxzZShQdHx8Z3QpJiYoZ3Q/bXQ9c2VsZi5sb2NhdGlvbi5ocmVmOnR5cGVvZiBkb2N1bWVudDwidSImJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQmJihtdD1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyksdCYmKG10PXQpLG10PW10LmluZGV4T2YoImJsb2I6IikhPT0wP210LnN1YnN0cigwLG10LnJlcGxhY2UoL1s/I10uKi8sIiIpLmxhc3RJbmRleE9mKCIvIikrMSk6IiIsenQ9ZnVuY3Rpb24oeil7dmFyIFc9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiBXLm9wZW4oIkdFVCIseiwhMSksVy5zZW5kKG51bGwpLFcucmVzcG9uc2VUZXh0fSxndCYmKG1lPWZ1bmN0aW9uKHope3ZhciBXPW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4gVy5vcGVuKCJHRVQiLHosITEpLFcucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsVy5zZW5kKG51bGwpLG5ldyBVaW50OEFycmF5KFcucmVzcG9uc2UpfSksY2U9ZnVuY3Rpb24oeixXLGV0KXt2YXIgTXQ9bmV3IFhNTEh0dHBSZXF1ZXN0O010Lm9wZW4oIkdFVCIseiwhMCksTXQucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsTXQub25sb2FkPWZ1bmN0aW9uKCl7TXQuc3RhdHVzPT0yMDB8fE10LnN0YXR1cz09MCYmTXQucmVzcG9uc2U/VyhNdC5yZXNwb25zZSk6ZXQoKX0sTXQub25lcnJvcj1ldCxNdC5zZW5kKG51bGwpfSk7dmFyIHBlPVIucHJpbnR8fGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksdWU9Ui5wcmludEVycnx8Y29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7T2JqZWN0LmFzc2lnbihSLHJ0KSxydD1udWxsO3ZhciBRdDtSLndhc21CaW5hcnkmJihRdD1SLndhc21CaW5hcnkpLHR5cGVvZiBXZWJBc3NlbWJseSE9Im9iamVjdCImJnMoIm5vIG5hdGl2ZSB3YXNtIHN1cHBvcnQgZGV0ZWN0ZWQiKTt2YXIgSnQseGU9ITEsZ2U9dHlwZW9mIFRleHREZWNvZGVyPCJ1Ij9uZXcgVGV4dERlY29kZXIoInV0ZjgiKTp2b2lkIDAsRWUsdW4sa2UsYmUsbG49W10scG49W10sT249W10scmU9ITEsJHQ9MCxHZT1udWxsLGRuPW51bGwsc249ImRyYWNvX2RlY29kZXIud2FzbSI7c24uc3RhcnRzV2l0aCgiZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCIpfHwoc249bihzbikpO3ZhciBtbj0wLGZvPVtudWxsLFtdLFtdXSxIbj17YjpmdW5jdGlvbih6LFcsZXQpe3Rocm93IG5ldyBsKHopLmluaXQoVyxldCksbW4rKyx6fSxhOmZ1bmN0aW9uKCl7cygiIil9LGc6ZnVuY3Rpb24oeixXLGV0KXt1bi5jb3B5V2l0aGluKHosVyxXK2V0KX0sZTpmdW5jdGlvbih6KXt2YXIgVz11bi5sZW5ndGg7aWYoej4+Pj0wLDIxNDc0ODM2NDg8eilyZXR1cm4hMTtmb3IodmFyIGV0PTE7ND49ZXQ7ZXQqPTIpe3ZhciBNdD1XKigxKy4yL2V0KTtNdD1NYXRoLm1pbihNdCx6KzEwMDY2MzI5Nik7dmFyIGxlPU1hdGg7TXQ9TWF0aC5tYXgoeixNdCksbGU9bGUubWluLmNhbGwobGUsMjE0NzQ4MzY0OCxNdCsoNjU1MzYtTXQlNjU1MzYpJTY1NTM2KTt0OntNdD1KdC5idWZmZXI7dHJ5e0p0Lmdyb3cobGUtTXQuYnl0ZUxlbmd0aCs2NTUzNT4+PjE2KSxpKCk7dmFyIHdlPTE7YnJlYWsgdH1jYXRjaHt9d2U9dm9pZCAwfWlmKHdlKXJldHVybiEwfXJldHVybiExfSxmOmZ1bmN0aW9uKHope3JldHVybiA1Mn0sZDpmdW5jdGlvbih6LFcsZXQsTXQsbGUpe3JldHVybiA3MH0sYzpmdW5jdGlvbih6LFcsZXQsTXQpe2Zvcih2YXIgbGU9MCx3ZT0wO3dlPGV0O3dlKyspe3ZhciBPaT1iZVtXPj4yXSxHYz1iZVtXKzQ+PjJdO1crPTg7Zm9yKHZhciBWPTA7VjxHYztWKyspe3ZhciBHPXVuW09pK1ZdLFk9Zm9bel07Rz09PTB8fEc9PT0xMD8oKHo9PT0xP3BlOnVlKShvKFksMCkpLFkubGVuZ3RoPTApOlkucHVzaChHKX1sZSs9R2N9cmV0dXJuIGJlW010Pj4yXT1sZSwwfX07KGZ1bmN0aW9uKCl7ZnVuY3Rpb24geihsZSx3ZSl7Ui5hc209bGUuZXhwb3J0cyxKdD1SLmFzbS5oLGkoKSxwbi51bnNoaWZ0KFIuYXNtLmkpLCR0LS0sUi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZSLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoJHQpLCR0PT0wJiYoR2UhPT1udWxsJiYoY2xlYXJJbnRlcnZhbChHZSksR2U9bnVsbCksZG4mJihsZT1kbixkbj1udWxsLGxlKCkpKX1mdW5jdGlvbiBXKGxlKXt6KGxlLmluc3RhbmNlKX1mdW5jdGlvbiBldChsZSl7cmV0dXJuIHUoKS50aGVuKGZ1bmN0aW9uKHdlKXtyZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUod2UsTXQpfSkudGhlbihmdW5jdGlvbih3ZSl7cmV0dXJuIHdlfSkudGhlbihsZSxmdW5jdGlvbih3ZSl7dWUoImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIrd2UpLHMod2UpfSl9dmFyIE10PXthOkhufTtpZigkdCsrLFIubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmUi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKCR0KSxSLmluc3RhbnRpYXRlV2FzbSl0cnl7cmV0dXJuIFIuaW5zdGFudGlhdGVXYXNtKE10LHopfWNhdGNoKGxlKXt1ZSgiTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogIitsZSksY3QobGUpfXJldHVybiBmdW5jdGlvbigpe3JldHVybiBRdHx8dHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nIT0iZnVuY3Rpb24ifHxzbi5zdGFydHNXaXRoKCJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIil8fHNuLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKXx8Q3R8fHR5cGVvZiBmZXRjaCE9ImZ1bmN0aW9uIj9ldChXKTpmZXRjaChzbix7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oZnVuY3Rpb24obGUpe3JldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhsZSxNdCkudGhlbihXLGZ1bmN0aW9uKHdlKXtyZXR1cm4gdWUoIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiK3dlKSx1ZSgiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKSxldChXKX0pfSl9KCkuY2F0Y2goY3QpLHt9fSkoKTt2YXIgWmU9Ui5fZW1zY3JpcHRlbl9iaW5kX1ZvaWRQdHJfX19kZXN0cm95X19fMD1mdW5jdGlvbigpe3JldHVybihaZT1SLl9lbXNjcmlwdGVuX2JpbmRfVm9pZFB0cl9fX2Rlc3Ryb3lfX18wPVIuYXNtLmspLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sY249Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJCdWZmZXJfRGVjb2RlckJ1ZmZlcl8wPWZ1bmN0aW9uKCl7cmV0dXJuKGNuPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyQnVmZmVyX0RlY29kZXJCdWZmZXJfMD1SLmFzbS5sKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEtlPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyQnVmZmVyX0luaXRfMj1mdW5jdGlvbigpe3JldHVybihLZT1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2RlckJ1ZmZlcl9Jbml0XzI9Ui5hc20ubSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxobj1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2RlckJ1ZmZlcl9fX2Rlc3Ryb3lfX18wPWZ1bmN0aW9uKCl7cmV0dXJuKGhuPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyQnVmZmVyX19fZGVzdHJveV9fXzA9Ui5hc20ubikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx1bz1SLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlVHJhbnNmb3JtRGF0YV9BdHRyaWJ1dGVUcmFuc2Zvcm1EYXRhXzA9ZnVuY3Rpb24oKXtyZXR1cm4odW89Ui5fZW1zY3JpcHRlbl9iaW5kX0F0dHJpYnV0ZVRyYW5zZm9ybURhdGFfQXR0cmlidXRlVHJhbnNmb3JtRGF0YV8wPVIuYXNtLm8pLmFwcGx5KG51bGwsYXJndW1lbnRzKX0scW49Ui5fZW1zY3JpcHRlbl9iaW5kX0F0dHJpYnV0ZVRyYW5zZm9ybURhdGFfdHJhbnNmb3JtX3R5cGVfMD1mdW5jdGlvbigpe3JldHVybihxbj1SLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlVHJhbnNmb3JtRGF0YV90cmFuc2Zvcm1fdHlwZV8wPVIuYXNtLnApLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sS249Ui5fZW1zY3JpcHRlbl9iaW5kX0F0dHJpYnV0ZVRyYW5zZm9ybURhdGFfX19kZXN0cm95X19fMD1mdW5jdGlvbigpe3JldHVybihLbj1SLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlVHJhbnNmb3JtRGF0YV9fX2Rlc3Ryb3lfX18wPVIuYXNtLnEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sbG89Ui5fZW1zY3JpcHRlbl9iaW5kX0dlb21ldHJ5QXR0cmlidXRlX0dlb21ldHJ5QXR0cmlidXRlXzA9ZnVuY3Rpb24oKXtyZXR1cm4obG89Ui5fZW1zY3JpcHRlbl9iaW5kX0dlb21ldHJ5QXR0cmlidXRlX0dlb21ldHJ5QXR0cmlidXRlXzA9Ui5hc20ucikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx6ZT1SLl9lbXNjcmlwdGVuX2JpbmRfR2VvbWV0cnlBdHRyaWJ1dGVfX19kZXN0cm95X19fMD1mdW5jdGlvbigpe3JldHVybih6ZT1SLl9lbXNjcmlwdGVuX2JpbmRfR2VvbWV0cnlBdHRyaWJ1dGVfX19kZXN0cm95X19fMD1SLmFzbS5zKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEllPVIuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludEF0dHJpYnV0ZV9Qb2ludEF0dHJpYnV0ZV8wPWZ1bmN0aW9uKCl7cmV0dXJuKEllPVIuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludEF0dHJpYnV0ZV9Qb2ludEF0dHJpYnV0ZV8wPVIuYXNtLnQpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sTG49Ui5fZW1zY3JpcHRlbl9iaW5kX1BvaW50QXR0cmlidXRlX3NpemVfMD1mdW5jdGlvbigpe3JldHVybihMbj1SLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfc2l6ZV8wPVIuYXNtLnUpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sV249Ui5fZW1zY3JpcHRlbl9iaW5kX1BvaW50QXR0cmlidXRlX0dldEF0dHJpYnV0ZVRyYW5zZm9ybURhdGFfMD1mdW5jdGlvbigpe3JldHVybihXbj1SLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfR2V0QXR0cmlidXRlVHJhbnNmb3JtRGF0YV8wPVIuYXNtLnYpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sam89Ui5fZW1zY3JpcHRlbl9iaW5kX1BvaW50QXR0cmlidXRlX2F0dHJpYnV0ZV90eXBlXzA9ZnVuY3Rpb24oKXtyZXR1cm4oam89Ui5fZW1zY3JpcHRlbl9iaW5kX1BvaW50QXR0cmlidXRlX2F0dHJpYnV0ZV90eXBlXzA9Ui5hc20udykuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxybj1SLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfZGF0YV90eXBlXzA9ZnVuY3Rpb24oKXtyZXR1cm4ocm49Ui5fZW1zY3JpcHRlbl9iaW5kX1BvaW50QXR0cmlidXRlX2RhdGFfdHlwZV8wPVIuYXNtLngpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sRW49Ui5fZW1zY3JpcHRlbl9iaW5kX1BvaW50QXR0cmlidXRlX251bV9jb21wb25lbnRzXzA9ZnVuY3Rpb24oKXtyZXR1cm4oRW49Ui5fZW1zY3JpcHRlbl9iaW5kX1BvaW50QXR0cmlidXRlX251bV9jb21wb25lbnRzXzA9Ui5hc20ueSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxmcj1SLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfbm9ybWFsaXplZF8wPWZ1bmN0aW9uKCl7cmV0dXJuKGZyPVIuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludEF0dHJpYnV0ZV9ub3JtYWxpemVkXzA9Ui5hc20ueikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxabj1SLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfYnl0ZV9zdHJpZGVfMD1mdW5jdGlvbigpe3JldHVybihabj1SLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfYnl0ZV9zdHJpZGVfMD1SLmFzbS5BKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEhvPVIuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludEF0dHJpYnV0ZV9ieXRlX29mZnNldF8wPWZ1bmN0aW9uKCl7cmV0dXJuKEhvPVIuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludEF0dHJpYnV0ZV9ieXRlX29mZnNldF8wPVIuYXNtLkIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sTnI9Ui5fZW1zY3JpcHRlbl9iaW5kX1BvaW50QXR0cmlidXRlX3VuaXF1ZV9pZF8wPWZ1bmN0aW9uKCl7cmV0dXJuKE5yPVIuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludEF0dHJpYnV0ZV91bmlxdWVfaWRfMD1SLmFzbS5DKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LE5zPVIuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludEF0dHJpYnV0ZV9fX2Rlc3Ryb3lfX18wPWZ1bmN0aW9uKCl7cmV0dXJuKE5zPVIuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludEF0dHJpYnV0ZV9fX2Rlc3Ryb3lfX18wPVIuYXNtLkQpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sSXM9Ui5fZW1zY3JpcHRlbl9iaW5kX0F0dHJpYnV0ZVF1YW50aXphdGlvblRyYW5zZm9ybV9BdHRyaWJ1dGVRdWFudGl6YXRpb25UcmFuc2Zvcm1fMD1mdW5jdGlvbigpe3JldHVybihJcz1SLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlUXVhbnRpemF0aW9uVHJhbnNmb3JtX0F0dHJpYnV0ZVF1YW50aXphdGlvblRyYW5zZm9ybV8wPVIuYXNtLkUpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sWWk9Ui5fZW1zY3JpcHRlbl9iaW5kX0F0dHJpYnV0ZVF1YW50aXphdGlvblRyYW5zZm9ybV9Jbml0RnJvbUF0dHJpYnV0ZV8xPWZ1bmN0aW9uKCl7cmV0dXJuKFlpPVIuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVRdWFudGl6YXRpb25UcmFuc2Zvcm1fSW5pdEZyb21BdHRyaWJ1dGVfMT1SLmFzbS5GKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LElyPVIuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVRdWFudGl6YXRpb25UcmFuc2Zvcm1fcXVhbnRpemF0aW9uX2JpdHNfMD1mdW5jdGlvbigpe3JldHVybihJcj1SLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlUXVhbnRpemF0aW9uVHJhbnNmb3JtX3F1YW50aXphdGlvbl9iaXRzXzA9Ui5hc20uRykuYXBwbHkobnVsbCxhcmd1bWVudHMpfSwkaT1SLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlUXVhbnRpemF0aW9uVHJhbnNmb3JtX21pbl92YWx1ZV8xPWZ1bmN0aW9uKCl7cmV0dXJuKCRpPVIuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVRdWFudGl6YXRpb25UcmFuc2Zvcm1fbWluX3ZhbHVlXzE9Ui5hc20uSCkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx2cz1SLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlUXVhbnRpemF0aW9uVHJhbnNmb3JtX3JhbmdlXzA9ZnVuY3Rpb24oKXtyZXR1cm4odnM9Ui5fZW1zY3JpcHRlbl9iaW5kX0F0dHJpYnV0ZVF1YW50aXphdGlvblRyYW5zZm9ybV9yYW5nZV8wPVIuYXNtLkkpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sYmk9Ui5fZW1zY3JpcHRlbl9iaW5kX0F0dHJpYnV0ZVF1YW50aXphdGlvblRyYW5zZm9ybV9fX2Rlc3Ryb3lfX18wPWZ1bmN0aW9uKCl7cmV0dXJuKGJpPVIuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVRdWFudGl6YXRpb25UcmFuc2Zvcm1fX19kZXN0cm95X19fMD1SLmFzbS5KKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LG5vPVIuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVPY3RhaGVkcm9uVHJhbnNmb3JtX0F0dHJpYnV0ZU9jdGFoZWRyb25UcmFuc2Zvcm1fMD1mdW5jdGlvbigpe3JldHVybihubz1SLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlT2N0YWhlZHJvblRyYW5zZm9ybV9BdHRyaWJ1dGVPY3RhaGVkcm9uVHJhbnNmb3JtXzA9Ui5hc20uSykuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxwbz1SLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlT2N0YWhlZHJvblRyYW5zZm9ybV9Jbml0RnJvbUF0dHJpYnV0ZV8xPWZ1bmN0aW9uKCl7cmV0dXJuKHBvPVIuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVPY3RhaGVkcm9uVHJhbnNmb3JtX0luaXRGcm9tQXR0cmlidXRlXzE9Ui5hc20uTCkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx2cj1SLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlT2N0YWhlZHJvblRyYW5zZm9ybV9xdWFudGl6YXRpb25fYml0c18wPWZ1bmN0aW9uKCl7cmV0dXJuKHZyPVIuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVPY3RhaGVkcm9uVHJhbnNmb3JtX3F1YW50aXphdGlvbl9iaXRzXzA9Ui5hc20uTSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxNYz1SLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlT2N0YWhlZHJvblRyYW5zZm9ybV9fX2Rlc3Ryb3lfX18wPWZ1bmN0aW9uKCl7cmV0dXJuKE1jPVIuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVPY3RhaGVkcm9uVHJhbnNmb3JtX19fZGVzdHJveV9fXzA9Ui5hc20uTikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxOYz1SLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRDbG91ZF9Qb2ludENsb3VkXzA9ZnVuY3Rpb24oKXtyZXR1cm4oTmM9Ui5fZW1zY3JpcHRlbl9iaW5kX1BvaW50Q2xvdWRfUG9pbnRDbG91ZF8wPVIuYXNtLk8pLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sRG49Ui5fZW1zY3JpcHRlbl9iaW5kX1BvaW50Q2xvdWRfbnVtX2F0dHJpYnV0ZXNfMD1mdW5jdGlvbigpe3JldHVybihEbj1SLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRDbG91ZF9udW1fYXR0cmlidXRlc18wPVIuYXNtLlApLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sd2k9Ui5fZW1zY3JpcHRlbl9iaW5kX1BvaW50Q2xvdWRfbnVtX3BvaW50c18wPWZ1bmN0aW9uKCl7cmV0dXJuKHdpPVIuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludENsb3VkX251bV9wb2ludHNfMD1SLmFzbS5RKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHZlPVIuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludENsb3VkX19fZGVzdHJveV9fXzA9ZnVuY3Rpb24oKXtyZXR1cm4odmU9Ui5fZW1zY3JpcHRlbl9iaW5kX1BvaW50Q2xvdWRfX19kZXN0cm95X19fMD1SLmFzbS5SKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LG9yPVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXNoX01lc2hfMD1mdW5jdGlvbigpe3JldHVybihvcj1SLl9lbXNjcmlwdGVuX2JpbmRfTWVzaF9NZXNoXzA9Ui5hc20uUykuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx5dT1SLl9lbXNjcmlwdGVuX2JpbmRfTWVzaF9udW1fZmFjZXNfMD1mdW5jdGlvbigpe3JldHVybih5dT1SLl9lbXNjcmlwdGVuX2JpbmRfTWVzaF9udW1fZmFjZXNfMD1SLmFzbS5UKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGd1PVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXNoX251bV9hdHRyaWJ1dGVzXzA9ZnVuY3Rpb24oKXtyZXR1cm4oZ3U9Ui5fZW1zY3JpcHRlbl9iaW5kX01lc2hfbnVtX2F0dHJpYnV0ZXNfMD1SLmFzbS5VKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEF1PVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXNoX251bV9wb2ludHNfMD1mdW5jdGlvbigpe3JldHVybihBdT1SLl9lbXNjcmlwdGVuX2JpbmRfTWVzaF9udW1fcG9pbnRzXzA9Ui5hc20uVikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxJYz1SLl9lbXNjcmlwdGVuX2JpbmRfTWVzaF9fX2Rlc3Ryb3lfX18wPWZ1bmN0aW9uKCl7cmV0dXJuKEljPVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXNoX19fZGVzdHJveV9fXzA9Ui5hc20uVykuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx2Yz1SLl9lbXNjcmlwdGVuX2JpbmRfTWV0YWRhdGFfTWV0YWRhdGFfMD1mdW5jdGlvbigpe3JldHVybih2Yz1SLl9lbXNjcmlwdGVuX2JpbmRfTWV0YWRhdGFfTWV0YWRhdGFfMD1SLmFzbS5YKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEhhPVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YV9fX2Rlc3Ryb3lfX18wPWZ1bmN0aW9uKCl7cmV0dXJuKEhhPVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YV9fX2Rlc3Ryb3lfX18wPVIuYXNtLlkpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sYnU9Ui5fZW1zY3JpcHRlbl9iaW5kX1N0YXR1c19jb2RlXzA9ZnVuY3Rpb24oKXtyZXR1cm4oYnU9Ui5fZW1zY3JpcHRlbl9iaW5kX1N0YXR1c19jb2RlXzA9Ui5hc20uWikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxxYT1SLl9lbXNjcmlwdGVuX2JpbmRfU3RhdHVzX29rXzA9ZnVuY3Rpb24oKXtyZXR1cm4ocWE9Ui5fZW1zY3JpcHRlbl9iaW5kX1N0YXR1c19va18wPVIuYXNtLl8pLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sWmk9Ui5fZW1zY3JpcHRlbl9iaW5kX1N0YXR1c19lcnJvcl9tc2dfMD1mdW5jdGlvbigpe3JldHVybihaaT1SLl9lbXNjcmlwdGVuX2JpbmRfU3RhdHVzX2Vycm9yX21zZ18wPVIuYXNtLiQpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sd3U9Ui5fZW1zY3JpcHRlbl9iaW5kX1N0YXR1c19fX2Rlc3Ryb3lfX18wPWZ1bmN0aW9uKCl7cmV0dXJuKHd1PVIuX2Vtc2NyaXB0ZW5fYmluZF9TdGF0dXNfX19kZXN0cm95X19fMD1SLmFzbS5hYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxUdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29GbG9hdDMyQXJyYXlfRHJhY29GbG9hdDMyQXJyYXlfMD1mdW5jdGlvbigpe3JldHVybihUdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29GbG9hdDMyQXJyYXlfRHJhY29GbG9hdDMyQXJyYXlfMD1SLmFzbS5iYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxPdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29GbG9hdDMyQXJyYXlfR2V0VmFsdWVfMT1mdW5jdGlvbigpe3JldHVybihPdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29GbG9hdDMyQXJyYXlfR2V0VmFsdWVfMT1SLmFzbS5jYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxRaT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29GbG9hdDMyQXJyYXlfc2l6ZV8wPWZ1bmN0aW9uKCl7cmV0dXJuKFFpPVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0Zsb2F0MzJBcnJheV9zaXplXzA9Ui5hc20uZGEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sSmk9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvRmxvYXQzMkFycmF5X19fZGVzdHJveV9fXzA9ZnVuY3Rpb24oKXtyZXR1cm4oSmk9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvRmxvYXQzMkFycmF5X19fZGVzdHJveV9fXzA9Ui5hc20uZWEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sTGM9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50OEFycmF5X0RyYWNvSW50OEFycmF5XzA9ZnVuY3Rpb24oKXtyZXR1cm4oTGM9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50OEFycmF5X0RyYWNvSW50OEFycmF5XzA9Ui5hc20uZmEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sRXU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50OEFycmF5X0dldFZhbHVlXzE9ZnVuY3Rpb24oKXtyZXR1cm4oRXU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50OEFycmF5X0dldFZhbHVlXzE9Ui5hc20uZ2EpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sUnU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50OEFycmF5X3NpemVfMD1mdW5jdGlvbigpe3JldHVybihSdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQ4QXJyYXlfc2l6ZV8wPVIuYXNtLmhhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LExyPVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0ludDhBcnJheV9fX2Rlc3Ryb3lfX18wPWZ1bmN0aW9uKCl7cmV0dXJuKExyPVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0ludDhBcnJheV9fX2Rlc3Ryb3lfX18wPVIuYXNtLmlhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEthPVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQ4QXJyYXlfRHJhY29VSW50OEFycmF5XzA9ZnVuY3Rpb24oKXtyZXR1cm4oS2E9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDhBcnJheV9EcmFjb1VJbnQ4QXJyYXlfMD1SLmFzbS5qYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxXYT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50OEFycmF5X0dldFZhbHVlXzE9ZnVuY3Rpb24oKXtyZXR1cm4oV2E9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDhBcnJheV9HZXRWYWx1ZV8xPVIuYXNtLmthKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LERjPVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQ4QXJyYXlfc2l6ZV8wPWZ1bmN0aW9uKCl7cmV0dXJuKERjPVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQ4QXJyYXlfc2l6ZV8wPVIuYXNtLmxhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFN1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQ4QXJyYXlfX19kZXN0cm95X19fMD1mdW5jdGlvbigpe3JldHVybihTdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50OEFycmF5X19fZGVzdHJveV9fXzA9Ui5hc20ubWEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sRmM9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50MTZBcnJheV9EcmFjb0ludDE2QXJyYXlfMD1mdW5jdGlvbigpe3JldHVybihGYz1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQxNkFycmF5X0RyYWNvSW50MTZBcnJheV8wPVIuYXNtLm5hKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEN1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0ludDE2QXJyYXlfR2V0VmFsdWVfMT1mdW5jdGlvbigpe3JldHVybihDdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQxNkFycmF5X0dldFZhbHVlXzE9Ui5hc20ub2EpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0seHU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50MTZBcnJheV9zaXplXzA9ZnVuY3Rpb24oKXtyZXR1cm4oeHU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50MTZBcnJheV9zaXplXzA9Ui5hc20ucGEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sUHU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50MTZBcnJheV9fX2Rlc3Ryb3lfX18wPWZ1bmN0aW9uKCl7cmV0dXJuKFB1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0ludDE2QXJyYXlfX19kZXN0cm95X19fMD1SLmFzbS5xYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxNdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50MTZBcnJheV9EcmFjb1VJbnQxNkFycmF5XzA9ZnVuY3Rpb24oKXtyZXR1cm4oTXU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDE2QXJyYXlfRHJhY29VSW50MTZBcnJheV8wPVIuYXNtLnJhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LE51PVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQxNkFycmF5X0dldFZhbHVlXzE9ZnVuY3Rpb24oKXtyZXR1cm4oTnU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDE2QXJyYXlfR2V0VmFsdWVfMT1SLmFzbS5zYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxJdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50MTZBcnJheV9zaXplXzA9ZnVuY3Rpb24oKXtyZXR1cm4oSXU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDE2QXJyYXlfc2l6ZV8wPVIuYXNtLnRhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFhhPVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQxNkFycmF5X19fZGVzdHJveV9fXzA9ZnVuY3Rpb24oKXtyZXR1cm4oWGE9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDE2QXJyYXlfX19kZXN0cm95X19fMD1SLmFzbS51YSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx2dT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQzMkFycmF5X0RyYWNvSW50MzJBcnJheV8wPWZ1bmN0aW9uKCl7cmV0dXJuKHZ1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0ludDMyQXJyYXlfRHJhY29JbnQzMkFycmF5XzA9Ui5hc20udmEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sTHU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50MzJBcnJheV9HZXRWYWx1ZV8xPWZ1bmN0aW9uKCl7cmV0dXJuKEx1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0ludDMyQXJyYXlfR2V0VmFsdWVfMT1SLmFzbS53YSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxEdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQzMkFycmF5X3NpemVfMD1mdW5jdGlvbigpe3JldHVybihEdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQzMkFycmF5X3NpemVfMD1SLmFzbS54YSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxGdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQzMkFycmF5X19fZGVzdHJveV9fXzA9ZnVuY3Rpb24oKXtyZXR1cm4oRnU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50MzJBcnJheV9fX2Rlc3Ryb3lfX18wPVIuYXNtLnlhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHRzPVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQzMkFycmF5X0RyYWNvVUludDMyQXJyYXlfMD1mdW5jdGlvbigpe3JldHVybih0cz1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50MzJBcnJheV9EcmFjb1VJbnQzMkFycmF5XzA9Ui5hc20uemEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sQnU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDMyQXJyYXlfR2V0VmFsdWVfMT1mdW5jdGlvbigpe3JldHVybihCdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50MzJBcnJheV9HZXRWYWx1ZV8xPVIuYXNtLkFhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFV1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQzMkFycmF5X3NpemVfMD1mdW5jdGlvbigpe3JldHVybihVdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50MzJBcnJheV9zaXplXzA9Ui5hc20uQmEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sTHM9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDMyQXJyYXlfX19kZXN0cm95X19fMD1mdW5jdGlvbigpe3JldHVybihMcz1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50MzJBcnJheV9fX2Rlc3Ryb3lfX18wPVIuYXNtLkNhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFZ1PVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YVF1ZXJpZXJfTWV0YWRhdGFRdWVyaWVyXzA9ZnVuY3Rpb24oKXtyZXR1cm4oVnU9Ui5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhUXVlcmllcl9NZXRhZGF0YVF1ZXJpZXJfMD1SLmFzbS5EYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxrdT1SLl9lbXNjcmlwdGVuX2JpbmRfTWV0YWRhdGFRdWVyaWVyX0hhc0VudHJ5XzI9ZnVuY3Rpb24oKXtyZXR1cm4oa3U9Ui5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhUXVlcmllcl9IYXNFbnRyeV8yPVIuYXNtLkVhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHVyPVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YVF1ZXJpZXJfR2V0SW50RW50cnlfMj1mdW5jdGlvbigpe3JldHVybih1cj1SLl9lbXNjcmlwdGVuX2JpbmRfTWV0YWRhdGFRdWVyaWVyX0dldEludEVudHJ5XzI9Ui5hc20uRmEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sWWE9Ui5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhUXVlcmllcl9HZXRJbnRFbnRyeUFycmF5XzM9ZnVuY3Rpb24oKXtyZXR1cm4oWWE9Ui5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhUXVlcmllcl9HZXRJbnRFbnRyeUFycmF5XzM9Ui5hc20uR2EpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sR3U9Ui5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhUXVlcmllcl9HZXREb3VibGVFbnRyeV8yPWZ1bmN0aW9uKCl7cmV0dXJuKEd1PVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YVF1ZXJpZXJfR2V0RG91YmxlRW50cnlfMj1SLmFzbS5IYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx6dT1SLl9lbXNjcmlwdGVuX2JpbmRfTWV0YWRhdGFRdWVyaWVyX0dldFN0cmluZ0VudHJ5XzI9ZnVuY3Rpb24oKXtyZXR1cm4oenU9Ui5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhUXVlcmllcl9HZXRTdHJpbmdFbnRyeV8yPVIuYXNtLklhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGp1PVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YVF1ZXJpZXJfTnVtRW50cmllc18xPWZ1bmN0aW9uKCl7cmV0dXJuKGp1PVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YVF1ZXJpZXJfTnVtRW50cmllc18xPVIuYXNtLkphKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHFvPVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YVF1ZXJpZXJfR2V0RW50cnlOYW1lXzI9ZnVuY3Rpb24oKXtyZXR1cm4ocW89Ui5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhUXVlcmllcl9HZXRFbnRyeU5hbWVfMj1SLmFzbS5LYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSwkYT1SLl9lbXNjcmlwdGVuX2JpbmRfTWV0YWRhdGFRdWVyaWVyX19fZGVzdHJveV9fXzA9ZnVuY3Rpb24oKXtyZXR1cm4oJGE9Ui5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhUXVlcmllcl9fX2Rlc3Ryb3lfX18wPVIuYXNtLkxhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFphPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0RlY29kZXJfMD1mdW5jdGlvbigpe3JldHVybihaYT1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9EZWNvZGVyXzA9Ui5hc20uTWEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sRHM9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfRGVjb2RlQXJyYXlUb1BvaW50Q2xvdWRfMz1mdW5jdGlvbigpe3JldHVybihEcz1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9EZWNvZGVBcnJheVRvUG9pbnRDbG91ZF8zPVIuYXNtLk5hKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEh1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0RlY29kZUFycmF5VG9NZXNoXzM9ZnVuY3Rpb24oKXtyZXR1cm4oSHU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfRGVjb2RlQXJyYXlUb01lc2hfMz1SLmFzbS5PYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxCYz1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVJZF8yPWZ1bmN0aW9uKCl7cmV0dXJuKEJjPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZUlkXzI9Ui5hc20uUGEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0scXU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlSWRCeU5hbWVfMj1mdW5jdGlvbigpe3JldHVybihxdT1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVJZEJ5TmFtZV8yPVIuYXNtLlFhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFFhPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZUlkQnlNZXRhZGF0YUVudHJ5XzM9ZnVuY3Rpb24oKXtyZXR1cm4oUWE9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlSWRCeU1ldGFkYXRhRW50cnlfMz1SLmFzbS5SYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxKYT1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVfMj1mdW5jdGlvbigpe3JldHVybihKYT1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVfMj1SLmFzbS5TYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxLdT1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVCeVVuaXF1ZUlkXzI9ZnVuY3Rpb24oKXtyZXR1cm4oS3U9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlQnlVbmlxdWVJZF8yPVIuYXNtLlRhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFd1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldE1ldGFkYXRhXzE9ZnVuY3Rpb24oKXtyZXR1cm4oV3U9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0TWV0YWRhdGFfMT1SLmFzbS5VYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxVYz1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVNZXRhZGF0YV8yPWZ1bmN0aW9uKCl7cmV0dXJuKFVjPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZU1ldGFkYXRhXzI9Ui5hc20uVmEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sZ289Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0RmFjZUZyb21NZXNoXzM9ZnVuY3Rpb24oKXtyZXR1cm4oZ289Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0RmFjZUZyb21NZXNoXzM9Ui5hc20uV2EpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sVmM9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0VHJpYW5nbGVTdHJpcHNGcm9tTWVzaF8yPWZ1bmN0aW9uKCl7cmV0dXJuKFZjPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldFRyaWFuZ2xlU3RyaXBzRnJvbU1lc2hfMj1SLmFzbS5YYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxYdT1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRUcmlhbmdsZXNVSW50MTZBcnJheV8zPWZ1bmN0aW9uKCl7cmV0dXJuKFh1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldFRyaWFuZ2xlc1VJbnQxNkFycmF5XzM9Ui5hc20uWWEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sWXU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0VHJpYW5nbGVzVUludDMyQXJyYXlfMz1mdW5jdGlvbigpe3JldHVybihZdT1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRUcmlhbmdsZXNVSW50MzJBcnJheV8zPVIuYXNtLlphKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LCR1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZUZsb2F0XzM9ZnVuY3Rpb24oKXtyZXR1cm4oJHU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlRmxvYXRfMz1SLmFzbS5fYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxscj1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVGbG9hdEZvckFsbFBvaW50c18zPWZ1bmN0aW9uKCl7cmV0dXJuKGxyPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZUZsb2F0Rm9yQWxsUG9pbnRzXzM9Ui5hc20uJGEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sWnU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlSW50Rm9yQWxsUG9pbnRzXzM9ZnVuY3Rpb24oKXtyZXR1cm4oWnU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlSW50Rm9yQWxsUG9pbnRzXzM9Ui5hc20uYWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sUXU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlSW50OEZvckFsbFBvaW50c18zPWZ1bmN0aW9uKCl7cmV0dXJuKFF1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZUludDhGb3JBbGxQb2ludHNfMz1SLmFzbS5iYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxKdT1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVVSW50OEZvckFsbFBvaW50c18zPWZ1bmN0aW9uKCl7cmV0dXJuKEp1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZVVJbnQ4Rm9yQWxsUG9pbnRzXzM9Ui5hc20uY2IpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sRnM9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlSW50MTZGb3JBbGxQb2ludHNfMz1mdW5jdGlvbigpe3JldHVybihGcz1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVJbnQxNkZvckFsbFBvaW50c18zPVIuYXNtLmRiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHRsPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZVVJbnQxNkZvckFsbFBvaW50c18zPWZ1bmN0aW9uKCl7cmV0dXJuKHRsPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZVVJbnQxNkZvckFsbFBvaW50c18zPVIuYXNtLmViKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFRpPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZUludDMyRm9yQWxsUG9pbnRzXzM9ZnVuY3Rpb24oKXtyZXR1cm4oVGk9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlSW50MzJGb3JBbGxQb2ludHNfMz1SLmFzbS5mYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxlbD1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVVSW50MzJGb3JBbGxQb2ludHNfMz1mdW5jdGlvbigpe3JldHVybihlbD1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVVSW50MzJGb3JBbGxQb2ludHNfMz1SLmFzbS5nYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxubD1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVEYXRhQXJyYXlGb3JBbGxQb2ludHNfNT1mdW5jdGlvbigpe3JldHVybihubD1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVEYXRhQXJyYXlGb3JBbGxQb2ludHNfNT1SLmFzbS5oYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxvbD1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9Ta2lwQXR0cmlidXRlVHJhbnNmb3JtXzE9ZnVuY3Rpb24oKXtyZXR1cm4ob2w9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfU2tpcEF0dHJpYnV0ZVRyYW5zZm9ybV8xPVIuYXNtLmliKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHJsPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEVuY29kZWRHZW9tZXRyeVR5cGVfRGVwcmVjYXRlZF8xPWZ1bmN0aW9uKCl7cmV0dXJuKHJsPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEVuY29kZWRHZW9tZXRyeVR5cGVfRGVwcmVjYXRlZF8xPVIuYXNtLmpiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGlsPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0RlY29kZUJ1ZmZlclRvUG9pbnRDbG91ZF8yPWZ1bmN0aW9uKCl7cmV0dXJuKGlsPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0RlY29kZUJ1ZmZlclRvUG9pbnRDbG91ZF8yPVIuYXNtLmtiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHNsPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0RlY29kZUJ1ZmZlclRvTWVzaF8yPWZ1bmN0aW9uKCl7cmV0dXJuKHNsPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0RlY29kZUJ1ZmZlclRvTWVzaF8yPVIuYXNtLmxiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGNsPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX19fZGVzdHJveV9fXzA9ZnVuY3Rpb24oKXtyZXR1cm4oY2w9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfX19kZXN0cm95X19fMD1SLmFzbS5tYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxhbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fQXR0cmlidXRlVHJhbnNmb3JtVHlwZV9BVFRSSUJVVEVfSU5WQUxJRF9UUkFOU0ZPUk09ZnVuY3Rpb24oKXtyZXR1cm4oYWw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0F0dHJpYnV0ZVRyYW5zZm9ybVR5cGVfQVRUUklCVVRFX0lOVkFMSURfVFJBTlNGT1JNPVIuYXNtLm5iKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGZsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19BdHRyaWJ1dGVUcmFuc2Zvcm1UeXBlX0FUVFJJQlVURV9OT19UUkFOU0ZPUk09ZnVuY3Rpb24oKXtyZXR1cm4oZmw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0F0dHJpYnV0ZVRyYW5zZm9ybVR5cGVfQVRUUklCVVRFX05PX1RSQU5TRk9STT1SLmFzbS5vYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx1bD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fQXR0cmlidXRlVHJhbnNmb3JtVHlwZV9BVFRSSUJVVEVfUVVBTlRJWkFUSU9OX1RSQU5TRk9STT1mdW5jdGlvbigpe3JldHVybih1bD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fQXR0cmlidXRlVHJhbnNmb3JtVHlwZV9BVFRSSUJVVEVfUVVBTlRJWkFUSU9OX1RSQU5TRk9STT1SLmFzbS5wYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxsbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fQXR0cmlidXRlVHJhbnNmb3JtVHlwZV9BVFRSSUJVVEVfT0NUQUhFRFJPTl9UUkFOU0ZPUk09ZnVuY3Rpb24oKXtyZXR1cm4obGw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0F0dHJpYnV0ZVRyYW5zZm9ybVR5cGVfQVRUUklCVVRFX09DVEFIRURST05fVFJBTlNGT1JNPVIuYXNtLnFiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGVzPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19HZW9tZXRyeUF0dHJpYnV0ZV9UeXBlX0lOVkFMSUQ9ZnVuY3Rpb24oKXtyZXR1cm4oZXM9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0dlb21ldHJ5QXR0cmlidXRlX1R5cGVfSU5WQUxJRD1SLmFzbS5yYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxwbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fR2VvbWV0cnlBdHRyaWJ1dGVfVHlwZV9QT1NJVElPTj1mdW5jdGlvbigpe3JldHVybihwbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fR2VvbWV0cnlBdHRyaWJ1dGVfVHlwZV9QT1NJVElPTj1SLmFzbS5zYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxkbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fR2VvbWV0cnlBdHRyaWJ1dGVfVHlwZV9OT1JNQUw9ZnVuY3Rpb24oKXtyZXR1cm4oZGw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0dlb21ldHJ5QXR0cmlidXRlX1R5cGVfTk9STUFMPVIuYXNtLnRiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEJzPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19HZW9tZXRyeUF0dHJpYnV0ZV9UeXBlX0NPTE9SPWZ1bmN0aW9uKCl7cmV0dXJuKEJzPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19HZW9tZXRyeUF0dHJpYnV0ZV9UeXBlX0NPTE9SPVIuYXNtLnViKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGtjPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19HZW9tZXRyeUF0dHJpYnV0ZV9UeXBlX1RFWF9DT09SRD1mdW5jdGlvbigpe3JldHVybihrYz1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fR2VvbWV0cnlBdHRyaWJ1dGVfVHlwZV9URVhfQ09PUkQ9Ui5hc20udmIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sbWw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0dlb21ldHJ5QXR0cmlidXRlX1R5cGVfR0VORVJJQz1mdW5jdGlvbigpe3JldHVybihtbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fR2VvbWV0cnlBdHRyaWJ1dGVfVHlwZV9HRU5FUklDPVIuYXNtLndiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHRmPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19FbmNvZGVkR2VvbWV0cnlUeXBlX0lOVkFMSURfR0VPTUVUUllfVFlQRT1mdW5jdGlvbigpe3JldHVybih0Zj1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRW5jb2RlZEdlb21ldHJ5VHlwZV9JTlZBTElEX0dFT01FVFJZX1RZUEU9Ui5hc20ueGIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0saGw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0VuY29kZWRHZW9tZXRyeVR5cGVfUE9JTlRfQ0xPVUQ9ZnVuY3Rpb24oKXtyZXR1cm4oaGw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0VuY29kZWRHZW9tZXRyeVR5cGVfUE9JTlRfQ0xPVUQ9Ui5hc20ueWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sX2w9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0VuY29kZWRHZW9tZXRyeVR5cGVfVFJJQU5HVUxBUl9NRVNIPWZ1bmN0aW9uKCl7cmV0dXJuKF9sPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19FbmNvZGVkR2VvbWV0cnlUeXBlX1RSSUFOR1VMQVJfTUVTSD1SLmFzbS56YikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx5bD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfSU5WQUxJRD1mdW5jdGlvbigpe3JldHVybih5bD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfSU5WQUxJRD1SLmFzbS5BYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxnbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfSU5UOD1mdW5jdGlvbigpe3JldHVybihnbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfSU5UOD1SLmFzbS5CYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxBbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfVUlOVDg9ZnVuY3Rpb24oKXtyZXR1cm4oQWw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0RhdGFUeXBlX0RUX1VJTlQ4PVIuYXNtLkNiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGJsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9JTlQxNj1mdW5jdGlvbigpe3JldHVybihibD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfSU5UMTY9Ui5hc20uRGIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sd2w9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0RhdGFUeXBlX0RUX1VJTlQxNj1mdW5jdGlvbigpe3JldHVybih3bD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfVUlOVDE2PVIuYXNtLkViKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFRsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9JTlQzMj1mdW5jdGlvbigpe3JldHVybihUbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfSU5UMzI9Ui5hc20uRmIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sZWY9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0RhdGFUeXBlX0RUX1VJTlQzMj1mdW5jdGlvbigpe3JldHVybihlZj1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfVUlOVDMyPVIuYXNtLkdiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LE9sPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9JTlQ2ND1mdW5jdGlvbigpe3JldHVybihPbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfSU5UNjQ9Ui5hc20uSGIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sRWw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0RhdGFUeXBlX0RUX1VJTlQ2ND1mdW5jdGlvbigpe3JldHVybihFbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfVUlOVDY0PVIuYXNtLkliKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFJsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9GTE9BVDMyPWZ1bmN0aW9uKCl7cmV0dXJuKFJsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9GTE9BVDMyPVIuYXNtLkpiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFNsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9GTE9BVDY0PWZ1bmN0aW9uKCl7cmV0dXJuKFNsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9GTE9BVDY0PVIuYXNtLktiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LENsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9CT09MPWZ1bmN0aW9uKCl7cmV0dXJuKENsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9CT09MPVIuYXNtLkxiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHhsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9UWVBFU19DT1VOVD1mdW5jdGlvbigpe3JldHVybih4bD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfVFlQRVNfQ09VTlQ9Ui5hc20uTWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sUGw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX1N0YXR1c0NvZGVfT0s9ZnVuY3Rpb24oKXtyZXR1cm4oUGw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX1N0YXR1c0NvZGVfT0s9Ui5hc20uTmIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sVXM9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX1N0YXR1c0NvZGVfRFJBQ09fRVJST1I9ZnVuY3Rpb24oKXtyZXR1cm4oVXM9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX1N0YXR1c0NvZGVfRFJBQ09fRVJST1I9Ui5hc20uT2IpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sTWw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX1N0YXR1c0NvZGVfSU9fRVJST1I9ZnVuY3Rpb24oKXtyZXR1cm4oTWw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX1N0YXR1c0NvZGVfSU9fRVJST1I9Ui5hc20uUGIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sTmw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX1N0YXR1c0NvZGVfSU5WQUxJRF9QQVJBTUVURVI9ZnVuY3Rpb24oKXtyZXR1cm4oTmw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX1N0YXR1c0NvZGVfSU5WQUxJRF9QQVJBTUVURVI9Ui5hc20uUWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sSWw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX1N0YXR1c0NvZGVfVU5TVVBQT1JURURfVkVSU0lPTj1mdW5jdGlvbigpe3JldHVybihJbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fU3RhdHVzQ29kZV9VTlNVUFBPUlRFRF9WRVJTSU9OPVIuYXNtLlJiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHZsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19TdGF0dXNDb2RlX1VOS05PV05fVkVSU0lPTj1mdW5jdGlvbigpe3JldHVybih2bD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fU3RhdHVzQ29kZV9VTktOT1dOX1ZFUlNJT049Ui5hc20uU2IpLmFwcGx5KG51bGwsYXJndW1lbnRzKX07Ui5fbWFsbG9jPWZ1bmN0aW9uKCl7cmV0dXJuKFIuX21hbGxvYz1SLmFzbS5UYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxSLl9mcmVlPWZ1bmN0aW9uKCl7cmV0dXJuKFIuX2ZyZWU9Ui5hc20uVWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIExsPWZ1bmN0aW9uKCl7cmV0dXJuKExsPVIuYXNtLlZiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O1IuX19fc3RhcnRfZW1fanM9MTU4NTYsUi5fX19zdG9wX2VtX2pzPTE1OTU0O3ZhciBuZjtpZihkbj1mdW5jdGlvbiB6KCl7bmZ8fHAoKSxuZnx8KGRuPXopfSxSLnByZUluaXQpZm9yKHR5cGVvZiBSLnByZUluaXQ9PSJmdW5jdGlvbiImJihSLnByZUluaXQ9W1IucHJlSW5pdF0pOzA8Ui5wcmVJbml0Lmxlbmd0aDspUi5wcmVJbml0LnBvcCgpKCk7cCgpLGQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLGQucHJvdG90eXBlLmNvbnN0cnVjdG9yPWQsZC5wcm90b3R5cGUuX19jbGFzc19fPWQsZC5fX2NhY2hlX189e30sUi5XcmFwcGVyT2JqZWN0PWQsUi5nZXRDYWNoZT1tLFIud3JhcFBvaW50ZXI9XyxSLmNhc3RPYmplY3Q9ZnVuY3Rpb24oeixXKXtyZXR1cm4gXyh6LnB0cixXKX0sUi5OVUxMPV8oMCksUi5kZXN0cm95PWZ1bmN0aW9uKHope2lmKCF6Ll9fZGVzdHJveV9fKXRocm93IkVycm9yOiBDYW5ub3QgZGVzdHJveSBvYmplY3QuIChEaWQgeW91IGNyZWF0ZSBpdCB5b3Vyc2VsZj8pIjt6Ll9fZGVzdHJveV9fKCksZGVsZXRlIG0oei5fX2NsYXNzX18pW3oucHRyXX0sUi5jb21wYXJlPWZ1bmN0aW9uKHosVyl7cmV0dXJuIHoucHRyPT09Vy5wdHJ9LFIuZ2V0UG9pbnRlcj1mdW5jdGlvbih6KXtyZXR1cm4gei5wdHJ9LFIuZ2V0Q2xhc3M9ZnVuY3Rpb24oeil7cmV0dXJuIHouX19jbGFzc19ffTt2YXIgUmU9e2J1ZmZlcjowLHNpemU6MCxwb3M6MCx0ZW1wczpbXSxuZWVkZWQ6MCxwcmVwYXJlOmZ1bmN0aW9uKCl7aWYoUmUubmVlZGVkKXtmb3IodmFyIHo9MDt6PFJlLnRlbXBzLmxlbmd0aDt6KyspUi5fZnJlZShSZS50ZW1wc1t6XSk7UmUudGVtcHMubGVuZ3RoPTAsUi5fZnJlZShSZS5idWZmZXIpLFJlLmJ1ZmZlcj0wLFJlLnNpemUrPVJlLm5lZWRlZCxSZS5uZWVkZWQ9MH1SZS5idWZmZXJ8fChSZS5zaXplKz0xMjgsUmUuYnVmZmVyPVIuX21hbGxvYyhSZS5zaXplKSxSZS5idWZmZXJ8fHModm9pZCAwKSksUmUucG9zPTB9LGFsbG9jOmZ1bmN0aW9uKHosVyl7cmV0dXJuIFJlLmJ1ZmZlcnx8cyh2b2lkIDApLHo9ei5sZW5ndGgqVy5CWVRFU19QRVJfRUxFTUVOVCx6PXorNyYtOCxSZS5wb3Mrej49UmUuc2l6ZT8oMDx6fHxzKHZvaWQgMCksUmUubmVlZGVkKz16LFc9Ui5fbWFsbG9jKHopLFJlLnRlbXBzLnB1c2goVykpOihXPVJlLmJ1ZmZlcitSZS5wb3MsUmUucG9zKz16KSxXfSxjb3B5OmZ1bmN0aW9uKHosVyxldCl7c3dpdGNoKGV0Pj4+PTAsVy5CWVRFU19QRVJfRUxFTUVOVCl7Y2FzZSAyOmV0Pj4+PTE7YnJlYWs7Y2FzZSA0OmV0Pj4+PTI7YnJlYWs7Y2FzZSA4OmV0Pj4+PTN9Zm9yKHZhciBNdD0wO010PHoubGVuZ3RoO010KyspV1tldCtNdF09eltNdF19fTtyZXR1cm4gdy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSksdy5wcm90b3R5cGUuY29uc3RydWN0b3I9dyx3LnByb3RvdHlwZS5fX2NsYXNzX189dyx3Ll9fY2FjaGVfXz17fSxSLlZvaWRQdHI9dyx3LnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz13LnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1mdW5jdGlvbigpe1plKHRoaXMucHRyKX0sTy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSksTy5wcm90b3R5cGUuY29uc3RydWN0b3I9TyxPLnByb3RvdHlwZS5fX2NsYXNzX189TyxPLl9fY2FjaGVfXz17fSxSLkRlY29kZXJCdWZmZXI9TyxPLnByb3RvdHlwZS5Jbml0PU8ucHJvdG90eXBlLkluaXQ9ZnVuY3Rpb24oeixXKXt2YXIgZXQ9dGhpcy5wdHI7UmUucHJlcGFyZSgpLHR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9Yih6KSksVyYmdHlwZW9mIFc9PSJvYmplY3QiJiYoVz1XLnB0ciksS2UoZXQseixXKX0sTy5wcm90b3R5cGUuX19kZXN0cm95X189Ty5wcm90b3R5cGUuX19kZXN0cm95X189ZnVuY3Rpb24oKXtobih0aGlzLnB0cil9LEUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLEUucHJvdG90eXBlLmNvbnN0cnVjdG9yPUUsRS5wcm90b3R5cGUuX19jbGFzc19fPUUsRS5fX2NhY2hlX189e30sUi5BdHRyaWJ1dGVUcmFuc2Zvcm1EYXRhPUUsRS5wcm90b3R5cGUudHJhbnNmb3JtX3R5cGU9RS5wcm90b3R5cGUudHJhbnNmb3JtX3R5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gcW4odGhpcy5wdHIpfSxFLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1FLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1mdW5jdGlvbigpe0tuKHRoaXMucHRyKX0sVC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSksVC5wcm90b3R5cGUuY29uc3RydWN0b3I9VCxULnByb3RvdHlwZS5fX2NsYXNzX189VCxULl9fY2FjaGVfXz17fSxSLkdlb21ldHJ5QXR0cmlidXRlPVQsVC5wcm90b3R5cGUuX19kZXN0cm95X189VC5wcm90b3R5cGUuX19kZXN0cm95X189ZnVuY3Rpb24oKXt6ZSh0aGlzLnB0cil9LEMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLEMucHJvdG90eXBlLmNvbnN0cnVjdG9yPUMsQy5wcm90b3R5cGUuX19jbGFzc19fPUMsQy5fX2NhY2hlX189e30sUi5Qb2ludEF0dHJpYnV0ZT1DLEMucHJvdG90eXBlLnNpemU9Qy5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiBMbih0aGlzLnB0cil9LEMucHJvdG90eXBlLkdldEF0dHJpYnV0ZVRyYW5zZm9ybURhdGE9Qy5wcm90b3R5cGUuR2V0QXR0cmlidXRlVHJhbnNmb3JtRGF0YT1mdW5jdGlvbigpe3JldHVybiBfKFduKHRoaXMucHRyKSxFKX0sQy5wcm90b3R5cGUuYXR0cmlidXRlX3R5cGU9Qy5wcm90b3R5cGUuYXR0cmlidXRlX3R5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gam8odGhpcy5wdHIpfSxDLnByb3RvdHlwZS5kYXRhX3R5cGU9Qy5wcm90b3R5cGUuZGF0YV90eXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHJuKHRoaXMucHRyKX0sQy5wcm90b3R5cGUubnVtX2NvbXBvbmVudHM9Qy5wcm90b3R5cGUubnVtX2NvbXBvbmVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gRW4odGhpcy5wdHIpfSxDLnByb3RvdHlwZS5ub3JtYWxpemVkPUMucHJvdG90eXBlLm5vcm1hbGl6ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hIWZyKHRoaXMucHRyKX0sQy5wcm90b3R5cGUuYnl0ZV9zdHJpZGU9Qy5wcm90b3R5cGUuYnl0ZV9zdHJpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gWm4odGhpcy5wdHIpfSxDLnByb3RvdHlwZS5ieXRlX29mZnNldD1DLnByb3RvdHlwZS5ieXRlX29mZnNldD1mdW5jdGlvbigpe3JldHVybiBIbyh0aGlzLnB0cil9LEMucHJvdG90eXBlLnVuaXF1ZV9pZD1DLnByb3RvdHlwZS51bmlxdWVfaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gTnIodGhpcy5wdHIpfSxDLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1DLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1mdW5jdGlvbigpe05zKHRoaXMucHRyKX0sTi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSksTi5wcm90b3R5cGUuY29uc3RydWN0b3I9TixOLnByb3RvdHlwZS5fX2NsYXNzX189TixOLl9fY2FjaGVfXz17fSxSLkF0dHJpYnV0ZVF1YW50aXphdGlvblRyYW5zZm9ybT1OLE4ucHJvdG90eXBlLkluaXRGcm9tQXR0cmlidXRlPU4ucHJvdG90eXBlLkluaXRGcm9tQXR0cmlidXRlPWZ1bmN0aW9uKHope3ZhciBXPXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSwhIVlpKFcseil9LE4ucHJvdG90eXBlLnF1YW50aXphdGlvbl9iaXRzPU4ucHJvdG90eXBlLnF1YW50aXphdGlvbl9iaXRzPWZ1bmN0aW9uKCl7cmV0dXJuIElyKHRoaXMucHRyKX0sTi5wcm90b3R5cGUubWluX3ZhbHVlPU4ucHJvdG90eXBlLm1pbl92YWx1ZT1mdW5jdGlvbih6KXt2YXIgVz10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksJGkoVyx6KX0sTi5wcm90b3R5cGUucmFuZ2U9Ti5wcm90b3R5cGUucmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdnModGhpcy5wdHIpfSxOLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1OLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1mdW5jdGlvbigpe2JpKHRoaXMucHRyKX0sSS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSksSS5wcm90b3R5cGUuY29uc3RydWN0b3I9SSxJLnByb3RvdHlwZS5fX2NsYXNzX189SSxJLl9fY2FjaGVfXz17fSxSLkF0dHJpYnV0ZU9jdGFoZWRyb25UcmFuc2Zvcm09SSxJLnByb3RvdHlwZS5Jbml0RnJvbUF0dHJpYnV0ZT1JLnByb3RvdHlwZS5Jbml0RnJvbUF0dHJpYnV0ZT1mdW5jdGlvbih6KXt2YXIgVz10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksISFwbyhXLHopfSxJLnByb3RvdHlwZS5xdWFudGl6YXRpb25fYml0cz1JLnByb3RvdHlwZS5xdWFudGl6YXRpb25fYml0cz1mdW5jdGlvbigpe3JldHVybiB2cih0aGlzLnB0cil9LEkucHJvdG90eXBlLl9fZGVzdHJveV9fPUkucHJvdG90eXBlLl9fZGVzdHJveV9fPWZ1bmN0aW9uKCl7TWModGhpcy5wdHIpfSxELnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSxELnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1ELEQucHJvdG90eXBlLl9fY2xhc3NfXz1ELEQuX19jYWNoZV9fPXt9LFIuUG9pbnRDbG91ZD1ELEQucHJvdG90eXBlLm51bV9hdHRyaWJ1dGVzPUQucHJvdG90eXBlLm51bV9hdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7cmV0dXJuIERuKHRoaXMucHRyKX0sRC5wcm90b3R5cGUubnVtX3BvaW50cz1ELnByb3RvdHlwZS5udW1fcG9pbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHdpKHRoaXMucHRyKX0sRC5wcm90b3R5cGUuX19kZXN0cm95X189RC5wcm90b3R5cGUuX19kZXN0cm95X189ZnVuY3Rpb24oKXt2ZSh0aGlzLnB0cil9LHYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLHYucHJvdG90eXBlLmNvbnN0cnVjdG9yPXYsdi5wcm90b3R5cGUuX19jbGFzc19fPXYsdi5fX2NhY2hlX189e30sUi5NZXNoPXYsdi5wcm90b3R5cGUubnVtX2ZhY2VzPXYucHJvdG90eXBlLm51bV9mYWNlcz1mdW5jdGlvbigpe3JldHVybiB5dSh0aGlzLnB0cil9LHYucHJvdG90eXBlLm51bV9hdHRyaWJ1dGVzPXYucHJvdG90eXBlLm51bV9hdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7cmV0dXJuIGd1KHRoaXMucHRyKX0sdi5wcm90b3R5cGUubnVtX3BvaW50cz12LnByb3RvdHlwZS5udW1fcG9pbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIEF1KHRoaXMucHRyKX0sdi5wcm90b3R5cGUuX19kZXN0cm95X189di5wcm90b3R5cGUuX19kZXN0cm95X189ZnVuY3Rpb24oKXtJYyh0aGlzLnB0cil9LEwucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLEwucHJvdG90eXBlLmNvbnN0cnVjdG9yPUwsTC5wcm90b3R5cGUuX19jbGFzc19fPUwsTC5fX2NhY2hlX189e30sUi5NZXRhZGF0YT1MLEwucHJvdG90eXBlLl9fZGVzdHJveV9fPUwucHJvdG90eXBlLl9fZGVzdHJveV9fPWZ1bmN0aW9uKCl7SGEodGhpcy5wdHIpfSxVLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSxVLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1VLFUucHJvdG90eXBlLl9fY2xhc3NfXz1VLFUuX19jYWNoZV9fPXt9LFIuU3RhdHVzPVUsVS5wcm90b3R5cGUuY29kZT1VLnByb3RvdHlwZS5jb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIGJ1KHRoaXMucHRyKX0sVS5wcm90b3R5cGUub2s9VS5wcm90b3R5cGUub2s9ZnVuY3Rpb24oKXtyZXR1cm4hIXFhKHRoaXMucHRyKX0sVS5wcm90b3R5cGUuZXJyb3JfbXNnPVUucHJvdG90eXBlLmVycm9yX21zZz1mdW5jdGlvbigpe3JldHVybiByKFppKHRoaXMucHRyKSl9LFUucHJvdG90eXBlLl9fZGVzdHJveV9fPVUucHJvdG90eXBlLl9fZGVzdHJveV9fPWZ1bmN0aW9uKCl7d3UodGhpcy5wdHIpfSxBLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSxBLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1BLEEucHJvdG90eXBlLl9fY2xhc3NfXz1BLEEuX19jYWNoZV9fPXt9LFIuRHJhY29GbG9hdDMyQXJyYXk9QSxBLnByb3RvdHlwZS5HZXRWYWx1ZT1BLnByb3RvdHlwZS5HZXRWYWx1ZT1mdW5jdGlvbih6KXt2YXIgVz10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksT3UoVyx6KX0sQS5wcm90b3R5cGUuc2l6ZT1BLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIFFpKHRoaXMucHRyKX0sQS5wcm90b3R5cGUuX19kZXN0cm95X189QS5wcm90b3R5cGUuX19kZXN0cm95X189ZnVuY3Rpb24oKXtKaSh0aGlzLnB0cil9LFMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLFMucHJvdG90eXBlLmNvbnN0cnVjdG9yPVMsUy5wcm90b3R5cGUuX19jbGFzc19fPVMsUy5fX2NhY2hlX189e30sUi5EcmFjb0ludDhBcnJheT1TLFMucHJvdG90eXBlLkdldFZhbHVlPVMucHJvdG90eXBlLkdldFZhbHVlPWZ1bmN0aW9uKHope3ZhciBXPXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxFdShXLHopfSxTLnByb3RvdHlwZS5zaXplPVMucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gUnUodGhpcy5wdHIpfSxTLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1TLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1mdW5jdGlvbigpe0xyKHRoaXMucHRyKX0sUC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSksUC5wcm90b3R5cGUuY29uc3RydWN0b3I9UCxQLnByb3RvdHlwZS5fX2NsYXNzX189UCxQLl9fY2FjaGVfXz17fSxSLkRyYWNvVUludDhBcnJheT1QLFAucHJvdG90eXBlLkdldFZhbHVlPVAucHJvdG90eXBlLkdldFZhbHVlPWZ1bmN0aW9uKHope3ZhciBXPXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxXYShXLHopfSxQLnByb3RvdHlwZS5zaXplPVAucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gRGModGhpcy5wdHIpfSxQLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1QLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1mdW5jdGlvbigpe1N1KHRoaXMucHRyKX0sQi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSksQi5wcm90b3R5cGUuY29uc3RydWN0b3I9QixCLnByb3RvdHlwZS5fX2NsYXNzX189QixCLl9fY2FjaGVfXz17fSxSLkRyYWNvSW50MTZBcnJheT1CLEIucHJvdG90eXBlLkdldFZhbHVlPUIucHJvdG90eXBlLkdldFZhbHVlPWZ1bmN0aW9uKHope3ZhciBXPXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxDdShXLHopfSxCLnByb3RvdHlwZS5zaXplPUIucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4geHUodGhpcy5wdHIpfSxCLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1CLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1mdW5jdGlvbigpe1B1KHRoaXMucHRyKX0sai5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSksai5wcm90b3R5cGUuY29uc3RydWN0b3I9aixqLnByb3RvdHlwZS5fX2NsYXNzX189aixqLl9fY2FjaGVfXz17fSxSLkRyYWNvVUludDE2QXJyYXk9aixqLnByb3RvdHlwZS5HZXRWYWx1ZT1qLnByb3RvdHlwZS5HZXRWYWx1ZT1mdW5jdGlvbih6KXt2YXIgVz10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksTnUoVyx6KX0sai5wcm90b3R5cGUuc2l6ZT1qLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIEl1KHRoaXMucHRyKX0sai5wcm90b3R5cGUuX19kZXN0cm95X189ai5wcm90b3R5cGUuX19kZXN0cm95X189ZnVuY3Rpb24oKXtYYSh0aGlzLnB0cil9LEgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLEgucHJvdG90eXBlLmNvbnN0cnVjdG9yPUgsSC5wcm90b3R5cGUuX19jbGFzc19fPUgsSC5fX2NhY2hlX189e30sUi5EcmFjb0ludDMyQXJyYXk9SCxILnByb3RvdHlwZS5HZXRWYWx1ZT1ILnByb3RvdHlwZS5HZXRWYWx1ZT1mdW5jdGlvbih6KXt2YXIgVz10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksTHUoVyx6KX0sSC5wcm90b3R5cGUuc2l6ZT1ILnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIER1KHRoaXMucHRyKX0sSC5wcm90b3R5cGUuX19kZXN0cm95X189SC5wcm90b3R5cGUuX19kZXN0cm95X189ZnVuY3Rpb24oKXtGdSh0aGlzLnB0cil9LGsucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLGsucHJvdG90eXBlLmNvbnN0cnVjdG9yPWssay5wcm90b3R5cGUuX19jbGFzc19fPWssay5fX2NhY2hlX189e30sUi5EcmFjb1VJbnQzMkFycmF5PWssay5wcm90b3R5cGUuR2V0VmFsdWU9ay5wcm90b3R5cGUuR2V0VmFsdWU9ZnVuY3Rpb24oeil7dmFyIFc9dGhpcy5wdHI7cmV0dXJuIHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLEJ1KFcseil9LGsucHJvdG90eXBlLnNpemU9ay5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiBVdSh0aGlzLnB0cil9LGsucHJvdG90eXBlLl9fZGVzdHJveV9fPWsucHJvdG90eXBlLl9fZGVzdHJveV9fPWZ1bmN0aW9uKCl7THModGhpcy5wdHIpfSxLLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSxLLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1LLEsucHJvdG90eXBlLl9fY2xhc3NfXz1LLEsuX19jYWNoZV9fPXt9LFIuTWV0YWRhdGFRdWVyaWVyPUssSy5wcm90b3R5cGUuSGFzRW50cnk9Sy5wcm90b3R5cGUuSGFzRW50cnk9ZnVuY3Rpb24oeixXKXt2YXIgZXQ9dGhpcy5wdHI7cmV0dXJuIFJlLnByZXBhcmUoKSx6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxXPVcmJnR5cGVvZiBXPT0ib2JqZWN0Ij9XLnB0cjpnKFcpLCEha3UoZXQseixXKX0sSy5wcm90b3R5cGUuR2V0SW50RW50cnk9Sy5wcm90b3R5cGUuR2V0SW50RW50cnk9ZnVuY3Rpb24oeixXKXt2YXIgZXQ9dGhpcy5wdHI7cmV0dXJuIFJlLnByZXBhcmUoKSx6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxXPVcmJnR5cGVvZiBXPT0ib2JqZWN0Ij9XLnB0cjpnKFcpLHVyKGV0LHosVyl9LEsucHJvdG90eXBlLkdldEludEVudHJ5QXJyYXk9Sy5wcm90b3R5cGUuR2V0SW50RW50cnlBcnJheT1mdW5jdGlvbih6LFcsZXQpe3ZhciBNdD10aGlzLnB0cjtSZS5wcmVwYXJlKCkseiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksVz1XJiZ0eXBlb2YgVz09Im9iamVjdCI/Vy5wdHI6ZyhXKSxldCYmdHlwZW9mIGV0PT0ib2JqZWN0IiYmKGV0PWV0LnB0ciksWWEoTXQseixXLGV0KX0sSy5wcm90b3R5cGUuR2V0RG91YmxlRW50cnk9Sy5wcm90b3R5cGUuR2V0RG91YmxlRW50cnk9ZnVuY3Rpb24oeixXKXt2YXIgZXQ9dGhpcy5wdHI7cmV0dXJuIFJlLnByZXBhcmUoKSx6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxXPVcmJnR5cGVvZiBXPT0ib2JqZWN0Ij9XLnB0cjpnKFcpLEd1KGV0LHosVyl9LEsucHJvdG90eXBlLkdldFN0cmluZ0VudHJ5PUsucHJvdG90eXBlLkdldFN0cmluZ0VudHJ5PWZ1bmN0aW9uKHosVyl7dmFyIGV0PXRoaXMucHRyO3JldHVybiBSZS5wcmVwYXJlKCkseiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksVz1XJiZ0eXBlb2YgVz09Im9iamVjdCI/Vy5wdHI6ZyhXKSxyKHp1KGV0LHosVykpfSxLLnByb3RvdHlwZS5OdW1FbnRyaWVzPUsucHJvdG90eXBlLk51bUVudHJpZXM9ZnVuY3Rpb24oeil7dmFyIFc9dGhpcy5wdHI7cmV0dXJuIHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLGp1KFcseil9LEsucHJvdG90eXBlLkdldEVudHJ5TmFtZT1LLnByb3RvdHlwZS5HZXRFbnRyeU5hbWU9ZnVuY3Rpb24oeixXKXt2YXIgZXQ9dGhpcy5wdHI7cmV0dXJuIHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLFcmJnR5cGVvZiBXPT0ib2JqZWN0IiYmKFc9Vy5wdHIpLHIocW8oZXQseixXKSl9LEsucHJvdG90eXBlLl9fZGVzdHJveV9fPUsucHJvdG90eXBlLl9fZGVzdHJveV9fPWZ1bmN0aW9uKCl7JGEodGhpcy5wdHIpfSxYLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSxYLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1YLFgucHJvdG90eXBlLl9fY2xhc3NfXz1YLFguX19jYWNoZV9fPXt9LFIuRGVjb2Rlcj1YLFgucHJvdG90eXBlLkRlY29kZUFycmF5VG9Qb2ludENsb3VkPVgucHJvdG90eXBlLkRlY29kZUFycmF5VG9Qb2ludENsb3VkPWZ1bmN0aW9uKHosVyxldCl7dmFyIE10PXRoaXMucHRyO3JldHVybiBSZS5wcmVwYXJlKCksdHlwZW9mIHo9PSJvYmplY3QiJiYoej1iKHopKSxXJiZ0eXBlb2YgVz09Im9iamVjdCImJihXPVcucHRyKSxldCYmdHlwZW9mIGV0PT0ib2JqZWN0IiYmKGV0PWV0LnB0ciksXyhEcyhNdCx6LFcsZXQpLFUpfSxYLnByb3RvdHlwZS5EZWNvZGVBcnJheVRvTWVzaD1YLnByb3RvdHlwZS5EZWNvZGVBcnJheVRvTWVzaD1mdW5jdGlvbih6LFcsZXQpe3ZhciBNdD10aGlzLnB0cjtyZXR1cm4gUmUucHJlcGFyZSgpLHR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9Yih6KSksVyYmdHlwZW9mIFc9PSJvYmplY3QiJiYoVz1XLnB0ciksZXQmJnR5cGVvZiBldD09Im9iamVjdCImJihldD1ldC5wdHIpLF8oSHUoTXQseixXLGV0KSxVKX0sWC5wcm90b3R5cGUuR2V0QXR0cmlidXRlSWQ9WC5wcm90b3R5cGUuR2V0QXR0cmlidXRlSWQ9ZnVuY3Rpb24oeixXKXt2YXIgZXQ9dGhpcy5wdHI7cmV0dXJuIHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLFcmJnR5cGVvZiBXPT0ib2JqZWN0IiYmKFc9Vy5wdHIpLEJjKGV0LHosVyl9LFgucHJvdG90eXBlLkdldEF0dHJpYnV0ZUlkQnlOYW1lPVgucHJvdG90eXBlLkdldEF0dHJpYnV0ZUlkQnlOYW1lPWZ1bmN0aW9uKHosVyl7dmFyIGV0PXRoaXMucHRyO3JldHVybiBSZS5wcmVwYXJlKCkseiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksVz1XJiZ0eXBlb2YgVz09Im9iamVjdCI/Vy5wdHI6ZyhXKSxxdShldCx6LFcpfSxYLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVJZEJ5TWV0YWRhdGFFbnRyeT1YLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVJZEJ5TWV0YWRhdGFFbnRyeT1mdW5jdGlvbih6LFcsZXQpe3ZhciBNdD10aGlzLnB0cjtyZXR1cm4gUmUucHJlcGFyZSgpLHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLFc9VyYmdHlwZW9mIFc9PSJvYmplY3QiP1cucHRyOmcoVyksZXQ9ZXQmJnR5cGVvZiBldD09Im9iamVjdCI/ZXQucHRyOmcoZXQpLFFhKE10LHosVyxldCl9LFgucHJvdG90eXBlLkdldEF0dHJpYnV0ZT1YLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oeixXKXt2YXIgZXQ9dGhpcy5wdHI7cmV0dXJuIHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLFcmJnR5cGVvZiBXPT0ib2JqZWN0IiYmKFc9Vy5wdHIpLF8oSmEoZXQseixXKSxDKX0sWC5wcm90b3R5cGUuR2V0QXR0cmlidXRlQnlVbmlxdWVJZD1YLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVCeVVuaXF1ZUlkPWZ1bmN0aW9uKHosVyl7dmFyIGV0PXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxXJiZ0eXBlb2YgVz09Im9iamVjdCImJihXPVcucHRyKSxfKEt1KGV0LHosVyksQyl9LFgucHJvdG90eXBlLkdldE1ldGFkYXRhPVgucHJvdG90eXBlLkdldE1ldGFkYXRhPWZ1bmN0aW9uKHope3ZhciBXPXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxfKFd1KFcseiksTCl9LFgucHJvdG90eXBlLkdldEF0dHJpYnV0ZU1ldGFkYXRhPVgucHJvdG90eXBlLkdldEF0dHJpYnV0ZU1ldGFkYXRhPWZ1bmN0aW9uKHosVyl7dmFyIGV0PXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxXJiZ0eXBlb2YgVz09Im9iamVjdCImJihXPVcucHRyKSxfKFVjKGV0LHosVyksTCl9LFgucHJvdG90eXBlLkdldEZhY2VGcm9tTWVzaD1YLnByb3RvdHlwZS5HZXRGYWNlRnJvbU1lc2g9ZnVuY3Rpb24oeixXLGV0KXt2YXIgTXQ9dGhpcy5wdHI7cmV0dXJuIHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLFcmJnR5cGVvZiBXPT0ib2JqZWN0IiYmKFc9Vy5wdHIpLGV0JiZ0eXBlb2YgZXQ9PSJvYmplY3QiJiYoZXQ9ZXQucHRyKSwhIWdvKE10LHosVyxldCl9LFgucHJvdG90eXBlLkdldFRyaWFuZ2xlU3RyaXBzRnJvbU1lc2g9WC5wcm90b3R5cGUuR2V0VHJpYW5nbGVTdHJpcHNGcm9tTWVzaD1mdW5jdGlvbih6LFcpe3ZhciBldD10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksVyYmdHlwZW9mIFc9PSJvYmplY3QiJiYoVz1XLnB0ciksVmMoZXQseixXKX0sWC5wcm90b3R5cGUuR2V0VHJpYW5nbGVzVUludDE2QXJyYXk9WC5wcm90b3R5cGUuR2V0VHJpYW5nbGVzVUludDE2QXJyYXk9ZnVuY3Rpb24oeixXLGV0KXt2YXIgTXQ9dGhpcy5wdHI7cmV0dXJuIHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLFcmJnR5cGVvZiBXPT0ib2JqZWN0IiYmKFc9Vy5wdHIpLGV0JiZ0eXBlb2YgZXQ9PSJvYmplY3QiJiYoZXQ9ZXQucHRyKSwhIVh1KE10LHosVyxldCl9LFgucHJvdG90eXBlLkdldFRyaWFuZ2xlc1VJbnQzMkFycmF5PVgucHJvdG90eXBlLkdldFRyaWFuZ2xlc1VJbnQzMkFycmF5PWZ1bmN0aW9uKHosVyxldCl7dmFyIE10PXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxXJiZ0eXBlb2YgVz09Im9iamVjdCImJihXPVcucHRyKSxldCYmdHlwZW9mIGV0PT0ib2JqZWN0IiYmKGV0PWV0LnB0ciksISFZdShNdCx6LFcsZXQpfSxYLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVGbG9hdD1YLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVGbG9hdD1mdW5jdGlvbih6LFcsZXQpe3ZhciBNdD10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksVyYmdHlwZW9mIFc9PSJvYmplY3QiJiYoVz1XLnB0ciksZXQmJnR5cGVvZiBldD09Im9iamVjdCImJihldD1ldC5wdHIpLCEhJHUoTXQseixXLGV0KX0sWC5wcm90b3R5cGUuR2V0QXR0cmlidXRlRmxvYXRGb3JBbGxQb2ludHM9WC5wcm90b3R5cGUuR2V0QXR0cmlidXRlRmxvYXRGb3JBbGxQb2ludHM9ZnVuY3Rpb24oeixXLGV0KXt2YXIgTXQ9dGhpcy5wdHI7cmV0dXJuIHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLFcmJnR5cGVvZiBXPT0ib2JqZWN0IiYmKFc9Vy5wdHIpLGV0JiZ0eXBlb2YgZXQ9PSJvYmplY3QiJiYoZXQ9ZXQucHRyKSwhIWxyKE10LHosVyxldCl9LFgucHJvdG90eXBlLkdldEF0dHJpYnV0ZUludEZvckFsbFBvaW50cz1YLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVJbnRGb3JBbGxQb2ludHM9ZnVuY3Rpb24oeixXLGV0KXt2YXIgTXQ9dGhpcy5wdHI7cmV0dXJuIHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLFcmJnR5cGVvZiBXPT0ib2JqZWN0IiYmKFc9Vy5wdHIpLGV0JiZ0eXBlb2YgZXQ9PSJvYmplY3QiJiYoZXQ9ZXQucHRyKSwhIVp1KE10LHosVyxldCl9LFgucHJvdG90eXBlLkdldEF0dHJpYnV0ZUludDhGb3JBbGxQb2ludHM9WC5wcm90b3R5cGUuR2V0QXR0cmlidXRlSW50OEZvckFsbFBvaW50cz1mdW5jdGlvbih6LFcsZXQpe3ZhciBNdD10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksVyYmdHlwZW9mIFc9PSJvYmplY3QiJiYoVz1XLnB0ciksZXQmJnR5cGVvZiBldD09Im9iamVjdCImJihldD1ldC5wdHIpLCEhUXUoTXQseixXLGV0KX0sWC5wcm90b3R5cGUuR2V0QXR0cmlidXRlVUludDhGb3JBbGxQb2ludHM9WC5wcm90b3R5cGUuR2V0QXR0cmlidXRlVUludDhGb3JBbGxQb2ludHM9ZnVuY3Rpb24oeixXLGV0KXt2YXIgTXQ9dGhpcy5wdHI7cmV0dXJuIHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLFcmJnR5cGVvZiBXPT0ib2JqZWN0IiYmKFc9Vy5wdHIpLGV0JiZ0eXBlb2YgZXQ9PSJvYmplY3QiJiYoZXQ9ZXQucHRyKSwhIUp1KE10LHosVyxldCl9LFgucHJvdG90eXBlLkdldEF0dHJpYnV0ZUludDE2Rm9yQWxsUG9pbnRzPVgucHJvdG90eXBlLkdldEF0dHJpYnV0ZUludDE2Rm9yQWxsUG9pbnRzPWZ1bmN0aW9uKHosVyxldCl7dmFyIE10PXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxXJiZ0eXBlb2YgVz09Im9iamVjdCImJihXPVcucHRyKSxldCYmdHlwZW9mIGV0PT0ib2JqZWN0IiYmKGV0PWV0LnB0ciksISFGcyhNdCx6LFcsZXQpfSxYLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVVSW50MTZGb3JBbGxQb2ludHM9WC5wcm90b3R5cGUuR2V0QXR0cmlidXRlVUludDE2Rm9yQWxsUG9pbnRzPWZ1bmN0aW9uKHosVyxldCl7dmFyIE10PXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxXJiZ0eXBlb2YgVz09Im9iamVjdCImJihXPVcucHRyKSxldCYmdHlwZW9mIGV0PT0ib2JqZWN0IiYmKGV0PWV0LnB0ciksISF0bChNdCx6LFcsZXQpfSxYLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVJbnQzMkZvckFsbFBvaW50cz1YLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVJbnQzMkZvckFsbFBvaW50cz1mdW5jdGlvbih6LFcsZXQpe3ZhciBNdD10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksVyYmdHlwZW9mIFc9PSJvYmplY3QiJiYoVz1XLnB0ciksZXQmJnR5cGVvZiBldD09Im9iamVjdCImJihldD1ldC5wdHIpLCEhVGkoTXQseixXLGV0KX0sWC5wcm90b3R5cGUuR2V0QXR0cmlidXRlVUludDMyRm9yQWxsUG9pbnRzPVgucHJvdG90eXBlLkdldEF0dHJpYnV0ZVVJbnQzMkZvckFsbFBvaW50cz1mdW5jdGlvbih6LFcsZXQpe3ZhciBNdD10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksVyYmdHlwZW9mIFc9PSJvYmplY3QiJiYoVz1XLnB0ciksZXQmJnR5cGVvZiBldD09Im9iamVjdCImJihldD1ldC5wdHIpLCEhZWwoTXQseixXLGV0KX0sWC5wcm90b3R5cGUuR2V0QXR0cmlidXRlRGF0YUFycmF5Rm9yQWxsUG9pbnRzPVgucHJvdG90eXBlLkdldEF0dHJpYnV0ZURhdGFBcnJheUZvckFsbFBvaW50cz1mdW5jdGlvbih6LFcsZXQsTXQsbGUpe3ZhciB3ZT10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksVyYmdHlwZW9mIFc9PSJvYmplY3QiJiYoVz1XLnB0ciksZXQmJnR5cGVvZiBldD09Im9iamVjdCImJihldD1ldC5wdHIpLE10JiZ0eXBlb2YgTXQ9PSJvYmplY3QiJiYoTXQ9TXQucHRyKSxsZSYmdHlwZW9mIGxlPT0ib2JqZWN0IiYmKGxlPWxlLnB0ciksISFubCh3ZSx6LFcsZXQsTXQsbGUpfSxYLnByb3RvdHlwZS5Ta2lwQXR0cmlidXRlVHJhbnNmb3JtPVgucHJvdG90eXBlLlNraXBBdHRyaWJ1dGVUcmFuc2Zvcm09ZnVuY3Rpb24oeil7dmFyIFc9dGhpcy5wdHI7eiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksb2woVyx6KX0sWC5wcm90b3R5cGUuR2V0RW5jb2RlZEdlb21ldHJ5VHlwZV9EZXByZWNhdGVkPVgucHJvdG90eXBlLkdldEVuY29kZWRHZW9tZXRyeVR5cGVfRGVwcmVjYXRlZD1mdW5jdGlvbih6KXt2YXIgVz10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0cikscmwoVyx6KX0sWC5wcm90b3R5cGUuRGVjb2RlQnVmZmVyVG9Qb2ludENsb3VkPVgucHJvdG90eXBlLkRlY29kZUJ1ZmZlclRvUG9pbnRDbG91ZD1mdW5jdGlvbih6LFcpe3ZhciBldD10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksVyYmdHlwZW9mIFc9PSJvYmplY3QiJiYoVz1XLnB0ciksXyhpbChldCx6LFcpLFUpfSxYLnByb3RvdHlwZS5EZWNvZGVCdWZmZXJUb01lc2g9WC5wcm90b3R5cGUuRGVjb2RlQnVmZmVyVG9NZXNoPWZ1bmN0aW9uKHosVyl7dmFyIGV0PXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxXJiZ0eXBlb2YgVz09Im9iamVjdCImJihXPVcucHRyKSxfKHNsKGV0LHosVyksVSl9LFgucHJvdG90eXBlLl9fZGVzdHJveV9fPVgucHJvdG90eXBlLl9fZGVzdHJveV9fPWZ1bmN0aW9uKCl7Y2wodGhpcy5wdHIpfSxmdW5jdGlvbigpe2Z1bmN0aW9uIHooKXtSLkFUVFJJQlVURV9JTlZBTElEX1RSQU5TRk9STT1hbCgpLFIuQVRUUklCVVRFX05PX1RSQU5TRk9STT1mbCgpLFIuQVRUUklCVVRFX1FVQU5USVpBVElPTl9UUkFOU0ZPUk09dWwoKSxSLkFUVFJJQlVURV9PQ1RBSEVEUk9OX1RSQU5TRk9STT1sbCgpLFIuSU5WQUxJRD1lcygpLFIuUE9TSVRJT049cGwoKSxSLk5PUk1BTD1kbCgpLFIuQ09MT1I9QnMoKSxSLlRFWF9DT09SRD1rYygpLFIuR0VORVJJQz1tbCgpLFIuSU5WQUxJRF9HRU9NRVRSWV9UWVBFPXRmKCksUi5QT0lOVF9DTE9VRD1obCgpLFIuVFJJQU5HVUxBUl9NRVNIPV9sKCksUi5EVF9JTlZBTElEPXlsKCksUi5EVF9JTlQ4PWdsKCksUi5EVF9VSU5UOD1BbCgpLFIuRFRfSU5UMTY9YmwoKSxSLkRUX1VJTlQxNj13bCgpLFIuRFRfSU5UMzI9VGwoKSxSLkRUX1VJTlQzMj1lZigpLFIuRFRfSU5UNjQ9T2woKSxSLkRUX1VJTlQ2ND1FbCgpLFIuRFRfRkxPQVQzMj1SbCgpLFIuRFRfRkxPQVQ2ND1TbCgpLFIuRFRfQk9PTD1DbCgpLFIuRFRfVFlQRVNfQ09VTlQ9eGwoKSxSLk9LPVBsKCksUi5EUkFDT19FUlJPUj1VcygpLFIuSU9fRVJST1I9TWwoKSxSLklOVkFMSURfUEFSQU1FVEVSPU5sKCksUi5VTlNVUFBPUlRFRF9WRVJTSU9OPUlsKCksUi5VTktOT1dOX1ZFUlNJT049dmwoKX1yZT96KCk6cG4udW5zaGlmdCh6KX0oKSx0eXBlb2YgUi5vbk1vZHVsZVBhcnNlZD09ImZ1bmN0aW9uIiYmUi5vbk1vZHVsZVBhcnNlZCgpLFIuRGVjb2Rlci5wcm90b3R5cGUuR2V0RW5jb2RlZEdlb21ldHJ5VHlwZT1mdW5jdGlvbih6KXtpZih6Ll9fY2xhc3NfXyYmei5fX2NsYXNzX189PT1SLkRlY29kZXJCdWZmZXIpcmV0dXJuIFIuRGVjb2Rlci5wcm90b3R5cGUuR2V0RW5jb2RlZEdlb21ldHJ5VHlwZV9EZXByZWNhdGVkKHopO2lmKDg+ei5ieXRlTGVuZ3RoKXJldHVybiBSLklOVkFMSURfR0VPTUVUUllfVFlQRTtzd2l0Y2goels3XSl7Y2FzZSAwOnJldHVybiBSLlBPSU5UX0NMT1VEO2Nhc2UgMTpyZXR1cm4gUi5UUklBTkdVTEFSX01FU0g7ZGVmYXVsdDpyZXR1cm4gUi5JTlZBTElEX0dFT01FVFJZX1RZUEV9fSxlLnJlYWR5fX0oKTt0eXBlb2YgdXU9PSJvYmplY3QiJiZ0eXBlb2YgRWc9PSJvYmplY3QiP0VnLmV4cG9ydHM9T2c6dHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZnVuY3Rpb24oKXtyZXR1cm4gT2d9KTp0eXBlb2YgdXU9PSJvYmplY3QiJiYodXUuRHJhY29EZWNvZGVyTW9kdWxlPU9nKX0pO3ZhciBDZz17fTtkZShDZyx7ZGVmYXVsdDooKT0+elV9KTtmdW5jdGlvbiBMVSh0LGUpe2xldCBuPXQubnVtX3BvaW50cygpLG89dC5udW1fZmFjZXMoKSxyPW5ldyBDZS5EcmFjb0ludDMyQXJyYXksaT1vKjMscz1EdC5jcmVhdGVUeXBlZEFycmF5KG4saSksZj0wO2ZvcihsZXQgdT0wO3U8bzsrK3UpZS5HZXRGYWNlRnJvbU1lc2godCx1LHIpLHNbZiswXT1yLkdldFZhbHVlKDApLHNbZisxXT1yLkdldFZhbHVlKDEpLHNbZisyXT1yLkdldFZhbHVlKDIpLGYrPTM7cmV0dXJuIENlLmRlc3Ryb3kocikse3R5cGVkQXJyYXk6cyxudW1iZXJPZkluZGljZXM6aX19ZnVuY3Rpb24gRFUodCxlLG4sbyxyKXtsZXQgaSxzO28ucXVhbnRpemF0aW9uQml0czw9OD8ocz1uZXcgQ2UuRHJhY29VSW50OEFycmF5LGk9bmV3IFVpbnQ4QXJyYXkociksZS5HZXRBdHRyaWJ1dGVVSW50OEZvckFsbFBvaW50cyh0LG4scykpOm8ucXVhbnRpemF0aW9uQml0czw9MTY/KHM9bmV3IENlLkRyYWNvVUludDE2QXJyYXksaT1uZXcgVWludDE2QXJyYXkociksZS5HZXRBdHRyaWJ1dGVVSW50MTZGb3JBbGxQb2ludHModCxuLHMpKToocz1uZXcgQ2UuRHJhY29GbG9hdDMyQXJyYXksaT1uZXcgRmxvYXQzMkFycmF5KHIpLGUuR2V0QXR0cmlidXRlRmxvYXRGb3JBbGxQb2ludHModCxuLHMpKTtmb3IobGV0IGY9MDtmPHI7KytmKWlbZl09cy5HZXRWYWx1ZShmKTtyZXR1cm4gQ2UuZGVzdHJveShzKSxpfWZ1bmN0aW9uIEZVKHQsZSxuLG8pe2xldCByLGk7c3dpdGNoKG4uZGF0YV90eXBlKCkpe2Nhc2UgMTpjYXNlIDExOmk9bmV3IENlLkRyYWNvSW50OEFycmF5LHI9bmV3IEludDhBcnJheShvKSxlLkdldEF0dHJpYnV0ZUludDhGb3JBbGxQb2ludHModCxuLGkpO2JyZWFrO2Nhc2UgMjppPW5ldyBDZS5EcmFjb1VJbnQ4QXJyYXkscj1uZXcgVWludDhBcnJheShvKSxlLkdldEF0dHJpYnV0ZVVJbnQ4Rm9yQWxsUG9pbnRzKHQsbixpKTticmVhaztjYXNlIDM6aT1uZXcgQ2UuRHJhY29JbnQxNkFycmF5LHI9bmV3IEludDE2QXJyYXkobyksZS5HZXRBdHRyaWJ1dGVJbnQxNkZvckFsbFBvaW50cyh0LG4saSk7YnJlYWs7Y2FzZSA0Omk9bmV3IENlLkRyYWNvVUludDE2QXJyYXkscj1uZXcgVWludDE2QXJyYXkobyksZS5HZXRBdHRyaWJ1dGVVSW50MTZGb3JBbGxQb2ludHModCxuLGkpO2JyZWFrO2Nhc2UgNTpjYXNlIDc6aT1uZXcgQ2UuRHJhY29JbnQzMkFycmF5LHI9bmV3IEludDMyQXJyYXkobyksZS5HZXRBdHRyaWJ1dGVJbnQzMkZvckFsbFBvaW50cyh0LG4saSk7YnJlYWs7Y2FzZSA2OmNhc2UgODppPW5ldyBDZS5EcmFjb1VJbnQzMkFycmF5LHI9bmV3IFVpbnQzMkFycmF5KG8pLGUuR2V0QXR0cmlidXRlVUludDMyRm9yQWxsUG9pbnRzKHQsbixpKTticmVhaztjYXNlIDk6Y2FzZSAxMDppPW5ldyBDZS5EcmFjb0Zsb2F0MzJBcnJheSxyPW5ldyBGbG9hdDMyQXJyYXkobyksZS5HZXRBdHRyaWJ1dGVGbG9hdEZvckFsbFBvaW50cyh0LG4saSk7YnJlYWt9Zm9yKGxldCBzPTA7czxvOysrcylyW3NdPWkuR2V0VmFsdWUocyk7cmV0dXJuIENlLmRlc3Ryb3koaSkscn1mdW5jdGlvbiBtMih0LGUsbil7bGV0IG89dC5udW1fcG9pbnRzKCkscj1uLm51bV9jb21wb25lbnRzKCksaSxzPW5ldyBDZS5BdHRyaWJ1dGVRdWFudGl6YXRpb25UcmFuc2Zvcm07aWYocy5Jbml0RnJvbUF0dHJpYnV0ZShuKSl7bGV0IGw9bmV3IEFycmF5KHIpO2ZvcihsZXQgcD0wO3A8cjsrK3ApbFtwXT1zLm1pbl92YWx1ZShwKTtpPXtxdWFudGl6YXRpb25CaXRzOnMucXVhbnRpemF0aW9uX2JpdHMoKSxtaW5WYWx1ZXM6bCxyYW5nZTpzLnJhbmdlKCksb2N0RW5jb2RlZDohMX19Q2UuZGVzdHJveShzKSxzPW5ldyBDZS5BdHRyaWJ1dGVPY3RhaGVkcm9uVHJhbnNmb3JtLHMuSW5pdEZyb21BdHRyaWJ1dGUobikmJihpPXtxdWFudGl6YXRpb25CaXRzOnMucXVhbnRpemF0aW9uX2JpdHMoKSxvY3RFbmNvZGVkOiEwfSksQ2UuZGVzdHJveShzKTtsZXQgZj1vKnIsdTtoKGkpP3U9RFUodCxlLG4saSxmKTp1PUZVKHQsZSxuLGYpO2xldCBjPW50LmZyb21UeXBlZEFycmF5KHUpO3JldHVybnthcnJheTp1LGRhdGE6e2NvbXBvbmVudHNQZXJBdHRyaWJ1dGU6cixjb21wb25lbnREYXRhdHlwZTpjLGJ5dGVPZmZzZXQ6bi5ieXRlX29mZnNldCgpLGJ5dGVTdHJpZGU6bnQuZ2V0U2l6ZUluQnl0ZXMoYykqcixub3JtYWxpemVkOm4ubm9ybWFsaXplZCgpLHF1YW50aXphdGlvbjppfX19ZnVuY3Rpb24gQlUodCl7bGV0IGU9bmV3IENlLkRlY29kZXI7dC5kZXF1YW50aXplSW5TaGFkZXImJihlLlNraXBBdHRyaWJ1dGVUcmFuc2Zvcm0oQ2UuUE9TSVRJT04pLGUuU2tpcEF0dHJpYnV0ZVRyYW5zZm9ybShDZS5OT1JNQUwpKTtsZXQgbj1uZXcgQ2UuRGVjb2RlckJ1ZmZlcjtpZihuLkluaXQodC5idWZmZXIsdC5idWZmZXIubGVuZ3RoKSxlLkdldEVuY29kZWRHZW9tZXRyeVR5cGUobikhPT1DZS5QT0lOVF9DTE9VRCl0aHJvdyBuZXcgQWUoIkRyYWNvIGdlb21ldHJ5IHR5cGUgbXVzdCBiZSBQT0lOVF9DTE9VRC4iKTtsZXQgcj1uZXcgQ2UuUG9pbnRDbG91ZCxpPWUuRGVjb2RlQnVmZmVyVG9Qb2ludENsb3VkKG4scik7aWYoIWkub2soKXx8ci5wdHI9PT0wKXRocm93IG5ldyBBZShgRXJyb3IgZGVjb2RpbmcgZHJhY28gcG9pbnQgY2xvdWQ6ICR7aS5lcnJvcl9tc2coKX1gKTtDZS5kZXN0cm95KG4pO2xldCBzPXt9LGY9dC5wcm9wZXJ0aWVzO2ZvcihsZXQgdSBpbiBmKWlmKGYuaGFzT3duUHJvcGVydHkodSkpe2xldCBjO2lmKHU9PT0iUE9TSVRJT04ifHx1PT09Ik5PUk1BTCIpe2xldCBsPWUuR2V0QXR0cmlidXRlSWQocixDZVt1XSk7Yz1lLkdldEF0dHJpYnV0ZShyLGwpfWVsc2V7bGV0IGw9Zlt1XTtjPWUuR2V0QXR0cmlidXRlQnlVbmlxdWVJZChyLGwpfXNbdV09bTIocixlLGMpfXJldHVybiBDZS5kZXN0cm95KHIpLENlLmRlc3Ryb3koZSksc31mdW5jdGlvbiBVVSh0KXtsZXQgZT1uZXcgQ2UuRGVjb2RlcixuPVsiUE9TSVRJT04iLCJOT1JNQUwiLCJDT0xPUiIsIlRFWF9DT09SRCJdO2lmKHQuZGVxdWFudGl6ZUluU2hhZGVyKWZvcihsZXQgcD0wO3A8bi5sZW5ndGg7KytwKWUuU2tpcEF0dHJpYnV0ZVRyYW5zZm9ybShDZVtuW3BdXSk7bGV0IG89dC5idWZmZXJWaWV3LHI9bmV3IENlLkRlY29kZXJCdWZmZXI7aWYoci5Jbml0KHQuYXJyYXksby5ieXRlTGVuZ3RoKSxlLkdldEVuY29kZWRHZW9tZXRyeVR5cGUocikhPT1DZS5UUklBTkdVTEFSX01FU0gpdGhyb3cgbmV3IEFlKCJVbnN1cHBvcnRlZCBkcmFjbyBtZXNoIGdlb21ldHJ5IHR5cGUuIik7bGV0IHM9bmV3IENlLk1lc2gsZj1lLkRlY29kZUJ1ZmZlclRvTWVzaChyLHMpO2lmKCFmLm9rKCl8fHMucHRyPT09MCl0aHJvdyBuZXcgQWUoYEVycm9yIGRlY29kaW5nIGRyYWNvIG1lc2ggZ2VvbWV0cnk6ICR7Zi5lcnJvcl9tc2coKX1gKTtDZS5kZXN0cm95KHIpO2xldCB1PXt9LGM9dC5jb21wcmVzc2VkQXR0cmlidXRlcztmb3IobGV0IHAgaW4gYylpZihjLmhhc093blByb3BlcnR5KHApKXtsZXQgZD1jW3BdLG09ZS5HZXRBdHRyaWJ1dGVCeVVuaXF1ZUlkKHMsZCk7dVtwXT1tMihzLGUsbSl9bGV0IGw9e2luZGV4QXJyYXk6TFUocyxlKSxhdHRyaWJ1dGVEYXRhOnV9O3JldHVybiBDZS5kZXN0cm95KHMpLENlLmRlc3Ryb3koZSksbH1hc3luYyBmdW5jdGlvbiBWVSh0LGUpe3JldHVybiBoKHQuYnVmZmVyVmlldyk/VVUodCk6QlUodCl9YXN5bmMgZnVuY3Rpb24ga1UodCxlKXtsZXQgbj10LndlYkFzc2VtYmx5Q29uZmlnO3JldHVybiBoKG4pJiZoKG4ud2FzbUJpbmFyeUZpbGUpP0NlPWF3YWl0KDAsU2cuZGVmYXVsdCkobik6Q2U9YXdhaXQoMCxTZy5kZWZhdWx0KSgpLCEwfWFzeW5jIGZ1bmN0aW9uIEdVKHQsZSl7bGV0IG49dC53ZWJBc3NlbWJseUNvbmZpZztyZXR1cm4gaChuKT9rVSh0LGUpOlZVKHQsZSl9dmFyIFNnLENlLHpVLHhnPVooKCk9PntMZSgpO2Z0KCk7JGUoKTtKcigpO3NvKCk7U2c9cnIoUmcoKSwxKTt6VT1RZShHVSl9KTtmdW5jdGlvbiBQZyh0LGUpe2lmKFBnLnBhc3NUaHJvdWdoRGF0YUZvclRlc3RpbmcpcmV0dXJuIGU7eS50eXBlT2Yub2JqZWN0KCJrZXkiLHQpLHkudHlwZU9mLm9iamVjdCgiZGF0YSIsZSk7bGV0IG49dC5ieXRlTGVuZ3RoO2lmKG49PT0wfHxuJTQhPT0wKXRocm93IG5ldyBBZSgiVGhlIGxlbmd0aCBvZiBrZXkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCBhbmQgYSBtdWx0aXBsZSBvZiA0LiIpO2xldCBvPW5ldyBEYXRhVmlldyhlKSxyPW8uZ2V0VWludDMyKDAsITApO2lmKHI9PT1qVXx8cj09PUhVKXJldHVybiBlO2xldCBpPW5ldyBEYXRhVmlldyh0KSxzPTAsZj1lLmJ5dGVMZW5ndGgsdT1mLWYlOCxjPW4sbCxwPTg7Zm9yKDtzPHU7KWZvcihwPShwKzgpJTI0LGw9cDtzPHUmJmw8Yzspby5zZXRVaW50MzIocyxvLmdldFVpbnQzMihzLCEwKV5pLmdldFVpbnQzMihsLCEwKSwhMCksby5zZXRVaW50MzIocys0LG8uZ2V0VWludDMyKHMrNCwhMCleaS5nZXRVaW50MzIobCs0LCEwKSwhMCkscys9OCxsKz0yNDtpZihzPGYpZm9yKGw+PWMmJihwPShwKzgpJTI0LGw9cCk7czxmOylvLnNldFVpbnQ4KHMsby5nZXRVaW50OChzKV5pLmdldFVpbnQ4KGwpKSxzKyssbCsrfXZhciBqVSxIVSxoMixfMj1aKCgpPT57WHQoKTtKcigpO2pVPTE5NTMwMjk4MDUsSFU9MjkxNzAzNDEwMDtQZy5wYXNzVGhyb3VnaERhdGFGb3JUZXN0aW5nPSExO2gyPVBnfSk7ZnVuY3Rpb24gcVUodCxlKXtyZXR1cm4odCZlKSE9PTB9dmFyIFZhLHkyPVooKCk9PntWYT1xVX0pO2Z1bmN0aW9uIHlpKHQsZSxuLG8scixpKXt0aGlzLl9iaXRzPXQsdGhpcy5jbm9kZVZlcnNpb249ZSx0aGlzLmltYWdlcnlWZXJzaW9uPW4sdGhpcy50ZXJyYWluVmVyc2lvbj1vLHRoaXMuaW1hZ2VyeVByb3ZpZGVyPXIsdGhpcy50ZXJyYWluUHJvdmlkZXI9aSx0aGlzLmFuY2VzdG9ySGFzVGVycmFpbj0hMSx0aGlzLnRlcnJhaW5TdGF0ZT12b2lkIDB9dmFyIEtVLGcyLFdVLFhVLFlVLEEyLGIyPVooKCk9PntmdCgpO3kyKCk7S1U9WzEsMiw0LDhdLGcyPTE1LFdVPTE2LFhVPTY0LFlVPTEyODt5aS5jbG9uZT1mdW5jdGlvbih0LGUpe3JldHVybiBoKGUpPyhlLl9iaXRzPXQuX2JpdHMsZS5jbm9kZVZlcnNpb249dC5jbm9kZVZlcnNpb24sZS5pbWFnZXJ5VmVyc2lvbj10LmltYWdlcnlWZXJzaW9uLGUudGVycmFpblZlcnNpb249dC50ZXJyYWluVmVyc2lvbixlLmltYWdlcnlQcm92aWRlcj10LmltYWdlcnlQcm92aWRlcixlLnRlcnJhaW5Qcm92aWRlcj10LnRlcnJhaW5Qcm92aWRlcik6ZT1uZXcgeWkodC5fYml0cyx0LmNub2RlVmVyc2lvbix0LmltYWdlcnlWZXJzaW9uLHQudGVycmFpblZlcnNpb24sdC5pbWFnZXJ5UHJvdmlkZXIsdC50ZXJyYWluUHJvdmlkZXIpLGUuYW5jZXN0b3JIYXNUZXJyYWluPXQuYW5jZXN0b3JIYXNUZXJyYWluLGUudGVycmFpblN0YXRlPXQudGVycmFpblN0YXRlLGV9O3lpLnByb3RvdHlwZS5zZXRQYXJlbnQ9ZnVuY3Rpb24odCl7dGhpcy5hbmNlc3Rvckhhc1RlcnJhaW49dC5hbmNlc3Rvckhhc1RlcnJhaW58fHRoaXMuaGFzVGVycmFpbigpfTt5aS5wcm90b3R5cGUuaGFzU3VidHJlZT1mdW5jdGlvbigpe3JldHVybiBWYSh0aGlzLl9iaXRzLFdVKX07eWkucHJvdG90eXBlLmhhc0ltYWdlcnk9ZnVuY3Rpb24oKXtyZXR1cm4gVmEodGhpcy5fYml0cyxYVSl9O3lpLnByb3RvdHlwZS5oYXNUZXJyYWluPWZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMuX2JpdHMsWVUpfTt5aS5wcm90b3R5cGUuaGFzQ2hpbGRyZW49ZnVuY3Rpb24oKXtyZXR1cm4gVmEodGhpcy5fYml0cyxnMil9O3lpLnByb3RvdHlwZS5oYXNDaGlsZD1mdW5jdGlvbih0KXtyZXR1cm4gVmEodGhpcy5fYml0cyxLVVt0XSl9O3lpLnByb3RvdHlwZS5nZXRDaGlsZEJpdG1hc2s9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYml0cyZnMn07QTI9eWl9KTt2YXIgVDI9Vm4oKEJ1dCx3Mik9PnsidXNlIHN0cmljdCI7dmFyICRVPSh0LGUsbixvKT0+e2xldCByPXQmNjU1MzV8MCxpPXQ+Pj4xNiY2NTUzNXwwLHM9MDtmb3IoO24hPT0wOyl7cz1uPjJlMz8yZTM6bixuLT1zO2RvIHI9citlW28rK118MCxpPWkrcnwwO3doaWxlKC0tcyk7ciU9NjU1MjEsaSU9NjU1MjF9cmV0dXJuIHJ8aTw8MTZ8MH07dzIuZXhwb3J0cz0kVX0pO3ZhciBFMj1WbigoVXV0LE8yKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgWlU9KCk9PntsZXQgdCxlPVtdO2Zvcih2YXIgbj0wO248MjU2O24rKyl7dD1uO2Zvcih2YXIgbz0wO288ODtvKyspdD10JjE/Mzk4ODI5MjM4NF50Pj4+MTp0Pj4+MTtlW25dPXR9cmV0dXJuIGV9LFFVPW5ldyBVaW50MzJBcnJheShaVSgpKSxKVT0odCxlLG4sbyk9PntsZXQgcj1RVSxpPW8rbjt0Xj0tMTtmb3IobGV0IHM9bztzPGk7cysrKXQ9dD4+PjheclsodF5lW3NdKSYyNTVdO3JldHVybiB0Xi0xfTtPMi5leHBvcnRzPUpVfSk7dmFyIFMyPVZuKChWdXQsUjIpPT57InVzZSBzdHJpY3QiO1IyLmV4cG9ydHM9ZnVuY3Rpb24oZSxuKXtsZXQgbyxyLGkscyxmLHUsYyxsLHAsZCxtLF8sZyxiLHcsTyxFLFQsQyxOLEksRCx2LEwsVT1lLnN0YXRlO289ZS5uZXh0X2luLHY9ZS5pbnB1dCxyPW8rKGUuYXZhaWxfaW4tNSksaT1lLm5leHRfb3V0LEw9ZS5vdXRwdXQscz1pLShuLWUuYXZhaWxfb3V0KSxmPWkrKGUuYXZhaWxfb3V0LTI1NyksdT1VLmRtYXgsYz1VLndzaXplLGw9VS53aGF2ZSxwPVUud25leHQsZD1VLndpbmRvdyxtPVUuaG9sZCxfPVUuYml0cyxnPVUubGVuY29kZSxiPVUuZGlzdGNvZGUsdz0oMTw8VS5sZW5iaXRzKS0xLE89KDE8PFUuZGlzdGJpdHMpLTE7dDpkb3tfPDE1JiYobSs9dltvKytdPDxfLF8rPTgsbSs9dltvKytdPDxfLF8rPTgpLEU9Z1ttJnddO2U6Zm9yKDs7KXtpZihUPUU+Pj4yNCxtPj4+PVQsXy09VCxUPUU+Pj4xNiYyNTUsVD09PTApTFtpKytdPUUmNjU1MzU7ZWxzZSBpZihUJjE2KXtDPUUmNjU1MzUsVCY9MTUsVCYmKF88VCYmKG0rPXZbbysrXTw8XyxfKz04KSxDKz1tJigxPDxUKS0xLG0+Pj49VCxfLT1UKSxfPDE1JiYobSs9dltvKytdPDxfLF8rPTgsbSs9dltvKytdPDxfLF8rPTgpLEU9YlttJk9dO246Zm9yKDs7KXtpZihUPUU+Pj4yNCxtPj4+PVQsXy09VCxUPUU+Pj4xNiYyNTUsVCYxNil7aWYoTj1FJjY1NTM1LFQmPTE1LF88VCYmKG0rPXZbbysrXTw8XyxfKz04LF88VCYmKG0rPXZbbysrXTw8XyxfKz04KSksTis9bSYoMTw8VCktMSxOPnUpe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsVS5tb2RlPTE2MjA5O2JyZWFrIHR9aWYobT4+Pj1ULF8tPVQsVD1pLXMsTj5UKXtpZihUPU4tVCxUPmwmJlUuc2FuZSl7ZS5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixVLm1vZGU9MTYyMDk7YnJlYWsgdH1pZihJPTAsRD1kLHA9PT0wKXtpZihJKz1jLVQsVDxDKXtDLT1UO2RvIExbaSsrXT1kW0krK107d2hpbGUoLS1UKTtJPWktTixEPUx9fWVsc2UgaWYocDxUKXtpZihJKz1jK3AtVCxULT1wLFQ8Qyl7Qy09VDtkbyBMW2krK109ZFtJKytdO3doaWxlKC0tVCk7aWYoST0wLHA8Qyl7VD1wLEMtPVQ7ZG8gTFtpKytdPWRbSSsrXTt3aGlsZSgtLVQpO0k9aS1OLEQ9TH19fWVsc2UgaWYoSSs9cC1ULFQ8Qyl7Qy09VDtkbyBMW2krK109ZFtJKytdO3doaWxlKC0tVCk7ST1pLU4sRD1MfWZvcig7Qz4yOylMW2krK109RFtJKytdLExbaSsrXT1EW0krK10sTFtpKytdPURbSSsrXSxDLT0zO0MmJihMW2krK109RFtJKytdLEM+MSYmKExbaSsrXT1EW0krK10pKX1lbHNle0k9aS1OO2RvIExbaSsrXT1MW0krK10sTFtpKytdPUxbSSsrXSxMW2krK109TFtJKytdLEMtPTM7d2hpbGUoQz4yKTtDJiYoTFtpKytdPUxbSSsrXSxDPjEmJihMW2krK109TFtJKytdKSl9fWVsc2UgaWYoVCY2NCl7ZS5tc2c9ImludmFsaWQgZGlzdGFuY2UgY29kZSIsVS5tb2RlPTE2MjA5O2JyZWFrIHR9ZWxzZXtFPWJbKEUmNjU1MzUpKyhtJigxPDxUKS0xKV07Y29udGludWUgbn1icmVha319ZWxzZSBpZihUJjY0KWlmKFQmMzIpe1UubW9kZT0xNjE5MTticmVhayB0fWVsc2V7ZS5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsVS5tb2RlPTE2MjA5O2JyZWFrIHR9ZWxzZXtFPWdbKEUmNjU1MzUpKyhtJigxPDxUKS0xKV07Y29udGludWUgZX1icmVha319d2hpbGUobzxyJiZpPGYpO0M9Xz4+MyxvLT1DLF8tPUM8PDMsbSY9KDE8PF8pLTEsZS5uZXh0X2luPW8sZS5uZXh0X291dD1pLGUuYXZhaWxfaW49bzxyPzUrKHItbyk6NS0oby1yKSxlLmF2YWlsX291dD1pPGY/MjU3KyhmLWkpOjI1Ny0oaS1mKSxVLmhvbGQ9bSxVLmJpdHM9X319KTt2YXIgeDI9Vm4oKGt1dCxDMik9PnsidXNlIHN0cmljdCI7dmFyIHQ2PW5ldyBVaW50MTZBcnJheShbMyw0LDUsNiw3LDgsOSwxMCwxMSwxMywxNSwxNywxOSwyMywyNywzMSwzNSw0Myw1MSw1OSw2Nyw4Myw5OSwxMTUsMTMxLDE2MywxOTUsMjI3LDI1OCwwLDBdKSxlNj1uZXcgVWludDhBcnJheShbMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTcsMTcsMTcsMTcsMTgsMTgsMTgsMTgsMTksMTksMTksMTksMjAsMjAsMjAsMjAsMjEsMjEsMjEsMjEsMTYsNzIsNzhdKSxuNj1uZXcgVWludDE2QXJyYXkoWzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3NywwLDBdKSxvNj1uZXcgVWludDhBcnJheShbMTYsMTYsMTYsMTYsMTcsMTcsMTgsMTgsMTksMTksMjAsMjAsMjEsMjEsMjIsMjIsMjMsMjMsMjQsMjQsMjUsMjUsMjYsMjYsMjcsMjcsMjgsMjgsMjksMjksNjQsNjRdKSxyNj0odCxlLG4sbyxyLGkscyxmKT0+e2xldCB1PWYuYml0cyxjPTAsbD0wLHA9MCxkPTAsbT0wLF89MCxnPTAsYj0wLHc9MCxPPTAsRSxULEMsTixJLEQ9bnVsbCx2LEw9bmV3IFVpbnQxNkFycmF5KDE2KSxVPW5ldyBVaW50MTZBcnJheSgxNiksQT1udWxsLFMsUCxCO2ZvcihjPTA7Yzw9MTU7YysrKUxbY109MDtmb3IobD0wO2w8bztsKyspTFtlW24rbF1dKys7Zm9yKG09dSxkPTE1O2Q+PTEmJkxbZF09PT0wO2QtLSk7aWYobT5kJiYobT1kKSxkPT09MClyZXR1cm4gcltpKytdPTE8PDI0fDY0PDwxNnwwLHJbaSsrXT0xPDwyNHw2NDw8MTZ8MCxmLmJpdHM9MSwwO2ZvcihwPTE7cDxkJiZMW3BdPT09MDtwKyspO2ZvcihtPHAmJihtPXApLGI9MSxjPTE7Yzw9MTU7YysrKWlmKGI8PD0xLGItPUxbY10sYjwwKXJldHVybi0xO2lmKGI+MCYmKHQ9PT0wfHxkIT09MSkpcmV0dXJuLTE7Zm9yKFVbMV09MCxjPTE7YzwxNTtjKyspVVtjKzFdPVVbY10rTFtjXTtmb3IobD0wO2w8bztsKyspZVtuK2xdIT09MCYmKHNbVVtlW24rbF1dKytdPWwpO2lmKHQ9PT0wPyhEPUE9cyx2PTIwKTp0PT09MT8oRD10NixBPWU2LHY9MjU3KTooRD1uNixBPW82LHY9MCksTz0wLGw9MCxjPXAsST1pLF89bSxnPTAsQz0tMSx3PTE8PG0sTj13LTEsdD09PTEmJnc+ODUyfHx0PT09MiYmdz41OTIpcmV0dXJuIDE7Zm9yKDs7KXtTPWMtZyxzW2xdKzE8dj8oUD0wLEI9c1tsXSk6c1tsXT49dj8oUD1BW3NbbF0tdl0sQj1EW3NbbF0tdl0pOihQPTk2LEI9MCksRT0xPDxjLWcsVD0xPDxfLHA9VDtkbyBULT1FLHJbSSsoTz4+ZykrVF09Uzw8MjR8UDw8MTZ8QnwwO3doaWxlKFQhPT0wKTtmb3IoRT0xPDxjLTE7TyZFOylFPj49MTtpZihFIT09MD8oTyY9RS0xLE8rPUUpOk89MCxsKyssLS1MW2NdPT09MCl7aWYoYz09PWQpYnJlYWs7Yz1lW24rc1tsXV19aWYoYz5tJiYoTyZOKSE9PUMpe2ZvcihnPT09MCYmKGc9bSksSSs9cCxfPWMtZyxiPTE8PF87XytnPGQmJihiLT1MW18rZ10sIShiPD0wKSk7KV8rKyxiPDw9MTtpZih3Kz0xPDxfLHQ9PT0xJiZ3Pjg1Mnx8dD09PTImJnc+NTkyKXJldHVybiAxO0M9TyZOLHJbQ109bTw8MjR8Xzw8MTZ8SS1pfDB9fXJldHVybiBPIT09MCYmKHJbSStPXT1jLWc8PDI0fDY0PDwxNnwwKSxmLmJpdHM9bSwwfTtDMi5leHBvcnRzPXI2fSk7dmFyIGVtPVZuKChHdXQsUDIpPT57InVzZSBzdHJpY3QiO1AyLmV4cG9ydHM9e1pfTk9fRkxVU0g6MCxaX1BBUlRJQUxfRkxVU0g6MSxaX1NZTkNfRkxVU0g6MixaX0ZVTExfRkxVU0g6MyxaX0ZJTklTSDo0LFpfQkxPQ0s6NSxaX1RSRUVTOjYsWl9PSzowLFpfU1RSRUFNX0VORDoxLFpfTkVFRF9ESUNUOjIsWl9FUlJOTzotMSxaX1NUUkVBTV9FUlJPUjotMixaX0RBVEFfRVJST1I6LTMsWl9NRU1fRVJST1I6LTQsWl9CVUZfRVJST1I6LTUsWl9OT19DT01QUkVTU0lPTjowLFpfQkVTVF9TUEVFRDoxLFpfQkVTVF9DT01QUkVTU0lPTjo5LFpfREVGQVVMVF9DT01QUkVTU0lPTjotMSxaX0ZJTFRFUkVEOjEsWl9IVUZGTUFOX09OTFk6MixaX1JMRTozLFpfRklYRUQ6NCxaX0RFRkFVTFRfU1RSQVRFR1k6MCxaX0JJTkFSWTowLFpfVEVYVDoxLFpfVU5LTk9XTjoyLFpfREVGTEFURUQ6OH19KTt2YXIgdVM9Vm4oKHp1dCxZcik9PnsidXNlIHN0cmljdCI7dmFyIERnPVQyKCksZ2k9RTIoKSxpNj1TMigpLGx1PXgyKCksczY9MCxlUz0xLG5TPTIse1pfRklOSVNIOk0yLFpfQkxPQ0s6YzYsWl9UUkVFUzpubSxaX09LOlNjLFpfU1RSRUFNX0VORDphNixaX05FRURfRElDVDpmNixaX1NUUkVBTV9FUlJPUjpNcixaX0RBVEFfRVJST1I6b1MsWl9NRU1fRVJST1I6RmcsWl9CVUZfRVJST1I6dTYsWl9ERUZMQVRFRDpOMn09ZW0oKSxzbT0xNjE4MCxJMj0xNjE4MSx2Mj0xNjE4MixMMj0xNjE4MyxEMj0xNjE4NCxGMj0xNjE4NSxCMj0xNjE4NixVMj0xNjE4NyxWMj0xNjE4OCxrMj0xNjE4OSxpbT0xNjE5MCxLaT0xNjE5MSxNZz0xNjE5MixHMj0xNjE5MyxOZz0xNjE5NCx6Mj0xNjE5NSxqMj0xNjE5NixIMj0xNjE5NyxxMj0xNjE5OCxvbT0xNjE5OSxybT0xNjIwMCxLMj0xNjIwMSxXMj0xNjIwMixYMj0xNjIwMyxZMj0xNjIwNCwkMj0xNjIwNSxJZz0xNjIwNixaMj0xNjIwNyxRMj0xNjIwOCxQbj0xNjIwOSxCZz0xNjIxMCxyUz0xNjIxMSxsNj04NTIscDY9NTkyLGQ2PTE1LG02PWQ2LEoyPXQ9Pih0Pj4+MjQmMjU1KSsodD4+PjgmNjUyODApKygodCY2NTI4MCk8PDgpKygodCYyNTUpPDwyNCk7ZnVuY3Rpb24gaDYoKXt0aGlzLnN0cm09bnVsbCx0aGlzLm1vZGU9MCx0aGlzLmxhc3Q9ITEsdGhpcy53cmFwPTAsdGhpcy5oYXZlZGljdD0hMSx0aGlzLmZsYWdzPTAsdGhpcy5kbWF4PTAsdGhpcy5jaGVjaz0wLHRoaXMudG90YWw9MCx0aGlzLmhlYWQ9bnVsbCx0aGlzLndiaXRzPTAsdGhpcy53c2l6ZT0wLHRoaXMud2hhdmU9MCx0aGlzLnduZXh0PTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLmhvbGQ9MCx0aGlzLmJpdHM9MCx0aGlzLmxlbmd0aD0wLHRoaXMub2Zmc2V0PTAsdGhpcy5leHRyYT0wLHRoaXMubGVuY29kZT1udWxsLHRoaXMuZGlzdGNvZGU9bnVsbCx0aGlzLmxlbmJpdHM9MCx0aGlzLmRpc3RiaXRzPTAsdGhpcy5uY29kZT0wLHRoaXMubmxlbj0wLHRoaXMubmRpc3Q9MCx0aGlzLmhhdmU9MCx0aGlzLm5leHQ9bnVsbCx0aGlzLmxlbnM9bmV3IFVpbnQxNkFycmF5KDMyMCksdGhpcy53b3JrPW5ldyBVaW50MTZBcnJheSgyODgpLHRoaXMubGVuZHluPW51bGwsdGhpcy5kaXN0ZHluPW51bGwsdGhpcy5zYW5lPTAsdGhpcy5iYWNrPTAsdGhpcy53YXM9MH12YXIgQ2M9dD0+e2lmKCF0KXJldHVybiAxO2xldCBlPXQuc3RhdGU7cmV0dXJuIWV8fGUuc3RybSE9PXR8fGUubW9kZTxzbXx8ZS5tb2RlPnJTPzE6MH0saVM9dD0+e2lmKENjKHQpKXJldHVybiBNcjtsZXQgZT10LnN0YXRlO3JldHVybiB0LnRvdGFsX2luPXQudG90YWxfb3V0PWUudG90YWw9MCx0Lm1zZz0iIixlLndyYXAmJih0LmFkbGVyPWUud3JhcCYxKSxlLm1vZGU9c20sZS5sYXN0PTAsZS5oYXZlZGljdD0wLGUuZmxhZ3M9LTEsZS5kbWF4PTMyNzY4LGUuaGVhZD1udWxsLGUuaG9sZD0wLGUuYml0cz0wLGUubGVuY29kZT1lLmxlbmR5bj1uZXcgSW50MzJBcnJheShsNiksZS5kaXN0Y29kZT1lLmRpc3RkeW49bmV3IEludDMyQXJyYXkocDYpLGUuc2FuZT0xLGUuYmFjaz0tMSxTY30sc1M9dD0+e2lmKENjKHQpKXJldHVybiBNcjtsZXQgZT10LnN0YXRlO3JldHVybiBlLndzaXplPTAsZS53aGF2ZT0wLGUud25leHQ9MCxpUyh0KX0sY1M9KHQsZSk9PntsZXQgbjtpZihDYyh0KSlyZXR1cm4gTXI7bGV0IG89dC5zdGF0ZTtyZXR1cm4gZTwwPyhuPTAsZT0tZSk6KG49KGU+PjQpKzUsZTw0OCYmKGUmPTE1KSksZSYmKGU8OHx8ZT4xNSk/TXI6KG8ud2luZG93IT09bnVsbCYmby53Yml0cyE9PWUmJihvLndpbmRvdz1udWxsKSxvLndyYXA9bixvLndiaXRzPWUsc1ModCkpfSxhUz0odCxlKT0+e2lmKCF0KXJldHVybiBNcjtsZXQgbj1uZXcgaDY7dC5zdGF0ZT1uLG4uc3RybT10LG4ud2luZG93PW51bGwsbi5tb2RlPXNtO2xldCBvPWNTKHQsZSk7cmV0dXJuIG8hPT1TYyYmKHQuc3RhdGU9bnVsbCksb30sXzY9dD0+YVModCxtNiksdFM9ITAsdmcsTGcseTY9dD0+e2lmKHRTKXt2Zz1uZXcgSW50MzJBcnJheSg1MTIpLExnPW5ldyBJbnQzMkFycmF5KDMyKTtsZXQgZT0wO2Zvcig7ZTwxNDQ7KXQubGVuc1tlKytdPTg7Zm9yKDtlPDI1NjspdC5sZW5zW2UrK109OTtmb3IoO2U8MjgwOyl0LmxlbnNbZSsrXT03O2Zvcig7ZTwyODg7KXQubGVuc1tlKytdPTg7Zm9yKGx1KGVTLHQubGVucywwLDI4OCx2ZywwLHQud29yayx7Yml0czo5fSksZT0wO2U8MzI7KXQubGVuc1tlKytdPTU7bHUoblMsdC5sZW5zLDAsMzIsTGcsMCx0Lndvcmsse2JpdHM6NX0pLHRTPSExfXQubGVuY29kZT12Zyx0LmxlbmJpdHM9OSx0LmRpc3Rjb2RlPUxnLHQuZGlzdGJpdHM9NX0sZlM9KHQsZSxuLG8pPT57bGV0IHIsaT10LnN0YXRlO3JldHVybiBpLndpbmRvdz09PW51bGwmJihpLndzaXplPTE8PGkud2JpdHMsaS53bmV4dD0wLGkud2hhdmU9MCxpLndpbmRvdz1uZXcgVWludDhBcnJheShpLndzaXplKSksbz49aS53c2l6ZT8oaS53aW5kb3cuc2V0KGUuc3ViYXJyYXkobi1pLndzaXplLG4pLDApLGkud25leHQ9MCxpLndoYXZlPWkud3NpemUpOihyPWkud3NpemUtaS53bmV4dCxyPm8mJihyPW8pLGkud2luZG93LnNldChlLnN1YmFycmF5KG4tbyxuLW8rciksaS53bmV4dCksby09cixvPyhpLndpbmRvdy5zZXQoZS5zdWJhcnJheShuLW8sbiksMCksaS53bmV4dD1vLGkud2hhdmU9aS53c2l6ZSk6KGkud25leHQrPXIsaS53bmV4dD09PWkud3NpemUmJihpLnduZXh0PTApLGkud2hhdmU8aS53c2l6ZSYmKGkud2hhdmUrPXIpKSksMH0sZzY9KHQsZSk9PntsZXQgbixvLHIsaSxzLGYsdSxjLGwscCxkLG0sXyxnLGI9MCx3LE8sRSxULEMsTixJLEQsdj1uZXcgVWludDhBcnJheSg0KSxMLFUsQT1uZXcgVWludDhBcnJheShbMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0pO2lmKENjKHQpfHwhdC5vdXRwdXR8fCF0LmlucHV0JiZ0LmF2YWlsX2luIT09MClyZXR1cm4gTXI7bj10LnN0YXRlLG4ubW9kZT09PUtpJiYobi5tb2RlPU1nKSxzPXQubmV4dF9vdXQscj10Lm91dHB1dCx1PXQuYXZhaWxfb3V0LGk9dC5uZXh0X2luLG89dC5pbnB1dCxmPXQuYXZhaWxfaW4sYz1uLmhvbGQsbD1uLmJpdHMscD1mLGQ9dSxEPVNjO3Q6Zm9yKDs7KXN3aXRjaChuLm1vZGUpe2Nhc2Ugc206aWYobi53cmFwPT09MCl7bi5tb2RlPU1nO2JyZWFrfWZvcig7bDwxNjspe2lmKGY9PT0wKWJyZWFrIHQ7Zi0tLGMrPW9baSsrXTw8bCxsKz04fWlmKG4ud3JhcCYyJiZjPT09MzU2MTUpe24ud2JpdHM9PT0wJiYobi53Yml0cz0xNSksbi5jaGVjaz0wLHZbMF09YyYyNTUsdlsxXT1jPj4+OCYyNTUsbi5jaGVjaz1naShuLmNoZWNrLHYsMiwwKSxjPTAsbD0wLG4ubW9kZT1JMjticmVha31pZihuLmhlYWQmJihuLmhlYWQuZG9uZT0hMSksIShuLndyYXAmMSl8fCgoKGMmMjU1KTw8OCkrKGM+PjgpKSUzMSl7dC5tc2c9ImluY29ycmVjdCBoZWFkZXIgY2hlY2siLG4ubW9kZT1QbjticmVha31pZigoYyYxNSkhPT1OMil7dC5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIixuLm1vZGU9UG47YnJlYWt9aWYoYz4+Pj00LGwtPTQsST0oYyYxNSkrOCxuLndiaXRzPT09MCYmKG4ud2JpdHM9SSksST4xNXx8ST5uLndiaXRzKXt0Lm1zZz0iaW52YWxpZCB3aW5kb3cgc2l6ZSIsbi5tb2RlPVBuO2JyZWFrfW4uZG1heD0xPDxuLndiaXRzLG4uZmxhZ3M9MCx0LmFkbGVyPW4uY2hlY2s9MSxuLm1vZGU9YyY1MTI/azI6S2ksYz0wLGw9MDticmVhaztjYXNlIEkyOmZvcig7bDwxNjspe2lmKGY9PT0wKWJyZWFrIHQ7Zi0tLGMrPW9baSsrXTw8bCxsKz04fWlmKG4uZmxhZ3M9Yywobi5mbGFncyYyNTUpIT09TjIpe3QubXNnPSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCIsbi5tb2RlPVBuO2JyZWFrfWlmKG4uZmxhZ3MmNTczNDQpe3QubXNnPSJ1bmtub3duIGhlYWRlciBmbGFncyBzZXQiLG4ubW9kZT1QbjticmVha31uLmhlYWQmJihuLmhlYWQudGV4dD1jPj44JjEpLG4uZmxhZ3MmNTEyJiZuLndyYXAmNCYmKHZbMF09YyYyNTUsdlsxXT1jPj4+OCYyNTUsbi5jaGVjaz1naShuLmNoZWNrLHYsMiwwKSksYz0wLGw9MCxuLm1vZGU9djI7Y2FzZSB2Mjpmb3IoO2w8MzI7KXtpZihmPT09MClicmVhayB0O2YtLSxjKz1vW2krK108PGwsbCs9OH1uLmhlYWQmJihuLmhlYWQudGltZT1jKSxuLmZsYWdzJjUxMiYmbi53cmFwJjQmJih2WzBdPWMmMjU1LHZbMV09Yz4+PjgmMjU1LHZbMl09Yz4+PjE2JjI1NSx2WzNdPWM+Pj4yNCYyNTUsbi5jaGVjaz1naShuLmNoZWNrLHYsNCwwKSksYz0wLGw9MCxuLm1vZGU9TDI7Y2FzZSBMMjpmb3IoO2w8MTY7KXtpZihmPT09MClicmVhayB0O2YtLSxjKz1vW2krK108PGwsbCs9OH1uLmhlYWQmJihuLmhlYWQueGZsYWdzPWMmMjU1LG4uaGVhZC5vcz1jPj44KSxuLmZsYWdzJjUxMiYmbi53cmFwJjQmJih2WzBdPWMmMjU1LHZbMV09Yz4+PjgmMjU1LG4uY2hlY2s9Z2kobi5jaGVjayx2LDIsMCkpLGM9MCxsPTAsbi5tb2RlPUQyO2Nhc2UgRDI6aWYobi5mbGFncyYxMDI0KXtmb3IoO2w8MTY7KXtpZihmPT09MClicmVhayB0O2YtLSxjKz1vW2krK108PGwsbCs9OH1uLmxlbmd0aD1jLG4uaGVhZCYmKG4uaGVhZC5leHRyYV9sZW49Yyksbi5mbGFncyY1MTImJm4ud3JhcCY0JiYodlswXT1jJjI1NSx2WzFdPWM+Pj44JjI1NSxuLmNoZWNrPWdpKG4uY2hlY2ssdiwyLDApKSxjPTAsbD0wfWVsc2Ugbi5oZWFkJiYobi5oZWFkLmV4dHJhPW51bGwpO24ubW9kZT1GMjtjYXNlIEYyOmlmKG4uZmxhZ3MmMTAyNCYmKG09bi5sZW5ndGgsbT5mJiYobT1mKSxtJiYobi5oZWFkJiYoST1uLmhlYWQuZXh0cmFfbGVuLW4ubGVuZ3RoLG4uaGVhZC5leHRyYXx8KG4uaGVhZC5leHRyYT1uZXcgVWludDhBcnJheShuLmhlYWQuZXh0cmFfbGVuKSksbi5oZWFkLmV4dHJhLnNldChvLnN1YmFycmF5KGksaSttKSxJKSksbi5mbGFncyY1MTImJm4ud3JhcCY0JiYobi5jaGVjaz1naShuLmNoZWNrLG8sbSxpKSksZi09bSxpKz1tLG4ubGVuZ3RoLT1tKSxuLmxlbmd0aCkpYnJlYWsgdDtuLmxlbmd0aD0wLG4ubW9kZT1CMjtjYXNlIEIyOmlmKG4uZmxhZ3MmMjA0OCl7aWYoZj09PTApYnJlYWsgdDttPTA7ZG8gST1vW2krbSsrXSxuLmhlYWQmJkkmJm4ubGVuZ3RoPDY1NTM2JiYobi5oZWFkLm5hbWUrPVN0cmluZy5mcm9tQ2hhckNvZGUoSSkpO3doaWxlKEkmJm08Zik7aWYobi5mbGFncyY1MTImJm4ud3JhcCY0JiYobi5jaGVjaz1naShuLmNoZWNrLG8sbSxpKSksZi09bSxpKz1tLEkpYnJlYWsgdH1lbHNlIG4uaGVhZCYmKG4uaGVhZC5uYW1lPW51bGwpO24ubGVuZ3RoPTAsbi5tb2RlPVUyO2Nhc2UgVTI6aWYobi5mbGFncyY0MDk2KXtpZihmPT09MClicmVhayB0O209MDtkbyBJPW9baSttKytdLG4uaGVhZCYmSSYmbi5sZW5ndGg8NjU1MzYmJihuLmhlYWQuY29tbWVudCs9U3RyaW5nLmZyb21DaGFyQ29kZShJKSk7d2hpbGUoSSYmbTxmKTtpZihuLmZsYWdzJjUxMiYmbi53cmFwJjQmJihuLmNoZWNrPWdpKG4uY2hlY2ssbyxtLGkpKSxmLT1tLGkrPW0sSSlicmVhayB0fWVsc2Ugbi5oZWFkJiYobi5oZWFkLmNvbW1lbnQ9bnVsbCk7bi5tb2RlPVYyO2Nhc2UgVjI6aWYobi5mbGFncyY1MTIpe2Zvcig7bDwxNjspe2lmKGY9PT0wKWJyZWFrIHQ7Zi0tLGMrPW9baSsrXTw8bCxsKz04fWlmKG4ud3JhcCY0JiZjIT09KG4uY2hlY2smNjU1MzUpKXt0Lm1zZz0iaGVhZGVyIGNyYyBtaXNtYXRjaCIsbi5tb2RlPVBuO2JyZWFrfWM9MCxsPTB9bi5oZWFkJiYobi5oZWFkLmhjcmM9bi5mbGFncz4+OSYxLG4uaGVhZC5kb25lPSEwKSx0LmFkbGVyPW4uY2hlY2s9MCxuLm1vZGU9S2k7YnJlYWs7Y2FzZSBrMjpmb3IoO2w8MzI7KXtpZihmPT09MClicmVhayB0O2YtLSxjKz1vW2krK108PGwsbCs9OH10LmFkbGVyPW4uY2hlY2s9SjIoYyksYz0wLGw9MCxuLm1vZGU9aW07Y2FzZSBpbTppZihuLmhhdmVkaWN0PT09MClyZXR1cm4gdC5uZXh0X291dD1zLHQuYXZhaWxfb3V0PXUsdC5uZXh0X2luPWksdC5hdmFpbF9pbj1mLG4uaG9sZD1jLG4uYml0cz1sLGY2O3QuYWRsZXI9bi5jaGVjaz0xLG4ubW9kZT1LaTtjYXNlIEtpOmlmKGU9PT1jNnx8ZT09PW5tKWJyZWFrIHQ7Y2FzZSBNZzppZihuLmxhc3Qpe2M+Pj49bCY3LGwtPWwmNyxuLm1vZGU9SWc7YnJlYWt9Zm9yKDtsPDM7KXtpZihmPT09MClicmVhayB0O2YtLSxjKz1vW2krK108PGwsbCs9OH1zd2l0Y2gobi5sYXN0PWMmMSxjPj4+PTEsbC09MSxjJjMpe2Nhc2UgMDpuLm1vZGU9RzI7YnJlYWs7Y2FzZSAxOmlmKHk2KG4pLG4ubW9kZT1vbSxlPT09bm0pe2M+Pj49MixsLT0yO2JyZWFrIHR9YnJlYWs7Y2FzZSAyOm4ubW9kZT1qMjticmVhaztjYXNlIDM6dC5tc2c9ImludmFsaWQgYmxvY2sgdHlwZSIsbi5tb2RlPVBufWM+Pj49MixsLT0yO2JyZWFrO2Nhc2UgRzI6Zm9yKGM+Pj49bCY3LGwtPWwmNztsPDMyOyl7aWYoZj09PTApYnJlYWsgdDtmLS0sYys9b1tpKytdPDxsLGwrPTh9aWYoKGMmNjU1MzUpIT09KGM+Pj4xNl42NTUzNSkpe3QubXNnPSJpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzIixuLm1vZGU9UG47YnJlYWt9aWYobi5sZW5ndGg9YyY2NTUzNSxjPTAsbD0wLG4ubW9kZT1OZyxlPT09bm0pYnJlYWsgdDtjYXNlIE5nOm4ubW9kZT16MjtjYXNlIHoyOmlmKG09bi5sZW5ndGgsbSl7aWYobT5mJiYobT1mKSxtPnUmJihtPXUpLG09PT0wKWJyZWFrIHQ7ci5zZXQoby5zdWJhcnJheShpLGkrbSkscyksZi09bSxpKz1tLHUtPW0scys9bSxuLmxlbmd0aC09bTticmVha31uLm1vZGU9S2k7YnJlYWs7Y2FzZSBqMjpmb3IoO2w8MTQ7KXtpZihmPT09MClicmVhayB0O2YtLSxjKz1vW2krK108PGwsbCs9OH1pZihuLm5sZW49KGMmMzEpKzI1NyxjPj4+PTUsbC09NSxuLm5kaXN0PShjJjMxKSsxLGM+Pj49NSxsLT01LG4ubmNvZGU9KGMmMTUpKzQsYz4+Pj00LGwtPTQsbi5ubGVuPjI4Nnx8bi5uZGlzdD4zMCl7dC5tc2c9InRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzIixuLm1vZGU9UG47YnJlYWt9bi5oYXZlPTAsbi5tb2RlPUgyO2Nhc2UgSDI6Zm9yKDtuLmhhdmU8bi5uY29kZTspe2Zvcig7bDwzOyl7aWYoZj09PTApYnJlYWsgdDtmLS0sYys9b1tpKytdPDxsLGwrPTh9bi5sZW5zW0Fbbi5oYXZlKytdXT1jJjcsYz4+Pj0zLGwtPTN9Zm9yKDtuLmhhdmU8MTk7KW4ubGVuc1tBW24uaGF2ZSsrXV09MDtpZihuLmxlbmNvZGU9bi5sZW5keW4sbi5sZW5iaXRzPTcsTD17Yml0czpuLmxlbmJpdHN9LEQ9bHUoczYsbi5sZW5zLDAsMTksbi5sZW5jb2RlLDAsbi53b3JrLEwpLG4ubGVuYml0cz1MLmJpdHMsRCl7dC5tc2c9ImludmFsaWQgY29kZSBsZW5ndGhzIHNldCIsbi5tb2RlPVBuO2JyZWFrfW4uaGF2ZT0wLG4ubW9kZT1xMjtjYXNlIHEyOmZvcig7bi5oYXZlPG4ubmxlbituLm5kaXN0Oyl7Zm9yKDtiPW4ubGVuY29kZVtjJigxPDxuLmxlbmJpdHMpLTFdLHc9Yj4+PjI0LE89Yj4+PjE2JjI1NSxFPWImNjU1MzUsISh3PD1sKTspe2lmKGY9PT0wKWJyZWFrIHQ7Zi0tLGMrPW9baSsrXTw8bCxsKz04fWlmKEU8MTYpYz4+Pj13LGwtPXcsbi5sZW5zW24uaGF2ZSsrXT1FO2Vsc2V7aWYoRT09PTE2KXtmb3IoVT13KzI7bDxVOyl7aWYoZj09PTApYnJlYWsgdDtmLS0sYys9b1tpKytdPDxsLGwrPTh9aWYoYz4+Pj13LGwtPXcsbi5oYXZlPT09MCl7dC5tc2c9ImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiLG4ubW9kZT1QbjticmVha31JPW4ubGVuc1tuLmhhdmUtMV0sbT0zKyhjJjMpLGM+Pj49MixsLT0yfWVsc2UgaWYoRT09PTE3KXtmb3IoVT13KzM7bDxVOyl7aWYoZj09PTApYnJlYWsgdDtmLS0sYys9b1tpKytdPDxsLGwrPTh9Yz4+Pj13LGwtPXcsST0wLG09MysoYyY3KSxjPj4+PTMsbC09M31lbHNle2ZvcihVPXcrNztsPFU7KXtpZihmPT09MClicmVhayB0O2YtLSxjKz1vW2krK108PGwsbCs9OH1jPj4+PXcsbC09dyxJPTAsbT0xMSsoYyYxMjcpLGM+Pj49NyxsLT03fWlmKG4uaGF2ZSttPm4ubmxlbituLm5kaXN0KXt0Lm1zZz0iaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCIsbi5tb2RlPVBuO2JyZWFrfWZvcig7bS0tOyluLmxlbnNbbi5oYXZlKytdPUl9fWlmKG4ubW9kZT09PVBuKWJyZWFrO2lmKG4ubGVuc1syNTZdPT09MCl7dC5tc2c9ImludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayIsbi5tb2RlPVBuO2JyZWFrfWlmKG4ubGVuYml0cz05LEw9e2JpdHM6bi5sZW5iaXRzfSxEPWx1KGVTLG4ubGVucywwLG4ubmxlbixuLmxlbmNvZGUsMCxuLndvcmssTCksbi5sZW5iaXRzPUwuYml0cyxEKXt0Lm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0IixuLm1vZGU9UG47YnJlYWt9aWYobi5kaXN0Yml0cz02LG4uZGlzdGNvZGU9bi5kaXN0ZHluLEw9e2JpdHM6bi5kaXN0Yml0c30sRD1sdShuUyxuLmxlbnMsbi5ubGVuLG4ubmRpc3Qsbi5kaXN0Y29kZSwwLG4ud29yayxMKSxuLmRpc3RiaXRzPUwuYml0cyxEKXt0Lm1zZz0iaW52YWxpZCBkaXN0YW5jZXMgc2V0IixuLm1vZGU9UG47YnJlYWt9aWYobi5tb2RlPW9tLGU9PT1ubSlicmVhayB0O2Nhc2Ugb206bi5tb2RlPXJtO2Nhc2Ugcm06aWYoZj49NiYmdT49MjU4KXt0Lm5leHRfb3V0PXMsdC5hdmFpbF9vdXQ9dSx0Lm5leHRfaW49aSx0LmF2YWlsX2luPWYsbi5ob2xkPWMsbi5iaXRzPWwsaTYodCxkKSxzPXQubmV4dF9vdXQscj10Lm91dHB1dCx1PXQuYXZhaWxfb3V0LGk9dC5uZXh0X2luLG89dC5pbnB1dCxmPXQuYXZhaWxfaW4sYz1uLmhvbGQsbD1uLmJpdHMsbi5tb2RlPT09S2kmJihuLmJhY2s9LTEpO2JyZWFrfWZvcihuLmJhY2s9MDtiPW4ubGVuY29kZVtjJigxPDxuLmxlbmJpdHMpLTFdLHc9Yj4+PjI0LE89Yj4+PjE2JjI1NSxFPWImNjU1MzUsISh3PD1sKTspe2lmKGY9PT0wKWJyZWFrIHQ7Zi0tLGMrPW9baSsrXTw8bCxsKz04fWlmKE8mJiEoTyYyNDApKXtmb3IoVD13LEM9TyxOPUU7Yj1uLmxlbmNvZGVbTisoKGMmKDE8PFQrQyktMSk+PlQpXSx3PWI+Pj4yNCxPPWI+Pj4xNiYyNTUsRT1iJjY1NTM1LCEoVCt3PD1sKTspe2lmKGY9PT0wKWJyZWFrIHQ7Zi0tLGMrPW9baSsrXTw8bCxsKz04fWM+Pj49VCxsLT1ULG4uYmFjays9VH1pZihjPj4+PXcsbC09dyxuLmJhY2srPXcsbi5sZW5ndGg9RSxPPT09MCl7bi5tb2RlPSQyO2JyZWFrfWlmKE8mMzIpe24uYmFjaz0tMSxuLm1vZGU9S2k7YnJlYWt9aWYoTyY2NCl7dC5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsbi5tb2RlPVBuO2JyZWFrfW4uZXh0cmE9TyYxNSxuLm1vZGU9SzI7Y2FzZSBLMjppZihuLmV4dHJhKXtmb3IoVT1uLmV4dHJhO2w8VTspe2lmKGY9PT0wKWJyZWFrIHQ7Zi0tLGMrPW9baSsrXTw8bCxsKz04fW4ubGVuZ3RoKz1jJigxPDxuLmV4dHJhKS0xLGM+Pj49bi5leHRyYSxsLT1uLmV4dHJhLG4uYmFjays9bi5leHRyYX1uLndhcz1uLmxlbmd0aCxuLm1vZGU9VzI7Y2FzZSBXMjpmb3IoO2I9bi5kaXN0Y29kZVtjJigxPDxuLmRpc3RiaXRzKS0xXSx3PWI+Pj4yNCxPPWI+Pj4xNiYyNTUsRT1iJjY1NTM1LCEodzw9bCk7KXtpZihmPT09MClicmVhayB0O2YtLSxjKz1vW2krK108PGwsbCs9OH1pZighKE8mMjQwKSl7Zm9yKFQ9dyxDPU8sTj1FO2I9bi5kaXN0Y29kZVtOKygoYyYoMTw8VCtDKS0xKT4+VCldLHc9Yj4+PjI0LE89Yj4+PjE2JjI1NSxFPWImNjU1MzUsIShUK3c8PWwpOyl7aWYoZj09PTApYnJlYWsgdDtmLS0sYys9b1tpKytdPDxsLGwrPTh9Yz4+Pj1ULGwtPVQsbi5iYWNrKz1UfWlmKGM+Pj49dyxsLT13LG4uYmFjays9dyxPJjY0KXt0Lm1zZz0iaW52YWxpZCBkaXN0YW5jZSBjb2RlIixuLm1vZGU9UG47YnJlYWt9bi5vZmZzZXQ9RSxuLmV4dHJhPU8mMTUsbi5tb2RlPVgyO2Nhc2UgWDI6aWYobi5leHRyYSl7Zm9yKFU9bi5leHRyYTtsPFU7KXtpZihmPT09MClicmVhayB0O2YtLSxjKz1vW2krK108PGwsbCs9OH1uLm9mZnNldCs9YyYoMTw8bi5leHRyYSktMSxjPj4+PW4uZXh0cmEsbC09bi5leHRyYSxuLmJhY2srPW4uZXh0cmF9aWYobi5vZmZzZXQ+bi5kbWF4KXt0Lm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLG4ubW9kZT1QbjticmVha31uLm1vZGU9WTI7Y2FzZSBZMjppZih1PT09MClicmVhayB0O2lmKG09ZC11LG4ub2Zmc2V0Pm0pe2lmKG09bi5vZmZzZXQtbSxtPm4ud2hhdmUmJm4uc2FuZSl7dC5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixuLm1vZGU9UG47YnJlYWt9bT5uLnduZXh0PyhtLT1uLnduZXh0LF89bi53c2l6ZS1tKTpfPW4ud25leHQtbSxtPm4ubGVuZ3RoJiYobT1uLmxlbmd0aCksZz1uLndpbmRvd31lbHNlIGc9cixfPXMtbi5vZmZzZXQsbT1uLmxlbmd0aDttPnUmJihtPXUpLHUtPW0sbi5sZW5ndGgtPW07ZG8gcltzKytdPWdbXysrXTt3aGlsZSgtLW0pO24ubGVuZ3RoPT09MCYmKG4ubW9kZT1ybSk7YnJlYWs7Y2FzZSAkMjppZih1PT09MClicmVhayB0O3JbcysrXT1uLmxlbmd0aCx1LS0sbi5tb2RlPXJtO2JyZWFrO2Nhc2UgSWc6aWYobi53cmFwKXtmb3IoO2w8MzI7KXtpZihmPT09MClicmVhayB0O2YtLSxjfD1vW2krK108PGwsbCs9OH1pZihkLT11LHQudG90YWxfb3V0Kz1kLG4udG90YWwrPWQsbi53cmFwJjQmJmQmJih0LmFkbGVyPW4uY2hlY2s9bi5mbGFncz9naShuLmNoZWNrLHIsZCxzLWQpOkRnKG4uY2hlY2sscixkLHMtZCkpLGQ9dSxuLndyYXAmNCYmKG4uZmxhZ3M/YzpKMihjKSkhPT1uLmNoZWNrKXt0Lm1zZz0iaW5jb3JyZWN0IGRhdGEgY2hlY2siLG4ubW9kZT1QbjticmVha31jPTAsbD0wfW4ubW9kZT1aMjtjYXNlIFoyOmlmKG4ud3JhcCYmbi5mbGFncyl7Zm9yKDtsPDMyOyl7aWYoZj09PTApYnJlYWsgdDtmLS0sYys9b1tpKytdPDxsLGwrPTh9aWYobi53cmFwJjQmJmMhPT0obi50b3RhbCY0Mjk0OTY3Mjk1KSl7dC5tc2c9ImluY29ycmVjdCBsZW5ndGggY2hlY2siLG4ubW9kZT1QbjticmVha31jPTAsbD0wfW4ubW9kZT1RMjtjYXNlIFEyOkQ9YTY7YnJlYWsgdDtjYXNlIFBuOkQ9b1M7YnJlYWsgdDtjYXNlIEJnOnJldHVybiBGZztjYXNlIHJTOmRlZmF1bHQ6cmV0dXJuIE1yfXJldHVybiB0Lm5leHRfb3V0PXMsdC5hdmFpbF9vdXQ9dSx0Lm5leHRfaW49aSx0LmF2YWlsX2luPWYsbi5ob2xkPWMsbi5iaXRzPWwsKG4ud3NpemV8fGQhPT10LmF2YWlsX291dCYmbi5tb2RlPFBuJiYobi5tb2RlPElnfHxlIT09TTIpKSYmZlModCx0Lm91dHB1dCx0Lm5leHRfb3V0LGQtdC5hdmFpbF9vdXQpPyhuLm1vZGU9QmcsRmcpOihwLT10LmF2YWlsX2luLGQtPXQuYXZhaWxfb3V0LHQudG90YWxfaW4rPXAsdC50b3RhbF9vdXQrPWQsbi50b3RhbCs9ZCxuLndyYXAmNCYmZCYmKHQuYWRsZXI9bi5jaGVjaz1uLmZsYWdzP2dpKG4uY2hlY2sscixkLHQubmV4dF9vdXQtZCk6RGcobi5jaGVjayxyLGQsdC5uZXh0X291dC1kKSksdC5kYXRhX3R5cGU9bi5iaXRzKyhuLmxhc3Q/NjQ6MCkrKG4ubW9kZT09PUtpPzEyODowKSsobi5tb2RlPT09b218fG4ubW9kZT09PU5nPzI1NjowKSwocD09PTAmJmQ9PT0wfHxlPT09TTIpJiZEPT09U2MmJihEPXU2KSxEKX0sQTY9dD0+e2lmKENjKHQpKXJldHVybiBNcjtsZXQgZT10LnN0YXRlO3JldHVybiBlLndpbmRvdyYmKGUud2luZG93PW51bGwpLHQuc3RhdGU9bnVsbCxTY30sYjY9KHQsZSk9PntpZihDYyh0KSlyZXR1cm4gTXI7bGV0IG49dC5zdGF0ZTtyZXR1cm4gbi53cmFwJjI/KG4uaGVhZD1lLGUuZG9uZT0hMSxTYyk6TXJ9LHc2PSh0LGUpPT57bGV0IG49ZS5sZW5ndGgsbyxyLGk7cmV0dXJuIENjKHQpfHwobz10LnN0YXRlLG8ud3JhcCE9PTAmJm8ubW9kZSE9PWltKT9NcjpvLm1vZGU9PT1pbSYmKHI9MSxyPURnKHIsZSxuLDApLHIhPT1vLmNoZWNrKT9vUzooaT1mUyh0LGUsbixuKSxpPyhvLm1vZGU9QmcsRmcpOihvLmhhdmVkaWN0PTEsU2MpKX07WXIuZXhwb3J0cy5pbmZsYXRlUmVzZXQ9c1M7WXIuZXhwb3J0cy5pbmZsYXRlUmVzZXQyPWNTO1lyLmV4cG9ydHMuaW5mbGF0ZVJlc2V0S2VlcD1pUztZci5leHBvcnRzLmluZmxhdGVJbml0PV82O1lyLmV4cG9ydHMuaW5mbGF0ZUluaXQyPWFTO1lyLmV4cG9ydHMuaW5mbGF0ZT1nNjtZci5leHBvcnRzLmluZmxhdGVFbmQ9QTY7WXIuZXhwb3J0cy5pbmZsYXRlR2V0SGVhZGVyPWI2O1lyLmV4cG9ydHMuaW5mbGF0ZVNldERpY3Rpb25hcnk9dzY7WXIuZXhwb3J0cy5pbmZsYXRlSW5mbz0icGFrbyBpbmZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSJ9KTt2YXIgbFM9Vm4oKGp1dCxVZyk9PnsidXNlIHN0cmljdCI7dmFyIFQ2PSh0LGUpPT5PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKTtVZy5leHBvcnRzLmFzc2lnbj1mdW5jdGlvbih0KXtsZXQgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7Zm9yKDtlLmxlbmd0aDspe2xldCBuPWUuc2hpZnQoKTtpZihuKXtpZih0eXBlb2YgbiE9Im9iamVjdCIpdGhyb3cgbmV3IFR5cGVFcnJvcihuKyJtdXN0IGJlIG5vbi1vYmplY3QiKTtmb3IobGV0IG8gaW4gbilUNihuLG8pJiYodFtvXT1uW29dKX19cmV0dXJuIHR9O1VnLmV4cG9ydHMuZmxhdHRlbkNodW5rcz10PT57bGV0IGU9MDtmb3IobGV0IG89MCxyPXQubGVuZ3RoO288cjtvKyspZSs9dFtvXS5sZW5ndGg7bGV0IG49bmV3IFVpbnQ4QXJyYXkoZSk7Zm9yKGxldCBvPTAscj0wLGk9dC5sZW5ndGg7bzxpO28rKyl7bGV0IHM9dFtvXTtuLnNldChzLHIpLHIrPXMubGVuZ3RofXJldHVybiBufX0pO3ZhciBkUz1WbigoSHV0LGNtKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgcFM9ITA7dHJ5e1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxuZXcgVWludDhBcnJheSgxKSl9Y2F0Y2h7cFM9ITF9dmFyIHB1PW5ldyBVaW50OEFycmF5KDI1Nik7Zm9yKGxldCB0PTA7dDwyNTY7dCsrKXB1W3RdPXQ+PTI1Mj82OnQ+PTI0OD81OnQ+PTI0MD80OnQ+PTIyND8zOnQ+PTE5Mj8yOjE7cHVbMjU0XT1wdVsyNTRdPTE7Y20uZXhwb3J0cy5zdHJpbmcyYnVmPXQ9PntpZih0eXBlb2YgVGV4dEVuY29kZXI9PSJmdW5jdGlvbiImJlRleHRFbmNvZGVyLnByb3RvdHlwZS5lbmNvZGUpcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0KTtsZXQgZSxuLG8scixpLHM9dC5sZW5ndGgsZj0wO2ZvcihyPTA7cjxzO3IrKyluPXQuY2hhckNvZGVBdChyKSwobiY2NDUxMik9PT01NTI5NiYmcisxPHMmJihvPXQuY2hhckNvZGVBdChyKzEpLChvJjY0NTEyKT09PTU2MzIwJiYobj02NTUzNisobi01NTI5Njw8MTApKyhvLTU2MzIwKSxyKyspKSxmKz1uPDEyOD8xOm48MjA0OD8yOm48NjU1MzY/Mzo0O2ZvcihlPW5ldyBVaW50OEFycmF5KGYpLGk9MCxyPTA7aTxmO3IrKyluPXQuY2hhckNvZGVBdChyKSwobiY2NDUxMik9PT01NTI5NiYmcisxPHMmJihvPXQuY2hhckNvZGVBdChyKzEpLChvJjY0NTEyKT09PTU2MzIwJiYobj02NTUzNisobi01NTI5Njw8MTApKyhvLTU2MzIwKSxyKyspKSxuPDEyOD9lW2krK109bjpuPDIwNDg/KGVbaSsrXT0xOTJ8bj4+PjYsZVtpKytdPTEyOHxuJjYzKTpuPDY1NTM2PyhlW2krK109MjI0fG4+Pj4xMixlW2krK109MTI4fG4+Pj42JjYzLGVbaSsrXT0xMjh8biY2Myk6KGVbaSsrXT0yNDB8bj4+PjE4LGVbaSsrXT0xMjh8bj4+PjEyJjYzLGVbaSsrXT0xMjh8bj4+PjYmNjMsZVtpKytdPTEyOHxuJjYzKTtyZXR1cm4gZX07dmFyIE82PSh0LGUpPT57aWYoZTw2NTUzNCYmdC5zdWJhcnJheSYmcFMpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCx0Lmxlbmd0aD09PWU/dDp0LnN1YmFycmF5KDAsZSkpO2xldCBuPSIiO2ZvcihsZXQgbz0wO288ZTtvKyspbis9U3RyaW5nLmZyb21DaGFyQ29kZSh0W29dKTtyZXR1cm4gbn07Y20uZXhwb3J0cy5idWYyc3RyaW5nPSh0LGUpPT57bGV0IG49ZXx8dC5sZW5ndGg7aWYodHlwZW9mIFRleHREZWNvZGVyPT0iZnVuY3Rpb24iJiZUZXh0RGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlKXJldHVybiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUodC5zdWJhcnJheSgwLGUpKTtsZXQgbyxyLGk9bmV3IEFycmF5KG4qMik7Zm9yKHI9MCxvPTA7bzxuOyl7bGV0IHM9dFtvKytdO2lmKHM8MTI4KXtpW3IrK109cztjb250aW51ZX1sZXQgZj1wdVtzXTtpZihmPjQpe2lbcisrXT02NTUzMyxvKz1mLTE7Y29udGludWV9Zm9yKHMmPWY9PT0yPzMxOmY9PT0zPzE1Ojc7Zj4xJiZvPG47KXM9czw8Nnx0W28rK10mNjMsZi0tO2lmKGY+MSl7aVtyKytdPTY1NTMzO2NvbnRpbnVlfXM8NjU1MzY/aVtyKytdPXM6KHMtPTY1NTM2LGlbcisrXT01NTI5NnxzPj4xMCYxMDIzLGlbcisrXT01NjMyMHxzJjEwMjMpfXJldHVybiBPNihpLHIpfTtjbS5leHBvcnRzLnV0Zjhib3JkZXI9KHQsZSk9PntlPWV8fHQubGVuZ3RoLGU+dC5sZW5ndGgmJihlPXQubGVuZ3RoKTtsZXQgbj1lLTE7Zm9yKDtuPj0wJiYodFtuXSYxOTIpPT09MTI4OyluLS07cmV0dXJuIG48MHx8bj09PTA/ZTpuK3B1W3Rbbl1dPmU/bjplfX0pO3ZhciBoUz1WbigocXV0LG1TKT0+eyJ1c2Ugc3RyaWN0IjttUy5leHBvcnRzPXsyOiJuZWVkIGRpY3Rpb25hcnkiLDE6InN0cmVhbSBlbmQiLDA6IiIsIi0xIjoiZmlsZSBlcnJvciIsIi0yIjoic3RyZWFtIGVycm9yIiwiLTMiOiJkYXRhIGVycm9yIiwiLTQiOiJpbnN1ZmZpY2llbnQgbWVtb3J5IiwiLTUiOiJidWZmZXIgZXJyb3IiLCItNiI6ImluY29tcGF0aWJsZSB2ZXJzaW9uIn19KTt2YXIgeVM9Vm4oKEt1dCxfUyk9PnsidXNlIHN0cmljdCI7ZnVuY3Rpb24gRTYoKXt0aGlzLmlucHV0PW51bGwsdGhpcy5uZXh0X2luPTAsdGhpcy5hdmFpbF9pbj0wLHRoaXMudG90YWxfaW49MCx0aGlzLm91dHB1dD1udWxsLHRoaXMubmV4dF9vdXQ9MCx0aGlzLmF2YWlsX291dD0wLHRoaXMudG90YWxfb3V0PTAsdGhpcy5tc2c9IiIsdGhpcy5zdGF0ZT1udWxsLHRoaXMuZGF0YV90eXBlPTIsdGhpcy5hZGxlcj0wfV9TLmV4cG9ydHM9RTZ9KTt2YXIgQVM9Vm4oKFd1dCxnUyk9PnsidXNlIHN0cmljdCI7ZnVuY3Rpb24gUjYoKXt0aGlzLnRleHQ9MCx0aGlzLnRpbWU9MCx0aGlzLnhmbGFncz0wLHRoaXMub3M9MCx0aGlzLmV4dHJhPW51bGwsdGhpcy5leHRyYV9sZW49MCx0aGlzLm5hbWU9IiIsdGhpcy5jb21tZW50PSIiLHRoaXMuaGNyYz0wLHRoaXMuZG9uZT0hMX1nUy5leHBvcnRzPVI2fSk7dmFyIE9TPVZuKChYdXQsa2EpPT57InVzZSBzdHJpY3QiO3ZhciBXaT11UygpLHdTPWxTKCksR2c9ZFMoKSx6Zz1oUygpLFM2PXlTKCksQzY9QVMoKSxUUz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLHtaX05PX0ZMVVNIOng2LFpfRklOSVNIOlA2LFpfT0s6ZHUsWl9TVFJFQU1fRU5EOlZnLFpfTkVFRF9ESUNUOmtnLFpfU1RSRUFNX0VSUk9SOk02LFpfREFUQV9FUlJPUjpiUyxaX01FTV9FUlJPUjpONn09ZW0oKTtmdW5jdGlvbiBtdSh0KXt0aGlzLm9wdGlvbnM9d1MuYXNzaWduKHtjaHVua1NpemU6MTAyNCo2NCx3aW5kb3dCaXRzOjE1LHRvOiIifSx0fHx7fSk7bGV0IGU9dGhpcy5vcHRpb25zO2UucmF3JiZlLndpbmRvd0JpdHM+PTAmJmUud2luZG93Qml0czwxNiYmKGUud2luZG93Qml0cz0tZS53aW5kb3dCaXRzLGUud2luZG93Qml0cz09PTAmJihlLndpbmRvd0JpdHM9LTE1KSksZS53aW5kb3dCaXRzPj0wJiZlLndpbmRvd0JpdHM8MTYmJiEodCYmdC53aW5kb3dCaXRzKSYmKGUud2luZG93Qml0cys9MzIpLGUud2luZG93Qml0cz4xNSYmZS53aW5kb3dCaXRzPDQ4JiYoZS53aW5kb3dCaXRzJjE1fHwoZS53aW5kb3dCaXRzfD0xNSkpLHRoaXMuZXJyPTAsdGhpcy5tc2c9IiIsdGhpcy5lbmRlZD0hMSx0aGlzLmNodW5rcz1bXSx0aGlzLnN0cm09bmV3IFM2LHRoaXMuc3RybS5hdmFpbF9vdXQ9MDtsZXQgbj1XaS5pbmZsYXRlSW5pdDIodGhpcy5zdHJtLGUud2luZG93Qml0cyk7aWYobiE9PWR1KXRocm93IG5ldyBFcnJvcih6Z1tuXSk7aWYodGhpcy5oZWFkZXI9bmV3IEM2LFdpLmluZmxhdGVHZXRIZWFkZXIodGhpcy5zdHJtLHRoaXMuaGVhZGVyKSxlLmRpY3Rpb25hcnkmJih0eXBlb2YgZS5kaWN0aW9uYXJ5PT0ic3RyaW5nIj9lLmRpY3Rpb25hcnk9R2cuc3RyaW5nMmJ1ZihlLmRpY3Rpb25hcnkpOlRTLmNhbGwoZS5kaWN0aW9uYXJ5KT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSImJihlLmRpY3Rpb25hcnk9bmV3IFVpbnQ4QXJyYXkoZS5kaWN0aW9uYXJ5KSksZS5yYXcmJihuPVdpLmluZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSxlLmRpY3Rpb25hcnkpLG4hPT1kdSkpKXRocm93IG5ldyBFcnJvcih6Z1tuXSl9bXUucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCxlKXtsZXQgbj10aGlzLnN0cm0sbz10aGlzLm9wdGlvbnMuY2h1bmtTaXplLHI9dGhpcy5vcHRpb25zLmRpY3Rpb25hcnksaSxzLGY7aWYodGhpcy5lbmRlZClyZXR1cm4hMTtmb3IoZT09PX5+ZT9zPWU6cz1lPT09ITA/UDY6eDYsVFMuY2FsbCh0KT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSI/bi5pbnB1dD1uZXcgVWludDhBcnJheSh0KTpuLmlucHV0PXQsbi5uZXh0X2luPTAsbi5hdmFpbF9pbj1uLmlucHV0Lmxlbmd0aDs7KXtmb3Iobi5hdmFpbF9vdXQ9PT0wJiYobi5vdXRwdXQ9bmV3IFVpbnQ4QXJyYXkobyksbi5uZXh0X291dD0wLG4uYXZhaWxfb3V0PW8pLGk9V2kuaW5mbGF0ZShuLHMpLGk9PT1rZyYmciYmKGk9V2kuaW5mbGF0ZVNldERpY3Rpb25hcnkobixyKSxpPT09ZHU/aT1XaS5pbmZsYXRlKG4scyk6aT09PWJTJiYoaT1rZykpO24uYXZhaWxfaW4+MCYmaT09PVZnJiZuLnN0YXRlLndyYXA+MCYmdFtuLm5leHRfaW5dIT09MDspV2kuaW5mbGF0ZVJlc2V0KG4pLGk9V2kuaW5mbGF0ZShuLHMpO3N3aXRjaChpKXtjYXNlIE02OmNhc2UgYlM6Y2FzZSBrZzpjYXNlIE42OnJldHVybiB0aGlzLm9uRW5kKGkpLHRoaXMuZW5kZWQ9ITAsITF9aWYoZj1uLmF2YWlsX291dCxuLm5leHRfb3V0JiYobi5hdmFpbF9vdXQ9PT0wfHxpPT09VmcpKWlmKHRoaXMub3B0aW9ucy50bz09PSJzdHJpbmciKXtsZXQgdT1HZy51dGY4Ym9yZGVyKG4ub3V0cHV0LG4ubmV4dF9vdXQpLGM9bi5uZXh0X291dC11LGw9R2cuYnVmMnN0cmluZyhuLm91dHB1dCx1KTtuLm5leHRfb3V0PWMsbi5hdmFpbF9vdXQ9by1jLGMmJm4ub3V0cHV0LnNldChuLm91dHB1dC5zdWJhcnJheSh1LHUrYyksMCksdGhpcy5vbkRhdGEobCl9ZWxzZSB0aGlzLm9uRGF0YShuLm91dHB1dC5sZW5ndGg9PT1uLm5leHRfb3V0P24ub3V0cHV0Om4ub3V0cHV0LnN1YmFycmF5KDAsbi5uZXh0X291dCkpO2lmKCEoaT09PWR1JiZmPT09MCkpe2lmKGk9PT1WZylyZXR1cm4gaT1XaS5pbmZsYXRlRW5kKHRoaXMuc3RybSksdGhpcy5vbkVuZChpKSx0aGlzLmVuZGVkPSEwLCEwO2lmKG4uYXZhaWxfaW49PT0wKWJyZWFrfX1yZXR1cm4hMH07bXUucHJvdG90eXBlLm9uRGF0YT1mdW5jdGlvbih0KXt0aGlzLmNodW5rcy5wdXNoKHQpfTttdS5wcm90b3R5cGUub25FbmQ9ZnVuY3Rpb24odCl7dD09PWR1JiYodGhpcy5vcHRpb25zLnRvPT09InN0cmluZyI/dGhpcy5yZXN1bHQ9dGhpcy5jaHVua3Muam9pbigiIik6dGhpcy5yZXN1bHQ9d1MuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcykpLHRoaXMuY2h1bmtzPVtdLHRoaXMuZXJyPXQsdGhpcy5tc2c9dGhpcy5zdHJtLm1zZ307ZnVuY3Rpb24gamcodCxlKXtsZXQgbj1uZXcgbXUoZSk7aWYobi5wdXNoKHQpLG4uZXJyKXRocm93IG4ubXNnfHx6Z1tuLmVycl07cmV0dXJuIG4ucmVzdWx0fWZ1bmN0aW9uIEk2KHQsZSl7cmV0dXJuIGU9ZXx8e30sZS5yYXc9ITAsamcodCxlKX1rYS5leHBvcnRzLkluZmxhdGU9bXU7a2EuZXhwb3J0cy5pbmZsYXRlPWpnO2thLmV4cG9ydHMuaW5mbGF0ZVJhdz1JNjtrYS5leHBvcnRzLnVuZ3ppcD1qZztrYS5leHBvcnRzLmNvbnN0YW50cz1lbSgpfSk7dmFyIEhnPXt9O2RlKEhnLHtkZWZhdWx0OigpPT5HNn0pO2Z1bmN0aW9uIHY2KHQsZSl7bGV0IG49TXMuZnJvbVN0cmluZyh0LnR5cGUpLG89dC5idWZmZXI7aDIodC5rZXksbyk7bGV0IHI9azYobyk7bz1yLmJ1ZmZlcjtsZXQgaT1yLmxlbmd0aDtzd2l0Y2gobil7Y2FzZSBNcy5NRVRBREFUQTpyZXR1cm4gRDYobyxpLHQucXVhZEtleSk7Y2FzZSBNcy5URVJSQUlOOnJldHVybiBVNihvLGksZSk7Y2FzZSBNcy5EQlJPT1Q6cmV0dXJuIGUucHVzaChvKSx7YnVmZmVyOm99fX1mdW5jdGlvbiBENih0LGUsbil7bGV0IG89bmV3IERhdGFWaWV3KHQpLHI9MCxpPW8uZ2V0VWludDMyKHIsITApO2lmKHIrPXphLGkhPT1MNil0aHJvdyBuZXcgQWUoIkludmFsaWQgbWFnaWMiKTtsZXQgcz1vLmdldFVpbnQzMihyLCEwKTtpZihyKz16YSxzIT09MSl0aHJvdyBuZXcgQWUoIkludmFsaWQgZGF0YSB0eXBlLiBNdXN0IGJlIDEgZm9yIFF1YWRUcmVlUGFja2V0Iik7bGV0IGY9by5nZXRVaW50MzIociwhMCk7aWYocis9emEsZiE9PTIpdGhyb3cgbmV3IEFlKCJJbnZhbGlkIFF1YWRUcmVlUGFja2V0IHZlcnNpb24uIE9ubHkgdmVyc2lvbiAyIGlzIHN1cHBvcnRlZC4iKTtsZXQgdT1vLmdldEludDMyKHIsITApO3IrPXhjO2xldCBjPW8uZ2V0SW50MzIociwhMCk7aWYocis9eGMsYyE9PTMyKXRocm93IG5ldyBBZSgiSW52YWxpZCBpbnN0YW5jZSBzaXplLiIpO2xldCBsPW8uZ2V0SW50MzIociwhMCk7cis9eGM7bGV0IHA9by5nZXRJbnQzMihyLCEwKTtyKz14YztsZXQgZD1vLmdldEludDMyKHIsITApO2lmKHIrPXhjLGwhPT11KmMrcil0aHJvdyBuZXcgQWUoIkludmFsaWQgZGF0YUJ1ZmZlck9mZnNldCIpO2lmKGwrcCtkIT09ZSl0aHJvdyBuZXcgQWUoIkludmFsaWQgcGFja2V0IG9mZnNldHMiKTtsZXQgbT1bXTtmb3IobGV0IEU9MDtFPHU7KytFKXtsZXQgVD1vLmdldFVpbnQ4KHIpOysrciwrK3I7bGV0IEM9by5nZXRVaW50MTYociwhMCk7cis9R2E7bGV0IE49by5nZXRVaW50MTYociwhMCk7cis9R2E7bGV0IEk9by5nZXRVaW50MTYociwhMCk7cis9R2Escis9R2Escis9R2Escis9eGMscis9eGMscis9ODtsZXQgRD1vLmdldFVpbnQ4KHIrKyksdj1vLmdldFVpbnQ4KHIrKyk7cis9R2EsbS5wdXNoKG5ldyBBMihULEMsTixJLEQsdikpfWxldCBfPVtdLGc9MDtmdW5jdGlvbiBiKEUsVCxDKXtsZXQgTj0hMTtpZihDPT09NCl7aWYoVC5oYXNTdWJ0cmVlKCkpcmV0dXJuO049ITB9Zm9yKGxldCBJPTA7STw0OysrSSl7bGV0IEQ9RStJLnRvU3RyaW5nKCk7aWYoTilfW0RdPW51bGw7ZWxzZSBpZihDPDQpaWYoIVQuaGFzQ2hpbGQoSSkpX1tEXT1udWxsO2Vsc2V7aWYoZz09PXUpe2NvbnNvbGUubG9nKCJJbmNvcnJlY3QgbnVtYmVyIG9mIGluc3RhbmNlcyIpO3JldHVybn1sZXQgdj1tW2crK107X1tEXT12LGIoRCx2LEMrMSl9fX1sZXQgdz0wLE89bVtnKytdO3JldHVybiBuPT09IiI/Kyt3Ol9bbl09TyxiKG4sTyx3KSxffWZ1bmN0aW9uIFU2KHQsZSxuKXtsZXQgbz1uZXcgRGF0YVZpZXcodCkscj1mdW5jdGlvbihmKXtmb3IobGV0IHU9MDt1PEI2OysrdSl7bGV0IGM9by5nZXRVaW50MzIoZiwhMCk7aWYoZis9emEsZis9YyxmPmUpdGhyb3cgbmV3IEFlKCJNYWxmb3JtZWQgdGVycmFpbiBwYWNrZXQgZm91bmQuIil9cmV0dXJuIGZ9LGk9MCxzPVtdO2Zvcig7cy5sZW5ndGg8RjY7KXtsZXQgZj1pO2k9cihpKTtsZXQgdT10LnNsaWNlKGYsaSk7bi5wdXNoKHUpLHMucHVzaCh1KX1yZXR1cm4gc31mdW5jdGlvbiBrNih0KXtsZXQgZT1uZXcgRGF0YVZpZXcodCksbj0wLG89ZS5nZXRVaW50MzIobiwhMCk7aWYobis9emEsbyE9PUVTJiZvIT09VjYpdGhyb3cgbmV3IEFlKCJJbnZhbGlkIG1hZ2ljIik7bGV0IHI9ZS5nZXRVaW50MzIobixvPT09RVMpO24rPXphO2xldCBpPW5ldyBVaW50OEFycmF5KHQsbikscz1SUy5kZWZhdWx0LmluZmxhdGUoaSk7aWYocy5sZW5ndGghPT1yKXRocm93IG5ldyBBZSgiU2l6ZSBvZiBwYWNrZXQgZG9lc24ndCBtYXRjaCBoZWFkZXIiKTtyZXR1cm4gc312YXIgUlMsR2EseGMsemEsTXMsTDYsRjYsQjYsRVMsVjYsRzYscWc9WigoKT0+e18yKCk7YjIoKTtKcigpO1JTPXJyKE9TKCksMSk7c28oKTtHYT1VaW50MTZBcnJheS5CWVRFU19QRVJfRUxFTUVOVCx4Yz1JbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULHphPVVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULE1zPXtNRVRBREFUQTowLFRFUlJBSU46MSxEQlJPT1Q6Mn07TXMuZnJvbVN0cmluZz1mdW5jdGlvbih0KXtpZih0PT09Ik1ldGFkYXRhIilyZXR1cm4gTXMuTUVUQURBVEE7aWYodD09PSJUZXJyYWluIilyZXR1cm4gTXMuVEVSUkFJTjtpZih0PT09IkRiUm9vdCIpcmV0dXJuIE1zLkRCUk9PVH07TDY9MzIzMDE7RjY9NSxCNj00O0VTPTE5NTMwMjk4MDUsVjY9MjkxNzAzNDEwMDtHNj1RZSh2Nil9KTtmdW5jdGlvbiB6Nih0KXtyZXR1cm4geS5kZWZpbmVkKCJ2YWx1ZSIsdCksdDw9LjA0MDQ1P3QqLjA3NzM5OTM4MDgwNDk1MzU3Ok1hdGgucG93KCh0Ky4wNTUpKi45NDc4NjcyOTg1NzgxOTkxLDIuNCl9dmFyIGFtLFNTPVooKCk9PntYdCgpO2FtPXo2fSk7dmFyIFlnPXt9O2RlKFlnLHtkZWZhdWx0OigpPT5tOH0pO2Z1bmN0aW9uIGo2KHQsZSxuLG8scixpKXtsZXQgcz1uKigxLXQpK28qdCxmPXIqKDEtdCkraSp0O3JldHVybiBzKigxLWUpK2YqZX1mdW5jdGlvbiBmbSh0LGUsbixvKXtsZXQgcj10K2UqbjtyZXR1cm4gb1tyXX1mdW5jdGlvbiBINih0LGUsbil7bGV0IG89bi5uYXRpdmVFeHRlbnQscj0odC1vLndlc3QpLyhvLmVhc3Qtby53ZXN0KSoobi53aWR0aC0xKSxpPShlLW8uc291dGgpLyhvLm5vcnRoLW8uc291dGgpKihuLmhlaWdodC0xKSxzPU1hdGguZmxvb3IociksZj1NYXRoLmZsb29yKGkpO3ItPXMsaS09ZjtsZXQgdT1zPG4ud2lkdGg/cysxOnMsYz1mPG4uaGVpZ2h0P2YrMTpmO2Y9bi5oZWlnaHQtMS1mLGM9bi5oZWlnaHQtMS1jO2xldCBsPWZtKHMsZixuLndpZHRoLG4uYnVmZmVyKSxwPWZtKHUsZixuLndpZHRoLG4uYnVmZmVyKSxkPWZtKHMsYyxuLndpZHRoLG4uYnVmZmVyKSxtPWZtKHUsYyxuLndpZHRoLG4uYnVmZmVyKSxfPWo2KHIsaSxsLHAsZCxtKTtyZXR1cm4gXz1fKm4uc2NhbGUrbi5vZmZzZXQsX31mdW5jdGlvbiBDUyh0LGUsbil7Zm9yKGxldCBvPTA7bzxuLmxlbmd0aDtvKyspe2xldCByPW5bb10ubmF0aXZlRXh0ZW50LGk9bmV3IGE7aWYobltvXS5wcm9qZWN0aW9uVHlwZT09PSJXZWJNZXJjYXRvciIpe2xldCBzPW5bb10ucHJvamVjdGlvbi5fZWxsaXBzb2lkLl9yYWRpaTtpPW5ldyBlbyhuZXcgJChzLngscy55LHMueikpLnByb2plY3QobmV3IGF0KHQsZSwwKSl9ZWxzZSBpLng9dCxpLnk9ZTtpZihpLng+ci53ZXN0JiZpLng8ci5lYXN0JiZpLnk+ci5zb3V0aCYmaS55PHIubm9ydGgpcmV0dXJuIEg2KGkueCxpLnksbltvXSl9cmV0dXJuIDB9ZnVuY3Rpb24gcTYodCxlLG4sbyxyLGkscyl7aWYocylyZXR1cm47bGV0IGY9Q1Moci5sb25naXR1ZGUsci5sYXRpdHVkZSxpKTtmb3IobGV0IHU9MDt1PHQ7Kyt1KXtsZXQgYz1DUyhyLmxvbmdpdHVkZStNLnRvUmFkaWFucyhuKmVbdSozXSksci5sYXRpdHVkZStNLnRvUmFkaWFucyhvKmVbdSozKzFdKSxpKTtlW3UqMysyXSs9Yy1mfX1mdW5jdGlvbiBLNih0LGUsbixvLHIsaSxzLGYsdSl7aWYodD09PTB8fCFoKGUpfHxlLmxlbmd0aD09PTApcmV0dXJuO2xldCBjPW5ldyAkKE1hdGguc3FydChzLngpLE1hdGguc3FydChzLnkpLE1hdGguc3FydChzLnopKTtmb3IobGV0IGw9MDtsPHQ7KytsKXtsZXQgcD1sKjMsZD1wKzEsbT1wKzIsXz1uZXcgYXQ7Xy5sb25naXR1ZGU9by5sb25naXR1ZGUrTS50b1JhZGlhbnMoZiplW3BdKSxfLmxhdGl0dWRlPW8ubGF0aXR1ZGUrTS50b1JhZGlhbnModSplW2RdKSxfLmhlaWdodD1vLmhlaWdodCtlW21dO2xldCBnPXt9O2MuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oXyxnKSxnLngtPXIueCxnLnktPXIueSxnLnotPXIuejtsZXQgYj17fTtpZihKLm11bHRpcGx5QnlWZWN0b3IoaSxnLGIpLGVbcF09Yi54LGVbZF09Yi55LGVbbV09Yi56LGgobikpe2xldCB3PW5ldyBhKG5bcF0sbltkXSxuW21dKSxPPXt9O0oubXVsdGlwbHlCeVZlY3RvcihpLHcsTyksbltwXT1PLngsbltkXT1PLnksblttXT1PLnp9fX1mdW5jdGlvbiBXNih0LGUsbil7Zm9yKGxldCBvPTA7bzx0Oysrbyl7bGV0IHI9bltvKjRdLzY1NTM1LGk9bltvKjQrMV0vNjU1MzUscz0obltvKjQrMl0tbltvKjRdKS82NTUzNSxmPShuW28qNCszXS1uW28qNCsxXSkvNjU1MzU7ZVtvKjJdKj1zLGVbbyoyXSs9cixlW28qMisxXSo9ZixlW28qMisxXSs9aX19ZnVuY3Rpb24gWDYodCxlLG4sbyl7bGV0IHI9bmV3IFVpbnQzMkFycmF5KHQpLGk9aChlKT9mPT5lW2ZdOmY9PmYscz0wO2lmKG8mJmgobikpe2xldCBmPXU9Pm5baSh1KSo0KzNdPDI1NTtmb3IobGV0IHU9MDt1PHQ7dSs9MykhZih1KSYmIWYodSsxKSYmIWYodSsyKSYmKHJbcysrXT1pKHUpLHJbcysrXT1pKHUrMSkscltzKytdPWkodSsyKSk7aWYocz4wKXtsZXQgdT1zO2ZvcihsZXQgYz0wO2M8dDtjKz0zKShmKGMpfHxmKGMrMSl8fGYoYysyKSkmJihyW3UrK109aShjKSxyW3UrK109aShjKzEpLHJbdSsrXT1pKGMrMikpfWVsc2UgZm9yKGxldCB1PTA7dTx0OysrdSlyW3VdPWkodSl9ZWxzZXtzPXQ7Zm9yKGxldCBmPTA7Zjx0OysrZilyW2ZdPWkoZil9cmV0dXJue2luZGV4QXJyYXk6cix0cmFuc3BhcmVudFZlcnRleE9mZnNldDpzfX1mdW5jdGlvbiBZNih0LGUsbil7bGV0IG89ZVtuXTtpZihoKG8pKXJldHVybiBvO2xldCByPWVbbl09e3Bvc2l0aW9uczp7fSxpbmRpY2VzOnt9LGVkZ2VzOnt9fSxpPXgodFtuXSx0LmRlZmF1bHQpO3JldHVybiByLmhhc091dGxpbmU9aChpPy5lZGdlcykscn1mdW5jdGlvbiAkNih0LGUsbixvKXtpZighaCh0W25dKSl7bGV0IHI9biozLGk9ZTtmb3IobGV0IHM9MDtzPDM7cysrKXtsZXQgZj1vW3Irc107aChpW2ZdKXx8KGlbZl09e30pLGk9aVtmXX1oKGkuaW5kZXgpfHwoaS5pbmRleD1uKSx0W25dPWkuaW5kZXh9fWZ1bmN0aW9uIFo2KHQsZSxuLG8scixpKXtsZXQgcyxmO288cj8ocz1vLGY9cik6KHM9cixmPW8pO2xldCB1PXRbc107aCh1KXx8KHU9dFtzXT17fSk7bGV0IGM9dVtmXTtoKGMpfHwoYz11W2ZdPXtub3JtYWxzSW5kZXg6W10sb3V0bGluZXM6W119KSxjLm5vcm1hbHNJbmRleC5wdXNoKGkpLChjLm91dGxpbmVzLmxlbmd0aD09PTB8fGUhPT1vfHxuIT09cikmJmMub3V0bGluZXMucHVzaChlLG4pfWZ1bmN0aW9uIFE2KHQsZSxuLG8pe2xldCByPVtdO2ZvcihsZXQgaT0wO2k8bi5sZW5ndGg7aSs9Myl7bGV0IHM9aChlKT9lW25baV1dOiJkZWZhdWx0IixmPVk2KHQscixzKTtpZighZi5oYXNPdXRsaW5lKWNvbnRpbnVlO2xldCB1PWYuaW5kaWNlcyxjPWYucG9zaXRpb25zO2ZvcihsZXQgcD0wO3A8MztwKyspe2xldCBkPW5baStwXTskNih1LGMsZCxvKX1sZXQgbD1mLmVkZ2VzO2ZvcihsZXQgcD0wO3A8MztwKyspe2xldCBkPW5baStwXSxtPW5baSsocCsxKSUzXSxfPXVbZF0sZz11W21dO1o2KGwsZCxtLF8sZyxpKX19cmV0dXJuIHJ9ZnVuY3Rpb24geFModCxlLG4sbyl7bGV0IHI9bltlXSozLGk9bltlKzFdKjMscz1uW2UrMl0qMzthLmZyb21BcnJheShvLHIsQWkpLGEuZnJvbUFycmF5KG8saSx1bSksYS5mcm9tQXJyYXkobyxzLGxtKSxhLnN1YnRyYWN0KHVtLEFpLHVtKSxhLnN1YnRyYWN0KGxtLEFpLGxtKSxhLmNyb3NzKHVtLGxtLEFpKTtsZXQgZj1hLm1hZ25pdHVkZShBaSk7ZiE9PTAmJmEuZGl2aWRlQnlTY2FsYXIoQWksZixBaSk7bGV0IHU9ZSozLGM9KGUrMSkqMyxsPShlKzIpKjM7YS5wYWNrKEFpLHQsdSksYS5wYWNrKEFpLHQsYyksYS5wYWNrKEFpLHQsbCl9ZnVuY3Rpb24gSjYodCxlLG4pe2EuZnJvbUFycmF5KHQsZSxwbSksYS5mcm9tQXJyYXkodCxuLEtnKTtsZXQgbz1hLmRvdChwbSxLZykscj1hLm1hZ25pdHVkZShhLmNyb3NzKHBtLEtnLHBtKSk7cmV0dXJuIE1hdGguYXRhbjIocixvKTwuMjV9ZnVuY3Rpb24gdDgodCxlLG4sbyxyKXtpZihlLm5vcm1hbHNJbmRleC5sZW5ndGg+MSl7bGV0IGk9by5sZW5ndGg9PT1yLmxlbmd0aDtmb3IobGV0IHM9MDtzPGUubm9ybWFsc0luZGV4Lmxlbmd0aDtzKyspe2xldCBmPWUubm9ybWFsc0luZGV4W3NdO2lmKGgocltmKjNdKXx8eFMocixmLG4sbykscyE9PTApZm9yKGxldCB1PTA7dTxzO3UrKyl7bGV0IGM9ZS5ub3JtYWxzSW5kZXhbdV0sbD1pP25bZl0qMzpmKjMscD1pP25bY10qMzpjKjM7aWYoSjYocixsLHApKXJldHVybn19fXQucHVzaCguLi5lLm91dGxpbmVzKX1mdW5jdGlvbiBlOCh0LGUsbixvLHIpe2xldCBpPU9iamVjdC5rZXlzKGUpO2ZvcihsZXQgcz0wO3M8aS5sZW5ndGg7cysrKXtsZXQgZj1lW2lbc11dLHU9T2JqZWN0LmtleXMoZik7Zm9yKGxldCBjPTA7Yzx1Lmxlbmd0aDtjKyspe2xldCBsPWZbdVtjXV07dDgodCxsLG4sbyxyKX19fWZ1bmN0aW9uIG44KHQsZSxuLG8pe2xldCByPVtdLGk9T2JqZWN0LmtleXModCk7Zm9yKGxldCBzPTA7czxpLmxlbmd0aDtzKyspe2xldCBmPXRbaVtzXV0uZWRnZXM7ZTgocixmLGUsbixvKX1yZXR1cm4gcn1mdW5jdGlvbiBvOCh0LGUsbixvLHIpe2lmKCFoKHQpfHxPYmplY3Qua2V5cyh0KS5sZW5ndGg9PT0wKXJldHVybjtsZXQgaT1RNih0LGUsbixvKTsoIWgocil8fG4ubGVuZ3RoKjMhPT1yLmxlbmd0aCkmJihyPVtdKTtsZXQgcz1uOChpLG4sbyxyKTtyZXR1cm4gcy5sZW5ndGg+MD9uZXcgVWludDMyQXJyYXkocyk6dm9pZCAwfWZ1bmN0aW9uIHI4KHQpe2xldCBlPW5ldyBGbG9hdDMyQXJyYXkodC5sZW5ndGgpO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bis9NCllW25dPWFtKG9lLmJ5dGVUb0Zsb2F0KHRbbl0pKSxlW24rMV09YW0ob2UuYnl0ZVRvRmxvYXQodFtuKzFdKSksZVtuKzJdPWFtKG9lLmJ5dGVUb0Zsb2F0KHRbbisyXSkpLGVbbiszXT1vZS5ieXRlVG9GbG9hdCh0W24rM10pO3JldHVybiBlfWZ1bmN0aW9uIGk4KHQsZSxuLG8scixpLHMpe2xldCBmPXtub3JtYWxzOnZvaWQgMCxwb3NpdGlvbnM6dm9pZCAwLHV2MHM6dm9pZCAwLGNvbG9yczp2b2lkIDAsZmVhdHVyZUluZGV4OnZvaWQgMCx2ZXJ0ZXhDb3VudDp2b2lkIDB9O2lmKHQ9PT0wfHwhaChuKXx8bi5sZW5ndGg9PT0wfHxoKG8pKXJldHVybiBmO2lmKGgoZSkpe2YudmVydGV4Q291bnQ9ZS5sZW5ndGgsZi5wb3NpdGlvbnM9bmV3IEZsb2F0MzJBcnJheShlLmxlbmd0aCozKSxmLnV2MHM9aChyKT9uZXcgRmxvYXQzMkFycmF5KGUubGVuZ3RoKjIpOnZvaWQgMCxmLmNvbG9ycz1oKGkpP25ldyBVaW50OEFycmF5KGUubGVuZ3RoKjQpOnZvaWQgMCxmLmZlYXR1cmVJbmRleD1oKHMpP25ldyBBcnJheShlLmxlbmd0aCk6dm9pZCAwO2ZvcihsZXQgdT0wO3U8ZS5sZW5ndGg7dSsrKXtsZXQgYz1lW3VdO2YucG9zaXRpb25zW3UqM109bltjKjNdLGYucG9zaXRpb25zW3UqMysxXT1uW2MqMysxXSxmLnBvc2l0aW9uc1t1KjMrMl09bltjKjMrMl0saChmLnV2MHMpJiYoZi51djBzW3UqMl09cltjKjJdLGYudXYwc1t1KjIrMV09cltjKjIrMV0pLGgoZi5jb2xvcnMpJiYoZi5jb2xvcnNbdSo0XT1pW2MqNF0sZi5jb2xvcnNbdSo0KzFdPWlbYyo0KzFdLGYuY29sb3JzW3UqNCsyXT1pW2MqNCsyXSxmLmNvbG9yc1t1KjQrM109aVtjKjQrM10pLGgoZi5mZWF0dXJlSW5kZXgpJiYoZi5mZWF0dXJlSW5kZXhbdV09c1tjXSl9dD1lLmxlbmd0aCxuPWYucG9zaXRpb25zfWU9bmV3IEFycmF5KHQpO2ZvcihsZXQgdT0wO3U8dDt1KyspZVt1XT11O2Yubm9ybWFscz1uZXcgRmxvYXQzMkFycmF5KGUubGVuZ3RoKjMpO2ZvcihsZXQgdT0wO3U8ZS5sZW5ndGg7dSs9Myl4UyhmLm5vcm1hbHMsdSxlLG4pO3JldHVybiBmfWZ1bmN0aW9uIHM4KHQsZSxuLG8scixpLHMsZil7aWYodD09PTB8fCFoKG4pfHxuLmxlbmd0aD09PTApcmV0dXJue2J1ZmZlcnM6W10sYnVmZmVyVmlld3M6W10sYWNjZXNzb3JzOltdLG1lc2hlczpbXSxub2RlczpbXSxub2Rlc0luU2NlbmU6W119O2xldCB1PVtdLGM9W10sbD1bXSxwPVtdLGQ9W10sbT1bXSxfPXt9LGc9W107aChlKSYmKHQ9ZS5sZW5ndGgpO2xldHtpbmRleEFycmF5OmIsdHJhbnNwYXJlbnRWZXJ0ZXhPZmZzZXQ6d309WDYodCxlLGksZi5zcGxpdEdlb21ldHJ5QnlDb2xvclRyYW5zcGFyZW5jeSksTz1uZXcgQmxvYihbYl0se3R5cGU6ImFwcGxpY2F0aW9uL2JpbmFyeSJ9KSxFPVVSTC5jcmVhdGVPYmplY3RVUkwoTyksVD10LEM9Zi5lbmFibGVGZWF0dXJlcyYmaChzKT9uZXcgRmxvYXQzMkFycmF5KHMubGVuZ3RoKTp2b2lkIDAsTj0wO2lmKGgoQykpZm9yKGxldCB1dD0wO3V0PHMubGVuZ3RoOysrdXQpe0NbdXRdPXNbdXRdO2xldCB2dD1zW3V0XSsxO048dnQmJihOPXZ0KX1sZXQgSSxEPW84KGYuc3ltYm9sb2d5RGF0YSxzLGIsbixvKTtpZihoKEQpKXtsZXQgdXQ9bmV3IEJsb2IoW0RdLHt0eXBlOiJhcHBsaWNhdGlvbi9iaW5hcnkifSk7ST1VUkwuY3JlYXRlT2JqZWN0VVJMKHV0KX1sZXQgdj1uLnN1YmFycmF5KDAsVCozKSxMPW5ldyBCbG9iKFt2XSx7dHlwZToiYXBwbGljYXRpb24vYmluYXJ5In0pLFU9VVJMLmNyZWF0ZU9iamVjdFVSTChMKSxBPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxTPU51bWJlci5ORUdBVElWRV9JTkZJTklUWSxQPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxCPU51bWJlci5ORUdBVElWRV9JTkZJTklUWSxqPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxIPU51bWJlci5ORUdBVElWRV9JTkZJTklUWTtmb3IobGV0IHV0PTA7dXQ8di5sZW5ndGgvMzt1dCsrKUE9TWF0aC5taW4oQSx2W3V0KjMrMF0pLFM9TWF0aC5tYXgoUyx2W3V0KjMrMF0pLFA9TWF0aC5taW4oUCx2W3V0KjMrMV0pLEI9TWF0aC5tYXgoQix2W3V0KjMrMV0pLGo9TWF0aC5taW4oaix2W3V0KjMrMl0pLEg9TWF0aC5tYXgoSCx2W3V0KjMrMl0pO2xldCBrPW8/by5zdWJhcnJheSgwLFQqMyk6dm9pZCAwLEs7aWYoaChrKSl7bGV0IHV0PW5ldyBCbG9iKFtrXSx7dHlwZToiYXBwbGljYXRpb24vYmluYXJ5In0pO0s9VVJMLmNyZWF0ZU9iamVjdFVSTCh1dCl9bGV0IFg9cj9yLnN1YmFycmF5KDAsVCoyKTp2b2lkIDAsUjtpZihoKFgpKXtsZXQgdXQ9bmV3IEJsb2IoW1hdLHt0eXBlOiJhcHBsaWNhdGlvbi9iaW5hcnkifSk7Uj1VUkwuY3JlYXRlT2JqZWN0VVJMKHV0KX1sZXQgb3Q9aChpKT9yOChpLnN1YmFycmF5KDAsVCo0KSk6dm9pZCAwLGN0O2lmKGgob3QpKXtsZXQgdXQ9bmV3IEJsb2IoW290XSx7dHlwZToiYXBwbGljYXRpb24vYmluYXJ5In0pO2N0PVVSTC5jcmVhdGVPYmplY3RVUkwodXQpfWxldCBwdD1oKEMpP0Muc3ViYXJyYXkoMCxUKTp2b2lkIDAseXQ7aWYoaChwdCkpe2xldCB1dD1uZXcgQmxvYihbcHRdLHt0eXBlOiJhcHBsaWNhdGlvbi9iaW5hcnkifSk7eXQ9VVJMLmNyZWF0ZU9iamVjdFVSTCh1dCl9bGV0IHJ0PWgoQyk/bmV3IEZsb2F0MzJBcnJheShOKTp2b2lkIDAsUHQ7aWYoaChydCkpe2ZvcihsZXQgdnQ9MDt2dDxydC5sZW5ndGg7Kyt2dClydFt2dF09dnQ7bGV0IHV0PW5ldyBCbG9iKFtydF0se3R5cGU6ImFwcGxpY2F0aW9uL2JpbmFyeSJ9KTtQdD1VUkwuY3JlYXRlT2JqZWN0VVJMKHV0KX1sZXQgZ3Q9e30sQ3Q9e307Z3QuUE9TSVRJT049bC5sZW5ndGgsdS5wdXNoKHt1cmk6VSxieXRlTGVuZ3RoOnYuYnl0ZUxlbmd0aH0pLGMucHVzaCh7YnVmZmVyOnUubGVuZ3RoLTEsYnl0ZU9mZnNldDowLGJ5dGVMZW5ndGg6di5ieXRlTGVuZ3RoLHRhcmdldDozNDk2Mn0pLGwucHVzaCh7YnVmZmVyVmlldzpjLmxlbmd0aC0xLGJ5dGVPZmZzZXQ6MCxjb21wb25lbnRUeXBlOjUxMjYsY291bnQ6di5sZW5ndGgvMyx0eXBlOiJWRUMzIixtYXg6W0EsUCxqXSxtaW46W1MsQixIXX0pLGgoSykmJihndC5OT1JNQUw9bC5sZW5ndGgsdS5wdXNoKHt1cmk6SyxieXRlTGVuZ3RoOmsuYnl0ZUxlbmd0aH0pLGMucHVzaCh7YnVmZmVyOnUubGVuZ3RoLTEsYnl0ZU9mZnNldDowLGJ5dGVMZW5ndGg6ay5ieXRlTGVuZ3RoLHRhcmdldDozNDk2Mn0pLGwucHVzaCh7YnVmZmVyVmlldzpjLmxlbmd0aC0xLGJ5dGVPZmZzZXQ6MCxjb21wb25lbnRUeXBlOjUxMjYsY291bnQ6ay5sZW5ndGgvMyx0eXBlOiJWRUMzIn0pKSxoKFIpJiYoZ3QuVEVYQ09PUkRfMD1sLmxlbmd0aCx1LnB1c2goe3VyaTpSLGJ5dGVMZW5ndGg6WC5ieXRlTGVuZ3RofSksYy5wdXNoKHtidWZmZXI6dS5sZW5ndGgtMSxieXRlT2Zmc2V0OjAsYnl0ZUxlbmd0aDpYLmJ5dGVMZW5ndGgsdGFyZ2V0OjM0OTYyfSksbC5wdXNoKHtidWZmZXJWaWV3OmMubGVuZ3RoLTEsYnl0ZU9mZnNldDowLGNvbXBvbmVudFR5cGU6NTEyNixjb3VudDpYLmxlbmd0aC8yLHR5cGU6IlZFQzIifSkpLGgoY3QpJiYoZ3QuQ09MT1JfMD1sLmxlbmd0aCx1LnB1c2goe3VyaTpjdCxieXRlTGVuZ3RoOm90LmJ5dGVMZW5ndGh9KSxjLnB1c2goe2J1ZmZlcjp1Lmxlbmd0aC0xLGJ5dGVPZmZzZXQ6MCxieXRlTGVuZ3RoOm90LmJ5dGVMZW5ndGgsdGFyZ2V0OjM0OTYyfSksbC5wdXNoKHtidWZmZXJWaWV3OmMubGVuZ3RoLTEsYnl0ZU9mZnNldDowLGNvbXBvbmVudFR5cGU6NTEyNixjb3VudDpvdC5sZW5ndGgvNCx0eXBlOiJWRUM0In0pKSxoKHl0KSYmKGd0Ll9GRUFUVVJFX0lEXzA9bC5sZW5ndGgsdS5wdXNoKHt1cmk6eXQsYnl0ZUxlbmd0aDpwdC5ieXRlTGVuZ3RofSksYy5wdXNoKHtidWZmZXI6dS5sZW5ndGgtMSxieXRlT2Zmc2V0OjAsYnl0ZUxlbmd0aDpwdC5ieXRlTGVuZ3RoLHRhcmdldDozNDk2M30pLGwucHVzaCh7YnVmZmVyVmlldzpjLmxlbmd0aC0xLGJ5dGVPZmZzZXQ6MCxjb21wb25lbnRUeXBlOjUxMjYsY291bnQ6cHQubGVuZ3RoLHR5cGU6IlNDQUxBUiJ9KSxDdC5FWFRfbWVzaF9mZWF0dXJlcz17ZmVhdHVyZUlkczpbe2F0dHJpYnV0ZTowLHByb3BlcnR5VGFibGU6MCxmZWF0dXJlQ291bnQ6Tn1dfSxnLnB1c2goIkVYVF9tZXNoX2ZlYXR1cmVzIikpLGgoUHQpJiYodS5wdXNoKHt1cmk6UHQsYnl0ZUxlbmd0aDpydC5ieXRlTGVuZ3RofSksYy5wdXNoKHtidWZmZXI6dS5sZW5ndGgtMSxieXRlT2Zmc2V0OjAsYnl0ZUxlbmd0aDpydC5ieXRlTGVuZ3RoLHRhcmdldDozNDk2M30pLF8uRVhUX3N0cnVjdHVyYWxfbWV0YWRhdGE9e3NjaGVtYTp7aWQ6Imkzcy1tZXRhZGF0YS1zY2hlbWEtMDAxIixuYW1lOiJJM1MgbWV0YWRhdGEgc2NoZW1hIDAwMSIsZGVzY3JpcHRpb246IlRoZSBzY2hlbWEgZm9yIEkzUyBtZXRhZGF0YSIsdmVyc2lvbjoiMS4wIixjbGFzc2VzOntmZWF0dXJlOntuYW1lOiJmZWF0dXJlIixkZXNjcmlwdGlvbjoiRmVhdHVyZSBtZXRhZGF0YSIscHJvcGVydGllczp7aW5kZXg6e2Rlc2NyaXB0aW9uOiJUaGUgZmVhdHVyZSBpbmRleCIsdHlwZToiU0NBTEFSIixjb21wb25lbnRUeXBlOiJGTE9BVDMyIixyZXF1aXJlZDohMH19fX19LHByb3BlcnR5VGFibGVzOlt7bmFtZToiZmVhdHVyZS1pbmRpY2VzLW1hcHBpbmciLGNsYXNzOiJmZWF0dXJlIixjb3VudDpOLHByb3BlcnRpZXM6e2luZGV4Ont2YWx1ZXM6Yy5sZW5ndGgtMX19fV19LGcucHVzaCgiRVhUX3N0cnVjdHVyYWxfbWV0YWRhdGEiKSksaChJKSYmKHUucHVzaCh7dXJpOkksYnl0ZUxlbmd0aDpELmJ5dGVMZW5ndGh9KSxjLnB1c2goe2J1ZmZlcjp1Lmxlbmd0aC0xLGJ5dGVPZmZzZXQ6MCxieXRlTGVuZ3RoOkQuYnl0ZUxlbmd0aCx0YXJnZXQ6MzQ5NjN9KSxsLnB1c2goe2J1ZmZlclZpZXc6Yy5sZW5ndGgtMSxieXRlT2Zmc2V0OjAsY29tcG9uZW50VHlwZTo1MTI1LGNvdW50OkQubGVuZ3RoLHR5cGU6IlNDQUxBUiJ9KSxDdC5DRVNJVU1fcHJpbWl0aXZlX291dGxpbmU9e2luZGljZXM6bC5sZW5ndGgtMX0sZy5wdXNoKCJDRVNJVU1fcHJpbWl0aXZlX291dGxpbmUiKSksdS5wdXNoKHt1cmk6RSxieXRlTGVuZ3RoOmIuYnl0ZUxlbmd0aH0pLGMucHVzaCh7YnVmZmVyOnUubGVuZ3RoLTEsYnl0ZU9mZnNldDowLGJ5dGVMZW5ndGg6Yi5ieXRlTGVuZ3RoLHRhcmdldDozNDk2M30pO2xldCBtdD1bXTtyZXR1cm4gdz4wJiYobC5wdXNoKHtidWZmZXJWaWV3OmMubGVuZ3RoLTEsYnl0ZU9mZnNldDowLGNvbXBvbmVudFR5cGU6NTEyNSxjb3VudDp3LHR5cGU6IlNDQUxBUiJ9KSxtdC5wdXNoKHthdHRyaWJ1dGVzOmd0LGluZGljZXM6bC5sZW5ndGgtMSxtYXRlcmlhbDptdC5sZW5ndGgsZXh0ZW5zaW9uczpDdH0pKSx3PHQmJihsLnB1c2goe2J1ZmZlclZpZXc6Yy5sZW5ndGgtMSxieXRlT2Zmc2V0OjQqdyxjb21wb25lbnRUeXBlOjUxMjUsY291bnQ6dC13LHR5cGU6IlNDQUxBUiJ9KSxtdC5wdXNoKHthdHRyaWJ1dGVzOmd0LGluZGljZXM6bC5sZW5ndGgtMSxtYXRlcmlhbDptdC5sZW5ndGgsZXh0ZW5zaW9uczpDdCxleHRyYTp7aXNUcmFuc3BhcmVudDohMH19KSkscC5wdXNoKHtwcmltaXRpdmVzOm10fSksbS5wdXNoKDApLGQucHVzaCh7bWVzaDowfSkse2J1ZmZlcnM6dSxidWZmZXJWaWV3czpjLGFjY2Vzc29yczpsLG1lc2hlczpwLG5vZGVzOmQsbm9kZXNJblNjZW5lOm0scm9vdEV4dGVuc2lvbnM6XyxleHRlbnNpb25zVXNlZDpnfX1mdW5jdGlvbiBjOCh0LGUsbixvKXtsZXQgcj1uZXcgVWludDhBcnJheSh0LDAsNSk7cmV0dXJuIHJbMF09PT02OCYmclsxXT09PTgyJiZyWzJdPT09NjUmJnJbM109PT02NyYmcls0XT09PTc5P2E4KHQsbik6dTgodCxlLG4sbyl9ZnVuY3Rpb24gYTgodCl7bGV0IGU9WGcsbj1uZXcgZS5EZWNvZGVyQnVmZmVyLG89bmV3IFVpbnQ4QXJyYXkodCk7bi5Jbml0KG8sby5sZW5ndGgpO2xldCByPW5ldyBlLkRlY29kZXIsaT1yLkdldEVuY29kZWRHZW9tZXRyeVR5cGUobikscz1uZXcgZS5NZXRhZGF0YVF1ZXJpZXIsZix1O2k9PT1lLlRSSUFOR1VMQVJfTUVTSCYmKGY9bmV3IGUuTWVzaCx1PXIuRGVjb2RlQnVmZmVyVG9NZXNoKG4sZikpO2xldCBjPXt2ZXJ0ZXhDb3VudDpbMF0sZmVhdHVyZUNvdW50OjB9O2lmKGgodSkmJnUub2soKSYmZi5wdHIhPT0wKXtsZXQgbD1mLm51bV9mYWNlcygpLHA9Zi5udW1fYXR0cmlidXRlcygpLGQ9Zi5udW1fcG9pbnRzKCk7Yy5pbmRpY2VzPW5ldyBVaW50MzJBcnJheShsKjMpO2xldCBtPWMuaW5kaWNlcztjLnZlcnRleENvdW50WzBdPWQsYy5zY2FsZV94PTEsYy5zY2FsZV95PTE7bGV0IF89bmV3IGUuRHJhY29JbnQzMkFycmF5KDMpO2ZvcihsZXQgZz0wO2c8bDsrK2cpci5HZXRGYWNlRnJvbU1lc2goZixnLF8pLG1bZyozXT1fLkdldFZhbHVlKDApLG1bZyozKzFdPV8uR2V0VmFsdWUoMSksbVtnKjMrMl09Xy5HZXRWYWx1ZSgyKTtlLmRlc3Ryb3koXyk7Zm9yKGxldCBnPTA7ZzxwOysrZyl7bGV0IGI9ci5HZXRBdHRyaWJ1dGUoZixnKSx3PWY4KGUscixmLGIsZCksTz1iLmF0dHJpYnV0ZV90eXBlKCksRT0idW5rbm93biI7Tz09PWUuUE9TSVRJT04/RT0icG9zaXRpb25zIjpPPT09ZS5OT1JNQUw/RT0ibm9ybWFscyI6Tz09PWUuQ09MT1I/RT0iY29sb3JzIjpPPT09ZS5URVhfQ09PUkQmJihFPSJ1djBzIik7bGV0IFQ9ci5HZXRBdHRyaWJ1dGVNZXRhZGF0YShmLGcpO2lmKFQucHRyIT09MCl7bGV0IEM9cy5OdW1FbnRyaWVzKFQpO2ZvcihsZXQgTj0wO048QzsrK04pe2xldCBJPXMuR2V0RW50cnlOYW1lKFQsTik7ST09PSJpM3Mtc2NhbGVfeCI/Yy5zY2FsZV94PXMuR2V0RG91YmxlRW50cnkoVCwiaTNzLXNjYWxlX3giKTpJPT09Imkzcy1zY2FsZV95Ij9jLnNjYWxlX3k9cy5HZXREb3VibGVFbnRyeShULCJpM3Mtc2NhbGVfeSIpOkk9PT0iaTNzLWF0dHJpYnV0ZS10eXBlIiYmKEU9cy5HZXRTdHJpbmdFbnRyeShULCJpM3MtYXR0cmlidXRlLXR5cGUiKSl9fWgoY1tFXSkmJmNvbnNvbGUubG9nKCJBdHRyaWJ1dGUgYWxyZWFkeSBleGlzdHMiLEUpLGNbRV09dyxFPT09ImZlYXR1cmUtaW5kZXgiJiZjLmZlYXR1cmVDb3VudCsrfWUuZGVzdHJveShmKX1yZXR1cm4gZS5kZXN0cm95KHMpLGUuZGVzdHJveShyKSxjfWZ1bmN0aW9uIGY4KHQsZSxuLG8scil7bGV0IGk9by5udW1fY29tcG9uZW50cygpKnIscyx1PVtmdW5jdGlvbigpe30sZnVuY3Rpb24oKXtzPW5ldyB0LkRyYWNvSW50OEFycmF5KGkpLGUuR2V0QXR0cmlidXRlSW50OEZvckFsbFBvaW50cyhuLG8scyl8fGNvbnNvbGUuZXJyb3IoIkJhZCBzdHJlYW0iKTtsZXQgbD1uZXcgSW50OEFycmF5KGkpO2ZvcihsZXQgcD0wO3A8aTsrK3ApbFtwXT1zLkdldFZhbHVlKHApO3JldHVybiBsfSxmdW5jdGlvbigpe3M9bmV3IHQuRHJhY29JbnQ4QXJyYXkoaSksZS5HZXRBdHRyaWJ1dGVVSW50OEZvckFsbFBvaW50cyhuLG8scyl8fGNvbnNvbGUuZXJyb3IoIkJhZCBzdHJlYW0iKTtsZXQgbD1uZXcgVWludDhBcnJheShpKTtmb3IobGV0IHA9MDtwPGk7KytwKWxbcF09cy5HZXRWYWx1ZShwKTtyZXR1cm4gbH0sZnVuY3Rpb24oKXtzPW5ldyB0LkRyYWNvSW50MTZBcnJheShpKSxlLkdldEF0dHJpYnV0ZUludDE2Rm9yQWxsUG9pbnRzKG4sbyxzKXx8Y29uc29sZS5lcnJvcigiQmFkIHN0cmVhbSIpO2xldCBsPW5ldyBJbnQxNkFycmF5KGkpO2ZvcihsZXQgcD0wO3A8aTsrK3ApbFtwXT1zLkdldFZhbHVlKHApO3JldHVybiBsfSxmdW5jdGlvbigpe3M9bmV3IHQuRHJhY29JbnQxNkFycmF5KGkpLGUuR2V0QXR0cmlidXRlVUludDE2Rm9yQWxsUG9pbnRzKG4sbyxzKXx8Y29uc29sZS5lcnJvcigiQmFkIHN0cmVhbSIpO2xldCBsPW5ldyBVaW50MTZBcnJheShpKTtmb3IobGV0IHA9MDtwPGk7KytwKWxbcF09cy5HZXRWYWx1ZShwKTtyZXR1cm4gbH0sZnVuY3Rpb24oKXtzPW5ldyB0LkRyYWNvSW50MzJBcnJheShpKSxlLkdldEF0dHJpYnV0ZUludDMyRm9yQWxsUG9pbnRzKG4sbyxzKXx8Y29uc29sZS5lcnJvcigiQmFkIHN0cmVhbSIpO2xldCBsPW5ldyBJbnQzMkFycmF5KGkpO2ZvcihsZXQgcD0wO3A8aTsrK3ApbFtwXT1zLkdldFZhbHVlKHApO3JldHVybiBsfSxmdW5jdGlvbigpe3M9bmV3IHQuRHJhY29JbnQzMkFycmF5KGkpLGUuR2V0QXR0cmlidXRlVUludDMyRm9yQWxsUG9pbnRzKG4sbyxzKXx8Y29uc29sZS5lcnJvcigiQmFkIHN0cmVhbSIpO2xldCBsPW5ldyBVaW50MzJBcnJheShpKTtmb3IobGV0IHA9MDtwPGk7KytwKWxbcF09cy5HZXRWYWx1ZShwKTtyZXR1cm4gbH0sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe3M9bmV3IHQuRHJhY29GbG9hdDMyQXJyYXkoaSksZS5HZXRBdHRyaWJ1dGVGbG9hdEZvckFsbFBvaW50cyhuLG8scyl8fGNvbnNvbGUuZXJyb3IoIkJhZCBzdHJlYW0iKTtsZXQgbD1uZXcgRmxvYXQzMkFycmF5KGkpO2ZvcihsZXQgcD0wO3A8aTsrK3ApbFtwXT1zLkdldFZhbHVlKHApO3JldHVybiBsfSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXtzPW5ldyB0LkRyYWNvVUludDhBcnJheShpKSxlLkdldEF0dHJpYnV0ZVVJbnQ4Rm9yQWxsUG9pbnRzKG4sbyxzKXx8Y29uc29sZS5lcnJvcigiQmFkIHN0cmVhbSIpO2xldCBsPW5ldyBVaW50OEFycmF5KGkpO2ZvcihsZXQgcD0wO3A8aTsrK3ApbFtwXT1zLkdldFZhbHVlKHApO3JldHVybiBsfV1bby5kYXRhX3R5cGUoKV0oKTtyZXR1cm4gaChzKSYmdC5kZXN0cm95KHMpLHV9ZnVuY3Rpb24gdTgodCxlLG4sbyl7bGV0IHI9e3ZlcnRleENvdW50OjB9LGk9bmV3IERhdGFWaWV3KHQpO3RyeXtsZXQgcz0wO2lmKHIudmVydGV4Q291bnQ9aS5nZXRVaW50MzIocywxKSxzKz00LHIuZmVhdHVyZUNvdW50PWkuZ2V0VWludDMyKHMsMSkscys9NCxoKG4pKWZvcihsZXQgZj0wO2Y8bi5hdHRyaWJ1dGVzLmxlbmd0aDtmKyspaChkbVtuLmF0dHJpYnV0ZXNbZl1dKT9zPWRtW24uYXR0cmlidXRlc1tmXV0ocix0LHMpOmNvbnNvbGUuZXJyb3IoIlVua25vd24gZGVjb2RlciBmb3IiLG4uYXR0cmlidXRlc1tmXSk7ZWxzZXtsZXQgZj1lLm9yZGVyaW5nLHU9ZS5mZWF0dXJlQXR0cmlidXRlT3JkZXI7aChvKSYmaChvLmdlb21ldHJ5RGF0YSkmJmgoby5nZW9tZXRyeURhdGFbMF0pJiZoKG8uZ2VvbWV0cnlEYXRhWzBdLnBhcmFtcykmJihmPU9iamVjdC5rZXlzKG8uZ2VvbWV0cnlEYXRhWzBdLnBhcmFtcy52ZXJ0ZXhBdHRyaWJ1dGVzKSx1PU9iamVjdC5rZXlzKG8uZ2VvbWV0cnlEYXRhWzBdLnBhcmFtcy5mZWF0dXJlQXR0cmlidXRlcykpO2ZvcihsZXQgYz0wO2M8Zi5sZW5ndGg7YysrKXtsZXQgbD1kbVtmW2NdXTtzPWwocix0LHMpfWZvcihsZXQgYz0wO2M8dS5sZW5ndGg7YysrKXtsZXQgbD1kbVt1W2NdXTtzPWwocix0LHMpfX19Y2F0Y2gocyl7Y29uc29sZS5lcnJvcihzKX1yZXR1cm4gci5zY2FsZV94PTEsci5zY2FsZV95PTEscn1mdW5jdGlvbiBsOCh0KXtsZXQgZT1jOCh0LmJpbmFyeURhdGEsdC5zY2hlbWEsdC5idWZmZXJJbmZvLHQuZmVhdHVyZURhdGEpO2godC5nZW9pZERhdGFMaXN0KSYmdC5nZW9pZERhdGFMaXN0Lmxlbmd0aD4wJiZxNihlLnZlcnRleENvdW50LGUucG9zaXRpb25zLGUuc2NhbGVfeCxlLnNjYWxlX3ksdC5jYXJ0b2dyYXBoaWNDZW50ZXIsdC5nZW9pZERhdGFMaXN0LCExKSxLNihlLnZlcnRleENvdW50LGUucG9zaXRpb25zLGUubm9ybWFscyx0LmNhcnRvZ3JhcGhpY0NlbnRlcix0LmNhcnRlc2lhbkNlbnRlcix0LnBhcmVudFJvdGF0aW9uLHQuZWxsaXBzb2lkUmFkaWlTcXVhcmUsZS5zY2FsZV94LGUuc2NhbGVfeSksaChlLnV2MHMpJiZoKGVbInV2LXJlZ2lvbiJdKSYmVzYoZS52ZXJ0ZXhDb3VudCxlLnV2MHMsZVsidXYtcmVnaW9uIl0pO2xldCBuO2lmKGgoZVsiZmVhdHVyZS1pbmRleCJdKSluPWVbImZlYXR1cmUtaW5kZXgiXTtlbHNlIGlmKGgoZS5mYWNlUmFuZ2UpKXtuPW5ldyBBcnJheShlLnZlcnRleENvdW50KTtmb3IobGV0IHM9MDtzPGUuZmFjZVJhbmdlLmxlbmd0aC0xO3MrPTIpe2xldCBmPXMvMix1PWUuZmFjZVJhbmdlW3NdLGM9ZS5mYWNlUmFuZ2VbcysxXTtmb3IobGV0IGw9dTtsPD1jO2wrKyluW2wqM109ZixuW2wqMysxXT1mLG5bbCozKzJdPWZ9fWlmKHQuY2FsY3VsYXRlTm9ybWFscyl7bGV0IHM9aTgoZS52ZXJ0ZXhDb3VudCxlLmluZGljZXMsZS5wb3NpdGlvbnMsZS5ub3JtYWxzLGUudXYwcyxlLmNvbG9ycyxuKTtoKHMubm9ybWFscykmJihlLm5vcm1hbHM9cy5ub3JtYWxzLGgocy52ZXJ0ZXhDb3VudCkmJihlLnZlcnRleENvdW50PXMudmVydGV4Q291bnQsZS5pbmRpY2VzPXMuaW5kaWNlcyxlLnBvc2l0aW9ucz1zLnBvc2l0aW9ucyxlLnV2MHM9cy51djBzLGUuY29sb3JzPXMuY29sb3JzLG49cy5mZWF0dXJlSW5kZXgpKX1sZXQgbz1zOChlLnZlcnRleENvdW50LGUuaW5kaWNlcyxlLnBvc2l0aW9ucyxlLm5vcm1hbHMsZS51djBzLGUuY29sb3JzLG4sdCkscj17cG9zaXRpb25zOmUucG9zaXRpb25zLGluZGljZXM6ZS5pbmRpY2VzLGZlYXR1cmVJbmRleDpuLHNvdXJjZVVSTDp0LnVybCxjYXJ0ZXNpYW5DZW50ZXI6dC5jYXJ0ZXNpYW5DZW50ZXIscGFyZW50Um90YXRpb246dC5wYXJlbnRSb3RhdGlvbn07cmV0dXJuIG8uX2N1c3RvbUF0dHJpYnV0ZXM9cix7bWVzaERhdGE6b319YXN5bmMgZnVuY3Rpb24gcDgodCxlKXtsZXQgbj10LndlYkFzc2VtYmx5Q29uZmlnO3JldHVybiBoKG4pJiZoKG4ud2FzbUJpbmFyeUZpbGUpP1hnPWF3YWl0KDAsV2cuZGVmYXVsdCkobik6WGc9YXdhaXQoMCxXZy5kZWZhdWx0KSgpLCEwfWZ1bmN0aW9uIGQ4KHQsZSl7bGV0IG49dC53ZWJBc3NlbWJseUNvbmZpZztyZXR1cm4gaChuKT9wOCh0LGUpOmw4KHQsZSl9dmFyIFdnLFhnLEFpLHVtLGxtLHBtLEtnLGRtLG04LCRnPVooKCk9PntzbygpO0l0KCk7ZnQoKTtpYygpO1p0KCk7UGUoKTtGdCgpO1BhKCk7Rm4oKTtXdCgpO1dnPXJyKFJnKCksMSk7U1MoKTtBaT1uZXcgYSx1bT1uZXcgYSxsbT1uZXcgYTtwbT1uZXcgYSxLZz1uZXcgYTtkbT17cG9zaXRpb246ZnVuY3Rpb24odCxlLG4pe2xldCBvPXQudmVydGV4Q291bnQqMztyZXR1cm4gdC5wb3NpdGlvbnM9bmV3IEZsb2F0MzJBcnJheShlLG4sbyksbis9byo0LG59LG5vcm1hbDpmdW5jdGlvbih0LGUsbil7bGV0IG89dC52ZXJ0ZXhDb3VudCozO3JldHVybiB0Lm5vcm1hbHM9bmV3IEZsb2F0MzJBcnJheShlLG4sbyksbis9byo0LG59LHV2MDpmdW5jdGlvbih0LGUsbil7bGV0IG89dC52ZXJ0ZXhDb3VudCoyO3JldHVybiB0LnV2MHM9bmV3IEZsb2F0MzJBcnJheShlLG4sbyksbis9byo0LG59LGNvbG9yOmZ1bmN0aW9uKHQsZSxuKXtsZXQgbz10LnZlcnRleENvdW50KjQ7cmV0dXJuIHQuY29sb3JzPW5ldyBVaW50OEFycmF5KGUsbixvKSxuKz1vLG59LGZlYXR1cmVJZDpmdW5jdGlvbih0LGUsbil7bGV0IG89dC5mZWF0dXJlQ291bnQ7cmV0dXJuIG4rPW8qOCxufSxpZDpmdW5jdGlvbih0LGUsbil7bGV0IG89dC5mZWF0dXJlQ291bnQ7cmV0dXJuIG4rPW8qOCxufSxmYWNlUmFuZ2U6ZnVuY3Rpb24odCxlLG4pe2xldCBvPXQuZmVhdHVyZUNvdW50KjI7cmV0dXJuIHQuZmFjZVJhbmdlPW5ldyBVaW50MzJBcnJheShlLG4sbyksbis9byo0LG59LHV2UmVnaW9uOmZ1bmN0aW9uKHQsZSxuKXtsZXQgbz10LnZlcnRleENvdW50KjQ7cmV0dXJuIHRbInV2LXJlZ2lvbiJdPW5ldyBVaW50MTZBcnJheShlLG4sbyksbis9byoyLG59LHJlZ2lvbjpmdW5jdGlvbih0LGUsbil7bGV0IG89dC52ZXJ0ZXhDb3VudCo0O3JldHVybiB0WyJ1di1yZWdpb24iXT1uZXcgVWludDE2QXJyYXkoZSxuLG8pLG4rPW8qMixufX07bTg9UWUoZDgpfSk7dmFyIE5lLGtvLFpnPVooKCk9PnskcygpO05lPXtVTlNJR05FRF9CWVRFOnF0LlVOU0lHTkVEX0JZVEUsVU5TSUdORURfU0hPUlQ6cXQuVU5TSUdORURfU0hPUlQsVU5TSUdORURfSU5UOnF0LlVOU0lHTkVEX0lOVCxGTE9BVDpxdC5GTE9BVCxIQUxGX0ZMT0FUOnF0LkhBTEZfRkxPQVRfT0VTLFVOU0lHTkVEX0lOVF8yNF84OnF0LlVOU0lHTkVEX0lOVF8yNF84LFVOU0lHTkVEX1NIT1JUXzRfNF80XzQ6cXQuVU5TSUdORURfU0hPUlRfNF80XzRfNCxVTlNJR05FRF9TSE9SVF81XzVfNV8xOnF0LlVOU0lHTkVEX1NIT1JUXzVfNV81XzEsVU5TSUdORURfU0hPUlRfNV82XzU6cXQuVU5TSUdORURfU0hPUlRfNV82XzV9O05lLnRvV2ViR0xDb25zdGFudD1mdW5jdGlvbih0LGUpe3N3aXRjaCh0KXtjYXNlIE5lLlVOU0lHTkVEX0JZVEU6cmV0dXJuIHF0LlVOU0lHTkVEX0JZVEU7Y2FzZSBOZS5VTlNJR05FRF9TSE9SVDpyZXR1cm4gcXQuVU5TSUdORURfU0hPUlQ7Y2FzZSBOZS5VTlNJR05FRF9JTlQ6cmV0dXJuIHF0LlVOU0lHTkVEX0lOVDtjYXNlIE5lLkZMT0FUOnJldHVybiBxdC5GTE9BVDtjYXNlIE5lLkhBTEZfRkxPQVQ6cmV0dXJuIGUud2ViZ2wyP3F0LkhBTEZfRkxPQVQ6cXQuSEFMRl9GTE9BVF9PRVM7Y2FzZSBOZS5VTlNJR05FRF9JTlRfMjRfODpyZXR1cm4gcXQuVU5TSUdORURfSU5UXzI0Xzg7Y2FzZSBOZS5VTlNJR05FRF9TSE9SVF80XzRfNF80OnJldHVybiBxdC5VTlNJR05FRF9TSE9SVF80XzRfNF80O2Nhc2UgTmUuVU5TSUdORURfU0hPUlRfNV81XzVfMTpyZXR1cm4gcXQuVU5TSUdORURfU0hPUlRfNV81XzVfMTtjYXNlIE5lLlVOU0lHTkVEX1NIT1JUXzVfNl81OnJldHVybiBOZS5VTlNJR05FRF9TSE9SVF81XzZfNX19O05lLmlzUGFja2VkPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09TmUuVU5TSUdORURfSU5UXzI0Xzh8fHQ9PT1OZS5VTlNJR05FRF9TSE9SVF80XzRfNF80fHx0PT09TmUuVU5TSUdORURfU0hPUlRfNV81XzVfMXx8dD09PU5lLlVOU0lHTkVEX1NIT1JUXzVfNl81fTtOZS5zaXplSW5CeXRlcz1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSBOZS5VTlNJR05FRF9CWVRFOnJldHVybiAxO2Nhc2UgTmUuVU5TSUdORURfU0hPUlQ6Y2FzZSBOZS5VTlNJR05FRF9TSE9SVF80XzRfNF80OmNhc2UgTmUuVU5TSUdORURfU0hPUlRfNV81XzVfMTpjYXNlIE5lLlVOU0lHTkVEX1NIT1JUXzVfNl81OmNhc2UgTmUuSEFMRl9GTE9BVDpyZXR1cm4gMjtjYXNlIE5lLlVOU0lHTkVEX0lOVDpjYXNlIE5lLkZMT0FUOmNhc2UgTmUuVU5TSUdORURfSU5UXzI0Xzg6cmV0dXJuIDR9fTtOZS52YWxpZGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdD09PU5lLlVOU0lHTkVEX0JZVEV8fHQ9PT1OZS5VTlNJR05FRF9TSE9SVHx8dD09PU5lLlVOU0lHTkVEX0lOVHx8dD09PU5lLkZMT0FUfHx0PT09TmUuSEFMRl9GTE9BVHx8dD09PU5lLlVOU0lHTkVEX0lOVF8yNF84fHx0PT09TmUuVU5TSUdORURfU0hPUlRfNF80XzRfNHx8dD09PU5lLlVOU0lHTkVEX1NIT1JUXzVfNV81XzF8fHQ9PT1OZS5VTlNJR05FRF9TSE9SVF81XzZfNX07a289T2JqZWN0LmZyZWV6ZShOZSl9KTt2YXIgU3QsVW4sUFM9WigoKT0+e1pnKCk7JHMoKTtTdD17REVQVEhfQ09NUE9ORU5UOnF0LkRFUFRIX0NPTVBPTkVOVCxERVBUSF9TVEVOQ0lMOnF0LkRFUFRIX1NURU5DSUwsQUxQSEE6cXQuQUxQSEEsUkVEOnF0LlJFRCxSRzpxdC5SRyxSR0I6cXQuUkdCLFJHQkE6cXQuUkdCQSxMVU1JTkFOQ0U6cXQuTFVNSU5BTkNFLExVTUlOQU5DRV9BTFBIQTpxdC5MVU1JTkFOQ0VfQUxQSEEsUkdCX0RYVDE6cXQuQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVCxSR0JBX0RYVDE6cXQuQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQsUkdCQV9EWFQzOnF0LkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhULFJHQkFfRFhUNTpxdC5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVCxSR0JfUFZSVENfNEJQUFYxOnF0LkNPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUcsUkdCX1BWUlRDXzJCUFBWMTpxdC5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HLFJHQkFfUFZSVENfNEJQUFYxOnF0LkNPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HLFJHQkFfUFZSVENfMkJQUFYxOnF0LkNPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HLFJHQkFfQVNUQzpxdC5DT01QUkVTU0VEX1JHQkFfQVNUQ180eDRfV0VCR0wsUkdCX0VUQzE6cXQuQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTCxSR0I4X0VUQzI6cXQuQ09NUFJFU1NFRF9SR0I4X0VUQzIsUkdCQThfRVRDMl9FQUM6cXQuQ09NUFJFU1NFRF9SR0JBOF9FVEMyX0VBQyxSR0JBX0JDNzpxdC5DT01QUkVTU0VEX1JHQkFfQlBUQ19VTk9STX07U3QuY29tcG9uZW50c0xlbmd0aD1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSBTdC5SR0I6cmV0dXJuIDM7Y2FzZSBTdC5SR0JBOnJldHVybiA0O2Nhc2UgU3QuTFVNSU5BTkNFX0FMUEhBOmNhc2UgU3QuUkc6cmV0dXJuIDI7Y2FzZSBTdC5BTFBIQTpjYXNlIFN0LlJFRDpjYXNlIFN0LkxVTUlOQU5DRTpyZXR1cm4gMTtkZWZhdWx0OnJldHVybiAxfX07U3QudmFsaWRhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1TdC5ERVBUSF9DT01QT05FTlR8fHQ9PT1TdC5ERVBUSF9TVEVOQ0lMfHx0PT09U3QuQUxQSEF8fHQ9PT1TdC5SRUR8fHQ9PT1TdC5SR3x8dD09PVN0LlJHQnx8dD09PVN0LlJHQkF8fHQ9PT1TdC5MVU1JTkFOQ0V8fHQ9PT1TdC5MVU1JTkFOQ0VfQUxQSEF8fHQ9PT1TdC5SR0JfRFhUMXx8dD09PVN0LlJHQkFfRFhUMXx8dD09PVN0LlJHQkFfRFhUM3x8dD09PVN0LlJHQkFfRFhUNXx8dD09PVN0LlJHQl9QVlJUQ180QlBQVjF8fHQ9PT1TdC5SR0JfUFZSVENfMkJQUFYxfHx0PT09U3QuUkdCQV9QVlJUQ180QlBQVjF8fHQ9PT1TdC5SR0JBX1BWUlRDXzJCUFBWMXx8dD09PVN0LlJHQkFfQVNUQ3x8dD09PVN0LlJHQl9FVEMxfHx0PT09U3QuUkdCOF9FVEMyfHx0PT09U3QuUkdCQThfRVRDMl9FQUN8fHQ9PT1TdC5SR0JBX0JDN307U3QuaXNDb2xvckZvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gdD09PVN0LlJFRHx8dD09PVN0LkFMUEhBfHx0PT09U3QuUkdCfHx0PT09U3QuUkdCQXx8dD09PVN0LkxVTUlOQU5DRXx8dD09PVN0LkxVTUlOQU5DRV9BTFBIQX07U3QuaXNEZXB0aEZvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gdD09PVN0LkRFUFRIX0NPTVBPTkVOVHx8dD09PVN0LkRFUFRIX1NURU5DSUx9O1N0LmlzQ29tcHJlc3NlZEZvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gdD09PVN0LlJHQl9EWFQxfHx0PT09U3QuUkdCQV9EWFQxfHx0PT09U3QuUkdCQV9EWFQzfHx0PT09U3QuUkdCQV9EWFQ1fHx0PT09U3QuUkdCX1BWUlRDXzRCUFBWMXx8dD09PVN0LlJHQl9QVlJUQ18yQlBQVjF8fHQ9PT1TdC5SR0JBX1BWUlRDXzRCUFBWMXx8dD09PVN0LlJHQkFfUFZSVENfMkJQUFYxfHx0PT09U3QuUkdCQV9BU1RDfHx0PT09U3QuUkdCX0VUQzF8fHQ9PT1TdC5SR0I4X0VUQzJ8fHQ9PT1TdC5SR0JBOF9FVEMyX0VBQ3x8dD09PVN0LlJHQkFfQkM3fTtTdC5pc0RYVEZvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gdD09PVN0LlJHQl9EWFQxfHx0PT09U3QuUkdCQV9EWFQxfHx0PT09U3QuUkdCQV9EWFQzfHx0PT09U3QuUkdCQV9EWFQ1fTtTdC5pc1BWUlRDRm9ybWF0PWZ1bmN0aW9uKHQpe3JldHVybiB0PT09U3QuUkdCX1BWUlRDXzRCUFBWMXx8dD09PVN0LlJHQl9QVlJUQ18yQlBQVjF8fHQ9PT1TdC5SR0JBX1BWUlRDXzRCUFBWMXx8dD09PVN0LlJHQkFfUFZSVENfMkJQUFYxfTtTdC5pc0FTVENGb3JtYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1TdC5SR0JBX0FTVEN9O1N0LmlzRVRDMUZvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gdD09PVN0LlJHQl9FVEMxfTtTdC5pc0VUQzJGb3JtYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1TdC5SR0I4X0VUQzJ8fHQ9PT1TdC5SR0JBOF9FVEMyX0VBQ307U3QuaXNCQzdGb3JtYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1TdC5SR0JBX0JDN307U3QuY29tcHJlc3NlZFRleHR1cmVTaXplSW5CeXRlcz1mdW5jdGlvbih0LGUsbil7c3dpdGNoKHQpe2Nhc2UgU3QuUkdCX0RYVDE6Y2FzZSBTdC5SR0JBX0RYVDE6Y2FzZSBTdC5SR0JfRVRDMTpjYXNlIFN0LlJHQjhfRVRDMjpyZXR1cm4gTWF0aC5mbG9vcigoZSszKS80KSpNYXRoLmZsb29yKChuKzMpLzQpKjg7Y2FzZSBTdC5SR0JBX0RYVDM6Y2FzZSBTdC5SR0JBX0RYVDU6Y2FzZSBTdC5SR0JBX0FTVEM6Y2FzZSBTdC5SR0JBOF9FVEMyX0VBQzpyZXR1cm4gTWF0aC5mbG9vcigoZSszKS80KSpNYXRoLmZsb29yKChuKzMpLzQpKjE2O2Nhc2UgU3QuUkdCX1BWUlRDXzRCUFBWMTpjYXNlIFN0LlJHQkFfUFZSVENfNEJQUFYxOnJldHVybiBNYXRoLmZsb29yKChNYXRoLm1heChlLDgpKk1hdGgubWF4KG4sOCkqNCs3KS84KTtjYXNlIFN0LlJHQl9QVlJUQ18yQlBQVjE6Y2FzZSBTdC5SR0JBX1BWUlRDXzJCUFBWMTpyZXR1cm4gTWF0aC5mbG9vcigoTWF0aC5tYXgoZSwxNikqTWF0aC5tYXgobiw4KSoyKzcpLzgpO2Nhc2UgU3QuUkdCQV9CQzc6cmV0dXJuIE1hdGguY2VpbChlLzQpKk1hdGguY2VpbChuLzQpKjE2O2RlZmF1bHQ6cmV0dXJuIDB9fTtTdC50ZXh0dXJlU2l6ZUluQnl0ZXM9ZnVuY3Rpb24odCxlLG4sbyl7bGV0IHI9U3QuY29tcG9uZW50c0xlbmd0aCh0KTtyZXR1cm4ga28uaXNQYWNrZWQoZSkmJihyPTEpLHIqa28uc2l6ZUluQnl0ZXMoZSkqbipvfTtTdC5hbGlnbm1lbnRJbkJ5dGVzPWZ1bmN0aW9uKHQsZSxuKXtsZXQgbz1TdC50ZXh0dXJlU2l6ZUluQnl0ZXModCxlLG4sMSklNDtyZXR1cm4gbz09PTA/NDpvPT09Mj8yOjF9O1N0LmNyZWF0ZVR5cGVkQXJyYXk9ZnVuY3Rpb24odCxlLG4sbyl7bGV0IHIsaT1rby5zaXplSW5CeXRlcyhlKTtpPT09VWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVD9yPVVpbnQ4QXJyYXk6aT09PVVpbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UP3I9VWludDE2QXJyYXk6aT09PUZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCYmZT09PWtvLkZMT0FUP3I9RmxvYXQzMkFycmF5OnI9VWludDMyQXJyYXk7bGV0IHM9U3QuY29tcG9uZW50c0xlbmd0aCh0KSpuKm87cmV0dXJuIG5ldyByKHMpfTtTdC5mbGlwWT1mdW5jdGlvbih0LGUsbixvLHIpe2lmKHI9PT0xKXJldHVybiB0O2xldCBpPVN0LmNyZWF0ZVR5cGVkQXJyYXkoZSxuLG8scikscz1TdC5jb21wb25lbnRzTGVuZ3RoKGUpLGY9bypzO2ZvcihsZXQgdT0wO3U8cjsrK3Upe2xldCBjPXUqbypzLGw9KHItdS0xKSpvKnM7Zm9yKGxldCBwPTA7cDxmOysrcClpW2wrcF09dFtjK3BdfXJldHVybiBpfTtTdC50b0ludGVybmFsRm9ybWF0PWZ1bmN0aW9uKHQsZSxuKXtpZighbi53ZWJnbDIpcmV0dXJuIHQ7aWYodD09PVN0LkRFUFRIX1NURU5DSUwpcmV0dXJuIHF0LkRFUFRIMjRfU1RFTkNJTDg7aWYodD09PVN0LkRFUFRIX0NPTVBPTkVOVCl7aWYoZT09PWtvLlVOU0lHTkVEX1NIT1JUKXJldHVybiBxdC5ERVBUSF9DT01QT05FTlQxNjtpZihlPT09a28uVU5TSUdORURfSU5UKXJldHVybiBxdC5ERVBUSF9DT01QT05FTlQyNH1pZihlPT09a28uRkxPQVQpc3dpdGNoKHQpe2Nhc2UgU3QuUkdCQTpyZXR1cm4gcXQuUkdCQTMyRjtjYXNlIFN0LlJHQjpyZXR1cm4gcXQuUkdCMzJGO2Nhc2UgU3QuUkc6cmV0dXJuIHF0LlJHMzJGO2Nhc2UgU3QuUkVEOnJldHVybiBxdC5SMzJGfWlmKGU9PT1rby5IQUxGX0ZMT0FUKXN3aXRjaCh0KXtjYXNlIFN0LlJHQkE6cmV0dXJuIHF0LlJHQkExNkY7Y2FzZSBTdC5SR0I6cmV0dXJuIHF0LlJHQjE2RjtjYXNlIFN0LlJHOnJldHVybiBxdC5SRzE2RjtjYXNlIFN0LlJFRDpyZXR1cm4gcXQuUjE2Rn1yZXR1cm4gdH07VW49T2JqZWN0LmZyZWV6ZShTdCl9KTt2YXIgaDgsaHUsTVM9WigoKT0+e2g4PXtWS19GT1JNQVRfVU5ERUZJTkVEOjAsVktfRk9STUFUX1I0RzRfVU5PUk1fUEFDSzg6MSxWS19GT1JNQVRfUjRHNEI0QTRfVU5PUk1fUEFDSzE2OjIsVktfRk9STUFUX0I0RzRSNEE0X1VOT1JNX1BBQ0sxNjozLFZLX0ZPUk1BVF9SNUc2QjVfVU5PUk1fUEFDSzE2OjQsVktfRk9STUFUX0I1RzZSNV9VTk9STV9QQUNLMTY6NSxWS19GT1JNQVRfUjVHNUI1QTFfVU5PUk1fUEFDSzE2OjYsVktfRk9STUFUX0I1RzVSNUExX1VOT1JNX1BBQ0sxNjo3LFZLX0ZPUk1BVF9BMVI1RzVCNV9VTk9STV9QQUNLMTY6OCxWS19GT1JNQVRfUjhfVU5PUk06OSxWS19GT1JNQVRfUjhfU05PUk06MTAsVktfRk9STUFUX1I4X1VTQ0FMRUQ6MTEsVktfRk9STUFUX1I4X1NTQ0FMRUQ6MTIsVktfRk9STUFUX1I4X1VJTlQ6MTMsVktfRk9STUFUX1I4X1NJTlQ6MTQsVktfRk9STUFUX1I4X1NSR0I6MTUsVktfRk9STUFUX1I4RzhfVU5PUk06MTYsVktfRk9STUFUX1I4RzhfU05PUk06MTcsVktfRk9STUFUX1I4RzhfVVNDQUxFRDoxOCxWS19GT1JNQVRfUjhHOF9TU0NBTEVEOjE5LFZLX0ZPUk1BVF9SOEc4X1VJTlQ6MjAsVktfRk9STUFUX1I4RzhfU0lOVDoyMSxWS19GT1JNQVRfUjhHOF9TUkdCOjIyLFZLX0ZPUk1BVF9SOEc4QjhfVU5PUk06MjMsVktfRk9STUFUX1I4RzhCOF9TTk9STToyNCxWS19GT1JNQVRfUjhHOEI4X1VTQ0FMRUQ6MjUsVktfRk9STUFUX1I4RzhCOF9TU0NBTEVEOjI2LFZLX0ZPUk1BVF9SOEc4QjhfVUlOVDoyNyxWS19GT1JNQVRfUjhHOEI4X1NJTlQ6MjgsVktfRk9STUFUX1I4RzhCOF9TUkdCOjI5LFZLX0ZPUk1BVF9COEc4UjhfVU5PUk06MzAsVktfRk9STUFUX0I4RzhSOF9TTk9STTozMSxWS19GT1JNQVRfQjhHOFI4X1VTQ0FMRUQ6MzIsVktfRk9STUFUX0I4RzhSOF9TU0NBTEVEOjMzLFZLX0ZPUk1BVF9COEc4UjhfVUlOVDozNCxWS19GT1JNQVRfQjhHOFI4X1NJTlQ6MzUsVktfRk9STUFUX0I4RzhSOF9TUkdCOjM2LFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTozNyxWS19GT1JNQVRfUjhHOEI4QThfU05PUk06MzgsVktfRk9STUFUX1I4RzhCOEE4X1VTQ0FMRUQ6MzksVktfRk9STUFUX1I4RzhCOEE4X1NTQ0FMRUQ6NDAsVktfRk9STUFUX1I4RzhCOEE4X1VJTlQ6NDEsVktfRk9STUFUX1I4RzhCOEE4X1NJTlQ6NDIsVktfRk9STUFUX1I4RzhCOEE4X1NSR0I6NDMsVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNOjQ0LFZLX0ZPUk1BVF9COEc4UjhBOF9TTk9STTo0NSxWS19GT1JNQVRfQjhHOFI4QThfVVNDQUxFRDo0NixWS19GT1JNQVRfQjhHOFI4QThfU1NDQUxFRDo0NyxWS19GT1JNQVRfQjhHOFI4QThfVUlOVDo0OCxWS19GT1JNQVRfQjhHOFI4QThfU0lOVDo0OSxWS19GT1JNQVRfQjhHOFI4QThfU1JHQjo1MCxWS19GT1JNQVRfQThCOEc4UjhfVU5PUk1fUEFDSzMyOjUxLFZLX0ZPUk1BVF9BOEI4RzhSOF9TTk9STV9QQUNLMzI6NTIsVktfRk9STUFUX0E4QjhHOFI4X1VTQ0FMRURfUEFDSzMyOjUzLFZLX0ZPUk1BVF9BOEI4RzhSOF9TU0NBTEVEX1BBQ0szMjo1NCxWS19GT1JNQVRfQThCOEc4UjhfVUlOVF9QQUNLMzI6NTUsVktfRk9STUFUX0E4QjhHOFI4X1NJTlRfUEFDSzMyOjU2LFZLX0ZPUk1BVF9BOEI4RzhSOF9TUkdCX1BBQ0szMjo1NyxWS19GT1JNQVRfQTJSMTBHMTBCMTBfVU5PUk1fUEFDSzMyOjU4LFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9TTk9STV9QQUNLMzI6NTksVktfRk9STUFUX0EyUjEwRzEwQjEwX1VTQ0FMRURfUEFDSzMyOjYwLFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9TU0NBTEVEX1BBQ0szMjo2MSxWS19GT1JNQVRfQTJSMTBHMTBCMTBfVUlOVF9QQUNLMzI6NjIsVktfRk9STUFUX0EyUjEwRzEwQjEwX1NJTlRfUEFDSzMyOjYzLFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9VTk9STV9QQUNLMzI6NjQsVktfRk9STUFUX0EyQjEwRzEwUjEwX1NOT1JNX1BBQ0szMjo2NSxWS19GT1JNQVRfQTJCMTBHMTBSMTBfVVNDQUxFRF9QQUNLMzI6NjYsVktfRk9STUFUX0EyQjEwRzEwUjEwX1NTQ0FMRURfUEFDSzMyOjY3LFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9VSU5UX1BBQ0szMjo2OCxWS19GT1JNQVRfQTJCMTBHMTBSMTBfU0lOVF9QQUNLMzI6NjksVktfRk9STUFUX1IxNl9VTk9STTo3MCxWS19GT1JNQVRfUjE2X1NOT1JNOjcxLFZLX0ZPUk1BVF9SMTZfVVNDQUxFRDo3MixWS19GT1JNQVRfUjE2X1NTQ0FMRUQ6NzMsVktfRk9STUFUX1IxNl9VSU5UOjc0LFZLX0ZPUk1BVF9SMTZfU0lOVDo3NSxWS19GT1JNQVRfUjE2X1NGTE9BVDo3NixWS19GT1JNQVRfUjE2RzE2X1VOT1JNOjc3LFZLX0ZPUk1BVF9SMTZHMTZfU05PUk06NzgsVktfRk9STUFUX1IxNkcxNl9VU0NBTEVEOjc5LFZLX0ZPUk1BVF9SMTZHMTZfU1NDQUxFRDo4MCxWS19GT1JNQVRfUjE2RzE2X1VJTlQ6ODEsVktfRk9STUFUX1IxNkcxNl9TSU5UOjgyLFZLX0ZPUk1BVF9SMTZHMTZfU0ZMT0FUOjgzLFZLX0ZPUk1BVF9SMTZHMTZCMTZfVU5PUk06ODQsVktfRk9STUFUX1IxNkcxNkIxNl9TTk9STTo4NSxWS19GT1JNQVRfUjE2RzE2QjE2X1VTQ0FMRUQ6ODYsVktfRk9STUFUX1IxNkcxNkIxNl9TU0NBTEVEOjg3LFZLX0ZPUk1BVF9SMTZHMTZCMTZfVUlOVDo4OCxWS19GT1JNQVRfUjE2RzE2QjE2X1NJTlQ6ODksVktfRk9STUFUX1IxNkcxNkIxNl9TRkxPQVQ6OTAsVktfRk9STUFUX1IxNkcxNkIxNkExNl9VTk9STTo5MSxWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NOT1JNOjkyLFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfVVNDQUxFRDo5MyxWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NTQ0FMRUQ6OTQsVktfRk9STUFUX1IxNkcxNkIxNkExNl9VSU5UOjk1LFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfU0lOVDo5NixWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NGTE9BVDo5NyxWS19GT1JNQVRfUjMyX1VJTlQ6OTgsVktfRk9STUFUX1IzMl9TSU5UOjk5LFZLX0ZPUk1BVF9SMzJfU0ZMT0FUOjEwMCxWS19GT1JNQVRfUjMyRzMyX1VJTlQ6MTAxLFZLX0ZPUk1BVF9SMzJHMzJfU0lOVDoxMDIsVktfRk9STUFUX1IzMkczMl9TRkxPQVQ6MTAzLFZLX0ZPUk1BVF9SMzJHMzJCMzJfVUlOVDoxMDQsVktfRk9STUFUX1IzMkczMkIzMl9TSU5UOjEwNSxWS19GT1JNQVRfUjMyRzMyQjMyX1NGTE9BVDoxMDYsVktfRk9STUFUX1IzMkczMkIzMkEzMl9VSU5UOjEwNyxWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1NJTlQ6MTA4LFZLX0ZPUk1BVF9SMzJHMzJCMzJBMzJfU0ZMT0FUOjEwOSxWS19GT1JNQVRfUjY0X1VJTlQ6MTEwLFZLX0ZPUk1BVF9SNjRfU0lOVDoxMTEsVktfRk9STUFUX1I2NF9TRkxPQVQ6MTEyLFZLX0ZPUk1BVF9SNjRHNjRfVUlOVDoxMTMsVktfRk9STUFUX1I2NEc2NF9TSU5UOjExNCxWS19GT1JNQVRfUjY0RzY0X1NGTE9BVDoxMTUsVktfRk9STUFUX1I2NEc2NEI2NF9VSU5UOjExNixWS19GT1JNQVRfUjY0RzY0QjY0X1NJTlQ6MTE3LFZLX0ZPUk1BVF9SNjRHNjRCNjRfU0ZMT0FUOjExOCxWS19GT1JNQVRfUjY0RzY0QjY0QTY0X1VJTlQ6MTE5LFZLX0ZPUk1BVF9SNjRHNjRCNjRBNjRfU0lOVDoxMjAsVktfRk9STUFUX1I2NEc2NEI2NEE2NF9TRkxPQVQ6MTIxLFZLX0ZPUk1BVF9CMTBHMTFSMTFfVUZMT0FUX1BBQ0szMjoxMjIsVktfRk9STUFUX0U1QjlHOVI5X1VGTE9BVF9QQUNLMzI6MTIzLFZLX0ZPUk1BVF9EMTZfVU5PUk06MTI0LFZLX0ZPUk1BVF9YOF9EMjRfVU5PUk1fUEFDSzMyOjEyNSxWS19GT1JNQVRfRDMyX1NGTE9BVDoxMjYsVktfRk9STUFUX1M4X1VJTlQ6MTI3LFZLX0ZPUk1BVF9EMTZfVU5PUk1fUzhfVUlOVDoxMjgsVktfRk9STUFUX0QyNF9VTk9STV9TOF9VSU5UOjEyOSxWS19GT1JNQVRfRDMyX1NGTE9BVF9TOF9VSU5UOjEzMCxWS19GT1JNQVRfQkMxX1JHQl9VTk9STV9CTE9DSzoxMzEsVktfRk9STUFUX0JDMV9SR0JfU1JHQl9CTE9DSzoxMzIsVktfRk9STUFUX0JDMV9SR0JBX1VOT1JNX0JMT0NLOjEzMyxWS19GT1JNQVRfQkMxX1JHQkFfU1JHQl9CTE9DSzoxMzQsVktfRk9STUFUX0JDMl9VTk9STV9CTE9DSzoxMzUsVktfRk9STUFUX0JDMl9TUkdCX0JMT0NLOjEzNixWS19GT1JNQVRfQkMzX1VOT1JNX0JMT0NLOjEzNyxWS19GT1JNQVRfQkMzX1NSR0JfQkxPQ0s6MTM4LFZLX0ZPUk1BVF9CQzRfVU5PUk1fQkxPQ0s6MTM5LFZLX0ZPUk1BVF9CQzRfU05PUk1fQkxPQ0s6MTQwLFZLX0ZPUk1BVF9CQzVfVU5PUk1fQkxPQ0s6MTQxLFZLX0ZPUk1BVF9CQzVfU05PUk1fQkxPQ0s6MTQyLFZLX0ZPUk1BVF9CQzZIX1VGTE9BVF9CTE9DSzoxNDMsVktfRk9STUFUX0JDNkhfU0ZMT0FUX0JMT0NLOjE0NCxWS19GT1JNQVRfQkM3X1VOT1JNX0JMT0NLOjE0NSxWS19GT1JNQVRfQkM3X1NSR0JfQkxPQ0s6MTQ2LFZLX0ZPUk1BVF9FVEMyX1I4RzhCOF9VTk9STV9CTE9DSzoxNDcsVktfRk9STUFUX0VUQzJfUjhHOEI4X1NSR0JfQkxPQ0s6MTQ4LFZLX0ZPUk1BVF9FVEMyX1I4RzhCOEExX1VOT1JNX0JMT0NLOjE0OSxWS19GT1JNQVRfRVRDMl9SOEc4QjhBMV9TUkdCX0JMT0NLOjE1MCxWS19GT1JNQVRfRVRDMl9SOEc4QjhBOF9VTk9STV9CTE9DSzoxNTEsVktfRk9STUFUX0VUQzJfUjhHOEI4QThfU1JHQl9CTE9DSzoxNTIsVktfRk9STUFUX0VBQ19SMTFfVU5PUk1fQkxPQ0s6MTUzLFZLX0ZPUk1BVF9FQUNfUjExX1NOT1JNX0JMT0NLOjE1NCxWS19GT1JNQVRfRUFDX1IxMUcxMV9VTk9STV9CTE9DSzoxNTUsVktfRk9STUFUX0VBQ19SMTFHMTFfU05PUk1fQkxPQ0s6MTU2LFZLX0ZPUk1BVF9BU1RDXzR4NF9VTk9STV9CTE9DSzoxNTcsVktfRk9STUFUX0FTVENfNHg0X1NSR0JfQkxPQ0s6MTU4LFZLX0ZPUk1BVF9BU1RDXzV4NF9VTk9STV9CTE9DSzoxNTksVktfRk9STUFUX0FTVENfNXg0X1NSR0JfQkxPQ0s6MTYwLFZLX0ZPUk1BVF9BU1RDXzV4NV9VTk9STV9CTE9DSzoxNjEsVktfRk9STUFUX0FTVENfNXg1X1NSR0JfQkxPQ0s6MTYyLFZLX0ZPUk1BVF9BU1RDXzZ4NV9VTk9STV9CTE9DSzoxNjMsVktfRk9STUFUX0FTVENfNng1X1NSR0JfQkxPQ0s6MTY0LFZLX0ZPUk1BVF9BU1RDXzZ4Nl9VTk9STV9CTE9DSzoxNjUsVktfRk9STUFUX0FTVENfNng2X1NSR0JfQkxPQ0s6MTY2LFZLX0ZPUk1BVF9BU1RDXzh4NV9VTk9STV9CTE9DSzoxNjcsVktfRk9STUFUX0FTVENfOHg1X1NSR0JfQkxPQ0s6MTY4LFZLX0ZPUk1BVF9BU1RDXzh4Nl9VTk9STV9CTE9DSzoxNjksVktfRk9STUFUX0FTVENfOHg2X1NSR0JfQkxPQ0s6MTcwLFZLX0ZPUk1BVF9BU1RDXzh4OF9VTk9STV9CTE9DSzoxNzEsVktfRk9STUFUX0FTVENfOHg4X1NSR0JfQkxPQ0s6MTcyLFZLX0ZPUk1BVF9BU1RDXzEweDVfVU5PUk1fQkxPQ0s6MTczLFZLX0ZPUk1BVF9BU1RDXzEweDVfU1JHQl9CTE9DSzoxNzQsVktfRk9STUFUX0FTVENfMTB4Nl9VTk9STV9CTE9DSzoxNzUsVktfRk9STUFUX0FTVENfMTB4Nl9TUkdCX0JMT0NLOjE3NixWS19GT1JNQVRfQVNUQ18xMHg4X1VOT1JNX0JMT0NLOjE3NyxWS19GT1JNQVRfQVNUQ18xMHg4X1NSR0JfQkxPQ0s6MTc4LFZLX0ZPUk1BVF9BU1RDXzEweDEwX1VOT1JNX0JMT0NLOjE3OSxWS19GT1JNQVRfQVNUQ18xMHgxMF9TUkdCX0JMT0NLOjE4MCxWS19GT1JNQVRfQVNUQ18xMngxMF9VTk9STV9CTE9DSzoxODEsVktfRk9STUFUX0FTVENfMTJ4MTBfU1JHQl9CTE9DSzoxODIsVktfRk9STUFUX0FTVENfMTJ4MTJfVU5PUk1fQkxPQ0s6MTgzLFZLX0ZPUk1BVF9BU1RDXzEyeDEyX1NSR0JfQkxPQ0s6MTg0LFZLX0ZPUk1BVF9HOEI4RzhSOF80MjJfVU5PUk06MTAwMDE1NmUzLFZLX0ZPUk1BVF9COEc4UjhHOF80MjJfVU5PUk06MTAwMDE1NjAwMSxWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQyMF9VTk9STToxMDAwMTU2MDAyLFZLX0ZPUk1BVF9HOF9COFI4XzJQTEFORV80MjBfVU5PUk06MTAwMDE1NjAwMyxWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQyMl9VTk9STToxMDAwMTU2MDA0LFZLX0ZPUk1BVF9HOF9COFI4XzJQTEFORV80MjJfVU5PUk06MTAwMDE1NjAwNSxWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQ0NF9VTk9STToxMDAwMTU2MDA2LFZLX0ZPUk1BVF9SMTBYNl9VTk9STV9QQUNLMTY6MTAwMDE1NjAwNyxWS19GT1JNQVRfUjEwWDZHMTBYNl9VTk9STV8yUEFDSzE2OjEwMDAxNTYwMDgsVktfRk9STUFUX1IxMFg2RzEwWDZCMTBYNkExMFg2X1VOT1JNXzRQQUNLMTY6MTAwMDE1NjAwOSxWS19GT1JNQVRfRzEwWDZCMTBYNkcxMFg2UjEwWDZfNDIyX1VOT1JNXzRQQUNLMTY6MTAwMDE1NjAxMCxWS19GT1JNQVRfQjEwWDZHMTBYNlIxMFg2RzEwWDZfNDIyX1VOT1JNXzRQQUNLMTY6MTAwMDE1NjAxMSxWS19GT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQyMF9VTk9STV8zUEFDSzE2OjEwMDAxNTYwMTIsVktfRk9STUFUX0cxMFg2X0IxMFg2UjEwWDZfMlBMQU5FXzQyMF9VTk9STV8zUEFDSzE2OjEwMDAxNTYwMTMsVktfRk9STUFUX0cxMFg2X0IxMFg2X1IxMFg2XzNQTEFORV80MjJfVU5PUk1fM1BBQ0sxNjoxMDAwMTU2MDE0LFZLX0ZPUk1BVF9HMTBYNl9CMTBYNlIxMFg2XzJQTEFORV80MjJfVU5PUk1fM1BBQ0sxNjoxMDAwMTU2MDE1LFZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDQ0X1VOT1JNXzNQQUNLMTY6MTAwMDE1NjAxNixWS19GT1JNQVRfUjEyWDRfVU5PUk1fUEFDSzE2OjEwMDAxNTYwMTcsVktfRk9STUFUX1IxMlg0RzEyWDRfVU5PUk1fMlBBQ0sxNjoxMDAwMTU2MDE4LFZLX0ZPUk1BVF9SMTJYNEcxMlg0QjEyWDRBMTJYNF9VTk9STV80UEFDSzE2OjEwMDAxNTYwMTksVktfRk9STUFUX0cxMlg0QjEyWDRHMTJYNFIxMlg0XzQyMl9VTk9STV80UEFDSzE2OjEwMDAxNTYwMjAsVktfRk9STUFUX0IxMlg0RzEyWDRSMTJYNEcxMlg0XzQyMl9VTk9STV80UEFDSzE2OjEwMDAxNTYwMjEsVktfRk9STUFUX0cxMlg0X0IxMlg0X1IxMlg0XzNQTEFORV80MjBfVU5PUk1fM1BBQ0sxNjoxMDAwMTU2MDIyLFZLX0ZPUk1BVF9HMTJYNF9CMTJYNFIxMlg0XzJQTEFORV80MjBfVU5PUk1fM1BBQ0sxNjoxMDAwMTU2MDIzLFZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDIyX1VOT1JNXzNQQUNLMTY6MTAwMDE1NjAyNCxWS19GT1JNQVRfRzEyWDRfQjEyWDRSMTJYNF8yUExBTkVfNDIyX1VOT1JNXzNQQUNLMTY6MTAwMDE1NjAyNSxWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQ0NF9VTk9STV8zUEFDSzE2OjEwMDAxNTYwMjYsVktfRk9STUFUX0cxNkIxNkcxNlIxNl80MjJfVU5PUk06MTAwMDE1NjAyNyxWS19GT1JNQVRfQjE2RzE2UjE2RzE2XzQyMl9VTk9STToxMDAwMTU2MDI4LFZLX0ZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDIwX1VOT1JNOjEwMDAxNTYwMjksVktfRk9STUFUX0cxNl9CMTZSMTZfMlBMQU5FXzQyMF9VTk9STToxMDAwMTU2MDMwLFZLX0ZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDIyX1VOT1JNOjEwMDAxNTYwMzEsVktfRk9STUFUX0cxNl9CMTZSMTZfMlBMQU5FXzQyMl9VTk9STToxMDAwMTU2MDMyLFZLX0ZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDQ0X1VOT1JNOjEwMDAxNTYwMzMsVktfRk9STUFUX1BWUlRDMV8yQlBQX1VOT1JNX0JMT0NLX0lNRzoxMDAwMDU0ZTMsVktfRk9STUFUX1BWUlRDMV80QlBQX1VOT1JNX0JMT0NLX0lNRzoxMDAwMDU0MDAxLFZLX0ZPUk1BVF9QVlJUQzJfMkJQUF9VTk9STV9CTE9DS19JTUc6MTAwMDA1NDAwMixWS19GT1JNQVRfUFZSVEMyXzRCUFBfVU5PUk1fQkxPQ0tfSU1HOjEwMDAwNTQwMDMsVktfRk9STUFUX1BWUlRDMV8yQlBQX1NSR0JfQkxPQ0tfSU1HOjEwMDAwNTQwMDQsVktfRk9STUFUX1BWUlRDMV80QlBQX1NSR0JfQkxPQ0tfSU1HOjEwMDAwNTQwMDUsVktfRk9STUFUX1BWUlRDMl8yQlBQX1NSR0JfQkxPQ0tfSU1HOjEwMDAwNTQwMDYsVktfRk9STUFUX1BWUlRDMl80QlBQX1NSR0JfQkxPQ0tfSU1HOjEwMDAwNTQwMDcsVktfRk9STUFUX0FTVENfNHg0X1NGTE9BVF9CTE9DS19FWFQ6MTAwMDA2NmUzLFZLX0ZPUk1BVF9BU1RDXzV4NF9TRkxPQVRfQkxPQ0tfRVhUOjEwMDAwNjYwMDEsVktfRk9STUFUX0FTVENfNXg1X1NGTE9BVF9CTE9DS19FWFQ6MTAwMDA2NjAwMixWS19GT1JNQVRfQVNUQ182eDVfU0ZMT0FUX0JMT0NLX0VYVDoxMDAwMDY2MDAzLFZLX0ZPUk1BVF9BU1RDXzZ4Nl9TRkxPQVRfQkxPQ0tfRVhUOjEwMDAwNjYwMDQsVktfRk9STUFUX0FTVENfOHg1X1NGTE9BVF9CTE9DS19FWFQ6MTAwMDA2NjAwNSxWS19GT1JNQVRfQVNUQ184eDZfU0ZMT0FUX0JMT0NLX0VYVDoxMDAwMDY2MDA2LFZLX0ZPUk1BVF9BU1RDXzh4OF9TRkxPQVRfQkxPQ0tfRVhUOjEwMDAwNjYwMDcsVktfRk9STUFUX0FTVENfMTB4NV9TRkxPQVRfQkxPQ0tfRVhUOjEwMDAwNjYwMDgsVktfRk9STUFUX0FTVENfMTB4Nl9TRkxPQVRfQkxPQ0tfRVhUOjEwMDAwNjYwMDksVktfRk9STUFUX0FTVENfMTB4OF9TRkxPQVRfQkxPQ0tfRVhUOjEwMDAwNjYwMTAsVktfRk9STUFUX0FTVENfMTB4MTBfU0ZMT0FUX0JMT0NLX0VYVDoxMDAwMDY2MDExLFZLX0ZPUk1BVF9BU1RDXzEyeDEwX1NGTE9BVF9CTE9DS19FWFQ6MTAwMDA2NjAxMixWS19GT1JNQVRfQVNUQ18xMngxMl9TRkxPQVRfQkxPQ0tfRVhUOjEwMDAwNjYwMTMsVktfRk9STUFUX0c4QjhHOFI4XzQyMl9VTk9STV9LSFI6MTAwMDE1NmUzLFZLX0ZPUk1BVF9COEc4UjhHOF80MjJfVU5PUk1fS0hSOjEwMDAxNTYwMDEsVktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80MjBfVU5PUk1fS0hSOjEwMDAxNTYwMDIsVktfRk9STUFUX0c4X0I4UjhfMlBMQU5FXzQyMF9VTk9STV9LSFI6MTAwMDE1NjAwMyxWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQyMl9VTk9STV9LSFI6MTAwMDE1NjAwNCxWS19GT1JNQVRfRzhfQjhSOF8yUExBTkVfNDIyX1VOT1JNX0tIUjoxMDAwMTU2MDA1LFZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDQ0X1VOT1JNX0tIUjoxMDAwMTU2MDA2LFZLX0ZPUk1BVF9SMTBYNl9VTk9STV9QQUNLMTZfS0hSOjEwMDAxNTYwMDcsVktfRk9STUFUX1IxMFg2RzEwWDZfVU5PUk1fMlBBQ0sxNl9LSFI6MTAwMDE1NjAwOCxWS19GT1JNQVRfUjEwWDZHMTBYNkIxMFg2QTEwWDZfVU5PUk1fNFBBQ0sxNl9LSFI6MTAwMDE1NjAwOSxWS19GT1JNQVRfRzEwWDZCMTBYNkcxMFg2UjEwWDZfNDIyX1VOT1JNXzRQQUNLMTZfS0hSOjEwMDAxNTYwMTAsVktfRk9STUFUX0IxMFg2RzEwWDZSMTBYNkcxMFg2XzQyMl9VTk9STV80UEFDSzE2X0tIUjoxMDAwMTU2MDExLFZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDIwX1VOT1JNXzNQQUNLMTZfS0hSOjEwMDAxNTYwMTIsVktfRk9STUFUX0cxMFg2X0IxMFg2UjEwWDZfMlBMQU5FXzQyMF9VTk9STV8zUEFDSzE2X0tIUjoxMDAwMTU2MDEzLFZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDIyX1VOT1JNXzNQQUNLMTZfS0hSOjEwMDAxNTYwMTQsVktfRk9STUFUX0cxMFg2X0IxMFg2UjEwWDZfMlBMQU5FXzQyMl9VTk9STV8zUEFDSzE2X0tIUjoxMDAwMTU2MDE1LFZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDQ0X1VOT1JNXzNQQUNLMTZfS0hSOjEwMDAxNTYwMTYsVktfRk9STUFUX1IxMlg0X1VOT1JNX1BBQ0sxNl9LSFI6MTAwMDE1NjAxNyxWS19GT1JNQVRfUjEyWDRHMTJYNF9VTk9STV8yUEFDSzE2X0tIUjoxMDAwMTU2MDE4LFZLX0ZPUk1BVF9SMTJYNEcxMlg0QjEyWDRBMTJYNF9VTk9STV80UEFDSzE2X0tIUjoxMDAwMTU2MDE5LFZLX0ZPUk1BVF9HMTJYNEIxMlg0RzEyWDRSMTJYNF80MjJfVU5PUk1fNFBBQ0sxNl9LSFI6MTAwMDE1NjAyMCxWS19GT1JNQVRfQjEyWDRHMTJYNFIxMlg0RzEyWDRfNDIyX1VOT1JNXzRQQUNLMTZfS0hSOjEwMDAxNTYwMjEsVktfRk9STUFUX0cxMlg0X0IxMlg0X1IxMlg0XzNQTEFORV80MjBfVU5PUk1fM1BBQ0sxNl9LSFI6MTAwMDE1NjAyMixWS19GT1JNQVRfRzEyWDRfQjEyWDRSMTJYNF8yUExBTkVfNDIwX1VOT1JNXzNQQUNLMTZfS0hSOjEwMDAxNTYwMjMsVktfRk9STUFUX0cxMlg0X0IxMlg0X1IxMlg0XzNQTEFORV80MjJfVU5PUk1fM1BBQ0sxNl9LSFI6MTAwMDE1NjAyNCxWS19GT1JNQVRfRzEyWDRfQjEyWDRSMTJYNF8yUExBTkVfNDIyX1VOT1JNXzNQQUNLMTZfS0hSOjEwMDAxNTYwMjUsVktfRk9STUFUX0cxMlg0X0IxMlg0X1IxMlg0XzNQTEFORV80NDRfVU5PUk1fM1BBQ0sxNl9LSFI6MTAwMDE1NjAyNixWS19GT1JNQVRfRzE2QjE2RzE2UjE2XzQyMl9VTk9STV9LSFI6MTAwMDE1NjAyNyxWS19GT1JNQVRfQjE2RzE2UjE2RzE2XzQyMl9VTk9STV9LSFI6MTAwMDE1NjAyOCxWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQyMF9VTk9STV9LSFI6MTAwMDE1NjAyOSxWS19GT1JNQVRfRzE2X0IxNlIxNl8yUExBTkVfNDIwX1VOT1JNX0tIUjoxMDAwMTU2MDMwLFZLX0ZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDIyX1VOT1JNX0tIUjoxMDAwMTU2MDMxLFZLX0ZPUk1BVF9HMTZfQjE2UjE2XzJQTEFORV80MjJfVU5PUk1fS0hSOjEwMDAxNTYwMzIsVktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80NDRfVU5PUk1fS0hSOjEwMDAxNTYwMzN9LGh1PU9iamVjdC5mcmVlemUoaDgpfSk7ZnVuY3Rpb24gTlModCl7cmV0dXJuIHR5cGVvZiBUZXh0RGVjb2RlcjwidSI/bmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHQpOkJ1ZmZlci5mcm9tKHQpLnRvU3RyaW5nKCJ1dGY4Iil9ZnVuY3Rpb24gSVModCl7bGV0IGU9bmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsdC5ieXRlT2Zmc2V0LEdvLmxlbmd0aCk7aWYoZVswXSE9PUdvWzBdfHxlWzFdIT09R29bMV18fGVbMl0hPT1Hb1syXXx8ZVszXSE9PUdvWzNdfHxlWzRdIT09R29bNF18fGVbNV0hPT1Hb1s1XXx8ZVs2XSE9PUdvWzZdfHxlWzddIT09R29bN118fGVbOF0hPT1Hb1s4XXx8ZVs5XSE9PUdvWzldfHxlWzEwXSE9PUdvWzEwXXx8ZVsxMV0hPT1Hb1sxMV0pdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIEtUWCAyLjAgaWRlbnRpZmllci4iKTtsZXQgbj1uZXcgUWcsbz0xNypVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCxyPW5ldyBQYyh0LEdvLmxlbmd0aCxvLCEwKTtuLnZrRm9ybWF0PXIuX25leHRVaW50MzIoKSxuLnR5cGVTaXplPXIuX25leHRVaW50MzIoKSxuLnBpeGVsV2lkdGg9ci5fbmV4dFVpbnQzMigpLG4ucGl4ZWxIZWlnaHQ9ci5fbmV4dFVpbnQzMigpLG4ucGl4ZWxEZXB0aD1yLl9uZXh0VWludDMyKCksbi5sYXllckNvdW50PXIuX25leHRVaW50MzIoKSxuLmZhY2VDb3VudD1yLl9uZXh0VWludDMyKCk7bGV0IGk9ci5fbmV4dFVpbnQzMigpO24uc3VwZXJjb21wcmVzc2lvblNjaGVtZT1yLl9uZXh0VWludDMyKCk7bGV0IHM9ci5fbmV4dFVpbnQzMigpLGY9ci5fbmV4dFVpbnQzMigpLHU9ci5fbmV4dFVpbnQzMigpLGM9ci5fbmV4dFVpbnQzMigpLGw9ci5fbmV4dFVpbnQ2NCgpLHA9ci5fbmV4dFVpbnQ2NCgpLGQ9aSozKjgsbT1uZXcgUGModCxHby5sZW5ndGgrbyxkLCEwKTtmb3IobGV0IFg9MDtYPGk7WCsrKW4ubGV2ZWxzLnB1c2goe2xldmVsRGF0YTpuZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQrbS5fbmV4dFVpbnQ2NCgpLG0uX25leHRVaW50NjQoKSksdW5jb21wcmVzc2VkQnl0ZUxlbmd0aDptLl9uZXh0VWludDY0KCl9KTtsZXQgXz1uZXcgUGModCxzLGYsITApLGc9e3ZlbmRvcklkOl8uX3NraXAoNCkuX25leHRVaW50MTYoKSxkZXNjcmlwdG9yVHlwZTpfLl9uZXh0VWludDE2KCksdmVyc2lvbk51bWJlcjpfLl9uZXh0VWludDE2KCksZGVzY3JpcHRvckJsb2NrU2l6ZTpfLl9uZXh0VWludDE2KCksY29sb3JNb2RlbDpfLl9uZXh0VWludDgoKSxjb2xvclByaW1hcmllczpfLl9uZXh0VWludDgoKSx0cmFuc2ZlckZ1bmN0aW9uOl8uX25leHRVaW50OCgpLGZsYWdzOl8uX25leHRVaW50OCgpLHRleGVsQmxvY2tEaW1lbnNpb246W18uX25leHRVaW50OCgpLF8uX25leHRVaW50OCgpLF8uX25leHRVaW50OCgpLF8uX25leHRVaW50OCgpXSxieXRlc1BsYW5lOltfLl9uZXh0VWludDgoKSxfLl9uZXh0VWludDgoKSxfLl9uZXh0VWludDgoKSxfLl9uZXh0VWludDgoKSxfLl9uZXh0VWludDgoKSxfLl9uZXh0VWludDgoKSxfLl9uZXh0VWludDgoKSxfLl9uZXh0VWludDgoKV0sc2FtcGxlczpbXX0sTz0oZy5kZXNjcmlwdG9yQmxvY2tTaXplLzQtNikvNDtmb3IobGV0IFg9MDtYPE87WCsrKXtsZXQgUj17Yml0T2Zmc2V0Ol8uX25leHRVaW50MTYoKSxiaXRMZW5ndGg6Xy5fbmV4dFVpbnQ4KCksY2hhbm5lbFR5cGU6Xy5fbmV4dFVpbnQ4KCksc2FtcGxlUG9zaXRpb246W18uX25leHRVaW50OCgpLF8uX25leHRVaW50OCgpLF8uX25leHRVaW50OCgpLF8uX25leHRVaW50OCgpXSxzYW1wbGVMb3dlcjotMS8wLHNhbXBsZVVwcGVyOjEvMH07Ui5jaGFubmVsVHlwZSY2ND8oUi5zYW1wbGVMb3dlcj1fLl9uZXh0SW50MzIoKSxSLnNhbXBsZVVwcGVyPV8uX25leHRJbnQzMigpKTooUi5zYW1wbGVMb3dlcj1fLl9uZXh0VWludDMyKCksUi5zYW1wbGVVcHBlcj1fLl9uZXh0VWludDMyKCkpLGcuc2FtcGxlc1tYXT1SfW4uZGF0YUZvcm1hdERlc2NyaXB0b3IubGVuZ3RoPTAsbi5kYXRhRm9ybWF0RGVzY3JpcHRvci5wdXNoKGcpO2xldCBFPW5ldyBQYyh0LHUsYywhMCk7Zm9yKDtFLl9vZmZzZXQ8Yzspe2xldCBYPUUuX25leHRVaW50MzIoKSxSPUUuX3NjYW4oWCksb3Q9TlMoUik7aWYobi5rZXlWYWx1ZVtvdF09RS5fbmV4dFVpbnQ4QXJyYXkoWC1SLmJ5dGVMZW5ndGgtMSksb3QubWF0Y2goL15rdHgvaSkpe2xldCBwdD1OUyhuLmtleVZhbHVlW290XSk7bi5rZXlWYWx1ZVtvdF09cHQuc3Vic3RyaW5nKDAscHQubGFzdEluZGV4T2YoIlwwIikpfWxldCBjdD1YJTQ/NC1YJTQ6MDtFLl9za2lwKGN0KX1pZihwPD0wKXJldHVybiBuO2xldCBUPW5ldyBQYyh0LGwscCwhMCksQz1ULl9uZXh0VWludDE2KCksTj1ULl9uZXh0VWludDE2KCksST1ULl9uZXh0VWludDMyKCksRD1ULl9uZXh0VWludDMyKCksdj1ULl9uZXh0VWludDMyKCksTD1ULl9uZXh0VWludDMyKCksVT1bXTtmb3IobGV0IFg9MDtYPGk7WCsrKVUucHVzaCh7aW1hZ2VGbGFnczpULl9uZXh0VWludDMyKCkscmdiU2xpY2VCeXRlT2Zmc2V0OlQuX25leHRVaW50MzIoKSxyZ2JTbGljZUJ5dGVMZW5ndGg6VC5fbmV4dFVpbnQzMigpLGFscGhhU2xpY2VCeXRlT2Zmc2V0OlQuX25leHRVaW50MzIoKSxhbHBoYVNsaWNlQnl0ZUxlbmd0aDpULl9uZXh0VWludDMyKCl9KTtsZXQgQT1sK1QuX29mZnNldCxTPUErSSxQPVMrRCxCPVArdixqPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLHQuYnl0ZU9mZnNldCtBLEkpLEg9bmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsdC5ieXRlT2Zmc2V0K1MsRCksaz1uZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQrUCx2KSxLPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLHQuYnl0ZU9mZnNldCtCLEwpO3JldHVybiBuLmdsb2JhbERhdGE9e2VuZHBvaW50Q291bnQ6QyxzZWxlY3RvckNvdW50Ok4saW1hZ2VEZXNjczpVLGVuZHBvaW50c0RhdGE6aixzZWxlY3RvcnNEYXRhOkgsdGFibGVzRGF0YTprLGV4dGVuZGVkRGF0YTpLfSxufXZhciBRZyxQYyxnbHQsR28sdlM9WigoKT0+e1FnPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy52a0Zvcm1hdD0wLHRoaXMudHlwZVNpemU9MSx0aGlzLnBpeGVsV2lkdGg9MCx0aGlzLnBpeGVsSGVpZ2h0PTAsdGhpcy5waXhlbERlcHRoPTAsdGhpcy5sYXllckNvdW50PTAsdGhpcy5mYWNlQ291bnQ9MSx0aGlzLnN1cGVyY29tcHJlc3Npb25TY2hlbWU9MCx0aGlzLmxldmVscz1bXSx0aGlzLmRhdGFGb3JtYXREZXNjcmlwdG9yPVt7dmVuZG9ySWQ6MCxkZXNjcmlwdG9yVHlwZTowLGRlc2NyaXB0b3JCbG9ja1NpemU6MCx2ZXJzaW9uTnVtYmVyOjIsY29sb3JNb2RlbDowLGNvbG9yUHJpbWFyaWVzOjEsdHJhbnNmZXJGdW5jdGlvbjoyLGZsYWdzOjAsdGV4ZWxCbG9ja0RpbWVuc2lvbjpbMCwwLDAsMF0sYnl0ZXNQbGFuZTpbMCwwLDAsMCwwLDAsMCwwXSxzYW1wbGVzOltdfV0sdGhpcy5rZXlWYWx1ZT17fSx0aGlzLmdsb2JhbERhdGE9bnVsbH19LFBjPWNsYXNze2NvbnN0cnVjdG9yKGUsbixvLHIpe3RoaXMuX2RhdGFWaWV3PXZvaWQgMCx0aGlzLl9saXR0bGVFbmRpYW49dm9pZCAwLHRoaXMuX29mZnNldD12b2lkIDAsdGhpcy5fZGF0YVZpZXc9bmV3IERhdGFWaWV3KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCtuLG8pLHRoaXMuX2xpdHRsZUVuZGlhbj1yLHRoaXMuX29mZnNldD0wfV9uZXh0VWludDgoKXtsZXQgZT10aGlzLl9kYXRhVmlldy5nZXRVaW50OCh0aGlzLl9vZmZzZXQpO3JldHVybiB0aGlzLl9vZmZzZXQrPTEsZX1fbmV4dFVpbnQxNigpe2xldCBlPXRoaXMuX2RhdGFWaWV3LmdldFVpbnQxNih0aGlzLl9vZmZzZXQsdGhpcy5fbGl0dGxlRW5kaWFuKTtyZXR1cm4gdGhpcy5fb2Zmc2V0Kz0yLGV9X25leHRVaW50MzIoKXtsZXQgZT10aGlzLl9kYXRhVmlldy5nZXRVaW50MzIodGhpcy5fb2Zmc2V0LHRoaXMuX2xpdHRsZUVuZGlhbik7cmV0dXJuIHRoaXMuX29mZnNldCs9NCxlfV9uZXh0VWludDY0KCl7bGV0IGU9dGhpcy5fZGF0YVZpZXcuZ2V0VWludDMyKHRoaXMuX29mZnNldCx0aGlzLl9saXR0bGVFbmRpYW4pLG49dGhpcy5fZGF0YVZpZXcuZ2V0VWludDMyKHRoaXMuX29mZnNldCs0LHRoaXMuX2xpdHRsZUVuZGlhbiksbz1lKzIqKjMyKm47cmV0dXJuIHRoaXMuX29mZnNldCs9OCxvfV9uZXh0SW50MzIoKXtsZXQgZT10aGlzLl9kYXRhVmlldy5nZXRJbnQzMih0aGlzLl9vZmZzZXQsdGhpcy5fbGl0dGxlRW5kaWFuKTtyZXR1cm4gdGhpcy5fb2Zmc2V0Kz00LGV9X25leHRVaW50OEFycmF5KGUpe2xldCBuPW5ldyBVaW50OEFycmF5KHRoaXMuX2RhdGFWaWV3LmJ1ZmZlcix0aGlzLl9kYXRhVmlldy5ieXRlT2Zmc2V0K3RoaXMuX29mZnNldCxlKTtyZXR1cm4gdGhpcy5fb2Zmc2V0Kz1lLG59X3NraXAoZSl7cmV0dXJuIHRoaXMuX29mZnNldCs9ZSx0aGlzfV9zY2FuKGUsbj0wKXtsZXQgbz10aGlzLl9vZmZzZXQscj0wO2Zvcig7dGhpcy5fZGF0YVZpZXcuZ2V0VWludDgodGhpcy5fb2Zmc2V0KSE9PW4mJnI8ZTspcisrLHRoaXMuX29mZnNldCsrO3JldHVybiByPGUmJnRoaXMuX29mZnNldCsrLG5ldyBVaW50OEFycmF5KHRoaXMuX2RhdGFWaWV3LmJ1ZmZlcix0aGlzLl9kYXRhVmlldy5ieXRlT2Zmc2V0K28scil9fSxnbHQ9bmV3IFVpbnQ4QXJyYXkoWzBdKSxHbz1bMTcxLDc1LDg0LDg4LDMyLDUwLDQ4LDE4NywxMywxMCwyNiwxMF19KTt2YXIgTFM9Vm4oKG1tLHQxKT0+e3ZhciBKZz1mdW5jdGlvbigpe3ZhciB0PXR5cGVvZiBkb2N1bWVudDwidSImJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM6dm9pZCAwO3JldHVybiB0eXBlb2YgX19maWxlbmFtZTwidSImJih0PXR8fF9fZmlsZW5hbWUpLGZ1bmN0aW9uKGUpe2U9ZXx8e307dmFyIG49dHlwZW9mIGU8InUiP2U6e30sbyxyO24ucmVhZHk9bmV3IFByb21pc2UoZnVuY3Rpb24oVixHKXtvPVYscj1HfSk7dmFyIGk9e30scztmb3IocyBpbiBuKW4uaGFzT3duUHJvcGVydHkocykmJihpW3NdPW5bc10pO3ZhciBmPVtdLHU9Ii4vdGhpcy5wcm9ncmFtIixjPWZ1bmN0aW9uKFYsRyl7dGhyb3cgR30sbD0hMSxwPSExLGQ9ITEsbT0hMTtsPXR5cGVvZiB3aW5kb3c9PSJvYmplY3QiLHA9dHlwZW9mIGltcG9ydFNjcmlwdHM9PSJmdW5jdGlvbiIsZD10eXBlb2YgcHJvY2Vzcz09Im9iamVjdCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zPT0ib2JqZWN0IiYmdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZT09InN0cmluZyIsbT0hbCYmIWQmJiFwO3ZhciBfPSIiO2Z1bmN0aW9uIGcoVil7cmV0dXJuIG4ubG9jYXRlRmlsZT9uLmxvY2F0ZUZpbGUoVixfKTpfK1Z9dmFyIGIsdyxPLEUsVCxDO2Q/KHA/Xz1kcigicGF0aCIpLmRpcm5hbWUoXykrIi8iOl89X19kaXJuYW1lKyIvIixiPWZ1bmN0aW9uKEcsWSl7cmV0dXJuIFR8fChUPWRyKCJmcyIpKSxDfHwoQz1kcigicGF0aCIpKSxHPUMubm9ybWFsaXplKEcpLFQucmVhZEZpbGVTeW5jKEcsWT9udWxsOiJ1dGY4Iil9LE89ZnVuY3Rpb24oRyl7dmFyIFk9YihHLCEwKTtyZXR1cm4gWS5idWZmZXJ8fChZPW5ldyBVaW50OEFycmF5KFkpKSxCKFkuYnVmZmVyKSxZfSxwcm9jZXNzLmFyZ3YubGVuZ3RoPjEmJih1PXByb2Nlc3MuYXJndlsxXS5yZXBsYWNlKC9cXC9nLCIvIikpLGY9cHJvY2Vzcy5hcmd2LnNsaWNlKDIpLHByb2Nlc3Mub24oInVuY2F1Z2h0RXhjZXB0aW9uIixmdW5jdGlvbihWKXtpZighKFYgaW5zdGFuY2VvZiBPaSkpdGhyb3cgVn0pLHByb2Nlc3Mub24oInVuaGFuZGxlZFJlamVjdGlvbiIsS2UpLGM9ZnVuY3Rpb24oVil7cHJvY2Vzcy5leGl0KFYpfSxuLmluc3BlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4iW0Vtc2NyaXB0ZW4gTW9kdWxlIG9iamVjdF0ifSk6bT8odHlwZW9mIHJlYWQ8InUiJiYoYj1mdW5jdGlvbihHKXtyZXR1cm4gcmVhZChHKX0pLE89ZnVuY3Rpb24oRyl7dmFyIFk7cmV0dXJuIHR5cGVvZiByZWFkYnVmZmVyPT0iZnVuY3Rpb24iP25ldyBVaW50OEFycmF5KHJlYWRidWZmZXIoRykpOihZPXJlYWQoRywiYmluYXJ5IiksQih0eXBlb2YgWT09Im9iamVjdCIpLFkpfSx0eXBlb2Ygc2NyaXB0QXJnczwidSI/Zj1zY3JpcHRBcmdzOnR5cGVvZiBhcmd1bWVudHM8InUiJiYoZj1hcmd1bWVudHMpLHR5cGVvZiBxdWl0PT0iZnVuY3Rpb24iJiYoYz1mdW5jdGlvbihWKXtxdWl0KFYpfSksdHlwZW9mIHByaW50PCJ1IiYmKHR5cGVvZiBjb25zb2xlPiJ1IiYmKGNvbnNvbGU9e30pLGNvbnNvbGUubG9nPXByaW50LGNvbnNvbGUud2Fybj1jb25zb2xlLmVycm9yPXR5cGVvZiBwcmludEVycjwidSI/cHJpbnRFcnI6cHJpbnQpKToobHx8cCkmJihwP189c2VsZi5sb2NhdGlvbi5ocmVmOnR5cGVvZiBkb2N1bWVudDwidSImJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQmJihfPWRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjKSx0JiYoXz10KSxfLmluZGV4T2YoImJsb2I6IikhPT0wP189Xy5zdWJzdHIoMCxfLmxhc3RJbmRleE9mKCIvIikrMSk6Xz0iIixiPWZ1bmN0aW9uKFYpe3ZhciBHPW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4gRy5vcGVuKCJHRVQiLFYsITEpLEcuc2VuZChudWxsKSxHLnJlc3BvbnNlVGV4dH0scCYmKE89ZnVuY3Rpb24oVil7dmFyIEc9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiBHLm9wZW4oIkdFVCIsViwhMSksRy5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixHLnNlbmQobnVsbCksbmV3IFVpbnQ4QXJyYXkoRy5yZXNwb25zZSl9KSx3PWZ1bmN0aW9uKFYsRyxZKXt2YXIgUT1uZXcgWE1MSHR0cFJlcXVlc3Q7US5vcGVuKCJHRVQiLFYsITApLFEucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsUS5vbmxvYWQ9ZnVuY3Rpb24oKXtpZihRLnN0YXR1cz09MjAwfHxRLnN0YXR1cz09MCYmUS5yZXNwb25zZSl7RyhRLnJlc3BvbnNlKTtyZXR1cm59WSgpfSxRLm9uZXJyb3I9WSxRLnNlbmQobnVsbCl9LEU9ZnVuY3Rpb24oVil7ZG9jdW1lbnQudGl0bGU9Vn0pO3ZhciBOPW4ucHJpbnR8fGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksST1uLnByaW50RXJyfHxjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtmb3IocyBpbiBpKWkuaGFzT3duUHJvcGVydHkocykmJihuW3NdPWlbc10pO2k9bnVsbCxuLmFyZ3VtZW50cyYmKGY9bi5hcmd1bWVudHMpLG4udGhpc1Byb2dyYW0mJih1PW4udGhpc1Byb2dyYW0pLG4ucXVpdCYmKGM9bi5xdWl0KTt2YXIgRD0wLHY9ZnVuY3Rpb24oVil7RD1WfSxMO24ud2FzbUJpbmFyeSYmKEw9bi53YXNtQmluYXJ5KTt2YXIgVT1uLm5vRXhpdFJ1bnRpbWV8fCEwO3R5cGVvZiBXZWJBc3NlbWJseSE9Im9iamVjdCImJktlKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7dmFyIEEsUz0hMSxQO2Z1bmN0aW9uIEIoVixHKXtWfHxLZSgiQXNzZXJ0aW9uIGZhaWxlZDogIitHKX12YXIgaj10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMDtmdW5jdGlvbiBIKFYsRyxZKXtmb3IodmFyIFE9RytZLGx0PUc7VltsdF0mJiEobHQ+PVEpOykrK2x0O2lmKGx0LUc+MTYmJlYuc3ViYXJyYXkmJmopcmV0dXJuIGouZGVjb2RlKFYuc3ViYXJyYXkoRyxsdCkpO2Zvcih2YXIgT3Q9IiI7RzxsdDspe3ZhciBSdD1WW0crK107aWYoIShSdCYxMjgpKXtPdCs9U3RyaW5nLmZyb21DaGFyQ29kZShSdCk7Y29udGludWV9dmFyIGh0PVZbRysrXSY2MztpZigoUnQmMjI0KT09MTkyKXtPdCs9U3RyaW5nLmZyb21DaGFyQ29kZSgoUnQmMzEpPDw2fGh0KTtjb250aW51ZX12YXIgX3Q9VltHKytdJjYzO2lmKChSdCYyNDApPT0yMjQ/UnQ9KFJ0JjE1KTw8MTJ8aHQ8PDZ8X3Q6UnQ9KFJ0JjcpPDwxOHxodDw8MTJ8X3Q8PDZ8VltHKytdJjYzLFJ0PDY1NTM2KU90Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKFJ0KTtlbHNle3ZhciBLdD1SdC02NTUzNjtPdCs9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxLdD4+MTAsNTYzMjB8S3QmMTAyMyl9fXJldHVybiBPdH1mdW5jdGlvbiBrKFYsRyl7cmV0dXJuIFY/SCh2dCxWLEcpOiIifWZ1bmN0aW9uIEsoVixHLFksUSl7aWYoIShRPjApKXJldHVybiAwO2Zvcih2YXIgbHQ9WSxPdD1ZK1EtMSxSdD0wO1J0PFYubGVuZ3RoOysrUnQpe3ZhciBodD1WLmNoYXJDb2RlQXQoUnQpO2lmKGh0Pj01NTI5NiYmaHQ8PTU3MzQzKXt2YXIgX3Q9Vi5jaGFyQ29kZUF0KCsrUnQpO2h0PTY1NTM2KygoaHQmMTAyMyk8PDEwKXxfdCYxMDIzfWlmKGh0PD0xMjcpe2lmKFk+PU90KWJyZWFrO0dbWSsrXT1odH1lbHNlIGlmKGh0PD0yMDQ3KXtpZihZKzE+PU90KWJyZWFrO0dbWSsrXT0xOTJ8aHQ+PjYsR1tZKytdPTEyOHxodCY2M31lbHNlIGlmKGh0PD02NTUzNSl7aWYoWSsyPj1PdClicmVhaztHW1krK109MjI0fGh0Pj4xMixHW1krK109MTI4fGh0Pj42JjYzLEdbWSsrXT0xMjh8aHQmNjN9ZWxzZXtpZihZKzM+PU90KWJyZWFrO0dbWSsrXT0yNDB8aHQ+PjE4LEdbWSsrXT0xMjh8aHQ+PjEyJjYzLEdbWSsrXT0xMjh8aHQ+PjYmNjMsR1tZKytdPTEyOHxodCY2M319cmV0dXJuIEdbWV09MCxZLWx0fWZ1bmN0aW9uIFgoVixHLFkpe3JldHVybiBLKFYsdnQsRyxZKX1mdW5jdGlvbiBSKFYpe2Zvcih2YXIgRz0wLFk9MDtZPFYubGVuZ3RoOysrWSl7dmFyIFE9Vi5jaGFyQ29kZUF0KFkpO1E+PTU1Mjk2JiZRPD01NzM0MyYmKFE9NjU1MzYrKChRJjEwMjMpPDwxMCl8Vi5jaGFyQ29kZUF0KCsrWSkmMTAyMyksUTw9MTI3PysrRzpRPD0yMDQ3P0crPTI6UTw9NjU1MzU/Rys9MzpHKz00fXJldHVybiBHfXZhciBvdD10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmLTE2bGUiKTp2b2lkIDA7ZnVuY3Rpb24gY3QoVixHKXtmb3IodmFyIFk9VixRPVk+PjEsbHQ9UStHLzI7IShRPj1sdCkmJm1lW1FdOykrK1E7aWYoWT1RPDwxLFktVj4zMiYmb3QpcmV0dXJuIG90LmRlY29kZSh2dC5zdWJhcnJheShWLFkpKTtmb3IodmFyIE90PSIiLFJ0PTA7IShSdD49Ry8yKTsrK1J0KXt2YXIgaHQ9enRbVitSdCoyPj4xXTtpZihodD09MClicmVhaztPdCs9U3RyaW5nLmZyb21DaGFyQ29kZShodCl9cmV0dXJuIE90fWZ1bmN0aW9uIHB0KFYsRyxZKXtpZihZPT09dm9pZCAwJiYoWT0yMTQ3NDgzNjQ3KSxZPDIpcmV0dXJuIDA7WS09Mjtmb3IodmFyIFE9RyxsdD1ZPFYubGVuZ3RoKjI/WS8yOlYubGVuZ3RoLE90PTA7T3Q8bHQ7KytPdCl7dmFyIFJ0PVYuY2hhckNvZGVBdChPdCk7enRbRz4+MV09UnQsRys9Mn1yZXR1cm4genRbRz4+MV09MCxHLVF9ZnVuY3Rpb24geXQoVil7cmV0dXJuIFYubGVuZ3RoKjJ9ZnVuY3Rpb24gcnQoVixHKXtmb3IodmFyIFk9MCxRPSIiOyEoWT49Ry80KTspe3ZhciBsdD1jZVtWK1kqND4+Ml07aWYobHQ9PTApYnJlYWs7aWYoKytZLGx0Pj02NTUzNil7dmFyIE90PWx0LTY1NTM2O1ErPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8T3Q+PjEwLDU2MzIwfE90JjEwMjMpfWVsc2UgUSs9U3RyaW5nLmZyb21DaGFyQ29kZShsdCl9cmV0dXJuIFF9ZnVuY3Rpb24gUHQoVixHLFkpe2lmKFk9PT12b2lkIDAmJihZPTIxNDc0ODM2NDcpLFk8NClyZXR1cm4gMDtmb3IodmFyIFE9RyxsdD1RK1ktNCxPdD0wO090PFYubGVuZ3RoOysrT3Qpe3ZhciBSdD1WLmNoYXJDb2RlQXQoT3QpO2lmKFJ0Pj01NTI5NiYmUnQ8PTU3MzQzKXt2YXIgaHQ9Vi5jaGFyQ29kZUF0KCsrT3QpO1J0PTY1NTM2KygoUnQmMTAyMyk8PDEwKXxodCYxMDIzfWlmKGNlW0c+PjJdPVJ0LEcrPTQsRys0Pmx0KWJyZWFrfXJldHVybiBjZVtHPj4yXT0wLEctUX1mdW5jdGlvbiBndChWKXtmb3IodmFyIEc9MCxZPTA7WTxWLmxlbmd0aDsrK1kpe3ZhciBRPVYuY2hhckNvZGVBdChZKTtRPj01NTI5NiYmUTw9NTczNDMmJisrWSxHKz00fXJldHVybiBHfWZ1bmN0aW9uIEN0KFYsRyl7cmV0dXJuIFYlRz4wJiYoVis9Ry1WJUcpLFZ9dmFyIG10LHV0LHZ0LHp0LG1lLGNlLHBlLHVlLFF0O2Z1bmN0aW9uIEp0KFYpe210PVYsbi5IRUFQOD11dD1uZXcgSW50OEFycmF5KFYpLG4uSEVBUDE2PXp0PW5ldyBJbnQxNkFycmF5KFYpLG4uSEVBUDMyPWNlPW5ldyBJbnQzMkFycmF5KFYpLG4uSEVBUFU4PXZ0PW5ldyBVaW50OEFycmF5KFYpLG4uSEVBUFUxNj1tZT1uZXcgVWludDE2QXJyYXkoViksbi5IRUFQVTMyPXBlPW5ldyBVaW50MzJBcnJheShWKSxuLkhFQVBGMzI9dWU9bmV3IEZsb2F0MzJBcnJheShWKSxuLkhFQVBGNjQ9UXQ9bmV3IEZsb2F0NjRBcnJheShWKX12YXIgeGU9bi5JTklUSUFMX01FTU9SWXx8MTY3NzcyMTYsZ2UsRWU9W10sdW49W10sa2U9W10sYmU9W10sbG49ITE7ZnVuY3Rpb24gcG4oKXtpZihuLnByZVJ1bilmb3IodHlwZW9mIG4ucHJlUnVuPT0iZnVuY3Rpb24iJiYobi5wcmVSdW49W24ucHJlUnVuXSk7bi5wcmVSdW4ubGVuZ3RoOylHZShuLnByZVJ1bi5zaGlmdCgpKTtqbyhFZSl9ZnVuY3Rpb24gT24oKXtsbj0hMCxqbyh1bil9ZnVuY3Rpb24gcmUoKXtqbyhrZSl9ZnVuY3Rpb24gJHQoKXtpZihuLnBvc3RSdW4pZm9yKHR5cGVvZiBuLnBvc3RSdW49PSJmdW5jdGlvbiImJihuLnBvc3RSdW49W24ucG9zdFJ1bl0pO24ucG9zdFJ1bi5sZW5ndGg7KXNuKG4ucG9zdFJ1bi5zaGlmdCgpKTtqbyhiZSl9ZnVuY3Rpb24gR2UoVil7RWUudW5zaGlmdChWKX1mdW5jdGlvbiBkbihWKXt1bi51bnNoaWZ0KFYpfWZ1bmN0aW9uIHNuKFYpe2JlLnVuc2hpZnQoVil9dmFyIG1uPTAsZm89bnVsbCxIbj1udWxsO2Z1bmN0aW9uIFplKFYpe21uKyssbi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZuLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMobW4pfWZ1bmN0aW9uIGNuKFYpe2lmKG1uLS0sbi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZuLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMobW4pLG1uPT0wJiYoZm8hPT1udWxsJiYoY2xlYXJJbnRlcnZhbChmbyksZm89bnVsbCksSG4pKXt2YXIgRz1IbjtIbj1udWxsLEcoKX19bi5wcmVsb2FkZWRJbWFnZXM9e30sbi5wcmVsb2FkZWRBdWRpb3M9e307ZnVuY3Rpb24gS2UoVil7bi5vbkFib3J0JiZuLm9uQWJvcnQoViksVis9IiIsSShWKSxTPSEwLFA9MSxWPSJhYm9ydCgiK1YrIikuIEJ1aWxkIHdpdGggLXMgQVNTRVJUSU9OUz0xIGZvciBtb3JlIGluZm8uIjt2YXIgRz1uZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKFYpO3Rocm93IHIoRyksR31mdW5jdGlvbiBobihWLEcpe3JldHVybiBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGg/Vi5zdGFydHNXaXRoKEcpOlYuaW5kZXhPZihHKT09PTB9dmFyIHVvPSJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIjtmdW5jdGlvbiBxbihWKXtyZXR1cm4gaG4oVix1byl9dmFyIEtuPSJmaWxlOi8vIjtmdW5jdGlvbiBsbyhWKXtyZXR1cm4gaG4oVixLbil9dmFyIHplPSJiYXNpc190cmFuc2NvZGVyLndhc20iO3FuKHplKXx8KHplPWcoemUpKTtmdW5jdGlvbiBJZShWKXt0cnl7aWYoVj09emUmJkwpcmV0dXJuIG5ldyBVaW50OEFycmF5KEwpO2lmKE8pcmV0dXJuIE8oVik7dGhyb3ciYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQifWNhdGNoKEcpe0tlKEcpfX1mdW5jdGlvbiBMbigpe2lmKCFMJiYobHx8cCkpe2lmKHR5cGVvZiBmZXRjaD09ImZ1bmN0aW9uIiYmIWxvKHplKSlyZXR1cm4gZmV0Y2goemUse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGZ1bmN0aW9uKFYpe2lmKCFWLm9rKXRocm93ImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyIremUrIiciO3JldHVybiBWLmFycmF5QnVmZmVyKCl9KS5jYXRjaChmdW5jdGlvbigpe3JldHVybiBJZSh6ZSl9KTtpZih3KXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihWLEcpe3coemUsZnVuY3Rpb24oWSl7VihuZXcgVWludDhBcnJheShZKSl9LEcpfSl9cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gSWUoemUpfSl9ZnVuY3Rpb24gV24oKXt2YXIgVj17YTpMbH07ZnVuY3Rpb24gRyhSdCxodCl7dmFyIF90PVJ0LmV4cG9ydHM7bi5hc209X3QsQT1uLmFzbS5LLEp0KEEuYnVmZmVyKSxnZT1uLmFzbS5PLGRuKG4uYXNtLkwpLGNuKCJ3YXNtLWluc3RhbnRpYXRlIil9WmUoIndhc20taW5zdGFudGlhdGUiKTtmdW5jdGlvbiBZKFJ0KXtHKFJ0Lmluc3RhbmNlKX1mdW5jdGlvbiBRKFJ0KXtyZXR1cm4gTG4oKS50aGVuKGZ1bmN0aW9uKGh0KXt2YXIgX3Q9V2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoaHQsVik7cmV0dXJuIF90fSkudGhlbihSdCxmdW5jdGlvbihodCl7SSgiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogIitodCksS2UoaHQpfSl9ZnVuY3Rpb24gbHQoKXtyZXR1cm4hTCYmdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nPT0iZnVuY3Rpb24iJiYhcW4oemUpJiYhbG8oemUpJiZ0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiI/ZmV0Y2goemUse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGZ1bmN0aW9uKFJ0KXt2YXIgaHQ9V2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcoUnQsVik7cmV0dXJuIGh0LnRoZW4oWSxmdW5jdGlvbihfdCl7cmV0dXJuIEkoIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiK190KSxJKCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvbiIpLFEoWSl9KX0pOlEoWSl9aWYobi5pbnN0YW50aWF0ZVdhc20pdHJ5e3ZhciBPdD1uLmluc3RhbnRpYXRlV2FzbShWLEcpO3JldHVybiBPdH1jYXRjaChSdCl7cmV0dXJuIEkoIk1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6ICIrUnQpLCExfXJldHVybiBsdCgpLmNhdGNoKHIpLHt9fWZ1bmN0aW9uIGpvKFYpe2Zvcig7Vi5sZW5ndGg+MDspe3ZhciBHPVYuc2hpZnQoKTtpZih0eXBlb2YgRz09ImZ1bmN0aW9uIil7RyhuKTtjb250aW51ZX12YXIgWT1HLmZ1bmM7dHlwZW9mIFk9PSJudW1iZXIiP0cuYXJnPT09dm9pZCAwP2dlLmdldChZKSgpOmdlLmdldChZKShHLmFyZyk6WShHLmFyZz09PXZvaWQgMD9udWxsOkcuYXJnKX19dmFyIHJuPXt9O2Z1bmN0aW9uIEVuKFYpe2Zvcig7Vi5sZW5ndGg7KXt2YXIgRz1WLnBvcCgpLFk9Vi5wb3AoKTtZKEcpfX1mdW5jdGlvbiBmcihWKXtyZXR1cm4gdGhpcy5mcm9tV2lyZVR5cGUocGVbVj4+Ml0pfXZhciBabj17fSxIbz17fSxOcj17fSxOcz00OCxJcz01NztmdW5jdGlvbiBZaShWKXtpZihWPT09dm9pZCAwKXJldHVybiJfdW5rbm93biI7Vj1WLnJlcGxhY2UoL1teYS16QS1aMC05X10vZywiJCIpO3ZhciBHPVYuY2hhckNvZGVBdCgwKTtyZXR1cm4gRz49TnMmJkc8PUlzPyJfIitWOlZ9ZnVuY3Rpb24gSXIoVixHKXtyZXR1cm4gVj1ZaShWKSxuZXcgRnVuY3Rpb24oImJvZHkiLCJyZXR1cm4gZnVuY3Rpb24gIitWK2AoKSB7CiAgICAidXNlIHN0cmljdCI7ICAgIHJldHVybiBib2R5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cn07CmApKEcpfWZ1bmN0aW9uICRpKFYsRyl7dmFyIFk9SXIoRyxmdW5jdGlvbihRKXt0aGlzLm5hbWU9Ryx0aGlzLm1lc3NhZ2U9UTt2YXIgbHQ9bmV3IEVycm9yKFEpLnN0YWNrO2x0IT09dm9pZCAwJiYodGhpcy5zdGFjaz10aGlzLnRvU3RyaW5nKCkrYApgK2x0LnJlcGxhY2UoL15FcnJvcig6W15cbl0qKT9cbi8sIiIpKX0pO3JldHVybiBZLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFYucHJvdG90eXBlKSxZLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1ZLFkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWVzc2FnZT09PXZvaWQgMD90aGlzLm5hbWU6dGhpcy5uYW1lKyI6ICIrdGhpcy5tZXNzYWdlfSxZfXZhciB2cz12b2lkIDA7ZnVuY3Rpb24gYmkoVil7dGhyb3cgbmV3IHZzKFYpfWZ1bmN0aW9uIG5vKFYsRyxZKXtWLmZvckVhY2goZnVuY3Rpb24oaHQpe05yW2h0XT1HfSk7ZnVuY3Rpb24gUShodCl7dmFyIF90PVkoaHQpO190Lmxlbmd0aCE9PVYubGVuZ3RoJiZiaSgiTWlzbWF0Y2hlZCB0eXBlIGNvbnZlcnRlciBjb3VudCIpO2Zvcih2YXIgS3Q9MDtLdDxWLmxlbmd0aDsrK0t0KW9yKFZbS3RdLF90W0t0XSl9dmFyIGx0PW5ldyBBcnJheShHLmxlbmd0aCksT3Q9W10sUnQ9MDtHLmZvckVhY2goZnVuY3Rpb24oaHQsX3Qpe0hvLmhhc093blByb3BlcnR5KGh0KT9sdFtfdF09SG9baHRdOihPdC5wdXNoKGh0KSxabi5oYXNPd25Qcm9wZXJ0eShodCl8fChabltodF09W10pLFpuW2h0XS5wdXNoKGZ1bmN0aW9uKCl7bHRbX3RdPUhvW2h0XSwrK1J0LFJ0PT09T3QubGVuZ3RoJiZRKGx0KX0pKX0pLE90Lmxlbmd0aD09PTAmJlEobHQpfWZ1bmN0aW9uIHBvKFYpe3ZhciBHPXJuW1ZdO2RlbGV0ZSBybltWXTt2YXIgWT1HLnJhd0NvbnN0cnVjdG9yLFE9Ry5yYXdEZXN0cnVjdG9yLGx0PUcuZmllbGRzLE90PWx0Lm1hcChmdW5jdGlvbihSdCl7cmV0dXJuIFJ0LmdldHRlclJldHVyblR5cGV9KS5jb25jYXQobHQubWFwKGZ1bmN0aW9uKFJ0KXtyZXR1cm4gUnQuc2V0dGVyQXJndW1lbnRUeXBlfSkpO25vKFtWXSxPdCxmdW5jdGlvbihSdCl7dmFyIGh0PXt9O3JldHVybiBsdC5mb3JFYWNoKGZ1bmN0aW9uKF90LEt0KXt2YXIgdGU9X3QuZmllbGROYW1lLFRlPVJ0W0t0XSxKZT1fdC5nZXR0ZXIsQW49X3QuZ2V0dGVyQ29udGV4dCxvbz1SdFtLdCtsdC5sZW5ndGhdLElvPV90LnNldHRlcixwcj1fdC5zZXR0ZXJDb250ZXh0O2h0W3RlXT17cmVhZDpmdW5jdGlvbihacil7cmV0dXJuIFRlLmZyb21XaXJlVHlwZShKZShBbixacikpfSx3cml0ZTpmdW5jdGlvbihacixvZil7dmFyIEVpPVtdO0lvKHByLFpyLG9vLnRvV2lyZVR5cGUoRWksb2YpKSxFbihFaSl9fX0pLFt7bmFtZTpHLm5hbWUsZnJvbVdpcmVUeXBlOmZ1bmN0aW9uKF90KXt2YXIgS3Q9e307Zm9yKHZhciB0ZSBpbiBodClLdFt0ZV09aHRbdGVdLnJlYWQoX3QpO3JldHVybiBRKF90KSxLdH0sdG9XaXJlVHlwZTpmdW5jdGlvbihfdCxLdCl7Zm9yKHZhciB0ZSBpbiBodClpZighKHRlIGluIEt0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGZpZWxkOiAgIicrdGUrJyInKTt2YXIgVGU9WSgpO2Zvcih0ZSBpbiBodClodFt0ZV0ud3JpdGUoVGUsS3RbdGVdKTtyZXR1cm4gX3QhPT1udWxsJiZfdC5wdXNoKFEsVGUpLFRlfSxhcmdQYWNrQWR2YW5jZTo4LHJlYWRWYWx1ZUZyb21Qb2ludGVyOmZyLGRlc3RydWN0b3JGdW5jdGlvbjpRfV19KX1mdW5jdGlvbiB2cihWKXtzd2l0Y2goVil7Y2FzZSAxOnJldHVybiAwO2Nhc2UgMjpyZXR1cm4gMTtjYXNlIDQ6cmV0dXJuIDI7Y2FzZSA4OnJldHVybiAzO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biB0eXBlIHNpemU6ICIrVil9fWZ1bmN0aW9uIE1jKCl7Zm9yKHZhciBWPW5ldyBBcnJheSgyNTYpLEc9MDtHPDI1NjsrK0cpVltHXT1TdHJpbmcuZnJvbUNoYXJDb2RlKEcpO05jPVZ9dmFyIE5jPXZvaWQgMDtmdW5jdGlvbiBEbihWKXtmb3IodmFyIEc9IiIsWT1WO3Z0W1ldOylHKz1OY1t2dFtZKytdXTtyZXR1cm4gR312YXIgd2k9dm9pZCAwO2Z1bmN0aW9uIHZlKFYpe3Rocm93IG5ldyB3aShWKX1mdW5jdGlvbiBvcihWLEcsWSl7aWYoWT1ZfHx7fSwhKCJhcmdQYWNrQWR2YW5jZSJpbiBHKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJyZWdpc3RlclR5cGUgcmVnaXN0ZXJlZEluc3RhbmNlIHJlcXVpcmVzIGFyZ1BhY2tBZHZhbmNlIik7dmFyIFE9Ry5uYW1lO2lmKFZ8fHZlKCd0eXBlICInK1ErJyIgbXVzdCBoYXZlIGEgcG9zaXRpdmUgaW50ZWdlciB0eXBlaWQgcG9pbnRlcicpLEhvLmhhc093blByb3BlcnR5KFYpKXtpZihZLmlnbm9yZUR1cGxpY2F0ZVJlZ2lzdHJhdGlvbnMpcmV0dXJuO3ZlKCJDYW5ub3QgcmVnaXN0ZXIgdHlwZSAnIitRKyInIHR3aWNlIil9aWYoSG9bVl09RyxkZWxldGUgTnJbVl0sWm4uaGFzT3duUHJvcGVydHkoVikpe3ZhciBsdD1abltWXTtkZWxldGUgWm5bVl0sbHQuZm9yRWFjaChmdW5jdGlvbihPdCl7T3QoKX0pfX1mdW5jdGlvbiB5dShWLEcsWSxRLGx0KXt2YXIgT3Q9dnIoWSk7Rz1EbihHKSxvcihWLHtuYW1lOkcsZnJvbVdpcmVUeXBlOmZ1bmN0aW9uKFJ0KXtyZXR1cm4hIVJ0fSx0b1dpcmVUeXBlOmZ1bmN0aW9uKFJ0LGh0KXtyZXR1cm4gaHQ/UTpsdH0sYXJnUGFja0FkdmFuY2U6OCxyZWFkVmFsdWVGcm9tUG9pbnRlcjpmdW5jdGlvbihSdCl7dmFyIGh0O2lmKFk9PT0xKWh0PXV0O2Vsc2UgaWYoWT09PTIpaHQ9enQ7ZWxzZSBpZihZPT09NClodD1jZTtlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gYm9vbGVhbiB0eXBlIHNpemU6ICIrRyk7cmV0dXJuIHRoaXMuZnJvbVdpcmVUeXBlKGh0W1J0Pj5PdF0pfSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pfWZ1bmN0aW9uIGd1KFYpe2lmKCEodGhpcyBpbnN0YW5jZW9mIExyKXx8IShWIGluc3RhbmNlb2YgTHIpKXJldHVybiExO2Zvcih2YXIgRz10aGlzLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLFk9dGhpcy4kJC5wdHIsUT1WLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLGx0PVYuJCQucHRyO0cuYmFzZUNsYXNzOylZPUcudXBjYXN0KFkpLEc9Ry5iYXNlQ2xhc3M7Zm9yKDtRLmJhc2VDbGFzczspbHQ9US51cGNhc3QobHQpLFE9US5iYXNlQ2xhc3M7cmV0dXJuIEc9PT1RJiZZPT09bHR9ZnVuY3Rpb24gQXUoVil7cmV0dXJue2NvdW50OlYuY291bnQsZGVsZXRlU2NoZWR1bGVkOlYuZGVsZXRlU2NoZWR1bGVkLHByZXNlcnZlUG9pbnRlck9uRGVsZXRlOlYucHJlc2VydmVQb2ludGVyT25EZWxldGUscHRyOlYucHRyLHB0clR5cGU6Vi5wdHJUeXBlLHNtYXJ0UHRyOlYuc21hcnRQdHIsc21hcnRQdHJUeXBlOlYuc21hcnRQdHJUeXBlfX1mdW5jdGlvbiBJYyhWKXtmdW5jdGlvbiBHKFkpe3JldHVybiBZLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLm5hbWV9dmUoRyhWKSsiIGluc3RhbmNlIGFscmVhZHkgZGVsZXRlZCIpfXZhciB2Yz0hMTtmdW5jdGlvbiBIYShWKXt9ZnVuY3Rpb24gYnUoVil7Vi5zbWFydFB0cj9WLnNtYXJ0UHRyVHlwZS5yYXdEZXN0cnVjdG9yKFYuc21hcnRQdHIpOlYucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3MucmF3RGVzdHJ1Y3RvcihWLnB0cil9ZnVuY3Rpb24gcWEoVil7Vi5jb3VudC52YWx1ZS09MTt2YXIgRz1WLmNvdW50LnZhbHVlPT09MDtHJiZidShWKX1mdW5jdGlvbiBaaShWKXtyZXR1cm4gdHlwZW9mIEZpbmFsaXphdGlvbkdyb3VwPiJ1Ij8oWmk9ZnVuY3Rpb24oRyl7cmV0dXJuIEd9LFYpOih2Yz1uZXcgRmluYWxpemF0aW9uR3JvdXAoZnVuY3Rpb24oRyl7Zm9yKHZhciBZPUcubmV4dCgpOyFZLmRvbmU7WT1HLm5leHQoKSl7dmFyIFE9WS52YWx1ZTtRLnB0cj9xYShRKTpjb25zb2xlLndhcm4oIm9iamVjdCBhbHJlYWR5IGRlbGV0ZWQ6ICIrUS5wdHIpfX0pLFppPWZ1bmN0aW9uKEcpe3JldHVybiB2Yy5yZWdpc3RlcihHLEcuJCQsRy4kJCksR30sSGE9ZnVuY3Rpb24oRyl7dmMudW5yZWdpc3RlcihHLiQkKX0sWmkoVikpfWZ1bmN0aW9uIHd1KCl7aWYodGhpcy4kJC5wdHJ8fEljKHRoaXMpLHRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUpcmV0dXJuIHRoaXMuJCQuY291bnQudmFsdWUrPTEsdGhpczt2YXIgVj1aaShPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSx7JCQ6e3ZhbHVlOkF1KHRoaXMuJCQpfX0pKTtyZXR1cm4gVi4kJC5jb3VudC52YWx1ZSs9MSxWLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMSxWfWZ1bmN0aW9uIFR1KCl7dGhpcy4kJC5wdHJ8fEljKHRoaXMpLHRoaXMuJCQuZGVsZXRlU2NoZWR1bGVkJiYhdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZSYmdmUoIk9iamVjdCBhbHJlYWR5IHNjaGVkdWxlZCBmb3IgZGVsZXRpb24iKSxIYSh0aGlzKSxxYSh0aGlzLiQkKSx0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlfHwodGhpcy4kJC5zbWFydFB0cj12b2lkIDAsdGhpcy4kJC5wdHI9dm9pZCAwKX1mdW5jdGlvbiBPdSgpe3JldHVybiF0aGlzLiQkLnB0cn12YXIgUWk9dm9pZCAwLEppPVtdO2Z1bmN0aW9uIExjKCl7Zm9yKDtKaS5sZW5ndGg7KXt2YXIgVj1KaS5wb3AoKTtWLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMSxWLmRlbGV0ZSgpfX1mdW5jdGlvbiBFdSgpe3JldHVybiB0aGlzLiQkLnB0cnx8SWModGhpcyksdGhpcy4kJC5kZWxldGVTY2hlZHVsZWQmJiF0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlJiZ2ZSgiT2JqZWN0IGFscmVhZHkgc2NoZWR1bGVkIGZvciBkZWxldGlvbiIpLEppLnB1c2godGhpcyksSmkubGVuZ3RoPT09MSYmUWkmJlFpKExjKSx0aGlzLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMCx0aGlzfWZ1bmN0aW9uIFJ1KCl7THIucHJvdG90eXBlLmlzQWxpYXNPZj1ndSxMci5wcm90b3R5cGUuY2xvbmU9d3UsTHIucHJvdG90eXBlLmRlbGV0ZT1UdSxMci5wcm90b3R5cGUuaXNEZWxldGVkPU91LExyLnByb3RvdHlwZS5kZWxldGVMYXRlcj1FdX1mdW5jdGlvbiBMcigpe312YXIgS2E9e307ZnVuY3Rpb24gV2EoVixHLFkpe2lmKFZbR10ub3ZlcmxvYWRUYWJsZT09PXZvaWQgMCl7dmFyIFE9VltHXTtWW0ddPWZ1bmN0aW9uKCl7cmV0dXJuIFZbR10ub3ZlcmxvYWRUYWJsZS5oYXNPd25Qcm9wZXJ0eShhcmd1bWVudHMubGVuZ3RoKXx8dmUoIkZ1bmN0aW9uICciK1krIicgY2FsbGVkIHdpdGggYW4gaW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzICgiK2FyZ3VtZW50cy5sZW5ndGgrIikgLSBleHBlY3RzIG9uZSBvZiAoIitWW0ddLm92ZXJsb2FkVGFibGUrIikhIiksVltHXS5vdmVybG9hZFRhYmxlW2FyZ3VtZW50cy5sZW5ndGhdLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sVltHXS5vdmVybG9hZFRhYmxlPVtdLFZbR10ub3ZlcmxvYWRUYWJsZVtRLmFyZ0NvdW50XT1RfX1mdW5jdGlvbiBEYyhWLEcsWSl7bi5oYXNPd25Qcm9wZXJ0eShWKT8oKFk9PT12b2lkIDB8fG5bVl0ub3ZlcmxvYWRUYWJsZSE9PXZvaWQgMCYmbltWXS5vdmVybG9hZFRhYmxlW1ldIT09dm9pZCAwKSYmdmUoIkNhbm5vdCByZWdpc3RlciBwdWJsaWMgbmFtZSAnIitWKyInIHR3aWNlIiksV2EobixWLFYpLG4uaGFzT3duUHJvcGVydHkoWSkmJnZlKCJDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgb3ZlcmxvYWRzIG9mIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzICgiK1krIikhIiksbltWXS5vdmVybG9hZFRhYmxlW1ldPUcpOihuW1ZdPUcsWSE9PXZvaWQgMCYmKG5bVl0ubnVtQXJndW1lbnRzPVkpKX1mdW5jdGlvbiBTdShWLEcsWSxRLGx0LE90LFJ0LGh0KXt0aGlzLm5hbWU9Vix0aGlzLmNvbnN0cnVjdG9yPUcsdGhpcy5pbnN0YW5jZVByb3RvdHlwZT1ZLHRoaXMucmF3RGVzdHJ1Y3Rvcj1RLHRoaXMuYmFzZUNsYXNzPWx0LHRoaXMuZ2V0QWN0dWFsVHlwZT1PdCx0aGlzLnVwY2FzdD1SdCx0aGlzLmRvd25jYXN0PWh0LHRoaXMucHVyZVZpcnR1YWxGdW5jdGlvbnM9W119ZnVuY3Rpb24gRmMoVixHLFkpe2Zvcig7RyE9PVk7KUcudXBjYXN0fHx2ZSgiRXhwZWN0ZWQgbnVsbCBvciBpbnN0YW5jZSBvZiAiK1kubmFtZSsiLCBnb3QgYW4gaW5zdGFuY2Ugb2YgIitHLm5hbWUpLFY9Ry51cGNhc3QoViksRz1HLmJhc2VDbGFzcztyZXR1cm4gVn1mdW5jdGlvbiBDdShWLEcpe2lmKEc9PT1udWxsKXJldHVybiB0aGlzLmlzUmVmZXJlbmNlJiZ2ZSgibnVsbCBpcyBub3QgYSB2YWxpZCAiK3RoaXMubmFtZSksMDtHLiQkfHx2ZSgnQ2Fubm90IHBhc3MgIicrVGkoRykrJyIgYXMgYSAnK3RoaXMubmFtZSksRy4kJC5wdHJ8fHZlKCJDYW5ub3QgcGFzcyBkZWxldGVkIG9iamVjdCBhcyBhIHBvaW50ZXIgb2YgdHlwZSAiK3RoaXMubmFtZSk7dmFyIFk9Ry4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcyxRPUZjKEcuJCQucHRyLFksdGhpcy5yZWdpc3RlcmVkQ2xhc3MpO3JldHVybiBRfWZ1bmN0aW9uIHh1KFYsRyl7dmFyIFk7aWYoRz09PW51bGwpcmV0dXJuIHRoaXMuaXNSZWZlcmVuY2UmJnZlKCJudWxsIGlzIG5vdCBhIHZhbGlkICIrdGhpcy5uYW1lKSx0aGlzLmlzU21hcnRQb2ludGVyPyhZPXRoaXMucmF3Q29uc3RydWN0b3IoKSxWIT09bnVsbCYmVi5wdXNoKHRoaXMucmF3RGVzdHJ1Y3RvcixZKSxZKTowO0cuJCR8fHZlKCdDYW5ub3QgcGFzcyAiJytUaShHKSsnIiBhcyBhICcrdGhpcy5uYW1lKSxHLiQkLnB0cnx8dmUoIkNhbm5vdCBwYXNzIGRlbGV0ZWQgb2JqZWN0IGFzIGEgcG9pbnRlciBvZiB0eXBlICIrdGhpcy5uYW1lKSwhdGhpcy5pc0NvbnN0JiZHLiQkLnB0clR5cGUuaXNDb25zdCYmdmUoIkNhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgIisoRy4kJC5zbWFydFB0clR5cGU/Ry4kJC5zbWFydFB0clR5cGUubmFtZTpHLiQkLnB0clR5cGUubmFtZSkrIiB0byBwYXJhbWV0ZXIgdHlwZSAiK3RoaXMubmFtZSk7dmFyIFE9Ry4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcztpZihZPUZjKEcuJCQucHRyLFEsdGhpcy5yZWdpc3RlcmVkQ2xhc3MpLHRoaXMuaXNTbWFydFBvaW50ZXIpc3dpdGNoKEcuJCQuc21hcnRQdHI9PT12b2lkIDAmJnZlKCJQYXNzaW5nIHJhdyBwb2ludGVyIHRvIHNtYXJ0IHBvaW50ZXIgaXMgaWxsZWdhbCIpLHRoaXMuc2hhcmluZ1BvbGljeSl7Y2FzZSAwOkcuJCQuc21hcnRQdHJUeXBlPT09dGhpcz9ZPUcuJCQuc21hcnRQdHI6dmUoIkNhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgIisoRy4kJC5zbWFydFB0clR5cGU/Ry4kJC5zbWFydFB0clR5cGUubmFtZTpHLiQkLnB0clR5cGUubmFtZSkrIiB0byBwYXJhbWV0ZXIgdHlwZSAiK3RoaXMubmFtZSk7YnJlYWs7Y2FzZSAxOlk9Ry4kJC5zbWFydFB0cjticmVhaztjYXNlIDI6aWYoRy4kJC5zbWFydFB0clR5cGU9PT10aGlzKVk9Ry4kJC5zbWFydFB0cjtlbHNle3ZhciBsdD1HLmNsb25lKCk7WT10aGlzLnJhd1NoYXJlKFksbHIoZnVuY3Rpb24oKXtsdC5kZWxldGUoKX0pKSxWIT09bnVsbCYmVi5wdXNoKHRoaXMucmF3RGVzdHJ1Y3RvcixZKX1icmVhaztkZWZhdWx0OnZlKCJVbnN1cHBvcnRpbmcgc2hhcmluZyBwb2xpY3kiKX1yZXR1cm4gWX1mdW5jdGlvbiBQdShWLEcpe2lmKEc9PT1udWxsKXJldHVybiB0aGlzLmlzUmVmZXJlbmNlJiZ2ZSgibnVsbCBpcyBub3QgYSB2YWxpZCAiK3RoaXMubmFtZSksMDtHLiQkfHx2ZSgnQ2Fubm90IHBhc3MgIicrVGkoRykrJyIgYXMgYSAnK3RoaXMubmFtZSksRy4kJC5wdHJ8fHZlKCJDYW5ub3QgcGFzcyBkZWxldGVkIG9iamVjdCBhcyBhIHBvaW50ZXIgb2YgdHlwZSAiK3RoaXMubmFtZSksRy4kJC5wdHJUeXBlLmlzQ29uc3QmJnZlKCJDYW5ub3QgY29udmVydCBhcmd1bWVudCBvZiB0eXBlICIrRy4kJC5wdHJUeXBlLm5hbWUrIiB0byBwYXJhbWV0ZXIgdHlwZSAiK3RoaXMubmFtZSk7dmFyIFk9Ry4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcyxRPUZjKEcuJCQucHRyLFksdGhpcy5yZWdpc3RlcmVkQ2xhc3MpO3JldHVybiBRfWZ1bmN0aW9uIE11KFYpe3JldHVybiB0aGlzLnJhd0dldFBvaW50ZWUmJihWPXRoaXMucmF3R2V0UG9pbnRlZShWKSksVn1mdW5jdGlvbiBOdShWKXt0aGlzLnJhd0Rlc3RydWN0b3ImJnRoaXMucmF3RGVzdHJ1Y3RvcihWKX1mdW5jdGlvbiBJdShWKXtWIT09bnVsbCYmVi5kZWxldGUoKX1mdW5jdGlvbiBYYShWLEcsWSl7aWYoRz09PVkpcmV0dXJuIFY7aWYoWS5iYXNlQ2xhc3M9PT12b2lkIDApcmV0dXJuIG51bGw7dmFyIFE9WGEoVixHLFkuYmFzZUNsYXNzKTtyZXR1cm4gUT09PW51bGw/bnVsbDpZLmRvd25jYXN0KFEpfWZ1bmN0aW9uIHZ1KCl7cmV0dXJuIE9iamVjdC5rZXlzKHRzKS5sZW5ndGh9ZnVuY3Rpb24gTHUoKXt2YXIgVj1bXTtmb3IodmFyIEcgaW4gdHMpdHMuaGFzT3duUHJvcGVydHkoRykmJlYucHVzaCh0c1tHXSk7cmV0dXJuIFZ9ZnVuY3Rpb24gRHUoVil7UWk9VixKaS5sZW5ndGgmJlFpJiZRaShMYyl9ZnVuY3Rpb24gRnUoKXtuLmdldEluaGVyaXRlZEluc3RhbmNlQ291bnQ9dnUsbi5nZXRMaXZlSW5oZXJpdGVkSW5zdGFuY2VzPUx1LG4uZmx1c2hQZW5kaW5nRGVsZXRlcz1MYyxuLnNldERlbGF5RnVuY3Rpb249RHV9dmFyIHRzPXt9O2Z1bmN0aW9uIEJ1KFYsRyl7Zm9yKEc9PT12b2lkIDAmJnZlKCJwdHIgc2hvdWxkIG5vdCBiZSB1bmRlZmluZWQiKTtWLmJhc2VDbGFzczspRz1WLnVwY2FzdChHKSxWPVYuYmFzZUNsYXNzO3JldHVybiBHfWZ1bmN0aW9uIFV1KFYsRyl7cmV0dXJuIEc9QnUoVixHKSx0c1tHXX1mdW5jdGlvbiBMcyhWLEcpeyghRy5wdHJUeXBlfHwhRy5wdHIpJiZiaSgibWFrZUNsYXNzSGFuZGxlIHJlcXVpcmVzIHB0ciBhbmQgcHRyVHlwZSIpO3ZhciBZPSEhRy5zbWFydFB0clR5cGUsUT0hIUcuc21hcnRQdHI7cmV0dXJuIFkhPT1RJiZiaSgiQm90aCBzbWFydFB0clR5cGUgYW5kIHNtYXJ0UHRyIG11c3QgYmUgc3BlY2lmaWVkIiksRy5jb3VudD17dmFsdWU6MX0sWmkoT2JqZWN0LmNyZWF0ZShWLHskJDp7dmFsdWU6R319KSl9ZnVuY3Rpb24gVnUoVil7dmFyIEc9dGhpcy5nZXRQb2ludGVlKFYpO2lmKCFHKXJldHVybiB0aGlzLmRlc3RydWN0b3IoViksbnVsbDt2YXIgWT1VdSh0aGlzLnJlZ2lzdGVyZWRDbGFzcyxHKTtpZihZIT09dm9pZCAwKXtpZihZLiQkLmNvdW50LnZhbHVlPT09MClyZXR1cm4gWS4kJC5wdHI9RyxZLiQkLnNtYXJ0UHRyPVYsWS5jbG9uZSgpO3ZhciBRPVkuY2xvbmUoKTtyZXR1cm4gdGhpcy5kZXN0cnVjdG9yKFYpLFF9ZnVuY3Rpb24gbHQoKXtyZXR1cm4gdGhpcy5pc1NtYXJ0UG9pbnRlcj9Mcyh0aGlzLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTp0aGlzLnBvaW50ZWVUeXBlLHB0cjpHLHNtYXJ0UHRyVHlwZTp0aGlzLHNtYXJ0UHRyOlZ9KTpMcyh0aGlzLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTp0aGlzLHB0cjpWfSl9dmFyIE90PXRoaXMucmVnaXN0ZXJlZENsYXNzLmdldEFjdHVhbFR5cGUoRyksUnQ9S2FbT3RdO2lmKCFSdClyZXR1cm4gbHQuY2FsbCh0aGlzKTt2YXIgaHQ7dGhpcy5pc0NvbnN0P2h0PVJ0LmNvbnN0UG9pbnRlclR5cGU6aHQ9UnQucG9pbnRlclR5cGU7dmFyIF90PVhhKEcsdGhpcy5yZWdpc3RlcmVkQ2xhc3MsaHQucmVnaXN0ZXJlZENsYXNzKTtyZXR1cm4gX3Q9PT1udWxsP2x0LmNhbGwodGhpcyk6dGhpcy5pc1NtYXJ0UG9pbnRlcj9McyhodC5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGUse3B0clR5cGU6aHQscHRyOl90LHNtYXJ0UHRyVHlwZTp0aGlzLHNtYXJ0UHRyOlZ9KTpMcyhodC5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGUse3B0clR5cGU6aHQscHRyOl90fSl9ZnVuY3Rpb24ga3UoKXt1ci5wcm90b3R5cGUuZ2V0UG9pbnRlZT1NdSx1ci5wcm90b3R5cGUuZGVzdHJ1Y3Rvcj1OdSx1ci5wcm90b3R5cGUuYXJnUGFja0FkdmFuY2U9OCx1ci5wcm90b3R5cGUucmVhZFZhbHVlRnJvbVBvaW50ZXI9ZnIsdXIucHJvdG90eXBlLmRlbGV0ZU9iamVjdD1JdSx1ci5wcm90b3R5cGUuZnJvbVdpcmVUeXBlPVZ1fWZ1bmN0aW9uIHVyKFYsRyxZLFEsbHQsT3QsUnQsaHQsX3QsS3QsdGUpe3RoaXMubmFtZT1WLHRoaXMucmVnaXN0ZXJlZENsYXNzPUcsdGhpcy5pc1JlZmVyZW5jZT1ZLHRoaXMuaXNDb25zdD1RLHRoaXMuaXNTbWFydFBvaW50ZXI9bHQsdGhpcy5wb2ludGVlVHlwZT1PdCx0aGlzLnNoYXJpbmdQb2xpY3k9UnQsdGhpcy5yYXdHZXRQb2ludGVlPWh0LHRoaXMucmF3Q29uc3RydWN0b3I9X3QsdGhpcy5yYXdTaGFyZT1LdCx0aGlzLnJhd0Rlc3RydWN0b3I9dGUsIWx0JiZHLmJhc2VDbGFzcz09PXZvaWQgMD9RPyh0aGlzLnRvV2lyZVR5cGU9Q3UsdGhpcy5kZXN0cnVjdG9yRnVuY3Rpb249bnVsbCk6KHRoaXMudG9XaXJlVHlwZT1QdSx0aGlzLmRlc3RydWN0b3JGdW5jdGlvbj1udWxsKTp0aGlzLnRvV2lyZVR5cGU9eHV9ZnVuY3Rpb24gWWEoVixHLFkpe24uaGFzT3duUHJvcGVydHkoVil8fGJpKCJSZXBsYWNpbmcgbm9uZXhpc3RhbnQgcHVibGljIHN5bWJvbCIpLG5bVl0ub3ZlcmxvYWRUYWJsZSE9PXZvaWQgMCYmWSE9PXZvaWQgMD9uW1ZdLm92ZXJsb2FkVGFibGVbWV09RzoobltWXT1HLG5bVl0uYXJnQ291bnQ9WSl9ZnVuY3Rpb24gR3UoVixHLFkpe3ZhciBRPW5bImR5bkNhbGxfIitWXTtyZXR1cm4gWSYmWS5sZW5ndGg/US5hcHBseShudWxsLFtHXS5jb25jYXQoWSkpOlEuY2FsbChudWxsLEcpfWZ1bmN0aW9uIHp1KFYsRyxZKXtyZXR1cm4gVi5pbmRleE9mKCJqIikhPS0xP0d1KFYsRyxZKTpnZS5nZXQoRykuYXBwbHkobnVsbCxZKX1mdW5jdGlvbiBqdShWLEcpe3ZhciBZPVtdO3JldHVybiBmdW5jdGlvbigpe1kubGVuZ3RoPWFyZ3VtZW50cy5sZW5ndGg7Zm9yKHZhciBRPTA7UTxhcmd1bWVudHMubGVuZ3RoO1ErKylZW1FdPWFyZ3VtZW50c1tRXTtyZXR1cm4genUoVixHLFkpfX1mdW5jdGlvbiBxbyhWLEcpe1Y9RG4oVik7ZnVuY3Rpb24gWSgpe3JldHVybiBWLmluZGV4T2YoImoiKSE9LTE/anUoVixHKTpnZS5nZXQoRyl9dmFyIFE9WSgpO3JldHVybiB0eXBlb2YgUSE9ImZ1bmN0aW9uIiYmdmUoInVua25vd24gZnVuY3Rpb24gcG9pbnRlciB3aXRoIHNpZ25hdHVyZSAiK1YrIjogIitHKSxRfXZhciAkYT12b2lkIDA7ZnVuY3Rpb24gWmEoVil7dmFyIEc9ZXQoViksWT1EbihHKTtyZXR1cm4gVyhHKSxZfWZ1bmN0aW9uIERzKFYsRyl7dmFyIFk9W10sUT17fTtmdW5jdGlvbiBsdChPdCl7aWYoIVFbT3RdJiYhSG9bT3RdKXtpZihOcltPdF0pe05yW090XS5mb3JFYWNoKGx0KTtyZXR1cm59WS5wdXNoKE90KSxRW090XT0hMH19dGhyb3cgRy5mb3JFYWNoKGx0KSxuZXcgJGEoVisiOiAiK1kubWFwKFphKS5qb2luKFsiLCAiXSkpfWZ1bmN0aW9uIEh1KFYsRyxZLFEsbHQsT3QsUnQsaHQsX3QsS3QsdGUsVGUsSmUpe3RlPURuKHRlKSxPdD1xbyhsdCxPdCksaHQmJihodD1xbyhSdCxodCkpLEt0JiYoS3Q9cW8oX3QsS3QpKSxKZT1xbyhUZSxKZSk7dmFyIEFuPVlpKHRlKTtEYyhBbixmdW5jdGlvbigpe0RzKCJDYW5ub3QgY29uc3RydWN0ICIrdGUrIiBkdWUgdG8gdW5ib3VuZCB0eXBlcyIsW1FdKX0pLG5vKFtWLEcsWV0sUT9bUV06W10sZnVuY3Rpb24ob28pe29vPW9vWzBdO3ZhciBJbyxwcjtRPyhJbz1vby5yZWdpc3RlcmVkQ2xhc3MscHI9SW8uaW5zdGFuY2VQcm90b3R5cGUpOnByPUxyLnByb3RvdHlwZTt2YXIgWnI9SXIoQW4sZnVuY3Rpb24oKXtpZihPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykhPT1vZil0aHJvdyBuZXcgd2koIlVzZSAnbmV3JyB0byBjb25zdHJ1Y3QgIit0ZSk7aWYoRWkuY29uc3RydWN0b3JfYm9keT09PXZvaWQgMCl0aHJvdyBuZXcgd2kodGUrIiBoYXMgbm8gYWNjZXNzaWJsZSBjb25zdHJ1Y3RvciIpO3ZhciBsMT1FaS5jb25zdHJ1Y3Rvcl9ib2R5W2FyZ3VtZW50cy5sZW5ndGhdO2lmKGwxPT09dm9pZCAwKXRocm93IG5ldyB3aSgiVHJpZWQgdG8gaW52b2tlIGN0b3Igb2YgIit0ZSsiIHdpdGggaW52YWxpZCBudW1iZXIgb2YgcGFyYW1ldGVycyAoIithcmd1bWVudHMubGVuZ3RoKyIpIC0gZXhwZWN0ZWQgKCIrT2JqZWN0LmtleXMoRWkuY29uc3RydWN0b3JfYm9keSkudG9TdHJpbmcoKSsiKSBwYXJhbWV0ZXJzIGluc3RlYWQhIik7cmV0dXJuIGwxLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLG9mPU9iamVjdC5jcmVhdGUocHIse2NvbnN0cnVjdG9yOnt2YWx1ZTpacn19KTtaci5wcm90b3R5cGU9b2Y7dmFyIEVpPW5ldyBTdSh0ZSxacixvZixKZSxJbyxPdCxodCxLdCksSFM9bmV3IHVyKHRlLEVpLCEwLCExLCExKSxmMT1uZXcgdXIodGUrIioiLEVpLCExLCExLCExKSx1MT1uZXcgdXIodGUrIiBjb25zdCoiLEVpLCExLCEwLCExKTtyZXR1cm4gS2FbVl09e3BvaW50ZXJUeXBlOmYxLGNvbnN0UG9pbnRlclR5cGU6dTF9LFlhKEFuLFpyKSxbSFMsZjEsdTFdfSl9ZnVuY3Rpb24gQmMoVixHKXtmb3IodmFyIFk9W10sUT0wO1E8VjtRKyspWS5wdXNoKGNlWyhHPj4yKStRXSk7cmV0dXJuIFl9ZnVuY3Rpb24gcXUoVixHLFksUSxsdCxPdCl7QihHPjApO3ZhciBSdD1CYyhHLFkpO2x0PXFvKFEsbHQpO3ZhciBodD1bT3RdLF90PVtdO25vKFtdLFtWXSxmdW5jdGlvbihLdCl7S3Q9S3RbMF07dmFyIHRlPSJjb25zdHJ1Y3RvciAiK0t0Lm5hbWU7aWYoS3QucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHk9PT12b2lkIDAmJihLdC5yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keT1bXSksS3QucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbRy0xXSE9PXZvaWQgMCl0aHJvdyBuZXcgd2koIkNhbm5vdCByZWdpc3RlciBtdWx0aXBsZSBjb25zdHJ1Y3RvcnMgd2l0aCBpZGVudGljYWwgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCIrKEctMSkrIikgZm9yIGNsYXNzICciK0t0Lm5hbWUrIichIE92ZXJsb2FkIHJlc29sdXRpb24gaXMgY3VycmVudGx5IG9ubHkgcGVyZm9ybWVkIHVzaW5nIHRoZSBwYXJhbWV0ZXIgY291bnQsIG5vdCBhY3R1YWwgdHlwZSBpbmZvISIpO3JldHVybiBLdC5yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keVtHLTFdPWZ1bmN0aW9uKCl7RHMoIkNhbm5vdCBjb25zdHJ1Y3QgIitLdC5uYW1lKyIgZHVlIHRvIHVuYm91bmQgdHlwZXMiLFJ0KX0sbm8oW10sUnQsZnVuY3Rpb24oVGUpe3JldHVybiBLdC5yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keVtHLTFdPWZ1bmN0aW9uKCl7YXJndW1lbnRzLmxlbmd0aCE9PUctMSYmdmUodGUrIiBjYWxsZWQgd2l0aCAiK2FyZ3VtZW50cy5sZW5ndGgrIiBhcmd1bWVudHMsIGV4cGVjdGVkICIrKEctMSkpLF90Lmxlbmd0aD0wLGh0Lmxlbmd0aD1HO2Zvcih2YXIgQW49MTtBbjxHOysrQW4paHRbQW5dPVRlW0FuXS50b1dpcmVUeXBlKF90LGFyZ3VtZW50c1tBbi0xXSk7dmFyIG9vPWx0LmFwcGx5KG51bGwsaHQpO3JldHVybiBFbihfdCksVGVbMF0uZnJvbVdpcmVUeXBlKG9vKX0sW119KSxbXX0pfWZ1bmN0aW9uIFFhKFYsRyl7aWYoIShWIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IG5ldyBUeXBlRXJyb3IoIm5ld18gY2FsbGVkIHdpdGggY29uc3RydWN0b3IgdHlwZSAiK3R5cGVvZiBWKyIgd2hpY2ggaXMgbm90IGEgZnVuY3Rpb24iKTt2YXIgWT1JcihWLm5hbWV8fCJ1bmtub3duRnVuY3Rpb25OYW1lIixmdW5jdGlvbigpe30pO1kucHJvdG90eXBlPVYucHJvdG90eXBlO3ZhciBRPW5ldyBZLGx0PVYuYXBwbHkoUSxHKTtyZXR1cm4gbHQgaW5zdGFuY2VvZiBPYmplY3Q/bHQ6UX1mdW5jdGlvbiBKYShWLEcsWSxRLGx0KXt2YXIgT3Q9Ry5sZW5ndGg7T3Q8MiYmdmUoImFyZ1R5cGVzIGFycmF5IHNpemUgbWlzbWF0Y2ghIE11c3QgYXQgbGVhc3QgZ2V0IHJldHVybiB2YWx1ZSBhbmQgJ3RoaXMnIHR5cGVzISIpO2Zvcih2YXIgUnQ9R1sxXSE9PW51bGwmJlkhPT1udWxsLGh0PSExLF90PTE7X3Q8Ry5sZW5ndGg7KytfdClpZihHW190XSE9PW51bGwmJkdbX3RdLmRlc3RydWN0b3JGdW5jdGlvbj09PXZvaWQgMCl7aHQ9ITA7YnJlYWt9Zm9yKHZhciBLdD1HWzBdLm5hbWUhPT0idm9pZCIsdGU9IiIsVGU9IiIsX3Q9MDtfdDxPdC0yOysrX3QpdGUrPShfdCE9PTA/IiwgIjoiIikrImFyZyIrX3QsVGUrPShfdCE9PTA/IiwgIjoiIikrImFyZyIrX3QrIldpcmVkIjt2YXIgSmU9InJldHVybiBmdW5jdGlvbiAiK1lpKFYpKyIoIit0ZStgKSB7CmlmIChhcmd1bWVudHMubGVuZ3RoICE9PSBgKyhPdC0yKStgKSB7CnRocm93QmluZGluZ0Vycm9yKCdmdW5jdGlvbiBgK1YrIiBjYWxsZWQgd2l0aCAnICsgYXJndW1lbnRzLmxlbmd0aCArICcgYXJndW1lbnRzLCBleHBlY3RlZCAiKyhPdC0yKStgIGFyZ3MhJyk7Cn0KYDtodCYmKEplKz1gdmFyIGRlc3RydWN0b3JzID0gW107CmApO3ZhciBBbj1odD8iZGVzdHJ1Y3RvcnMiOiJudWxsIixvbz1bInRocm93QmluZGluZ0Vycm9yIiwiaW52b2tlciIsImZuIiwicnVuRGVzdHJ1Y3RvcnMiLCJyZXRUeXBlIiwiY2xhc3NQYXJhbSJdLElvPVt2ZSxRLGx0LEVuLEdbMF0sR1sxXV07UnQmJihKZSs9InZhciB0aGlzV2lyZWQgPSBjbGFzc1BhcmFtLnRvV2lyZVR5cGUoIitBbitgLCB0aGlzKTsKYCk7Zm9yKHZhciBfdD0wO190PE90LTI7KytfdClKZSs9InZhciBhcmciK190KyJXaXJlZCA9IGFyZ1R5cGUiK190KyIudG9XaXJlVHlwZSgiK0FuKyIsIGFyZyIrX3QrIik7IC8vICIrR1tfdCsyXS5uYW1lK2AKYCxvby5wdXNoKCJhcmdUeXBlIitfdCksSW8ucHVzaChHW190KzJdKTtpZihSdCYmKFRlPSJ0aGlzV2lyZWQiKyhUZS5sZW5ndGg+MD8iLCAiOiIiKStUZSksSmUrPShLdD8idmFyIHJ2ID0gIjoiIikrImludm9rZXIoZm4iKyhUZS5sZW5ndGg+MD8iLCAiOiIiKStUZStgKTsKYCxodClKZSs9YHJ1bkRlc3RydWN0b3JzKGRlc3RydWN0b3JzKTsKYDtlbHNlIGZvcih2YXIgX3Q9UnQ/MToyO190PEcubGVuZ3RoOysrX3Qpe3ZhciBwcj1fdD09PTE/InRoaXNXaXJlZCI6ImFyZyIrKF90LTIpKyJXaXJlZCI7R1tfdF0uZGVzdHJ1Y3RvckZ1bmN0aW9uIT09bnVsbCYmKEplKz1wcisiX2R0b3IoIitwcisiKTsgLy8gIitHW190XS5uYW1lK2AKYCxvby5wdXNoKHByKyJfZHRvciIpLElvLnB1c2goR1tfdF0uZGVzdHJ1Y3RvckZ1bmN0aW9uKSl9S3QmJihKZSs9YHZhciByZXQgPSByZXRUeXBlLmZyb21XaXJlVHlwZShydik7CnJldHVybiByZXQ7CmApLEplKz1gfQpgLG9vLnB1c2goSmUpO3ZhciBacj1RYShGdW5jdGlvbixvbykuYXBwbHkobnVsbCxJbyk7cmV0dXJuIFpyfWZ1bmN0aW9uIEt1KFYsRyxZLFEsbHQsT3QsUnQsaHQpe3ZhciBfdD1CYyhZLFEpO0c9RG4oRyksT3Q9cW8obHQsT3QpLG5vKFtdLFtWXSxmdW5jdGlvbihLdCl7S3Q9S3RbMF07dmFyIHRlPUt0Lm5hbWUrIi4iK0c7aHQmJkt0LnJlZ2lzdGVyZWRDbGFzcy5wdXJlVmlydHVhbEZ1bmN0aW9ucy5wdXNoKEcpO2Z1bmN0aW9uIFRlKCl7RHMoIkNhbm5vdCBjYWxsICIrdGUrIiBkdWUgdG8gdW5ib3VuZCB0eXBlcyIsX3QpfXZhciBKZT1LdC5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGUsQW49SmVbR107cmV0dXJuIEFuPT09dm9pZCAwfHxBbi5vdmVybG9hZFRhYmxlPT09dm9pZCAwJiZBbi5jbGFzc05hbWUhPT1LdC5uYW1lJiZBbi5hcmdDb3VudD09PVktMj8oVGUuYXJnQ291bnQ9WS0yLFRlLmNsYXNzTmFtZT1LdC5uYW1lLEplW0ddPVRlKTooV2EoSmUsRyx0ZSksSmVbR10ub3ZlcmxvYWRUYWJsZVtZLTJdPVRlKSxubyhbXSxfdCxmdW5jdGlvbihvbyl7dmFyIElvPUphKHRlLG9vLEt0LE90LFJ0KTtyZXR1cm4gSmVbR10ub3ZlcmxvYWRUYWJsZT09PXZvaWQgMD8oSW8uYXJnQ291bnQ9WS0yLEplW0ddPUlvKTpKZVtHXS5vdmVybG9hZFRhYmxlW1ktMl09SW8sW119KSxbXX0pfWZ1bmN0aW9uIFd1KFYsRyxZKXtWPURuKFYpLG5vKFtdLFtHXSxmdW5jdGlvbihRKXtyZXR1cm4gUT1RWzBdLG5bVl09US5mcm9tV2lyZVR5cGUoWSksW119KX12YXIgVWM9W10sZ289W3t9LHt2YWx1ZTp2b2lkIDB9LHt2YWx1ZTpudWxsfSx7dmFsdWU6ITB9LHt2YWx1ZTohMX1dO2Z1bmN0aW9uIFZjKFYpe1Y+NCYmLS1nb1tWXS5yZWZjb3VudD09PTAmJihnb1tWXT12b2lkIDAsVWMucHVzaChWKSl9ZnVuY3Rpb24gWHUoKXtmb3IodmFyIFY9MCxHPTU7Rzxnby5sZW5ndGg7KytHKWdvW0ddIT09dm9pZCAwJiYrK1Y7cmV0dXJuIFZ9ZnVuY3Rpb24gWXUoKXtmb3IodmFyIFY9NTtWPGdvLmxlbmd0aDsrK1YpaWYoZ29bVl0hPT12b2lkIDApcmV0dXJuIGdvW1ZdO3JldHVybiBudWxsfWZ1bmN0aW9uICR1KCl7bi5jb3VudF9lbXZhbF9oYW5kbGVzPVh1LG4uZ2V0X2ZpcnN0X2VtdmFsPVl1fWZ1bmN0aW9uIGxyKFYpe3N3aXRjaChWKXtjYXNlIHZvaWQgMDpyZXR1cm4gMTtjYXNlIG51bGw6cmV0dXJuIDI7Y2FzZSEwOnJldHVybiAzO2Nhc2UhMTpyZXR1cm4gNDtkZWZhdWx0Ont2YXIgRz1VYy5sZW5ndGg/VWMucG9wKCk6Z28ubGVuZ3RoO3JldHVybiBnb1tHXT17cmVmY291bnQ6MSx2YWx1ZTpWfSxHfX19ZnVuY3Rpb24gWnUoVixHKXtHPURuKEcpLG9yKFYse25hbWU6Ryxmcm9tV2lyZVR5cGU6ZnVuY3Rpb24oWSl7dmFyIFE9Z29bWV0udmFsdWU7cmV0dXJuIFZjKFkpLFF9LHRvV2lyZVR5cGU6ZnVuY3Rpb24oWSxRKXtyZXR1cm4gbHIoUSl9LGFyZ1BhY2tBZHZhbmNlOjgscmVhZFZhbHVlRnJvbVBvaW50ZXI6ZnIsZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9KX1mdW5jdGlvbiBRdShWLEcsWSl7c3dpdGNoKEcpe2Nhc2UgMDpyZXR1cm4gZnVuY3Rpb24oUSl7dmFyIGx0PVk/dXQ6dnQ7cmV0dXJuIHRoaXMuZnJvbVdpcmVUeXBlKGx0W1FdKX07Y2FzZSAxOnJldHVybiBmdW5jdGlvbihRKXt2YXIgbHQ9WT96dDptZTtyZXR1cm4gdGhpcy5mcm9tV2lyZVR5cGUobHRbUT4+MV0pfTtjYXNlIDI6cmV0dXJuIGZ1bmN0aW9uKFEpe3ZhciBsdD1ZP2NlOnBlO3JldHVybiB0aGlzLmZyb21XaXJlVHlwZShsdFtRPj4yXSl9O2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBpbnRlZ2VyIHR5cGU6ICIrVil9fWZ1bmN0aW9uIEp1KFYsRyxZLFEpe3ZhciBsdD12cihZKTtHPURuKEcpO2Z1bmN0aW9uIE90KCl7fU90LnZhbHVlcz17fSxvcihWLHtuYW1lOkcsY29uc3RydWN0b3I6T3QsZnJvbVdpcmVUeXBlOmZ1bmN0aW9uKFJ0KXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci52YWx1ZXNbUnRdfSx0b1dpcmVUeXBlOmZ1bmN0aW9uKFJ0LGh0KXtyZXR1cm4gaHQudmFsdWV9LGFyZ1BhY2tBZHZhbmNlOjgscmVhZFZhbHVlRnJvbVBvaW50ZXI6UXUoRyxsdCxRKSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pLERjKEcsT3QpfWZ1bmN0aW9uIEZzKFYsRyl7dmFyIFk9SG9bVl07cmV0dXJuIFk9PT12b2lkIDAmJnZlKEcrIiBoYXMgdW5rbm93biB0eXBlICIrWmEoVikpLFl9ZnVuY3Rpb24gdGwoVixHLFkpe3ZhciBRPUZzKFYsImVudW0iKTtHPURuKEcpO3ZhciBsdD1RLmNvbnN0cnVjdG9yLE90PU9iamVjdC5jcmVhdGUoUS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUse3ZhbHVlOnt2YWx1ZTpZfSxjb25zdHJ1Y3Rvcjp7dmFsdWU6SXIoUS5uYW1lKyJfIitHLGZ1bmN0aW9uKCl7fSl9fSk7bHQudmFsdWVzW1ldPU90LGx0W0ddPU90fWZ1bmN0aW9uIFRpKFYpe2lmKFY9PT1udWxsKXJldHVybiJudWxsIjt2YXIgRz10eXBlb2YgVjtyZXR1cm4gRz09PSJvYmplY3QifHxHPT09ImFycmF5Inx8Rz09PSJmdW5jdGlvbiI/Vi50b1N0cmluZygpOiIiK1Z9ZnVuY3Rpb24gZWwoVixHKXtzd2l0Y2goRyl7Y2FzZSAyOnJldHVybiBmdW5jdGlvbihZKXtyZXR1cm4gdGhpcy5mcm9tV2lyZVR5cGUodWVbWT4+Ml0pfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKFkpe3JldHVybiB0aGlzLmZyb21XaXJlVHlwZShRdFtZPj4zXSl9O2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBmbG9hdCB0eXBlOiAiK1YpfX1mdW5jdGlvbiBubChWLEcsWSl7dmFyIFE9dnIoWSk7Rz1EbihHKSxvcihWLHtuYW1lOkcsZnJvbVdpcmVUeXBlOmZ1bmN0aW9uKGx0KXtyZXR1cm4gbHR9LHRvV2lyZVR5cGU6ZnVuY3Rpb24obHQsT3Qpe2lmKHR5cGVvZiBPdCE9Im51bWJlciImJnR5cGVvZiBPdCE9ImJvb2xlYW4iKXRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0ICInK1RpKE90KSsnIiB0byAnK3RoaXMubmFtZSk7cmV0dXJuIE90fSxhcmdQYWNrQWR2YW5jZTo4LHJlYWRWYWx1ZUZyb21Qb2ludGVyOmVsKEcsUSksZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9KX1mdW5jdGlvbiBvbChWLEcsWSxRLGx0LE90KXt2YXIgUnQ9QmMoRyxZKTtWPURuKFYpLGx0PXFvKFEsbHQpLERjKFYsZnVuY3Rpb24oKXtEcygiQ2Fubm90IGNhbGwgIitWKyIgZHVlIHRvIHVuYm91bmQgdHlwZXMiLFJ0KX0sRy0xKSxubyhbXSxSdCxmdW5jdGlvbihodCl7dmFyIF90PVtodFswXSxudWxsXS5jb25jYXQoaHQuc2xpY2UoMSkpO3JldHVybiBZYShWLEphKFYsX3QsbnVsbCxsdCxPdCksRy0xKSxbXX0pfWZ1bmN0aW9uIHJsKFYsRyxZKXtzd2l0Y2goRyl7Y2FzZSAwOnJldHVybiBZP2Z1bmN0aW9uKGx0KXtyZXR1cm4gdXRbbHRdfTpmdW5jdGlvbihsdCl7cmV0dXJuIHZ0W2x0XX07Y2FzZSAxOnJldHVybiBZP2Z1bmN0aW9uKGx0KXtyZXR1cm4genRbbHQ+PjFdfTpmdW5jdGlvbihsdCl7cmV0dXJuIG1lW2x0Pj4xXX07Y2FzZSAyOnJldHVybiBZP2Z1bmN0aW9uKGx0KXtyZXR1cm4gY2VbbHQ+PjJdfTpmdW5jdGlvbihsdCl7cmV0dXJuIHBlW2x0Pj4yXX07ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGludGVnZXIgdHlwZTogIitWKX19ZnVuY3Rpb24gaWwoVixHLFksUSxsdCl7Rz1EbihHKSxsdD09PS0xJiYobHQ9NDI5NDk2NzI5NSk7dmFyIE90PXZyKFkpLFJ0PWZ1bmN0aW9uKEt0KXtyZXR1cm4gS3R9O2lmKFE9PT0wKXt2YXIgaHQ9MzItOCpZO1J0PWZ1bmN0aW9uKEt0KXtyZXR1cm4gS3Q8PGh0Pj4+aHR9fXZhciBfdD1HLmluZGV4T2YoInVuc2lnbmVkIikhPS0xO29yKFYse25hbWU6Ryxmcm9tV2lyZVR5cGU6UnQsdG9XaXJlVHlwZTpmdW5jdGlvbihLdCx0ZSl7aWYodHlwZW9mIHRlIT0ibnVtYmVyIiYmdHlwZW9mIHRlIT0iYm9vbGVhbiIpdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgIicrVGkodGUpKyciIHRvICcrdGhpcy5uYW1lKTtpZih0ZTxRfHx0ZT5sdCl0aHJvdyBuZXcgVHlwZUVycm9yKCdQYXNzaW5nIGEgbnVtYmVyICInK1RpKHRlKSsnIiBmcm9tIEpTIHNpZGUgdG8gQy9DKysgc2lkZSB0byBhbiBhcmd1bWVudCBvZiB0eXBlICInK0crJyIsIHdoaWNoIGlzIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlIFsnK1ErIiwgIitsdCsiXSEiKTtyZXR1cm4gX3Q/dGU+Pj4wOnRlfDB9LGFyZ1BhY2tBZHZhbmNlOjgscmVhZFZhbHVlRnJvbVBvaW50ZXI6cmwoRyxPdCxRIT09MCksZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9KX1mdW5jdGlvbiBzbChWLEcsWSl7dmFyIFE9W0ludDhBcnJheSxVaW50OEFycmF5LEludDE2QXJyYXksVWludDE2QXJyYXksSW50MzJBcnJheSxVaW50MzJBcnJheSxGbG9hdDMyQXJyYXksRmxvYXQ2NEFycmF5XSxsdD1RW0ddO2Z1bmN0aW9uIE90KFJ0KXtSdD1SdD4+Mjt2YXIgaHQ9cGUsX3Q9aHRbUnRdLEt0PWh0W1J0KzFdO3JldHVybiBuZXcgbHQobXQsS3QsX3QpfVk9RG4oWSksb3IoVix7bmFtZTpZLGZyb21XaXJlVHlwZTpPdCxhcmdQYWNrQWR2YW5jZTo4LHJlYWRWYWx1ZUZyb21Qb2ludGVyOk90fSx7aWdub3JlRHVwbGljYXRlUmVnaXN0cmF0aW9uczohMH0pfWZ1bmN0aW9uIGNsKFYsRyl7Rz1EbihHKTt2YXIgWT1HPT09InN0ZDo6c3RyaW5nIjtvcihWLHtuYW1lOkcsZnJvbVdpcmVUeXBlOmZ1bmN0aW9uKFEpe3ZhciBsdD1wZVtRPj4yXSxPdDtpZihZKWZvcih2YXIgUnQ9USs0LGh0PTA7aHQ8PWx0OysraHQpe3ZhciBfdD1RKzQraHQ7aWYoaHQ9PWx0fHx2dFtfdF09PTApe3ZhciBLdD1fdC1SdCx0ZT1rKFJ0LEt0KTtPdD09PXZvaWQgMD9PdD10ZTooT3QrPSJcMCIsT3QrPXRlKSxSdD1fdCsxfX1lbHNle2Zvcih2YXIgVGU9bmV3IEFycmF5KGx0KSxodD0wO2h0PGx0OysraHQpVGVbaHRdPVN0cmluZy5mcm9tQ2hhckNvZGUodnRbUSs0K2h0XSk7T3Q9VGUuam9pbigiIil9cmV0dXJuIFcoUSksT3R9LHRvV2lyZVR5cGU6ZnVuY3Rpb24oUSxsdCl7bHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciYmKGx0PW5ldyBVaW50OEFycmF5KGx0KSk7dmFyIE90LFJ0PXR5cGVvZiBsdD09InN0cmluZyI7UnR8fGx0IGluc3RhbmNlb2YgVWludDhBcnJheXx8bHQgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheXx8bHQgaW5zdGFuY2VvZiBJbnQ4QXJyYXl8fHZlKCJDYW5ub3QgcGFzcyBub24tc3RyaW5nIHRvIHN0ZDo6c3RyaW5nIiksWSYmUnQ/T3Q9ZnVuY3Rpb24oKXtyZXR1cm4gUihsdCl9Ok90PWZ1bmN0aW9uKCl7cmV0dXJuIGx0Lmxlbmd0aH07dmFyIGh0PU90KCksX3Q9eig0K2h0KzEpO2lmKHBlW190Pj4yXT1odCxZJiZSdClYKGx0LF90KzQsaHQrMSk7ZWxzZSBpZihSdClmb3IodmFyIEt0PTA7S3Q8aHQ7KytLdCl7dmFyIHRlPWx0LmNoYXJDb2RlQXQoS3QpO3RlPjI1NSYmKFcoX3QpLHZlKCJTdHJpbmcgaGFzIFVURi0xNiBjb2RlIHVuaXRzIHRoYXQgZG8gbm90IGZpdCBpbiA4IGJpdHMiKSksdnRbX3QrNCtLdF09dGV9ZWxzZSBmb3IodmFyIEt0PTA7S3Q8aHQ7KytLdCl2dFtfdCs0K0t0XT1sdFtLdF07cmV0dXJuIFEhPT1udWxsJiZRLnB1c2goVyxfdCksX3R9LGFyZ1BhY2tBZHZhbmNlOjgscmVhZFZhbHVlRnJvbVBvaW50ZXI6ZnIsZGVzdHJ1Y3RvckZ1bmN0aW9uOmZ1bmN0aW9uKFEpe1coUSl9fSl9ZnVuY3Rpb24gYWwoVixHLFkpe1k9RG4oWSk7dmFyIFEsbHQsT3QsUnQsaHQ7Rz09PTI/KFE9Y3QsbHQ9cHQsUnQ9eXQsT3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbWV9LGh0PTEpOkc9PT00JiYoUT1ydCxsdD1QdCxSdD1ndCxPdD1mdW5jdGlvbigpe3JldHVybiBwZX0saHQ9Miksb3IoVix7bmFtZTpZLGZyb21XaXJlVHlwZTpmdW5jdGlvbihfdCl7Zm9yKHZhciBLdD1wZVtfdD4+Ml0sdGU9T3QoKSxUZSxKZT1fdCs0LEFuPTA7QW48PUt0OysrQW4pe3ZhciBvbz1fdCs0K0FuKkc7aWYoQW49PUt0fHx0ZVtvbz4+aHRdPT0wKXt2YXIgSW89b28tSmUscHI9UShKZSxJbyk7VGU9PT12b2lkIDA/VGU9cHI6KFRlKz0iXDAiLFRlKz1wciksSmU9b28rR319cmV0dXJuIFcoX3QpLFRlfSx0b1dpcmVUeXBlOmZ1bmN0aW9uKF90LEt0KXt0eXBlb2YgS3QhPSJzdHJpbmciJiZ2ZSgiQ2Fubm90IHBhc3Mgbm9uLXN0cmluZyB0byBDKysgc3RyaW5nIHR5cGUgIitZKTt2YXIgdGU9UnQoS3QpLFRlPXooNCt0ZStHKTtyZXR1cm4gcGVbVGU+PjJdPXRlPj5odCxsdChLdCxUZSs0LHRlK0cpLF90IT09bnVsbCYmX3QucHVzaChXLFRlKSxUZX0sYXJnUGFja0FkdmFuY2U6OCxyZWFkVmFsdWVGcm9tUG9pbnRlcjpmcixkZXN0cnVjdG9yRnVuY3Rpb246ZnVuY3Rpb24oX3Qpe1coX3QpfX0pfWZ1bmN0aW9uIGZsKFYsRyxZLFEsbHQsT3Qpe3JuW1ZdPXtuYW1lOkRuKEcpLHJhd0NvbnN0cnVjdG9yOnFvKFksUSkscmF3RGVzdHJ1Y3RvcjpxbyhsdCxPdCksZmllbGRzOltdfX1mdW5jdGlvbiB1bChWLEcsWSxRLGx0LE90LFJ0LGh0LF90LEt0KXtybltWXS5maWVsZHMucHVzaCh7ZmllbGROYW1lOkRuKEcpLGdldHRlclJldHVyblR5cGU6WSxnZXR0ZXI6cW8oUSxsdCksZ2V0dGVyQ29udGV4dDpPdCxzZXR0ZXJBcmd1bWVudFR5cGU6UnQsc2V0dGVyOnFvKGh0LF90KSxzZXR0ZXJDb250ZXh0Okt0fSl9ZnVuY3Rpb24gbGwoVixHKXtHPURuKEcpLG9yKFYse2lzVm9pZDohMCxuYW1lOkcsYXJnUGFja0FkdmFuY2U6MCxmcm9tV2lyZVR5cGU6ZnVuY3Rpb24oKXt9LHRvV2lyZVR5cGU6ZnVuY3Rpb24oWSxRKXt9fSl9ZnVuY3Rpb24gZXMoVil7cmV0dXJuIFZ8fHZlKCJDYW5ub3QgdXNlIGRlbGV0ZWQgdmFsLiBoYW5kbGUgPSAiK1YpLGdvW1ZdLnZhbHVlfWZ1bmN0aW9uIHBsKFYsRyxZKXtWPWVzKFYpLEc9RnMoRywiZW12YWw6OmFzIik7dmFyIFE9W10sbHQ9bHIoUSk7cmV0dXJuIGNlW1k+PjJdPWx0LEcudG9XaXJlVHlwZShRLFYpfXZhciBkbD17fTtmdW5jdGlvbiBCcyhWKXt2YXIgRz1kbFtWXTtyZXR1cm4gRz09PXZvaWQgMD9EbihWKTpHfXZhciBrYz1bXTtmdW5jdGlvbiBtbChWLEcsWSxRKXtWPWtjW1ZdLEc9ZXMoRyksWT1CcyhZKSxWKEcsWSxudWxsLFEpfWZ1bmN0aW9uIHRmKCl7cmV0dXJuIHR5cGVvZiBnbG9iYWxUaGlzPT0ib2JqZWN0Ij9nbG9iYWxUaGlzOmZ1bmN0aW9uKCl7cmV0dXJuIEZ1bmN0aW9ufSgpKCJyZXR1cm4gdGhpcyIpKCl9ZnVuY3Rpb24gaGwoVil7cmV0dXJuIFY9PT0wP2xyKHRmKCkpOihWPUJzKFYpLGxyKHRmKClbVl0pKX1mdW5jdGlvbiBfbChWKXt2YXIgRz1rYy5sZW5ndGg7cmV0dXJuIGtjLnB1c2goViksR31mdW5jdGlvbiB5bChWLEcpe2Zvcih2YXIgWT1uZXcgQXJyYXkoViksUT0wO1E8VjsrK1EpWVtRXT1GcyhjZVsoRz4+MikrUV0sInBhcmFtZXRlciAiK1EpO3JldHVybiBZfWZ1bmN0aW9uIGdsKFYsRyl7Zm9yKHZhciBZPXlsKFYsRyksUT1ZWzBdLGx0PVEubmFtZSsiXyQiK1kuc2xpY2UoMSkubWFwKGZ1bmN0aW9uKEFuKXtyZXR1cm4gQW4ubmFtZX0pLmpvaW4oIl8iKSsiJCIsT3Q9WyJyZXRUeXBlIl0sUnQ9W1FdLGh0PSIiLF90PTA7X3Q8Vi0xOysrX3QpaHQrPShfdCE9PTA/IiwgIjoiIikrImFyZyIrX3QsT3QucHVzaCgiYXJnVHlwZSIrX3QpLFJ0LnB1c2goWVsxK190XSk7Zm9yKHZhciBLdD1ZaSgibWV0aG9kQ2FsbGVyXyIrbHQpLHRlPSJyZXR1cm4gZnVuY3Rpb24gIitLdCtgKGhhbmRsZSwgbmFtZSwgZGVzdHJ1Y3RvcnMsIGFyZ3MpIHsKYCxUZT0wLF90PTA7X3Q8Vi0xOysrX3QpdGUrPSIgICAgdmFyIGFyZyIrX3QrIiA9IGFyZ1R5cGUiK190KyIucmVhZFZhbHVlRnJvbVBvaW50ZXIoYXJncyIrKFRlPyIrIitUZToiIikrYCk7CmAsVGUrPVlbX3QrMV0uYXJnUGFja0FkdmFuY2U7dGUrPSIgICAgdmFyIHJ2ID0gaGFuZGxlW25hbWVdKCIraHQrYCk7CmA7Zm9yKHZhciBfdD0wO190PFYtMTsrK190KVlbX3QrMV0uZGVsZXRlT2JqZWN0JiYodGUrPSIgICAgYXJnVHlwZSIrX3QrIi5kZWxldGVPYmplY3QoYXJnIitfdCtgKTsKYCk7US5pc1ZvaWR8fCh0ZSs9YCAgICByZXR1cm4gcmV0VHlwZS50b1dpcmVUeXBlKGRlc3RydWN0b3JzLCBydik7CmApLHRlKz1gfTsKYCxPdC5wdXNoKHRlKTt2YXIgSmU9UWEoRnVuY3Rpb24sT3QpLmFwcGx5KG51bGwsUnQpO3JldHVybiBfbChKZSl9ZnVuY3Rpb24gQWwoVil7cmV0dXJuIFY9QnMoViksbHIobltWXSl9ZnVuY3Rpb24gYmwoVixHKXtyZXR1cm4gVj1lcyhWKSxHPWVzKEcpLGxyKFZbR10pfWZ1bmN0aW9uIHdsKFYpe1Y+NCYmKGdvW1ZdLnJlZmNvdW50Kz0xKX1mdW5jdGlvbiBUbChWKXtmb3IodmFyIEc9IiIsWT0wO1k8VjsrK1kpRys9KFkhPT0wPyIsICI6IiIpKyJhcmciK1k7Zm9yKHZhciBRPSJyZXR1cm4gZnVuY3Rpb24gZW12YWxfYWxsb2NhdG9yXyIrVitgKGNvbnN0cnVjdG9yLCBhcmdUeXBlcywgYXJncykgewpgLFk9MDtZPFY7KytZKVErPSJ2YXIgYXJnVHlwZSIrWSsiID0gcmVxdWlyZVJlZ2lzdGVyZWRUeXBlKE1vZHVsZVsnSEVBUDMyJ11bKGFyZ1R5cGVzID4+PiAyKSArICIrWSsnXSwgInBhcmFtZXRlciAnK1krYCIpOwp2YXIgYXJnYCtZKyIgPSBhcmdUeXBlIitZK2AucmVhZFZhbHVlRnJvbVBvaW50ZXIoYXJncyk7CmFyZ3MgKz0gYXJnVHlwZWArWStgWydhcmdQYWNrQWR2YW5jZSddOwpgO3JldHVybiBRKz0idmFyIG9iaiA9IG5ldyBjb25zdHJ1Y3RvcigiK0crYCk7CnJldHVybiBfX2VtdmFsX3JlZ2lzdGVyKG9iaik7Cn0KYCxuZXcgRnVuY3Rpb24oInJlcXVpcmVSZWdpc3RlcmVkVHlwZSIsIk1vZHVsZSIsIl9fZW12YWxfcmVnaXN0ZXIiLFEpKEZzLG4sbHIpfXZhciBlZj17fTtmdW5jdGlvbiBPbChWLEcsWSxRKXtWPWVzKFYpO3ZhciBsdD1lZltHXTtyZXR1cm4gbHR8fChsdD1UbChHKSxlZltHXT1sdCksbHQoVixZLFEpfWZ1bmN0aW9uIEVsKFYpe3JldHVybiBscihCcyhWKSl9ZnVuY3Rpb24gUmwoVil7dmFyIEc9Z29bVl0udmFsdWU7RW4oRyksVmMoVil9ZnVuY3Rpb24gU2woKXtLZSgpfWZ1bmN0aW9uIENsKFYsRyxZKXt2dC5jb3B5V2l0aGluKFYsRyxHK1kpfWZ1bmN0aW9uIHhsKFYpe3RyeXtyZXR1cm4gQS5ncm93KFYtbXQuYnl0ZUxlbmd0aCs2NTUzNT4+PjE2KSxKdChBLmJ1ZmZlciksMX1jYXRjaHt9fWZ1bmN0aW9uIFBsKFYpe3ZhciBHPXZ0Lmxlbmd0aDtWPVY+Pj4wO3ZhciBZPTIxNDc0ODM2NDg7aWYoVj5ZKXJldHVybiExO2Zvcih2YXIgUT0xO1E8PTQ7USo9Mil7dmFyIGx0PUcqKDErLjIvUSk7bHQ9TWF0aC5taW4obHQsVisxMDA2NjMyOTYpO3ZhciBPdD1NYXRoLm1pbihZLEN0KE1hdGgubWF4KFYsbHQpLDY1NTM2KSksUnQ9eGwoT3QpO2lmKFJ0KXJldHVybiEwfXJldHVybiExfXZhciBVcz17bWFwcGluZ3M6e30sYnVmZmVyczpbbnVsbCxbXSxbXV0scHJpbnRDaGFyOmZ1bmN0aW9uKFYsRyl7dmFyIFk9VXMuYnVmZmVyc1tWXTtHPT09MHx8Rz09PTEwPygoVj09PTE/TjpJKShIKFksMCkpLFkubGVuZ3RoPTApOlkucHVzaChHKX0sdmFyYXJnczp2b2lkIDAsZ2V0OmZ1bmN0aW9uKCl7VXMudmFyYXJncys9NDt2YXIgVj1jZVtVcy52YXJhcmdzLTQ+PjJdO3JldHVybiBWfSxnZXRTdHI6ZnVuY3Rpb24oVil7dmFyIEc9ayhWKTtyZXR1cm4gR30sZ2V0NjQ6ZnVuY3Rpb24oVixHKXtyZXR1cm4gVn19O2Z1bmN0aW9uIE1sKFYpe3JldHVybiAwfWZ1bmN0aW9uIE5sKFYsRyxZLFEsbHQpe31mdW5jdGlvbiBJbChWLEcsWSxRKXtmb3IodmFyIGx0PTAsT3Q9MDtPdDxZO090Kyspe2Zvcih2YXIgUnQ9Y2VbRytPdCo4Pj4yXSxodD1jZVtHKyhPdCo4KzQpPj4yXSxfdD0wO190PGh0O190KyspVXMucHJpbnRDaGFyKFYsdnRbUnQrX3RdKTtsdCs9aHR9cmV0dXJuIGNlW1E+PjJdPWx0LDB9ZnVuY3Rpb24gdmwoVil7dihWfDApfXZzPW4uSW50ZXJuYWxFcnJvcj0kaShFcnJvciwiSW50ZXJuYWxFcnJvciIpLE1jKCksd2k9bi5CaW5kaW5nRXJyb3I9JGkoRXJyb3IsIkJpbmRpbmdFcnJvciIpLFJ1KCksa3UoKSxGdSgpLCRhPW4uVW5ib3VuZFR5cGVFcnJvcj0kaShFcnJvciwiVW5ib3VuZFR5cGVFcnJvciIpLCR1KCk7dmFyIExsPXt0OnBvLEk6eXUseDpIdSx3OnF1LGQ6S3UsazpXdSxIOlp1LG46SnUsYTp0bCxBOm5sLGk6b2wsajppbCxoOnNsLEI6Y2wsdjphbCx1OmZsLGM6dWwsSjpsbCxtOnBsLHM6bWwsYjpWYyx5OmhsLHA6Z2wscjpBbCxlOmJsLGc6d2wscTpPbCxmOkVsLGw6UmwsbzpTbCxFOkNsLEY6UGwsRzpNbCxDOk5sLHo6SWwsRDp2bH0sbmY9V24oKSxSZT1uLl9fX3dhc21fY2FsbF9jdG9ycz1mdW5jdGlvbigpe3JldHVybihSZT1uLl9fX3dhc21fY2FsbF9jdG9ycz1uLmFzbS5MKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHo9bi5fbWFsbG9jPWZ1bmN0aW9uKCl7cmV0dXJuKHo9bi5fbWFsbG9jPW4uYXNtLk0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sVz1uLl9mcmVlPWZ1bmN0aW9uKCl7cmV0dXJuKFc9bi5fZnJlZT1uLmFzbS5OKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGV0PW4uX19fZ2V0VHlwZU5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4oZXQ9bi5fX19nZXRUeXBlTmFtZT1uLmFzbS5QKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LE10PW4uX19fZW1iaW5kX3JlZ2lzdGVyX25hdGl2ZV9hbmRfYnVpbHRpbl90eXBlcz1mdW5jdGlvbigpe3JldHVybihNdD1uLl9fX2VtYmluZF9yZWdpc3Rlcl9uYXRpdmVfYW5kX2J1aWx0aW5fdHlwZXM9bi5hc20uUSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxsZT1uLmR5bkNhbGxfamlqaT1mdW5jdGlvbigpe3JldHVybihsZT1uLmR5bkNhbGxfamlqaT1uLmFzbS5SKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHdlO2Z1bmN0aW9uIE9pKFYpe3RoaXMubmFtZT0iRXhpdFN0YXR1cyIsdGhpcy5tZXNzYWdlPSJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCIrVisiKSIsdGhpcy5zdGF0dXM9Vn1Ibj1mdW5jdGlvbiBWKCl7d2V8fEdjKCksd2V8fChIbj1WKX07ZnVuY3Rpb24gR2MoVil7aWYoVj1WfHxmLG1uPjB8fChwbigpLG1uPjApKXJldHVybjtmdW5jdGlvbiBHKCl7d2V8fCh3ZT0hMCxuLmNhbGxlZFJ1bj0hMCwhUyYmKE9uKCkscmUoKSxvKG4pLG4ub25SdW50aW1lSW5pdGlhbGl6ZWQmJm4ub25SdW50aW1lSW5pdGlhbGl6ZWQoKSwkdCgpKSl9bi5zZXRTdGF0dXM/KG4uc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dChmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtuLnNldFN0YXR1cygiIil9LDEpLEcoKX0sMSkpOkcoKX1pZihuLnJ1bj1HYyxuLnByZUluaXQpZm9yKHR5cGVvZiBuLnByZUluaXQ9PSJmdW5jdGlvbiImJihuLnByZUluaXQ9W24ucHJlSW5pdF0pO24ucHJlSW5pdC5sZW5ndGg+MDspbi5wcmVJbml0LnBvcCgpKCk7cmV0dXJuIEdjKCksZS5yZWFkeX19KCk7dHlwZW9mIG1tPT0ib2JqZWN0IiYmdHlwZW9mIHQxPT0ib2JqZWN0Ij90MS5leHBvcnRzPUpnOnR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLGZ1bmN0aW9uKCl7cmV0dXJuIEpnfSk6dHlwZW9mIG1tPT0ib2JqZWN0IiYmKG1tLkJBU0lTPUpnKX0pO3ZhciBlMT17fTtkZShlMSx7ZGVmYXVsdDooKT0+dzh9KTtmdW5jdGlvbiBfOCh0LGUpe3kudHlwZU9mLm9iamVjdCgidHJhbnNjb2Rlck1vZHVsZSIsX3UpO2xldCBuPXQua3R4MkJ1ZmZlcixvPXQuc3VwcG9ydGVkVGFyZ2V0Rm9ybWF0cyxyO3RyeXtyPUlTKG4pfWNhdGNoe3Rocm93IG5ldyBBZSgiSW52YWxpZCBLVFgyIGZpbGUuIil9aWYoci5sYXllckNvdW50IT09MCl0aHJvdyBuZXcgQWUoIktUWDIgdGV4dHVyZSBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7aWYoci5waXhlbERlcHRoIT09MCl0aHJvdyBuZXcgQWUoIktUWDIgM0QgdGV4dHVyZXMgYXJlIHVuc3VwcG9ydGVkLiIpO2xldCBpPXIuZGF0YUZvcm1hdERlc2NyaXB0b3JbMF0scz1uZXcgQXJyYXkoci5sZXZlbENvdW50KTtyZXR1cm4gci52a0Zvcm1hdD09PTAmJihpLmNvbG9yTW9kZWw9PT1CU3x8aS5jb2xvck1vZGVsPT09VVMpP2c4KG4scixvLF91LGUscyk6KGUucHVzaChuLmJ1ZmZlcikseTgocixzKSksc31mdW5jdGlvbiB5OCh0LGUpe2xldCBuPXQudmtGb3JtYXQ9PT1odS5WS19GT1JNQVRfUjhHOEI4X1NSR0I/VW4uUkdCOlVuLlJHQkEsbzt0LnZrRm9ybWF0PT09aHUuVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNP289a28uVU5TSUdORURfQllURTp0LnZrRm9ybWF0PT09aHUuVktfRk9STUFUX1IxNkcxNkIxNkExNl9TRkxPQVQ/bz1rby5IQUxGX0ZMT0FUOnQudmtGb3JtYXQ9PT1odS5WS19GT1JNQVRfUjMyRzMyQjMyQTMyX1NGTE9BVCYmKG89a28uRkxPQVQpO2ZvcihsZXQgcj0wO3I8dC5sZXZlbHMubGVuZ3RoOysrcil7bGV0IGk9e307ZVtyXT1pO2xldCBzPXQubGV2ZWxzW3JdLmxldmVsRGF0YSxmPXQucGl4ZWxXaWR0aD4+cix1PXQucGl4ZWxIZWlnaHQ+PnIsYz1mKnUqVW4uY29tcG9uZW50c0xlbmd0aChuKTtmb3IobGV0IGw9MDtsPHQuZmFjZUNvdW50OysrbCl7bGV0IHA9cy5ieXRlT2Zmc2V0K2MqdC50eXBlU2l6ZSpsLGQ7IWgobyl8fGtvLnNpemVJbkJ5dGVzKG8pPT09MT9kPW5ldyBVaW50OEFycmF5KHMuYnVmZmVyLHAsYyk6a28uc2l6ZUluQnl0ZXMobyk9PT0yP2Q9bmV3IFVpbnQxNkFycmF5KHMuYnVmZmVyLHAsYyk6ZD1uZXcgRmxvYXQzMkFycmF5KHMuYnVmZmVyLHAsYyksaVtGU1tsXV09e2ludGVybmFsRm9ybWF0Om4sZGF0YXR5cGU6byx3aWR0aDpmLGhlaWdodDp1LGxldmVsQnVmZmVyOmR9fX19ZnVuY3Rpb24gZzgodCxlLG4sbyxyLGkpe2xldCBzPW5ldyBvLktUWDJGaWxlKHQpLGY9cy5nZXRXaWR0aCgpLHU9cy5nZXRIZWlnaHQoKSxjPXMuZ2V0TGV2ZWxzKCksbD1zLmdldEhhc0FscGhhKCk7aWYoIShmPjApfHwhKHU+MCl8fCEoYz4wKSl0aHJvdyBzLmNsb3NlKCkscy5kZWxldGUoKSxuZXcgQWUoIkludmFsaWQgS1RYMiBmaWxlIik7bGV0IHAsZCxtPWUuZGF0YUZvcm1hdERlc2NyaXB0b3JbMF0sXz1vLnRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ7aWYobS5jb2xvck1vZGVsPT09QlMpaWYobi5ldGMpcD1sP1VuLlJHQkE4X0VUQzJfRUFDOlVuLlJHQjhfRVRDMixkPWw/Xy5jVEZFVEMyX1JHQkE6Xy5jVEZFVEMxX1JHQjtlbHNlIGlmKG4uZXRjMSYmIWwpcD1Vbi5SR0JfRVRDMSxkPV8uY1RGRVRDMV9SR0I7ZWxzZSBpZihuLnMzdGMpcD1sP1VuLlJHQkFfRFhUNTpVbi5SR0JfRFhUMSxkPWw/Xy5jVEZCQzNfUkdCQTpfLmNURkJDMV9SR0I7ZWxzZSBpZihuLnB2cnRjKXA9bD9Vbi5SR0JBX1BWUlRDXzRCUFBWMTpVbi5SR0JfUFZSVENfNEJQUFYxLGQ9bD9fLmNURlBWUlRDMV80X1JHQkE6Xy5jVEZQVlJUQzFfNF9SR0I7ZWxzZSBpZihuLmFzdGMpcD1Vbi5SR0JBX0FTVEMsZD1fLmNURkFTVENfNHg0X1JHQkE7ZWxzZSBpZihuLmJjNylwPVVuLlJHQkFfQkM3LGQ9Xy5jVEZCQzdfUkdCQTtlbHNlIHRocm93IG5ldyBBZSgiTm8gdHJhbnNjb2RpbmcgZm9ybWF0IHRhcmdldCBhdmFpbGFibGUgZm9yIEVUQzFTIGNvbXByZXNzZWQga3R4Mi4iKTtlbHNlIGlmKG0uY29sb3JNb2RlbD09PVVTKWlmKG4uYXN0YylwPVVuLlJHQkFfQVNUQyxkPV8uY1RGQVNUQ180eDRfUkdCQTtlbHNlIGlmKG4uYmM3KXA9VW4uUkdCQV9CQzcsZD1fLmNURkJDN19SR0JBO2Vsc2UgaWYobi5zM3RjKXA9bD9Vbi5SR0JBX0RYVDU6VW4uUkdCX0RYVDEsZD1sP18uY1RGQkMzX1JHQkE6Xy5jVEZCQzFfUkdCO2Vsc2UgaWYobi5ldGMpcD1sP1VuLlJHQkE4X0VUQzJfRUFDOlVuLlJHQjhfRVRDMixkPWw/Xy5jVEZFVEMyX1JHQkE6Xy5jVEZFVEMxX1JHQjtlbHNlIGlmKG4uZXRjMSYmIWwpcD1Vbi5SR0JfRVRDMSxkPV8uY1RGRVRDMV9SR0I7ZWxzZSBpZihuLnB2cnRjKXA9bD9Vbi5SR0JBX1BWUlRDXzRCUFBWMTpVbi5SR0JfUFZSVENfNEJQUFYxLGQ9bD9fLmNURlBWUlRDMV80X1JHQkE6Xy5jVEZQVlJUQzFfNF9SR0I7ZWxzZSB0aHJvdyBuZXcgQWUoIk5vIHRyYW5zY29kaW5nIGZvcm1hdCB0YXJnZXQgYXZhaWxhYmxlIGZvciBVQVNUQyBjb21wcmVzc2VkIGt0eDIuIik7aWYoIXMuc3RhcnRUcmFuc2NvZGluZygpKXRocm93IHMuY2xvc2UoKSxzLmRlbGV0ZSgpLG5ldyBBZSgic3RhcnRUcmFuc2NvZGluZygpIGZhaWxlZCIpO2ZvcihsZXQgZz0wO2c8ZS5sZXZlbHMubGVuZ3RoOysrZyl7bGV0IGI9e307aVtnXT1iLGY9ZS5waXhlbFdpZHRoPj5nLHU9ZS5waXhlbEhlaWdodD4+ZztsZXQgdz1zLmdldEltYWdlVHJhbnNjb2RlZFNpemVJbkJ5dGVzKGcsMCwwLGQudmFsdWUpLE89bmV3IFVpbnQ4QXJyYXkodyksRT1zLnRyYW5zY29kZUltYWdlKE8sZywwLDAsZC52YWx1ZSwwLC0xLC0xKTtpZighaChFKSl0aHJvdyBuZXcgQWUoInRyYW5zY29kZUltYWdlKCkgZmFpbGVkLiIpO3IucHVzaChPLmJ1ZmZlciksYltGU1swXV09e2ludGVybmFsRm9ybWF0OnAsd2lkdGg6ZixoZWlnaHQ6dSxsZXZlbEJ1ZmZlcjpPfX1yZXR1cm4gcy5jbG9zZSgpLHMuZGVsZXRlKCksaX1hc3luYyBmdW5jdGlvbiBBOCh0LGUpe2xldCBuPXQud2ViQXNzZW1ibHlDb25maWcsbz14KERTLmRlZmF1bHQsc2VsZi5CQVNJUyk7cmV0dXJuIGgobi53YXNtQmluYXJ5RmlsZSk/X3U9YXdhaXQgbyhuKTpfdT1hd2FpdCBvKCksX3UuaW5pdGlhbGl6ZUJhc2lzKCksITB9ZnVuY3Rpb24gYjgodCxlKXtsZXQgbj10LndlYkFzc2VtYmx5Q29uZmlnO3JldHVybiBoKG4pP0E4KHQsZSk6XzgodCxlKX12YXIgRFMsRlMsQlMsVVMsX3UsdzgsbjE9WigoKT0+e0l0KCk7ZnQoKTtYdCgpO1BTKCk7SnIoKTtNUygpO1pnKCk7c28oKTt2UygpO0RTPXJyKExTKCksMSksRlM9WyJwb3NpdGl2ZVgiLCJuZWdhdGl2ZVgiLCJwb3NpdGl2ZVkiLCJuZWdhdGl2ZVkiLCJwb3NpdGl2ZVoiLCJuZWdhdGl2ZVoiXSxCUz0xNjMsVVM9MTY2O3c4PVFlKGI4KX0pO3ZhciBWUz17fTt2YXIgbzE9WigoKT0+e3NlbGYub25tZXNzYWdlPWZ1bmN0aW9uKHQpe2xldCBlPXQuZGF0YS5hcnJheSxuPXNlbGYud2Via2l0UG9zdE1lc3NhZ2V8fHNlbGYucG9zdE1lc3NhZ2U7dHJ5e24oe2FycmF5OmV9LFtlLmJ1ZmZlcl0pfWNhdGNoe24oe30pfX19KTt2YXIgaG0sX20sa1M9WigoKT0+e0ZlKCk7RnQoKTtYdCgpO2Z0KCk7SHQoKTtobT17fTtobS5jbGlwVHJpYW5nbGVBdEF4aXNBbGlnbmVkVGhyZXNob2xkPWZ1bmN0aW9uKHQsZSxuLG8scixpKXtpZighaCh0KSl0aHJvdyBuZXcgRigidGhyZXNob2xkIGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBGKCJrZWVwQWJvdmUgaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEYoInUwIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG8pKXRocm93IG5ldyBGKCJ1MSBpcyByZXF1aXJlZC4iKTtpZighaChyKSl0aHJvdyBuZXcgRigidTIgaXMgcmVxdWlyZWQuIik7aChpKT9pLmxlbmd0aD0wOmk9W107bGV0IHMsZix1O2U/KHM9bjx0LGY9bzx0LHU9cjx0KToocz1uPnQsZj1vPnQsdT1yPnQpO2xldCBjPXMrZit1LGwscCxkLG0sXyxnO3JldHVybiBjPT09MT9zPyhsPSh0LW4pLyhvLW4pLHA9KHQtbikvKHItbiksaS5wdXNoKDEpLGkucHVzaCgyKSxwIT09MSYmKGkucHVzaCgtMSksaS5wdXNoKDApLGkucHVzaCgyKSxpLnB1c2gocCkpLGwhPT0xJiYoaS5wdXNoKC0xKSxpLnB1c2goMCksaS5wdXNoKDEpLGkucHVzaChsKSkpOmY/KGQ9KHQtbykvKHItbyksbT0odC1vKS8obi1vKSxpLnB1c2goMiksaS5wdXNoKDApLG0hPT0xJiYoaS5wdXNoKC0xKSxpLnB1c2goMSksaS5wdXNoKDApLGkucHVzaChtKSksZCE9PTEmJihpLnB1c2goLTEpLGkucHVzaCgxKSxpLnB1c2goMiksaS5wdXNoKGQpKSk6dSYmKF89KHQtcikvKG4tciksZz0odC1yKS8oby1yKSxpLnB1c2goMCksaS5wdXNoKDEpLGchPT0xJiYoaS5wdXNoKC0xKSxpLnB1c2goMiksaS5wdXNoKDEpLGkucHVzaChnKSksXyE9PTEmJihpLnB1c2goLTEpLGkucHVzaCgyKSxpLnB1c2goMCksaS5wdXNoKF8pKSk6Yz09PTI/IXMmJm4hPT10PyhtPSh0LW8pLyhuLW8pLF89KHQtcikvKG4tciksaS5wdXNoKDApLGkucHVzaCgtMSksaS5wdXNoKDEpLGkucHVzaCgwKSxpLnB1c2gobSksaS5wdXNoKC0xKSxpLnB1c2goMiksaS5wdXNoKDApLGkucHVzaChfKSk6IWYmJm8hPT10PyhnPSh0LXIpLyhvLXIpLGw9KHQtbikvKG8tbiksaS5wdXNoKDEpLGkucHVzaCgtMSksaS5wdXNoKDIpLGkucHVzaCgxKSxpLnB1c2goZyksaS5wdXNoKC0xKSxpLnB1c2goMCksaS5wdXNoKDEpLGkucHVzaChsKSk6IXUmJnIhPT10JiYocD0odC1uKS8oci1uKSxkPSh0LW8pLyhyLW8pLGkucHVzaCgyKSxpLnB1c2goLTEpLGkucHVzaCgwKSxpLnB1c2goMiksaS5wdXNoKHApLGkucHVzaCgtMSksaS5wdXNoKDEpLGkucHVzaCgyKSxpLnB1c2goZCkpOmMhPT0zJiYoaS5wdXNoKDApLGkucHVzaCgxKSxpLnB1c2goMikpLGl9O2htLmNvbXB1dGVCYXJ5Y2VudHJpY0Nvb3JkaW5hdGVzPWZ1bmN0aW9uKHQsZSxuLG8scixpLHMsZix1KXtpZighaCh0KSl0aHJvdyBuZXcgRigieCBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgRigieSBpcyByZXF1aXJlZC4iKTtpZighaChuKSl0aHJvdyBuZXcgRigieDEgaXMgcmVxdWlyZWQuIik7aWYoIWgobykpdGhyb3cgbmV3IEYoInkxIGlzIHJlcXVpcmVkLiIpO2lmKCFoKHIpKXRocm93IG5ldyBGKCJ4MiBpcyByZXF1aXJlZC4iKTtpZighaChpKSl0aHJvdyBuZXcgRigieTIgaXMgcmVxdWlyZWQuIik7aWYoIWgocykpdGhyb3cgbmV3IEYoIngzIGlzIHJlcXVpcmVkLiIpO2lmKCFoKGYpKXRocm93IG5ldyBGKCJ5MyBpcyByZXF1aXJlZC4iKTtsZXQgYz1uLXMsbD1zLXIscD1pLWYsZD1vLWYsbT0xLyhwKmMrbCpkKSxfPWUtZixnPXQtcyxiPShwKmcrbCpfKSptLHc9KC1kKmcrYypfKSptLE89MS1iLXc7cmV0dXJuIGgodSk/KHUueD1iLHUueT13LHUuej1PLHUpOm5ldyBhKGIsdyxPKX07aG0uY29tcHV0ZUxpbmVTZWdtZW50TGluZVNlZ21lbnRJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4sbyxyLGkscyxmLHUpe3kudHlwZU9mLm51bWJlcigieDAwIix0KSx5LnR5cGVPZi5udW1iZXIoInkwMCIsZSkseS50eXBlT2YubnVtYmVyKCJ4MDEiLG4pLHkudHlwZU9mLm51bWJlcigieTAxIixvKSx5LnR5cGVPZi5udW1iZXIoIngxMCIscikseS50eXBlT2YubnVtYmVyKCJ5MTAiLGkpLHkudHlwZU9mLm51bWJlcigieDExIixzKSx5LnR5cGVPZi5udW1iZXIoInkxMSIsZik7bGV0IGM9KHMtcikqKGUtaSktKGYtaSkqKHQtciksbD0obi10KSooZS1pKS0oby1lKSoodC1yKSxwPShmLWkpKihuLXQpLShzLXIpKihvLWUpO2lmKHA9PT0wKXJldHVybjtsZXQgZD1jL3AsbT1sL3A7aWYoZD49MCYmZDw9MSYmbT49MCYmbTw9MSlyZXR1cm4gaCh1KXx8KHU9bmV3IHR0KSx1Lng9dCtkKihuLXQpLHUueT1lK2QqKG8tZSksdX07X209aG19KTt2YXIgcjE9e307ZGUocjEse2RlZmF1bHQ6KCk9PkI4fSk7ZnVuY3Rpb24gTDgodCxlKXtsZXQgbj10LmlzRWFzdENoaWxkLG89dC5pc05vcnRoQ2hpbGQscj1uPyRyOjAsaT1uP3puOiRyLHM9bz8kcjowLGY9bz96bjokcix1PUU4LGM9UjgsbD1TOCxwPXg4O3UubGVuZ3RoPTAsYy5sZW5ndGg9MCxsLmxlbmd0aD0wLHAubGVuZ3RoPTA7bGV0IGQ9Qzg7ZC5sZW5ndGg9MDtsZXQgbT17fSxfPXQudmVydGljZXMsZz10LmluZGljZXM7Zz1nLnN1YmFycmF5KDAsdC5pbmRleENvdW50V2l0aG91dFNraXJ0cyk7bGV0IGI9UHMuY2xvbmUodC5lbmNvZGluZyksdz1iLmhhc1ZlcnRleE5vcm1hbHMsTz0wLEU9dC52ZXJ0ZXhDb3VudFdpdGhvdXRTa2lydHMsVD10Lm1pbmltdW1IZWlnaHQsQz10Lm1heGltdW1IZWlnaHQsTj1uZXcgQXJyYXkoRSksST1uZXcgQXJyYXkoRSksRD1uZXcgQXJyYXkoRSksdj13P25ldyBBcnJheShFKjIpOnZvaWQgMCxMPTIwLFUsQSxTLFAsQjtmb3IoQT0wLFM9MDtBPEU7KytBLFMrPTIpe2xldCBrZT1iLmRlY29kZVRleHR1cmVDb29yZGluYXRlcyhfLEEsSTgpO2lmKFU9Yi5kZWNvZGVIZWlnaHQoXyxBKSxQPU0uY2xhbXAoa2UueCp6bnwwLDAsem4pLEI9TS5jbGFtcChrZS55KnpufDAsMCx6biksRFtBXT1NLmNsYW1wKChVLVQpLyhDLVQpKnpufDAsMCx6biksUDxMJiYoUD0wKSxCPEwmJihCPTApLHpuLVA8TCYmKFA9em4pLHpuLUI8TCYmKEI9em4pLE5bQV09UCxJW0FdPUIsdyl7bGV0IGJlPWIuZ2V0T2N0RW5jb2RlZE5vcm1hbChfLEEsdjgpO3ZbU109YmUueCx2W1MrMV09YmUueX0obiYmUD49JHJ8fCFuJiZQPD0kcikmJihvJiZCPj0kcnx8IW8mJkI8PSRyKSYmKG1bQV09Tyx1LnB1c2goUCksYy5wdXNoKEIpLGwucHVzaChEW0FdKSx3JiYocC5wdXNoKHZbU10pLHAucHVzaCh2W1MrMV0pKSwrK08pfWxldCBqPVtdO2oucHVzaChuZXcgam4pLGoucHVzaChuZXcgam4pLGoucHVzaChuZXcgam4pO2xldCBIPVtdO0gucHVzaChuZXcgam4pLEgucHVzaChuZXcgam4pLEgucHVzaChuZXcgam4pO2xldCBrLEs7Zm9yKEE9MDtBPGcubGVuZ3RoO0ErPTMpe2xldCBrZT1nW0FdLGJlPWdbQSsxXSxsbj1nW0ErMl0scG49TltrZV0sT249TltiZV0scmU9Tltsbl07alswXS5pbml0aWFsaXplSW5kZXhlZChOLEksRCx2LGtlKSxqWzFdLmluaXRpYWxpemVJbmRleGVkKE4sSSxELHYsYmUpLGpbMl0uaW5pdGlhbGl6ZUluZGV4ZWQoTixJLEQsdixsbik7bGV0ICR0PV9tLmNsaXBUcmlhbmdsZUF0QXhpc0FsaWduZWRUaHJlc2hvbGQoJHIsbixwbixPbixyZSxUOCk7az0wLCEoaz49JHQubGVuZ3RoKSYmKGs9SFswXS5pbml0aWFsaXplRnJvbUNsaXBSZXN1bHQoJHQsayxqKSwhKGs+PSR0Lmxlbmd0aCkmJihrPUhbMV0uaW5pdGlhbGl6ZUZyb21DbGlwUmVzdWx0KCR0LGssaiksIShrPj0kdC5sZW5ndGgpJiYoaz1IWzJdLmluaXRpYWxpemVGcm9tQ2xpcFJlc3VsdCgkdCxrLGopLEs9X20uY2xpcFRyaWFuZ2xlQXRBeGlzQWxpZ25lZFRocmVzaG9sZCgkcixvLEhbMF0uZ2V0VigpLEhbMV0uZ2V0VigpLEhbMl0uZ2V0VigpLEdTKSx6Uyh1LGMsbCxwLGQsbSxLLEgsdyksazwkdC5sZW5ndGgmJihIWzJdLmNsb25lKEhbMV0pLEhbMl0uaW5pdGlhbGl6ZUZyb21DbGlwUmVzdWx0KCR0LGssaiksSz1fbS5jbGlwVHJpYW5nbGVBdEF4aXNBbGlnbmVkVGhyZXNob2xkKCRyLG8sSFswXS5nZXRWKCksSFsxXS5nZXRWKCksSFsyXS5nZXRWKCksR1MpLHpTKHUsYyxsLHAsZCxtLEssSCx3KSkpKSl9bGV0IFg9bj8tem46MCxSPW8/LXpuOjAsb3Q9W10sY3Q9W10scHQ9W10seXQ9W10scnQ9TnVtYmVyLk1BWF9WQUxVRSxQdD0tcnQsZ3Q9Tzg7Z3QubGVuZ3RoPTA7bGV0IEN0PSQuY2xvbmUodC5lbGxpcHNvaWQpLG10PU50LmNsb25lKHQuY2hpbGRSZWN0YW5nbGUpLHV0PW10Lm5vcnRoLHZ0PW10LnNvdXRoLHp0PW10LmVhc3QsbWU9bXQud2VzdDtmb3IoenQ8bWUmJih6dCs9TS5UV09fUEkpLEE9MDtBPHUubGVuZ3RoOysrQSlQPU1hdGgucm91bmQodVtBXSksUDw9cj8ob3QucHVzaChBKSxQPTApOlA+PWk/KHB0LnB1c2goQSksUD16bik6UD1QKjIrWCx1W0FdPVAsQj1NYXRoLnJvdW5kKGNbQV0pLEI8PXM/KGN0LnB1c2goQSksQj0wKTpCPj1mPyh5dC5wdXNoKEEpLEI9em4pOkI9QioyK1IsY1tBXT1CLFU9TS5sZXJwKFQsQyxsW0FdL3puKSxVPHJ0JiYocnQ9VSksVT5QdCYmKFB0PVUpLGxbQV09VSx5bS5sb25naXR1ZGU9TS5sZXJwKG1lLHp0LFAvem4pLHltLmxhdGl0dWRlPU0ubGVycCh2dCx1dCxCL3puKSx5bS5oZWlnaHQ9VSxDdC5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbih5bSxYaSksZ3QucHVzaChYaS54KSxndC5wdXNoKFhpLnkpLGd0LnB1c2goWGkueik7bGV0IGNlPUF0LmZyb21WZXJ0aWNlcyhndCxhLlpFUk8sMyxNOCkscGU9U28uZnJvbVJlY3RhbmdsZShtdCxydCxQdCxDdCxOOCksUXQ9bmV3IHhzKEN0KS5jb21wdXRlSG9yaXpvbkN1bGxpbmdQb2ludEZyb21WZXJ0aWNlc1Bvc3NpYmx5VW5kZXJFbGxpcHNvaWQoY2UuY2VudGVyLGd0LDMsY2UuY2VudGVyLHJ0LFA4KSxKdD1QdC1ydCx4ZT1uZXcgVWludDE2QXJyYXkodS5sZW5ndGgrYy5sZW5ndGgrbC5sZW5ndGgpO2ZvcihBPTA7QTx1Lmxlbmd0aDsrK0EpeGVbQV09dVtBXTtsZXQgZ2U9dS5sZW5ndGg7Zm9yKEE9MDtBPGMubGVuZ3RoOysrQSl4ZVtnZStBXT1jW0FdO2ZvcihnZSs9Yy5sZW5ndGgsQT0wO0E8bC5sZW5ndGg7KytBKXhlW2dlK0FdPXpuKihsW0FdLXJ0KS9KdDtsZXQgRWU9RHQuY3JlYXRlVHlwZWRBcnJheSh1Lmxlbmd0aCxkKSx1bjtpZih3KXtsZXQga2U9bmV3IFVpbnQ4QXJyYXkocCk7ZS5wdXNoKHhlLmJ1ZmZlcixFZS5idWZmZXIsa2UuYnVmZmVyKSx1bj1rZS5idWZmZXJ9ZWxzZSBlLnB1c2goeGUuYnVmZmVyLEVlLmJ1ZmZlcik7cmV0dXJue3ZlcnRpY2VzOnhlLmJ1ZmZlcixlbmNvZGVkTm9ybWFsczp1bixpbmRpY2VzOkVlLmJ1ZmZlcixtaW5pbXVtSGVpZ2h0OnJ0LG1heGltdW1IZWlnaHQ6UHQsd2VzdEluZGljZXM6b3Qsc291dGhJbmRpY2VzOmN0LGVhc3RJbmRpY2VzOnB0LG5vcnRoSW5kaWNlczp5dCxib3VuZGluZ1NwaGVyZTpjZSxvcmllbnRlZEJvdW5kaW5nQm94OnBlLGhvcml6b25PY2NsdXNpb25Qb2ludDpRdH19ZnVuY3Rpb24gam4oKXt0aGlzLnZlcnRleEJ1ZmZlcj12b2lkIDAsdGhpcy5pbmRleD12b2lkIDAsdGhpcy5maXJzdD12b2lkIDAsdGhpcy5zZWNvbmQ9dm9pZCAwLHRoaXMucmF0aW89dm9pZCAwfWZ1bmN0aW9uIGpTKHQsZSl7KytnbTtsZXQgbj1EOFtnbV0sbz1GOFtnbV07cmV0dXJuIG49bm4ub2N0RGVjb2RlKHQuZmlyc3QuZ2V0Tm9ybWFsWCgpLHQuZmlyc3QuZ2V0Tm9ybWFsWSgpLG4pLG89bm4ub2N0RGVjb2RlKHQuc2Vjb25kLmdldE5vcm1hbFgoKSx0LnNlY29uZC5nZXROb3JtYWxZKCksbyksWGk9YS5sZXJwKG4sbyx0LnJhdGlvLFhpKSxhLm5vcm1hbGl6ZShYaSxYaSksbm4ub2N0RW5jb2RlKFhpLGUpLC0tZ20sZX1mdW5jdGlvbiB6Uyh0LGUsbixvLHIsaSxzLGYsdSl7aWYocy5sZW5ndGg9PT0wKXJldHVybjtsZXQgYz0wLGw9MDtmb3IoO2w8cy5sZW5ndGg7KWw9em9bYysrXS5pbml0aWFsaXplRnJvbUNsaXBSZXN1bHQocyxsLGYpO2ZvcihsZXQgcD0wO3A8YzsrK3Ape2xldCBkPXpvW3BdO2lmKGQuaXNJbmRleGVkKCkpZC5uZXdJbmRleD1pW2QuaW5kZXhdLGQudUJ1ZmZlcj10LGQudkJ1ZmZlcj1lLGQuaGVpZ2h0QnVmZmVyPW4sdSYmKGQubm9ybWFsQnVmZmVyPW8pO2Vsc2V7bGV0IG09ZC5nZXRLZXkoKTtpZihoKGlbbV0pKWQubmV3SW5kZXg9aVttXTtlbHNle2xldCBfPXQubGVuZ3RoO3QucHVzaChkLmdldFUoKSksZS5wdXNoKGQuZ2V0VigpKSxuLnB1c2goZC5nZXRIKCkpLHUmJihvLnB1c2goZC5nZXROb3JtYWxYKCkpLG8ucHVzaChkLmdldE5vcm1hbFkoKSkpLGQubmV3SW5kZXg9XyxpW21dPV99fX1jPT09Mz8oci5wdXNoKHpvWzBdLm5ld0luZGV4KSxyLnB1c2goem9bMV0ubmV3SW5kZXgpLHIucHVzaCh6b1syXS5uZXdJbmRleCkpOmM9PT00JiYoci5wdXNoKHpvWzBdLm5ld0luZGV4KSxyLnB1c2goem9bMV0ubmV3SW5kZXgpLHIucHVzaCh6b1syXS5uZXdJbmRleCksci5wdXNoKHpvWzBdLm5ld0luZGV4KSxyLnB1c2goem9bMl0ubmV3SW5kZXgpLHIucHVzaCh6b1szXS5uZXdJbmRleCkpfXZhciB6biwkcixUOCxHUyxPOCx5bSxYaSxFOCxSOCxTOCxDOCx4OCxQOCxNOCxOOCxJOCx2OCxqYSxnbSxEOCxGOCx6byxCOCxpMT1aKCgpPT57YXMoKTtNZSgpO0ZlKCk7RnQoKTtQZSgpO2Z0KCk7WnQoKTtydSgpOyRlKCk7a1MoKTtXdCgpO3BhKCk7d24oKTtpdSgpO3NvKCk7em49MzI3NjcsJHI9em4vMnwwLFQ4PVtdLEdTPVtdLE84PVtdLHltPW5ldyBhdCxYaT1uZXcgYSxFOD1bXSxSOD1bXSxTOD1bXSxDOD1bXSx4OD1bXSxQOD1uZXcgYSxNOD1uZXcgQXQsTjg9bmV3IFNvLEk4PW5ldyB0dCx2OD1uZXcgYTtqbi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIGgodCl8fCh0PW5ldyBqbiksdC51QnVmZmVyPXRoaXMudUJ1ZmZlcix0LnZCdWZmZXI9dGhpcy52QnVmZmVyLHQuaGVpZ2h0QnVmZmVyPXRoaXMuaGVpZ2h0QnVmZmVyLHQubm9ybWFsQnVmZmVyPXRoaXMubm9ybWFsQnVmZmVyLHQuaW5kZXg9dGhpcy5pbmRleCx0LmZpcnN0PXRoaXMuZmlyc3QsdC5zZWNvbmQ9dGhpcy5zZWNvbmQsdC5yYXRpbz10aGlzLnJhdGlvLHR9O2puLnByb3RvdHlwZS5pbml0aWFsaXplSW5kZXhlZD1mdW5jdGlvbih0LGUsbixvLHIpe3RoaXMudUJ1ZmZlcj10LHRoaXMudkJ1ZmZlcj1lLHRoaXMuaGVpZ2h0QnVmZmVyPW4sdGhpcy5ub3JtYWxCdWZmZXI9byx0aGlzLmluZGV4PXIsdGhpcy5maXJzdD12b2lkIDAsdGhpcy5zZWNvbmQ9dm9pZCAwLHRoaXMucmF0aW89dm9pZCAwfTtqbi5wcm90b3R5cGUuaW5pdGlhbGl6ZUZyb21DbGlwUmVzdWx0PWZ1bmN0aW9uKHQsZSxuKXtsZXQgbz1lKzE7cmV0dXJuIHRbZV0hPT0tMT9uW3RbZV1dLmNsb25lKHRoaXMpOih0aGlzLnZlcnRleEJ1ZmZlcj12b2lkIDAsdGhpcy5pbmRleD12b2lkIDAsdGhpcy5maXJzdD1uW3Rbb11dLCsrbyx0aGlzLnNlY29uZD1uW3Rbb11dLCsrbyx0aGlzLnJhdGlvPXRbb10sKytvKSxvfTtqbi5wcm90b3R5cGUuZ2V0S2V5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNJbmRleGVkKCk/dGhpcy5pbmRleDpKU09OLnN0cmluZ2lmeSh7Zmlyc3Q6dGhpcy5maXJzdC5nZXRLZXkoKSxzZWNvbmQ6dGhpcy5zZWNvbmQuZ2V0S2V5KCkscmF0aW86dGhpcy5yYXRpb30pfTtqbi5wcm90b3R5cGUuaXNJbmRleGVkPWZ1bmN0aW9uKCl7cmV0dXJuIGgodGhpcy5pbmRleCl9O2puLnByb3RvdHlwZS5nZXRIPWZ1bmN0aW9uKCl7cmV0dXJuIGgodGhpcy5pbmRleCk/dGhpcy5oZWlnaHRCdWZmZXJbdGhpcy5pbmRleF06TS5sZXJwKHRoaXMuZmlyc3QuZ2V0SCgpLHRoaXMuc2Vjb25kLmdldEgoKSx0aGlzLnJhdGlvKX07am4ucHJvdG90eXBlLmdldFU9ZnVuY3Rpb24oKXtyZXR1cm4gaCh0aGlzLmluZGV4KT90aGlzLnVCdWZmZXJbdGhpcy5pbmRleF06TS5sZXJwKHRoaXMuZmlyc3QuZ2V0VSgpLHRoaXMuc2Vjb25kLmdldFUoKSx0aGlzLnJhdGlvKX07am4ucHJvdG90eXBlLmdldFY9ZnVuY3Rpb24oKXtyZXR1cm4gaCh0aGlzLmluZGV4KT90aGlzLnZCdWZmZXJbdGhpcy5pbmRleF06TS5sZXJwKHRoaXMuZmlyc3QuZ2V0VigpLHRoaXMuc2Vjb25kLmdldFYoKSx0aGlzLnJhdGlvKX07amE9bmV3IHR0LGdtPS0xLEQ4PVtuZXcgYSxuZXcgYV0sRjg9W25ldyBhLG5ldyBhXTtqbi5wcm90b3R5cGUuZ2V0Tm9ybWFsWD1mdW5jdGlvbigpe3JldHVybiBoKHRoaXMuaW5kZXgpP3RoaXMubm9ybWFsQnVmZmVyW3RoaXMuaW5kZXgqMl06KGphPWpTKHRoaXMsamEpLGphLngpfTtqbi5wcm90b3R5cGUuZ2V0Tm9ybWFsWT1mdW5jdGlvbigpe3JldHVybiBoKHRoaXMuaW5kZXgpP3RoaXMubm9ybWFsQnVmZmVyW3RoaXMuaW5kZXgqMisxXTooamE9alModGhpcyxqYSksamEueSl9O3pvPVtdO3pvLnB1c2gobmV3IGpuKTt6by5wdXNoKG5ldyBqbik7em8ucHVzaChuZXcgam4pO3pvLnB1c2gobmV3IGpuKTtCOD1RZShMOCl9KTt2YXIgVTgsczE9WigoKT0+e1U4PXAxKHsiLi9jb21iaW5lR2VvbWV0cnkuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4obzAoKSxuMCkpLCIuL2NyZWF0ZUJveEdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KGMwKCksczApKSwiLi9jcmVhdGVCb3hPdXRsaW5lR2VvbWV0cnkuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4odTAoKSxmMCkpLCIuL2NyZWF0ZUNpcmNsZUdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KGIwKCksQTApKSwiLi9jcmVhdGVDaXJjbGVPdXRsaW5lR2VvbWV0cnkuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4oRTAoKSxPMCkpLCIuL2NyZWF0ZUNvcGxhbmFyUG9seWdvbkdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KEIwKCksRjApKSwiLi9jcmVhdGVDb3BsYW5hclBvbHlnb25PdXRsaW5lR2VvbWV0cnkuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4oazAoKSxWMCkpLCIuL2NyZWF0ZUNvcnJpZG9yR2VvbWV0cnkuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4ob18oKSxuXykpLCIuL2NyZWF0ZUNvcnJpZG9yT3V0bGluZUdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KHNfKCksaV8pKSwiLi9jcmVhdGVDeWxpbmRlckdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KHBfKCksbF8pKSwiLi9jcmVhdGVDeWxpbmRlck91dGxpbmVHZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihfXygpLGhfKSksIi4vY3JlYXRlRWxsaXBzZUdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KGdfKCkseV8pKSwiLi9jcmVhdGVFbGxpcHNlT3V0bGluZUdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KGJfKCksQV8pKSwiLi9jcmVhdGVFbGxpcHNvaWRHZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihPXygpLFRfKSksIi4vY3JlYXRlRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KFNfKCksUl8pKSwiLi9jcmVhdGVGcnVzdHVtR2VvbWV0cnkuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4oRF8oKSxMXykpLCIuL2NyZWF0ZUZydXN0dW1PdXRsaW5lR2VvbWV0cnkuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4oVl8oKSxVXykpLCIuL2NyZWF0ZUdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KGExKCksYzEpKSwiLi9jcmVhdGVHcm91bmRQb2x5bGluZUdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KFFfKCksWl8pKSwiLi9jcmVhdGVQbGFuZUdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KGV5KCksdHkpKSwiLi9jcmVhdGVQbGFuZU91dGxpbmVHZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihyeSgpLG95KSksIi4vY3JlYXRlUG9seWdvbkdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KGF5KCksY3kpKSwiLi9jcmVhdGVQb2x5Z29uT3V0bGluZUdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KGx5KCksdXkpKSwiLi9jcmVhdGVQb2x5bGluZUdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KHl5KCksX3kpKSwiLi9jcmVhdGVQb2x5bGluZVZvbHVtZUdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KGJ5KCksQXkpKSwiLi9jcmVhdGVQb2x5bGluZVZvbHVtZU91dGxpbmVHZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihPeSgpLFR5KSksIi4vY3JlYXRlUmVjdGFuZ2xlR2VvbWV0cnkuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4odnkoKSxJeSkpLCIuL2NyZWF0ZVJlY3RhbmdsZU91dGxpbmVHZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihGeSgpLER5KSksIi4vY3JlYXRlU2ltcGxlUG9seWxpbmVHZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihWeSgpLFV5KSksIi4vY3JlYXRlU3BoZXJlR2VvbWV0cnkuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4oenkoKSxHeSkpLCIuL2NyZWF0ZVNwaGVyZU91dGxpbmVHZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihxeSgpLEh5KSksIi4vY3JlYXRlVGFza1Byb2Nlc3Nvcldvcmtlci5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihzbygpLGUwKSksIi4vY3JlYXRlVmVjdG9yVGlsZUNsYW1wZWRQb2x5bGluZXMuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4oV3koKSxLeSkpLCIuL2NyZWF0ZVZlY3RvclRpbGVHZW9tZXRyaWVzLmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KFl5KCksWHkpKSwiLi9jcmVhdGVWZWN0b3JUaWxlUG9pbnRzLmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KFF5KCksWnkpKSwiLi9jcmVhdGVWZWN0b3JUaWxlUG9seWdvbnMuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4odGcoKSxKeSkpLCIuL2NyZWF0ZVZlY3RvclRpbGVQb2x5bGluZXMuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4ob2coKSxuZykpLCIuL2NyZWF0ZVZlcnRpY2VzRnJvbUdvb2dsZUVhcnRoRW50ZXJwcmlzZUJ1ZmZlci5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihhZygpLGNnKSksIi4vY3JlYXRlVmVydGljZXNGcm9tSGVpZ2h0bWFwLmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KGxnKCksdWcpKSwiLi9jcmVhdGVWZXJ0aWNlc0Zyb21RdWFudGl6ZWRUZXJyYWluTWVzaC5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihtZygpLGRnKSksIi4vY3JlYXRlV2FsbEdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KEFnKCksZ2cpKSwiLi9jcmVhdGVXYWxsT3V0bGluZUdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KFRnKCksd2cpKSwiLi9kZWNvZGVEcmFjby5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9Pih4ZygpLENnKSksIi4vZGVjb2RlR29vZ2xlRWFydGhFbnRlcnByaXNlUGFja2V0LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KHFnKCksSGcpKSwiLi9kZWNvZGVJM1MuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4oJGcoKSxZZykpLCIuL3RyYW5zY29kZUtUWDIuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4objEoKSxlMSkpLCIuL3RyYW5zZmVyVHlwZWRBcnJheVRlc3QuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4obzEoKSxWUykpLCIuL3Vwc2FtcGxlUXVhbnRpemVkVGVycmFpbk1lc2guanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4oaTEoKSxyMSkpfSl9KTt2YXIgYzE9e307ZGUoYzEse2RlZmF1bHQ6KCk9Pkc4fSk7YXN5bmMgZnVuY3Rpb24gVjgodCxlKXtsZXQgbj14KEFtW2VdLEFtW3RdKTtyZXR1cm4gaChuKT9uOmgoZSk/KHR5cGVvZiBleHBvcnRzPT0ib2JqZWN0Ij9uPWRyKGUpOm49KGF3YWl0IGltcG9ydChlKSkuZGVmYXVsdCxBbVtlXT1uLG4pOih0eXBlb2YgZXhwb3J0cz09Im9iamVjdCI/bj1kcihgV29ya2Vycy8ke3R9YCk6bj0oaChlKT9hd2FpdCBpbXBvcnQoZSk6YXdhaXQgVTgoYC4vJHt0fS5qc2ApKS5kZWZhdWx0LEFtW3RdPW4sbil9YXN5bmMgZnVuY3Rpb24gazgodCxlKXtsZXQgbj10LnN1YlRhc2tzLG89bi5sZW5ndGgscj1uZXcgQXJyYXkobyk7Zm9yKGxldCBpPTA7aTxvO2krKyl7bGV0IHM9bltpXSxmPXMuZ2VvbWV0cnksdT1zLm1vZHVsZU5hbWUsYz1zLm1vZHVsZVBhdGg7aWYoaCh1KSYmaChjKSl0aHJvdyBuZXcgRigiTXVzdCBvbmx5IHNldCBtb2R1bGVOYW1lIG9yIG1vZHVsZVBhdGgiKTtoKHUpfHxoKGMpP3JbaV09VjgodSxjKS50aGVuKGw9PmwoZixzLm9mZnNldCkpOnJbaV09Zn1yZXR1cm4gUHJvbWlzZS5hbGwocikudGhlbihmdW5jdGlvbihpKXtyZXR1cm4gc2EucGFja0NyZWF0ZUdlb21ldHJ5UmVzdWx0cyhpLGUpfSl9dmFyIEFtLEc4LGExPVooKCk9PntIdCgpO0l0KCk7ZnQoKTt0MCgpO3NvKCk7czEoKTtBbT17fTtHOD1RZShrOCl9KTt2YXIgRlY9e307ZGUoRlYse2NvbWJpbmVHZW9tZXRyeTooKT0+ejgsY3JlYXRlQm94R2VvbWV0cnk6KCk9Pmo4LGNyZWF0ZUJveE91dGxpbmVHZW9tZXRyeTooKT0+SDgsY3JlYXRlQ2lyY2xlR2VvbWV0cnk6KCk9PnE4LGNyZWF0ZUNpcmNsZU91dGxpbmVHZW9tZXRyeTooKT0+SzgsY3JlYXRlQ29wbGFuYXJQb2x5Z29uR2VvbWV0cnk6KCk9Plc4LGNyZWF0ZUNvcGxhbmFyUG9seWdvbk91dGxpbmVHZW9tZXRyeTooKT0+WDgsY3JlYXRlQ29ycmlkb3JHZW9tZXRyeTooKT0+WTgsY3JlYXRlQ29ycmlkb3JPdXRsaW5lR2VvbWV0cnk6KCk9PiQ4LGNyZWF0ZUN5bGluZGVyR2VvbWV0cnk6KCk9Plo4LGNyZWF0ZUN5bGluZGVyT3V0bGluZUdlb21ldHJ5OigpPT5ROCxjcmVhdGVFbGxpcHNlR2VvbWV0cnk6KCk9Pko4LGNyZWF0ZUVsbGlwc2VPdXRsaW5lR2VvbWV0cnk6KCk9PnRWLGNyZWF0ZUVsbGlwc29pZEdlb21ldHJ5OigpPT5lVixjcmVhdGVFbGxpcHNvaWRPdXRsaW5lR2VvbWV0cnk6KCk9Pm5WLGNyZWF0ZUZydXN0dW1HZW9tZXRyeTooKT0+b1YsY3JlYXRlRnJ1c3R1bU91dGxpbmVHZW9tZXRyeTooKT0+clYsY3JlYXRlR2VvbWV0cnk6KCk9PmlWLGNyZWF0ZUdyb3VuZFBvbHlsaW5lR2VvbWV0cnk6KCk9PnNWLGNyZWF0ZVBsYW5lR2VvbWV0cnk6KCk9PmNWLGNyZWF0ZVBsYW5lT3V0bGluZUdlb21ldHJ5OigpPT5hVixjcmVhdGVQb2x5Z29uR2VvbWV0cnk6KCk9PmZWLGNyZWF0ZVBvbHlnb25PdXRsaW5lR2VvbWV0cnk6KCk9PnVWLGNyZWF0ZVBvbHlsaW5lR2VvbWV0cnk6KCk9PmxWLGNyZWF0ZVBvbHlsaW5lVm9sdW1lR2VvbWV0cnk6KCk9PnBWLGNyZWF0ZVBvbHlsaW5lVm9sdW1lT3V0bGluZUdlb21ldHJ5OigpPT5kVixjcmVhdGVSZWN0YW5nbGVHZW9tZXRyeTooKT0+bVYsY3JlYXRlUmVjdGFuZ2xlT3V0bGluZUdlb21ldHJ5OigpPT5oVixjcmVhdGVTaW1wbGVQb2x5bGluZUdlb21ldHJ5OigpPT5fVixjcmVhdGVTcGhlcmVHZW9tZXRyeTooKT0+eVYsY3JlYXRlU3BoZXJlT3V0bGluZUdlb21ldHJ5OigpPT5nVixjcmVhdGVUYXNrUHJvY2Vzc29yV29ya2VyOigpPT5BVixjcmVhdGVWZWN0b3JUaWxlQ2xhbXBlZFBvbHlsaW5lczooKT0+YlYsY3JlYXRlVmVjdG9yVGlsZUdlb21ldHJpZXM6KCk9PndWLGNyZWF0ZVZlY3RvclRpbGVQb2ludHM6KCk9PlRWLGNyZWF0ZVZlY3RvclRpbGVQb2x5Z29uczooKT0+T1YsY3JlYXRlVmVjdG9yVGlsZVBvbHlsaW5lczooKT0+RVYsY3JlYXRlVmVydGljZXNGcm9tR29vZ2xlRWFydGhFbnRlcnByaXNlQnVmZmVyOigpPT5SVixjcmVhdGVWZXJ0aWNlc0Zyb21IZWlnaHRtYXA6KCk9PlNWLGNyZWF0ZVZlcnRpY2VzRnJvbVF1YW50aXplZFRlcnJhaW5NZXNoOigpPT5DVixjcmVhdGVXYWxsR2VvbWV0cnk6KCk9PnhWLGNyZWF0ZVdhbGxPdXRsaW5lR2VvbWV0cnk6KCk9PlBWLGRlY29kZURyYWNvOigpPT5NVixkZWNvZGVHb29nbGVFYXJ0aEVudGVycHJpc2VQYWNrZXQ6KCk9Pk5WLGRlY29kZUkzUzooKT0+SVYsdHJhbnNjb2RlS1RYMjooKT0+dlYsdHJhbnNmZXJUeXBlZEFycmF5VGVzdDooKT0+TFYsdXBzYW1wbGVRdWFudGl6ZWRUZXJyYWluTWVzaDooKT0+RFZ9KTt2YXIgejg9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5vMCgpKX0sajg9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5jMCgpKX0sSDg9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT51MCgpKX0scTg9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5iMCgpKX0sSzg9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5FMCgpKX0sVzg9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5CMCgpKX0sWDg9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5rMCgpKX0sWTg9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5vXygpKX0sJDg9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5zXygpKX0sWjg9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5wXygpKX0sUTg9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5fXygpKX0sSjg9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5nXygpKX0sdFY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5iXygpKX0sZVY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5PXygpKX0sblY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5TXygpKX0sb1Y9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5EXygpKX0sclY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5WXygpKX0saVY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5hMSgpKX0sc1Y9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5RXygpKX0sY1Y9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5leSgpKX0sYVY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5yeSgpKX0sZlY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5heSgpKX0sdVY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5seSgpKX0sbFY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT55eSgpKX0scFY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5ieSgpKX0sZFY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5PeSgpKX0sbVY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT52eSgpKX0saFY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5GeSgpKX0sX1Y9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5WeSgpKX0seVY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT56eSgpKX0sZ1Y9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5xeSgpKX0sQVY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5zbygpKX0sYlY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5XeSgpKX0sd1Y9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5ZeSgpKX0sVFY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5ReSgpKX0sT1Y9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT50ZygpKX0sRVY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5vZygpKX0sUlY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5hZygpKX0sU1Y9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5sZygpKX0sQ1Y9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5tZygpKX0seFY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5BZygpKX0sUFY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5UZygpKX0sTVY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT54ZygpKX0sTlY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5xZygpKX0sSVY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4kZygpKX0sdlY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5uMSgpKX0sTFY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5vMSgpKX0sRFY9KCk9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5pMSgpKX07cmV0dXJuICRTKEZWKTt9KSgpOwo=")});var _M=Ic((USt,J6)=>{var DSt=T(S()),ip=function(e){e==null&&(e=new Date().getTime()),this.N=624,this.M=397,this.MATRIX_A=2567483615,this.UPPER_MASK=2147483648,this.LOWER_MASK=2147483647,this.mt=new Array(this.N),this.mti=this.N+1,e.constructor==Array?this.init_by_array(e,e.length):this.init_seed(e)};ip.prototype.init_seed=function(e){for(this.mt[0]=e>>>0,this.mti=1;this.mti>>30;this.mt[this.mti]=(((e&4294901760)>>>16)*1812433253<<16)+(e&65535)*1812433253+this.mti,this.mt[this.mti]>>>=0}};ip.prototype.init_by_array=function(e,t){var n,i,o;for(this.init_seed(19650218),n=1,i=0,o=this.N>t?this.N:t;o;o--){var r=this.mt[n-1]^this.mt[n-1]>>>30;this.mt[n]=(this.mt[n]^(((r&4294901760)>>>16)*1664525<<16)+(r&65535)*1664525)+e[i]+i,this.mt[n]>>>=0,n++,i++,n>=this.N&&(this.mt[0]=this.mt[this.N-1],n=1),i>=t&&(i=0)}for(o=this.N-1;o;o--){var r=this.mt[n-1]^this.mt[n-1]>>>30;this.mt[n]=(this.mt[n]^(((r&4294901760)>>>16)*1566083941<<16)+(r&65535)*1566083941)-n,this.mt[n]>>>=0,n++,n>=this.N&&(this.mt[0]=this.mt[this.N-1],n=1)}this.mt[0]=2147483648};ip.prototype.random_int=function(){var e,t=new Array(0,this.MATRIX_A);if(this.mti>=this.N){var n;for(this.mti==this.N+1&&this.init_seed(5489),n=0;n>>1^t[e&1];for(;n>>1^t[e&1];e=this.mt[this.N-1]&this.UPPER_MASK|this.mt[0]&this.LOWER_MASK,this.mt[this.N-1]=this.mt[this.M-1]^e>>>1^t[e&1],this.mti=0}return e=this.mt[this.mti++],e^=e>>>11,e^=e<<7&2636928640,e^=e<<15&4022730752,e^=e>>>18,e>>>0};ip.prototype.random_int31=function(){return this.random_int()>>>1};ip.prototype.random_incl=function(){return this.random_int()*(1/4294967295)};ip.prototype.random=function(){return this.random_int()*(1/4294967296)};ip.prototype.random_excl=function(){return(this.random_int()+.5)*(1/4294967296)};ip.prototype.random_long=function(){var e=this.random_int()>>>5,t=this.random_int()>>>6;return(e*67108864+t)*(1/9007199254740992)};J6.exports=ip});var uq=Ic((GS,ES)=>{var W1t=T(S());/*! https://mths.be/punycode v1.4.0 by @mathias */(function(e){var t=typeof GS=="object"&&GS&&!GS.nodeType&&GS,n=typeof ES=="object"&&ES&&!ES.nodeType&&ES,i=typeof global=="object"&&global;(i.global===i||i.window===i||i.self===i)&&(e=i);var o,r=2147483647,s=36,a=1,c=26,d=38,u=700,m=72,p=128,g="-",f=/^xn--/,x=/[^\x20-\x7E]/,_=/[\x2E\u3002\uFF0E\uFF61]/g,C={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},V=s-a,L=Math.floor,Z=String.fromCharCode,G;function X(U){throw new RangeError(C[U])}function v(U,O){for(var k=U.length,J=[];k--;)J[k]=O(U[k]);return J}function P(U,O){var k=U.split("@"),J="";k.length>1&&(J=k[0]+"@",U=k[1]),U=U.replace(_,".");var H=U.split("."),ee=v(H,O).join(".");return J+ee}function F(U){for(var O=[],k=0,J=U.length,H,ee;k=55296&&H<=56319&&k65535&&(O-=65536,k+=Z(O>>>10&1023|55296),O=56320|O&1023),k+=Z(O),k}).join("")}function b(U){return U-48<10?U-22:U-65<26?U-65:U-97<26?U-97:s}function R(U,O){return U+22+75*(U<26)-((O!=0)<<5)}function E(U,O,k){var J=0;for(U=k?L(U/u):U>>1,U+=L(U/O);U>V*c>>1;J+=s)U=L(U/V);return L(J+(V+1)*U/(U+d))}function I(U){var O=[],k=U.length,J,H=0,ee=p,z=m,j,q,be,Te,ae,ye,Se,Le,Xe;for(j=U.lastIndexOf(g),j<0&&(j=0),q=0;q=128&&X("not-basic"),O.push(U.charCodeAt(q));for(be=j>0?j+1:0;be=k&&X("invalid-input"),Se=b(U.charCodeAt(be++)),(Se>=s||Se>L((r-H)/ae))&&X("overflow"),H+=Se*ae,Le=ye<=z?a:ye>=z+c?c:ye-z,!(SeL(r/Xe)&&X("overflow"),ae*=Xe;J=O.length+1,z=E(H-Te,J,Te==0),L(H/J)>r-ee&&X("overflow"),ee+=L(H/J),H%=J,O.splice(H++,0,ee)}return A(O)}function w(U){var O,k,J,H,ee,z,j,q,be,Te,ae,ye=[],Se,Le,Xe,Pe;for(U=F(U),Se=U.length,O=p,k=0,ee=m,z=0;z=O&&aeL((r-k)/Le)&&X("overflow"),k+=(j-O)*Le,O=j,z=0;zr&&X("overflow"),ae==O){for(q=k,be=s;Te=be<=ee?a:be>=ee+c?c:be-ee,!(q{var P1t=T(S());/*! * URI.js - Mutating URLs * IPv6 Support * * Version: 1.19.11 * * Author: Rodney Rehm * Web: http://medialize.github.io/URI.js/ * * Licensed under * MIT License http://www.opensource.org/licenses/mit-license * */(function(e,t){"use strict";typeof XM=="object"&&XM.exports?XM.exports=t():typeof define=="function"&&define.amd?define(t):e.IPv6=t(e)})(mq,function(e){"use strict";var t=e&&e.IPv6;function n(o){var r=o.toLowerCase(),s=r.split(":"),a=s.length,c=8;s[0]===""&&s[1]===""&&s[2]===""?(s.shift(),s.shift()):s[0]===""&&s[1]===""?s.shift():s[a-1]===""&&s[a-2]===""&&s.pop(),a=s.length,s[a-1].indexOf(".")!==-1&&(c=7);var d;for(d=0;d1);p++)u.splice(0,1);s[m]=u.join("")}var g=-1,f=0,x=0,_=-1,C=!1;for(m=0;mf&&(g=_,f=x)):s[m]==="0"&&(C=!0,_=m,x=1);x>f&&(g=_,f=x),f>1&&s.splice(g,f,""),a=s.length;var V="";for(s[0]===""&&(V=":"),m=0;m{var v1t=T(S());/*! * URI.js - Mutating URLs * Second Level Domain (SLD) Support * * Version: 1.19.11 * * Author: Rodney Rehm * Web: http://medialize.github.io/URI.js/ * * Licensed under * MIT License http://www.opensource.org/licenses/mit-license * */(function(e,t){"use strict";typeof IM=="object"&&IM.exports?IM.exports=t():typeof define=="function"&&define.amd?define(t):e.SecondLevelDomains=t(e)})(fq,function(e){"use strict";var t=e&&e.SecondLevelDomains,n={list:{ac:" com gov mil net org ",ae:" ac co gov mil name net org pro sch ",af:" com edu gov net org ",al:" com edu gov mil net org ",ao:" co ed gv it og pb ",ar:" com edu gob gov int mil net org tur ",at:" ac co gv or ",au:" asn com csiro edu gov id net org ",ba:" co com edu gov mil net org rs unbi unmo unsa untz unze ",bb:" biz co com edu gov info net org store tv ",bh:" biz cc com edu gov info net org ",bn:" com edu gov net org ",bo:" com edu gob gov int mil net org tv ",br:" adm adv agr am arq art ato b bio blog bmd cim cng cnt com coop ecn edu eng esp etc eti far flog fm fnd fot fst g12 ggf gov imb ind inf jor jus lel mat med mil mus net nom not ntr odo org ppg pro psc psi qsl rec slg srv tmp trd tur tv vet vlog wiki zlg ",bs:" com edu gov net org ",bz:" du et om ov rg ",ca:" ab bc mb nb nf nl ns nt nu on pe qc sk yk ",ck:" biz co edu gen gov info net org ",cn:" ac ah bj com cq edu fj gd gov gs gx gz ha hb he hi hl hn jl js jx ln mil net nm nx org qh sc sd sh sn sx tj tw xj xz yn zj ",co:" com edu gov mil net nom org ",cr:" ac c co ed fi go or sa ",cy:" ac biz com ekloges gov ltd name net org parliament press pro tm ",do:" art com edu gob gov mil net org sld web ",dz:" art asso com edu gov net org pol ",ec:" com edu fin gov info med mil net org pro ",eg:" com edu eun gov mil name net org sci ",er:" com edu gov ind mil net org rochest w ",es:" com edu gob nom org ",et:" biz com edu gov info name net org ",fj:" ac biz com info mil name net org pro ",fk:" ac co gov net nom org ",fr:" asso com f gouv nom prd presse tm ",gg:" co net org ",gh:" com edu gov mil org ",gn:" ac com gov net org ",gr:" com edu gov mil net org ",gt:" com edu gob ind mil net org ",gu:" com edu gov net org ",hk:" com edu gov idv net org ",hu:" 2000 agrar bolt casino city co erotica erotika film forum games hotel info ingatlan jogasz konyvelo lakas media news org priv reklam sex shop sport suli szex tm tozsde utazas video ",id:" ac co go mil net or sch web ",il:" ac co gov idf k12 muni net org ",in:" ac co edu ernet firm gen gov i ind mil net nic org res ",iq:" com edu gov i mil net org ",ir:" ac co dnssec gov i id net org sch ",it:" edu gov ",je:" co net org ",jo:" com edu gov mil name net org sch ",jp:" ac ad co ed go gr lg ne or ",ke:" ac co go info me mobi ne or sc ",kh:" com edu gov mil net org per ",ki:" biz com de edu gov info mob net org tel ",km:" asso com coop edu gouv k medecin mil nom notaires pharmaciens presse tm veterinaire ",kn:" edu gov net org ",kr:" ac busan chungbuk chungnam co daegu daejeon es gangwon go gwangju gyeongbuk gyeonggi gyeongnam hs incheon jeju jeonbuk jeonnam k kg mil ms ne or pe re sc seoul ulsan ",kw:" com edu gov net org ",ky:" com edu gov net org ",kz:" com edu gov mil net org ",lb:" com edu gov net org ",lk:" assn com edu gov grp hotel int ltd net ngo org sch soc web ",lr:" com edu gov net org ",lv:" asn com conf edu gov id mil net org ",ly:" com edu gov id med net org plc sch ",ma:" ac co gov m net org press ",mc:" asso tm ",me:" ac co edu gov its net org priv ",mg:" com edu gov mil nom org prd tm ",mk:" com edu gov inf name net org pro ",ml:" com edu gov net org presse ",mn:" edu gov org ",mo:" com edu gov net org ",mt:" com edu gov net org ",mv:" aero biz com coop edu gov info int mil museum name net org pro ",mw:" ac co com coop edu gov int museum net org ",mx:" com edu gob net org ",my:" com edu gov mil name net org sch ",nf:" arts com firm info net other per rec store web ",ng:" biz com edu gov mil mobi name net org sch ",ni:" ac co com edu gob mil net nom org ",np:" com edu gov mil net org ",nr:" biz com edu gov info net org ",om:" ac biz co com edu gov med mil museum net org pro sch ",pe:" com edu gob mil net nom org sld ",ph:" com edu gov i mil net ngo org ",pk:" biz com edu fam gob gok gon gop gos gov net org web ",pl:" art bialystok biz com edu gda gdansk gorzow gov info katowice krakow lodz lublin mil net ngo olsztyn org poznan pwr radom slupsk szczecin torun warszawa waw wroc wroclaw zgora ",pr:" ac biz com edu est gov info isla name net org pro prof ",ps:" com edu gov net org plo sec ",pw:" belau co ed go ne or ",ro:" arts com firm info nom nt org rec store tm www ",rs:" ac co edu gov in org ",sb:" com edu gov net org ",sc:" com edu gov net org ",sh:" co com edu gov net nom org ",sl:" com edu gov net org ",st:" co com consulado edu embaixada gov mil net org principe saotome store ",sv:" com edu gob org red ",sz:" ac co org ",tr:" av bbs bel biz com dr edu gen gov info k12 name net org pol tel tsk tv web ",tt:" aero biz cat co com coop edu gov info int jobs mil mobi museum name net org pro tel travel ",tw:" club com ebiz edu game gov idv mil net org ",mu:" ac co com gov net or org ",mz:" ac co edu gov org ",na:" co com ",nz:" ac co cri geek gen govt health iwi maori mil net org parliament school ",pa:" abo ac com edu gob ing med net nom org sld ",pt:" com edu gov int net nome org publ ",py:" com edu gov mil net org ",qa:" com edu gov mil net org ",re:" asso com nom ",ru:" ac adygeya altai amur arkhangelsk astrakhan bashkiria belgorod bir bryansk buryatia cbg chel chelyabinsk chita chukotka chuvashia com dagestan e-burg edu gov grozny int irkutsk ivanovo izhevsk jar joshkar-ola kalmykia kaluga kamchatka karelia kazan kchr kemerovo khabarovsk khakassia khv kirov koenig komi kostroma kranoyarsk kuban kurgan kursk lipetsk magadan mari mari-el marine mil mordovia mosreg msk murmansk nalchik net nnov nov novosibirsk nsk omsk orenburg org oryol penza perm pp pskov ptz rnd ryazan sakhalin samara saratov simbirsk smolensk spb stavropol stv surgut tambov tatarstan tom tomsk tsaritsyn tsk tula tuva tver tyumen udm udmurtia ulan-ude vladikavkaz vladimir vladivostok volgograd vologda voronezh vrn vyatka yakutia yamal yekaterinburg yuzhno-sakhalinsk ",rw:" ac co com edu gouv gov int mil net ",sa:" com edu gov med net org pub sch ",sd:" com edu gov info med net org tv ",se:" a ac b bd c d e f g h i k l m n o org p parti pp press r s t tm u w x y z ",sg:" com edu gov idn net org per ",sn:" art com edu gouv org perso univ ",sy:" com edu gov mil net news org ",th:" ac co go in mi net or ",tj:" ac biz co com edu go gov info int mil name net nic org test web ",tn:" agrinet com defense edunet ens fin gov ind info intl mincom nat net org perso rnrt rns rnu tourism ",tz:" ac co go ne or ",ua:" biz cherkassy chernigov chernovtsy ck cn co com crimea cv dn dnepropetrovsk donetsk dp edu gov if in ivano-frankivsk kh kharkov kherson khmelnitskiy kiev kirovograd km kr ks kv lg lugansk lutsk lviv me mk net nikolaev od odessa org pl poltava pp rovno rv sebastopol sumy te ternopil uzhgorod vinnica vn zaporizhzhe zhitomir zp zt ",ug:" ac co go ne or org sc ",uk:" ac bl british-library co cym gov govt icnet jet lea ltd me mil mod national-library-scotland nel net nhs nic nls org orgn parliament plc police sch scot soc ",us:" dni fed isa kids nsn ",uy:" com edu gub mil net org ",ve:" co com edu gob info mil net org web ",vi:" co com k12 net org ",vn:" ac biz com edu gov health info int name net org pro ",ye:" co com gov ltd me net org plc ",yu:" ac co edu gov org ",za:" ac agric alt bourse city co cybernet db edu gov grondar iaccess imt inca landesign law mil net ngo nis nom olivetti org pix school tm web ",zm:" ac co com edu gov net org sch ",com:"ar br cn de eu gb gr hu jpn kr no qc ru sa se uk us uy za ",net:"gb jp se uk ",org:"ae",de:"com "},has:function(i){var o=i.lastIndexOf(".");if(o<=0||o>=i.length-1)return!1;var r=i.lastIndexOf(".",o-1);if(r<=0||r>=o-1)return!1;var s=n.list[i.slice(o+1)];return s?s.indexOf(" "+i.slice(r+1,o)+" ")>=0:!1},is:function(i){var o=i.lastIndexOf(".");if(o<=0||o>=i.length-1)return!1;var r=i.lastIndexOf(".",o-1);if(r>=0)return!1;var s=n.list[i.slice(o+1)];return s?s.indexOf(" "+i.slice(0,o)+" ")>=0:!1},get:function(i){var o=i.lastIndexOf(".");if(o<=0||o>=i.length-1)return null;var r=i.lastIndexOf(".",o-1);if(r<=0||r>=o-1)return null;var s=n.list[i.slice(o+1)];return!s||s.indexOf(" "+i.slice(r+1,o)+" ")<0?null:i.slice(r+1)},noConflict:function(){return e.SecondLevelDomains===this&&(e.SecondLevelDomains=t),this}};return n})});var id=Ic((bq,WM)=>{var w1t=T(S());/*! * URI.js - Mutating URLs * * Version: 1.19.11 * * Author: Rodney Rehm * Web: http://medialize.github.io/URI.js/ * * Licensed under * MIT License http://www.opensource.org/licenses/mit-license * */(function(e,t){"use strict";typeof WM=="object"&&WM.exports?WM.exports=t(uq(),hq(),pq()):typeof define=="function"&&define.amd?define(["./punycode","./IPv6","./SecondLevelDomains"],t):e.URI=t(e.punycode,e.IPv6,e.SecondLevelDomains,e)})(bq,function(e,t,n,i){"use strict";var o=i&&i.URI;function r(R,E){var I=arguments.length>=1,w=arguments.length>=2;if(!(this instanceof r))return I?w?new r(R,E):new r(R):new r;if(R===void 0){if(I)throw new TypeError("undefined is not a valid argument for URI");typeof location<"u"?R=location.href+"":R=""}if(R===null&&I)throw new TypeError("null is not a valid argument for URI");return this.href(R),E!==void 0?this.absoluteTo(E):this}function s(R){return/^[0-9]+$/.test(R)}r.version="1.19.11";var a=r.prototype,c=Object.prototype.hasOwnProperty;function d(R){return R.replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")}function u(R){return R===void 0?"Undefined":String(Object.prototype.toString.call(R)).slice(8,-1)}function m(R){return u(R)==="Array"}function p(R,E){var I={},w,N;if(u(E)==="RegExp")I=null;else if(m(E))for(w=0,N=E.length;w]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/ig,r.findUri={start:/\b(?:([a-z][a-z0-9.+-]*:\/\/)|www\.)/gi,end:/[\s\r\n]|$/,trim:/[`!()\[\]{};:'".,<>?«»“”„‘’]+$/,parens:/(\([^\)]*\)|\[[^\]]*\]|\{[^}]*\}|<[^>]*>)/g},r.leading_whitespace_expression=/^[\x00-\x20\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/,r.ascii_tab_whitespace=/[\u0009\u000A\u000D]+/g,r.defaultPorts={http:"80",https:"443",ftp:"21",gopher:"70",ws:"80",wss:"443"},r.hostProtocols=["http","https"],r.invalid_hostname_characters=/[^a-zA-Z0-9\.\-:_]/,r.domAttributes={a:"href",blockquote:"cite",link:"href",base:"href",script:"src",form:"action",img:"src",area:"href",iframe:"src",embed:"src",source:"src",track:"src",input:"src",audio:"src",video:"src"},r.getDomAttribute=function(R){if(!(!R||!R.nodeName)){var E=R.nodeName.toLowerCase();if(!(E==="input"&&R.type!=="image"))return r.domAttributes[E]}};function _(R){return escape(R)}function C(R){return encodeURIComponent(R).replace(/[!'()*]/g,_).replace(/\*/g,"%2A")}r.encode=C,r.decode=decodeURIComponent,r.iso8859=function(){r.encode=escape,r.decode=unescape},r.unicode=function(){r.encode=C,r.decode=decodeURIComponent},r.characters={pathname:{encode:{expression:/%(24|26|2B|2C|3B|3D|3A|40)/ig,map:{"%24":"$","%26":"&","%2B":"+","%2C":",","%3B":";","%3D":"=","%3A":":","%40":"@"}},decode:{expression:/[\/\?#]/g,map:{"/":"%2F","?":"%3F","#":"%23"}}},reserved:{encode:{expression:/%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig,map:{"%3A":":","%2F":"/","%3F":"?","%23":"#","%5B":"[","%5D":"]","%40":"@","%21":"!","%24":"$","%26":"&","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"="}}},urnpath:{encode:{expression:/%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/ig,map:{"%21":"!","%24":"$","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"=","%40":"@"}},decode:{expression:/[\/\?#:]/g,map:{"/":"%2F","?":"%3F","#":"%23",":":"%3A"}}}},r.encodeQuery=function(R,E){var I=r.encode(R+"");return E===void 0&&(E=r.escapeQuerySpace),E?I.replace(/%20/g,"+"):I},r.decodeQuery=function(R,E){R+="",E===void 0&&(E=r.escapeQuerySpace);try{return r.decode(E?R.replace(/\+/g,"%20"):R)}catch{return R}};var V={encode:"encode",decode:"decode"},L,Z=function(R,E){return function(I){try{return r[E](I+"").replace(r.characters[R][E].expression,function(w){return r.characters[R][E].map[w]})}catch{return I}}};for(L in V)r[L+"PathSegment"]=Z("pathname",V[L]),r[L+"UrnPathSegment"]=Z("urnpath",V[L]);var G=function(R,E,I){return function(w){var N;I?N=function(k){return r[E](r[I](k))}:N=r[E];for(var B=(w+"").split(R),U=0,O=B.length;U-1&&(E.fragment=R.substring(I+1)||null,R=R.substring(0,I)),I=R.indexOf("?"),I>-1&&(E.query=R.substring(I+1)||null,R=R.substring(0,I)),R=R.replace(/^(https?|ftp|wss?)?:+[/\\]*/i,"$1://"),R=R.replace(/^[/\\]{2,}/i,"//"),R.substring(0,2)==="//"?(E.protocol=null,R=R.substring(2),R=r.parseAuthority(R,E)):(I=R.indexOf(":"),I>-1&&(E.protocol=R.substring(0,I)||null,E.protocol&&!E.protocol.match(r.protocol_expression)?E.protocol=void 0:R.substring(I+1,I+3).replace(/\\/g,"/")==="//"?(R=R.substring(I+3),R=r.parseAuthority(R,E)):(R=R.substring(I+1),E.urn=!0))),E.path=R,E},r.parseHost=function(R,E){R||(R=""),R=R.replace(/\\/g,"/");var I=R.indexOf("/"),w,N;if(I===-1&&(I=R.length),R.charAt(0)==="[")w=R.indexOf("]"),E.hostname=R.substring(1,w)||null,E.port=R.substring(w+2,I)||null,E.port==="/"&&(E.port=null);else{var B=R.indexOf(":"),U=R.indexOf("/"),O=R.indexOf(":",B+1);O!==-1&&(U===-1||O-1?N:R.length-1),U;return B>-1&&(N===-1||B-1?z=z.slice(0,j)+z.slice(j).replace(B,""):z=z.replace(B,""),!(z.length<=k[0].length)&&!(I.ignore&&I.ignore.test(z))){ee=J+z.length;var Te=E(z,J,ee,R);if(Te===void 0){w.lastIndex=ee;continue}Te=String(Te),R=R.slice(0,J)+Te+R.slice(ee),w.lastIndex=J+Te.length}}return w.lastIndex=0,R},r.ensureValidHostname=function(R,E){var I=!!R,w=!!E,N=!1;if(w&&(N=g(r.hostProtocols,E)),N&&!I)throw new TypeError("Hostname cannot be empty, if protocol is "+E);if(R&&R.match(r.invalid_hostname_characters)){if(!e)throw new TypeError('Hostname "'+R+'" contains characters other than [A-Z0-9.-:_] and Punycode.js is not available');if(e.toASCII(R).match(r.invalid_hostname_characters))throw new TypeError('Hostname "'+R+'" contains characters other than [A-Z0-9.-:_]')}},r.ensureValidPort=function(R){if(R){var E=Number(R);if(!(s(E)&&E>0&&E<65536))throw new TypeError('Port "'+R+'" is not a valid port')}},r.noConflict=function(R){if(R){var E={URI:this.noConflict()};return i.URITemplate&&typeof i.URITemplate.noConflict=="function"&&(E.URITemplate=i.URITemplate.noConflict()),i.IPv6&&typeof i.IPv6.noConflict=="function"&&(E.IPv6=i.IPv6.noConflict()),i.SecondLevelDomains&&typeof i.SecondLevelDomains.noConflict=="function"&&(E.SecondLevelDomains=i.SecondLevelDomains.noConflict()),E}else i.URI===this&&(i.URI=o);return this},a.build=function(R){return R===!0?this._deferred_build=!0:(R===void 0||this._deferred_build)&&(this._string=r.build(this._parts),this._deferred_build=!1),this},a.clone=function(){return new r(this)},a.valueOf=a.toString=function(){return this.build(!1)._string};function X(R){return function(E,I){return E===void 0?this._parts[R]||"":(this._parts[R]=E||null,this.build(!I),this)}}function v(R,E){return function(I,w){return I===void 0?this._parts[R]||"":(I!==null&&(I=I+"",I.charAt(0)===E&&(I=I.substring(1))),this._parts[R]=I,this.build(!w),this)}}a.protocol=X("protocol"),a.username=X("username"),a.password=X("password"),a.hostname=X("hostname"),a.port=X("port"),a.query=v("query","?"),a.fragment=v("fragment","#"),a.search=function(R,E){var I=this.query(R,E);return typeof I=="string"&&I.length?"?"+I:I},a.hash=function(R,E){var I=this.fragment(R,E);return typeof I=="string"&&I.length?"#"+I:I},a.pathname=function(R,E){if(R===void 0||R===!0){var I=this._parts.path||(this._parts.hostname?"/":"");return R?(this._parts.urn?r.decodeUrnPath:r.decodePath)(I):I}else return this._parts.urn?this._parts.path=R?r.recodeUrnPath(R):"":this._parts.path=R?r.recodePath(R):"/",this.build(!E),this},a.path=a.pathname,a.href=function(R,E){var I;if(R===void 0)return this.toString();this._string="",this._parts=r._parts();var w=R instanceof r,N=typeof R=="object"&&(R.hostname||R.path||R.pathname);if(R.nodeName){var B=r.getDomAttribute(R);R=R[B]||"",N=!1}if(!w&&N&&R.pathname!==void 0&&(R=R.toString()),typeof R=="string"||R instanceof String)this._parts=r.parse(String(R),this._parts);else if(w||N){var U=w?R._parts:R;for(I in U)I!=="query"&&c.call(this._parts,I)&&(this._parts[I]=U[I]);U.query&&this.query(U.query,!1)}else throw new TypeError("invalid input");return this.build(!E),this},a.is=function(R){var E=!1,I=!1,w=!1,N=!1,B=!1,U=!1,O=!1,k=!this._parts.urn;switch(this._parts.hostname&&(k=!1,I=r.ip4_expression.test(this._parts.hostname),w=r.ip6_expression.test(this._parts.hostname),E=I||w,N=!E,B=N&&n&&n.has(this._parts.hostname),U=N&&r.idn_expression.test(this._parts.hostname),O=N&&r.punycode_expression.test(this._parts.hostname)),R.toLowerCase()){case"relative":return k;case"absolute":return!k;case"domain":case"name":return N;case"sld":return B;case"ip":return E;case"ip4":case"ipv4":case"inet4":return I;case"ip6":case"ipv6":case"inet6":return w;case"idn":return U;case"url":return!this._parts.urn;case"urn":return!!this._parts.urn;case"punycode":return O}return null};var P=a.protocol,F=a.port,A=a.hostname;a.protocol=function(R,E){if(R&&(R=R.replace(/:(\/\/)?$/,""),!R.match(r.protocol_expression)))throw new TypeError('Protocol "'+R+`" contains characters other than [A-Z0-9.+-] or doesn't start with [A-Z]`);return P.call(this,R,E)},a.scheme=a.protocol,a.port=function(R,E){return this._parts.urn?R===void 0?"":this:(R!==void 0&&(R===0&&(R=null),R&&(R+="",R.charAt(0)===":"&&(R=R.substring(1)),r.ensureValidPort(R))),F.call(this,R,E))},a.hostname=function(R,E){if(this._parts.urn)return R===void 0?"":this;if(R!==void 0){var I={preventInvalidHostname:this._parts.preventInvalidHostname},w=r.parseHost(R,I);if(w!=="/")throw new TypeError('Hostname "'+R+'" contains characters other than [A-Z0-9.-]');R=I.hostname,this._parts.preventInvalidHostname&&r.ensureValidHostname(R,this._parts.protocol)}return A.call(this,R,E)},a.origin=function(R,E){if(this._parts.urn)return R===void 0?"":this;if(R===void 0){var I=this.protocol(),w=this.authority();return w?(I?I+"://":"")+this.authority():""}else{var N=r(R);return this.protocol(N.protocol()).authority(N.authority()).build(!E),this}},a.host=function(R,E){if(this._parts.urn)return R===void 0?"":this;if(R===void 0)return this._parts.hostname?r.buildHost(this._parts):"";var I=r.parseHost(R,this._parts);if(I!=="/")throw new TypeError('Hostname "'+R+'" contains characters other than [A-Z0-9.-]');return this.build(!E),this},a.authority=function(R,E){if(this._parts.urn)return R===void 0?"":this;if(R===void 0)return this._parts.hostname?r.buildAuthority(this._parts):"";var I=r.parseAuthority(R,this._parts);if(I!=="/")throw new TypeError('Hostname "'+R+'" contains characters other than [A-Z0-9.-]');return this.build(!E),this},a.userinfo=function(R,E){if(this._parts.urn)return R===void 0?"":this;if(R===void 0){var I=r.buildUserinfo(this._parts);return I&&I.substring(0,I.length-1)}else return R[R.length-1]!=="@"&&(R+="@"),r.parseUserinfo(R,this._parts),this.build(!E),this},a.resource=function(R,E){var I;return R===void 0?this.path()+this.search()+this.hash():(I=r.parse(R),this._parts.path=I.path,this._parts.query=I.query,this._parts.fragment=I.fragment,this.build(!E),this)},a.subdomain=function(R,E){if(this._parts.urn)return R===void 0?"":this;if(R===void 0){if(!this._parts.hostname||this.is("IP"))return"";var I=this._parts.hostname.length-this.domain().length-1;return this._parts.hostname.substring(0,I)||""}else{var w=this._parts.hostname.length-this.domain().length,N=this._parts.hostname.substring(0,w),B=new RegExp("^"+d(N));if(R&&R.charAt(R.length-1)!=="."&&(R+="."),R.indexOf(":")!==-1)throw new TypeError("Domains cannot contain colons");return R&&r.ensureValidHostname(R,this._parts.protocol),this._parts.hostname=this._parts.hostname.replace(B,R),this.build(!E),this}},a.domain=function(R,E){if(this._parts.urn)return R===void 0?"":this;if(typeof R=="boolean"&&(E=R,R=void 0),R===void 0){if(!this._parts.hostname||this.is("IP"))return"";var I=this._parts.hostname.match(/\./g);if(I&&I.length<2)return this._parts.hostname;var w=this._parts.hostname.length-this.tld(E).length-1;return w=this._parts.hostname.lastIndexOf(".",w-1)+1,this._parts.hostname.substring(w)||""}else{if(!R)throw new TypeError("cannot set domain empty");if(R.indexOf(":")!==-1)throw new TypeError("Domains cannot contain colons");if(r.ensureValidHostname(R,this._parts.protocol),!this._parts.hostname||this.is("IP"))this._parts.hostname=R;else{var N=new RegExp(d(this.domain())+"$");this._parts.hostname=this._parts.hostname.replace(N,R)}return this.build(!E),this}},a.tld=function(R,E){if(this._parts.urn)return R===void 0?"":this;if(typeof R=="boolean"&&(E=R,R=void 0),R===void 0){if(!this._parts.hostname||this.is("IP"))return"";var I=this._parts.hostname.lastIndexOf("."),w=this._parts.hostname.substring(I+1);return E!==!0&&n&&n.list[w.toLowerCase()]&&n.get(this._parts.hostname)||w}else{var N;if(R)if(R.match(/[^a-zA-Z0-9-]/))if(n&&n.is(R))N=new RegExp(d(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(N,R);else throw new TypeError('TLD "'+R+'" contains characters other than [A-Z0-9]');else{if(!this._parts.hostname||this.is("IP"))throw new ReferenceError("cannot set TLD on non-domain host");N=new RegExp(d(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(N,R)}else throw new TypeError("cannot set TLD empty");return this.build(!E),this}},a.directory=function(R,E){if(this._parts.urn)return R===void 0?"":this;if(R===void 0||R===!0){if(!this._parts.path&&!this._parts.hostname)return"";if(this._parts.path==="/")return"/";var I=this._parts.path.length-this.filename().length-1,w=this._parts.path.substring(0,I)||(this._parts.hostname?"/":"");return R?r.decodePath(w):w}else{var N=this._parts.path.length-this.filename().length,B=this._parts.path.substring(0,N),U=new RegExp("^"+d(B));return this.is("relative")||(R||(R="/"),R.charAt(0)!=="/"&&(R="/"+R)),R&&R.charAt(R.length-1)!=="/"&&(R+="/"),R=r.recodePath(R),this._parts.path=this._parts.path.replace(U,R),this.build(!E),this}},a.filename=function(R,E){if(this._parts.urn)return R===void 0?"":this;if(typeof R!="string"){if(!this._parts.path||this._parts.path==="/")return"";var I=this._parts.path.lastIndexOf("/"),w=this._parts.path.substring(I+1);return R?r.decodePathSegment(w):w}else{var N=!1;R.charAt(0)==="/"&&(R=R.substring(1)),R.match(/\.?\//)&&(N=!0);var B=new RegExp(d(this.filename())+"$");return R=r.recodePath(R),this._parts.path=this._parts.path.replace(B,R),N?this.normalizePath(E):this.build(!E),this}},a.suffix=function(R,E){if(this._parts.urn)return R===void 0?"":this;if(R===void 0||R===!0){if(!this._parts.path||this._parts.path==="/")return"";var I=this.filename(),w=I.lastIndexOf("."),N,B;return w===-1?"":(N=I.substring(w+1),B=/^[a-z0-9%]+$/i.test(N)?N:"",R?r.decodePathSegment(B):B)}else{R.charAt(0)==="."&&(R=R.substring(1));var U=this.suffix(),O;if(U)R?O=new RegExp(d(U)+"$"):O=new RegExp(d("."+U)+"$");else{if(!R)return this;this._parts.path+="."+r.recodePath(R)}return O&&(R=r.recodePath(R),this._parts.path=this._parts.path.replace(O,R)),this.build(!E),this}},a.segment=function(R,E,I){var w=this._parts.urn?":":"/",N=this.path(),B=N.substring(0,1)==="/",U=N.split(w);if(R!==void 0&&typeof R!="number"&&(I=E,E=R,R=void 0),R!==void 0&&typeof R!="number")throw new Error('Bad segment "'+R+'", must be 0-based integer');if(B&&U.shift(),R<0&&(R=Math.max(U.length+R,0)),E===void 0)return R===void 0?U:U[R];if(R===null||U[R]===void 0)if(m(E)){U=[];for(var O=0,k=E.length;O{var wZt=T(S());/*! @license DOMPurify 3.1.5 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.1.5/LICENSE */(function(e,t){typeof xY=="object"&&typeof _Y<"u"?_Y.exports=t():typeof define=="function"&&define.amd?define(t):(e=typeof globalThis<"u"?globalThis:e||self,e.DOMPurify=t())})(xY,function(){"use strict";let{entries:e,setPrototypeOf:t,isFrozen:n,getPrototypeOf:i,getOwnPropertyDescriptor:o}=Object,{freeze:r,seal:s,create:a}=Object,{apply:c,construct:d}=typeof Reflect<"u"&&Reflect;r||(r=function($e){return $e}),s||(s=function($e){return $e}),c||(c=function($e,Qe,je){return $e.apply(Qe,je)}),d||(d=function($e,Qe){return new $e(...Qe)});let u=X(Array.prototype.forEach),m=X(Array.prototype.pop),p=X(Array.prototype.push),g=X(String.prototype.toLowerCase),f=X(String.prototype.toString),x=X(String.prototype.match),_=X(String.prototype.replace),C=X(String.prototype.indexOf),V=X(String.prototype.trim),L=X(Object.prototype.hasOwnProperty),Z=X(RegExp.prototype.test),G=v(TypeError);function X(Ae){return function($e){for(var Qe=arguments.length,je=new Array(Qe>1?Qe-1:0),kt=1;kt2&&arguments[2]!==void 0?arguments[2]:g;t&&t(Ae,null);let je=$e.length;for(;je--;){let kt=$e[je];if(typeof kt=="string"){let pe=Qe(kt);pe!==kt&&(n($e)||($e[je]=pe),kt=pe)}Ae[kt]=!0}return Ae}function F(Ae){for(let $e=0;$e/gm),j=s(/\${[\w\W]*}/gm),q=s(/^data-[\-\w.\u00B7-\uFFFF]/),be=s(/^aria-[\-\w]+$/),Te=s(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),ae=s(/^(?:\w+script|data):/i),ye=s(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Se=s(/^html$/i),Le=s(/^[a-z][.\w]*(-[.\w]+)+$/i);var Xe=Object.freeze({__proto__:null,MUSTACHE_EXPR:ee,ERB_EXPR:z,TMPLIT_EXPR:j,DATA_ATTR:q,ARIA_ATTR:be,IS_ALLOWED_URI:Te,IS_SCRIPT_OR_DATA:ae,ATTR_WHITESPACE:ye,DOCTYPE_NAME:Se,CUSTOM_ELEMENT:Le});let Pe={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,progressingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},ke=function(){return typeof window>"u"?null:window},Pt=function($e,Qe){if(typeof $e!="object"||typeof $e.createPolicy!="function")return null;let je=null,kt="data-tt-policy-suffix";Qe&&Qe.hasAttribute(kt)&&(je=Qe.getAttribute(kt));let pe="dompurify"+(je?"#"+je:"");try{return $e.createPolicy(pe,{createHTML(Ve){return Ve},createScriptURL(Ve){return Ve}})}catch{return console.warn("TrustedTypes policy "+pe+" could not be created."),null}};function Ot(){let Ae=arguments.length>0&&arguments[0]!==void 0?arguments[0]:ke(),$e=Rn=>Ot(Rn);if($e.version="3.1.5",$e.removed=[],!Ae||!Ae.document||Ae.document.nodeType!==Pe.document)return $e.isSupported=!1,$e;let{document:Qe}=Ae,je=Qe,kt=je.currentScript,{DocumentFragment:pe,HTMLTemplateElement:Ve,Node:Dt,Element:bt,NodeFilter:li,NamedNodeMap:Vo=Ae.NamedNodeMap||Ae.MozNamedAttrMap,HTMLFormElement:Rs,DOMParser:zs,trustedTypes:Nr}=Ae,$r=bt.prototype,Ue=b($r,"cloneNode"),it=b($r,"nextSibling"),tt=b($r,"childNodes"),qe=b($r,"parentNode");if(typeof Ve=="function"){let Rn=Qe.createElement("template");Rn.content&&Rn.content.ownerDocument&&(Qe=Rn.content.ownerDocument)}let dt,Bt="",{implementation:Ln,createNodeIterator:Lo,createDocumentFragment:nr,getElementsByTagName:Na}=Qe,{importNode:ka}=je,io={};$e.isSupported=typeof e=="function"&&typeof qe=="function"&&Ln&&Ln.createHTMLDocument!==void 0;let{MUSTACHE_EXPR:Bi,ERB_EXPR:us,TMPLIT_EXPR:yr,DATA_ATTR:ml,ARIA_ATTR:Do,IS_SCRIPT_OR_DATA:xr,ATTR_WHITESPACE:fb,CUSTOM_ELEMENT:Gc}=Xe,{IS_ALLOWED_URI:Ua}=Xe,dr=null,ya=P({},[...R,...E,...I,...N,...U]),oo=null,ZL=P({},[...O,...k,...J,...H]),$n=Object.seal(a(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Ec=null,nd=null,Ny=!0,_r=!0,es=!1,pb=!0,bb=!1,mM=!0,ky=!1,hB=!1,fB=!1,yS=!1,hM=!1,fM=!1,R6=!0,Z6=!1,USe="user-content-",pB=!0,GL=!1,xS={},_S=null,G6=P({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),E6=null,X6=P({},["audio","video","img","source","image","track"]),bB=null,I6=P({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),pM="http://www.w3.org/1998/Math/MathML",bM="http://www.w3.org/2000/svg",tp="http://www.w3.org/1999/xhtml",TS=tp,gB=!1,yB=null,DSe=P({},[pM,bM,tp],f),EL=null,BSe=["application/xhtml+xml","text/html"],YSe="text/html",Ks=null,SS=null,OSe=Qe.createElement("form"),W6=function(Ze){return Ze instanceof RegExp||Ze instanceof Function},xB=function(){let Ze=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(SS&&SS===Ze)){if((!Ze||typeof Ze!="object")&&(Ze={}),Ze=A(Ze),EL=BSe.indexOf(Ze.PARSER_MEDIA_TYPE)===-1?YSe:Ze.PARSER_MEDIA_TYPE,Ks=EL==="application/xhtml+xml"?f:g,dr=L(Ze,"ALLOWED_TAGS")?P({},Ze.ALLOWED_TAGS,Ks):ya,oo=L(Ze,"ALLOWED_ATTR")?P({},Ze.ALLOWED_ATTR,Ks):ZL,yB=L(Ze,"ALLOWED_NAMESPACES")?P({},Ze.ALLOWED_NAMESPACES,f):DSe,bB=L(Ze,"ADD_URI_SAFE_ATTR")?P(A(I6),Ze.ADD_URI_SAFE_ATTR,Ks):I6,E6=L(Ze,"ADD_DATA_URI_TAGS")?P(A(X6),Ze.ADD_DATA_URI_TAGS,Ks):X6,_S=L(Ze,"FORBID_CONTENTS")?P({},Ze.FORBID_CONTENTS,Ks):G6,Ec=L(Ze,"FORBID_TAGS")?P({},Ze.FORBID_TAGS,Ks):{},nd=L(Ze,"FORBID_ATTR")?P({},Ze.FORBID_ATTR,Ks):{},xS=L(Ze,"USE_PROFILES")?Ze.USE_PROFILES:!1,Ny=Ze.ALLOW_ARIA_ATTR!==!1,_r=Ze.ALLOW_DATA_ATTR!==!1,es=Ze.ALLOW_UNKNOWN_PROTOCOLS||!1,pb=Ze.ALLOW_SELF_CLOSE_IN_ATTR!==!1,bb=Ze.SAFE_FOR_TEMPLATES||!1,mM=Ze.SAFE_FOR_XML!==!1,ky=Ze.WHOLE_DOCUMENT||!1,yS=Ze.RETURN_DOM||!1,hM=Ze.RETURN_DOM_FRAGMENT||!1,fM=Ze.RETURN_TRUSTED_TYPE||!1,fB=Ze.FORCE_BODY||!1,R6=Ze.SANITIZE_DOM!==!1,Z6=Ze.SANITIZE_NAMED_PROPS||!1,pB=Ze.KEEP_CONTENT!==!1,GL=Ze.IN_PLACE||!1,Ua=Ze.ALLOWED_URI_REGEXP||Te,TS=Ze.NAMESPACE||tp,$n=Ze.CUSTOM_ELEMENT_HANDLING||{},Ze.CUSTOM_ELEMENT_HANDLING&&W6(Ze.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&($n.tagNameCheck=Ze.CUSTOM_ELEMENT_HANDLING.tagNameCheck),Ze.CUSTOM_ELEMENT_HANDLING&&W6(Ze.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&($n.attributeNameCheck=Ze.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),Ze.CUSTOM_ELEMENT_HANDLING&&typeof Ze.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&($n.allowCustomizedBuiltInElements=Ze.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),bb&&(_r=!1),hM&&(yS=!0),xS&&(dr=P({},U),oo=[],xS.html===!0&&(P(dr,R),P(oo,O)),xS.svg===!0&&(P(dr,E),P(oo,k),P(oo,H)),xS.svgFilters===!0&&(P(dr,I),P(oo,k),P(oo,H)),xS.mathMl===!0&&(P(dr,N),P(oo,J),P(oo,H))),Ze.ADD_TAGS&&(dr===ya&&(dr=A(dr)),P(dr,Ze.ADD_TAGS,Ks)),Ze.ADD_ATTR&&(oo===ZL&&(oo=A(oo)),P(oo,Ze.ADD_ATTR,Ks)),Ze.ADD_URI_SAFE_ATTR&&P(bB,Ze.ADD_URI_SAFE_ATTR,Ks),Ze.FORBID_CONTENTS&&(_S===G6&&(_S=A(_S)),P(_S,Ze.FORBID_CONTENTS,Ks)),pB&&(dr["#text"]=!0),ky&&P(dr,["html","head","body"]),dr.table&&(P(dr,["tbody"]),delete Ec.tbody),Ze.TRUSTED_TYPES_POLICY){if(typeof Ze.TRUSTED_TYPES_POLICY.createHTML!="function")throw G('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof Ze.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw G('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');dt=Ze.TRUSTED_TYPES_POLICY,Bt=dt.createHTML("")}else dt===void 0&&(dt=Pt(Nr,kt)),dt!==null&&typeof Bt=="string"&&(Bt=dt.createHTML(""));r&&r(Ze),SS=Ze}},P6=P({},["mi","mo","mn","ms","mtext"]),v6=P({},["foreignobject","annotation-xml"]),HSe=P({},["title","style","font","a","script"]),w6=P({},[...E,...I,...w]),F6=P({},[...N,...B]),zSe=function(Ze){let It=qe(Ze);(!It||!It.tagName)&&(It={namespaceURI:TS,tagName:"template"});let bn=g(Ze.tagName),Bo=g(It.tagName);return yB[Ze.namespaceURI]?Ze.namespaceURI===bM?It.namespaceURI===tp?bn==="svg":It.namespaceURI===pM?bn==="svg"&&(Bo==="annotation-xml"||P6[Bo]):!!w6[bn]:Ze.namespaceURI===pM?It.namespaceURI===tp?bn==="math":It.namespaceURI===bM?bn==="math"&&v6[Bo]:!!F6[bn]:Ze.namespaceURI===tp?It.namespaceURI===bM&&!v6[Bo]||It.namespaceURI===pM&&!P6[Bo]?!1:!F6[bn]&&(HSe[bn]||!w6[bn]):!!(EL==="application/xhtml+xml"&&yB[Ze.namespaceURI]):!1},vh=function(Ze){p($e.removed,{element:Ze});try{Ze.parentNode.removeChild(Ze)}catch{Ze.remove()}},gM=function(Ze,It){try{p($e.removed,{attribute:It.getAttributeNode(Ze),from:It})}catch{p($e.removed,{attribute:null,from:It})}if(It.removeAttribute(Ze),Ze==="is"&&!oo[Ze])if(yS||hM)try{vh(It)}catch{}else try{It.setAttribute(Ze,"")}catch{}},A6=function(Ze){let It=null,bn=null;if(fB)Ze=""+Ze;else{let xa=x(Ze,/^[\r\n\t ]+/);bn=xa&&xa[0]}EL==="application/xhtml+xml"&&TS===tp&&(Ze=''+Ze+"");let Bo=dt?dt.createHTML(Ze):Ze;if(TS===tp)try{It=new zs().parseFromString(Bo,EL)}catch{}if(!It||!It.documentElement){It=Ln.createDocument(TS,"template",null);try{It.documentElement.innerHTML=gB?Bt:Bo}catch{}}let Da=It.body||It.documentElement;return Ze&&bn&&Da.insertBefore(Qe.createTextNode(bn),Da.childNodes[0]||null),TS===tp?Na.call(It,ky?"html":"body")[0]:ky?It.documentElement:Da},M6=function(Ze){return Lo.call(Ze.ownerDocument||Ze,Ze,li.SHOW_ELEMENT|li.SHOW_COMMENT|li.SHOW_TEXT|li.SHOW_PROCESSING_INSTRUCTION|li.SHOW_CDATA_SECTION,null)},N6=function(Ze){return Ze instanceof Rs&&(typeof Ze.nodeName!="string"||typeof Ze.textContent!="string"||typeof Ze.removeChild!="function"||!(Ze.attributes instanceof Vo)||typeof Ze.removeAttribute!="function"||typeof Ze.setAttribute!="function"||typeof Ze.namespaceURI!="string"||typeof Ze.insertBefore!="function"||typeof Ze.hasChildNodes!="function")},k6=function(Ze){return typeof Dt=="function"&&Ze instanceof Dt},np=function(Ze,It,bn){io[Ze]&&u(io[Ze],Bo=>{Bo.call($e,It,bn,SS)})},U6=function(Ze){let It=null;if(np("beforeSanitizeElements",Ze,null),N6(Ze))return vh(Ze),!0;let bn=Ks(Ze.nodeName);if(np("uponSanitizeElement",Ze,{tagName:bn,allowedTags:dr}),Ze.hasChildNodes()&&!k6(Ze.firstElementChild)&&Z(/<[/\w]/g,Ze.innerHTML)&&Z(/<[/\w]/g,Ze.textContent)||Ze.nodeType===Pe.progressingInstruction||mM&&Ze.nodeType===Pe.comment&&Z(/<[/\w]/g,Ze.data))return vh(Ze),!0;if(!dr[bn]||Ec[bn]){if(!Ec[bn]&&B6(bn)&&($n.tagNameCheck instanceof RegExp&&Z($n.tagNameCheck,bn)||$n.tagNameCheck instanceof Function&&$n.tagNameCheck(bn)))return!1;if(pB&&!_S[bn]){let Bo=qe(Ze)||Ze.parentNode,Da=tt(Ze)||Ze.childNodes;if(Da&&Bo){let xa=Da.length;for(let hl=xa-1;hl>=0;--hl){let wh=Ue(Da[hl],!0);wh.__removalCount=(Ze.__removalCount||0)+1,Bo.insertBefore(wh,it(Ze))}}}return vh(Ze),!0}return Ze instanceof bt&&!zSe(Ze)||(bn==="noscript"||bn==="noembed"||bn==="noframes")&&Z(/<\/no(script|embed|frames)/i,Ze.innerHTML)?(vh(Ze),!0):(bb&&Ze.nodeType===Pe.text&&(It=Ze.textContent,u([Bi,us,yr],Bo=>{It=_(It,Bo," ")}),Ze.textContent!==It&&(p($e.removed,{element:Ze.cloneNode()}),Ze.textContent=It)),np("afterSanitizeElements",Ze,null),!1)},D6=function(Ze,It,bn){if(R6&&(It==="id"||It==="name")&&(bn in Qe||bn in OSe))return!1;if(!(_r&&!nd[It]&&Z(ml,It))){if(!(Ny&&Z(Do,It))){if(!oo[It]||nd[It]){if(!(B6(Ze)&&($n.tagNameCheck instanceof RegExp&&Z($n.tagNameCheck,Ze)||$n.tagNameCheck instanceof Function&&$n.tagNameCheck(Ze))&&($n.attributeNameCheck instanceof RegExp&&Z($n.attributeNameCheck,It)||$n.attributeNameCheck instanceof Function&&$n.attributeNameCheck(It))||It==="is"&&$n.allowCustomizedBuiltInElements&&($n.tagNameCheck instanceof RegExp&&Z($n.tagNameCheck,bn)||$n.tagNameCheck instanceof Function&&$n.tagNameCheck(bn))))return!1}else if(!bB[It]){if(!Z(Ua,_(bn,fb,""))){if(!((It==="src"||It==="xlink:href"||It==="href")&&Ze!=="script"&&C(bn,"data:")===0&&E6[Ze])){if(!(es&&!Z(xr,_(bn,fb,"")))){if(bn)return!1}}}}}}return!0},B6=function(Ze){return Ze!=="annotation-xml"&&x(Ze,Gc)},Y6=function(Ze){np("beforeSanitizeAttributes",Ze,null);let{attributes:It}=Ze;if(!It)return;let bn={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:oo},Bo=It.length;for(;Bo--;){let Da=It[Bo],{name:xa,namespaceURI:hl,value:wh}=Da,XL=Ks(xa),Xc=xa==="value"?wh:V(wh);if(bn.attrName=XL,bn.attrValue=Xc,bn.keepAttr=!0,bn.forceKeepAttr=void 0,np("uponSanitizeAttribute",Ze,bn),Xc=bn.attrValue,bn.forceKeepAttr||(gM(xa,Ze),!bn.keepAttr))continue;if(!pb&&Z(/\/>/i,Xc)){gM(xa,Ze);continue}if(mM&&Z(/((--!?|])>)|<\/(style|title)/i,Xc)){gM(xa,Ze);continue}bb&&u([Bi,us,yr],H6=>{Xc=_(Xc,H6," ")});let O6=Ks(Ze.nodeName);if(D6(O6,XL,Xc)){if(Z6&&(XL==="id"||XL==="name")&&(gM(xa,Ze),Xc=USe+Xc),dt&&typeof Nr=="object"&&typeof Nr.getAttributeType=="function"&&!hl)switch(Nr.getAttributeType(O6,XL)){case"TrustedHTML":{Xc=dt.createHTML(Xc);break}case"TrustedScriptURL":{Xc=dt.createScriptURL(Xc);break}}try{hl?Ze.setAttributeNS(hl,xa,Xc):Ze.setAttribute(xa,Xc),N6(Ze)?vh(Ze):m($e.removed)}catch{}}}np("afterSanitizeAttributes",Ze,null)},KSe=function Rn(Ze){let It=null,bn=M6(Ze);for(np("beforeSanitizeShadowDOM",Ze,null);It=bn.nextNode();)np("uponSanitizeShadowNode",It,null),!U6(It)&&(It.content instanceof pe&&Rn(It.content),Y6(It));np("afterSanitizeShadowDOM",Ze,null)};return $e.sanitize=function(Rn){let Ze=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},It=null,bn=null,Bo=null,Da=null;if(gB=!Rn,gB&&(Rn=""),typeof Rn!="string"&&!k6(Rn))if(typeof Rn.toString=="function"){if(Rn=Rn.toString(),typeof Rn!="string")throw G("dirty is not a string, aborting")}else throw G("toString is not a function");if(!$e.isSupported)return Rn;if(hB||xB(Ze),$e.removed=[],typeof Rn=="string"&&(GL=!1),GL){if(Rn.nodeName){let wh=Ks(Rn.nodeName);if(!dr[wh]||Ec[wh])throw G("root node is forbidden and cannot be sanitized in-place")}}else if(Rn instanceof Dt)It=A6(""),bn=It.ownerDocument.importNode(Rn,!0),bn.nodeType===Pe.element&&bn.nodeName==="BODY"||bn.nodeName==="HTML"?It=bn:It.appendChild(bn);else{if(!yS&&!bb&&!ky&&Rn.indexOf("<")===-1)return dt&&fM?dt.createHTML(Rn):Rn;if(It=A6(Rn),!It)return yS?null:fM?Bt:""}It&&fB&&vh(It.firstChild);let xa=M6(GL?Rn:It);for(;Bo=xa.nextNode();)U6(Bo)||(Bo.content instanceof pe&&KSe(Bo.content),Y6(Bo));if(GL)return Rn;if(yS){if(hM)for(Da=nr.call(It.ownerDocument);It.firstChild;)Da.appendChild(It.firstChild);else Da=It;return(oo.shadowroot||oo.shadowrootmode)&&(Da=ka.call(je,Da,!0)),Da}let hl=ky?It.outerHTML:It.innerHTML;return ky&&dr["!doctype"]&&It.ownerDocument&&It.ownerDocument.doctype&&It.ownerDocument.doctype.name&&Z(Se,It.ownerDocument.doctype.name)&&(hl=" `+hl),bb&&u([Bi,us,yr],wh=>{hl=_(hl,wh," ")}),dt&&fM?dt.createHTML(hl):hl},$e.setConfig=function(){let Rn=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};xB(Rn),hB=!0},$e.clearConfig=function(){SS=null,hB=!1},$e.isValidAttribute=function(Rn,Ze,It){SS||xB({});let bn=Ks(Rn),Bo=Ks(Ze);return D6(bn,Bo,It)},$e.addHook=function(Rn,Ze){typeof Ze=="function"&&(io[Rn]=io[Rn]||[],p(io[Rn],Ze))},$e.removeHook=function(Rn){if(io[Rn])return m(io[Rn])},$e.removeHooks=function(Rn){io[Rn]&&(io[Rn]=[])},$e.removeAllHooks=function(){io={}},$e}var ht=Ot();return ht})});var Gte=Ic((v9t,GO)=>{"use strict";var w9t=T(S());GO.exports=WN;GO.exports.default=WN;function WN(e,t,n){n=n||2;var i=t&&t.length,o=i?t[0]*n:e.length,r=Lte(e,0,o,n,!0),s=[];if(!r||r.next===r.prev)return s;var a,c,d,u,m,p,g;if(i&&(r=cEe(e,t,r,n)),e.length>80*n){a=d=e[0],c=u=e[1];for(var f=n;fd&&(d=m),p>u&&(u=p);g=Math.max(d-a,u-c),g=g!==0?32767/g:0}return aR(r,s,n,a,c,g,0),s}function Lte(e,t,n,i,o){var r,s;if(o===ZO(e,t,n,i)>0)for(r=t;r=t;r-=i)s=Vte(r,e[r],e[r+1],s);return s&&PN(s,s.next)&&(lR(s),s=s.next),s}function hx(e,t){if(!e)return e;t||(t=e);var n=e,i;do if(i=!1,!n.steiner&&(PN(n,n.next)||Vr(n.prev,n,n.next)===0)){if(lR(n),n=t=n.prev,n===n.next)break;i=!0}else n=n.next;while(i||n!==t);return t}function aR(e,t,n,i,o,r,s){if(e){!s&&r&&hEe(e,i,o,r);for(var a=e,c,d;e.prev!==e.next;){if(c=e.prev,d=e.next,r?rEe(e,i,o,r):oEe(e)){t.push(c.i/n|0),t.push(e.i/n|0),t.push(d.i/n|0),lR(e),e=d.next,a=d.next;continue}if(e=d,e===a){s?s===1?(e=sEe(hx(e),t,n),aR(e,t,n,i,o,r,2)):s===2&&aEe(e,t,n,i,o,r):aR(hx(e),t,n,i,o,r,1);break}}}}function oEe(e){var t=e.prev,n=e,i=e.next;if(Vr(t,n,i)>=0)return!1;for(var o=t.x,r=n.x,s=i.x,a=t.y,c=n.y,d=i.y,u=or?o>s?o:s:r>s?r:s,g=a>c?a>d?a:d:c>d?c:d,f=i.next;f!==t;){if(f.x>=u&&f.x<=p&&f.y>=m&&f.y<=g&&oC(o,a,r,c,s,d,f.x,f.y)&&Vr(f.prev,f,f.next)>=0)return!1;f=f.next}return!0}function rEe(e,t,n,i){var o=e.prev,r=e,s=e.next;if(Vr(o,r,s)>=0)return!1;for(var a=o.x,c=r.x,d=s.x,u=o.y,m=r.y,p=s.y,g=ac?a>d?a:d:c>d?c:d,_=u>m?u>p?u:p:m>p?m:p,C=LO(g,f,t,n,i),V=LO(x,_,t,n,i),L=e.prevZ,Z=e.nextZ;L&&L.z>=C&&Z&&Z.z<=V;){if(L.x>=g&&L.x<=x&&L.y>=f&&L.y<=_&&L!==o&&L!==s&&oC(a,u,c,m,d,p,L.x,L.y)&&Vr(L.prev,L,L.next)>=0||(L=L.prevZ,Z.x>=g&&Z.x<=x&&Z.y>=f&&Z.y<=_&&Z!==o&&Z!==s&&oC(a,u,c,m,d,p,Z.x,Z.y)&&Vr(Z.prev,Z,Z.next)>=0))return!1;Z=Z.nextZ}for(;L&&L.z>=C;){if(L.x>=g&&L.x<=x&&L.y>=f&&L.y<=_&&L!==o&&L!==s&&oC(a,u,c,m,d,p,L.x,L.y)&&Vr(L.prev,L,L.next)>=0)return!1;L=L.prevZ}for(;Z&&Z.z<=V;){if(Z.x>=g&&Z.x<=x&&Z.y>=f&&Z.y<=_&&Z!==o&&Z!==s&&oC(a,u,c,m,d,p,Z.x,Z.y)&&Vr(Z.prev,Z,Z.next)>=0)return!1;Z=Z.nextZ}return!0}function sEe(e,t,n){var i=e;do{var o=i.prev,r=i.next.next;!PN(o,r)&&Rte(o,i,i.next,r)&&cR(o,r)&&cR(r,o)&&(t.push(o.i/n|0),t.push(i.i/n|0),t.push(r.i/n|0),lR(i),lR(i.next),i=e=r),i=i.next}while(i!==e);return hx(i)}function aEe(e,t,n,i,o,r){var s=e;do{for(var a=s.next.next;a!==s.prev;){if(s.i!==a.i&&bEe(s,a)){var c=Zte(s,a);s=hx(s,s.next),c=hx(c,c.next),aR(s,t,n,i,o,r,0),aR(c,t,n,i,o,r,0);return}a=a.next}s=s.next}while(s!==e)}function cEe(e,t,n,i){var o=[],r,s,a,c,d;for(r=0,s=t.length;r=n.next.y&&n.next.y!==n.y){var a=n.x+(o-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(a<=i&&a>r&&(r=a,s=n.x=n.x&&n.x>=d&&i!==n.x&&oC(os.x||n.x===s.x&&mEe(s,n)))&&(s=n,m=p)),n=n.next;while(n!==c);return s}function mEe(e,t){return Vr(e.prev,e,t.prev)<0&&Vr(t.next,e,e.next)<0}function hEe(e,t,n,i){var o=e;do o.z===0&&(o.z=LO(o.x,o.y,t,n,i)),o.prevZ=o.prev,o.nextZ=o.next,o=o.next;while(o!==e);o.prevZ.nextZ=null,o.prevZ=null,fEe(o)}function fEe(e){var t,n,i,o,r,s,a,c,d=1;do{for(n=e,e=null,r=null,s=0;n;){for(s++,i=n,a=0,t=0;t0||c>0&&i;)a!==0&&(c===0||!i||n.z<=i.z)?(o=n,n=n.nextZ,a--):(o=i,i=i.nextZ,c--),r?r.nextZ=o:e=o,o.prevZ=r,r=o;n=i}r.nextZ=null,d*=2}while(s>1);return e}function LO(e,t,n,i,o){return e=(e-n)*o|0,t=(t-i)*o|0,e=(e|e<<8)&16711935,e=(e|e<<4)&252645135,e=(e|e<<2)&858993459,e=(e|e<<1)&1431655765,t=(t|t<<8)&16711935,t=(t|t<<4)&252645135,t=(t|t<<2)&858993459,t=(t|t<<1)&1431655765,e|t<<1}function pEe(e){var t=e,n=e;do(t.x=(e-s)*(r-a)&&(e-s)*(i-a)>=(n-s)*(t-a)&&(n-s)*(r-a)>=(o-s)*(i-a)}function bEe(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!gEe(e,t)&&(cR(e,t)&&cR(t,e)&&yEe(e,t)&&(Vr(e.prev,e,t.prev)||Vr(e,t.prev,t))||PN(e,t)&&Vr(e.prev,e,e.next)>0&&Vr(t.prev,t,t.next)>0)}function Vr(e,t,n){return(t.y-e.y)*(n.x-t.x)-(t.x-e.x)*(n.y-t.y)}function PN(e,t){return e.x===t.x&&e.y===t.y}function Rte(e,t,n,i){var o=IN(Vr(e,t,n)),r=IN(Vr(e,t,i)),s=IN(Vr(n,i,e)),a=IN(Vr(n,i,t));return!!(o!==r&&s!==a||o===0&&XN(e,n,t)||r===0&&XN(e,i,t)||s===0&&XN(n,e,i)||a===0&&XN(n,t,i))}function XN(e,t,n){return t.x<=Math.max(e.x,n.x)&&t.x>=Math.min(e.x,n.x)&&t.y<=Math.max(e.y,n.y)&&t.y>=Math.min(e.y,n.y)}function IN(e){return e>0?1:e<0?-1:0}function gEe(e,t){var n=e;do{if(n.i!==e.i&&n.next.i!==e.i&&n.i!==t.i&&n.next.i!==t.i&&Rte(n,n.next,e,t))return!0;n=n.next}while(n!==e);return!1}function cR(e,t){return Vr(e.prev,e,e.next)<0?Vr(e,t,e.next)>=0&&Vr(e,e.prev,t)>=0:Vr(e,t,e.prev)<0||Vr(e,e.next,t)<0}function yEe(e,t){var n=e,i=!1,o=(e.x+t.x)/2,r=(e.y+t.y)/2;do n.y>r!=n.next.y>r&&n.next.y!==n.y&&o<(n.next.x-n.x)*(r-n.y)/(n.next.y-n.y)+n.x&&(i=!i),n=n.next;while(n!==e);return i}function Zte(e,t){var n=new RO(e.i,e.x,e.y),i=new RO(t.i,t.x,t.y),o=e.next,r=t.prev;return e.next=t,t.prev=e,n.next=o,o.prev=n,i.next=n,n.prev=i,r.next=i,i.prev=r,i}function Vte(e,t,n,i){var o=new RO(e,t,n);return i?(o.next=i.next,o.prev=i,i.next.prev=o,i.next=o):(o.prev=o,o.next=o),o}function lR(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function RO(e,t,n){this.i=e,this.x=t,this.y=n,this.prev=null,this.next=null,this.z=0,this.prevZ=null,this.nextZ=null,this.steiner=!1}WN.deviation=function(e,t,n,i){var o=t&&t.length,r=o?t[0]*n:e.length,s=Math.abs(ZO(e,0,r,n));if(o)for(var a=0,c=t.length;a0&&(i+=e[o-1].length,n.holes.push(i))}return n}});var tH=Ic((exports,module)=>{var BDt=T(S());/*! * protobuf.js v7.3.0 (c) 2016, daniel wirtz * compiled fri, 10 may 2024 03:38:34 utc * licensed under the bsd-3-clause license * see: https://github.com/dcodeio/protobuf.js for details */(function(undefined){"use strict";(function(t,n,i){function o(s){var a=n[s];return a||t[s][0].call(a=n[s]={exports:{}},o,a,a.exports),a.exports}var r=o(i[0]);r.util.global.protobuf=r,typeof define=="function"&&define.amd&&define(["long"],function(s){return s&&s.isLong&&(r.util.Long=s,r.configure()),r}),typeof module=="object"&&module&&module.exports&&(module.exports=r)})({1:[function(e,t,n){"use strict";t.exports=i;function i(o,r){for(var s=new Array(arguments.length-1),a=0,c=2,d=!0;c1&&d.charAt(u)==="=";)++m;return Math.ceil(d.length*3)/4-m};for(var o=new Array(64),r=new Array(123),s=0;s<64;)r[o[s]=s<26?s+65:s<52?s+71:s<62?s-4:s-59|43]=s++;i.encode=function(d,u,m){for(var p=null,g=[],f=0,x=0,_;u>2],_=(C&3)<<4,x=1;break;case 1:g[f++]=o[_|C>>4],_=(C&15)<<2,x=2;break;case 2:g[f++]=o[_|C>>6],g[f++]=o[C&63],x=0;break}f>8191&&((p||(p=[])).push(String.fromCharCode.apply(String,g)),f=0)}return x&&(g[f++]=o[_],g[f++]=61,x===1&&(g[f++]=61)),p?(f&&p.push(String.fromCharCode.apply(String,g.slice(0,f))),p.join("")):String.fromCharCode.apply(String,g.slice(0,f))};var a="invalid encoding";i.decode=function(d,u,m){for(var p=m,g=0,f,x=0;x1)break;if((_=r[_])===undefined)throw Error(a);switch(g){case 0:f=_,g=1;break;case 1:u[m++]=f<<2|(_&48)>>4,f=_,g=2;break;case 2:u[m++]=(f&15)<<4|(_&60)>>2,f=_,g=3;break;case 3:u[m++]=(f&3)<<6|_,g=0;break}}if(g===1)throw Error(a);return m-p},i.test=function(d){return/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(d)}},{}],3:[function(e,t,n){"use strict";t.exports=i;function i(){this._listeners={}}i.prototype.on=function(r,s,a){return(this._listeners[r]||(this._listeners[r]=[])).push({fn:s,ctx:a||this}),this},i.prototype.off=function(r,s){if(r===undefined)this._listeners={};else if(s===undefined)this._listeners[r]=[];else for(var a=this._listeners[r],c=0;c0?0:2147483648,g,f);else if(isNaN(p))m(2143289344,g,f);else if(p>34028234663852886e22)m((x<<31|2139095040)>>>0,g,f);else if(p<11754943508222875e-54)m((x<<31|Math.round(p/1401298464324817e-60))>>>0,g,f);else{var _=Math.floor(Math.log(p)/Math.LN2),C=Math.round(p*Math.pow(2,-_)*8388608)&8388607;m((x<<31|_+127<<23|C)>>>0,g,f)}}c.writeFloatLE=d.bind(null,o),c.writeFloatBE=d.bind(null,r);function u(m,p,g){var f=m(p,g),x=(f>>31)*2+1,_=f>>>23&255,C=f&8388607;return _===255?C?NaN:x*(1/0):_===0?x*1401298464324817e-60*C:x*Math.pow(2,_-150)*(C+8388608)}c.readFloatLE=u.bind(null,s),c.readFloatBE=u.bind(null,a)}(),typeof Float64Array<"u"?function(){var d=new Float64Array([-0]),u=new Uint8Array(d.buffer),m=u[7]===128;function p(_,C,V){d[0]=_,C[V]=u[0],C[V+1]=u[1],C[V+2]=u[2],C[V+3]=u[3],C[V+4]=u[4],C[V+5]=u[5],C[V+6]=u[6],C[V+7]=u[7]}function g(_,C,V){d[0]=_,C[V]=u[7],C[V+1]=u[6],C[V+2]=u[5],C[V+3]=u[4],C[V+4]=u[3],C[V+5]=u[2],C[V+6]=u[1],C[V+7]=u[0]}c.writeDoubleLE=m?p:g,c.writeDoubleBE=m?g:p;function f(_,C){return u[0]=_[C],u[1]=_[C+1],u[2]=_[C+2],u[3]=_[C+3],u[4]=_[C+4],u[5]=_[C+5],u[6]=_[C+6],u[7]=_[C+7],d[0]}function x(_,C){return u[7]=_[C],u[6]=_[C+1],u[5]=_[C+2],u[4]=_[C+3],u[3]=_[C+4],u[2]=_[C+5],u[1]=_[C+6],u[0]=_[C+7],d[0]}c.readDoubleLE=m?f:x,c.readDoubleBE=m?x:f}():function(){function d(m,p,g,f,x,_){var C=f<0?1:0;if(C&&(f=-f),f===0)m(0,x,_+p),m(1/f>0?0:2147483648,x,_+g);else if(isNaN(f))m(0,x,_+p),m(2146959360,x,_+g);else if(f>17976931348623157e292)m(0,x,_+p),m((C<<31|2146435072)>>>0,x,_+g);else{var V;if(f<22250738585072014e-324)V=f/5e-324,m(V>>>0,x,_+p),m((C<<31|V/4294967296)>>>0,x,_+g);else{var L=Math.floor(Math.log(f)/Math.LN2);L===1024&&(L=1023),V=f*Math.pow(2,-L),m(V*4503599627370496>>>0,x,_+p),m((C<<31|L+1023<<20|V*1048576&1048575)>>>0,x,_+g)}}}c.writeDoubleLE=d.bind(null,o,0,4),c.writeDoubleBE=d.bind(null,r,4,0);function u(m,p,g,f,x){var _=m(f,x+p),C=m(f,x+g),V=(C>>31)*2+1,L=C>>>20&2047,Z=4294967296*(C&1048575)+_;return L===2047?Z?NaN:V*(1/0):L===0?V*5e-324*Z:V*Math.pow(2,L-1075)*(Z+4503599627370496)}c.readDoubleLE=u.bind(null,s,0,4),c.readDoubleBE=u.bind(null,a,4,0)}(),c}function o(c,d,u){d[u]=c&255,d[u+1]=c>>>8&255,d[u+2]=c>>>16&255,d[u+3]=c>>>24}function r(c,d,u){d[u]=c>>>24,d[u+1]=c>>>16&255,d[u+2]=c>>>8&255,d[u+3]=c&255}function s(c,d){return(c[d]|c[d+1]<<8|c[d+2]<<16|c[d+3]<<24)>>>0}function a(c,d){return(c[d]<<24|c[d+1]<<16|c[d+2]<<8|c[d+3])>>>0}},{}],5:[function(require,module,exports){"use strict";module.exports=inquire;function inquire(moduleName){try{var mod=eval("quire".replace(/^/,"re"))(moduleName);if(mod&&(mod.length||Object.keys(mod).length))return mod}catch(e){}return null}},{}],6:[function(e,t,n){"use strict";t.exports=i;function i(o,r,s){var a=s||8192,c=a>>>1,d=null,u=a;return function(p){if(p<1||p>c)return o(p);u+p>a&&(d=o(a),u=0);var g=r.call(d,u,u+=p);return u&7&&(u=(u|7)+1),g}}},{}],7:[function(e,t,n){"use strict";var i=n;i.length=function(r){for(var s=0,a=0,c=0;c191&&p<224?u[m++]=(p&31)<<6|r[s++]&63:p>239&&p<365?(p=((p&7)<<18|(r[s++]&63)<<12|(r[s++]&63)<<6|r[s++]&63)-65536,u[m++]=55296+(p>>10),u[m++]=56320+(p&1023)):u[m++]=(p&15)<<12|(r[s++]&63)<<6|r[s++]&63,m>8191&&((d||(d=[])).push(String.fromCharCode.apply(String,u)),m=0);return d?(m&&d.push(String.fromCharCode.apply(String,u.slice(0,m))),d.join("")):String.fromCharCode.apply(String,u.slice(0,m))},i.write=function(r,s,a){for(var c=a,d,u,m=0;m>6|192,s[a++]=d&63|128):(d&64512)===55296&&((u=r.charCodeAt(m+1))&64512)===56320?(d=65536+((d&1023)<<10)+(u&1023),++m,s[a++]=d>>18|240,s[a++]=d>>12&63|128,s[a++]=d>>6&63|128,s[a++]=d&63|128):(s[a++]=d>>12|224,s[a++]=d>>6&63|128,s[a++]=d&63|128);return a-c}},{}],8:[function(e,t,n){"use strict";var i=n;i.build="minimal",i.Writer=e(16),i.BufferWriter=e(17),i.Reader=e(9),i.BufferReader=e(10),i.util=e(15),i.rpc=e(12),i.roots=e(11),i.configure=o;function o(){i.util._configure(),i.Writer._configure(i.BufferWriter),i.Reader._configure(i.BufferReader)}o()},{10:10,11:11,12:12,15:15,16:16,17:17,9:9}],9:[function(e,t,n){"use strict";t.exports=c;var i=e(15),o,r=i.LongBits,s=i.utf8;function a(f,x){return RangeError("index out of range: "+f.pos+" + "+(x||1)+" > "+f.len)}function c(f){this.buf=f,this.pos=0,this.len=f.length}var d=typeof Uint8Array<"u"?function(x){if(x instanceof Uint8Array||Array.isArray(x))return new c(x);throw Error("illegal buffer")}:function(x){if(Array.isArray(x))return new c(x);throw Error("illegal buffer")},u=function(){return i.Buffer?function(_){return(c.create=function(V){return i.Buffer.isBuffer(V)?new o(V):d(V)})(_)}:d};c.create=u(),c.prototype._slice=i.Array.prototype.subarray||i.Array.prototype.slice,c.prototype.uint32=function(){var x=4294967295;return function(){if(x=(this.buf[this.pos]&127)>>>0,this.buf[this.pos++]<128||(x=(x|(this.buf[this.pos]&127)<<7)>>>0,this.buf[this.pos++]<128)||(x=(x|(this.buf[this.pos]&127)<<14)>>>0,this.buf[this.pos++]<128)||(x=(x|(this.buf[this.pos]&127)<<21)>>>0,this.buf[this.pos++]<128)||(x=(x|(this.buf[this.pos]&15)<<28)>>>0,this.buf[this.pos++]<128))return x;if((this.pos+=5)>this.len)throw this.pos=this.len,a(this,10);return x}}(),c.prototype.int32=function(){return this.uint32()|0},c.prototype.sint32=function(){var x=this.uint32();return x>>>1^-(x&1)|0};function m(){var f=new r(0,0),x=0;if(this.len-this.pos>4){for(;x<4;++x)if(f.lo=(f.lo|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return f;if(f.lo=(f.lo|(this.buf[this.pos]&127)<<28)>>>0,f.hi=(f.hi|(this.buf[this.pos]&127)>>4)>>>0,this.buf[this.pos++]<128)return f;x=0}else{for(;x<3;++x){if(this.pos>=this.len)throw a(this);if(f.lo=(f.lo|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return f}return f.lo=(f.lo|(this.buf[this.pos++]&127)<>>0,f}if(this.len-this.pos>4){for(;x<5;++x)if(f.hi=(f.hi|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return f}else for(;x<5;++x){if(this.pos>=this.len)throw a(this);if(f.hi=(f.hi|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return f}throw Error("invalid varint encoding")}c.prototype.bool=function(){return this.uint32()!==0};function p(f,x){return(f[x-4]|f[x-3]<<8|f[x-2]<<16|f[x-1]<<24)>>>0}c.prototype.fixed32=function(){if(this.pos+4>this.len)throw a(this,4);return p(this.buf,this.pos+=4)},c.prototype.sfixed32=function(){if(this.pos+4>this.len)throw a(this,4);return p(this.buf,this.pos+=4)|0};function g(){if(this.pos+8>this.len)throw a(this,8);return new r(p(this.buf,this.pos+=4),p(this.buf,this.pos+=4))}c.prototype.float=function(){if(this.pos+4>this.len)throw a(this,4);var x=i.float.readFloatLE(this.buf,this.pos);return this.pos+=4,x},c.prototype.double=function(){if(this.pos+8>this.len)throw a(this,4);var x=i.float.readDoubleLE(this.buf,this.pos);return this.pos+=8,x},c.prototype.bytes=function(){var x=this.uint32(),_=this.pos,C=this.pos+x;if(C>this.len)throw a(this,x);if(this.pos+=x,Array.isArray(this.buf))return this.buf.slice(_,C);if(_===C){var V=i.Buffer;return V?V.alloc(0):new this.buf.constructor(0)}return this._slice.call(this.buf,_,C)},c.prototype.string=function(){var x=this.bytes();return s.read(x,0,x.length)},c.prototype.skip=function(x){if(typeof x=="number"){if(this.pos+x>this.len)throw a(this,x);this.pos+=x}else do if(this.pos>=this.len)throw a(this);while(this.buf[this.pos++]&128);return this},c.prototype.skipType=function(f){switch(f){case 0:this.skip();break;case 1:this.skip(8);break;case 2:this.skip(this.uint32());break;case 3:for(;(f=this.uint32()&7)!==4;)this.skipType(f);break;case 5:this.skip(4);break;default:throw Error("invalid wire type "+f+" at offset "+this.pos)}return this},c._configure=function(f){o=f,c.create=u(),o._configure();var x=i.Long?"toLong":"toNumber";i.merge(c.prototype,{int64:function(){return m.call(this)[x](!1)},uint64:function(){return m.call(this)[x](!0)},sint64:function(){return m.call(this).zzDecode()[x](!1)},fixed64:function(){return g.call(this)[x](!0)},sfixed64:function(){return g.call(this)[x](!1)}})}},{15:15}],10:[function(e,t,n){"use strict";t.exports=r;var i=e(9);(r.prototype=Object.create(i.prototype)).constructor=r;var o=e(15);function r(s){i.call(this,s)}r._configure=function(){o.Buffer&&(r.prototype._slice=o.Buffer.prototype.slice)},r.prototype.string=function(){var a=this.uint32();return this.buf.utf8Slice?this.buf.utf8Slice(this.pos,this.pos=Math.min(this.pos+a,this.len)):this.buf.toString("utf-8",this.pos,this.pos=Math.min(this.pos+a,this.len))},r._configure()},{15:15,9:9}],11:[function(e,t,n){"use strict";t.exports={}},{}],12:[function(e,t,n){"use strict";var i=n;i.Service=e(13)},{13:13}],13:[function(e,t,n){"use strict";t.exports=o;var i=e(15);(o.prototype=Object.create(i.EventEmitter.prototype)).constructor=o;function o(r,s,a){if(typeof r!="function")throw TypeError("rpcImpl must be a function");i.EventEmitter.call(this),this.rpcImpl=r,this.requestDelimited=!!s,this.responseDelimited=!!a}o.prototype.rpcCall=function r(s,a,c,d,u){if(!d)throw TypeError("request must be specified");var m=this;if(!u)return i.asPromise(r,m,s,a,c,d);if(!m.rpcImpl)return setTimeout(function(){u(Error("already ended"))},0),undefined;try{return m.rpcImpl(s,a[m.requestDelimited?"encodeDelimited":"encode"](d).finish(),function(g,f){if(g)return m.emit("error",g,s),u(g);if(f===null)return m.end(!0),undefined;if(!(f instanceof c))try{f=c[m.responseDelimited?"decodeDelimited":"decode"](f)}catch(x){return m.emit("error",x,s),u(x)}return m.emit("data",f,s),u(null,f)})}catch(p){return m.emit("error",p,s),setTimeout(function(){u(p)},0),undefined}},o.prototype.end=function(s){return this.rpcImpl&&(s||this.rpcImpl(null,null,null),this.rpcImpl=null,this.emit("end").off()),this}},{15:15}],14:[function(e,t,n){"use strict";t.exports=o;var i=e(15);function o(c,d){this.lo=c>>>0,this.hi=d>>>0}var r=o.zero=new o(0,0);r.toNumber=function(){return 0},r.zzEncode=r.zzDecode=function(){return this},r.length=function(){return 1};var s=o.zeroHash="\0\0\0\0\0\0\0\0";o.fromNumber=function(d){if(d===0)return r;var u=d<0;u&&(d=-d);var m=d>>>0,p=(d-m)/4294967296>>>0;return u&&(p=~p>>>0,m=~m>>>0,++m>4294967295&&(m=0,++p>4294967295&&(p=0))),new o(m,p)},o.from=function(d){if(typeof d=="number")return o.fromNumber(d);if(i.isString(d))if(i.Long)d=i.Long.fromString(d);else return o.fromNumber(parseInt(d,10));return d.low||d.high?new o(d.low>>>0,d.high>>>0):r},o.prototype.toNumber=function(d){if(!d&&this.hi>>>31){var u=~this.lo+1>>>0,m=~this.hi>>>0;return u||(m=m+1>>>0),-(u+m*4294967296)}return this.lo+this.hi*4294967296},o.prototype.toLong=function(d){return i.Long?new i.Long(this.lo|0,this.hi|0,!!d):{low:this.lo|0,high:this.hi|0,unsigned:!!d}};var a=String.prototype.charCodeAt;o.fromHash=function(d){return d===s?r:new o((a.call(d,0)|a.call(d,1)<<8|a.call(d,2)<<16|a.call(d,3)<<24)>>>0,(a.call(d,4)|a.call(d,5)<<8|a.call(d,6)<<16|a.call(d,7)<<24)>>>0)},o.prototype.toHash=function(){return String.fromCharCode(this.lo&255,this.lo>>>8&255,this.lo>>>16&255,this.lo>>>24,this.hi&255,this.hi>>>8&255,this.hi>>>16&255,this.hi>>>24)},o.prototype.zzEncode=function(){var d=this.hi>>31;return this.hi=((this.hi<<1|this.lo>>>31)^d)>>>0,this.lo=(this.lo<<1^d)>>>0,this},o.prototype.zzDecode=function(){var d=-(this.lo&1);return this.lo=((this.lo>>>1|this.hi<<31)^d)>>>0,this.hi=(this.hi>>>1^d)>>>0,this},o.prototype.length=function(){var d=this.lo,u=(this.lo>>>28|this.hi<<4)>>>0,m=this.hi>>>24;return m===0?u===0?d<16384?d<128?1:2:d<2097152?3:4:u<16384?u<128?5:6:u<2097152?7:8:m<128?9:10}},{15:15}],15:[function(e,t,n){"use strict";var i=n;i.asPromise=e(1),i.base64=e(2),i.EventEmitter=e(3),i.float=e(4),i.inquire=e(5),i.utf8=e(7),i.pool=e(6),i.LongBits=e(14),i.isNode=!!(typeof global<"u"&&global&&global.process&&global.process.versions&&global.process.versions.node),i.global=i.isNode&&global||typeof window<"u"&&window||typeof self<"u"&&self||this,i.emptyArray=Object.freeze?Object.freeze([]):[],i.emptyObject=Object.freeze?Object.freeze({}):{},i.isInteger=Number.isInteger||function(a){return typeof a=="number"&&isFinite(a)&&Math.floor(a)===a},i.isString=function(a){return typeof a=="string"||a instanceof String},i.isObject=function(a){return a&&typeof a=="object"},i.isset=i.isSet=function(a,c){var d=a[c];return d!=null&&a.hasOwnProperty(c)?typeof d!="object"||(Array.isArray(d)?d.length:Object.keys(d).length)>0:!1},i.Buffer=function(){try{var s=i.inquire("buffer").Buffer;return s.prototype.utf8Write?s:null}catch{return null}}(),i._Buffer_from=null,i._Buffer_allocUnsafe=null,i.newBuffer=function(a){return typeof a=="number"?i.Buffer?i._Buffer_allocUnsafe(a):new i.Array(a):i.Buffer?i._Buffer_from(a):typeof Uint8Array>"u"?a:new Uint8Array(a)},i.Array=typeof Uint8Array<"u"?Uint8Array:Array,i.Long=i.global.dcodeIO&&i.global.dcodeIO.Long||i.global.Long||i.inquire("long"),i.key2Re=/^true|false|0|1$/,i.key32Re=/^-?(?:0|[1-9][0-9]*)$/,i.key64Re=/^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/,i.longToHash=function(a){return a?i.LongBits.from(a).toHash():i.LongBits.zeroHash},i.longFromHash=function(a,c){var d=i.LongBits.fromHash(a);return i.Long?i.Long.fromBits(d.lo,d.hi,c):d.toNumber(!!c)};function o(s,a,c){for(var d=Object.keys(a),u=0;u-1;--m)if(c[u[m]]===1&&this[u[m]]!==undefined&&this[u[m]]!==null)return u[m]}},i.oneOfSetter=function(a){return function(c){for(var d=0;d127;)Z[G++]=L&127|128,L>>>=7;Z[G]=L}function x(L,Z){this.len=L,this.next=undefined,this.val=Z}x.prototype=Object.create(c.prototype),x.prototype.fn=f,m.prototype.uint32=function(Z){return this.len+=(this.tail=this.tail.next=new x((Z=Z>>>0)<128?1:Z<16384?2:Z<2097152?3:Z<268435456?4:5,Z)).len,this},m.prototype.int32=function(Z){return Z<0?this._push(_,10,r.fromNumber(Z)):this.uint32(Z)},m.prototype.sint32=function(Z){return this.uint32((Z<<1^Z>>31)>>>0)};function _(L,Z,G){for(;L.hi;)Z[G++]=L.lo&127|128,L.lo=(L.lo>>>7|L.hi<<25)>>>0,L.hi>>>=7;for(;L.lo>127;)Z[G++]=L.lo&127|128,L.lo=L.lo>>>7;Z[G++]=L.lo}m.prototype.uint64=function(Z){var G=r.from(Z);return this._push(_,G.length(),G)},m.prototype.int64=m.prototype.uint64,m.prototype.sint64=function(Z){var G=r.from(Z).zzEncode();return this._push(_,G.length(),G)},m.prototype.bool=function(Z){return this._push(g,1,Z?1:0)};function C(L,Z,G){Z[G]=L&255,Z[G+1]=L>>>8&255,Z[G+2]=L>>>16&255,Z[G+3]=L>>>24}m.prototype.fixed32=function(Z){return this._push(C,4,Z>>>0)},m.prototype.sfixed32=m.prototype.fixed32,m.prototype.fixed64=function(Z){var G=r.from(Z);return this._push(C,4,G.lo)._push(C,4,G.hi)},m.prototype.sfixed64=m.prototype.fixed64,m.prototype.float=function(Z){return this._push(i.float.writeFloatLE,4,Z)},m.prototype.double=function(Z){return this._push(i.float.writeDoubleLE,8,Z)};var V=i.Array.prototype.set?function(Z,G,X){G.set(Z,X)}:function(Z,G,X){for(var v=0;v>>0;if(!G)return this._push(g,1,0);if(i.isString(Z)){var X=m.alloc(G=s.length(Z));s.decode(Z,X,0),Z=X}return this.uint32(G)._push(V,G,Z)},m.prototype.string=function(Z){var G=a.length(Z);return G?this.uint32(G)._push(a.write,G,Z):this._push(g,1,0)},m.prototype.fork=function(){return this.states=new u(this),this.head=this.tail=new c(d,0,0),this.len=0,this},m.prototype.reset=function(){return this.states?(this.head=this.states.head,this.tail=this.states.tail,this.len=this.states.len,this.states=this.states.next):(this.head=this.tail=new c(d,0,0),this.len=0),this},m.prototype.ldelim=function(){var Z=this.head,G=this.tail,X=this.len;return this.reset().uint32(X),X&&(this.tail.next=Z.next,this.tail=G,this.len+=X),this},m.prototype.finish=function(){for(var Z=this.head.next,G=this.constructor.alloc(this.len),X=0;Z;)Z.fn(Z.val,G,X),X+=Z.len,Z=Z.next;return G},m._configure=function(L){o=L,m.create=p(),o._configure()}},{15:15}],17:[function(e,t,n){"use strict";t.exports=r;var i=e(16);(r.prototype=Object.create(i.prototype)).constructor=r;var o=e(15);function r(){i.call(this)}r._configure=function(){r.alloc=o._Buffer_allocUnsafe,r.writeBytesBuffer=o.Buffer&&o.Buffer.prototype instanceof Uint8Array&&o.Buffer.prototype.set.name==="set"?function(c,d,u){d.set(c,u)}:function(c,d,u){if(c.copy)c.copy(d,u,0,c.length);else for(var m=0;m>>0;return this.uint32(d),d&&this._push(r.writeBytesBuffer,d,c),this};function s(a,c,d){a.length<40?o.utf8.write(a,c,d):c.utf8Write?c.utf8Write(a,d):c.write(a,d)}r.prototype.string=function(c){var d=o.Buffer.byteLength(c);return this.uint32(d),d&&this._push(s,d,c),this},r._configure()},{15:15,16:16}]},{},[8])})()});var boe=Ic((AH,MH)=>{var JKt=T(S());(function(e,t){typeof AH=="object"&&typeof MH<"u"?MH.exports=t():typeof define=="function"&&define.amd?define(t):(e=e||self).RBush=t()})(AH,function(){"use strict";function e(_,C,V,L,Z){(function G(X,v,P,F,A){for(;F>P;){if(F-P>600){var b=F-P+1,R=v-P+1,E=Math.log(b),I=.5*Math.exp(2*E/3),w=.5*Math.sqrt(E*I*(b-I)/b)*(R-b/2<0?-1:1),N=Math.max(P,Math.floor(v-R*I/b+w)),B=Math.min(F,Math.floor(v+(b-R)*I/b+w));G(X,v,N,B,A)}var U=X[v],O=P,k=F;for(t(X,P,v),A(X[F],U)>0&&t(X,P,F);O0;)k--}A(X[P],U)===0?t(X,P,k):t(X,++k,F),k<=v&&(P=k+1),v<=k&&(F=k-1)}})(_,C,V||0,L||_.length-1,Z||n)}function t(_,C,V){var L=_[C];_[C]=_[V],_[V]=L}function n(_,C){return _C?1:0}var i=function(_){_===void 0&&(_=9),this._maxEntries=Math.max(4,_),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),this.clear()};function o(_,C,V){if(!V)return C.indexOf(_);for(var L=0;L=_.minX&&C.maxY>=_.minY}function f(_){return{children:_,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function x(_,C,V,L,Z){for(var G=[C,V];G.length;)if(!((V=G.pop())-(C=G.pop())<=L)){var X=C+Math.ceil((V-C)/L/2)*L;e(_,X,C,V,Z),G.push(C,X,X,V)}}return i.prototype.all=function(){return this._all(this.data,[])},i.prototype.search=function(_){var C=this.data,V=[];if(!g(_,C))return V;for(var L=this.toBBox,Z=[];C;){for(var G=0;G=0&&Z[C].children.length>this._maxEntries;)this._split(Z,C),C--;this._adjustParentBBoxes(L,Z,C)},i.prototype._split=function(_,C){var V=_[C],L=V.children.length,Z=this._minEntries;this._chooseSplitAxis(V,Z,L);var G=this._chooseSplitIndex(V,Z,L),X=f(V.children.splice(G,V.children.length-G));X.height=V.height,X.leaf=V.leaf,r(V,this.toBBox),r(X,this.toBBox),C?_[C-1].children.push(X):this._splitRoot(V,X)},i.prototype._splitRoot=function(_,C){this.data=f([_,C]),this.data.height=_.height+1,this.data.leaf=!1,r(this.data,this.toBBox)},i.prototype._chooseSplitIndex=function(_,C,V){for(var L,Z,G,X,v,P,F,A=1/0,b=1/0,R=C;R<=V-C;R++){var E=s(_,0,R,this.toBBox),I=s(_,R,V,this.toBBox),w=(Z=E,G=I,X=void 0,v=void 0,P=void 0,F=void 0,X=Math.max(Z.minX,G.minX),v=Math.max(Z.minY,G.minY),P=Math.min(Z.maxX,G.maxX),F=Math.min(Z.maxY,G.maxY),Math.max(0,P-X)*Math.max(0,F-v)),N=u(E)+u(I);w=C;A--){var b=_.children[A];a(X,_.leaf?Z(b):b),v+=m(X)}return v},i.prototype._adjustParentBBoxes=function(_,C,V){for(var L=V;L>=0;L--)a(C[L],_)},i.prototype._condense=function(_){for(var C=_.length-1,V=void 0;C>=0;C--)_[C].children.length===0?C>0?(V=_[C-1].children).splice(V.indexOf(_[C]),1):this.clear():r(_[C],this.toBBox)},i})});var Iue=Ic((HHn,Xue)=>{"use strict";var zHn=T(S());Xue.exports=PQe;var j2=1e20;function PQe(e,t){t||(t={});var n=t.cutoff==null?.25:t.cutoff,i=t.radius==null?8:t.radius,o=t.channel||0,r,s,a,c,d,u,m,p,g,f,x;if(ArrayBuffer.isView(e)||Array.isArray(e)){if(!t.width||!t.height)throw Error("For raw data width and height should be provided by options");r=t.width,s=t.height,c=e,t.stride?u=t.stride:u=Math.floor(e.length/r/s)}else window.HTMLCanvasElement&&e instanceof window.HTMLCanvasElement?(p=e,m=p.getContext("2d"),r=p.width,s=p.height,g=m.getImageData(0,0,r,s),c=g.data,u=4):window.CanvasRenderingContext2D&&e instanceof window.CanvasRenderingContext2D?(p=e.canvas,m=e,r=p.width,s=p.height,g=m.getImageData(0,0,r,s),c=g.data,u=4):window.ImageData&&e instanceof window.ImageData&&(g=e,r=e.width,s=e.height,c=g.data,u=4);if(a=Math.max(r,s),window.Uint8ClampedArray&&c instanceof window.Uint8ClampedArray||window.Uint8Array&&c instanceof window.Uint8Array)for(d=c,c=Array(r*s),f=0,x=Math.floor(d.length/u);f{var hzn=T(S());function YQe(){var e=0,t=1,n=2,i=3,o=4,r=5,s=6,a=7,c=8,d=9,u=10,m=11,p=12,g=13,f=14,x=15,_=16,C=17,V=0,L=1,Z=2,G=3,X=4;function v(b,R){return 55296<=b.charCodeAt(R)&&b.charCodeAt(R)<=56319&&56320<=b.charCodeAt(R+1)&&b.charCodeAt(R+1)<=57343}function P(b,R){R===void 0&&(R=0);var E=b.charCodeAt(R);if(55296<=E&&E<=56319&&R=1){var I=b.charCodeAt(R-1),w=E;return 55296<=I&&I<=56319?(I-55296)*1024+(w-56320)+65536:w}return E}function F(b,R,E){var I=[b].concat(R).concat([E]),w=I[I.length-2],N=E,B=I.lastIndexOf(f);if(B>1&&I.slice(1,B).every(function(k){return k==i})&&[i,g,C].indexOf(b)==-1)return Z;var U=I.lastIndexOf(o);if(U>0&&I.slice(1,U).every(function(k){return k==o})&&[p,o].indexOf(w)==-1)return I.filter(function(k){return k==o}).length%2==1?G:X;if(w==e&&N==t)return V;if(w==n||w==e||w==t)return N==f&&R.every(function(k){return k==i})?Z:L;if(N==n||N==e||N==t)return L;if(w==s&&(N==s||N==a||N==d||N==u))return V;if((w==d||w==a)&&(N==a||N==c))return V;if((w==u||w==c)&&N==c)return V;if(N==i||N==x)return V;if(N==r)return V;if(w==p)return V;var O=I.indexOf(i)!=-1?I.lastIndexOf(i)-1:I.length-2;return[g,C].indexOf(I[O])!=-1&&I.slice(O+1,-1).every(function(k){return k==i})&&N==f||w==x&&[_,C].indexOf(N)!=-1?V:R.indexOf(o)!=-1?Z:w==o&&N==o?V:L}this.nextBreak=function(b,R){if(R===void 0&&(R=0),R<0)return 0;if(R>=b.length-1)return b.length;for(var E=A(P(b,R)),I=[],w=R+1;w{var Zji=T(S());/* Copyright 2015-2018 Esri. 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 @preserve */(function(){var e=function(){var o={};o.defaultNoDataValue=-34027999387901484e22,o.decode=function(u,m){m=m||{};var p=m.encodedMaskData||m.encodedMaskData===null,g=c(u,m.inputOffset||0,p),f=m.noDataValue!==null?m.noDataValue:o.defaultNoDataValue,x=r(g,m.pixelType||Float32Array,m.encodedMaskData,f,m.returnMask),_={width:g.width,height:g.height,pixelData:x.resultPixels,minValue:x.minValue,maxValue:g.pixels.maxValue,noDataValue:f};return x.resultMask&&(_.maskData=x.resultMask),m.returnEncodedMask&&g.mask&&(_.encodedMaskData=g.mask.bitset?g.mask.bitset:null),m.returnFileInfo&&(_.fileInfo=s(g),m.computeUsedBitDepths&&(_.fileInfo.bitDepths=a(g))),_};var r=function(u,m,p,g,f){var x=0,_=u.pixels.numBlocksX,C=u.pixels.numBlocksY,V=Math.floor(u.width/_),L=Math.floor(u.height/C),Z=2*u.maxZError,G=Number.MAX_VALUE,X;p=p||(u.mask?u.mask.bitset:null);var v,P;v=new m(u.width*u.height),f&&p&&(P=new Uint8Array(u.width*u.height));for(var F=new Float32Array(V*L),A,b,R=0;R<=C;R++){var E=R!==C?L:u.height%C;if(E!==0)for(var I=0;I<=_;I++){var w=I!==_?V:u.width%_;if(w!==0){var N=R*u.width*L+I*V,B=u.width-w,U=u.pixels.blocks[x],O,k,J;U.encoding<2?(U.encoding===0?O=U.rawData:(d(U.stuffedData,U.bitsPerPixel,U.numValidPixels,U.offset,Z,F,u.pixels.maxValue),O=F),k=0):U.encoding===2?J=0:J=U.offset;var H;if(p)for(b=0;b>3],H<<=N&7),A=0;A>3]),H&128?(P&&(P[N]=1),X=U.encoding<2?O[k++]:J,G=G>X?X:G,v[N++]=X):(P&&(P[N]=0),v[N++]=g),H<<=1;N+=B}else if(U.encoding<2)for(b=0;bX?X:G,v[N++]=X;N+=B}else for(G=G>J?J:G,b=0;b0){var _=new Uint8Array(Math.ceil(g.width*g.height/8));x=new DataView(u,m,g.mask.numBytes);var C=x.getInt16(0,!0),V=2,L=0;do{if(C>0)for(;C--;)_[L++]=x.getUint8(V++);else{var Z=x.getUint8(V++);for(C=-C;C--;)_[L++]=Z}C=x.getInt16(V,!0),V+=2}while(V0?1:0),P=X+(g.height%X>0?1:0);g.pixels.blocks=new Array(v*P);for(var F=0,A=0;A3)throw"Invalid block encoding ("+I.encoding+")";if(I.encoding===2){m++;continue}if(w!==0&&w!==2){if(w>>=6,I.offsetType=w,w===2)I.offset=x.getInt8(1),R++;else if(w===1)I.offset=x.getInt16(1,!0),R+=2;else if(w===0)I.offset=x.getFloat32(1,!0),R+=4;else throw"Invalid block offset type";if(I.encoding===1)if(w=x.getUint8(R),R++,I.bitsPerPixel=w&63,w>>=6,I.numValidPixelsType=w,w===2)I.numValidPixels=x.getUint8(R),R++;else if(w===1)I.numValidPixels=x.getUint16(R,!0),R+=2;else if(w===0)I.numValidPixels=x.getUint32(R,!0),R+=4;else throw"Invalid valid pixel count type"}if(m+=R,I.encoding!==3){var N,B;if(I.encoding===0){var U=(g.pixels.numBytes-1)/4;if(U!==Math.floor(U))throw"uncompressed block has invalid length";N=new ArrayBuffer(U*4),B=new Uint8Array(N),B.set(new Uint8Array(u,m,U*4));var O=new Float32Array(N);I.rawData=O,m+=U*4}else if(I.encoding===1){var k=Math.ceil(I.numValidPixels*I.bitsPerPixel/8),J=Math.ceil(k/4);N=new ArrayBuffer(J*4),B=new Uint8Array(N),B.set(new Uint8Array(u,m,k)),I.stuffedData=new Uint32Array(N),m+=k}}}return g.eofOffset=m,g},d=function(u,m,p,g,f,x,_){var C=(1<=m)G=X>>>Z-m&C,Z-=m;else{var F=m-Z;G=(X&C)<>>Z}x[L]=G=u?(Z=G>>>L-u&_,L-=u):(X=u-L,Z=(G&_)<>>L),d[V]=p[Z];else for(v=Math.ceil((x-g)/f),V=0;V=u?(Z=G>>>L-u&_,L-=u):(X=u-L,Z=(G&_)<>>L),d[V]=Z=d?(L=Z>>>V-d&f,V-=d):(C=d-V,L=(Z&f)<>>V),G[_]=L=u?(G=X>>>Z&_,L-=u,Z+=u):(v=u-L,G=X>>>Z&_,X=c[C++],L=32-v,G|=(X&(1<=u?(G=X>>>Z&_,L-=u,Z+=u):(v=u-L,G=X>>>Z&_,X=c[C++],L=32-v,G|=(X&(1<=d?(L=G>>>Z&f,V-=d,Z+=d):(C=d-V,L=G>>>Z&f,G=c[x++],V=32-C,L|=(G&(1<=u?(_=C>>>x-u&p,x-=u):(V=u-x,_=(C&p)<>>x),d[f]=_;return d},originalUnstuff2:function(c,d,u,m){var p=(1<=u?(C=V>>>_&p,x-=u,_+=u):(L=u-x,C=V>>>_&p,V=c[g++],x=32-L,C|=(V&(1<=359?359:p;p-=f;do d+=c[g++]<<8,u+=d+=c[g++];while(--f);d=(d&65535)+(d>>>16),u=(u&65535)+(u>>>16)}return m&1&&(u+=d+=c[g]<<8),d=(d&65535)+(d>>>16),u=(u&65535)+(u>>>16),(u<<16|d)>>>0},readHeaderInfo:function(c,d){var u=d.ptr,m=new Uint8Array(c,u,6),p={};if(p.fileIdentifierString=String.fromCharCode.apply(null,m),p.fileIdentifierString.lastIndexOf("Lerc2",0)!==0)throw"Unexpected file identifier string (expect Lerc2 ): "+p.fileIdentifierString;u+=6;var g=new DataView(c,u,8),f=g.getInt32(0,!0);p.fileVersion=f,u+=4,f>=3&&(p.checksum=g.getUint32(4,!0),u+=4),g=new DataView(c,u,12),p.height=g.getUint32(0,!0),p.width=g.getUint32(4,!0),u+=8,f>=4?(p.numDims=g.getUint32(8,!0),u+=4):p.numDims=1,g=new DataView(c,u,40),p.numValidPixel=g.getUint32(0,!0),p.microBlockSize=g.getInt32(4,!0),p.blobSize=g.getInt32(8,!0),p.imageType=g.getInt32(12,!0),p.maxZError=g.getFloat64(16,!0),p.zMin=g.getFloat64(24,!0),p.zMax=g.getFloat64(32,!0),u+=40,d.headerInfo=p,d.ptr=u;var x,_;if(f>=3&&(_=f>=4?52:48,x=this.computeChecksumFletcher32(new Uint8Array(c,u-_,p.blobSize-14)),x!==p.checksum))throw"Checksum failed.";return!0},checkMinMaxRanges:function(c,d){var u=d.headerInfo,m=this.getDataTypeArray(u.imageType),p=u.numDims*this.getDataTypeSize(u.imageType),g=this.readSubArray(c,d.ptr,m,p),f=this.readSubArray(c,d.ptr+p,m,p);d.ptr+=2*p;var x,_=!0;for(x=0;x0){_=new Uint8Array(Math.ceil(p/8)),f=new DataView(c,u,x.numBytes);var V=f.getInt16(0,!0),L=2,Z=0,G=0;do{if(V>0)for(;V--;)_[Z++]=f.getUint8(L++);else for(G=f.getUint8(L++),V=-V;V--;)_[Z++]=G;V=f.getInt16(L,!0),L+=2}while(L>3],X<<=v&7):X=_[v>>3],X&128&&(C[v]=1);d.pixels.resultMask=C,x.bitset=_,u+=x.numBytes}return d.ptr=u,d.mask=x,!0},readDataOneSweep:function(c,d,u){var m=d.ptr,p=d.headerInfo,g=p.numDims,f=p.width*p.height,x=p.imageType,_=p.numValidPixel*r.getDataTypeSize(x)*g,C,V=d.pixels.resultMask;if(u===Uint8Array)C=new Uint8Array(c,m,_);else{var L=new ArrayBuffer(_),Z=new Uint8Array(L);Z.set(new Uint8Array(c,m,_)),C=new u(L)}if(C.length===f*g)d.pixels.resultPixels=C;else{d.pixels.resultPixels=new u(f*g);var G=0,X=0,v=0,P=0;if(g>1)for(v=0;v=x)return!1;var _=new Uint32Array(x-f);r.decodeBits(c,d,_);var C=[],V,L,Z,G;for(V=f;V0&&(C[L].second=R<>>32-G,32-b>=G?(b+=G,b===32&&(b=0,E++,R=A[E])):(b+=G-32,E++,R=A[E],C[L].second|=R>>>32-b));var I=0,w=0,N=new s;for(V=0;V=u?w=u:w=I,I>=30&&console.log("WARning, large NUM LUT BITS IS "+I);var B=[],U,O,k,J,H,ee;for(V=f;V0)if(U=[G,L],G<=w)for(O=C[L].second<=0;J--)H=O>>>J&1,H?(ee.right||(ee.right=new s),ee=ee.right):(ee.left||(ee.left=new s),ee=ee.left),J===0&&!ee.val&&(ee.val=U[1]);return{decodeLut:B,numBitsLUTQick:w,numBitsLUT:I,tree:N,stuffedData:A,srcPtr:E,bitPos:b}},readHuffman:function(c,d,u){var m=d.headerInfo,p=m.numDims,g=d.headerInfo.height,f=d.headerInfo.width,x=f*g,_=this.readHuffmanTree(c,d),C=_.decodeLut,V=_.tree,L=_.stuffedData,Z=_.srcPtr,G=_.bitPos,X=_.numBitsLUTQick,v=_.numBitsLUT,P=d.headerInfo.imageType===0?128:0,F,A,b,R=d.pixels.resultMask,E,I,w,N,B,U,O,k=0;G>0&&(Z++,G=0);var J=L[Z],H=d.encodeMode===1,ee=new u(x*p),z=ee,j;for(j=0;j1&&(z=new u(ee.buffer,x*j,x),k=0),d.headerInfo.numValidPixel===f*g)for(U=0,N=0;N>>32-X,I=E,32-G>>64-G-X,I=E),C[I])A=C[I][1],G+=C[I][0];else for(E=J<>>32-v,I=E,32-G>>64-G-v,I=E),F=V,O=0;O>>v-O-1&1,F=w?F.right:F.left,!(F.left||F.right)){A=F.val,G=G+O+1;break}G>=32&&(G-=32,Z++,J=L[Z]),b=A-P,H?(B>0?b+=k:N>0?b+=z[U-f]:b+=k,b&=255,z[U]=b,k=b):z[U]=b}else for(U=0,N=0;N>>32-X,I=E,32-G>>64-G-X,I=E),C[I])A=C[I][1],G+=C[I][0];else for(E=J<>>32-v,I=E,32-G>>64-G-v,I=E),F=V,O=0;O>>v-O-1&1,F=w?F.right:F.left,!(F.left||F.right)){A=F.val,G=G+O+1;break}G>=32&&(G-=32,Z++,J=L[Z]),b=A-P,H?(B>0&&R[U-1]?b+=k:N>0&&R[U-f]?b+=z[U-f]:b+=k,b&=255,z[U]=b,k=b):z[U]=b}d.ptr=d.ptr+(Z+1)*4+(G>0?4:0)}d.pixels.resultPixels=ee},decodeBits:function(c,d,u,m,p){{var g=d.headerInfo,f=g.fileVersion,x=0,_=new DataView(c,d.ptr,5),C=_.getUint8(0);x++;var V=C>>6,L=V===0?4:3-V,Z=(C&32)>0,G=C&31,X=0;if(L===1)X=_.getUint8(x),x++;else if(L===2)X=_.getUint16(x,!0),x+=2;else if(L===4)X=_.getUint32(x,!0),x+=4;else throw"Invalid valid pixel count type";var v=2*g.maxZError,P,F,A,b,R,E,I,w,N,B,U=g.numDims>1?g.maxValues[p]:g.zMax;if(Z){for(d.counter.lut++,w=_.getUint8(x),N=G,x++,b=Math.ceil((w-1)*G/8),R=Math.ceil(b/4),F=new ArrayBuffer(R*4),A=new Uint8Array(F),d.ptr+=x,A.set(new Uint8Array(c,d.ptr,b)),I=new Uint32Array(F),d.ptr+=b,B=0;w-1>>>B;)B++;b=Math.ceil(X*B/8),R=Math.ceil(b/4),F=new ArrayBuffer(R*4),A=new Uint8Array(F),A.set(new Uint8Array(c,d.ptr,b)),P=new Uint32Array(F),d.ptr+=b,f>=3?E=o.unstuffLUT2(I,G,w-1,m,v,U):E=o.unstuffLUT(I,G,w-1,m,v,U),f>=3?o.unstuff2(P,u,B,X,E):o.unstuff(P,u,B,X,E)}else d.counter.bitstuffer++,B=G,d.ptr+=x,B>0&&(b=Math.ceil(X*B/8),R=Math.ceil(b/4),F=new ArrayBuffer(R*4),A=new Uint8Array(F),A.set(new Uint8Array(c,d.ptr,b)),P=new Uint32Array(F),d.ptr+=b,f>=3?m==null?o.originalUnstuff2(P,u,B,X):o.unstuff2(P,u,B,X,!1,m,v,U):m==null?o.originalUnstuff(P,u,B,X):o.unstuff(P,u,B,X,!1,m,v,U))}},readTiles:function(c,d,u){var m=d.headerInfo,p=m.width,g=m.height,f=m.microBlockSize,x=m.imageType,_=r.getDataTypeSize(x),C=Math.ceil(p/f),V=Math.ceil(g/f);d.pixels.numBlocksY=V,d.pixels.numBlocksX=C,d.pixels.ptr=0;var L=0,Z=0,G=0,X=0,v=0,P=0,F=0,A=0,b=0,R=0,E=0,I=0,w=0,N=0,B=0,U=0,O,k,J,H,ee,z,j=new u(f*f),q=g%f||f,be=p%f||f,Te,ae,ye=m.numDims,Se,Le=d.pixels.resultMask,Xe=d.pixels.resultPixels;for(G=0;G1&&(Xe=new u(d.pixels.resultPixels.buffer,p*g*Se*_,p*g)),F=c.byteLength-d.ptr,O=new DataView(c,d.ptr,Math.min(10,F)),k={},U=0,A=O.getUint8(0),U++,b=A>>6&255,R=A>>2&15,R!==(X*f>>3&15))throw"integrity issue";if(z=A&3,z>3)throw d.ptr+=U,"Invalid block encoding ("+z+")";if(z===2){d.counter.constant++,d.ptr+=U;continue}else if(z===0){if(d.counter.uncompressed++,d.ptr+=U,w=v*P*_,N=c.byteLength-d.ptr,w=w1)for(g=0;g=-128&&d<=127;break;case 1:u=d>=0&&d<=255;break;case 2:u=d>=-32768&&d<=32767;break;case 3:u=d>=0&&d<=65536;break;case 4:u=d>=-2147483648&&d<=2147483647;break;case 5:u=d>=0&&d<=4294967296;break;case 6:u=d>=-34027999387901484e22&&d<=34027999387901484e22;break;case 7:u=d>=5e-324&&d<=17976931348623157e292;break;default:u=!1}return u},getDataTypeSize:function(c){var d=0;switch(c){case 0:case 1:d=1;break;case 2:case 3:d=2;break;case 4:case 5:case 6:d=4;break;case 7:d=8;break;default:d=c}return d},getDataTypeUsed:function(c,d){var u=c;switch(c){case 2:case 4:u=c-d;break;case 3:case 5:u=c-2*d;break;case 6:d===0?u=c:d===1?u=2:u=1;break;case 7:d===0?u=c:u=c-2*d+1;break;default:u=c;break}return u},getOnePixel:function(c,d,u,m){var p=0;switch(u){case 0:p=m.getInt8(d);break;case 1:p=m.getUint8(d);break;case 2:p=m.getInt16(d,!0);break;case 3:p=m.getUint16(d,!0);break;case 4:p=m.getInt32(d,!0);break;case 5:p=m.getUInt32(d,!0);break;case 6:p=m.getFloat32(d,!0);break;case 7:p=m.getFloat64(d,!0);break;default:throw"the decoder does not understand this pixel type"}return p}},s=function(c,d,u){this.val=c,this.left=d,this.right=u},a={decode:function(c,d){d=d||{};var u=d.noDataValue,m=0,p={};if(p.ptr=d.inputOffset||0,p.pixels={},!!r.readHeaderInfo(c,p)){var g=p.headerInfo,f=g.fileVersion,x=r.getDataTypeArray(g.imageType);r.readMask(c,p),g.numValidPixel!==g.width*g.height&&!p.pixels.resultMask&&(p.pixels.resultMask=d.maskData);var _=g.width*g.height;if(p.pixels.resultPixels=new x(_*g.numDims),p.counter={onesweep:0,uncompressed:0,lut:0,bitstuffer:0,constant:0,constantoffset:0},g.numValidPixel!==0)if(g.zMax===g.zMin)r.constructConstantSurface(p);else if(f>=4&&r.checkMinMaxRanges(c,p))r.constructConstantSurface(p);else{var C=new DataView(c,p.ptr,2),V=C.getUint8(0);if(p.ptr++,V)r.readDataOneSweep(c,p,x);else if(f>1&&g.imageType<=1&&Math.abs(g.maxZError-.5)<1e-5){var L=C.getUint8(1);if(p.ptr++,p.encodeMode=L,L>2||f<4&&L>1)throw"Invalid Huffman flag "+L;L?r.readHuffman(c,p,x):r.readTiles(c,p,x)}else r.readTiles(c,p,x)}p.eofOffset=p.ptr;var Z;d.inputOffset?(Z=p.headerInfo.blobSize+d.inputOffset-p.ptr,Math.abs(Z)>=1&&(p.eofOffset=d.inputOffset+p.headerInfo.blobSize)):(Z=p.headerInfo.blobSize-p.ptr,Math.abs(Z)>=1&&(p.eofOffset=p.headerInfo.blobSize));var G={width:g.width,height:g.height,pixelData:p.pixels.resultPixels,minValue:g.zMin,maxValue:g.zMax,validPixelCount:g.numValidPixel,dimCount:g.numDims,dimStats:{minValues:g.minValues,maxValues:g.maxValues},maskData:p.pixels.resultMask};if(p.pixels.resultMask&&r.isValidPixelValue(g.imageType,u)){var X=p.pixels.resultMask;for(m=0;m<_;m++)X[m]||(G.pixelData[m]=u);G.noDataValue=u}return p.noDataValue=u,d.returnFileInfo&&(G.fileInfo=r.formatFileInfo(p)),G}},getBandCount:function(c){var d=0,u=0,m={};for(m.ptr=0,m.pixels={};u1&&V.fileInfo.mask&&V.fileInfo.mask.numBytes>0&&f.push(V.maskData),m++,C.pixels.push(V.pixelData),C.statistics.push({minValue:V.minValue,maxValue:V.maxValue,noDataValue:V.noDataValue,dimStats:V.dimStats})}var L,Z,G;if(u>1&&f.length>1){for(G=C.width*C.height,C.bandMasks=f,_=new Uint8Array(G),_.set(f[0]),L=1;L{var ACo=T(S());GSe.exports={webm:"data:video/webm;base64,GkXfowEAAAAAAAAfQoaBAUL3gQFC8oEEQvOBCEKChHdlYm1Ch4EEQoWBAhhTgGcBAAAAAAAVkhFNm3RALE27i1OrhBVJqWZTrIHfTbuMU6uEFlSua1OsggEwTbuMU6uEHFO7a1OsghV17AEAAAAAAACkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVSalmAQAAAAAAAEUq17GDD0JATYCNTGF2ZjU1LjMzLjEwMFdBjUxhdmY1NS4zMy4xMDBzpJBlrrXf3DCDVB8KcgbMpcr+RImIQJBgAAAAAAAWVK5rAQAAAAAAD++uAQAAAAAAADLXgQFzxYEBnIEAIrWcg3VuZIaFVl9WUDiDgQEj44OEAmJaAOABAAAAAAAABrCBsLqBkK4BAAAAAAAPq9eBAnPFgQKcgQAitZyDdW5khohBX1ZPUkJJU4OBAuEBAAAAAAAAEZ+BArWIQOdwAAAAAABiZIEgY6JPbwIeVgF2b3JiaXMAAAAAAoC7AAAAAAAAgLUBAAAAAAC4AQN2b3JiaXMtAAAAWGlwaC5PcmcgbGliVm9yYmlzIEkgMjAxMDExMDEgKFNjaGF1ZmVudWdnZXQpAQAAABUAAABlbmNvZGVyPUxhdmM1NS41Mi4xMDIBBXZvcmJpcyVCQ1YBAEAAACRzGCpGpXMWhBAaQlAZ4xxCzmvsGUJMEYIcMkxbyyVzkCGkoEKIWyiB0JBVAABAAACHQXgUhIpBCCGEJT1YkoMnPQghhIg5eBSEaUEIIYQQQgghhBBCCCGERTlokoMnQQgdhOMwOAyD5Tj4HIRFOVgQgydB6CCED0K4moOsOQghhCQ1SFCDBjnoHITCLCiKgsQwuBaEBDUojILkMMjUgwtCiJqDSTX4GoRnQXgWhGlBCCGEJEFIkIMGQcgYhEZBWJKDBjm4FITLQagahCo5CB+EIDRkFQCQAACgoiiKoigKEBqyCgDIAAAQQFEUx3EcyZEcybEcCwgNWQUAAAEACAAAoEiKpEiO5EiSJFmSJVmSJVmS5omqLMuyLMuyLMsyEBqyCgBIAABQUQxFcRQHCA1ZBQBkAAAIoDiKpViKpWiK54iOCISGrAIAgAAABAAAEDRDUzxHlETPVFXXtm3btm3btm3btm3btm1blmUZCA1ZBQBAAAAQ0mlmqQaIMAMZBkJDVgEACAAAgBGKMMSA0JBVAABAAACAGEoOogmtOd+c46BZDppKsTkdnEi1eZKbirk555xzzsnmnDHOOeecopxZDJoJrTnnnMSgWQqaCa0555wnsXnQmiqtOeeccc7pYJwRxjnnnCateZCajbU555wFrWmOmkuxOeecSLl5UptLtTnnnHPOOeecc84555zqxekcnBPOOeecqL25lpvQxTnnnE/G6d6cEM4555xzzjnnnHPOOeecIDRkFQAABABAEIaNYdwpCNLnaCBGEWIaMulB9+gwCRqDnELq0ehopJQ6CCWVcVJKJwgNWQUAAAIAQAghhRRSSCGFFFJIIYUUYoghhhhyyimnoIJKKqmooowyyyyzzDLLLLPMOuyssw47DDHEEEMrrcRSU2011lhr7jnnmoO0VlprrbVSSimllFIKQkNWAQAgAAAEQgYZZJBRSCGFFGKIKaeccgoqqIDQkFUAACAAgAAAAABP8hzRER3RER3RER3RER3R8RzPESVREiVREi3TMjXTU0VVdWXXlnVZt31b2IVd933d933d+HVhWJZlWZZlWZZlWZZlWZZlWZYgNGQVAAACAAAghBBCSCGFFFJIKcYYc8w56CSUEAgNWQUAAAIACAAAAHAUR3EcyZEcSbIkS9IkzdIsT/M0TxM9URRF0zRV0RVdUTdtUTZl0zVdUzZdVVZtV5ZtW7Z125dl2/d93/d93/d93/d93/d9XQdCQ1YBABIAADqSIymSIimS4ziOJElAaMgqAEAGAEAAAIriKI7jOJIkSZIlaZJneZaomZrpmZ4qqkBoyCoAABAAQAAAAAAAAIqmeIqpeIqoeI7oiJJomZaoqZoryqbsuq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq4LhIasAgAkAAB0JEdyJEdSJEVSJEdygNCQVQCADACAAAAcwzEkRXIsy9I0T/M0TxM90RM901NFV3SB0JBVAAAgAIAAAAAAAAAMybAUy9EcTRIl1VItVVMt1VJF1VNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVN0zRNEwgNWQkAkAEAkBBTLS3GmgmLJGLSaqugYwxS7KWxSCpntbfKMYUYtV4ah5RREHupJGOKQcwtpNApJq3WVEKFFKSYYyoVUg5SIDRkhQAQmgHgcBxAsixAsiwAAAAAAAAAkDQN0DwPsDQPAAAAAAAAACRNAyxPAzTPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA0jRA8zxA8zwAAAAAAAAA0DwP8DwR8EQRAAAAAAAAACzPAzTRAzxRBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA0jRA8zxA8zwAAAAAAAAAsDwP8EQR0DwRAAAAAAAAACzPAzxRBDzRAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEOAAABBgIRQasiIAiBMAcEgSJAmSBM0DSJYFTYOmwTQBkmVB06BpME0AAAAAAAAAAAAAJE2DpkHTIIoASdOgadA0iCIAAAAAAAAAAAAAkqZB06BpEEWApGnQNGgaRBEAAAAAAAAAAAAAzzQhihBFmCbAM02IIkQRpgkAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAGHAAAAgwoQwUGrIiAIgTAHA4imUBAIDjOJYFAACO41gWAABYliWKAABgWZooAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAYcAAACDChDBQashIAiAIAcCiKZQHHsSzgOJYFJMmyAJYF0DyApgFEEQAIAAAocAAACLBBU2JxgEJDVgIAUQAABsWxLE0TRZKkaZoniiRJ0zxPFGma53meacLzPM80IYqiaJoQRVE0TZimaaoqME1VFQAAUOAAABBgg6bE4gCFhqwEAEICAByKYlma5nmeJ4qmqZokSdM8TxRF0TRNU1VJkqZ5niiKommapqqyLE3zPFEURdNUVVWFpnmeKIqiaaqq6sLzPE8URdE0VdV14XmeJ4qiaJqq6roQRVE0TdNUTVV1XSCKpmmaqqqqrgtETxRNU1Vd13WB54miaaqqq7ouEE3TVFVVdV1ZBpimaaqq68oyQFVV1XVdV5YBqqqqruu6sgxQVdd1XVmWZQCu67qyLMsCAAAOHAAAAoygk4wqi7DRhAsPQKEhKwKAKAAAwBimFFPKMCYhpBAaxiSEFEImJaXSUqogpFJSKRWEVEoqJaOUUmopVRBSKamUCkIqJZVSAADYgQMA2IGFUGjISgAgDwCAMEYpxhhzTiKkFGPOOScRUoox55yTSjHmnHPOSSkZc8w556SUzjnnnHNSSuacc845KaVzzjnnnJRSSuecc05KKSWEzkEnpZTSOeecEwAAVOAAABBgo8jmBCNBhYasBABSAQAMjmNZmuZ5omialiRpmud5niiapiZJmuZ5nieKqsnzPE8URdE0VZXneZ4oiqJpqirXFUXTNE1VVV2yLIqmaZqq6rowTdNUVdd1XZimaaqq67oubFtVVdV1ZRm2raqq6rqyDFzXdWXZloEsu67s2rIAAPAEBwCgAhtWRzgpGgssNGQlAJABAEAYg5BCCCFlEEIKIYSUUggJAAAYcAAACDChDBQashIASAUAAIyx1lprrbXWQGettdZaa62AzFprrbXWWmuttdZaa6211lJrrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmstpZRSSimllFJKKaWUUkoppZRSSgUA+lU4APg/2LA6wknRWGChISsBgHAAAMAYpRhzDEIppVQIMeacdFRai7FCiDHnJKTUWmzFc85BKCGV1mIsnnMOQikpxVZjUSmEUlJKLbZYi0qho5JSSq3VWIwxqaTWWoutxmKMSSm01FqLMRYjbE2ptdhqq7EYY2sqLbQYY4zFCF9kbC2m2moNxggjWywt1VprMMYY3VuLpbaaizE++NpSLDHWXAAAd4MDAESCjTOsJJ0VjgYXGrISAAgJACAQUooxxhhzzjnnpFKMOeaccw5CCKFUijHGnHMOQgghlIwx5pxzEEIIIYRSSsaccxBCCCGEkFLqnHMQQgghhBBKKZ1zDkIIIYQQQimlgxBCCCGEEEoopaQUQgghhBBCCKmklEIIIYRSQighlZRSCCGEEEIpJaSUUgohhFJCCKGElFJKKYUQQgillJJSSimlEkoJJYQSUikppRRKCCGUUkpKKaVUSgmhhBJKKSWllFJKIYQQSikFAAAcOAAABBhBJxlVFmGjCRcegEJDVgIAZAAAkKKUUiktRYIipRikGEtGFXNQWoqocgxSzalSziDmJJaIMYSUk1Qy5hRCDELqHHVMKQYtlRhCxhik2HJLoXMOAAAAQQCAgJAAAAMEBTMAwOAA4XMQdAIERxsAgCBEZohEw0JweFAJEBFTAUBigkIuAFRYXKRdXECXAS7o4q4DIQQhCEEsDqCABByccMMTb3jCDU7QKSp1IAAAAAAADADwAACQXAAREdHMYWRobHB0eHyAhIiMkAgAAAAAABcAfAAAJCVAREQ0cxgZGhscHR4fICEiIyQBAIAAAgAAAAAggAAEBAQAAAAAAAIAAAAEBB9DtnUBAAAAAAAEPueBAKOFggAAgACjzoEAA4BwBwCdASqwAJAAAEcIhYWIhYSIAgIABhwJ7kPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99YAD+/6tQgKOFggADgAqjhYIAD4AOo4WCACSADqOZgQArADECAAEQEAAYABhYL/QACIBDmAYAAKOFggA6gA6jhYIAT4AOo5mBAFMAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCAGSADqOFggB6gA6jmYEAewAxAgABEBAAGAAYWC/0AAiAQ5gGAACjhYIAj4AOo5mBAKMAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCAKSADqOFggC6gA6jmYEAywAxAgABEBAAGAAYWC/0AAiAQ5gGAACjhYIAz4AOo4WCAOSADqOZgQDzADECAAEQEAAYABhYL/QACIBDmAYAAKOFggD6gA6jhYIBD4AOo5iBARsAEQIAARAQFGAAYWC/0AAiAQ5gGACjhYIBJIAOo4WCATqADqOZgQFDADECAAEQEAAYABhYL/QACIBDmAYAAKOFggFPgA6jhYIBZIAOo5mBAWsAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCAXqADqOFggGPgA6jmYEBkwAxAgABEBAAGAAYWC/0AAiAQ5gGAACjhYIBpIAOo4WCAbqADqOZgQG7ADECAAEQEAAYABhYL/QACIBDmAYAAKOFggHPgA6jmYEB4wAxAgABEBAAGAAYWC/0AAiAQ5gGAACjhYIB5IAOo4WCAfqADqOZgQILADECAAEQEAAYABhYL/QACIBDmAYAAKOFggIPgA6jhYICJIAOo5mBAjMAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCAjqADqOFggJPgA6jmYECWwAxAgABEBAAGAAYWC/0AAiAQ5gGAACjhYICZIAOo4WCAnqADqOZgQKDADECAAEQEAAYABhYL/QACIBDmAYAAKOFggKPgA6jhYICpIAOo5mBAqsAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCArqADqOFggLPgA6jmIEC0wARAgABEBAUYABhYL/QACIBDmAYAKOFggLkgA6jhYIC+oAOo5mBAvsAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCAw+ADqOZgQMjADECAAEQEAAYABhYL/QACIBDmAYAAKOFggMkgA6jhYIDOoAOo5mBA0sAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCA0+ADqOFggNkgA6jmYEDcwAxAgABEBAAGAAYWC/0AAiAQ5gGAACjhYIDeoAOo4WCA4+ADqOZgQObADECAAEQEAAYABhYL/QACIBDmAYAAKOFggOkgA6jhYIDuoAOo5mBA8MAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCA8+ADqOFggPkgA6jhYID+oAOo4WCBA+ADhxTu2sBAAAAAAAAEbuPs4EDt4r3gQHxghEr8IEK",mp4:"data:video/mp4;base64,AAAAHGZ0eXBNNFYgAAACAGlzb21pc28yYXZjMQAAAAhmcmVlAAAGF21kYXTeBAAAbGliZmFhYyAxLjI4AABCAJMgBDIARwAAArEGBf//rdxF6b3m2Ui3lizYINkj7u94MjY0IC0gY29yZSAxNDIgcjIgOTU2YzhkOCAtIEguMjY0L01QRUctNCBBVkMgY29kZWMgLSBDb3B5bGVmdCAyMDAzLTIwMTQgLSBodHRwOi8vd3d3LnZpZGVvbGFuLm9yZy94MjY0Lmh0bWwgLSBvcHRpb25zOiBjYWJhYz0wIHJlZj0zIGRlYmxvY2s9MTowOjAgYW5hbHlzZT0weDE6MHgxMTEgbWU9aGV4IHN1Ym1lPTcgcHN5PTEgcHN5X3JkPTEuMDA6MC4wMCBtaXhlZF9yZWY9MSBtZV9yYW5nZT0xNiBjaHJvbWFfbWU9MSB0cmVsbGlzPTEgOHg4ZGN0PTAgY3FtPTAgZGVhZHpvbmU9MjEsMTEgZmFzdF9wc2tpcD0xIGNocm9tYV9xcF9vZmZzZXQ9LTIgdGhyZWFkcz02IGxvb2thaGVhZF90aHJlYWRzPTEgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MCB3ZWlnaHRwPTAga2V5aW50PTI1MCBrZXlpbnRfbWluPTI1IHNjZW5lY3V0PTQwIGludHJhX3JlZnJlc2g9MCByY19sb29rYWhlYWQ9NDAgcmM9Y3JmIG1idHJlZT0xIGNyZj0yMy4wIHFjb21wPTAuNjAgcXBtaW49MCBxcG1heD02OSBxcHN0ZXA9NCB2YnZfbWF4cmF0ZT03NjggdmJ2X2J1ZnNpemU9MzAwMCBjcmZfbWF4PTAuMCBuYWxfaHJkPW5vbmUgZmlsbGVyPTAgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAAAFZliIQL8mKAAKvMnJycnJycnJycnXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXiEASZACGQAjgCEASZACGQAjgAAAAAdBmjgX4GSAIQBJkAIZACOAAAAAB0GaVAX4GSAhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZpgL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGagC/AySEASZACGQAjgAAAAAZBmqAvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZrAL8DJIQBJkAIZACOAAAAABkGa4C/AySEASZACGQAjgCEASZACGQAjgAAAAAZBmwAvwMkhAEmQAhkAI4AAAAAGQZsgL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGbQC/AySEASZACGQAjgCEASZACGQAjgAAAAAZBm2AvwMkhAEmQAhkAI4AAAAAGQZuAL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGboC/AySEASZACGQAjgAAAAAZBm8AvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZvgL8DJIQBJkAIZACOAAAAABkGaAC/AySEASZACGQAjgCEASZACGQAjgAAAAAZBmiAvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZpAL8DJIQBJkAIZACOAAAAABkGaYC/AySEASZACGQAjgCEASZACGQAjgAAAAAZBmoAvwMkhAEmQAhkAI4AAAAAGQZqgL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGawC/AySEASZACGQAjgAAAAAZBmuAvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZsAL8DJIQBJkAIZACOAAAAABkGbIC/AySEASZACGQAjgCEASZACGQAjgAAAAAZBm0AvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZtgL8DJIQBJkAIZACOAAAAABkGbgCvAySEASZACGQAjgCEASZACGQAjgAAAAAZBm6AnwMkhAEmQAhkAI4AhAEmQAhkAI4AhAEmQAhkAI4AhAEmQAhkAI4AAAAhubW9vdgAAAGxtdmhkAAAAAAAAAAAAAAAAAAAD6AAABDcAAQAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAzB0cmFrAAAAXHRraGQAAAADAAAAAAAAAAAAAAABAAAAAAAAA+kAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAALAAAACQAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAPpAAAAAAABAAAAAAKobWRpYQAAACBtZGhkAAAAAAAAAAAAAAAAAAB1MAAAdU5VxAAAAAAALWhkbHIAAAAAAAAAAHZpZGUAAAAAAAAAAAAAAABWaWRlb0hhbmRsZXIAAAACU21pbmYAAAAUdm1oZAAAAAEAAAAAAAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAhNzdGJsAAAAr3N0c2QAAAAAAAAAAQAAAJ9hdmMxAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAALAAkABIAAAASAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGP//AAAALWF2Y0MBQsAN/+EAFWdCwA3ZAsTsBEAAAPpAADqYA8UKkgEABWjLg8sgAAAAHHV1aWRraEDyXyRPxbo5pRvPAyPzAAAAAAAAABhzdHRzAAAAAAAAAAEAAAAeAAAD6QAAABRzdHNzAAAAAAAAAAEAAAABAAAAHHN0c2MAAAAAAAAAAQAAAAEAAAABAAAAAQAAAIxzdHN6AAAAAAAAAAAAAAAeAAADDwAAAAsAAAALAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAAiHN0Y28AAAAAAAAAHgAAAEYAAANnAAADewAAA5gAAAO0AAADxwAAA+MAAAP2AAAEEgAABCUAAARBAAAEXQAABHAAAASMAAAEnwAABLsAAATOAAAE6gAABQYAAAUZAAAFNQAABUgAAAVkAAAFdwAABZMAAAWmAAAFwgAABd4AAAXxAAAGDQAABGh0cmFrAAAAXHRraGQAAAADAAAAAAAAAAAAAAACAAAAAAAABDcAAAAAAAAAAAAAAAEBAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAQkAAADcAABAAAAAAPgbWRpYQAAACBtZGhkAAAAAAAAAAAAAAAAAAC7gAAAykBVxAAAAAAALWhkbHIAAAAAAAAAAHNvdW4AAAAAAAAAAAAAAABTb3VuZEhhbmRsZXIAAAADi21pbmYAAAAQc21oZAAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAADT3N0YmwAAABnc3RzZAAAAAAAAAABAAAAV21wNGEAAAAAAAAAAQAAAAAAAAAAAAIAEAAAAAC7gAAAAAAAM2VzZHMAAAAAA4CAgCIAAgAEgICAFEAVBbjYAAu4AAAADcoFgICAAhGQBoCAgAECAAAAIHN0dHMAAAAAAAAAAgAAADIAAAQAAAAAAQAAAkAAAAFUc3RzYwAAAAAAAAAbAAAAAQAAAAEAAAABAAAAAgAAAAIAAAABAAAAAwAAAAEAAAABAAAABAAAAAIAAAABAAAABgAAAAEAAAABAAAABwAAAAIAAAABAAAACAAAAAEAAAABAAAACQAAAAIAAAABAAAACgAAAAEAAAABAAAACwAAAAIAAAABAAAADQAAAAEAAAABAAAADgAAAAIAAAABAAAADwAAAAEAAAABAAAAEAAAAAIAAAABAAAAEQAAAAEAAAABAAAAEgAAAAIAAAABAAAAFAAAAAEAAAABAAAAFQAAAAIAAAABAAAAFgAAAAEAAAABAAAAFwAAAAIAAAABAAAAGAAAAAEAAAABAAAAGQAAAAIAAAABAAAAGgAAAAEAAAABAAAAGwAAAAIAAAABAAAAHQAAAAEAAAABAAAAHgAAAAIAAAABAAAAHwAAAAQAAAABAAAA4HN0c3oAAAAAAAAAAAAAADMAAAAaAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAACMc3RjbwAAAAAAAAAfAAAALAAAA1UAAANyAAADhgAAA6IAAAO+AAAD0QAAA+0AAAQAAAAEHAAABC8AAARLAAAEZwAABHoAAASWAAAEqQAABMUAAATYAAAE9AAABRAAAAUjAAAFPwAABVIAAAVuAAAFgQAABZ0AAAWwAAAFzAAABegAAAX7AAAGFwAAAGJ1ZHRhAAAAWm1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAALWlsc3QAAAAlqXRvbwAAAB1kYXRhAAAAAQAAAABMYXZmNTUuMzMuMTAw"}});var ISe=Ic((MCo,XSe)=>{var NCo=T(S()),{webm:eSt,mp4:tSt}=ESe(),p6=()=>typeof navigator<"u"&&parseFloat((""+(/CPU.*OS ([0-9_]{3,4})[0-9_]{0,1}|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent)||[0,""])[1]).replace("undefined","3_2").replace("_",".").replace("_",""))<10&&!window.MSStream,b6=()=>"wakeLock"in navigator,g6=class{constructor(){if(this.enabled=!1,b6()){this._wakeLock=null;let t=()=>{this._wakeLock!==null&&document.visibilityState==="visible"&&this.enable()};document.addEventListener("visibilitychange",t),document.addEventListener("fullscreenchange",t)}else p6()?this.noSleepTimer=null:(this.noSleepVideo=document.createElement("video"),this.noSleepVideo.setAttribute("title","No Sleep"),this.noSleepVideo.setAttribute("playsinline",""),this._addSourceToVideo(this.noSleepVideo,"webm",eSt),this._addSourceToVideo(this.noSleepVideo,"mp4",tSt),this.noSleepVideo.addEventListener("loadedmetadata",()=>{this.noSleepVideo.duration<=1?this.noSleepVideo.setAttribute("loop",""):this.noSleepVideo.addEventListener("timeupdate",()=>{this.noSleepVideo.currentTime>.5&&(this.noSleepVideo.currentTime=Math.random())})}))}_addSourceToVideo(t,n,i){var o=document.createElement("source");o.src=i,o.type=`video/${n}`,t.appendChild(o)}get isEnabled(){return this.enabled}enable(){return b6()?navigator.wakeLock.request("screen").then(t=>{this._wakeLock=t,this.enabled=!0,console.log("Wake Lock active."),this._wakeLock.addEventListener("release",()=>{console.log("Wake Lock released.")})}).catch(t=>{throw this.enabled=!1,console.error(`${t.name}, ${t.message}`),t}):p6()?(this.disable(),console.warn(` NoSleep enabled for older iOS devices. This can interrupt active or long-running network requests from completing successfully. See https://github.com/richtr/NoSleep.js/issues/15 for more details. `),this.noSleepTimer=window.setInterval(()=>{document.hidden||(window.location.href=window.location.href.split("#")[0],window.setTimeout(window.stop,0))},15e3),this.enabled=!0,Promise.resolve()):this.noSleepVideo.play().then(n=>(this.enabled=!0,n)).catch(n=>{throw this.enabled=!1,n})}disable(){b6()?(this._wakeLock&&this._wakeLock.release(),this._wakeLock=null):p6()?this.noSleepTimer&&(console.warn(` NoSleep now disabled for older iOS devices. `),window.clearInterval(this.noSleepTimer),this.noSleepTimer=null):this.noSleepVideo.pause(),this.enabled=!1}};XSe.exports=g6});var RSt={};eCe(RSt,{AlphaMode:()=>pf,AlphaPipelineStage:()=>DW,Animation:()=>LA,AnimationViewModel:()=>RA,Appearance:()=>eo,ApproximateTerrainHeights:()=>ci,ArcGISTiledElevationTerrainProvider:()=>MY,ArcGisBaseMapType:()=>Ch,ArcGisMapServerImageryProvider:()=>J0,ArcGisMapService:()=>Od,ArcType:()=>qt,ArticulationStageType:()=>ja,AssociativeArray:()=>Vt,Atmosphere:()=>sF,AtmospherePipelineStage:()=>SW,AttributeCompression:()=>wn,AttributeType:()=>nn,AutoExposure:()=>qF,AutomaticUniforms:()=>Ap,Axis:()=>Eo,AxisAlignedBoundingBox:()=>Lb,B3dmLoader:()=>iW,B3dmParser:()=>eW,BaseLayerPicker:()=>GA,BaseLayerPickerViewModel:()=>ZA,BatchTable:()=>qx,BatchTableHierarchy:()=>x_,BatchTexture:()=>zc,BatchTexturePipelineStage:()=>BW,Billboard:()=>mo,BillboardCollection:()=>Rd,BillboardGraphics:()=>rc,BillboardVisualizer:()=>CZ,BingMapsGeocoderService:()=>kY,BingMapsImageryProvider:()=>vw,BingMapsStyle:()=>NV,BlendEquation:()=>Ra,BlendFunction:()=>_o,BlendOption:()=>So,BlendingState:()=>un,BoundingRectangle:()=>He,BoundingSphere:()=>le,BoundingSphereState:()=>mt,BoundingVolumeSemantics:()=>v_,BoxEmitter:()=>j8,BoxGeometry:()=>yl,BoxGeometryUpdater:()=>sI,BoxGraphics:()=>r_,BoxOutlineGeometry:()=>gm,BrdfLutGenerator:()=>cF,Buffer:()=>ft,BufferLoader:()=>V_,BufferUsage:()=>Ne,CPUStylingPipelineStage:()=>zW,CallbackProperty:()=>Fm,Camera:()=>ao,CameraEventAggregator:()=>r9,CameraEventType:()=>Ei,CameraFlightPath:()=>dF,Cartesian2:()=>D,Cartesian3:()=>h,Cartesian4:()=>se,Cartographic:()=>he,CartographicGeocoderService:()=>YY,CatmullRomSpline:()=>OY,Cesium3DContentGroup:()=>y_,Cesium3DTile:()=>Uu,Cesium3DTileBatchTable:()=>jp,Cesium3DTileColorBlendMode:()=>Il,Cesium3DTileContent:()=>q8,Cesium3DTileContentFactory:()=>j_,Cesium3DTileContentState:()=>Ao,Cesium3DTileContentType:()=>_s,Cesium3DTileFeature:()=>vs,Cesium3DTileFeatureTable:()=>zm,Cesium3DTileOptimizationHint:()=>Au,Cesium3DTileOptimizations:()=>SP,Cesium3DTilePass:()=>Io,Cesium3DTilePassState:()=>tm,Cesium3DTilePointFeature:()=>x0,Cesium3DTileRefine:()=>vo,Cesium3DTileStyle:()=>iS,Cesium3DTileStyleEngine:()=>RP,Cesium3DTilesInspector:()=>AA,Cesium3DTilesInspectorViewModel:()=>FA,Cesium3DTilesVoxelProvider:()=>$8,Cesium3DTileset:()=>sa,Cesium3DTilesetBaseTraversal:()=>IP,Cesium3DTilesetCache:()=>CP,Cesium3DTilesetGraphics:()=>m_,Cesium3DTilesetHeatmap:()=>VP,Cesium3DTilesetMetadata:()=>oT,Cesium3DTilesetMostDetailedTraversal:()=>GP,Cesium3DTilesetSkipTraversal:()=>vP,Cesium3DTilesetStatistics:()=>X0,Cesium3DTilesetTraversal:()=>ks,Cesium3DTilesetVisualizer:()=>wP,CesiumInspector:()=>PA,CesiumInspectorViewModel:()=>WA,CesiumTerrainProvider:()=>rx,CesiumWidget:()=>B9,Check:()=>po,CheckerboardMaterialProperty:()=>w1,CircleEmitter:()=>K9,CircleGeometry:()=>bO,CircleOutlineGeometry:()=>gO,ClassificationModelDrawCommand:()=>bW,ClassificationPipelineStage:()=>YW,ClassificationPrimitive:()=>UC,ClassificationType:()=>Un,ClearCommand:()=>oi,ClippingPlane:()=>w_,ClippingPlaneCollection:()=>ss,ClippingPolygon:()=>l1,ClippingPolygonCollection:()=>Ym,Clock:()=>Sm,ClockRange:()=>Cr,ClockStep:()=>co,ClockViewModel:()=>TA,CloudCollection:()=>r7,CloudType:()=>hL,Color:()=>Y,ColorBlendMode:()=>hc,ColorGeometryInstanceAttribute:()=>Ht,ColorMaterialProperty:()=>Ut,Command:()=>t6,ComponentDatatype:()=>Q,Composite3DTileContent:()=>mI,CompositeEntityCollection:()=>YJ,CompositeMaterialProperty:()=>A1,CompositePositionProperty:()=>aa,CompositeProperty:()=>gc,CompressedTextureBuffer:()=>oR,ComputeCommand:()=>Xl,ComputeEngine:()=>nw,ConditionsExpression:()=>Y9,ConeEmitter:()=>a7,ConstantPositionProperty:()=>Oc,ConstantProperty:()=>Jn,ConstantSpline:()=>rR,ContentMetadata:()=>pP,Context:()=>aw,ContextLimits:()=>Mt,CoplanarPolygonGeometry:()=>uR,CoplanarPolygonGeometryLibrary:()=>bp,CoplanarPolygonOutlineGeometry:()=>lu,CornerType:()=>Vi,CorridorGeometry:()=>yx,CorridorGeometryLibrary:()=>Pi,CorridorGeometryUpdater:()=>AP,CorridorGraphics:()=>a_,CorridorOutlineGeometry:()=>xR,Credit:()=>Ct,CreditDisplay:()=>fF,CubeMap:()=>sc,CubeMapFace:()=>sf,CubicRealPolynomial:()=>$y,CullFace:()=>bi,CullingVolume:()=>rs,CumulusCloud:()=>qd,CustomDataSource:()=>BP,CustomHeightmapTerrainProvider:()=>UO,CustomShader:()=>$T,CustomShaderMode:()=>b0,CustomShaderPipelineStage:()=>e2,CustomShaderTranslucencyMode:()=>vg,CylinderGeometry:()=>TR,CylinderGeometryLibrary:()=>xx,CylinderGeometryUpdater:()=>YP,CylinderGraphics:()=>c_,CylinderOutlineGeometry:()=>SR,CzmlDataSource:()=>jP,DataSource:()=>vr,DataSourceClock:()=>rh,DataSourceCollection:()=>qP,DataSourceDisplay:()=>_v,DebugAppearance:()=>c7,DebugCameraPrimitive:()=>Df,DebugInspector:()=>h9,DebugModelMatrixPrimitive:()=>Q9,DefaultProxy:()=>OO,DepthFunction:()=>cc,DepthPlane:()=>gF,DequantizationPipelineStage:()=>n2,DerivedCommand:()=>eb,DeveloperError:()=>fe,DeviceOrientationCameraController:()=>xF,DirectionalLight:()=>l7,DiscardEmptyTileImagePolicy:()=>kV,DiscardMissingTileImagePolicy:()=>Ww,DistanceDisplayCondition:()=>Wt,DistanceDisplayConditionGeometryInstanceAttribute:()=>kn,DoubleEndedPriorityQueue:()=>Tx,DoublyLinkedList:()=>RR,DracoLoader:()=>i0,DrawCommand:()=>et,DynamicAtmosphereLightingType:()=>WT,DynamicGeometryBatch:()=>fT,DynamicGeometryUpdater:()=>ni,EarthOrientationParameters:()=>UL,EarthOrientationParametersSample:()=>gb,EasingFunction:()=>Lr,EllipseGeometry:()=>Mc,EllipseGeometryLibrary:()=>Tl,EllipseGeometryUpdater:()=>ev,EllipseGraphics:()=>l_,EllipseOutlineGeometry:()=>ad,Ellipsoid:()=>ie,EllipsoidGeodesic:()=>xp,EllipsoidGeometry:()=>Xs,EllipsoidGeometryUpdater:()=>nv,EllipsoidGraphics:()=>d_,EllipsoidOutlineGeometry:()=>dd,EllipsoidPrimitive:()=>nF,EllipsoidRhumbLine:()=>Ca,EllipsoidSurfaceAppearance:()=>d7,EllipsoidTangentPlane:()=>Ur,EllipsoidTerrainProvider:()=>qh,EllipsoidalOccluder:()=>lp,Empty3DTileContent:()=>R1,EncodedCartesian3:()=>Bn,Entity:()=>Jo,EntityCluster:()=>Ed,EntityCollection:()=>Us,EntityView:()=>Sv,Event:()=>ge,EventHelper:()=>Rr,Expression:()=>Ru,ExpressionNodeType:()=>gt,ExtrapolationType:()=>ud,FeatureDetection:()=>Yt,FeatureIdPipelineStage:()=>Pg,Fog:()=>_F,ForEach:()=>Ie,FrameRateMonitor:()=>$9,FrameState:()=>TF,Framebuffer:()=>ia,FramebufferManager:()=>ui,FrustumCommands:()=>LF,FrustumGeometry:()=>Cx,FrustumOutlineGeometry:()=>XR,Fullscreen:()=>ur,FullscreenButton:()=>NA,FullscreenButtonViewModel:()=>MA,GeoJsonDataSource:()=>Cv,GeoJsonLoader:()=>oW,GeocodeType:()=>Hb,Geocoder:()=>UA,GeocoderService:()=>bC,GeocoderViewModel:()=>kA,GeographicProjection:()=>Si,GeographicTilingScheme:()=>Ai,Geometry:()=>ut,Geometry3DTileContent:()=>fI,GeometryAttribute:()=>Ge,GeometryAttributes:()=>mn,GeometryFactory:()=>eH,GeometryInstance:()=>St,GeometryInstanceAttribute:()=>$a,GeometryOffsetAttribute:()=>ln,GeometryPipeline:()=>An,GeometryPipelineStage:()=>s2,GeometryType:()=>su,GeometryUpdater:()=>ii,GeometryUpdaterSet:()=>gT,GeometryVisualizer:()=>lv,GetFeatureInfoFormat:()=>ET,Globe:()=>tF,GlobeDepth:()=>RF,GlobeSurfaceShaderSet:()=>Iw,GlobeSurfaceTile:()=>qu,GlobeSurfaceTileProvider:()=>Ow,GlobeTranslucency:()=>Hw,GlobeTranslucencyFramebuffer:()=>ZF,GlobeTranslucencyState:()=>SF,GltfBufferViewLoader:()=>jC,GltfDracoLoader:()=>qC,GltfImageLoader:()=>$C,GltfIndexBufferLoader:()=>e1,GltfJsonLoader:()=>n1,GltfLoader:()=>a0,GltfLoaderUtil:()=>wl,GltfStructuralMetadataLoader:()=>KI,GltfTextureLoader:()=>i1,GltfVertexBufferLoader:()=>o1,GoogleEarthEnterpriseImageryProvider:()=>m7,GoogleEarthEnterpriseMapsProvider:()=>Aw,GoogleEarthEnterpriseMetadata:()=>Rp,GoogleEarthEnterpriseTerrainData:()=>gC,GoogleEarthEnterpriseTerrainProvider:()=>cH,GoogleEarthEnterpriseTileInformation:()=>IR,GoogleMaps:()=>Lx,GpxDataSource:()=>Zv,GregorianDate:()=>op,GridImageryProvider:()=>h7,GridMaterialProperty:()=>D1,GroundGeometryUpdater:()=>On,GroundPolylineGeometry:()=>Rx,GroundPolylinePrimitive:()=>Wm,GroundPrimitive:()=>Yc,GroupMetadata:()=>W1,HeadingPitchRange:()=>fu,HeadingPitchRoll:()=>za,Heap:()=>AL,HeightReference:()=>Je,HeightmapEncoding:()=>iu,HeightmapTerrainData:()=>Ta,HeightmapTessellator:()=>AS,HermitePolynomialApproximation:()=>PR,HermiteSpline:()=>Xb,HilbertOrder:()=>yC,HomeButton:()=>BA,HomeButtonViewModel:()=>DA,HorizontalOrigin:()=>pi,I3SBuildingSceneLayerExplorer:()=>d6,I3SBuildingSceneLayerExplorerViewModel:()=>YA,I3SDataProvider:()=>Wh,I3SDecoder:()=>eA,I3SFeature:()=>tA,I3SField:()=>nA,I3SGeometry:()=>fL,I3SLayer:()=>cS,I3SNode:()=>pL,I3SStatistics:()=>rA,I3SSublayer:()=>aA,I3SSymbology:()=>oA,I3dmLoader:()=>sW,I3dmParser:()=>rW,Iau2000Orientation:()=>wR,Iau2006XysData:()=>DL,Iau2006XysSample:()=>jy,IauOrientationAxes:()=>FR,IauOrientationParameters:()=>vR,ImageBasedLighting:()=>g_,ImageBasedLightingPipelineStage:()=>VW,ImageMaterialProperty:()=>fg,Imagery:()=>HV,ImageryLayer:()=>ma,ImageryLayerCollection:()=>zw,ImageryLayerFeatureInfo:()=>Sh,ImageryProvider:()=>rl,ImageryState:()=>ai,Implicit3DTileContent:()=>a1,ImplicitAvailabilityBitstream:()=>JC,ImplicitMetadataView:()=>QC,ImplicitSubdivisionScheme:()=>Hr,ImplicitSubtree:()=>W_,ImplicitSubtreeCache:()=>H9,ImplicitSubtreeMetadata:()=>pI,ImplicitTileCoordinates:()=>aT,ImplicitTileset:()=>sT,IndexDatatype:()=>Me,InfoBox:()=>HA,InfoBoxViewModel:()=>OA,InspectorShared:()=>Ma,InstanceAttributeSemantic:()=>Kr,InstancingPipelineStage:()=>MW,InterpolationAlgorithm:()=>TH,InterpolationType:()=>Zm,Intersect:()=>Kt,IntersectionTests:()=>jn,Intersections2D:()=>up,Interval:()=>_a,InvertClassification:()=>eL,Ion:()=>ym,IonGeocoderService:()=>NR,IonImageryProvider:()=>Q0,IonResource:()=>sd,IonWorldImageryStyle:()=>j0,Iso8601:()=>Be,JobScheduler:()=>CF,JobType:()=>Ga,JsonMetadataTable:()=>s0,JulianDate:()=>te,KTX2Transcoder:()=>kR,KeyboardEventModifier:()=>qs,KeyframeNode:()=>Ki,KmlCamera:()=>Gv,KmlDataSource:()=>$v,KmlLookAt:()=>zv,KmlTour:()=>Kv,KmlTourFlyTo:()=>Jv,KmlTourWait:()=>Qv,Label:()=>kg,LabelCollection:()=>Tf,LabelGraphics:()=>Pm,LabelStyle:()=>Fo,LabelVisualizer:()=>dv,LagrangePolynomialApproximation:()=>UR,LeapSecond:()=>Fi,Light:()=>g7,LightingModel:()=>gf,LightingPipelineStage:()=>c2,LinearApproximation:()=>Zx,LinearSpline:()=>Eb,ManagedArray:()=>Bc,MapMode2D:()=>Ql,MapProjection:()=>RH,MapboxImageryProvider:()=>Mw,MapboxStyleImageryProvider:()=>y7,Material:()=>Mi,MaterialAppearance:()=>ro,MaterialPipelineStage:()=>d2,MaterialProperty:()=>Ko,Math:()=>W,Matrix2:()=>Qi,Matrix3:()=>$,Matrix4:()=>M,Megatexture:()=>sL,MetadataClass:()=>km,MetadataClassProperty:()=>yg,MetadataComponentType:()=>an,MetadataEntity:()=>Mn,MetadataEnum:()=>wI,MetadataEnumValue:()=>vI,MetadataPipelineStage:()=>Gu,MetadataSchema:()=>Um,MetadataSchemaLoader:()=>r1,MetadataSemantic:()=>P_,MetadataTable:()=>Pl,MetadataTableProperty:()=>gI,MetadataType:()=>zt,MipmapHint:()=>af,Model:()=>Qm,Model3DTileContent:()=>yf,ModelAlphaOptions:()=>G2,ModelAnimation:()=>cW,ModelAnimationChannel:()=>aW,ModelAnimationCollection:()=>lW,ModelAnimationLoop:()=>Al,ModelAnimationState:()=>Km,ModelArticulation:()=>RW,ModelArticulationStage:()=>LW,ModelClippingPlanesPipelineStage:()=>EW,ModelClippingPolygonsPipelineStage:()=>WW,ModelColorPipelineStage:()=>Wg,ModelComponents:()=>Tn,ModelDrawCommand:()=>gW,ModelFeature:()=>dW,ModelFeatureTable:()=>mW,ModelGraphics:()=>Op,ModelLightingOptions:()=>M2,ModelMatrixUpdateStage:()=>NW,ModelNode:()=>PW,ModelRenderResources:()=>I2,ModelRuntimeNode:()=>UW,ModelRuntimePrimitive:()=>R2,ModelSceneGraph:()=>k2,ModelSilhouettePipelineStage:()=>v2,ModelSkin:()=>Z2,ModelSplitterPipelineStage:()=>F2,ModelStatistics:()=>U2,ModelType:()=>rr,ModelUtility:()=>jt,ModelVisualizer:()=>uv,Moon:()=>oF,MorphTargetsPipelineStage:()=>m2,MorphWeightSpline:()=>ZH,MortonOrder:()=>Qb,Multiple3DTileContent:()=>yP,MultisampleFramebuffer:()=>QI,NavigationHelpButton:()=>KA,NavigationHelpButtonViewModel:()=>zA,NearFarScalar:()=>At,NeverTileDiscardPolicy:()=>_7,NodeRenderResources:()=>A2,NodeStatisticsPipelineStage:()=>kW,NodeTransformationProperty:()=>u_,OIT:()=>GF,Occluder:()=>BR,OctahedralProjectedCubeMap:()=>Am,OffsetGeometryInstanceAttribute:()=>Hi,OpenCageGeocoderService:()=>WH,OpenStreetMapImageryProvider:()=>mb,OrderedGroundPrimitiveCollection:()=>$P,OrientedBoundingBox:()=>Gn,OrthographicFrustum:()=>on,OrthographicOffCenterFrustum:()=>Zr,Packable:()=>PH,PackableForInterpolation:()=>vH,Particle:()=>yL,ParticleBurst:()=>S7,ParticleEmitter:()=>C7,ParticleSystem:()=>V7,Pass:()=>Re,PassState:()=>_c,PathGraphics:()=>Hp,PathVisualizer:()=>hv,PeliasGeocoderService:()=>MR,PerInstanceColorAppearance:()=>dn,PerformanceDisplay:()=>tb,PerformanceWatchdog:()=>QA,PerformanceWatchdogViewModel:()=>JA,PerspectiveFrustum:()=>yi,PerspectiveOffCenterFrustum:()=>Uc,PickDepth:()=>VF,PickDepthFramebuffer:()=>XF,PickFramebuffer:()=>WF,Picking:()=>vF,PickingPipelineStage:()=>h2,PinBuilder:()=>Ep,PixelDatatype:()=>ze,PixelFormat:()=>at,Plane:()=>cn,PlaneGeometry:()=>zR,PlaneGeometryUpdater:()=>iv,PlaneGraphics:()=>$X,PlaneOutlineGeometry:()=>KR,PntsLoader:()=>B2,PntsParser:()=>z_,PointCloud:()=>uA,PointCloudEyeDomeLighting:()=>c0,PointCloudShading:()=>bf,PointCloudStylingPipelineStage:()=>p2,PointGraphics:()=>h_,PointPrimitive:()=>Ds,PointPrimitiveCollection:()=>N1,PointVisualizer:()=>pv,PolygonGeometry:()=>Xp,PolygonGeometryLibrary:()=>Nn,PolygonGeometryUpdater:()=>ov,PolygonGraphics:()=>vm,PolygonHierarchy:()=>Va,PolygonOutlineGeometry:()=>JR,PolygonPipeline:()=>ei,Polyline:()=>vu,PolylineArrowMaterialProperty:()=>Y1,PolylineCollection:()=>qm,PolylineColorAppearance:()=>Or,PolylineDashMaterialProperty:()=>H1,PolylineGeometry:()=>Ip,PolylineGeometryUpdater:()=>gv,PolylineGlowMaterialProperty:()=>K1,PolylineGraphics:()=>lc,PolylineMaterialAppearance:()=>ea,PolylineOutlineMaterialProperty:()=>Qg,PolylinePipeline:()=>Li,PolylineVisualizer:()=>xv,PolylineVolumeGeometry:()=>$R,PolylineVolumeGeometryLibrary:()=>Cm,PolylineVolumeGeometryUpdater:()=>rv,PolylineVolumeGraphics:()=>f_,PolylineVolumeOutlineGeometry:()=>nZ,PositionProperty:()=>Bp,PositionPropertyArray:()=>v0,PostProcessStage:()=>fo,PostProcessStageCollection:()=>n9,PostProcessStageComposite:()=>al,PostProcessStageLibrary:()=>im,PostProcessStageSampleMode:()=>Kd,PostProcessStageTextureCache:()=>YT,Primitive:()=>En,PrimitiveCollection:()=>Ul,PrimitiveLoadPlan:()=>k_,PrimitiveOutlineGenerator:()=>N_,PrimitiveOutlinePipelineStage:()=>y2,PrimitivePipeline:()=>$x,PrimitiveRenderResources:()=>N2,PrimitiveState:()=>pr,PrimitiveStatisticsPipelineStage:()=>x2,PrimitiveType:()=>Fe,ProjectionPicker:()=>qA,ProjectionPickerViewModel:()=>jA,Property:()=>K,PropertyArray:()=>Q1,PropertyAttribute:()=>M_,PropertyAttributeProperty:()=>YI,PropertyBag:()=>El,PropertyTable:()=>Jc,PropertyTexture:()=>A_,PropertyTextureProperty:()=>BI,ProviderViewModel:()=>qr,Proxy:()=>FH,QuadraticRealPolynomial:()=>vc,QuadtreeOccluders:()=>Kw,QuadtreePrimitive:()=>eF,QuadtreeTile:()=>Jw,QuadtreeTileLoadState:()=>Os,QuadtreeTileProvider:()=>X7,QuantizedMeshTerrainData:()=>ox,QuarticRealPolynomial:()=>JL,Quaternion:()=>we,QuaternionSpline:()=>iZ,Queue:()=>Ab,Ray:()=>pn,Rectangle:()=>ce,RectangleCollisionChecker:()=>Px,RectangleGeometry:()=>vx,RectangleGeometryLibrary:()=>fs,RectangleGeometryUpdater:()=>sv,RectangleGraphics:()=>wm,RectangleOutlineGeometry:()=>wx,ReferenceFrame:()=>$i,ReferenceProperty:()=>w0,RenderState:()=>De,Renderbuffer:()=>Vd,RenderbufferFormat:()=>jc,Request:()=>Yo,RequestErrorEvent:()=>Mh,RequestScheduler:()=>Oa,RequestState:()=>Qn,RequestType:()=>ns,Resource:()=>Ee,ResourceCache:()=>Ni,ResourceCacheKey:()=>Fl,ResourceCacheStatistics:()=>MI,ResourceLoader:()=>to,ResourceLoaderState:()=>Xt,Rotation:()=>Yu,RuntimeError:()=>ue,S2Cell:()=>Wp,SDFSettings:()=>Ms,SampledPositionProperty:()=>ca,SampledProperty:()=>Wd,Sampler:()=>sn,ScaledPositionProperty:()=>Gf,Scene:()=>A9,SceneFramebuffer:()=>AT,SceneMode:()=>oe,SceneMode2DPipelineStage:()=>_2,SceneModePicker:()=>eM,SceneModePickerViewModel:()=>$A,SceneTransforms:()=>ki,SceneTransitioner:()=>o9,ScreenSpaceCameraController:()=>c9,ScreenSpaceEventHandler:()=>fd,ScreenSpaceEventType:()=>yn,SelectedFeatureIdPipelineStage:()=>wg,SelectionIndicator:()=>iM,SelectionIndicatorViewModel:()=>nM,SensorVolumePortionToDisplay:()=>eV,ShaderBuilder:()=>O_,ShaderCache:()=>iw,ShaderDestination:()=>xe,ShaderFunction:()=>X2,ShaderProgram:()=>$t,ShaderSource:()=>Ye,ShaderStruct:()=>E2,ShadowMap:()=>ob,ShadowMapShader:()=>Hf,ShadowMode:()=>_n,ShadowVolumeAppearance:()=>gd,ShowGeometryInstanceAttribute:()=>xn,Simon1994PlanetaryPositions:()=>ig,SimplePolylineGeometry:()=>tz,SingleTileImageryProvider:()=>Nw,SkinningPipelineStage:()=>S2,SkyAtmosphere:()=>M9,SkyBox:()=>N9,SpatialNode:()=>P9,SphereEmitter:()=>W7,SphereGeometry:()=>nz,SphereOutlineGeometry:()=>Pp,Spherical:()=>aZ,Spline:()=>qi,SplitDirection:()=>qc,Splitter:()=>xL,StaticGeometryColorBatch:()=>zu,StaticGeometryPerMaterialBatch:()=>Ku,StaticGroundGeometryColorBatch:()=>uV,StaticGroundGeometryPerMaterialBatch:()=>cv,StaticGroundPolylinePerMaterialBatch:()=>yv,StaticOutlineGeometryBatch:()=>fV,StencilConstants:()=>Nt,StencilFunction:()=>Dn,StencilOperation:()=>pt,SteppedSpline:()=>cZ,Stereographic:()=>nc,StripeMaterialProperty:()=>q1,StripeOrientation:()=>ah,StructuralMetadata:()=>Ea,StyleCommandsNeeded:()=>Jm,StyleExpression:()=>P7,Sun:()=>D9,SunLight:()=>H0,SunPostProcess:()=>u9,SupportedImageFormats:()=>JI,SvgPathBindingHandler:()=>xA,TaskProcessor:()=>hi,Terrain:()=>hA,TerrainData:()=>pm,TerrainEncoding:()=>Qa,TerrainFillMesh:()=>QV,TerrainMesh:()=>ru,TerrainOffsetProperty:()=>p_,TerrainProvider:()=>Dr,TerrainQuantization:()=>Gs,TerrainState:()=>so,Texture:()=>Et,TextureAtlas:()=>Ng,TextureCache:()=>ow,TextureMagnificationFilter:()=>di,TextureManager:()=>v9,TextureMinificationFilter:()=>rn,TextureUniform:()=>Q7,TextureWrap:()=>Cn,TileAvailability:()=>bm,TileBoundingRegion:()=>ku,TileBoundingS2Cell:()=>_P,TileBoundingSphere:()=>Z0,TileBoundingVolume:()=>v7,TileCoordinatesImageryProvider:()=>pA,TileDiscardPolicy:()=>F7,TileEdge:()=>gn,TileImagery:()=>zV,TileMapServiceImageryProvider:()=>Ty,TileMetadata:()=>bP,TileOrientedBoundingBox:()=>Gd,TileProviderError:()=>xo,TileReplacementQueue:()=>Qw,TileSelectionResult:()=>Kn,TileState:()=>A7,Tileset3DTileContent:()=>H2,TilesetMetadata:()=>TP,TilesetPipelineStage:()=>xW,TilingScheme:()=>iz,TimeConstants:()=>zn,TimeDynamicImagery:()=>XT,TimeDynamicPointCloud:()=>CL,TimeInterval:()=>Sn,TimeIntervalCollection:()=>Xr,TimeIntervalCollectionPositionProperty:()=>F0,TimeIntervalCollectionProperty:()=>A0,TimeStandard:()=>Hn,Timeline:()=>sM,TimelineHighlightRange:()=>oM,TimelineTrack:()=>rM,Tipsify:()=>eR,ToggleButtonViewModel:()=>vy,Tonemapper:()=>Ey,Transforms:()=>Gt,TranslationRotationScale:()=>sg,TranslucentTileClassification:()=>PF,TridiagonalSystemSolver:()=>BS,TrustedServers:()=>WS,TweenCollection:()=>zT,UniformState:()=>sw,UniformType:()=>cL,UrlTemplateImageryProvider:()=>wa,VERSION:()=>LSt,VRButton:()=>cM,VRButtonViewModel:()=>aM,VRTheWorldTerrainProvider:()=>az,VaryingType:()=>j7,Vector3DTileBatch:()=>uf,Vector3DTileClampedPolylines:()=>hP,Vector3DTileContent:()=>fP,Vector3DTileGeometry:()=>$p,Vector3DTilePoints:()=>sP,Vector3DTilePolygons:()=>aP,Vector3DTilePolylines:()=>Q_,Vector3DTilePrimitive:()=>S_,VelocityOrientationProperty:()=>HP,VelocityVectorProperty:()=>mT,VertexArray:()=>ti,VertexArrayFacade:()=>g0,VertexAttributeSemantic:()=>Tt,VertexFormat:()=>We,VerticalExaggeration:()=>mr,VerticalExaggerationPipelineStage:()=>V2,VerticalOrigin:()=>Pn,VideoSynchronizer:()=>cz,View:()=>kT,Viewer:()=>x6,ViewportQuad:()=>k7,Visibility:()=>ir,Visualizer:()=>sj,VoxelBoxShape:()=>Qf,VoxelCell:()=>f9,VoxelContent:()=>z9,VoxelCylinderShape:()=>jf,VoxelEllipsoidShape:()=>jT,VoxelInspector:()=>uM,VoxelInspectorViewModel:()=>dM,VoxelPrimitive:()=>Iy,VoxelProvider:()=>D7,VoxelRenderResources:()=>E9,VoxelShape:()=>B7,VoxelShapeType:()=>Xi,VoxelTraversal:()=>aL,VulkanConstants:()=>lz,WallGeometry:()=>mZ,WallGeometryLibrary:()=>kx,WallGeometryUpdater:()=>av,WallGraphics:()=>zp,WallOutlineGeometry:()=>fZ,WebGLConstants:()=>ne,WebMapServiceImageryProvider:()=>Uw,WebMapTileServiceImageryProvider:()=>Bw,WebMercatorProjection:()=>Ci,WebMercatorTilingScheme:()=>Br,WindingOrder:()=>os,WireframeIndexGenerator:()=>wC,WireframePipelineStage:()=>L2,_shadersAcesTonemappingStage:()=>wF,_shadersAdditiveBlend:()=>l9,_shadersAdjustTranslucentFS:()=>WV,_shadersAllMaterialAppearanceFS:()=>VZ,_shadersAllMaterialAppearanceVS:()=>LZ,_shadersAmbientOcclusionGenerate:()=>FF,_shadersAmbientOcclusionModulate:()=>AF,_shadersAspectRampMaterial:()=>WZ,_shadersAtmosphereCommon:()=>z0,_shadersAtmosphereStageFS:()=>_W,_shadersAtmosphereStageVS:()=>TW,_shadersBasicMaterialAppearanceFS:()=>RZ,_shadersBasicMaterialAppearanceVS:()=>ZZ,_shadersBillboardCollectionFS:()=>z2,_shadersBillboardCollectionVS:()=>K2,_shadersBlackAndWhite:()=>MF,_shadersBloomComposite:()=>NF,_shadersBrdfLutGeneratorFS:()=>lw,_shadersBrightPass:()=>d9,_shadersBrightness:()=>kF,_shadersBumpMapMaterial:()=>PZ,_shadersCPUStylingStageFS:()=>HW,_shadersCPUStylingStageVS:()=>OW,_shadersCheckerboardMaterial:()=>vZ,_shadersCloudCollectionFS:()=>dw,_shadersCloudCollectionVS:()=>uw,_shadersCloudNoiseFS:()=>mw,_shadersCloudNoiseVS:()=>hw,_shadersCompareAndPackTranslucentDepth:()=>fw,_shadersCompositeOITFS:()=>pw,_shadersCompositeTranslucentClassification:()=>NT,_shadersContrastBias:()=>UF,_shadersCustomShaderStageFS:()=>JW,_shadersCustomShaderStageVS:()=>KW,_shadersCzmBuiltins:()=>jx,_shadersDepthOfField:()=>DF,_shadersDepthPlaneFS:()=>bw,_shadersDepthPlaneVS:()=>gw,_shadersDepthView:()=>BF,_shadersDepthViewPacked:()=>J7,_shadersDotMaterial:()=>wZ,_shadersEdgeDetection:()=>YF,_shadersElevationBandMaterial:()=>FZ,_shadersElevationContourMaterial:()=>AZ,_shadersElevationRampMaterial:()=>MZ,_shadersEllipsoidFS:()=>PV,_shadersEllipsoidSurfaceAppearanceFS:()=>j9,_shadersEllipsoidSurfaceAppearanceVS:()=>q9,_shadersEllipsoidVS:()=>vV,_shadersFXAA:()=>HF,_shadersFXAA3_11:()=>yw,_shadersFadeMaterial:()=>NZ,_shadersFeatureIdStageFS:()=>QW,_shadersFeatureIdStageVS:()=>jW,_shadersFilmicTonemapping:()=>OF,_shadersGaussianBlur1D:()=>Gy,_shadersGeometryStageFS:()=>i2,_shadersGeometryStageVS:()=>o2,_shadersGlobeFS:()=>xw,_shadersGlobeVS:()=>_w,_shadersGridMaterial:()=>kZ,_shadersGroundAtmosphere:()=>wV,_shadersHSBToRGB:()=>JG,_shadersHSLToRGB:()=>QG,_shadersImageBasedLightingStageFS:()=>CW,_shadersInstancingStageCommon:()=>vW,_shadersInstancingStageVS:()=>wW,_shadersIntersectBox:()=>T9,_shadersIntersectClippingPlanes:()=>_9,_shadersIntersectCylinder:()=>S9,_shadersIntersectDepth:()=>x9,_shadersIntersectEllipsoid:()=>C9,_shadersIntersectLongitude:()=>rL,_shadersIntersection:()=>QT,_shadersIntersectionUtils:()=>y9,_shadersLegacyInstancingStageVS:()=>FW,_shadersLensFlare:()=>zF,_shadersLightingStageFS:()=>a2,_shadersMaterialStageFS:()=>l2,_shadersMegatexture:()=>G9,_shadersMetadataStageFS:()=>qW,_shadersMetadataStageVS:()=>$W,_shadersModelClippingPlanesStageFS:()=>GW,_shadersModelClippingPolygonsStageFS:()=>IW,_shadersModelClippingPolygonsStageVS:()=>XW,_shadersModelColorStageFS:()=>ZW,_shadersModelFS:()=>hW,_shadersModelSilhouetteStageFS:()=>W2,_shadersModelSilhouetteStageVS:()=>P2,_shadersModelSplitterStageFS:()=>w2,_shadersModelVS:()=>fW,_shadersModifiedReinhardTonemapping:()=>KF,_shadersMorphTargetsStageVS:()=>u2,_shadersNightVision:()=>JF,_shadersNormalMapMaterial:()=>UZ,_shadersOctahedralProjectionAtlasFS:()=>aI,_shadersOctahedralProjectionFS:()=>cI,_shadersOctahedralProjectionVS:()=>lI,_shadersOctree:()=>Z9,_shadersPassThrough:()=>jl,_shadersPassThroughDepth:()=>Ly,_shadersPerInstanceColorAppearanceFS:()=>jZ,_shadersPerInstanceColorAppearanceVS:()=>qZ,_shadersPerInstanceFlatColorAppearanceFS:()=>Jx,_shadersPerInstanceFlatColorAppearanceVS:()=>$Z,_shadersPointCloudEyeDomeLighting:()=>qI,_shadersPointCloudStylingStageVS:()=>f2,_shadersPointPrimitiveCollectionFS:()=>Jg,_shadersPointPrimitiveCollectionVS:()=>MP,_shadersPolygonSignedDistanceFS:()=>NI,_shadersPolylineArrowMaterial:()=>DZ,_shadersPolylineColorAppearanceVS:()=>kX,_shadersPolylineCommon:()=>yd,_shadersPolylineDashMaterial:()=>BZ,_shadersPolylineFS:()=>i_,_shadersPolylineGlowMaterial:()=>YZ,_shadersPolylineMaterialAppearanceVS:()=>UX,_shadersPolylineOutlineMaterial:()=>OZ,_shadersPolylineShadowVolumeFS:()=>FX,_shadersPolylineShadowVolumeMorphFS:()=>AX,_shadersPolylineShadowVolumeMorphVS:()=>MX,_shadersPolylineShadowVolumeVS:()=>NX,_shadersPolylineVS:()=>tP,_shadersPrimitiveOutlineStageFS:()=>g2,_shadersPrimitiveOutlineStageVS:()=>b2,_shadersRGBToHSB:()=>jG,_shadersRGBToHSL:()=>qG,_shadersRGBToXYZ:()=>$G,_shadersReinhardTonemapping:()=>QF,_shadersReprojectWebMercatorFS:()=>Tw,_shadersReprojectWebMercatorVS:()=>Sw,_shadersRimLightingMaterial:()=>HZ,_shadersSelectedFeatureIdStageCommon:()=>x1,_shadersShadowVolumeAppearanceFS:()=>NC,_shadersShadowVolumeAppearanceVS:()=>WX,_shadersShadowVolumeFS:()=>hg,_shadersSilhouette:()=>jF,_shadersSkinningStageVS:()=>T2,_shadersSkyAtmosphereCommon:()=>FV,_shadersSkyAtmosphereFS:()=>Cw,_shadersSkyAtmosphereVS:()=>Vw,_shadersSkyBoxFS:()=>Lw,_shadersSkyBoxVS:()=>Rw,_shadersSlopeRampMaterial:()=>zZ,_shadersStripeMaterial:()=>KZ,_shadersSunFS:()=>Zw,_shadersSunTextureFS:()=>Gw,_shadersSunVS:()=>Ew,_shadersTexturedMaterialAppearanceFS:()=>GZ,_shadersTexturedMaterialAppearanceVS:()=>EZ,_shadersVector3DTileClampedPolylinesFS:()=>uP,_shadersVector3DTileClampedPolylinesVS:()=>dP,_shadersVector3DTilePolylinesVS:()=>cP,_shadersVectorTileVS:()=>KC,_shadersVerticalExaggerationStageVS:()=>C2,_shadersViewportQuadFS:()=>Xw,_shadersViewportQuadVS:()=>RT,_shadersVoxelFS:()=>b9,_shadersVoxelUtils:()=>p9,_shadersVoxelVS:()=>g9,_shadersWater:()=>JZ,_shadersXYZToRGB:()=>eE,_shadersacesTonemapping:()=>tE,_shadersalphaWeight:()=>nE,_shadersantialias:()=>iE,_shadersapplyHSBShift:()=>oE,_shadersapproximateSphericalCoordinates:()=>rE,_shadersapproximateTanh:()=>sE,_shadersbackFacing:()=>aE,_shadersbranchFreeTernary:()=>cE,_shaderscascadeColor:()=>lE,_shaderscascadeDistance:()=>dE,_shaderscascadeMatrix:()=>uE,_shaderscascadeWeights:()=>mE,_shadersclipPolygons:()=>hE,_shaderscolumbusViewMorph:()=>fE,_shaderscomputeAtmosphereColor:()=>pE,_shaderscomputeGroundAtmosphereScattering:()=>bE,_shaderscomputePosition:()=>gE,_shaderscomputeScattering:()=>yE,_shadersconvertUvToBox:()=>V9,_shadersconvertUvToCylinder:()=>L9,_shadersconvertUvToEllipsoid:()=>R9,_shaderscosineAndSine:()=>xE,_shadersdecompressTextureCoordinates:()=>_E,_shadersdegreesPerRadian:()=>iG,_shadersdepthClamp:()=>TE,_shadersdepthRange:()=>oG,_shadersdepthRangeStruct:()=>UG,_shaderseastNorthUpToEyeCoordinates:()=>SE,_shadersellipsoidContainsPoint:()=>CE,_shadersellipsoidWgs84TextureCoordinates:()=>VE,_shadersepsilon1:()=>rG,_shadersepsilon2:()=>sG,_shadersepsilon3:()=>aG,_shadersepsilon4:()=>cG,_shadersepsilon5:()=>lG,_shadersepsilon6:()=>dG,_shadersepsilon7:()=>uG,_shadersequalsEpsilon:()=>LE,_shaderseyeOffset:()=>RE,_shaderseyeToWindowCoordinates:()=>ZE,_shadersfastApproximateAtan:()=>GE,_shadersfog:()=>EE,_shadersgammaCorrect:()=>XE,_shadersgeodeticSurfaceNormal:()=>IE,_shadersgetDefaultMaterial:()=>WE,_shadersgetDynamicAtmosphereLightDirection:()=>PE,_shadersgetLambertDiffuse:()=>vE,_shadersgetSpecular:()=>wE,_shadersgetWaterNoise:()=>FE,_shadershue:()=>AE,_shadersinfinity:()=>mG,_shadersinverseGamma:()=>ME,_shadersisEmpty:()=>NE,_shadersisFull:()=>kE,_shaderslatitudeToWebMercatorFraction:()=>UE,_shaderslineDistance:()=>DE,_shaderslinearToSrgb:()=>BE,_shadersluminance:()=>YE,_shadersmaterial:()=>DG,_shadersmaterialInput:()=>BG,_shadersmaximumComponent:()=>OE,_shadersmetersPerPixel:()=>HE,_shadersmodelMaterial:()=>YG,_shadersmodelToWindowCoordinates:()=>zE,_shadersmodelVertexOutput:()=>OG,_shadersmultiplyWithColorBalance:()=>KE,_shadersnearFarScalar:()=>JE,_shadersoctDecode:()=>QE,_shadersoneOverPi:()=>hG,_shadersoneOverTwoPi:()=>fG,_shaderspackDepth:()=>jE,_shaderspassCesium3DTile:()=>pG,_shaderspassCesium3DTileClassification:()=>bG,_shaderspassCesium3DTileClassificationIgnoreShow:()=>gG,_shaderspassClassification:()=>yG,_shaderspassCompute:()=>xG,_shaderspassEnvironment:()=>_G,_shaderspassGlobe:()=>TG,_shaderspassOpaque:()=>SG,_shaderspassOverlay:()=>CG,_shaderspassTerrainClassification:()=>VG,_shaderspassTranslucent:()=>LG,_shaderspassVoxels:()=>RG,_shaderspbrLighting:()=>qE,_shadersphong:()=>$E,_shaderspi:()=>ZG,_shaderspiOverFour:()=>GG,_shaderspiOverSix:()=>EG,_shaderspiOverThree:()=>XG,_shaderspiOverTwo:()=>IG,_shadersplaneDistance:()=>eX,_shaderspointAlongRay:()=>tX,_shadersradiansPerDegree:()=>WG,_shadersray:()=>HG,_shadersrayEllipsoidIntersectionInterval:()=>nX,_shadersraySegment:()=>zG,_shadersraySphereIntersectionInterval:()=>iX,_shadersreadDepth:()=>oX,_shadersreadNonPerspective:()=>rX,_shadersreverseLogDepth:()=>sX,_shadersround:()=>aX,_shaderssampleOctahedralProjection:()=>cX,_shaderssaturation:()=>lX,_shaderssceneMode2D:()=>PG,_shaderssceneMode3D:()=>vG,_shaderssceneModeColumbusView:()=>wG,_shaderssceneModeMorphing:()=>FG,_shadersshadowDepthCompare:()=>dX,_shadersshadowParameters:()=>KG,_shadersshadowVisibility:()=>uX,_shaderssignNotZero:()=>mX,_shaderssolarRadius:()=>AG,_shaderssphericalHarmonics:()=>hX,_shaderssrgbToLinear:()=>fX,_shaderstangentToEyeSpaceMatrix:()=>pX,_shaderstextureCube:()=>bX,_shadersthreePiOver2:()=>MG,_shaderstransformPlane:()=>gX,_shaderstranslateRelativeToEye:()=>yX,_shaderstranslucentPhong:()=>xX,_shaderstranspose:()=>_X,_shaderstwoPi:()=>NG,_shadersunpackClippingExtents:()=>TX,_shadersunpackDepth:()=>SX,_shadersunpackFloat:()=>CX,_shadersunpackUint:()=>VX,_shadersvalueTransform:()=>LX,_shadersvertexLogDepth:()=>RX,_shaderswebMercatorMaxLatitude:()=>kG,_shaderswindowToEyeCoordinates:()=>ZX,_shaderswriteDepthClamp:()=>GX,_shaderswriteLogDepth:()=>EX,_shaderswriteNonPerspective:()=>XX,addBuffer:()=>RI,addDefaults:()=>yI,addExtensionsRequired:()=>CI,addExtensionsUsed:()=>Zu,addPipelineExtras:()=>Sg,addToArray:()=>bs,appendForwardSlash:()=>PL,arrayRemoveDuplicates:()=>go,barycentricCoordinates:()=>sx,binarySearch:()=>Ro,buildDrawCommand:()=>yW,buildModuleUrl:()=>tn,buildVoxelDrawCommands:()=>I9,clone:()=>Oe,combine:()=>xt,computeFlyToLocationForRectangle:()=>hS,createBillboardPointCallback:()=>K_,createCommand:()=>Vn,createDefaultImageryProviderViewModels:()=>EA,createDefaultTerrainProviderViewModels:()=>XA,createElevationBandMaterial:()=>O7,createGooglePhotorealistic3DTileset:()=>H7,createGuid:()=>Yn,createMaterialPropertyDescriptor:()=>Go,createOsmBuildingsAsync:()=>z7,createPropertyDescriptor:()=>de,createRawPropertyDescriptor:()=>Gl,createTangentSpaceDebugPrimitive:()=>K7,createTaskProcessorWorker:()=>q7,createUniform:()=>tG,createUniformArray:()=>nG,createWorldBathymetryAsync:()=>pZ,createWorldImageryAsync:()=>q0,createWorldTerrainAsync:()=>Bx,decodeGoogleEarthEnterpriseData:()=>bZ,decodeVectorPolylinePositions:()=>gZ,defaultValue:()=>y,defer:()=>fl,defined:()=>l,demodernizeShader:()=>IX,deprecationWarning:()=>Is,destroyObject:()=>me,exportKml:()=>uj,findAccessorMinMax:()=>G_,findContentMetadata:()=>q_,findGroupMetadata:()=>$_,findTileMetadata:()=>gP,forEachTextureInMaterial:()=>t1,formatError:()=>Oh,freezeRenderState:()=>Cz,getAbsoluteUri:()=>Fh,getAccessorByteStride:()=>vl,getBaseUri:()=>vL,getBinaryAccessor:()=>_d,getClipAndStyleCode:()=>lA,getClippingFunction:()=>K0,getComponentReader:()=>r0,getElement:()=>In,getExtensionFromUri:()=>By,getFilenameFromUri:()=>vp,getImageFromTypedArray:()=>yZ,getImagePixels:()=>mm,getJsonFromTypedArray:()=>Zo,getMagic:()=>Em,getStringFromTypedArray:()=>_l,getTimestamp:()=>fi,hasExtension:()=>ri,heightReferenceOnEntityPropertyChanged:()=>Kp,isBitSet:()=>ec,isBlobUri:()=>Yy,isCrossOriginUrl:()=>xb,isDataUri:()=>rp,isLeapYear:()=>um,knockout:()=>Ce,knockout_3_5_1:()=>fS,knockout_es5:()=>yA,loadAndExecuteScript:()=>Oy,loadCubeMap:()=>cw,loadImageFromTypedArray:()=>Yx,loadKTX2:()=>Rl,mergeSort:()=>wp,moveTechniqueRenderStates:()=>SI,moveTechniquesToExtension:()=>VI,numberOfComponentsForType:()=>Sd,objectToQuery:()=>Hy,oneTimeWarning:()=>Ft,parseBatchTable:()=>u0,parseFeatureMetadataLegacy:()=>zI,parseGlb:()=>_I,parseResponseHeaders:()=>wL,parseStructuralMetadata:()=>HI,pickModel:()=>T1,pointInsideTriangle:()=>gz,preprocess3DTileContent:()=>Vf,processVoxelProperties:()=>X9,queryToObject:()=>od,readAccessorPacked:()=>ZI,removeExtension:()=>E_,removeExtensionsRequired:()=>xI,removeExtensionsUsed:()=>Z_,removePipelineExtras:()=>TI,removeUnusedElements:()=>LI,resizeImageToNextPowerOfTwo:()=>cg,sampleTerrain:()=>xZ,sampleTerrainMostDetailed:()=>Ox,scaleToGeodeticSurface:()=>Dy,srgbToLinear:()=>Hx,subdivideArray:()=>_Z,subscribeAndEvaluate:()=>ba,updateAccessorComponentTypes:()=>GI,updateVersion:()=>EI,usesExtension:()=>or,viewerCesium3DTilesInspectorMixin:()=>_6,viewerCesiumInspectorMixin:()=>T6,viewerDragDropMixin:()=>C6,viewerPerformanceWatchdogMixin:()=>V6,viewerVoxelInspectorMixin:()=>L6,webGLConstantToGlslType:()=>_z,wrapFunction:()=>TZ,writeTextToCanvas:()=>Ex});var eLo=T(S(),1);var Kqi=T(S(),1);var vZt=T(S(),1);var mZt=T(S(),1);var QSt=T(S(),1);var MSt=T(S(),1);var ISt=T(S(),1);function nCe(e){return e!=null}var l=nCe;var vSt=T(S(),1);function Uy(e){this.name="DeveloperError",this.message=e;let t;try{throw new Error}catch(n){t=n.stack}this.stack=t}l(Object.create)&&(Uy.prototype=Object.create(Error.prototype),Uy.prototype.constructor=Uy);Uy.prototype.toString=function(){let e=`${this.name}: ${this.message}`;return l(this.stack)&&(e+=` ${this.stack.toString()}`),e};Uy.throwInstantiationError=function(){throw new Uy("This function defines an interface and should not be called directly.")};var fe=Uy;var ms={};ms.typeOf={};function iCe(e){return`${e} is required, actual value was undefined`}function CS(e,t,n){return`Expected ${n} to be typeof ${t}, actual typeof was ${e}`}ms.defined=function(e,t){if(!l(t))throw new fe(iCe(e))};ms.typeOf.func=function(e,t){if(typeof t!="function")throw new fe(CS(typeof t,"function",e))};ms.typeOf.string=function(e,t){if(typeof t!="string")throw new fe(CS(typeof t,"string",e))};ms.typeOf.number=function(e,t){if(typeof t!="number")throw new fe(CS(typeof t,"number",e))};ms.typeOf.number.lessThan=function(e,t,n){if(ms.typeOf.number(e,t),t>=n)throw new fe(`Expected ${e} to be less than ${n}, actual value was ${t}`)};ms.typeOf.number.lessThanOrEquals=function(e,t,n){if(ms.typeOf.number(e,t),t>n)throw new fe(`Expected ${e} to be less than or equal to ${n}, actual value was ${t}`)};ms.typeOf.number.greaterThan=function(e,t,n){if(ms.typeOf.number(e,t),t<=n)throw new fe(`Expected ${e} to be greater than ${n}, actual value was ${t}`)};ms.typeOf.number.greaterThanOrEquals=function(e,t,n){if(ms.typeOf.number(e,t),t0?1:-1});lt.signNotZero=function(e){return e<0?-1:1};lt.toSNorm=function(e,t){return t=y(t,255),Math.round((lt.clamp(e,-1,1)*.5+.5)*t)};lt.fromSNorm=function(e,t){return t=y(t,255),lt.clamp(e,0,t)/t*2-1};lt.normalize=function(e,t,n){return n=Math.max(n-t,0),n===0?0:lt.clamp((e-t)/n,0,1)};lt.sinh=y(Math.sinh,function(t){return(Math.exp(t)-Math.exp(-t))/2});lt.cosh=y(Math.cosh,function(t){return(Math.exp(t)+Math.exp(-t))/2});lt.lerp=function(e,t,n){return(1-n)*e+n*t};lt.PI=Math.PI;lt.ONE_OVER_PI=1/Math.PI;lt.PI_OVER_TWO=Math.PI/2;lt.PI_OVER_THREE=Math.PI/3;lt.PI_OVER_FOUR=Math.PI/4;lt.PI_OVER_SIX=Math.PI/6;lt.THREE_PI_OVER_TWO=3*Math.PI/2;lt.TWO_PI=2*Math.PI;lt.ONE_OVER_TWO_PI=1/(2*Math.PI);lt.RADIANS_PER_DEGREE=Math.PI/180;lt.DEGREES_PER_RADIAN=180/Math.PI;lt.RADIANS_PER_ARCSECOND=lt.RADIANS_PER_DEGREE/3600;lt.toRadians=function(e){return e*lt.RADIANS_PER_DEGREE};lt.toDegrees=function(e){return e*lt.DEGREES_PER_RADIAN};lt.convertLongitudeRange=function(e){let t=lt.TWO_PI,n=e-Math.floor(e/t)*t;return n<-Math.PI?n+t:n>=Math.PI?n-t:n};lt.clampToLatitudeRange=function(e){return lt.clamp(e,-1*lt.PI_OVER_TWO,lt.PI_OVER_TWO)};lt.negativePiToPi=function(e){return e>=-lt.PI&&e<=lt.PI?e:lt.zeroToTwoPi(e+lt.PI)-lt.PI};lt.zeroToTwoPi=function(e){if(e>=0&&e<=lt.TWO_PI)return e;let t=lt.mod(e,lt.TWO_PI);return Math.abs(t)lt.EPSILON14?lt.TWO_PI:t};lt.mod=function(e,t){return lt.sign(e)===lt.sign(t)&&Math.abs(e)n};lt.greaterThanOrEquals=function(e,t,n){return e-t>-n};var TM=[1];lt.factorial=function(e){let t=TM.length;if(e>=t){let n=TM[t-1];for(let i=t;i<=e;i++){let o=n*i;TM.push(o),n=o}}return TM[e]};lt.incrementWrap=function(e,t,n){return n=y(n,0),++e,e>t&&(e=n),e};lt.isPowerOfTwo=function(e){return e!==0&&(e&e-1)===0};lt.nextPowerOfTwo=function(e){return--e,e|=e>>1,e|=e>>2,e|=e>>4,e|=e>>8,e|=e>>16,++e,e};lt.previousPowerOfTwo=function(e){return e|=e>>1,e|=e>>2,e|=e>>4,e|=e>>8,e|=e>>16,e|=e>>32,e=(e>>>0)-(e>>>1),e};lt.clamp=function(e,t,n){return en?n:e};var Q6=new _B.default;lt.setRandomNumberSeed=function(e){Q6=new _B.default(e)};lt.nextRandomNumber=function(){return Q6.random()};lt.randomBetween=function(e,t){return lt.nextRandomNumber()*(t-e)+e};lt.acosClamped=function(e){return Math.acos(lt.clamp(e,-1,1))};lt.asinClamped=function(e){return Math.asin(lt.clamp(e,-1,1))};lt.chordLength=function(e,t){return 2*t*Math.sin(e*.5)};lt.logBase=function(e,t){return Math.log(e)/Math.log(t)};lt.cbrt=y(Math.cbrt,function(t){let n=Math.pow(Math.abs(t),.3333333333333333);return t<0?-n:n});lt.log2=y(Math.log2,function(t){return Math.log(t)*Math.LOG2E});lt.fog=function(e,t){let n=e*t;return 1-Math.exp(-(n*n))};lt.fastApproximateAtan=function(e){return e*(-.1784*Math.abs(e)-.0663*e*e+1.0301)};lt.fastApproximateAtan2=function(e,t){let n,i=Math.abs(e);n=Math.abs(t);let o=Math.max(i,n);n=Math.min(i,n);let r=n/o;return i=lt.fastApproximateAtan(r),i=Math.abs(t)>Math.abs(e)?lt.PI_OVER_TWO-i:i,i=e<0?lt.PI-i:i,i=t<0?-i:i,i};var W=lt;function ot(e,t,n){this.x=y(e,0),this.y=y(t,0),this.z=y(n,0)}ot.fromSpherical=function(e,t){l(t)||(t=new ot);let n=e.clock,i=e.cone,o=y(e.magnitude,1),r=o*Math.sin(i);return t.x=r*Math.cos(n),t.y=r*Math.sin(n),t.z=o*Math.cos(i),t};ot.fromElements=function(e,t,n,i){return l(i)?(i.x=e,i.y=t,i.z=n,i):new ot(e,t,n)};ot.clone=function(e,t){if(l(e))return l(t)?(t.x=e.x,t.y=e.y,t.z=e.z,t):new ot(e.x,e.y,e.z)};ot.fromCartesian4=ot.clone;ot.packedLength=3;ot.pack=function(e,t,n){return n=y(n,0),t[n++]=e.x,t[n++]=e.y,t[n]=e.z,t};ot.unpack=function(e,t,n){return t=y(t,0),l(n)||(n=new ot),n.x=e[t++],n.y=e[t++],n.z=e[t],n};ot.packArray=function(e,t){let n=e.length,i=n*3;l(t)?!Array.isArray(t)&&t.length!==i||t.length!==i&&(t.length=i):t=new Array(i);for(let o=0;oW.EPSILON12);return l(o)?(o.x=r*F,o.y=s*A,o.z=a*b,o):new h(r*F,s*A,a*b)}var Dy=cCe;function ts(e,t,n){this.longitude=y(e,0),this.latitude=y(t,0),this.height=y(n,0)}ts.fromRadians=function(e,t,n,i){return n=y(n,0),l(i)?(i.longitude=e,i.latitude=t,i.height=n,i):new ts(e,t,n)};ts.fromDegrees=function(e,t,n,i){return e=W.toRadians(e),t=W.toRadians(t),ts.fromRadians(e,t,n,i)};var lCe=new h,dCe=new h,uCe=new h,mCe=new h(1/6378137,1/6378137,1/6356752314245179e-9),hCe=new h(1/(6378137*6378137),1/(6378137*6378137),1/(6356752314245179e-9*6356752314245179e-9)),fCe=W.EPSILON1;ts.fromCartesian=function(e,t,n){let i=l(t)?t.oneOverRadii:mCe,o=l(t)?t.oneOverRadiiSquared:hCe,r=l(t)?t._centerToleranceSquared:fCe,s=Dy(e,i,o,r,dCe);if(!l(s))return;let a=h.multiplyComponents(s,o,lCe);a=h.normalize(a,a);let c=h.subtract(e,s,uCe),d=Math.atan2(a.y,a.x),u=Math.asin(a.z),m=W.sign(h.dot(c,e))*h.magnitude(c);return l(n)?(n.longitude=d,n.latitude=u,n.height=m,n):new ts(d,u,m)};ts.toCartesian=function(e,t,n){return h.fromRadians(e.longitude,e.latitude,e.height,t,n)};ts.clone=function(e,t){if(l(e))return l(t)?(t.longitude=e.longitude,t.latitude=e.latitude,t.height=e.height,t):new ts(e.longitude,e.latitude,e.height)};ts.equals=function(e,t){return e===t||l(e)&&l(t)&&e.longitude===t.longitude&&e.latitude===t.latitude&&e.height===t.height};ts.equalsEpsilon=function(e,t,n){return n=y(n,0),e===t||l(e)&&l(t)&&Math.abs(e.longitude-t.longitude)<=n&&Math.abs(e.latitude-t.latitude)<=n&&Math.abs(e.height-t.height)<=n};ts.ZERO=Object.freeze(new ts(0,0,0));ts.prototype.clone=function(e){return ts.clone(this,e)};ts.prototype.equals=function(e){return ts.equals(this,e)};ts.prototype.equalsEpsilon=function(e,t){return ts.equalsEpsilon(this,e,t)};ts.prototype.toString=function(){return`(${this.longitude}, ${this.latitude}, ${this.height})`};var he=ts;var SCt=T(S(),1);var hCt=T(S(),1);function wt(e,t){this.x=y(e,0),this.y=y(t,0)}wt.fromElements=function(e,t,n){return l(n)?(n.x=e,n.y=t,n):new wt(e,t)};wt.clone=function(e,t){if(l(e))return l(t)?(t.x=e.x,t.y=e.y,t):new wt(e.x,e.y)};wt.fromCartesian3=wt.clone;wt.fromCartesian4=wt.clone;wt.packedLength=2;wt.pack=function(e,t,n){return n=y(n,0),t[n++]=e.x,t[n]=e.y,t};wt.unpack=function(e,t,n){return t=y(t,0),l(n)||(n=new wt),n.x=e[t++],n.y=e[t],n};wt.packArray=function(e,t){let n=e.length,i=n*2;l(t)?!Array.isArray(t)&&t.length!==i||t.length!==i&&(t.length=i):t=new Array(i);for(let o=0;o=this._radii.z-t))return n};var TCe=new h;Yi.prototype.getLocalCurvature=function(e,t){l(t)||(t=new D);let n=this.getSurfaceNormalIntersectionWithZAxis(e,0,TCe),i=h.distance(e,n),o=this.minimumRadius*i/this.maximumRadius**2,r=i*o**2;return D.fromElements(1/i,1/r,t)};var SCe=[.14887433898163,.43339539412925,.67940956829902,.86506336668898,.97390652851717,0],CCe=[.29552422471475,.26926671930999,.21908636251598,.14945134915058,.066671344308684,0];function tq(e,t,n){let i=.5*(t+e),o=.5*(t-e),r=0;for(let s=0;s<5;s++){let a=o*SCe[s];r+=CCe[s]*(n(i+a)+n(i-a))}return r*=o,r}Yi.prototype.surfaceArea=function(e){let t=e.west,n=e.east,i=e.south,o=e.north;for(;ni&&(o=d,i=u)}let r=1,s=0,a=CB[o],c=VB[o];if(Math.abs(e[rt.getElementIndex(c,a)])>n){let d=e[rt.getElementIndex(c,c)],u=e[rt.getElementIndex(a,a)],m=e[rt.getElementIndex(c,a)],p=(d-u)/2/m,g;p<0?g=-1/(-p+Math.sqrt(1+p*p)):g=1/(p+Math.sqrt(1+p*p)),r=1/Math.sqrt(1+g*g),s=g*r}return t=rt.clone(rt.IDENTITY,t),t[rt.getElementIndex(a,a)]=t[rt.getElementIndex(c,c)]=r,t[rt.getElementIndex(c,a)]=s,t[rt.getElementIndex(a,c)]=-s,t}var RM=new rt,oq=new rt;rt.computeEigenDecomposition=function(e,t){let n=W.EPSILON20,i=10,o=0,r=0;l(t)||(t={});let s=t.unitary=rt.clone(rt.IDENTITY,t.unitary),a=t.diagonal=rt.clone(e,t.diagonal),c=n*XCe(a);for(;rc;)WCe(a,RM),rt.transpose(RM,oq),rt.multiply(a,RM,a),rt.multiply(oq,a,a),rt.multiply(s,RM,s),++o>2&&(++r,o=0);return t};rt.abs=function(e,t){return t[0]=Math.abs(e[0]),t[1]=Math.abs(e[1]),t[2]=Math.abs(e[2]),t[3]=Math.abs(e[3]),t[4]=Math.abs(e[4]),t[5]=Math.abs(e[5]),t[6]=Math.abs(e[6]),t[7]=Math.abs(e[7]),t[8]=Math.abs(e[8]),t};rt.determinant=function(e){let t=e[0],n=e[3],i=e[6],o=e[1],r=e[4],s=e[7],a=e[2],c=e[5],d=e[8];return t*(r*d-c*s)+o*(c*i-n*d)+a*(n*s-r*i)};rt.inverse=function(e,t){let n=e[0],i=e[1],o=e[2],r=e[3],s=e[4],a=e[5],c=e[6],d=e[7],u=e[8],m=rt.determinant(e);t[0]=s*u-d*a,t[1]=d*o-i*u,t[2]=i*a-s*o,t[3]=c*a-r*u,t[4]=n*u-c*o,t[5]=r*o-n*a,t[6]=r*d-c*s,t[7]=c*i-n*d,t[8]=n*s-r*i;let p=1/m;return rt.multiplyByScalar(t,p,t)};var PCe=new rt;rt.inverseTranspose=function(e,t){return rt.inverse(rt.transpose(e,PCe),t)};rt.equals=function(e,t){return e===t||l(e)&&l(t)&&e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[3]===t[3]&&e[4]===t[4]&&e[5]===t[5]&&e[6]===t[6]&&e[7]===t[7]&&e[8]===t[8]};rt.equalsEpsilon=function(e,t,n){return n=y(n,0),e===t||l(e)&&l(t)&&Math.abs(e[0]-t[0])<=n&&Math.abs(e[1]-t[1])<=n&&Math.abs(e[2]-t[2])<=n&&Math.abs(e[3]-t[3])<=n&&Math.abs(e[4]-t[4])<=n&&Math.abs(e[5]-t[5])<=n&&Math.abs(e[6]-t[6])<=n&&Math.abs(e[7]-t[7])<=n&&Math.abs(e[8]-t[8])<=n};rt.IDENTITY=Object.freeze(new rt(1,0,0,0,1,0,0,0,1));rt.ZERO=Object.freeze(new rt(0,0,0,0,0,0,0,0,0));rt.COLUMN0ROW0=0;rt.COLUMN0ROW1=1;rt.COLUMN0ROW2=2;rt.COLUMN1ROW0=3;rt.COLUMN1ROW1=4;rt.COLUMN1ROW2=5;rt.COLUMN2ROW0=6;rt.COLUMN2ROW1=7;rt.COLUMN2ROW2=8;Object.defineProperties(rt.prototype,{length:{get:function(){return rt.packedLength}}});rt.prototype.clone=function(e){return rt.clone(this,e)};rt.prototype.equals=function(e){return rt.equals(this,e)};rt.equalsArray=function(e,t,n){return e[0]===t[n]&&e[1]===t[n+1]&&e[2]===t[n+2]&&e[3]===t[n+3]&&e[4]===t[n+4]&&e[5]===t[n+5]&&e[6]===t[n+6]&&e[7]===t[n+7]&&e[8]===t[n+8]};rt.prototype.equalsEpsilon=function(e,t){return rt.equalsEpsilon(this,e,t)};rt.prototype.toString=function(){return`(${this[0]}, ${this[3]}, ${this[6]}) (${this[1]}, ${this[4]}, ${this[7]}) (${this[2]}, ${this[5]}, ${this[8]})`};var $=rt;var i1t=T(S(),1);var OCt=T(S(),1);function yt(e,t,n,i){this.x=y(e,0),this.y=y(t,0),this.z=y(n,0),this.w=y(i,0)}yt.fromElements=function(e,t,n,i,o){return l(o)?(o.x=e,o.y=t,o.z=n,o.w=i,o):new yt(e,t,n,i)};yt.fromColor=function(e,t){return l(t)?(t.x=e.red,t.y=e.green,t.z=e.blue,t.w=e.alpha,t):new yt(e.red,e.green,e.blue,e.alpha)};yt.clone=function(e,t){if(l(e))return l(t)?(t.x=e.x,t.y=e.y,t.z=e.z,t.w=e.w,t):new yt(e.x,e.y,e.z,e.w)};yt.packedLength=4;yt.pack=function(e,t,n){return n=y(n,0),t[n++]=e.x,t[n++]=e.y,t[n++]=e.z,t[n]=e.w,t};yt.unpack=function(e,t,n){return t=y(t,0),l(n)||(n=new yt),n.x=e[t++],n.y=e[t++],n.z=e[t++],n.w=e[t],n};yt.packArray=function(e,t){let n=e.length,i=n*4;l(t)?!Array.isArray(t)&&t.length!==i||t.length!==i&&(t.length=i):t=new Array(i);for(let o=0;o0){o=r-1;continue}return r}return~(o+1)}var Ro=HCe;var a1t=T(S(),1);function zCe(e,t,n,i,o){this.xPoleWander=e,this.yPoleWander=t,this.xPoleOffset=n,this.yPoleOffset=i,this.ut1MinusUtc=o}var gb=zCe;var I1t=T(S(),1);var p1t=T(S(),1);var l1t=T(S(),1);function KCe(e){return e%4===0&&e%100!==0||e%400===0}var um=KCe;var cq=[31,28,31,30,31,30,31,31,30,31,30,31];function JCe(e,t,n,i,o,r,s,a){e=y(e,1),t=y(t,1),n=y(n,1),i=y(i,0),o=y(o,0),r=y(r,0),s=y(s,0),a=y(a,!1),this.year=e,this.month=t,this.day=n,this.hour=i,this.minute=o,this.second=r,this.millisecond=s,this.isLeapSecond=a;function x(){po.typeOf.number.greaterThanOrEquals("Year",e,1),po.typeOf.number.lessThanOrEquals("Year",e,9999),po.typeOf.number.greaterThanOrEquals("Month",t,1),po.typeOf.number.lessThanOrEquals("Month",t,12),po.typeOf.number.greaterThanOrEquals("Day",n,1),po.typeOf.number.lessThanOrEquals("Day",n,31),po.typeOf.number.greaterThanOrEquals("Hour",i,0),po.typeOf.number.lessThanOrEquals("Hour",i,23),po.typeOf.number.greaterThanOrEquals("Minute",o,0),po.typeOf.number.lessThanOrEquals("Minute",o,59),po.typeOf.bool("IsLeapSecond",a),po.typeOf.number.greaterThanOrEquals("Second",r,0),po.typeOf.number.lessThanOrEquals("Second",r,a?60:59),po.typeOf.number.greaterThanOrEquals("Millisecond",s,0),po.typeOf.number.lessThan("Millisecond",s,1e3)}function _(){let C=t===2&&um(e)?cq[t-1]+1:cq[t-1];if(n>C)throw new fe("Month and Day represents invalid date")}}var op=JCe;var g1t=T(S(),1);function QCe(e,t){this.julianDate=e,this.offset=t}var Fi=QCe;var x1t=T(S(),1),jCe={SECONDS_PER_MILLISECOND:.001,SECONDS_PER_MINUTE:60,MINUTES_PER_HOUR:60,HOURS_PER_DAY:24,SECONDS_PER_HOUR:3600,MINUTES_PER_DAY:1440,SECONDS_PER_DAY:86400,DAYS_PER_JULIAN_CENTURY:36525,PICOSECOND:1e-9,MODIFIED_JULIAN_DATE_DIFFERENCE:24000005e-1},zn=Object.freeze(jCe);var T1t=T(S(),1),qCe={UTC:0,TAI:1},Hn=Object.freeze(qCe);var dq=new op,ZB=[31,28,31,30,31,30,31,31,30,31,30,31],GB=29;function EB(e,t){return Zt.compare(e.julianDate,t.julianDate)}var ZS=new Fi;function EM(e){ZS.julianDate=e;let t=Zt.leapSeconds,n=Ro(t,ZS,EB);n<0&&(n=~n),n>=t.length&&(n=t.length-1);let i=t[n].offset;n>0&&Zt.secondsDifference(t[n].julianDate,e)>i&&(n--,i=t[n].offset),Zt.addSeconds(e,i,e)}function lq(e,t){ZS.julianDate=e;let n=Zt.leapSeconds,i=Ro(n,ZS,EB);if(i<0&&(i=~i),i===0)return Zt.addSeconds(e,-n[0].offset,t);if(i>=n.length)return Zt.addSeconds(e,-n[i-1].offset,t);let o=Zt.secondsDifference(n[i].julianDate,e);if(o===0)return Zt.addSeconds(e,-n[i].offset,t);if(!(o<=1))return Zt.addSeconds(e,-n[--i].offset,t)}function yb(e,t,n){let i=t/zn.SECONDS_PER_DAY|0;return e+=i,t-=zn.SECONDS_PER_DAY*i,t<0&&(e--,t+=zn.SECONDS_PER_DAY),n.dayNumber=e,n.secondsOfDay=t,n}function XB(e,t,n,i,o,r,s){let a=(t-14)/12|0,c=e+4800+a,d=(1461*c/4|0)+(367*(t-2-12*a)/12|0)-(3*((c+100)/100|0)/4|0)+n-32075;i=i-12,i<0&&(i+=24);let u=r+(i*zn.SECONDS_PER_HOUR+o*zn.SECONDS_PER_MINUTE+s*zn.SECONDS_PER_MILLISECOND);return u>=43200&&(d-=1),[d,u]}var $Ce=/^(\d{4})$/,e1e=/^(\d{4})-(\d{2})$/,t1e=/^(\d{4})-?(\d{3})$/,n1e=/^(\d{4})-?W(\d{2})-?(\d{1})?$/,i1e=/^(\d{4})-?(\d{2})-?(\d{2})$/,IB=/([Z+\-])?(\d{2})?:?(\d{2})?$/,o1e=/^(\d{2})(\.\d+)?/.source+IB.source,r1e=/^(\d{2}):?(\d{2})(\.\d+)?/.source+IB.source,s1e=/^(\d{2}):?(\d{2}):?(\d{2})(\.\d+)?/.source+IB.source;function Zt(e,t,n){this.dayNumber=void 0,this.secondsOfDay=void 0,e=y(e,0),t=y(t,0),n=y(n,Hn.UTC);let i=e|0;t=t+(e-i)*zn.SECONDS_PER_DAY,yb(i,t,this),n===Hn.UTC&&EM(this)}Zt.fromGregorianDate=function(e,t){let n=XB(e.year,e.month,e.day,e.hour,e.minute,e.second,e.millisecond);return l(t)?(yb(n[0],n[1],t),EM(t),t):new Zt(n[0],n[1],Hn.UTC)};Zt.fromDate=function(e,t){let n=XB(e.getUTCFullYear(),e.getUTCMonth()+1,e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds());return l(t)?(yb(n[0],n[1],t),EM(t),t):new Zt(n[0],n[1],Hn.UTC)};Zt.fromIso8601=function(e,t){e=e.replace(",",".");let n=e.split("T"),i,o=1,r=1,s=0,a=0,c=0,d=0,u=n[0],m=n[1],p,g;if(n=u.match(i1e),n!==null)i=+n[1],o=+n[2],r=+n[3];else if(n=u.match(e1e),n!==null)i=+n[1],o=+n[2];else if(n=u.match($Ce),n!==null)i=+n[1];else{let C;if(n=u.match(t1e),n!==null)i=+n[1],C=+n[2],g=um(i);else if(n=u.match(n1e),n!==null){i=+n[1];let V=+n[2],L=+n[3]||0,Z=new Date(Date.UTC(i,0,4));C=V*7+L-Z.getUTCDay()-3}p=new Date(Date.UTC(i,0,1)),p.setUTCDate(C),o=p.getUTCMonth()+1,r=p.getUTCDate()}g=um(i);let f;if(l(m)){n=m.match(s1e),n!==null?(s=+n[1],a=+n[2],c=+n[3],d=+(n[4]||0)*1e3,f=5):(n=m.match(r1e),n!==null?(s=+n[1],a=+n[2],c=+(n[3]||0)*60,f=4):(n=m.match(o1e),n!==null&&(s=+n[1],a=+(n[2]||0)*60,f=3)));let C=n[f],V=+n[f+1],L=+(n[f+2]||0);switch(C){case"+":s=s-V,a=a-L;break;case"-":s=s+V,a=a+L;break;case"Z":break;default:a=a+new Date(Date.UTC(i,o-1,r,s,a)).getTimezoneOffset();break}}let x=c===60;for(x&&c--;a>=60;)a-=60,s++;for(;s>=24;)s-=24,r++;for(p=g&&o===2?GB:ZB[o-1];r>p;)r-=p,o++,o>12&&(o-=12,i++),p=g&&o===2?GB:ZB[o-1];for(;a<0;)a+=60,s--;for(;s<0;)s+=24,r--;for(;r<1;)o--,o<1&&(o+=12,i--),p=g&&o===2?GB:ZB[o-1],r+=p;let _=XB(i,o,r,s,a,c,d);return l(t)?(yb(_[0],_[1],t),EM(t)):t=new Zt(_[0],_[1],Hn.UTC),x&&Zt.addSeconds(t,1,t),t};Zt.now=function(e){return Zt.fromDate(new Date,e)};var GM=new Zt(0,0,Hn.TAI);Zt.toGregorianDate=function(e,t){let n=!1,i=lq(e,GM);l(i)||(Zt.addSeconds(e,-1,GM),i=lq(GM,GM),n=!0);let o=i.dayNumber,r=i.secondsOfDay;r>=43200&&(o+=1);let s=o+68569|0,a=4*s/146097|0;s=s-((146097*a+3)/4|0)|0;let c=4e3*(s+1)/1461001|0;s=s-(1461*c/4|0)+31|0;let d=80*s/2447|0,u=s-(2447*d/80|0)|0;s=d/11|0;let m=d+2-12*s|0,p=100*(a-49)+c+s|0,g=r/zn.SECONDS_PER_HOUR|0,f=r-g*zn.SECONDS_PER_HOUR,x=f/zn.SECONDS_PER_MINUTE|0;f=f-x*zn.SECONDS_PER_MINUTE;let _=f|0,C=(f-_)/zn.SECONDS_PER_MILLISECOND;return g+=12,g>23&&(g-=24),n&&(_+=1),l(t)?(t.year=p,t.month=m,t.day=u,t.hour=g,t.minute=x,t.second=_,t.millisecond=C,t.isLeapSecond=n,t):new op(p,m,u,g,x,_,C,n)};Zt.toDate=function(e){let t=Zt.toGregorianDate(e,dq),n=t.second;return t.isLeapSecond&&(n-=1),new Date(Date.UTC(t.year,t.month-1,t.day,t.hour,t.minute,n,t.millisecond))};Zt.toIso8601=function(e,t){let n=Zt.toGregorianDate(e,dq),i=n.year,o=n.month,r=n.day,s=n.hour,a=n.minute,c=n.second,d=n.millisecond;i===1e4&&o===1&&r===1&&s===0&&a===0&&c===0&&d===0&&(i=9999,o=12,r=31,s=24);let u;return!l(t)&&d!==0?(u=(d*.01).toString().replace(".",""),`${i.toString().padStart(4,"0")}-${o.toString().padStart(2,"0")}-${r.toString().padStart(2,"0")}T${s.toString().padStart(2,"0")}:${a.toString().padStart(2,"0")}:${c.toString().padStart(2,"0")}.${u}Z`):!l(t)||t===0?`${i.toString().padStart(4,"0")}-${o.toString().padStart(2,"0")}-${r.toString().padStart(2,"0")}T${s.toString().padStart(2,"0")}:${a.toString().padStart(2,"0")}:${c.toString().padStart(2,"0")}Z`:(u=(d*.01).toFixed(t).replace(".","").slice(0,t),`${i.toString().padStart(4,"0")}-${o.toString().padStart(2,"0")}-${r.toString().padStart(2,"0")}T${s.toString().padStart(2,"0")}:${a.toString().padStart(2,"0")}:${c.toString().padStart(2,"0")}.${u}Z`)};Zt.clone=function(e,t){if(l(e))return l(t)?(t.dayNumber=e.dayNumber,t.secondsOfDay=e.secondsOfDay,t):new Zt(e.dayNumber,e.secondsOfDay,Hn.TAI)};Zt.compare=function(e,t){let n=e.dayNumber-t.dayNumber;return n!==0?n:e.secondsOfDay-t.secondsOfDay};Zt.equals=function(e,t){return e===t||l(e)&&l(t)&&e.dayNumber===t.dayNumber&&e.secondsOfDay===t.secondsOfDay};Zt.equalsEpsilon=function(e,t,n){return n=y(n,0),e===t||l(e)&&l(t)&&Math.abs(Zt.secondsDifference(e,t))<=n};Zt.totalDays=function(e){return e.dayNumber+e.secondsOfDay/zn.SECONDS_PER_DAY};Zt.secondsDifference=function(e,t){return(e.dayNumber-t.dayNumber)*zn.SECONDS_PER_DAY+(e.secondsOfDay-t.secondsOfDay)};Zt.daysDifference=function(e,t){let n=e.dayNumber-t.dayNumber,i=(e.secondsOfDay-t.secondsOfDay)/zn.SECONDS_PER_DAY;return n+i};Zt.computeTaiMinusUtc=function(e){ZS.julianDate=e;let t=Zt.leapSeconds,n=Ro(t,ZS,EB);return n<0&&(n=~n,--n,n<0&&(n=0)),t[n].offset};Zt.addSeconds=function(e,t,n){return yb(e.dayNumber,e.secondsOfDay+t,n)};Zt.addMinutes=function(e,t,n){let i=e.secondsOfDay+t*zn.SECONDS_PER_MINUTE;return yb(e.dayNumber,i,n)};Zt.addHours=function(e,t,n){let i=e.secondsOfDay+t*zn.SECONDS_PER_HOUR;return yb(e.dayNumber,i,n)};Zt.addDays=function(e,t,n){let i=e.dayNumber+t;return yb(i,e.secondsOfDay,n)};Zt.lessThan=function(e,t){return Zt.compare(e,t)<0};Zt.lessThanOrEquals=function(e,t){return Zt.compare(e,t)<=0};Zt.greaterThan=function(e,t){return Zt.compare(e,t)>0};Zt.greaterThanOrEquals=function(e,t){return Zt.compare(e,t)>=0};Zt.prototype.clone=function(e){return Zt.clone(this,e)};Zt.prototype.equals=function(e){return Zt.equals(this,e)};Zt.prototype.equalsEpsilon=function(e,t){return Zt.equalsEpsilon(this,e,t)};Zt.prototype.toString=function(){return Zt.toIso8601(this)};Zt.leapSeconds=[new Fi(new Zt(2441317,43210,Hn.TAI),10),new Fi(new Zt(2441499,43211,Hn.TAI),11),new Fi(new Zt(2441683,43212,Hn.TAI),12),new Fi(new Zt(2442048,43213,Hn.TAI),13),new Fi(new Zt(2442413,43214,Hn.TAI),14),new Fi(new Zt(2442778,43215,Hn.TAI),15),new Fi(new Zt(2443144,43216,Hn.TAI),16),new Fi(new Zt(2443509,43217,Hn.TAI),17),new Fi(new Zt(2443874,43218,Hn.TAI),18),new Fi(new Zt(2444239,43219,Hn.TAI),19),new Fi(new Zt(2444786,43220,Hn.TAI),20),new Fi(new Zt(2445151,43221,Hn.TAI),21),new Fi(new Zt(2445516,43222,Hn.TAI),22),new Fi(new Zt(2446247,43223,Hn.TAI),23),new Fi(new Zt(2447161,43224,Hn.TAI),24),new Fi(new Zt(2447892,43225,Hn.TAI),25),new Fi(new Zt(2448257,43226,Hn.TAI),26),new Fi(new Zt(2448804,43227,Hn.TAI),27),new Fi(new Zt(2449169,43228,Hn.TAI),28),new Fi(new Zt(2449534,43229,Hn.TAI),29),new Fi(new Zt(2450083,43230,Hn.TAI),30),new Fi(new Zt(2450630,43231,Hn.TAI),31),new Fi(new Zt(2451179,43232,Hn.TAI),32),new Fi(new Zt(2453736,43233,Hn.TAI),33),new Fi(new Zt(2454832,43234,Hn.TAI),34),new Fi(new Zt(2456109,43235,Hn.TAI),35),new Fi(new Zt(2457204,43236,Hn.TAI),36),new Fi(new Zt(2457754,43237,Hn.TAI),37)];var te=Zt;var LLt=T(S(),1),Eq=T(id(),1);var A1t=T(S(),1);function a1e(e){return(e.length===0||e[e.length-1]!=="/")&&(e=`${e}/`),e}var PL=a1e;var k1t=T(S(),1);function gq(e,t){if(e===null||typeof e!="object")return e;t=y(t,!1);let n=new e.constructor;for(let i in e)if(e.hasOwnProperty(i)){let o=e[i];t&&(o=gq(o,t)),n[i]=o}return n}var Oe=gq;var Y1t=T(S(),1);function yq(e,t,n){n=y(n,!1);let i={},o=l(e),r=l(t),s,a,c;if(o)for(s in e)e.hasOwnProperty(s)&&(a=e[s],r&&n&&typeof a=="object"&&t.hasOwnProperty(s)?(c=t[s],typeof c=="object"?i[s]=yq(a,c,n):i[s]=a):i[s]=a);if(r)for(s in t)t.hasOwnProperty(s)&&!i.hasOwnProperty(s)&&(c=t[s],i[s]=c);return i}var xt=yq;var H1t=T(S(),1);function c1e(){let e,t,n=new Promise(function(i,o){e=i,t=o});return{resolve:e,reject:t,promise:n}}var fl=c1e;var Q1t=T(S(),1),xq=T(id(),1);function WB(e,t){let n;return typeof document<"u"&&(n=document),WB._implementation(e,t,n)}WB._implementation=function(e,t,n){if(!l(t)){if(typeof n>"u")return e;t=y(n.baseURI,n.location.href)}let i=new xq.default(e);return i.scheme()!==""?i.toString():i.absoluteTo(t).toString()};var Fh=WB;var q1t=T(S(),1),_q=T(id(),1);function l1e(e,t){let n="",i=e.lastIndexOf("/");return i!==-1&&(n=e.substring(0,i+1)),t&&(e=new _q.default(e),e.query().length!==0&&(n+=`?${e.query()}`),e.fragment().length!==0&&(n+=`#${e.fragment()}`)),n}var vL=l1e;var eVt=T(S(),1),Tq=T(id(),1);function d1e(e){let t=new Tq.default(e);t.normalize();let n=t.path(),i=n.lastIndexOf("/");return i!==-1&&(n=n.substr(i+1)),i=n.lastIndexOf("."),i===-1?n="":n=n.substr(i+1),n}var By=d1e;var iVt=T(S(),1);var Sq={};function u1e(e,t,n){l(t)||(t=e.width),l(n)||(n=e.height);let i=Sq[t];l(i)||(i={},Sq[t]=i);let o=i[n];if(!l(o)){let r=document.createElement("canvas");r.width=t,r.height=n,o=r.getContext("2d",{willReadFrequently:!0}),o.globalCompositeOperation="copy",i[n]=o}return o.drawImage(e,0,0,t,n),o.getImageData(0,0,t,n).data}var mm=u1e;var rVt=T(S(),1);var m1e=/^blob:/i;function h1e(e){return m1e.test(e)}var Yy=h1e;var cVt=T(S(),1);var Ah;function f1e(e){l(Ah)||(Ah=document.createElement("a")),Ah.href=window.location.href;let t=Ah.host,n=Ah.protocol;return Ah.href=e,Ah.href=Ah.href,n!==Ah.protocol||t!==Ah.host}var xb=f1e;var dVt=T(S(),1);var p1e=/^data:/i;function b1e(e){return p1e.test(e)}var rp=b1e;var mVt=T(S(),1);function g1e(e){let t=document.createElement("script");return t.async=!0,t.src=e,new Promise((n,i)=>{window.crossOriginIsolated&&t.setAttribute("crossorigin","anonymous");let o=document.getElementsByTagName("head")[0];t.onload=function(){t.onload=void 0,o.removeChild(t),n()},t.onerror=function(r){i(r)},o.appendChild(t)})}var Oy=g1e;var fVt=T(S(),1);function y1e(e){let t="";for(let n in e)if(e.hasOwnProperty(n)){let i=e[n],o=`${encodeURIComponent(n)}=`;if(Array.isArray(i))for(let r=0,s=i.length;r0){let s=o.substring(0,r),a=o.substring(r+2);t[s]=a}}return t}var wL=S1e;function Cq(e,t,n){this.statusCode=e,this.response=t,this.responseHeaders=n,typeof this.responseHeaders=="string"&&(this.responseHeaders=wL(this.responseHeaders))}Cq.prototype.toString=function(){let e="Request has failed.";return l(this.statusCode)&&(e+=` Status Code: ${this.statusCode}`),e};var Mh=Cq;var QVt=T(S(),1),vM=T(id(),1);var FVt=T(S(),1);function FL(){this._listeners=[],this._scopes=[],this._toRemove=[],this._insideRaiseEvent=!1}Object.defineProperties(FL.prototype,{numberOfListeners:{get:function(){return this._listeners.length-this._toRemove.length}}});FL.prototype.addEventListener=function(e,t){this._listeners.push(e),this._scopes.push(t);let n=this;return function(){n.removeEventListener(e,t)}};FL.prototype.removeEventListener=function(e,t){let n=this._listeners,i=this._scopes,o=-1;for(let r=0;r0){for(o.sort(C1e),e=0;e=0;--t)this.heapify(t)};zy.prototype.insert=function(e){let t=this._array,n=this._comparator,i=this._maximumLength,o=this._length++;for(oi&&(r=t[i],this._length=i),r};zy.prototype.pop=function(e){if(e=y(e,0),this._length===0)return;let t=this._array,n=t[e];return PB(t,e,--this._length),this.heapify(e),t[this._length]=void 0,n};var AL=zy;function V1e(e,t){return e.priority-t.priority}var Ji={numberOfAttemptedRequests:0,numberOfActiveRequests:0,numberOfCancelledRequests:0,numberOfCancelledActiveRequests:0,numberOfFailedRequests:0,numberOfActiveRequestsEver:0,lastNumberOfActiveRequests:0},XS=20,Ya=new AL({comparator:V1e});Ya.maximumLength=XS;Ya.reserve(XS);var Nh=[],sp={},L1e=typeof document<"u"?new vM.default(document.location.href):new vM.default,wM=new ge;function Oo(){}Oo.maximumRequests=50;Oo.maximumRequestsPerServer=18;Oo.requestsByServer={};Oo.throttleRequests=!0;Oo.debugShowStatistics=!1;Oo.requestCompletedEvent=wM;Object.defineProperties(Oo,{statistics:{get:function(){return Ji}},priorityHeapLength:{get:function(){return XS},set:function(e){if(ee;){let t=Ya.pop();Ky(t)}XS=e,Ya.maximumLength=e,Ya.reserve(e)}}});function Vq(e){l(e.priorityFunction)&&(e.priority=e.priorityFunction())}Oo.serverHasOpenSlots=function(e,t){t=y(t,1);let n=y(Oo.requestsByServer[e],Oo.maximumRequestsPerServer);return sp[e]+t<=n};Oo.heapHasOpenSlots=function(e){return Ya.length+e<=XS};function Lq(e){return e.state===Qn.UNISSUED&&(e.state=Qn.ISSUED,e.deferred=fl()),e.deferred.promise}function R1e(e){return function(t){if(e.state===Qn.CANCELLED)return;let n=e.deferred;--Ji.numberOfActiveRequests,--sp[e.serverKey],wM.raiseEvent(),e.state=Qn.RECEIVED,e.deferred=void 0,n.resolve(t)}}function Z1e(e){return function(t){e.state!==Qn.CANCELLED&&(++Ji.numberOfFailedRequests,--Ji.numberOfActiveRequests,--sp[e.serverKey],wM.raiseEvent(t),e.state=Qn.FAILED,e.deferred.reject(t))}}function Rq(e){let t=Lq(e);return e.state=Qn.ACTIVE,Nh.push(e),++Ji.numberOfActiveRequests,++Ji.numberOfActiveRequestsEver,++sp[e.serverKey],e.requestFunction().then(R1e(e)).catch(Z1e(e)),t}function Ky(e){let t=e.state===Qn.ACTIVE;if(e.state=Qn.CANCELLED,++Ji.numberOfCancelledRequests,l(e.deferred)){let n=e.deferred;e.deferred=void 0,n.reject()}t&&(--Ji.numberOfActiveRequests,--sp[e.serverKey],++Ji.numberOfCancelledActiveRequests),l(e.cancelFunction)&&e.cancelFunction()}Oo.update=function(){let e,t,n=0,i=Nh.length;for(e=0;e0&&(Nh[e-n]=t)}Nh.length-=n;let o=Ya.internalArray,r=Ya.length;for(e=0;e0;){if(t=Ya.pop(),t.cancelled){Ky(t);continue}if(t.throttleByServer&&!Oo.serverHasOpenSlots(t.serverKey)){Ky(t);continue}Rq(t),++a}G1e()};Oo.getServerKey=function(e){let t=new vM.default(e);t.scheme()===""&&(t=t.absoluteTo(L1e),t.normalize());let n=t.authority();/:/.test(n)||(n=`${n}:${t.scheme()==="https"?"443":"80"}`);let i=sp[n];return l(i)||(sp[n]=0),n};Oo.request=function(e){if(rp(e.url)||Yy(e.url))return wM.raiseEvent(),e.state=Qn.RECEIVED,e.requestFunction();if(++Ji.numberOfAttemptedRequests,l(e.serverKey)||(e.serverKey=Oo.getServerKey(e.url)),Oo.throttleRequests&&e.throttleByServer&&!Oo.serverHasOpenSlots(e.serverKey))return;if(!Oo.throttleRequests||!e.throttle)return Rq(e);if(Nh.length>=Oo.maximumRequests)return;Vq(e);let t=Ya.insert(e);if(l(t)){if(t===e)return;Ky(t)}return Lq(e)};function G1e(){Oo.debugShowStatistics&&(Ji.numberOfActiveRequests===0&&Ji.lastNumberOfActiveRequests>0&&(Ji.numberOfAttemptedRequests>0&&(console.log(`Number of attempted requests: ${Ji.numberOfAttemptedRequests}`),Ji.numberOfAttemptedRequests=0),Ji.numberOfCancelledRequests>0&&(console.log(`Number of cancelled requests: ${Ji.numberOfCancelledRequests}`),Ji.numberOfCancelledRequests=0),Ji.numberOfCancelledActiveRequests>0&&(console.log(`Number of cancelled active requests: ${Ji.numberOfCancelledActiveRequests}`),Ji.numberOfCancelledActiveRequests=0),Ji.numberOfFailedRequests>0&&(console.log(`Number of failed requests: ${Ji.numberOfFailedRequests}`),Ji.numberOfFailedRequests=0)),Ji.lastNumberOfActiveRequests=Ji.numberOfActiveRequests)}Oo.clearForSpecs=function(){for(;Ya.length>0;){let t=Ya.pop();Ky(t)}let e=Nh.length;for(let t=0;t0}},credits:{get:function(){return this._credits}}});Lt.prototype.toString=function(){return this.getUrlComponent(!0,!0)};Lt.prototype.parseUrl=function(e,t,n,i){let o=new Eq.default(e),r=X1e(o.query());this._queryParameters=t?AM(r,this.queryParameters,n):r,o.search(""),o.fragment(""),l(i)&&o.scheme()===""&&(o=o.absoluteTo(Fh(i))),this._url=o.toString()};function X1e(e){return e.length===0?{}:e.indexOf("=")===-1?{[e]:void 0}:od(e)}function AM(e,t,n){if(!n)return xt(e,t);let i=Oe(e,!0);for(let o in t)if(t.hasOwnProperty(o)){let r=i[o],s=t[o];l(r)?(Array.isArray(r)||(r=i[o]=[r]),i[o]=r.concat(s)):i[o]=Array.isArray(s)?s.slice():s}return i}Lt.prototype.getUrlComponent=function(e,t){if(this.isDataUri)return this._url;let n=this._url;e&&(n=`${n}${I1e(this.queryParameters)}`),n=n.replace(/%7B/g,"{").replace(/%7D/g,"}");let i=this._templateValues;return Object.keys(i).length>0&&(n=n.replace(/{(.*?)}/g,function(o,r){let s=i[r];return l(s)?encodeURIComponent(s):o})),t&&l(this.proxy)&&(n=this.proxy.getURL(n)),n};function I1e(e){let t=Object.keys(e);return t.length===0?"":t.length===1&&!l(e[t[0]])?`?${t[0]}`:`?${Hy(e)}`}Lt.prototype.setQueryParameters=function(e,t){t?this._queryParameters=AM(this._queryParameters,e,!1):this._queryParameters=AM(e,this._queryParameters,!1)};Lt.prototype.appendQueryParameters=function(e){this._queryParameters=AM(e,this._queryParameters,!0)};Lt.prototype.setTemplateValues=function(e,t){t?this._templateValues=xt(this._templateValues,e):this._templateValues=xt(e,this._templateValues)};Lt.prototype.getDerivedResource=function(e){let t=this.clone();if(t._retryCount=0,l(e.url)){let n=y(e.preserveQueryParameters,!1);t.parseUrl(e.url,!0,n,this._url)}return l(e.queryParameters)&&(t._queryParameters=xt(e.queryParameters,t.queryParameters)),l(e.templateValues)&&(t._templateValues=xt(e.templateValues,t.templateValues)),l(e.headers)&&(t.headers=xt(e.headers,t.headers)),l(e.proxy)&&(t.proxy=e.proxy),l(e.request)&&(t.request=e.request),l(e.retryCallback)&&(t.retryCallback=e.retryCallback),l(e.retryAttempts)&&(t.retryAttempts=e.retryAttempts),t};Lt.prototype.retryOnError=function(e){let t=this.retryCallback;if(typeof t!="function"||this._retryCount>=this.retryAttempts)return Promise.resolve(!1);let n=this;return Promise.resolve(t(this,e)).then(function(i){return++n._retryCount,i})};Lt.prototype.clone=function(e){return l(e)?(e._url=this._url,e._queryParameters=Oe(this._queryParameters),e._templateValues=Oe(this._templateValues),e.headers=Oe(this.headers),e.proxy=this.proxy,e.retryCallback=this.retryCallback,e.retryAttempts=this.retryAttempts,e._retryCount=0,e.request=this.request.clone(),e):new Lt({url:this._url,queryParameters:this.queryParameters,templateValues:this.templateValues,headers:this.headers,proxy:this.proxy,retryCallback:this.retryCallback,retryAttempts:this.retryAttempts,request:this.request.clone(),parseUrl:!1,credits:l(this.credits)?this.credits.slice():void 0})};Lt.prototype.getBaseUri=function(e){return vL(this.getUrlComponent(e),e)};Lt.prototype.appendForwardSlash=function(){this._url=PL(this._url)};Lt.prototype.fetchArrayBuffer=function(){return this.fetch({responseType:"arraybuffer"})};Lt.fetchArrayBuffer=function(e){return new Lt(e).fetchArrayBuffer()};Lt.prototype.fetchBlob=function(){return this.fetch({responseType:"blob"})};Lt.fetchBlob=function(e){return new Lt(e).fetchBlob()};Lt.prototype.fetchImage=function(e){e=y(e,y.EMPTY_OBJECT);let t=y(e.preferImageBitmap,!1),n=y(e.preferBlob,!1),i=y(e.flipY,!1),o=y(e.skipColorSpaceConversion,!1);if(wB(this.request),!Xq||this.isDataUri||this.isBlobUri||!this.hasHeaders&&!n)return vB({resource:this,flipY:i,skipColorSpaceConversion:o,preferImageBitmap:t});let r=this.fetchBlob();if(!l(r))return;let s,a,c,d;return Lt.supportsImageBitmapOptions().then(function(u){return s=u,a=s&&t,r}).then(function(u){if(!l(u))return;if(d=u,a)return Lt.createImageBitmapFromBlob(u,{flipY:i,premultiplyAlpha:!1,skipColorSpaceConversion:o});let m=window.URL.createObjectURL(u);return c=new Lt({url:m}),vB({resource:c,flipY:i,skipColorSpaceConversion:o,preferImageBitmap:!1})}).then(function(u){if(l(u))return u.blob=d,a||window.URL.revokeObjectURL(c.url),u}).catch(function(u){return l(c)&&window.URL.revokeObjectURL(c.url),u.blob=d,Promise.reject(u)})};function vB(e){let t=e.resource,n=e.flipY,i=e.skipColorSpaceConversion,o=e.preferImageBitmap,r=t.request;r.url=t.url,r.requestFunction=function(){let a=!1;!t.isDataUri&&!t.isBlobUri&&(a=t.isCrossOriginUrl);let c=fl();return Lt._Implementations.createImage(r,a,c,n,i,o),c.promise};let s=Oa.request(r);if(l(s))return s.catch(function(a){return r.state!==Qn.FAILED?Promise.reject(a):t.retryOnError(a).then(function(c){return c?(r.state=Qn.UNISSUED,r.deferred=void 0,vB({resource:t,flipY:n,skipColorSpaceConversion:i,preferImageBitmap:o})):Promise.reject(a)})})}Lt.fetchImage=function(e){return new Lt(e).fetchImage({flipY:e.flipY,skipColorSpaceConversion:e.skipColorSpaceConversion,preferBlob:e.preferBlob,preferImageBitmap:e.preferImageBitmap})};Lt.prototype.fetchText=function(){return this.fetch({responseType:"text"})};Lt.fetchText=function(e){return new Lt(e).fetchText()};Lt.prototype.fetchJson=function(){let e=this.fetch({responseType:"text",headers:{Accept:"application/json,*/*;q=0.01"}});if(l(e))return e.then(function(t){if(l(t))return JSON.parse(t)})};Lt.fetchJson=function(e){return new Lt(e).fetchJson()};Lt.prototype.fetchXML=function(){return this.fetch({responseType:"document",overrideMimeType:"text/xml"})};Lt.fetchXML=function(e){return new Lt(e).fetchXML()};Lt.prototype.fetchJsonp=function(e){e=y(e,"callback"),wB(this.request);let t;do t=`loadJsonp${W.nextRandomNumber().toString().substring(2,8)}`;while(l(window[t]));return Iq(this,e,t)};function Iq(e,t,n){let i={};i[t]=n,e.setQueryParameters(i);let o=e.request,r=e.url;o.url=r,o.requestFunction=function(){let a=fl();return window[n]=function(c){a.resolve(c);try{delete window[n]}catch{window[n]=void 0}},Lt._Implementations.loadAndExecuteScript(r,n,a),a.promise};let s=Oa.request(o);if(l(s))return s.catch(function(a){return o.state!==Qn.FAILED?Promise.reject(a):e.retryOnError(a).then(function(c){return c?(o.state=Qn.UNISSUED,o.deferred=void 0,Iq(e,t,n)):Promise.reject(a)})})}Lt.fetchJsonp=function(e){return new Lt(e).fetchJsonp(e.callbackParameterName)};Lt.prototype._makeRequest=function(e){let t=this;wB(t.request);let n=t.request,i=t.url;n.url=i,n.requestFunction=function(){let r=e.responseType,s=xt(e.headers,t.headers),a=e.overrideMimeType,c=e.method,d=e.data,u=fl(),m=Lt._Implementations.loadWithXhr(i,r,c,d,s,u,a);return l(m)&&l(m.abort)&&(n.cancelFunction=function(){m.abort()}),u.promise};let o=Oa.request(n);if(l(o))return o.then(function(r){return n.cancelFunction=void 0,r}).catch(function(r){return n.cancelFunction=void 0,n.state!==Qn.FAILED?Promise.reject(r):t.retryOnError(r).then(function(s){return s?(n.state=Qn.UNISSUED,n.deferred=void 0,t.fetch(e)):Promise.reject(r)})})};function wB(e){if(e.state===Qn.ISSUED||e.state===Qn.ACTIVE)throw new ue("The Resource is already being fetched.");e.state=Qn.UNISSUED,e.deferred=void 0}var W1e=/^data:(.*?)(;base64)?,(.*)$/;function FM(e,t){let n=decodeURIComponent(t);return e?atob(n):n}function Gq(e,t){let n=FM(e,t),i=new ArrayBuffer(n.length),o=new Uint8Array(i);for(let r=0;r{if(!a.ok){let c={};a.headers.forEach((d,u)=>{c[u]=d}),r.reject(new Mh(a.status,a,c));return}switch(t){case"text":r.resolve(a.text());break;case"json":r.resolve(a.json());break;default:r.resolve(new Uint8Array(await a.arrayBuffer()).buffer);break}}).catch(()=>{r.reject(new Mh)})}var w1e=typeof XMLHttpRequest>"u";Lt._Implementations.loadWithXhr=function(e,t,n,i,o,r,s){let a=W1e.exec(e);if(a!==null){r.resolve(P1e(a,t));return}if(w1e){v1e(e,t,n,i,o,r,s);return}let c=new XMLHttpRequest;if(WS.contains(e)&&(c.withCredentials=!0),c.open(n,e,!0),l(s)&&l(c.overrideMimeType)&&c.overrideMimeType(s),l(o))for(let u in o)o.hasOwnProperty(u)&&c.setRequestHeader(u,o[u]);l(t)&&(c.responseType=t);let d=!1;return typeof e=="string"&&(d=e.indexOf("file://")===0||typeof window<"u"&&window.location.origin==="file://"),c.onload=function(){if((c.status<200||c.status>=300)&&!(d&&c.status===0)){r.reject(new Mh(c.status,c.response,c.getAllResponseHeaders()));return}let u=c.response,m=c.responseType;if(n==="HEAD"||n==="OPTIONS"){let g=c.getAllResponseHeaders().trim().split(/[\r\n]+/),f={};g.forEach(function(x){let _=x.split(": "),C=_.shift();f[C]=_.join(": ")}),r.resolve(f);return}if(c.status===204)r.resolve(void 0);else if(l(u)&&(!l(t)||m===t))r.resolve(u);else if(t==="json"&&typeof u=="string")try{r.resolve(JSON.parse(u))}catch(p){r.reject(p)}else(m===""||m==="document")&&l(c.responseXML)&&c.responseXML.hasChildNodes()?r.resolve(c.responseXML):(m===""||m==="text")&&l(c.responseText)?r.resolve(c.responseText):r.reject(new ue("Invalid XMLHttpRequest response type."))},c.onerror=function(u){r.reject(new Mh)},c.send(i),c};Lt._Implementations.loadAndExecuteScript=function(e,t,n){return Oy(e,t).catch(function(i){n.reject(i)})};Lt._DefaultImplementations={};Lt._DefaultImplementations.createImage=Lt._Implementations.createImage;Lt._DefaultImplementations.loadWithXhr=Lt._Implementations.loadWithXhr;Lt._DefaultImplementations.loadAndExecuteScript=Lt._Implementations.loadAndExecuteScript;Lt.DEFAULT=Object.freeze(new Lt({url:typeof document>"u"?"":document.location.href.split("?")[0]}));var Ee=Lt;function kL(e){e=y(e,y.EMPTY_OBJECT),this._dates=void 0,this._samples=void 0,this._dateColumn=-1,this._xPoleWanderRadiansColumn=-1,this._yPoleWanderRadiansColumn=-1,this._ut1MinusUtcSecondsColumn=-1,this._xCelestialPoleOffsetRadiansColumn=-1,this._yCelestialPoleOffsetRadiansColumn=-1,this._taiMinusUtcSecondsColumn=-1,this._columnCount=0,this._lastIndex=-1,this._addNewLeapSeconds=y(e.addNewLeapSeconds,!0),l(e.data)?Wq(this,e.data):Wq(this,{columnNames:["dateIso8601","modifiedJulianDateUtc","xPoleWanderRadians","yPoleWanderRadians","ut1MinusUtcSeconds","lengthOfDayCorrectionSeconds","xCelestialPoleOffsetRadians","yCelestialPoleOffsetRadians","taiMinusUtcSeconds"],samples:[]})}kL.fromUrl=async function(e,t){t=y(t,y.EMPTY_OBJECT);let n=Ee.createIfNeeded(e),i;try{i=await n.fetchJson()}catch{throw new ue(`An error occurred while retrieving the EOP data from the URL ${n.url}.`)}return new kL({addNewLeapSeconds:t.addNewLeapSeconds,data:i})};kL.NONE=Object.freeze({compute:function(e,t){return l(t)?(t.xPoleWander=0,t.yPoleWander=0,t.xPoleOffset=0,t.yPoleOffset=0,t.ut1MinusUtc=0):t=new gb(0,0,0,0,0),t}});kL.prototype.compute=function(e,t){if(!l(this._samples))return;if(l(t)||(t=new gb(0,0,0,0,0)),this._samples.length===0)return t.xPoleWander=0,t.yPoleWander=0,t.xPoleOffset=0,t.yPoleOffset=0,t.ut1MinusUtc=0,t;let n=this._dates,i=this._lastIndex,o=0,r=0;if(l(i)){let a=n[i],c=n[i+1],d=te.lessThanOrEquals(a,e),u=!l(c),m=u||te.greaterThanOrEquals(c,e);if(d&&m)return o=i,!u&&c.equals(e)&&++o,r=o+1,vq(this,n,this._samples,e,o,r,t),t}let s=Ro(n,e,te.compare,this._dateColumn);return s>=0?(st.length-1)return s.xPoleWander=0,s.yPoleWander=0,s.xPoleOffset=0,s.yPoleOffset=0,s.ut1MinusUtc=0,s;let c=t[o],d=t[r];if(c.equals(d)||i.equals(c))return Pq(e,n,o,a,s),s;if(i.equals(d))return Pq(e,n,r,a,s),s;let u=te.secondsDifference(i,c)/te.secondsDifference(d,c),m=o*a,p=r*a,g=n[m+e._ut1MinusUtcSecondsColumn],f=n[p+e._ut1MinusUtcSecondsColumn],x=f-g;if(x>.5||x<-.5){let _=n[m+e._taiMinusUtcSecondsColumn],C=n[p+e._taiMinusUtcSecondsColumn];_!==C&&(d.equals(i)?g=f:f-=C-_)}return s.xPoleWander=NL(u,n[m+e._xPoleWanderRadiansColumn],n[p+e._xPoleWanderRadiansColumn]),s.yPoleWander=NL(u,n[m+e._yPoleWanderRadiansColumn],n[p+e._yPoleWanderRadiansColumn]),s.xPoleOffset=NL(u,n[m+e._xCelestialPoleOffsetRadiansColumn],n[p+e._xCelestialPoleOffsetRadiansColumn]),s.yPoleOffset=NL(u,n[m+e._yCelestialPoleOffsetRadiansColumn],n[p+e._yCelestialPoleOffsetRadiansColumn]),s.ut1MinusUtc=NL(u,g,f),s}var UL=kL;var DLt=T(S(),1);function Ha(e,t,n){this.heading=y(e,0),this.pitch=y(t,0),this.roll=y(n,0)}Ha.fromQuaternion=function(e,t){l(t)||(t=new Ha);let n=2*(e.w*e.y-e.z*e.x),i=1-2*(e.x*e.x+e.y*e.y),o=2*(e.w*e.x+e.y*e.z),r=1-2*(e.y*e.y+e.z*e.z),s=2*(e.w*e.z+e.x*e.y);return t.heading=-Math.atan2(s,r),t.roll=Math.atan2(o,i),t.pitch=-W.asinClamped(n),t};Ha.fromDegrees=function(e,t,n,i){return l(i)||(i=new Ha),i.heading=e*W.RADIANS_PER_DEGREE,i.pitch=t*W.RADIANS_PER_DEGREE,i.roll=n*W.RADIANS_PER_DEGREE,i};Ha.clone=function(e,t){if(l(e))return l(t)?(t.heading=e.heading,t.pitch=e.pitch,t.roll=e.roll,t):new Ha(e.heading,e.pitch,e.roll)};Ha.equals=function(e,t){return e===t||l(e)&&l(t)&&e.heading===t.heading&&e.pitch===t.pitch&&e.roll===t.roll};Ha.equalsEpsilon=function(e,t,n,i){return e===t||l(e)&&l(t)&&W.equalsEpsilon(e.heading,t.heading,n,i)&&W.equalsEpsilon(e.pitch,t.pitch,n,i)&&W.equalsEpsilon(e.roll,t.roll,n,i)};Ha.prototype.clone=function(e){return Ha.clone(this,e)};Ha.prototype.equals=function(e){return Ha.equals(this,e)};Ha.prototype.equalsEpsilon=function(e,t,n){return Ha.equalsEpsilon(this,e,t,n)};Ha.prototype.toString=function(){return`(${this.heading}, ${this.pitch}, ${this.roll})`};var za=Ha;var rRt=T(S(),1);var zLt=T(S(),1);var wq={};var Fq=/((?:.*\/)|^)Cesium\.js(?:\?|\#|$)/;function A1e(){let e=document.getElementsByTagName("script");for(let t=0,n=e.length;t"u"?e:(l(MM)||(MM=document.createElement("a")),MM.href=e,MM.href)}var Jy;function Mq(){if(l(Jy))return Jy;let e;return typeof CESIUM_BASE_URL<"u"?e=CESIUM_BASE_URL:l(wq?.url)?e=Fh(".",wq.url):typeof define=="object"&&l(define.amd)&&!define.amd.toUrlUndefined&&l(xM.toUrl)?e=Fh("..",Qy("Core/buildModuleUrl.js")):e=A1e(),Jy=new Ee({url:Aq(e)}),Jy.appendForwardSlash(),Jy}function M1e(e){return Aq(xM.toUrl(`../${e}`))}function Nq(e){return Mq().getDerivedResource({url:e}).url}var NM;function Qy(e){return l(NM)||(typeof define=="object"&&l(define.amd)&&!define.amd.toUrlUndefined&&l(xM.toUrl)?NM=M1e:NM=Nq),NM(e)}Qy._cesiumScriptRegex=Fq;Qy._buildModuleUrlFromBaseUrl=Nq;Qy._clearBaseResource=function(){Jy=void 0};Qy.setBaseUrl=function(e){Jy=Ee.DEFAULT.getDerivedResource({url:e})};Qy.getCesiumBaseUrl=Mq;var tn=Qy;var QLt=T(S(),1);function N1e(e,t,n){this.x=e,this.y=t,this.s=n}var jy=N1e;function MB(e){e=y(e,y.EMPTY_OBJECT),this._xysFileUrlTemplate=Ee.createIfNeeded(e.xysFileUrlTemplate),this._interpolationOrder=y(e.interpolationOrder,9),this._sampleZeroJulianEphemerisDate=y(e.sampleZeroJulianEphemerisDate,24423965e-1),this._sampleZeroDateTT=new te(this._sampleZeroJulianEphemerisDate,0,Hn.TAI),this._stepSizeDays=y(e.stepSizeDays,1),this._samplesPerXysFile=y(e.samplesPerXysFile,1e3),this._totalSamples=y(e.totalSamples,27426),this._samples=new Array(this._totalSamples*3),this._chunkDownloadsInProgress=[];let t=this._interpolationOrder,n=this._denominators=new Array(t+1),i=this._xTable=new Array(t+1),o=Math.pow(this._stepSizeDays,t);for(let r=0;r<=t;++r){n[r]=o,i[r]=r*this._stepSizeDays;for(let s=0;s<=t;++s)s!==r&&(n[r]*=r-s);n[r]=1/n[r]}this._work=new Array(t+1),this._coef=new Array(t+1)}var k1e=new te(0,0,Hn.TAI);function FB(e,t,n){let i=k1e;return i.dayNumber=t,i.secondsOfDay=n,te.daysDifference(i,e._sampleZeroDateTT)}MB.prototype.preload=function(e,t,n,i){let o=FB(this,e,t),r=FB(this,n,i),s=o/this._stepSizeDays-this._interpolationOrder/2|0;s<0&&(s=0);let a=r/this._stepSizeDays-this._interpolationOrder/2|0+this._interpolationOrder;a>=this._totalSamples&&(a=this._totalSamples-1);let c=s/this._samplesPerXysFile|0,d=a/this._samplesPerXysFile|0,u=[];for(let m=c;m<=d;++m)u.push(AB(this,m));return Promise.all(u)};MB.prototype.computeXysRadians=function(e,t,n){let i=FB(this,e,t);if(i<0)return;let o=i/this._stepSizeDays|0;if(o>=this._totalSamples)return;let r=this._interpolationOrder,s=o-(r/2|0);s<0&&(s=0);let a=s+r;a>=this._totalSamples&&(a=this._totalSamples-1,s=a-r,s<0&&(s=0));let c=!1,d=this._samples;if(l(d[s*3])||(AB(this,s/this._samplesPerXysFile|0),c=!0),l(d[a*3])||(AB(this,a/this._samplesPerXysFile|0),c=!0),c)return;l(n)?(n.x=0,n.y=0,n.s=0):n=new jy(0,0,0);let u=i-s*this._stepSizeDays,m=this._work,p=this._denominators,g=this._coef,f=this._xTable,x,_;for(x=0;x<=r;++x)m[x]=u-f[x];for(x=0;x<=r;++x){for(g[x]=1,_=0;_<=r;++_)_!==x&&(g[x]*=m[_]);g[x]*=p[x];let C=(s+x)*3;n.x+=g[x]*d[C++],n.y+=g[x]*d[C++],n.s+=g[x]*d[C]}return n};function AB(e,t){if(e._chunkDownloadsInProgress[t])return e._chunkDownloadsInProgress[t];let n,i=e._xysFileUrlTemplate;l(i)?n=i.getDerivedResource({templateValues:{0:t}}):n=new Ee({url:tn(`Assets/IAU2006_XYS/IAU2006_XYS_${t}.json`)});let o=n.fetchJson().then(function(r){e._chunkDownloadsInProgress[t]=!1;let s=e._samples,a=r.samples,c=t*e._samplesPerXysFile*3;for(let d=0,u=a.length;d{let t=new Image;t.onload=function(){Wc._result=t.width>0&&t.height>0,e(Wc._result)},t.onerror=function(){Wc._result=!1,e(Wc._result)},t.src="data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA"})),Wc._promise};Object.defineProperties(Wc,{initialized:{get:function(){return l(Wc._result)}}});var vS=[];typeof ArrayBuffer<"u"&&(vS.push(Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array),typeof Uint8ClampedArray<"u"&&vS.push(Uint8ClampedArray),typeof Uint8ClampedArray<"u"&&vS.push(Uint8ClampedArray),typeof BigInt64Array<"u"&&vS.push(BigInt64Array),typeof BigUint64Array<"u"&&vS.push(BigUint64Array));var nu={isChrome:YB,chromeVersion:U1e,isSafari:Dq,safariVersion:D1e,isWebkit:Bq,webkitVersion:B1e,isInternetExplorer:Yq,internetExplorerVersion:Y1e,isEdge:HM,edgeVersion:O1e,isFirefox:zM,firefoxVersion:K1e,isWindows:H1e,isIPadOrIOS:z1e,hardwareConcurrency:y(Ka.hardwareConcurrency,3),supportsPointerEvents:J1e,supportsImageRenderingPixelated:zq,supportsWebP:Wc,imageRenderingValue:Q1e,typedArrayTypes:vS};nu.supportsBasis=function(e){return nu.supportsWebAssembly()&&e.context.supportsBasis};nu.supportsFullscreen=function(){return ur.supportsFullscreen()};nu.supportsTypedArrays=function(){return typeof ArrayBuffer<"u"};nu.supportsBigInt64Array=function(){return typeof BigInt64Array<"u"};nu.supportsBigUint64Array=function(){return typeof BigUint64Array<"u"};nu.supportsBigInt=function(){return typeof BigInt<"u"};nu.supportsWebWorkers=function(){return typeof Worker<"u"};nu.supportsWebAssembly=function(){return typeof WebAssembly<"u"};nu.supportsWebgl2=function(e){return e.context.webgl2};nu.supportsEsmWebWorkers=function(){return!zM()||parseInt(OB)>=114};var Yt=nu;function st(e,t,n,i){this.x=y(e,0),this.y=y(t,0),this.z=y(n,0),this.w=y(i,0)}var YL=new h;st.fromAxisAngle=function(e,t,n){let i=t/2,o=Math.sin(i);YL=h.normalize(e,YL);let r=YL.x*o,s=YL.y*o,a=YL.z*o,c=Math.cos(i);return l(n)?(n.x=r,n.y=s,n.z=a,n.w=c,n):new st(r,s,a,c)};var j1e=[1,2,0],q1e=new Array(3);st.fromRotationMatrix=function(e,t){let n,i,o,r,s,a=e[$.COLUMN0ROW0],c=e[$.COLUMN1ROW1],d=e[$.COLUMN2ROW2],u=a+c+d;if(u>0)n=Math.sqrt(u+1),s=.5*n,n=.5/n,i=(e[$.COLUMN1ROW2]-e[$.COLUMN2ROW1])*n,o=(e[$.COLUMN2ROW0]-e[$.COLUMN0ROW2])*n,r=(e[$.COLUMN0ROW1]-e[$.COLUMN1ROW0])*n;else{let m=j1e,p=0;c>a&&(p=1),d>a&&d>c&&(p=2);let g=m[p],f=m[g];n=Math.sqrt(e[$.getElementIndex(p,p)]-e[$.getElementIndex(g,g)]-e[$.getElementIndex(f,f)]+1);let x=q1e;x[p]=.5*n,n=.5/n,s=(e[$.getElementIndex(f,g)]-e[$.getElementIndex(g,f)])*n,x[g]=(e[$.getElementIndex(g,p)]+e[$.getElementIndex(p,g)])*n,x[f]=(e[$.getElementIndex(f,p)]+e[$.getElementIndex(p,f)])*n,i=-x[0],o=-x[1],r=-x[2]}return l(t)?(t.x=i,t.y=o,t.z=r,t.w=s,t):new st(i,o,r,s)};var Kq=new st,Jq=new st,HB=new st,Qq=new st;st.fromHeadingPitchRoll=function(e,t){return Qq=st.fromAxisAngle(h.UNIT_X,e.roll,Kq),HB=st.fromAxisAngle(h.UNIT_Y,-e.pitch,t),t=st.multiply(HB,Qq,HB),Jq=st.fromAxisAngle(h.UNIT_Z,-e.heading,Kq),st.multiply(Jq,t,t)};var KM=new h,zB=new h,hm=new st,jq=new st,JM=new st;st.packedLength=4;st.pack=function(e,t,n){return n=y(n,0),t[n++]=e.x,t[n++]=e.y,t[n++]=e.z,t[n]=e.w,t};st.unpack=function(e,t,n){return t=y(t,0),l(n)||(n=new st),n.x=e[t],n.y=e[t+1],n.z=e[t+2],n.w=e[t+3],n};st.packedInterpolationLength=3;st.convertPackedArrayForInterpolation=function(e,t,n,i){st.unpack(e,n*4,JM),st.conjugate(JM,JM);for(let o=0,r=n-t+1;o=0?r=1:(r=-1,o=-o);let s=o-1,a=1-n,c=n*n,d=a*a;for(let g=7;g>=0;--g)ap[g]=(QM[g]*c-jM[g])*s,cp[g]=(QM[g]*d-jM[g])*s;let u=r*n*(1+ap[0]*(1+ap[1]*(1+ap[2]*(1+ap[3]*(1+ap[4]*(1+ap[5]*(1+ap[6]*(1+ap[7])))))))),m=a*(1+cp[0]*(1+cp[1]*(1+cp[2]*(1+cp[3]*(1+cp[4]*(1+cp[5]*(1+cp[6]*(1+cp[7])))))))),p=st.multiplyByScalar(e,m,tVe);return st.multiplyByScalar(t,u,i),st.add(p,i,i)};st.fastSquad=function(e,t,n,i,o,r){let s=st.fastSlerp(e,t,o,OL),a=st.fastSlerp(n,i,o,wS);return st.fastSlerp(s,a,2*o*(1-o),r)};st.equals=function(e,t){return e===t||l(e)&&l(t)&&e.x===t.x&&e.y===t.y&&e.z===t.z&&e.w===t.w};st.equalsEpsilon=function(e,t,n){return n=y(n,0),e===t||l(e)&&l(t)&&Math.abs(e.x-t.x)<=n&&Math.abs(e.y-t.y)<=n&&Math.abs(e.z-t.z)<=n&&Math.abs(e.w-t.w)<=n};st.ZERO=Object.freeze(new st(0,0,0,0));st.IDENTITY=Object.freeze(new st(0,0,0,1));st.prototype.clone=function(e){return st.clone(this,e)};st.prototype.equals=function(e){return st.equals(this,e)};st.prototype.equalsEpsilon=function(e,t){return st.equalsEpsilon(this,e,t)};st.prototype.toString=function(){return`(${this.x}, ${this.y}, ${this.z}, ${this.w})`};var we=st;var Oi={},jB={up:{south:"east",north:"west",west:"south",east:"north"},down:{south:"west",north:"east",west:"north",east:"south"},south:{up:"west",down:"east",west:"down",east:"up"},north:{up:"east",down:"west",west:"up",east:"down"},west:{up:"north",down:"south",north:"down",south:"up"},east:{up:"south",down:"north",north:"up",south:"down"}},FS={north:[-1,0,0],east:[0,1,0],up:[0,0,1],south:[1,0,0],west:[0,-1,0],down:[0,0,-1]},qB={},bl={east:new h,north:new h,up:new h,west:new h,south:new h,down:new h},Tb=new h,Sb=new h,Cb=new h;Oi.localFrameToFixedFrameGenerator=function(e,t){if(!jB.hasOwnProperty(e)||!jB[e].hasOwnProperty(t))throw new fe("firstAxis and secondAxis must be east, north, up, west, south or down.");let n=jB[e][t],i,o=e+t;return l(qB[o])?i=qB[o]:(i=function(r,s,a){if(l(a)||(a=new M),h.equalsEpsilon(r,h.ZERO,W.EPSILON14))h.unpack(FS[e],0,Tb),h.unpack(FS[t],0,Sb),h.unpack(FS[n],0,Cb);else if(W.equalsEpsilon(r.x,0,W.EPSILON14)&&W.equalsEpsilon(r.y,0,W.EPSILON14)){let c=W.sign(r.z);h.unpack(FS[e],0,Tb),e!=="east"&&e!=="west"&&h.multiplyByScalar(Tb,c,Tb),h.unpack(FS[t],0,Sb),t!=="east"&&t!=="west"&&h.multiplyByScalar(Sb,c,Sb),h.unpack(FS[n],0,Cb),n!=="east"&&n!=="west"&&h.multiplyByScalar(Cb,c,Cb)}else{s=y(s,ie.WGS84),s.geodeticSurfaceNormal(r,bl.up);let c=bl.up,d=bl.east;d.x=-r.y,d.y=r.x,d.z=0,h.normalize(d,bl.east),h.cross(c,d,bl.north),h.multiplyByScalar(bl.up,-1,bl.down),h.multiplyByScalar(bl.east,-1,bl.west),h.multiplyByScalar(bl.north,-1,bl.south),Tb=bl[e],Sb=bl[t],Cb=bl[n]}return a[0]=Tb.x,a[1]=Tb.y,a[2]=Tb.z,a[3]=0,a[4]=Sb.x,a[5]=Sb.y,a[6]=Sb.z,a[7]=0,a[8]=Cb.x,a[9]=Cb.y,a[10]=Cb.z,a[11]=0,a[12]=r.x,a[13]=r.y,a[14]=r.z,a[15]=1,a},qB[o]=i),i};Oi.eastNorthUpToFixedFrame=Oi.localFrameToFixedFrameGenerator("east","north");Oi.northEastDownToFixedFrame=Oi.localFrameToFixedFrameGenerator("north","east");Oi.northUpEastToFixedFrame=Oi.localFrameToFixedFrameGenerator("north","up");Oi.northWestUpToFixedFrame=Oi.localFrameToFixedFrameGenerator("north","west");var nVe=new we,iVe=new h(1,1,1),oVe=new M;Oi.headingPitchRollToFixedFrame=function(e,t,n,i,o){i=y(i,Oi.eastNorthUpToFixedFrame);let r=we.fromHeadingPitchRoll(t,nVe),s=M.fromTranslationQuaternionRotationScale(h.ZERO,r,iVe,oVe);return o=i(e,n,o),M.multiply(o,s,o)};var rVe=new M,sVe=new $;Oi.headingPitchRollQuaternion=function(e,t,n,i,o){let r=Oi.headingPitchRollToFixedFrame(e,t,n,i,rVe),s=M.getMatrix3(r,sVe);return we.fromRotationMatrix(s,o)};var aVe=new h(1,1,1),cVe=new h,e$=new M,lVe=new M,dVe=new $,uVe=new we;Oi.fixedFrameToHeadingPitchRoll=function(e,t,n,i){t=y(t,ie.WGS84),n=y(n,Oi.eastNorthUpToFixedFrame),l(i)||(i=new za);let o=M.getTranslation(e,cVe);if(h.equals(o,h.ZERO))return i.heading=0,i.pitch=0,i.roll=0,i;let r=M.inverseTransformation(n(o,t,e$),e$),s=M.setScale(e,aVe,lVe);s=M.setTranslation(s,h.ZERO,s),r=M.multiply(r,s,r);let a=we.fromRotationMatrix(M.getMatrix3(r,dVe),uVe);return a=we.normalize(a,a),za.fromQuaternion(a,i)};var mVe=6*3600+41*60+50.54841,hVe=8640184812866e-6,fVe=.093104,pVe=-62e-7,bVe=11772758384668e-32,gVe=72921158553e-15,yVe=W.TWO_PI/86400,qM=new te;Oi.computeTemeToPseudoFixedMatrix=function(e,t){qM=te.addSeconds(e,-te.computeTaiMinusUtc(e),qM);let n=qM.dayNumber,i=qM.secondsOfDay,o,r=n-2451545;i>=43200?o=(r+.5)/zn.DAYS_PER_JULIAN_CENTURY:o=(r-.5)/zn.DAYS_PER_JULIAN_CENTURY;let a=(mVe+o*(hVe+o*(fVe+o*pVe)))*yVe%W.TWO_PI,c=gVe+bVe*(n-24515455e-1),d=(i+zn.SECONDS_PER_DAY*.5)%zn.SECONDS_PER_DAY,u=a+c*d,m=Math.cos(u),p=Math.sin(u);return l(t)?(t[0]=m,t[1]=-p,t[2]=0,t[3]=p,t[4]=m,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t):new $(m,p,0,-p,m,0,0,0,1)};Oi.iau2006XysData=new DL;Oi.earthOrientationParameters=UL.NONE;var tY=32.184,xVe=2451545;Oi.preloadIcrfFixed=function(e){let t=e.start.dayNumber,n=e.start.secondsOfDay+tY,i=e.stop.dayNumber,o=e.stop.secondsOfDay+tY;return Oi.iau2006XysData.preload(t,n,i,o)};Oi.computeIcrfToFixedMatrix=function(e,t){l(t)||(t=new $);let n=Oi.computeFixedToIcrfMatrix(e,t);if(l(n))return $.transpose(n,t)};var _Ve=new jy(0,0,0),TVe=new gb(0,0,0,0,0,0),$B=new $,eY=new $;Oi.computeFixedToIcrfMatrix=function(e,t){l(t)||(t=new $);let n=Oi.earthOrientationParameters.compute(e,TVe);if(!l(n))return;let i=e.dayNumber,o=e.secondsOfDay+tY,r=Oi.iau2006XysData.computeXysRadians(i,o,_Ve);if(!l(r))return;let s=r.x+n.xPoleOffset,a=r.y+n.yPoleOffset,c=1/(1+Math.sqrt(1-s*s-a*a)),d=$B;d[0]=1-c*s*s,d[3]=-c*s*a,d[6]=s,d[1]=-c*s*a,d[4]=1-c*a*a,d[7]=a,d[2]=-s,d[5]=-a,d[8]=1-c*(s*s+a*a);let u=$.fromRotationZ(-r.s,eY),m=$.multiply(d,u,$B),p=e.dayNumber,g=e.secondsOfDay-te.computeTaiMinusUtc(e)+n.ut1MinusUtc,f=p-2451545,x=g/zn.SECONDS_PER_DAY,_=.779057273264+x+.00273781191135448*(f+x);_=_%1*W.TWO_PI;let C=$.fromRotationZ(_,eY),V=$.multiply(m,C,$B),L=Math.cos(n.xPoleWander),Z=Math.cos(n.yPoleWander),G=Math.sin(n.xPoleWander),X=Math.sin(n.yPoleWander),v=i-xVe+o/zn.SECONDS_PER_DAY;v/=36525;let P=-47e-6*v*W.RADIANS_PER_DEGREE/3600,F=Math.cos(P),A=Math.sin(P),b=eY;return b[0]=L*F,b[1]=L*A,b[2]=G,b[3]=-Z*A+X*G*F,b[4]=Z*F+X*G*A,b[5]=-X*L,b[6]=-X*A-Z*G*F,b[7]=X*F-Z*G*A,b[8]=Z*L,$.multiply(V,b,t)};var SVe=new se;Oi.pointToWindowCoordinates=function(e,t,n,i){return i=Oi.pointToGLWindowCoordinates(e,t,n,i),i.y=2*t[5]-i.y,i};Oi.pointToGLWindowCoordinates=function(e,t,n,i){l(i)||(i=new D);let o=SVe;return M.multiplyByVector(e,se.fromElements(n.x,n.y,n.z,1,o),o),se.multiplyByScalar(o,1/o.w,o),M.multiplyByVector(t,o,o),D.fromCartesian4(o,i)};var CVe=new h,VVe=new h,LVe=new h;Oi.rotationMatrixFromPositionVelocity=function(e,t,n,i){let o=y(n,ie.WGS84).geodeticSurfaceNormal(e,CVe),r=h.cross(t,o,VVe);h.equalsEpsilon(r,h.ZERO,W.EPSILON6)&&(r=h.clone(h.UNIT_X,r));let s=h.cross(r,t,LVe);return h.normalize(s,s),h.cross(t,s,r),h.negate(r,r),h.normalize(r,r),l(i)||(i=new $),i[0]=t.x,i[1]=t.y,i[2]=t.z,i[3]=r.x,i[4]=r.y,i[5]=r.z,i[6]=s.x,i[7]=s.y,i[8]=s.z,i};var t$=new M(0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,1),n$=new he,nY=new h,RVe=new h,ZVe=new $,iY=new M,i$=new M;Oi.basisTo2D=function(e,t,n){let i=M.getTranslation(t,RVe),o=e.ellipsoid,r;if(h.equals(i,h.ZERO))r=h.clone(h.ZERO,nY);else{let u=o.cartesianToCartographic(i,n$);r=e.project(u,nY),h.fromElements(r.z,r.x,r.y,r)}let s=Oi.eastNorthUpToFixedFrame(i,o,iY),a=M.inverseTransformation(s,i$),c=M.getMatrix3(t,ZVe),d=M.multiplyByMatrix3(a,c,n);return M.multiply(t$,d,n),M.setTranslation(n,r,n),n};Oi.wgs84To2DModelMatrix=function(e,t,n){let i=e.ellipsoid,o=Oi.eastNorthUpToFixedFrame(t,i,iY),r=M.inverseTransformation(o,i$),s=i.cartesianToCartographic(t,n$),a=e.project(s,nY);h.fromElements(a.z,a.x,a.y,a);let c=M.fromTranslation(a,iY);return M.multiply(t$,r,n),M.multiply(c,n,n),n};var Gt=Oi;function Xn(e,t,n,i){this.west=y(e,0),this.south=y(t,0),this.east=y(n,0),this.north=y(i,0)}Object.defineProperties(Xn.prototype,{width:{get:function(){return Xn.computeWidth(this)}},height:{get:function(){return Xn.computeHeight(this)}}});Xn.packedLength=4;Xn.pack=function(e,t,n){return n=y(n,0),t[n++]=e.west,t[n++]=e.south,t[n++]=e.east,t[n]=e.north,t};Xn.unpack=function(e,t,n){return t=y(t,0),l(n)||(n=new Xn),n.west=e[t++],n.south=e[t++],n.east=e[t++],n.north=e[t],n};Xn.computeWidth=function(e){let t=e.east,n=e.west;return t=0?u.longitude:u.longitude+W.TWO_PI;o=Math.min(o,m),r=Math.max(r,m)}return i-n>r-o&&(n=o,i=r,i>W.PI&&(i=i-W.TWO_PI),n>W.PI&&(n=n-W.TWO_PI)),l(t)?(t.west=n,t.south=s,t.east=i,t.north=a,t):new Xn(n,s,i,a)};Xn.fromCartesianArray=function(e,t,n){t=y(t,ie.WGS84);let i=Number.MAX_VALUE,o=-Number.MAX_VALUE,r=Number.MAX_VALUE,s=-Number.MAX_VALUE,a=Number.MAX_VALUE,c=-Number.MAX_VALUE;for(let d=0,u=e.length;d=0?m.longitude:m.longitude+W.TWO_PI;r=Math.min(r,p),s=Math.max(s,p)}return o-i>s-r&&(i=r,o=s,o>W.PI&&(o=o-W.TWO_PI),i>W.PI&&(i=i-W.TWO_PI)),l(n)?(n.west=i,n.south=a,n.east=o,n.north=c,n):new Xn(i,a,o,c)};var GVe=new h,EVe=new h,XVe=new h,IVe=new h,WVe=new h,oY=new Array(5);for(let e=0;e0?i+=W.TWO_PI:r0&&(r+=W.TWO_PI),i=u))return l(n)?(n.west=a,n.south=d,n.east=c,n.north=u,n):new Xn(a,d,c,u)};Xn.simpleIntersection=function(e,t,n){let i=Math.max(e.west,t.west),o=Math.max(e.south,t.south),r=Math.min(e.east,t.east),s=Math.min(e.north,t.north);if(!(o>=s||i>=r))return l(n)?(n.west=i,n.south=o,n.east=r,n.north=s,n):new Xn(i,o,r,s)};Xn.union=function(e,t,n){l(n)||(n=new Xn);let i=e.east,o=e.west,r=t.east,s=t.west;i0?i+=W.TWO_PI:r0&&(r+=W.TWO_PI),io||W.equalsEpsilon(n,o,W.EPSILON14))&&(n=e.south&&i<=e.north};var PVe=new he;Xn.subsample=function(e,t,n,i){t=y(t,ie.WGS84),n=y(n,0),l(i)||(i=[]);let o=0,r=e.north,s=e.south,a=e.east,c=e.west,d=PVe;d.height=n,d.longitude=c,d.latitude=r,i[o]=t.cartographicToCartesian(d,i[o]),o++,d.longitude=a,i[o]=t.cartographicToCartesian(d,i[o]),o++,d.latitude=s,i[o]=t.cartographicToCartesian(d,i[o]),o++,d.longitude=c,i[o]=t.cartographicToCartesian(d,i[o]),o++,r<0?d.latitude=r:s>0?d.latitude=s:d.latitude=0;for(let u=1;u<8;++u)d.longitude=-Math.PI+u*W.PI_OVER_TWO,Xn.contains(e,d)&&(i[o]=t.cartographicToCartesian(d,i[o]),o++);return d.latitude===0&&(d.longitude=c,i[o]=t.cartographicToCartesian(d,i[o]),o++,d.longitude=a,i[o]=t.cartographicToCartesian(d,i[o]),o++),i.length=o,i};Xn.subsection=function(e,t,n,i,o,r){if(l(r)||(r=new Xn),e.west<=e.east){let a=e.east-e.west;r.west=e.west+t*a,r.east=e.west+i*a}else{let a=W.TWO_PI+e.east-e.west;r.west=W.negativePiToPi(e.west+t*a),r.east=W.negativePiToPi(e.west+i*a)}let s=e.north-e.south;return r.south=e.south+n*s,r.north=e.south+o*s,t===1&&(r.west=e.east),i===1&&(r.east=e.east),n===1&&(r.south=e.north),o===1&&(r.north=e.north),r};Xn.MAX_VALUE=Object.freeze(new Xn(-Math.PI,-W.PI_OVER_TWO,Math.PI,W.PI_OVER_TWO));var ce=Xn;function fn(e,t){this.center=h.clone(y(e,h.ZERO)),this.radius=y(t,0)}var aY=new h,cY=new h,lY=new h,dY=new h,uY=new h,mY=new h,hY=new h,Js=new h,fY=new h,pY=new h,bY=new h,gY=new h,vVe=4/3*W.PI;fn.fromPoints=function(e,t){if(l(t)||(t=new fn),!l(e)||e.length===0)return t.center=h.clone(h.ZERO,t.center),t.radius=0,t;let n=h.clone(e[0],hY),i=h.clone(n,aY),o=h.clone(n,cY),r=h.clone(n,lY),s=h.clone(n,dY),a=h.clone(n,uY),c=h.clone(n,mY),d=e.length,u;for(u=1;us.x&&h.clone(n,s),Fa.y&&h.clone(n,a),Ac.z&&h.clone(n,c)}let m=h.magnitudeSquared(h.subtract(s,i,Js)),p=h.magnitudeSquared(h.subtract(a,o,Js)),g=h.magnitudeSquared(h.subtract(c,r,Js)),f=i,x=s,_=m;p>_&&(_=p,f=o,x=a),g>_&&(_=g,f=r,x=c);let C=fY;C.x=(f.x+x.x)*.5,C.y=(f.y+x.y)*.5,C.z=(f.z+x.z)*.5;let V=h.magnitudeSquared(h.subtract(x,C,Js)),L=Math.sqrt(V),Z=pY;Z.x=i.x,Z.y=o.y,Z.z=r.z;let G=bY;G.x=s.x,G.y=a.y,G.z=c.z;let X=h.midpoint(Z,G,gY),v=0;for(u=0;uv&&(v=P);let F=h.magnitudeSquared(h.subtract(n,C,Js));if(F>V){let A=Math.sqrt(F);L=(L+A)*.5,V=L*L;let b=A-L;C.x=(L*C.x+b*n.x)/A,C.y=(L*C.y+b*n.y)/A,C.z=(L*C.z+b*n.z)/A}}return Lc.x&&h.clone(o,c),bd.y&&h.clone(o,d),Ru.z&&h.clone(o,u)}let g=h.magnitudeSquared(h.subtract(c,r,Js)),f=h.magnitudeSquared(h.subtract(d,s,Js)),x=h.magnitudeSquared(h.subtract(u,a,Js)),_=r,C=c,V=g;f>V&&(V=f,_=s,C=d),x>V&&(V=x,_=a,C=u);let L=fY;L.x=(_.x+C.x)*.5,L.y=(_.y+C.y)*.5,L.z=(_.z+C.z)*.5;let Z=h.magnitudeSquared(h.subtract(C,L,Js)),G=Math.sqrt(Z),X=pY;X.x=r.x,X.y=s.y,X.z=a.z;let v=bY;v.x=c.x,v.y=d.y,v.z=u.z;let P=h.midpoint(X,v,gY),F=0;for(p=0;pF&&(F=A);let b=h.magnitudeSquared(h.subtract(o,L,Js));if(b>Z){let R=Math.sqrt(b);G=(G+R)*.5,Z=G*G;let E=R-G;L.x=(G*L.x+E*o.x)/R,L.y=(G*L.y+E*o.y)/R,L.z=(G*L.z+E*o.z)/R}}return Ga.x&&h.clone(i,a),Ac.y&&h.clone(i,c),bd.z&&h.clone(i,d)}let p=h.magnitudeSquared(h.subtract(a,o,Js)),g=h.magnitudeSquared(h.subtract(c,r,Js)),f=h.magnitudeSquared(h.subtract(d,s,Js)),x=o,_=a,C=p;g>C&&(C=g,x=r,_=c),f>C&&(C=f,x=s,_=d);let V=fY;V.x=(x.x+_.x)*.5,V.y=(x.y+_.y)*.5,V.z=(x.z+_.z)*.5;let L=h.magnitudeSquared(h.subtract(_,V,Js)),Z=Math.sqrt(L),G=pY;G.x=o.x,G.y=r.y,G.z=s.z;let X=bY;X.x=a.x,X.y=c.y,X.z=d.z;let v=h.midpoint(G,X,gY),P=0;for(m=0;mP&&(P=F);let A=h.magnitudeSquared(h.subtract(i,V,Js));if(A>L){let b=Math.sqrt(A);Z=(Z+b)*.5,L=Z*Z;let R=b-Z;V.x=(Z*V.x+R*i.x)/b,V.y=(Z*V.y+R*i.y)/b,V.z=(Z*V.z+R*i.z)/b}}return Z=c+s)return e.clone(n),n;if(s>=c+o)return t.clone(n),n;let d=(o+c+s)*.5,u=h.multiplyByScalar(a,(-o+d)/c,HVe);return h.add(u,i,u),h.clone(u,n.center),n.radius=d,n};var zVe=new h;fn.expand=function(e,t,n){n=fn.clone(e,n);let i=h.magnitude(h.subtract(t,n.center,zVe));return i>n.radius&&(n.radius=i),n};fn.intersectPlane=function(e,t){let n=e.center,i=e.radius,o=t.normal,r=h.dot(o,n)+t.distance;return r<-i?Kt.OUTSIDE:r=o&&(d=o-1);let u=(i.north-e.latitude)/a|0;return u>=r&&(u=r-1),l(n)?(n.x=d,n.y=u,n):new D(d,u)};var Ai=Vb;var s$=new h,a$=new h,c$=new he,yY=new h,nLe=new h,l$=new le,iLe=new Ai,HL=[new he,new he,new he,new he],zL=new D,kr={};kr.initialize=function(){let e=kr._initPromise;return l(e)||(e=Ee.fetchJson(tn("Assets/approximateTerrainHeights.json")).then(function(t){kr._terrainHeights=t}),kr._initPromise=e),e};kr.getMinimumMaximumHeights=function(e,t){t=y(t,ie.WGS84);let n=d$(e),i=kr._defaultMinTerrainHeight,o=kr._defaultMaxTerrainHeight;if(l(n)){let r=`${n.level}-${n.x}-${n.y}`,s=kr._terrainHeights[r];l(s)&&(i=s[0],o=s[1]),t.cartographicToCartesian(ce.northeast(e,c$),s$),t.cartographicToCartesian(ce.southwest(e,c$),a$),h.midpoint(a$,s$,yY);let a=t.scaleToGeodeticSurface(yY,nLe);if(l(a)){let c=h.distance(yY,a);i=Math.min(i,-c)}else i=kr._defaultMinTerrainHeight}return i=Math.max(kr._defaultMinTerrainHeight,i),{minimumTerrainHeight:i,maximumTerrainHeight:o}};kr.getBoundingSphere=function(e,t){t=y(t,ie.WGS84);let n=d$(e),i=kr._defaultMaxTerrainHeight;if(l(n)){let r=`${n.level}-${n.x}-${n.y}`,s=kr._terrainHeights[r];l(s)&&(i=s[1])}let o=le.fromRectangle3D(e,t,0);return le.fromRectangle3D(e,t,i,l$),le.union(o,l$,o)};function d$(e){he.fromRadians(e.east,e.north,0,HL[0]),he.fromRadians(e.west,e.north,0,HL[1]),he.fromRadians(e.east,e.south,0,HL[2]),he.fromRadians(e.west,e.south,0,HL[3]);let t=0,n=0,i=0,o=0,r=kr._terrainHeightsMaxLevel,s;for(s=0;s<=r;++s){let a=!1;for(let c=0;c<4;++c){let d=HL[c];if(iLe.positionToTileXY(d,s,zL),c===0)i=zL.x,o=zL.y;else if(i!==zL.x||o!==zL.y){a=!0;break}}if(a)break;t=i,n=o}if(s!==0)return{x:t,y:n,level:s>r?r:s-1}}kr._terrainHeightsMaxLevel=6;kr._defaultMaxTerrainHeight=9e3;kr._defaultMinTerrainHeight=-1e5;kr._terrainHeights=void 0;kr._initPromise=void 0;Object.defineProperties(kr,{initialized:{get:function(){return l(kr._terrainHeights)}}});var ci=kr;var fWt=T(S(),1);var NZt=T(S(),1),m$=T(u$(),1);var oLe=0,TY={};function Uh(e,t){let n,i=e;l(TY[i])?n=TY[i]:(n=oLe++,TY[i]=n),t=y(t,!1),this._id=n,this._html=e,this._showOnScreen=t,this._element=void 0}Object.defineProperties(Uh.prototype,{html:{get:function(){return this._html}},id:{get:function(){return this._id}},showOnScreen:{get:function(){return this._showOnScreen},set:function(e){this._showOnScreen=e}},element:{get:function(){if(!l(this._element)){let e=m$.default.sanitize(this._html),t=document.createElement("div");t._creditId=this._id,t.style.display="inline",t.innerHTML=e;let n=t.querySelectorAll("a");for(let i=0;i0?Kt.INSIDE:r+o<0?Kt.OUTSIDE:Kt.INTERSECTING};Pc.prototype.clone=function(e){return Pc.clone(this,e)};Pc.prototype.intersectPlane=function(e){return Pc.intersectPlane(this,e)};Pc.prototype.equals=function(e){return Pc.equals(this,e)};var Lb=Pc;var tGt=T(S(),1);function Dh(e,t){this._ellipsoid=e,this._cameraPosition=new h,this._cameraPositionInScaledSpace=new h,this._distanceToLimbInScaledSpaceSquared=0,l(t)&&(this.cameraPosition=t)}Object.defineProperties(Dh.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},cameraPosition:{get:function(){return this._cameraPosition},set:function(e){let n=this._ellipsoid.transformPositionToScaledSpace(e,this._cameraPositionInScaledSpace),i=h.magnitudeSquared(n)-1;h.clone(e,this._cameraPosition),this._cameraPositionInScaledSpace=n,this._distanceToLimbInScaledSpaceSquared=i}}});var h$=new h;Dh.prototype.isPointVisible=function(e){let n=this._ellipsoid.transformPositionToScaledSpace(e,h$);return CY(n,this._cameraPositionInScaledSpace,this._distanceToLimbInScaledSpaceSquared)};Dh.prototype.isScaledSpacePointVisible=function(e){return CY(e,this._cameraPositionInScaledSpace,this._distanceToLimbInScaledSpaceSquared)};var sLe=new h;Dh.prototype.isScaledSpacePointVisiblePossiblyUnderEllipsoid=function(e,t){let n=this._ellipsoid,i,o;return l(t)&&t<0&&n.minimumRadius>-t?(o=sLe,o.x=this._cameraPosition.x/(n.radii.x+t),o.y=this._cameraPosition.y/(n.radii.y+t),o.z=this._cameraPosition.z/(n.radii.z+t),i=o.x*o.x+o.y*o.y+o.z*o.z-1):(o=this._cameraPositionInScaledSpace,i=this._distanceToLimbInScaledSpaceSquared),CY(e,o,i)};Dh.prototype.computeHorizonCullingPoint=function(e,t,n){return b$(this._ellipsoid,e,t,n)};var f$=ie.clone(ie.UNIT_SPHERE);Dh.prototype.computeHorizonCullingPointPossiblyUnderEllipsoid=function(e,t,n,i){let o=p$(this._ellipsoid,n,f$);return b$(o,e,t,i)};Dh.prototype.computeHorizonCullingPointFromVertices=function(e,t,n,i,o){return g$(this._ellipsoid,e,t,n,i,o)};Dh.prototype.computeHorizonCullingPointFromVerticesPossiblyUnderEllipsoid=function(e,t,n,i,o,r){let s=p$(this._ellipsoid,o,f$);return g$(s,e,t,n,i,r)};var aLe=[];Dh.prototype.computeHorizonCullingPointFromRectangle=function(e,t,n){let i=ce.subsample(e,t,0,aLe),o=le.fromPoints(i);if(!(h.magnitude(o.center)<.1*t.minimumRadius))return this.computeHorizonCullingPoint(o.center,i,n)};var cLe=new h;function p$(e,t,n){if(l(t)&&t<0&&e.minimumRadius>-t){let i=h.fromElements(e.radii.x+t,e.radii.y+t,e.radii.z+t,cLe);e=ie.fromCartesian3(i,n)}return e}function b$(e,t,n,i){l(i)||(i=new h);let o=_$(e,t),r=0;for(let s=0,a=n.length;s0:s>o&&s*s/h.magnitudeSquared(r)>o)}var lLe=new h,dLe=new h;function y$(e,t,n){let i=e.transformPositionToScaledSpace(t,lLe),o=h.magnitudeSquared(i),r=Math.sqrt(o),s=h.divideByScalar(i,r,dLe);o=Math.max(1,o),r=Math.max(1,r);let a=h.dot(s,n),c=h.magnitude(h.cross(s,n,s)),d=1/r,u=Math.sqrt(o-1)*d;return 1/(a*d-c*u)}function x$(e,t,n){if(!(t<=0||t===1/0||t!==t))return h.multiplyByScalar(e,t,n)}var SY=new h;function _$(e,t){return h.equals(t,h.ZERO)?t:(e.transformPositionToScaledSpace(t,SY),h.normalize(SY,SY))}var lp=Dh;var mEt=T(S(),1);var JGt=T(S(),1);var EGt=T(S(),1);var oGt=T(S(),1);var VY={};VY.computeDiscriminant=function(e,t,n){return t*t-4*e*n};function T$(e,t,n){let i=e+t;return W.sign(e)!==W.sign(t)&&Math.abs(i/Math.max(Math.abs(e),Math.abs(t)))d&&d/c0?[a/e,n/a]:[n/a,a/e]};var vc=VY;var mGt=T(S(),1);var aGt=T(S(),1);var RY={};RY.computeDiscriminant=function(e,t,n,i){let o=e*e,r=t*t,s=n*n,a=i*i;return 18*e*t*n*i+r*s-27*o*a-4*(e*s*n+r*t*i)};function LY(e,t,n,i){let o=e,r=t/3,s=n/3,a=i,c=o*s,d=r*a,u=r*r,m=s*s,p=o*s-u,g=o*a-r*s,f=r*a-m,x=4*p*f-g*g,_,C;if(x<0){let J,H,ee;u*d>=c*m?(J=o,H=p,ee=-2*r*p+o*g):(J=a,H=f,ee=-a*g+2*s*f);let j=-(ee<0?-1:1)*Math.abs(J)*Math.sqrt(-x);C=-ee+j;let q=C/2,be=q<0?-Math.pow(-q,1/3):Math.pow(q,1/3),Te=C===j?-be:-H/be;return _=H<=0?be+Te:-ee/(be*be+Te*Te+H),u*d>=c*m?[(_-r)/o]:[-a/(_+s)]}let V=p,L=-2*r*p+o*g,Z=f,G=-a*g+2*s*f,X=Math.sqrt(x),v=Math.sqrt(3)/2,P=Math.abs(Math.atan2(o*X,-L)/3);_=2*Math.sqrt(-V);let F=Math.cos(P);C=_*F;let A=_*(-F/2-v*Math.sin(P)),b=C+A>2*r?C-r:A-r,R=o,E=b/R;P=Math.abs(Math.atan2(a*X,-G)/3),_=2*Math.sqrt(-Z),F=Math.cos(P),C=_*F,A=_*(-F/2-v*Math.sin(P));let I=-a,w=C+A<2*s?C+s:A+s,N=I/w,B=R*w,U=-b*w-R*I,O=b*I,k=(s*U-r*O)/(-r*U+s*B);return E<=k?E<=N?k<=N?[E,k,N]:[E,N,k]:[N,E,k]:E<=N?[k,E,N]:k<=N?[k,N,E]:[N,k,E]}RY.computeRealRoots=function(e,t,n,i){let o,r;if(e===0)return vc.computeRealRoots(t,n,i);if(t===0){if(n===0){if(i===0)return[0,0,0];r=-i/e;let s=r<0?-Math.pow(-r,1/3):Math.pow(r,1/3);return[s,s,s]}else if(i===0)return o=vc.computeRealRoots(e,0,n),o.Length===0?[0]:[o[0],0,o[1]];return LY(e,0,n,i)}else{if(n===0)return i===0?(r=-t/e,r<0?[r,0,0]:[0,0,r]):LY(e,t,0,i);if(i===0)return o=vc.computeRealRoots(e,t,n),o.length===0?[0]:o[1]<=0?[o[0],o[1],0]:o[0]>=0?[0,o[0],o[1]]:[o[0],0,o[1]]}return LY(e,t,n,i)};var $y=RY;var ZY={};ZY.computeDiscriminant=function(e,t,n,i,o){let r=e*e,s=r*e,a=t*t,c=a*t,d=n*n,u=d*n,m=i*i,p=m*i,g=o*o,f=g*o;return a*d*m-4*c*p-4*e*u*m+18*e*t*n*p-27*r*m*m+256*s*f+o*(18*c*n*i-4*a*u+16*e*d*d-80*e*t*d*i-6*e*a*m+144*r*n*m)+g*(144*e*a*n-27*a*a-128*r*d-192*r*t*i)};function fm(e,t,n,i){let o=e*e,r=t-3*o/8,s=n-t*e/2+o*e/8,a=i-n*e/4+t*o/16-3*o*o/256,c=$y.computeRealRoots(1,2*r,r*r-4*a,-s*s);if(c.length>0){let d=-e/4,u=c[c.length-1];if(Math.abs(u)=0&&g>=0){let x=Math.sqrt(p),_=Math.sqrt(g);return[d-_,d-x,d+x,d+_]}else{if(p>=0&&g<0)return f=Math.sqrt(p),[d-f,d+f];if(p<0&&g>=0)return f=Math.sqrt(g),[d-f,d+f]}}return[]}else if(u>0){let m=Math.sqrt(u),p=(r+u-s/m)/2,g=(r+u+s/m)/2,f=vc.computeRealRoots(1,m,p),x=vc.computeRealRoots(1,-m,g);return f.length!==0?(f[0]+=d,f[1]+=d,x.length!==0?(x[0]+=d,x[1]+=d,f[1]<=x[0]?[f[0],f[1],x[0],x[1]]:x[1]<=f[0]?[x[0],x[1],f[0],f[1]]:f[0]>=x[0]&&f[1]<=x[1]?[x[0],f[0],f[1],x[1]]:x[0]>=f[0]&&x[1]<=f[1]?[f[0],x[0],x[1],f[1]]:f[0]>x[0]&&f[0]0){let m=u[0],p=t-m,g=p*p,f=e/2,x=p/2,_=g-4*i,C=g+4*Math.abs(i),V=s-4*m,L=s+4*Math.abs(m),Z,G;if(m<0||_*L=b[0]&&A[1]<=b[1]?[b[0],A[0],A[1],b[1]]:b[0]>=A[0]&&b[1]<=A[1]?[A[0],b[0],b[1],A[1]]:A[0]>b[0]&&A[0]u)||(p=h.cross(m,a,C$),f=h.dot(s,p),f<0||g+f>u))return;x=h.dot(c,p)/u}else{if(Math.abs(u)1||(p=h.cross(m,a,C$),f=h.dot(s,p)*_,f<0||g+f>1))return;x=h.dot(c,p)*_}return x};Wo.rayTriangle=function(e,t,n,i,o,r){let s=Wo.rayTriangleParametric(e,t,n,i,o);if(!(!l(s)||s<0))return l(r)||(r=new h),h.multiplyByScalar(e.direction,s,r),h.add(e.origin,r,r)};var hLe=new pn;Wo.lineSegmentTriangle=function(e,t,n,i,o,r,s){let a=hLe;h.clone(e,a.origin),h.subtract(t,e,a.direction),h.normalize(a.direction,a.direction);let c=Wo.rayTriangleParametric(a,n,i,o,r);if(!(!l(c)||c<0||c>h.distance(e,t)))return l(s)||(s=new h),h.multiplyByScalar(a.direction,c,s),h.add(a.origin,s,s)};function fLe(e,t,n,i){let o=t*t-4*e*n;if(o<0)return;if(o>0){let s=1/(2*e),a=Math.sqrt(o),c=(-t+a)*s,d=(-t-a)*s;return cs))return i.start=Math.max(i.start,0),i.stop=Math.min(i.stop,s),i};var gLe=new h,yLe=new h;Wo.rayEllipsoid=function(e,t){let n=t.oneOverRadii,i=h.multiplyComponents(n,e.origin,gLe),o=h.multiplyComponents(n,e.direction,yLe),r=h.magnitudeSquared(i),s=h.dot(i,o),a,c,d,u,m;if(r>1){if(s>=0)return;let p=s*s;if(a=r-1,c=h.magnitudeSquared(o),d=c*a,pd){u=s*s-d,m=-s+Math.sqrt(u);let f=m/c,x=a/m;return f0?g.push(new h(i,o*F,o*-R)):R!==0?(g.push(new h(i,o*F,o*-R)),g.push(new h(i,o*F,o*R)),++P):g.push(new h(i,o*F,o*R))}return g};var GY=new h,V$=new h,L$=new h,nN=new h,xLe=new h,_Le=new $,TLe=new $,SLe=new $,CLe=new $,VLe=new $,R$=new $,Z$=new $,G$=new h,LLe=new h,RLe=new he;Wo.grazingAltitudeLocation=function(e,t){let n=e.origin,i=e.direction;if(!h.equals(n,h.ZERO)){let X=t.geodeticSurfaceNormal(n,GY);if(h.dot(i,X)>=0)return n}let o=l(this.rayEllipsoid(e,t)),r=t.transformPositionToScaledSpace(i,GY),s=h.normalize(r,r),a=h.mostOrthogonalAxis(r,nN),c=h.normalize(h.cross(a,s,V$),V$),d=h.normalize(h.cross(s,c,L$),L$),u=_Le;u[0]=s.x,u[1]=s.y,u[2]=s.z,u[3]=c.x,u[4]=c.y,u[5]=c.z,u[6]=d.x,u[7]=d.y,u[8]=d.z;let m=$.transpose(u,TLe),p=$.fromScale(t.radii,SLe),g=$.fromScale(t.oneOverRadii,CLe),f=VLe;f[0]=0,f[1]=-i.z,f[2]=i.y,f[3]=i.z,f[4]=0,f[5]=-i.x,f[6]=-i.y,f[7]=i.x,f[8]=0;let x=$.multiply($.multiply(m,g,R$),f,R$),_=$.multiply($.multiply(x,p,Z$),u,Z$),C=$.multiplyByVector(x,n,xLe),V=Wo.quadraticVectorExpression(_,h.negate(C,GY),0,0,1),L,Z,G=V.length;if(G>0){let X=h.clone(h.ZERO,LLe),v=Number.NEGATIVE_INFINITY;for(let F=0;Fv&&(v=b,X=h.clone(L,X))}let P=t.cartesianToCartographic(X,RLe);return v=W.clamp(v,0,1),Z=h.magnitude(h.subtract(X,n,nN))*Math.sqrt(1-v*v),Z=o?-Z:Z,P.height=Z,t.cartographicToCartesian(P,new h)}};var ZLe=new h;Wo.lineSegmentPlane=function(e,t,n,i){l(i)||(i=new h);let o=h.subtract(t,e,ZLe),r=n.normal,s=h.dot(r,o);if(Math.abs(s)1))return h.multiplyByScalar(o,c,i),h.add(e,i,i),i};Wo.trianglePlaneIntersection=function(e,t,n,i){let o=i.normal,r=i.distance,s=h.dot(o,e)+r<0,a=h.dot(o,t)+r<0,c=h.dot(o,n)+r<0,d=0;d+=s?1:0,d+=a?1:0,d+=c?1:0;let u,m;if((d===1||d===2)&&(u=new h,m=new h),d===1){if(s)return Wo.lineSegmentPlane(e,t,i,u),Wo.lineSegmentPlane(e,n,i,m),{positions:[e,t,n,u,m],indices:[0,3,4,1,2,4,1,4,3]};if(a)return Wo.lineSegmentPlane(t,n,i,u),Wo.lineSegmentPlane(t,e,i,m),{positions:[e,t,n,u,m],indices:[1,3,4,2,0,4,2,4,3]};if(c)return Wo.lineSegmentPlane(n,e,i,u),Wo.lineSegmentPlane(n,t,i,m),{positions:[e,t,n,u,m],indices:[2,3,4,0,1,4,0,4,3]}}else if(d===2)if(s)if(a){if(!c)return Wo.lineSegmentPlane(e,n,i,u),Wo.lineSegmentPlane(t,n,i,m),{positions:[e,t,n,u,m],indices:[0,1,4,0,4,3,2,3,4]}}else return Wo.lineSegmentPlane(n,t,i,u),Wo.lineSegmentPlane(e,t,i,m),{positions:[e,t,n,u,m],indices:[2,0,4,2,4,3,1,3,4]};else return Wo.lineSegmentPlane(t,e,i,u),Wo.lineSegmentPlane(n,e,i,m),{positions:[e,t,n,u,m],indices:[1,2,4,1,4,3,0,3,4]}};var jn=Wo;var wGt=T(S(),1);function Zs(e,t){this.normal=h.clone(e),this.distance=t}Zs.fromPointNormal=function(e,t,n){let i=-h.dot(t,e);return l(n)?(h.clone(t,n.normal),n.distance=i,n):new Zs(t,i)};var GLe=new h;Zs.fromCartesian4=function(e,t){let n=h.fromCartesian4(e,GLe),i=e.w;return l(t)?(h.clone(n,t.normal),t.distance=i,t):new Zs(n,i)};Zs.getPointDistance=function(e,t){return h.dot(e.normal,t)+e.distance};var ELe=new h;Zs.projectPointOntoPlane=function(e,t,n){l(n)||(n=new h);let i=Zs.getPointDistance(e,t),o=h.multiplyByScalar(e.normal,i,ELe);return h.subtract(t,o,n)};var XLe=new M,ILe=new se,WLe=new h;Zs.transform=function(e,t,n){let i=e.normal,o=e.distance,r=M.inverseTranspose(t,XLe),s=se.fromElements(i.x,i.y,i.z,o,ILe);s=M.multiplyByVector(r,s,s);let a=h.fromCartesian4(s,WLe);return s=se.divideByScalar(s,h.magnitude(a),s),Zs.fromCartesian4(s,n)};Zs.clone=function(e,t){return l(t)?(h.clone(e.normal,t.normal),t.distance=e.distance,t):new Zs(e.normal,e.distance)};Zs.equals=function(e,t){return e.distance===t.distance&&h.equals(e.normal,t.normal)};Zs.ORIGIN_XY_PLANE=Object.freeze(new Zs(h.UNIT_Z,0));Zs.ORIGIN_YZ_PLANE=Object.freeze(new Zs(h.UNIT_X,0));Zs.ORIGIN_ZX_PLANE=Object.freeze(new Zs(h.UNIT_Y,0));var cn=Zs;var EY=new se;function Bh(e,t){t=y(t,ie.WGS84),e=t.scaleToGeodeticSurface(e);let n=Gt.eastNorthUpToFixedFrame(e,t);this._ellipsoid=t,this._origin=e,this._xAxis=h.fromCartesian4(M.getColumn(n,0,EY)),this._yAxis=h.fromCartesian4(M.getColumn(n,1,EY));let i=h.fromCartesian4(M.getColumn(n,2,EY));this._plane=cn.fromPointNormal(e,i)}Object.defineProperties(Bh.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},origin:{get:function(){return this._origin}},plane:{get:function(){return this._plane}},xAxis:{get:function(){return this._xAxis}},yAxis:{get:function(){return this._yAxis}},zAxis:{get:function(){return this._plane.normal}}});var PLe=new Lb;Bh.fromPoints=function(e,t){let n=Lb.fromPoints(e,PLe);return new Bh(n.center,t)};var I$=new pn,iN=new h;Bh.prototype.projectPointOntoPlane=function(e,t){let n=I$;n.origin=e,h.normalize(e,n.direction);let i=jn.rayPlane(n,this._plane,iN);if(l(i)||(h.negate(n.direction,n.direction),i=jn.rayPlane(n,this._plane,iN)),l(i)){let o=h.subtract(i,this._origin,i),r=h.dot(this._xAxis,o),s=h.dot(this._yAxis,o);return l(t)?(t.x=r,t.y=s,t):new D(r,s)}};Bh.prototype.projectPointsOntoPlane=function(e,t){l(t)||(t=[]);let n=0,i=e.length;for(let o=0;o0?0:v.latitude,R=he.fromRadians(A,e.north,n,OLe),E=he.fromRadians(e.west,e.north,n,HLe),I=he.fromRadians(e.west,b,n,zLe),w=he.fromRadians(e.west,e.south,n,KLe),N=he.fromRadians(A,e.south,n,JLe),B=i.cartographicToCartesian(R,QLe),U=i.cartographicToCartesian(E,v$),O=i.cartographicToCartesian(I,jLe),k=i.cartographicToCartesian(w,w$),J=i.cartographicToCartesian(N,qLe),H=F.projectPointToNearestOnPlane(B,$Le),ee=F.projectPointToNearestOnPlane(U,eRe),z=F.projectPointToNearestOnPlane(O,tRe),j=F.projectPointToNearestOnPlane(k,nRe),q=F.projectPointToNearestOnPlane(J,iRe);return r=Math.min(ee.x,z.x,j.x),s=-r,c=Math.max(ee.y,H.y),a=Math.min(j.y,q.y),E.height=w.height=t,U=i.cartographicToCartesian(E,v$),k=i.cartographicToCartesian(w,w$),d=Math.min(cn.getPointDistance(m,U),cn.getPointDistance(m,k)),u=n,W$(F.origin,F.xAxis,F.yAxis,F.zAxis,r,s,a,c,d,u,o)}let p=e.south>0,g=e.north<0,f=p?e.south:g?e.north:0,x=ce.center(e,P$).longitude,_=h.fromRadians(x,f,n,i,oRe);_.z=0;let V=Math.abs(_.x)=c?Kt.INSIDE:Kt.INTERSECTING};var M$=new h,N$=new h,k$=new h,hRe=new h,F$=new h,fRe=new h;Wi.distanceSquaredTo=function(e,t){let n=h.subtract(t,e.center,A$),i=e.halfAxes,o=$.getColumn(i,0,M$),r=$.getColumn(i,1,N$),s=$.getColumn(i,2,k$),a=h.magnitude(o),c=h.magnitude(r),d=h.magnitude(s),u=!0,m=!0,p=!0;a>0?h.divideByScalar(o,a,o):u=!1,c>0?h.divideByScalar(r,c,r):m=!1,d>0?h.divideByScalar(s,d,s):p=!1;let g=!u+!m+!p,f,x,_;if(g===1){let Z=o;f=r,x=s,m?p||(Z=s,x=o):(Z=r,f=o),_=h.cross(f,x,F$),Z===o?o=_:Z===r?r=_:Z===s&&(s=_)}else if(g===2){f=o,m?f=r:p&&(f=s);let Z=h.UNIT_Y;Z.equalsEpsilon(f,W.EPSILON3)&&(Z=h.UNIT_X),x=h.cross(f,Z,hRe),h.normalize(x,x),_=h.cross(f,x,F$),h.normalize(_,_),f===o?(r=x,s=_):f===r?(s=x,o=_):f===s&&(o=x,r=_)}else g===3&&(o=h.UNIT_X,r=h.UNIT_Y,s=h.UNIT_Z);let C=fRe;C.x=h.dot(n,o),C.y=h.dot(n,r),C.z=h.dot(n,s);let V=0,L;return C.x<-a?(L=C.x+a,V+=L*L):C.x>a&&(L=C.x-a,V+=L*L),C.y<-c?(L=C.y+c,V+=L*L):C.y>c&&(L=C.y-c,V+=L*L),C.z<-d?(L=C.z+d,V+=L*L):C.z>d&&(L=C.z-d,V+=L*L),V};var pRe=new h,bRe=new h;Wi.computePlaneDistances=function(e,t,n,i){l(i)||(i=new _a);let o=Number.POSITIVE_INFINITY,r=Number.NEGATIVE_INFINITY,s=e.center,a=e.halfAxes,c=$.getColumn(a,0,M$),d=$.getColumn(a,1,N$),u=$.getColumn(a,2,k$),m=h.add(c,d,pRe);h.add(m,u,m),h.add(m,s,m);let p=h.subtract(m,t,bRe),g=h.dot(n,p);return o=Math.min(g,o),r=Math.max(g,r),h.add(s,c,m),h.add(m,d,m),h.subtract(m,u,m),h.subtract(m,t,p),g=h.dot(n,p),o=Math.min(g,o),r=Math.max(g,r),h.add(s,c,m),h.subtract(m,d,m),h.add(m,u,m),h.subtract(m,t,p),g=h.dot(n,p),o=Math.min(g,o),r=Math.max(g,r),h.add(s,c,m),h.subtract(m,d,m),h.subtract(m,u,m),h.subtract(m,t,p),g=h.dot(n,p),o=Math.min(g,o),r=Math.max(g,r),h.subtract(s,c,m),h.add(m,d,m),h.add(m,u,m),h.subtract(m,t,p),g=h.dot(n,p),o=Math.min(g,o),r=Math.max(g,r),h.subtract(s,c,m),h.add(m,d,m),h.subtract(m,u,m),h.subtract(m,t,p),g=h.dot(n,p),o=Math.min(g,o),r=Math.max(g,r),h.subtract(s,c,m),h.subtract(m,d,m),h.add(m,u,m),h.subtract(m,t,p),g=h.dot(n,p),o=Math.min(g,o),r=Math.max(g,r),h.subtract(s,c,m),h.subtract(m,d,m),h.subtract(m,u,m),h.subtract(m,t,p),g=h.dot(n,p),o=Math.min(g,o),r=Math.max(g,r),i.start=o,i.stop=r,i};var gRe=new h,yRe=new h,xRe=new h;Wi.computeCorners=function(e,t){l(t)||(t=[new h,new h,new h,new h,new h,new h,new h,new h]);let n=e.center,i=e.halfAxes,o=$.getColumn(i,0,gRe),r=$.getColumn(i,1,yRe),s=$.getColumn(i,2,xRe);return h.clone(n,t[0]),h.subtract(t[0],o,t[0]),h.subtract(t[0],r,t[0]),h.subtract(t[0],s,t[0]),h.clone(n,t[1]),h.subtract(t[1],o,t[1]),h.subtract(t[1],r,t[1]),h.add(t[1],s,t[1]),h.clone(n,t[2]),h.subtract(t[2],o,t[2]),h.add(t[2],r,t[2]),h.subtract(t[2],s,t[2]),h.clone(n,t[3]),h.subtract(t[3],o,t[3]),h.add(t[3],r,t[3]),h.add(t[3],s,t[3]),h.clone(n,t[4]),h.add(t[4],o,t[4]),h.subtract(t[4],r,t[4]),h.subtract(t[4],s,t[4]),h.clone(n,t[5]),h.add(t[5],o,t[5]),h.subtract(t[5],r,t[5]),h.add(t[5],s,t[5]),h.clone(n,t[6]),h.add(t[6],o,t[6]),h.add(t[6],r,t[6]),h.subtract(t[6],s,t[6]),h.clone(n,t[7]),h.add(t[7],o,t[7]),h.add(t[7],r,t[7]),h.add(t[7],s,t[7]),t};var _Re=new $;Wi.computeTransformation=function(e,t){l(t)||(t=new M);let n=e.center,i=$.multiplyByUniformScale(e.halfAxes,2,_Re);return M.fromRotationTranslation(i,n,t)};var TRe=new le;Wi.isOccluded=function(e,t){let n=le.fromOrientedBoundingBox(e,TRe);return!t.isBoundingSphereVisible(n)};Wi.prototype.intersectPlane=function(e){return Wi.intersectPlane(this,e)};Wi.prototype.distanceSquaredTo=function(e){return Wi.distanceSquaredTo(this,e)};Wi.prototype.computePlaneDistances=function(e,t,n){return Wi.computePlaneDistances(this,e,t,n)};Wi.prototype.computeCorners=function(e){return Wi.computeCorners(this,e)};Wi.prototype.computeTransformation=function(e){return Wi.computeTransformation(this,e)};Wi.prototype.isOccluded=function(e){return Wi.isOccluded(this,e)};Wi.equals=function(e,t){return e===t||l(e)&&l(t)&&h.equals(e.center,t.center)&&$.equals(e.halfAxes,t.halfAxes)};Wi.prototype.clone=function(e){return Wi.clone(this,e)};Wi.prototype.equals=function(e){return Wi.equals(this,e)};var Gn=Wi;var rXt=T(S(),1);var kEt=T(S(),1);var xEt=T(S(),1);var fEt=T(S(),1),SRe={DEPTH_BUFFER_BIT:256,STENCIL_BUFFER_BIT:1024,COLOR_BUFFER_BIT:16384,POINTS:0,LINES:1,LINE_LOOP:2,LINE_STRIP:3,TRIANGLES:4,TRIANGLE_STRIP:5,TRIANGLE_FAN:6,ZERO:0,ONE:1,SRC_COLOR:768,ONE_MINUS_SRC_COLOR:769,SRC_ALPHA:770,ONE_MINUS_SRC_ALPHA:771,DST_ALPHA:772,ONE_MINUS_DST_ALPHA:773,DST_COLOR:774,ONE_MINUS_DST_COLOR:775,SRC_ALPHA_SATURATE:776,FUNC_ADD:32774,BLEND_EQUATION:32777,BLEND_EQUATION_RGB:32777,BLEND_EQUATION_ALPHA:34877,FUNC_SUBTRACT:32778,FUNC_REVERSE_SUBTRACT:32779,BLEND_DST_RGB:32968,BLEND_SRC_RGB:32969,BLEND_DST_ALPHA:32970,BLEND_SRC_ALPHA:32971,CONSTANT_COLOR:32769,ONE_MINUS_CONSTANT_COLOR:32770,CONSTANT_ALPHA:32771,ONE_MINUS_CONSTANT_ALPHA:32772,BLEND_COLOR:32773,ARRAY_BUFFER:34962,ELEMENT_ARRAY_BUFFER:34963,ARRAY_BUFFER_BINDING:34964,ELEMENT_ARRAY_BUFFER_BINDING:34965,STREAM_DRAW:35040,STATIC_DRAW:35044,DYNAMIC_DRAW:35048,BUFFER_SIZE:34660,BUFFER_USAGE:34661,CURRENT_VERTEX_ATTRIB:34342,FRONT:1028,BACK:1029,FRONT_AND_BACK:1032,CULL_FACE:2884,BLEND:3042,DITHER:3024,STENCIL_TEST:2960,DEPTH_TEST:2929,SCISSOR_TEST:3089,POLYGON_OFFSET_FILL:32823,SAMPLE_ALPHA_TO_COVERAGE:32926,SAMPLE_COVERAGE:32928,NO_ERROR:0,INVALID_ENUM:1280,INVALID_VALUE:1281,INVALID_OPERATION:1282,OUT_OF_MEMORY:1285,CW:2304,CCW:2305,LINE_WIDTH:2849,ALIASED_POINT_SIZE_RANGE:33901,ALIASED_LINE_WIDTH_RANGE:33902,CULL_FACE_MODE:2885,FRONT_FACE:2886,DEPTH_RANGE:2928,DEPTH_WRITEMASK:2930,DEPTH_CLEAR_VALUE:2931,DEPTH_FUNC:2932,STENCIL_CLEAR_VALUE:2961,STENCIL_FUNC:2962,STENCIL_FAIL:2964,STENCIL_PASS_DEPTH_FAIL:2965,STENCIL_PASS_DEPTH_PASS:2966,STENCIL_REF:2967,STENCIL_VALUE_MASK:2963,STENCIL_WRITEMASK:2968,STENCIL_BACK_FUNC:34816,STENCIL_BACK_FAIL:34817,STENCIL_BACK_PASS_DEPTH_FAIL:34818,STENCIL_BACK_PASS_DEPTH_PASS:34819,STENCIL_BACK_REF:36003,STENCIL_BACK_VALUE_MASK:36004,STENCIL_BACK_WRITEMASK:36005,VIEWPORT:2978,SCISSOR_BOX:3088,COLOR_CLEAR_VALUE:3106,COLOR_WRITEMASK:3107,UNPACK_ALIGNMENT:3317,PACK_ALIGNMENT:3333,MAX_TEXTURE_SIZE:3379,MAX_VIEWPORT_DIMS:3386,SUBPIXEL_BITS:3408,RED_BITS:3410,GREEN_BITS:3411,BLUE_BITS:3412,ALPHA_BITS:3413,DEPTH_BITS:3414,STENCIL_BITS:3415,POLYGON_OFFSET_UNITS:10752,POLYGON_OFFSET_FACTOR:32824,TEXTURE_BINDING_2D:32873,SAMPLE_BUFFERS:32936,SAMPLES:32937,SAMPLE_COVERAGE_VALUE:32938,SAMPLE_COVERAGE_INVERT:32939,COMPRESSED_TEXTURE_FORMATS:34467,DONT_CARE:4352,FASTEST:4353,NICEST:4354,GENERATE_MIPMAP_HINT:33170,BYTE:5120,UNSIGNED_BYTE:5121,SHORT:5122,UNSIGNED_SHORT:5123,INT:5124,UNSIGNED_INT:5125,FLOAT:5126,DEPTH_COMPONENT:6402,ALPHA:6406,RGB:6407,RGBA:6408,LUMINANCE:6409,LUMINANCE_ALPHA:6410,UNSIGNED_SHORT_4_4_4_4:32819,UNSIGNED_SHORT_5_5_5_1:32820,UNSIGNED_SHORT_5_6_5:33635,FRAGMENT_SHADER:35632,VERTEX_SHADER:35633,MAX_VERTEX_ATTRIBS:34921,MAX_VERTEX_UNIFORM_VECTORS:36347,MAX_VARYING_VECTORS:36348,MAX_COMBINED_TEXTURE_IMAGE_UNITS:35661,MAX_VERTEX_TEXTURE_IMAGE_UNITS:35660,MAX_TEXTURE_IMAGE_UNITS:34930,MAX_FRAGMENT_UNIFORM_VECTORS:36349,SHADER_TYPE:35663,DELETE_STATUS:35712,LINK_STATUS:35714,VALIDATE_STATUS:35715,ATTACHED_SHADERS:35717,ACTIVE_UNIFORMS:35718,ACTIVE_ATTRIBUTES:35721,SHADING_LANGUAGE_VERSION:35724,CURRENT_PROGRAM:35725,NEVER:512,LESS:513,EQUAL:514,LEQUAL:515,GREATER:516,NOTEQUAL:517,GEQUAL:518,ALWAYS:519,KEEP:7680,REPLACE:7681,INCR:7682,DECR:7683,INVERT:5386,INCR_WRAP:34055,DECR_WRAP:34056,VENDOR:7936,RENDERER:7937,VERSION:7938,NEAREST:9728,LINEAR:9729,NEAREST_MIPMAP_NEAREST:9984,LINEAR_MIPMAP_NEAREST:9985,NEAREST_MIPMAP_LINEAR:9986,LINEAR_MIPMAP_LINEAR:9987,TEXTURE_MAG_FILTER:10240,TEXTURE_MIN_FILTER:10241,TEXTURE_WRAP_S:10242,TEXTURE_WRAP_T:10243,TEXTURE_2D:3553,TEXTURE:5890,TEXTURE_CUBE_MAP:34067,TEXTURE_BINDING_CUBE_MAP:34068,TEXTURE_CUBE_MAP_POSITIVE_X:34069,TEXTURE_CUBE_MAP_NEGATIVE_X:34070,TEXTURE_CUBE_MAP_POSITIVE_Y:34071,TEXTURE_CUBE_MAP_NEGATIVE_Y:34072,TEXTURE_CUBE_MAP_POSITIVE_Z:34073,TEXTURE_CUBE_MAP_NEGATIVE_Z:34074,MAX_CUBE_MAP_TEXTURE_SIZE:34076,TEXTURE0:33984,TEXTURE1:33985,TEXTURE2:33986,TEXTURE3:33987,TEXTURE4:33988,TEXTURE5:33989,TEXTURE6:33990,TEXTURE7:33991,TEXTURE8:33992,TEXTURE9:33993,TEXTURE10:33994,TEXTURE11:33995,TEXTURE12:33996,TEXTURE13:33997,TEXTURE14:33998,TEXTURE15:33999,TEXTURE16:34e3,TEXTURE17:34001,TEXTURE18:34002,TEXTURE19:34003,TEXTURE20:34004,TEXTURE21:34005,TEXTURE22:34006,TEXTURE23:34007,TEXTURE24:34008,TEXTURE25:34009,TEXTURE26:34010,TEXTURE27:34011,TEXTURE28:34012,TEXTURE29:34013,TEXTURE30:34014,TEXTURE31:34015,ACTIVE_TEXTURE:34016,REPEAT:10497,CLAMP_TO_EDGE:33071,MIRRORED_REPEAT:33648,FLOAT_VEC2:35664,FLOAT_VEC3:35665,FLOAT_VEC4:35666,INT_VEC2:35667,INT_VEC3:35668,INT_VEC4:35669,BOOL:35670,BOOL_VEC2:35671,BOOL_VEC3:35672,BOOL_VEC4:35673,FLOAT_MAT2:35674,FLOAT_MAT3:35675,FLOAT_MAT4:35676,SAMPLER_2D:35678,SAMPLER_CUBE:35680,VERTEX_ATTRIB_ARRAY_ENABLED:34338,VERTEX_ATTRIB_ARRAY_SIZE:34339,VERTEX_ATTRIB_ARRAY_STRIDE:34340,VERTEX_ATTRIB_ARRAY_TYPE:34341,VERTEX_ATTRIB_ARRAY_NORMALIZED:34922,VERTEX_ATTRIB_ARRAY_POINTER:34373,VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:34975,IMPLEMENTATION_COLOR_READ_TYPE:35738,IMPLEMENTATION_COLOR_READ_FORMAT:35739,COMPILE_STATUS:35713,LOW_FLOAT:36336,MEDIUM_FLOAT:36337,HIGH_FLOAT:36338,LOW_INT:36339,MEDIUM_INT:36340,HIGH_INT:36341,FRAMEBUFFER:36160,RENDERBUFFER:36161,RGBA4:32854,RGB5_A1:32855,RGB565:36194,DEPTH_COMPONENT16:33189,STENCIL_INDEX:6401,STENCIL_INDEX8:36168,DEPTH_STENCIL:34041,RENDERBUFFER_WIDTH:36162,RENDERBUFFER_HEIGHT:36163,RENDERBUFFER_INTERNAL_FORMAT:36164,RENDERBUFFER_RED_SIZE:36176,RENDERBUFFER_GREEN_SIZE:36177,RENDERBUFFER_BLUE_SIZE:36178,RENDERBUFFER_ALPHA_SIZE:36179,RENDERBUFFER_DEPTH_SIZE:36180,RENDERBUFFER_STENCIL_SIZE:36181,FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:36048,FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:36049,FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:36050,FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:36051,COLOR_ATTACHMENT0:36064,DEPTH_ATTACHMENT:36096,STENCIL_ATTACHMENT:36128,DEPTH_STENCIL_ATTACHMENT:33306,NONE:0,FRAMEBUFFER_COMPLETE:36053,FRAMEBUFFER_INCOMPLETE_ATTACHMENT:36054,FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:36055,FRAMEBUFFER_INCOMPLETE_DIMENSIONS:36057,FRAMEBUFFER_UNSUPPORTED:36061,FRAMEBUFFER_BINDING:36006,RENDERBUFFER_BINDING:36007,MAX_RENDERBUFFER_SIZE:34024,INVALID_FRAMEBUFFER_OPERATION:1286,UNPACK_FLIP_Y_WEBGL:37440,UNPACK_PREMULTIPLY_ALPHA_WEBGL:37441,CONTEXT_LOST_WEBGL:37442,UNPACK_COLORSPACE_CONVERSION_WEBGL:37443,BROWSER_DEFAULT_WEBGL:37444,COMPRESSED_RGB_S3TC_DXT1_EXT:33776,COMPRESSED_RGBA_S3TC_DXT1_EXT:33777,COMPRESSED_RGBA_S3TC_DXT3_EXT:33778,COMPRESSED_RGBA_S3TC_DXT5_EXT:33779,COMPRESSED_RGB_PVRTC_4BPPV1_IMG:35840,COMPRESSED_RGB_PVRTC_2BPPV1_IMG:35841,COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:35842,COMPRESSED_RGBA_PVRTC_2BPPV1_IMG:35843,COMPRESSED_RGBA_ASTC_4x4_WEBGL:37808,COMPRESSED_RGB_ETC1_WEBGL:36196,COMPRESSED_RGBA_BPTC_UNORM:36492,HALF_FLOAT_OES:36193,DOUBLE:5130,READ_BUFFER:3074,UNPACK_ROW_LENGTH:3314,UNPACK_SKIP_ROWS:3315,UNPACK_SKIP_PIXELS:3316,PACK_ROW_LENGTH:3330,PACK_SKIP_ROWS:3331,PACK_SKIP_PIXELS:3332,COLOR:6144,DEPTH:6145,STENCIL:6146,RED:6403,RGB8:32849,RGBA8:32856,RGB10_A2:32857,TEXTURE_BINDING_3D:32874,UNPACK_SKIP_IMAGES:32877,UNPACK_IMAGE_HEIGHT:32878,TEXTURE_3D:32879,TEXTURE_WRAP_R:32882,MAX_3D_TEXTURE_SIZE:32883,UNSIGNED_INT_2_10_10_10_REV:33640,MAX_ELEMENTS_VERTICES:33e3,MAX_ELEMENTS_INDICES:33001,TEXTURE_MIN_LOD:33082,TEXTURE_MAX_LOD:33083,TEXTURE_BASE_LEVEL:33084,TEXTURE_MAX_LEVEL:33085,MIN:32775,MAX:32776,DEPTH_COMPONENT24:33190,MAX_TEXTURE_LOD_BIAS:34045,TEXTURE_COMPARE_MODE:34892,TEXTURE_COMPARE_FUNC:34893,CURRENT_QUERY:34917,QUERY_RESULT:34918,QUERY_RESULT_AVAILABLE:34919,STREAM_READ:35041,STREAM_COPY:35042,STATIC_READ:35045,STATIC_COPY:35046,DYNAMIC_READ:35049,DYNAMIC_COPY:35050,MAX_DRAW_BUFFERS:34852,DRAW_BUFFER0:34853,DRAW_BUFFER1:34854,DRAW_BUFFER2:34855,DRAW_BUFFER3:34856,DRAW_BUFFER4:34857,DRAW_BUFFER5:34858,DRAW_BUFFER6:34859,DRAW_BUFFER7:34860,DRAW_BUFFER8:34861,DRAW_BUFFER9:34862,DRAW_BUFFER10:34863,DRAW_BUFFER11:34864,DRAW_BUFFER12:34865,DRAW_BUFFER13:34866,DRAW_BUFFER14:34867,DRAW_BUFFER15:34868,MAX_FRAGMENT_UNIFORM_COMPONENTS:35657,MAX_VERTEX_UNIFORM_COMPONENTS:35658,SAMPLER_3D:35679,SAMPLER_2D_SHADOW:35682,FRAGMENT_SHADER_DERIVATIVE_HINT:35723,PIXEL_PACK_BUFFER:35051,PIXEL_UNPACK_BUFFER:35052,PIXEL_PACK_BUFFER_BINDING:35053,PIXEL_UNPACK_BUFFER_BINDING:35055,FLOAT_MAT2x3:35685,FLOAT_MAT2x4:35686,FLOAT_MAT3x2:35687,FLOAT_MAT3x4:35688,FLOAT_MAT4x2:35689,FLOAT_MAT4x3:35690,SRGB:35904,SRGB8:35905,SRGB8_ALPHA8:35907,COMPARE_REF_TO_TEXTURE:34894,RGBA32F:34836,RGB32F:34837,RGBA16F:34842,RGB16F:34843,VERTEX_ATTRIB_ARRAY_INTEGER:35069,MAX_ARRAY_TEXTURE_LAYERS:35071,MIN_PROGRAM_TEXEL_OFFSET:35076,MAX_PROGRAM_TEXEL_OFFSET:35077,MAX_VARYING_COMPONENTS:35659,TEXTURE_2D_ARRAY:35866,TEXTURE_BINDING_2D_ARRAY:35869,R11F_G11F_B10F:35898,UNSIGNED_INT_10F_11F_11F_REV:35899,RGB9_E5:35901,UNSIGNED_INT_5_9_9_9_REV:35902,TRANSFORM_FEEDBACK_BUFFER_MODE:35967,MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:35968,TRANSFORM_FEEDBACK_VARYINGS:35971,TRANSFORM_FEEDBACK_BUFFER_START:35972,TRANSFORM_FEEDBACK_BUFFER_SIZE:35973,TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:35976,RASTERIZER_DISCARD:35977,MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:35978,MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:35979,INTERLEAVED_ATTRIBS:35980,SEPARATE_ATTRIBS:35981,TRANSFORM_FEEDBACK_BUFFER:35982,TRANSFORM_FEEDBACK_BUFFER_BINDING:35983,RGBA32UI:36208,RGB32UI:36209,RGBA16UI:36214,RGB16UI:36215,RGBA8UI:36220,RGB8UI:36221,RGBA32I:36226,RGB32I:36227,RGBA16I:36232,RGB16I:36233,RGBA8I:36238,RGB8I:36239,RED_INTEGER:36244,RGB_INTEGER:36248,RGBA_INTEGER:36249,SAMPLER_2D_ARRAY:36289,SAMPLER_2D_ARRAY_SHADOW:36292,SAMPLER_CUBE_SHADOW:36293,UNSIGNED_INT_VEC2:36294,UNSIGNED_INT_VEC3:36295,UNSIGNED_INT_VEC4:36296,INT_SAMPLER_2D:36298,INT_SAMPLER_3D:36299,INT_SAMPLER_CUBE:36300,INT_SAMPLER_2D_ARRAY:36303,UNSIGNED_INT_SAMPLER_2D:36306,UNSIGNED_INT_SAMPLER_3D:36307,UNSIGNED_INT_SAMPLER_CUBE:36308,UNSIGNED_INT_SAMPLER_2D_ARRAY:36311,DEPTH_COMPONENT32F:36012,DEPTH32F_STENCIL8:36013,FLOAT_32_UNSIGNED_INT_24_8_REV:36269,FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:33296,FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:33297,FRAMEBUFFER_ATTACHMENT_RED_SIZE:33298,FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:33299,FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:33300,FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:33301,FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:33302,FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:33303,FRAMEBUFFER_DEFAULT:33304,UNSIGNED_INT_24_8:34042,DEPTH24_STENCIL8:35056,UNSIGNED_NORMALIZED:35863,DRAW_FRAMEBUFFER_BINDING:36006,READ_FRAMEBUFFER:36008,DRAW_FRAMEBUFFER:36009,READ_FRAMEBUFFER_BINDING:36010,RENDERBUFFER_SAMPLES:36011,FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:36052,MAX_COLOR_ATTACHMENTS:36063,COLOR_ATTACHMENT1:36065,COLOR_ATTACHMENT2:36066,COLOR_ATTACHMENT3:36067,COLOR_ATTACHMENT4:36068,COLOR_ATTACHMENT5:36069,COLOR_ATTACHMENT6:36070,COLOR_ATTACHMENT7:36071,COLOR_ATTACHMENT8:36072,COLOR_ATTACHMENT9:36073,COLOR_ATTACHMENT10:36074,COLOR_ATTACHMENT11:36075,COLOR_ATTACHMENT12:36076,COLOR_ATTACHMENT13:36077,COLOR_ATTACHMENT14:36078,COLOR_ATTACHMENT15:36079,FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:36182,MAX_SAMPLES:36183,HALF_FLOAT:5131,RG:33319,RG_INTEGER:33320,R8:33321,RG8:33323,R16F:33325,R32F:33326,RG16F:33327,RG32F:33328,R8I:33329,R8UI:33330,R16I:33331,R16UI:33332,R32I:33333,R32UI:33334,RG8I:33335,RG8UI:33336,RG16I:33337,RG16UI:33338,RG32I:33339,RG32UI:33340,VERTEX_ARRAY_BINDING:34229,R8_SNORM:36756,RG8_SNORM:36757,RGB8_SNORM:36758,RGBA8_SNORM:36759,SIGNED_NORMALIZED:36764,COPY_READ_BUFFER:36662,COPY_WRITE_BUFFER:36663,COPY_READ_BUFFER_BINDING:36662,COPY_WRITE_BUFFER_BINDING:36663,UNIFORM_BUFFER:35345,UNIFORM_BUFFER_BINDING:35368,UNIFORM_BUFFER_START:35369,UNIFORM_BUFFER_SIZE:35370,MAX_VERTEX_UNIFORM_BLOCKS:35371,MAX_FRAGMENT_UNIFORM_BLOCKS:35373,MAX_COMBINED_UNIFORM_BLOCKS:35374,MAX_UNIFORM_BUFFER_BINDINGS:35375,MAX_UNIFORM_BLOCK_SIZE:35376,MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:35377,MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:35379,UNIFORM_BUFFER_OFFSET_ALIGNMENT:35380,ACTIVE_UNIFORM_BLOCKS:35382,UNIFORM_TYPE:35383,UNIFORM_SIZE:35384,UNIFORM_BLOCK_INDEX:35386,UNIFORM_OFFSET:35387,UNIFORM_ARRAY_STRIDE:35388,UNIFORM_MATRIX_STRIDE:35389,UNIFORM_IS_ROW_MAJOR:35390,UNIFORM_BLOCK_BINDING:35391,UNIFORM_BLOCK_DATA_SIZE:35392,UNIFORM_BLOCK_ACTIVE_UNIFORMS:35394,UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:35395,UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:35396,UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:35398,INVALID_INDEX:4294967295,MAX_VERTEX_OUTPUT_COMPONENTS:37154,MAX_FRAGMENT_INPUT_COMPONENTS:37157,MAX_SERVER_WAIT_TIMEOUT:37137,OBJECT_TYPE:37138,SYNC_CONDITION:37139,SYNC_STATUS:37140,SYNC_FLAGS:37141,SYNC_FENCE:37142,SYNC_GPU_COMMANDS_COMPLETE:37143,UNSIGNALED:37144,SIGNALED:37145,ALREADY_SIGNALED:37146,TIMEOUT_EXPIRED:37147,CONDITION_SATISFIED:37148,WAIT_FAILED:37149,SYNC_FLUSH_COMMANDS_BIT:1,VERTEX_ATTRIB_ARRAY_DIVISOR:35070,ANY_SAMPLES_PASSED:35887,ANY_SAMPLES_PASSED_CONSERVATIVE:36202,SAMPLER_BINDING:35097,RGB10_A2UI:36975,INT_2_10_10_10_REV:36255,TRANSFORM_FEEDBACK:36386,TRANSFORM_FEEDBACK_PAUSED:36387,TRANSFORM_FEEDBACK_ACTIVE:36388,TRANSFORM_FEEDBACK_BINDING:36389,COMPRESSED_R11_EAC:37488,COMPRESSED_SIGNED_R11_EAC:37489,COMPRESSED_RG11_EAC:37490,COMPRESSED_SIGNED_RG11_EAC:37491,COMPRESSED_RGB8_ETC2:37492,COMPRESSED_SRGB8_ETC2:37493,COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:37494,COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:37495,COMPRESSED_RGBA8_ETC2_EAC:37496,COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:37497,TEXTURE_IMMUTABLE_FORMAT:37167,MAX_ELEMENT_INDEX:36203,TEXTURE_IMMUTABLE_LEVELS:33503,MAX_TEXTURE_MAX_ANISOTROPY_EXT:34047},ne=Object.freeze(SRe);var Zn={BYTE:ne.BYTE,UNSIGNED_BYTE:ne.UNSIGNED_BYTE,SHORT:ne.SHORT,UNSIGNED_SHORT:ne.UNSIGNED_SHORT,INT:ne.INT,UNSIGNED_INT:ne.UNSIGNED_INT,FLOAT:ne.FLOAT,DOUBLE:ne.DOUBLE};Zn.getSizeInBytes=function(e){switch(e){case Zn.BYTE:return Int8Array.BYTES_PER_ELEMENT;case Zn.UNSIGNED_BYTE:return Uint8Array.BYTES_PER_ELEMENT;case Zn.SHORT:return Int16Array.BYTES_PER_ELEMENT;case Zn.UNSIGNED_SHORT:return Uint16Array.BYTES_PER_ELEMENT;case Zn.INT:return Int32Array.BYTES_PER_ELEMENT;case Zn.UNSIGNED_INT:return Uint32Array.BYTES_PER_ELEMENT;case Zn.FLOAT:return Float32Array.BYTES_PER_ELEMENT;case Zn.DOUBLE:return Float64Array.BYTES_PER_ELEMENT}};Zn.fromTypedArray=function(e){if(e instanceof Int8Array)return Zn.BYTE;if(e instanceof Uint8Array)return Zn.UNSIGNED_BYTE;if(e instanceof Int16Array)return Zn.SHORT;if(e instanceof Uint16Array)return Zn.UNSIGNED_SHORT;if(e instanceof Int32Array)return Zn.INT;if(e instanceof Uint32Array)return Zn.UNSIGNED_INT;if(e instanceof Float32Array)return Zn.FLOAT;if(e instanceof Float64Array)return Zn.DOUBLE};Zn.validate=function(e){return l(e)&&(e===Zn.BYTE||e===Zn.UNSIGNED_BYTE||e===Zn.SHORT||e===Zn.UNSIGNED_SHORT||e===Zn.INT||e===Zn.UNSIGNED_INT||e===Zn.FLOAT||e===Zn.DOUBLE)};Zn.createTypedArray=function(e,t){switch(e){case Zn.BYTE:return new Int8Array(t);case Zn.UNSIGNED_BYTE:return new Uint8Array(t);case Zn.SHORT:return new Int16Array(t);case Zn.UNSIGNED_SHORT:return new Uint16Array(t);case Zn.INT:return new Int32Array(t);case Zn.UNSIGNED_INT:return new Uint32Array(t);case Zn.FLOAT:return new Float32Array(t);case Zn.DOUBLE:return new Float64Array(t)}};Zn.createArrayBufferView=function(e,t,n,i){switch(n=y(n,0),i=y(i,(t.byteLength-n)/Zn.getSizeInBytes(e)),e){case Zn.BYTE:return new Int8Array(t,n,i);case Zn.UNSIGNED_BYTE:return new Uint8Array(t,n,i);case Zn.SHORT:return new Int16Array(t,n,i);case Zn.UNSIGNED_SHORT:return new Uint16Array(t,n,i);case Zn.INT:return new Int32Array(t,n,i);case Zn.UNSIGNED_INT:return new Uint32Array(t,n,i);case Zn.FLOAT:return new Float32Array(t,n,i);case Zn.DOUBLE:return new Float64Array(t,n,i)}};Zn.fromName=function(e){switch(e){case"BYTE":return Zn.BYTE;case"UNSIGNED_BYTE":return Zn.UNSIGNED_BYTE;case"SHORT":return Zn.SHORT;case"UNSIGNED_SHORT":return Zn.UNSIGNED_SHORT;case"INT":return Zn.INT;case"UNSIGNED_INT":return Zn.UNSIGNED_INT;case"FLOAT":return Zn.FLOAT;case"DOUBLE":return Zn.DOUBLE}};var Q=Object.freeze(Zn);var WEt=T(S(),1);var VEt=T(S(),1);function Qt(e,t,n,i){this[0]=y(e,0),this[1]=y(n,0),this[2]=y(t,0),this[3]=y(i,0)}Qt.packedLength=4;Qt.pack=function(e,t,n){return n=y(n,0),t[n++]=e[0],t[n++]=e[1],t[n++]=e[2],t[n++]=e[3],t};Qt.unpack=function(e,t,n){return t=y(t,0),l(n)||(n=new Qt),n[0]=e[t++],n[1]=e[t++],n[2]=e[t++],n[3]=e[t++],n};Qt.packArray=function(e,t){let n=e.length,i=n*4;l(t)?!Array.isArray(t)&&t.length!==i||t.length!==i&&(t.length=i):t=new Array(i);for(let o=0;o>1^-(e&1)}bo.zigZagDeltaDecode=function(e,t,n){let i=e.length,o=0,r=0,s=0;for(let a=0;a>11,u=c>>5&o,m=c&i,p=3*a;t[p]=d*r,t[p+1]=u*s,t[p+2]=m*r}return t};var wn=bo;var OEt=T(S(),1);var rN={};rN.getHeight=function(e,t,n){return(e-n)*t+n};var ZRe=new he;rN.getPosition=function(e,t,n,i,o){let r=t.cartesianToCartographic(e,ZRe);if(!l(r))return h.clone(e,o);let s=rN.getHeight(r.height,n,i);return h.fromRadians(r.longitude,r.latitude,s,t,o)};var mr=rN;var zEt=T(S(),1),GRe={NONE:0,BITS12:1},Gs=Object.freeze(GRe);var tx=new h,ERe=new h,ou=new D,sN=new M,XRe=new M,IRe=Math.pow(2,12);function Ja(e,t,n,i,o,r,s,a,c,d){let u=Gs.NONE,m,p;if(l(t)&&l(n)&&l(i)&&l(o)){let g=t.minimum,f=t.maximum,x=h.subtract(f,g,ERe),_=i-n;Math.max(h.maximumComponent(x),_)gl.MaximumLatitude?e=gl.MaximumLatitude:e<-gl.MaximumLatitude&&(e=-gl.MaximumLatitude);let t=Math.sin(e);return .5*Math.log((1+t)/(1-t))};gl.MaximumLatitude=gl.mercatorAngleToGeodeticLatitude(Math.PI);gl.prototype.project=function(e,t){let n=this._semimajorAxis,i=e.longitude*n,o=gl.geodeticLatitudeToMercatorAngle(e.latitude)*n,r=e.height;return l(t)?(t.x=i,t.y=o,t.z=r,t):new h(i,o,r)};gl.prototype.unproject=function(e,t){let n=this._oneOverSemimajorAxis,i=e.x*n,o=gl.mercatorAngleToGeodeticLatitude(e.y*n),r=e.z;return l(t)?(t.longitude=i,t.latitude=o,t.height=r,t):new he(i,o,r)};var Ci=gl;var Yh={};Yh.DEFAULT_STRUCTURE=Object.freeze({heightScale:1,heightOffset:0,elementsPerHeight:1,stride:1,elementMultiplier:256,isBigEndian:!1});var WY=new h,PRe=new M,vRe=new h,wRe=new h;Yh.computeVertices=function(e){let t=Math.cos,n=Math.sin,i=Math.sqrt,o=Math.atan,r=Math.exp,s=W.PI_OVER_TWO,a=W.toRadians,c=e.heightmap,d=e.width,u=e.height,m=e.skirtHeight,p=m>0,g=y(e.isGeographic,!0),f=y(e.ellipsoid,ie.WGS84),x=1/f.maximumRadius,_=ce.clone(e.nativeRectangle),C=ce.clone(e.rectangle),V,L,Z,G;l(C)?(V=C.west,L=C.south,Z=C.east,G=C.north):g?(V=a(_.west),L=a(_.south),Z=a(_.east),G=a(_.north)):(V=_.west*x,L=s-2*o(r(-_.south*x)),Z=_.east*x,G=s-2*o(r(-_.north*x)));let X=e.relativeToCenter,v=l(X);X=v?X:h.ZERO;let P=y(e.includeWebMercatorT,!1),F=y(e.exaggeration,1),A=y(e.exaggerationRelativeHeight,0),R=F!==1,E=y(e.structure,Yh.DEFAULT_STRUCTURE),I=y(E.heightScale,Yh.DEFAULT_STRUCTURE.heightScale),w=y(E.heightOffset,Yh.DEFAULT_STRUCTURE.heightOffset),N=y(E.elementsPerHeight,Yh.DEFAULT_STRUCTURE.elementsPerHeight),B=y(E.stride,Yh.DEFAULT_STRUCTURE.stride),U=y(E.elementMultiplier,Yh.DEFAULT_STRUCTURE.elementMultiplier),O=y(E.isBigEndian,Yh.DEFAULT_STRUCTURE.isBigEndian),k=ce.computeWidth(_),J=ce.computeHeight(_),H=k/(d-1),ee=J/(u-1);g||(k*=x,J*=x);let z=f.radiiSquared,j=z.x,q=z.y,be=z.z,Te=65536,ae=-65536,ye=Gt.eastNorthUpToFixedFrame(X,f),Se=M.inverseTransformation(ye,PRe),Le,Xe;P&&(Le=Ci.geodeticLatitudeToMercatorAngle(L),Xe=1/(Ci.geodeticLatitudeToMercatorAngle(G)-Le));let Pe=vRe;Pe.x=Number.POSITIVE_INFINITY,Pe.y=Number.POSITIVE_INFINITY,Pe.z=Number.POSITIVE_INFINITY;let ke=wRe;ke.x=Number.NEGATIVE_INFINITY,ke.y=Number.NEGATIVE_INFINITY,ke.z=Number.NEGATIVE_INFINITY;let Pt=Number.POSITIVE_INFINITY,Ot=d*u,ht=m>0?d*2+u*2:0,Ae=Ot+ht,$e=new Array(Ae),Qe=new Array(Ae),je=new Array(Ae),kt=P?new Array(Ae):[],pe=R?new Array(Ae):[],Ve=0,Dt=u,bt=0,li=d;p&&(--Ve,++Dt,--bt,++li);let Vo=1e-5;for(let qe=Ve;qe=u&&(dt=u-1);let Bt=_.north-ee*dt;g?Bt=a(Bt):Bt=s-2*o(r(-Bt*x));let Ln=(Bt-L)/(G-L);Ln=W.clamp(Ln,0,1);let Lo=qe===Ve,nr=qe===Dt-1;m>0&&(Lo?Bt+=Vo*J:nr&&(Bt-=Vo*J));let Na=t(Bt),ka=n(Bt),io=be*ka,Bi;P&&(Bi=(Ci.geodeticLatitudeToMercatorAngle(Bt)-Le)*Xe);for(let us=bt;us=d&&(yr=d-1);let ml=dt*(d*B)+yr*B,Do;if(N===1)Do=c[ml];else{Do=0;let es;if(O)for(es=0;es=0;--es)Do=Do*U+c[ml+es]}Do=Do*I+w,ae=Math.max(ae,Do),Te=Math.min(Te,Do);let xr=_.west+H*yr;g?xr=a(xr):xr=xr*x;let fb=(xr-V)/(Z-V);fb=W.clamp(fb,0,1);let Gc=dt*d+yr;if(m>0){let es=us===bt,pb=us===li-1,bb=Lo||nr||es||pb;if((Lo||nr)&&(es||pb))continue;bb&&(Do-=m,es?(Gc=Ot+(u-dt-1),xr-=Vo*k):nr?Gc=Ot+u+(d-yr-1):pb?(Gc=Ot+u+d+dt,xr+=Vo*k):Lo&&(Gc=Ot+u+d+u+yr))}let Ua=Na*t(xr),dr=Na*n(xr),ya=j*Ua,oo=q*dr,$n=1/i(ya*Ua+oo*dr+io*ka),Ec=ya*$n,nd=oo*$n,Ny=io*$n,_r=new h;_r.x=Ec+Ua*Do,_r.y=nd+dr*Do,_r.z=Ny+ka*Do,M.multiplyByPoint(Se,_r,WY),h.minimumByComponent(WY,Pe,Pe),h.maximumByComponent(WY,ke,ke),Pt=Math.min(Pt,Do),$e[Gc]=_r,je[Gc]=new D(fb,Ln),Qe[Gc]=Do,P&&(kt[Gc]=Bi),R&&(pe[Gc]=f.geodeticSurfaceNormal(_r))}}let Rs=le.fromPoints($e),zs;l(C)&&(zs=Gn.fromRectangle(C,Te,ae,f));let Nr;v&&(Nr=new lp(f).computeHorizonCullingPointPossiblyUnderEllipsoid(X,$e,Te));let $r=new Lb(Pe,ke,X),Ue=new Qa(X,$r,Pt,ae,ye,!1,P,R,F,A),it=new Float32Array(Ae*Ue.stride),tt=0;for(let qe=0;qe{e.onmessage=function(o){let r=o.data.array,s=l(r)&&r[0]===t;i(s),e.terminate(),Qs._canTransferArrayBuffer=s}})}return Qs._canTransferArrayBuffer}var vY=new ge;function PY(e){let t;try{t=new Blob([e],{type:"application/javascript"})}catch{let o=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,r=new o;r.append(e),t=r.getBlob("application/javascript")}return(window.URL||window.webkitURL).createObjectURL(t)}function wY(e){let t=new z$.default(e),n=t.scheme().length!==0&&t.fragment().length===0,i=e.replace(/\.js$/,""),o={},r,s;if(xb(e))s=e;else if(!n){let a=tn(`${Qs._workerModulePrefix}/${i}.js`);xb(a)&&(s=a)}if(s){let a=`import "${s}";`;return r=PY(a),o.type="module",new Worker(r,o)}if(!n&&typeof CESIUM_WORKERS<"u"){let a=` importScripts("${PY(CESIUM_WORKERS)}"); CesiumWorkers["${i}"](); `;return r=PY(a),new Worker(r,o)}if(r=e,n||(r=tn(`${Qs._workerModulePrefix+i}.js`)),!Yt.supportsEsmWebWorkers())throw new ue("This browser is not supported. Please update your browser to continue.");return o.type="module",new Worker(r,o)}async function MRe(e,t){let n={modulePath:void 0,wasmBinaryFile:void 0,wasmBinary:void 0};if(!Yt.supportsWebAssembly()){if(!l(t.fallbackModulePath))throw new ue(`This browser does not support Web Assembly, and no backup module was provided for ${e._workerPath}`);return n.modulePath=tn(t.fallbackModulePath),n}n.wasmBinaryFile=tn(t.wasmBinaryFile);let i=await Ee.fetchArrayBuffer({url:n.wasmBinaryFile});return n.wasmBinary=i,n}function Qs(e,t){this._workerPath=e,this._maximumActiveTasks=y(t,Number.POSITIVE_INFINITY),this._activeTasks=0,this._nextID=0,this._webAssemblyPromise=void 0}var NRe=(e,t,n,i)=>{let o=({data:r})=>{if(r.id===t){if(l(r.error)){let s=r.error;s.name==="RuntimeError"?(s=new ue(r.error.message),s.stack=r.error.stack):s.name==="DeveloperError"?(s=new fe(r.error.message),s.stack=r.error.stack):s.name==="Error"&&(s=new Error(r.error.message),s.stack=r.error.stack),vY.raiseEvent(s),i(s)}else vY.raiseEvent(),n(r.result);e.removeEventListener("message",o)}};return o},kRe=[];async function URe(e,t,n){let i=await Promise.resolve(K$());l(n)?i||(n.length=0):n=kRe;let o=e._nextID++,r=new Promise((s,a)=>{e._worker.addEventListener("message",NRe(e._worker,o,s,a))});return e._worker.postMessage({id:o,baseUrl:tn.getCesiumBaseUrl().url,parameters:t,canTransferArrayBuffer:i},n),r}async function DRe(e,t,n){++e._activeTasks;try{let i=await URe(e,t,n);return--e._activeTasks,i}catch(i){throw--e._activeTasks,i}}Qs.prototype.scheduleTask=function(e,t){if(l(this._worker)||(this._worker=wY(this._workerPath)),!(this._activeTasks>=this._maximumActiveTasks))return DRe(this,e,t)};Qs.prototype.initWebAssemblyModule=async function(e){if(l(this._webAssemblyPromise))return this._webAssemblyPromise;let t=async()=>{let n=this._worker=wY(this._workerPath),i=await MRe(this,e),o=await Promise.resolve(K$()),r,s=i.wasmBinary;l(s)&&o&&(r=[s]);let a=new Promise((c,d)=>{n.onmessage=function({data:u}){l(u)?c(u.result):d(new ue("Could not configure wasm module"))}});return n.postMessage({canTransferArrayBuffer:o,parameters:{webAssemblyConfig:i}},r),a};return this._webAssemblyPromise=t(),this._webAssemblyPromise};Qs.prototype.isDestroyed=function(){return!1};Qs.prototype.destroy=function(){return l(this._worker)&&this._worker.terminate(),me(this)};Qs.taskCompletedEvent=vY;Qs._defaultWorkerModulePrefix="Workers/";Qs._workerModulePrefix=Qs._defaultWorkerModulePrefix;Qs._canTransferArrayBuffer=void 0;var hi=Qs;var KXt=T(S(),1);function Rb(){fe.throwInstantiationError()}Object.defineProperties(Rb.prototype,{credits:{get:fe.throwInstantiationError},waterMask:{get:fe.throwInstantiationError}});Rb.prototype.interpolateHeight=fe.throwInstantiationError;Rb.prototype.isChildAvailable=fe.throwInstantiationError;Rb.prototype.createMesh=fe.throwInstantiationError;Rb.prototype.upsample=fe.throwInstantiationError;Rb.prototype.wasCreatedByUpsampling=fe.throwInstantiationError;Rb.maximumAsynchronousTasks=5;var pm=Rb;var jXt=T(S(),1);function BRe(e,t,n,i,o,r,s,a,c,d,u,m,p,g,f,x){this.center=e,this.vertices=t,this.stride=y(d,6),this.indices=n,this.indexCountWithoutSkirts=i,this.vertexCountWithoutSkirts=o,this.minimumHeight=r,this.maximumHeight=s,this.boundingSphere3D=a,this.occludeePointInScaledSpace=c,this.orientedBoundingBox=u,this.encoding=m,this.westIndicesSouthToNorth=p,this.southIndicesEastToWest=g,this.eastIndicesNorthToSouth=f,this.northIndicesWestToEast=x}var ru=BRe;var cIt=T(S(),1);var nIt=T(S(),1);var Es={UNSIGNED_BYTE:ne.UNSIGNED_BYTE,UNSIGNED_SHORT:ne.UNSIGNED_SHORT,UNSIGNED_INT:ne.UNSIGNED_INT};Es.getSizeInBytes=function(e){switch(e){case Es.UNSIGNED_BYTE:return Uint8Array.BYTES_PER_ELEMENT;case Es.UNSIGNED_SHORT:return Uint16Array.BYTES_PER_ELEMENT;case Es.UNSIGNED_INT:return Uint32Array.BYTES_PER_ELEMENT}};Es.fromSizeInBytes=function(e){switch(e){case 2:return Es.UNSIGNED_SHORT;case 4:return Es.UNSIGNED_INT;case 1:return Es.UNSIGNED_BYTE}};Es.validate=function(e){return l(e)&&(e===Es.UNSIGNED_BYTE||e===Es.UNSIGNED_SHORT||e===Es.UNSIGNED_INT)};Es.createTypedArray=function(e,t){return e>=W.SIXTY_FOUR_KILOBYTES?new Uint32Array(t):new Uint16Array(t)};Es.createTypedArrayFromArrayBuffer=function(e,t,n,i){return e>=W.SIXTY_FOUR_KILOBYTES?new Uint32Array(t,n,i):new Uint16Array(t,n,i)};Es.fromTypedArray=function(e){if(e instanceof Uint8Array)return Es.UNSIGNED_BYTE;if(e instanceof Uint16Array)return Es.UNSIGNED_SHORT;if(e instanceof Uint32Array)return Es.UNSIGNED_INT};var Me=Object.freeze(Es);function wc(){fe.throwInstantiationError()}Object.defineProperties(wc.prototype,{errorEvent:{get:fe.throwInstantiationError},credit:{get:fe.throwInstantiationError},tilingScheme:{get:fe.throwInstantiationError},hasWaterMask:{get:fe.throwInstantiationError},hasVertexNormals:{get:fe.throwInstantiationError},availability:{get:fe.throwInstantiationError}});var J$=[];wc.getRegularGridIndices=function(e,t){let n=J$[e];l(n)||(J$[e]=n=[]);let i=n[t];return l(i)||(e*t0?L=Dr.getRegularGridAndSkirtIndicesAndEdgeIndices(V.gridWidth,V.gridHeight):L=Dr.getRegularGridIndicesAndEdgeIndices(V.gridWidth,V.gridHeight);let Z=V.gridWidth*V.gridHeight;return C._mesh=new ru(m,new Float32Array(V.vertices),L.indices,L.indexCountWithoutSkirts,Z,V.minimumHeight,V.maximumHeight,le.clone(V.boundingSphere3D),h.clone(V.occludeePointInScaledSpace),V.numberOfAttributes,Gn.clone(V.orientedBoundingBox),Qa.clone(V.encoding),L.westIndicesSouthToNorth,L.southIndicesEastToWest,L.eastIndicesNorthToSouth,L.northIndicesWestToEast),C._buffer=void 0,C._mesh})};dp.prototype._createMeshSync=function(e){let t=e.tilingScheme,n=e.x,i=e.y,o=e.level,r=y(e.exaggeration,1),s=y(e.exaggerationRelativeHeight,0),a=t.ellipsoid,c=t.tileXYToNativeRectangle(n,i,o),d=t.tileXYToRectangle(n,i,o),u=a.cartographicToCartesian(ce.center(d)),m=this._structure,g=Dr.getEstimatedLevelZeroGeometricErrorForAHeightmap(a,this._width,t.getNumberOfXTilesAtLevel(0))/(1<0?x=Dr.getRegularGridAndSkirtIndicesAndEdgeIndices(this._width,this._height):x=Dr.getRegularGridIndicesAndEdgeIndices(this._width,this._height);let _=f.gridWidth*f.gridHeight;return this._mesh=new ru(u,f.vertices,x.indices,x.indexCountWithoutSkirts,_,f.minimumHeight,f.maximumHeight,f.boundingSphere3D,f.occludeePointInScaledSpace,f.encoding.stride,f.orientedBoundingBox,f.encoding,x.westIndicesSouthToNorth,x.southIndicesEastToWest,x.eastIndicesNorthToSouth,x.northIndicesWestToEast),this._mesh};dp.prototype.interpolateHeight=function(e,t,n){let i=this._width,o=this._height,r=this._structure,s=r.stride,a=r.elementsPerHeight,c=r.elementMultiplier,d=r.isBigEndian,u=r.heightOffset,m=r.heightScale,p=l(this._mesh),g=this._encoding===iu.LERC;if(!p&&g)return;let x;if(p){let _=this._mesh.vertices,C=this._mesh.encoding;x=tee(_,C,u,m,e,i,o,t,n)}else x=HRe(this._buffer,a,c,s,d,e,i,o,t,n),x=x*m+u;return x};dp.prototype.upsample=function(e,t,n,i,o,r,s){let a=this._mesh;if(!l(a))return;let c=this._width,d=this._height,u=this._structure,m=u.stride,p=new this._bufferType(c*d*m),g=a.vertices,f=a.encoding,x=e.tileXYToRectangle(t,n,i),_=e.tileXYToRectangle(o,r,s),C=u.heightOffset,V=u.heightScale,L=u.elementsPerHeight,Z=u.elementMultiplier,G=u.isBigEndian,X=Math.pow(Z,L-1);for(let v=0;vu.highestEncodedHeight?u.highestEncodedHeight:b,zRe(p,L,Z,X,m,G,v*c+F,b)}}return Promise.resolve(new dp({buffer:p,width:c,height:d,childTileMask:0,structure:this._structure,createdByUpsampling:!0}))};dp.prototype.isChildAvailable=function(e,t,n,i){let o=2;return n!==e*2&&++o,i!==t*2&&(o-=2),(this._childTileMask&1<=s&&(g=s-1,p=s-2);let f=m|0,x=f+1;x>=a&&(x=a-1,f=a-2);let _=u-p,C=m-f;f=a-1-f,x=a-1-x;let V=dN(e,t,n,i,o,f*s+p),L=dN(e,t,n,i,o,f*s+g),Z=dN(e,t,n,i,o,x*s+p),G=dN(e,t,n,i,o,x*s+g);return nee(_,C,V,L,Z,G)}function tee(e,t,n,i,o,r,s,a,c){let d=(a-o.west)*(r-1)/(o.east-o.west),u=(c-o.south)*(s-1)/(o.north-o.south),m=d|0,p=m+1;p>=r&&(p=r-1,m=r-2);let g=u|0,f=g+1;f>=s&&(f=s-1,g=s-2);let x=d-m,_=u-g;g=s-1-g,f=s-1-f;let C=(t.decodeHeight(e,g*r+m)-n)/i,V=(t.decodeHeight(e,g*r+p)-n)/i,L=(t.decodeHeight(e,f*r+m)-n)/i,Z=(t.decodeHeight(e,f*r+p)-n)/i;return nee(x,_,C,V,L,Z)}function nee(e,t,n,i,o,r){return t=0;--a)s=s*n+e[r+a];return s}function zRe(e,t,n,i,o,r,s,a){s*=o;let c;if(r)for(c=0;c0;--c)e[s+c]=a/i|0,a-=e[s+c]*i,i/=n;e[s+c]=a}var Ta=dp;var IIt=T(S(),1);function kS(e,t){this._tilingScheme=e,this._maximumLevel=t,this._rootNodes=[]}var nx=new ce;function KRe(e,t,n,i){let o=i.length;for(let r=0;r=0;--i)if(l(n[i])&&n[i].length===0)return i;return 0};var iee=new he;kS.prototype.isTileAvailable=function(e,t,n){let i=this._tilingScheme.tileXYToRectangle(t,n,e,nx);return ce.center(i,iee),this.computeMaximumLevelAtPosition(iee)>=e};kS.prototype.computeChildMaskForTile=function(e,t,n){let i=e+1;if(i>=this._maximumLevel)return 0;let o=0;return o|=this.isTileAvailable(i,2*t,2*n+1)?1:0,o|=this.isTileAvailable(i,2*t+1,2*n+1)?2:0,o|=this.isTileAvailable(i,2*t,2*n)?4:0,o|=this.isTileAvailable(i,2*t+1,2*n)?8:0,o};function MS(e,t,n,i,o){this.tilingScheme=e,this.parent=t,this.level=n,this.x=i,this.y=o,this.extent=e.tileXYToRectangle(i,o,n),this.rectangles=[],this._sw=void 0,this._se=void 0,this._nw=void 0,this._ne=void 0}Object.defineProperties(MS.prototype,{nw:{get:function(){return this._nw||(this._nw=new MS(this.tilingScheme,this,this.level+1,this.x*2,this.y*2)),this._nw}},ne:{get:function(){return this._ne||(this._ne=new MS(this.tilingScheme,this,this.level+1,this.x*2+1,this.y*2)),this._ne}},sw:{get:function(){return this._sw||(this._sw=new MS(this.tilingScheme,this,this.level+1,this.x*2,this.y*2+1)),this._sw}},se:{get:function(){return this._se||(this._se=new MS(this.tilingScheme,this,this.level+1,this.x*2+1,this.y*2+1)),this._se}}});function $Re(e,t,n,i,o){this.level=e,this.west=t,this.south=n,this.east=i,this.north=o}function FY(e,t){let n=Math.max(e.west,t.west),i=Math.max(e.south,t.south),o=Math.min(e.east,t.east),r=Math.min(e.north,t.north);return i=e.west&&t.east<=e.east&&t.south>=e.south&&t.north<=e.north}function NS(e,t){return t.longitude>=e.west&&t.longitude<=e.east&&t.latitude>=e.south&&t.latitude<=e.north}function jL(e,t,n){let i=0,o=!1;for(;!o;){let r=t._nw&&NS(t._nw.extent,n),s=t._ne&&NS(t._ne.extent,n),a=t._sw&&NS(t._sw.extent,n),c=t._se&&NS(t._se.extent,n);if(r+s+a+c>1){r&&(i=Math.max(i,jL(t,t._nw,n))),s&&(i=Math.max(i,jL(t,t._ne,n))),a&&(i=Math.max(i,jL(t,t._sw,n))),c&&(i=Math.max(i,jL(t,t._se,n)));break}else r?t=t._nw:s?t=t._ne:a?t=t._sw:c?t=t._se:o=!0}for(;t!==e;){let r=t.rectangles;for(let s=r.length-1;s>=0&&r[s].level>i;--s){let a=r[s];NS(a,n)&&(i=a.level)}t=t.parent}return i}function qL(e,t,n){if(!t)return;let i,o=!1;for(i=0;it.east&&n.push(new ce(t.east,o.south,o.east,o.north)),o.southt.north&&n.push(new ce(Math.max(t.west,o.west),t.north,Math.min(t.east,o.east),o.north))):n.push(o)}return n}var bm=kS;var NIt=T(S(),1);var vIt=T(S(),1);function iZe(e){let t,n=e.name,i=e.message;l(n)&&l(i)?t=`${n}: ${i}`:t=e.toString();let o=e.stack;return l(o)&&(t+=` ${o}`),t}var Oh=iZe;function mN(e,t,n,i,o,r,s){this.provider=e,this.message=t,this.x=n,this.y=i,this.level=o,this.timesRetried=y(r,0),this.retry=!1,this.error=s}mN.reportError=function(e,t,n,i,o,r,s,a){let c=e;return l(e)?(c.provider=t,c.message=i,c.x=o,c.y=r,c.level=s,c.retry=!1,c.error=a,++c.timesRetried):c=new mN(t,i,o,r,s,0,a),l(n)&&n.numberOfListeners>0?n.raiseEvent(c):l(t)&&console.log(`An error occurred in "${t.constructor.name}": ${Oh(i)}`),c};mN.reportSuccess=function(e){l(e)&&(e.timesRetried=-1)};var xo=mN;var zIt=T(S(),1);function Zb(e){if(e=y(e,y.EMPTY_OBJECT),this._ellipsoid=y(e.ellipsoid,ie.WGS84),this._numberOfLevelZeroTilesX=y(e.numberOfLevelZeroTilesX,1),this._numberOfLevelZeroTilesY=y(e.numberOfLevelZeroTilesY,1),this._projection=new Ci(this._ellipsoid),l(e.rectangleSouthwestInMeters)&&l(e.rectangleNortheastInMeters))this._rectangleSouthwestInMeters=e.rectangleSouthwestInMeters,this._rectangleNortheastInMeters=e.rectangleNortheastInMeters;else{let i=this._ellipsoid.maximumRadius*Math.PI;this._rectangleSouthwestInMeters=new D(-i,-i),this._rectangleNortheastInMeters=new D(i,i)}let t=this._projection.unproject(this._rectangleSouthwestInMeters),n=this._projection.unproject(this._rectangleNortheastInMeters);this._rectangle=new ce(t.longitude,t.latitude,n.longitude,n.latitude)}Object.defineProperties(Zb.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},rectangle:{get:function(){return this._rectangle}},projection:{get:function(){return this._projection}}});Zb.prototype.getNumberOfXTilesAtLevel=function(e){return this._numberOfLevelZeroTilesX<=o&&(f=o-1);let x=g/d|0;return x>=r&&(x=r-1),l(n)?(n.x=f,n.y=x,n):new D(f,x)};var Br=Zb;var oZe=15;function oee(e){this.ellipsoid=y(e.ellipsoid,ie.WGS84),this.credit=void 0,this.tilingScheme=void 0,this.height=void 0,this.width=void 0,this.encoding=void 0,this.lodCount=void 0,this.hasAvailability=!1,this.tilesAvailable=void 0,this.tilesAvailabilityLoaded=void 0,this.levelZeroMaximumGeometricError=void 0,this.terrainDataStructure=void 0}oee.prototype.build=function(e){e._credit=this.credit,e._tilingScheme=this.tilingScheme,e._height=this.height,e._width=this.width,e._encoding=this.encoding,e._lodCount=this.lodCount,e._hasAvailability=this.hasAvailability,e._tilesAvailable=this.tilesAvailable,e._tilesAvailabilityLoaded=this.tilesAvailabilityLoaded,e._levelZeroMaximumGeometricError=this.levelZeroMaximumGeometricError,e._terrainDataStructure=this.terrainDataStructure};function rZe(e,t){let n=t.copyrightText;l(n)&&(e.credit=new Ct(n));let i=t.spatialReference,o=y(i.latestWkid,i.wkid),r=t.extent,s={ellipsoid:e.ellipsoid};if(o===4326)s.rectangle=ce.fromDegrees(r.xmin,r.ymin,r.xmax,r.ymax),e.tilingScheme=new Ai(s);else if(o===3857){let d=Math.PI*e.ellipsoid.maximumRadius;t.extent.xmax>d&&(t.extent.xmax=d),t.extent.ymax>d&&(t.extent.ymax=d),t.extent.xmin<-d&&(t.extent.xmin=-d),t.extent.ymin<-d&&(t.extent.ymin=-d),s.rectangleSouthwestInMeters=new D(r.xmin,r.ymin),s.rectangleNortheastInMeters=new D(r.xmax,r.ymax),e.tilingScheme=new Br(s)}else throw new ue("Invalid spatial reference");let a=t.tileInfo;if(!l(a))throw new ue("tileInfo is required");e.width=a.rows+1,e.height=a.cols+1,e.encoding=a.format==="LERC"?iu.LERC:iu.NONE,e.lodCount=a.lods.length-1,(e.hasAvailability=t.capabilities.indexOf("Tilemap")!==-1)&&(e.tilesAvailable=new bm(e.tilingScheme,e.lodCount),e.tilesAvailable.addAvailableTileRange(0,0,0,e.tilingScheme.getNumberOfXTilesAtLevel(0),e.tilingScheme.getNumberOfYTilesAtLevel(0)),e.tilesAvailabilityLoaded=new bm(e.tilingScheme,e.lodCount)),e.levelZeroMaximumGeometricError=Dr.getEstimatedLevelZeroGeometricErrorForAHeightmap(e.tilingScheme.ellipsoid,e.width,e.tilingScheme.getNumberOfXTilesAtLevel(0)),t.bandCount>1&&console.log("ArcGISTiledElevationTerrainProvider: Terrain data has more than 1 band. Using the first one."),l(t.minValues)&&l(t.maxValues)?e.terrainDataStructure={elementMultiplier:1,lowestEncodedHeight:t.minValues[0],highestEncodedHeight:t.maxValues[0]}:e.terrainDataStructure={elementMultiplier:1}}async function sZe(e,t,n){try{let i=await t.fetchJson();rZe(e,i)}catch(i){let o=`An error occurred while accessing ${t}.`;throw xo.reportError(void 0,n,l(n)?n._errorEvent:void 0,o),i}}function Gb(e){e=y(e,y.EMPTY_OBJECT),this._resource=void 0,this._credit=void 0,this._tilingScheme=void 0,this._levelZeroMaximumGeometricError=void 0,this._maxLevel=void 0,this._terrainDataStructure=void 0,this._width=void 0,this._height=void 0,this._encoding=void 0,this._lodCount=void 0,this._hasAvailability=!1,this._tilesAvailable=void 0,this._tilesAvailabilityLoaded=void 0,this._availableCache={},this._errorEvent=new ge}Object.defineProperties(Gb.prototype,{errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},tilingScheme:{get:function(){return this._tilingScheme}},hasWaterMask:{get:function(){return!1}},hasVertexNormals:{get:function(){return!1}},availability:{get:function(){return this._tilesAvailable}}});Gb.fromUrl=async function(e,t){t=y(t,y.EMPTY_OBJECT),e=await Promise.resolve(e);let n=Ee.createIfNeeded(e);n.appendForwardSlash(),l(t.token)&&(n=n.getDerivedResource({queryParameters:{token:t.token}}));let i=n.getDerivedResource({queryParameters:{f:"pjson"}}),o=new oee(t);await sZe(o,i);let r=new Gb(t);return o.build(r),r._resource=n,r};Gb.prototype.requestTileGeometry=function(e,t,n,i){let o=this._resource.getDerivedResource({url:`tile/${n}/${t}/${e}`,request:i}),r=this._hasAvailability,s=Promise.resolve(!0),a;if(r&&!l(AY(this,n+1,e*2,t*2))){let m=ree(this,n+1,e*2,t*2);s=m.promise,a=m.request}let c=o.fetchArrayBuffer();if(!l(c)||!l(s))return;let d=this,u=this._tilesAvailable;return Promise.all([c,s]).then(function(m){return new Ta({buffer:m[0],width:d._width,height:d._height,childTileMask:r?u.computeChildMaskForTile(n,e,t):oZe,structure:d._terrainDataStructure,encoding:d._encoding})}).catch(function(m){return l(a)&&a.state===Qn.CANCELLED?(i.cancel(),i.deferred.promise.finally(function(){return i.state=Qn.CANCELLED,Promise.reject(m)})):Promise.reject(m)})};function AY(e,t,n,i){if(!e._hasAvailability)return;let o=e._tilesAvailabilityLoaded,r=e._tilesAvailable;if(t>e._lodCount)return!1;if(r.isTileAvailable(t,n,i))return!0;if(o.isTileAvailable(t,n,i))return!1}Gb.prototype.getLevelMaximumGeometricError=function(e){return this._levelZeroMaximumGeometricError/(1<0;){let c=a.pop(),d=aZe(c,n,i,o);if(d.value===1){let m=d.range;m.startX+=e,m.endX+=e,m.startY+=t,m.endY+=t,r.push(m)}let u=d.endingIndices;u.length>0&&(a=a.concat(u))}return r}function ree(e,t,n,i){if(!e._hasAvailability)return{};let o=Math.floor(n/128)*128,r=Math.floor(i/128)*128,s=Math.min(1<0&&(this._hash={},e.length=0)};var Vt=ix;var GWt=T(S(),1);var see="https://dev.virtualearth.net/REST/v1/Locations";function NY(e){e=y(e,y.EMPTY_OBJECT);let t=e.key;this._key=t;let n={key:t};l(e.culture)&&(n.culture=e.culture),this._resource=new Ee({url:see,queryParameters:n}),this._credit=new Ct('',!1)}Object.defineProperties(NY.prototype,{url:{get:function(){return see}},key:{get:function(){return this._key}},credit:{get:function(){return this._credit}}});NY.prototype.geocode=async function(e){return this._resource.getDerivedResource({queryParameters:{query:e}}).fetchJsonp("jsonp").then(function(n){return n.resourceSets.length===0?[]:n.resourceSets[0].resources.map(function(o){let r=o.bbox,s=r[0],a=r[1],c=r[2],d=r[3];return{displayName:o.name,destination:ce.fromDegrees(a,s,d,c)}})})};var kY=NY;var AWt=T(S(),1);function Sr(e,t,n,i){this.x=y(e,0),this.y=y(t,0),this.width=y(n,0),this.height=y(i,0)}Sr.packedLength=4;Sr.pack=function(e,t,n){return n=y(n,0),t[n++]=e.x,t[n++]=e.y,t[n++]=e.width,t[n]=e.height,t};Sr.unpack=function(e,t,n){return t=y(t,0),l(n)||(n=new Sr),n.x=e[t++],n.y=e[t++],n.width=e[t++],n.height=e[t],n};Sr.fromPoints=function(e,t){if(l(t)||(t=new Sr),!l(e)||e.length===0)return t.x=0,t.y=0,t.width=0,t.height=0,t;let n=e.length,i=e[0].x,o=e[0].y,r=e[0].x,s=e[0].y;for(let a=1;an.width?n.width=i:i<0&&(n.width-=i,n.x=t.x),o>n.height?n.height=o:o<0&&(n.height-=o,n.y=t.y),n};Sr.intersect=function(e,t){let n=e.x,i=e.y,o=t.x,r=t.y;return n>o+t.width||n+e.widthr+t.height?Kt.OUTSIDE:Kt.INTERSECTING};Sr.equals=function(e,t){return e===t||l(e)&&l(t)&&e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height};Sr.prototype.clone=function(e){return Sr.clone(this,e)};Sr.prototype.intersect=function(e){return Sr.intersect(this,e)};Sr.prototype.equals=function(e){return Sr.equals(this,e)};var He=Sr;var G2t=T(S(),1);var i2t=T(S(),1);var NWt=T(S(),1),fZe={NONE:0,TRIANGLES:1,LINES:2,POLYLINES:3},su=Object.freeze(fZe);var DWt=T(S(),1);var Sa={POINTS:ne.POINTS,LINES:ne.LINES,LINE_LOOP:ne.LINE_LOOP,LINE_STRIP:ne.LINE_STRIP,TRIANGLES:ne.TRIANGLES,TRIANGLE_STRIP:ne.TRIANGLE_STRIP,TRIANGLE_FAN:ne.TRIANGLE_FAN};Sa.isLines=function(e){return e===Sa.LINES||e===Sa.LINE_LOOP||e===Sa.LINE_STRIP};Sa.isTriangles=function(e){return e===Sa.TRIANGLES||e===Sa.TRIANGLE_STRIP||e===Sa.TRIANGLE_FAN};Sa.validate=function(e){return e===Sa.POINTS||e===Sa.LINES||e===Sa.LINE_LOOP||e===Sa.LINE_STRIP||e===Sa.TRIANGLES||e===Sa.TRIANGLE_STRIP||e===Sa.TRIANGLE_FAN};var Fe=Object.freeze(Sa);function UY(e){e=y(e,y.EMPTY_OBJECT),this.attributes=e.attributes,this.indices=e.indices,this.primitiveType=y(e.primitiveType,Fe.TRIANGLES),this.boundingSphere=e.boundingSphere,this.geometryType=y(e.geometryType,su.NONE),this.boundingSphereCV=e.boundingSphereCV,this.offsetAttribute=e.offsetAttribute}UY.computeNumberOfVertices=function(e){let t=-1;for(let n in e.attributes)if(e.attributes.hasOwnProperty(n)&&l(e.attributes[n])&&l(e.attributes[n].values)){let i=e.attributes[n];t=i.values.length/i.componentsPerAttribute}return t};var pZe=new he,bZe=new h,aee=new M,gZe=[new he,new he,new he],yZe=[new D,new D,new D],xZe=[new D,new D,new D],_Ze=new h,TZe=new we,SZe=new M,CZe=new Qi;UY._textureCoordinateRotationPoints=function(e,t,n,i){let o,r=ce.center(i,pZe),s=he.toCartesian(r,n,bZe),a=Gt.eastNorthUpToFixedFrame(s,n,aee),c=M.inverse(a,aee),d=yZe,u=gZe;u[0].longitude=i.west,u[0].latitude=i.south,u[1].longitude=i.west,u[1].latitude=i.north,u[2].longitude=i.east,u[2].latitude=i.south;let m=_Ze;for(o=0;o<3;o++)he.toCartesian(u[o],n,m),m=M.multiplyByPointAsVector(c,m,m),d[o].x=m.x,d[o].y=m.y;let p=we.fromAxisAngle(h.UNIT_Z,-t,TZe),g=$.fromQuaternion(p,SZe),f=e.length,x=Number.POSITIVE_INFINITY,_=Number.POSITIVE_INFINITY,C=Number.NEGATIVE_INFINITY,V=Number.NEGATIVE_INFINITY;for(o=0;o=n[t]){if(t+1=0&&e>=n[t-1])return t-1;let o;if(e>n[t])for(o=t;o=n[o]&&e=0&&!(e>=n[o]&&en&&(r=Math.floor((e-n)/o)+1,e-=r*o),e};US.prototype.clampTime=function(e){let t=this.times;return W.clamp(e,t[0],t[t.length-1])};var qi=US;function DS(e){e=y(e,y.EMPTY_OBJECT);let t=e.points,n=e.times;this._times=n,this._points=t,this._pointType=qi.getPointType(t[0]),this._lastTimeIndex=0}Object.defineProperties(DS.prototype,{times:{get:function(){return this._times}},points:{get:function(){return this._points}}});DS.prototype.findTimeInterval=qi.prototype.findTimeInterval;DS.prototype.wrapTime=qi.prototype.wrapTime;DS.prototype.clampTime=qi.prototype.clampTime;DS.prototype.evaluate=function(e,t){let n=this.points,i=this.times,o=this._lastTimeIndex=this.findTimeInterval(e,this._lastTimeIndex),r=(e-i[o])/(i[o+1]-i[o]);return this._pointType===Number?(1-r)*n[o]+r*n[o+1]:(l(t)||(t=new h),h.lerp(n[o],n[o+1],r,t))};var Eb=DS;var rPt=T(S(),1);var pee={};pee.solve=function(e,t,n,i){let o=new Array(n.length),r=new Array(i.length),s=new Array(i.length),a;for(a=0;a=0;--a)s[a]=h.subtract(r[a],h.multiplyByScalar(s[a+1],o[a],s[a]),s[a]);return s};var BS=pee;var bee=[],gee=[],yee=[],xee=[];function EZe(e,t,n){let i=bee,o=yee,r=gee,s=xee;i.length=o.length=e.length-1,r.length=s.length=e.length;let a;i[0]=r[0]=1,o[0]=0;let c=s[0];for(l(c)||(c=s[0]=new h),h.clone(t,c),a=1;a2&&(l(i)||(i=vZe,h.multiplyByScalar(t[1],2,i),h.subtract(i,t[2],i),h.subtract(i,t[0],i),h.multiplyByScalar(i,.5,i)),!l(o))){let r=t.length-1;o=wZe,h.multiplyByScalar(t[r-1],2,o),h.subtract(t[r],o,o),h.add(o,t[r-2],o),h.multiplyByScalar(o,.5,o)}this._times=n,this._points=t,this._firstTangent=h.clone(i),this._lastTangent=h.clone(o),this._evaluateFunction=PZe(this),this._lastTimeIndex=0}Object.defineProperties(Ib.prototype,{times:{get:function(){return this._times}},points:{get:function(){return this._points}},firstTangent:{get:function(){return this._firstTangent}},lastTangent:{get:function(){return this._lastTangent}}});Ib.catmullRomCoefficientMatrix=new M(-.5,1,-.5,0,1.5,-2.5,0,1,-1.5,2,.5,0,.5,-.5,0,0);Ib.prototype.findTimeInterval=qi.prototype.findTimeInterval;Ib.prototype.wrapTime=qi.prototype.wrapTime;Ib.prototype.clampTime=qi.prototype.clampTime;Ib.prototype.evaluate=function(e,t){return this._evaluateFunction(e,t)};var OY=Ib;var vvt=T(S(),1);var IPt=T(S(),1);var GPt=T(S(),1);function Wb(e,t,n){return t=y(t,0),n=y(n,e.byteLength-t),e=e.subarray(t,t+n),Wb.decode(e)}Wb.decodeWithTextDecoder=function(e){return new TextDecoder("utf-8").decode(e)};Wb.decodeWithFromCharCode=function(e){let t="",n=FZe(e),i=n.length;for(let o=0;o>10)+55296,(r&1023)+56320))}return t};function $L(e,t,n){return t<=e&&e<=n}function FZe(e){let t=0,n=0,i=0,o=128,r=191,s=[],a=e.length;for(let c=0;c This application is using Cesium's default ion access token. Please assign Cesium.Ion.defaultAccessToken with an access token from your ion account before making any Cesium API calls. You can sign up for a free ion account at https://cesium.com.`;HY=new Ct(t,!0)}return HY}};var ym=hN;function Fc(e,t){let n,i=e.externalType,o=l(i);if(!o)n={url:e.url,retryAttempts:1,retryCallback:MZe};else if(i==="3DTILES"||i==="STK_TERRAIN_SERVER")n={url:e.options.url};else throw new ue("Ion.createResource does not support external imagery assets; use IonImageryProvider instead.");Ee.call(this,n),this._ionEndpoint=e,this._ionEndpointDomain=o?void 0:new zY.default(e.url).authority(),this._ionEndpointResource=t,this._ionRoot=void 0,this._pendingPromise=void 0,this._credits=void 0,this._isExternal=o}l(Object.create)&&(Fc.prototype=Object.create(Ee.prototype),Fc.prototype.constructor=Fc);Fc.fromAssetId=function(e,t){let n=Fc._createEndpointResource(e,t);return n.fetchJson().then(function(i){return new Fc(i,n)})};Object.defineProperties(Fc.prototype,{credits:{get:function(){return l(this._ionRoot)?this._ionRoot.credits:l(this._credits)?this._credits:(this._credits=Fc.getCreditsFromEndpoint(this._ionEndpoint,this._ionEndpointResource),this._credits)}}});Fc.getCreditsFromEndpoint=function(e,t){let n=e.attributions.map(Ct.getIonCredit),i=ym.getDefaultTokenCredit(t.queryParameters.access_token);return l(i)&&n.push(Ct.clone(i)),n};Fc.prototype.clone=function(e){let t=y(this._ionRoot,this);return l(e)||(e=new Fc(t._ionEndpoint,t._ionEndpointResource)),e=Ee.prototype.clone.call(this,e),e._ionRoot=t,e._isExternal=this._isExternal,e};Fc.prototype.fetchImage=function(e){if(!this._isExternal){let t=e;e={preferBlob:!0},l(t)&&(e.flipY=t.flipY,e.preferImageBitmap=t.preferImageBitmap)}return Ee.prototype.fetchImage.call(this,e)};Fc.prototype._makeRequest=function(e){return this._isExternal||new zY.default(this.url).authority()!==this._ionEndpointDomain?Ee.prototype._makeRequest.call(this,e):(l(e.headers)||(e.headers={}),e.headers.Authorization=`Bearer ${this._ionEndpoint.accessToken}`,e.headers["X-Cesium-Client"]="CesiumJS",typeof CESIUM_VERSION<"u"&&(e.headers["X-Cesium-Client-Version"]=CESIUM_VERSION),Ee.prototype._makeRequest.call(this,e))};Fc._createEndpointResource=function(e,t){t=y(t,y.EMPTY_OBJECT);let n=y(t.server,ym.defaultServer),i=y(t.accessToken,ym.defaultAccessToken);n=Ee.createIfNeeded(n);let o={url:`v1/assets/${e}/endpoint`};return l(i)&&(o.queryParameters={access_token:i}),n.getDerivedResource(o)};function MZe(e,t){let n=y(e._ionRoot,e),i=n._ionEndpointResource,o=typeof Image<"u";return!l(t)||t.statusCode!==401&&!(o&&t.target instanceof Image)?Promise.resolve(!1):(l(n._pendingPromise)||(n._pendingPromise=i.fetchJson().then(function(r){return n._ionEndpoint=r,r}).finally(function(r){return n._pendingPromise=void 0,r})),n._pendingPromise.then(function(r){return e._ionEndpoint=r,!0}))}var sd=Fc;var dvt=T(S(),1);var JPt=T(S(),1);var fN={};fN.clipTriangleAtAxisAlignedThreshold=function(e,t,n,i,o,r){l(r)?r.length=0:r=[];let s,a,c;t?(s=ne,a=i>e,c=o>e);let d=s+a+c,u,m,p,g,f,x;return d===1?s?(u=(e-n)/(i-n),m=(e-n)/(o-n),r.push(1),r.push(2),m!==1&&(r.push(-1),r.push(0),r.push(2),r.push(m)),u!==1&&(r.push(-1),r.push(0),r.push(1),r.push(u))):a?(p=(e-i)/(o-i),g=(e-i)/(n-i),r.push(2),r.push(0),g!==1&&(r.push(-1),r.push(1),r.push(0),r.push(g)),p!==1&&(r.push(-1),r.push(1),r.push(2),r.push(p))):c&&(f=(e-o)/(n-o),x=(e-o)/(i-o),r.push(0),r.push(1),x!==1&&(r.push(-1),r.push(2),r.push(1),r.push(x)),f!==1&&(r.push(-1),r.push(2),r.push(0),r.push(f))):d===2?!s&&n!==e?(g=(e-i)/(n-i),f=(e-o)/(n-o),r.push(0),r.push(-1),r.push(1),r.push(0),r.push(g),r.push(-1),r.push(2),r.push(0),r.push(f)):!a&&i!==e?(x=(e-o)/(i-o),u=(e-n)/(i-n),r.push(1),r.push(-1),r.push(2),r.push(1),r.push(x),r.push(-1),r.push(0),r.push(1),r.push(u)):!c&&o!==e&&(m=(e-n)/(o-n),p=(e-i)/(o-i),r.push(2),r.push(-1),r.push(0),r.push(2),r.push(m),r.push(-1),r.push(1),r.push(2),r.push(p)):d!==3&&(r.push(0),r.push(1),r.push(2)),r};fN.computeBarycentricCoordinates=function(e,t,n,i,o,r,s,a,c){let d=n-s,u=s-o,m=r-a,p=i-a,g=1/(m*d+u*p),f=t-a,x=e-s,_=(m*x+u*f)*g,C=(-p*x+d*f)*g,V=1-_-C;return l(c)?(c.x=_,c.y=C,c.z=V,c):new h(_,C,V)};fN.computeLineSegmentLineSegmentIntersection=function(e,t,n,i,o,r,s,a,c){let d=(s-o)*(t-r)-(a-r)*(e-o),u=(n-e)*(t-r)-(i-t)*(e-o),m=(a-r)*(n-e)-(s-o)*(i-t);if(m===0)return;let p=d/m,g=u/m;if(p>=0&&p<=1&&g>=0&&g<=1)return l(c)||(c=new D),c.x=e+p*(n-e),c.y=t+p*(i-t),c};var up=fN;function Pb(e){this._quantizedVertices=e.quantizedVertices,this._encodedNormals=e.encodedNormals,this._indices=e.indices,this._minimumHeight=e.minimumHeight,this._maximumHeight=e.maximumHeight,this._boundingSphere=e.boundingSphere,this._orientedBoundingBox=e.orientedBoundingBox,this._horizonOcclusionPoint=e.horizonOcclusionPoint,this._credits=e.credits;let t=this._quantizedVertices.length/3,n=this._uValues=this._quantizedVertices.subarray(0,t),i=this._vValues=this._quantizedVertices.subarray(t,2*t);this._heightValues=this._quantizedVertices.subarray(2*t,3*t);function o(s,a){return i[s]-i[a]}function r(s,a){return n[s]-n[a]}this._westIndices=bN(e.westIndices,o,t),this._southIndices=bN(e.southIndices,r,t),this._eastIndices=bN(e.eastIndices,o,t),this._northIndices=bN(e.northIndices,r,t),this._westSkirtHeight=e.westSkirtHeight,this._southSkirtHeight=e.southSkirtHeight,this._eastSkirtHeight=e.eastSkirtHeight,this._northSkirtHeight=e.northSkirtHeight,this._childTileMask=y(e.childTileMask,15),this._createdByUpsampling=y(e.createdByUpsampling,!1),this._waterMask=e.waterMask,this._mesh=void 0}Object.defineProperties(Pb.prototype,{credits:{get:function(){return this._credits}},waterMask:{get:function(){return this._waterMask}},childTileMask:{get:function(){return this._childTileMask}},canUpsample:{get:function(){return l(this._mesh)}}});var pN=[];function bN(e,t,n){pN.length=e.length;let i=!1;for(let o=0,r=e.length;o0&&t(e[o-1],e[o])>0;return i?(pN.sort(t),Me.createTypedArray(n,pN)):e}var See="createVerticesFromQuantizedTerrainMesh",NZe=new hi(See),kZe=new hi(See,pm.maximumAsynchronousTasks);Pb.prototype.createMesh=function(e){e=y(e,y.EMPTY_OBJECT);let t=e.tilingScheme,n=e.x,i=e.y,o=e.level,r=y(e.exaggeration,1),s=y(e.exaggerationRelativeHeight,0),a=y(e.throttle,!0),c=t.ellipsoid,d=t.tileXYToRectangle(n,i,o),m=(a?kZe:NZe).scheduleTask({minimumHeight:this._minimumHeight,maximumHeight:this._maximumHeight,quantizedVertices:this._quantizedVertices,octEncodedNormals:this._encodedNormals,includeWebMercatorT:!0,indices:this._indices,westIndices:this._westIndices,southIndices:this._southIndices,eastIndices:this._eastIndices,northIndices:this._northIndices,westSkirtHeight:this._westSkirtHeight,southSkirtHeight:this._southSkirtHeight,eastSkirtHeight:this._eastSkirtHeight,northSkirtHeight:this._northSkirtHeight,rectangle:d,relativeToCenter:this._boundingSphere.center,ellipsoid:c,exaggeration:r,exaggerationRelativeHeight:s});if(!l(m))return;let p=this;return Promise.resolve(m).then(function(g){let f=p._quantizedVertices.length/3,x=f+p._westIndices.length+p._southIndices.length+p._eastIndices.length+p._northIndices.length,_=Me.createTypedArray(x,g.indices),C=new Float32Array(g.vertices),V=g.center,L=g.minimumHeight,Z=g.maximumHeight,G=p._boundingSphere,X=p._orientedBoundingBox,v=y(h.clone(g.occludeePointInScaledSpace),p._horizonOcclusionPoint),P=g.vertexStride,F=Qa.clone(g.encoding);return p._mesh=new ru(V,C,_,g.indexCountWithoutSkirts,f,L,Z,G,v,P,X,F,g.westIndicesSouthToNorth,g.southIndicesEastToWest,g.eastIndicesNorthToSouth,g.northIndicesWestToEast),p._quantizedVertices=void 0,p._encodedNormals=void 0,p._indices=void 0,p._uValues=void 0,p._vValues=void 0,p._heightValues=void 0,p._westIndices=void 0,p._southIndices=void 0,p._eastIndices=void 0,p._northIndices=void 0,p._mesh})};var UZe=new hi("upsampleQuantizedTerrainMesh",pm.maximumAsynchronousTasks);Pb.prototype.upsample=function(e,t,n,i,o,r,s){let a=this._mesh;if(!l(this._mesh))return;let c=t*2!==o,d=n*2===r,u=e.ellipsoid,m=e.tileXYToRectangle(o,r,s),p=UZe.scheduleTask({vertices:a.vertices,vertexCountWithoutSkirts:a.vertexCountWithoutSkirts,indices:a.indices,indexCountWithoutSkirts:a.indexCountWithoutSkirts,encoding:a.encoding,minimumHeight:this._minimumHeight,maximumHeight:this._maximumHeight,isEastChild:c,isNorthChild:d,childRectangle:m,ellipsoid:u});if(!l(p))return;let g=Math.min(this._westSkirtHeight,this._eastSkirtHeight);g=Math.min(g,this._southSkirtHeight),g=Math.min(g,this._northSkirtHeight);let f=c?g*.5:this._westSkirtHeight,x=d?g*.5:this._southSkirtHeight,_=c?this._eastSkirtHeight:g*.5,C=d?this._northSkirtHeight:g*.5,V=this._credits;return Promise.resolve(p).then(function(L){let Z=new Uint16Array(L.vertices),G=Me.createTypedArray(Z.length/3,L.indices),X;return l(L.encodedNormals)&&(X=new Uint8Array(L.encodedNormals)),new Pb({quantizedVertices:Z,indices:G,encodedNormals:X,minimumHeight:L.minimumHeight,maximumHeight:L.maximumHeight,boundingSphere:le.clone(L.boundingSphere),orientedBoundingBox:Gn.clone(L.orientedBoundingBox),horizonOcclusionPoint:h.clone(L.horizonOcclusionPoint),westIndices:L.westIndices,southIndices:L.southIndices,eastIndices:L.eastIndices,northIndices:L.northIndices,westSkirtHeight:f,southSkirtHeight:x,eastSkirtHeight:_,northSkirtHeight:C,childTileMask:0,credits:V,createdByUpsampling:!0})})};var KY=32767,Cee=new h;Pb.prototype.interpolateHeight=function(e,t,n){let i=W.clamp((t-e.west)/e.width,0,1);i*=KY;let o=W.clamp((n-e.south)/e.height,0,1);return o*=KY,l(this._mesh)?OZe(this,i,o):HZe(this,i,o)};function Vee(e,t,n,i,o,r,s,a){let c=Math.min(n,o,s),d=Math.max(n,o,s),u=Math.min(i,r,a),m=Math.max(i,r,a);return e>=c&&e<=d&&t>=u&&t<=m}var DZe=new D,BZe=new D,YZe=new D;function OZe(e,t,n){let i=e._mesh,o=i.vertices,r=i.encoding,s=i.indices;for(let a=0,c=s.length;a=-1e-15&&x.y>=-1e-15&&x.z>=-1e-15){let _=r.decodeHeight(o,d),C=r.decodeHeight(o,u),V=r.decodeHeight(o,m);return x.x*_+x.y*C+x.z*V}}}}function HZe(e,t,n){let i=e._uValues,o=e._vValues,r=e._heightValues,s=e._indices;for(let a=0,c=s.length;a=-1e-15&&V.y>=-1e-15&&V.z>=-1e-15){let L=V.x*r[d]+V.y*r[u]+V.z*r[m];return W.lerp(e._minimumHeight,e._maximumHeight,L/KY)}}}}Pb.prototype.isChildAvailable=function(e,t,n,i){let o=2;return n!==e*2&&++o,i!==t*2&&(o-=2),(this._childTileMask&1<0&&(e.attribution+=" "),e.attribution+=t.attribution),e.layers.push(new zZe({resource:e.lastResource,version:t.version,isHeightmap:a,tileUrlTemplates:c,availability:g,hasVertexNormals:i,hasWaterMask:o,hasMetadata:r,availabilityLevels:m,availabilityTilesLoaded:u,littleEndianExtensionSize:s}));let f=t.parentUrl;return l(f)?l(g)?(e.lastResource=e.lastResource.getDerivedResource({url:f}),e.lastResource.appendForwardSlash(),e.layerJsonResource=e.lastResource.getDerivedResource({url:"layer.json"}),await jY(e),!0):(console.log("A layer.json can't have a parentUrl if it does't have an available array."),!0):!0}function KZe(e,t,n){let i=`An error occurred while accessing ${e.layerJsonResource.url}.`;if(l(t)&&(i+=` ${t.message}`),e.previousError=xo.reportError(e.previousError,n,l(n)?n._errorEvent:void 0,i),e.previousError.retry)return jY(e,n);throw new ue(i)}async function JZe(e,t,n){await Zee(e,t,n);let i=e.overallAvailability.length;if(i>0){let o=e.availability=new bm(e.tilingScheme,e.overallMaxZoom);for(let r=0;r0){let o=new Ct(e.attribution);e.tileCredits.push(o)}return!0}async function jY(e,t){try{let n=await e.layerJsonResource.fetchJson();return JZe(e,n,t)}catch(n){return l(n)&&n.statusCode===404?(await Zee(e,{tilejson:"2.1.0",format:"heightmap-1.0",version:"1.0.0",scheme:"tms",tiles:["{z}/{x}/{y}.terrain?v={version}"]},t),!0):KZe(e,n,t)}}function xm(e){e=y(e,y.EMPTY_OBJECT),this._heightmapWidth=void 0,this._heightmapStructure=void 0,this._hasWaterMask=!1,this._hasVertexNormals=!1,this._hasMetadata=!1,this._scheme=void 0,this._ellipsoid=e.ellipsoid,this._requestVertexNormals=y(e.requestVertexNormals,!1),this._requestWaterMask=y(e.requestWaterMask,!1),this._requestMetadata=y(e.requestMetadata,!0),this._errorEvent=new ge;let t=e.credit;typeof t=="string"&&(t=new Ct(t)),this._credit=t,this._availability=void 0,this._tilingScheme=void 0,this._levelZeroMaximumGeometricError=void 0,this._layers=void 0,this._tileCredits=void 0}var JY={OCT_VERTEX_NORMALS:1,WATER_MASK:2,METADATA:4};function Lee(e){return!l(e)||e.length===0?{Accept:"application/vnd.quantized-mesh,application/octet-stream;q=0.9,*/*;q=0.01"}:{Accept:`application/vnd.quantized-mesh;extensions=${e.join("-")},application/octet-stream;q=0.9,*/*;q=0.01`}}function QZe(e,t,n,i,o){let r=new Uint16Array(t,0,e._heightmapWidth*e._heightmapWidth);return new Ta({buffer:r,childTileMask:new Uint8Array(t,r.byteLength,1)[0],waterMask:new Uint8Array(t,r.byteLength+1,t.byteLength-r.byteLength-1),width:e._heightmapWidth,height:e._heightmapWidth,structure:e._heightmapStructure,credits:e._tileCredits})}function jZe(e,t,n,i,o,r){let s=r.littleEndianExtensionSize,a=0,c=3,d=c+1,u=Float64Array.BYTES_PER_ELEMENT*c,m=Float64Array.BYTES_PER_ELEMENT*d,g=Uint16Array.BYTES_PER_ELEMENT*3,f=3,x=Uint16Array.BYTES_PER_ELEMENT,_=x*f,C=new DataView(t),V=new h(C.getFloat64(a,!0),C.getFloat64(a+8,!0),C.getFloat64(a+16,!0));a+=u;let L=C.getFloat32(a,!0);a+=Float32Array.BYTES_PER_ELEMENT;let Z=C.getFloat32(a,!0);a+=Float32Array.BYTES_PER_ELEMENT;let G=new le(new h(C.getFloat64(a,!0),C.getFloat64(a+8,!0),C.getFloat64(a+16,!0)),C.getFloat64(a+u,!0));a+=m;let X=new h(C.getFloat64(a,!0),C.getFloat64(a+8,!0),C.getFloat64(a+16,!0));a+=u;let v=C.getUint32(a,!0);a+=Uint32Array.BYTES_PER_ELEMENT;let P=new Uint16Array(t,a,v*3);a+=v*g,v>64*1024&&(x=Uint32Array.BYTES_PER_ELEMENT,_=x*f);let F=P.subarray(0,v),A=P.subarray(v,2*v),b=P.subarray(v*2,3*v);wn.zigZagDeltaDecode(F,A,b),a%x!==0&&(a+=x-a%x);let R=C.getUint32(a,!0);a+=Uint32Array.BYTES_PER_ELEMENT;let E=Me.createTypedArrayFromArrayBuffer(v,t,a,R*f);a+=R*_;let I=0,w=E.length;for(let ae=0;ae0){let Xe=Zo(new Uint8Array(t),a+Uint32Array.BYTES_PER_ELEMENT,Se).available;if(l(Xe))for(let Pe=0;Pem.promise))}return!l(r)&&a?c.then(()=>new Promise(d=>{setTimeout(()=>{let u=this.requestTileGeometry(e,t,n,i);d(u)},0)})):Gee(this,e,t,n,r,i)};function Gee(e,t,n,i,o,r){if(!l(o))return Promise.reject(new ue("Terrain tile doesn't exist"));let s=o.tileUrlTemplates;if(s.length===0)return;let a;!e._scheme||e._scheme==="tms"?a=e._tilingScheme.getNumberOfYTilesAtLevel(i)-n-1:a=n;let c=[];e._requestVertexNormals&&o.hasVertexNormals&&c.push(o.littleEndianExtensionSize?"octvertexnormals":"vertexnormals"),e._requestWaterMask&&o.hasWaterMask&&c.push("watermask"),e._requestMetadata&&o.hasMetadata&&c.push("metadata");let d,u,m=s[(t+a+i)%s.length],p=o.resource;l(p._ionEndpoint)&&!l(p._ionEndpoint.externalType)?(c.length!==0&&(u={extensions:c.join("-")}),d=Lee(void 0)):d=Lee(c);let g=p.getDerivedResource({url:m,templateValues:{version:o.version,z:i,x:t,y:a},queryParameters:u,headers:d,request:r}).fetchArrayBuffer();if(l(g))return g.then(function(f){return l(f)?l(e._heightmapStructure)?QZe(e,f,i,t,n):jZe(e,f,i,t,n,o):Promise.reject(new ue("Mesh buffer doesn't exist."))})}Object.defineProperties(xm.prototype,{errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},tilingScheme:{get:function(){return this._tilingScheme}},hasWaterMask:{get:function(){return this._hasWaterMask&&this._requestWaterMask}},hasVertexNormals:{get:function(){return this._hasVertexNormals&&this._requestVertexNormals}},hasMetadata:{get:function(){return this._hasMetadata&&this._requestMetadata}},requestVertexNormals:{get:function(){return this._requestVertexNormals}},requestWaterMask:{get:function(){return this._requestWaterMask}},requestMetadata:{get:function(){return this._requestMetadata}},availability:{get:function(){return this._availability}}});xm.prototype.getLevelMaximumGeometricError=function(e){return this._levelZeroMaximumGeometricError/(1<this._availability._maximumLevel)return!1;if(this._availability.isTileAvailable(n,e,t))return!0;if(!this._hasMetadata)return!1;let i=this._layers,o=i.length;for(let r=0;rthis._availability._maximumLevel||this._availability.isTileAvailable(n,e,t)||!this._hasMetadata)return;let i=this._layers,o=i.length;for(let r=0;r1;--b){if(C=W.PI_OVER_TWO-(b-1)*_,G=HS(-C,r,f,g,c,u,d,m,p,G),X=HS(C+Math.PI,r,f,g,c,u,d,m,p,X),t){for(L[Z++]=G.x,L[Z++]=G.y,L[Z++]=G.z,E=2*(b-1)+2,R=1;R=0?(n=Math.floor(e/65536)*65536,t.high=n,t.low=e-n):(n=Math.floor(-e/65536)*65536,t.high=-n,t.low=e+n),t};var mp={high:0,low:0};zh.fromCartesian=function(e,t){l(t)||(t=new zh);let n=t.high,i=t.low;return zh.encode(e.x,mp),n.x=mp.high,i.x=mp.low,zh.encode(e.y,mp),n.y=mp.high,i.y=mp.low,zh.encode(e.z,mp),n.z=mp.high,i.z=mp.low,t};var tO=new zh;zh.writeElements=function(e,t,n){zh.fromCartesian(e,tO);let i=tO.high,o=tO.low;t[n]=i.x,t[n+1]=i.y,t[n+2]=i.z,t[n+3]=o.x,t[n+4]=o.y,t[n+5]=o.z};var Bn=zh;var owt=T(S(),1);var nO={};nO.calculateACMR=function(e){e=y(e,y.EMPTY_OBJECT);let t=e.indices,n=e.maximumIndex,i=y(e.cacheSize,24),o=t.length;if(!l(n)){n=0;let a=0,c=t[a];for(;an&&(n=c),++a,c=t[a]}let r=[];for(let a=0;ai&&(r[t[a]]=s,++s);return(s-i+1)/(o/3)};nO.tipsify=function(e){e=y(e,y.EMPTY_OBJECT);let t=e.indices,n=e.maximumIndex,i=y(e.cacheSize,24),o;function r(b,R,E,I){for(;R.length>=1;){let w=R[R.length-1];if(R.splice(R.length-1,1),b[w].numLiveTriangles>0)return w}for(;o0)return++o,o-1;++o}return-1}function s(b,R,E,I,w,N,B){let U=-1,O,k=-1,J=0;for(;Jk||k===-1)&&(k=O,U=H)),++J}return U===-1?r(I,N,b,B):U}let a=t.length,c=0,d=0,u=t[d],m=a;if(l(n))c=n+1;else{for(;dc&&(c=u),++d,u=t[d];if(c===-1)return 0;++c}let p=[],g;for(g=0;gi&&(L.timeStamp=_,++_),++d}x=s(t,i,C,p,_,V,c)}return X};var eR=nO;var Ac={};function VN(e,t,n,i,o){e[t++]=n,e[t++]=i,e[t++]=i,e[t++]=o,e[t++]=o,e[t]=n}function oGe(e){let t=e.length,n=t/3*6,i=Me.createTypedArray(t,n),o=0;for(let r=0;r=3){let n=(t-2)*6,i=Me.createTypedArray(t,n);VN(i,0,e[0],e[1],e[2]);let o=6;for(let r=3;r0){let t=e.length-1,n=(t-1)*6,i=Me.createTypedArray(t,n),o=e[0],r=0;for(let s=1;so&&(o=n[r]);e.indices=eR.tipsify({indices:n,maximumIndex:o,cacheSize:t})}return e};function Aee(e){let t={};for(let n in e)if(e.hasOwnProperty(n)&&l(e[n])&&l(e[n].values)){let i=e[n];t[n]=new Ge({componentDatatype:i.componentDatatype,componentsPerAttribute:i.componentsPerAttribute,normalize:i.normalize,values:[]})}return t}function aGe(e,t,n){for(let i in t)if(t.hasOwnProperty(i)&&l(t[i])&&l(t[i].values)){let o=t[i];for(let r=0;r=W.SIXTY_FOUR_KILOBYTES){let i=[],o=[],r=0,s=Aee(e.attributes),a=e.indices,c=a.length,d;e.primitiveType===Fe.TRIANGLES?d=3:e.primitiveType===Fe.LINES?d=2:e.primitiveType===Fe.POINTS&&(d=1);for(let u=0;u=W.SIXTY_FOUR_KILOBYTES&&(t.push(new ut({attributes:s,indices:o,primitiveType:e.primitiveType,boundingSphere:e.boundingSphere,boundingSphereCV:e.boundingSphereCV})),i=[],o=[],r=0,s=Aee(e.attributes))}o.length!==0&&t.push(new ut({attributes:s,indices:o,primitiveType:e.primitiveType,boundingSphere:e.boundingSphere,boundingSphereCV:e.boundingSphereCV}))}else t.push(e);return t};var Mee=new h,cGe=new he;Ac.projectTo2D=function(e,t,n,i,o){let r=e.attributes[t];o=l(o)?o:new Si;let s=o.ellipsoid,a=r.values,c=new Float64Array(a.length),d=0;for(let u=0;u_&&(_=V)}return new ut({attributes:u,indices:f,primitiveType:d,boundingSphere:l(x)?new le(x,_):void 0})}Ac.combineInstances=function(e){let t=[],n=[],i=e.length;for(let r=0;r0&&o.push(sO(t,"geometry")),n.length>0&&(o.push(sO(n,"westHemisphereGeometry")),o.push(sO(n,"eastHemisphereGeometry"))),o};var au=new h,tR=new h,zS=new h,KS=new h;Ac.computeNormal=function(e){let t=e.indices,n=e.attributes,i=n.position.values,o=n.position.values.length/3,r=t.length,s=new Array(o),a=new Array(r/3),c=new Array(r),d;for(d=0;d0){for(u=0;u3&&(n[3]=0,n[4]=2,n[5]=3);let i=6;for(let o=3;oo?i>r?s=W.sign(e.y):s=W.sign(n.y):o>r?s=W.sign(t.y):s=W.sign(n.y);let a=s<0;vb(e,a),vb(t,a),vb(n,a)}var Dee=new h;function cu(e,t,n,i){h.add(e,h.multiplyByScalar(h.subtract(t,e,Dee),e.y/(e.y-t.y),Dee),n),h.clone(n,i),vb(n,!0),vb(i,!1)}var ax=new h,cx=new h,lx=new h,dx=new h,aO={positions:new Array(7),indices:new Array(3*3)};function TGe(e,t,n){if(e.x>=0||t.x>=0||n.x>=0)return;_Ge(e,t,n);let i=e.y<0,o=t.y<0,r=n.y<0,s=0;s+=i?1:0,s+=o?1:0,s+=r?1:0;let a=aO.indices;s===1?(a[1]=3,a[2]=4,a[5]=6,a[7]=6,a[8]=5,i?(cu(e,t,ax,lx),cu(e,n,cx,dx),a[0]=0,a[3]=1,a[4]=2,a[6]=1):o?(cu(t,n,ax,lx),cu(t,e,cx,dx),a[0]=1,a[3]=2,a[4]=0,a[6]=2):r&&(cu(n,e,ax,lx),cu(n,t,cx,dx),a[0]=2,a[3]=0,a[4]=1,a[6]=0)):s===2&&(a[2]=4,a[4]=4,a[5]=3,a[7]=5,a[8]=6,i?o?r||(cu(n,e,ax,lx),cu(n,t,cx,dx),a[0]=0,a[1]=1,a[3]=0,a[6]=2):(cu(t,n,ax,lx),cu(t,e,cx,dx),a[0]=2,a[1]=0,a[3]=2,a[6]=1):(cu(e,t,ax,lx),cu(e,n,cx,dx),a[0]=1,a[1]=2,a[3]=1,a[6]=0));let c=aO.positions;return c[0]=e,c[1]=t,c[2]=n,c.length=3,(s===1||s===2)&&(c[3]=ax,c[4]=cx,c[5]=lx,c[6]=dx,c.length=7),aO}function Bee(e,t){let n=e.attributes;if(n.position.values.length===0)return;for(let o in n)if(n.hasOwnProperty(o)&&l(n[o])&&l(n[o].values)){let r=n[o];r.values=Q.createTypedArray(r.componentDatatype,r.values)}let i=ut.computeNumberOfVertices(e);return e.indices=Me.createTypedArray(i,e.indices),t&&(e.boundingSphere=le.fromVertices(n.position.values)),e}function QS(e){let t=e.attributes,n={};for(let i in t)if(t.hasOwnProperty(i)&&l(t[i])&&l(t[i].values)){let o=t[i];n[i]=new Ge({componentDatatype:o.componentDatatype,componentsPerAttribute:o.componentsPerAttribute,normalize:o.normalize,values:[]})}return new ut({attributes:n,indices:[],primitiveType:e.primitiveType})}function uO(e,t,n){let i=l(e.geometry.boundingSphere);t=Bee(t,i),n=Bee(n,i),l(n)&&!l(t)?e.geometry=n:!l(n)&&l(t)?e.geometry=t:(e.westHemisphereGeometry=t,e.eastHemisphereGeometry=n,e.geometry=void 0)}function mO(e,t){let n=new e,i=new e,o=new e;return function(r,s,a,c,d,u,m,p){let g=e.fromArray(d,r*t,n),f=e.fromArray(d,s*t,i),x=e.fromArray(d,a*t,o);e.multiplyByScalar(g,c.x,g),e.multiplyByScalar(f,c.y,f),e.multiplyByScalar(x,c.z,x);let _=e.add(g,f,g);e.add(_,x,_),p&&e.normalize(_,_),e.pack(_,u,m*t)}}var SGe=mO(se,4),CN=mO(h,3),Jee=mO(D,2),CGe=function(e,t,n,i,o,r,s){let a=o[e]*i.x,c=o[t]*i.y,d=o[n]*i.z;r[s]=a+c+d>W.EPSILON6?1:0},iR=new h,cO=new h,lO=new h,VGe=new h;function TN(e,t,n,i,o,r,s,a,c,d,u,m,p,g,f,x){if(!l(r)&&!l(s)&&!l(a)&&!l(c)&&!l(d)&&g===0)return;let _=h.fromArray(o,e*3,iR),C=h.fromArray(o,t*3,cO),V=h.fromArray(o,n*3,lO),L=sx(i,_,C,V,VGe);if(l(L)){if(l(r)&&CN(e,t,n,L,r,m.normal.values,x,!0),l(d)){let Z=h.fromArray(d,e*3,iR),G=h.fromArray(d,t*3,cO),X=h.fromArray(d,n*3,lO);h.multiplyByScalar(Z,L.x,Z),h.multiplyByScalar(G,L.y,G),h.multiplyByScalar(X,L.z,X);let v;!h.equals(Z,h.ZERO)||!h.equals(G,h.ZERO)||!h.equals(X,h.ZERO)?(v=h.add(Z,G,Z),h.add(v,X,v),h.normalize(v,v)):(v=iR,v.x=0,v.y=0,v.z=0),h.pack(v,m.extrudeDirection.values,x*3)}if(l(u)&&CGe(e,t,n,L,u,m.applyOffset.values,x),l(s)&&CN(e,t,n,L,s,m.tangent.values,x,!0),l(a)&&CN(e,t,n,L,a,m.bitangent.values,x,!0),l(c)&&Jee(e,t,n,L,c,m.st.values,x),g>0)for(let Z=0;Z3){let I=E.positions,w=E.indices,N=w.length;for(let B=0;B0)continue;let c=h.unpack(i,s,qee);(a.y<0&&c.y>0||a.y>0&&c.y<0)&&(s-3>0?(i[s]=n[s-3],i[s+1]=n[s-2],i[s+2]=n[s-1]):h.pack(a,i,s));let d=h.unpack(o,s,dO);(a.y<0&&d.y>0||a.y>0&&d.y<0)&&(s+30||le.intersectPlane(n,cn.ORIGIN_ZX_PLANE)!==Kt.INTERSECTING))return e;if(t.geometryType!==su.NONE)switch(t.geometryType){case su.POLYLINES:vGe(e);break;case su.TRIANGLES:Yee(e);break;case su.LINES:Oee(e);break}else xGe(t),t.primitiveType===Fe.TRIANGLES?Yee(e):t.primitiveType===Fe.LINES&&Oee(e);return e};var An=Ac;var jS=new h,hO=new h,fO=new h,$ee=new h,hs=new D,ete=new $,wGe=new $,pO=new we,tte=new h,nte=new h,ite=new h,ZN=new he,ote=new h,rte=new D,ste=new D;function ate(e,t,n){let i=t.vertexFormat,o=t.center,r=t.semiMajorAxis,s=t.semiMinorAxis,a=t.ellipsoid,c=t.stRotation,d=n?e.length/3*2:e.length/3,u=t.shadowVolume,m=i.st?new Float32Array(d*2):void 0,p=i.normal?new Float32Array(d*3):void 0,g=i.tangent?new Float32Array(d*3):void 0,f=i.bitangent?new Float32Array(d*3):void 0,x=u?new Float32Array(d*3):void 0,_=0,C=tte,V=nte,L=ite,Z=new Si(a),G=Z.project(a.cartesianToCartographic(o,ZN),ote),X=a.scaleToGeodeticSurface(o,jS);a.geodeticSurfaceNormal(X,X);let v=ete,P=wGe;if(c!==0){let w=we.fromAxisAngle(X,c,pO);v=$.fromQuaternion(w,v),w=we.fromAxisAngle(X,-c,pO),P=$.fromQuaternion(w,P)}else v=$.clone($.IDENTITY,v),P=$.clone($.IDENTITY,P);let F=D.fromElements(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,rte),A=D.fromElements(Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY,ste),b=e.length,R=n?b:0,E=R/3*2;for(let w=0;w1;--s){for(t[n++]=i++,t[n++]=i,t[n++]=r,o=2*s,a=0;aW.PI&&(m.north=m.north>0?W.PI_OVER_TWO-W.EPSILON7:m.north,m.south=m.south<0?W.EPSILON7-W.PI_OVER_TWO:m.south,m.east=W.PI,m.west=-W.PI),m}function Qh(e){e=y(e,y.EMPTY_OBJECT);let t=e.center,n=y(e.ellipsoid,ie.WGS84),i=e.semiMajorAxis,o=e.semiMinorAxis,r=y(e.granularity,W.RADIANS_PER_DEGREE),s=y(e.vertexFormat,We.DEFAULT),a=y(e.height,0),c=y(e.extrudedHeight,a);this._center=h.clone(t),this._semiMajorAxis=i,this._semiMinorAxis=o,this._ellipsoid=ie.clone(n),this._rotation=y(e.rotation,0),this._stRotation=y(e.stRotation,0),this._height=Math.max(c,a),this._granularity=r,this._vertexFormat=We.clone(s),this._extrudedHeight=Math.min(c,a),this._shadowVolume=y(e.shadowVolume,!1),this._workerName="createEllipseGeometry",this._offsetAttribute=e.offsetAttribute,this._rectangle=void 0,this._textureCoordinateRotationPoints=void 0}Qh.packedLength=h.packedLength+ie.packedLength+We.packedLength+9;Qh.pack=function(e,t,n){return n=y(n,0),h.pack(e._center,t,n),n+=h.packedLength,ie.pack(e._ellipsoid,t,n),n+=ie.packedLength,We.pack(e._vertexFormat,t,n),n+=We.packedLength,t[n++]=e._semiMajorAxis,t[n++]=e._semiMinorAxis,t[n++]=e._rotation,t[n++]=e._stRotation,t[n++]=e._height,t[n++]=e._granularity,t[n++]=e._extrudedHeight,t[n++]=e._shadowVolume?1:0,t[n]=y(e._offsetAttribute,-1),t};var dte=new h,ute=new ie,mte=new We,Jh={center:dte,ellipsoid:ute,vertexFormat:mte,semiMajorAxis:void 0,semiMinorAxis:void 0,rotation:void 0,stRotation:void 0,height:void 0,granularity:void 0,extrudedHeight:void 0,shadowVolume:void 0,offsetAttribute:void 0};Qh.unpack=function(e,t,n){t=y(t,0);let i=h.unpack(e,t,dte);t+=h.packedLength;let o=ie.unpack(e,t,ute);t+=ie.packedLength;let r=We.unpack(e,t,mte);t+=We.packedLength;let s=e[t++],a=e[t++],c=e[t++],d=e[t++],u=e[t++],m=e[t++],p=e[t++],g=e[t++]===1,f=e[t];return l(n)?(n._center=h.clone(i,n._center),n._ellipsoid=ie.clone(o,n._ellipsoid),n._vertexFormat=We.clone(r,n._vertexFormat),n._semiMajorAxis=s,n._semiMinorAxis=a,n._rotation=c,n._stRotation=d,n._height=u,n._granularity=m,n._extrudedHeight=p,n._shadowVolume=g,n._offsetAttribute=f===-1?void 0:f,n):(Jh.height=u,Jh.extrudedHeight=p,Jh.granularity=m,Jh.stRotation=d,Jh.rotation=c,Jh.semiMajorAxis=s,Jh.semiMinorAxis=a,Jh.shadowVolume=g,Jh.offsetAttribute=f===-1?void 0:f,new Qh(Jh))};Qh.computeRectangle=function(e,t){e=y(e,y.EMPTY_OBJECT);let n=e.center,i=y(e.ellipsoid,ie.WGS84),o=e.semiMajorAxis,r=e.semiMinorAxis,s=y(e.granularity,W.RADIANS_PER_DEGREE),a=y(e.rotation,0);return lte(n,o,r,a,s,i,t)};Qh.createGeometry=function(e){if(e._semiMajorAxis<=0||e._semiMinorAxis<=0)return;let t=e._height,n=e._extrudedHeight,i=!W.equalsEpsilon(t,n,0,W.EPSILON2);e._center=e._ellipsoid.scaleToGeodeticSurface(e._center,e._center);let o={center:e._center,semiMajorAxis:e._semiMajorAxis,semiMinorAxis:e._semiMinorAxis,ellipsoid:e._ellipsoid,rotation:e._rotation,height:t,granularity:e._granularity,vertexFormat:e._vertexFormat,stRotation:e._stRotation},r;if(i)o.extrudedHeight=n,o.shadowVolume=e._shadowVolume,o.offsetAttribute=e._offsetAttribute,r=NGe(o);else if(r=FGe(o),l(e._offsetAttribute)){let s=r.attributes.position.values.length,a=e._offsetAttribute===ln.NONE?0:1,c=new Uint8Array(s/3).fill(a);r.attributes.applyOffset=new Ge({componentDatatype:Q.UNSIGNED_BYTE,componentsPerAttribute:1,values:c})}return new ut({attributes:r.attributes,indices:r.indices,primitiveType:Fe.TRIANGLES,boundingSphere:r.boundingSphere,offsetAttribute:e._offsetAttribute})};Qh.createShadowVolume=function(e,t,n){let i=e._granularity,o=e._ellipsoid,r=t(i,o),s=n(i,o);return new Qh({center:e._center,semiMajorAxis:e._semiMajorAxis,semiMinorAxis:e._semiMinorAxis,ellipsoid:o,rotation:e._rotation,stRotation:e._stRotation,granularity:i,extrudedHeight:r,height:s,vertexFormat:We.POSITION_ONLY,shadowVolume:!0})};function kGe(e){let t=-e._stRotation;if(t===0)return[0,0,0,1,1,0];let i=Tl.computeEllipsePositions({center:e._center,semiMajorAxis:e._semiMajorAxis,semiMinorAxis:e._semiMinorAxis,rotation:e._rotation,granularity:e._granularity},!1,!0).outerPositions,o=i.length/3,r=new Array(o);for(let c=0;c0){let f=Math.min(d,c);g=Math.round(c/f);let x=Math.min(g*d,c);for(p=0;p1&&(n-=1),n*6<1?e+(t-e)*6*n:n*2<1?t:n*3<2?e+(t-e)*(2/3-n)*6:e}function re(e,t,n,i){this.red=y(e,1),this.green=y(t,1),this.blue=y(n,1),this.alpha=y(i,1)}re.fromCartesian4=function(e,t){return l(t)?(t.red=e.x,t.green=e.y,t.blue=e.z,t.alpha=e.w,t):new re(e.x,e.y,e.z,e.w)};re.fromBytes=function(e,t,n,i,o){return e=re.byteToFloat(y(e,255)),t=re.byteToFloat(y(t,255)),n=re.byteToFloat(y(n,255)),i=re.byteToFloat(y(i,255)),l(o)?(o.red=e,o.green=t,o.blue=n,o.alpha=i,o):new re(e,t,n,i)};re.fromAlpha=function(e,t,n){return l(n)?(n.red=e.red,n.green=e.green,n.blue=e.blue,n.alpha=t,n):new re(e.red,e.green,e.blue,t)};var TO,SO,pp;Yt.supportsTypedArrays()&&(TO=new ArrayBuffer(4),SO=new Uint32Array(TO),pp=new Uint8Array(TO));re.fromRgba=function(e,t){return SO[0]=e,re.fromBytes(pp[0],pp[1],pp[2],pp[3],t)};re.fromHsl=function(e,t,n,i,o){e=y(e,0)%1,t=y(t,0),n=y(n,0),i=y(i,1);let r=n,s=n,a=n;if(t!==0){let c;n<.5?c=n*(1+t):c=n+t-n*t;let d=2*n-c;r=_O(d,c,e+1/3),s=_O(d,c,e),a=_O(d,c,e-1/3)}return l(o)?(o.red=r,o.green=s,o.blue=a,o.alpha=i,o):new re(r,s,a,i)};re.fromRandom=function(e,t){e=y(e,y.EMPTY_OBJECT);let n=e.red;if(!l(n)){let s=y(e.minimumRed,0),a=y(e.maximumRed,1);n=s+W.nextRandomNumber()*(a-s)}let i=e.green;if(!l(i)){let s=y(e.minimumGreen,0),a=y(e.maximumGreen,1);i=s+W.nextRandomNumber()*(a-s)}let o=e.blue;if(!l(o)){let s=y(e.minimumBlue,0),a=y(e.maximumBlue,1);o=s+W.nextRandomNumber()*(a-s)}let r=e.alpha;if(!l(r)){let s=y(e.minimumAlpha,0),a=y(e.maximumAlpha,1);r=s+W.nextRandomNumber()*(a-s)}return l(t)?(t.red=n,t.green=i,t.blue=o,t.alpha=r,t):new re(n,i,o,r)};var zGe=/^#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,KGe=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,JGe=/^rgba?\s*\(\s*([0-9.]+%?)\s*[,\s]+\s*([0-9.]+%?)\s*[,\s]+\s*([0-9.]+%?)(?:\s*[,\s/]+\s*([0-9.]+))?\s*\)$/i,QGe=/^hsla?\s*\(\s*([0-9.]+)\s*[,\s]+\s*([0-9.]+%)\s*[,\s]+\s*([0-9.]+%)(?:\s*[,\s/]+\s*([0-9.]+))?\s*\)$/i;re.fromCssColorString=function(e,t){l(t)||(t=new re),e=e.trim();let n=re[e.toUpperCase()];if(l(n))return re.clone(n,t),t;let i=zGe.exec(e);return i!==null?(t.red=parseInt(i[1],16)/15,t.green=parseInt(i[2],16)/15,t.blue=parseInt(i[3],16)/15,t.alpha=parseInt(y(i[4],"f"),16)/15,t):(i=KGe.exec(e),i!==null?(t.red=parseInt(i[1],16)/255,t.green=parseInt(i[2],16)/255,t.blue=parseInt(i[3],16)/255,t.alpha=parseInt(y(i[4],"ff"),16)/255,t):(i=JGe.exec(e),i!==null?(t.red=parseFloat(i[1])/(i[1].substr(-1)==="%"?100:255),t.green=parseFloat(i[2])/(i[2].substr(-1)==="%"?100:255),t.blue=parseFloat(i[3])/(i[3].substr(-1)==="%"?100:255),t.alpha=parseFloat(y(i[4],"1.0")),t):(i=QGe.exec(e),i!==null?re.fromHsl(parseFloat(i[1])/360,parseFloat(i[2])/100,parseFloat(i[3])/100,parseFloat(y(i[4],"1.0")),t):(t=void 0,t))))};re.packedLength=4;re.pack=function(e,t,n){return n=y(n,0),t[n++]=e.red,t[n++]=e.green,t[n++]=e.blue,t[n]=e.alpha,t};re.unpack=function(e,t,n){return t=y(t,0),l(n)||(n=new re),n.red=e[t++],n.green=e[t++],n.blue=e[t++],n.alpha=e[t],n};re.byteToFloat=function(e){return e/255};re.floatToByte=function(e){return e===1?255:e*256|0};re.clone=function(e,t){if(l(e))return l(t)?(t.red=e.red,t.green=e.green,t.blue=e.blue,t.alpha=e.alpha,t):new re(e.red,e.green,e.blue,e.alpha)};re.equals=function(e,t){return e===t||l(e)&&l(t)&&e.red===t.red&&e.green===t.green&&e.blue===t.blue&&e.alpha===t.alpha};re.equalsArray=function(e,t,n){return e.red===t[n]&&e.green===t[n+1]&&e.blue===t[n+2]&&e.alpha===t[n+3]};re.prototype.clone=function(e){return re.clone(this,e)};re.prototype.equals=function(e){return re.equals(this,e)};re.prototype.equalsEpsilon=function(e,t){return this===e||l(e)&&Math.abs(this.red-e.red)<=t&&Math.abs(this.green-e.green)<=t&&Math.abs(this.blue-e.blue)<=t&&Math.abs(this.alpha-e.alpha)<=t};re.prototype.toString=function(){return`(${this.red}, ${this.green}, ${this.blue}, ${this.alpha})`};re.prototype.toCssColorString=function(){let e=re.floatToByte(this.red),t=re.floatToByte(this.green),n=re.floatToByte(this.blue);return this.alpha===1?`rgb(${e},${t},${n})`:`rgba(${e},${t},${n},${this.alpha})`};re.prototype.toCssHexString=function(){let e=re.floatToByte(this.red).toString(16);e.length<2&&(e=`0${e}`);let t=re.floatToByte(this.green).toString(16);t.length<2&&(t=`0${t}`);let n=re.floatToByte(this.blue).toString(16);if(n.length<2&&(n=`0${n}`),this.alpha<1){let i=re.floatToByte(this.alpha).toString(16);return i.length<2&&(i=`0${i}`),`#${e}${t}${n}${i}`}return`#${e}${t}${n}`};re.prototype.toBytes=function(e){let t=re.floatToByte(this.red),n=re.floatToByte(this.green),i=re.floatToByte(this.blue),o=re.floatToByte(this.alpha);return l(e)?(e[0]=t,e[1]=n,e[2]=i,e[3]=o,e):[t,n,i,o]};re.prototype.toRgba=function(){return pp[0]=re.floatToByte(this.red),pp[1]=re.floatToByte(this.green),pp[2]=re.floatToByte(this.blue),pp[3]=re.floatToByte(this.alpha),SO[0]};re.prototype.brighten=function(e,t){return e=1-e,t.red=1-(1-this.red)*e,t.green=1-(1-this.green)*e,t.blue=1-(1-this.blue)*e,t.alpha=this.alpha,t};re.prototype.darken=function(e,t){return e=1-e,t.red=this.red*e,t.green=this.green*e,t.blue=this.blue*e,t.alpha=this.alpha,t};re.prototype.withAlpha=function(e,t){return re.fromAlpha(this,e,t)};re.add=function(e,t,n){return n.red=e.red+t.red,n.green=e.green+t.green,n.blue=e.blue+t.blue,n.alpha=e.alpha+t.alpha,n};re.subtract=function(e,t,n){return n.red=e.red-t.red,n.green=e.green-t.green,n.blue=e.blue-t.blue,n.alpha=e.alpha-t.alpha,n};re.multiply=function(e,t,n){return n.red=e.red*t.red,n.green=e.green*t.green,n.blue=e.blue*t.blue,n.alpha=e.alpha*t.alpha,n};re.divide=function(e,t,n){return n.red=e.red/t.red,n.green=e.green/t.green,n.blue=e.blue/t.blue,n.alpha=e.alpha/t.alpha,n};re.mod=function(e,t,n){return n.red=e.red%t.red,n.green=e.green%t.green,n.blue=e.blue%t.blue,n.alpha=e.alpha%t.alpha,n};re.lerp=function(e,t,n,i){return i.red=W.lerp(e.red,t.red,n),i.green=W.lerp(e.green,t.green,n),i.blue=W.lerp(e.blue,t.blue,n),i.alpha=W.lerp(e.alpha,t.alpha,n),i};re.multiplyByScalar=function(e,t,n){return n.red=e.red*t,n.green=e.green*t,n.blue=e.blue*t,n.alpha=e.alpha*t,n};re.divideByScalar=function(e,t,n){return n.red=e.red/t,n.green=e.green/t,n.blue=e.blue/t,n.alpha=e.alpha/t,n};re.ALICEBLUE=Object.freeze(re.fromCssColorString("#F0F8FF"));re.ANTIQUEWHITE=Object.freeze(re.fromCssColorString("#FAEBD7"));re.AQUA=Object.freeze(re.fromCssColorString("#00FFFF"));re.AQUAMARINE=Object.freeze(re.fromCssColorString("#7FFFD4"));re.AZURE=Object.freeze(re.fromCssColorString("#F0FFFF"));re.BEIGE=Object.freeze(re.fromCssColorString("#F5F5DC"));re.BISQUE=Object.freeze(re.fromCssColorString("#FFE4C4"));re.BLACK=Object.freeze(re.fromCssColorString("#000000"));re.BLANCHEDALMOND=Object.freeze(re.fromCssColorString("#FFEBCD"));re.BLUE=Object.freeze(re.fromCssColorString("#0000FF"));re.BLUEVIOLET=Object.freeze(re.fromCssColorString("#8A2BE2"));re.BROWN=Object.freeze(re.fromCssColorString("#A52A2A"));re.BURLYWOOD=Object.freeze(re.fromCssColorString("#DEB887"));re.CADETBLUE=Object.freeze(re.fromCssColorString("#5F9EA0"));re.CHARTREUSE=Object.freeze(re.fromCssColorString("#7FFF00"));re.CHOCOLATE=Object.freeze(re.fromCssColorString("#D2691E"));re.CORAL=Object.freeze(re.fromCssColorString("#FF7F50"));re.CORNFLOWERBLUE=Object.freeze(re.fromCssColorString("#6495ED"));re.CORNSILK=Object.freeze(re.fromCssColorString("#FFF8DC"));re.CRIMSON=Object.freeze(re.fromCssColorString("#DC143C"));re.CYAN=Object.freeze(re.fromCssColorString("#00FFFF"));re.DARKBLUE=Object.freeze(re.fromCssColorString("#00008B"));re.DARKCYAN=Object.freeze(re.fromCssColorString("#008B8B"));re.DARKGOLDENROD=Object.freeze(re.fromCssColorString("#B8860B"));re.DARKGRAY=Object.freeze(re.fromCssColorString("#A9A9A9"));re.DARKGREEN=Object.freeze(re.fromCssColorString("#006400"));re.DARKGREY=re.DARKGRAY;re.DARKKHAKI=Object.freeze(re.fromCssColorString("#BDB76B"));re.DARKMAGENTA=Object.freeze(re.fromCssColorString("#8B008B"));re.DARKOLIVEGREEN=Object.freeze(re.fromCssColorString("#556B2F"));re.DARKORANGE=Object.freeze(re.fromCssColorString("#FF8C00"));re.DARKORCHID=Object.freeze(re.fromCssColorString("#9932CC"));re.DARKRED=Object.freeze(re.fromCssColorString("#8B0000"));re.DARKSALMON=Object.freeze(re.fromCssColorString("#E9967A"));re.DARKSEAGREEN=Object.freeze(re.fromCssColorString("#8FBC8F"));re.DARKSLATEBLUE=Object.freeze(re.fromCssColorString("#483D8B"));re.DARKSLATEGRAY=Object.freeze(re.fromCssColorString("#2F4F4F"));re.DARKSLATEGREY=re.DARKSLATEGRAY;re.DARKTURQUOISE=Object.freeze(re.fromCssColorString("#00CED1"));re.DARKVIOLET=Object.freeze(re.fromCssColorString("#9400D3"));re.DEEPPINK=Object.freeze(re.fromCssColorString("#FF1493"));re.DEEPSKYBLUE=Object.freeze(re.fromCssColorString("#00BFFF"));re.DIMGRAY=Object.freeze(re.fromCssColorString("#696969"));re.DIMGREY=re.DIMGRAY;re.DODGERBLUE=Object.freeze(re.fromCssColorString("#1E90FF"));re.FIREBRICK=Object.freeze(re.fromCssColorString("#B22222"));re.FLORALWHITE=Object.freeze(re.fromCssColorString("#FFFAF0"));re.FORESTGREEN=Object.freeze(re.fromCssColorString("#228B22"));re.FUCHSIA=Object.freeze(re.fromCssColorString("#FF00FF"));re.GAINSBORO=Object.freeze(re.fromCssColorString("#DCDCDC"));re.GHOSTWHITE=Object.freeze(re.fromCssColorString("#F8F8FF"));re.GOLD=Object.freeze(re.fromCssColorString("#FFD700"));re.GOLDENROD=Object.freeze(re.fromCssColorString("#DAA520"));re.GRAY=Object.freeze(re.fromCssColorString("#808080"));re.GREEN=Object.freeze(re.fromCssColorString("#008000"));re.GREENYELLOW=Object.freeze(re.fromCssColorString("#ADFF2F"));re.GREY=re.GRAY;re.HONEYDEW=Object.freeze(re.fromCssColorString("#F0FFF0"));re.HOTPINK=Object.freeze(re.fromCssColorString("#FF69B4"));re.INDIANRED=Object.freeze(re.fromCssColorString("#CD5C5C"));re.INDIGO=Object.freeze(re.fromCssColorString("#4B0082"));re.IVORY=Object.freeze(re.fromCssColorString("#FFFFF0"));re.KHAKI=Object.freeze(re.fromCssColorString("#F0E68C"));re.LAVENDER=Object.freeze(re.fromCssColorString("#E6E6FA"));re.LAVENDAR_BLUSH=Object.freeze(re.fromCssColorString("#FFF0F5"));re.LAWNGREEN=Object.freeze(re.fromCssColorString("#7CFC00"));re.LEMONCHIFFON=Object.freeze(re.fromCssColorString("#FFFACD"));re.LIGHTBLUE=Object.freeze(re.fromCssColorString("#ADD8E6"));re.LIGHTCORAL=Object.freeze(re.fromCssColorString("#F08080"));re.LIGHTCYAN=Object.freeze(re.fromCssColorString("#E0FFFF"));re.LIGHTGOLDENRODYELLOW=Object.freeze(re.fromCssColorString("#FAFAD2"));re.LIGHTGRAY=Object.freeze(re.fromCssColorString("#D3D3D3"));re.LIGHTGREEN=Object.freeze(re.fromCssColorString("#90EE90"));re.LIGHTGREY=re.LIGHTGRAY;re.LIGHTPINK=Object.freeze(re.fromCssColorString("#FFB6C1"));re.LIGHTSEAGREEN=Object.freeze(re.fromCssColorString("#20B2AA"));re.LIGHTSKYBLUE=Object.freeze(re.fromCssColorString("#87CEFA"));re.LIGHTSLATEGRAY=Object.freeze(re.fromCssColorString("#778899"));re.LIGHTSLATEGREY=re.LIGHTSLATEGRAY;re.LIGHTSTEELBLUE=Object.freeze(re.fromCssColorString("#B0C4DE"));re.LIGHTYELLOW=Object.freeze(re.fromCssColorString("#FFFFE0"));re.LIME=Object.freeze(re.fromCssColorString("#00FF00"));re.LIMEGREEN=Object.freeze(re.fromCssColorString("#32CD32"));re.LINEN=Object.freeze(re.fromCssColorString("#FAF0E6"));re.MAGENTA=Object.freeze(re.fromCssColorString("#FF00FF"));re.MAROON=Object.freeze(re.fromCssColorString("#800000"));re.MEDIUMAQUAMARINE=Object.freeze(re.fromCssColorString("#66CDAA"));re.MEDIUMBLUE=Object.freeze(re.fromCssColorString("#0000CD"));re.MEDIUMORCHID=Object.freeze(re.fromCssColorString("#BA55D3"));re.MEDIUMPURPLE=Object.freeze(re.fromCssColorString("#9370DB"));re.MEDIUMSEAGREEN=Object.freeze(re.fromCssColorString("#3CB371"));re.MEDIUMSLATEBLUE=Object.freeze(re.fromCssColorString("#7B68EE"));re.MEDIUMSPRINGGREEN=Object.freeze(re.fromCssColorString("#00FA9A"));re.MEDIUMTURQUOISE=Object.freeze(re.fromCssColorString("#48D1CC"));re.MEDIUMVIOLETRED=Object.freeze(re.fromCssColorString("#C71585"));re.MIDNIGHTBLUE=Object.freeze(re.fromCssColorString("#191970"));re.MINTCREAM=Object.freeze(re.fromCssColorString("#F5FFFA"));re.MISTYROSE=Object.freeze(re.fromCssColorString("#FFE4E1"));re.MOCCASIN=Object.freeze(re.fromCssColorString("#FFE4B5"));re.NAVAJOWHITE=Object.freeze(re.fromCssColorString("#FFDEAD"));re.NAVY=Object.freeze(re.fromCssColorString("#000080"));re.OLDLACE=Object.freeze(re.fromCssColorString("#FDF5E6"));re.OLIVE=Object.freeze(re.fromCssColorString("#808000"));re.OLIVEDRAB=Object.freeze(re.fromCssColorString("#6B8E23"));re.ORANGE=Object.freeze(re.fromCssColorString("#FFA500"));re.ORANGERED=Object.freeze(re.fromCssColorString("#FF4500"));re.ORCHID=Object.freeze(re.fromCssColorString("#DA70D6"));re.PALEGOLDENROD=Object.freeze(re.fromCssColorString("#EEE8AA"));re.PALEGREEN=Object.freeze(re.fromCssColorString("#98FB98"));re.PALETURQUOISE=Object.freeze(re.fromCssColorString("#AFEEEE"));re.PALEVIOLETRED=Object.freeze(re.fromCssColorString("#DB7093"));re.PAPAYAWHIP=Object.freeze(re.fromCssColorString("#FFEFD5"));re.PEACHPUFF=Object.freeze(re.fromCssColorString("#FFDAB9"));re.PERU=Object.freeze(re.fromCssColorString("#CD853F"));re.PINK=Object.freeze(re.fromCssColorString("#FFC0CB"));re.PLUM=Object.freeze(re.fromCssColorString("#DDA0DD"));re.POWDERBLUE=Object.freeze(re.fromCssColorString("#B0E0E6"));re.PURPLE=Object.freeze(re.fromCssColorString("#800080"));re.RED=Object.freeze(re.fromCssColorString("#FF0000"));re.ROSYBROWN=Object.freeze(re.fromCssColorString("#BC8F8F"));re.ROYALBLUE=Object.freeze(re.fromCssColorString("#4169E1"));re.SADDLEBROWN=Object.freeze(re.fromCssColorString("#8B4513"));re.SALMON=Object.freeze(re.fromCssColorString("#FA8072"));re.SANDYBROWN=Object.freeze(re.fromCssColorString("#F4A460"));re.SEAGREEN=Object.freeze(re.fromCssColorString("#2E8B57"));re.SEASHELL=Object.freeze(re.fromCssColorString("#FFF5EE"));re.SIENNA=Object.freeze(re.fromCssColorString("#A0522D"));re.SILVER=Object.freeze(re.fromCssColorString("#C0C0C0"));re.SKYBLUE=Object.freeze(re.fromCssColorString("#87CEEB"));re.SLATEBLUE=Object.freeze(re.fromCssColorString("#6A5ACD"));re.SLATEGRAY=Object.freeze(re.fromCssColorString("#708090"));re.SLATEGREY=re.SLATEGRAY;re.SNOW=Object.freeze(re.fromCssColorString("#FFFAFA"));re.SPRINGGREEN=Object.freeze(re.fromCssColorString("#00FF7F"));re.STEELBLUE=Object.freeze(re.fromCssColorString("#4682B4"));re.TAN=Object.freeze(re.fromCssColorString("#D2B48C"));re.TEAL=Object.freeze(re.fromCssColorString("#008080"));re.THISTLE=Object.freeze(re.fromCssColorString("#D8BFD8"));re.TOMATO=Object.freeze(re.fromCssColorString("#FF6347"));re.TURQUOISE=Object.freeze(re.fromCssColorString("#40E0D0"));re.VIOLET=Object.freeze(re.fromCssColorString("#EE82EE"));re.WHEAT=Object.freeze(re.fromCssColorString("#F5DEB3"));re.WHITE=Object.freeze(re.fromCssColorString("#FFFFFF"));re.WHITESMOKE=Object.freeze(re.fromCssColorString("#F5F5F5"));re.YELLOW=Object.freeze(re.fromCssColorString("#FFFF00"));re.YELLOWGREEN=Object.freeze(re.fromCssColorString("#9ACD32"));re.TRANSPARENT=Object.freeze(new re(0,0,0,0));var Y=re;var r9t=T(S(),1);function eC(e,t,n,i){e=y(e,1),t=y(t,1),n=y(n,1),i=y(i,1),this.value=new Uint8Array([Y.floatToByte(e),Y.floatToByte(t),Y.floatToByte(n),Y.floatToByte(i)])}Object.defineProperties(eC.prototype,{componentDatatype:{get:function(){return Q.UNSIGNED_BYTE}},componentsPerAttribute:{get:function(){return 4}},normalize:{get:function(){return!0}}});eC.fromColor=function(e){return new eC(e.red,e.green,e.blue,e.alpha)};eC.toValue=function(e,t){return l(t)?e.toBytes(t):new Uint8Array(e.toBytes())};eC.equals=function(e,t){return e===t||l(e)&&l(t)&&e.value[0]===t.value[0]&&e.value[1]===t.value[1]&&e.value[2]===t.value[2]&&e.value[3]===t.value[3]};var Ht=eC;var c9t=T(S(),1);function tC(e,t,n,i,o){this._format=e,this._datatype=t,this._width=n,this._height=i,this._buffer=o}Object.defineProperties(tC.prototype,{internalFormat:{get:function(){return this._format}},pixelDatatype:{get:function(){return this._datatype}},width:{get:function(){return this._width}},height:{get:function(){return this._height}},bufferView:{get:function(){return this._buffer}}});tC.clone=function(e){if(l(e))return new tC(e._format,e._datatype,e._width,e._height,e._buffer)};tC.prototype.clone=function(){return tC.clone(this)};var oR=tC;var u9t=T(S(),1);function nC(e){this._value=e,this._valueType=qi.getPointType(e)}Object.defineProperties(nC.prototype,{value:{get:function(){return this._value}}});nC.prototype.findTimeInterval=function(e){};nC.prototype.wrapTime=function(e){return 0};nC.prototype.clampTime=function(e){return 0};nC.prototype.evaluate=function(e,t){let n=this._value,i=this._valueType;return i===Number?n:i.clone(n,t)};var rR=nC;var $At=T(S(),1);var b9t=T(S(),1);var bte=W.EPSILON10;function jGe(e,t,n,i){if(!l(e))return;n=y(n,!1);let o=l(i),r=e.length;if(r<2)return e;let s,a=e[0],c,d,u=0,m=-1;for(s=1;sW.EPSILON8){let u=VO(o,i,e.latitude),m=n*Math.cos(t),p=u+m;if(c=$Ge(p,o,i),Math.abs(t)0?a=W.negativePiToPi(e.longitude+d):a=W.negativePiToPi(e.longitude-d)}return l(r)?(r.longitude=a,r.latitude=c,r.height=0,r):new he(a,c,0)}function gp(e,t,n){let i=y(n,ie.WGS84);this._ellipsoid=i,this._start=new he,this._end=new he,this._heading=void 0,this._distance=void 0,this._ellipticity=void 0,this._ellipticitySquared=void 0,l(e)&&l(t)&&Ste(this,e,t,i)}Object.defineProperties(gp.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},surfaceDistance:{get:function(){return this._distance}},start:{get:function(){return this._start}},end:{get:function(){return this._end}},heading:{get:function(){return this._heading}}});gp.fromStartHeadingDistance=function(e,t,n,i,o){let r=y(i,ie.WGS84),s=r.maximumRadius,a=r.minimumRadius,c=s*s,d=a*a,u=Math.sqrt((c-d)/c);t=W.negativePiToPi(t);let m=Cte(e,t,n,r.maximumRadius,u);return!l(o)||l(i)&&!i.equals(o.ellipsoid)?new gp(e,m,r):(o.setEndPoints(e,m),o)};gp.prototype.setEndPoints=function(e,t){Ste(this,e,t,this._ellipsoid)};gp.prototype.interpolateUsingFraction=function(e,t){return this.interpolateUsingSurfaceDistance(e*this._distance,t)};gp.prototype.interpolateUsingSurfaceDistance=function(e,t){return Cte(this._start,this._heading,e,this._ellipsoid.maximumRadius,this._ellipticity,t)};gp.prototype.findIntersectionWithLongitude=function(e,t){let n=this._ellipticity,i=this._heading,o=Math.abs(i),r=this._start;if(e=W.negativePiToPi(e),W.equalsEpsilon(Math.abs(e),Math.PI,W.EPSILON14)&&(e=W.sign(r.longitude)*Math.PI),l(t)||(t=new he),Math.abs(W.PI_OVER_TWO-o)<=W.EPSILON8)return t.longitude=e,t.latitude=r.latitude,t.height=0,t;if(W.equalsEpsilon(Math.abs(W.PI_OVER_TWO-o),W.PI_OVER_TWO,W.EPSILON8))return W.equalsEpsilon(e,r.longitude,W.EPSILON12)?void 0:(t.longitude=e,t.latitude=W.PI_OVER_TWO*W.sign(W.PI_OVER_TWO-i),t.height=0,t);let s=r.latitude,a=n*Math.sin(s),c=Math.tan(.5*(W.PI_OVER_TWO+s))*Math.exp((e-r.longitude)/Math.tan(i)),d=(1+a)/(1-a),u=r.latitude,m;do{m=u;let p=n*Math.sin(m),g=(1+p)/(1-p);u=2*Math.atan(c*Math.pow(g/d,n/2))-W.PI_OVER_TWO}while(!W.equalsEpsilon(u,m,W.EPSILON12));return t.longitude=e,t.latitude=u,t.height=0,t};gp.prototype.findIntersectionWithLatitude=function(e,t){let n=this._ellipticity,i=this._heading,o=this._start;if(W.equalsEpsilon(Math.abs(i),W.PI_OVER_TWO,W.EPSILON8))return;let r=iC(n,o.latitude),s=iC(n,e),a=Math.tan(i)*(s-r),c=W.negativePiToPi(o.longitude+a);return l(t)?(t.longitude=c,t.latitude=e,t.height=0,t):new he(c,e,0)};var Ca=gp;var P9t=T(S(),1);function iEe(e,t){this.positions=l(e)?e:[],this.holes=l(t)?t:[]}var Va=iEe;var $9t=T(S(),1),Wte=T(Gte(),1);var M9t=T(S(),1);var vN={CLOCKWISE:ne.CW,COUNTER_CLOCKWISE:ne.CCW};vN.validate=function(e){return e===vN.CLOCKWISE||e===vN.COUNTER_CLOCKWISE};var os=Object.freeze(vN);var xEe=new h,_Ee=new h,wb={};wb.computeArea2D=function(e){let t=e.length,n=0;for(let i=t-1,o=0;o0?os.COUNTER_CLOCKWISE:os.CLOCKWISE};wb.triangulate=function(e,t){let n=D.packArray(e);return(0,Wte.default)(n,t,2)};var Pte=new h,vte=new h,wte=new h,Ete=new h,Xte=new h,Ite=new h,yp=new h,Fte=new D,Ate=new D,Mte=new D,rC=new D;wb.computeSubdivision=function(e,t,n,i,o){o=y(o,W.RADIANS_PER_DEGREE);let r=l(i),s=n.slice(0),a,c=t.length,d=new Array(c*3),u=new Array(c*2),m=0,p=0;for(a=0;a0;){let L=s.pop(),Z=s.pop(),G=s.pop(),X=h.fromArray(d,G*3,Pte),v=h.fromArray(d,Z*3,vte),P=h.fromArray(d,L*3,wte),F,A,b;r&&(F=D.fromArray(u,G*2,Fte),A=D.fromArray(u,Z*2,Ate),b=D.fromArray(u,L*2,Mte));let R=h.multiplyByScalar(h.normalize(X,Ete),x,Ete),E=h.multiplyByScalar(h.normalize(v,Xte),x,Xte),I=h.multiplyByScalar(h.normalize(P,Ite),x,Ite),w=h.magnitudeSquared(h.subtract(R,E,yp)),N=h.magnitudeSquared(h.subtract(E,I,yp)),B=h.magnitudeSquared(h.subtract(I,R,yp)),U=Math.max(w,N,B),O,k,J;U>C?w===U?(O=`${Math.min(G,Z)} ${Math.max(G,Z)}`,a=f[O],l(a)||(k=h.add(X,v,yp),h.multiplyByScalar(k,.5,k),d.push(k.x,k.y,k.z),a=d.length/3-1,f[O]=a,r&&(J=D.add(F,A,rC),D.multiplyByScalar(J,.5,J),u.push(J.x,J.y))),s.push(G,a,L),s.push(a,Z,L)):N===U?(O=`${Math.min(Z,L)} ${Math.max(Z,L)}`,a=f[O],l(a)||(k=h.add(v,P,yp),h.multiplyByScalar(k,.5,k),d.push(k.x,k.y,k.z),a=d.length/3-1,f[O]=a,r&&(J=D.add(A,b,rC),D.multiplyByScalar(J,.5,J),u.push(J.x,J.y))),s.push(Z,a,G),s.push(a,L,G)):B===U&&(O=`${Math.min(L,G)} ${Math.max(L,G)}`,a=f[O],l(a)||(k=h.add(P,X,yp),h.multiplyByScalar(k,.5,k),d.push(k.x,k.y,k.z),a=d.length/3-1,f[O]=a,r&&(J=D.add(b,F,rC),D.multiplyByScalar(J,.5,J),u.push(J.x,J.y))),s.push(L,a,Z),s.push(a,G,Z)):(g.push(G),g.push(Z),g.push(L))}let V={attributes:{position:new Ge({componentDatatype:Q.DOUBLE,componentsPerAttribute:3,values:d})},indices:g,primitiveType:Fe.TRIANGLES};return r&&(V.attributes.st=new Ge({componentDatatype:Q.FLOAT,componentsPerAttribute:2,values:u})),new ut(V)};var TEe=new he,SEe=new he,CEe=new he,EO=new he;wb.computeRhumbLineSubdivision=function(e,t,n,i,o){o=y(o,W.RADIANS_PER_DEGREE);let r=l(i),s=n.slice(0),a,c=t.length,d=new Array(c*3),u=new Array(c*2),m=0,p=0;for(a=0;a0;){let G=s.pop(),X=s.pop(),v=s.pop(),P=h.fromArray(d,v*3,Pte),F=h.fromArray(d,X*3,vte),A=h.fromArray(d,G*3,wte),b,R,E;r&&(b=D.fromArray(u,v*2,Fte),R=D.fromArray(u,X*2,Ate),E=D.fromArray(u,G*2,Mte));let I=e.cartesianToCartographic(P,TEe),w=e.cartesianToCartographic(F,SEe),N=e.cartesianToCartographic(A,CEe);C.setEndPoints(I,w);let B=C.surfaceDistance;V.setEndPoints(w,N);let U=V.surfaceDistance;L.setEndPoints(N,I);let O=L.surfaceDistance,k=Math.max(B,U,O),J,H,ee,z,j;k>_?B===k?(J=`${Math.min(v,X)} ${Math.max(v,X)}`,a=f[J],l(a)||(H=C.interpolateUsingFraction(.5,EO),ee=(I.height+w.height)*.5,z=h.fromRadians(H.longitude,H.latitude,ee,e,yp),d.push(z.x,z.y,z.z),a=d.length/3-1,f[J]=a,r&&(j=D.add(b,R,rC),D.multiplyByScalar(j,.5,j),u.push(j.x,j.y))),s.push(v,a,G),s.push(a,X,G)):U===k?(J=`${Math.min(X,G)} ${Math.max(X,G)}`,a=f[J],l(a)||(H=V.interpolateUsingFraction(.5,EO),ee=(w.height+N.height)*.5,z=h.fromRadians(H.longitude,H.latitude,ee,e,yp),d.push(z.x,z.y,z.z),a=d.length/3-1,f[J]=a,r&&(j=D.add(R,E,rC),D.multiplyByScalar(j,.5,j),u.push(j.x,j.y))),s.push(X,a,v),s.push(a,G,v)):O===k&&(J=`${Math.min(G,v)} ${Math.max(G,v)}`,a=f[J],l(a)||(H=L.interpolateUsingFraction(.5,EO),ee=(N.height+I.height)*.5,z=h.fromRadians(H.longitude,H.latitude,ee,e,yp),d.push(z.x,z.y,z.z),a=d.length/3-1,f[J]=a,r&&(j=D.add(E,b,rC),D.multiplyByScalar(j,.5,j),u.push(j.x,j.y))),s.push(G,a,X),s.push(a,v,X)):(g.push(v),g.push(X),g.push(G))}let Z={attributes:{position:new Ge({componentDatatype:Q.DOUBLE,componentsPerAttribute:3,values:d})},indices:g,primitiveType:Fe.TRIANGLES};return r&&(Z.attributes.st=new Ge({componentDatatype:Q.FLOAT,componentsPerAttribute:2,values:u})),new ut(Z)};wb.scaleToGeodeticHeight=function(e,t,n,i){n=y(n,ie.WGS84);let o=xEe,r=_Ee;if(t=y(t,0),i=y(i,!0),l(e)){let s=e.length;for(let a=0;a10&&t*2>e.length&&(this._array=e.slice(t),t=0),this._offset=t,this._length--,n};Fb.prototype.peek=function(){if(this._length!==0)return this._array[this._offset]};Fb.prototype.contains=function(e){return this._array.indexOf(e)!==-1};Fb.prototype.clear=function(){this._array.length=this._offset=this._length=0};Fb.prototype.sort=function(e){this._offset>0&&(this._array=this._array.slice(this._offset),this._offset=0),this._array.sort(e)};var Ab=Fb;var Ho={};Ho.computeHierarchyPackedLength=function(e,t){let n=0,i=[e];for(;i.length>0;){let o=i.pop();if(!l(o))continue;n+=2;let r=o.positions,s=o.holes;if(l(r)&&r.length>0&&(n+=r.length*t.packedLength),l(s)){let a=s.length;for(let c=0;c0;){let r=o.pop();if(!l(r))continue;let s=r.positions,a=r.holes;if(t[n++]=l(s)?s.length:0,t[n++]=l(a)?a.length:0,l(s)){let c=s.length;for(let d=0;d0?new Array(o):void 0;for(let a=0;aW.PI){let c=s;s=a,a=c}if(!(r.longitudea))return n.cartographicToCartesian(r)}function PEe(e,t,n,i){if(i===qt.RHUMB)return WEe(e,t,n);let o=jn.lineSegmentPlane(e,t,cn.ORIGIN_XY_PLANE);if(l(o))return n.scaleToGeodeticSurface(o,o)}var vEe=new he;function wEe(e,t,n){let i=[],o,r,s,a,c,d=0;for(;dt.cartesianToCartographic(m,vEe).longitude;if(s===0)i.push({position:d,type:s,visited:!1,next:a,theta:u(o)});else if(a!==0){if(c=PEe(o,r,t,n),++d,!l(c))continue;e.splice(d,0,c),i.push({position:d,type:s,visited:!1,next:a,theta:u(c)})}++d}return i}function Dte(e,t,n,i,o,r,s){let a=[],c=r,d=m=>p=>p.position===m,u=[];do{let m=n[c];a.push(m);let p=i.findIndex(d(c)),g=i[p];if(!l(g)){++c;continue}let{visited:f,type:x,next:_}=g;if(g.visited=!0,x===0){if(_===0){let Z=i[p-(s?1:-1)];if(Z?.position===c+1)Z.visited=!0;else{++c;continue}}if(!f&&s&&_>0||r===c&&!s&&_<0){++c;continue}}if(!(s?x>=0:x<=0)){++c;continue}f||u.push(c);let V=p+(s?1:-1),L=i[V];if(!l(L)){++c;continue}c=L.position}while(c=0&&c!==r&&a.lengthd.theta-u.theta);let c=s[0].z>=0;o=Dte(i,o,s,a,1,0,c)}return i};Ho.polygonsFromHierarchy=function(e,t,n,i,o,r){let s=[],a=[],c=new Ab;c.enqueue(e);let d=l(r);for(;c.length!==0;){let u=c.dequeue(),m=u.positions,p=u.holes,g,f;if(i)for(f=m.length,g=0;g1){for(let v of X)c.enqueue(new Va(v,p));continue}}let V=m.slice(),L=l(p)?p.length:0,Z=[],G;for(g=0;gW.EPSILON12);let R=A*(t*t-n*n)/(n*n),E=1+R*(4096+R*(R*(320-175*R)-768))/16384,I=R*(256+R*(R*(74-47*R)-128))/1024,w=b*b,N=I*F*(b+I*(P*(2*w-1)-I*b*(4*F*F-3)*(4*w-3)/6)/4),B=n*E*(v-N),U=Math.atan2(g*X,_-V*G),O=Math.atan2(m*X,_*G-V);e._distance=B,e._startHeading=U,e._endHeading=O,e._uSquared=R}var dXe=new h,XO=new h;function Ote(e,t,n,i){let o=h.normalize(i.cartographicToCartesian(t,XO),dXe),r=h.normalize(i.cartographicToCartesian(n,XO),XO);lXe(e,i.maximumRadius,i.minimumRadius,t.longitude,t.latitude,n.longitude,n.latitude),e._start=he.clone(t,e._start),e._end=he.clone(n,e._end),e._start.height=0,e._end.height=0,aXe(e)}function mR(e,t,n){let i=y(n,ie.WGS84);this._ellipsoid=i,this._start=new he,this._end=new he,this._constants={},this._startHeading=void 0,this._endHeading=void 0,this._distance=void 0,this._uSquared=void 0,l(e)&&l(t)&&Ote(this,e,t,i)}Object.defineProperties(mR.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},surfaceDistance:{get:function(){return this._distance}},start:{get:function(){return this._start}},end:{get:function(){return this._end}},startHeading:{get:function(){return this._startHeading}},endHeading:{get:function(){return this._endHeading}}});mR.prototype.setEndPoints=function(e,t){Ote(this,e,t,this._ellipsoid)};mR.prototype.interpolateUsingFraction=function(e,t){return this.interpolateUsingSurfaceDistance(this._distance*e,t)};mR.prototype.interpolateUsingSurfaceDistance=function(e,t){let n=this._constants,i=n.distanceRatio+e/n.b,o=Math.cos(2*i),r=Math.cos(4*i),s=Math.cos(6*i),a=Math.sin(2*i),c=Math.sin(4*i),d=Math.sin(6*i),u=Math.sin(8*i),m=i*i,p=i*m,g=n.u8Over256,f=n.u2Over4,x=n.u6Over64,_=n.u4Over16,C=2*p*g*o/3+i*(1-f+7*_/4-15*x/4+579*g/64-(_-15*x/4+187*g/16)*o-(5*x/4-115*g/16)*r-29*g*s/16)+(f/2-_+71*x/32-85*g/16)*a+(5*_/16-5*x/4+383*g/96)*c-m*((x-11*g/2)*a+5*g*c/2)+(29*x/96-29*g/16)*d+539*g*u/1536,V=Math.asin(Math.sin(C)*n.cosineAlpha),L=Math.atan(n.a/n.b*Math.tan(V));C=C-n.sigma;let Z=Math.cos(2*n.sigma+C),G=Math.sin(C),X=Math.cos(C),v=n.cosineU*X,P=n.sineU*G,A=Math.atan2(G*n.sineHeading,v-P*n.cosineHeading)-Yte(n.f,n.sineAlpha,n.cosineSquaredAlpha,C,G,X,Z);return l(t)?(t.longitude=this._start.longitude+A,t.latitude=L,t.height=0,t):new he(this._start.longitude+A,L,0)};var xp=mR;var Nc={};Nc.numberOfPoints=function(e,t,n){let i=h.distance(e,t);return Math.ceil(i/n)};Nc.numberOfPointsRhumbLine=function(e,t,n){let i=Math.pow(e.longitude-t.longitude,2)+Math.pow(e.latitude-t.latitude,2);return Math.max(1,Math.ceil(Math.sqrt(i/(n*n))))};var uXe=new he;Nc.extractHeights=function(e,t){let n=e.length,i=new Array(n);for(let o=0;o0){t=y(t,M.IDENTITY);let o=M.inverseTransformation(t,mXe),r=M.multiplyByPoint(o,h.ZERO,hXe),s=h.normalize(M.multiplyByPointAsVector(o,h.UNIT_Y,Hte),Hte),a=cn.fromPointNormal(r,s,fXe),c=h.normalize(M.multiplyByPointAsVector(o,h.UNIT_X,zte),zte),d=cn.fromPointNormal(r,c,pXe),u=1;n.push(h.clone(e[0]));let m=n[0],p=e.length;for(let g=1;g=0?-a:a}var PXe=new h(-1,0,0),gx=new M,vXe=new M,FO=new $,wXe=$.IDENTITY.clone(),FXe=new h,AXe=new se,jte=new h;function _p(e,t,n,i,o,r,s,a){let c=FXe,d=AXe;gx=Gt.eastNorthUpToFixedFrame(e,o,gx),c=M.multiplyByPointAsVector(gx,PXe,c),c=h.normalize(c,c);let u=WXe(c,t,e,o);FO=$.fromRotationZ(u,FO),jte.z=r,gx=M.multiplyTransformation(gx,M.fromRotationTranslation(FO,jte,vXe),gx);let m=wXe;m[0]=s;for(let p=0;p0){let x=d?2:1;for(let _=0;_=0};var kXe=new h,UXe=new h;pR.computePositions=function(e,t,n,i,o){let r=i._ellipsoid,s=IXe(e,r),a=i._granularity,c=i._cornerType,d=o?NXe(t,n):qte(t,n),u=o?qte(t,n):void 0,m=n.height/2,p=n.width/2,g=e.length,f=[],x=o?[]:void 0,_=SXe,C=CXe,V=VXe,L=LXe,Z=RXe,G=ZXe,X=GXe,v=EXe,P=XXe,F=e[0],A=e[1];L=r.geodeticSurfaceNormal(F,L),_=h.subtract(A,F,_),_=h.normalize(_,_),v=h.cross(L,_,v),v=h.normalize(v,v);let b=s[0],R=s[1];o&&(x=_p(F,v,u,x,r,b+m,1,1)),P=h.clone(F,P),F=A,C=h.negate(_,C);let E,I;for(let B=1;BLe;p--)Se=W.PI_OVER_TWO-p*ye,q[ae++]=1-be*(1+Math.cos(Se)),q[ae++]=.5*(1+Math.sin(Se));for(p=Le;p>0;p--)Se=W.PI_OVER_TWO-ye*p,q[ae++]=1-Te*(1+Math.cos(Se)),q[ae++]=.5*(1+Math.sin(Se));for(p=u-_;p>0;p--)q[ae++]=p*Te,q[ae++]=1;for(p=1;p0;p--)q[ae++]=(p-1)*Te,q[ae++]=1}c.st=new Ge({componentDatatype:Q.FLOAT,componentsPerAttribute:2,values:q})}return t.normal&&(c.normal=new Ge({componentDatatype:Q.FLOAT,componentsPerAttribute:3,values:X.normals})),t.tangent&&(c.tangent=new Ge({componentDatatype:Q.FLOAT,componentsPerAttribute:3,values:X.tangents})),t.bitangent&&(c.bitangent=new Ge({componentDatatype:Q.FLOAT,componentsPerAttribute:3,values:X.bitangents})),{attributes:c,indices:U}}function eIe(e,t){if(!t.normal&&!t.tangent&&!t.bitangent&&!t.st)return e;let n=e.position.values,i,o;(t.normal||t.bitangent)&&(i=e.normal.values,o=e.bitangent.values);let r=e.position.values.length/18,s=r*3,a=r*2,c=s*2,d;if(t.normal||t.bitangent||t.tangent){let u=t.normal?new Float32Array(s*6):void 0,m=t.tangent?new Float32Array(s*6):void 0,p=t.bitangent?new Float32Array(s*6):void 0,g=hne,f=fne,x=YN,_=ON,C=$Xe,V=pne,L=c;for(d=0;d0){let x=Math.min(r,o);d=Math.round(o/x),c+=x}let u=Me.createTypedArray(s,c*2),m=0,p;for(p=0;p0)for(p=0;pe;)this.removeMinimum();this._array.length=e}this._maximumLength=e}},internalArray:{get:function(){return this._array}},comparator:{get:function(){return this._comparator}}});Lm.prototype.clone=function(){let e=this._maximumLength,t=this._comparator,n=this._array,i=this._length,o=new Lm({comparator:t,maximumLength:e});o._length=i;for(let r=0;r=2&&(this._array[0]=this._array[e-1],Xne(this,0)),this._array[e-1]=void 0,t};Lm.prototype.removeMaximum=function(){let e=this._length;if(e===0)return;this._length--;let t;if(e<=2)t=this._array[e-1];else{let n=HO(this,1,2)?1:2;t=this._array[n],this._array[n]=this._array[e-1],e>=4&&Xne(this,n)}return this._array[e-1]=void 0,t};Lm.prototype.getMinimum=function(){if(this._length!==0)return this._array[0]};Lm.prototype.getMaximum=function(){let e=this._length;if(e!==0)return e<=2?this._array[e-1]:this._array[HO(this,1,2)?1:2]};function HN(e,t,n){let i=e._array,o=i[t];i[t]=i[n],i[n]=o}function VR(e,t,n){return e._comparator(e._array[t],e._array[n])<0}function HO(e,t,n){return e._comparator(e._array[t],e._array[n])>0}function Ene(e,t){if(t===0)return;let n=Math.floor(W.log2(t+1))%2===0,i=Math.floor((t-1)/2),o=VR(e,t,i);for(o!==n&&(HN(e,t,i),t=i);t>=3;){let r=Math.floor((t-3)/4);if(VR(e,t,r)!==o)break;HN(e,t,r),t=r}}function Xne(e,t){let n=e._length,i=Math.floor(W.log2(t+1))%2===0,o;for(;(o=2*t+1)1e4?1e4:e,{In:function(t){return Math.pow(t,e)},Out:function(t){return 1-Math.pow(1-t,e)},InOut:function(t){return t<.5?Math.pow(t*2,e)/2:(1-Math.pow(2-t*2,e))/2+.5}}}}),ZR=function(){return performance.now()},uIe=function(){function e(){this._tweens={},this._tweensAddedDuringUpdate={}}return e.prototype.getAll=function(){var t=this;return Object.keys(this._tweens).map(function(n){return t._tweens[n]})},e.prototype.removeAll=function(){this._tweens={}},e.prototype.add=function(t){this._tweens[t.getId()]=t,this._tweensAddedDuringUpdate[t.getId()]=t},e.prototype.remove=function(t){delete this._tweens[t.getId()],delete this._tweensAddedDuringUpdate[t.getId()]},e.prototype.update=function(t,n){t===void 0&&(t=ZR()),n===void 0&&(n=!1);var i=Object.keys(this._tweens);if(i.length===0)return!1;for(;i.length>0;){this._tweensAddedDuringUpdate={};for(var o=0;o1?r(e[n],e[n-1],n-i):r(e[o],e[o+1>n?n:o+1],i-o)},Bezier:function(e,t){for(var n=0,i=e.length-1,o=Math.pow,r=mC.Utils.Bernstein,s=0;s<=i;s++)n+=o(1-t,i-s)*o(t,s)*e[s]*r(i,s);return n},CatmullRom:function(e,t){var n=e.length-1,i=n*t,o=Math.floor(i),r=mC.Utils.CatmullRom;return e[0]===e[n]?(t<0&&(o=Math.floor(i=n*(1+t))),r(e[(o-1+n)%n],e[o],e[(o+1)%n],e[(o+2)%n],i-o)):t<0?e[0]-(r(e[0],e[0],e[1],e[1],-i)-e[0]):t>1?e[n]-(r(e[n],e[n],e[n-1],e[n-1],i-n)-e[n]):r(e[o?o-1:0],e[o],e[n1;i--)n*=i;return e[t]=n,n}}(),CatmullRom:function(e,t,n,i,o){var r=(n-e)*.5,s=(i-t)*.5,a=o*o,c=o*a;return(2*t-2*n+r+s)*c+(-3*t+3*n-2*r-s)*a+r*o+t}}},Wne=function(){function e(){}return e.nextId=function(){return e._nextId++},e._nextId=0,e}(),zO=new uIe,Pne=function(){function e(t,n){n===void 0&&(n=zO),this._object=t,this._group=n,this._isPaused=!1,this._pauseStart=0,this._valuesStart={},this._valuesEnd={},this._valuesStartRepeat={},this._duration=1e3,this._isDynamic=!1,this._initialRepeat=0,this._repeat=0,this._yoyo=!1,this._isPlaying=!1,this._reversed=!1,this._delayTime=0,this._startTime=0,this._easingFunction=Ri.Linear.None,this._interpolationFunction=mC.Linear,this._chainedTweens=[],this._onStartCallbackFired=!1,this._onEveryStartCallbackFired=!1,this._id=Wne.nextId(),this._isChainStopped=!1,this._propertiesAreSetUp=!1,this._goToEnd=!1}return e.prototype.getId=function(){return this._id},e.prototype.isPlaying=function(){return this._isPlaying},e.prototype.isPaused=function(){return this._isPaused},e.prototype.getDuration=function(){return this._duration},e.prototype.to=function(t,n){if(n===void 0&&(n=1e3),this._isPlaying)throw new Error("Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.");return this._valuesEnd=t,this._propertiesAreSetUp=!1,this._duration=n<0?0:n,this},e.prototype.duration=function(t){return t===void 0&&(t=1e3),this._duration=t<0?0:t,this},e.prototype.dynamic=function(t){return t===void 0&&(t=!1),this._isDynamic=t,this},e.prototype.start=function(t,n){if(t===void 0&&(t=ZR()),n===void 0&&(n=!1),this._isPlaying)return this;if(this._group&&this._group.add(this),this._repeat=this._initialRepeat,this._reversed){this._reversed=!1;for(var i in this._valuesStartRepeat)this._swapEndStartRepeatValues(i),this._valuesStart[i]=this._valuesStartRepeat[i]}if(this._isPlaying=!0,this._isPaused=!1,this._onStartCallbackFired=!1,this._onEveryStartCallbackFired=!1,this._isChainStopped=!1,this._startTime=t,this._startTime+=this._delayTime,!this._propertiesAreSetUp||n){if(this._propertiesAreSetUp=!0,!this._isDynamic){var o={};for(var r in this._valuesEnd)o[r]=this._valuesEnd[r];this._valuesEnd=o}this._setupProperties(this._object,this._valuesStart,this._valuesEnd,this._valuesStartRepeat,n)}return this},e.prototype.startFromCurrentValues=function(t){return this.start(t,!0)},e.prototype._setupProperties=function(t,n,i,o,r){for(var s in i){var a=t[s],c=Array.isArray(a),d=c?"array":typeof a,u=!c&&Array.isArray(i[s]);if(!(d==="undefined"||d==="function")){if(u){var m=i[s];if(m.length===0)continue;for(var p=[a],g=0,f=m.length;g"u"||r)&&(n[s]=a),c||(n[s]*=1),u?o[s]=i[s].slice().reverse():o[s]=n[s]||0}}},e.prototype.stop=function(){return this._isChainStopped||(this._isChainStopped=!0,this.stopChainedTweens()),this._isPlaying?(this._group&&this._group.remove(this),this._isPlaying=!1,this._isPaused=!1,this._onStopCallback&&this._onStopCallback(this._object),this):this},e.prototype.end=function(){return this._goToEnd=!0,this.update(1/0),this},e.prototype.pause=function(t){return t===void 0&&(t=ZR()),this._isPaused||!this._isPlaying?this:(this._isPaused=!0,this._pauseStart=t,this._group&&this._group.remove(this),this)},e.prototype.resume=function(t){return t===void 0&&(t=ZR()),!this._isPaused||!this._isPlaying?this:(this._isPaused=!1,this._startTime+=t-this._pauseStart,this._pauseStart=0,this._group&&this._group.add(this),this)},e.prototype.stopChainedTweens=function(){for(var t=0,n=this._chainedTweens.length;to)return!1;n&&this.start(t,!0)}if(this._goToEnd=!1,ti)return 1;var o=t%n,r=Math.min(o/this._duration,1);return r===0&&t!==0&&t%this._duration===0?1:r},e.prototype._calculateCompletionStatus=function(t,n){return this._duration!==0&&t0&&(Z=!0,C+=c-1),s0&&u!==x-1&&m!==0&&m!==_-1&&(A[H]=!0),H++;p=0;let ee,z;for(u=1;u=Ae&&u0&&(f=!0,m+=d),smF8J\xB4\xDD\xF0.\xDDu\xDA\x8CDt"\xFAa"\f3"So\xAF9D\v\x8C9\xD99L\xB9\xBF\x7F\xAB\\\x8CP_\x9F"ux\xE9\x07q\x91h;\xC1\xC4\x9B\x7F\xF0M\xAA>}\xE6\xCEI\x89\xC6\xE6x\fa1-\xA4O\xA5~q \x88\xEC\r1\xE8N\v\0nPh}=\b\r\x95\xA6n\xA3h\x97$[k\xF3#\xF3\xB6s\xB3\r\v@\xC0\x9F\xD8Q]\xFA".j\xDFI\0\xB9\xA0wU\xC6\xEFj\xBF{GL\x7F\x83\xEE\xDC\xDCF\x85\xA9\xADS\x07+S4\x07\xFF\x94Y\xE48\xE81\x83N\xB9XFk\xCB-#\x86\x92p\x005\x88"\xCF1\xB2&/\xE7\xC3u-6,rt\xB0#G\xB7\xD3\xD1&\x857r\xE2\0\x8CD\xCF\xDA3-\xDE\`\x86i#i*|\xCDKQ\r\x95T9w.)\xEA\x1B\xA6P\xA2j\x8FoP\x99\\>T\xFB\xEFP[\v\x07E\x89m(w7\xDB\x8EJfJo\x99 \xE5p\xE2\xB9q~\fmI-z\xFEr\xC7\xF2Y0\x8F\xBB]s\xE5\xC9 \xEAx\xEC \x90\xF0\x8A\x7FB|G\`\xB0\xBD&\xB7q\xB6\xC7\x9F\xD13\x82=\xD3\xAB\xEEc\x99\xC8+S\xA0D\\q\xC6\xCCD2O<\xCA\xC0)=R\xD3aX\xA9}e\xB4\xDC\xCF\r\xF4=\xF1\b\xA9B\xDA# \xD8\xBF^PI\xF8M\xC0\xCBGLO\xF7{+\xD8\xC51\x92;\xB5o\xDCl\r\x92\x88\xD1\x9E\xDB?\xE2\xE9\xDA_\xD4\x84\xE2FaZ\xDEU\xCF\xA4\0\xBE\xFD\xCEg\xF1Ji\x97\xE6 H\xD8]\x7F~\xAEq N\xAE\xC0V\xA9\x91<\x82r\xE7v\xEC)I\xD6]-\x83\xE3\xDB6\xA9;f\x97\x87j\xD5\xB6=P^R\xB9K\xC7sWx\xC9\xF4.Y\x07\x95\x93o\xD0KW>''\xC7\`\xDB;\xED\x9ASD>?\x8D\x92mw\xA2 \xEB?R\xA8\xC6U^1I7\x85\xF4\xC5&-\xA9\xBF\x8B'T\xDA\xC3j \xE5*x\xB0\xD6\x90pr\xAA\x8Bh\xBD\x88\xF7_H\xB1~\xC0XL?f\xF9>\xE1e\xC0p\xA7\xCF8i\xAF\xF0VldI\x9C'\xADxtO\xC2\x87\xDEV9\0\xDAw\v\xCB-\x1B\x89\xFB5O\xF5\bQ\`\xC1 ZGM&30x\xDA\xC0\x9CFG\xE2[y\`In7gS >\xE9\xECF9\xB2\xF14\r\xC6\x84Sun\xE1\fY\xD9\xDE)\x85{II\xA5wy\xBEIV.6\xE7\v:\xBBOb{\xD2M1\x95/\xBD8{\xA8O!\xE1\xECFpv\x95})"x\x88 \x90\xDD\x9D\\\xDA\xDEQ\xCF\xF0\xFCYRe|3\xDF\xF3H\xDA\xBB*u\xDB\`\xB2\xD4\xFC\xED\x1B\xEC\x7F5\xA8\xFF(1\x07-\xC8\xDC\x88F|\x8A["`);function md(e){this.imageryPresent=!0,this.protoImagery=void 0,this.terrainPresent=!0,this.negativeAltitudeExponentBias=32,this.negativeAltitudeThreshold=W.EPSILON12,this.providers={},this.key=void 0,this._resource=void 0,this._quadPacketVersion=1,this._tileInfo={},this._subtreePromises={}}Object.defineProperties(md.prototype,{url:{get:function(){return this._resource.url}},proxy:{get:function(){return this._resource.proxy}},resource:{get:function(){return this._resource}}});md.fromUrl=async function(e){let t=e;typeof t!="string"&&!(t instanceof Ee)&&(t=e.url);let n=Ee.createIfNeeded(t);n.appendForwardSlash();let i=new md;i._resource=n;try{await eWe(i),await i.getQuadTreePacket("",i._quadPacketVersion)}catch(o){let r=`An error occurred while accessing ${Jne(i,"",1).url}: ${o}`;throw new ue(r)}return i};md.tileXYToQuadKey=function(e,t,n){let i="";for(let o=n;o>=0;--o){let r=1<=0;--o){let r=1<1;)if(o=i.substring(i.length-1),i=i.substring(0,i.length-1),t=this.getTileInformationFromQuadKey(i),l(t)){!t.hasSubtree()&&!t.hasChild(parseInt(o))&&(n=!1);break}else if(t===null){n=!1;break}return n};var Kne=new hi("decodeGoogleEarthEnterprisePacket");md.prototype.getQuadTreePacket=function(e,t,n){t=y(t,1),e=y(e,"");let o=Jne(this,e,t,n).fetchArrayBuffer();if(!l(o))return;let r=this._tileInfo,s=this.key;return o.then(function(a){return Kne.scheduleTask({buffer:a,quadKey:e,type:"Metadata",key:s},[a]).then(function(d){let u,m=-1;if(e!==""){m=e.length+1;let f=d[e];u=r[e],u._bits|=f._bits,delete d[e]}let p=Object.keys(d);p.sort(function(f,x){return f.length-x.length});let g=p.length;for(let f=0;f1){let L=r[x.substring(0,x.length-1)];C.setParent(L)}r[x]=C}else r[x]=null}})})};md.prototype.populateSubtree=function(e,t,n,i){let o=md.tileXYToQuadKey(e,t,n);return oH(this,o,i)};function oH(e,t,n){let i=e._tileInfo,o=t,r=i[o];if(l(r)&&(!r.hasSubtree()||r.hasChildren()))return r;for(;r===void 0&&o.length>1;)o=o.substring(0,o.length-1),r=i[o];let s,a=e._subtreePromises,c=a[o];if(l(c))return c.then(function(){return s=new Yo({throttle:n.throttle,throttleByServer:n.throttleByServer,type:n.type,priorityFunction:n.priorityFunction}),oH(e,t,s)});if(!l(r)||!r.hasSubtree())return Promise.reject(new ue(`Couldn't load metadata for tile ${t}`));if(c=e.getQuadTreePacket(o,r.cnodeVersion,n),!!l(c))return a[o]=c,c.then(function(){return s=new Yo({throttle:n.throttle,throttleByServer:n.throttleByServer,type:n.type,priorityFunction:n.priorityFunction}),oH(e,t,s)}).finally(function(){delete a[o]})}md.prototype.getTileInformation=function(e,t,n){let i=md.tileXYToQuadKey(e,t,n);return this._tileInfo[i]};md.prototype.getTileInformationFromQuadKey=function(e){return this._tileInfo[e]};function Jne(e,t,n,i){return e._resource.getDerivedResource({url:`flatfile?q2-0${t}-q.${n.toString()}`,request:i})}var nH,iH;function eWe(e){let t=e._resource.getDerivedResource({url:"dbRoot.v5",queryParameters:{output:"proto"}});if(!l(iH)){let n=tn("ThirdParty/google-earth-dbroot-parser.js"),i=window.cesiumGoogleEarthDbRootParser;iH=Oy(n).then(function(){nH=window.cesiumGoogleEarthDbRootParser(jIe),l(i)?window.cesiumGoogleEarthDbRootParser=i:delete window.cesiumGoogleEarthDbRootParser})}return iH.then(function(){return t.fetchArrayBuffer()}).then(function(n){let i=nH.EncryptedDbRootProto.decode(new Uint8Array(n)),o=i.encryptionData,r=o.byteOffset,s=r+o.byteLength,a=e.key=o.buffer.slice(r,s);o=i.dbrootData,r=o.byteOffset,s=r+o.byteLength;let c=o.buffer.slice(r,s);return Kne.scheduleTask({buffer:c,type:"DbRoot",key:a},[c])}).then(function(n){let i=nH.DbRootProto.decode(new Uint8Array(n.buffer));if(e.imageryPresent=y(i.imageryPresent,e.imageryPresent),e.protoImagery=i.protoImagery,e.terrainPresent=y(i.terrainPresent,e.terrainPresent),l(i.endSnippet)&&l(i.endSnippet.model)){let a=i.endSnippet.model;e.negativeAltitudeExponentBias=y(a.negativeAltitudeExponentBias,e.negativeAltitudeExponentBias),e.negativeAltitudeThreshold=y(a.compressedNegativeAltitudeThreshold,e.negativeAltitudeThreshold)}l(i.databaseVersion)&&(e._quadPacketVersion=y(i.databaseVersion.quadtreeVersion,e._quadPacketVersion));let o=e.providers,r=y(i.providerInfo,[]),s=r.length;for(let a=0;a=-1e-15&&x.y>=-1e-15&&x.z>=-1e-15){let _=r.decodeHeight(o,d),C=r.decodeHeight(o,u),V=r.decodeHeight(o,m);return x.x*_+x.y*C+x.z*V}}}var cWe=Uint16Array.BYTES_PER_ELEMENT,jne=Uint32Array.BYTES_PER_ELEMENT,sH=Int32Array.BYTES_PER_ELEMENT,lWe=Float32Array.BYTES_PER_ELEMENT,aH=Float64Array.BYTES_PER_ELEMENT;function dWe(e,t,n,i){let o=e._buffer,r=0,s=0,a=0;n>.5?(t>.5?(r=2,s=.5):r=3,a=.5):t>.5&&(r=1,s=.5);let c=new DataView(o),d=0;for(let G=0;G=-1e-15&&I.y>=-1e-15&&I.z>=-1e-15)return I.x*V[G]+I.y*V[X]+I.z*V[v]}}var gC=Vx;var Y3t=T(S(),1);var hu={UNKNOWN:0,NONE:1,SELF:2,PARENT:3},jN=new te;function qN(){this._terrainCache={},this._lastTidy=te.now()}qN.prototype.add=function(e,t){this._terrainCache[e]={buffer:t,timestamp:te.now()}};qN.prototype.get=function(e){let n=this._terrainCache[e];if(l(n))return delete this._terrainCache[e],n.buffer};qN.prototype.tidy=function(){if(te.now(jN),te.secondsDifference(jN,this._lastTidy)>10){let e=this._terrainCache,t=Object.keys(e),n=t.length;for(let i=0;i10&&delete e[o]}te.clone(jN,this._lastTidy)}};function zb(e){e=y(e,y.EMPTY_OBJECT),this._tilingScheme=new Ai({numberOfLevelZeroTilesX:2,numberOfLevelZeroTilesY:2,rectangle:new ce(-W.PI,-W.PI,W.PI,W.PI),ellipsoid:e.ellipsoid});let t=e.credit;typeof t=="string"&&(t=new Ct(t)),this._credit=t,this._levelZeroMaximumGeometricError=40075.16,this._terrainCache=new qN,this._terrainPromises={},this._terrainRequests={},this._errorEvent=new ge}Object.defineProperties(zb.prototype,{url:{get:function(){return this._metadata.url}},proxy:{get:function(){return this._metadata.proxy}},tilingScheme:{get:function(){return this._tilingScheme}},errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},hasWaterMask:{get:function(){return!1}},hasVertexNormals:{get:function(){return!1}},availability:{get:function(){}}});zb.fromMetadata=function(e,t){if(!e.terrainPresent)throw new ue(`The server ${e.url} doesn't have terrain`);let n=new zb(t);return n._metadata=e,n};var uWe=new hi("decodeGoogleEarthEnterprisePacket");function eie(e,t,n){let i=t.getChildBitmask();if(t.terrainState===hu.PARENT){i=0;for(let o=0;o<4;++o){let r=n.getTileInformationFromQuadKey(e+o.toString());l(r)&&r.hasTerrain()&&(i|=1<0?n:1,e._metadata.resource.getDerivedResource({url:`flatfile?f1c-0${t}-t.${n.toString()}`,request:i})}var cH=zb;var K3t=T(S(),1);var $N={};$N.defaultApiKey=void 0;$N.mapTilesApiEndpoint=new Ee({url:"https://tile.googleapis.com/v1/"});$N.getDefaultCredit=function(){return new Ct('Google',!0)};var Lx=$N;var xBt=T(S(),1);var bH=[Si,Ci],hWe=bH.length,_ie=Math.cos(W.toRadians(30)),tie=Math.cos(W.toRadians(150)),Tie=0,Sie=1e3;function Jb(e){e=y(e,y.EMPTY_OBJECT);let t=e.positions;this.width=y(e.width,1),this._positions=t,this.granularity=y(e.granularity,9999),this.loop=y(e.loop,!1),this.arcType=y(e.arcType,qt.GEODESIC),this._ellipsoid=ie.WGS84,this._projectionIndex=0,this._workerName="createGroundPolylineGeometry",this._scene3DOnly=!1}Object.defineProperties(Jb.prototype,{packedLength:{get:function(){return 1+this._positions.length*3+1+1+1+ie.packedLength+1+1}}});Jb.setProjectionAndEllipsoid=function(e,t){let n=0;for(let i=0;i_ie||rW.PI_OVER_TWO&&(a=!0,s=h.subtract(r,n,lie),d=c.cartesianToCartographic(s,cie)),d.height=0;let u=e.project(d,o);return o=h.subtract(u,i,o),o.z=0,o=h.normalize(o,o),a&&h.negate(o,o),o}var PWe=new h,die=new h;function uie(e,t,n,i,o,r){let s=h.subtract(t,e,PWe);h.normalize(s,s);let a=n-Tie,c=h.multiplyByScalar(s,a,die);h.add(e,c,o);let d=i-Sie;c=h.multiplyByScalar(s,d,die),h.add(t,c,r)}var vWe=new h;function n5(e,t){let n=cn.getPointDistance(i5,e),i=cn.getPointDistance(i5,t),o=vWe;W.equalsEpsilon(n,0,W.EPSILON2)?(o=Zp(t,e,o),h.multiplyByScalar(o,W.EPSILON2,o),h.add(e,o,e)):W.equalsEpsilon(i,0,W.EPSILON2)&&(o=Zp(e,t,o),h.multiplyByScalar(o,W.EPSILON2,o),h.add(t,o,t))}function wWe(e,t){let n=Math.abs(e.longitude),i=Math.abs(t.longitude);if(W.equalsEpsilon(n,W.PI,W.EPSILON11)){let o=W.sign(t.longitude);return e.longitude=o*(n-W.EPSILON11),1}else if(W.equalsEpsilon(i,W.PI,W.EPSILON11)){let o=W.sign(e.longitude);return t.longitude=o*(i-W.EPSILON11),2}return 0}var Vie=new he,Lie=new he,mie=new h,mH=new h,hie=new h,fie=new h,FWe=new h,pie=new h,AWe=[Vie,Lie],MWe=new ce,NWe=new h,kWe=new h,UWe=new h,DWe=new h,BWe=new h,YWe=new h,hH=new h,fH=new h,OWe=new h,HWe=new h,zWe=new h,bie=new h,KWe=new h,JWe=new h,QWe=new Bn,jWe=new Bn,gie=new h,qWe=new h,yie=new h,$We=[new le,new le],Rie=[0,2,1,0,3,2,0,7,3,0,4,7,0,5,4,0,1,5,5,7,4,5,6,7,5,2,6,5,1,2,3,6,2,3,7,6],xie=Rie.length;function e2e(e,t,n,i,o,r,s){let a,c,d=t._ellipsoid,u=n.length/3-1,m=u*8,p=m*4,g=u*36,f=m>65535?new Uint32Array(g):new Uint16Array(g),x=new Float64Array(m*3),_=new Float32Array(p),C=new Float32Array(p),V=new Float32Array(p),L=new Float32Array(p),Z=new Float32Array(p),G,X,v,P;s&&(G=new Float32Array(p),X=new Float32Array(p),v=new Float32Array(p),P=new Float32Array(m*2));let F=r.length/2,A=0,b=Vie;b.height=0;let R=Lie;R.height=0;let E=mie,I=mH;if(s)for(c=0,a=1;a_ie?(ht=WR(t,b,ke,Pt,hH),Ae=WR(t,R,j,Ot,fH)):Bi===1?(Ae=WR(t,R,j,Ot,fH),ht.x=0,ht.y=W.sign(b.longitude-Math.abs(R.longitude)),ht.z=0):(ht=WR(t,b,ke,Pt,hH),Ae.x=0,Ae.y=W.sign(b.longitude-R.longitude),Ae.z=0)}let $e=h.distance(Pe,z),Qe=Bn.fromCartesian(Xe,QWe),je=h.subtract(ee,Xe,OWe),kt=h.normalize(je,bie),pe=h.subtract(Pe,Xe,HWe);pe=h.normalize(pe,pe);let Ve=h.cross(kt,pe,bie);Ve=h.normalize(Ve,Ve);let Dt=h.cross(pe,ke,KWe);Dt=h.normalize(Dt,Dt);let bt=h.subtract(z,ee,zWe);bt=h.normalize(bt,bt);let li=h.cross(j,bt,JWe);li=h.normalize(li,li);let Vo=$e/N,Rs=q/N,zs=0,Nr,$r,Ue,it=0,tt=0;if(s){zs=h.distance(Pt,Ot),Nr=Bn.fromCartesian(Pt,jWe),$r=h.subtract(Ot,Pt,gie),Ue=h.normalize($r,qWe);let Bi=Ue.x;Ue.x=Ue.y,Ue.y=-Bi,it=zs/A,tt=be/A}for(B=0;B<8;B++){let Bi=J+B*4,us=O+B*2,yr=Bi+3,ml=B<4?1:-1,Do=B===2||B===3||B===6||B===7?1:-1;h.pack(Qe.high,_,Bi),_[yr]=je.x,h.pack(Qe.low,C,Bi),C[yr]=je.y,h.pack(Dt,V,Bi),V[yr]=je.z,h.pack(li,L,Bi),L[yr]=Vo*ml,h.pack(Ve,Z,Bi);let xr=Rs*Do;xr===0&&Do<0&&(xr=9),Z[yr]=xr,s&&(G[Bi]=Nr.high.x,G[Bi+1]=Nr.high.y,G[Bi+2]=Nr.low.x,G[Bi+3]=Nr.low.y,v[Bi]=-ht.y,v[Bi+1]=ht.x,v[Bi+2]=Ae.y,v[Bi+3]=-Ae.x,X[Bi]=$r.x,X[Bi+1]=$r.y,X[Bi+2]=Ue.x,X[Bi+3]=Ue.y,P[us]=it*ml,xr=tt*Do,xr===0&&Do<0&&(xr=9),P[us+1]=xr)}let qe=UWe,dt=DWe,Bt=NWe,Ln=kWe,Lo=ce.fromCartographicArray(AWe,MWe),nr=ci.getMinimumMaximumHeights(Lo,d),Na=nr.minimumTerrainHeight,ka=nr.maximumTerrainHeight;Te+=Math.abs(Na),Te+=Math.abs(ka),uie(Xe,Pe,Na,ka,qe,Bt),uie(ee,z,Na,ka,dt,Ln);let io=h.multiplyByScalar(Ve,W.EPSILON5,yie);h.add(qe,io,qe),h.add(dt,io,dt),h.add(Bt,io,Bt),h.add(Ln,io,Ln),n5(qe,dt),n5(Bt,Ln),h.pack(qe,x,k),h.pack(dt,x,k+3),h.pack(Ln,x,k+6),h.pack(Bt,x,k+9),io=h.multiplyByScalar(Ve,-2*W.EPSILON5,yie),h.add(qe,io,qe),h.add(dt,io,dt),h.add(Bt,io,Bt),h.add(Ln,io,Ln),n5(qe,dt),n5(Bt,Ln),h.pack(qe,x,k+12),h.pack(dt,x,k+15),h.pack(Ln,x,k+18),h.pack(Bt,x,k+21),U+=2,c+=3,O+=16,k+=24,J+=32,q+=$e,be+=zs}c=0;let ae=0;for(a=0;a0){for(c=0;c0;a/=2)r=(o.x&a)>0?1:0,s=(o.y&a)>0?1:0,c+=BigInt((3*r^s)*a*a),Zie(i,o,r,s);return c};xH.decode2D=function(e,t){let n=Math.pow(2,e),i={x:0,y:0},o,r,s,a;for(s=1,a=t;st.length&&(t.length=e);this._length=e}},values:{get:function(){return this._array}}});nf.prototype.get=function(e){return this._array[e]};nf.prototype.set=function(e,t){e>=this._length&&(this.length=e+1),this._array[e]=t};nf.prototype.peek=function(){return this._array[this._length-1]};nf.prototype.push=function(e){let t=this.length++;this._array[t]=e};nf.prototype.pop=function(){if(this._length===0)return;let e=this._array[this._length-1];return--this.length,e};nf.prototype.reserve=function(e){e>this._array.length&&(this._array.length=e)};nf.prototype.resize=function(e){this.length=e};nf.prototype.trim=function(e){e=y(e,this._length),this._array.length=e};var Bc=nf;var YYt=T(S(),1);function r5(){fe.throwInstantiationError()}Object.defineProperties(r5.prototype,{ellipsoid:{get:fe.throwInstantiationError}});r5.prototype.project=fe.throwInstantiationError;r5.prototype.unproject=fe.throwInstantiationError;var RH=r5;var JYt=T(S(),1);function _C(e){e=y(e,y.EMPTY_OBJECT);let t=e.weights,n=e.times;this._times=n,this._weights=t,this._count=t.length/n.length,this._lastTimeIndex=0}Object.defineProperties(_C.prototype,{times:{get:function(){return this._times}},weights:{get:function(){return this._weights}}});_C.prototype.findTimeInterval=qi.prototype.findTimeInterval;_C.prototype.wrapTime=qi.prototype.wrapTime;_C.prototype.clampTime=qi.prototype.clampTime;_C.prototype.evaluate=function(e,t){let n=this.weights,i=this.times,o=this._lastTimeIndex=this.findTimeInterval(e,this._lastTimeIndex),r=(e-i[o])/(i[o+1]-i[o]);l(t)||(t=new Array(this._count));for(let s=0;s>1)&858993459,e=(e^e>>2)&252645135,e=(e^e>>4)&16711935,e=(e^e>>8)&65535,e}function EH(e){return e&=153391689,e=(e^e>>2)&51130563,e=(e^e>>4)&50393103,e=(e^e>>8)&4278190335,e=(e^e>>16)&1023,e}DR.encode2D=function(e,t){return(Oie(e)|Oie(t)<<1)>>>0};DR.decode2D=function(e,t){return l(t)||(t=new Array(2)),t[0]=Hie(e),t[1]=Hie(e>>1),t};DR.encode3D=function(e,t,n){return GH(e)|GH(t)<<1|GH(n)<<2};DR.decode3D=function(e,t){return l(t)||(t=new Array(3)),t[0]=EH(e),t[1]=EH(e>>1),t[2]=EH(e>>2),t};var Qb=DR;var nOt=T(S(),1);function pu(e,t,n,i){this.near=y(e,0),this.nearValue=y(t,0),this.far=y(n,1),this.farValue=y(i,0)}pu.clone=function(e,t){if(l(e))return l(t)?(t.near=e.near,t.nearValue=e.nearValue,t.far=e.far,t.farValue=e.farValue,t):new pu(e.near,e.nearValue,e.far,e.farValue)};pu.packedLength=4;pu.pack=function(e,t,n){return n=y(n,0),t[n++]=e.near,t[n++]=e.nearValue,t[n++]=e.far,t[n]=e.farValue,t};pu.unpack=function(e,t,n){return t=y(t,0),l(n)||(n=new pu),n.near=e[t++],n.nearValue=e[t++],n.far=e[t++],n.farValue=e[t],n};pu.equals=function(e,t){return e===t||l(e)&&l(t)&&e.near===t.near&&e.nearValue===t.nearValue&&e.far===t.far&&e.farValue===t.farValue};pu.prototype.clone=function(e){return pu.clone(this,e)};pu.prototype.equals=function(e){return pu.equals(this,e)};var At=pu;var fOt=T(S(),1);var oOt=T(S(),1),y2e={NONE:-1,PARTIAL:0,FULL:1},ir=Object.freeze(y2e);function tc(e,t){this._occluderPosition=h.clone(e.center),this._occluderRadius=e.radius,this._horizonDistance=0,this._horizonPlaneNormal=void 0,this._horizonPlanePosition=void 0,this._cameraPosition=void 0,this.cameraPosition=t}var s5=new h;Object.defineProperties(tc.prototype,{position:{get:function(){return this._occluderPosition}},radius:{get:function(){return this._occluderRadius}},cameraPosition:{set:function(e){e=h.clone(e,this._cameraPosition);let t=h.subtract(this._occluderPosition,e,s5),n=h.magnitudeSquared(t),i=this._occluderRadius*this._occluderRadius,o,r,s;if(n>i){o=Math.sqrt(n-i),n=1/Math.sqrt(n),r=h.multiplyByScalar(t,n,s5);let a=o*o*n;s=h.add(e,h.multiplyByScalar(r,a,s5),s5)}else o=Number.MAX_VALUE;this._horizonDistance=o,this._horizonPlaneNormal=r,this._horizonPlanePosition=s,this._cameraPosition=e}}});tc.fromBoundingSphere=function(e,t,n){return l(n)?(h.clone(e.center,n._occluderPosition),n._occluderRadius=e.radius,n.cameraPosition=t,n):new tc(e,t)};var Kie=new h;tc.prototype.isPointVisible=function(e){if(this._horizonDistance!==Number.MAX_VALUE){let t=h.subtract(e,this._occluderPosition,Kie),n=this._occluderRadius;if(n=h.magnitudeSquared(t)-n*n,n>0)return n=Math.sqrt(n)+this._horizonDistance,t=h.subtract(e,this._cameraPosition,t),n*n>h.magnitudeSquared(t)}return!1};var x2e=new h;tc.prototype.isBoundingSphereVisible=function(e){let t=h.clone(e.center,x2e),n=e.radius;if(this._horizonDistance!==Number.MAX_VALUE){let i=h.subtract(t,this._occluderPosition,Kie),o=this._occluderRadius-n;if(o=h.magnitudeSquared(i)-o*o,n0?(o=Math.sqrt(o)+this._horizonDistance,i=h.subtract(t,this._cameraPosition,i),o*o+n*n>h.magnitudeSquared(i)):!1;if(o>0){i=h.subtract(t,this._cameraPosition,i);let r=h.magnitudeSquared(i),s=this._occluderRadius*this._occluderRadius,a=n*n;return(this._horizonDistance*this._horizonDistance+s)*a>r*s?!0:(o=Math.sqrt(o)+this._horizonDistance,o*o+a>r)}return!0}return!1};var _2e=new h;tc.prototype.computeVisibility=function(e){let t=h.clone(e.center),n=e.radius;if(n>this._occluderRadius)return ir.FULL;if(this._horizonDistance!==Number.MAX_VALUE){let i=h.subtract(t,this._occluderPosition,_2e),o=this._occluderRadius-n,r=h.magnitudeSquared(i);if(o=r-o*o,o>0){o=Math.sqrt(o)+this._horizonDistance,i=h.subtract(t,this._cameraPosition,i);let s=h.magnitudeSquared(i);return o*o+n*n0?(o=Math.sqrt(o)+this._horizonDistance,s-n?ir.PARTIAL:ir.FULL))}}return ir.NONE};var a5=new h;tc.computeOccludeePoint=function(e,t,n){let i=h.clone(t),o=h.clone(e.center),r=e.radius,s=n.length,a=h.normalize(h.subtract(i,o,a5),a5),c=-h.dot(a,o),d=tc._anyRotationVector(o,a,c),u=tc._horizonToPlaneNormalDotProduct(e,a,c,d,n[0]);if(!u)return;let m;for(let g=1;gi.y?0:1;(o===0&&i.z>i.x||o===1&&i.z>i.y)&&(o=2);let r=new h,s;o===0?(i.x=e.x,i.y=e.y+1,i.z=e.z+1,s=h.UNIT_X):o===1?(i.x=e.x+1,i.y=e.y,i.z=e.z+1,s=h.UNIT_Y):(i.x=e.x+1,i.y=e.y+1,i.z=e.z,s=h.UNIT_Z);let a=(h.dot(t,i)+n)/-h.dot(t,s);return h.normalize(h.subtract(h.add(i,h.multiplyByScalar(s,a,r),i),e,i),i)};var C2e=new h;tc._rotationVector=function(e,t,n,i,o){let r=h.subtract(i,e,C2e);if(r=h.normalize(r,r),h.dot(t,r)<.9999999847691291){let s=h.cross(t,r,r);if(h.magnitude(s)>W.EPSILON13)return h.normalize(s,new h)}return o};var XH=new h,V2e=new h,c5=new h,zie=new h;tc._horizonToPlaneNormalDotProduct=function(e,t,n,i,o){let r=h.clone(o,XH),s=h.clone(e.center,V2e),a=e.radius,c=h.subtract(s,r,c5),d=h.magnitudeSquared(c),u=a*a;if(dOpenStreetMap contributors',!1)}Object.defineProperties(IH.prototype,{url:{get:function(){return this._url}},params:{get:function(){return this._params}},credit:{get:function(){return this._credit}}});IH.prototype.geocode=async function(e){return this._url.getDerivedResource({url:"json",queryParameters:xt(this._params,{q:e})}).fetchJson().then(function(n){return n.results.map(function(i){let o,r=i.bounds;if(l(r))o=ce.fromDegrees(r.southwest.lng,r.southwest.lat,r.northeast.lng,r.northeast.lat);else{let s=i.geometry.lat,a=i.geometry.lng;o=h.fromDegrees(s,a)}return{displayName:i.formatted,destination:o}})})};var WH=IH;var IOt=T(S(),1);var L2e={packedLength:void 0,pack:fe.throwInstantiationError,unpack:fe.throwInstantiationError},PH=L2e;var vOt=T(S(),1);var R2e={packedInterpolationLength:void 0,convertPackedArrayForInterpolation:fe.throwInstantiationError,unpackInterpolationResult:fe.throwInstantiationError},vH=R2e;var HOt=T(S(),1);var NOt=T(S(),1);function Z2e(e,t,n,i,o){let r=e.measureText(t);if(!!/\S/.test(t)){let a=document.defaultView.getComputedStyle(e.canvas).getPropertyValue("font-size").replace("px",""),c=document.createElement("canvas"),d=100,u=r.width+d|0,m=3*a,p=m/2;c.width=u,c.height=m;let g=c.getContext("2d");g.font=n,g.fillStyle="white",g.fillRect(0,0,c.width+1,c.height+1),i&&(g.strokeStyle="black",g.lineWidth=e.lineWidth,g.strokeText(t,d/2,p)),o&&(g.fillStyle="black",g.fillText(t,d/2,p));let f=g.getImageData(0,0,u,m).data,x=f.length,_=u*4,C,V,L,Z;for(C=0;C=0;--C)if(f[C]!==255){Z=C/_|0;break}let G=-1;for(C=0;Ct.height?r=i*(t.height/t.width):t.widthMath.PI&&(e-=W.TWO_PI),e}}});var CC=new he,W2e=new h;Gr.prototype.getLatitude=function(e){l(e)||(e=ie.WGS84),CC.latitude=this.conformalLatitude,CC.longitude=this.longitude,CC.height=0;let t=this.ellipsoid.cartographicToCartesian(CC,W2e);return e.cartesianToCartographic(t,CC),CC.latitude};var P2e=new pn,v2e=new h,w2e=new h;Gr.fromCartesian=function(e,t){let n=W.signNotZero(e.z),i=Gr.NORTH_POLE_TANGENT_PLANE,o=Gr.SOUTH_POLE;n<0&&(i=Gr.SOUTH_POLE_TANGENT_PLANE,o=Gr.NORTH_POLE);let r=P2e;r.origin=i.ellipsoid.scaleToGeocentricSurface(e,r.origin),r.direction=h.subtract(r.origin,o,v2e),h.normalize(r.direction,r.direction);let s=jn.rayPlane(r,i.plane,w2e),a=h.subtract(s,o,s),c=h.dot(i.xAxis,a),d=n*h.dot(i.yAxis,a);return l(t)?(t.position=new D(c,d),t.tangentPlane=i,t):new Gr(new D(c,d),i)};Gr.fromCartesianArray=function(e,t){let n=e.length;l(t)?t.length=n:t=new Array(n);for(let i=0;i=0?s:s+W.TWO_PI;o.westOverIdl=Math.min(o.westOverIdl,a),o.eastOverIdl=Math.max(o.eastOverIdl,a),r.west=Math.min(r.west,s),r.east=Math.max(r.east,s);let c=e.getLatitude(n),d=c;if(r.south=Math.min(r.south,c),r.north=Math.max(r.north,c),i!==qt.RHUMB){let p=D.subtract(t.position,e.position,$2e),g=D.dot(t.position,p)/D.dot(p,p);if(g>0&&g<1){let f=D.add(t.position,D.multiplyByScalar(p,-g,p),ePe),x=nc.clone(t,tPe);x.position=f;let _=x.getLatitude(n);r.south=Math.min(r.south,_),r.north=Math.max(r.north,_),Math.abs(c)>Math.abs(_)&&(d=_)}}let u=t.x*e.y-e.x*t.y,m=Math.sign(u);m!==0&&(m*=D.angleBetween(t.position,e.position)),d>=0&&(o.northAngle+=m),d<=0&&(o.southAngle+=m)}var noe=new nc,nPe=new nc,bu={northAngle:0,southAngle:0,westOverIdl:0,eastOverIdl:0};gu.computeRectangleFromPositions=function(e,t,n,i){if(l(i)||(i=new ce),e.length<3)return i;i.west=Number.POSITIVE_INFINITY,i.east=Number.NEGATIVE_INFINITY,i.south=Number.POSITIVE_INFINITY,i.north=Number.NEGATIVE_INFINITY,bu.northAngle=0,bu.southAngle=0,bu.westOverIdl=Number.POSITIVE_INFINITY,bu.eastOverIdl=Number.NEGATIVE_INFINITY;let o=e.length,r=nc.fromCartesian(e[0],nPe);for(let s=1;sbu.eastOverIdl-bu.westOverIdl&&(i.west=bu.westOverIdl,i.east=bu.eastOverIdl,i.east>W.PI&&(i.east=i.east-W.TWO_PI),i.west>W.PI&&(i.west=i.west-W.TWO_PI)),W.equalsEpsilon(Math.abs(bu.northAngle),W.TWO_PI,W.EPSILON10)&&(i.north=W.PI_OVER_TWO,i.east=W.PI,i.west=-W.PI),W.equalsEpsilon(Math.abs(bu.southAngle),W.TWO_PI,W.EPSILON10)&&(i.south=-W.PI_OVER_TWO,i.east=W.PI,i.west=-W.PI),i};var iPe=new nc;function oPe(e,t,n){return e.height>=W.PI||e.width>=W.PI?nc.fromCartesian(t[0],iPe).tangentPlane:Ur.fromPoints(t,n)}var ioe=new he;function rPe(e,t,n){return(i,o)=>{if(e.height>=W.PI||e.width>=W.PI){if(e.south<0&&e.north>0){l(o)||(o=[]);for(let s=0;s=W.PI||e.width>=W.PI)return(o,r)=>{if(e.south<0&&e.north>0){let s=n.cartesianToCartographic(o,ioe);return l(r)||(r=new D),r.x=s.longitude/W.PI,r.y=s.latitude/W.PI_OVER_TWO,r}return nc.fromCartesian(o,r)};let i=Ur.fromPoints(t,n);return(o,r)=>i.projectPointsOntoPlane(o,r)}function aPe(e,t,n,i){return(o,r)=>!i&&(e.height>=W.PI_OVER_TWO||e.width>=2*W.PI_OVER_THREE)?Nn.splitPolygonsOnEquator(o,t,n,r):o}function cPe(e,t,n,i){if(t.height>=W.PI||t.width>=W.PI)return He.fromRectangle(t,void 0,qie);let o=e,r=Ur.fromPoints(o,n);return Nn.computeBoundingRectangle(r.plane.normal,r.projectPointOntoPlane.bind(r),o,i,qie)}gu.createGeometry=function(e){let t=e._vertexFormat,n=e._ellipsoid,i=e._granularity,o=e._stRotation,r=e._polygonHierarchy,s=e._perPositionHeight,a=e._closeTop,c=e._closeBottom,d=e._arcType,u=e._textureCoordinates,m=l(u),p=r.positions;if(p.length<3)return;let g=e.rectangle,f=Nn.polygonsFromHierarchy(r,m,rPe(g,p,n),!s,n,aPe(g,n,d,s)),x=f.hierarchy,_=f.polygons,C=function(I){return I},V=m?Nn.polygonsFromHierarchy(u,!0,C,!1,n).polygons:void 0;if(x.length===0)return;let L=x[0].outerRing,Z=cPe(L,g,n,o),G=[],X=e._height,v=e._extrudedHeight,P=e._perPositionHeightExtrude||!W.equalsEpsilon(X,v,0,W.EPSILON2),F={perPositionHeight:s,vertexFormat:t,geometry:void 0,rotationAxis:oPe(g,L,n).plane.normal,projectTo2d:sPe(g,L,n),boundingRectangle:Z,ellipsoid:n,stRotation:o,textureCoordinates:void 0,bottom:!1,top:!0,wall:!1,extrude:!1,arcType:d},A;if(P)for(F.extrude=!0,F.top=a,F.bottom=c,F.shadowVolume=e._shadowVolume,F.offsetAttribute=e._offsetAttribute,A=0;A<_.length;A++){let I=J2e(n,_[A],m?V[A]:void 0,i,x[A],s,a,c,t,d),w;a&&c?(w=I.topAndBottom,F.geometry=Nn.scaleToGeodeticHeightExtruded(w.geometry,X,v,n,s)):a?(w=I.topAndBottom,w.geometry.attributes.position.values=ei.scaleToGeodeticHeight(w.geometry.attributes.position.values,X,n,!s),F.geometry=w.geometry):c&&(w=I.topAndBottom,w.geometry.attributes.position.values=ei.scaleToGeodeticHeight(w.geometry.attributes.position.values,v,n,!0),F.geometry=w.geometry),(a||c)&&(F.wall=!1,w.geometry=wH(F),G.push(w));let N=I.walls;F.wall=!0;for(let B=0;B0?new Array(o):void 0;for(i=0;i0){let w=0,N=m[0];i=i.filter(function(B,U){let O=!1;return o?O=U===N||U===0&&N===1:O=U+1===N,O?(w++,N=m[w],!1):!0})}let g=p.length;if(g<2||t<=0)return;if(r===qt.GEODESIC||r===qt.RHUMB){let w,N;r===qt.GEODESIC?(w=W.chordLength(s,a.maximumRadius),N=Li.numberOfPoints):(w=s,N=Li.numberOfPointsRhumbLine);let B=Li.extractHeights(p,a);if(l(i)){let U=1;for(c=0;ca?g=W.TWO_PI-c+a:g=a-c;let x=Math.ceil(g/t)+1,_=Math.ceil(f/t)+1,C=g/(x-1),V=f/(_-1),L=ce.northwest(e,r),Z=ce.center(e,LPe);(n!==0||i!==0)&&(Z.longitude1||G>1))for(let R=0;R0;u-=d)Se=u*3,J=RC(J,q,Se,p,_),q+=6,o.st&&(z=ZC(z,be,u*2,G),be+=4),n&&(Te+=3,H[Te++]=X[Se],H[Te++]=X[Se+1],H[Te++]=X[Se+2]),j&&(ee[ae++]=1,ae+=1);if(E){let Ae=ye;for(Se=Ae*3,u=0;u<2;u++)J=RC(J,q,Se,p,_),q+=6,o.st&&(z=ZC(z,be,Ae*2,G),be+=4),n&&(Te+=3,H[Te++]=X[Se],H[Te++]=X[Se+1],H[Te++]=X[Se+2]),j&&(ee[ae++]=1,ae+=1)}else for(u=d-1;u>=0;u--)Se=u*3,J=RC(J,q,Se,p,_),q+=6,o.st&&(z=ZC(z,be,u*2,G),be+=4),n&&(Te+=3,H[Te++]=X[Se],H[Te++]=X[Se+1],H[Te++]=X[Se+2]),j&&(ee[ae++]=1,ae+=1);let Le=XPe(J,o,a);o.st&&(Le.attributes.st=new Ge({componentDatatype:Q.FLOAT,componentsPerAttribute:2,values:z})),n&&(Le.attributes.extrudeDirection=new Ge({componentDatatype:Q.FLOAT,componentsPerAttribute:3,values:H})),P&&(Le.attributes.applyOffset=new Ge({componentDatatype:Q.UNSIGNED_BYTE,componentsPerAttribute:1,values:ee}));let Xe=Me.createTypedArray(k,B*6),Pe,ke,Pt,Ot;g=J.length/3;let ht=0;for(u=0;u=0;f--)fs.computePosition(t,n,!1,g,f,x),m[p++]=x.x,m[p++]=x.y,m[p++]=x.z;for(f=0,g=i-2;g>0;g--)fs.computePosition(t,n,!1,g,f,x),m[p++]=x.x,m[p++]=x.y,m[p++]=x.z;let _=m.length/3*2,C=Me.createTypedArray(m.length/3,_),V=0;for(let Z=0;Z>>0,OH=2*Fx+1,$b=4,Moe=[],Noe=[],JPe=[[0,1,3,2],[0,2,3,1],[3,2,0,1],[3,1,0,2]],eg=1,XC=2,g5=[eg,0,0,eg|XC];function Yr(e){if(!Yt.supportsBigInt())throw new ue("S2 required BigInt support");this._cellId=e,this._level=Yr.getLevel(e)}Yr.fromToken=function(e){return new Yr(Yr.getIdFromToken(e))};Yr.isValidId=function(e){return!(e<=0||e>>BigInt(OH)>5||!(e&~e+BigInt(1)&BigInt("0x1555555555555555")))};Yr.isValidToken=function(e){return/^[0-9a-fA-F]{1,16}$/.test(e)?Yr.isValidId(Yr.getIdFromToken(e)):!1};Yr.getIdFromToken=function(e){return BigInt("0x"+e+"0".repeat(16-e.length))};Yr.getTokenFromId=function(e){let t=Math.floor(rve(e)/4),n=e.toString(16).replace(/0*$/,"");return Array(17-t-n.length).join("0")+n};Yr.getLevel=function(e){let t=0;for(;e!==BigInt(0)&&!(e&BigInt(1));)t++,e=e>>BigInt(1);return Fx-(t>>1)};Yr.prototype.getChild=function(e){let t=Doe(this._cellId)>>BigInt(2),n=this._cellId+BigInt(2*e+1-4)*t;return new Yr(n)};Yr.prototype.getParent=function(){let e=Doe(this._cellId)<>1&1;return Uoe(i[0],o[0][r^n&1],o[1][r])}function qPe(e,t){let n=koe(e),i=n[0],o=n[1],r=n[2],s=t===30,a=!s&&(BigInt(o)^e>>BigInt(2))&BigInt(1),c=s?1:a?2:0,d=(o<<1)+c,u=(r<<1)+c;return[i,d,u]}function koe(e){Moe.length===0&&nve();let t=Number(e>>BigInt(OH)),n=t&eg,i=(1<<$b)-1,o=0,r=0;for(let s=7;s>=0;s--){let c=(1<<2*(s===7?Fx-7*$b:$b))-1;n+=Number(e>>BigInt(s*2*$b+1)&BigInt(c))<<2,n=Noe[n];let d=s*$b;o+=n>>$b+2<>2&i)<=.5?1/3*(4*e*e-1):1/3*(1-4*(1-e)*(1-e))}function Foe(e){return 1/KPe*e}function eve(e,t){let n=[[],[]],i=tve(t);for(let o=0;o<2;++o){let r=e[o]&-i,s=r+i;n[o][0]=y5(Aoe(r)),n[o][1]=y5(Aoe(s))}return n}function tve(e){return 1<>>0}function Aoe(e){return 1/zPe*e}function tg(e,t,n,i,o,r){if(e===$b){let s=(t<<$b)+n;Moe[(s<<2)+i]=(o<<2)+r,Noe[(o<<2)+i]=(s<<2)+r}else{e++,t<<=1,n<<=1,o<<=2;let s=JPe[r];tg(e,t+(s[0]>>1),n+(s[0]&1),i,o,r^g5[0]),tg(e,t+(s[1]>>1),n+(s[1]&1),i,o+1,r^g5[1]),tg(e,t+(s[2]>>1),n+(s[2]&1),i,o+2,r^g5[2]),tg(e,t+(s[3]>>1),n+(s[3]&1),i,o+3,r^g5[3])}}function nve(){tg(0,0,0,0,0,0),tg(0,0,0,eg,0,eg),tg(0,0,0,XC,0,XC),tg(0,0,0,eg|XC,0,eg|XC)}function Doe(e){return e&~e+BigInt(1)}function ive(e){return BigInt(1)<Gm.mouseEmulationIgnoreMilliseconds}function QH(e,t,n){let i=e.x-t.x,o=e.y-t.y;return Math.sqrt(i*i+o*o)0?n=t.detail*-120:n=t.wheelDelta;if(!l(n))return;let i=Ax(t),o=e.getInputAction(yn.WHEEL,i);l(o)&&(o(n),t.preventDefault())}function uve(e,t){qH(e);let n=t.changedTouches,i,o=n.length,r,s,a=e._positions;for(i=0;iSve;++r){o=i;let s=o-t*Math.sin(o)-e,a=1-t*Math.cos(o);i=o-s/a}return o=i+n*W.TWO_PI,o}function Vve(e,t){let n=Math.floor(e/W.TWO_PI);e-=n*W.TWO_PI;let i=Math.cos(e)-t,o=Math.sin(e)*Math.sqrt(1-t*t),r=Math.atan2(o,i);return r=W.zeroToTwoPi(r),e<0&&(r-=W.TWO_PI),r+=n*W.TWO_PI,r}function Lve(e,t,n,i){let o=Math.cos(e),r=Math.sin(e),s=Math.cos(t),a=Math.sin(t),c=Math.cos(n),d=Math.sin(n);return l(i)?(i[0]=c*o-d*r*s,i[1]=d*o+c*r*s,i[2]=r*a,i[3]=-c*r-d*o*s,i[4]=-d*r+c*o*s,i[5]=o*a,i[6]=d*a,i[7]=-c*a,i[8]=s):i=new $(c*o-d*r*s,-c*r-d*o*s,d*a,d*o+c*r*s,-d*r+c*o*s,-c*a,r*a,o*a,s),i}var Rve=1.0000010178*La,Zve=100.46645683*xu,Gve=129597742283429e-5*pd,ore=16002,rre=21863,sre=32004,are=10931,cre=14529,lre=16368,dre=15318,ure=32794,Eve=64*1e-7*La,Xve=-152*1e-7*La,Ive=62*1e-7*La,Wve=-8*1e-7*La,Pve=32*1e-7*La,vve=-41*1e-7*La,wve=19*1e-7*La,Fve=-11*1e-7*La,Ave=-150*1e-7*La,Mve=-46*1e-7*La,Nve=68*1e-7*La,kve=54*1e-7*La,Uve=14*1e-7*La,Dve=24*1e-7*La,Bve=-28*1e-7*La,Yve=22*1e-7*La,mre=10,hre=16002,fre=21863,pre=10931,bre=1473,gre=32004,yre=4387,xre=73,Ove=-325*1e-7,Hve=-322*1e-7,zve=-79*1e-7,Kve=232*1e-7,Jve=-52*1e-7,Qve=97*1e-7,jve=55*1e-7,qve=-41*1e-7,$ve=-105*1e-7,ewe=-137*1e-7,twe=258*1e-7,nwe=35*1e-7,iwe=-116*1e-7,owe=-88*1e-7,rwe=-112*1e-7,swe=-80*1e-7,IC=new te(0,0,Hn.TAI);function awe(e,t){Tre(e,IC);let i=(IC.dayNumber-T5.dayNumber+(IC.secondsOfDay-T5.secondsOfDay)/zn.SECONDS_PER_DAY)/(zn.DAYS_PER_JULIAN_CENTURY*10),o=.3595362*i,r=Rve+Eve*Math.cos(ore*o)+Ave*Math.sin(ore*o)+Xve*Math.cos(rre*o)+Mve*Math.sin(rre*o)+Ive*Math.cos(sre*o)+Nve*Math.sin(sre*o)+Wve*Math.cos(are*o)+kve*Math.sin(are*o)+Pve*Math.cos(cre*o)+Uve*Math.sin(cre*o)+vve*Math.cos(lre*o)+Dve*Math.sin(lre*o)+wve*Math.cos(dre*o)+Bve*Math.sin(dre*o)+Fve*Math.cos(ure*o)+Yve*Math.sin(ure*o),s=Zve+Gve*i+Ove*Math.cos(mre*o)+$ve*Math.sin(mre*o)+Hve*Math.cos(hre*o)+ewe*Math.sin(hre*o)+zve*Math.cos(fre*o)+twe*Math.sin(fre*o)+Kve*Math.cos(pre*o)+nwe*Math.sin(pre*o)+Jve*Math.cos(bre*o)+iwe*Math.sin(bre*o)+Qve*Math.cos(gre*o)+owe*Math.sin(gre*o)+jve*Math.cos(yre*o)+rwe*Math.sin(yre*o)+qve*Math.cos(xre*o)+swe*Math.sin(xre*o),a=.0167086342-.0004203654*i,c=102.93734808*xu+11612.3529*pd*i,d=469.97289*pd*i,u=174.87317577*xu-8679.27034*pd*i;return Sre(r,a,d,c,u,s,t)}function Cre(e,t){Tre(e,IC);let i=(IC.dayNumber-T5.dayNumber+(IC.secondsOfDay-T5.secondsOfDay)/zn.SECONDS_PER_DAY)/zn.DAYS_PER_JULIAN_CENTURY,o=i*i,r=o*i,s=r*i,a=383397.7725+.004*i,c=.055545526-16e-9*i,d=5.15668983*xu,u=-8e-5*i+.02966*o-42e-6*r-13e-8*s,m=83.35324312*xu,p=146434202669e-4*i-38.2702*o-.045047*r+21301e-8*s,g=125.04455501*xu,f=-69679193631e-4*i+6.3602*o+.007625*r-3586e-8*s,x=218.31664563*xu,_=17325593434847e-4*i-6.391*o+.006588*r-3169e-8*s,C=297.85019547*xu+pd*(1602961601209e-3*i-6.3706*o+.006593*r-3169e-8*s),V=93.27209062*xu+pd*(17395272628478e-4*i-12.7512*o-.001037*r+417e-8*s),L=134.96340251*xu+pd*(17179159232178e-4*i+31.8792*o+.051635*r-2447e-7*s),Z=357.52910918*xu+pd*(1295965810481e-4*i-.5532*o+136e-6*r-1149e-8*s),G=310.17137918*xu-pd*(6967051436e-3*i+6.2068*o+.007618*r-3219e-8*s),X=2*C,v=4*C,P=6*C,F=2*L,A=3*L,b=4*L,R=2*V;a+=3400.4*Math.cos(X)-635.6*Math.cos(X-L)-235.6*Math.cos(L)+218.1*Math.cos(X-Z)+181*Math.cos(X+L),c+=.014216*Math.cos(X-L)+.008551*Math.cos(X-F)-.001383*Math.cos(L)+.001356*Math.cos(X+L)-.001147*Math.cos(v-A)-914e-6*Math.cos(v-F)+869e-6*Math.cos(X-Z-L)-627e-6*Math.cos(X)-394e-6*Math.cos(v-b)+282e-6*Math.cos(X-Z-F)-279e-6*Math.cos(C-L)-236e-6*Math.cos(F)+231e-6*Math.cos(v)+229e-6*Math.cos(P-b)-201e-6*Math.cos(F-R),u+=486.26*Math.cos(X-R)-40.13*Math.cos(X)+37.51*Math.cos(R)+25.73*Math.cos(F-R)+19.97*Math.cos(X-Z-R),p+=-55609*Math.sin(X-L)-34711*Math.sin(X-F)-9792*Math.sin(L)+9385*Math.sin(v-A)+7505*Math.sin(v-F)+5318*Math.sin(X+L)+3484*Math.sin(v-b)-3417*Math.sin(X-Z-L)-2530*Math.sin(P-b)-2376*Math.sin(X)-2075*Math.sin(X-A)-1883*Math.sin(F)-1736*Math.sin(P-5*L)+1626*Math.sin(Z)-1370*Math.sin(P-A),f+=-5392*Math.sin(X-R)-540*Math.sin(Z)-441*Math.sin(X)+423*Math.sin(R)-288*Math.sin(F-R),_+=-3332.9*Math.sin(X)+1197.4*Math.sin(X-L)-662.5*Math.sin(Z)+396.3*Math.sin(L)-218*Math.sin(X-Z);let E=2*G,I=3*G;u+=46.997*Math.cos(G)*i-.614*Math.cos(X-R+G)*i+.614*Math.cos(X-R-G)*i-.0297*Math.cos(E)*o-.0335*Math.cos(G)*o+.0012*Math.cos(X-R+E)*o-16e-5*Math.cos(G)*r+4e-5*Math.cos(I)*r+4e-5*Math.cos(E)*r;let w=2.116*Math.sin(G)*i-.111*Math.sin(X-R-G)*i-.0015*Math.sin(G)*o;p+=w,_+=w,f+=-520.77*Math.sin(G)*i+13.66*Math.sin(X-R+G)*i+1.12*Math.sin(X-G)*i-1.06*Math.sin(R-G)*i+.66*Math.sin(E)*o+.371*Math.sin(G)*o-.035*Math.sin(X-R+E)*o-.015*Math.sin(X-R+G)*o+.0014*Math.sin(G)*r-.0011*Math.sin(I)*r-9e-4*Math.sin(E)*r,a*=yve;let N=d+u*pd,B=m+p*pd,U=x+_*pd,O=g+f*pd;return Sre(a,c,N,B,O,U,t)}var _re=.012300034,cwe=_re/(_re+1)*-1;function lwe(e,t){return t=Cre(e,t),h.multiplyByScalar(t,cwe,t)}var Vre=new $(1.0000000000000002,5619723173785822e-31,4690511510146299e-34,-5154129427414611e-31,.9174820620691819,-.39777715593191376,-223970096136568e-30,.39777715593191376,.9174820620691819),rZ=new h;ez.computeSunPositionInEarthInertialFrame=function(e,t){return l(e)||(e=te.now()),l(t)||(t=new h),rZ=awe(e,rZ),t=h.negate(rZ,t),lwe(e,rZ),h.subtract(t,rZ,t),$.multiplyByVector(Vre,t,t),t};ez.computeMoonPositionInEarthInertialFrame=function(e,t){return l(e)||(e=te.now()),t=Cre(e,t),$.multiplyByVector(Vre,t,t),t};var ig=ez;var jQt=T(S(),1);function dwe(e,t,n,i,o,r,s){let a=Li.numberOfPoints(e,t,o),c,d=n.red,u=n.green,m=n.blue,p=n.alpha,g=i.red,f=i.green,x=i.blue,_=i.alpha;if(Y.equals(n,i)){for(c=0;c0?new Array(o):void 0;for(i=0;i0&&(h.pack(X,m,Z),Z+=3,f=n[d-1],g[G++]=Y.floatToByte(f.red),g[G++]=Y.floatToByte(f.green),g[G++]=Y.floatToByte(f.blue),g[G++]=Y.floatToByte(f.alpha)),c&&d===u-1)break;h.pack(X,m,Z),Z+=3,l(n)&&(f=n[d],g[G++]=Y.floatToByte(f.red),g[G++]=Y.floatToByte(f.green),g[G++]=Y.floatToByte(f.blue),g[G++]=Y.floatToByte(f.alpha))}}let _=new mn;_.position=new Ge({componentDatatype:Q.DOUBLE,componentsPerAttribute:3,values:m}),l(n)&&(_.color=new Ge({componentDatatype:Q.UNSIGNED_BYTE,componentsPerAttribute:4,values:g,normalize:!0})),p=m.length/3;let C=(p-1)*2,V=Me.createTypedArray(p,C),L=0;for(d=0;d0&&(this._intervals.length=0,this._changedEvent.raiseEvent(this))};Er.prototype.findIntervalContainingDate=function(e){let t=this.indexOf(e);return t>=0?this._intervals[t]:void 0};Er.prototype.findDataForIntervalContainingDate=function(e){let t=this.indexOf(e);return t>=0?this._intervals[t].data:void 0};Er.prototype.contains=function(e){return this.indexOf(e)>=0};var oz=new Sn;Er.prototype.indexOf=function(e){let t=this._intervals;oz.start=e,oz.stop=e;let n=Ro(t,oz,sz);return n>=0?t[n].isStartIncluded?n:n>0&&t[n-1].stop.equals(e)&&t[n-1].isStopIncluded?n-1:~n:(n=~n,n>0&&n-10&&e.isStartIncluded&&n[i-1].isStartIncluded&&n[i-1].start.equals(e.start)?--i:i0&&(o=te.compare(n[i-1].stop,e.start),(o>0||o===0&&(n[i-1].isStopIncluded||e.isStartIncluded))&&((l(t)?t(n[i-1].data,e.data):n[i-1].data===e.data)?(te.greaterThan(e.stop,n[i-1].stop)?e=new Sn({start:n[i-1].start,stop:e.stop,isStartIncluded:n[i-1].isStartIncluded,isStopIncluded:e.isStopIncluded,data:e.data}):e=new Sn({start:n[i-1].start,stop:n[i-1].stop,isStartIncluded:n[i-1].isStartIncluded,isStopIncluded:n[i-1].isStopIncluded||e.stop.equals(n[i-1].stop)&&e.isStopIncluded,data:e.data}),n.splice(i-1,1),--i):(o=te.compare(n[i-1].stop,e.stop),(o>0||o===0&&n[i-1].isStopIncluded&&!e.isStopIncluded)&&n.splice(i,0,new Sn({start:e.stop,stop:n[i-1].stop,isStartIncluded:!e.isStopIncluded,isStopIncluded:n[i-1].isStopIncluded,data:n[i-1].data})),n[i-1]=new Sn({start:n[i-1].start,stop:e.start,isStartIncluded:n[i-1].isStartIncluded,isStopIncluded:!e.isStartIncluded,data:n[i-1].data}))));i0||o===0&&(e.isStopIncluded||n[i].isStartIncluded));)if(l(t)?t(n[i].data,e.data):n[i].data===e.data)e=new Sn({start:e.start,stop:te.greaterThan(n[i].stop,e.stop)?n[i].stop:e.stop,isStartIncluded:e.isStartIncluded,isStopIncluded:te.greaterThan(n[i].stop,e.stop)?n[i].isStopIncluded:e.isStopIncluded,data:e.data}),n.splice(i,1);else if(n[i]=new Sn({start:e.stop,stop:n[i].stop,isStartIncluded:!e.isStopIncluded,isStopIncluded:n[i].isStopIncluded,data:n[i].data}),n[i].isEmpty)n.splice(i,1);else break;n.splice(i,0,e),this._changedEvent.raiseEvent(this)};Er.prototype.removeInterval=function(e){if(e.isEmpty)return!1;let t=this._intervals,n=Ro(t,e,sz);n<0&&(n=~n);let i=!1;for(n>0&&(te.greaterThan(t[n-1].stop,e.start)||t[n-1].stop.equals(e.start)&&t[n-1].isStopIncluded&&e.isStartIncluded)&&(i=!0,(te.greaterThan(t[n-1].stop,e.stop)||t[n-1].isStopIncluded&&!e.isStopIncluded&&t[n-1].stop.equals(e.stop))&&t.splice(n,0,new Sn({start:e.stop,stop:t[n-1].stop,isStartIncluded:!e.isStopIncluded,isStopIncluded:t[n-1].isStopIncluded,data:t[n-1].data})),t[n-1]=new Sn({start:t[n-1].start,stop:e.start,isStartIncluded:t[n-1].isStartIncluded,isStopIncluded:!e.isStartIncluded,data:t[n-1].data})),n=1e3&&(o+=Math.floor(i/1e3),i=i%1e3),o>=60&&(r+=Math.floor(o/60),o=o%60),r>=60&&(s+=Math.floor(r/60),r=r%60),s>=24&&(a+=Math.floor(s/24),s=s%24),lZ[2]=um(d)?29:28;a>lZ[c]||c>=13;)a>lZ[c]&&(a-=lZ[c],++c),c>=13&&(--c,d+=Math.floor(c/12),c=c%12,++c),lZ[2]=um(d)?29:28;return oc.millisecond=i,oc.second=o,oc.minute=r,oc.hour=s,oc.day=a,oc.month=c,oc.year=d,te.fromGregorianDate(oc,n)}var pwe=new te,bwe=/P(?:([\d.,]+)Y)?(?:([\d.,]+)M)?(?:([\d.,]+)W)?(?:([\d.,]+)D)?(?:T(?:([\d.,]+)H)?(?:([\d.,]+)M)?(?:([\d.,]+)S)?)?/;function Lre(e,t){if(!l(e)||e.length===0)return!1;if(t.year=0,t.month=0,t.day=0,t.hour=0,t.minute=0,t.second=0,t.millisecond=0,e[0]==="P"){let n=e.match(bwe);if(!l(n))return!1;if(l(n[1])&&(t.year=Number(n[1].replace(",","."))),l(n[2])&&(t.month=Number(n[2].replace(",","."))),l(n[3])&&(t.day=Number(n[3].replace(",","."))*7),l(n[4])&&(t.day+=Number(n[4].replace(",","."))),l(n[5])&&(t.hour=Number(n[5].replace(",","."))),l(n[6])&&(t.minute=Number(n[6].replace(",","."))),l(n[7])){let i=Number(n[7].replace(",","."));t.second=Math.floor(i),t.millisecond=i%1*1e3}}else e[e.length-1]!=="Z"&&(e+="Z"),te.toGregorianDate(te.fromIso8601(e,pwe),t);return t.year||t.month||t.day||t.hour||t.minute||t.second||t.millisecond}var dZ=new op;Er.fromIso8601=function(e,t){let n=e.iso8601.split("/"),i=te.fromIso8601(n[0]),o=te.fromIso8601(n[1]),r=[];if(!Lre(n[2],dZ))r.push(i,o);else{let s=te.clone(i);for(r.push(s);te.compare(s,o)<0;)s=rz(s,dZ),te.compare(o,s)<=0&&te.clone(o,s),r.push(s)}return Er.fromJulianDateArray({julianDates:r,isStartIncluded:e.isStartIncluded,isStopIncluded:e.isStopIncluded,leadingInterval:e.leadingInterval,trailingInterval:e.trailingInterval,dataCallback:e.dataCallback},t)};Er.fromIso8601DateArray=function(e,t){return Er.fromJulianDateArray({julianDates:e.iso8601Dates.map(function(n){return te.fromIso8601(n)}),isStartIncluded:e.isStartIncluded,isStopIncluded:e.isStopIncluded,leadingInterval:e.leadingInterval,trailingInterval:e.trailingInterval,dataCallback:e.dataCallback},t)};Er.fromIso8601DurationArray=function(e,t){let n=e.epoch,i=e.iso8601Durations,o=y(e.relativeToPrevious,!1),r=[],s,a,c=i.length;for(let d=0;da?c=a:s<0?c=0:c=s;let u=i?y(this.tolerance,1):.001;Math.abs(c-d)>u&&(this._seeking=!0,t.currentTime=c)};function Lwe(e){return function(){e._seeking=!1,e._firstTickAfterSeek=!0}}var cz=Nx;var mjt=T(S(),1),Rwe={VK_FORMAT_UNDEFINED:0,VK_FORMAT_R4G4_UNORM_PACK8:1,VK_FORMAT_R4G4B4A4_UNORM_PACK16:2,VK_FORMAT_B4G4R4A4_UNORM_PACK16:3,VK_FORMAT_R5G6B5_UNORM_PACK16:4,VK_FORMAT_B5G6R5_UNORM_PACK16:5,VK_FORMAT_R5G5B5A1_UNORM_PACK16:6,VK_FORMAT_B5G5R5A1_UNORM_PACK16:7,VK_FORMAT_A1R5G5B5_UNORM_PACK16:8,VK_FORMAT_R8_UNORM:9,VK_FORMAT_R8_SNORM:10,VK_FORMAT_R8_USCALED:11,VK_FORMAT_R8_SSCALED:12,VK_FORMAT_R8_UINT:13,VK_FORMAT_R8_SINT:14,VK_FORMAT_R8_SRGB:15,VK_FORMAT_R8G8_UNORM:16,VK_FORMAT_R8G8_SNORM:17,VK_FORMAT_R8G8_USCALED:18,VK_FORMAT_R8G8_SSCALED:19,VK_FORMAT_R8G8_UINT:20,VK_FORMAT_R8G8_SINT:21,VK_FORMAT_R8G8_SRGB:22,VK_FORMAT_R8G8B8_UNORM:23,VK_FORMAT_R8G8B8_SNORM:24,VK_FORMAT_R8G8B8_USCALED:25,VK_FORMAT_R8G8B8_SSCALED:26,VK_FORMAT_R8G8B8_UINT:27,VK_FORMAT_R8G8B8_SINT:28,VK_FORMAT_R8G8B8_SRGB:29,VK_FORMAT_B8G8R8_UNORM:30,VK_FORMAT_B8G8R8_SNORM:31,VK_FORMAT_B8G8R8_USCALED:32,VK_FORMAT_B8G8R8_SSCALED:33,VK_FORMAT_B8G8R8_UINT:34,VK_FORMAT_B8G8R8_SINT:35,VK_FORMAT_B8G8R8_SRGB:36,VK_FORMAT_R8G8B8A8_UNORM:37,VK_FORMAT_R8G8B8A8_SNORM:38,VK_FORMAT_R8G8B8A8_USCALED:39,VK_FORMAT_R8G8B8A8_SSCALED:40,VK_FORMAT_R8G8B8A8_UINT:41,VK_FORMAT_R8G8B8A8_SINT:42,VK_FORMAT_R8G8B8A8_SRGB:43,VK_FORMAT_B8G8R8A8_UNORM:44,VK_FORMAT_B8G8R8A8_SNORM:45,VK_FORMAT_B8G8R8A8_USCALED:46,VK_FORMAT_B8G8R8A8_SSCALED:47,VK_FORMAT_B8G8R8A8_UINT:48,VK_FORMAT_B8G8R8A8_SINT:49,VK_FORMAT_B8G8R8A8_SRGB:50,VK_FORMAT_A8B8G8R8_UNORM_PACK32:51,VK_FORMAT_A8B8G8R8_SNORM_PACK32:52,VK_FORMAT_A8B8G8R8_USCALED_PACK32:53,VK_FORMAT_A8B8G8R8_SSCALED_PACK32:54,VK_FORMAT_A8B8G8R8_UINT_PACK32:55,VK_FORMAT_A8B8G8R8_SINT_PACK32:56,VK_FORMAT_A8B8G8R8_SRGB_PACK32:57,VK_FORMAT_A2R10G10B10_UNORM_PACK32:58,VK_FORMAT_A2R10G10B10_SNORM_PACK32:59,VK_FORMAT_A2R10G10B10_USCALED_PACK32:60,VK_FORMAT_A2R10G10B10_SSCALED_PACK32:61,VK_FORMAT_A2R10G10B10_UINT_PACK32:62,VK_FORMAT_A2R10G10B10_SINT_PACK32:63,VK_FORMAT_A2B10G10R10_UNORM_PACK32:64,VK_FORMAT_A2B10G10R10_SNORM_PACK32:65,VK_FORMAT_A2B10G10R10_USCALED_PACK32:66,VK_FORMAT_A2B10G10R10_SSCALED_PACK32:67,VK_FORMAT_A2B10G10R10_UINT_PACK32:68,VK_FORMAT_A2B10G10R10_SINT_PACK32:69,VK_FORMAT_R16_UNORM:70,VK_FORMAT_R16_SNORM:71,VK_FORMAT_R16_USCALED:72,VK_FORMAT_R16_SSCALED:73,VK_FORMAT_R16_UINT:74,VK_FORMAT_R16_SINT:75,VK_FORMAT_R16_SFLOAT:76,VK_FORMAT_R16G16_UNORM:77,VK_FORMAT_R16G16_SNORM:78,VK_FORMAT_R16G16_USCALED:79,VK_FORMAT_R16G16_SSCALED:80,VK_FORMAT_R16G16_UINT:81,VK_FORMAT_R16G16_SINT:82,VK_FORMAT_R16G16_SFLOAT:83,VK_FORMAT_R16G16B16_UNORM:84,VK_FORMAT_R16G16B16_SNORM:85,VK_FORMAT_R16G16B16_USCALED:86,VK_FORMAT_R16G16B16_SSCALED:87,VK_FORMAT_R16G16B16_UINT:88,VK_FORMAT_R16G16B16_SINT:89,VK_FORMAT_R16G16B16_SFLOAT:90,VK_FORMAT_R16G16B16A16_UNORM:91,VK_FORMAT_R16G16B16A16_SNORM:92,VK_FORMAT_R16G16B16A16_USCALED:93,VK_FORMAT_R16G16B16A16_SSCALED:94,VK_FORMAT_R16G16B16A16_UINT:95,VK_FORMAT_R16G16B16A16_SINT:96,VK_FORMAT_R16G16B16A16_SFLOAT:97,VK_FORMAT_R32_UINT:98,VK_FORMAT_R32_SINT:99,VK_FORMAT_R32_SFLOAT:100,VK_FORMAT_R32G32_UINT:101,VK_FORMAT_R32G32_SINT:102,VK_FORMAT_R32G32_SFLOAT:103,VK_FORMAT_R32G32B32_UINT:104,VK_FORMAT_R32G32B32_SINT:105,VK_FORMAT_R32G32B32_SFLOAT:106,VK_FORMAT_R32G32B32A32_UINT:107,VK_FORMAT_R32G32B32A32_SINT:108,VK_FORMAT_R32G32B32A32_SFLOAT:109,VK_FORMAT_R64_UINT:110,VK_FORMAT_R64_SINT:111,VK_FORMAT_R64_SFLOAT:112,VK_FORMAT_R64G64_UINT:113,VK_FORMAT_R64G64_SINT:114,VK_FORMAT_R64G64_SFLOAT:115,VK_FORMAT_R64G64B64_UINT:116,VK_FORMAT_R64G64B64_SINT:117,VK_FORMAT_R64G64B64_SFLOAT:118,VK_FORMAT_R64G64B64A64_UINT:119,VK_FORMAT_R64G64B64A64_SINT:120,VK_FORMAT_R64G64B64A64_SFLOAT:121,VK_FORMAT_B10G11R11_UFLOAT_PACK32:122,VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:123,VK_FORMAT_D16_UNORM:124,VK_FORMAT_X8_D24_UNORM_PACK32:125,VK_FORMAT_D32_SFLOAT:126,VK_FORMAT_S8_UINT:127,VK_FORMAT_D16_UNORM_S8_UINT:128,VK_FORMAT_D24_UNORM_S8_UINT:129,VK_FORMAT_D32_SFLOAT_S8_UINT:130,VK_FORMAT_BC1_RGB_UNORM_BLOCK:131,VK_FORMAT_BC1_RGB_SRGB_BLOCK:132,VK_FORMAT_BC1_RGBA_UNORM_BLOCK:133,VK_FORMAT_BC1_RGBA_SRGB_BLOCK:134,VK_FORMAT_BC2_UNORM_BLOCK:135,VK_FORMAT_BC2_SRGB_BLOCK:136,VK_FORMAT_BC3_UNORM_BLOCK:137,VK_FORMAT_BC3_SRGB_BLOCK:138,VK_FORMAT_BC4_UNORM_BLOCK:139,VK_FORMAT_BC4_SNORM_BLOCK:140,VK_FORMAT_BC5_UNORM_BLOCK:141,VK_FORMAT_BC5_SNORM_BLOCK:142,VK_FORMAT_BC6H_UFLOAT_BLOCK:143,VK_FORMAT_BC6H_SFLOAT_BLOCK:144,VK_FORMAT_BC7_UNORM_BLOCK:145,VK_FORMAT_BC7_SRGB_BLOCK:146,VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:147,VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:148,VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:149,VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:150,VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:151,VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:152,VK_FORMAT_EAC_R11_UNORM_BLOCK:153,VK_FORMAT_EAC_R11_SNORM_BLOCK:154,VK_FORMAT_EAC_R11G11_UNORM_BLOCK:155,VK_FORMAT_EAC_R11G11_SNORM_BLOCK:156,VK_FORMAT_ASTC_4x4_UNORM_BLOCK:157,VK_FORMAT_ASTC_4x4_SRGB_BLOCK:158,VK_FORMAT_ASTC_5x4_UNORM_BLOCK:159,VK_FORMAT_ASTC_5x4_SRGB_BLOCK:160,VK_FORMAT_ASTC_5x5_UNORM_BLOCK:161,VK_FORMAT_ASTC_5x5_SRGB_BLOCK:162,VK_FORMAT_ASTC_6x5_UNORM_BLOCK:163,VK_FORMAT_ASTC_6x5_SRGB_BLOCK:164,VK_FORMAT_ASTC_6x6_UNORM_BLOCK:165,VK_FORMAT_ASTC_6x6_SRGB_BLOCK:166,VK_FORMAT_ASTC_8x5_UNORM_BLOCK:167,VK_FORMAT_ASTC_8x5_SRGB_BLOCK:168,VK_FORMAT_ASTC_8x6_UNORM_BLOCK:169,VK_FORMAT_ASTC_8x6_SRGB_BLOCK:170,VK_FORMAT_ASTC_8x8_UNORM_BLOCK:171,VK_FORMAT_ASTC_8x8_SRGB_BLOCK:172,VK_FORMAT_ASTC_10x5_UNORM_BLOCK:173,VK_FORMAT_ASTC_10x5_SRGB_BLOCK:174,VK_FORMAT_ASTC_10x6_UNORM_BLOCK:175,VK_FORMAT_ASTC_10x6_SRGB_BLOCK:176,VK_FORMAT_ASTC_10x8_UNORM_BLOCK:177,VK_FORMAT_ASTC_10x8_SRGB_BLOCK:178,VK_FORMAT_ASTC_10x10_UNORM_BLOCK:179,VK_FORMAT_ASTC_10x10_SRGB_BLOCK:180,VK_FORMAT_ASTC_12x10_UNORM_BLOCK:181,VK_FORMAT_ASTC_12x10_SRGB_BLOCK:182,VK_FORMAT_ASTC_12x12_UNORM_BLOCK:183,VK_FORMAT_ASTC_12x12_SRGB_BLOCK:184,VK_FORMAT_G8B8G8R8_422_UNORM:1000156e3,VK_FORMAT_B8G8R8G8_422_UNORM:1000156001,VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:1000156002,VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:1000156003,VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM:1000156004,VK_FORMAT_G8_B8R8_2PLANE_422_UNORM:1000156005,VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM:1000156006,VK_FORMAT_R10X6_UNORM_PACK16:1000156007,VK_FORMAT_R10X6G10X6_UNORM_2PACK16:1000156008,VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16:1000156009,VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16:1000156010,VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16:1000156011,VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16:1000156012,VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:1000156013,VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16:1000156014,VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16:1000156015,VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16:1000156016,VK_FORMAT_R12X4_UNORM_PACK16:1000156017,VK_FORMAT_R12X4G12X4_UNORM_2PACK16:1000156018,VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16:1000156019,VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16:1000156020,VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16:1000156021,VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16:1000156022,VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16:1000156023,VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16:1000156024,VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16:1000156025,VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16:1000156026,VK_FORMAT_G16B16G16R16_422_UNORM:1000156027,VK_FORMAT_B16G16R16G16_422_UNORM:1000156028,VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM:1000156029,VK_FORMAT_G16_B16R16_2PLANE_420_UNORM:1000156030,VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM:1000156031,VK_FORMAT_G16_B16R16_2PLANE_422_UNORM:1000156032,VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM:1000156033,VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG:1000054e3,VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG:1000054001,VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG:1000054002,VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG:1000054003,VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG:1000054004,VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG:1000054005,VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG:1000054006,VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG:1000054007,VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT:1000066e3,VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT:1000066001,VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT:1000066002,VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT:1000066003,VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT:1000066004,VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT:1000066005,VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT:1000066006,VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT:1000066007,VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT:1000066008,VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT:1000066009,VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT:1000066010,VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT:1000066011,VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT:1000066012,VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT:1000066013,VK_FORMAT_G8B8G8R8_422_UNORM_KHR:1000156e3,VK_FORMAT_B8G8R8G8_422_UNORM_KHR:1000156001,VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR:1000156002,VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR:1000156003,VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR:1000156004,VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR:1000156005,VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR:1000156006,VK_FORMAT_R10X6_UNORM_PACK16_KHR:1000156007,VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR:1000156008,VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR:1000156009,VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR:1000156010,VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR:1000156011,VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR:1000156012,VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR:1000156013,VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR:1000156014,VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR:1000156015,VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR:1000156016,VK_FORMAT_R12X4_UNORM_PACK16_KHR:1000156017,VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR:1000156018,VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR:1000156019,VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR:1000156020,VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR:1000156021,VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR:1000156022,VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR:1000156023,VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR:1000156024,VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR:1000156025,VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR:1000156026,VK_FORMAT_G16B16G16R16_422_UNORM_KHR:1000156027,VK_FORMAT_B16G16R16G16_422_UNORM_KHR:1000156028,VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR:1000156029,VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR:1000156030,VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR:1000156031,VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR:1000156032,VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR:1000156033},lz=Object.freeze(Rwe);var Fjt=T(S(),1);var _jt=T(S(),1);var Ere={};function Zwe(e,t){return W.equalsEpsilon(e.latitude,t.latitude,W.EPSILON10)&&W.equalsEpsilon(e.longitude,t.longitude,W.EPSILON10)}var Gwe=new he,Ewe=new he;function Xwe(e,t,n,i){t=go(t,h.equalsEpsilon);let o=t.length;if(o<2)return;let r=l(i),s=l(n),a=new Array(o),c=new Array(o),d=new Array(o),u=t[0];a[0]=u;let m=e.cartesianToCartographic(u,Gwe);s&&(m.height=n[0]),c[0]=m.height,r?d[0]=i[0]:d[0]=0;let p=c[0],g=d[0],f=p===g,x=1;for(let _=1;_0)for(s=new Array(o),i=0;i0)for(a=new Array(o),i=0;i0)for(s=new Array(o),i=0;i0)for(a=new Array(o),i=0;i=d&&(m=(m+8)%24,u=m);s=a||t(g,f,n)<=0)?(e[p]=g,++u):m=o)return;let r=Math.floor((i+o)*.5);bz(e,t,n,i,r),bz(e,t,n,r+1,o),iFe(e,t,n,i,r,o)}function oFe(e,t,n){let i=e.length,o=Math.ceil(i*.5);fz.length=o,pz.length=o,bz(e,t,n,0,i-1),fz.length=0,pz.length=0}var wp=oFe;var K8t=T(S(),1);var rFe=new h;function sFe(e,t,n,i){let o=sx(e,t,n,i,rFe);return l(o)?o.x>0&&o.y>0&&o.z>0:!1}var gz=sFe;var j8t=T(S(),1);function aFe(e){let t=document.createElement("canvas");return t.width=W.nextPowerOfTwo(e.width),t.height=W.nextPowerOfTwo(e.height),t.getContext("2d").drawImage(e,0,0,e.width,e.height,0,0,t.width,t.height),t}var cg=aFe;var e7t=T(S(),1);async function cFe(e,t,n,i){return l(i)||(i=!1),uFe(e,t,n,i)}function lFe(e,t,n){let i=e[0],o=i.terrainProvider.requestTileGeometry(i.x,i.y,i.level);if(!o)return!1;let r;return n?r=o.then(kre(i)):r=o.then(kre(i)).catch(mFe(i)),e.shift(),t.push(r),!0}function dFe(e){return new Promise(function(t){setTimeout(t,e)})}function yz(e,t,n){return e.length?lFe(e,t,n)?yz(e,t,n):dFe(100).then(()=>yz(e,t,n)):Promise.resolve()}function uFe(e,t,n,i){let o=e.tilingScheme,r,s=[],a={};for(r=0;r0&&await Ure(e,a,n),t}var Ox=Ure;var a7t=T(S(),1);function hFe(e){return e<=.04045?e*.07739938080495357:Math.pow((e+.055)*.9478672985781991,2.4)}var Hx=hFe;var l7t=T(S(),1);function fFe(e,t){let n=[],i=e.length,o=0;for(;o-1;o--)r=t[o],l(r._billboard)&&l(r._position)&&s.set(r.id,new Dre(r));for(o=i.length-1;o>-1;o--)r=i[o],l(r._billboard)&&l(r._position)?s.contains(r.id)||s.set(r.id,new Dre(r)):(Tz(s.get(r.id),r,a),s.remove(r.id));for(o=n.length-1;o>-1;o--)r=n[o],Tz(s.get(r.id),r,a),s.remove(r.id)};function Tz(e,t,n){l(e)&&(e.billboard=void 0,n.removeBillboard(t))}var CZ=dg;var fyn=T(S(),1);var fen=T(S(),1);var s6t=T(S(),1),VZ=`in vec3 v_positionEC; in vec3 v_normalEC; in vec3 v_tangentEC; in vec3 v_bitangentEC; in vec2 v_st; void main() { vec3 positionToEyeEC = -v_positionEC; mat3 tangentToEyeMatrix = czm_tangentToEyeSpaceMatrix(v_normalEC, v_tangentEC, v_bitangentEC); vec3 normalEC = normalize(v_normalEC); #ifdef FACE_FORWARD normalEC = faceforward(normalEC, vec3(0.0, 0.0, 1.0), -normalEC); #endif czm_materialInput materialInput; materialInput.normalEC = normalEC; materialInput.tangentToEyeMatrix = tangentToEyeMatrix; materialInput.positionToEyeEC = positionToEyeEC; materialInput.st = v_st; czm_material material = czm_getMaterial(materialInput); #ifdef FLAT out_FragColor = vec4(material.diffuse + material.emission, material.alpha); #else out_FragColor = czm_phong(normalize(positionToEyeEC), material, czm_lightDirectionEC); #endif } `;var c6t=T(S(),1),LZ=`in vec3 position3DHigh; in vec3 position3DLow; in vec3 normal; in vec3 tangent; in vec3 bitangent; in vec2 st; in float batchId; out vec3 v_positionEC; out vec3 v_normalEC; out vec3 v_tangentEC; out vec3 v_bitangentEC; out vec2 v_st; void main() { vec4 p = czm_computePosition(); v_positionEC = (czm_modelViewRelativeToEye * p).xyz; // position in eye coordinates v_normalEC = czm_normal * normal; // normal in eye coordinates v_tangentEC = czm_normal * tangent; // tangent in eye coordinates v_bitangentEC = czm_normal * bitangent; // bitangent in eye coordinates v_st = st; gl_Position = czm_modelViewProjectionRelativeToEye * p; } `;var d6t=T(S(),1),RZ=`in vec3 v_positionEC; in vec3 v_normalEC; void main() { vec3 positionToEyeEC = -v_positionEC; vec3 normalEC = normalize(v_normalEC); #ifdef FACE_FORWARD normalEC = faceforward(normalEC, vec3(0.0, 0.0, 1.0), -normalEC); #endif czm_materialInput materialInput; materialInput.normalEC = normalEC; materialInput.positionToEyeEC = positionToEyeEC; czm_material material = czm_getMaterial(materialInput); #ifdef FLAT out_FragColor = vec4(material.diffuse + material.emission, material.alpha); #else out_FragColor = czm_phong(normalize(positionToEyeEC), material, czm_lightDirectionEC); #endif } `;var m6t=T(S(),1),ZZ=`in vec3 position3DHigh; in vec3 position3DLow; in vec3 normal; in float batchId; out vec3 v_positionEC; out vec3 v_normalEC; void main() { vec4 p = czm_computePosition(); v_positionEC = (czm_modelViewRelativeToEye * p).xyz; // position in eye coordinates v_normalEC = czm_normal * normal; // normal in eye coordinates gl_Position = czm_modelViewProjectionRelativeToEye * p; } `;var f6t=T(S(),1),GZ=`in vec3 v_positionEC; in vec3 v_normalEC; in vec2 v_st; void main() { vec3 positionToEyeEC = -v_positionEC; vec3 normalEC = normalize(v_normalEC); #ifdef FACE_FORWARD normalEC = faceforward(normalEC, vec3(0.0, 0.0, 1.0), -normalEC); #endif czm_materialInput materialInput; materialInput.normalEC = normalEC; materialInput.positionToEyeEC = positionToEyeEC; materialInput.st = v_st; czm_material material = czm_getMaterial(materialInput); #ifdef FLAT out_FragColor = vec4(material.diffuse + material.emission, material.alpha); #else out_FragColor = czm_phong(normalize(positionToEyeEC), material, czm_lightDirectionEC); #endif } `;var b6t=T(S(),1),EZ=`in vec3 position3DHigh; in vec3 position3DLow; in vec3 normal; in vec2 st; in float batchId; out vec3 v_positionEC; out vec3 v_normalEC; out vec2 v_st; void main() { vec4 p = czm_computePosition(); v_positionEC = (czm_modelViewRelativeToEye * p).xyz; // position in eye coordinates v_normalEC = czm_normal * normal; // normal in eye coordinates v_st = st; gl_Position = czm_modelViewProjectionRelativeToEye * p; } `;var A6t=T(S(),1);var R6t=T(S(),1);var x6t=T(S(),1);var DFe={ADD:ne.FUNC_ADD,SUBTRACT:ne.FUNC_SUBTRACT,REVERSE_SUBTRACT:ne.FUNC_REVERSE_SUBTRACT,MIN:ne.MIN,MAX:ne.MAX},Ra=Object.freeze(DFe);var S6t=T(S(),1);var BFe={ZERO:ne.ZERO,ONE:ne.ONE,SOURCE_COLOR:ne.SRC_COLOR,ONE_MINUS_SOURCE_COLOR:ne.ONE_MINUS_SRC_COLOR,DESTINATION_COLOR:ne.DST_COLOR,ONE_MINUS_DESTINATION_COLOR:ne.ONE_MINUS_DST_COLOR,SOURCE_ALPHA:ne.SRC_ALPHA,ONE_MINUS_SOURCE_ALPHA:ne.ONE_MINUS_SRC_ALPHA,DESTINATION_ALPHA:ne.DST_ALPHA,ONE_MINUS_DESTINATION_ALPHA:ne.ONE_MINUS_DST_ALPHA,CONSTANT_COLOR:ne.CONSTANT_COLOR,ONE_MINUS_CONSTANT_COLOR:ne.ONE_MINUS_CONSTANT_COLOR,CONSTANT_ALPHA:ne.CONSTANT_ALPHA,ONE_MINUS_CONSTANT_ALPHA:ne.ONE_MINUS_CONSTANT_ALPHA,SOURCE_ALPHA_SATURATE:ne.SRC_ALPHA_SATURATE},_o=Object.freeze(BFe);var YFe={DISABLED:Object.freeze({enabled:!1}),ALPHA_BLEND:Object.freeze({enabled:!0,equationRgb:Ra.ADD,equationAlpha:Ra.ADD,functionSourceRgb:_o.SOURCE_ALPHA,functionSourceAlpha:_o.ONE,functionDestinationRgb:_o.ONE_MINUS_SOURCE_ALPHA,functionDestinationAlpha:_o.ONE_MINUS_SOURCE_ALPHA}),PRE_MULTIPLIED_ALPHA_BLEND:Object.freeze({enabled:!0,equationRgb:Ra.ADD,equationAlpha:Ra.ADD,functionSourceRgb:_o.ONE,functionSourceAlpha:_o.ONE,functionDestinationRgb:_o.ONE_MINUS_SOURCE_ALPHA,functionDestinationAlpha:_o.ONE_MINUS_SOURCE_ALPHA}),ADDITIVE_BLEND:Object.freeze({enabled:!0,equationRgb:Ra.ADD,equationAlpha:Ra.ADD,functionSourceRgb:_o.SOURCE_ALPHA,functionSourceAlpha:_o.ONE,functionDestinationRgb:_o.ONE,functionDestinationAlpha:_o.ONE})},un=Object.freeze(YFe);var E6t=T(S(),1);var OFe={FRONT:ne.FRONT,BACK:ne.BACK,FRONT_AND_BACK:ne.FRONT_AND_BACK},bi=Object.freeze(OFe);function AC(e){e=y(e,y.EMPTY_OBJECT),this.material=e.material,this.translucent=y(e.translucent,!0),this._vertexShaderSource=e.vertexShaderSource,this._fragmentShaderSource=e.fragmentShaderSource,this._renderState=e.renderState,this._closed=y(e.closed,!1)}Object.defineProperties(AC.prototype,{vertexShaderSource:{get:function(){return this._vertexShaderSource}},fragmentShaderSource:{get:function(){return this._fragmentShaderSource}},renderState:{get:function(){return this._renderState}},closed:{get:function(){return this._closed}}});AC.prototype.getFragmentShaderSource=function(){let e=[];return this.flat&&e.push("#define FLAT"),this.faceForward&&e.push("#define FACE_FORWARD"),l(this.material)&&e.push(this.material.shaderSource),e.push(this.fragmentShaderSource),e.join(` `)};AC.prototype.isTranslucent=function(){return l(this.material)&&this.material.isTranslucent()||!l(this.material)&&this.translucent};AC.prototype.getRenderState=function(){let e=this.isTranslucent(),t=Oe(this.renderState,!1);return e?(t.depthMask=!1,t.blending=un.ALPHA_BLEND):t.depthMask=!0,t};AC.getDefaultRenderState=function(e,t,n){let i={depthTest:{enabled:!0}};return e&&(i.depthMask=!1,i.blending=un.ALPHA_BLEND),t&&(i.cull={enabled:!0,face:bi.BACK}),l(n)&&(i=xt(n,i,!0)),i};var eo=AC;var ten=T(S(),1);var Sqt=T(S(),1);var N6t=T(S(),1),hr={_maximumCombinedTextureImageUnits:0,_maximumCubeMapSize:0,_maximumFragmentUniformVectors:0,_maximumTextureImageUnits:0,_maximumRenderbufferSize:0,_maximumTextureSize:0,_maximumVaryingVectors:0,_maximumVertexAttributes:0,_maximumVertexTextureImageUnits:0,_maximumVertexUniformVectors:0,_minimumAliasedLineWidth:0,_maximumAliasedLineWidth:0,_minimumAliasedPointSize:0,_maximumAliasedPointSize:0,_maximumViewportWidth:0,_maximumViewportHeight:0,_maximumTextureFilterAnisotropy:0,_maximumDrawBuffers:0,_maximumColorAttachments:0,_maximumSamples:0,_highpFloatSupported:!1,_highpIntSupported:!1};Object.defineProperties(hr,{maximumCombinedTextureImageUnits:{get:function(){return hr._maximumCombinedTextureImageUnits}},maximumCubeMapSize:{get:function(){return hr._maximumCubeMapSize}},maximumFragmentUniformVectors:{get:function(){return hr._maximumFragmentUniformVectors}},maximumTextureImageUnits:{get:function(){return hr._maximumTextureImageUnits}},maximumRenderbufferSize:{get:function(){return hr._maximumRenderbufferSize}},maximumTextureSize:{get:function(){return hr._maximumTextureSize}},maximumVaryingVectors:{get:function(){return hr._maximumVaryingVectors}},maximumVertexAttributes:{get:function(){return hr._maximumVertexAttributes}},maximumVertexTextureImageUnits:{get:function(){return hr._maximumVertexTextureImageUnits}},maximumVertexUniformVectors:{get:function(){return hr._maximumVertexUniformVectors}},minimumAliasedLineWidth:{get:function(){return hr._minimumAliasedLineWidth}},maximumAliasedLineWidth:{get:function(){return hr._maximumAliasedLineWidth}},minimumAliasedPointSize:{get:function(){return hr._minimumAliasedPointSize}},maximumAliasedPointSize:{get:function(){return hr._maximumAliasedPointSize}},maximumViewportWidth:{get:function(){return hr._maximumViewportWidth}},maximumViewportHeight:{get:function(){return hr._maximumViewportHeight}},maximumTextureFilterAnisotropy:{get:function(){return hr._maximumTextureFilterAnisotropy}},maximumDrawBuffers:{get:function(){return hr._maximumDrawBuffers}},maximumColorAttachments:{get:function(){return hr._maximumColorAttachments}},maximumSamples:{get:function(){return hr._maximumSamples}},highpFloatSupported:{get:function(){return hr._highpFloatSupported}},highpIntSupported:{get:function(){return hr._highpIntSupported}}});var Mt=hr;var O6t=T(S(),1);function R5(e,t,n,i,o,r,s,a,c,d,u){this._context=e,this._texture=t,this._textureTarget=n,this._targetFace=i,this._pixelDatatype=s,this._internalFormat=o,this._pixelFormat=r,this._size=a,this._preMultiplyAlpha=c,this._flipY=d,this._initialized=u}Object.defineProperties(R5.prototype,{pixelFormat:{get:function(){return this._pixelFormat}},pixelDatatype:{get:function(){return this._pixelDatatype}},_target:{get:function(){return this._targetFace}}});R5.prototype.copyFrom=function(e){let t=y(e.xOffset,0),n=y(e.yOffset,0),i=e.source,o=this._context._gl,r=this._textureTarget,s=this._targetFace;o.activeTexture(o.TEXTURE0),o.bindTexture(r,this._texture);let a=i.width,c=i.height,d=i.arrayBufferView,u=this._size,m=this._pixelFormat,p=this._internalFormat,g=this._pixelDatatype,f=this._preMultiplyAlpha,x=this._flipY,_=y(e.skipColorSpaceConversion,!1),C=4;l(d)&&(C=at.alignmentInBytes(m,g,a)),o.pixelStorei(o.UNPACK_ALIGNMENT,C),_?o.pixelStorei(o.UNPACK_COLORSPACE_CONVERSION_WEBGL,o.NONE):o.pixelStorei(o.UNPACK_COLORSPACE_CONVERSION_WEBGL,o.BROWSER_DEFAULT_WEBGL);let V=!1;if(!this._initialized){if(t===0&&n===0&&a===u&&c===u)l(d)?(o.pixelStorei(o.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),o.pixelStorei(o.UNPACK_FLIP_Y_WEBGL,!1),x&&(d=at.flipY(d,m,g,u,u)),o.texImage2D(s,0,p,u,u,0,m,ze.toWebGLConstant(g,this._context),d)):(o.pixelStorei(o.UNPACK_PREMULTIPLY_ALPHA_WEBGL,f),o.pixelStorei(o.UNPACK_FLIP_Y_WEBGL,x),o.texImage2D(s,0,p,m,ze.toWebGLConstant(g,this._context),i)),V=!0;else{o.pixelStorei(o.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),o.pixelStorei(o.UNPACK_FLIP_Y_WEBGL,!1);let L=at.createTypedArray(m,g,u,u);o.texImage2D(s,0,p,u,u,0,m,ze.toWebGLConstant(g,this._context),L)}this._initialized=!0}V||(l(d)?(o.pixelStorei(o.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),o.pixelStorei(o.UNPACK_FLIP_Y_WEBGL,!1),x&&(d=at.flipY(d,m,g,a,c)),o.texSubImage2D(s,0,t,n,a,c,m,ze.toWebGLConstant(g,this._context),d)):(o.pixelStorei(o.UNPACK_PREMULTIPLY_ALPHA_WEBGL,f),o.pixelStorei(o.UNPACK_FLIP_Y_WEBGL,x),o.texSubImage2D(s,0,t,n,m,ze.toWebGLConstant(g,this._context),i))),o.bindTexture(r,null)};R5.prototype.copyFromFramebuffer=function(e,t,n,i,o,r){e=y(e,0),t=y(t,0),n=y(n,0),i=y(i,0),o=y(o,this._size),r=y(r,this._size);let s=this._context._gl,a=this._textureTarget;s.activeTexture(s.TEXTURE0),s.bindTexture(a,this._texture),s.copyTexSubImage2D(this._targetFace,0,e,t,n,i,o,r),s.bindTexture(a,null),this._initialized=!0};var sf=R5;var K6t=T(S(),1);var Z5={DONT_CARE:ne.DONT_CARE,FASTEST:ne.FASTEST,NICEST:ne.NICEST,validate:function(e){return e===Z5.DONT_CARE||e===Z5.FASTEST||e===Z5.NICEST}},af=Object.freeze(Z5);var dqt=T(S(),1);var j6t=T(S(),1);var G5={NEAREST:ne.NEAREST,LINEAR:ne.LINEAR};G5.validate=function(e){return e===G5.NEAREST||e===G5.LINEAR};var di=Object.freeze(G5);var eqt=T(S(),1);var ug={NEAREST:ne.NEAREST,LINEAR:ne.LINEAR,NEAREST_MIPMAP_NEAREST:ne.NEAREST_MIPMAP_NEAREST,LINEAR_MIPMAP_NEAREST:ne.LINEAR_MIPMAP_NEAREST,NEAREST_MIPMAP_LINEAR:ne.NEAREST_MIPMAP_LINEAR,LINEAR_MIPMAP_LINEAR:ne.LINEAR_MIPMAP_LINEAR};ug.validate=function(e){return e===ug.NEAREST||e===ug.LINEAR||e===ug.NEAREST_MIPMAP_NEAREST||e===ug.LINEAR_MIPMAP_NEAREST||e===ug.NEAREST_MIPMAP_LINEAR||e===ug.LINEAR_MIPMAP_LINEAR};var rn=Object.freeze(ug);var iqt=T(S(),1);var E5={CLAMP_TO_EDGE:ne.CLAMP_TO_EDGE,REPEAT:ne.REPEAT,MIRRORED_REPEAT:ne.MIRRORED_REPEAT,validate:function(e){return e===E5.CLAMP_TO_EDGE||e===E5.REPEAT||e===E5.MIRRORED_REPEAT}},Cn=Object.freeze(E5);function XZ(e){e=y(e,y.EMPTY_OBJECT);let t=y(e.wrapS,Cn.CLAMP_TO_EDGE),n=y(e.wrapT,Cn.CLAMP_TO_EDGE),i=y(e.minificationFilter,rn.LINEAR),o=y(e.magnificationFilter,di.LINEAR),r=l(e.maximumAnisotropy)?e.maximumAnisotropy:1;this._wrapS=t,this._wrapT=n,this._minificationFilter=i,this._magnificationFilter=o,this._maximumAnisotropy=r}Object.defineProperties(XZ.prototype,{wrapS:{get:function(){return this._wrapS}},wrapT:{get:function(){return this._wrapT}},minificationFilter:{get:function(){return this._minificationFilter}},magnificationFilter:{get:function(){return this._magnificationFilter}},maximumAnisotropy:{get:function(){return this._maximumAnisotropy}}});XZ.equals=function(e,t){return e===t||l(e)&&l(t)&&e._wrapS===t._wrapS&&e._wrapT===t._wrapT&&e._minificationFilter===t._minificationFilter&&e._magnificationFilter===t._magnificationFilter&&e._maximumAnisotropy===t._maximumAnisotropy};XZ.NEAREST=Object.freeze(new XZ({wrapS:Cn.CLAMP_TO_EDGE,wrapT:Cn.CLAMP_TO_EDGE,minificationFilter:rn.NEAREST,magnificationFilter:di.NEAREST}));var sn=XZ;function IZ(e){e=y(e,y.EMPTY_OBJECT);let t=e.context,n=e.source,i,o;if(l(n)){let V=[n.positiveX,n.negativeX,n.positiveY,n.negativeY,n.positiveZ,n.negativeZ];i=V[0].width,o=V[0].height}else i=e.width,o=e.height;let r=i,s=y(e.pixelDatatype,ze.UNSIGNED_BYTE),a=y(e.pixelFormat,at.RGBA),c=at.toInternalFormat(a,s,t),d=at.textureSizeInBytes(a,s,r,r)*6,u=e.preMultiplyAlpha||a===at.RGB||a===at.LUMINANCE,m=y(e.flipY,!0),p=y(e.skipColorSpaceConversion,!1),g=t._gl,f=g.TEXTURE_CUBE_MAP,x=g.createTexture();g.activeTexture(g.TEXTURE0),g.bindTexture(f,x);function _(V,L,Z,G,X){let v=L.arrayBufferView;l(v)||(v=L.bufferView);let P=4;l(v)&&(P=at.alignmentInBytes(a,s,i)),g.pixelStorei(g.UNPACK_ALIGNMENT,P),X?g.pixelStorei(g.UNPACK_COLORSPACE_CONVERSION_WEBGL,g.NONE):g.pixelStorei(g.UNPACK_COLORSPACE_CONVERSION_WEBGL,g.BROWSER_DEFAULT_WEBGL),l(v)?(g.pixelStorei(g.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),g.pixelStorei(g.UNPACK_FLIP_Y_WEBGL,!1),G&&(v=at.flipY(v,a,s,r,r)),g.texImage2D(V,0,c,r,r,0,a,ze.toWebGLConstant(s,t),v)):(g.pixelStorei(g.UNPACK_PREMULTIPLY_ALPHA_WEBGL,Z),g.pixelStorei(g.UNPACK_FLIP_Y_WEBGL,G),g.texImage2D(V,0,c,a,ze.toWebGLConstant(s,t),L))}l(n)?(_(g.TEXTURE_CUBE_MAP_POSITIVE_X,n.positiveX,u,m,p),_(g.TEXTURE_CUBE_MAP_NEGATIVE_X,n.negativeX,u,m,p),_(g.TEXTURE_CUBE_MAP_POSITIVE_Y,n.positiveY,u,m,p),_(g.TEXTURE_CUBE_MAP_NEGATIVE_Y,n.negativeY,u,m,p),_(g.TEXTURE_CUBE_MAP_POSITIVE_Z,n.positiveZ,u,m,p),_(g.TEXTURE_CUBE_MAP_NEGATIVE_Z,n.negativeZ,u,m,p)):(g.texImage2D(g.TEXTURE_CUBE_MAP_POSITIVE_X,0,c,r,r,0,a,ze.toWebGLConstant(s,t),null),g.texImage2D(g.TEXTURE_CUBE_MAP_NEGATIVE_X,0,c,r,r,0,a,ze.toWebGLConstant(s,t),null),g.texImage2D(g.TEXTURE_CUBE_MAP_POSITIVE_Y,0,c,r,r,0,a,ze.toWebGLConstant(s,t),null),g.texImage2D(g.TEXTURE_CUBE_MAP_NEGATIVE_Y,0,c,r,r,0,a,ze.toWebGLConstant(s,t),null),g.texImage2D(g.TEXTURE_CUBE_MAP_POSITIVE_Z,0,c,r,r,0,a,ze.toWebGLConstant(s,t),null),g.texImage2D(g.TEXTURE_CUBE_MAP_NEGATIVE_Z,0,c,r,r,0,a,ze.toWebGLConstant(s,t),null)),g.bindTexture(f,null),this._context=t,this._textureFilterAnisotropic=t._textureFilterAnisotropic,this._textureTarget=f,this._texture=x,this._pixelFormat=a,this._pixelDatatype=s,this._size=r,this._hasMipmap=!1,this._sizeInBytes=d,this._preMultiplyAlpha=u,this._flipY=m,this._sampler=void 0;let C=l(n);this._positiveX=new sf(t,x,f,g.TEXTURE_CUBE_MAP_POSITIVE_X,c,a,s,r,u,m,C),this._negativeX=new sf(t,x,f,g.TEXTURE_CUBE_MAP_NEGATIVE_X,c,a,s,r,u,m,C),this._positiveY=new sf(t,x,f,g.TEXTURE_CUBE_MAP_POSITIVE_Y,c,a,s,r,u,m,C),this._negativeY=new sf(t,x,f,g.TEXTURE_CUBE_MAP_NEGATIVE_Y,c,a,s,r,u,m,C),this._positiveZ=new sf(t,x,f,g.TEXTURE_CUBE_MAP_POSITIVE_Z,c,a,s,r,u,m,C),this._negativeZ=new sf(t,x,f,g.TEXTURE_CUBE_MAP_NEGATIVE_Z,c,a,s,r,u,m,C),this.sampler=l(e.sampler)?e.sampler:new sn}Object.defineProperties(IZ.prototype,{positiveX:{get:function(){return this._positiveX}},negativeX:{get:function(){return this._negativeX}},positiveY:{get:function(){return this._positiveY}},negativeY:{get:function(){return this._negativeY}},positiveZ:{get:function(){return this._positiveZ}},negativeZ:{get:function(){return this._negativeZ}},sampler:{get:function(){return this._sampler},set:function(e){let t=e.minificationFilter,n=e.magnificationFilter,i=t===rn.NEAREST_MIPMAP_NEAREST||t===rn.NEAREST_MIPMAP_LINEAR||t===rn.LINEAR_MIPMAP_NEAREST||t===rn.LINEAR_MIPMAP_LINEAR,o=this._context,r=this._pixelDatatype;(r===ze.FLOAT&&!o.textureFloatLinear||r===ze.HALF_FLOAT&&!o.textureHalfFloatLinear)&&(t=i?rn.NEAREST_MIPMAP_NEAREST:rn.NEAREST,n=di.NEAREST);let s=o._gl,a=this._textureTarget;s.activeTexture(s.TEXTURE0),s.bindTexture(a,this._texture),s.texParameteri(a,s.TEXTURE_MIN_FILTER,t),s.texParameteri(a,s.TEXTURE_MAG_FILTER,n),s.texParameteri(a,s.TEXTURE_WRAP_S,e.wrapS),s.texParameteri(a,s.TEXTURE_WRAP_T,e.wrapT),l(this._textureFilterAnisotropic)&&s.texParameteri(a,this._textureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT,e.maximumAnisotropy),s.bindTexture(a,null),this._sampler=e}},pixelFormat:{get:function(){return this._pixelFormat}},pixelDatatype:{get:function(){return this._pixelDatatype}},width:{get:function(){return this._size}},height:{get:function(){return this._size}},sizeInBytes:{get:function(){return this._hasMipmap?Math.floor(this._sizeInBytes*4/3):this._sizeInBytes}},preMultiplyAlpha:{get:function(){return this._preMultiplyAlpha}},flipY:{get:function(){return this._flipY}},_target:{get:function(){return this._textureTarget}}});IZ.prototype.generateMipmap=function(e){e=y(e,af.DONT_CARE),this._hasMipmap=!0;let t=this._context._gl,n=this._textureTarget;t.hint(t.GENERATE_MIPMAP_HINT,e),t.activeTexture(t.TEXTURE0),t.bindTexture(n,this._texture),t.generateMipmap(n),t.bindTexture(n,null)};IZ.prototype.isDestroyed=function(){return!1};IZ.prototype.destroy=function(){return this._context._gl.deleteTexture(this._texture),this._positiveX=me(this._positiveX),this._negativeX=me(this._negativeX),this._positiveY=me(this._positiveY),this._negativeY=me(this._negativeY),this._positiveZ=me(this._positiveZ),this._negativeZ=me(this._negativeZ),me(this)};var sc=IZ;var wqt=T(S(),1);function Im(e){e=y(e,y.EMPTY_OBJECT);let t=e.context,n=e.width,i=e.height,o=e.source;l(o)&&(l(n)||(n=y(o.videoWidth,o.width)),l(i)||(i=y(o.videoHeight,o.height)));let r=y(e.pixelFormat,at.RGBA),s=y(e.pixelDatatype,ze.UNSIGNED_BYTE),a=at.toInternalFormat(r,s,t),c=at.isCompressedFormat(a),d=e.preMultiplyAlpha||r===at.RGB||r===at.LUMINANCE,u=y(e.flipY,!0),m=y(e.skipColorSpaceConversion,!1),p=!0,g=t._gl,f=g.TEXTURE_2D,x=g.createTexture();g.activeTexture(g.TEXTURE0),g.bindTexture(f,x);let _=4;if(l(o)&&l(o.arrayBufferView)&&!c&&(_=at.alignmentInBytes(r,s,n)),g.pixelStorei(g.UNPACK_ALIGNMENT,_),m?g.pixelStorei(g.UNPACK_COLORSPACE_CONVERSION_WEBGL,g.NONE):g.pixelStorei(g.UNPACK_COLORSPACE_CONVERSION_WEBGL,g.BROWSER_DEFAULT_WEBGL),l(o))if(l(o.arrayBufferView)){g.pixelStorei(g.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),g.pixelStorei(g.UNPACK_FLIP_Y_WEBGL,!1);let V=o.arrayBufferView,L,Z,G;if(c){if(g.compressedTexImage2D(f,0,a,n,i,0,V),l(o.mipLevels))for(Z=n,G=i,L=0;L maxHeight) { material.diffuse = vec3(0.0); material.alpha = 0.0; return material; } // Binary search to find heights above and below. int idxBelow = 0; int idxAbove = heightsDimensions.x; float heightBelow = minHeight; float heightAbove = maxHeight; // while loop not allowed, so use for loop with max iterations. // maxIterations of 16 supports a texture size up to 65536 (2^16). const int maxIterations = 16; for (int i = 0; i < maxIterations; i++) { if (idxBelow >= idxAbove - 1) { break; } int idxMid = (idxBelow + idxAbove) / 2; float heightTex = getHeight(idxMid, invTexSize); if (height > heightTex) { idxBelow = idxMid; heightBelow = heightTex; } else { idxAbove = idxMid; heightAbove = heightTex; } } float lerper = heightBelow == heightAbove ? 1.0 : (height - heightBelow) / (heightAbove - heightBelow); vec2 colorUv = vec2(invTexSize * (float(idxBelow) + 0.5 + lerper), 0.5); vec4 color = texture(colors, colorUv); // undo preumultiplied alpha if (color.a > 0.0) { color.rgb /= color.a; } color.rgb = czm_gammaCorrect(color.rgb); material.diffuse = color.rgb; material.alpha = color.a; return material; } `;var zqt=T(S(),1),AZ=`uniform vec4 color; uniform float spacing; uniform float width; czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); float distanceToContour = mod(materialInput.height, spacing); #if (__VERSION__ == 300 || defined(GL_OES_standard_derivatives)) float dxc = abs(dFdx(materialInput.height)); float dyc = abs(dFdy(materialInput.height)); float dF = max(dxc, dyc) * czm_pixelRatio * width; float alpha = (distanceToContour < dF) ? 1.0 : 0.0; #else // If no derivatives available (IE 10?), use pixel ratio float alpha = (distanceToContour < (czm_pixelRatio * width)) ? 1.0 : 0.0; #endif vec4 outColor = czm_gammaCorrect(vec4(color.rgb, alpha * color.a)); material.diffuse = outColor.rgb; material.alpha = outColor.a; return material; } `;var Jqt=T(S(),1),MZ=`uniform sampler2D image; uniform float minimumHeight; uniform float maximumHeight; czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); float scaledHeight = clamp((materialInput.height - minimumHeight) / (maximumHeight - minimumHeight), 0.0, 1.0); vec4 rampColor = texture(image, vec2(scaledHeight, 0.5)); rampColor = czm_gammaCorrect(rampColor); material.diffuse = rampColor.rgb; material.alpha = rampColor.a; return material; } `;var jqt=T(S(),1),NZ=`uniform vec4 fadeInColor; uniform vec4 fadeOutColor; uniform float maximumDistance; uniform bool repeat; uniform vec2 fadeDirection; uniform vec2 time; float getTime(float t, float coord) { float scalar = 1.0 / maximumDistance; float q = distance(t, coord) * scalar; if (repeat) { float r = distance(t, coord + 1.0) * scalar; float s = distance(t, coord - 1.0) * scalar; q = min(min(r, s), q); } return clamp(q, 0.0, 1.0); } czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); vec2 st = materialInput.st; float s = getTime(time.x, st.s) * fadeDirection.s; float t = getTime(time.y, st.t) * fadeDirection.t; float u = length(vec2(s, t)); vec4 color = mix(fadeInColor, fadeOutColor, u); color = czm_gammaCorrect(color); material.emission = color.rgb; material.alpha = color.a; return material; } `;var $qt=T(S(),1),kZ=`uniform vec4 color; uniform float cellAlpha; uniform vec2 lineCount; uniform vec2 lineThickness; uniform vec2 lineOffset; czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); vec2 st = materialInput.st; float scaledWidth = fract(lineCount.s * st.s - lineOffset.s); scaledWidth = abs(scaledWidth - floor(scaledWidth + 0.5)); float scaledHeight = fract(lineCount.t * st.t - lineOffset.t); scaledHeight = abs(scaledHeight - floor(scaledHeight + 0.5)); float value; // Fuzz Factor - Controls blurriness of lines #if (__VERSION__ == 300 || defined(GL_OES_standard_derivatives)) const float fuzz = 1.2; vec2 thickness = (lineThickness * czm_pixelRatio) - 1.0; // From "3D Engine Design for Virtual Globes" by Cozzi and Ring, Listing 4.13. vec2 dx = abs(dFdx(st)); vec2 dy = abs(dFdy(st)); vec2 dF = vec2(max(dx.s, dy.s), max(dx.t, dy.t)) * lineCount; value = min( smoothstep(dF.s * thickness.s, dF.s * (fuzz + thickness.s), scaledWidth), smoothstep(dF.t * thickness.t, dF.t * (fuzz + thickness.t), scaledHeight)); #else // If no derivatives available (IE 10?), revert to view-dependent fuzz const float fuzz = 0.05; vec2 range = 0.5 - (lineThickness * 0.05); value = min( 1.0 - smoothstep(range.s, range.s + fuzz, scaledWidth), 1.0 - smoothstep(range.t, range.t + fuzz, scaledHeight)); #endif // Edges taken from RimLightingMaterial.glsl // See http://www.fundza.com/rman_shaders/surface/fake_rim/fake_rim1.html float dRim = 1.0 - abs(dot(materialInput.normalEC, normalize(materialInput.positionToEyeEC))); float sRim = smoothstep(0.8, 1.0, dRim); value *= (1.0 - sRim); vec4 halfColor; halfColor.rgb = color.rgb * 0.5; halfColor.a = color.a * (1.0 - ((1.0 - cellAlpha) * value)); halfColor = czm_gammaCorrect(halfColor); material.diffuse = halfColor.rgb; material.emission = halfColor.rgb; material.alpha = halfColor.a; return material; } `;var t$t=T(S(),1),UZ=`uniform sampler2D image; uniform float strength; uniform vec2 repeat; czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); vec4 textureValue = texture(image, fract(repeat * materialInput.st)); vec3 normalTangentSpace = textureValue.channels; normalTangentSpace.xy = normalTangentSpace.xy * 2.0 - 1.0; normalTangentSpace.z = clamp(1.0 - strength, 0.1, 1.0); normalTangentSpace = normalize(normalTangentSpace); vec3 normalEC = materialInput.tangentToEyeMatrix * normalTangentSpace; material.normal = normalEC; return material; } `;var i$t=T(S(),1),DZ=`uniform vec4 color; float getPointOnLine(vec2 p0, vec2 p1, float x) { float slope = (p0.y - p1.y) / (p0.x - p1.x); return slope * (x - p0.x) + p0.y; } czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); vec2 st = materialInput.st; #if (__VERSION__ == 300 || defined(GL_OES_standard_derivatives)) float base = 1.0 - abs(fwidth(st.s)) * 10.0 * czm_pixelRatio; #else // If no derivatives available (IE 10?), 2.5% of the line will be the arrow head float base = 0.975; #endif vec2 center = vec2(1.0, 0.5); float ptOnUpperLine = getPointOnLine(vec2(base, 1.0), center, st.s); float ptOnLowerLine = getPointOnLine(vec2(base, 0.0), center, st.s); float halfWidth = 0.15; float s = step(0.5 - halfWidth, st.t); s *= 1.0 - step(0.5 + halfWidth, st.t); s *= 1.0 - step(base, st.s); float t = step(base, materialInput.st.s); t *= 1.0 - step(ptOnUpperLine, st.t); t *= step(ptOnLowerLine, st.t); // Find the distance from the closest separator (region between two colors) float dist; if (st.s < base) { float d1 = abs(st.t - (0.5 - halfWidth)); float d2 = abs(st.t - (0.5 + halfWidth)); dist = min(d1, d2); } else { float d1 = czm_infinity; if (st.t < 0.5 - halfWidth && st.t > 0.5 + halfWidth) { d1 = abs(st.s - base); } float d2 = abs(st.t - ptOnUpperLine); float d3 = abs(st.t - ptOnLowerLine); dist = min(min(d1, d2), d3); } vec4 outsideColor = vec4(0.0); vec4 currentColor = mix(outsideColor, color, clamp(s + t, 0.0, 1.0)); vec4 outColor = czm_antialias(outsideColor, color, currentColor, dist); outColor = czm_gammaCorrect(outColor); material.diffuse = outColor.rgb; material.alpha = outColor.a; return material; } `;var r$t=T(S(),1),BZ=`uniform vec4 color; uniform vec4 gapColor; uniform float dashLength; uniform float dashPattern; in float v_polylineAngle; const float maskLength = 16.0; mat2 rotate(float rad) { float c = cos(rad); float s = sin(rad); return mat2( c, s, -s, c ); } czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); vec2 pos = rotate(v_polylineAngle) * gl_FragCoord.xy; // Get the relative position within the dash from 0 to 1 float dashPosition = fract(pos.x / (dashLength * czm_pixelRatio)); // Figure out the mask index. float maskIndex = floor(dashPosition * maskLength); // Test the bit mask. float maskTest = floor(dashPattern / pow(2.0, maskIndex)); vec4 fragColor = (mod(maskTest, 2.0) < 1.0) ? gapColor : color; if (fragColor.a < 0.005) { // matches 0/255 and 1/255 discard; } fragColor = czm_gammaCorrect(fragColor); material.emission = fragColor.rgb; material.alpha = fragColor.a; return material; } `;var a$t=T(S(),1),YZ=`uniform vec4 color; uniform float glowPower; uniform float taperPower; czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); vec2 st = materialInput.st; float glow = glowPower / abs(st.t - 0.5) - (glowPower / 0.5); if (taperPower <= 0.99999) { glow *= min(1.0, taperPower / (0.5 - st.s * 0.5) - (taperPower / 0.5)); } vec4 fragColor; fragColor.rgb = max(vec3(glow - 1.0 + color.rgb), color.rgb); fragColor.a = clamp(0.0, 1.0, glow) * color.a; fragColor = czm_gammaCorrect(fragColor); material.emission = fragColor.rgb; material.alpha = fragColor.a; return material; } `;var l$t=T(S(),1),OZ=`uniform vec4 color; uniform vec4 outlineColor; uniform float outlineWidth; in float v_width; czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); vec2 st = materialInput.st; float halfInteriorWidth = 0.5 * (v_width - outlineWidth) / v_width; float b = step(0.5 - halfInteriorWidth, st.t); b *= 1.0 - step(0.5 + halfInteriorWidth, st.t); // Find the distance from the closest separator (region between two colors) float d1 = abs(st.t - (0.5 - halfInteriorWidth)); float d2 = abs(st.t - (0.5 + halfInteriorWidth)); float dist = min(d1, d2); vec4 currentColor = mix(outlineColor, color, b); vec4 outColor = czm_antialias(outlineColor, color, currentColor, dist); outColor = czm_gammaCorrect(outColor); material.diffuse = outColor.rgb; material.alpha = outColor.a; return material; } `;var u$t=T(S(),1),HZ=`uniform vec4 color; uniform vec4 rimColor; uniform float width; czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); // See http://www.fundza.com/rman_shaders/surface/fake_rim/fake_rim1.html float d = 1.0 - dot(materialInput.normalEC, normalize(materialInput.positionToEyeEC)); float s = smoothstep(1.0 - width, 1.0, d); vec4 outColor = czm_gammaCorrect(color); vec4 outRimColor = czm_gammaCorrect(rimColor); material.diffuse = outColor.rgb; material.emission = outRimColor.rgb * s; material.alpha = mix(outColor.a, outRimColor.a, s); return material; } `;var h$t=T(S(),1),zZ=`uniform sampler2D image; czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); vec4 rampColor = texture(image, vec2(materialInput.slope / (czm_pi / 2.0), 0.5)); rampColor = czm_gammaCorrect(rampColor); material.diffuse = rampColor.rgb; material.alpha = rampColor.a; return material; } `;var p$t=T(S(),1),KZ=`uniform vec4 evenColor; uniform vec4 oddColor; uniform float offset; uniform float repeat; uniform bool horizontal; czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); // Based on the Stripes Fragment Shader in the Orange Book (11.1.2) float coord = mix(materialInput.st.s, materialInput.st.t, float(horizontal)); float value = fract((coord - offset) * (repeat * 0.5)); float dist = min(value, min(abs(value - 0.5), 1.0 - value)); vec4 currentColor = mix(evenColor, oddColor, step(0.5, value)); vec4 color = czm_antialias(evenColor, oddColor, currentColor, dist); color = czm_gammaCorrect(color); material.diffuse = color.rgb; material.alpha = color.a; return material; } `;var g$t=T(S(),1),JZ=`// Thanks for the contribution Jonas // http://29a.ch/2012/7/19/webgl-terrain-rendering-water-fog uniform sampler2D specularMap; uniform sampler2D normalMap; uniform vec4 baseWaterColor; uniform vec4 blendColor; uniform float frequency; uniform float animationSpeed; uniform float amplitude; uniform float specularIntensity; uniform float fadeFactor; czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); float time = czm_frameNumber * animationSpeed; // fade is a function of the distance from the fragment and the frequency of the waves float fade = max(1.0, (length(materialInput.positionToEyeEC) / 10000000000.0) * frequency * fadeFactor); float specularMapValue = texture(specularMap, materialInput.st).r; // note: not using directional motion at this time, just set the angle to 0.0; vec4 noise = czm_getWaterNoise(normalMap, materialInput.st * frequency, time, 0.0); vec3 normalTangentSpace = noise.xyz * vec3(1.0, 1.0, (1.0 / amplitude)); // fade out the normal perturbation as we move further from the water surface normalTangentSpace.xy /= fade; // attempt to fade out the normal perturbation as we approach non water areas (low specular map value) normalTangentSpace = mix(vec3(0.0, 0.0, 50.0), normalTangentSpace, specularMapValue); normalTangentSpace = normalize(normalTangentSpace); // get ratios for alignment of the new normal vector with a vector perpendicular to the tangent plane float tsPerturbationRatio = clamp(dot(normalTangentSpace, vec3(0.0, 0.0, 1.0)), 0.0, 1.0); // fade out water effect as specular map value decreases material.alpha = mix(blendColor.a, baseWaterColor.a, specularMapValue) * specularMapValue; // base color is a blend of the water and non-water color based on the value from the specular map // may need a uniform blend factor to better control this material.diffuse = mix(blendColor.rgb, baseWaterColor.rgb, specularMapValue); // diffuse highlights are based on how perturbed the normal is material.diffuse += (0.1 * tsPerturbationRatio); material.diffuse = material.diffuse; material.normal = normalize(materialInput.tangentToEyeMatrix * normalTangentSpace); material.specular = specularIntensity; material.shininess = 10.0; return material; } `;function Ke(e){this.type=void 0,this.shaderSource=void 0,this.materials=void 0,this.uniforms=void 0,this._uniforms=void 0,this.translucent=void 0,this._minificationFilter=y(e.minificationFilter,rn.LINEAR),this._magnificationFilter=y(e.magnificationFilter,di.LINEAR),this._strict=void 0,this._template=void 0,this._count=void 0,this._texturePaths={},this._loadedImages=[],this._loadedCubeMaps=[],this._textures={},this._updateFunctions=[],this._defaultTexture=void 0,HFe(e,this),Object.defineProperties(this,{type:{value:this.type,writable:!1}}),l(Ke._uniformList[this.type])||(Ke._uniformList[this.type]=Object.keys(this._uniforms))}Ke._uniformList={};Ke.fromType=function(e,t){let n=new Ke({fabric:{type:e}});if(l(t))for(let i in t)t.hasOwnProperty(i)&&(n.uniforms[i]=t[i]);return n};Ke.prototype.isTranslucent=function(){if(l(this.translucent))return typeof this.translucent=="function"?this.translucent():this.translucent;let e=!0,t=this._translucentFunctions,n=t.length;for(let i=0;i-1)return!0;return!1}function qFe(e){let t=e._template.components,n=e._template.source;if(l(n))e.shaderSource+=`${n} `;else{if(e.shaderSource+=`czm_material czm_getMaterial(czm_materialInput materialInput) { `,e.shaderSource+=`czm_material material = czm_getDefaultMaterial(materialInput); `,l(t)){let i=Object.keys(e._template.materials).length>0;for(let o in t)if(t.hasOwnProperty(o))if(o==="diffuse"||o==="emission"){let s=i&&jFe(t[o],e)?t[o]:`czm_gammaCorrect(${t[o]})`;e.shaderSource+=`material.${o} = ${s}; `}else o==="alpha"?e.shaderSource+=`material.alpha = ${t.alpha}; `:e.shaderSource+=`material.${o} = ${t[o]}; `}e.shaderSource+=`return material; } `}}var Yre={mat2:Qi,mat3:$,mat4:M},$Fe=/\.ktx2$/i;function e9e(e){let t;return function(n,i){let o=n.uniforms,r=o[e],s=t!==r,a=!l(r)||r===Ke.DefaultImageId;t=r;let c=n._textures[e],d,u;if(r instanceof HTMLVideoElement){if(r.readyState>=2){if(s&&l(c)&&(c!==i.defaultTexture&&c.destroy(),c=void 0),!l(c)||c===i.defaultTexture){let p=new sn({minificationFilter:n._minificationFilter,magnificationFilter:n._magnificationFilter});c=new Et({context:i,source:r,sampler:p}),n._textures[e]=c;return}c.copyFrom({source:r})}else l(c)||(n._textures[e]=i.defaultTexture);return}if(r instanceof Et&&r!==c){n._texturePaths[e]=void 0;let p=n._textures[e];l(p)&&p!==n._defaultTexture&&p.destroy(),n._textures[e]=r,d=`${e}Dimensions`,o.hasOwnProperty(d)&&(u=o[d],u.x=r._width,u.y=r._height);return}if(s&&l(c)&&a&&(c!==n._defaultTexture&&c.destroy(),c=void 0),l(c)||(n._texturePaths[e]=void 0,c=n._textures[e]=n._defaultTexture,d=`${e}Dimensions`,o.hasOwnProperty(d)&&(u=o[d],u.x=c._width,u.y=c._height)),a)return;let m=r instanceof Ee;if(!l(n._texturePaths[e])||m&&r.url!==n._texturePaths[e].url||!m&&r!==n._texturePaths[e]){if(typeof r=="string"||m){let p=m?r:Ee.createIfNeeded(r),g;$Fe.test(p.url)?g=Rl(p.url):g=p.fetchImage(),Promise.resolve(g).then(function(f){n._loadedImages.push({id:e,image:f})}).catch(function(){l(c)&&c!==n._defaultTexture&&c.destroy(),n._textures[e]=n._defaultTexture})}else(r instanceof HTMLCanvasElement||r instanceof HTMLImageElement)&&n._loadedImages.push({id:e,image:r});n._texturePaths[e]=r}}}function t9e(e){return function(t,n){let i=t.uniforms[e];if(i instanceof sc){let r=t._textures[e];r!==t._defaultTexture&&r.destroy(),t._texturePaths[e]=void 0,t._textures[e]=i;return}if(l(t._textures[e])||(t._texturePaths[e]=void 0,t._textures[e]=n.defaultCubeMap),i===Ke.DefaultCubeMapId)return;let o=i.positiveX+i.negativeX+i.positiveY+i.negativeY+i.positiveZ+i.negativeZ;if(o!==t._texturePaths[e]){let r=[Ee.createIfNeeded(i.positiveX).fetchImage(),Ee.createIfNeeded(i.negativeX).fetchImage(),Ee.createIfNeeded(i.positiveY).fetchImage(),Ee.createIfNeeded(i.negativeY).fetchImage(),Ee.createIfNeeded(i.positiveZ).fetchImage(),Ee.createIfNeeded(i.negativeZ).fetchImage()];Promise.all(r).then(function(s){t._loadedCubeMaps.push({id:e,images:s})}),t._texturePaths[e]=o}}}function n9e(e){let t=e._template.uniforms;for(let n in t)t.hasOwnProperty(n)&&Ore(e,n)}function Ore(e,t){let n=e._strict,i=e._template.uniforms,o=i[t],r=i9e(o),s;if(r==="channels")s=QZ(e,t,o,!1);else{if(r==="sampler2D"){let d=`${t}Dimensions`;r9e(e,d)>0&&(i[d]={type:"ivec3",x:1,y:1},Ore(e,d))}if(!new RegExp(`uniform\\s+${r}\\s+${t}\\s*;`).test(e.shaderSource)){let d=`uniform ${r} ${t};`;e.shaderSource=d+e.shaderSource}let c=`${t}_${e._count++}`;if(s=QZ(e,t,c),e.uniforms[t]=o,r==="sampler2D")e._uniforms[c]=function(){return e._textures[t]},e._updateFunctions.push(e9e(t));else if(r==="samplerCube")e._uniforms[c]=function(){return e._textures[t]},e._updateFunctions.push(t9e(t));else if(r.indexOf("mat")!==-1){let d=new Yre[r];e._uniforms[c]=function(){return Yre[r].fromColumnMajorArray(e.uniforms[t],d)}}else e._uniforms[c]=function(){return e.uniforms[t]}}}function i9e(e){let t=e.type;if(!l(t)){let n=typeof e;if(n==="number")t="float";else if(n==="boolean")t="bool";else if(n==="string"||e instanceof Ee||e instanceof HTMLCanvasElement||e instanceof HTMLImageElement)/^([rgba]){1,4}$/i.test(e)?t="channels":e===Ke.DefaultCubeMapId?t="samplerCube":t="sampler2D";else if(n==="object")if(Array.isArray(e))(e.length===4||e.length===9||e.length===16)&&(t=`mat${Math.sqrt(e.length)}`);else{let i=0;for(let o in e)e.hasOwnProperty(o)&&(i+=1);i>=2&&i<=4?t=`vec${i}`:i===6&&(t="samplerCube")}}return t}function o9e(e){let t=e._strict,n=e._template.materials;for(let i in n)if(n.hasOwnProperty(i)){let o=new Ke({strict:t,fabric:n[i],count:e._count});e._count=o._count,e._uniforms=xt(e._uniforms,o._uniforms,!0),e.materials[i]=o,e._translucentFunctions=e._translucentFunctions.concat(o._translucentFunctions);let r="czm_getMaterial",s=`${r}_${e._count++}`;QZ(o,r,s),e.shaderSource=o.shaderSource+e.shaderSource;let a=`${s}(materialInput)`,c=QZ(e,i,a)}}function QZ(e,t,n,i){i=y(i,!0);let o=0,r="([\\w])?",s=`([\\w${i?".":""}])?`,a=new RegExp(s+t+r,"g");return e.shaderSource=e.shaderSource.replace(a,function(c,d,u){return d||u?c:(o+=1,n)}),o}function r9e(e,t,n){return QZ(e,t,t,n)}Ke._materialCache={_materials:{},addMaterial:function(e,t){this._materials[e]=t},getMaterial:function(e){return this._materials[e]}};Ke.DefaultImageId="czm_defaultImage";Ke.DefaultCubeMapId="czm_defaultCubeMap";Ke.ColorType="Color";Ke._materialCache.addMaterial(Ke.ColorType,{fabric:{type:Ke.ColorType,uniforms:{color:new Y(1,0,0,.5)},components:{diffuse:"color.rgb",alpha:"color.a"}},translucent:function(e){return e.uniforms.color.alpha<1}});Ke.ImageType="Image";Ke._materialCache.addMaterial(Ke.ImageType,{fabric:{type:Ke.ImageType,uniforms:{image:Ke.DefaultImageId,repeat:new D(1,1),color:new Y(1,1,1,1)},components:{diffuse:"texture(image, fract(repeat * materialInput.st)).rgb * color.rgb",alpha:"texture(image, fract(repeat * materialInput.st)).a * color.a"}},translucent:function(e){return e.uniforms.color.alpha<1}});Ke.DiffuseMapType="DiffuseMap";Ke._materialCache.addMaterial(Ke.DiffuseMapType,{fabric:{type:Ke.DiffuseMapType,uniforms:{image:Ke.DefaultImageId,channels:"rgb",repeat:new D(1,1)},components:{diffuse:"texture(image, fract(repeat * materialInput.st)).channels"}},translucent:!1});Ke.AlphaMapType="AlphaMap";Ke._materialCache.addMaterial(Ke.AlphaMapType,{fabric:{type:Ke.AlphaMapType,uniforms:{image:Ke.DefaultImageId,channel:"a",repeat:new D(1,1)},components:{alpha:"texture(image, fract(repeat * materialInput.st)).channel"}},translucent:!0});Ke.SpecularMapType="SpecularMap";Ke._materialCache.addMaterial(Ke.SpecularMapType,{fabric:{type:Ke.SpecularMapType,uniforms:{image:Ke.DefaultImageId,channel:"r",repeat:new D(1,1)},components:{specular:"texture(image, fract(repeat * materialInput.st)).channel"}},translucent:!1});Ke.EmissionMapType="EmissionMap";Ke._materialCache.addMaterial(Ke.EmissionMapType,{fabric:{type:Ke.EmissionMapType,uniforms:{image:Ke.DefaultImageId,channels:"rgb",repeat:new D(1,1)},components:{emission:"texture(image, fract(repeat * materialInput.st)).channels"}},translucent:!1});Ke.BumpMapType="BumpMap";Ke._materialCache.addMaterial(Ke.BumpMapType,{fabric:{type:Ke.BumpMapType,uniforms:{image:Ke.DefaultImageId,channel:"r",strength:.8,repeat:new D(1,1)},source:PZ},translucent:!1});Ke.NormalMapType="NormalMap";Ke._materialCache.addMaterial(Ke.NormalMapType,{fabric:{type:Ke.NormalMapType,uniforms:{image:Ke.DefaultImageId,channels:"rgb",strength:.8,repeat:new D(1,1)},source:UZ},translucent:!1});Ke.GridType="Grid";Ke._materialCache.addMaterial(Ke.GridType,{fabric:{type:Ke.GridType,uniforms:{color:new Y(0,1,0,1),cellAlpha:.1,lineCount:new D(8,8),lineThickness:new D(1,1),lineOffset:new D(0,0)},source:kZ},translucent:function(e){let t=e.uniforms;return t.color.alpha<1||t.cellAlpha<1}});Ke.StripeType="Stripe";Ke._materialCache.addMaterial(Ke.StripeType,{fabric:{type:Ke.StripeType,uniforms:{horizontal:!0,evenColor:new Y(1,1,1,.5),oddColor:new Y(0,0,1,.5),offset:0,repeat:5},source:KZ},translucent:function(e){let t=e.uniforms;return t.evenColor.alpha<1||t.oddColor.alpha<1}});Ke.CheckerboardType="Checkerboard";Ke._materialCache.addMaterial(Ke.CheckerboardType,{fabric:{type:Ke.CheckerboardType,uniforms:{lightColor:new Y(1,1,1,.5),darkColor:new Y(0,0,0,.5),repeat:new D(5,5)},source:vZ},translucent:function(e){let t=e.uniforms;return t.lightColor.alpha<1||t.darkColor.alpha<1}});Ke.DotType="Dot";Ke._materialCache.addMaterial(Ke.DotType,{fabric:{type:Ke.DotType,uniforms:{lightColor:new Y(1,1,0,.75),darkColor:new Y(0,1,1,.75),repeat:new D(5,5)},source:wZ},translucent:function(e){let t=e.uniforms;return t.lightColor.alpha<1||t.darkColor.alpha<1}});Ke.WaterType="Water";Ke._materialCache.addMaterial(Ke.WaterType,{fabric:{type:Ke.WaterType,uniforms:{baseWaterColor:new Y(.2,.3,.6,1),blendColor:new Y(0,1,.699,1),specularMap:Ke.DefaultImageId,normalMap:Ke.DefaultImageId,frequency:10,animationSpeed:.01,amplitude:1,specularIntensity:.5,fadeFactor:1},source:JZ},translucent:function(e){let t=e.uniforms;return t.baseWaterColor.alpha<1||t.blendColor.alpha<1}});Ke.RimLightingType="RimLighting";Ke._materialCache.addMaterial(Ke.RimLightingType,{fabric:{type:Ke.RimLightingType,uniforms:{color:new Y(1,0,0,.7),rimColor:new Y(1,1,1,.4),width:.3},source:HZ},translucent:function(e){let t=e.uniforms;return t.color.alpha<1||t.rimColor.alpha<1}});Ke.FadeType="Fade";Ke._materialCache.addMaterial(Ke.FadeType,{fabric:{type:Ke.FadeType,uniforms:{fadeInColor:new Y(1,0,0,1),fadeOutColor:new Y(0,0,0,0),maximumDistance:.5,repeat:!0,fadeDirection:{x:!0,y:!0},time:new D(.5,.5)},source:NZ},translucent:function(e){let t=e.uniforms;return t.fadeInColor.alpha<1||t.fadeOutColor.alpha<1}});Ke.PolylineArrowType="PolylineArrow";Ke._materialCache.addMaterial(Ke.PolylineArrowType,{fabric:{type:Ke.PolylineArrowType,uniforms:{color:new Y(1,1,1,1)},source:DZ},translucent:!0});Ke.PolylineDashType="PolylineDash";Ke._materialCache.addMaterial(Ke.PolylineDashType,{fabric:{type:Ke.PolylineDashType,uniforms:{color:new Y(1,0,1,1),gapColor:new Y(0,0,0,0),dashLength:16,dashPattern:255},source:BZ},translucent:!0});Ke.PolylineGlowType="PolylineGlow";Ke._materialCache.addMaterial(Ke.PolylineGlowType,{fabric:{type:Ke.PolylineGlowType,uniforms:{color:new Y(0,.5,1,1),glowPower:.25,taperPower:1},source:YZ},translucent:!0});Ke.PolylineOutlineType="PolylineOutline";Ke._materialCache.addMaterial(Ke.PolylineOutlineType,{fabric:{type:Ke.PolylineOutlineType,uniforms:{color:new Y(1,1,1,1),outlineColor:new Y(1,0,0,1),outlineWidth:1},source:OZ},translucent:function(e){let t=e.uniforms;return t.color.alpha<1||t.outlineColor.alpha<1}});Ke.ElevationContourType="ElevationContour";Ke._materialCache.addMaterial(Ke.ElevationContourType,{fabric:{type:Ke.ElevationContourType,uniforms:{spacing:100,color:new Y(1,0,0,1),width:1},source:AZ},translucent:!1});Ke.ElevationRampType="ElevationRamp";Ke._materialCache.addMaterial(Ke.ElevationRampType,{fabric:{type:Ke.ElevationRampType,uniforms:{image:Ke.DefaultImageId,minimumHeight:0,maximumHeight:1e4},source:MZ},translucent:!1});Ke.SlopeRampMaterialType="SlopeRamp";Ke._materialCache.addMaterial(Ke.SlopeRampMaterialType,{fabric:{type:Ke.SlopeRampMaterialType,uniforms:{image:Ke.DefaultImageId},source:zZ},translucent:!1});Ke.AspectRampMaterialType="AspectRamp";Ke._materialCache.addMaterial(Ke.AspectRampMaterialType,{fabric:{type:Ke.AspectRampMaterialType,uniforms:{image:Ke.DefaultImageId},source:WZ},translucent:!1});Ke.ElevationBandType="ElevationBand";Ke._materialCache.addMaterial(Ke.ElevationBandType,{fabric:{type:Ke.ElevationBandType,uniforms:{heights:Ke.DefaultImageId,colors:Ke.DefaultImageId},source:FZ},translucent:!0});var Mi=Ke;function Kx(e){e=y(e,y.EMPTY_OBJECT);let t=y(e.translucent,!0),n=y(e.closed,!1),i=y(e.materialSupport,Kx.MaterialSupport.TEXTURED);this.material=l(e.material)?e.material:Mi.fromType(Mi.ColorType),this.translucent=t,this._vertexShaderSource=y(e.vertexShaderSource,i.vertexShaderSource),this._fragmentShaderSource=y(e.fragmentShaderSource,i.fragmentShaderSource),this._renderState=eo.getDefaultRenderState(t,n,e.renderState),this._closed=n,this._materialSupport=i,this._vertexFormat=i.vertexFormat,this._flat=y(e.flat,!1),this._faceForward=y(e.faceForward,!n)}Object.defineProperties(Kx.prototype,{vertexShaderSource:{get:function(){return this._vertexShaderSource}},fragmentShaderSource:{get:function(){return this._fragmentShaderSource}},renderState:{get:function(){return this._renderState}},closed:{get:function(){return this._closed}},materialSupport:{get:function(){return this._materialSupport}},vertexFormat:{get:function(){return this._vertexFormat}},flat:{get:function(){return this._flat}},faceForward:{get:function(){return this._faceForward}}});Kx.prototype.getFragmentShaderSource=eo.prototype.getFragmentShaderSource;Kx.prototype.isTranslucent=eo.prototype.isTranslucent;Kx.prototype.getRenderState=eo.prototype.getRenderState;Kx.MaterialSupport={BASIC:Object.freeze({vertexFormat:We.POSITION_AND_NORMAL,vertexShaderSource:ZZ,fragmentShaderSource:RZ}),TEXTURED:Object.freeze({vertexFormat:We.POSITION_NORMAL_AND_ST,vertexShaderSource:EZ,fragmentShaderSource:GZ}),ALL:Object.freeze({vertexFormat:We.ALL,vertexShaderSource:LZ,fragmentShaderSource:VZ})};var ro=Kx;var Ien=T(S(),1);var ben=T(S(),1),jZ=`in vec3 v_positionEC; in vec3 v_normalEC; in vec4 v_color; void main() { vec3 positionToEyeEC = -v_positionEC; vec3 normalEC = normalize(v_normalEC); #ifdef FACE_FORWARD normalEC = faceforward(normalEC, vec3(0.0, 0.0, 1.0), -normalEC); #endif vec4 color = czm_gammaCorrect(v_color); czm_materialInput materialInput; materialInput.normalEC = normalEC; materialInput.positionToEyeEC = positionToEyeEC; czm_material material = czm_getDefaultMaterial(materialInput); material.diffuse = color.rgb; material.alpha = color.a; out_FragColor = czm_phong(normalize(positionToEyeEC), material, czm_lightDirectionEC); } `;var yen=T(S(),1),qZ=`in vec3 position3DHigh; in vec3 position3DLow; in vec3 normal; in vec4 color; in float batchId; out vec3 v_positionEC; out vec3 v_normalEC; out vec4 v_color; void main() { vec4 p = czm_computePosition(); v_positionEC = (czm_modelViewRelativeToEye * p).xyz; // position in eye coordinates v_normalEC = czm_normal * normal; // normal in eye coordinates v_color = color; gl_Position = czm_modelViewProjectionRelativeToEye * p; } `;var _en=T(S(),1),Jx=`in vec4 v_color; void main() { out_FragColor = czm_gammaCorrect(v_color); } `;var Sen=T(S(),1),$Z=`in vec3 position3DHigh; in vec3 position3DLow; in vec4 color; in float batchId; out vec4 v_color; void main() { vec4 p = czm_computePosition(); v_color = color; gl_Position = czm_modelViewProjectionRelativeToEye * p; } `;function Fp(e){e=y(e,y.EMPTY_OBJECT);let t=y(e.translucent,!0),n=y(e.closed,!1),i=y(e.flat,!1),o=i?$Z:qZ,r=i?Jx:jZ,s=i?Fp.FLAT_VERTEX_FORMAT:Fp.VERTEX_FORMAT;this.material=void 0,this.translucent=t,this._vertexShaderSource=y(e.vertexShaderSource,o),this._fragmentShaderSource=y(e.fragmentShaderSource,r),this._renderState=eo.getDefaultRenderState(t,n,e.renderState),this._closed=n,this._vertexFormat=s,this._flat=i,this._faceForward=y(e.faceForward,!n)}Object.defineProperties(Fp.prototype,{vertexShaderSource:{get:function(){return this._vertexShaderSource}},fragmentShaderSource:{get:function(){return this._fragmentShaderSource}},renderState:{get:function(){return this._renderState}},closed:{get:function(){return this._closed}},vertexFormat:{get:function(){return this._vertexFormat}},flat:{get:function(){return this._flat}},faceForward:{get:function(){return this._faceForward}}});Fp.VERTEX_FORMAT=We.POSITION_AND_NORMAL;Fp.FLAT_VERTEX_FORMAT=We.POSITION_ONLY;Fp.prototype.getFragmentShaderSource=eo.prototype.getFragmentShaderSource;Fp.prototype.isTranslucent=eo.prototype.isTranslucent;Fp.prototype.getRenderState=eo.prototype.getRenderState;var dn=Fp;var Men=T(S(),1);function MC(e){this._definitionChanged=new ge,this._color=void 0,this._colorSubscription=void 0,this.color=e}Object.defineProperties(MC.prototype,{isConstant:{get:function(){return K.isConstant(this._color)}},definitionChanged:{get:function(){return this._definitionChanged}},color:de("color")});MC.prototype.getType=function(e){return"Color"};MC.prototype.getValue=function(e,t){return l(t)||(t={}),t.color=K.getValueOrClonedDefault(this._color,e,Y.WHITE,t.color),t};MC.prototype.equals=function(e){return this===e||e instanceof MC&&K.equals(this._color,e._color)};var Ut=MC;var mhn=T(S(),1);var Hmn=T(S(),1);var Gmn=T(S(),1);var Ben=T(S(),1);var fr={CULL:1,OCCLUDE:2,EXECUTE_IN_CLOSEST_FRUSTUM:4,DEBUG_SHOW_BOUNDING_VOLUME:8,CAST_SHADOWS:16,RECEIVE_SHADOWS:32,PICK_ONLY:64,DEPTH_FOR_TRANSLUCENT_CLASSIFICATION:128};function eG(e){e=y(e,y.EMPTY_OBJECT),this._boundingVolume=e.boundingVolume,this._orientedBoundingBox=e.orientedBoundingBox,this._modelMatrix=e.modelMatrix,this._primitiveType=y(e.primitiveType,Fe.TRIANGLES),this._vertexArray=e.vertexArray,this._count=e.count,this._offset=y(e.offset,0),this._instanceCount=y(e.instanceCount,0),this._shaderProgram=e.shaderProgram,this._uniformMap=e.uniformMap,this._renderState=e.renderState,this._framebuffer=e.framebuffer,this._pass=e.pass,this._owner=e.owner,this._debugOverlappingFrustums=0,this._pickId=e.pickId,this._flags=0,this.cull=y(e.cull,!0),this.occlude=y(e.occlude,!0),this.executeInClosestFrustum=y(e.executeInClosestFrustum,!1),this.debugShowBoundingVolume=y(e.debugShowBoundingVolume,!1),this.castShadows=y(e.castShadows,!1),this.receiveShadows=y(e.receiveShadows,!1),this.pickOnly=y(e.pickOnly,!1),this.depthForTranslucentClassification=y(e.depthForTranslucentClassification,!1),this.dirty=!0,this.lastDirtyTime=0,this.derivedCommands={}}function ac(e,t){return(e._flags&t)===t}function mg(e,t,n){n?e._flags|=t:e._flags&=~t}Object.defineProperties(eG.prototype,{boundingVolume:{get:function(){return this._boundingVolume},set:function(e){this._boundingVolume!==e&&(this._boundingVolume=e,this.dirty=!0)}},orientedBoundingBox:{get:function(){return this._orientedBoundingBox},set:function(e){this._orientedBoundingBox!==e&&(this._orientedBoundingBox=e,this.dirty=!0)}},cull:{get:function(){return ac(this,fr.CULL)},set:function(e){ac(this,fr.CULL)!==e&&(mg(this,fr.CULL,e),this.dirty=!0)}},occlude:{get:function(){return ac(this,fr.OCCLUDE)},set:function(e){ac(this,fr.OCCLUDE)!==e&&(mg(this,fr.OCCLUDE,e),this.dirty=!0)}},modelMatrix:{get:function(){return this._modelMatrix},set:function(e){this._modelMatrix!==e&&(this._modelMatrix=e,this.dirty=!0)}},primitiveType:{get:function(){return this._primitiveType},set:function(e){this._primitiveType!==e&&(this._primitiveType=e,this.dirty=!0)}},vertexArray:{get:function(){return this._vertexArray},set:function(e){this._vertexArray!==e&&(this._vertexArray=e,this.dirty=!0)}},count:{get:function(){return this._count},set:function(e){this._count!==e&&(this._count=e,this.dirty=!0)}},offset:{get:function(){return this._offset},set:function(e){this._offset!==e&&(this._offset=e,this.dirty=!0)}},instanceCount:{get:function(){return this._instanceCount},set:function(e){this._instanceCount!==e&&(this._instanceCount=e,this.dirty=!0)}},shaderProgram:{get:function(){return this._shaderProgram},set:function(e){this._shaderProgram!==e&&(this._shaderProgram=e,this.dirty=!0)}},castShadows:{get:function(){return ac(this,fr.CAST_SHADOWS)},set:function(e){ac(this,fr.CAST_SHADOWS)!==e&&(mg(this,fr.CAST_SHADOWS,e),this.dirty=!0)}},receiveShadows:{get:function(){return ac(this,fr.RECEIVE_SHADOWS)},set:function(e){ac(this,fr.RECEIVE_SHADOWS)!==e&&(mg(this,fr.RECEIVE_SHADOWS,e),this.dirty=!0)}},uniformMap:{get:function(){return this._uniformMap},set:function(e){this._uniformMap!==e&&(this._uniformMap=e,this.dirty=!0)}},renderState:{get:function(){return this._renderState},set:function(e){this._renderState!==e&&(this._renderState=e,this.dirty=!0)}},framebuffer:{get:function(){return this._framebuffer},set:function(e){this._framebuffer!==e&&(this._framebuffer=e,this.dirty=!0)}},pass:{get:function(){return this._pass},set:function(e){this._pass!==e&&(this._pass=e,this.dirty=!0)}},executeInClosestFrustum:{get:function(){return ac(this,fr.EXECUTE_IN_CLOSEST_FRUSTUM)},set:function(e){ac(this,fr.EXECUTE_IN_CLOSEST_FRUSTUM)!==e&&(mg(this,fr.EXECUTE_IN_CLOSEST_FRUSTUM,e),this.dirty=!0)}},owner:{get:function(){return this._owner},set:function(e){this._owner!==e&&(this._owner=e,this.dirty=!0)}},debugShowBoundingVolume:{get:function(){return ac(this,fr.DEBUG_SHOW_BOUNDING_VOLUME)},set:function(e){ac(this,fr.DEBUG_SHOW_BOUNDING_VOLUME)!==e&&(mg(this,fr.DEBUG_SHOW_BOUNDING_VOLUME,e),this.dirty=!0)}},debugOverlappingFrustums:{get:function(){return this._debugOverlappingFrustums},set:function(e){this._debugOverlappingFrustums!==e&&(this._debugOverlappingFrustums=e,this.dirty=!0)}},pickId:{get:function(){return this._pickId},set:function(e){this._pickId!==e&&(this._pickId=e,this.dirty=!0)}},pickOnly:{get:function(){return ac(this,fr.PICK_ONLY)},set:function(e){ac(this,fr.PICK_ONLY)!==e&&(mg(this,fr.PICK_ONLY,e),this.dirty=!0)}},depthForTranslucentClassification:{get:function(){return ac(this,fr.DEPTH_FOR_TRANSLUCENT_CLASSIFICATION)},set:function(e){ac(this,fr.DEPTH_FOR_TRANSLUCENT_CLASSIFICATION)!==e&&(mg(this,fr.DEPTH_FOR_TRANSLUCENT_CLASSIFICATION,e),this.dirty=!0)}}});eG.shallowClone=function(e,t){if(l(e))return l(t)||(t=new eG),t._boundingVolume=e._boundingVolume,t._orientedBoundingBox=e._orientedBoundingBox,t._modelMatrix=e._modelMatrix,t._primitiveType=e._primitiveType,t._vertexArray=e._vertexArray,t._count=e._count,t._offset=e._offset,t._instanceCount=e._instanceCount,t._shaderProgram=e._shaderProgram,t._uniformMap=e._uniformMap,t._renderState=e._renderState,t._framebuffer=e._framebuffer,t._pass=e._pass,t._owner=e._owner,t._debugOverlappingFrustums=e._debugOverlappingFrustums,t._pickId=e._pickId,t._flags=e._flags,t.dirty=!0,t.lastDirtyTime=0,t};eG.prototype.execute=function(e,t){e.draw(this,t)};var et=eG;var Oen=T(S(),1),s9e={ENVIRONMENT:0,COMPUTE:1,GLOBE:2,TERRAIN_CLASSIFICATION:3,CESIUM_3D_TILE:4,CESIUM_3D_TILE_CLASSIFICATION:5,CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW:6,OPAQUE:7,TRANSLUCENT:8,VOXELS:9,OVERLAY:10,NUMBER_OF_PASSES:11},Re=Object.freeze(s9e);var ttn=T(S(),1);var zen=T(S(),1);function Hre(e){if(typeof e!="object"||e===null)return e;let t,n=Object.keys(e);for(let i=0;i0&&console.log(`${df}Vertex shader compile log: ${c}`),c=e.getShaderInfoLog(r),l(c)&&c.length>0&&console.log(`${df}Fragment shader compile log: ${c}`),c=e.getProgramInfoLog(s),l(c)&&c.length>0&&console.log(`${df}Shader program link log: ${c}`)),e.deleteShader(o),e.deleteShader(r),s;let d,u=t._debugShaders;throw e.getShaderParameter(r,e.COMPILE_STATUS)?e.getShaderParameter(o,e.COMPILE_STATUS)?(c=e.getProgramInfoLog(s),console.error(`${df}Shader program link log: ${c}`),m(o,"vertex"),m(r,"fragment"),d=`Program failed to link. Link log: ${c}`):(c=e.getShaderInfoLog(o),console.error(`${df}Vertex shader compile log: ${c}`),console.error(`${df} Vertex shader source: ${n}`),d=`Vertex shader failed to compile. Compile log: ${c}`):(c=e.getShaderInfoLog(r),console.error(`${df}Fragment shader compile log: ${c}`),console.error(`${df} Fragment shader source: ${i}`),d=`Fragment shader failed to compile. Compile log: ${c}`),e.deleteShader(o),e.deleteShader(r),e.deleteProgram(s),new ue(d);function m(p,g){if(!l(u))return;let f=u.getTranslatedShaderSource(p);if(f===""){console.error(`${df}${g} shader translation failed.`);return}console.error(`${df}Translated ${g} shaderSource: ${f}`)}}function T9e(e,t,n){let i={};for(let o=0;o=0){if(u=n[d.slice(0,f)],!l(u))continue;m=u._locations,m.length<=1&&(p=u.value,g=e.getUniformLocation(t,d),g!==null&&(m.push(g),p.push(e.getUniform(t,g))))}else{m=[];for(let x=0;x abs(x), czm_piOverTwo - t, t); t = czm_branchFreeTernary(x < 0.0, czm_pi - t, t); t = czm_branchFreeTernary(y < 0.0, -t, t); return t; } `;var Mon=T(S(),1),EE=`/** * Gets the color with fog at a distance from the camera. * * @name czm_fog * @glslFunction * * @param {float} distanceToCamera The distance to the camera in meters. * @param {vec3} color The original color. * @param {vec3} fogColor The color of the fog. * * @returns {vec3} The color adjusted for fog at the distance from the camera. */ vec3 czm_fog(float distanceToCamera, vec3 color, vec3 fogColor) { float scalar = distanceToCamera * czm_fogDensity; float fog = 1.0 - exp(-(scalar * scalar)); return mix(color, fogColor, fog); } /** * Gets the color with fog at a distance from the camera. * * @name czm_fog * @glslFunction * * @param {float} distanceToCamera The distance to the camera in meters. * @param {vec3} color The original color. * @param {vec3} fogColor The color of the fog. * @param {float} fogModifierConstant A constant to modify the appearance of fog. * * @returns {vec3} The color adjusted for fog at the distance from the camera. */ vec3 czm_fog(float distanceToCamera, vec3 color, vec3 fogColor, float fogModifierConstant) { float scalar = distanceToCamera * czm_fogDensity; float fog = 1.0 - exp(-((fogModifierConstant * scalar + fogModifierConstant) * (scalar * (1.0 + fogModifierConstant)))); return mix(color, fogColor, fog); } `;var kon=T(S(),1),XE=`/** * Converts a color from RGB space to linear space. * * @name czm_gammaCorrect * @glslFunction * * @param {vec3} color The color in RGB space. * @returns {vec3} The color in linear space. */ vec3 czm_gammaCorrect(vec3 color) { #ifdef HDR color = pow(color, vec3(czm_gamma)); #endif return color; } vec4 czm_gammaCorrect(vec4 color) { #ifdef HDR color.rgb = pow(color.rgb, vec3(czm_gamma)); #endif return color; } `;var Don=T(S(),1),IE=`/** * DOC_TBA * * @name czm_geodeticSurfaceNormal * @glslFunction * * @param {vec3} positionOnEllipsoid DOC_TBA * @param {vec3} ellipsoidCenter DOC_TBA * @param {vec3} oneOverEllipsoidRadiiSquared DOC_TBA * * @returns {vec3} DOC_TBA. */ vec3 czm_geodeticSurfaceNormal(vec3 positionOnEllipsoid, vec3 ellipsoidCenter, vec3 oneOverEllipsoidRadiiSquared) { return normalize((positionOnEllipsoid - ellipsoidCenter) * oneOverEllipsoidRadiiSquared); } `;var Yon=T(S(),1),WE=`/** * An czm_material with default values. Every material's czm_getMaterial * should use this default material as a base for the material it returns. * The default normal value is given by materialInput.normalEC. * * @name czm_getDefaultMaterial * @glslFunction * * @param {czm_materialInput} input The input used to construct the default material. * * @returns {czm_material} The default material. * * @see czm_materialInput * @see czm_material * @see czm_getMaterial */ czm_material czm_getDefaultMaterial(czm_materialInput materialInput) { czm_material material; material.diffuse = vec3(0.0); material.specular = 0.0; material.shininess = 1.0; material.normal = materialInput.normalEC; material.emission = vec3(0.0); material.alpha = 1.0; return material; } `;var Hon=T(S(),1),PE=`/** * Select which direction vector to use for dynamic atmosphere lighting based on an enum value * * @name czm_getDynamicAtmosphereLightDirection * @glslfunction * @see DynamicAtmosphereLightingType.js * * @param {vec3} positionWC the position of the vertex/fragment in world coordinates. This is normalized and returned when dynamic lighting is turned off. * @param {float} lightEnum The enum value for selecting between light sources. * @return {vec3} The normalized light direction vector. Depending on the enum value, it is either positionWC, czm_lightDirectionWC or czm_sunDirectionWC */ vec3 czm_getDynamicAtmosphereLightDirection(vec3 positionWC, float lightEnum) { const float NONE = 0.0; const float SCENE_LIGHT = 1.0; const float SUNLIGHT = 2.0; vec3 lightDirection = positionWC * float(lightEnum == NONE) + czm_lightDirectionWC * float(lightEnum == SCENE_LIGHT) + czm_sunDirectionWC * float(lightEnum == SUNLIGHT); return normalize(lightDirection); } `;var Kon=T(S(),1),vE=`/** * Calculates the intensity of diffusely reflected light. * * @name czm_getLambertDiffuse * @glslFunction * * @param {vec3} lightDirectionEC Unit vector pointing to the light source in eye coordinates. * @param {vec3} normalEC The surface normal in eye coordinates. * * @returns {float} The intensity of the diffuse reflection. * * @see czm_phong * * @example * float diffuseIntensity = czm_getLambertDiffuse(lightDirectionEC, normalEC); * float specularIntensity = czm_getSpecular(lightDirectionEC, toEyeEC, normalEC, 200); * vec3 color = (diffuseColor * diffuseIntensity) + (specularColor * specularIntensity); */ float czm_getLambertDiffuse(vec3 lightDirectionEC, vec3 normalEC) { return max(dot(lightDirectionEC, normalEC), 0.0); } `;var Qon=T(S(),1),wE=`/** * Calculates the specular intensity of reflected light. * * @name czm_getSpecular * @glslFunction * * @param {vec3} lightDirectionEC Unit vector pointing to the light source in eye coordinates. * @param {vec3} toEyeEC Unit vector pointing to the eye position in eye coordinates. * @param {vec3} normalEC The surface normal in eye coordinates. * @param {float} shininess The sharpness of the specular reflection. Higher values create a smaller, more focused specular highlight. * * @returns {float} The intensity of the specular highlight. * * @see czm_phong * * @example * float diffuseIntensity = czm_getLambertDiffuse(lightDirectionEC, normalEC); * float specularIntensity = czm_getSpecular(lightDirectionEC, toEyeEC, normalEC, 200); * vec3 color = (diffuseColor * diffuseIntensity) + (specularColor * specularIntensity); */ float czm_getSpecular(vec3 lightDirectionEC, vec3 toEyeEC, vec3 normalEC, float shininess) { vec3 toReflectedLight = reflect(-lightDirectionEC, normalEC); float specular = max(dot(toReflectedLight, toEyeEC), 0.0); // pow has undefined behavior if both parameters <= 0. // Prevent this by making sure shininess is at least czm_epsilon2. return pow(specular, max(shininess, czm_epsilon2)); } `;var qon=T(S(),1),FE=`/** * @private */ vec4 czm_getWaterNoise(sampler2D normalMap, vec2 uv, float time, float angleInRadians) { float cosAngle = cos(angleInRadians); float sinAngle = sin(angleInRadians); // time dependent sampling directions vec2 s0 = vec2(1.0/17.0, 0.0); vec2 s1 = vec2(-1.0/29.0, 0.0); vec2 s2 = vec2(1.0/101.0, 1.0/59.0); vec2 s3 = vec2(-1.0/109.0, -1.0/57.0); // rotate sampling direction by specified angle s0 = vec2((cosAngle * s0.x) - (sinAngle * s0.y), (sinAngle * s0.x) + (cosAngle * s0.y)); s1 = vec2((cosAngle * s1.x) - (sinAngle * s1.y), (sinAngle * s1.x) + (cosAngle * s1.y)); s2 = vec2((cosAngle * s2.x) - (sinAngle * s2.y), (sinAngle * s2.x) + (cosAngle * s2.y)); s3 = vec2((cosAngle * s3.x) - (sinAngle * s3.y), (sinAngle * s3.x) + (cosAngle * s3.y)); vec2 uv0 = (uv/103.0) + (time * s0); vec2 uv1 = uv/107.0 + (time * s1) + vec2(0.23); vec2 uv2 = uv/vec2(897.0, 983.0) + (time * s2) + vec2(0.51); vec2 uv3 = uv/vec2(991.0, 877.0) + (time * s3) + vec2(0.71); uv0 = fract(uv0); uv1 = fract(uv1); uv2 = fract(uv2); uv3 = fract(uv3); vec4 noise = (texture(normalMap, uv0)) + (texture(normalMap, uv1)) + (texture(normalMap, uv2)) + (texture(normalMap, uv3)); // average and scale to between -1 and 1 return ((noise / 4.0) - 0.5) * 2.0; } `;var ern=T(S(),1),AE=`/** * Adjusts the hue of a color. * * @name czm_hue * @glslFunction * * @param {vec3} rgb The color. * @param {float} adjustment The amount to adjust the hue of the color in radians. * * @returns {float} The color with the hue adjusted. * * @example * vec3 adjustHue = czm_hue(color, czm_pi); // The same as czm_hue(color, -czm_pi) */ vec3 czm_hue(vec3 rgb, float adjustment) { const mat3 toYIQ = mat3(0.299, 0.587, 0.114, 0.595716, -0.274453, -0.321263, 0.211456, -0.522591, 0.311135); const mat3 toRGB = mat3(1.0, 0.9563, 0.6210, 1.0, -0.2721, -0.6474, 1.0, -1.107, 1.7046); vec3 yiq = toYIQ * rgb; float hue = atan(yiq.z, yiq.y) + adjustment; float chroma = sqrt(yiq.z * yiq.z + yiq.y * yiq.y); vec3 color = vec3(yiq.x, chroma * cos(hue), chroma * sin(hue)); return toRGB * color; } `;var nrn=T(S(),1),ME=`/** * Converts a color in linear space to RGB space. * * @name czm_inverseGamma * @glslFunction * * @param {vec3} color The color in linear space. * @returns {vec3} The color in RGB space. */ vec3 czm_inverseGamma(vec3 color) { return pow(color, vec3(1.0 / czm_gamma)); } `;var orn=T(S(),1),NE=`/** * Determines if a time interval is empty. * * @name czm_isEmpty * @glslFunction * * @param {czm_raySegment} interval The interval to test. * * @returns {bool} true if the time interval is empty; otherwise, false. * * @example * bool b0 = czm_isEmpty(czm_emptyRaySegment); // true * bool b1 = czm_isEmpty(czm_raySegment(0.0, 1.0)); // false * bool b2 = czm_isEmpty(czm_raySegment(1.0, 1.0)); // false, contains 1.0. */ bool czm_isEmpty(czm_raySegment interval) { return (interval.stop < 0.0); } `;var srn=T(S(),1),kE=`/** * Determines if a time interval is empty. * * @name czm_isFull * @glslFunction * * @param {czm_raySegment} interval The interval to test. * * @returns {bool} true if the time interval is empty; otherwise, false. * * @example * bool b0 = czm_isEmpty(czm_emptyRaySegment); // true * bool b1 = czm_isEmpty(czm_raySegment(0.0, 1.0)); // false * bool b2 = czm_isEmpty(czm_raySegment(1.0, 1.0)); // false, contains 1.0. */ bool czm_isFull(czm_raySegment interval) { return (interval.start == 0.0 && interval.stop == czm_infinity); } `;var crn=T(S(),1),UE=`/** * Computes the fraction of a Web Wercator rectangle at which a given geodetic latitude is located. * * @name czm_latitudeToWebMercatorFraction * @glslFunction * * @param {float} latitude The geodetic latitude, in radians. * @param {float} southMercatorY The Web Mercator coordinate of the southern boundary of the rectangle. * @param {float} oneOverMercatorHeight The total height of the rectangle in Web Mercator coordinates. * * @returns {float} The fraction of the rectangle at which the latitude occurs. If the latitude is the southern * boundary of the rectangle, the return value will be zero. If it is the northern boundary, the return * value will be 1.0. Latitudes in between are mapped according to the Web Mercator projection. */ float czm_latitudeToWebMercatorFraction(float latitude, float southMercatorY, float oneOverMercatorHeight) { float sinLatitude = sin(latitude); float mercatorY = 0.5 * log((1.0 + sinLatitude) / (1.0 - sinLatitude)); return (mercatorY - southMercatorY) * oneOverMercatorHeight; } `;var drn=T(S(),1),DE=`/** * Computes distance from an point in 2D to a line in 2D. * * @name czm_lineDistance * @glslFunction * * param {vec2} point1 A point along the line. * param {vec2} point2 A point along the line. * param {vec2} point A point that may or may not be on the line. * returns {float} The distance from the point to the line. */ float czm_lineDistance(vec2 point1, vec2 point2, vec2 point) { return abs((point2.y - point1.y) * point.x - (point2.x - point1.x) * point.y + point2.x * point1.y - point2.y * point1.x) / distance(point2, point1); } `;var mrn=T(S(),1),BE=`/** * Converts a linear RGB color to an sRGB color. * * @param {vec3|vec4} linearIn The color in linear color space. * @returns {vec3|vec4} The color in sRGB color space. The vector type matches the input. */ vec3 czm_linearToSrgb(vec3 linearIn) { return pow(linearIn, vec3(1.0/2.2)); } vec4 czm_linearToSrgb(vec4 linearIn) { vec3 srgbOut = pow(linearIn.rgb, vec3(1.0/2.2)); return vec4(srgbOut, linearIn.a); } `;var frn=T(S(),1),YE=`/** * Computes the luminance of a color. * * @name czm_luminance * @glslFunction * * @param {vec3} rgb The color. * * @returns {float} The luminance. * * @example * float light = czm_luminance(vec3(0.0)); // 0.0 * float dark = czm_luminance(vec3(1.0)); // ~1.0 */ float czm_luminance(vec3 rgb) { // Algorithm from Chapter 10 of Graphics Shaders. const vec3 W = vec3(0.2125, 0.7154, 0.0721); return dot(rgb, W); } `;var brn=T(S(),1),OE=`/** * Find the maximum component of a vector. * * @name czm_maximumComponent * @glslFunction * * @param {vec2|vec3|vec4} v The input vector. * @returns {float} The value of the largest component. */ float czm_maximumComponent(vec2 v) { return max(v.x, v.y); } float czm_maximumComponent(vec3 v) { return max(max(v.x, v.y), v.z); } float czm_maximumComponent(vec4 v) { return max(max(max(v.x, v.y), v.z), v.w); } `;var yrn=T(S(),1),HE=`/** * Computes the size of a pixel in meters at a distance from the eye. *

* Use this version when passing in a custom pixel ratio. For example, passing in 1.0 will return meters per native device pixel. *

* @name czm_metersPerPixel * @glslFunction * * @param {vec3} positionEC The position to get the meters per pixel in eye coordinates. * @param {float} pixelRatio The scaling factor from pixel space to coordinate space * * @returns {float} The meters per pixel at positionEC. */ float czm_metersPerPixel(vec4 positionEC, float pixelRatio) { float width = czm_viewport.z; float height = czm_viewport.w; float pixelWidth; float pixelHeight; float top = czm_frustumPlanes.x; float bottom = czm_frustumPlanes.y; float left = czm_frustumPlanes.z; float right = czm_frustumPlanes.w; if (czm_sceneMode == czm_sceneMode2D || czm_orthographicIn3D == 1.0) { float frustumWidth = right - left; float frustumHeight = top - bottom; pixelWidth = frustumWidth / width; pixelHeight = frustumHeight / height; } else { float distanceToPixel = -positionEC.z; float inverseNear = 1.0 / czm_currentFrustum.x; float tanTheta = top * inverseNear; pixelHeight = 2.0 * distanceToPixel * tanTheta / height; tanTheta = right * inverseNear; pixelWidth = 2.0 * distanceToPixel * tanTheta / width; } return max(pixelWidth, pixelHeight) * pixelRatio; } /** * Computes the size of a pixel in meters at a distance from the eye. *

* Use this version when scaling by pixel ratio. *

* @name czm_metersPerPixel * @glslFunction * * @param {vec3} positionEC The position to get the meters per pixel in eye coordinates. * * @returns {float} The meters per pixel at positionEC. */ float czm_metersPerPixel(vec4 positionEC) { return czm_metersPerPixel(positionEC, czm_pixelRatio); } `;var _rn=T(S(),1),zE=`/** * Transforms a position from model to window coordinates. The transformation * from model to clip coordinates is done using {@link czm_modelViewProjection}. * The transform from normalized device coordinates to window coordinates is * done using {@link czm_viewportTransformation}, which assumes a depth range * of near = 0 and far = 1. *

* This transform is useful when there is a need to manipulate window coordinates * in a vertex shader as done by {@link BillboardCollection}. *

* This function should not be confused with {@link czm_viewportOrthographic}, * which is an orthographic projection matrix that transforms from window * coordinates to clip coordinates. * * @name czm_modelToWindowCoordinates * @glslFunction * * @param {vec4} position The position in model coordinates to transform. * * @returns {vec4} The transformed position in window coordinates. * * @see czm_eyeToWindowCoordinates * @see czm_modelViewProjection * @see czm_viewportTransformation * @see czm_viewportOrthographic * @see BillboardCollection * * @example * vec4 positionWC = czm_modelToWindowCoordinates(positionMC); */ vec4 czm_modelToWindowCoordinates(vec4 position) { vec4 q = czm_modelViewProjection * position; // clip coordinates q.xyz /= q.w; // normalized device coordinates q.xyz = (czm_viewportTransformation * vec4(q.xyz, 1.0)).xyz; // window coordinates return q; } `;var Srn=T(S(),1),KE=`/** * DOC_TBA * * @name czm_multiplyWithColorBalance * @glslFunction */ vec3 czm_multiplyWithColorBalance(vec3 left, vec3 right) { // Algorithm from Chapter 10 of Graphics Shaders. const vec3 W = vec3(0.2125, 0.7154, 0.0721); vec3 target = left * right; float leftLuminance = dot(left, W); float rightLuminance = dot(right, W); float targetLuminance = dot(target, W); return ((leftLuminance + rightLuminance) / (2.0 * targetLuminance)) * target; } `;var Vrn=T(S(),1),JE=`/** * Computes a value that scales with distance. The scaling is clamped at the near and * far distances, and does not extrapolate. This function works with the * {@link NearFarScalar} JavaScript class. * * @name czm_nearFarScalar * @glslFunction * * @param {vec4} nearFarScalar A vector with 4 components: Near distance (x), Near value (y), Far distance (z), Far value (w). * @param {float} cameraDistSq The square of the current distance from the camera. * * @returns {float} The value at this distance. */ float czm_nearFarScalar(vec4 nearFarScalar, float cameraDistSq) { float valueAtMin = nearFarScalar.y; float valueAtMax = nearFarScalar.w; float nearDistanceSq = nearFarScalar.x * nearFarScalar.x; float farDistanceSq = nearFarScalar.z * nearFarScalar.z; float t = (cameraDistSq - nearDistanceSq) / (farDistanceSq - nearDistanceSq); t = pow(clamp(t, 0.0, 1.0), 0.2); return mix(valueAtMin, valueAtMax, t); } `;var Rrn=T(S(),1),QE=` /** * Decodes a unit-length vector in 'oct' encoding to a normalized 3-component Cartesian vector. * The 'oct' encoding is described in "A Survey of Efficient Representations of Independent Unit Vectors", * Cigolle et al 2014: http://jcgt.org/published/0003/02/01/ * * @name czm_octDecode * @param {vec2} encoded The oct-encoded, unit-length vector * @param {float} range The maximum value of the SNORM range. The encoded vector is stored in log2(rangeMax+1) bits. * @returns {vec3} The decoded and normalized vector */ vec3 czm_octDecode(vec2 encoded, float range) { if (encoded.x == 0.0 && encoded.y == 0.0) { return vec3(0.0, 0.0, 0.0); } encoded = encoded / range * 2.0 - 1.0; vec3 v = vec3(encoded.x, encoded.y, 1.0 - abs(encoded.x) - abs(encoded.y)); if (v.z < 0.0) { v.xy = (1.0 - abs(v.yx)) * czm_signNotZero(v.xy); } return normalize(v); } /** * Decodes a unit-length vector in 'oct' encoding to a normalized 3-component Cartesian vector. * The 'oct' encoding is described in "A Survey of Efficient Representations of Independent Unit Vectors", * Cigolle et al 2014: http://jcgt.org/published/0003/02/01/ * * @name czm_octDecode * @param {vec2} encoded The oct-encoded, unit-length vector * @returns {vec3} The decoded and normalized vector */ vec3 czm_octDecode(vec2 encoded) { return czm_octDecode(encoded, 255.0); } /** * Decodes a unit-length vector in 'oct' encoding packed into a floating-point number to a normalized 3-component Cartesian vector. * The 'oct' encoding is described in "A Survey of Efficient Representations of Independent Unit Vectors", * Cigolle et al 2014: http://jcgt.org/published/0003/02/01/ * * @name czm_octDecode * @param {float} encoded The oct-encoded, unit-length vector * @returns {vec3} The decoded and normalized vector */ vec3 czm_octDecode(float encoded) { float temp = encoded / 256.0; float x = floor(temp); float y = (temp - x) * 256.0; return czm_octDecode(vec2(x, y)); } /** * Decodes three unit-length vectors in 'oct' encoding packed into two floating-point numbers to normalized 3-component Cartesian vectors. * The 'oct' encoding is described in "A Survey of Efficient Representations of Independent Unit Vectors", * Cigolle et al 2014: http://jcgt.org/published/0003/02/01/ * * @name czm_octDecode * @param {vec2} encoded The packed oct-encoded, unit-length vectors. * @param {vec3} vector1 One decoded and normalized vector. * @param {vec3} vector2 One decoded and normalized vector. * @param {vec3} vector3 One decoded and normalized vector. */ void czm_octDecode(vec2 encoded, out vec3 vector1, out vec3 vector2, out vec3 vector3) { float temp = encoded.x / 65536.0; float x = floor(temp); float encodedFloat1 = (temp - x) * 65536.0; temp = encoded.y / 65536.0; float y = floor(temp); float encodedFloat2 = (temp - y) * 65536.0; vector1 = czm_octDecode(encodedFloat1); vector2 = czm_octDecode(encodedFloat2); vector3 = czm_octDecode(vec2(x, y)); } `;var Grn=T(S(),1),jE=`/** * Packs a depth value into a vec3 that can be represented by unsigned bytes. * * @name czm_packDepth * @glslFunction * * @param {float} depth The floating-point depth. * @returns {vec3} The packed depth. */ vec4 czm_packDepth(float depth) { // See Aras Pranckevi\u010Dius' post Encoding Floats to RGBA // http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/ vec4 enc = vec4(1.0, 255.0, 65025.0, 16581375.0) * depth; enc = fract(enc); enc -= enc.yzww * vec4(1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0, 0.0); return enc; } `;var Xrn=T(S(),1),qE=`vec3 lambertianDiffuse(vec3 diffuseColor) { return diffuseColor / czm_pi; } vec3 fresnelSchlick2(vec3 f0, vec3 f90, float VdotH) { float versine = 1.0 - VdotH; // pow(versine, 5.0) is slow. See https://stackoverflow.com/a/68793086/10082269 float versineSquared = versine * versine; return f0 + (f90 - f0) * versineSquared * versineSquared * versine; } #ifdef USE_ANISOTROPY /** * @param {float} roughness Material roughness (along the anisotropy bitangent) * @param {float} tangentialRoughness Anisotropic roughness (along the anisotropy tangent) * @param {vec3} lightDirection The direction from the fragment to the light source, transformed to tangent-bitangent-normal coordinates * @param {vec3} viewDirection The direction from the fragment to the camera, transformed to tangent-bitangent-normal coordinates */ float smithVisibilityGGX_anisotropic(float roughness, float tangentialRoughness, vec3 lightDirection, vec3 viewDirection) { vec3 roughnessScale = vec3(tangentialRoughness, roughness, 1.0); float GGXV = lightDirection.z * length(roughnessScale * viewDirection); float GGXL = viewDirection.z * length(roughnessScale * lightDirection); float v = 0.5 / (GGXV + GGXL); return clamp(v, 0.0, 1.0); } /** * @param {float} roughness Material roughness (along the anisotropy bitangent) * @param {float} tangentialRoughness Anisotropic roughness (along the anisotropy tangent) * @param {vec3} halfwayDirection The unit vector halfway between light and view directions, transformed to tangent-bitangent-normal coordinates */ float GGX_anisotropic(float roughness, float tangentialRoughness, vec3 halfwayDirection) { float roughnessSquared = roughness * tangentialRoughness; vec3 f = halfwayDirection * vec3(roughness, tangentialRoughness, roughnessSquared); float w2 = roughnessSquared / dot(f, f); return roughnessSquared * w2 * w2 / czm_pi; } #endif float smithVisibilityG1(float NdotV, float roughness) { // this is the k value for direct lighting. // for image based lighting it will be roughness^2 / 2 float k = (roughness + 1.0) * (roughness + 1.0) / 8.0; return NdotV / (NdotV * (1.0 - k) + k); } /** * Estimate the geometric self-shadowing of the microfacets in a surface, * using the Schlick GGX approximation of a Smith visibility function. * * @param {float} roughness The roughness of the material. * @param {float} NdotL The cosine of the angle between the surface normal and the direction to the light source. * @param {float} NdotV The cosine of the angle between the surface normal and the direction to the camera. */ float smithVisibilityGGX(float roughness, float NdotL, float NdotV) { // Avoid divide-by-zero errors NdotL = clamp(NdotL, 0.001, 1.0); NdotV += 0.001; return ( smithVisibilityG1(NdotL, roughness) * smithVisibilityG1(NdotV, roughness) ) / (4.0 * NdotL * NdotV); } /** * Estimate the fraction of the microfacets in a surface that are aligned with * the halfway vector, which is aligned halfway between the directions from * the fragment to the camera and from the fragment to the light source. * * @param {float} roughness The roughness of the material. * @param {float} NdotH The cosine of the angle between the surface normal and the halfway vector. * @return {float} The fraction of microfacets aligned to the halfway vector. */ float GGX(float roughness, float NdotH) { float roughnessSquared = roughness * roughness; float f = (NdotH * roughnessSquared - NdotH) * NdotH + 1.0; return roughnessSquared / (czm_pi * f * f); } /** * Compute the strength of the specular reflection due to direct lighting. * * @param {vec3} normal The surface normal. * @param {vec3} lightDirection The unit vector pointing from the fragment to the light source. * @param {vec3} viewDirection The unit vector pointing from the fragment to the camera. * @param {vec3} halfwayDirection The unit vector pointing from the fragment to halfway between the light source and the camera. * @param {float} roughness The roughness of the material. * @return {float} The strength of the specular reflection. */ float computeDirectSpecularStrength(vec3 normal, vec3 lightDirection, vec3 viewDirection, vec3 halfwayDirection, float roughness) { float NdotL = dot(normal, lightDirection); float NdotV = abs(dot(normal, viewDirection)); float G = smithVisibilityGGX(roughness, NdotL, NdotV); float NdotH = clamp(dot(normal, halfwayDirection), 0.0, 1.0); float D = GGX(roughness, NdotH); return G * D; } /** * Compute the diffuse and specular contributions using physically based * rendering. This function only handles direct lighting. *

* This function only handles the lighting calculations. Metallic/roughness * and specular/glossy must be handled separately. See {@MaterialStageFS} *

* * @name czm_pbrLighting * @glslFunction * * @param {vec3} viewDirectionEC Unit vector pointing from the fragment to the eye position * @param {vec3} normalEC The surface normal in eye coordinates * @param {vec3} lightDirectionEC Unit vector pointing to the light source in eye coordinates. * @param {czm_modelMaterial} The material properties. * @return {vec3} The computed HDR color */ vec3 czm_pbrLighting(vec3 viewDirectionEC, vec3 normalEC, vec3 lightDirectionEC, czm_modelMaterial material) { vec3 halfwayDirectionEC = normalize(viewDirectionEC + lightDirectionEC); float VdotH = clamp(dot(viewDirectionEC, halfwayDirectionEC), 0.0, 1.0); float NdotL = clamp(dot(normalEC, lightDirectionEC), 0.001, 1.0); vec3 f0 = material.specular; float reflectance = czm_maximumComponent(f0); // Typical dielectrics will have reflectance 0.04, so f90 will be 1.0. // In this case, at grazing angle, all incident energy is reflected. vec3 f90 = vec3(clamp(reflectance * 25.0, 0.0, 1.0)); vec3 F = fresnelSchlick2(f0, f90, VdotH); #if defined(USE_SPECULAR) F *= material.specularWeight; #endif float alpha = material.roughness; #ifdef USE_ANISOTROPY mat3 tbn = mat3(material.anisotropicT, material.anisotropicB, normalEC); vec3 lightDirection = lightDirectionEC * tbn; vec3 viewDirection = viewDirectionEC * tbn; vec3 halfwayDirection = halfwayDirectionEC * tbn; float anisotropyStrength = material.anisotropyStrength; float tangentialRoughness = mix(alpha, 1.0, anisotropyStrength * anisotropyStrength); float G = smithVisibilityGGX_anisotropic(alpha, tangentialRoughness, lightDirection, viewDirection); float D = GGX_anisotropic(alpha, tangentialRoughness, halfwayDirection); vec3 specularContribution = F * G * D; #else float specularStrength = computeDirectSpecularStrength(normalEC, lightDirectionEC, viewDirectionEC, halfwayDirectionEC, alpha); vec3 specularContribution = F * specularStrength; #endif vec3 diffuseColor = material.diffuse; // F here represents the specular contribution vec3 diffuseContribution = (1.0 - F) * lambertianDiffuse(diffuseColor); // Lo = (diffuse + specular) * Li * NdotL return (diffuseContribution + specularContribution) * NdotL; } `;var Wrn=T(S(),1),$E=`float czm_private_getLambertDiffuseOfMaterial(vec3 lightDirectionEC, czm_material material) { return czm_getLambertDiffuse(lightDirectionEC, material.normal); } float czm_private_getSpecularOfMaterial(vec3 lightDirectionEC, vec3 toEyeEC, czm_material material) { return czm_getSpecular(lightDirectionEC, toEyeEC, material.normal, material.shininess); } /** * Computes a color using the Phong lighting model. * * @name czm_phong * @glslFunction * * @param {vec3} toEye A normalized vector from the fragment to the eye in eye coordinates. * @param {czm_material} material The fragment's material. * * @returns {vec4} The computed color. * * @example * vec3 positionToEyeEC = // ... * czm_material material = // ... * vec3 lightDirectionEC = // ... * out_FragColor = czm_phong(normalize(positionToEyeEC), material, lightDirectionEC); * * @see czm_getMaterial */ vec4 czm_phong(vec3 toEye, czm_material material, vec3 lightDirectionEC) { // Diffuse from directional light sources at eye (for top-down) float diffuse = czm_private_getLambertDiffuseOfMaterial(vec3(0.0, 0.0, 1.0), material); if (czm_sceneMode == czm_sceneMode3D) { // (and horizon views in 3D) diffuse += czm_private_getLambertDiffuseOfMaterial(vec3(0.0, 1.0, 0.0), material); } float specular = czm_private_getSpecularOfMaterial(lightDirectionEC, toEye, material); // Temporary workaround for adding ambient. vec3 materialDiffuse = material.diffuse * 0.5; vec3 ambient = materialDiffuse; vec3 color = ambient + material.emission; color += materialDiffuse * diffuse * czm_lightColor; color += material.specular * specular * czm_lightColor; return vec4(color, material.alpha); } vec4 czm_private_phong(vec3 toEye, czm_material material, vec3 lightDirectionEC) { float diffuse = czm_private_getLambertDiffuseOfMaterial(lightDirectionEC, material); float specular = czm_private_getSpecularOfMaterial(lightDirectionEC, toEye, material); vec3 ambient = vec3(0.0); vec3 color = ambient + material.emission; color += material.diffuse * diffuse * czm_lightColor; color += material.specular * specular * czm_lightColor; return vec4(color, material.alpha); } `;var vrn=T(S(),1),eX=`/** * Computes distance from a point to a plane. * * @name czm_planeDistance * @glslFunction * * param {vec4} plane A Plane in Hessian Normal Form. See Plane.js * param {vec3} point A point in the same space as the plane. * returns {float} The distance from the point to the plane. */ float czm_planeDistance(vec4 plane, vec3 point) { return (dot(plane.xyz, point) + plane.w); } /** * Computes distance from a point to a plane. * * @name czm_planeDistance * @glslFunction * * param {vec3} planeNormal Normal for a plane in Hessian Normal Form. See Plane.js * param {float} planeDistance Distance for a plane in Hessian Normal form. See Plane.js * param {vec3} point A point in the same space as the plane. * returns {float} The distance from the point to the plane. */ float czm_planeDistance(vec3 planeNormal, float planeDistance, vec3 point) { return (dot(planeNormal, point) + planeDistance); } `;var Frn=T(S(),1),tX=`/** * Computes the point along a ray at the given time. time can be positive, negative, or zero. * * @name czm_pointAlongRay * @glslFunction * * @param {czm_ray} ray The ray to compute the point along. * @param {float} time The time along the ray. * * @returns {vec3} The point along the ray at the given time. * * @example * czm_ray ray = czm_ray(vec3(0.0), vec3(1.0, 0.0, 0.0)); // origin, direction * vec3 v = czm_pointAlongRay(ray, 2.0); // (2.0, 0.0, 0.0) */ vec3 czm_pointAlongRay(czm_ray ray, float time) { return ray.origin + (time * ray.direction); } `;var Mrn=T(S(),1),nX=`/** * DOC_TBA * * @name czm_rayEllipsoidIntersectionInterval * @glslFunction */ czm_raySegment czm_rayEllipsoidIntersectionInterval(czm_ray ray, vec3 ellipsoid_center, vec3 ellipsoid_inverseRadii) { // ray and ellipsoid center in eye coordinates. radii in model coordinates. vec3 q = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ray.origin, 1.0)).xyz; vec3 w = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ray.direction, 0.0)).xyz; q = q - ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ellipsoid_center, 1.0)).xyz; float q2 = dot(q, q); float qw = dot(q, w); if (q2 > 1.0) // Outside ellipsoid. { if (qw >= 0.0) // Looking outward or tangent (0 intersections). { return czm_emptyRaySegment; } else // qw < 0.0. { float qw2 = qw * qw; float difference = q2 - 1.0; // Positively valued. float w2 = dot(w, w); float product = w2 * difference; if (qw2 < product) // Imaginary roots (0 intersections). { return czm_emptyRaySegment; } else if (qw2 > product) // Distinct roots (2 intersections). { float discriminant = qw * qw - product; float temp = -qw + sqrt(discriminant); // Avoid cancellation. float root0 = temp / w2; float root1 = difference / temp; if (root0 < root1) { czm_raySegment i = czm_raySegment(root0, root1); return i; } else { czm_raySegment i = czm_raySegment(root1, root0); return i; } } else // qw2 == product. Repeated roots (2 intersections). { float root = sqrt(difference / w2); czm_raySegment i = czm_raySegment(root, root); return i; } } } else if (q2 < 1.0) // Inside ellipsoid (2 intersections). { float difference = q2 - 1.0; // Negatively valued. float w2 = dot(w, w); float product = w2 * difference; // Negatively valued. float discriminant = qw * qw - product; float temp = -qw + sqrt(discriminant); // Positively valued. czm_raySegment i = czm_raySegment(0.0, temp / w2); return i; } else // q2 == 1.0. On ellipsoid. { if (qw < 0.0) // Looking inward. { float w2 = dot(w, w); czm_raySegment i = czm_raySegment(0.0, -qw / w2); return i; } else // qw >= 0.0. Looking outward or tangent. { return czm_emptyRaySegment; } } } `;var krn=T(S(),1),iX=`/** * Compute the intersection interval of a ray with a sphere. * * @name czm_raySphereIntersectionInterval * @glslFunction * * @param {czm_ray} ray The ray. * @param {vec3} center The center of the sphere. * @param {float} radius The radius of the sphere. * @return {czm_raySegment} The intersection interval of the ray with the sphere. */ czm_raySegment czm_raySphereIntersectionInterval(czm_ray ray, vec3 center, float radius) { vec3 o = ray.origin; vec3 d = ray.direction; vec3 oc = o - center; float a = dot(d, d); float b = 2.0 * dot(d, oc); float c = dot(oc, oc) - (radius * radius); float det = (b * b) - (4.0 * a * c); if (det < 0.0) { return czm_emptyRaySegment; } float sqrtDet = sqrt(det); float t0 = (-b - sqrtDet) / (2.0 * a); float t1 = (-b + sqrtDet) / (2.0 * a); czm_raySegment result = czm_raySegment(t0, t1); return result; } `;var Drn=T(S(),1),oX=`float czm_readDepth(sampler2D depthTexture, vec2 texCoords) { return czm_reverseLogDepth(texture(depthTexture, texCoords).r); } `;var Yrn=T(S(),1),rX=`/** * Reads a value previously transformed with {@link czm_writeNonPerspective} * by dividing it by \`w\`, the value used in the perspective divide. * This function is intended to be called in a fragment shader to access a * \`varying\` that should not be subject to perspective interpolation. * For example, screen-space texture coordinates. The value should have been * previously written in the vertex shader with a call to * {@link czm_writeNonPerspective}. * * @name czm_readNonPerspective * @glslFunction * * @param {float|vec2|vec3|vec4} value The non-perspective value to be read. * @param {float} oneOverW One over the perspective divide value, \`w\`. Usually this is simply \`gl_FragCoord.w\`. * @returns {float|vec2|vec3|vec4} The usable value. */ float czm_readNonPerspective(float value, float oneOverW) { return value * oneOverW; } vec2 czm_readNonPerspective(vec2 value, float oneOverW) { return value * oneOverW; } vec3 czm_readNonPerspective(vec3 value, float oneOverW) { return value * oneOverW; } vec4 czm_readNonPerspective(vec4 value, float oneOverW) { return value * oneOverW; } `;var Hrn=T(S(),1),sX=`float czm_reverseLogDepth(float logZ) { #ifdef LOG_DEPTH float near = czm_currentFrustum.x; float far = czm_currentFrustum.y; float log2Depth = logZ * czm_log2FarDepthFromNearPlusOne; float depthFromNear = pow(2.0, log2Depth) - 1.0; return far * (1.0 - near / (depthFromNear + near)) / (far - near); #endif return logZ; } `;var Krn=T(S(),1),aX=`/** * Round a floating point value. This function exists because round() doesn't * exist in GLSL 1.00. * * @param {float|vec2|vec3|vec4} value The value to round * @param {float|vec2|vec3|vec3} The rounded value. The type matches the input. */ float czm_round(float value) { return floor(value + 0.5); } vec2 czm_round(vec2 value) { return floor(value + 0.5); } vec3 czm_round(vec3 value) { return floor(value + 0.5); } vec4 czm_round(vec4 value) { return floor(value + 0.5); } `;var Qrn=T(S(),1),cX=`/** * Samples the 4 neighboring pixels and return the weighted average. * * @private */ vec3 czm_sampleOctahedralProjectionWithFiltering(sampler2D projectedMap, vec2 textureSize, vec3 direction, float lod) { direction /= dot(vec3(1.0), abs(direction)); vec2 rev = abs(direction.zx) - vec2(1.0); vec2 neg = vec2(direction.x < 0.0 ? rev.x : -rev.x, direction.z < 0.0 ? rev.y : -rev.y); vec2 uv = direction.y < 0.0 ? neg : direction.xz; vec2 coord = 0.5 * uv + vec2(0.5); vec2 pixel = 1.0 / textureSize; if (lod > 0.0) { // Each subseqeuent mip level is half the size float scale = 1.0 / pow(2.0, lod); float offset = ((textureSize.y + 1.0) / textureSize.x); coord.x *= offset; coord *= scale; coord.x += offset + pixel.x; coord.y += (1.0 - (1.0 / pow(2.0, lod - 1.0))) + pixel.y * (lod - 1.0) * 2.0; } else { coord.x *= (textureSize.y / textureSize.x); } // Do bilinear filtering #ifndef OES_texture_float_linear vec3 color1 = texture(projectedMap, coord + vec2(0.0, pixel.y)).rgb; vec3 color2 = texture(projectedMap, coord + vec2(pixel.x, 0.0)).rgb; vec3 color3 = texture(projectedMap, coord + pixel).rgb; vec3 color4 = texture(projectedMap, coord).rgb; vec2 texturePosition = coord * textureSize; float fu = fract(texturePosition.x); float fv = fract(texturePosition.y); vec3 average1 = mix(color4, color2, fu); vec3 average2 = mix(color1, color3, fu); vec3 color = mix(average1, average2, fv); #else vec3 color = texture(projectedMap, coord).rgb; #endif return color; } /** * Samples from a cube map that has been projected using an octahedral projection from the given direction. * * @name czm_sampleOctahedralProjection * @glslFunction * * @param {sampler2D} projectedMap The texture with the octahedral projected cube map. * @param {vec2} textureSize The width and height dimensions in pixels of the projected map. * @param {vec3} direction The normalized direction used to sample the cube map. * @param {float} lod The level of detail to sample. * @param {float} maxLod The maximum level of detail. * @returns {vec3} The color of the cube map at the direction. */ vec3 czm_sampleOctahedralProjection(sampler2D projectedMap, vec2 textureSize, vec3 direction, float lod, float maxLod) { float currentLod = floor(lod + 0.5); float nextLod = min(currentLod + 1.0, maxLod); vec3 colorCurrentLod = czm_sampleOctahedralProjectionWithFiltering(projectedMap, textureSize, direction, currentLod); vec3 colorNextLod = czm_sampleOctahedralProjectionWithFiltering(projectedMap, textureSize, direction, nextLod); return mix(colorNextLod, colorCurrentLod, nextLod - lod); } `;var qrn=T(S(),1),lX=`/** * Adjusts the saturation of a color. * * @name czm_saturation * @glslFunction * * @param {vec3} rgb The color. * @param {float} adjustment The amount to adjust the saturation of the color. * * @returns {float} The color with the saturation adjusted. * * @example * vec3 greyScale = czm_saturation(color, 0.0); * vec3 doubleSaturation = czm_saturation(color, 2.0); */ vec3 czm_saturation(vec3 rgb, float adjustment) { // Algorithm from Chapter 16 of OpenGL Shading Language const vec3 W = vec3(0.2125, 0.7154, 0.0721); vec3 intensity = vec3(dot(rgb, W)); return mix(intensity, rgb, adjustment); } `;var esn=T(S(),1),dX=` float czm_sampleShadowMap(highp samplerCube shadowMap, vec3 d) { return czm_unpackDepth(czm_textureCube(shadowMap, d)); } float czm_sampleShadowMap(highp sampler2D shadowMap, vec2 uv) { #ifdef USE_SHADOW_DEPTH_TEXTURE return texture(shadowMap, uv).r; #else return czm_unpackDepth(texture(shadowMap, uv)); #endif } float czm_shadowDepthCompare(samplerCube shadowMap, vec3 uv, float depth) { return step(depth, czm_sampleShadowMap(shadowMap, uv)); } float czm_shadowDepthCompare(sampler2D shadowMap, vec2 uv, float depth) { return step(depth, czm_sampleShadowMap(shadowMap, uv)); } `;var nsn=T(S(),1),uX=` float czm_private_shadowVisibility(float visibility, float nDotL, float normalShadingSmooth, float darkness) { #ifdef USE_NORMAL_SHADING #ifdef USE_NORMAL_SHADING_SMOOTH float strength = clamp(nDotL / normalShadingSmooth, 0.0, 1.0); #else float strength = step(0.0, nDotL); #endif visibility *= strength; #endif visibility = max(visibility, darkness); return visibility; } #ifdef USE_CUBE_MAP_SHADOW float czm_shadowVisibility(samplerCube shadowMap, czm_shadowParameters shadowParameters) { float depthBias = shadowParameters.depthBias; float depth = shadowParameters.depth; float nDotL = shadowParameters.nDotL; float normalShadingSmooth = shadowParameters.normalShadingSmooth; float darkness = shadowParameters.darkness; vec3 uvw = shadowParameters.texCoords; depth -= depthBias; float visibility = czm_shadowDepthCompare(shadowMap, uvw, depth); return czm_private_shadowVisibility(visibility, nDotL, normalShadingSmooth, darkness); } #else float czm_shadowVisibility(sampler2D shadowMap, czm_shadowParameters shadowParameters) { float depthBias = shadowParameters.depthBias; float depth = shadowParameters.depth; float nDotL = shadowParameters.nDotL; float normalShadingSmooth = shadowParameters.normalShadingSmooth; float darkness = shadowParameters.darkness; vec2 uv = shadowParameters.texCoords; depth -= depthBias; #ifdef USE_SOFT_SHADOWS vec2 texelStepSize = shadowParameters.texelStepSize; float radius = 1.0; float dx0 = -texelStepSize.x * radius; float dy0 = -texelStepSize.y * radius; float dx1 = texelStepSize.x * radius; float dy1 = texelStepSize.y * radius; float visibility = ( czm_shadowDepthCompare(shadowMap, uv, depth) + czm_shadowDepthCompare(shadowMap, uv + vec2(dx0, dy0), depth) + czm_shadowDepthCompare(shadowMap, uv + vec2(0.0, dy0), depth) + czm_shadowDepthCompare(shadowMap, uv + vec2(dx1, dy0), depth) + czm_shadowDepthCompare(shadowMap, uv + vec2(dx0, 0.0), depth) + czm_shadowDepthCompare(shadowMap, uv + vec2(dx1, 0.0), depth) + czm_shadowDepthCompare(shadowMap, uv + vec2(dx0, dy1), depth) + czm_shadowDepthCompare(shadowMap, uv + vec2(0.0, dy1), depth) + czm_shadowDepthCompare(shadowMap, uv + vec2(dx1, dy1), depth) ) * (1.0 / 9.0); #else float visibility = czm_shadowDepthCompare(shadowMap, uv, depth); #endif return czm_private_shadowVisibility(visibility, nDotL, normalShadingSmooth, darkness); } #endif `;var osn=T(S(),1),mX=`/** * Returns 1.0 if the given value is positive or zero, and -1.0 if it is negative. This is similar to the GLSL * built-in function sign except that returns 1.0 instead of 0.0 when the input value is 0.0. * * @name czm_signNotZero * @glslFunction * * @param {} value The value for which to determine the sign. * @returns {} 1.0 if the value is positive or zero, -1.0 if the value is negative. */ float czm_signNotZero(float value) { return value >= 0.0 ? 1.0 : -1.0; } vec2 czm_signNotZero(vec2 value) { return vec2(czm_signNotZero(value.x), czm_signNotZero(value.y)); } vec3 czm_signNotZero(vec3 value) { return vec3(czm_signNotZero(value.x), czm_signNotZero(value.y), czm_signNotZero(value.z)); } vec4 czm_signNotZero(vec4 value) { return vec4(czm_signNotZero(value.x), czm_signNotZero(value.y), czm_signNotZero(value.z), czm_signNotZero(value.w)); } `;var ssn=T(S(),1),hX=`/** * Computes a color from the third order spherical harmonic coefficients and a normalized direction vector. *

* The order of the coefficients is [L00, L1_1, L10, L11, L2_2, L2_1, L20, L21, L22]. *

* * @name czm_sphericalHarmonics * @glslFunction * * @param {vec3} normal The normalized direction. * @param {vec3[9]} coefficients The third order spherical harmonic coefficients. * @returns {vec3} The color at the direction. * * @see https://graphics.stanford.edu/papers/envmap/envmap.pdf */ vec3 czm_sphericalHarmonics(vec3 normal, vec3 coefficients[9]) { vec3 L00 = coefficients[0]; vec3 L1_1 = coefficients[1]; vec3 L10 = coefficients[2]; vec3 L11 = coefficients[3]; vec3 L2_2 = coefficients[4]; vec3 L2_1 = coefficients[5]; vec3 L20 = coefficients[6]; vec3 L21 = coefficients[7]; vec3 L22 = coefficients[8]; float x = normal.x; float y = normal.y; float z = normal.z; return L00 + L1_1 * y + L10 * z + L11 * x + L2_2 * (y * x) + L2_1 * (y * z) + L20 * (3.0 * z * z - 1.0) + L21 * (z * x) + L22 * (x * x - y * y); } `;var csn=T(S(),1),fX=`/** * Converts an sRGB color to a linear RGB color. * * @param {vec3|vec4} srgbIn The color in sRGB space * @returns {vec3|vec4} The color in linear color space. The vector type matches the input. */ vec3 czm_srgbToLinear(vec3 srgbIn) { return pow(srgbIn, vec3(2.2)); } vec4 czm_srgbToLinear(vec4 srgbIn) { vec3 linearOut = pow(srgbIn.rgb, vec3(2.2)); return vec4(linearOut, srgbIn.a); } `;var dsn=T(S(),1),pX=`/** * Creates a matrix that transforms vectors from tangent space to eye space. * * @name czm_tangentToEyeSpaceMatrix * @glslFunction * * @param {vec3} normalEC The normal vector in eye coordinates. * @param {vec3} tangentEC The tangent vector in eye coordinates. * @param {vec3} bitangentEC The bitangent vector in eye coordinates. * * @returns {mat3} The matrix that transforms from tangent space to eye space. * * @example * mat3 tangentToEye = czm_tangentToEyeSpaceMatrix(normalEC, tangentEC, bitangentEC); * vec3 normal = tangentToEye * texture(normalMap, st).xyz; */ mat3 czm_tangentToEyeSpaceMatrix(vec3 normalEC, vec3 tangentEC, vec3 bitangentEC) { vec3 normal = normalize(normalEC); vec3 tangent = normalize(tangentEC); vec3 bitangent = normalize(bitangentEC); return mat3(tangent.x , tangent.y , tangent.z, bitangent.x, bitangent.y, bitangent.z, normal.x , normal.y , normal.z); } `;var msn=T(S(),1),bX=`/** * A wrapper around the texture (WebGL2) / textureCube (WebGL1) * function to allow for WebGL 1 support. * * @name czm_textureCube * @glslFunction * * @param {samplerCube} sampler The sampler. * @param {vec3} p The coordinates to sample the texture at. */ vec4 czm_textureCube(samplerCube sampler, vec3 p) { #if __VERSION__ == 300 return texture(sampler, p); #else return textureCube(sampler, p); #endif }`;var fsn=T(S(),1),gX=`/** * Transforms a plane. * * @name czm_transformPlane * @glslFunction * * @param {vec4} plane The plane in Hessian Normal Form. * @param {mat4} transform The inverse-transpose of a transformation matrix. */ vec4 czm_transformPlane(vec4 plane, mat4 transform) { vec4 transformedPlane = transform * plane; // Convert the transformed plane to Hessian Normal Form float normalMagnitude = length(transformedPlane.xyz); return transformedPlane / normalMagnitude; } `;var bsn=T(S(),1),yX=`/** * Translates a position (or any vec3) that was encoded with {@link EncodedCartesian3}, * and then provided to the shader as separate high and low bits to * be relative to the eye. As shown in the example, the position can then be transformed in eye * or clip coordinates using {@link czm_modelViewRelativeToEye} or {@link czm_modelViewProjectionRelativeToEye}, * respectively. *

* This technique, called GPU RTE, eliminates jittering artifacts when using large coordinates as * described in {@link http://help.agi.com/AGIComponents/html/BlogPrecisionsPrecisions.htm|Precisions, Precisions}. *

* * @name czm_translateRelativeToEye * @glslFunction * * @param {vec3} high The position's high bits. * @param {vec3} low The position's low bits. * @returns {vec3} The position translated to be relative to the camera's position. * * @example * in vec3 positionHigh; * in vec3 positionLow; * * void main() * { * vec4 p = czm_translateRelativeToEye(positionHigh, positionLow); * gl_Position = czm_modelViewProjectionRelativeToEye * p; * } * * @see czm_modelViewRelativeToEye * @see czm_modelViewProjectionRelativeToEye * @see czm_computePosition * @see EncodedCartesian3 */ vec4 czm_translateRelativeToEye(vec3 high, vec3 low) { vec3 highDifference = high - czm_encodedCameraPositionMCHigh; // This check handles the case when NaN values have gotten into \`highDifference\`. // Such a thing could happen on devices running iOS. if (length(highDifference) == 0.0) { highDifference = vec3(0); } vec3 lowDifference = low - czm_encodedCameraPositionMCLow; return vec4(highDifference + lowDifference, 1.0); } `;var ysn=T(S(),1),xX=`/** * @private */ vec4 czm_translucentPhong(vec3 toEye, czm_material material, vec3 lightDirectionEC) { // Diffuse from directional light sources at eye (for top-down and horizon views) float diffuse = czm_getLambertDiffuse(vec3(0.0, 0.0, 1.0), material.normal); if (czm_sceneMode == czm_sceneMode3D) { // (and horizon views in 3D) diffuse += czm_getLambertDiffuse(vec3(0.0, 1.0, 0.0), material.normal); } diffuse = clamp(diffuse, 0.0, 1.0); float specular = czm_getSpecular(lightDirectionEC, toEye, material.normal, material.shininess); // Temporary workaround for adding ambient. vec3 materialDiffuse = material.diffuse * 0.5; vec3 ambient = materialDiffuse; vec3 color = ambient + material.emission; color += materialDiffuse * diffuse * czm_lightColor; color += material.specular * specular * czm_lightColor; return vec4(color, material.alpha); } `;var _sn=T(S(),1),_X=`/** * Returns the transpose of the matrix. The input matrix can be * a mat2, mat3, or mat4. * * @name czm_transpose * @glslFunction * * @param {} matrix The matrix to transpose. * * @returns {} The transposed matrix. * * @example * // GLSL declarations * mat2 czm_transpose(mat2 matrix); * mat3 czm_transpose(mat3 matrix); * mat4 czm_transpose(mat4 matrix); * * // Transpose a 3x3 rotation matrix to find its inverse. * mat3 eastNorthUpToEye = czm_eastNorthUpToEyeCoordinates( * positionMC, normalEC); * mat3 eyeToEastNorthUp = czm_transpose(eastNorthUpToEye); */ mat2 czm_transpose(mat2 matrix) { return mat2( matrix[0][0], matrix[1][0], matrix[0][1], matrix[1][1]); } mat3 czm_transpose(mat3 matrix) { return mat3( matrix[0][0], matrix[1][0], matrix[2][0], matrix[0][1], matrix[1][1], matrix[2][1], matrix[0][2], matrix[1][2], matrix[2][2]); } mat4 czm_transpose(mat4 matrix) { return mat4( matrix[0][0], matrix[1][0], matrix[2][0], matrix[3][0], matrix[0][1], matrix[1][1], matrix[2][1], matrix[3][1], matrix[0][2], matrix[1][2], matrix[2][2], matrix[3][2], matrix[0][3], matrix[1][3], matrix[2][3], matrix[3][3]); } `;var Ssn=T(S(),1),TX=`vec2 getLookupUv(vec2 dimensions, int i) { int pixY = i / int(dimensions.x); int pixX = i - (pixY * int(dimensions.x)); float pixelWidth = 1.0 / dimensions.x; float pixelHeight = 1.0 / dimensions.y; float u = (float(pixX) + 0.5) * pixelWidth; // sample from center of pixel float v = (float(pixY) + 0.5) * pixelHeight; return vec2(u, v); } vec4 czm_unpackClippingExtents(highp sampler2D extentsTexture, int index) { vec2 textureDimensions = vec2(textureSize(extentsTexture, 0)); return texture(extentsTexture, getLookupUv(textureDimensions, index)); }`;var Vsn=T(S(),1),SX=`/** * Unpacks a vec4 depth value to a float in [0, 1) range. * * @name czm_unpackDepth * @glslFunction * * @param {vec4} packedDepth The packed depth. * * @returns {float} The floating-point depth in [0, 1) range. */ float czm_unpackDepth(vec4 packedDepth) { // See Aras Pranckevi\u010Dius' post Encoding Floats to RGBA // http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/ return dot(packedDepth, vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)); } `;var Rsn=T(S(),1),CX=`/** * Unpack an IEEE 754 single-precision float that is packed as a little-endian unsigned normalized vec4. * * @name czm_unpackFloat * @glslFunction * * @param {vec4} packedFloat The packed float. * * @returns {float} The floating-point depth in arbitrary range. */ float czm_unpackFloat(vec4 packedFloat) { // Convert to [0.0, 255.0] and round to integer packedFloat = floor(packedFloat * 255.0 + 0.5); float sign = 1.0 - step(128.0, packedFloat[3]) * 2.0; float exponent = 2.0 * mod(packedFloat[3], 128.0) + step(128.0, packedFloat[2]) - 127.0; if (exponent == -127.0) { return 0.0; } float mantissa = mod(packedFloat[2], 128.0) * 65536.0 + packedFloat[1] * 256.0 + packedFloat[0] + float(0x800000); float result = sign * exp2(exponent - 23.0) * mantissa; return result; } `;var Gsn=T(S(),1),VX=`/** * Unpack unsigned integers of 1-4 bytes. in WebGL 1, there is no uint type, * so the return value is an int. *

* There are also precision limitations in WebGL 1. highp int is still limited * to 24 bits. Above the value of 2^24 = 16777216, precision loss may occur. *

* * @param {float|vec2|vec3|vec4} packed The packed value. For vectors, the components are listed in little-endian order. * * @return {int} The unpacked value. */ int czm_unpackUint(float packedValue) { float rounded = czm_round(packedValue * 255.0); return int(rounded); } int czm_unpackUint(vec2 packedValue) { vec2 rounded = czm_round(packedValue * 255.0); return int(dot(rounded, vec2(1.0, 256.0))); } int czm_unpackUint(vec3 packedValue) { vec3 rounded = czm_round(packedValue * 255.0); return int(dot(rounded, vec3(1.0, 256.0, 65536.0))); } int czm_unpackUint(vec4 packedValue) { vec4 rounded = czm_round(packedValue * 255.0); return int(dot(rounded, vec4(1.0, 256.0, 65536.0, 16777216.0))); } `;var Xsn=T(S(),1),LX=`/** * Transform metadata values following the EXT_structural_metadata spec * by multiplying by scale and adding the offset. Operations are always * performed component-wise, even for matrices. * * @param {float|vec2|vec3|vec4|mat2|mat3|mat4} offset The offset to add * @param {float|vec2|vec3|vec4|mat2|mat3|mat4} scale The scale factor to multiply * @param {float|vec2|vec3|vec4|mat2|mat3|mat4} value The original value. * * @return {float|vec2|vec3|vec4|mat2|mat3|mat4} The transformed value of the same scalar/vector/matrix type as the input. */ float czm_valueTransform(float offset, float scale, float value) { return scale * value + offset; } vec2 czm_valueTransform(vec2 offset, vec2 scale, vec2 value) { return scale * value + offset; } vec3 czm_valueTransform(vec3 offset, vec3 scale, vec3 value) { return scale * value + offset; } vec4 czm_valueTransform(vec4 offset, vec4 scale, vec4 value) { return scale * value + offset; } mat2 czm_valueTransform(mat2 offset, mat2 scale, mat2 value) { return matrixCompMult(scale, value) + offset; } mat3 czm_valueTransform(mat3 offset, mat3 scale, mat3 value) { return matrixCompMult(scale, value) + offset; } mat4 czm_valueTransform(mat4 offset, mat4 scale, mat4 value) { return matrixCompMult(scale, value) + offset; } `;var Wsn=T(S(),1),RX=`#ifdef LOG_DEPTH // 1.0 at the near plane, increasing linearly from there. out float v_depthFromNearPlusOne; #ifdef SHADOW_MAP out vec3 v_logPositionEC; #endif #endif vec4 czm_updatePositionDepth(vec4 coords) { #if defined(LOG_DEPTH) #ifdef SHADOW_MAP vec3 logPositionEC = (czm_inverseProjection * coords).xyz; v_logPositionEC = logPositionEC; #endif // With the very high far/near ratios used with the logarithmic depth // buffer, floating point rounding errors can cause linear depth values // to end up on the wrong side of the far plane, even for vertices that // are really nowhere near it. Since we always write a correct logarithmic // depth value in the fragment shader anyway, we just need to make sure // such errors don't cause the primitive to be clipped entirely before // we even get to the fragment shader. coords.z = clamp(coords.z / coords.w, -1.0, 1.0) * coords.w; #endif return coords; } /** * Writes the logarithmic depth to gl_Position using the already computed gl_Position. * * @name czm_vertexLogDepth * @glslFunction */ void czm_vertexLogDepth() { #ifdef LOG_DEPTH v_depthFromNearPlusOne = (gl_Position.w - czm_currentFrustum.x) + 1.0; gl_Position = czm_updatePositionDepth(gl_Position); #endif } /** * Writes the logarithmic depth to gl_Position using the provided clip coordinates. *

* An example use case for this function would be moving the vertex in window coordinates * before converting back to clip coordinates. Use the original vertex clip coordinates. *

* @name czm_vertexLogDepth * @glslFunction * * @param {vec4} clipCoords The vertex in clip coordinates. * * @example * czm_vertexLogDepth(czm_projection * vec4(positionEyeCoordinates, 1.0)); */ void czm_vertexLogDepth(vec4 clipCoords) { #ifdef LOG_DEPTH v_depthFromNearPlusOne = (clipCoords.w - czm_currentFrustum.x) + 1.0; czm_updatePositionDepth(clipCoords); #endif } `;var vsn=T(S(),1),ZX=`vec4 czm_screenToEyeCoordinates(vec4 screenCoordinate) { // Reconstruct NDC coordinates float x = 2.0 * screenCoordinate.x - 1.0; float y = 2.0 * screenCoordinate.y - 1.0; float z = (screenCoordinate.z - czm_viewportTransformation[3][2]) / czm_viewportTransformation[2][2]; vec4 q = vec4(x, y, z, 1.0); // Reverse the perspective division to obtain clip coordinates. q /= screenCoordinate.w; // Reverse the projection transformation to obtain eye coordinates. if (!(czm_inverseProjection == mat4(0.0))) // IE and Edge sometimes do something weird with != between mat4s { q = czm_inverseProjection * q; } else { float top = czm_frustumPlanes.x; float bottom = czm_frustumPlanes.y; float left = czm_frustumPlanes.z; float right = czm_frustumPlanes.w; float near = czm_currentFrustum.x; float far = czm_currentFrustum.y; q.x = (q.x * (right - left) + left + right) * 0.5; q.y = (q.y * (top - bottom) + bottom + top) * 0.5; q.z = (q.z * (near - far) - near - far) * 0.5; q.w = 1.0; } return q; } /** * Transforms a position from window to eye coordinates. * The transform from window to normalized device coordinates is done using components * of (@link czm_viewport} and {@link czm_viewportTransformation} instead of calculating * the inverse of czm_viewportTransformation. The transformation from * normalized device coordinates to clip coordinates is done using fragmentCoordinate.w, * which is expected to be the scalar used in the perspective divide. The transformation * from clip to eye coordinates is done using {@link czm_inverseProjection}. * * @name czm_windowToEyeCoordinates * @glslFunction * * @param {vec4} fragmentCoordinate The position in window coordinates to transform. * * @returns {vec4} The transformed position in eye coordinates. * * @see czm_modelToWindowCoordinates * @see czm_eyeToWindowCoordinates * @see czm_inverseProjection * @see czm_viewport * @see czm_viewportTransformation * * @example * vec4 positionEC = czm_windowToEyeCoordinates(gl_FragCoord); */ vec4 czm_windowToEyeCoordinates(vec4 fragmentCoordinate) { vec2 screenCoordXY = (fragmentCoordinate.xy - czm_viewport.xy) / czm_viewport.zw; return czm_screenToEyeCoordinates(vec4(screenCoordXY, fragmentCoordinate.zw)); } vec4 czm_screenToEyeCoordinates(vec2 screenCoordinateXY, float depthOrLogDepth) { // See reverseLogDepth.glsl. This is separate to re-use the pow. #if defined(LOG_DEPTH) || defined(LOG_DEPTH_READ_ONLY) float near = czm_currentFrustum.x; float far = czm_currentFrustum.y; float log2Depth = depthOrLogDepth * czm_log2FarDepthFromNearPlusOne; float depthFromNear = pow(2.0, log2Depth) - 1.0; float depthFromCamera = depthFromNear + near; vec4 screenCoord = vec4(screenCoordinateXY, far * (1.0 - near / depthFromCamera) / (far - near), 1.0); vec4 eyeCoordinate = czm_screenToEyeCoordinates(screenCoord); eyeCoordinate.w = 1.0 / depthFromCamera; // Better precision return eyeCoordinate; #else vec4 screenCoord = vec4(screenCoordinateXY, depthOrLogDepth, 1.0); vec4 eyeCoordinate = czm_screenToEyeCoordinates(screenCoord); #endif return eyeCoordinate; } /** * Transforms a position given as window x/y and a depth or a log depth from window to eye coordinates. * This function produces more accurate results for window positions with log depth than * conventionally unpacking the log depth using czm_reverseLogDepth and using the standard version * of czm_windowToEyeCoordinates. * * @name czm_windowToEyeCoordinates * @glslFunction * * @param {vec2} fragmentCoordinateXY The XY position in window coordinates to transform. * @param {float} depthOrLogDepth A depth or log depth for the fragment. * * @see czm_modelToWindowCoordinates * @see czm_eyeToWindowCoordinates * @see czm_inverseProjection * @see czm_viewport * @see czm_viewportTransformation * * @returns {vec4} The transformed position in eye coordinates. */ vec4 czm_windowToEyeCoordinates(vec2 fragmentCoordinateXY, float depthOrLogDepth) { vec2 screenCoordXY = (fragmentCoordinateXY.xy - czm_viewport.xy) / czm_viewport.zw; return czm_screenToEyeCoordinates(screenCoordXY, depthOrLogDepth); } `;var Fsn=T(S(),1),GX=`// emulated noperspective #if !defined(LOG_DEPTH) in float v_WindowZ; #endif /** * Emulates GL_DEPTH_CLAMP. Clamps a fragment to the near and far plane * by writing the fragment's depth. See czm_depthClamp for more details. * * @name czm_writeDepthClamp * @glslFunction * * @example * out_FragColor = color; * czm_writeDepthClamp(); * * @see czm_depthClamp */ void czm_writeDepthClamp() { #if (!defined(LOG_DEPTH) && (__VERSION__ == 300 || defined(GL_EXT_frag_depth))) gl_FragDepth = clamp(v_WindowZ * gl_FragCoord.w, 0.0, 1.0); #endif } `;var Msn=T(S(),1),EX=`#ifdef LOG_DEPTH in float v_depthFromNearPlusOne; #ifdef POLYGON_OFFSET uniform vec2 u_polygonOffset; #endif #endif /** * Writes the fragment depth to the logarithmic depth buffer. *

* Use this when the vertex shader does not call {@link czm_vertexlogDepth}, for example, when * ray-casting geometry using a full screen quad. *

* @name czm_writeLogDepth * @glslFunction * * @param {float} depth The depth coordinate, where 1.0 is on the near plane and * depth increases in eye-space units from there * * @example * czm_writeLogDepth((czm_projection * v_positionEyeCoordinates).w + 1.0); */ void czm_writeLogDepth(float depth) { #if (defined(LOG_DEPTH) && (__VERSION__ == 300 || defined(GL_EXT_frag_depth))) // Discard the vertex if it's not between the near and far planes. // We allow a bit of epsilon on the near plane comparison because a 1.0 // from the vertex shader (indicating the vertex should be _on_ the near // plane) will not necessarily come here as exactly 1.0. if (depth <= 0.9999999 || depth > czm_farDepthFromNearPlusOne) { discard; } #ifdef POLYGON_OFFSET // Polygon offset: m * factor + r * units float factor = u_polygonOffset[0]; float units = u_polygonOffset[1]; #if (__VERSION__ == 300 || defined(GL_OES_standard_derivatives)) // This factor doesn't work in IE 10 if (factor != 0.0) { // m = sqrt(dZdX^2 + dZdY^2); float x = dFdx(depth); float y = dFdy(depth); float m = sqrt(x * x + y * y); // Apply the factor before computing the log depth. depth += m * factor; } #endif #endif gl_FragDepth = log2(depth) * czm_oneOverLog2FarDepthFromNearPlusOne; #ifdef POLYGON_OFFSET // Apply the units after the log depth. gl_FragDepth += czm_epsilon7 * units; #endif #endif } /** * Writes the fragment depth to the logarithmic depth buffer. *

* Use this when the vertex shader calls {@link czm_vertexlogDepth}. *

* * @name czm_writeLogDepth * @glslFunction */ void czm_writeLogDepth() { #ifdef LOG_DEPTH czm_writeLogDepth(v_depthFromNearPlusOne); #endif } `;var ksn=T(S(),1),XX=`/** * Transforms a value for non-perspective interpolation by multiplying * it by w, the value used in the perspective divide. This function is * intended to be called in a vertex shader to compute the value of a * \`varying\` that should not be subject to perspective interpolation. * For example, screen-space texture coordinates. The fragment shader * must call {@link czm_readNonPerspective} to retrieve the final * non-perspective value. * * @name czm_writeNonPerspective * @glslFunction * * @param {float|vec2|vec3|vec4} value The value to be interpolated without accounting for perspective. * @param {float} w The perspective divide value. Usually this is the computed \`gl_Position.w\`. * @returns {float|vec2|vec3|vec4} The transformed value, intended to be stored in a \`varying\` and read in the * fragment shader with {@link czm_readNonPerspective}. */ float czm_writeNonPerspective(float value, float w) { return value * w; } vec2 czm_writeNonPerspective(vec2 value, float w) { return value * w; } vec3 czm_writeNonPerspective(vec3 value, float w) { return value * w; } vec4 czm_writeNonPerspective(vec4 value, float w) { return value * w; } `;var jx={czm_degreesPerRadian:iG,czm_depthRange:oG,czm_epsilon1:rG,czm_epsilon2:sG,czm_epsilon3:aG,czm_epsilon4:cG,czm_epsilon5:lG,czm_epsilon6:dG,czm_epsilon7:uG,czm_infinity:mG,czm_oneOverPi:hG,czm_oneOverTwoPi:fG,czm_passCesium3DTile:pG,czm_passCesium3DTileClassification:bG,czm_passCesium3DTileClassificationIgnoreShow:gG,czm_passClassification:yG,czm_passCompute:xG,czm_passEnvironment:_G,czm_passGlobe:TG,czm_passOpaque:SG,czm_passOverlay:CG,czm_passTerrainClassification:VG,czm_passTranslucent:LG,czm_passVoxels:RG,czm_pi:ZG,czm_piOverFour:GG,czm_piOverSix:EG,czm_piOverThree:XG,czm_piOverTwo:IG,czm_radiansPerDegree:WG,czm_sceneMode2D:PG,czm_sceneMode3D:vG,czm_sceneModeColumbusView:wG,czm_sceneModeMorphing:FG,czm_solarRadius:AG,czm_threePiOver2:MG,czm_twoPi:NG,czm_webMercatorMaxLatitude:kG,czm_depthRangeStruct:UG,czm_material:DG,czm_materialInput:BG,czm_modelMaterial:YG,czm_modelVertexOutput:OG,czm_ray:HG,czm_raySegment:zG,czm_shadowParameters:KG,czm_HSBToRGB:JG,czm_HSLToRGB:QG,czm_RGBToHSB:jG,czm_RGBToHSL:qG,czm_RGBToXYZ:$G,czm_XYZToRGB:eE,czm_acesTonemapping:tE,czm_alphaWeight:nE,czm_antialias:iE,czm_applyHSBShift:oE,czm_approximateSphericalCoordinates:rE,czm_approximateTanh:sE,czm_backFacing:aE,czm_branchFreeTernary:cE,czm_cascadeColor:lE,czm_cascadeDistance:dE,czm_cascadeMatrix:uE,czm_cascadeWeights:mE,czm_clipPolygons:hE,czm_columbusViewMorph:fE,czm_computeAtmosphereColor:pE,czm_computeGroundAtmosphereScattering:bE,czm_computePosition:gE,czm_computeScattering:yE,czm_cosineAndSine:xE,czm_decompressTextureCoordinates:_E,czm_depthClamp:TE,czm_eastNorthUpToEyeCoordinates:SE,czm_ellipsoidContainsPoint:CE,czm_ellipsoidWgs84TextureCoordinates:VE,czm_equalsEpsilon:LE,czm_eyeOffset:RE,czm_eyeToWindowCoordinates:ZE,czm_fastApproximateAtan:GE,czm_fog:EE,czm_gammaCorrect:XE,czm_geodeticSurfaceNormal:IE,czm_getDefaultMaterial:WE,czm_getDynamicAtmosphereLightDirection:PE,czm_getLambertDiffuse:vE,czm_getSpecular:wE,czm_getWaterNoise:FE,czm_hue:AE,czm_inverseGamma:ME,czm_isEmpty:NE,czm_isFull:kE,czm_latitudeToWebMercatorFraction:UE,czm_lineDistance:DE,czm_linearToSrgb:BE,czm_luminance:YE,czm_maximumComponent:OE,czm_metersPerPixel:HE,czm_modelToWindowCoordinates:zE,czm_multiplyWithColorBalance:KE,czm_nearFarScalar:JE,czm_octDecode:QE,czm_packDepth:jE,czm_pbrLighting:qE,czm_phong:$E,czm_planeDistance:eX,czm_pointAlongRay:tX,czm_rayEllipsoidIntersectionInterval:nX,czm_raySphereIntersectionInterval:iX,czm_readDepth:oX,czm_readNonPerspective:rX,czm_reverseLogDepth:sX,czm_round:aX,czm_sampleOctahedralProjection:cX,czm_saturation:lX,czm_shadowDepthCompare:dX,czm_shadowVisibility:uX,czm_signNotZero:mX,czm_sphericalHarmonics:hX,czm_srgbToLinear:fX,czm_tangentToEyeSpaceMatrix:pX,czm_textureCube:bX,czm_transformPlane:gX,czm_translateRelativeToEye:yX,czm_translucentPhong:xX,czm_transpose:_X,czm_unpackClippingExtents:TX,czm_unpackDepth:SX,czm_unpackFloat:CX,czm_unpackUint:VX,czm_valueTransform:LX,czm_vertexLogDepth:RX,czm_windowToEyeCoordinates:ZX,czm_writeDepthClamp:GX,czm_writeLogDepth:EX,czm_writeNonPerspective:XX};var yln=T(S(),1);function L9e(e,t){let n=e;return n=n.replaceAll("version 300 es",""),n=n.replaceAll(/(texture\()/g,"texture2D("),t?(n=n.replaceAll(/\n\s*(in)\s+(vec\d|mat\d|float)/g,` varying $2`),/out_FragData_(\d+)/.test(n)&&(n=`#extension GL_EXT_draw_buffers : enable ${n}`,n=n.replaceAll(/layout\s+\(location\s*=\s*\d+\)\s*out\s+vec4\s+out_FragData_\d+;/g,""),n=n.replaceAll(/out_FragData_(\d+)/g,"gl_FragData[$1]")),n=n.replaceAll(/layout\s+\(location\s*=\s*0\)\s*out\s+vec4\s+out_FragColor;/g,""),n=n.replaceAll(/out_FragColor/g,"gl_FragColor"),n=n.replaceAll(/out_FragColor\[(\d+)\]/g,"gl_FragColor[$1]"),/gl_FragDepth/.test(n)&&(n=`#extension GL_EXT_frag_depth : enable ${n}`,n=n.replaceAll(/gl_FragDepth/g,"gl_FragDepthEXT")),n=`#ifdef GL_OES_standard_derivatives #extension GL_OES_standard_derivatives : enable #endif ${n}`):(n=n.replaceAll(/(in)\s+(vec\d|mat\d|float)/g,"attribute $2"),n=n.replaceAll(/(out)\s+(vec\d|mat\d|float)\s+([\w]+);/g,"varying $2 $3;")),n=`#version 100 ${n}`,n}var IX=L9e;function Ise(e){return e=e.replace(/\/\/.*/g,""),e.replace(/\/\*\*[\s\S]*?\*\//gm,function(t){let n=t.match(/\n/gm).length,i="";for(let o=0;o0;){let o=e.pop();n.push(o),o.requiredBy.length===0&&t.push(o)}for(;t.length>0;){let o=t.shift();e.push(o);for(let r=0;r=0;--o)i=`${i+t[o].glslSource} `;return i.replace(n.glslSource,"")}function vse(e,t,n){let i,o,r="",s=e.sources;if(l(s))for(i=0,o=s.length;i planes2D_high.w): // - If this vertex is on the east side of the IDL (position3DLow.y > 0.0, comparison with position3DHigh may produce artifacts) // - existing "east" is on the wrong side of the world, far away (planes2D_high/low.w) // - so set "east" as beyond the eastmost extent of the projection (idlSplitNewPlaneHiLow) vec2 idlSplitNewPlaneHiLow = vec2(EAST_MOST_X_HIGH - (WEST_MOST_X_HIGH - planes2D_high.w), EAST_MOST_X_LOW - (WEST_MOST_X_LOW - planes2D_low.w)); bool idlSplit = planes2D_high.x > planes2D_high.w && position3DLow.y > 0.0; planes2D_high.w = czm_branchFreeTernary(idlSplit, idlSplitNewPlaneHiLow.x, planes2D_high.w); planes2D_low.w = czm_branchFreeTernary(idlSplit, idlSplitNewPlaneHiLow.y, planes2D_low.w); // - else, if this vertex is on the west side of the IDL (position3DLow.y < 0.0) // - existing "west" is on the wrong side of the world, far away (planes2D_high/low.x) // - so set "west" as beyond the westmost extent of the projection (idlSplitNewPlaneHiLow) idlSplit = planes2D_high.x > planes2D_high.w && position3DLow.y < 0.0; idlSplitNewPlaneHiLow = vec2(WEST_MOST_X_HIGH - (EAST_MOST_X_HIGH - planes2D_high.x), WEST_MOST_X_LOW - (EAST_MOST_X_LOW - planes2D_low.x)); planes2D_high.x = czm_branchFreeTernary(idlSplit, idlSplitNewPlaneHiLow.x, planes2D_high.x); planes2D_low.x = czm_branchFreeTernary(idlSplit, idlSplitNewPlaneHiLow.y, planes2D_low.x); vec3 southWestCorner = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(vec3(0.0, planes2D_high.xy), vec3(0.0, planes2D_low.xy))).xyz; vec3 northWestCorner = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(vec3(0.0, planes2D_high.x, planes2D_high.z), vec3(0.0, planes2D_low.x, planes2D_low.z))).xyz; vec3 southEastCorner = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(vec3(0.0, planes2D_high.w, planes2D_high.y), vec3(0.0, planes2D_low.w, planes2D_low.y))).xyz; #else // COLUMBUS_VIEW_2D // 3D case has smaller "plane extents," so planes encoded as a 64 bit position and 2 vec3s for distances/direction vec3 southWestCorner = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(czm_batchTable_southWest_HIGH(batchId), czm_batchTable_southWest_LOW(batchId))).xyz; vec3 northWestCorner = czm_normal * czm_batchTable_northward(batchId) + southWestCorner; vec3 southEastCorner = czm_normal * czm_batchTable_eastward(batchId) + southWestCorner; #endif // COLUMBUS_VIEW_2D vec3 eastWard = southEastCorner - southWestCorner; float eastExtent = length(eastWard); eastWard /= eastExtent; vec3 northWard = northWestCorner - southWestCorner; float northExtent = length(northWard); northWard /= northExtent; v_westPlane = vec4(eastWard, -dot(eastWard, southWestCorner)); v_southPlane = vec4(northWard, -dot(northWard, southWestCorner)); v_inversePlaneExtents = vec2(1.0 / eastExtent, 1.0 / northExtent); #endif // SPHERICAL vec4 uvMinAndExtents = czm_batchTable_uvMinAndExtents(batchId); vec4 uMaxVmax = czm_batchTable_uMaxVmax(batchId); v_uMaxAndInverseDistance = vec3(uMaxVmax.xy, uvMinAndExtents.z); v_vMaxAndInverseDistance = vec3(uMaxVmax.zw, uvMinAndExtents.w); v_uvMinAndSphericalLongitudeRotation.xy = uvMinAndExtents.xy; #endif // TEXTURE_COORDINATES #ifdef PER_INSTANCE_COLOR v_color = czm_batchTable_color(batchId); #endif gl_Position = czm_depthClamp(czm_modelViewProjectionRelativeToEye * position); } `;var Eln=T(S(),1),hg=`#ifdef VECTOR_TILE uniform vec4 u_highlightColor; #endif void main(void) { #ifdef VECTOR_TILE out_FragColor = czm_gammaCorrect(u_highlightColor); #else out_FragColor = vec4(1.0); #endif czm_writeDepthClamp(); } `;var Iln=T(S(),1),Ase={TERRAIN:0,CESIUM_3D_TILE:1,BOTH:2};Ase.NUMBER_OF_CLASSIFICATION_TYPES=3;var Un=Object.freeze(Ase);var vln=T(S(),1);var I9e={NEVER:ne.NEVER,LESS:ne.LESS,EQUAL:ne.EQUAL,LESS_OR_EQUAL:ne.LEQUAL,GREATER:ne.GREATER,NOT_EQUAL:ne.NOTEQUAL,GREATER_OR_EQUAL:ne.GEQUAL,ALWAYS:ne.ALWAYS},cc=Object.freeze(I9e);var Zun=T(S(),1);var Aln=T(S(),1);var I5={STREAM_DRAW:ne.STREAM_DRAW,STATIC_DRAW:ne.STATIC_DRAW,DYNAMIC_DRAW:ne.DYNAMIC_DRAW,validate:function(e){return e===I5.STREAM_DRAW||e===I5.STATIC_DRAW||e===I5.DYNAMIC_DRAW}},Ne=Object.freeze(I5);var odn=T(S(),1);var Oln=T(S(),1);function Tu(e){e=y(e,y.EMPTY_OBJECT);let t=e.context._gl,n=e.bufferTarget,i=e.typedArray,o=e.sizeInBytes,r=e.usage,s=l(i);s&&(o=i.byteLength);let a=t.createBuffer();t.bindBuffer(n,a),t.bufferData(n,s?i:o,r),t.bindBuffer(n,null),this._id=Yn(),this._gl=t,this._webgl2=e.context._webgl2,this._bufferTarget=n,this._sizeInBytes=o,this._usage=r,this._buffer=a,this.vertexArrayDestroyable=!0}Tu.createVertexBuffer=function(e){return new Tu({context:e.context,bufferTarget:ne.ARRAY_BUFFER,typedArray:e.typedArray,sizeInBytes:e.sizeInBytes,usage:e.usage})};Tu.createIndexBuffer=function(e){let t=e.context,n=e.indexDatatype,i=Me.getSizeInBytes(n),o=new Tu({context:t,bufferTarget:ne.ELEMENT_ARRAY_BUFFER,typedArray:e.typedArray,sizeInBytes:e.sizeInBytes,usage:e.usage}),r=o.sizeInBytes/i;return Object.defineProperties(o,{indexDatatype:{get:function(){return n}},bytesPerIndex:{get:function(){return i}},numberOfIndices:{get:function(){return r}}}),o};Object.defineProperties(Tu.prototype,{sizeInBytes:{get:function(){return this._sizeInBytes}},usage:{get:function(){return this._usage}}});Tu.prototype._getBuffer=function(){return this._buffer};Tu.prototype.copyFromArrayView=function(e,t){t=y(t,0);let n=this._gl,i=this._bufferTarget;n.bindBuffer(i,this._buffer),n.bufferSubData(i,t,e),n.bindBuffer(i,null)};Tu.prototype.copyFromBuffer=function(e,t,n,i){let o=ne.COPY_READ_BUFFER,r=ne.COPY_WRITE_BUFFER,s=this._gl;s.bindBuffer(r,this._buffer),s.bindBuffer(o,e._buffer),s.copyBufferSubData(o,r,t,n,i),s.bindBuffer(r,null),s.bindBuffer(o,null)};Tu.prototype.getBufferData=function(e,t,n,i){t=y(t,0),n=y(n,0);let o=this._gl,r=ne.COPY_READ_BUFFER;o.bindBuffer(r,this._buffer),o.getBufferSubData(r,t,e,n,i),o.bindBuffer(r,null)};Tu.prototype.isDestroyed=function(){return!1};Tu.prototype.destroy=function(){return this._gl.deleteBuffer(this._buffer),me(this)};var ft=Tu;function W9e(e,t,n,i){let o=l(t.vertexBuffer),r=l(t.value),s=t.value?t.value.length:t.componentsPerAttribute,a={index:y(t.index,n),enabled:y(t.enabled,!0),vertexBuffer:t.vertexBuffer,value:r?t.value.slice(0):void 0,componentsPerAttribute:s,componentDatatype:y(t.componentDatatype,Q.FLOAT),normalize:y(t.normalize,!1),offsetInBytes:y(t.offsetInBytes,0),strideInBytes:y(t.strideInBytes,0),instanceDivisor:y(t.instanceDivisor,0)};if(o)a.vertexAttrib=function(c){let d=this.index;c.bindBuffer(c.ARRAY_BUFFER,this.vertexBuffer._getBuffer()),c.vertexAttribPointer(d,this.componentsPerAttribute,this.componentDatatype,this.normalize,this.strideInBytes,this.offsetInBytes),c.enableVertexAttribArray(d),this.instanceDivisor>0&&(i.glVertexAttribDivisor(d,this.instanceDivisor),i._vertexAttribDivisors[d]=this.instanceDivisor,i._previousDrawInstanced=!0)},a.disableVertexAttribArray=function(c){c.disableVertexAttribArray(this.index),this.instanceDivisor>0&&i.glVertexAttribDivisor(n,0)};else{switch(a.componentsPerAttribute){case 1:a.vertexAttrib=function(c){c.vertexAttrib1fv(this.index,this.value)};break;case 2:a.vertexAttrib=function(c){c.vertexAttrib2fv(this.index,this.value)};break;case 3:a.vertexAttrib=function(c){c.vertexAttrib3fv(this.index,this.value)};break;case 4:a.vertexAttrib=function(c){c.vertexAttrib4fv(this.index,this.value)};break}a.disableVertexAttribArray=function(c){}}e.push(a)}function Nse(e,t,n){for(let i=0;i0&&(c=!0),l(s[r].value)&&(d=!0);let m;t.vertexArrayObject&&(m=t.glCreateVertexArray(),t.glBindVertexArray(m),Nse(n,s,o),t.glBindVertexArray(null)),this._numberOfVertices=a,this._hasInstancedAttributes=c,this._hasConstantAttributes=d,this._context=t,this._gl=n,this._vao=m,this._attributes=s,this._indexBuffer=o}function Mse(e){return e.values.length/e.componentsPerAttribute}function P9e(e){return Q.getSizeInBytes(e.componentDatatype)*e.componentsPerAttribute}function v9e(e){let t,n,i,o=[];for(n in e)e.hasOwnProperty(n)&&l(e[n])&&l(e[n].values)&&(o.push(n),e[n].componentDatatype===Q.DOUBLE&&(e[n].componentDatatype=Q.FLOAT,e[n].values=Q.createTypedArray(Q.FLOAT,e[n].values)));let r,s=o.length;if(s>0)for(r=Mse(e[o[0]]),t=1;t0){let d=Q.getSizeInBytes(e[o[0]].componentDatatype),u=a%d;u!==0&&(a+=d-u);let m=r*a,p=new ArrayBuffer(m),g={};for(t=0;t=W.SIXTY_FOUR_KILOBYTES&&t.elementIndexUint?p=ft.createIndexBuffer({context:t,typedArray:new Uint32Array(g),usage:i,indexDatatype:Me.UNSIGNED_INT}):p=ft.createIndexBuffer({context:t,typedArray:new Uint16Array(g),usage:i,indexDatatype:Me.UNSIGNED_SHORT})),new Np({context:t,attributes:u,indexBuffer:p})};Object.defineProperties(Np.prototype,{numberOfAttributes:{get:function(){return this._attributes.length}},numberOfVertices:{get:function(){return this._numberOfVertices}},indexBuffer:{get:function(){return this._indexBuffer}}});Np.prototype.getAttribute=function(e){return this._attributes[e]};function w9e(e){let t=e._context,n=e._hasInstancedAttributes;if(!n&&!t._previousDrawInstanced)return;t._previousDrawInstanced=n;let i=t._vertexAttribDivisors,o=e._attributes,r=Mt.maximumVertexAttributes,s;if(n){let a=o.length;for(s=0;s0&&(t.glVertexAttribDivisor(s,0),i[s]=0)}function F9e(e,t){let n=e._attributes,i=n.length;for(let o=0;o1){let s=e[0].modelMatrix;for(r=1;r=0){let d=i[a];o=d.offset+d.count,s=d.index,r=n[s].indices.length}else o=0,s=0,r=n[s].indices.length;let c=e.length;for(let d=0;dr&&(o=0,r=n[++s].indices.length),i.push({index:s,offset:o,count:p}),o+=p}}function $9e(e,t){let n=[];return Zz(e,"geometry",t,n),Zz(e,"westHemisphereGeometry",t,n),Zz(e,"eastHemisphereGeometry",t,n),n}var Up={};Up.combineGeometry=function(e){let t,n,i=e.instances,o=i.length,r,s,a=!1;o>0&&(t=q9e(e),t.length>0&&(n=An.createAttributeLocations(t[0]),e.createPickOffsets&&(r=$9e(i,t))),l(i[0].attributes)&&l(i[0].attributes.offset)&&(s=new Array(o),a=!0));let c=new Array(o),d=new Array(o);for(let u=0;u0&&(n.set(c.indices,s),s+=f)}return t.push(n.buffer),{stringTable:i,packedData:n}};Up.unpackCreateGeometryResults=function(e){let t=e.stringTable,n=e.packedData,i,o=new Array(n[0]),r=0,s=1;for(;s0){let G=_.length/C;for(Z=Me.createTypedArray(G,x),i=0;i= nearSq && distanceSq <= farSq) ? 1.0 : 0.0; gl_Position *= show; }`,`${i} ${o}`};function Hse(e,t){if(!e.compressVertices)return t;let n=t.search(/in\s+vec3\s+normal;/g)!==-1,i=t.search(/in\s+vec2\s+st;/g)!==-1;if(!n&&!i)return t;let o=t.search(/in\s+vec3\s+tangent;/g)!==-1,r=t.search(/in\s+vec3\s+bitangent;/g)!==-1,s=i&&n?2:1;s+=o||r?1:0;let a=s>1?`vec${s}`:"float",c="compressedAttributes",d=`in ${a} ${c};`,u="",m="";if(i){u+=`vec2 st; `;let f=s>1?`${c}.x`:c;m+=` st = czm_decompressTextureCoordinates(${f}); `}n&&o&&r?(u+=`vec3 normal; vec3 tangent; vec3 bitangent; `,m+=` czm_octDecode(${c}.${i?"yz":"xy"}, normal, tangent, bitangent); `):(n&&(u+=`vec3 normal; `,m+=` normal = czm_octDecode(${c}${s>1?`.${i?"y":"x"}`:""}); `),o&&(u+=`vec3 tangent; `,m+=` tangent = czm_octDecode(${c}.${i&&n?"z":"y"}); `),r&&(u+=`vec3 bitangent; `,m+=` bitangent = czm_octDecode(${c}.${i&&n?"z":"y"}); `));let p=t;p=p.replace(/in\s+vec3\s+normal;/g,""),p=p.replace(/in\s+vec2\s+st;/g,""),p=p.replace(/in\s+vec3\s+tangent;/g,""),p=p.replace(/in\s+vec3\s+bitangent;/g,""),p=Ye.replaceMain(p,"czm_non_compressed_main");let g=`void main() { ${m} czm_non_compressed_main(); }`;return[d,u,p,g].join(` `)}function fAe(e){let t=Ye.replaceMain(e,"czm_non_depth_clamp_main");return t+=`void main() { czm_non_depth_clamp_main(); gl_Position = czm_depthClamp(gl_Position);} `,t}function pAe(e){let t=Ye.replaceMain(e,"czm_non_depth_clamp_main");return t+=`void main() { czm_non_depth_clamp_main(); #if defined(LOG_DEPTH) czm_writeLogDepth(); #else czm_writeDepthClamp(); #endif } `,t}function zse(e,t){let n=e.vertexAttributes}function bAe(e,t){return function(){return e[t]}}var Gz=Math.max(Yt.hardwareConcurrency-1,1),P5,gAe=new hi("combineGeometry");function yAe(e,t){let n,i,o,r,s=e._instanceIds;if(e._state===pr.READY){n=Array.isArray(e.geometryInstances)?e.geometryInstances:[e.geometryInstances];let a=e._numberOfInstances=n.length,c=[],d=[];for(o=0;o0){let x=new Float64Array(m);for(f=[x.buffer],r=0;r0?(e._recomputeBoundingSpheres=!0,e._state=pr.COMBINED):wX(e,t,pr.FAILED,void 0)}).catch(function(m){wX(e,t,pr.FAILED,m)})}}function xAe(e,t){let n=Array.isArray(e.geometryInstances)?e.geometryInstances:[e.geometryInstances],i=e._numberOfInstances=n.length,o=new Array(i),r=e._instanceIds,s,a,c=0;for(a=0;a0?(e._recomputeBoundingSpheres=!0,e._state=pr.COMBINED):wX(e,t,pr.FAILED,void 0)}function _Ae(e,t){let n=e._batchTableAttributeIndices.offset;if(!e._recomputeBoundingSpheres||!l(n)){e._recomputeBoundingSpheres=!1;return}let i,o=e._offsetInstanceExtend,r=e._instanceBoundingSpheres,s=r.length,a=e._tempBoundingSpheres;if(!l(a)){for(a=new Array(s),i=0;i0||le.intersectPlane(x,cn.ORIGIN_ZX_PLANE)!==Kt.INTERSECTING?c.push(x):(d.push(x),u.push(x))}let m=c[0],p=u[0],g=d[0];for(i=1;i0){if(Mt.maximumVertexTextureImageUnits===0)throw new ue("Vertex texture fetch support is required to render primitives with per-instance attributes. The maximum number of vertex texture image units must be greater than zero.");this._batchTable.update(e)}if(this._state!==pr.COMPLETE&&this._state!==pr.COMBINED&&(this.asynchronous?yAe(this,e):xAe(this,e)),this._state===pr.COMBINED&&(TAe(this,e),Jse(this,e),CAe(this,e)),!this.show||this._state!==pr.COMPLETE)return;this._batchTableOffsetsUpdated||Jse(this,e),this._recomputeBoundingSpheres&&_Ae(this,e);let n=this.appearance,i=n.material,o=!1,r=!1;this._appearance!==n?(this._appearance=n,this._material=i,o=!0,r=!0):this._material!==i&&(this._material=i,r=!0);let s=this.depthFailAppearance,a=l(s)?s.material:void 0;this._depthFailAppearance!==s?(this._depthFailAppearance=s,this._depthFailMaterial=a,o=!0,r=!0):this._depthFailMaterial!==a&&(this._depthFailMaterial=a,r=!0);let c=this._appearance.isTranslucent();this._translucent!==c&&(this._translucent=c,o=!0),l(this._material)&&this._material.update(t);let d=n.closed&&c;o&&y(this._createRenderStatesFunction,VAe)(this,t,n,d),r&&y(this._createShaderProgramFunction,LAe)(this,e,n),(o||r)&&y(this._createCommandsFunction,RAe)(this,n,i,c,d,this._colorCommands,this._pickCommands,e),y(this._updateAndQueueCommandsFunction,ZAe)(this,e,this._colorCommands,this._pickCommands,this.modelMatrix,this.cull,this.debugShowBoundingVolume,d)};var GAe=new le,EAe=new le;function iae(e,t,n){if(n===ln.TOP){let i=le.clone(e,GAe),o=le.clone(e,EAe);o.center=h.add(o.center,t,o.center),e=le.union(i,o,e)}else n===ln.ALL&&(e.center=h.add(e.center,t,e.center));return e}function XAe(e,t,n){return function(){let i=e.getBatchedAttribute(t,n),o=e.attributes[n],r=o.componentsPerAttribute,s=Q.createTypedArray(o.componentDatatype,r);return l(i.constructor.pack)?i.constructor.pack(i,s,0):s[0]=i,s}}function IAe(e,t,n,i,o){return function(r){let s=$se(r);e.setBatchedAttribute(t,n,s),o==="offset"&&(i._recomputeBoundingSpheres=!0,i._batchTableOffsetsUpdated=!1)}}var WAe=new h;function PAe(e,t,n){t.boundingSphere={get:function(){let i=e._instanceBoundingSpheres[n];if(l(i)){i=i.clone();let o=e.modelMatrix,r=t.offset;l(r)&&iae(i,h.fromArray(r.get(),0,WAe),e._offsetInstanceExtend[n]),l(o)&&(i=le.transform(i,o))}return i}},t.boundingSphereCV={get:function(){return e._instanceBoundingSpheresCV[n]}}}function vAe(e,t,n){t.pickId={get:function(){return e._pickIds[n]}}}br.prototype.getGeometryInstanceAttributes=function(e){let t=this._perInstanceAttributeCache.get(e);if(l(t))return t;let n=-1,i=this._lastPerInstanceAttributeIndex,o=this._instanceIds,r=o.length;for(let d=0;d 0.0 && upOrRightInBounds.x && upOrRightInBounds.y); float useDownOrLeft = float(useUpOrRight == 0.0); vec3 upOrRightEC = getEyeCoordinate3FromWindowCoordinate(glFragCoordXY + positiveOffset, upOrRightLogDepth); vec3 downOrLeftEC = getEyeCoordinate3FromWindowCoordinate(glFragCoordXY - positiveOffset, downOrLeftLogDepth); return (upOrRightEC - (eyeCoordinate.xyz / eyeCoordinate.w)) * useUpOrRight + ((eyeCoordinate.xyz / eyeCoordinate.w) - downOrLeftEC) * useDownOrLeft; } #endif // NORMAL_EC void main(void) { #ifdef REQUIRES_EC float logDepthOrDepth = czm_unpackDepth(texture(czm_globeDepthTexture, gl_FragCoord.xy / czm_viewport.zw)); vec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, logDepthOrDepth); #endif #ifdef REQUIRES_WC vec4 worldCoordinate4 = czm_inverseView * eyeCoordinate; vec3 worldCoordinate = worldCoordinate4.xyz / worldCoordinate4.w; #endif #ifdef TEXTURE_COORDINATES vec2 uv; #ifdef SPHERICAL // Treat world coords as a sphere normal for spherical coordinates vec2 sphericalLatLong = czm_approximateSphericalCoordinates(worldCoordinate); sphericalLatLong.y += v_uvMinAndSphericalLongitudeRotation.z; sphericalLatLong.y = czm_branchFreeTernary(sphericalLatLong.y < czm_pi, sphericalLatLong.y, sphericalLatLong.y - czm_twoPi); uv.x = (sphericalLatLong.y - v_sphericalExtents.y) * v_sphericalExtents.w; uv.y = (sphericalLatLong.x - v_sphericalExtents.x) * v_sphericalExtents.z; #else // SPHERICAL // Unpack planes and transform to eye space uv.x = czm_planeDistance(v_westPlane, eyeCoordinate.xyz / eyeCoordinate.w) * v_inversePlaneExtents.x; uv.y = czm_planeDistance(v_southPlane, eyeCoordinate.xyz / eyeCoordinate.w) * v_inversePlaneExtents.y; #endif // SPHERICAL #endif // TEXTURE_COORDINATES #ifdef PICK #ifdef CULL_FRAGMENTS // When classifying translucent geometry, logDepthOrDepth == 0.0 // indicates a region that should not be classified, possibly due to there // being opaque pixels there in another buffer. // Check for logDepthOrDepth != 0.0 to make sure this should be classified. if (0.0 <= uv.x && uv.x <= 1.0 && 0.0 <= uv.y && uv.y <= 1.0 || logDepthOrDepth != 0.0) { out_FragColor.a = 1.0; // 0.0 alpha leads to discard from ShaderSource.createPickFragmentShaderSource czm_writeDepthClamp(); } #else // CULL_FRAGMENTS out_FragColor.a = 1.0; #endif // CULL_FRAGMENTS #else // PICK #ifdef CULL_FRAGMENTS // When classifying translucent geometry, logDepthOrDepth == 0.0 // indicates a region that should not be classified, possibly due to there // being opaque pixels there in another buffer. if (uv.x <= 0.0 || 1.0 <= uv.x || uv.y <= 0.0 || 1.0 <= uv.y || logDepthOrDepth == 0.0) { discard; } #endif #ifdef NORMAL_EC // Compute normal by sampling adjacent pixels in 2x2 block in screen space vec3 downUp = vectorFromOffset(eyeCoordinate, vec2(0.0, 1.0)); vec3 leftRight = vectorFromOffset(eyeCoordinate, vec2(1.0, 0.0)); vec3 normalEC = normalize(cross(leftRight, downUp)); #endif #ifdef PER_INSTANCE_COLOR vec4 color = czm_gammaCorrect(v_color); #ifdef FLAT out_FragColor = color; #else // FLAT czm_materialInput materialInput; materialInput.normalEC = normalEC; materialInput.positionToEyeEC = -eyeCoordinate.xyz; czm_material material = czm_getDefaultMaterial(materialInput); material.diffuse = color.rgb; material.alpha = color.a; out_FragColor = czm_phong(normalize(-eyeCoordinate.xyz), material, czm_lightDirectionEC); #endif // FLAT // Premultiply alpha. Required for classification primitives on translucent globe. out_FragColor.rgb *= out_FragColor.a; #else // PER_INSTANCE_COLOR // Material support. // USES_ is distinct from REQUIRES_, because some things are dependencies of each other or // dependencies for culling but might not actually be used by the material. czm_materialInput materialInput; #ifdef USES_NORMAL_EC materialInput.normalEC = normalEC; #endif #ifdef USES_POSITION_TO_EYE_EC materialInput.positionToEyeEC = -eyeCoordinate.xyz; #endif #ifdef USES_TANGENT_TO_EYE materialInput.tangentToEyeMatrix = czm_eastNorthUpToEyeCoordinates(worldCoordinate, normalEC); #endif #ifdef USES_ST // Remap texture coordinates from computed (approximately aligned with cartographic space) to the desired // texture coordinate system, which typically forms a tight oriented bounding box around the geometry. // Shader is provided a set of reference points for remapping. materialInput.st.x = czm_lineDistance(v_uvMinAndSphericalLongitudeRotation.xy, v_uMaxAndInverseDistance.xy, uv) * v_uMaxAndInverseDistance.z; materialInput.st.y = czm_lineDistance(v_uvMinAndSphericalLongitudeRotation.xy, v_vMaxAndInverseDistance.xy, uv) * v_vMaxAndInverseDistance.z; #endif czm_material material = czm_getMaterial(materialInput); #ifdef FLAT out_FragColor = vec4(material.diffuse + material.emission, material.alpha); #else // FLAT out_FragColor = czm_phong(normalize(-eyeCoordinate.xyz), material, czm_lightDirectionEC); #endif // FLAT // Premultiply alpha. Required for classification primitives on translucent globe. out_FragColor.rgb *= out_FragColor.a; #endif // PER_INSTANCE_COLOR czm_writeDepthClamp(); #endif // PICK } `;function Su(e,t,n){this._projectionExtentDefines={eastMostYhighDefine:"",eastMostYlowDefine:"",westMostYhighDefine:"",westMostYlowDefine:""};let i=new Xz;i.requiresTextureCoordinates=e,i.requiresEC=!n.flat;let o=new Xz;if(o.requiresTextureCoordinates=e,n instanceof dn)i.requiresNormalEC=!n.flat;else{let r=`${n.material.shaderSource} ${n.fragmentShaderSource}`;i.normalEC=r.indexOf("materialInput.normalEC")!==-1||r.indexOf("czm_getDefaultMaterial")!==-1,i.positionToEyeEC=r.indexOf("materialInput.positionToEyeEC")!==-1,i.tangentToEyeMatrix=r.indexOf("materialInput.tangentToEyeMatrix")!==-1,i.st=r.indexOf("materialInput.st")!==-1}this._colorShaderDependencies=i,this._pickShaderDependencies=o,this._appearance=n,this._extentsCulling=e,this._planarExtents=t}Su.prototype.createFragmentShader=function(e){let t=this._appearance,n=this._colorShaderDependencies,i=[];!e&&!this._planarExtents&&i.push("SPHERICAL"),n.requiresEC&&i.push("REQUIRES_EC"),n.requiresWC&&i.push("REQUIRES_WC"),n.requiresTextureCoordinates&&i.push("TEXTURE_COORDINATES"),this._extentsCulling&&i.push("CULL_FRAGMENTS"),n.requiresNormalEC&&i.push("NORMAL_EC"),t instanceof dn&&i.push("PER_INSTANCE_COLOR"),n.normalEC&&i.push("USES_NORMAL_EC"),n.positionToEyeEC&&i.push("USES_POSITION_TO_EYE_EC"),n.tangentToEyeMatrix&&i.push("USES_TANGENT_TO_EYE"),n.st&&i.push("USES_ST"),t.flat&&i.push("FLAT");let o="";return t instanceof dn||(o=t.material.shaderSource),new Ye({defines:i,sources:[o,NC]})};Su.prototype.createPickFragmentShader=function(e){let t=this._pickShaderDependencies,n=["PICK"];return!e&&!this._planarExtents&&n.push("SPHERICAL"),t.requiresEC&&n.push("REQUIRES_EC"),t.requiresWC&&n.push("REQUIRES_WC"),t.requiresTextureCoordinates&&n.push("TEXTURE_COORDINATES"),this._extentsCulling&&n.push("CULL_FRAGMENTS"),new Ye({defines:n,sources:[NC],pickColorQualifier:"in"})};Su.prototype.createVertexShader=function(e,t,n,i){return uae(this._colorShaderDependencies,this._planarExtents,n,e,t,this._appearance,i,this._projectionExtentDefines)};Su.prototype.createPickVertexShader=function(e,t,n,i){return uae(this._pickShaderDependencies,this._planarExtents,n,e,t,void 0,i,this._projectionExtentDefines)};var oae=new h,rae=new he,sae={high:0,low:0};function uae(e,t,n,i,o,r,s,a){let c=i.slice();if(a.eastMostYhighDefine===""){let d=rae;d.longitude=W.PI,d.latitude=0,d.height=0;let u=s.project(d,oae),m=Bn.encode(u.x,sae);a.eastMostYhighDefine=`EAST_MOST_X_HIGH ${m.high.toFixed(`${m.high}`.length+1)}`,a.eastMostYlowDefine=`EAST_MOST_X_LOW ${m.low.toFixed(`${m.low}`.length+1)}`;let p=rae;p.longitude=-W.PI,p.latitude=0,p.height=0;let g=s.project(p,oae);m=Bn.encode(g.x,sae),a.westMostYhighDefine=`WEST_MOST_X_HIGH ${m.high.toFixed(`${m.high}`.length+1)}`,a.westMostYlowDefine=`WEST_MOST_X_LOW ${m.low.toFixed(`${m.low}`.length+1)}`}return n&&(c.push(a.eastMostYhighDefine),c.push(a.eastMostYlowDefine),c.push(a.westMostYhighDefine),c.push(a.westMostYlowDefine)),l(r)&&r instanceof dn&&c.push("PER_INSTANCE_COLOR"),e.requiresTextureCoordinates&&(c.push("TEXTURE_COORDINATES"),t||n||c.push("SPHERICAL"),n&&c.push("COLUMBUS_VIEW_2D")),new Ye({defines:c,sources:[o]})}function Xz(){this._requiresEC=!1,this._requiresWC=!1,this._requiresNormalEC=!1,this._requiresTextureCoordinates=!1,this._usesNormalEC=!1,this._usesPositionToEyeEC=!1,this._usesTangentToEyeMat=!1,this._usesSt=!1}Object.defineProperties(Xz.prototype,{requiresEC:{get:function(){return this._requiresEC},set:function(e){this._requiresEC=e||this._requiresEC}},requiresWC:{get:function(){return this._requiresWC},set:function(e){this._requiresWC=e||this._requiresWC,this.requiresEC=this._requiresWC}},requiresNormalEC:{get:function(){return this._requiresNormalEC},set:function(e){this._requiresNormalEC=e||this._requiresNormalEC,this.requiresEC=this._requiresNormalEC}},requiresTextureCoordinates:{get:function(){return this._requiresTextureCoordinates},set:function(e){this._requiresTextureCoordinates=e||this._requiresTextureCoordinates,this.requiresWC=this._requiresTextureCoordinates}},normalEC:{set:function(e){this.requiresNormalEC=e,this._usesNormalEC=e},get:function(){return this._usesNormalEC}},tangentToEyeMatrix:{set:function(e){this.requiresWC=e,this.requiresNormalEC=e,this._usesTangentToEyeMat=e},get:function(){return this._usesTangentToEyeMat}},positionToEyeEC:{set:function(e){this.requiresEC=e,this._usesPositionToEyeEC=e},get:function(){return this._usesPositionToEyeEC}},st:{set:function(e){this.requiresTextureCoordinates=e,this._usesSt=e},get:function(){return this._usesSt}}});function aae(e,t,n){return Math.abs((t.y-e.y)*n.x-(t.x-e.x)*n.y+t.x*e.y-t.y*e.x)/D.distance(t,e)}var wAe=[new D,new D,new D,new D];function mae(e,t){let n=wAe,i=D.unpack(t,0,n[0]),o=D.unpack(t,2,n[1]),r=D.unpack(t,4,n[2]);e.uMaxVmax=new $a({componentDatatype:Q.FLOAT,componentsPerAttribute:4,normalize:!1,value:[o.x,o.y,r.x,r.y]});let s=1/aae(i,o,r),a=1/aae(i,r,o);e.uvMinAndExtents=new $a({componentDatatype:Q.FLOAT,componentsPerAttribute:4,normalize:!1,value:[i.x,i.y,s,a]})}var hae=new he,fae=new h,FAe=new h,AAe=new h,v5={high:0,low:0};function pae(e,t,n){let i=hae;i.height=0,i.longitude=e.west,i.latitude=e.south;let o=t.project(i,fae);i.latitude=e.north;let r=t.project(i,FAe);i.longitude=e.east,i.latitude=e.south;let s=t.project(i,AAe),a=[0,0,0,0],c=[0,0,0,0],d=Bn.encode(o.x,v5);a[0]=d.high,c[0]=d.low,d=Bn.encode(o.y,v5),a[1]=d.high,c[1]=d.low,d=Bn.encode(r.y,v5),a[2]=d.high,c[2]=d.low,d=Bn.encode(s.x,v5),a[3]=d.high,c[3]=d.low,n.planes2D_HIGH=new $a({componentDatatype:Q.FLOAT,componentsPerAttribute:4,normalize:!1,value:a}),n.planes2D_LOW=new $a({componentDatatype:Q.FLOAT,componentsPerAttribute:4,normalize:!1,value:c})}var MAe=new M,NAe=new M,cae=new h,kAe=new he,UAe=[new he,new he,new he,new he,new he,new he,new he,new he];function DAe(e,t,n,i,o,r){let s=ce.center(e,kAe);s.height=n;let a=he.toCartesian(s,t,cae),c=Gt.eastNorthUpToFixedFrame(a,t,MAe),d=M.inverse(c,NAe),u=e.west,m=e.east,p=e.north,g=e.south,f=UAe;f[0].latitude=g,f[0].longitude=u,f[1].latitude=p,f[1].longitude=u,f[2].latitude=p,f[2].longitude=m,f[3].latitude=g,f[3].longitude=m;let x=(u+m)*.5,_=(p+g)*.5;f[4].latitude=g,f[4].longitude=x,f[5].latitude=p,f[5].longitude=x,f[6].latitude=_,f[6].longitude=u,f[7].latitude=_,f[7].longitude=m;let C=Number.POSITIVE_INFINITY,V=Number.NEGATIVE_INFINITY,L=Number.POSITIVE_INFINITY,Z=Number.NEGATIVE_INFINITY;for(let P=0;P<8;P++){f[P].height=n;let F=he.toCartesian(f[P],t,cae);M.multiplyByPoint(d,F,F),F.z=0,C=Math.min(C,F.x),V=Math.max(V,F.x),L=Math.min(L,F.y),Z=Math.max(Z,F.y)}let G=i;G.x=C,G.y=L,G.z=0,M.multiplyByPoint(c,G,G);let X=o;X.x=V,X.y=L,X.z=0,M.multiplyByPoint(c,X,X),h.subtract(X,G,o);let v=r;v.x=C,v.y=Z,v.z=0,M.multiplyByPoint(c,v,v),h.subtract(v,G,r)}var BAe=new h,YAe=new h,OAe=new Bn;Su.getPlanarTextureCoordinateAttributes=function(e,t,n,i,o){let r=fae,s=BAe,a=YAe;DAe(e,n,y(o,0),r,s,a);let c={};mae(c,t);let d=Bn.fromCartesian(r,OAe);return c.southWest_HIGH=new $a({componentDatatype:Q.FLOAT,componentsPerAttribute:3,normalize:!1,value:h.pack(d.high,[0,0,0])}),c.southWest_LOW=new $a({componentDatatype:Q.FLOAT,componentsPerAttribute:3,normalize:!1,value:h.pack(d.low,[0,0,0])}),c.eastward=new $a({componentDatatype:Q.FLOAT,componentsPerAttribute:3,normalize:!1,value:h.pack(s,[0,0,0])}),c.northward=new $a({componentDatatype:Q.FLOAT,componentsPerAttribute:3,normalize:!1,value:h.pack(a,[0,0,0])}),pae(e,i,c),c};var HAe=new h;function lae(e,t,n,i){let o=hae;o.latitude=e,o.longitude=t,o.height=0;let r=he.toCartesian(o,n,HAe),s=Math.sqrt(r.x*r.x+r.y*r.y),a=W.fastApproximateAtan2(s,r.z),c=W.fastApproximateAtan2(r.x,r.y);return i.x=a,i.y=c,i}var dae=new D;Su.getSphericalExtentGeometryInstanceAttributes=function(e,t,n,i){let o=lae(e.south,e.west,n,dae),r=o.x,s=o.y,a=lae(e.north,e.east,n,dae),c=a.x,d=a.y,u=0;s>d&&(u=W.PI-s,s=-W.PI,d+=u),r-=W.EPSILON5,s-=W.EPSILON5,c+=W.EPSILON5,d+=W.EPSILON5;let m=1/(d-s),p=1/(c-r),g={sphericalExtents:new $a({componentDatatype:Q.FLOAT,componentsPerAttribute:4,normalize:!1,value:[r,s,p,m]}),longitudeRotation:new $a({componentDatatype:Q.FLOAT,componentsPerAttribute:1,normalize:!1,value:[u]})};return mae(g,t),pae(e,i,g),g};Su.hasAttributesForTextureCoordinatePlanes=function(e){return l(e.southWest_HIGH)&&l(e.southWest_LOW)&&l(e.northward)&&l(e.eastward)&&l(e.planes2D_HIGH)&&l(e.planes2D_LOW)&&l(e.uMaxVmax)&&l(e.uvMinAndExtents)};Su.hasAttributesForSphericalExtents=function(e){return l(e.sphericalExtents)&&l(e.longitudeRotation)&&l(e.planes2D_HIGH)&&l(e.planes2D_LOW)&&l(e.uMaxVmax)&&l(e.uvMinAndExtents)};function zAe(e){return Math.max(e.width,e.height)>Su.MAX_WIDTH_FOR_PLANAR_EXTENTS}Su.shouldUseSphericalCoordinates=function(e){return zAe(e)};Su.MAX_WIDTH_FOR_PLANAR_EXTENTS=W.toRadians(1);var gd=Su;var nmn=T(S(),1);var Jun=T(S(),1);var KAe={NEVER:ne.NEVER,LESS:ne.LESS,EQUAL:ne.EQUAL,LESS_OR_EQUAL:ne.LEQUAL,GREATER:ne.GREATER,NOT_EQUAL:ne.NOTEQUAL,GREATER_OR_EQUAL:ne.GEQUAL,ALWAYS:ne.ALWAYS},Dn=Object.freeze(KAe);var qun=T(S(),1);var JAe={ZERO:ne.ZERO,KEEP:ne.KEEP,REPLACE:ne.REPLACE,INCREMENT:ne.INCR,DECREMENT:ne.DECR,INVERT:ne.INVERT,INCREMENT_WRAP:ne.INCR_WRAP,DECREMENT_WRAP:ne.DECR_WRAP},pt=Object.freeze(JAe);var w5={CESIUM_3D_TILE_MASK:128,SKIP_LOD_MASK:112,SKIP_LOD_BIT_SHIFT:4,CLASSIFICATION_MASK:15};w5.setCesium3DTileBit=function(){return{enabled:!0,frontFunction:Dn.ALWAYS,frontOperation:{fail:pt.KEEP,zFail:pt.KEEP,zPass:pt.REPLACE},backFunction:Dn.ALWAYS,backOperation:{fail:pt.KEEP,zFail:pt.KEEP,zPass:pt.REPLACE},reference:w5.CESIUM_3D_TILE_MASK,mask:w5.CESIUM_3D_TILE_MASK}};var Nt=Object.freeze(w5);function e_(e){e=y(e,y.EMPTY_OBJECT);let t=e.geometryInstances;this.geometryInstances=t,this.show=y(e.show,!0),this.classificationType=y(e.classificationType,Un.BOTH),this.debugShowBoundingVolume=y(e.debugShowBoundingVolume,!1),this.debugShowShadowVolume=y(e.debugShowShadowVolume,!1),this._debugShowShadowVolume=!1,this._extruded=y(e._extruded,!1),this._uniformMap=e._uniformMap,this._sp=void 0,this._spStencil=void 0,this._spPick=void 0,this._spColor=void 0,this._spPick2D=void 0,this._spColor2D=void 0,this._rsStencilDepthPass=void 0,this._rsStencilDepthPass3DTiles=void 0,this._rsColorPass=void 0,this._rsPickPass=void 0,this._commandsIgnoreShow=[],this._ready=!1,this._primitive=void 0,this._pickPrimitive=e._pickPrimitive,this._hasSphericalExtentsAttribute=!1,this._hasPlanarExtentsAttributes=!1,this._hasPerColorAttribute=!1,this.appearance=e.appearance,this._createBoundingVolumeFunction=e._createBoundingVolumeFunction,this._updateAndQueueCommandsFunction=e._updateAndQueueCommandsFunction,this._usePickOffsets=!1,this._primitiveOptions={geometryInstances:void 0,appearance:void 0,vertexCacheOptimize:y(e.vertexCacheOptimize,!1),interleave:y(e.interleave,!1),releaseGeometryInstances:y(e.releaseGeometryInstances,!0),allowPicking:y(e.allowPicking,!0),asynchronous:y(e.asynchronous,!0),compressVertices:y(e.compressVertices,!0),_createBoundingVolumeFunction:void 0,_createRenderStatesFunction:void 0,_createShaderProgramFunction:void 0,_createCommandsFunction:void 0,_updateAndQueueCommandsFunction:void 0,_createPickOffsets:!0}}Object.defineProperties(e_.prototype,{vertexCacheOptimize:{get:function(){return this._primitiveOptions.vertexCacheOptimize}},interleave:{get:function(){return this._primitiveOptions.interleave}},releaseGeometryInstances:{get:function(){return this._primitiveOptions.releaseGeometryInstances}},allowPicking:{get:function(){return this._primitiveOptions.allowPicking}},asynchronous:{get:function(){return this._primitiveOptions.asynchronous}},compressVertices:{get:function(){return this._primitiveOptions.compressVertices}},ready:{get:function(){return this._ready}},_needs2DShader:{get:function(){return this._hasPlanarExtentsAttributes||this._hasSphericalExtentsAttribute}}});e_.isSupported=function(e){return e.context.stencilBuffer};function kC(e,t){let n=t?Dn.EQUAL:Dn.ALWAYS;return{colorMask:{red:!1,green:!1,blue:!1,alpha:!1},stencilTest:{enabled:e,frontFunction:n,frontOperation:{fail:pt.KEEP,zFail:pt.DECREMENT_WRAP,zPass:pt.KEEP},backFunction:n,backOperation:{fail:pt.KEEP,zFail:pt.INCREMENT_WRAP,zPass:pt.KEEP},reference:Nt.CESIUM_3D_TILE_MASK,mask:Nt.CESIUM_3D_TILE_MASK},stencilMask:Nt.CLASSIFICATION_MASK,depthTest:{enabled:!0,func:cc.LESS_OR_EQUAL},depthMask:!1}}function Wz(e){return{stencilTest:{enabled:e,frontFunction:Dn.NOT_EQUAL,frontOperation:{fail:pt.ZERO,zFail:pt.ZERO,zPass:pt.ZERO},backFunction:Dn.NOT_EQUAL,backOperation:{fail:pt.ZERO,zFail:pt.ZERO,zPass:pt.ZERO},reference:0,mask:Nt.CLASSIFICATION_MASK},stencilMask:Nt.CLASSIFICATION_MASK,depthTest:{enabled:!1},depthMask:!1,blending:un.PRE_MULTIPLIED_ALPHA_BLEND}}var QAe={stencilTest:{enabled:!0,frontFunction:Dn.NOT_EQUAL,frontOperation:{fail:pt.ZERO,zFail:pt.ZERO,zPass:pt.ZERO},backFunction:Dn.NOT_EQUAL,backOperation:{fail:pt.ZERO,zFail:pt.ZERO,zPass:pt.ZERO},reference:0,mask:Nt.CLASSIFICATION_MASK},stencilMask:Nt.CLASSIFICATION_MASK,depthTest:{enabled:!1},depthMask:!1};function jAe(e,t,n,i){if(l(e._rsStencilDepthPass))return;let o=!e.debugShowShadowVolume;e._rsStencilDepthPass=De.fromCache(kC(o,!1)),e._rsStencilDepthPass3DTiles=De.fromCache(kC(o,!0)),e._rsColorPass=De.fromCache(Wz(o,!1)),e._rsPickPass=De.fromCache(QAe)}function qAe(e,t){if(!e.compressVertices)return t;if(t.search(/in\s+vec3\s+extrudeDirection;/g)!==-1){let n="compressedAttributes",i=`in vec2 ${n};`,o=`vec3 extrudeDirection; `,r=` extrudeDirection = czm_octDecode(${n}, 65535.0); `,s=t;s=s.replace(/in\s+vec3\s+extrudeDirection;/g,""),s=Ye.replaceMain(s,"czm_non_compressed_main");let a=`void main() { ${r} czm_non_compressed_main(); }`;return[i,o,s,a].join(` `)}}function $Ae(e,t){let n=t.context,i=e._primitive,o=WX;o=e._primitive._batchTable.getVertexShaderCallback()(o),o=En._appendDistanceDisplayConditionToShader(i,o),o=En._modifyShaderPosition(e,o,t.scene3DOnly),o=En._updateColorAttribute(i,o);let r=e._hasPlanarExtentsAttributes,s=r||e._hasSphericalExtentsAttribute;e._extruded&&(o=qAe(i,o));let a=e._extruded?"EXTRUDED_GEOMETRY":"",c=new Ye({defines:[a],sources:[o]}),d=new Ye({sources:[hg]}),u=e._primitive._attributeLocations,m=new gd(s,r,e.appearance);if(e._spStencil=$t.replaceCache({context:n,shaderProgram:e._spStencil,vertexShaderSource:c,fragmentShaderSource:d,attributeLocations:u}),e._primitive.allowPicking){let f=Ye.createPickVertexShaderSource(o);f=En._appendShowToShader(i,f),f=En._updatePickColorAttribute(f);let x=m.createPickFragmentShader(!1),_=m.createPickVertexShader([a],f,!1,t.mapProjection);if(e._spPick=$t.replaceCache({context:n,shaderProgram:e._spPick,vertexShaderSource:_,fragmentShaderSource:x,attributeLocations:u}),s){let C=n.shaderCache.getDerivedShaderProgram(e._spPick,"2dPick");if(!l(C)){let V=m.createPickFragmentShader(!0),L=m.createPickVertexShader([a],f,!0,t.mapProjection);C=n.shaderCache.createDerivedShaderProgram(e._spPick,"2dPick",{vertexShaderSource:L,fragmentShaderSource:V,attributeLocations:u})}e._spPick2D=C}}else e._spPick=$t.fromCache({context:n,vertexShaderSource:c,fragmentShaderSource:d,attributeLocations:u});o=En._appendShowToShader(i,o),c=new Ye({defines:[a],sources:[o]}),e._sp=$t.replaceCache({context:n,shaderProgram:e._sp,vertexShaderSource:c,fragmentShaderSource:d,attributeLocations:u});let p=m.createFragmentShader(!1),g=m.createVertexShader([a],o,!1,t.mapProjection);if(e._spColor=$t.replaceCache({context:n,shaderProgram:e._spColor,vertexShaderSource:g,fragmentShaderSource:p,attributeLocations:u}),s){let f=n.shaderCache.getDerivedShaderProgram(e._spColor,"2dColor");if(!l(f)){let x=m.createFragmentShader(!0),_=m.createVertexShader([a],o,!0,t.mapProjection);f=n.shaderCache.createDerivedShaderProgram(e._spColor,"2dColor",{vertexShaderSource:_,fragmentShaderSource:x,attributeLocations:u})}e._spColor2D=f}}function eMe(e,t){let n=e._primitive,i=n._va.length*2;t.length=i;let o,r,s,a=0,c=n._batchTable.getUniformMapCallback()(e._uniformMap),d=e._needs2DShader;for(o=0;o0&&(c=o[0].attributes,p=gd.hasAttributesForSphericalExtents(c),g=gd.hasAttributesForTextureCoordinatePlanes(c),m=c.color),s=0;s{l(this._primitive)&&this._primitive.ready&&(this._ready=!0,this.releaseGeometryInstances&&(this.geometryInstances=void 0))})};e_.prototype.getGeometryInstanceAttributes=function(e){return this._primitive.getGeometryInstanceAttributes(e)};e_.prototype.isDestroyed=function(){return!1};e_.prototype.destroy=function(){return this._primitive=this._primitive&&this._primitive.destroy(),this._sp=this._sp&&this._sp.destroy(),this._spPick=this._spPick&&this._spPick.destroy(),this._spColor=this._spColor&&this._spColor.destroy(),this._spPick2D=void 0,this._spColor2D=void 0,me(this)};var UC=e_;var oMe={u_globeMinimumAltitude:function(){return 55e3}};function Zl(e){e=y(e,y.EMPTY_OBJECT);let t=e.appearance,n=e.geometryInstances;if(!l(t)&&l(n)){let o=Array.isArray(n)?n:[n],r=o.length;for(let s=0;s{!this._ready&&l(this._primitive)&&this._primitive.ready&&(this._ready=!0,this.releaseGeometryInstances&&(this.geometryInstances=void 0))})};Zl.prototype.getBoundingSphere=function(e){let t=this._boundingSpheresKeys.indexOf(e);if(t!==-1)return this._boundingSpheres[t]};Zl.prototype.getGeometryInstanceAttributes=function(e){return this._primitive.getGeometryInstanceAttributes(e)};Zl.prototype.isDestroyed=function(){return!1};Zl.prototype.destroy=function(){return this._primitive=this._primitive&&this._primitive.destroy(),me(this)};Zl._supportsMaterials=function(e){return e.depthTexture};Zl.supportsMaterials=function(e){return Zl._supportsMaterials(e.frameState.context)};var Yc=Zl;var qmn=T(S(),1);function DC(){fe.throwInstantiationError()}Object.defineProperties(DC.prototype,{isConstant:{get:fe.throwInstantiationError},definitionChanged:{get:fe.throwInstantiationError}});DC.prototype.getType=fe.throwInstantiationError;DC.prototype.getValue=fe.throwInstantiationError;DC.prototype.equals=fe.throwInstantiationError;DC.getValue=function(e,t,n){let i;return l(t)&&(i=t.getType(e),l(i))?((!l(n)||n.type!==i)&&(n=Mi.fromType(i)),t.getValue(e,n.uniforms),n):((!l(n)||n.type!==Mi.ColorType)&&(n=Mi.fromType(Mi.ColorType)),Y.clone(Y.WHITE,n.uniforms.color),n)};var Ko=DC;function t_(e,t,n){this._primitives=t,this._orderedGroundPrimitives=n,this._primitive=void 0,this._outlinePrimitive=void 0,this._geometryUpdater=e,this._options=e._options,this._entity=e._entity,this._material=void 0}t_.prototype._isHidden=function(e,t,n){return!e.isShowing||!e.isAvailable(n)||!K.getValueOrDefault(t.show,n,!0)};t_.prototype._setOptions=fe.throwInstantiationError;t_.prototype.update=function(e){let t=this._geometryUpdater,n=t._onTerrain,i=this._primitives,o=this._orderedGroundPrimitives;n?o.remove(this._primitive):(i.removeAndDestroy(this._primitive),i.removeAndDestroy(this._outlinePrimitive),this._outlinePrimitive=void 0),this._primitive=void 0;let r=this._entity,s=r[this._geometryUpdater._geometryPropertyName];if(this._setOptions(r,s,e),this._isHidden(r,s,e))return;let a=this._geometryUpdater.shadowsProperty.getValue(e),c=this._options;if(!l(s.fill)||s.fill.getValue(e)){let d=t.fillMaterialProperty,u=d instanceof Ut,m,p=t._getIsClosed(c);if(u)m=new dn({closed:p,flat:n&&!t._supportsMaterialsforEntitiesOnTerrain});else{let g=Ko.getValue(e,d,this._material);this._material=g,m=new ro({material:g,translucent:g.isTranslucent(),closed:p})}if(n)c.vertexFormat=dn.VERTEX_FORMAT,this._primitive=o.add(new Yc({geometryInstances:this._geometryUpdater.createFillGeometryInstance(e),appearance:m,asynchronous:!1,shadows:a,classificationType:this._geometryUpdater.classificationTypeProperty.getValue(e)}),K.getValueOrUndefined(this._geometryUpdater.zIndex,e));else{c.vertexFormat=m.vertexFormat;let g=this._geometryUpdater.createFillGeometryInstance(e);u&&(m.translucent=g.attributes.color.value[3]!==255),this._primitive=i.add(new En({geometryInstances:g,appearance:m,asynchronous:!1,shadows:a}))}}if(!n&&l(s.outline)&&s.outline.getValue(e)){let d=this._geometryUpdater.createOutlineGeometryInstance(e),u=K.getValueOrDefault(s.outlineWidth,e,1);this._outlinePrimitive=i.add(new En({geometryInstances:d,appearance:new dn({flat:!0,translucent:d.attributes.color.value[3]!==255,renderState:{lineWidth:t._scene.clampLineWidth(u)}}),asynchronous:!1,shadows:a}))}};t_.prototype.getBoundingSphere=function(e){let t=this._entity,n=this._primitive,i=this._outlinePrimitive,o;return l(n)&&n.show&&n.ready&&(o=n.getGeometryInstanceAttributes(t),l(o)&&l(o.boundingSphere))?(le.clone(o.boundingSphere,e),mt.DONE):l(i)&&i.show&&i.ready&&(o=i.getGeometryInstanceAttributes(t),l(o)&&l(o.boundingSphere))?(le.clone(o.boundingSphere,e),mt.DONE):l(n)&&!n.ready||l(i)&&!i.ready?mt.PENDING:mt.FAILED};t_.prototype.isDestroyed=function(){return!1};t_.prototype.destroy=function(){let e=this._primitives,t=this._orderedGroundPrimitives;this._geometryUpdater._onTerrain?t.remove(this._primitive):e.removeAndDestroy(this._primitive),e.removeAndDestroy(this._outlinePrimitive),me(this)};var ni=t_;var Rgn=T(S(),1);var lgn=T(S(),1);var Vfn=T(S(),1);var fhn=T(S(),1),FX=`in vec4 v_startPlaneNormalEcAndHalfWidth; in vec4 v_endPlaneNormalEcAndBatchId; in vec4 v_rightPlaneEC; // Technically can compute distance for this here in vec4 v_endEcAndStartEcX; in vec4 v_texcoordNormalizationAndStartEcYZ; #ifdef PER_INSTANCE_COLOR in vec4 v_color; #endif void main(void) { float logDepthOrDepth = czm_branchFreeTernary(czm_sceneMode == czm_sceneMode2D, gl_FragCoord.z, czm_unpackDepth(texture(czm_globeDepthTexture, gl_FragCoord.xy / czm_viewport.zw))); vec3 ecStart = vec3(v_endEcAndStartEcX.w, v_texcoordNormalizationAndStartEcYZ.zw); // Discard for sky if (logDepthOrDepth == 0.0) { #ifdef DEBUG_SHOW_VOLUME out_FragColor = vec4(1.0, 0.0, 0.0, 0.5); return; #else // DEBUG_SHOW_VOLUME discard; #endif // DEBUG_SHOW_VOLUME } vec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, logDepthOrDepth); eyeCoordinate /= eyeCoordinate.w; float halfMaxWidth = v_startPlaneNormalEcAndHalfWidth.w * czm_metersPerPixel(eyeCoordinate); // Check distance of the eye coordinate against the right-facing plane float widthwiseDistance = czm_planeDistance(v_rightPlaneEC, eyeCoordinate.xyz); // Check eye coordinate against the mitering planes float distanceFromStart = czm_planeDistance(v_startPlaneNormalEcAndHalfWidth.xyz, -dot(ecStart, v_startPlaneNormalEcAndHalfWidth.xyz), eyeCoordinate.xyz); float distanceFromEnd = czm_planeDistance(v_endPlaneNormalEcAndBatchId.xyz, -dot(v_endEcAndStartEcX.xyz, v_endPlaneNormalEcAndBatchId.xyz), eyeCoordinate.xyz); if (abs(widthwiseDistance) > halfMaxWidth || distanceFromStart < 0.0 || distanceFromEnd < 0.0) { #ifdef DEBUG_SHOW_VOLUME out_FragColor = vec4(1.0, 0.0, 0.0, 0.5); return; #else // DEBUG_SHOW_VOLUME discard; #endif // DEBUG_SHOW_VOLUME } // Check distance of the eye coordinate against start and end planes with normals in the right plane. // For computing unskewed lengthwise texture coordinate. // Can also be used for clipping extremely pointy miters, but in practice unnecessary because of miter breaking. // aligned plane: cross the right plane normal with miter plane normal, then cross the result with right again to point it more "forward" vec3 alignedPlaneNormal; // start aligned plane alignedPlaneNormal = cross(v_rightPlaneEC.xyz, v_startPlaneNormalEcAndHalfWidth.xyz); alignedPlaneNormal = normalize(cross(alignedPlaneNormal, v_rightPlaneEC.xyz)); distanceFromStart = czm_planeDistance(alignedPlaneNormal, -dot(alignedPlaneNormal, ecStart), eyeCoordinate.xyz); // end aligned plane alignedPlaneNormal = cross(v_rightPlaneEC.xyz, v_endPlaneNormalEcAndBatchId.xyz); alignedPlaneNormal = normalize(cross(alignedPlaneNormal, v_rightPlaneEC.xyz)); distanceFromEnd = czm_planeDistance(alignedPlaneNormal, -dot(alignedPlaneNormal, v_endEcAndStartEcX.xyz), eyeCoordinate.xyz); #ifdef PER_INSTANCE_COLOR out_FragColor = czm_gammaCorrect(v_color); #else // PER_INSTANCE_COLOR // Clamp - distance to aligned planes may be negative due to mitering, // so fragment texture coordinate might be out-of-bounds. float s = clamp(distanceFromStart / (distanceFromStart + distanceFromEnd), 0.0, 1.0); s = (s * v_texcoordNormalizationAndStartEcYZ.x) + v_texcoordNormalizationAndStartEcYZ.y; float t = (widthwiseDistance + halfMaxWidth) / (2.0 * halfMaxWidth); czm_materialInput materialInput; materialInput.s = s; materialInput.st = vec2(s, t); materialInput.str = vec3(s, t, 0.0); czm_material material = czm_getMaterial(materialInput); out_FragColor = vec4(material.diffuse + material.emission, material.alpha); #endif // PER_INSTANCE_COLOR // Premultiply alpha. Required for classification primitives on translucent globe. out_FragColor.rgb *= out_FragColor.a; czm_writeDepthClamp(); } `;var bhn=T(S(),1),AX=`in vec3 v_forwardDirectionEC; in vec3 v_texcoordNormalizationAndHalfWidth; in float v_batchId; #ifdef PER_INSTANCE_COLOR in vec4 v_color; #else in vec2 v_alignedPlaneDistances; in float v_texcoordT; #endif float rayPlaneDistanceUnsafe(vec3 origin, vec3 direction, vec3 planeNormal, float planeDistance) { // We don't expect the ray to ever be parallel to the plane return (-planeDistance - dot(planeNormal, origin)) / dot(planeNormal, direction); } void main(void) { vec4 eyeCoordinate = gl_FragCoord; eyeCoordinate /= eyeCoordinate.w; #ifdef PER_INSTANCE_COLOR out_FragColor = czm_gammaCorrect(v_color); #else // PER_INSTANCE_COLOR // Use distances for planes aligned with segment to prevent skew in dashing float distanceFromStart = rayPlaneDistanceUnsafe(eyeCoordinate.xyz, -v_forwardDirectionEC, v_forwardDirectionEC.xyz, v_alignedPlaneDistances.x); float distanceFromEnd = rayPlaneDistanceUnsafe(eyeCoordinate.xyz, v_forwardDirectionEC, -v_forwardDirectionEC.xyz, v_alignedPlaneDistances.y); // Clamp - distance to aligned planes may be negative due to mitering distanceFromStart = max(0.0, distanceFromStart); distanceFromEnd = max(0.0, distanceFromEnd); float s = distanceFromStart / (distanceFromStart + distanceFromEnd); s = (s * v_texcoordNormalizationAndHalfWidth.x) + v_texcoordNormalizationAndHalfWidth.y; czm_materialInput materialInput; materialInput.s = s; materialInput.st = vec2(s, v_texcoordT); materialInput.str = vec3(s, v_texcoordT, 0.0); czm_material material = czm_getMaterial(materialInput); out_FragColor = vec4(material.diffuse + material.emission, material.alpha); #endif // PER_INSTANCE_COLOR } `;var yhn=T(S(),1),MX=`in vec3 position3DHigh; in vec3 position3DLow; in vec4 startHiAndForwardOffsetX; in vec4 startLoAndForwardOffsetY; in vec4 startNormalAndForwardOffsetZ; in vec4 endNormalAndTextureCoordinateNormalizationX; in vec4 rightNormalAndTextureCoordinateNormalizationY; in vec4 startHiLo2D; in vec4 offsetAndRight2D; in vec4 startEndNormals2D; in vec2 texcoordNormalization2D; in float batchId; out vec3 v_forwardDirectionEC; out vec3 v_texcoordNormalizationAndHalfWidth; out float v_batchId; // For materials #ifdef WIDTH_VARYING out float v_width; #endif #ifdef ANGLE_VARYING out float v_polylineAngle; #endif #ifdef PER_INSTANCE_COLOR out vec4 v_color; #else out vec2 v_alignedPlaneDistances; out float v_texcoordT; #endif // Morphing planes using SLERP or NLERP doesn't seem to work, so instead draw the material directly on the shadow volume. // Morph views are from very far away and aren't meant to be used precisely, so this should be sufficient. void main() { v_batchId = batchId; // Start position vec4 posRelativeToEye2D = czm_translateRelativeToEye(vec3(0.0, startHiLo2D.xy), vec3(0.0, startHiLo2D.zw)); vec4 posRelativeToEye3D = czm_translateRelativeToEye(startHiAndForwardOffsetX.xyz, startLoAndForwardOffsetY.xyz); vec4 posRelativeToEye = czm_columbusViewMorph(posRelativeToEye2D, posRelativeToEye3D, czm_morphTime); vec3 posEc2D = (czm_modelViewRelativeToEye * posRelativeToEye2D).xyz; vec3 posEc3D = (czm_modelViewRelativeToEye * posRelativeToEye3D).xyz; vec3 startEC = (czm_modelViewRelativeToEye * posRelativeToEye).xyz; // Start plane vec4 startPlane2D; vec4 startPlane3D; startPlane2D.xyz = czm_normal * vec3(0.0, startEndNormals2D.xy); startPlane3D.xyz = czm_normal * startNormalAndForwardOffsetZ.xyz; startPlane2D.w = -dot(startPlane2D.xyz, posEc2D); startPlane3D.w = -dot(startPlane3D.xyz, posEc3D); // Right plane vec4 rightPlane2D; vec4 rightPlane3D; rightPlane2D.xyz = czm_normal * vec3(0.0, offsetAndRight2D.zw); rightPlane3D.xyz = czm_normal * rightNormalAndTextureCoordinateNormalizationY.xyz; rightPlane2D.w = -dot(rightPlane2D.xyz, posEc2D); rightPlane3D.w = -dot(rightPlane3D.xyz, posEc3D); // End position posRelativeToEye2D = posRelativeToEye2D + vec4(0.0, offsetAndRight2D.xy, 0.0); posRelativeToEye3D = posRelativeToEye3D + vec4(startHiAndForwardOffsetX.w, startLoAndForwardOffsetY.w, startNormalAndForwardOffsetZ.w, 0.0); posRelativeToEye = czm_columbusViewMorph(posRelativeToEye2D, posRelativeToEye3D, czm_morphTime); posEc2D = (czm_modelViewRelativeToEye * posRelativeToEye2D).xyz; posEc3D = (czm_modelViewRelativeToEye * posRelativeToEye3D).xyz; vec3 endEC = (czm_modelViewRelativeToEye * posRelativeToEye).xyz; vec3 forwardEc3D = czm_normal * normalize(vec3(startHiAndForwardOffsetX.w, startLoAndForwardOffsetY.w, startNormalAndForwardOffsetZ.w)); vec3 forwardEc2D = czm_normal * normalize(vec3(0.0, offsetAndRight2D.xy)); // End plane vec4 endPlane2D; vec4 endPlane3D; endPlane2D.xyz = czm_normal * vec3(0.0, startEndNormals2D.zw); endPlane3D.xyz = czm_normal * endNormalAndTextureCoordinateNormalizationX.xyz; endPlane2D.w = -dot(endPlane2D.xyz, posEc2D); endPlane3D.w = -dot(endPlane3D.xyz, posEc3D); // Forward direction v_forwardDirectionEC = normalize(endEC - startEC); vec2 cleanTexcoordNormalization2D; cleanTexcoordNormalization2D.x = abs(texcoordNormalization2D.x); cleanTexcoordNormalization2D.y = czm_branchFreeTernary(texcoordNormalization2D.y > 1.0, 0.0, abs(texcoordNormalization2D.y)); vec2 cleanTexcoordNormalization3D; cleanTexcoordNormalization3D.x = abs(endNormalAndTextureCoordinateNormalizationX.w); cleanTexcoordNormalization3D.y = rightNormalAndTextureCoordinateNormalizationY.w; cleanTexcoordNormalization3D.y = czm_branchFreeTernary(cleanTexcoordNormalization3D.y > 1.0, 0.0, abs(cleanTexcoordNormalization3D.y)); v_texcoordNormalizationAndHalfWidth.xy = mix(cleanTexcoordNormalization2D, cleanTexcoordNormalization3D, czm_morphTime); #ifdef PER_INSTANCE_COLOR v_color = czm_batchTable_color(batchId); #else // PER_INSTANCE_COLOR // For computing texture coordinates v_alignedPlaneDistances.x = -dot(v_forwardDirectionEC, startEC); v_alignedPlaneDistances.y = -dot(-v_forwardDirectionEC, endEC); #endif // PER_INSTANCE_COLOR #ifdef WIDTH_VARYING float width = czm_batchTable_width(batchId); float halfWidth = width * 0.5; v_width = width; v_texcoordNormalizationAndHalfWidth.z = halfWidth; #else float halfWidth = 0.5 * czm_batchTable_width(batchId); v_texcoordNormalizationAndHalfWidth.z = halfWidth; #endif // Compute a normal along which to "push" the position out, extending the miter depending on view distance. // Position has already been "pushed" by unit length along miter normal, and miter normals are encoded in the planes. // Decode the normal to use at this specific vertex, push the position back, and then push to where it needs to be. // Since this is morphing, compute both 3D and 2D positions and then blend. // ****** 3D ****** // Check distance to the end plane and start plane, pick the plane that is closer vec4 positionEc3D = czm_modelViewRelativeToEye * czm_translateRelativeToEye(position3DHigh, position3DLow); // w = 1.0, see czm_computePosition float absStartPlaneDistance = abs(czm_planeDistance(startPlane3D, positionEc3D.xyz)); float absEndPlaneDistance = abs(czm_planeDistance(endPlane3D, positionEc3D.xyz)); vec3 planeDirection = czm_branchFreeTernary(absStartPlaneDistance < absEndPlaneDistance, startPlane3D.xyz, endPlane3D.xyz); vec3 upOrDown = normalize(cross(rightPlane3D.xyz, planeDirection)); // Points "up" for start plane, "down" at end plane. vec3 normalEC = normalize(cross(planeDirection, upOrDown)); // In practice, the opposite seems to work too. // Nudge the top vertex upwards to prevent flickering vec3 geodeticSurfaceNormal = normalize(cross(normalEC, forwardEc3D)); geodeticSurfaceNormal *= float(0.0 <= rightNormalAndTextureCoordinateNormalizationY.w && rightNormalAndTextureCoordinateNormalizationY.w <= 1.0); geodeticSurfaceNormal *= MAX_TERRAIN_HEIGHT; positionEc3D.xyz += geodeticSurfaceNormal; // Determine if this vertex is on the "left" or "right" normalEC *= sign(endNormalAndTextureCoordinateNormalizationX.w); // A "perfect" implementation would push along normals according to the angle against forward. // In practice, just pushing the normal out by halfWidth is sufficient for morph views. positionEc3D.xyz += halfWidth * max(0.0, czm_metersPerPixel(positionEc3D)) * normalEC; // prevent artifacts when czm_metersPerPixel is negative (behind camera) // ****** 2D ****** // Check distance to the end plane and start plane, pick the plane that is closer vec4 positionEc2D = czm_modelViewRelativeToEye * czm_translateRelativeToEye(position2DHigh.zxy, position2DLow.zxy); // w = 1.0, see czm_computePosition absStartPlaneDistance = abs(czm_planeDistance(startPlane2D, positionEc2D.xyz)); absEndPlaneDistance = abs(czm_planeDistance(endPlane2D, positionEc2D.xyz)); planeDirection = czm_branchFreeTernary(absStartPlaneDistance < absEndPlaneDistance, startPlane2D.xyz, endPlane2D.xyz); upOrDown = normalize(cross(rightPlane2D.xyz, planeDirection)); // Points "up" for start plane, "down" at end plane. normalEC = normalize(cross(planeDirection, upOrDown)); // In practice, the opposite seems to work too. // Nudge the top vertex upwards to prevent flickering geodeticSurfaceNormal = normalize(cross(normalEC, forwardEc2D)); geodeticSurfaceNormal *= float(0.0 <= texcoordNormalization2D.y && texcoordNormalization2D.y <= 1.0); geodeticSurfaceNormal *= MAX_TERRAIN_HEIGHT; positionEc2D.xyz += geodeticSurfaceNormal; // Determine if this vertex is on the "left" or "right" normalEC *= sign(texcoordNormalization2D.x); #ifndef PER_INSTANCE_COLOR // Use vertex's sidedness to compute its texture coordinate. v_texcoordT = clamp(sign(texcoordNormalization2D.x), 0.0, 1.0); #endif // A "perfect" implementation would push along normals according to the angle against forward. // In practice, just pushing the normal out by halfWidth is sufficient for morph views. positionEc2D.xyz += halfWidth * max(0.0, czm_metersPerPixel(positionEc2D)) * normalEC; // prevent artifacts when czm_metersPerPixel is negative (behind camera) // Blend for actual position gl_Position = czm_projection * mix(positionEc2D, positionEc3D, czm_morphTime); #ifdef ANGLE_VARYING // Approximate relative screen space direction of the line. vec2 approxLineDirection = normalize(vec2(v_forwardDirectionEC.x, -v_forwardDirectionEC.y)); approxLineDirection.y = czm_branchFreeTernary(approxLineDirection.x == 0.0 && approxLineDirection.y == 0.0, -1.0, approxLineDirection.y); v_polylineAngle = czm_fastApproximateAtan(approxLineDirection.x, approxLineDirection.y); #endif } `;var _hn=T(S(),1),NX=`in vec3 position3DHigh; in vec3 position3DLow; // In 2D and in 3D, texture coordinate normalization component signs encodes: // * X sign - sidedness relative to right plane // * Y sign - is negative OR magnitude is greater than 1.0 if vertex is on bottom of volume #ifndef COLUMBUS_VIEW_2D in vec4 startHiAndForwardOffsetX; in vec4 startLoAndForwardOffsetY; in vec4 startNormalAndForwardOffsetZ; in vec4 endNormalAndTextureCoordinateNormalizationX; in vec4 rightNormalAndTextureCoordinateNormalizationY; #else in vec4 startHiLo2D; in vec4 offsetAndRight2D; in vec4 startEndNormals2D; in vec2 texcoordNormalization2D; #endif in float batchId; out vec4 v_startPlaneNormalEcAndHalfWidth; out vec4 v_endPlaneNormalEcAndBatchId; out vec4 v_rightPlaneEC; out vec4 v_endEcAndStartEcX; out vec4 v_texcoordNormalizationAndStartEcYZ; // For materials #ifdef WIDTH_VARYING out float v_width; #endif #ifdef ANGLE_VARYING out float v_polylineAngle; #endif #ifdef PER_INSTANCE_COLOR out vec4 v_color; #endif void main() { #ifdef COLUMBUS_VIEW_2D vec3 ecStart = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(vec3(0.0, startHiLo2D.xy), vec3(0.0, startHiLo2D.zw))).xyz; vec3 forwardDirectionEC = czm_normal * vec3(0.0, offsetAndRight2D.xy); vec3 ecEnd = forwardDirectionEC + ecStart; forwardDirectionEC = normalize(forwardDirectionEC); // Right plane v_rightPlaneEC.xyz = czm_normal * vec3(0.0, offsetAndRight2D.zw); v_rightPlaneEC.w = -dot(v_rightPlaneEC.xyz, ecStart); // start plane vec4 startPlaneEC; startPlaneEC.xyz = czm_normal * vec3(0.0, startEndNormals2D.xy); startPlaneEC.w = -dot(startPlaneEC.xyz, ecStart); // end plane vec4 endPlaneEC; endPlaneEC.xyz = czm_normal * vec3(0.0, startEndNormals2D.zw); endPlaneEC.w = -dot(endPlaneEC.xyz, ecEnd); v_texcoordNormalizationAndStartEcYZ.x = abs(texcoordNormalization2D.x); v_texcoordNormalizationAndStartEcYZ.y = texcoordNormalization2D.y; #else // COLUMBUS_VIEW_2D vec3 ecStart = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(startHiAndForwardOffsetX.xyz, startLoAndForwardOffsetY.xyz)).xyz; vec3 offset = czm_normal * vec3(startHiAndForwardOffsetX.w, startLoAndForwardOffsetY.w, startNormalAndForwardOffsetZ.w); vec3 ecEnd = ecStart + offset; vec3 forwardDirectionEC = normalize(offset); // start plane vec4 startPlaneEC; startPlaneEC.xyz = czm_normal * startNormalAndForwardOffsetZ.xyz; startPlaneEC.w = -dot(startPlaneEC.xyz, ecStart); // end plane vec4 endPlaneEC; endPlaneEC.xyz = czm_normal * endNormalAndTextureCoordinateNormalizationX.xyz; endPlaneEC.w = -dot(endPlaneEC.xyz, ecEnd); // Right plane v_rightPlaneEC.xyz = czm_normal * rightNormalAndTextureCoordinateNormalizationY.xyz; v_rightPlaneEC.w = -dot(v_rightPlaneEC.xyz, ecStart); v_texcoordNormalizationAndStartEcYZ.x = abs(endNormalAndTextureCoordinateNormalizationX.w); v_texcoordNormalizationAndStartEcYZ.y = rightNormalAndTextureCoordinateNormalizationY.w; #endif // COLUMBUS_VIEW_2D v_endEcAndStartEcX.xyz = ecEnd; v_endEcAndStartEcX.w = ecStart.x; v_texcoordNormalizationAndStartEcYZ.zw = ecStart.yz; #ifdef PER_INSTANCE_COLOR v_color = czm_batchTable_color(batchId); #endif // PER_INSTANCE_COLOR // Compute a normal along which to "push" the position out, extending the miter depending on view distance. // Position has already been "pushed" by unit length along miter normal, and miter normals are encoded in the planes. // Decode the normal to use at this specific vertex, push the position back, and then push to where it needs to be. vec4 positionRelativeToEye = czm_computePosition(); // Check distance to the end plane and start plane, pick the plane that is closer vec4 positionEC = czm_modelViewRelativeToEye * positionRelativeToEye; // w = 1.0, see czm_computePosition float absStartPlaneDistance = abs(czm_planeDistance(startPlaneEC, positionEC.xyz)); float absEndPlaneDistance = abs(czm_planeDistance(endPlaneEC, positionEC.xyz)); vec3 planeDirection = czm_branchFreeTernary(absStartPlaneDistance < absEndPlaneDistance, startPlaneEC.xyz, endPlaneEC.xyz); vec3 upOrDown = normalize(cross(v_rightPlaneEC.xyz, planeDirection)); // Points "up" for start plane, "down" at end plane. vec3 normalEC = normalize(cross(planeDirection, upOrDown)); // In practice, the opposite seems to work too. // Extrude bottom vertices downward for far view distances, like for GroundPrimitives upOrDown = cross(forwardDirectionEC, normalEC); upOrDown = float(czm_sceneMode == czm_sceneMode3D) * upOrDown; upOrDown = float(v_texcoordNormalizationAndStartEcYZ.y > 1.0 || v_texcoordNormalizationAndStartEcYZ.y < 0.0) * upOrDown; upOrDown = min(GLOBE_MINIMUM_ALTITUDE, czm_geometricToleranceOverMeter * length(positionRelativeToEye.xyz)) * upOrDown; positionEC.xyz += upOrDown; v_texcoordNormalizationAndStartEcYZ.y = czm_branchFreeTernary(v_texcoordNormalizationAndStartEcYZ.y > 1.0, 0.0, abs(v_texcoordNormalizationAndStartEcYZ.y)); // Determine distance along normalEC to push for a volume of appropriate width. // Make volumes about double pixel width for a conservative fit - in practice the // extra cost here is minimal compared to the loose volume heights. // // N = normalEC (guaranteed "right-facing") // R = rightEC // p = angle between N and R // w = distance to push along R if R == N // d = distance to push along N // // N R // { p| } * cos(p) = dot(N, R) = w / d // d | |w * d = w / dot(N, R) // { | } // o---------- polyline segment ----> // float width = czm_batchTable_width(batchId); #ifdef WIDTH_VARYING v_width = width; #endif v_startPlaneNormalEcAndHalfWidth.xyz = startPlaneEC.xyz; v_startPlaneNormalEcAndHalfWidth.w = width * 0.5; v_endPlaneNormalEcAndBatchId.xyz = endPlaneEC.xyz; v_endPlaneNormalEcAndBatchId.w = batchId; width = width * max(0.0, czm_metersPerPixel(positionEC)); // width = distance to push along R width = width / dot(normalEC, v_rightPlaneEC.xyz); // width = distance to push along N // Determine if this vertex is on the "left" or "right" #ifdef COLUMBUS_VIEW_2D normalEC *= sign(texcoordNormalization2D.x); #else normalEC *= sign(endNormalAndTextureCoordinateNormalizationX.w); #endif positionEC.xyz += width * normalEC; gl_Position = czm_depthClamp(czm_projection * positionEC); #ifdef ANGLE_VARYING // Approximate relative screen space direction of the line. vec2 approxLineDirection = normalize(vec2(forwardDirectionEC.x, -forwardDirectionEC.y)); approxLineDirection.y = czm_branchFreeTernary(approxLineDirection.x == 0.0 && approxLineDirection.y == 0.0, -1.0, approxLineDirection.y); v_polylineAngle = czm_fastApproximateAtan(approxLineDirection.x, approxLineDirection.y); #endif } `;var Phn=T(S(),1);var Shn=T(S(),1),kX=`in vec3 position3DHigh; in vec3 position3DLow; in vec3 prevPosition3DHigh; in vec3 prevPosition3DLow; in vec3 nextPosition3DHigh; in vec3 nextPosition3DLow; in vec2 expandAndWidth; in vec4 color; in float batchId; out vec4 v_color; void main() { float expandDir = expandAndWidth.x; float width = abs(expandAndWidth.y) + 0.5; bool usePrev = expandAndWidth.y < 0.0; vec4 p = czm_computePosition(); vec4 prev = czm_computePrevPosition(); vec4 next = czm_computeNextPosition(); float angle; vec4 positionWC = getPolylineWindowCoordinates(p, prev, next, expandDir, width, usePrev, angle); gl_Position = czm_viewportOrthographic * positionWC; v_color = color; } `;var Vhn=T(S(),1),yd=`void clipLineSegmentToNearPlane( vec3 p0, vec3 p1, out vec4 positionWC, out bool clipped, out bool culledByNearPlane, out vec4 clippedPositionEC) { culledByNearPlane = false; clipped = false; vec3 p0ToP1 = p1 - p0; float magnitude = length(p0ToP1); vec3 direction = normalize(p0ToP1); // Distance that p0 is behind the near plane. Negative means p0 is // in front of the near plane. float endPoint0Distance = czm_currentFrustum.x + p0.z; // Camera looks down -Z. // When moving a point along +Z: LESS VISIBLE // * Points in front of the camera move closer to the camera. // * Points behind the camrea move farther away from the camera. // When moving a point along -Z: MORE VISIBLE // * Points in front of the camera move farther away from the camera. // * Points behind the camera move closer to the camera. // Positive denominator: -Z, becoming more visible // Negative denominator: +Z, becoming less visible // Nearly zero: parallel to near plane float denominator = -direction.z; if (endPoint0Distance > 0.0 && abs(denominator) < czm_epsilon7) { // p0 is behind the near plane and the line to p1 is nearly parallel to // the near plane, so cull the segment completely. culledByNearPlane = true; } else if (endPoint0Distance > 0.0) { // p0 is behind the near plane, and the line to p1 is moving distinctly // toward or away from it. // t = (-plane distance - dot(plane normal, ray origin)) / dot(plane normal, ray direction) float t = endPoint0Distance / denominator; if (t < 0.0 || t > magnitude) { // Near plane intersection is not between the two points. // We already confirmed p0 is behind the naer plane, so now // we know the entire segment is behind it. culledByNearPlane = true; } else { // Segment crosses the near plane, update p0 to lie exactly on it. p0 = p0 + t * direction; // Numerical noise might put us a bit on the wrong side of the near plane. // Don't let that happen. p0.z = min(p0.z, -czm_currentFrustum.x); clipped = true; } } clippedPositionEC = vec4(p0, 1.0); positionWC = czm_eyeToWindowCoordinates(clippedPositionEC); } vec4 getPolylineWindowCoordinatesEC(vec4 positionEC, vec4 prevEC, vec4 nextEC, float expandDirection, float width, bool usePrevious, out float angle) { // expandDirection +1 is to the _left_ when looking from positionEC toward nextEC. #ifdef POLYLINE_DASH // Compute the window coordinates of the points. vec4 positionWindow = czm_eyeToWindowCoordinates(positionEC); vec4 previousWindow = czm_eyeToWindowCoordinates(prevEC); vec4 nextWindow = czm_eyeToWindowCoordinates(nextEC); // Determine the relative screen space direction of the line. vec2 lineDir; if (usePrevious) { lineDir = normalize(positionWindow.xy - previousWindow.xy); } else { lineDir = normalize(nextWindow.xy - positionWindow.xy); } angle = atan(lineDir.x, lineDir.y) - 1.570796327; // precomputed atan(1,0) // Quantize the angle so it doesn't change rapidly between segments. angle = floor(angle / czm_piOverFour + 0.5) * czm_piOverFour; #endif vec4 clippedPrevWC, clippedPrevEC; bool prevSegmentClipped, prevSegmentCulled; clipLineSegmentToNearPlane(prevEC.xyz, positionEC.xyz, clippedPrevWC, prevSegmentClipped, prevSegmentCulled, clippedPrevEC); vec4 clippedNextWC, clippedNextEC; bool nextSegmentClipped, nextSegmentCulled; clipLineSegmentToNearPlane(nextEC.xyz, positionEC.xyz, clippedNextWC, nextSegmentClipped, nextSegmentCulled, clippedNextEC); bool segmentClipped, segmentCulled; vec4 clippedPositionWC, clippedPositionEC; clipLineSegmentToNearPlane(positionEC.xyz, usePrevious ? prevEC.xyz : nextEC.xyz, clippedPositionWC, segmentClipped, segmentCulled, clippedPositionEC); if (segmentCulled) { return vec4(0.0, 0.0, 0.0, 1.0); } vec2 directionToPrevWC = normalize(clippedPrevWC.xy - clippedPositionWC.xy); vec2 directionToNextWC = normalize(clippedNextWC.xy - clippedPositionWC.xy); // If a segment was culled, we can't use the corresponding direction // computed above. We should never see both of these be true without // \`segmentCulled\` above also being true. if (prevSegmentCulled) { directionToPrevWC = -directionToNextWC; } else if (nextSegmentCulled) { directionToNextWC = -directionToPrevWC; } vec2 thisSegmentForwardWC, otherSegmentForwardWC; if (usePrevious) { thisSegmentForwardWC = -directionToPrevWC; otherSegmentForwardWC = directionToNextWC; } else { thisSegmentForwardWC = directionToNextWC; otherSegmentForwardWC = -directionToPrevWC; } vec2 thisSegmentLeftWC = vec2(-thisSegmentForwardWC.y, thisSegmentForwardWC.x); vec2 leftWC = thisSegmentLeftWC; float expandWidth = width * 0.5; // When lines are split at the anti-meridian, the position may be at the // same location as the next or previous position, and we need to handle // that to avoid producing NaNs. if (!czm_equalsEpsilon(prevEC.xyz - positionEC.xyz, vec3(0.0), czm_epsilon1) && !czm_equalsEpsilon(nextEC.xyz - positionEC.xyz, vec3(0.0), czm_epsilon1)) { vec2 otherSegmentLeftWC = vec2(-otherSegmentForwardWC.y, otherSegmentForwardWC.x); vec2 leftSumWC = thisSegmentLeftWC + otherSegmentLeftWC; float leftSumLength = length(leftSumWC); leftWC = leftSumLength < czm_epsilon6 ? thisSegmentLeftWC : (leftSumWC / leftSumLength); // The sine of the angle between the two vectors is given by the formula // |a x b| = |a||b|sin(theta) // which is // float sinAngle = length(cross(vec3(leftWC, 0.0), vec3(-thisSegmentForwardWC, 0.0))); // Because the z components of both vectors are zero, the x and y coordinate will be zero. // Therefore, the sine of the angle is just the z component of the cross product. vec2 u = -thisSegmentForwardWC; vec2 v = leftWC; float sinAngle = abs(u.x * v.y - u.y * v.x); expandWidth = clamp(expandWidth / sinAngle, 0.0, width * 2.0); } vec2 offset = leftWC * expandDirection * expandWidth * czm_pixelRatio; return vec4(clippedPositionWC.xy + offset, -clippedPositionWC.z, 1.0) * (czm_projection * clippedPositionEC).w; } vec4 getPolylineWindowCoordinates(vec4 position, vec4 previous, vec4 next, float expandDirection, float width, bool usePrevious, out float angle) { vec4 positionEC = czm_modelViewRelativeToEye * position; vec4 prevEC = czm_modelViewRelativeToEye * previous; vec4 nextEC = czm_modelViewRelativeToEye * next; return getPolylineWindowCoordinatesEC(positionEC, prevEC, nextEC, expandDirection, width, usePrevious, angle); } `;var wz=`${yd} ${kX}`,hMe=Jx;Yt.isInternetExplorer()||(wz=`#define CLIP_POLYLINE ${wz}`);function n_(e){e=y(e,y.EMPTY_OBJECT);let t=y(e.translucent,!0),n=!1,i=n_.VERTEX_FORMAT;this.material=void 0,this.translucent=t,this._vertexShaderSource=y(e.vertexShaderSource,wz),this._fragmentShaderSource=y(e.fragmentShaderSource,hMe),this._renderState=eo.getDefaultRenderState(t,n,e.renderState),this._closed=n,this._vertexFormat=i}Object.defineProperties(n_.prototype,{vertexShaderSource:{get:function(){return this._vertexShaderSource}},fragmentShaderSource:{get:function(){return this._fragmentShaderSource}},renderState:{get:function(){return this._renderState}},closed:{get:function(){return this._closed}},vertexFormat:{get:function(){return this._vertexFormat}}});n_.VERTEX_FORMAT=We.POSITION_ONLY;n_.prototype.getFragmentShaderSource=eo.prototype.getFragmentShaderSource;n_.prototype.isTranslucent=eo.prototype.isTranslucent;n_.prototype.getRenderState=eo.prototype.getRenderState;var Or=n_;var Khn=T(S(),1);var whn=T(S(),1),UX=`in vec3 position3DHigh; in vec3 position3DLow; in vec3 prevPosition3DHigh; in vec3 prevPosition3DLow; in vec3 nextPosition3DHigh; in vec3 nextPosition3DLow; in vec2 expandAndWidth; in vec2 st; in float batchId; out float v_width; out vec2 v_st; out float v_polylineAngle; void main() { float expandDir = expandAndWidth.x; float width = abs(expandAndWidth.y) + 0.5; bool usePrev = expandAndWidth.y < 0.0; vec4 p = czm_computePosition(); vec4 prev = czm_computePrevPosition(); vec4 next = czm_computeNextPosition(); float angle; vec4 positionWC = getPolylineWindowCoordinates(p, prev, next, expandDir, width, usePrev, angle); gl_Position = czm_viewportOrthographic * positionWC; v_width = width; v_st.s = st.s; v_st.t = czm_writeNonPerspective(st.t, gl_Position.w); v_polylineAngle = angle; } `;var Ahn=T(S(),1),i_=`#ifdef VECTOR_TILE uniform vec4 u_highlightColor; #endif in vec2 v_st; void main() { czm_materialInput materialInput; vec2 st = v_st; st.t = czm_readNonPerspective(st.t, gl_FragCoord.w); materialInput.s = st.s; materialInput.st = st; materialInput.str = vec3(st, 0.0); czm_material material = czm_getMaterial(materialInput); out_FragColor = vec4(material.diffuse + material.emission, material.alpha); #ifdef VECTOR_TILE out_FragColor *= u_highlightColor; #endif czm_writeLogDepth(); } `;var Fz=`${yd} ${UX}`,fMe=i_;Yt.isInternetExplorer()||(Fz=`#define CLIP_POLYLINE ${Fz}`);function o_(e){e=y(e,y.EMPTY_OBJECT);let t=y(e.translucent,!0),n=!1,i=o_.VERTEX_FORMAT;this.material=l(e.material)?e.material:Mi.fromType(Mi.ColorType),this.translucent=t,this._vertexShaderSource=y(e.vertexShaderSource,Fz),this._fragmentShaderSource=y(e.fragmentShaderSource,fMe),this._renderState=eo.getDefaultRenderState(t,n,e.renderState),this._closed=n,this._vertexFormat=i}Object.defineProperties(o_.prototype,{vertexShaderSource:{get:function(){let e=this._vertexShaderSource;return this.material.shaderSource.search(/in\s+float\s+v_polylineAngle;/g)!==-1&&(e=`#define POLYLINE_DASH ${e}`),e}},fragmentShaderSource:{get:function(){return this._fragmentShaderSource}},renderState:{get:function(){return this._renderState}},closed:{get:function(){return this._closed}},vertexFormat:{get:function(){return this._vertexFormat}}});o_.VERTEX_FORMAT=We.POSITION_AND_ST;o_.prototype.getFragmentShaderSource=eo.prototype.getFragmentShaderSource;o_.prototype.isTranslucent=eo.prototype.isTranslucent;o_.prototype.getRenderState=eo.prototype.getRenderState;var ea=o_;function Dp(e){e=y(e,y.EMPTY_OBJECT),this.geometryInstances=e.geometryInstances,this._hasPerInstanceColors=!0;let t=e.appearance;l(t)||(t=new ea),this.appearance=t,this.show=y(e.show,!0),this.classificationType=y(e.classificationType,Un.BOTH),this.debugShowBoundingVolume=y(e.debugShowBoundingVolume,!1),this._debugShowShadowVolume=y(e.debugShowShadowVolume,!1),this._primitiveOptions={geometryInstances:void 0,appearance:void 0,vertexCacheOptimize:!1,interleave:y(e.interleave,!1),releaseGeometryInstances:y(e.releaseGeometryInstances,!0),allowPicking:y(e.allowPicking,!0),asynchronous:y(e.asynchronous,!0),compressVertices:!1,_createShaderProgramFunction:void 0,_createCommandsFunction:void 0,_updateAndQueueCommandsFunction:void 0},this._zIndex=void 0,this._ready=!1,this._primitive=void 0,this._sp=void 0,this._sp2D=void 0,this._spMorph=void 0,this._renderState=Tae(!1),this._renderState3DTiles=Tae(!0),this._renderStateMorph=De.fromCache({cull:{enabled:!0,face:bi.FRONT},depthTest:{enabled:!0},blending:un.PRE_MULTIPLIED_ALPHA_BLEND,depthMask:!1})}Object.defineProperties(Dp.prototype,{interleave:{get:function(){return this._primitiveOptions.interleave}},releaseGeometryInstances:{get:function(){return this._primitiveOptions.releaseGeometryInstances}},allowPicking:{get:function(){return this._primitiveOptions.allowPicking}},asynchronous:{get:function(){return this._primitiveOptions.asynchronous}},ready:{get:function(){return this._ready}},debugShowShadowVolume:{get:function(){return this._debugShowShadowVolume}}});Dp.initializeTerrainHeights=function(){return ci.initialize()};function pMe(e,t,n){let i=t.context,o=e._primitive,r=o._attributeLocations,s=o._batchTable.getVertexShaderCallback()(NX);s=En._appendShowToShader(o,s),s=En._appendDistanceDisplayConditionToShader(o,s),s=En._modifyShaderPosition(e,s,t.scene3DOnly);let a=o._batchTable.getVertexShaderCallback()(MX);a=En._appendShowToShader(o,a),a=En._appendDistanceDisplayConditionToShader(o,a),a=En._modifyShaderPosition(e,a,t.scene3DOnly);let c=o._batchTable.getVertexShaderCallback()(FX),d=[`GLOBE_MINIMUM_ALTITUDE ${t.mapProjection.ellipsoid.minimumRadius.toFixed(1)}`],u="",m="";l(n.material)?(m=l(n.material)?n.material.shaderSource:"",m.search(/in\s+float\s+v_polylineAngle;/g)!==-1&&d.push("ANGLE_VARYING"),m.search(/in\s+float\s+v_width;/g)!==-1&&d.push("WIDTH_VARYING")):u="PER_INSTANCE_COLOR",d.push(u);let p=e.debugShowShadowVolume?["DEBUG_SHOW_VOLUME",u]:[u],g=new Ye({defines:d,sources:[s]}),f=new Ye({defines:p,sources:[m,c]});e._sp=$t.replaceCache({context:i,shaderProgram:o._sp,vertexShaderSource:g,fragmentShaderSource:f,attributeLocations:r});let x=i.shaderCache.getDerivedShaderProgram(e._sp,"2dColor");if(!l(x)){let C=new Ye({defines:d.concat(["COLUMBUS_VIEW_2D"]),sources:[s]});x=i.shaderCache.createDerivedShaderProgram(e._sp,"2dColor",{context:i,shaderProgram:e._sp2D,vertexShaderSource:C,fragmentShaderSource:f,attributeLocations:r})}e._sp2D=x;let _=i.shaderCache.getDerivedShaderProgram(e._sp,"MorphColor");if(!l(_)){let C=new Ye({defines:d.concat([`MAX_TERRAIN_HEIGHT ${ci._defaultMaxTerrainHeight.toFixed(1)}`]),sources:[a]});c=o._batchTable.getVertexShaderCallback()(AX);let V=new Ye({defines:p,sources:[m,c]});_=i.shaderCache.createDerivedShaderProgram(e._sp,"MorphColor",{context:i,shaderProgram:e._spMorph,vertexShaderSource:C,fragmentShaderSource:V,attributeLocations:r})}e._spMorph=_}function Tae(e){return De.fromCache({cull:{enabled:!0},blending:un.PRE_MULTIPLIED_ALPHA_BLEND,depthMask:!1,stencilTest:{enabled:e,frontFunction:Dn.EQUAL,frontOperation:{fail:pt.KEEP,zFail:pt.KEEP,zPass:pt.KEEP},backFunction:Dn.EQUAL,backOperation:{fail:pt.KEEP,zFail:pt.KEEP,zPass:pt.KEEP},reference:Nt.CESIUM_3D_TILE_MASK,mask:Nt.CESIUM_3D_TILE_MASK}})}function bMe(e,t,n,i,o,r){let s=e._primitive,a=s._va.length;o.length=a,r.length=a;let d=t instanceof Or?{}:n._uniforms,u=s._batchTable.getUniformMapCallback()(d);for(let m=0;m{!this._ready&&l(this._primitive)&&this._primitive.ready&&(this._ready=!0,this.releaseGeometryInstances&&(this.geometryInstances=void 0))})};Dp.prototype.getGeometryInstanceAttributes=function(e){return this._primitive.getGeometryInstanceAttributes(e)};Dp.isSupported=function(e){return e.frameState.context.depthTexture};Dp.prototype.isDestroyed=function(){return!1};Dp.prototype.destroy=function(){return this._primitive=this._primitive&&this._primitive.destroy(),this._sp=this._sp&&this._sp.destroy(),this._sp2D=void 0,this._spMorph=void 0,me(this)};var Wm=Dp;var zfn=T(S(),1);var kfn=T(S(),1);var Pfn=T(S(),1);var yMe=new D(1,1),xMe=!1,_Me=Y.WHITE;function BC(e){e=y(e,y.EMPTY_OBJECT),this._definitionChanged=new ge,this._image=void 0,this._imageSubscription=void 0,this._repeat=void 0,this._repeatSubscription=void 0,this._color=void 0,this._colorSubscription=void 0,this._transparent=void 0,this._transparentSubscription=void 0,this.image=e.image,this.repeat=e.repeat,this.color=e.color,this.transparent=e.transparent}Object.defineProperties(BC.prototype,{isConstant:{get:function(){return K.isConstant(this._image)&&K.isConstant(this._repeat)}},definitionChanged:{get:function(){return this._definitionChanged}},image:de("image"),repeat:de("repeat"),color:de("color"),transparent:de("transparent")});BC.prototype.getType=function(e){return"Image"};BC.prototype.getValue=function(e,t){return l(t)||(t={}),t.image=K.getValueOrUndefined(this._image,e),t.repeat=K.getValueOrClonedDefault(this._repeat,e,yMe,t.repeat),t.color=K.getValueOrClonedDefault(this._color,e,_Me,t.color),K.getValueOrDefault(this._transparent,e,xMe)&&(t.color.alpha=Math.min(.99,t.color.alpha)),t};BC.prototype.equals=function(e){return this===e||e instanceof BC&&K.equals(this._image,e._image)&&K.equals(this._repeat,e._repeat)&&K.equals(this._color,e._color)&&K.equals(this._transparent,e._transparent)};var fg=BC;function TMe(e){if(e instanceof Y)return new Ut(e);if(typeof e=="string"||e instanceof Ee||e instanceof HTMLCanvasElement||e instanceof HTMLVideoElement){let t=new fg;return t.image=e,t}}function SMe(e,t){return de(e,t,TMe)}var Go=SMe;function DX(e){this._definitionChanged=new ge,this._show=void 0,this._showSubscription=void 0,this._dimensions=void 0,this._dimensionsSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._fill=void 0,this._fillSubscription=void 0,this._material=void 0,this._materialSubscription=void 0,this._outline=void 0,this._outlineSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._shadows=void 0,this._shadowsSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this.merge(y(e,y.EMPTY_OBJECT))}Object.defineProperties(DX.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:de("show"),dimensions:de("dimensions"),heightReference:de("heightReference"),fill:de("fill"),material:Go("material"),outline:de("outline"),outlineColor:de("outlineColor"),outlineWidth:de("outlineWidth"),shadows:de("shadows"),distanceDisplayCondition:de("distanceDisplayCondition")});DX.prototype.clone=function(e){return l(e)?(e.show=this.show,e.dimensions=this.dimensions,e.heightReference=this.heightReference,e.fill=this.fill,e.material=this.material,e.outline=this.outline,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.shadows=this.shadows,e.distanceDisplayCondition=this.distanceDisplayCondition,e):new DX(this)};DX.prototype.merge=function(e){this.show=y(this.show,e.show),this.dimensions=y(this.dimensions,e.dimensions),this.heightReference=y(this.heightReference,e.heightReference),this.fill=y(this.fill,e.fill),this.material=y(this.material,e.material),this.outline=y(this.outline,e.outline),this.outlineColor=y(this.outlineColor,e.outlineColor),this.outlineWidth=y(this.outlineWidth,e.outlineWidth),this.shadows=y(this.shadows,e.shadows),this.distanceDisplayCondition=y(this.distanceDisplayCondition,e.distanceDisplayCondition)};var r_=DX;var lpn=T(S(),1);var tpn=T(S(),1);function YC(){fe.throwInstantiationError()}Object.defineProperties(YC.prototype,{isConstant:{get:fe.throwInstantiationError},definitionChanged:{get:fe.throwInstantiationError},referenceFrame:{get:fe.throwInstantiationError}});YC.prototype.getValue=fe.throwInstantiationError;YC.prototype.getValueInReferenceFrame=fe.throwInstantiationError;YC.prototype.equals=fe.throwInstantiationError;var Az=new $;YC.convertToReferenceFrame=function(e,t,n,i,o){if(!l(t))return t;if(l(o)||(o=new h),n===i)return h.clone(t,o);let r=Gt.computeIcrfToFixedMatrix(e,Az);if(l(r)||(r=Gt.computeTemeToPseudoFixedMatrix(e,Az)),n===$i.INERTIAL)return $.multiplyByVector(r,t,o);if(n===$i.FIXED)return $.multiplyByVector($.transpose(r,Az),t,o)};var Bp=YC;function s_(e,t){this._definitionChanged=new ge,this._value=h.clone(e),this._referenceFrame=y(t,$i.FIXED)}Object.defineProperties(s_.prototype,{isConstant:{get:function(){return!l(this._value)||this._referenceFrame===$i.FIXED}},definitionChanged:{get:function(){return this._definitionChanged}},referenceFrame:{get:function(){return this._referenceFrame}}});s_.prototype.getValue=function(e,t){return this.getValueInReferenceFrame(e,$i.FIXED,t)};s_.prototype.setValue=function(e,t){let n=!1;h.equals(this._value,e)||(n=!0,this._value=h.clone(e)),l(t)&&this._referenceFrame!==t&&(n=!0,this._referenceFrame=t),n&&this._definitionChanged.raiseEvent(this)};s_.prototype.getValueInReferenceFrame=function(e,t,n){return Bp.convertToReferenceFrame(e,this._value,this._referenceFrame,t,n)};s_.prototype.equals=function(e){return this===e||e instanceof s_&&h.equals(this._value,e._value)&&this._referenceFrame===e._referenceFrame};var Oc=s_;var bpn=T(S(),1);function BX(e){this._definitionChanged=new ge,this._show=void 0,this._showSubscription=void 0,this._positions=void 0,this._positionsSubscription=void 0,this._width=void 0,this._widthSubscription=void 0,this._height=void 0,this._heightSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._extrudedHeight=void 0,this._extrudedHeightSubscription=void 0,this._extrudedHeightReference=void 0,this._extrudedHeightReferenceSubscription=void 0,this._cornerType=void 0,this._cornerTypeSubscription=void 0,this._granularity=void 0,this._granularitySubscription=void 0,this._fill=void 0,this._fillSubscription=void 0,this._material=void 0,this._materialSubscription=void 0,this._outline=void 0,this._outlineSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._shadows=void 0,this._shadowsSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this._classificationType=void 0,this._classificationTypeSubscription=void 0,this._zIndex=void 0,this._zIndexSubscription=void 0,this.merge(y(e,y.EMPTY_OBJECT))}Object.defineProperties(BX.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:de("show"),positions:de("positions"),width:de("width"),height:de("height"),heightReference:de("heightReference"),extrudedHeight:de("extrudedHeight"),extrudedHeightReference:de("extrudedHeightReference"),cornerType:de("cornerType"),granularity:de("granularity"),fill:de("fill"),material:Go("material"),outline:de("outline"),outlineColor:de("outlineColor"),outlineWidth:de("outlineWidth"),shadows:de("shadows"),distanceDisplayCondition:de("distanceDisplayCondition"),classificationType:de("classificationType"),zIndex:de("zIndex")});BX.prototype.clone=function(e){return l(e)?(e.show=this.show,e.positions=this.positions,e.width=this.width,e.height=this.height,e.heightReference=this.heightReference,e.extrudedHeight=this.extrudedHeight,e.extrudedHeightReference=this.extrudedHeightReference,e.cornerType=this.cornerType,e.granularity=this.granularity,e.fill=this.fill,e.material=this.material,e.outline=this.outline,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.shadows=this.shadows,e.distanceDisplayCondition=this.distanceDisplayCondition,e.classificationType=this.classificationType,e.zIndex=this.zIndex,e):new BX(this)};BX.prototype.merge=function(e){this.show=y(this.show,e.show),this.positions=y(this.positions,e.positions),this.width=y(this.width,e.width),this.height=y(this.height,e.height),this.heightReference=y(this.heightReference,e.heightReference),this.extrudedHeight=y(this.extrudedHeight,e.extrudedHeight),this.extrudedHeightReference=y(this.extrudedHeightReference,e.extrudedHeightReference),this.cornerType=y(this.cornerType,e.cornerType),this.granularity=y(this.granularity,e.granularity),this.fill=y(this.fill,e.fill),this.material=y(this.material,e.material),this.outline=y(this.outline,e.outline),this.outlineColor=y(this.outlineColor,e.outlineColor),this.outlineWidth=y(this.outlineWidth,e.outlineWidth),this.shadows=y(this.shadows,e.shadows),this.distanceDisplayCondition=y(this.distanceDisplayCondition,e.distanceDisplayCondition),this.classificationType=y(this.classificationType,e.classificationType),this.zIndex=y(this.zIndex,e.zIndex)};var a_=BX;var xpn=T(S(),1);function CMe(e){return e}function VMe(e,t){return de(e,t,CMe)}var Gl=VMe;var Rpn=T(S(),1);function YX(e){this._definitionChanged=new ge,this._show=void 0,this._showSubscription=void 0,this._length=void 0,this._lengthSubscription=void 0,this._topRadius=void 0,this._topRadiusSubscription=void 0,this._bottomRadius=void 0,this._bottomRadiusSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._fill=void 0,this._fillSubscription=void 0,this._material=void 0,this._materialSubscription=void 0,this._outline=void 0,this._outlineSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._numberOfVerticalLines=void 0,this._numberOfVerticalLinesSubscription=void 0,this._slices=void 0,this._slicesSubscription=void 0,this._shadows=void 0,this._shadowsSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this.merge(y(e,y.EMPTY_OBJECT))}Object.defineProperties(YX.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:de("show"),length:de("length"),topRadius:de("topRadius"),bottomRadius:de("bottomRadius"),heightReference:de("heightReference"),fill:de("fill"),material:Go("material"),outline:de("outline"),outlineColor:de("outlineColor"),outlineWidth:de("outlineWidth"),numberOfVerticalLines:de("numberOfVerticalLines"),slices:de("slices"),shadows:de("shadows"),distanceDisplayCondition:de("distanceDisplayCondition")});YX.prototype.clone=function(e){return l(e)?(e.show=this.show,e.length=this.length,e.topRadius=this.topRadius,e.bottomRadius=this.bottomRadius,e.heightReference=this.heightReference,e.fill=this.fill,e.material=this.material,e.outline=this.outline,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.numberOfVerticalLines=this.numberOfVerticalLines,e.slices=this.slices,e.shadows=this.shadows,e.distanceDisplayCondition=this.distanceDisplayCondition,e):new YX(this)};YX.prototype.merge=function(e){this.show=y(this.show,e.show),this.length=y(this.length,e.length),this.topRadius=y(this.topRadius,e.topRadius),this.bottomRadius=y(this.bottomRadius,e.bottomRadius),this.heightReference=y(this.heightReference,e.heightReference),this.fill=y(this.fill,e.fill),this.material=y(this.material,e.material),this.outline=y(this.outline,e.outline),this.outlineColor=y(this.outlineColor,e.outlineColor),this.outlineWidth=y(this.outlineWidth,e.outlineWidth),this.numberOfVerticalLines=y(this.numberOfVerticalLines,e.numberOfVerticalLines),this.slices=y(this.slices,e.slices),this.shadows=y(this.shadows,e.shadows),this.distanceDisplayCondition=y(this.distanceDisplayCondition,e.distanceDisplayCondition)};var c_=YX;var Ppn=T(S(),1);function OX(e){this._definitionChanged=new ge,this._show=void 0,this._showSubscription=void 0,this._semiMajorAxis=void 0,this._semiMajorAxisSubscription=void 0,this._semiMinorAxis=void 0,this._semiMinorAxisSubscription=void 0,this._height=void 0,this._heightSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._extrudedHeight=void 0,this._extrudedHeightSubscription=void 0,this._extrudedHeightReference=void 0,this._extrudedHeightReferenceSubscription=void 0,this._rotation=void 0,this._rotationSubscription=void 0,this._stRotation=void 0,this._stRotationSubscription=void 0,this._granularity=void 0,this._granularitySubscription=void 0,this._fill=void 0,this._fillSubscription=void 0,this._material=void 0,this._materialSubscription=void 0,this._outline=void 0,this._outlineSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._numberOfVerticalLines=void 0,this._numberOfVerticalLinesSubscription=void 0,this._shadows=void 0,this._shadowsSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this._classificationType=void 0,this._classificationTypeSubscription=void 0,this._zIndex=void 0,this._zIndexSubscription=void 0,this.merge(y(e,y.EMPTY_OBJECT))}Object.defineProperties(OX.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:de("show"),semiMajorAxis:de("semiMajorAxis"),semiMinorAxis:de("semiMinorAxis"),height:de("height"),heightReference:de("heightReference"),extrudedHeight:de("extrudedHeight"),extrudedHeightReference:de("extrudedHeightReference"),rotation:de("rotation"),stRotation:de("stRotation"),granularity:de("granularity"),fill:de("fill"),material:Go("material"),outline:de("outline"),outlineColor:de("outlineColor"),outlineWidth:de("outlineWidth"),numberOfVerticalLines:de("numberOfVerticalLines"),shadows:de("shadows"),distanceDisplayCondition:de("distanceDisplayCondition"),classificationType:de("classificationType"),zIndex:de("zIndex")});OX.prototype.clone=function(e){return l(e)?(e.show=this.show,e.semiMajorAxis=this.semiMajorAxis,e.semiMinorAxis=this.semiMinorAxis,e.height=this.height,e.heightReference=this.heightReference,e.extrudedHeight=this.extrudedHeight,e.extrudedHeightReference=this.extrudedHeightReference,e.rotation=this.rotation,e.stRotation=this.stRotation,e.granularity=this.granularity,e.fill=this.fill,e.material=this.material,e.outline=this.outline,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.numberOfVerticalLines=this.numberOfVerticalLines,e.shadows=this.shadows,e.distanceDisplayCondition=this.distanceDisplayCondition,e.classificationType=this.classificationType,e.zIndex=this.zIndex,e):new OX(this)};OX.prototype.merge=function(e){this.show=y(this.show,e.show),this.semiMajorAxis=y(this.semiMajorAxis,e.semiMajorAxis),this.semiMinorAxis=y(this.semiMinorAxis,e.semiMinorAxis),this.height=y(this.height,e.height),this.heightReference=y(this.heightReference,e.heightReference),this.extrudedHeight=y(this.extrudedHeight,e.extrudedHeight),this.extrudedHeightReference=y(this.extrudedHeightReference,e.extrudedHeightReference),this.rotation=y(this.rotation,e.rotation),this.stRotation=y(this.stRotation,e.stRotation),this.granularity=y(this.granularity,e.granularity),this.fill=y(this.fill,e.fill),this.material=y(this.material,e.material),this.outline=y(this.outline,e.outline),this.outlineColor=y(this.outlineColor,e.outlineColor),this.outlineWidth=y(this.outlineWidth,e.outlineWidth),this.numberOfVerticalLines=y(this.numberOfVerticalLines,e.numberOfVerticalLines),this.shadows=y(this.shadows,e.shadows),this.distanceDisplayCondition=y(this.distanceDisplayCondition,e.distanceDisplayCondition),this.classificationType=y(this.classificationType,e.classificationType),this.zIndex=y(this.zIndex,e.zIndex)};var l_=OX;var kpn=T(S(),1);function HX(e){this._definitionChanged=new ge,this._show=void 0,this._showSubscription=void 0,this._radii=void 0,this._radiiSubscription=void 0,this._innerRadii=void 0,this._innerRadiiSubscription=void 0,this._minimumClock=void 0,this._minimumClockSubscription=void 0,this._maximumClock=void 0,this._maximumClockSubscription=void 0,this._minimumCone=void 0,this._minimumConeSubscription=void 0,this._maximumCone=void 0,this._maximumConeSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._fill=void 0,this._fillSubscription=void 0,this._material=void 0,this._materialSubscription=void 0,this._outline=void 0,this._outlineSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._stackPartitions=void 0,this._stackPartitionsSubscription=void 0,this._slicePartitions=void 0,this._slicePartitionsSubscription=void 0,this._subdivisions=void 0,this._subdivisionsSubscription=void 0,this._shadows=void 0,this._shadowsSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this.merge(y(e,y.EMPTY_OBJECT))}Object.defineProperties(HX.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:de("show"),radii:de("radii"),innerRadii:de("innerRadii"),minimumClock:de("minimumClock"),maximumClock:de("maximumClock"),minimumCone:de("minimumCone"),maximumCone:de("maximumCone"),heightReference:de("heightReference"),fill:de("fill"),material:Go("material"),outline:de("outline"),outlineColor:de("outlineColor"),outlineWidth:de("outlineWidth"),stackPartitions:de("stackPartitions"),slicePartitions:de("slicePartitions"),subdivisions:de("subdivisions"),shadows:de("shadows"),distanceDisplayCondition:de("distanceDisplayCondition")});HX.prototype.clone=function(e){return l(e)?(e.show=this.show,e.radii=this.radii,e.innerRadii=this.innerRadii,e.minimumClock=this.minimumClock,e.maximumClock=this.maximumClock,e.minimumCone=this.minimumCone,e.maximumCone=this.maximumCone,e.heightReference=this.heightReference,e.fill=this.fill,e.material=this.material,e.outline=this.outline,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.stackPartitions=this.stackPartitions,e.slicePartitions=this.slicePartitions,e.subdivisions=this.subdivisions,e.shadows=this.shadows,e.distanceDisplayCondition=this.distanceDisplayCondition,e):new HX(this)};HX.prototype.merge=function(e){this.show=y(this.show,e.show),this.radii=y(this.radii,e.radii),this.innerRadii=y(this.innerRadii,e.innerRadii),this.minimumClock=y(this.minimumClock,e.minimumClock),this.maximumClock=y(this.maximumClock,e.maximumClock),this.minimumCone=y(this.minimumCone,e.minimumCone),this.maximumCone=y(this.maximumCone,e.maximumCone),this.heightReference=y(this.heightReference,e.heightReference),this.fill=y(this.fill,e.fill),this.material=y(this.material,e.material),this.outline=y(this.outline,e.outline),this.outlineColor=y(this.outlineColor,e.outlineColor),this.outlineWidth=y(this.outlineWidth,e.outlineWidth),this.stackPartitions=y(this.stackPartitions,e.stackPartitions),this.slicePartitions=y(this.slicePartitions,e.slicePartitions),this.subdivisions=y(this.subdivisions,e.subdivisions),this.shadows=y(this.shadows,e.shadows),this.distanceDisplayCondition=y(this.distanceDisplayCondition,e.distanceDisplayCondition)};var d_=HX;var Hpn=T(S(),1);function zX(e){this._definitionChanged=new ge,this._show=void 0,this._showSubscription=void 0,this._text=void 0,this._textSubscription=void 0,this._font=void 0,this._fontSubscription=void 0,this._style=void 0,this._styleSubscription=void 0,this._scale=void 0,this._scaleSubscription=void 0,this._showBackground=void 0,this._showBackgroundSubscription=void 0,this._backgroundColor=void 0,this._backgroundColorSubscription=void 0,this._backgroundPadding=void 0,this._backgroundPaddingSubscription=void 0,this._pixelOffset=void 0,this._pixelOffsetSubscription=void 0,this._eyeOffset=void 0,this._eyeOffsetSubscription=void 0,this._horizontalOrigin=void 0,this._horizontalOriginSubscription=void 0,this._verticalOrigin=void 0,this._verticalOriginSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._fillColor=void 0,this._fillColorSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._translucencyByDistance=void 0,this._translucencyByDistanceSubscription=void 0,this._pixelOffsetScaleByDistance=void 0,this._pixelOffsetScaleByDistanceSubscription=void 0,this._scaleByDistance=void 0,this._scaleByDistanceSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this._disableDepthTestDistance=void 0,this._disableDepthTestDistanceSubscription=void 0,this.merge(y(e,y.EMPTY_OBJECT))}Object.defineProperties(zX.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:de("show"),text:de("text"),font:de("font"),style:de("style"),scale:de("scale"),showBackground:de("showBackground"),backgroundColor:de("backgroundColor"),backgroundPadding:de("backgroundPadding"),pixelOffset:de("pixelOffset"),eyeOffset:de("eyeOffset"),horizontalOrigin:de("horizontalOrigin"),verticalOrigin:de("verticalOrigin"),heightReference:de("heightReference"),fillColor:de("fillColor"),outlineColor:de("outlineColor"),outlineWidth:de("outlineWidth"),translucencyByDistance:de("translucencyByDistance"),pixelOffsetScaleByDistance:de("pixelOffsetScaleByDistance"),scaleByDistance:de("scaleByDistance"),distanceDisplayCondition:de("distanceDisplayCondition"),disableDepthTestDistance:de("disableDepthTestDistance")});zX.prototype.clone=function(e){return l(e)?(e.show=this.show,e.text=this.text,e.font=this.font,e.style=this.style,e.scale=this.scale,e.showBackground=this.showBackground,e.backgroundColor=this.backgroundColor,e.backgroundPadding=this.backgroundPadding,e.pixelOffset=this.pixelOffset,e.eyeOffset=this.eyeOffset,e.horizontalOrigin=this.horizontalOrigin,e.verticalOrigin=this.verticalOrigin,e.heightReference=this.heightReference,e.fillColor=this.fillColor,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.translucencyByDistance=this.translucencyByDistance,e.pixelOffsetScaleByDistance=this.pixelOffsetScaleByDistance,e.scaleByDistance=this.scaleByDistance,e.distanceDisplayCondition=this.distanceDisplayCondition,e.disableDepthTestDistance=this.disableDepthTestDistance,e):new zX(this)};zX.prototype.merge=function(e){this.show=y(this.show,e.show),this.text=y(this.text,e.text),this.font=y(this.font,e.font),this.style=y(this.style,e.style),this.scale=y(this.scale,e.scale),this.showBackground=y(this.showBackground,e.showBackground),this.backgroundColor=y(this.backgroundColor,e.backgroundColor),this.backgroundPadding=y(this.backgroundPadding,e.backgroundPadding),this.pixelOffset=y(this.pixelOffset,e.pixelOffset),this.eyeOffset=y(this.eyeOffset,e.eyeOffset),this.horizontalOrigin=y(this.horizontalOrigin,e.horizontalOrigin),this.verticalOrigin=y(this.verticalOrigin,e.verticalOrigin),this.heightReference=y(this.heightReference,e.heightReference),this.fillColor=y(this.fillColor,e.fillColor),this.outlineColor=y(this.outlineColor,e.outlineColor),this.outlineWidth=y(this.outlineWidth,e.outlineWidth),this.translucencyByDistance=y(this.translucencyByDistance,e.translucencyByDistance),this.pixelOffsetScaleByDistance=y(this.pixelOffsetScaleByDistance,e.pixelOffsetScaleByDistance),this.scaleByDistance=y(this.scaleByDistance,e.scaleByDistance),this.distanceDisplayCondition=y(this.distanceDisplayCondition,e.distanceDisplayCondition),this.disableDepthTestDistance=y(this.disableDepthTestDistance,e.disableDepthTestDistance)};var Pm=zX;var b0n=T(S(),1);var e0n=T(S(),1);var Mz=new sg;function KX(e){e=y(e,y.EMPTY_OBJECT),this._definitionChanged=new ge,this._translation=void 0,this._translationSubscription=void 0,this._rotation=void 0,this._rotationSubscription=void 0,this._scale=void 0,this._scaleSubscription=void 0,this.translation=e.translation,this.rotation=e.rotation,this.scale=e.scale}Object.defineProperties(KX.prototype,{isConstant:{get:function(){return K.isConstant(this._translation)&&K.isConstant(this._rotation)&&K.isConstant(this._scale)}},definitionChanged:{get:function(){return this._definitionChanged}},translation:de("translation"),rotation:de("rotation"),scale:de("scale")});KX.prototype.getValue=function(e,t){return l(t)||(t=new sg),t.translation=K.getValueOrClonedDefault(this._translation,e,Mz.translation,t.translation),t.rotation=K.getValueOrClonedDefault(this._rotation,e,Mz.rotation,t.rotation),t.scale=K.getValueOrClonedDefault(this._scale,e,Mz.scale,t.scale),t};KX.prototype.equals=function(e){return this===e||e instanceof KX&&K.equals(this._translation,e._translation)&&K.equals(this._rotation,e._rotation)&&K.equals(this._scale,e._scale)};var u_=KX;var c0n=T(S(),1);function Yp(e,t){this._propertyNames=[],this._definitionChanged=new ge,l(e)&&this.merge(e,t)}Object.defineProperties(Yp.prototype,{propertyNames:{get:function(){return this._propertyNames}},isConstant:{get:function(){let e=this._propertyNames;for(let t=0,n=e.length;t{this._terrainHeight=a.height,this.definitionChanged.raiseEvent()};this._removeCallbackFunc=e.updateHeight(o,s,this._heightReference)};HC.prototype.getValue=function(e,t){let n=K.getValueOrDefault(this._heightReference,e,Je.NONE),i=K.getValueOrDefault(this._extrudedHeightReference,e,Je.NONE);if(n===Je.NONE&&!FC(i))return this._position=h.clone(h.ZERO,this._position),h.clone(h.ZERO,t);if(this._positionProperty.isConstant)return h.multiplyByScalar(this._normal,this._terrainHeight,t);let o=this._scene,r=this._positionProperty.getValue(e,Zae);if(!l(r)||h.equals(r,h.ZERO)||!l(o.globe))return h.clone(h.ZERO,t);if(h.equalsEpsilon(this._position,r,W.EPSILON10))return h.multiplyByScalar(this._normal,this._terrainHeight,t);this._position=h.clone(r,this._position),this._updateClamping();let s=o.globe.ellipsoid.geodeticSurfaceNormal(r,this._normal);return h.multiplyByScalar(s,this._terrainHeight,t)};HC.prototype.isDestroyed=function(){return!1};HC.prototype.destroy=function(){return l(this._removeEventListener)&&this._removeEventListener(),l(this._removeModeListener)&&this._removeModeListener(),l(this._removeCallbackFunc)&&this._removeCallbackFunc(),me(this)};var p_=HC;function UMe(e,t,n,i){if(ii.prototype._onEntityPropertyChanged.call(this,e,t,n,i),this._observedPropertyNames.indexOf(t)===-1)return;let o=this._entity[this._geometryPropertyName];if(!l(o))return;l(this._terrainOffsetProperty)&&(this._terrainOffsetProperty.destroy(),this._terrainOffsetProperty=void 0);let r=o.heightReference;if(l(r)){let s=new Fm(this._computeCenter.bind(this),!this._dynamic);this._terrainOffsetProperty=new p_(this._scene,s,r)}}var Kp=UMe;var Gae=h.ZERO,Eae=new h,DMe=new h,Xae=new Y;function BMe(e){this.id=e,this.vertexFormat=void 0,this.dimensions=void 0,this.offsetAttribute=void 0}function xd(e,t){ii.call(this,{entity:e,scene:t,geometryOptions:new BMe(e),geometryPropertyName:"box",observedPropertyNames:["availability","position","orientation","box"]}),this._onEntityPropertyChanged(e,"box",e.box,void 0)}l(Object.create)&&(xd.prototype=Object.create(ii.prototype),xd.prototype.constructor=xd);Object.defineProperties(xd.prototype,{terrainOffsetProperty:{get:function(){return this._terrainOffsetProperty}}});xd.prototype.createFillGeometryInstance=function(e){let t=this._entity,n=t.isAvailable(e),i=new xn(n&&t.isShowing&&this._showProperty.getValue(e)&&this._fillProperty.getValue(e)),o=this._distanceDisplayConditionProperty.getValue(e),r=kn.fromDistanceDisplayCondition(o),s={show:i,distanceDisplayCondition:r,color:void 0,offset:void 0};if(this._materialProperty instanceof Ut){let a;l(this._materialProperty.color)&&(this._materialProperty.color.isConstant||n)&&(a=this._materialProperty.color.getValue(e,Xae)),l(a)||(a=Y.WHITE),s.color=Ht.fromColor(a)}return l(this._options.offsetAttribute)&&(s.offset=Hi.fromCartesian3(K.getValueOrDefault(this._terrainOffsetProperty,e,Gae,Eae))),new St({id:t,geometry:yl.fromDimensions(this._options),modelMatrix:t.computeModelMatrixForHeightReference(e,t.box.heightReference,this._options.dimensions.z*.5,this._scene.mapProjection.ellipsoid),attributes:s})};xd.prototype.createOutlineGeometryInstance=function(e){let t=this._entity,n=t.isAvailable(e),i=K.getValueOrDefault(this._outlineColorProperty,e,Y.BLACK,Xae),o=this._distanceDisplayConditionProperty.getValue(e),r={show:new xn(n&&t.isShowing&&this._showProperty.getValue(e)&&this._showOutlineProperty.getValue(e)),color:Ht.fromColor(i),distanceDisplayCondition:kn.fromDistanceDisplayCondition(o),offset:void 0};return l(this._options.offsetAttribute)&&(r.offset=Hi.fromCartesian3(K.getValueOrDefault(this._terrainOffsetProperty,e,Gae,Eae))),new St({id:t,geometry:gm.fromDimensions(this._options),modelMatrix:t.computeModelMatrixForHeightReference(e,t.box.heightReference,this._options.dimensions.z*.5,this._scene.mapProjection.ellipsoid),attributes:r})};xd.prototype._computeCenter=function(e,t){return K.getValueOrUndefined(this._entity.position,e,t)};xd.prototype._isHidden=function(e,t){return!l(t.dimensions)||!l(e.position)||ii.prototype._isHidden.call(this,e,t)};xd.prototype._isDynamic=function(e,t){return!e.position.isConstant||!K.isConstant(e.orientation)||!t.dimensions.isConstant||!K.isConstant(t.outlineWidth)};xd.prototype._setStaticOptions=function(e,t){let n=K.getValueOrDefault(t.heightReference,Be.MINIMUM_VALUE,Je.NONE),i=this._options;i.vertexFormat=this._materialProperty instanceof Ut?dn.VERTEX_FORMAT:ro.MaterialSupport.TEXTURED.vertexFormat,i.dimensions=t.dimensions.getValue(Be.MINIMUM_VALUE,i.dimensions),i.offsetAttribute=n!==Je.NONE?ln.ALL:void 0};xd.prototype._onEntityPropertyChanged=Kp;xd.DynamicGeometryUpdater=zC;function zC(e,t,n){ni.call(this,e,t,n)}l(Object.create)&&(zC.prototype=Object.create(ni.prototype),zC.prototype.constructor=zC);zC.prototype._isHidden=function(e,t,n){let i=K.getValueOrUndefined(e.position,n,DMe),o=this._options.dimensions;return!l(i)||!l(o)||ni.prototype._isHidden.call(this,e,t,n)};zC.prototype._setOptions=function(e,t,n){let i=K.getValueOrDefault(t.heightReference,n,Je.NONE),o=this._options;o.dimensions=K.getValueOrUndefined(t.dimensions,n,o.dimensions),o.offsetAttribute=i!==Je.NONE?ln.ALL:void 0};var sI=xd;var jqn=T(S(),1);var kqn=T(S(),1);var $yn=T(S(),1);var Hyn=T(S(),1);var yyn=T(S(),1);function Iae(e){e=y(e,y.EMPTY_OBJECT),this.vertexArray=e.vertexArray,this.fragmentShaderSource=e.fragmentShaderSource,this.shaderProgram=e.shaderProgram,this.uniformMap=e.uniformMap,this.outputTexture=e.outputTexture,this.preExecute=e.preExecute,this.postExecute=e.postExecute,this.canceled=e.canceled,this.persists=y(e.persists,!1),this.pass=Re.COMPUTE,this.owner=e.owner}Iae.prototype.execute=function(e){e.execute(this)};var Xl=Iae;var _yn=T(S(),1),aI=`in vec2 v_textureCoordinates; uniform float originalSize; uniform sampler2D texture0; uniform sampler2D texture1; uniform sampler2D texture2; uniform sampler2D texture3; uniform sampler2D texture4; uniform sampler2D texture5; const float yMipLevel1 = 1.0 - (1.0 / pow(2.0, 1.0)); const float yMipLevel2 = 1.0 - (1.0 / pow(2.0, 2.0)); const float yMipLevel3 = 1.0 - (1.0 / pow(2.0, 3.0)); const float yMipLevel4 = 1.0 - (1.0 / pow(2.0, 4.0)); void main() { vec2 uv = v_textureCoordinates; vec2 textureSize = vec2(originalSize * 1.5 + 2.0, originalSize); vec2 pixel = 1.0 / textureSize; float mipLevel = 0.0; if (uv.x - pixel.x > (textureSize.y / textureSize.x)) { mipLevel = 1.0; if (uv.y - pixel.y > yMipLevel1) { mipLevel = 2.0; if (uv.y - pixel.y * 3.0 > yMipLevel2) { mipLevel = 3.0; if (uv.y - pixel.y * 5.0 > yMipLevel3) { mipLevel = 4.0; if (uv.y - pixel.y * 7.0 > yMipLevel4) { mipLevel = 5.0; } } } } } if (mipLevel > 0.0) { float scale = pow(2.0, mipLevel); uv.y -= (pixel.y * (mipLevel - 1.0) * 2.0); uv.x *= ((textureSize.x - 2.0) / textureSize.y); uv.x -= 1.0 + pixel.x; uv.y -= (1.0 - (1.0 / pow(2.0, mipLevel - 1.0))); uv *= scale; } else { uv.x *= (textureSize.x / textureSize.y); } if(mipLevel == 0.0) { out_FragColor = texture(texture0, uv); } else if(mipLevel == 1.0) { out_FragColor = texture(texture1, uv); } else if(mipLevel == 2.0) { out_FragColor = texture(texture2, uv); } else if(mipLevel == 3.0) { out_FragColor = texture(texture3, uv); } else if(mipLevel == 4.0) { out_FragColor = texture(texture4, uv); } else if(mipLevel == 5.0) { out_FragColor = texture(texture5, uv); } else { out_FragColor = vec4(0.0); } } `;var Syn=T(S(),1),cI=`in vec3 v_cubeMapCoordinates; uniform samplerCube cubeMap; void main() { vec4 rgba = czm_textureCube(cubeMap, v_cubeMapCoordinates); #ifdef RGBA_NORMALIZED out_FragColor = vec4(rgba.rgb, 1.0); #else float m = rgba.a * 16.0; vec3 r = rgba.rgb * m; out_FragColor = vec4(r * r, 1.0); #endif } `;var Vyn=T(S(),1),lI=`in vec4 position; in vec3 cubeMapCoordinates; out vec3 v_cubeMapCoordinates; void main() { gl_Position = position; v_cubeMapCoordinates = cubeMapCoordinates; } `;function b_(e){this._url=e,this._cubeMapBuffers=void 0,this._cubeMaps=void 0,this._texture=void 0,this._mipTextures=void 0,this._va=void 0,this._sp=void 0,this._maximumMipmapLevel=void 0,this._loading=!1,this._ready=!1,this._errorEvent=new ge}Object.defineProperties(b_.prototype,{url:{get:function(){return this._url}},errorEvent:{get:function(){return this._errorEvent}},texture:{get:function(){return this._texture}},maximumMipmapLevel:{get:function(){return this._maximumMipmapLevel}},ready:{get:function(){return this._ready}}});b_.isSupported=function(e){return e.colorBufferHalfFloat&&e.halfFloatingPointTexture||e.floatingPointTexture&&e.colorBufferFloat};var YMe=new h(1,0,0),OMe=new h(0,0,1),HMe=new h(-1,0,0),zMe=new h(0,0,-1),A5=new h(0,1,0),KMe=new h(0,-1,0),vae=[A5,HMe,OMe,KMe,YMe,A5,zMe,A5,A5],wae=vae.length,Fae=new Float32Array(wae*3),Wae=0;for(let e=0;e0||this._imageBasedLightingFactor.y>0}},shouldRegenerateShaders:{get:function(){return this._shouldRegenerateShaders}},useDefaultSphericalHarmonics:{get:function(){return this._useDefaultSphericalHarmonics}},useSphericalHarmonicCoefficients:{get:function(){return l(this._sphericalHarmonicCoefficients)||this._useDefaultSphericalHarmonics}},specularEnvironmentMapAtlas:{get:function(){return this._specularEnvironmentMapAtlas}},useDefaultSpecularMaps:{get:function(){return this._useDefaultSpecularMaps}},useSpecularEnvironmentMaps:{get:function(){return l(this._specularEnvironmentMapAtlas)&&this._specularEnvironmentMapAtlas.ready||this._useDefaultSpecularMaps}}});function qMe(e,t){if(Am.isSupported(t)){if(e._specularEnvironmentMapAtlas=e._specularEnvironmentMapAtlas&&e._specularEnvironmentMapAtlas.destroy(),l(e._specularEnvironmentMaps)){let n=new Am(e._specularEnvironmentMaps);e._specularEnvironmentMapAtlas=n,e._removeErrorListener=n.errorEvent.addEventListener(i=>{console.error(`Error loading specularEnvironmentMaps: ${i}`)})}e._shouldRegenerateShaders=!0}}dI.prototype.update=function(e){if(e.frameNumber===this._previousFrameNumber)return;this._previousFrameNumber=e.frameNumber;let t=e.context;e.brdfLutGenerator.update(e),this._shouldRegenerateShaders=!1;let n=this._imageBasedLightingFactor,i=this._previousImageBasedLightingFactor;D.equals(n,i)||(this._shouldRegenerateShaders=n.x>0&&i.x===0||n.x===0&&i.x>0,this._shouldRegenerateShaders=this._shouldRegenerateShaders||n.y>0&&i.y===0||n.y===0&&i.y>0,this._previousImageBasedLightingFactor=D.clone(this._imageBasedLightingFactor,this._previousImageBasedLightingFactor)),this._luminanceAtZenith!==this._previousLuminanceAtZenith&&(this._shouldRegenerateShaders=this._shouldRegenerateShaders||l(this._luminanceAtZenith)!==l(this._previousLuminanceAtZenith),this._previousLuminanceAtZenith=this._luminanceAtZenith),this._previousSphericalHarmonicCoefficients!==this._sphericalHarmonicCoefficients&&(this._shouldRegenerateShaders=this._shouldRegenerateShaders||l(this._previousSphericalHarmonicCoefficients)!==l(this._sphericalHarmonicCoefficients),this._previousSphericalHarmonicCoefficients=this._sphericalHarmonicCoefficients),this._shouldRegenerateShaders=this._shouldRegenerateShaders||this._previousSpecularEnvironmentMapLoaded!==this._specularEnvironmentMapLoaded,this._previousSpecularEnvironmentMapLoaded=this._specularEnvironmentMapLoaded,this._specularEnvironmentMapAtlasDirty&&(qMe(this,t),this._specularEnvironmentMapAtlasDirty=!1),l(this._specularEnvironmentMapAtlas)&&(this._specularEnvironmentMapAtlas.update(e),this._specularEnvironmentMapAtlas.ready&&(this._specularEnvironmentMapLoaded=!0));let o=!l(this._specularEnvironmentMapAtlas)&&l(e.specularEnvironmentMaps)&&!this._useDefaultSpecularMaps,r=!l(e.specularEnvironmentMaps)&&this._useDefaultSpecularMaps,s=!l(this._sphericalHarmonicCoefficients)&&l(e.sphericalHarmonicCoefficients)&&!this._useDefaultSphericalHarmonics,a=!l(e.sphericalHarmonicCoefficients)&&this._useDefaultSphericalHarmonics;this._shouldRegenerateShaders=this._shouldRegenerateShaders||o||r||s||a,this._useDefaultSpecularMaps=!l(this._specularEnvironmentMapAtlas)&&l(e.specularEnvironmentMaps),this._useDefaultSphericalHarmonics=!l(this._sphericalHarmonicCoefficients)&&l(e.sphericalHarmonicCoefficients)};dI.prototype.isDestroyed=function(){return!1};dI.prototype.destroy=function(){return this._specularEnvironmentMapAtlas=this._specularEnvironmentMapAtlas&&this._specularEnvironmentMapAtlas.destroy(),this._removeErrorListener=this._removeErrorListener&&this._removeErrorListener(),me(this)};var g_=dI;var ixn=T(S(),1);function M5(e){e=y(e,y.EMPTY_OBJECT),this.color=e.color,this.depth=e.depth,this.stencil=e.stencil,this.renderState=e.renderState,this.framebuffer=e.framebuffer,this.owner=e.owner,this.pass=e.pass}M5.ALL=Object.freeze(new M5({color:new Y(0,0,0,0),depth:1,stencil:0}));M5.prototype.execute=function(e,t){e.clear(this,t)};var oi=M5;var axn=T(S(),1);var Jp={X:0,Y:1,Z:2};Jp.Y_UP_TO_Z_UP=M.fromRotationTranslation($.fromArray([1,0,0,0,0,1,0,-1,0]));Jp.Z_UP_TO_Y_UP=M.fromRotationTranslation($.fromArray([1,0,0,0,0,-1,0,1,0]));Jp.X_UP_TO_Z_UP=M.fromRotationTranslation($.fromArray([0,0,1,0,1,0,-1,0,0]));Jp.Z_UP_TO_X_UP=M.fromRotationTranslation($.fromArray([0,0,-1,0,1,0,1,0,0]));Jp.X_UP_TO_Y_UP=M.fromRotationTranslation($.fromArray([0,1,0,-1,0,0,0,0,1]));Jp.Y_UP_TO_X_UP=M.fromRotationTranslation($.fromArray([0,-1,0,1,0,0,0,0,1]));Jp.fromName=function(e){return Jp[e]};var Eo=Object.freeze(Jp);var c7n=T(S(),1);var dxn=T(S(),1);function Aae(e){e=y(e,y.EMPTY_OBJECT),this._metadata=e.metadata}Object.defineProperties(Aae.prototype,{metadata:{get:function(){return this._metadata}}});var y_=Aae;var e4n=T(S(),1);var yxn=T(S(),1);function Vu(e,t,n,i){this._tileset=e,this._tile=t,this._resource=n,l(i)||(i=[]),this._contents=i,this._metadata=void 0,this._group=void 0,this._ready=!1}Object.defineProperties(Vu.prototype,{featurePropertiesDirty:{get:function(){let e=this._contents,t=e.length;for(let n=0;n0){let o=Math.min(t,Mt.maximumTextureSize),r=Math.ceil(t/Mt.maximumTextureSize),s=1/o,a=s*.5,c=1/r,d=c*.5;n=new D(o,r),i=new se(s,a,c,d)}this._translucentFeaturesLength=0,this._featuresLength=t,this._textureDimensions=n,this._textureStep=i,this._owner=e.owner,this._statistics=e.statistics,this._colorChangedCallback=e.colorChangedCallback}Object.defineProperties(dc.prototype,{translucentFeaturesLength:{get:function(){return this._translucentFeaturesLength}},byteLength:{get:function(){let e=0;return l(this._pickTexture)&&(e+=this._pickTexture.sizeInBytes),l(this._batchTexture)&&(e+=this._batchTexture.sizeInBytes),e}},textureDimensions:{get:function(){return this._textureDimensions}},textureStep:{get:function(){return this._textureStep}},batchTexture:{get:function(){return this._batchTexture}},defaultTexture:{get:function(){return this._defaultTexture}},pickTexture:{get:function(){return this._pickTexture}}});dc.DEFAULT_COLOR_VALUE=Y.WHITE;dc.DEFAULT_SHOW_VALUE=!0;function Mae(e){let t=e._textureDimensions;return t.x*t.y*4}function Nae(e){if(!l(e._batchValues)){let t=Mae(e),n=new Uint8Array(t).fill(255);e._batchValues=n}return e._batchValues}function kae(e){if(!l(e._showAlphaProperties)){let t=2*e._featuresLength,n=new Uint8Array(t).fill(255);e._showAlphaProperties=n}return e._showAlphaProperties}dc.prototype.setShow=function(e,t){if(t&&!l(this._showAlphaProperties))return;let n=kae(this),i=e*2,o=t?255:0;if(n[i]!==o){n[i]=o;let r=Nae(this),s=e*4+3;r[s]=t?n[i+1]:0,this._batchValuesDirty=!0}};dc.prototype.setAllShow=function(e){let t=this._featuresLength;for(let n=0;n0){let i=e._pickIds,o=Mae(e),r=new Uint8Array(o),s=e._owner,a=e._statistics;for(let c=0;c0;){if(t=u.pop(),c[t]===d)continue;c[t]=d;let m=n(e,t);if(l(m))return m;let p=o[t],g=s[t];for(let f=0;f0?(s="",e&&(s+=`uniform bool tile_translucentCommand; `),s+=`uniform sampler2D tile_batchTexture; out vec4 tile_featureColor; out vec2 tile_featureSt; void main() { vec2 st = computeSt(${t}); vec4 featureProperties = texture(tile_batchTexture, st); tile_color(featureProperties); float show = ceil(featureProperties.a); gl_Position *= show; `,e&&(s+=` bool isStyleTranslucent = (featureProperties.a != 1.0); if (czm_pass == czm_passTranslucent) { if (!isStyleTranslucent && !tile_translucentCommand) { gl_Position *= 0.0; } } else { if (isStyleTranslucent) { gl_Position *= 0.0; } } `),s+=` tile_featureColor = featureProperties; tile_featureSt = st; }`):s=`out vec2 tile_featureSt; void main() { tile_color(vec4(1.0)); tile_featureSt = computeSt(${t}); }`,`${r} ${SNe(i)}${s}`}};function Dae(e,t){return e=Ye.replaceMain(e,"tile_main"),t?`${e}uniform float tile_colorBlend; void tile_color(vec4 tile_featureColor) { tile_main(); tile_featureColor = czm_gammaCorrect(tile_featureColor); out_FragColor.a *= tile_featureColor.a; float highlight = ceil(tile_colorBlend); out_FragColor.rgb *= mix(tile_featureColor.rgb, vec3(1.0), highlight); } `:`${e}void tile_color(vec4 tile_featureColor) { tile_main(); } `}function CNe(e,t){let n=`texture(${t}`,i=0,o=e.indexOf(n,i),r;for(;o>-1;){let s=0;for(let d=o;d0?(i+=`uniform sampler2D tile_pickTexture; in vec2 tile_featureSt; in vec4 tile_featureColor; void main() { tile_color(tile_featureColor); `,n&&(i+=` out_FragColor.rgb *= out_FragColor.a; `),i+="}"):(e&&(i+=`uniform bool tile_translucentCommand; `),i+=`uniform sampler2D tile_pickTexture; uniform sampler2D tile_batchTexture; in vec2 tile_featureSt; void main() { vec4 featureProperties = texture(tile_batchTexture, tile_featureSt); if (featureProperties.a == 0.0) { discard; } `,e&&(i+=` bool isStyleTranslucent = (featureProperties.a != 1.0); if (czm_pass == czm_passTranslucent) { if (!isStyleTranslucent && !tile_translucentCommand) { discard; } } else { if (isStyleTranslucent) { discard; } } `),i+=` tile_color(featureProperties); `,n&&(i+=` out_FragColor.rgb *= out_FragColor.a; `),i+=`} `),i}};lo.prototype.getClassificationFragmentShaderCallback=function(){if(this.featuresLength!==0)return function(e){return e=Ye.replaceMain(e,"tile_main"),Mt.maximumVertexTextureImageUnits>0?e+=`uniform sampler2D tile_pickTexture; in vec2 tile_featureSt; in vec4 tile_featureColor; void main() { tile_main(); out_FragColor = tile_featureColor; out_FragColor.rgb *= out_FragColor.a; }`:e+=`uniform sampler2D tile_batchTexture; uniform sampler2D tile_pickTexture; in vec2 tile_featureSt; void main() { tile_main(); vec4 featureProperties = texture(tile_batchTexture, tile_featureSt); if (featureProperties.a == 0.0) { discard; } out_FragColor = featureProperties; out_FragColor.rgb *= out_FragColor.a; } `,e}};function VNe(e){let t=e._content.tileset,n=t.colorBlendMode,i=t.colorBlendAmount;if(n===Il.HIGHLIGHT)return 0;if(n===Il.REPLACE)return 1;if(n===Il.MIX)return W.clamp(i,W.EPSILON4,1)}lo.prototype.getUniformMapCallback=function(){if(this.featuresLength===0)return;let e=this;return function(t){return xt(t,{tile_batchTexture:function(){return y(e._batchTexture.batchTexture,e._batchTexture.defaultTexture)},tile_textureDimensions:function(){return e._batchTexture.textureDimensions},tile_textureStep:function(){return e._batchTexture.textureStep},tile_colorBlend:function(){return VNe(e)},tile_pickTexture:function(){return e._batchTexture.pickTexture}})}};lo.prototype.getPickId=function(){return"texture(tile_pickTexture, tile_featureSt)"};var pg={ALL_OPAQUE:0,ALL_TRANSLUCENT:1,OPAQUE_AND_TRANSLUCENT:2};lo.prototype.addDerivedCommands=function(e,t){let n=e.commandList,i=n.length,o=this._content._tile,r=o._finalResolution,s=o.tileset,a=s.isSkippingLevelOfDetail&&s.hasMixedContent&&e.context.stencilBuffer,c=LNe(this);for(let d=t;d>>Nt.SKIP_LOD_BIT_SHIFT}function PNe(e){let t=Oe(e,!0);return t.cull.enabled=!1,t.depthTest.enabled=!0,t.depthMask=!1,t.blending=un.ALPHA_BLEND,t.stencilTest=Nt.setCesium3DTileBit(),t.stencilMask=Nt.CESIUM_3D_TILE_MASK,De.fromCache(t)}function vNe(e){let t=Oe(e,!0);return t.stencilTest=Nt.setCesium3DTileBit(),t.stencilMask=Nt.CESIUM_3D_TILE_MASK,De.fromCache(t)}lo.prototype.update=function(e,t){this._batchTexture.update(e,t)};lo.prototype.isDestroyed=function(){return!1};lo.prototype.destroy=function(){return this._batchTexture=this._batchTexture&&this._batchTexture.destroy(),me(this)};var jp=lo;var FTn=T(S(),1);var R_n=T(S(),1);function wNe(e){this.offset=e.offset,this.count=e.count,this.color=e.color,this.batchIds=e.batchIds}var uf=wNe;var CTn=T(S(),1);var G_n=T(S(),1),KC=`in vec3 position; in float a_batchId; uniform mat4 u_modifiedModelViewProjection; void main() { gl_Position = czm_depthClamp(u_modifiedModelViewProjection * vec4(position, 1.0)); } `;var W_n=T(S(),1);function Lu(e,t){this._content=e,this._batchId=t,this._color=void 0}Object.defineProperties(Lu.prototype,{show:{get:function(){return this._content.batchTable.getShow(this._batchId)},set:function(e){this._content.batchTable.setShow(this._batchId,e)}},color:{get:function(){return l(this._color)||(this._color=new Y),this._content.batchTable.getColor(this._batchId,this._color)},set:function(e){this._content.batchTable.setColor(this._batchId,e)}},polylinePositions:{get:function(){if(l(this._content.getPolylinePositions))return this._content.getPolylinePositions(this._batchId)}},content:{get:function(){return this._content}},tileset:{get:function(){return this._content.tileset}},primitive:{get:function(){return this._content.tileset}},featureId:{get:function(){return this._batchId}},pickId:{get:function(){return this._content.batchTable.getPickColor(this._batchId)}}});Lu.prototype.hasProperty=function(e){return this._content.batchTable.hasProperty(this._batchId,e)};Lu.prototype.getPropertyIds=function(e){return this._content.batchTable.getPropertyIds(this._batchId,e)};Lu.prototype.getProperty=function(e){return this._content.batchTable.getProperty(this._batchId,e)};Lu.getPropertyInherited=function(e,t,n){let i=e.batchTable;if(l(i)){if(i.hasPropertyBySemantic(t,n))return i.getPropertyBySemantic(t,n);if(i.hasProperty(t,n))return i.getProperty(t,n)}let o=e.metadata;if(l(o)){if(o.hasPropertyBySemantic(n))return o.getPropertyBySemantic(n);if(o.hasProperty(n))return o.getProperty(n)}let r=e.tile,s=r.metadata;if(l(s)){if(s.hasPropertyBySemantic(n))return s.getPropertyBySemantic(n);if(s.hasProperty(n))return s.getProperty(n)}let a;if(l(r.implicitSubtree)&&(a=r.implicitSubtree.metadata),l(a)){if(a.hasPropertyBySemantic(n))return a.getPropertyBySemantic(n);if(a.hasProperty(n))return a.getProperty(n)}let c=l(e.group)?e.group.metadata:void 0;if(l(c)){if(c.hasPropertyBySemantic(n))return c.getPropertyBySemantic(n);if(c.hasProperty(n))return c.getProperty(n)}let d=e.tileset.metadata;if(l(d)){if(d.hasPropertyBySemantic(n))return d.getPropertyBySemantic(n);if(d.hasProperty(n))return d.getProperty(n)}};Lu.prototype.getPropertyInherited=function(e){return Lu.getPropertyInherited(this._content,this._batchId,e)};Lu.prototype.setProperty=function(e,t){this._content.batchTable.setProperty(this._batchId,e,t),this._content.featurePropertiesDirty=!0};Lu.prototype.isExactClass=function(e){return this._content.batchTable.isExactClass(this._batchId,e)};Lu.prototype.isClass=function(e){return this._content.batchTable.isClass(this._batchId,e)};Lu.prototype.getExactClassName=function(){return this._content.batchTable.getExactClassName(this._batchId)};var vs=Lu;var z_n=T(S(),1);var v_n=T(S(),1),Yz=class{add(t,n,i){if(typeof arguments[0]!="string")for(let o in arguments[0])this.add(o,arguments[0][o],arguments[1]);else(Array.isArray(t)?t:[t]).forEach(function(o){this[o]=this[o]||[],n&&this[o][i?"unshift":"push"](n)},this)}run(t,n){this[t]=this[t]||[],this[t].forEach(function(i){i.call(n&&n.context?n.context:n,n)})}},Oz=class{constructor(t){this.jsep=t,this.registered={}}register(...t){t.forEach(n=>{if(typeof n!="object"||!n.name||!n.init)throw new Error("Invalid JSEP plugin format");this.registered[n.name]||(n.init(this.jsep),this.registered[n.name]=n)})}},Wl=class e{static get version(){return"1.3.8"}static toString(){return"JavaScript Expression Parser (JSEP) v"+e.version}static addUnaryOp(t){return e.max_unop_len=Math.max(t.length,e.max_unop_len),e.unary_ops[t]=1,e}static addBinaryOp(t,n,i){return e.max_binop_len=Math.max(t.length,e.max_binop_len),e.binary_ops[t]=n,i?e.right_associative.add(t):e.right_associative.delete(t),e}static addIdentifierChar(t){return e.additional_identifier_chars.add(t),e}static addLiteral(t,n){return e.literals[t]=n,e}static removeUnaryOp(t){return delete e.unary_ops[t],t.length===e.max_unop_len&&(e.max_unop_len=e.getMaxKeyLen(e.unary_ops)),e}static removeAllUnaryOps(){return e.unary_ops={},e.max_unop_len=0,e}static removeIdentifierChar(t){return e.additional_identifier_chars.delete(t),e}static removeBinaryOp(t){return delete e.binary_ops[t],t.length===e.max_binop_len&&(e.max_binop_len=e.getMaxKeyLen(e.binary_ops)),e.right_associative.delete(t),e}static removeAllBinaryOps(){return e.binary_ops={},e.max_binop_len=0,e}static removeLiteral(t){return delete e.literals[t],e}static removeAllLiterals(){return e.literals={},e}get char(){return this.expr.charAt(this.index)}get code(){return this.expr.charCodeAt(this.index)}constructor(t){this.expr=t,this.index=0}static parse(t){return new e(t).parse()}static getMaxKeyLen(t){return Math.max(0,...Object.keys(t).map(n=>n.length))}static isDecimalDigit(t){return t>=48&&t<=57}static binaryPrecedence(t){return e.binary_ops[t]||0}static isIdentifierStart(t){return t>=65&&t<=90||t>=97&&t<=122||t>=128&&!e.binary_ops[String.fromCharCode(t)]||e.additional_identifier_chars.has(String.fromCharCode(t))}static isIdentifierPart(t){return e.isIdentifierStart(t)||e.isDecimalDigit(t)}throwError(t){let n=new Error(t+" at character "+this.index);throw n.index=this.index,n.description=t,n}runHook(t,n){if(e.hooks[t]){let i={context:this,node:n};return e.hooks.run(t,i),i.node}return n}searchHook(t){if(e.hooks[t]){let n={context:this};return e.hooks[t].find(function(i){return i.call(n.context,n),n.node}),n.node}}gobbleSpaces(){let t=this.code;for(;t===e.SPACE_CODE||t===e.TAB_CODE||t===e.LF_CODE||t===e.CR_CODE;)t=this.expr.charCodeAt(++this.index);this.runHook("gobble-spaces")}parse(){this.runHook("before-all");let t=this.gobbleExpressions(),n=t.length===1?t[0]:{type:e.COMPOUND,body:t};return this.runHook("after-all",n)}gobbleExpressions(t){let n=[],i,o;for(;this.index0;){if(e.binary_ops.hasOwnProperty(t)&&(!e.isIdentifierStart(this.code)||this.index+t.lengthr.right_a&&m.right_a?i>m.prec:i<=m.prec;for(;o.length>2&&u(o[o.length-2]);)a=o.pop(),n=o.pop().value,s=o.pop(),t={type:e.BINARY_EXP,operator:n,left:s,right:a},o.push(t);t=this.gobbleToken(),t||this.throwError("Expected expression after "+d),o.push(r,t)}for(c=o.length-1,t=o[c];c>1;)t={type:e.BINARY_EXP,operator:o[c-1].value,left:o[c-2],right:t},c-=2;return t}gobbleToken(){let t,n,i,o;if(this.gobbleSpaces(),o=this.searchHook("gobble-token"),o)return this.runHook("after-token",o);if(t=this.code,e.isDecimalDigit(t)||t===e.PERIOD_CODE)return this.gobbleNumericLiteral();if(t===e.SQUOTE_CODE||t===e.DQUOTE_CODE)o=this.gobbleStringLiteral();else if(t===e.OBRACK_CODE)o=this.gobbleArray();else{for(n=this.expr.substr(this.index,e.max_unop_len),i=n.length;i>0;){if(e.unary_ops.hasOwnProperty(n)&&(!e.isIdentifierStart(this.code)||this.index+n.length=n.length&&this.throwError("Unexpected token "+String.fromCharCode(t));break}else if(r===e.COMMA_CODE){if(this.index++,o++,o!==n.length){if(t===e.CPAREN_CODE)this.throwError("Unexpected token ,");else if(t===e.CBRACK_CODE)for(let s=n.length;s":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10},right_associative:new Set,additional_identifier_chars:new Set(["$","_"]),literals:{true:!0,false:!1,null:null},this_str:"this"});Wl.max_unop_len=Wl.getMaxKeyLen(Wl.unary_ops);Wl.max_binop_len=Wl.getMaxKeyLen(Wl.binary_ops);var bg=e=>new Wl(e).parse(),ANe=Object.getOwnPropertyNames(Wl);ANe.forEach(e=>{bg[e]===void 0&&e!=="prototype"&&(bg[e]=Wl[e])});bg.Jsep=Wl;var MNe="ConditionalExpression",NNe={name:"ternary",init(e){e.hooks.add("after-expression",function(n){if(n.node&&this.code===e.QUMARK_CODE){this.index++;let i=n.node,o=this.gobbleExpression();if(o||this.throwError("Expected expression"),this.gobbleSpaces(),this.code===e.COLON_CODE){this.index++;let r=this.gobbleExpression();if(r||this.throwError("Expected expression"),n.node={type:MNe,test:i,consequent:o,alternate:r},i.operator&&e.binary_ops[i.operator]<=.9){let s=i;for(;s.right.operator&&e.binary_ops[s.right.operator]<=.9;)s=s.right;n.node.test=s.right,s.right=n.node,n.node=i}}else this.throwError("Expected :")}})}};bg.plugins.register(NNe);var F_n=T(S(),1),kNe={VARIABLE:0,UNARY:1,BINARY:2,TERNARY:3,CONDITIONAL:4,MEMBER:5,FUNCTION_CALL:6,ARRAY:7,REGEX:8,VARIABLE_IN_STRING:9,LITERAL_NULL:10,LITERAL_BOOLEAN:11,LITERAL_NUMBER:12,LITERAL_STRING:13,LITERAL_COLOR:14,LITERAL_VECTOR:15,LITERAL_REGEX:16,LITERAL_UNDEFINED:17,BUILTIN_VARIABLE:18},gt=Object.freeze(kNe);function Mm(e,t){this._expression=e,e=$Ne(e,t),e=t5e(e5e(e)),bg.addBinaryOp("=~",0),bg.addBinaryOp("!~",0);let n;try{n=bg(e)}catch(i){throw new ue(i)}this._runtimeAst=xi(this,n)}Object.defineProperties(Mm.prototype,{expression:{get:function(){return this._expression}}});var vn={arrayIndex:0,arrayArray:[[]],cartesian2Index:0,cartesian3Index:0,cartesian4Index:0,cartesian2Array:[new D],cartesian3Array:[new h],cartesian4Array:[new se],reset:function(){this.arrayIndex=0,this.cartesian2Index=0,this.cartesian3Index=0,this.cartesian4Index=0},getArray:function(){this.arrayIndex>=this.arrayArray.length&&this.arrayArray.push([]);let e=this.arrayArray[this.arrayIndex++];return e.length=0,e},getCartesian2:function(){return this.cartesian2Index>=this.cartesian2Array.length&&this.cartesian2Array.push(new D),this.cartesian2Array[this.cartesian2Index++]},getCartesian3:function(){return this.cartesian3Index>=this.cartesian3Array.length&&this.cartesian3Array.push(new h),this.cartesian3Array[this.cartesian3Index++]},getCartesian4:function(){return this.cartesian4Index>=this.cartesian4Array.length&&this.cartesian4Array.push(new se),this.cartesian4Array[this.cartesian4Index++]}};Mm.prototype.evaluate=function(e,t){vn.reset();let n=this._runtimeAst.evaluate(e);return t instanceof Y&&n instanceof se?Y.fromCartesian4(n,t):n instanceof D||n instanceof h||n instanceof se?n.clone(t):n};Mm.prototype.evaluateColor=function(e,t){vn.reset();let n=this._runtimeAst.evaluate(e);return Y.fromCartesian4(n,t)};Mm.prototype.getShaderFunction=function(e,t,n,i){let o=this.getShaderExpression(t,n);return o=`${i} ${e} { return ${o}; } `,o};Mm.prototype.getShaderExpression=function(e,t){return this._runtimeAst.getShaderExpression(e,t)};Mm.prototype.getVariables=function(){let e=[];return this._runtimeAst.getVariables(e),e=e.filter(function(t,n,i){return i.indexOf(t)===n}),e};var UNe=["!","-","+"],Oae=["+","-","*","/","%","===","!==",">",">=","<","<=","&&","||","!~","=~"],U5=/\${(.*?)}/g,DNe=/\\/g,BNe="@#%",YNe=/@#%/g,D5=new Y,B5={abs:ws(Math.abs),sqrt:ws(Math.sqrt),cos:ws(Math.cos),sin:ws(Math.sin),tan:ws(Math.tan),acos:ws(Math.acos),asin:ws(Math.asin),atan:ws(Math.atan),radians:ws(W.toRadians),degrees:ws(W.toDegrees),sign:ws(W.sign),floor:ws(Math.floor),ceil:ws(Math.ceil),round:ws(Math.round),exp:ws(Math.exp),exp2:ws(HNe),log:ws(Math.log),log2:ws(zNe),fract:ws(ONe),length:KNe,normalize:JNe},Y5={atan2:N5(Math.atan2,!1),pow:N5(Math.pow,!1),min:N5(Math.min,!0),max:N5(Math.max,!0),distance:QNe,dot:jNe,cross:qNe},Kz={clamp:Hae(W.clamp,!0),mix:Hae(W.lerp,!0)};function ONe(e){return e-Math.floor(e)}function HNe(e){return Math.pow(2,e)}function zNe(e){return W.log2(e)}function ws(e){return function(t,n){if(typeof n=="number")return e(n);if(n instanceof D)return D.fromElements(e(n.x),e(n.y),vn.getCartesian2());if(n instanceof h)return h.fromElements(e(n.x),e(n.y),e(n.z),vn.getCartesian3());if(n instanceof se)return se.fromElements(e(n.x),e(n.y),e(n.z),e(n.w),vn.getCartesian4());throw new ue(`Function "${t}" requires a vector or number argument. Argument is ${n}.`)}}function N5(e,t){return function(n,i,o){if(t&&typeof o=="number"){if(typeof i=="number")return e(i,o);if(i instanceof D)return D.fromElements(e(i.x,o),e(i.y,o),vn.getCartesian2());if(i instanceof h)return h.fromElements(e(i.x,o),e(i.y,o),e(i.z,o),vn.getCartesian3());if(i instanceof se)return se.fromElements(e(i.x,o),e(i.y,o),e(i.z,o),e(i.w,o),vn.getCartesian4())}if(typeof i=="number"&&typeof o=="number")return e(i,o);if(i instanceof D&&o instanceof D)return D.fromElements(e(i.x,o.x),e(i.y,o.y),vn.getCartesian2());if(i instanceof h&&o instanceof h)return h.fromElements(e(i.x,o.x),e(i.y,o.y),e(i.z,o.z),vn.getCartesian3());if(i instanceof se&&o instanceof se)return se.fromElements(e(i.x,o.x),e(i.y,o.y),e(i.z,o.z),e(i.w,o.w),vn.getCartesian4());throw new ue(`Function "${n}" requires vector or number arguments of matching types. Arguments are ${i} and ${o}.`)}}function Hae(e,t){return function(n,i,o,r){if(t&&typeof r=="number"){if(typeof i=="number"&&typeof o=="number")return e(i,o,r);if(i instanceof D&&o instanceof D)return D.fromElements(e(i.x,o.x,r),e(i.y,o.y,r),vn.getCartesian2());if(i instanceof h&&o instanceof h)return h.fromElements(e(i.x,o.x,r),e(i.y,o.y,r),e(i.z,o.z,r),vn.getCartesian3());if(i instanceof se&&o instanceof se)return se.fromElements(e(i.x,o.x,r),e(i.y,o.y,r),e(i.z,o.z,r),e(i.w,o.w,r),vn.getCartesian4())}if(typeof i=="number"&&typeof o=="number"&&typeof r=="number")return e(i,o,r);if(i instanceof D&&o instanceof D&&r instanceof D)return D.fromElements(e(i.x,o.x,r.x),e(i.y,o.y,r.y),vn.getCartesian2());if(i instanceof h&&o instanceof h&&r instanceof h)return h.fromElements(e(i.x,o.x,r.x),e(i.y,o.y,r.y),e(i.z,o.z,r.z),vn.getCartesian3());if(i instanceof se&&o instanceof se&&r instanceof se)return se.fromElements(e(i.x,o.x,r.x),e(i.y,o.y,r.y),e(i.z,o.z,r.z),e(i.w,o.w,r.w),vn.getCartesian4());throw new ue(`Function "${n}" requires vector or number arguments of matching types. Arguments are ${i}, ${o}, and ${r}.`)}}function KNe(e,t){if(typeof t=="number")return Math.abs(t);if(t instanceof D)return D.magnitude(t);if(t instanceof h)return h.magnitude(t);if(t instanceof se)return se.magnitude(t);throw new ue(`Function "${e}" requires a vector or number argument. Argument is ${t}.`)}function JNe(e,t){if(typeof t=="number")return 1;if(t instanceof D)return D.normalize(t,vn.getCartesian2());if(t instanceof h)return h.normalize(t,vn.getCartesian3());if(t instanceof se)return se.normalize(t,vn.getCartesian4());throw new ue(`Function "${e}" requires a vector or number argument. Argument is ${t}.`)}function QNe(e,t,n){if(typeof t=="number"&&typeof n=="number")return Math.abs(t-n);if(t instanceof D&&n instanceof D)return D.distance(t,n);if(t instanceof h&&n instanceof h)return h.distance(t,n);if(t instanceof se&&n instanceof se)return se.distance(t,n);throw new ue(`Function "${e}" requires vector or number arguments of matching types. Arguments are ${t} and ${n}.`)}function jNe(e,t,n){if(typeof t=="number"&&typeof n=="number")return t*n;if(t instanceof D&&n instanceof D)return D.dot(t,n);if(t instanceof h&&n instanceof h)return h.dot(t,n);if(t instanceof se&&n instanceof se)return se.dot(t,n);throw new ue(`Function "${e}" requires vector or number arguments of matching types. Arguments are ${t} and ${n}.`)}function qNe(e,t,n){if(t instanceof h&&n instanceof h)return h.cross(t,n,vn.getCartesian3());throw new ue(`Function "${e}" requires vec3 arguments. Arguments are ${t} and ${n}.`)}function _t(e,t,n,i,o){this._type=e,this._value=t,this._left=n,this._right=i,this._test=o,this.evaluate=void 0,u5e(this)}function $Ne(e,t){if(!l(t))return e;for(let n in t)if(t.hasOwnProperty(n)){let i=new RegExp(`\\$\\{${n}\\}`,"g"),o=`(${t[n]})`;l(o)&&(e=e.replace(i,o))}return e}function e5e(e){return e.replace(DNe,BNe)}function zz(e){return e.replace(YNe,"\\")}function t5e(e){let t=e,n="",i=t.indexOf("${");for(;i>=0;){let o=t.indexOf("'"),r=t.indexOf('"'),s;if(o>=0&&o=0&&r=0?new _t(gt.VARIABLE_IN_STRING,e.value):new _t(gt.LITERAL_STRING,zz(e.value))}function i5e(e,t){let n=t.arguments,i=n.length,o,r,s,a;if(t.callee.type==="MemberExpression"){o=t.callee.property.name;let c=t.callee.object;if(o==="test"||o==="exec"){if(!l(c.callee)||c.callee.name!=="regExp")throw new ue(`${o} is not a function.`);return i===0?o==="test"?new _t(gt.LITERAL_BOOLEAN,!1):new _t(gt.LITERAL_NULL,null):(s=xi(e,c),a=xi(e,n[0]),new _t(gt.FUNCTION_CALL,o,s,a))}else if(o==="toString")return r=xi(e,c),new _t(gt.FUNCTION_CALL,o,r);throw new ue(`Unexpected function call "${o}".`)}if(o=t.callee.name,o==="color"){if(i===0)return new _t(gt.LITERAL_COLOR,o);if(r=xi(e,n[0]),l(n[1])){let c=xi(e,n[1]);return new _t(gt.LITERAL_COLOR,o,[r,c])}return new _t(gt.LITERAL_COLOR,o,[r])}else if(o==="rgb"||o==="hsl"){if(i<3)throw new ue(`${o} requires three arguments.`);return r=[xi(e,n[0]),xi(e,n[1]),xi(e,n[2])],new _t(gt.LITERAL_COLOR,o,r)}else if(o==="rgba"||o==="hsla"){if(i<4)throw new ue(`${o} requires four arguments.`);return r=[xi(e,n[0]),xi(e,n[1]),xi(e,n[2]),xi(e,n[3])],new _t(gt.LITERAL_COLOR,o,r)}else if(o==="vec2"||o==="vec3"||o==="vec4"){r=new Array(i);for(let c=0;c1)throw new ue(`${o} requires exactly one argument.`);return r=xi(e,n[0]),new _t(gt.UNARY,o,r)}else if(o==="getExactClassName"){if(i>0)throw new ue(`${o} does not take any argument.`);return new _t(gt.UNARY,o)}else if(l(B5[o])){if(i!==1)throw new ue(`${o} requires exactly one argument.`);return r=xi(e,n[0]),new _t(gt.UNARY,o,r)}else if(l(Y5[o])){if(i!==2)throw new ue(`${o} requires exactly two arguments.`);return s=xi(e,n[0]),a=xi(e,n[1]),new _t(gt.BINARY,o,s,a)}else if(l(Kz[o])){if(i!==3)throw new ue(`${o} requires exactly three arguments.`);s=xi(e,n[0]),a=xi(e,n[1]);let c=xi(e,n[2]);return new _t(gt.TERNARY,o,s,a,c)}else{if(o==="Boolean")return i===0?new _t(gt.LITERAL_BOOLEAN,!1):(r=xi(e,n[0]),new _t(gt.UNARY,o,r));if(o==="Number")return i===0?new _t(gt.LITERAL_NUMBER,0):(r=xi(e,n[0]),new _t(gt.UNARY,o,r));if(o==="String")return i===0?new _t(gt.LITERAL_STRING,""):(r=xi(e,n[0]),new _t(gt.UNARY,o,r));if(o==="regExp")return o5e(e,t)}}throw new ue(`Unexpected function call "${o}".`)}function o5e(e,t){let n=t.arguments;if(n.length===0)return new _t(gt.LITERAL_REGEX,new RegExp);let i=xi(e,n[0]),o;if(n.length>1){let r=xi(e,n[1]);if(Hz(i)&&Hz(r)){try{o=new RegExp(zz(String(i._value)),r._value)}catch(s){throw new ue(s)}return new _t(gt.LITERAL_REGEX,o)}return new _t(gt.REGEX,i,r)}if(Hz(i)){try{o=new RegExp(zz(String(i._value)))}catch(r){throw new ue(r)}return new _t(gt.LITERAL_REGEX,o)}return new _t(gt.REGEX,i)}function r5e(e){if(l5e(e.name)){let t=d5e(e.name);return t.substr(0,8)==="tiles3d_"?new _t(gt.BUILTIN_VARIABLE,t):new _t(gt.VARIABLE,t)}else{if(e.name==="NaN")return new _t(gt.LITERAL_NUMBER,NaN);if(e.name==="Infinity")return new _t(gt.LITERAL_NUMBER,1/0);if(e.name==="undefined")return new _t(gt.LITERAL_UNDEFINED,void 0)}throw new ue(`${e.name} is not defined.`)}function s5e(e){let t=e.property.name;if(t==="PI")return new _t(gt.LITERAL_NUMBER,Math.PI);if(t==="E")return new _t(gt.LITERAL_NUMBER,Math.E)}function a5e(e){if(e.property.name==="POSITIVE_INFINITY")return new _t(gt.LITERAL_NUMBER,Number.POSITIVE_INFINITY)}function c5e(e,t){if(t.object.name==="Math")return s5e(t);if(t.object.name==="Number")return a5e(t);let n,i=xi(e,t.object);return t.computed?(n=xi(e,t.property),new _t(gt.MEMBER,"brackets",i,n)):(n=new _t(gt.LITERAL_STRING,t.property.name),new _t(gt.MEMBER,"dot",i,n))}function Hz(e){return e._type>=gt.LITERAL_NULL}function l5e(e){return e.substr(0,4)==="czm_"}function d5e(e){return e.substr(4)}function xi(e,t){let n,i,o,r;if(t.type==="Literal")n=n5e(t);else if(t.type==="CallExpression")n=i5e(e,t);else if(t.type==="Identifier")n=r5e(t);else if(t.type==="UnaryExpression"){i=t.operator;let s=xi(e,t.argument);if(UNe.indexOf(i)>-1)n=new _t(gt.UNARY,i,s);else throw new ue(`Unexpected operator "${i}".`)}else if(t.type==="BinaryExpression")if(i=t.operator,o=xi(e,t.left),r=xi(e,t.right),Oae.indexOf(i)>-1)n=new _t(gt.BINARY,i,o,r);else throw new ue(`Unexpected operator "${i}".`);else if(t.type==="LogicalExpression")i=t.operator,o=xi(e,t.left),r=xi(e,t.right),Oae.indexOf(i)>-1&&(n=new _t(gt.BINARY,i,o,r));else if(t.type==="ConditionalExpression"){let s=xi(e,t.test);o=xi(e,t.consequent),r=xi(e,t.alternate),n=new _t(gt.CONDITIONAL,"?",o,r,s)}else if(t.type==="MemberExpression")n=c5e(e,t);else if(t.type==="ArrayExpression"){let s=[];for(let a=0;a"?e.evaluate=e._evaluateGreaterThan:e._value===">="?e.evaluate=e._evaluateGreaterThanOrEquals:e._value==="&&"?e.evaluate=e._evaluateAnd:e._value==="||"?e.evaluate=e._evaluateOr:e._value==="=~"?e.evaluate=e._evaluateRegExpMatch:e._value==="!~"?e.evaluate=e._evaluateRegExpNotMatch:l(Y5[e._value])&&(e.evaluate=f5e(e._value)):e._type===gt.TERNARY?e.evaluate=p5e(e._value):e._type===gt.MEMBER?e._value==="brackets"?e.evaluate=e._evaluateMemberBrackets:e.evaluate=e._evaluateMemberDot:e._type===gt.ARRAY?e.evaluate=e._evaluateArray:e._type===gt.VARIABLE?e.evaluate=e._evaluateVariable:e._type===gt.VARIABLE_IN_STRING?e.evaluate=e._evaluateVariableString:e._type===gt.LITERAL_COLOR?e.evaluate=e._evaluateLiteralColor:e._type===gt.LITERAL_VECTOR?e.evaluate=e._evaluateLiteralVector:e._type===gt.LITERAL_STRING?e.evaluate=e._evaluateLiteralString:e._type===gt.REGEX?e.evaluate=e._evaluateRegExp:e._type===gt.BUILTIN_VARIABLE?e._value==="tiles3d_tileset_time"&&(e.evaluate=m5e):e.evaluate=e._evaluateLiteral}function m5e(e){return l(e)?e.content.tileset.timeSinceLoad:0}function h5e(e){let t=B5[e];return function(n){let i=this._left.evaluate(n);return t(e,i)}}function f5e(e){let t=Y5[e];return function(n){let i=this._left.evaluate(n),o=this._right.evaluate(n);return t(e,i,o)}}function p5e(e){let t=Kz[e];return function(n){let i=this._left.evaluate(n),o=this._right.evaluate(n),r=this._test.evaluate(n);return t(e,i,o,r)}}function O5(e,t){if(l(e))return e.getPropertyInherited(t)}_t.prototype._evaluateLiteral=function(){return this._value};_t.prototype._evaluateLiteralColor=function(e){let t=D5,n=this._left;if(this._value==="color")l(n)?n.length>1?(Y.fromCssColorString(n[0].evaluate(e),t),t.alpha=n[1].evaluate(e)):Y.fromCssColorString(n[0].evaluate(e),t):Y.fromBytes(255,255,255,255,t);else if(this._value==="rgb")Y.fromBytes(n[0].evaluate(e),n[1].evaluate(e),n[2].evaluate(e),255,t);else if(this._value==="rgba"){let i=n[3].evaluate(e)*255;Y.fromBytes(n[0].evaluate(e),n[1].evaluate(e),n[2].evaluate(e),i,t)}else this._value==="hsl"?Y.fromHsl(n[0].evaluate(e),n[1].evaluate(e),n[2].evaluate(e),1,t):this._value==="hsla"&&Y.fromHsl(n[0].evaluate(e),n[1].evaluate(e),n[2].evaluate(e),n[3].evaluate(e),t);return se.fromColor(t,vn.getCartesian4())};_t.prototype._evaluateLiteralVector=function(e){let t=vn.getArray(),n=this._value,i=this._left,o=i.length;for(let a=0;a1)throw new ue(`Invalid ${n} constructor. Not enough arguments.`);if(r>s&&o>1)throw new ue(`Invalid ${n} constructor. Too many arguments.`);if(r===1){let a=t[0];t.push(a,a,a)}if(n==="vec2")return D.fromArray(t,0,vn.getCartesian2());if(n==="vec3")return h.fromArray(t,0,vn.getCartesian3());if(n==="vec4")return se.fromArray(t,0,vn.getCartesian4())};_t.prototype._evaluateLiteralString=function(){return this._value};_t.prototype._evaluateVariableString=function(e){let t=this._value,n=U5.exec(t);for(;n!==null;){let i=n[0],o=n[1],r=O5(e,o);l(r)||(r=""),t=t.replace(i,r),n=U5.exec(t)}return t};_t.prototype._evaluateVariable=function(e){return O5(e,this._value)};function __(e){return e._value==="feature"}_t.prototype._evaluateMemberDot=function(e){if(__(this._left))return O5(e,this._right.evaluate(e));let t=this._left.evaluate(e);if(!l(t))return;let n=this._right.evaluate(e);if(t instanceof D||t instanceof h||t instanceof se){if(n==="r")return t.x;if(n==="g")return t.y;if(n==="b")return t.z;if(n==="a")return t.w}return t[n]};_t.prototype._evaluateMemberBrackets=function(e){if(__(this._left))return O5(e,this._right.evaluate(e));let t=this._left.evaluate(e);if(!l(t))return;let n=this._right.evaluate(e);if(t instanceof D||t instanceof h||t instanceof se){if(n===0||n==="r")return t.x;if(n===1||n==="g")return t.y;if(n===2||n==="b")return t.z;if(n===3||n==="a")return t.w}return t[n]};_t.prototype._evaluateArray=function(e){let t=[];for(let n=0;n" requires number arguments. Arguments are ${t} and ${n}.`);return t>n};_t.prototype._evaluateGreaterThanOrEquals=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);if(typeof t!="number"||typeof n!="number")throw new ue(`Operator ">=" requires number arguments. Arguments are ${t} and ${n}.`);return t>=n};_t.prototype._evaluateOr=function(e){let t=this._left.evaluate(e);if(typeof t!="boolean")throw new ue(`Operator "||" requires boolean arguments. First argument is ${t}.`);if(t)return!0;let n=this._right.evaluate(e);if(typeof n!="boolean")throw new ue(`Operator "||" requires boolean arguments. Second argument is ${n}.`);return t||n};_t.prototype._evaluateAnd=function(e){let t=this._left.evaluate(e);if(typeof t!="boolean")throw new ue(`Operator "&&" requires boolean arguments. First argument is ${t}.`);if(!t)return!1;let n=this._right.evaluate(e);if(typeof n!="boolean")throw new ue(`Operator "&&" requires boolean arguments. Second argument is ${n}.`);return t&&n};_t.prototype._evaluatePlus=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);if(n instanceof D&&t instanceof D)return D.add(t,n,vn.getCartesian2());if(n instanceof h&&t instanceof h)return h.add(t,n,vn.getCartesian3());if(n instanceof se&&t instanceof se)return se.add(t,n,vn.getCartesian4());if(typeof t=="string"||typeof n=="string")return t+n;if(typeof t=="number"&&typeof n=="number")return t+n;throw new ue(`Operator "+" requires vector or number arguments of matching types, or at least one string argument. Arguments are ${t} and ${n}.`)};_t.prototype._evaluateMinus=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);if(n instanceof D&&t instanceof D)return D.subtract(t,n,vn.getCartesian2());if(n instanceof h&&t instanceof h)return h.subtract(t,n,vn.getCartesian3());if(n instanceof se&&t instanceof se)return se.subtract(t,n,vn.getCartesian4());if(typeof t=="number"&&typeof n=="number")return t-n;throw new ue(`Operator "-" requires vector or number arguments of matching types. Arguments are ${t} and ${n}.`)};_t.prototype._evaluateTimes=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);if(n instanceof D&&t instanceof D)return D.multiplyComponents(t,n,vn.getCartesian2());if(n instanceof D&&typeof t=="number")return D.multiplyByScalar(n,t,vn.getCartesian2());if(t instanceof D&&typeof n=="number")return D.multiplyByScalar(t,n,vn.getCartesian2());if(n instanceof h&&t instanceof h)return h.multiplyComponents(t,n,vn.getCartesian3());if(n instanceof h&&typeof t=="number")return h.multiplyByScalar(n,t,vn.getCartesian3());if(t instanceof h&&typeof n=="number")return h.multiplyByScalar(t,n,vn.getCartesian3());if(n instanceof se&&t instanceof se)return se.multiplyComponents(t,n,vn.getCartesian4());if(n instanceof se&&typeof t=="number")return se.multiplyByScalar(n,t,vn.getCartesian4());if(t instanceof se&&typeof n=="number")return se.multiplyByScalar(t,n,vn.getCartesian4());if(typeof t=="number"&&typeof n=="number")return t*n;throw new ue(`Operator "*" requires vector or number arguments. If both arguments are vectors they must be matching types. Arguments are ${t} and ${n}.`)};_t.prototype._evaluateDivide=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);if(n instanceof D&&t instanceof D)return D.divideComponents(t,n,vn.getCartesian2());if(t instanceof D&&typeof n=="number")return D.divideByScalar(t,n,vn.getCartesian2());if(n instanceof h&&t instanceof h)return h.divideComponents(t,n,vn.getCartesian3());if(t instanceof h&&typeof n=="number")return h.divideByScalar(t,n,vn.getCartesian3());if(n instanceof se&&t instanceof se)return se.divideComponents(t,n,vn.getCartesian4());if(t instanceof se&&typeof n=="number")return se.divideByScalar(t,n,vn.getCartesian4());if(typeof t=="number"&&typeof n=="number")return t/n;throw new ue(`Operator "/" requires vector or number arguments of matching types, or a number as the second argument. Arguments are ${t} and ${n}.`)};_t.prototype._evaluateMod=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);if(n instanceof D&&t instanceof D)return D.fromElements(t.x%n.x,t.y%n.y,vn.getCartesian2());if(n instanceof h&&t instanceof h)return h.fromElements(t.x%n.x,t.y%n.y,t.z%n.z,vn.getCartesian3());if(n instanceof se&&t instanceof se)return se.fromElements(t.x%n.x,t.y%n.y,t.z%n.z,t.w%n.w,vn.getCartesian4());if(typeof t=="number"&&typeof n=="number")return t%n;throw new ue(`Operator "%" requires vector or number arguments of matching types. Arguments are ${t} and ${n}.`)};_t.prototype._evaluateEqualsStrict=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);return n instanceof D&&t instanceof D||n instanceof h&&t instanceof h||n instanceof se&&t instanceof se?t.equals(n):t===n};_t.prototype._evaluateNotEqualsStrict=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);return n instanceof D&&t instanceof D||n instanceof h&&t instanceof h||n instanceof se&&t instanceof se?!t.equals(n):t!==n};_t.prototype._evaluateConditional=function(e){let t=this._test.evaluate(e);if(typeof t!="boolean")throw new ue(`Conditional argument of conditional expression must be a boolean. Argument is ${t}.`);return t?this._left.evaluate(e):this._right.evaluate(e)};_t.prototype._evaluateNaN=function(e){return isNaN(this._left.evaluate(e))};_t.prototype._evaluateIsFinite=function(e){return isFinite(this._left.evaluate(e))};_t.prototype._evaluateIsExactClass=function(e){return l(e)?e.isExactClass(this._left.evaluate(e)):!1};_t.prototype._evaluateIsClass=function(e){return l(e)?e.isClass(this._left.evaluate(e)):!1};_t.prototype._evaluateGetExactClassName=function(e){if(l(e))return e.getExactClassName()};_t.prototype._evaluateBooleanConversion=function(e){return!!this._left.evaluate(e)};_t.prototype._evaluateNumberConversion=function(e){return Number(this._left.evaluate(e))};_t.prototype._evaluateStringConversion=function(e){return String(this._left.evaluate(e))};_t.prototype._evaluateRegExp=function(e){let t=this._value.evaluate(e),n="";l(this._left)&&(n=this._left.evaluate(e));let i;try{i=new RegExp(t,n)}catch(o){throw new ue(o)}return i};_t.prototype._evaluateRegExpTest=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);if(!(t instanceof RegExp&&typeof n=="string"))throw new ue(`RegExp.test requires the first argument to be a RegExp and the second argument to be a string. Arguments are ${t} and ${n}.`);return t.test(n)};_t.prototype._evaluateRegExpMatch=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);if(t instanceof RegExp&&typeof n=="string")return t.test(n);if(n instanceof RegExp&&typeof t=="string")return n.test(t);throw new ue(`Operator "=~" requires one RegExp argument and one string argument. Arguments are ${t} and ${n}.`)};_t.prototype._evaluateRegExpNotMatch=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);if(t instanceof RegExp&&typeof n=="string")return!t.test(n);if(n instanceof RegExp&&typeof t=="string")return!n.test(t);throw new ue(`Operator "!~" requires one RegExp argument and one string argument. Arguments are ${t} and ${n}.`)};_t.prototype._evaluateRegExpExec=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);if(!(t instanceof RegExp&&typeof n=="string"))throw new ue(`RegExp.exec requires the first argument to be a RegExp and the second argument to be a string. Arguments are ${t} and ${n}.`);let i=t.exec(n);return l(i)?i[1]:null};_t.prototype._evaluateToString=function(e){let t=this._left.evaluate(e);if(t instanceof RegExp||t instanceof D||t instanceof h||t instanceof se)return String(t);throw new ue(`Unexpected function call "${this._value}".`)};function zae(e){let t=e._left,n=t.length;for(let a=0;a1){let p=d[0],g=d[1];return g!=="1.0"&&(t.translucent=!0),`vec4(${p}, ${g})`}}else return"vec4(1.0)";return`vec4(${d[0]}, 1.0)`}else{if(c==="rgb")return i=Kae(this),l(i)?k5(i):`vec4(${d[0]} / 255.0, ${d[1]} / 255.0, ${d[2]} / 255.0, 1.0)`;if(c==="rgba")return d[3]!=="1.0"&&(t.translucent=!0),i=Kae(this),l(i)?k5(i):`vec4(${d[0]} / 255.0, ${d[1]} / 255.0, ${d[2]} / 255.0, ${d[3]})`;if(c==="hsl")return i=zae(this),l(i)?k5(i):`vec4(czm_HSLToRGB(vec3(${d[0]}, ${d[1]}, ${d[2]})), 1.0)`;if(c==="hsla")return i=zae(this),l(i)?(i.alpha!==1&&(t.translucent=!0),k5(i)):(d[3]!=="1.0"&&(t.translucent=!0),`vec4(czm_HSLToRGB(vec3(${d[0]}, ${d[1]}, ${d[2]})), ${d[3]})`)}break;case gt.LITERAL_VECTOR:u=o.length,m=`${c}(`;for(let p=0;p0;){let u=t.pop();if(Y.equals(u.color,a.color))d=Jz(n,s,d,i,o,u.batchIds,r),a.batchIds=a.batchIds.concat(u.batchIds),a.count=d-a.offset;else{let m=d;d=Jz(n,s,d,i,o,u.batchIds,r),u.offset=m,u.count=d-m,c.push(u),a=u}}e._va.indexBuffer.copyFromArrayView(s),e._indices=s,e._batchedIndices=c}function Qz(e,t,n,i,o,r,s){let a=e.bytesPerIndex,c=r.length;for(let d=0;d0;){let m=t.pop();if(Y.equals(m.color,r.color))d=Qz(a,c,d,n,i,m.batchIds,o),r.batchIds=r.batchIds.concat(m.batchIds),r.count=d-r.offset;else{let p=d;d=Qz(a,c,d,n,i,m.batchIds,o),m.offset=p,m.count=d-p,s.push(m),r=m}}let u=e._va;e._va=e._vaSwap,e._vaSwap=u,e._batchedIndices=s}function R5e(e,t){return t.color.toRgba()-e.color.toRgba()}function Z5e(e,t){if(!e._batchDirty)return!1;let n=e._batchedIndices,i=n.length,o=!1,r={};for(let s=0;s=x&&s{e.isDestroyed()||(e._error=f)}):void 0}}function B5e(e){l(e._primitive)||(e._primitive=new S_({batchTable:e._batchTable,positions:e._positions,batchIds:e._batchIds,vertexBatchIds:e._vertexBatchIds,indices:e._indices,indexOffsets:e._indexOffsets,indexCounts:e._indexCounts,batchedIndices:e._batchedIndices,boundingVolume:e._boundingVolume,boundingVolumes:e._boundingVolumes,center:e._center,pickObject:y(e._pickObject,e)}),e._boxes=void 0,e._boxBatchIds=void 0,e._cylinders=void 0,e._cylinderBatchIds=void 0,e._ellipsoids=void 0,e._ellipsoidBatchIds=void 0,e._spheres=void 0,e._sphereBatchIds=void 0,e._center=void 0,e._modelMatrix=void 0,e._batchTable=void 0,e._boundingVolume=void 0,e._boundingVolumes=void 0,e._batchedIndices=void 0,e._indices=void 0,e._indexOffsets=void 0,e._indexCounts=void 0,e._positions=void 0,e._vertexBatchIds=void 0,e._batchIds=void 0,e._batchTableColors=void 0,e._packedBuffer=void 0,e._verticesPromise=void 0)}Td.prototype.createFeatures=function(e,t){this._primitive.createFeatures(e,t)};Td.prototype.applyDebugSettings=function(e,t){this._primitive.applyDebugSettings(e,t)};Td.prototype.applyStyle=function(e,t){this._primitive.applyStyle(e,t)};Td.prototype.updateCommands=function(e,t){this._primitive.updateCommands(e,t)};Td.prototype.update=function(e){if(!this._ready){if(l(this._promise)||(this._promise=D5e(this)),l(this._error)){let t=this._error;throw this._error=void 0,t}return}this._primitive.debugWireframe=this.debugWireframe,this._primitive.forceRebatch=this.forceRebatch,this._primitive.classificationType=this.classificationType,this._primitive.update(e)};Td.prototype.isDestroyed=function(){return!1};Td.prototype.destroy=function(){return this._primitive=this._primitive&&this._primitive.destroy(),me(this)};var $p=Td;function mf(e,t,n,i,o){this._tileset=e,this._tile=t,this._resource=n,this._geometries=void 0,this._metadata=void 0,this._batchTable=void 0,this._features=void 0,this.featurePropertiesDirty=!1,this._group=void 0,this._ready=!1,H5e(this,i,o)}Object.defineProperties(mf.prototype,{featuresLength:{get:function(){return l(this._batchTable)?this._batchTable.featuresLength:0}},pointsLength:{get:function(){return 0}},trianglesLength:{get:function(){return l(this._geometries)?this._geometries.trianglesLength:0}},geometryByteLength:{get:function(){return l(this._geometries)?this._geometries.geometryByteLength:0}},texturesByteLength:{get:function(){return 0}},batchTableByteLength:{get:function(){return l(this._batchTable)?this._batchTable.batchTableByteLength:0}},innerContents:{get:function(){}},ready:{get:function(){return this._ready}},tileset:{get:function(){return this._tileset}},tile:{get:function(){return this._tile}},url:{get:function(){return this._resource.getUrlComponent(!0)}},metadata:{get:function(){return this._metadata},set:function(e){this._metadata=e}},batchTable:{get:function(){return this._batchTable}},group:{get:function(){return this._group},set:function(e){this._group=e}}});function Y5e(e){return function(t,n){l(e._geometries)&&e._geometries.updateCommands(t,n)}}function O5e(e,t){let n,i,o,r,s,a=y(e.BOXES_LENGTH,0),c=y(e.CYLINDERS_LENGTH,0),d=y(e.ELLIPSOIDS_LENGTH,0),u=y(e.SPHERES_LENGTH,0);if(a>0&&l(e.BOX_BATCH_IDS)){let f=t.byteOffset+e.BOX_BATCH_IDS.byteOffset;n=new Uint16Array(t.buffer,f,a)}if(c>0&&l(e.CYLINDER_BATCH_IDS)){let f=t.byteOffset+e.CYLINDER_BATCH_IDS.byteOffset;i=new Uint16Array(t.buffer,f,c)}if(d>0&&l(e.ELLIPSOID_BATCH_IDS)){let f=t.byteOffset+e.ELLIPSOID_BATCH_IDS.byteOffset;o=new Uint16Array(t.buffer,f,d)}if(u>0&&l(e.SPHERE_BATCH_IDS)){let f=t.byteOffset+e.SPHERE_BATCH_IDS.byteOffset;r=new Uint16Array(t.buffer,f,u)}let m=l(n)||l(i)||l(o)||l(r),p=a>0&&!l(n)||c>0&&!l(i)||d>0&&!l(o)||u>0&&!l(r);if(m&&p)throw new ue("If one group of batch ids is defined, then all batch ids must be defined");if(!l(n)&&!l(i)&&!l(o)&&!l(r)){let f=0;if(!l(n)&&a>0)for(n=new Uint16Array(a),s=0;s0)for(i=new Uint16Array(c),s=0;s0)for(o=new Uint16Array(d),s=0;s0)for(r=new Uint16Array(u),s=0;s0&&(g=Zo(i,n,d),n+=d,u>0&&(f=new Uint8Array(t,n,u),f=new Uint8Array(f)));let x=y(m.BOXES_LENGTH,0),_=y(m.CYLINDERS_LENGTH,0),C=y(m.ELLIPSOIDS_LENGTH,0),V=y(m.SPHERES_LENGTH,0),L=x+_+C+V,Z=new jp(e,L,g,f,Y5e(e));if(e._batchTable=Z,L===0)return;let G=e.tile.computedTransform,X;l(m.RTC_CENTER)&&(X=h.unpack(m.RTC_CENTER),M.multiplyByPoint(G,X,X));let v=O5e(m,p);if(x>0||_>0||C>0||V>0){let P,F,A,b;if(x>0){let R=p.byteOffset+m.BOXES.byteOffset;P=new Float32Array(p.buffer,R,$p.packedBoxLength*x)}if(_>0){let R=p.byteOffset+m.CYLINDERS.byteOffset;F=new Float32Array(p.buffer,R,$p.packedCylinderLength*_)}if(C>0){let R=p.byteOffset+m.ELLIPSOIDS.byteOffset;A=new Float32Array(p.buffer,R,$p.packedEllipsoidLength*C)}if(V>0){let R=p.byteOffset+m.SPHERES.byteOffset;b=new Float32Array(p.buffer,R,$p.packedSphereLength*V)}return e._geometries=new $p({boxes:P,boxBatchIds:v.boxes,cylinders:F,cylinderBatchIds:v.cylinders,ellipsoids:A,ellipsoidBatchIds:v.ellipsoids,spheres:b,sphereBatchIds:v.spheres,center:X,modelMatrix:G,batchTable:Z,boundingVolume:e.tile.boundingVolume.boundingVolume}),e}return Promise.resolve(e)}function ece(e){let t=e.featuresLength;if(!l(e._features)&&t>0){let n=new Array(t);l(e._geometries)&&e._geometries.createFeatures(e,n),e._features=n}}mf.prototype.hasProperty=function(e,t){return this._batchTable.hasProperty(e,t)};mf.prototype.getFeature=function(e){return ece(this),this._features[e]};mf.prototype.applyDebugSettings=function(e,t){l(this._geometries)&&this._geometries.applyDebugSettings(e,t)};mf.prototype.applyStyle=function(e){ece(this),l(this._geometries)&&this._geometries.applyStyle(e,this._features)};mf.prototype.update=function(e,t){l(this._geometries)&&(this._geometries.classificationType=this._tileset.classificationType,this._geometries.debugWireframe=this._tileset.debugWireframe,this._geometries.update(t)),l(this._batchTable)&&this._geometries.ready&&(this._batchTable.update(e,t),this._ready=!0)};mf.prototype.pick=function(e,t,n){};mf.prototype.isDestroyed=function(){return!1};mf.prototype.destroy=function(){return this._geometries=this._geometries&&this._geometries.destroy(),this._batchTable=this._batchTable&&this._batchTable.destroy(),me(this)};var fI=mf;var lEn=T(S(),1);var UGn=T(S(),1);var QTn=T(S(),1);function z5e(e,t){return l(e)&&l(e.extensions)&&l(e.extensions[t])}var ri=z5e;var tSn=T(S(),1);function jz(e){let t=e.lengthBits,n=e.availableCount,i=e.constant,o=e.bitstream;if(l(i))n=t;else{let r=Math.ceil(t/8);if(o.length!==r)throw new ue(`Availability bitstream must be exactly ${r} bytes long to store ${t} bits. Actual bitstream was ${o.length} bytes long.`);let s=y(e.computeAvailableCountEnabled,!1);!l(n)&&s&&(n=K5e(o,t))}this._lengthBits=t,this._availableCount=n,this._constant=i,this._bitstream=o}function K5e(e,t){let n=0;for(let i=0;i>3,r=i%8;n+=e[o]>>r&1}return n}Object.defineProperties(jz.prototype,{lengthBits:{get:function(){return this._lengthBits}},availableCount:{get:function(){return this._availableCount}}});jz.prototype.getBit=function(e){if(l(this._constant))return this._constant;let t=e>>3,n=e%8;return(this._bitstream[t]>>n&1)===1};var JC=jz;var oSn=T(S(),1);function e0(e){e=y(e,y.EMPTY_OBJECT);let t=e.metadataTable,n=e.class,i=e.entityId,o=e.propertyTableJson;this._class=n,this._metadataTable=t,this._entityId=i,this._extensions=o.extensions,this._extras=o.extras}Object.defineProperties(e0.prototype,{class:{get:function(){return this._class}},extras:{get:function(){return this._extras}},extensions:{get:function(){return this._extensions}}});e0.prototype.hasProperty=function(e){return this._metadataTable.hasProperty(e)};e0.prototype.hasPropertyBySemantic=function(e){return this._metadataTable.hasPropertyBySemantic(e)};e0.prototype.getPropertyIds=function(e){return this._metadataTable.getPropertyIds(e)};e0.prototype.getProperty=function(e){return this._metadataTable.getProperty(this._entityId,e)};e0.prototype.setProperty=function(e,t){return this._metadataTable.setProperty(this._entityId,e,t)};e0.prototype.getPropertyBySemantic=function(e){return this._metadataTable.getPropertyBySemantic(this._entityId,e)};e0.prototype.setPropertyBySemantic=function(e,t){return this._metadataTable.setPropertyBySemantic(this._entityId,e,t)};var QC=e0;var sSn=T(S(),1);var H5={QUADTREE:"QUADTREE",OCTREE:"OCTREE"};H5.getBranchingFactor=function(e){switch(e){case H5.OCTREE:return 8;case H5.QUADTREE:return 4}};var Hr=Object.freeze(H5);var bSn=T(S(),1);var uSn=T(S(),1);function ta(){}Object.defineProperties(ta.prototype,{class:{get:function(){fe.throwInstantiationError()}}});ta.prototype.hasProperty=function(e){fe.throwInstantiationError()};ta.prototype.hasPropertyBySemantic=function(e){fe.throwInstantiationError()};ta.prototype.getPropertyIds=function(e){fe.throwInstantiationError()};ta.prototype.getProperty=function(e){fe.throwInstantiationError()};ta.prototype.setProperty=function(e,t){fe.throwInstantiationError()};ta.prototype.getPropertyBySemantic=function(e){fe.throwInstantiationError()};ta.prototype.setPropertyBySemantic=function(e,t){fe.throwInstantiationError()};ta.hasProperty=function(e,t,n){if(l(t[e]))return!0;let i=n.properties;if(!l(i))return!1;let o=i[e];return!!(l(o)&&l(o.default))};ta.hasPropertyBySemantic=function(e,t,n){let i=n.propertiesBySemantic;if(!l(i))return!1;let o=i[e];return l(o)};ta.getPropertyIds=function(e,t,n){n=l(n)?n:[],n.length=0;for(let o in e)e.hasOwnProperty(o)&&l(e[o])&&n.push(o);let i=t.properties;if(l(i))for(let o in i)i.hasOwnProperty(o)&&!l(e[o])&&l(i[o].default)&&n.push(o);return n};ta.getProperty=function(e,t,n){let i=n.properties[e],o=t[e];Array.isArray(o)&&(o=o.slice());let r=!0;if(o=i.handleNoData(o),!l(o)&&l(i.default))return o=Oe(i.default,!0),i.unpackVectorAndMatrixTypes(o,r);if(l(o))return o=i.normalize(o),o=i.applyValueTransform(o),i.unpackVectorAndMatrixTypes(o,r)};ta.setProperty=function(e,t,n,i){if(!l(n[e]))return!1;Array.isArray(t)&&(t=t.slice());let o,r=i.properties;return l(r)&&(o=r[e]),l(o)&&(t=o.packVectorAndMatrixTypes(t,!0),t=o.unapplyValueTransform(t),t=o.unnormalize(t)),n[e]=t,!0};ta.getPropertyBySemantic=function(e,t,n){let i=n.propertiesBySemantic;if(!l(i))return;let o=i[e];if(l(o))return ta.getProperty(o.id,t,n)};ta.setPropertyBySemantic=function(e,t,n,i){let o=i.propertiesBySemantic;if(!l(o))return!1;let r=i.propertiesBySemantic[e];return l(r)?ta.setProperty(r.id,t,n,i):!1};var Mn=ta;function t0(e){e=y(e,y.EMPTY_OBJECT);let t=e.subtreeMetadata,n=e.class,i=l(t.properties)?t.properties:{};this._class=n,this._properties=i,this._extras=t.extras,this._extensions=t.extensions}Object.defineProperties(t0.prototype,{class:{get:function(){return this._class}},extras:{get:function(){return this._extras}},extensions:{get:function(){return this._extensions}}});t0.prototype.hasProperty=function(e){return Mn.hasProperty(e,this._properties,this._class)};t0.prototype.hasPropertyBySemantic=function(e){return Mn.hasPropertyBySemantic(e,this._properties,this._class)};t0.prototype.getPropertyIds=function(e){return Mn.getPropertyIds(this._properties,this._class,e)};t0.prototype.getProperty=function(e){return Mn.getProperty(e,this._properties,this._class)};t0.prototype.setProperty=function(e,t){return Mn.setProperty(e,t,this._properties,this._class)};t0.prototype.getPropertyBySemantic=function(e){return Mn.getPropertyBySemantic(e,this._properties,this._class)};t0.prototype.setPropertyBySemantic=function(e,t){return Mn.setPropertyBySemantic(e,t,this._properties,this._class)};var pI=t0;var aCn=T(S(),1);var eCn=T(S(),1);var TSn=T(S(),1);var vt={INT8:"INT8",UINT8:"UINT8",INT16:"INT16",UINT16:"UINT16",INT32:"INT32",UINT32:"UINT32",INT64:"INT64",UINT64:"UINT64",FLOAT32:"FLOAT32",FLOAT64:"FLOAT64"};vt.getMinimum=function(e){switch(e){case vt.INT8:return-128;case vt.UINT8:return 0;case vt.INT16:return-32768;case vt.UINT16:return 0;case vt.INT32:return-2147483648;case vt.UINT32:return 0;case vt.INT64:return Yt.supportsBigInt()?BigInt("-9223372036854775808"):-Math.pow(2,63);case vt.UINT64:return Yt.supportsBigInt()?BigInt(0):0;case vt.FLOAT32:return-34028234663852886e22;case vt.FLOAT64:return-Number.MAX_VALUE}};vt.getMaximum=function(e){switch(e){case vt.INT8:return 127;case vt.UINT8:return 255;case vt.INT16:return 32767;case vt.UINT16:return 65535;case vt.INT32:return 2147483647;case vt.UINT32:return 4294967295;case vt.INT64:return Yt.supportsBigInt()?BigInt("9223372036854775807"):Math.pow(2,63)-1;case vt.UINT64:return Yt.supportsBigInt()?BigInt("18446744073709551615"):Math.pow(2,64)-1;case vt.FLOAT32:return 34028234663852886e22;case vt.FLOAT64:return Number.MAX_VALUE}};vt.isIntegerType=function(e){switch(e){case vt.INT8:case vt.UINT8:case vt.INT16:case vt.UINT16:case vt.INT32:case vt.UINT32:case vt.INT64:case vt.UINT64:return!0;default:return!1}};vt.isUnsignedIntegerType=function(e){switch(e){case vt.UINT8:case vt.UINT16:case vt.UINT32:case vt.UINT64:return!0;default:return!1}};vt.isVectorCompatible=function(e){switch(e){case vt.INT8:case vt.UINT8:case vt.INT16:case vt.UINT16:case vt.INT32:case vt.UINT32:case vt.FLOAT32:case vt.FLOAT64:return!0;default:return!1}};vt.normalize=function(e,t){return Math.max(Number(e)/Number(vt.getMaximum(t)),-1)};vt.unnormalize=function(e,t){let n=vt.getMaximum(t),i=vt.isUnsignedIntegerType(t)?0:-n;return e=W.sign(e)*Math.round(Math.abs(e)*Number(n)),(t===vt.INT64||t===vt.UINT64)&&Yt.supportsBigInt()&&(e=BigInt(e)),e>n?n:e1;if(!n&&o===1)return e;if(!n)return new Array(o).fill(e);if(!r)return new Array(i).fill(e);if(!t)return new Array(this._arrayLength*o).fill(e);let s=new Array(o).fill(e);return new Array(this._arrayLength).fill(s)};Za.prototype.handleNoData=function(e){let t=this._noData;if(!l(t))return e;if(!oce(e,t))return e};function oce(e,t){if(!Array.isArray(e))return e===t;if(!Array.isArray(t)||e.length!==t.length)return!1;for(let n=0;n1;return l(n)?t&&r?e.map(function(s){return n.unpack(s)}):i?n.unpackArray(e):n.unpack(e):e};Za.prototype.packVectorAndMatrixTypes=function(e,t){t=y(t,!1);let n=zt.getMathType(this._type),i=this._isArray,o=zt.getComponentCount(this._type),r=i&&o>1;return l(n)?t&&r?e.map(function(s){return n.pack(s,[])}):i?n.packArray(e,[]):n.pack(e,[]):e};Za.prototype.validate=function(e){if(!(!l(e)&&l(this._default)))return this._required&&!l(e)?"required property must have a value":this._isArray?j5e(this,e):rce(this,e)};function j5e(e,t){if(!Array.isArray(t))return`value ${t} must be an array`;let n=t.length;if(!e._isVariableLengthArray&&n!==e._arrayLength)return"Array length does not match property.arrayLength";for(let i=0;i1?tce(e,t,n):void 0}if(ean.getMaximum(t))return tce(e,t,n)}function ice(e,t){return`value ${e} of type ${t} must be finite`}function qz(e,t,n){if(!Array.isArray(e))return n(e,t);for(let i=0;i>3,i=e%8;return(t.typedArray[n]>>i&1)===1}function cke(e,t,n){let i=e>>3,o=e%8;n?t.typedArray[i]|=1<0,s=!0;for(let a=0;a<8;++a){let c=n.getUint8(i+a);r&&(s?c!==0&&(c=~(c-1)&255,s=!1):c=~c&255),o+=c*Math.pow(256,a)}return r&&(o=-o),o}function dke(e,t){let n=t.dataView,i=e*8,o=BigInt(0),r=(n.getUint8(i+7)&128)>0,s=!0;for(let a=0;a<8;++a){let c=n.getUint8(i+a);r&&(s?c!==0&&(c=~(c-1)&255,s=!1):c=~c&255),o+=BigInt(c)*(BigInt(1)<96?_-97:_>64?_-39:_+4}for(var C=0,x=0;x=3),c(n.exports.meshopt_spatialSortRemap,g,g.length/f,f*4)},encodeVertexBuffer:function(g,f,x){r(x>0&&x<=256),r(x%4==0);var _=n.exports.meshopt_encodeVertexBufferBound(f,x);return d(n.exports.meshopt_encodeVertexBuffer,_,g,f,x)},encodeIndexBuffer:function(g,f,x){r(x==2||x==4),r(f%3==0);var _=m(g,x),C=n.exports.meshopt_encodeIndexBufferBound(f,u(_)+1);return d(n.exports.meshopt_encodeIndexBuffer,C,_,f,4)},encodeIndexSequence:function(g,f,x){r(x==2||x==4);var _=m(g,x),C=n.exports.meshopt_encodeIndexSequenceBound(f,u(_)+1);return d(n.exports.meshopt_encodeIndexSequence,C,_,f,4)},encodeGltfBuffer:function(g,f,x,_){var C={ATTRIBUTES:this.encodeVertexBuffer,TRIANGLES:this.encodeIndexBuffer,INDICES:this.encodeIndexSequence};return r(C[_]),C[_](g,f,x)},encodeFilterOct:function(g,f,x,_){return r(x==4||x==8),r(_>=1&&_<=16),p(n.exports.meshopt_encodeFilterOct,g,f,x,_,16)},encodeFilterQuat:function(g,f,x,_){return r(x==8),r(_>=4&&_<=16),p(n.exports.meshopt_encodeFilterQuat,g,f,x,_,16)},encodeFilterExp:function(g,f,x,_,C){r(x>0&&x%4==0),r(_>=1&&_<=24);var V={Separate:0,SharedVector:1,SharedComponent:2};return p(n.exports.meshopt_encodeFilterExp,g,f,x,_,x,C?V[C]:1)}}}();var RCn=T(S()),dce=function(){var e="b9H79Tebbbe8Fv9Gbb9Gvuuuuueu9Giuuub9Geueu9Giuuueuikqbeeedddillviebeoweuec:q;iekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbeY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVbdE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbiL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtblK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbol79IV9Rbrq;d8Yqdbk:yzeHu8Jjjjjbcj;eb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Radz1jjjbhwcj;abad9UhlaicefhodnadTmbalc;WFbGglcjdalcjd6EhDcbhqinaqae9pmeaDaeaq9RaqaDfae6Egkcsfglcl4cifcd4hxdndndndnalc9WGgmTmbcbhPcehsawcjdfhzaohHinaraH9Rax6midnaraHaxfgo9RcK6mbczhlcbhOinalgic9WfgAawcj;cbffhldndndndndnaHaAco4fRbbaOcoG4ciGPlbedibkal9cb83ibalcwf9cb83ibxikalaoRblaoRbbgAco4gCaCciSgCE86bbawcj;cbfaifglcGfaoclfaCfgCRbbaAcl4ciGgXaXciSgXE86bbalcVfaCaXfgCRbbaAcd4ciGgXaXciSgXE86bbalc7faCaXfgCRbbaAciGgAaAciSgAE86bbalctfaCaAfgCRbbaoRbegAco4gXaXciSgXE86bbalc91faCaXfgCRbbaAcl4ciGgXaXciSgXE86bbalc4faCaXfgCRbbaAcd4ciGgXaXciSgXE86bbalc93faCaXfgCRbbaAciGgAaAciSgAE86bbalc94faCaAfgCRbbaoRbdgAco4gXaXciSgXE86bbalc95faCaXfgCRbbaAcl4ciGgXaXciSgXE86bbalc96faCaXfgCRbbaAcd4ciGgXaXciSgXE86bbalc97faCaXfgCRbbaAciGgAaAciSgAE86bbalc98faCaAfgARbbaoRbigoco4gCaCciSgCE86bbalc99faAaCfgARbbaocl4ciGgCaCciSgCE86bbalc9:faAaCfgARbbaocd4ciGgCaCciSgCE86bbalcufaAaCfglRbbaociGgoaociSgoE86bbalaofhoxdkalaoRbwaoRbbgAcl4gCaCcsSgCE86bbawcj;cbfaifglcGfaocwfaCfgCRbbaAcsGgAaAcsSgAE86bbalcVfaCaAfgARbbaoRbegCcl4gXaXcsSgXE86bbalc7faAaXfgARbbaCcsGgCaCcsSgCE86bbalctfaAaCfgARbbaoRbdgCcl4gXaXcsSgXE86bbalc91faAaXfgARbbaCcsGgCaCcsSgCE86bbalc4faAaCfgARbbaoRbigCcl4gXaXcsSgXE86bbalc93faAaXfgARbbaCcsGgCaCcsSgCE86bbalc94faAaCfgARbbaoRblgCcl4gXaXcsSgXE86bbalc95faAaXfgARbbaCcsGgCaCcsSgCE86bbalc96faAaCfgARbbaoRbvgCcl4gXaXcsSgXE86bbalc97faAaXfgARbbaCcsGgCaCcsSgCE86bbalc98faAaCfgARbbaoRbogCcl4gXaXcsSgXE86bbalc99faAaXfgARbbaCcsGgCaCcsSgCE86bbalc9:faAaCfgARbbaoRbrgocl4gCaCcsSgCE86bbalcufaAaCfglRbbaocsGgoaocsSgoE86bbalaofhoxekalao8Pbb83bbalcwfaocwf8Pbb83bbaoczfhokdnaiam9pmbaOcdfhOaiczfhlarao9RcL0mekkaiam6miaoTmidnakTmbawaPfRbbhOawcj;cbfhlazhiakhAinaialRbbgHce4cbaHceG9R7aOfgO86bbaiadfhialcefhlaAcufgAmbkkazcefhzaPcefgPad6hsaohHaPad9hmexvkkcbhoasceGmdxikaoaxad2fhXdnakTmbcbhmcehsawcjdfhCinarao9Rax6miaoTmdaoaxfhoawamfRbbhOawcj;cbfhlaChiakhAinaialRbbgHce4cbaHceG9R7aOfgO86bbaiadfhialcefhlaAcufgAmbkaCcefhCamcefgmad6hsamad9hmbkaXhoxikcbhlcehsinarao9Rax6mdaoTmeaoaxfhoalcefglad6hsadal9hmbkaXhoxdkcbhoasceGTmekc9:hoxikabaqad2fawcjdfakad2z1jjjb8Aawawcjdfakcufad2fadz1jjjb8Aakaqfhqaombkc9:hoxekcbc99arao9Radcaadca0ESEhokavcj;ebf8Kjjjjbaok;xzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecjez:jjjjb8AavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhrcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgDc;Ve0mbavc;abfalaDcu7gPcl4fcsGcitfgsydlhzasydbhHdnaDcsGgDak9pmbavaiaPfcsGcdtfydbaxaDEhsaDThDdndnadcd9hmbabarcetfgPaH87ebaPcdfaz87ebaPclfas87ebxekabarcdtfgPaHBdbaPclfazBdbaPcwfasBdbkaxaDfhxavc;abfalcitfgPasBdbaPazBdlavaicdtfasBdbavc;abfalcefcsGglcitfgPaHBdbaPasBdlaiaDfhialcefhlxdkdndnaDcsSmbamaDfaDc987fcefhmxekaocefhDao8SbbgscFeGhPdndnascu9mmbaDhoxekaocvfhoaPcFbGhPcrhsdninaD8SbbgOcFbGastaPVhPaOcu9kmeaDcefhDascrfgsc8J9hmbxdkkaDcefhokaPce4cbaPceG9R7amfhmkdndnadcd9hmbabarcetfgDaH87ebaDcdfaz87ebaDclfam87ebxekabarcdtfgDaHBdbaDclfazBdbaDcwfamBdbkavc;abfalcitfgDamBdbaDazBdlavaicdtfamBdbavc;abfalcefcsGglcitfgDaHBdbaDamBdlaicefhialcefhlxekdnaDcpe0mbaxcefgOavaiaqaDcsGfRbbgscl49RcsGcdtfydbascz6gPEhDavaias9RcsGcdtfydbaOaPfgzascsGgOEhsaOThOdndnadcd9hmbabarcetfgHax87ebaHcdfaD87ebaHclfas87ebxekabarcdtfgHaxBdbaHclfaDBdbaHcwfasBdbkavaicdtfaxBdbavc;abfalcitfgHaDBdbaHaxBdlavaicefgicsGcdtfaDBdbavc;abfalcefcsGcitfgHasBdbaHaDBdlavaiaPfcsGgicdtfasBdbavc;abfalcdfcsGglcitfgDaxBdbaDasBdlalcefhlaiaOfhiazaOfhxxekaxcbaoRbbgHEgAaDc;:eSgDfhzaHcsGhCaHcl4hXdndnaHcs0mbazcefhOxekazhOavaiaX9RcsGcdtfydbhzkdndnaCmbaOcefhxxekaOhxavaiaH9RcsGcdtfydbhOkdndnaDTmbaocefhDxekaocdfhDao8SbegPcFeGhsdnaPcu9kmbaocofhAascFbGhscrhodninaD8SbbgPcFbGaotasVhsaPcu9kmeaDcefhDaocrfgoc8J9hmbkaAhDxekaDcefhDkasce4cbasceG9R7amfgmhAkdndnaXcsSmbaDhsxekaDcefhsaD8SbbgocFeGhPdnaocu9kmbaDcvfhzaPcFbGhPcrhodninas8SbbgDcFbGaotaPVhPaDcu9kmeascefhsaocrfgoc8J9hmbkazhsxekascefhskaPce4cbaPceG9R7amfgmhzkdndnaCcsSmbashoxekascefhoas8SbbgDcFeGhPdnaDcu9kmbascvfhOaPcFbGhPcrhDdninao8SbbgscFbGaDtaPVhPascu9kmeaocefhoaDcrfgDc8J9hmbkaOhoxekaocefhokaPce4cbaPceG9R7amfgmhOkdndnadcd9hmbabarcetfgDaA87ebaDcdfaz87ebaDclfaO87ebxekabarcdtfgDaABdbaDclfazBdbaDcwfaOBdbkavc;abfalcitfgDazBdbaDaABdlavaicdtfaABdbavc;abfalcefcsGcitfgDaOBdbaDazBdlavaicefgicsGcdtfazBdbavc;abfalcdfcsGcitfgDaABdbaDaOBdlavaiaHcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiarcifgrae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:flevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:Lvoeue99dud99eud99dndnadcl9hmbaeTmeindndnabcdfgd8Sbb:Yab8Sbbgi:Ygl:l:tabcefgv8Sbbgo:Ygr:l:tgwJbb;:9cawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai86bbdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad86bbdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad86bbabclfhbaecufgembxdkkaeTmbindndnabclfgd8Ueb:Yab8Uebgi:Ygl:l:tabcdfgv8Uebgo:Ygr:l:tgwJb;:FSawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai87ebdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad87ebdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad87ebabcwfhbaecufgembkkk;siliui99iue99dnaeTmbcbhiabhlindndnJ;Zl81Zalcof8UebgvciV:Y:vgoal8Ueb:YNgrJb;:FSNJbbbZJbbb:;arJbbbb9GEMgw:lJbbb9p9DTmbaw:OhDxekcjjjj94hDkalclf8Uebhqalcdf8UebhkabaiavcefciGfcetfaD87ebdndnaoak:YNgwJb;:FSNJbbbZJbbb:;awJbbbb9GEMgx:lJbbb9p9DTmbax:Ohkxekcjjjj94hkkabaiavcdfciGfcetfak87ebdndnaoaq:YNgoJb;:FSNJbbbZJbbb:;aoJbbbb9GEMgx:lJbbb9p9DTmbax:Ohqxekcjjjj94hqkabaiavcufciGfcetfaq87ebdndnJbbjZararN:tawawN:taoaoN:tgrJbbbbarJbbbb9GE:rJb;:FSNJbbbZMgr:lJbbb9p9DTmbar:Ohqxekcjjjj94hqkabaiavciGfcetfaq87ebalcwfhlaiclfhiaecufgembkkk9mbdnadcd4ae2gdTmbinababydbgecwtcw91:Yaece91cjjj98Gcjjj;8if::NUdbabclfhbadcufgdmbkkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabkkkebcjwklz9Kbb",t="b9H79TebbbeKl9Gbb9Gvuuuuueu9Giuuub9Geueuikqbbebeedddilve9Weeeviebeoweuec:q;Aekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbdY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVblE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtboK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbrL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbwl79IV9RbDq;b9tqlbzik9:evu8Jjjjjbcz9Rhbcbheincbhdcbhiinabcwfadfaicjuaead4ceGglE86bbaialfhiadcefgdcw9hmbkaec:q:yjjbfai86bbaecitc:q1jjbfab8Piw83ibaecefgecjd9hmbkk;e8JlHud97euo978Jjjjjbcj;kb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Rad;8qbbcj;abad9UhoaicefhldnadTmbaoc;WFbGgocjdaocjd6EhwcbhDinaDae9pmeawaeaD9RaDawfae6Egqcsfgoc9WGgkci2hxakcethmaocl4cifcd4hPabaDad2fhscbhzdnincbhHalhOcbhAdninaraO9RaP6miavcj;cbfaAak2fhCaOaPfhlcbhidnakc;ab6mbaral9Rc;Gb6mbcbhoinaCaofhidndndndndnaOaoco4fRbbgXciGPlbedibkaipxbbbbbbbbbbbbbbbbpklbxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklbalczfhlkdndndndndnaXcd4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklzxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklzalczfhlkdndndndndnaXcl4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklaxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklaalczfhlkdndndndndnaXco4Plbedibkaipxbbbbbbbbbbbbbbbbpkl8WxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalclfaYpQbfaXc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalcwfaYpQbfaXc:q:yjjbfRbbfhlxekaialpbbbpkl8Walczfhlkaoc;abfhiaocjefak0meaihoaral9Rc;Fb0mbkkdndnaiak9pmbaici4hoinaral9RcK6mdaCaifhXdndndndndnaOaico4fRbbaocoG4ciGPlbedibkaXpxbbbbbbbbbbbbbbbbpklbxikaXalpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaXalpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaXalpbbbpklbalczfhlkaocdfhoaiczfgiak6mbkkalTmbaAcd0hHalhOaAcefgAclSmdxekkcbhlaHceGTmdkdnakTmbavcjdfazfhiavazfpbdbhYcbhXinaiavcj;cbfaXfgopblbgLcep9TaLpxeeeeeeeeeeeeeeeegQp9op9Hp9rgLaoakfpblbg8Acep9Ta8AaQp9op9Hp9rg8ApmbzeHdOiAlCvXoQrLgEaoamfpblbg3cep9Ta3aQp9op9Hp9rg3aoaxfpblbg5cep9Ta5aQp9op9Hp9rg5pmbzeHdOiAlCvXoQrLg8EpmbezHdiOAlvCXorQLgQaQpmbedibedibedibediaYp9UgYp9AdbbaiadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaEa8EpmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwKDYq8AkEx3m5P8Es8FgLa3a5pmwKDYq8AkEx3m5P8Es8Fg8ApmbezHdiOAlvCXorQLgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfhiaXczfgXak6mbkkazclfgzad6mbkasavcjdfaqad2;8qbbavavcjdfaqcufad2fad;8qbbaqaDfhDc9:hoalmexikkc9:hoxekcbc99aral9Radcaadca0ESEhokavcj;kbf8Kjjjjbaokwbz:bjjjbk;tzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecje;8kbavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhrcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgDc;Ve0mbavc;abfalaDcu7gPcl4fcsGcitfgsydlhzasydbhHdnaDcsGgDak9pmbavaiaPfcsGcdtfydbaxaDEhsaDThDdndnadcd9hmbabarcetfgPaH87ebaPcdfaz87ebaPclfas87ebxekabarcdtfgPaHBdbaPclfazBdbaPcwfasBdbkaxaDfhxavc;abfalcitfgPasBdbaPazBdlavaicdtfasBdbavc;abfalcefcsGglcitfgPaHBdbaPasBdlaiaDfhialcefhlxdkdndnaDcsSmbamaDfaDc987fcefhmxekaocefhDao8SbbgscFeGhPdndnascu9mmbaDhoxekaocvfhoaPcFbGhPcrhsdninaD8SbbgOcFbGastaPVhPaOcu9kmeaDcefhDascrfgsc8J9hmbxdkkaDcefhokaPce4cbaPceG9R7amfhmkdndnadcd9hmbabarcetfgDaH87ebaDcdfaz87ebaDclfam87ebxekabarcdtfgDaHBdbaDclfazBdbaDcwfamBdbkavc;abfalcitfgDamBdbaDazBdlavaicdtfamBdbavc;abfalcefcsGglcitfgDaHBdbaDamBdlaicefhialcefhlxekdnaDcpe0mbaxcefgOavaiaqaDcsGfRbbgscl49RcsGcdtfydbascz6gPEhDavaias9RcsGcdtfydbaOaPfgzascsGgOEhsaOThOdndnadcd9hmbabarcetfgHax87ebaHcdfaD87ebaHclfas87ebxekabarcdtfgHaxBdbaHclfaDBdbaHcwfasBdbkavaicdtfaxBdbavc;abfalcitfgHaDBdbaHaxBdlavaicefgicsGcdtfaDBdbavc;abfalcefcsGcitfgHasBdbaHaDBdlavaiaPfcsGgicdtfasBdbavc;abfalcdfcsGglcitfgDaxBdbaDasBdlalcefhlaiaOfhiazaOfhxxekaxcbaoRbbgHEgAaDc;:eSgDfhzaHcsGhCaHcl4hXdndnaHcs0mbazcefhOxekazhOavaiaX9RcsGcdtfydbhzkdndnaCmbaOcefhxxekaOhxavaiaH9RcsGcdtfydbhOkdndnaDTmbaocefhDxekaocdfhDao8SbegPcFeGhsdnaPcu9kmbaocofhAascFbGhscrhodninaD8SbbgPcFbGaotasVhsaPcu9kmeaDcefhDaocrfgoc8J9hmbkaAhDxekaDcefhDkasce4cbasceG9R7amfgmhAkdndnaXcsSmbaDhsxekaDcefhsaD8SbbgocFeGhPdnaocu9kmbaDcvfhzaPcFbGhPcrhodninas8SbbgDcFbGaotaPVhPaDcu9kmeascefhsaocrfgoc8J9hmbkazhsxekascefhskaPce4cbaPceG9R7amfgmhzkdndnaCcsSmbashoxekascefhoas8SbbgDcFeGhPdnaDcu9kmbascvfhOaPcFbGhPcrhDdninao8SbbgscFbGaDtaPVhPascu9kmeaocefhoaDcrfgDc8J9hmbkaOhoxekaocefhokaPce4cbaPceG9R7amfgmhOkdndnadcd9hmbabarcetfgDaA87ebaDcdfaz87ebaDclfaO87ebxekabarcdtfgDaABdbaDclfazBdbaDcwfaOBdbkavc;abfalcitfgDazBdbaDaABdlavaicdtfaABdbavc;abfalcefcsGcitfgDaOBdbaDazBdlavaicefgicsGcdtfazBdbavc;abfalcdfcsGcitfgDaABdbaDaOBdlavaiaHcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiarcifgrae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:flevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:wPliuo97eue978Jjjjjbca9Rhiaec98Ghldndnadcl9hmbdnalTmbcbhvabhdinadadpbbbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDpxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpkbbadczfhdavclfgval6mbkkalae9pmeaipxbbbbbbbbbbbbbbbbgqpklbaiabalcdtfgdaeciGglcdtgv;8qbbdnalTmbaiaipblbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDaqp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpklbkadaiav;8qbbskdnalTmbcbhvabhdinadczfgxaxpbbbgopxbbbbbbFFbbbbbbFFgkp9oadpbbbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpkbbadaDakp9oawaopmbezHdiOAlvCXorQLp9qpkbbadcafhdavclfgval6mbkkalae9pmbaiaeciGgvcitgdfcbcaad9R;8kbaiabalcitfglad;8qbbdnavTmbaiaipblzgopxbbbbbbFFbbbbbbFFgkp9oaipblbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpklzaiaDakp9oawaopmbezHdiOAlvCXorQLp9qpklbkalaiad;8qbbkk;4wllue97euv978Jjjjjbc8W9Rhidnaec98GglTmbcbhvabhoinaiaopbbbgraoczfgwpbbbgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklbaopxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblbpEb:T:j83ibaocwfarp5eaipblbpEe:T:j83ibawaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblbpEd:T:j83ibaocKfakp5eaipblbpEi:T:j83ibaocafhoavclfgval6mbkkdnalae9pmbaiaeciGgvcitgofcbcaao9R;8kbaiabalcitfgwao;8qbbdnavTmbaiaipblbgraipblzgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklaaipxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblapEb:T:j83ibaiarp5eaipblapEe:T:j83iwaiaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblapEd:T:j83izaiakp5eaipblapEi:T:j83iKkawaiao;8qbbkk:Pddiue978Jjjjjbc;ab9Rhidnadcd4ae2glc98GgvTmbcbheabhdinadadpbbbgocwp:Recwp:Sep;6eaocep:SepxbbjFbbjFbbjFbbjFp9opxbbjZbbjZbbjZbbjZp:Uep;Mepkbbadczfhdaeclfgeav6mbkkdnaval9pmbaialciGgecdtgdVcbc;abad9R;8kbaiabavcdtfgvad;8qbbdnaeTmbaiaipblbgocwp:Recwp:Sep;6eaocep:SepxbbjFbbjFbbjFbbjFp9opxbbjZbbjZbbjZbbjZp:Uep;Mepklbkavaiad;8qbbkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaikkkebcjwklz9Tbb",n=new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,3,2,0,0,5,3,1,0,1,12,1,0,10,22,2,12,0,65,0,65,0,65,0,252,10,0,0,11,7,0,65,0,253,15,26,11]),i=new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]);if(typeof WebAssembly!="object")return{supported:!1};var o=WebAssembly.validate(n)?t:e,r,s=WebAssembly.instantiate(a(o),{}).then(function(C){r=C.instance,r.exports.__wasm_call_ctors()});function a(C){for(var V=new Uint8Array(C.length),L=0;L96?Z-97:Z>64?Z-39:Z+4}for(var G=0,L=0;L0?x(C,V,L,u[Z],d[G]):s.then(function(){var X=new Uint8Array(C*V);return c(r,r.exports[u[Z]],X,C,V,L,r.exports[d[G]]),X})}}}();var ECn=T(S()),ZCn=function(){var e="b9H79Tebbbe9Ek9Geueu9Geub9Gbb9GPuuuuuuuuuuu99uueu9Gvuuuuub9Gluuuub9Gquuuuuuu99uueu9Gwuuuuuu99ueu9Giuuue999Gluuuueu9GiuuueuizsdilvoirwDbqqbeqlve9Weiiviebeoweuec:G;jekr:Tewo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bbz9TW79O9V9Wt9F79P9T9W29P9M95bl8E9TW79O9V9Wt9F79P9T9W29P9M959x9Pt9OcttV9P9I91tW7bvQ9TW79O9V9Wt9F79P9T9W29P9M959q9V9P9Ut7boX9TW79O9V9Wt9F79P9T9W29P9M959t9J9H2Wbra9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94SWt9J9O9sW9T9H9Wbwl79IV9RbDDwebcekdxmq::9Usdbk;i6iKuY99Ou8Jjjjjbc;W;ab9RgP8KjjjjbaPcwfcbc;Kbz:ljjjb8AaPcualcefgscdtascFFFFi0Ecbyd1:jjjbHjjjjbbgzBdwaPceBd9OaPazBdbaPcuadcitadcFFFFe0Ecbyd1:jjjbHjjjjbbgHBdxaPcdBd9OaPaHBdlaPaeadalcbz:cjjjbaPcualcdtgOalcFFFFi0EgAcbyd1:jjjbHjjjjbbgCBdzaPciBd9OaPaAcbyd1:jjjbHjjjjbbgXBdCaPclBd9Oalcd4alfhQcehLinaLgscethLasaQ6mbkcbhKaPcuascdtgLascFFFFi0Ecbyd1:jjjbHjjjjbbgQBdKaPcvBd9OaQcFeaLz:ljjjbhYdnalTmbavcd4h8AascufhEinaiaKa8A2cdtfg3ydlgscH4as7c:F:b:DD2a3ydbgscH4as7c;D;O:B8J27a3ydwgscH4as7c:3F;N8N27hQcbhsdndninaYaQaEGgQcdtfg5ydbgLcuSmeaiaLa8A2cdtfa3cxz:ojjjbTmdascefgsaQfhQasaE9nmbxdkka5aKBdbaKhLkaCaKcdtfaLBdbaKcefgKal9hmbkcbhsaXhLinaLasBdbaLclfhLalascefgs9hmbkcbhsaChLaXhQindnasaLydbgESmbaQaXaEcdtfgEydbBdbaEasBdbkaLclfhLaQclfhQalascefgs9hmbkkcbh8EaYcbyd:m:jjjbH:bjjjbbaPclBd9OaPalcbyd1:jjjbHjjjjbbgEBdKaPcvBd9OaPaAcbyd1:jjjbHjjjjbbgsBd3aPcoBd9OaPaAcbyd1:jjjbHjjjjbbgLBdaaPcrBd9OascFeaOz:ljjjbh8FaLcFeaOz:ljjjbhadnalTmbaHcwfhhindnaza8EgQcefg8Ecdtfydbg3azaQcdtgsfydbgLSmba3aL9RhOaHaLcitfhgaaasfh8Ja8FasfhKcbh8Aindndnaga8Acitfydbg5aQ9hmbaKaQBdba8JaQBdbxekdnaza5cdtg8KfgsclfydbgLasydbgsSmbaHascitg3fydbaQSmeaLas9Rh8Lascu7aLfhYaha3fhLcbhsinaYasSmeascefhsaLydbh3aLcwfhLa3aQ9hmbkasa8L6mekaaa8KfgsaQa5asydbcuSEBdbaKa5aQaKydbcuSEBdbka8Acefg8AaO9hmbkka8Eal9hmbkaChLaXhQaah3a8Fh8AcbhsindndnasaLydbg59hmbdnasaQydbg59hmba8Aydbh5dna3ydbgYcu9hmba5cu9hmbaEasfcb86bbxikaEasfhKdnasaYSmbasa5SmbaKce86bbxikaKcl86bbxdkdnasaXa5cdtgYfydb9hmbdna3ydbgKcuSmbasaKSmba8AydbgOcuSmbasaOSmbaaaYfydbggcuSmbaga5Smba8FaYfydbgYcuSmbaYa5SmbdnaCaKcdtfydbaCaYcdtfydb9hmbaCaOcdtfydbaCagcdtfydb9hmbaEasfcd86bbxlkaEasfcl86bbxikaEasfcl86bbxdkaEasfcl86bbxekaEasfaEa5fRbb86bbkaLclfhLaQclfhQa3clfh3a8Aclfh8Aalascefgs9hmbkaxceGTmbaEhsalhLindnasRbbce9hmbascl86bbkascefhsaLcufgLmbkkcualcx2alc;v:Q;v:Qe0Ecbyd1:jjjbHjjjjbbh8JaPcwfaPyd9Ogscdtfa8JBdbaPascefgOBd9Oa8Jaialavz:djjjbdndnaDmbcbhvxekcbh5aPcwfaOcdtfcuaDal2gLcdtaLcFFFFi0Ecbyd1:jjjbHjjjjbbgvBdbaPascdfgOBd9OalTmbarcd4cdthYaDcdthKavh8AinaohsawhLa8AhQaDh3inaQasIdbaLIdbNUdbasclfhsaLclfhLaQclfhQa3cufg3mbkaoaYfhoa8AaKfh8Aa5cefg5al9hmbkkaPcwfaOcdtfcualc8S2gsalc;D;O;f8U0EgQcbyd1:jjjbHjjjjbbgLBdbaPaOcefg3Bd9OaLcbasz:ljjjbh8EdndndnaDTmbaPcwfa3cdtfaQcbyd1:jjjbHjjjjbbgoBdbaPaOcdfgLBd9Oaocbasz:ljjjb8AaPcwfaLcdtfcuaDal2gscltgLascFFFFb0Ecbyd1:jjjbHjjjjbbgwBdbaPaOcifBd9OawcbaLz:ljjjb8AadmexdkcbhocbhwadTmekcbh8AaehLindna8JaLclfydbg5cx2fgsIdba8JaLydbgYcx2fgQIdbg8M:tg8Na8JaLcwfydbgKcx2fg3IdlaQIdlgy:tg8PNa3Idba8M:tgIasIdlay:tg8RN:tg8Sa8SNa8Ra3IdwaQIdwgR:tg8UNa8PasIdwaR:tg8RN:tg8Pa8PNa8RaINa8Ua8NN:tg8Na8NNMM:rgIJbbbb9ETmba8SaI:vh8Sa8NaI:vh8Na8PaI:vh8Pka8EaCaYcdtfydbc8S2fgsa8PaI:rgIa8PNNg8RasIdbMUdbasa8NaIa8NNg8VNg8UasIdlMUdlasa8SaIa8SNg8WNg8XasIdwMUdwasa8Va8PNg8VasIdxMUdxasa8Wa8PNg8YasIdzMUdzasa8Wa8NNg8WasIdCMUdCasa8PaIa8SaRNa8Pa8MNaya8NNMM:mgyNg8MNg8PasIdKMUdKasa8Na8MNg8NasId3MUd3asa8Sa8MNg8SasIdaMUdaasa8MayNg8MasId8KMUd8KasaIasIdyMUdya8EaCa5cdtfydbc8S2fgsa8RasIdbMUdbasa8UasIdlMUdlasa8XasIdwMUdwasa8VasIdxMUdxasa8YasIdzMUdzasa8WasIdCMUdCasa8PasIdKMUdKasa8NasId3MUd3asa8SasIdaMUdaasa8MasId8KMUd8KasaIasIdyMUdya8EaCaKcdtfydbc8S2fgsa8RasIdbMUdbasa8UasIdlMUdlasa8XasIdwMUdwasa8VasIdxMUdxasa8YasIdzMUdzasa8WasIdCMUdCasa8PasIdKMUdKasa8NasId3MUd3asa8SasIdaMUdaasa8MasId8KMUd8KasaIasIdyMUdyaLcxfhLa8Acifg8Aad6mbkcbh5aehYincbhLinaEaeaLc:G1jjbfydba5fcdtfydbgQfRbbhsdndnaEaYaLfydbg3fRbbg8Ac99fcFeGcpe0mbasceSmbascd9hmekdna8AcufcFeGce0mba8Fa3cdtfydbaQ9hmekdnascufcFeGce0mbaaaQcdtfydba39hmekdna8Acv2asfc:W1jjbfRbbTmbaCaQcdtfydbaCa3cdtfydb0mekJbbacJbbjZasceSEhIa8AceShOa8JaeaLc:K1jjbfydba5fcdtfydbcx2fhsdna8JaQcx2fg8AIdwa8Ja3cx2fgKIdwgy:tg8Pa8PNa8AIdbaKIdbgR:tg8Na8NNa8AIdlaKIdlg8R:tg8Sa8SNMM:rg8MJbbbb9ETmba8Pa8M:vh8Pa8Sa8M:vh8Sa8Na8M:vh8NkJbbacaIaOEh8WdnasIdway:tgIa8PaIa8PNasIdbaR:tg8Xa8NNa8SasIdla8R:tg8VNMMg8UN:tgIaINa8Xa8Na8UN:tg8Pa8PNa8Va8Sa8UN:tg8Na8NNMM:rg8SJbbbb9ETmbaIa8S:vhIa8Na8S:vh8Na8Pa8S:vh8Pka8EaCa3cdtfydbc8S2fgsa8Pa8Wa8MNg8Sa8PNNg8UasIdbMUdbasa8Na8Sa8NNg8WNg8XasIdlMUdlasaIa8SaINg8MNg8VasIdwMUdwasa8Wa8PNg8WasIdxMUdxasa8Ma8PNg8YasIdzMUdzasa8Ma8NNg8ZasIdCMUdCasa8Pa8SaIayNa8PaRNa8Ra8NNMM:mgyNg8MNg8PasIdKMUdKasa8Na8MNg8NasId3MUd3asaIa8MNgIasIdaMUdaasa8MayNg8MasId8KMUd8Kasa8SasIdyMUdya8EaCaQcdtfydbc8S2fgsa8UasIdbMUdbasa8XasIdlMUdlasa8VasIdwMUdwasa8WasIdxMUdxasa8YasIdzMUdzasa8ZasIdCMUdCasa8PasIdKMUdKasa8NasId3MUd3asaIasIdaMUdaasa8MasId8KMUd8Kasa8SasIdyMUdykaLclfgLcx9hmbkaYcxfhYa5cifg5ad6mbkaDTmbcbhYinJbbbbhRa8JaeaYcdtfgsclfydbgKcx2fgLIdwa8JasydbgOcx2fgQIdwg8V:tg8Na8NNaLIdbaQIdbg8Y:tgIaINaLIdlaQIdlg8Z:tg8Sa8SNMMg8Wa8Jascwfydbggcx2fgsIdwa8V:tg8MNa8Na8Na8MNaIasIdba8Y:tgyNa8SasIdla8Z:tg8RNMMg8PN:tJbbbbJbbjZa8Wa8Ma8MNayayNa8Ra8RNMMg8XNa8Pa8PN:tg8U:va8UJbbbb9BEg8UNh80a8Xa8NNa8Ma8PN:ta8UNh81a8Wa8RNa8Sa8PN:ta8UNhBa8Xa8SNa8Ra8PN:ta8UNh83a8WayNaIa8PN:ta8UNhUa8XaINaya8PN:ta8UNh85aIa8RNaya8SN:tg8Pa8PNa8Sa8MNa8Ra8NN:tg8Pa8PNa8NayNa8MaIN:tg8Pa8PNMM:r:rh8PavaOaD2cdtfhLavagaD2cdtfhQavaKaD2cdtfh3a8V:mh86a8Z:mh87a8Y:mh88cbh8AaDh5Jbbbbh8RJbbbbh8UJbbbbh8WJbbbbh8XJbbbbh8VJbbbbh8YJbbbbh8ZJbbbbh89Jbbbbh8:inaPc;Wbfa8Afgscwfa8Pa81a3IdbaLIdbg8M:tg8SNa80aQIdba8M:tgyNMg8NNUdbasclfa8Pa83a8SNaBayNMgINUdbasa8Pa85a8SNaUayNMg8SNUdbascxfa8Pa86a8NNa87aINa8Ma88a8SNMMMg8MNUdba8Pa8NaINNa8XMh8Xa8Pa8Na8SNNa8VMh8Va8PaIa8SNNa8YMh8Ya8Pa8Ma8MNNaRMhRa8Pa8Na8MNNa8RMh8Ra8PaIa8MNNa8UMh8Ua8Pa8Sa8MNNa8WMh8Wa8Pa8Na8NNNa8ZMh8Za8PaIaINNa89Mh89a8Pa8Sa8SNNa8:Mh8:aLclfhLa3clfh3aQclfhQa8Aczfh8Aa5cufg5mbkaoaCaOcdtfydbgLc8S2fgsa8:asIdbMUdbasa89asIdlMUdlasa8ZasIdwMUdwasa8YasIdxMUdxasa8VasIdzMUdzasa8XasIdCMUdCasa8WasIdKMUdKasa8UasId3MUd3asa8RasIdaMUdaasaRasId8KMUd8Kasa8PasIdyMUdyaoaCaKcdtfydbgKc8S2fgsa8:asIdbMUdbasa89asIdlMUdlasa8ZasIdwMUdwasa8YasIdxMUdxasa8VasIdzMUdzasa8XasIdCMUdCasa8WasIdKMUdKasa8UasId3MUd3asa8RasIdaMUdaasaRasId8KMUd8Kasa8PasIdyMUdyaoaCagcdtfydbgOc8S2fgsa8:asIdbMUdbasa89asIdlMUdlasa8ZasIdwMUdwasa8YasIdxMUdxasa8VasIdzMUdzasa8XasIdCMUdCasa8WasIdKMUdKasa8UasId3MUd3asa8RasIdaMUdaasaRasId8KMUd8Kasa8PasIdyMUdyawaLaD2cltfh5cbhLaDh3ina5aLfgsaPc;WbfaLfgQIdbasIdbMUdbasclfg8AaQclfIdba8AIdbMUdbascwfg8AaQcwfIdba8AIdbMUdbascxfgsaQcxfIdbasIdbMUdbaLczfhLa3cufg3mbkawaKaD2cltfh5cbhLaDh3ina5aLfgsaPc;WbfaLfgQIdbasIdbMUdbasclfg8AaQclfIdba8AIdbMUdbascwfg8AaQcwfIdba8AIdbMUdbascxfgsaQcxfIdbasIdbMUdbaLczfhLa3cufg3mbkawaOaD2cltfh5cbhLaDh3ina5aLfgsaPc;WbfaLfgQIdbasIdbMUdbasclfg8AaQclfIdba8AIdbMUdbascwfg8AaQcwfIdba8AIdbMUdbascxfgsaQcxfIdbasIdbMUdbaLczfhLa3cufg3mbkaYcifgYad6mbkkdnabaeSmbabaeadcdtz:kjjjb8AkaPydbhZcbhsdnalTmbaZclfhsaZydbh3aEhLalh8AcbhQincbasydbg5a39RaLRbbcpeGEaQfhQaLcefhLasclfhsa5h3a8Acufg8AmbkaQce4hskcuadas9Rcifgrcx2arc;v:Q;v:Qe0Ecbyd1:jjjbHjjjjbbh8LaPcwfaPyd9Ogscdtfa8LBdbaPascefgLBd9OaPcwfaLcdtfcuarcdtarcFFFFi0Ecbyd1:jjjbHjjjjbbgxBdbaPascdfgLBd9OaPcwfaLcdtfaAcbyd1:jjjbHjjjjbbgHBdbaPascifgLBd9OaPcwfaLcdtfalcbyd1:jjjbHjjjjbbgnBdbaPasclfBd9OJbbbbh8Ydnadaq9nmbdnarci6mbakakNh8VaDclthca8Lcwfh9cJbbbbh8YinaPabadghalaCz:cjjjbabhOcbhzcbhKincbhsindnaCaOasfydbgQcdtgYfydbg8AaCabasc;m1jjbfydbaKfcdtfydbgLcdtfydbg5SmbaEaLfRbbgecv2aEaQfRbbg3fc;G1jjbfRbbg8Ka3cv2aefggc;G1jjbfRbbgiVcFeGTmbdnagc:W1jjbfRbbTmba5a8A0mekdna3ae9hmba3cufcFeGce0mba8FaYfydbaL9hmeka8Lazcx2fg3aLaQaicFeGg8AEBdla3aQaLa8AEBdba3a8Aa8KGcb9hBdwazcefhzkasclfgscx9hmbkdnaKcifgKah9pmbaOcxfhOazcifar9nmekkdnazmbahhdxikcbheinJbbbbJbbjZa8EaCa8Laecx2fg3ydlg8Aa3ydbg5a3ydwgLEgKcdtfydbg8Kc8S2gifgsIdyg8P:va8PJbbbb9BEasIdwa8Ja5a8AaLEgYcx2fgLIdwg8SNasIdzaLIdbg8MNasIdaMg8Pa8PMMa8SNasIdlaLIdlgyNasIdCa8SNasId3Mg8Pa8PMMayNasIdba8MNasIdxayNasIdKMg8Pa8PMMa8MNasId8KMMM:lNh8WJbbbbJbbjZa8EaCa5cdtfydbgdc8S2gQfgsIdyg8P:va8PJbbbb9BEasIdwa8Ja8Acx2fgLIdwgINasIdzaLIdbgRNasIdaMg8Pa8PMMaINasIdlaLIdlg8RNasIdCaINasId3Mg8Pa8PMMa8RNasIdbaRNasIdxa8RNasIdKMg8Pa8PMMaRNasId8KMMM:lNh8Xa3cwfhOa3clfhgdnaDTmbaoaQfgQIdwaINaQIdzaRNaQIdaMg8Pa8PMMaINaQIdla8RNaQIdCaINaQId3Mg8Pa8PMMa8RNaQIdbaRNaQIdxa8RNaQIdKMg8Pa8PMMaRNaQId8KMMMh8Nava8AaD2cdtfhLawadaD2cltfhsaQIdyh8UaDhQinaLIdbg8PJbbb;aNascxfIdbaIascwfIdbNaRasIdbNa8RasclfIdbNMMMNa8Pa8PNa8UNa8NMMh8NaLclfhLasczfhsaQcufgQmbkaoaifgQIdwa8SNaQIdza8MNaQIdaMg8Pa8PMMa8SNaQIdlayNaQIdCa8SNaQId3Mg8Pa8PMMayNaQIdba8MNaQIdxayNaQIdKMg8Pa8PMMa8MNaQId8KMMMhIavaYaD2cdtfhLawa8KaD2cltfhsaQIdyhRaDhQinaLIdbg8PJbbb;aNascxfIdba8SascwfIdbNa8MasIdbNayasclfIdbNMMMNa8Pa8PNaRNaIMMhIaLclfhLasczfhsaQcufgQmbka8WaI:lMh8Wa8Xa8N:lMh8Xkaga8AaYa8Xa8W9FgsEBdba3a5aKasEBdbaOa8Xa8WasEUdbaecefgeaz9hmbkaPc;Wbfcbcj;abz:ljjjb8Aa9chsazhLinaPc;WbfasydbcO4c;8ZGfgQaQydbcefBdbascxfhsaLcufgLmbkcbhscbhLinaPc;WbfasfgQydbh3aQaLBdba3aLfhLasclfgscj;ab9hmbkcbhsa9chLinaPc;WbfaLydbcO4c;8ZGfgQaQydbgQcefBdbaxaQcdtfasBdbaLcxfhLazascefgs9hmbkahaq9RgQci9UhJdnalTmbcbhsaHhLinaLasBdbaLclfhLalascefgs9hmbkkcbh9eancbalz:ljjjbhTaQcO9UhSaJce4h9haPydlh9icbhicbhgdnina8Laxagcdtfydbcx2fgOIdwg8Na8V9EmeaiaJ9pmeJFFuuh8Pdna9haz9pmba8Laxa9hcdtfydbcx2fIdwJbb;aZNh8Pkdna8Na8P9ETmbaiaS0mdkdnaTaCaOydlg6cdtg9kfydbg3fg0RbbaTaCaOydbgKcdtg9mfydbg9nfg9oRbbVmbdnaZa9ncdtfgsclfydbgLasydbgsSmbaLas9Rh5a9iascitfhsa8Ja3cx2fgYcwfhdaYclfhAa8Ja9ncx2fg8Kcwfh9pa8Kclfh9qcbhLcehednindnaHasydbcdtfydbgQa3SmbaHasclfydbcdtfydbg8Aa3SmbaQa8ASmba8Ja8Acx2fg8AIdba8JaQcx2fgQIdbgI:tg8Pa9qIdbaQIdlg8S:tg8MNa8KIdbaI:tgya8AIdla8S:tg8NN:ta8PaAIdba8S:tgRNaYIdbaI:tg8Ra8NN:tNa8Na9pIdbaQIdwg8S:tg8UNa8Ma8AIdwa8S:tgIN:ta8NadIdba8S:tg8SNaRaIN:tNaIayNa8Ua8PN:taIa8RNa8Sa8PN:tNMMJbbbb9FmdkascwfhsaLcefgLa56hea5aL9hmbkkaeceGTmba9hcefh9hxeka8Ea3c8S2gQfgsa8Ea9nc8S2g8AfgLIdbasIdbMUdbasaLIdlasIdlMUdlasaLIdwasIdwMUdwasaLIdxasIdxMUdxasaLIdzasIdzMUdzasaLIdCasIdCMUdCasaLIdKasIdKMUdKasaLId3asId3MUd3asaLIdaasIdaMUdaasaLId8KasId8KMUd8KasaLIdyasIdyMUdydnaDTmbaoaQfgsaoa8AfgLIdbasIdbMUdbasaLIdlasIdlMUdlasaLIdwasIdwMUdwasaLIdxasIdxMUdxasaLIdzasIdzMUdzasaLIdCasIdCMUdCasaLIdKasIdKMUdKasaLId3asId3MUd3asaLIdaasIdaMUdaasaLId8KasId8KMUd8KasaLIdyasIdyMUdyaca9n2heaca32hYawhLaDh8AinaLaYfgsaLaefgQIdbasIdbMUdbasclfg5aQclfIdba5IdbMUdbascwfg5aQcwfIdba5IdbMUdbascxfgsaQcxfIdbasIdbMUdbaLczfhLa8Acufg8AmbkkaOcwfhLdndndndnaEaKfgQRbbc9:fPdebdkaKhsinaHascdtgsfa3BdbaXasfydbgsaK9hmbxikkaXa9kfydbhsaXa9mfydbhKaHa9mfa6Bdbash6kaHaKcdtfa6Bdbka9oce86bba0ce86bbaLIdbg8Pa8Ya8Ya8P9DEh8Ya9ecefh9ececdaQRbbceSEaifhikagcefggaz9hmbkkdna9embahhdxikdnalTmbcbhLa8FhsindnasydbgQcuSmbdnaLaHaQcdtg3fydbgQ9hmba8Fa3fydbhQkasaQBdbkasclfhsalaLcefgL9hmbkcbhLaahsindnasydbgQcuSmbdnaLaHaQcdtg3fydbgQ9hmbaaa3fydbhQkasaQBdbkasclfhsalaLcefgL9hmbkkcbhdabhscbh8AindnaHasydbcdtfydbgLaHasclfydbcdtfydbgQSmbaLaHascwfydbcdtfydbg3SmbaQa3Smbabadcdtfg5aLBdba5clfaQBdba5cwfa3Bdbadcifhdkascxfhsa8Acifg8Aah6mbkadaq9nmdxbkkaPabadalaCz:cjjjbkdnamTmbama8Y:rUdbkaPyd9OgscdtaPcwffc98fhCdninasTmeaCydbcbyd:m:jjjbH:bjjjbbaCc98fhCascufhsxbkkaPc;W;abf8Kjjjjbadk;:ieouabydlhvabydbclfcbaicdtz:ljjjbhoadci9UhrdnadTmbdnalTmbaehwadhDinaoalawydbcdtfydbcdtfgqaqydbcefBdbawclfhwaDcufgDmbxdkkaehwadhDinaoawydbcdtfgqaqydbcefBdbawclfhwaDcufgDmbkkdnaiTmbcbhDaohwinawydbhqawaDBdbawclfhwaqaDfhDaicufgimbkkdnadci6mbarcearce0EhdinaecwfydbhwaeclfydbhDaeydbhidnalTmbalawcdtfydbhwalaDcdtfydbhDalaicdtfydbhikavaoaicdtfgqydbcitfaDBdbavaqydbcitfawBdlaqaqydbcefBdbavaoaDcdtfgqydbcitfawBdbavaqydbcitfaiBdlaqaqydbcefBdbavaoawcdtfgwydbcitfaiBdbavawydbcitfaDBdlawawydbcefBdbaecxfheadcufgdmbkkabydbcbBdbk:Zldouv998Jjjjjbca9Rglczfcwfcbyd11jjbBdbalcb8Pdj1jjb83izalcwfcbydN1jjbBdbalcb8Pd:m1jjb83ibdnadTmbaicd4hvdnabTmbavcdthocbhraehwinabarcx2fgiaearav2cdtfgDIdbUdbaiaDIdlUdlaiaDIdwUdwcbhiinalczfaifgDawaifIdbgqaDIdbgkakaq9EEUdbalaifgDaqaDIdbgkakaq9DEUdbaiclfgicx9hmbkawaofhwarcefgrad9hmbxdkkavcdthrcbhwincbhiinalczfaifgDaeaifIdbgqaDIdbgkakaq9EEUdbalaifgDaqaDIdbgkakaq9DEUdbaiclfgicx9hmbkaearfheawcefgwad9hmbkkdnabTmbadTmbJbbbbJbbjZalIdbalIdzgk:tJbbbb:xgqalIdlalIdCgx:tgmamaq9DEgqalIdwalIdKgm:tgPaPaq9DEgq:vaqJbbbb9BEhqinabaqabIdbak:tNUdbabclfgiaqaiIdbax:tNUdbabcwfgiaqaiIdbam:tNUdbabcxfhbadcufgdmbkkk8KbabaeadaialavcbcbcbcbaoarawaDz:bjjjbk8KbabaeadaialavaoarawaDaqakaxamz:bjjjbk;lOowud99wue99iul998Jjjjjbc;Wb9Rgw8KjjjjbdndnarmbcbhDxekawcwfcbc;Kbz:ljjjb8Aawcuadcx2adc;v:Q;v:Qe0Ecbyd1:jjjbHjjjjbbgqBdwawceBd9Oaqaeadaiz:djjjbawcuadcdtadcFFFFi0Egkcbyd1:jjjbHjjjjbbgxBdxawcdBd9Oadcd4adfhmceheinaegicetheaiam6mbkcbhmawcuaicdtgPaicFFFFi0Ecbyd1:jjjbHjjjjbbgsBdzawciBd9Odndnar:Zgz:rJbbbZMgH:lJbbb9p9DTmbaH:Ohexekcjjjj94hekaicufhOc:bwhAcbhCcbhXadhQinaChLaeaAgKcufaeaK9iEamgDcefaeaD9kEhYdndnadTmbaYcuf:YhHaqhiaxheadhmindndnaiIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhAxekcjjjj94hAkaAcCthAdndnaiclfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaCcqtaAVhAdndnaicwfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaeaAaCVBdbaicxfhiaeclfheamcufgmmbkascFeaPz:ljjjbhEcbh3cbh5indnaEaxa5cdtfydbgAcm4aA7c:v;t;h;Ev2gics4ai7aOGgmcdtfgCydbgecuSmbaeaASmbcehiinaEamaifaOGgmcdtfgCydbgecuSmeaicefhiaeaA9hmbkkaCaABdba3aecuSfh3a5cefg5ad9hmbxdkkascFeaPz:ljjjb8Acbh3kaDaYa3ar0giEhmaLa3aiEhCdna3arSmbaYaKaiEgAam9Rcd9imbdndnaXcl0mbdnaQ:ZgHaL:Zg8A:taY:Yg8EaD:Y:tg8Fa8EaK:Y:tgaa3:Zghaz:tNNNaHaz:taaNa8Aah:tNa8Aaz:ta8FNahaH:tNM:va8EMJbbbZMgH:lJbbb9p9DTmbaH:Ohexdkcjjjj94hexekamaAfcd9Theka3aQaiEhQaXcefgXcs9hmekkdndnaCmbcihicbhDxekcbhiawakcbyd1:jjjbHjjjjbbg5BdCawclBd9OdndnadTmbamcuf:YhHaqhiaxheadhmindndnaiIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhAxekcjjjj94hAkaAcCthAdndnaiclfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaCcqtaAVhAdndnaicwfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaeaAaCVBdbaicxfhiaeclfheamcufgmmbkascFeaPz:ljjjbhEcbhDcbh3inaxa3cdtgYfydbgAcm4aA7c:v;t;h;Ev2gics4ai7hecbhidndninaEaeaOGgmcdtfgCydbgecuSmednaxaecdtgCfydbaASmbaicefgiamfheaiaO9nmekka5aCfydbhixekaCa3BdbaDhiaDcefhDka5aYfaiBdba3cefg3ad9hmbkcuaDc32giaDc;j:KM;jb0EhexekascFeaPz:ljjjb8AcbhDcbhekawaecbyd1:jjjbHjjjjbbgeBdKawcvBd9Oaecbaiz:ljjjbhOavcd4hxdnadTmbaxcdth3a5hmalhAaqheadhEinaOamydbc32fgiaeIdbaiIdbMUdbaiaeclfIdbaiIdlMUdlaiaecwfIdbaiIdwMUdwaiaAc;81jjbalEgCIdbaiIdxMUdxaiaCIdlaiIdzMUdzaiaCIdwaiIdCMUdCaiaiIdKJbbjZMUdKamclfhmaAa3fhAaecxfheaEcufgEmbkkdnaDTmbaOcxfhiaDheinaictfgmamIdbJbbbbJbbjZaicxfIdbgH:vaHJbbbb9BEgHNUdbaic94fgmaHamIdbNUdbaic98fgmaHamIdbNUdbaiaHaiIdbNUdbaiclfgmaHamIdbNUdbaicwfgmaHamIdbNUdbaic3fhiaecufgembkkcbhAawcuaDcdtgYaDcFFFFi0Egicbyd1:jjjbHjjjjbbgeBd3awcoBd9Oawaicbyd1:jjjbHjjjjbbgEBdaaecFeaYz:ljjjbh3dnadTmbaoaoNh8Aaxcdthxalheina8Aaec;81jjbalEgmIdwaOa5ydbgCc32fgiIdC:tgHaHNamIdbaiIdx:tgHaHNamIdlaiIdz:tgHaHNMMNaqcwfIdbaiIdw:tgHaHNaqIdbaiIdb:tgHaHNaqclfIdbaiIdl:tgHaHNMMMhHdndna3aCcdtgifgmydbcuSmbaEaifIdbaH9ETmekamaABdbaEaifaHUdbka5clfh5aeaxfheaqcxfhqadaAcefgA9hmbkkaba3aYz:kjjjb8AcrhikaicdthiinaiTmeaic98fgiawcwffydbcbyd:m:jjjbH:bjjjbbxbkkawc;Wbf8KjjjjbaDk:Qdidui99ducbhi8Jjjjjbca9Rglczfcwfcbyd11jjbBdbalcb8Pdj1jjb83izalcwfcbydN1jjbBdbalcb8Pd:m1jjb83ibdndnaembJbbjFhvJbbjFhoJbbjFhrxekadcd4cdthwincbhdinalczfadfgDabadfIdbgoaDIdbgrarao9EEUdbaladfgDaoaDIdbgrarao9DEUdbadclfgdcx9hmbkabawfhbaicefgiae9hmbkalIdwalIdK:thralIdlalIdC:thoalIdbalIdz:thvkavJbbbb:xgvaoaoav9DEgoararao9DEk9DeeuabcFeaicdtz:ljjjbhlcbhbdnadTmbindnalaeydbcdtfgiydbcu9hmbaiabBdbabcefhbkaeclfheadcufgdmbkkabk9teiucbcbyd:q:jjjbgeabcifc98GfgbBd:q:jjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabk9teiucbcbyd:q:jjjbgeabcrfc94GfgbBd:q:jjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik9:eiuZbhedndncbyd:q:jjjbgdaecztgi9nmbcuheadai9RcFFifcz4nbcuSmekadhekcbabae9Rcifc98Gcbyd:q:jjjbfgdBd:q:jjjbdnadZbcztge9nmbadae9RcFFifcz4nb8Akk6eiucbhidnadTmbdninabRbbglaeRbbgv9hmeaecefheabcefhbadcufgdmbxdkkalav9Rhikaikk:Iedbcjwk1eFFuuFFuuFFuuFFuFFFuFFFuFbbbbbbbbebbbdbbbbbbbebbbeeebeebebbeeebebbbbbebebbbbbebbbdbbbbbbbbbbbbbbbeeeeebebbbbbebbbbbeebbbbbbbbbbbbbbbbbbbbbc1Dkxebbbdbbb:G9Kbb",t=new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]);if(typeof WebAssembly!="object")return{supported:!1};var n,i=WebAssembly.instantiate(o(e),{}).then(function(f){n=f.instance,n.exports.__wasm_call_ctors()});function o(f){for(var x=new Uint8Array(f.length),_=0;_96?C-97:C>64?C-39:C+4}for(var V=0,_=0;_=3),r(C>=0&&C<=f.length),r(C%3==0),r(V>=0&&V<=1);for(var Z=0,G=0;G<(L?L.length:0);++G)Z|=g[L[G]];var X=f.BYTES_PER_ELEMENT==4?f:new Uint32Array(f),v=d(n.exports.meshopt_simplify,X,f.length,x,x.length/_,_*4,C,V,Z);return v[0]=f instanceof Uint32Array?v[0]:new f.constructor(v[0]),v},simplifyWithAttributes:function(f,x,_,C,V,L,Z,G,X){r(this.useExperimentalFeatures),r(f instanceof Uint32Array||f instanceof Int32Array||f instanceof Uint16Array||f instanceof Int16Array),r(f.length%3==0),r(x instanceof Float32Array),r(x.length%_==0),r(_>=3),r(C instanceof Float32Array),r(C.length%V==0),r(V>=0),r(Z>=0&&Z<=f.length),r(Z%3==0),r(G>=0&&G<=1),r(Array.isArray(L)),r(V>=L.length),r(L.length<=16);for(var v=0,P=0;P<(X?X.length:0);++P)v|=g[X[P]];var F=f.BYTES_PER_ELEMENT==4?f:new Uint32Array(f),A=u(n.exports.meshopt_simplifyWithAttributes,F,f.length,x,x.length/_,_*4,C,V*4,new Float32Array(L),Z,G,v);return A[0]=f instanceof Uint32Array?A[0]:new f.constructor(A[0]),A},getScale:function(f,x){return r(f instanceof Float32Array),r(f.length%x==0),r(x>=3),m(n.exports.meshopt_simplifyScale,f,f.length/x,x*4)},simplifyPoints:function(f,x,_,C,V,L){return r(this.useExperimentalFeatures),r(f instanceof Float32Array),r(f.length%x==0),r(x>=3),r(_>=0&&_<=f.length/x),C?(r(C instanceof Float32Array),r(C.length%V==0),r(V>=3),r(f.length/x==C.length/V),p(n.exports.meshopt_simplifyPoints,f,f.length/x,x*4,C,V*4,L,_)):p(n.exports.meshopt_simplifyPoints,f,f.length/x,x*4,void 0,0,0,_)}}}();function L_(e){e=y(e,y.EMPTY_OBJECT);let t=e.resourceCache,n=e.gltf,i=e.bufferViewId,o=e.gltfResource,r=e.baseResource,s=e.cacheKey,a=n.bufferViews[i],c=a.buffer,d=a.byteOffset,u=a.byteLength,m=!1,p,g,f,x;if(ri(a,"EXT_meshopt_compression")){let C=a.extensions.EXT_meshopt_compression;c=C.buffer,d=y(C.byteOffset,0),u=C.byteLength,m=!0,p=C.byteStride,g=C.count,f=C.mode,x=y(C.filter,"NONE")}let _=n.buffers[c];this._hasMeshopt=m,this._meshoptByteStride=p,this._meshoptCount=g,this._meshoptMode=f,this._meshoptFilter=x,this._resourceCache=t,this._gltfResource=o,this._baseResource=r,this._buffer=_,this._bufferId=c,this._byteOffset=d,this._byteLength=u,this._cacheKey=s,this._bufferLoader=void 0,this._typedArray=void 0,this._state=Xt.UNLOADED,this._promise=void 0}l(Object.create)&&(L_.prototype=Object.create(to.prototype),L_.prototype.constructor=L_);Object.defineProperties(L_.prototype,{cacheKey:{get:function(){return this._cacheKey}},typedArray:{get:function(){return this._typedArray}}});async function Tke(e){try{let t=Ske(e);if(e._bufferLoader=t,await t.load(),e.isDestroyed())return;let n=t.typedArray,i=new Uint8Array(n.buffer,n.byteOffset+e._byteOffset,e._byteLength);if(e.unload(),e._typedArray=i,e._hasMeshopt){let o=e._meshoptCount,r=e._meshoptByteStride,s=new Uint8Array(o*r);dce.decodeGltfBuffer(s,o,r,e._typedArray,e._meshoptMode,e._meshoptFilter),e._typedArray=s}return e._state=Xt.READY,e}catch(t){if(e.isDestroyed())return;throw e.unload(),e._state=Xt.FAILED,e.getError("Failed to load buffer view",t)}}L_.prototype.load=async function(){return l(this._promise)?this._promise:(this._state=Xt.LOADING,this._promise=Tke(this),this._promise)};function Ske(e){let t=e._resourceCache,n=e._buffer;if(l(n.uri)){let o=e._baseResource.getDerivedResource({url:n.uri});return t.getExternalBufferLoader({resource:o})}return t.getEmbeddedBufferLoader({parentResource:e._gltfResource,bufferId:e._bufferId})}L_.prototype.unload=function(){l(this._bufferLoader)&&!this._bufferLoader.isDestroyed()&&this._resourceCache.unload(this._bufferLoader),this._bufferLoader=void 0,this._typedArray=void 0};var jC=L_;var t1n=T(S(),1);var KCn=T(S(),1);function Ir(){}Ir._maxDecodingConcurrency=Math.max(Yt.hardwareConcurrency-1,1);Ir._decoderTaskProcessor=void 0;Ir._taskProcessorReady=!1;Ir._error=void 0;Ir._getDecoderTaskProcessor=function(){if(!l(Ir._decoderTaskProcessor)){let e=new hi("decodeDraco",Ir._maxDecodingConcurrency);e.initWebAssemblyModule({wasmBinaryFile:"ThirdParty/draco_decoder.wasm"}).then(function(t){t?Ir._taskProcessorReady=!0:Ir._error=new ue("Draco decoder could not be initialized.")}).catch(t=>{Ir._error=t}),Ir._decoderTaskProcessor=e}return Ir._decoderTaskProcessor};Ir.decodePointCloud=function(e){let t=Ir._getDecoderTaskProcessor();if(l(Ir._error))throw Ir._error;if(Ir._taskProcessorReady)return t.scheduleTask(e,[e.buffer.buffer])};Ir.decodeBufferView=function(e){let t=Ir._getDecoderTaskProcessor();if(l(Ir._error))throw Ir._error;if(Ir._taskProcessorReady)return t.scheduleTask(e,[e.array.buffer])};var i0=Ir;function _g(e){e=y(e,y.EMPTY_OBJECT);let t=e.resourceCache,n=e.gltf,i=e.draco,o=e.gltfResource,r=e.baseResource,s=e.cacheKey;this._resourceCache=t,this._gltfResource=o,this._baseResource=r,this._gltf=n,this._draco=i,this._cacheKey=s,this._bufferViewLoader=void 0,this._bufferViewTypedArray=void 0,this._decodePromise=void 0,this._decodedData=void 0,this._state=Xt.UNLOADED,this._promise=void 0,this._dracoError=void 0}l(Object.create)&&(_g.prototype=Object.create(to.prototype),_g.prototype.constructor=_g);Object.defineProperties(_g.prototype,{cacheKey:{get:function(){return this._cacheKey}},decodedData:{get:function(){return this._decodedData}}});async function Cke(e){let t=e._resourceCache;try{let n=t.getBufferViewLoader({gltf:e._gltf,bufferViewId:e._draco.bufferView,gltfResource:e._gltfResource,baseResource:e._baseResource});return e._bufferViewLoader=n,await n.load(),e.isDestroyed()?void 0:(e._bufferViewTypedArray=n.typedArray,e._state=Xt.PROCESSING,e)}catch(n){if(e.isDestroyed())return;uce(e,n)}}_g.prototype.load=async function(){return l(this._promise)?this._promise:(this._state=Xt.LOADING,this._promise=Cke(this),this._promise)};function uce(e,t){throw e.unload(),e._state=Xt.FAILED,e.getError("Failed to load Draco",t)}async function Vke(e,t){try{let n=await t;return e.isDestroyed()?void 0:(e.unload(),e._decodedData={indices:n.indexArray,vertexAttributes:n.attributeData},e._state=Xt.READY,e._baseResource)}catch(n){if(e.isDestroyed())return;e._dracoError=n}}_g.prototype.process=function(e){if(this._state===Xt.READY)return!0;if(this._state!==Xt.PROCESSING||(l(this._dracoError)&&uce(this,this._dracoError),!l(this._bufferViewTypedArray))||l(this._decodePromise))return!1;let t=this._draco,i=this._gltf.bufferViews,o=t.bufferView,r=i[o],s=t.attributes,a={array:new Uint8Array(this._bufferViewTypedArray),bufferView:r,compressedAttributes:s,dequantizeInShader:!0},c=i0.decodeBufferView(a);if(!l(c))return!1;this._decodePromise=Vke(this,c)};_g.prototype.unload=function(){l(this._bufferViewLoader)&&this._resourceCache.unload(this._bufferViewLoader),this._bufferViewLoader=void 0,this._bufferViewTypedArray=void 0,this._decodedData=void 0,this._gltf=void 0};var qC=_g;var d1n=T(S(),1);function o0(e){e=y(e,y.EMPTY_OBJECT);let t=e.resourceCache,n=e.gltf,i=e.imageId,o=e.gltfResource,r=e.baseResource,s=e.cacheKey,a=n.images[i],c=a.bufferView,d=a.uri;this._resourceCache=t,this._gltfResource=o,this._baseResource=r,this._gltf=n,this._bufferViewId=c,this._uri=d,this._cacheKey=s,this._bufferViewLoader=void 0,this._image=void 0,this._mipLevels=void 0,this._state=Xt.UNLOADED,this._promise=void 0}l(Object.create)&&(o0.prototype=Object.create(to.prototype),o0.prototype.constructor=o0);Object.defineProperties(o0.prototype,{cacheKey:{get:function(){return this._cacheKey}},image:{get:function(){return this._image}},mipLevels:{get:function(){return this._mipLevels}}});o0.prototype.load=function(){return l(this._promise)?this._promise:l(this._bufferViewId)?(this._promise=Lke(this),this._promise):(this._promise=Rke(this),this._promise)};function mce(e){let t;return Array.isArray(e)&&(t=e.slice(1,e.length).map(function(n){return n.bufferView}),e=e[0]),{image:e,mipLevels:t}}async function Lke(e){e._state=Xt.LOADING;let t=e._resourceCache;try{let n=t.getBufferViewLoader({gltf:e._gltf,bufferViewId:e._bufferViewId,gltfResource:e._gltfResource,baseResource:e._baseResource});if(e._bufferViewLoader=n,await n.load(),e.isDestroyed())return;let i=n.typedArray,o=await Gke(i);if(e.isDestroyed())return;let r=mce(o);return e.unload(),e._image=r.image,e._mipLevels=r.mipLevels,e._state=Xt.READY,e}catch(n){return e.isDestroyed()?void 0:hce(e,n,"Failed to load embedded image")}}async function Rke(e){e._state=Xt.LOADING;let t=e._baseResource,n=e._uri,i=t.getDerivedResource({url:n});try{let o=await Xke(i);if(e.isDestroyed())return;let r=mce(o);return e.unload(),e._image=r.image,e._mipLevels=r.mipLevels,e._state=Xt.READY,e}catch(o){return e.isDestroyed()?void 0:hce(e,o,`Failed to load image: ${n}`)}}function hce(e,t,n){return e.unload(),e._state=Xt.FAILED,Promise.reject(e.getError(n,t))}function Zke(e){let t=e.subarray(0,2),n=e.subarray(0,4),i=e.subarray(8,12);if(t[0]===255&&t[1]===216)return"image/jpeg";if(t[0]===137&&t[1]===80)return"image/png";if(t[0]===171&&t[1]===75)return"image/ktx2";if(n[0]===82&&n[1]===73&&n[2]===70&&n[3]===70&&i[0]===87&&i[1]===69&&i[2]===66&&i[3]===80)return"image/webp";throw new ue("Image format is not recognized")}async function Gke(e){let t=Zke(e);if(t==="image/ktx2"){let n=new Uint8Array(e);return Rl(n)}return o0._loadImageFromTypedArray({uint8Array:e,format:t,flipY:!1,skipColorSpaceConversion:!0})}var Eke=/(^data:image\/ktx2)|(\.ktx2$)/i;function Xke(e){let t=e.getUrlComponent(!1,!0);return Eke.test(t)?Rl(e):e.fetchImage({skipColorSpaceConversion:!0,preferImageBitmap:!0})}o0.prototype.unload=function(){l(this._bufferViewLoader)&&!this._bufferViewLoader.isDestroyed()&&this._resourceCache.unload(this._bufferViewLoader),this._bufferViewLoader=void 0,this._uri=void 0,this._image=void 0,this._mipLevels=void 0,this._gltf=void 0};o0._loadImageFromTypedArray=Yx;var $C=o0;var V1n=T(S(),1);var m1n=T(S(),1),Ike={TEXTURE:0,PROGRAM:1,BUFFER:2,NUMBER_OF_JOB_TYPES:3},Ga=Object.freeze(Ike);function Tg(e){e=y(e,y.EMPTY_OBJECT);let t=e.resourceCache,n=e.gltf,i=e.accessorId,o=e.gltfResource,r=e.baseResource,s=e.draco,a=e.cacheKey,c=y(e.asynchronous,!0),d=y(e.loadBuffer,!1),u=y(e.loadTypedArray,!1),m=n.accessors[i].componentType;this._resourceCache=t,this._gltfResource=o,this._baseResource=r,this._gltf=n,this._accessorId=i,this._indexDatatype=m,this._draco=s,this._cacheKey=a,this._asynchronous=c,this._loadBuffer=d,this._loadTypedArray=u,this._bufferViewLoader=void 0,this._dracoLoader=void 0,this._typedArray=void 0,this._buffer=void 0,this._state=Xt.UNLOADED,this._promise=void 0}l(Object.create)&&(Tg.prototype=Object.create(to.prototype),Tg.prototype.constructor=Tg);Object.defineProperties(Tg.prototype,{cacheKey:{get:function(){return this._cacheKey}},buffer:{get:function(){return this._buffer}},typedArray:{get:function(){return this._typedArray}},indexDatatype:{get:function(){return this._indexDatatype}}});var Wke=new tK;Tg.prototype.load=async function(){return l(this._promise)?this._promise:l(this._draco)?(this._promise=Pke(this),this._promise):(this._promise=vke(this),this._promise)};async function Pke(e){e._state=Xt.LOADING;let t=e._resourceCache;try{let n=t.getDracoLoader({gltf:e._gltf,draco:e._draco,gltfResource:e._gltfResource,baseResource:e._baseResource});return e._dracoLoader=n,await n.load(),e.isDestroyed()?void 0:(e._state=Xt.LOADED,e)}catch(n){if(e.isDestroyed())return;eK(e,n)}}async function vke(e){let t=e._gltf,n=e._accessorId,o=t.accessors[n].bufferView;e._state=Xt.LOADING;let r=e._resourceCache;try{let s=r.getBufferViewLoader({gltf:t,bufferViewId:o,gltfResource:e._gltfResource,baseResource:e._baseResource});if(e._bufferViewLoader=s,await s.load(),e.isDestroyed())return;let a=s.typedArray;return e._typedArray=wke(e,a),e._state=Xt.PROCESSING,e}catch(s){if(e.isDestroyed())return;eK(e,s)}}function wke(e,t){let n=e._gltf,i=e._accessorId,o=n.accessors[i],r=o.count,s=o.componentType,a=Me.getSizeInBytes(s),c=t.buffer,d=t.byteOffset+o.byteOffset;if(d%a!==0){let m=r*a,p=new Uint8Array(c,d,m);c=new Uint8Array(p).buffer,d=0,Is("index-buffer-unaligned",`The index array is not aligned to a ${a}-byte boundary.`)}let u;return s===Me.UNSIGNED_BYTE?u=new Uint8Array(c,d,r):s===Me.UNSIGNED_SHORT?u=new Uint16Array(c,d,r):s===Me.UNSIGNED_INT&&(u=new Uint32Array(c,d,r)),u}function eK(e,t){throw e.unload(),e._state=Xt.FAILED,e.getError("Failed to load index buffer",t)}function tK(){this.typedArray=void 0,this.indexDatatype=void 0,this.context=void 0,this.buffer=void 0}tK.prototype.set=function(e,t,n){this.typedArray=e,this.indexDatatype=t,this.context=n};tK.prototype.execute=function(){this.buffer=fce(this.typedArray,this.indexDatatype,this.context)};function fce(e,t,n){let i=ft.createIndexBuffer({typedArray:e,context:n,usage:Ne.STATIC_DRAW,indexDatatype:t});return i.vertexArrayDestroyable=!1,i}Tg.prototype.process=function(e){if(this._state===Xt.READY)return!0;if(this._state!==Xt.LOADED&&this._state!==Xt.PROCESSING)return!1;let t=this._typedArray,n=this._indexDatatype;if(l(this._dracoLoader))try{this._dracoLoader.process(e)&&(t=this._dracoLoader.decodedData.indices.typedArray,this._typedArray=t,n=Q.fromTypedArray(t),this._indexDatatype=n)}catch(o){eK(this,o)}if(!l(t))return!1;let i;if(this._loadBuffer&&this._asynchronous){let o=Wke;if(o.set(t,n,e.context),!e.jobScheduler.execute(o,Ga.BUFFER))return!1;i=o.buffer}else this._loadBuffer&&(i=fce(t,n,e.context));return this.unload(),this._buffer=i,this._typedArray=this._loadTypedArray?t:void 0,this._state=Xt.READY,this._resourceCache.statistics.addGeometryLoader(this),!0};Tg.prototype.unload=function(){l(this._buffer)&&this._buffer.destroy();let e=this._resourceCache;l(this._bufferViewLoader)&&!this._bufferViewLoader.isDestroyed()&&e.unload(this._bufferViewLoader),l(this._dracoLoader)&&e.unload(this._dracoLoader),this._bufferViewLoader=void 0,this._dracoLoader=void 0,this._typedArray=void 0,this._buffer=void 0,this._gltf=void 0};var e1=Tg;var wRn=T(S(),1);var J1n=T(S(),1);var Z1n=T(S(),1);function Fke(e,t,n){if(n=y(n,!1),n){let i=e.indexOf(t);if(i>-1)return i}return e.push(t),e.length-1}var bs=Fke;var v1n=T(S(),1);var X1n=T(S(),1);function Ake(e,t){return l(e.extensionsUsed)&&e.extensionsUsed.indexOf(t)>=0}var or=Ake;function Jt(){}Jt.objectLegacy=function(e,t){if(l(e)){for(let n in e)if(Object.prototype.hasOwnProperty.call(e,n)){let i=e[n],o=t(i,n);if(l(o))return o}}};Jt.object=function(e,t){if(l(e)){let n=e.length;for(let i=0;i0)return i.byteStride}return Q.getSizeInBytes(t.componentType)*Sd(t.type)}var vl=Nke;function kke(e){Ie.accessor(e,function(n){l(n.bufferView)&&(n.byteOffset=y(n.byteOffset,0))}),Ie.bufferView(e,function(n){l(n.buffer)&&(n.byteOffset=y(n.byteOffset,0))}),Ie.mesh(e,function(n){Ie.meshPrimitive(n,function(i){if(i.mode=y(i.mode,ne.TRIANGLES),!l(i.material)){l(e.materials)||(e.materials=[]);let o={name:"default"};i.material=bs(e.materials,o)}})}),Ie.accessorContainingVertexAttributeData(e,function(n){let i=e.accessors[n],o=i.bufferView;if(i.normalized=y(i.normalized,!1),l(o)){let r=e.bufferViews[o];r.byteStride=vl(e,i),r.target=ne.ARRAY_BUFFER}}),Ie.accessorContainingIndexData(e,function(n){let o=e.accessors[n].bufferView;if(l(o)){let r=e.bufferViews[o];r.target=ne.ELEMENT_ARRAY_BUFFER}}),Ie.material(e,function(n){let i=y(n.extensions,y.EMPTY_OBJECT),o=i.KHR_materials_common;if(l(o)){let c=o.technique,d=l(o.values)?o.values:{};o.values=d,d.ambient=l(d.ambient)?d.ambient:[0,0,0,1],d.emission=l(d.emission)?d.emission:[0,0,0,1],d.transparency=y(d.transparency,1),c!=="CONSTANT"&&(d.diffuse=l(d.diffuse)?d.diffuse:[0,0,0,1],c!=="LAMBERT"&&(d.specular=l(d.specular)?d.specular:[0,0,0,1],d.shininess=y(d.shininess,0))),o.transparent=y(o.transparent,!1),o.doubleSided=y(o.doubleSided,!1);return}n.emissiveFactor=y(n.emissiveFactor,[0,0,0]),n.alphaMode=y(n.alphaMode,"OPAQUE"),n.doubleSided=y(n.doubleSided,!1),n.alphaMode==="MASK"&&(n.alphaCutoff=y(n.alphaCutoff,.5));let r=i.KHR_techniques_webgl;l(r)&&Ie.materialValue(n,function(c){l(c.index)&&R_(c)}),R_(n.emissiveTexture),R_(n.normalTexture),R_(n.occlusionTexture);let s=n.pbrMetallicRoughness;l(s)&&(s.baseColorFactor=y(s.baseColorFactor,[1,1,1,1]),s.metallicFactor=y(s.metallicFactor,1),s.roughnessFactor=y(s.roughnessFactor,1),R_(s.baseColorTexture),R_(s.metallicRoughnessTexture));let a=i.KHR_materials_pbrSpecularGlossiness;l(a)&&(a.diffuseFactor=y(a.diffuseFactor,[1,1,1,1]),a.specularFactor=y(a.specularFactor,[1,1,1]),a.glossinessFactor=y(a.glossinessFactor,1),R_(a.specularGlossinessTexture))}),Ie.animation(e,function(n){Ie.animationSampler(n,function(i){i.interpolation=y(i.interpolation,"LINEAR")})});let t=Uke(e);return Ie.node(e,function(n,i){l(t[i])||l(n.translation)||l(n.rotation)||l(n.scale)?(n.translation=y(n.translation,[0,0,0]),n.rotation=y(n.rotation,[0,0,0,1]),n.scale=y(n.scale,[1,1,1])):n.matrix=y(n.matrix,[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])}),Ie.sampler(e,function(n){n.wrapS=y(n.wrapS,ne.REPEAT),n.wrapT=y(n.wrapT,ne.REPEAT)}),l(e.scenes)&&!l(e.scene)&&(e.scene=0),e}function Uke(e){let t={};return Ie.animation(e,function(n){Ie.animationChannel(n,function(i){let o=i.target,r=o.node,s=o.path;(s==="translation"||s==="rotation"||s==="scale")&&(t[r]=!0)})}),t}function R_(e){l(e)&&(e.texCoord=y(e.texCoord,0))}var yI=kke;var $1n=T(S(),1);function Dke(e){return Ie.shader(e,function(t){K5(t)}),Ie.buffer(e,function(t){K5(t)}),Ie.image(e,function(t){K5(t)}),K5(e),e}function K5(e){e.extras=l(e.extras)?e.extras:{},e.extras._pipeline=l(e.extras._pipeline)?e.extras._pipeline:{}}var Sg=Dke;var pVn=T(S(),1);var sVn=T(S(),1);var nVn=T(S(),1);function Bke(e,t){let n=e.extensionsRequired;if(l(n)){let i=n.indexOf(t);i>=0&&n.splice(i,1),n.length===0&&delete e.extensionsRequired}}var xI=Bke;function Yke(e,t){let n=e.extensionsUsed;if(l(n)){let i=n.indexOf(t);i>=0&&n.splice(i,1),xI(e,t),n.length===0&&delete e.extensionsUsed}}var Z_=Yke;var Oke=4;function Hke(e){if(Em(e)!=="glTF")throw new ue("File is not valid binary glTF");let n=pce(e,0,5),i=n[1];if(i!==1&&i!==2)throw new ue("Binary glTF version is not 1 or 2");return i===1?zke(e,n):Kke(e,n)}function pce(e,t,n){let i=new DataView(e.buffer),o=new Array(n);for(let r=0;r0){let m=y(u.binary_glTF,u.KHR_binary_glTF);l(m)&&(m.extras._pipeline.source=d,delete m.uri)}return Z_(c,"KHR_binary_glTF"),c}function Kke(e,t){let n=t[2],i=12,o,r;for(;i0){let a=s[0];a.extras._pipeline.source=r}}return o}var _I=Hke;var xVn=T(S(),1);function Jke(e){return Ie.shader(e,function(t){J5(t)}),Ie.buffer(e,function(t){J5(t)}),Ie.image(e,function(t){J5(t)}),J5(e),e}function J5(e){l(e.extras)&&(l(e.extras._pipeline)&&delete e.extras._pipeline,Object.keys(e.extras).length===0&&delete e.extras)}var TI=Jke;var eRn=T(S(),1);var CVn=T(S(),1);function Qke(e,t){let n=e.extensionsUsed;l(n)||(n=[],e.extensionsUsed=n),bs(n,t,!0)}var Zu=Qke;var PVn=T(S(),1);var RVn=T(S(),1);function jke(e){switch(e){case Q.BYTE:return function(t,n,i,o,r){for(let s=0;s-1:!1}var tUe=[ne.ZERO,ne.ONE,ne.SRC_COLOR,ne.ONE_MINUS_SRC_COLOR,ne.SRC_ALPHA,ne.ONE_MINUS_SRC_ALPHA,ne.DST_ALPHA,ne.ONE_MINUS_DST_ALPHA,ne.DST_COLOR,ne.ONE_MINUS_DST_COLOR];function nUe(e,t){if(!l(e))return t;for(let n=0;n<4;n++)if(tUe.indexOf(e[n])===-1)return t;return e}function iUe(e){let t={},n={},i=e.techniques;return l(i)&&(Ie.technique(e,function(o,r){let s=o.states;if(l(s)){let a=n[r]={};if(bce(s,ne.BLEND)){a.alphaMode="BLEND";let c=s.functions;l(c)&&(l(c.blendEquationSeparate)||l(c.blendFuncSeparate))&&(t[r]={blendEquation:y(c.blendEquationSeparate,$ke),blendFactors:nUe(c.blendFuncSeparate,eUe)})}bce(s,ne.CULL_FACE)||(a.doubleSided=!0),delete o.states}}),Object.keys(t).length>0&&(l(e.extensions)||(e.extensions={}),Zu(e,"KHR_blend")),Ie.material(e,function(o){if(l(o.technique)){let r=n[o.technique];Ie.objectLegacy(r,function(a,c){o[c]=a});let s=t[o.technique];l(s)&&(l(o.extensions)||(o.extensions={}),o.extensions.KHR_blend=s)}})),e}var SI=iUe;var qVn=T(S(),1);var OVn=T(S(),1);function oUe(e,t){let n=e.extensionsRequired;l(n)||(n=[],e.extensionsRequired=n),bs(n,t,!0),Zu(e,t)}var CI=oUe;function rUe(e){let t=e.techniques,n={},i={},o={};if(l(t)){let r={programs:[],shaders:[],techniques:[]},s=e.glExtensionsUsed;delete e.glExtensionsUsed,Ie.technique(e,function(a,c){let d={name:a.name,program:void 0,attributes:{},uniforms:{}},u;if(Ie.techniqueAttribute(a,function(m,p){u=a.parameters[m],d.attributes[p]={semantic:u.semantic}}),Ie.techniqueUniform(a,function(m,p){u=a.parameters[m],d.uniforms[p]={count:u.count,node:u.node,type:u.type,semantic:u.semantic,value:u.value},l(n[c])||(n[c]={}),n[c][m]=p}),l(o[a.program]))d.program=o[a.program];else{let m=e.programs[a.program],p={name:m.name,fragmentShader:void 0,vertexShader:void 0,glExtensions:s},g=e.shaders[m.fragmentShader];p.fragmentShader=bs(r.shaders,g,!0);let f=e.shaders[m.vertexShader];p.vertexShader=bs(r.shaders,f,!0),d.program=bs(r.programs,p),o[a.program]=d.program}i[c]=bs(r.techniques,d)}),r.techniques.length>0&&(l(e.extensions)||(e.extensions={}),e.extensions.KHR_techniques_webgl=r,Zu(e,"KHR_techniques_webgl"),CI(e,"KHR_techniques_webgl"))}return Ie.material(e,function(r){if(l(r.technique)){let s={technique:i[r.technique]};Ie.objectLegacy(r.values,function(a,c){l(s.values)||(s.values={});let d=n[r.technique][c];l(d)&&(s.values[d]=a)}),l(r.extensions)||(r.extensions={}),r.extensions.KHR_techniques_webgl=s}delete r.technique,delete r.values}),delete e.techniques,delete e.programs,delete e.shaders,e}var VI=rUe;var dLn=T(S(),1);var iLn=T(S(),1);function sUe(e,t){po.typeOf.object("material",e),po.defined("handler",t);let n=e.pbrMetallicRoughness;if(l(n)){if(l(n.baseColorTexture)){let r=n.baseColorTexture,s=t(r.index,r);if(l(s))return s}if(l(n.metallicRoughnessTexture)){let r=n.metallicRoughnessTexture,s=t(r.index,r);if(l(s))return s}}let{extensions:i}=e;if(l(i)){let r=i.KHR_materials_pbrSpecularGlossiness;if(l(r)){if(l(r.diffuseTexture)){let c=r.diffuseTexture,d=t(c.index,c);if(l(d))return d}if(l(r.specularGlossinessTexture)){let c=r.specularGlossinessTexture,d=t(c.index,c);if(l(d))return d}}let s=i.KHR_materials_specular;if(l(s)){let{specularTexture:c,specularColorTexture:d}=s;if(l(c)){let u=t(c.index,c);if(l(u))return u}if(l(d)){let u=t(d.index,d);if(l(u))return u}}let a=i.KHR_materials_common;if(l(a)&&l(a.values)){let{diffuse:c,ambient:d,emission:u,specular:m}=a.values;if(l(c)&&l(c.index)){let p=t(c.index,c);if(l(p))return p}if(l(d)&&l(d.index)){let p=t(d.index,d);if(l(p))return p}if(l(u)&&l(u.index)){let p=t(u.index,u);if(l(p))return p}if(l(m)&&l(m.index)){let p=t(m.index,m);if(l(p))return p}}}let o=Ie.materialValue(e,function(r){if(l(r.index)){let s=t(r.index,r);if(l(s))return s}});if(l(o))return o;if(l(e.emissiveTexture)){let r=e.emissiveTexture,s=t(r.index,r);if(l(s))return s}if(l(e.normalTexture)){let r=e.normalTexture,s=t(r.index,r);if(l(s))return s}if(l(e.occlusionTexture)){let r=e.occlusionTexture,s=t(r.index,r);if(l(s))return s}}var t1=sUe;var gce=["mesh","node","material","accessor","bufferView","buffer","texture","sampler","image"];function aUe(e,t){return t=y(t,gce),gce.forEach(function(n){t.indexOf(n)>-1&&lUe(e,n)}),e}var cUe={accessor:"accessors",buffer:"buffers",bufferView:"bufferViews",image:"images",node:"nodes",material:"materials",mesh:"meshes",sampler:"samplers",texture:"textures"};function lUe(e,t){let n=cUe[t],i=e[n];if(l(i)){let o=0,r=ff[t](e),s=i.length;for(let a=0;at&&o.attributes[c]--}),Ie.meshPrimitiveTarget(o,function(a){Ie.meshPrimitiveTargetAttribute(a,function(c,d){c>t&&a[d]--})});let r=o.indices;l(r)&&r>t&&o.indices--;let s=o.extensions;l(s)&&l(s.CESIUM_primitive_outline)&&s.CESIUM_primitive_outline.indices>t&&--s.CESIUM_primitive_outline.indices})}),Ie.skin(e,function(i){l(i.inverseBindMatrices)&&i.inverseBindMatrices>t&&i.inverseBindMatrices--}),Ie.animation(e,function(i){Ie.animationSampler(i,function(o){l(o.input)&&o.input>t&&o.input--,l(o.output)&&o.output>t&&o.output--})})};hf.buffer=function(e,t){e.buffers.splice(t,1),Ie.bufferView(e,function(i){l(i.buffer)&&i.buffer>t&&i.buffer--,l(i.extensions)&&l(i.extensions.EXT_meshopt_compression)&&i.extensions.EXT_meshopt_compression.buffer--})};hf.bufferView=function(e,t){if(e.bufferViews.splice(t,1),Ie.accessor(e,function(i){l(i.bufferView)&&i.bufferView>t&&i.bufferView--}),Ie.shader(e,function(i){l(i.bufferView)&&i.bufferView>t&&i.bufferView--}),Ie.image(e,function(i){l(i.bufferView)&&i.bufferView>t&&i.bufferView--}),or(e,"KHR_draco_mesh_compression")&&Ie.mesh(e,function(i){Ie.meshPrimitive(i,function(o){l(o.extensions)&&l(o.extensions.KHR_draco_mesh_compression)&&o.extensions.KHR_draco_mesh_compression.bufferView>t&&o.extensions.KHR_draco_mesh_compression.bufferView--})}),or(e,"EXT_feature_metadata")){let o=e.extensions.EXT_feature_metadata.featureTables;for(let r in o)if(o.hasOwnProperty(r)){let a=o[r].properties;if(l(a)){for(let c in a)if(a.hasOwnProperty(c)){let d=a[c];l(d.bufferView)&&d.bufferView>t&&d.bufferView--,l(d.arrayOffsetBufferView)&&d.arrayOffsetBufferView>t&&d.arrayOffsetBufferView--,l(d.stringOffsetBufferView)&&d.stringOffsetBufferView>t&&d.stringOffsetBufferView--}}}}if(or(e,"EXT_structural_metadata")){let o=e.extensions.EXT_structural_metadata.propertyTables;if(l(o)){let r=o.length;for(let s=0;st&&u.values--,l(u.arrayOffsets)&&u.arrayOffsets>t&&u.arrayOffsets--,l(u.stringOffsets)&&u.stringOffsets>t&&u.stringOffsets--}}}}};hf.image=function(e,t){e.images.splice(t,1),Ie.texture(e,function(i){l(i.source)&&i.source>t&&--i.source;let o=i.extensions;l(o)&&l(o.EXT_texture_webp)&&o.EXT_texture_webp.source>t?--i.extensions.EXT_texture_webp.source:l(o)&&l(o.KHR_texture_basisu)&&o.KHR_texture_basisu.source>t&&--i.extensions.KHR_texture_basisu.source})};hf.mesh=function(e,t){e.meshes.splice(t,1),Ie.node(e,function(i){l(i.mesh)&&(i.mesh>t?i.mesh--:i.mesh===t&&delete i.mesh)})};hf.node=function(e,t){e.nodes.splice(t,1),Ie.skin(e,function(i){l(i.skeleton)&&i.skeleton>t&&i.skeleton--,i.joints=i.joints.map(function(o){return o>t?o-1:o})}),Ie.animation(e,function(i){Ie.animationChannel(i,function(o){l(o.target)&&l(o.target.node)&&o.target.node>t&&o.target.node--})}),Ie.technique(e,function(i){Ie.techniqueUniform(i,function(o){l(o.node)&&o.node>t&&o.node--})}),Ie.node(e,function(i){l(i.children)&&(i.children=i.children.filter(function(o){return o!==t}).map(function(o){return o>t?o-1:o}))}),Ie.scene(e,function(i){i.nodes=i.nodes.filter(function(o){return o!==t}).map(function(o){return o>t?o-1:o})})};hf.material=function(e,t){e.materials.splice(t,1),Ie.mesh(e,function(i){Ie.meshPrimitive(i,function(o){l(o.material)&&o.material>t&&o.material--})})};hf.sampler=function(e,t){e.samplers.splice(t,1),Ie.texture(e,function(i){l(i.sampler)&&i.sampler>t&&--i.sampler})};hf.texture=function(e,t){if(e.textures.splice(t,1),Ie.material(e,function(i){t1(i,function(o,r){r.index>t&&--r.index})}),or(e,"EXT_feature_metadata")){Ie.mesh(e,function(r){Ie.meshPrimitive(r,function(s){let a=s.extensions;if(l(a)&&l(a.EXT_feature_metadata)){let d=a.EXT_feature_metadata.featureIdTextures;if(l(d)){let u=d.length;for(let m=0;mt&&--g.index}}}})});let o=e.extensions.EXT_feature_metadata.featureTextures;for(let r in o)if(o.hasOwnProperty(r)){let a=o[r].properties;if(l(a)){for(let c in a)if(a.hasOwnProperty(c)){let u=a[c].texture;u.index>t&&--u.index}}}}if(or(e,"EXT_mesh_features")&&Ie.mesh(e,function(i){Ie.meshPrimitive(i,function(o){let r=o.extensions;if(l(r)&&l(r.EXT_mesh_features)){let a=r.EXT_mesh_features.featureIds;if(l(a)){let c=a.length;for(let d=0;dt&&--u.texture.index}}}})}),or(e,"EXT_structural_metadata")){let o=e.extensions.EXT_structural_metadata.propertyTextures;if(l(o)){let r=o.length;for(let s=0;st&&--u.index}}}}};function ff(){}ff.accessor=function(e){let t={};return Ie.mesh(e,function(n){Ie.meshPrimitive(n,function(i){Ie.meshPrimitiveAttribute(i,function(r){t[r]=!0}),Ie.meshPrimitiveTarget(i,function(r){Ie.meshPrimitiveTargetAttribute(r,function(s){t[s]=!0})});let o=i.indices;l(o)&&(t[o]=!0)})}),Ie.skin(e,function(n){l(n.inverseBindMatrices)&&(t[n.inverseBindMatrices]=!0)}),Ie.animation(e,function(n){Ie.animationSampler(n,function(i){l(i.input)&&(t[i.input]=!0),l(i.output)&&(t[i.output]=!0)})}),or(e,"EXT_mesh_gpu_instancing")&&Ie.node(e,function(n){l(n.extensions)&&l(n.extensions.EXT_mesh_gpu_instancing)&&Object.keys(n.extensions.EXT_mesh_gpu_instancing.attributes).forEach(function(i){let o=n.extensions.EXT_mesh_gpu_instancing.attributes[i];t[o]=!0})}),or(e,"CESIUM_primitive_outline")&&Ie.mesh(e,function(n){Ie.meshPrimitive(n,function(i){let o=i.extensions;if(l(o)&&l(o.CESIUM_primitive_outline)){let s=o.CESIUM_primitive_outline.indices;l(s)&&(t[s]=!0)}})}),t};ff.buffer=function(e){let t={};return Ie.bufferView(e,function(n){l(n.buffer)&&(t[n.buffer]=!0),l(n.extensions)&&l(n.extensions.EXT_meshopt_compression)&&(t[n.extensions.EXT_meshopt_compression.buffer]=!0)}),t};ff.bufferView=function(e){let t={};if(Ie.accessor(e,function(n){l(n.bufferView)&&(t[n.bufferView]=!0)}),Ie.shader(e,function(n){l(n.bufferView)&&(t[n.bufferView]=!0)}),Ie.image(e,function(n){l(n.bufferView)&&(t[n.bufferView]=!0)}),or(e,"KHR_draco_mesh_compression")&&Ie.mesh(e,function(n){Ie.meshPrimitive(n,function(i){l(i.extensions)&&l(i.extensions.KHR_draco_mesh_compression)&&(t[i.extensions.KHR_draco_mesh_compression.bufferView]=!0)})}),or(e,"EXT_feature_metadata")){let i=e.extensions.EXT_feature_metadata.featureTables;for(let o in i)if(i.hasOwnProperty(o)){let s=i[o].properties;if(l(s)){for(let a in s)if(s.hasOwnProperty(a)){let c=s[a];l(c.bufferView)&&(t[c.bufferView]=!0),l(c.arrayOffsetBufferView)&&(t[c.arrayOffsetBufferView]=!0),l(c.stringOffsetBufferView)&&(t[c.stringOffsetBufferView]=!0)}}}}if(or(e,"EXT_structural_metadata")){let i=e.extensions.EXT_structural_metadata.propertyTables;if(l(i)){let o=i.length;for(let r=0;r0&&(t[n.mesh]=!0)}}),t};function yce(e,t,n){let i=e.nodes[t];return l(i.mesh)||l(i.camera)||l(i.skin)||l(i.weights)||l(i.extras)||l(i.extensions)&&Object.keys(i.extensions).length!==0||l(n[t])?!1:!l(i.children)||i.children.filter(function(o){return!yce(e,o,n)}).length===0}ff.node=function(e){let t={};return Ie.skin(e,function(n){l(n.skeleton)&&(t[n.skeleton]=!0),Ie.skinJoint(n,function(i){t[i]=!0})}),Ie.animation(e,function(n){Ie.animationChannel(n,function(i){l(i.target)&&l(i.target.node)&&(t[i.target.node]=!0)})}),Ie.technique(e,function(n){Ie.techniqueUniform(n,function(i){l(i.node)&&(t[i.node]=!0)})}),Ie.node(e,function(n,i){yce(e,i,t)||(t[i]=!0)}),t};ff.material=function(e){let t={};return Ie.mesh(e,function(n){Ie.meshPrimitive(n,function(i){l(i.material)&&(t[i.material]=!0)})}),t};ff.texture=function(e){let t={};if(Ie.material(e,function(n){t1(n,function(i){t[i]=!0})}),or(e,"EXT_feature_metadata")){Ie.mesh(e,function(o){Ie.meshPrimitive(o,function(r){let s=r.extensions;if(l(s)&&l(s.EXT_feature_metadata)){let c=s.EXT_feature_metadata.featureIdTextures;if(l(c)){let d=c.length;for(let u=0;u0)for(s.mesh=n.meshes[c[0]],t=1;t0&&l(s.skin)){let u=e.skins[s.skin];u.skeleton=n.nodes[c[0]]}delete s.skeletons}l(s.jointName)&&delete s.jointName}),Ie.skin(e,function(s){l(s.inverseBindMatrices)&&(s.inverseBindMatrices=n.accessors[s.inverseBindMatrices]);let a=s.jointNames;if(l(a)){let c=[],d=a.length;for(t=0;t=0&&(a=r.substring(0,s),c=r.substring(s));let d,u=WUe[a];l(u)?(d=u+c,t[r]=d):l(IUe[a])||(d=`_${r}`,t[r]=d)}});for(let o in t)if(Object.prototype.hasOwnProperty.call(t,o)){let r=t[o],s=i.attributes[o];l(s)&&(delete i.attributes[o],i.attributes[r]=s)}})}),Ie.technique(e,function(n){Ie.techniqueParameter(n,function(i){let o=t[i.semantic];l(o)&&(i.semantic=o)})})}function vUe(e){Ie.camera(e,function(t){let n=t.perspective;if(l(n)){let i=n.aspectRatio;l(i)&&i===0&&delete n.aspectRatio;let o=n.yfov;l(o)&&o===0&&(n.yfov=1)}})}function oK(e,t){return l(t.byteStride)&&t.byteStride!==0?t.byteStride:vl(e,t)}function wUe(e){Ie.buffer(e,function(t){l(t.byteLength)||(t.byteLength=t.extras._pipeline.source.length)}),Ie.accessor(e,function(t){let n=t.bufferView;if(l(n)){let i=e.bufferViews[n],o=oK(e,t),r=t.byteOffset+t.count*o;i.byteLength=Math.max(y(i.byteLength,0),r)}})}function FUe(e){let t,n,i,o=e.bufferViews,r={};Ie.accessorContainingVertexAttributeData(e,function(a){let c=e.accessors[a];l(c.bufferView)&&(r[c.bufferView]=!0)});let s={};Ie.accessor(e,function(a){l(a.bufferView)&&(s[a.bufferView]=y(s[a.bufferView],[]),s[a.bufferView].push(a))});for(let a in s)if(Object.prototype.hasOwnProperty.call(s,a)){i=o[a];let c=s[a];c.sort(function(p,g){return p.byteOffset-g.byteOffset});let d=0,u=0,m=c.length;for(t=0;t=0;--r)if(i[r]===t){i.splice(r,1);return}}}),Ie.node(e,function(n,i){if(l(n.children)){let o=n.children.indexOf(t);o>-1&&(n.children.splice(o,1),Sce(n)&&Cce(e,i))}}),delete e.nodes[t]}function MUe(e){return Ie.node(e,function(t,n){Sce(t)&&Cce(e,n)}),e}function NUe(e){Ie.animation(e,function(t){Ie.animationSampler(t,function(n){let i=e.accessors[n.input];if(!l(i.min)||!l(i.max)){let o=G_(e,i);i.min=o.min,i.max=o.max}})})}function kUe(e){Ie.accessor(e,function(t){if(l(t.min)||l(t.max)){let n=G_(e,t);l(t.min)&&(t.min=n.min),l(t.max)&&(t.max=n.max)}})}function UUe(e){e.asset=y(e.asset,{}),e.asset.version="2.0",Tce(e),TUe(e),MUe(e),SUe(e),CUe(e),LUe(e),ZUe(e),wUe(e),FUe(e),AUe(e),NUe(e),kUe(e),GUe(e),EUe(e),XUe(e),PUe(e),GI(e),vUe(e),SI(e),VI(e),VUe(e)}var DUe=["u_tex","u_diffuse","u_emission","u_diffuse_tex"],BUe=["u_diffuse","u_diffuse_mat"];function rK(e){e.pbrMetallicRoughness=l(e.pbrMetallicRoughness)?e.pbrMetallicRoughness:{},e.pbrMetallicRoughness.roughnessFactor=1,e.pbrMetallicRoughness.metallicFactor=0}function sK(e){return l(e.index)}function aK(e){return Array.isArray(e)&&e.length===4}function Vce(e){let t=new Array(4);t[3]=e[3];for(let n=0;n<3;n++){let i=e[n];i<=.04045?t[n]=e[n]*.07739938080495357:t[n]=Math.pow((i+.055)*.9478672985781991,2.4)}return t}function YUe(e,t){t=y(t,y.EMPTY_OBJECT);let n=y(t.baseColorTextureNames,DUe),i=y(t.baseColorFactorNames,BUe);Ie.material(e,function(o){Ie.materialValue(o,function(r,s){n.indexOf(s)!==-1&&sK(r)?(rK(o),o.pbrMetallicRoughness.baseColorTexture=r):i.indexOf(s)!==-1&&aK(r)&&(rK(o),o.pbrMetallicRoughness.baseColorFactor=Vce(r))})}),E_(e,"KHR_techniques_webgl"),E_(e,"KHR_blend")}function iK(e,t){l(t)&&(aK(t)?e.pbrMetallicRoughness.baseColorFactor=Vce(t):sK(t)&&(e.pbrMetallicRoughness.baseColorTexture=t))}function _ce(e,t){l(t)&&(aK(t)?e.emissiveFactor=t.slice(0,3):sK(t)&&(e.emissiveTexture=t))}function OUe(e){Ie.material(e,function(t){let n=y(t.extensions,y.EMPTY_OBJECT).KHR_materials_common;if(!l(n))return;let i=y(n.values,{}),o=i.ambient,r=i.diffuse,s=i.emission,a=i.transparency,c=n.doubleSided,d=n.transparent;rK(t),n.technique==="CONSTANT"?(Zu(e,"KHR_materials_unlit"),t.extensions=l(t.extensions)?t.extensions:{},t.extensions.KHR_materials_unlit={},iK(t,s),iK(t,o)):(iK(t,r),_ce(t,o),_ce(t,s)),l(c)&&(t.doubleSided=c),l(a)&&(l(t.pbrMetallicRoughness.baseColorFactor)?t.pbrMetallicRoughness.baseColorFactor[3]*=a:t.pbrMetallicRoughness.baseColorFactor=[1,1,1,a]),l(d)&&(t.alphaMode=d?"BLEND":"OPAQUE")}),E_(e,"KHR_materials_common")}var EI=pUe;var bRn=T(S(),1);var iRn=T(S(),1);var si={POSITION:"POSITION",NORMAL:"NORMAL",TANGENT:"TANGENT",TEXCOORD:"TEXCOORD",COLOR:"COLOR",JOINTS:"JOINTS",WEIGHTS:"WEIGHTS",FEATURE_ID:"_FEATURE_ID"};function HUe(e){switch(e){case si.POSITION:return"positionMC";case si.NORMAL:return"normalMC";case si.TANGENT:return"tangentMC";case si.TEXCOORD:return"texCoord";case si.COLOR:return"color";case si.JOINTS:return"joints";case si.WEIGHTS:return"weights";case si.FEATURE_ID:return"featureId"}}si.hasSetIndex=function(e){switch(e){case si.POSITION:case si.NORMAL:case si.TANGENT:return!1;case si.TEXCOORD:case si.COLOR:case si.JOINTS:case si.WEIGHTS:case si.FEATURE_ID:return!0}};si.fromGltfSemantic=function(e){let t=e,i=/^(\w+)_\d+$/.exec(e);switch(i!==null&&(t=i[1]),t){case"POSITION":return si.POSITION;case"NORMAL":return si.NORMAL;case"TANGENT":return si.TANGENT;case"TEXCOORD":return si.TEXCOORD;case"COLOR":return si.COLOR;case"JOINTS":return si.JOINTS;case"WEIGHTS":return si.WEIGHTS;case"_FEATURE_ID":return si.FEATURE_ID}};si.fromPntsSemantic=function(e){switch(e){case"POSITION":case"POSITION_QUANTIZED":return si.POSITION;case"RGBA":case"RGB":case"RGB565":return si.COLOR;case"NORMAL":case"NORMAL_OCT16P":return si.NORMAL;case"BATCH_ID":return si.FEATURE_ID}};si.getGlslType=function(e){switch(e){case si.POSITION:case si.NORMAL:case si.TANGENT:return"vec3";case si.TEXCOORD:return"vec2";case si.COLOR:return"vec4";case si.JOINTS:return"ivec4";case si.WEIGHTS:return"vec4";case si.FEATURE_ID:return"int"}};si.getVariableName=function(e,t){let n=HUe(e);return l(t)&&(n+=`_${t}`),n};var Tt=Object.freeze(si);function uc(){}uc.getError=function(e,t,n){let i=`Failed to load ${e}: ${t}`;l(n)&&l(n.message)&&(i+=` ${n.message}`);let o=new ue(i);return l(n)&&(o.stack=`Original stack: ${n.stack} Handler stack: ${o.stack}`),o};uc.getNodeTransform=function(e){return l(e.matrix)?e.matrix:M.fromTranslationQuaternionRotationScale(l(e.translation)?e.translation:h.ZERO,l(e.rotation)?e.rotation:we.IDENTITY,l(e.scale)?e.scale:h.ONE)};uc.getAttributeBySemantic=function(e,t,n){let i=e.attributes,o=i.length;for(let r=0;r>t};na.fromSubtreeJson=async function(e,t,n,i,o){let r=new na(e,i,o),s;l(t)?s={json:t,binary:void 0}:s=wDe(n);let a=s.json;r._subtreeJson=a;let c;if(ri(a,"3DTILES_metadata"))c=a.extensions["3DTILES_metadata"];else if(l(a.tileMetadata)){let V=a.tileMetadata;c=a.propertyTables[V]}let d=[];if(l(a.contentMetadata)){let V=a.contentMetadata.length;for(let L=0;L0;u=u||m;for(let p=0;p>BigInt(61)),d=c%2===0?yC.encode2D(i,o,r):yC.encode2D(i,r,o),u=Wp.fromFacePositionLevel(c,BigInt(d),i),m,p;if(l(s)){let g=(a.maximumHeight+a.minimumHeight)/2;m=n<4?a.minimumHeight:g,p=n<4?g:a.maximumHeight}else m=a.minimumHeight,p=a.maximumHeight;return{extensions:{"3DTILES_bounding_volume_S2":{token:Wp.getTokenFromId(u._cellId),minimumHeight:m,maximumHeight:p}}}}var i3e=new h,o3e=new h,pK=new h,r3e=new $;function Mce(e,t,n,i,o){if(t===0)return e;let r=h.unpack(e,0,o3e),s=$.unpack(e,3,r3e),a=Math.pow(2,-t),c=-1+(2*n+1)*a,d=-1+(2*i+1)*a,u=0,m=h.fromElements(a,a,1,i3e);l(o)&&(u=-1+(2*o+1)*a,m.z=a);let p=h.fromElements(c,d,u,pK);p=$.multiplyByVector(s,p,pK),p=h.add(p,r,pK);let g=$.clone(s);g=$.multiplyByScale(g,m,g);let f=new Array(12);return h.pack(p,f),$.pack(g,f,3),f}var s3e=new ce;function Nce(e,t,n,i,o){if(t===0)return e.slice();let r=ce.unpack(e,0,s3e),s=e[4],a=e[5],c=Math.pow(2,-t),d=c*r.width,u=W.negativePiToPi(r.west+n*d),m=W.negativePiToPi(u+d),p=c*r.height,g=W.negativePiToPi(r.south+i*p),f=W.negativePiToPi(g+p),x=s,_=a;if(l(o)){let C=c*(a-s);x+=o*C,_=x+C}return[u,g,m,f,x,_]}function a3e(e,t,n){let i=e._implicitTileset,o=t.implicitCoordinates.getChildCoordinates(n),r=Fce(i,o,n,!1,t),s=wce(void 0,i,o),a=i.subtreeUriTemplate.getDerivedResource({templateValues:o.getTemplateValues()}).url,c={boundingVolume:r,geometricError:s,refine:i.refine,contents:[{uri:a}]},d=kce(e,i.baseResource,c,t);return d.implicitTileset=i,d.implicitCoordinates=o,d}function kce(e,t,n,i){let o=e._tile.constructor;return new o(e._tileset,t,n,i)}Kc.prototype.hasProperty=function(e,t){return!1};Kc.prototype.getFeature=function(e){};Kc.prototype.applyDebugSettings=function(e,t){};Kc.prototype.applyStyle=function(e){};Kc.prototype.update=function(e,t){};Kc.prototype.pick=function(e,t,n){};Kc.prototype.isDestroyed=function(){return!1};Kc.prototype.destroy=function(){return this._implicitSubtree=this._implicitSubtree&&this._implicitSubtree.destroy(),me(this)};Kc._deriveBoundingBox=Mce;Kc._deriveBoundingRegion=Nce;Kc._deriveBoundingVolumeS2=Ace;var a1=Kc;var qYn=T(S(),1);var uEn=T(S(),1),c3e={NONE:0,REPEAT:1,MIRRORED_REPEAT:2},Al=Object.freeze(c3e);var DYn=T(S(),1);var wEn=T(S(),1);var pEn=T(S(),1);function c1(e,t){this._distance=t,this._normal=new Uce(e,this),this.onChangeCallback=void 0,this.index=-1}Object.defineProperties(c1.prototype,{distance:{get:function(){return this._distance},set:function(e){l(this.onChangeCallback)&&e!==this._distance&&this.onChangeCallback(this.index),this._distance=e}},normal:{get:function(){return this._normal},set:function(e){l(this.onChangeCallback)&&!h.equals(this._normal._cartesian3,e)&&this.onChangeCallback(this.index),h.clone(e,this._normal._cartesian3)}}});c1.fromPlane=function(e,t){return l(t)?(t.normal=e.normal,t.distance=e.distance):t=new c1(e.normal,e.distance),t};c1.clone=function(e,t){return l(t)?(t.normal=e.normal,t.distance=e.distance,t):new c1(e.normal,e.distance)};function Uce(e,t){this._clippingPlane=t,this._cartesian3=h.clone(e)}Object.defineProperties(Uce.prototype,{x:{get:function(){return this._cartesian3.x},set:function(e){l(this._clippingPlane.onChangeCallback)&&e!==this._cartesian3.x&&this._clippingPlane.onChangeCallback(this._clippingPlane.index),this._cartesian3.x=e}},y:{get:function(){return this._cartesian3.y},set:function(e){l(this._clippingPlane.onChangeCallback)&&e!==this._cartesian3.y&&this._clippingPlane.onChangeCallback(this._clippingPlane.index),this._cartesian3.y=e}},z:{get:function(){return this._cartesian3.z},set:function(e){l(this._clippingPlane.onChangeCallback)&&e!==this._cartesian3.z&&this._clippingPlane.onChangeCallback(this._clippingPlane.index),this._cartesian3.z=e}}});var w_=c1;function mc(e){e=y(e,y.EMPTY_OBJECT),this._planes=[],this._dirtyIndex=-1,this._multipleDirtyPlanes=!1,this._enabled=y(e.enabled,!0),this.modelMatrix=M.clone(y(e.modelMatrix,M.IDENTITY)),this.edgeColor=Y.clone(y(e.edgeColor,Y.WHITE)),this.edgeWidth=y(e.edgeWidth,0),this.planeAdded=new ge,this.planeRemoved=new ge,this._owner=void 0;let t=y(e.unionClippingRegions,!1);this._unionClippingRegions=t,this._testIntersection=t?Hce:zce,this._uint8View=void 0,this._float32View=void 0,this._clippingPlanesTexture=void 0;let n=e.planes;if(l(n)){let i=n.length;for(let o=0;o0&&(r=Kt.OUTSIDE);for(let s=0;s 2) { dimension = ceil(log2(float(u_extentsLength))); } int regionIndex = getPolygonIndex(dimension, v_textureCoordinates); for (int polygonIndex = 0; polygonIndex < u_polygonsLength; polygonIndex++) { ivec2 positionsLengthAndExtents = getPositionsLengthAndExtentsIndex(lastPolygonIndex); int positionsLength = positionsLengthAndExtents.x; int polygonExtentsIndex = positionsLengthAndExtents.y; lastPolygonIndex += 1; // Only compute signed distance for the relevant part of the atlas if (polygonExtentsIndex == regionIndex) { float clipAmount = czm_infinity; vec4 extents = getExtents(polygonExtentsIndex); vec2 textureOffset = vec2(mod(float(polygonExtentsIndex), dimension), floor(float(polygonExtentsIndex) / dimension)) / dimension; vec2 p = getCoordinates((v_textureCoordinates - textureOffset) * dimension, extents); float s = 1.0; // Check each edge for absolute distance for (int i = 0, j = positionsLength - 1; i < positionsLength; j = i, i++) { vec2 a = getPolygonPosition(lastPolygonIndex + i); vec2 b = getPolygonPosition(lastPolygonIndex + j); vec2 ab = b - a; vec2 pa = p - a; float t = dot(pa, ab) / dot(ab, ab); t = clamp(t, 0.0, 1.0); vec2 pq = pa - t * ab; float d = length(pq); // Inside / outside computation to determine sign bvec3 cond = bvec3(p.y >= a.y, p.y < b.y, ab.x * pa.y > ab.y * pa.x); if (all(cond) || all(not(cond))) s = -s; if (abs(d) < abs(clipAmount)) { clipAmount = d; } } // Normalize the range to [0,1] vec4 result = (s * vec4(clipAmount * length(extents.zw))) / 2.0 + 0.5; // In the case where we've iterated through multiple polygons, take the minimum out_FragColor = min(out_FragColor, result); } lastPolygonIndex += positionsLength; } }`;function zr(e){e=y(e,y.EMPTY_OBJECT),this._polygons=[],this._totalPositions=0,this.enabled=y(e.enabled,!0),this.inverse=y(e.inverse,!1),this.polygonAdded=new ge,this.polygonRemoved=new ge,this._owner=void 0,this._float32View=void 0,this._extentsFloat32View=void 0,this._extentsCount=0,this._polygonsTexture=void 0,this._extentsTexture=void 0,this._signedDistanceTexture=void 0,this._signedDistanceComputeCommand=void 0;let t=e.polygons;if(l(t)){let n=t.length;for(let i=0;il1.equals(t,e))};zr.prototype.remove=function(e){let t=this._polygons,n=t.findIndex(i=>l1.equals(i,e));return n===-1?!1:(t.splice(n,1),this.polygonRemoved.raiseEvent(e,n),!0)};var f3e=new ce;function p3e(e){let t=[],n=[],i=e.length;for(let r=0;rce.union(e[_].computeSphericalExtents(f3e),x,x),a),t[p]=void 0,n[p]=void 0,c=Math.max(a.height*2.5,.001),d=Math.max(a.width*2.5,.001),u=ce.clone(a,u),u.south-=c,u.west-=d,u.north+=c,u.east+=d,u.south=Math.max(u.south,-Math.PI),u.west=Math.max(u.west,-Math.PI),u.north=Math.min(u.north,Math.PI),u.east=Math.min(u.east,Math.PI),p=-1}}t.push(u),n.push(m)}let o=new Map;return n.filter(l).forEach((r,s)=>r.forEach(a=>o.set(a,s))),{extentsList:t.filter(l),extentsIndexByPolygon:o}}zr.prototype.removeAll=function(){let e=this._polygons,t=e.length;for(let n=0;ns+a.length,0);if(n===this.totalPositions||(this._totalPositions=n,this.length===0))return;l(this._signedDistanceComputeCommand)&&(this._signedDistanceComputeCommand.canceled=!0,this._signedDistanceComputeCommand=void 0);let i=this._polygonsTexture,o=this._extentsTexture,r=this._signedDistanceTexture;if(l(i)){let s=i.width*i.height;(s{e._signedDistanceComputeCommand=void 0}})}var jce=new ce,y3e=new ce;zr.prototype.computeIntersectionWithBoundingVolume=function(e,t){let n=this._polygons,i=n.length,o=Kt.OUTSIDE;this.inverse&&(o=Kt.INSIDE);for(let r=0;r=r;)C=o[C-r];o.push(C),s[x]=_}_>N3e&&(t instanceof Uint16Array||t instanceof Uint8Array)?t=new Uint32Array(t):_>k3e&&t instanceof Uint8Array&&(t=new Uint16Array(t)),x===c?(c=_,t[a]=_):x===d?(d=_,t[a+1]=_):(u=_,t[a+2]=_),x=tle(i,c,d,u,p,g,f)}}e._triangleIndices=t,e._outlineCoordinatesTypedArray=new Float32Array(i)}function tle(e,t,n,i,o,r,s){let a=s?1:0,c=o?1:0,d=0,u=TK(e,t,a,c,d);if(u===0)return t;let m=0,p=o?1:0,g=r?1:0,f=TK(e,n,m,p,g);if(f===0)return n;let x=s?1:0,_=0,C=r?1:0,V=TK(e,i,x,_,C);if(V===0)return i;let L=u&f&V,Z,G,X;if(L&1)Z=0,G=1,X=2;else if(L&2)Z=0,X=1,G=2;else if(L&4)G=0,Z=1,X=2;else if(L&8)G=0,X=1,Z=2;else if(L&16)X=0,Z=1,G=2;else if(L&32)X=0,G=1,Z=2;else{let A=SK(u),b=SK(f),R=SK(V);return A>1&1)+(e>>2&1)+(e>>3&1)+(e>>4&1)+(e>>5&1)}ok.prototype.updateAttribute=function(e){let t=this._extraVertices,n=e.length,i=n/this._originalVertexCount,o=t.length,r=e.constructor,s=new r(e.length+o*i);s.set(e);for(let a=0;a1;)i>>=1,r.push(nle(i));let s=new Et({context:e,source:{arrayBufferView:o,mipLevels:r},width:n,height:1,pixelFormat:at.LUMINANCE,sampler:new sn({wrapS:Cn.CLAMP_TO_EDGE,wrapT:Cn.CLAMP_TO_EDGE,minificationFilter:rn.LINEAR_MIPMAP_LINEAR,magnificationFilter:di.LINEAR})});return t.outlineTexture=s,s};function nle(e){let t=new Uint8Array(e);return t[e-1]=192,e===8?t[e-1]=96:e===4?t[e-1]=48:e===2?t[e-1]=24:e===1&&(t[e-1]=12),t}function ile(e,t){this._originalVertexCount=t,this._edges=new Set;for(let n=0;n{this._resourcesLoaded=!0}).catch(o=>{this._processError=o})),l(this._processError)){this._state=Xo.FAILED;let o=this._processError;this._processError=void 0,sk(this,o)}let t=this._textureErrors.pop();if(l(t)){let o=this.getError("Failed to load glTF texture",t);throw o.name="TextureError",o}if(this._state===Xo.FAILED)return!1;let n=!1;try{n=this._process(e)}catch(o){this._state=Xo.FAILED,sk(this,o)}let i=!1;try{i=this._processTextures(e)}catch(o){this._textureState=Xo.FAILED,sk(this,o)}return this._incrementallyLoadTextures?n:n&&i};function TBe(e,t,n,i,o,r,s){let a=e.gltfJson,d=a.accessors[t].bufferView;return Ni.getVertexBufferLoader({gltf:a,gltfResource:e._gltfResource,baseResource:e._baseResource,frameState:s,bufferViewId:d,draco:i,attributeSemantic:n,accessorId:t,asynchronous:e._asynchronous,loadBuffer:o,loadTypedArray:r})}function SBe(e,t,n,i,o,r){return Ni.getIndexBufferLoader({gltf:e.gltfJson,accessorId:t,gltfResource:e._gltfResource,baseResource:e._baseResource,frameState:r,draco:n,asynchronous:e._asynchronous,loadBuffer:i,loadTypedArray:o})}function CBe(e,t){let n=Ni.getBufferViewLoader({gltf:e.gltfJson,bufferViewId:t,gltfResource:e._gltfResource,baseResource:e._baseResource});return e._bufferViewLoaders.push(n),n}function cle(e,t,n){let i=t.byteOffset,o=vl(e,t),r=t.count,s=Sd(t.type),a=t.componentType,c=Q.getSizeInBytes(a),d=c*s,u=r*s;if(o===d)return n=new Uint8Array(n),Q.createArrayBufferView(a,n.buffer,n.byteOffset+i,u);let m=Q.createTypedArray(a,u),p=new DataView(n.buffer),g=new Array(s),f=r0(t.componentType);i=n.byteOffset+i;for(let x=0;x{l(i)&&l(i.attributes)&&l(i.attributes[u])?wBe(x,_,o,r):FBe(a,c,x,_,o,r)},x}function ule(e,t,n,i,o,r,s){let a=n.modelSemantic,c=a===Tt.POSITION,d=a===Tt.FEATURE_ID,u=c&&!o&&e._loadAttributesFor2D&&!s.scene3DOnly,m=c&&e._enablePick&&!s.context.webgl2,p=e._loadForClassification&&d,g=e._loadAttributesAsTypedArray,f=!g,x=g||u||m||p,V=dle(e,t,n,i,r?!1:f,r?!0:x,s),L=new k_.AttributeLoadPlan(V);return L.loadBuffer=f,L.loadTypedArray=x,L}function ABe(e,t,n,i,o){let r=e.gltfJson.accessors,s=l(n.ROTATION),a=l(n.TRANSLATION)&&l(r[n.TRANSLATION].min)&&l(r[n.TRANSLATION].max),c=LK(e,Kr,i),d=c.modelSemantic,u=d===Kr.TRANSLATION||d===Kr.ROTATION||d===Kr.SCALE,m=d===Kr.TRANSLATION,p=e._loadAttributesAsTypedArray||s&&u||!o.context.instancedArrays,g=e._enablePick&&!o.context.webgl2,f=!p,x=e._loadAttributesFor2D&&!o.scene3DOnly;return dle(e,t,c,void 0,f,p||m&&(!a||x||g),o)}function MBe(e,t,n,i,o,r){let s=e.gltfJson.accessors[t],a=s.bufferView;if(!l(n)&&!l(a))return;let c=new Q3e;c.count=s.count;let d=e._loadAttributesAsTypedArray,u=(e._loadIndicesForWireframe||e._enablePick)&&!r.context.webgl2,m=e._loadForClassification&&i,g=!d,f=d||u||m,C=SBe(e,t,n,o?!1:g,o?!0:f,r),V=e._geometryLoaders.length;e._geometryLoaders.push(C);let L=C.load();e._loaderPromises.push(L),e._geometryCallbacks[V]=()=>{c.indexDatatype=C.indexDatatype,c.buffer=C.buffer,c.typedArray=C.typedArray};let Z=new k_.IndicesLoadPlan(c);return Z.loadBuffer=g,Z.loadTypedArray=f,Z}function Qc(e,t,n,i){let o=e.gltfJson,r=wl.getImageIdFromTexture({gltf:o,textureId:t.index,supportedImageFormats:e._supportedImageFormats});if(!l(r))return;let s=Ni.getTextureLoader({gltf:o,textureInfo:t,gltfResource:e._gltfResource,baseResource:e._baseResource,supportedImageFormats:e._supportedImageFormats,frameState:n,asynchronous:e._asynchronous}),a=wl.createModelTextureReader({textureInfo:t}),c=e._textureLoaders.length;e._textureLoaders.push(s);let d=s.load().catch(u=>{if(!e.isDestroyed()){if(!e._incrementallyLoadTextures)throw u;e._textureState=Xo.FAILED,e._textureErrors.push(u)}});return e._texturesPromises.push(d),e._textureCallbacks[c]=()=>{a.texture=s.texture,l(i)&&(a.texture.sampler=i)},a}function NBe(e,t,n){let{diffuseTexture:i,specularGlossinessTexture:o,diffuseFactor:r,specularFactor:s,glossinessFactor:a}=t,c=new hBe;return l(i)&&(c.diffuseTexture=Qc(e,i,n)),l(o)&&(c.specularGlossinessTexture=Qc(e,o,n)),c.diffuseFactor=Cd(se,r),c.specularFactor=Cd(h,s),c.glossinessFactor=a,c}function kBe(e,t,n){let{baseColorTexture:i,metallicRoughnessTexture:o,baseColorFactor:r,metallicFactor:s,roughnessFactor:a}=t,c=new mBe;return l(i)&&(c.baseColorTexture=Qc(e,i,n)),l(o)&&(c.metallicRoughnessTexture=Qc(e,o,n)),c.baseColorFactor=Cd(se,r),c.metallicFactor=s,c.roughnessFactor=a,c}function UBe(e,t,n){let{specularFactor:i,specularTexture:o,specularColorFactor:r,specularColorTexture:s}=t,a=new fBe;return l(o)&&(a.specularTexture=Qc(e,o,n)),l(s)&&(a.specularColorTexture=Qc(e,s,n)),a.specularFactor=i,a.specularColorFactor=Cd(h,r),a}function DBe(e,t,n){let{anisotropyStrength:i=CK.DEFAULT_ANISOTROPY_STRENGTH,anisotropyRotation:o=CK.DEFAULT_ANISOTROPY_ROTATION,anisotropyTexture:r}=t,s=new CK;return l(r)&&(s.anisotropyTexture=Qc(e,r,n)),s.anisotropyStrength=i,s.anisotropyRotation=o,s}function BBe(e,t,n){let{clearcoatFactor:i=VK.DEFAULT_CLEARCOAT_FACTOR,clearcoatTexture:o,clearcoatRoughnessFactor:r=VK.DEFAULT_CLEARCOAT_ROUGHNESS_FACTOR,clearcoatRoughnessTexture:s,clearcoatNormalTexture:a}=t,c=new VK;return l(o)&&(c.clearcoatTexture=Qc(e,o,n)),l(s)&&(c.clearcoatRoughnessTexture=Qc(e,s,n)),l(a)&&(c.clearcoatNormalTexture=Qc(e,a,n)),c.clearcoatFactor=i,c.clearcoatRoughnessFactor=r,c}function YBe(e,t,n){let i=new pBe,o=y(t.extensions,y.EMPTY_OBJECT),r=o.KHR_materials_pbrSpecularGlossiness,s=o.KHR_materials_specular,a=o.KHR_materials_anisotropy,c=o.KHR_materials_clearcoat,d=t.pbrMetallicRoughness;return i.unlit=l(o.KHR_materials_unlit),l(r)?i.specularGlossiness=NBe(e,r,n):(l(d)&&(i.metallicRoughness=kBe(e,d,n)),l(s)&&!i.unlit&&(i.specular=UBe(e,s,n)),l(a)&&!i.unlit&&(i.anisotropy=DBe(e,a,n)),l(c)&&!i.unlit&&(i.clearcoat=BBe(e,c,n))),l(t.emissiveTexture)&&(i.emissiveTexture=Qc(e,t.emissiveTexture,n)),l(t.normalTexture)&&!e._loadForClassification&&(i.normalTexture=Qc(e,t.normalTexture,n)),l(t.occlusionTexture)&&(i.occlusionTexture=Qc(e,t.occlusionTexture,n)),i.emissiveFactor=Cd(h,t.emissiveFactor),i.alphaMode=t.alphaMode,i.alphaCutoff=t.alphaCutoff,i.doubleSided=t.doubleSided,i}function mle(e,t){let n=new rle;return n.featureCount=e.featureCount,n.nullFeatureId=e.nullFeatureId,n.propertyTableId=e.propertyTable,n.setIndex=e.attribute,n.label=e.label,n.positionalLabel=t,n}function hle(e,t,n,i){let o=new rle,r=e.featureIds;return o.featureCount=n,o.propertyTableId=t,o.setIndex=lle(r.attribute),o.positionalLabel=i,o}function fle(e,t){let n=new ale;return n.propertyTableId=e.propertyTable,n.featureCount=e.featureCount,n.nullFeatureId=e.nullFeatureId,n.label=e.label,n.positionalLabel=t,n.offset=0,n.repeat=1,n}function ple(e,t,n,i){let o=new ale,r=e.featureIds;o.propertyTableId=t,o.featureCount=n,o.offset=y(r.constant,0);let s=y(r.divisor,0);return o.repeat=s===0?void 0:s,o.positionalLabel=i,o}function OBe(e,t,n,i){let o=new sle;o.featureCount=t.featureCount,o.nullFeatureId=t.nullFeatureId,o.propertyTableId=t.propertyTable,o.label=t.label,o.positionalLabel=i;let r=t.texture;o.textureReader=Qc(e,r,n,sn.NEAREST);let a=(l(r.channels)?r.channels:[0]).map(function(c){return"rgba".charAt(c)}).join("");return o.textureReader.channels=a,o}function HBe(e,t,n,i,o,r){let s=new sle,a=t.featureIds,c=a.texture;return s.featureCount=o,s.propertyTableId=n,s.textureReader=Qc(e,c,i,sn.NEAREST),s.textureReader.channels=a.channels,s.positionalLabel=r,s}function zBe(e,t,n,i,o){let r=new j3e,s=void 0,a=!1;for(let c in t){if(!t.hasOwnProperty(c))continue;let d=t[c],u=LK(e,Tt,c),m=ule(e,d,u,s,a,n,o);r.attributes.push(m.attribute),i.attributePlans.push(m)}return r}function KBe(e,t,n,i){let o=new q3e,r=new k_(o);e._primitiveLoadPlans.push(r);let s=t.material;l(s)&&(o.material=YBe(e,e.gltfJson.materials[s],i));let a=y(t.extensions,y.EMPTY_OBJECT),c=!1,d=a.CESIUM_primitive_outline;e._loadPrimitiveOutline&&l(d)&&(c=!0,r.needsOutlines=!0,r.outlineIndices=JBe(e,d,r));let u=e._loadForClassification,m=a.KHR_draco_mesh_compression,p=!1,g=t.attributes;if(l(g))for(let G in g){if(!g.hasOwnProperty(G))continue;let X=g[G],v=LK(e,Tt,G),P=v.modelSemantic;if(u&&!vBe(P))continue;P===Tt.FEATURE_ID&&(p=!0);let F=ule(e,X,v,m,n,c,i);r.attributePlans.push(F),o.attributes.push(F.attribute)}let f=t.targets;if(l(f)&&!u)for(let G=0;Gn[s]);let r=t.inverseBindMatrices;if(l(r)){let s=e.gltfJson.accessors[r];i.inverseBindMatrices=ak(e,s)}else i.inverseBindMatrices=new Array(o.length).fill(M.IDENTITY);return i}function sYe(e,t){let n=e.gltfJson.skins;if(e._loadForClassification||!l(n))return[];let i=n.map(function(r,s){let a=rYe(e,r,t);return a.index=s,a}),o=e.gltfJson.nodes;for(let r=0;r0&&(i|=n.COLOR_BUFFER_BIT),l(this._colorFramebuffer.depthStencilTexture)&&(i|=n.DEPTH_BUFFER_BIT|(t?n.STENCIL_BUFFER_BIT:0)),n.blitFramebuffer(0,0,this._width,this._height,0,0,this._width,this._height,i,n.NEAREST),n.bindFramebuffer(n.READ_FRAMEBUFFER,null),n.bindFramebuffer(n.DRAW_FRAMEBUFFER,null)};u1.prototype.isDestroyed=function(){return!1};u1.prototype.destroy=function(){return this._renderFramebuffer.destroy(),this._colorFramebuffer.destroy(),me(this)};var QI=u1;var $Wn=T(S(),1);var HWn=T(S(),1);var Ml={RGBA4:ne.RGBA4,RGBA8:ne.RGBA8,RGBA16F:ne.RGBA16F,RGBA32F:ne.RGBA32F,RGB5_A1:ne.RGB5_A1,RGB565:ne.RGB565,DEPTH_COMPONENT16:ne.DEPTH_COMPONENT16,STENCIL_INDEX8:ne.STENCIL_INDEX8,DEPTH_STENCIL:ne.DEPTH_STENCIL,DEPTH24_STENCIL8:ne.DEPTH24_STENCIL8,validate:function(e){return e===Ml.RGBA4||e===Ml.RGBA8||e===Ml.RGBA16F||e===Ml.RGBA32F||e===Ml.RGB5_A1||e===Ml.RGB565||e===Ml.DEPTH_COMPONENT16||e===Ml.STENCIL_INDEX8||e===Ml.DEPTH_STENCIL||e===Ml.DEPTH24_STENCIL8},getColorFormat:function(e){return e===ne.FLOAT?Ml.RGBA32F:e===ne.HALF_FLOAT_OES?Ml.RGBA16F:Ml.RGBA8}},jc=Object.freeze(Ml);function jI(e){e=y(e,y.EMPTY_OBJECT);let n=e.context._gl,i=Mt.maximumRenderbufferSize,o=y(e.format,jc.RGBA4),r=l(e.width)?e.width:n.drawingBufferWidth,s=l(e.height)?e.height:n.drawingBufferHeight,a=y(e.numSamples,1);this._gl=n,this._format=o,this._width=r,this._height=s,this._renderbuffer=this._gl.createRenderbuffer(),n.bindRenderbuffer(n.RENDERBUFFER,this._renderbuffer),a>1?n.renderbufferStorageMultisample(n.RENDERBUFFER,a,o,r,s):n.renderbufferStorage(n.RENDERBUFFER,o,r,s),n.bindRenderbuffer(n.RENDERBUFFER,null)}Object.defineProperties(jI.prototype,{format:{get:function(){return this._format}},width:{get:function(){return this._width}},height:{get:function(){return this._height}}});jI.prototype._getRenderbuffer=function(){return this._renderbuffer};jI.prototype.isDestroyed=function(){return!1};jI.prototype.destroy=function(){return this._gl.deleteRenderbuffer(this._renderbuffer),me(this)};var Vd=jI;function gs(e){e=y(e,y.EMPTY_OBJECT),this._numSamples=y(e.numSamples,1),this._colorAttachmentsLength=y(e.colorAttachmentsLength,1),this._color=y(e.color,!0),this._depth=y(e.depth,!1),this._depthStencil=y(e.depthStencil,!1),this._supportsDepthTexture=y(e.supportsDepthTexture,!1),this._createColorAttachments=y(e.createColorAttachments,!0),this._createDepthAttachments=y(e.createDepthAttachments,!0),this._pixelDatatype=e.pixelDatatype,this._pixelFormat=e.pixelFormat,this._width=void 0,this._height=void 0,this._framebuffer=void 0,this._multisampleFramebuffer=void 0,this._colorTextures=void 0,this._color&&(this._colorTextures=new Array(this._colorAttachmentsLength),this._colorRenderbuffers=new Array(this._colorAttachmentsLength)),this._colorRenderbuffer=void 0,this._depthStencilRenderbuffer=void 0,this._depthStencilTexture=void 0,this._depthRenderbuffer=void 0,this._depthTexture=void 0,this._attachmentsDirty=!1}Object.defineProperties(gs.prototype,{framebuffer:{get:function(){return this._numSamples>1?this._multisampleFramebuffer.getRenderFramebuffer():this._framebuffer}},numSamples:{get:function(){return this._numSamples}},status:{get:function(){return this.framebuffer.status}}});gs.prototype.isDirty=function(e,t,n,i,o){n=y(n,1);let r=this._width!==e||this._height!==t,s=this._numSamples!==n,a=l(i)&&this._pixelDatatype!==i||l(o)&&this._pixelFormat!==o,c=n===1?l(this._framebuffer):l(this._multisampleFramebuffer);return this._attachmentsDirty||r||s||a||!c||this._color&&!l(this._colorTextures[0])};gs.prototype.update=function(e,t,n,i,o,r){if(i=e.msaa?y(i,1):1,o=y(o,this._color?y(this._pixelDatatype,ze.UNSIGNED_BYTE):void 0),r=y(r,this._color?y(this._pixelFormat,at.RGBA):void 0),this.isDirty(t,n,i,o,r)){if(this.destroy(),this._width=t,this._height=n,this._numSamples=i,this._pixelDatatype=o,this._pixelFormat=r,this._attachmentsDirty=!1,this._color&&this._createColorAttachments){for(let s=0;s1){let a=jc.getColorFormat(o);this._colorRenderbuffers[s]=new Vd({context:e,width:t,height:n,format:a,numSamples:this._numSamples})}}this._depthStencil&&this._createDepthAttachments&&(this._supportsDepthTexture&&e.depthTexture?(this._depthStencilTexture=new Et({context:e,width:t,height:n,pixelFormat:at.DEPTH_STENCIL,pixelDatatype:ze.UNSIGNED_INT_24_8,sampler:sn.NEAREST}),this._numSamples>1&&(this._depthStencilRenderbuffer=new Vd({context:e,width:t,height:n,format:jc.DEPTH24_STENCIL8,numSamples:this._numSamples}))):this._depthStencilRenderbuffer=new Vd({context:e,width:t,height:n,format:jc.DEPTH_STENCIL})),this._depth&&this._createDepthAttachments&&(this._supportsDepthTexture&&e.depthTexture?this._depthTexture=new Et({context:e,width:t,height:n,pixelFormat:at.DEPTH_COMPONENT,pixelDatatype:ze.UNSIGNED_INT,sampler:sn.NEAREST}):this._depthRenderbuffer=new Vd({context:e,width:t,height:n,format:jc.DEPTH_COMPONENT16})),this._numSamples>1?this._multisampleFramebuffer=new QI({context:e,width:this._width,height:this._height,colorTextures:this._colorTextures,colorRenderbuffers:this._colorRenderbuffers,depthStencilTexture:this._depthStencilTexture,depthStencilRenderbuffer:this._depthStencilRenderbuffer,destroyAttachments:!1}):this._framebuffer=new ia({context:e,colorTextures:this._colorTextures,depthTexture:this._depthTexture,depthRenderbuffer:this._depthRenderbuffer,depthStencilTexture:this._depthStencilTexture,depthStencilRenderbuffer:this._depthStencilRenderbuffer,destroyAttachments:!1})}};gs.prototype.getColorTexture=function(e){return e=y(e,0),this._colorTextures[e]};gs.prototype.setColorTexture=function(e,t){t=y(t,0),this._attachmentsDirty=e!==this._colorTextures[t],this._colorTextures[t]=e};gs.prototype.getColorRenderbuffer=function(e){return e=y(e,0),this._colorRenderbuffers[e]};gs.prototype.setColorRenderbuffer=function(e,t){t=y(t,0),this._attachmentsDirty=e!==this._colorRenderbuffers[t],this._colorRenderbuffers[t]=e};gs.prototype.getDepthRenderbuffer=function(){return this._depthRenderbuffer};gs.prototype.setDepthRenderbuffer=function(e){this._attachmentsDirty=e!==this._depthRenderbuffer,this._depthRenderbuffer=e};gs.prototype.getDepthTexture=function(){return this._depthTexture};gs.prototype.setDepthTexture=function(e){this._attachmentsDirty=e!==this._depthTexture,this._depthTexture=e};gs.prototype.getDepthStencilRenderbuffer=function(){return this._depthStencilRenderbuffer};gs.prototype.setDepthStencilRenderbuffer=function(e){this._attachmentsDirty=e!==this._depthStencilRenderbuffer,this._depthStencilRenderbuffer=e};gs.prototype.getDepthStencilTexture=function(){return this._depthStencilTexture};gs.prototype.setDepthStencilTexture=function(e){this._attachmentsDirty=e!==this._depthStencilTexture,this._depthStencilTexture=e};gs.prototype.prepareTextures=function(e,t){this._numSamples>1&&this._multisampleFramebuffer.blitFramebuffers(e,t)};gs.prototype.clear=function(e,t,n){let i=t.framebuffer;t.framebuffer=this.framebuffer,t.execute(e,n),t.framebuffer=i};gs.prototype.destroyFramebuffer=function(){this._framebuffer=this._framebuffer&&this._framebuffer.destroy(),this._multisampleFramebuffer=this._multisampleFramebuffer&&this._multisampleFramebuffer.destroy()};gs.prototype.destroy=function(){if(this._color){let e,t=this._colorTextures.length;for(e=0;e=s.clientWidth)d=!0;else{if(L.x>s.clientWidth*.5){a.width=L.x,c.frustum.right=p.x-C,pc=$I(r,n,c,pc),Xa.clipToGLWindowCoordinates(a,pc,GK),a.x+=L.x,c.position.x=-c.position.x;let Z=c.frustum.right;c.frustum.right=-c.frustum.left,c.frustum.left=-Z,pc=$I(r,n,c,pc),Xa.clipToGLWindowCoordinates(a,pc,EK)}else{a.x+=L.x,a.width-=L.x,c.frustum.left=-p.x-C,pc=$I(r,n,c,pc),Xa.clipToGLWindowCoordinates(a,pc,GK),a.x=a.x-a.width,c.position.x=-c.position.x;let Z=c.frustum.left;c.frustum.left=-c.frustum.right,c.frustum.right=-Z,pc=$I(r,n,c,pc),Xa.clipToGLWindowCoordinates(a,pc,EK)}h.clone(g,c.position),c.frustum=f.clone(),i=D.clone(GK,i),(i.x<0||i.x>s.clientWidth)&&(i.x=EK.x)}}if(o.mode!==oe.SCENE2D||d){if(pc=$I(r,n,c,pc),pc.z<0&&!(c.frustum instanceof on)&&!(c.frustum instanceof Zr))return;i=Xa.clipToGLWindowCoordinates(a,pc,i)}return i.y=s.clientHeight-i.y,i};Xa.wgs84ToDrawingBufferCoordinates=function(e,t,n){if(n=Xa.wgs84ToWindowCoordinates(e,t,n),!!l(n))return Xa.transformWindowToDrawingBuffer(e,n,n)};var l0=new h,PYe=new he;Xa.computeActualWgs84Position=function(e,t,n){let i=e.mode;if(i===oe.SCENE3D)return h.clone(t,n);let o=e.mapProjection,r=o.ellipsoid.cartesianToCartographic(t,PYe);if(!l(r))return;if(o.project(r,l0),i===oe.COLUMBUS_VIEW)return h.fromElements(l0.z,l0.x,l0.y,n);if(i===oe.SCENE2D)return h.fromElements(0,l0.x,l0.y,n);let s=e.morphTime;return h.fromElements(W.lerp(l0.z,t.x,s),W.lerp(l0.x,t.y,s),W.lerp(l0.y,t.z,s),n)};var Tle=new h,Sle=new h,Cle=new M;Xa.clipToGLWindowCoordinates=function(e,t,n){return h.divideByScalar(t,t.w,Tle),M.computeViewportTransformation(e,0,1,Cle),M.multiplyByPoint(Cle,Tle,Sle),D.fromCartesian3(Sle,n)};Xa.transformWindowToDrawingBuffer=function(e,t,n){let i=e.canvas,o=e.drawingBufferWidth/i.clientWidth,r=e.drawingBufferHeight/i.clientHeight;return D.fromElements(t.x*o,t.y*r,n)};var vYe=new se,Vle=new se;Xa.drawingBufferToWgs84Coordinates=function(e,t,n,i){let r=e.context.uniformState,s=r.currentFrustum,a=s.x,c=s.y;if(e.frameState.useLogDepth){let g=n*r.log2FarDepthFromNearPlusOne,f=Math.pow(2,g)-1;n=c*(1-a/(f+a))/(c-a)}let d=e.view.passState.viewport,u=se.clone(se.UNIT_W,vYe);u.x=(t.x-d.x)/d.width*2-1,u.y=(t.y-d.y)/d.height*2-1,u.z=n*2-1,u.w=1;let m,p=e.camera.frustum;if(l(p.fovy)){m=M.multiplyByVector(r.inverseViewProjection,u,Vle);let g=1/m.w;h.multiplyByScalar(m,g,m)}else{let g=p.offCenterFrustum;l(g)&&(p=g),m=Vle,m.x=(u.x*(p.right-p.left)+p.left+p.right)*.5,m.y=(u.y*(p.top-p.bottom)+p.bottom+p.top)*.5,m.z=(u.z*(a-c)-a-c)*.5,m.w=1,m=M.multiplyByVector(r.inverseView,m,m)}return h.fromCartesian4(m,i)};var ki=Xa;var J2n=T(S(),1),wYe={LEFT:-1,NONE:0,RIGHT:1},qc=Object.freeze(wYe);var YPn=T(S(),1);var tPn=T(S(),1);var h1={};h1._deprecationWarning=Is;var d0=Uint32Array.BYTES_PER_ELEMENT;h1.parse=function(e,t){let n=y(t,0);t=n;let i=new Uint8Array(e),o=new DataView(e);t+=d0;let r=o.getUint32(t,!0);if(r!==1)throw new ue(`Only Batched 3D Model version 1 is supported. Version ${r} is not.`);t+=d0;let s=o.getUint32(t,!0);t+=d0;let a=o.getUint32(t,!0);t+=d0;let c=o.getUint32(t,!0);t+=d0;let d=o.getUint32(t,!0);t+=d0;let u=o.getUint32(t,!0);t+=d0;let m;d>=570425344?(t-=d0*2,m=a,d=c,u=0,a=0,c=0,h1._deprecationWarning("b3dm-legacy-header","This b3dm header is using the legacy format [batchLength] [batchTableByteLength]. The new format is [featureTableJsonByteLength] [featureTableBinaryByteLength] [batchTableJsonByteLength] [batchTableBinaryByteLength] from https://github.com/CesiumGS/3d-tiles/tree/main/specification/TileFormats/Batched3DModel.")):u>=570425344&&(t-=d0,m=d,d=a,u=c,a=0,c=0,h1._deprecationWarning("b3dm-legacy-header","This b3dm header is using the legacy format [batchTableJsonByteLength] [batchTableBinaryByteLength] [batchLength]. The new format is [featureTableJsonByteLength] [featureTableBinaryByteLength] [batchTableJsonByteLength] [batchTableBinaryByteLength] from https://github.com/CesiumGS/3d-tiles/tree/main/specification/TileFormats/Batched3DModel."));let p;a===0?p={BATCH_LENGTH:y(m,0)}:(p=Zo(i,t,a),t+=a);let g=new Uint8Array(e,t,c);t+=c;let f,x;d>0&&(f=Zo(i,t,d),t+=d,u>0&&(x=new Uint8Array(e,t,u),x=new Uint8Array(x),t+=u));let _=n+s-t;if(_===0)throw new ue("glTF byte length must be greater than 0.");let C;return t%4===0?C=new Uint8Array(e,t,_):(h1._deprecationWarning("b3dm-glb-unaligned","The embedded glb is not aligned to a 4-byte boundary."),C=new Uint8Array(i.subarray(t,t+_))),{batchLength:m,featureTableJson:p,featureTableBinary:g,batchTableJson:f,batchTableBinary:x,gltf:C}};var eW=h1;var sPn=T(S(),1);function tW(e,t){this.json=e,this.buffer=t,this._cachedTypedArrays={},this.featuresLength=0}function Lle(e,t,n,i,o,r){let s=e._cachedTypedArrays,a=s[t];return l(a)||(a=Q.createArrayBufferView(n,e.buffer.buffer,e.buffer.byteOffset+r,o*i),s[t]=a),a}function FYe(e,t,n,i){let o=e._cachedTypedArrays,r=o[t];return l(r)||(r=Q.createTypedArray(n,i),o[t]=r),r}tW.prototype.getGlobalProperty=function(e,t,n){let i=this.json[e];if(l(i))return l(i.byteOffset)?(t=y(t,Q.UNSIGNED_INT),n=y(n,1),Lle(this,e,t,n,1,i.byteOffset)):i};tW.prototype.hasProperty=function(e){return l(this.json[e])};tW.prototype.getPropertyArray=function(e,t,n){let i=this.json[e];if(l(i))return l(i.byteOffset)?(l(i.componentType)&&(t=Q.fromName(i.componentType)),Lle(this,e,t,n,this.featuresLength,i.byteOffset)):FYe(this,e,t,i)};tW.prototype.getProperty=function(e,t,n,i,o){let r=this.json[e];if(!l(r))return;let s=this.getPropertyArray(e,t,n);if(n===1)return s[i];for(let a=0;a0&&(f=Zo(i,t,d),t+=d,u>0&&(x=new Uint8Array(e,t,u),x=new Uint8Array(x),t+=u));let _=n+s-t;if(_===0)throw new ue("glTF byte length must be greater than 0.");let C;return t%4===0?C=new Uint8Array(e,t,_):(dk._deprecationWarning("i3dm-glb-unaligned","The embedded glb is not aligned to a 4-byte boundary."),C=new Uint8Array(i.subarray(t,t+_))),{gltfFormat:m,featureTableJson:p,featureTableBinary:g,batchTableJson:f,batchTableBinary:x,gltf:C}};var rW=dk;var m0={NOT_LOADED:0,LOADING:1,PROCESSING:2,POST_PROCESSING:3,READY:4,FAILED:5,UNLOADED:6},uk=Tn.Attribute,iOe=Tn.FeatureIdAttribute,Ile=Tn.Instances;function h0(e){e=y(e,y.EMPTY_OBJECT);let t=e.i3dmResource,n=e.arrayBuffer,i=e.baseResource,o=y(e.byteOffset,0),r=y(e.releaseGltfJson,!1),s=y(e.asynchronous,!0),a=y(e.incrementallyLoadTextures,!0),c=y(e.upAxis,Eo.Y),d=y(e.forwardAxis,Eo.X),u=y(e.loadAttributesAsTypedArray,!1),m=y(e.loadIndicesForWireframe,!1),p=y(e.loadPrimitiveOutline,!0),g=y(e.enablePick,!1);i=l(i)?i:t.clone(),this._i3dmResource=t,this._baseResource=i,this._arrayBuffer=n,this._byteOffset=o,this._releaseGltfJson=r,this._asynchronous=s,this._incrementallyLoadTextures=a,this._upAxis=c,this._forwardAxis=d,this._loadAttributesAsTypedArray=u,this._loadIndicesForWireframe=m,this._loadPrimitiveOutline=p,this._enablePick=g,this._state=m0.NOT_LOADED,this._promise=void 0,this._gltfLoader=void 0,this._buffers=[],this._components=void 0,this._transform=M.IDENTITY,this._batchTable=void 0,this._featureTable=void 0,this._instancesLength=0}l(Object.create)&&(h0.prototype=Object.create(to.prototype),h0.prototype.constructor=h0);Object.defineProperties(h0.prototype,{texturesLoaded:{get:function(){return this._gltfLoader?.texturesLoaded}},cacheKey:{get:function(){}},components:{get:function(){return this._components}}});h0.prototype.load=function(){if(l(this._promise))return this._promise;let e=rW.parse(this._arrayBuffer,this._byteOffset),t=e.featureTableJson,n=e.featureTableBinary,i=e.batchTableJson,o=e.batchTableBinary,r=e.gltfFormat,s=new zm(t,n);this._featureTable=s;let a=s.getGlobalProperty("INSTANCES_LENGTH");if(s.featuresLength=a,!l(a))throw new ue("Feature table global property: INSTANCES_LENGTH must be defined");this._instancesLength=a;let c=s.getGlobalProperty("RTC_CENTER",Q.FLOAT,3);l(c)&&(this._transform=M.fromTranslation(h.fromArray(c))),this._batchTable={json:i,binary:o};let d={upAxis:this._upAxis,forwardAxis:this._forwardAxis,releaseGltfJson:this._releaseGltfJson,incrementallyLoadTextures:this._incrementallyLoadTextures,loadAttributesAsTypedArray:this._loadAttributesAsTypedArray,enablePick:this._enablePick,loadIndicesForWireframe:this._loadIndicesForWireframe,loadPrimitiveOutline:this._loadPrimitiveOutline};if(r===0){let m=_l(e.gltf);m=m.replace(/[\s\0]+$/,"");let p=this._baseResource.getDerivedResource({url:m});d.gltfResource=p,d.baseResource=p}else d.gltfResource=this._i3dmResource,d.typedArray=e.gltf;let u=new a0(d);return this._gltfLoader=u,this._state=m0.LOADING,this._promise=u.load().then(()=>{if(!this.isDestroyed())return this._state=m0.PROCESSING,this}).catch(m=>{if(!this.isDestroyed())throw oOe(this,m)}),this._promise};function oOe(e,t){return e.unload(),e._state=m0.FAILED,e.getError("Failed to load i3dm",t)}h0.prototype.process=function(e){if(this._state===m0.READY)return!0;let t=this._gltfLoader,n=!1;if(this._state===m0.PROCESSING&&(n=t.process(e)),!n)return!1;let i=t.components;return i.transform=M.multiplyTransformation(this._transform,i.transform,i.transform),aOe(this,i,e),rOe(this,i),this._components=i,this._arrayBuffer=void 0,this._state=m0.READY,!0};function rOe(e,t){let n=e._batchTable,i=e._instancesLength;if(i===0)return;let o;if(l(n.json))o=u0({count:i,batchTable:n.json,binaryBody:n.binary});else{let r=new Jc({name:km.BATCH_TABLE_CLASS_NAME,count:i});o=new Ea({schema:{},propertyTables:[r]})}t.structuralMetadata=o}var mk=new h,WK=new Array(4),sOe=new M;function aOe(e,t,n){let i,o=e._featureTable,r=e._instancesLength;if(r===0)return;let s=o.getGlobalProperty("RTC_CENTER",Q.FLOAT,3),a=o.getGlobalProperty("EAST_NORTH_UP"),c=o.hasProperty("NORMAL_UP")||o.hasProperty("NORMAL_UP_OCT32P")||a,d=o.hasProperty("SCALE")||o.hasProperty("SCALE_NON_UNIFORM"),u=lOe(o,r),m;c&&(m=new Float32Array(4*r));let p;d&&(p=new Float32Array(3*r));let g=new Float32Array(r),f=h.unpackArray(u),x=new h,_=new h,C=new h,V=new h,L=new $,Z=new we,G=new Array(4),X=new h,v=new Array(3),P=new M;if(!l(s)||h.equals(h.unpack(s),h.ZERO)){let U=le.fromPoints(f);for(i=0;i0&&(U.instances=B?cOe(F):F,B=!0)}}function cOe(e){let t=new Ile;t.transformInWorldSpace=e.transformInWorldSpace;let n=e.attributes,i=n.length;for(let o=0;o0&&e.afterRender.push(a._raiseStartEvent)),a.loop===Al.REPEAT)g=g-Math.floor(g);else if(a.loop===Al.MIRRORED_REPEAT){let C=Math.floor(g),V=g-C;g=C%2===1?1-V:V}a.reverse&&(g=1-g);let _=g*d*a.multiplier;_=W.clamp(_,a.localStartTime,a.localStopTime),a.animate(_),a.update.numberOfListeners>0&&(a._updateEventTime=_,e.afterRender.push(a._raiseUpdateEvent)),i=!0,x||(a._state=Km.STOPPED,a.stop.numberOfListeners>0&&e.afterRender.push(a._raiseStopEvent),a.removeOnStop&&hk.push(a))}}n=hk.length;for(let s=0;ss||o<-s&&r>-s}function p1(e,t){if(!l(t))return;let n=p0.clone(t),i=et.shallowClone(t.command);return i.modelMatrix=e._modelMatrix2D,i.boundingVolume=e._boundingVolume2D,n.command=i,n.updateShadows=!1,n.is2D=!0,t.derivedCommand2D=n,e._derivedCommands.push(n),n}function vOe(e){p1(e,e._originalCommand),p1(e,e._translucentCommand),p1(e,e._skipLodBackfaceCommand),p1(e,e._skipLodStencilCommand),p1(e,e._silhouetteModelCommand),p1(e,e._silhouetteColorCommand)}function wOe(e){let t=et.shallowClone(e);t.pass=Re.TRANSLUCENT;let n=Oe(e.renderState,!0);return n.cull.enabled=!1,n.depthMask=!1,n.blending=un.ALPHA_BLEND,t.renderState=De.fromCache(n),t}function FOe(e,t){let n=t._silhouetteId%255,i=et.shallowClone(e),o=Oe(e.renderState,!0);return o.stencilTest={enabled:!0,frontFunction:ne.ALWAYS,backFunction:ne.ALWAYS,reference:n,mask:-1,frontOperation:{fail:ne.KEEP,zFail:ne.KEEP,zPass:ne.REPLACE},backOperation:{fail:ne.KEEP,zFail:ne.KEEP,zPass:ne.REPLACE}},t.isInvisible()&&(o.colorMask={red:!1,green:!1,blue:!1,alpha:!1}),i.renderState=De.fromCache(o),i}function AOe(e,t){let n=t._silhouetteId%255,i=et.shallowClone(e),o=Oe(e.renderState,!0);o.cull.enabled=!1,(e.pass===Re.TRANSLUCENT||t.silhouetteColor.alpha<1)&&(i.pass=Re.TRANSLUCENT,o.depthMask=!1,o.blending=un.ALPHA_BLEND),o.stencilTest={enabled:!0,frontFunction:ne.NOTEQUAL,backFunction:ne.NOTEQUAL,reference:n,mask:-1,frontOperation:{fail:ne.KEEP,zFail:ne.KEEP,zPass:ne.KEEP},backOperation:{fail:ne.KEEP,zFail:ne.KEEP,zPass:ne.KEEP}};let s=Oe(e.uniformMap);return s.model_silhouettePass=function(){return!0},i.renderState=De.fromCache(o),i.uniformMap=s,i.castShadows=!1,i.receiveShadows=!1,i}function MOe(e,t,n){let i=e._skipLodStencilCommand,o=i.command,r=t._selectionDepth,s=NOe(o);if(r!==s){let a=kOe(r),c=Oe(o.renderState,!0);c.stencilTest.reference=a,o.renderState=De.fromCache(c),n&&(i.derivedCommand2D.renderState=c)}}function NOe(e){return(e.renderState.stencilTest.reference&Nt.SKIP_LOD_MASK)>>>Nt.SKIP_LOD_BIT_SHIFT}function kOe(e){return Nt.CESIUM_3D_TILE_MASK|e<W.EPSILON3}};var SW=Mle;var S9n=T(S(),1);var p9n=T(S(),1),CW=`/** * Compute some metrics for a procedural sky lighting model * * @param {vec3} positionWC The position of the fragment in world coordinates. * @param {vec3} reflectionWC A unit vector in the direction of the reflection, in world coordinates. * @return {vec3} The dot products of the horizon and reflection directions with the nadir, and an atmosphere boundary distance. */ vec3 getProceduralSkyMetrics(vec3 positionWC, vec3 reflectionWC) { // Figure out if the reflection vector hits the ellipsoid float horizonDotNadir = 1.0 - min(1.0, czm_ellipsoidRadii.x / length(positionWC)); float reflectionDotNadir = dot(reflectionWC, normalize(positionWC)); float atmosphereHeight = 0.05; float smoothstepHeight = smoothstep(0.0, atmosphereHeight, horizonDotNadir); return vec3(horizonDotNadir, reflectionDotNadir, smoothstepHeight); } /** * Compute the diffuse irradiance for a procedural sky lighting model * * @param {vec3} skyMetrics The dot products of the horizon and reflection directions with the nadir, and an atmosphere boundary distance. * @return {vec3} The computed diffuse irradiance */ vec3 getProceduralDiffuseIrradiance(vec3 skyMetrics) { vec3 blueSkyDiffuseColor = vec3(0.7, 0.85, 0.9); float diffuseIrradianceFromEarth = (1.0 - skyMetrics.x) * (skyMetrics.y * 0.25 + 0.75) * skyMetrics.z; float diffuseIrradianceFromSky = (1.0 - skyMetrics.z) * (1.0 - (skyMetrics.y * 0.25 + 0.25)); return blueSkyDiffuseColor * clamp(diffuseIrradianceFromEarth + diffuseIrradianceFromSky, 0.0, 1.0); } /** * Compute the specular irradiance for a procedural sky lighting model * * @param {vec3} skyMetrics The dot products of the horizon and reflection directions with the nadir, and an atmosphere boundary distance. * @return {vec3} The computed specular irradiance */ vec3 getProceduralSpecularIrradiance(vec3 reflectionWC, vec3 skyMetrics, float roughness) { // Flipping the X vector is a cheap way to get the inverse of czm_temeToPseudoFixed, since that's a rotation about Z. reflectionWC.x = -reflectionWC.x; reflectionWC = -normalize(czm_temeToPseudoFixed * reflectionWC); reflectionWC.x = -reflectionWC.x; float inverseRoughness = 1.04 - roughness; inverseRoughness *= inverseRoughness; vec3 sceneSkyBox = czm_textureCube(czm_environmentMap, reflectionWC).rgb * inverseRoughness; // Compute colors at different angles relative to the horizon vec3 belowHorizonColor = mix(vec3(0.1, 0.15, 0.25), vec3(0.4, 0.7, 0.9), skyMetrics.z); vec3 nadirColor = belowHorizonColor * 0.5; vec3 aboveHorizonColor = mix(vec3(0.9, 1.0, 1.2), belowHorizonColor, roughness * 0.5); vec3 blueSkyColor = mix(vec3(0.18, 0.26, 0.48), aboveHorizonColor, skyMetrics.y * inverseRoughness * 0.5 + 0.75); vec3 zenithColor = mix(blueSkyColor, sceneSkyBox, skyMetrics.z); // Compute blend zones float blendRegionSize = 0.1 * ((1.0 - inverseRoughness) * 8.0 + 1.1 - skyMetrics.x); float blendRegionOffset = roughness * -1.0; float farAboveHorizon = clamp(skyMetrics.x - blendRegionSize * 0.5 + blendRegionOffset, 1.0e-10 - blendRegionSize, 0.99999); float aroundHorizon = clamp(skyMetrics.x + blendRegionSize * 0.5, 1.0e-10 - blendRegionSize, 0.99999); float farBelowHorizon = clamp(skyMetrics.x + blendRegionSize * 1.5, 1.0e-10 - blendRegionSize, 0.99999); // Blend colors float notDistantRough = (1.0 - skyMetrics.x * roughness * 0.8); vec3 specularIrradiance = mix(zenithColor, aboveHorizonColor, smoothstep(farAboveHorizon, aroundHorizon, skyMetrics.y) * notDistantRough); specularIrradiance = mix(specularIrradiance, belowHorizonColor, smoothstep(aroundHorizon, farBelowHorizon, skyMetrics.y) * inverseRoughness); specularIrradiance = mix(specularIrradiance, nadirColor, smoothstep(farBelowHorizon, 1.0, skyMetrics.y) * inverseRoughness); return specularIrradiance; } #ifdef USE_SUN_LUMINANCE float clampedDot(vec3 x, vec3 y) { return clamp(dot(x, y), 0.001, 1.0); } /** * Sun luminance following the "CIE Clear Sky Model" * See page 40 of https://3dvar.com/Green2003Spherical.pdf * * @param {vec3} positionWC The position of the fragment in world coordinates. * @param {vec3} normalEC The surface normal in eye coordinates. * @param {vec3} lightDirectionEC Unit vector pointing to the light source in eye coordinates. * @return {float} The computed sun luminance. */ float getSunLuminance(vec3 positionWC, vec3 normalEC, vec3 lightDirectionEC) { vec3 normalWC = normalize(czm_inverseViewRotation * normalEC); vec3 lightDirectionWC = normalize(czm_inverseViewRotation * lightDirectionEC); vec3 vWC = -normalize(positionWC); // Angle between sun and zenith. float LdotZenith = clampedDot(lightDirectionWC, vWC); float S = acos(LdotZenith); // Angle between zenith and current pixel float NdotZenith = clampedDot(normalWC, vWC); // Angle between sun and current pixel float NdotL = clampedDot(normalEC, lightDirectionEC); float gamma = acos(NdotL); float numerator = ((0.91 + 10.0 * exp(-3.0 * gamma) + 0.45 * NdotL * NdotL) * (1.0 - exp(-0.32 / NdotZenith))); float denominator = (0.91 + 10.0 * exp(-3.0 * S) + 0.45 * LdotZenith * LdotZenith) * (1.0 - exp(-0.32)); return model_luminanceAtZenith * (numerator / denominator); } #endif /** * Compute the light contribution from a procedural sky model * * @param {vec3} positionEC The position of the fragment in eye coordinates. * @param {vec3} normalEC The surface normal in eye coordinates. * @param {vec3} lightDirectionEC Unit vector pointing to the light source in eye coordinates. * @param {czm_modelMaterial} The material properties. * @return {vec3} The computed HDR color */ vec3 proceduralIBL( vec3 positionEC, vec3 normalEC, vec3 lightDirectionEC, czm_modelMaterial material ) { vec3 viewDirectionEC = -normalize(positionEC); vec3 positionWC = vec3(czm_inverseView * vec4(positionEC, 1.0)); vec3 reflectionWC = normalize(czm_inverseViewRotation * normalize(reflect(viewDirectionEC, normalEC))); vec3 skyMetrics = getProceduralSkyMetrics(positionWC, reflectionWC); float roughness = material.roughness; vec3 f0 = material.specular; vec3 specularIrradiance = getProceduralSpecularIrradiance(reflectionWC, skyMetrics, roughness); float NdotV = abs(dot(normalEC, viewDirectionEC)) + 0.001; vec2 brdfLut = texture(czm_brdfLut, vec2(NdotV, roughness)).rg; vec3 specularColor = czm_srgbToLinear(f0 * brdfLut.x + brdfLut.y); vec3 specularContribution = specularIrradiance * specularColor * model_iblFactor.y; #ifdef USE_SPECULAR specularContribution *= material.specularWeight; #endif vec3 diffuseIrradiance = getProceduralDiffuseIrradiance(skyMetrics); vec3 diffuseColor = material.diffuse; vec3 diffuseContribution = diffuseIrradiance * diffuseColor * model_iblFactor.x; vec3 iblColor = specularContribution + diffuseContribution; #ifdef USE_SUN_LUMINANCE iblColor *= getSunLuminance(positionWC, normalEC, lightDirectionEC); #endif return iblColor; } #ifdef DIFFUSE_IBL vec3 computeDiffuseIBL(vec3 cubeDir) { #ifdef CUSTOM_SPHERICAL_HARMONICS return czm_sphericalHarmonics(cubeDir, model_sphericalHarmonicCoefficients); #else return czm_sphericalHarmonics(cubeDir, czm_sphericalHarmonicCoefficients); #endif } #endif #ifdef SPECULAR_IBL vec3 sampleSpecularEnvironment(vec3 cubeDir, float roughness) { #ifdef CUSTOM_SPECULAR_IBL float maxLod = model_specularEnvironmentMapsMaximumLOD; float lod = roughness * maxLod; return czm_sampleOctahedralProjection(model_specularEnvironmentMaps, model_specularEnvironmentMapsSize, cubeDir, lod, maxLod); #else float maxLod = czm_specularEnvironmentMapsMaximumLOD; float lod = roughness * maxLod; return czm_sampleOctahedralProjection(czm_specularEnvironmentMaps, czm_specularEnvironmentMapSize, cubeDir, lod, maxLod); #endif } vec3 computeSpecularIBL(vec3 cubeDir, float NdotV, float VdotH, vec3 f0, float roughness) { float reflectance = czm_maximumComponent(f0); vec3 f90 = vec3(clamp(reflectance * 25.0, 0.0, 1.0)); vec3 F = fresnelSchlick2(f0, f90, VdotH); vec2 brdfLut = texture(czm_brdfLut, vec2(NdotV, roughness)).rg; vec3 specularSample = sampleSpecularEnvironment(cubeDir, roughness); return specularSample * (F * brdfLut.x + brdfLut.y); } #endif #if defined(DIFFUSE_IBL) || defined(SPECULAR_IBL) /** * Compute the light contributions from environment maps and spherical harmonic coefficients * * @param {vec3} viewDirectionEC Unit vector pointing from the fragment to the eye position * @param {vec3} normalEC The surface normal in eye coordinates * @param {vec3} lightDirectionEC Unit vector pointing to the light source in eye coordinates. * @param {czm_modelMaterial} The material properties. * @return {vec3} The computed HDR color */ vec3 textureIBL( vec3 viewDirectionEC, vec3 normalEC, vec3 lightDirectionEC, czm_modelMaterial material ) { // Find the direction in which to sample the environment map vec3 cubeDir = normalize(model_iblReferenceFrameMatrix * normalize(reflect(-viewDirectionEC, normalEC))); #ifdef DIFFUSE_IBL vec3 diffuseContribution = computeDiffuseIBL(cubeDir) * material.diffuse; #else vec3 diffuseContribution = vec3(0.0); #endif float roughness = material.roughness; #ifdef USE_ANISOTROPY // Update environment map sampling direction to account for anisotropic distortion of specular reflection vec3 anisotropyDirection = material.anisotropicB; vec3 anisotropicTangent = cross(anisotropyDirection, viewDirectionEC); vec3 anisotropicNormal = cross(anisotropicTangent, anisotropyDirection); float bendFactor = 1.0 - material.anisotropyStrength * (1.0 - roughness); float bendFactorPow4 = bendFactor * bendFactor * bendFactor * bendFactor; vec3 bentNormal = normalize(mix(anisotropicNormal, normalEC, bendFactorPow4)); cubeDir = normalize(model_iblReferenceFrameMatrix * normalize(reflect(-viewDirectionEC, bentNormal))); #endif #ifdef SPECULAR_IBL float NdotV = abs(dot(normalEC, viewDirectionEC)) + 0.001; vec3 halfwayDirectionEC = normalize(viewDirectionEC + lightDirectionEC); float VdotH = clamp(dot(viewDirectionEC, halfwayDirectionEC), 0.0, 1.0); vec3 f0 = material.specular; vec3 specularContribution = computeSpecularIBL(cubeDir, NdotV, VdotH, f0, roughness); #else vec3 specularContribution = vec3(0.0); #endif #ifdef USE_SPECULAR specularContribution *= material.specularWeight; #endif return diffuseContribution + specularContribution; } #endif `;var Nle={name:"ImageBasedLightingPipelineStage"};Nle.process=function(e,t,n){let i=t.imageBasedLighting,o=e.shaderBuilder;o.addDefine("USE_IBL_LIGHTING",void 0,xe.FRAGMENT),o.addUniform("vec2","model_iblFactor",xe.FRAGMENT),Am.isSupported(n.context)&&((i.useSphericalHarmonics||i.useSpecularEnvironmentMaps||i.enabled)&&o.addUniform("mat3","model_iblReferenceFrameMatrix",xe.FRAGMENT),l(i.sphericalHarmonicCoefficients)?(o.addDefine("DIFFUSE_IBL",void 0,xe.FRAGMENT),o.addDefine("CUSTOM_SPHERICAL_HARMONICS",void 0,xe.FRAGMENT),o.addUniform("vec3","model_sphericalHarmonicCoefficients[9]",xe.FRAGMENT)):i.useDefaultSphericalHarmonics&&o.addDefine("DIFFUSE_IBL",void 0,xe.FRAGMENT),l(i.specularEnvironmentMapAtlas)&&i.specularEnvironmentMapAtlas.ready?(o.addDefine("SPECULAR_IBL",void 0,xe.FRAGMENT),o.addDefine("CUSTOM_SPECULAR_IBL",void 0,xe.FRAGMENT),o.addUniform("sampler2D","model_specularEnvironmentMaps",xe.FRAGMENT),o.addUniform("vec2","model_specularEnvironmentMapsSize",xe.FRAGMENT),o.addUniform("float","model_specularEnvironmentMapsMaximumLOD",xe.FRAGMENT)):t.useDefaultSpecularMaps&&o.addDefine("SPECULAR_IBL",void 0,xe.FRAGMENT)),l(i.luminanceAtZenith)&&(o.addDefine("USE_SUN_LUMINANCE",void 0,xe.FRAGMENT),o.addUniform("float","model_luminanceAtZenith",xe.FRAGMENT)),o.addFragmentLines(CW);let r={model_iblFactor:function(){return i.imageBasedLightingFactor},model_iblReferenceFrameMatrix:function(){return t._iblReferenceFrameMatrix},model_luminanceAtZenith:function(){return i.luminanceAtZenith},model_sphericalHarmonicCoefficients:function(){return i.sphericalHarmonicCoefficients},model_specularEnvironmentMaps:function(){return i.specularEnvironmentMapAtlas.texture},model_specularEnvironmentMapsSize:function(){return i.specularEnvironmentMapAtlas.texture.dimensions},model_specularEnvironmentMapsMaximumLOD:function(){return i.specularEnvironmentMapAtlas.maximumMipmapLevel}};e.uniformMap=xt(r,e.uniformMap)};var VW=Nle;var F9n=T(S(),1);var X9n=T(S(),1);var OOe=W.EPSILON16;function NK(e){e=y(e,y.EMPTY_OBJECT);let t=e.stage,n=e.runtimeArticulation;this._stage=t,this._runtimeArticulation=n,this._name=t.name,this._type=t.type,this._minimumValue=t.minimumValue,this._maximumValue=t.maximumValue,this._currentValue=t.initialValue}Object.defineProperties(NK.prototype,{stage:{get:function(){return this._stage}},runtimeArticulation:{get:function(){return this._runtimeArticulation}},name:{get:function(){return this._name}},type:{get:function(){return this._type}},minimumValue:{get:function(){return this._minimumValue}},maximumValue:{get:function(){return this._maximumValue}},currentValue:{get:function(){return this._currentValue},set:function(e){e=W.clamp(e,this.minimumValue,this.maximumValue),W.equalsEpsilon(this._currentValue,e,OOe)||(this._currentValue=e,this.runtimeArticulation._dirty=!0)}}});var HOe=new h,MK=new $;NK.prototype.applyStageToMatrix=function(e){let t=this.type,n=this.currentValue,i=HOe,o;switch(t){case ja.XROTATE:o=$.fromRotationX(W.toRadians(n),MK),e=M.multiplyByMatrix3(e,o,e);break;case ja.YROTATE:o=$.fromRotationY(W.toRadians(n),MK),e=M.multiplyByMatrix3(e,o,e);break;case ja.ZROTATE:o=$.fromRotationZ(W.toRadians(n),MK),e=M.multiplyByMatrix3(e,o,e);break;case ja.XTRANSLATE:i.x=n,i.y=0,i.z=0,e=M.multiplyByTranslation(e,i,e);break;case ja.YTRANSLATE:i.x=0,i.y=n,i.z=0,e=M.multiplyByTranslation(e,i,e);break;case ja.ZTRANSLATE:i.x=0,i.y=0,i.z=n,e=M.multiplyByTranslation(e,i,e);break;case ja.XSCALE:i.x=n,i.y=1,i.z=1,e=M.multiplyByScale(e,i,e);break;case ja.YSCALE:i.x=1,i.y=n,i.z=1,e=M.multiplyByScale(e,i,e);break;case ja.ZSCALE:i.x=1,i.y=1,i.z=n,e=M.multiplyByScale(e,i,e);break;case ja.UNIFORMSCALE:e=M.multiplyByUniformScale(e,n,e);break;default:break}return e};var LW=NK;function pk(e){e=y(e,y.EMPTY_OBJECT);let t=e.articulation,n=e.sceneGraph;this._articulation=t,this._sceneGraph=n,this._name=t.name,this._runtimeStages=[],this._runtimeStagesByName={},this._runtimeNodes=[],this._dirty=!0,zOe(this)}Object.defineProperties(pk.prototype,{articulation:{get:function(){return this._articulation}},sceneGraph:{get:function(){return this._sceneGraph}},name:{get:function(){return this._name}},runtimeStages:{get:function(){return this._runtimeStages}},runtimeNodes:{get:function(){return this._runtimeNodes}}});function zOe(e){let n=e.articulation.stages,i=n.length,o=e._runtimeStages,r=e._runtimeStagesByName;for(let s=0;s 0.0 && clipDistance < clippingPlanesEdgeWidth) { color = clippingPlanesEdgeColor; } } `;var kle={name:"ModelClippingPlanesPipelineStage"},QOe=new D;kle.process=function(e,t,n){let i=t.clippingPlanes,o=n.context,r=e.shaderBuilder;r.addDefine("HAS_CLIPPING_PLANES",void 0,xe.FRAGMENT),r.addDefine("CLIPPING_PLANES_LENGTH",i.length,xe.FRAGMENT),i.unionClippingRegions&&r.addDefine("UNION_CLIPPING_REGIONS",void 0,xe.FRAGMENT),ss.useFloatTexture(o)&&r.addDefine("USE_CLIPPING_PLANES_FLOAT_TEXTURE",void 0,xe.FRAGMENT);let s=ss.getTextureResolution(i,o,QOe);r.addDefine("CLIPPING_PLANES_TEXTURE_WIDTH",s.x,xe.FRAGMENT),r.addDefine("CLIPPING_PLANES_TEXTURE_HEIGHT",s.y,xe.FRAGMENT),r.addUniform("sampler2D","model_clippingPlanes",xe.FRAGMENT),r.addUniform("vec4","model_clippingPlanesEdgeStyle",xe.FRAGMENT),r.addUniform("mat4","model_clippingPlanesMatrix",xe.FRAGMENT),r.addFragmentLines(GW);let a={model_clippingPlanes:function(){return i.texture},model_clippingPlanesEdgeStyle:function(){let c=Y.clone(i.edgeColor);return c.alpha=i.edgeWidth,c},model_clippingPlanesMatrix:function(){return t._clippingPlanesMatrix}};e.uniformMap=xt(a,e.uniformMap)};var EW=kle;var uAn=T(S(),1);var iAn=T(S(),1),XW=`void modelClippingPolygonsStage(ProcessedAttributes attributes) { vec2 sphericalLatLong = czm_approximateSphericalCoordinates(v_positionWC); sphericalLatLong.y = czm_branchFreeTernary(sphericalLatLong.y < czm_pi, sphericalLatLong.y, sphericalLatLong.y - czm_twoPi); vec2 minDistance = vec2(czm_infinity); v_regionIndex = -1; v_clippingPosition = vec2(czm_infinity); for (int regionIndex = 0; regionIndex < CLIPPING_POLYGON_REGIONS_LENGTH; regionIndex++) { vec4 extents = czm_unpackClippingExtents(model_clippingExtents, regionIndex); vec2 rectUv = (sphericalLatLong.yx - extents.yx) * extents.wz; vec2 clamped = clamp(rectUv, vec2(0.0), vec2(1.0)); vec2 distance = abs(rectUv - clamped) * extents.wz; if (minDistance.x > distance.x || minDistance.y > distance.y) { minDistance = distance; v_clippingPosition = rectUv; } float threshold = 0.01; if (rectUv.x > threshold && rectUv.y > threshold && rectUv.x < 1.0 - threshold && rectUv.y < 1.0 - threshold) { v_regionIndex = regionIndex; } } } `;var rAn=T(S(),1),IW=`void modelClippingPolygonsStage() { vec2 clippingPosition = v_clippingPosition; int regionIndex = v_regionIndex; czm_clipPolygons(model_clippingDistance, CLIPPING_POLYGON_REGIONS_LENGTH, clippingPosition, regionIndex); } `;var Ule={name:"ModelClippingPolygonsPipelineStage"};Ule.process=function(e,t,n){let i=t.clippingPolygons,o=e.shaderBuilder;o.addDefine("ENABLE_CLIPPING_POLYGONS",void 0,xe.BOTH),i.inverse&&o.addDefine("CLIPPING_INVERSE",void 0,xe.FRAGMENT),o.addDefine("CLIPPING_POLYGON_REGIONS_LENGTH",i.extentsCount,xe.BOTH),o.addUniform("sampler2D","model_clippingDistance",xe.FRAGMENT),o.addUniform("sampler2D","model_clippingExtents",xe.VERTEX),o.addVarying("vec2","v_clippingPosition"),o.addVarying("int","v_regionIndex","flat"),o.addVertexLines(XW),o.addFragmentLines(IW);let r={model_clippingDistance:function(){return i.clippingTexture},model_clippingExtents:function(){return i.extentsTexture}};e.uniformMap=xt(r,e.uniformMap)};var WW=Ule;var fAn=T(S(),1);function Dle(e,t){this._model=e,this._runtimeNode=t}Object.defineProperties(Dle.prototype,{name:{get:function(){return this._runtimeNode._name}},id:{get:function(){return this._runtimeNode._id}},show:{get:function(){return this._runtimeNode.show},set:function(e){this._runtimeNode.show=e}},matrix:{get:function(){return this._runtimeNode.transform},set:function(e){l(e)?(this._runtimeNode.transform=e,this._runtimeNode.userAnimated=!0,this._model._userAnimationDirty=!0):(this._runtimeNode.transform=this.originalMatrix,this._runtimeNode.userAnimated=!1)}},originalMatrix:{get:function(){return this._runtimeNode.originalTransform}}});var PW=Dle;var aMn=T(S(),1);var DAn=T(S(),1);var bAn=T(S(),1),vW=`mat4 getInstancingTransform() { mat4 instancingTransform; #ifdef HAS_INSTANCE_MATRICES instancingTransform = mat4( a_instancingTransformRow0.x, a_instancingTransformRow1.x, a_instancingTransformRow2.x, 0.0, // Column 1 a_instancingTransformRow0.y, a_instancingTransformRow1.y, a_instancingTransformRow2.y, 0.0, // Column 2 a_instancingTransformRow0.z, a_instancingTransformRow1.z, a_instancingTransformRow2.z, 0.0, // Column 3 a_instancingTransformRow0.w, a_instancingTransformRow1.w, a_instancingTransformRow2.w, 1.0 // Column 4 ); #else vec3 translation = vec3(0.0, 0.0, 0.0); vec3 scale = vec3(1.0, 1.0, 1.0); #ifdef HAS_INSTANCE_TRANSLATION translation = a_instanceTranslation; #endif #ifdef HAS_INSTANCE_SCALE scale = a_instanceScale; #endif instancingTransform = mat4( scale.x, 0.0, 0.0, 0.0, 0.0, scale.y, 0.0, 0.0, 0.0, 0.0, scale.z, 0.0, translation.x, translation.y, translation.z, 1.0 ); #endif return instancingTransform; } #ifdef USE_2D_INSTANCING mat4 getInstancingTransform2D() { mat4 instancingTransform2D; #ifdef HAS_INSTANCE_MATRICES instancingTransform2D = mat4( a_instancingTransform2DRow0.x, a_instancingTransform2DRow1.x, a_instancingTransform2DRow2.x, 0.0, // Column 1 a_instancingTransform2DRow0.y, a_instancingTransform2DRow1.y, a_instancingTransform2DRow2.y, 0.0, // Column 2 a_instancingTransform2DRow0.z, a_instancingTransform2DRow1.z, a_instancingTransform2DRow2.z, 0.0, // Column 3 a_instancingTransform2DRow0.w, a_instancingTransform2DRow1.w, a_instancingTransform2DRow2.w, 1.0 // Column 4 ); #else vec3 translation2D = vec3(0.0, 0.0, 0.0); vec3 scale = vec3(1.0, 1.0, 1.0); #ifdef HAS_INSTANCE_TRANSLATION translation2D = a_instanceTranslation2D; #endif #ifdef HAS_INSTANCE_SCALE scale = a_instanceScale; #endif instancingTransform2D = mat4( scale.x, 0.0, 0.0, 0.0, 0.0, scale.y, 0.0, 0.0, 0.0, 0.0, scale.z, 0.0, translation2D.x, translation2D.y, translation2D.z, 1.0 ); #endif return instancingTransform2D; } #endif `;var yAn=T(S(),1),wW=`void instancingStage(inout ProcessedAttributes attributes) { vec3 positionMC = attributes.positionMC; mat4 instancingTransform = getInstancingTransform(); attributes.positionMC = (instancingTransform * vec4(positionMC, 1.0)).xyz; #ifdef HAS_NORMALS vec3 normalMC = attributes.normalMC; attributes.normalMC = (instancingTransform * vec4(normalMC, 0.0)).xyz; #endif #ifdef USE_2D_INSTANCING mat4 instancingTransform2D = getInstancingTransform2D(); attributes.position2D = (instancingTransform2D * vec4(positionMC, 1.0)).xyz; #endif } `;var _An=T(S(),1),FW=`void legacyInstancingStage( inout ProcessedAttributes attributes, out mat4 instanceModelView, out mat3 instanceModelViewInverseTranspose) { vec3 positionMC = attributes.positionMC; mat4 instancingTransform = getInstancingTransform(); mat4 instanceModel = instancingTransform * u_instance_nodeTransform; instanceModelView = u_instance_modifiedModelView; instanceModelViewInverseTranspose = mat3(u_instance_modifiedModelView * instanceModel); attributes.positionMC = (instanceModel * vec4(positionMC, 1.0)).xyz; #ifdef USE_2D_INSTANCING mat4 instancingTransform2D = getInstancingTransform2D(); attributes.position2D = (instancingTransform2D * vec4(positionMC, 1.0)).xyz; #endif } `;var bk=new M,jOe=new M,qOe=new M,Yle={name:"InstancingPipelineStage",_getInstanceTransformsAsMatrices:Jle,_transformsToTypedArray:UK};Yle.process=function(e,t,n){let i=t.instances,o=i.attributes[0].count,r=e.shaderBuilder;r.addDefine("HAS_INSTANCING"),r.addVertexLines(vW);let s=e.model,a=s.sceneGraph,c=e.runtimeNode,d=n.mode!==oe.SCENE3D&&!n.scene3DOnly&&s._projectTo2D,u=s._enablePick&&!n.context.webgl2,m=[];hHe(e,n,i,m,d,u),bHe(e,n,i,m);let p={};if(i.transformInWorldSpace?(r.addDefine("USE_LEGACY_INSTANCING",void 0,xe.VERTEX),r.addUniform("mat4","u_instance_modifiedModelView",xe.VERTEX),r.addUniform("mat4","u_instance_nodeTransform",xe.VERTEX),p.u_instance_modifiedModelView=function(){let g=M.multiplyTransformation(s.modelMatrix,a.components.transform,bk);return d?M.multiplyTransformation(n.context.uniformState.view3D,g,bk):(n.mode!==oe.SCENE3D&&(g=Gt.basisTo2D(n.mapProjection,g,bk)),M.multiplyTransformation(n.context.uniformState.view,g,bk))},p.u_instance_nodeTransform=function(){return M.multiplyTransformation(a.axisCorrectionMatrix,c.computedTransform,jOe)},r.addVertexLines(FW)):r.addVertexLines(wW),d){r.addDefine("USE_2D_INSTANCING",void 0,xe.VERTEX),r.addUniform("mat4","u_modelView2D",xe.VERTEX);let g=n.context,f=M.fromTranslation(c.instancingReferencePoint2D,new M);p.u_modelView2D=function(){return M.multiplyTransformation(g.uniformState.view,f,qOe)}}e.uniformMap=xt(p,e.uniformMap),e.instanceCount=o,e.attributes.push.apply(e.attributes,m)};var AW=new M,$Oe=new h;function eHe(e,t,n,i,o){let r=M.multiplyTransformation(t,e,AW);return r=M.multiplyTransformation(r,n,AW),o=Gt.basisTo2D(i.mapProjection,r,o),o}function tHe(e,t,n,i,o){let r=M.fromTranslation(e,AW),s=M.multiplyTransformation(t,r,AW);s=M.multiplyTransformation(s,n,AW);let a=M.getTranslation(s,$Oe);return o=ki.computeActualWgs84Position(i,a,o),o}function Ole(e,t,n){let i=e.model,o=i.sceneGraph;e.runtimeNode.node.instances.transformInWorldSpace?(t=M.multiplyTransformation(i.modelMatrix,o.components.transform,t),n=M.multiplyTransformation(o.axisCorrectionMatrix,e.runtimeNode.computedTransform,n)):(t=M.clone(o.computedModelMatrix,t),t=M.multiplyTransformation(t,e.runtimeNode.computedTransform,t),n=M.clone(M.IDENTITY,n))}var Hle=new M,zle=new M,nHe=new M,iHe=new h;function oHe(e,t,n,i){let o=Hle,r=zle;Ole(t,o,r);let a=t.runtimeNode.instancingReferencePoint2D,c=e.length;for(let d=0;d=e.featureIdVertexAttributeSetIndex&&(e.featureIdVertexAttributeSetIndex=a.setIndex+1),i.push({index:e.attributeIndex++,vertexBuffer:a.buffer,componentsPerAttribute:nn.getNumberOfComponents(a.type),componentDatatype:a.componentDatatype,normalize:!1,offsetInBytes:a.byteOffset,strideInBytes:a.byteStride,instanceDivisor:1}),r.addAttribute("float",`a_instanceFeatureId_${a.setIndex}`))}}var MW=Yle;var zAn=T(S(),1);var BK={};BK.name="ModelMatrixUpdateStage";BK.update=function(e,t,n){let i=n.mode!==oe.SCENE3D;if(!(i&&t._model._projectTo2D)&&e._transformDirty){let o=i?t._computedModelMatrix2D:t._computedModelMatrix;Qle(e,t,o,e.transformToRoot),e._transformDirty=!1}};function Qle(e,t,n,i){let o;i=M.multiplyTransformation(i,e.transform,new M),e.updateComputedTransform();let r=e.runtimePrimitives.length;for(o=0;o1&&(i.addDefine("MULTILINE_BATCH_TEXTURE"),i.addUniform("vec2","model_textureDimensions"),o.model_textureDimensions=function(){return c.textureDimensions}),e.uniformMap=xt(o,e.uniformMap)};var BW=tde;var LMn=T(S(),1);var nde={name:"ClassificationPipelineStage"};nde.process=function(e,t,n){e.shaderBuilder.addDefine("HAS_CLASSIFICATION",void 0,xe.BOTH);let o=e.runtimePrimitive;l(o.batchLengths)||yHe(t,o)};function yHe(e,t){let n=jt.getAttributeBySemantic(e,Tt.POSITION);if(!l(n))throw new ue("Primitives must have a position attribute to be used for classification.");let i,o=e.indices,r=l(o);r&&(i=o.typedArray,o.typedArray=void 0);let s=r?o.count:n.count,a=jt.getAttributeBySemantic(e,Tt.FEATURE_ID,0);if(!l(a)){t.batchLengths=[s],t.batchOffsets=[0];return}let c=a.typedArray;a.typedArray=void 0;let d=[],u=[0],m=r?i[0]:0,p=c[m],g=0;for(let x=1;xGHe(i,t,n)):[]}function GHe(e,t,n){let{getAttributeByName:i,getAttributeInfo:o,sanitizeGlslIdentifier:r}=jt,s=e.class.id,a=n?.classes[s],c=Object.entries(e.properties),d=new Array(c.length);for(let u=0;uXHe(n,t)):[]}function XHe(e,t){let{sanitizeGlslIdentifier:n}=jt,i=e.class.id,o=t?.classes[i],r=Object.entries(e.properties).filter(([a,c])=>c.isGpuCompatible()),s=new Array(r.length);for(let a=0;au),n.addStructField(_i.STRUCT_ID_METADATA_FS,r,o);let g=`attributes.texCoord_${a}`,f=g;if(l(m)&&!$.equals(m,$.IDENTITY)){let L=`${p}Transform`;n.addUniform("mat3",L,xe.FRAGMENT),i[L]=function(){return m},f=`vec2(${L} * vec3(${g}, 1.0))`}let x=`texture(${p}, ${f}).${c}`,_=s.unpackInShader(x),C=dde({valueExpression:_,renderResources:e,glslType:r,metadataVariable:o,shaderDestination:xe.FRAGMENT,property:s}),V=`metadata.${o} = ${C};`;n.addFunctionLines(_i.FUNCTION_ID_INITIALIZE_METADATA_FS,[V])}function ade(e,t){let{classProperty:n}=t.property,{metadataVariable:i,glslType:o,shaderDestination:r}=t,s=lde(_i.METADATA_CLASS_FIELDS,n,`metadataClass.${i}`,o),a=`${o}MetadataClass`;e.addStructField(_i.STRUCT_ID_METADATA_CLASS_FS,a,i),e.addFunctionLines(_i.FUNCTION_ID_INITIALIZE_METADATA_FS,s),xe.includesVertexShader(r)&&(e.addStructField(_i.STRUCT_ID_METADATA_CLASS_VS,a,i),e.addFunctionLines(_i.FUNCTION_ID_INITIALIZE_METADATA_VS,s))}function cde(e,t){let{propertyStatistics:n}=t;if(!l(n))return;let{metadataVariable:i,type:o,glslType:r}=t;if(o===zt.ENUM)return;let s=_i.METADATA_STATISTICS_FIELDS,a=`metadataStatistics.${i}`,c=lde(s,n,a,r),d=`${r}MetadataStatistics`;e.addStructField(_i.STRUCT_ID_METADATA_STATISTICS_FS,d,i),e.addFunctionLines(_i.FUNCTION_ID_INITIALIZE_METADATA_FS,c),xe.includesVertexShader(t.shaderDestination)&&(e.addStructField(_i.STRUCT_ID_METADATA_STATISTICS_VS,d,i),e.addFunctionLines(_i.FUNCTION_ID_INITIALIZE_METADATA_VS,c))}function lde(e,t,n,i){function o(r){let s=t[r.specName];if(l(s))return`${n}.${r.shaderName} = ${i}(${s});`}return l(t)?e.map(o).filter(l):[]}function dde(e){let{valueExpression:t,property:n}=e;if(!n.hasValueTransform)return t;let i=e.metadataVariable,o=`u_${i}_offset`,r=`u_${i}_scale`,{shaderBuilder:s,uniformMap:a}=e.renderResources,{glslType:c,shaderDestination:d}=e;s.addUniform(c,o,d),s.addUniform(c,r,d);let{offset:u,scale:m}=n;return a[o]=()=>u,a[r]=()=>m,`czm_valueTransform(${o}, ${r}, ${t})`}var Gu=_i;var CNn=T(S(),1),NHe={INHERIT:0,OPAQUE:1,TRANSLUCENT:2},vg=Object.freeze(NHe);var oa={name:"CustomShaderPipelineStage",STRUCT_ID_ATTRIBUTES_VS:"AttributesVS",STRUCT_ID_ATTRIBUTES_FS:"AttributesFS",STRUCT_NAME_ATTRIBUTES:"Attributes",STRUCT_ID_VERTEX_INPUT:"VertexInput",STRUCT_NAME_VERTEX_INPUT:"VertexInput",STRUCT_ID_FRAGMENT_INPUT:"FragmentInput",STRUCT_NAME_FRAGMENT_INPUT:"FragmentInput",FUNCTION_ID_INITIALIZE_INPUT_STRUCT_VS:"initializeInputStructVS",FUNCTION_SIGNATURE_INITIALIZE_INPUT_STRUCT_VS:"void initializeInputStruct(out VertexInput vsInput, ProcessedAttributes attributes)",FUNCTION_ID_INITIALIZE_INPUT_STRUCT_FS:"initializeInputStructFS",FUNCTION_SIGNATURE_INITIALIZE_INPUT_STRUCT_FS:"void initializeInputStruct(out FragmentInput fsInput, ProcessedAttributes attributes)",_oneTimeWarning:Ft};oa.process=function(e,t,n){let{shaderBuilder:i,model:o,alphaOptions:r}=e,{customShader:s}=o,{lightingModel:a,translucencyMode:c}=s;l(a)&&(e.lightingOptions.lightingModel=a),c===vg.TRANSLUCENT?r.pass=Re.TRANSLUCENT:c===vg.OPAQUE&&(r.pass=void 0);let d=zHe(s,t);if(!d.customShaderEnabled)return;if(jHe(i,s,d),d.shouldComputePositionWC&&i.addDefine("COMPUTE_POSITION_WC_CUSTOM_SHADER",void 0,xe.BOTH),l(s.vertexShaderText)&&i.addDefine("HAS_CUSTOM_VERTEX_SHADER",void 0,xe.VERTEX),l(s.fragmentShaderText)){i.addDefine("HAS_CUSTOM_FRAGMENT_SHADER",void 0,xe.FRAGMENT);let p=b0.getDefineName(s.mode);i.addDefine(p,void 0,xe.FRAGMENT)}let u=s.uniforms;for(let p in u)if(u.hasOwnProperty(p)){let g=u[p];i.addUniform(g.type,p)}let m=s.varyings;for(let p in m)if(m.hasOwnProperty(p)){let g=m[p];i.addVarying(g,p)}e.uniformMap=xt(e.uniformMap,s.uniformMap)};function kHe(e){let t={};for(let n=0;n1?(g=e.attributeIndex,e.attributeIndex+=m):p&&!a?g=0:g=e.attributeIndex++,oze(e,u,g,m,r,s)}hze(i,t.attributes),t.primitiveType===Fe.POINTS&&i.addDefine("PRIMITIVE_TYPE_POINTS"),i.addVertexLines(o2),i.addFragmentLines(i2)};function oze(e,t,n,i,o,r){let s=e.shaderBuilder,a=jt.getAttributeInfo(t),c=o&&!r;i>1?aze(e,t,n,i):sze(e,t,n,c),lze(s,a,c),cze(s,a),l(t.semantic)&&rze(s,t),dze(s,a,o),uze(s,a,c),mze(s,a)}function rze(e,t){let{semantic:n,setIndex:i}=t;switch(n){case Tt.NORMAL:e.addDefine("HAS_NORMALS");break;case Tt.TANGENT:e.addDefine("HAS_TANGENTS");break;case Tt.FEATURE_ID:e.addDefine(`HAS${n}_${i}`);break;case Tt.TEXCOORD:case Tt.COLOR:e.addDefine(`HAS_${n}_${i}`)}}function sze(e,t,n,i){let{quantization:o,semantic:r,setIndex:s}=t,{type:a,componentDatatype:c}=l(o)?o:t;r===Tt.FEATURE_ID&&s>=e.featureIdVertexAttributeSetIndex&&(e.featureIdVertexAttributeSetIndex=s+1);let d=r===Tt.POSITION,u=d?0:n,m=nn.getNumberOfComponents(a),p={index:u,value:l(t.buffer)?void 0:t.constant,vertexBuffer:t.buffer,count:t.count,componentsPerAttribute:m,componentDatatype:c,offsetInBytes:t.byteOffset,strideInBytes:t.byteStride,normalize:t.normalized};if(e.attributes.push(p),!d||!i)return;let g=e.runtimePrimitive.positionBuffer2D,f={index:n,vertexBuffer:g,count:t.count,componentsPerAttribute:m,componentDatatype:Q.FLOAT,offsetInBytes:0,strideInBytes:void 0,normalize:t.normalized};e.attributes.push(f)}function aze(e,t,n,i){let{quantization:o,normalized:r}=t,{type:s,componentDatatype:a}=l(o)?o:t,d=nn.getNumberOfComponents(s)/i,u=Q.getSizeInBytes(a),m=d*u,p=t.byteStride;for(let g=0;g0,d=!l(a)&&c;if(l(r)&&!d){let x=Aze(a),_=Mze(r,x);Nze(i,_);let V=kze(_).indexOf("normalMC")>=0,L=jt.getAttributeBySemantic(t,Tt.NORMAL);if(V&&!L)throw new ue("Style references the NORMAL semantic but the point cloud does not have normals");i.addDefine("COMPUTE_POSITION_WC_STYLE",void 0,xe.VERTEX),_.styleTranslucent&&(e.alphaOptions.pass=Re.TRANSLUCENT)}let u=o.pointCloudShading;u.attenuation&&i.addDefine("HAS_POINT_CLOUD_ATTENUATION",void 0,xe.VERTEX),u.backFaceCulling&&i.addDefine("HAS_POINT_CLOUD_BACK_FACE_CULLING",void 0,xe.VERTEX);let m,p,g;rr.is3DTiles(o.type)&&(p=!0,m=o.content,g=m.tile.refine===vo.ADD),i.addUniform("vec4","model_pointCloudParameters",xe.VERTEX),i.addVertexLines(f2);let f=e.uniformMap;f.model_pointCloudParameters=function(){let x=Pze,_=1;p&&(_=g?5:m.tileset.memoryAdjustedScreenSpaceError),x.x=y(u.maximumAttenuation,_),x.x*=n.pixelRatio;let C=vze(e,t,u,m);x.y=C*u.geometricErrorScale;let V=n.context,L=n.camera.frustum,Z;return n.mode===oe.SCENE2D||L instanceof on?Z=Number.POSITIVE_INFINITY:Z=V.drawingBufferHeight/n.camera.frustum.sseDenominator,x.z=Z,p&&(x.w=m.tileset.timeSinceLoad),x}};var Vde=new h;function vze(e,t,n,i){if(l(i)){let u=i.tile.geometricError;if(u>0)return u}if(l(n.baseResolution))return n.baseResolution;let o=jt.getAttributeBySemantic(t,Tt.POSITION),r=o.count,s=e.runtimeNode.transform,a=h.subtract(o.max,o.min,Vde);a=M.multiplyByPointAsVector(s,a,Vde);let c=a.x*a.y*a.z;return W.cbrt(c/r)}var wze={colorStyleFunction:void 0,showStyleFunction:void 0,pointSizeStyleFunction:void 0,styleTranslucent:!1},Fze={POSITION:"attributes.positionMC",POSITION_ABSOLUTE:"v_positionWC",COLOR:"attributes.color_0",NORMAL:"attributes.normalMC"};function Aze(e){let t=Oe(Fze);if(!l(e))return t;for(let n=0;n0,p=l(i.skin),g=l(r),x=!(g&&l(r.fragmentShaderText))||r.mode!==b0.REPLACE_MATERIAL,_=jt.hasQuantizedAttributes(n.attributes),C=o.debugWireframe&&Fe.isTriangles(n.primitiveType)&&(o._enableDebugWireframe||a),V=o.pointCloudShading,L=l(V)&&V.attenuation,Z=l(V)&&V.backFaceCulling,G=n.primitiveType===Fe.POINTS&&(l(s)||L||Z),X=o._enableShowOutline&&l(n.outlineCoordinates),v=nKe(o,i,n),P=l(o.classificationType);d&&t.push(_2),t.push(s2),C&&t.push(L2),P&&t.push(YW),m&&t.push(m2),p&&t.push(S2),G&&t.push(p2),_&&t.push(n2),x&&t.push(d2),t.push(Pg),t.push(Gu),v.hasPropertyTable&&(t.push(wg),t.push(BW),t.push(zW)),u&&t.push(V2),g&&t.push(e2),t.push(c2),o.allowPicking&&t.push(h2),X&&t.push(y2),t.push(DW),t.push(x2)};function nKe(e,t,n){let i;return l(t.instances)&&(i=jt.getFeatureIdsByLabel(t.instances.featureIds,e.instanceFeatureIdLabel),l(i))?{hasFeatureIds:!0,hasPropertyTable:l(i.propertyTableId)}:(i=jt.getFeatureIdsByLabel(n.featureIds,e.featureIdLabel),l(i)?{hasFeatureIds:!0,hasPropertyTable:l(i.propertyTableId)}:{hasFeatureIds:!1,hasPropertyTable:!1})}var R2=Mde;var yDn=T(S(),1);function JK(e){e=y(e,y.EMPTY_OBJECT),this._sceneGraph=e.sceneGraph;let t=e.skin;this._skin=t,this._inverseBindMatrices=void 0,this._joints=[],this._jointMatrices=[],iKe(this)}Object.defineProperties(JK.prototype,{skin:{get:function(){return this._skin}},sceneGraph:{get:function(){return this._sceneGraph}},inverseBindMatrices:{get:function(){return this._inverseBindMatrices}},joints:{get:function(){return this._joints}},jointMatrices:{get:function(){return this._jointMatrices}}});function iKe(e){let t=e.skin,n=t.inverseBindMatrices;e._inverseBindMatrices=n;let i=t.joints,o=i.length,r=e.sceneGraph._runtimeNodes,s=e.joints,a=e._jointMatrices;for(let c=0;c czm_splitPosition) discard; if (model_splitDirection > 0.0 && gl_FragCoord.x < czm_splitPosition) discard; #endif } `;var yk={name:"ModelSplitterPipelineStage",SPLIT_DIRECTION_UNIFORM_NAME:"model_splitDirection"};yk.process=function(e,t,n){let i=e.shaderBuilder;i.addDefine("HAS_MODEL_SPLITTER",void 0,xe.FRAGMENT),i.addFragmentLines(w2);let o={};i.addUniform("float",yk.SPLIT_DIRECTION_UNIFORM_NAME,xe.FRAGMENT),o[yk.SPLIT_DIRECTION_UNIFORM_NAME]=function(){return t.splitDirection},e.uniformMap=xt(o,e.uniformMap)};var F2=yk;var a3n=T(S(),1);function lKe(e,t){this.model=e.model,this.shaderBuilder=e.shaderBuilder.clone(),this.uniformMap=Oe(e.uniformMap),this.alphaOptions=Oe(e.alphaOptions),this.renderStateOptions=Oe(e.renderStateOptions,!0),this.hasSilhouette=e.hasSilhouette,this.hasSkipLevelOfDetail=e.hasSkipLevelOfDetail,this.runtimeNode=t,this.attributes=[],this.attributeIndex=1,this.featureIdVertexAttributeSetIndex=0,this.instanceCount=0}var A2=lKe;var x3n=T(S(),1);var u3n=T(S(),1);function dKe(e){e=y(e,y.EMPTY_OBJECT),this.lightingModel=y(e.lightingModel,gf.UNLIT)}var M2=dKe;function uKe(e,t){this.model=e.model,this.runtimeNode=e.runtimeNode,this.attributes=e.attributes.slice(),this.attributeIndex=e.attributeIndex,this.featureIdVertexAttributeSetIndex=e.featureIdVertexAttributeSetIndex,this.uniformMap=Oe(e.uniformMap),this.alphaOptions=Oe(e.alphaOptions),this.renderStateOptions=Oe(e.renderStateOptions,!0),this.hasSilhouette=e.hasSilhouette,this.hasSkipLevelOfDetail=e.hasSkipLevelOfDetail,this.shaderBuilder=e.shaderBuilder.clone(),this.instanceCount=e.instanceCount,this.runtimePrimitive=t;let n=t.primitive;this.count=l(n.indices)?n.indices.count:jt.getAttributeBySemantic(n,"POSITION").count,this.hasPropertyTable=!1,this.indices=n.indices,this.wireframeIndexBuffer=void 0,this.primitiveType=n.primitiveType;let i=jt.getPositionMinMax(n,this.runtimeNode.instancingTranslationMin,this.runtimeNode.instancingTranslationMax);this.positionMin=h.clone(i.min,new h),this.positionMax=h.clone(i.max,new h),this.boundingSphere=le.fromCornerPoints(this.positionMin,this.positionMax,new le),this.lightingOptions=new M2,this.pickId=void 0}var N2=uKe;function Ld(e){e=y(e,y.EMPTY_OBJECT);let t=e.modelComponents;this._model=e.model,this._components=t,this._pipelineStages=[],this._updateStages=[],this._runtimeNodes=[],this._rootNodes=[],this._skinnedNodes=[],this._runtimeSkins=[],this.modelPipelineStages=[],this._boundingSphere=void 0,this._boundingSphere2D=void 0,this._computedModelMatrix=M.clone(M.IDENTITY),this._computedModelMatrix2D=M.clone(M.IDENTITY),this._axisCorrectionMatrix=jt.getAxisCorrectionMatrix(t.upAxis,t.forwardAxis,new M),this._runtimeArticulations={},mKe(this)}Object.defineProperties(Ld.prototype,{components:{get:function(){return this._components}},computedModelMatrix:{get:function(){return this._computedModelMatrix}},axisCorrectionMatrix:{get:function(){return this._axisCorrectionMatrix}},boundingSphere:{get:function(){return this._boundingSphere}}});function mKe(e){let t=e._components,n=t.scene,o=e._model.modelMatrix;kde(e,o);let r=t.articulations,s=r.length,a=e._runtimeArticulations;for(let V=0;V0&&(m=Zo(n,t,a),t+=a,c>0&&(p=new Uint8Array(e,t,c),t+=c));let g=new zm(d,u),f=g.getGlobalProperty("POINTS_LENGTH");if(g.featuresLength=f,!l(f))throw new ue("Feature table global property: POINTS_LENGTH must be defined");let x=g.getGlobalProperty("RTC_CENTER",Q.FLOAT,3);l(x)&&(x=h.unpack(x));let _=ZKe(g,m);if(_.rtcCenter=x,_.pointsLength=f,!_.hasPositions){let C=GKe(g);_.positions=C,_.hasPositions=_.hasPositions||l(C)}if(!_.hasPositions)throw new ue("Either POSITION or POSITION_QUANTIZED must be defined.");if(!_.hasNormals){let C=XKe(g);_.normals=C,_.hasNormals=_.hasNormals||l(C)}if(!_.hasColors){let C=EKe(g);_.colors=C,_.hasColors=_.hasColors||l(C),_.hasConstantColor=l(_.constantColor),_.isTranslucent=l(C)&&C.isTranslucent}if(!_.hasBatchIds){let C=IKe(g);_.batchIds=C,_.hasBatchIds=_.hasBatchIds||l(C)}if(_.hasBatchIds){let C=g.getGlobalProperty("BATCH_LENGTH");if(!l(C))throw new ue("Global property: BATCH_LENGTH must be defined when BATCH_ID is defined.");_.batchLength=C}return l(p)&&(p=new Uint8Array(p),_.batchTableJson=m,_.batchTableBinary=p),_};function ZKe(e,t){let n=e.json,i,o,r,s=l(n.extensions)?n.extensions["3DTILES_draco_point_compression"]:void 0,a=l(t)&&l(t.extensions)?t.extensions["3DTILES_draco_point_compression"]:void 0;l(a)&&(r=a.properties);let c,d,u,m,p;if(l(s)){o=s.properties;let f=s.byteOffset,x=s.byteLength;if(!l(o)||!l(f)||!l(x))throw new ue("Draco properties, byteOffset, and byteLength must be defined");i=e.buffer.slice(f,f+x),c=l(o.POSITION),d=l(o.RGB)||l(o.RGBA),u=l(o.NORMAL),m=l(o.BATCH_ID),p=l(o.RGBA)}let g;return l(i)&&(g={buffer:i,featureTableProperties:o,batchTableProperties:r,properties:xt(o,r),dequantizeInShader:!0}),{draco:g,hasPositions:c,hasColors:d,isTranslucent:p,hasNormals:u,hasBatchIds:m}}function GKe(e){let t=e.json,n;if(l(t.POSITION))return n=e.getPropertyArray("POSITION",Q.FLOAT,3),{name:Tt.POSITION,semantic:Tt.POSITION,typedArray:n,isQuantized:!1,componentDatatype:Q.FLOAT,type:nn.VEC3};if(l(t.POSITION_QUANTIZED)){n=e.getPropertyArray("POSITION_QUANTIZED",Q.UNSIGNED_SHORT,3);let i=e.getGlobalProperty("QUANTIZED_VOLUME_SCALE",Q.FLOAT,3);if(!l(i))throw new ue("Global property: QUANTIZED_VOLUME_SCALE must be defined for quantized positions.");let o=65535,r=e.getGlobalProperty("QUANTIZED_VOLUME_OFFSET",Q.FLOAT,3);if(!l(r))throw new ue("Global property: QUANTIZED_VOLUME_OFFSET must be defined for quantized positions.");return{name:Tt.POSITION,semantic:Tt.POSITION,typedArray:n,isQuantized:!0,componentDatatype:Q.FLOAT,type:nn.VEC3,quantizedRange:o,quantizedVolumeOffset:h.unpack(r),quantizedVolumeScale:h.unpack(i),quantizedComponentDatatype:Q.UNSIGNED_SHORT,quantizedType:nn.VEC3}}}function EKe(e){let t=e.json,n;if(l(t.RGBA))return n=e.getPropertyArray("RGBA",Q.UNSIGNED_BYTE,4),{name:Tt.COLOR,semantic:Tt.COLOR,setIndex:0,typedArray:n,componentDatatype:Q.UNSIGNED_BYTE,type:nn.VEC4,normalized:!0,isRGB565:!1,isTranslucent:!0};if(l(t.RGB))return n=e.getPropertyArray("RGB",Q.UNSIGNED_BYTE,3),{name:"COLOR",semantic:Tt.COLOR,setIndex:0,typedArray:n,componentDatatype:Q.UNSIGNED_BYTE,type:nn.VEC3,normalized:!0,isRGB565:!1,isTranslucent:!1};if(l(t.RGB565))return n=e.getPropertyArray("RGB565",Q.UNSIGNED_SHORT,1),{name:"COLOR",semantic:Tt.COLOR,setIndex:0,typedArray:n,componentDatatype:Q.FLOAT,type:nn.VEC3,normalized:!1,isRGB565:!0,isTranslucent:!1};if(l(t.CONSTANT_RGBA)){let i=e.getGlobalProperty("CONSTANT_RGBA",Q.UNSIGNED_BYTE,4),o=i[3],r=Y.fromBytes(i[0],i[1],i[2],o),s=o<255;return{name:Tt.COLOR,semantic:Tt.COLOR,setIndex:0,constantColor:r,componentDatatype:Q.FLOAT,type:nn.VEC4,isQuantized:!1,isTranslucent:s}}}function XKe(e){let t=e.json,n;if(l(t.NORMAL))return n=e.getPropertyArray("NORMAL",Q.FLOAT,3),{name:Tt.NORMAL,semantic:Tt.NORMAL,typedArray:n,octEncoded:!1,octEncodedZXY:!1,componentDatatype:Q.FLOAT,type:nn.VEC3};if(l(t.NORMAL_OCT16P))return n=e.getPropertyArray("NORMAL_OCT16P",Q.UNSIGNED_BYTE,2),{name:Tt.NORMAL,semantic:Tt.NORMAL,typedArray:n,octEncoded:!0,octEncodedZXY:!1,quantizedRange:(1<<8)-1,quantizedType:nn.VEC2,quantizedComponentDatatype:Q.UNSIGNED_BYTE,componentDatatype:Q.FLOAT,type:nn.VEC3}}function IKe(e){let t=e.json;if(l(t.BATCH_ID)){let n=e.getPropertyArray("BATCH_ID",Q.UNSIGNED_SHORT,1);return{name:Tt.FEATURE_ID,semantic:Tt.FEATURE_ID,setIndex:0,typedArray:n,componentDatatype:Q.fromTypedArray(n),type:nn.SCALAR}}}var z_=Yde;var WKe=Tn.Components,PKe=Tn.Scene,vKe=Tn.Node,wKe=Tn.Primitive,FKe=Tn.Attribute,Ode=Tn.Quantization,AKe=Tn.FeatureIdAttribute,MKe=Tn.Material,NKe=Tn.MetallicRoughness;function Fg(e){e=y(e,y.EMPTY_OBJECT);let t=e.arrayBuffer,n=y(e.byteOffset,0);this._arrayBuffer=t,this._byteOffset=n,this._loadAttributesFor2D=y(e.loadAttributesFor2D,!1),this._parsedContent=void 0,this._decodePromise=void 0,this._decodedAttributes=void 0,this._promise=void 0,this._error=void 0,this._state=Xt.UNLOADED,this._buffers=[],this._components=void 0,this._transform=M.IDENTITY}l(Object.create)&&(Fg.prototype=Object.create(to.prototype),Fg.prototype.constructor=Fg);Object.defineProperties(Fg.prototype,{cacheKey:{get:function(){}},components:{get:function(){return this._components}},transform:{get:function(){return this._transform}}});Fg.prototype.load=function(){if(l(this._promise))return this._promise;this._parsedContent=z_.parse(this._arrayBuffer,this._byteOffset),this._state=Xt.PROCESSING,this._promise=Promise.resolve(this)};Fg.prototype.process=function(e){if(l(this._error)){let t=this._error;throw this._error=void 0,t}if(this._state===Xt.READY)return!0;if(this._state===Xt.PROCESSING){if(l(this._decodePromise))return!1;this._decodePromise=kKe(this,e.context)}return!1};function kKe(e,t){let i=e._parsedContent.draco,o;if(l(i)?o=i0.decodePointCloud(i,t):o=Promise.resolve(),!!l(o))return e._decodePromise=o,o.then(function(r){if(!e.isDestroyed())return l(r)&&UKe(e,i,r),qKe(e,t),e._state=Xt.READY,e}).catch(function(r){e.unload(),e._state=Xt.FAILED;let s="Failed to load Draco pnts";e._error=e.getError(s,r)})}function UKe(e,t,n){e._state=Xt.READY;let i=e._parsedContent,o;if(l(n.POSITION)){if(o={name:"POSITION",semantic:Tt.POSITION,typedArray:n.POSITION.array,componentDatatype:Q.FLOAT,type:nn.VEC3,isQuantized:!1},l(n.POSITION.data.quantization)){let a=n.POSITION.data.quantization,c=a.range,d=h.fromElements(c,c,c),u=h.unpack(a.minValues),m=(1<0&&$Ke(e,a,m,t),l(n.rtcCenter)&&(u.transform=M.multiplyByTranslation(u.transform,n.rtcCenter,u.transform));let p=n.positions;l(p)&&p.isQuantized&&(u.transform=M.multiplyByTranslation(u.transform,p.quantizedVolumeOffset,u.transform)),e._components=u,e._parsedContent=void 0,e._arrayBuffer=void 0}function $Ke(e,t,n,i){let o=t.attributes,r=n.length;for(let s=0;s=0&&(a=ye)}}}}if(a!==Number.MAX_VALUE){if(s=pn.getPoint(t,a,s),n.mode!==oe.SCENE3D){h.fromElements(s.y,s.z,s.x,s);let u=n.mapProjection,m=u.ellipsoid,p=u.unproject(s,sJe);m.cartographicToCartesian(p,s)}return s}}function qK(e,t,n,i,o,r,s,a,c,d){let u=n+t*i;if(d.x=e[u],d.y=e[u+1],d.z=e[u+2],l(o))if(o.octEncoded){if(d=wn.octDecodeInRange(d,o.normalizationRange,d),o.octEncodedZXY){let m=d.x;d.x=d.z,d.z=d.y,d.y=m}}else d=h.multiplyComponents(d,o.quantizedVolumeStepSize,d),d=h.add(d,o.quantizedVolumeOffset,d);return d=M.multiplyByPoint(r,d,d),s!==1&&mr.getPosition(d,c,s,a,d),d}function uo(e){e=y(e,y.EMPTY_OBJECT),this._loader=e.loader,this._resource=e.resource,this.type=y(e.type,rr.GLTF),this.modelMatrix=M.clone(y(e.modelMatrix,M.IDENTITY)),this._modelMatrix=M.clone(this.modelMatrix),this._scale=y(e.scale,1),this._minimumPixelSize=y(e.minimumPixelSize,0),this._maximumScale=e.maximumScale,this._clampedScale=l(this._maximumScale)?Math.min(this._scale,this._maximumScale):this._scale,this._computedScale=this._clampedScale,this._updateModelMatrix=!1,this.referenceMatrix=void 0,this._iblReferenceFrameMatrix=$.clone($.IDENTITY),this._resourcesLoaded=!1,this._drawCommandsBuilt=!1,this._ready=!1,this._customShader=e.customShader,this._content=e.content,this._texturesLoaded=!1,this._defaultTexture=void 0,this._activeAnimations=new lW(this),this._clampAnimations=y(e.clampAnimations,!0),this._userAnimationDirty=!1,this._id=e.id,this._idDirty=!1,this._color=Y.clone(e.color),this._colorBlendMode=y(e.colorBlendMode,hc.HIGHLIGHT),this._colorBlendAmount=y(e.colorBlendAmount,.5);let t=y(e.silhouetteColor,Y.RED);this._silhouetteColor=Y.clone(t),this._silhouetteSize=y(e.silhouetteSize,0),this._silhouetteDirty=!1,this._silhouetteId=void 0,this._cull=y(e.cull,!0),this._opaquePass=y(e.opaquePass,Re.OPAQUE),this._allowPicking=y(e.allowPicking,!0),this._show=y(e.show,!0),this._style=void 0,this._styleDirty=!1,this._styleCommandsNeeded=void 0;let n=y(e.featureIdLabel,"featureId_0");typeof n=="number"&&(n=`featureId_${n}`),this._featureIdLabel=n;let i=y(e.instanceFeatureIdLabel,"instanceFeatureId_0");typeof i=="number"&&(i=`instanceFeatureId_${i}`),this._instanceFeatureIdLabel=i,this._featureTables=[],this._featureTableId=void 0,this._featureTableIdDirty=!0,this._pipelineResources=[],this._modelResources=[],this._pickIds=[],this._boundingSphere=new le,this._initialRadius=void 0,this._heightReference=y(e.heightReference,Je.NONE),this._heightDirty=this._heightReference!==Je.NONE,this._removeUpdateHeightCallback=void 0,this._verticalExaggerationOn=!1,this._clampedModelMatrix=void 0;let o=e.scene;l(o)&&l(o.terrainProviderChanged)&&(this._terrainProviderChangedCallback=o.terrainProviderChanged.addEventListener(()=>{this._heightDirty=!0})),this._scene=o,this._distanceDisplayCondition=e.distanceDisplayCondition;let r=new bf(e.pointCloudShading);this._pointCloudShading=r,this._attenuation=r.attenuation,this._pointCloudBackFaceCulling=r.backFaceCulling;let s=e.clippingPlanes;l(s)&&s.owner===void 0?ss.setOwner(s,this,"_clippingPlanes"):this._clippingPlanes=s,this._clippingPlanesState=0,this._clippingPlanesMatrix=M.clone(M.IDENTITY);let a=e.clippingPolygons;l(a)&&a.owner===void 0?Ym.setOwner(a,this,"_clippingPolygons"):this._clippingPolygons=a,this._clippingPolygonsState=0,this._lightColor=h.clone(e.lightColor),this._imageBasedLighting=l(e.imageBasedLighting)?e.imageBasedLighting:new g_,this._shouldDestroyImageBasedLighting=!l(e.imageBasedLighting),this._backFaceCulling=y(e.backFaceCulling,!0),this._backFaceCullingDirty=!1,this._shadows=y(e.shadows,_n.ENABLED),this._shadowsDirty=!1,this._debugShowBoundingVolumeDirty=!1,this._debugShowBoundingVolume=y(e.debugShowBoundingVolume,!1),this._enableDebugWireframe=y(e.enableDebugWireframe,!1),this._enableShowOutline=y(e.enableShowOutline,!0),this._debugWireframe=y(e.debugWireframe,!1),this._debugWireframe===!0&&this._enableDebugWireframe===!1&&this.type===rr.GLTF&&Ft("model-debug-wireframe-ignored","enableDebugWireframe must be set to true in Model.fromGltf, otherwise debugWireframe will be ignored.");let c=e.credit;typeof c=="string"&&(c=new Ct(c)),this._credits=[],this._credit=c,this._resourceCredits=[],this._gltfCredits=[],this._showCreditsOnScreen=y(e.showCreditsOnScreen,!1),this._showCreditsOnScreenDirty=!0,this._splitDirection=y(e.splitDirection,qc.NONE),this._enableShowOutline=y(e.enableShowOutline,!0),this.showOutline=y(e.showOutline,!0),this.outlineColor=y(e.outlineColor,Y.BLACK),this._classificationType=e.classificationType,this._statistics=new U2,this._sceneMode=void 0,this._projectTo2D=y(e.projectTo2D,!1),this._enablePick=y(e.enablePick,!1),this._fogRenderable=void 0,this._skipLevelOfDetail=!1,this._ignoreCommands=y(e.ignoreCommands,!1),this._errorEvent=new ge,this._readyEvent=new ge,this._texturesReadyEvent=new ge,this._sceneGraph=void 0,this._nodesByName={},this.pickObject=e.pickObject}function $K(e,t){if(e._errorEvent.numberOfListeners>0){e._errorEvent.raiseEvent(t);return}console.log(t)}function cJe(e,t){let n=e._featureTables,i=t.propertyTables,o=i.length;for(let r=0;r0&&t===0||e===0&&t>0;this._silhouetteDirty=this._silhouetteDirty||n,this._backFaceCullingDirty=this._backFaceCullingDirty||n}this._silhouetteSize=e}},boundingSphere:{get:function(){let e=l(this._clampedModelMatrix)?this._clampedModelMatrix:this.modelMatrix;return Qde(this,e),this._boundingSphere}},debugShowBoundingVolume:{get:function(){return this._debugShowBoundingVolume},set:function(e){this._debugShowBoundingVolume!==e&&(this._debugShowBoundingVolumeDirty=!0),this._debugShowBoundingVolume=e}},debugWireframe:{get:function(){return this._debugWireframe},set:function(e){this._debugWireframe!==e&&this.resetDrawCommands(),this._debugWireframe=e,this._debugWireframe===!0&&this._enableDebugWireframe===!1&&this.type===rr.GLTF&&Ft("model-debug-wireframe-ignored","enableDebugWireframe must be set to true in Model.fromGltfAsync, otherwise debugWireframe will be ignored.")}},show:{get:function(){return this._show},set:function(e){this._show=e}},featureIdLabel:{get:function(){return this._featureIdLabel},set:function(e){typeof e=="number"&&(e=`featureId_${e}`),e!==this._featureIdLabel&&(this._featureTableIdDirty=!0),this._featureIdLabel=e}},instanceFeatureIdLabel:{get:function(){return this._instanceFeatureIdLabel},set:function(e){typeof e=="number"&&(e=`instanceFeatureId_${e}`),e!==this._instanceFeatureIdLabel&&(this._featureTableIdDirty=!0),this._instanceFeatureIdLabel=e}},clippingPlanes:{get:function(){return this._clippingPlanes},set:function(e){e!==this._clippingPlanes&&(ss.setOwner(e,this,"_clippingPlanes"),this.resetDrawCommands())}},clippingPolygons:{get:function(){return this._clippingPolygons},set:function(e){e!==this._clippingPolygons&&(Ym.setOwner(e,this,"_clippingPolygons"),this.resetDrawCommands())}},lightColor:{get:function(){return this._lightColor},set:function(e){l(e)!==l(this._lightColor)&&this.resetDrawCommands(),this._lightColor=h.clone(e,this._lightColor)}},imageBasedLighting:{get:function(){return this._imageBasedLighting},set:function(e){e!==this._imageBasedLighting&&(this._shouldDestroyImageBasedLighting&&!this._imageBasedLighting.isDestroyed()&&this._imageBasedLighting.destroy(),this._imageBasedLighting=e,this._shouldDestroyImageBasedLighting=!1,this.resetDrawCommands())}},backFaceCulling:{get:function(){return this._backFaceCulling},set:function(e){e!==this._backFaceCulling&&(this._backFaceCullingDirty=!0),this._backFaceCulling=e}},scale:{get:function(){return this._scale},set:function(e){e!==this._scale&&(this._updateModelMatrix=!0),this._scale=e}},computedScale:{get:function(){return this._computedScale}},minimumPixelSize:{get:function(){return this._minimumPixelSize},set:function(e){e!==this._minimumPixelSize&&(this._updateModelMatrix=!0),this._minimumPixelSize=e}},maximumScale:{get:function(){return this._maximumScale},set:function(e){e!==this._maximumScale&&(this._updateModelMatrix=!0),this._maximumScale=e}},shadows:{get:function(){return this._shadows},set:function(e){e!==this._shadows&&(this._shadowsDirty=!0),this._shadows=e}},credit:{get:function(){return this._credit}},showCreditsOnScreen:{get:function(){return this._showCreditsOnScreen},set:function(e){this._showCreditsOnScreen!==e&&(this._showCreditsOnScreenDirty=!0),this._showCreditsOnScreen=e}},splitDirection:{get:function(){return this._splitDirection},set:function(e){this._splitDirection!==e&&this.resetDrawCommands(),this._splitDirection=e}},classificationType:{get:function(){return this._classificationType}},pickIds:{get:function(){return this._pickIds}},styleCommandsNeeded:{get:function(){return this._styleCommandsNeeded}}});uo.prototype.getNode=function(e){return this._nodesByName[e]};uo.prototype.setArticulationStage=function(e,t){this._sceneGraph.setArticulationStage(e,t)};uo.prototype.applyArticulations=function(){this._sceneGraph.applyArticulations()};uo.prototype.makeStyleDirty=function(){this._styleDirty=!0};uo.prototype.resetDrawCommands=function(){this._drawCommandsBuilt=!1};var dJe=new M,uJe=new $,mJe=new M;uo.prototype.update=function(e){let t=!1;try{t=hJe(this,e)}catch(n){if(!this._loader.incrementallyLoadTextures&&n.name==="TextureError")$K(this,n);else{let i=jt.getError("model",this._resource,n);$K(this,i)}}if(fJe(this,e),pJe(this,e),!this._resourcesLoaded&&t){this._resourcesLoaded=!0;let n=this._loader.components;if(!l(n)){if(this._loader.isUnloaded())return;let r=jt.getError("model",this._resource,new ue("Failed to load model."));$K(r),this._rejectLoad=this._rejectLoad&&this._rejectLoad(r)}let i=n.structuralMetadata;l(i)&&i.propertyTableCount>0&&cJe(this,i);let o=new k2({model:this,modelComponents:n});this._sceneGraph=o,this._gltfCredits=o.components.asset.credits}if(!(!this._resourcesLoaded||e.mode===oe.MORPHING)){if(bJe(this),gJe(this),yJe(this,e),xJe(this),_Je(this,e),TJe(this,e),SJe(this,e),CJe(this,e),VJe(this,e),LJe(this,e),RJe(this,e),this._defaultTexture=e.context.defaultTexture,ZJe(this,e),GJe(this,e),EJe(this),XJe(this,e),vJe(this,e),!this._ready){e.afterRender.push(()=>{this._ready=!0,this._readyEvent.raiseEvent(this)});return}this._loader.incrementallyLoadTextures&&!this._texturesLoaded&&this._loader.texturesLoaded&&(this.resetDrawCommands(),this._texturesLoaded=!0,this._texturesReadyEvent.raiseEvent(this)),WJe(this),wJe(this,e),FJe(this),AJe(this,e)}};function hJe(e,t){return!e._resourcesLoaded||e._loader.incrementallyLoadTextures&&!e._texturesLoaded?(t.afterRender.push(()=>!0),e._loader.process(t)):!0}function fJe(e,t){l(e._customShader)&&e._customShader.update(t)}function pJe(e,t){e._imageBasedLighting.update(t),e._imageBasedLighting.shouldRegenerateShaders&&e.resetDrawCommands()}function bJe(e){if(!e._featureTableIdDirty)return;e._featureTableIdDirty=!1;let t=e._sceneGraph.components,n=t.structuralMetadata;l(n)&&n.propertyTableCount>0&&(e.featureTableId=lJe(t,e),e._styleDirty=!0,e.resetDrawCommands())}function gJe(e){e._styleDirty&&(e.applyStyle(e._style),e._styleDirty=!1)}function yJe(e,t){let n=e._featureTables,i=n.length,o=!1;for(let r=0;r=i&&r<=o}function UJe(e,t){let n=t.creditDisplay,i=e._credits,o=i.length;for(let r=0;r0&&e.alpha<1};uo.prototype.isInvisible=function(){let e=this.color;return l(e)&&e.alpha===0};function jde(e){return e.context.stencilBuffer}uo.prototype.hasSilhouette=function(e){return jde(e)&&this._silhouetteSize>0&&this._silhouetteColor.alpha>0&&!l(this._classificationType)};uo.prototype.hasSkipLevelOfDetail=function(e){if(!rr.is3DTiles(this.type))return!1;let t=e.context.stencilBuffer,n=this._content.tileset;return t&&n.isSkippingLevelOfDetail};uo.prototype.isClippingEnabled=function(){let e=this._clippingPlanes;return l(e)&&e.enabled&&e.length!==0};uo.prototype.pick=function(e,t,n,i,o){return T1(this,e,t,n,i,o)};uo.prototype.isClippingPolygonsEnabled=function(){let e=this._clippingPolygons;return l(e)&&e.enabled&&e.length!==0};uo.prototype.isDestroyed=function(){return!1};uo.prototype.destroy=function(){let e=this._loader;l(e)&&e.destroy();let t=this._featureTables;if(l(t)){let o=t.length;for(let r=0;r0,i=l(this.structuralMetadata)?this.structuralMetadata.propertyAttributes:void 0,o=l(i)&&l(i[0]);if(t&&(!n||o)){this.resetDrawCommands();return}n?(this.featureTables[this.featureTableId].applyStyle(e),Jde(this,e)):(this.applyColorAndShow(e),this._styleCommandsNeeded=void 0)};function Y2(e,t,n){return{loader:e,type:t,resource:n.resource,show:n.show,modelMatrix:n.modelMatrix,scale:n.scale,minimumPixelSize:n.minimumPixelSize,maximumScale:n.maximumScale,id:n.id,allowPicking:n.allowPicking,clampAnimations:n.clampAnimations,shadows:n.shadows,debugShowBoundingVolume:n.debugShowBoundingVolume,enableDebugWireframe:n.enableDebugWireframe,debugWireframe:n.debugWireframe,cull:n.cull,opaquePass:n.opaquePass,customShader:n.customShader,content:n.content,heightReference:n.heightReference,scene:n.scene,distanceDisplayCondition:n.distanceDisplayCondition,color:n.color,colorBlendAmount:n.colorBlendAmount,colorBlendMode:n.colorBlendMode,silhouetteColor:n.silhouetteColor,silhouetteSize:n.silhouetteSize,enableShowOutline:n.enableShowOutline,showOutline:n.showOutline,outlineColor:n.outlineColor,clippingPlanes:n.clippingPlanes,clippingPolygons:n.clippingPolygons,lightColor:n.lightColor,imageBasedLighting:n.imageBasedLighting,backFaceCulling:n.backFaceCulling,credit:n.credit,showCreditsOnScreen:n.showCreditsOnScreen,splitDirection:n.splitDirection,projectTo2D:n.projectTo2D,enablePick:n.enablePick,featureIdLabel:n.featureIdLabel,instanceFeatureIdLabel:n.instanceFeatureIdLabel,pointCloudShading:n.pointCloudShading,classificationType:n.classificationType,pickObject:n.pickObject}}var Qm=uo;function ys(e,t,n){this._tileset=e,this._tile=t,this._resource=n,this._model=void 0,this._metadata=void 0,this._group=void 0,this._ready=!1}Object.defineProperties(ys.prototype,{featuresLength:{get:function(){let e=this._model,t=e.featureTables,n=e.featureTableId;return l(t)&&l(t[n])?t[n].featuresLength:0}},pointsLength:{get:function(){return this._model.statistics.pointsLength}},trianglesLength:{get:function(){return this._model.statistics.trianglesLength}},geometryByteLength:{get:function(){return this._model.statistics.geometryByteLength}},texturesByteLength:{get:function(){return this._model.statistics.texturesByteLength}},batchTableByteLength:{get:function(){let e=this._model.statistics;return e.propertyTablesByteLength+e.batchTexturesByteLength}},innerContents:{get:function(){}},ready:{get:function(){return this._ready}},tileset:{get:function(){return this._tileset}},tile:{get:function(){return this._tile}},url:{get:function(){return this._resource.getUrlComponent(!0)}},batchTable:{get:function(){let e=this._model,t=e.featureTables,n=e.featureTableId;if(l(t)&&l(t[n]))return t[n]}},metadata:{get:function(){return this._metadata},set:function(e){this._metadata=e}},group:{get:function(){return this._group},set:function(e){this._group=e}}});ys.prototype.getFeature=function(e){let t=this._model,n=t.featureTableId;return t.featureTables[n].getFeature(e)};ys.prototype.hasProperty=function(e,t){let n=this._model,i=n.featureTableId;return l(i)?n.featureTables[i].hasProperty(e,t):!1};ys.prototype.applyDebugSettings=function(e,t){t=e?t:Y.WHITE,this.featuresLength===0?this._model.color=t:l(this.batchTable)&&this.batchTable.setAllColor(t)};ys.prototype.applyStyle=function(e){this._model.style=e};ys.prototype.update=function(e,t){let n=this._model,i=this._tile;n.colorBlendAmount=e.colorBlendAmount,n.colorBlendMode=e.colorBlendMode,n.modelMatrix=i.computedTransform,n.customShader=e.customShader,n.featureIdLabel=e.featureIdLabel,n.instanceFeatureIdLabel=e.instanceFeatureIdLabel,n.lightColor=e.lightColor,n.imageBasedLighting=e.imageBasedLighting,n.backFaceCulling=e.backFaceCulling,n.shadows=e.shadows,n.showCreditsOnScreen=e.showCreditsOnScreen,n.splitDirection=e.splitDirection,n.debugWireframe=e.debugWireframe,n.showOutline=e.showOutline,n.outlineColor=e.outlineColor,n.pointCloudShading=e.pointCloudShading;let o=e.clippingPlanes;n.referenceMatrix=e.clippingPlanesOriginMatrix,l(o)&&i.clippingPlanesDirty&&(n._clippingPlanes=o.enabled&&i._isClipped?o:void 0),l(o)&&l(n._clippingPlanes)&&n._clippingPlanes!==o&&(n._clippingPlanes=o,n._clippingPlanesState=0);let r=e.clippingPolygons;l(r)&&i.clippingPolygonsDirty&&(n._clippingPolygons=r.enabled&&i._isClippedByPolygon?r:void 0),l(r)&&l(n._clippingPolygons)&&n._clippingPolygons!==r&&(n._clippingPolygons=r,n._clippingPolygonsState=0),n.update(t),!this._ready&&n.ready&&(n.activeAnimations.addAll({loop:Al.REPEAT}),this._ready=!0)};ys.prototype.isDestroyed=function(){return!1};ys.prototype.destroy=function(){return this._model=this._model&&this._model.destroy(),me(this)};ys.fromGltf=async function(e,t,n,i){let o=new ys(e,t,n),s=O2(e,t,o,{gltf:i,basePath:n}),a=e.vectorClassificationOnly?void 0:e.classificationType;s.classificationType=a;let c=await Qm.fromGltfAsync(s);return o._model=c,o};ys.fromB3dm=async function(e,t,n,i,o){let r=new ys(e,t,n),a=O2(e,t,r,{arrayBuffer:i,byteOffset:o,resource:n}),c=e.vectorClassificationOnly?void 0:e.classificationType;a.classificationType=c;let d=await Qm.fromB3dm(a);return r._model=d,r};ys.fromI3dm=async function(e,t,n,i,o){let r=new ys(e,t,n),a=O2(e,t,r,{arrayBuffer:i,byteOffset:o,resource:n}),c=await Qm.fromI3dm(a);return r._model=c,r};ys.fromPnts=async function(e,t,n,i,o){let r=new ys(e,t,n),a=O2(e,t,r,{arrayBuffer:i,byteOffset:o,resource:n}),c=await Qm.fromPnts(a);return r._model=c,r};ys.fromGeoJson=async function(e,t,n,i){let o=new ys(e,t,n),s=O2(e,t,o,{geoJson:i,resource:n}),a=await Qm.fromGeoJson(s);return o._model=a,o};ys.prototype.pick=function(e,t,n){if(!l(this._model)||!this._ready)return;let i=t.verticalExaggeration,o=t.verticalExaggerationRelativeHeight;return this._model.pick(e,t,i,o,ie.WGS84,n)};function O2(e,t,n,i){let o={cull:!1,releaseGltfJson:!0,opaquePass:Re.CESIUM_3D_TILE,modelMatrix:t.computedTransform,upAxis:e._modelUpAxis,forwardAxis:e._modelForwardAxis,incrementallyLoadTextures:!1,customShader:e.customShader,content:n,colorBlendMode:e.colorBlendMode,colorBlendAmount:e.colorBlendAmount,lightColor:e.lightColor,imageBasedLighting:e.imageBasedLighting,featureIdLabel:e.featureIdLabel,instanceFeatureIdLabel:e.instanceFeatureIdLabel,pointCloudShading:e.pointCloudShading,clippingPlanes:e.clippingPlanes,backFaceCulling:e.backFaceCulling,shadows:e.shadows,showCreditsOnScreen:e.showCreditsOnScreen,splitDirection:e.splitDirection,enableDebugWireframe:e._enableDebugWireframe,debugWireframe:e.debugWireframe,projectTo2D:e._projectTo2D,enablePick:e._enablePick,enableShowOutline:e._enableShowOutline,showOutline:e.showOutline,outlineColor:e.outlineColor};return xt(i,o)}var yf=ys;var tOn=T(S(),1);function Eu(e,t,n){this._tileset=e,this._tile=t,this._resource=n,this.featurePropertiesDirty=!1,this._metadata=void 0,this._group=void 0,this._ready=!1}Object.defineProperties(Eu.prototype,{featuresLength:{get:function(){return 0}},pointsLength:{get:function(){return 0}},trianglesLength:{get:function(){return 0}},geometryByteLength:{get:function(){return 0}},texturesByteLength:{get:function(){return 0}},batchTableByteLength:{get:function(){return 0}},innerContents:{get:function(){}},ready:{get:function(){return this._ready}},tileset:{get:function(){return this._tileset}},tile:{get:function(){return this._tile}},url:{get:function(){return this._resource.getUrlComponent(!0)}},batchTable:{get:function(){}},metadata:{get:function(){return this._metadata},set:function(e){this._metadata=e}},group:{get:function(){return this._group},set:function(e){this._group=e}}});Eu.fromJson=function(e,t,n,i){let o=new Eu(e,t,n);return o._tileset.loadTileset(o._resource,i,o._tile),o._ready=!0,o};Eu.prototype.hasProperty=function(e,t){return!1};Eu.prototype.getFeature=function(e){};Eu.prototype.applyDebugSettings=function(e,t){};Eu.prototype.applyStyle=function(e){};Eu.prototype.update=function(e,t){};Eu.prototype.pick=function(e,t,n){};Eu.prototype.isDestroyed=function(){return!1};Eu.prototype.destroy=function(){return me(this)};var H2=Eu;var OQn=T(S(),1);var QKn=T(S(),1);var wHn=T(S(),1);var uOn=T(S(),1);function As(e,t,n,i){let o=As._verifyAttributes(t);n=y(n,0);let r=[],s={},a,c,d=o.length;for(let m=0;m0?Q.getSizeInBytes(e[0].componentDatatype):0,o=i>0?t%i:0,r=o===0?0:i-o;return t+=r,t};As._createArrayViews=function(e,t){let n=[],i=0,o=e.length;for(let r=0;r0){let n=new ArrayBuffer(t*e.vertexSizeInBytes);if(l(e.arrayBuffer)){let r=new Uint8Array(n),s=new Uint8Array(e.arrayBuffer),a=s.length;for(let c=0;c0){t.needsCommit=!1;let n=t.vertexBuffer,i=e._size*t.vertexSizeInBytes,o=l(n);if(!o||n.sizeInBytes0){let i=e.vertexSizeInBytes*t,o=e.vertexSizeInBytes*n;e.vertexBuffer.copyFromArrayView(new Uint8Array(e.arrayBuffer,i,o),i)}}As.prototype.endSubCommits=function(){let e=this._allBuffers;for(let t=0,n=e.length;t 0.0) { // Don't get the outline edge exceed the SDF_EDGE float outlineEdge = clamp(SDF_EDGE - outlineWidth, 0.0, SDF_EDGE); float outlineFactor = smoothstep(SDF_EDGE - smoothing, SDF_EDGE + smoothing, distance); vec4 sdfColor = mix(outlineColor, v_color, outlineFactor); float alpha = smoothstep(outlineEdge - smoothing, outlineEdge + smoothing, distance); return vec4(sdfColor.rgb, sdfColor.a * alpha); } else { float alpha = smoothstep(SDF_EDGE - smoothing, SDF_EDGE + smoothing, distance); return vec4(v_color.rgb, v_color.a * alpha); } } #endif void main() { vec4 color = texture(u_atlas, v_textureCoordinates); #ifdef SDF float outlineWidth = v_outlineWidth; vec4 outlineColor = v_outlineColor; // Get the current distance float distance = getDistance(v_textureCoordinates); #if (__VERSION__ == 300 || defined(GL_OES_standard_derivatives)) float smoothing = fwidth(distance); // Get an offset that is approximately half the distance to the neighbor pixels // 0.354 is approximately half of 1/sqrt(2) vec2 sampleOffset = 0.354 * vec2(dFdx(v_textureCoordinates) + dFdy(v_textureCoordinates)); // Sample the center point vec4 center = getSDFColor(v_textureCoordinates, outlineWidth, outlineColor, smoothing); // Sample the 4 neighbors vec4 color1 = getSDFColor(v_textureCoordinates + vec2(sampleOffset.x, sampleOffset.y), outlineWidth, outlineColor, smoothing); vec4 color2 = getSDFColor(v_textureCoordinates + vec2(-sampleOffset.x, sampleOffset.y), outlineWidth, outlineColor, smoothing); vec4 color3 = getSDFColor(v_textureCoordinates + vec2(-sampleOffset.x, -sampleOffset.y), outlineWidth, outlineColor, smoothing); vec4 color4 = getSDFColor(v_textureCoordinates + vec2(sampleOffset.x, -sampleOffset.y), outlineWidth, outlineColor, smoothing); // Equally weight the center sample and the 4 neighboring samples color = (center + color1 + color2 + color3 + color4)/5.0; #else // If no derivatives available (IE 10?), just do a single sample float smoothing = 1.0/32.0; color = getSDFColor(v_textureCoordinates, outlineWidth, outlineColor, smoothing); #endif color = czm_gammaCorrect(color); #else color = czm_gammaCorrect(color); color *= czm_gammaCorrect(v_color); #endif // Fully transparent parts of the billboard are not pickable. #if !defined(OPAQUE) && !defined(TRANSLUCENT) if (color.a < 0.005) // matches 0/255 and 1/255 { discard; } #else // The billboard is rendered twice. The opaque pass discards translucent fragments // and the translucent pass discards opaque fragments. #ifdef OPAQUE if (color.a < 0.995) // matches < 254/255 { discard; } #else if (color.a >= 0.995) // matches 254/255 and 255/255 { discard; } #endif #endif #ifdef VECTOR_TILE color *= u_highlightColor; #endif out_FragColor = color; #ifdef LOG_DEPTH czm_writeLogDepth(); #endif #ifdef FRAGMENT_DEPTH_CHECK float temp = v_compressed.y; temp = temp * SHIFT_RIGHT1; float temp2 = (temp - floor(temp)) * SHIFT_LEFT1; bool enableDepthTest = temp2 != 0.0; bool applyTranslate = floor(temp) != 0.0; if (enableDepthTest) { temp = v_compressed.z; temp = temp * SHIFT_RIGHT12; vec2 dimensions; dimensions.y = (temp - floor(temp)) * SHIFT_LEFT12; dimensions.x = floor(temp); temp = v_compressed.w; temp = temp * SHIFT_RIGHT12; vec2 imageSize; imageSize.y = (temp - floor(temp)) * SHIFT_LEFT12; imageSize.x = floor(temp); vec2 adjustedST = v_textureCoordinates - v_textureCoordinateBounds.xy; adjustedST = adjustedST / vec2(v_textureCoordinateBounds.z - v_textureCoordinateBounds.x, v_textureCoordinateBounds.w - v_textureCoordinateBounds.y); float epsilonEyeDepth = v_compressed.x + czm_epsilon1; float globeDepth1 = getGlobeDepth(adjustedST, v_originTextureCoordinateAndTranslate.xy, applyTranslate, dimensions, imageSize); // negative values go into the screen if (globeDepth1 != 0.0 && globeDepth1 > epsilonEyeDepth) { float globeDepth2 = getGlobeDepth(adjustedST, vec2(0.0, 1.0), applyTranslate, dimensions, imageSize); // top left corner if (globeDepth2 != 0.0 && globeDepth2 > epsilonEyeDepth) { float globeDepth3 = getGlobeDepth(adjustedST, vec2(1.0, 1.0), applyTranslate, dimensions, imageSize); // top right corner if (globeDepth3 != 0.0 && globeDepth3 > epsilonEyeDepth) { discard; } } } } #endif } `;var pOn=T(S(),1),K2=`#ifdef INSTANCED in vec2 direction; #endif in vec4 positionHighAndScale; in vec4 positionLowAndRotation; in vec4 compressedAttribute0; // pixel offset, translate, horizontal origin, vertical origin, show, direction, texture coordinates (texture offset) in vec4 compressedAttribute1; // aligned axis, translucency by distance, image width in vec4 compressedAttribute2; // label horizontal origin, image height, color, pick color, size in meters, valid aligned axis, 13 bits free in vec4 eyeOffset; // eye offset in meters, 4 bytes free (texture range) in vec4 scaleByDistance; // near, nearScale, far, farScale in vec4 pixelOffsetScaleByDistance; // near, nearScale, far, farScale in vec4 compressedAttribute3; // distance display condition near, far, disableDepthTestDistance, dimensions in vec2 sdf; // sdf outline color (rgb) and width (w) #if defined(VERTEX_DEPTH_CHECK) || defined(FRAGMENT_DEPTH_CHECK) in vec4 textureCoordinateBoundsOrLabelTranslate; // the min and max x and y values for the texture coordinates #endif #ifdef VECTOR_TILE in float a_batchId; #endif out vec2 v_textureCoordinates; #ifdef FRAGMENT_DEPTH_CHECK out vec4 v_textureCoordinateBounds; out vec4 v_originTextureCoordinateAndTranslate; out vec4 v_compressed; // x: eyeDepth, y: applyTranslate & enableDepthCheck, z: dimensions, w: imageSize out mat2 v_rotationMatrix; #endif out vec4 v_pickColor; out vec4 v_color; #ifdef SDF out vec4 v_outlineColor; out float v_outlineWidth; #endif const float UPPER_BOUND = 32768.0; const float SHIFT_LEFT16 = 65536.0; const float SHIFT_LEFT12 = 4096.0; const float SHIFT_LEFT8 = 256.0; const float SHIFT_LEFT7 = 128.0; const float SHIFT_LEFT5 = 32.0; const float SHIFT_LEFT3 = 8.0; const float SHIFT_LEFT2 = 4.0; const float SHIFT_LEFT1 = 2.0; const float SHIFT_RIGHT12 = 1.0 / 4096.0; const float SHIFT_RIGHT8 = 1.0 / 256.0; const float SHIFT_RIGHT7 = 1.0 / 128.0; const float SHIFT_RIGHT5 = 1.0 / 32.0; const float SHIFT_RIGHT3 = 1.0 / 8.0; const float SHIFT_RIGHT2 = 1.0 / 4.0; const float SHIFT_RIGHT1 = 1.0 / 2.0; vec4 addScreenSpaceOffset(vec4 positionEC, vec2 imageSize, float scale, vec2 direction, vec2 origin, vec2 translate, vec2 pixelOffset, vec3 alignedAxis, bool validAlignedAxis, float rotation, bool sizeInMeters, out mat2 rotationMatrix, out float mpp) { // Note the halfSize cannot be computed in JavaScript because it is sent via // compressed vertex attributes that coerce it to an integer. vec2 halfSize = imageSize * scale * 0.5; halfSize *= ((direction * 2.0) - 1.0); vec2 originTranslate = origin * abs(halfSize); #if defined(ROTATION) || defined(ALIGNED_AXIS) if (validAlignedAxis || rotation != 0.0) { float angle = rotation; if (validAlignedAxis) { vec4 projectedAlignedAxis = czm_modelView3D * vec4(alignedAxis, 0.0); angle += sign(-projectedAlignedAxis.x) * acos(sign(projectedAlignedAxis.y) * (projectedAlignedAxis.y * projectedAlignedAxis.y) / (projectedAlignedAxis.x * projectedAlignedAxis.x + projectedAlignedAxis.y * projectedAlignedAxis.y)); } float cosTheta = cos(angle); float sinTheta = sin(angle); rotationMatrix = mat2(cosTheta, sinTheta, -sinTheta, cosTheta); halfSize = rotationMatrix * halfSize; } else { rotationMatrix = mat2(1.0, 0.0, 0.0, 1.0); } #endif mpp = czm_metersPerPixel(positionEC); positionEC.xy += (originTranslate + halfSize) * czm_branchFreeTernary(sizeInMeters, 1.0, mpp); positionEC.xy += (translate + pixelOffset) * mpp; return positionEC; } #ifdef VERTEX_DEPTH_CHECK float getGlobeDepth(vec4 positionEC) { vec4 posWC = czm_eyeToWindowCoordinates(positionEC); float globeDepth = czm_unpackDepth(texture(czm_globeDepthTexture, posWC.xy / czm_viewport.zw)); if (globeDepth == 0.0) { return 0.0; // not on the globe } vec4 eyeCoordinate = czm_windowToEyeCoordinates(posWC.xy, globeDepth); return eyeCoordinate.z / eyeCoordinate.w; } #endif void main() { // Modifying this shader may also require modifications to Billboard._computeScreenSpacePosition // unpack attributes vec3 positionHigh = positionHighAndScale.xyz; vec3 positionLow = positionLowAndRotation.xyz; float scale = positionHighAndScale.w; #if defined(ROTATION) || defined(ALIGNED_AXIS) float rotation = positionLowAndRotation.w; #else float rotation = 0.0; #endif float compressed = compressedAttribute0.x; vec2 pixelOffset; pixelOffset.x = floor(compressed * SHIFT_RIGHT7); compressed -= pixelOffset.x * SHIFT_LEFT7; pixelOffset.x -= UPPER_BOUND; vec2 origin; origin.x = floor(compressed * SHIFT_RIGHT5); compressed -= origin.x * SHIFT_LEFT5; origin.y = floor(compressed * SHIFT_RIGHT3); compressed -= origin.y * SHIFT_LEFT3; #ifdef FRAGMENT_DEPTH_CHECK vec2 depthOrigin = origin.xy; #endif origin -= vec2(1.0); float show = floor(compressed * SHIFT_RIGHT2); compressed -= show * SHIFT_LEFT2; #ifdef INSTANCED vec2 textureCoordinatesBottomLeft = czm_decompressTextureCoordinates(compressedAttribute0.w); vec2 textureCoordinatesRange = czm_decompressTextureCoordinates(eyeOffset.w); vec2 textureCoordinates = textureCoordinatesBottomLeft + direction * textureCoordinatesRange; #else vec2 direction; direction.x = floor(compressed * SHIFT_RIGHT1); direction.y = compressed - direction.x * SHIFT_LEFT1; vec2 textureCoordinates = czm_decompressTextureCoordinates(compressedAttribute0.w); #endif float temp = compressedAttribute0.y * SHIFT_RIGHT8; pixelOffset.y = -(floor(temp) - UPPER_BOUND); vec2 translate; translate.y = (temp - floor(temp)) * SHIFT_LEFT16; temp = compressedAttribute0.z * SHIFT_RIGHT8; translate.x = floor(temp) - UPPER_BOUND; translate.y += (temp - floor(temp)) * SHIFT_LEFT8; translate.y -= UPPER_BOUND; temp = compressedAttribute1.x * SHIFT_RIGHT8; float temp2 = floor(compressedAttribute2.w * SHIFT_RIGHT2); vec2 imageSize = vec2(floor(temp), temp2); #ifdef FRAGMENT_DEPTH_CHECK float labelHorizontalOrigin = floor(compressedAttribute2.w - (temp2 * SHIFT_LEFT2)); float applyTranslate = 0.0; if (labelHorizontalOrigin != 0.0) // is a billboard, so set apply translate to false { applyTranslate = 1.0; labelHorizontalOrigin -= 2.0; depthOrigin.x = labelHorizontalOrigin + 1.0; } depthOrigin = vec2(1.0) - (depthOrigin * 0.5); #endif #ifdef EYE_DISTANCE_TRANSLUCENCY vec4 translucencyByDistance; translucencyByDistance.x = compressedAttribute1.z; translucencyByDistance.z = compressedAttribute1.w; translucencyByDistance.y = ((temp - floor(temp)) * SHIFT_LEFT8) / 255.0; temp = compressedAttribute1.y * SHIFT_RIGHT8; translucencyByDistance.w = ((temp - floor(temp)) * SHIFT_LEFT8) / 255.0; #endif #if defined(VERTEX_DEPTH_CHECK) || defined(FRAGMENT_DEPTH_CHECK) temp = compressedAttribute3.w; temp = temp * SHIFT_RIGHT12; vec2 dimensions; dimensions.y = (temp - floor(temp)) * SHIFT_LEFT12; dimensions.x = floor(temp); #endif #ifdef ALIGNED_AXIS vec3 alignedAxis = czm_octDecode(floor(compressedAttribute1.y * SHIFT_RIGHT8)); temp = compressedAttribute2.z * SHIFT_RIGHT5; bool validAlignedAxis = (temp - floor(temp)) * SHIFT_LEFT1 > 0.0; #else vec3 alignedAxis = vec3(0.0); bool validAlignedAxis = false; #endif vec4 pickColor; vec4 color; temp = compressedAttribute2.y; temp = temp * SHIFT_RIGHT8; pickColor.b = (temp - floor(temp)) * SHIFT_LEFT8; temp = floor(temp) * SHIFT_RIGHT8; pickColor.g = (temp - floor(temp)) * SHIFT_LEFT8; pickColor.r = floor(temp); temp = compressedAttribute2.x; temp = temp * SHIFT_RIGHT8; color.b = (temp - floor(temp)) * SHIFT_LEFT8; temp = floor(temp) * SHIFT_RIGHT8; color.g = (temp - floor(temp)) * SHIFT_LEFT8; color.r = floor(temp); temp = compressedAttribute2.z * SHIFT_RIGHT8; bool sizeInMeters = floor((temp - floor(temp)) * SHIFT_LEFT7) > 0.0; temp = floor(temp) * SHIFT_RIGHT8; pickColor.a = (temp - floor(temp)) * SHIFT_LEFT8; pickColor /= 255.0; color.a = floor(temp); color /= 255.0; /////////////////////////////////////////////////////////////////////////// vec4 p = czm_translateRelativeToEye(positionHigh, positionLow); vec4 positionEC = czm_modelViewRelativeToEye * p; #if defined(FRAGMENT_DEPTH_CHECK) || defined(VERTEX_DEPTH_CHECK) float eyeDepth = positionEC.z; #endif positionEC = czm_eyeOffset(positionEC, eyeOffset.xyz); positionEC.xyz *= show; /////////////////////////////////////////////////////////////////////////// #if defined(EYE_DISTANCE_SCALING) || defined(EYE_DISTANCE_TRANSLUCENCY) || defined(EYE_DISTANCE_PIXEL_OFFSET) || defined(DISTANCE_DISPLAY_CONDITION) || defined(DISABLE_DEPTH_DISTANCE) float lengthSq; if (czm_sceneMode == czm_sceneMode2D) { // 2D camera distance is a special case // treat all billboards as flattened to the z=0.0 plane lengthSq = czm_eyeHeight2D.y; } else { lengthSq = dot(positionEC.xyz, positionEC.xyz); } #endif #ifdef EYE_DISTANCE_SCALING float distanceScale = czm_nearFarScalar(scaleByDistance, lengthSq); scale *= distanceScale; translate *= distanceScale; // push vertex behind near plane for clipping if (scale == 0.0) { positionEC.xyz = vec3(0.0); } #endif float translucency = 1.0; #ifdef EYE_DISTANCE_TRANSLUCENCY translucency = czm_nearFarScalar(translucencyByDistance, lengthSq); // push vertex behind near plane for clipping if (translucency == 0.0) { positionEC.xyz = vec3(0.0); } #endif #ifdef EYE_DISTANCE_PIXEL_OFFSET float pixelOffsetScale = czm_nearFarScalar(pixelOffsetScaleByDistance, lengthSq); pixelOffset *= pixelOffsetScale; #endif #ifdef DISTANCE_DISPLAY_CONDITION float nearSq = compressedAttribute3.x; float farSq = compressedAttribute3.y; if (lengthSq < nearSq || lengthSq > farSq) { positionEC.xyz = vec3(0.0); } #endif mat2 rotationMatrix; float mpp; #ifdef DISABLE_DEPTH_DISTANCE float disableDepthTestDistance = compressedAttribute3.z; #endif #ifdef VERTEX_DEPTH_CHECK if (lengthSq < disableDepthTestDistance) { float depthsilon = 10.0; vec2 labelTranslate = textureCoordinateBoundsOrLabelTranslate.xy; vec4 pEC1 = addScreenSpaceOffset(positionEC, dimensions, scale, vec2(0.0), origin, labelTranslate, pixelOffset, alignedAxis, validAlignedAxis, rotation, sizeInMeters, rotationMatrix, mpp); float globeDepth1 = getGlobeDepth(pEC1); if (globeDepth1 != 0.0 && pEC1.z + depthsilon < globeDepth1) { vec4 pEC2 = addScreenSpaceOffset(positionEC, dimensions, scale, vec2(0.0, 1.0), origin, labelTranslate, pixelOffset, alignedAxis, validAlignedAxis, rotation, sizeInMeters, rotationMatrix, mpp); float globeDepth2 = getGlobeDepth(pEC2); if (globeDepth2 != 0.0 && pEC2.z + depthsilon < globeDepth2) { vec4 pEC3 = addScreenSpaceOffset(positionEC, dimensions, scale, vec2(1.0), origin, labelTranslate, pixelOffset, alignedAxis, validAlignedAxis, rotation, sizeInMeters, rotationMatrix, mpp); float globeDepth3 = getGlobeDepth(pEC3); if (globeDepth3 != 0.0 && pEC3.z + depthsilon < globeDepth3) { positionEC.xyz = vec3(0.0); } } } } #endif positionEC = addScreenSpaceOffset(positionEC, imageSize, scale, direction, origin, translate, pixelOffset, alignedAxis, validAlignedAxis, rotation, sizeInMeters, rotationMatrix, mpp); gl_Position = czm_projection * positionEC; v_textureCoordinates = textureCoordinates; #ifdef LOG_DEPTH czm_vertexLogDepth(); #endif #ifdef DISABLE_DEPTH_DISTANCE if (disableDepthTestDistance == 0.0 && czm_minimumDisableDepthTestDistance != 0.0) { disableDepthTestDistance = czm_minimumDisableDepthTestDistance; } if (disableDepthTestDistance != 0.0) { // Don't try to "multiply both sides" by w. Greater/less-than comparisons won't work for negative values of w. float zclip = gl_Position.z / gl_Position.w; bool clipped = (zclip < -1.0 || zclip > 1.0); if (!clipped && (disableDepthTestDistance < 0.0 || (lengthSq > 0.0 && lengthSq < disableDepthTestDistance))) { // Position z on the near plane. gl_Position.z = -gl_Position.w; #ifdef LOG_DEPTH v_depthFromNearPlusOne = 1.0; #endif } } #endif #ifdef FRAGMENT_DEPTH_CHECK if (sizeInMeters) { translate /= mpp; dimensions /= mpp; imageSize /= mpp; } #if defined(ROTATION) || defined(ALIGNED_AXIS) v_rotationMatrix = rotationMatrix; #else v_rotationMatrix = mat2(1.0, 0.0, 0.0, 1.0); #endif float enableDepthCheck = 0.0; if (lengthSq < disableDepthTestDistance) { enableDepthCheck = 1.0; } float dw = floor(clamp(dimensions.x, 0.0, SHIFT_LEFT12)); float dh = floor(clamp(dimensions.y, 0.0, SHIFT_LEFT12)); float iw = floor(clamp(imageSize.x, 0.0, SHIFT_LEFT12)); float ih = floor(clamp(imageSize.y, 0.0, SHIFT_LEFT12)); v_compressed.x = eyeDepth; v_compressed.y = applyTranslate * SHIFT_LEFT1 + enableDepthCheck; v_compressed.z = dw * SHIFT_LEFT12 + dh; v_compressed.w = iw * SHIFT_LEFT12 + ih; v_originTextureCoordinateAndTranslate.xy = depthOrigin; v_originTextureCoordinateAndTranslate.zw = translate; v_textureCoordinateBounds = textureCoordinateBoundsOrLabelTranslate; #endif #ifdef SDF vec4 outlineColor; float outlineWidth; temp = sdf.x; temp = temp * SHIFT_RIGHT8; outlineColor.b = (temp - floor(temp)) * SHIFT_LEFT8; temp = floor(temp) * SHIFT_RIGHT8; outlineColor.g = (temp - floor(temp)) * SHIFT_LEFT8; outlineColor.r = floor(temp); temp = sdf.y; temp = temp * SHIFT_RIGHT8; float temp3 = (temp - floor(temp)) * SHIFT_LEFT8; temp = floor(temp) * SHIFT_RIGHT8; outlineWidth = (temp - floor(temp)) * SHIFT_LEFT8; outlineColor.a = floor(temp); outlineColor /= 255.0; v_outlineWidth = outlineWidth / 255.0; v_outlineColor = outlineColor; v_outlineColor.a *= translucency; #endif v_pickColor = pickColor; v_color = color; v_color.a *= translucency; } `;var FOn=T(S(),1);function Ti(e,t){e=y(e,y.EMPTY_OBJECT);let n=e.translucencyByDistance,i=e.pixelOffsetScaleByDistance,o=e.scaleByDistance,r=e.distanceDisplayCondition;l(n)&&(n=At.clone(n)),l(i)&&(i=At.clone(i)),l(o)&&(o=At.clone(o)),l(r)&&(r=Wt.clone(r)),this._show=y(e.show,!0),this._position=h.clone(y(e.position,h.ZERO)),this._actualPosition=h.clone(this._position),this._pixelOffset=D.clone(y(e.pixelOffset,D.ZERO)),this._translate=new D(0,0),this._eyeOffset=h.clone(y(e.eyeOffset,h.ZERO)),this._heightReference=y(e.heightReference,Je.NONE),this._verticalOrigin=y(e.verticalOrigin,Pn.CENTER),this._horizontalOrigin=y(e.horizontalOrigin,pi.CENTER),this._scale=y(e.scale,1),this._color=Y.clone(y(e.color,Y.WHITE)),this._rotation=y(e.rotation,0),this._alignedAxis=h.clone(y(e.alignedAxis,h.ZERO)),this._width=e.width,this._height=e.height,this._scaleByDistance=o,this._translucencyByDistance=n,this._pixelOffsetScaleByDistance=i,this._sizeInMeters=y(e.sizeInMeters,!1),this._distanceDisplayCondition=r,this._disableDepthTestDistance=e.disableDepthTestDistance,this._id=e.id,this._collection=y(e.collection,t),this._pickId=void 0,this._pickPrimitive=y(e._pickPrimitive,this),this._billboardCollection=t,this._dirty=!1,this._index=-1,this._batchIndex=void 0,this._imageIndex=-1,this._imageIndexPromise=void 0,this._imageId=void 0,this._image=void 0,this._imageSubRegion=void 0,this._imageWidth=void 0,this._imageHeight=void 0,this._labelDimensions=void 0,this._labelHorizontalOrigin=void 0,this._labelTranslate=void 0;let s=e.image,a=e.imageId;l(s)&&(l(a)||(typeof s=="string"?a=s:l(s.src)?a=s.src:a=Yn()),this._imageId=a,this._image=s),l(e.imageSubRegion)&&(this._imageId=a,this._imageSubRegion=e.imageSubRegion),l(this._billboardCollection._textureAtlas)&&this._loadImage(),this._actualClampedPosition=void 0,this._removeCallbackFunc=void 0,this._mode=oe.SCENE3D,this._clusterShow=!0,this._outlineColor=Y.clone(y(e.outlineColor,Y.BLACK)),this._outlineWidth=y(e.outlineWidth,0),this._updateClamping()}var qde=Ti.SHOW_INDEX=0,Ck=Ti.POSITION_INDEX=1,nue=Ti.PIXEL_OFFSET_INDEX=2,HJe=Ti.EYE_OFFSET_INDEX=3,zJe=Ti.HORIZONTAL_ORIGIN_INDEX=4,KJe=Ti.VERTICAL_ORIGIN_INDEX=5,JJe=Ti.SCALE_INDEX=6,Vk=Ti.IMAGE_INDEX_INDEX=7,$de=Ti.COLOR_INDEX=8,QJe=Ti.ROTATION_INDEX=9,jJe=Ti.ALIGNED_AXIS_INDEX=10,qJe=Ti.SCALE_BY_DISTANCE_INDEX=11,$Je=Ti.TRANSLUCENCY_BY_DISTANCE_INDEX=12,eQe=Ti.PIXEL_OFFSET_SCALE_BY_DISTANCE_INDEX=13,tQe=Ti.DISTANCE_DISPLAY_CONDITION=14,nQe=Ti.DISABLE_DEPTH_DISTANCE=15;Ti.TEXTURE_COORDINATE_BOUNDS=16;var eue=Ti.SDF_INDEX=17;Ti.NUMBER_OF_PROPERTIES=18;function wo(e,t){let n=e._billboardCollection;l(n)&&(n._updateBillboard(e,t),e._dirty=!0)}Object.defineProperties(Ti.prototype,{show:{get:function(){return this._show},set:function(e){this._show!==e&&(this._show=e,wo(this,qde))}},position:{get:function(){return this._position},set:function(e){let t=this._position;h.equals(t,e)||(h.clone(e,t),h.clone(e,this._actualPosition),this._updateClamping(),wo(this,Ck))}},heightReference:{get:function(){return this._heightReference},set:function(e){let t=this._heightReference;e!==t&&(this._heightReference=e,this._updateClamping(),wo(this,Ck))}},pixelOffset:{get:function(){return this._pixelOffset},set:function(e){let t=this._pixelOffset;D.equals(t,e)||(D.clone(e,t),wo(this,nue))}},scaleByDistance:{get:function(){return this._scaleByDistance},set:function(e){let t=this._scaleByDistance;At.equals(t,e)||(this._scaleByDistance=At.clone(e,t),wo(this,qJe))}},translucencyByDistance:{get:function(){return this._translucencyByDistance},set:function(e){let t=this._translucencyByDistance;At.equals(t,e)||(this._translucencyByDistance=At.clone(e,t),wo(this,$Je))}},pixelOffsetScaleByDistance:{get:function(){return this._pixelOffsetScaleByDistance},set:function(e){let t=this._pixelOffsetScaleByDistance;At.equals(t,e)||(this._pixelOffsetScaleByDistance=At.clone(e,t),wo(this,eQe))}},eyeOffset:{get:function(){return this._eyeOffset},set:function(e){let t=this._eyeOffset;h.equals(t,e)||(h.clone(e,t),wo(this,HJe))}},horizontalOrigin:{get:function(){return this._horizontalOrigin},set:function(e){this._horizontalOrigin!==e&&(this._horizontalOrigin=e,wo(this,zJe))}},verticalOrigin:{get:function(){return this._verticalOrigin},set:function(e){this._verticalOrigin!==e&&(this._verticalOrigin=e,wo(this,KJe))}},scale:{get:function(){return this._scale},set:function(e){this._scale!==e&&(this._scale=e,wo(this,JJe))}},color:{get:function(){return this._color},set:function(e){let t=this._color;Y.equals(t,e)||(Y.clone(e,t),wo(this,$de))}},rotation:{get:function(){return this._rotation},set:function(e){this._rotation!==e&&(this._rotation=e,wo(this,QJe))}},alignedAxis:{get:function(){return this._alignedAxis},set:function(e){let t=this._alignedAxis;h.equals(t,e)||(h.clone(e,t),wo(this,jJe))}},width:{get:function(){return y(this._width,this._imageWidth)},set:function(e){this._width!==e&&(this._width=e,wo(this,Vk))}},height:{get:function(){return y(this._height,this._imageHeight)},set:function(e){this._height!==e&&(this._height=e,wo(this,Vk))}},sizeInMeters:{get:function(){return this._sizeInMeters},set:function(e){this._sizeInMeters!==e&&(this._sizeInMeters=e,wo(this,$de))}},distanceDisplayCondition:{get:function(){return this._distanceDisplayCondition},set:function(e){Wt.equals(e,this._distanceDisplayCondition)||(this._distanceDisplayCondition=Wt.clone(e,this._distanceDisplayCondition),wo(this,tQe))}},disableDepthTestDistance:{get:function(){return this._disableDepthTestDistance},set:function(e){this._disableDepthTestDistance!==e&&(this._disableDepthTestDistance=e,wo(this,nQe))}},id:{get:function(){return this._id},set:function(e){this._id=e,l(this._pickId)&&(this._pickId.object.id=e)}},pickPrimitive:{get:function(){return this._pickPrimitive},set:function(e){this._pickPrimitive=e,l(this._pickId)&&(this._pickId.object.primitive=e)}},pickId:{get:function(){return this._pickId}},image:{get:function(){return this._imageId},set:function(e){l(e)?typeof e=="string"?this.setImage(e,e):e instanceof Ee?this.setImage(e.url,e):l(e.src)?this.setImage(e.src,e):this.setImage(Yn(),e):(this._imageIndex=-1,this._imageSubRegion=void 0,this._imageId=void 0,this._image=void 0,this._imageIndexPromise=void 0,wo(this,Vk))}},ready:{get:function(){return this._imageIndex!==-1}},_clampedPosition:{get:function(){return this._actualClampedPosition},set:function(e){this._actualClampedPosition=h.clone(e,this._actualClampedPosition),wo(this,Ck)}},clusterShow:{get:function(){return this._clusterShow},set:function(e){this._clusterShow!==e&&(this._clusterShow=e,wo(this,qde))}},outlineColor:{get:function(){return this._outlineColor},set:function(e){let t=this._outlineColor;Y.equals(t,e)||(Y.clone(e,t),wo(this,eue))}},outlineWidth:{get:function(){return this._outlineWidth},set:function(e){this._outlineWidth!==e&&(this._outlineWidth=e,wo(this,eue))}}});Ti.prototype.getPickId=function(e){return l(this._pickId)||(this._pickId=e.createPickId({primitive:this._pickPrimitive,collection:this._collection,id:this._id})),this._pickId};Ti.prototype._updateClamping=function(){Ti._updateClamping(this._billboardCollection,this)};var Lk=new he;Ti._updateClamping=function(e,t){let n=e._scene;if(!l(n))return;let i=n.globe,o=y(i?.ellipsoid,ie.WGS84),r=n.frameState.mode,s=r!==t._mode;if(t._mode=r,(t._heightReference===Je.NONE||s)&&l(t._removeCallbackFunc)&&(t._removeCallbackFunc(),t._removeCallbackFunc=void 0,t._clampedPosition=void 0),t._heightReference===Je.NONE||!l(t._position))return;l(t._removeCallbackFunc)&&t._removeCallbackFunc();let a=o.cartesianToCartographic(t._position);if(!l(a)){t._actualClampedPosition=void 0;return}function c(u){let m=o.cartographicToCartesian(u,t._clampedPosition);FC(t._heightReference)&&(t._mode===oe.SCENE3D?(u.height+=a.height,o.cartographicToCartesian(u,m)):m.x+=a.height),t._clampedPosition=m}t._removeCallbackFunc=n.updateHeight(a,c,t._heightReference),he.clone(a,Lk);let d=n.getHeight(a,t._heightReference);l(d)&&(Lk.height=d),c(Lk)};Ti.prototype._loadImage=function(){let e=this._billboardCollection._textureAtlas,t=this._imageId,n=this._image,i=this._imageSubRegion,o,r=this;function s(c){if(r._imageId!==t||r._image!==n||!He.equals(r._imageSubRegion,i))return;let d=e.textureCoordinates[c];r._imageWidth=e.texture.width*d.width,r._imageHeight=e.texture.height*d.height,r._imageIndex=c,r._ready=!0,r._image=void 0,r._imageIndexPromise=void 0,wo(r,Vk);let u=r._billboardCollection._scene;l(u)&&u.frameState.afterRender.push(()=>!0)}if(l(n)&&(o=e.addImage(t,n)),l(i)&&(o=e.addSubRegion(t,i)),this._imageIndexPromise=o,!l(o))return;let a=e.getImageIndex(t);if(l(a)&&!l(i)){s(a);return}o.then(s).catch(function(c){console.error(`Error loading image for billboard: ${c}`),r._imageIndexPromise=void 0})};Ti.prototype.setImage=function(e,t){this._imageId!==e&&(this._imageIndex=-1,this._imageSubRegion=void 0,this._imageId=e,this._image=t,l(this._billboardCollection._textureAtlas)&&this._loadImage())};Ti.prototype.setImageSubRegion=function(e,t){this._imageId===e&&He.equals(this._imageSubRegion,t)||(this._imageIndex=-1,this._imageId=e,this._imageSubRegion=He.clone(t),l(this._billboardCollection._textureAtlas)&&this._loadImage())};Ti.prototype._setTranslate=function(e){let t=this._translate;D.equals(t,e)||(D.clone(e,t),wo(this,nue))};Ti.prototype._getActualPosition=function(){return l(this._clampedPosition)?this._clampedPosition:this._actualPosition};Ti.prototype._setActualPosition=function(e){l(this._clampedPosition)||h.clone(e,this._actualPosition),wo(this,Ck)};var tue=new se;Ti._computeActualPosition=function(e,t,n,i){return l(e._clampedPosition)?(n.mode!==e._mode&&e._updateClamping(),e._clampedPosition):n.mode===oe.SCENE3D?t:(M.multiplyByPoint(i,t,tue),ki.computeActualWgs84Position(n,tue))};var iue=new h;Ti._computeScreenSpacePosition=function(e,t,n,i,o,r){let s=M.multiplyByPoint(e,t,iue),a=ki.wgs84WithEyeOffsetToWindowCoordinates(o,s,n,r);if(l(a))return D.add(a,i,a),a};var Sk=new D(0,0);Ti.prototype.computeScreenSpacePosition=function(e,t){let n=this._billboardCollection;l(t)||(t=new D),D.clone(this._pixelOffset,Sk),D.add(Sk,this._translate,Sk);let i=n.modelMatrix,o=this._position;if(l(this._clampedPosition)&&(o=this._clampedPosition,e.mode!==oe.SCENE3D)){let s=e.mapProjection,a=s.ellipsoid,c=s.unproject(o,Lk);o=a.cartographicToCartesian(c,iue),i=M.IDENTITY}return Ti._computeScreenSpacePosition(i,o,this._eyeOffset,Sk,e,t)};Ti.getScreenSpaceBoundingBox=function(e,t,n){let i=e.width,o=e.height,r=e.scale;i*=r,o*=r;let s=t.x;e.horizontalOrigin===pi.RIGHT?s-=i:e.horizontalOrigin===pi.CENTER&&(s-=i*.5);let a=t.y;return e.verticalOrigin===Pn.BOTTOM||e.verticalOrigin===Pn.BASELINE?a-=o:e.verticalOrigin===Pn.CENTER&&(a-=o*.5),l(n)||(n=new He),n.x=s,n.y=a,n.width=i,n.height=o,n};Ti.prototype.equals=function(e){return this===e||l(e)&&this._id===e._id&&h.equals(this._position,e._position)&&this._imageId===e._imageId&&this._show===e._show&&this._scale===e._scale&&this._verticalOrigin===e._verticalOrigin&&this._horizontalOrigin===e._horizontalOrigin&&this._heightReference===e._heightReference&&He.equals(this._imageSubRegion,e._imageSubRegion)&&Y.equals(this._color,e._color)&&D.equals(this._pixelOffset,e._pixelOffset)&&D.equals(this._translate,e._translate)&&h.equals(this._eyeOffset,e._eyeOffset)&&At.equals(this._scaleByDistance,e._scaleByDistance)&&At.equals(this._translucencyByDistance,e._translucencyByDistance)&&At.equals(this._pixelOffsetScaleByDistance,e._pixelOffsetScaleByDistance)&&Wt.equals(this._distanceDisplayCondition,e._distanceDisplayCondition)&&this._disableDepthTestDistance===e._disableDepthTestDistance};Ti.prototype._destroy=function(){l(this._customData)&&(this._billboardCollection._scene.globe._surface.removeTileCustomData(this._customData),this._customData=void 0),l(this._removeCallbackFunc)&&(this._removeCallbackFunc(),this._removeCallbackFunc=void 0),this.image=void 0,this._pickId=this._pickId&&this._pickId.destroy(),this._billboardCollection=void 0};var mo=Ti;var MOn=T(S(),1),iQe={OPAQUE:0,TRANSLUCENT:1,OPAQUE_AND_TRANSLUCENT:2},So=Object.freeze(iQe);var kOn=T(S(),1),oQe={FONT_SIZE:48,PADDING:10,RADIUS:8,CUTOFF:.25},Ms=Object.freeze(oQe);var $On=T(S(),1);function y0(e,t,n,i,o){this.bottomLeft=y(e,D.ZERO),this.topRight=y(t,D.ZERO),this.childNode1=n,this.childNode2=i,this.imageIndex=o}var rQe=new D(16,16);function Mg(e){e=y(e,y.EMPTY_OBJECT);let t=y(e.borderWidthInPixels,1),n=y(e.initialSize,rQe);this._context=e.context,this._pixelFormat=y(e.pixelFormat,at.RGBA),this._borderWidthInPixels=t,this._textureCoordinates=[],this._guid=Yn(),this._idHash={},this._indexHash={},this._initialSize=n,this._root=void 0}Object.defineProperties(Mg.prototype,{borderWidthInPixels:{get:function(){return this._borderWidthInPixels}},textureCoordinates:{get:function(){return this._textureCoordinates}},texture:{get:function(){return l(this._texture)||(this._texture=new Et({context:this._context,width:this._initialSize.x,height:this._initialSize.y,pixelFormat:this._pixelFormat})),this._texture}},numberOfImages:{get:function(){return this._textureCoordinates.length}},guid:{get:function(){return this._guid}}});function sQe(e,t){let n=e._context,i=e.numberOfImages,o=2,r=e._borderWidthInPixels;if(i>0){let s=e._texture.width,a=e._texture.height,c=o*(s+t.width+r),d=o*(a+t.height+r),u=s/c,m=a/d,p=new y0(new D(s+r,r),new D(c,a)),g=new y0(new D,new D(c,a),e._root,p),f=new y0(new D(r,a+r),new D(c,d)),x=new y0(new D,new D(c,d),g,f);for(let V=0;Vs){t.childNode1=new y0(new D(t.bottomLeft.x,t.bottomLeft.y),new D(t.bottomLeft.x+n.width,t.topRight.y));let a=t.bottomLeft.x+n.width+e._borderWidthInPixels;a0)&&(e._shaderDisableDepthDistance=!0,u===Number.POSITIVE_INFINITY&&(u=-1));let p,g;if(l(o._labelDimensions))g=o._labelDimensions.x,p=o._labelDimensions.y;else{let C=0,V=0,L=o._imageIndex;if(L!==-1){let G=n[L];C=G.height,V=G.width}p=Math.round(y(o.height,e._textureAtlas.texture.dimensions.y*C));let Z=e._textureAtlas.texture.width;g=Math.round(y(o.width,Z*V))}let f=Math.floor(W.clamp(g,0,sJ)),x=Math.floor(W.clamp(p,0,sJ)),_=f*sJ+x;e._instanced?(r=o._index,s(r,a,c,u,_)):(r=o._index*4,s(r+0,a,c,u,_),s(r+1,a,c,u,_),s(r+2,a,c,u,_),s(r+3,a,c,u,_))}function Rue(e,t,n,i,o){if(_u(o.heightReference)){let f=e._scene,x=t.context,_=t.globeTranslucencyState.translucent,C=l(f.globe)&&f.globe.depthTestAgainstTerrain;e._shaderClampToGround=x.depthTexture&&!_&&C}let r,s=i[yo.textureCoordinateBoundsOrLabelTranslate];if(Mt.maximumVertexTextureImageUnits>0){let f=0,x=0;l(o._labelTranslate)&&(f=o._labelTranslate.x,x=o._labelTranslate.y),e._instanced?(r=o._index,s(r,f,x,0,0)):(r=o._index*4,s(r+0,f,x,0,0),s(r+1,f,x,0,0),s(r+2,f,x,0,0),s(r+3,f,x,0,0));return}let a=0,c=0,d=0,u=0,m=o._imageIndex;if(m!==-1){let f=n[m];a=f.x,c=f.y,d=f.width,u=f.height}let p=a+d,g=c+u;e._instanced?(r=o._index,s(r,a,c,p,g)):(r=o._index*4,s(r+0,a,c,p,g),s(r+1,a,c,p,g),s(r+2,a,c,p,g),s(r+3,a,c,p,g))}function LQe(e,t,n,i,o){if(!l(e._batchTable))return;let r=i[yo.a_batchId],s=o._batchIndex,a;e._instanced?(a=o._index,r(a,s)):(a=o._index*4,r(a+0,s),r(a+1,s),r(a+2,s),r(a+3,s))}function Zue(e,t,n,i,o){if(!e._sdf)return;let r,s=i[yo.sdf],a=o.outlineColor,c=o.outlineWidth,d=Y.floatToByte(a.red),u=Y.floatToByte(a.green),m=Y.floatToByte(a.blue),p=d*S1+u*xf+m,g=c/Ms.RADIUS,f=Y.floatToByte(a.alpha)*S1+Y.floatToByte(g)*xf;e._instanced?(r=o._index,s(r,p,f)):(r=o._index*4,s(r+0,p+gue,f),s(r+1,p+yue,f),s(r+2,p+xue,f),s(r+3,p+_ue,f))}function RQe(e,t,n,i,o){pue(e,t,n,i,o),Tue(e,t,n,i,o),Sue(e,t,n,i,o),cJ(e,t,n,i,o),lJ(e,t,n,i,o),Cue(e,t,n,i,o),Vue(e,t,n,i,o),Lue(e,t,n,i,o),Rue(e,t,n,i,o),LQe(e,t,n,i,o),Zue(e,t,n,i,o)}function aJ(e,t,n,i,o,r){let s;i.mode===oe.SCENE3D?(s=e._baseVolume,e._boundingVolumeDirty=!0):s=e._baseVolume2D;let a=[];for(let c=0;c0){this._vaf=_Qe(i,n,this._buffersUsage,this._instanced,this._batchTable,this._sdf),m=this._vaf.writers;for(let P=0;P0){let P=XQe;P.length=0,(c[Q2]||c[uQe]||c[dQe])&&P.push(pue),(c[J2]||c[sue]||c[cQe]||c[lQe]||c[aQe])&&(P.push(Tue),this._instanced&&P.push(lJ)),(c[J2]||c[mQe]||c[due])&&(P.push(Sue),P.push(cJ)),(c[J2]||c[cue])&&P.push(cJ),c[aue]&&P.push(lJ),c[lue]&&P.push(Cue),c[uue]&&P.push(Vue),(c[mue]||c[hQe]||c[J2]||c[Q2])&&P.push(Lue),(c[J2]||c[Q2])&&P.push(Rue),c[hue]&&P.push(Zue);let F=P.length;if(m=this._vaf.writers,a/n>.1){for(let A=0;An*1.5&&(s.length=n),!l(this._vaf)||!l(this._vaf.va))return;this._boundingVolumeDirty&&(this._boundingVolumeDirty=!1,le.transform(this._baseVolume,this.modelMatrix,this._baseVolumeWC));let f,x=M.IDENTITY;e.mode===oe.SCENE3D?(x=this.modelMatrix,f=le.clone(this._baseVolumeWC,this._boundingVolume)):f=le.clone(this._baseVolume2D,this._boundingVolume),GQe(this,e,f);let _=this._blendOption!==this.blendOption;if(this._blendOption=this.blendOption,_){this._blendOption===So.OPAQUE||this._blendOption===So.OPAQUE_AND_TRANSLUCENT?this._rsOpaque=De.fromCache({depthTest:{enabled:!0,func:ne.LESS},depthMask:!0}):this._rsOpaque=void 0;let P=this._blendOption===So.TRANSLUCENT;this._blendOption===So.TRANSLUCENT||this._blendOption===So.OPAQUE_AND_TRANSLUCENT?this._rsTranslucent=De.fromCache({depthTest:{enabled:!0,func:P?ne.LEQUAL:ne.LESS},depthMask:P,blending:un.ALPHA_BLEND}):this._rsTranslucent=void 0}this._shaderDisableDepthDistance=this._shaderDisableDepthDistance||e.minimumDisableDepthTestDistance!==0;let C,V,L,Z,G,X=Mt.maximumVertexTextureImageUnits>0;if(_||this._shaderRotation!==this._compiledShaderRotation||this._shaderAlignedAxis!==this._compiledShaderAlignedAxis||this._shaderScaleByDistance!==this._compiledShaderScaleByDistance||this._shaderTranslucencyByDistance!==this._compiledShaderTranslucencyByDistance||this._shaderPixelOffsetScaleByDistance!==this._compiledShaderPixelOffsetScaleByDistance||this._shaderDistanceDisplayCondition!==this._compiledShaderDistanceDisplayCondition||this._shaderDisableDepthDistance!==this._compiledShaderDisableDepthDistance||this._shaderClampToGround!==this._compiledShaderClampToGround||this._sdf!==this._compiledSDF){C=K2,V=z2,G=[],l(this._batchTable)&&(G.push("VECTOR_TILE"),C=this._batchTable.getVertexShaderCallback(!1,"a_batchId",void 0)(C),V=this._batchTable.getFragmentShaderCallback(!1,void 0)(V)),L=new Ye({defines:G,sources:[C]}),this._instanced&&L.defines.push("INSTANCED"),this._shaderRotation&&L.defines.push("ROTATION"),this._shaderAlignedAxis&&L.defines.push("ALIGNED_AXIS"),this._shaderScaleByDistance&&L.defines.push("EYE_DISTANCE_SCALING"),this._shaderTranslucencyByDistance&&L.defines.push("EYE_DISTANCE_TRANSLUCENCY"),this._shaderPixelOffsetScaleByDistance&&L.defines.push("EYE_DISTANCE_PIXEL_OFFSET"),this._shaderDistanceDisplayCondition&&L.defines.push("DISTANCE_DISPLAY_CONDITION"),this._shaderDisableDepthDistance&&L.defines.push("DISABLE_DEPTH_DISTANCE"),this._shaderClampToGround&&(X?L.defines.push("VERTEX_DEPTH_CHECK"):L.defines.push("FRAGMENT_DEPTH_CHECK"));let P=1-Ms.CUTOFF;this._sdf&&L.defines.push("SDF");let F=l(this._batchTable)?"VECTOR_TILE":"";this._blendOption===So.OPAQUE_AND_TRANSLUCENT&&(Z=new Ye({defines:["OPAQUE",F],sources:[V]}),this._shaderClampToGround&&(X?Z.defines.push("VERTEX_DEPTH_CHECK"):Z.defines.push("FRAGMENT_DEPTH_CHECK")),this._sdf&&(Z.defines.push("SDF"),Z.defines.push(`SDF_EDGE ${P}`)),this._sp=$t.replaceCache({context:i,shaderProgram:this._sp,vertexShaderSource:L,fragmentShaderSource:Z,attributeLocations:yo}),Z=new Ye({defines:["TRANSLUCENT",F],sources:[V]}),this._shaderClampToGround&&(X?Z.defines.push("VERTEX_DEPTH_CHECK"):Z.defines.push("FRAGMENT_DEPTH_CHECK")),this._sdf&&(Z.defines.push("SDF"),Z.defines.push(`SDF_EDGE ${P}`)),this._spTranslucent=$t.replaceCache({context:i,shaderProgram:this._spTranslucent,vertexShaderSource:L,fragmentShaderSource:Z,attributeLocations:yo})),this._blendOption===So.OPAQUE&&(Z=new Ye({defines:[F],sources:[V]}),this._shaderClampToGround&&(X?Z.defines.push("VERTEX_DEPTH_CHECK"):Z.defines.push("FRAGMENT_DEPTH_CHECK")),this._sdf&&(Z.defines.push("SDF"),Z.defines.push(`SDF_EDGE ${P}`)),this._sp=$t.replaceCache({context:i,shaderProgram:this._sp,vertexShaderSource:L,fragmentShaderSource:Z,attributeLocations:yo})),this._blendOption===So.TRANSLUCENT&&(Z=new Ye({defines:[F],sources:[V]}),this._shaderClampToGround&&(X?Z.defines.push("VERTEX_DEPTH_CHECK"):Z.defines.push("FRAGMENT_DEPTH_CHECK")),this._sdf&&(Z.defines.push("SDF"),Z.defines.push(`SDF_EDGE ${P}`)),this._spTranslucent=$t.replaceCache({context:i,shaderProgram:this._spTranslucent,vertexShaderSource:L,fragmentShaderSource:Z,attributeLocations:yo})),this._compiledShaderRotation=this._shaderRotation,this._compiledShaderAlignedAxis=this._shaderAlignedAxis,this._compiledShaderScaleByDistance=this._shaderScaleByDistance,this._compiledShaderTranslucencyByDistance=this._shaderTranslucencyByDistance,this._compiledShaderPixelOffsetScaleByDistance=this._shaderPixelOffsetScaleByDistance,this._compiledShaderDistanceDisplayCondition=this._shaderDistanceDisplayCondition,this._compiledShaderDisableDepthDistance=this._shaderDisableDepthDistance,this._compiledShaderClampToGround=this._shaderClampToGround,this._compiledSDF=this._sdf}let v=e.commandList;if(p.render||p.pick){let P=this._colorCommands,F=this._blendOption===So.OPAQUE,A=this._blendOption===So.OPAQUE_AND_TRANSLUCENT,b=this._vaf.va,R=b.length,E=this._uniforms,I;l(this._batchTable)?(E=this._batchTable.getUniformMapCallback()(E),I=this._batchTable.getPickId()):I="v_pickColor",P.length=R;let w=A?R*2:R;for(let N=0;N0}},labelOutlineColor:{get:function(){return this._label.outlineColor},set:function(e){this._label.outlineColor=e}},labelOutlineWidth:{get:function(){return this._label.outlineWidth},set:function(e){this._label.outlineWidth=e}},font:{get:function(){return this._label.font},set:function(e){this._label.font=e}},labelStyle:{get:function(){return this._label.style},set:function(e){this._label.style=e}},labelText:{get:function(){return this._label.text},set:function(e){l(e)||(e=""),this._label.text=e}},backgroundColor:{get:function(){return this._label.backgroundColor},set:function(e){this._label.backgroundColor=e}},backgroundPadding:{get:function(){return this._label.backgroundPadding},set:function(e){this._label.backgroundPadding=e}},backgroundEnabled:{get:function(){return this._label.showBackground},set:function(e){this._label.showBackground=e}},scaleByDistance:{get:function(){return this._label.scaleByDistance},set:function(e){this._label.scaleByDistance=e,this._billboard.scaleByDistance=e}},translucencyByDistance:{get:function(){return this._label.translucencyByDistance},set:function(e){this._label.translucencyByDistance=e,this._billboard.translucencyByDistance=e}},distanceDisplayCondition:{get:function(){return this._label.distanceDisplayCondition},set:function(e){this._label.distanceDisplayCondition=e,this._polyline.distanceDisplayCondition=e,this._billboard.distanceDisplayCondition=e}},heightOffset:{get:function(){return this._heightOffset},set:function(e){let t=y(this._heightOffset,0),n=this._content.tileset.ellipsoid,i=n.cartesianToCartographic(this._billboard.position,WQe);i.height=i.height-t+e;let o=n.cartographicToCartesian(i);this._billboard.position=o,this._label.position=this._billboard.position,this._polyline.positions=[this._polyline.positions[0],o],this._heightOffset=e}},anchorLineEnabled:{get:function(){return this._polyline.show},set:function(e){this._polyline.show=e}},anchorLineColor:{get:function(){return this._polyline.material.uniforms.color},set:function(e){this._polyline.material.uniforms.color=Y.clone(e,this._polyline.material.uniforms.color)}},image:{get:function(){return this._billboardImage},set:function(e){let t=this._billboardImage!==e;this._billboardImage=e,t&&C1(this)}},disableDepthTestDistance:{get:function(){return this._label.disableDepthTestDistance},set:function(e){this._label.disableDepthTestDistance=e,this._billboard.disableDepthTestDistance=e}},horizontalOrigin:{get:function(){return this._billboard.horizontalOrigin},set:function(e){this._billboard.horizontalOrigin=e}},verticalOrigin:{get:function(){return this._billboard.verticalOrigin},set:function(e){this._billboard.verticalOrigin=e}},labelHorizontalOrigin:{get:function(){return this._label.horizontalOrigin},set:function(e){this._label.horizontalOrigin=e}},labelVerticalOrigin:{get:function(){return this._label.verticalOrigin},set:function(e){this._label.verticalOrigin=e}},content:{get:function(){return this._content}},tileset:{get:function(){return this._content.tileset}},primitive:{get:function(){return this._content.tileset}},pickIds:{get:function(){let e=this._pickIds;return e[0]=this._billboard.pickId,e[1]=this._label.pickId,e[2]=this._polyline.pickId,e}}});ra.defaultColor=Y.WHITE;ra.defaultPointOutlineColor=Y.BLACK;ra.defaultPointOutlineWidth=0;ra.defaultPointSize=8;function C1(e){let t=e._billboard;if(l(e._billboardImage)&&e._billboardImage!==t.image){t.image=e._billboardImage;return}if(l(e._billboardImage))return;let n=y(e._color,ra.defaultColor),i=y(e._pointOutlineColor,ra.defaultPointOutlineColor),o=y(e._pointOutlineWidth,ra.defaultPointOutlineWidth),r=y(e._pointSize,ra.defaultPointSize),s=e._billboardColor,a=e._billboardOutlineColor,c=e._billboardOutlineWidth,d=e._billboardSize;if(Y.equals(n,s)&&Y.equals(i,a)&&o===c&&r===d)return;e._billboardColor=Y.clone(n,e._billboardColor),e._billboardOutlineColor=Y.clone(i,e._billboardOutlineColor),e._billboardOutlineWidth=o,e._billboardSize=r;let u=n.alpha,m=n.toCssColorString(),p=i.toCssColorString(),g=JSON.stringify([m,r,p,o]);t.setImage(g,K_(u,m,p,o,r))}ra.prototype.hasProperty=function(e){return this._content.batchTable.hasProperty(this._batchId,e)};ra.prototype.getPropertyIds=function(e){return this._content.batchTable.getPropertyIds(this._batchId,e)};ra.prototype.getProperty=function(e){return this._content.batchTable.getProperty(this._batchId,e)};ra.prototype.getPropertyInherited=function(e){return vs.getPropertyInherited(this._content,this._batchId,e)};ra.prototype.setProperty=function(e,t){this._content.batchTable.setProperty(this._batchId,e,t),this._content.featurePropertiesDirty=!0};ra.prototype.isExactClass=function(e){return this._content.batchTable.isExactClass(this._batchId,e)};ra.prototype.isClass=function(e){return this._content.batchTable.isClass(this._batchId,e)};ra.prototype.getExactClassName=function(){return this._content.batchTable.getExactClassName(this._batchId)};var x0=ra;var Wzn=T(S(),1);var Mue=T(Iue(),1);var uzn=T(S(),1);var JHn=T(S(),1),vQe={FILL:0,OUTLINE:1,FILL_AND_OUTLINE:2},Fo=Object.freeze(vQe);var Wue={},Pue=0,wQe=256,FQe=new Y(.165,.165,.165,.8),AQe=new D(7,5),as=Object.freeze({LTR:0,RTL:1,WEAK:2,BRACKETS:3});function J_(e){!e._rebindAllGlyphs&&!e._repositionAllGlyphs&&e._labelCollection._labelsToUpdate.push(e),e._rebindAllGlyphs=!0}function q2(e){!e._rebindAllGlyphs&&!e._repositionAllGlyphs&&e._labelCollection._labelsToUpdate.push(e),e._repositionAllGlyphs=!0}function $2(e,t){return document.defaultView.getComputedStyle(e,null).getPropertyValue(t)}function wue(e){let t=Wue[e._font];if(!l(t)){let n=document.createElement("div");n.style.position="absolute",n.style.opacity=0,n.style.font=e._font,document.body.appendChild(n);let i=parseFloat($2(n,"line-height"));isNaN(i)&&(i=void 0),t={family:$2(n,"font-family"),size:$2(n,"font-size").replace("px",""),style:$2(n,"font-style"),weight:$2(n,"font-weight"),lineHeight:i},document.body.removeChild(n),Pue]/,o=[],r="",s=as.LTR,a="",c=e.length;for(let d=0;d";case">":return"<"}}var UQe="\u05D0-\u05EA",DQe="\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF",vue=new RegExp(`[${UQe}${DQe}]`);function BQe(e){let t=e.split(` `),n="";for(let i=0;id+1?s[d+1].Type===as.RTL?(c=m+c,a=0):(c=eP(c,a,u.Word),a+=u.Word.length):c=eP(c,0,m)):u.Type===as.RTL?c=eP(c,a,m):u.Type===as.LTR?(c+=u.Word,a=c.length):(u.Type===as.WEAK||u.Type===as.BRACKETS)&&(d>0&&s[d-1].Type===as.RTL?s.length>d+1?s[d+1].Type===as.RTL?c=eP(c,a,m):(c+=u.Word,a=c.length):c+=u.Word:(c+=u.Word,a=c.length))}n+=c,i0,m=t._backgroundBillboard,p=e._backgroundBillboardCollection;u?(l(m)||(m=p.add({collection:e,image:kue,imageSubRegion:KQe}),t._backgroundBillboard=m),m.color=t._backgroundColor,m.show=t._show,m.position=t._position,m.eyeOffset=t._eyeOffset,m.pixelOffset=t._pixelOffset,m.horizontalOrigin=pi.LEFT,m.verticalOrigin=t._verticalOrigin,m.heightReference=t._heightReference,m.scale=t.totalScale,m.pickPrimitive=t,m.id=t._id,m.translucencyByDistance=t._translucencyByDistance,m.pixelOffsetScaleByDistance=t._pixelOffsetScaleByDistance,m.scaleByDistance=t._scaleByDistance,m.distanceDisplayCondition=t._distanceDisplayCondition,m.disableDepthTestDistance=t._disableDepthTestDistance,m.clusterShow=t.clusterShow):l(m)&&(p.remove(m),t._backgroundBillboard=m=void 0);let g=e._glyphTextureCache;for(d=0;d0&&L.height>0){let Z=(0,Mue.default)(L,{cutoff:Ms.CUTOFF,radius:Ms.RADIUS}),G=L.getContext("2d"),X=L.width,v=L.height,P=G.getImageData(0,0,X,v);for(let F=0;F0?V=L.pop():(V=e._billboardCollection.add({collection:e}),V._labelDimensions=new D,V._labelTranslate=new D),a.billboard=V),V.show=t._show,V.position=t._position,V.eyeOffset=t._eyeOffset,V.pixelOffset=t._pixelOffset,V.horizontalOrigin=pi.LEFT,V.verticalOrigin=t._verticalOrigin,V.heightReference=t._heightReference,V.scale=t.totalScale,V.pickPrimitive=t,V.id=t._id,V.image=_,V.translucencyByDistance=t._translucencyByDistance,V.pixelOffsetScaleByDistance=t._pixelOffsetScaleByDistance,V.scaleByDistance=t._scaleByDistance,V.distanceDisplayCondition=t._distanceDisplayCondition,V.disableDepthTestDistance=t._disableDepthTestDistance,V._batchIndex=t._batchIndex,V.outlineColor=t.outlineColor,t.style===Fo.FILL_AND_OUTLINE?(V.color=t._fillColor,V.outlineWidth=t.outlineWidth):t.style===Fo.FILL?(V.color=t._fillColor,V.outlineWidth=0):t.style===Fo.OUTLINE&&(V.color=Y.TRANSPARENT,V.outlineWidth=t.outlineWidth)}}t._repositionAllGlyphs=!0}function Aue(e,t,n){return t===pi.CENTER?-e/2:t===pi.RIGHT?-(e+n.x):n.x}var sr=new D,e4e=new D;function t4e(e){let t=e._glyphs,n=e._renderedText,i,o,r=0,s=0,a=[],c=Number.NEGATIVE_INFINITY,d=0,u=1,m,p=t.length,g=e._backgroundBillboard,f=D.clone(l(g)?e._backgroundPadding:D.ZERO,e4e);for(f.x/=e._relativeSize,f.y/=e._relativeSize,m=0;m0&&(C===pi.CENTER?G=-s/2-f.x:C===pi.RIGHT?G=-(s+f.x*2):G=0,sr.x=G*_,V===Pn.TOP?sr.y=x-d-c:V===Pn.CENTER?sr.y=(x-d)/2-c:V===Pn.BASELINE?sr.y=-f.y-c:sr.y=0,sr.y=sr.y*_,g.width=P,g.height=F,g._setTranslate(sr),g._labelTranslate=D.clone(sr,g._labelTranslate)),_u(e.heightReference))for(m=0;m0?So.TRANSLUCENT:this.blendOption;t.blendOption=r,n.blendOption=r,t._highlightColor=this._highlightColor,n._highlightColor=this._highlightColor,this._labelsToUpdate.length=0,n.update(e),t.update(e)};_f.prototype.isDestroyed=function(){return!1};_f.prototype.destroy=function(){return this.removeAll(),this._billboardCollection=this._billboardCollection.destroy(),this._textureAtlas=this._textureAtlas&&this._textureAtlas.destroy(),this._backgroundBillboardCollection=this._backgroundBillboardCollection.destroy(),this._backgroundTextureAtlas=this._backgroundTextureAtlas&&this._backgroundTextureAtlas.destroy(),me(this)};var Tf=_f;var IKn=T(S(),1);var vzn=T(S(),1),tP=`in vec3 position3DHigh; in vec3 position3DLow; in vec3 position2DHigh; in vec3 position2DLow; in vec3 prevPosition3DHigh; in vec3 prevPosition3DLow; in vec3 prevPosition2DHigh; in vec3 prevPosition2DLow; in vec3 nextPosition3DHigh; in vec3 nextPosition3DLow; in vec3 nextPosition2DHigh; in vec3 nextPosition2DLow; in vec4 texCoordExpandAndBatchIndex; out vec2 v_st; out float v_width; out vec4 v_pickColor; out float v_polylineAngle; void main() { float texCoord = texCoordExpandAndBatchIndex.x; float expandDir = texCoordExpandAndBatchIndex.y; bool usePrev = texCoordExpandAndBatchIndex.z < 0.0; float batchTableIndex = texCoordExpandAndBatchIndex.w; vec2 widthAndShow = batchTable_getWidthAndShow(batchTableIndex); float width = widthAndShow.x + 0.5; float show = widthAndShow.y; if (width < 1.0) { show = 0.0; } vec4 pickColor = batchTable_getPickColor(batchTableIndex); vec4 p, prev, next; if (czm_morphTime == 1.0) { p = czm_translateRelativeToEye(position3DHigh.xyz, position3DLow.xyz); prev = czm_translateRelativeToEye(prevPosition3DHigh.xyz, prevPosition3DLow.xyz); next = czm_translateRelativeToEye(nextPosition3DHigh.xyz, nextPosition3DLow.xyz); } else if (czm_morphTime == 0.0) { p = czm_translateRelativeToEye(position2DHigh.zxy, position2DLow.zxy); prev = czm_translateRelativeToEye(prevPosition2DHigh.zxy, prevPosition2DLow.zxy); next = czm_translateRelativeToEye(nextPosition2DHigh.zxy, nextPosition2DLow.zxy); } else { p = czm_columbusViewMorph( czm_translateRelativeToEye(position2DHigh.zxy, position2DLow.zxy), czm_translateRelativeToEye(position3DHigh.xyz, position3DLow.xyz), czm_morphTime); prev = czm_columbusViewMorph( czm_translateRelativeToEye(prevPosition2DHigh.zxy, prevPosition2DLow.zxy), czm_translateRelativeToEye(prevPosition3DHigh.xyz, prevPosition3DLow.xyz), czm_morphTime); next = czm_columbusViewMorph( czm_translateRelativeToEye(nextPosition2DHigh.zxy, nextPosition2DLow.zxy), czm_translateRelativeToEye(nextPosition3DHigh.xyz, nextPosition3DLow.xyz), czm_morphTime); } #ifdef DISTANCE_DISPLAY_CONDITION vec3 centerHigh = batchTable_getCenterHigh(batchTableIndex); vec4 centerLowAndRadius = batchTable_getCenterLowAndRadius(batchTableIndex); vec3 centerLow = centerLowAndRadius.xyz; float radius = centerLowAndRadius.w; vec2 distanceDisplayCondition = batchTable_getDistanceDisplayCondition(batchTableIndex); float lengthSq; if (czm_sceneMode == czm_sceneMode2D) { lengthSq = czm_eyeHeight2D.y; } else { vec4 center = czm_translateRelativeToEye(centerHigh.xyz, centerLow.xyz); lengthSq = max(0.0, dot(center.xyz, center.xyz) - radius * radius); } float nearSq = distanceDisplayCondition.x * distanceDisplayCondition.x; float farSq = distanceDisplayCondition.y * distanceDisplayCondition.y; if (lengthSq < nearSq || lengthSq > farSq) { show = 0.0; } #endif float polylineAngle; vec4 positionWC = getPolylineWindowCoordinates(p, prev, next, expandDir, width, usePrev, polylineAngle); gl_Position = czm_viewportOrthographic * positionWC * show; v_st.s = texCoord; v_st.t = czm_writeNonPerspective(clamp(expandDir, 0.0, 1.0), gl_Position.w); v_width = width; v_pickColor = pickColor; v_polylineAngle = polylineAngle; } `;var Hzn=T(S(),1);function Zd(e,t){e=y(e,y.EMPTY_OBJECT),this._show=y(e.show,!0),this._width=y(e.width,1),this._loop=y(e.loop,!1),this._distanceDisplayCondition=e.distanceDisplayCondition,this._material=e.material,l(this._material)||(this._material=Mi.fromType(Mi.ColorType,{color:new Y(1,1,1,1)}));let n=e.positions;l(n)||(n=[]),this._positions=n,this._actualPositions=go(n,h.equalsEpsilon),this._loop&&this._actualPositions.length>2&&(this._actualPositions===this._positions&&(this._actualPositions=n.slice()),this._actualPositions.push(h.clone(this._actualPositions[0]))),this._length=this._actualPositions.length,this._id=e.id;let i;l(t)&&(i=M.clone(t.modelMatrix)),this._modelMatrix=i,this._segments=Li.wrapLongitude(this._actualPositions,i),this._actualLength=void 0,this._propertiesChanged=new Uint32Array(Bue),this._polylineCollection=t,this._dirty=!1,this._pickId=void 0,this._boundingVolume=le.fromPoints(this._actualPositions),this._boundingVolumeWC=le.transform(this._boundingVolume,this._modelMatrix),this._boundingVolume2D=new le}var Due=Zd.POSITION_INDEX=0,n4e=Zd.SHOW_INDEX=1,i4e=Zd.WIDTH_INDEX=2,o4e=Zd.MATERIAL_INDEX=3,nP=Zd.POSITION_SIZE_INDEX=4,r4e=Zd.DISTANCE_DISPLAY_CONDITION=5,Bue=Zd.NUMBER_OF_PROPERTIES=6;function T0(e,t){++e._propertiesChanged[t];let n=e._polylineCollection;l(n)&&(n._updatePolyline(e,t),e._dirty=!0)}Object.defineProperties(Zd.prototype,{show:{get:function(){return this._show},set:function(e){e!==this._show&&(this._show=e,T0(this,n4e))}},positions:{get:function(){return this._positions},set:function(e){let t=go(e,h.equalsEpsilon);this._loop&&t.length>2&&(t===e&&(t=e.slice()),t.push(h.clone(t[0]))),(this._actualPositions.length!==t.length||this._actualPositions.length!==this._length)&&T0(this,nP),this._positions=e,this._actualPositions=t,this._length=t.length,this._boundingVolume=le.fromPoints(this._actualPositions,this._boundingVolume),this._boundingVolumeWC=le.transform(this._boundingVolume,this._modelMatrix,this._boundingVolumeWC),T0(this,Due),this.update()}},material:{get:function(){return this._material},set:function(e){this._material!==e&&(this._material=e,T0(this,o4e))}},width:{get:function(){return this._width},set:function(e){let t=this._width;e!==t&&(this._width=e,T0(this,i4e))}},loop:{get:function(){return this._loop},set:function(e){if(e!==this._loop){let t=this._actualPositions;e?t.length>2&&!h.equals(t[0],t[t.length-1])&&(t.length===this._positions.length&&(this._actualPositions=t=this._positions.slice()),t.push(h.clone(t[0]))):t.length>2&&h.equals(t[0],t[t.length-1])&&(t.length-1===this._positions.length?this._actualPositions=this._positions:t.pop()),this._loop=e,T0(this,nP)}}},id:{get:function(){return this._id},set:function(e){this._id=e,l(this._pickId)&&(this._pickId.object.id=e)}},pickId:{get:function(){return this._pickId}},isDestroyed:{get:function(){return!l(this._polylineCollection)}},distanceDisplayCondition:{get:function(){return this._distanceDisplayCondition},set:function(e){Wt.equals(e,this._distanceDisplayCondition)||(this._distanceDisplayCondition=Wt.clone(e,this._distanceDisplayCondition),T0(this,r4e))}}});Zd.prototype.update=function(){let e=M.IDENTITY;l(this._polylineCollection)&&(e=this._polylineCollection.modelMatrix);let t=this._segments.positions.length,n=this._segments.lengths,i=this._propertiesChanged[Due]>0||this._propertiesChanged[nP]>0;if((!M.equals(e,this._modelMatrix)||i)&&(this._segments=Li.wrapLongitude(this._actualPositions,e),this._boundingVolumeWC=le.transform(this._boundingVolume,e,this._boundingVolumeWC)),this._modelMatrix=M.clone(e,this._modelMatrix),this._segments.positions.length!==t)T0(this,nP);else{let o=n.length;for(let r=0;r2){if(o[pJ]||o[Yue]){let f=e.mode===oe.SCENE2D?i._boundingVolume2D:i._boundingVolumeWC,x=Bn.fromCartesian(f.center,que),_=se.fromElements(x.low.x,x.low.y,x.low.z,f.radius,$ue);this._batchTable.setBatchedAttribute(i._index,2,x.high),this._batchTable.setBatchedAttribute(i._index,3,_)}if(o[l4e]){let f=eme;f.x=0,f.y=Number.MAX_VALUE;let x=i.distanceDisplayCondition;l(x)&&(f.x=x.near,f.y=x.far),this._batchTable.setBatchedAttribute(i._index,4,f)}}i._clean()}}c.length=0,this._polylinesUpdated=!1}o=this._propertiesChanged;for(let c=0;c0){let O=F.isTranslucent();a>=s?(b=new et({owner:e}),n.push(b)):b=n[a],++a,R=xt(p(F._uniforms),e._uniformMap),b.boundingVolume=le.clone(iP,b.boundingVolume),b.modelMatrix=i,b.shaderProgram=G,b.vertexArray=x.va,b.renderState=O?e._translucentRS:e._opaqueRS,b.pass=O?Re.TRANSLUCENT:Re.OPAQUE,b.debugShowBoundingVolume=u,b.pickId="v_pickColor",b.uniformMap=R,b.count=A,b.offset=Z,Z+=A,A=0,c=!0,r.push(b)}F=I._material,F.update(o),P=w}let N=I._locatorBuckets,B=N.length;for(let O=0;O0&&(a>=s?(b=new et({owner:e}),n.push(b)):b=n[a],++a,R=xt(p(F._uniforms),e._uniformMap),b.boundingVolume=le.clone(iP,b.boundingVolume),b.modelMatrix=i,b.shaderProgram=G,b.vertexArray=x.va,b.renderState=F.isTranslucent()?e._translucentRS:e._opaqueRS,b.pass=F.isTranslucent()?Re.TRANSLUCENT:Re.OPAQUE,b.debugShowBoundingVolume=u,b.pickId="v_pickColor",b.uniformMap=R,b.count=A,b.offset=Z,c=!0,r.push(b)),P=void 0}}n.length=a}jm.prototype.isDestroyed=function(){return!1};jm.prototype.destroy=function(){return tme(this),gJ(this),nme(this),this._batchTable=this._batchTable&&this._batchTable.destroy(),me(this)};function m4e(e){let t=!1,n=e._propertiesChanged,i=e._positionBufferUsage;return n[pJ]?(i.bufferUsage!==Ne.STREAM_DRAW&&(t=!0,i.bufferUsage=Ne.STREAM_DRAW),i.frameCount=100):i.bufferUsage!==Ne.STATIC_DRAW&&(i.frameCount===0?(t=!0,i.bufferUsage=Ne.STATIC_DRAW):i.frameCount--),t}var Hue=[0,0,0];function zue(e,t,n){e._createVertexArray=!1,gJ(e),tme(e),p4e(e);let i=[[]],o=i[0],r=e._batchTable,s=e._useHighlightColor,a=[0],c=0,d=[[]],u=0,m=e._polylineBuckets,p,g;for(p in m)m.hasOwnProperty(p)&&(g=m[p],g.updateShader(t,r,s),u+=g.lengthOfPositions);if(u>0){let f=e._mode,x=new Float32Array(6*u*3),_=new Float32Array(u*4),C,V=0,L=0,Z=0;for(p in m)if(m.hasOwnProperty(p)){g=m[p],g.write(x,_,V,L,Z,r,t,n),f===oe.MORPHING&&(l(C)||(C=new Float32Array(6*u*3)),g.writeForMorph(C,V));let R=g.lengthOfPositions;V+=6*R*3,L+=R*4,Z+=R*4,c=g.updateIndices(i,a,d,c)}let G=e._positionBufferUsage.bufferUsage,X=Ne.STATIC_DRAW;e._positionBuffer=ft.createVertexBuffer({context:t,typedArray:x,usage:G});let v;l(C)&&(v=ft.createVertexBuffer({context:t,typedArray:C,usage:G})),e._texCoordExpandAndBatchIndexBuffer=ft.createVertexBuffer({context:t,typedArray:_,usage:X});let P=3*Float32Array.BYTES_PER_ELEMENT,F=4*Float32Array.BYTES_PER_ELEMENT,A=0,b=i.length;for(let R=0;R0){let E=new Uint16Array(o),I=ft.createIndexBuffer({context:t,typedArray:E,usage:Ne.STATIC_DRAW,indexDatatype:Me.UNSIGNED_SHORT});A+=a[R];let w=6*(R*(P*W.SIXTY_FOUR_KILOBYTES)-A*P),N=P+w,B=P+N,U=P+B,O=P+U,k=P+O,J=R*(F*W.SIXTY_FOUR_KILOBYTES)-A*F,H=[{index:kl.position3DHigh,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:w,strideInBytes:6*P},{index:kl.position3DLow,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:N,strideInBytes:6*P},{index:kl.position2DHigh,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:w,strideInBytes:6*P},{index:kl.position2DLow,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:N,strideInBytes:6*P},{index:kl.prevPosition3DHigh,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:B,strideInBytes:6*P},{index:kl.prevPosition3DLow,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:U,strideInBytes:6*P},{index:kl.prevPosition2DHigh,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:B,strideInBytes:6*P},{index:kl.prevPosition2DLow,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:U,strideInBytes:6*P},{index:kl.nextPosition3DHigh,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:O,strideInBytes:6*P},{index:kl.nextPosition3DLow,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:k,strideInBytes:6*P},{index:kl.nextPosition2DHigh,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:O,strideInBytes:6*P},{index:kl.nextPosition2DLow,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:k,strideInBytes:6*P},{index:kl.texCoordExpandAndBatchIndex,componentsPerAttribute:4,componentDatatype:Q.FLOAT,vertexBuffer:e._texCoordExpandAndBatchIndexBuffer,offsetInBytes:J}],ee,z,j,q;f===oe.SCENE3D?(z=e._positionBuffer,ee="vertexBuffer",j=Hue,q="value"):f===oe.SCENE2D||f===oe.COLUMBUS_VIEW?(z=Hue,ee="value",j=e._positionBuffer,q="vertexBuffer"):(z=v,ee="vertexBuffer",j=e._positionBuffer,q="vertexBuffer"),H[0][ee]=z,H[1][ee]=z,H[2][q]=j,H[3][q]=j,H[4][ee]=z,H[5][ee]=z,H[6][q]=j,H[7][q]=j,H[8][ee]=z,H[9][ee]=z,H[10][q]=j,H[11][q]=j;let be=new ti({context:t,attributes:H,indexBuffer:I});e._vertexArrays.push({va:be,buckets:d[R]})}}}function h4e(e,t){return t instanceof Et?t.id:t}var Gk=[];function f4e(e){let t=Mi._uniformList[e.type],n=t.length;Gk.length=2*n;let i=0;for(let o=0;o1){a.update();let c=a.material,d=i[c.type];l(d)||(d=i[c.type]=new Sf(c,t,n)),d.addPolyline(a)}}}function b4e(e,t){let n=t.mode;(e._mode!==n||!M.equals(e._modelMatrix,e.modelMatrix))&&(e._mode=n,e._modelMatrix=M.clone(e.modelMatrix),e._createVertexArray=!0)}function bJ(e){if(e._polylinesRemoved){e._polylinesRemoved=!1;let t=[],n=[],i=0,o,r=e._polylines.length;for(let s=0;s0,_=g._index,C=this.getSegments(g,a),V=C.positions,L=C.lengths,Z=V.length,G=g.getPickId(s).color,X=0,v=0,P;for(let B=0;B0||xs.x>0&&wu.x<0)&&h.clone(xs,wu),(xs.x<0&&Fu.x>0||xs.x>0&&Fu.x<0)&&h.clone(xs,Fu));let J=O?2:0,H=k?2:4;for(let ee=J;ee2&&(r.setBatchedAttribute(_,2,E),r.setBatchedAttribute(_,3,I),r.setBatchedAttribute(_,4,w))}};var x4e=new h,_4e=new h,T4e=new h,Kue=new h;Sf.prototype.writeForMorph=function(e,t){let n=this.modelMatrix,i=this.polylines,o=i.length;for(let r=0;r0&&(c=a[a.length-1]+1);let d=this.polylines,u=d.length;for(let m=0;m0)g[0]=x;else continue}else g=p._segments.lengths;let f=g.length;if(f>0){let x=0;for(let _=0;_W.SIXTY_FOUR_KILOBYTES&&(p._locatorBuckets.push({locator:r,count:x}),x=0,t.push(4),a=[],e.push(a),c=0,r.count=s,s=0,i=0,r=new fJ(0,0,this),n[++o]=[r]),a.push(c,c+2,c+1),a.push(c+1,c+2,c+3),x+=6,s+=6,i+=6,c+=4}p._locatorBuckets.push({locator:r,count:x}),c+4>W.SIXTY_FOUR_KILOBYTES&&(t.push(0),a=[],e.push(a),c=0,r.count=s,i=0,s=0,r=new fJ(0,0,this),n[++o]=[r])}p._clean()}return r.count=s,i};Sf.prototype.getPolylineStartIndex=function(e){let t=this.polylines,n=0,i=t.length;for(let o=0;o0){e._boundingVolume2D=le.fromPoints(o,e._boundingVolume2D);let d=e._boundingVolume2D.center;e._boundingVolume2D.center=new h(d.z,d.x,d.y)}return V1.positions=o,V1.lengths=e._segments.lengths,V1};var Que;Sf.prototype.writeUpdate=function(e,t,n,i){let o=this.mode,r=i.ellipsoid.maximumRadius*W.PI,s=t._actualLength;if(s){e+=this.getPolylineStartIndex(t);let a=Que,c=6*s*3;!l(a)||a.lengthc&&(a=new Float32Array(a.buffer,0,c));let d=this.getSegments(t,i),u=d.positions,m=d.lengths,p=0,g=0,f=0,x;s=u.length;for(let _=0;_0||xs.x>0&&wu.x<0)&&h.clone(xs,wu),(xs.x<0&&Fu.x>0||xs.x>0&&Fu.x<0)&&h.clone(xs,Fu));let Z=V?2:0,G=L?2:4;for(let X=Z;X{if(e.isDestroyed())return;e._positions=new Float64Array(a.positions);let c=e._billboardCollection,d=e._labelCollection,u=e._polylineCollection;n=e._positions;let m=e._batchIds,p=n.length/3;for(let g=0;g{e.isDestroyed()||(e._error=a)})}Ug.prototype.createFeatures=function(e,t){let n=this._billboardCollection,i=this._labelCollection,o=this._polylineCollection,r=this._batchIds,s=r.length;for(let a=0;a{if(e.isDestroyed())return;e._positions=void 0,e._counts=void 0,e._polygonMinimumHeights=void 0,e._polygonMaximumHeights=void 0;let f=new Float64Array(g.packedBuffer),x=f[0];A4e(e,f),e._indices=Me.getSizeInBytes(x)===2?new Uint16Array(g.indices):new Uint32Array(g.indices),e._indexOffsets=new Uint32Array(g.indexOffsets),e._indexCounts=new Uint32Array(g.indexCounts),e._batchedPositions=new Float32Array(g.positions),e._vertexBatchIds=new Uint16Array(g.batchIds),U4e(e),e._ready=!0}).catch(g=>{e.isDestroyed()||(e._error=g)})}function U4e(e){l(e._primitive)||(e._primitive=new S_({batchTable:e._batchTable,positions:e._batchedPositions,batchIds:e._batchIds,vertexBatchIds:e._vertexBatchIds,indices:e._indices,indexOffsets:e._indexOffsets,indexCounts:e._indexCounts,batchedIndices:e._batchedIndices,boundingVolume:e._boundingVolume,boundingVolumes:e._boundingVolumes,center:e._center}),e._batchTable=void 0,e._batchIds=void 0,e._positions=void 0,e._counts=void 0,e._indices=void 0,e._indexCounts=void 0,e._indexOffsets=void 0,e._batchTableColors=void 0,e._packedBuffer=void 0,e._batchedPositions=void 0,e._transferrableBatchIds=void 0,e._vertexBatchIds=void 0,e._ellipsoid=void 0,e._minimumHeight=void 0,e._maximumHeight=void 0,e._polygonMinimumHeights=void 0,e._polygonMaximumHeights=void 0,e._center=void 0,e._rectangle=void 0,e._boundingVolume=void 0,e._boundingVolumes=void 0,e._batchedIndices=void 0)}S0.prototype.createFeatures=function(e,t){this._primitive.createFeatures(e,t)};S0.prototype.applyDebugSettings=function(e,t){this._primitive.applyDebugSettings(e,t)};S0.prototype.applyStyle=function(e,t){this._primitive.applyStyle(e,t)};S0.prototype.updateCommands=function(e,t){this._primitive.updateCommands(e,t)};S0.prototype.update=function(e){if(!this._ready){if(l(this._promise)||(this._promise=k4e(this)),l(this._error)){let t=this._error;throw this._error=void 0,t}return}this._primitive.debugWireframe=this.debugWireframe,this._primitive.forceRebatch=this.forceRebatch,this._primitive.classificationType=this.classificationType,this._primitive.update(e)};S0.prototype.isDestroyed=function(){return!1};S0.prototype.destroy=function(){return this._primitive=this._primitive&&this._primitive.destroy(),me(this)};var aP=S0;var NJn=T(S(),1);var hJn=T(S(),1),cP=`in vec4 currentPosition; in vec4 previousPosition; in vec4 nextPosition; in vec2 expandAndWidth; in float a_batchId; uniform mat4 u_modifiedModelView; void main() { float expandDir = expandAndWidth.x; float width = abs(expandAndWidth.y) + 0.5; bool usePrev = expandAndWidth.y < 0.0; vec4 p = u_modifiedModelView * currentPosition; vec4 prev = u_modifiedModelView * previousPosition; vec4 next = u_modifiedModelView * nextPosition; float angle; vec4 positionWC = getPolylineWindowCoordinatesEC(p, prev, next, expandDir, width, usePrev, angle); gl_Position = czm_viewportOrthographic * positionWC; } `;function $m(e){this._positions=e.positions,this._widths=e.widths,this._counts=e.counts,this._batchIds=e.batchIds,this._ellipsoid=y(e.ellipsoid,ie.WGS84),this._minimumHeight=e.minimumHeight,this._maximumHeight=e.maximumHeight,this._center=e.center,this._rectangle=e.rectangle,this._boundingVolume=e.boundingVolume,this._batchTable=e.batchTable,this._va=void 0,this._sp=void 0,this._rs=void 0,this._uniformMap=void 0,this._command=void 0,this._transferrableBatchIds=void 0,this._packedBuffer=void 0,this._keepDecodedPositions=e.keepDecodedPositions,this._decodedPositions=void 0,this._decodedPositionOffsets=void 0,this._currentPositions=void 0,this._previousPositions=void 0,this._nextPositions=void 0,this._expandAndWidth=void 0,this._vertexBatchIds=void 0,this._indices=void 0,this._constantColor=Y.clone(Y.WHITE),this._highlightColor=this._constantColor,this._trianglesLength=0,this._geometryByteLength=0,this._ready=!1,this._promise=void 0,this._error=void 0}Object.defineProperties($m.prototype,{trianglesLength:{get:function(){return this._trianglesLength}},geometryByteLength:{get:function(){return this._geometryByteLength}},ready:{get:function(){return this._ready}}});function D4e(e){let t=e._rectangle,n=e._minimumHeight,i=e._maximumHeight,o=e._ellipsoid,r=e._center,s=2+ce.packedLength+ie.packedLength+h.packedLength,a=new Float64Array(s),c=0;return a[c++]=n,a[c++]=i,ce.pack(t,a,c),c+=ce.packedLength,ie.pack(o,a,c),c+=ie.packedLength,h.pack(r,a,c),a}var B4e=new hi("createVectorTilePolylines",5),L1={previousPosition:0,currentPosition:1,nextPosition:2,expandAndWidth:3,a_batchId:4};function Y4e(e,t){if(l(e._va))return;let n=e._positions,i=e._widths,o=e._counts,r=e._transferrableBatchIds,s=e._packedBuffer;l(s)||(n=e._positions=n.slice(),i=e._widths=i.slice(),o=e._counts=o.slice(),r=e._transferrableBatchIds=e._batchIds.slice(),s=e._packedBuffer=D4e(e));let a=[n.buffer,i.buffer,o.buffer,r.buffer,s.buffer],c={positions:n.buffer,widths:i.buffer,counts:o.buffer,batchIds:r.buffer,packedBuffer:s.buffer,keepDecodedPositions:e._keepDecodedPositions},d=B4e.scheduleTask(c,a);if(l(d))return d.then(function(u){if(e.isDestroyed())return;e._keepDecodedPositions&&(e._decodedPositions=new Float64Array(u.decodedPositions),e._decodedPositionOffsets=new Uint32Array(u.decodedPositionOffsets)),e._currentPositions=new Float32Array(u.currentPositions),e._previousPositions=new Float32Array(u.previousPositions),e._nextPositions=new Float32Array(u.nextPositions),e._expandAndWidth=new Float32Array(u.expandAndWidth),e._vertexBatchIds=new Uint16Array(u.batchIds);let m=u.indexDatatype;e._indices=m===Me.UNSIGNED_SHORT?new Uint16Array(u.indices):new Uint32Array(u.indices),O4e(e,t),e._ready=!0}).catch(u=>{e.isDestroyed()||(e._error=u)})}function O4e(e,t){if(!l(e._va)){let n=e._currentPositions,i=e._previousPositions,o=e._nextPositions,r=e._expandAndWidth,s=e._vertexBatchIds,a=e._indices,c=i.byteLength+n.byteLength+o.byteLength;c+=r.byteLength+s.byteLength+a.byteLength,e._trianglesLength=a.length/3,e._geometryByteLength=c;let d=ft.createVertexBuffer({context:t,typedArray:i,usage:Ne.STATIC_DRAW}),u=ft.createVertexBuffer({context:t,typedArray:n,usage:Ne.STATIC_DRAW}),m=ft.createVertexBuffer({context:t,typedArray:o,usage:Ne.STATIC_DRAW}),p=ft.createVertexBuffer({context:t,typedArray:r,usage:Ne.STATIC_DRAW}),g=ft.createVertexBuffer({context:t,typedArray:s,usage:Ne.STATIC_DRAW}),f=ft.createIndexBuffer({context:t,typedArray:a,usage:Ne.STATIC_DRAW,indexDatatype:a.BYTES_PER_ELEMENT===2?Me.UNSIGNED_SHORT:Me.UNSIGNED_INT}),x=[{index:L1.previousPosition,vertexBuffer:d,componentDatatype:Q.FLOAT,componentsPerAttribute:3},{index:L1.currentPosition,vertexBuffer:u,componentDatatype:Q.FLOAT,componentsPerAttribute:3},{index:L1.nextPosition,vertexBuffer:m,componentDatatype:Q.FLOAT,componentsPerAttribute:3},{index:L1.expandAndWidth,vertexBuffer:p,componentDatatype:Q.FLOAT,componentsPerAttribute:2},{index:L1.a_batchId,vertexBuffer:g,componentDatatype:Q.UNSIGNED_SHORT,componentsPerAttribute:1}];e._va=new ti({context:t,attributes:x,indexBuffer:f}),e._positions=void 0,e._widths=void 0,e._counts=void 0,e._ellipsoid=void 0,e._minimumHeight=void 0,e._maximumHeight=void 0,e._rectangle=void 0,e._transferrableBatchIds=void 0,e._packedBuffer=void 0,e._currentPositions=void 0,e._previousPositions=void 0,e._nextPositions=void 0,e._expandAndWidth=void 0,e._vertexBatchIds=void 0,e._indices=void 0}}var lP=new M,ome=new h;function H4e(e,t){l(e._uniformMap)||(e._uniformMap={u_modifiedModelView:function(){let n=t.uniformState.view;return M.clone(n,lP),M.multiplyByPoint(lP,e._center,ome),M.setTranslation(lP,ome,lP),lP},u_highlightColor:function(){return e._highlightColor}})}function z4e(e){if(l(e._rs))return;let t={enabled:!0,factor:-5,units:-5};e._rs=De.fromCache({blending:un.ALPHA_BLEND,depthMask:!1,depthTest:{enabled:!0},polygonOffset:t})}var K4e=`uniform vec4 u_highlightColor; void main() { out_FragColor = u_highlightColor; } `;function J4e(e,t){if(l(e._sp))return;let n=e._batchTable,i=n.getVertexShaderCallback(!1,"a_batchId",void 0)(cP),o=n.getFragmentShaderCallback(!1,void 0,!1)(K4e),r=new Ye({defines:["VECTOR_TILE",Yt.isInternetExplorer()?"":"CLIP_POLYLINE"],sources:[yd,i]}),s=new Ye({defines:["VECTOR_TILE"],sources:[o]});e._sp=$t.fromCache({context:t,vertexShaderSource:r,fragmentShaderSource:s,attributeLocations:L1})}function Q4e(e,t){if(!l(e._command)){let n=e._batchTable.getUniformMapCallback()(e._uniformMap);e._command=new et({owner:e,vertexArray:e._va,renderState:e._rs,shaderProgram:e._sp,uniformMap:n,boundingVolume:e._boundingVolume,pass:Re.TRANSLUCENT,pickId:e._batchTable.getPickId()})}t.commandList.push(e._command)}$m.getPolylinePositions=function(e,t){let n=e._batchIds,i=e._decodedPositions,o=e._decodedPositionOffsets;if(!l(n)||!l(i))return;let r,s,a=n.length,c=0,d=0;for(r=0;r // vec3 scratchNormal = mix(-startFaceNormalAndVertexCorner.xyz, endFaceNormalAndHalfWidth.xyz, isEnd); scratchNormal = cross(scratchNormal, mix(startEllipsoidNormal, endEllipsoidNormal, isEnd)); vec3 miterPushNormal = czm_normal * normalize(scratchNormal); offset = 2.0 * endFaceNormalAndHalfWidth.w * max(0.0, czm_metersPerPixel(position)); // offset = widthEC offset = offset / dot(miterPushNormal, right); position.xyz += miterPushNormal * (offset * sign(0.5 - mod(startFaceNormalAndVertexCorner.w, 2.0))); gl_Position = czm_depthClamp(czm_projection * position); position = u_modifiedModelView * vec4(startPositionAndHeight.xyz, 1.0); vec3 startNormalEC = czm_normal * startFaceNormalAndVertexCorner.xyz; v_startPlaneEC = vec4(startNormalEC, -dot(startNormalEC, position.xyz)); v_rightPlaneEC = vec4(right, -dot(right, position.xyz)); position = u_modifiedModelView * vec4(endPositionAndHeight.xyz, 1.0); vec3 endNormalEC = czm_normal * endFaceNormalAndHalfWidth.xyz; v_endPlaneEC = vec4(endNormalEC, -dot(endNormalEC, position.xyz)); v_halfWidth = endFaceNormalAndHalfWidth.w; } `;var BJn=T(S(),1),uP=`in vec4 v_startPlaneEC; in vec4 v_endPlaneEC; in vec4 v_rightPlaneEC; in float v_halfWidth; in vec3 v_volumeUpEC; uniform vec4 u_highlightColor; void main() { float logDepthOrDepth = czm_branchFreeTernary(czm_sceneMode == czm_sceneMode2D, gl_FragCoord.z, czm_unpackDepth(texture(czm_globeDepthTexture, gl_FragCoord.xy / czm_viewport.zw))); // Discard for sky if (logDepthOrDepth == 0.0) { #ifdef DEBUG_SHOW_VOLUME out_FragColor = vec4(0.0, 0.0, 1.0, 0.5); return; #else // DEBUG_SHOW_VOLUME discard; #endif // DEBUG_SHOW_VOLUME } vec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, logDepthOrDepth); eyeCoordinate /= eyeCoordinate.w; float halfMaxWidth = v_halfWidth * czm_metersPerPixel(eyeCoordinate); // Expand halfMaxWidth if direction to camera is almost perpendicular with the volume's up direction halfMaxWidth += halfMaxWidth * (1.0 - dot(-normalize(eyeCoordinate.xyz), v_volumeUpEC)); // Check distance of the eye coordinate against the right-facing plane float widthwiseDistance = czm_planeDistance(v_rightPlaneEC, eyeCoordinate.xyz); // Check eye coordinate against the mitering planes float distanceFromStart = czm_planeDistance(v_startPlaneEC, eyeCoordinate.xyz); float distanceFromEnd = czm_planeDistance(v_endPlaneEC, eyeCoordinate.xyz); if (abs(widthwiseDistance) > halfMaxWidth || distanceFromStart < 0.0 || distanceFromEnd < 0.0) { #ifdef DEBUG_SHOW_VOLUME out_FragColor = vec4(logDepthOrDepth, 0.0, 0.0, 0.5); return; #else // DEBUG_SHOW_VOLUME discard; #endif // DEBUG_SHOW_VOLUME } out_FragColor = u_highlightColor; czm_writeDepthClamp(); } `;function C0(e){this._positions=e.positions,this._widths=e.widths,this._counts=e.counts,this._batchIds=e.batchIds,this._ellipsoid=y(e.ellipsoid,ie.WGS84),this._minimumHeight=e.minimumHeight,this._maximumHeight=e.maximumHeight,this._center=e.center,this._rectangle=e.rectangle,this._batchTable=e.batchTable,this._va=void 0,this._sp=void 0,this._rs=void 0,this._uniformMap=void 0,this._command=void 0,this._transferrableBatchIds=void 0,this._packedBuffer=void 0,this._minimumMaximumVectorHeights=new D(ci._defaultMinTerrainHeight,ci._defaultMaxTerrainHeight),this._boundingVolume=Gn.fromRectangle(e.rectangle,ci._defaultMinTerrainHeight,ci._defaultMaxTerrainHeight,this._ellipsoid),this._classificationType=e.classificationType,this._keepDecodedPositions=e.keepDecodedPositions,this._decodedPositions=void 0,this._decodedPositionOffsets=void 0,this._startEllipsoidNormals=void 0,this._endEllipsoidNormals=void 0,this._startPositionAndHeights=void 0,this._startFaceNormalAndVertexCornerIds=void 0,this._endPositionAndHeights=void 0,this._endFaceNormalAndHalfWidths=void 0,this._vertexBatchIds=void 0,this._indices=void 0,this._constantColor=Y.clone(Y.WHITE),this._highlightColor=this._constantColor,this._trianglesLength=0,this._geometryByteLength=0,this._ready=!1,this._promise=void 0,this._error=void 0}Object.defineProperties(C0.prototype,{trianglesLength:{get:function(){return this._trianglesLength}},geometryByteLength:{get:function(){return this._geometryByteLength}},ready:{get:function(){return this._ready}}});function tje(e,t,n){let i=ci.getMinimumMaximumHeights(t,n),o=i.minimumTerrainHeight,r=i.maximumTerrainHeight,s=e._minimumMaximumVectorHeights;s.x=o,s.y=r;let a=e._boundingVolume,c=e._rectangle;Gn.fromRectangle(c,o,r,n,a)}function nje(e){let t=e._rectangle,n=e._minimumHeight,i=e._maximumHeight,o=e._ellipsoid,r=e._center,s=2+ce.packedLength+ie.packedLength+h.packedLength,a=new Float64Array(s),c=0;return a[c++]=n,a[c++]=i,ce.pack(t,a,c),c+=ce.packedLength,ie.pack(o,a,c),c+=ie.packedLength,h.pack(r,a,c),a}var ije=new hi("createVectorTileClampedPolylines"),Dg={startEllipsoidNormal:0,endEllipsoidNormal:1,startPositionAndHeight:2,endPositionAndHeight:3,startFaceNormalAndVertexCorner:4,endFaceNormalAndHalfWidth:5,a_batchId:6};function oje(e,t){if(l(e._va))return;let n=e._positions,i=e._widths,o=e._counts,r=e._transferrableBatchIds,s=e._packedBuffer;l(s)||(n=e._positions=n.slice(),i=e._widths=i.slice(),o=e._counts=o.slice(),r=e._transferrableBatchIds=e._batchIds.slice(),s=e._packedBuffer=nje(e));let a=[n.buffer,i.buffer,o.buffer,r.buffer,s.buffer],c={positions:n.buffer,widths:i.buffer,counts:o.buffer,batchIds:r.buffer,packedBuffer:s.buffer,keepDecodedPositions:e._keepDecodedPositions},d=ije.scheduleTask(c,a);if(l(d))return d.then(function(u){if(e.isDestroyed())return;e._keepDecodedPositions&&(e._decodedPositions=new Float64Array(u.decodedPositions),e._decodedPositionOffsets=new Uint32Array(u.decodedPositionOffsets)),e._startEllipsoidNormals=new Float32Array(u.startEllipsoidNormals),e._endEllipsoidNormals=new Float32Array(u.endEllipsoidNormals),e._startPositionAndHeights=new Float32Array(u.startPositionAndHeights),e._startFaceNormalAndVertexCornerIds=new Float32Array(u.startFaceNormalAndVertexCornerIds),e._endPositionAndHeights=new Float32Array(u.endPositionAndHeights),e._endFaceNormalAndHalfWidths=new Float32Array(u.endFaceNormalAndHalfWidths),e._vertexBatchIds=new Uint16Array(u.vertexBatchIds);let m=u.indexDatatype;e._indices=m===Me.UNSIGNED_SHORT?new Uint16Array(u.indices):new Uint32Array(u.indices),rje(e,t),e._ready=!0}).catch(u=>{e.isDestroyed()||(e._error=u)})}function rje(e,t){if(!l(e._va)){let n=e._startEllipsoidNormals,i=e._endEllipsoidNormals,o=e._startPositionAndHeights,r=e._endPositionAndHeights,s=e._startFaceNormalAndVertexCornerIds,a=e._endFaceNormalAndHalfWidths,c=e._vertexBatchIds,d=e._indices,u=n.byteLength+i.byteLength;u+=o.byteLength+r.byteLength,u+=s.byteLength+a.byteLength,u+=c.byteLength+d.byteLength,e._trianglesLength=d.length/3,e._geometryByteLength=u;let m=ft.createVertexBuffer({context:t,typedArray:n,usage:Ne.STATIC_DRAW}),p=ft.createVertexBuffer({context:t,typedArray:i,usage:Ne.STATIC_DRAW}),g=ft.createVertexBuffer({context:t,typedArray:o,usage:Ne.STATIC_DRAW}),f=ft.createVertexBuffer({context:t,typedArray:r,usage:Ne.STATIC_DRAW}),x=ft.createVertexBuffer({context:t,typedArray:s,usage:Ne.STATIC_DRAW}),_=ft.createVertexBuffer({context:t,typedArray:a,usage:Ne.STATIC_DRAW}),C=ft.createVertexBuffer({context:t,typedArray:c,usage:Ne.STATIC_DRAW}),V=ft.createIndexBuffer({context:t,typedArray:d,usage:Ne.STATIC_DRAW,indexDatatype:d.BYTES_PER_ELEMENT===2?Me.UNSIGNED_SHORT:Me.UNSIGNED_INT}),L=[{index:Dg.startEllipsoidNormal,vertexBuffer:m,componentDatatype:Q.FLOAT,componentsPerAttribute:3},{index:Dg.endEllipsoidNormal,vertexBuffer:p,componentDatatype:Q.FLOAT,componentsPerAttribute:3},{index:Dg.startPositionAndHeight,vertexBuffer:g,componentDatatype:Q.FLOAT,componentsPerAttribute:4},{index:Dg.endPositionAndHeight,vertexBuffer:f,componentDatatype:Q.FLOAT,componentsPerAttribute:4},{index:Dg.startFaceNormalAndVertexCorner,vertexBuffer:x,componentDatatype:Q.FLOAT,componentsPerAttribute:4},{index:Dg.endFaceNormalAndHalfWidth,vertexBuffer:_,componentDatatype:Q.FLOAT,componentsPerAttribute:4},{index:Dg.a_batchId,vertexBuffer:C,componentDatatype:Q.UNSIGNED_SHORT,componentsPerAttribute:1}];e._va=new ti({context:t,attributes:L,indexBuffer:V}),e._positions=void 0,e._widths=void 0,e._counts=void 0,e._ellipsoid=void 0,e._minimumHeight=void 0,e._maximumHeight=void 0,e._rectangle=void 0,e._transferrableBatchIds=void 0,e._packedBuffer=void 0,e._startEllipsoidNormals=void 0,e._endEllipsoidNormals=void 0,e._startPositionAndHeights=void 0,e._startFaceNormalAndVertexCornerIds=void 0,e._endPositionAndHeights=void 0,e._endFaceNormalAndHalfWidths=void 0,e._vertexBatchIds=void 0,e._indices=void 0}}var mP=new M,rme=new h;function sje(e,t){l(e._uniformMap)||(e._uniformMap={u_modifiedModelView:function(){let n=t.uniformState.view;return M.clone(n,mP),M.multiplyByPoint(mP,e._center,rme),M.setTranslation(mP,rme,mP),mP},u_highlightColor:function(){return e._highlightColor},u_minimumMaximumVectorHeights:function(){return e._minimumMaximumVectorHeights}})}function sme(e){return De.fromCache({cull:{enabled:!0,face:bi.FRONT},blending:un.PRE_MULTIPLIED_ALPHA_BLEND,depthMask:!1,stencilTest:{enabled:e,frontFunction:Dn.EQUAL,frontOperation:{fail:pt.KEEP,zFail:pt.KEEP,zPass:pt.KEEP},backFunction:Dn.EQUAL,backOperation:{fail:pt.KEEP,zFail:pt.KEEP,zPass:pt.KEEP},reference:Nt.CESIUM_3D_TILE_MASK,mask:Nt.CESIUM_3D_TILE_MASK}})}function aje(e){l(e._rs)||(e._rs=sme(!1),e._rs3DTiles=sme(!0))}function cje(e,t){if(l(e._sp))return;let n=e._batchTable,i=n.getVertexShaderCallback(!1,"a_batchId",void 0)(dP),o=n.getFragmentShaderCallback(!1,void 0,!0)(uP),r=new Ye({defines:["VECTOR_TILE",Yt.isInternetExplorer()?"":"CLIP_POLYLINE"],sources:[yd,i]}),s=new Ye({defines:["VECTOR_TILE"],sources:[o]});e._sp=$t.fromCache({context:t,vertexShaderSource:r,fragmentShaderSource:s,attributeLocations:Dg})}function lje(e,t){let n=e._command;if(!l(e._command)){let o=e._batchTable.getUniformMapCallback()(e._uniformMap);n=e._command=new et({owner:e,vertexArray:e._va,renderState:e._rs,shaderProgram:e._sp,uniformMap:o,boundingVolume:e._boundingVolume,pass:Re.TERRAIN_CLASSIFICATION,pickId:e._batchTable.getPickId()});let r=et.shallowClone(n,n.derivedCommands.tileset);r.renderState=e._rs3DTiles,r.pass=Re.CESIUM_3D_TILE_CLASSIFICATION,n.derivedCommands.tileset=r}let i=e._classificationType;(i===Un.TERRAIN||i===Un.BOTH)&&t.commandList.push(n),(i===Un.CESIUM_3D_TILE||i===Un.BOTH)&&t.commandList.push(n.derivedCommands.tileset)}C0.prototype.getPositions=function(e){return Q_.getPolylinePositions(this,e)};C0.prototype.createFeatures=function(e,t){let n=this._batchIds,i=n.length;for(let o=0;o{e.isDestroyed()||(e._error=t)})}C0.prototype.update=function(e){let t=e.context;if(!this._ready){if(l(this._promise)||(this._promise=fje(this).then(oje(this,t))),l(this._error)){let i=this._error;throw this._error=void 0,i}return}sje(this,t),cje(this,t),aje(this);let n=e.passes;(n.render||n.pick)&&lje(this,e)};C0.prototype.isDestroyed=function(){return!1};C0.prototype.destroy=function(){return this._va=this._va&&this._va.destroy(),this._sp=this._sp&&this._sp.destroy(),me(this)};var hP=C0;function th(e,t,n,i,o){this._tileset=e,this._tile=t,this._resource=n,this._polygons=void 0,this._polylines=void 0,this._points=void 0,this._metadata=void 0,this._batchTable=void 0,this._features=void 0,this.featurePropertiesDirty=!1,this._group=void 0,this._ready=!1,xje(this,i,o)}Object.defineProperties(th.prototype,{featuresLength:{get:function(){return l(this._batchTable)?this._batchTable.featuresLength:0}},pointsLength:{get:function(){return l(this._points)?this._points.pointsLength:0}},trianglesLength:{get:function(){let e=0;return l(this._polygons)&&(e+=this._polygons.trianglesLength),l(this._polylines)&&(e+=this._polylines.trianglesLength),e}},geometryByteLength:{get:function(){let e=0;return l(this._polygons)&&(e+=this._polygons.geometryByteLength),l(this._polylines)&&(e+=this._polylines.geometryByteLength),e}},texturesByteLength:{get:function(){return l(this._points)?this._points.texturesByteLength:0}},batchTableByteLength:{get:function(){return l(this._batchTable)?this._batchTable.batchTableByteLength:0}},innerContents:{get:function(){}},ready:{get:function(){return this._ready}},tileset:{get:function(){return this._tileset}},tile:{get:function(){return this._tile}},url:{get:function(){return this._resource.getUrlComponent(!0)}},metadata:{get:function(){return this._metadata},set:function(e){this._metadata=e}},batchTable:{get:function(){return this._batchTable}},group:{get:function(){return this._group},set:function(e){this._group=e}}});function pje(e){return function(t,n){l(e._polygons)&&e._polygons.updateCommands(t,n)}}function bje(e,t){let n,i,o,r,s=y(e.POLYGONS_LENGTH,0),a=y(e.POLYLINES_LENGTH,0),c=y(e.POINTS_LENGTH,0);if(s>0&&l(e.POLYGON_BATCH_IDS)){let p=t.byteOffset+e.POLYGON_BATCH_IDS.byteOffset;n=new Uint16Array(t.buffer,p,s)}if(a>0&&l(e.POLYLINE_BATCH_IDS)){let p=t.byteOffset+e.POLYLINE_BATCH_IDS.byteOffset;i=new Uint16Array(t.buffer,p,a)}if(c>0&&l(e.POINT_BATCH_IDS)){let p=t.byteOffset+e.POINT_BATCH_IDS.byteOffset;o=new Uint16Array(t.buffer,p,c)}let d=l(n)||l(i)||l(o),u=s>0&&!l(n)||a>0&&!l(i)||c>0&&!l(o);if(d&&u)throw new ue("If one group of batch ids is defined, then all batch ids must be defined");if(!l(n)&&!l(i)&&!l(o)){let p=0;if(!l(n)&&s>0)for(n=new Uint16Array(s),r=0;r0)for(i=new Uint16Array(a),r=0;r0)for(o=new Uint16Array(c),r=0;r0&&(C=Zo(i,n,d),n+=d,u>0&&(V=new Uint8Array(t,n,u),V=new Uint8Array(V),n+=u));let L=y(x.POLYGONS_LENGTH,0),Z=y(x.POLYLINES_LENGTH,0),G=y(x.POINTS_LENGTH,0),X=L+Z+G,v=new jp(e,X,C,V,pje(e));if(e._batchTable=v,X===0)return;let P=new zm(x,_),F=P.getGlobalProperty("REGION");if(!l(F))throw new ue("Feature table global property: REGION must be defined");let A=ce.unpack(F),b=F[4],R=F[5],E=e._tile.computedTransform,I=P.getGlobalProperty("RTC_CENTER",Q.FLOAT,3);l(I)?(I=h.unpack(I),M.multiplyByPoint(E,I,I)):(I=ce.center(A),I.height=W.lerp(b,R,.5),I=ie.WGS84.cartographicToCartesian(I));let w=bje(x,_);if(n+=(4-n%4)%4,L>0){P.featuresLength=L;let N=y(P.getPropertyArray("POLYGON_COUNTS",Q.UNSIGNED_INT,1),P.getPropertyArray("POLYGON_COUNT",Q.UNSIGNED_INT,1));if(!l(N))throw new ue("Feature table property: POLYGON_COUNTS must be defined when POLYGONS_LENGTH is greater than 0");let B=y(P.getPropertyArray("POLYGON_INDEX_COUNTS",Q.UNSIGNED_INT,1),P.getPropertyArray("POLYGON_INDEX_COUNT",Q.UNSIGNED_INT,1));if(!l(B))throw new ue("Feature table property: POLYGON_INDEX_COUNTS must be defined when POLYGONS_LENGTH is greater than 0");let U=N.reduce(function(z,j){return z+j*2},0),O=B.reduce(function(z,j){return z+j},0),k=new Uint32Array(t,n,O);n+=m;let J=new Uint16Array(t,n,U);n+=p;let H,ee;l(x.POLYGON_MINIMUM_HEIGHTS)&&l(x.POLYGON_MAXIMUM_HEIGHTS)&&(H=P.getPropertyArray("POLYGON_MINIMUM_HEIGHTS",Q.FLOAT,1),ee=P.getPropertyArray("POLYGON_MAXIMUM_HEIGHTS",Q.FLOAT,1)),e._polygons=new aP({positions:J,counts:N,indexCounts:B,indices:k,minimumHeight:b,maximumHeight:R,polygonMinimumHeights:H,polygonMaximumHeights:ee,center:I,rectangle:A,boundingVolume:e.tile.boundingVolume.boundingVolume,batchTable:v,batchIds:w.polygons,modelMatrix:E})}if(Z>0){P.featuresLength=Z;let N=y(P.getPropertyArray("POLYLINE_COUNTS",Q.UNSIGNED_INT,1),P.getPropertyArray("POLYLINE_COUNT",Q.UNSIGNED_INT,1));if(!l(N))throw new ue("Feature table property: POLYLINE_COUNTS must be defined when POLYLINES_LENGTH is greater than 0");let B=P.getPropertyArray("POLYLINE_WIDTHS",Q.UNSIGNED_SHORT,1);if(!l(B)){B=new Uint16Array(Z);for(let ee=0;ee0){let N=new Uint16Array(t,n,G*3);n+=f,e._points=new sP({positions:N,batchIds:w.points,minimumHeight:b,maximumHeight:R,rectangle:A,batchTable:v})}}function xJ(e){let t=e.featuresLength;if(!l(e._features)&&t>0){let n=new Array(t);l(e._polygons)&&e._polygons.createFeatures(e,n),l(e._polylines)&&e._polylines.createFeatures(e,n),l(e._points)&&e._points.createFeatures(e,n),e._features=n}}th.prototype.hasProperty=function(e,t){return this._batchTable.hasProperty(e,t)};th.prototype.getFeature=function(e){return l(this._features)||xJ(this),this._features[e]};th.prototype.applyDebugSettings=function(e,t){l(this._polygons)&&this._polygons.applyDebugSettings(e,t),l(this._polylines)&&this._polylines.applyDebugSettings(e,t),l(this._points)&&this._points.applyDebugSettings(e,t)};th.prototype.applyStyle=function(e){l(this._features)||xJ(this),l(this._polygons)&&this._polygons.applyStyle(e,this._features),l(this._polylines)&&this._polylines.applyStyle(e,this._features),l(this._points)&&this._points.applyStyle(e,this._features)};th.prototype.update=function(e,t){let n=!0;l(this._polygons)&&(this._polygons.classificationType=this._tileset.classificationType,this._polygons.debugWireframe=this._tileset.debugWireframe,this._polygons.update(t),n=n&&this._polygons.ready),l(this._polylines)&&(this._polylines.update(t),n=n&&this._polylines.ready),l(this._points)&&(this._points.update(t),n=n&&this._points.ready),l(this._batchTable)&&n&&(l(this._features)||xJ(this),this._batchTable.update(e,t),this._ready=!0)};th.prototype.pick=function(e,t,n){};th.prototype.getPolylinePositions=function(e){let t=this._polylines;if(l(t))return t.getPositions(e)};th.prototype.isDestroyed=function(){return!1};th.prototype.destroy=function(){return this._polygons=this._polygons&&this._polygons.destroy(),this._polylines=this._polylines&&this._polylines.destroy(),this._points=this._points&&this._points.destroy(),this._batchTable=this._batchTable&&this._batchTable.destroy(),me(this)};function _je(e,t,n,i,o,r){let s=t.length,a=0;for(let c=0;c=0?i[r]:void 0}var $_=Cje;var A4n=T(S(),1);var X4n=T(S(),1);function R0(e){e=y(e,y.EMPTY_OBJECT);let t=e.tile,n=e.class;this._class=n,this._properties=t.properties,this._extensions=t.extensions,this._extras=t.extras}Object.defineProperties(R0.prototype,{class:{get:function(){return this._class}},extras:{get:function(){return this._extras}},extensions:{get:function(){return this._extensions}}});R0.prototype.hasProperty=function(e){return Mn.hasProperty(e,this._properties,this._class)};R0.prototype.hasPropertyBySemantic=function(e){return Mn.hasPropertyBySemantic(e,this._properties,this._class)};R0.prototype.getPropertyIds=function(e){return Mn.getPropertyIds(this._properties,this._class,e)};R0.prototype.getProperty=function(e){return Mn.getProperty(e,this._properties,this._class)};R0.prototype.setProperty=function(e,t){return Mn.setProperty(e,t,this._properties,this._class)};R0.prototype.getPropertyBySemantic=function(e){return Mn.getPropertyBySemantic(e,this._properties,this._class)};R0.prototype.setPropertyBySemantic=function(e,t){return Mn.setPropertyBySemantic(e,t,this._properties,this._class)};var bP=R0;function TJ(e,t){let n=ri(t,"3DTILES_metadata")?t.extensions["3DTILES_metadata"]:t.metadata;if(!l(n))return;if(!l(e.schema)){TJ._oneTimeWarning("findTileMetadata-missing-root-schema","Could not find a metadata schema for tile metadata. For tilesets that contain external tilesets, make sure the schema is added to the root tileset.json.");return}let i=y(e.schema.classes,y.EMPTY_OBJECT);if(l(n.class)){let o=i[n.class];return new bP({tile:n,class:o})}}TJ._oneTimeWarning=Ft;var gP=TJ;var sjn=T(S(),1);var Y4n=T(S(),1);function Vje(e){let t=new Uint8Array(e),n=Em(t);if(n==="glTF"&&(n="glb"),_s.isBinaryFormat(n))return{contentType:n,binaryPayload:t};let i=Lje(t);if(l(i.root))return{contentType:_s.EXTERNAL_TILESET,jsonPayload:i};if(l(i.asset))return{contentType:_s.GLTF,jsonPayload:i};if(l(i.tileAvailability))return{contentType:_s.IMPLICIT_SUBTREE_JSON,jsonPayload:i};if(l(i.type))return{contentType:_s.GEOJSON,jsonPayload:i};if(l(i.voxelTable))return{contentType:_s.VOXEL_JSON,jsonPayload:i};throw new ue("Invalid tile content.")}function Lje(e){let t;try{t=Zo(e)}catch{throw new ue("Invalid tile content.")}return t}var Vf=Vje;function Mu(e,t,n,i){this._tileset=e,this._tile=t,this._tilesetResource=n,this._contents=[],this._contentsCreated=!1;let o=l(i.contents)?i.contents:i.content;this._innerContentHeaders=o,this._requestsInFlight=0,this._cancelCount=0;let r=this._innerContentHeaders.length;this._arrayFetchPromises=new Array(r),this._requests=new Array(r),this._ready=!1,this._innerContentResources=new Array(r),this._serverKeys=new Array(r);for(let s=0;sEje(e,r,s)),o=await Promise.all(i);return e._contentsCreated=!0,e._contents=o.filter(l),o}async function Eje(e,t,n){if(l(t))try{let i=Vf(t);if(i.contentType===_s.EXTERNAL_TILESET)throw new ue("External tilesets are disallowed inside multiple contents");e._disableSkipLevelOfDetail=e._disableSkipLevelOfDetail||i.contentType===_s.GEOMETRY||i.contentType===_s.VECTOR;let o=e._tileset,r=e._innerContentResources[n],s=e._tile,a,c=j_[i.contentType];l(i.binaryPayload)?a=await Promise.resolve(c(o,s,r,i.binaryPayload.buffer,0)):a=await Promise.resolve(c(o,s,r,i.jsonPayload));let d=e._innerContentHeaders[n];if(s.hasImplicitContentMetadata){let m=s.implicitSubtree,p=s.implicitCoordinates;a.metadata=m.getContentMetadataView(p,n)}else s.hasImplicitContent||(a.metadata=q_(o,d));let u=$_(o,d);return l(u)&&(a.group=new y_({metadata:u})),a}catch(i){lme(e,n,i)}}function lme(e,t,n){let i=e._tileset,o=e._innerContentResources[t].url,r=l(n.message)?n.message:n.toString();i.tileFailed.numberOfListeners>0?i.tileFailed.raiseEvent({url:o,message:r}):(console.log(`A content failed to load: ${o}`),console.log(`Error: ${r}`))}Mu.prototype.cancelRequests=function(){for(let e=0;e0){Nu.longitude=(t.west+t.east)*.5,Nu.latitude=d;let x=n.cartographicToCartesian(Nu,Z1.origin);h.clone(c,Z1.direction);let _=cn.fromPointNormal(e.southwestCornerCartesian,e.westNormal,mme);jn.rayPlane(Z1,_,e.southwestCornerCartesian),u=n.geodeticSurfaceNormal(x,Xk)}else u=n.geodeticSurfaceNormalCartographic(ce.southeast(t),Xk);let m=h.cross(u,a,ume);h.normalize(m,e.southNormal);let p=t.north,g;if(p<0){Nu.longitude=(t.west+t.east)*.5,Nu.latitude=p;let x=n.cartographicToCartesian(Nu,Z1.origin);h.negate(c,Z1.direction);let _=cn.fromPointNormal(e.northeastCornerCartesian,e.eastNormal,mme);jn.rayPlane(Z1,_,e.northeastCornerCartesian),g=n.geodeticSurfaceNormal(x,Xk)}else g=n.geodeticSurfaceNormalCartographic(ce.northwest(t),Xk);let f=h.cross(a,g,ume);h.normalize(f,e.northNormal)}var wje=new h,Fje=new h,Aje=new h(0,-1,0),Mje=new h(0,0,-1),hme=new h;function Nje(e,t){let n=t.camera,i=n.positionWC,o=n.positionCartographic,r=0;if(!ce.contains(e.rectangle,o)){let d=e.southwestCornerCartesian,u=e.northeastCornerCartesian,m=e.westNormal,p=e.southNormal,g=e.eastNormal,f=e.northNormal;t.mode!==oe.SCENE3D&&(d=t.mapProjection.project(ce.southwest(e.rectangle),wje),d.z=d.y,d.y=d.x,d.x=0,u=t.mapProjection.project(ce.northeast(e.rectangle),Fje),u.z=u.y,u.y=u.x,u.x=0,m=Aje,g=h.UNIT_Y,p=Mje,f=h.UNIT_Z);let x=h.subtract(i,d,hme),_=h.dot(x,m),C=h.dot(x,p),V=h.subtract(i,u,hme),L=h.dot(V,g),Z=h.dot(V,f);_>0?r+=_*_:L>0&&(r+=L*L),C>0?r+=C*C:Z>0&&(r+=Z*Z)}let s,a,c;if(t.mode===oe.SCENE3D?(s=o.height,a=e.minimumHeight,c=e.maximumHeight):(s=i.x,a=0,c=0),s>c){let d=s-c;r+=d*d}else if(s0?(n.push(0),i.push(this._planeVertices[0]),o=this._edgeNormals[0]):cn.getPointDistance(this._boundingPlanes[1],t)>0&&(n.push(1),i.push(this._planeVertices[1]),o=this._edgeNormals[1]);let r,s;for(r=0;r<4;r++)s=2+r,cn.getPointDistance(this._boundingPlanes[s],t)>0&&(n.push(s),i.push(this._planeVertices[s]),o=this._edgeNormals[s]);if(n.length===0)return 0;let a,c;if(n.length===1)return c=this._boundingPlanes[n[0]],a=WJ(cn.projectPointOntoPlane(c,t,IJ),i[0],c,o),h.distance(a,t);if(n.length===2){if(n[0]===0){let p=[this._vertices[4*n[0]+(n[1]-2)],this._vertices[4*n[0]+(n[1]-2+1)%4]];return a=pme(t,p[0],p[1]),h.distance(a,t)}let u=Number.MAX_VALUE,m;for(r=0;r<2;r++)c=this._boundingPlanes[n[r]],a=WJ(cn.projectPointOntoPlane(c,t,IJ),i[r],c,this._edgeNormals[n[r]]),m=h.distanceSquared(a,t),m3)return a=WJ(cn.projectPointOntoPlane(this._boundingPlanes[1],t,IJ),this._planeVertices[1],this._boundingPlanes[1],this._edgeNormals[1]),h.distance(a,t);let d=n[1]===2&&n[2]===5?0:1;return n[0]===0?h.distance(t,this._vertices[(n[1]-2+d)%4]):h.distance(t,this._vertices[4+(n[1]-2+d)%4])};var $je=new h,e8e=new h;function pme(e,t,n){let i=h.subtract(n,t,$je),o=h.subtract(e,t,e8e),r=h.dot(i,o);if(r<=0)return t;let s=h.dot(i,i);return r>=s?n:(r=r/s,new h((1-r)*t.x+r*n.x,(1-r)*t.y+r*n.y,(1-r)*t.z+r*n.z))}var t8e=new cn(h.UNIT_X,0);function WJ(e,t,n,i){let o=Number.MAX_VALUE,r,s,a;for(let c=0;c1||ri(n,"3DTILES_multiple_contents"),s=o&&!r?n.contents[0]:n.content;this._contentHeader=s,this.transform=l(n.transform)?M.unpack(n.transform):M.clone(M.IDENTITY);let a=l(i)?i.computedTransform:e.modelMatrix,c=M.multiply(a,this.transform,new M),d=l(i)?i._initialTransform:M.IDENTITY;this._initialTransform=M.multiply(d,this.transform,new M),this.computedTransform=c,this.metadata=gP(e,n),this._verticalExaggeration=1,this._verticalExaggerationRelativeHeight=0,this._boundingVolume=this.createBoundingVolume(n.boundingVolume,c),this._boundingVolume2D=void 0;let u;l(s)&&l(s.boundingVolume)&&(u=this.createBoundingVolume(s.boundingVolume,c)),this._contentBoundingVolume=u,this._contentBoundingVolume2D=void 0;let m;l(n.viewerRequestVolume)&&(m=this.createBoundingVolume(n.viewerRequestVolume,c)),this._viewerRequestVolume=m,this.geometricError=n.geometricError,this._geometricError=n.geometricError,l(this._geometricError)||(this._geometricError=l(i)?i._geometricError:e._geometricError,Qo._deprecationWarning("geometricErrorUndefined","Required property geometricError is undefined for this tile. Using parent's geometric error instead.")),this.updateGeometricErrorScale();let p;l(n.refine)?((n.refine==="replace"||n.refine==="add")&&Qo._deprecationWarning("lowercase-refine",`This tile uses a lowercase refine "${n.refine}". Instead use "${n.refine.toUpperCase()}".`),p=n.refine.toUpperCase()==="REPLACE"?vo.REPLACE:vo.ADD):l(i)?p=i.refine:p=vo.REPLACE,this.refine=p,this.children=[],this.parent=i;let g,f=!1,x,_,C;if(t=Ee.createIfNeeded(t),r)x=Ao.UNLOADED,_=t.clone();else if(l(s)){let G=s.uri;l(s.url)&&(Qo._deprecationWarning("contentUrl",'This tileset JSON uses the "content.url" property which has been deprecated. Use "content.uri" instead.'),G=s.url),G===""?(Qo._deprecationWarning("contentUriEmpty","content.uri property is an empty string, which creates a circular dependency, making this tileset invalid. Omit the content property instead"),g=new R1(e,this),f=!0,x=Ao.READY):(x=Ao.UNLOADED,_=t.getDerivedResource({url:G}),C=Oa.getServerKey(_.getUrlComponent()))}else g=new R1(e,this),f=!0,x=Ao.READY;this._content=g,this._contentResource=_,this._contentState=x,this._expiredContent=void 0,this._serverKey=C,this.hasEmptyContent=f,this.hasTilesetContent=!1,this.hasImplicitContent=!1,this.hasImplicitContentMetadata=!1,this.hasMultipleContents=r,this.cacheNode=void 0;let V=n.expire,L,Z;l(V)&&(L=V.duration,l(V.date)&&(Z=te.fromIso8601(V.date))),this.expireDuration=L,this.expireDate=Z,this.lastStyleTime=0,this._optimChildrenWithinParent=Au.NOT_COMPUTED,this.clippingPlanesDirty=!1,this.clippingPolygonsDirty=!1,this.priorityDeferred=!1,this.implicitTileset=void 0,this.implicitCoordinates=void 0,this.implicitSubtree=void 0,this._distanceToCamera=0,this._centerZDepth=0,this._screenSpaceError=0,this._screenSpaceErrorProgressiveResolution=0,this._visibilityPlaneMask=0,this._visible=!1,this._inRequestVolume=!1,this._finalResolution=!0,this._depth=0,this._stackLength=0,this._selectionDepth=0,this._updatedVisibilityFrame=0,this._touchedFrame=0,this._visitedFrame=0,this._selectedFrame=0,this._wasSelectedLastFrame=!1,this._requestedFrame=0,this._ancestorWithContent=void 0,this._ancestorWithContentAvailable=void 0,this._refines=!1,this._shouldSelect=!1,this._isClipped=!0,this._isClippedByPolygon=!1,this._clippingPlanesState=0,this._clippingPolygonsState=0,this._debugBoundingVolume=void 0,this._debugContentBoundingVolume=void 0,this._debugViewerRequestVolume=void 0,this._debugColor=Y.fromRandom({alpha:1}),this._debugColorizeTiles=!1,this._priority=0,this._priorityHolder=this,this._priorityProgressiveResolution=!1,this._priorityProgressiveResolutionScreenSpaceErrorLeaf=!1,this._priorityReverseScreenSpaceError=0,this._foveatedFactor=0,this._wasMinPriorityChild=!1,this._loadTimestamp=new te,this._commandsLength=0,this._color=void 0,this._colorDirty=!1,this._request=void 0}Qo._deprecationWarning=Is;Object.defineProperties(Qo.prototype,{tileset:{get:function(){return this._tileset}},content:{get:function(){return this._content}},boundingVolume:{get:function(){return this._boundingVolume}},contentBoundingVolume:{get:function(){return y(this._contentBoundingVolume,this._boundingVolume)}},boundingSphere:{get:function(){return this._boundingVolume.boundingSphere}},isVisible:{get:function(){return this._visible&&this._inRequestVolume}},extras:{get:function(){return this._header.extras}},color:{get:function(){return l(this._color)||(this._color=new Y),Y.clone(this._color)},set:function(e){this._color=Y.clone(e,this._color),this._colorDirty=!0}},hasRenderableContent:{get:function(){return!this.hasEmptyContent&&!this.hasTilesetContent&&!this.hasImplicitContent}},contentAvailable:{get:function(){return this.contentReady&&this.hasRenderableContent||l(this._expiredContent)&&!this.contentFailed}},contentReady:{get:function(){return this._contentState===Ao.READY}},contentUnloaded:{get:function(){return this._contentState===Ao.UNLOADED}},hasUnloadedRenderableContent:{get:function(){return this.hasRenderableContent&&this.contentUnloaded}},contentExpired:{get:function(){return this._contentState===Ao.EXPIRED}},contentFailed:{get:function(){return this._contentState===Ao.FAILED}},commandsLength:{get:function(){return this._commandsLength}}});var Yg=new h;function s8e(e,t){let{tileset:n,boundingSphere:i}=e,{radius:o,center:r}=i,{camera:s}=t,a=h.multiplyByScalar(s.directionWC,e._centerZDepth,Yg),c=h.add(s.positionWC,a,Yg),d=h.subtract(c,r,Yg);if(h.magnitude(d)>o){let Z=h.normalize(d,Yg),G=h.multiplyByScalar(Z,o,Yg),X=h.add(r,G,Yg),v=h.subtract(X,s.positionWC,Yg),P=h.normalize(v,Yg);e._foveatedFactor=1-Math.abs(h.dot(s.directionWC,P))}else e._foveatedFactor=0;let p=e.refine===vo.REPLACE,g=n.isSkippingLevelOfDetail;if(p&&!g||!n.foveatedScreenSpaceError||n.foveatedConeSize===1||e._priorityProgressiveResolution&&p&&g||n._pass===Io.PRELOAD_FLIGHT||n._pass===Io.PRELOAD)return!1;let f=1-Math.cos(s.frustum.fov*.5),x=n.foveatedConeSize*f;if(e._foveatedFactor<=x)return!1;let _=f-x,C=W.clamp((e._foveatedFactor-x)/_,0,1),V=n.foveatedInterpolationCallback(n.foveatedMinimumScreenSpaceErrorRelaxation,n.memoryAdjustedScreenSpaceError,C),L=e._screenSpaceError===0&&l(e.parent)?e.parent._screenSpaceError*.5:e._screenSpaceError;return n.memoryAdjustedScreenSpaceError-V<=L}var _me=new te;Qo.prototype.getScreenSpaceError=function(e,t,n){let i=this._tileset,o=y(n,1),r=l(this.parent)?this.parent.geometricError:i._scaledGeometricError,s=t?r:this.geometricError;if(s===0)return 0;let{camera:a,context:c}=e,d=a.frustum,u=c.drawingBufferWidth,m=c.drawingBufferHeight*o,p;if(e.mode===oe.SCENE2D||d instanceof on){let g=d.offCenterFrustum;l(g)&&(d=g);let f=Math.max(d.top-d.bottom,d.right-d.left)/Math.max(u,m);p=s/f}else{let g=Math.max(this._distanceToCamera,W.EPSILON7),f=d.sseDenominator;if(p=s*m/(g*f),i.dynamicScreenSpaceError){let x=i._dynamicScreenSpaceErrorComputedDensity,_=i.dynamicScreenSpaceErrorFactor,C=W.fog(g,x)*_;p-=C}}return p/=e.pixelRatio,p};function a8e(e,t){if(e.progressiveResolutionHeightFraction<=0||e.progressiveResolutionHeightFraction>.5)return!1;let n=e.memoryAdjustedScreenSpaceError,i=t._screenSpaceErrorProgressiveResolution>n;t._priorityProgressiveResolutionScreenSpaceErrorLeaf=!1;let o=t.parent,r=t._screenSpaceErrorProgressiveResolution<=n,s=l(o)&&o._screenSpaceErrorProgressiveResolution>n;return r&&s&&(t._priorityProgressiveResolutionScreenSpaceErrorLeaf=!0,i=!0),i}function c8e(e,t){let n=t.parent,o=l(n)&&(!e.isSkippingLevelOfDetail||t._screenSpaceError===0||n.hasTilesetContent||n.hasImplicitContent)?n._screenSpaceError:t._screenSpaceError;return e.root._screenSpaceError-o}Qo.prototype.updateVisibility=function(e){let{parent:t,tileset:n}=this;if(this._updatedVisibilityFrame===n._updatedVisibilityFrame)return;let i=l(t)?t.computedTransform:n.modelMatrix,o=l(t)?t._visibilityPlaneMask:rs.MASK_INDETERMINATE;this.updateTransform(i,e),this._distanceToCamera=this.distanceToTile(e),this._centerZDepth=this.distanceToTileCenter(e),this._screenSpaceError=this.getScreenSpaceError(e,!1),this._screenSpaceErrorProgressiveResolution=this.getScreenSpaceError(e,!1,n.progressiveResolutionHeightFraction),this._visibilityPlaneMask=this.visibility(e,o),this._visible=this._visibilityPlaneMask!==rs.MASK_OUTSIDE,this._inRequestVolume=this.insideViewerRequestVolume(e),this._priorityReverseScreenSpaceError=c8e(n,this),this._priorityProgressiveResolution=a8e(n,this),this.priorityDeferred=s8e(this,e),this._updatedVisibilityFrame=n._updatedVisibilityFrame};Qo.prototype.updateExpiration=function(){if(l(this.expireDate)&&this.contentReady&&!this.hasEmptyContent&&!this.hasMultipleContents){let e=te.now(_me);te.lessThan(this.expireDate,e)&&(this._contentState=Ao.EXPIRED,this._expiredContent=this._content)}};function l8e(e){if(!l(e.expireDuration))return;let t=te.now(_me);te.addSeconds(t,e.expireDuration,t),l(e.expireDate)?te.lessThan(e.expireDate,t)&&te.clone(t,e.expireDate):e.expireDate=te.clone(t)}function d8e(e){return function(){return e._priority}}Qo.prototype.requestContent=function(){if(!this.hasEmptyContent)return this.hasMultipleContents?u8e(this):h8e(this)};function u8e(e){let t=e._content,n=e._tileset;if(!l(t)){let o=ri(e._header,"3DTILES_multiple_contents")?e._header.extensions["3DTILES_multiple_contents"]:e._header;t=new yP(n,e,e._contentResource.clone(),o),e._content=t}let i=t.requestInnerContents();if(l(i))return e._contentState=Ao.LOADING,i.then(o=>{if(!e.isDestroyed()&&l(o))return e._contentState=Ao.PROCESSING,t}).catch(o=>{if(!e.isDestroyed())throw e._contentState=Ao.FAILED,o})}async function m8e(e,t,n,i,o){let r=e._contentState;e._contentState=Ao.LOADING,++t.statistics.numberOfPendingRequests;let s;try{s=await o}catch(a){if(--t.statistics.numberOfPendingRequests,e.isDestroyed())return;if(n.cancelled||n.state===Qn.CANCELLED){e._contentState=r,++t.statistics.numberOfAttemptedRequests;return}throw e._contentState=Ao.FAILED,a}if(e.isDestroyed()){--t.statistics.numberOfPendingRequests;return}if(n.cancelled||n.state===Qn.CANCELLED){e._contentState=r,--t.statistics.numberOfPendingRequests,++t.statistics.numberOfAttemptedRequests;return}try{let a=await f8e(e,s);return--t.statistics.numberOfPendingRequests,e.isDestroyed()?void 0:(i&&(e.expireDate=void 0),e._content=a,e._contentState=Ao.PROCESSING,a)}catch(a){if(--t.statistics.numberOfPendingRequests,e.isDestroyed())return;throw e._contentState=Ao.FAILED,a}}function h8e(e){let t=e._contentResource.clone(),n=e.contentExpired;n&&t.setQueryParameters({expired:e.expireDate.toString()});let i=new Yo({throttle:!0,throttleByServer:!0,type:ns.TILES3D,priorityFunction:d8e(e),serverKey:e._serverKey});e._request=i,t.request=i;let o=e._tileset,r=t.fetchArrayBuffer();if(!l(r)){++o.statistics.numberOfAttemptedRequests;return}return m8e(e,o,i,n,r)}async function f8e(e,t){let n=Vf(t),i=e._tileset;i._disableSkipLevelOfDetail=i._disableSkipLevelOfDetail||n.contentType===_s.GEOMETRY||n.contentType===_s.VECTOR,(n.contentType===_s.IMPLICIT_SUBTREE||n.contentType===_s.IMPLICIT_SUBTREE_JSON)&&(e.hasImplicitContent=!0),n.contentType===_s.EXTERNAL_TILESET&&(e.hasTilesetContent=!0);let o,r=j_[n.contentType];if(e.isDestroyed())return;l(n.binaryPayload)?o=await Promise.resolve(r(i,e,e._contentResource,n.binaryPayload.buffer,0)):o=await Promise.resolve(r(i,e,e._contentResource,n.jsonPayload));let s=e._contentHeader;if(e.hasImplicitContentMetadata){let c=e.implicitSubtree,d=e.implicitCoordinates;o.metadata=c.getContentMetadataView(d,0)}else e.hasImplicitContent||(o.metadata=q_(i,s));let a=$_(i,s);return l(a)&&(o.group=new y_({metadata:a})),o}Qo.prototype.cancelRequests=function(){this.hasMultipleContents?this._content.cancelRequests():this._request.cancel()};Qo.prototype.unloadContent=function(){this.hasRenderableContent&&(this._content=this._content&&this._content.destroy(),this._contentState=Ao.UNLOADED,this.lastStyleTime=0,this.clippingPlanesDirty=this._clippingPlanesState===0,this._clippingPlanesState=0,this.clippingPolygonsDirty=this._clippingPolygonsState===0,this._clippingPolygonsState=0,this._debugColorizeTiles=!1,this._debugBoundingVolume=this._debugBoundingVolume&&this._debugBoundingVolume.destroy(),this._debugContentBoundingVolume=this._debugContentBoundingVolume&&this._debugContentBoundingVolume.destroy(),this._debugViewerRequestVolume=this._debugViewerRequestVolume&&this._debugViewerRequestVolume.destroy())};var Tme=new le;function wJ(e,t){if(t.mode!==oe.SCENE3D&&!l(e._boundingVolume2D)){let n=e._boundingVolume.boundingSphere,i=le.projectTo2D(n,t.mapProjection,Tme);e._boundingVolume2D=new Z0(i.center,i.radius)}return t.mode!==oe.SCENE3D?e._boundingVolume2D:e._boundingVolume}function p8e(e,t){if(t.mode!==oe.SCENE3D&&!l(e._contentBoundingVolume2D)){let n=e._contentBoundingVolume.boundingSphere,i=le.projectTo2D(n,t.mapProjection,Tme);e._contentBoundingVolume2D=new Z0(i.center,i.radius)}return t.mode!==oe.SCENE3D?e._contentBoundingVolume2D:e._contentBoundingVolume}Qo.prototype.visibility=function(e,t){let n=e.cullingVolume,i=wJ(this,e),o=this._tileset,r=o.clippingPlanes;if(l(r)&&r.enabled){let a=r.computeIntersectionWithBoundingVolume(i,o.clippingPlanesOriginMatrix);if(this._isClipped=a!==Kt.INSIDE,a===Kt.OUTSIDE)return rs.MASK_OUTSIDE}let s=o.clippingPolygons;if(l(s)&&s.enabled){let a=s.computeIntersectionWithBoundingVolume(i);this._isClippedByPolygon=a!==Kt.OUTSIDE}return n.computeVisibilityWithPlaneMask(i,t)};Qo.prototype.contentVisibility=function(e){if(!l(this._contentBoundingVolume))return Kt.INSIDE;if(this._visibilityPlaneMask===rs.MASK_INSIDE)return Kt.INSIDE;let t=e.cullingVolume,n=p8e(this,e),i=this._tileset,o=i.clippingPlanes;if(l(o)&&o.enabled){let s=o.computeIntersectionWithBoundingVolume(n,i.clippingPlanesOriginMatrix);if(this._isClipped=s!==Kt.INSIDE,s===Kt.OUTSIDE)return Kt.OUTSIDE}let r=i.clippingPolygons;if(l(r)&&r.enabled){let s=r.computeIntersectionWithBoundingVolume(n);if(this._isClippedByPolygon=s!==Kt.OUTSIDE,s===Kt.INSIDE)return Kt.OUTSIDE}return t.computeVisibility(n)};Qo.prototype.distanceToTile=function(e){return wJ(this,e).distanceToCamera(e)};var b8e=new h;Qo.prototype.distanceToTileCenter=function(e){let n=wJ(this,e).boundingVolume,i=h.subtract(n.center,e.camera.positionWC,b8e);return h.dot(e.camera.directionWC,i)};Qo.prototype.insideViewerRequestVolume=function(e){let t=this._viewerRequestVolume;return!l(t)||t.distanceToCamera(e)===0};var Sme=new $,Cme=new h,g8e=new $,FJ=new h,Vme=new ce,Lme=new Gn,vJ=new M;function y8e(e,t,n){let i=h.fromElements(e[0],e[1],e[2],FJ),o=$.fromArray(e,3,g8e);i=M.multiplyByPoint(t,i,i);let r=M.getMatrix3(t,Sme);return o=$.multiply(r,o,o),l(n)?(n.update(i,o),n):new Gd(i,o)}function x8e(e,t,n,i){let o=ce.unpack(e,0,Vme),r=e[4],s=e[5],a=Gn.fromRectangle(o,r,s,ie.WGS84,Lme),c=a.center,d=a.halfAxes;t=M.multiplyTransformation(t,M.inverseTransformation(n,vJ),vJ),c=M.multiplyByPoint(t,c,c);let u=M.getMatrix3(t,Sme);return d=$.multiply(u,d,d),l(i)&&i instanceof Gd?(i.update(c,d),i):new Gd(c,d)}function _8e(e,t,n,i){if(!M.equalsEpsilon(t,n,W.EPSILON8))return x8e(e,t,n,i);let o=ce.unpack(e,0,Vme);return l(i)?(i.rectangle=ce.clone(o,i.rectangle),i.minimumHeight=e[4],i.maximumHeight=e[5],i.computeBoundingVolumes(ie.WGS84),i):new ku({rectangle:o,minimumHeight:e[4],maximumHeight:e[5]})}function T8e(e,t,n){let i=h.fromElements(e[0],e[1],e[2],FJ),o=e[3];i=M.multiplyByPoint(t,i,i);let r=M.getScale(t,Cme),s=h.maximumComponent(r);return o*=s,l(n)?(n.update(i,o),n):new Z0(i,o)}Qo.prototype.createBoundingVolume=function(e,t,n){let i=this.metadata,o;if(l(i)&&(o=v_.parseBoundingVolumeSemantic("TILE",i)),l(o)&&(e=o),!l(e))throw new ue("boundingVolume must be defined");if(ri(e,"3DTILES_bounding_volume_S2"))return new _P(e.extensions["3DTILES_bounding_volume_S2"]);let{box:r,region:s,sphere:a}=e;if(l(r)){let c=y8e(r,t,n);return this._verticalExaggeration!==1&&gme(c,this._verticalExaggeration,this._verticalExaggerationRelativeHeight),c}if(l(s)){let c=_8e(s,t,this._initialTransform,n);return this._verticalExaggeration===1||(c instanceof Gd?gme(c,this._verticalExaggeration,this._verticalExaggerationRelativeHeight):(c.minimumHeight=mr.getHeight(c.minimumHeight,this._verticalExaggeration,this._verticalExaggerationRelativeHeight),c.maximumHeight=mr.getHeight(c.maximumHeight,this._verticalExaggeration,this._verticalExaggerationRelativeHeight),c.computeBoundingVolumes(ie.WGS84))),c}if(l(a)){let c=T8e(a,t,n);if(this._verticalExaggeration!==1){let d=mr.getPosition(c.center,ie.WGS84,this._verticalExaggeration,this._verticalExaggerationRelativeHeight,FJ),u=c.radius*this._verticalExaggeration;c.update(d,u)}return c}throw new ue("boundingVolume must contain a sphere, region, or box")};var S8e=h.unpackArray(new Array(8*3).fill(0));function gme(e,t,n){let i=e.boundingVolume.computeCorners(S8e).map(r=>mr.getPosition(r,ie.WGS84,t,n,r)),o=Gn.fromPoints(i,Lme);e.update(o.center,o.halfAxes)}Qo.prototype.updateTransform=function(e,t){e=y(e,M.IDENTITY);let n=M.multiplyTransformation(e,this.transform,vJ),i=!M.equals(n,this.computedTransform),o=l(t)&&(this._verticalExaggeration!==t.verticalExaggeration||this._verticalExaggerationRelativeHeight!==t.verticalExaggerationRelativeHeight);if(!i&&!o)return;i&&M.clone(n,this.computedTransform),o&&(this._verticalExaggeration=t.verticalExaggeration,this._verticalExaggerationRelativeHeight=t.verticalExaggerationRelativeHeight);let r=this._header,s=this._contentHeader;this._boundingVolume=this.createBoundingVolume(r.boundingVolume,this.computedTransform,this._boundingVolume),l(this._contentBoundingVolume)&&(this._contentBoundingVolume=this.createBoundingVolume(s.boundingVolume,this.computedTransform,this._contentBoundingVolume)),l(this._viewerRequestVolume)&&(this._viewerRequestVolume=this.createBoundingVolume(r.viewerRequestVolume,this.computedTransform,this._viewerRequestVolume)),this.updateGeometricErrorScale(),this._debugBoundingVolume=this._debugBoundingVolume&&this._debugBoundingVolume.destroy(),this._debugContentBoundingVolume=this._debugContentBoundingVolume&&this._debugContentBoundingVolume.destroy(),this._debugViewerRequestVolume=this._debugViewerRequestVolume&&this._debugViewerRequestVolume.destroy()};Qo.prototype.updateGeometricErrorScale=function(){let e=M.getScale(this.computedTransform,Cme),t=h.maximumComponent(e);if(this.geometricError=this._geometricError*t,!l(this.parent)){let n=this._tileset;n._scaledGeometricError=n._geometricError*t}};function C8e(e,t,n,i){if(!i.isRender)return;let o=l(e._contentHeader)&&l(e._contentHeader.boundingVolume),r=t.debugShowBoundingVolume||t.debugShowContentBoundingVolume&&!o;if(r){let c;e._finalResolution?e.hasRenderableContent?c=Y.WHITE:c=Y.DARKGRAY:c=Y.YELLOW,l(e._debugBoundingVolume)||(e._debugBoundingVolume=e._boundingVolume.createDebugVolume(c)),e._debugBoundingVolume.update(n);let d=e._debugBoundingVolume.getGeometryInstanceAttributes("outline");d.color=Ht.toValue(c,d.color)}else!r&&l(e._debugBoundingVolume)&&(e._debugBoundingVolume=e._debugBoundingVolume.destroy());t.debugShowContentBoundingVolume&&o?(l(e._debugContentBoundingVolume)||(e._debugContentBoundingVolume=e._contentBoundingVolume.createDebugVolume(Y.BLUE)),e._debugContentBoundingVolume.update(n)):!t.debugShowContentBoundingVolume&&l(e._debugContentBoundingVolume)&&(e._debugContentBoundingVolume=e._debugContentBoundingVolume.destroy()),t.debugShowViewerRequestVolume&&l(e._viewerRequestVolume)?(l(e._debugViewerRequestVolume)||(e._debugViewerRequestVolume=e._viewerRequestVolume.createDebugVolume(Y.YELLOW)),e._debugViewerRequestVolume.update(n)):!t.debugShowViewerRequestVolume&&l(e._debugViewerRequestVolume)&&(e._debugViewerRequestVolume=e._debugViewerRequestVolume.destroy());let s=t.debugColorizeTiles&&!e._debugColorizeTiles||l(t._heatmap.tilePropertyName),a=!t.debugColorizeTiles&&e._debugColorizeTiles;s?(t._heatmap.colorize(e,n),e._debugColorizeTiles=!0,e.color=e._debugColor):a&&(e._debugColorizeTiles=!1,e.color=Y.WHITE),e._colorDirty&&(e._colorDirty=!1,e._content.applyDebugSettings(!0,e._color)),a&&t.makeStyleDirty()}function V8e(e,t,n){let i=e._expiredContent;if(!e.hasMultipleContents&&l(i)){if(!e.contentReady){try{i.update(t,n)}catch{}return}e._expiredContent.destroy(),e._expiredContent=void 0}if(l(e.content))try{e.content.update(t,n)}catch(o){throw e._contentState=Ao.FAILED,o}}function L8e(e,t){let n=t.clippingPlanes,i=0;l(n)&&e._isClipped&&n.enabled&&(i=n.clippingPlanesState),i!==e._clippingPlanesState&&(e._clippingPlanesState=i,e.clippingPlanesDirty=!0)}function R8e(e,t){let n=t.clippingPolygons,i=0;l(n)&&e._isClippedByPolygon&&n.enabled&&(i=n.clippingPolygonsState),i!==e._clippingPolygonsState&&(e._clippingPolygonsState=i,e.clippingPolygonsDirty=!0)}Qo.prototype.update=function(e,t,n){let{commandList:i}=t,o=i.length;L8e(this,e),R8e(this,e),C8e(this,e,t,n),V8e(this,e,t);let r=i.length;this._commandsLength=r-o;for(let s=o;se.cacheBytes||n);){let s=r.item;r=r.next,this.unloadTile(e,s,t)}};rT.prototype.trim=function(){this._trimTiles=!0};var CP=rT;var k7n=T(S(),1);function Pk(e){this.tilePropertyName=e,this._minimum=Number.MAX_VALUE,this._maximum=-Number.MAX_VALUE,this._previousMinimum=Number.MAX_VALUE,this._previousMaximum=-Number.MAX_VALUE,this._referenceMinimum={},this._referenceMaximum={}}function MJ(e,t){let n;return t==="_loadTimestamp"?n=te.toDate(e).getTime():n=e,n}Pk.prototype.setReferenceMinimumMaximum=function(e,t,n){this._referenceMinimum[n]=MJ(e,n),this._referenceMaximum[n]=MJ(t,n)};function G8e(e,t){let n=e.tilePropertyName;if(l(n)){let i=MJ(t[n],n);return l(i)?(e._maximum=Math.max(i,e._maximum),e._minimum=Math.min(i,e._minimum),i):(e.tilePropertyName=void 0,i)}}var AJ=[new Y(.1,.1,.1,1),new Y(.153,.278,.878,1),new Y(.827,.231,.49,1),new Y(.827,.188,.22,1),new Y(1,.592,.259,1),new Y(1,.843,0,1)];Pk.prototype.colorize=function(e,t){let n=this.tilePropertyName;if(!l(n)||!e.contentAvailable||e._selectedFrame!==t.frameNumber)return;let i=G8e(this,e),o=this._previousMinimum,r=this._previousMaximum;if(o===Number.MAX_VALUE||r===-Number.MAX_VALUE)return;let s=r-o+W.EPSILON7,c=W.clamp(i-o,0,s)/s,d=AJ.length-1,u=c*d,m=Math.floor(u),p=Math.ceil(u),g=u-m,f=AJ[m],x=AJ[p],_=Y.clone(Y.WHITE);_.red=W.lerp(f.red,x.red,g),_.green=W.lerp(f.green,x.green,g),_.blue=W.lerp(f.blue,x.blue,g),e._debugColor=_};Pk.prototype.resetMinimumMaximum=function(){let e=this.tilePropertyName;if(l(e)){let t=this._referenceMinimum[e],n=this._referenceMaximum[e],i=l(t)&&l(n);this._previousMinimum=i?t:this._minimum,this._previousMaximum=i?n:this._maximum,this._minimum=Number.MAX_VALUE,this._maximum=-Number.MAX_VALUE}};var VP=Pk;var B7n=T(S(),1);function P1(){this.selected=0,this.visited=0,this.numberOfCommands=0,this.numberOfAttemptedRequests=0,this.numberOfPendingRequests=0,this.numberOfTilesProcessing=0,this.numberOfTilesWithContentReady=0,this.numberOfTilesTotal=0,this.numberOfLoadedTilesTotal=0,this.numberOfFeaturesSelected=0,this.numberOfFeaturesLoaded=0,this.numberOfPointsSelected=0,this.numberOfPointsLoaded=0,this.numberOfTrianglesSelected=0,this.numberOfTilesStyled=0,this.numberOfFeaturesStyled=0,this.numberOfTilesCulledWithChildrenUnion=0,this.geometryByteLength=0,this.texturesByteLength=0,this.batchTableByteLength=0}P1.prototype.clear=function(){this.selected=0,this.visited=0,this.numberOfCommands=0,this.numberOfAttemptedRequests=0,this.numberOfFeaturesSelected=0,this.numberOfPointsSelected=0,this.numberOfTrianglesSelected=0,this.numberOfTilesStyled=0,this.numberOfFeaturesStyled=0,this.numberOfTilesCulledWithChildrenUnion=0};function vk(e,t,n,i){let o=t.innerContents,r=t.pointsLength,s=t.trianglesLength,a=t.featuresLength,c=t.geometryByteLength,d=t.texturesByteLength,u=t.batchTableByteLength;if(i?(e.numberOfFeaturesLoaded+=n?-a:a,e.numberOfPointsLoaded+=n?-r:r,e.geometryByteLength+=n?-c:c,e.texturesByteLength+=n?-d:d,e.batchTableByteLength+=n?-u:u):(e.numberOfFeaturesSelected+=n?-a:a,e.numberOfPointsSelected+=n?-r:r,e.numberOfTrianglesSelected+=n?-s:s),l(o)){let m=o.length;for(let p=0;p>t,i=e.y>>t,o=this.x===n,r=this.y===i;if(this.subdivisionScheme===Hr.OCTREE){let s=e.z>>t,a=this.z===s;return o&&r&&a}return o&&r};Mo.prototype.isEqual=function(e){return this.subdivisionScheme===e.subdivisionScheme&&this.subtreeLevels===e.subtreeLevels&&this.level===e.level&&this.x===e.x&&this.y===e.y&&(this.subdivisionScheme===Hr.OCTREE?this.z===e.z:!0)};Mo.prototype.isImplicitTilesetRoot=function(){return this.level===0};Mo.prototype.isSubtreeRoot=function(){return this.level%this.subtreeLevels===0};Mo.prototype.isBottomOfSubtree=function(){return this.level%this.subtreeLevels===this.subtreeLevels-1};Mo.prototype.getTemplateValues=function(){let e={level:this.level,x:this.x,y:this.y};return this.subdivisionScheme===Hr.OCTREE&&(e.z=this.z),e};var Gme=[0,0,0];Mo.fromMortonIndex=function(e,t,n,i){let o;return e===Hr.OCTREE?(o=Qb.decode3D(i,Gme),new Mo({subdivisionScheme:e,subtreeLevels:t,level:n,x:o[0],y:o[1],z:o[2]})):(o=Qb.decode2D(i,Gme),new Mo({subdivisionScheme:e,subtreeLevels:t,level:n,x:o[0],y:o[1]}))};Mo.fromTileIndex=function(e,t,n){let i,o,r;return e===Hr.OCTREE?(i=Math.floor(W.log2(7*n+1)/3),o=((1<<3*i)-1)/7,r=n-o):(i=Math.floor(W.log2(3*n+1)/2),o=((1<<2*i)-1)/3,r=n-o),Mo.fromMortonIndex(e,t,i,r)};var aT=Mo;var y6n=T(S(),1);var m6n=T(S(),1);function I0(){}I0.selectTiles=function(e,t){fe.throwInstantiationError()};I0.sortChildrenByDistanceToCamera=function(e,t){return t._distanceToCamera===0&&e._distanceToCamera===0?t._centerZDepth-e._centerZDepth:t._distanceToCamera-e._distanceToCamera};I0.canTraverse=function(e){return e.children.length===0?!1:e.hasTilesetContent||e.hasImplicitContent?!e.contentExpired:e._screenSpaceError>e.tileset.memoryAdjustedScreenSpaceError};I0.selectTile=function(e,t){if(e.contentVisibility(t)===Kt.OUTSIDE)return;e._wasSelectedLastFrame=!0;let{content:n,tileset:i}=e;n.featurePropertiesDirty?(n.featurePropertiesDirty=!1,e.lastStyleTime=0,i._selectedTilesToStyle.push(e)):e._selectedFrame0;if((e.hasTilesetContent||e.hasImplicitContent)&&n){let r=e.children[0];Eme(r,t),e._visible=r._visible;return}if(P8e(e,t)){e._visible=!1;return}let i=e.refine===vo.REPLACE,o=e._optimChildrenWithinParent===Au.USE_OPTIMIZATION;if(i&&o&&n&&!v8e(e,t)){++e.tileset._statistics.numberOfTilesCulledWithChildrenUnion,e._visible=!1;return}}function P8e(e,t){let{parent:n,tileset:i}=e;return!l(n)||n.hasTilesetContent||n.hasImplicitContent||n.refine!==vo.ADD?!1:e.getScreenSpaceError(t,!0)<=i.memoryAdjustedScreenSpaceError}function v8e(e,t){let n=!1,i=e.children;for(let o=0;o0;){ZP.stackMaximumLength=Math.max(ZP.stackMaximumLength,s.length);let a=s.pop(),c=a.refine===vo.ADD,d=a.refine===vo.REPLACE,u=F8e(a);u&&A8e(a,s,t),(c||d&&!u)&&(M8e(e,a),o(a,t),N8e(a,t),a.hasRenderableContent&&!a.contentAvailable&&(n=!1)),r(a,t)}return ZP.stack.trim(ZP.stackMaximumLength),n};function F8e(e){return e.children.length===0?!1:e.hasTilesetContent||e.hasImplicitContent?!e.contentExpired:(e.hasEmptyContent,!0)}function A8e(e,t,n){let{children:i}=e;for(let o=0;o0;){EP.stackMaximumLength=Math.max(EP.stackMaximumLength,a.length);let c=a.pop(),d=c.parent,u=!l(d)||d._refines;c._refines=i(c)?k8e(c,a,t)&&u:!1;let m=!c._refines&&u;c.hasRenderableContent?c.refine===vo.ADD?(NJ(c,t),o(c,t)):c.refine===vo.REPLACE&&(o(c,t),m&&NJ(c,t)):(n._emptyTiles.push(c),o(c,t),m&&NJ(c,t)),r(c,t),s(c,t)}}function D8e(e,t){let{canTraverse:n,updateTile:i,loadTile:o,touchTile:r}=ks,s=!0,a=XP.stack;for(a.push(e);a.length>0;){XP.stackMaximumLength=Math.max(XP.stackMaximumLength,a.length);let c=a.pop(),d=c.children,u=d.length,m=!c.hasRenderableContent&&n(c);if(!m&&!c.contentAvailable&&(s=!1),i(c,t),c.isVisible||(o(c,t),r(c,t)),m)for(let p=0;p0;){PP.stackMaximumLength=Math.max(PP.stackMaximumLength,r.length);let a=r.pop().children;for(let c=0;cn._depth+e.skipLevels)}function z8e(e,t,n){let{tileset:i,children:o}=e,{updateTile:r,loadTile:s,touchTile:a}=ks;for(let d=0;dt:e._screenSpaceError>t:!0}function J8e(e,t){let{tileset:n}=e,i=n.immediatelyLoadDesiredLevelOfDetail?Number.MAX_VALUE:Math.max(n.baseScreenSpaceError,n.memoryAdjustedScreenSpaceError),{canTraverse:o,loadTile:r,visitTile:s,touchTile:a}=ks,c=WP.stack;for(c.push(e);c.length>0;){WP.stackMaximumLength=Math.max(WP.stackMaximumLength,c.length);let d=c.pop();O8e(d,t);let u=d.parent,m=!l(u)||u._refines;d._refines=o(d)?z8e(d,c,t)&&m:!1;let p=!d._refines&&m;d.hasRenderableContent?d.refine===vo.ADD?(wk(d,t),r(d,t)):d.refine===vo.REPLACE&&(K8e(d,i)?(r(d,t),p&&wk(d,t)):p?(wk(d,t),r(d,t)):H8e(n,d)&&r(d,t)):(n._emptyTiles.push(d),r(d,t),p&&wk(d,t)),s(d,t),a(d,t)}}function Q8e(e,t){let{selectTile:n,canTraverse:i}=ks,{stack:o,ancestorStack:r}=W0,s;for(o.push(e);o.length>0||r.length>0;){if(W0.stackMaximumLength=Math.max(W0.stackMaximumLength,o.length),W0.ancestorStackMaximumLength=Math.max(W0.ancestorStackMaximumLength,r.length),r.length>0){let d=r.peek();if(d._stackLength===o.length){r.pop(),d!==s&&(d._finalResolution=!1),n(d,t);continue}}let a=o.pop();if(!l(a))continue;let c=i(a);if(a._shouldSelect)if(a.refine===vo.ADD)n(a,t);else{if(a._selectionDepth=r.length,a._selectionDepth>0&&(a.tileset.hasMixedContent=!0),s=a,!c){n(a,t);continue}r.push(a),a._stackLength=o.length}if(c){let d=a.children;for(let u=0;uci._defaultMinTerrainHeight&&(s._initialClippingPlanesOriginMatrix=Gt.eastNorthUpToFixedFrame(p)),s._clippingPlanesOriginMatrix=M.clone(s._initialClippingPlanesOriginMatrix),s};jo.loadJson=function(e){return Ee.createIfNeeded(e).fetchJson()};jo.prototype.makeStyleDirty=function(){this._styleEngine.makeDirty()};jo.prototype.loadTileset=function(e,t,n){let i=t.asset;if(!l(i))throw new ue("Tileset must have an asset property.");if(i.version!=="0.0"&&i.version!=="1.0"&&i.version!=="1.1")throw new ue("The tileset must be 3D Tiles version 0.0, 1.0, or 1.1");l(t.extensionsRequired)&&jo.checkSupportedExtensions(t.extensionsRequired);let o=this._statistics,r=i.tilesetVersion;l(r)&&(this._basePath+=`?v=${r}`,e=e.clone(),e.setQueryParameters({v:r}));let s=Pme(this,e,t.root,n);l(n)&&(n.children.push(s),s._depth=n._depth+1);let a=[];for(a.push(s);a.length>0;){let c=a.pop();++o.numberOfTilesTotal,this._allTilesAdditive=this._allTilesAdditive&&c.refine===vo.ADD;let d=c._header.children;if(l(d))for(let u=0;u_.minimumRadius){let L=he.fromCartesian(V,_,q8e);n=h.normalize(a.positionWC,vme),i=a.directionWC,o=a.positionCartographic.height,r=0,s=L.height*2}else{let L=M.multiplyByPoint(x,a.positionWC,t7e);if(n=h.UNIT_Z,i=M.multiplyByPointAsVector(x,a.directionWC,n7e),i=h.normalize(i,i),o=L.z,d instanceof Gd){let Z=$.getColumn(C.halfAxes,2,i7e),G=h.magnitude(Z);r=V.z-G,s=V.z+G}else if(d instanceof Z0){let Z=C.radius;r=V.z-Z,s=V.z+Z}}}let u=e.dynamicScreenSpaceErrorHeightFalloff,m=r+(s-r)*u,p=s,g=W.clamp((o-m)/(p-m),0,1),f=1-Math.abs(h.dot(i,n));f=f*(1-g),e._dynamicScreenSpaceErrorComputedDensity=e.dynamicScreenSpaceErrorDensity*f}function r7e(e,t){if(t.hasEmptyContent)return;let{statistics:n}=e,i=t.contentExpired,o=t.requestContent();l(o)&&(o.then(r=>{!l(r)||t.isDestroyed()||e.isDestroyed()||(e._processingQueue.push(t),++n.numberOfTilesProcessing)}).catch(r=>{Ame(r,e,t)}),i&&(t.hasTilesetContent||t.hasImplicitContent?x7e(e,t):(n.decrementLoadCounts(t.content),--n.numberOfTilesWithContentReady)),e._requestedTilesInFlight.push(t))}function Fme(e,t){return e._priority-t._priority}jo.prototype.postPassesUpdate=function(e){l(this._root)&&(s7e(this,e),T7e(this,e),this._cache.unloadTiles(this,Nme),this._styleApplied&&this._styleEngine.resetDirty(),this._styleApplied=!1)};jo.prototype.prePassesUpdate=function(e){if(!l(this._root))return;h7e(this,e);let t=this._clippingPlanes;this._clippingPlanesOriginMatrixDirty=!0,l(t)&&t.enabled&&t.update(e);let n=this._clippingPolygons;l(n)&&n.enabled&&n.update(e),l(this._loadTimestamp)||(this._loadTimestamp=te.clone(e.time)),this._timeSinceLoad=Math.max(te.secondsDifference(e.time,this._loadTimestamp)*1e3,0),this.dynamicScreenSpaceError&&o7e(this,e),e.newFrame&&this._cache.reset()};function s7e(e,t){let n=e._requestedTilesInFlight,i=0;for(let o=0;o=1;if(r._contentState!==Ao.LOADING){++i;continue}else if(s){r.cancelRequests(),++i;continue}i>0&&(n[o-i]=r)}n.length-=i}function a7e(e){let t=e._requestedTiles;t.sort(Fme);for(let n=0;n0?t.tileFailed.raiseEvent({url:i,message:o}):(console.log(`A 3D tile failed to load: ${i}`),console.log(`Error: ${o}`))}function c7e(e){let t=e._processingQueue,n=0;for(let i=0;i0&&(t[i-n]=o)}t.length-=n}var l7e=new he,d7e=new he,u7e=new h;function m7e(e,t,n){if(!e.enableCollision||!e.show)return;let i=e._addHeightCallbacks,o=t.boundingSphere;for(let r of i){if(r.invoked||t._wasSelectedLastFrame)continue;let s=r.ellipsoid,a=he.clone(r.positionCartographic,l7e),c=he.fromCartesian(o.center,s,d7e);l(c)&&(a.height=c.height);let d=he.toCartesian(a,s,u7e);h.distance(d,o.center)<=o.radius&&n.afterRender.push(()=>{l(r.callback)&&r.callback(a),r.invoked=!1})}}function h7e(e,t){c7e(e);let n=e._processingQueue,{cacheBytes:i,maximumCacheOverflowBytes:o,statistics:r}=e,s=i+o,a=!1;for(let c=0;cs){a=!0;break}let d=n[c];try{d.process(e,t),d.contentReady&&(--r.numberOfTilesProcessing,e.tileLoad.raiseEvent(d))}catch(u){--r.numberOfTilesProcessing,Ame(u,e,d)}}e.totalMemoryUsageInBytes0&&f7e(e)}function f7e(e){e._memoryAdjustedScreenSpaceError*=1.02;let t=e._processingQueue;for(let n=0;n0&&(i+=` Points: ${e.content.pointsLength}`,o++),e.content.trianglesLength>0&&(i+=` Triangles: ${e.content.trianglesLength}`,o++),i+=` Features: ${e.content.featuresLength}`,o++),t.debugShowMemoryUsage&&(i+=` Texture Memory: ${wme(e.content.texturesByteLength)}`,i+=` Geometry Memory: ${wme(e.content.geometryByteLength)}`,o+=2),t.debugShowUrl)if(e.hasMultipleContents){i+=` Urls:`;let s=e.content.innerContentUrls;for(let a=0;a0;e._backfaceCommands.length=0,a&&(l(e._stencilClearCommand)||(e._stencilClearCommand=new oi({stencil:0,pass:Re.CESIUM_3D_TILE,renderState:De.fromCache({stencilMask:Nt.SKIP_LOD_MASK})})),i.push(e._stencilClearCommand));let{statistics:c,tileVisible:d}=e,u=n.isRender,m=i.length;for(let f=0;f=0;--_)i[m+x+_]=i[m+_];for(let _=0;_0&&e._pointCloudEyeDomeLighting.update(t,r,e.pointCloudShading,e.boundingSphere),e.debugShowGeometricError||e.debugShowRenderingStatistics||e.debugShowMemoryUsage||e.debugShowUrl?(l(e._tileDebugLabels)||(e._tileDebugLabels=new Tf),g7e(e,t)):e._tileDebugLabels=e._tileDebugLabels&&e._tileDebugLabels.destroy())}var Mme=[];function x7e(e,t){let n=t,i=Mme;for(i.push(t);i.length>0;){t=i.pop();let o=t.children;for(let r=0;r{t.push(Ct.clone(i))});let n=e.asset.extras;if(l(n)&&l(n.cesium)&&l(n.cesium.credits)){let i=n.cesium.credits;for(let o=0;oi.showOnScreen=i.showOnScreen||e._showCreditsOnScreen),e._credits=t}jo.prototype.getTraversal=function(e){let{pass:t}=e;return t===Io.MOST_DETAILED_PRELOAD||t===Io.MOST_DETAILED_PICK?GP:this.isSkippingLevelOfDetail?vP:IP};jo.prototype.update=function(e){this.updateForPass(e,e.tilesetPassState)};jo.prototype.updateForPass=function(e,t){let n=t.pass;if(n===Io.PRELOAD&&(!this.preloadWhenHidden||this.show)||n===Io.PRELOAD_FLIGHT&&(!this.preloadFlightDestinations||!this.show&&!this.preloadWhenHidden)||n===Io.REQUEST_RENDER_MODE_DEFER_CHECK&&(!this._cullRequestsWhileMoving&&this.foveatedTimeDelay<=0||!this.show))return;let i=e.commandList,o=e.camera,r=e.cullingVolume;t.ready=!1;let s=Io.getPassOptions(n),a=s.ignoreCommands,c=y(t.commandList,i),d=c.length;e.commandList=c,e.camera=y(t.camera,o),e.cullingVolume=y(t.cullingVolume,r);let u=this._clippingPolygons;l(u)&&u.enabled&&u.queueCommands(e);let m=this._statisticsPerPass[n];(this.show||a)&&(this._pass=n,t.ready=V7e(this,e,m,s)),a&&(c.length=d),e.commandList=i,e.camera=o,e.cullingVolume=r};jo.prototype.hasExtension=function(e){return l(this._extensionsUsed)?this._extensionsUsed.indexOf(e)>-1:!1};jo.prototype.isDestroyed=function(){return!1};jo.prototype.destroy=function(){if(this._tileDebugLabels=this._tileDebugLabels&&this._tileDebugLabels.destroy(),this._clippingPlanes=this._clippingPlanes&&this._clippingPlanes.destroy(),this._clippingPolygons=this._clippingPolygons&&this._clippingPolygons.destroy(),l(this._root)){let e=Mme;for(e.push(this._root);e.length>0;){let t=e.pop();t.destroy();let n=t.children;for(let i=0;i{let r=this._addHeightCallbacks,s=r.length;for(let a=0;a{let u=le.distanceSquaredTo(c.contentBoundingVolume.boundingSphere,e.origin),m=le.distanceSquaredTo(d.contentBoundingVolume.boundingSphere,e.origin);return u-m});let a;for(let c=0;c-1;i--)DJ(this,e[i],t,n);return me(this)};Og.prototype.getBoundingSphere=function(e,t){let n=this._tilesetHash[e.id];if(!l(n)||n.loadFail)return mt.FAILED;let i=n.tilesetPrimitive;return l(i)?i.show?(le.clone(i.boundingSphere,t),mt.DONE):mt.FAILED:mt.PENDING};Og.prototype._onCollectionChanged=function(e,t,n,i){let o,r,s=this._entitiesToVisualize,a=this._tilesetHash,c=this._primitives;for(o=t.length-1;o>-1;o--)r=t[o],l(r._tileset)&&s.set(r.id,r);for(o=i.length-1;o>-1;o--)r=i[o],l(r._tileset)?s.set(r.id,r):(DJ(this,r,a,c),s.remove(r.id));for(o=n.length-1;o>-1;o--)r=n[o],DJ(this,r,a,c),s.remove(r.id)};function DJ(e,t,n,i){let o=n[t.id];l(o)&&(l(o.tilesetPrimitive)&&i.removeAndDestroy(o.tilesetPrimitive),delete n[t.id])}async function I7e(e,t,n,i){t[n.id]={url:e.url,loadFail:!1};try{let o=await sa.fromUrl(e);if(o.id=n,i.add(o),!l(t[n.id]))return;t[n.id].tilesetPrimitive=o}catch(o){console.error(o),t[n.id].loadFail=!0}}var wP=Og;var s$n=T(S(),1);var W7e=Y.WHITE,P7e=Y.BLACK,v7e=new D(2,2);function v1(e){e=y(e,y.EMPTY_OBJECT),this._definitionChanged=new ge,this._evenColor=void 0,this._evenColorSubscription=void 0,this._oddColor=void 0,this._oddColorSubscription=void 0,this._repeat=void 0,this._repeatSubscription=void 0,this.evenColor=e.evenColor,this.oddColor=e.oddColor,this.repeat=e.repeat}Object.defineProperties(v1.prototype,{isConstant:{get:function(){return K.isConstant(this._evenColor)&&K.isConstant(this._oddColor)&&K.isConstant(this._repeat)}},definitionChanged:{get:function(){return this._definitionChanged}},evenColor:de("evenColor"),oddColor:de("oddColor"),repeat:de("repeat")});v1.prototype.getType=function(e){return"Checkerboard"};v1.prototype.getValue=function(e,t){return l(t)||(t={}),t.lightColor=K.getValueOrClonedDefault(this._evenColor,e,W7e,t.lightColor),t.darkColor=K.getValueOrClonedDefault(this._oddColor,e,P7e,t.darkColor),t.repeat=K.getValueOrDefault(this._repeat,e,v7e),t};v1.prototype.equals=function(e){return this===e||e instanceof v1&&K.equals(this._evenColor,e._evenColor)&&K.equals(this._oddColor,e._oddColor)&&K.equals(this._repeat,e._repeat)};var w1=v1;var V$n=T(S(),1);var g$n=T(S(),1);var Ume={id:void 0};function FP(e){if(e._firing){e._refire=!0;return}if(e._suspendCount===0){let t=e._addedEntities,n=e._removedEntities,i=e._changedEntities;if(i.length!==0||t.length!==0||n.length!==0){e._firing=!0;do{e._refire=!1;let o=t.values.slice(0),r=n.values.slice(0),s=i.values.slice(0);t.removeAll(),n.removeAll(),i.removeAll(),e._collectionChanged.raiseEvent(e,o,r,s)}while(e._refire);e._firing=!1}}}function bc(e){this._owner=e,this._entities=new Vt,this._addedEntities=new Vt,this._removedEntities=new Vt,this._changedEntities=new Vt,this._suspendCount=0,this._collectionChanged=new ge,this._id=Yn(),this._show=!0,this._firing=!1,this._refire=!1}bc.prototype.suspendEvents=function(){this._suspendCount++};bc.prototype.resumeEvents=function(){this._suspendCount--,FP(this)};Object.defineProperties(bc.prototype,{collectionChanged:{get:function(){return this._collectionChanged}},id:{get:function(){return this._id}},values:{get:function(){return this._entities.values}},show:{get:function(){return this._show},set:function(e){if(e===this._show)return;this.suspendEvents();let t,n=[],i=this._entities.values,o=i.length;for(t=0;t-1;c--)s=a[c],Bme(e,p,g,s);for(r=n-1;r>=0;r--)for(d=t[r],d.collectionChanged.addEventListener(Pr.prototype._onCollectionChanged,e),a=d.values,g=d.id,c=a.length-1;c>-1;c--){s=a[c],Dme(e,p,g,s);let x=m.getById(s.id);l(x)||(x=u.getById(s.id),l(x)?BJ(x):(Ak.id=s.id,x=new Jo(Ak)),m.add(x)),x.merge(s)}e._collectionsCopy=t.slice(0),u.suspendEvents(),u.removeAll();let f=m.values;for(r=0;r=0;a--)c=i[a].getById(x),l(c)&&(l(d)||(d=r.getById(x),BJ(d)),d.merge(c));l(d)||r.removeById(x),d=void 0}let g=t.length;for(s=0;s=0;a--)c=i[a].getById(x),l(c)&&(l(d)||(d=r.getById(x),l(d)?BJ(d):(Ak.id=x,d=new Jo(Ak),r.add(d))),d.merge(c));d=void 0}r.resumeEvents()};Pr.prototype._onDefinitionChanged=function(e,t,n,i){let o=this._collections,r=this._composite,s=o.length,a=e.id,c=r.getById(a),d=c[t],u=!l(d),m=!0;for(let p=s-1;p>=0;p--){let g=o[p].getById(e.id);if(l(g)){let f=g[t];if(l(f)){if(m)if(m=!1,l(f.merge)&&l(f.clone))d=f.clone(d);else{d=f;break}d.merge(f)}}}u&&c.propertyNames.indexOf(t)===-1&&c.addProperty(t),c[t]=d};var YJ=Pr;var A$n=T(S(),1);var I$n=T(S(),1);function w7e(e,t,n,i){function o(){n.raiseEvent(e)}let r=[];t.removeAll();let s=i.length;for(let a=0;a= 0.995) // matches 254/255 and 255/255 { discard; } #endif #endif out_FragColor = czm_gammaCorrect(color); czm_writeLogDepth(); } `;var Kei=T(S(),1),MP=`uniform float u_maxTotalPointSize; in vec4 positionHighAndSize; in vec4 positionLowAndOutline; in vec4 compressedAttribute0; // color, outlineColor, pick color in vec4 compressedAttribute1; // show, translucency by distance, some free space in vec4 scaleByDistance; // near, nearScale, far, farScale in vec3 distanceDisplayConditionAndDisableDepth; // near, far, disableDepthTestDistance out vec4 v_color; out vec4 v_outlineColor; out float v_innerPercent; out float v_pixelDistance; out vec4 v_pickColor; const float SHIFT_LEFT8 = 256.0; const float SHIFT_RIGHT8 = 1.0 / 256.0; void main() { // Modifying this shader may also require modifications to PointPrimitive._computeScreenSpacePosition // unpack attributes vec3 positionHigh = positionHighAndSize.xyz; vec3 positionLow = positionLowAndOutline.xyz; float outlineWidthBothSides = 2.0 * positionLowAndOutline.w; float totalSize = positionHighAndSize.w + outlineWidthBothSides; float outlinePercent = outlineWidthBothSides / totalSize; // Scale in response to browser-zoom. totalSize *= czm_pixelRatio; float temp = compressedAttribute1.x * SHIFT_RIGHT8; float show = floor(temp); #ifdef EYE_DISTANCE_TRANSLUCENCY vec4 translucencyByDistance; translucencyByDistance.x = compressedAttribute1.z; translucencyByDistance.z = compressedAttribute1.w; translucencyByDistance.y = ((temp - floor(temp)) * SHIFT_LEFT8) / 255.0; temp = compressedAttribute1.y * SHIFT_RIGHT8; translucencyByDistance.w = ((temp - floor(temp)) * SHIFT_LEFT8) / 255.0; #endif /////////////////////////////////////////////////////////////////////////// vec4 color; vec4 outlineColor; vec4 pickColor; // compressedAttribute0.z => pickColor.rgb temp = compressedAttribute0.z * SHIFT_RIGHT8; pickColor.b = (temp - floor(temp)) * SHIFT_LEFT8; temp = floor(temp) * SHIFT_RIGHT8; pickColor.g = (temp - floor(temp)) * SHIFT_LEFT8; pickColor.r = floor(temp); // compressedAttribute0.x => color.rgb temp = compressedAttribute0.x * SHIFT_RIGHT8; color.b = (temp - floor(temp)) * SHIFT_LEFT8; temp = floor(temp) * SHIFT_RIGHT8; color.g = (temp - floor(temp)) * SHIFT_LEFT8; color.r = floor(temp); // compressedAttribute0.y => outlineColor.rgb temp = compressedAttribute0.y * SHIFT_RIGHT8; outlineColor.b = (temp - floor(temp)) * SHIFT_LEFT8; temp = floor(temp) * SHIFT_RIGHT8; outlineColor.g = (temp - floor(temp)) * SHIFT_LEFT8; outlineColor.r = floor(temp); // compressedAttribute0.w => color.a, outlineColor.a, pickColor.a temp = compressedAttribute0.w * SHIFT_RIGHT8; pickColor.a = (temp - floor(temp)) * SHIFT_LEFT8; pickColor = pickColor / 255.0; temp = floor(temp) * SHIFT_RIGHT8; outlineColor.a = (temp - floor(temp)) * SHIFT_LEFT8; outlineColor /= 255.0; color.a = floor(temp); color /= 255.0; /////////////////////////////////////////////////////////////////////////// vec4 p = czm_translateRelativeToEye(positionHigh, positionLow); vec4 positionEC = czm_modelViewRelativeToEye * p; /////////////////////////////////////////////////////////////////////////// #if defined(EYE_DISTANCE_SCALING) || defined(EYE_DISTANCE_TRANSLUCENCY) || defined(DISTANCE_DISPLAY_CONDITION) || defined(DISABLE_DEPTH_DISTANCE) float lengthSq; if (czm_sceneMode == czm_sceneMode2D) { // 2D camera distance is a special case // treat all billboards as flattened to the z=0.0 plane lengthSq = czm_eyeHeight2D.y; } else { lengthSq = dot(positionEC.xyz, positionEC.xyz); } #endif #ifdef EYE_DISTANCE_SCALING totalSize *= czm_nearFarScalar(scaleByDistance, lengthSq); #endif if (totalSize > 0.0) { // Add padding for anti-aliasing on both sides. totalSize += 3.0; } // Clamp to max point size. totalSize = min(totalSize, u_maxTotalPointSize); // If size is too small, push vertex behind near plane for clipping. // Note that context.minimumAliasedPointSize "will be at most 1.0". if (totalSize < 1.0) { positionEC.xyz = vec3(0.0); totalSize = 1.0; } float translucency = 1.0; #ifdef EYE_DISTANCE_TRANSLUCENCY translucency = czm_nearFarScalar(translucencyByDistance, lengthSq); // push vertex behind near plane for clipping if (translucency < 0.004) { positionEC.xyz = vec3(0.0); } #endif #ifdef DISTANCE_DISPLAY_CONDITION float nearSq = distanceDisplayConditionAndDisableDepth.x; float farSq = distanceDisplayConditionAndDisableDepth.y; if (lengthSq < nearSq || lengthSq > farSq) { // push vertex behind camera to force it to be clipped positionEC.xyz = vec3(0.0, 0.0, 1.0); } #endif gl_Position = czm_projection * positionEC; czm_vertexLogDepth(); #ifdef DISABLE_DEPTH_DISTANCE float disableDepthTestDistance = distanceDisplayConditionAndDisableDepth.z; if (disableDepthTestDistance == 0.0 && czm_minimumDisableDepthTestDistance != 0.0) { disableDepthTestDistance = czm_minimumDisableDepthTestDistance; } if (disableDepthTestDistance != 0.0) { // Don't try to "multiply both sides" by w. Greater/less-than comparisons won't work for negative values of w. float zclip = gl_Position.z / gl_Position.w; bool clipped = (zclip < -1.0 || zclip > 1.0); if (!clipped && (disableDepthTestDistance < 0.0 || (lengthSq > 0.0 && lengthSq < disableDepthTestDistance))) { // Position z on the near plane. gl_Position.z = -gl_Position.w; #ifdef LOG_DEPTH czm_vertexLogDepth(vec4(czm_currentFrustum.x)); #endif } } #endif v_color = color; v_color.a *= translucency * show; v_outlineColor = outlineColor; v_outlineColor.a *= translucency * show; v_innerPercent = 1.0 - outlinePercent; v_pixelDistance = 2.0 / totalSize; gl_PointSize = totalSize * show; gl_Position *= show; v_pickColor = pickColor; } `;var H7e=Ds.SHOW_INDEX,zJ=Ds.POSITION_INDEX,$me=Ds.COLOR_INDEX,z7e=Ds.OUTLINE_COLOR_INDEX,K7e=Ds.OUTLINE_WIDTH_INDEX,J7e=Ds.PIXEL_SIZE_INDEX,ehe=Ds.SCALE_BY_DISTANCE_INDEX,the=Ds.TRANSLUCENCY_BY_DISTANCE_INDEX,nhe=Ds.DISTANCE_DISPLAY_CONDITION_INDEX,Q7e=Ds.DISABLE_DEPTH_DISTANCE_INDEX,KJ=Ds.NUMBER_OF_PROPERTIES,yc={positionHighAndSize:0,positionLowAndOutline:1,compressedAttribute0:2,compressedAttribute1:3,scaleByDistance:4,distanceDisplayConditionAndDisableDepth:5};function Bu(e){e=y(e,y.EMPTY_OBJECT),this._sp=void 0,this._spTranslucent=void 0,this._rsOpaque=void 0,this._rsTranslucent=void 0,this._vaf=void 0,this._pointPrimitives=[],this._pointPrimitivesToUpdate=[],this._pointPrimitivesToUpdateIndex=0,this._pointPrimitivesRemoved=!1,this._createVertexArray=!1,this._shaderScaleByDistance=!1,this._compiledShaderScaleByDistance=!1,this._shaderTranslucencyByDistance=!1,this._compiledShaderTranslucencyByDistance=!1,this._shaderDistanceDisplayCondition=!1,this._compiledShaderDistanceDisplayCondition=!1,this._shaderDisableDepthDistance=!1,this._compiledShaderDisableDepthDistance=!1,this._propertiesChanged=new Uint32Array(KJ),this._maxPixelSize=1,this._baseVolume=new le,this._baseVolumeWC=new le,this._baseVolume2D=new le,this._boundingVolume=new le,this._boundingVolumeDirty=!1,this._colorCommands=[],this.show=y(e.show,!0),this.modelMatrix=M.clone(y(e.modelMatrix,M.IDENTITY)),this._modelMatrix=M.clone(M.IDENTITY),this.debugShowBoundingVolume=y(e.debugShowBoundingVolume,!1),this.blendOption=y(e.blendOption,So.OPAQUE_AND_TRANSLUCENT),this._blendOption=void 0,this._mode=oe.SCENE3D,this._maxTotalPointSize=1,this._buffersUsage=[Ne.STATIC_DRAW,Ne.STATIC_DRAW,Ne.STATIC_DRAW,Ne.STATIC_DRAW,Ne.STATIC_DRAW,Ne.STATIC_DRAW,Ne.STATIC_DRAW,Ne.STATIC_DRAW,Ne.STATIC_DRAW];let t=this;this._uniforms={u_maxTotalPointSize:function(){return t._maxTotalPointSize}}}Object.defineProperties(Bu.prototype,{length:{get:function(){return JJ(this),this._pointPrimitives.length}}});function ihe(e){let t=e.length;for(let n=0;n0&&(e._shaderDisableDepthDistance=!0,d===Number.POSITIVE_INFINITY&&(d=-1)),r(o,s,a,d)}function q7e(e,t,n,i){ohe(e,t,n,i),rhe(e,t,n,i),she(e,t,n,i),ahe(e,t,n,i),che(e,t,n,i)}function HJ(e,t,n,i,o,r){let s;i.mode===oe.SCENE3D?(s=e._baseVolume,e._boundingVolumeDirty=!0):s=e._baseVolume2D;let a=[];for(let c=0;c0){this._vaf=j7e(c,n,this._buffersUsage),a=this._vaf.writers;for(let G=0;G0){let G=t6e;G.length=0,(r[zJ]||r[K7e]||r[J7e])&&G.push(ohe),(r[$me]||r[z7e])&&G.push(rhe),(r[H7e]||r[the])&&G.push(she),r[ehe]&&G.push(ahe),(r[nhe]||r[Q7e])&&G.push(che);let X=G.length;if(a=this._vaf.writers,o/n>.1){for(let v=0;vn*1.5&&(i.length=n),!l(this._vaf)||!l(this._vaf.va))return;this._boundingVolumeDirty&&(this._boundingVolumeDirty=!1,le.transform(this._baseVolume,this.modelMatrix,this._baseVolumeWC));let m,p=M.IDENTITY;e.mode===oe.SCENE3D?(p=this.modelMatrix,m=le.clone(this._baseVolumeWC,this._boundingVolume)):m=le.clone(this._baseVolume2D,this._boundingVolume),e6e(this,e,m);let g=this._blendOption!==this.blendOption;this._blendOption=this.blendOption,g&&(this._blendOption===So.OPAQUE||this._blendOption===So.OPAQUE_AND_TRANSLUCENT?this._rsOpaque=De.fromCache({depthTest:{enabled:!0,func:ne.LEQUAL},depthMask:!0}):this._rsOpaque=void 0,this._blendOption===So.TRANSLUCENT||this._blendOption===So.OPAQUE_AND_TRANSLUCENT?this._rsTranslucent=De.fromCache({depthTest:{enabled:!0,func:ne.LEQUAL},depthMask:!1,blending:un.ALPHA_BLEND}):this._rsTranslucent=void 0),this._shaderDisableDepthDistance=this._shaderDisableDepthDistance||e.minimumDisableDepthTestDistance!==0;let f,x;(g||this._shaderScaleByDistance&&!this._compiledShaderScaleByDistance||this._shaderTranslucencyByDistance&&!this._compiledShaderTranslucencyByDistance||this._shaderDistanceDisplayCondition&&!this._compiledShaderDistanceDisplayCondition||this._shaderDisableDepthDistance!==this._compiledShaderDisableDepthDistance)&&(f=new Ye({sources:[MP]}),this._shaderScaleByDistance&&f.defines.push("EYE_DISTANCE_SCALING"),this._shaderTranslucencyByDistance&&f.defines.push("EYE_DISTANCE_TRANSLUCENCY"),this._shaderDistanceDisplayCondition&&f.defines.push("DISTANCE_DISPLAY_CONDITION"),this._shaderDisableDepthDistance&&f.defines.push("DISABLE_DEPTH_DISTANCE"),this._blendOption===So.OPAQUE_AND_TRANSLUCENT&&(x=new Ye({defines:["OPAQUE"],sources:[Jg]}),this._sp=$t.replaceCache({context:c,shaderProgram:this._sp,vertexShaderSource:f,fragmentShaderSource:x,attributeLocations:yc}),x=new Ye({defines:["TRANSLUCENT"],sources:[Jg]}),this._spTranslucent=$t.replaceCache({context:c,shaderProgram:this._spTranslucent,vertexShaderSource:f,fragmentShaderSource:x,attributeLocations:yc})),this._blendOption===So.OPAQUE&&(x=new Ye({sources:[Jg]}),this._sp=$t.replaceCache({context:c,shaderProgram:this._sp,vertexShaderSource:f,fragmentShaderSource:x,attributeLocations:yc})),this._blendOption===So.TRANSLUCENT&&(x=new Ye({sources:[Jg]}),this._spTranslucent=$t.replaceCache({context:c,shaderProgram:this._spTranslucent,vertexShaderSource:f,fragmentShaderSource:x,attributeLocations:yc})),this._compiledShaderScaleByDistance=this._shaderScaleByDistance,this._compiledShaderTranslucencyByDistance=this._shaderTranslucencyByDistance,this._compiledShaderDistanceDisplayCondition=this._shaderDistanceDisplayCondition,this._compiledShaderDisableDepthDistance=this._shaderDisableDepthDistance);let _,C,V,L,Z=e.commandList;if(d.render||u){let G=this._colorCommands,X=this._blendOption===So.OPAQUE,v=this._blendOption===So.OPAQUE_AND_TRANSLUCENT;_=this._vaf.va,C=_.length,G.length=C;let P=v?C*2:C;for(L=0;L>4;if(o!==QJ)throw new Error(`Got v${o} data when expected v${QJ}.`);let r=lhe[i&15];if(!r)throw new Error("Unrecognized array type.");let[s]=new Uint16Array(t,2,1),[a]=new Uint32Array(t,4,1);return new e(a,s,r,t)}constructor(t,n=64,i=Float64Array,o){if(isNaN(t)||t<0)throw new Error(`Unpexpected numItems value: ${t}.`);this.numItems=+t,this.nodeSize=Math.min(Math.max(+n,2),65535),this.ArrayType=i,this.IndexArrayType=t<65536?Uint16Array:Uint32Array;let r=lhe.indexOf(this.ArrayType),s=t*2*this.ArrayType.BYTES_PER_ELEMENT,a=t*this.IndexArrayType.BYTES_PER_ELEMENT,c=(8-a%8)%8;if(r<0)throw new Error(`Unexpected typed array class: ${i}.`);o&&o instanceof ArrayBuffer?(this.data=o,this.ids=new this.IndexArrayType(this.data,kP,t),this.coords=new this.ArrayType(this.data,kP+a+c,t*2),this._pos=t*2,this._finished=!0):(this.data=new ArrayBuffer(kP+s+a+c),this.ids=new this.IndexArrayType(this.data,kP,t),this.coords=new this.ArrayType(this.data,kP+a+c,t*2),this._pos=0,this._finished=!1,new Uint8Array(this.data,0,2).set([219,(QJ<<4)+r]),new Uint16Array(this.data,2,1)[0]=n,new Uint32Array(this.data,4,1)[0]=t)}add(t,n){let i=this._pos>>1;return this.ids[i]=i,this.coords[this._pos++]=t,this.coords[this._pos++]=n,i}finish(){let t=this._pos>>1;if(t!==this.numItems)throw new Error(`Added ${t} items when expected ${this.numItems}.`);return qJ(this.ids,this.coords,this.nodeSize,0,this.numItems-1,0),this._finished=!0,this}range(t,n,i,o){if(!this._finished)throw new Error("Data not yet indexed - call index.finish().");let{ids:r,coords:s,nodeSize:a}=this,c=[0,r.length-1,0],d=[];for(;c.length;){let u=c.pop()||0,m=c.pop()||0,p=c.pop()||0;if(m-p<=a){for(let _=p;_<=m;_++){let C=s[2*_],V=s[2*_+1];C>=t&&C<=i&&V>=n&&V<=o&&d.push(r[_])}continue}let g=p+m>>1,f=s[2*g],x=s[2*g+1];f>=t&&f<=i&&x>=n&&x<=o&&d.push(r[g]),(u===0?t<=f:n<=x)&&(c.push(p),c.push(g-1),c.push(1-u)),(u===0?i>=f:o>=x)&&(c.push(g+1),c.push(m),c.push(1-u))}return d}within(t,n,i){if(!this._finished)throw new Error("Data not yet indexed - call index.finish().");let{ids:o,coords:r,nodeSize:s}=this,a=[0,o.length-1,0],c=[],d=i*i;for(;a.length;){let u=a.pop()||0,m=a.pop()||0,p=a.pop()||0;if(m-p<=s){for(let _=p;_<=m;_++)dhe(r[2*_],r[2*_+1],t,n)<=d&&c.push(o[_]);continue}let g=p+m>>1,f=r[2*g],x=r[2*g+1];dhe(f,x,t,n)<=d&&c.push(o[g]),(u===0?t-i<=f:n-i<=x)&&(a.push(p),a.push(g-1),a.push(1-u)),(u===0?t+i>=f:n+i>=x)&&(a.push(g+1),a.push(m),a.push(1-u))}return c}};function qJ(e,t,n,i,o,r){if(o-i<=n)return;let s=i+o>>1;uhe(e,t,s,i,o,r),qJ(e,t,n,i,s-1,1-r),qJ(e,t,n,s+1,o,1-r)}function uhe(e,t,n,i,o,r){for(;o>i;){if(o-i>600){let d=o-i+1,u=n-i+1,m=Math.log(d),p=.5*Math.exp(2*m/3),g=.5*Math.sqrt(m*p*(d-p)/d)*(u-d/2<0?-1:1),f=Math.max(i,Math.floor(n-u*p/d+g)),x=Math.min(o,Math.floor(n+(d-u)*p/d+g));uhe(e,t,n,f,x,r)}let s=t[2*n+r],a=i,c=o;for(UP(e,t,i,n),t[2*o+r]>s&&UP(e,t,i,o);as;)c--}t[2*i+r]===s?UP(e,t,i,c):(c++,UP(e,t,c,o)),c<=n&&(i=c+1),n<=c&&(o=c-1)}}function UP(e,t,n,i){jJ(e,n,i),jJ(t,2*n,2*i),jJ(t,2*n+1,2*i+1)}function jJ(e,t,n){let i=e[t];e[t]=e[n],e[n]=i}function dhe(e,t,n,i){let o=e-n,r=t-i;return o*o+r*r}function oh(e){e=y(e,y.EMPTY_OBJECT),this._enabled=y(e.enabled,!1),this._pixelRange=y(e.pixelRange,80),this._minimumClusterSize=y(e.minimumClusterSize,2),this._clusterBillboards=y(e.clusterBillboards,!0),this._clusterLabels=y(e.clusterLabels,!0),this._clusterPoints=y(e.clusterPoints,!0),this._labelCollection=void 0,this._billboardCollection=void 0,this._pointCollection=void 0,this._clusterBillboardCollection=void 0,this._clusterLabelCollection=void 0,this._clusterPointCollection=void 0,this._collectionIndicesByEntity={},this._unusedLabelIndices=[],this._unusedBillboardIndices=[],this._unusedPointIndices=[],this._previousClusters=[],this._previousHeight=void 0,this._enabledDirty=!1,this._clusterDirty=!1,this._cluster=void 0,this._removeEventListener=void 0,this._clusterEvent=new ge,this.show=y(e.show,!0)}function mhe(e,t){e.x-=t,e.y-=t,e.width+=t*2,e.height+=t*2}var n6e=new He;function hhe(e,t,n,i,o){if(l(e._labelCollection)&&i._clusterLabels?o=kg.getScreenSpaceBoundingBox(e,t,o):l(e._billboardCollection)&&i._clusterBillboards?o=mo.getScreenSpaceBoundingBox(e,t,o):l(e._pointPrimitiveCollection)&&i._clusterPoints&&(o=Ds.getScreenSpaceBoundingBox(e,t,o)),mhe(o,n),i._clusterLabels&&!l(e._labelCollection)&&l(e.id)&&phe(i,e.id.id)&&l(e.id._label)){let r=i._collectionIndicesByEntity[e.id.id].labelIndex,s=i._labelCollection.get(r),a=kg.getScreenSpaceBoundingBox(s,t,n6e);mhe(a,n),o=He.union(o,a,o)}return o}function i6e(e,t){if(e.clusterShow=!0,!l(e._labelCollection)&&l(e.id)&&phe(t,e.id.id)&&l(e.id._label)){let n=t._collectionIndicesByEntity[e.id.id].labelIndex,i=t._labelCollection.get(n);i.clusterShow=!0}}function fhe(e,t,n,i){let o={billboard:i._clusterBillboardCollection.add(),label:i._clusterLabelCollection.add(),point:i._clusterPointCollection.add()};o.billboard.show=!1,o.point.show=!1,o.label.show=!0,o.label.text=t.toLocaleString(),o.label.id=n,o.billboard.position=o.label.position=o.point.position=e,i._clusterEvent.raiseEvent(n,o)}function phe(e,t){return l(e)&&l(e._collectionIndicesByEntity[t])&&l(e._collectionIndicesByEntity[t].labelIndex)}function $J(e,t,n,i,o){if(!l(e))return;let r=e.length;for(let s=0;s0){let w=new DP(V.length,64,Uint32Array);for(let N=0;N=u)for(fhe(N.position,R,b,e),p.push(N),Z=0;Z=u){let k=h.multiplyByScalar(O,1/R,O);for(fhe(k,R,b,e),p.push({position:k,width:U.width,height:U.height,minimumWidth:X.width,minimumHeight:X.height}),Z=0;Z0?(a=d.shift(),c=r.get(a)):(c=r.add(),a=r.length-1),s[i]=a;let u=this;return Promise.resolve().then(function(){u._clusterDirty=!0}),c}}function nQ(e,t){let n=e._collectionIndicesByEntity[t];!l(n.billboardIndex)&&!l(n.labelIndex)&&!l(n.pointIndex)&&delete e._collectionIndicesByEntity[t]}oh.prototype.getLabel=tQ("_labelCollection",Tf,"_unusedLabelIndices","labelIndex");oh.prototype.removeLabel=function(e){let t=this._collectionIndicesByEntity&&this._collectionIndicesByEntity[e.id];if(!l(this._labelCollection)||!l(t)||!l(t.labelIndex))return;let n=t.labelIndex;t.labelIndex=void 0,nQ(this,e.id);let i=this._labelCollection.get(n);i.show=!1,i.text="",i.id=void 0,this._unusedLabelIndices.push(n),this._clusterDirty=!0};oh.prototype.getBillboard=tQ("_billboardCollection",Rd,"_unusedBillboardIndices","billboardIndex");oh.prototype.removeBillboard=function(e){let t=this._collectionIndicesByEntity&&this._collectionIndicesByEntity[e.id];if(!l(this._billboardCollection)||!l(t)||!l(t.billboardIndex))return;let n=t.billboardIndex;t.billboardIndex=void 0,nQ(this,e.id);let i=this._billboardCollection.get(n);i.id=void 0,i.show=!1,i.image=void 0,this._unusedBillboardIndices.push(n),this._clusterDirty=!0};oh.prototype.getPoint=tQ("_pointCollection",N1,"_unusedPointIndices","pointIndex");oh.prototype.removePoint=function(e){let t=this._collectionIndicesByEntity&&this._collectionIndicesByEntity[e.id];if(!l(this._pointCollection)||!l(t)||!l(t.pointIndex))return;let n=t.pointIndex;t.pointIndex=void 0,nQ(this,e.id);let i=this._pointCollection.get(n);i.show=!1,i.id=void 0,this._unusedPointIndices.push(n),this._clusterDirty=!0};function eQ(e){if(!l(e))return;let t=e.length;for(let n=0;n0&&this._labelCollection.get(0)._glyphs.length===0&&(t=e.commandList,e.commandList=[],this._labelCollection.update(e),e.commandList=t),l(this._billboardCollection)&&this._billboardCollection.length>0&&!l(this._billboardCollection.get(0).width)&&(t=e.commandList,e.commandList=[],this._billboardCollection.update(e),e.commandList=t),this._enabledDirty&&(this._enabledDirty=!1,c6e(this),this._clusterDirty=!0),this._clusterDirty&&(this._clusterDirty=!1,this._cluster()),l(this._clusterLabelCollection)&&this._clusterLabelCollection.update(e),l(this._clusterBillboardCollection)&&this._clusterBillboardCollection.update(e),l(this._clusterPointCollection)&&this._clusterPointCollection.update(e),l(this._labelCollection)&&this._labelCollection.update(e),l(this._billboardCollection)&&this._billboardCollection.update(e),l(this._pointCollection)&&this._pointCollection.update(e)};oh.prototype.destroy=function(){this._labelCollection=this._labelCollection&&this._labelCollection.destroy(),this._billboardCollection=this._billboardCollection&&this._billboardCollection.destroy(),this._pointCollection=this._pointCollection&&this._pointCollection.destroy(),this._clusterLabelCollection=this._clusterLabelCollection&&this._clusterLabelCollection.destroy(),this._clusterBillboardCollection=this._clusterBillboardCollection&&this._clusterBillboardCollection.destroy(),this._clusterPointCollection=this._clusterPointCollection&&this._clusterPointCollection.destroy(),l(this._removeEventListener)&&(this._removeEventListener(),this._removeEventListener=void 0),this._labelCollection=void 0,this._billboardCollection=void 0,this._pointCollection=void 0,this._clusterBillboardCollection=void 0,this._clusterLabelCollection=void 0,this._clusterPointCollection=void 0,this._collectionIndicesByEntity=void 0,this._unusedLabelIndices=[],this._unusedBillboardIndices=[],this._unusedPointIndices=[],this._previousClusters=[],this._previousHeight=void 0,this._enabledDirty=!1,this._pixelRangeDirty=!1,this._minimumClusterSizeDirty=!1};var Ed=oh;function iQ(e){this._name=e,this._clock=void 0,this._changed=new ge,this._error=new ge,this._isLoading=!1,this._loading=new ge,this._entityCollection=new Us(this),this._entityCluster=new Ed}Object.defineProperties(iQ.prototype,{name:{get:function(){return this._name},set:function(e){this._name!==e&&(this._name=e,this._changed.raiseEvent(this))}},clock:{get:function(){return this._clock},set:function(e){this._clock!==e&&(this._clock=e,this._changed.raiseEvent(this))}},entities:{get:function(){return this._entityCollection}},isLoading:{get:function(){return this._isLoading},set:function(e){vr.setLoading(this,e)}},changedEvent:{get:function(){return this._changed}},errorEvent:{get:function(){return this._error}},loadingEvent:{get:function(){return this._loading}},show:{get:function(){return this._entityCollection.show},set:function(e){this._entityCollection.show=e}},clustering:{get:function(){return this._entityCluster},set:function(e){this._entityCluster=e}}});iQ.prototype.update=function(e){return!0};var BP=iQ;var pni=T(S(),1);var bhe=h.ZERO,ghe=new h,l6e=new h,yhe=new Y;function d6e(e){this.id=e,this.vertexFormat=void 0,this.length=void 0,this.topRadius=void 0,this.bottomRadius=void 0,this.slices=void 0,this.numberOfVerticalLines=void 0,this.offsetAttribute=void 0}function Xd(e,t){ii.call(this,{entity:e,scene:t,geometryOptions:new d6e(e),geometryPropertyName:"cylinder",observedPropertyNames:["availability","position","orientation","cylinder"]}),this._onEntityPropertyChanged(e,"cylinder",e.cylinder,void 0)}l(Object.create)&&(Xd.prototype=Object.create(ii.prototype),Xd.prototype.constructor=Xd);Object.defineProperties(Xd.prototype,{terrainOffsetProperty:{get:function(){return this._terrainOffsetProperty}}});Xd.prototype.createFillGeometryInstance=function(e){let t=this._entity,n=t.isAvailable(e),i=new xn(n&&t.isShowing&&this._showProperty.getValue(e)&&this._fillProperty.getValue(e)),o=this._distanceDisplayConditionProperty.getValue(e),r=kn.fromDistanceDisplayCondition(o),s={show:i,distanceDisplayCondition:r,color:void 0,offset:void 0};if(this._materialProperty instanceof Ut){let a;l(this._materialProperty.color)&&(this._materialProperty.color.isConstant||n)&&(a=this._materialProperty.color.getValue(e,yhe)),l(a)||(a=Y.WHITE),s.color=Ht.fromColor(a)}return l(this._options.offsetAttribute)&&(s.offset=Hi.fromCartesian3(K.getValueOrDefault(this._terrainOffsetProperty,e,bhe,ghe))),new St({id:t,geometry:new TR(this._options),modelMatrix:t.computeModelMatrixForHeightReference(e,t.cylinder.heightReference,this._options.length*.5,this._scene.mapProjection.ellipsoid),attributes:s})};Xd.prototype.createOutlineGeometryInstance=function(e){let t=this._entity,n=t.isAvailable(e),i=K.getValueOrDefault(this._outlineColorProperty,e,Y.BLACK,yhe),o=this._distanceDisplayConditionProperty.getValue(e),r={show:new xn(n&&t.isShowing&&this._showProperty.getValue(e)&&this._showOutlineProperty.getValue(e)),color:Ht.fromColor(i),distanceDisplayCondition:kn.fromDistanceDisplayCondition(o),offset:void 0};return l(this._options.offsetAttribute)&&(r.offset=Hi.fromCartesian3(K.getValueOrDefault(this._terrainOffsetProperty,e,bhe,ghe))),new St({id:t,geometry:new SR(this._options),modelMatrix:t.computeModelMatrixForHeightReference(e,t.cylinder.heightReference,this._options.length*.5,this._scene.mapProjection.ellipsoid),attributes:r})};Xd.prototype._computeCenter=function(e,t){return K.getValueOrUndefined(this._entity.position,e,t)};Xd.prototype._isHidden=function(e,t){return!l(e.position)||!l(t.length)||!l(t.topRadius)||!l(t.bottomRadius)||ii.prototype._isHidden.call(this,e,t)};Xd.prototype._isDynamic=function(e,t){return!e.position.isConstant||!K.isConstant(e.orientation)||!t.length.isConstant||!t.topRadius.isConstant||!t.bottomRadius.isConstant||!K.isConstant(t.slices)||!K.isConstant(t.outlineWidth)||!K.isConstant(t.numberOfVerticalLines)};Xd.prototype._setStaticOptions=function(e,t){let n=K.getValueOrDefault(t.heightReference,Be.MINIMUM_VALUE,Je.NONE),i=this._options;i.vertexFormat=this._materialProperty instanceof Ut?dn.VERTEX_FORMAT:ro.MaterialSupport.TEXTURED.vertexFormat,i.length=t.length.getValue(Be.MINIMUM_VALUE),i.topRadius=t.topRadius.getValue(Be.MINIMUM_VALUE),i.bottomRadius=t.bottomRadius.getValue(Be.MINIMUM_VALUE),i.slices=K.getValueOrUndefined(t.slices,Be.MINIMUM_VALUE),i.numberOfVerticalLines=K.getValueOrUndefined(t.numberOfVerticalLines,Be.MINIMUM_VALUE),i.offsetAttribute=n!==Je.NONE?ln.ALL:void 0};Xd.prototype._onEntityPropertyChanged=Kp;Xd.DynamicGeometryUpdater=k1;function k1(e,t,n){ni.call(this,e,t,n)}l(Object.create)&&(k1.prototype=Object.create(ni.prototype),k1.prototype.constructor=k1);k1.prototype._isHidden=function(e,t,n){let i=this._options,o=K.getValueOrUndefined(e.position,n,l6e);return!l(o)||!l(i.length)||!l(i.topRadius)||!l(i.bottomRadius)||ni.prototype._isHidden.call(this,e,t,n)};k1.prototype._setOptions=function(e,t,n){let i=K.getValueOrDefault(t.heightReference,n,Je.NONE),o=this._options;o.length=K.getValueOrUndefined(t.length,n),o.topRadius=K.getValueOrUndefined(t.topRadius,n),o.bottomRadius=K.getValueOrUndefined(t.bottomRadius,n),o.slices=K.getValueOrUndefined(t.slices,n),o.numberOfVerticalLines=K.getValueOrUndefined(t.numberOfVerticalLines,n),o.offsetAttribute=i!==Je.NONE?ln.ALL:void 0};var YP=Xd;var Wsi=T(S(),1);var JP=T(id(),1);var Cni=T(S(),1);function lT(){this._definitionChanged=new ge,this._startTime=void 0,this._stopTime=void 0,this._currentTime=void 0,this._clockRange=void 0,this._clockStep=void 0,this._multiplier=void 0}Object.defineProperties(lT.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},startTime:Gl("startTime"),stopTime:Gl("stopTime"),currentTime:Gl("currentTime"),clockRange:Gl("clockRange"),clockStep:Gl("clockStep"),multiplier:Gl("multiplier")});lT.prototype.clone=function(e){return l(e)||(e=new lT),e.startTime=this.startTime,e.stopTime=this.stopTime,e.currentTime=this.currentTime,e.clockRange=this.clockRange,e.clockStep=this.clockStep,e.multiplier=this.multiplier,e};lT.prototype.equals=function(e){return this===e||l(e)&&te.equals(this.startTime,e.startTime)&&te.equals(this.stopTime,e.stopTime)&&te.equals(this.currentTime,e.currentTime)&&this.clockRange===e.clockRange&&this.clockStep===e.clockStep&&this.multiplier===e.multiplier};lT.prototype.merge=function(e){this.startTime=y(this.startTime,e.startTime),this.stopTime=y(this.stopTime,e.stopTime),this.currentTime=y(this.currentTime,e.currentTime),this.clockRange=y(this.clockRange,e.clockRange),this.clockStep=y(this.clockStep,e.clockStep),this.multiplier=y(this.multiplier,e.multiplier)};lT.prototype.getValue=function(e){return l(e)||(e=new Sm),e.startTime=y(this.startTime,e.startTime),e.stopTime=y(this.stopTime,e.stopTime),e.currentTime=y(this.currentTime,e.currentTime),e.clockRange=y(this.clockRange,e.clockRange),e.multiplier=y(this.multiplier,e.multiplier),e.clockStep=y(this.clockStep,e.clockStep),e};var rh=lT;var Wni=T(S(),1);var u6e=Y.WHITE,m6e=.1,h6e=new D(8,8),f6e=new D(0,0),p6e=new D(1,1);function U1(e){e=y(e,y.EMPTY_OBJECT),this._definitionChanged=new ge,this._color=void 0,this._colorSubscription=void 0,this._cellAlpha=void 0,this._cellAlphaSubscription=void 0,this._lineCount=void 0,this._lineCountSubscription=void 0,this._lineThickness=void 0,this._lineThicknessSubscription=void 0,this._lineOffset=void 0,this._lineOffsetSubscription=void 0,this.color=e.color,this.cellAlpha=e.cellAlpha,this.lineCount=e.lineCount,this.lineThickness=e.lineThickness,this.lineOffset=e.lineOffset}Object.defineProperties(U1.prototype,{isConstant:{get:function(){return K.isConstant(this._color)&&K.isConstant(this._cellAlpha)&&K.isConstant(this._lineCount)&&K.isConstant(this._lineThickness)&&K.isConstant(this._lineOffset)}},definitionChanged:{get:function(){return this._definitionChanged}},color:de("color"),cellAlpha:de("cellAlpha"),lineCount:de("lineCount"),lineThickness:de("lineThickness"),lineOffset:de("lineOffset")});U1.prototype.getType=function(e){return"Grid"};U1.prototype.getValue=function(e,t){return l(t)||(t={}),t.color=K.getValueOrClonedDefault(this._color,e,u6e,t.color),t.cellAlpha=K.getValueOrDefault(this._cellAlpha,e,m6e),t.lineCount=K.getValueOrClonedDefault(this._lineCount,e,h6e,t.lineCount),t.lineThickness=K.getValueOrClonedDefault(this._lineThickness,e,p6e,t.lineThickness),t.lineOffset=K.getValueOrClonedDefault(this._lineOffset,e,f6e,t.lineOffset),t};U1.prototype.equals=function(e){return this===e||e instanceof U1&&K.equals(this._color,e._color)&&K.equals(this._cellAlpha,e._cellAlpha)&&K.equals(this._lineCount,e._lineCount)&&K.equals(this._lineThickness,e._lineThickness)&&K.equals(this._lineOffset,e._lineOffset)};var D1=U1;var Nni=T(S(),1);function B1(e){this._definitionChanged=new ge,this._color=void 0,this._colorSubscription=void 0,this.color=e}Object.defineProperties(B1.prototype,{isConstant:{get:function(){return K.isConstant(this._color)}},definitionChanged:{get:function(){return this._definitionChanged}},color:de("color")});B1.prototype.getType=function(e){return"PolylineArrow"};B1.prototype.getValue=function(e,t){return l(t)||(t={}),t.color=K.getValueOrClonedDefault(this._color,e,Y.WHITE,t.color),t};B1.prototype.equals=function(e){return this===e||e instanceof B1&&K.equals(this._color,e._color)};var Y1=B1;var zni=T(S(),1);var b6e=Y.WHITE,g6e=Y.TRANSPARENT,y6e=16,x6e=255;function O1(e){e=y(e,y.EMPTY_OBJECT),this._definitionChanged=new ge,this._color=void 0,this._colorSubscription=void 0,this._gapColor=void 0,this._gapColorSubscription=void 0,this._dashLength=void 0,this._dashLengthSubscription=void 0,this._dashPattern=void 0,this._dashPatternSubscription=void 0,this.color=e.color,this.gapColor=e.gapColor,this.dashLength=e.dashLength,this.dashPattern=e.dashPattern}Object.defineProperties(O1.prototype,{isConstant:{get:function(){return K.isConstant(this._color)&&K.isConstant(this._gapColor)&&K.isConstant(this._dashLength)&&K.isConstant(this._dashPattern)}},definitionChanged:{get:function(){return this._definitionChanged}},color:de("color"),gapColor:de("gapColor"),dashLength:de("dashLength"),dashPattern:de("dashPattern")});O1.prototype.getType=function(e){return"PolylineDash"};O1.prototype.getValue=function(e,t){return l(t)||(t={}),t.color=K.getValueOrClonedDefault(this._color,e,b6e,t.color),t.gapColor=K.getValueOrClonedDefault(this._gapColor,e,g6e,t.gapColor),t.dashLength=K.getValueOrDefault(this._dashLength,e,y6e,t.dashLength),t.dashPattern=K.getValueOrDefault(this._dashPattern,e,x6e,t.dashPattern),t};O1.prototype.equals=function(e){return this===e||e instanceof O1&&K.equals(this._color,e._color)&&K.equals(this._gapColor,e._gapColor)&&K.equals(this._dashLength,e._dashLength)&&K.equals(this._dashPattern,e._dashPattern)};var H1=O1;var tii=T(S(),1);var _6e=Y.WHITE,T6e=.25,S6e=1;function z1(e){e=y(e,y.EMPTY_OBJECT),this._definitionChanged=new ge,this._color=void 0,this._colorSubscription=void 0,this._glowPower=void 0,this._glowPowerSubscription=void 0,this._taperPower=void 0,this._taperPowerSubscription=void 0,this.color=e.color,this.glowPower=e.glowPower,this.taperPower=e.taperPower}Object.defineProperties(z1.prototype,{isConstant:{get:function(){return K.isConstant(this._color)&&K.isConstant(this._glow)}},definitionChanged:{get:function(){return this._definitionChanged}},color:de("color"),glowPower:de("glowPower"),taperPower:de("taperPower")});z1.prototype.getType=function(e){return"PolylineGlow"};z1.prototype.getValue=function(e,t){return l(t)||(t={}),t.color=K.getValueOrClonedDefault(this._color,e,_6e,t.color),t.glowPower=K.getValueOrDefault(this._glowPower,e,T6e,t.glowPower),t.taperPower=K.getValueOrDefault(this._taperPower,e,S6e,t.taperPower),t};z1.prototype.equals=function(e){return this===e||e instanceof z1&&K.equals(this._color,e._color)&&K.equals(this._glowPower,e._glowPower)&&K.equals(this._taperPower,e._taperPower)};var K1=z1;var lii=T(S(),1);var C6e=Y.WHITE,V6e=Y.BLACK,L6e=1;function J1(e){e=y(e,y.EMPTY_OBJECT),this._definitionChanged=new ge,this._color=void 0,this._colorSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this.color=e.color,this.outlineColor=e.outlineColor,this.outlineWidth=e.outlineWidth}Object.defineProperties(J1.prototype,{isConstant:{get:function(){return K.isConstant(this._color)&&K.isConstant(this._outlineColor)&&K.isConstant(this._outlineWidth)}},definitionChanged:{get:function(){return this._definitionChanged}},color:de("color"),outlineColor:de("outlineColor"),outlineWidth:de("outlineWidth")});J1.prototype.getType=function(e){return"PolylineOutline"};J1.prototype.getValue=function(e,t){return l(t)||(t={}),t.color=K.getValueOrClonedDefault(this._color,e,C6e,t.color),t.outlineColor=K.getValueOrClonedDefault(this._outlineColor,e,V6e,t.outlineColor),t.outlineWidth=K.getValueOrDefault(this._outlineWidth,e,L6e),t};J1.prototype.equals=function(e){return this===e||e instanceof J1&&K.equals(this._color,e._color)&&K.equals(this._outlineColor,e._outlineColor)&&K.equals(this._outlineWidth,e._outlineWidth)};var Qg=J1;var gii=T(S(),1);function P0(e,t){this._value=void 0,this._definitionChanged=new ge,this._eventHelper=new Rr,this._referenceFrame=y(t,$i.FIXED),this.setValue(e)}Object.defineProperties(P0.prototype,{isConstant:{get:function(){let e=this._value;if(!l(e))return!0;let t=e.length;for(let n=0;n=t;i--)e[i]=e[a--]}for(i=0;i=0||l(m)&&te.compare(u,m)>=0));){for(oQ[p++]=u,r=r+1,s=0;s0&&(rQ.length=g,_he(n,d,rQ),oQ.length=p,_he(t,c,oQ))}else{for(s=0;so)return;if(this._backwardExtrapolationType===ud.HOLD)return r.unpack(s,0,t)}if(a>=i){a=i-1;let Z=n[a];if(o=this._forwardExtrapolationDuration,this._forwardExtrapolationType===ud.NONE||o!==0&&te.secondsDifference(e,Z)>o)return;if(this._forwardExtrapolationType===ud.HOLD)return a=i-1,r.unpack(s,a*r.packedLength,t)}let c=this._xTable,d=this._yTable,u=this._interpolationAlgorithm,m=this._packedInterpolationLength,p=this._inputOrder;if(this._updateTableLength){this._updateTableLength=!1;let Z=Math.min(u.getRequiredDataPoints(this._interpolationDegree,p),i);Z!==this._numberOfPoints&&(this._numberOfPoints=Z,c.length=Z,d.length=Z*m)}let g=this._numberOfPoints-1;if(g<1)return;let f=0,x=i-1;if(x-f+1>=g+1){let Z=a-(g/2|0)-1;Zx&&(G=x,Z=G-g,Z0){n=new Array(t);for(let i=0;ic&&e!==Object}let f=typeof e.unpack=="function"&&e!==Yu;if(!g&&!p){m?t[n]=new Jn(f?e.unpack(d,0):d):t[n]=Zhe(e,s,i);return}let x=t[n],_,C=i.epoch;if(l(C)&&(_=te.fromIso8601(C)),g&&!p){x instanceof Wd||(t[n]=x=new Wd(e)),x.addSamplesPackedArray(d,_),Bk(i,x);return}let V;if(!g&&p){a=a.clone(),m?a.data=f?e.unpack(d,0):d:a.data=Zhe(e,s,i),l(x)||(t[n]=x=m?new A0:new gc),m&&x instanceof A0?x.intervals.addInterval(a):x instanceof gc?(m&&(a.data=new Jn(a.data)),x.intervals.addInterval(a)):(t[n]=x=Phe(x),m&&(a.data=new Jn(a.data)),x.intervals.addInterval(a));return}l(x)||(t[n]=x=new gc),x instanceof gc||(t[n]=x=Phe(x));let L=x.intervals;V=L.findInterval(a),(!l(V)||!(V.data instanceof Wd))&&(V=a.clone(),V.data=new Wd(e),L.addInterval(V)),V.data.addSamplesPackedArray(d,_),Bk(i,V.data)}function Ohe(e,t){if(e instanceof Wd){e.removeSamples(t);return}else if(e instanceof A0){e.intervals.removeInterval(t);return}else if(e instanceof gc){let n=e.intervals;for(let i=0;ic),!f&&!p){m?e[t]=new Oc(h.unpack(d),g):e[t]=zP(r,n.reference);return}let x=e[t],_,C=n.epoch;if(l(C)&&(_=te.fromIso8601(C)),f&&!p){(!(x instanceof ca)||l(g)&&x.referenceFrame!==g)&&(e[t]=x=new ca(g,a)),x.addSamplesPackedArray(d,_),Bk(n,x);return}let V;if(!f&&p){s=s.clone(),m?s.data=h.unpack(d):s.data=zP(r,n.reference),l(x)||(m?x=new F0(g):x=new aa(g),e[t]=x),m&&x instanceof F0&&l(g)&&x.referenceFrame===g?x.intervals.addInterval(s):x instanceof aa?(m&&(s.data=new Oc(s.data,g)),x.intervals.addInterval(s)):(e[t]=x=vhe(x),m&&(s.data=new Oc(s.data,g)),x.intervals.addInterval(s));return}l(x)?x instanceof aa||(e[t]=x=vhe(x)):e[t]=x=new aa(g);let L=x.intervals;V=L.findInterval(s),(!l(V)||!(V.data instanceof ca)||l(g)&&V.data.referenceFrame!==g)&&(V=s.clone(),V.data=new ca(g,a),L.addInterval(V)),V.data.addSamplesPackedArray(d,_),Bk(n,V.data)}function Hhe(e,t){if(e instanceof ca){e.removeSamples(t);return}else if(e instanceof F0){e.intervals.removeInterval(t);return}else if(e instanceof aa){let n=e.intervals;for(let i=0;i. version format.");let i=t._documentPacket;l(e.name)&&(i.name=e.name);let o=e.clock;if(l(o)){let r=i.clock;l(r)?(r.interval=y(o.interval,r.interval),r.currentTime=y(o.currentTime,r.currentTime),r.range=y(o.range,r.range),r.step=y(o.step,r.step),r.multiplier=y(o.multiplier,r.multiplier)):i.clock={interval:o.interval,currentTime:o.currentTime,range:o.range,step:o.step,multiplier:o.multiplier}}}function dqe(e,t,n,i){let o=t.ellipse;if(!l(o))return;let r=ar(o.interval),s=e.ellipse;l(s)||(e.ellipse=s=new l_),_e(Boolean,s,"show",o.show,r,i,n),_e(Number,s,"semiMajorAxis",o.semiMajorAxis,r,i,n),_e(Number,s,"semiMinorAxis",o.semiMinorAxis,r,i,n),_e(Number,s,"height",o.height,r,i,n),_e(Je,s,"heightReference",o.heightReference,r,i,n),_e(Number,s,"extrudedHeight",o.extrudedHeight,r,i,n),_e(Je,s,"extrudedHeightReference",o.extrudedHeightReference,r,i,n),_e(Yu,s,"rotation",o.rotation,r,i,n),_e(Yu,s,"stRotation",o.stRotation,r,i,n),_e(Number,s,"granularity",o.granularity,r,i,n),_e(Boolean,s,"fill",o.fill,r,i,n),Pd(s,"material",o.material,r,i,n),_e(Boolean,s,"outline",o.outline,r,i,n),_e(Y,s,"outlineColor",o.outlineColor,r,i,n),_e(Number,s,"outlineWidth",o.outlineWidth,r,i,n),_e(Number,s,"numberOfVerticalLines",o.numberOfVerticalLines,r,i,n),_e(_n,s,"shadows",o.shadows,r,i,n),_e(Wt,s,"distanceDisplayCondition",o.distanceDisplayCondition,r,i,n),_e(Un,s,"classificationType",o.classificationType,r,i,n),_e(Number,s,"zIndex",o.zIndex,r,i,n)}function uqe(e,t,n,i){let o=t.ellipsoid;if(!l(o))return;let r=ar(o.interval),s=e.ellipsoid;l(s)||(e.ellipsoid=s=new d_),_e(Boolean,s,"show",o.show,r,i,n),_e(h,s,"radii",o.radii,r,i,n),_e(h,s,"innerRadii",o.innerRadii,r,i,n),_e(Number,s,"minimumClock",o.minimumClock,r,i,n),_e(Number,s,"maximumClock",o.maximumClock,r,i,n),_e(Number,s,"minimumCone",o.minimumCone,r,i,n),_e(Number,s,"maximumCone",o.maximumCone,r,i,n),_e(Je,s,"heightReference",o.heightReference,r,i,n),_e(Boolean,s,"fill",o.fill,r,i,n),Pd(s,"material",o.material,r,i,n),_e(Boolean,s,"outline",o.outline,r,i,n),_e(Y,s,"outlineColor",o.outlineColor,r,i,n),_e(Number,s,"outlineWidth",o.outlineWidth,r,i,n),_e(Number,s,"stackPartitions",o.stackPartitions,r,i,n),_e(Number,s,"slicePartitions",o.slicePartitions,r,i,n),_e(Number,s,"subdivisions",o.subdivisions,r,i,n),_e(_n,s,"shadows",o.shadows,r,i,n),_e(Wt,s,"distanceDisplayCondition",o.distanceDisplayCondition,r,i,n)}function mqe(e,t,n,i){let o=t.label;if(!l(o))return;let r=ar(o.interval),s=e.label;l(s)||(e.label=s=new Pm),_e(Boolean,s,"show",o.show,r,i,n),_e(String,s,"text",o.text,r,i,n),_e(String,s,"font",o.font,r,i,n),_e(Fo,s,"style",o.style,r,i,n),_e(Number,s,"scale",o.scale,r,i,n),_e(Boolean,s,"showBackground",o.showBackground,r,i,n),_e(Y,s,"backgroundColor",o.backgroundColor,r,i,n),_e(D,s,"backgroundPadding",o.backgroundPadding,r,i,n),_e(D,s,"pixelOffset",o.pixelOffset,r,i,n),_e(h,s,"eyeOffset",o.eyeOffset,r,i,n),_e(pi,s,"horizontalOrigin",o.horizontalOrigin,r,i,n),_e(Pn,s,"verticalOrigin",o.verticalOrigin,r,i,n),_e(Je,s,"heightReference",o.heightReference,r,i,n),_e(Y,s,"fillColor",o.fillColor,r,i,n),_e(Y,s,"outlineColor",o.outlineColor,r,i,n),_e(Number,s,"outlineWidth",o.outlineWidth,r,i,n),_e(At,s,"translucencyByDistance",o.translucencyByDistance,r,i,n),_e(At,s,"pixelOffsetScaleByDistance",o.pixelOffsetScaleByDistance,r,i,n),_e(At,s,"scaleByDistance",o.scaleByDistance,r,i,n),_e(Wt,s,"distanceDisplayCondition",o.distanceDisplayCondition,r,i,n),_e(Number,s,"disableDepthTestDistance",o.disableDepthTestDistance,r,i,n)}function hqe(e,t,n,i){let o=t.model;if(!l(o))return;let r=ar(o.interval),s=e.model;l(s)||(e.model=s=new Op),_e(Boolean,s,"show",o.show,r,i,n),_e(JP.default,s,"uri",o.gltf,r,i,n),_e(Number,s,"scale",o.scale,r,i,n),_e(Number,s,"minimumPixelSize",o.minimumPixelSize,r,i,n),_e(Number,s,"maximumScale",o.maximumScale,r,i,n),_e(Boolean,s,"incrementallyLoadTextures",o.incrementallyLoadTextures,r,i,n),_e(Boolean,s,"runAnimations",o.runAnimations,r,i,n),_e(Boolean,s,"clampAnimations",o.clampAnimations,r,i,n),_e(_n,s,"shadows",o.shadows,r,i,n),_e(Je,s,"heightReference",o.heightReference,r,i,n),_e(Y,s,"silhouetteColor",o.silhouetteColor,r,i,n),_e(Number,s,"silhouetteSize",o.silhouetteSize,r,i,n),_e(Y,s,"color",o.color,r,i,n),_e(hc,s,"colorBlendMode",o.colorBlendMode,r,i,n),_e(Number,s,"colorBlendAmount",o.colorBlendAmount,r,i,n),_e(Wt,s,"distanceDisplayCondition",o.distanceDisplayCondition,r,i,n);let a,c,d=o.nodeTransformations;if(l(d))if(Array.isArray(d))for(a=0,c=d.length;a-1;c--)n[c](s,e,t,i)}aQ=void 0}function Cqe(e){let t,n=e._documentPacket.clock;if(!l(n)){if(!l(e._clock)){let o=e._entityCollection.computeAvailability();if(!o.start.equals(Be.MINIMUM_VALUE)){let r=o.start,s=o.stop,a=te.secondsDifference(s,r),c=Math.round(a/120);return t=new rh,t.startTime=te.clone(r),t.stopTime=te.clone(s),t.clockRange=Cr.LOOP_STOP,t.multiplier=c,t.currentTime=te.clone(r),t.clockStep=co.SYSTEM_CLOCK_MULTIPLIER,e._clock=t,!0}}return!1}l(e._clock)?t=e._clock.clone():(t=new rh,t.startTime=Be.MINIMUM_VALUE.clone(),t.stopTime=Be.MAXIMUM_VALUE.clone(),t.currentTime=Be.MINIMUM_VALUE.clone(),t.clockRange=Cr.LOOP_STOP,t.clockStep=co.SYSTEM_CLOCK_MULTIPLIER,t.multiplier=1);let i=ar(n.interval);return l(i)&&(t.startTime=i.start,t.stopTime=i.stop),l(n.currentTime)&&(t.currentTime=te.fromIso8601(n.currentTime)),l(n.range)&&(t.clockRange=y(Cr[n.range],Cr.LOOP_STOP)),l(n.step)&&(t.clockStep=y(co[n.step],co.SYSTEM_CLOCK_MULTIPLIER)),l(n.multiplier)&&(t.multiplier=n.multiplier),t.equals(e._clock)?!1:(e._clock=t.clone(e._clock),!0)}function Khe(e,t,n,i){n=y(n,y.EMPTY_OBJECT);let o=t,r=n.sourceUri,s=n.credit;if(typeof s=="string"&&(s=new Ct(s)),e._credit=s,typeof t=="string"||t instanceof Ee){t=Ee.createIfNeeded(t),o=t.fetchJson(),r=y(r,t.clone());let a=e._resourceCredits,c=t.credits;if(l(c)){let d=c.length;for(let u=0;u{i.raiseEvent(a)}),n[r]=s}this.updaters=n,this.geometryChanged=i,this.eventHelper=o,this._removeEntitySubscription=e.definitionChanged.addEventListener(bT.prototype._onEntityPropertyChanged,this)}bT.prototype._onEntityPropertyChanged=function(e,t,n,i){let o=this.updaters;for(let r=0;r0){l(i)&&(l(this.oldPrimitive)?o.remove(i):this.oldPrimitive=i);let c;l(this.depthFailAppearanceType)&&(l(this.depthFailMaterialProperty)&&(this.depthFailMaterial=Ko.getValue(e,this.depthFailMaterialProperty,this.depthFailMaterial)),c=new this.depthFailAppearanceType({material:this.depthFailMaterial,translucent:this.translucent,closed:this.closed})),i=new En({show:!1,asynchronous:!0,geometryInstances:s.slice(),appearance:new this.appearanceType({translucent:this.translucent,closed:this.closed}),depthFailAppearance:c,shadows:this.shadows}),o.add(i),t=!1}else{l(i)&&(o.remove(i),i=void 0);let c=this.oldPrimitive;l(c)&&(o.remove(c),this.oldPrimitive=void 0)}this.attributes.removeAll(),this.primitive=i,this.createPrimitive=!1,this.waitingOnCreate=!0}else if(l(i)&&i.ready){i.show=!0,l(this.oldPrimitive)&&(o.remove(this.oldPrimitive),this.oldPrimitive=void 0),l(this.depthFailAppearanceType)&&!(this.depthFailMaterialProperty instanceof Ut)&&(this.depthFailMaterial=Ko.getValue(e,this.depthFailMaterialProperty,this.depthFailMaterial),this.primitive.depthFailAppearance.material=this.depthFailMaterial);let s=this.updatersWithAttributes.values,a=s.length,c=this.waitingOnCreate;for(r=0;r=0;i--){let o=e[i];if(o.remove(t))return o.updaters.length===0&&(e.splice(i,1),o.destroy()),!0}return!1}cV.prototype.remove=function(e){pfe(this._solidItems,e)||pfe(this._translucentItems,e)};function bfe(e,t,n){let i=!1,o=t.length;for(let r=0;r0)for(r=0;r=0;r--){let s=t[r];if(s.invalidated){t.splice(r,1);let a=s.updaters.values,c=a.length;for(let d=0;d0){l(n)&&(l(this.oldPrimitive)?i.remove(n):this.oldPrimitive=n),this.material=Ko.getValue(e,this.materialProperty,this.material);let a;l(this.depthFailMaterialProperty)&&(this.depthFailMaterial=Ko.getValue(e,this.depthFailMaterialProperty,this.depthFailMaterial),a=new this.depthFailAppearanceType({material:this.depthFailMaterial,translucent:this.depthFailMaterial.isTranslucent(),closed:this.closed})),n=new En({show:!1,asynchronous:!0,geometryInstances:o.slice(),appearance:new this.appearanceType({material:this.material,translucent:this.material.isTranslucent(),closed:this.closed}),depthFailAppearance:a,shadows:this.shadows}),i.add(n),t=!1}else{l(n)&&(i.remove(n),n=void 0);let a=this.oldPrimitive;l(a)&&(i.remove(a),this.oldPrimitive=void 0)}this.attributes.removeAll(),this.primitive=n,this.createPrimitive=!1}else if(l(n)&&n.ready){n.show=!0,l(this.oldPrimitive)&&(i.remove(this.oldPrimitive),this.oldPrimitive=void 0),this.material=Ko.getValue(e,this.materialProperty,this.material),this.primitive.appearance.material=this.material,l(this.depthFailAppearanceType)&&!(this.depthFailMaterialProperty instanceof Ut)&&(this.depthFailMaterial=Ko.getValue(e,this.depthFailMaterialProperty,this.depthFailMaterial),this.primitive.depthFailAppearance.material=this.depthFailMaterial);let s=this.updatersWithAttributes.values,a=s.length;for(r=0;r=0;i--){let o=t[i];if(o.remove(e)){o.updaters.length===0&&(t.splice(i,1),o.destroy());break}}};lV.prototype.update=function(e){let t,n=this._items,i=n.length;for(t=i-1;t>=0;t--){let r=n[t];if(r.invalidated){n.splice(t,1);let s=r.updaters.values,a=s.length;for(let c=0;c0)l(i)&&(l(this.oldPrimitive)?o.remove(i):this.oldPrimitive=i),i=new Yc({show:!1,asynchronous:!0,geometryInstances:s.slice(),classificationType:this.classificationType}),o.add(i,this.zIndex),t=!1;else{l(i)&&(o.remove(i),i=void 0);let c=this.oldPrimitive;l(c)&&(o.remove(c),this.oldPrimitive=void 0)}this.attributes.removeAll(),this.primitive=i,this.createPrimitive=!1,this.waitingOnCreate=!0}else if(l(i)&&i.ready){i.show=!0,l(this.oldPrimitive)&&(o.remove(this.oldPrimitive),this.oldPrimitive=void 0);let s=this.updatersWithAttributes.values,a=s.length,c=this.waitingOnCreate;for(r=0;r=0;--t){let s=o[t];s.isDirty&&(i=o[t].update(e)&&i,s.isDirty=!1),s.geometry.length===0&&o.splice(t,1)}return i};dV.prototype.getBoundingSphere=function(e,t){let n=this._batches,i=n.length;for(let o=0;o0)l(n)&&(l(this.oldPrimitive)?i.remove(n):this.oldPrimitive=n),this.material=Ko.getValue(e,this.materialProperty,this.material),n=new Yc({show:!1,asynchronous:!0,geometryInstances:o.slice(),appearance:new this.appearanceType({material:this.material}),classificationType:this.classificationType}),i.add(n,this.zIndex),t=!1;else{l(n)&&(i.remove(n),n=void 0);let a=this.oldPrimitive;l(a)&&(i.remove(a),this.oldPrimitive=void 0)}this.attributes.removeAll(),this.primitive=n,this.createPrimitive=!1}else if(l(n)&&n.ready){n.show=!0,l(this.oldPrimitive)&&(i.remove(this.oldPrimitive),this.oldPrimitive=void 0),this.material=Ko.getValue(e,this.materialProperty,this.material),this.primitive.appearance.material=this.material;let s=this.updatersWithAttributes.values,a=s.length;for(r=0;r=0;i--){let o=t[i];if(o.remove(e)){o.updaters.length===0&&(t.splice(i,1),o.destroy());break}}};mV.prototype.update=function(e){let t,n=this._items,i=n.length;for(t=i-1;t>=0;t--){let r=n[t];if(r.invalidated){n.splice(t,1);let s=r.updaters.values,a=s.length;for(let c=0;c0)l(i)&&(l(this.oldPrimitive)?o.remove(i):this.oldPrimitive=i),i=new En({show:!1,asynchronous:!0,geometryInstances:s.slice(),appearance:new dn({flat:!0,translucent:this.translucent,renderState:{lineWidth:this.width}}),shadows:this.shadows}),o.add(i),t=!1;else{l(i)&&(o.remove(i),i=void 0);let c=this.oldPrimitive;l(c)&&(o.remove(c),this.oldPrimitive=void 0)}this.attributes.removeAll(),this.primitive=i,this.createPrimitive=!1,this.waitingOnCreate=!0}else if(l(i)&&i.ready){i.show=!0,l(this.oldPrimitive)&&(o.remove(this.oldPrimitive),this.oldPrimitive=void 0);let s=this.updatersWithAttributes.values,a=s.length,c=this.waitingOnCreate;for(r=0;r0)for(m=!0,t=0;t0)for(m=!0,t=0;t-1;a--)c=s[a],d=c.id,u=this._updaterSets.get(d),u.entity===c?u.forEach(function(x){m._removeUpdater(x),m._insertUpdaterIntoBatch(e,x)}):(o.push(c),n.push(c));for(a=o.length-1;a>-1;a--)c=o[a],d=c.id,u=this._updaterSets.get(d),u.forEach(this._removeUpdater.bind(this)),u.destroy(),this._updaterSets.remove(d),this._subscriptions.get(d)(),this._subscriptions.remove(d);for(a=n.length-1;a>-1;a--)c=n[a],d=c.id,u=new gT(c,this._scene),this._updaterSets.set(d,u),u.forEach(function(x){m._insertUpdaterIntoBatch(e,x)}),this._subscriptions.set(d,u.geometryChanged.addEventListener(Dl._onGeometryChanged,this));t.removeAll(),i.removeAll(),r.removeAll();let p=!0,g=this._batches,f=g.length;for(a=0;a-1;s--)c=n[s],a=c.id,i.remove(a)||(o.set(a,c),r.remove(a));for(s=t.length-1;s>-1;s--)c=t[s],a=c.id,o.remove(a)?r.set(a,c):i.set(a,c)};var lv=Dl;var xmi=T(S(),1);var b$e=1,g$e="30px sans-serif",y$e=Fo.FILL,x$e=Y.WHITE,_$e=Y.BLACK,T$e=1,S$e=!1,C$e=new Y(.165,.165,.165,.8),V$e=new D(7,5),L$e=D.ZERO,R$e=h.ZERO,Z$e=Je.NONE,G$e=pi.CENTER,E$e=Pn.CENTER,X$e=new h,I$e=new Y,W$e=new Y,P$e=new Y,v$e=new D,w$e=new h,F$e=new D,A$e=new At,M$e=new At,N$e=new At,k$e=new Wt;function xfe(e){this.entity=e,this.label=void 0,this.index=void 0}function ey(e,t){t.collectionChanged.addEventListener(ey.prototype._onCollectionChanged,this),this._cluster=e,this._entityCollection=t,this._items=new Vt,this._onCollectionChanged(t,t.values,[],[])}ey.prototype.update=function(e){let t=this._items.values,n=this._cluster;for(let i=0,o=t.length;i-1;o--)r=t[o],l(r._label)&&l(r._position)&&s.set(r.id,new xfe(r));for(o=i.length-1;o>-1;o--)r=i[o],l(r._label)&&l(r._position)?s.contains(r.id)||s.set(r.id,new xfe(r)):(fQ(s.get(r.id),r,a),s.remove(r.id));for(o=n.length-1;o>-1;o--)r=n[o],fQ(s.get(r.id),r,a),s.remove(r.id)};function fQ(e,t,n){l(e)&&(e.label=void 0,n.removeLabel(t))}var dv=ey;var kmi=T(S(),1);var U$e=1,D$e=0,B$e=!0,Y$e=!0,O$e=_n.ENABLED,H$e=Je.NONE,z$e=Y.RED,K$e=0,J$e=Y.WHITE,Q$e=hc.HIGHLIGHT,j$e=.5,q$e=new D(1,1),$$e=new M,eet=new M,_fe=new Y,Tfe=new Array(4),tet=new h;function ty(e,t){t.collectionChanged.addEventListener(ty.prototype._onCollectionChanged,this),this._scene=e,this._primitives=e.primitives,this._entityCollection=t,this._modelHash={},this._entitiesToVisualize=new Vt,this._onCollectionChanged(t,t.values,[],[])}async function net(e,t,n,i){let o=e._primitives,r=e._modelHash;try{let s=await Qm.fromGltfAsync({url:n,incrementallyLoadTextures:i,scene:e._scene});if(e.isDestroyed()||!l(r[t.id]))return;s.id=t,o.add(s),r[t.id].modelPrimitive=s,s.errorEvent.addEventListener(a=>{l(r[t.id])&&(console.log(a),a.name!=="TextureError"&&s.incrementallyLoadTextures&&(r[t.id].loadFailed=!0))})}catch(s){if(e.isDestroyed()||!l(r[t.id]))return;console.log(s),r[t.id].loadFailed=!0}}ty.prototype.update=function(e){let t=this._entitiesToVisualize.values,n=this._modelHash,i=this._primitives;for(let o=0,r=t.length;o-1;i--)pQ(this,e[i],t,n);return me(this)};var Jk=new h,iet=new he;ty.prototype.getBoundingSphere=function(e,t){let n=this._modelHash[e.id];if(!l(n))return mt.FAILED;if(n.loadFailed)return mt.FAILED;let i=n.modelPrimitive;if(!l(i)||!i.show)return mt.PENDING;if(!i.ready||!n.modelUpdated)return mt.PENDING;let o=this._scene,r=o.globe,s=y(r?.ellipsoid,ie.WGS84);if(i.heightReference!==Je.NONE){let c=i.modelMatrix;Jk.x=c[12],Jk.y=c[13],Jk.z=c[14];let d=s.cartesianToCartographic(Jk,iet),u=o.getHeight(d,i.heightReference);return l(u)&&(_u(i.heightReference)?d.height=u:d.height+=u),le.clone(i.boundingSphere,t),t.center=s.cartographicToCartesian(d),mt.DONE}return le.clone(i.boundingSphere,t),mt.DONE};ty.prototype._onCollectionChanged=function(e,t,n,i){let o,r,s=this._entitiesToVisualize,a=this._modelHash,c=this._primitives;for(o=t.length-1;o>-1;o--)r=t[o],l(r._model)&&l(r._position)&&s.set(r.id,r);for(o=i.length-1;o>-1;o--)r=i[o],l(r._model)&&l(r._position)?(oet(r,a),s.set(r.id,r)):(pQ(this,r,a,c),s.remove(r.id));for(o=n.length-1;o>-1;o--)r=n[o],pQ(this,r,a,c),s.remove(r.id)};function pQ(e,t,n,i){let o=n[t.id];l(o)&&(i.removeAndDestroy(o.modelPrimitive),delete n[t.id])}function oet(e,t){let n=t[e.id];l(n)&&(n.nodeTransformationsScratch={},n.articulationsScratch={})}var uv=ty;var phi=T(S(),1);var zmi=T(S(),1);function ny(e){this._definitionChanged=new ge,this._value=void 0,this._removeSubscription=void 0,this.setValue(e)}Object.defineProperties(ny.prototype,{isConstant:{get:function(){return K.isConstant(this._value)}},definitionChanged:{get:function(){return this._definitionChanged}},referenceFrame:{get:function(){return l(this._value)?this._value.referenceFrame:$i.FIXED}}});ny.prototype.getValue=function(e,t){return this.getValueInReferenceFrame(e,$i.FIXED,t)};ny.prototype.setValue=function(e){this._value!==e&&(this._value=e,l(this._removeSubscription)&&(this._removeSubscription(),this._removeSubscription=void 0),l(e)&&(this._removeSubscription=e.definitionChanged.addEventListener(this._raiseDefinitionChanged,this)),this._definitionChanged.raiseEvent(this))};ny.prototype.getValueInReferenceFrame=function(e,t,n){if(l(this._value))return n=this._value.getValueInReferenceFrame(e,t,n),l(n)?ie.WGS84.scaleToGeodeticSurface(n,n):void 0};ny.prototype.equals=function(e){return this===e||e instanceof ny&&this._value===e._value};ny.prototype._raiseDefinitionChanged=function(){this._definitionChanged.raiseEvent(this)};var Gf=ny;var ret=60,set=1,Vfe=new Sn,bQ=new Sn,gQ=new Sn;function Sfe(e){this.entity=e,this.polyline=void 0,this.index=void 0,this.updater=void 0}function aet(e,t,n,i,o,r,s,a,c){let d=a,u;u=e.getValueInReferenceFrame(t,r,c[d]),l(u)&&(c[d++]=u);let m=!l(o)||te.lessThanOrEquals(o,t)||te.greaterThanOrEquals(o,n),p=0,g=i.length,f=i[p],x=n,_=!1,C,V,L;for(;p0&&!_){let Z=i[p+1],G=te.secondsDifference(Z,f);_=G>s,_&&(C=Math.ceil(G/s),V=0,L=G/Math.max(C,2),C=Math.max(C-1,1))}if(_&&V0){let g=m.pop();c=this._polylineCollection.get(g),t.index=g}else t.index=this._polylineCollection.length,c=this._polylineCollection.add();c.id=n,t.polyline=c}let u=K.getValueOrDefault(i._resolution,e,ret);c.show=!0,c.positions=Rfe(o,r,s,e,this._referenceFrame,u,c.positions.slice()),c.material=Ko.getValue(e,i._material,c.material),c.width=K.getValueOrDefault(i._width,e,set),c.distanceDisplayCondition=K.getValueOrUndefined(i._distanceDisplayCondition,e,c.distanceDisplayCondition)};mv.prototype.removeObject=function(e){let t=e.polyline;l(t)&&(this._unusedIndexes.push(e.index),e.polyline=void 0,t.show=!1,t.id=void 0,e.index=void 0)};mv.prototype.destroy=function(){return this._scene.primitives.remove(this._polylineCollection),me(this)};function iy(e,t){t.collectionChanged.addEventListener(iy.prototype._onCollectionChanged,this),this._scene=e,this._updaters={},this._entityCollection=t,this._items=new Vt,this._onCollectionChanged(t,t.values,[],[])}iy.prototype.update=function(e){let t=this._updaters;for(let i in t)t.hasOwnProperty(i)&&t[i].update(e);let n=this._items.values;if(n.length===0&&l(this._updaters)&&Object.keys(this._updaters).length>0){for(let i in t)t.hasOwnProperty(i)&&t[i].destroy();this._updaters={}}for(let i=0,o=n.length;i-1;o--)r=t[o],l(r._path)&&l(r._position)&&a.set(r.id,new Sfe(r));for(o=i.length-1;o>-1;o--)r=i[o],l(r._path)&&l(r._position)?a.contains(r.id)||a.set(r.id,new Sfe(r)):(s=a.get(r.id),l(s)&&(l(s.updater)&&s.updater.removeObject(s),a.remove(r.id)));for(o=n.length-1;o>-1;o--)r=n[o],s=a.get(r.id),l(s)&&(l(s.updater)&&s.updater.removeObject(s),a.remove(r.id))};iy._subSample=Rfe;var hv=iy;var Ghi=T(S(),1);var Zfe=Y.WHITE,Gfe=Y.BLACK,Efe=0,Xfe=1,Ife=0,Wfe=new Y,het=new h,Pfe=new Y,vfe=new At,wfe=new At,Ffe=new Wt;function Afe(e){this.entity=e,this.pointPrimitive=void 0,this.billboard=void 0,this.color=void 0,this.outlineColor=void 0,this.pixelSize=void 0,this.outlineWidth=void 0}function oy(e,t){t.collectionChanged.addEventListener(oy.prototype._onCollectionChanged,this),this._cluster=e,this._entityCollection=t,this._items=new Vt,this._onCollectionChanged(t,t.values,[],[])}oy.prototype.update=function(e){let t=this._items.values,n=this._cluster;for(let i=0,o=t.length;i0?(d.scale=1,g=g||C!==r.outlineWidth||V!==r.pixelSize||!Y.equals(x,r.color)||!Y.equals(_,r.outlineColor)):(d.scale=V/50,V=50,g=g||C!==r.outlineWidth||!Y.equals(x,r.color)||!Y.equals(_,r.outlineColor)),g){r.color=Y.clone(x,r.color),r.outlineColor=Y.clone(_,r.outlineColor),r.pixelSize=V,r.outlineWidth=C;let L=x.alpha,Z=x.toCssColorString(),G=_.toCssColorString(),X=JSON.stringify([Z,V,G,C]);d.setImage(X,K_(L,Z,G,C,V))}f&&d._updateClamping()}}return!0};oy.prototype.getBoundingSphere=function(e,t){let n=this._items.get(e.id);if(!l(n)||!(l(n.pointPrimitive)||l(n.billboard)))return mt.FAILED;if(l(n.pointPrimitive))t.center=h.clone(n.pointPrimitive.position,t.center);else{let i=n.billboard;if(!l(i._clampedPosition))return mt.PENDING;t.center=h.clone(i._clampedPosition,t.center)}return t.radius=0,mt.DONE};oy.prototype.isDestroyed=function(){return!1};oy.prototype.destroy=function(){this._entityCollection.collectionChanged.removeEventListener(oy.prototype._onCollectionChanged,this);let e=this._entityCollection.values;for(let t=0;t-1;o--)r=t[o],l(r._point)&&l(r._position)&&s.set(r.id,new Afe(r));for(o=i.length-1;o>-1;o--)r=i[o],l(r._point)&&l(r._position)?s.contains(r.id)||s.set(r.id,new Afe(r)):(fv(s.get(r.id),r,a),s.remove(r.id));for(o=n.length-1;o>-1;o--)r=n[o],fv(s.get(r.id),r,a),s.remove(r.id)};function fv(e,t,n){if(l(e)){let i=e.pointPrimitive;if(l(i)){e.pointPrimitive=void 0,n.removePoint(t);return}let o=e.billboard;l(o)&&(e.billboard=void 0,n.removeBillboard(t))}}var pv=oy;var kfi=T(S(),1);var rfi=T(S(),1);var fet=new Jn(0),Qk={},Mfe=new Y,pet=new Ut(Y.WHITE),bet=new Jn(!0),get=new Jn(_n.DISABLED),yet=new Jn(new Wt),xet=new Jn(Un.BOTH);function _et(){this.vertexFormat=void 0,this.positions=void 0,this.width=void 0,this.arcType=void 0,this.granularity=void 0}function Tet(){this.positions=void 0,this.width=void 0,this.arcType=void 0,this.granularity=void 0}function hh(e,t){this._entity=e,this._scene=t,this._entitySubscription=e.definitionChanged.addEventListener(hh.prototype._onEntityPropertyChanged,this),this._fillEnabled=!1,this._dynamic=!1,this._geometryChanged=new ge,this._showProperty=void 0,this._materialProperty=void 0,this._shadowsProperty=void 0,this._distanceDisplayConditionProperty=void 0,this._classificationTypeProperty=void 0,this._depthFailMaterialProperty=void 0,this._geometryOptions=new _et,this._groundGeometryOptions=new Tet,this._id=`polyline-${e.id}`,this._clampToGround=!1,this._supportsPolylinesOnTerrain=Jo.supportsPolylinesOnTerrain(t),this._zIndex=0,this._onEntityPropertyChanged(e,"polyline",e.polyline,void 0)}Object.defineProperties(hh.prototype,{id:{get:function(){return this._id}},entity:{get:function(){return this._entity}},fillEnabled:{get:function(){return this._fillEnabled}},hasConstantFill:{get:function(){return!this._fillEnabled||!l(this._entity.availability)&&K.isConstant(this._showProperty)}},fillMaterialProperty:{get:function(){return this._materialProperty}},depthFailMaterialProperty:{get:function(){return this._depthFailMaterialProperty}},outlineEnabled:{value:!1},hasConstantOutline:{value:!0},outlineColorProperty:{value:void 0},shadowsProperty:{get:function(){return this._shadowsProperty}},distanceDisplayConditionProperty:{get:function(){return this._distanceDisplayConditionProperty}},classificationTypeProperty:{get:function(){return this._classificationTypeProperty}},isDynamic:{get:function(){return this._dynamic}},isClosed:{value:!1},geometryChanged:{get:function(){return this._geometryChanged}},arcType:{get:function(){return this._arcType}},clampToGround:{get:function(){return this._clampToGround&&this._supportsPolylinesOnTerrain}},zIndex:{get:function(){return this._zIndex}}});hh.prototype.isOutlineVisible=function(e){return!1};hh.prototype.isFilled=function(e){let t=this._entity,n=this._fillEnabled&&t.isAvailable(e)&&this._showProperty.getValue(e);return y(n,!1)};hh.prototype.createFillGeometryInstance=function(e){let t=this._entity,n=t.isAvailable(e),i=new xn(n&&t.isShowing&&this._showProperty.getValue(e)),o=this._distanceDisplayConditionProperty.getValue(e),r=kn.fromDistanceDisplayCondition(o),s={show:i,distanceDisplayCondition:r},a;return this._materialProperty instanceof Ut&&(l(this._materialProperty.color)&&(this._materialProperty.color.isConstant||n)&&(a=this._materialProperty.color.getValue(e,Mfe)),l(a)||(a=Y.WHITE),s.color=Ht.fromColor(a)),this.clampToGround?new St({id:t,geometry:new Rx(this._groundGeometryOptions),attributes:s}):(l(this._depthFailMaterialProperty)&&this._depthFailMaterialProperty instanceof Ut&&(l(this._depthFailMaterialProperty.color)&&(this._depthFailMaterialProperty.color.isConstant||n)&&(a=this._depthFailMaterialProperty.color.getValue(e,Mfe)),l(a)||(a=Y.WHITE),s.depthFailColor=Ht.fromColor(a)),new St({id:t,geometry:new Ip(this._geometryOptions),attributes:s}))};hh.prototype.createOutlineGeometryInstance=function(e){};hh.prototype.isDestroyed=function(){return!1};hh.prototype.destroy=function(){this._entitySubscription(),me(this)};hh.prototype._onEntityPropertyChanged=function(e,t,n,i){if(!(t==="availability"||t==="polyline"))return;let o=this._entity.polyline;if(!l(o)){this._fillEnabled&&(this._fillEnabled=!1,this._geometryChanged.raiseEvent(this));return}let r=o.positions,s=o.show;if(l(s)&&s.isConstant&&!s.getValue(Be.MINIMUM_VALUE)||!l(r)){this._fillEnabled&&(this._fillEnabled=!1,this._geometryChanged.raiseEvent(this));return}let a=o.zIndex,c=y(o.material,pet),d=c instanceof Ut;this._materialProperty=c,this._depthFailMaterialProperty=o.depthFailMaterial,this._showProperty=y(s,bet),this._shadowsProperty=y(o.shadows,get),this._distanceDisplayConditionProperty=y(o.distanceDisplayCondition,yet),this._classificationTypeProperty=y(o.classificationType,xet),this._fillEnabled=!0,this._zIndex=y(a,fet);let u=o.width,m=o.arcType,p=o.clampToGround,g=o.granularity;if(!r.isConstant||!K.isConstant(u)||!K.isConstant(m)||!K.isConstant(g)||!K.isConstant(p)||!K.isConstant(a))this._dynamic||(this._dynamic=!0,this._geometryChanged.raiseEvent(this));else{let f=this._geometryOptions,x=r.getValue(Be.MINIMUM_VALUE,f.positions);if(!l(x)||x.length<2){this._fillEnabled&&(this._fillEnabled=!1,this._geometryChanged.raiseEvent(this));return}let _;d&&(!l(this._depthFailMaterialProperty)||this._depthFailMaterialProperty instanceof Ut)?_=Or.VERTEX_FORMAT:_=ea.VERTEX_FORMAT,f.vertexFormat=_,f.positions=x,f.width=l(u)?u.getValue(Be.MINIMUM_VALUE):void 0,f.arcType=l(m)?m.getValue(Be.MINIMUM_VALUE):void 0,f.granularity=l(g)?g.getValue(Be.MINIMUM_VALUE):void 0;let C=this._groundGeometryOptions;C.positions=x,C.width=f.width,C.arcType=f.arcType,C.granularity=f.granularity,this._clampToGround=l(p)?p.getValue(Be.MINIMUM_VALUE):!1,!this._clampToGround&&l(a)&&Ft("Entity polylines must have clampToGround: true when using zIndex. zIndex will be ignored."),this._dynamic=!1,this._geometryChanged.raiseEvent(this)}};hh.prototype.createDynamicUpdater=function(e,t){return new bv(e,t,this)};var pV={positions:void 0,granularity:void 0,height:void 0,ellipsoid:void 0};function bv(e,t,n){this._line=void 0,this._primitives=e,this._groundPrimitives=t,this._groundPolylinePrimitive=void 0,this._material=void 0,this._geometryUpdater=n,this._positions=[]}function Nfe(e){if(l(e._line))return e._line;let t=e._primitives,n=e._geometryUpdater._scene.id+t._guid,i=Qk[n];!l(i)||i.isDestroyed()?(i=new qm,Qk[n]=i,t.add(i)):t.contains(i)||t.add(i);let o=i.add();return o.id=e._geometryUpdater._entity,e._line=o,o}bv.prototype.update=function(e){let t=this._geometryUpdater,n=t._entity,i=n.polyline,o=i.positions,r=K.getValueOrUndefined(o,e,this._positions);t._clampToGround=K.getValueOrDefault(i._clampToGround,e,!1),t._groundGeometryOptions.positions=r,t._groundGeometryOptions.width=K.getValueOrDefault(i._width,e,1),t._groundGeometryOptions.arcType=K.getValueOrDefault(i._arcType,e,qt.GEODESIC),t._groundGeometryOptions.granularity=K.getValueOrDefault(i._granularity,e,9999);let s=this._groundPrimitives;if(l(this._groundPolylinePrimitive)&&(s.remove(this._groundPolylinePrimitive),this._groundPolylinePrimitive=void 0),t.clampToGround){if(!n.isShowing||!n.isAvailable(e)||!K.getValueOrDefault(i._show,e,!0)||!l(r)||r.length<2)return;let u=t.fillMaterialProperty,m;if(u instanceof Ut)m=new Or;else{let p=Ko.getValue(e,u,this._material);m=new ea({material:p,translucent:p.isTranslucent()}),this._material=p}this._groundPolylinePrimitive=s.add(new Wm({geometryInstances:t.createFillGeometryInstance(e),appearance:m,classificationType:t.classificationTypeProperty.getValue(e),asynchronous:!1}),K.getValueOrUndefined(t.zIndex,e)),l(this._line)&&(this._line.show=!1);return}let a=Nfe(this);if(!n.isShowing||!n.isAvailable(e)||!K.getValueOrDefault(i._show,e,!0)){a.show=!1;return}if(!l(r)||r.length<2){a.show=!1;return}let c=qt.GEODESIC;c=K.getValueOrDefault(i._arcType,e,c);let d=t._scene.globe;c!==qt.NONE&&l(d)&&(pV.ellipsoid=d.ellipsoid,pV.positions=r,pV.granularity=K.getValueOrUndefined(i._granularity,e),pV.height=Li.extractHeights(r,d.ellipsoid),c===qt.GEODESIC?r=Li.generateCartesianArc(pV):r=Li.generateCartesianRhumbArc(pV)),a.show=!0,a.positions=r.slice(),a.material=Ko.getValue(e,t.fillMaterialProperty,a.material),a.width=K.getValueOrDefault(i._width,e,1),a.distanceDisplayCondition=K.getValueOrUndefined(i._distanceDisplayCondition,e,a.distanceDisplayCondition)};bv.prototype.getBoundingSphere=function(e){if(this._geometryUpdater.clampToGround){let t=this._groundPolylinePrimitive;if(l(t)&&t.show&&t.ready){let n=t.getGeometryInstanceAttributes(this._geometryUpdater._entity);if(l(n)&&l(n.boundingSphere))return le.clone(n.boundingSphere,e),mt.DONE}return l(t)&&!t.ready?mt.PENDING:mt.DONE}else{let t=Nfe(this);if(t.show&&t.positions.length>0)return le.fromPoints(t.positions,e),mt.DONE}return mt.FAILED};bv.prototype.isDestroyed=function(){return!1};bv.prototype.destroy=function(){let t=this._geometryUpdater._scene.id+this._primitives._guid,n=Qk[t];l(n)&&(n.remove(this._line),n.length===0&&(this._primitives.removeAndDestroy(n),delete Qk[t])),l(this._groundPolylinePrimitive)&&this._groundPrimitives.remove(this._groundPolylinePrimitive),me(this)};var gv=hh;var Sfi=T(S(),1);var Cet=new Y,Vet=new Wt,Let=new Wt;function fh(e,t,n,i,o){let r;n instanceof Ut?r=Or:r=ea,this.orderedGroundPrimitives=e,this.classificationType=t,this.appearanceType=r,this.materialProperty=n,this.updaters=new Vt,this.createPrimitive=!0,this.primitive=void 0,this.oldPrimitive=void 0,this.geometry=new Vt,this.material=void 0,this.updatersWithAttributes=new Vt,this.attributes=new Vt,this.invalidated=!1,this.removeMaterialSubscription=n.definitionChanged.addEventListener(fh.prototype.onMaterialChanged,this),this.subscriptions=new Vt,this.showsUpdated=new Vt,this.zIndex=i,this._asynchronous=o}fh.prototype.onMaterialChanged=function(){this.invalidated=!0};fh.prototype.isMaterial=function(e){let t=this.materialProperty,n=e.fillMaterialProperty;return n===t||n instanceof Ut&&t instanceof Ut?!0:l(t)&&t.equals(n)};fh.prototype.add=function(e,t,n){let i=t.id;if(this.updaters.set(i,t),this.geometry.set(i,n),!t.hasConstantFill||!t.fillMaterialProperty.isConstant||!K.isConstant(t.distanceDisplayConditionProperty))this.updatersWithAttributes.set(i,t);else{let o=this;this.subscriptions.set(i,t.entity.definitionChanged.addEventListener(function(r,s,a,c){s==="isShowing"&&o.showsUpdated.set(t.id,t)}))}this.createPrimitive=!0};fh.prototype.remove=function(e){let t=e.id;if(this.createPrimitive=this.geometry.remove(t)||this.createPrimitive,this.updaters.remove(t)){this.updatersWithAttributes.remove(t);let n=this.subscriptions.get(t);return l(n)&&(n(),this.subscriptions.remove(t)),!0}return!1};fh.prototype.update=function(e){let t=!0,n=this.primitive,i=this.orderedGroundPrimitives,o=this.geometry.values,r;if(this.createPrimitive){if(o.length>0)l(n)&&(l(this.oldPrimitive)?i.remove(n):this.oldPrimitive=n),n=new Wm({show:!1,asynchronous:this._asynchronous,geometryInstances:o.slice(),appearance:new this.appearanceType,classificationType:this.classificationType}),this.appearanceType===ea&&(this.material=Ko.getValue(e,this.materialProperty,this.material),n.appearance.material=this.material),i.add(n,this.zIndex),t=!1;else{l(n)&&(i.remove(n),n=void 0);let a=this.oldPrimitive;l(a)&&(i.remove(a),this.oldPrimitive=void 0)}this.attributes.removeAll(),this.primitive=n,this.createPrimitive=!1}else if(l(n)&&n.ready){n.show=!0,l(this.oldPrimitive)&&(i.remove(this.oldPrimitive),this.oldPrimitive=void 0),this.appearanceType===ea&&(this.material=Ko.getValue(e,this.materialProperty,this.material),this.primitive.appearance.material=this.material);let s=this.updatersWithAttributes.values,a=s.length;for(r=0;r=0;i--){let o=t[i];if(o.remove(e)){o.updaters.length===0&&(t.splice(i,1),o.destroy());break}}};bV.prototype.update=function(e){let t,n=this._items,i=n.length;for(t=i-1;t>=0;t--){let r=n[t];if(r.invalidated){n.splice(t,1);let s=r.updaters.values,a=s.length;for(let c=0;c-1;a--)c=s[a],d=c.id,u=this._updaters.get(d),u.entity===c?(kfe(this,u),Ufe(this,e,u)):(o.push(c),n.push(c));for(a=o.length-1;a>-1;a--)c=o[a],d=c.id,u=this._updaters.get(d),kfe(this,u),u.destroy(),this._updaters.remove(d),this._subscriptions.get(d)(),this._subscriptions.remove(d);for(a=n.length-1;a>-1;a--)c=n[a],d=c.id,u=new gv(c,this._scene),this._updaters.set(d,u),Ufe(this,e,u),this._subscriptions.set(d,u.geometryChanged.addEventListener(Ef._onGeometryChanged,this));t.removeAll(),i.removeAll(),r.removeAll();let m=!0,p=this._batches,g=p.length;for(a=0;a-1;s--)c=n[s],a=c.id,i.remove(a)||(o.set(a,c),r.remove(a));for(s=t.length-1;s>-1;s--)c=t[s],a=c.id,o.remove(a)?r.set(a,c):i.set(a,c)};var xv=Ef;function Bl(e){Yc.initializeTerrainHeights(),Wm.initializeTerrainHeights();let t=e.scene,n=e.dataSourceCollection;this._eventHelper=new Rr,this._eventHelper.add(n.dataSourceAdded,this._onDataSourceAdded,this),this._eventHelper.add(n.dataSourceRemoved,this._onDataSourceRemoved,this),this._eventHelper.add(n.dataSourceMoved,this._onDataSourceMoved,this),this._eventHelper.add(t.postRender,this._postRender,this),this._dataSourceCollection=n,this._scene=t,this._visualizersCallback=y(e.visualizersCallback,Bl.defaultVisualizersCallback);let i=!1,o=new Ul,r=new Ul;n.length>0&&(t.primitives.add(o),t.groundPrimitives.add(r),i=!0),this._primitives=o,this._groundPrimitives=r;for(let d=0,u=n.length;dnew o(e,i))]};Object.defineProperties(Bl.prototype,{scene:{get:function(){return this._scene}},dataSources:{get:function(){return this._dataSourceCollection}},defaultDataSource:{get:function(){return this._defaultDataSource}},ready:{get:function(){return this._ready}}});Bl.prototype.isDestroyed=function(){return!1};Bl.prototype.destroy=function(){this._eventHelper.removeAll();let e=this._dataSourceCollection;for(let t=0,n=e.length;tWet*s.maximumRadius?(m=Ofe,h.normalize(c,m),h.negate(m,m),g=h.clone(h.UNIT_Z,yQ),p=h.cross(g,m,jk),h.magnitude(p)>W.EPSILON7&&(h.normalize(m,m),h.normalize(p,p),g=h.cross(m,p,yQ),h.normalize(g,g),d=!0)):h.equalsEpsilon(c,V,W.EPSILON7)||(g=Ofe,h.normalize(X,g),h.normalize(v,v),p=h.cross(g,v,yQ),u&&(p=h.multiplyByScalar(p,-1,p)),h.equalsEpsilon(p,h.ZERO,W.EPSILON7)||(m=h.cross(p,g,jk),$.multiplyByVector(G,m,m),$.multiplyByVector(G,p,p),$.multiplyByVector(G,g,g),h.normalize(m,m),h.normalize(p,p),h.normalize(g,g),d=!0))}}l(e.boundingSphere)&&(c=e.boundingSphere.center);let f,x,_;i&&(f=h.clone(t.position,xQ),x=h.clone(t.direction,Hfe),_=h.clone(t.up,zfe));let C=Iet;d?(C[0]=m.x,C[1]=m.y,C[2]=m.z,C[3]=0,C[4]=p.x,C[5]=p.y,C[6]=p.z,C[7]=0,C[8]=g.x,C[9]=g.y,C[10]=g.z,C[11]=0,C[12]=c.x,C[13]=c.y,C[14]=c.z,C[15]=0):Gt.eastNorthUpToFixedFrame(c,s,C),t._setTransform(C),i&&(h.clone(f,t.position),h.clone(x,t.direction),h.clone(_,t.up),h.cross(x,_,t.right))}if(n){let d=a===oe.SCENE2D||h.equals(e._offset3D,h.ZERO)?void 0:e._offset3D;t.lookAtTransform(t.transform,d)}}function Tv(e,t,n){this.entity=e,this.scene=t,this.ellipsoid=y(n,ie.WGS84),this.boundingSphere=void 0,this._lastEntity=void 0,this._mode=void 0,this._lastCartesian=new h,this._defaultOffset3D=void 0,this._offset3D=new h}Object.defineProperties(Tv,{defaultOffset3D:{get:function(){return this._defaultOffset3D},set:function(e){this._defaultOffset3D=h.clone(e,new h)}}});Tv.defaultOffset3D=new h(-14e3,3500,3500);var qk=new fu,vet=new h;Tv.prototype.update=function(e,t){let n=this.scene,i=this.ellipsoid,o=n.mode;if(o===oe.MORPHING)return;let r=this.entity,s=r.position;if(!l(s))return;let a=r!==this._lastEntity,c=o!==this._mode,d=n.camera,u=a||c,m=!0;if(a){let p=r.viewFrom,g=l(p);if(!g&&l(t)){qk.pitch=-W.PI_OVER_FOUR,qk.range=0;let f=s.getValue(e,vet);if(l(f)){let x=2-1/Math.max(1,h.magnitude(f)/i.maximumRadius);qk.pitch*=x}d.viewBoundingSphere(t,qk),this.boundingSphere=t,u=!1,m=!1}else(!g||!l(p.getValue(e,this._offset3D)))&&h.clone(Tv._defaultOffset3D,this._offset3D)}else!c&&this._mode!==oe.SCENE2D&&h.clone(d.position,this._offset3D);this._lastEntity=r,this._mode=o,Pet(this,d,u,m,s,e,i)};var Sv=Tv;var H0i=T(S(),1);var u0i=T(S());var Epi=T(S());var Rpi=T(S());var Cpi=T(S());function _Q(e){return e}function $k(e){if(e==null)return _Q;var t,n,i=e.scale[0],o=e.scale[1],r=e.translate[0],s=e.translate[1];return function(a,c){c||(t=n=0);var d=2,u=a.length,m=new Array(u);for(m[0]=(t+=a[0])*i+r,m[1]=(n+=a[1])*o+s;d${i}${qfe(o)}`:n+=`${i}${o}`)}return n.length>0&&(n=`${n}
`),n}function Uet(e,t,n){let i;return function(o,r){return l(i)||(i=e(t,n)),i}}function Det(e,t){return new Fm(Uet(qfe,e,t),!0)}function tU(e,t,n){let i=e.id;if(!l(i)||e.type!=="Feature")i=Yn();else{let s=2,a=i;for(;l(t.getById(a));)a=`${i}_${s}`,s++;i=a}let o=t.getOrCreateEntity(i),r=e.properties;if(l(r)){o.properties=r;let s,a=r.title;if(l(a))o.name=a,s="title";else{let d=Number.MAX_VALUE;for(let u in r)if(r.hasOwnProperty(u)&&r[u]){let m=u.toLowerCase();if(d>1&&m==="title"){d=1,s=u;break}else d>2&&m==="name"?(d=2,s=u):d>3&&/title/i.test(u)?(d=3,s=u):d>4&&/name/i.test(u)&&(d=4,s=u)}l(s)&&(o.name=r[s])}let c=r.description;c!==null&&(o.description=l(c)?new Jn(c):n(r,s))}return o}function IQ(e,t){let n=new Array(e.length);for(let i=0;i2?d.perPositionHeight=new Jn(!0):o.clampToGround||(d.height=0);let p=tU(t,e._entityCollection,o.describe);p.polygon=d}function dpe(e,t,n,i,o){lpe(e,t,i,n.coordinates,o)}function upe(e,t,n,i,o){let r=n.coordinates;for(let s=0;st&&(n==null?(n="…",i=3):i=n.length,e=e.substring(0,t-i)+n),e}function No(e,t){for(var n=e.length-1;n>=0;n--)e[n]===t&&e.splice(n,1)}function sy(e,t){for(var n=e.length-1;n>=0;n--)t(e[n])===!0&&e.splice(n,1)}function ay(e){throw new Error("Unhandled case for value: '".concat(e,"'"))}var pbi=T(S());var nbi=T(S());var $0i=T(S()),cy=/[A-Za-z]/,Bs=/[\d]/;var Ad=/\s/,nU=/['"]/,gpe=/[\x00-\x1F\x7F]/,ype=/A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC/.source,Het=/\u2700-\u27bf\udde6-\uddff\ud800-\udbff\udc00-\udfff\ufe0e\ufe0f\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0\ud83c\udffb-\udfff\u200d\u3299\u3297\u303d\u3030\u24c2\ud83c\udd70-\udd71\udd7e-\udd7f\udd8e\udd91-\udd9a\udde6-\uddff\ude01-\ude02\ude1a\ude2f\ude32-\ude3a\ude50-\ude51\u203c\u2049\u25aa-\u25ab\u25b6\u25c0\u25fb-\u25fe\u00a9\u00ae\u2122\u2139\udc04\u2600-\u26FF\u2b05\u2b06\u2b07\u2b1b\u2b1c\u2b50\u2b55\u231a\u231b\u2328\u23cf\u23e9-\u23f3\u23f8-\u23fa\udccf\u2935\u2934\u2190-\u21ff/.source,zet=/\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D4-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F/.source,Ket=ype+Het+zet,xpe=/0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19/.source,j0i=new RegExp("[".concat(ype+xpe,"]")),WQ=Ket+xpe,ph=new RegExp("[".concat(WQ,"]"));var iU=function(){function e(t){t===void 0&&(t={}),this.tagName="",this.attrs={},this.innerHTML="",this.tagName=t.tagName||"",this.attrs=t.attrs||{},this.innerHTML=t.innerHtml||t.innerHTML||""}return e.prototype.setTagName=function(t){return this.tagName=t,this},e.prototype.getTagName=function(){return this.tagName||""},e.prototype.setAttr=function(t,n){var i=this.getAttrs();return i[t]=n,this},e.prototype.getAttr=function(t){return this.getAttrs()[t]},e.prototype.setAttrs=function(t){return Object.assign(this.getAttrs(),t),this},e.prototype.getAttrs=function(){return this.attrs||(this.attrs={})},e.prototype.setClass=function(t){return this.setAttr("class",t)},e.prototype.addClass=function(t){for(var n=this.getClass(),i=n?n.split(Ad):[],o=t.split(Ad),r;r=o.shift();)i.indexOf(r)===-1&&i.push(r);return this.getAttrs().class=i.join(" "),this},e.prototype.removeClass=function(t){for(var n=this.getClass(),i=n?n.split(Ad):[],o=t.split(Ad),r;i.length&&(r=o.shift());){var s=i.indexOf(r);s!==-1&&i.splice(s,1)}return this.getAttrs().class=i.join(" "),this},e.prototype.getClass=function(){return this.getAttrs().class||""},e.prototype.hasClass=function(t){return(" "+this.getClass()+" ").indexOf(" "+t+" ")!==-1},e.prototype.setInnerHTML=function(t){return this.innerHTML=t,this},e.prototype.setInnerHtml=function(t){return this.setInnerHTML(t)},e.prototype.getInnerHTML=function(){return this.innerHTML||""},e.prototype.getInnerHtml=function(){return this.getInnerHTML()},e.prototype.toAnchorString=function(){var t=this.getTagName(),n=this.buildAttrsStr();return n=n?" "+n:"",["<",t,n,">",this.getInnerHtml(),""].join("")},e.prototype.buildAttrsStr=function(){if(!this.attrs)return"";var t=this.getAttrs(),n=[];for(var i in t)t.hasOwnProperty(i)&&n.push(i+'="'+t[i]+'"');return n.join(" ")},e}();var obi=T(S());function _pe(e,t,n){var i,o;n==null?(n="…",o=3,i=8):(o=n.length,i=n.length);var r=function(V){var L={},Z=V,G=Z.match(/^([a-z]+):\/\//i);return G&&(L.scheme=G[1],Z=Z.substr(G[0].length)),G=Z.match(/^(.*?)(?=(\?|#|\/|$))/i),G&&(L.host=G[1],Z=Z.substr(G[0].length)),G=Z.match(/^\/(.*?)(?=(\?|#|$))/i),G&&(L.path=G[1],Z=Z.substr(G[0].length)),G=Z.match(/^\?(.*?)(?=(#|$))/i),G&&(L.query=G[1],Z=Z.substr(G[0].length)),G=Z.match(/^#(.*?)$/i),G&&(L.fragment=G[1]),L},s=function(V){var L="";return V.scheme&&V.host&&(L+=V.scheme+"://"),V.host&&(L+=V.host),V.path&&(L+="/"+V.path),V.query&&(L+="?"+V.query),V.fragment&&(L+="#"+V.fragment),L},a=function(V,L){var Z=L/2,G=Math.ceil(Z),X=-1*Math.floor(Z),v="";return X<0&&(v=V.substr(X)),V.substr(0,G)+n+v};if(e.length<=t)return e;var c=t-o,d=r(e);if(d.query){var u=d.query.match(/^(.*?)(?=(\?|\#))(.*?)$/i);u&&(d.query=d.query.substr(0,u[1].length),e=s(d))}if(e.length<=t||(d.host&&(d.host=d.host.replace(/^www\./,""),e=s(d)),e.length<=t))return e;var m="";if(d.host&&(m+=d.host),m.length>=c)return d.host.length==t?(d.host.substr(0,t-o)+n).substr(0,c+i):a(m,c).substr(0,c+i);var p="";if(d.path&&(p+="/"+d.path),d.query&&(p+="?"+d.query),p)if((m+p).length>=c){if((m+p).length==t)return(m+p).substr(0,t);var g=c-m.length;return(m+a(p,g)).substr(0,c+i)}else m+=p;if(d.fragment){var f="#"+d.fragment;if((m+f).length>=c){if((m+f).length==t)return(m+f).substr(0,t);var x=c-m.length;return(m+a(f,x)).substr(0,c+i)}else m+=f}if(d.scheme&&d.host){var _=d.scheme+"://";if((m+_).length0&&(C=m.substr(-1*Math.floor(c/2))),(m.substr(0,Math.ceil(c/2))+n+C).substr(0,c+i)}var sbi=T(S());function Tpe(e,t,n){if(e.length<=t)return e;var i,o;n==null?(n="…",i=8,o=3):(i=n.length,o=n.length);var r=t-o,s="";return r>0&&(s=e.substr(-1*Math.floor(r/2))),(e.substr(0,Math.ceil(r/2))+n+s).substr(0,r+i)}var lbi=T(S());function Spe(e,t,n){return bpe(e,t,n)}var Cpe=function(){function e(t){t===void 0&&(t={}),this.newWindow=!1,this.truncate={},this.className="",this.newWindow=t.newWindow||!1,this.truncate=t.truncate||{},this.className=t.className||""}return e.prototype.build=function(t){return new iU({tagName:"a",attrs:this.createAttrs(t),innerHtml:this.processAnchorText(t.getAnchorText())})},e.prototype.createAttrs=function(t){var n={href:t.getAnchorHref()},i=this.createCssClass(t);return i&&(n.class=i),this.newWindow&&(n.target="_blank",n.rel="noopener noreferrer"),this.truncate&&this.truncate.length&&this.truncate.length=0;g--){var f=u[g];switch(f.state){case 11:X(f,p);break;case 12:v(f,p);break;case 0:C(f,p);break;case 1:V(f,p);break;case 2:L(f,p);break;case 3:Z(f,p);break;case 4:G(f,p);break;case 5:P(f,p);break;case 6:F(f,p);break;case 7:A(f,p);break;case 13:b(f,p);break;case 14:R(f,p);break;case 8:E(f,p);break;case 9:I(f,p);break;case 10:w(f,p);break;case 15:N(f,p);break;case 16:B(f,p);break;case 17:U(f,p);break;case 18:O(f,p);break;case 19:k(f,p);break;case 20:J(f,p);break;case 21:H(f,p);break;case 22:ee(f,p);break;case 23:z(f,p);break;case 24:j(f,p);break;case 25:q(f,p);break;case 26:be(f,p);break;case 27:Te(f,p);break;case 28:ae(f,p);break;case 29:ye(f,p);break;case 30:Se(f,p);break;case 31:Le(f,p);break;case 32:Pe(f,p);break;case 33:ke(f,p);break;case 34:Pt(f,p);break;case 35:Ot(f,p);break;case 36:ht(f,p);break;case 37:Xe(f,p);break;case 38:Ae(f,p);break;case 39:$e(f,p);break;case 40:Qe(f,p);break;case 41:je(f,p);break;default:ay(f.state)}}}for(var x=u.length-1;x>=0;x--)u.forEach(function(pe){return kt(pe)});return c;function _(pe){if(pe==="#")u.push(Ctt(m,28));else if(pe==="@")u.push(Vtt(m,30));else if(pe==="/")u.push(DQ(m,11));else if(pe==="+")u.push(BQ(m,37));else if(pe==="(")u.push(BQ(m,32));else{if(Bs.test(pe)&&(u.push(BQ(m,38)),u.push(Ttt(m,13))),Ppe(pe)){var Ve=pe.toLowerCase()==="m"?15:22;u.push(Stt(m,Ve))}oU(pe)&&u.push(UQ(m,0)),ph.test(pe)&&u.push(DQ(m,5))}}function C(pe,Ve){Ve===":"?pe.state=2:Ve==="-"?pe.state=1:wQ(Ve)||No(u,pe)}function V(pe,Ve){Ve==="-"||(Ve==="/"?(No(u,pe),u.push(DQ(m,11))):wQ(Ve)?pe.state=0:No(u,pe))}function L(pe,Ve){Ve==="/"?pe.state=3:Ve==="."?No(u,pe):U0(Ve)?(pe.state=5,oU(Ve)&&u.push(UQ(m,0))):No(u,pe)}function Z(pe,Ve){Ve==="/"?pe.state=4:FQ(Ve)?(pe.state=10,pe.acceptStateReached=!0):kt(pe)}function G(pe,Ve){Ve==="/"?pe.state=10:U0(Ve)?(pe.state=5,pe.acceptStateReached=!0):No(u,pe)}function X(pe,Ve){Ve==="/"?pe.state=12:No(u,pe)}function v(pe,Ve){U0(Ve)?pe.state=5:No(u,pe)}function P(pe,Ve){Ve==="."?pe.state=7:Ve==="-"?pe.state=6:Ve===":"?pe.state=8:sU(Ve)?pe.state=10:rU(Ve)||kt(pe)}function F(pe,Ve){Ve==="-"||(Ve==="."?kt(pe):U0(Ve)?pe.state=5:kt(pe))}function A(pe,Ve){Ve==="."?kt(pe):U0(Ve)?(pe.state=5,pe.acceptStateReached=!0):kt(pe)}function b(pe,Ve){Ve==="."?pe.state=14:Ve===":"?pe.state=8:Bs.test(Ve)||(sU(Ve)?pe.state=10:ph.test(Ve)?No(u,pe):kt(pe))}function R(pe,Ve){Bs.test(Ve)?(pe.octetsEncountered++,pe.octetsEncountered===4&&(pe.acceptStateReached=!0),pe.state=13):kt(pe)}function E(pe,Ve){Bs.test(Ve)?pe.state=9:kt(pe)}function I(pe,Ve){Bs.test(Ve)||(sU(Ve)?pe.state=10:kt(pe))}function w(pe,Ve){FQ(Ve)||kt(pe)}function N(pe,Ve){Ve.toLowerCase()==="a"?pe.state=16:ee(pe,Ve)}function B(pe,Ve){Ve.toLowerCase()==="i"?pe.state=17:ee(pe,Ve)}function U(pe,Ve){Ve.toLowerCase()==="l"?pe.state=18:ee(pe,Ve)}function O(pe,Ve){Ve.toLowerCase()==="t"?pe.state=19:ee(pe,Ve)}function k(pe,Ve){Ve.toLowerCase()==="o"?pe.state=20:ee(pe,Ve)}function J(pe,Ve){Ve.toLowerCase()===":"?pe.state=21:ee(pe,Ve)}function H(pe,Ve){aU(Ve)?pe.state=22:No(u,pe)}function ee(pe,Ve){Ve==="."?pe.state=23:Ve==="@"?pe.state=24:aU(Ve)?pe.state=22:No(u,pe)}function z(pe,Ve){Ve==="."?No(u,pe):Ve==="@"?No(u,pe):aU(Ve)?pe.state=22:No(u,pe)}function j(pe,Ve){U0(Ve)?pe.state=25:No(u,pe)}function q(pe,Ve){Ve==="."?pe.state=27:Ve==="-"?pe.state=26:rU(Ve)||kt(pe)}function be(pe,Ve){Ve==="-"||Ve==="."?kt(pe):rU(Ve)?pe.state=25:kt(pe)}function Te(pe,Ve){Ve==="."||Ve==="-"?kt(pe):U0(Ve)?(pe.state=25,pe.acceptStateReached=!0):kt(pe)}function ae(pe,Ve){MQ(Ve)?(pe.state=29,pe.acceptStateReached=!0):No(u,pe)}function ye(pe,Ve){MQ(Ve)||kt(pe)}function Se(pe,Ve){NQ(Ve)?(pe.state=31,pe.acceptStateReached=!0):No(u,pe)}function Le(pe,Ve){NQ(Ve)||(ph.test(Ve)?No(u,pe):kt(pe))}function Xe(pe,Ve){Bs.test(Ve)?pe.state=38:(No(u,pe),_(Ve))}function Pe(pe,Ve){Bs.test(Ve)?pe.state=33:No(u,pe),_(Ve)}function ke(pe,Ve){Bs.test(Ve)?pe.state=34:No(u,pe)}function Pt(pe,Ve){Bs.test(Ve)?pe.state=35:No(u,pe)}function Ot(pe,Ve){Ve===")"?pe.state=36:No(u,pe)}function ht(pe,Ve){Bs.test(Ve)?pe.state=38:kQ(Ve)?pe.state=39:No(u,pe)}function Ae(pe,Ve){pe.acceptStateReached=!0,cU(Ve)?pe.state=40:Ve==="#"?pe.state=41:Bs.test(Ve)||(Ve==="("?pe.state=32:kQ(Ve)?pe.state=39:(kt(pe),oU(Ve)&&u.push(UQ(m,0))))}function $e(pe,Ve){Bs.test(Ve)?pe.state=38:Ve==="("?pe.state=32:(kt(pe),_(Ve))}function Qe(pe,Ve){cU(Ve)||(Ve==="#"?pe.state=41:Bs.test(Ve)?pe.state=38:kt(pe))}function je(pe,Ve){cU(Ve)?pe.state=40:Bs.test(Ve)?No(u,pe):kt(pe)}function kt(pe){if(No(u,pe),!!pe.acceptStateReached){var Ve=pe.startIdx,Dt=e.slice(pe.startIdx,m);if(Dt=_tt(Dt),pe.type==="url"){var bt=e.charAt(pe.startIdx-1);if(bt==="@")return;var li=pe.matchType;if(li==="scheme"){var Vo=vQ.exec(Dt);if(Vo&&(Ve=Ve+Vo.index,Dt=Dt.slice(Vo.index)),!Gpe(Dt))return}else if(li==="tld"){if(!Epe(Dt))return}else if(li==="ipV4"){if(!Xpe(Dt))return}else ay(li);c.push(new Ipe({tagBuilder:n,matchedText:Dt,offset:Ve,urlMatchType:li,url:Dt,protocolRelativeMatch:Dt.slice(0,2)==="//",stripPrefix:i,stripTrailingSlash:o,decodePercentEncoding:r}))}else if(pe.type==="email")vpe(Dt)&&c.push(new wpe({tagBuilder:n,matchedText:Dt,offset:Ve,email:Dt.replace(Wpe,"")}));else if(pe.type==="hashtag")Fpe(Dt)&&c.push(new Mpe({tagBuilder:n,matchedText:Dt,offset:Ve,serviceName:s,hashtag:Dt.slice(1)}));else if(pe.type==="mention")Npe(Dt,a)&&c.push(new Upe({tagBuilder:n,matchedText:Dt,offset:Ve,serviceName:a,mention:Dt.slice(1)}));else if(pe.type==="phone"){if(Dt=Dt.replace(/ +$/g,""),Dpe(Dt)){var Rs=Dt.replace(/[^0-9,;#]/g,"");c.push(new Bpe({tagBuilder:n,matchedText:Dt,offset:Ve,number:Rs,plusSign:Dt.charAt(0)==="+"}))}}else ay(pe)}}}var xtt=/[\(\{\[]/,Ype=/[\)\}\]]/,Ope={")":"(","}":"{","]":"["};function _tt(e){for(var t={"(":0,"{":0,"[":0},n=0;n=0;)if(r=e.charAt(o),Ype.test(r)){var s=Ope[r];if(t[s]<0)t[s]++,o--;else break}else if(Zpe.test(r))o--;else break;return e.slice(0,o+1)}function UQ(e,t){return{type:"url",startIdx:e,state:t,acceptStateReached:!1,matchType:"scheme"}}function DQ(e,t){return{type:"url",startIdx:e,state:t,acceptStateReached:!1,matchType:"tld"}}function Ttt(e,t){return{type:"url",startIdx:e,state:t,acceptStateReached:!1,matchType:"ipV4",octetsEncountered:1}}function Stt(e,t){return{type:"email",startIdx:e,state:t,acceptStateReached:!1}}function Ctt(e,t){return{type:"hashtag",startIdx:e,state:t,acceptStateReached:!1}}function Vtt(e,t){return{type:"mention",startIdx:e,state:t,acceptStateReached:!1}}function BQ(e,t){return{type:"phone",startIdx:e,state:t,acceptStateReached:!1}}var Cgi=T(S());function zpe(e,t){for(var n=t.onOpenTag,i=t.onCloseTag,o=t.onText,r=t.onComment,s=t.onDoctype,a=new Wf,c=0,d=e.length,u=0,m=0,p=a;c"?(p=new Wf(Ys(Ys({},p),{name:ee()})),J()):!cy.test(j)&&!Bs.test(j)&&j!==":"&&O()}function C(j){j===">"?O():cy.test(j)?u=3:O()}function V(j){Ad.test(j)||(j==="/"?u=12:j===">"?J():j==="<"?k():j==="="||nU.test(j)||gpe.test(j)?O():u=5)}function L(j){Ad.test(j)?u=6:j==="/"?u=12:j==="="?u=7:j===">"?J():j==="<"?k():nU.test(j)&&O()}function Z(j){Ad.test(j)||(j==="/"?u=12:j==="="?u=7:j===">"?J():j==="<"?k():nU.test(j)?O():u=5)}function G(j){Ad.test(j)||(j==='"'?u=8:j==="'"?u=9:/[>=`]/.test(j)?O():j==="<"?k():u=10)}function X(j){j==='"'&&(u=11)}function v(j){j==="'"&&(u=11)}function P(j){Ad.test(j)?u=4:j===">"?J():j==="<"&&k()}function F(j){Ad.test(j)?u=4:j==="/"?u=12:j===">"?J():j==="<"?k():(u=4,z())}function A(j){j===">"?(p=new Wf(Ys(Ys({},p),{isClosing:!0})),J()):u=4}function b(j){e.substr(c,2)==="--"?(c+=2,p=new Wf(Ys(Ys({},p),{type:"comment"})),u=14):e.substr(c,7).toUpperCase()==="DOCTYPE"?(c+=7,p=new Wf(Ys(Ys({},p),{type:"doctype"})),u=20):O()}function R(j){j==="-"?u=15:j===">"?O():u=16}function E(j){j==="-"?u=18:j===">"?O():u=16}function I(j){j==="-"&&(u=17)}function w(j){j==="-"?u=18:u=16}function N(j){j===">"?J():j==="!"?u=19:j==="-"||(u=16)}function B(j){j==="-"?u=17:j===">"?J():u=16}function U(j){j===">"?J():j==="<"&&k()}function O(){u=0,p=a}function k(){u=1,p=new Wf({idx:c})}function J(){var j=e.slice(m,p.idx);j&&o(j,m),p.type==="comment"?r(p.idx):p.type==="doctype"?s(p.idx):(p.isOpening&&n(p.name,p.idx),p.isClosing&&i(p.name,p.idx)),O(),m=c+1}function H(){var j=e.slice(m,c);o(j,m),m=c+1}function ee(){var j=p.idx+(p.isClosing?2:1);return e.slice(j,c).toLowerCase()}function z(){c--}}var Wf=function(){function e(t){t===void 0&&(t={}),this.idx=t.idx!==void 0?t.idx:-1,this.type=t.type||"tag",this.name=t.name||"",this.isOpening=!!t.isOpening,this.isClosing=!!t.isClosing}return e}();var Ltt=function(){function e(t){t===void 0&&(t={}),this.version=e.version,this.urls={},this.email=!0,this.phone=!0,this.hashtag=!1,this.mention=!1,this.newWindow=!0,this.stripPrefix={scheme:!0,www:!0},this.stripTrailingSlash=!0,this.decodePercentEncoding=!0,this.truncate={length:0,location:"end"},this.className="",this.replaceFn=null,this.context=void 0,this.sanitizeHtml=!1,this.tagBuilder=null,this.urls=Rtt(t.urls),this.email=Fd(t.email)?t.email:this.email,this.phone=Fd(t.phone)?t.phone:this.phone,this.hashtag=t.hashtag||this.hashtag,this.mention=t.mention||this.mention,this.newWindow=Fd(t.newWindow)?t.newWindow:this.newWindow,this.stripPrefix=Ztt(t.stripPrefix),this.stripTrailingSlash=Fd(t.stripTrailingSlash)?t.stripTrailingSlash:this.stripTrailingSlash,this.decodePercentEncoding=Fd(t.decodePercentEncoding)?t.decodePercentEncoding:this.decodePercentEncoding,this.sanitizeHtml=t.sanitizeHtml||!1;var n=this.mention;if(n!==!1&&kpe.indexOf(n)===-1)throw new Error("invalid `mention` cfg '".concat(n,"' - see docs"));var i=this.hashtag;if(i!==!1&&Ape.indexOf(i)===-1)throw new Error("invalid `hashtag` cfg '".concat(i,"' - see docs"));this.truncate=Gtt(t.truncate),this.className=t.className||this.className,this.replaceFn=t.replaceFn||this.replaceFn,this.context=t.context||this}return e.link=function(t,n){var i=new e(n);return i.link(t)},e.parse=function(t,n){var i=new e(n);return i.parse(t)},e.prototype.parse=function(t){var n=this,i=["a","style","script"],o=0,r=[];return zpe(t,{onOpenTag:function(s){i.indexOf(s)>=0&&o++},onText:function(s,a){if(o===0){var c=/( | |<|<|>|>|"|"|')/gi,d=s.split(c),u=a;d.forEach(function(m,p){if(p%2===0){var g=n.parseText(m,u);r.push.apply(r,g)}u+=m.length})}},onCloseTag:function(s){i.indexOf(s)>=0&&(o=Math.max(o-1,0))},onComment:function(s){},onDoctype:function(s){}}),r=this.compactMatches(r),r=this.removeUnwantedMatches(r),r},e.prototype.compactMatches=function(t){t.sort(function(c,d){return c.getOffset()-d.getOffset()});for(var n=0;nr?n:n+1;t.splice(a,1);continue}if(t[n+1].getOffset()/g,">"));for(var n=this.parse(t),i=[],o=0,r=0,s=n.length;r{let i=new FileReader;i.addEventListener("load",function(){t(i.result)}),i.addEventListener("error",function(){n(i.error)}),i.readAsText(e)})}function YQ(e,t){let n=Rv(e,"id");return n=l(n)?n:Yn(),t.getOrCreateEntity(n)}function OQ(e){let t=$pe(e,"lon"),n=$pe(e,"lat"),i=Vv(e,"ele",Co.gpx);return h.fromDegrees(t,n,i)}function $pe(e,t){if(!l(e))return;let n=e.getAttribute(t);if(n!==null){let i=parseFloat(n);return isNaN(i)?void 0:i}}function Rv(e,t){if(!l(e))return;let n=e.getAttribute(t);return n!==null?n:void 0}function ly(e,t,n){if(!l(e))return;let i=e.childNodes,o=i.length;for(let r=0;r${m.text}: ${m.value}

`)}if(!l(i)||i==="")return;i=Ett.link(i),Lv.innerHTML=i;let s=Lv.querySelectorAll("a");for(n=0;n',d+=`${Lv.innerHTML}`,Lv.innerHTML="",d}function s0e(e,t,n,i){let o=OQ(t),r=YQ(t,n);r.position=o;let s=l(i.waypointImage)?i.waypointImage:e._pinBuilder.fromMakiIconId("marker",Y.RED,dU);r.billboard=o0e(s);let a=Yl(t,"name",Co.gpx);r.name=a,r.label=Wtt(),r.label.text=a,r.description=zQ(t,r),i.clampToGround&&(r.billboard.heightReference=Je.CLAMP_TO_GROUND,r.label.heightReference=Je.CLAMP_TO_GROUND)}function Ptt(e,t,n,i){let o=YQ(t,n);o.description=zQ(t,o);let r=HQ(t,"rtept",Co.gpx),s=new Array(r.length);for(let a=0;a0?(a=a.concat(c.times),u.addSamples(a,s),d=d&&!0):d=!1;if(d){let m=l(i.waypointImage)?i.waypointImage:e._pinBuilder.fromMakiIconId("marker",Y.RED,dU);o.billboard=o0e(m),o.position=u,i.clampToGround&&(o.billboard.heightReference=Je.CLAMP_TO_GROUND),o.availability=new Xr,o.availability.addInterval(new Sn({start:a[0],stop:a[a.length-1]}))}o.polyline=r0e(i.trackColor),o.polyline.positions=s,i.clampToGround&&(o.polyline.clampToGround=!0)}function wtt(e){let t={positions:[],times:[]},n=HQ(e,"trkpt",Co.gpx),i;for(let o=0;onew Array(t).fill(n,0,t)))}function yU(e){return e.reduce((t,n)=>t.concat(Array.isArray(n)?yU(n):n),[])}var c0e=[0,1,2,3].concat(...gU([[2,4],[2,5],[4,6],[4,7],[8,8],[8,9],[16,10],[16,11],[32,12],[32,13],[64,14],[64,15],[2,0],[1,16],[1,17],[2,18],[2,19],[4,20],[4,21],[8,22],[8,23],[16,24],[16,25],[32,26],[32,27],[64,28],[64,29]]));function cr(){let e=this;function t(o){let r=e.dyn_tree,s=e.stat_desc.static_tree,a=e.stat_desc.extra_bits,c=e.stat_desc.extra_base,d=e.stat_desc.max_length,u,m,p,g,f,x,_=0;for(g=0;g<=15;g++)o.bl_count[g]=0;for(r[o.heap[o.heap_max]*2+1]=0,u=o.heap_max+1;u<573;u++)m=o.heap[u],g=r[r[m*2+1]*2+1]+1,g>d&&(g=d,_++),r[m*2+1]=g,!(m>e.max_code)&&(o.bl_count[g]++,f=0,m>=c&&(f=a[m-c]),x=r[m*2],o.opt_len+=x*(g+f),s&&(o.static_len+=x*(s[m*2+1]+f)));if(_!==0){do{for(g=d-1;o.bl_count[g]===0;)g--;o.bl_count[g]--,o.bl_count[g+1]+=2,o.bl_count[d]--,_-=2}while(_>0);for(g=d;g!==0;g--)for(m=o.bl_count[g];m!==0;)p=o.heap[--u],!(p>e.max_code)&&(r[p*2+1]!=g&&(o.opt_len+=(g-r[p*2+1])*r[p*2],r[p*2+1]=g),m--)}}function n(o,r){let s=0;do s|=o&1,o>>>=1,s<<=1;while(--r>0);return s>>>1}function i(o,r,s){let a=[],c=0,d,u,m;for(d=1;d<=15;d++)a[d]=c=c+s[d-1]<<1;for(u=0;u<=r;u++)m=o[u*2+1],m!==0&&(o[u*2]=n(a[m]++,m))}e.build_tree=function(o){let r=e.dyn_tree,s=e.stat_desc.static_tree,a=e.stat_desc.elems,c,d,u=-1,m;for(o.heap_len=0,o.heap_max=573,c=0;c=1;c--)o.pqdownheap(r,c);m=a;do c=o.heap[1],o.heap[1]=o.heap[o.heap_len--],o.pqdownheap(r,1),d=o.heap[1],o.heap[--o.heap_max]=c,o.heap[--o.heap_max]=d,r[m*2]=r[c*2]+r[d*2],o.depth[m]=Math.max(o.depth[c],o.depth[d])+1,r[c*2+1]=r[d*2+1]=m,o.heap[1]=m++,o.pqdownheap(r,1);while(o.heap_len>=2);o.heap[--o.heap_max]=o.heap[1],t(o),i(r,e.max_code,o.bl_count)}}cr._length_code=[0,1,2,3,4,5,6,7].concat(...gU([[2,8],[2,9],[2,10],[2,11],[4,12],[4,13],[4,14],[4,15],[8,16],[8,17],[8,18],[8,19],[16,20],[16,21],[16,22],[16,23],[32,24],[32,25],[32,26],[31,27],[1,28]]));cr.base_length=[0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224,0];cr.base_dist=[0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096,6144,8192,12288,16384,24576];cr.d_code=function(e){return e<256?c0e[e]:c0e[256+(e>>>7)]};cr.extra_lbits=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];cr.extra_dbits=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];cr.extra_blbits=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];cr.bl_order=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];function Wa(e,t,n,i,o){let r=this;r.static_tree=e,r.extra_bits=t,r.extra_base=n,r.elems=i,r.max_length=o}var Ott=[12,140,76,204,44,172,108,236,28,156,92,220,60,188,124,252,2,130,66,194,34,162,98,226,18,146,82,210,50,178,114,242,10,138,74,202,42,170,106,234,26,154,90,218,58,186,122,250,6,134,70,198,38,166,102,230,22,150,86,214,54,182,118,246,14,142,78,206,46,174,110,238,30,158,94,222,62,190,126,254,1,129,65,193,33,161,97,225,17,145,81,209,49,177,113,241,9,137,73,201,41,169,105,233,25,153,89,217,57,185,121,249,5,133,69,197,37,165,101,229,21,149,85,213,53,181,117,245,13,141,77,205,45,173,109,237,29,157,93,221,61,189,125,253,19,275,147,403,83,339,211,467,51,307,179,435,115,371,243,499,11,267,139,395,75,331,203,459,43,299,171,427,107,363,235,491,27,283,155,411,91,347,219,475,59,315,187,443,123,379,251,507,7,263,135,391,71,327,199,455,39,295,167,423,103,359,231,487,23,279,151,407,87,343,215,471,55,311,183,439,119,375,247,503,15,271,143,399,79,335,207,463,47,303,175,431,111,367,239,495,31,287,159,415,95,351,223,479,63,319,191,447,127,383,255,511,0,64,32,96,16,80,48,112,8,72,40,104,24,88,56,120,4,68,36,100,20,84,52,116,3,131,67,195,35,163,99,227],Htt=gU([[144,8],[112,9],[24,7],[8,8]]);Wa.static_ltree=yU(Ott.map((e,t)=>[e,Htt[t]]));var ztt=[0,16,8,24,4,20,12,28,2,18,10,26,6,22,14,30,1,17,9,25,5,21,13,29,3,19,11,27,7,23],Ktt=gU([[30,5]]);Wa.static_dtree=yU(ztt.map((e,t)=>[e,Ktt[t]]));Wa.static_l_desc=new Wa(Wa.static_ltree,cr.extra_lbits,257,286,15);Wa.static_d_desc=new Wa(Wa.static_dtree,cr.extra_dbits,0,30,15);Wa.static_bl_desc=new Wa(null,cr.extra_blbits,0,19,7);var Jtt=9,Qtt=8;function Pf(e,t,n,i,o){let r=this;r.good_length=e,r.max_lazy=t,r.nice_length=n,r.max_chain=i,r.func=o}var d0e=0,pU=1,yT=2,bh=[new Pf(0,0,0,0,d0e),new Pf(4,4,8,4,pU),new Pf(4,5,16,8,pU),new Pf(4,6,32,32,pU),new Pf(4,4,16,16,yT),new Pf(8,16,32,32,yT),new Pf(8,16,128,128,yT),new Pf(8,32,128,256,yT),new Pf(32,128,258,1024,yT),new Pf(32,258,258,4096,yT)],uU=["need dictionary","stream end","","","stream error","data error","","buffer error","",""],Qu=0,mU=1,Ev=2,hU=3,jtt=32,KQ=42,fU=113,Xv=666,JQ=8,qtt=0,QQ=1,$tt=2,gr=3,bU=258,Md=bU+gr+1;function l0e(e,t,n,i){let o=e[t*2],r=e[n*2];return o=3&&B[cr.bl_order[Ue]*2+1]===0;Ue--);return e.opt_len+=3*(Ue+1)+5+5+4,Ue}function Le(Ue){e.pending_buf[e.pending++]=Ue}function Xe(Ue){Le(Ue&255),Le(Ue>>>8&255)}function Pe(Ue){Le(Ue>>8&255),Le(Ue&255&255)}function ke(Ue,it){let tt,qe=it;q>16-qe?(tt=Ue,j|=tt<>>16-q,q+=qe-16):(j|=Ue<=8&&(Le(j&255),j>>>=8,q-=8)}function $e(){ke(QQ<<1,3),Pt(256,Wa.static_ltree),Ae(),1+z+10-q<9&&(ke(QQ<<1,3),Pt(256,Wa.static_ltree),Ae()),z=7}function Qe(Ue,it){let tt,qe,dt;if(e.dist_buf[H]=Ue,e.lc_buf[H]=it&255,H++,Ue===0?w[it*2]++:(ee++,Ue--,w[(cr._length_code[it]+256+1)*2]++,N[cr.d_code(Ue)*2]++),!(H&8191)&&b>2){for(tt=H*8,qe=G-C,dt=0;dt<30;dt++)tt+=N[dt*2]*(5+cr.extra_dbits[dt]);if(tt>>>=3,ee8?Xe(j):q>0&&Le(j&255),j=0,q=0}function pe(Ue,it,tt){kt(),z=8,tt&&(Xe(it),Xe(~it)),e.pending_buf.set(c.subarray(Ue,Ue+it),e.pending),e.pending+=it}function Ve(Ue,it,tt){ke((qtt<<1)+(tt?1:0),3),pe(Ue,it,!0)}function Dt(Ue,it,tt){let qe,dt,Bt=0;b>0?(U.build_tree(e),O.build_tree(e),Bt=Se(),qe=e.opt_len+3+7>>>3,dt=e.static_len+3+7>>>3,dt<=qe&&(qe=dt)):qe=dt=it+5,it+4<=qe&&Ue!=-1?Ve(Ue,it,tt):dt==qe?(ke((QQ<<1)+(tt?1:0),3),je(Wa.static_ltree,Wa.static_dtree)):(ke(($tt<<1)+(tt?1:0),3),ht(U.max_code+1,O.max_code+1,Bt+1),je(w,N)),Te(),tt&&kt()}function bt(Ue){Dt(C>=0?C:-1,G-C,Ue),C=G,t.flush_pending()}function li(){let Ue,it,tt,qe;do{if(qe=d-v-G,qe===0&&G===0&&v===0)qe=r;else if(qe==-1)qe--;else if(G>=r+r-Md){c.set(c.subarray(r,r+r),0),X-=r,G-=r,C-=r,Ue=g,tt=Ue;do it=m[--tt]&65535,m[tt]=it>=r?it-r:0;while(--Ue!==0);Ue=r,tt=Ue;do it=u[--tt]&65535,u[tt]=it>=r?it-r:0;while(--Ue!==0);qe+=r}if(t.avail_in===0)return;Ue=t.read_buf(c,G+v,qe),v+=Ue,v>=gr&&(p=c[G]&255,p=(p<<_^c[G+1]&255)&x)}while(vi-5&&(it=i-5);;){if(v<=1){if(li(),v===0&&Ue==0)return Qu;if(v===0)break}if(G+=v,v=0,tt=C+it,(G===0||G>=tt)&&(v=G-tt,G=tt,bt(!1),t.avail_out===0)||G-C>=r-Md&&(bt(!1),t.avail_out===0))return Qu}return bt(Ue==4),t.avail_out===0?Ue==4?Ev:Qu:Ue==4?hU:mU}function Rs(Ue){let it=F,tt=G,qe,dt,Bt=P,Ln=G>r-Md?G-(r-Md):0,Lo=I,nr=a,Na=G+bU,ka=c[tt+Bt-1],io=c[tt+Bt];P>=E&&(it>>=2),Lo>v&&(Lo=v);do if(qe=Ue,!(c[qe+Bt]!=io||c[qe+Bt-1]!=ka||c[qe]!=c[tt]||c[++qe]!=c[tt+1])){tt+=2,qe++;do;while(c[++tt]==c[++qe]&&c[++tt]==c[++qe]&&c[++tt]==c[++qe]&&c[++tt]==c[++qe]&&c[++tt]==c[++qe]&&c[++tt]==c[++qe]&&c[++tt]==c[++qe]&&c[++tt]==c[++qe]&&ttBt){if(X=Ue,Bt=dt,dt>=Lo)break;ka=c[tt+Bt-1],io=c[tt+Bt]}}while((Ue=u[Ue&nr]&65535)>Ln&&--it!==0);return Bt<=v?Bt:v}function zs(Ue){let it=0,tt;for(;;){if(v=gr&&(p=(p<<_^c[G+(gr-1)]&255)&x,it=m[p]&65535,u[G&a]=m[p],m[p]=G),it!==0&&(G-it&65535)<=r-Md&&R!=2&&(V=Rs(it)),V>=gr)if(tt=Qe(G-X,V-gr),v-=V,V<=A&&v>=gr){V--;do G++,p=(p<<_^c[G+(gr-1)]&255)&x,it=m[p]&65535,u[G&a]=m[p],m[p]=G;while(--V!==0);G++}else G+=V,V=0,p=c[G]&255,p=(p<<_^c[G+1]&255)&x;else tt=Qe(0,c[G]&255),v--,G++;if(tt&&(bt(!1),t.avail_out===0))return Qu}return bt(Ue==4),t.avail_out===0?Ue==4?Ev:Qu:Ue==4?hU:mU}function Nr(Ue){let it=0,tt,qe;for(;;){if(v=gr&&(p=(p<<_^c[G+(gr-1)]&255)&x,it=m[p]&65535,u[G&a]=m[p],m[p]=G),P=V,L=X,V=gr-1,it!==0&&P4096)&&(V=gr-1)),P>=gr&&V<=P){qe=G+v-gr,tt=Qe(G-1-L,P-gr),v-=P-1,P-=2;do++G<=qe&&(p=(p<<_^c[G+(gr-1)]&255)&x,it=m[p]&65535,u[G&a]=m[p],m[p]=G);while(--P!==0);if(Z=0,V=gr-1,G++,tt&&(bt(!1),t.avail_out===0))return Qu}else if(Z!==0){if(tt=Qe(0,c[G-1]&255),tt&&bt(!1),G++,v--,t.avail_out===0)return Qu}else Z=1,G++,v--}return Z!==0&&(tt=Qe(0,c[G-1]&255),Z=0),bt(Ue==4),t.avail_out===0?Ue==4?Ev:Qu:Ue==4?hU:mU}function $r(Ue){return Ue.total_in=Ue.total_out=0,Ue.msg=null,e.pending=0,e.pending_out=0,n=fU,o=0,ae(),be(),0}e.deflateInit=function(Ue,it,tt,qe,dt,Bt){return qe||(qe=JQ),dt||(dt=Qtt),Bt||(Bt=0),Ue.msg=null,it==-1&&(it=6),dt<1||dt>Jtt||qe!=JQ||tt<9||tt>15||it<0||it>9||Bt<0||Bt>2?-2:(Ue.dstate=e,s=tt,r=1<9||tt<0||tt>2?-2:(bh[b].func!=bh[it].func&&Ue.total_in!==0&&(qe=Ue.deflate(1)),b!=it&&(b=it,A=bh[b].max_lazy,E=bh[b].good_length,I=bh[b].nice_length,F=bh[b].max_chain),R=tt,qe)},e.deflateSetDictionary=function(Ue,it,tt){let qe=tt,dt,Bt=0;if(!it||n!=KQ)return-2;if(qer-Md&&(qe=r-Md,Bt=tt-qe),c.set(it.subarray(Bt,Bt+qe),0),G=qe,C=qe,p=c[0]&255,p=(p<<_^c[1]&255)&x,dt=0;dt<=qe-gr;dt++)p=(p<<_^c[dt+(gr-1)]&255)&x,u[dt&a]=m[p],m[p]=dt;return 0},e.deflate=function(Ue,it){let tt,qe,dt,Bt,Ln;if(it>4||it<0)return-2;if(!Ue.next_out||!Ue.next_in&&Ue.avail_in!==0||n==Xv&&it!=4)return Ue.msg=uU[4],-2;if(Ue.avail_out===0)return Ue.msg=uU[7],-5;if(t=Ue,Bt=o,o=it,n==KQ&&(qe=JQ+(s-8<<4)<<8,dt=(b-1&255)>>1,dt>3&&(dt=3),qe|=dt<<6,G!==0&&(qe|=jtt),qe+=31-qe%31,n=fU,Pe(qe)),e.pending!==0){if(t.flush_pending(),t.avail_out===0)return o=-1,0}else if(t.avail_in===0&&it<=Bt&&it!=4)return t.msg=uU[7],-5;if(n==Xv&&t.avail_in!==0)return Ue.msg=uU[7],-5;if(t.avail_in!==0||v!==0||it!=0&&n!=Xv){switch(Ln=-1,bh[b].func){case d0e:Ln=Vo(it);break;case pU:Ln=zs(it);break;case yT:Ln=Nr(it);break;default:}if((Ln==Ev||Ln==hU)&&(n=Xv),Ln==Qu||Ln==Ev)return t.avail_out===0&&(o=-1),0;if(Ln==mU){if(it==1)$e();else if(Ve(0,0,!1),it==3)for(tt=0;ttn&&(o=n),o===0?0:(i.avail_in-=o,e.set(i.next_in.subarray(i.next_in_index,i.next_in_index+o),t),i.next_in_index+=o,i.total_in+=o,o)},flush_pending(){let e=this,t=e.dstate.pending;t>e.avail_out&&(t=e.avail_out),t!==0&&(e.next_out.set(e.dstate.pending_buf.subarray(e.dstate.pending_out,e.dstate.pending_out+t),e.next_out_index),e.next_out_index+=t,e.dstate.pending_out+=t,e.total_out+=t,e.avail_out-=t,e.dstate.pending-=t,e.dstate.pending===0&&(e.dstate.pending_out=0))}};function m0e(e){let t=this,n=new u0e,i=tnt(e&&e.chunkSize?e.chunkSize:64*1024),o=0,r=new Uint8Array(i),s=e?e.level:-1;typeof s>"u"&&(s=-1),n.deflateInit(s),n.next_out=r,t.append=function(a,c){let d,u,m=0,p=0,g=0,f=[];if(a.length){n.next_in_index=0,n.next_in=a,n.avail_in=a.length;do{if(n.next_out_index=0,n.avail_out=i,d=n.deflate(o),d!=0)throw new Error("deflating: "+n.msg);n.next_out_index&&(n.next_out_index==i?f.push(new Uint8Array(r)):f.push(r.subarray(0,n.next_out_index))),g+=n.next_out_index,c&&n.next_in_index>0&&n.next_in_index!=m&&(c(n.next_in_index),m=n.next_in_index)}while(n.avail_in>0||n.avail_out===0);return f.length>1?(u=new Uint8Array(g),f.forEach(function(x){u.set(x,p),p+=x.length})):u=f[0]?new Uint8Array(f[0]):new Uint8Array,u}},t.flush=function(){let a,c,d=0,u=0,m=[];do{if(n.next_out_index=0,n.avail_out=i,a=n.deflate(4),a!=1&&a!=0)throw new Error("deflating: "+n.msg);i-n.avail_out>0&&m.push(r.slice(0,n.next_out_index)),u+=n.next_out_index}while(n.avail_in>0||n.avail_out===0);return n.deflateEnd(),c=new Uint8Array(u),m.forEach(function(p){c.set(p,d),d+=p.length}),c}}function tnt(e){return e+5*(Math.floor(e/16383)+1)}var Uyi=T(S(),1);var Nd=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535],W0e=1440,nnt=0,int=4,ont=9,rnt=5,snt=[96,7,256,0,8,80,0,8,16,84,8,115,82,7,31,0,8,112,0,8,48,0,9,192,80,7,10,0,8,96,0,8,32,0,9,160,0,8,0,0,8,128,0,8,64,0,9,224,80,7,6,0,8,88,0,8,24,0,9,144,83,7,59,0,8,120,0,8,56,0,9,208,81,7,17,0,8,104,0,8,40,0,9,176,0,8,8,0,8,136,0,8,72,0,9,240,80,7,4,0,8,84,0,8,20,85,8,227,83,7,43,0,8,116,0,8,52,0,9,200,81,7,13,0,8,100,0,8,36,0,9,168,0,8,4,0,8,132,0,8,68,0,9,232,80,7,8,0,8,92,0,8,28,0,9,152,84,7,83,0,8,124,0,8,60,0,9,216,82,7,23,0,8,108,0,8,44,0,9,184,0,8,12,0,8,140,0,8,76,0,9,248,80,7,3,0,8,82,0,8,18,85,8,163,83,7,35,0,8,114,0,8,50,0,9,196,81,7,11,0,8,98,0,8,34,0,9,164,0,8,2,0,8,130,0,8,66,0,9,228,80,7,7,0,8,90,0,8,26,0,9,148,84,7,67,0,8,122,0,8,58,0,9,212,82,7,19,0,8,106,0,8,42,0,9,180,0,8,10,0,8,138,0,8,74,0,9,244,80,7,5,0,8,86,0,8,22,192,8,0,83,7,51,0,8,118,0,8,54,0,9,204,81,7,15,0,8,102,0,8,38,0,9,172,0,8,6,0,8,134,0,8,70,0,9,236,80,7,9,0,8,94,0,8,30,0,9,156,84,7,99,0,8,126,0,8,62,0,9,220,82,7,27,0,8,110,0,8,46,0,9,188,0,8,14,0,8,142,0,8,78,0,9,252,96,7,256,0,8,81,0,8,17,85,8,131,82,7,31,0,8,113,0,8,49,0,9,194,80,7,10,0,8,97,0,8,33,0,9,162,0,8,1,0,8,129,0,8,65,0,9,226,80,7,6,0,8,89,0,8,25,0,9,146,83,7,59,0,8,121,0,8,57,0,9,210,81,7,17,0,8,105,0,8,41,0,9,178,0,8,9,0,8,137,0,8,73,0,9,242,80,7,4,0,8,85,0,8,21,80,8,258,83,7,43,0,8,117,0,8,53,0,9,202,81,7,13,0,8,101,0,8,37,0,9,170,0,8,5,0,8,133,0,8,69,0,9,234,80,7,8,0,8,93,0,8,29,0,9,154,84,7,83,0,8,125,0,8,61,0,9,218,82,7,23,0,8,109,0,8,45,0,9,186,0,8,13,0,8,141,0,8,77,0,9,250,80,7,3,0,8,83,0,8,19,85,8,195,83,7,35,0,8,115,0,8,51,0,9,198,81,7,11,0,8,99,0,8,35,0,9,166,0,8,3,0,8,131,0,8,67,0,9,230,80,7,7,0,8,91,0,8,27,0,9,150,84,7,67,0,8,123,0,8,59,0,9,214,82,7,19,0,8,107,0,8,43,0,9,182,0,8,11,0,8,139,0,8,75,0,9,246,80,7,5,0,8,87,0,8,23,192,8,0,83,7,51,0,8,119,0,8,55,0,9,206,81,7,15,0,8,103,0,8,39,0,9,174,0,8,7,0,8,135,0,8,71,0,9,238,80,7,9,0,8,95,0,8,31,0,9,158,84,7,99,0,8,127,0,8,63,0,9,222,82,7,27,0,8,111,0,8,47,0,9,190,0,8,15,0,8,143,0,8,79,0,9,254,96,7,256,0,8,80,0,8,16,84,8,115,82,7,31,0,8,112,0,8,48,0,9,193,80,7,10,0,8,96,0,8,32,0,9,161,0,8,0,0,8,128,0,8,64,0,9,225,80,7,6,0,8,88,0,8,24,0,9,145,83,7,59,0,8,120,0,8,56,0,9,209,81,7,17,0,8,104,0,8,40,0,9,177,0,8,8,0,8,136,0,8,72,0,9,241,80,7,4,0,8,84,0,8,20,85,8,227,83,7,43,0,8,116,0,8,52,0,9,201,81,7,13,0,8,100,0,8,36,0,9,169,0,8,4,0,8,132,0,8,68,0,9,233,80,7,8,0,8,92,0,8,28,0,9,153,84,7,83,0,8,124,0,8,60,0,9,217,82,7,23,0,8,108,0,8,44,0,9,185,0,8,12,0,8,140,0,8,76,0,9,249,80,7,3,0,8,82,0,8,18,85,8,163,83,7,35,0,8,114,0,8,50,0,9,197,81,7,11,0,8,98,0,8,34,0,9,165,0,8,2,0,8,130,0,8,66,0,9,229,80,7,7,0,8,90,0,8,26,0,9,149,84,7,67,0,8,122,0,8,58,0,9,213,82,7,19,0,8,106,0,8,42,0,9,181,0,8,10,0,8,138,0,8,74,0,9,245,80,7,5,0,8,86,0,8,22,192,8,0,83,7,51,0,8,118,0,8,54,0,9,205,81,7,15,0,8,102,0,8,38,0,9,173,0,8,6,0,8,134,0,8,70,0,9,237,80,7,9,0,8,94,0,8,30,0,9,157,84,7,99,0,8,126,0,8,62,0,9,221,82,7,27,0,8,110,0,8,46,0,9,189,0,8,14,0,8,142,0,8,78,0,9,253,96,7,256,0,8,81,0,8,17,85,8,131,82,7,31,0,8,113,0,8,49,0,9,195,80,7,10,0,8,97,0,8,33,0,9,163,0,8,1,0,8,129,0,8,65,0,9,227,80,7,6,0,8,89,0,8,25,0,9,147,83,7,59,0,8,121,0,8,57,0,9,211,81,7,17,0,8,105,0,8,41,0,9,179,0,8,9,0,8,137,0,8,73,0,9,243,80,7,4,0,8,85,0,8,21,80,8,258,83,7,43,0,8,117,0,8,53,0,9,203,81,7,13,0,8,101,0,8,37,0,9,171,0,8,5,0,8,133,0,8,69,0,9,235,80,7,8,0,8,93,0,8,29,0,9,155,84,7,83,0,8,125,0,8,61,0,9,219,82,7,23,0,8,109,0,8,45,0,9,187,0,8,13,0,8,141,0,8,77,0,9,251,80,7,3,0,8,83,0,8,19,85,8,195,83,7,35,0,8,115,0,8,51,0,9,199,81,7,11,0,8,99,0,8,35,0,9,167,0,8,3,0,8,131,0,8,67,0,9,231,80,7,7,0,8,91,0,8,27,0,9,151,84,7,67,0,8,123,0,8,59,0,9,215,82,7,19,0,8,107,0,8,43,0,9,183,0,8,11,0,8,139,0,8,75,0,9,247,80,7,5,0,8,87,0,8,23,192,8,0,83,7,51,0,8,119,0,8,55,0,9,207,81,7,15,0,8,103,0,8,39,0,9,175,0,8,7,0,8,135,0,8,71,0,9,239,80,7,9,0,8,95,0,8,31,0,9,159,84,7,99,0,8,127,0,8,63,0,9,223,82,7,27,0,8,111,0,8,47,0,9,191,0,8,15,0,8,143,0,8,79,0,9,255],ant=[80,5,1,87,5,257,83,5,17,91,5,4097,81,5,5,89,5,1025,85,5,65,93,5,16385,80,5,3,88,5,513,84,5,33,92,5,8193,82,5,9,90,5,2049,86,5,129,192,5,24577,80,5,2,87,5,385,83,5,25,91,5,6145,81,5,7,89,5,1537,85,5,97,93,5,24577,80,5,4,88,5,769,84,5,49,92,5,12289,82,5,13,90,5,3073,86,5,193,192,5,24577],cnt=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],lnt=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,112,112],dnt=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],unt=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],dy=15;function e4(){let e=this,t,n,i,o,r,s;function a(d,u,m,p,g,f,x,_,C,V,L){let Z,G,X,v,P,F,A,b,R,E,I,w,N,B,U;E=0,P=m;do i[d[u+E]]++,E++,P--;while(P!==0);if(i[0]==m)return x[0]=-1,_[0]=0,0;for(b=_[0],F=1;F<=dy&&i[F]===0;F++);for(A=F,bP&&(b=P),_[0]=b,B=1<w+b;){if(v++,w+=b,U=X-w,U=U>b?b:U,(G=1<<(F=A-w))>Z+1&&(G-=Z+1,N=A,FW0e)return-3;r[v]=I=V[0],V[0]+=U,v!==0?(s[v]=P,o[0]=F,o[1]=b,F=P>>>w-b,o[2]=I-r[v-1]-F,C.set(o,(r[v-1]+F)*3)):x[0]=I}for(o[1]=A-w,E>=m?o[0]=192:L[E]>>w;F>>=1)P^=F;for(P^=F,R=(1<257?(V==-3?C.msg="oversubscribed distance tree":V==-5?(C.msg="incomplete distance tree",V=-3):V!=-4&&(C.msg="empty distance tree with lengths",V=-3),V):0)}}e4.inflate_trees_fixed=function(e,t,n,i){return e[0]=ont,t[0]=rnt,n[0]=snt,i[0]=ant,0};var xU=0,h0e=1,f0e=2,p0e=3,b0e=4,g0e=5,y0e=6,jQ=7,x0e=8,_U=9;function mnt(){let e=this,t,n=0,i,o=0,r=0,s=0,a=0,c=0,d=0,u=0,m,p=0,g,f=0;function x(_,C,V,L,Z,G,X,v){let P,F,A,b,R,E,I,w,N,B,U,O,k,J,H,ee;I=v.next_in_index,w=v.avail_in,R=X.bitb,E=X.bitk,N=X.write,B=N>=F[ee+1],E-=F[ee+1],X.win[N++]=F[ee+2],B--;continue}do{if(R>>=F[ee+1],E-=F[ee+1],b&16){for(b&=15,k=F[ee+2]+(R&Nd[b]),R>>=b,E-=b;E<15;)w--,R|=(v.read_byte(I++)&255)<>=F[ee+1],E-=F[ee+1],b&16){for(b&=15;E>=b,E-=b,B-=k,N>=J)H=N-J,N-H>0&&2>N-H?(X.win[N++]=X.win[H++],X.win[N++]=X.win[H++],k-=2):(X.win.set(X.win.subarray(H,H+2),N),N+=2,H+=2,k-=2);else{H=N-J;do H+=X.end;while(H<0);if(b=X.end-H,k>b){if(k-=b,N-H>0&&b>N-H)do X.win[N++]=X.win[H++];while(--b!==0);else X.win.set(X.win.subarray(H,H+b),N),N+=b,H+=b,b=0;H=0}}if(N-H>0&&k>N-H)do X.win[N++]=X.win[H++];while(--k!==0);else X.win.set(X.win.subarray(H,H+k),N),N+=k,H+=k,k=0;break}else if(!(b&64))P+=F[ee+2],P+=R&Nd[b],ee=(A+P)*3,b=F[ee];else return v.msg="invalid distance code",k=v.avail_in-w,k=E>>3>3:k,w+=k,I-=k,E-=k<<3,X.bitb=R,X.bitk=E,v.avail_in=w,v.total_in+=I-v.next_in_index,v.next_in_index=I,X.write=N,-3;while(!0);break}if(b&64)return b&32?(k=v.avail_in-w,k=E>>3>3:k,w+=k,I-=k,E-=k<<3,X.bitb=R,X.bitk=E,v.avail_in=w,v.total_in+=I-v.next_in_index,v.next_in_index=I,X.write=N,1):(v.msg="invalid literal/length code",k=v.avail_in-w,k=E>>3>3:k,w+=k,I-=k,E-=k<<3,X.bitb=R,X.bitk=E,v.avail_in=w,v.total_in+=I-v.next_in_index,v.next_in_index=I,X.write=N,-3);if(P+=F[ee+2],P+=R&Nd[b],ee=(A+P)*3,(b=F[ee])===0){R>>=F[ee+1],E-=F[ee+1],X.win[N++]=F[ee+2],B--;break}}while(!0)}while(B>=258&&w>=10);return k=v.avail_in-w,k=E>>3>3:k,w+=k,I-=k,E-=k<<3,X.bitb=R,X.bitk=E,v.avail_in=w,v.total_in+=I-v.next_in_index,v.next_in_index=I,X.write=N,0}e.init=function(_,C,V,L,Z,G){t=xU,d=_,u=C,m=V,p=L,g=Z,f=G,i=null},e.proc=function(_,C,V){let L,Z,G,X=0,v=0,P=0,F,A,b,R;for(P=C.next_in_index,F=C.avail_in,X=_.bitb,v=_.bitk,A=_.write,b=A<_.read?_.read-A-1:_.end-A;;)switch(t){case xU:if(b>=258&&F>=10&&(_.bitb=X,_.bitk=v,C.avail_in=F,C.total_in+=P-C.next_in_index,C.next_in_index=P,_.write=A,V=x(d,u,m,p,g,f,_,C),P=C.next_in_index,F=C.avail_in,X=_.bitb,v=_.bitk,A=_.write,b=A<_.read?_.read-A-1:_.end-A,V!=0)){t=V==1?jQ:_U;break}r=d,i=m,o=p,t=h0e;case h0e:for(L=r;v>>=i[Z+1],v-=i[Z+1],G=i[Z],G===0){s=i[Z+2],t=y0e;break}if(G&16){a=G&15,n=i[Z+2],t=f0e;break}if(!(G&64)){r=G,o=Z/3+i[Z+2];break}if(G&32){t=jQ;break}return t=_U,C.msg="invalid literal/length code",V=-3,_.bitb=X,_.bitk=v,C.avail_in=F,C.total_in+=P-C.next_in_index,C.next_in_index=P,_.write=A,_.inflate_flush(C,V);case f0e:for(L=a;v>=L,v-=L,r=u,i=g,o=f,t=p0e;case p0e:for(L=r;v>=i[Z+1],v-=i[Z+1],G=i[Z],G&16){a=G&15,c=i[Z+2],t=b0e;break}if(!(G&64)){r=G,o=Z/3+i[Z+2];break}return t=_U,C.msg="invalid distance code",V=-3,_.bitb=X,_.bitk=v,C.avail_in=F,C.total_in+=P-C.next_in_index,C.next_in_index=P,_.write=A,_.inflate_flush(C,V);case b0e:for(L=a;v>=L,v-=L,t=g0e;case g0e:for(R=A-c;R<0;)R+=_.end;for(;n!==0;){if(b===0&&(A==_.end&&_.read!==0&&(A=0,b=A<_.read?_.read-A-1:_.end-A),b===0&&(_.write=A,V=_.inflate_flush(C,V),A=_.write,b=A<_.read?_.read-A-1:_.end-A,A==_.end&&_.read!==0&&(A=0,b=A<_.read?_.read-A-1:_.end-A),b===0)))return _.bitb=X,_.bitk=v,C.avail_in=F,C.total_in+=P-C.next_in_index,C.next_in_index=P,_.write=A,_.inflate_flush(C,V);_.win[A++]=_.win[R++],b--,R==_.end&&(R=0),n--}t=xU;break;case y0e:if(b===0&&(A==_.end&&_.read!==0&&(A=0,b=A<_.read?_.read-A-1:_.end-A),b===0&&(_.write=A,V=_.inflate_flush(C,V),A=_.write,b=A<_.read?_.read-A-1:_.end-A,A==_.end&&_.read!==0&&(A=0,b=A<_.read?_.read-A-1:_.end-A),b===0)))return _.bitb=X,_.bitk=v,C.avail_in=F,C.total_in+=P-C.next_in_index,C.next_in_index=P,_.write=A,_.inflate_flush(C,V);V=0,_.win[A++]=s,b--,t=xU;break;case jQ:if(v>7&&(v-=8,F++,P--),_.write=A,V=_.inflate_flush(C,V),A=_.write,b=A<_.read?_.read-A-1:_.end-A,_.read!=_.write)return _.bitb=X,_.bitk=v,C.avail_in=F,C.total_in+=P-C.next_in_index,C.next_in_index=P,_.write=A,_.inflate_flush(C,V);t=x0e;case x0e:return V=1,_.bitb=X,_.bitk=v,C.avail_in=F,C.total_in+=P-C.next_in_index,C.next_in_index=P,_.write=A,_.inflate_flush(C,V);case _U:return V=-3,_.bitb=X,_.bitk=v,C.avail_in=F,C.total_in+=P-C.next_in_index,C.next_in_index=P,_.write=A,_.inflate_flush(C,V);default:return V=-2,_.bitb=X,_.bitk=v,C.avail_in=F,C.total_in+=P-C.next_in_index,C.next_in_index=P,_.write=A,_.inflate_flush(C,V)}},e.free=function(){}}var _0e=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],_V=0,qQ=1,T0e=2,S0e=3,C0e=4,V0e=5,TU=6,SU=7,L0e=8,xT=9;function hnt(e,t){let n=this,i=_V,o=0,r=0,s=0,a,c=[0],d=[0],u=new mnt,m=0,p=new Int32Array(W0e*3),g=0,f=new e4;n.bitk=0,n.bitb=0,n.win=new Uint8Array(t),n.end=t,n.read=0,n.write=0,n.reset=function(x,_){_&&(_[0]=g),i==TU&&u.free(x),i=_V,n.bitk=0,n.bitb=0,n.read=n.write=0},n.reset(e,null),n.inflate_flush=function(x,_){let C,V,L;return V=x.next_out_index,L=n.read,C=(L<=n.write?n.write:n.end)-L,C>x.avail_out&&(C=x.avail_out),C!==0&&_==-5&&(_=0),x.avail_out-=C,x.total_out+=C,x.next_out.set(n.win.subarray(L,L+C),V),V+=C,L+=C,L==n.end&&(L=0,n.write==n.end&&(n.write=0),C=n.write-L,C>x.avail_out&&(C=x.avail_out),C!==0&&_==-5&&(_=0),x.avail_out-=C,x.total_out+=C,x.next_out.set(n.win.subarray(L,L+C),V),V+=C,L+=C),x.next_out_index=V,n.read=L,_},n.proc=function(x,_){let C,V,L,Z,G,X,v,P;for(Z=x.next_in_index,G=x.avail_in,V=n.bitb,L=n.bitk,X=n.write,v=X>>1){case 0:V>>>=3,L-=3,C=L&7,V>>>=C,L-=C,i=qQ;break;case 1:F=[],A=[],b=[[]],R=[[]],e4.inflate_trees_fixed(F,A,b,R),u.init(F[0],A[0],b[0],0,R[0],0),V>>>=3,L-=3,i=TU;break;case 2:V>>>=3,L-=3,i=S0e;break;case 3:return V>>>=3,L-=3,i=xT,x.msg="invalid block type",_=-3,n.bitb=V,n.bitk=L,x.avail_in=G,x.total_in+=Z-x.next_in_index,x.next_in_index=Z,n.write=X,n.inflate_flush(x,_)}break;case qQ:for(;L<32;){if(G!==0)_=0;else return n.bitb=V,n.bitk=L,x.avail_in=G,x.total_in+=Z-x.next_in_index,x.next_in_index=Z,n.write=X,n.inflate_flush(x,_);G--,V|=(x.read_byte(Z++)&255)<>>16&65535)!=(V&65535))return i=xT,x.msg="invalid stored block lengths",_=-3,n.bitb=V,n.bitk=L,x.avail_in=G,x.total_in+=Z-x.next_in_index,x.next_in_index=Z,n.write=X,n.inflate_flush(x,_);o=V&65535,V=L=0,i=o!==0?T0e:m!==0?SU:_V;break;case T0e:if(G===0||v===0&&(X==n.end&&n.read!==0&&(X=0,v=XG&&(C=G),C>v&&(C=v),n.win.set(x.read_buf(Z,C),X),Z+=C,G-=C,X+=C,v-=C,(o-=C)!==0)break;i=m!==0?SU:_V;break;case S0e:for(;L<14;){if(G!==0)_=0;else return n.bitb=V,n.bitk=L,x.avail_in=G,x.total_in+=Z-x.next_in_index,x.next_in_index=Z,n.write=X,n.inflate_flush(x,_);G--,V|=(x.read_byte(Z++)&255)<29||(C>>5&31)>29)return i=xT,x.msg="too many length or distance symbols",_=-3,n.bitb=V,n.bitk=L,x.avail_in=G,x.total_in+=Z-x.next_in_index,x.next_in_index=Z,n.write=X,n.inflate_flush(x,_);if(C=258+(C&31)+(C>>5&31),!a||a.length>>=14,L-=14,s=0,i=C0e;case C0e:for(;s<4+(r>>>10);){for(;L<3;){if(G!==0)_=0;else return n.bitb=V,n.bitk=L,x.avail_in=G,x.total_in+=Z-x.next_in_index,x.next_in_index=Z,n.write=X,n.inflate_flush(x,_);G--,V|=(x.read_byte(Z++)&255)<>>=3,L-=3}for(;s<19;)a[_0e[s++]]=0;if(c[0]=7,C=f.inflate_trees_bits(a,c,d,p,x),C!=0)return _=C,_==-3&&(a=null,i=xT),n.bitb=V,n.bitk=L,x.avail_in=G,x.total_in+=Z-x.next_in_index,x.next_in_index=Z,n.write=X,n.inflate_flush(x,_);s=0,i=V0e;case V0e:for(;C=r,!(s>=258+(C&31)+(C>>5&31));){let B,U;for(C=c[0];L>>=C,L-=C,a[s++]=U;else{for(P=U==18?7:U-14,B=U==18?11:3;L>>=C,L-=C,B+=V&Nd[P],V>>>=P,L-=P,P=s,C=r,P+B>258+(C&31)+(C>>5&31)||U==16&&P<1)return a=null,i=xT,x.msg="invalid bit length repeat",_=-3,n.bitb=V,n.bitk=L,x.avail_in=G,x.total_in+=Z-x.next_in_index,x.next_in_index=Z,n.write=X,n.inflate_flush(x,_);U=U==16?a[P-1]:0;do a[P++]=U;while(--B!==0);s=P}}if(d[0]=-1,E=[],I=[],w=[],N=[],E[0]=9,I[0]=6,C=r,C=f.inflate_trees_dynamic(257+(C&31),1+(C>>5&31),a,E,I,w,N,p,x),C!=0)return C==-3&&(a=null,i=xT),_=C,n.bitb=V,n.bitk=L,x.avail_in=G,x.total_in+=Z-x.next_in_index,x.next_in_index=Z,n.write=X,n.inflate_flush(x,_);u.init(E[0],I[0],p,w[0],p,N[0]),i=TU;case TU:if(n.bitb=V,n.bitk=L,x.avail_in=G,x.total_in+=Z-x.next_in_index,x.next_in_index=Z,n.write=X,(_=u.proc(n,x,_))!=1)return n.inflate_flush(x,_);if(_=0,u.free(x),Z=x.next_in_index,G=x.avail_in,V=n.bitb,L=n.bitk,X=n.write,v=X15?(e.inflateEnd(n),-2):(e.wbits=i,n.istate.blocks=new hnt(n,1<>4)+8>s.wbits){s.mode=uy,n.msg="invalid win size",s.marker=5;break}s.mode=R0e;case R0e:if(n.avail_in===0)return o;if(o=i,n.avail_in--,n.total_in++,r=n.read_byte(n.next_in_index++)&255,((s.method<<8)+r)%31!==0){s.mode=uy,n.msg="incorrect header check",s.marker=5;break}if(!(r&fnt)){s.mode=Iv;break}s.mode=Z0e;case Z0e:if(n.avail_in===0)return o;o=i,n.avail_in--,n.total_in++,s.need=(n.read_byte(n.next_in_index++)&255)<<24&4278190080,s.mode=G0e;case G0e:if(n.avail_in===0)return o;o=i,n.avail_in--,n.total_in++,s.need+=(n.read_byte(n.next_in_index++)&255)<<16&16711680,s.mode=E0e;case E0e:if(n.avail_in===0)return o;o=i,n.avail_in--,n.total_in++,s.need+=(n.read_byte(n.next_in_index++)&255)<<8&65280,s.mode=X0e;case X0e:return n.avail_in===0?o:(o=i,n.avail_in--,n.total_in++,s.need+=n.read_byte(n.next_in_index++)&255,s.mode=$Q,2);case $Q:return s.mode=uy,n.msg="need dictionary",s.marker=0,-2;case Iv:if(o=s.blocks.proc(n,o),o==-3){s.mode=uy,s.marker=0;break}if(o==0&&(o=i),o!=1)return o;o=i,s.blocks.reset(n,s.was),s.mode=I0e;case I0e:return n.avail_in=0,1;case uy:return-3;default:return-2}},e.inflateSetDictionary=function(n,i,o){let r=0,s=o;if(!n||!n.istate||n.istate.mode!=$Q)return-2;let a=n.istate;return s>=1<0&&n.next_in_index!=p&&(c(n.next_in_index),p=n.next_in_index)}while(n.avail_in>0||n.avail_out===0);return d.length>1?(m=new Uint8Array(f),d.forEach(function(x){m.set(x,g),g+=x.length})):m=d[0]?new Uint8Array(d[0]):new Uint8Array,m}},t.flush=function(){n.inflateEnd()}}var Qyi=T(S(),1);var Byi=T(S(),1);var TV="/",t4=new Date(2107,11,31),n4=new Date(1980,0,1),zi=void 0,kd="undefined",D0="function";var Oyi=T(S(),1);var Wv=class{constructor(t){return class extends TransformStream{constructor(n,i){let o=new t(i);super({transform(r,s){s.enqueue(o.append(r))},flush(r){let s=o.flush();s&&r.enqueue(s)}})}}}};var xnt=64,w0e=2;try{typeof navigator!=kd&&navigator.hardwareConcurrency&&(w0e=navigator.hardwareConcurrency)}catch{}var _nt={chunkSize:512*1024,maxWorkers:w0e,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,workerScripts:zi,CompressionStreamNative:typeof CompressionStream!=kd&&CompressionStream,DecompressionStreamNative:typeof DecompressionStream!=kd&&DecompressionStream},hy=Object.assign({},_nt);function Pv(){return hy}function CU(e){return Math.max(e.chunkSize,xnt)}function SV(e){let{baseURL:t,chunkSize:n,maxWorkers:i,terminateWorkerTimeout:o,useCompressionStream:r,useWebWorkers:s,Deflate:a,Inflate:c,CompressionStream:d,DecompressionStream:u,workerScripts:m}=e;if(my("baseURL",t),my("chunkSize",n),my("maxWorkers",i),my("terminateWorkerTimeout",o),my("useCompressionStream",r),my("useWebWorkers",s),a&&(hy.CompressionStream=new Wv(a)),c&&(hy.DecompressionStream=new Wv(c)),my("CompressionStream",d),my("DecompressionStream",u),m!==zi){let{deflate:p,inflate:g}=m;if((p||g)&&(hy.workerScripts||(hy.workerScripts={})),p){if(!Array.isArray(p))throw new Error("workerScripts.deflate must be an array");hy.workerScripts.deflate=p}if(g){if(!Array.isArray(g))throw new Error("workerScripts.inflate must be an array");hy.workerScripts.inflate=g}}}function my(e,t){t!==zi&&(hy[e]=t)}var qyi=T(S(),1);var Yxi=T(S(),1);var wxi=T(S(),1);var Wxi=T(S(),1);var ixi=T(S(),1);var exi=T(S(),1),F0e=[];for(let e=0;e<256;e++){let t=e;for(let n=0;n<8;n++)t&1?t=t>>>1^3988292384:t=t>>>1;F0e[e]=t}var B0=class{constructor(t){this.crc=t||-1}append(t){let n=this.crc|0;for(let i=0,o=t.length|0;i>>8^F0e[(n^t[i])&255];this.crc=n}get(){return~this.crc}};var vv=class extends TransformStream{constructor(){let t,n=new B0;super({transform(i,o){n.append(i),o.enqueue(i)},flush(){let i=new Uint8Array(4);new DataView(i.buffer).setUint32(0,n.get()),t.value=i}}),t=this}};var Sxi=T(S(),1);var sxi=T(S(),1);function CV(e){if(typeof TextEncoder==kd){e=unescape(encodeURIComponent(e));let t=new Uint8Array(e.length);for(let n=0;n0&&t&&(e[n-1]=il.partial(t,e[n-1]&2147483648>>t-1,1)),e},partial(e,t,n){return e===32?t:(n?t|0:t<<32-e)+e*1099511627776},getPartial(e){return Math.round(e/1099511627776)||32},_shiftRight(e,t,n,i){for(i===void 0&&(i=[]);t>=32;t-=32)i.push(n),n=0;if(t===0)return i.concat(e);for(let s=0;s>>t),n=e[s]<<32-t;let o=e.length?e[e.length-1]:0,r=il.getPartial(o);return i.push(il.partial(t+r&31,t+r>32?n:i.pop(),1)),i}},wv={bytes:{fromBits(e){let n=il.bitLength(e)/8,i=new Uint8Array(n),o;for(let r=0;r>>24,o<<=8;return i},toBits(e){let t=[],n,i=0;for(n=0;n9007199254740991)throw new Error("Cannot hash more than 2^53 - 1 bits");let r=new Uint32Array(n),s=0;for(let a=t.blockSize+i-(t.blockSize+i&t.blockSize-1);a<=o;a+=t.blockSize)t._block(r.subarray(16*s,16*(s+1))),s+=1;return n.splice(0,16*s),t}finalize(){let e=this,t=e._buffer,n=e._h;t=il.concat(t,[il.partial(1,1)]);for(let i=t.length+2;i&15;i++)t.push(0);for(t.push(Math.floor(e._length/4294967296)),t.push(e._length|0);t.length;)e._block(t.splice(0,16));return e.reset(),n}_f(e,t,n,i){if(e<=19)return t&n|~t&i;if(e<=39)return t^n^i;if(e<=59)return t&n|t&i|n&i;if(e<=79)return t^n^i}_S(e,t){return t<>>32-e}_block(e){let t=this,n=t._h,i=Array(80);for(let d=0;d<16;d++)i[d]=e[d];let o=n[0],r=n[1],s=n[2],a=n[3],c=n[4];for(let d=0;d<=79;d++){d>=16&&(i[d]=t._S(1,i[d-3]^i[d-8]^i[d-14]^i[d-16]));let u=t._S(5,o)+t._f(d,r,s,a)+c+i[d]+t._key[Math.floor(d/20)]|0;c=a,a=s,s=t._S(30,r),r=o,o=u}n[0]=n[0]+o|0,n[1]=n[1]+r|0,n[2]=n[2]+s|0,n[3]=n[3]+a|0,n[4]=n[4]+c|0}};var i4={};i4.aes=class{constructor(e){let t=this;t._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],t._tables[0][0][0]||t._precompute();let n=t._tables[0][4],i=t._tables[1],o=e.length,r,s,a,c=1;if(o!==4&&o!==6&&o!==8)throw new Error("invalid aes key size");for(t._key=[s=e.slice(0),a=[]],r=o;r<4*o+28;r++){let d=s[r-1];(r%o===0||o===8&&r%o===4)&&(d=n[d>>>24]<<24^n[d>>16&255]<<16^n[d>>8&255]<<8^n[d&255],r%o===0&&(d=d<<8^d>>>24^c<<24,c=c<<1^(c>>7)*283)),s[r]=s[r-o]^d}for(let d=0;r;d++,r--){let u=s[d&3?r:r-4];r<=4||d<4?a[d]=u:a[d]=i[0][n[u>>>24]]^i[1][n[u>>16&255]]^i[2][n[u>>8&255]]^i[3][n[u&255]]}}encrypt(e){return this._crypt(e,0)}decrypt(e){return this._crypt(e,1)}_precompute(){let e=this._tables[0],t=this._tables[1],n=e[4],i=t[4],o=[],r=[],s,a,c,d;for(let u=0;u<256;u++)r[(o[u]=u<<1^(u>>7)*283)^u]=u;for(let u=s=0;!n[u];u^=a||1,s=r[s]||1){let m=s^s<<1^s<<2^s<<3^s<<4;m=m>>8^m&255^99,n[u]=m,i[m]=u,d=o[c=o[a=o[u]]];let p=d*16843009^c*65537^a*257^u*16843008,g=o[m]*257^m*16843008;for(let f=0;f<4;f++)e[f][u]=g=g<<24^g>>>8,t[f][m]=p=p<<24^p>>>8}for(let u=0;u<5;u++)e[u]=e[u].slice(0),t[u]=t[u].slice(0)}_crypt(e,t){if(e.length!==4)throw new Error("invalid aes block size");let n=this._key[t],i=n.length/4-2,o=[0,0,0,0],r=this._tables[t],s=r[0],a=r[1],c=r[2],d=r[3],u=r[4],m=e[0]^n[0],p=e[t?3:1]^n[1],g=e[2]^n[2],f=e[t?1:3]^n[3],x=4,_,C,V;for(let L=0;L>>24]^a[p>>16&255]^c[g>>8&255]^d[f&255]^n[x],C=s[p>>>24]^a[g>>16&255]^c[f>>8&255]^d[m&255]^n[x+1],V=s[g>>>24]^a[f>>16&255]^c[m>>8&255]^d[p&255]^n[x+2],f=s[f>>>24]^a[m>>16&255]^c[p>>8&255]^d[g&255]^n[x+3],x+=4,m=_,p=C,g=V;for(let L=0;L<4;L++)o[t?3&-L:L]=u[m>>>24]<<24^u[p>>16&255]<<16^u[g>>8&255]<<8^u[f&255]^n[x++],_=m,m=p,p=g,g=f,f=_;return o}};var M0e={getRandomValues(e){let t=new Uint32Array(e.buffer),n=i=>{let o=987654321,r=4294967295;return function(){return o=36969*(o&65535)+(o>>16)&r,i=18e3*(i&65535)+(i>>16)&r,(((o<<16)+i&r)/4294967296+.5)*(Math.random()>.5?1:-1)}};for(let i=0,o;i>24&255)===255){let t=e>>16&255,n=e>>8&255,i=e&255;t===255?(t=0,n===255?(n=0,i===255?i=0:++i):++n):++t,e=0,e+=t<<16,e+=n<<8,e+=i}else e+=1<<24;return e}incCounter(e){(e[0]=this.incWord(e[0]))===0&&(e[1]=this.incWord(e[1]))}calculate(e,t,n){let i;if(!(i=t.length))return[];let o=il.bitLength(t);for(let r=0;r>5)+1<<2,r,s,a,c,d,u=new ArrayBuffer(o),m=new DataView(u),p=0,g=il;for(t=wv.bytes.toBits(t),d=1;p<(o||1);d++){for(r=s=e.encrypt(g.concat(t,[d])),a=1;ao&&(e=new n().update(e).finalize());for(let r=0;rthis.resolveReady=s),password:O0e(t,n),signed:i,strength:o-1,pending:new Uint8Array})},async transform(s,a){let c=this,{password:d,strength:u,resolveReady:m,ready:p}=c;d?(await Int(c,u,d,ju(s,0,Av[u]+2)),s=ju(s,Av[u]+2),r?a.error(new Error(Y0)):m()):await p;let g=new Uint8Array(s.length-by-(s.length-by)%VV);a.enqueue(B0e(c,s,g,0,by,!0))},async flush(s){let{signed:a,ctr:c,hmac:d,pending:u,ready:m}=this;if(d&&c){await m;let p=ju(u,0,u.length-by),g=ju(u,u.length-by),f=new Uint8Array;if(p.length){let x=Nv(vf,p);d.update(x);let _=c.update(x);f=Mv(vf,_)}if(a){let x=ju(Mv(vf,d.digest()),0,by);for(let _=0;_this.resolveReady=r),password:O0e(t,n),strength:i-1,pending:new Uint8Array})},async transform(r,s){let a=this,{password:c,strength:d,resolveReady:u,ready:m}=a,p=new Uint8Array;c?(p=await Wnt(a,d,c),u()):await m;let g=new Uint8Array(p.length+r.length-r.length%VV);g.set(p,0),s.enqueue(B0e(a,r,g,p.length,0))},async flush(r){let{ctr:s,hmac:a,pending:c,ready:d}=this;if(a&&s){await d;let u=new Uint8Array;if(c.length){let m=s.update(Nv(vf,c));a.update(m),u=Mv(vf,m)}o.signature=Mv(vf,a.digest()).slice(0,by),r.enqueue(s4(u,o.signature))}}}),o=this}};function B0e(e,t,n,i,o,r){let{ctr:s,hmac:a,pending:c}=e,d=t.length-o;c.length&&(t=s4(c,t),n=wnt(n,d-d%VV));let u;for(u=0;u<=d-VV;u+=VV){let m=Nv(vf,ju(t,u,u+VV));r&&a.update(m);let p=s.update(m);r||a.update(p),n.set(Mv(vf,p),u+i)}return e.pending=ju(t,u),n}async function Int(e,t,n,i){let o=await Y0e(e,t,n,ju(i,0,Av[t])),r=ju(i,Av[t]);if(o[0]!=r[0]||o[1]!=r[1])throw new Error(py)}async function Wnt(e,t,n){let i=VU(new Uint8Array(Av[t])),o=await Y0e(e,t,n,i);return s4(i,o)}async function Y0e(e,t,n,i){e.password=null;let o=await Pnt(Snt,n,Lnt,!1,Rnt),r=await vnt(Object.assign({salt:i},r4),o,8*(Fv[t]*2+2)),s=new Uint8Array(r),a=Nv(vf,ju(s,0,Fv[t])),c=Nv(vf,ju(s,Fv[t],Fv[t]*2)),d=ju(s,Fv[t]*2);return Object.assign(e,{keys:{key:a,authentication:c,passwordVerification:d},ctr:new Ent(new Gnt(a),Array.from(Znt)),hmac:new Xnt(c)}),d}async function Pnt(e,t,n,i,o){if(N0e)try{return await kv.importKey(e,t,n,i,o)}catch{return N0e=!1,fy.importKey(t)}else return fy.importKey(t)}async function vnt(e,t,n){if(k0e)try{return await kv.deriveBits(e,t,n)}catch{return k0e=!1,fy.pbkdf2(t,e.salt,r4.iterations,n)}else return fy.pbkdf2(t,e.salt,r4.iterations,n)}function O0e(e,t){return t===zi?CV(e):t}function s4(e,t){let n=e;return e.length+t.length&&(n=new Uint8Array(e.length+t.length),n.set(e,0),n.set(t,e.length)),n}function wnt(e,t){if(t&&t>e.length){let n=e;e=new Uint8Array(t),e.set(n,0)}return e}function ju(e,t,n){return e.subarray(t,n)}function Mv(e,t){return e.fromBits(t)}function Nv(e,t){return e.toBits(t)}var Rxi=T(S(),1);var LV=12,GU=class extends TransformStream{constructor({password:t,passwordVerification:n,checkPasswordOnly:i}){super({start(){Object.assign(this,{password:t,passwordVerification:n}),J0e(this,t)},transform(o,r){let s=this;if(s.password){let a=H0e(s,o.subarray(0,LV));if(s.password=null,a[LV-1]!=s.passwordVerification)throw new Error(py);o=o.subarray(LV)}i?r.error(new Error(Y0)):r.enqueue(H0e(s,o))}})}},EU=class extends TransformStream{constructor({password:t,passwordVerification:n}){super({start(){Object.assign(this,{password:t,passwordVerification:n}),J0e(this,t)},transform(i,o){let r=this,s,a;if(r.password){r.password=null;let c=VU(new Uint8Array(LV));c[LV-1]=r.passwordVerification,s=new Uint8Array(i.length+c.length),s.set(z0e(r,c),0),a=LV}else s=new Uint8Array(i.length),a=0;s.set(z0e(r,i),a),o.enqueue(s)}})}};function H0e(e,t){let n=new Uint8Array(t.length);for(let i=0;i>>24]),o=~e.crcKey2.get(),e.keys=[n,i,o]}function Q0e(e){let t=e.keys[2]|2;return j0e(Math.imul(t,t^1)>>>8)}function j0e(e){return e&255}function K0e(e){return e&4294967295}var q0e="deflate-raw",XU=class extends TransformStream{constructor(t,{chunkSize:n,CompressionStream:i,CompressionStreamNative:o}){super({});let{compressed:r,encrypted:s,useCompressionStream:a,zipCrypto:c,signed:d,level:u}=t,m=this,p,g,f=$0e(super.readable);(!s||c)&&d&&(p=new vv,f=wf(f,p)),r&&(f=tbe(f,a,{level:u,chunkSize:n},o,i)),s&&(c?f=wf(f,new EU(t)):(g=new RU(t),f=wf(f,g))),ebe(m,f,()=>{let x;s&&!c&&(x=g.signature),(!s||c)&&d&&(x=new DataView(p.value.buffer).getUint32(0)),m.signature=x})}},IU=class extends TransformStream{constructor(t,{chunkSize:n,DecompressionStream:i,DecompressionStreamNative:o}){super({});let{zipCrypto:r,encrypted:s,signed:a,signature:c,compressed:d,useCompressionStream:u}=t,m,p,g=$0e(super.readable);s&&(r?g=wf(g,new GU(t)):(p=new LU(t),g=wf(g,p))),d&&(g=tbe(g,u,{chunkSize:n},o,i)),(!s||r)&&a&&(m=new vv,g=wf(g,m)),ebe(this,g,()=>{if((!s||r)&&a){let f=new DataView(m.value.buffer);if(c!=f.getUint32(0,!1))throw new Error(_T)}})}};function $0e(e){return wf(e,new TransformStream({transform(t,n){t&&t.length&&n.enqueue(t)}}))}function ebe(e,t,n){t=wf(t,new TransformStream({flush:n})),Object.defineProperty(e,"readable",{get(){return t}})}function tbe(e,t,n,i,o){try{let r=t&&i?i:o;e=wf(e,new r(q0e,n))}catch{if(t)try{e=wf(e,new o(q0e,n))}catch{return e}else return e}return e}function wf(e,t){return e.pipeThrough(t)}var nbe="message",ibe="start",obe="pull",c4="data",rbe="ack",l4="close",vU="deflate",wU="inflate";var WU=class extends TransformStream{constructor(t,n){super({});let i=this,{codecType:o}=t,r;o.startsWith(vU)?r=XU:o.startsWith(wU)&&(r=IU);let s=0,a=0,c=new r(t,n),d=super.readable,u=new TransformStream({transform(p,g){p&&p.length&&(a+=p.length,g.enqueue(p))},flush(){Object.assign(i,{inputSize:a})}}),m=new TransformStream({transform(p,g){p&&p.length&&(s+=p.length,g.enqueue(p))},flush(){let{signature:p}=c;Object.assign(i,{signature:p,outputSize:s,inputSize:a})}});Object.defineProperty(i,"readable",{get(){return d.pipeThrough(u).pipeThrough(c).pipeThrough(m)}})}},PU=class extends TransformStream{constructor(t){let n;super({transform:i,flush(o){n&&n.length&&o.enqueue(n)}});function i(o,r){if(n){let s=new Uint8Array(n.length+o.length);s.set(n),s.set(o,n.length),o=s,n=null}o.length>t?(r.enqueue(o.slice(0,t)),i(o.slice(t),r)):n=o}}};var Nxi=T(S(),1);var cbe=typeof Worker!=kd;var RV=class{constructor(t,{readable:n,writable:i},{options:o,config:r,streamOptions:s,useWebWorkers:a,transferStreams:c,scripts:d},u){let{signal:m}=s;return Object.assign(t,{busy:!0,readable:n.pipeThrough(new PU(r.chunkSize)).pipeThrough(new u4(n,s),{signal:m}),writable:i,options:Object.assign({},o),scripts:d,transferStreams:c,terminate(){return new Promise(p=>{let{worker:g,busy:f}=t;g?(f?t.resolveTerminated=p:(g.terminate(),p()),t.interface=null):p()})},onTaskFinished(){let{resolveTerminated:p}=t;p&&(t.resolveTerminated=null,t.terminated=!0,t.worker.terminate(),p()),t.busy=!1,u(t)}}),(a&&cbe?Fnt:lbe)(t,r)}},u4=class extends TransformStream{constructor(t,{onstart:n,onprogress:i,size:o,onend:r}){let s=0;super({async start(){n&&await d4(n,o)},async transform(a,c){s+=a.length,i&&await d4(i,s,o),c.enqueue(a)},async flush(){t.size=s,r&&await d4(r,s)}})}};async function d4(e,...t){try{await e(...t)}catch{}}function lbe(e,t){return{run:()=>Ant(e,t)}}function Fnt(e,t){let{baseURL:n,chunkSize:i}=t;if(!e.interface){let o;try{o=knt(e.scripts[0],n,e)}catch{return cbe=!1,lbe(e,t)}Object.assign(e,{worker:o,interface:{run:()=>Mnt(e,{chunkSize:i})}})}return e.interface}async function Ant({options:e,readable:t,writable:n,onTaskFinished:i},o){try{let r=new WU(e,o);await t.pipeThrough(r).pipeTo(n,{preventClose:!0,preventAbort:!0});let{signature:s,inputSize:a,outputSize:c}=r;return{signature:s,inputSize:a,outputSize:c}}finally{i()}}async function Mnt(e,t){let n,i,o=new Promise((p,g)=>{n=p,i=g});Object.assign(e,{reader:null,writer:null,resolveResult:n,rejectResult:i,result:o});let{readable:r,options:s,scripts:a}=e,{writable:c,closed:d}=Nnt(e.writable),u=FU({type:ibe,scripts:a.slice(1),options:s,config:t,readable:r,writable:c},e);u||Object.assign(e,{reader:r.getReader(),writer:c.getWriter()});let m=await o;return u||await c.getWriter().close(),await d,m}function Nnt(e){let t,n=new Promise(o=>t=o);return{writable:new WritableStream({async write(o){let r=e.getWriter();await r.ready,await r.write(o),r.releaseLock()},close(){t()},abort(o){return e.getWriter().abort(o)}}),closed:n}}var sbe=!0,abe=!0;function knt(e,t,n){let i={type:"module"},o,r;typeof e==D0&&(e=e());try{o=new URL(e,t)}catch{o=e}if(sbe)try{r=new Worker(o)}catch{sbe=!1,r=new Worker(o,i)}else r=new Worker(o,i);return r.addEventListener(nbe,s=>Unt(s,n)),r}function FU(e,{worker:t,writer:n,onTaskFinished:i,transferStreams:o}){try{let{value:r,readable:s,writable:a}=e,c=[];if(r&&(r.byteLength!C.busy);if(_)return ube(_),new RV(_,e,t,x);if(TT.lengthm4.push({resolve:C,stream:e,workerOptions:t}))}function x(_){if(m4.length){let[{resolve:C,stream:V,workerOptions:L}]=m4.splice(0,1);C(new RV(_,V,L,x))}else _.worker?(ube(_),Dnt(_,t)):TT=TT.filter(C=>C!=_)}}function Dnt(e,t){let{config:n}=t,{terminateWorkerTimeout:i}=n;Number.isFinite(i)&&i>=0&&(e.terminated?e.terminated=!1:e.terminateTimeout=setTimeout(async()=>{TT=TT.filter(o=>o!=e);try{await e.terminate()}catch{}},i))}function ube(e){let{terminateTimeout:t}=e;t&&(clearTimeout(t),e.terminateTimeout=null)}var Kxi=T(S(),1);var Bnt="Writer iterator completed too soon",Ynt="text/plain";var Ont="Content-Type";var Hnt=64*1024,p4="writable",ZV=class{constructor(){this.size=0}init(){this.initialized=!0}},MU=class extends ZV{get readable(){let t=this,{chunkSize:n=Hnt}=t,i=new ReadableStream({start(){this.chunkOffset=0},async pull(o){let{offset:r=0,size:s,diskNumberStart:a}=i,{chunkOffset:c}=this;o.enqueue(await Pa(t,r+c,Math.min(n,s-c),a)),c+n>s?o.close():this.chunkOffset+=n}});return i}},h4=class extends ZV{constructor(){super();let t=this,n=new WritableStream({write(i){return t.writeUint8Array(i)}});Object.defineProperty(t,p4,{get(){return n}})}writeUint8Array(){}};var NU=class extends h4{constructor(t){super(),Object.assign(this,{data:"data:"+(t||"")+";base64,",pending:[]})}writeUint8Array(t){let n=this,i=0,o=n.pending,r=n.pending.length;for(n.pending="",i=0;i2?n.data+=btoa(o):n.pending=o}getData(){return this.data+btoa(this.pending)}},O0=class extends MU{constructor(t){super(),Object.assign(this,{blob:t,size:t.size})}async readUint8Array(t,n){let i=this,o=t+n,s=await(t||on&&(s=s.slice(t,o)),new Uint8Array(s)}},Uv=class extends ZV{constructor(t){super();let n=this,i=new TransformStream,o=[];t&&o.push([Ont,t]),Object.defineProperty(n,p4,{get(){return i.writable}}),n.blob=new Response(i.readable,{headers:o}).blob()}getData(){return this.blob}},kU=class extends O0{constructor(t){super(new Blob([t],{type:Ynt}))}},UU=class extends Uv{constructor(t){super(t),Object.assign(this,{encoding:t,utf8:!t||t.toLowerCase()=="utf-8"})}async getData(){let{encoding:t,utf8:n}=this,i=await super.getData();if(i.text&&n)return i.text();{let o=new FileReader;return new Promise((r,s)=>{Object.assign(o,{onload:({target:a})=>r(a.result),onerror:()=>s(o.error)}),o.readAsText(i,t)})}}};var f4=class extends MU{constructor(t){super(),this.readers=t}async init(){let t=this,{readers:n}=t;t.lastDiskNumber=0,t.lastDiskOffset=0,await Promise.all(n.map(async(i,o)=>{await i.init(),o!=n.length-1&&(t.lastDiskOffset+=i.size),t.size+=i.size})),super.init()}async readUint8Array(t,n,i=0){let o=this,{readers:r}=this,s,a=i;a==-1&&(a=r.length-1);let c=t;for(;c>=r[a].size;)c-=r[a].size,a++;let d=r[a],u=d.size;if(c+n<=u)s=await Pa(d,c,n);else{let m=u-c;s=new Uint8Array(n),s.set(await Pa(d,c,m)),s.set(await o.readUint8Array(t+m,n-m,i),m)}return o.lastDiskNumber=Math.max(a,o.lastDiskNumber),s}},DU=class extends ZV{constructor(t,n=4294967295){super();let i=this;Object.assign(i,{diskNumber:0,diskOffset:0,size:0,maxSize:n,availableSize:n});let o,r,s,a=new WritableStream({async write(u){let{availableSize:m}=i;if(s)u.length>=m?(await c(u.slice(0,m)),await d(),i.diskOffset+=o.size,i.diskNumber++,s=null,await this.write(u.slice(m))):await c(u);else{let{value:p,done:g}=await t.next();if(g&&!p)throw new Error(Bnt);o=p,o.size=0,o.maxSize&&(i.maxSize=o.maxSize),i.availableSize=i.maxSize,await Af(o),r=p.writable,s=r.getWriter(),await this.write(u)}},async close(){await s.ready,await d()}});Object.defineProperty(i,p4,{get(){return a}});async function c(u){let m=u.length;m&&(await s.ready,await s.write(u),o.size+=m,i.size+=m,i.availableSize-=m)}async function d(){r.size=o.size,await s.close()}}};async function Af(e,t){if(e.init&&!e.initialized)await e.init(t);else return Promise.resolve()}function BU(e){return Array.isArray(e)&&(e=new f4(e)),e instanceof ReadableStream&&(e={readable:e}),e}function YU(e){e.writable===zi&&typeof e.next==D0&&(e=new DU(e)),e instanceof WritableStream&&(e={writable:e});let{writable:t}=e;return t.size===zi&&(t.size=0),e instanceof DU||Object.assign(e,{diskNumber:0,diskOffset:0,availableSize:1/0,maxSize:1/0}),e}function Pa(e,t,n,i){return e.readUint8Array(t,n,i)}var d_i=T(S(),1);var $xi=T(S(),1);var Qxi=T(S(),1),mbe="\0\u263A\u263B\u2665\u2666\u2663\u2660\u2022\u25D8\u25CB\u25D9\u2642\u2640\u266A\u266B\u263C\u25BA\u25C4\u2195\u203C\xB6\xA7\u25AC\u21A8\u2191\u2193\u2192\u2190\u221F\u2194\u25B2\u25BC !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u2302\xC7\xFC\xE9\xE2\xE4\xE0\xE5\xE7\xEA\xEB\xE8\xEF\xEE\xEC\xC4\xC5\xC9\xE6\xC6\xF4\xF6\xF2\xFB\xF9\xFF\xD6\xDC\xA2\xA3\xA5\u20A7\u0192\xE1\xED\xF3\xFA\xF1\xD1\xAA\xBA\xBF\u2310\xAC\xBD\xBC\xA1\xAB\xBB\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u03B1\xDF\u0393\u03C0\u03A3\u03C3\xB5\u03C4\u03A6\u0398\u03A9\u03B4\u221E\u03C6\u03B5\u2229\u2261\xB1\u2265\u2264\u2320\u2321\xF7\u2248\xB0\u2219\xB7\u221A\u207F\xB2\u25A0 ".split(""),znt=mbe.length==256;function hbe(e){if(znt){let t="";for(let n=0;nthis[n]=t[n])}};var Z4="File format is not recognized",qnt="End of central directory not found",$nt="End of Zip64 central directory locator not found",eit="Central directory header not found",tit="Local file header not found",nit="Zip64 extra field not found",iit="File contains encrypted entry",oit="Encryption method not supported",bbe="Compression method not supported",gbe="Split zip file",ybe="utf-8",xbe="cp437",rit=[[_4,4294967295],[T4,4294967295],[S4,4294967295],[OU,65535]],sit={[65535]:{getValue:ls,bytes:4},[4294967295]:{getValue:zU,bytes:8}},eD=class{constructor(t,n={}){Object.assign(this,{reader:BU(t),options:n,config:Pv()})}async*getEntriesGenerator(t={}){let n=this,{reader:i}=n,{config:o}=n;if(await Af(i),(i.size===zi||!i.readUint8Array)&&(i=new O0(await new Response(i.readable).blob()),await Af(i)),i.size<22)throw new Error(Z4);i.chunkSize=CU(o);let r=await uit(i,101010256,i.size,22,65535*16);if(!r){let A=await Pa(i,0,4),b=ua(A);throw ls(b)==134695760?new Error(gbe):new Error(qnt)}let s=ua(r),a=ls(s,12),c=ls(s,16),d=r.offset,u=da(s,20),m=d+22+u,p=da(s,4),g=i.lastDiskNumber||0,f=da(s,6),x=da(s,8),_=0,C=0;if(c==4294967295||a==4294967295||x==65535||f==65535){let A=await Pa(i,r.offset-20,20),b=ua(A);if(ls(b,0)==117853008){c=zU(b,8);let R=await Pa(i,c,56,-1),E=ua(R),I=r.offset-20-56;if(ls(E,0)!=101075792&&c!=I){let w=c;c=I,_=c-w,R=await Pa(i,c,56,-1),E=ua(R)}if(ls(E,0)!=101075792)throw new Error($nt);p==65535&&(p=ls(E,16)),f==65535&&(f=ls(E,20)),x==65535&&(x=zU(E,32)),a==4294967295&&(a=zU(E,40)),c-=a}}if(c>=i.size&&(_=i.size-c-a-22,c=i.size-a-22),g!=p)throw new Error(gbe);if(c<0)throw new Error(Z4);let V=0,L=await Pa(i,c,a,f),Z=ua(L);if(a){let A=r.offset-a;if(ls(Z,V)!=33639248&&c!=A){let b=c;c=A,_+=c-b,L=await Pa(i,c,a,f),Z=ua(L)}}let G=r.offset-c-(i.lastDiskOffset||0);if(a!=G&&G>=0&&(a=G,L=await Pa(i,c,a,f),Z=ua(L)),c<0||c>=i.size)throw new Error(Z4);let X=Ol(n,t,"filenameEncoding"),v=Ol(n,t,"commentEncoding");for(let A=0;Ab.getData(Xe,Se,Pe),V=k;let{onprogress:Le}=t;if(Le)try{await Le(A+1,x,new gy(b))}catch{}yield Se}let P=Ol(n,t,"extractPrependedData"),F=Ol(n,t,"extractAppendedData");return P&&(n.prependedData=C>0?await Pa(i,0,C):new Uint8Array),n.comment=u?await Pa(i,d+22,u):new Uint8Array,F&&(n.appendedData=m>>8&255:p>>>24&255),signature:p,compressed:d!=0,encrypted:G,useWebWorkers:Ol(o,i,"useWebWorkers"),useCompressionStream:Ol(o,i,"useCompressionStream"),transferStreams:Ol(o,i,"transferStreams"),checkPasswordOnly:b},config:u,streamOptions:{signal:A,size:P,onstart:E,onprogress:I,onend:w}},B=0;try{({outputSize:B}=await AU({readable:F,writable:R},N))}catch(U){if(!b||U.message!=Y0)throw U}finally{let U=Ol(o,i,"preventClose");R.size+=B,!U&&!R.locked&&await R.getWriter().close()}return b?zi:t.getData?t.getData():R}};function Tbe(e,t,n){let i=e.rawBitFlag=da(t,n+2),o=(i&1)==1,r=ls(t,n+6);Object.assign(e,{encrypted:o,version:da(t,n),bitFlag:{level:(i&6)>>1,dataDescriptor:(i&8)==8,languageEncodingFlag:(i&2048)==2048},rawLastModDate:r,lastModDate:mit(r),filenameLength:da(t,n+22),extraFieldLength:da(t,n+24)})}async function Sbe(e,t,n,i,o){let{rawExtraField:r}=t,s=t.extraField=new Map,a=ua(new Uint8Array(r)),c=0;try{for(;ct[o]==r);for(let o=0,r=0;o=5&&(r.push(GV),s.push(HU));let a=1;r.forEach((c,d)=>{if(e.data.length>=a+4){let u=ls(i,a);t[c]=e[c]=new Date(u*1e3);let m=s[d];e[m]=u}a+=4})}async function uit(e,t,n,i,o){let r=new Uint8Array(4),s=ua(r);hit(s,0,t);let a=i+o;return await c(i)||await c(Math.min(a,n));async function c(d){let u=n-d,m=await Pa(e,u,d);for(let p=m.length-i;p>=0;p--)if(m[p]==r[0]&&m[p+1]==r[1]&&m[p+2]==r[2]&&m[p+3]==r[3])return{offset:u+p,buffer:m.slice(p,p+i).buffer}}}function Ol(e,t,n){return t[n]===zi?e.options[n]:t[n]}function mit(e){let t=(e&4294901760)>>16,n=e&65535;try{return new Date(1980+((t&65024)>>9),((t&480)>>5)-1,t&31,(n&63488)>>11,(n&2016)>>5,(n&31)*2,0)}catch{}}function G4(e){return new Date(Number(e/BigInt(1e4)-BigInt(116444736e5)))}function EV(e,t){return e.getUint8(t)}function da(e,t){return e.getUint16(t,!0)}function ls(e,t){return e.getUint32(t,!0)}function zU(e,t){return Number(e.getBigUint64(t,!0))}function hit(e,t,n){e.setUint32(t,n,!0)}function ua(e){return new DataView(e.buffer)}var y_i=T(S(),1);var git="File already exists",yit="Zip file comment exceeds 64KB",xit="File entry comment exceeds 64KB",_it="File entry name exceeds 64KB",Lbe="Version exceeds 65535",Tit="The strength must equal 1, 2, or 3",Sit="Extra field type exceeds 65535",Cit="Extra field data exceeds 64KB",B4="Zip64 is not supported (make sure 'keepOrder' is set to 'true')",Rbe=new Uint8Array([7,0,2,0,65,69,3,0,0]),U4=0,Zbe=[],iD=class{constructor(t,n={}){t=YU(t);let i=t.availableSize!==zi&&t.availableSize>0&&t.availableSize!==1/0&&t.maxSize!==zi&&t.maxSize>0&&t.maxSize!==1/0;Object.assign(this,{writer:t,addSplitZipSignature:i,options:n,config:Pv(),files:new Map,filenames:new Set,offset:t.writable.size,pendingEntriesSize:0,pendingAddFileCalls:new Set,bufferedWrites:0})}async add(t="",n,i={}){let o=this,{pendingAddFileCalls:r,config:s}=o;U4Zbe.push(c));let a;try{if(t=t.trim(),o.filenames.has(t))throw new Error(git);return o.filenames.add(t),a=Vit(o,t,n,i),r.add(a),await a}catch(c){throw o.filenames.delete(t),c}finally{r.delete(a);let c=Zbe.shift();c?c():U4--}}async close(t=new Uint8Array,n={}){let i=this,{pendingAddFileCalls:o,writer:r}=this,{writable:s}=r;for(;o.size;)await Promise.allSettled(Array.from(o));return await Pit(this,t,n),Uo(i,n,"preventClose")||await s.getWriter().close(),r.getData?r.getData():s}};async function Vit(e,t,n,i){t=t.trim(),i.directory&&!t.endsWith(TV)?t+=TV:i.directory=t.endsWith(TV);let o=Uo(e,i,"encodeText",CV),r=o(t);if(r===zi&&(r=CV(t)),Di(r)>65535)throw new Error(_it);let s=i.comment||"",a=o(s);if(a===zi&&(a=CV(s)),Di(a)>65535)throw new Error(xit);let c=Uo(e,i,"version",20);if(c>65535)throw new Error(Lbe);let d=Uo(e,i,"versionMadeBy",20);if(d>65535)throw new Error(Lbe);let u=Uo(e,i,GV,new Date),m=Uo(e,i,Bv),p=Uo(e,i,Yv),g=Uo(e,i,L4,!0),f=Uo(e,i,C4,0),x=Uo(e,i,V4,0),_=Uo(e,i,"password"),C=Uo(e,i,"rawPassword"),V=Uo(e,i,"encryptionStrength",3),L=Uo(e,i,"zipCrypto"),Z=Uo(e,i,"extendedTimestamp",!0),G=Uo(e,i,"keepOrder",!0),X=Uo(e,i,"level"),v=Uo(e,i,"useWebWorkers"),P=Uo(e,i,"bufferedWrite"),F=Uo(e,i,"dataDescriptorSignature",!1),A=Uo(e,i,"signal"),b=Uo(e,i,"useCompressionStream"),R=Uo(e,i,"dataDescriptor",!0),E=Uo(e,i,R4);if(_!==zi&&V!==zi&&(V<1||V>3))throw new Error(Tit);let I=new Uint8Array,{extraField:w}=i;if(w){let Le=0,Xe=0;w.forEach(Pe=>Le+=4+Di(Pe)),I=new Uint8Array(Le),w.forEach((Pe,ke)=>{if(ke>65535)throw new Error(Sit);if(Di(Pe)>65535)throw new Error(Cit);Ts(I,new Uint16Array([ke]),Xe),Ts(I,new Uint16Array([Di(Pe)]),Xe+2),Ts(I,Pe,Xe+4),Xe+=4+Di(Pe)})}let N=0,B=0,U=0,O=E===!0;n&&(n=BU(n),await Af(n),n.size===zi?(R=!0,(E||E===zi)&&(E=!0,U=N=4294967296)):(U=n.size,N=vit(U)));let{diskOffset:k,diskNumber:J,maxSize:H}=e.writer,ee=O||U>4294967295,z=O||N>4294967295,j=O||e.offset+e.pendingEntriesSize-k>4294967295,be=Uo(e,i,"supportZip64SplitFile",!0)&&O||J+Math.ceil(e.pendingEntriesSize/H)>65535;if(j||ee||z||be){if(E===!1||!G)throw new Error(B4);E=!0}E=E||!1,i=Object.assign({},i,{rawFilename:r,rawComment:a,version:c,versionMadeBy:d,lastModDate:u,lastAccessDate:m,creationDate:p,rawExtraField:I,zip64:E,zip64UncompressedSize:ee,zip64CompressedSize:z,zip64Offset:j,zip64DiskNumberStart:be,password:_,rawPassword:C,level:!b&&e.config.CompressionStream===zi&&e.config.CompressionStreamNative===zi?0:X,useWebWorkers:v,encryptionStrength:V,extendedTimestamp:Z,zipCrypto:L,bufferedWrite:P,keepOrder:G,dataDescriptor:R,dataDescriptorSignature:F,signal:A,msDosCompatible:g,internalFileAttribute:f,externalFileAttribute:x,useCompressionStream:b});let Te=Zit(i),ae=Eit(i),ye=Di(Te.localHeaderArray,ae.dataDescriptorArray);B=ye+N,e.options.usdz&&(B+=B+64),e.pendingEntriesSize+=B;let Se;try{Se=await Lit(e,t,n,{headerInfo:Te,dataDescriptorInfo:ae,metadataSize:ye},i)}finally{e.pendingEntriesSize-=B}return Object.assign(Se,{name:t,comment:s,extraField:w}),new gy(Se)}async function Lit(e,t,n,i,o){let{files:r,writer:s}=e,{keepOrder:a,dataDescriptor:c,signal:d}=o,{headerInfo:u}=i,{usdz:m}=e.options,p=Array.from(r.values()).pop(),g={},f,x,_,C,V,L,Z;r.set(t,g);try{let P;a&&(P=p&&p.lock,G()),(o.bufferedWrite||e.writerLocked||e.bufferedWrites&&a||!c)&&!m?(L=new TransformStream,Z=new Response(L.readable).blob(),L.writable.size=0,f=!0,e.bufferedWrites++,await Af(s)):(L=s,await X()),await Af(L);let{writable:F}=s,{diskOffset:A}=s;if(e.addSplitZipSignature){delete e.addSplitZipSignature;let R=new Uint8Array(4),E=va(R);Ui(E,0,134695760),await Mf(F,R),e.offset+=4}m&&Git(i,e.offset-A),f||(await P,await v(F));let{diskNumber:b}=s;if(V=!0,g.diskNumberStart=b,g=await Rit(n,L,g,i,e.config,o),V=!1,r.set(t,g),g.filename=t,f){await L.writable.getWriter().close();let R=await Z;await P,await X(),C=!0,c||(R=await Iit(g,R,F,o)),await v(F),g.diskNumberStart=s.diskNumber,A=s.diskOffset,await R.stream().pipeTo(F,{preventClose:!0,preventAbort:!0,signal:d}),F.size+=R.size,C=!1}if(g.offset=e.offset-A,g.zip64)Wit(g,o);else if(g.offset>4294967295)throw new Error(B4);return e.offset+=g.size,g}catch(P){if(f&&C||!f&&V){if(e.hasCorruptedEntries=!0,P)try{P.corruptedEntry=!0}catch{}f?e.offset+=L.writable.size:e.offset=L.writable.size}throw r.delete(t),P}finally{f&&e.bufferedWrites--,_&&_(),x&&x()}function G(){g.lock=new Promise(P=>_=P)}async function X(){e.writerLocked=!0;let{lockWriter:P}=e;e.lockWriter=new Promise(F=>x=()=>{e.writerLocked=!1,F()}),await P}async function v(P){Di(u.localHeaderArray)>s.availableSize&&(s.availableSize=0,await Mf(P,new Uint8Array))}}async function Rit(e,t,{diskNumberStart:n,lock:i},o,r,s){let{headerInfo:a,dataDescriptorInfo:c,metadataSize:d}=o,{localHeaderArray:u,headerArray:m,lastModDate:p,rawLastModDate:g,encrypted:f,compressed:x,version:_,compressionMethod:C,rawExtraFieldExtendedTimestamp:V,extraFieldExtendedTimestampFlag:L,rawExtraFieldNTFS:Z,rawExtraFieldAES:G}=a,{dataDescriptorArray:X}=c,{rawFilename:v,lastAccessDate:P,creationDate:F,password:A,rawPassword:b,level:R,zip64:E,zip64UncompressedSize:I,zip64CompressedSize:w,zip64Offset:N,zip64DiskNumberStart:B,zipCrypto:U,dataDescriptor:O,directory:k,versionMadeBy:J,rawComment:H,rawExtraField:ee,useWebWorkers:z,onstart:j,onprogress:q,onend:be,signal:Te,encryptionStrength:ae,extendedTimestamp:ye,msDosCompatible:Se,internalFileAttribute:Le,externalFileAttribute:Xe,useCompressionStream:Pe}=s,ke={lock:i,versionMadeBy:J,zip64:E,directory:!!k,filenameUTF8:!0,rawFilename:v,commentUTF8:!0,rawComment:H,rawExtraFieldExtendedTimestamp:V,rawExtraFieldNTFS:Z,rawExtraFieldAES:G,rawExtraField:ee,extendedTimestamp:ye,msDosCompatible:Se,internalFileAttribute:Le,externalFileAttribute:Xe,diskNumberStart:n},Pt=0,Ot=0,ht,{writable:Ae}=t;if(e){e.chunkSize=CU(r),await Mf(Ae,u);let Qe=e.readable,je=Qe.size=e.size,kt={options:{codecType:vU,level:R,rawPassword:b,password:A,encryptionStrength:ae,zipCrypto:f&&U,passwordVerification:f&&U&&g>>8&255,signed:!0,compressed:x,encrypted:f,useWebWorkers:z,useCompressionStream:Pe,transferStreams:!1},config:r,streamOptions:{signal:Te,size:je,onstart:j,onprogress:q,onend:be}},pe=await AU({readable:Qe,writable:Ae},kt);Ot=pe.inputSize,Pt=pe.outputSize,ht=pe.signature,Ae.size+=Ot}else await Mf(Ae,u);let $e;if(E){let Qe=4;I&&(Qe+=8),w&&(Qe+=8),N&&(Qe+=8),B&&(Qe+=4),$e=new Uint8Array(Qe)}else $e=new Uint8Array;return Xit({signature:ht,rawExtraFieldZip64:$e,compressedSize:Pt,uncompressedSize:Ot,headerInfo:a,dataDescriptorInfo:c},s),O&&await Mf(Ae,X),Object.assign(ke,{uncompressedSize:Ot,compressedSize:Pt,lastModDate:p,rawLastModDate:g,creationDate:F,lastAccessDate:P,encrypted:f,size:d+Pt,compressionMethod:C,version:_,headerArray:m,signature:ht,rawExtraFieldZip64:$e,extraFieldExtendedTimestampFlag:L,zip64UncompressedSize:I,zip64CompressedSize:w,zip64Offset:N,zip64DiskNumberStart:B}),ke}function Zit(e){let{rawFilename:t,lastModDate:n,lastAccessDate:i,creationDate:o,rawPassword:r,password:s,level:a,zip64:c,zipCrypto:d,dataDescriptor:u,directory:m,rawExtraField:p,encryptionStrength:g,extendedTimestamp:f}=e,x=a!==0&&!m,_=!!(s&&Di(s)||r&&Di(r)),C=e.version,V;if(_&&!d){V=new Uint8Array(Di(Rbe)+2);let B=va(V);no(B,0,39169),Ts(V,Rbe,2),oD(B,8,g)}else V=new Uint8Array;let L,Z,G;if(f){Z=new Uint8Array(9+(i?4:0)+(o?4:0));let B=va(Z);no(B,0,21589),no(B,2,Di(Z)-4),G=1+(i?2:0)+(o?4:0),oD(B,4,G);let U=5;Ui(B,U,Math.floor(n.getTime()/1e3)),U+=4,i&&(Ui(B,U,Math.floor(i.getTime()/1e3)),U+=4),o&&Ui(B,U,Math.floor(o.getTime()/1e3));try{L=new Uint8Array(36);let O=va(L),k=D4(n);no(O,0,10),no(O,2,32),no(O,8,1),no(O,10,24),Hl(O,12,k),Hl(O,20,D4(i)||k),Hl(O,28,D4(o)||k)}catch{L=new Uint8Array}}else L=Z=new Uint8Array;let X=2048;u&&(X=X|8);let v=0;x&&(v=8),c&&(C=C>45?C:45),_&&(X=X|1,d||(C=C>51?C:51,v=99,x&&(V[9]=8)));let P=new Uint8Array(26),F=va(P);no(F,0,C),no(F,2,X),no(F,4,v);let A=new Uint32Array(1),b=va(A),R;nt4?R=t4:R=n,no(b,0,(R.getHours()<<6|R.getMinutes())<<5|R.getSeconds()/2),no(b,2,(R.getFullYear()-1980<<4|R.getMonth()+1)<<5|R.getDate());let E=A[0];Ui(F,6,E),no(F,22,Di(t));let I=Di(V,Z,L,p);no(F,24,I);let w=new Uint8Array(30+Di(t)+I),N=va(w);return Ui(N,0,67324752),Ts(w,P,4),Ts(w,t,30),Ts(w,V,30+Di(t)),Ts(w,Z,30+Di(t,V)),Ts(w,L,30+Di(t,V,Z)),Ts(w,p,30+Di(t,V,Z,L)),{localHeaderArray:w,headerArray:P,headerView:F,lastModDate:n,rawLastModDate:E,encrypted:_,compressed:x,version:C,compressionMethod:v,extraFieldExtendedTimestampFlag:G,rawExtraFieldExtendedTimestamp:Z,rawExtraFieldNTFS:L,rawExtraFieldAES:V,extraFieldLength:I}}function Git(e,t){let{headerInfo:n}=e,{localHeaderArray:i,extraFieldLength:o}=n,r=va(i),s=64-(t+Di(i))%64;s<4&&(s+=64);let a=new Uint8Array(s),c=va(a);no(c,0,6534),no(c,2,s-2);let d=i;n.localHeaderArray=i=new Uint8Array(Di(d)+s),Ts(i,d),Ts(i,a,Di(d)),r=va(i),no(r,28,o+s),e.metadataSize+=s}function Eit(e){let{zip64:t,dataDescriptor:n,dataDescriptorSignature:i}=e,o=new Uint8Array,r,s=0;return n&&(o=new Uint8Array(t?i?24:20:i?16:12),r=va(o),i&&(s=4,Ui(r,0,134695760))),{dataDescriptorArray:o,dataDescriptorView:r,dataDescriptorOffset:s}}function Xit(e,t){let{signature:n,rawExtraFieldZip64:i,compressedSize:o,uncompressedSize:r,headerInfo:s,dataDescriptorInfo:a}=e,{headerView:c,encrypted:d}=s,{dataDescriptorView:u,dataDescriptorOffset:m}=a,{zip64:p,zip64UncompressedSize:g,zip64CompressedSize:f,zipCrypto:x,dataDescriptor:_}=t;if((!d||x)&&n!==zi&&(Ui(c,10,n),_&&Ui(u,m,n)),p){let C=va(i);no(C,0,1),no(C,2,Di(i)-4);let V=4;g&&(Ui(c,18,4294967295),Hl(C,V,BigInt(r)),V+=8),f&&(Ui(c,14,4294967295),Hl(C,V,BigInt(o))),_&&(Hl(u,m+4,BigInt(o)),Hl(u,m+12,BigInt(r)))}else Ui(c,14,o),Ui(c,18,r),_&&(Ui(u,m+4,o),Ui(u,m+8,r))}async function Iit(e,t,n,{zipCrypto:i}){let o;o=await t.slice(0,26).arrayBuffer(),o.byteLength!=26&&(o=o.slice(0,26));let r=new DataView(o);return(!e.encrypted||i)&&Ui(r,14,e.signature),e.zip64?(Ui(r,18,4294967295),Ui(r,22,4294967295)):(Ui(r,18,e.compressedSize),Ui(r,22,e.uncompressedSize)),await Mf(n,new Uint8Array(o)),t.slice(o.byteLength)}function Wit(e,t){let{rawExtraFieldZip64:n,offset:i,diskNumberStart:o}=e,{zip64UncompressedSize:r,zip64CompressedSize:s,zip64Offset:a,zip64DiskNumberStart:c}=t,d=va(n),u=4;r&&(u+=8),s&&(u+=8),a&&(Hl(d,u,BigInt(i)),u+=8),c&&Ui(d,u,o)}async function Pit(e,t,n){let{files:i,writer:o}=e,{diskOffset:r,writable:s}=o,{diskNumber:a}=o,c=0,d=0,u=e.offset-r,m=i.size;for(let[,G]of i){let{rawFilename:X,rawExtraFieldZip64:v,rawExtraFieldAES:P,rawComment:F,rawExtraFieldNTFS:A,rawExtraField:b,extendedTimestamp:R,extraFieldExtendedTimestampFlag:E,lastModDate:I}=G,w;if(R){w=new Uint8Array(9);let N=va(w);no(N,0,21589),no(N,2,5),oD(N,4,E),Ui(N,5,Math.floor(I.getTime()/1e3))}else w=new Uint8Array;G.rawExtraFieldCDExtendedTimestamp=w,d+=46+Di(X,F,v,P,A,w,b)}let p=new Uint8Array(d),g=va(p);await Af(o);let f=0;for(let[G,X]of Array.from(i.values()).entries()){let{offset:v,rawFilename:P,rawExtraFieldZip64:F,rawExtraFieldAES:A,rawExtraFieldCDExtendedTimestamp:b,rawExtraFieldNTFS:R,rawExtraField:E,rawComment:I,versionMadeBy:w,headerArray:N,directory:B,zip64:U,zip64UncompressedSize:O,zip64CompressedSize:k,zip64DiskNumberStart:J,zip64Offset:H,msDosCompatible:ee,internalFileAttribute:z,externalFileAttribute:j,diskNumberStart:q,uncompressedSize:be,compressedSize:Te}=X,ae=Di(F,A,b,R,E);Ui(g,c,33639248),no(g,c+4,w);let ye=va(N);O||Ui(ye,18,be),k||Ui(ye,14,Te),Ts(p,N,c+6),no(g,c+30,ae),no(g,c+32,Di(I)),no(g,c+34,U&&J?65535:q),no(g,c+36,z),j?Ui(g,c+38,j):B&&ee&&oD(g,c+38,16),Ui(g,c+42,U&&H?4294967295:v),Ts(p,P,c+46),Ts(p,F,c+46+Di(P)),Ts(p,A,c+46+Di(P,F)),Ts(p,b,c+46+Di(P,F,A)),Ts(p,R,c+46+Di(P,F,A,b)),Ts(p,E,c+46+Di(P,F,A,b,R)),Ts(p,I,c+46+Di(P)+ae);let Se=46+Di(P,I)+ae;if(c-f>o.availableSize&&(o.availableSize=0,await Mf(s,p.slice(f,c)),f=c),c+=Se,n.onprogress)try{await n.onprogress(G+1,i.size,new gy(X))}catch{}}await Mf(s,f?p.slice(f):p);let x=o.diskNumber,{availableSize:_}=o;_<22&&x++;let C=Uo(e,n,"zip64");if(u>4294967295||d>4294967295||m>65535||x>65535){if(C===!1)throw new Error(B4);C=!0}let V=new Uint8Array(C?98:22),L=va(V);c=0,C&&(Ui(L,0,101075792),Hl(L,4,BigInt(44)),no(L,12,45),no(L,14,45),Ui(L,16,x),Ui(L,20,a),Hl(L,24,BigInt(m)),Hl(L,32,BigInt(m)),Hl(L,40,BigInt(d)),Hl(L,48,BigInt(u)),Ui(L,56,117853008),Hl(L,64,BigInt(u)+BigInt(d)),Ui(L,72,x+1),Uo(e,n,"supportZip64SplitFile",!0)&&(x=65535,a=65535),m=65535,u=4294967295,d=4294967295,c+=76),Ui(L,c,101010256),no(L,c+4,x),no(L,c+6,a),no(L,c+8,m),no(L,c+10,m),Ui(L,c+12,d),Ui(L,c+16,u);let Z=Di(t);if(Z)if(Z<=65535)no(L,c+20,Z);else throw new Error(yit);await Mf(s,V),Z&&await Mf(s,t)}async function Mf(e,t){let n=e.getWriter();try{await n.ready,e.size+=Di(t),await n.write(t)}finally{n.releaseLock()}}function D4(e){if(e)return(BigInt(e.getTime())+BigInt(116444736e5))*BigInt(1e4)}function Uo(e,t,n,i){let o=t[n]===zi?e.options[n]:t[n];return o===zi?i:o}function vit(e){return e+5*(Math.floor(e/16383)+1)}function oD(e,t,n){e.setUint8(t,n)}function no(e,t,n){e.setUint16(t,n,!0)}function Ui(e,t,n){e.setUint32(t,n,!0)}function Hl(e,t,n){e.setBigUint64(t,n,!0)}function Ts(e,t,n){e.set(t,n)}function va(e){return new DataView(e.buffer)}function Di(...e){let t=0;return e.forEach(n=>n&&(t+=n.length)),t}SV({Deflate:m0e,Inflate:v0e});var I_i=T(S(),1);function wit(e){return typeof e=="string"&&(e=document.getElementById(e)),e}var In=wit;var P_i=T(S(),1);function Fit(e,t){this.position=e,this.headingPitchRange=t}var zv=Fit;var A_i=T(S(),1);function rD(e,t){this.id=t,this.name=e,this.playlistIndex=0,this.playlist=[],this.tourStart=new ge,this.tourEnd=new ge,this.entryStart=new ge,this.entryEnd=new ge,this._activeEntries=[]}rD.prototype.addPlaylistEntry=function(e){this.playlist.push(e)};rD.prototype.play=function(e,t){this.tourStart.raiseEvent();let n=this;Xbe.call(this,e,t,function(i){n.playlistIndex=0,i||Ebe(n._activeEntries),n.tourEnd.raiseEvent(i)})};rD.prototype.stop=function(){Ebe(this._activeEntries)};function Ebe(e){for(let t=e.pop();t!==void 0;t=e.pop())t.stop()}function Xbe(e,t,n){let i=this.playlist[this.playlistIndex];if(i){let o=Ait.bind(this,e,t,n);if(this._activeEntries.push(i),this.entryStart.raiseEvent(i),i.blocking)i.play(o,e.scene.camera,t);else{let r=this;i.play(function(){r.entryEnd.raiseEvent(i);let s=r._activeEntries.indexOf(i);s>=0&&r._activeEntries.splice(s,1)}),o(e,t,n)}}else l(n)&&n(!1)}function Ait(e,t,n,i){let o=this.playlist[this.playlistIndex];if(this.entryEnd.raiseEvent(o,i),i)n(i);else{let r=this._activeEntries.indexOf(o);r>=0&&this._activeEntries.splice(r,1),this.playlistIndex++,Xbe.call(this,e,t,n)}}var Kv=rD;var B_i=T(S(),1);function sD(e,t,n){this.type="KmlTourFlyTo",this.blocking=!0,this.activeCamera=null,this.activeCallback=null,this.duration=e,this.view=n,this.flyToMode=t}sD.prototype.play=function(e,t,n){if(this.activeCamera=t,l(e)&&e!==null){let o=this;this.activeCallback=function(r){delete o.activeCallback,delete o.activeCamera,e(l(r)?!1:r)}}let i=this.getCameraOptions(n);if(this.view.headingPitchRoll)t.flyTo(i);else if(this.view.headingPitchRange){let o=new le(this.view.position);t.flyToBoundingSphere(o,i)}};sD.prototype.stop=function(){l(this.activeCamera)&&this.activeCamera.cancelFlight(),l(this.activeCallback)&&this.activeCallback(!0)};sD.prototype.getCameraOptions=function(e){let t={duration:this.duration};return l(this.activeCallback)&&(t.complete=this.activeCallback),this.flyToMode==="smooth"&&(t.easingFunction=Lr.LINEAR_NONE),this.view.headingPitchRoll?(t.destination=this.view.position,t.orientation=this.view.headingPitchRoll):this.view.headingPitchRange&&(t.offset=this.view.headingPitchRange),l(e)&&(t=xt(t,e)),t};var Jv=sD;var H_i=T(S(),1);function Y4(e){this.type="KmlTourWait",this.blocking=!0,this.duration=e,this.timeout=null}Y4.prototype.play=function(e){let t=this;this.activeCallback=e,this.timeout=setTimeout(function(){delete t.activeCallback,e(!1)},this.duration*1e3)};Y4.prototype.stop=function(){clearTimeout(this.timeout),l(this.activeCallback)&&this.activeCallback(!0)};var Qv=Y4;var kbe={avi:"video/x-msvideo",bmp:"image/bmp",bz2:"application/x-bzip2",chm:"application/vnd.ms-htmlhelp",css:"text/css",csv:"text/csv",doc:"application/msword",dvi:"application/x-dvi",eps:"application/postscript",flv:"video/x-flv",gif:"image/gif",gz:"application/x-gzip",htm:"text/html",html:"text/html",ico:"image/vnd.microsoft.icon",jnlp:"application/x-java-jnlp-file",jpeg:"image/jpeg",jpg:"image/jpeg",m3u:"audio/x-mpegurl",m4v:"video/mp4",mathml:"application/mathml+xml",mid:"audio/midi",midi:"audio/midi",mov:"video/quicktime",mp3:"audio/mpeg",mp4:"video/mp4",mp4v:"video/mp4",mpeg:"video/mpeg",mpg:"video/mpeg",odp:"application/vnd.oasis.opendocument.presentation",ods:"application/vnd.oasis.opendocument.spreadsheet",odt:"application/vnd.oasis.opendocument.text",ogg:"application/ogg",pdf:"application/pdf",png:"image/png",pps:"application/vnd.ms-powerpoint",ppt:"application/vnd.ms-powerpoint",ps:"application/postscript",qt:"video/quicktime",rdf:"application/rdf+xml",rss:"application/rss+xml",rtf:"application/rtf",svg:"image/svg+xml",swf:"application/x-shockwave-flash",text:"text/plain",tif:"image/tiff",tiff:"image/tiff",txt:"text/plain",wav:"audio/x-wav",wma:"audio/x-ms-wma",wmv:"video/x-ms-wmv",xml:"application/xml",zip:"application/zip",detectFromFilename:function(e){let t=e.toLowerCase();return t=By(t),kbe[t]}},j4;typeof DOMParser<"u"&&(j4=new DOMParser);var Mit=new lU({stripPrefix:!1,email:!1,replaceFn:function(e){return e.urlMatchType==="scheme"||e.urlMatchType==="www"}}),yy=32,Ibe=2414016,Wbe=1,Pbe=16093e3,vbe=.1,wbe=[null,void 0,"http://www.opengis.net/kml/2.2","http://earth.google.com/kml/2.2","http://earth.google.com/kml/2.1","http://earth.google.com/kml/2.0"],Fbe=["http://www.google.com/kml/ext/2.2"],Nit=["http://www.w3.org/2005/Atom"],ve={kml:wbe,gx:Fbe,atom:Nit,kmlgx:wbe.concat(Fbe)},q4={Document:Qbe,Folder:oot,Placemark:rot,NetworkLink:fot,GroundOverlay:uot,PhotoOverlay:$be,ScreenOverlay:dot,Tour:aot};function Nf(e){this._dataSource=e,this._deferred=fl(),this._stack=[],this._promises=[],this._timeoutSet=!1,this._used=!1,this._started=0,this._timeThreshold=1e3}Object.defineProperties(Nf.prototype,{dataSource:{get:function(){return this._dataSource}}});Nf.prototype.addNodes=function(e,t){this._stack.push({nodes:e,index:0,processingData:t}),this._used=!0};Nf.prototype.addPromise=function(e){this._promises.push(e)};Nf.prototype.wait=function(){let e=this._deferred;return this._used||e.resolve(),Promise.all([e.promise,Promise.all(this._promises)])};Nf.prototype.process=function(){let e=this._stack.length===1;return e&&(this._started=Bd._getTimestamp()),this._process(e)};Nf.prototype._giveUpTime=function(){if(this._timeoutSet)return;this._timeoutSet=!0,this._timeThreshold=50;let e=this;setTimeout(function(){e._timeoutSet=!1,e._started=Bd._getTimestamp(),e._process(!0)},0)};Nf.prototype._nextNode=function(){let e=this._stack,t=e[e.length-1],n=t.index,i=t.nodes;if(n!==i.length)return++t.index,i[n]};Nf.prototype._pop=function(){let e=this._stack;return e.pop(),e.length===0?(this._deferred.resolve(),!1):!0};Nf.prototype._process=function(e){let t=this.dataSource,n=this._stack[this._stack.length-1].processingData,i=this._nextNode();for(;l(i);){let o=q4[i.localName];if(l(o)&&(ve.kml.indexOf(i.namespaceURI)!==-1||ve.gx.indexOf(i.namespaceURI)!==-1)&&(o(t,i,n,this),this._timeoutSet||Bd._getTimestamp()>this._started+this._timeThreshold)){this._giveUpTime();return}i=this._nextNode()}this._pop()&&e&&this._process(!0)};function kit(e){let t=e.slice(0,Math.min(4,e.size)),n=fl(),i=new FileReader;return i.addEventListener("load",function(){n.resolve(new DataView(i.result).getUint32(0,!1)===1347093252)}),i.addEventListener("error",function(){n.reject(i.error)}),i.readAsArrayBuffer(t),n.promise}function Uit(e){let t=fl(),n=new FileReader;return n.addEventListener("load",function(){t.resolve(n.result)}),n.addEventListener("error",function(){t.reject(n.error)}),n.readAsText(e),t.promise}function Ube(e){let t={xsi:"http://www.w3.org/2001/XMLSchema-instance"},n,i,o,r;for(let s in t)t.hasOwnProperty(s)&&(o=RegExp(`[< ]${s}:`),r=`xmlns:${s}=`,o.test(e)&&e.indexOf(r)===-1&&(l(n)||(n=e.substr(0,e.indexOf("",t),i,o,r;for(;t!==-1&&t0?(zl.maximumRed=r,zl.red=void 0):(zl.maximumRed=void 0,zl.red=0),o>0?(zl.maximumGreen=o,zl.green=void 0):(zl.maximumGreen=void 0,zl.green=0),i>0?(zl.maximumBlue=i,zl.blue=void 0):(zl.maximumBlue=void 0,zl.blue=0),zl.alpha=n,Y.fromRandom(zl)):new Y(r,o,i,n)}function ST(e,t,n){let i=Wn(e,t,n);if(l(i))return J4(i,Wn(e,"colorMode",n)==="random")}function Bit(e){let t=Gi(e,"TimeStamp",ve.kmlgx),n=Wn(t,"when",ve.kmlgx);if(!l(t)||!l(n)||n.length===0)return;let i=te.fromIso8601(n),o=new Xr;return o.addInterval(new Sn({start:i,stop:Be.MAXIMUM_VALUE})),o}function Yit(e){let t=Gi(e,"TimeSpan",ve.kmlgx);if(!l(t))return;let n,i=Gi(t,"begin",ve.kmlgx),o=l(i)?te.fromIso8601(i.textContent):void 0,r=Gi(t,"end",ve.kmlgx),s=l(r)?te.fromIso8601(r.textContent):void 0;if(l(o)&&l(s)){if(te.lessThan(s,o)){let a=o;o=s,s=a}n=new Xr,n.addInterval(new Sn({start:o,stop:s}))}else l(o)?(n=new Xr,n.addInterval(new Sn({start:o,stop:Be.MAXIMUM_VALUE}))):l(s)&&(n=new Xr,n.addInterval(new Sn({start:Be.MINIMUM_VALUE,stop:s})));return n}function Ybe(){let e=new rc;return e.width=yy,e.height=yy,e.scaleByDistance=new At(Ibe,Wbe,Pbe,vbe),e.pixelOffsetScaleByDistance=new At(Ibe,Wbe,Pbe,vbe),e}function ej(){let e=new vm;return e.outline=!0,e.outlineColor=Y.WHITE,e}function Obe(){let e=new Pm;return e.translucencyByDistance=new At(3e6,1,5e6,0),e.pixelOffset=new D(17,0),e.horizontalOrigin=pi.LEFT,e.font="16px sans-serif",e.style=Fo.FILL_AND_OUTLINE,e}function tj(e,t,n,i,o){let r=Wn(e,"href",ve.kml);if(!l(r)||r.length===0)return;if(r.indexOf("root://icons/palette-")===0){let a=r.charAt(21),c=y(qn(e,"x",ve.gx),0),d=y(qn(e,"y",ve.gx),0);c=Math.min(c/32,7),d=7-Math.min(d/32,7);let u=8*d+c;r=`https://maps.google.com/mapfiles/kml/pal${a}/icon${u}.png`}let s=$4(r,n,i);if(o){let a=Wn(e,"refreshMode",ve.kml),c=Wn(e,"viewRefreshMode",ve.kml);a==="onInterval"||a==="onExpire"?Ft(`kml-refreshMode-${a}`,`KML - Unsupported Icon refreshMode: ${a}`):(c==="onStop"||c==="onRegion")&&Ft(`kml-refreshMode-${c}`,`KML - Unsupported Icon viewRefreshMode: ${c}`);let d=y(Wn(e,"viewBoundScale",ve.kml),1),u=c==="onStop"?"BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]":"",m=y(Wn(e,"viewFormat",ve.kml),u),p=Wn(e,"httpQuery",ve.kml);l(m)&&s.setQueryParameters(od(lD(m))),l(p)&&s.setQueryParameters(od(lD(p)));let g=t._ellipsoid;return ij(s,t.camera,t.canvas,d,t._lastCameraView.bbox,g),s}return s}function Oit(e,t,n,i,o){let r=qn(t,"scale",ve.kml),s=qn(t,"heading",ve.kml),a=ST(t,"color",ve.kml),c=Gi(t,"Icon",ve.kml),d=tj(c,e,i,o,!1);l(c)&&!l(d)&&(d=!1);let u=qn(c,"x",ve.gx),m=qn(c,"y",ve.gx),p=qn(c,"w",ve.gx),g=qn(c,"h",ve.gx),f=Gi(t,"hotSpot",ve.kml),x=xy(f,"x"),_=xy(f,"y"),C=Ss(f,"xunits"),V=Ss(f,"yunits"),L=n.billboard;l(L)||(L=Ybe(),n.billboard=L),L.image=d,L.scale=r,L.color=a,(l(u)||l(m)||l(p)||l(g))&&(L.imageSubRegion=new He(u,m,p,g)),l(s)&&s!==0&&(L.rotation=W.toRadians(-s),L.alignedAxis=h.UNIT_Z),r=y(r,1);let Z,G;l(x)&&(C==="pixels"?Z=-x*r:C==="insetPixels"?Z=(x-yy)*r:C==="fraction"&&(Z=-x*yy*r),Z+=yy*.5*r),l(_)&&(V==="pixels"?G=_*r:V==="insetPixels"?G=(-_+yy)*r:V==="fraction"&&(G=_*yy*r),G-=yy*.5*r),(l(Z)||l(G))&&(L.pixelOffset=new D(Z,G))}function cD(e,t,n,i,o){for(let r=0,s=t.childNodes.length;r:clampToSeaFloor is currently not supported, using :clampToGround."),Je.CLAMP_TO_GROUND):t==="relativeToSeaFloor"?(Ft("kml-gx:altitudeMode-relativeToSeaFloor","KML - :relativeToSeaFloor is currently not supported, using :relativeToGround."),Je.RELATIVE_TO_GROUND):(l(e)?Ft("kml-altitudeMode-unknown",`KML - Unknown :${e}, using :CLAMP_TO_GROUND.`):Ft("kml-gx:altitudeMode-unknown",`KML - Unknown :${t}, using :CLAMP_TO_GROUND.`),Je.CLAMP_TO_GROUND)}function Kit(e,t,n){return n==="relativeToSeaFloor"||t==="absolute"||t==="relativeToGround"?e:((l(t)&&t!=="clampToGround"||l(n)&&n!=="clampToSeaFloor")&&Ft("kml-altitudeMode-unknown",`KML - Unknown altitudeMode: ${y(t,n)}`),new Gf(e))}function Jit(e,t,n,i){if(!l(e))return;if(n==="relativeToSeaFloor"||t==="absolute"||t==="relativeToGround")return e;(l(t)&&t!=="clampToGround"||l(n)&&n!=="clampToSeaFloor")&&Ft("kml-altitudeMode-unknown",`KML - Unknown altitudeMode: ${y(t,n)}`);let o=e.length;for(let r=0;r0&&Ft("kml-gx:angles","KML - gx:angles are not supported in gx:Tracks");let g=Math.min(a.length,d.length),f=[],x=[];for(let C=0;C0&&i.availability.addInterval(new Sn({start:x[0],stop:x[x.length-1]})),m&&u&&nj(t,i,o),!0}function Nbe(e,t,n,i,o,r,s,a,c){let d=e[0],u=e[e.length-1],m=new ca;m.addSamples(e,t),n.intervals.addInterval(new Sn({start:d,stop:u,isStartIncluded:c,isStopIncluded:c,data:Kit(m,s,a)})),i.addInterval(new Sn({start:d,stop:u,isStartIncluded:c,isStopIncluded:c})),o.intervals.addInterval(new Sn({start:d,stop:u,isStartIncluded:c,isStopIncluded:c,data:r}))}function $it(e,t,n,i,o){let r=yh(n,"interpolate",ve.gx),s=gh(n,"Track",ve.gx),a,c,d,u=!1,m=new A0,p=new Xr,g=new aa,f=e._ellipsoid;for(let x=0,_=s.length;x<_;x++){let C=s[x],V=gh(C,"when",ve.kml),L=gh(C,"coord",ve.gx),Z=Wn(C,"altitudeMode",ve.kml),G=Wn(C,"altitudeMode",ve.gx),X=qv(Z,G),v=yh(C,"extrude",ve.kml),P=Math.min(L.length,V.length),F=[];a=[];for(let A=0;A0)){for(f='',r=0;r`;f+="
${y(x.displayName,s)}${y(x.value,"")}
"}if(!l(f))return;f=Mit.link(f),ho.innerHTML=f;let _=ho.querySelectorAll("a");for(r=0;r<_.length;r++)_[r].setAttribute("target","_blank");l(i)&&i.keys.length>1&&(Ud(ho,"a","href",i),Ud(ho,"link","href",i),Ud(ho,"area","href",i),Ud(ho,"img","src",i),Ud(ho,"iframe","src",i),Ud(ho,"video","src",i),Ud(ho,"audio","src",i),Ud(ho,"source","src",i),Ud(ho,"track","src",i),Ud(ho,"input","src",i),Ud(ho,"embed","src",i),Ud(ho,"script","src",i),Ud(ho,"video","poster",i)),Dd(ho,"a","href",o),Dd(ho,"link","href",o),Dd(ho,"area","href",o),Dd(ho,"img","src",o),Dd(ho,"iframe","src",o),Dd(ho,"video","src",o),Dd(ho,"audio","src",o),Dd(ho,"source","src",o),Dd(ho,"track","src",o),Dd(ho,"input","src",o),Dd(ho,"embed","src",o),Dd(ho,"script","src",o),Dd(ho,"video","poster",o);let C='
',C+=`${ho.innerHTML}
`,ho.innerHTML="",t.description=C}function mD(e,t,n){let i=n.entityCollection,o=n.parentEntity,r=n.sourceResource,s=n.uriResolver,a=Bbe(t,i,n.context),c=a.kml,d=Hit(e,t,n.styleCollection,r,s),u=Wn(t,"name",ve.kml);a.name=u,a.parent=o;let m=Yit(t);l(m)||(m=Bit(t)),a.availability=m,rj(a);function p(L){return L?L.show&&p(L.parent):!0}let g=yh(t,"visibility",ve.kml);a.show=p(o)&&y(g,!0);let f=Gi(t,"author",ve.atom),x=c.author;x.name=Wn(f,"name",ve.atom),x.uri=Wn(f,"uri",ve.atom),x.email=Wn(f,"email",ve.atom);let _=Gi(t,"link",ve.atom),C=c.link;C.href=Ss(_,"href"),C.hreflang=Ss(_,"hreflang"),C.rel=Ss(_,"rel"),C.type=Ss(_,"type"),C.title=Ss(_,"title"),C.length=Ss(_,"length"),c.address=Wn(t,"address",ve.kml),c.phoneNumber=Wn(t,"phoneNumber",ve.kml),c.snippet=Wn(t,"Snippet",ve.kml),not(t,a),iot(t,a,d,s,r);let V=e._ellipsoid;return qbe(t,a,V),jbe(t,a,V),l(Gi(t,"Region",ve.kml))&&Ft("kml-region","KML - Placemark Regions are unsupported"),{entity:a,styleEntity:d}}function Qbe(e,t,n,i){i.addNodes(t.childNodes,n),i.process()}function oot(e,t,n,i){let o=mD(e,t,n),r=Oe(n);r.parentEntity=o.entity,Qbe(e,t,r,i)}function rot(e,t,n,i){let o=mD(e,t,n),r=o.entity,s=o.styleEntity,a=!1,c=t.childNodes;for(let d=0,u=c.length;dW.PI_OVER_TWO?W.PI_OVER_TWO:d}function a(d){return d>W.PI?d-W.TWO_PI:d<-W.PI?d+W.TWO_PI:d}let c=Hy(e.queryParameters);if(c=c.replace(/%5B/g,"[").replace(/%5D/g,"]"),l(t)&&t._mode!==oe.MORPHING){let d,u;if(o=y(o,mot),l(n)&&(z4.x=n.clientWidth*.5,z4.y=n.clientHeight*.5,d=t.pickEllipsoid(z4,r,hot)),l(d)?u=r.cartesianToCartographic(d,XV):(u=ce.center(o,XV),d=r.cartographicToCartesian(u)),l(i)&&!W.equalsEpsilon(i,1,W.EPSILON9)){let C=o.width*i*.5,V=o.height*i*.5;o=new ce(a(u.longitude-C),s(u.latitude-V),a(u.longitude+C),s(u.latitude+V))}c=c.replace("[bboxWest]",W.toDegrees(o.west).toString()),c=c.replace("[bboxSouth]",W.toDegrees(o.south).toString()),c=c.replace("[bboxEast]",W.toDegrees(o.east).toString()),c=c.replace("[bboxNorth]",W.toDegrees(o.north).toString());let m=W.toDegrees(u.longitude).toString(),p=W.toDegrees(u.latitude).toString();c=c.replace("[lookatLon]",m),c=c.replace("[lookatLat]",p),c=c.replace("[lookatTilt]",W.toDegrees(t.pitch).toString()),c=c.replace("[lookatHeading]",W.toDegrees(t.heading).toString()),c=c.replace("[lookatRange]",h.distance(t.positionWC,d)),c=c.replace("[lookatTerrainLon]",m),c=c.replace("[lookatTerrainLat]",p),c=c.replace("[lookatTerrainAlt]",u.height.toString()),r.cartesianToCartographic(t.positionWC,XV),c=c.replace("[cameraLon]",W.toDegrees(XV.longitude).toString()),c=c.replace("[cameraLat]",W.toDegrees(XV.latitude).toString()),c=c.replace("[cameraAlt]",W.toDegrees(XV.height).toString());let g=t.frustum,f=g.aspectRatio,x="",_="";if(l(f)){let C=W.toDegrees(g.fov);f>1?(x=C,_=C/f):(_=C,x=C*f)}c=c.replace("[horizFov]",x.toString()),c=c.replace("[vertFov]",_.toString())}else c=c.replace("[bboxWest]","-180"),c=c.replace("[bboxSouth]","-90"),c=c.replace("[bboxEast]","180"),c=c.replace("[bboxNorth]","90"),c=c.replace("[lookatLon]",""),c=c.replace("[lookatLat]",""),c=c.replace("[lookatRange]",""),c=c.replace("[lookatTilt]",""),c=c.replace("[lookatHeading]",""),c=c.replace("[lookatTerrainLon]",""),c=c.replace("[lookatTerrainLat]",""),c=c.replace("[lookatTerrainAlt]",""),c=c.replace("[cameraLon]",""),c=c.replace("[cameraLat]",""),c=c.replace("[cameraAlt]",""),c=c.replace("[horizFov]",""),c=c.replace("[vertFov]","");l(n)?(c=c.replace("[horizPixels]",n.clientWidth),c=c.replace("[vertPixels]",n.clientHeight)):(c=c.replace("[horizPixels]",""),c=c.replace("[vertPixels]","")),c=c.replace("[terrainEnabled]","1"),c=c.replace("[clientVersion]","1"),c=c.replace("[kmlVersion]","2.2"),c=c.replace("[clientName]","Cesium"),c=c.replace("[language]","English"),e.setQueryParameters(od(c))}function fot(e,t,n,i){let r=mD(e,t,n).entity,s=n.sourceResource,a=n.uriResolver,c=Gi(t,"Link",ve.kml);if(l(c)||(c=Gi(t,"Url",ve.kml)),l(c)){let d=Wn(c,"href",ve.kml),u,m;if(l(d)){let p=d;if(d=$4(d,s,n.uriResolver),/^data:/.test(d.getUrlComponent()))/\.kmz/i.test(s.getUrlComponent())||(p=s.getDerivedResource({url:p}));else{if(p=d.clone(),u=Wn(c,"viewRefreshMode",ve.kml),u==="onRegion"){Ft("kml-refrehMode-onRegion","KML - Unsupported viewRefreshMode: onRegion");return}m=y(Wn(c,"viewBoundScale",ve.kml),1);let _=u==="onStop"?"BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]":"",C=y(Wn(c,"viewFormat",ve.kml),_),V=Wn(c,"httpQuery",ve.kml);l(C)&&d.setQueryParameters(od(lD(C))),l(V)&&d.setQueryParameters(od(lD(V)));let L=e._ellipsoid;ij(d,e.camera,e.canvas,m,e._lastCameraView.bbox,L)}let g={sourceUri:p,uriResolver:a,context:r.id,screenOverlayContainer:n.screenOverlayContainer},f=new Us,x=oj(e,f,d,g).then(function(_){let C=e._entityCollection,V=f.values;C.suspendEvents();for(let G=0;G0||L==="onExpire"||u==="onStop"){let G=Gi(_,"NetworkLinkControl",ve.kml),X=l(G),v=te.now(),P={id:Yn(),href:d,cookie:{},lastUpdated:v,updating:!1,entity:r,viewBoundScale:m,needsUpdate:!1,cameraUpdateTime:v},F=0;if(X&&(P.cookie=od(y(Wn(G,"cookie",ve.kml),"")),F=y(qn(G,"minRefreshPeriod",ve.kml),0)),L==="onInterval")X&&(Z=Math.max(F,Z)),P.refreshMode=_y.INTERVAL,P.time=Z;else if(L==="onExpire"){let A;if(X&&(A=Wn(G,"expires",ve.kml)),l(A))try{let b=te.fromIso8601(A),R=te.secondsDifference(b,v);R>0&&R0;)this._screenOverlays.pop().remove()};function rj(e){let t=e.parent;if(l(t)){let n=t.availability;if(l(n)){let i=e.availability;l(i)?i.intersect(n):e.availability=n}}}function got(e,t,n,i,o){return function(r){if(!i.contains(t.id))return;let s=!1,a=Gi(r,"NetworkLinkControl",ve.kml),c=l(a),d=0;if(c){if(l(Gi(a,"Update",ve.kml))){Ft("kml-networkLinkControl-update","KML - NetworkLinkControl updates aren't supported."),t.updating=!1,i.remove(t.id);return}t.cookie=od(y(Wn(a,"cookie",ve.kml),"")),d=y(qn(a,"minRefreshPeriod",ve.kml),0)}let u=te.now(),m=t.refreshMode;if(m===_y.INTERVAL)l(a)&&(t.time=Math.max(d,t.time));else if(m===_y.EXPIRE){let v;if(l(a)&&(v=Wn(a,"expires",ve.kml)),l(v))try{let P=te.fromIso8601(v),F=te.secondsDifference(P,u);F>0&&Fu.time&&(p=!0):u.refreshMode===_y.EXPIRE?te.greaterThan(n,u.time)&&(p=!0):u.refreshMode===_y.STOP&&(r&&(u.needsUpdate=!0,u.cameraUpdateTime=n),u.needsUpdate&&te.secondsDifference(n,u.cameraUpdateTime)>=u.time&&(p=!0)),p){o(m),u.updating=!0;let g=new Us,f=u.href.clone();f.setQueryParameters(u.cookie);let x=y(i._ellipsoid,ie.WGS84);ij(f,i.camera,i.canvas,u.viewBoundScale,s.bbox,x),oj(i,g,f,{context:m.id}).then(got(i,u,g,c,f)).catch(function(_){let C=`NetworkLink ${u.href} refresh failed: ${_}`;console.log(C),i._error.raiseEvent(i,C)}),d=!0}}c.set(u.id,u)}}),d&&(this._networkLinks=c,this._changed.raiseEvent(this)),!0};function yot(){this.author={name:void 0,uri:void 0,email:void 0},this.link={href:void 0,hreflang:void 0,rel:void 0,type:void 0,title:void 0,length:void 0},this.address=void 0,this.phoneNumber=void 0,this.snippet=void 0,this.extendedData=void 0}Bd._DeferredLoading=Nf;Bd._getTimestamp=fi;var $v=Bd;var lSi=T(S(),1);function ew(){fe.throwInstantiationError()}ew.prototype.update=fe.throwInstantiationError;ew.prototype.getBoundingSphere=fe.throwInstantiationError;ew.prototype.isDestroyed=fe.throwInstantiationError;ew.prototype.destroy=fe.throwInstantiationError;var sj=ew;var NSi=T(S(),1);var aj=32,xot="http://www.opengis.net/kml/2.2",_h="http://www.google.com/kml/ext/2.2",_ot="http://www.w3.org/2000/xmlns/";function hD(e){this._files={},this._promises=[],this._count=0,this._modelCallback=e}var Tot=/^data:image\/([^,;]+)/;hD.prototype.texture=function(e){let t=this,n;if(typeof e=="string"||e instanceof Ee){if(e=Ee.createIfNeeded(e),!e.isDataUri)return e.url;let i=e.url.match(Tot);n=`texture_${++this._count}`,l(i)&&(n+=`.${i[1]}`);let o=e.fetchBlob().then(function(r){t._files[n]=r});return this._promises.push(o),n}if(e instanceof HTMLCanvasElement){n=`texture_${++this._count}.png`;let i=new Promise(o=>{e.toBlob(function(r){t._files[n]=r,o()})});return this._promises.push(i),n}return""};function Sot(e,t){return function(n){e._files[t]=n}}hD.prototype.model=function(e,t){let n=this._modelCallback;if(!l(n))throw new ue("Encountered a model entity while exporting to KML, but no model callback was supplied.");let i={},o=n(e,t,i);for(let r in i)if(i.hasOwnProperty(r)){let s=Promise.resolve(i[r]);this._promises.push(s),s.then(Sot(this,r))}return o};Object.defineProperties(hD.prototype,{promise:{get:function(){return Promise.all(this._promises)}},files:{get:function(){return this._files}}});function fD(e){this._time=e}fD.prototype.get=function(e,t,n){let i;return l(e)&&(i=l(e.getValue)?e.getValue(this._time,n):e),y(i,t)};fD.prototype.getColor=function(e,t){let n=this.get(e,t);if(l(n))return VT(n)};fD.prototype.getMaterialType=function(e){if(l(e))return e.getType(this._time)};function cj(){this._ids={},this._styles={},this._count=0}cj.prototype.get=function(e){let t=this._ids,n=e.innerHTML;if(l(t[n]))return t[n];let i=`style-${++this._count}`;return e.setAttribute("id",i),i=`#${i}`,t[n]=i,this._styles[n]=e,i};cj.prototype.save=function(e){let t=this._styles,n=e.childNodes[0];for(let i in t)t.hasOwnProperty(i)&&e.insertBefore(t[i],n)};function nge(){this._ids={}}nge.prototype.get=function(e){if(!l(e))return this.get(Yn());let t=this._ids;return l(t[e])?`${e.toString()}-${++t[e]}`:(t[e]=0,e)};function lj(e){e=y(e,y.EMPTY_OBJECT);let t=e.entities,n=y(e.kmz,!1),i=lj._createState(e),o=t.values.filter(function(d){return!l(d.parent)}),r=i.kmlDoc,s=r.documentElement;s.setAttributeNS(_ot,"xmlns:gx",_h);let a=r.createElement("Document");s.appendChild(a),oge(i,a,o),i.styleCache.save(a);let c=i.externalFileHandler;return c.promise.then(function(){let u=new XMLSerializer().serializeToString(i.kmlDoc);return n?Cot(u,c.files):{kml:u,externalFiles:c.files}})}function Cot(e,t){let n=tn("ThirdParty/Workers/z-worker-pako.js");SV({workerScripts:{deflate:[n,"./pako_deflate.min.js"],inflate:[n,"./pako_inflate.min.js"]}});let i=new Uv,o=new iD(i);return o.add("doc.kml",new kU(e)).then(function(){let r=Object.keys(t);return ige(o,r,t,0)}).then(function(){return o.close()}).then(function(r){return{kmz:r}})}function ige(e,t,n,i){if(t.length===i)return;let o=t[i];return e.add(o,new O0(n[o])).then(function(){return ige(e,t,n,i+1)})}lj._createState=function(e){let t=e.entities,n=new cj,i=t.computeAvailability(),o=l(e.time)?e.time:i.start,r=y(e.defaultAvailability,i),s=y(e.sampleDuration,60);r.start===Be.MINIMUM_VALUE?r.stop===Be.MAXIMUM_VALUE?r=new Sn:te.addSeconds(r.stop,-10*s,r.start):r.stop===Be.MAXIMUM_VALUE&&te.addSeconds(r.start,10*s,r.stop);let a=new hD(e.modelCallback);return{kmlDoc:document.implementation.createDocument(xot,"kml"),ellipsoid:y(e.ellipsoid,ie.WGS84),idManager:new nge,styleCache:n,externalFileHandler:a,time:o,valueGetter:new fD(o),sampleDuration:s,defaultAvailability:new Xr([r])}};function oge(e,t,n){let i=e.kmlDoc,o=e.styleCache,r=e.valueGetter,s=e.idManager,a=n.length,c,d,u;for(let m=0;m0){let C=i.createElement("Placemark");C.setAttribute("id",s.get(p.id));let V=p.name,L=p.label;if(l(L)){let G=i.createElement("LabelStyle"),X=r.get(L.text);V=l(X)&&X.length>0?X:V;let v=r.getColor(L.fillColor);l(v)&&(G.appendChild(hn(i,"color",v)),G.appendChild(hn(i,"colorMode","normal")));let P=r.get(L.scale);l(P)&&G.appendChild(hn(i,"scale",P)),u.push(G)}C.appendChild(hn(i,"name",V)),C.appendChild(hn(i,"visibility",p.show)),C.appendChild(hn(i,"description",p.description)),l(g)&&C.appendChild(g),t.appendChild(C);let Z=u.length;if(Z>0){let G=i.createElement("Style");for(let X=0;X1){let G=i.createElement("MultiGeometry");for(let X=0;X0){let C=i.createElement("Folder");C.setAttribute("id",s.get(p.id)),C.appendChild(hn(i,"name",p.name)),C.appendChild(hn(i,"visibility",p.show)),C.appendChild(hn(i,"description",p.description)),t.appendChild(C),oge(e,C,_)}}}var Kl=new h,ol=new he,xh=new te;function Vot(e,t,n,i){let o=e.kmlDoc,r=e.ellipsoid,s=e.valueGetter,a=y(t.billboard,t.point);if(!l(a)&&!l(t.path))return;let c=t.position;if(!c.isConstant){rge(e,t,a,n,i);return}s.get(c,void 0,Kl);let d=hn(o,"coordinates",CT(Kl,r)),u=o.createElement("Point"),m=o.createElement("altitudeMode");m.appendChild(LT(e,a.heightReference)),u.appendChild(m),u.appendChild(d),n.push(u);let p=a instanceof rc?age(e,a):sge(e,a);i.push(p)}function rge(e,t,n,i,o){let r=e.kmlDoc,s=e.ellipsoid,a=e.valueGetter,c,d=t.position,u=!0;d instanceof aa?(c=d.intervals,u=!1):c=y(t.availability,e.defaultAvailability);let m=n instanceof Op,p,g,f,x=[];for(p=0;p1){let C=r.createElementNS(_h,"MultiTrack");for(p=0;p0&&(r=n);let s=t.coordinates,a=o.get(s),c=[],d=[ce.northeast,ce.southeast,ce.southwest,ce.northwest];for(let g=0;g<4;++g)d[g](a,ol),c.push(`${W.toDegrees(ol.longitude)},${W.toDegrees(ol.latitude)},${r}`);let u=hn(i,"coordinates",c.join(" ")),m=i.createElement("outerBoundaryIs"),p=i.createElement("LinearRing");return p.appendChild(u),m.appendChild(p),[m]}function ege(e,t,n,i){let o=e.kmlDoc,r=e.ellipsoid,s=[],a=t.length;for(let u=0;u0&&(r=n);let a=[],c=t.hierarchy,d=o.get(c),u=Array.isArray(d)?d:d.positions,m=i.createElement("outerBoundaryIs");m.appendChild(ege(e,u,r,s)),a.push(m);let p=d.holes;if(l(p)){let g=p.length;for(let f=0;f0&&c.appendChild(hn(r,"extrude",!0));let u=a?Rot(e,t,d):Zot(e,t,d),m=u.length;for(let _=0;_=0;--i)t+=n[i]<16?`0${n[i].toString(16)}`:n[i].toString(16);return t}var uj=lj;var eCi=T(S(),1);var USi=T(S(),1),RT=`in vec4 position; in vec2 textureCoordinates; out vec2 v_textureCoordinates; void main() { gl_Position = position; v_textureCoordinates = textureCoordinates; } `;function pD(e){this._context=e}var tw,Xot=new et({primitiveType:Fe.TRIANGLES}),Iot=new oi({color:new Y(0,0,0,0)});function Wot(e,t){return new ia({context:e,colorTextures:[t],destroyAttachments:!1})}function Pot(e,t){return $t.fromCache({context:e,vertexShaderSource:RT,fragmentShaderSource:t,attributeLocations:{position:0,textureCoordinates:1}})}function vot(e,t){return(!l(tw)||tw.viewport.width!==e||tw.viewport.height!==t)&&(tw=De.fromCache({viewport:new He(0,0,e,t)})),tw}pD.prototype.execute=function(e){l(e.preExecute)&&e.preExecute(e);let t=e.outputTexture,n=t.width,i=t.height,o=this._context,r=l(e.vertexArray)?e.vertexArray:o.getViewportQuadVertexArray(),s=l(e.shaderProgram)?e.shaderProgram:Pot(o,e.fragmentShaderSource),a=Wot(o,t),c=vot(n,i),d=e.uniformMap,u=Iot;u.framebuffer=a,u.renderState=c,u.execute(o);let m=Xot;m.vertexArray=r,m.renderState=c,m.shaderProgram=s,m.uniformMap=d,m.framebuffer=a,m.execute(o),a.destroy(),e.persists||(s.destroy(),l(e.vertexArray)&&r.destroy()),l(e.postExecute)&&e.postExecute(t)};pD.prototype.isDestroyed=function(){return!1};pD.prototype.destroy=function(){return me(this)};var nw=pD;var f1i=T(S(),1);var nCi=T(S(),1);function wot(e){this.context=e,this.framebuffer=void 0,this.blendingEnabled=void 0,this.scissorTest=void 0,this.viewport=void 0}var _c=wot;var cCi=T(S(),1);function Th(e){this._context=e,this._shaders={},this._numberOfShaders=0,this._shadersToRelease={}}Object.defineProperties(Th.prototype,{numberOfShaders:{get:function(){return this._numberOfShaders}}});Th.prototype.replaceShaderProgram=function(e){return l(e.shaderProgram)&&e.shaderProgram.destroy(),this.getShaderProgram(e)};function Fot(e){let t=Object.keys(e).sort();return JSON.stringify(e,t)}Th.prototype.getShaderProgram=function(e){let t=e.vertexShaderSource,n=e.fragmentShaderSource,i=e.attributeLocations;typeof t=="string"&&(t=new Ye({sources:[t]})),typeof n=="string"&&(n=new Ye({sources:[n]}));let o=t.getCacheKey(),r=n.getCacheKey(),s=l(i)?Fot(i):"",a=`${o}:${r}:${s}`,c;if(l(this._shaders[a]))c=this._shaders[a],delete this._shadersToRelease[a];else{let d=this._context,u=t.createCombinedVertexShader(d),m=n.createCombinedFragmentShader(d),p=new $t({gl:d._gl,logShaderCompilation:d.logShaderCompilation,debugShaders:d.debugShaders,vertexShaderSource:t,vertexShaderText:u,fragmentShaderSource:n,fragmentShaderText:m,attributeLocations:i});c={cache:this,shaderProgram:p,keyword:a,derivedKeywords:[],count:0},p._cachedShader=c,this._shaders[a]=c,++this._numberOfShaders}return++c.count,c.shaderProgram};Th.prototype.replaceDerivedShaderProgram=function(e,t,n){let i=e._cachedShader,o=t+i.keyword,r=this._shaders[o];if(l(r)){mj(this,r);let s=i.derivedKeywords.indexOf(t);s>-1&&i.derivedKeywords.splice(s,1)}return this.createDerivedShaderProgram(e,t,n)};Th.prototype.getDerivedShaderProgram=function(e,t){let n=e._cachedShader,i=t+n.keyword,o=this._shaders[i];if(l(o))return o.shaderProgram};Th.prototype.createDerivedShaderProgram=function(e,t,n){let i=e._cachedShader,o=t+i.keyword,r=n.vertexShaderSource,s=n.fragmentShaderSource,a=n.attributeLocations;typeof r=="string"&&(r=new Ye({sources:[r]})),typeof s=="string"&&(s=new Ye({sources:[s]}));let c=this._context,d=r.createCombinedVertexShader(c),u=s.createCombinedFragmentShader(c),m=new $t({gl:c._gl,logShaderCompilation:c.logShaderCompilation,debugShaders:c.debugShaders,vertexShaderSource:r,vertexShaderText:d,fragmentShaderSource:s,fragmentShaderText:u,attributeLocations:a}),p={cache:this,shaderProgram:m,keyword:o,derivedKeywords:[],count:0};return i.derivedKeywords.push(t),m._cachedShader=p,this._shaders[o]=p,m};function mj(e,t){let n=t.derivedKeywords,i=n.length;for(let o=0;o0&&(e._eyeEllipsoidNormalEC=h.normalize(t.positionWC,e._eyeEllipsoidNormalEC)),i=n.scaleToGeodeticSurface(t.positionWC,lge)),e._encodedCameraPositionMCDirty=!0,!l(i))return;e._eyeEllipsoidNormalEC=$.multiplyByVector(e._viewRotation,e._eyeEllipsoidNormalEC,e._eyeEllipsoidNormalEC);let r=Gt.eastNorthUpToFixedFrame(i,n,Dot);e._enuToModel=M.multiplyTransformation(e.inverseModel,r,e._enuToModel),e._modelToEnu=M.inverseTransformation(e._enuToModel,e._modelToEnu),W.equalsEpsilon(n._radii.x,n._radii.y,W.EPSILON15)&&(e._eyeEllipsoidCurvature=n.getLocalCurvature(i,e._eyeEllipsoidCurvature))}var rw=new $,Yot=new he;function Oot(e,t){l(Gt.computeIcrfToFixedMatrix(t.time,rw))||(rw=Gt.computeTemeToPseudoFixedMatrix(t.time,rw));let n=ig.computeSunPositionInEarthInertialFrame(t.time,e._sunPositionWC);$.multiplyByVector(rw,n,n),h.normalize(n,e._sunDirectionWC),n=$.multiplyByVector(e.viewRotation3D,n,e._sunDirectionEC),h.normalize(n,n),n=ig.computeMoonPositionInEarthInertialFrame(t.time,e._moonDirectionEC),$.multiplyByVector(rw,n,n),$.multiplyByVector(e.viewRotation3D,n,n),h.normalize(n,n);let i=t.mapProjection,r=i.ellipsoid.cartesianToCartographic(e._sunPositionWC,Yot);i.project(r,e._sunPositionColumbusView)}IV.prototype.updateCamera=function(e){Mot(this,e.viewMatrix),Not(this,e.inverseViewMatrix),Bot(this,e),this._entireFrustum.x=e.frustum.near,this._entireFrustum.y=e.frustum.far,this.updateFrustum(e.frustum),this._orthographicIn3D=this._mode!==oe.SCENE2D&&e.frustum instanceof on};IV.prototype.updateFrustum=function(e){kot(this,e.projectionMatrix),l(e.infiniteProjectionMatrix)&&Uot(this,e.infiniteProjectionMatrix),this._currentFrustum.x=e.near,this._currentFrustum.y=e.far,this._farDepthFromNearPlusOne=e.far-e.near+1,this._log2FarDepthFromNearPlusOne=W.log2(this._farDepthFromNearPlusOne),this._oneOverLog2FarDepthFromNearPlusOne=1/this._log2FarDepthFromNearPlusOne;let t=e.offCenterFrustum;l(t)&&(e=t),this._frustumPlanes.x=e.top,this._frustumPlanes.y=e.bottom,this._frustumPlanes.z=e.left,this._frustumPlanes.w=e.right};IV.prototype.updatePass=function(e){this._pass=e};var Hot=[],zot=new H0;IV.prototype.update=function(e){this._mode=e.mode,this._mapProjection=e.mapProjection,this._ellipsoid=e.mapProjection.ellipsoid,this._pixelRatio=e.pixelRatio;let t=e.camera;this.updateCamera(t),e.mode===oe.SCENE2D?(this._frustum2DWidth=t.frustum.right-t.frustum.left,this._eyeHeight2D.x=this._frustum2DWidth*.5,this._eyeHeight2D.y=this._eyeHeight2D.x*this._eyeHeight2D.x):(this._frustum2DWidth=0,this._eyeHeight2D.x=0,this._eyeHeight2D.y=0),Oot(this,e);let n=y(e.light,zot);n instanceof H0?(this._lightDirectionWC=h.clone(this._sunDirectionWC,this._lightDirectionWC),this._lightDirectionEC=h.clone(this._sunDirectionEC,this._lightDirectionEC)):(this._lightDirectionWC=h.normalize(h.negate(n.direction,this._lightDirectionWC),this._lightDirectionWC),this._lightDirectionEC=$.multiplyByVector(this.viewRotation3D,this._lightDirectionWC,this._lightDirectionEC));let i=n.color,o=h.fromElements(i.red,i.green,i.blue,this._lightColorHdr);o=h.multiplyByScalar(o,n.intensity,o);let r=h.maximumComponent(o);r>1?h.divideByScalar(o,r,this._lightColor):h.clone(o,this._lightColor);let s=e.brdfLutGenerator,a=l(s)?s.colorTexture:void 0;this._brdfLut=a,this._environmentMap=y(e.environmentMap,e.context.defaultCubeMap),this._sphericalHarmonicCoefficients=y(e.sphericalHarmonicCoefficients,Hot),this._specularEnvironmentMaps=e.specularEnvironmentMaps,this._specularEnvironmentMapsMaximumLOD=e.specularEnvironmentMapsMaximumLOD,l(this._specularEnvironmentMaps)&&D.clone(this._specularEnvironmentMaps.dimensions,this._specularEnvironmentMapsDimensions),this._fogDensity=e.fog.density,this._fogMinimumBrightness=e.fog.minimumBrightness;let c=e.atmosphere;l(c)&&(this._atmosphereHsbShift=h.fromElements(c.hueShift,c.saturationShift,c.brightnessShift,this._atmosphereHsbShift),this._atmosphereLightIntensity=c.lightIntensity,this._atmosphereRayleighCoefficient=h.clone(c.rayleighCoefficient,this._atmosphereRayleighCoefficient),this._atmosphereRayleighScaleHeight=c.rayleighScaleHeight,this._atmosphereMieCoefficient=h.clone(c.mieCoefficient,this._atmosphereMieCoefficient),this._atmosphereMieScaleHeight=c.mieScaleHeight,this._atmosphereMieAnisotropy=c.mieAnisotropy,this._atmosphereDynamicLighting=c.dynamicLighting),this._invertClassificationColor=e.invertClassificationColor,this._frameState=e,this._temeToPseudoFixed=Gt.computeTemeToPseudoFixedMatrix(e.time,this._temeToPseudoFixed),this._splitPosition=e.splitPosition*e.context.drawingBufferWidth;let d=t.frustum.fov,u=this._viewport,m;l(d)?u.height>u.width?m=Math.tan(.5*d)*2/u.height:m=Math.tan(.5*d)*2/u.width:m=1/Math.max(u.width,u.height),this._geometricToleranceOverMeter=m*e.maximumScreenSpaceError,Y.clone(e.backgroundColor,this._backgroundColor),this._minimumDisableDepthTestDistance=e.minimumDisableDepthTestDistance,this._minimumDisableDepthTestDistance*=this._minimumDisableDepthTestDistance,this._minimumDisableDepthTestDistance===Number.POSITIVE_INFINITY&&(this._minimumDisableDepthTestDistance=-1)};function dge(e){if(e._viewportDirty){let t=e._viewport;M.computeOrthographicOffCenter(t.x,t.x+t.width,t.y,t.y+t.height,0,1,e._viewportOrthographicMatrix),M.computeViewportTransformation(t,0,1,e._viewportTransformation),e._viewportDirty=!1}}function Kot(e){e._inverseProjectionDirty&&(e._inverseProjectionDirty=!1,e._mode!==oe.SCENE2D&&e._mode!==oe.MORPHING&&!e._orthographicIn3D?M.inverse(e._projection,e._inverseProjection):M.clone(M.ZERO,e._inverseProjection))}function Jot(e){e._modelViewDirty&&(e._modelViewDirty=!1,M.multiplyTransformation(e._view,e._model,e._modelView))}function Qot(e){e._modelView3DDirty&&(e._modelView3DDirty=!1,M.multiplyTransformation(e.view3D,e._model,e._modelView3D))}function jot(e){e._inverseModelViewDirty&&(e._inverseModelViewDirty=!1,M.inverse(e.modelView,e._inverseModelView))}function qot(e){e._inverseModelView3DDirty&&(e._inverseModelView3DDirty=!1,M.inverse(e.modelView3D,e._inverseModelView3D))}function $ot(e){e._viewProjectionDirty&&(e._viewProjectionDirty=!1,M.multiply(e._projection,e._view,e._viewProjection))}function ert(e){e._inverseViewProjectionDirty&&(e._inverseViewProjectionDirty=!1,M.inverse(e.viewProjection,e._inverseViewProjection))}function trt(e){e._modelViewProjectionDirty&&(e._modelViewProjectionDirty=!1,M.multiply(e._projection,e.modelView,e._modelViewProjection))}function nrt(e){if(e._modelViewRelativeToEyeDirty){e._modelViewRelativeToEyeDirty=!1;let t=e.modelView,n=e._modelViewRelativeToEye;n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[8]=t[8],n[9]=t[9],n[10]=t[10],n[11]=t[11],n[12]=0,n[13]=0,n[14]=0,n[15]=t[15]}}function irt(e){e._inverseModelViewProjectionDirty&&(e._inverseModelViewProjectionDirty=!1,M.inverse(e.modelViewProjection,e._inverseModelViewProjection))}function ort(e){e._modelViewProjectionRelativeToEyeDirty&&(e._modelViewProjectionRelativeToEyeDirty=!1,M.multiply(e._projection,e.modelViewRelativeToEye,e._modelViewProjectionRelativeToEye))}function rrt(e){e._modelViewInfiniteProjectionDirty&&(e._modelViewInfiniteProjectionDirty=!1,M.multiply(e._infiniteProjection,e.modelView,e._modelViewInfiniteProjection))}function srt(e){if(e._normalDirty){e._normalDirty=!1;let t=e._normal;M.getMatrix3(e.inverseModelView,t),$.transpose(t,t)}}function art(e){if(e._normal3DDirty){e._normal3DDirty=!1;let t=e._normal3D;M.getMatrix3(e.inverseModelView3D,t),$.transpose(t,t)}}function crt(e){if(e._inverseNormalDirty){e._inverseNormalDirty=!1;let t=e._inverseNormal;M.getMatrix3(e.modelView,t),$.transpose(t,t)}}function lrt(e){if(e._inverseNormal3DDirty){e._inverseNormal3DDirty=!1;let t=e._inverseNormal3D;M.getMatrix3(e.modelView3D,t),$.transpose(t,t)}}var uge=new h;function mge(e){e._encodedCameraPositionMCDirty&&(e._encodedCameraPositionMCDirty=!1,M.multiplyByPoint(e.inverseModel,e._cameraPosition,uge),Bn.fromCartesian(uge,e._encodedCameraPositionMC))}var drt=new h,urt=new h,mrt=new h,hrt=new h,frt=new he,prt=new h,brt=new M;function grt(e,t,n,i,o,r,s,a){let c=drt;c.x=e.y,c.y=e.z,c.z=e.x;let d=urt;d.x=n.y,d.y=n.z,d.z=n.x;let u=mrt;u.x=i.y,u.y=i.z,u.z=i.x;let m=hrt;m.x=t.y,m.y=t.z,m.z=t.x,r===oe.SCENE2D&&(c.z=o*.5);let p=s.unproject(c,frt);p.longitude=W.clamp(p.longitude,-Math.PI,Math.PI),p.latitude=W.clamp(p.latitude,-W.PI_OVER_TWO,W.PI_OVER_TWO);let g=s.ellipsoid,f=g.cartographicToCartesian(p,prt),x=Gt.eastNorthUpToFixedFrame(f,g,brt);return M.multiplyByPointAsVector(x,d,d),M.multiplyByPointAsVector(x,u,u),M.multiplyByPointAsVector(x,m,m),l(a)||(a=new M),a[0]=d.x,a[1]=u.x,a[2]=-m.x,a[3]=0,a[4]=d.y,a[5]=u.y,a[6]=-m.y,a[7]=0,a[8]=d.z,a[9]=u.z,a[10]=-m.z,a[11]=0,a[12]=-h.dot(d,f),a[13]=-h.dot(u,f),a[14]=h.dot(m,f),a[15]=1,a}function hj(e){e._view3DDirty&&(e._mode===oe.SCENE3D?M.clone(e._view,e._view3D):grt(e._cameraPosition,e._cameraDirection,e._cameraRight,e._cameraUp,e._frustum2DWidth,e._mode,e._mapProjection,e._view3D),M.getMatrix3(e._view3D,e._viewRotation3D),e._view3DDirty=!1)}function hge(e){e._inverseView3DDirty&&(M.inverseTransformation(e.view3D,e._inverseView3D),M.getMatrix3(e._inverseView3D,e._inverseViewRotation3D),e._inverseView3DDirty=!1)}var sw=IV;function Yd(e,t){let{getWebGLStub:n,requestWebgl1:i,webgl:o={},allowTextureFilterAnisotropic:r=!0}=y(t,{});o.alpha=y(o.alpha,!1),o.stencil=y(o.stencil,!0),o.powerPreference=y(o.powerPreference,"high-performance");let s=l(n)?n(e,o):yrt(e,o,i),c=typeof WebGL2RenderingContext<"u"&&s instanceof WebGL2RenderingContext;this._canvas=e,this._originalGLContext=s,this._gl=s,this._webgl2=c,this._id=Yn(),this.validateFramebuffer=!1,this.validateShaderProgram=!1,this.logShaderCompilation=!1,this._throwOnWebGLError=!1,this._shaderCache=new iw(this),this._textureCache=new ow;let d=s;this._stencilBits=d.getParameter(d.STENCIL_BITS),Mt._maximumCombinedTextureImageUnits=d.getParameter(d.MAX_COMBINED_TEXTURE_IMAGE_UNITS),Mt._maximumCubeMapSize=d.getParameter(d.MAX_CUBE_MAP_TEXTURE_SIZE),Mt._maximumFragmentUniformVectors=d.getParameter(d.MAX_FRAGMENT_UNIFORM_VECTORS),Mt._maximumTextureImageUnits=d.getParameter(d.MAX_TEXTURE_IMAGE_UNITS),Mt._maximumRenderbufferSize=d.getParameter(d.MAX_RENDERBUFFER_SIZE),Mt._maximumTextureSize=d.getParameter(d.MAX_TEXTURE_SIZE),Mt._maximumVaryingVectors=d.getParameter(d.MAX_VARYING_VECTORS),Mt._maximumVertexAttributes=d.getParameter(d.MAX_VERTEX_ATTRIBS),Mt._maximumVertexTextureImageUnits=d.getParameter(d.MAX_VERTEX_TEXTURE_IMAGE_UNITS),Mt._maximumVertexUniformVectors=d.getParameter(d.MAX_VERTEX_UNIFORM_VECTORS),Mt._maximumSamples=this._webgl2?d.getParameter(d.MAX_SAMPLES):0;let u=d.getParameter(d.ALIASED_LINE_WIDTH_RANGE);Mt._minimumAliasedLineWidth=u[0],Mt._maximumAliasedLineWidth=u[1];let m=d.getParameter(d.ALIASED_POINT_SIZE_RANGE);Mt._minimumAliasedPointSize=m[0],Mt._maximumAliasedPointSize=m[1];let p=d.getParameter(d.MAX_VIEWPORT_DIMS);Mt._maximumViewportWidth=p[0],Mt._maximumViewportHeight=p[1];let g=d.getShaderPrecisionFormat(d.FRAGMENT_SHADER,d.HIGH_FLOAT);Mt._highpFloatSupported=g.precision!==0;let f=d.getShaderPrecisionFormat(d.FRAGMENT_SHADER,d.HIGH_INT);Mt._highpIntSupported=f.rangeMax!==0,this._antialias=d.getContextAttributes().antialias,this._standardDerivatives=!!Ar(d,["OES_standard_derivatives"]),this._blendMinmax=!!Ar(d,["EXT_blend_minmax"]),this._elementIndexUint=!!Ar(d,["OES_element_index_uint"]),this._depthTexture=!!Ar(d,["WEBGL_depth_texture","WEBKIT_WEBGL_depth_texture"]),this._fragDepth=!!Ar(d,["EXT_frag_depth"]),this._debugShaders=Ar(d,["WEBGL_debug_shaders"]),this._textureFloat=!!Ar(d,["OES_texture_float"]),this._textureHalfFloat=!!Ar(d,["OES_texture_half_float"]),this._textureFloatLinear=!!Ar(d,["OES_texture_float_linear"]),this._textureHalfFloatLinear=!!Ar(d,["OES_texture_half_float_linear"]),this._colorBufferFloat=!!Ar(d,["EXT_color_buffer_float","WEBGL_color_buffer_float"]),this._floatBlend=!!Ar(d,["EXT_float_blend"]),this._colorBufferHalfFloat=!!Ar(d,["EXT_color_buffer_half_float"]),this._s3tc=!!Ar(d,["WEBGL_compressed_texture_s3tc","MOZ_WEBGL_compressed_texture_s3tc","WEBKIT_WEBGL_compressed_texture_s3tc"]),this._pvrtc=!!Ar(d,["WEBGL_compressed_texture_pvrtc","WEBKIT_WEBGL_compressed_texture_pvrtc"]),this._astc=!!Ar(d,["WEBGL_compressed_texture_astc"]),this._etc=!!Ar(d,["WEBG_compressed_texture_etc"]),this._etc1=!!Ar(d,["WEBGL_compressed_texture_etc1"]),this._bc7=!!Ar(d,["EXT_texture_compression_bptc"]),Rl.setKTX2SupportedFormats(this._s3tc,this._pvrtc,this._astc,this._etc,this._etc1,this._bc7);let x=r?Ar(d,["EXT_texture_filter_anisotropic","WEBKIT_EXT_texture_filter_anisotropic"]):void 0;this._textureFilterAnisotropic=x,Mt._maximumTextureFilterAnisotropy=l(x)?d.getParameter(x.MAX_TEXTURE_MAX_ANISOTROPY_EXT):1;let _,C,V,L,Z,G,X,v,P,F;if(c){let E=this;_=function(){return E._gl.createVertexArray()},C=function(I){E._gl.bindVertexArray(I)},V=function(I){E._gl.deleteVertexArray(I)},L=function(I,w,N,B,U){d.drawElementsInstanced(I,w,N,B,U)},Z=function(I,w,N,B){d.drawArraysInstanced(I,w,N,B)},G=function(I,w){d.vertexAttribDivisor(I,w)},X=function(I){d.drawBuffers(I)}}else v=Ar(d,["OES_vertex_array_object"]),l(v)&&(_=function(){return v.createVertexArrayOES()},C=function(E){v.bindVertexArrayOES(E)},V=function(E){v.deleteVertexArrayOES(E)}),P=Ar(d,["ANGLE_instanced_arrays"]),l(P)&&(L=function(E,I,w,N,B){P.drawElementsInstancedANGLE(E,I,w,N,B)},Z=function(E,I,w,N){P.drawArraysInstancedANGLE(E,I,w,N)},G=function(E,I){P.vertexAttribDivisorANGLE(E,I)}),F=Ar(d,["WEBGL_draw_buffers"]),l(F)&&(X=function(E){F.drawBuffersWEBGL(E)});this.glCreateVertexArray=_,this.glBindVertexArray=C,this.glDeleteVertexArray=V,this.glDrawElementsInstanced=L,this.glDrawArraysInstanced=Z,this.glVertexAttribDivisor=G,this.glDrawBuffers=X,this._vertexArrayObject=!!v,this._instancedArrays=!!P,this._drawBuffers=!!F,Mt._maximumDrawBuffers=this.drawBuffers?d.getParameter(ne.MAX_DRAW_BUFFERS):1,Mt._maximumColorAttachments=this.drawBuffers?d.getParameter(ne.MAX_COLOR_ATTACHMENTS):1,this._clearColor=new Y(0,0,0,0),this._clearDepth=1,this._clearStencil=0;let A=new sw,b=new _c(this),R=De.fromCache();this._defaultPassState=b,this._defaultRenderState=R,this._defaultTexture=void 0,this._defaultEmissiveTexture=void 0,this._defaultNormalTexture=void 0,this._defaultCubeMap=void 0,this._us=A,this._currentRenderState=R,this._currentPassState=b,this._currentFramebuffer=void 0,this._maxFrameTextureUnitIndex=0,this._vertexAttribDivisors=[],this._previousDrawInstanced=!1;for(let E=0;E"u")throw new ue("The browser does not support WebGL. Visit http://get.webgl.org.");!n&&!(typeof WebGL2RenderingContext<"u")&&(n=!0);let o=(n || !Potree.settings.isWebgl2) ?"webgl":"webgl2",r=e.getContext(o,t);if(!l(r))throw new ue("The browser supports WebGL, but initialization failed.");return r}function xrt(e,t){let n="WebGL Error: ";switch(t){case e.INVALID_ENUM:n+="INVALID_ENUM";break;case e.INVALID_VALUE:n+="INVALID_VALUE";break;case e.INVALID_OPERATION:n+="INVALID_OPERATION";break;case e.OUT_OF_MEMORY:n+="OUT_OF_MEMORY";break;case e.CONTEXT_LOST_WEBGL:n+="CONTEXT_LOST_WEBGL lost";break;default:n+=`Unknown (${t})`}return n}function _rt(e,t,n,i){let o=`${xrt(e,i)}: ${t.name}(`;for(let r=0;r=8}},antialias:{get:function(){return this._antialias}},msaa:{get:function(){return this._webgl2}},standardDerivatives:{get:function(){return this._standardDerivatives||this._webgl2}},floatBlend:{get:function(){return this._floatBlend}},blendMinmax:{get:function(){return this._blendMinmax||this._webgl2}},elementIndexUint:{get:function(){return this._elementIndexUint||this._webgl2}},depthTexture:{get:function(){return this._depthTexture||this._webgl2}},floatingPointTexture:{get:function(){return this._webgl2||this._textureFloat}},halfFloatingPointTexture:{get:function(){return this._webgl2||this._textureHalfFloat}},textureFloatLinear:{get:function(){return this._textureFloatLinear}},textureHalfFloatLinear:{get:function(){return this._webgl2&&this._textureFloatLinear||!this._webgl2&&this._textureHalfFloatLinear}},textureFilterAnisotropic:{get:function(){return!!this._textureFilterAnisotropic}},s3tc:{get:function(){return this._s3tc}},pvrtc:{get:function(){return this._pvrtc}},astc:{get:function(){return this._astc}},etc:{get:function(){return this._etc}},etc1:{get:function(){return this._etc1}},bc7:{get:function(){return this._bc7}},supportsBasis:{get:function(){return this._s3tc||this._pvrtc||this._astc||this._etc||this._etc1||this._bc7}},vertexArrayObject:{get:function(){return this._vertexArrayObject||this._webgl2}},fragmentDepth:{get:function(){return this._fragDepth||this._webgl2}},instancedArrays:{get:function(){return this._instancedArrays||this._webgl2}},colorBufferFloat:{get:function(){return this._colorBufferFloat}},colorBufferHalfFloat:{get:function(){return this._webgl2&&this._colorBufferFloat||!this._webgl2&&this._colorBufferHalfFloat}},drawBuffers:{get:function(){return this._drawBuffers||this._webgl2}},debugShaders:{get:function(){return this._debugShaders}},throwOnWebGLError:{get:function(){return this._throwOnWebGLError},set:function(e){this._throwOnWebGLError=e,this._gl=Crt(this._originalGLContext,e?Trt:void 0)}},defaultTexture:{get:function(){return this._defaultTexture===void 0&&(this._defaultTexture=new Et({context:this,source:{width:1,height:1,arrayBufferView:new Uint8Array([255,255,255,255])},flipY:!1})),this._defaultTexture}},defaultEmissiveTexture:{get:function(){return this._defaultEmissiveTexture===void 0&&(this._defaultEmissiveTexture=new Et({context:this,pixelFormat:at.RGB,source:{width:1,height:1,arrayBufferView:new Uint8Array([0,0,0])},flipY:!1})),this._defaultEmissiveTexture}},defaultNormalTexture:{get:function(){return this._defaultNormalTexture===void 0&&(this._defaultNormalTexture=new Et({context:this,pixelFormat:at.RGB,source:{width:1,height:1,arrayBufferView:new Uint8Array([128,128,255])},flipY:!1})),this._defaultNormalTexture}},defaultCubeMap:{get:function(){if(this._defaultCubeMap===void 0){let e={width:1,height:1,arrayBufferView:new Uint8Array([255,255,255,255])};this._defaultCubeMap=new sc({context:this,source:{positiveX:e,negativeX:e,positiveY:e,negativeY:e,positiveZ:e,negativeZ:e},flipY:!1})}return this._defaultCubeMap}},drawingBufferHeight:{get:function(){return this._gl.drawingBufferHeight}},drawingBufferWidth:{get:function(){return this._gl.drawingBufferWidth}},defaultFramebuffer:{get:function(){return Vrt}}});function fge(e,t,n,i){let o=e._currentRenderState,r=e._currentPassState;e._currentRenderState=t,e._currentPassState=n,De.partialApply(e._gl,o,t,r,n,i)}var fj;typeof WebGLRenderingContext<"u"&&(fj=[ne.BACK]);function pj(e,t){if(t!==e._currentFramebuffer){e._currentFramebuffer=t;let n=fj;if(l(t))t._bind(),n=t._getActiveColorAttachments();else{let i=e._gl;i.bindFramebuffer(i.FRAMEBUFFER,null)}e.drawBuffers&&e.glDrawBuffers(n)}}var Lrt=new oi;Yd.prototype.clear=function(e,t){e=y(e,Lrt),t=y(t,this._defaultPassState);let n=this._gl,i=0,o=e.color,r=e.depth,s=e.stencil;l(o)&&(Y.equals(this._clearColor,o)||(Y.clone(o,this._clearColor),n.clearColor(o.red,o.green,o.blue,o.alpha)),i|=n.COLOR_BUFFER_BIT),l(r)&&(r!==this._clearDepth&&(this._clearDepth=r,n.clearDepth(r)),i|=n.DEPTH_BUFFER_BIT),l(s)&&(s!==this._clearStencil&&(this._clearStencil=s,n.clearStencil(s)),i|=n.STENCIL_BUFFER_BIT);let a=y(e.renderState,this._defaultRenderState);fge(this,a,t,!0);let c=y(e.framebuffer,t.framebuffer);pj(this,c),n.clear(i)};function Rrt(e,t,n,i,o){pj(e,t),fge(e,o,n,!1),i._bind(),e._maxFrameTextureUnitIndex=Math.max(e._maxFrameTextureUnitIndex,i.maximumTextureUnitIndex)}function Zrt(e,t,n,i){let o=t._primitiveType,r=t._vertexArray,s=t._offset,a=t._count,c=t.instanceCount;e._us.model=y(t._modelMatrix,M.IDENTITY),n._setUniforms(i,e._us,e.validateShaderProgram),r._bind();let d=r.indexBuffer;l(d)?(s=s*d.bytesPerIndex,l(a)?a=Math.min(a,d.numberOfIndices):a=d.numberOfIndices,c===0?e._gl.drawElements(o,a,d.indexDatatype,s):e.glDrawElementsInstanced(o,a,d.indexDatatype,s,c)):(l(a)?a=Math.min(a,r.numberOfVertices):a=r.numberOfVertices,c===0?e._gl.drawArrays(o,s,a):e.glDrawArraysInstanced(o,s,a,c)),r._unBind()}Yd.prototype.draw=function(e,t,n,i){t=y(t,this._defaultPassState);let o=y(e._framebuffer,t.framebuffer),r=y(e._renderState,this._defaultRenderState);n=y(n,e._shaderProgram),i=y(i,e._uniformMap),Rrt(this,o,t,n,r),Zrt(this,e,n,i)};Yd.prototype.endFrame=function(){let e=this._gl;e.useProgram(null),this._currentFramebuffer=void 0,e.bindFramebuffer(e.FRAMEBUFFER,null);let t=fj;this.drawBuffers&&this.glDrawBuffers(t);let n=this._maxFrameTextureUnitIndex;this._maxFrameTextureUnitIndex=0;for(let i=0;i0&&(a=s.getColorTexture(0).pixelDatatype);let c=at.createTypedArray(at.RGBA,a,o,r);return pj(this,s),t.readPixels(n,i,o,r,at.RGBA,ze.toWebGLConstant(a,this),c),c};var pge={position:0,textureCoordinates:1};Yd.prototype.getViewportQuadVertexArray=function(){let e=this.cache.viewportQuad_vertexArray;if(!l(e)){let t=new ut({attributes:{position:new Ge({componentDatatype:Q.FLOAT,componentsPerAttribute:2,values:[-1,-1,1,-1,1,1,-1,1]}),textureCoordinates:new Ge({componentDatatype:Q.FLOAT,componentsPerAttribute:2,values:[0,0,1,0,1,1,0,1]})},indices:new Uint16Array([0,1,2,0,2,3]),primitiveType:Fe.TRIANGLES});e=ti.fromGeometry({context:this,geometry:t,attributeLocations:pge,bufferUsage:Ne.STATIC_DRAW,interleave:!0}),this.cache.viewportQuad_vertexArray=e}return e};Yd.prototype.createViewportQuadCommand=function(e,t){return t=y(t,y.EMPTY_OBJECT),new et({vertexArray:this.getViewportQuadVertexArray(),primitiveType:Fe.TRIANGLES,renderState:t.renderState,shaderProgram:$t.fromCache({context:this,vertexShaderSource:RT,fragmentShaderSource:e,attributeLocations:pge}),uniformMap:t.uniformMap,owner:t.owner,framebuffer:t.framebuffer,pass:t.pass})};Yd.prototype.getObjectByPickColor=function(e){return this._pickObjects[e.toRgba()]};function bj(e,t,n){this._pickObjects=e,this.key=t,this.color=n}Object.defineProperties(bj.prototype,{object:{get:function(){return this._pickObjects[this.key]},set:function(e){this._pickObjects[this.key]=e}}});bj.prototype.destroy=function(){delete this._pickObjects[this.key]};Yd.prototype.createPickId=function(e){++this._nextPickColor[0];let t=this._nextPickColor[0];if(t===0)throw new ue("Out of unique Pick IDs.");return this._pickObjects[t]=e,new bj(this._pickObjects,t,Y.fromRgba(t))};Yd.prototype.isDestroyed=function(){return!1};Yd.prototype.destroy=function(){let e=this.cache;for(let t in e)if(e.hasOwnProperty(t)){let n=e[t];l(n.destroy)&&n.destroy()}return this._shaderCache=this._shaderCache.destroy(),this._textureCache=this._textureCache.destroy(),this._defaultTexture=this._defaultTexture&&this._defaultTexture.destroy(),this._defaultEmissiveTexture=this._defaultEmissiveTexture&&this._defaultEmissiveTexture.destroy(),this._defaultNormalTexture=this._defaultNormalTexture&&this._defaultNormalTexture.destroy(),this._defaultCubeMap=this._defaultCubeMap&&this._defaultCubeMap.destroy(),me(this)};Yd._deprecationWarning=Is;var aw=Yd;var y1i=T(S(),1);function Grt(e,t,n){let i={flipY:!0,skipColorSpaceConversion:n,preferImageBitmap:!0},o=[Ee.createIfNeeded(t.positiveX).fetchImage(i),Ee.createIfNeeded(t.negativeX).fetchImage(i),Ee.createIfNeeded(t.positiveY).fetchImage(i),Ee.createIfNeeded(t.negativeY).fetchImage(i),Ee.createIfNeeded(t.positiveZ).fetchImage(i),Ee.createIfNeeded(t.negativeZ).fetchImage(i)];return Promise.all(o).then(function(r){return new sc({context:e,source:{positiveX:r[0],negativeX:r[1],positiveY:r[2],negativeY:r[3],positiveZ:r[4],negativeZ:r[5]}})})}var cw=Grt;var _1i=T(S(),1),WV=`#ifdef MRT layout (location = 0) out vec4 out_FragData_0; layout (location = 1) out vec4 out_FragData_1; #else layout (location = 0) out vec4 out_FragColor; #endif uniform vec4 u_bgColor; uniform sampler2D u_depthTexture; in vec2 v_textureCoordinates; void main() { if (texture(u_depthTexture, v_textureCoordinates).r < 1.0) { #ifdef MRT out_FragData_0 = u_bgColor; out_FragData_1 = vec4(u_bgColor.a); #else out_FragColor = u_bgColor; #endif return; } discard; } `;var S1i=T(S(),1),z0=`uniform vec3 u_radiiAndDynamicAtmosphereColor; uniform float u_atmosphereLightIntensity; uniform float u_atmosphereRayleighScaleHeight; uniform float u_atmosphereMieScaleHeight; uniform float u_atmosphereMieAnisotropy; uniform vec3 u_atmosphereRayleighCoefficient; uniform vec3 u_atmosphereMieCoefficient; const float ATMOSPHERE_THICKNESS = 111e3; // The thickness of the atmosphere in meters. const int PRIMARY_STEPS_MAX = 16; // Maximum number of times the ray from the camera to the world position (primary ray) is sampled. const int LIGHT_STEPS_MAX = 4; // Maximum number of times the light is sampled from the light source's intersection with the atmosphere to a sample position on the primary ray. /** * This function computes the colors contributed by Rayliegh and Mie scattering on a given ray, as well as * the transmittance value for the ray. * * @param {czm_ray} primaryRay The ray from the camera to the position. * @param {float} primaryRayLength The length of the primary ray. * @param {vec3} lightDirection The direction of the light to calculate the scattering from. * @param {vec3} rayleighColor The variable the Rayleigh scattering will be written to. * @param {vec3} mieColor The variable the Mie scattering will be written to. * @param {float} opacity The variable the transmittance will be written to. * @glslFunction */ void computeScattering( czm_ray primaryRay, float primaryRayLength, vec3 lightDirection, float atmosphereInnerRadius, out vec3 rayleighColor, out vec3 mieColor, out float opacity ) { // Initialize the default scattering amounts to 0. rayleighColor = vec3(0.0); mieColor = vec3(0.0); opacity = 0.0; float atmosphereOuterRadius = atmosphereInnerRadius + ATMOSPHERE_THICKNESS; vec3 origin = vec3(0.0); // Calculate intersection from the camera to the outer ring of the atmosphere. czm_raySegment primaryRayAtmosphereIntersect = czm_raySphereIntersectionInterval(primaryRay, origin, atmosphereOuterRadius); // Return empty colors if no intersection with the atmosphere geometry. if (primaryRayAtmosphereIntersect == czm_emptyRaySegment) { return; } // To deal with smaller values of PRIMARY_STEPS (e.g. 4) // we implement a split strategy: sky or horizon. // For performance reasons, instead of a if/else branch // a soft choice is implemented through a weight 0.0 <= w_stop_gt_lprl <= 1.0 float x = 1e-7 * primaryRayAtmosphereIntersect.stop / length(primaryRayLength); // Value close to 0.0: close to the horizon // Value close to 1.0: above in the sky float w_stop_gt_lprl = 0.5 * (1.0 + czm_approximateTanh(x)); // The ray should start from the first intersection with the outer atmopshere, or from the camera position, if it is inside the atmosphere. float start_0 = primaryRayAtmosphereIntersect.start; primaryRayAtmosphereIntersect.start = max(primaryRayAtmosphereIntersect.start, 0.0); // The ray should end at the exit from the atmosphere or at the distance to the vertex, whichever is smaller. primaryRayAtmosphereIntersect.stop = min(primaryRayAtmosphereIntersect.stop, length(primaryRayLength)); // For the number of ray steps, distinguish inside or outside atmosphere (outer space) // (1) from outer space we have to use more ray steps to get a realistic rendering // (2) within atmosphere we need fewer steps for faster rendering float x_o_a = start_0 - ATMOSPHERE_THICKNESS; // ATMOSPHERE_THICKNESS used as an ad-hoc constant, no precise meaning here, only the order of magnitude matters float w_inside_atmosphere = 1.0 - 0.5 * (1.0 + czm_approximateTanh(x_o_a)); int PRIMARY_STEPS = PRIMARY_STEPS_MAX - int(w_inside_atmosphere * 12.0); // Number of times the ray from the camera to the world position (primary ray) is sampled. int LIGHT_STEPS = LIGHT_STEPS_MAX - int(w_inside_atmosphere * 2.0); // Number of times the light is sampled from the light source's intersection with the atmosphere to a sample position on the primary ray. // Setup for sampling positions along the ray - starting from the intersection with the outer ring of the atmosphere. float rayPositionLength = primaryRayAtmosphereIntersect.start; // (1) Outside the atmosphere: constant rayStepLength // (2) Inside atmosphere: variable rayStepLength to compensate the rough rendering of the smaller number of ray steps float totalRayLength = primaryRayAtmosphereIntersect.stop - rayPositionLength; float rayStepLengthIncrease = w_inside_atmosphere * ((1.0 - w_stop_gt_lprl) * totalRayLength / (float(PRIMARY_STEPS * (PRIMARY_STEPS + 1)) / 2.0)); float rayStepLength = max(1.0 - w_inside_atmosphere, w_stop_gt_lprl) * totalRayLength / max(7.0 * w_inside_atmosphere, float(PRIMARY_STEPS)); vec3 rayleighAccumulation = vec3(0.0); vec3 mieAccumulation = vec3(0.0); vec2 opticalDepth = vec2(0.0); vec2 heightScale = vec2(u_atmosphereRayleighScaleHeight, u_atmosphereMieScaleHeight); // Sample positions on the primary ray. for (int i = 0; i < PRIMARY_STEPS_MAX; ++i) { // The loop should be: for (int i = 0; i < PRIMARY_STEPS; ++i) {...} but WebGL1 cannot // loop with non-constant condition, so it has to break early instead if (i >= PRIMARY_STEPS) { break; } // Calculate sample position along viewpoint ray. vec3 samplePosition = primaryRay.origin + primaryRay.direction * (rayPositionLength + rayStepLength); // Calculate height of sample position above ellipsoid. float sampleHeight = length(samplePosition) - atmosphereInnerRadius; // Calculate and accumulate density of particles at the sample position. vec2 sampleDensity = exp(-sampleHeight / heightScale) * rayStepLength; opticalDepth += sampleDensity; // Generate ray from the sample position segment to the light source, up to the outer ring of the atmosphere. czm_ray lightRay = czm_ray(samplePosition, lightDirection); czm_raySegment lightRayAtmosphereIntersect = czm_raySphereIntersectionInterval(lightRay, origin, atmosphereOuterRadius); float lightStepLength = lightRayAtmosphereIntersect.stop / float(LIGHT_STEPS); float lightPositionLength = 0.0; vec2 lightOpticalDepth = vec2(0.0); // Sample positions along the light ray, to accumulate incidence of light on the latest sample segment. for (int j = 0; j < LIGHT_STEPS_MAX; ++j) { // The loop should be: for (int j = 0; i < LIGHT_STEPS; ++j) {...} but WebGL1 cannot // loop with non-constant condition, so it has to break early instead if (j >= LIGHT_STEPS) { break; } // Calculate sample position along light ray. vec3 lightPosition = samplePosition + lightDirection * (lightPositionLength + lightStepLength * 0.5); // Calculate height of the light sample position above ellipsoid. float lightHeight = length(lightPosition) - atmosphereInnerRadius; // Calculate density of photons at the light sample position. lightOpticalDepth += exp(-lightHeight / heightScale) * lightStepLength; // Increment distance on light ray. lightPositionLength += lightStepLength; } // Compute attenuation via the primary ray and the light ray. vec3 attenuation = exp(-((u_atmosphereMieCoefficient * (opticalDepth.y + lightOpticalDepth.y)) + (u_atmosphereRayleighCoefficient * (opticalDepth.x + lightOpticalDepth.x)))); // Accumulate the scattering. rayleighAccumulation += sampleDensity.x * attenuation; mieAccumulation += sampleDensity.y * attenuation; // Increment distance on primary ray. rayPositionLength += (rayStepLength += rayStepLengthIncrease); } // Compute the scattering amount. rayleighColor = u_atmosphereRayleighCoefficient * rayleighAccumulation; mieColor = u_atmosphereMieCoefficient * mieAccumulation; // Compute the transmittance i.e. how much light is passing through the atmosphere. opacity = length(exp(-((u_atmosphereMieCoefficient * opticalDepth.y) + (u_atmosphereRayleighCoefficient * opticalDepth.x)))); } vec4 computeAtmosphereColor( vec3 positionWC, vec3 lightDirection, vec3 rayleighColor, vec3 mieColor, float opacity ) { // Setup the primary ray: from the camera position to the vertex position. vec3 cameraToPositionWC = positionWC - czm_viewerPositionWC; vec3 cameraToPositionWCDirection = normalize(cameraToPositionWC); float cosAngle = dot(cameraToPositionWCDirection, lightDirection); float cosAngleSq = cosAngle * cosAngle; float G = u_atmosphereMieAnisotropy; float GSq = G * G; // The Rayleigh phase function. float rayleighPhase = 3.0 / (50.2654824574) * (1.0 + cosAngleSq); // The Mie phase function. float miePhase = 3.0 / (25.1327412287) * ((1.0 - GSq) * (cosAngleSq + 1.0)) / (pow(1.0 + GSq - 2.0 * cosAngle * G, 1.5) * (2.0 + GSq)); // The final color is generated by combining the effects of the Rayleigh and Mie scattering. vec3 rayleigh = rayleighPhase * rayleighColor; vec3 mie = miePhase * mieColor; vec3 color = (rayleigh + mie) * u_atmosphereLightIntensity; return vec4(color, opacity); } `;var V1i=T(S(),1),lw=`in vec2 v_textureCoordinates; const float M_PI = 3.141592653589793; float vdcRadicalInverse(int i) { float r; float base = 2.0; float value = 0.0; float invBase = 1.0 / base; float invBi = invBase; for (int x = 0; x < 100; x++) { if (i <= 0) { break; } r = mod(float(i), base); value += r * invBi; invBi *= invBase; i = int(float(i) * invBase); } return value; } vec2 hammersley2D(int i, int N) { return vec2(float(i) / float(N), vdcRadicalInverse(i)); } vec3 importanceSampleGGX(vec2 xi, float roughness, vec3 N) { float a = roughness * roughness; float phi = 2.0 * M_PI * xi.x; float cosTheta = sqrt((1.0 - xi.y) / (1.0 + (a * a - 1.0) * xi.y)); float sinTheta = sqrt(1.0 - cosTheta * cosTheta); vec3 H = vec3(sinTheta * cos(phi), sinTheta * sin(phi), cosTheta); vec3 upVector = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0); vec3 tangentX = normalize(cross(upVector, N)); vec3 tangentY = cross(N, tangentX); return tangentX * H.x + tangentY * H.y + N * H.z; } float G1_Smith(float NdotV, float k) { return NdotV / (NdotV * (1.0 - k) + k); } float G_Smith(float roughness, float NdotV, float NdotL) { float k = roughness * roughness / 2.0; return G1_Smith(NdotV, k) * G1_Smith(NdotL, k); } vec2 integrateBrdf(float roughness, float NdotV) { vec3 V = vec3(sqrt(1.0 - NdotV * NdotV), 0.0, NdotV); float A = 0.0; float B = 0.0; const int NumSamples = 1024; for (int i = 0; i < NumSamples; i++) { vec2 xi = hammersley2D(i, NumSamples); vec3 H = importanceSampleGGX(xi, roughness, vec3(0.0, 0.0, 1.0)); vec3 L = 2.0 * dot(V, H) * H - V; float NdotL = clamp(L.z, 0.0, 1.0); float NdotH = clamp(H.z, 0.0, 1.0); float VdotH = clamp(dot(V, H), 0.0, 1.0); if (NdotL > 0.0) { float G = G_Smith(roughness, NdotV, NdotL); float G_Vis = G * VdotH / (NdotH * NdotV); float Fc = pow(1.0 - VdotH, 5.0); A += (1.0 - Fc) * G_Vis; B += Fc * G_Vis; } } return vec2(A, B) / float(NumSamples); } void main() { out_FragColor = vec4(integrateBrdf(v_textureCoordinates.y, v_textureCoordinates.x), 0.0, 1.0); } `;var R1i=T(S(),1),dw=`uniform sampler2D u_noiseTexture; uniform vec3 u_noiseTextureDimensions; uniform float u_noiseDetail; in vec2 v_offset; in vec3 v_maximumSize; in vec4 v_color; in float v_slice; in float v_brightness; float wrap(float value, float rangeLength) { if(value < 0.0) { float absValue = abs(value); float modValue = mod(absValue, rangeLength); return mod(rangeLength - modValue, rangeLength); } return mod(value, rangeLength); } vec3 wrapVec(vec3 value, float rangeLength) { return vec3(wrap(value.x, rangeLength), wrap(value.y, rangeLength), wrap(value.z, rangeLength)); } vec2 voxelToUV(vec3 voxelIndex) { float textureSliceWidth = u_noiseTextureDimensions.x; float noiseTextureRows = u_noiseTextureDimensions.y; float inverseNoiseTextureRows = u_noiseTextureDimensions.z; float textureSliceWidthSquared = textureSliceWidth * textureSliceWidth; vec2 inverseNoiseTextureDimensions = vec2(noiseTextureRows / textureSliceWidthSquared, inverseNoiseTextureRows / textureSliceWidth); vec3 wrappedIndex = wrapVec(voxelIndex, textureSliceWidth); float column = mod(wrappedIndex.z, textureSliceWidth * inverseNoiseTextureRows); float row = floor(wrappedIndex.z / textureSliceWidth * noiseTextureRows); float xPixelCoord = wrappedIndex.x + column * textureSliceWidth; float yPixelCoord = wrappedIndex.y + row * textureSliceWidth; return vec2(xPixelCoord, yPixelCoord) * inverseNoiseTextureDimensions; } // Interpolate a voxel with its neighbor (along the positive X-axis) vec4 lerpSamplesX(vec3 voxelIndex, float x) { vec2 uv0 = voxelToUV(voxelIndex); vec2 uv1 = voxelToUV(voxelIndex + vec3(1.0, 0.0, 0.0)); vec4 sample0 = texture(u_noiseTexture, uv0); vec4 sample1 = texture(u_noiseTexture, uv1); return mix(sample0, sample1, x); } vec4 sampleNoiseTexture(vec3 position) { float textureSliceWidth = u_noiseTextureDimensions.x; vec3 recenteredPos = position + vec3(textureSliceWidth / 2.0); vec3 lerpValue = fract(recenteredPos); vec3 voxelIndex = floor(recenteredPos); vec4 xLerp00 = lerpSamplesX(voxelIndex, lerpValue.x); vec4 xLerp01 = lerpSamplesX(voxelIndex + vec3(0.0, 0.0, 1.0), lerpValue.x); vec4 xLerp10 = lerpSamplesX(voxelIndex + vec3(0.0, 1.0, 0.0), lerpValue.x); vec4 xLerp11 = lerpSamplesX(voxelIndex + vec3(0.0, 1.0, 1.0), lerpValue.x); vec4 yLerp0 = mix(xLerp00, xLerp10, lerpValue.y); vec4 yLerp1 = mix(xLerp01, xLerp11, lerpValue.y); return mix(yLerp0, yLerp1, lerpValue.z); } // Intersection with a unit sphere with radius 0.5 at center (0, 0, 0). bool intersectSphere(vec3 origin, vec3 dir, float slice, out vec3 point, out vec3 normal) { float A = dot(dir, dir); float B = dot(origin, dir); float C = dot(origin, origin) - 0.25; float discriminant = (B * B) - (A * C); if(discriminant < 0.0) { return false; } float root = sqrt(discriminant); float t = (-B - root) / A; if(t < 0.0) { t = (-B + root) / A; } point = origin + t * dir; if(slice >= 0.0) { point.z = (slice / 2.0) - 0.5; if(length(point) > 0.5) { return false; } } normal = normalize(point); point -= czm_epsilon2 * normal; return true; } // Transforms the ray origin and direction into unit sphere space, // then transforms the result back into the ellipsoid's space. bool intersectEllipsoid(vec3 origin, vec3 dir, vec3 center, vec3 scale, float slice, out vec3 point, out vec3 normal) { if(scale.x <= 0.01 || scale.y < 0.01 || scale.z < 0.01) { return false; } vec3 o = (origin - center) / scale; vec3 d = dir / scale; vec3 p, n; bool intersected = intersectSphere(o, d, slice, p, n); if(intersected) { point = (p * scale) + center; normal = n; } return intersected; } // Assume that if phase shift is being called for octave i, // the frequency is of i - 1. This saves us from doing extra // division / multiplication operations. vec2 phaseShift2D(vec2 p, vec2 freq) { return (czm_pi / 2.0) * sin(freq.yx * p.yx); } vec2 phaseShift3D(vec3 p, vec2 freq) { return phaseShift2D(p.xy, freq) + czm_pi * vec2(sin(freq.x * p.z)); } // The cloud texture function derived from Gardner's 1985 paper, // "Visual Simulation of Clouds." // https://www.cs.drexel.edu/~david/Classes/Papers/p297-gardner.pdf const float T0 = 0.6; // contrast of the texture pattern const float k = 0.1; // computed to produce a maximum value of 1 const float C0 = 0.8; // coefficient const float FX0 = 0.6; // frequency X const float FY0 = 0.6; // frequency Y const int octaves = 5; float T(vec3 point) { vec2 sum = vec2(0.0); float Ci = C0; vec2 FXY = vec2(FX0, FY0); vec2 PXY = vec2(0.0); for(int i = 1; i <= octaves; i++) { PXY = phaseShift3D(point, FXY); Ci *= 0.707; FXY *= 2.0; vec2 sinTerm = sin(FXY * point.xy + PXY); sum += Ci * sinTerm + vec2(T0); } return k * sum.x * sum.y; } const float a = 0.5; // fraction of surface reflection due to ambient or scattered light, const float t = 0.4; // fraction of texture shading const float s = 0.25; // fraction of specular reflection float I(float Id, float Is, float It) { return (1.0 - a) * ((1.0 - t) * ((1.0 - s) * Id + s * Is) + t * It) + a; } const vec3 lightDir = normalize(vec3(0.2, -1.0, 0.7)); vec4 drawCloud(vec3 rayOrigin, vec3 rayDir, vec3 cloudCenter, vec3 cloudScale, float cloudSlice, float brightness) { vec3 cloudPoint, cloudNormal; if(!intersectEllipsoid(rayOrigin, rayDir, cloudCenter, cloudScale, cloudSlice, cloudPoint, cloudNormal)) { return vec4(0.0); } float Id = clamp(dot(cloudNormal, -lightDir), 0.0, 1.0); // diffuse reflection float Is = max(pow(dot(-lightDir, -rayDir), 2.0), 0.0); // specular reflection float It = T(cloudPoint); // texture function float intensity = I(Id, Is, It); vec3 color = vec3(intensity * clamp(brightness, 0.1, 1.0)); vec4 noise = sampleNoiseTexture(u_noiseDetail * cloudPoint); float W = noise.x; float W2 = noise.y; float W3 = noise.z; // The dot product between the cloud's normal and the ray's direction is greatest // in the center of the ellipsoid's surface. It decreases towards the edge. // Thus, it is used to blur the areas leading to the edges of the ellipsoid, // so that no harsh lines appear. // The first (and biggest) layer of worley noise is then subtracted from this. // The final result is scaled up so that the base cloud is not too translucent. float ndDot = clamp(dot(cloudNormal, -rayDir), 0.0, 1.0); float TR = pow(ndDot, 3.0) - W; // translucency TR *= 1.3; // Subtracting the second and third layers of worley noise is more complicated. // If these layers of noise were simply subtracted from the current translucency, // the shape derived from the first layer of noise would be completely deleted. // The erosion of this noise should thus be constricted to the edges of the cloud. // However, because the edges of the ellipsoid were already blurred away, mapping // the noise to (1.0 - ndDot) will have no impact on most of the cloud's appearance. // The value of (0.5 - ndDot) provides the best compromise. float minusDot = 0.5 - ndDot; // Even with the previous calculation, subtracting the second layer of wnoise // erode too much of the cloud. The addition of it, however, will detailed // volume to the cloud. As long as the noise is only added and not subtracted, // the results are aesthetically pleasing. // The minusDot product is mapped in a way that it is larger at the edges of // the ellipsoid, so a subtraction and min operation are used instead of // an addition and max one. TR -= min(minusDot * W2, 0.0); // The third level of worley noise is subtracted from the result, with some // modifications. First, a scalar is added to minusDot so that the noise // starts affecting the shape farther away from the center of the ellipsoid's // surface. Then, it is scaled down so its impact is not too intense. TR -= 0.8 * (minusDot + 0.25) * W3; // The texture function's shading does not correlate with the shape of the cloud // produced by the layers of noise, so an extra shading scalar is calculated. // The darkest areas of the cloud are assigned to be where the noise erodes // the cloud the most. This is then interpolated based on the translucency // and the diffuse shading term of that point in the cloud. float shading = mix(1.0 - 0.8 * W * W, 1.0, Id * TR); // To avoid values that are too dark, this scalar is increased by a small amount // and clamped so it never goes to zero. shading = clamp(shading + 0.2, 0.3, 1.0); // Finally, the contrast of the cloud's color is increased. vec3 finalColor = mix(vec3(0.5), shading * color, 1.15); return vec4(finalColor, clamp(TR, 0.0, 1.0)) * v_color; } void main() { #ifdef DEBUG_BILLBOARDS out_FragColor = vec4(0.0, 0.5, 0.5, 1.0); #endif // To avoid calculations with high values, // we raycast from an arbitrarily smaller space. vec2 coordinate = v_maximumSize.xy * v_offset; vec3 ellipsoidScale = 0.82 * v_maximumSize; vec3 ellipsoidCenter = vec3(0.0); float zOffset = max(ellipsoidScale.z - 10.0, 0.0); vec3 eye = vec3(0, 0, -10.0 - zOffset); vec3 rayDir = normalize(vec3(coordinate, 1.0) - eye); vec3 rayOrigin = eye; #ifdef DEBUG_ELLIPSOIDS vec3 point, normal; if(intersectEllipsoid(rayOrigin, rayDir, ellipsoidCenter, ellipsoidScale, v_slice, point, normal)) { out_FragColor = v_brightness * v_color; } #else #ifndef DEBUG_BILLBOARDS vec4 cloud = drawCloud(rayOrigin, rayDir, ellipsoidCenter, ellipsoidScale, v_slice, v_brightness); if(cloud.w < 0.01) { discard; } out_FragColor = cloud; #endif #endif } `;var G1i=T(S(),1),uw=`#ifdef INSTANCED in vec2 direction; #endif in vec4 positionHighAndScaleX; in vec4 positionLowAndScaleY; in vec4 packedAttribute0; in vec4 packedAttribute1; in vec4 color; out vec2 v_offset; out vec3 v_maximumSize; out vec4 v_color; out float v_slice; out float v_brightness; void main() { // Unpack attributes. vec3 positionHigh = positionHighAndScaleX.xyz; vec3 positionLow = positionLowAndScaleY.xyz; vec2 scale = vec2(positionHighAndScaleX.w, positionLowAndScaleY.w); float show = packedAttribute0.x; float brightness = packedAttribute0.y; vec2 coordinates = packedAttribute0.wz; vec3 maximumSize = packedAttribute1.xyz; float slice = packedAttribute1.w; #ifdef INSTANCED vec2 dir = direction; #else vec2 dir = coordinates; #endif vec2 offset = dir - vec2(0.5, 0.5); vec2 scaledOffset = scale * offset; vec4 p = czm_translateRelativeToEye(positionHigh, positionLow); vec4 positionEC = czm_modelViewRelativeToEye * p; positionEC.xy += scaledOffset; positionEC.xyz *= show; gl_Position = czm_projection * positionEC; v_offset = offset; v_maximumSize = maximumSize; v_color = color; v_slice = slice; v_brightness = brightness; } `;var X1i=T(S(),1),mw=`uniform vec3 u_noiseTextureDimensions; uniform float u_noiseDetail; uniform vec3 u_noiseOffset; in vec2 v_position; float wrap(float value, float rangeLength) { if(value < 0.0) { float absValue = abs(value); float modValue = mod(absValue, rangeLength); return mod(rangeLength - modValue, rangeLength); } return mod(value, rangeLength); } vec3 wrapVec(vec3 value, float rangeLength) { return vec3(wrap(value.x, rangeLength), wrap(value.y, rangeLength), wrap(value.z, rangeLength)); } vec3 random3(vec3 p) { float dot1 = dot(p, vec3(127.1, 311.7, 932.8)); float dot2 = dot(p, vec3(269.5, 183.3, 421.4)); return fract(vec3(sin(dot1 - dot2), cos(dot1 * dot2), dot1 * dot2)); } // Frequency corresponds to cell size. // The higher the frequency, the smaller the cell size. vec3 getWorleyCellPoint(vec3 centerCell, vec3 offset, float freq) { float textureSliceWidth = u_noiseTextureDimensions.x; vec3 cell = centerCell + offset; cell = wrapVec(cell, textureSliceWidth / u_noiseDetail); cell += floor(u_noiseOffset / u_noiseDetail); vec3 p = offset + random3(cell); return p; } float worleyNoise(vec3 p, float freq) { vec3 centerCell = floor(p * freq); vec3 pointInCell = fract(p * freq); float shortestDistance = 1000.0; for(float z = -1.0; z <= 1.0; z++) { for(float y = -1.0; y <= 1.0; y++) { for(float x = -1.0; x <= 1.0; x++) { vec3 offset = vec3(x, y, z); vec3 point = getWorleyCellPoint(centerCell, offset, freq); float distance = length(pointInCell - point); if(distance < shortestDistance) { shortestDistance = distance; } } } } return shortestDistance; } const float MAX_FBM_ITERATIONS = 10.0; float worleyFBMNoise(vec3 p, float octaves, float scale) { float noise = 0.0; float freq = 1.0; float persistence = 0.625; for(float i = 0.0; i < MAX_FBM_ITERATIONS; i++) { if(i >= octaves) { break; } noise += worleyNoise(p * scale, freq * scale) * persistence; persistence *= 0.5; freq *= 2.0; } return noise; } void main() { float textureSliceWidth = u_noiseTextureDimensions.x; float inverseNoiseTextureRows = u_noiseTextureDimensions.z; float x = mod(v_position.x, textureSliceWidth); float y = mod(v_position.y, textureSliceWidth); float sliceRow = floor(v_position.y / textureSliceWidth); float z = floor(v_position.x / textureSliceWidth) + sliceRow * inverseNoiseTextureRows * textureSliceWidth; vec3 position = vec3(x, y, z); position /= u_noiseDetail; float worley0 = clamp(worleyFBMNoise(position, 3.0, 1.0), 0.0, 1.0); float worley1 = clamp(worleyFBMNoise(position, 3.0, 2.0), 0.0, 1.0); float worley2 = clamp(worleyFBMNoise(position, 3.0, 3.0), 0.0, 1.0); out_FragColor = vec4(worley0, worley1, worley2, 1.0); } `;var W1i=T(S(),1),hw=`uniform vec3 u_noiseTextureDimensions; in vec2 position; out vec2 v_position; void main() { gl_Position = vec4(position, 0.1, 1.0); float textureSliceWidth = u_noiseTextureDimensions.x; float noiseTextureRows = u_noiseTextureDimensions.y; float inverseNoiseTextureRows = u_noiseTextureDimensions.z; vec2 transformedPos = (position * 0.5) + vec2(0.5); transformedPos *= textureSliceWidth; transformedPos.x *= textureSliceWidth * inverseNoiseTextureRows; transformedPos.y *= noiseTextureRows; v_position = transformedPos; } `;var v1i=T(S(),1),fw=`uniform sampler2D u_opaqueDepthTexture; uniform sampler2D u_translucentDepthTexture; in vec2 v_textureCoordinates; void main() { float opaqueDepth = texture(u_opaqueDepthTexture, v_textureCoordinates).r; float translucentDepth = texture(u_translucentDepthTexture, v_textureCoordinates).r; translucentDepth = czm_branchFreeTernary(translucentDepth > opaqueDepth, 1.0, translucentDepth); out_FragColor = czm_packDepth(translucentDepth); } `;var F1i=T(S(),1),pw=`/** * Compositing for Weighted Blended Order-Independent Transparency. See: * - http://jcgt.org/published/0002/02/09/ * - http://casual-effects.blogspot.com/2014/03/weighted-blended-order-independent.html */ uniform sampler2D u_opaque; uniform sampler2D u_accumulation; uniform sampler2D u_revealage; in vec2 v_textureCoordinates; void main() { vec4 opaque = texture(u_opaque, v_textureCoordinates); vec4 accum = texture(u_accumulation, v_textureCoordinates); float r = texture(u_revealage, v_textureCoordinates).r; #ifdef MRT vec4 transparent = vec4(accum.rgb / clamp(r, 1e-4, 5e4), accum.a); #else vec4 transparent = vec4(accum.rgb / clamp(accum.a, 1e-4, 5e4), r); #endif out_FragColor = (1.0 - transparent.a) * transparent + transparent.a * opaque; if (opaque != czm_backgroundColor) { out_FragColor.a = 1.0; } } `;var M1i=T(S(),1),bw=`in vec4 positionEC; void main() { vec3 position; vec3 direction; if (czm_orthographicIn3D == 1.0) { vec2 uv = (gl_FragCoord.xy - czm_viewport.xy) / czm_viewport.zw; vec2 minPlane = vec2(czm_frustumPlanes.z, czm_frustumPlanes.y); // left, bottom vec2 maxPlane = vec2(czm_frustumPlanes.w, czm_frustumPlanes.x); // right, top position = vec3(mix(minPlane, maxPlane, uv), 0.0); direction = vec3(0.0, 0.0, -1.0); } else { position = vec3(0.0); direction = normalize(positionEC.xyz); } czm_ray ray = czm_ray(position, direction); vec3 ellipsoid_center = czm_view[3].xyz; czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid_center, czm_ellipsoidInverseRadii); if (!czm_isEmpty(intersection)) { out_FragColor = vec4(1.0, 1.0, 0.0, 1.0); } else { discard; } czm_writeLogDepth(); } `;var k1i=T(S(),1),gw=`in vec4 position; out vec4 positionEC; void main() { positionEC = czm_modelView * position; gl_Position = czm_projection * positionEC; czm_vertexLogDepth(); } `;var D1i=T(S(),1),PV=`uniform vec3 u_radii; uniform vec3 u_oneOverEllipsoidRadiiSquared; in vec3 v_positionEC; vec4 computeEllipsoidColor(czm_ray ray, float intersection, float side) { vec3 positionEC = czm_pointAlongRay(ray, intersection); vec3 positionMC = (czm_inverseModelView * vec4(positionEC, 1.0)).xyz; vec3 geodeticNormal = normalize(czm_geodeticSurfaceNormal(positionMC, vec3(0.0), u_oneOverEllipsoidRadiiSquared)); vec3 sphericalNormal = normalize(positionMC / u_radii); vec3 normalMC = geodeticNormal * side; // normalized surface normal (always facing the viewer) in model coordinates vec3 normalEC = normalize(czm_normal * normalMC); // normalized surface normal in eye coordinates vec2 st = czm_ellipsoidWgs84TextureCoordinates(sphericalNormal); vec3 positionToEyeEC = -positionEC; czm_materialInput materialInput; materialInput.s = st.s; materialInput.st = st; materialInput.str = (positionMC + u_radii) / u_radii; materialInput.normalEC = normalEC; materialInput.tangentToEyeMatrix = czm_eastNorthUpToEyeCoordinates(positionMC, normalEC); materialInput.positionToEyeEC = positionToEyeEC; czm_material material = czm_getMaterial(materialInput); #ifdef ONLY_SUN_LIGHTING return czm_private_phong(normalize(positionToEyeEC), material, czm_sunDirectionEC); #else return czm_phong(normalize(positionToEyeEC), material, czm_lightDirectionEC); #endif } void main() { // PERFORMANCE_TODO: When dynamic branching is available, compute ratio of maximum and minimum radii // in the vertex shader. Only when it is larger than some constant, march along the ray. // Otherwise perform one intersection test which will be the common case. // Test if the ray intersects a sphere with the ellipsoid's maximum radius. // For very oblate ellipsoids, using the ellipsoid's radii for an intersection test // may cause false negatives. This will discard fragments before marching the ray forward. float maxRadius = max(u_radii.x, max(u_radii.y, u_radii.z)) * 1.5; vec3 direction = normalize(v_positionEC); vec3 ellipsoidCenter = czm_modelView[3].xyz; float t1 = -1.0; float t2 = -1.0; float b = -2.0 * dot(direction, ellipsoidCenter); float c = dot(ellipsoidCenter, ellipsoidCenter) - maxRadius * maxRadius; float discriminant = b * b - 4.0 * c; if (discriminant >= 0.0) { t1 = (-b - sqrt(discriminant)) * 0.5; t2 = (-b + sqrt(discriminant)) * 0.5; } if (t1 < 0.0 && t2 < 0.0) { discard; } float t = min(t1, t2); if (t < 0.0) { t = 0.0; } // March ray forward to intersection with larger sphere and find czm_ray ray = czm_ray(t * direction, direction); vec3 ellipsoid_inverseRadii = vec3(1.0 / u_radii.x, 1.0 / u_radii.y, 1.0 / u_radii.z); czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoidCenter, ellipsoid_inverseRadii); if (czm_isEmpty(intersection)) { discard; } // If the viewer is outside, compute outsideFaceColor, with normals facing outward. vec4 outsideFaceColor = (intersection.start != 0.0) ? computeEllipsoidColor(ray, intersection.start, 1.0) : vec4(0.0); // If the viewer either is inside or can see inside, compute insideFaceColor, with normals facing inward. vec4 insideFaceColor = (outsideFaceColor.a < 1.0) ? computeEllipsoidColor(ray, intersection.stop, -1.0) : vec4(0.0); out_FragColor = mix(insideFaceColor, outsideFaceColor, outsideFaceColor.a); out_FragColor.a = 1.0 - (1.0 - insideFaceColor.a) * (1.0 - outsideFaceColor.a); #if (defined(WRITE_DEPTH) && (__VERSION__ == 300 || defined(GL_EXT_frag_depth))) t = (intersection.start != 0.0) ? intersection.start : intersection.stop; vec3 positionEC = czm_pointAlongRay(ray, t); vec4 positionCC = czm_projection * vec4(positionEC, 1.0); #ifdef LOG_DEPTH czm_writeLogDepth(1.0 + positionCC.w); #else float z = positionCC.z / positionCC.w; float n = czm_depthRange.near; float f = czm_depthRange.far; gl_FragDepth = (z * (f - n) + f + n) * 0.5; #endif #endif } `;var Y1i=T(S(),1),vV=`in vec3 position; uniform vec3 u_radii; out vec3 v_positionEC; void main() { // In the vertex data, the cube goes from (-1.0, -1.0, -1.0) to (1.0, 1.0, 1.0) in model coordinates. // Scale to consider the radii. We could also do this once on the CPU when using the BoxGeometry, // but doing it here allows us to change the radii without rewriting the vertex data, and // allows all ellipsoids to reuse the same vertex data. vec4 p = vec4(u_radii * position, 1.0); v_positionEC = (czm_modelView * p).xyz; // position in eye coordinates gl_Position = czm_modelViewProjection * p; // position in clip coordinates // With multi-frustum, when the ellipsoid primitive is positioned on the intersection of two frustums // and close to terrain, the terrain (writes depth) in the closest frustum can overwrite part of the // ellipsoid (does not write depth) that was rendered in the farther frustum. // // Here, we clamp the depth in the vertex shader to avoid being overwritten; however, this creates // artifacts since some fragments can be alpha blended twice. This is solved by only rendering // the ellipsoid in the closest frustum to the viewer. gl_Position.z = clamp(gl_Position.z, czm_depthRange.near, czm_depthRange.far); czm_vertexLogDepth(); } `;var H1i=T(S(),1);/** * @license * Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of NVIDIA CORPORATION nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */var yw=`/** * @license * Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of NVIDIA CORPORATION nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS \`\`AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // NVIDIA GameWorks Graphics Samples GitHub link: https://github.com/NVIDIAGameWorks/GraphicsSamples // Original FXAA 3.11 shader link: https://github.com/NVIDIAGameWorks/GraphicsSamples/blob/master/samples/es3-kepler/FXAA/FXAA3_11.h // Steps used to integrate into Cesium: // * The following defines are set: // #define FXAA_PC 1 // #define FXAA_WEBGL_1 1 // #define FXAA_GREEN_AS_LUMA 1 // #define FXAA_EARLY_EXIT 1 // #define FXAA_GLSL_120 1 // * All other preprocessor directives besides the FXAA_QUALITY__P* directives were removed. // * Double underscores are invalid for preprocessor directives so replace them with a single underscore. Replace // /FXAA_QUALITY__P(.*)/g with /FXAA_QUALITY__P$1/. // * There are no implicit conversions from ivec* to vec* so replace: // #define FxaaInt2 ivec2 // with // #define FxaaInt2 vec2 // * The texture2DLod function is only available in vertex shaders so replace: // #define FxaaTexTop(t, p) texture2DLod(t, p, 0.0) // #define FxaaTexOff(t, p, o, r) texture2DLod(t, p + (o * r), 0.0) // with // #define FxaaTexTop(t, p) texture(t, p) // #define FxaaTexOff(t, p, o, r) texture(t, p + (o * r)) // * FXAA_QUALITY_PRESET is prepended in the javascript code. We may want to expose that setting in the future. // * The following parameters to FxaaPixelShader are unused and can be removed: // fxaaConsolePosPos // fxaaConsoleRcpFrameOpt // fxaaConsoleRcpFrameOpt2 // fxaaConsole360RcpFrameOpt2 // fxaaConsoleEdgeSharpness // fxaaConsoleEdgeThreshold // fxaaConsoleEdgeThresholdMi // fxaaConsole360ConstDir // // Choose the quality preset. // This needs to be compiled into the shader as it effects code. // Best option to include multiple presets is to // in each shader define the preset, then include this file. // // OPTIONS // ----------------------------------------------------------------------- // 10 to 15 - default medium dither (10=fastest, 15=highest quality) // 20 to 29 - less dither, more expensive (20=fastest, 29=highest quality) // 39 - no dither, very expensive // // NOTES // ----------------------------------------------------------------------- // 12 = slightly faster then FXAA 3.9 and higher edge quality (default) // 13 = about same speed as FXAA 3.9 and better than 12 // 23 = closest to FXAA 3.9 visually and performance wise // _ = the lowest digit is directly related to performance // _ = the highest digit is directly related to style // //#define FXAA_QUALITY_PRESET 12 #if (FXAA_QUALITY_PRESET == 10) #define FXAA_QUALITY_PS 3 #define FXAA_QUALITY_P0 1.5 #define FXAA_QUALITY_P1 3.0 #define FXAA_QUALITY_P2 12.0 #endif #if (FXAA_QUALITY_PRESET == 11) #define FXAA_QUALITY_PS 4 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 3.0 #define FXAA_QUALITY_P3 12.0 #endif #if (FXAA_QUALITY_PRESET == 12) #define FXAA_QUALITY_PS 5 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 4.0 #define FXAA_QUALITY_P4 12.0 #endif #if (FXAA_QUALITY_PRESET == 13) #define FXAA_QUALITY_PS 6 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 4.0 #define FXAA_QUALITY_P5 12.0 #endif #if (FXAA_QUALITY_PRESET == 14) #define FXAA_QUALITY_PS 7 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 4.0 #define FXAA_QUALITY_P6 12.0 #endif #if (FXAA_QUALITY_PRESET == 15) #define FXAA_QUALITY_PS 8 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 2.0 #define FXAA_QUALITY_P6 4.0 #define FXAA_QUALITY_P7 12.0 #endif #if (FXAA_QUALITY_PRESET == 20) #define FXAA_QUALITY_PS 3 #define FXAA_QUALITY_P0 1.5 #define FXAA_QUALITY_P1 2.0 #define FXAA_QUALITY_P2 8.0 #endif #if (FXAA_QUALITY_PRESET == 21) #define FXAA_QUALITY_PS 4 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 8.0 #endif #if (FXAA_QUALITY_PRESET == 22) #define FXAA_QUALITY_PS 5 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 8.0 #endif #if (FXAA_QUALITY_PRESET == 23) #define FXAA_QUALITY_PS 6 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 8.0 #endif #if (FXAA_QUALITY_PRESET == 24) #define FXAA_QUALITY_PS 7 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 3.0 #define FXAA_QUALITY_P6 8.0 #endif #if (FXAA_QUALITY_PRESET == 25) #define FXAA_QUALITY_PS 8 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 2.0 #define FXAA_QUALITY_P6 4.0 #define FXAA_QUALITY_P7 8.0 #endif #if (FXAA_QUALITY_PRESET == 26) #define FXAA_QUALITY_PS 9 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 2.0 #define FXAA_QUALITY_P6 2.0 #define FXAA_QUALITY_P7 4.0 #define FXAA_QUALITY_P8 8.0 #endif #if (FXAA_QUALITY_PRESET == 27) #define FXAA_QUALITY_PS 10 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 2.0 #define FXAA_QUALITY_P6 2.0 #define FXAA_QUALITY_P7 2.0 #define FXAA_QUALITY_P8 4.0 #define FXAA_QUALITY_P9 8.0 #endif #if (FXAA_QUALITY_PRESET == 28) #define FXAA_QUALITY_PS 11 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 2.0 #define FXAA_QUALITY_P6 2.0 #define FXAA_QUALITY_P7 2.0 #define FXAA_QUALITY_P8 2.0 #define FXAA_QUALITY_P9 4.0 #define FXAA_QUALITY_P10 8.0 #endif #if (FXAA_QUALITY_PRESET == 29) #define FXAA_QUALITY_PS 12 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 2.0 #define FXAA_QUALITY_P6 2.0 #define FXAA_QUALITY_P7 2.0 #define FXAA_QUALITY_P8 2.0 #define FXAA_QUALITY_P9 2.0 #define FXAA_QUALITY_P10 4.0 #define FXAA_QUALITY_P11 8.0 #endif #if (FXAA_QUALITY_PRESET == 39) #define FXAA_QUALITY_PS 12 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.0 #define FXAA_QUALITY_P2 1.0 #define FXAA_QUALITY_P3 1.0 #define FXAA_QUALITY_P4 1.0 #define FXAA_QUALITY_P5 1.5 #define FXAA_QUALITY_P6 2.0 #define FXAA_QUALITY_P7 2.0 #define FXAA_QUALITY_P8 2.0 #define FXAA_QUALITY_P9 2.0 #define FXAA_QUALITY_P10 4.0 #define FXAA_QUALITY_P11 8.0 #endif #define FxaaBool bool #define FxaaFloat float #define FxaaFloat2 vec2 #define FxaaFloat3 vec3 #define FxaaFloat4 vec4 #define FxaaHalf float #define FxaaHalf2 vec2 #define FxaaHalf3 vec3 #define FxaaHalf4 vec4 #define FxaaInt2 vec2 #define FxaaTex sampler2D #define FxaaSat(x) clamp(x, 0.0, 1.0) #define FxaaTexTop(t, p) texture(t, p) #define FxaaTexOff(t, p, o, r) texture(t, p + (o * r)) FxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.y; } FxaaFloat4 FxaaPixelShader( // // Use noperspective interpolation here (turn off perspective interpolation). // {xy} = center of pixel FxaaFloat2 pos, // // Input color texture. // {rgb_} = color in linear or perceptual color space // if (FXAA_GREEN_AS_LUMA == 0) // {___a} = luma in perceptual color space (not linear) FxaaTex tex, // // Only used on FXAA Quality. // This must be from a constant/uniform. // {x_} = 1.0/screenWidthInPixels // {_y} = 1.0/screenHeightInPixels FxaaFloat2 fxaaQualityRcpFrame, // // Only used on FXAA Quality. // This used to be the FXAA_QUALITY_SUBPIX define. // It is here now to allow easier tuning. // Choose the amount of sub-pixel aliasing removal. // This can effect sharpness. // 1.00 - upper limit (softer) // 0.75 - default amount of filtering // 0.50 - lower limit (sharper, less sub-pixel aliasing removal) // 0.25 - almost off // 0.00 - completely off FxaaFloat fxaaQualitySubpix, // // Only used on FXAA Quality. // This used to be the FXAA_QUALITY_EDGE_THRESHOLD define. // It is here now to allow easier tuning. // The minimum amount of local contrast required to apply algorithm. // 0.333 - too little (faster) // 0.250 - low quality // 0.166 - default // 0.125 - high quality // 0.063 - overkill (slower) FxaaFloat fxaaQualityEdgeThreshold, // // Only used on FXAA Quality. // This used to be the FXAA_QUALITY_EDGE_THRESHOLD_MIN define. // It is here now to allow easier tuning. // Trims the algorithm from processing darks. // 0.0833 - upper limit (default, the start of visible unfiltered edges) // 0.0625 - high quality (faster) // 0.0312 - visible limit (slower) // Special notes when using FXAA_GREEN_AS_LUMA, // Likely want to set this to zero. // As colors that are mostly not-green // will appear very dark in the green channel! // Tune by looking at mostly non-green content, // then start at zero and increase until aliasing is a problem. FxaaFloat fxaaQualityEdgeThresholdMin ) { /*--------------------------------------------------------------------------*/ FxaaFloat2 posM; posM.x = pos.x; posM.y = pos.y; FxaaFloat4 rgbyM = FxaaTexTop(tex, posM); #define lumaM rgbyM.y FxaaFloat lumaS = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0, 1), fxaaQualityRcpFrame.xy)); FxaaFloat lumaE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 0), fxaaQualityRcpFrame.xy)); FxaaFloat lumaN = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0,-1), fxaaQualityRcpFrame.xy)); FxaaFloat lumaW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 0), fxaaQualityRcpFrame.xy)); /*--------------------------------------------------------------------------*/ FxaaFloat maxSM = max(lumaS, lumaM); FxaaFloat minSM = min(lumaS, lumaM); FxaaFloat maxESM = max(lumaE, maxSM); FxaaFloat minESM = min(lumaE, minSM); FxaaFloat maxWN = max(lumaN, lumaW); FxaaFloat minWN = min(lumaN, lumaW); FxaaFloat rangeMax = max(maxWN, maxESM); FxaaFloat rangeMin = min(minWN, minESM); FxaaFloat rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold; FxaaFloat range = rangeMax - rangeMin; FxaaFloat rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled); FxaaBool earlyExit = range < rangeMaxClamped; /*--------------------------------------------------------------------------*/ if(earlyExit) return rgbyM; /*--------------------------------------------------------------------------*/ FxaaFloat lumaNW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1,-1), fxaaQualityRcpFrame.xy)); FxaaFloat lumaSE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 1), fxaaQualityRcpFrame.xy)); FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1,-1), fxaaQualityRcpFrame.xy)); FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy)); /*--------------------------------------------------------------------------*/ FxaaFloat lumaNS = lumaN + lumaS; FxaaFloat lumaWE = lumaW + lumaE; FxaaFloat subpixRcpRange = 1.0/range; FxaaFloat subpixNSWE = lumaNS + lumaWE; FxaaFloat edgeHorz1 = (-2.0 * lumaM) + lumaNS; FxaaFloat edgeVert1 = (-2.0 * lumaM) + lumaWE; /*--------------------------------------------------------------------------*/ FxaaFloat lumaNESE = lumaNE + lumaSE; FxaaFloat lumaNWNE = lumaNW + lumaNE; FxaaFloat edgeHorz2 = (-2.0 * lumaE) + lumaNESE; FxaaFloat edgeVert2 = (-2.0 * lumaN) + lumaNWNE; /*--------------------------------------------------------------------------*/ FxaaFloat lumaNWSW = lumaNW + lumaSW; FxaaFloat lumaSWSE = lumaSW + lumaSE; FxaaFloat edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2); FxaaFloat edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2); FxaaFloat edgeHorz3 = (-2.0 * lumaW) + lumaNWSW; FxaaFloat edgeVert3 = (-2.0 * lumaS) + lumaSWSE; FxaaFloat edgeHorz = abs(edgeHorz3) + edgeHorz4; FxaaFloat edgeVert = abs(edgeVert3) + edgeVert4; /*--------------------------------------------------------------------------*/ FxaaFloat subpixNWSWNESE = lumaNWSW + lumaNESE; FxaaFloat lengthSign = fxaaQualityRcpFrame.x; FxaaBool horzSpan = edgeHorz >= edgeVert; FxaaFloat subpixA = subpixNSWE * 2.0 + subpixNWSWNESE; /*--------------------------------------------------------------------------*/ if(!horzSpan) lumaN = lumaW; if(!horzSpan) lumaS = lumaE; if(horzSpan) lengthSign = fxaaQualityRcpFrame.y; FxaaFloat subpixB = (subpixA * (1.0/12.0)) - lumaM; /*--------------------------------------------------------------------------*/ FxaaFloat gradientN = lumaN - lumaM; FxaaFloat gradientS = lumaS - lumaM; FxaaFloat lumaNN = lumaN + lumaM; FxaaFloat lumaSS = lumaS + lumaM; FxaaBool pairN = abs(gradientN) >= abs(gradientS); FxaaFloat gradient = max(abs(gradientN), abs(gradientS)); if(pairN) lengthSign = -lengthSign; FxaaFloat subpixC = FxaaSat(abs(subpixB) * subpixRcpRange); /*--------------------------------------------------------------------------*/ FxaaFloat2 posB; posB.x = posM.x; posB.y = posM.y; FxaaFloat2 offNP; offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x; offNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y; if(!horzSpan) posB.x += lengthSign * 0.5; if( horzSpan) posB.y += lengthSign * 0.5; /*--------------------------------------------------------------------------*/ FxaaFloat2 posN; posN.x = posB.x - offNP.x * FXAA_QUALITY_P0; posN.y = posB.y - offNP.y * FXAA_QUALITY_P0; FxaaFloat2 posP; posP.x = posB.x + offNP.x * FXAA_QUALITY_P0; posP.y = posB.y + offNP.y * FXAA_QUALITY_P0; FxaaFloat subpixD = ((-2.0)*subpixC) + 3.0; FxaaFloat lumaEndN = FxaaLuma(FxaaTexTop(tex, posN)); FxaaFloat subpixE = subpixC * subpixC; FxaaFloat lumaEndP = FxaaLuma(FxaaTexTop(tex, posP)); /*--------------------------------------------------------------------------*/ if(!pairN) lumaNN = lumaSS; FxaaFloat gradientScaled = gradient * 1.0/4.0; FxaaFloat lumaMM = lumaM - lumaNN * 0.5; FxaaFloat subpixF = subpixD * subpixE; FxaaBool lumaMLTZero = lumaMM < 0.0; /*--------------------------------------------------------------------------*/ lumaEndN -= lumaNN * 0.5; lumaEndP -= lumaNN * 0.5; FxaaBool doneN = abs(lumaEndN) >= gradientScaled; FxaaBool doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P1; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P1; FxaaBool doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P1; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P1; /*--------------------------------------------------------------------------*/ if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P2; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P2; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P2; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P2; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 3) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P3; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P3; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P3; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P3; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 4) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P4; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P4; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P4; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P4; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 5) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P5; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P5; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P5; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P5; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 6) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P6; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P6; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P6; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P6; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 7) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P7; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P7; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P7; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P7; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 8) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P8; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P8; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P8; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P8; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 9) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P9; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P9; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P9; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P9; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 10) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P10; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P10; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P10; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P10; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 11) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P11; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P11; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P11; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P11; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 12) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P12; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P12; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P12; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P12; /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } /*--------------------------------------------------------------------------*/ FxaaFloat dstN = posM.x - posN.x; FxaaFloat dstP = posP.x - posM.x; if(!horzSpan) dstN = posM.y - posN.y; if(!horzSpan) dstP = posP.y - posM.y; /*--------------------------------------------------------------------------*/ FxaaBool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero; FxaaFloat spanLength = (dstP + dstN); FxaaBool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero; FxaaFloat spanLengthRcp = 1.0/spanLength; /*--------------------------------------------------------------------------*/ FxaaBool directionN = dstN < dstP; FxaaFloat dst = min(dstN, dstP); FxaaBool goodSpan = directionN ? goodSpanN : goodSpanP; FxaaFloat subpixG = subpixF * subpixF; FxaaFloat pixelOffset = (dst * (-spanLengthRcp)) + 0.5; FxaaFloat subpixH = subpixG * fxaaQualitySubpix; /*--------------------------------------------------------------------------*/ FxaaFloat pixelOffsetGood = goodSpan ? pixelOffset : 0.0; FxaaFloat pixelOffsetSubpix = max(pixelOffsetGood, subpixH); if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign; if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign; return FxaaFloat4(FxaaTexTop(tex, posM).xyz, lumaM); } `;var K1i=T(S(),1),xw=`uniform vec4 u_initialColor; #if TEXTURE_UNITS > 0 uniform sampler2D u_dayTextures[TEXTURE_UNITS]; uniform vec4 u_dayTextureTranslationAndScale[TEXTURE_UNITS]; uniform bool u_dayTextureUseWebMercatorT[TEXTURE_UNITS]; #ifdef APPLY_ALPHA uniform float u_dayTextureAlpha[TEXTURE_UNITS]; #endif #ifdef APPLY_DAY_NIGHT_ALPHA uniform float u_dayTextureNightAlpha[TEXTURE_UNITS]; uniform float u_dayTextureDayAlpha[TEXTURE_UNITS]; #endif #ifdef APPLY_SPLIT uniform float u_dayTextureSplit[TEXTURE_UNITS]; #endif #ifdef APPLY_BRIGHTNESS uniform float u_dayTextureBrightness[TEXTURE_UNITS]; #endif #ifdef APPLY_CONTRAST uniform float u_dayTextureContrast[TEXTURE_UNITS]; #endif #ifdef APPLY_HUE uniform float u_dayTextureHue[TEXTURE_UNITS]; #endif #ifdef APPLY_SATURATION uniform float u_dayTextureSaturation[TEXTURE_UNITS]; #endif #ifdef APPLY_GAMMA uniform float u_dayTextureOneOverGamma[TEXTURE_UNITS]; #endif #ifdef APPLY_IMAGERY_CUTOUT uniform vec4 u_dayTextureCutoutRectangles[TEXTURE_UNITS]; #endif #ifdef APPLY_COLOR_TO_ALPHA uniform vec4 u_colorsToAlpha[TEXTURE_UNITS]; #endif uniform vec4 u_dayTextureTexCoordsRectangle[TEXTURE_UNITS]; #endif #ifdef SHOW_REFLECTIVE_OCEAN uniform sampler2D u_waterMask; uniform vec4 u_waterMaskTranslationAndScale; uniform float u_zoomedOutOceanSpecularIntensity; #endif #ifdef SHOW_OCEAN_WAVES uniform sampler2D u_oceanNormalMap; #endif #if defined(ENABLE_DAYNIGHT_SHADING) || defined(GROUND_ATMOSPHERE) uniform vec2 u_lightingFadeDistance; #endif #ifdef TILE_LIMIT_RECTANGLE uniform vec4 u_cartographicLimitRectangle; #endif #ifdef GROUND_ATMOSPHERE uniform vec2 u_nightFadeDistance; #endif #ifdef ENABLE_CLIPPING_PLANES uniform highp sampler2D u_clippingPlanes; uniform mat4 u_clippingPlanesMatrix; uniform vec4 u_clippingPlanesEdgeStyle; #endif #ifdef ENABLE_CLIPPING_POLYGONS uniform highp sampler2D u_clippingDistance; in vec2 v_clippingPosition; flat in int v_regionIndex; #endif #if defined(GROUND_ATMOSPHERE) || defined(FOG) && defined(DYNAMIC_ATMOSPHERE_LIGHTING) && (defined(ENABLE_VERTEX_LIGHTING) || defined(ENABLE_DAYNIGHT_SHADING)) uniform float u_minimumBrightness; #endif #ifdef COLOR_CORRECT uniform vec3 u_hsbShift; // Hue, saturation, brightness #endif #ifdef HIGHLIGHT_FILL_TILE uniform vec4 u_fillHighlightColor; #endif #ifdef TRANSLUCENT uniform vec4 u_frontFaceAlphaByDistance; uniform vec4 u_backFaceAlphaByDistance; uniform vec4 u_translucencyRectangle; #endif #ifdef UNDERGROUND_COLOR uniform vec4 u_undergroundColor; uniform vec4 u_undergroundColorAlphaByDistance; #endif #ifdef ENABLE_VERTEX_LIGHTING uniform float u_lambertDiffuseMultiplier; uniform float u_vertexShadowDarkness; #endif in vec3 v_positionMC; in vec3 v_positionEC; in vec3 v_textureCoordinates; in vec3 v_normalMC; in vec3 v_normalEC; #ifdef APPLY_MATERIAL in float v_height; in float v_slope; in float v_aspect; #endif #if defined(FOG) || defined(GROUND_ATMOSPHERE) || defined(UNDERGROUND_COLOR) || defined(TRANSLUCENT) in float v_distance; #endif #if defined(GROUND_ATMOSPHERE) || defined(FOG) in vec3 v_atmosphereRayleighColor; in vec3 v_atmosphereMieColor; in float v_atmosphereOpacity; #endif #if defined(UNDERGROUND_COLOR) || defined(TRANSLUCENT) float interpolateByDistance(vec4 nearFarScalar, float distance) { float startDistance = nearFarScalar.x; float startValue = nearFarScalar.y; float endDistance = nearFarScalar.z; float endValue = nearFarScalar.w; float t = clamp((distance - startDistance) / (endDistance - startDistance), 0.0, 1.0); return mix(startValue, endValue, t); } #endif #if defined(UNDERGROUND_COLOR) || defined(TRANSLUCENT) || defined(APPLY_MATERIAL) vec4 alphaBlend(vec4 sourceColor, vec4 destinationColor) { return sourceColor * vec4(sourceColor.aaa, 1.0) + destinationColor * (1.0 - sourceColor.a); } #endif #ifdef TRANSLUCENT bool inTranslucencyRectangle() { return v_textureCoordinates.x > u_translucencyRectangle.x && v_textureCoordinates.x < u_translucencyRectangle.z && v_textureCoordinates.y > u_translucencyRectangle.y && v_textureCoordinates.y < u_translucencyRectangle.w; } #endif vec4 sampleAndBlend( vec4 previousColor, sampler2D textureToSample, vec2 tileTextureCoordinates, vec4 textureCoordinateRectangle, vec4 textureCoordinateTranslationAndScale, float textureAlpha, float textureNightAlpha, float textureDayAlpha, float textureBrightness, float textureContrast, float textureHue, float textureSaturation, float textureOneOverGamma, float split, vec4 colorToAlpha, float nightBlend) { // This crazy step stuff sets the alpha to 0.0 if this following condition is true: // tileTextureCoordinates.s < textureCoordinateRectangle.s || // tileTextureCoordinates.s > textureCoordinateRectangle.p || // tileTextureCoordinates.t < textureCoordinateRectangle.t || // tileTextureCoordinates.t > textureCoordinateRectangle.q // In other words, the alpha is zero if the fragment is outside the rectangle // covered by this texture. Would an actual 'if' yield better performance? vec2 alphaMultiplier = step(textureCoordinateRectangle.st, tileTextureCoordinates); textureAlpha = textureAlpha * alphaMultiplier.x * alphaMultiplier.y; alphaMultiplier = step(vec2(0.0), textureCoordinateRectangle.pq - tileTextureCoordinates); textureAlpha = textureAlpha * alphaMultiplier.x * alphaMultiplier.y; #if defined(APPLY_DAY_NIGHT_ALPHA) && defined(ENABLE_DAYNIGHT_SHADING) textureAlpha *= mix(textureDayAlpha, textureNightAlpha, nightBlend); #endif vec2 translation = textureCoordinateTranslationAndScale.xy; vec2 scale = textureCoordinateTranslationAndScale.zw; vec2 textureCoordinates = tileTextureCoordinates * scale + translation; vec4 value = texture(textureToSample, textureCoordinates); vec3 color = value.rgb; float alpha = value.a; #ifdef APPLY_COLOR_TO_ALPHA vec3 colorDiff = abs(color.rgb - colorToAlpha.rgb); colorDiff.r = czm_maximumComponent(colorDiff); alpha = czm_branchFreeTernary(colorDiff.r < colorToAlpha.a, 0.0, alpha); #endif #if !defined(APPLY_GAMMA) vec4 tempColor = czm_gammaCorrect(vec4(color, alpha)); color = tempColor.rgb; alpha = tempColor.a; #else color = pow(color, vec3(textureOneOverGamma)); #endif #ifdef APPLY_SPLIT float splitPosition = czm_splitPosition; // Split to the left if (split < 0.0 && gl_FragCoord.x > splitPosition) { alpha = 0.0; } // Split to the right else if (split > 0.0 && gl_FragCoord.x < splitPosition) { alpha = 0.0; } #endif #ifdef APPLY_BRIGHTNESS color = mix(vec3(0.0), color, textureBrightness); #endif #ifdef APPLY_CONTRAST color = mix(vec3(0.5), color, textureContrast); #endif #ifdef APPLY_HUE color = czm_hue(color, textureHue); #endif #ifdef APPLY_SATURATION color = czm_saturation(color, textureSaturation); #endif float sourceAlpha = alpha * textureAlpha; float outAlpha = mix(previousColor.a, 1.0, sourceAlpha); outAlpha += sign(outAlpha) - 1.0; vec3 outColor = mix(previousColor.rgb * previousColor.a, color, sourceAlpha) / outAlpha; // When rendering imagery for a tile in multiple passes, // some GPU/WebGL implementation combinations will not blend fragments in // additional passes correctly if their computation includes an unmasked // divide-by-zero operation, // even if it's not in the output or if the output has alpha zero. // // For example, without sanitization for outAlpha, // this renders without artifacts: // if (outAlpha == 0.0) { outColor = vec3(0.0); } // // but using czm_branchFreeTernary will cause portions of the tile that are // alpha-zero in the additional pass to render as black instead of blending // with the previous pass: // outColor = czm_branchFreeTernary(outAlpha == 0.0, vec3(0.0), outColor); // // So instead, sanitize against divide-by-zero, // store this state on the sign of outAlpha, and correct on return. return vec4(outColor, max(outAlpha, 0.0)); } vec4 computeDayColor(vec4 initialColor, vec3 textureCoordinates, float nightBlend); vec4 computeWaterColor(vec3 positionEyeCoordinates, vec2 textureCoordinates, mat3 enuToEye, vec4 imageryColor, float specularMapValue, float fade); const float fExposure = 2.0; vec3 computeEllipsoidPosition() { float mpp = czm_metersPerPixel(vec4(0.0, 0.0, -czm_currentFrustum.x, 1.0), 1.0); vec2 xy = gl_FragCoord.xy / czm_viewport.zw * 2.0 - vec2(1.0); xy *= czm_viewport.zw * mpp * 0.5; vec3 direction = normalize(vec3(xy, -czm_currentFrustum.x)); czm_ray ray = czm_ray(vec3(0.0), direction); vec3 ellipsoid_center = czm_view[3].xyz; czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid_center, czm_ellipsoidInverseRadii); vec3 ellipsoidPosition = czm_pointAlongRay(ray, intersection.start); return (czm_inverseView * vec4(ellipsoidPosition, 1.0)).xyz; } void main() { #ifdef TILE_LIMIT_RECTANGLE if (v_textureCoordinates.x < u_cartographicLimitRectangle.x || u_cartographicLimitRectangle.z < v_textureCoordinates.x || v_textureCoordinates.y < u_cartographicLimitRectangle.y || u_cartographicLimitRectangle.w < v_textureCoordinates.y) { discard; } #endif #ifdef ENABLE_CLIPPING_PLANES float clipDistance = clip(gl_FragCoord, u_clippingPlanes, u_clippingPlanesMatrix); #endif #if defined(SHOW_REFLECTIVE_OCEAN) || defined(ENABLE_DAYNIGHT_SHADING) || defined(HDR) vec3 normalMC = czm_geodeticSurfaceNormal(v_positionMC, vec3(0.0), vec3(1.0)); // normalized surface normal in model coordinates vec3 normalEC = czm_normal3D * normalMC; // normalized surface normal in eye coordinates #endif #if defined(APPLY_DAY_NIGHT_ALPHA) && defined(ENABLE_DAYNIGHT_SHADING) float nightBlend = 1.0 - clamp(czm_getLambertDiffuse(czm_lightDirectionEC, normalEC) * 5.0, 0.0, 1.0); #else float nightBlend = 0.0; #endif // The clamp below works around an apparent bug in Chrome Canary v23.0.1241.0 // where the fragment shader sees textures coordinates < 0.0 and > 1.0 for the // fragments on the edges of tiles even though the vertex shader is outputting // coordinates strictly in the 0-1 range. vec4 color = computeDayColor(u_initialColor, clamp(v_textureCoordinates, 0.0, 1.0), nightBlend); #ifdef SHOW_TILE_BOUNDARIES if (v_textureCoordinates.x < (1.0/256.0) || v_textureCoordinates.x > (255.0/256.0) || v_textureCoordinates.y < (1.0/256.0) || v_textureCoordinates.y > (255.0/256.0)) { color = vec4(1.0, 0.0, 0.0, 1.0); } #endif #if defined(ENABLE_DAYNIGHT_SHADING) || defined(GROUND_ATMOSPHERE) float cameraDist; if (czm_sceneMode == czm_sceneMode2D) { cameraDist = max(czm_frustumPlanes.x - czm_frustumPlanes.y, czm_frustumPlanes.w - czm_frustumPlanes.z) * 0.5; } else if (czm_sceneMode == czm_sceneModeColumbusView) { cameraDist = -czm_view[3].z; } else { cameraDist = length(czm_view[3]); } float fadeOutDist = u_lightingFadeDistance.x; float fadeInDist = u_lightingFadeDistance.y; if (czm_sceneMode != czm_sceneMode3D) { vec3 radii = czm_ellipsoidRadii; float maxRadii = max(radii.x, max(radii.y, radii.z)); fadeOutDist -= maxRadii; fadeInDist -= maxRadii; } float fade = clamp((cameraDist - fadeOutDist) / (fadeInDist - fadeOutDist), 0.0, 1.0); #else float fade = 0.0; #endif #ifdef SHOW_REFLECTIVE_OCEAN vec2 waterMaskTranslation = u_waterMaskTranslationAndScale.xy; vec2 waterMaskScale = u_waterMaskTranslationAndScale.zw; vec2 waterMaskTextureCoordinates = v_textureCoordinates.xy * waterMaskScale + waterMaskTranslation; waterMaskTextureCoordinates.y = 1.0 - waterMaskTextureCoordinates.y; float mask = texture(u_waterMask, waterMaskTextureCoordinates).r; if (mask > 0.0) { mat3 enuToEye = czm_eastNorthUpToEyeCoordinates(v_positionMC, normalEC); vec2 ellipsoidTextureCoordinates = czm_ellipsoidWgs84TextureCoordinates(normalMC); vec2 ellipsoidFlippedTextureCoordinates = czm_ellipsoidWgs84TextureCoordinates(normalMC.zyx); vec2 textureCoordinates = mix(ellipsoidTextureCoordinates, ellipsoidFlippedTextureCoordinates, czm_morphTime * smoothstep(0.9, 0.95, normalMC.z)); color = computeWaterColor(v_positionEC, textureCoordinates, enuToEye, color, mask, fade); } #endif #ifdef APPLY_MATERIAL czm_materialInput materialInput; materialInput.st = v_textureCoordinates.st; materialInput.normalEC = normalize(v_normalEC); materialInput.positionToEyeEC = -v_positionEC; materialInput.tangentToEyeMatrix = czm_eastNorthUpToEyeCoordinates(v_positionMC, normalize(v_normalEC)); materialInput.slope = v_slope; materialInput.height = v_height; materialInput.aspect = v_aspect; czm_material material = czm_getMaterial(materialInput); vec4 materialColor = vec4(material.diffuse, material.alpha); color = alphaBlend(materialColor, color); #endif #ifdef ENABLE_VERTEX_LIGHTING float diffuseIntensity = clamp(czm_getLambertDiffuse(czm_lightDirectionEC, normalize(v_normalEC)) * u_lambertDiffuseMultiplier + u_vertexShadowDarkness, 0.0, 1.0); vec4 finalColor = vec4(color.rgb * czm_lightColor * diffuseIntensity, color.a); #elif defined(ENABLE_DAYNIGHT_SHADING) float diffuseIntensity = clamp(czm_getLambertDiffuse(czm_lightDirectionEC, normalEC) * 5.0 + 0.3, 0.0, 1.0); diffuseIntensity = mix(1.0, diffuseIntensity, fade); vec4 finalColor = vec4(color.rgb * czm_lightColor * diffuseIntensity, color.a); #else vec4 finalColor = color; #endif #ifdef ENABLE_CLIPPING_PLANES vec4 clippingPlanesEdgeColor = vec4(1.0); clippingPlanesEdgeColor.rgb = u_clippingPlanesEdgeStyle.rgb; float clippingPlanesEdgeWidth = u_clippingPlanesEdgeStyle.a; if (clipDistance < clippingPlanesEdgeWidth) { finalColor = clippingPlanesEdgeColor; } #endif #ifdef ENABLE_CLIPPING_POLYGONS vec2 clippingPosition = v_clippingPosition; int regionIndex = v_regionIndex; clipPolygons(u_clippingDistance, CLIPPING_POLYGON_REGIONS_LENGTH, clippingPosition, regionIndex); #endif #ifdef HIGHLIGHT_FILL_TILE finalColor = vec4(mix(finalColor.rgb, u_fillHighlightColor.rgb, u_fillHighlightColor.a), finalColor.a); #endif #if defined(DYNAMIC_ATMOSPHERE_LIGHTING_FROM_SUN) vec3 atmosphereLightDirection = czm_sunDirectionWC; #else vec3 atmosphereLightDirection = czm_lightDirectionWC; #endif #if defined(GROUND_ATMOSPHERE) || defined(FOG) if (!czm_backFacing()) { bool dynamicLighting = false; #if defined(DYNAMIC_ATMOSPHERE_LIGHTING) && (defined(ENABLE_DAYNIGHT_SHADING) || defined(ENABLE_VERTEX_LIGHTING)) dynamicLighting = true; #endif vec3 rayleighColor; vec3 mieColor; float opacity; vec3 positionWC; vec3 lightDirection; // When the camera is far away (camera distance > nightFadeOutDistance), the scattering is computed in the fragment shader. // Otherwise, the scattering is computed in the vertex shader. #ifdef PER_FRAGMENT_GROUND_ATMOSPHERE positionWC = computeEllipsoidPosition(); lightDirection = czm_branchFreeTernary(dynamicLighting, atmosphereLightDirection, normalize(positionWC)); computeAtmosphereScattering( positionWC, lightDirection, rayleighColor, mieColor, opacity ); #else positionWC = v_positionMC; lightDirection = czm_branchFreeTernary(dynamicLighting, atmosphereLightDirection, normalize(positionWC)); rayleighColor = v_atmosphereRayleighColor; mieColor = v_atmosphereMieColor; opacity = v_atmosphereOpacity; #endif #ifdef COLOR_CORRECT const bool ignoreBlackPixels = true; rayleighColor = czm_applyHSBShift(rayleighColor, u_hsbShift, ignoreBlackPixels); mieColor = czm_applyHSBShift(mieColor, u_hsbShift, ignoreBlackPixels); #endif vec4 groundAtmosphereColor = computeAtmosphereColor(positionWC, lightDirection, rayleighColor, mieColor, opacity); // Fog is applied to tiles selected for fog, close to the Earth. #ifdef FOG vec3 fogColor = groundAtmosphereColor.rgb; // If there is lighting, apply that to the fog. #if defined(DYNAMIC_ATMOSPHERE_LIGHTING) && (defined(ENABLE_VERTEX_LIGHTING) || defined(ENABLE_DAYNIGHT_SHADING)) float darken = clamp(dot(normalize(czm_viewerPositionWC), atmosphereLightDirection), u_minimumBrightness, 1.0); fogColor *= darken; #endif #ifndef HDR fogColor.rgb = czm_acesTonemapping(fogColor.rgb); fogColor.rgb = czm_inverseGamma(fogColor.rgb); #endif const float modifier = 0.15; finalColor = vec4(czm_fog(v_distance, finalColor.rgb, fogColor.rgb, modifier), finalColor.a); #else // Apply ground atmosphere. This happens when the camera is far away from the earth. // The transmittance is based on optical depth i.e. the length of segment of the ray inside the atmosphere. // This value is larger near the "circumference", as it is further away from the camera. We use it to // brighten up that area of the ground atmosphere. const float transmittanceModifier = 0.5; float transmittance = transmittanceModifier + clamp(1.0 - groundAtmosphereColor.a, 0.0, 1.0); vec3 finalAtmosphereColor = finalColor.rgb + groundAtmosphereColor.rgb * transmittance; #if defined(DYNAMIC_ATMOSPHERE_LIGHTING) && (defined(ENABLE_VERTEX_LIGHTING) || defined(ENABLE_DAYNIGHT_SHADING)) float fadeInDist = u_nightFadeDistance.x; float fadeOutDist = u_nightFadeDistance.y; float sunlitAtmosphereIntensity = clamp((cameraDist - fadeOutDist) / (fadeInDist - fadeOutDist), 0.05, 1.0); float darken = clamp(dot(normalize(positionWC), atmosphereLightDirection), 0.0, 1.0); vec3 darkenendGroundAtmosphereColor = mix(groundAtmosphereColor.rgb, finalAtmosphereColor.rgb, darken); finalAtmosphereColor = mix(darkenendGroundAtmosphereColor, finalAtmosphereColor, sunlitAtmosphereIntensity); #endif #ifndef HDR finalAtmosphereColor.rgb = vec3(1.0) - exp(-fExposure * finalAtmosphereColor.rgb); #else finalAtmosphereColor.rgb = czm_saturation(finalAtmosphereColor.rgb, 1.6); #endif finalColor.rgb = mix(finalColor.rgb, finalAtmosphereColor.rgb, fade); #endif } #endif #ifdef UNDERGROUND_COLOR if (czm_backFacing()) { float distanceFromEllipsoid = max(czm_eyeHeight, 0.0); float distance = max(v_distance - distanceFromEllipsoid, 0.0); float blendAmount = interpolateByDistance(u_undergroundColorAlphaByDistance, distance); vec4 undergroundColor = vec4(u_undergroundColor.rgb, u_undergroundColor.a * blendAmount); finalColor = alphaBlend(undergroundColor, finalColor); } #endif #ifdef TRANSLUCENT if (inTranslucencyRectangle()) { vec4 alphaByDistance = gl_FrontFacing ? u_frontFaceAlphaByDistance : u_backFaceAlphaByDistance; finalColor.a *= interpolateByDistance(alphaByDistance, v_distance); } #endif out_FragColor = finalColor; } #ifdef SHOW_REFLECTIVE_OCEAN float waveFade(float edge0, float edge1, float x) { float y = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0); return pow(1.0 - y, 5.0); } float linearFade(float edge0, float edge1, float x) { return clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0); } // Based on water rendering by Jonas Wagner: // http://29a.ch/2012/7/19/webgl-terrain-rendering-water-fog // low altitude wave settings const float oceanFrequencyLowAltitude = 825000.0; const float oceanAnimationSpeedLowAltitude = 0.004; const float oceanOneOverAmplitudeLowAltitude = 1.0 / 2.0; const float oceanSpecularIntensity = 0.5; // high altitude wave settings const float oceanFrequencyHighAltitude = 125000.0; const float oceanAnimationSpeedHighAltitude = 0.008; const float oceanOneOverAmplitudeHighAltitude = 1.0 / 2.0; vec4 computeWaterColor(vec3 positionEyeCoordinates, vec2 textureCoordinates, mat3 enuToEye, vec4 imageryColor, float maskValue, float fade) { vec3 positionToEyeEC = -positionEyeCoordinates; float positionToEyeECLength = length(positionToEyeEC); // The double normalize below works around a bug in Firefox on Android devices. vec3 normalizedPositionToEyeEC = normalize(normalize(positionToEyeEC)); // Fade out the waves as the camera moves far from the surface. float waveIntensity = waveFade(70000.0, 1000000.0, positionToEyeECLength); #ifdef SHOW_OCEAN_WAVES // high altitude waves float time = czm_frameNumber * oceanAnimationSpeedHighAltitude; vec4 noise = czm_getWaterNoise(u_oceanNormalMap, textureCoordinates * oceanFrequencyHighAltitude, time, 0.0); vec3 normalTangentSpaceHighAltitude = vec3(noise.xy, noise.z * oceanOneOverAmplitudeHighAltitude); // low altitude waves time = czm_frameNumber * oceanAnimationSpeedLowAltitude; noise = czm_getWaterNoise(u_oceanNormalMap, textureCoordinates * oceanFrequencyLowAltitude, time, 0.0); vec3 normalTangentSpaceLowAltitude = vec3(noise.xy, noise.z * oceanOneOverAmplitudeLowAltitude); // blend the 2 wave layers based on distance to surface float highAltitudeFade = linearFade(0.0, 60000.0, positionToEyeECLength); float lowAltitudeFade = 1.0 - linearFade(20000.0, 60000.0, positionToEyeECLength); vec3 normalTangentSpace = (highAltitudeFade * normalTangentSpaceHighAltitude) + (lowAltitudeFade * normalTangentSpaceLowAltitude); normalTangentSpace = normalize(normalTangentSpace); // fade out the normal perturbation as we move farther from the water surface normalTangentSpace.xy *= waveIntensity; normalTangentSpace = normalize(normalTangentSpace); #else vec3 normalTangentSpace = vec3(0.0, 0.0, 1.0); #endif vec3 normalEC = enuToEye * normalTangentSpace; const vec3 waveHighlightColor = vec3(0.3, 0.45, 0.6); // Use diffuse light to highlight the waves float diffuseIntensity = czm_getLambertDiffuse(czm_lightDirectionEC, normalEC) * maskValue; vec3 diffuseHighlight = waveHighlightColor * diffuseIntensity * (1.0 - fade); #ifdef SHOW_OCEAN_WAVES // Where diffuse light is low or non-existent, use wave highlights based solely on // the wave bumpiness and no particular light direction. float tsPerturbationRatio = normalTangentSpace.z; vec3 nonDiffuseHighlight = mix(waveHighlightColor * 5.0 * (1.0 - tsPerturbationRatio), vec3(0.0), diffuseIntensity); #else vec3 nonDiffuseHighlight = vec3(0.0); #endif // Add specular highlights in 3D, and in all modes when zoomed in. float specularIntensity = czm_getSpecular(czm_lightDirectionEC, normalizedPositionToEyeEC, normalEC, 10.0); float surfaceReflectance = mix(0.0, mix(u_zoomedOutOceanSpecularIntensity, oceanSpecularIntensity, waveIntensity), maskValue); float specular = specularIntensity * surfaceReflectance; #ifdef HDR specular *= 1.4; float e = 0.2; float d = 3.3; float c = 1.7; vec3 color = imageryColor.rgb + (c * (vec3(e) + imageryColor.rgb * d) * (diffuseHighlight + nonDiffuseHighlight + specular)); #else vec3 color = imageryColor.rgb + diffuseHighlight + nonDiffuseHighlight + specular; #endif return vec4(color, imageryColor.a); } #endif // #ifdef SHOW_REFLECTIVE_OCEAN `;var Q1i=T(S(),1),_w=`#ifdef QUANTIZATION_BITS12 in vec4 compressed0; in float compressed1; #else in vec4 position3DAndHeight; in vec4 textureCoordAndEncodedNormals; #endif #ifdef GEODETIC_SURFACE_NORMALS in vec3 geodeticSurfaceNormal; #endif #ifdef EXAGGERATION uniform vec2 u_verticalExaggerationAndRelativeHeight; #endif uniform vec3 u_center3D; uniform mat4 u_modifiedModelView; uniform mat4 u_modifiedModelViewProjection; uniform vec4 u_tileRectangle; // Uniforms for 2D Mercator projection uniform vec2 u_southAndNorthLatitude; uniform vec2 u_southMercatorYAndOneOverHeight; out vec3 v_positionMC; out vec3 v_positionEC; out vec3 v_textureCoordinates; out vec3 v_normalMC; out vec3 v_normalEC; #ifdef APPLY_MATERIAL out float v_slope; out float v_aspect; out float v_height; #endif #if defined(FOG) || defined(GROUND_ATMOSPHERE) || defined(UNDERGROUND_COLOR) || defined(TRANSLUCENT) out float v_distance; #endif #if defined(FOG) || defined(GROUND_ATMOSPHERE) out vec3 v_atmosphereRayleighColor; out vec3 v_atmosphereMieColor; out float v_atmosphereOpacity; #endif #ifdef ENABLE_CLIPPING_POLYGONS uniform highp sampler2D u_clippingExtents; out vec2 v_clippingPosition; flat out int v_regionIndex; #endif // These functions are generated at runtime. vec4 getPosition(vec3 position, float height, vec2 textureCoordinates); float get2DYPositionFraction(vec2 textureCoordinates); vec4 getPosition3DMode(vec3 position, float height, vec2 textureCoordinates) { return u_modifiedModelViewProjection * vec4(position, 1.0); } float get2DMercatorYPositionFraction(vec2 textureCoordinates) { // The width of a tile at level 11, in radians and assuming a single root tile, is // 2.0 * czm_pi / pow(2.0, 11.0) // We want to just linearly interpolate the 2D position from the texture coordinates // when we're at this level or higher. The constant below is the expression // above evaluated and then rounded up at the 4th significant digit. const float maxTileWidth = 0.003068; float positionFraction = textureCoordinates.y; float southLatitude = u_southAndNorthLatitude.x; float northLatitude = u_southAndNorthLatitude.y; if (northLatitude - southLatitude > maxTileWidth) { float southMercatorY = u_southMercatorYAndOneOverHeight.x; float oneOverMercatorHeight = u_southMercatorYAndOneOverHeight.y; float currentLatitude = mix(southLatitude, northLatitude, textureCoordinates.y); currentLatitude = clamp(currentLatitude, -czm_webMercatorMaxLatitude, czm_webMercatorMaxLatitude); positionFraction = czm_latitudeToWebMercatorFraction(currentLatitude, southMercatorY, oneOverMercatorHeight); } return positionFraction; } float get2DGeographicYPositionFraction(vec2 textureCoordinates) { return textureCoordinates.y; } vec4 getPositionPlanarEarth(vec3 position, float height, vec2 textureCoordinates) { float yPositionFraction = get2DYPositionFraction(textureCoordinates); vec4 rtcPosition2D = vec4(height, mix(u_tileRectangle.st, u_tileRectangle.pq, vec2(textureCoordinates.x, yPositionFraction)), 1.0); return u_modifiedModelViewProjection * rtcPosition2D; } vec4 getPosition2DMode(vec3 position, float height, vec2 textureCoordinates) { return getPositionPlanarEarth(position, 0.0, textureCoordinates); } vec4 getPositionColumbusViewMode(vec3 position, float height, vec2 textureCoordinates) { return getPositionPlanarEarth(position, height, textureCoordinates); } vec4 getPositionMorphingMode(vec3 position, float height, vec2 textureCoordinates) { // We do not do RTC while morphing, so there is potential for jitter. // This is unlikely to be noticeable, though. vec3 position3DWC = position + u_center3D; float yPositionFraction = get2DYPositionFraction(textureCoordinates); vec4 position2DWC = vec4(height, mix(u_tileRectangle.st, u_tileRectangle.pq, vec2(textureCoordinates.x, yPositionFraction)), 1.0); vec4 morphPosition = czm_columbusViewMorph(position2DWC, vec4(position3DWC, 1.0), czm_morphTime); return czm_modelViewProjection * morphPosition; } #ifdef QUANTIZATION_BITS12 uniform vec2 u_minMaxHeight; uniform mat4 u_scaleAndBias; #endif void main() { #ifdef QUANTIZATION_BITS12 vec2 xy = czm_decompressTextureCoordinates(compressed0.x); vec2 zh = czm_decompressTextureCoordinates(compressed0.y); vec3 position = vec3(xy, zh.x); float height = zh.y; vec2 textureCoordinates = czm_decompressTextureCoordinates(compressed0.z); height = height * (u_minMaxHeight.y - u_minMaxHeight.x) + u_minMaxHeight.x; position = (u_scaleAndBias * vec4(position, 1.0)).xyz; #if (defined(ENABLE_VERTEX_LIGHTING) || defined(GENERATE_POSITION_AND_NORMAL)) && defined(INCLUDE_WEB_MERCATOR_Y) || defined(APPLY_MATERIAL) float webMercatorT = czm_decompressTextureCoordinates(compressed0.w).x; float encodedNormal = compressed1; #elif defined(INCLUDE_WEB_MERCATOR_Y) float webMercatorT = czm_decompressTextureCoordinates(compressed0.w).x; float encodedNormal = 0.0; #elif defined(ENABLE_VERTEX_LIGHTING) || defined(GENERATE_POSITION_AND_NORMAL) float webMercatorT = textureCoordinates.y; float encodedNormal = compressed0.w; #else float webMercatorT = textureCoordinates.y; float encodedNormal = 0.0; #endif #else // A single float per element vec3 position = position3DAndHeight.xyz; float height = position3DAndHeight.w; vec2 textureCoordinates = textureCoordAndEncodedNormals.xy; #if (defined(ENABLE_VERTEX_LIGHTING) || defined(GENERATE_POSITION_AND_NORMAL) || defined(APPLY_MATERIAL)) && defined(INCLUDE_WEB_MERCATOR_Y) float webMercatorT = textureCoordAndEncodedNormals.z; float encodedNormal = textureCoordAndEncodedNormals.w; #elif defined(ENABLE_VERTEX_LIGHTING) || defined(GENERATE_POSITION_AND_NORMAL) || defined(APPLY_MATERIAL) float webMercatorT = textureCoordinates.y; float encodedNormal = textureCoordAndEncodedNormals.z; #elif defined(INCLUDE_WEB_MERCATOR_Y) float webMercatorT = textureCoordAndEncodedNormals.z; float encodedNormal = 0.0; #else float webMercatorT = textureCoordinates.y; float encodedNormal = 0.0; #endif #endif vec3 position3DWC = position + u_center3D; #ifdef GEODETIC_SURFACE_NORMALS vec3 ellipsoidNormal = geodeticSurfaceNormal; #else vec3 ellipsoidNormal = normalize(position3DWC); #endif #if defined(EXAGGERATION) && defined(GEODETIC_SURFACE_NORMALS) float exaggeration = u_verticalExaggerationAndRelativeHeight.x; float relativeHeight = u_verticalExaggerationAndRelativeHeight.y; float newHeight = (height - relativeHeight) * exaggeration + relativeHeight; // stop from going through center of earth float minRadius = min(min(czm_ellipsoidRadii.x, czm_ellipsoidRadii.y), czm_ellipsoidRadii.z); newHeight = max(newHeight, -minRadius); vec3 offset = ellipsoidNormal * (newHeight - height); position += offset; position3DWC += offset; height = newHeight; #endif gl_Position = getPosition(position, height, textureCoordinates); v_positionEC = (u_modifiedModelView * vec4(position, 1.0)).xyz; v_positionMC = position3DWC; // position in model coordinates v_textureCoordinates = vec3(textureCoordinates, webMercatorT); #if defined(ENABLE_VERTEX_LIGHTING) || defined(GENERATE_POSITION_AND_NORMAL) || defined(APPLY_MATERIAL) vec3 normalMC = czm_octDecode(encodedNormal); #if defined(EXAGGERATION) && defined(GEODETIC_SURFACE_NORMALS) vec3 projection = dot(normalMC, ellipsoidNormal) * ellipsoidNormal; vec3 rejection = normalMC - projection; normalMC = normalize(projection + rejection * exaggeration); #endif v_normalMC = normalMC; v_normalEC = czm_normal3D * v_normalMC; #endif #ifdef ENABLE_CLIPPING_POLYGONS vec2 sphericalLatLong = czm_approximateSphericalCoordinates(position3DWC); sphericalLatLong.y = czm_branchFreeTernary(sphericalLatLong.y < czm_pi, sphericalLatLong.y, sphericalLatLong.y - czm_twoPi); vec2 minDistance = vec2(czm_infinity); v_clippingPosition = vec2(czm_infinity); v_regionIndex = -1; for (int regionIndex = 0; regionIndex < CLIPPING_POLYGON_REGIONS_LENGTH; regionIndex++) { vec4 extents = unpackClippingExtents(u_clippingExtents, regionIndex); vec2 rectUv = (sphericalLatLong.yx - extents.yx) * extents.wz; vec2 clamped = clamp(rectUv, vec2(0.0), vec2(1.0)); vec2 distance = abs(rectUv - clamped) * extents.wz; float threshold = 0.01; if (minDistance.x > distance.x || minDistance.y > distance.y) { minDistance = distance; v_clippingPosition = rectUv; if (rectUv.x > threshold && rectUv.y > threshold && rectUv.x < 1.0 - threshold && rectUv.y < 1.0 - threshold) { v_regionIndex = regionIndex; } } } #endif #if defined(FOG) || (defined(GROUND_ATMOSPHERE) && !defined(PER_FRAGMENT_GROUND_ATMOSPHERE)) bool dynamicLighting = false; #if defined(DYNAMIC_ATMOSPHERE_LIGHTING) && (defined(ENABLE_DAYNIGHT_SHADING) || defined(ENABLE_VERTEX_LIGHTING)) dynamicLighting = true; #endif #if defined(DYNAMIC_ATMOSPHERE_LIGHTING_FROM_SUN) vec3 atmosphereLightDirection = czm_sunDirectionWC; #else vec3 atmosphereLightDirection = czm_lightDirectionWC; #endif vec3 lightDirection = czm_branchFreeTernary(dynamicLighting, atmosphereLightDirection, normalize(position3DWC)); computeAtmosphereScattering( position3DWC, lightDirection, v_atmosphereRayleighColor, v_atmosphereMieColor, v_atmosphereOpacity ); #endif #if defined(FOG) || defined(GROUND_ATMOSPHERE) || defined(UNDERGROUND_COLOR) || defined(TRANSLUCENT) v_distance = length((czm_modelView3D * vec4(position3DWC, 1.0)).xyz); #endif #ifdef APPLY_MATERIAL float northPoleZ = czm_ellipsoidRadii.z; vec3 northPolePositionMC = vec3(0.0, 0.0, northPoleZ); vec3 vectorEastMC = normalize(cross(northPolePositionMC - v_positionMC, ellipsoidNormal)); float dotProd = abs(dot(ellipsoidNormal, v_normalMC)); v_slope = acos(dotProd); vec3 normalRejected = ellipsoidNormal * dotProd; vec3 normalProjected = v_normalMC - normalRejected; vec3 aspectVector = normalize(normalProjected); v_aspect = acos(dot(aspectVector, vectorEastMC)); float determ = dot(cross(vectorEastMC, aspectVector), ellipsoidNormal); v_aspect = czm_branchFreeTernary(determ < 0.0, 2.0 * czm_pi - v_aspect, v_aspect); v_height = height; #endif } `;var q1i=T(S(),1),wV=`void computeAtmosphereScattering(vec3 positionWC, vec3 lightDirection, out vec3 rayleighColor, out vec3 mieColor, out float opacity) { vec3 cameraToPositionWC = positionWC - czm_viewerPositionWC; vec3 cameraToPositionWCDirection = normalize(cameraToPositionWC); czm_ray primaryRay = czm_ray(czm_viewerPositionWC, cameraToPositionWCDirection); float atmosphereInnerRadius = length(positionWC); computeScattering( primaryRay, length(cameraToPositionWC), lightDirection, atmosphereInnerRadius, rayleighColor, mieColor, opacity ); } `;var eVi=T(S(),1),Tw=`uniform sampler2D u_texture; in vec2 v_textureCoordinates; void main() { out_FragColor = texture(u_texture, v_textureCoordinates); } `;var nVi=T(S(),1),Sw=`in vec4 position; in float webMercatorT; uniform vec2 u_textureDimensions; out vec2 v_textureCoordinates; void main() { v_textureCoordinates = vec2(position.x, webMercatorT); gl_Position = czm_viewportOrthographic * (position * vec4(u_textureDimensions, 1.0, 1.0)); } `;var oVi=T(S(),1),FV=`float interpolateByDistance(vec4 nearFarScalar, float distance) { float startDistance = nearFarScalar.x; float startValue = nearFarScalar.y; float endDistance = nearFarScalar.z; float endValue = nearFarScalar.w; float t = clamp((distance - startDistance) / (endDistance - startDistance), 0.0, 1.0); return mix(startValue, endValue, t); } void computeAtmosphereScattering(vec3 positionWC, vec3 lightDirection, out vec3 rayleighColor, out vec3 mieColor, out float opacity, out float underTranslucentGlobe) { float ellipsoidRadiiDifference = czm_ellipsoidRadii.x - czm_ellipsoidRadii.z; // Adjustment to the atmosphere radius applied based on the camera height. float distanceAdjustMin = czm_ellipsoidRadii.x / 4.0; float distanceAdjustMax = czm_ellipsoidRadii.x; float distanceAdjustModifier = ellipsoidRadiiDifference / 2.0; float distanceAdjust = distanceAdjustModifier * clamp((czm_eyeHeight - distanceAdjustMin) / (distanceAdjustMax - distanceAdjustMin), 0.0, 1.0); // Since atmosphere scattering assumes the atmosphere is a spherical shell, we compute an inner radius of the atmosphere best fit // for the position on the ellipsoid. float radiusAdjust = (ellipsoidRadiiDifference / 4.0) + distanceAdjust; float atmosphereInnerRadius = (length(czm_viewerPositionWC) - czm_eyeHeight) - radiusAdjust; // Setup the primary ray: from the camera position to the vertex position. vec3 cameraToPositionWC = positionWC - czm_viewerPositionWC; vec3 cameraToPositionWCDirection = normalize(cameraToPositionWC); czm_ray primaryRay = czm_ray(czm_viewerPositionWC, cameraToPositionWCDirection); underTranslucentGlobe = 0.0; // Brighten the sky atmosphere under the Earth's atmosphere when translucency is enabled. #if defined(GLOBE_TRANSLUCENT) // Check for intersection with the inner radius of the atmopshere. czm_raySegment primaryRayEarthIntersect = czm_raySphereIntersectionInterval(primaryRay, vec3(0.0), atmosphereInnerRadius + radiusAdjust); if (primaryRayEarthIntersect.start > 0.0 && primaryRayEarthIntersect.stop > 0.0) { // Compute position on globe. vec3 direction = normalize(positionWC); czm_ray ellipsoidRay = czm_ray(positionWC, -direction); czm_raySegment ellipsoidIntersection = czm_rayEllipsoidIntersectionInterval(ellipsoidRay, vec3(0.0), czm_ellipsoidInverseRadii); vec3 onEarth = positionWC - (direction * ellipsoidIntersection.start); // Control the color using the camera angle. float angle = dot(normalize(czm_viewerPositionWC), normalize(onEarth)); // Control the opacity using the distance from Earth. opacity = interpolateByDistance(vec4(0.0, 1.0, czm_ellipsoidRadii.x, 0.0), length(czm_viewerPositionWC - onEarth)); vec3 horizonColor = vec3(0.1, 0.2, 0.3); vec3 nearColor = vec3(0.0); rayleighColor = mix(nearColor, horizonColor, exp(-angle) * opacity); // Set the traslucent flag to avoid alpha adjustment in computeFinalColor funciton. underTranslucentGlobe = 1.0; return; } #endif computeScattering( primaryRay, length(cameraToPositionWC), lightDirection, atmosphereInnerRadius, rayleighColor, mieColor, opacity ); // Alter the opacity based on how close the viewer is to the ground. // (0.0 = At edge of atmosphere, 1.0 = On ground) float cameraHeight = czm_eyeHeight + atmosphereInnerRadius; float atmosphereOuterRadius = atmosphereInnerRadius + ATMOSPHERE_THICKNESS; opacity = clamp((atmosphereOuterRadius - cameraHeight) / (atmosphereOuterRadius - atmosphereInnerRadius), 0.0, 1.0); // Alter alpha based on time of day (0.0 = night , 1.0 = day) float nightAlpha = (u_radiiAndDynamicAtmosphereColor.z != 0.0) ? clamp(dot(normalize(positionWC), lightDirection), 0.0, 1.0) : 1.0; opacity *= pow(nightAlpha, 0.5); } `;var sVi=T(S(),1),Cw=`in vec3 v_outerPositionWC; uniform vec3 u_hsbShift; #ifndef PER_FRAGMENT_ATMOSPHERE in vec3 v_mieColor; in vec3 v_rayleighColor; in float v_opacity; in float v_translucent; #endif void main (void) { float lightEnum = u_radiiAndDynamicAtmosphereColor.z; vec3 lightDirection = czm_getDynamicAtmosphereLightDirection(v_outerPositionWC, lightEnum); vec3 mieColor; vec3 rayleighColor; float opacity; float translucent; #ifdef PER_FRAGMENT_ATMOSPHERE computeAtmosphereScattering( v_outerPositionWC, lightDirection, rayleighColor, mieColor, opacity, translucent ); #else mieColor = v_mieColor; rayleighColor = v_rayleighColor; opacity = v_opacity; translucent = v_translucent; #endif vec4 color = computeAtmosphereColor(v_outerPositionWC, lightDirection, rayleighColor, mieColor, opacity); #ifndef HDR color.rgb = czm_acesTonemapping(color.rgb); color.rgb = czm_inverseGamma(color.rgb); #endif #ifdef COLOR_CORRECT const bool ignoreBlackPixels = true; color.rgb = czm_applyHSBShift(color.rgb, u_hsbShift, ignoreBlackPixels); #endif // For the parts of the sky atmosphere that are not behind a translucent globe, // we mix in the default opacity so that the sky atmosphere still appears at distance. // This is needed because the opacity in the sky atmosphere is initially adjusted based // on the camera height. if (translucent == 0.0) { color.a = mix(color.b, 1.0, color.a) * smoothstep(0.0, 1.0, czm_morphTime); } out_FragColor = color; } `;var cVi=T(S(),1),Vw=`in vec4 position; out vec3 v_outerPositionWC; #ifndef PER_FRAGMENT_ATMOSPHERE out vec3 v_mieColor; out vec3 v_rayleighColor; out float v_opacity; out float v_translucent; #endif void main(void) { vec4 positionWC = czm_model * position; float lightEnum = u_radiiAndDynamicAtmosphereColor.z; vec3 lightDirection = czm_getDynamicAtmosphereLightDirection(positionWC.xyz, lightEnum); #ifndef PER_FRAGMENT_ATMOSPHERE computeAtmosphereScattering( positionWC.xyz, lightDirection, v_rayleighColor, v_mieColor, v_opacity, v_translucent ); #endif v_outerPositionWC = positionWC.xyz; gl_Position = czm_modelViewProjection * position; } `;var dVi=T(S(),1),Lw=`uniform samplerCube u_cubeMap; in vec3 v_texCoord; void main() { vec4 color = czm_textureCube(u_cubeMap, normalize(v_texCoord)); out_FragColor = vec4(czm_gammaCorrect(color).rgb, czm_morphTime); } `;var mVi=T(S(),1),Rw=`in vec3 position; out vec3 v_texCoord; void main() { vec3 p = czm_viewRotation * (czm_temeToPseudoFixed * (czm_entireFrustum.y * position)); gl_Position = czm_projection * vec4(p, 1.0); v_texCoord = position.xyz; } `;var fVi=T(S(),1),Zw=`uniform sampler2D u_texture; in vec2 v_textureCoordinates; void main() { vec4 color = texture(u_texture, v_textureCoordinates); out_FragColor = czm_gammaCorrect(color); } `;var bVi=T(S(),1),Gw=`uniform float u_radiusTS; in vec2 v_textureCoordinates; vec2 rotate(vec2 p, vec2 direction) { return vec2(p.x * direction.x - p.y * direction.y, p.x * direction.y + p.y * direction.x); } vec4 addBurst(vec2 position, vec2 direction, float lengthScalar) { vec2 rotatedPosition = rotate(position, direction) * vec2(25.0, 0.75); float radius = length(rotatedPosition) * lengthScalar; float burst = 1.0 - smoothstep(0.0, 0.55, radius); return vec4(burst); } void main() { float lengthScalar = 2.0 / sqrt(2.0); vec2 position = v_textureCoordinates - vec2(0.5); float radius = length(position) * lengthScalar; float surface = step(radius, u_radiusTS); vec4 color = vec4(vec2(1.0), surface + 0.2, surface); float glow = 1.0 - smoothstep(0.0, 0.55, radius); color.ba += mix(vec2(0.0), vec2(1.0), glow) * 0.75; vec4 burst = vec4(0.0); // The following loop has been manually unrolled for speed, to // avoid sin() and cos(). // //for (float i = 0.4; i < 3.2; i += 1.047) { // vec2 direction = vec2(sin(i), cos(i)); // burst += 0.4 * addBurst(position, direction, lengthScalar); // // direction = vec2(sin(i - 0.08), cos(i - 0.08)); // burst += 0.3 * addBurst(position, direction, lengthScalar); //} burst += 0.4 * addBurst(position, vec2(0.38942, 0.92106), lengthScalar); // angle == 0.4 burst += 0.4 * addBurst(position, vec2(0.99235, 0.12348), lengthScalar); // angle == 0.4 + 1.047 burst += 0.4 * addBurst(position, vec2(0.60327, -0.79754), lengthScalar); // angle == 0.4 + 1.047 * 2.0 burst += 0.3 * addBurst(position, vec2(0.31457, 0.94924), lengthScalar); // angle == 0.4 - 0.08 burst += 0.3 * addBurst(position, vec2(0.97931, 0.20239), lengthScalar); // angle == 0.4 + 1.047 - 0.08 burst += 0.3 * addBurst(position, vec2(0.66507, -0.74678), lengthScalar); // angle == 0.4 + 1.047 * 2.0 - 0.08 // End of manual loop unrolling. color += clamp(burst, vec4(0.0), vec4(1.0)) * 0.15; out_FragColor = clamp(color, vec4(0.0), vec4(1.0)); } `;var yVi=T(S(),1),Ew=`in vec2 direction; uniform float u_size; out vec2 v_textureCoordinates; void main() { vec4 position; if (czm_morphTime == 1.0) { position = vec4(czm_sunPositionWC, 1.0); } else { position = vec4(czm_sunPositionColumbusView.zxy, 1.0); } vec4 positionEC = czm_view * position; vec4 positionWC = czm_eyeToWindowCoordinates(positionEC); vec2 halfSize = vec2(u_size * 0.5); halfSize *= ((direction * 2.0) - 1.0); gl_Position = czm_viewportOrthographic * vec4(positionWC.xy + halfSize, -positionWC.z, 1.0); v_textureCoordinates = direction; } `;var _Vi=T(S(),1),Xw=` in vec2 v_textureCoordinates; void main() { czm_materialInput materialInput; materialInput.s = v_textureCoordinates.s; materialInput.st = v_textureCoordinates; materialInput.str = vec3(v_textureCoordinates, 0.0); materialInput.normalEC = vec3(0.0, 0.0, -1.0); czm_material material = czm_getMaterial(materialInput); out_FragColor = vec4(material.diffuse + material.emission, material.alpha); } `;var Jzi=T(S(),1);var XWi=T(S(),1);var WVi=T(S(),1);var VVi=T(S(),1);var Ert=new D;function Xrt(e,t){let n=e.unionClippingRegions,i=e.length,o=ss.useFloatTexture(t),r=ss.getTextureResolution(e,t,Ert),s=r.x,a=r.y,c=o?Prt(s,a):vrt(s,a);return c+=` `,c+=n?Irt(i):Wrt(i),c}function Irt(e){return`float clip(vec4 fragCoord, sampler2D clippingPlanes, mat4 clippingPlanesMatrix) { vec4 position = czm_windowToEyeCoordinates(fragCoord); vec3 clipNormal = vec3(0.0); vec3 clipPosition = vec3(0.0); float clipAmount; float pixelWidth = czm_metersPerPixel(position); bool breakAndDiscard = false; for (int i = 0; i < ${e}; ++i) { vec4 clippingPlane = getClippingPlane(clippingPlanes, i, clippingPlanesMatrix); clipNormal = clippingPlane.xyz; clipPosition = -clippingPlane.w * clipNormal; float amount = dot(clipNormal, (position.xyz - clipPosition)) / pixelWidth; clipAmount = czm_branchFreeTernary(i == 0, amount, min(amount, clipAmount)); if (amount <= 0.0) { breakAndDiscard = true; break; } } if (breakAndDiscard) { discard; } return clipAmount; } `}function Wrt(e){return`float clip(vec4 fragCoord, sampler2D clippingPlanes, mat4 clippingPlanesMatrix) { bool clipped = true; vec4 position = czm_windowToEyeCoordinates(fragCoord); vec3 clipNormal = vec3(0.0); vec3 clipPosition = vec3(0.0); float clipAmount = 0.0; float pixelWidth = czm_metersPerPixel(position); for (int i = 0; i < ${e}; ++i) { vec4 clippingPlane = getClippingPlane(clippingPlanes, i, clippingPlanesMatrix); clipNormal = clippingPlane.xyz; clipPosition = -clippingPlane.w * clipNormal; float amount = dot(clipNormal, (position.xyz - clipPosition)) / pixelWidth; clipAmount = max(amount, clipAmount); clipped = clipped && (amount <= 0.0); } if (clipped) { discard; } return clipAmount; } `}function Prt(e,t){let n=1/e,i=1/t,o=`${n}`;o.indexOf(".")===-1&&(o+=".0");let r=`${i}`;return r.indexOf(".")===-1&&(r+=".0"),`vec4 getClippingPlane(highp sampler2D packedClippingPlanes, int clippingPlaneNumber, mat4 transform) { int pixY = clippingPlaneNumber / ${e}; int pixX = clippingPlaneNumber - (pixY * ${e}); float u = (float(pixX) + 0.5) * ${o}; float v = (float(pixY) + 0.5) * ${r}; vec4 plane = texture(packedClippingPlanes, vec2(u, v)); return czm_transformPlane(plane, transform); } `}function vrt(e,t){let n=1/e,i=1/t,o=`${n}`;o.indexOf(".")===-1&&(o+=".0");let r=`${i}`;return r.indexOf(".")===-1&&(r+=".0"),`vec4 getClippingPlane(highp sampler2D packedClippingPlanes, int clippingPlaneNumber, mat4 transform) { int clippingPlaneStartIndex = clippingPlaneNumber * 2; int pixY = clippingPlaneStartIndex / ${e}; int pixX = clippingPlaneStartIndex - (pixY * ${e}); float u = (float(pixX) + 0.5) * ${o}; float v = (float(pixY) + 0.5) * ${r}; vec4 oct32 = texture(packedClippingPlanes, vec2(u, v)) * 255.0; vec2 oct = vec2(oct32.x * 256.0 + oct32.y, oct32.z * 256.0 + oct32.w); vec4 plane; plane.xyz = czm_octDecode(oct, 65535.0); plane.w = czm_unpackFloat(texture(packedClippingPlanes, vec2(u + ${o}, v))); return czm_transformPlane(plane, transform); } `}var K0=Xrt;function wrt(e,t,n,i,o,r){this.numberOfDayTextures=e,this.flags=t,this.material=n,this.shaderProgram=i,this.clippingShaderState=o,this.clippingPolygonShaderState=r}function gj(){this.baseVertexShaderSource=void 0,this.baseFragmentShaderSource=void 0,this._shadersByTexturesFlags=[],this.material=void 0}function Frt(e){let t="vec4 getPosition(vec3 position, float height, vec2 textureCoordinates) { return getPosition3DMode(position, height, textureCoordinates); }",n="vec4 getPosition(vec3 position, float height, vec2 textureCoordinates) { return getPositionColumbusViewMode(position, height, textureCoordinates); }",i="vec4 getPosition(vec3 position, float height, vec2 textureCoordinates) { return getPositionMorphingMode(position, height, textureCoordinates); }",o;switch(e){case oe.SCENE3D:o=t;break;case oe.SCENE2D:case oe.COLUMBUS_VIEW:o=n;break;case oe.MORPHING:o=i;break}return o}function Art(e){return e.webgl2?`void clipPolygons(highp sampler2D clippingDistance, int regionsLength, vec2 clippingPosition, int regionIndex) { czm_clipPolygons(clippingDistance, regionsLength, clippingPosition, regionIndex); }`:`void clipPolygons(highp sampler2D clippingDistance, int regionsLength, vec2 clippingPosition, int regionIndex) { }`}function Mrt(e){return e.webgl2?`vec4 unpackClippingExtents(highp sampler2D extentsTexture, int index) { return czm_unpackClippingExtents(extentsTexture, index); }`:`vec4 unpackClippingExtents(highp sampler2D extentsTexture, int index) { return vec4(); }`}function Nrt(e){return e?"float get2DYPositionFraction(vec2 textureCoordinates) { return get2DMercatorYPositionFraction(textureCoordinates); }":"float get2DYPositionFraction(vec2 textureCoordinates) { return get2DGeographicYPositionFraction(textureCoordinates); }"}gj.prototype.getShaderProgram=function(e){let t=e.frameState,n=e.surfaceTile,i=e.numberOfDayTextures,o=e.applyBrightness,r=e.applyContrast,s=e.applyHue,a=e.applySaturation,c=e.applyGamma,d=e.applyAlpha,u=e.applyDayNightAlpha,m=e.applySplit,p=e.showReflectiveOcean,g=e.showOceanWaves,f=e.enableLighting,x=e.dynamicAtmosphereLighting,_=e.dynamicAtmosphereLightingFromSun,C=e.showGroundAtmosphere,V=e.perFragmentGroundAtmosphere,L=e.hasVertexNormals,Z=e.useWebMercatorProjection,G=e.enableFog,X=e.enableClippingPlanes,v=e.clippingPlanes,P=e.enableClippingPolygons,F=e.clippingPolygons,A=e.clippedByBoundaries,b=e.hasImageryLayerCutout,R=e.colorCorrect,E=e.highlightFillTile,I=e.colorToAlpha,w=e.hasGeodeticSurfaceNormals,N=e.hasExaggeration,B=e.showUndergroundColor,U=e.translucent,O=0,k="",H=n.renderedMesh.encoding;H.quantization===Gs.BITS12&&(O=1,k="QUANTIZATION_BITS12");let z=0,j="";A&&(z=1,j="TILE_LIMIT_RECTANGLE");let q=0,be="";b&&(q=1,be="APPLY_IMAGERY_CUTOUT");let Te=t.mode,ae=Te|o<<2|r<<3|s<<4|a<<5|c<<6|d<<7|p<<8|g<<9|f<<10|x<<11|_<<12|C<<13|V<<14|L<<15|Z<<16|G<<17|O<<18|m<<19|X<<20|P<<21|z<<22|q<<23|R<<24|E<<25|I<<26|w<<27|N<<28|B<<29|U<<30|u<<31,ye=0;l(v)&&v.length>0&&(ye=X?v.clippingPlanesState:0);let Se=0;l(F)&&F.length>0&&(Se=P?F.clippingPolygonsState:0);let Le=n.surfaceShader;if(l(Le)&&Le.numberOfDayTextures===i&&Le.flags===ae&&Le.material===this.material&&Le.clippingShaderState===ye&&Le.clippingPolygonShaderState===Se)return Le.shaderProgram;let Xe=this._shadersByTexturesFlags[i];if(l(Xe)||(Xe=this._shadersByTexturesFlags[i]=[]),Le=Xe[ae],!l(Le)||Le.material!==this.material||Le.clippingShaderState!==ye||Le.clippingPolygonShaderState!==Se){let Pe=this.baseVertexShaderSource.clone(),ke=this.baseFragmentShaderSource.clone();ye!==0&&ke.sources.unshift(K0(v,t.context)),Se!==0&&(ke.sources.unshift(Art(t.context)),Pe.sources.unshift(Mrt(t.context))),Pe.defines.push(k),ke.defines.push(`TEXTURE_UNITS ${i}`,j,be),o&&ke.defines.push("APPLY_BRIGHTNESS"),r&&ke.defines.push("APPLY_CONTRAST"),s&&ke.defines.push("APPLY_HUE"),a&&ke.defines.push("APPLY_SATURATION"),c&&ke.defines.push("APPLY_GAMMA"),d&&ke.defines.push("APPLY_ALPHA"),u&&ke.defines.push("APPLY_DAY_NIGHT_ALPHA"),p&&(ke.defines.push("SHOW_REFLECTIVE_OCEAN"),Pe.defines.push("SHOW_REFLECTIVE_OCEAN")),g&&ke.defines.push("SHOW_OCEAN_WAVES"),I&&ke.defines.push("APPLY_COLOR_TO_ALPHA"),B&&(Pe.defines.push("UNDERGROUND_COLOR"),ke.defines.push("UNDERGROUND_COLOR")),U&&(Pe.defines.push("TRANSLUCENT"),ke.defines.push("TRANSLUCENT")),f&&(L?(Pe.defines.push("ENABLE_VERTEX_LIGHTING"),ke.defines.push("ENABLE_VERTEX_LIGHTING")):(Pe.defines.push("ENABLE_DAYNIGHT_SHADING"),ke.defines.push("ENABLE_DAYNIGHT_SHADING"))),x&&(Pe.defines.push("DYNAMIC_ATMOSPHERE_LIGHTING"),ke.defines.push("DYNAMIC_ATMOSPHERE_LIGHTING"),_&&(Pe.defines.push("DYNAMIC_ATMOSPHERE_LIGHTING_FROM_SUN"),ke.defines.push("DYNAMIC_ATMOSPHERE_LIGHTING_FROM_SUN"))),C&&(Pe.defines.push("GROUND_ATMOSPHERE"),ke.defines.push("GROUND_ATMOSPHERE"),V&&(Pe.defines.push("PER_FRAGMENT_GROUND_ATMOSPHERE"),ke.defines.push("PER_FRAGMENT_GROUND_ATMOSPHERE"))),Pe.defines.push("INCLUDE_WEB_MERCATOR_Y"),ke.defines.push("INCLUDE_WEB_MERCATOR_Y"),G&&(Pe.defines.push("FOG"),ke.defines.push("FOG")),m&&ke.defines.push("APPLY_SPLIT"),X&&ke.defines.push("ENABLE_CLIPPING_PLANES"),P&&(ke.defines.push("ENABLE_CLIPPING_POLYGONS"),Pe.defines.push("ENABLE_CLIPPING_POLYGONS"),F.inverse&&ke.defines.push("CLIPPING_INVERSE"),ke.defines.push(`CLIPPING_POLYGON_REGIONS_LENGTH ${F.extentsCount}`),Pe.defines.push(`CLIPPING_POLYGON_REGIONS_LENGTH ${F.extentsCount}`)),R&&ke.defines.push("COLOR_CORRECT"),E&&ke.defines.push("HIGHLIGHT_FILL_TILE"),w&&Pe.defines.push("GEODETIC_SURFACE_NORMALS"),N&&Pe.defines.push("EXAGGERATION");let Pt=` vec4 computeDayColor(vec4 initialColor, vec3 textureCoordinates, float nightBlend) { vec4 color = initialColor; `;b&&(Pt+=` vec4 cutoutAndColorResult; bool texelUnclipped; `);for(let ht=0;ht=0&&(u=V)}return u!==Number.MAX_VALUE?pn.getPoint(e,u,o):void 0};qo.prototype.freeResources=function(){l(this.waterMaskTexture)&&(--this.waterMaskTexture.referenceCount,this.waterMaskTexture.referenceCount===0&&this.waterMaskTexture.destroy(),this.waterMaskTexture=void 0),this.terrainData=void 0,this.terrainState=so.UNLOADED,this.mesh=void 0,this.fill=this.fill&&this.fill.destroy();let e=this.imagery;for(let t=0,n=e.length;t=so.RECEIVED&&s.waterMaskTexture===void 0&&n.hasWaterMask)if(s.terrainData.waterMask!==void 0)tst(t.context,s);else{let d=s._findAncestorTileWithTerrainData(e);l(d)&&l(d.data.waterMaskTexture)&&(s.waterMaskTexture=d.data.waterMaskTexture,++s.waterMaskTexture.referenceCount,s._computeWaterMaskTranslationAndScale(e,d,s.waterMaskTranslationAndScale))}}function Jrt(e,t,n,i,o,r,s){let a=t.parent;if(!a){t.state=Os.FAILED;return}let c=a.data.terrainData,d=a.x,u=a.y,m=a.level;if(!l(c))return;let p=c.upsample(i.tilingScheme,d,u,m,o,r,s);l(p)&&(e.terrainState=so.RECEIVING,Promise.resolve(p).then(function(g){l(g)&&(e.terrainData=g,e.terrainState=so.RECEIVED)}).catch(function(){e.terrainState=so.FAILED}))}function Qrt(e,t,n,i,o){function r(c){if(!l(c)){e.terrainState=so.UNLOADED,e.request=void 0;return}e.terrainData=c,e.terrainState=so.RECEIVED,e.request=void 0}function s(c){if(e.request.state===Qn.CANCELLED){e.terrainData=void 0,e.terrainState=so.UNLOADED,e.request=void 0;return}e.terrainState=so.FAILED,e.request=void 0;let d=`Failed to obtain terrain tile X: ${n} Y: ${i} Level: ${o}. Error message: "${c}"`;t._requestError=xo.reportError(t._requestError,t,t.errorEvent,d,n,i,o),t._requestError.retry&&a()}function a(){let c=new Yo({throttle:!1,throttleByServer:!0,type:ns.TERRAIN});e.request=c;let d=t.requestTileGeometry(n,i,o,c);l(d)?(e.terrainState=so.RECEIVING,Promise.resolve(d).then(function(u){r(u)}).catch(function(u){s(u)})):(e.terrainState=so.UNLOADED,e.request=void 0)}a()}var jrt={tilingScheme:void 0,x:0,y:0,level:0,exaggeration:1,exaggerationRelativeHeight:0,throttle:!0};function qrt(e,t,n,i,o,r){let s=n.tilingScheme,a=jrt;a.tilingScheme=s,a.x=i,a.y=o,a.level=r,a.exaggeration=t.verticalExaggeration,a.exaggerationRelativeHeight=t.verticalExaggerationRelativeHeight,a.throttle=!0;let d=e.terrainData.createMesh(a);l(d)&&(e.terrainState=so.TRANSFORMING,Promise.resolve(d).then(function(u){e.mesh=u,e.terrainState=so.TRANSFORMED}).catch(function(){e.terrainState=so.FAILED}))}qo._createVertexArrayForMesh=function(e,t){let n=t.vertices,i=ft.createVertexBuffer({context:e,typedArray:n,usage:Ne.STATIC_DRAW}),o=t.encoding.getAttributes(i),r=t.indices.indexBuffers||{},s=r[e.id];if(!l(s)||s.isDestroyed()){let a=t.indices;s=ft.createIndexBuffer({context:e,typedArray:a,usage:Ne.STATIC_DRAW,indexDatatype:Me.fromSizeInBytes(a.BYTES_PER_ELEMENT)}),s.vertexArrayDestroyable=!1,s.referenceCount=1,r[e.id]=s,t.indices.indexBuffers=r}else++s.referenceCount;return new ti({context:e,attributes:o,indexBuffer:s})};qo._freeVertexArray=function(e){if(l(e)){let t=e.indexBuffer;e.isDestroyed()||e.destroy(),l(t)&&!t.isDestroyed()&&l(t.referenceCount)&&(--t.referenceCount,t.referenceCount===0&&t.destroy())}};function $rt(e,t,n,i,o,r,s){e.vertexArray=qo._createVertexArrayForMesh(t,e.mesh),e.terrainState=so.READY,e.fill=e.fill&&e.fill.destroy(s)}function est(e){let t=e.cache.tile_waterMaskData;if(!l(t)){let n=Et.create({context:e,pixelFormat:at.LUMINANCE,pixelDatatype:ze.UNSIGNED_BYTE,source:{arrayBufferView:new Uint8Array([255]),width:1,height:1}});n.referenceCount=1;let i=new sn({wrapS:Cn.CLAMP_TO_EDGE,wrapT:Cn.CLAMP_TO_EDGE,minificationFilter:rn.LINEAR,magnificationFilter:di.LINEAR});t={allWaterTexture:n,sampler:i,destroy:function(){this.allWaterTexture.destroy()}},e.cache.tile_waterMaskData=t}return t}function tst(e,t){let n=t.terrainData.waterMask,i=est(e),o,r=n.length;if(r===1)if(n[0]!==0)o=i.allWaterTexture;else return;else{let s=Math.sqrt(r);o=Et.create({context:e,pixelFormat:at.LUMINANCE,pixelDatatype:ze.UNSIGNED_BYTE,source:{width:s,height:s,arrayBufferView:n},sampler:i.sampler,flipY:!1}),o.referenceCount=0}++o.referenceCount,t.waterMaskTexture=o,se.fromElements(0,0,1,1,t.waterMaskTranslationAndScale)}qo.prototype._findAncestorTileWithTerrainData=function(e){let t=e.parent;for(;l(t)&&(!l(t.data)||!l(t.data.terrainData)||t.data.terrainData.wasCreatedByUpsampling());)t=t.parent;return t};qo.prototype._computeWaterMaskTranslationAndScale=function(e,t,n){let i=t.rectangle,o=e.rectangle,r=o.width,s=o.height,a=r/i.width,c=s/i.height;return n.x=a*(o.west-i.west)/r,n.y=c*(o.south-i.south)/s,n.z=a,n.w=c,n};var qu=qo;var vEi=T(S(),1);var NGi=T(S(),1);var WGi=T(S(),1);var iRi=T(S(),1);var yLi=T(S(),1);var xj,gge="AAPKe5e6f1571ad74096bfacbdf289c5cdb687BUrehhWYnNo9tN4coC66_qhHDNruh3ygZV90buspkWdOqZUq6tb0kCb_dms9Ir",AV={};AV.defaultAccessToken=gge;AV.defaultWorldImageryServer=new Ee({url:"https://ibasemaps-api.arcgis.com/arcgis/rest/services/World_Imagery/MapServer"});AV.defaultWorldHillshadeServer=new Ee({url:"https://ibasemaps-api.arcgis.com/arcgis/rest/services/Elevation/World_Hillshade/MapServer"});AV.defaultWorldOceanServer=new Ee({url:"https://ibasemaps-api.arcgis.com/arcgis/rest/services/Ocean/World_Ocean_Base/MapServer"});AV.getDefaultTokenCredit=function(e){if(e===gge){if(!l(xj)){let t=' This application is using a default ArcGIS access token. Please assign Cesium.ArcGisMapService.defaultAccessToken with an API key from your ArcGIS Developer account before using the ArcGIS tile services. You can sign up for a free ArcGIS Developer account at https://developers.arcgis.com/.';xj=new Ct(t,!0)}return xj}};var Od=AV;var VLi=T(S(),1);function _j(e){e=y(e,y.EMPTY_OBJECT),this._pixelsToCheck=e.pixelsToCheck,this._missingImagePixels=void 0,this._missingImageByteLength=void 0,this._isReady=!1;let t=Ee.createIfNeeded(e.missingImageUrl),n=this;function i(r){l(r.blob)&&(n._missingImageByteLength=r.blob.size);let s=mm(r);if(e.disableCheckIfAllPixelsAreTransparent){let a=!0,c=r.width,d=e.pixelsToCheck;for(let u=0,m=d.length;a&&u0&&(a=!1)}a&&(s=void 0)}n._missingImagePixels=s,n._isReady=!0}function o(){n._missingImagePixels=void 0,n._isReady=!0}t.fetchImage({preferBlob:!0,preferImageBitmap:!0,flipY:!0}).then(i).catch(o)}_j.prototype.isReady=function(){return this._isReady};_j.prototype.shouldDiscardImage=function(e){let t=this._pixelsToCheck,n=this._missingImagePixels;if(!l(n)||l(e.blob)&&e.blob.size!==this._missingImageByteLength)return!1;let i=mm(e),o=e.width;for(let r=0,s=t.length;r1&&o==="name"?(t=1,n=i):t>2&&o==="title"?(t=2,n=i):t>3&&/name/i.test(i)?(t=3,n=i):t>4&&/title/i.test(i)&&(t=4,n=i)}l(n)&&(this.name=e[n])};Tj.prototype.configureDescriptionFromProperties=function(e){function t(n){let i='';for(let o in n)if(n.hasOwnProperty(o)){let r=n[o];l(r)&&(typeof r=="object"?i+=``:i+=``)}return i+="
${o}${t(r)}
${o}${r}
",i}this.description=t(e)};var Sh=Tj;var PLi=T(S(),1);function MV(){fe.throwInstantiationError()}Object.defineProperties(MV.prototype,{rectangle:{get:fe.throwInstantiationError},tileWidth:{get:fe.throwInstantiationError},tileHeight:{get:fe.throwInstantiationError},maximumLevel:{get:fe.throwInstantiationError},minimumLevel:{get:fe.throwInstantiationError},tilingScheme:{get:fe.throwInstantiationError},tileDiscardPolicy:{get:fe.throwInstantiationError},errorEvent:{get:fe.throwInstantiationError},credit:{get:fe.throwInstantiationError},proxy:{get:fe.throwInstantiationError},hasAlphaChannel:{get:fe.throwInstantiationError}});MV.prototype.getTileCredits=function(e,t,n){fe.throwInstantiationError()};MV.prototype.requestImage=function(e,t,n,i){fe.throwInstantiationError()};MV.prototype.pickFeatures=function(e,t,n,i,o){fe.throwInstantiationError()};var nst=/\.ktx2$/i;MV.loadImage=function(e,t){let n=Ee.createIfNeeded(t);return nst.test(n.url)?Rl(n):l(e)&&l(e.tileDiscardPolicy)?n.fetchImage({preferBlob:!0,preferImageBitmap:!0,flipY:!0}):n.fetchImage({preferImageBitmap:!0,flipY:!0})};var rl=MV;var wLi=T(S(),1),ist={SATELLITE:1,OCEANS:2,HILLSHADE:3},Ch=Object.freeze(ist);function yge(e){this.useTiles=y(e.usePreCachedTilesIfAvailable,!0);let t=e.ellipsoid;this.tilingScheme=y(e.tilingScheme,new Ai({ellipsoid:t})),this.rectangle=y(e.rectangle,this.tilingScheme.rectangle),this.ellipsoid=t;let n=e.credit;typeof n=="string"&&(n=new Ct(n)),this.credit=n,this.tileCredits=void 0,this.tileDiscardPolicy=e.tileDiscardPolicy,this.tileWidth=y(e.tileWidth,256),this.tileHeight=y(e.tileHeight,256),this.maximumLevel=e.maximumLevel}yge.prototype.build=function(e){e._useTiles=this.useTiles,e._tilingScheme=this.tilingScheme,e._rectangle=this.rectangle,e._credit=this.credit,e._tileCredits=this.tileCredits,e._tileDiscardPolicy=this.tileDiscardPolicy,e._tileWidth=this.tileWidth,e._tileHeight=this.tileHeight,e._maximumLevel=this.maximumLevel,this.useTiles&&!l(this.tileDiscardPolicy)&&(e._tileDiscardPolicy=new Ww({missingImageUrl:xge(e,0,0,this.maximumLevel).url,pixelsToCheck:[new D(0,0),new D(200,20),new D(20,200),new D(80,110),new D(160,130)],disableCheckIfAllPixelsAreTransparent:!0}))};function ost(e,t){let n=e.tileInfo;if(!l(n))t.useTiles=!1;else{if(t.tileWidth=n.rows,t.tileHeight=n.cols,n.spatialReference.wkid===102100||n.spatialReference.wkid===102113)t.tilingScheme=new Br({ellipsoid:t.ellipsoid});else if(e.tileInfo.spatialReference.wkid===4326)t.tilingScheme=new Ai({ellipsoid:t.ellipsoid});else{let i=`Tile spatial reference WKID ${e.tileInfo.spatialReference.wkid} is not supported.`;throw new ue(i)}if(t.maximumLevel=e.tileInfo.lods.length-1,l(e.fullExtent)){if(l(e.fullExtent.spatialReference)&&l(e.fullExtent.spatialReference.wkid))if(e.fullExtent.spatialReference.wkid===102100||e.fullExtent.spatialReference.wkid===102113){let i=new Ci,o=e.fullExtent,r=i.unproject(new h(Math.max(o.xmin,-t.tilingScheme.ellipsoid.maximumRadius*Math.PI),Math.max(o.ymin,-t.tilingScheme.ellipsoid.maximumRadius*Math.PI),0)),s=i.unproject(new h(Math.min(o.xmax,t.tilingScheme.ellipsoid.maximumRadius*Math.PI),Math.min(o.ymax,t.tilingScheme.ellipsoid.maximumRadius*Math.PI),0));t.rectangle=new ce(r.longitude,r.latitude,s.longitude,s.latitude)}else if(e.fullExtent.spatialReference.wkid===4326)t.rectangle=ce.fromDegrees(e.fullExtent.xmin,e.fullExtent.ymin,e.fullExtent.xmax,e.fullExtent.ymax);else{let i=`fullExtent.spatialReference WKID ${e.fullExtent.spatialReference.wkid} is not supported.`;throw new ue(i)}}else t.rectangle=t.tilingScheme.rectangle;t.useTiles=!0}l(e.copyrightText)&&e.copyrightText.length>0&&(l(t.credit)?t.tileCredits=[new Ct(e.copyrightText)]:t.credit=new Ct(e.copyrightText))}function rst(e,t){let n=`An error occurred while accessing ${e.url}`;throw l(t)&&l(t.message)&&(n+=`: ${t.message}`),new ue(n)}async function sst(e,t){let n=e.getDerivedResource({queryParameters:{f:"json"}});try{let i=await n.fetchJson();ost(i,t)}catch(i){rst(e,i)}}function kf(e){e=y(e,y.EMPTY_OBJECT),this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=void 0,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0,this._tileDiscardPolicy=e.tileDiscardPolicy,this._tileWidth=y(e.tileWidth,256),this._tileHeight=y(e.tileHeight,256),this._maximumLevel=e.maximumLevel,this._tilingScheme=y(e.tilingScheme,new Ai({ellipsoid:e.ellipsoid})),this._useTiles=y(e.usePreCachedTilesIfAvailable,!0),this._rectangle=y(e.rectangle,this._tilingScheme.rectangle),this._layers=e.layers,this._credit=e.credit,this._tileCredits=void 0;let t=e.credit;typeof t=="string"&&(t=new Ct(t)),this.enablePickFeatures=y(e.enablePickFeatures,!0),this._errorEvent=new ge}kf.fromBasemapType=async function(e,t){t=y(t,y.EMPTY_OBJECT);let n,i,o;switch(e){case Ch.SATELLITE:{n=y(t.token,Od.defaultAccessToken),i=Ee.createIfNeeded(Od.defaultWorldImageryServer),i.appendForwardSlash();let r=Od.getDefaultTokenCredit(n);l(r)&&(o=Ct.clone(r))}break;case Ch.OCEANS:{n=y(t.token,Od.defaultAccessToken),i=Ee.createIfNeeded(Od.defaultWorldOceanServer),i.appendForwardSlash();let r=Od.getDefaultTokenCredit(n);l(r)&&(o=Ct.clone(r))}break;case Ch.HILLSHADE:{n=y(t.token,Od.defaultAccessToken),i=Ee.createIfNeeded(Od.defaultWorldHillshadeServer),i.appendForwardSlash();let r=Od.getDefaultTokenCredit(n);l(r)&&(o=Ct.clone(r))}break;default:}return kf.fromUrl(i,{...t,token:n,credit:o,usePreCachedTilesIfAvailable:!0})};function xge(e,t,n,i,o){let r;if(e._useTiles)r=e._resource.getDerivedResource({url:`tile/${i}/${n}/${t}`,request:o});else{let s=e._tilingScheme.tileXYToNativeRectangle(t,n,i),c={bbox:`${s.west},${s.south},${s.east},${s.north}`,size:`${e._tileWidth},${e._tileHeight}`,format:"png32",transparent:!0,f:"image"};e._tilingScheme.projection instanceof Si?(c.bboxSR=4326,c.imageSR=4326):(c.bboxSR=3857,c.imageSR=3857),e.layers&&(c.layers=`show:${e.layers}`),r=e._resource.getDerivedResource({url:"export",request:o,queryParameters:c})}return r}Object.defineProperties(kf.prototype,{url:{get:function(){return this._resource._url}},token:{get:function(){return this._resource.queryParameters.token}},proxy:{get:function(){return this._resource.proxy}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){return this._maximumLevel}},minimumLevel:{get:function(){return 0}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._rectangle}},tileDiscardPolicy:{get:function(){return this._tileDiscardPolicy}},errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},usingPrecachedTiles:{get:function(){return this._useTiles}},hasAlphaChannel:{get:function(){return!0}},layers:{get:function(){return this._layers}}});kf.fromUrl=async function(e,t){t=y(t,y.EMPTY_OBJECT);let n=Ee.createIfNeeded(e);n.appendForwardSlash(),l(t.token)&&n.setQueryParameters({token:t.token});let i=new kf(t);i._resource=n;let o=new yge(t);return y(t.usePreCachedTilesIfAvailable,!0)&&await sst(n,o),o.build(i),i};kf.prototype.getTileCredits=function(e,t,n){return this._tileCredits};kf.prototype.requestImage=function(e,t,n,i){return rl.loadImage(this,xge(this,e,t,n,i))};kf.prototype.pickFeatures=function(e,t,n,i,o){if(!this.enablePickFeatures)return;let r=this._tilingScheme.tileXYToNativeRectangle(e,t,n),s,a,c;if(this._tilingScheme.projection instanceof Si)s=W.toDegrees(i),a=W.toDegrees(o),c="4326";else{let p=this._tilingScheme.projection.project(new he(i,o,0));s=p.x,a=p.y,c="3857"}let d="visible";l(this._layers)&&(d+=`:${this._layers}`);let u={f:"json",tolerance:2,geometryType:"esriGeometryPoint",geometry:`${s},${a}`,mapExtent:`${r.west},${r.south},${r.east},${r.north}`,imageDisplay:`${this._tileWidth},${this._tileHeight},96`,sr:c,layers:d};return this._resource.getDerivedResource({url:"identify",queryParameters:u}).fetchJson().then(function(p){let g=[],f=p.results;if(!l(f))return g;for(let x=0;x`),this._tilingScheme=new Br({numberOfLevelZeroTilesX:2,numberOfLevelZeroTilesY:2,ellipsoid:e.ellipsoid}),this._tileWidth=void 0,this._tileHeight=void 0,this._maximumLevel=void 0,this._imageUrlTemplate=void 0,this._imageUrlSubdomains=void 0,this._attributionList=void 0,this._errorEvent=new ge}Object.defineProperties(Cs.prototype,{url:{get:function(){return this._resource.url}},proxy:{get:function(){return this._resource.proxy}},key:{get:function(){return this._key}},mapStyle:{get:function(){return this._mapStyle}},mapLayer:{get:function(){return this._mapLayer}},culture:{get:function(){return this._culture}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){return this._maximumLevel}},minimumLevel:{get:function(){return 0}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._tilingScheme.rectangle}},tileDiscardPolicy:{get:function(){return this._tileDiscardPolicy}},errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},hasAlphaChannel:{get:function(){return l(this.mapLayer)}}});Cs.fromUrl=async function(e,t){t=y(t,y.EMPTY_OBJECT);let n=t.tileProtocol;l(n)?n.length>0&&n[n.length-1]===":"&&(n=n.substr(0,n.length-1)):n=document.location.protocol==="http:"?"http":"https";let i=y(t.mapStyle,NV.AERIAL),o=Ee.createIfNeeded(e);o.appendForwardSlash();let r={incl:"ImageryProviders",key:t.key,uriScheme:n};l(t.mapLayer)&&(r.mapLayer=t.mapLayer),l(t.culture)&&(r.culture=t.culture);let s=o.getDerivedResource({url:`REST/v1/Imagery/Metadata/${i}`,queryParameters:r}),a=new Cs(t);a._resource=o;let c=new _ge(t);return await dst(s,c),c.build(a),a};var ust=new ce;Cs.prototype.getTileCredits=function(e,t,n){let i=this._tilingScheme.tileXYToRectangle(e,t,n,ust);return fst(this._attributionList,n,i)};Cs.prototype.requestImage=function(e,t,n,i){let o=rl.loadImage(this,mst(this,e,t,n,i));if(l(o))return o.catch(function(r){return l(r.blob)&&r.blob.size===0?kV.EMPTY_IMAGE:Promise.reject(r)})};Cs.prototype.pickFeatures=function(e,t,n,i,o){};Cs.tileXYToQuadKey=function(e,t,n){let i="";for(let o=n;o>=0;--o){let r=1<=0;--o){let r=1<=m.zoomMin&&t<=m.zoomMax){let p=ce.intersection(n,m.bbox,hst);l(p)&&(c=!0)}}c&&i.push(s.credit)}return i}Cs._metadataCache={};var vw=Cs;var tZi=T(S(),1);var kRi=T(S(),1);var Tge=/{[^}]+}/g,Sge={x:yst,y:_st,z:Cst,s:Vst,reverseX:xst,reverseY:Tst,reverseZ:Sst,westDegrees:Lst,southDegrees:Rst,eastDegrees:Zst,northDegrees:Gst,westProjected:Est,southProjected:Xst,eastProjected:Ist,northProjected:Wst,width:Pst,height:vst},pst=xt(Sge,{i:wst,j:Fst,reverseI:Ast,reverseJ:Mst,longitudeDegrees:kst,latitudeDegrees:Ust,longitudeProjected:Dst,latitudeProjected:Bst,format:Ost});function ww(e){e=y(e,y.EMPTY_OBJECT),this._errorEvent=new ge;let t=Ee.createIfNeeded(e.url),n=Ee.createIfNeeded(e.pickFeaturesUrl);this._resource=t,this._urlSchemeZeroPadding=e.urlSchemeZeroPadding,this._getFeatureInfoFormats=e.getFeatureInfoFormats,this._pickFeaturesResource=n;let i=e.subdomains;Array.isArray(i)?i=i.slice():l(i)&&i.length>0?i=i.split(""):i=["a","b","c"],this._subdomains=i,this._tileWidth=y(e.tileWidth,256),this._tileHeight=y(e.tileHeight,256),this._minimumLevel=y(e.minimumLevel,0),this._maximumLevel=e.maximumLevel,this._tilingScheme=y(e.tilingScheme,new Br({ellipsoid:e.ellipsoid})),this._rectangle=y(e.rectangle,this._tilingScheme.rectangle),this._rectangle=ce.intersection(this._rectangle,this._tilingScheme.rectangle),this._tileDiscardPolicy=e.tileDiscardPolicy;let o=e.credit;typeof o=="string"&&(o=new Ct(o)),this._credit=o,this._hasAlphaChannel=y(e.hasAlphaChannel,!0);let r=e.customTags,s=xt(Sge,r),a=xt(pst,r);this._tags=s,this._pickFeaturesTags=a,this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=void 0,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0,this.enablePickFeatures=y(e.enablePickFeatures,!0)}Object.defineProperties(ww.prototype,{url:{get:function(){return this._resource.url}},urlSchemeZeroPadding:{get:function(){return this._urlSchemeZeroPadding}},pickFeaturesUrl:{get:function(){return this._pickFeaturesResource.url}},proxy:{get:function(){return this._resource.proxy}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){return this._maximumLevel}},minimumLevel:{get:function(){return this._minimumLevel}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._rectangle}},tileDiscardPolicy:{get:function(){return this._tileDiscardPolicy}},errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},hasAlphaChannel:{get:function(){return this._hasAlphaChannel}}});ww.prototype.getTileCredits=function(e,t,n){};ww.prototype.requestImage=function(e,t,n,i){return rl.loadImage(this,bst(this,e,t,n,i))};ww.prototype.pickFeatures=function(e,t,n,i,o){if(!this.enablePickFeatures||!l(this._pickFeaturesResource)||this._getFeatureInfoFormats.length===0)return;let r=0,s=this;function a(d,u){return d.callback(u)}function c(){if(r>=s._getFeatureInfoFormats.length)return Promise.resolve([]);let d=s._getFeatureInfoFormats[r],u=gst(s,e,t,n,i,o,d.format);return++r,d.type==="json"?u.fetchJson().then(d.callback).catch(c):d.type==="xml"?u.fetchXML().then(d.callback).catch(c):d.type==="text"||d.type==="html"?u.fetchText().then(d.callback).catch(c):u.fetch({responseType:d.format}).then(a.bind(void 0,d)).catch(c)}return c()};var gD=!1,Hd=new ce,yD=!1,Fw=new ce;function bst(e,t,n,i,o){gD=!1,yD=!1;let r=e._resource,s=r.getUrlComponent(!0),a=e._tags,c={},d=s.match(Tge);return l(d)&&d.forEach(function(u){let m=u.substring(1,u.length-1);l(a[m])&&(c[m]=a[m](e,t,n,i))}),r.getDerivedResource({request:o,templateValues:c})}var Sj=!1,DV=new D,Cj=!1;function gst(e,t,n,i,o,r,s){gD=!1,yD=!1,Sj=!1,Cj=!1;let a=e._pickFeaturesResource,c=a.getUrlComponent(!0),d=e._pickFeaturesTags,u={},m=c.match(Tge);return l(m)&&m.forEach(function(p){let g=p.substring(1,p.length-1);l(d[g])&&(u[g]=d[g](e,t,n,i,o,r,s))}),a.getDerivedResource({templateValues:u})}function BV(e,t,n){if(e&&e.urlSchemeZeroPadding&&e.urlSchemeZeroPadding.hasOwnProperty(t)){let i=e.urlSchemeZeroPadding[t];if(typeof i=="string"){let o=i.length;o>1&&(n=n.length>=o?n:new Array(o-n.toString().length+1).join("0")+n)}}return n}function yst(e,t,n,i){return BV(e,"{x}",t)}function xst(e,t,n,i){let o=e.tilingScheme.getNumberOfXTilesAtLevel(i)-t-1;return BV(e,"{reverseX}",o)}function _st(e,t,n,i){return BV(e,"{y}",n)}function Tst(e,t,n,i){let o=e.tilingScheme.getNumberOfYTilesAtLevel(i)-n-1;return BV(e,"{reverseY}",o)}function Sst(e,t,n,i){let o=e.maximumLevel,r=l(o)&&it.rectangle.east&&(e.east=t.rectangle.east),e.southt.rectangle.north&&(e.north=t.rectangle.north),e}function Vge(e,t,n){let i=e.positionToTileXY(ce.southwest(t),n),o=e.positionToTileXY(ce.northeast(t),n);return(Math.abs(o.x-i.x)+1)*(Math.abs(o.y-i.y)+1)>4?0:n}$u._metadataSuccess=function(e,t,n,i,o){let r=/tileformat/i,s=/tileset/i,a=/tilesets/i,c=/boundingbox/i,d,u,m,p=[],g=e.childNodes[0].childNodes;for(let P=0;P`),this._tilingScheme=void 0,this._version=void 0,this._tileWidth=256,this._tileHeight=256,this._maximumLevel=e.maximumLevel,this._errorEvent=new ge}Object.defineProperties(Jl.prototype,{url:{get:function(){return this._url}},path:{get:function(){return this._path}},proxy:{get:function(){return this._resource.proxy}},channel:{get:function(){return this._channel}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){return this._maximumLevel}},minimumLevel:{get:function(){return 0}},tilingScheme:{get:function(){return this._tilingScheme}},version:{get:function(){return this._version}},requestType:{get:function(){return this._requestType}},rectangle:{get:function(){return this._tilingScheme.rectangle}},tileDiscardPolicy:{get:function(){return this._tileDiscardPolicy}},errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},hasAlphaChannel:{get:function(){return!0}}});Jl.fromUrl=async function(e,t,n){n=y(n,{});let i=y(n.path,"/default_map"),o=Ee.createIfNeeded(e).getDerivedResource({url:i[0]==="/"?i.substring(1):i});o.appendForwardSlash();let r=o.getDerivedResource({url:"query",queryParameters:{request:"Json",vars:"geeServerDefs",is2d:"t"}}),s=new Lge(n);s.channel=t,await Kst(r,s);let a=new Jl(n);return s.build(a),a._resource=o,a._url=e,a._path=i,a};Jl.prototype.getTileCredits=function(e,t,n){};Jl.prototype.requestImage=function(e,t,n,i){let o=this._resource.getDerivedResource({url:"query",request:i,queryParameters:{request:this._requestType,channel:this._channel,version:this._version,x:e,y:t,z:n+1}});return rl.loadImage(this,o)};Jl.prototype.pickFeatures=function(e,t,n,i,o){};Jl._logoUrl=void 0;Object.defineProperties(Jl,{logoUrl:{get:function(){return l(Jl._logoUrl)||(Jl._logoUrl=tn("Assets/Images/google_earth_credit.png")),Jl._logoUrl},set:function(e){Jl._logoUrl=e}}});var Aw=Jl;var SZi=T(S(),1);var Jst=/\/$/,Rge=new Ct('© Mapbox © OpenStreetMap Improve this map');function YV(e){e=y(e,y.EMPTY_OBJECT);let t=e.mapId,n=e.accessToken;this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=void 0,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0;let i=Ee.createIfNeeded(y(e.url,"https://{s}.tiles.mapbox.com/v4/"));this._mapId=t,this._accessToken=n;let o=y(e.format,"png");/\./.test(o)||(o=`.${o}`),this._format=o;let r=i.getUrlComponent();Jst.test(r)||(r+="/"),r+=`${t}/{z}/{x}/{y}${this._format}`,i.url=r,i.setQueryParameters({access_token:n});let s;l(e.credit)?(s=e.credit,typeof s=="string"&&(s=new Ct(s))):s=Rge,this._resource=i,this._imageryProvider=new wa({url:i,credit:s,ellipsoid:e.ellipsoid,minimumLevel:e.minimumLevel,maximumLevel:e.maximumLevel,rectangle:e.rectangle})}Object.defineProperties(YV.prototype,{url:{get:function(){return this._imageryProvider.url}},rectangle:{get:function(){return this._imageryProvider.rectangle}},tileWidth:{get:function(){return this._imageryProvider.tileWidth}},tileHeight:{get:function(){return this._imageryProvider.tileHeight}},maximumLevel:{get:function(){return this._imageryProvider.maximumLevel}},minimumLevel:{get:function(){return this._imageryProvider.minimumLevel}},tilingScheme:{get:function(){return this._imageryProvider.tilingScheme}},tileDiscardPolicy:{get:function(){return this._imageryProvider.tileDiscardPolicy}},errorEvent:{get:function(){return this._imageryProvider.errorEvent}},credit:{get:function(){return this._imageryProvider.credit}},proxy:{get:function(){return this._imageryProvider.proxy}},hasAlphaChannel:{get:function(){return this._imageryProvider.hasAlphaChannel}}});YV.prototype.getTileCredits=function(e,t,n){};YV.prototype.requestImage=function(e,t,n,i){return this._imageryProvider.requestImage(e,t,n,i)};YV.prototype.pickFeatures=function(e,t,n,i,o){return this._imageryProvider.pickFeatures(e,t,n,i,o)};YV._defaultCredit=Rge;var Mw=YV;var vZi=T(S(),1);function GT(e){e=y(e,y.EMPTY_OBJECT),this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=void 0,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0;let t=y(e.rectangle,ce.MAX_VALUE),n=new Ai({rectangle:t,numberOfLevelZeroTilesX:1,numberOfLevelZeroTilesY:1,ellipsoid:e.ellipsoid});this._tilingScheme=n,this._image=void 0,this._texture=void 0,this._hasError=!1,this._errorEvent=new ge;let i=e.credit;typeof i=="string"&&(i=new Ct(i)),this._credit=i;let o=Ee.createIfNeeded(e.url);this._resource=o,this._tileWidth=e.tileWidth,this._tileHeight=e.tileHeight}Object.defineProperties(GT.prototype,{url:{get:function(){return this._resource.url}},proxy:{get:function(){return this._resource.proxy}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){return 0}},minimumLevel:{get:function(){return 0}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._tilingScheme.rectangle}},tileDiscardPolicy:{get:function(){}},errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},hasAlphaChannel:{get:function(){return!0}}});function Qst(e,t,n,i){let o=`Failed to load image ${e.url}`;l(t)&&l(t.message)&&(o+=`: ${t.message}`);let r=xo.reportError(i,n,l(n)?n._errorEvent:void 0,o,0,0,0,t);if(r.retry)return Lj(e,n,r);throw l(n)&&(n._hasError=!0),new ue(o)}async function Lj(e,t,n){try{return await rl.loadImage(null,e)}catch(i){return Qst(e,i,t,n)}}GT.fromUrl=async function(e,t){let n=Ee.createIfNeeded(e),i=await Lj(n);t=y(t,y.EMPTY_OBJECT);let o=new GT({...t,url:e,tileWidth:i.width,tileHeight:i.height});return o._image=i,o};GT.prototype.getTileCredits=function(e,t,n){};GT.prototype.requestImage=async function(e,t,n,i){if(!this._hasError&&!l(this._image)){let o=await Lj(this._resource,this);return this._image=o,xo.reportSuccess(this._errorEvent),o}return this._image};GT.prototype.pickFeatures=function(e,t,n,i,o){};var Nw=GT;var oGi=T(S(),1);var kZi=T(S(),1);function jst(e,t,n){this.type=e,l(t)||(e==="json"?t="application/json":e==="xml"?t="text/xml":e==="html"?t="text/html":e==="text"&&(t="text/plain")),this.format=t,l(n)||(e==="json"?n=qst:e==="xml"?n=nat:(e==="html"||e==="text")&&(n=Zge)),this.callback=n}function qst(e){let t=[],n=e.features;for(let i=0;i0)for(let r=0;r\s*<\/body>/im,lat=//im,dat=/([\s\S]*)<\/title>/im;function Zge(e){if(cat.test(e)||lat.test(e))return;let t,n=dat.exec(e);n&&n.length>1&&(t=n[1]);let i=new Sh;return i.name=t,i.description=e,i.data=e,[i]}var ET=jst;var zZi=T(S(),1);function kw(e){e=y(e,y.EMPTY_OBJECT),this._tileCache={},this._tilesRequestedForInterval=[];let t=this._clock=e.clock;this._times=e.times,this._requestImageFunction=e.requestImageFunction,this._reloadFunction=e.reloadFunction,this._currentIntervalIndex=-1,t.onTick.addEventListener(this._clockOnTick,this),this._clockOnTick(t)}Object.defineProperties(kw.prototype,{clock:{get:function(){return this._clock},set:function(e){this._clock!==e&&(this._clock=e,this._clockOnTick(e),this._reloadFunction())}},times:{get:function(){return this._times},set:function(e){this._times!==e&&(this._times=e,this._clockOnTick(this._clock),this._reloadFunction())}},currentInterval:{get:function(){return this._times.get(this._currentIntervalIndex)}}});kw.prototype.getFromCache=function(e,t,n,i){let o=Gge(e,t,n),r,s=this._tileCache[this._currentIntervalIndex];if(l(s)&&l(s[o])){let a=s[o];r=a.promise.catch(function(c){throw i.state=a.request.state,c}),delete s[o]}return r};kw.prototype.checkApproachingInterval=function(e,t,n,i){let o=Gge(e,t,n),r=this._tilesRequestedForInterval,s=Ege(this),a={key:o,priorityFunction:i.priorityFunction};(!l(s)||!Xge(this,a,s))&&r.push(a),r.length>=512&&r.splice(0,256)};kw.prototype._clockOnTick=function(e){let t=e.currentTime,i=this._times.indexOf(t),o=this._currentIntervalIndex;if(i!==o){let s=this._tileCache[o];for(let a in s)s.hasOwnProperty(a)&&s[a].request.cancel();delete this._tileCache[o],this._tilesRequestedForInterval=[],this._currentIntervalIndex=i,this._reloadFunction();return}let r=Ege(this);if(l(r)){let s=this._tilesRequestedForInterval,a=!0;for(;a&&s.length!==0;){let c=s.pop();a=Xge(this,c,r),a||s.push(c)}}};function Gge(e,t,n){return`${e}-${t}-${n}`}function uat(e){let t=e.split("-");if(t.length===3)return{x:Number(t[0]),y:Number(t[1]),level:Number(t[2])}}function Ege(e){let t=e._times;if(!l(t))return;let n=e._clock,i=n.currentTime,o=n.canAnimate&&n.shouldAnimate,r=n.multiplier;if(!o&&r!==0)return;let s,a=t.indexOf(i);if(a<0)return;let c=t.get(a);return r>0?(s=te.secondsDifference(c.stop,i),++a):(s=te.secondsDifference(c.start,i),--a),s/=r,a>=0&&s<=5?t.get(a):void 0}function Xge(e,t,n){let i=e._times.indexOf(n.start),o=e._tileCache,r=o[i];l(r)||(r=o[i]={});let s=t.key;if(l(r[s]))return!0;let a=uat(s),c=new Yo({throttle:!1,throttleByServer:!0,type:ns.IMAGERY,priorityFunction:t.priorityFunction}),d=e._requestImageFunction(a.x,a.y,a.level,c,n);return l(d)?(r[s]={promise:d,request:c},!0):!1}var XT=kw;var mat=[3034,3035,3042,3043,3044],hat=[4471,4559];function Vh(e){if(e=y(e,y.EMPTY_OBJECT),l(e.times)&&!l(e.clock))throw new fe("options.times was specified, so options.clock is required.");this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=void 0,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0,this._getFeatureInfoUrl=y(e.getFeatureInfoUrl,e.url);let t=Ee.createIfNeeded(e.url),n=Ee.createIfNeeded(this._getFeatureInfoUrl);t.setQueryParameters(Vh.DefaultParameters,!0),n.setQueryParameters(Vh.GetFeatureInfoDefaultParameters,!0),l(e.parameters)&&t.setQueryParameters(Ige(e.parameters)),l(e.getFeatureInfoParameters)&&n.setQueryParameters(Ige(e.getFeatureInfoParameters));let i=this;this._reload=void 0,l(e.times)&&(this._timeDynamicImagery=new XT({clock:e.clock,times:e.times,requestImageFunction:function(s,a,c,d,u){return Wge(i,s,a,c,d,u)},reloadFunction:function(){l(i._reload)&&i._reload()}}));let o={};if(o.layers=e.layers,o.bbox="{westProjected},{southProjected},{eastProjected},{northProjected}",o.width="{width}",o.height="{height}",parseFloat(t.queryParameters.version)>=1.3){o.crs=y(e.crs,e.tilingScheme&&e.tilingScheme.projection instanceof Ci?"EPSG:3857":"CRS:84");let s=o.crs.split(":");if(s[0]==="EPSG"&&s.length===2){let a=Number(s[1]);(a>=4e3&&a<5e3&&!hat.includes(a)||mat.includes(a))&&(o.bbox="{southProjected},{westProjected},{northProjected},{eastProjected}")}}else o.srs=y(e.srs,e.tilingScheme&&e.tilingScheme.projection instanceof Ci?"EPSG:3857":"EPSG:4326");t.setQueryParameters(o,!0),n.setQueryParameters(o,!0);let r={query_layers:e.layers,info_format:"{format}"};parseFloat(n.queryParameters.version)>=1.3?(r.i="{i}",r.j="{j}"):(r.x="{i}",r.y="{j}"),n.setQueryParameters(r,!0),this._resource=t,this._pickFeaturesResource=n,this._layers=e.layers,this._tileProvider=new wa({url:t,pickFeaturesUrl:n,tilingScheme:y(e.tilingScheme,new Ai({ellipsoid:e.ellipsoid})),rectangle:e.rectangle,tileWidth:e.tileWidth,tileHeight:e.tileHeight,minimumLevel:e.minimumLevel,maximumLevel:e.maximumLevel,subdomains:e.subdomains,tileDiscardPolicy:e.tileDiscardPolicy,credit:e.credit,getFeatureInfoFormats:y(e.getFeatureInfoFormats,Vh.DefaultGetFeatureInfoFormats),enablePickFeatures:e.enablePickFeatures})}function Wge(e,t,n,i,o,r){let s=l(r)?r.data:void 0,a=e._tileProvider;return l(s)&&a._resource.setQueryParameters(s),a.requestImage(t,n,i,o)}function fat(e,t,n,i,o,r,s){let a=l(s)?s.data:void 0,c=e._tileProvider;return l(a)&&c._pickFeaturesResource.setQueryParameters(a),c.pickFeatures(t,n,i,o,r)}Object.defineProperties(Vh.prototype,{url:{get:function(){return this._resource._url}},proxy:{get:function(){return this._resource.proxy}},layers:{get:function(){return this._layers}},tileWidth:{get:function(){return this._tileProvider.tileWidth}},tileHeight:{get:function(){return this._tileProvider.tileHeight}},maximumLevel:{get:function(){return this._tileProvider.maximumLevel}},minimumLevel:{get:function(){return this._tileProvider.minimumLevel}},tilingScheme:{get:function(){return this._tileProvider.tilingScheme}},rectangle:{get:function(){return this._tileProvider.rectangle}},tileDiscardPolicy:{get:function(){return this._tileProvider.tileDiscardPolicy}},errorEvent:{get:function(){return this._tileProvider.errorEvent}},credit:{get:function(){return this._tileProvider.credit}},hasAlphaChannel:{get:function(){return this._tileProvider.hasAlphaChannel}},enablePickFeatures:{get:function(){return this._tileProvider.enablePickFeatures},set:function(e){this._tileProvider.enablePickFeatures=e}},clock:{get:function(){return this._timeDynamicImagery.clock},set:function(e){this._timeDynamicImagery.clock=e}},times:{get:function(){return this._timeDynamicImagery.times},set:function(e){this._timeDynamicImagery.times=e}},getFeatureInfoUrl:{get:function(){return this._getFeatureInfoUrl}}});Vh.prototype.getTileCredits=function(e,t,n){return this._tileProvider.getTileCredits(e,t,n)};Vh.prototype.requestImage=function(e,t,n,i){let o,r=this._timeDynamicImagery,s;return l(r)&&(s=r.currentInterval,o=r.getFromCache(e,t,n,i)),l(o)||(o=Wge(this,e,t,n,i,s)),l(o)&&l(r)&&r.checkApproachingInterval(e,t,n,i),o};Vh.prototype.pickFeatures=function(e,t,n,i,o){let r=this._timeDynamicImagery,s=l(r)?r.currentInterval:void 0;return fat(this,e,t,n,i,o,s)};Vh.DefaultParameters=Object.freeze({service:"WMS",version:"1.1.1",request:"GetMap",styles:"",format:"image/jpeg"});Vh.GetFeatureInfoDefaultParameters=Object.freeze({service:"WMS",version:"1.1.1",request:"GetFeatureInfo"});Vh.DefaultGetFeatureInfoFormats=Object.freeze([Object.freeze(new ET("json","application/json")),Object.freeze(new ET("xml","text/xml")),Object.freeze(new ET("text","text/html"))]);function Ige(e){let t={};for(let n in e)e.hasOwnProperty(n)&&(t[n.toLowerCase()]=e[n]);return t}var Uw=Vh;var bGi=T(S(),1);var pat=Object.freeze({service:"WMTS",version:"1.0.0",request:"GetTile"});function Dw(e){e=y(e,y.EMPTY_OBJECT),this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=void 0,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0;let t=Ee.createIfNeeded(e.url),n=e.style,i=e.tileMatrixSetID,o=t.url,r=o.match(/{/g);if(!l(r)||r.length===1&&/{s}/.test(o))t.setQueryParameters(pat),this._useKvp=!0;else{let m={style:n,Style:n,TileMatrixSet:i};t.setTemplateValues(m),this._useKvp=!1}this._resource=t,this._layer=e.layer,this._style=n,this._tileMatrixSetID=i,this._tileMatrixLabels=e.tileMatrixLabels,this._format=y(e.format,"image/jpeg"),this._tileDiscardPolicy=e.tileDiscardPolicy,this._tilingScheme=l(e.tilingScheme)?e.tilingScheme:new Br({ellipsoid:e.ellipsoid}),this._tileWidth=y(e.tileWidth,256),this._tileHeight=y(e.tileHeight,256),this._minimumLevel=y(e.minimumLevel,0),this._maximumLevel=e.maximumLevel,this._rectangle=y(e.rectangle,this._tilingScheme.rectangle),this._dimensions=e.dimensions;let s=this;this._reload=void 0,l(e.times)&&(this._timeDynamicImagery=new XT({clock:e.clock,times:e.times,requestImageFunction:function(m,p,g,f,x){return Pge(s,m,p,g,f,x)},reloadFunction:function(){l(s._reload)&&s._reload()}}));let a=this._tilingScheme.positionToTileXY(ce.southwest(this._rectangle),this._minimumLevel),c=this._tilingScheme.positionToTileXY(ce.northeast(this._rectangle),this._minimumLevel),d=(Math.abs(c.x-a.x)+1)*(Math.abs(c.y-a.y)+1);this._errorEvent=new ge;let u=e.credit;this._credit=typeof u=="string"?new Ct(u):u,this._subdomains=e.subdomains,Array.isArray(this._subdomains)?this._subdomains=this._subdomains.slice():l(this._subdomains)&&this._subdomains.length>0?this._subdomains=this._subdomains.split(""):this._subdomains=["a","b","c"]}function Pge(e,t,n,i,o,r){let s=e._tileMatrixLabels,a=l(s)?s[i]:i.toString(),c=e._subdomains,d=e._dimensions,u=l(r)?r.data:void 0,m,p;if(!e._useKvp)p={TileMatrix:a,TileRow:n.toString(),TileCol:t.toString(),s:c[(t+n+i)%c.length]},m=e._resource.getDerivedResource({request:o}),m.setTemplateValues(p),l(d)&&m.setTemplateValues(d),l(u)&&m.setTemplateValues(u);else{let g={};g.tilematrix=a,g.layer=e._layer,g.style=e._style,g.tilerow=n,g.tilecol=t,g.tilematrixset=e._tileMatrixSetID,g.format=e._format,l(d)&&(g=xt(g,d)),l(u)&&(g=xt(g,u)),p={s:c[(t+n+i)%c.length]},m=e._resource.getDerivedResource({queryParameters:g,request:o}),m.setTemplateValues(p)}return rl.loadImage(e,m)}Object.defineProperties(Dw.prototype,{url:{get:function(){return this._resource.url}},proxy:{get:function(){return this._resource.proxy}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){return this._maximumLevel}},minimumLevel:{get:function(){return this._minimumLevel}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._rectangle}},tileDiscardPolicy:{get:function(){return this._tileDiscardPolicy}},errorEvent:{get:function(){return this._errorEvent}},format:{get:function(){return this._format}},credit:{get:function(){return this._credit}},hasAlphaChannel:{get:function(){return!0}},clock:{get:function(){return this._timeDynamicImagery.clock},set:function(e){this._timeDynamicImagery.clock=e}},times:{get:function(){return this._timeDynamicImagery.times},set:function(e){this._timeDynamicImagery.times=e}},dimensions:{get:function(){return this._dimensions},set:function(e){this._dimensions!==e&&(this._dimensions=e,l(this._reload)&&this._reload())}}});Dw.prototype.getTileCredits=function(e,t,n){};Dw.prototype.requestImage=function(e,t,n,i){let o,r=this._timeDynamicImagery,s;return l(r)&&(s=r.currentInterval,o=r.getFromCache(e,t,n,i)),l(o)||(o=Pge(this,e,t,n,i,s)),l(o)&&l(r)&&r.checkApproachingInterval(e,t,n,i),o};Dw.prototype.pickFeatures=function(e,t,n,i,o){};var Bw=Dw;var bat={ARCGIS_MAPSERVER:J0.fromUrl,BING:async(e,t)=>vw.fromUrl(e,t),GOOGLE_EARTH:async(e,t)=>{let n=t.channel;return delete t.channel,Aw.fromUrl(e,n,t)},MAPBOX:(e,t)=>new Mw({url:e,...t}),SINGLE_TILE:Nw.fromUrl,TMS:Ty.fromUrl,URL_TEMPLATE:(e,t)=>new wa({url:e,...t}),WMS:(e,t)=>new Uw({url:e,...t}),WMTS:(e,t)=>new Bw({url:e,...t})};function Uf(e){e=y(e,y.EMPTY_OBJECT),this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=void 0,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0,this._tileCredits=void 0,this._errorEvent=new ge}Object.defineProperties(Uf.prototype,{rectangle:{get:function(){return this._imageryProvider.rectangle}},tileWidth:{get:function(){return this._imageryProvider.tileWidth}},tileHeight:{get:function(){return this._imageryProvider.tileHeight}},maximumLevel:{get:function(){return this._imageryProvider.maximumLevel}},minimumLevel:{get:function(){return this._imageryProvider.minimumLevel}},tilingScheme:{get:function(){return this._imageryProvider.tilingScheme}},tileDiscardPolicy:{get:function(){return this._imageryProvider.tileDiscardPolicy}},errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._imageryProvider.credit}},hasAlphaChannel:{get:function(){return this._imageryProvider.hasAlphaChannel}},proxy:{get:function(){}}});Uf.fromAssetId=async function(e,t){t=y(t,y.EMPTY_OBJECT);let n=sd._createEndpointResource(e,t),i=e.toString()+t.accessToken+t.server,o=Uf._endpointCache[i];l(o)||(o=n.fetchJson(),Uf._endpointCache[i]=o);let r=await o;if(r.type!=="IMAGERY")throw new ue(`Cesium ion asset ${e} is not an imagery asset.`);let s,a=r.externalType;if(!l(a))s=await Ty.fromUrl(new sd(r,n));else{let d=bat[a];if(!l(d))throw new ue(`Unrecognized Cesium ion imagery type: ${a}`);let u={...r.options},m=u.url;delete u.url,s=await d(m,u)}let c=new Uf(t);return s.errorEvent.addEventListener(function(d){d.provider=c,c._errorEvent.raiseEvent(d)}),c._tileCredits=sd.getCreditsFromEndpoint(r,n),c._imageryProvider=s,c};Uf.prototype.getTileCredits=function(e,t,n){let i=this._imageryProvider.getTileCredits(e,t,n);return l(i)?this._tileCredits.concat(i):this._tileCredits};Uf.prototype.requestImage=function(e,t,n,i){return this._imageryProvider.requestImage(e,t,n,i)};Uf.prototype.pickFeatures=function(e,t,n,i,o){return this._imageryProvider.pickFeatures(e,t,n,i,o)};Uf._endpointCache={};var Q0=Uf;var vGi=T(S(),1),gat={AERIAL:2,AERIAL_WITH_LABELS:3,ROAD:4},j0=Object.freeze(gat);function yat(e){e=y(e,y.EMPTY_OBJECT);let t=y(e.style,j0.AERIAL);return Q0.fromAssetId(t)}var q0=yat;var YGi=T(S(),1);function OV(e,t,n,i,o){if(this.imageryLayer=e,this.x=t,this.y=n,this.level=i,this.request=void 0,i!==0){let r=t/2|0,s=n/2|0,a=i-1;this.parent=e.getImageryFromCache(r,s,a)}this.state=ai.UNLOADED,this.imageUrl=void 0,this.image=void 0,this.texture=void 0,this.textureWebMercator=void 0,this.credits=void 0,this.referenceCount=0,!l(o)&&e.ready&&(o=e.imageryProvider.tilingScheme.tileXYToRectangle(t,n,i)),this.rectangle=o}OV.createPlaceholder=function(e){let t=new OV(e,0,0,0);return t.addReference(),t.state=ai.PLACEHOLDER,t};OV.prototype.addReference=function(){++this.referenceCount};OV.prototype.releaseReference=function(){return--this.referenceCount,this.referenceCount===0?(this.imageryLayer.removeImageryFromCache(this),l(this.parent)&&this.parent.releaseReference(),l(this.image)&&l(this.image.destroy)&&this.image.destroy(),l(this.texture)&&this.texture.destroy(),l(this.textureWebMercator)&&this.texture!==this.textureWebMercator&&this.textureWebMercator.destroy(),me(this),0):this.referenceCount};OV.prototype.processStateMachine=function(e,t,n){this.state===ai.UNLOADED&&!n&&(this.state=ai.TRANSITIONING,this.imageryLayer._requestImagery(this)),this.state===ai.RECEIVED&&(this.state=ai.TRANSITIONING,this.imageryLayer._createTexture(e.context,this));let i=this.state===ai.READY&&t&&!this.texture;(this.state===ai.TEXTURE_LOADED||i)&&(this.state=ai.TRANSITIONING,this.imageryLayer._reprojectTexture(e,this,t))};var HV=OV;var KGi=T(S(),1);function Gj(e,t,n){this.readyImagery=void 0,this.loadingImagery=e,this.textureCoordinateRectangle=t,this.textureTranslationAndScale=void 0,this.useWebMercatorT=n}Gj.prototype.freeResources=function(){l(this.readyImagery)&&this.readyImagery.releaseReference(),l(this.loadingImagery)&&this.loadingImagery.releaseReference()};Gj.prototype.processStateMachine=function(e,t,n){let i=this.loadingImagery,o=i.imageryLayer;if(i.processStateMachine(t,!this.useWebMercatorT,n),i.state===ai.READY)return l(this.readyImagery)&&this.readyImagery.releaseReference(),this.readyImagery=this.loadingImagery,this.loadingImagery=void 0,this.textureTranslationAndScale=o._calculateTextureTranslationAndScale(e,this),!0;let r=i.parent,s;for(;l(r)&&(r.state!==ai.READY||!this.useWebMercatorT&&!l(r.texture));)r.state!==ai.FAILED&&r.state!==ai.INVALID&&(s=s||r),r=r.parent;return this.readyImagery!==r&&(l(this.readyImagery)&&this.readyImagery.releaseReference(),this.readyImagery=r,l(r)&&(r.addReference(),this.textureTranslationAndScale=o._calculateTextureTranslationAndScale(e,this))),i.state===ai.FAILED||i.state===ai.INVALID?l(s)?(s.processStateMachine(t,!this.useWebMercatorT,n),!1):!0:!1};var zV=Gj;function gi(e,t){this._imageryProvider=e,this._readyEvent=new ge,this._errorEvent=new ge,t=y(t,y.EMPTY_OBJECT),e=y(e,y.EMPTY_OBJECT),this.alpha=y(t.alpha,y(e._defaultAlpha,1)),this.nightAlpha=y(t.nightAlpha,y(e._defaultNightAlpha,1)),this.dayAlpha=y(t.dayAlpha,y(e._defaultDayAlpha,1)),this.brightness=y(t.brightness,y(e._defaultBrightness,gi.DEFAULT_BRIGHTNESS)),this.contrast=y(t.contrast,y(e._defaultContrast,gi.DEFAULT_CONTRAST)),this.hue=y(t.hue,y(e._defaultHue,gi.DEFAULT_HUE)),this.saturation=y(t.saturation,y(e._defaultSaturation,gi.DEFAULT_SATURATION)),this.gamma=y(t.gamma,y(e._defaultGamma,gi.DEFAULT_GAMMA)),this.splitDirection=y(t.splitDirection,gi.DEFAULT_SPLIT),this.minificationFilter=y(t.minificationFilter,y(e._defaultMinificationFilter,gi.DEFAULT_MINIFICATION_FILTER)),this.magnificationFilter=y(t.magnificationFilter,y(e._defaultMagnificationFilter,gi.DEFAULT_MAGNIFICATION_FILTER)),this.show=y(t.show,!0),this._minimumTerrainLevel=t.minimumTerrainLevel,this._maximumTerrainLevel=t.maximumTerrainLevel,this._rectangle=y(t.rectangle,ce.MAX_VALUE),this._maximumAnisotropy=t.maximumAnisotropy,this._imageryCache={},this._skeletonPlaceholder=new zV(HV.createPlaceholder(this)),this._show=!0,this._layerIndex=-1,this._isBaseLayer=!1,this._requestImageError=void 0,this._reprojectComputeCommands=[],this.cutoutRectangle=t.cutoutRectangle,this.colorToAlpha=t.colorToAlpha,this.colorToAlphaThreshold=y(t.colorToAlphaThreshold,gi.DEFAULT_APPLY_COLOR_TO_ALPHA_THRESHOLD)}Object.defineProperties(gi.prototype,{imageryProvider:{get:function(){return this._imageryProvider}},ready:{get:function(){return l(this._imageryProvider)}},errorEvent:{get:function(){return this._errorEvent}},readyEvent:{get:function(){return this._readyEvent}},rectangle:{get:function(){return this._rectangle}}});gi.DEFAULT_BRIGHTNESS=1;gi.DEFAULT_CONTRAST=1;gi.DEFAULT_HUE=0;gi.DEFAULT_SATURATION=1;gi.DEFAULT_GAMMA=1;gi.DEFAULT_SPLIT=qc.NONE;gi.DEFAULT_MINIFICATION_FILTER=rn.LINEAR;gi.DEFAULT_MAGNIFICATION_FILTER=di.LINEAR;gi.DEFAULT_APPLY_COLOR_TO_ALPHA_THRESHOLD=.004;gi.fromProviderAsync=function(e,t){let n=new gi(void 0,t);return Cat(n,Promise.resolve(e)),n};gi.fromWorldImagery=function(e){return e=y(e,y.EMPTY_OBJECT),gi.fromProviderAsync(q0({style:e.style}),e)};gi.prototype.isBaseLayer=function(){return this._isBaseLayer};gi.prototype.isDestroyed=function(){return!1};gi.prototype.destroy=function(){return me(this)};var Fge=new ce,vge=new ce,Ej=new ce,Age=new ce;gi.prototype.getImageryRectangle=function(){let e=this._imageryProvider,t=this._rectangle;return ce.intersection(e.rectangle,t)};gi.prototype._createTileImagerySkeletons=function(e,t,n){let i=e.data;if(!l(t)||l(this._minimumTerrainLevel)&&e.level<this._minimumTerrainLevel||l(this._maximumTerrainLevel)&&e.level>this._maximumTerrainLevel)return!1;l(n)||(n=i.imagery.length);let o=this._imageryProvider;if(!this.ready)return this._skeletonPlaceholder.loadingImagery.addReference(),i.imagery.splice(n,0,this._skeletonPlaceholder),!0;let r=o.tilingScheme.projection instanceof Ci&&e.rectangle.north<Ci.MaximumLatitude&&e.rectangle.south>-Ci.MaximumLatitude,s=ce.intersection(o.rectangle,this._rectangle,Fge),a=ce.intersection(e.rectangle,s,vge);if(!l(a)){if(!this.isBaseLayer())return!1;let E=s,I=e.rectangle;a=vge,I.south>=E.north?a.north=a.south=E.north:I.north<=E.south?a.north=a.south=E.south:(a.south=Math.max(I.south,E.south),a.north=Math.min(I.north,E.north)),I.west>=E.east?a.west=a.east=E.east:I.east<=E.west?a.west=a.east=E.west:(a.west=Math.max(I.west,E.west),a.east=Math.min(I.east,E.east))}let c=0;a.south>0?c=a.south:a.north<0&&(c=a.north);let u=1*t.getLevelMaximumGeometricError(e.level),m=Tat(this,u,c);m=Math.max(0,m);let p=o.maximumLevel;if(m>p&&(m=p),l(o.minimumLevel)){let E=o.minimumLevel;m<E&&(m=E)}let g=o.tilingScheme,f=g.positionToTileXY(ce.northwest(a),m),x=g.positionToTileXY(ce.southeast(a),m),_=e.rectangle.width/512,C=e.rectangle.height/512,V=g.tileXYToRectangle(f.x,f.y,m);Math.abs(V.south-e.rectangle.north)<C&&f.y<x.y&&++f.y,Math.abs(V.east-e.rectangle.west)<_&&f.x<x.x&&++f.x;let L=g.tileXYToRectangle(x.x,x.y,m);Math.abs(L.north-e.rectangle.south)<C&&x.y>f.y&&--x.y,Math.abs(L.west-e.rectangle.east)<_&&x.x>f.x&&--x.x;let Z=ce.clone(e.rectangle,Age),G=g.tileXYToRectangle(f.x,f.y,m),X=ce.intersection(G,s,Ej),v;r?(g.rectangleToNativeRectangle(Z,Z),g.rectangleToNativeRectangle(G,G),g.rectangleToNativeRectangle(X,X),g.rectangleToNativeRectangle(s,s),v=g.tileXYToNativeRectangle.bind(g),_=Z.width/512,C=Z.height/512):v=g.tileXYToRectangle.bind(g);let P,F=0,A=1,b;!this.isBaseLayer()&&Math.abs(X.west-Z.west)>=_&&(F=Math.min(1,(X.west-Z.west)/Z.width)),!this.isBaseLayer()&&Math.abs(X.north-Z.north)>=C&&(A=Math.max(0,(X.north-Z.south)/Z.height));let R=A;for(let E=f.x;E<=x.x;E++)if(P=F,G=v(E,f.y,m),X=ce.simpleIntersection(G,s,Ej),!!l(X)){F=Math.min(1,(X.east-Z.west)/Z.width),E===x.x&&(this.isBaseLayer()||Math.abs(X.east-Z.east)<_)&&(F=1),A=R;for(let I=f.y;I<=x.y;I++){if(b=A,G=v(E,I,m),X=ce.simpleIntersection(G,s,Ej),!l(X))continue;A=Math.max(0,(X.south-Z.south)/Z.height),I===x.y&&(this.isBaseLayer()||Math.abs(X.south-Z.south)<C)&&(A=0);let w=new se(P,A,F,b),N=this.getImageryFromCache(E,I,m);i.imagery.splice(n,0,new zV(N,w,r)),++n}}return!0};gi.prototype._calculateTextureTranslationAndScale=function(e,t){let n=t.readyImagery.rectangle,i=e.rectangle;if(t.useWebMercatorT){let c=t.readyImagery.imageryLayer.imageryProvider.tilingScheme;n=c.rectangleToNativeRectangle(n,Fge),i=c.rectangleToNativeRectangle(i,Age)}let o=i.width,r=i.height,s=o/n.width,a=r/n.height;return new se(s*(i.west-n.west)/o,a*(i.south-n.south)/r,s,a)};gi.prototype._requestImagery=function(e){let t=this._imageryProvider,n=this;function i(s){if(!l(s))return o();e.image=s,e.state=ai.RECEIVED,e.request=void 0,xo.reportSuccess(n._requestImageError)}function o(s){if(e.request.state===Qn.CANCELLED){e.state=ai.UNLOADED,e.request=void 0;return}e.state=ai.FAILED,e.request=void 0;let a=`Failed to obtain image tile X: ${e.x} Y: ${e.y} Level: ${e.level}.`;n._requestImageError=xo.reportError(n._requestImageError,t,t.errorEvent,a,e.x,e.y,e.level,s),n._requestImageError.retry&&r()}function r(){let s=new Yo({throttle:!1,throttleByServer:!0,type:ns.IMAGERY});e.request=s,e.state=ai.TRANSITIONING;let a=t.requestImage(e.x,e.y,e.level,s);if(!l(a)){e.state=ai.UNLOADED,e.request=void 0;return}l(t.getTileCredits)&&(e.credits=t.getTileCredits(e.x,e.y,e.level)),a.then(function(c){i(c)}).catch(function(c){o(c)})}r()};gi.prototype._createTextureWebGL=function(e,t){let n=new sn({minificationFilter:this.minificationFilter,magnificationFilter:this.magnificationFilter}),i=t.image;return l(i.internalFormat)?new Et({context:e,pixelFormat:i.internalFormat,width:i.width,height:i.height,source:{arrayBufferView:i.bufferView},sampler:n}):new Et({context:e,source:i,pixelFormat:this._imageryProvider.hasAlphaChannel?at.RGBA:at.RGB,sampler:n})};gi.prototype._createTexture=function(e,t){let n=this._imageryProvider,i=t.image;if(l(n.tileDiscardPolicy)){let r=n.tileDiscardPolicy;if(l(r)){if(!r.isReady()){t.state=ai.RECEIVED;return}if(r.shouldDiscardImage(i)){t.state=ai.INVALID;return}}}let o=this._createTextureWebGL(e,t);n.tilingScheme.projection instanceof Ci?t.textureWebMercator=o:t.texture=o,t.image=void 0,t.state=ai.TEXTURE_LOADED};function wge(e,t,n){return`${e}:${t}:${n}`}gi.prototype._finalizeReprojectTexture=function(e,t){let n=this.minificationFilter,i=this.magnificationFilter;if(n===rn.LINEAR&&i===di.LINEAR&&!at.isCompressedFormat(t.pixelFormat)&&W.isPowerOfTwo(t.width)&&W.isPowerOfTwo(t.height)){n=rn.LINEAR_MIPMAP_LINEAR;let r=Mt.maximumTextureFilterAnisotropy,s=Math.min(r,y(this._maximumAnisotropy,r)),a=wge(n,i,s),c=e.cache.imageryLayerMipmapSamplers;l(c)||(c={},e.cache.imageryLayerMipmapSamplers=c);let d=c[a];l(d)||(d=c[a]=new sn({wrapS:Cn.CLAMP_TO_EDGE,wrapT:Cn.CLAMP_TO_EDGE,minificationFilter:n,magnificationFilter:i,maximumAnisotropy:s})),t.generateMipmap(af.NICEST),t.sampler=d}else{let r=wge(n,i,0),s=e.cache.imageryLayerNonMipmapSamplers;l(s)||(s={},e.cache.imageryLayerNonMipmapSamplers=s);let a=s[r];l(a)||(a=s[r]=new sn({wrapS:Cn.CLAMP_TO_EDGE,wrapT:Cn.CLAMP_TO_EDGE,minificationFilter:n,magnificationFilter:i})),t.sampler=a}};gi.prototype._reprojectTexture=function(e,t,n){let i=t.textureWebMercator||t.texture,o=t.rectangle,r=e.context;if(n=y(n,!0),n&&!(this._imageryProvider.tilingScheme.projection instanceof Si)&&o.width/i.width>1e-5){let s=this;t.addReference();let a=new Xl({persists:!0,owner:this,preExecute:function(c){_at(c,r,i,t.rectangle)},postExecute:function(c){t.texture=c,s._finalizeReprojectTexture(r,c),t.state=ai.READY,t.releaseReference()},canceled:function(){t.state=ai.TEXTURE_LOADED,t.releaseReference()}});this._reprojectComputeCommands.push(a)}else n&&(t.texture=i),this._finalizeReprojectTexture(r,i),t.state=ai.READY};gi.prototype.queueReprojectionCommands=function(e){let t=this._reprojectComputeCommands,n=t.length;for(let i=0;i<n;++i)e.commandList.push(t[i]);t.length=0};gi.prototype.cancelReprojections=function(){this._reprojectComputeCommands.forEach(function(e){l(e.canceled)&&e.canceled()}),this._reprojectComputeCommands.length=0};gi.prototype.getImageryFromCache=function(e,t,n,i){let o=Mge(e,t,n),r=this._imageryCache[o];return l(r)||(r=new HV(this,e,t,n,i),this._imageryCache[o]=r),r.addReference(),r};gi.prototype.removeImageryFromCache=function(e){let t=Mge(e.x,e.y,e.level);delete this._imageryCache[t]};function Mge(e,t,n){return JSON.stringify([e,t,n])}var CD={u_textureDimensions:function(){return this.textureDimensions},u_texture:function(){return this.texture},textureDimensions:new D,texture:void 0},xat=Yt.supportsTypedArrays()?new Float32Array(2*64):void 0;function _at(e,t,n,i){let o=t.cache.imageryLayer_reproject;if(!l(o)){o=t.cache.imageryLayer_reproject={vertexArray:void 0,shaderProgram:void 0,sampler:void 0,destroy:function(){l(this.framebuffer)&&this.framebuffer.destroy(),l(this.vertexArray)&&this.vertexArray.destroy(),l(this.shaderProgram)&&this.shaderProgram.destroy()}};let _=new Float32Array(2*64*2),C=0;for(let X=0;X<64;++X){let v=X/63;_[C++]=0,_[C++]=v,_[C++]=1,_[C++]=v}let V={position:0,webMercatorT:1},L=Dr.getRegularGridIndices(2,64),Z=ft.createIndexBuffer({context:t,typedArray:L,usage:Ne.STATIC_DRAW,indexDatatype:Me.UNSIGNED_SHORT});o.vertexArray=new ti({context:t,attributes:[{index:V.position,vertexBuffer:ft.createVertexBuffer({context:t,typedArray:_,usage:Ne.STATIC_DRAW}),componentsPerAttribute:2},{index:V.webMercatorT,vertexBuffer:ft.createVertexBuffer({context:t,sizeInBytes:64*2*4,usage:Ne.STREAM_DRAW}),componentsPerAttribute:1}],indexBuffer:Z});let G=new Ye({sources:[Sw]});o.shaderProgram=$t.fromCache({context:t,vertexShaderSource:G,fragmentShaderSource:Tw,attributeLocations:V}),o.sampler=new sn({wrapS:Cn.CLAMP_TO_EDGE,wrapT:Cn.CLAMP_TO_EDGE,minificationFilter:rn.LINEAR,magnificationFilter:di.LINEAR})}n.sampler=o.sampler;let r=n.width,s=n.height;CD.textureDimensions.x=r,CD.textureDimensions.y=s,CD.texture=n;let a=Math.sin(i.south),c=.5*Math.log((1+a)/(1-a));a=Math.sin(i.north);let u=1/(.5*Math.log((1+a)/(1-a))-c),m=new Et({context:t,width:r,height:s,pixelFormat:n.pixelFormat,pixelDatatype:n.pixelDatatype,preMultiplyAlpha:n.preMultiplyAlpha});W.isPowerOfTwo(r)&&W.isPowerOfTwo(s)&&m.generateMipmap(af.NICEST);let p=i.south,g=i.north,f=xat,x=0;for(let _=0;_<64;++_){let C=_/63,V=W.lerp(p,g,C);a=Math.sin(V);let Z=(.5*Math.log((1+a)/(1-a))-c)*u;f[x++]=Z,f[x++]=Z}o.vertexArray.getAttribute(1).vertexBuffer.copyFromArrayView(f),e.shaderProgram=o.shaderProgram,e.outputTexture=m,e.uniformMap=CD,e.vertexArray=o.vertexArray}function Tat(e,t,n){let i=e._imageryProvider,o=i.tilingScheme,r=o.ellipsoid,s=e._imageryProvider.tilingScheme.projection instanceof Si?1:Math.cos(n),a=o.rectangle,d=r.maximumRadius*a.width*s/(i.tileWidth*o.getNumberOfXTilesAtLevel(0))/t,u=Math.log(d)/Math.log(2);return Math.round(u)|0}function Sat(e,t){e.numberOfListeners>0?e.raiseEvent(t):console.error(t)}async function Cat(e,t){let n;try{if(n=await Promise.resolve(t),e.isDestroyed())return;e._imageryProvider=n,e._readyEvent.raiseEvent(n)}catch(i){Sat(e._errorEvent,i)}}var ma=gi;var oXi=T(S(),1);var FEi=T(S(),1),Nge={NONE:0,CULLED:1,RENDERED:2,REFINED:3,RENDERED_AND_KICKED:6,REFINED_AND_KICKED:7,CULLED_BUT_NEEDED:9,wasKicked:function(e){return e>=Nge.RENDERED_AND_KICKED},originalResult:function(e){return e&3},kick:function(e){return e|4}},Kn=Nge;function JV(e){this.tile=e,this.frameLastUpdated=void 0,this.westMeshes=[],this.westTiles=[],this.southMeshes=[],this.southTiles=[],this.eastMeshes=[],this.eastTiles=[],this.northMeshes=[],this.northTiles=[],this.southwestMesh=void 0,this.southwestTile=void 0,this.southeastMesh=void 0,this.southeastTile=void 0,this.northwestMesh=void 0,this.northwestTile=void 0,this.northeastMesh=void 0,this.northeastTile=void 0,this.changedThisFrame=!0,this.visitedFrame=void 0,this.enqueuedFrame=void 0,this.mesh=void 0,this.vertexArray=void 0,this.waterMaskTexture=void 0,this.waterMaskTranslationAndScale=new se}JV.prototype.update=function(e,t,n){this.changedThisFrame&&(Hge(e,t,this.tile,n),this.changedThisFrame=!1)};JV.prototype.destroy=function(e){this._destroyVertexArray(e),l(this.waterMaskTexture)&&(--this.waterMaskTexture.referenceCount,this.waterMaskTexture.referenceCount===0&&this.waterMaskTexture.destroy(),this.waterMaskTexture=void 0)};JV.prototype._destroyVertexArray=function(e){l(this.vertexArray)&&(l(e)?e.push(this.vertexArray):qu._freeVertexArray(this.vertexArray),this.vertexArray=void 0)};var Vat=new Ab;JV.updateFillTiles=function(e,t,n,i){let o=e._quadtree,r=o._levelZeroTiles,s=o._lastSelectionFrameNumber,a=Vat;a.clear();for(let d=0;d<t.length;++d){let u=t[d];l(u.data.vertexArray)&&a.enqueue(t[d])}let c=a.dequeue();for(;c!==void 0;){let d=c.findTileToWest(r),u=c.findTileToSouth(r),m=c.findTileToEast(r),p=c.findTileToNorth(r);Vs(e,n,c,d,s,gn.EAST,!1,a,i),Vs(e,n,c,u,s,gn.NORTH,!1,a,i),Vs(e,n,c,m,s,gn.WEST,!1,a,i),Vs(e,n,c,p,s,gn.SOUTH,!1,a,i);let g=d.findTileToNorth(r),f=d.findTileToSouth(r),x=m.findTileToNorth(r),_=m.findTileToSouth(r);Vs(e,n,c,g,s,gn.SOUTHEAST,!1,a,i),Vs(e,n,c,x,s,gn.SOUTHWEST,!1,a,i),Vs(e,n,c,f,s,gn.NORTHEAST,!1,a,i),Vs(e,n,c,_,s,gn.NORTHWEST,!1,a,i),c=a.dequeue()}};function Vs(e,t,n,i,o,r,s,a,c){if(i===void 0)return;let d=i;for(;d&&(d._lastSelectionResultFrame!==o||Kn.wasKicked(d._lastSelectionResult)||Kn.originalResult(d._lastSelectionResult)===Kn.CULLED);){if(s)return;let u=d.parent;if(r>=gn.NORTHWEST&&u!==void 0)switch(r){case gn.NORTHWEST:d=d===u.northwestChild?u:void 0;break;case gn.NORTHEAST:d=d===u.northeastChild?u:void 0;break;case gn.SOUTHWEST:d=d===u.southwestChild?u:void 0;break;case gn.SOUTHEAST:d=d===u.southeastChild?u:void 0;break}else d=u}if(d!==void 0){if(d._lastSelectionResult===Kn.RENDERED){if(l(d.data.vertexArray))return;Lat(e,t,n,d,r,o,a,c);return}if(Kn.originalResult(i._lastSelectionResult)!==Kn.CULLED)switch(r){case gn.WEST:Vs(e,t,n,i.northwestChild,o,r,!0,a,c),Vs(e,t,n,i.southwestChild,o,r,!0,a,c);break;case gn.EAST:Vs(e,t,n,i.southeastChild,o,r,!0,a,c),Vs(e,t,n,i.northeastChild,o,r,!0,a,c);break;case gn.SOUTH:Vs(e,t,n,i.southwestChild,o,r,!0,a,c),Vs(e,t,n,i.southeastChild,o,r,!0,a,c);break;case gn.NORTH:Vs(e,t,n,i.northeastChild,o,r,!0,a,c),Vs(e,t,n,i.northwestChild,o,r,!0,a,c);break;case gn.NORTHWEST:Vs(e,t,n,i.northwestChild,o,r,!0,a,c);break;case gn.NORTHEAST:Vs(e,t,n,i.northeastChild,o,r,!0,a,c);break;case gn.SOUTHWEST:Vs(e,t,n,i.southwestChild,o,r,!0,a,c);break;case gn.SOUTHEAST:Vs(e,t,n,i.southeastChild,o,r,!0,a,c);break;default:throw new fe("Invalid edge")}}}function Lat(e,t,n,i,o,r,s,a){let c=i.data;if(c.fill===void 0)c.fill=new JV(i);else if(c.fill.visitedFrame===r)return;c.fill.enqueuedFrame!==r&&(c.fill.enqueuedFrame=r,c.fill.changedThisFrame=!1,s.enqueue(i)),Rat(e,t,n,i,o,a)}function Rat(e,t,n,i,o,r){let s=i.data.fill,a,c=n.data.fill;l(c)?(c.visitedFrame=t.frameNumber,c.changedThisFrame&&(Hge(e,t,n,r),c.changedThisFrame=!1),a=n.data.fill.mesh):a=n.data.mesh;let d,u;switch(o){case gn.WEST:d=s.westMeshes,u=s.westTiles;break;case gn.SOUTH:d=s.southMeshes,u=s.southTiles;break;case gn.EAST:d=s.eastMeshes,u=s.eastTiles;break;case gn.NORTH:d=s.northMeshes,u=s.northTiles;break;case gn.NORTHWEST:s.changedThisFrame=s.changedThisFrame||s.northwestMesh!==a,s.northwestMesh=a,s.northwestTile=n;return;case gn.NORTHEAST:s.changedThisFrame=s.changedThisFrame||s.northeastMesh!==a,s.northeastMesh=a,s.northeastTile=n;return;case gn.SOUTHWEST:s.changedThisFrame=s.changedThisFrame||s.southwestMesh!==a,s.southwestMesh=a,s.southwestTile=n;return;case gn.SOUTHEAST:s.changedThisFrame=s.changedThisFrame||s.southeastMesh!==a,s.southeastMesh=a,s.southeastTile=n;return}if(n.level<=i.level){s.changedThisFrame=s.changedThisFrame||d[0]!==a||d.length!==1,d[0]=a,u[0]=n,d.length=1,u.length=1;return}let m,p,g,f,x=n.rectangle,_,C=i.rectangle;switch(o){case gn.WEST:for(_=(C.north-C.south)*W.EPSILON5,m=0;m<u.length&&(g=u[m],f=g.rectangle,!W.greaterThan(x.north,f.south,_));++m);for(p=m;p<u.length&&(g=u[p],f=g.rectangle,!W.greaterThanOrEquals(x.south,f.north,_));++p);break;case gn.SOUTH:for(_=(C.east-C.west)*W.EPSILON5,m=0;m<u.length&&(g=u[m],f=g.rectangle,!W.lessThan(x.west,f.east,_));++m);for(p=m;p<u.length&&(g=u[p],f=g.rectangle,!W.lessThanOrEquals(x.east,f.west,_));++p);break;case gn.EAST:for(_=(C.north-C.south)*W.EPSILON5,m=0;m<u.length&&(g=u[m],f=g.rectangle,!W.lessThan(x.south,f.north,_));++m);for(p=m;p<u.length&&(g=u[p],f=g.rectangle,!W.lessThanOrEquals(x.north,f.south,_));++p);break;case gn.NORTH:for(_=(C.east-C.west)*W.EPSILON5,m=0;m<u.length&&(g=u[m],f=g.rectangle,!W.greaterThan(x.east,f.west,_));++m);for(p=m;p<u.length&&(g=u[p],f=g.rectangle,!W.greaterThanOrEquals(x.west,f.east,_));++p);break}p-m===1?(s.changedThisFrame=s.changedThisFrame||d[m]!==a,d[m]=a,u[m]=n):(s.changedThisFrame=!0,d.splice(m,p-m,a),u.splice(m,p-m,n))}var IT=new he,Zat=new he,KV=new h,Pj=new h,Xj=new D,Ij=new D,zd=new D;function XD(){this.height=0,this.encodedNormal=new D}function VD(e,t,n,i,o,r,s,a,c){if(l(o))return o;let d;if(l(r)&&l(s))d=(r.height+s.height)*.5;else if(l(r))d=r.height;else if(l(s))d=s.height;else if(l(a))d=a.height;else{let m=e.tile.data.tileBoundingRegion,p=0,g=0;l(m)&&(p=m.minimumHeight,g=m.maximumHeight),d=(p+g)*.5}return zge(e,t,n,i,d,c),c}var Gat={minimumHeight:0,maximumHeight:0},Eat=new h,kge=new XD,Uge=new XD,Dge=new XD,Bge=new XD,Xat=typeof Uint8Array<"u"?new Uint8Array(9*9):void 0,Iat={tilingScheme:void 0,x:0,y:0,level:0,exaggeration:1,exaggerationRelativeHeight:0};function Hge(e,t,n,i){qu.initialize(n,e.terrainProvider,e._imageryLayers);let o=n.data,r=o.fill,s=n.rectangle,a=t.verticalExaggeration,c=t.verticalExaggerationRelativeHeight,d=a!==1,u=n.tilingScheme.ellipsoid,m=RD(r,u,0,1,r.northwestTile,r.northwestMesh,r.northTiles,r.northMeshes,r.westTiles,r.westMeshes,Dge),p=RD(r,u,0,0,r.southwestTile,r.southwestMesh,r.westTiles,r.westMeshes,r.southTiles,r.southMeshes,kge),g=RD(r,u,1,0,r.southeastTile,r.southeastMesh,r.southTiles,r.southMeshes,r.eastTiles,r.eastMeshes,Uge),f=RD(r,u,1,1,r.northeastTile,r.northeastMesh,r.eastTiles,r.eastMeshes,r.northTiles,r.northMeshes,Bge);m=VD(r,u,0,1,m,p,f,g,Dge),p=VD(r,u,0,0,p,m,g,f,kge),g=VD(r,u,1,1,g,p,f,m,Uge),f=VD(r,u,1,1,f,g,m,p,Bge);let x=p.height,_=g.height,C=m.height,V=f.height,L=Math.min(x,_,C,V),Z=Math.max(x,_,C,V),G=(L+Z)*.5,X,v,P=e.getLevelMaximumGeometricError(n.level),F=u.maximumRadius-P,A=Math.acos(F/u.maximumRadius)*4;if(A*=1.5,s.width>A&&Z-L<=P){let E=new Ta({width:9,height:9,buffer:Xat,structure:{heightOffset:Z}}),I=Iat;I.tilingScheme=n.tilingScheme,I.x=n.x,I.y=n.y,I.level=n.level,I.exaggeration=a,I.exaggerationRelativeHeight=c,r.mesh=E._createMeshSync(I)}else{let E=d,I=ce.center(s,Zat);I.height=G;let w=u.cartographicToCartesian(I,Eat),N=new Qa(w,void 0,void 0,void 0,void 0,!0,!0,E,a,c),B=5,U;for(U=r.westMeshes,X=0,v=U.length;X<v;++X)B+=U[X].eastIndicesNorthToSouth.length;for(U=r.southMeshes,X=0,v=U.length;X<v;++X)B+=U[X].northIndicesWestToEast.length;for(U=r.eastMeshes,X=0,v=U.length;X<v;++X)B+=U[X].westIndicesSouthToNorth.length;for(U=r.northMeshes,X=0,v=U.length;X<v;++X)B+=U[X].southIndicesEastToWest.length;let O=Gat;O.minimumHeight=L,O.maximumHeight=Z;let k=N.stride,J=new Float32Array(B*k),H=0,ee=H;H=LD(u,s,N,J,H,0,1,m.height,m.encodedNormal,1,O),H=GD(r,u,N,J,H,r.westTiles,r.westMeshes,gn.EAST,O);let z=H;H=LD(u,s,N,J,H,0,0,p.height,p.encodedNormal,0,O),H=GD(r,u,N,J,H,r.southTiles,r.southMeshes,gn.NORTH,O);let j=H;H=LD(u,s,N,J,H,1,0,g.height,g.encodedNormal,0,O),H=GD(r,u,N,J,H,r.eastTiles,r.eastMeshes,gn.WEST,O);let q=H;H=LD(u,s,N,J,H,1,1,f.height,f.encodedNormal,1,O),H=GD(r,u,N,J,H,r.northTiles,r.northMeshes,gn.SOUTH,O),L=O.minimumHeight,Z=O.maximumHeight;let be=Gn.fromRectangle(s,L,Z,n.tilingScheme.ellipsoid),Te=Ci.geodeticLatitudeToMercatorAngle(s.south),ae=1/(Ci.geodeticLatitudeToMercatorAngle(s.north)-Te),ye=(Ci.geodeticLatitudeToMercatorAngle(I.latitude)-Te)*ae,Se=u.geodeticSurfaceNormalCartographic(IT,Pj),Le=wn.octEncode(Se,Xj),Xe=H;N.encode(J,H*k,be.center,D.fromElements(.5,.5,zd),G,Le,ye,Se),++H;let Pe=H,ke=Pe<256?1:2,Pt=(Pe-1)*3,Ot=Pt*ke,ht=(J.length-Pe*k)*Float32Array.BYTES_PER_ELEMENT,Ae;if(ht>=Ot){let Ve=Pe*k*Float32Array.BYTES_PER_ELEMENT;Ae=Pe<256?new Uint8Array(J.buffer,Ve,Pt):new Uint16Array(J.buffer,Ve,Pt)}else Ae=Pe<256?new Uint8Array(Pt):new Uint16Array(Pt);J=new Float32Array(J.buffer,0,Pe*k);let $e=0;for(X=0;X<Pe-2;++X)Ae[$e++]=Xe,Ae[$e++]=X,Ae[$e++]=X+1;Ae[$e++]=Xe,Ae[$e++]=X,Ae[$e++]=0;let Qe=[];for(X=z;X>=ee;--X)Qe.push(X);let je=[];for(X=j;X>=z;--X)je.push(X);let kt=[];for(X=q;X>=j;--X)kt.push(X);let pe=[];for(pe.push(0),X=Xe-1;X>=q;--X)pe.push(X);r.mesh=new ru(N.center,J,Ae,Pt,Pe,L,Z,le.fromOrientedBoundingBox(be),Mat(e,be.center,s,L,Z),N.stride,be,N,Qe,je,kt,pe)}let b=t.context;r._destroyVertexArray(i),r.vertexArray=qu._createVertexArrayForMesh(b,r.mesh),o.processImagery(n,e.terrainProvider,t,!0);let R=r.waterMaskTexture;if(r.waterMaskTexture=void 0,e.terrainProvider.hasWaterMask){let E=o._findAncestorTileWithTerrainData(n);l(E)&&l(E.data.waterMaskTexture)&&(r.waterMaskTexture=E.data.waterMaskTexture,++r.waterMaskTexture.referenceCount,o._computeWaterMaskTranslationAndScale(n,E,r.waterMaskTranslationAndScale))}l(R)&&(--R.referenceCount,R.referenceCount===0&&R.destroy())}function LD(e,t,n,i,o,r,s,a,c,d,u){let m=IT;m.longitude=W.lerp(t.west,t.east,r),m.latitude=W.lerp(t.south,t.north,s),m.height=a;let p=e.cartographicToCartesian(m,KV),g;n.hasGeodeticSurfaceNormals&&(g=e.geodeticSurfaceNormal(p,Pj));let f=Ij;return f.x=r,f.y=s,n.encode(i,o*n.stride,p,f,a,c,d,g),u.minimumHeight=Math.min(u.minimumHeight,a),u.maximumHeight=Math.max(u.maximumHeight,a),o+1}var ED=new ce;function Yw(e,t,n,i){let o=e.rectangle,r=t.rectangle;t.x===0&&n.x===1&&e.x===e.tilingScheme.getNumberOfXTilesAtLevel(e.level)-1?(o=ce.clone(e.rectangle,ED),o.west-=W.TWO_PI,o.east-=W.TWO_PI):e.x===0&&n.x===0&&t.x===t.tilingScheme.getNumberOfXTilesAtLevel(t.level)-1&&(o=ce.clone(e.rectangle,ED),o.west+=W.TWO_PI,o.east+=W.TWO_PI);let s=o.east-o.west,a=(r.west-o.west)/s,c=(r.east-o.west)/s,d=o.north-o.south,u=(r.south-o.south)/d,m=(r.north-o.south)/d,p=(n.x-a)/(c-a),g=(n.y-u)/(m-u);return Math.abs(p)<Math.EPSILON5?p=0:Math.abs(p-1)<Math.EPSILON5&&(p=1),Math.abs(g)<Math.EPSILON5?g=0:Math.abs(g-1)<Math.EPSILON5&&(g=1),i.x=p,i.y=g,i}var Wat=new D;function Wj(e,t,n,i,o){let r=e.encoding,s=e.vertices;if(o.height=r.decodeHeight(s,t),r.hasVertexNormals)r.getOctEncodedNormal(s,t,o.encodedNormal);else{let a=o.encodedNormal;a.x=0,a.y=0}}var Pat=new D,vat=new h;function wat(e,t,n,i,o,r,s,a,c,d){let u=i.encoding,m=i.vertices,p=Yw(t,n,u.decodeTextureCoordinates(m,o,zd),zd),g=Yw(t,n,u.decodeTextureCoordinates(m,r,Ij),Ij),f;c?f=(s-p.x)/(g.x-p.x):f=(a-p.y)/(g.y-p.y);let x=u.decodeHeight(m,o),_=u.decodeHeight(m,r),C=n.rectangle;IT.longitude=W.lerp(C.west,C.east,s),IT.latitude=W.lerp(C.south,C.north,a),d.height=IT.height=W.lerp(x,_,f);let V;if(u.hasVertexNormals){let L=u.getOctEncodedNormal(m,o,Wat),Z=u.getOctEncodedNormal(m,r,Pat),G=wn.octDecode(L.x,L.y,KV),X=wn.octDecode(Z.x,Z.y,vat);V=h.lerp(G,X,f,KV),h.normalize(V,V),wn.octEncode(V,d.encodedNormal)}else V=e.geodeticSurfaceNormalCartographic(IT,KV),wn.octEncode(V,d.encodedNormal)}function zge(e,t,n,i,o,r){r.height=o;let s=t.geodeticSurfaceNormalCartographic(IT,KV);wn.octEncode(s,r.encodedNormal)}function RD(e,t,n,i,o,r,s,a,c,d,u){if(Oge(e,t,a,s,!1,n,i,u)||Oge(e,t,d,c,!0,n,i,u))return u;let p;if(vj(o,r))return n===0?i===0?p=r.eastIndicesNorthToSouth[0]:p=r.southIndicesEastToWest[0]:i===0?p=r.northIndicesWestToEast[0]:p=r.westIndicesSouthToNorth[0],Wj(r,p,n,i,u),u;let g;if(n===0?i===0?g=ZD(e.westMeshes,e.westTiles,gn.EAST,e.southMeshes,e.southTiles,gn.NORTH,n,i):g=ZD(e.northMeshes,e.northTiles,gn.SOUTH,e.westMeshes,e.westTiles,gn.EAST,n,i):i===0?g=ZD(e.southMeshes,e.southTiles,gn.NORTH,e.eastMeshes,e.eastTiles,gn.WEST,n,i):g=ZD(e.eastMeshes,e.eastTiles,gn.WEST,e.northMeshes,e.northTiles,gn.SOUTH,n,i),l(g))return zge(e,t,n,i,g,u),u}function ZD(e,t,n,i,o,r,s,a){let c=Yge(e,t,!1,n,s,a),d=Yge(i,o,!0,r,s,a);return l(c)&&l(d)?(c+d)*.5:l(c)?c:d}function GD(e,t,n,i,o,r,s,a,c){for(let d=0;d<r.length;++d)o=Fat(e,t,n,i,o,r[d],s[d],a,c);return o}function Fat(e,t,n,i,o,r,s,a,c){let d=r.rectangle;a===gn.EAST&&e.tile.x===0?(d=ce.clone(r.rectangle,ED),d.west-=W.TWO_PI,d.east-=W.TWO_PI):a===gn.WEST&&r.x===0&&(d=ce.clone(r.rectangle,ED),d.west+=W.TWO_PI,d.east+=W.TWO_PI);let u=e.tile.rectangle,m,p;o>0&&(n.decodeTextureCoordinates(i,o-1,zd),m=zd.x,p=zd.y);let g,f;switch(a){case gn.WEST:g=s.westIndicesSouthToNorth,f=!1;break;case gn.NORTH:g=s.northIndicesWestToEast,f=!0;break;case gn.EAST:g=s.eastIndicesNorthToSouth,f=!1;break;case gn.SOUTH:g=s.southIndicesEastToWest,f=!0;break}let x=r,_=e.tile,C=s.encoding,V=s.vertices,L=n.stride,Z,G;C.hasWebMercatorT&&(Z=Ci.geodeticLatitudeToMercatorAngle(u.south),G=1/(Ci.geodeticLatitudeToMercatorAngle(u.north)-Z));for(let X=0;X<g.length;++X){let v=g[X],P=C.decodeTextureCoordinates(V,v,zd);Yw(x,_,P,P);let F=P.x,A=P.y,b=f?F:A;if(b<0||b>1||Math.abs(F-m)<W.EPSILON5&&Math.abs(A-p)<W.EPSILON5)continue;let R=Math.abs(F)<W.EPSILON5||Math.abs(F-1)<W.EPSILON5,E=Math.abs(A)<W.EPSILON5||Math.abs(A-1)<W.EPSILON5;if(R&&E)continue;let I=C.decodePosition(V,v,KV),w=C.decodeHeight(V,v),N;C.hasVertexNormals?N=C.getOctEncodedNormal(V,v,Xj):(N=Xj,N.x=0,N.y=0);let B=A;if(C.hasWebMercatorT){let O=W.lerp(u.south,u.north,A);B=(Ci.geodeticLatitudeToMercatorAngle(O)-Z)*G}let U;n.hasGeodeticSurfaceNormals&&(U=t.geodeticSurfaceNormal(I,Pj)),n.encode(i,o*L,I,P,w,N,B,U),c.minimumHeight=Math.min(c.minimumHeight,w),c.maximumHeight=Math.max(c.maximumHeight,w),++o}return o}function Yge(e,t,n,i,o,r){let s,a,c;n?(s=0,a=e.length,c=1):(s=e.length-1,a=-1,c=-1);for(let d=s;d!==a;d+=c){let u=e[d],m=t[d];if(!vj(m,u))continue;let p;switch(i){case gn.WEST:p=u.westIndicesSouthToNorth;break;case gn.SOUTH:p=u.southIndicesEastToWest;break;case gn.EAST:p=u.eastIndicesNorthToSouth;break;case gn.NORTH:p=u.northIndicesWestToEast;break}let g=p[n?0:p.length-1];if(l(g))return u.encoding.decodeHeight(u.vertices,g)}}function vj(e,t){return l(t)&&(!l(e.data.fill)||!e.data.fill.changedThisFrame)}function Oge(e,t,n,i,o,r,s,a){let c,d,u,m,p,g=i[o?0:n.length-1],f=n[o?0:n.length-1];if(vj(g,f)&&(r===0?s===0?(c=o?f.northIndicesWestToEast:f.eastIndicesNorthToSouth,d=o,u=o):(c=o?f.eastIndicesNorthToSouth:f.southIndicesEastToWest,d=!o,u=!1):s===0?(c=o?f.westIndicesSouthToNorth:f.northIndicesWestToEast,d=!o,u=!0):(c=o?f.southIndicesEastToWest:f.westIndicesSouthToNorth,d=o,u=!o),c.length>0)){m=o?0:c.length-1,p=c[m],f.encoding.decodeTextureCoordinates(f.vertices,p,zd);let x=Yw(g,e.tile,zd,zd);if(x.x===r&&x.y===s)return Wj(f,p,r,s,a),!0;if(m=Ro(c,d?r:s,function(_,C){f.encoding.decodeTextureCoordinates(f.vertices,_,zd);let V=Yw(g,e.tile,zd,zd);return u?d?V.x-r:V.y-s:d?r-V.x:s-V.y}),m<0){if(m=~m,m>0&&m<c.length)return wat(t,g,e.tile,f,c[m-1],c[m],r,s,d,a),!0}else return Wj(f,c[m],r,s,a),!0}return!1}var Aat=[new h,new h,new h,new h];function Mat(e,t,n,i,o,r){let s=e.quadtree._occluders.ellipsoid,a=s.ellipsoid,c=Aat;return h.fromRadians(n.west,n.south,o,a,c[0]),h.fromRadians(n.east,n.south,o,a,c[1]),h.fromRadians(n.west,n.north,o,a,c[2]),h.fromRadians(n.east,n.north,o,a,c[3]),s.computeHorizonCullingPointPossiblyUnderEllipsoid(t,c,i,r)}var QV=JV;function $o(e){this.lightingFadeOutDistance=65e5,this.lightingFadeInDistance=9e6,this.hasWaterMask=!1,this.oceanNormalMap=void 0,this.zoomedOutOceanSpecularIntensity=.5,this.enableLighting=!1,this.dynamicAtmosphereLighting=!1,this.dynamicAtmosphereLightingFromSun=!1,this.showGroundAtmosphere=!1,this.shadows=_n.RECEIVE_ONLY,this.vertexShadowDarkness=.3,this.fillHighlightColor=void 0,this.hueShift=0,this.saturationShift=0,this.brightnessShift=0,this.showSkirts=!0,this.backFaceCulling=!0,this.undergroundColor=void 0,this.undergroundColorAlphaByDistance=void 0,this.lambertDiffuseMultiplier=0,this.materialUniformMap=void 0,this._materialUniformMap=void 0,this._quadtree=void 0,this._terrainProvider=e.terrainProvider,this._imageryLayers=e.imageryLayers,this._surfaceShaderSet=e.surfaceShaderSet,this._renderState=void 0,this._blendRenderState=void 0,this._disableCullingRenderState=void 0,this._disableCullingBlendRenderState=void 0,this._errorEvent=new ge,this._removeLayerAddedListener=this._imageryLayers.layerAdded.addEventListener($o.prototype._onLayerAdded,this),this._removeLayerRemovedListener=this._imageryLayers.layerRemoved.addEventListener($o.prototype._onLayerRemoved,this),this._removeLayerMovedListener=this._imageryLayers.layerMoved.addEventListener($o.prototype._onLayerMoved,this),this._removeLayerShownListener=this._imageryLayers.layerShownOrHidden.addEventListener($o.prototype._onLayerShownOrHidden,this),this._imageryLayersUpdatedEvent=new ge,this._layerOrderChanged=!1,this._tilesToRenderByTextureCount=[],this._drawCommands=[],this._uniformMaps=[],this._usedDrawCommands=0,this._vertexArraysToDestroy=[],this._debug={wireframe:!1,boundingSphereTile:void 0},this._baseColor=void 0,this._firstPassInitialColor=void 0,this.baseColor=new Y(0,0,.5,1),this._clippingPlanes=void 0,this._clippingPolygons=void 0,this.cartographicLimitRectangle=ce.clone(ce.MAX_VALUE),this._hasLoadedTilesThisFrame=!1,this._hasFillTilesThisFrame=!1,this._oldVerticalExaggeration=void 0,this._oldVerticalExaggerationRelativeHeight=void 0}Object.defineProperties($o.prototype,{baseColor:{get:function(){return this._baseColor},set:function(e){this._baseColor=e,this._firstPassInitialColor=se.fromColor(e,this._firstPassInitialColor)}},quadtree:{get:function(){return this._quadtree},set:function(e){this._quadtree=e}},tilingScheme:{get:function(){if(l(this._terrainProvider))return this._terrainProvider.tilingScheme}},errorEvent:{get:function(){return this._errorEvent}},imageryLayersUpdatedEvent:{get:function(){return this._imageryLayersUpdatedEvent}},terrainProvider:{get:function(){return this._terrainProvider},set:function(e){this._terrainProvider!==e&&(this._terrainProvider=e,l(this._quadtree)&&this._quadtree.invalidateAllTiles())}},clippingPlanes:{get:function(){return this._clippingPlanes},set:function(e){ss.setOwner(e,this,"_clippingPlanes")}},clippingPolygons:{get:function(){return this._clippingPolygons},set:function(e){Ym.setOwner(e,this,"_clippingPolygons")}}});function Nat(e,t){let n=e.loadingImagery;l(n)||(n=e.readyImagery);let i=t.loadingImagery;return l(i)||(i=t.readyImagery),n.imageryLayer._layerIndex-i.imageryLayer._layerIndex}$o.prototype.update=function(e){this._imageryLayers._update()};function kat(e,t){let n=t.creditDisplay,i=e._terrainProvider;l(i)&&l(i.credit)&&n.addCreditToNextFrame(i.credit);let o=e._imageryLayers;for(let r=0,s=o.length;r<s;++r){let a=o.get(r);a.ready&&a.show&&l(a.imageryProvider.credit)&&n.addCreditToNextFrame(a.imageryProvider.credit)}}$o.prototype.initialize=function(e){this._imageryLayers.queueReprojectionCommands(e),this._layerOrderChanged&&(this._layerOrderChanged=!1,this._quadtree.forEachLoadedTile(function(i){i.data.imagery.sort(Nat)})),kat(this,e);let t=this._vertexArraysToDestroy,n=t.length;for(let i=0;i<n;++i)qu._freeVertexArray(t[i]);t.length=0};$o.prototype.beginUpdate=function(e){let t=this._tilesToRenderByTextureCount;for(let o=0,r=t.length;o<r;++o){let s=t[o];l(s)&&(s.length=0)}let n=this._clippingPlanes;l(n)&&n.enabled&&n.update(e);let i=this._clippingPolygons;l(i)&&i.enabled&&(i.update(e),i.queueCommands(e)),this._usedDrawCommands=0,this._hasLoadedTilesThisFrame=!1,this._hasFillTilesThisFrame=!1};$o.prototype.endUpdate=function(e){if(!l(this._renderState)){this._renderState=De.fromCache({cull:{enabled:!0},depthTest:{enabled:!0,func:cc.LESS}}),this._blendRenderState=De.fromCache({cull:{enabled:!0},depthTest:{enabled:!0,func:cc.LESS_OR_EQUAL},blending:un.ALPHA_BLEND});let s=Oe(this._renderState,!0);s.cull.enabled=!1,this._disableCullingRenderState=De.fromCache(s),s=Oe(this._blendRenderState,!0),s.cull.enabled=!1,this._disableCullingBlendRenderState=De.fromCache(s)}this._hasFillTilesThisFrame&&this._hasLoadedTilesThisFrame&&QV.updateFillTiles(this,this._quadtree._tilesToRender,e,this._vertexArraysToDestroy);let t=this.quadtree,n=e.verticalExaggeration,i=e.verticalExaggerationRelativeHeight,o=this._oldVerticalExaggeration!==n||this._oldVerticalExaggerationRelativeHeight!==i;this._oldVerticalExaggeration=n,this._oldVerticalExaggerationRelativeHeight=i,o&&t.forEachLoadedTile(function(s){s.data.updateExaggeration(s,e,t)});let r=this._tilesToRenderByTextureCount;for(let s=0,a=r.length;s<a;++s){let c=r[s];if(l(c))for(let d=0,u=c.length;d<u;++d){let m=c[d],p=m.data.tileBoundingRegion;dct(this,m,e),e.minimumTerrainHeight=Math.min(e.minimumTerrainHeight,p.minimumHeight)}}};function qge(e,t){let n=t.globeTranslucencyState;if(n.translucent){let i=e.renderState.blending.enabled;n.pushDerivedCommands(e,i,t)}else t.commandList.push(e)}$o.prototype.updateForPick=function(e){let t=this._drawCommands;for(let n=0,i=this._usedDrawCommands;n<i;++n)qge(t[n],e)};$o.prototype.cancelReprojections=function(){this._imageryLayers.cancelReprojections()};$o.prototype.getLevelMaximumGeometricError=function(e){return l(this._terrainProvider)?this._terrainProvider.getLevelMaximumGeometricError(e):0};$o.prototype.loadTile=function(e,t){let n=t.data,i=!0,o;l(n)&&(i=n.boundingVolumeSourceTile!==t||t._lastSelectionResult===Kn.CULLED_BUT_NEEDED,o=n.terrainState),qu.processStateMachine(t,e,this.terrainProvider,this._imageryLayers,this.quadtree,this._vertexArraysToDestroy,i),n=t.data,i&&o!==t.data.terrainState&&this.computeTileVisibility(t,e,this.quadtree.occluders)!==ir.NONE&&n.boundingVolumeSourceTile===t&&(i=!1,qu.processStateMachine(t,e,this.terrainProvider,this._imageryLayers,this.quadtree,this._vertexArraysToDestroy,i))};var Uat=new le,$ge=new ce,Dat=new ce,Bat=new he;function WD(e,t){if(t.west<t.east)return t;let n=ce.clone(t,Dat);return ce.center(e,Bat).longitude>0?n.east=W.PI:n.west=-W.PI,n}function eye(e,t){if(t.cameraUnderground||t.globeTranslucencyState.translucent)return!0;if(e.backFaceCulling)return!1;let n=e._clippingPlanes;if(l(n)&&n.enabled)return!0;let i=e._clippingPolygons;return!!(l(i)&&i.enabled||!ce.equals(e.cartographicLimitRectangle,ce.MAX_VALUE))}$o.prototype.computeTileVisibility=function(e,t,n){let i=this.computeDistanceToTile(e,t);e._distance=i;let o=eye(this,t);if(t.fog.enabled&&!o&&W.fog(i,t.fog.density)>=1)return ir.NONE;let r=e.data,s=r.tileBoundingRegion;if(r.boundingVolumeSourceTile===void 0)return ir.PARTIAL;let a=t.cullingVolume,c=s.boundingVolume;l(c)||(c=s.boundingSphere),r.clippedByBoundaries=!1;let d=WD(e.rectangle,this.cartographicLimitRectangle),u=ce.simpleIntersection(d,e.rectangle,$ge);if(!l(u))return ir.NONE;if(ce.equals(u,e.rectangle)||(r.clippedByBoundaries=!0),t.mode!==oe.SCENE3D&&(c=Uat,le.fromRectangleWithHeights2D(e.rectangle,t.mapProjection,s.minimumHeight,s.maximumHeight,c),h.fromElements(c.center.z,c.center.x,c.center.y,c.center),t.mode===oe.MORPHING&&l(r.renderedMesh)&&(c=le.union(s.boundingSphere,c,c))),!l(c))return ir.PARTIAL;let m=this._clippingPlanes;if(l(m)&&m.enabled){let _=m.computeIntersectionWithBoundingVolume(c);if(e.isClipped=_!==Kt.INSIDE,_===Kt.OUTSIDE)return ir.NONE}let p=this._clippingPolygons;if(l(p)&&p.enabled){let _=p.computeIntersectionWithBoundingVolume(s);e.isClipped=_!==Kt.OUTSIDE}let g,f=a.computeVisibility(c);if(f===Kt.OUTSIDE?g=ir.NONE:f===Kt.INTERSECTING?g=ir.PARTIAL:f===Kt.INSIDE&&(g=ir.FULL),g===ir.NONE)return g;let x=t.mode===oe.SCENE3D&&t.camera.frustum instanceof on;if(t.mode===oe.SCENE3D&&!x&&l(n)&&!o){let _=r.occludeePointInScaledSpace;return!l(_)||n.ellipsoid.isScaledSpacePointVisiblePossiblyUnderEllipsoid(_,s.minimumHeight)?g:ir.NONE}return g};$o.prototype.canRefine=function(e){return l(e.data.terrainData)?!0:this.terrainProvider.getTileDataAvailable(e.x*2,e.y*2,e.level+1)!==void 0};var Yat=[],Oat=[];$o.prototype.canRenderWithoutLosingDetail=function(e,t){let n=e.data,i=Yat;i.length=this._imageryLayers.length;let o=!1,r=!1,s;l(n)&&(o=n.terrainState===so.READY,r=!0,s=n.imagery);let a,c;for(a=0,c=i.length;a<c;++a)i[a]=r;if(l(s))for(a=0,c=s.length;a<c;++a){let m=s[a],p=m.loadingImagery,g=!l(p)||p.state===ai.FAILED||p.state===ai.INVALID,f=(m.loadingImagery||m.readyImagery).imageryLayer._layerIndex;i[f]=g&&i[f]}let d=this.quadtree._lastSelectionFrameNumber,u=Oat;for(u.length=0,u.push(e.southwestChild,e.southeastChild,e.northwestChild,e.northeastChild);u.length>0;){let m=u.pop(),p=m._lastSelectionResultFrame===d?m._lastSelectionResult:Kn.NONE;if(p===Kn.RENDERED){let g=m.data;if(!l(g))continue;if(!o&&m.data.terrainState===so.READY)return!1;let f=m.data.imagery;for(a=0,c=f.length;a<c;++a){let x=f[a],_=x.loadingImagery,C=!l(_)||_.state===ai.FAILED||_.state===ai.INVALID,V=(x.loadingImagery||x.readyImagery).imageryLayer._layerIndex;if(C&&!i[V])return!1}}else p===Kn.REFINED&&u.push(m.southwestChild,m.southeastChild,m.northwestChild,m.northeastChild)}return!0};var Hat=new h;$o.prototype.computeTileLoadPriority=function(e,t){let n=e.data;if(n===void 0)return 0;let i=n.tileBoundingRegion.boundingVolume;if(i===void 0)return 0;let o=t.camera.positionWC,r=t.camera.directionWC,s=h.subtract(i.center,o,Hat),a=h.magnitude(s);return a<W.EPSILON5?0:(h.divideByScalar(s,a,s),(1-h.dot(s,r))*e._distance)};var Kge=new M,ID=new M,zat=new se,Kat=new se,Jat=new se,Qat=new h,Jge=new h,jat=new h,qat=new h;$o.prototype.showTileThisFrame=function(e,t){let n=0,i=e.data.imagery;for(let a=0,c=i.length;a<c;++a){let d=i[a];l(d.readyImagery)&&d.readyImagery.imageryLayer.alpha!==0&&++n}let o=this._tilesToRenderByTextureCount[n];l(o)||(o=[],this._tilesToRenderByTextureCount[n]=o),o.push(e);let r=e.data;l(r.vertexArray)?this._hasLoadedTilesThisFrame=!0:this._hasFillTilesThisFrame=!0;let s=this._debug;++s.tilesRendered,s.texturesRendered+=n};var $at=[new h,new h,new h,new h];function Qge(e,t,n,i,o,r){let s=e.quadtree._occluders.ellipsoid,a=s.ellipsoid,c=$at;return h.fromRadians(n.west,n.south,o,a,c[0]),h.fromRadians(n.east,n.south,o,a,c[1]),h.fromRadians(n.west,n.north,o,a,c[2]),h.fromRadians(n.east,n.north,o,a,c[3]),s.computeHorizonCullingPointPossiblyUnderEllipsoid(t,c,i,r)}$o.prototype.computeDistanceToTile=function(e,t){ect(e,this,t);let n=e.data;if(n.boundingVolumeSourceTile===void 0)return 9999999999;let o=n.tileBoundingRegion,r=o.minimumHeight,s=o.maximumHeight;if(n.boundingVolumeSourceTile!==e){let c=t.camera.positionCartographic.height,d=Math.abs(c-r),u=Math.abs(c-s);d>u?(o.minimumHeight=r,o.maximumHeight=r):(o.minimumHeight=s,o.maximumHeight=s)}let a=o.distanceToCamera(t);return o.minimumHeight=r,o.maximumHeight=s,a};function ect(e,t,n){let i=e.data;i===void 0&&(i=e.data=new qu);let o=e.tilingScheme.ellipsoid;i.tileBoundingRegion===void 0&&(i.tileBoundingRegion=new ku({computeBoundingVolumes:!1,rectangle:e.rectangle,ellipsoid:o,minimumHeight:0,maximumHeight:0}));let r=i.tileBoundingRegion,s=r.minimumHeight,a=r.maximumHeight,c=!1,d=e,u=i.mesh,m=i.terrainData;if(u!==void 0&&u.minimumHeight!==void 0&&u.maximumHeight!==void 0)r.minimumHeight=u.minimumHeight,r.maximumHeight=u.maximumHeight,c=!0;else if(m!==void 0&&m._minimumHeight!==void 0&&m._maximumHeight!==void 0)r.minimumHeight=m._minimumHeight,r.maximumHeight=m._maximumHeight;else{r.minimumHeight=Number.NaN,r.maximumHeight=Number.NaN;let p=e.parent;for(;p!==void 0;){let g=p.data;if(g!==void 0){let f=g.mesh,x=g.terrainData;if(f!==void 0&&f.minimumHeight!==void 0&&f.maximumHeight!==void 0){r.minimumHeight=f.minimumHeight,r.maximumHeight=f.maximumHeight;break}else if(x!==void 0&&x._minimumHeight!==void 0&&x._maximumHeight!==void 0){r.minimumHeight=x._minimumHeight,r.maximumHeight=x._maximumHeight;break}}p=p.parent}d=p}if(d!==void 0){let p=n.verticalExaggeration,g=n.verticalExaggerationRelativeHeight;if(p!==1&&(c=!1,r.minimumHeight=mr.getHeight(r.minimumHeight,p,g),r.maximumHeight=mr.getHeight(r.maximumHeight,p,g)),c)i.boundingVolumeIsFromMesh||(r._orientedBoundingBox=Gn.clone(u.orientedBoundingBox,r._orientedBoundingBox),r._boundingSphere=le.clone(u.boundingSphere3D,r._boundingSphere),i.occludeePointInScaledSpace=h.clone(u.occludeePointInScaledSpace,i.occludeePointInScaledSpace),l(i.occludeePointInScaledSpace)||(i.occludeePointInScaledSpace=Qge(t,r._orientedBoundingBox.center,e.rectangle,r.minimumHeight,r.maximumHeight,i.occludeePointInScaledSpace)));else{let x=r._orientedBoundingBox===void 0||r._boundingSphere===void 0;(r.minimumHeight!==s||r.maximumHeight!==a||x)&&(r.computeBoundingVolumes(o),i.occludeePointInScaledSpace=Qge(t,r._orientedBoundingBox.center,e.rectangle,r.minimumHeight,r.maximumHeight,i.occludeePointInScaledSpace))}i.boundingVolumeSourceTile=d,i.boundingVolumeIsFromMesh=c}else i.boundingVolumeSourceTile=void 0,i.boundingVolumeIsFromMesh=!1}$o.prototype.isDestroyed=function(){return!1};$o.prototype.destroy=function(){return this._tileProvider=this._tileProvider&&this._tileProvider.destroy(),this._clippingPlanes=this._clippingPlanes&&this._clippingPlanes.destroy(),this._clippingPolygons=this._clippingPolygons&&this._clippingPolygons.destroy(),this._removeLayerAddedListener=this._removeLayerAddedListener&&this._removeLayerAddedListener(),this._removeLayerRemovedListener=this._removeLayerRemovedListener&&this._removeLayerRemovedListener(),this._removeLayerMovedListener=this._removeLayerMovedListener&&this._removeLayerMovedListener(),this._removeLayerShownListener=this._removeLayerShownListener&&this._removeLayerShownListener(),me(this)};function tct(e,t,n){return function(i){let o,r,s=-1,a=i.data.imagery,c=a.length,d;for(d=0;d<c;++d)if(o=a[d],r=y(o.readyImagery,o.loadingImagery),r.imageryLayer===t){s=d;break}if(s!==-1){let u=s+e;if(o=a[u],r=l(o)?y(o.readyImagery,o.loadingImagery):void 0,!l(r)||r.imageryLayer!==t)return!t._createTileImagerySkeletons(i,n,u);for(d=s;d<u;++d)a[d].freeResources();a.splice(s,e)}return!0}}$o.prototype._onLayerAdded=function(e,t){if(!this.isDestroyed()&&e.show){let n=this._terrainProvider,i=this,o=this._imageryLayersUpdatedEvent,r=function(){e._imageryCache={},i._quadtree.forEachLoadedTile(function(s){if(l(s._loadedCallbacks[e._layerIndex]))return;let a,c=s.data.imagery,d=c.length,u=-1,m=0;for(a=0;a<d;++a){let g=c[a];if(y(g.readyImagery,g.loadingImagery).imageryLayer===e)u===-1&&(u=a),++m;else if(u!==-1)break}if(u===-1)return;let p=u+m;e._createTileImagerySkeletons(s,n,p)&&(s._loadedCallbacks[e._layerIndex]=tct(m,e,n),s.state=Os.LOADING)})};if(e.ready){let s=e.imageryProvider;s._reload=r}this._quadtree.forEachLoadedTile(function(s){e._createTileImagerySkeletons(s,n)&&(s.state=Os.LOADING,s.level!==0&&(s._lastSelectionResultFrame!==i.quadtree._lastSelectionFrameNumber||s._lastSelectionResult!==Kn.RENDERED)&&(s.renderable=!1))}),this._layerOrderChanged=!0,o.raiseEvent()}};$o.prototype._onLayerRemoved=function(e,t){this._quadtree.forEachLoadedTile(function(n){let i=n.data.imagery,o=-1,r=0;for(let s=0,a=i.length;s<a;++s){let c=i[s],d=c.loadingImagery;if(l(d)||(d=c.readyImagery),d.imageryLayer===e)o===-1&&(o=s),c.freeResources(),++r;else if(o!==-1)break}o!==-1&&i.splice(o,r)}),l(e.imageryProvider)&&(e.imageryProvider._reload=void 0),this._imageryLayersUpdatedEvent.raiseEvent()};$o.prototype._onLayerMoved=function(e,t,n){this._layerOrderChanged=!0,this._imageryLayersUpdatedEvent.raiseEvent()};$o.prototype._onLayerShownOrHidden=function(e,t,n){n?this._onLayerAdded(e,t):this._onLayerRemoved(e,t)};var nct=new M,ict=new M;function jge(e,t){let n={u_initialColor:function(){return this.properties.initialColor},u_fillHighlightColor:function(){return this.properties.fillHighlightColor},u_zoomedOutOceanSpecularIntensity:function(){return this.properties.zoomedOutOceanSpecularIntensity},u_oceanNormalMap:function(){return this.properties.oceanNormalMap},u_atmosphereLightIntensity:function(){return this.properties.atmosphereLightIntensity},u_atmosphereRayleighCoefficient:function(){return this.properties.atmosphereRayleighCoefficient},u_atmosphereMieCoefficient:function(){return this.properties.atmosphereMieCoefficient},u_atmosphereRayleighScaleHeight:function(){return this.properties.atmosphereRayleighScaleHeight},u_atmosphereMieScaleHeight:function(){return this.properties.atmosphereMieScaleHeight},u_atmosphereMieAnisotropy:function(){return this.properties.atmosphereMieAnisotropy},u_lightingFadeDistance:function(){return this.properties.lightingFadeDistance},u_nightFadeDistance:function(){return this.properties.nightFadeDistance},u_center3D:function(){return this.properties.center3D},u_verticalExaggerationAndRelativeHeight:function(){return this.properties.verticalExaggerationAndRelativeHeight},u_tileRectangle:function(){return this.properties.tileRectangle},u_modifiedModelView:function(){let i=e.context.uniformState.view,o=M.multiplyByPoint(i,this.properties.rtc,Jge);return M.setTranslation(i,o,Kge),Kge},u_modifiedModelViewProjection:function(){let i=e.context.uniformState.view,o=e.context.uniformState.projection,r=M.multiplyByPoint(i,this.properties.rtc,Jge);return M.setTranslation(i,r,ID),M.multiply(o,ID,ID),ID},u_dayTextures:function(){return this.properties.dayTextures},u_dayTextureTranslationAndScale:function(){return this.properties.dayTextureTranslationAndScale},u_dayTextureTexCoordsRectangle:function(){return this.properties.dayTextureTexCoordsRectangle},u_dayTextureUseWebMercatorT:function(){return this.properties.dayTextureUseWebMercatorT},u_dayTextureAlpha:function(){return this.properties.dayTextureAlpha},u_dayTextureNightAlpha:function(){return this.properties.dayTextureNightAlpha},u_dayTextureDayAlpha:function(){return this.properties.dayTextureDayAlpha},u_dayTextureBrightness:function(){return this.properties.dayTextureBrightness},u_dayTextureContrast:function(){return this.properties.dayTextureContrast},u_dayTextureHue:function(){return this.properties.dayTextureHue},u_dayTextureSaturation:function(){return this.properties.dayTextureSaturation},u_dayTextureOneOverGamma:function(){return this.properties.dayTextureOneOverGamma},u_dayIntensity:function(){return this.properties.dayIntensity},u_southAndNorthLatitude:function(){return this.properties.southAndNorthLatitude},u_southMercatorYAndOneOverHeight:function(){return this.properties.southMercatorYAndOneOverHeight},u_waterMask:function(){return this.properties.waterMask},u_waterMaskTranslationAndScale:function(){return this.properties.waterMaskTranslationAndScale},u_minMaxHeight:function(){return this.properties.minMaxHeight},u_scaleAndBias:function(){return this.properties.scaleAndBias},u_dayTextureSplit:function(){return this.properties.dayTextureSplit},u_dayTextureCutoutRectangles:function(){return this.properties.dayTextureCutoutRectangles},u_clippingPlanes:function(){let i=t._clippingPlanes;return l(i)&&l(i.texture)?i.texture:e.context.defaultTexture},u_cartographicLimitRectangle:function(){return this.properties.localizedCartographicLimitRectangle},u_clippingPlanesMatrix:function(){let i=t._clippingPlanes,o=l(i)?M.multiply(e.context.uniformState.view,i.modelMatrix,nct):M.IDENTITY;return M.inverseTranspose(o,ict)},u_clippingPlanesEdgeStyle:function(){let i=this.properties.clippingPlanesEdgeColor;return i.alpha=this.properties.clippingPlanesEdgeWidth,i},u_clippingDistance:function(){let i=t._clippingPolygons.clippingTexture;return l(i)?i:e.context.defaultTexture},u_clippingExtents:function(){let i=t._clippingPolygons.extentsTexture;return l(i)?i:e.context.defaultTexture},u_minimumBrightness:function(){return e.fog.minimumBrightness},u_hsbShift:function(){return this.properties.hsbShift},u_colorsToAlpha:function(){return this.properties.colorsToAlpha},u_frontFaceAlphaByDistance:function(){return this.properties.frontFaceAlphaByDistance},u_backFaceAlphaByDistance:function(){return this.properties.backFaceAlphaByDistance},u_translucencyRectangle:function(){return this.properties.localizedTranslucencyRectangle},u_undergroundColor:function(){return this.properties.undergroundColor},u_undergroundColorAlphaByDistance:function(){return this.properties.undergroundColorAlphaByDistance},u_lambertDiffuseMultiplier:function(){return this.properties.lambertDiffuseMultiplier},u_vertexShadowDarkness:function(){return this.properties.vertexShadowDarkness},properties:{initialColor:new se(0,0,.5,1),fillHighlightColor:new Y(0,0,0,0),zoomedOutOceanSpecularIntensity:.5,oceanNormalMap:void 0,lightingFadeDistance:new D(65e5,9e6),nightFadeDistance:new D(1e7,4e7),atmosphereLightIntensity:10,atmosphereRayleighCoefficient:new h(55e-7,13e-6,284e-7),atmosphereMieCoefficient:new h(21e-6,21e-6,21e-6),atmosphereRayleighScaleHeight:1e4,atmosphereMieScaleHeight:3200,atmosphereMieAnisotropy:.9,hsbShift:new h,center3D:void 0,rtc:new h,modifiedModelView:new M,tileRectangle:new se,verticalExaggerationAndRelativeHeight:new D(1,0),dayTextures:[],dayTextureTranslationAndScale:[],dayTextureTexCoordsRectangle:[],dayTextureUseWebMercatorT:[],dayTextureAlpha:[],dayTextureNightAlpha:[],dayTextureDayAlpha:[],dayTextureBrightness:[],dayTextureContrast:[],dayTextureHue:[],dayTextureSaturation:[],dayTextureOneOverGamma:[],dayTextureSplit:[],dayTextureCutoutRectangles:[],dayIntensity:0,colorsToAlpha:[],southAndNorthLatitude:new D,southMercatorYAndOneOverHeight:new D,waterMask:void 0,waterMaskTranslationAndScale:new se,minMaxHeight:new D,scaleAndBias:new M,clippingPlanesEdgeColor:Y.clone(Y.WHITE),clippingPlanesEdgeWidth:0,localizedCartographicLimitRectangle:new se,frontFaceAlphaByDistance:new se,backFaceAlphaByDistance:new se,localizedTranslucencyRectangle:new se,undergroundColor:Y.clone(Y.TRANSPARENT),undergroundColorAlphaByDistance:new se,lambertDiffuseMultiplier:0,vertexShadowDarkness:0}};return l(t.materialUniformMap)?xt(n,t.materialUniformMap):n}function oct(e,t,n){let i=n.data,o,r;if(l(i.vertexArray)?(o=i.mesh,r=i.vertexArray):l(i.fill)&&l(i.fill.vertexArray)&&(o=i.fill.mesh,r=i.fill.vertexArray),!(!l(o)||!l(r))){if(l(i.wireframeVertexArray)){if(i.wireframeVertexArray.mesh===o)return;i.wireframeVertexArray.destroy(),i.wireframeVertexArray=void 0}i.wireframeVertexArray=rct(e,r,o),i.wireframeVertexArray.mesh=o}}function rct(e,t,n){let o={indices:n.indices,primitiveType:Fe.TRIANGLES};An.toWireframe(o);let r=o.indices,s=ft.createIndexBuffer({context:e,typedArray:r,usage:Ne.STATIC_DRAW,indexDatatype:Me.fromSizeInBytes(r.BYTES_PER_ELEMENT)});return new ti({context:e,attributes:t._attributes,indexBuffer:s})}var tye,nye,PD;(function(){let e=new St({geometry:gm.fromDimensions({dimensions:new h(2,2,2)})}),t=new St({geometry:new Pp({radius:1})}),n=new M,i,o;function r(s){return new En({geometryInstances:s,appearance:new dn({translucent:!1,flat:!0}),asynchronous:!1})}tye=function(s,a){return s===i||(PD(),i=s,n=M.fromRotationTranslation(s.halfAxes,s.center,n),e.modelMatrix=n,e.attributes.color=Ht.fromColor(a),o=r(e)),o},nye=function(s,a){return s===i||(PD(),i=s,n=M.fromTranslation(s.center,n),n=M.multiplyByUniformScale(n,s.radius,n),t.modelMatrix=n,t.attributes.color=Ht.fromColor(a),o=r(t)),o},PD=function(){l(o)&&(o.destroy(),o=void 0,i=void 0)}})();var sct=new se(0,0,0,0),act={frameState:void 0,surfaceTile:void 0,numberOfDayTextures:void 0,applyBrightness:void 0,applyContrast:void 0,applyHue:void 0,applySaturation:void 0,applyGamma:void 0,applyAlpha:void 0,applyDayNightAlpha:void 0,applySplit:void 0,showReflectiveOcean:void 0,showOceanWaves:void 0,enableLighting:void 0,dynamicAtmosphereLighting:void 0,dynamicAtmosphereLightingFromSun:void 0,showGroundAtmosphere:void 0,perFragmentGroundAtmosphere:void 0,hasVertexNormals:void 0,useWebMercatorProjection:void 0,enableFog:void 0,enableClippingPlanes:void 0,clippingPlanes:void 0,enableClippingPolygons:void 0,clippingPolygons:void 0,clippedByBoundaries:void 0,hasImageryLayerCutout:void 0,colorCorrect:void 0,colorToAlpha:void 0,hasGeodeticSurfaceNormals:void 0,hasExaggeration:void 0},cct=Y.TRANSPARENT,lct=new At;function dct(e,t,n){let i=t.data;l(i.vertexArray)||(i.fill===void 0&&(i.fill=new QV(t)),i.fill.update(e,n));let o=n.creditDisplay,r=i.terrainData;if(l(r)&&l(r.credits)){let pe=r.credits;for(let Ve=0,Dt=pe.length;Ve<Dt;++Ve)o.addCreditToNextFrame(pe[Ve])}let s=Mt.maximumTextureImageUnits,a=i.waterMaskTexture,c=i.waterMaskTranslationAndScale;!l(a)&&l(i.fill)&&(a=i.fill.waterMaskTexture,c=i.fill.waterMaskTranslationAndScale);let d=n.cameraUnderground,u=n.globeTranslucencyState,m=u.translucent,p=u.frontFaceAlphaByDistance,g=u.backFaceAlphaByDistance,f=u.rectangle,x=y(e.undergroundColor,cct),_=y(e.undergroundColorAlphaByDistance,lct),C=eye(e,n)&&n.mode===oe.SCENE3D&&x.alpha>0&&(_.nearValue>0||_.farValue>0),V=e.lambertDiffuseMultiplier,L=e.vertexShadowDarkness,Z=e.hasWaterMask&&l(a),G=e.oceanNormalMap,X=Z&&l(G),v=e.terrainProvider,P=l(v)&&e.terrainProvider.hasVertexNormals,F=n.fog.enabled&&n.fog.renderable&&!d,A=e.showGroundAtmosphere&&n.mode===oe.SCENE3D,b=_n.castShadows(e.shadows)&&!m,R=_n.receiveShadows(e.shadows)&&!m,E=e.hueShift,I=e.saturationShift,w=e.brightnessShift,N=!(W.equalsEpsilon(E,0,W.EPSILON7)&&W.equalsEpsilon(I,0,W.EPSILON7)&&W.equalsEpsilon(w,0,W.EPSILON7)),B=!1;if(A){let pe=h.magnitude(n.camera.positionWC),Ve=e.nightFadeOutDistance;B=pe>Ve}Z&&--s,X&&--s,l(n.shadowState)&&n.shadowState.shadowsEnabled&&--s,l(e.clippingPlanes)&&e.clippingPlanes.enabled&&--s,l(e.clippingPolygons)&&e.clippingPolygons.enabled&&(--s,--s),s-=u.numberOfTextureUniforms;let U=i.renderedMesh,O=U.center,k=U.encoding,J=i.tileBoundingRegion,H=n.verticalExaggeration,ee=n.verticalExaggerationRelativeHeight,z=H!==1,j=k.hasGeodeticSurfaceNormals,q=zat,be=0,Te=0,ae=0,ye=0,Se=!1;if(n.mode!==oe.SCENE3D){let pe=n.mapProjection,Ve=pe.project(ce.southwest(t.rectangle),jat),Dt=pe.project(ce.northeast(t.rectangle),qat);if(q.x=Ve.x,q.y=Ve.y,q.z=Dt.x,q.w=Dt.y,n.mode!==oe.MORPHING&&(O=Qat,O.x=0,O.y=(q.z+q.x)*.5,O.z=(q.w+q.y)*.5,q.x-=O.y,q.y-=O.z,q.z-=O.y,q.w-=O.z),n.mode===oe.SCENE2D&&k.quantization===Gs.BITS12){let bt=1/(Math.pow(2,12)-1)*.5,li=(q.z-q.x)*bt,Vo=(q.w-q.y)*bt;q.x-=li,q.y-=Vo,q.z+=li,q.w+=Vo}pe instanceof Ci&&(be=t.rectangle.south,Te=t.rectangle.north,ae=Ci.geodeticLatitudeToMercatorAngle(be),ye=1/(Ci.geodeticLatitudeToMercatorAngle(Te)-ae),Se=!0)}let Le=act;Le.frameState=n,Le.surfaceTile=i,Le.showReflectiveOcean=Z,Le.showOceanWaves=X,Le.enableLighting=e.enableLighting,Le.dynamicAtmosphereLighting=e.dynamicAtmosphereLighting,Le.dynamicAtmosphereLightingFromSun=e.dynamicAtmosphereLightingFromSun,Le.showGroundAtmosphere=A,Le.atmosphereLightIntensity=e.atmosphereLightIntensity,Le.atmosphereRayleighCoefficient=e.atmosphereRayleighCoefficient,Le.atmosphereMieCoefficient=e.atmosphereMieCoefficient,Le.atmosphereRayleighScaleHeight=e.atmosphereRayleighScaleHeight,Le.atmosphereMieScaleHeight=e.atmosphereMieScaleHeight,Le.atmosphereMieAnisotropy=e.atmosphereMieAnisotropy,Le.perFragmentGroundAtmosphere=B,Le.hasVertexNormals=P,Le.useWebMercatorProjection=Se,Le.clippedByBoundaries=i.clippedByBoundaries,Le.hasGeodeticSurfaceNormals=j,Le.hasExaggeration=z;let Xe=i.imagery,Pe=0,ke=Xe.length,Pt=e.showSkirts&&!d&&!m,Ot=e.backFaceCulling&&!d&&!m,ht=Ot?e._renderState:e._disableCullingRenderState,Ae=Ot?e._blendRenderState:e._disableCullingBlendRenderState,$e=ht,Qe=e._firstPassInitialColor,je=n.context;if(l(e._debug.boundingSphereTile)||PD(),e._materialUniformMap!==e.materialUniformMap){e._materialUniformMap=e.materialUniformMap;let pe=e._drawCommands.length;for(let Ve=0;Ve<pe;++Ve)e._uniformMaps[Ve]=jge(n,e)}do{let pe=0,Ve,Dt;if(e._drawCommands.length<=e._usedDrawCommands?(Ve=new et,Ve.owner=t,Ve.cull=!1,Ve.boundingVolume=new le,Ve.orientedBoundingBox=void 0,Dt=jge(n,e),e._drawCommands.push(Ve),e._uniformMaps.push(Dt)):(Ve=e._drawCommands[e._usedDrawCommands],Dt=e._uniformMaps[e._usedDrawCommands]),Ve.owner=t,++e._usedDrawCommands,t===e._debug.boundingSphereTile){let ya=J.boundingVolume,oo=J.boundingSphere;l(ya)?tye(ya,Y.RED).update(n):l(oo)&&nye(oo,Y.RED).update(n)}let bt=Dt.properties;se.clone(Qe,bt.initialColor),bt.oceanNormalMap=G,bt.lightingFadeDistance.x=e.lightingFadeOutDistance,bt.lightingFadeDistance.y=e.lightingFadeInDistance,bt.nightFadeDistance.x=e.nightFadeOutDistance,bt.nightFadeDistance.y=e.nightFadeInDistance,bt.atmosphereLightIntensity=e.atmosphereLightIntensity,bt.atmosphereRayleighCoefficient=e.atmosphereRayleighCoefficient,bt.atmosphereMieCoefficient=e.atmosphereMieCoefficient,bt.atmosphereRayleighScaleHeight=e.atmosphereRayleighScaleHeight,bt.atmosphereMieScaleHeight=e.atmosphereMieScaleHeight,bt.atmosphereMieAnisotropy=e.atmosphereMieAnisotropy,bt.zoomedOutOceanSpecularIntensity=e.zoomedOutOceanSpecularIntensity;let li=d?g:p,Vo=d?p:g;l(li)&&(se.fromElements(li.near,li.nearValue,li.far,li.farValue,bt.frontFaceAlphaByDistance),se.fromElements(Vo.near,Vo.nearValue,Vo.far,Vo.farValue,bt.backFaceAlphaByDistance)),se.fromElements(_.near,_.nearValue,_.far,_.farValue,bt.undergroundColorAlphaByDistance),Y.clone(x,bt.undergroundColor),bt.lambertDiffuseMultiplier=V,bt.vertexShadowDarkness=L;let Rs=!l(i.vertexArray)&&l(e.fillHighlightColor)&&e.fillHighlightColor.alpha>0;Rs&&Y.clone(e.fillHighlightColor,bt.fillHighlightColor),bt.verticalExaggerationAndRelativeHeight.x=H,bt.verticalExaggerationAndRelativeHeight.y=ee,bt.center3D=U.center,h.clone(O,bt.rtc),se.clone(q,bt.tileRectangle),bt.southAndNorthLatitude.x=be,bt.southAndNorthLatitude.y=Te,bt.southMercatorYAndOneOverHeight.x=ae,bt.southMercatorYAndOneOverHeight.y=ye;let zs=Kat,Nr=WD(t.rectangle,e.cartographicLimitRectangle),$r=Jat,Ue=WD(t.rectangle,f);h.fromElements(E,I,w,bt.hsbShift);let it=t.rectangle,tt=1/it.width,qe=1/it.height;zs.x=(Nr.west-it.west)*tt,zs.y=(Nr.south-it.south)*qe,zs.z=(Nr.east-it.west)*tt,zs.w=(Nr.north-it.south)*qe,se.clone(zs,bt.localizedCartographicLimitRectangle),$r.x=(Ue.west-it.west)*tt,$r.y=(Ue.south-it.south)*qe,$r.z=(Ue.east-it.west)*tt,$r.w=(Ue.north-it.south)*qe,se.clone($r,bt.localizedTranslucencyRectangle);let dt=F&&W.fog(t._distance,n.fog.density)>W.EPSILON3;N=N&&(dt||A);let Bt=!1,Ln=!1,Lo=!1,nr=!1,Na=!1,ka=!1,io=!1,Bi=!1,us=!1,yr=!1;for(;pe<s&&Pe<ke;){let ya=Xe[Pe],oo=ya.readyImagery;if(++Pe,!l(oo)||oo.imageryLayer.alpha===0)continue;let ZL=ya.useWebMercatorT?oo.textureWebMercator:oo.texture,$n=oo.imageryLayer;l(ya.textureTranslationAndScale)||(ya.textureTranslationAndScale=$n._calculateTextureTranslationAndScale(t,ya)),bt.dayTextures[pe]=ZL,bt.dayTextureTranslationAndScale[pe]=ya.textureTranslationAndScale,bt.dayTextureTexCoordsRectangle[pe]=ya.textureCoordinateRectangle,bt.dayTextureUseWebMercatorT[pe]=ya.useWebMercatorT,bt.dayTextureAlpha[pe]=$n.alpha,ka=ka||bt.dayTextureAlpha[pe]!==1,bt.dayTextureNightAlpha[pe]=$n.nightAlpha,io=io||bt.dayTextureNightAlpha[pe]!==1,bt.dayTextureDayAlpha[pe]=$n.dayAlpha,io=io||bt.dayTextureDayAlpha[pe]!==1,bt.dayTextureBrightness[pe]=$n.brightness,Bt=Bt||bt.dayTextureBrightness[pe]!==ma.DEFAULT_BRIGHTNESS,bt.dayTextureContrast[pe]=$n.contrast,Ln=Ln||bt.dayTextureContrast[pe]!==ma.DEFAULT_CONTRAST,bt.dayTextureHue[pe]=$n.hue,Lo=Lo||bt.dayTextureHue[pe]!==ma.DEFAULT_HUE,bt.dayTextureSaturation[pe]=$n.saturation,nr=nr||bt.dayTextureSaturation[pe]!==ma.DEFAULT_SATURATION,bt.dayTextureOneOverGamma[pe]=1/$n.gamma,Na=Na||bt.dayTextureOneOverGamma[pe]!==1/ma.DEFAULT_GAMMA,bt.dayTextureSplit[pe]=$n.splitDirection,Bi=Bi||bt.dayTextureSplit[pe]!==0;let Ec=bt.dayTextureCutoutRectangles[pe];if(l(Ec)||(Ec=bt.dayTextureCutoutRectangles[pe]=new se),se.clone(se.ZERO,Ec),l($n.cutoutRectangle)){let _r=WD(it,$n.cutoutRectangle),es=ce.simpleIntersection(_r,it,$ge);us=l(es)||us,Ec.x=(_r.west-it.west)*tt,Ec.y=(_r.south-it.south)*qe,Ec.z=(_r.east-it.west)*tt,Ec.w=(_r.north-it.south)*qe}let nd=bt.colorsToAlpha[pe];l(nd)||(nd=bt.colorsToAlpha[pe]=new se);let Ny=l($n.colorToAlpha)&&$n.colorToAlphaThreshold>0;if(yr=yr||Ny,Ny){let _r=$n.colorToAlpha;nd.x=_r.red,nd.y=_r.green,nd.z=_r.blue,nd.w=$n.colorToAlphaThreshold}else nd.w=-1;if(l(oo.credits)){let _r=oo.credits;for(let es=0,pb=_r.length;es<pb;++es)o.addCreditToNextFrame(_r[es])}++pe}bt.dayTextures.length=pe,bt.waterMask=a,se.clone(c,bt.waterMaskTranslationAndScale),bt.minMaxHeight.x=k.minimumHeight,bt.minMaxHeight.y=k.maximumHeight,M.clone(k.matrix,bt.scaleAndBias);let ml=e._clippingPlanes,Do=l(ml)&&ml.enabled&&t.isClipped;Do&&(bt.clippingPlanesEdgeColor=Y.clone(ml.edgeColor,bt.clippingPlanesEdgeColor),bt.clippingPlanesEdgeWidth=ml.edgeWidth);let xr=e._clippingPolygons,fb=l(xr)&&xr.enabled&&t.isClipped;Le.numberOfDayTextures=pe,Le.applyBrightness=Bt,Le.applyContrast=Ln,Le.applyHue=Lo,Le.applySaturation=nr,Le.applyGamma=Na,Le.applyAlpha=ka,Le.applyDayNightAlpha=io,Le.applySplit=Bi,Le.enableFog=dt,Le.enableClippingPlanes=Do,Le.clippingPlanes=ml,Le.enableClippingPolygons=fb,Le.clippingPolygons=xr,Le.hasImageryLayerCutout=us,Le.colorCorrect=N,Le.highlightFillTile=Rs,Le.colorToAlpha=yr,Le.showUndergroundColor=C,Le.translucent=m;let Gc=i.renderedMesh.indices.length;Pt||(Gc=i.renderedMesh.indexCountWithoutSkirts),Ve.shaderProgram=e._surfaceShaderSet.getShaderProgram(Le),Ve.castShadows=b,Ve.receiveShadows=R,Ve.renderState=$e,Ve.primitiveType=Fe.TRIANGLES,Ve.vertexArray=i.vertexArray||i.fill.vertexArray,Ve.count=Gc,Ve.uniformMap=Dt,Ve.pass=Re.GLOBE,e._debug.wireframe&&(oct(je,e,t),l(i.wireframeVertexArray)&&(Ve.vertexArray=i.wireframeVertexArray,Ve.primitiveType=Fe.LINES,Ve.count=Gc*2));let Ua=Ve.boundingVolume,dr=Ve.orientedBoundingBox;n.mode!==oe.SCENE3D?(le.fromRectangleWithHeights2D(t.rectangle,n.mapProjection,J.minimumHeight,J.maximumHeight,Ua),h.fromElements(Ua.center.z,Ua.center.x,Ua.center.y,Ua.center),n.mode===oe.MORPHING&&(Ua=le.union(J.boundingSphere,Ua,Ua))):(Ve.boundingVolume=le.clone(J.boundingSphere,Ua),Ve.orientedBoundingBox=Gn.clone(J.boundingVolume,dr)),Ve.dirty=!0,m&&u.updateDerivedCommands(Ve,n),qge(Ve,n),$e=Ae,Qe=sct}while(Pe<ke)}var Ow=$o;var dIi=T(S(),1);function iye(){this._enabled=!1,this._frontFaceAlpha=1,this._frontFaceAlphaByDistance=void 0,this._backFaceAlpha=1,this._backFaceAlphaByDistance=void 0,this._rectangle=ce.clone(ce.MAX_VALUE)}Object.defineProperties(iye.prototype,{enabled:{get:function(){return this._enabled},set:function(e){this._enabled=e}},frontFaceAlpha:{get:function(){return this._frontFaceAlpha},set:function(e){this._frontFaceAlpha=e}},frontFaceAlphaByDistance:{get:function(){return this._frontFaceAlphaByDistance},set:function(e){this._frontFaceAlphaByDistance=At.clone(e,this._frontFaceAlphaByDistance)}},backFaceAlpha:{get:function(){return this._backFaceAlpha},set:function(e){this._backFaceAlpha=e}},backFaceAlphaByDistance:{get:function(){return this._backFaceAlphaByDistance},set:function(e){this._backFaceAlphaByDistance=At.clone(e,this._backFaceAlphaByDistance)}},rectangle:{get:function(){return this._rectangle},set:function(e){l(e)||(e=ce.clone(ce.MAX_VALUE)),ce.clone(e,this._rectangle)}}});var Hw=iye;var xIi=T(S(),1);function Ls(){this._layers=[],this.layerAdded=new ge,this.layerRemoved=new ge,this.layerMoved=new ge,this.layerShownOrHidden=new ge}Object.defineProperties(Ls.prototype,{length:{get:function(){return this._layers.length}}});Ls.prototype.add=function(e,t){l(t)?this._layers.splice(t,0,e):(t=this._layers.length,this._layers.push(e)),this._update(),this.layerAdded.raiseEvent(e,t);let i=e.readyEvent.addEventListener(()=>{this.layerShownOrHidden.raiseEvent(e,e._layerIndex,e.show),i()})};Ls.prototype.addImageryProvider=function(e,t){let n=new ma(e);return this.add(n,t),n};Ls.prototype.remove=function(e,t){t=y(t,!0);let n=this._layers.indexOf(e);return n!==-1?(this._layers.splice(n,1),this._update(),this.layerRemoved.raiseEvent(e,n),t&&e.destroy(),!0):!1};Ls.prototype.removeAll=function(e){e=y(e,!0);let t=this._layers;for(let n=0,i=t.length;n<i;n++){let o=t[n];this.layerRemoved.raiseEvent(o,n),e&&o.destroy()}this._layers=[]};Ls.prototype.contains=function(e){return this.indexOf(e)!==-1};Ls.prototype.indexOf=function(e){return this._layers.indexOf(e)};Ls.prototype.get=function(e){return this._layers[e]};function vD(e,t){return e.indexOf(t)}function oye(e,t,n){let i=e._layers;if(t=W.clamp(t,0,i.length-1),n=W.clamp(n,0,i.length-1),t===n)return;let o=i[t];i[t]=i[n],i[n]=o,e._update(),e.layerMoved.raiseEvent(o,n,t)}Ls.prototype.raise=function(e){let t=vD(this._layers,e);oye(this,t,t+1)};Ls.prototype.lower=function(e){let t=vD(this._layers,e);oye(this,t,t-1)};Ls.prototype.raiseToTop=function(e){let t=vD(this._layers,e);t!==this._layers.length-1&&(this._layers.splice(t,1),this._layers.push(e),this._update(),this.layerMoved.raiseEvent(e,this._layers.length-1,t))};Ls.prototype.lowerToBottom=function(e){let t=vD(this._layers,e);t!==0&&(this._layers.splice(t,1),this._layers.splice(0,0,e),this._update(),this.layerMoved.raiseEvent(e,0,t))};var uct=new ce;function rye(e,t,n,i){let o=e.globe._surface._tilesToRender,r;for(let a=0;!l(r)&&a<o.length;++a){let c=o[a];ce.contains(c.rectangle,t)&&(r=c)}if(!l(r))return;let s=r.data.imagery;for(let a=s.length-1;a>=0;--a){let c=s[a],d=c.readyImagery;if(!l(d)||!d.imageryLayer.ready)continue;let u=d.imageryLayer.imageryProvider;if(n&&!l(u.pickFeatures)||!ce.contains(d.rectangle,t))continue;let m=uct,p=1/1024;m.west=W.lerp(r.rectangle.west,r.rectangle.east,c.textureCoordinateRectangle.x-p),m.east=W.lerp(r.rectangle.west,r.rectangle.east,c.textureCoordinateRectangle.z+p),m.south=W.lerp(r.rectangle.south,r.rectangle.north,c.textureCoordinateRectangle.y-p),m.north=W.lerp(r.rectangle.south,r.rectangle.north,c.textureCoordinateRectangle.w+p),ce.contains(m,t)&&i(d)}}Ls.prototype.pickImageryLayers=function(e,t){let n=t.globe.pick(e,t);if(!l(n))return;let i=t.globe.ellipsoid.cartesianToCartographic(n),o=[];if(rye(t,i,!1,function(r){o.push(r.imageryLayer)}),o.length!==0)return o};Ls.prototype.pickImageryLayerFeatures=function(e,t){let n=t.globe.pick(e,t);if(!l(n))return;let i=t.globe.ellipsoid.cartesianToCartographic(n),o=[],r=[];if(rye(t,i,!0,function(s){if(!s.imageryLayer.ready)return;let c=s.imageryLayer.imageryProvider.pickFeatures(s.x,s.y,s.level,i.longitude,i.latitude);l(c)&&(o.push(c),r.push(s.imageryLayer))}),o.length!==0)return Promise.all(o).then(function(s){let a=[];for(let c=0;c<s.length;++c){let d=s[c],u=r[c];if(l(d)&&d.length>0)for(let m=0;m<d.length;++m){let p=d[m];p.imageryLayer=u,l(p.position)||(p.position=i),a.push(p)}}return a})};Ls.prototype.queueReprojectionCommands=function(e){let t=this._layers;for(let n=0,i=t.length;n<i;++n)t[n].queueReprojectionCommands(e)};Ls.prototype.cancelReprojections=function(){let e=this._layers;for(let t=0,n=e.length;t<n;++t)e[t].cancelReprojections()};Ls.prototype.isDestroyed=function(){return!1};Ls.prototype.destroy=function(){return this.removeAll(!0),me(this)};Ls.prototype._update=function(){let e=!0,t=this._layers,n,i,o,r;for(o=0,r=t.length;o<r;++o)i=t[o],i._layerIndex=o,i.show?(i._isBaseLayer=e,e=!1):i._isBaseLayer=!1,i.show!==i._show&&(l(i._show)&&(l(n)||(n=[]),n.push(i)),i._show=i.show);if(l(n))for(o=0,r=n.length;o<r;++o)i=n[o],this.layerShownOrHidden.raiseEvent(i,i._layerIndex,i.show)};var zw=Ls;var $Ii=T(S(),1);var CIi=T(S(),1);function sye(e){this._ellipsoid=new lp(e.ellipsoid,h.ZERO)}Object.defineProperties(sye.prototype,{ellipsoid:{get:function(){return this._ellipsoid}}});var Kw=sye;var EIi=T(S(),1);function sl(e){this._tilingScheme=e.tilingScheme,this._x=e.x,this._y=e.y,this._level=e.level,this._parent=e.parent,this._rectangle=this._tilingScheme.tileXYToRectangle(this._x,this._y,this._level),this._southwestChild=void 0,this._southeastChild=void 0,this._northwestChild=void 0,this._northeastChild=void 0,this.replacementPrevious=void 0,this.replacementNext=void 0,this._distance=0,this._loadPriority=0,this._customData=[],this._frameUpdated=void 0,this._lastSelectionResult=Kn.NONE,this._lastSelectionResultFrame=void 0,this._loadedCallbacks={},this.state=Os.START,this.renderable=!1,this.upsampledFromParent=!1,this.data=void 0}sl.createLevelZeroTiles=function(e){let t=e.getNumberOfXTilesAtLevel(0),n=e.getNumberOfYTilesAtLevel(0),i=new Array(t*n),o=0;for(let r=0;r<n;++r)for(let s=0;s<t;++s)i[o++]=new sl({tilingScheme:e,x:s,y:r,level:0});return i};sl.prototype._updateCustomData=function(e,t,n){let i=this.customData,o,r,s;if(l(t)&&l(n)){for(i=i.filter(function(a){return n.indexOf(a)===-1}),this._customData=i,s=this._rectangle,o=0;o<t.length;++o)r=t[o],ce.contains(s,r.positionCartographic)&&i.push(r);this._frameUpdated=e}else{let a=this._parent;if(l(a)&&this._frameUpdated!==a._frameUpdated){i.length=0,s=this._rectangle;let c=a.customData;for(o=0;o<c.length;++o)r=c[o],ce.contains(s,r.positionCartographic)&&i.push(r);this._frameUpdated=a._frameUpdated}}};Object.defineProperties(sl.prototype,{tilingScheme:{get:function(){return this._tilingScheme}},x:{get:function(){return this._x}},y:{get:function(){return this._y}},level:{get:function(){return this._level}},parent:{get:function(){return this._parent}},rectangle:{get:function(){return this._rectangle}},children:{get:function(){return[this.northwestChild,this.northeastChild,this.southwestChild,this.southeastChild]}},southwestChild:{get:function(){return l(this._southwestChild)||(this._southwestChild=new sl({tilingScheme:this.tilingScheme,x:this.x*2,y:this.y*2+1,level:this.level+1,parent:this})),this._southwestChild}},southeastChild:{get:function(){return l(this._southeastChild)||(this._southeastChild=new sl({tilingScheme:this.tilingScheme,x:this.x*2+1,y:this.y*2+1,level:this.level+1,parent:this})),this._southeastChild}},northwestChild:{get:function(){return l(this._northwestChild)||(this._northwestChild=new sl({tilingScheme:this.tilingScheme,x:this.x*2,y:this.y*2,level:this.level+1,parent:this})),this._northwestChild}},northeastChild:{get:function(){return l(this._northeastChild)||(this._northeastChild=new sl({tilingScheme:this.tilingScheme,x:this.x*2+1,y:this.y*2,level:this.level+1,parent:this})),this._northeastChild}},customData:{get:function(){return this._customData}},needsLoading:{get:function(){return this.state<Os.DONE}},eligibleForUnloading:{get:function(){let e=!0;return l(this.data)&&(e=this.data.eligibleForUnloading,l(e)||(e=!0)),e}}});sl.prototype.findLevelZeroTile=function(e,t,n){let i=this.tilingScheme.getNumberOfXTilesAtLevel(0);if(t<0?t+=i:t>=i&&(t-=i),!(n<0||n>=this.tilingScheme.getNumberOfYTilesAtLevel(0)))return e.filter(function(o){return o.x===t&&o.y===n})[0]};sl.prototype.findTileToWest=function(e){let t=this.parent;if(t===void 0)return this.findLevelZeroTile(e,this.x-1,this.y);if(t.southeastChild===this)return t.southwestChild;if(t.northeastChild===this)return t.northwestChild;let n=t.findTileToWest(e);if(n!==void 0)return t.southwestChild===this?n.southeastChild:n.northeastChild};sl.prototype.findTileToEast=function(e){let t=this.parent;if(t===void 0)return this.findLevelZeroTile(e,this.x+1,this.y);if(t.southwestChild===this)return t.southeastChild;if(t.northwestChild===this)return t.northeastChild;let n=t.findTileToEast(e);if(n!==void 0)return t.southeastChild===this?n.southwestChild:n.northwestChild};sl.prototype.findTileToSouth=function(e){let t=this.parent;if(t===void 0)return this.findLevelZeroTile(e,this.x,this.y+1);if(t.northwestChild===this)return t.southwestChild;if(t.northeastChild===this)return t.southeastChild;let n=t.findTileToSouth(e);if(n!==void 0)return t.southwestChild===this?n.northwestChild:n.northeastChild};sl.prototype.findTileToNorth=function(e){let t=this.parent;if(t===void 0)return this.findLevelZeroTile(e,this.x,this.y-1);if(t.southwestChild===this)return t.northwestChild;if(t.southeastChild===this)return t.northeastChild;let n=t.findTileToNorth(e);if(n!==void 0)return t.northwestChild===this?n.southwestChild:n.southeastChild};sl.prototype.freeResources=function(){this.state=Os.START,this.renderable=!1,this.upsampledFromParent=!1,l(this.data)&&l(this.data.freeResources)&&this.data.freeResources(),wD(this._southwestChild),this._southwestChild=void 0,wD(this._southeastChild),this._southeastChild=void 0,wD(this._northwestChild),this._northwestChild=void 0,wD(this._northeastChild),this._northeastChild=void 0};function wD(e){l(e)&&e.freeResources()}var Jw=sl;var WIi=T(S(),1);function FD(){this.head=void 0,this.tail=void 0,this.count=0,this._lastBeforeStartOfFrame=void 0}FD.prototype.markStartOfRenderFrame=function(){this._lastBeforeStartOfFrame=this.head};FD.prototype.trimTiles=function(e){let t=this.tail,n=!0;for(;n&&l(this._lastBeforeStartOfFrame)&&this.count>e&&l(t);){n=t!==this._lastBeforeStartOfFrame;let i=t.replacementPrevious;t.eligibleForUnloading&&(t.freeResources(),aye(this,t)),t=i}};function aye(e,t){let n=t.replacementPrevious,i=t.replacementNext;t===e._lastBeforeStartOfFrame&&(e._lastBeforeStartOfFrame=i),t===e.head?e.head=i:n.replacementNext=i,t===e.tail?e.tail=n:i.replacementPrevious=n,t.replacementPrevious=void 0,t.replacementNext=void 0,--e.count}FD.prototype.markTileRendered=function(e){let t=this.head;if(t===e){e===this._lastBeforeStartOfFrame&&(this._lastBeforeStartOfFrame=e.replacementNext);return}if(++this.count,!l(t)){e.replacementPrevious=void 0,e.replacementNext=void 0,this.head=e,this.tail=e;return}(l(e.replacementPrevious)||l(e.replacementNext))&&aye(this,e),e.replacementPrevious=void 0,e.replacementNext=t,t.replacementPrevious=e,this.head=e};var Qw=FD;function em(e){this._tileProvider=e.tileProvider,this._tileProvider.quadtree=this,this._debug={enableDebugOutput:!1,maxDepth:0,maxDepthVisited:0,tilesVisited:0,tilesCulled:0,tilesRendered:0,tilesWaitingForChildren:0,lastMaxDepth:-1,lastMaxDepthVisited:-1,lastTilesVisited:-1,lastTilesCulled:-1,lastTilesRendered:-1,lastTilesWaitingForChildren:-1,suspendLodUpdate:!1};let n=this._tileProvider.tilingScheme.ellipsoid;this._tilesToRender=[],this._tileLoadQueueHigh=[],this._tileLoadQueueMedium=[],this._tileLoadQueueLow=[],this._tileReplacementQueue=new Qw,this._levelZeroTiles=void 0,this._loadQueueTimeSlice=5,this._tilesInvalidated=!1,this._addHeightCallbacks=[],this._removeHeightCallbacks=[],this._tileToUpdateHeights=[],this._lastTileIndex=0,this._updateHeightsTimeSlice=2,this._cameraPositionCartographic=void 0,this._cameraReferenceFrameOriginCartographic=void 0,this.maximumScreenSpaceError=y(e.maximumScreenSpaceError,2),this.tileCacheSize=y(e.tileCacheSize,100),this.loadingDescendantLimit=20,this.preloadAncestors=!0,this.preloadSiblings=!1,this._occluders=new Kw({ellipsoid:n}),this._tileLoadProgressEvent=new ge,this._lastTileLoadQueueLength=0,this._lastSelectionFrameNumber=void 0}Object.defineProperties(em.prototype,{tileProvider:{get:function(){return this._tileProvider}},tileLoadProgressEvent:{get:function(){return this._tileLoadProgressEvent}},occluders:{get:function(){return this._occluders}}});em.prototype.invalidateAllTiles=function(){this._tilesInvalidated=!0};function mct(e){let t=e._tileReplacementQueue;t.head=void 0,t.tail=void 0,t.count=0,lye(e);let n=e._levelZeroTiles;if(l(n))for(let i=0;i<n.length;++i){let r=n[i].customData,s=r.length;for(let a=0;a<s;++a){let c=r[a];c.level=0,e._addHeightCallbacks.push(c)}n[i].freeResources()}e._levelZeroTiles=void 0,e._tileProvider.cancelReprojections()}em.prototype.forEachLoadedTile=function(e){let t=this._tileReplacementQueue.head;for(;l(t);)t.state!==Os.START&&e(t),t=t.replacementNext};em.prototype.forEachRenderedTile=function(e){let t=this._tilesToRender;for(let n=0,i=t.length;n<i;++n)e(t[n])};em.prototype.updateHeight=function(e,t){let n=this,i={positionOnEllipsoidSurface:void 0,positionCartographic:e,level:-1,callback:t};return i.removeFunc=function(){let o=n._addHeightCallbacks,r=o.length;for(let s=0;s<r;++s)if(o[s]===i){o.splice(s,1);break}n._removeHeightCallbacks.push(i),i.callback&&(i.callback=void 0)},n._addHeightCallbacks.push(i),i.removeFunc};em.prototype.update=function(e){l(this._tileProvider.update)&&this._tileProvider.update(e)};function lye(e){let t=e._debug;t.maxDepth=0,t.maxDepthVisited=0,t.tilesVisited=0,t.tilesCulled=0,t.tilesRendered=0,t.tilesWaitingForChildren=0,e._tileLoadQueueHigh.length=0,e._tileLoadQueueMedium.length=0,e._tileLoadQueueLow.length=0}em.prototype.beginFrame=function(e){e.passes.render&&(this._tilesInvalidated&&(mct(this),this._tilesInvalidated=!1),this._tileProvider.initialize(e),lye(this),!this._debug.suspendLodUpdate&&this._tileReplacementQueue.markStartOfRenderFrame())};em.prototype.render=function(e){let t=e.passes,n=this._tileProvider;t.render&&(n.beginUpdate(e),bct(this,e),Rct(this,e),n.endUpdate(e)),t.pick&&this._tilesToRender.length>0&&n.updateForPick(e)};function hct(e,t){let n=e._tileLoadQueueHigh.length+e._tileLoadQueueMedium.length+e._tileLoadQueueLow.length;if(n!==e._lastTileLoadQueueLength||e._tilesInvalidated){let o=ge.prototype.raiseEvent.bind(e._tileLoadProgressEvent,n);t.afterRender.push(()=>(o(),!0)),e._lastTileLoadQueueLength=n}let i=e._debug;i.enableDebugOutput&&!i.suspendLodUpdate&&(i.maxDepth=e._tilesToRender.reduce(function(o,r){return Math.max(o,r.level)},-1),i.tilesRendered=e._tilesToRender.length,(i.tilesVisited!==i.lastTilesVisited||i.tilesRendered!==i.lastTilesRendered||i.tilesCulled!==i.lastTilesCulled||i.maxDepth!==i.lastMaxDepth||i.tilesWaitingForChildren!==i.lastTilesWaitingForChildren||i.maxDepthVisited!==i.lastMaxDepthVisited)&&(console.log(`Visited ${i.tilesVisited}, Rendered: ${i.tilesRendered}, Culled: ${i.tilesCulled}, Max Depth Rendered: ${i.maxDepth}, Max Depth Visited: ${i.maxDepthVisited}, Waiting for children: ${i.tilesWaitingForChildren}`),i.lastTilesVisited=i.tilesVisited,i.lastTilesRendered=i.tilesRendered,i.lastTilesCulled=i.tilesCulled,i.lastMaxDepth=i.maxDepth,i.lastTilesWaitingForChildren=i.tilesWaitingForChildren,i.lastMaxDepthVisited=i.maxDepthVisited))}em.prototype.endFrame=function(e){!e.passes.render||e.mode===oe.MORPHING||(Sct(this,e),Lct(this,e),hct(this,e))};em.prototype.isDestroyed=function(){return!1};em.prototype.destroy=function(){this._tileProvider=this._tileProvider&&this._tileProvider.destroy()};var qw,cye=new he;function fct(e,t){let n=ce.center(e.rectangle,cye),i=n.longitude-qw.longitude,o=n.latitude-qw.latitude;n=ce.center(t.rectangle,cye);let r=n.longitude-qw.longitude,s=n.latitude-qw.latitude;return i*i+o*o-(r*r+s*s)}var pct=new h,jw=[];function bct(e,t){let n=e._debug;if(n.suspendLodUpdate)return;let i=e._tilesToRender;i.length=0;let o,r=e._tileProvider;if(!l(e._levelZeroTiles)){let x=r.tilingScheme;if(l(x)){let _=r.tilingScheme;e._levelZeroTiles=Jw.createLevelZeroTiles(_);let C=e._levelZeroTiles.length;if(jw.length<C)for(jw=new Array(C),o=0;o<C;++o)jw[o]===void 0&&(jw[o]=new $w)}else return}e._occluders.ellipsoid.cameraPosition=t.camera.positionWC;let s,a=e._levelZeroTiles,c=a.length>1?e._occluders:void 0;qw=t.camera.positionCartographic,a.sort(fct);let d=e._addHeightCallbacks,u=e._removeHeightCallbacks,m=t.frameNumber,p;if(d.length>0||u.length>0){for(o=0,p=a.length;o<p;++o)s=a[o],s._updateCustomData(m,d,u);d.length=0,u.length=0}let g=t.camera;e._cameraPositionCartographic=g.positionCartographic;let f=M.getTranslation(g.transform,pct);for(e._cameraReferenceFrameOriginCartographic=e.tileProvider.tilingScheme.ellipsoid.cartesianToCartographic(f,e._cameraReferenceFrameOriginCartographic),o=0,p=a.length;o<p;++o)s=a[o],e._tileReplacementQueue.markTileRendered(s),s.renderable?Fa(e,s,r,t,c,!1,jw[o]):($0(e,e._tileLoadQueueHigh,s,t),++n.tilesWaitingForChildren);e._lastSelectionFrameNumber=m}function $0(e,t,n,i){n.needsLoading&&(e.tileProvider.computeTileLoadPriority!==void 0&&(n._loadPriority=e.tileProvider.computeTileLoadPriority(n,i)),t.push(n))}function $w(){this.allAreRenderable=!0,this.anyWereRenderedLastFrame=!1,this.notYetRenderableCount=0}function dye(){this.southwest=new $w,this.southeast=new $w,this.northwest=new $w,this.northeast=new $w}dye.prototype.combine=function(e){let t=this.southwest,n=this.southeast,i=this.northwest,o=this.northeast;e.allAreRenderable=t.allAreRenderable&&n.allAreRenderable&&i.allAreRenderable&&o.allAreRenderable,e.anyWereRenderedLastFrame=t.anyWereRenderedLastFrame||n.anyWereRenderedLastFrame||i.anyWereRenderedLastFrame||o.anyWereRenderedLastFrame,e.notYetRenderableCount=t.notYetRenderableCount+n.notYetRenderableCount+i.notYetRenderableCount+o.notYetRenderableCount};var Aj=new Array(31);for(let e=0;e<Aj.length;++e)Aj[e]=new dye;function gct(e,t,n,i,o){let r=e._debug;++r.tilesVisited,e._tileReplacementQueue.markTileRendered(n),n._updateCustomData(t.frameNumber),n.level>r.maxDepthVisited&&(r.maxDepthVisited=n.level);let s=_ct(e,t,n)<e.maximumScreenSpaceError,a=n.southwestChild,c=n.southeastChild,d=n.northwestChild,u=n.northeastChild,m=e._lastSelectionFrameNumber,p=n._lastSelectionResultFrame===m?n._lastSelectionResult:Kn.NONE,g=e.tileProvider;if(s||i){let f=Kn.originalResult(p)===Kn.RENDERED,x=Kn.originalResult(p)===Kn.CULLED||p===Kn.NONE,_=n.state===Os.DONE,C=f||x||_;if(C||l(g.canRenderWithoutLosingDetail)&&(C=g.canRenderWithoutLosingDetail(n)),C){s&&$0(e,e._tileLoadQueueMedium,n,t),AD(e,n),o.allAreRenderable=n.renderable,o.anyWereRenderedLastFrame=p===Kn.RENDERED,o.notYetRenderableCount=n.renderable?0:1,n._lastSelectionResultFrame=t.frameNumber,n._lastSelectionResult=Kn.RENDERED,o.anyWereRenderedLastFrame||e._tileToUpdateHeights.push(n);return}i=!0,s&&$0(e,e._tileLoadQueueHigh,n,t)}if(g.canRefine(n)){if(a.upsampledFromParent&&c.upsampledFromParent&&d.upsampledFromParent&&u.upsampledFromParent){AD(e,n),$0(e,e._tileLoadQueueMedium,n,t),e._tileReplacementQueue.markTileRendered(a),e._tileReplacementQueue.markTileRendered(c),e._tileReplacementQueue.markTileRendered(d),e._tileReplacementQueue.markTileRendered(u),o.allAreRenderable=n.renderable,o.anyWereRenderedLastFrame=p===Kn.RENDERED,o.notYetRenderableCount=n.renderable?0:1,n._lastSelectionResultFrame=t.frameNumber,n._lastSelectionResult=Kn.RENDERED,o.anyWereRenderedLastFrame||e._tileToUpdateHeights.push(n);return}n._lastSelectionResultFrame=t.frameNumber,n._lastSelectionResult=Kn.REFINED;let x=e._tilesToRender.length,_=e._tileLoadQueueLow.length,C=e._tileLoadQueueMedium.length,V=e._tileLoadQueueHigh.length,L=e._tileToUpdateHeights.length;if(yct(e,a,c,d,u,t,i,o),x!==e._tilesToRender.length){let Z=o.allAreRenderable,G=o.anyWereRenderedLastFrame,X=o.notYetRenderableCount,v=!1;if(!Z&&!G){let P=e._tilesToRender;for(let A=x;A<P.length;++A){let b=P[A];for(;b!==void 0&&b._lastSelectionResult!==Kn.KICKED&&b!==n;)b._lastSelectionResult=Kn.kick(b._lastSelectionResult),b=b.parent}e._tilesToRender.length=x,e._tileToUpdateHeights.length=L,AD(e,n),n._lastSelectionResult=Kn.RENDERED;let F=p===Kn.RENDERED;!F&&X>e.loadingDescendantLimit&&(e._tileLoadQueueLow.length=_,e._tileLoadQueueMedium.length=C,e._tileLoadQueueHigh.length=V,$0(e,e._tileLoadQueueMedium,n,t),o.notYetRenderableCount=n.renderable?0:1,v=!0),o.allAreRenderable=n.renderable,o.anyWereRenderedLastFrame=F,F||e._tileToUpdateHeights.push(n),++r.tilesWaitingForChildren}e.preloadAncestors&&!v&&$0(e,e._tileLoadQueueLow,n,t)}return}n._lastSelectionResultFrame=t.frameNumber,n._lastSelectionResult=Kn.RENDERED,AD(e,n),$0(e,e._tileLoadQueueHigh,n,t),o.allAreRenderable=n.renderable,o.anyWereRenderedLastFrame=p===Kn.RENDERED,o.notYetRenderableCount=n.renderable?0:1}function yct(e,t,n,i,o,r,s,a){let c=r.camera.positionCartographic,d=e._tileProvider,u=e._occluders,m=Aj[t.level],p=m.southwest,g=m.southeast,f=m.northwest,x=m.northeast;c.longitude<t.rectangle.east?c.latitude<t.rectangle.north?(Fa(e,t,d,r,u,s,p),Fa(e,n,d,r,u,s,g),Fa(e,i,d,r,u,s,f),Fa(e,o,d,r,u,s,x)):(Fa(e,i,d,r,u,s,f),Fa(e,t,d,r,u,s,p),Fa(e,o,d,r,u,s,x),Fa(e,n,d,r,u,s,g)):c.latitude<t.rectangle.north?(Fa(e,n,d,r,u,s,g),Fa(e,t,d,r,u,s,p),Fa(e,o,d,r,u,s,x),Fa(e,i,d,r,u,s,f)):(Fa(e,o,d,r,u,s,x),Fa(e,i,d,r,u,s,f),Fa(e,n,d,r,u,s,g),Fa(e,t,d,r,u,s,p)),m.combine(a)}function xct(e,t){let n=t.rectangle;return l(e._cameraPositionCartographic)&&ce.contains(n,e._cameraPositionCartographic)||l(e._cameraReferenceFrameOriginCartographic)&&ce.contains(n,e._cameraReferenceFrameOriginCartographic)}function Fa(e,t,n,i,o,r,s){if(n.computeTileVisibility(t,i,o)!==ir.NONE)return gct(e,i,t,r,s);if(++e._debug.tilesCulled,e._tileReplacementQueue.markTileRendered(t),s.allAreRenderable=!0,s.anyWereRenderedLastFrame=!1,s.notYetRenderableCount=0,xct(e,t)){(!l(t.data)||!l(t.data.vertexArray))&&$0(e,e._tileLoadQueueMedium,t,i);let a=e._lastSelectionFrameNumber,c=t._lastSelectionResultFrame===a?t._lastSelectionResult:Kn.NONE;c!==Kn.CULLED_BUT_NEEDED&&c!==Kn.RENDERED&&e._tileToUpdateHeights.push(t),t._lastSelectionResult=Kn.CULLED_BUT_NEEDED}else e.preloadSiblings||t.level===0?($0(e,e._tileLoadQueueLow,t,i),t._lastSelectionResult=Kn.CULLED):t._lastSelectionResult=Kn.CULLED;t._lastSelectionResultFrame=i.frameNumber}function _ct(e,t,n){if(t.mode===oe.SCENE2D||t.camera.frustum instanceof on||t.camera.frustum instanceof Zr)return Tct(e,t,n);let i=e._tileProvider.getLevelMaximumGeometricError(n.level),o=n._distance,r=t.context.drawingBufferHeight,s=t.camera.frustum.sseDenominator,a=i*r/(o*s);return t.fog.enabled&&(a-=W.fog(o,t.fog.density)*t.fog.sse),a/=t.pixelRatio,a}function Tct(e,t,n){let o=t.camera.frustum,r=o.offCenterFrustum;l(r)&&(o=r);let s=t.context,a=s.drawingBufferWidth,c=s.drawingBufferHeight,d=e._tileProvider.getLevelMaximumGeometricError(n.level),u=Math.max(o.top-o.bottom,o.right-o.left)/Math.max(a,c),m=d/u;return t.fog.enabled&&t.mode!==oe.SCENE2D&&(m-=W.fog(n._distance,t.fog.density)*t.fog.sse),m/=t.pixelRatio,m}function AD(e,t){e._tilesToRender.push(t)}function Sct(e,t){let n=e._tileLoadQueueHigh,i=e._tileLoadQueueMedium,o=e._tileLoadQueueLow;if(n.length===0&&i.length===0&&o.length===0)return;e._tileReplacementQueue.trimTiles(e.tileCacheSize);let r=fi()+e._loadQueueTimeSlice,s=e._tileProvider,a=wj(e,t,s,r,n,!1);a=wj(e,t,s,r,i,a),wj(e,t,s,r,o,a)}function Cct(e,t){return e._loadPriority-t._loadPriority}function wj(e,t,n,i,o,r){n.computeTileLoadPriority!==void 0&&o.sort(Cct);for(let s=0,a=o.length;s<a&&(fi()<i||!r);++s){let c=o[s];e._tileReplacementQueue.markTileRendered(c),n.loadTile(t,c),r=!0}return r}var jV=new pn,Fj=new he,Sy=new h,Vct=[];function Lct(e,t){if(!l(e.tileProvider.tilingScheme))return;let n=Vct;n.length=0;let i=e._tileToUpdateHeights,o=fi(),r=e._updateHeightsTimeSlice,s=o+r,a=t.mode,c=t.mapProjection,d=e.tileProvider.tilingScheme.ellipsoid,u;for(;i.length>0;){let m=i[0];if(!l(m.data)||!l(m.data.mesh)){let x=m._lastSelectionResultFrame===e._lastSelectionFrameNumber?m._lastSelectionResult:Kn.NONE;(x===Kn.RENDERED||x===Kn.CULLED_BUT_NEEDED)&&n.push(m),i.shift(),e._lastTileIndex=0;continue}let p=m.customData,g=p.length,f=!1;for(u=e._lastTileIndex;u<g;++u){let x=p[u],_=m.data.terrainData,C=l(_)&&_.wasCreatedByUpsampling();if(m.level>x.level&&!C){if(l(x.positionOnEllipsoidSurface)||(x.positionOnEllipsoidSurface=h.fromRadians(x.positionCartographic.longitude,x.positionCartographic.latitude,0,d)),a===oe.SCENE3D){let L=d.geodeticSurfaceNormal(x.positionOnEllipsoidSurface,jV.direction),Z=d.getSurfaceNormalIntersectionWithZAxis(x.positionOnEllipsoidSurface,11500,jV.origin);if(!l(Z)){let G=0;l(m.data.tileBoundingRegion)&&(G=m.data.tileBoundingRegion.minimumHeight);let X=Math.min(G,-11500),v=h.multiplyByScalar(L,Math.abs(X)+1,Sy);h.subtract(x.positionOnEllipsoidSurface,v,jV.origin)}}else he.clone(x.positionCartographic,Fj),Fj.height=-11500,c.project(Fj,Sy),h.fromElements(Sy.z,Sy.x,Sy.y,Sy),h.clone(Sy,jV.origin),h.clone(h.UNIT_X,jV.direction);let V=m.data.pick(jV,a,c,!1,Sy);l(V)&&(l(x.callback)&&x.callback(V),x.level=m.level)}if(fi()>=s){f=!0;break}}if(f){e._lastTileIndex=u;break}else e._lastTileIndex=0,i.shift()}for(u=0;u<n.length;u++)i.push(n[u])}function Rct(e,t){let n=e._tileProvider,i=e._tilesToRender;for(let o=0,r=i.length;o<r;++o){let s=i[o];n.showTileThisFrame(s,t)}}var eF=em;function Lh(e){e=y(e,ie.WGS84);let t=new qh({ellipsoid:e}),n=new zw;this._ellipsoid=e,this._imageryLayerCollection=n,this._surfaceShaderSet=new Iw,this._material=void 0,this._surface=new eF({tileProvider:new Ow({terrainProvider:t,imageryLayers:n,surfaceShaderSet:this._surfaceShaderSet})}),this._terrainProvider=t,this._terrainProviderChanged=new ge,this._undergroundColor=Y.clone(Y.BLACK),this._undergroundColorAlphaByDistance=new At(e.maximumRadius/1e3,0,e.maximumRadius/5,1),this._translucency=new Hw,Nj(this),this.show=!0,this._oceanNormalMapResourceDirty=!0,this._oceanNormalMapResource=new Ee({url:tn("Assets/Textures/waterNormalsSmall.jpg")}),this.maximumScreenSpaceError=2,this.tileCacheSize=100,this.loadingDescendantLimit=20,this.preloadAncestors=!0,this.preloadSiblings=!1,this.fillHighlightColor=void 0,this.enableLighting=!1,this.lambertDiffuseMultiplier=.9,this.dynamicAtmosphereLighting=!0,this.dynamicAtmosphereLightingFromSun=!1,this.showGroundAtmosphere=!0,this.atmosphereLightIntensity=10,this.atmosphereRayleighCoefficient=new h(55e-7,13e-6,284e-7),this.atmosphereMieCoefficient=new h(21e-6,21e-6,21e-6),this.atmosphereRayleighScaleHeight=1e4,this.atmosphereMieScaleHeight=3200,this.atmosphereMieAnisotropy=.9,this.lightingFadeOutDistance=1e7,this.lightingFadeInDistance=2e7,this.nightFadeOutDistance=1e7,this.nightFadeInDistance=5e7,this.showWaterEffect=!0,this.depthTestAgainstTerrain=!1,this.shadows=_n.RECEIVE_ONLY,this.atmosphereHueShift=0,this.atmosphereSaturationShift=0,this.atmosphereBrightnessShift=0,this.showSkirts=!0,this.backFaceCulling=!0,this._oceanNormalMap=void 0,this._zoomedOutOceanSpecularIntensity=void 0,this.vertexShadowDarkness=.3}Object.defineProperties(Lh.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},imageryLayers:{get:function(){return this._imageryLayerCollection}},imageryLayersUpdatedEvent:{get:function(){return this._surface.tileProvider.imageryLayersUpdatedEvent}},tilesLoaded:{get:function(){return l(this._surface)?this._surface._tileLoadQueueHigh.length===0&&this._surface._tileLoadQueueMedium.length===0&&this._surface._tileLoadQueueLow.length===0:!0}},baseColor:{get:function(){return this._surface.tileProvider.baseColor},set:function(e){this._surface.tileProvider.baseColor=e}},clippingPlanes:{get:function(){return this._surface.tileProvider.clippingPlanes},set:function(e){this._surface.tileProvider.clippingPlanes=e}},clippingPolygons:{get:function(){return this._surface.tileProvider.clippingPolygons},set:function(e){this._surface.tileProvider.clippingPolygons=e}},cartographicLimitRectangle:{get:function(){return this._surface.tileProvider.cartographicLimitRectangle},set:function(e){l(e)||(e=ce.clone(ce.MAX_VALUE)),this._surface.tileProvider.cartographicLimitRectangle=e}},oceanNormalMapUrl:{get:function(){return this._oceanNormalMapResource.url},set:function(e){this._oceanNormalMapResource.url=e,this._oceanNormalMapResourceDirty=!0}},terrainProvider:{get:function(){return this._terrainProvider},set:function(e){e!==this._terrainProvider&&(this._terrainProvider=e,this._terrainProviderChanged.raiseEvent(e),l(this._material)&&Nj(this))}},terrainProviderChanged:{get:function(){return this._terrainProviderChanged}},tileLoadProgressEvent:{get:function(){return this._surface.tileLoadProgressEvent}},material:{get:function(){return this._material},set:function(e){this._material!==e&&(this._material=e,Nj(this))}},undergroundColor:{get:function(){return this._undergroundColor},set:function(e){this._undergroundColor=Y.clone(e,this._undergroundColor)}},undergroundColorAlphaByDistance:{get:function(){return this._undergroundColorAlphaByDistance},set:function(e){this._undergroundColorAlphaByDistance=At.clone(e,this._undergroundColorAlphaByDistance)}},translucency:{get:function(){return this._translucency}}});function Nj(e){let t=[],n=l(e._material)&&(l(e._material.shaderSource.match(/slope/))||l(e._material.shaderSource.match("normalEC"))),i=[z0,wV];l(e._material)&&(!n||e._terrainProvider.requestVertexNormals)?(i.push(e._material.shaderSource),t.push("APPLY_MATERIAL"),e._surface._tileProvider.materialUniformMap=e._material._uniforms):e._surface._tileProvider.materialUniformMap=void 0,i.push(xw),e._surfaceShaderSet.baseVertexShaderSource=new Ye({sources:[z0,wV,_w],defines:t}),e._surfaceShaderSet.baseFragmentShaderSource=new Ye({sources:i,defines:t}),e._surfaceShaderSet.material=e._material}function Zct(e){return function(t,n){let i=le.distanceSquaredTo(t.pickBoundingSphere,e),o=le.distanceSquaredTo(n.pickBoundingSphere,e);return i-o}}var Gct=[],Ect={start:0,stop:0};Lh.prototype.pickWorldCoordinates=function(e,t,n,i){n=y(n,!0);let o=t.mode,r=t.mapProjection,s=Gct;s.length=0;let a=this._surface._tilesToRender,c=a.length,d,u;for(u=0;u<c;++u){d=a[u];let p=d.data;if(!l(p))continue;let g=p.pickBoundingSphere;if(o!==oe.SCENE3D)p.pickBoundingSphere=g=le.fromRectangleWithHeights2D(d.rectangle,r,p.tileBoundingRegion.minimumHeight,p.tileBoundingRegion.maximumHeight,g),h.fromElements(g.center.z,g.center.x,g.center.y,g.center);else if(l(p.renderedMesh))le.clone(p.tileBoundingRegion.boundingSphere,g);else continue;let f=jn.raySphere(e,g,Ect);l(f)&&s.push(p)}s.sort(Zct(e.origin));let m;for(c=s.length,u=0;u<c&&(m=s[u].pick(e,t.mode,t.mapProjection,n,i),!l(m));++u);return m};var Xct=new he;Lh.prototype.pick=function(e,t,n){if(n=this.pickWorldCoordinates(e,t,!0,n),l(n)&&t.mode!==oe.SCENE3D){n=h.fromElements(n.y,n.z,n.x,n);let i=t.mapProjection.unproject(n,Xct);n=t.globe.ellipsoid.cartographicToCartesian(i,n)}return n};var Ict=new h,uye=new h,Wct=new he,Pct=new pn;function Mj(e,t){return l(e)&&ce.contains(e.rectangle,t)?e:void 0}Lh.prototype.getHeight=function(e){let t=this._surface._levelZeroTiles;if(!l(t))return;let n,i,o=t.length;for(i=0;i<o&&(n=t[i],!ce.contains(n.rectangle,e));++i);if(i>=o)return;let r=n;for(;l(n);)n=Mj(n._southwestChild,e)||Mj(n._southeastChild,e)||Mj(n._northwestChild,e)||n._northeastChild,l(n)&&l(n.data)&&l(n.data.renderedMesh)&&(r=n);if(n=r,!l(n)||!l(n.data)||!l(n.data.renderedMesh))return;let s=this._surface._tileProvider.tilingScheme.projection,a=this._surface._tileProvider.tilingScheme.ellipsoid,c=h.fromRadians(e.longitude,e.latitude,0,a,Ict),d=Pct,u=a.geodeticSurfaceNormal(c,d.direction),m=a.getSurfaceNormalIntersectionWithZAxis(c,11500,d.origin);if(!l(m)){let g;l(n.data.tileBoundingRegion)&&(g=n.data.tileBoundingRegion.minimumHeight);let f=Math.min(y(g,0),-11500),x=h.multiplyByScalar(u,Math.abs(f)+1,uye);h.subtract(c,x,d.origin)}let p=n.data.pick(d,void 0,s,!1,uye);if(l(p))return a.cartesianToCartographic(p,Wct).height};Lh.prototype.update=function(e){this.show&&e.passes.render&&this._surface.update(e)};Lh.prototype.beginFrame=function(e){let t=this._surface,n=t.tileProvider,i=this.terrainProvider,o=this.showWaterEffect&&l(i)&&i.hasWaterMask&&i.hasWaterMask;if(o&&this._oceanNormalMapResourceDirty){this._oceanNormalMapResourceDirty=!1;let a=this._oceanNormalMapResource,c=a.url;if(l(c)){let d=this;a.fetchImage().then(function(u){c===d._oceanNormalMapResource.url&&(d._oceanNormalMap=d._oceanNormalMap&&d._oceanNormalMap.destroy(),d._oceanNormalMap=new Et({context:e.context,source:u}))})}else this._oceanNormalMap=this._oceanNormalMap&&this._oceanNormalMap.destroy()}let r=e.passes,s=e.mode;r.render&&(this.showGroundAtmosphere?this._zoomedOutOceanSpecularIntensity=.4:this._zoomedOutOceanSpecularIntensity=.5,t.maximumScreenSpaceError=this.maximumScreenSpaceError,t.tileCacheSize=this.tileCacheSize,t.loadingDescendantLimit=this.loadingDescendantLimit,t.preloadAncestors=this.preloadAncestors,t.preloadSiblings=this.preloadSiblings,n.terrainProvider=this.terrainProvider,n.lightingFadeOutDistance=this.lightingFadeOutDistance,n.lightingFadeInDistance=this.lightingFadeInDistance,n.nightFadeOutDistance=this.nightFadeOutDistance,n.nightFadeInDistance=this.nightFadeInDistance,n.zoomedOutOceanSpecularIntensity=s===oe.SCENE3D?this._zoomedOutOceanSpecularIntensity:0,n.hasWaterMask=o,n.oceanNormalMap=this._oceanNormalMap,n.enableLighting=this.enableLighting,n.dynamicAtmosphereLighting=this.dynamicAtmosphereLighting,n.dynamicAtmosphereLightingFromSun=this.dynamicAtmosphereLightingFromSun,n.showGroundAtmosphere=this.showGroundAtmosphere,n.atmosphereLightIntensity=this.atmosphereLightIntensity,n.atmosphereRayleighCoefficient=this.atmosphereRayleighCoefficient,n.atmosphereMieCoefficient=this.atmosphereMieCoefficient,n.atmosphereRayleighScaleHeight=this.atmosphereRayleighScaleHeight,n.atmosphereMieScaleHeight=this.atmosphereMieScaleHeight,n.atmosphereMieAnisotropy=this.atmosphereMieAnisotropy,n.shadows=this.shadows,n.hueShift=this.atmosphereHueShift,n.saturationShift=this.atmosphereSaturationShift,n.brightnessShift=this.atmosphereBrightnessShift,n.fillHighlightColor=this.fillHighlightColor,n.showSkirts=this.showSkirts,n.backFaceCulling=this.backFaceCulling,n.vertexShadowDarkness=this.vertexShadowDarkness,n.undergroundColor=this._undergroundColor,n.undergroundColorAlphaByDistance=this._undergroundColorAlphaByDistance,n.lambertDiffuseMultiplier=this.lambertDiffuseMultiplier,t.beginFrame(e))};Lh.prototype.render=function(e){this.show&&(l(this._material)&&this._material.update(e.context),this._surface.render(e))};Lh.prototype.endFrame=function(e){this.show&&e.passes.render&&this._surface.endFrame(e)};Lh.prototype.isDestroyed=function(){return!1};Lh.prototype.destroy=function(){return this._surfaceShaderSet=this._surfaceShaderSet&&this._surfaceShaderSet.destroy(),this._surface=this._surface&&this._surface.destroy(),this._oceanNormalMap=this._oceanNormalMap&&this._oceanNormalMap.destroy(),me(this)};var tF=Lh;var p2i=T(S(),1);var e2i=T(S(),1);var kj={position:0};function MD(e){e=y(e,y.EMPTY_OBJECT),this.center=h.clone(y(e.center,h.ZERO)),this._center=new h,this.radii=h.clone(e.radii),this._radii=new h,this._oneOverEllipsoidRadiiSquared=new h,this._boundingSphere=new le,this.modelMatrix=M.clone(y(e.modelMatrix,M.IDENTITY)),this._modelMatrix=new M,this._computedModelMatrix=new M,this.show=y(e.show,!0),this.material=y(e.material,Mi.fromType(Mi.ColorType)),this._material=void 0,this._translucent=void 0,this.id=e.id,this._id=void 0,this.debugShowBoundingVolume=y(e.debugShowBoundingVolume,!1),this.onlySunLighting=y(e.onlySunLighting,!1),this._onlySunLighting=!1,this._depthTestEnabled=y(e.depthTestEnabled,!0),this._useLogDepth=!1,this._sp=void 0,this._rs=void 0,this._va=void 0,this._pickSP=void 0,this._pickId=void 0,this._colorCommand=new et({owner:y(e._owner,this)}),this._pickCommand=new et({owner:y(e._owner,this),pickOnly:!0});let t=this;this._uniforms={u_radii:function(){return t.radii},u_oneOverEllipsoidRadiiSquared:function(){return t._oneOverEllipsoidRadiiSquared}},this._pickUniforms={czm_pickColor:function(){return t._pickId.color}}}function vct(e){let t=e.cache.ellipsoidPrimitive_vertexArray;if(l(t))return t;let n=yl.createGeometry(yl.fromDimensions({dimensions:new h(2,2,2),vertexFormat:We.POSITION_ONLY}));return t=ti.fromGeometry({context:e,geometry:n,attributeLocations:kj,bufferUsage:Ne.STATIC_DRAW,interleave:!0}),e.cache.ellipsoidPrimitive_vertexArray=t,t}MD.prototype.update=function(e){if(!this.show||e.mode!==oe.SCENE3D||!l(this.center)||!l(this.radii))return;let t=e.context,n=this.material.isTranslucent(),i=this._translucent!==n;(!l(this._rs)||i)&&(this._translucent=n,this._rs=De.fromCache({cull:{enabled:!0,face:bi.FRONT},depthTest:{enabled:this._depthTestEnabled},depthMask:!n&&t.fragmentDepth,blending:n?un.ALPHA_BLEND:void 0})),l(this._va)||(this._va=vct(t));let o=!1,r=this.radii;if(!h.equals(this._radii,r)){h.clone(r,this._radii);let x=this._oneOverEllipsoidRadiiSquared;x.x=1/(r.x*r.x),x.y=1/(r.y*r.y),x.z=1/(r.z*r.z),o=!0}(!M.equals(this.modelMatrix,this._modelMatrix)||!h.equals(this.center,this._center))&&(M.clone(this.modelMatrix,this._modelMatrix),h.clone(this.center,this._center),M.multiplyByTranslation(this.modelMatrix,this.center,this._computedModelMatrix),o=!0),o&&(h.clone(h.ZERO,this._boundingSphere.center),this._boundingSphere.radius=h.maximumComponent(r),le.transform(this._boundingSphere,this._computedModelMatrix,this._boundingSphere));let s=this._material!==this.material;this._material=this.material,this._material.update(t);let a=this.onlySunLighting!==this._onlySunLighting;this._onlySunLighting=this.onlySunLighting;let c=e.useLogDepth,d=this._useLogDepth!==c;this._useLogDepth=c;let u=this._colorCommand,m,p;(s||a||i||d)&&(m=new Ye({sources:[vV]}),p=new Ye({sources:[this.material.shaderSource,PV]}),this.onlySunLighting&&p.defines.push("ONLY_SUN_LIGHTING"),!n&&t.fragmentDepth&&p.defines.push("WRITE_DEPTH"),this._useLogDepth&&(m.defines.push("LOG_DEPTH"),p.defines.push("LOG_DEPTH")),this._sp=$t.replaceCache({context:t,shaderProgram:this._sp,vertexShaderSource:m,fragmentShaderSource:p,attributeLocations:kj}),u.vertexArray=this._va,u.renderState=this._rs,u.shaderProgram=this._sp,u.uniformMap=xt(this._uniforms,this.material._uniforms),u.executeInClosestFrustum=n);let g=e.commandList,f=e.passes;if(f.render&&(u.boundingVolume=this._boundingSphere,u.debugShowBoundingVolume=this.debugShowBoundingVolume,u.modelMatrix=this._computedModelMatrix,u.pass=n?Re.TRANSLUCENT:Re.OPAQUE,g.push(u)),f.pick){let x=this._pickCommand;(!l(this._pickId)||this._id!==this.id)&&(this._id=this.id,this._pickId=this._pickId&&this._pickId.destroy(),this._pickId=t.createPickId({primitive:this,id:this.id})),(s||a||!l(this._pickSP)||d)&&(m=new Ye({sources:[vV]}),p=new Ye({sources:[this.material.shaderSource,PV],pickColorQualifier:"uniform"}),this.onlySunLighting&&p.defines.push("ONLY_SUN_LIGHTING"),!n&&t.fragmentDepth&&p.defines.push("WRITE_DEPTH"),this._useLogDepth&&(m.defines.push("LOG_DEPTH"),p.defines.push("LOG_DEPTH")),this._pickSP=$t.replaceCache({context:t,shaderProgram:this._pickSP,vertexShaderSource:m,fragmentShaderSource:p,attributeLocations:kj}),x.vertexArray=this._va,x.renderState=this._rs,x.shaderProgram=this._pickSP,x.uniformMap=xt(xt(this._uniforms,this._pickUniforms),this.material._uniforms),x.executeInClosestFrustum=n),x.boundingVolume=this._boundingSphere,x.modelMatrix=this._computedModelMatrix,x.pass=n?Re.TRANSLUCENT:Re.OPAQUE,g.push(x)}};MD.prototype.isDestroyed=function(){return!1};MD.prototype.destroy=function(){return this._sp=this._sp&&this._sp.destroy(),this._pickSP=this._pickSP&&this._pickSP.destroy(),this._pickId=this._pickId&&this._pickId.destroy(),me(this)};var nF=MD;function iF(e){e=y(e,y.EMPTY_OBJECT);let t=e.textureUrl;l(t)||(t=tn("Assets/Textures/moonSmall.jpg")),this.show=y(e.show,!0),this.textureUrl=t,this._ellipsoid=y(e.ellipsoid,ie.MOON),this.onlySunLighting=y(e.onlySunLighting,!0),this._ellipsoidPrimitive=new nF({radii:this.ellipsoid.radii,material:Mi.fromType(Mi.ImageType),depthTestEnabled:!1,_owner:this}),this._ellipsoidPrimitive.material.translucent=!1,this._axes=new FR}Object.defineProperties(iF.prototype,{ellipsoid:{get:function(){return this._ellipsoid}}});var ND=new $,wct=new $,Fct=new h,kD=[];iF.prototype.update=function(e){if(!this.show)return;let t=this._ellipsoidPrimitive;t.material.uniforms.image=this.textureUrl,t.onlySunLighting=this.onlySunLighting;let n=e.time;l(Gt.computeIcrfToFixedMatrix(n,ND))||Gt.computeTemeToPseudoFixedMatrix(n,ND);let i=this._axes.evaluate(n,wct);$.transpose(i,i),$.multiply(ND,i,i);let o=ig.computeMoonPositionInEarthInertialFrame(n,Fct);$.multiplyByVector(ND,o,o),M.fromRotationTranslation(i,o,t.modelMatrix);let r=e.commandList;return e.commandList=kD,kD.length=0,t.update(e),e.commandList=r,kD.length===1?kD[0]:void 0};iF.prototype.isDestroyed=function(){return!1};iF.prototype.destroy=function(){return this._ellipsoidPrimitive=this._ellipsoidPrimitive&&this._ellipsoidPrimitive.destroy(),me(this)};var oF=iF;var oHi=T(S(),1);var T2i=T(S(),1);var g2i=T(S(),1),rF={NONE:0,SCENE_LIGHT:1,SUNLIGHT:2};rF.fromGlobeFlags=function(e){return e.enableLighting&&e.dynamicAtmosphereLighting?e.dynamicAtmosphereLightingFromSun?rF.SUNLIGHT:rF.SCENE_LIGHT:rF.NONE};var WT=Object.freeze(rF);function Act(){this.lightIntensity=10,this.rayleighCoefficient=new h(55e-7,13e-6,284e-7),this.mieCoefficient=new h(21e-6,21e-6,21e-6),this.rayleighScaleHeight=1e4,this.mieScaleHeight=3200,this.mieAnisotropy=.9,this.hueShift=0,this.saturationShift=0,this.brightnessShift=0,this.dynamicLighting=WT.NONE}var sF=Act;var P2i=T(S(),1);function aF(){this._colorTexture=void 0,this._drawCommand=void 0}Object.defineProperties(aF.prototype,{colorTexture:{get:function(){return this._colorTexture}}});function Mct(e,t,n){let i=t.createViewportQuadCommand(lw,{framebuffer:n,renderState:De.fromCache({viewport:new He(0,0,256,256)})});e._drawCommand=i}aF.prototype.update=function(e){if(!l(this._colorTexture)){let t=e.context,n=new Et({context:t,width:256,height:256,pixelFormat:at.RGBA,pixelDatatype:ze.UNSIGNED_BYTE,sampler:sn.NEAREST});this._colorTexture=n;let i=new ia({context:t,colorTextures:[n],destroyAttachments:!1});Mct(this,t,i),this._drawCommand.execute(t),i.destroy(),this._drawCommand.shaderProgram=this._drawCommand.shaderProgram&&this._drawCommand.shaderProgram.destroy()}};aF.prototype.isDestroyed=function(){return!1};aF.prototype.destroy=function(){return this._colorTexture=this._colorTexture&&this._colorTexture.destroy(),me(this)};var cF=aF;var CPi=T(S(),1);var O2i=T(S(),1);var pye={};function Nct(e,t,n){let i,o,r;if(e instanceof yi){let s=Math.tan(.5*e.fovy);return i=e.near,o=e.near*s,r=e.aspectRatio*o,Math.max(t*i/r,n*i/o)}else if(e instanceof Uc)return i=e.near,o=e.top,r=e.right,Math.max(t*i/r,n*i/o);return Math.max(t,n)}var kct=new h,mye=new h;function bye(e,t,n,i){if(l(i)&&n(.5)>i){let o=n(0),r=n(1),s=n(.5),a=s-o,c=s-r;return function(d){let u=n(d);if(d<=.5){let p=(u-o)/a;return W.lerp(e,-W.PI_OVER_TWO,p)}let m=(u-r)/c;return W.lerp(-W.PI_OVER_TWO,t,1-m)}}return function(o){return W.lerp(e,t,o)}}function Dj(e,t,n,i,o){let r=o,s=Math.max(n,i);if(!l(r)){let a=e.position,c=t,d=e.up,u=e.right,m=e.frustum,p=h.subtract(a,c,kct),g=h.magnitude(h.multiplyByScalar(d,h.dot(p,d),mye)),f=h.magnitude(h.multiplyByScalar(u,h.dot(p,u),mye));r=Math.min(Nct(m,g,f)*.2,1e9)}if(s<r){let d=-Math.pow((r-n)*1e6,.125),u=Math.pow((r-i)*1e6,1/8);return function(m){let p=m*(u-d)+d;return-Math.pow(p,8)/1e6+r}}return function(a){return W.lerp(n,i,a)}}function lF(e,t){return W.equalsEpsilon(e,W.TWO_PI,W.EPSILON11)&&(e=0),t>e+Math.PI?e+=W.TWO_PI:t<e-Math.PI&&(e-=W.TWO_PI),e}var gye=new h;function Uct(e,t,n,i,o,r,s,a){let c=e.camera,d=h.clone(c.position,gye),u=c.pitch,m=lF(c.heading,i),p=lF(c.roll,r),g=Dj(c,n,d.z,n.z,s),f=bye(u,o,g,a);function x(_){let C=_.time/t;c.setView({orientation:{heading:W.lerp(m,i,C),pitch:f(C),roll:W.lerp(p,r,C)}}),D.lerp(d,n,C,c.position),c.position.z=g(C)}return x}function Dct(e,t){e.longitude<t.longitude?e.longitude+=W.TWO_PI:t.longitude+=W.TWO_PI}function Bct(e,t){let n=e.longitude-t.longitude;n<-W.PI?e.longitude+=W.TWO_PI:n>W.PI&&(t.longitude+=W.TWO_PI)}var Yct=new he,Oct=new he;function Hct(e,t,n,i,o,r,s,a,c,d){let u=e.camera,p=e.mapProjection.ellipsoid,g=he.clone(u.positionCartographic,Yct),f=u.pitch,x=lF(u.heading,i),_=lF(u.roll,r),C=p.cartesianToCartographic(n,Oct);g.longitude=W.zeroToTwoPi(g.longitude),C.longitude=W.zeroToTwoPi(C.longitude);let V=!1;if(l(a)){let X=W.zeroToTwoPi(a),v=Math.min(g.longitude,C.longitude),P=Math.max(g.longitude,C.longitude),F=X>=v&&X<=P;if(l(c)){let A=Math.abs(g.longitude-C.longitude),b=W.TWO_PI-A;(F?A:b)<(F?b:A)*c&&!F&&(V=!0)}else F||(V=!0)}V?Dct(g,C):Bct(g,C);let L=Dj(u,n,g.height,C.height,s),Z=bye(f,o,L,d);function G(){let X=g.longitude,v=C.longitude,P=g.latitude,F=C.latitude;return function(b){let R=b.time/t,E=h.fromRadians(W.lerp(X,v,R),W.lerp(P,F,R),L(R),p);u.setView({destination:E,orientation:{heading:W.lerp(x,i,R),pitch:Z(R),roll:W.lerp(_,r,R)}})}}return G()}function zct(e,t,n,i,o,r,s){let a=e.camera,c=h.clone(a.position,gye),d=lF(a.heading,i),u=a.frustum.right-a.frustum.left,m=Dj(a,n,u,n.z,s);function p(g){let f=g.time/t;a.setView({orientation:{heading:W.lerp(d,i,f)}}),D.lerp(c,n,f,a.position);let x=m(f),_=a.frustum,C=_.top/_.right,V=(x-(_.right-_.left))*.5;_.right+=V,_.left-=V,_.top=C*_.right,_.bottom=-_.top}return p}var hye=new he,Kct=new h;function Uj(e,t){return{startObject:{},stopObject:{},duration:0,complete:e,cancel:t}}function fye(e,t){function n(){typeof t=="function"&&t(),e.enableInputs=!0}return n}pye.createTween=function(e,t){t=y(t,y.EMPTY_OBJECT);let n=t.destination,i=e.mode;if(i===oe.MORPHING)return Uj();let o=y(t.convert,!0),r=e.mapProjection,s=r.ellipsoid,a=t.maximumHeight,c=t.flyOverLongitude,d=t.flyOverLongitudeWeight,u=t.pitchAdjustHeight,m=t.easingFunction;o&&i!==oe.SCENE3D&&(s.cartesianToCartographic(n,hye),n=r.project(hye,Kct));let p=e.camera,g=t.endTransform;l(g)&&p._setTransform(g);let f=t.duration;l(f)||(f=Math.ceil(h.distance(p.position,n)/1e6)+2,f=Math.min(f,3));let x=y(t.heading,0),_=y(t.pitch,-W.PI_OVER_TWO),C=y(t.roll,0),V=e.screenSpaceCameraController;V.enableInputs=!1;let L=fye(V,t.complete),Z=fye(V,t.cancel),G=p.frustum,X=e.mode===oe.SCENE2D;if(X=X&&D.equalsEpsilon(p.position,n,W.EPSILON6),X=X&&W.equalsEpsilon(Math.max(G.right-G.left,G.top-G.bottom),n.z,W.EPSILON6),X=X||e.mode!==oe.SCENE2D&&h.equalsEpsilon(n,p.position,W.EPSILON10),X=X&&W.equalsEpsilon(W.negativePiToPi(x),W.negativePiToPi(p.heading),W.EPSILON10)&&W.equalsEpsilon(W.negativePiToPi(_),W.negativePiToPi(p.pitch),W.EPSILON10)&&W.equalsEpsilon(W.negativePiToPi(C),W.negativePiToPi(p.roll),W.EPSILON10),X)return Uj(L,Z);let v=new Array(4);if(v[oe.SCENE2D]=zct,v[oe.SCENE3D]=Hct,v[oe.COLUMBUS_VIEW]=Uct,f<=0)return Uj(function(){v[i](e,1,n,x,_,C,a,c,d,u)({time:1}),typeof L=="function"&&L()},Z);let P=v[i](e,f,n,x,_,C,a,c,d,u);if(!l(m)){let F=p.positionCartographic.height,A=i===oe.SCENE3D?s.cartesianToCartographic(n).height:n.z;F>A&&F>11500?m=Lr.CUBIC_OUT:m=Lr.QUINTIC_IN_OUT}return{duration:f,easingFunction:m,startObject:{time:0},stopObject:{time:f},update:P,complete:L,cancel:Z}};var dF=pye;var z2i=T(S(),1),Jct={ROTATE:0,INFINITE_SCROLL:1},Ql=Object.freeze(Jct);function en(e){this._scene=e,this._transform=M.clone(M.IDENTITY),this._invTransform=M.clone(M.IDENTITY),this._actualTransform=M.clone(M.IDENTITY),this._actualInvTransform=M.clone(M.IDENTITY),this._transformChanged=!1,this.position=new h,this._position=new h,this._positionWC=new h,this._positionCartographic=new he,this._oldPositionWC=void 0,this.positionWCDeltaMagnitude=0,this.positionWCDeltaMagnitudeLastFrame=0,this.timeSinceMoved=0,this._lastMovedTimestamp=0,this.direction=new h,this._direction=new h,this._directionWC=new h,this.up=new h,this._up=new h,this._upWC=new h,this.right=new h,this._right=new h,this._rightWC=new h,this.frustum=new yi,this.frustum.aspectRatio=e.drawingBufferWidth/e.drawingBufferHeight,this.frustum.fov=W.toRadians(60),this.defaultMoveAmount=1e5,this.defaultLookAmount=Math.PI/60,this.defaultRotateAmount=Math.PI/3600,this.defaultZoomAmount=1e5,this.constrainedAxis=void 0,this.maximumZoomFactor=1.5,this._moveStart=new ge,this._moveEnd=new ge,this._changed=new ge,this._changedPosition=void 0,this._changedDirection=void 0,this._changedFrustum=void 0,this._changedHeading=void 0,this._changedRoll=void 0,this.percentageChanged=.5,this._viewMatrix=new M,this._invViewMatrix=new M,Lye(this),this._mode=oe.SCENE3D,this._modeChanged=!0;let t=e.mapProjection;this._projection=t,this._maxCoord=t.project(new he(Math.PI,W.PI_OVER_TWO)),this._max2Dfrustum=void 0,Aye(this,en.DEFAULT_VIEW_RECTANGLE,this.position,!0);let n=h.magnitude(this.position);n+=n*en.DEFAULT_VIEW_FACTOR,h.normalize(this.position,this.position),h.multiplyByScalar(this.position,n,this.position)}en.TRANSFORM_2D=new M(0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,1);en.TRANSFORM_2D_INVERSE=M.inverseTransformation(en.TRANSFORM_2D,new M);en.DEFAULT_VIEW_RECTANGLE=ce.fromDegrees(-95,-20,-70,90);en.DEFAULT_VIEW_FACTOR=.5;en.DEFAULT_OFFSET=new fu(0,-W.PI_OVER_FOUR,0);function Lye(e){M.computeView(e._position,e._direction,e._up,e._right,e._viewMatrix),M.multiply(e._viewMatrix,e._actualInvTransform,e._viewMatrix),M.inverseTransformation(e._viewMatrix,e._invViewMatrix)}function Qct(e){if(!l(e._oldPositionWC))e._oldPositionWC=h.clone(e.positionWC,e._oldPositionWC);else{e.positionWCDeltaMagnitudeLastFrame=e.positionWCDeltaMagnitude;let t=h.subtract(e.positionWC,e._oldPositionWC,e._oldPositionWC);e.positionWCDeltaMagnitude=h.magnitude(t),e._oldPositionWC=h.clone(e.positionWC,e._oldPositionWC),e.positionWCDeltaMagnitude>0?(e.timeSinceMoved=0,e._lastMovedTimestamp=fi()):e.timeSinceMoved=Math.max(fi()-e._lastMovedTimestamp,0)/1e3}}en.prototype.canPreloadFlight=function(){return l(this._currentFlight)&&this._mode!==oe.SCENE2D};en.prototype._updateCameraChanged=function(){let e=this;if(Qct(e),e._changed.numberOfListeners===0)return;let t=e.percentageChanged,n=e.heading;l(e._changedHeading)||(e._changedHeading=n);let i=Math.abs(e._changedHeading-n)%W.TWO_PI;i=i>W.PI?W.TWO_PI-i:i;let o=i/Math.PI;o>t&&(e._changedHeading=n);let r=e.roll;l(e._changedRoll)||(e._changedRoll=r);let s=Math.abs(e._changedRoll-r)%W.TWO_PI;s=s>W.PI?W.TWO_PI-s:s;let a=s/Math.PI;if(a>t&&(e._changedRoll=r),(a>t||o>t)&&e._changed.raiseEvent(Math.max(a,o)),e._mode===oe.SCENE2D){if(!l(e._changedFrustum)){e._changedPosition=h.clone(e.position,e._changedPosition),e._changedFrustum=e.frustum.clone();return}let p=e.position,g=e._changedPosition,f=e.frustum,x=e._changedFrustum,_=p.x+f.left,C=p.x+f.right,V=g.x+x.left,L=g.x+x.right,Z=p.y+f.bottom,G=p.y+f.top,X=g.y+x.bottom,v=g.y+x.top,P=Math.max(_,V),F=Math.min(C,L),A=Math.max(Z,X),b=Math.min(G,v),R;if(P>=F||A>=G)R=1;else{let E=x;_<V&&C>L&&Z<X&&G>v&&(E=f),R=1-(F-P)*(b-A)/((E.right-E.left)*(E.top-E.bottom))}R>t&&(e._changed.raiseEvent(R),e._changedPosition=h.clone(e.position,e._changedPosition),e._changedFrustum=e.frustum.clone(e._changedFrustum));return}if(!l(e._changedDirection)){e._changedPosition=h.clone(e.positionWC,e._changedPosition),e._changedDirection=h.clone(e.directionWC,e._changedDirection);return}let c=W.acosClamped(h.dot(e.directionWC,e._changedDirection)),d;l(e.frustum.fovy)?d=c/(e.frustum.fovy*.5):d=c;let m=h.distance(e.positionWC,e._changedPosition)/e.positionCartographic.height;(d>t||m>t)&&(e._changed.raiseEvent(Math.max(d,m)),e._changedPosition=h.clone(e.positionWC,e._changedPosition),e._changedDirection=h.clone(e.directionWC,e._changedDirection))};function jct(e){Gt.basisTo2D(e._projection,e._transform,e._actualTransform)}var qct=new he,$ct=new h,UD=new h,elt=new se,tlt=new se,nlt=new se,ilt=new se,olt=new se;function rlt(e){let t=e._projection,n=t.ellipsoid,i=M.getColumn(e._transform,3,elt),o=n.cartesianToCartographic(i,qct),r=t.project(o,$ct),s=tlt;s.x=r.z,s.y=r.x,s.z=r.y,s.w=1;let a=se.clone(se.UNIT_X,olt),c=se.add(M.getColumn(e._transform,0,UD),i,UD);n.cartesianToCartographic(c,o),t.project(o,r);let d=nlt;d.x=r.z,d.y=r.x,d.z=r.y,d.w=0,h.subtract(d,s,d),d.x=0;let u=ilt;if(h.magnitudeSquared(d)>W.EPSILON10)h.cross(a,d,u);else{let m=se.add(M.getColumn(e._transform,1,UD),i,UD);n.cartesianToCartographic(m,o),t.project(o,r),u.x=r.z,u.y=r.x,u.z=r.y,u.w=0,h.subtract(u,s,u),u.x=0,h.magnitudeSquared(u)<W.EPSILON10&&(se.clone(se.UNIT_Y,d),se.clone(se.UNIT_Z,u))}h.cross(u,a,d),h.normalize(d,d),h.cross(a,d,u),h.normalize(u,u),M.setColumn(e._actualTransform,0,d,e._actualTransform),M.setColumn(e._actualTransform,1,u,e._actualTransform),M.setColumn(e._actualTransform,2,a,e._actualTransform),M.setColumn(e._actualTransform,3,s,e._actualTransform)}var Bj=new h;function Sc(e){let t=e._mode,n=!1,i=0;t===oe.SCENE2D&&(i=e.frustum.right-e.frustum.left,n=i!==e._positionCartographic.height);let o=e._position,r=!h.equals(o,e.position)||n;r&&(o=h.clone(e.position,e._position));let s=e._direction,a=!h.equals(s,e.direction);a&&(h.normalize(e.direction,e.direction),s=h.clone(e.direction,e._direction));let c=e._up,d=!h.equals(c,e.up);d&&(h.normalize(e.up,e.up),c=h.clone(e.up,e._up));let u=e._right,m=!h.equals(u,e.right);m&&(h.normalize(e.right,e.right),u=h.clone(e.right,e._right));let p=e._transformChanged||e._modeChanged;e._transformChanged=!1,p&&(M.inverseTransformation(e._transform,e._invTransform),e._mode===oe.COLUMBUS_VIEW||e._mode===oe.SCENE2D?M.equals(M.IDENTITY,e._transform)?M.clone(en.TRANSFORM_2D,e._actualTransform):e._mode===oe.COLUMBUS_VIEW?jct(e):rlt(e):M.clone(e._transform,e._actualTransform),M.inverseTransformation(e._actualTransform,e._actualInvTransform),e._modeChanged=!1);let g=e._actualTransform;if(r||p)if(e._positionWC=M.multiplyByPoint(g,o,e._positionWC),t===oe.SCENE3D||t===oe.MORPHING)e._positionCartographic=e._projection.ellipsoid.cartesianToCartographic(e._positionWC,e._positionCartographic);else{let f=Bj;f.x=e._positionWC.y,f.y=e._positionWC.z,f.z=e._positionWC.x,t===oe.SCENE2D&&(f.z=i),e._projection.unproject(f,e._positionCartographic)}if(a||d||m){let f=h.dot(s,h.cross(c,u,Bj));if(Math.abs(1-f)>W.EPSILON2){let x=1/h.magnitudeSquared(c),_=h.dot(c,s)*x,C=h.multiplyByScalar(s,_,Bj);c=h.normalize(h.subtract(c,C,e._up),e._up),h.clone(c,e.up),u=h.cross(s,c,e._right),h.clone(u,e.right)}}(a||p)&&(e._directionWC=M.multiplyByPointAsVector(g,s,e._directionWC),h.normalize(e._directionWC,e._directionWC)),(d||p)&&(e._upWC=M.multiplyByPointAsVector(g,c,e._upWC),h.normalize(e._upWC,e._upWC)),(m||p)&&(e._rightWC=M.multiplyByPointAsVector(g,u,e._rightWC),h.normalize(e._rightWC,e._rightWC)),(r||a||d||m||p)&&Lye(e)}function Rye(e,t){let n;return W.equalsEpsilon(Math.abs(e.z),1,W.EPSILON3)?n=Math.atan2(t.y,t.x)-W.PI_OVER_TWO:n=Math.atan2(e.y,e.x)-W.PI_OVER_TWO,W.TWO_PI-W.zeroToTwoPi(n)}function Zye(e){return W.PI_OVER_TWO-W.acosClamped(e.z)}function Gye(e,t,n){let i=0;return W.equalsEpsilon(Math.abs(e.z),1,W.EPSILON3)||(i=Math.atan2(-n.z,t.z),i=W.zeroToTwoPi(i+W.TWO_PI)),i}var YD=new M,OD=new M;Object.defineProperties(en.prototype,{transform:{get:function(){return this._transform}},inverseTransform:{get:function(){return Sc(this),this._invTransform}},viewMatrix:{get:function(){return Sc(this),this._viewMatrix}},inverseViewMatrix:{get:function(){return Sc(this),this._invViewMatrix}},positionCartographic:{get:function(){return Sc(this),this._positionCartographic}},positionWC:{get:function(){return Sc(this),this._positionWC}},directionWC:{get:function(){return Sc(this),this._directionWC}},upWC:{get:function(){return Sc(this),this._upWC}},rightWC:{get:function(){return Sc(this),this._rightWC}},heading:{get:function(){if(this._mode!==oe.MORPHING){let e=this._projection.ellipsoid,t=M.clone(this._transform,YD),n=Gt.eastNorthUpToFixedFrame(this.positionWC,e,OD);this._setTransform(n);let i=Rye(this.direction,this.up);return this._setTransform(t),i}}},pitch:{get:function(){if(this._mode!==oe.MORPHING){let e=this._projection.ellipsoid,t=M.clone(this._transform,YD),n=Gt.eastNorthUpToFixedFrame(this.positionWC,e,OD);this._setTransform(n);let i=Zye(this.direction);return this._setTransform(t),i}}},roll:{get:function(){if(this._mode!==oe.MORPHING){let e=this._projection.ellipsoid,t=M.clone(this._transform,YD),n=Gt.eastNorthUpToFixedFrame(this.positionWC,e,OD);this._setTransform(n);let i=Gye(this.direction,this.up,this.right);return this._setTransform(t),i}}},moveStart:{get:function(){return this._moveStart}},moveEnd:{get:function(){return this._moveEnd}},changed:{get:function(){return this._changed}}});en.prototype.update=function(e){let t=!1;if(e!==this._mode&&(this._mode=e,this._modeChanged=e!==oe.MORPHING,t=this._mode===oe.SCENE2D),t){let n=this._max2Dfrustum=this.frustum.clone(),i=2,o=n.top/n.right;n.right=this._maxCoord.x*i,n.left=-n.right,n.top=o*n.right,n.bottom=-n.top}this._mode===oe.SCENE2D&&Wye(this,this.position)};var slt=new h,alt=new h,clt=new h;en.prototype._setTransform=function(e){let t=h.clone(this.positionWC,slt),n=h.clone(this.upWC,alt),i=h.clone(this.directionWC,clt);M.clone(e,this._transform),this._transformChanged=!0,Sc(this);let o=this._actualInvTransform;M.multiplyByPoint(o,t,this.position),M.multiplyByPointAsVector(o,i,this.direction),M.multiplyByPointAsVector(o,n,this.up),h.cross(this.direction,this.up,this.right),Sc(this)};var llt=new D,dlt=new pn,ult=new h,mlt=new h;function Eye(e){if(!M.equals(M.IDENTITY,e.transform))return h.magnitude(e.position);let t=e._scene,n=t.globe,i=llt;i.x=t.drawingBufferWidth/2,i.y=t.drawingBufferHeight/2;let o;if(l(n)){let a=e.getPickRay(i,dlt);o=n.pickWorldCoordinates(a,t,!0,ult)}let r;t.pickPositionSupported&&(r=t.pickPositionWorldCoordinates(i,mlt));let s;if(l(o)||l(r)){let a=l(r)?h.distance(r,e.positionWC):Number.POSITIVE_INFINITY,c=l(o)?h.distance(o,e.positionWC):Number.POSITIVE_INFINITY;s=Math.min(a,c)}else s=Math.max(e.positionCartographic.height,0);return s}en.prototype._adjustOrthographicFrustum=function(e){this.frustum instanceof on&&(!e&&this._positionCartographic.height<15e4||(this.frustum.width=Eye(this)))};var HD=new h,Kj=new M,hlt=new M,Jj=new we,Qj=new $,Xye=new he;function flt(e,t,n){let i=M.clone(e.transform,Kj),o=Gt.eastNorthUpToFixedFrame(t,e._projection.ellipsoid,hlt);e._setTransform(o),h.clone(h.ZERO,e.position),n.heading=n.heading-W.PI_OVER_TWO;let r=we.fromHeadingPitchRoll(n,Jj),s=$.fromQuaternion(r,Qj);$.getColumn(s,0,e.direction),$.getColumn(s,2,e.up),h.cross(e.direction,e.up,e.right),e._setTransform(i),e._adjustOrthographicFrustum(!0)}function plt(e,t,n,i){let o=M.clone(e.transform,Kj);if(e._setTransform(M.IDENTITY),!h.equals(t,e.positionWC)){if(i){let a=e._projection,c=a.ellipsoid.cartesianToCartographic(t,Xye);t=a.project(c,HD)}h.clone(t,e.position)}n.heading=n.heading-W.PI_OVER_TWO;let r=we.fromHeadingPitchRoll(n,Jj),s=$.fromQuaternion(r,Qj);$.getColumn(s,0,e.direction),$.getColumn(s,2,e.up),h.cross(e.direction,e.up,e.right),e._setTransform(o),e._adjustOrthographicFrustum(!0)}function blt(e,t,n,i){let o=M.clone(e.transform,Kj);if(e._setTransform(M.IDENTITY),!h.equals(t,e.positionWC)){if(i){let c=e._projection,d=c.ellipsoid.cartesianToCartographic(t,Xye);t=c.project(d,HD)}D.clone(t,e.position);let r=-t.z*.5,s=-r,a=e.frustum;if(s>r){let c=a.top/a.right;a.right=s,a.left=r,a.top=a.right*c,a.bottom=-a.top}}if(e._scene.mapMode2D===Ql.ROTATE){n.heading=n.heading-W.PI_OVER_TWO,n.pitch=-W.PI_OVER_TWO,n.roll=0;let r=we.fromHeadingPitchRoll(n,Jj),s=$.fromQuaternion(r,Qj);$.getColumn(s,2,e.up),h.cross(e.direction,e.up,e.right)}e._setTransform(o)}var glt=new h,ylt=new h,xlt=new h;function Iye(e,t,n,i){let o=h.clone(n.direction,glt),r=h.clone(n.up,ylt);if(e._scene.mode===oe.SCENE3D){let a=e._projection.ellipsoid,c=Gt.eastNorthUpToFixedFrame(t,a,YD),d=M.inverseTransformation(c,OD);M.multiplyByPointAsVector(d,o,o),M.multiplyByPointAsVector(d,r,r)}let s=h.cross(o,r,xlt);return i.heading=Rye(o,r),i.pitch=Zye(o),i.roll=Gye(o,r,s),i}var zj={destination:void 0,orientation:{direction:void 0,up:void 0,heading:void 0,pitch:void 0,roll:void 0},convert:void 0,endTransform:void 0},qV=new za;en.prototype.setView=function(e){e=y(e,y.EMPTY_OBJECT);let t=y(e.orientation,y.EMPTY_OBJECT),n=this._mode;if(n===oe.MORPHING)return;l(e.endTransform)&&this._setTransform(e.endTransform);let i=y(e.convert,!0),o=y(e.destination,h.clone(this.positionWC,HD));l(o)&&l(o.west)&&(o=this.getRectangleCameraCoordinates(o,HD),i=!1),l(t.direction)&&(t=Iye(this,o,t,zj.orientation)),qV.heading=y(t.heading,0),qV.pitch=y(t.pitch,-W.PI_OVER_TWO),qV.roll=y(t.roll,0),n===oe.SCENE3D?flt(this,o,qV):n===oe.SCENE2D?blt(this,o,qV,i):plt(this,o,qV,i)};var _lt=new h;en.prototype.flyHome=function(e){let t=this._mode;if(t===oe.MORPHING&&this._scene.completeMorph(),t===oe.SCENE2D)this.flyTo({destination:en.DEFAULT_VIEW_RECTANGLE,duration:e,endTransform:M.IDENTITY});else if(t===oe.SCENE3D){let n=this.getRectangleCameraCoordinates(en.DEFAULT_VIEW_RECTANGLE),i=h.magnitude(n);i+=i*en.DEFAULT_VIEW_FACTOR,h.normalize(n,n),h.multiplyByScalar(n,i,n),this.flyTo({destination:n,duration:e,endTransform:M.IDENTITY})}else if(t===oe.COLUMBUS_VIEW){let n=this._projection.ellipsoid.maximumRadius,i=new h(0,-1,1);i=h.multiplyByScalar(h.normalize(i,i),5*n,i),this.flyTo({destination:i,duration:e,orientation:{heading:0,pitch:-Math.acos(h.normalize(i,_lt).z),roll:0},endTransform:M.IDENTITY,convert:!1})}};en.prototype.worldToCameraCoordinates=function(e,t){return l(t)||(t=new se),Sc(this),M.multiplyByVector(this._actualInvTransform,e,t)};en.prototype.worldToCameraCoordinatesPoint=function(e,t){return l(t)||(t=new h),Sc(this),M.multiplyByPoint(this._actualInvTransform,e,t)};en.prototype.worldToCameraCoordinatesVector=function(e,t){return l(t)||(t=new h),Sc(this),M.multiplyByPointAsVector(this._actualInvTransform,e,t)};en.prototype.cameraToWorldCoordinates=function(e,t){return l(t)||(t=new se),Sc(this),M.multiplyByVector(this._actualTransform,e,t)};en.prototype.cameraToWorldCoordinatesPoint=function(e,t){return l(t)||(t=new h),Sc(this),M.multiplyByPoint(this._actualTransform,e,t)};en.prototype.cameraToWorldCoordinatesVector=function(e,t){return l(t)||(t=new h),Sc(this),M.multiplyByPointAsVector(this._actualTransform,e,t)};function Wye(e,t){let n=e._scene.mapMode2D===Ql.ROTATE,i=e._maxCoord.x,o=e._maxCoord.y,r,s;n?(s=i,r=-s):(s=t.x-i*2,r=t.x+i*2),t.x>i&&(t.x=s),t.x<-i&&(t.x=r),t.y>o&&(t.y=o),t.y<-o&&(t.y=-o)}var yye=new h;en.prototype.move=function(e,t){let n=this.position;h.multiplyByScalar(e,t,yye),h.add(n,yye,n),this._mode===oe.SCENE2D&&Wye(this,n),this._adjustOrthographicFrustum(!0)};en.prototype.moveForward=function(e){e=y(e,this.defaultMoveAmount),this._mode===oe.SCENE2D?zD(this,e):this.move(this.direction,e)};en.prototype.moveBackward=function(e){e=y(e,this.defaultMoveAmount),this._mode===oe.SCENE2D?zD(this,-e):this.move(this.direction,-e)};en.prototype.moveUp=function(e){e=y(e,this.defaultMoveAmount),this.move(this.up,e)};en.prototype.moveDown=function(e){e=y(e,this.defaultMoveAmount),this.move(this.up,-e)};en.prototype.moveRight=function(e){e=y(e,this.defaultMoveAmount),this.move(this.right,e)};en.prototype.moveLeft=function(e){e=y(e,this.defaultMoveAmount),this.move(this.right,-e)};en.prototype.lookLeft=function(e){e=y(e,this.defaultLookAmount),this._mode!==oe.SCENE2D&&this.look(this.up,-e)};en.prototype.lookRight=function(e){e=y(e,this.defaultLookAmount),this._mode!==oe.SCENE2D&&this.look(this.up,e)};en.prototype.lookUp=function(e){e=y(e,this.defaultLookAmount),this._mode!==oe.SCENE2D&&this.look(this.right,-e)};en.prototype.lookDown=function(e){e=y(e,this.defaultLookAmount),this._mode!==oe.SCENE2D&&this.look(this.right,e)};var Tlt=new we,Slt=new $;en.prototype.look=function(e,t){let n=y(t,this.defaultLookAmount),i=we.fromAxisAngle(e,-n,Tlt),o=$.fromQuaternion(i,Slt),r=this.direction,s=this.up,a=this.right;$.multiplyByVector(o,r,r),$.multiplyByVector(o,s,s),$.multiplyByVector(o,a,a)};en.prototype.twistLeft=function(e){e=y(e,this.defaultLookAmount),this.look(this.direction,e)};en.prototype.twistRight=function(e){e=y(e,this.defaultLookAmount),this.look(this.direction,-e)};var Clt=new we,Vlt=new $;en.prototype.rotate=function(e,t){let n=y(t,this.defaultRotateAmount),i=we.fromAxisAngle(e,-n,Clt),o=$.fromQuaternion(i,Vlt);$.multiplyByVector(o,this.position,this.position),$.multiplyByVector(o,this.direction,this.direction),$.multiplyByVector(o,this.up,this.up),h.cross(this.direction,this.up,this.right),h.cross(this.right,this.direction,this.up),this._adjustOrthographicFrustum(!1)};en.prototype.rotateDown=function(e){e=y(e,this.defaultRotateAmount),Pye(this,e)};en.prototype.rotateUp=function(e){e=y(e,this.defaultRotateAmount),Pye(this,-e)};var Llt=new h,Rlt=new h,Zlt=new h,xye=new h;function Pye(e,t){let n=e.position;if(l(e.constrainedAxis)&&!h.equalsEpsilon(e.position,h.ZERO,W.EPSILON2)){let i=h.normalize(n,Llt),o=h.equalsEpsilon(i,e.constrainedAxis,W.EPSILON2),r=h.equalsEpsilon(i,h.negate(e.constrainedAxis,xye),W.EPSILON2);if(!o&&!r){let s=h.normalize(e.constrainedAxis,Rlt),a=h.dot(i,s),c=W.acosClamped(a);t>0&&t>c&&(t=c-W.EPSILON4),a=h.dot(i,h.negate(s,xye)),c=W.acosClamped(a),t<0&&-t>c&&(t=-c+W.EPSILON4);let d=h.cross(s,i,Zlt);e.rotate(d,t)}else(o&&t<0||r&&t>0)&&e.rotate(e.right,t)}else e.rotate(e.right,t)}en.prototype.rotateRight=function(e){e=y(e,this.defaultRotateAmount),vye(this,-e)};en.prototype.rotateLeft=function(e){e=y(e,this.defaultRotateAmount),vye(this,e)};function vye(e,t){l(e.constrainedAxis)?e.rotate(e.constrainedAxis,t):e.rotate(e.up,t)}function zD(e,t){let n=e.frustum,i;if(t=t*.5,Math.abs(n.top)+Math.abs(n.bottom)>Math.abs(n.left)+Math.abs(n.right)){let o=n.top-t,r=n.bottom+t,s=e._maxCoord.y;e._scene.mapMode2D===Ql.ROTATE&&(s*=e.maximumZoomFactor),r>s&&(r=s,o=-s),o<=r&&(o=1,r=-1),i=n.right/n.top,n.top=o,n.bottom=r,n.right=n.top*i,n.left=-n.right}else{let o=n.right-t,r=n.left+t,s=e._maxCoord.x;e._scene.mapMode2D===Ql.ROTATE&&(s*=e.maximumZoomFactor),o>s&&(o=s,r=-s),o<=r&&(o=1,r=-1),i=n.top/n.right,n.right=o,n.left=r,n.top=n.right*i,n.bottom=-n.top}}function wye(e,t){e.move(e.direction,t)}en.prototype.zoomIn=function(e){e=y(e,this.defaultZoomAmount),this._mode===oe.SCENE2D?zD(this,e):wye(this,e)};en.prototype.zoomOut=function(e){e=y(e,this.defaultZoomAmount),this._mode===oe.SCENE2D?zD(this,-e):wye(this,-e)};en.prototype.getMagnitude=function(){if(this._mode===oe.SCENE3D)return h.magnitude(this.position);if(this._mode===oe.COLUMBUS_VIEW)return Math.abs(this.position.z);if(this._mode===oe.SCENE2D)return Math.max(this.frustum.right-this.frustum.left,this.frustum.top-this.frustum.bottom)};var Glt=new M;en.prototype.lookAt=function(e,t){let n=Gt.eastNorthUpToFixedFrame(e,ie.WGS84,Glt);this.lookAtTransform(n,t)};var Elt=new h,Xlt=new we,Ilt=new we,Wlt=new $;function Fye(e,t,n){t=W.clamp(t,-W.PI_OVER_TWO,W.PI_OVER_TWO),e=W.zeroToTwoPi(e)-W.PI_OVER_TWO;let i=we.fromAxisAngle(h.UNIT_Y,-t,Xlt),o=we.fromAxisAngle(h.UNIT_Z,-e,Ilt),r=we.multiply(o,i,o),s=$.fromQuaternion(r,Wlt),a=h.clone(h.UNIT_X,Elt);return $.multiplyByVector(s,a,a),h.negate(a,a),h.multiplyByScalar(a,n,a),a}en.prototype.lookAtTransform=function(e,t){if(this._setTransform(e),!l(t))return;let n;if(l(t.heading)?n=Fye(t.heading,t.pitch,t.range):n=t,this._mode===oe.SCENE2D){D.clone(D.ZERO,this.position),h.negate(n,this.up),this.up.z=0,h.magnitudeSquared(this.up)<W.EPSILON10&&h.clone(h.UNIT_Y,this.up),h.normalize(this.up,this.up),this._setTransform(M.IDENTITY),h.negate(h.UNIT_Z,this.direction),h.cross(this.direction,this.up,this.right),h.normalize(this.right,this.right);let i=this.frustum,o=i.top/i.right;i.right=h.magnitude(n)*.5,i.left=-i.right,i.top=o*i.right,i.bottom=-i.top,this._setTransform(e);return}h.clone(n,this.position),h.negate(this.position,this.direction),h.normalize(this.direction,this.direction),h.cross(this.direction,h.UNIT_Z,this.right),h.magnitudeSquared(this.right)<W.EPSILON10&&h.clone(h.UNIT_X,this.right),h.normalize(this.right,this.right),h.cross(this.right,this.direction,this.up),h.normalize(this.up,this.up),this._adjustOrthographicFrustum(!0)};var uF=new he,Plt=new he,vlt=new h,wlt=new h,Flt=new h,Alt=new h,Mlt=new h,Nlt=new h,klt=new h,Yj=new h,Ult={direction:new h,right:new h,up:new h},_ye;function Tc(e,t,n,i){return Math.abs(h.dot(t,n))/i-h.dot(e,n)}function Aye(e,t,n,i){let o=e._projection.ellipsoid,r=i?e:Ult,s=t.north,a=t.south,c=t.east,d=t.west;d>c&&(c+=W.TWO_PI);let u=(d+c)*.5,m;if(a<-W.PI_OVER_TWO+W.RADIANS_PER_DEGREE&&s>W.PI_OVER_TWO-W.RADIANS_PER_DEGREE)m=0;else{let F=uF;F.longitude=u,F.latitude=s,F.height=0;let A=Plt;A.longitude=u,A.latitude=a,A.height=0;let b=_ye;(!l(b)||b.ellipsoid!==o)&&(_ye=b=new xp(void 0,void 0,o)),b.setEndPoints(F,A),m=b.interpolateUsingFraction(.5,uF).latitude}let p=uF;p.longitude=u,p.latitude=m,p.height=0;let g=o.cartographicToCartesian(p,klt),f=uF;f.longitude=c,f.latitude=s;let x=o.cartographicToCartesian(f,vlt);f.longitude=d;let _=o.cartographicToCartesian(f,Flt);f.longitude=u;let C=o.cartographicToCartesian(f,Mlt);f.latitude=a;let V=o.cartographicToCartesian(f,Nlt);f.longitude=c;let L=o.cartographicToCartesian(f,Alt);f.longitude=d;let Z=o.cartographicToCartesian(f,wlt);h.subtract(_,g,_),h.subtract(L,g,L),h.subtract(x,g,x),h.subtract(Z,g,Z),h.subtract(C,g,C),h.subtract(V,g,V);let G=o.geodeticSurfaceNormal(g,r.direction);h.negate(G,G);let X=h.cross(G,h.UNIT_Z,r.right);h.normalize(X,X);let v=h.cross(X,G,r.up),P;if(e.frustum instanceof on){let F=Math.max(h.distance(x,_),h.distance(L,Z)),A=Math.max(h.distance(x,L),h.distance(_,Z)),b,R,E=e.frustum._offCenterFrustum,I=E.right/E.top,w=A*I;F>w?(b=F,R=b/I):(R=A,b=w),P=Math.max(b,R)}else{let F=Math.tan(e.frustum.fovy*.5),A=e.frustum.aspectRatio*F;if(P=Math.max(Tc(G,v,_,F),Tc(G,v,L,F),Tc(G,v,x,F),Tc(G,v,Z,F),Tc(G,v,C,F),Tc(G,v,V,F),Tc(G,X,_,A),Tc(G,X,L,A),Tc(G,X,x,A),Tc(G,X,Z,A),Tc(G,X,C,A),Tc(G,X,V,A)),a<0&&s>0){let b=uF;b.longitude=d,b.latitude=0,b.height=0;let R=o.cartographicToCartesian(b,Yj);h.subtract(R,g,R),P=Math.max(P,Tc(G,v,R,F),Tc(G,X,R,A)),b.longitude=c,R=o.cartographicToCartesian(b,Yj),h.subtract(R,g,R),P=Math.max(P,Tc(G,v,R,F),Tc(G,X,R,A))}}return h.add(g,h.multiplyByScalar(G,-P,Yj),n)}var Dlt=new he,Blt=new h,Ylt=new h;function Olt(e,t,n){let i=e._projection;t.west>t.east&&(t=ce.MAX_VALUE);let o=e._actualTransform,r=e._actualInvTransform,s=Dlt;s.longitude=t.east,s.latitude=t.north;let a=i.project(s,Blt);M.multiplyByPoint(o,a,a),M.multiplyByPoint(r,a,a),s.longitude=t.west,s.latitude=t.south;let c=i.project(s,Ylt);if(M.multiplyByPoint(o,c,c),M.multiplyByPoint(r,c,c),n.x=(a.x-c.x)*.5+c.x,n.y=(a.y-c.y)*.5+c.y,l(e.frustum.fovy)){let d=Math.tan(e.frustum.fovy*.5),u=e.frustum.aspectRatio*d;n.z=Math.max((a.x-c.x)/u,(a.y-c.y)/d)*.5}else{let d=a.x-c.x,u=a.y-c.y;n.z=Math.max(d,u)}return n}var Hlt=new he,zlt=new h,Klt=new h;function Jlt(e,t,n){let i=e._projection,o=t.east;t.west>t.east&&(e._scene.mapMode2D===Ql.INFINITE_SCROLL?o+=W.TWO_PI:(t=ce.MAX_VALUE,o=t.east));let r=Hlt;r.longitude=o,r.latitude=t.north;let s=i.project(r,zlt);r.longitude=t.west,r.latitude=t.south;let a=i.project(r,Klt),c=Math.abs(s.x-a.x)*.5,d=Math.abs(s.y-a.y)*.5,u,m,p=e.frustum.right/e.frustum.top,g=d*p;return c>g?(u=c,m=u/p):(m=d,u=g),d=Math.max(2*u,2*m),n.x=(s.x-a.x)*.5+a.x,n.y=(s.y-a.y)*.5+a.y,r=i.unproject(n,r),r.height=d,n=i.project(r,n),n}en.prototype.getRectangleCameraCoordinates=function(e,t){let n=this._mode;if(l(t)||(t=new h),n===oe.SCENE3D)return Aye(this,e,t);if(n===oe.COLUMBUS_VIEW)return Olt(this,e,t);if(n===oe.SCENE2D)return Jlt(this,e,t)};var Qlt=new pn;function jlt(e,t,n,i){n=y(n,ie.WGS84);let o=e.getPickRay(t,Qlt),r=jn.rayEllipsoid(o,n);if(!r)return;let s=r.start>0?r.start:r.stop;return pn.getPoint(o,s,i)}var qlt=new pn;function $lt(e,t,n,i){let r=e.getPickRay(t,qlt).origin;r=h.fromElements(r.y,r.z,0,r);let s=n.unproject(r);if(!(s.latitude<-W.PI_OVER_TWO||s.latitude>W.PI_OVER_TWO))return n.ellipsoid.cartographicToCartesian(s,i)}var edt=new pn;function tdt(e,t,n,i){let o=e.getPickRay(t,edt),r=-o.origin.x/o.direction.x;pn.getPoint(o,r,i);let s=n.unproject(new h(i.y,i.z,0));if(!(s.latitude<-W.PI_OVER_TWO||s.latitude>W.PI_OVER_TWO||s.longitude<-Math.PI||s.longitude>Math.PI))return n.ellipsoid.cartographicToCartesian(s,i)}en.prototype.pickEllipsoid=function(e,t,n){let i=this._scene.canvas;if(!(i.clientWidth===0||i.clientHeight===0)){if(l(n)||(n=new h),t=y(t,ie.WGS84),this._mode===oe.SCENE3D)n=jlt(this,e,t,n);else if(this._mode===oe.SCENE2D)n=$lt(this,e,this._projection,n);else if(this._mode===oe.COLUMBUS_VIEW)n=tdt(this,e,this._projection,n);else return;return n}};var ndt=new h,idt=new h,odt=new h;function rdt(e,t,n){let i=e._scene.canvas,o=i.clientWidth,r=i.clientHeight,s=Math.tan(e.frustum.fovy*.5),a=e.frustum.aspectRatio*s,c=e.frustum.near,d=2/o*t.x-1,u=2/r*(r-t.y)-1,m=e.positionWC;h.clone(m,n.origin);let p=h.multiplyByScalar(e.directionWC,c,ndt);h.add(m,p,p);let g=h.multiplyByScalar(e.rightWC,d*c*a,idt),f=h.multiplyByScalar(e.upWC,u*c*s,odt),x=h.add(p,g,n.direction);return h.add(x,f,x),h.subtract(x,m,x),h.normalize(x,x),n}var DD=new h;function sdt(e,t,n){let i=e._scene.canvas,o=i.clientWidth,r=i.clientHeight,s=e.frustum,a=s.offCenterFrustum;l(a)&&(s=a);let c=2/o*t.x-1;c*=(s.right-s.left)*.5;let d=2/r*(r-t.y)-1;d*=(s.top-s.bottom)*.5;let u=n.origin;return h.clone(e.position,u),h.multiplyByScalar(e.right,c,DD),h.add(DD,u,u),h.multiplyByScalar(e.up,d,DD),h.add(DD,u,u),h.clone(e.directionWC,n.direction),(e._mode===oe.COLUMBUS_VIEW||e._mode===oe.SCENE2D)&&h.fromElements(n.origin.z,n.origin.x,n.origin.y,n.origin),n}en.prototype.getPickRay=function(e,t){l(t)||(t=new pn);let n=this._scene.canvas;if(n.clientWidth<=0||n.clientHeight<=0)return;let i=this.frustum;return l(i.aspectRatio)&&l(i.fov)&&l(i.near)?rdt(this,e,t):sdt(this,e,t)};var adt=new h,cdt=new h;en.prototype.distanceToBoundingSphere=function(e){let t=h.subtract(this.positionWC,e.center,adt),n=h.multiplyByScalar(this.directionWC,h.dot(t,this.directionWC),cdt);return Math.max(0,h.magnitude(n)-e.radius)};var ldt=new D;en.prototype.getPixelSize=function(e,t,n){let i=this.distanceToBoundingSphere(e),o=this.frustum.getPixelDimensions(t,n,i,this._scene.pixelRatio,ldt);return Math.max(o.x,o.y)};function ddt(e,t,n,i,o,r){let s=h.clone(t);n.y>i?s.y-=n.y-i:n.y<-i&&(s.y+=-i-n.y),n.z>o?s.z-=n.z-o:n.z<-o&&(s.z+=-o-n.z);function a(c){let d=h.lerp(t,s,c.time,new h);e.worldToCameraCoordinatesPoint(d,e.position)}return{easingFunction:Lr.EXPONENTIAL_OUT,startObject:{time:0},stopObject:{time:1},duration:r,update:a}}var udt=new h,Tye=new h,mdt=new h,hdt=new h;function fdt(e,t){let n=e.position,i=e.direction,o=e.worldToCameraCoordinatesVector(h.UNIT_X,udt),r=-h.dot(o,n)/h.dot(o,i),s=h.add(n,h.multiplyByScalar(i,r,Tye),Tye);e.cameraToWorldCoordinatesPoint(s,s),n=e.cameraToWorldCoordinatesPoint(e.position,mdt);let a=Math.tan(e.frustum.fovy*.5),c=e.frustum.aspectRatio*a,d=h.magnitude(h.subtract(n,s,hdt)),u=c*d,m=a*d,p=e._maxCoord.x,g=e._maxCoord.y,f=Math.max(u-p,p),x=Math.max(m-g,g);if(n.z<-f||n.z>f||n.y<-x||n.y>x){let _=s.y<-f||s.y>f,C=s.z<-x||s.z>x;if(_||C)return ddt(e,n,s,f,x,t)}}en.prototype.createCorrectPositionTween=function(e){if(this._mode===oe.COLUMBUS_VIEW)return fdt(this,e)};var pdt=new h,Hs={destination:void 0,heading:void 0,pitch:void 0,roll:void 0,duration:void 0,complete:void 0,cancel:void 0,endTransform:void 0,maximumHeight:void 0,easingFunction:void 0};en.prototype.cancelFlight=function(){l(this._currentFlight)&&(this._currentFlight.cancelTween(),this._currentFlight=void 0)};en.prototype.completeFlight=function(){if(l(this._currentFlight)){this._currentFlight.cancelTween();let e={destination:void 0,orientation:{heading:void 0,pitch:void 0,roll:void 0}};e.destination=Hs.destination,e.orientation.heading=Hs.heading,e.orientation.pitch=Hs.pitch,e.orientation.roll=Hs.roll,this.setView(e),l(this._currentFlight.complete)&&this._currentFlight.complete(),this._currentFlight=void 0}};en.prototype.flyTo=function(e){e=y(e,y.EMPTY_OBJECT);let t=e.destination;if(this._mode===oe.MORPHING)return;this.cancelFlight();let i=t instanceof ce;i&&(t=this.getRectangleCameraCoordinates(t,pdt));let o=y(e.orientation,y.EMPTY_OBJECT);if(l(o.direction)&&(o=Iye(this,t,o,zj.orientation)),l(e.duration)&&e.duration<=0){let u=zj;u.destination=e.destination,u.orientation.heading=o.heading,u.orientation.pitch=o.pitch,u.orientation.roll=o.roll,u.convert=e.convert,u.endTransform=e.endTransform,this.setView(u),typeof e.complete=="function"&&e.complete();return}let r=this,s;Hs.destination=t,Hs.heading=o.heading,Hs.pitch=o.pitch,Hs.roll=o.roll,Hs.duration=e.duration,Hs.complete=function(){s===r._currentFlight&&(r._currentFlight=void 0),l(e.complete)&&e.complete()},Hs.cancel=e.cancel,Hs.endTransform=e.endTransform,Hs.convert=i?!1:e.convert,Hs.maximumHeight=e.maximumHeight,Hs.pitchAdjustHeight=e.pitchAdjustHeight,Hs.flyOverLongitude=e.flyOverLongitude,Hs.flyOverLongitudeWeight=e.flyOverLongitudeWeight,Hs.easingFunction=e.easingFunction;let a=this._scene,c=dF.createTween(a,Hs);if(c.duration===0){typeof c.complete=="function"&&c.complete();return}s=a.tweens.add(c),this._currentFlight=s;let d=this._scene.preloadFlightCamera;this._mode!==oe.SCENE2D&&(l(d)||(d=en.clone(this)),d.setView({destination:t,orientation:o}),this._scene.preloadFlightCullingVolume=d.frustum.computeCullingVolume(d.positionWC,d.directionWC,d.upWC))};function bdt(e,t){let n=e.frustum,i=Math.tan(n.fovy*.5),o=n.aspectRatio*i;return Math.max(t/o,t/i)}function gdt(e,t){let n=e.frustum,i=n.offCenterFrustum;l(i)&&(n=i);let o,r,s=n.right/n.top,a=t*s;return t>a?(o=t,r=o/s):(r=t,o=a),Math.max(o,r)*1.5}var ydt=100;function Mye(e,t,n){n=fu.clone(l(n)?n:en.DEFAULT_OFFSET);let i=e._scene.screenSpaceCameraController.minimumZoomDistance,o=e._scene.screenSpaceCameraController.maximumZoomDistance,r=n.range;if(!l(r)||r===0){let s=t.radius;s===0?n.range=ydt:e.frustum instanceof on||e._mode===oe.SCENE2D?n.range=gdt(e,s):n.range=bdt(e,s),n.range=W.clamp(n.range,i,o)}return n}en.prototype.viewBoundingSphere=function(e,t){t=Mye(this,e,t),this.lookAt(e.center,t)};var xdt=new M,_dt=new h,Tdt=new h,Sdt=new h,Cdt=new h,Vdt=new se,Ldt=new we,Rdt=new $;en.prototype.flyToBoundingSphere=function(e,t){t=y(t,y.EMPTY_OBJECT);let n=this._mode===oe.SCENE2D||this._mode===oe.COLUMBUS_VIEW;this._setTransform(M.IDENTITY);let i=Mye(this,e,t.offset),o;n?o=h.multiplyByScalar(h.UNIT_Z,i.range,_dt):o=Fye(i.heading,i.pitch,i.range);let r=Gt.eastNorthUpToFixedFrame(e.center,ie.WGS84,xdt);M.multiplyByPoint(r,o,o);let s,a;if(!n){if(s=h.subtract(e.center,o,Tdt),h.normalize(s,s),a=M.multiplyByPointAsVector(r,h.UNIT_Z,Sdt),1-Math.abs(h.dot(s,a))<W.EPSILON6){let d=we.fromAxisAngle(s,i.heading,Ldt),u=$.fromQuaternion(d,Rdt);h.fromCartesian4(M.getColumn(r,1,Vdt),a),$.multiplyByVector(u,a,a)}let c=h.cross(s,a,Cdt);h.cross(c,s,a),h.normalize(a,a)}this.flyTo({destination:o,orientation:{direction:s,up:a},duration:t.duration,complete:t.complete,cancel:t.cancel,endTransform:t.endTransform,maximumHeight:t.maximumHeight,easingFunction:t.easingFunction,flyOverLongitude:t.flyOverLongitude,flyOverLongitudeWeight:t.flyOverLongitudeWeight,pitchAdjustHeight:t.pitchAdjustHeight})};var Sye=new h,Cye=new h,Oj=new h,Vye=new h,mF=[new h,new h,new h,new h];function Zdt(e,t){let n=t.radii,i=e.positionWC,o=h.multiplyComponents(t.oneOverRadii,i,Sye),r=h.magnitude(o),s=h.normalize(o,Cye),a,c;h.equalsEpsilon(s,h.UNIT_Z,W.EPSILON10)?(a=new h(0,1,0),c=new h(0,0,1)):(a=h.normalize(h.cross(h.UNIT_Z,s,Oj),Oj),c=h.normalize(h.cross(s,a,Vye),Vye));let d=Math.sqrt(h.magnitudeSquared(o)-1),u=h.multiplyByScalar(s,1/r,Sye),m=d/r,p=h.multiplyByScalar(a,m,Cye),g=h.multiplyByScalar(c,m,Oj),f=h.add(u,g,mF[0]);h.subtract(f,p,f),h.multiplyComponents(n,f,f);let x=h.subtract(u,g,mF[1]);h.subtract(x,p,x),h.multiplyComponents(n,x,x);let _=h.subtract(u,g,mF[2]);h.add(_,p,_),h.multiplyComponents(n,_,_);let C=h.add(u,g,mF[3]);return h.add(C,p,C),h.multiplyComponents(n,C,C),mF}var Hj=new D,Gdt=new h,Cy=[new he,new he,new he,new he];function BD(e,t,n,i,o,r){Hj.x=e,Hj.y=t;let s=i.pickEllipsoid(Hj,o,Gdt);return l(s)?(Cy[n]=o.cartesianToCartographic(s,Cy[n]),1):(Cy[n]=o.cartesianToCartographic(r[n],Cy[n]),0)}en.prototype.computeViewRectangle=function(e,t){e=y(e,ie.WGS84);let n=this.frustum.computeCullingVolume(this.positionWC,this.directionWC,this.upWC),i=new le(h.ZERO,e.maximumRadius);if(n.computeVisibility(i)===Kt.OUTSIDE)return;let r=this._scene.canvas,s=r.clientWidth,a=r.clientHeight,c=0,d=Zdt(this,e);if(c+=BD(0,0,0,this,e,d),c+=BD(0,a,1,this,e,d),c+=BD(s,a,2,this,e,d),c+=BD(s,0,3,this,e,d),c<2)return ce.MAX_VALUE;t=ce.fromCartographicArray(Cy,t);let u=0,m=Cy[3].longitude;for(let p=0;p<4;++p){let g=Cy[p].longitude,f=Math.abs(g-m);f>W.PI?u+=W.TWO_PI-f:u+=f,m=g}return W.equalsEpsilon(Math.abs(u),W.TWO_PI,W.EPSILON9)&&(t.west=-W.PI,t.east=W.PI,Cy[0].latitude>=0?t.north=W.PI_OVER_TWO:t.south=-W.PI_OVER_TWO),t};en.prototype.switchToPerspectiveFrustum=function(){if(this._mode===oe.SCENE2D||this.frustum instanceof yi)return;let e=this._scene;this.frustum=new yi,this.frustum.aspectRatio=e.drawingBufferWidth/e.drawingBufferHeight,this.frustum.fov=W.toRadians(60)};en.prototype.switchToOrthographicFrustum=function(){if(this._mode===oe.SCENE2D||this.frustum instanceof on)return;let e=Eye(this),t=this._scene;this.frustum=new on,this.frustum.aspectRatio=t.drawingBufferWidth/t.drawingBufferHeight,this.frustum.width=e};en.clone=function(e,t){return l(t)||(t=new en(e._scene)),h.clone(e.position,t.position),h.clone(e.direction,t.direction),h.clone(e.up,t.up),h.clone(e.right,t.right),M.clone(e._transform,t.transform),t._transformChanged=!0,t.frustum=e.frustum.clone(),t};var ao=en;var LPi=T(S(),1);function Edt(e){this.pass=e.pass,this.commandList=e.commandList,this.camera=e.camera,this.cullingVolume=e.cullingVolume,this.ready=!1}var tm=Edt;var PPi=T(S(),1);var Bye=T(id(),1),Nye=576,Xdt=100,hF="#ffffff",jj="#48b";function Yye(e,t){this.credit=e,this.count=y(t,1)}function Idt(e,t){let n=e.length;for(let i=0;i<n;i++){let o=e[i];if(Ct.equals(o,t))return!0}return!1}function Wdt(e){let t=e._previousCesiumCredit,n=e._currentCesiumCredit;Ct.equals(n,t)||(l(t)&&e._cesiumCreditContainer.removeChild(t.element),l(n)&&e._cesiumCreditContainer.appendChild(n.element),e._previousCesiumCredit=n)}var Oye="cesium-credit-delimiter";function kye(e){let t=document.createElement("span");return t.textContent=e,t.className=Oye,t}function Uye(e,t){if(l(t)){let n=document.createElement(t);n._creditId=e._creditId,n.appendChild(e),e=n}return e}function Dye(e,t,n,i){let o=e.childNodes,r=-1;t.sort(function(s,a){return a.count-s.count});for(let s=0;s<t.length;++s){let a=t[s].credit;if(l(a)){if(r=s,l(n)&&(r*=2,s>0)){let d=r-1;if(o.length<=d)e.appendChild(kye(n));else{let u=o[d];u.className!==Oye&&e.replaceChild(kye(n),u)}}let c=a.element;if(o.length<=r)e.appendChild(Uye(c,i));else{let d=o[r];d._creditId!==a._id&&e.replaceChild(Uye(c,i),d)}}}for(++r;r<o.length;)e.removeChild(o[r])}function Pdt(e){let t=e._lightboxCredits,n=e.viewport.clientWidth,i=e.viewport.clientHeight;n!==e._lastViewportWidth&&(n<Nye?(t.className="cesium-credit-lightbox cesium-credit-lightbox-mobile",t.style.marginTop="0"):(t.className="cesium-credit-lightbox cesium-credit-lightbox-expanded",t.style.marginTop=`${Math.floor((i-t.clientHeight)*.5)}px`),e._lastViewportWidth=n),n>=Nye&&i!==e._lastViewportHeight&&(t.style.marginTop=`${Math.floor((i-t.clientHeight)*.5)}px`,e._lastViewportHeight=i)}function Cc(e,t){let n=`${e} {`;for(let i in t)t.hasOwnProperty(i)&&(n+=`${i}: ${t[i]}; `);return n+=` } `,n}function vdt(e){let t="";t+=Cc(".cesium-credit-lightbox-overlay",{display:"none","z-index":"1",position:"absolute",top:"0",left:"0",width:"100%",height:"100%","background-color":"rgba(80, 80, 80, 0.8)"}),t+=Cc(".cesium-credit-lightbox",{"background-color":"#303336",color:hF,position:"relative","min-height":`${Xdt}px`,margin:"auto"}),t+=Cc(".cesium-credit-lightbox > ul > li a, .cesium-credit-lightbox > ul > li a:visited",{color:hF}),t+=Cc(".cesium-credit-lightbox > ul > li a:hover",{color:jj}),t+=Cc(".cesium-credit-lightbox.cesium-credit-lightbox-expanded",{border:"1px solid #444","border-radius":"5px","max-width":"370px"}),t+=Cc(".cesium-credit-lightbox.cesium-credit-lightbox-mobile",{height:"100%",width:"100%"}),t+=Cc(".cesium-credit-lightbox-title",{padding:"20px 20px 0 20px"}),t+=Cc(".cesium-credit-lightbox-close",{"font-size":"18pt",cursor:"pointer",position:"absolute",top:"0",right:"6px",color:hF}),t+=Cc(".cesium-credit-lightbox-close:hover",{color:jj}),t+=Cc(".cesium-credit-lightbox > ul",{margin:"0",padding:"12px 20px 12px 40px","font-size":"13px"}),t+=Cc(".cesium-credit-lightbox > ul > li",{"padding-bottom":"6px"}),t+=Cc(".cesium-credit-lightbox > ul > li *",{padding:"0",margin:"0"}),t+=Cc(".cesium-credit-expand-link",{"padding-left":"5px",cursor:"pointer","text-decoration":"underline",color:hF}),t+=Cc(".cesium-credit-expand-link:hover",{color:jj}),t+=Cc(".cesium-credit-text",{color:hF}),t+=Cc(".cesium-credit-textContainer *, .cesium-credit-logoContainer *",{display:"inline"});function n(r){if(r.shadowRoot)return r.shadowRoot;if(r.getRootNode){let s=r.getRootNode();if(s instanceof ShadowRoot)return s}}let i=y(n(e),document.head),o=document.createElement("style");o.innerHTML=t,i.appendChild(o)}function lr(e,t,n){let i=this;n=y(n,document.body);let o=document.createElement("div");o.className="cesium-credit-lightbox-overlay",n.appendChild(o);let r=document.createElement("div");r.className="cesium-credit-lightbox",o.appendChild(r);function s(f){r.contains(f.target)||i.hideLightbox()}o.addEventListener("click",s,!1);let a=document.createElement("div");a.className="cesium-credit-lightbox-title",a.textContent="Data provided by:",r.appendChild(a);let c=document.createElement("a");c.onclick=this.hideLightbox.bind(this),c.innerHTML="×",c.className="cesium-credit-lightbox-close",r.appendChild(c);let d=document.createElement("ul");r.appendChild(d);let u=document.createElement("div");u.className="cesium-credit-logoContainer",u.style.display="inline",e.appendChild(u);let m=document.createElement("div");m.className="cesium-credit-textContainer",m.style.display="inline",e.appendChild(m);let p=document.createElement("a");p.className="cesium-credit-expand-link",p.onclick=this.showLightbox.bind(this),p.textContent="Data attribution",e.appendChild(p),vdt(e);let g=Ct.clone(lr.cesiumCredit);this._delimiter=y(t," \u2022 "),this._screenContainer=m,this._cesiumCreditContainer=u,this._lastViewportHeight=void 0,this._lastViewportWidth=void 0,this._lightboxCredits=r,this._creditList=d,this._lightbox=o,this._hideLightbox=s,this._expandLink=p,this._expanded=!1,this._staticCredits=[],this._cesiumCredit=g,this._previousCesiumCredit=void 0,this._currentCesiumCredit=g,this._creditDisplayElementPool=[],this._creditDisplayElementIndex=0,this._currentFrameCredits={screenCredits:new Vt,lightboxCredits:new Vt},this._defaultCredit=void 0,this.viewport=n,this.container=e}function Hye(e,t,n,i){i=y(i,1);let o=t.get(n.id);if(l(o))o.count<Number.MAX_VALUE&&(o.count+=i);else{let r=e._creditDisplayElementPool,s=e._creditDisplayElementPoolIndex;s<r.length?(o=r[s],o.credit=n,o.count=i):(o=new Yye(n,i),r.push(o)),++e._creditDisplayElementPoolIndex,t.set(n.id,o)}}lr.prototype.addCreditToNextFrame=function(e){if(e.isIon()){l(this._defaultCredit)||(this._defaultCredit=Ct.clone(zye())),this._currentCesiumCredit=this._defaultCredit;return}let t;e.showOnScreen?t=this._currentFrameCredits.screenCredits:t=this._currentFrameCredits.lightboxCredits,Hye(this,t,e)};lr.prototype.addStaticCredit=function(e){let t=this._staticCredits;Idt(t,e)||t.push(e)};lr.prototype.removeStaticCredit=function(e){let t=this._staticCredits,n=t.indexOf(e);n!==-1&&t.splice(n,1)};lr.prototype.showLightbox=function(){this._lightbox.style.display="block",this._expanded=!0};lr.prototype.hideLightbox=function(){this._lightbox.style.display="none",this._expanded=!1};lr.prototype.update=function(){this._expanded&&Pdt(this)};lr.prototype.beginFrame=function(){let e=this._currentFrameCredits;this._creditDisplayElementPoolIndex=0;let t=e.screenCredits,n=e.lightboxCredits;t.removeAll(),n.removeAll();let i=this._staticCredits;for(let o=0;o<i.length;++o){let r=i[o],s=r.showOnScreen?t:n;r.isIon()&&Ct.equals(lr.cesiumCredit,this._cesiumCredit)||Hye(this,s,r,Number.MAX_VALUE)}Ct.equals(lr.cesiumCredit,this._cesiumCredit)||(this._cesiumCredit=Ct.clone(lr.cesiumCredit)),this._currentCesiumCredit=this._cesiumCredit};lr.prototype.endFrame=function(){let e=this._currentFrameCredits.screenCredits.values;Dye(this._screenContainer,e,this._delimiter,void 0);let t=this._currentFrameCredits.lightboxCredits.values;this._expandLink.style.display=t.length>0?"inline":"none",Dye(this._creditList,t,void 0,"li"),Wdt(this)};lr.prototype.destroy=function(){return this._lightbox.removeEventListener("click",this._hideLightbox,!1),this.container.removeChild(this._cesiumCreditContainer),this.container.removeChild(this._screenContainer),this.container.removeChild(this._expandLink),this.viewport.removeChild(this._lightbox),me(this)};lr.prototype.isDestroyed=function(){return!1};lr._cesiumCredit=void 0;lr._cesiumCreditInitialized=!1;var KD;function zye(){if(!l(KD)){let e=tn("Assets/Images/ion-credit.png");e.indexOf("http://")!==0&&e.indexOf("https://")!==0&&e.indexOf("data:")!==0&&(e=new Bye.default(e).path()),KD=new Ct(`<a href="https://cesium.com/" target="_blank"><img src="${e}" title="Cesium ion"/></a>`,!0)}return lr._cesiumCreditInitialized||(lr._cesiumCredit=KD,lr._cesiumCreditInitialized=!0),KD}Object.defineProperties(lr,{cesiumCredit:{get:function(){return zye(),lr._cesiumCredit},set:function(e){lr._cesiumCredit=e,lr._cesiumCreditInitialized=!0}}});lr.CreditDisplayElement=Yye;var fF=lr;var qPi=T(S(),1);function JD(e){e=y(e,y.EMPTY_OBJECT),this._camera=e.camera,this._frustumSplits=e.frustumSplits,this._color=y(e.color,Y.CYAN),this._updateOnChange=y(e.updateOnChange,!0),this.show=y(e.show,!0),this.id=e.id,this._id=void 0,this._outlinePrimitives=[],this._planesPrimitives=[]}var wdt=new h,Fdt=new $,Adt=new we,Mdt=new yi,Ndt=new Uc,kdt=new on,Udt=new Zr,Ddt=new Y,Bdt=[1,1e5];JD.prototype.update=function(e){if(!this.show)return;let t=this._planesPrimitives,n=this._outlinePrimitives,i,o;if(this._updateOnChange){for(o=t.length,i=0;i<o;++i)n[i]=n[i]&&n[i].destroy(),t[i]=t[i]&&t[i].destroy();t.length=0,n.length=0}if(t.length===0){let r=this._camera,s=r.frustum,a;s instanceof yi?a=Mdt:s instanceof Uc?a=Ndt:s instanceof on?a=kdt:a=Udt,a=s.clone(a);let c,d=this._frustumSplits;!l(d)||d.length<=1?(d=Bdt,d[0]=this._camera.frustum.near,d[1]=this._camera.frustum.far,c=1):c=d.length-1;let u=r.positionWC,m=r.directionWC,p=r.upWC,g=r.rightWC;g=h.negate(g,wdt);let f=Fdt;$.setColumn(f,0,g,f),$.setColumn(f,1,p,f),$.setColumn(f,2,m,f);let x=we.fromRotationMatrix(f,Adt);for(t.length=n.length=c,i=0;i<c;++i)a.near=d[i],a.far=d[i+1],t[i]=new En({geometryInstances:new St({geometry:new Cx({origin:u,orientation:x,frustum:a,_drawNearPlane:i===0}),attributes:{color:Ht.fromColor(Y.fromAlpha(this._color,.1,Ddt))},id:this.id,pickPrimitive:this}),appearance:new dn({translucent:!0,flat:!0}),asynchronous:!1}),n[i]=new En({geometryInstances:new St({geometry:new XR({origin:u,orientation:x,frustum:a,_drawNearPlane:i===0}),attributes:{color:Ht.fromColor(this._color)},id:this.id,pickPrimitive:this}),appearance:new dn({translucent:!1,flat:!0}),asynchronous:!1})}for(o=t.length,i=0;i<o;++i)n[i].update(e),t[i].update(e)};JD.prototype.isDestroyed=function(){return!1};JD.prototype.destroy=function(){let e=this._planesPrimitives.length;for(let t=0;t<e;++t)this._outlinePrimitives[t]=this._outlinePrimitives[t]&&this._outlinePrimitives[t].destroy(),this._planesPrimitives[t]=this._planesPrimitives[t]&&this._planesPrimitives[t].destroy();return me(this)};var Df=JD;var Tvi=T(S(),1);function bF(e){this._rs=void 0,this._sp=void 0,this._va=void 0,this._command=void 0,this._mode=void 0,this._useLogDepth=!1,this._ellipsoidOffset=y(e,0)}var pF=Yt.supportsTypedArrays()?new Float32Array(12):[],Kye=new h,Jye=new h,qj=new h,Qye=new h,QD=new h;function Ydt(e,t){let n=e.radii,i=t.camera,o,r,s;if(i.frustum instanceof on)o=h.ZERO,r=i.rightWC,s=i.upWC;else{let m=i.positionWC,p=h.multiplyComponents(e.oneOverRadii,m,Kye),g=h.normalize(p,Jye),f=h.normalize(h.cross(h.UNIT_Z,p,qj),qj),x=h.normalize(h.cross(g,f,Qye),Qye),_=h.magnitude(p),C=Math.sqrt(_*_-1);o=h.multiplyByScalar(g,1/_,Kye);let V=C/_;r=h.multiplyByScalar(f,V,Jye),s=h.multiplyByScalar(x,V,qj)}let a=h.add(o,s,QD);h.subtract(a,r,a),h.multiplyComponents(n,a,a),h.pack(a,pF,0);let c=h.subtract(o,s,QD);h.subtract(c,r,c),h.multiplyComponents(n,c,c),h.pack(c,pF,3);let d=h.add(o,s,QD);h.add(d,r,d),h.multiplyComponents(n,d,d),h.pack(d,pF,6);let u=h.subtract(o,s,QD);return h.add(u,r,u),h.multiplyComponents(n,u,u),h.pack(u,pF,9),pF}bF.prototype.update=function(e){if(this._mode=e.mode,e.mode!==oe.SCENE3D)return;let t=e.context,n=e.mapProjection.ellipsoid.radii,i=new ie(n.x+this._ellipsoidOffset,n.y+this._ellipsoidOffset,n.z+this._ellipsoidOffset),o=e.useLogDepth;if(l(this._command)||(this._rs=De.fromCache({cull:{enabled:!0},depthTest:{enabled:!0},colorMask:{red:!1,green:!1,blue:!1,alpha:!1}}),this._command=new et({renderState:this._rs,boundingVolume:new le(h.ZERO,i.maximumRadius),pass:Re.OPAQUE,owner:this})),!l(this._sp)||this._useLogDepth!==o){this._useLogDepth=o;let s=new Ye({sources:[gw]}),a=new Ye({sources:[bw]});o&&(a.defines.push("LOG_DEPTH"),s.defines.push("LOG_DEPTH")),this._sp=$t.replaceCache({shaderProgram:this._sp,context:t,vertexShaderSource:s,fragmentShaderSource:a,attributeLocations:{position:0}}),this._command.shaderProgram=this._sp}let r=Ydt(i,e);if(l(this._va))this._va.getAttribute(0).vertexBuffer.copyFromArrayView(r);else{let s=new ut({attributes:{position:new Ge({componentDatatype:Q.FLOAT,componentsPerAttribute:3,values:r})},indices:[0,1,2,2,1,3],primitiveType:Fe.TRIANGLES});this._va=ti.fromGeometry({context:t,geometry:s,attributeLocations:{position:0},bufferUsage:Ne.DYNAMIC_DRAW}),this._command.vertexArray=this._va}};bF.prototype.execute=function(e,t){this._mode===oe.SCENE3D&&this._command.execute(e,t)};bF.prototype.isDestroyed=function(){return!1};bF.prototype.destroy=function(){this._sp=this._sp&&this._sp.destroy(),this._va=this._va&&this._va.destroy()};var gF=bF;var Zvi=T(S(),1);function yF(){}var Odt=/\bgl_FragDepth\b/,Hdt=/\bdiscard\b/;function zdt(e,t){let n=e.shaderCache.getDerivedShaderProgram(t,"depthOnly");if(!l(n)){let i=t._attributeLocations,o=t.fragmentShaderSource,r,s=!1,a=o.sources,c=a.length;for(r=0;r<c;++r)if(Odt.test(a[r])||Hdt.test(a[r])){s=!0;break}let d=!1,u=o.defines;for(c=u.length,r=0;r<c;++r)if(u[r]==="LOG_DEPTH"){d=!0;break}let m;!s&&!d?(m=`void main() { out_FragColor = vec4(1.0); } `,o=new Ye({sources:[m]})):!s&&d&&(m=`void main() { out_FragColor = vec4(1.0); czm_writeLogDepth(); } `,o=new Ye({defines:["LOG_DEPTH"],sources:[m]})),n=e.shaderCache.createDerivedShaderProgram(t,"depthOnly",{vertexShaderSource:t.vertexShaderSource,fragmentShaderSource:o,attributeLocations:i})}return n}function Kdt(e,t){let n=e._depthOnlyRenderStateCache,i=n[t.id];if(!l(i)){let o=De.getState(t);o.depthMask=!0,o.colorMask={red:!1,green:!1,blue:!1,alpha:!1},i=De.fromCache(o),n[t.id]=i}return i}yF.createDepthOnlyDerivedCommand=function(e,t,n,i){l(i)||(i={});let o,r;return l(i.depthOnlyCommand)&&(o=i.depthOnlyCommand.shaderProgram,r=i.depthOnlyCommand.renderState),i.depthOnlyCommand=et.shallowClone(t,i.depthOnlyCommand),!l(o)||i.shaderProgramId!==t.shaderProgram.id?(i.depthOnlyCommand.shaderProgram=zdt(n,t.shaderProgram),i.depthOnlyCommand.renderState=Kdt(e,t.renderState),i.shaderProgramId=t.shaderProgram.id):(i.depthOnlyCommand.shaderProgram=o,i.depthOnlyCommand.renderState=r),i};var Jdt=/\s+czm_writeLogDepth\(/,Qdt=/\s+czm_vertexLogDepth\(/;function jdt(e,t){if(t.fragmentShaderSource.defines.indexOf("LOG_DEPTH_READ_ONLY")>=0)return t;let i=e.shaderCache.getDerivedShaderProgram(t,"logDepth");if(!l(i)){let o=t._attributeLocations,r=t.vertexShaderSource.clone(),s=t.fragmentShaderSource.clone();r.defines=l(r.defines)?r.defines.slice(0):[],r.defines.push("LOG_DEPTH"),s.defines=l(s.defines)?s.defines.slice(0):[],s.defines.push("LOG_DEPTH");let a,c,d=!1,u=r.sources,m=u.length;for(a=0;a<m;++a)if(Qdt.test(u[a])){d=!0;break}if(!d){for(a=0;a<m;++a)u[a]=Ye.replaceMain(u[a],"czm_log_depth_main");c=` void main() { czm_log_depth_main(); czm_vertexLogDepth(); } `,u.push(c)}for(u=s.sources,m=u.length,d=!1,a=0;a<m;++a)Jdt.test(u[a])&&(d=!0);s.defines.indexOf("LOG_DEPTH_WRITE")!==-1&&(d=!0);let p="";if(!d){for(a=0;a<m;a++)u[a]=Ye.replaceMain(u[a],"czm_log_depth_main");p+=` void main() { czm_log_depth_main(); czm_writeLogDepth(); } `}u.push(p),i=e.shaderCache.createDerivedShaderProgram(t,"logDepth",{vertexShaderSource:r,fragmentShaderSource:s,attributeLocations:o})}return i}yF.createLogDepthCommand=function(e,t,n){l(n)||(n={});let i;return l(n.command)&&(i=n.command.shaderProgram),n.command=et.shallowClone(e,n.command),!l(i)||n.shaderProgramId!==e.shaderProgram.id?(n.command.shaderProgram=jdt(t,e.shaderProgram),n.shaderProgramId=e.shaderProgram.id):n.command.shaderProgram=i,n};function qdt(e,t,n){let i=e.shaderCache.getDerivedShaderProgram(t,"pick");if(!l(i)){let o=t._attributeLocations,r=t.fragmentShaderSource,s=r.sources,a=s.length,d=s.some(p=>p.includes("out_FragData"))?"out_FragData_0":"out_FragColor",u=`void main () { czm_non_pick_main(); if (${d}.a == 0.0) { discard; } ${d} = ${n}; } `,m=new Array(a+1);for(let p=0;p<a;++p)m[p]=Ye.replaceMain(s[p],"czm_non_pick_main");m[a]=u,r=new Ye({sources:m,defines:r.defines}),i=e.shaderCache.createDerivedShaderProgram(t,"pick",{vertexShaderSource:t.vertexShaderSource,fragmentShaderSource:r,attributeLocations:o})}return i}function $dt(e,t){let n=e.picking.pickRenderStateCache,i=n[t.id];if(!l(i)){let o=De.getState(t);o.blending.enabled=!1,o.depthMask=!0,i=De.fromCache(o),n[t.id]=i}return i}yF.createPickDerivedCommand=function(e,t,n,i){l(i)||(i={});let o,r;return l(i.pickCommand)&&(o=i.pickCommand.shaderProgram,r=i.pickCommand.renderState),i.pickCommand=et.shallowClone(t,i.pickCommand),!l(o)||i.shaderProgramId!==t.shaderProgram.id?(i.pickCommand.shaderProgram=qdt(n,t.shaderProgram,t.pickId),i.pickCommand.renderState=$dt(e,t.renderState),i.shaderProgramId=t.shaderProgram.id):(i.pickCommand.shaderProgram=o,i.pickCommand.renderState=r),i};function eut(e,t){let n=e.shaderCache.getDerivedShaderProgram(t,"HDR");if(!l(n)){let i=t._attributeLocations,o=t.vertexShaderSource.clone(),r=t.fragmentShaderSource.clone();o.defines=l(o.defines)?o.defines.slice(0):[],o.defines.push("HDR"),r.defines=l(r.defines)?r.defines.slice(0):[],r.defines.push("HDR"),n=e.shaderCache.createDerivedShaderProgram(t,"HDR",{vertexShaderSource:o,fragmentShaderSource:r,attributeLocations:i})}return n}yF.createHdrCommand=function(e,t,n){l(n)||(n={});let i;return l(n.command)&&(i=n.command.shaderProgram),n.command=et.shallowClone(e,n.command),!l(i)||n.shaderProgramId!==e.shaderProgram.id?(n.command.shaderProgram=eut(t,e.shaderProgram),n.shaderProgramId=e.shaderProgram.id):n.command.shaderProgram=i,n};var eb=yF;var vvi=T(S(),1);function jD(e){this._scene=e,this._lastAlpha=void 0,this._lastBeta=void 0,this._lastGamma=void 0,this._alpha=void 0,this._beta=void 0,this._gamma=void 0;let t=this;function n(i){let o=i.alpha;if(!l(o)){t._alpha=void 0,t._beta=void 0,t._gamma=void 0;return}t._alpha=W.toRadians(o),t._beta=W.toRadians(i.beta),t._gamma=W.toRadians(i.gamma)}window.addEventListener("deviceorientation",n,!1),this._removeListener=function(){window.removeEventListener("deviceorientation",n,!1)}}var tut=new we,jye=new we,nut=new $;function iut(e,t,n,i){let o=e.direction,r=e.right,s=e.up,a=we.fromAxisAngle(o,n,jye),c=we.fromAxisAngle(r,i,tut),d=we.multiply(c,a,c),u=we.fromAxisAngle(s,t,jye);we.multiply(u,d,d);let m=$.fromQuaternion(d,nut);$.multiplyByVector(m,r,r),$.multiplyByVector(m,s,s),$.multiplyByVector(m,o,o)}jD.prototype.update=function(){if(!l(this._alpha))return;l(this._lastAlpha)||(this._lastAlpha=this._alpha,this._lastBeta=this._beta,this._lastGamma=this._gamma);let e=this._lastAlpha-this._alpha,t=this._lastBeta-this._beta,n=this._lastGamma-this._gamma;iut(this._scene.camera,-e,t,n),this._lastAlpha=this._alpha,this._lastBeta=this._beta,this._lastGamma=this._gamma};jD.prototype.isDestroyed=function(){return!1};jD.prototype.destroy=function(){return this._removeListener(),me(this)};var xF=jD;var kvi=T(S(),1);function qye(){this.enabled=!0,this.renderable=!0,this.density=2e-4,this.screenSpaceErrorFactor=2,this.minimumBrightness=.03}var qD=[359.393,800.749,1275.6501,2151.1192,3141.7763,4777.5198,6281.2493,12364.307,15900.765,49889.0549,78026.8259,99260.7344,120036.3873,151011.0158,156091.1953,203849.3112,274866.9803,319916.3149,493552.0528,628733.5874],Bf=[2e-5,2e-4,1e-4,7e-5,5e-5,4e-5,3e-5,19e-6,1e-5,85e-7,62e-7,58e-7,53e-7,52e-7,51e-7,42e-7,4e-6,34e-7,26e-7,22e-7];for(let e=0;e<Bf.length;++e)Bf[e]*=1e6;var $ye=Bf[1],$j=Bf[Bf.length-1];for(let e=0;e<Bf.length;++e)Bf[e]=(Bf[e]-$j)/($ye-$j);var ha=0;function out(e){let t=qD,n=t.length;if(e<t[0])return ha=0,ha;if(e>t[n-1])return ha=n-2,ha;if(e>=t[ha]){if(ha+1<n&&e<t[ha+1])return ha;if(ha+2<n&&e<t[ha+2])return++ha,ha}else if(ha-1>=0&&e>=t[ha-1])return--ha,ha;let i;for(i=0;i<n-2&&!(e>=t[i]&&e<t[i+1]);++i);return ha=i,ha}var rut=new h;qye.prototype.update=function(e){if(!(e.fog.enabled=this.enabled))return;e.fog.renderable=this.renderable;let n=e.camera,i=n.positionCartographic;if(!l(i)||i.height>8e5||e.mode!==oe.SCENE3D){e.fog.enabled=!1,e.fog.density=0;return}let o=i.height,r=out(o),s=W.clamp((o-qD[r])/(qD[r+1]-qD[r]),0,1),a=W.lerp(Bf[r],Bf[r+1],s),c=this.density*1e6,d=c/$ye*$j;a=a*(c-d)*1e-6;let u=h.normalize(n.positionWC,rut),m=Math.abs(h.dot(n.directionWC,u));a*=1-m,e.fog.density=a,e.fog.sse=this.screenSpaceErrorFactor,e.fog.minimumBrightness=this.minimumBrightness};var _F=qye;var Bvi=T(S(),1);function sut(e,t,n){this.context=e,this.commandList=[],this.shadowMaps=[],this.brdfLutGenerator=void 0,this.environmentMap=void 0,this.sphericalHarmonicCoefficients=void 0,this.specularEnvironmentMaps=void 0,this.specularEnvironmentMapsMaximumLOD=void 0,this.mode=oe.SCENE3D,this.morphTime=oe.getMorphTime(oe.SCENE3D),this.frameNumber=0,this.newFrame=!1,this.time=void 0,this.jobScheduler=n,this.mapProjection=void 0,this.camera=void 0,this.cameraUnderground=!1,this.globeTranslucencyState=void 0,this.cullingVolume=void 0,this.occluder=void 0,this.maximumScreenSpaceError=void 0,this.pixelRatio=1,this.passes={render:!1,pick:!1,pickVoxel:!1,depth:!1,postProcess:!1,offscreen:!1},this.creditDisplay=t,this.afterRender=[],this.scene3DOnly=!1,this.fog={enabled:!1,renderable:!1,density:void 0,sse:void 0,minimumBrightness:void 0},this.atmosphere=void 0,this.verticalExaggeration=1,this.verticalExaggerationRelativeHeight=0,this.shadowState={shadowsEnabled:!0,shadowMaps:[],lightShadowMaps:[],nearPlane:1,farPlane:5e3,closestObjectSize:1e3,lastDirtyTime:0,outOfView:!0},this.splitPosition=0,this.frustumSplits=[],this.backgroundColor=void 0,this.light=void 0,this.minimumDisableDepthTestDistance=void 0,this.invertClassification=!1,this.invertClassificationColor=void 0,this.useLogDepth=!1,this.tilesetPassState=void 0,this.minimumTerrainHeight=0}var TF=sut;var iwi=T(S(),1);var fa={OPAQUE_FRONT_FACE:0,OPAQUE_BACK_FACE:1,DEPTH_ONLY_FRONT_FACE:2,DEPTH_ONLY_BACK_FACE:3,DEPTH_ONLY_FRONT_AND_BACK_FACE:4,TRANSLUCENT_FRONT_FACE:5,TRANSLUCENT_BACK_FACE:6,TRANSLUCENT_FRONT_FACE_MANUAL_DEPTH_TEST:7,TRANSLUCENT_BACK_FACE_MANUAL_DEPTH_TEST:8,PICK_FRONT_FACE:9,PICK_BACK_FACE:10,DERIVED_COMMANDS_MAXIMUM_LENGTH:11},PT=fa.DERIVED_COMMANDS_MAXIMUM_LENGTH,lxe=["opaqueFrontFaceCommand","opaqueBackFaceCommand","depthOnlyFrontFaceCommand","depthOnlyBackFaceCommand","depthOnlyFrontAndBackFaceCommand","translucentFrontFaceCommand","translucentBackFaceCommand","translucentFrontFaceManualDepthTestCommand","translucentBackFaceManualDepthTestCommand","pickFrontFaceCommand","pickBackFaceCommand"];function vT(){this._frontFaceAlphaByDistance=new At(0,1,0,1),this._backFaceAlphaByDistance=new At(0,1,0,1),this._frontFaceTranslucent=!1,this._backFaceTranslucent=!1,this._requiresManualDepthTest=!1,this._sunVisibleThroughGlobe=!1,this._environmentVisible=!1,this._useDepthPlane=!1,this._numberOfTextureUniforms=0,this._globeTranslucencyFramebuffer=void 0,this._rectangle=ce.clone(ce.MAX_VALUE),this._derivedCommandKey=0,this._derivedCommandsDirty=!1,this._derivedCommandPacks=void 0,this._derivedCommandTypes=new Array(PT),this._derivedBlendCommandTypes=new Array(PT),this._derivedPickCommandTypes=new Array(PT),this._derivedCommandTypesToUpdate=new Array(PT),this._derivedCommandsLength=0,this._derivedBlendCommandsLength=0,this._derivedPickCommandsLength=0,this._derivedCommandsToUpdateLength=0}Object.defineProperties(vT.prototype,{frontFaceAlphaByDistance:{get:function(){return this._frontFaceAlphaByDistance}},backFaceAlphaByDistance:{get:function(){return this._backFaceAlphaByDistance}},translucent:{get:function(){return this._frontFaceTranslucent}},sunVisibleThroughGlobe:{get:function(){return this._sunVisibleThroughGlobe}},environmentVisible:{get:function(){return this._environmentVisible}},useDepthPlane:{get:function(){return this._useDepthPlane}},numberOfTextureUniforms:{get:function(){return this._numberOfTextureUniforms}},rectangle:{get:function(){return this._rectangle}}});vT.prototype.update=function(e){let t=e.globe;if(!l(t)||!t.show){this._frontFaceTranslucent=!1,this._backFaceTranslucent=!1,this._sunVisibleThroughGlobe=!0,this._environmentVisible=!0,this._useDepthPlane=!1;return}this._frontFaceAlphaByDistance=exe(t.translucency.enabled,t.translucency.frontFaceAlpha,t.translucency.frontFaceAlphaByDistance,this._frontFaceAlphaByDistance),this._backFaceAlphaByDistance=exe(t.translucency.enabled,t.translucency.backFaceAlpha,t.translucency.backFaceAlphaByDistance,this._backFaceAlphaByDistance),this._frontFaceTranslucent=txe(t.translucency.enabled,this._frontFaceAlphaByDistance,t),this._backFaceTranslucent=txe(t.translucency.enabled,this._backFaceAlphaByDistance,t),this._requiresManualDepthTest=dut(this,e,t),this._sunVisibleThroughGlobe=aut(this,e),this._environmentVisible=cut(this,e),this._useDepthPlane=lut(this,e),this._numberOfTextureUniforms=uut(this),this._rectangle=ce.clone(t.translucency.rectangle,this._rectangle),mut(this,e)};function exe(e,t,n,i){return e?l(n)?(At.clone(n,i),i.nearValue*=t,i.farValue*=t,i):(i.nearValue=t,i.farValue=t,i):(i.nearValue=1,i.farValue=1,i)}function txe(e,t,n){return e&&(n.baseColor.alpha<1||t.nearValue<1||t.farValue<1)}function aut(e,t){let n=e._frontFaceTranslucent,i=e._backFaceTranslucent;return n&&(t.cameraUnderground||i)}function cut(e,t){return!t.cameraUnderground||e._frontFaceTranslucent}function lut(e,t){return!t.cameraUnderground&&!e._frontFaceTranslucent}function dut(e,t,n){return e._frontFaceTranslucent&&!e._backFaceTranslucent&&!n.depthTestAgainstTerrain&&t.mode!==oe.SCENE2D&&t.context.depthTexture}function uut(e){let t=0;return e._frontFaceTranslucent&&++t,e._requiresManualDepthTest&&++t,t}function mut(e,t){e._derivedCommandsLength=e8(e,t,!1,!1,e._derivedCommandTypes),e._derivedBlendCommandsLength=e8(e,t,!0,!1,e._derivedBlendCommandTypes),e._derivedPickCommandsLength=e8(e,t,!1,!0,e._derivedPickCommandTypes);let n,i=0;for(n=0;n<e._derivedCommandsLength;++n)i|=1<<e._derivedCommandTypes[n];for(n=0;n<e._derivedBlendCommandsLength;++n)i|=1<<e._derivedBlendCommandTypes[n];for(n=0;n<e._derivedPickCommandsLength;++n)i|=1<<e._derivedPickCommandTypes[n];let o=0;for(n=0;n<PT;++n)(i&1<<n)>0&&(e._derivedCommandTypesToUpdate[o++]=n);e._derivedCommandsToUpdateLength=o;let r=i!==e._derivedCommandKey;e._derivedCommandKey=i,e._derivedCommandsDirty=r,!l(e._derivedCommandPacks)&&e._frontFaceTranslucent&&(e._derivedCommandPacks=Zut())}function e8(e,t,n,i,o){let r=0,s=e._frontFaceTranslucent,a=e._backFaceTranslucent;if(!s)return r;let c=t.cameraUnderground,d=e._requiresManualDepthTest,u=i?fa.PICK_FRONT_FACE:d?fa.TRANSLUCENT_FRONT_FACE_MANUAL_DEPTH_TEST:fa.TRANSLUCENT_FRONT_FACE,m=i?fa.PICK_BACK_FACE:d?fa.TRANSLUCENT_BACK_FACE_MANUAL_DEPTH_TEST:fa.TRANSLUCENT_BACK_FACE;return t.mode===oe.SCENE2D?(o[r++]=fa.DEPTH_ONLY_FRONT_FACE,o[r++]=u,r):(a?(n||(o[r++]=fa.DEPTH_ONLY_FRONT_AND_BACK_FACE),c?(o[r++]=u,o[r++]=m):(o[r++]=m,o[r++]=u)):c?(n||(o[r++]=fa.DEPTH_ONLY_BACK_FACE),o[r++]=fa.OPAQUE_FRONT_FACE,o[r++]=m):(n||(o[r++]=fa.DEPTH_ONLY_FRONT_FACE),o[r++]=fa.OPAQUE_BACK_FACE,o[r++]=u),r)}function nm(e,t){let n=e.indexOf(t);n>-1&&e.splice(n,1)}function nxe(e,t){return e.indexOf(t)>-1}function hut(e,t){nm(e.defines,"TRANSLUCENT"),nm(t.defines,"TRANSLUCENT")}function fut(e,t){nm(e.defines,"GROUND_ATMOSPHERE"),nm(t.defines,"GROUND_ATMOSPHERE"),nm(e.defines,"FOG"),nm(t.defines,"FOG"),nm(e.defines,"TRANSLUCENT"),nm(t.defines,"TRANSLUCENT")}function t8(e,t){if(nxe(t.defines,"TILE_LIMIT_RECTANGLE")||nxe(t.defines,"ENABLE_CLIPPING_PLANES"))return;let n=`void main() { out_FragColor = vec4(1.0); } `;t.sources=[n]}function n8(e,t){let n=t.sources,i=n.length;for(let r=0;r<i;++r)n[r]=Ye.replaceMain(n[r],"czm_globe_translucency_main");n.push(` uniform sampler2D u_classificationTexture; void main() { vec2 st = gl_FragCoord.xy / czm_viewport.zw; #ifdef MANUAL_DEPTH_TEST float logDepthOrDepth = czm_unpackDepth(texture(czm_globeDepthTexture, st)); if (logDepthOrDepth != 0.0) { vec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, logDepthOrDepth); float depthEC = eyeCoordinate.z / eyeCoordinate.w; if (v_positionEC.z < depthEC) { discard; } } #endif czm_globe_translucency_main(); vec4 classificationColor = texture(u_classificationTexture, st); if (classificationColor.a > 0.0) { // Reverse premultiplication process to get the correct composited result of the classification primitives classificationColor.rgb /= classificationColor.a; } out_FragColor = classificationColor * vec4(classificationColor.aaa, 1.0) + out_FragColor * (1.0 - classificationColor.a); } `)}function dxe(e,t){n8(e,t),nm(e.defines,"GROUND_ATMOSPHERE"),nm(t.defines,"GROUND_ATMOSPHERE"),nm(e.defines,"FOG"),nm(t.defines,"FOG")}function put(e,t){n8(e,t),e.defines.push("GENERATE_POSITION"),t.defines.push("MANUAL_DEPTH_TEST")}function but(e,t){dxe(e,t),e.defines.push("GENERATE_POSITION"),t.defines.push("MANUAL_DEPTH_TEST")}function ixe(e,t){let n=`uniform sampler2D u_classificationTexture; void main() { vec2 st = gl_FragCoord.xy / czm_viewport.zw; vec4 pickColor = texture(u_classificationTexture, st); if (pickColor == vec4(0.0)) { discard; } out_FragColor = pickColor; } `;t.sources=[n]}function gut(e,t,n,i,o,r){if(!l(o))return t;if(!i&&l(n))return n;let s=e.shaderCache.getDerivedShaderProgram(t,r);if(!l(s)){let a=t._attributeLocations,c=t.vertexShaderSource.clone(),d=t.fragmentShaderSource.clone();c.defines=l(c.defines)?c.defines.slice(0):[],d.defines=l(d.defines)?d.defines.slice(0):[],o(c,d),s=e.shaderCache.createDerivedShaderProgram(t,r,{vertexShaderSource:c,fragmentShaderSource:d,attributeLocations:a})}return s}function yut(e){e.cull.face=bi.BACK,e.cull.enabled=!0}function xut(e){e.cull.face=bi.FRONT,e.cull.enabled=!0}function _ut(e){e.cull.face=bi.BACK,e.cull.enabled=!0,e.colorMask={red:!1,green:!1,blue:!1,alpha:!1}}function Tut(e){e.cull.face=bi.FRONT,e.cull.enabled=!0,e.colorMask={red:!1,green:!1,blue:!1,alpha:!1}}function Sut(e){e.cull.enabled=!1,e.colorMask={red:!1,green:!1,blue:!1,alpha:!1}}function oxe(e){e.cull.face=bi.BACK,e.cull.enabled=!0,e.depthMask=!1,e.blending=un.ALPHA_BLEND}function rxe(e){e.cull.face=bi.FRONT,e.cull.enabled=!0,e.depthMask=!1,e.blending=un.ALPHA_BLEND}function Cut(e){e.cull.face=bi.BACK,e.cull.enabled=!0,e.blending.enabled=!1}function Vut(e){e.cull.face=bi.FRONT,e.cull.enabled=!0,e.blending.enabled=!1}function Lut(e,t,n,i,o){if(!l(i))return e;if(!n&&l(t))return t;let r=o[e.id];if(!l(r)){let s=De.getState(e);i(s),r=De.fromCache(s),o[e.id]=r}return r}function $V(e){return{u_classificationTexture:function(){return e._globeTranslucencyFramebuffer.classificationTexture}}}function Rut(e,t,n,i,o){return l(o)?!i&&l(n)?n:xt(t,o(e),!1):t}function Rh(e){this.pass=e.pass,this.pickOnly=e.pickOnly,this.getShaderProgramFunction=e.getShaderProgramFunction,this.getRenderStateFunction=e.getRenderStateFunction,this.getUniformMapFunction=e.getUniformMapFunction,this.renderStateCache={}}function Zut(){return[new Rh({pass:Re.GLOBE,pickOnly:!1,getShaderProgramFunction:hut,getRenderStateFunction:yut,getUniformMapFunction:void 0}),new Rh({pass:Re.GLOBE,pickOnly:!1,getShaderProgramFunction:fut,getRenderStateFunction:xut,getUniformMapFunction:void 0}),new Rh({pass:Re.GLOBE,pickOnly:!1,getShaderProgramFunction:t8,getRenderStateFunction:_ut,getUniformMapFunction:void 0}),new Rh({pass:Re.GLOBE,pickOnly:!1,getShaderProgramFunction:t8,getRenderStateFunction:Tut,getUniformMapFunction:void 0}),new Rh({pass:Re.GLOBE,pickOnly:!1,getShaderProgramFunction:t8,getRenderStateFunction:Sut,getUniformMapFunction:void 0}),new Rh({pass:Re.TRANSLUCENT,pickOnly:!1,getShaderProgramFunction:n8,getRenderStateFunction:oxe,getUniformMapFunction:$V}),new Rh({pass:Re.TRANSLUCENT,pickOnly:!1,getShaderProgramFunction:dxe,getRenderStateFunction:rxe,getUniformMapFunction:$V}),new Rh({pass:Re.TRANSLUCENT,pickOnly:!1,getShaderProgramFunction:put,getRenderStateFunction:oxe,getUniformMapFunction:$V}),new Rh({pass:Re.TRANSLUCENT,pickOnly:!1,getShaderProgramFunction:but,getRenderStateFunction:rxe,getUniformMapFunction:$V}),new Rh({pass:Re.TRANSLUCENT,pickOnly:!0,getShaderProgramFunction:ixe,getRenderStateFunction:Cut,getUniformMapFunction:$V}),new Rh({pass:Re.TRANSLUCENT,pickOnly:!0,getShaderProgramFunction:ixe,getRenderStateFunction:Vut,getUniformMapFunction:$V})]}var sxe=new Array(PT),axe=new Array(PT);vT.prototype.updateDerivedCommands=function(e,t){let n=this._derivedCommandTypesToUpdate,i=this._derivedCommandsToUpdateLength;if(i!==0){for(let o=0;o<i;++o)axe[o]=this._derivedCommandPacks[n[o]],sxe[o]=lxe[n[o]];Gut(this,e,i,n,sxe,axe,t)}};function Gut(e,t,n,i,o,r,s){let a=t.derivedCommands.globeTranslucency,c=e._derivedCommandsDirty;if(t.dirty||!l(a)||c){t.dirty=!1,l(a)||(a={},t.derivedCommands.globeTranslucency=a);let d=s.frameNumber,u=y(a.uniformMapDirtyFrame,0),m=y(a.shaderProgramDirtyFrame,0),p=y(a.renderStateDirtyFrame,0),g=a.uniformMap!==t.uniformMap,f=a.shaderProgramId!==t.shaderProgram.id,x=a.renderStateId!==t.renderState.id;g&&(a.uniformMapDirtyFrame=d),f&&(a.shaderProgramDirtyFrame=d),x&&(a.renderStateDirtyFrame=d),a.uniformMap=t.uniformMap,a.shaderProgramId=t.shaderProgram.id,a.renderStateId=t.renderState.id;for(let _=0;_<n;++_){let C=r[_],V=i[_],L=o[_],Z=a[L],G,X,v;l(Z)?(G=Z.uniformMap,X=Z.shaderProgram,v=Z.renderState):(G=void 0,X=void 0,v=void 0),Z=et.shallowClone(t,Z),a[L]=Z;let P=y(Z.derivedCommands.uniformMapDirtyFrame,0),F=y(Z.derivedCommands.shaderProgramDirtyFrame,0),A=y(Z.derivedCommands.renderStateDirtyFrame,0),b=g||P<u,R=f||F<m,E=x||A<p;b&&(Z.derivedCommands.uniformMapDirtyFrame=d),R&&(Z.derivedCommands.shaderProgramDirtyFrame=d),E&&(Z.derivedCommands.renderStateDirtyFrame=d),Z.derivedCommands.type=V,Z.pass=C.pass,Z.pickOnly=C.pickOnly,Z.uniformMap=Rut(e,t.uniformMap,G,b,C.getUniformMapFunction),Z.shaderProgram=gut(s.context,t.shaderProgram,X,R,C.getShaderProgramFunction,L),Z.renderState=Lut(t.renderState,v,E,C.getRenderStateFunction,C.renderStateCache)}}}vT.prototype.pushDerivedCommands=function(e,t,n){let i=n.passes.pick||n.passes.pickVoxel;if(i&&t)return;let o=this._derivedCommandTypes,r=this._derivedCommandsLength;if(i?(o=this._derivedPickCommandTypes,r=this._derivedPickCommandsLength):t&&(o=this._derivedBlendCommandTypes,r=this._derivedBlendCommandsLength),r===0){n.commandList.push(e);return}let s=e.derivedCommands.globeTranslucency;for(let a=0;a<r;++a){let c=lxe[o[a]];n.commandList.push(s[c])}};function uxe(e,t,n,i,o,r,s){for(let a=0;a<t;++a){let c=e[a],d=c.derivedCommands.type;(!l(s)||s.indexOf(d)>-1)&&n(c,i,o,r)}}function cxe(e,t,n,i,o,r){for(let s=0;s<t;++s)n(e[s],i,o,r)}var Eut=[fa.OPAQUE_FRONT_FACE,fa.OPAQUE_BACK_FACE],Xut=[fa.DEPTH_ONLY_FRONT_FACE,fa.DEPTH_ONLY_BACK_FACE,fa.DEPTH_ONLY_FRONT_AND_BACK_FACE];vT.prototype.executeGlobeCommands=function(e,t,n,i,o){let r=i.context,s=e.commands[Re.GLOBE],a=e.indices[Re.GLOBE];a!==0&&(this._globeTranslucencyFramebuffer=n,n.clearClassification(r,o),uxe(s,a,t,i,r,o,Eut))};vT.prototype.executeGlobeClassificationCommands=function(e,t,n,i,o){let r=i.context,s=e.commands[Re.GLOBE],a=e.indices[Re.GLOBE],c=e.commands[Re.TERRAIN_CLASSIFICATION],d=e.indices[Re.TERRAIN_CLASSIFICATION];if(a===0||d===0)return;let u=this._frontFaceTranslucent,m=this._backFaceTranslucent;if((!u||!m)&&cxe(c,d,t,i,r,o),!u&&!m)return;this._globeTranslucencyFramebuffer=n;let p=r.uniformState.globeDepthTexture,g=o.framebuffer;if(o.framebuffer=n.classificationFramebuffer,uxe(s,a,t,i,r,o,Xut),r.depthTexture){let f=n.packDepth(r,o);r.uniformState.globeDepthTexture=f}cxe(c,d,t,i,r,o),r.uniformState.globeDepthTexture=p,o.framebuffer=g};var SF=vT;var Vwi=T(S(),1);var rwi=T(S(),1),jl=`uniform sampler2D colorTexture; in vec2 v_textureCoordinates; void main() { out_FragColor = texture(colorTexture, v_textureCoordinates); } `;function Yf(){this._numSamples=1,this.previousFramebuffer=void 0,this._previousFramebuffer=void 0,this._depthStencilTexture=void 0,this._depthStencilRenderbuffer=void 0,this._fbo=new ui({depthStencil:!0,createDepthAttachments:!1}),this._fboClassified=new ui({depthStencil:!0,createDepthAttachments:!1}),this._rsUnclassified=void 0,this._rsClassified=void 0,this._unclassifiedCommand=void 0,this._classifiedCommand=void 0,this._translucentCommand=void 0,this._clearColorCommand=new oi({color:new Y(0,0,0,0),owner:this}),this._clearCommand=new oi({color:new Y(0,0,0,0),depth:1,stencil:0});let e=this;this._uniformMap={colorTexture:function(){return e._fbo.getColorTexture()},depthTexture:function(){return e._depthStencilTexture},classifiedTexture:function(){return e._fboClassified.getColorTexture()}}}Object.defineProperties(Yf.prototype,{unclassifiedCommand:{get:function(){return this._unclassifiedCommand}}});Yf.isTranslucencySupported=function(e){return e.depthTexture&&e.fragmentDepth};var Iut={depthMask:!1,stencilTest:{enabled:!0,frontFunction:Dn.EQUAL,frontOperation:{fail:pt.KEEP,zFail:pt.KEEP,zPass:pt.KEEP},backFunction:Dn.NEVER,reference:0,mask:Nt.CLASSIFICATION_MASK},blending:un.ALPHA_BLEND},Wut={depthMask:!1,stencilTest:{enabled:!0,frontFunction:Dn.NOT_EQUAL,frontOperation:{fail:pt.KEEP,zFail:pt.KEEP,zPass:pt.KEEP},backFunction:Dn.NEVER,reference:0,mask:Nt.CLASSIFICATION_MASK},blending:un.ALPHA_BLEND},Put={depthMask:!0,depthTest:{enabled:!0},stencilTest:Nt.setCesium3DTileBit(),stencilMask:Nt.CESIUM_3D_TILE_MASK,blending:un.ALPHA_BLEND},vut=`uniform sampler2D colorTexture; uniform sampler2D depthTexture; uniform sampler2D classifiedTexture; in vec2 v_textureCoordinates; void main() { vec4 color = texture(colorTexture, v_textureCoordinates); if (color.a == 0.0) { discard; } bool isClassified = all(equal(texture(classifiedTexture, v_textureCoordinates), vec4(0.0))); #ifdef UNCLASSIFIED vec4 highlightColor = czm_invertClassificationColor; if (isClassified) { discard; } #else vec4 highlightColor = vec4(1.0); if (!isClassified) { discard; } #endif out_FragColor = color * highlightColor; gl_FragDepth = texture(depthTexture, v_textureCoordinates).r; } `,wut=`uniform sampler2D colorTexture; in vec2 v_textureCoordinates; void main() { vec4 color = texture(colorTexture, v_textureCoordinates); if (color.a == 0.0) { discard; } #ifdef UNCLASSIFIED out_FragColor = color * czm_invertClassificationColor; #else out_FragColor = color; #endif } `;Yf.prototype.update=function(e,t,n){let i=this._fbo.getColorTexture(),o=this.previousFramebuffer!==this._previousFramebuffer;this._previousFramebuffer=this.previousFramebuffer;let r=this._numSamples!==t,s=e.drawingBufferWidth,a=e.drawingBufferHeight,c=!l(i)||i.width!==s||i.height!==a;if((c||o||r)&&(this._numSamples=t,this._depthStencilTexture=this._depthStencilTexture&&this._depthStencilTexture.destroy(),this._depthStencilRenderbuffer=this._depthStencilRenderbuffer&&this._depthStencilRenderbuffer.destroy(),l(this._previousFramebuffer)||(this._depthStencilTexture=new Et({context:e,width:s,height:a,pixelFormat:at.DEPTH_STENCIL,pixelDatatype:ze.UNSIGNED_INT_24_8}),t>1&&(this._depthStencilRenderbuffer=new Vd({context:e,width:s,height:a,format:jc.DEPTH24_STENCIL8,numSamples:t})))),!l(this._fbo.framebuffer)||c||o||r){this._fbo.destroy(),this._fboClassified.destroy();let d,u;l(this._previousFramebuffer)?(d=n.getDepthStencilTexture(),u=n.getDepthStencilRenderbuffer()):(d=this._depthStencilTexture,u=this._depthStencilRenderbuffer),this._fbo.setDepthStencilTexture(d),l(u)&&this._fbo.setDepthStencilRenderbuffer(u),this._fbo.update(e,s,a,t),l(this._previousFramebuffer)||(this._fboClassified.setDepthStencilTexture(d),this._fboClassified.update(e,s,a))}if(l(this._rsUnclassified)||(this._rsUnclassified=De.fromCache(Iut),this._rsClassified=De.fromCache(Wut),this._rsDefault=De.fromCache(Put)),!l(this._unclassifiedCommand)||o||r){l(this._unclassifiedCommand)&&(this._unclassifiedCommand.shaderProgram=this._unclassifiedCommand.shaderProgram&&this._unclassifiedCommand.shaderProgram.destroy(),this._classifiedCommand.shaderProgram=this._classifiedCommand.shaderProgram&&this._classifiedCommand.shaderProgram.destroy());let d=l(this._previousFramebuffer)?wut:vut,u=new Ye({defines:["UNCLASSIFIED"],sources:[d]}),m=new Ye({sources:[d]});this._unclassifiedCommand=e.createViewportQuadCommand(u,{renderState:l(this._previousFramebuffer)?this._rsUnclassified:this._rsDefault,uniformMap:this._uniformMap,owner:this}),this._classifiedCommand=e.createViewportQuadCommand(m,{renderState:l(this._previousFramebuffer)?this._rsClassified:this._rsDefault,uniformMap:this._uniformMap,owner:this}),l(this._translucentCommand)&&(this._translucentCommand.shaderProgram=this._translucentCommand.shaderProgram&&this._translucentCommand.shaderProgram.destroy()),l(this._previousFramebuffer)||(this._translucentCommand=e.createViewportQuadCommand(jl,{renderState:this._rsUnclassified,uniformMap:this._uniformMap,owner:this}))}};Yf.prototype.prepareTextures=function(e,t){this._fbo._numSamples>1&&this._fbo.prepareTextures(e,t)};Yf.prototype.clear=function(e,t){l(this._previousFramebuffer)?this._fbo.clear(e,this._clearColorCommand,t):(this._fbo.clear(e,this._clearCommand,t),this._fboClassified.clear(e,this._clearCommand,t))};Yf.prototype.executeClassified=function(e,t){if(!l(this._previousFramebuffer)){let n=t.framebuffer;this.prepareTextures(e,!0),t.framebuffer=this._fboClassified.framebuffer,this._translucentCommand.execute(e,t),t.framebuffer=n}this._classifiedCommand.execute(e,t)};Yf.prototype.executeUnclassified=function(e,t){this._unclassifiedCommand.execute(e,t)};Yf.prototype.isDestroyed=function(){return!1};Yf.prototype.destroy=function(){return this._fbo.destroy(),this._fboClassified.destroy(),this._depthStencilTexture=this._depthStencilTexture&&this._depthStencilTexture.destroy(),this._depthStencilRenderbuffer=this._depthStencilRenderbuffer&&this._depthStencilRenderbuffer.destroy(),l(this._unclassifiedCommand)&&(this._unclassifiedCommand.shaderProgram=this._unclassifiedCommand.shaderProgram&&this._unclassifiedCommand.shaderProgram.destroy(),this._classifiedCommand.shaderProgram=this._classifiedCommand.shaderProgram&&this._classifiedCommand.shaderProgram.destroy()),me(this)};var eL=Yf;var Ewi=T(S(),1);function $D(e){this._total=e,this.usedThisFrame=0,this.stolenFromMeThisFrame=0,this.starvedThisFrame=!1,this.starvedLastFrame=!1}Object.defineProperties($D.prototype,{total:{get:function(){return this._total}}});function Vy(e){let t=new Array(Ga.NUMBER_OF_JOB_TYPES);t[Ga.TEXTURE]=new $D(l(e)?e[Ga.TEXTURE]:10),t[Ga.PROGRAM]=new $D(l(e)?e[Ga.PROGRAM]:10),t[Ga.BUFFER]=new $D(l(e)?e[Ga.BUFFER]:30);let n=t.length,i,o=0;for(i=0;i<n;++i)o+=t[i].total;let r=new Array(n);for(i=0;i<n;++i)r[i]=!1;this._totalBudget=o,this._totalUsedThisFrame=0,this._budgets=t,this._executedThisFrame=r}Vy.getTimestamp=fi;Object.defineProperties(Vy.prototype,{totalBudget:{get:function(){return this._totalBudget}}});Vy.prototype.disableThisFrame=function(){this._totalUsedThisFrame=this._totalBudget};Vy.prototype.resetBudgets=function(){let e=this._budgets,t=e.length;for(let n=0;n<t;++n){let i=e[n];i.starvedLastFrame=i.starvedThisFrame,i.starvedThisFrame=!1,i.usedThisFrame=0,i.stolenFromMeThisFrame=0}this._totalUsedThisFrame=0};Vy.prototype.execute=function(e,t){let n=this._budgets,i=n[t],o=this._executedThisFrame[t];if(this._totalUsedThisFrame>=this._totalBudget&&o)return i.starvedThisFrame=!0,!1;let r;if(i.usedThisFrame+i.stolenFromMeThisFrame>=i.total){let c=n.length,d;for(d=0;d<c&&(r=n[d],!(r.usedThisFrame+r.stolenFromMeThisFrame<r.total&&!r.starvedLastFrame));++d);if(d===c&&o)return!1;o&&(i.starvedThisFrame=!0)}let s=Vy.getTimestamp();e.execute();let a=Vy.getTimestamp()-s;return this._totalUsedThisFrame+=a,r?r.stolenFromMeThisFrame+=a:i.usedThisFrame+=a,this._executedThisFrame[t]=!0,!0};var CF=Vy;var wwi=T(S(),1);function e3(e){e=y(e,y.EMPTY_OBJECT);let t=In(e.container);this._container=t;let n=document.createElement("div");n.className="cesium-performanceDisplay";let i=document.createElement("div");i.className="cesium-performanceDisplay-fps",this._fpsText=document.createTextNode(""),i.appendChild(this._fpsText);let o=document.createElement("div");o.className="cesium-performanceDisplay-ms",this._msText=document.createTextNode(""),o.appendChild(this._msText),n.appendChild(o),n.appendChild(i),this._container.appendChild(n),this._lastFpsSampleTime=fi(),this._lastMsSampleTime=fi(),this._fpsFrameCount=0,this._msFrameCount=0,this._throttled=!1;let r=document.createElement("div");r.className="cesium-performanceDisplay-throttled",this._throttledText=document.createTextNode(""),r.appendChild(this._throttledText),n.appendChild(r)}Object.defineProperties(e3.prototype,{throttled:{get:function(){return this._throttled},set:function(e){this._throttled!==e&&(e?this._throttledText.nodeValue="(throttled)":this._throttledText.nodeValue="",this._throttled=e)}}});e3.prototype.update=function(e){let t=fi(),n=y(e,!0);this._fpsFrameCount++;let i=t-this._lastFpsSampleTime;if(i>1e3){let r="N/A";n&&(r=this._fpsFrameCount*1e3/i|0),this._fpsText.nodeValue=`${r} FPS`,this._lastFpsSampleTime=t,this._fpsFrameCount=0}this._msFrameCount++;let o=t-this._lastMsSampleTime;if(o>200){let r="N/A";n&&(r=(o/this._msFrameCount).toFixed(2)),this._msText.nodeValue=`${r} MS`,this._lastMsSampleTime=t,this._msFrameCount=0}};e3.prototype.destroy=function(){return me(this)};var tb=e3;var VMi=T(S(),1);var Dwi=T(S(),1);function wT(){this._framebuffer=new ui,this._textureToCopy=void 0,this._copyDepthCommand=void 0}Object.defineProperties(wT.prototype,{framebuffer:{get:function(){return this._framebuffer.framebuffer}}});function Fut(e,t,n){let i=n.width,o=n.height;e._framebuffer.update(t,i,o)}function Aut(e,t,n){l(e._copyDepthCommand)||(e._copyDepthCommand=t.createViewportQuadCommand(`uniform highp sampler2D colorTexture; in vec2 v_textureCoordinates; void main() { vec4 globeDepthPacked = texture(czm_globeDepthTexture, v_textureCoordinates); float globeDepth = czm_unpackDepth(globeDepthPacked); float depth = texture(colorTexture, v_textureCoordinates).r; out_FragColor = czm_branchFreeTernary(globeDepth <= 0.0 || globeDepth >= 1.0 || depth < globeDepth && depth > 0.0 && depth < 1.0, czm_packDepth(depth), globeDepthPacked); } `,{renderState:De.fromCache(),uniformMap:{colorTexture:function(){return e._textureToCopy}},owner:e})),e._textureToCopy=n,e._copyDepthCommand.framebuffer=e.framebuffer}wT.prototype.update=function(e,t){Fut(this,e,t),Aut(this,e,t)};var Mut=new se,Nut=new se(1,1/255,1/65025,1/16581375);wT.prototype.getDepth=function(e,t,n){if(!l(this.framebuffer))return;let i=e.readPixels({x:t,y:n,width:1,height:1,framebuffer:this.framebuffer}),o=se.unpack(i,0,Mut);return se.divideByScalar(o,255,o),se.dot(o,Nut)};wT.prototype.executeCopyDepth=function(e,t){this._copyDepthCommand.execute(e,t)};wT.prototype.isDestroyed=function(){return!1};wT.prototype.destroy=function(){return this._framebuffer.destroy(),l(this._copyDepthCommand)&&(this._copyDepthCommand.shaderProgram=l(this._copyDepthCommand.shaderProgram)&&this._copyDepthCommand.shaderProgram.destroy()),me(this)};var VF=wT;var qAi=T(S(),1);var Hwi=T(S(),1);function kut(e,t){this.near=y(e,0),this.far=y(t,0);let n=Re.NUMBER_OF_PASSES,i=new Array(n),o=new Array(n);for(let r=0;r<n;++r)i[r]=[],o[r]=0;this.commands=i,this.indices=o}var LF=kut;var dFi=T(S(),1);var Kwi=T(S(),1),Ly=`uniform highp sampler2D u_depthTexture; in vec2 v_textureCoordinates; void main() { out_FragColor = czm_packDepth(texture(u_depthTexture, v_textureCoordinates).r); } `;function Of(){this._picking=!1,this._numSamples=1,this._tempCopyDepthTexture=void 0,this._pickColorFramebuffer=new ui({depthStencil:!0,supportsDepthTexture:!0}),this._outputFramebuffer=new ui({depthStencil:!0,supportsDepthTexture:!0}),this._copyDepthFramebuffer=new ui,this._tempCopyDepthFramebuffer=new ui,this._updateDepthFramebuffer=new ui({createColorAttachments:!1,createDepthAttachments:!1,depthStencil:!0}),this._clearGlobeColorCommand=void 0,this._copyColorCommand=void 0,this._copyDepthCommand=void 0,this._tempCopyDepthCommand=void 0,this._updateDepthCommand=void 0,this._viewport=new He,this._rs=void 0,this._rsBlend=void 0,this._rsUpdate=void 0,this._useScissorTest=!1,this._scissorRectangle=void 0,this._useHdr=void 0,this._clearGlobeDepth=void 0}Object.defineProperties(Of.prototype,{colorFramebufferManager:{get:function(){return this._picking?this._pickColorFramebuffer:this._outputFramebuffer}},framebuffer:{get:function(){return this.colorFramebufferManager.framebuffer}},depthStencilTexture:{get:function(){return this.colorFramebufferManager.getDepthStencilTexture()}},picking:{get:function(){return this._picking},set:function(e){this._picking=e}}});function Uut(e){e._pickColorFramebuffer.destroy(),e._outputFramebuffer.destroy(),e._copyDepthFramebuffer.destroy(),e._tempCopyDepthFramebuffer.destroy(),e._updateDepthFramebuffer.destroy()}function mxe(e,t,n,i,o){e._viewport.width=n,e._viewport.height=i;let r=!He.equals(e._viewport,o.viewport),s=r!==e._useScissorTest;e._useScissorTest=r,He.equals(e._scissorRectangle,o.viewport)||(e._scissorRectangle=He.clone(o.viewport,e._scissorRectangle),s=!0),(!l(e._rs)||!He.equals(e._viewport,e._rs.viewport)||s)&&(e._rs=De.fromCache({viewport:e._viewport,scissorTest:{enabled:e._useScissorTest,rectangle:e._scissorRectangle}}),e._rsBlend=De.fromCache({viewport:e._viewport,scissorTest:{enabled:e._useScissorTest,rectangle:e._scissorRectangle},blending:un.ALPHA_BLEND}),e._rsUpdate=De.fromCache({viewport:e._viewport,scissorTest:{enabled:e._useScissorTest,rectangle:e._scissorRectangle},stencilTest:{enabled:!0,frontFunction:Dn.EQUAL,frontOperation:{fail:pt.KEEP,zFail:pt.KEEP,zPass:pt.KEEP},backFunction:Dn.NEVER,reference:Nt.CESIUM_3D_TILE_MASK,mask:Nt.CESIUM_3D_TILE_MASK}})),l(e._copyDepthCommand)||(e._copyDepthCommand=t.createViewportQuadCommand(Ly,{uniformMap:{u_depthTexture:function(){return e.colorFramebufferManager.getDepthStencilTexture()}},owner:e})),e._copyDepthCommand.framebuffer=e._copyDepthFramebuffer.framebuffer,e._copyDepthCommand.renderState=e._rs,l(e._copyColorCommand)||(e._copyColorCommand=t.createViewportQuadCommand(jl,{uniformMap:{colorTexture:function(){return e.colorFramebufferManager.getColorTexture()}},owner:e})),e._copyColorCommand.renderState=e._rs,l(e._tempCopyDepthCommand)||(e._tempCopyDepthCommand=t.createViewportQuadCommand(Ly,{uniformMap:{u_depthTexture:function(){return e._tempCopyDepthTexture}},owner:e})),e._tempCopyDepthCommand.framebuffer=e._tempCopyDepthFramebuffer.framebuffer,e._tempCopyDepthCommand.renderState=e._rs,l(e._updateDepthCommand)||(e._updateDepthCommand=t.createViewportQuadCommand(jl,{uniformMap:{colorTexture:function(){return e._tempCopyDepthFramebuffer.getColorTexture()}},owner:e})),e._updateDepthCommand.framebuffer=e._updateDepthFramebuffer.framebuffer,e._updateDepthCommand.renderState=e._rsUpdate,l(e._clearGlobeColorCommand)||(e._clearGlobeColorCommand=new oi({color:new Y(0,0,0,0),stencil:0,owner:e})),e._clearGlobeColorCommand.framebuffer=e.framebuffer}Of.prototype.update=function(e,t,n,i,o,r){let s=n.width,a=n.height,c=o?e.halfFloatingPointTexture?ze.HALF_FLOAT:ze.FLOAT:ze.UNSIGNED_BYTE;this._numSamples=i,this.picking?this._pickColorFramebuffer.update(e,s,a):this._outputFramebuffer.update(e,s,a,i,c),this._copyDepthFramebuffer.update(e,s,a),mxe(this,e,s,a,t),e.uniformState.globeDepthTexture=void 0,this._useHdr=o,this._clearGlobeDepth=r};Of.prototype.prepareColorTextures=function(e,t){!this.picking&&this._numSamples>1&&this._outputFramebuffer.prepareTextures(e,t)};Of.prototype.executeCopyDepth=function(e,t){l(this._copyDepthCommand)&&(this.prepareColorTextures(e),this._copyDepthCommand.execute(e,t),e.uniformState.globeDepthTexture=this._copyDepthFramebuffer.getColorTexture())};Of.prototype.executeUpdateDepth=function(e,t,n,i){let o=l(i)?i:t.framebuffer.depthStencilTexture;if(n||o!==this.colorFramebufferManager.getDepthStencilTexture()){if(l(this._updateDepthCommand)){if(!l(this._updateDepthFramebuffer.framebuffer)||this._updateDepthFramebuffer.getDepthStencilTexture()!==o||this._updateDepthFramebuffer.getColorTexture()!==this._copyDepthFramebuffer.getColorTexture()){let r=this._copyDepthFramebuffer.getColorTexture().width,s=this._copyDepthFramebuffer.getColorTexture().height;this._tempCopyDepthFramebuffer.destroy(),this._tempCopyDepthFramebuffer.update(e,r,s);let a=this._copyDepthFramebuffer.getColorTexture();this._updateDepthFramebuffer.setColorTexture(a,0),this._updateDepthFramebuffer.setDepthStencilTexture(o),this._updateDepthFramebuffer.update(e,r,s),mxe(this,e,r,s,t)}this._tempCopyDepthTexture=o,this._tempCopyDepthCommand.execute(e,t),this._updateDepthCommand.execute(e,t)}return}l(this._copyDepthCommand)&&this._copyDepthCommand.execute(e,t)};Of.prototype.executeCopyColor=function(e,t){l(this._copyColorCommand)&&this._copyColorCommand.execute(e,t)};Of.prototype.clear=function(e,t,n){let i=this._clearGlobeColorCommand;l(i)&&(Y.clone(n,i.color),this.colorFramebufferManager.clear(e,i,t))};Of.prototype.isDestroyed=function(){return!1};Of.prototype.destroy=function(){return Uut(this),l(this._copyColorCommand)&&(this._copyColorCommand.shaderProgram=this._copyColorCommand.shaderProgram.destroy()),l(this._copyDepthCommand)&&(this._copyDepthCommand.shaderProgram=this._copyDepthCommand.shaderProgram.destroy()),l(this._tempCopyDepthCommand)&&(this._tempCopyDepthCommand.shaderProgram=this._tempCopyDepthCommand.shaderProgram.destroy()),l(this._updateDepthCommand)&&(this._updateDepthCommand.shaderProgram=this._updateDepthCommand.shaderProgram.destroy()),me(this)};var RF=Of;var TFi=T(S(),1);function FT(){this._framebuffer=new ui({depthStencil:!0,supportsDepthTexture:!0}),this._packedDepthFramebuffer=new ui,this._renderState=void 0,this._packedDepthCommand=void 0,this._clearCommand=void 0,this._viewport=new He,this._useScissorTest=!1,this._scissorRectangle=void 0,this._useHdr=void 0}Object.defineProperties(FT.prototype,{classificationTexture:{get:function(){return this._framebuffer.getColorTexture()}},classificationFramebuffer:{get:function(){return this._framebuffer.framebuffer}},packedDepthFramebuffer:{get:function(){return this._packedDepthFramebuffer.framebuffer}},depthStencilTexture:{get:function(){return this._framebuffer.getDepthStencilTexture()}},depthStencilRenderbuffer:{get:function(){return this._framebuffer.getDepthStencilRenderbuffer()}},packedDepthTexture:{get:function(){return this._packedDepthFramebuffer.getColorTexture()}}});function Dut(e){e._framebuffer.destroy(),e._packedDepthFramebuffer.destroy()}function But(e,t,n,i,o){let r=o?t.halfFloatingPointTexture?ze.HALF_FLOAT:ze.FLOAT:ze.UNSIGNED_BYTE;e._framebuffer.update(t,n,i,1,r),e._packedDepthFramebuffer.update(t,n,i)}function Yut(e,t,n,i,o){e._viewport.width=n,e._viewport.height=i;let r=!He.equals(e._viewport,o.viewport),s=r!==e._useScissorTest;e._useScissorTest=r,He.equals(e._scissorRectangle,o.viewport)||(e._scissorRectangle=He.clone(o.viewport,e._scissorRectangle),s=!0),(!l(e._renderState)||!He.equals(e._viewport,e._renderState.viewport)||s)&&(e._renderState=De.fromCache({viewport:e._viewport,scissorTest:{enabled:e._useScissorTest,rectangle:e._scissorRectangle}})),l(e._packedDepthCommand)||(e._packedDepthCommand=t.createViewportQuadCommand(Ly,{uniformMap:{u_depthTexture:function(){return e.depthStencilTexture}},owner:e})),l(e._clearCommand)||(e._clearCommand=new oi({color:new Y(0,0,0,0),depth:1,stencil:0,owner:e})),e._packedDepthCommand.framebuffer=e._packedDepthFramebuffer.framebuffer,e._packedDepthCommand.renderState=e._renderState,e._clearCommand.framebuffer=e.classificationFramebuffer,e._clearCommand.renderState=e._renderState}FT.prototype.updateAndClear=function(e,t,n,i){let o=t.width,r=t.height;But(this,n,o,r,e),Yut(this,n,o,r,i),this._useHdr=e};FT.prototype.clearClassification=function(e,t){this._clearCommand.execute(e,t)};FT.prototype.packDepth=function(e,t){return this._packedDepthCommand.execute(e,t),this.packedDepthTexture};FT.prototype.isDestroyed=function(){return!1};FT.prototype.destroy=function(){return Dut(this),me(this)};var ZF=FT;var kFi=T(S(),1);function nb(e){this._numSamples=1,this._translucentMultipassSupport=!1,this._translucentMRTSupport=!1;let t=e.colorBufferFloat&&e.depthTexture&&e.floatBlend;this._translucentMRTSupport=e.drawBuffers&&t,this._translucentMultipassSupport=!this._translucentMRTSupport&&t,this._opaqueFBO=void 0,this._opaqueTexture=void 0,this._depthStencilTexture=void 0,this._accumulationTexture=void 0,this._translucentFBO=new ui({colorAttachmentsLength:this._translucentMRTSupport?2:1,createColorAttachments:!1,createDepthAttachments:!1,depth:!0}),this._alphaFBO=new ui({createColorAttachments:!1,createDepthAttachments:!1,depth:!0}),this._adjustTranslucentFBO=new ui({colorAttachmentsLength:this._translucentMRTSupport?2:1,createColorAttachments:!1}),this._adjustAlphaFBO=new ui({createColorAttachments:!1}),this._opaqueClearCommand=new oi({color:new Y(0,0,0,0),owner:this}),this._translucentMRTClearCommand=new oi({color:new Y(0,0,0,1),owner:this}),this._translucentMultipassClearCommand=new oi({color:new Y(0,0,0,0),owner:this}),this._alphaClearCommand=new oi({color:new Y(1,1,1,1),owner:this}),this._translucentRenderStateCache={},this._alphaRenderStateCache={},this._compositeCommand=void 0,this._adjustTranslucentCommand=void 0,this._adjustAlphaCommand=void 0,this._viewport=new He,this._rs=void 0,this._useScissorTest=!1,this._scissorRectangle=void 0,this._useHDR=!1}function hxe(e){e._accumulationTexture=e._accumulationTexture&&!e._accumulationTexture.isDestroyed()&&e._accumulationTexture.destroy(),e._revealageTexture=e._revealageTexture&&!e._revealageTexture.isDestroyed()&&e._revealageTexture.destroy()}function i8(e){e._translucentFBO.destroy(),e._alphaFBO.destroy(),e._adjustTranslucentFBO.destroy(),e._adjustAlphaFBO.destroy()}function fxe(e){hxe(e),i8(e)}function Out(e,t,n,i){hxe(e),e._accumulationTexture=new Et({context:t,width:n,height:i,pixelFormat:at.RGBA,pixelDatatype:ze.FLOAT});let o=new Float32Array(n*i*4);e._revealageTexture=new Et({context:t,pixelFormat:at.RGBA,pixelDatatype:ze.FLOAT,source:{arrayBufferView:o,width:n,height:i},flipY:!1})}function Hut(e,t){i8(e);let n=ne.FRAMEBUFFER_COMPLETE,i=!0,{width:o,height:r}=e._accumulationTexture;if(e._translucentMRTSupport&&(e._translucentFBO.setColorTexture(e._accumulationTexture,0),e._translucentFBO.setColorTexture(e._revealageTexture,1),e._translucentFBO.setDepthStencilTexture(e._depthStencilTexture),e._translucentFBO.update(t,o,r),e._adjustTranslucentFBO.setColorTexture(e._accumulationTexture,0),e._adjustTranslucentFBO.setColorTexture(e._revealageTexture,1),e._adjustTranslucentFBO.update(t,o,r),(e._translucentFBO.status!==n||e._adjustTranslucentFBO.status!==n)&&(i8(e),e._translucentMRTSupport=!1)),!e._translucentMRTSupport){e._translucentFBO.setColorTexture(e._accumulationTexture),e._translucentFBO.setDepthStencilTexture(e._depthStencilTexture),e._translucentFBO.update(t,o,r),e._alphaFBO.setColorTexture(e._revealageTexture),e._alphaFBO.setDepthStencilTexture(e._depthStencilTexture),e._alphaFBO.update(t,o,r),e._adjustTranslucentFBO.setColorTexture(e._accumulationTexture),e._adjustTranslucentFBO.update(t,o,r),e._adjustAlphaFBO.setColorTexture(e._revealageTexture),e._adjustAlphaFBO.update(t,o,r);let s=e._translucentFBO.status===n,a=e._alphaFBO.status===n,c=e._adjustTranslucentFBO.status===n,d=e._adjustAlphaFBO.status===n;(!s||!a||!c||!d)&&(fxe(e),e._translucentMultipassSupport=!1,i=!1)}return i}nb.prototype.update=function(e,t,n,i,o){if(!this.isSupported())return;this._opaqueFBO=n,this._opaqueTexture=n.getColorTexture(0),this._depthStencilTexture=n.getDepthStencilTexture();let{width:r,height:s}=this._opaqueTexture,a=this._accumulationTexture,c=!l(a)||a.width!==r||a.height!==s||i!==this._useHDR,d=this._numSamples!==o;if((c||d)&&(this._numSamples=o,Out(this,e,r,s)),(!l(this._translucentFBO.framebuffer)||c||d)&&!Hut(this,e))return;this._useHDR=i;let u=this,m,p;l(this._compositeCommand)||(m=new Ye({sources:[pw]}),this._translucentMRTSupport&&m.defines.push("MRT"),p={u_opaque:function(){return u._opaqueTexture},u_accumulation:function(){return u._accumulationTexture},u_revealage:function(){return u._revealageTexture}},this._compositeCommand=e.createViewportQuadCommand(m,{uniformMap:p,owner:this})),l(this._adjustTranslucentCommand)||(this._translucentMRTSupport?(m=new Ye({defines:["MRT"],sources:[WV]}),p={u_bgColor:function(){return u._translucentMRTClearCommand.color},u_depthTexture:function(){return u._depthStencilTexture}},this._adjustTranslucentCommand=e.createViewportQuadCommand(m,{uniformMap:p,owner:this})):this._translucentMultipassSupport&&(m=new Ye({sources:[WV]}),p={u_bgColor:function(){return u._translucentMultipassClearCommand.color},u_depthTexture:function(){return u._depthStencilTexture}},this._adjustTranslucentCommand=e.createViewportQuadCommand(m,{uniformMap:p,owner:this}),p={u_bgColor:function(){return u._alphaClearCommand.color},u_depthTexture:function(){return u._depthStencilTexture}},this._adjustAlphaCommand=e.createViewportQuadCommand(m,{uniformMap:p,owner:this}))),this._viewport.width=r,this._viewport.height=s;let g=!He.equals(this._viewport,t.viewport),f=g!==this._useScissorTest;this._useScissorTest=g,He.equals(this._scissorRectangle,t.viewport)||(this._scissorRectangle=He.clone(t.viewport,this._scissorRectangle),f=!0),(!l(this._rs)||!He.equals(this._viewport,this._rs.viewport)||f)&&(this._rs=De.fromCache({viewport:this._viewport,scissorTest:{enabled:this._useScissorTest,rectangle:this._scissorRectangle}})),l(this._compositeCommand)&&(this._compositeCommand.renderState=this._rs),this._adjustTranslucentCommand&&(this._adjustTranslucentCommand.renderState=this._rs),l(this._adjustAlphaCommand)&&(this._adjustAlphaCommand.renderState=this._rs)};var zut={enabled:!0,color:new Y(0,0,0,0),equationRgb:Ra.ADD,equationAlpha:Ra.ADD,functionSourceRgb:_o.ONE,functionDestinationRgb:_o.ONE,functionSourceAlpha:_o.ZERO,functionDestinationAlpha:_o.ONE_MINUS_SOURCE_ALPHA},Kut={enabled:!0,color:new Y(0,0,0,0),equationRgb:Ra.ADD,equationAlpha:Ra.ADD,functionSourceRgb:_o.ONE,functionDestinationRgb:_o.ONE,functionSourceAlpha:_o.ONE,functionDestinationAlpha:_o.ONE},Jut={enabled:!0,color:new Y(0,0,0,0),equationRgb:Ra.ADD,equationAlpha:Ra.ADD,functionSourceRgb:_o.ZERO,functionDestinationRgb:_o.ONE_MINUS_SOURCE_ALPHA,functionSourceAlpha:_o.ZERO,functionDestinationAlpha:_o.ONE_MINUS_SOURCE_ALPHA};function o8(e,t,n,i){let o=n[i.id];if(!l(o)){let r=De.getState(i);r.depthMask=!1,r.blending=t,o=De.fromCache(r),n[i.id]=o}return o}function Qut(e,t,n){return o8(t,zut,e._translucentRenderStateCache,n)}function jut(e,t,n){return o8(t,Kut,e._translucentRenderStateCache,n)}function qut(e,t,n){return o8(t,Jut,e._alphaRenderStateCache,n)}var $ut=` vec3 Ci = czm_out_FragColor.rgb * czm_out_FragColor.a; float ai = czm_out_FragColor.a; float wzi = czm_alphaWeight(ai); out_FragData_0 = vec4(Ci * wzi, ai); out_FragData_1 = vec4(ai * wzi); `,emt=` vec3 Ci = czm_out_FragColor.rgb * czm_out_FragColor.a; float ai = czm_out_FragColor.a; float wzi = czm_alphaWeight(ai); out_FragColor = vec4(Ci, ai) * wzi; `,tmt=` float ai = czm_out_FragColor.a; out_FragColor = vec4(ai); `;function r8(e,t,n,i){let{shaderCache:o}=e,r=o.getDerivedShaderProgram(t,n);if(l(r))return r;let s=t._attributeLocations,a=t.fragmentShaderSource.clone();a.sources=a.sources.map(function(u){return Ye.replaceMain(u,"czm_translucent_main").replace(/out_FragColor/g,"czm_out_FragColor").replace(/layout\s*\(location\s*=\s*0\)\s*out\s+vec4\s+out_FragColor;/g,"").replace(/\bdiscard\b/g,"czm_discard = true").replace(/czm_phong/g,"czm_translucentPhong")}),a.sources.splice(0,0,`vec4 czm_out_FragColor; bool czm_discard = false; `);let c=[...i.matchAll(/out_FragData_(\d+)/g)],d="";for(let u=0;u<c.length;u++){let m=c[u];d=`layout (location = ${m[1]}) out vec4 ${m[0]}; ${d}`}return a.sources.push(d),a.sources.push(`void main() { czm_translucent_main(); if (czm_discard) { discard; } ${i}} `),o.createDerivedShaderProgram(t,n,{vertexShaderSource:t.vertexShaderSource,fragmentShaderSource:a,attributeLocations:s})}function nmt(e,t){return r8(e,t,"translucentMRT",$ut)}function imt(e,t){return r8(e,t,"translucentMultipass",emt)}function omt(e,t){return r8(e,t,"alphaMultipass",tmt)}nb.prototype.createDerivedCommands=function(e,t,n){if(l(n)||(n={}),this._translucentMRTSupport){let a,c;return l(n.translucentCommand)&&(a=n.translucentCommand.shaderProgram,c=n.translucentCommand.renderState),n.translucentCommand=et.shallowClone(e,n.translucentCommand),!l(a)||n.shaderProgramId!==e.shaderProgram.id?(n.translucentCommand.shaderProgram=nmt(t,e.shaderProgram),n.translucentCommand.renderState=Qut(this,t,e.renderState),n.shaderProgramId=e.shaderProgram.id):(n.translucentCommand.shaderProgram=a,n.translucentCommand.renderState=c),n}let i,o,r,s;return l(n.translucentCommand)&&(i=n.translucentCommand.shaderProgram,o=n.translucentCommand.renderState,r=n.alphaCommand.shaderProgram,s=n.alphaCommand.renderState),n.translucentCommand=et.shallowClone(e,n.translucentCommand),n.alphaCommand=et.shallowClone(e,n.alphaCommand),!l(i)||n.shaderProgramId!==e.shaderProgram.id?(n.translucentCommand.shaderProgram=imt(t,e.shaderProgram),n.translucentCommand.renderState=jut(this,t,e.renderState),n.alphaCommand.shaderProgram=omt(t,e.shaderProgram),n.alphaCommand.renderState=qut(this,t,e.renderState),n.shaderProgramId=e.shaderProgram.id):(n.translucentCommand.shaderProgram=i,n.translucentCommand.renderState=o,n.alphaCommand.shaderProgram=r,n.alphaCommand.renderState=s),n};function rmt(e,t,n,i,o,r){let s,a,c,{context:d,frameState:u}=t,{useLogDepth:m,shadowState:p}=u,g=t._hdr,f=i.framebuffer,x=p.lightShadowsEnabled;i.framebuffer=e._adjustTranslucentFBO.framebuffer,e._adjustTranslucentCommand.execute(d,i),i.framebuffer=e._adjustAlphaFBO.framebuffer,e._adjustAlphaCommand.execute(d,i);let _=e._opaqueFBO.framebuffer;for(i.framebuffer=e._translucentFBO.framebuffer,c=0;c<o.length;++c)s=o[c],s=m?s.derivedCommands.logDepth.command:s,s=g?s.derivedCommands.hdr.command:s,a=x&&s.receiveShadows?s.derivedCommands.oit.shadows.translucentCommand:s.derivedCommands.oit.translucentCommand,n(a,t,d,i,_);for(l(r)&&(s=r.unclassifiedCommand,a=x&&s.receiveShadows?s.derivedCommands.oit.shadows.translucentCommand:s.derivedCommands.oit.translucentCommand,n(a,t,d,i,_)),i.framebuffer=e._alphaFBO.framebuffer,c=0;c<o.length;++c)s=o[c],s=m?s.derivedCommands.logDepth.command:s,s=g?s.derivedCommands.hdr.command:s,a=x&&s.receiveShadows?s.derivedCommands.oit.shadows.alphaCommand:s.derivedCommands.oit.alphaCommand,n(a,t,d,i,_);l(r)&&(s=r.unclassifiedCommand,a=x&&s.receiveShadows?s.derivedCommands.oit.shadows.alphaCommand:s.derivedCommands.oit.alphaCommand,n(a,t,d,i,_)),i.framebuffer=f}function smt(e,t,n,i,o,r){let{context:s,frameState:a}=t,{useLogDepth:c,shadowState:d}=a,u=t._hdr,m=i.framebuffer,p=d.lightShadowsEnabled;i.framebuffer=e._adjustTranslucentFBO.framebuffer,e._adjustTranslucentCommand.execute(s,i);let g=e._opaqueFBO.framebuffer;i.framebuffer=e._translucentFBO.framebuffer;let f,x;for(let _=0;_<o.length;++_)f=o[_],f=c?f.derivedCommands.logDepth.command:f,f=u?f.derivedCommands.hdr.command:f,x=p&&f.receiveShadows?f.derivedCommands.oit.shadows.translucentCommand:f.derivedCommands.oit.translucentCommand,n(x,t,s,i,g);l(r)&&(f=r.unclassifiedCommand,x=p&&f.receiveShadows?f.derivedCommands.oit.shadows.translucentCommand:f.derivedCommands.oit.translucentCommand,n(x,t,s,i,g)),i.framebuffer=m}nb.prototype.executeCommands=function(e,t,n,i,o){if(this._translucentMRTSupport){smt(this,e,t,n,i,o);return}rmt(this,e,t,n,i,o)};nb.prototype.execute=function(e,t){this._compositeCommand.execute(e,t)};nb.prototype.clear=function(e,t,n){let i=t.framebuffer;t.framebuffer=this._opaqueFBO.framebuffer,Y.clone(n,this._opaqueClearCommand.color),this._opaqueClearCommand.execute(e,t),t.framebuffer=this._translucentFBO.framebuffer,(this._translucentMRTSupport?this._translucentMRTClearCommand:this._translucentMultipassClearCommand).execute(e,t),this._translucentMultipassSupport&&(t.framebuffer=this._alphaFBO.framebuffer,this._alphaClearCommand.execute(e,t)),t.framebuffer=i};nb.prototype.isSupported=function(){return this._translucentMRTSupport||this._translucentMultipassSupport};nb.prototype.isDestroyed=function(){return!1};nb.prototype.destroy=function(){return fxe(this),l(this._compositeCommand)&&(this._compositeCommand.shaderProgram=this._compositeCommand.shaderProgram&&this._compositeCommand.shaderProgram.destroy()),l(this._adjustTranslucentCommand)&&(this._adjustTranslucentCommand.shaderProgram=this._adjustTranslucentCommand.shaderProgram&&this._adjustTranslucentCommand.shaderProgram.destroy()),l(this._adjustAlphaCommand)&&(this._adjustAlphaCommand.shaderProgram=this._adjustAlphaCommand.shaderProgram&&this._adjustAlphaCommand.shaderProgram.destroy()),me(this)};var GF=nb;var HFi=T(S(),1);function EF(){this._framebuffer=new ui({color:!1,depthStencil:!0,supportsDepthTexture:!0}),this._passState=void 0}Object.defineProperties(EF.prototype,{framebuffer:{get:function(){return this._framebuffer.framebuffer}}});function amt(e){e._framebuffer.destroy()}function cmt(e,t){let n=t.drawingBufferWidth,i=t.drawingBufferHeight;e._framebuffer.update(t,n,i);let o=new _c(t);o.blendingEnabled=!1,o.scissorTest={enabled:!0,rectangle:new He},o.viewport=new He,e._passState=o}EF.prototype.update=function(e,t,n){let i=n.width,o=n.height;this._framebuffer.isDirty(i,o)&&cmt(this,e);let r=this.framebuffer,s=this._passState;return s.framebuffer=r,s.viewport.width=i,s.viewport.height=o,s.scissorTest.rectangle.x=t.x,s.scissorTest.rectangle.y=o-t.y,s.scissorTest.rectangle.width=1,s.scissorTest.rectangle.height=1,s};EF.prototype.isDestroyed=function(){return!1};EF.prototype.destroy=function(){return amt(this),me(this)};var XF=EF;var t9i=T(S(),1);function tL(e){let t=new _c(e);t.blendingEnabled=!1,t.scissorTest={enabled:!0,rectangle:new He},t.viewport=new He,this._context=e,this._fb=new ui({depthStencil:!0}),this._passState=t,this._width=0,this._height=0}tL.prototype.begin=function(e,t){let n=this._context,{width:i,height:o}=t;return He.clone(e,this._passState.scissorTest.rectangle),this._width=i,this._height=o,this._fb.update(n,i,o),this._passState.framebuffer=this._fb.framebuffer,this._passState.viewport.width=i,this._passState.viewport.height=o,this._passState};var IF=new Y;tL.prototype.end=function(e){let t=y(e.width,1),n=y(e.height,1),i=this._context,o=i.readPixels({x:e.x,y:e.y,width:t,height:n,framebuffer:this._fb.framebuffer}),r=Math.max(t,n),s=r*r,a=Math.floor(t*.5),c=Math.floor(n*.5),d=0,u=0,m=0,p=-1;for(let g=0;g<s;++g){if(-a<=d&&d<=a&&-c<=u&&u<=c){let f=4*((c-u)*t+d+a);IF.red=Y.byteToFloat(o[f]),IF.green=Y.byteToFloat(o[f+1]),IF.blue=Y.byteToFloat(o[f+2]),IF.alpha=Y.byteToFloat(o[f+3]);let x=i.getObjectByPickColor(IF);if(l(x))return x}if(d===u||d<0&&-d===u||d>0&&d===1-u){let f=m;m=-p,p=f}d+=m,u+=p}};tL.prototype.readVoxelInfo=function(e){let t=y(e.width,1),n=y(e.height,1),o=this._context.readPixels({x:e.x,y:e.y,width:t,height:n,framebuffer:this._fb.framebuffer}),r=Math.floor(t*.5),a=4*(Math.floor(n*.5)*t+r);return o.slice(a,a+4)};tL.prototype.isDestroyed=function(){return!1};tL.prototype.destroy=function(){return this._fb.destroy(),me(this)};var WF=tL;var c9i=T(S(),1);function ib(){this._numSamples=1,this._colorFramebuffer=new ui({depthStencil:!0,supportsDepthTexture:!0}),this._idFramebuffer=new ui({depthStencil:!0,supportsDepthTexture:!0}),this._idClearColor=new Y(0,0,0,0),this._clearCommand=new oi({color:new Y(0,0,0,0),depth:1,owner:this})}function lmt(e){e._colorFramebuffer.destroy(),e._idFramebuffer.destroy()}Object.defineProperties(ib.prototype,{framebuffer:{get:function(){return this._colorFramebuffer.framebuffer}},idFramebuffer:{get:function(){return this._idFramebuffer.framebuffer}},depthStencilTexture:{get:function(){return this._colorFramebuffer.getDepthStencilTexture()}}});ib.prototype.update=function(e,t,n,i){let o=t.width,r=t.height,s=n?e.halfFloatingPointTexture?ze.HALF_FLOAT:ze.FLOAT:ze.UNSIGNED_BYTE;this._numSamples=i,this._colorFramebuffer.update(e,o,r,i,s),this._idFramebuffer.update(e,o,r)};ib.prototype.clear=function(e,t,n){Y.clone(n,this._clearCommand.color),Y.clone(this._idClearColor,this._clearCommand.color),this._colorFramebuffer.clear(e,this._clearCommand,t),this._idFramebuffer.clear(e,this._clearCommand,t)};ib.prototype.getFramebuffer=function(){return this._colorFramebuffer.framebuffer};ib.prototype.getIdFramebuffer=function(){return this._idFramebuffer.framebuffer};ib.prototype.prepareColorTextures=function(e){this._numSamples>1&&this._colorFramebuffer.prepareTextures(e)};ib.prototype.isDestroyed=function(){return!1};ib.prototype.destroy=function(){return lmt(this),me(this)};var AT=ib;var rAi=T(S(),1);var m9i=T(S(),1);function MT(){}MT.getShadowCastShaderKeyword=function(e,t,n,i){return`castShadow ${e} ${t} ${n} ${i}`};MT.createShadowCastVertexShader=function(e,t,n){let i=e.defines.slice(0),o=e.sources.slice(0);i.push("SHADOW_MAP"),n&&i.push("GENERATE_POSITION");let r=Ye.findPositionVarying(e),s=l(r);if(t&&!s){let a=o.length;for(let d=0;d<a;++d)o[d]=Ye.replaceMain(o[d],"czm_shadow_cast_main");o.push(`out vec3 v_positionEC; void main() { czm_shadow_cast_main(); v_positionEC = (czm_inverseProjection * gl_Position).xyz; }`)}return new Ye({defines:i,sources:o})};MT.createShadowCastFragmentShader=function(e,t,n,i){let o=e.defines.slice(0),r=e.sources.slice(0);o.push("SHADOW_MAP");let s=Ye.findPositionVarying(e),a=l(s);a||(s="v_positionEC");let c=r.length;for(let u=0;u<c;++u)r[u]=Ye.replaceMain(r[u],"czm_shadow_cast_main");let d="";return t&&(a||(d+=`in vec3 v_positionEC; `),d+=`uniform vec4 shadowMap_lightPositionEC; `),i?d+=`void main() { `:d+=`void main() { czm_shadow_cast_main(); if (out_FragColor.a == 0.0) { discard; } `,t?d+=` float distance = length(${s}); if (distance >= shadowMap_lightPositionEC.w) { discard; } distance /= shadowMap_lightPositionEC.w; // radius out_FragColor = czm_packDepth(distance); `:n?d+=` out_FragColor = vec4(1.0); `:d+=` out_FragColor = czm_packDepth(gl_FragCoord.z); `,d+=`} `,r.push(d),new Ye({defines:o,sources:r})};MT.getShadowReceiveShaderKeyword=function(e,t,n,i){let o=e._usesDepthTexture,r=e._polygonOffsetSupported,s=e._isPointLight,a=e._isSpotLight,c=e._numberOfCascades>1,d=e.debugCascadeColors,u=e.softShadows;return`receiveShadow ${o}${r}${s}${a}${c}${d}${u}${t}${n}${i}`};MT.createShadowReceiveVertexShader=function(e,t,n){let i=e.defines.slice(0),o=e.sources.slice(0);return i.push("SHADOW_MAP"),t&&(n?i.push("GENERATE_POSITION_AND_NORMAL"):i.push("GENERATE_POSITION")),new Ye({defines:i,sources:o})};MT.createShadowReceiveFragmentShader=function(e,t,n,i,o){let r=Ye.findNormalVarying(e),s=!i&&l(r)||i&&o,a=Ye.findPositionVarying(e),c=l(a),d=t._usesDepthTexture,u=t._polygonOffsetSupported,m=t._isPointLight,p=t._isSpotLight,g=t._numberOfCascades>1,f=t.debugCascadeColors,x=t.softShadows,_=m?t._pointBias:i?t._terrainBias:t._primitiveBias,C=e.defines.slice(0),V=e.sources.slice(0),L=V.length;for(let X=0;X<L;++X)V[X]=Ye.replaceMain(V[X],"czm_shadow_receive_main");m?C.push("USE_CUBE_MAP_SHADOW"):d&&C.push("USE_SHADOW_DEPTH_TEXTURE"),x&&!m&&C.push("USE_SOFT_SHADOWS"),g&&n&&i&&(s?C.push("ENABLE_VERTEX_LIGHTING"):C.push("ENABLE_DAYNIGHT_SHADING")),n&&_.normalShading&&s&&(C.push("USE_NORMAL_SHADING"),_.normalShadingSmooth>0&&C.push("USE_NORMAL_SHADING_SMOOTH"));let Z="";m?Z+=`uniform samplerCube shadowMap_textureCube; `:Z+=`uniform sampler2D shadowMap_texture; `;let G;return c?G=` return vec4(${a}, 1.0); `:G=`#ifndef LOG_DEPTH return czm_windowToEyeCoordinates(gl_FragCoord); #else return vec4(v_logPositionEC, 1.0); #endif `,Z+=`uniform mat4 shadowMap_matrix; uniform vec3 shadowMap_lightDirectionEC; uniform vec4 shadowMap_lightPositionEC; uniform vec4 shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness; uniform vec4 shadowMap_texelSizeDepthBiasAndNormalShadingSmooth; #ifdef LOG_DEPTH in vec3 v_logPositionEC; #endif vec4 getPositionEC() { ${G}} vec3 getNormalEC() { ${s?` return normalize(${r}); `:` return vec3(1.0); `}} void applyNormalOffset(inout vec4 positionEC, vec3 normalEC, float nDotL) { ${_.normalOffset&&s?` float normalOffset = shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness.x; float normalOffsetScale = 1.0 - nDotL; vec3 offset = normalOffset * normalOffsetScale * normalEC; positionEC.xyz += offset; `:""}} `,Z+=`void main() { czm_shadow_receive_main(); vec4 positionEC = getPositionEC(); vec3 normalEC = getNormalEC(); float depth = -positionEC.z; `,Z+=` czm_shadowParameters shadowParameters; shadowParameters.texelStepSize = shadowMap_texelSizeDepthBiasAndNormalShadingSmooth.xy; shadowParameters.depthBias = shadowMap_texelSizeDepthBiasAndNormalShadingSmooth.z; shadowParameters.normalShadingSmooth = shadowMap_texelSizeDepthBiasAndNormalShadingSmooth.w; shadowParameters.darkness = shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness.w; `,i?Z+=` shadowParameters.depthBias *= max(depth * 0.01, 1.0); `:u||(Z+=` shadowParameters.depthBias *= mix(1.0, 100.0, depth * 0.0015); `),m?Z+=` vec3 directionEC = positionEC.xyz - shadowMap_lightPositionEC.xyz; float distance = length(directionEC); directionEC = normalize(directionEC); float radius = shadowMap_lightPositionEC.w; // Stop early if the fragment is beyond the point light radius if (distance > radius) { return; } vec3 directionWC = czm_inverseViewRotation * directionEC; shadowParameters.depth = distance / radius; shadowParameters.nDotL = clamp(dot(normalEC, -directionEC), 0.0, 1.0); shadowParameters.texCoords = directionWC; float visibility = czm_shadowVisibility(shadowMap_textureCube, shadowParameters); `:p?Z+=` vec3 directionEC = normalize(positionEC.xyz - shadowMap_lightPositionEC.xyz); float nDotL = clamp(dot(normalEC, -directionEC), 0.0, 1.0); applyNormalOffset(positionEC, normalEC, nDotL); vec4 shadowPosition = shadowMap_matrix * positionEC; // Spot light uses a perspective projection, so perform the perspective divide shadowPosition /= shadowPosition.w; // Stop early if the fragment is not in the shadow bounds if (any(lessThan(shadowPosition.xyz, vec3(0.0))) || any(greaterThan(shadowPosition.xyz, vec3(1.0)))) { return; } shadowParameters.texCoords = shadowPosition.xy; shadowParameters.depth = shadowPosition.z; shadowParameters.nDotL = nDotL; float visibility = czm_shadowVisibility(shadowMap_texture, shadowParameters); `:g?Z+=` float maxDepth = shadowMap_cascadeSplits[1].w; // Stop early if the eye depth exceeds the last cascade if (depth > maxDepth) { return; } // Get the cascade based on the eye-space depth vec4 weights = czm_cascadeWeights(depth); // Apply normal offset float nDotL = clamp(dot(normalEC, shadowMap_lightDirectionEC), 0.0, 1.0); applyNormalOffset(positionEC, normalEC, nDotL); // Transform position into the cascade vec4 shadowPosition = czm_cascadeMatrix(weights) * positionEC; // Get visibility shadowParameters.texCoords = shadowPosition.xy; shadowParameters.depth = shadowPosition.z; shadowParameters.nDotL = nDotL; float visibility = czm_shadowVisibility(shadowMap_texture, shadowParameters); // Fade out shadows that are far away float shadowMapMaximumDistance = shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness.z; float fade = max((depth - shadowMapMaximumDistance * 0.8) / (shadowMapMaximumDistance * 0.2), 0.0); visibility = mix(visibility, 1.0, fade); ${f?` // Draw cascade colors for debugging out_FragColor *= czm_cascadeColor(weights); `:""}`:Z+=` float nDotL = clamp(dot(normalEC, shadowMap_lightDirectionEC), 0.0, 1.0); applyNormalOffset(positionEC, normalEC, nDotL); vec4 shadowPosition = shadowMap_matrix * positionEC; // Stop early if the fragment is not in the shadow bounds if (any(lessThan(shadowPosition.xyz, vec3(0.0))) || any(greaterThan(shadowPosition.xyz, vec3(1.0)))) { return; } shadowParameters.texCoords = shadowPosition.xy; shadowParameters.depth = shadowPosition.z; shadowParameters.nDotL = nDotL; float visibility = czm_shadowVisibility(shadowMap_texture, shadowParameters); `,Z+=` out_FragColor.rgb *= visibility; } `,V.push(Z),new Ye({defines:C,sources:V})};var Hf=MT;function zf(e){e=y(e,y.EMPTY_OBJECT);let t=e.context;this._enabled=y(e.enabled,!0),this._softShadows=y(e.softShadows,!1),this._normalOffset=y(e.normalOffset,!0),this.dirty=!0,this.fromLightSource=y(e.fromLightSource,!0),this.darkness=y(e.darkness,.3),this._darkness=this.darkness,this.fadingEnabled=y(e.fadingEnabled,!0),this.maximumDistance=y(e.maximumDistance,5e3),this._outOfView=!1,this._outOfViewPrevious=!1,this._needsUpdate=!0;let n=!0;(Yt.isInternetExplorer()||Yt.isEdge()||(Yt.isChrome()||Yt.isFirefox())&&Yt.isWindows()&&!t.depthTexture)&&(n=!1),this._polygonOffsetSupported=n,this._terrainBias={polygonOffset:n,polygonOffsetFactor:1.1,polygonOffsetUnits:4,normalOffset:this._normalOffset,normalOffsetScale:.5,normalShading:!0,normalShadingSmooth:.3,depthBias:1e-4},this._primitiveBias={polygonOffset:n,polygonOffsetFactor:1.1,polygonOffsetUnits:4,normalOffset:this._normalOffset,normalOffsetScale:.1,normalShading:!0,normalShadingSmooth:.05,depthBias:2e-5},this._pointBias={polygonOffset:!1,polygonOffsetFactor:1.1,polygonOffsetUnits:4,normalOffset:this._normalOffset,normalOffsetScale:0,normalShading:!0,normalShadingSmooth:.1,depthBias:5e-4},this._depthAttachment=void 0,this._colorAttachment=void 0,this._shadowMapMatrix=new M,this._shadowMapTexture=void 0,this._lightDirectionEC=new h,this._lightPositionEC=new se,this._distance=0,this._lightCamera=e.lightCamera,this._shadowMapCamera=new t3,this._shadowMapCullingVolume=void 0,this._sceneCamera=void 0,this._boundingSphere=new le,this._isPointLight=y(e.isPointLight,!1),this._pointLightRadius=y(e.pointLightRadius,100),this._cascadesEnabled=this._isPointLight?!1:y(e.cascadesEnabled,!0),this._numberOfCascades=this._cascadesEnabled?y(e.numberOfCascades,4):0,this._fitNearFar=!0,this._maximumCascadeDistances=[25,150,700,Number.MAX_VALUE],this._textureSize=new D,this._isSpotLight=!1,this._cascadesEnabled?this._shadowMapCamera.frustum=new Zr:l(this._lightCamera.frustum.fov)&&(this._isSpotLight=!0),this._cascadeSplits=[new se,new se],this._cascadeMatrices=[new M,new M,new M,new M],this._cascadeDistances=new se;let i;this._isPointLight?i=6:this._cascadesEnabled?i=this._numberOfCascades:i=1,this._passes=new Array(i);for(let o=0;o<i;++o)this._passes[o]=new dmt(t);this.debugShow=!1,this.debugFreezeFrame=!1,this._debugFreezeFrame=!1,this._debugCascadeColors=!1,this._debugLightFrustum=void 0,this._debugCameraFrustum=void 0,this._debugCascadeFrustums=new Array(this._numberOfCascades),this._debugShadowViewCommand=void 0,this._usesDepthTexture=t.depthTexture,this._isPointLight&&(this._usesDepthTexture=!1),this._primitiveRenderState=void 0,this._terrainRenderState=void 0,this._pointRenderState=void 0,a8(this),this._clearCommand=new oi({depth:1,color:new Y}),this._clearPassState=new _c(t),this._size=y(e.size,2048),this.size=this._size}zf.MAXIMUM_DISTANCE=2e4;function dmt(e){this.camera=new t3,this.passState=new _c(e),this.framebuffer=void 0,this.textureOffsets=void 0,this.commandList=[],this.cullingVolume=void 0}function s8(e,t){return De.fromCache({cull:{enabled:!0,face:bi.BACK},depthTest:{enabled:!0},colorMask:{red:e,green:e,blue:e,alpha:e},depthMask:!0,polygonOffset:{enabled:t.polygonOffset,factor:t.polygonOffsetFactor,units:t.polygonOffsetUnits}})}function a8(e){let t=!e._usesDepthTexture;e._primitiveRenderState=s8(t,e._primitiveBias),e._terrainRenderState=s8(t,e._terrainBias),e._pointRenderState=s8(t,e._pointBias)}zf.prototype.debugCreateRenderStates=function(){a8(this)};Object.defineProperties(zf.prototype,{enabled:{get:function(){return this._enabled},set:function(e){this.dirty=this._enabled!==e,this._enabled=e}},normalOffset:{get:function(){return this._normalOffset},set:function(e){this.dirty=this._normalOffset!==e,this._normalOffset=e,this._terrainBias.normalOffset=e,this._primitiveBias.normalOffset=e,this._pointBias.normalOffset=e}},softShadows:{get:function(){return this._softShadows},set:function(e){this.dirty=this._softShadows!==e,this._softShadows=e}},size:{get:function(){return this._size},set:function(e){bmt(this,e)}},outOfView:{get:function(){return this._outOfView}},shadowMapCullingVolume:{get:function(){return this._shadowMapCullingVolume}},passes:{get:function(){return this._passes}},isPointLight:{get:function(){return this._isPointLight}},debugCascadeColors:{get:function(){return this._debugCascadeColors},set:function(e){this.dirty=this._debugCascadeColors!==e,this._debugCascadeColors=e}}});function c8(e){let t=e._passes.length;for(let n=0;n<t;++n){let i=e._passes[n],o=i.framebuffer;l(o)&&!o.isDestroyed()&&o.destroy(),i.framebuffer=void 0}e._depthAttachment=e._depthAttachment&&e._depthAttachment.destroy(),e._colorAttachment=e._colorAttachment&&e._colorAttachment.destroy()}function umt(e,t){let n=new Vd({context:t,width:e._textureSize.x,height:e._textureSize.y,format:jc.DEPTH_COMPONENT16}),i=new Et({context:t,width:e._textureSize.x,height:e._textureSize.y,pixelFormat:at.RGBA,pixelDatatype:ze.UNSIGNED_BYTE,sampler:sn.NEAREST}),o=new ia({context:t,depthRenderbuffer:n,colorTextures:[i],destroyAttachments:!1}),r=e._passes.length;for(let s=0;s<r;++s){let a=e._passes[s];a.framebuffer=o,a.passState.framebuffer=o}e._shadowMapTexture=i,e._depthAttachment=n,e._colorAttachment=i}function mmt(e,t){let n=new Et({context:t,width:e._textureSize.x,height:e._textureSize.y,pixelFormat:at.DEPTH_STENCIL,pixelDatatype:ze.UNSIGNED_INT_24_8,sampler:sn.NEAREST}),i=new ia({context:t,depthStencilTexture:n,destroyAttachments:!1}),o=e._passes.length;for(let r=0;r<o;++r){let s=e._passes[r];s.framebuffer=i,s.passState.framebuffer=i}e._shadowMapTexture=n,e._depthAttachment=n}function hmt(e,t){let n=new Vd({context:t,width:e._textureSize.x,height:e._textureSize.y,format:jc.DEPTH_COMPONENT16}),i=new sc({context:t,width:e._textureSize.x,height:e._textureSize.y,pixelFormat:at.RGBA,pixelDatatype:ze.UNSIGNED_BYTE,sampler:sn.NEAREST}),o=[i.negativeX,i.negativeY,i.negativeZ,i.positiveX,i.positiveY,i.positiveZ];for(let r=0;r<6;++r){let s=new ia({context:t,depthRenderbuffer:n,colorTextures:[o[r]],destroyAttachments:!1}),a=e._passes[r];a.framebuffer=s,a.passState.framebuffer=s}e._shadowMapTexture=i,e._depthAttachment=n,e._colorAttachment=i}function gxe(e,t){e._isPointLight?hmt(e,t):e._usesDepthTexture?mmt(e,t):umt(e,t)}function fmt(e,t){e._usesDepthTexture&&e._passes[0].framebuffer.status!==ne.FRAMEBUFFER_COMPLETE&&(e._usesDepthTexture=!1,a8(e),c8(e),gxe(e,t))}function pmt(e,t){(!l(e._passes[0].framebuffer)||e._shadowMapTexture.width!==e._textureSize.x)&&(c8(e),gxe(e,t),fmt(e,t),yxe(e,t))}function yxe(e,t,n){n=y(n,0),(e._isPointLight||n===0)&&(e._clearCommand.framebuffer=e._passes[n].framebuffer,e._clearCommand.execute(t,e._clearPassState))}function bmt(e,t){e._size=t;let n=e._passes,i=n.length,o=e._textureSize;if(e._isPointLight){t=Mt.maximumCubeMapSize>=t?t:Mt.maximumCubeMapSize,o.x=t,o.y=t;let r=new He(0,0,t,t);n[0].passState.viewport=r,n[1].passState.viewport=r,n[2].passState.viewport=r,n[3].passState.viewport=r,n[4].passState.viewport=r,n[5].passState.viewport=r}else i===1?(t=Mt.maximumTextureSize>=t?t:Mt.maximumTextureSize,o.x=t,o.y=t,n[0].passState.viewport=new He(0,0,t,t)):i===4&&(t=Mt.maximumTextureSize>=t*2?t:Mt.maximumTextureSize/2,o.x=t*2,o.y=t*2,n[0].passState.viewport=new He(0,0,t,t),n[1].passState.viewport=new He(t,0,t,t),n[2].passState.viewport=new He(0,t,t,t),n[3].passState.viewport=new He(t,t,t,t));e._clearPassState.viewport=new He(0,0,o.x,o.y);for(let r=0;r<i;++r){let s=n[r],a=s.passState.viewport,c=a.x/o.x,d=a.y/o.y,u=a.width/o.x,m=a.height/o.y;s.textureOffsets=new M(u,0,0,c,0,m,0,d,0,0,1,0,0,0,0,1)}}var gmt=new He;function ymt(e,t){let n;e._isPointLight?n=`uniform samplerCube shadowMap_textureCube; in vec2 v_textureCoordinates; void main() { vec2 uv = v_textureCoordinates; vec3 dir; if (uv.y < 0.5) { if (uv.x < 0.333) { dir.x = -1.0; dir.y = uv.x * 6.0 - 1.0; dir.z = uv.y * 4.0 - 1.0; } else if (uv.x < 0.666) { dir.y = -1.0; dir.x = uv.x * 6.0 - 3.0; dir.z = uv.y * 4.0 - 1.0; } else { dir.z = -1.0; dir.x = uv.x * 6.0 - 5.0; dir.y = uv.y * 4.0 - 1.0; } } else { if (uv.x < 0.333) { dir.x = 1.0; dir.y = uv.x * 6.0 - 1.0; dir.z = uv.y * 4.0 - 3.0; } else if (uv.x < 0.666) { dir.y = 1.0; dir.x = uv.x * 6.0 - 3.0; dir.z = uv.y * 4.0 - 3.0; } else { dir.z = 1.0; dir.x = uv.x * 6.0 - 5.0; dir.y = uv.y * 4.0 - 3.0; } } float shadow = czm_unpackDepth(czm_textureCube(shadowMap_textureCube, dir)); out_FragColor = vec4(vec3(shadow), 1.0); } `:n=`uniform sampler2D shadowMap_texture; in vec2 v_textureCoordinates; void main() { ${e._usesDepthTexture?` float shadow = texture(shadowMap_texture, v_textureCoordinates).r; `:` float shadow = czm_unpackDepth(texture(shadowMap_texture, v_textureCoordinates)); `} out_FragColor = vec4(vec3(shadow), 1.0); } `;let i=t.createViewportQuadCommand(n,{uniformMap:{shadowMap_texture:function(){return e._shadowMapTexture},shadowMap_textureCube:function(){return e._shadowMapTexture}}});return i.pass=Re.OVERLAY,i}function xmt(e,t){let n=t.context,i=t.context.drawingBufferWidth,o=t.context.drawingBufferHeight,r=Math.min(i,o)*.3,s=gmt;s.x=i-r,s.y=0,s.width=r,s.height=r;let a=e._debugShadowViewCommand;l(a)||(a=ymt(e,n),e._debugShadowViewCommand=a),(!l(a.renderState)||!He.equals(a.renderState.viewport,s))&&(a.renderState=De.fromCache({viewport:He.clone(s)})),t.commandList.push(e._debugShadowViewCommand)}var Kf=new Array(8);Kf[0]=new se(-1,-1,-1,1);Kf[1]=new se(1,-1,-1,1);Kf[2]=new se(1,1,-1,1);Kf[3]=new se(-1,1,-1,1);Kf[4]=new se(-1,-1,1,1);Kf[5]=new se(1,-1,1,1);Kf[6]=new se(1,1,1,1);Kf[7]=new se(-1,1,1,1);var Ry=new M,l8=new Array(8);for(let e=0;e<8;++e)l8[e]=new se;function _mt(e,t){let n=new St({geometry:new gm({minimum:new h(-.5,-.5,-.5),maximum:new h(.5,.5,.5)}),attributes:{color:Ht.fromColor(t)}}),i=new St({geometry:new Pp({radius:.5}),attributes:{color:Ht.fromColor(t)}});return new En({geometryInstances:[n,i],appearance:new dn({translucent:!1,flat:!0}),asynchronous:!1,modelMatrix:e})}var Tmt=[Y.RED,Y.GREEN,Y.BLUE,Y.MAGENTA],Smt=new h;function Cmt(e,t){xmt(e,t);let n=e.debugFreezeFrame&&!e._debugFreezeFrame;if(e._debugFreezeFrame=e.debugFreezeFrame,e.debugFreezeFrame&&(n&&(e._debugCameraFrustum=e._debugCameraFrustum&&e._debugCameraFrustum.destroy(),e._debugCameraFrustum=new Df({camera:e._sceneCamera,color:Y.CYAN,updateOnChange:!1})),e._debugCameraFrustum.update(t)),e._cascadesEnabled){if(e.debugFreezeFrame){n&&(e._debugLightFrustum=e._debugLightFrustum&&e._debugLightFrustum.destroy(),e._debugLightFrustum=new Df({camera:e._shadowMapCamera,color:Y.YELLOW,updateOnChange:!1})),e._debugLightFrustum.update(t);for(let i=0;i<e._numberOfCascades;++i)n&&(e._debugCascadeFrustums[i]=e._debugCascadeFrustums[i]&&e._debugCascadeFrustums[i].destroy(),e._debugCascadeFrustums[i]=new Df({camera:e._passes[i].camera,color:Tmt[i],updateOnChange:!1})),e._debugCascadeFrustums[i].update(t)}}else if(e._isPointLight){if(!l(e._debugLightFrustum)||e._needsUpdate){let i=e._shadowMapCamera.positionWC,o=we.IDENTITY,r=e._pointLightRadius*2,s=h.fromElements(r,r,r,Smt),a=M.fromTranslationQuaternionRotationScale(i,o,s,Ry);e._debugLightFrustum=e._debugLightFrustum&&e._debugLightFrustum.destroy(),e._debugLightFrustum=_mt(a,Y.YELLOW)}e._debugLightFrustum.update(t)}else(!l(e._debugLightFrustum)||e._needsUpdate)&&(e._debugLightFrustum=new Df({camera:e._shadowMapCamera,color:Y.YELLOW,updateOnChange:!1})),e._debugLightFrustum.update(t)}function t3(){this.viewMatrix=new M,this.inverseViewMatrix=new M,this.frustum=void 0,this.positionCartographic=new he,this.positionWC=new h,this.directionWC=h.clone(h.UNIT_Z),this.upWC=h.clone(h.UNIT_Y),this.rightWC=h.clone(h.UNIT_X),this.viewProjectionMatrix=new M}t3.prototype.clone=function(e){M.clone(e.viewMatrix,this.viewMatrix),M.clone(e.inverseViewMatrix,this.inverseViewMatrix),this.frustum=e.frustum.clone(this.frustum),he.clone(e.positionCartographic,this.positionCartographic),h.clone(e.positionWC,this.positionWC),h.clone(e.directionWC,this.directionWC),h.clone(e.upWC,this.upWC),h.clone(e.rightWC,this.rightWC)};var Vmt=new M(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1);t3.prototype.getViewProjection=function(){let e=this.viewMatrix,t=this.frustum.projectionMatrix;return M.multiply(t,e,this.viewProjectionMatrix),M.multiply(Vmt,this.viewProjectionMatrix,this.viewProjectionMatrix),this.viewProjectionMatrix};var Lmt=new Array(5),Rmt=new yi,Zmt=new Array(4),xxe=new h,_xe=new h;function Gmt(e,t){let n=e._shadowMapCamera,i=e._sceneCamera,o=i.frustum.near,r=i.frustum.far,s=e._numberOfCascades,a,c=r-o,d=r/o,u=.9,m=!1;t.shadowState.closestObjectSize<200&&(m=!0,u=.9);let p=Zmt,g=Lmt;for(g[0]=o,g[s]=r,a=0;a<s;++a){let A=(a+1)/s,b=o*Math.pow(d,A),R=o+c*A,E=W.lerp(R,b,u);g[a+1]=E,p[a]=E-g[a]}if(m){for(a=0;a<s;++a)p[a]=Math.min(p[a],e._maximumCascadeDistances[a]);let A=g[0];for(a=0;a<s-1;++a)A+=p[a],g[a+1]=A}se.unpack(g,0,e._cascadeSplits[0]),se.unpack(g,1,e._cascadeSplits[1]),se.unpack(p,0,e._cascadeDistances);let f=n.frustum,x=f.left,_=f.right,C=f.bottom,V=f.top,L=f.near,Z=f.far,G=n.positionWC,X=n.directionWC,v=n.upWC,P=i.frustum.clone(Rmt),F=n.getViewProjection();for(a=0;a<s;++a){P.near=g[a],P.far=g[a+1];let A=M.multiply(P.projectionMatrix,i.viewMatrix,Ry),b=M.inverse(A,Ry),R=M.multiply(F,b,Ry),E=h.fromElements(Number.MAX_VALUE,Number.MAX_VALUE,Number.MAX_VALUE,xxe),I=h.fromElements(-Number.MAX_VALUE,-Number.MAX_VALUE,-Number.MAX_VALUE,_xe);for(let O=0;O<8;++O){let k=se.clone(Kf[O],l8[O]);M.multiplyByVector(R,k,k),h.divideByScalar(k,k.w,k),h.minimumByComponent(k,E,E),h.maximumByComponent(k,I,I)}E.x=Math.max(E.x,0),E.y=Math.max(E.y,0),E.z=0,I.x=Math.min(I.x,1),I.y=Math.min(I.y,1),I.z=Math.min(I.z,1);let w=e._passes[a],N=w.camera;N.clone(n);let B=N.frustum;B.left=x+E.x*(_-x),B.right=x+I.x*(_-x),B.bottom=C+E.y*(V-C),B.top=C+I.y*(V-C),B.near=L+E.z*(Z-L),B.far=L+I.z*(Z-L),w.cullingVolume=N.frustum.computeCullingVolume(G,X,v);let U=e._cascadeMatrices[a];M.multiply(N.getViewProjection(),i.inverseViewMatrix,U),M.multiply(w.textureOffsets,U,U)}}var Emt=new M,Xmt=new h,Imt=new h,pxe=new h;function Wmt(e,t){let n=e._shadowMapCamera,i=e._sceneCamera,o=M.multiply(i.frustum.projectionMatrix,i.viewMatrix,Ry),r=M.inverse(o,Ry),s=n.directionWC,a=i.directionWC;h.equalsEpsilon(s,a,W.EPSILON10)&&(a=i.upWC);let c=h.cross(s,a,Xmt);a=h.cross(c,s,Imt),h.normalize(a,a),h.normalize(c,c);let d=h.fromElements(0,0,0,pxe),u=M.computeView(d,s,a,c,Emt),m=M.multiply(u,r,Ry),p=h.fromElements(Number.MAX_VALUE,Number.MAX_VALUE,Number.MAX_VALUE,xxe),g=h.fromElements(-Number.MAX_VALUE,-Number.MAX_VALUE,-Number.MAX_VALUE,_xe);for(let Z=0;Z<8;++Z){let G=se.clone(Kf[Z],l8[Z]);M.multiplyByVector(m,G,G),h.divideByScalar(G,G.w,G),h.minimumByComponent(G,p,p),h.maximumByComponent(G,g,g)}g.z+=1e3,p.z-=10;let f=pxe;f.x=-(.5*(p.x+g.x)),f.y=-(.5*(p.y+g.y)),f.z=-g.z;let x=M.fromTranslation(f,Ry);u=M.multiply(x,u,u);let _=.5*(g.x-p.x),C=.5*(g.y-p.y),V=g.z-p.z,L=n.frustum;L.left=-_,L.right=_,L.bottom=-C,L.top=C,L.near=.01,L.far=V,M.clone(u,n.viewMatrix),M.inverse(u,n.inverseViewMatrix),M.getTranslation(n.inverseViewMatrix,n.positionWC),t.mapProjection.ellipsoid.cartesianToCartographic(n.positionWC,n.positionCartographic),h.clone(s,n.directionWC),h.clone(a,n.upWC),h.clone(c,n.rightWC)}var Pmt=[new h(-1,0,0),new h(0,-1,0),new h(0,0,-1),new h(1,0,0),new h(0,1,0),new h(0,0,1)],vmt=[new h(0,-1,0),new h(0,0,-1),new h(0,-1,0),new h(0,-1,0),new h(0,0,1),new h(0,-1,0)],wmt=[new h(0,0,1),new h(1,0,0),new h(-1,0,0),new h(0,0,-1),new h(1,0,0),new h(1,0,0)];function Fmt(e,t){let n=new yi;n.fov=W.PI_OVER_TWO,n.near=1,n.far=e._pointLightRadius,n.aspectRatio=1;for(let i=0;i<6;++i){let o=e._passes[i].camera;o.positionWC=e._shadowMapCamera.positionWC,o.positionCartographic=t.mapProjection.ellipsoid.cartesianToCartographic(o.positionWC,o.positionCartographic),o.directionWC=Pmt[i],o.upWC=vmt[i],o.rightWC=wmt[i],M.computeView(o.positionWC,o.directionWC,o.upWC,o.rightWC,o.viewMatrix),M.inverse(o.viewMatrix,o.inverseViewMatrix),o.frustum=n}}var Amt=new h,Mmt=new h,Txe=new le,bxe=Txe.center;function Nmt(e,t){let n=e._sceneCamera,i=e._shadowMapCamera,o=Txe;if(e._cascadesEnabled){if(n.frustum.near>=e.maximumDistance){e._outOfView=!0,e._needsUpdate=!1;return}let r=t.mapProjection.ellipsoid.geodeticSurfaceNormal(n.positionWC,Amt),s=h.negate(i.directionWC,Mmt),a=h.dot(r,s);if(e.fadingEnabled){let c=W.clamp(a/.1,0,1);e._darkness=W.lerp(1,e.darkness,c)}else e._darkness=e.darkness;if(a<0){e._outOfView=!0,e._needsUpdate=!1;return}e._needsUpdate=!0,e._outOfView=!1}else if(e._isPointLight)o.center=i.positionWC,o.radius=e._pointLightRadius,e._outOfView=t.cullingVolume.computeVisibility(o)===Kt.OUTSIDE,e._needsUpdate=!e._outOfView&&!e._boundingSphere.equals(o),le.clone(o,e._boundingSphere);else{let r=i.frustum.far/2,s=h.add(i.positionWC,h.multiplyByScalar(i.directionWC,r,bxe),bxe);o.center=s,o.radius=r,e._outOfView=t.cullingVolume.computeVisibility(o)===Kt.OUTSIDE,e._needsUpdate=!e._outOfView&&!e._boundingSphere.equals(o),le.clone(o,e._boundingSphere)}}function kmt(e,t){let n=t.camera,i=e._lightCamera,o=e._sceneCamera,r=e._shadowMapCamera;e._cascadesEnabled?h.clone(i.directionWC,r.directionWC):e._isPointLight?h.clone(i.positionWC,r.positionWC):r.clone(i);let s=e._lightDirectionEC;M.multiplyByPointAsVector(n.viewMatrix,r.directionWC,s),h.normalize(s,s),h.negate(s,s),M.multiplyByPoint(n.viewMatrix,r.positionWC,e._lightPositionEC),e._lightPositionEC.w=e._pointLightRadius;let a,c;e._fitNearFar?(a=Math.min(t.shadowState.nearPlane,e.maximumDistance),c=Math.min(t.shadowState.farPlane,e.maximumDistance),c=Math.max(c,a+1)):(a=n.frustum.near,c=e.maximumDistance),e._sceneCamera=ao.clone(n,o),n.frustum.clone(e._sceneCamera.frustum),e._sceneCamera.frustum.near=a,e._sceneCamera.frustum.far=c,e._distance=c-a,Nmt(e,t),!e._outOfViewPrevious&&e._outOfView&&(e._needsUpdate=!0),e._outOfViewPrevious=e._outOfView}zf.prototype.update=function(e){if(kmt(this,e),this._needsUpdate)if(pmt(this,e.context),this._isPointLight&&Fmt(this,e),this._cascadesEnabled&&(Wmt(this,e),this._numberOfCascades>1&&Gmt(this,e)),this._isPointLight)this._shadowMapCullingVolume=rs.fromBoundingSphere(this._boundingSphere);else{let t=this._shadowMapCamera,n=t.positionWC,i=t.directionWC,o=t.upWC;this._shadowMapCullingVolume=t.frustum.computeCullingVolume(n,i,o),this._passes.length===1&&this._passes[0].camera.clone(t)}if(this._passes.length===1){let t=this._sceneCamera.inverseViewMatrix;M.multiply(this._shadowMapCamera.getViewProjection(),t,this._shadowMapMatrix)}this.debugShow&&Cmt(this,e)};zf.prototype.updatePass=function(e,t){yxe(this,e,t)};var Umt=new D;function Sxe(e,t,n){let i=e._isPointLight?e._pointBias:n?e._terrainBias:e._primitiveBias,o={shadowMap_texture:function(){return e._shadowMapTexture},shadowMap_textureCube:function(){return e._shadowMapTexture},shadowMap_matrix:function(){return e._shadowMapMatrix},shadowMap_cascadeSplits:function(){return e._cascadeSplits},shadowMap_cascadeMatrices:function(){return e._cascadeMatrices},shadowMap_lightDirectionEC:function(){return e._lightDirectionEC},shadowMap_lightPositionEC:function(){return e._lightPositionEC},shadowMap_cascadeDistances:function(){return e._cascadeDistances},shadowMap_texelSizeDepthBiasAndNormalShadingSmooth:function(){let r=Umt;return r.x=1/e._textureSize.x,r.y=1/e._textureSize.y,se.fromElements(r.x,r.y,i.depthBias,i.normalShadingSmooth,this.combinedUniforms1)},shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness:function(){return se.fromElements(i.normalOffsetScale,e._distance,e.maximumDistance,e._darkness,this.combinedUniforms2)},combinedUniforms1:new se,combinedUniforms2:new se};return xt(t,o,!1)}function Dmt(e,t,n,i,o,r){let s,a,c;if(l(r)&&(s=r.shaderProgram,a=r.renderState,c=r.uniformMap),r=et.shallowClone(n,r),r.castShadows=!0,r.receiveShadows=!1,!l(s)||o!==n.shaderProgram.id||t){let d=n.shaderProgram,u=n.pass===Re.GLOBE,m=n.pass!==Re.TRANSLUCENT,p=e._isPointLight,g=e._usesDepthTexture,f=Hf.getShadowCastShaderKeyword(p,u,g,m);if(s=i.shaderCache.getDerivedShaderProgram(d,f),!l(s)){let _=d.vertexShaderSource,C=d.fragmentShaderSource,V=Hf.createShadowCastVertexShader(_,p,u),L=Hf.createShadowCastFragmentShader(C,p,g,m);s=i.shaderCache.createDerivedShaderProgram(d,f,{vertexShaderSource:V,fragmentShaderSource:L,attributeLocations:d._attributeLocations})}a=e._primitiveRenderState,p?a=e._pointRenderState:u&&(a=e._terrainRenderState),n.renderState.cull.enabled||(a=Oe(a,!1),a.cull=Oe(a.cull,!1),a.cull.enabled=!1,a=De.fromCache(a)),c=Sxe(e,n.uniformMap,u)}return r.shaderProgram=s,r.renderState=a,r.uniformMap=c,r}zf.createReceiveDerivedCommand=function(e,t,n,i,o){l(o)||(o={});let r=e.length>0,s=t.shaderProgram,a=s.vertexShaderSource,c=s.fragmentShaderSource,d=t.pass===Re.GLOBE,u=!1;if(d&&(u=t.owner.data.renderedMesh.encoding.hasVertexNormals),t.receiveShadows&&r){let m,p;l(o.receiveCommand)&&(m=o.receiveCommand.shaderProgram,p=o.receiveCommand.uniformMap),o.receiveCommand=et.shallowClone(t,o.receiveCommand),o.castShadows=!1,o.receiveShadows=!0;let g=o.receiveShaderCastShadows!==t.castShadows,f=o.receiveShaderProgramId!==t.shaderProgram.id;if(!l(m)||f||n||g){let x=Hf.getShadowReceiveShaderKeyword(e[0],t.castShadows,d,u);if(m=i.shaderCache.getDerivedShaderProgram(s,x),!l(m)){let _=Hf.createShadowReceiveVertexShader(a,d,u),C=Hf.createShadowReceiveFragmentShader(c,e[0],t.castShadows,d,u);m=i.shaderCache.createDerivedShaderProgram(s,x,{vertexShaderSource:_,fragmentShaderSource:C,attributeLocations:s._attributeLocations})}p=Sxe(e[0],t.uniformMap,d)}o.receiveCommand.shaderProgram=m,o.receiveCommand.uniformMap=p,o.receiveShaderProgramId=t.shaderProgram.id,o.receiveShaderCastShadows=t.castShadows}return o};zf.createCastDerivedCommand=function(e,t,n,i,o){if(l(o)||(o={}),t.castShadows){let r=o.castCommands;l(r)||(r=o.castCommands=[]);let s=o.castShaderProgramId,a=e.length;r.length=a;for(let c=0;c<a;++c)r[c]=Dmt(e[c],n,t,i,s,r[c]);o.castShaderProgramId=t.shaderProgram.id}return o};zf.prototype.isDestroyed=function(){return!1};zf.prototype.destroy=function(){c8(this),this._debugLightFrustum=this._debugLightFrustum&&this._debugLightFrustum.destroy(),this._debugCameraFrustum=this._debugCameraFrustum&&this._debugCameraFrustum.destroy(),this._debugShadowViewCommand=this._debugShadowViewCommand&&this._debugShadowViewCommand.shaderProgram&&this._debugShadowViewCommand.shaderProgram.destroy();for(let e=0;e<this._numberOfCascades;++e)this._debugCascadeFrustums[e]=this._debugCascadeFrustums[e]&&this._debugCascadeFrustums[e].destroy();return me(this)};var ob=zf;var GAi=T(S(),1);var aAi=T(S(),1),NT=`uniform sampler2D colorTexture; #ifdef DEBUG_SHOW_DEPTH uniform sampler2D u_packedTranslucentDepth; #endif in vec2 v_textureCoordinates; void main() { #ifdef DEBUG_SHOW_DEPTH if (v_textureCoordinates.x < 0.5) { out_FragColor.rgb = vec3(czm_unpackDepth(texture(u_packedTranslucentDepth, v_textureCoordinates))); out_FragColor.a = 1.0; } #else vec4 color = texture(colorTexture, v_textureCoordinates); #ifdef PICK if (color == vec4(0.0)) { discard; } #else // Reverse premultiplication process to get the correct composited result of the classification primitives color.rgb /= color.a; #endif out_FragColor = color; #endif } `;var Bmt=!1;function Zy(e){this._drawClassificationFBO=new ui({createDepthAttachments:!1}),this._accumulationFBO=new ui({createDepthAttachments:!1}),this._packFBO=new ui,this._opaqueDepthStencilTexture=void 0,this._textureToComposite=void 0,this._translucentDepthStencilTexture=void 0,this._packDepthCommand=void 0,this._accumulateCommand=void 0,this._compositeCommand=void 0,this._copyCommand=void 0,this._clearColorCommand=new oi({color:new Y(0,0,0,0),owner:this}),this._clearDepthStencilCommand=new oi({depth:1,stencil:0,owner:this}),this._supported=e.depthTexture,this._viewport=new He,this._rsDepth=void 0,this._rsAccumulate=void 0,this._rsComp=void 0,this._useScissorTest=void 0,this._scissorRectangle=void 0,this._hasTranslucentDepth=!1,this._frustumsDrawn=0}Object.defineProperties(Zy.prototype,{hasTranslucentDepth:{get:function(){return this._hasTranslucentDepth}}});function Cxe(e){e._textureToComposite=void 0,e._translucentDepthStencilTexture=e._translucentDepthStencilTexture&&!e._translucentDepthStencilTexture.isDestroyed()&&e._translucentDepthStencilTexture.destroy()}function Vxe(e){e._drawClassificationFBO.destroy(),e._accumulationFBO.destroy(),e._packFBO.destroy()}function Ymt(e,t,n,i){Cxe(e),e._translucentDepthStencilTexture=new Et({context:t,width:n,height:i,pixelFormat:at.DEPTH_STENCIL,pixelDatatype:ze.UNSIGNED_INT_24_8,sampler:sn.NEAREST})}function Omt(e,t,n,i){Vxe(e),e._drawClassificationFBO.setDepthStencilTexture(e._translucentDepthStencilTexture),e._drawClassificationFBO.update(t,n,i),e._accumulationFBO.setDepthStencilTexture(e._translucentDepthStencilTexture),e._accumulationFBO.update(t,n,i),e._packFBO.update(t,n,i)}function Hmt(e,t,n,i){if(!e.isSupported())return;e._opaqueDepthStencilTexture=i;let o=e._opaqueDepthStencilTexture.width,r=e._opaqueDepthStencilTexture.height;e._drawClassificationFBO.isDirty(o,r)&&(Ymt(e,t,o,r),Omt(e,t,o,r));let s,a;if(l(e._packDepthCommand)||(s=new Ye({sources:[fw]}),a={u_opaqueDepthTexture:function(){return e._opaqueDepthStencilTexture},u_translucentDepthTexture:function(){return e._translucentDepthStencilTexture}},e._packDepthCommand=t.createViewportQuadCommand(s,{uniformMap:a,owner:e})),!l(e._compositeCommand)){s=new Ye({sources:[NT]}),a={colorTexture:function(){return e._textureToComposite}},Bmt&&(s.defines=["DEBUG_SHOW_DEPTH"],a.u_packedTranslucentDepth=function(){return e._packFBO.getColorTexture()}),e._compositeCommand=t.createViewportQuadCommand(s,{uniformMap:a,owner:e});let u=e._compositeCommand,m=u.shaderProgram,p=t.shaderCache.createDerivedShaderProgram(m,"pick",{vertexShaderSource:m.vertexShaderSource,fragmentShaderSource:new Ye({sources:s.sources,defines:["PICK"]}),attributeLocations:m._attributeLocations}),g=et.shallowClone(u);g.shaderProgram=p,u.derivedCommands.pick=g}l(e._copyCommand)||(s=new Ye({sources:[NT]}),a={colorTexture:function(){return e._drawClassificationFBO.getColorTexture()}},e._copyCommand=t.createViewportQuadCommand(s,{uniformMap:a,owner:e})),l(e._accumulateCommand)||(s=new Ye({sources:[NT]}),a={colorTexture:function(){return e._drawClassificationFBO.getColorTexture()}},e._accumulateCommand=t.createViewportQuadCommand(s,{uniformMap:a,owner:e})),e._viewport.width=o,e._viewport.height=r;let c=!He.equals(e._viewport,n.viewport),d=c!==e._useScissorTest;e._useScissorTest=c,He.equals(e._scissorRectangle,n.viewport)||(e._scissorRectangle=He.clone(n.viewport,e._scissorRectangle),d=!0),(!l(e._rsDepth)||!He.equals(e._viewport,e._rsDepth.viewport)||d)&&(e._rsDepth=De.fromCache({viewport:e._viewport,scissorTest:{enabled:e._useScissorTest,rectangle:e._scissorRectangle}})),l(e._packDepthCommand)&&(e._packDepthCommand.renderState=e._rsDepth),(!l(e._rsAccumulate)||!He.equals(e._viewport,e._rsAccumulate.viewport)||d)&&(e._rsAccumulate=De.fromCache({viewport:e._viewport,scissorTest:{enabled:e._useScissorTest,rectangle:e._scissorRectangle},stencilTest:{enabled:!0,frontFunction:Dn.EQUAL,reference:Nt.CESIUM_3D_TILE_MASK}})),l(e._accumulateCommand)&&(e._accumulateCommand.renderState=e._rsAccumulate),(!l(e._rsComp)||!He.equals(e._viewport,e._rsComp.viewport)||d)&&(e._rsComp=De.fromCache({viewport:e._viewport,scissorTest:{enabled:e._useScissorTest,rectangle:e._scissorRectangle},blending:un.ALPHA_BLEND})),l(e._compositeCommand)&&(e._compositeCommand.renderState=e._rsComp,e._compositeCommand.derivedCommands.pick.renderState=e._rsComp)}Zy.prototype.executeTranslucentCommands=function(e,t,n,i,o){let r=i.length,s,a,c=e.frameState.useLogDepth,d=e.context,u=n.framebuffer;for(a=0;a<r;++a)if(s=i[a],s=c?s.derivedCommands.logDepth.command:s,s.depthForTranslucentClassification){this._hasTranslucentDepth=!0;break}if(this._hasTranslucentDepth){for(Hmt(this,d,n,o),n.framebuffer=this._drawClassificationFBO.framebuffer,this._clearDepthStencilCommand.execute(d,n),a=0;a<r;++a){if(s=i[a],s=c?s.derivedCommands.logDepth.command:s,!s.depthForTranslucentClassification)continue;let m=s.derivedCommands.depth.depthOnlyCommand;t(m,e,d,n)}this._frustumsDrawn+=this._hasTranslucentDepth?1:0,this._hasTranslucentDepth&&(n.framebuffer=this._packFBO.framebuffer,this._packDepthCommand.execute(d,n)),n.framebuffer=u}};Zy.prototype.executeClassificationCommands=function(e,t,n,i){if(!this._hasTranslucentDepth)return;let o=e.context,r=o.uniformState,s=n.framebuffer;this._frustumsDrawn===2&&(n.framebuffer=this._accumulationFBO.framebuffer,this._copyCommand.execute(o,n)),n.framebuffer=this._drawClassificationFBO.framebuffer,this._frustumsDrawn>1&&this._clearColorCommand.execute(o,n),r.updatePass(Re.CESIUM_3D_TILE_CLASSIFICATION);let a=r.globeDepthTexture;r.globeDepthTexture=this._packFBO.getColorTexture();let c=i.commands[Re.CESIUM_3D_TILE_CLASSIFICATION],d=i.indices[Re.CESIUM_3D_TILE_CLASSIFICATION];for(let u=0;u<d;++u)t(c[u],e,o,n);r.globeDepthTexture=a,n.framebuffer=s,this._frustumsDrawn!==1&&(n.framebuffer=this._accumulationFBO.framebuffer,this._accumulateCommand.execute(o,n),n.framebuffer=s)};Zy.prototype.execute=function(e,t){if(!this._hasTranslucentDepth)return;this._frustumsDrawn===1?this._textureToComposite=this._drawClassificationFBO.getColorTexture():this._textureToComposite=this._accumulationFBO.getColorTexture(),(e.frameState.passes.pick?this._compositeCommand.derivedCommands.pick:this._compositeCommand).execute(e.context,t),zmt(this,e,t)};function zmt(e,t,n){if(!e._hasTranslucentDepth)return;let i=n.framebuffer;n.framebuffer=e._drawClassificationFBO.framebuffer,e._clearColorCommand.execute(t._context,n),n.framebuffer=i,e._frustumsDrawn>1&&(n.framebuffer=e._accumulationFBO.framebuffer,e._clearColorCommand.execute(t._context,n)),e._hasTranslucentDepth=!1,e._frustumsDrawn=0}Zy.prototype.isSupported=function(){return this._supported};Zy.prototype.isDestroyed=function(){return!1};Zy.prototype.destroy=function(){return Cxe(this),Vxe(this),l(this._compositeCommand)&&(this._compositeCommand.shaderProgram=this._compositeCommand.shaderProgram&&this._compositeCommand.shaderProgram.destroy()),l(this._packDepthCommand)&&(this._packDepthCommand.shaderProgram=this._packDepthCommand.shaderProgram&&this._packDepthCommand.shaderProgram.destroy()),me(this)};var PF=Zy;function Kmt(){this.command=void 0,this.near=void 0,this.far=void 0}function n3(e,t,n){let i=e.context,o;i.depthTexture&&(o=new RF);let r;e._useOIT&&i.depthTexture&&(r=new GF(i));let s=new _c(i);s.viewport=He.clone(n),this.camera=t,this._cameraClone=ao.clone(t),this._cameraStartFired=!1,this._cameraMovedTime=void 0,this.viewport=n,this.passState=s,this.pickFramebuffer=new WF(i),this.pickDepthFramebuffer=new XF,this.sceneFramebuffer=new AT,this.globeDepth=o,this.globeTranslucencyFramebuffer=new ZF,this.oit=r,this.translucentTileClassification=new PF(i),this.pickDepths=[],this.frustumCommandsList=[],this.debugFrustumStatistics=void 0,this._commandExtents=[]}var Lxe=new h,Rxe=new h;function Jmt(e,t){let n=Math.max(Math.abs(e.x),Math.abs(t.x)),i=Math.max(Math.abs(e.y),Math.abs(t.y)),o=Math.max(Math.abs(e.z),Math.abs(t.z));return Math.max(Math.max(n,i),o)}function Qmt(e,t,n){let i=1/Math.max(1,Jmt(e.position,t.position));return h.multiplyByScalar(e.position,i,Lxe),h.multiplyByScalar(t.position,i,Rxe),h.equalsEpsilon(Lxe,Rxe,n)&&h.equalsEpsilon(e.direction,t.direction,n)&&h.equalsEpsilon(e.up,t.up,n)&&h.equalsEpsilon(e.right,t.right,n)&&M.equalsEpsilon(e.transform,t.transform,n)&&e.frustum.equalsEpsilon(t.frustum,n)}n3.prototype.checkForCameraUpdates=function(e){let t=this.camera,n=this._cameraClone;return Qmt(t,n,W.EPSILON15)?(this._cameraStartFired&&fi()-this._cameraMovedTime>e.cameraEventWaitTime&&(t.moveEnd.raiseEvent(),this._cameraStartFired=!1),!1):(this._cameraStartFired||(t.moveStart.raiseEvent(),this._cameraStartFired=!0),this._cameraMovedTime=fi(),ao.clone(t,n),!0)};function jmt(e,t,n,i){let o=t.frameState,r=o.camera,s=o.useLogDepth?t.logarithmicDepthFarToNearRatio:t.farToNearRatio,a=t.mode===oe.SCENE2D,c=t.nearToFarDistance2D;i*=1+W.EPSILON2,n=Math.min(Math.max(n,r.frustum.near),r.frustum.far),i=Math.max(Math.min(i,r.frustum.far),n);let d;a?(i=Math.min(i,r.position.z+t.nearToFarDistance2D),n=Math.min(n,i),d=Math.ceil(Math.max(1,i-n)/t.nearToFarDistance2D)):d=Math.ceil(Math.log(i/n)/Math.log(s));let u=e.frustumCommandsList;u.length=d;for(let m=0;m<d;++m){let p,g;a?(p=Math.min(i-c,n+m*c),g=Math.min(i,p+c)):(p=Math.max(n,Math.pow(s,m)*n),g=Math.min(i,s*p));let f=u[m];l(f)?(f.near=p,f.far=g):f=u[m]=new LF(p,g)}}function qmt(e,t,n,i,o){t.debugShowFrustums&&(n.debugOverlappingFrustums=0);let r=e.frustumCommandsList,s=r.length;for(let a=0;a<s;++a){let c=r[a],d=c.near,u=c.far;if(i>u)continue;if(o<d)break;let m=n.pass,p=c.indices[m]++;if(c.commands[m][p]=n,t.debugShowFrustums&&(n.debugOverlappingFrustums|=1<<a),n.executeInClosestFrustum)break}if(t.debugShowFrustums){let a=e.debugFrustumStatistics.commandsInFrustums;a[n.debugOverlappingFrustums]=l(a[n.debugOverlappingFrustums])?a[n.debugOverlappingFrustums]+1:1,++e.debugFrustumStatistics.totalCommands}t.updateDerivedCommands(n)}var Zxe=new rs,$mt=new _a;n3.prototype.createPotentiallyVisibleSet=function(e){let t=e.frameState,n=t.camera,i=n.directionWC,o=n.positionWC,r=e._computeCommandList,s=e._overlayCommandList,a=t.commandList;e.debugShowFrustums&&(this.debugFrustumStatistics={totalCommands:0,commandsInFrustums:{}});let c=this.frustumCommandsList,d=c.length,u=Re.NUMBER_OF_PASSES;for(let R=0;R<d;++R)for(let E=0;E<u;++E)c[R].indices[E]=0;r.length=0,s.length=0;let m=this._commandExtents,p=m.length,g=0,f=+Number.MAX_VALUE,x=-Number.MAX_VALUE,_=t.shadowState.shadowsEnabled,C=+Number.MAX_VALUE,V=-Number.MAX_VALUE,L=Number.MAX_VALUE,Z=t.mode===oe.SCENE3D?t.occluder:void 0,G=t.cullingVolume,X=Zxe.planes;for(let R=0;R<5;++R)X[R]=G.planes[R];G=Zxe;let v=a.length;for(let R=0;R<v;++R){let E=a[R],I=E.pass;if(I===Re.COMPUTE)r.push(E);else if(I===Re.OVERLAY)s.push(E);else{let w,N,B=E.boundingVolume;if(l(B)){if(!e.isVisible(E,G,Z))continue;let O=B.computePlaneDistances(o,i,$mt);if(w=O.start,N=O.stop,f=Math.min(f,w),x=Math.max(x,N),_&&E.receiveShadows&&w<ob.MAXIMUM_DISTANCE&&!(I===Re.GLOBE&&w<-100&&N>100)){let k=N-w;I!==Re.GLOBE&&w<100&&(L=Math.min(L,k)),C=Math.min(C,w),V=Math.max(V,N)}}else E instanceof oi?(w=n.frustum.near,N=n.frustum.far):(w=n.frustum.near,N=n.frustum.far,f=Math.min(f,w),x=Math.max(x,N));let U=m[g];l(U)||(U=m[g]=new Kmt),U.command=E,U.near=w,U.far=N,g++}}_&&(C=Math.min(Math.max(C,n.frustum.near),n.frustum.far),V=Math.max(Math.min(V,n.frustum.far),C)),_&&(t.shadowState.nearPlane=C,t.shadowState.farPlane=V,t.shadowState.closestObjectSize=L),jmt(this,e,f,x);let P,F;for(P=0;P<g;P++)F=m[P],qmt(this,e,F.command,F.near,F.far);if(g<p)for(P=g;P<p&&(F=m[P],!!l(F.command));P++)F.command=void 0;let A=c.length,b=t.frustumSplits;b.length=A+1;for(let R=0;R<A;++R)b[R]=c[R].near,R===A-1&&(b[R+1]=c[R].far)};n3.prototype.destroy=function(){this.pickFramebuffer=this.pickFramebuffer&&this.pickFramebuffer.destroy(),this.pickDepthFramebuffer=this.pickDepthFramebuffer&&this.pickDepthFramebuffer.destroy(),this.sceneFramebuffer=this.sceneFramebuffer&&this.sceneFramebuffer.destroy(),this.globeDepth=this.globeDepth&&this.globeDepth.destroy(),this.oit=this.oit&&this.oit.destroy(),this.translucentTileClassification=this.translucentTileClassification&&this.translucentTileClassification.destroy(),this.globeTranslucencyFramebuffer=this.globeTranslucencyFramebuffer&&this.globeTranslucencyFramebuffer.destroy();let e,t=this.pickDepths,n=t.length;for(e=0;e<n;++e)t[e].destroy()};var kT=n3;var Exe=.1,eht=new tm({pass:Io.MOST_DETAILED_PRELOAD}),tht=new tm({pass:Io.MOST_DETAILED_PICK}),o3=new tm({pass:Io.PICK});function pa(e){this._mostDetailedRayPicks=[],this.pickRenderStateCache={},this._pickPositionCache={},this._pickPositionCacheDirty=!1;let t=new He(0,0,1,1),n=new ao(e);n.frustum=new on({width:Exe,aspectRatio:1,near:.1}),this._pickOffscreenView=new kT(e,n,t)}pa.prototype.update=function(){this._pickPositionCacheDirty=!0};pa.prototype.getPickDepth=function(e,t){let n=e.view.pickDepths,i=n[t];return l(i)||(i=new VF,n[t]=i),i};var nht=new Zr,iht=new h,i3=new h,oht=new D,rht=new M;function sht(e,t,n,i,o){let r=e.camera,s=r.frustum,a=s.offCenterFrustum;l(a)&&(s=a);let c=2*(t.x-o.x)/o.width-1;c*=(s.right-s.left)*.5;let d=2*(o.height-t.y-o.y)/o.height-1;d*=(s.top-s.bottom)*.5;let u=M.clone(r.transform,rht);r._setTransform(M.IDENTITY);let m=h.clone(r.position,iht);h.multiplyByScalar(r.right,c,i3),h.add(i3,m,m),h.multiplyByScalar(r.up,d,i3),h.add(i3,m,m),r._setTransform(u),e.mode===oe.SCENE2D&&h.fromElements(m.z,m.x,m.y,m);let p=s.getPixelDimensions(o.width,o.height,1,1,oht),g=nht;return g.right=p.x*.5,g.left=-g.right,g.top=p.y*.5,g.bottom=-g.top,g.near=s.near,g.far=s.far,g.computeCullingVolume(m,r.directionWC,r.upWC)}var aht=new Uc,cht=new D;function lht(e,t,n,i,o){let r=e.camera,s=r.frustum,a=s.near,c=Math.tan(s.fovy*.5),d=s.aspectRatio*c,u=2*(t.x-o.x)/o.width-1,m=2*(o.height-t.y-o.y)/o.height-1,p=u*a*d,g=m*a*c,f=s.getPixelDimensions(o.width,o.height,1,1,cht),x=f.x*n*.5,_=f.y*i*.5,C=aht;return C.top=g+_,C.bottom=g-_,C.right=p+x,C.left=p-x,C.near=a,C.far=s.far,C.computeCullingVolume(r.positionWC,r.directionWC,r.upWC)}function d8(e,t,n,i,o){let r=e.camera.frustum;return r instanceof on||r instanceof Zr?sht(e,t,n,i,o):lht(e,t,n,i,o)}var Zh=3,rb=3,Vc=new He(0,0,Zh,rb),u8=new D,r3=new Y(0,0,0,0);pa.prototype.pick=function(e,t,n,i){Zh=y(n,3),rb=y(i,Zh);let{context:o,frameState:r,defaultView:s}=e,{viewport:a,pickFramebuffer:c}=s;e.view=s,a.x=0,a.y=0,a.width=o.drawingBufferWidth,a.height=o.drawingBufferHeight;let d=s.passState;d.viewport=He.clone(a,d.viewport);let u=ki.transformWindowToDrawingBuffer(e,t,u8);e.jobScheduler.disableThisFrame(),e.updateFrameState(),r.cullingVolume=d8(e,u,Zh,rb,a),r.invertClassification=!1,r.passes.pick=!0,r.tilesetPassState=o3,o.uniformState.update(r),e.updateEnvironment(),Vc.x=u.x-(Zh-1)*.5,Vc.y=e.drawingBufferHeight-u.y-(rb-1)*.5,Vc.width=Zh,Vc.height=rb,d=c.begin(Vc,a),e.updateAndExecuteCommands(d,r3),e.resolveFramebuffers(d);let m=c.end(Vc);return o.endFrame(),m};pa.prototype.pickVoxelCoordinate=function(e,t,n,i){Zh=y(n,3),rb=y(i,Zh);let{context:o,frameState:r,defaultView:s}=e,{viewport:a,pickFramebuffer:c}=s;e.view=s,a.x=0,a.y=0,a.width=o.drawingBufferWidth,a.height=o.drawingBufferHeight;let d=s.passState;d.viewport=He.clone(a,d.viewport);let u=ki.transformWindowToDrawingBuffer(e,t,u8);e.jobScheduler.disableThisFrame(),e.updateFrameState(),r.cullingVolume=d8(e,u,Zh,rb,a),r.invertClassification=!1,r.passes.pickVoxel=!0,r.tilesetPassState=o3,o.uniformState.update(r),e.updateEnvironment(),Vc.x=u.x-(Zh-1)*.5,Vc.y=e.drawingBufferHeight-u.y-(rb-1)*.5,Vc.width=Zh,Vc.height=rb,d=c.begin(Vc,a),e.updateAndExecuteCommands(d,r3),e.resolveFramebuffers(d);let m=c.readVoxelInfo(Vc);return o.endFrame(),m};function dht(e,t){let{defaultView:n,context:i,frameState:o,environmentState:r}=e,{viewport:s,pickDepthFramebuffer:a}=n;e.view=n,s.x=0,s.y=0,s.width=i.drawingBufferWidth,s.height=i.drawingBufferHeight;let c=n.passState;c.viewport=He.clone(s,c.viewport),e.clearPasses(o.passes),o.passes.pick=!0,o.passes.depth=!0,o.cullingVolume=d8(e,t,1,1,s),o.tilesetPassState=o3,e.updateEnvironment(),r.renderTranslucentDepthForPick=!0,c=a.update(i,t,s),e.updateAndExecuteCommands(c,r3),e.resolveFramebuffers(c),i.endFrame()}var uht=new yi,mht=new Uc,hht=new on,fht=new Zr;pa.prototype.pickPositionWorldCoordinates=function(e,t,n){if(!e.useDepthPicking)return;let i=t.toString();if(this._pickPositionCacheDirty)this._pickPositionCache={},this._pickPositionCacheDirty=!1;else if(this._pickPositionCache.hasOwnProperty(i))return h.clone(this._pickPositionCache[i],n);let{context:o,frameState:r,camera:s,defaultView:a}=e,{uniformState:c}=o;e.view=a;let d=ki.transformWindowToDrawingBuffer(e,t,u8);e.pickTranslucentDepth?dht(e,d):(e.updateFrameState(),c.update(r),e.updateEnvironment()),d.y=e.drawingBufferHeight-d.y;let u;l(s.frustum.fov)?u=s.frustum.clone(uht):l(s.frustum.infiniteProjectionMatrix)?u=s.frustum.clone(mht):l(s.frustum.width)?u=s.frustum.clone(hht):u=s.frustum.clone(fht);let m=a.frustumCommandsList,p=m.length;for(let g=0;g<p;++g){let x=this.getPickDepth(e,g).getDepth(o,d.x,d.y);if(l(x)&&x>0&&x<1){let _=m[g],C;return e.mode===oe.SCENE2D?(C=s.position.z,s.position.z=C-_.near+1,u.far=Math.max(1,_.far-_.near),u.near=1,c.update(r),c.updateFrustum(u)):(u.near=_.near*(g!==0?e.opaqueFrustumNearOffset:1),u.far=_.far,c.updateFrustum(u)),n=ki.drawingBufferToWgs84Coordinates(e,d,x,n),e.mode===oe.SCENE2D&&(s.position.z=C,c.update(r)),this._pickPositionCache[i]=h.clone(n),n}}this._pickPositionCache[i]=void 0};var pht=new he;pa.prototype.pickPosition=function(e,t,n){if(n=this.pickPositionWorldCoordinates(e,t,n),l(n)&&e.mode!==oe.SCENE3D){h.fromElements(n.y,n.z,n.x,n);let i=e.mapProjection,o=i.ellipsoid,r=i.unproject(n,pht);o.cartographicToCartesian(r,n)}return n};function Xxe(e,t){let n,i,o=[],r=[],s=[],a=[];l(e)||(e=Number.MAX_VALUE);let c=t();for(;l(c);){let d=c.object,u=c.position,m=c.exclude;if(l(u)&&!l(d)){o.push(c);break}if(!l(d)||!l(d.primitive)||!m&&(o.push(c),0>=--e))break;let p=d.primitive,g=!1;typeof p.getGeometryInstanceAttributes=="function"&&l(d.id)&&(i=p.getGeometryInstanceAttributes(d.id),l(i)&&l(i.show)&&(g=!0,i.show=xn.toValue(!1,i.show),s.push(i))),d instanceof vs&&(g=!0,d.show=!1,a.push(d)),g||(p.show=!1,r.push(p)),c=t()}for(n=0;n<r.length;++n)r[n].show=!0;for(n=0;n<s.length;++n)i=s[n],i.show=xn.toValue(!0,i.show);for(n=0;n<a.length;++n)a[n].show=!0;return o}pa.prototype.drillPick=function(e,t,n,i,o){let r=this;return Xxe(n,function(){let c=r.pick(e,t,i,o);if(l(c))return{object:c,position:void 0,exclude:!1}}).map(function(c){return c.object})};var Gxe=new h,bht=new h;function ght(e,t,n){this.ray=e,this.width=t,this.tilesets=n,this.ready=!1;let i=this;this.promise=new Promise(o=>{i._completePick=()=>{o()}})}function Ixe(e,t,n,i){let o=t.direction,r=h.mostOrthogonalAxis(o,Gxe),s=h.cross(o,r,Gxe),a=h.cross(o,s,bht);return i.position=t.origin,i.direction=o,i.up=a,i.right=s,i.frustum.width=y(n,Exe),i.frustum.computeCullingVolume(i.positionWC,i.directionWC,i.upWC)}function yht(e,t,n){let i=t.frameState,{ray:o,width:r,tilesets:s}=n,a=e._pickOffscreenView.camera,c=Ixe(e,o,r,a),d=eht;d.camera=a,d.cullingVolume=c;let u=!0,m=s.length;for(let p=0;p<m;++p){let g=s[p];g.show&&t.primitives.contains(g)&&(g.updateForPass(i,d),u=u&&d.ready)}return u&&n._completePick(),u}pa.prototype.updateMostDetailedRayPicks=function(e){let t=this._mostDetailedRayPicks;for(let n=0;n<t.length;++n)yht(this,e,t[n])&&t.splice(n--,1)};function Wxe(e,t,n){for(let i=0;i<e.length;++i){let o=e.get(i);o.show&&(l(o.isCesium3DTileset)?(!l(t)||t.indexOf(o)===-1)&&n.push(o):o instanceof Ul&&Wxe(o,t,n))}}function s3(e,t,n,i,o,r){let s=[];if(Wxe(t.primitives,i,s),s.length===0)return Promise.resolve(r());let a=new ght(n,o,s);return e._mostDetailedRayPicks.push(a),a.promise.then(function(){return r()})}function xht(e,t){return!l(e)||!l(t)||t.length===0?!1:t.indexOf(e)>-1||t.indexOf(e.primitive)>-1||t.indexOf(e.id)>-1}function _ht(e,t,n,i,o,r,s){let{context:a,frameState:c}=t,d=a.uniformState,u=e._pickOffscreenView;t.view=u,Ixe(e,n,o,u.camera),Vc=He.clone(u.viewport,Vc);let m=u.pickFramebuffer.begin(Vc,u.viewport);t.jobScheduler.disableThisFrame(),t.updateFrameState(),c.invertClassification=!1,c.passes.pick=!0,c.passes.offscreen=!0,s?c.tilesetPassState=tht:c.tilesetPassState=o3,d.update(c),t.updateEnvironment(),t.updateAndExecuteCommands(m,r3),t.resolveFramebuffers(m);let p,g=u.pickFramebuffer.end(Vc);if(t.context.depthTexture){let f=u.frustumCommandsList.length;for(let x=0;x<f;++x){let C=e.getPickDepth(t,x).getDepth(a,0,0);if(l(C)&&C>0&&C<1){let V=u.frustumCommandsList[x],L=V.near*(x!==0?t.opaqueFrustumNearOffset:1),Z=V.far,G=L+C*(Z-L);p=pn.getPoint(n,G);break}}}if(t.view=t.defaultView,a.endFrame(),l(g)||l(p))return{object:g,position:p,exclude:!l(p)&&r||xht(g,i)}}function Pxe(e,t,n,i,o,r,s,a){return Xxe(i,function(){return _ht(e,t,n,o,r,s,a)})}function nL(e,t,n,i,o,r,s){let a=Pxe(e,t,n,1,i,o,r,s);if(a.length>0)return a[0]}function vxe(e,t,n,i,o,r,s,a){return Pxe(e,t,n,i,o,r,s,a)}function a3(e,t){return new Promise((n,i)=>{t.then(function(o){let r=e.postRender.addEventListener(function(){r(),n(o)});e.requestRender()}).catch(function(o){i(o)})})}pa.prototype.pickFromRay=function(e,t,n,i){return nL(this,e,t,n,i,!1,!1)};pa.prototype.drillPickFromRay=function(e,t,n,i,o){return vxe(this,e,t,n,i,o,!1,!1)};pa.prototype.pickFromRayMostDetailed=function(e,t,n,i){let o=this;return t=pn.clone(t),n=l(n)?n.slice():n,a3(e,s3(o,e,t,n,i,function(){return nL(o,e,t,n,i,!1,!0)}))};pa.prototype.drillPickFromRayMostDetailed=function(e,t,n,i,o){let r=this;return t=pn.clone(t),i=l(i)?i.slice():i,a3(e,s3(r,e,t,i,o,function(){return vxe(r,e,t,n,i,o,!1,!0)}))};var Tht=new h,Sht=new h,Cht=new pn,wxe=new he;function m8(e,t){let n=e.globe,i=l(n)?n.ellipsoid:e.mapProjection.ellipsoid,o=ci._defaultMaxTerrainHeight,r=i.geodeticSurfaceNormalCartographic(t,Sht),s=he.toCartesian(t,i,Tht),a=Cht;a.origin=s,a.direction=r;let c=new pn;return pn.getPoint(a,o,c.origin),h.negate(r,c.direction),c}function Fxe(e,t){let n=e.globe,i=l(n)?n.ellipsoid:e.mapProjection.ellipsoid,o=he.fromCartesian(t,i,wxe);return m8(e,o)}function Axe(e,t){let n=e.globe,i=l(n)?n.ellipsoid:e.mapProjection.ellipsoid;return he.fromCartesian(t,i,wxe).height}function Vht(e,t,n,i,o){let r=m8(t,n);return s3(e,t,r,i,o,function(){let s=nL(e,t,r,i,o,!0,!0);if(l(s))return Axe(t,s.position)})}function Lht(e,t,n,i,o,r){let s=Fxe(t,n);return s3(e,t,s,i,o,function(){let a=nL(e,t,s,i,o,!0,!0);if(l(a))return h.clone(a.position,r)})}pa.prototype.sampleHeight=function(e,t,n,i){let o=m8(e,t),r=nL(this,e,o,n,i,!0,!1);if(l(r))return Axe(e,r.position)};pa.prototype.clampToHeight=function(e,t,n,i,o){let r=Fxe(e,t),s=nL(this,e,r,n,i,!0,!1);if(l(s))return h.clone(s.position,o)};pa.prototype.sampleHeightMostDetailed=function(e,t,n,i){n=l(n)?n.slice():n;let o=t.length,r=new Array(o);for(let s=0;s<o;++s)r[s]=Vht(this,e,t[s],n,i);return a3(e,Promise.all(r).then(function(s){let a=s.length;for(let c=0;c<a;++c)t[c].height=s[c];return t}))};pa.prototype.clampToHeightMostDetailed=function(e,t,n,i){n=l(n)?n.slice():n;let o=t.length,r=new Array(o);for(let s=0;s<o;++s)r[s]=Lht(this,e,t[s],n,i,t[s]);return a3(e,Promise.all(r).then(function(s){let a=s.length;for(let c=0;c<a;++c)t[c]=s[c];return t}))};pa.prototype.destroy=function(){this._pickOffscreenView=this._pickOffscreenView&&this._pickOffscreenView.destroy()};var vF=pa;var O5i=T(S(),1);var _5i=T(S(),1);var RMi=T(S(),1),wF=`uniform sampler2D colorTexture; in vec2 v_textureCoordinates; #ifdef AUTO_EXPOSURE uniform sampler2D autoExposure; #endif void main() { vec4 fragmentColor = texture(colorTexture, v_textureCoordinates); vec3 color = fragmentColor.rgb; #ifdef AUTO_EXPOSURE color /= texture(autoExposure, vec2(0.5)).r; #endif color = czm_acesTonemapping(color); color = czm_inverseGamma(color); out_FragColor = vec4(color, fragmentColor.a); } `;var GMi=T(S(),1),FF=`uniform sampler2D randomTexture; uniform sampler2D depthTexture; uniform float intensity; uniform float bias; uniform float lengthCap; uniform float stepSize; uniform float frustumLength; in vec2 v_textureCoordinates; vec4 clipToEye(vec2 uv, float depth) { vec2 xy = vec2((uv.x * 2.0 - 1.0), ((1.0 - uv.y) * 2.0 - 1.0)); vec4 posEC = czm_inverseProjection * vec4(xy, depth, 1.0); posEC = posEC / posEC.w; return posEC; } //Reconstruct Normal Without Edge Removation vec3 getNormalXEdge(vec3 posInCamera, float depthU, float depthD, float depthL, float depthR, vec2 pixelSize) { vec4 posInCameraUp = clipToEye(v_textureCoordinates - vec2(0.0, pixelSize.y), depthU); vec4 posInCameraDown = clipToEye(v_textureCoordinates + vec2(0.0, pixelSize.y), depthD); vec4 posInCameraLeft = clipToEye(v_textureCoordinates - vec2(pixelSize.x, 0.0), depthL); vec4 posInCameraRight = clipToEye(v_textureCoordinates + vec2(pixelSize.x, 0.0), depthR); vec3 up = posInCamera.xyz - posInCameraUp.xyz; vec3 down = posInCameraDown.xyz - posInCamera.xyz; vec3 left = posInCamera.xyz - posInCameraLeft.xyz; vec3 right = posInCameraRight.xyz - posInCamera.xyz; vec3 DX = length(left) < length(right) ? left : right; vec3 DY = length(up) < length(down) ? up : down; return normalize(cross(DY, DX)); } void main(void) { float depth = czm_readDepth(depthTexture, v_textureCoordinates); vec4 posInCamera = clipToEye(v_textureCoordinates, depth); if (posInCamera.z > frustumLength) { out_FragColor = vec4(1.0); return; } vec2 pixelSize = czm_pixelRatio / czm_viewport.zw; float depthU = czm_readDepth(depthTexture, v_textureCoordinates - vec2(0.0, pixelSize.y)); float depthD = czm_readDepth(depthTexture, v_textureCoordinates + vec2(0.0, pixelSize.y)); float depthL = czm_readDepth(depthTexture, v_textureCoordinates - vec2(pixelSize.x, 0.0)); float depthR = czm_readDepth(depthTexture, v_textureCoordinates + vec2(pixelSize.x, 0.0)); vec3 normalInCamera = getNormalXEdge(posInCamera.xyz, depthU, depthD, depthL, depthR, pixelSize); float ao = 0.0; vec2 sampleDirection = vec2(1.0, 0.0); float gapAngle = 90.0 * czm_radiansPerDegree; // RandomNoise float randomVal = texture(randomTexture, v_textureCoordinates / pixelSize / 255.0).x; //Loop for each direction for (int i = 0; i < 4; i++) { float newGapAngle = gapAngle * (float(i) + randomVal); float cosVal = cos(newGapAngle); float sinVal = sin(newGapAngle); //Rotate Sampling Direction vec2 rotatedSampleDirection = vec2(cosVal * sampleDirection.x - sinVal * sampleDirection.y, sinVal * sampleDirection.x + cosVal * sampleDirection.y); float localAO = 0.0; float localStepSize = stepSize; //Loop for each step for (int j = 0; j < 6; j++) { vec2 newCoords = v_textureCoordinates + rotatedSampleDirection * localStepSize * pixelSize; //Exception Handling if(newCoords.x > 1.0 || newCoords.y > 1.0 || newCoords.x < 0.0 || newCoords.y < 0.0) { break; } float stepDepthInfo = czm_readDepth(depthTexture, newCoords); vec4 stepPosInCamera = clipToEye(newCoords, stepDepthInfo); vec3 diffVec = stepPosInCamera.xyz - posInCamera.xyz; float len = length(diffVec); if (len > lengthCap) { break; } float dotVal = clamp(dot(normalInCamera, normalize(diffVec)), 0.0, 1.0 ); float weight = len / lengthCap; weight = 1.0 - weight * weight; if (dotVal < bias) { dotVal = 0.0; } localAO = max(localAO, dotVal * weight); localStepSize += stepSize; } ao += localAO; } ao /= 4.0; ao = 1.0 - clamp(ao, 0.0, 1.0); ao = pow(ao, intensity); out_FragColor = vec4(vec3(ao), 1.0); } `;var XMi=T(S(),1),AF=`uniform sampler2D colorTexture; uniform sampler2D ambientOcclusionTexture; uniform bool ambientOcclusionOnly; in vec2 v_textureCoordinates; void main(void) { vec4 color = texture(colorTexture, v_textureCoordinates); vec4 ao = texture(ambientOcclusionTexture, v_textureCoordinates); out_FragColor = ambientOcclusionOnly ? ao : ao * color; } `;var WMi=T(S(),1),MF=`uniform sampler2D colorTexture; uniform float gradations; in vec2 v_textureCoordinates; void main(void) { vec3 rgb = texture(colorTexture, v_textureCoordinates).rgb; #ifdef CZM_SELECTED_FEATURE if (czm_selected()) { out_FragColor = vec4(rgb, 1.0); return; } #endif float luminance = czm_luminance(rgb); float darkness = luminance * gradations; darkness = (darkness - fract(darkness)) / gradations; out_FragColor = vec4(vec3(darkness), 1.0); } `;var vMi=T(S(),1),NF=`uniform sampler2D colorTexture; uniform sampler2D bloomTexture; uniform bool glowOnly; in vec2 v_textureCoordinates; void main(void) { vec4 color = texture(colorTexture, v_textureCoordinates); #ifdef CZM_SELECTED_FEATURE if (czm_selected()) { out_FragColor = color; return; } #endif vec4 bloom = texture(bloomTexture, v_textureCoordinates); out_FragColor = glowOnly ? bloom : bloom + color; } `;var FMi=T(S(),1),kF=`uniform sampler2D colorTexture; uniform float brightness; in vec2 v_textureCoordinates; void main(void) { vec3 rgb = texture(colorTexture, v_textureCoordinates).rgb; vec3 target = vec3(0.0); out_FragColor = vec4(mix(target, rgb, brightness), 1.0); } `;var MMi=T(S(),1),UF=`uniform sampler2D colorTexture; uniform float contrast; uniform float brightness; in vec2 v_textureCoordinates; void main(void) { vec3 sceneColor = texture(colorTexture, v_textureCoordinates).xyz; sceneColor = czm_RGBToHSB(sceneColor); sceneColor.z += brightness; sceneColor = czm_HSBToRGB(sceneColor); float factor = (259.0 * (contrast + 255.0)) / (255.0 * (259.0 - contrast)); sceneColor = factor * (sceneColor - vec3(0.5)) + vec3(0.5); out_FragColor = vec4(sceneColor, 1.0); } `;var kMi=T(S(),1),DF=`uniform sampler2D colorTexture; uniform sampler2D blurTexture; uniform sampler2D depthTexture; uniform float focalDistance; in vec2 v_textureCoordinates; vec4 toEye(vec2 uv, float depth) { vec2 xy = vec2((uv.x * 2.0 - 1.0), ((1.0 - uv.y) * 2.0 - 1.0)); vec4 posInCamera = czm_inverseProjection * vec4(xy, depth, 1.0); posInCamera = posInCamera / posInCamera.w; return posInCamera; } float computeDepthBlur(float depth) { float f; if (depth < focalDistance) { f = (focalDistance - depth) / (focalDistance - czm_currentFrustum.x); } else { f = (depth - focalDistance) / (czm_currentFrustum.y - focalDistance); f = pow(f, 0.1); } f *= f; f = clamp(f, 0.0, 1.0); return pow(f, 0.5); } void main(void) { float depth = czm_readDepth(depthTexture, v_textureCoordinates); vec4 posInCamera = toEye(v_textureCoordinates, depth); float d = computeDepthBlur(-posInCamera.z); out_FragColor = mix(texture(colorTexture, v_textureCoordinates), texture(blurTexture, v_textureCoordinates), d); } `;var DMi=T(S(),1),BF=`uniform sampler2D depthTexture; in vec2 v_textureCoordinates; void main(void) { float depth = czm_readDepth(depthTexture, v_textureCoordinates); out_FragColor = vec4(vec3(depth), 1.0); } `;var YMi=T(S(),1),YF=`uniform sampler2D depthTexture; uniform float length; uniform vec4 color; in vec2 v_textureCoordinates; void main(void) { float directions[3]; directions[0] = -1.0; directions[1] = 0.0; directions[2] = 1.0; float scalars[3]; scalars[0] = 3.0; scalars[1] = 10.0; scalars[2] = 3.0; float padx = czm_pixelRatio / czm_viewport.z; float pady = czm_pixelRatio / czm_viewport.w; #ifdef CZM_SELECTED_FEATURE bool selected = false; for (int i = 0; i < 3; ++i) { float dir = directions[i]; selected = selected || czm_selected(vec2(-padx, dir * pady)); selected = selected || czm_selected(vec2(padx, dir * pady)); selected = selected || czm_selected(vec2(dir * padx, -pady)); selected = selected || czm_selected(vec2(dir * padx, pady)); if (selected) { break; } } if (!selected) { out_FragColor = vec4(color.rgb, 0.0); return; } #endif float horizEdge = 0.0; float vertEdge = 0.0; for (int i = 0; i < 3; ++i) { float dir = directions[i]; float scale = scalars[i]; horizEdge -= texture(depthTexture, v_textureCoordinates + vec2(-padx, dir * pady)).x * scale; horizEdge += texture(depthTexture, v_textureCoordinates + vec2(padx, dir * pady)).x * scale; vertEdge -= texture(depthTexture, v_textureCoordinates + vec2(dir * padx, -pady)).x * scale; vertEdge += texture(depthTexture, v_textureCoordinates + vec2(dir * padx, pady)).x * scale; } float len = sqrt(horizEdge * horizEdge + vertEdge * vertEdge); out_FragColor = vec4(color.rgb, len > length ? color.a : 0.0); } `;var HMi=T(S(),1),OF=`uniform sampler2D colorTexture; in vec2 v_textureCoordinates; #ifdef AUTO_EXPOSURE uniform sampler2D autoExposure; #endif // See slides 142 and 143: // http://www.gdcvault.com/play/1012459/Uncharted_2__HDR_Lighting void main() { vec4 fragmentColor = texture(colorTexture, v_textureCoordinates); vec3 color = fragmentColor.rgb; #ifdef AUTO_EXPOSURE float exposure = texture(autoExposure, vec2(0.5)).r; color /= exposure; #endif const float A = 0.22; // shoulder strength const float B = 0.30; // linear strength const float C = 0.10; // linear angle const float D = 0.20; // toe strength const float E = 0.01; // toe numerator const float F = 0.30; // toe denominator const float white = 11.2; // linear white point value vec3 c = ((color * (A * color + C * B) + D * E) / (color * ( A * color + B) + D * F)) - E / F; float w = ((white * (A * white + C * B) + D * E) / (white * ( A * white + B) + D * F)) - E / F; c = czm_inverseGamma(c / w); out_FragColor = vec4(c, fragmentColor.a); } `;var KMi=T(S(),1),HF=`in vec2 v_textureCoordinates; uniform sampler2D colorTexture; const float fxaaQualitySubpix = 0.5; const float fxaaQualityEdgeThreshold = 0.125; const float fxaaQualityEdgeThresholdMin = 0.0833; void main() { vec2 fxaaQualityRcpFrame = vec2(1.0) / czm_viewport.zw; vec4 color = FxaaPixelShader( v_textureCoordinates, colorTexture, fxaaQualityRcpFrame, fxaaQualitySubpix, fxaaQualityEdgeThreshold, fxaaQualityEdgeThresholdMin); float alpha = texture(colorTexture, v_textureCoordinates).a; out_FragColor = vec4(color.rgb, alpha); } `;var QMi=T(S(),1),Gy=`#define SAMPLES 8 uniform float delta; uniform float sigma; uniform float direction; // 0.0 for x direction, 1.0 for y direction uniform sampler2D colorTexture; #ifdef USE_STEP_SIZE uniform float stepSize; #else uniform vec2 step; #endif in vec2 v_textureCoordinates; // Incremental Computation of the Gaussian: // https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch40.html void main() { vec2 st = v_textureCoordinates; vec2 dir = vec2(1.0 - direction, direction); #ifdef USE_STEP_SIZE vec2 step = vec2(stepSize * (czm_pixelRatio / czm_viewport.zw)); #else vec2 step = step; #endif vec3 g; g.x = 1.0 / (sqrt(czm_twoPi) * sigma); g.y = exp((-0.5 * delta * delta) / (sigma * sigma)); g.z = g.y * g.y; vec4 result = texture(colorTexture, st) * g.x; for (int i = 1; i < SAMPLES; ++i) { g.xy *= g.yz; vec2 offset = float(i) * dir * step; result += texture(colorTexture, st - offset) * g.x; result += texture(colorTexture, st + offset) * g.x; } out_FragColor = result; } `;var qMi=T(S(),1),zF=`uniform sampler2D colorTexture; uniform sampler2D dirtTexture; uniform sampler2D starTexture; uniform vec2 dirtTextureDimensions; uniform float distortion; uniform float ghostDispersal; uniform float haloWidth; uniform float dirtAmount; uniform float earthRadius; uniform float intensity; in vec2 v_textureCoordinates; // whether it is in space or not // 6500000.0 is empirical value #define DISTANCE_TO_SPACE 6500000.0 // return ndc from world coordinate biased earthRadius vec4 getNDCFromWC(vec3 WC, float earthRadius) { vec4 positionEC = czm_view * vec4(WC, 1.0); positionEC = vec4(positionEC.x + earthRadius, positionEC.y, positionEC.z, 1.0); vec4 positionWC = czm_eyeToWindowCoordinates(positionEC); return czm_viewportOrthographic * vec4(positionWC.xy, -positionWC.z, 1.0); } // Check if current pixel is included Earth // if then mask it gradually float isInEarth(vec2 texcoord, vec2 sceneSize) { vec2 NDC = texcoord * 2.0 - 1.0; vec4 earthPosSC = getNDCFromWC(vec3(0.0), 0.0); vec4 earthPosSCEdge = getNDCFromWC(vec3(0.0), earthRadius * 1.5); NDC.xy -= earthPosSC.xy; float X = abs(NDC.x) * sceneSize.x; float Y = abs(NDC.y) * sceneSize.y; return clamp(0.0, 1.0, max(sqrt(X * X + Y * Y) / max(abs(earthPosSCEdge.x * sceneSize.x), 1.0) - 0.8 , 0.0)); } // For Chromatic effect vec4 textureDistorted(sampler2D tex, vec2 texcoord, vec2 direction, vec3 distortion, bool isSpace) { vec2 sceneSize = czm_viewport.zw; vec3 color; if(isSpace) { color.r = isInEarth(texcoord + direction * distortion.r, sceneSize) * texture(tex, texcoord + direction * distortion.r).r; color.g = isInEarth(texcoord + direction * distortion.g, sceneSize) * texture(tex, texcoord + direction * distortion.g).g; color.b = isInEarth(texcoord + direction * distortion.b, sceneSize) * texture(tex, texcoord + direction * distortion.b).b; } else { color.r = texture(tex, texcoord + direction * distortion.r).r; color.g = texture(tex, texcoord + direction * distortion.g).g; color.b = texture(tex, texcoord + direction * distortion.b).b; } return vec4(clamp(color, 0.0, 1.0), 0.0); } void main(void) { vec4 originalColor = texture(colorTexture, v_textureCoordinates); vec3 rgb = originalColor.rgb; bool isSpace = length(czm_viewerPositionWC.xyz) > DISTANCE_TO_SPACE; // Sun position vec4 sunPos = czm_morphTime == 1.0 ? vec4(czm_sunPositionWC, 1.0) : vec4(czm_sunPositionColumbusView.zxy, 1.0); vec4 sunPositionEC = czm_view * sunPos; vec4 sunPositionWC = czm_eyeToWindowCoordinates(sunPositionEC); sunPos = czm_viewportOrthographic * vec4(sunPositionWC.xy, -sunPositionWC.z, 1.0); // If sun is not in the screen space, use original color. if(!isSpace || !((sunPos.x >= -1.1 && sunPos.x <= 1.1) && (sunPos.y >= -1.1 && sunPos.y <= 1.1))) { // Lens flare is disabled when not in space until #5932 is fixed. // https://github.com/CesiumGS/cesium/issues/5932 out_FragColor = originalColor; return; } vec2 texcoord = vec2(1.0) - v_textureCoordinates; vec2 pixelSize = czm_pixelRatio / czm_viewport.zw; vec2 invPixelSize = 1.0 / pixelSize; vec3 distortionVec = pixelSize.x * vec3(-distortion, 0.0, distortion); // ghost vector to image centre: vec2 ghostVec = (vec2(0.5) - texcoord) * ghostDispersal; vec3 direction = normalize(vec3(ghostVec, 0.0)); // sample ghosts: vec4 result = vec4(0.0); vec4 ghost = vec4(0.0); for (int i = 0; i < 4; ++i) { vec2 offset = fract(texcoord + ghostVec * float(i)); // Only bright spots from the centre of the source image ghost += textureDistorted(colorTexture, offset, direction.xy, distortionVec, isSpace); } result += ghost; // sample halo vec2 haloVec = normalize(ghostVec) * haloWidth; float weightForHalo = length(vec2(0.5) - fract(texcoord + haloVec)) / length(vec2(0.5)); weightForHalo = pow(1.0 - weightForHalo, 5.0); result += textureDistorted(colorTexture, texcoord + haloVec, direction.xy, distortionVec, isSpace) * weightForHalo * 1.5; // dirt on lens vec2 dirtTexCoords = (v_textureCoordinates * invPixelSize) / dirtTextureDimensions; if (dirtTexCoords.x > 1.0) { dirtTexCoords.x = mod(floor(dirtTexCoords.x), 2.0) == 1.0 ? 1.0 - fract(dirtTexCoords.x) : fract(dirtTexCoords.x); } if (dirtTexCoords.y > 1.0) { dirtTexCoords.y = mod(floor(dirtTexCoords.y), 2.0) == 1.0 ? 1.0 - fract(dirtTexCoords.y) : fract(dirtTexCoords.y); } result += dirtAmount * texture(dirtTexture, dirtTexCoords); // Rotating starburst texture's coordinate // dot(czm_view[0].xyz, vec3(0.0, 0.0, 1.0)) + dot(czm_view[1].xyz, vec3(0.0, 1.0, 0.0)) float camrot = czm_view[0].z + czm_view[1].y; float cosValue = cos(camrot); float sinValue = sin(camrot); mat3 rotation = mat3( cosValue, -sinValue, 0.0, sinValue, cosValue, 0.0, 0.0, 0.0, 1.0 ); vec3 st1 = vec3(v_textureCoordinates * 2.0 - vec2(1.0), 1.0); vec3 st2 = vec3((rotation * st1).xy, 1.0); vec3 st3 = st2 * 0.5 + vec3(0.5); vec2 lensStarTexcoord = st3.xy; float weightForLensFlare = length(vec3(sunPos.xy, 0.0)); float oneMinusWeightForLensFlare = max(1.0 - weightForLensFlare, 0.0); if (!isSpace) { result *= oneMinusWeightForLensFlare * intensity * 0.2; } else { result *= oneMinusWeightForLensFlare * intensity; result *= texture(starTexture, lensStarTexcoord) * pow(weightForLensFlare, 1.0) * max((1.0 - length(vec3(st1.xy, 0.0))), 0.0) * 2.0; } result += texture(colorTexture, v_textureCoordinates); out_FragColor = result; } `;var eNi=T(S(),1),KF=`uniform sampler2D colorTexture; uniform vec3 white; in vec2 v_textureCoordinates; #ifdef AUTO_EXPOSURE uniform sampler2D autoExposure; #endif // See equation 4: // http://www.cs.utah.edu/~reinhard/cdrom/tonemap.pdf void main() { vec4 fragmentColor = texture(colorTexture, v_textureCoordinates); vec3 color = fragmentColor.rgb; #ifdef AUTO_EXPOSURE float exposure = texture(autoExposure, vec2(0.5)).r; color /= exposure; #endif color = (color * (1.0 + color / white)) / (1.0 + color); color = czm_inverseGamma(color); out_FragColor = vec4(color, fragmentColor.a); } `;var nNi=T(S(),1),JF=`uniform sampler2D colorTexture; in vec2 v_textureCoordinates; float rand(vec2 co) { return fract(sin(dot(co.xy ,vec2(12.9898, 78.233))) * 43758.5453); } void main(void) { float noiseValue = rand(v_textureCoordinates + sin(czm_frameNumber)) * 0.1; vec3 rgb = texture(colorTexture, v_textureCoordinates).rgb; vec3 green = vec3(0.0, 1.0, 0.0); out_FragColor = vec4((noiseValue + rgb) * green, 1.0); } `;var oNi=T(S(),1),QF=`uniform sampler2D colorTexture; in vec2 v_textureCoordinates; #ifdef AUTO_EXPOSURE uniform sampler2D autoExposure; #endif // See equation 3: // http://www.cs.utah.edu/~reinhard/cdrom/tonemap.pdf void main() { vec4 fragmentColor = texture(colorTexture, v_textureCoordinates); vec3 color = fragmentColor.rgb; #ifdef AUTO_EXPOSURE float exposure = texture(autoExposure, vec2(0.5)).r; color /= exposure; #endif color = color / (1.0 + color); color = czm_inverseGamma(color); out_FragColor = vec4(color, fragmentColor.a); } `;var sNi=T(S(),1),jF=`uniform sampler2D colorTexture; uniform sampler2D silhouetteTexture; in vec2 v_textureCoordinates; void main(void) { vec4 silhouetteColor = texture(silhouetteTexture, v_textureCoordinates); vec4 color = texture(colorTexture, v_textureCoordinates); out_FragColor = mix(color, silhouetteColor, silhouetteColor.a); } `;var pNi=T(S(),1);function UT(){this._uniformMap=void 0,this._command=void 0,this._colorTexture=void 0,this._depthTexture=void 0,this._ready=!1,this._name="czm_autoexposure",this._logDepthChanged=void 0,this._useLogDepth=void 0,this._framebuffers=void 0,this._previousLuminance=new ui,this._commands=void 0,this._clearCommand=void 0,this._minMaxLuminance=new D,this.enabled=!0,this._enabled=!0,this.minimumLuminance=.1,this.maximumLuminance=10}Object.defineProperties(UT.prototype,{ready:{get:function(){return this._ready}},name:{get:function(){return this._name}},outputTexture:{get:function(){let e=this._framebuffers;if(l(e))return e[e.length-1].getColorTexture(0)}}});function Mxe(e){let t=e._framebuffers;if(!l(t))return;let n=t.length;for(let i=0;i<n;++i)t[i].destroy();e._framebuffers=void 0,e._previousLuminance.destroy(),e._previousLuminance=void 0}function Rht(e,t){Mxe(e);let n=e._width,i=e._height,o=t.halfFloatingPointTexture?ze.HALF_FLOAT:ze.FLOAT,r=Math.ceil(Math.log(Math.max(n,i))/Math.log(3)),s=new Array(r);for(let c=0;c<r;++c)n=Math.max(Math.ceil(n/3),1),i=Math.max(Math.ceil(i/3),1),s[c]=new ui,s[c].update(t,n,i,1,o);let a=s[r-1].getColorTexture(0);e._previousLuminance.update(t,a.width,a.height,1,o),e._framebuffers=s}function Nxe(e){let t=e._commands;if(!l(t))return;let n=t.length;for(let i=0;i<n;++i)t[i].shaderProgram.destroy();e._commands=void 0}function Zht(e,t){let n;if(t===0)n={colorTexture:function(){return e._colorTexture},colorTextureDimensions:function(){return e._colorTexture.dimensions}};else{let i=e._framebuffers[t-1].getColorTexture(0);n={colorTexture:function(){return i},colorTextureDimensions:function(){return i.dimensions}}}return n.minMaxLuminance=function(){return e._minMaxLuminance},n.previousLuminance=function(){return e._previousLuminance.getColorTexture(0)},n}function Ght(e,t){let n=`uniform sampler2D colorTexture; in vec2 v_textureCoordinates; float sampleTexture(vec2 offset) { `;return e===0?n+=` vec4 color = texture(colorTexture, v_textureCoordinates + offset); return czm_luminance(color.rgb); `:n+=` return texture(colorTexture, v_textureCoordinates + offset).r; `,n+=`} `,n+=`uniform vec2 colorTextureDimensions; uniform vec2 minMaxLuminance; uniform sampler2D previousLuminance; void main() { float color = 0.0; float xStep = 1.0 / colorTextureDimensions.x; float yStep = 1.0 / colorTextureDimensions.y; int count = 0; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { vec2 offset; offset.x = -xStep + float(i) * xStep; offset.y = -yStep + float(j) * yStep; if (offset.x < 0.0 || offset.x > 1.0 || offset.y < 0.0 || offset.y > 1.0) { continue; } color += sampleTexture(offset); ++count; } } if (count > 0) { color /= float(count); } `,e===t-1&&(n+=` float previous = texture(previousLuminance, vec2(0.5)).r; color = clamp(color, minMaxLuminance.x, minMaxLuminance.y); color = previous + (color - previous) / (60.0 * 1.5); color = clamp(color, minMaxLuminance.x, minMaxLuminance.y); `),n+=` out_FragColor = vec4(color); } `,n}function Eht(e,t){Nxe(e);let n=e._framebuffers,i=n.length,o=new Array(i);for(let r=0;r<i;++r)o[r]=t.createViewportQuadCommand(Ght(r,i),{framebuffer:n[r].framebuffer,uniformMap:Zht(e,r)});e._commands=o}UT.prototype.clear=function(e){let t=this._framebuffers;if(!l(t))return;let n=this._clearCommand;l(n)||(n=this._clearCommand=new oi({color:new Y(0,0,0,0),framebuffer:void 0}));let i=t.length;for(let o=0;o<i;++o)t[o].clear(e,n)};UT.prototype.update=function(e){let t=e.drawingBufferWidth,n=e.drawingBufferHeight;(t!==this._width||n!==this._height)&&(this._width=t,this._height=n,Rht(this,e),Eht(this,e),this._ready||(this._ready=!0)),this._minMaxLuminance.x=this.minimumLuminance,this._minMaxLuminance.y=this.maximumLuminance;let i=this._framebuffers,o=i[i.length-1];i[i.length-1]=this._previousLuminance,this._commands[this._commands.length-1].framebuffer=this._previousLuminance.framebuffer,this._previousLuminance=o};UT.prototype.execute=function(e,t){this._colorTexture=t;let n=this._commands;if(!l(n))return;let i=n.length;for(let o=0;o<i;++o)n[o].execute(e)};UT.prototype.isDestroyed=function(){return!1};UT.prototype.destroy=function(){return Mxe(this),Nxe(this),me(this)};var qF=UT;var MNi=T(S(),1);var gNi=T(S(),1),Xht={NEAREST:0,LINEAR:1},Kd=Xht;function DT(e){e=y(e,y.EMPTY_OBJECT);let t=e.fragmentShader,n=y(e.textureScale,1),i=y(e.pixelFormat,at.RGBA);this._fragmentShader=t,this._uniforms=e.uniforms,this._textureScale=n,this._forcePowerOfTwo=y(e.forcePowerOfTwo,!1),this._sampleMode=y(e.sampleMode,Kd.NEAREST),this._pixelFormat=i,this._pixelDatatype=y(e.pixelDatatype,ze.UNSIGNED_BYTE),this._clearColor=y(e.clearColor,Y.BLACK),this._uniformMap=void 0,this._command=void 0,this._colorTexture=void 0,this._depthTexture=void 0,this._idTexture=void 0,this._actualUniforms={},this._dirtyUniforms=[],this._texturesToRelease=[],this._texturesToCreate=[],this._texturePromise=void 0;let o=new _c;o.scissorTest={enabled:!0,rectangle:l(e.scissorRectangle)?He.clone(e.scissorRectangle):new He},this._passState=o,this._ready=!1;let r=e.name;l(r)||(r=Yn()),this._name=r,this._logDepthChanged=void 0,this._useLogDepth=void 0,this._selectedIdTexture=void 0,this._selected=void 0,this._selectedShadow=void 0,this._parentSelected=void 0,this._parentSelectedShadow=void 0,this._combinedSelected=void 0,this._combinedSelectedShadow=void 0,this._selectedLength=0,this._parentSelectedLength=0,this._selectedDirty=!0,this._textureCache=void 0,this._index=void 0,this.enabled=!0,this._enabled=!0}Object.defineProperties(DT.prototype,{ready:{get:function(){return this._ready}},name:{get:function(){return this._name}},fragmentShader:{get:function(){return this._fragmentShader}},uniforms:{get:function(){return this._uniforms}},textureScale:{get:function(){return this._textureScale}},forcePowerOfTwo:{get:function(){return this._forcePowerOfTwo}},sampleMode:{get:function(){return this._sampleMode}},pixelFormat:{get:function(){return this._pixelFormat}},pixelDatatype:{get:function(){return this._pixelDatatype}},clearColor:{get:function(){return this._clearColor}},scissorRectangle:{get:function(){return this._passState.scissorTest.rectangle}},outputTexture:{get:function(){if(l(this._textureCache)){let e=this._textureCache.getFramebuffer(this._name);if(l(e))return e.getColorTexture(0)}}},selected:{get:function(){return this._selected},set:function(e){this._selected=e}},parentSelected:{get:function(){return this._parentSelected},set:function(e){this._parentSelected=e}}});var Iht=/uniform\s+sampler2D\s+depthTexture/g;DT.prototype._isSupported=function(e){return!Iht.test(this._fragmentShader)||e.depthTexture};function Wht(e,t,n){let i=t[n];return(typeof i=="string"||i instanceof HTMLCanvasElement||i instanceof HTMLImageElement||i instanceof HTMLVideoElement||i instanceof ImageData)&&e._dirtyUniforms.push(n),{get:function(){return t[n]},set:function(o){let r=t[n];t[n]=o;let s=e._actualUniforms,a=s[n];l(a)&&a!==r&&a instanceof Et&&!l(e._textureCache.getStageByName(n))&&(e._texturesToRelease.push(a),delete s[n],delete s[`${n}Dimensions`]),r instanceof Et&&e._texturesToRelease.push(r),typeof o=="string"||o instanceof HTMLCanvasElement||o instanceof HTMLImageElement||o instanceof HTMLVideoElement||o instanceof ImageData?e._dirtyUniforms.push(n):s[n]=o}}}function Pht(e,t){return function(){let n=e._actualUniforms[t];return typeof n=="function"?n():n}}function vht(e,t){return function(){let n=e[t]();if(l(n))return n.dimensions}}function wht(e){if(l(e._uniformMap))return;let t={},n={},i=e._uniforms,o=e._actualUniforms;for(let r in i)if(i.hasOwnProperty(r)){typeof i[r]!="function"?(t[r]=Pht(e,r),n[r]=Wht(e,i,r)):(t[r]=i[r],n[r]=i[r]),o[r]=i[r];let s=t[r]();(typeof s=="string"||s instanceof Et||s instanceof HTMLImageElement||s instanceof HTMLCanvasElement||s instanceof HTMLVideoElement)&&(t[`${r}Dimensions`]=vht(t,r))}e._uniforms={},Object.defineProperties(e._uniforms,n),e._uniformMap=xt(t,{colorTexture:function(){return e._colorTexture},colorTextureDimensions:function(){return e._colorTexture.dimensions},depthTexture:function(){return e._depthTexture},depthTextureDimensions:function(){return e._depthTexture.dimensions},czm_idTexture:function(){return e._idTexture},czm_selectedIdTexture:function(){return e._selectedIdTexture},czm_selectedIdTextureStep:function(){return 1/e._selectedIdTexture.width}})}function Fht(e,t){if(l(e._command)&&!e._logDepthChanged&&!e._selectedDirty)return;let n=e._fragmentShader;if(l(e._selectedIdTexture)){let o=e._selectedIdTexture.width;n=n.replace(/in\s+vec2\s+v_textureCoordinates;/g,""),n=`#define CZM_SELECTED_FEATURE uniform sampler2D czm_idTexture; uniform sampler2D czm_selectedIdTexture; uniform float czm_selectedIdTextureStep; in vec2 v_textureCoordinates; bool czm_selected(vec2 offset) { bool selected = false; vec4 id = texture(czm_idTexture, v_textureCoordinates + offset); for (int i = 0; i < ${o}; ++i) { vec4 selectedId = texture(czm_selectedIdTexture, vec2((float(i) + 0.5) * czm_selectedIdTextureStep, 0.5)); if (all(equal(id, selectedId))) { return true; } } return false; } bool czm_selected() { return czm_selected(vec2(0.0)); } ${n}`}let i=new Ye({defines:[e._useLogDepth?"LOG_DEPTH":""],sources:[n]});e._command=t.createViewportQuadCommand(i,{uniformMap:e._uniformMap,owner:e})}function Aht(e){let t=e._sampleMode,n,i;t===Kd.LINEAR?(n=rn.LINEAR,i=di.LINEAR):(n=rn.NEAREST,i=di.NEAREST);let o=e._sampler;(!l(o)||o.minificationFilter!==n||o.magnificationFilter!==i)&&(e._sampler=new sn({wrapS:Cn.CLAMP_TO_EDGE,wrapT:Cn.CLAMP_TO_EDGE,minificationFilter:n,magnificationFilter:i}))}function Mht(e,t){return function(n){e._texturesToCreate.push({name:t,source:n})}}function Nht(e,t){return function(){return e._textureCache.getOutputTexture(t)}}function kht(e,t){let n,i,o,r=e._texturesToRelease,s=r.length;for(n=0;n<s;++n)i=r[n],i=i&&i.destroy();r.length=0;let a=e._texturesToCreate;for(s=a.length,n=0;n<s;++n){let m=a[n];o=m.name;let p=m.source;e._actualUniforms[o]=new Et({context:t,source:p})}a.length=0;let c=e._dirtyUniforms;if(c.length===0&&!l(e._texturePromise)){e._ready=!0;return}if(c.length===0||l(e._texturePromise))return;s=c.length;let d=e._uniforms,u=[];for(n=0;n<s;++n){o=c[n];let m=d[o],p=e._textureCache.getStageByName(m);if(l(p))e._actualUniforms[o]=Nht(e,m);else if(typeof m=="string"){let g=new Ee({url:m});u.push(g.fetchImage().then(Mht(e,o)))}else e._texturesToCreate.push({name:o,source:m})}c.length=0,u.length>0?(e._ready=!1,e._texturePromise=Promise.all(u).then(function(){e._ready=!0,e._texturePromise=void 0})):e._ready=!0}function kxe(e){l(e._command)&&(e._command.shaderProgram=e._command.shaderProgram&&e._command.shaderProgram.destroy(),e._command=void 0),e._selectedIdTexture=e._selectedIdTexture&&e._selectedIdTexture.destroy();let t=e._textureCache;if(!l(t))return;let n=e._uniforms,i=e._actualUniforms;for(let o in i)i.hasOwnProperty(o)&&i[o]instanceof Et&&(l(t.getStageByName(n[o]))||i[o].destroy(),e._dirtyUniforms.push(o))}function Uht(e){let t=l(e._selected)?e._selected.length:0,n=l(e._parentSelected)?e._parentSelected:0,i=e._selected!==e._selectedShadow||t!==e._selectedLength;if(i=i||e._parentSelected!==e._parentSelectedShadow||n!==e._parentSelectedLength,l(e._selected)&&l(e._parentSelected)?e._combinedSelected=e._selected.concat(e._parentSelected):l(e._parentSelected)?e._combinedSelected=e._parentSelected:e._combinedSelected=e._selected,!i&&l(e._combinedSelected)){if(!l(e._combinedSelectedShadow))return!0;t=e._combinedSelected.length;for(let o=0;o<t;++o)if(e._combinedSelected[o]!==e._combinedSelectedShadow[o])return!0}return i}function Dht(e,t){if(!e._selectedDirty)return;e._selectedIdTexture=e._selectedIdTexture&&e._selectedIdTexture.destroy(),e._selectedIdTexture=void 0;let n=e._combinedSelected;if(!l(n))return;let i,o,r=0,s=n.length;for(i=0;i<s;++i)o=n[i],l(o.pickIds)?r+=o.pickIds.length:l(o.pickId)&&++r;if(s===0||r===0){let u=new Uint8Array(4);u[0]=255,u[1]=255,u[2]=255,u[3]=255,e._selectedIdTexture=new Et({context:t,pixelFormat:at.RGBA,pixelDatatype:ze.UNSIGNED_BYTE,source:{arrayBufferView:u,width:1,height:1},sampler:sn.NEAREST});return}let a,c=0,d=new Uint8Array(r*4);for(i=0;i<s;++i)if(o=n[i],l(o.pickIds)){let u=o.pickIds,m=u.length;for(let p=0;p<m;++p)a=u[p].color,d[c]=Y.floatToByte(a.red),d[c+1]=Y.floatToByte(a.green),d[c+2]=Y.floatToByte(a.blue),d[c+3]=Y.floatToByte(a.alpha),c+=4}else l(o.pickId)&&(a=o.pickId.color,d[c]=Y.floatToByte(a.red),d[c+1]=Y.floatToByte(a.green),d[c+2]=Y.floatToByte(a.blue),d[c+3]=Y.floatToByte(a.alpha),c+=4);e._selectedIdTexture=new Et({context:t,pixelFormat:at.RGBA,pixelDatatype:ze.UNSIGNED_BYTE,source:{arrayBufferView:d,width:r,height:1},sampler:sn.NEAREST})}DT.prototype.update=function(e,t){if(this.enabled!==this._enabled&&!this.enabled&&kxe(this),this._enabled=this.enabled,!this._enabled||(this._logDepthChanged=t!==this._useLogDepth,this._useLogDepth=t,this._selectedDirty=Uht(this),this._selectedShadow=this._selected,this._parentSelectedShadow=this._parentSelected,this._combinedSelectedShadow=this._combinedSelected,this._selectedLength=l(this._selected)?this._selected.length:0,this._parentSelectedLength=l(this._parentSelected)?this._parentSelected.length:0,Dht(this,e),wht(this),kht(this,e),Fht(this,e),Aht(this),this._selectedDirty=!1,!this._ready))return;let n=this._textureCache.getFramebuffer(this._name);if(this._command.framebuffer=n,!l(n))return;let i=n.getColorTexture(0),o;(i.width!==e.drawingBufferWidth||i.height!==e.drawingBufferHeight)&&(o=this._renderState,(!l(o)||i.width!==o.viewport.width||i.height!==o.viewport.height)&&(this._renderState=De.fromCache({viewport:new He(0,0,i.width,i.height)}))),this._command.renderState=o};DT.prototype.execute=function(e,t,n,i){if(!l(this._command)||!l(this._command.framebuffer)||!this._ready||!this._enabled)return;this._colorTexture=t,this._depthTexture=n,this._idTexture=i,sn.equals(this._colorTexture.sampler,this._sampler)||(this._colorTexture.sampler=this._sampler);let o=this.scissorRectangle.width>0&&this.scissorRectangle.height>0?this._passState:void 0;l(o)&&(o.context=e),this._command.execute(e,o)};DT.prototype.isDestroyed=function(){return!1};DT.prototype.destroy=function(){return kxe(this),me(this)};var fo=DT;var YNi=T(S(),1);function BT(e){e=y(e,y.EMPTY_OBJECT),this._stages=e.stages,this._inputPreviousStageTexture=y(e.inputPreviousStageTexture,!0);let t=e.name;l(t)||(t=Yn()),this._name=t,this._uniforms=e.uniforms,this._textureCache=void 0,this._index=void 0,this._selected=void 0,this._selectedShadow=void 0,this._parentSelected=void 0,this._parentSelectedShadow=void 0,this._combinedSelected=void 0,this._combinedSelectedShadow=void 0,this._selectedLength=0,this._parentSelectedLength=0,this._selectedDirty=!0}Object.defineProperties(BT.prototype,{ready:{get:function(){let e=this._stages,t=e.length;for(let n=0;n<t;++n)if(!e[n].ready)return!1;return!0}},name:{get:function(){return this._name}},enabled:{get:function(){return this._stages[0].enabled},set:function(e){let t=this._stages,n=t.length;for(let i=0;i<n;++i)t[i].enabled=e}},uniforms:{get:function(){return this._uniforms}},inputPreviousStageTexture:{get:function(){return this._inputPreviousStageTexture}},length:{get:function(){return this._stages.length}},selected:{get:function(){return this._selected},set:function(e){this._selected=e}},parentSelected:{get:function(){return this._parentSelected},set:function(e){this._parentSelected=e}}});BT.prototype._isSupported=function(e){let t=this._stages,n=t.length;for(let i=0;i<n;++i)if(!t[i]._isSupported(e))return!1;return!0};BT.prototype.get=function(e){return this._stages[e]};function Bht(e){let t=l(e._selected)?e._selected.length:0,n=l(e._parentSelected)?e._parentSelected:0,i=e._selected!==e._selectedShadow||t!==e._selectedLength;if(i=i||e._parentSelected!==e._parentSelectedShadow||n!==e._parentSelectedLength,l(e._selected)&&l(e._parentSelected)?e._combinedSelected=e._selected.concat(e._parentSelected):l(e._parentSelected)?e._combinedSelected=e._parentSelected:e._combinedSelected=e._selected,!i&&l(e._combinedSelected)){if(!l(e._combinedSelectedShadow))return!0;t=e._combinedSelected.length;for(let o=0;o<t;++o)if(e._combinedSelected[o]!==e._combinedSelectedShadow[o])return!0}return i}BT.prototype.update=function(e,t){this._selectedDirty=Bht(this),this._selectedShadow=this._selected,this._parentSelectedShadow=this._parentSelected,this._combinedSelectedShadow=this._combinedSelected,this._selectedLength=l(this._selected)?this._selected.length:0,this._parentSelectedLength=l(this._parentSelected)?this._parentSelected.length:0;let n=this._stages,i=n.length;for(let o=0;o<i;++o){let r=n[o];this._selectedDirty&&(r.parentSelected=this._combinedSelected),r.update(e,t)}};BT.prototype.isDestroyed=function(){return!1};BT.prototype.destroy=function(){let e=this._stages,t=e.length;for(let n=0;n<t;++n)e[n].destroy();return me(this)};var al=BT;var Mr={};function c3(e){let o=`#define USE_STEP_SIZE ${Gy}`,r=new fo({name:`${e}_x_direction`,fragmentShader:o,uniforms:{delta:1,sigma:2,stepSize:1,direction:0},sampleMode:Kd.LINEAR}),s=new fo({name:`${e}_y_direction`,fragmentShader:o,uniforms:{delta:1,sigma:2,stepSize:1,direction:1},sampleMode:Kd.LINEAR}),a={};return Object.defineProperties(a,{delta:{get:function(){return r.uniforms.delta},set:function(c){let d=r.uniforms,u=s.uniforms;d.delta=u.delta=c}},sigma:{get:function(){return r.uniforms.sigma},set:function(c){let d=r.uniforms,u=s.uniforms;d.sigma=u.sigma=c}},stepSize:{get:function(){return r.uniforms.stepSize},set:function(c){let d=r.uniforms,u=s.uniforms;d.stepSize=u.stepSize=c}}}),new al({name:e,stages:[r,s],uniforms:a})}Mr.createBlurStage=function(){return c3("czm_blur")};Mr.createDepthOfFieldStage=function(){let e=c3("czm_depth_of_field_blur"),t=new fo({name:"czm_depth_of_field_composite",fragmentShader:DF,uniforms:{focalDistance:5,blurTexture:e.name}}),n={};return Object.defineProperties(n,{focalDistance:{get:function(){return t.uniforms.focalDistance},set:function(i){t.uniforms.focalDistance=i}},delta:{get:function(){return e.uniforms.delta},set:function(i){e.uniforms.delta=i}},sigma:{get:function(){return e.uniforms.sigma},set:function(i){e.uniforms.sigma=i}},stepSize:{get:function(){return e.uniforms.stepSize},set:function(i){e.uniforms.stepSize=i}}}),new al({name:"czm_depth_of_field",stages:[e,t],inputPreviousStageTexture:!1,uniforms:n})};Mr.isDepthOfFieldSupported=function(e){return e.context.depthTexture};Mr.createEdgeDetectionStage=function(){let e=Yn();return new fo({name:`czm_edge_detection_${e}`,fragmentShader:YF,uniforms:{length:.25,color:Y.clone(Y.BLACK)}})};Mr.isEdgeDetectionSupported=function(e){return e.context.depthTexture};function Yht(e){if(!l(e))return Mr.createEdgeDetectionStage();let t=new al({name:"czm_edge_detection_multiple",stages:e,inputPreviousStageTexture:!1}),n={},i="",o="";for(let a=0;a<e.length;++a)i+=`uniform sampler2D edgeTexture${a}; `,o+=` vec4 edge${a} = texture(edgeTexture${a}, v_textureCoordinates); if (edge${a}.a > 0.0) { color = edge${a}; break; } `,n[`edgeTexture${a}`]=e[a].name;let r=`${i}in vec2 v_textureCoordinates; void main() { vec4 color = vec4(0.0); for (int i = 0; i < ${e.length}; i++) { ${o} } out_FragColor = color; } `,s=new fo({name:"czm_edge_detection_combine",fragmentShader:r,uniforms:n});return new al({name:"czm_edge_detection_composite",stages:[t,s]})}Mr.createSilhouetteStage=function(e){let t=Yht(e),n=new fo({name:"czm_silhouette_color_edges",fragmentShader:jF,uniforms:{silhouetteTexture:t.name}});return new al({name:"czm_silhouette",stages:[t,n],inputPreviousStageTexture:!1,uniforms:t.uniforms})};Mr.isSilhouetteSupported=function(e){return e.context.depthTexture};Mr.createBloomStage=function(){let e=new fo({name:"czm_bloom_contrast_bias",fragmentShader:UF,uniforms:{contrast:128,brightness:-.3}}),t=c3("czm_bloom_blur"),n=new al({name:"czm_bloom_contrast_bias_blur",stages:[e,t]}),i=new fo({name:"czm_bloom_generate_composite",fragmentShader:NF,uniforms:{glowOnly:!1,bloomTexture:n.name}}),o={};return Object.defineProperties(o,{glowOnly:{get:function(){return i.uniforms.glowOnly},set:function(r){i.uniforms.glowOnly=r}},contrast:{get:function(){return e.uniforms.contrast},set:function(r){e.uniforms.contrast=r}},brightness:{get:function(){return e.uniforms.brightness},set:function(r){e.uniforms.brightness=r}},delta:{get:function(){return t.uniforms.delta},set:function(r){t.uniforms.delta=r}},sigma:{get:function(){return t.uniforms.sigma},set:function(r){t.uniforms.sigma=r}},stepSize:{get:function(){return t.uniforms.stepSize},set:function(r){t.uniforms.stepSize=r}}}),new al({name:"czm_bloom",stages:[n,i],inputPreviousStageTexture:!1,uniforms:o})};Mr.createAmbientOcclusionStage=function(){let e=new fo({name:"czm_ambient_occlusion_generate",fragmentShader:FF,uniforms:{intensity:3,bias:.1,lengthCap:.26,stepSize:1.95,frustumLength:1e3,randomTexture:void 0}}),t=c3("czm_ambient_occlusion_blur");t.uniforms.stepSize=.86;let n=new al({name:"czm_ambient_occlusion_generate_blur",stages:[e,t]}),i=new fo({name:"czm_ambient_occlusion_composite",fragmentShader:AF,uniforms:{ambientOcclusionOnly:!1,ambientOcclusionTexture:n.name}}),o={};return Object.defineProperties(o,{intensity:{get:function(){return e.uniforms.intensity},set:function(r){e.uniforms.intensity=r}},bias:{get:function(){return e.uniforms.bias},set:function(r){e.uniforms.bias=r}},lengthCap:{get:function(){return e.uniforms.lengthCap},set:function(r){e.uniforms.lengthCap=r}},stepSize:{get:function(){return e.uniforms.stepSize},set:function(r){e.uniforms.stepSize=r}},frustumLength:{get:function(){return e.uniforms.frustumLength},set:function(r){e.uniforms.frustumLength=r}},randomTexture:{get:function(){return e.uniforms.randomTexture},set:function(r){e.uniforms.randomTexture=r}},delta:{get:function(){return t.uniforms.delta},set:function(r){t.uniforms.delta=r}},sigma:{get:function(){return t.uniforms.sigma},set:function(r){t.uniforms.sigma=r}},blurStepSize:{get:function(){return t.uniforms.stepSize},set:function(r){t.uniforms.stepSize=r}},ambientOcclusionOnly:{get:function(){return i.uniforms.ambientOcclusionOnly},set:function(r){i.uniforms.ambientOcclusionOnly=r}}}),new al({name:"czm_ambient_occlusion",stages:[n,i],inputPreviousStageTexture:!1,uniforms:o})};Mr.isAmbientOcclusionSupported=function(e){return e.context.depthTexture};var Oht=`#define FXAA_QUALITY_PRESET 39 ${yw} ${HF}`;Mr.createFXAAStage=function(){return new fo({name:"czm_FXAA",fragmentShader:Oht,sampleMode:Kd.LINEAR})};Mr.createAcesTonemappingStage=function(e){let t=e?`#define AUTO_EXPOSURE `:"";return t+=wF,new fo({name:"czm_aces",fragmentShader:t,uniforms:{autoExposure:void 0}})};Mr.createFilmicTonemappingStage=function(e){let t=e?`#define AUTO_EXPOSURE `:"";return t+=OF,new fo({name:"czm_filmic",fragmentShader:t,uniforms:{autoExposure:void 0}})};Mr.createReinhardTonemappingStage=function(e){let t=e?`#define AUTO_EXPOSURE `:"";return t+=QF,new fo({name:"czm_reinhard",fragmentShader:t,uniforms:{autoExposure:void 0}})};Mr.createModifiedReinhardTonemappingStage=function(e){let t=e?`#define AUTO_EXPOSURE `:"";return t+=KF,new fo({name:"czm_modified_reinhard",fragmentShader:t,uniforms:{white:Y.WHITE,autoExposure:void 0}})};Mr.createAutoExposureStage=function(){return new qF};Mr.createBlackAndWhiteStage=function(){return new fo({name:"czm_black_and_white",fragmentShader:MF,uniforms:{gradations:5}})};Mr.createBrightnessStage=function(){return new fo({name:"czm_brightness",fragmentShader:kF,uniforms:{brightness:.5}})};Mr.createNightVisionStage=function(){return new fo({name:"czm_night_vision",fragmentShader:JF})};Mr.createDepthViewStage=function(){return new fo({name:"czm_depth_view",fragmentShader:BF})};Mr.createLensFlareStage=function(){return new fo({name:"czm_lens_flare",fragmentShader:zF,uniforms:{dirtTexture:tn("Assets/Textures/LensFlare/DirtMask.jpg"),starTexture:tn("Assets/Textures/LensFlare/StarBurst.jpg"),intensity:2,distortion:10,ghostDispersal:.4,haloWidth:.4,dirtAmount:.4,earthRadius:ie.WGS84.maximumRadius}})};var im=Mr;var G5i=T(S(),1);function sb(e){this._collection=e,this._framebuffers=[],this._stageNameToFramebuffer={},this._width=void 0,this._height=void 0,this._updateDependencies=!1}function e9(e){for(;l(e.length);)e=e.get(e.length-1);return e.name}function h8(e,t,n,i,o){if(!i.enabled||!i._isSupported(t))return o;let r=n[i.name]={};if(l(o)){let a=e.getStageByName(o);r[e9(a)]=!0}let s=i.uniforms;if(l(s)){let a=Object.getOwnPropertyNames(s),c=a.length;for(let d=0;d<c;++d){let u=s[a[d]];if(typeof u=="string"){let m=e.getStageByName(u);l(m)&&(r[e9(m)]=!0)}}}return i.name}function $F(e,t,n,i,o){if(l(i.enabled)&&!i.enabled||l(i._isSupported)&&!i._isSupported(t))return o;let r=o,s=!l(i.inputPreviousStageTexture)||i.inputPreviousStageTexture,a=o,c=i.length;for(let m=0;m<c;++m){let p=i.get(m);l(p.length)?a=$F(e,t,n,p,o):a=h8(e,t,n,p,o),s&&(o=a)}let d,u;if(s)for(d=1;d<c;++d)u=e9(i.get(d)),l(n[u])||(n[u]={}),n[u][r]=!0;else for(d=1;d<c;++d){u=e9(i.get(d));let m=n[u];for(let p=0;p<d;++p)m[e9(i.get(p))]=!0}return a}function Hht(e,t){let n={};if(l(e.ambientOcclusion)){let i=e.ambientOcclusion,o=e.bloom,r=e._tonemapping,s=e.fxaa,a=$F(e,t,n,i,void 0);a=$F(e,t,n,o,a),a=h8(e,t,n,r,a),a=$F(e,t,n,e,a),h8(e,t,n,s,a)}else $F(e,t,n,e,void 0);return n}function zht(e,t,n){let o=e._collection.getStageByName(t),r=o._textureScale,s=o._forcePowerOfTwo,a=o._pixelFormat,c=o._pixelDatatype,d=o._clearColor,u,m,p=e._framebuffers,g=p.length;for(u=0;u<g;++u){if(m=p[u],r!==m.textureScale||s!==m.forcePowerOfTwo||a!==m.pixelFormat||c!==m.pixelDatatype||!Y.equals(d,m.clearColor))continue;let f=m.stages,x=f.length,_=!1;for(let C=0;C<x;++C)if(n[f[C]]){_=!0;break}if(!_)break}return l(m)&&u<g?(m.stages.push(t),m):(m={textureScale:r,forcePowerOfTwo:s,pixelFormat:a,pixelDatatype:c,clearColor:d,stages:[t],buffer:new ui({pixelFormat:a,pixelDatatype:c}),clear:void 0},p.push(m),m)}function Kht(e,t){let n=Hht(e._collection,t);for(let i in n)n.hasOwnProperty(i)&&(e._stageNameToFramebuffer[i]=zht(e,i,n[i]))}function f8(e){let t=e._framebuffers,n=t.length;for(let i=0;i<n;++i)t[i].buffer.destroy()}function Jht(e,t){let n=e._width,i=e._height,o=e._framebuffers,r=o.length;for(let s=0;s<r;++s){let a=o[s],c=a.textureScale,d=Math.ceil(n*c),u=Math.ceil(i*c),m=Math.min(d,u);a.forcePowerOfTwo&&(W.isPowerOfTwo(m)||(m=W.nextPowerOfTwo(m)),d=m,u=m),a.buffer.update(t,d,u),a.clear=new oi({color:a.clearColor,framebuffer:a.buffer.framebuffer})}}sb.prototype.updateDependencies=function(){this._updateDependencies=!0};sb.prototype.update=function(e){let t=this._collection,n=this._updateDependencies,i=l(t.ambientOcclusion)&&t.ambientOcclusion.enabled&&t.ambientOcclusion._isSupported(e),o=l(t.bloom)&&t.bloom.enabled&&t.bloom._isSupported(e),r=l(t._tonemapping)&&t._tonemapping.enabled&&t._tonemapping._isSupported(e),s=l(t.fxaa)&&t.fxaa.enabled&&t.fxaa._isSupported(e),a=!l(t._activeStages)||t._activeStages.length>0||i||o||r||s;if((n||!a&&this._framebuffers.length>0)&&(f8(this),this._framebuffers.length=0,this._stageNameToFramebuffer={},this._width=void 0,this._height=void 0),!n&&!a)return;this._framebuffers.length===0&&Kht(this,e);let c=e.drawingBufferWidth,d=e.drawingBufferHeight,u=this._width!==c||this._height!==d;!n&&!u||(this._width=c,this._height=d,this._updateDependencies=!1,f8(this),Jht(this,e))};sb.prototype.clear=function(e){let t=this._framebuffers;for(let n=0;n<t.length;++n)t[n].clear.execute(e)};sb.prototype.getStageByName=function(e){return this._collection.getStageByName(e)};sb.prototype.getOutputTexture=function(e){return this._collection.getOutputTexture(e)};sb.prototype.getFramebuffer=function(e){let t=this._stageNameToFramebuffer[e];if(l(t))return t.buffer.framebuffer};sb.prototype.isDestroyed=function(){return!1};sb.prototype.destroy=function(){return f8(this),me(this)};var YT=sb;var X5i=T(S(),1),t9={REINHARD:0,MODIFIED_REINHARD:1,FILMIC:2,ACES:3,validate:function(e){return e===t9.REINHARD||e===t9.MODIFIED_REINHARD||e===t9.FILMIC||e===t9.ACES}},Ey=Object.freeze(t9);var p8=[];function cl(){let e=im.createFXAAStage(),t=im.createAmbientOcclusionStage(),n=im.createBloomStage();this._autoExposureEnabled=!1,this._autoExposure=im.createAutoExposureStage(),this._tonemapping=void 0,this._tonemapper=void 0,this.tonemapper=Ey.ACES;let i=this._tonemapping;e.enabled=!1,t.enabled=!1,n.enabled=!1,i.enabled=!1;let o=new YT(this),r={},s=p8;for(s.push(e,t,n,i);s.length>0;){let c=s.pop();r[c.name]=c,c._textureCache=o;let d=c.length;if(l(d))for(let u=0;u<d;++u)s.push(c.get(u))}this._stages=[],this._activeStages=[],this._previousActiveStages=[],this._randomTexture=void 0;let a=this;t.uniforms.randomTexture=function(){return a._randomTexture},this._ao=t,this._bloom=n,this._fxaa=e,this._aoEnabled=void 0,this._bloomEnabled=void 0,this._tonemappingEnabled=void 0,this._fxaaEnabled=void 0,this._activeStagesChanged=!1,this._stagesRemoved=!1,this._textureCacheDirty=!1,this._stageNames=r,this._textureCache=o}Object.defineProperties(cl.prototype,{ready:{get:function(){let e=!1,t=this._stages,n=t.length;for(let a=n-1;a>=0;--a){let c=t[a];e=e||c.ready&&c.enabled}let i=this._fxaa,o=this._ao,r=this._bloom,s=this._tonemapping;return e=e||i.ready&&i.enabled,e=e||o.ready&&o.enabled,e=e||r.ready&&r.enabled,e=e||s.ready&&s.enabled,e}},fxaa:{get:function(){return this._fxaa}},ambientOcclusion:{get:function(){return this._ao}},bloom:{get:function(){return this._bloom}},length:{get:function(){return b8(this),this._stages.length}},outputTexture:{get:function(){let e=this._fxaa;if(e.enabled&&e.ready)return this.getOutputTexture(e.name);let t=this._stages,n=t.length;for(let s=n-1;s>=0;--s){let a=t[s];if(l(a)&&a.ready&&a.enabled)return this.getOutputTexture(a.name)}let i=this._tonemapping;if(i.enabled&&i.ready)return this.getOutputTexture(i.name);let o=this._bloom;if(o.enabled&&o.ready)return this.getOutputTexture(o.name);let r=this._ao;if(r.enabled&&r.ready)return this.getOutputTexture(r.name)}},hasSelected:{get:function(){let e=this._stages.slice();for(;e.length>0;){let t=e.pop();if(!l(t))continue;if(l(t.selected))return!0;let n=t.length;if(l(n))for(let i=0;i<n;++i)e.push(t.get(i))}return!1}},tonemapper:{get:function(){return this._tonemapper},set:function(e){if(this._tonemapper===e)return;l(this._tonemapping)&&(delete this._stageNames[this._tonemapping.name],this._tonemapping.destroy());let t=this._autoExposureEnabled,n;switch(e){case Ey.REINHARD:n=im.createReinhardTonemappingStage(t);break;case Ey.MODIFIED_REINHARD:n=im.createModifiedReinhardTonemappingStage(t);break;case Ey.FILMIC:n=im.createFilmicTonemappingStage(t);break;default:n=im.createAcesTonemappingStage(t);break}if(t){let i=this._autoExposure;n.uniforms.autoExposure=function(){return i.outputTexture}}this._tonemapper=e,this._tonemapping=n,l(this._stageNames)&&(this._stageNames[n.name]=n,n._textureCache=this._textureCache),this._textureCacheDirty=!0}}});function b8(e){if(!e._stagesRemoved)return;e._stagesRemoved=!1;let t=[],n=e._stages,i=n.length;for(let o=0,r=0;o<i;++o){let s=n[o];s&&(s._index=r++,t.push(s))}e._stages=t}cl.prototype.add=function(e){let t=this._stageNames,n=p8;for(n.push(e);n.length>0;){let o=n.pop();t[o.name]=o,o._textureCache=this._textureCache;let r=o.length;if(l(r))for(let s=0;s<r;++s)n.push(o.get(s))}let i=this._stages;return e._index=i.length,i.push(e),this._textureCacheDirty=!0,e};cl.prototype.remove=function(e){if(!this.contains(e))return!1;let t=this._stageNames,n=p8;for(n.push(e);n.length>0;){let i=n.pop();delete t[i.name];let o=i.length;if(l(o))for(let r=0;r<o;++r)n.push(i.get(r))}return this._stages[e._index]=void 0,this._stagesRemoved=!0,this._textureCacheDirty=!0,e._index=void 0,e._textureCache=void 0,e.destroy(),!0};cl.prototype.contains=function(e){return l(e)&&l(e._index)&&e._textureCache===this._textureCache};cl.prototype.get=function(e){return b8(this),this._stages[e]};cl.prototype.removeAll=function(){let e=this._stages,t=e.length;for(let n=0;n<t;++n)this.remove(e[n]);e.length=0};cl.prototype.getStageByName=function(e){return this._stageNames[e]};cl.prototype.update=function(e,t,n){b8(this);let i=this._activeStages,o=this._activeStages=this._previousActiveStages;this._previousActiveStages=i;let r=this._stages,s=o.length=r.length,a,c,d=0;for(a=0;a<s;++a)c=r[a],c.ready&&c.enabled&&c._isSupported(e)&&(o[d++]=c);o.length=d;let u=d!==i.length;if(!u){for(a=0;a<d;++a)if(o[a]!==i[a]){u=!0;break}}let m=this._ao,p=this._bloom,g=this._autoExposure,f=this._tonemapping,x=this._fxaa;f.enabled=n;let _=m.enabled&&m._isSupported(e),C=p.enabled&&p._isSupported(e),V=f.enabled&&f._isSupported(e),L=x.enabled&&x._isSupported(e);if((u||this._textureCacheDirty||_!==this._aoEnabled||C!==this._bloomEnabled||V!==this._tonemappingEnabled||L!==this._fxaaEnabled)&&(this._textureCache.updateDependencies(),this._aoEnabled=_,this._bloomEnabled=C,this._tonemappingEnabled=V,this._fxaaEnabled=L,this._textureCacheDirty=!1),l(this._randomTexture)&&!_&&(this._randomTexture.destroy(),this._randomTexture=void 0),!l(this._randomTexture)&&_){s=256*256*3;let Z=new Uint8Array(s);for(a=0;a<s;a+=3)Z[a]=Math.floor(Math.random()*255);this._randomTexture=new Et({context:e,pixelFormat:at.RGB,pixelDatatype:ze.UNSIGNED_BYTE,source:{arrayBufferView:Z,width:256,height:256},sampler:new sn({wrapS:Cn.REPEAT,wrapT:Cn.REPEAT,minificationFilter:rn.NEAREST,magnificationFilter:di.NEAREST})})}for(this._textureCache.update(e),x.update(e,t),m.update(e,t),p.update(e,t),f.update(e,t),this._autoExposureEnabled&&g.update(e,t),s=r.length,a=0;a<s;++a)r[a].update(e,t);for(d=0,a=0;a<s;++a)c=r[a],c.ready&&c.enabled&&c._isSupported(e)&&d++;u=d!==o.length,u&&this.update(e,t,n)};cl.prototype.clear=function(e){this._textureCache.clear(e),this._autoExposureEnabled&&this._autoExposure.clear(e)};function OT(e){for(;l(e.length);)e=e.get(e.length-1);return e.outputTexture}cl.prototype.getOutputTexture=function(e){let t=this.getStageByName(e);if(l(t))return OT(t)};function Jf(e,t,n,i,o){if(l(e.execute)){e.execute(t,n,i,o);return}let r=e.length,s;if(e.inputPreviousStageTexture)for(Jf(e.get(0),t,n,i,o),s=1;s<r;++s)Jf(e.get(s),t,OT(e.get(s-1)),i,o);else for(s=0;s<r;++s)Jf(e.get(s),t,n,i,o)}cl.prototype.execute=function(e,t,n,i){let o=this._activeStages,r=o.length,s=this._fxaa,a=this._ao,c=this._bloom,d=this._autoExposure,u=this._tonemapping,m=a.enabled&&a._isSupported(e),p=c.enabled&&c._isSupported(e),g=this._autoExposureEnabled,f=u.enabled&&u._isSupported(e),x=s.enabled&&s._isSupported(e);if(!x&&!m&&!p&&!f&&r===0)return;let _=t;m&&a.ready&&(Jf(a,e,_,n,i),_=OT(a)),p&&c.ready&&(Jf(c,e,_,n,i),_=OT(c)),g&&d.ready&&Jf(d,e,_,n,i),f&&u.ready&&(Jf(u,e,_,n,i),_=OT(u));let C=_;if(r>0){Jf(o[0],e,_,n,i);for(let V=1;V<r;++V)Jf(o[V],e,OT(o[V-1]),n,i);C=OT(o[r-1])}x&&s.ready&&Jf(s,e,C,n,i)};cl.prototype.copy=function(e,t){if(!l(this._copyColorCommand)){let n=this;this._copyColorCommand=e.createViewportQuadCommand(jl,{uniformMap:{colorTexture:function(){return n.outputTexture}},owner:this})}this._copyColorCommand.framebuffer=t,this._copyColorCommand.execute(e)};cl.prototype.isDestroyed=function(){return!1};cl.prototype.destroy=function(){return this._fxaa.destroy(),this._ao.destroy(),this._bloom.destroy(),this._autoExposure.destroy(),this._tonemapping.destroy(),this.removeAll(),this._textureCache=this._textureCache&&this._textureCache.destroy(),me(this)};var n9=cl;var lki=T(S(),1);function HT(e){this._scene=e,this._currentTweens=[],this._morphHandler=void 0,this._morphCancelled=!1,this._completeMorph=void 0,this._morphToOrthographic=!1}HT.prototype.completeMorph=function(){l(this._completeMorph)&&this._completeMorph()};HT.prototype.morphTo2D=function(e,t){l(this._completeMorph)&&this._completeMorph();let n=this._scene;this._previousMode=n.mode,this._morphToOrthographic=n.camera.frustum instanceof on,!(this._previousMode===oe.SCENE2D||this._previousMode===oe.MORPHING)&&(this._scene.morphStart.raiseEvent(this,this._previousMode,oe.SCENE2D,!0),n._mode=oe.MORPHING,n.camera._setTransform(M.IDENTITY),this._previousMode===oe.COLUMBUS_VIEW?Gft(this,e):wft(this,e,t),e===0&&l(this._completeMorph)&&this._completeMorph())};var Qht=new h,jht=new h,qht=new h,$ht=new h,eft=new h,tft=new h,nft=new h,ift=new he,oft=new M,rft=new yi,sft=new on,aft={position:void 0,direction:void 0,up:void 0,position2D:void 0,direction2D:void 0,up2D:void 0,frustum:void 0};HT.prototype.morphToColumbusView=function(e,t){l(this._completeMorph)&&this._completeMorph();let n=this._scene;if(this._previousMode=n.mode,this._previousMode===oe.COLUMBUS_VIEW||this._previousMode===oe.MORPHING)return;this._scene.morphStart.raiseEvent(this,this._previousMode,oe.COLUMBUS_VIEW,!0),n.camera._setTransform(M.IDENTITY);let i=Qht,o=jht,r=qht;if(e>0)i.x=0,i.y=-1,i.z=1,i=h.multiplyByScalar(h.normalize(i,i),5*t.maximumRadius,i),h.negate(h.normalize(i,o),o),h.cross(h.UNIT_X,o,r);else{let d=n.camera;if(this._previousMode===oe.SCENE2D)h.clone(d.position,i),i.z=d.frustum.right-d.frustum.left,h.negate(h.UNIT_Z,o),h.clone(h.UNIT_Y,r);else{h.clone(d.positionWC,i),h.clone(d.directionWC,o),h.clone(d.upWC,r);let u=t.scaleToGeodeticSurface(i,nft),m=Gt.eastNorthUpToFixedFrame(u,t,oft);M.inverseTransformation(m,m),n.mapProjection.project(t.cartesianToCartographic(i,ift),i),M.multiplyByPointAsVector(m,o,o),M.multiplyByPointAsVector(m,r,r)}}let s;this._morphToOrthographic?(s=sft,s.width=n.camera.frustum.right-n.camera.frustum.left,s.aspectRatio=n.drawingBufferWidth/n.drawingBufferHeight):(s=rft,s.aspectRatio=n.drawingBufferWidth/n.drawingBufferHeight,s.fov=W.toRadians(60));let a=aft;a.position=i,a.direction=o,a.up=r,a.frustum=s;let c=Aft(a);i9(this,c),this._previousMode===oe.SCENE2D?Fft(this,e,a,c):(a.position2D=M.multiplyByPoint(ao.TRANSFORM_2D,i,$ht),a.direction2D=M.multiplyByPointAsVector(ao.TRANSFORM_2D,o,eft),a.up2D=M.multiplyByPointAsVector(ao.TRANSFORM_2D,r,tft),n._mode=oe.MORPHING,jxe(this,e,a,c)),e===0&&l(this._completeMorph)&&this._completeMorph()};var x8={position:new h,direction:new h,up:new h,frustum:void 0},Dxe=new yi;HT.prototype.morphTo3D=function(e,t){l(this._completeMorph)&&this._completeMorph();let n=this._scene;if(this._previousMode=n.mode,!(this._previousMode===oe.SCENE3D||this._previousMode===oe.MORPHING)){if(this._scene.morphStart.raiseEvent(this,this._previousMode,oe.SCENE3D,!0),n._mode=oe.MORPHING,n.camera._setTransform(M.IDENTITY),this._previousMode===oe.SCENE2D)yft(this,e,t);else{let i;e>0?(i=x8,h.fromDegrees(0,0,5*t.maximumRadius,t,i.position),h.negate(i.position,i.direction),h.normalize(i.direction,i.direction),h.clone(h.UNIT_Z,i.up)):i=Bxe(this,t);let o,r=n.camera;r.frustum instanceof on?o=r.frustum.clone():(o=Dxe,o.aspectRatio=n.drawingBufferWidth/n.drawingBufferHeight,o.fov=W.toRadians(60)),i.frustum=o;let s=$xe(i);i9(this,s),y8(this,e,i,s)}e===0&&l(this._completeMorph)&&this._completeMorph()}};HT.prototype.isDestroyed=function(){return!1};HT.prototype.destroy=function(){return l3(this),me(this)};function i9(e,t){if(e._scene.completeMorphOnUserInput){e._morphHandler=new fd(e._scene.canvas);let n=function(){e._morphCancelled=!0,e._scene.camera.cancelFlight(),t(e)};e._completeMorph=n,e._morphHandler.setInputAction(n,yn.LEFT_DOWN),e._morphHandler.setInputAction(n,yn.MIDDLE_DOWN),e._morphHandler.setInputAction(n,yn.RIGHT_DOWN),e._morphHandler.setInputAction(n,yn.WHEEL)}}function l3(e){let t=e._currentTweens;for(let n=0;n<t.length;++n)t[n].cancelTween();e._currentTweens.length=0,e._morphHandler=e._morphHandler&&e._morphHandler.destroy()}var cft=new he,lft=new h,dft=new M;function Bxe(e,t){let n=e._scene,i=n.camera,o=x8,r=o.position,s=o.direction,a=o.up,c=n.mapProjection.unproject(i.position,cft);t.cartographicToCartesian(c,r);let d=t.scaleToGeodeticSurface(r,lft),u=Gt.eastNorthUpToFixedFrame(d,t,dft);return M.multiplyByPointAsVector(u,i.direction,s),M.multiplyByPointAsVector(u,i.up,a),o}var uft=new h,mft=new h,hft=new h,fft=new h,pft=new h,bft=new h;function y8(e,t,n,i){t*=.5;let o=e._scene,r=o.camera,s=h.clone(r.position,uft),a=h.clone(r.direction,mft),c=h.clone(r.up,hft),d=M.multiplyByPoint(ao.TRANSFORM_2D_INVERSE,n.position,fft),u=M.multiplyByPointAsVector(ao.TRANSFORM_2D_INVERSE,n.direction,pft),m=M.multiplyByPointAsVector(ao.TRANSFORM_2D_INVERSE,n.up,bft);function p(f){om(s,d,f.time,r.position),om(a,u,f.time,r.direction),om(c,m,f.time,r.up),h.cross(r.direction,r.up,r.right),h.normalize(r.right,r.right)}let g=o.tweens.add({duration:t,easingFunction:Lr.QUARTIC_OUT,startObject:{time:0},stopObject:{time:1},update:p,complete:function(){qxe(e,o,0,1,t,i)}});e._currentTweens.push(g)}var gft=new on,Yxe=new h,Oxe=new h,Hxe=new h,_8=new h,zxe=new h,Kxe=new h;function yft(e,t,n){t/=3;let i=e._scene,o=i.camera,r;t>0?(r=x8,h.fromDegrees(0,0,5*n.maximumRadius,n,r.position),h.negate(r.position,r.direction),h.normalize(r.direction,r.direction),h.clone(h.UNIT_Z,r.up)):(o.position.z=o.frustum.right-o.frustum.left,r=Bxe(e,n));let s;e._morphToOrthographic?(s=gft,s.aspectRatio=i.drawingBufferWidth/i.drawingBufferHeight,s.width=o.frustum.right-o.frustum.left):(s=Dxe,s.aspectRatio=i.drawingBufferWidth/i.drawingBufferHeight,s.fov=W.toRadians(60)),r.frustum=s;let a=$xe(r);i9(e,a);let c;e._morphToOrthographic?c=function(){y8(e,t,r,a)}:c=function(){Qxe(e,t,r,function(){y8(e,t,r,a)})},t>0?(i._mode=oe.SCENE2D,o.flyTo({duration:t,destination:h.fromDegrees(0,0,5*n.maximumRadius,n,_8),complete:function(){i._mode=oe.MORPHING,c()}})):c()}function om(e,t,n,i){return h.lerp(e,t,n,i)}function Jxe(e,t,n,i,o){let r=e._scene,s=r.camera;if(s.frustum instanceof on)return;let a=s.frustum.fov,c=W.RADIANS_PER_DEGREE*.5,d=n.position.z*Math.tan(a*.5);s.frustum.far=d/Math.tan(c*.5)+1e7;function u(p){s.frustum.fov=W.lerp(a,c,p.time);let g=d/Math.tan(s.frustum.fov*.5);i(s,g)}let m=r.tweens.add({duration:t,easingFunction:Lr.QUARTIC_OUT,startObject:{time:0},stopObject:{time:1},update:u,complete:function(){s.frustum=n.frustum.clone(),o(e)}});e._currentTweens.push(m)}var xft=new h,_ft=new h,Tft=new h,g8=new h,Sft=new h,Cft=new h,Vft=new Zr,Lft=new pn,Rft=new h,Zft={position:void 0,direction:void 0,up:void 0,frustum:void 0};function Gft(e,t){t*=.5;let n=e._scene,i=n.camera,o=h.clone(i.position,xft),r=h.clone(i.direction,_ft),s=h.clone(i.up,Tft),a=h.negate(h.UNIT_Z,Sft),c=h.clone(h.UNIT_Y,Cft),d=g8;if(t>0)h.clone(h.ZERO,g8),d.z=5*n.mapProjection.ellipsoid.maximumRadius;else{h.clone(o,g8);let _=Lft;M.multiplyByPoint(ao.TRANSFORM_2D,o,_.origin),M.multiplyByPointAsVector(ao.TRANSFORM_2D,r,_.direction);let C=n.globe;if(l(C)){let V=C.pickWorldCoordinates(_,n,!0,Rft);l(V)&&(M.multiplyByPoint(ao.TRANSFORM_2D_INVERSE,V,d),d.z+=h.distance(o,d))}}let u=Vft;u.right=d.z*.5,u.left=-u.right,u.top=u.right*(n.drawingBufferHeight/n.drawingBufferWidth),u.bottom=-u.top;let m=Zft;m.position=d,m.direction=a,m.up=c,m.frustum=u;let p=e_e(m);i9(e,p);function g(_){om(o,d,_.time,i.position),om(r,a,_.time,i.direction),om(s,c,_.time,i.up),h.cross(i.direction,i.up,i.right),h.normalize(i.right,i.right),i._adjustOrthographicFrustum(!0)}function f(_,C){_.position.z=C}let x=n.tweens.add({duration:t,easingFunction:Lr.QUARTIC_OUT,startObject:{time:0},stopObject:{time:1},update:g,complete:function(){Jxe(e,t,m,f,p)}});e._currentTweens.push(x)}var Uxe=new he,Eft={position:new h,direction:new h,up:new h,position2D:new h,direction2D:new h,up2D:new h,frustum:new Zr},Xft={position:new h,direction:new h,up:new h,frustum:void 0},Ift=new h,Wft=new pn,Pft=new M,vft=new h;function wft(e,t,n){t*=.5;let i=e._scene,o=i.camera,r=Eft;if(t>0)h.clone(h.ZERO,r.position),r.position.z=5*n.maximumRadius,h.negate(h.UNIT_Z,r.direction),h.clone(h.UNIT_Y,r.up);else{n.cartesianToCartographic(o.positionWC,Uxe),i.mapProjection.project(Uxe,r.position),h.negate(h.UNIT_Z,r.direction),h.clone(h.UNIT_Y,r.up);let m=Wft;h.clone(r.position2D,m.origin);let p=h.clone(o.directionWC,m.direction),g=n.scaleToGeodeticSurface(o.positionWC,vft),f=Gt.eastNorthUpToFixedFrame(g,n,Pft);M.inverseTransformation(f,f),M.multiplyByPointAsVector(f,p,p),M.multiplyByPointAsVector(ao.TRANSFORM_2D,p,p);let x=i.globe;if(l(x)){let _=x.pickWorldCoordinates(m,i,!0,Ift);if(l(_)){let C=h.distance(r.position2D,_);_.x+=C,h.clone(_,r.position2D)}}}function s(m,p){m.position.x=p}M.multiplyByPoint(ao.TRANSFORM_2D,r.position,r.position2D),M.multiplyByPointAsVector(ao.TRANSFORM_2D,r.direction,r.direction2D),M.multiplyByPointAsVector(ao.TRANSFORM_2D,r.up,r.up2D);let a=r.frustum;a.right=r.position.z*.5,a.left=-a.right,a.top=a.right*(i.drawingBufferHeight/i.drawingBufferWidth),a.bottom=-a.top;let c=Xft;M.multiplyByPoint(ao.TRANSFORM_2D_INVERSE,r.position2D,c.position),h.clone(r.direction,c.direction),h.clone(r.up,c.up),c.frustum=a;let d=e_e(c);i9(e,d);function u(){Jxe(e,t,r,s,d)}jxe(e,t,r,u)}function Qxe(e,t,n,i){let o=e._scene,r=o.camera,s=r.frustum.right-r.frustum.left;r.frustum=n.frustum.clone();let a=r.frustum.fov,c=W.RADIANS_PER_DEGREE*.5,d=s*Math.tan(a*.5);r.frustum.far=d/Math.tan(c*.5)+1e7,r.frustum.fov=c;function u(p){r.frustum.fov=W.lerp(c,a,p.time),r.position.z=d/Math.tan(r.frustum.fov*.5)}let m=o.tweens.add({duration:t,easingFunction:Lr.QUARTIC_OUT,startObject:{time:0},stopObject:{time:1},update:u,complete:function(){i(e)}});e._currentTweens.push(m)}function Fft(e,t,n,i){t*=.5;let o=e._scene,r=o.camera,s=h.clone(n.position,_8),a=h.clone(n.direction,zxe),c=h.clone(n.up,Kxe);o._mode=oe.MORPHING;function d(){r.frustum=n.frustum.clone();let u=h.clone(r.position,Yxe),m=h.clone(r.direction,Oxe),p=h.clone(r.up,Hxe);u.z=s.z;function g(x){om(u,s,x.time,r.position),om(m,a,x.time,r.direction),om(p,c,x.time,r.up),h.cross(r.direction,r.up,r.right),h.normalize(r.right,r.right)}let f=o.tweens.add({duration:t,easingFunction:Lr.QUARTIC_OUT,startObject:{time:0},stopObject:{time:1},update:g,complete:function(){i(e)}});e._currentTweens.push(f)}e._morphToOrthographic?d():Qxe(e,0,n,d)}function jxe(e,t,n,i){let o=e._scene,r=o.camera,s=h.clone(r.position,Yxe),a=h.clone(r.direction,Oxe),c=h.clone(r.up,Hxe),d=h.clone(n.position2D,_8),u=h.clone(n.direction2D,zxe),m=h.clone(n.up2D,Kxe);function p(f){om(s,d,f.time,r.position),om(a,u,f.time,r.direction),om(c,m,f.time,r.up),h.cross(r.direction,r.up,r.right),h.normalize(r.right,r.right),r._adjustOrthographicFrustum(!0)}let g=o.tweens.add({duration:t,easingFunction:Lr.QUARTIC_OUT,startObject:{time:0},stopObject:{time:1},update:p,complete:function(){qxe(e,o,1,0,t,i)}});e._currentTweens.push(g)}function qxe(e,t,n,i,o,r){let s={object:t,property:"morphTime",startValue:n,stopValue:i,duration:o,easingFunction:Lr.QUARTIC_OUT};l(r)&&(s.complete=function(){r(e)});let a=t.tweens.addProperty(s);e._currentTweens.push(a)}function $xe(e){return function(t){let n=t._scene;n._mode=oe.SCENE3D,n.morphTime=oe.getMorphTime(oe.SCENE3D),l3(t);let i=n.camera;(t._previousMode!==oe.MORPHING||t._morphCancelled)&&(t._morphCancelled=!1,h.clone(e.position,i.position),h.clone(e.direction,i.direction),h.clone(e.up,i.up),h.cross(i.direction,i.up,i.right),h.normalize(i.right,i.right),i.frustum=e.frustum.clone());let o=i.frustum;n.frameState.useLogDepth&&(o.near=.1,o.far=1e10);let r=l(t._completeMorph);t._completeMorph=void 0,n.camera.update(n.mode),t._scene.morphComplete.raiseEvent(t,t._previousMode,oe.SCENE3D,r)}}function e_e(e){return function(t){let n=t._scene;n._mode=oe.SCENE2D,n.morphTime=oe.getMorphTime(oe.SCENE2D),l3(t);let i=n.camera;h.clone(e.position,i.position),i.position.z=n.mapProjection.ellipsoid.maximumRadius*2,h.clone(e.direction,i.direction),h.clone(e.up,i.up),h.cross(i.direction,i.up,i.right),h.normalize(i.right,i.right),i.frustum=e.frustum.clone();let o=l(t._completeMorph);t._completeMorph=void 0,n.camera.update(n.mode),t._scene.morphComplete.raiseEvent(t,t._previousMode,oe.SCENE2D,o)}}function Aft(e){return function(t){let n=t._scene;n._mode=oe.COLUMBUS_VIEW,n.morphTime=oe.getMorphTime(oe.COLUMBUS_VIEW),l3(t);let i=n.camera;(t._previousModeMode!==oe.MORPHING||t._morphCancelled)&&(t._morphCancelled=!1,h.clone(e.position,i.position),h.clone(e.direction,i.direction),h.clone(e.up,i.up),h.cross(i.direction,i.up,i.right),h.normalize(i.right,i.right));let o=i.frustum;n.frameState.useLogDepth&&(o.near=.1,o.far=1e10);let r=l(t._completeMorph);t._completeMorph=void 0,n.camera.update(n.mode),t._scene.morphComplete.raiseEvent(t,t._previousMode,oe.COLUMBUS_VIEW,r)}}var o9=HT;var oUi=T(S(),1);var Tki=T(S(),1);var uki=T(S(),1),Mft={LEFT_DRAG:0,RIGHT_DRAG:1,MIDDLE_DRAG:2,WHEEL:3,PINCH:4},Ei=Object.freeze(Mft);function Lc(e,t){let n=e;return l(t)&&(n+=`+${t}`),n}function Nft(e,t){D.clone(e.distance.startPosition,t.distance.startPosition),D.clone(e.distance.endPosition,t.distance.endPosition),D.clone(e.angleAndHeight.startPosition,t.angleAndHeight.startPosition),D.clone(e.angleAndHeight.endPosition,t.angleAndHeight.endPosition)}function t_e(e,t,n){let i=Lc(Ei.PINCH,t),o=e._update,r=e._isDown,s=e._eventStartPosition,a=e._pressTime,c=e._releaseTime;o[i]=!0,r[i]=!1,s[i]=new D;let d=e._movement[i];l(d)||(d=e._movement[i]={}),d.distance={startPosition:new D,endPosition:new D},d.angleAndHeight={startPosition:new D,endPosition:new D},d.prevAngle=0,e._eventHandler.setInputAction(function(u){e._buttonsDown++,r[i]=!0,a[i]=new Date,D.lerp(u.position1,u.position2,.5,s[i])},yn.PINCH_START,t),e._eventHandler.setInputAction(function(){e._buttonsDown=Math.max(e._buttonsDown-1,0),r[i]=!1,c[i]=new Date},yn.PINCH_END,t),e._eventHandler.setInputAction(function(u){if(r[i]){o[i]?(Nft(u,d),o[i]=!1,d.prevAngle=d.angleAndHeight.startPosition.x):(D.clone(u.distance.endPosition,d.distance.endPosition),D.clone(u.angleAndHeight.endPosition,d.angleAndHeight.endPosition));let m=d.angleAndHeight.endPosition.x,p=d.prevAngle,g=Math.PI*2;for(;m>=p+Math.PI;)m-=g;for(;m<p-Math.PI;)m+=g;d.angleAndHeight.endPosition.x=-m*n.clientWidth/12,d.angleAndHeight.startPosition.x=-p*n.clientWidth/12}},yn.PINCH_MOVE,t)}function n_e(e,t){let n=Lc(Ei.WHEEL,t),i=e._pressTime,o=e._releaseTime,r=e._update;r[n]=!0;let s=e._movement[n];l(s)||(s=e._movement[n]={});let a=e._lastMovement[n];l(a)||(a=e._lastMovement[n]={startPosition:new D,endPosition:new D,valid:!1}),s.startPosition=new D,D.clone(D.ZERO,s.startPosition),s.endPosition=new D,e._eventHandler.setInputAction(function(c){let d=7.5*W.toRadians(c);i[n]=o[n]=new Date,s.endPosition.x=0,s.endPosition.y=d,D.clone(s.endPosition,a.endPosition),a.valid=!0,r[n]=!1},yn.WHEEL,t)}function iL(e,t,n){let i=Lc(n,t),o=e._isDown,r=e._eventStartPosition,s=e._pressTime,a=e._releaseTime;o[i]=!1,r[i]=new D;let c=e._lastMovement[i];l(c)||(c=e._lastMovement[i]={startPosition:new D,endPosition:new D,valid:!1});let d,u;n===Ei.LEFT_DRAG?(d=yn.LEFT_DOWN,u=yn.LEFT_UP):n===Ei.RIGHT_DRAG?(d=yn.RIGHT_DOWN,u=yn.RIGHT_UP):n===Ei.MIDDLE_DRAG&&(d=yn.MIDDLE_DOWN,u=yn.MIDDLE_UP),e._eventHandler.setInputAction(function(m){e._buttonsDown++,c.valid=!1,o[i]=!0,s[i]=new Date,D.clone(m.position,r[i])},d,t),e._eventHandler.setInputAction(function(){e._buttonsDown=Math.max(e._buttonsDown-1,0),o[i]=!1,a[i]=new Date},u,t)}function i_e(e,t){D.clone(e.startPosition,t.startPosition),D.clone(e.endPosition,t.endPosition)}function o_e(e,t){let n=e._update,i=e._movement,o=e._lastMovement,r=e._isDown;for(let s in Ei)if(Ei.hasOwnProperty(s)){let a=Ei[s];if(l(a)){let c=Lc(a,t);n[c]=!0,l(e._lastMovement[c])||(e._lastMovement[c]={startPosition:new D,endPosition:new D,valid:!1}),l(e._movement[c])||(e._movement[c]={startPosition:new D,endPosition:new D})}}e._eventHandler.setInputAction(function(s){for(let a in Ei)if(Ei.hasOwnProperty(a)){let c=Ei[a];if(l(c)){let d=Lc(c,t);r[d]&&(n[d]?(i_e(i[d],o[d]),o[d].valid=!0,i_e(s,i[d]),n[d]=!1):D.clone(s.endPosition,i[d].endPosition))}}D.clone(s.endPosition,e._currentMousePosition)},yn.MOUSE_MOVE,t)}function rm(e){this._eventHandler=new fd(e),this._update={},this._movement={},this._lastMovement={},this._isDown={},this._eventStartPosition={},this._pressTime={},this._releaseTime={},this._buttonsDown=0,this._currentMousePosition=new D,n_e(this,void 0),t_e(this,void 0,e),iL(this,void 0,Ei.LEFT_DRAG),iL(this,void 0,Ei.RIGHT_DRAG),iL(this,void 0,Ei.MIDDLE_DRAG),o_e(this,void 0);for(let t in qs)if(qs.hasOwnProperty(t)){let n=qs[t];l(n)&&(n_e(this,n),t_e(this,n,e),iL(this,n,Ei.LEFT_DRAG),iL(this,n,Ei.RIGHT_DRAG),iL(this,n,Ei.MIDDLE_DRAG),o_e(this,n))}}Object.defineProperties(rm.prototype,{currentMousePosition:{get:function(){return this._currentMousePosition}},anyButtonDown:{get:function(){let e=!this._update[Lc(Ei.WHEEL)]||!this._update[Lc(Ei.WHEEL,qs.SHIFT)]||!this._update[Lc(Ei.WHEEL,qs.CTRL)]||!this._update[Lc(Ei.WHEEL,qs.ALT)];return this._buttonsDown>0||e}}});rm.prototype.isMoving=function(e,t){let n=Lc(e,t);return!this._update[n]};rm.prototype.getMovement=function(e,t){let n=Lc(e,t);return this._movement[n]};rm.prototype.getLastMovement=function(e,t){let n=Lc(e,t),i=this._lastMovement[n];if(i.valid)return i};rm.prototype.isButtonDown=function(e,t){let n=Lc(e,t);return this._isDown[n]};rm.prototype.getStartMousePosition=function(e,t){if(e===Ei.WHEEL)return this._currentMousePosition;let n=Lc(e,t);return this._eventStartPosition[n]};rm.prototype.getButtonPressTime=function(e,t){let n=Lc(e,t);return this._pressTime[n]};rm.prototype.getButtonReleaseTime=function(e,t){let n=Lc(e,t);return this._releaseTime[n]};rm.prototype.reset=function(){for(let e in this._update)this._update.hasOwnProperty(e)&&(this._update[e]=!0)};rm.prototype.isDestroyed=function(){return!1};rm.prototype.destroy=function(){return this._eventHandler=this._eventHandler&&this._eventHandler.destroy(),me(this)};var r9=rm;var Xki=T(S(),1);function d3(e,t,n,i,o,r,s,a,c,d){this._tweens=e,this._tweenjs=t,this._startObject=Oe(n),this._stopObject=Oe(i),this._duration=o,this._delay=r,this._easingFunction=s,this._update=a,this._complete=c,this.cancel=d,this.needsStart=!0}Object.defineProperties(d3.prototype,{startObject:{get:function(){return this._startObject}},stopObject:{get:function(){return this._stopObject}},duration:{get:function(){return this._duration}},delay:{get:function(){return this._delay}},easingFunction:{get:function(){return this._easingFunction}},update:{get:function(){return this._update}},complete:{get:function(){return this._complete}},tweenjs:{get:function(){return this._tweenjs}}});d3.prototype.cancelTween=function(){this._tweens.remove(this)};function Gh(){this._tweens=[]}Object.defineProperties(Gh.prototype,{length:{get:function(){return this._tweens.length}}});Gh.prototype.add=function(e){if(e=y(e,y.EMPTY_OBJECT),e.duration===0)return l(e.complete)&&e.complete(),new d3(this);let t=e.duration/zn.SECONDS_PER_MILLISECOND,n=y(e.delay,0),i=n/zn.SECONDS_PER_MILLISECOND,o=y(e.easingFunction,Lr.LINEAR_NONE),r=e.startObject,s=new Pne(r);s.to(Oe(e.stopObject),t),s.delay(i),s.easing(o),l(e.update)&&s.onUpdate(function(){e.update(r)}),s.onComplete(y(e.complete,null)),s.repeat(y(e._repeat,0));let a=new d3(this,s,e.startObject,e.stopObject,e.duration,n,o,e.update,e.complete,e.cancel);return this._tweens.push(a),a};Gh.prototype.addProperty=function(e){e=y(e,y.EMPTY_OBJECT);let t=e.object,n=e.property,i=e.startValue,o=e.stopValue;function r(s){t[n]=s.value}return this.add({startObject:{value:i},stopObject:{value:o},duration:y(e.duration,3),delay:e.delay,easingFunction:e.easingFunction,update:r,complete:e.complete,cancel:e.cancel,_repeat:e._repeat})};Gh.prototype.addAlpha=function(e){e=y(e,y.EMPTY_OBJECT);let t=e.material,n=[];for(let o in t.uniforms)t.uniforms.hasOwnProperty(o)&&l(t.uniforms[o])&&l(t.uniforms[o].alpha)&&n.push(o);function i(o){let r=n.length;for(let s=0;s<r;++s)t.uniforms[n[s]].alpha=o.alpha}return this.add({startObject:{alpha:y(e.startValue,0)},stopObject:{alpha:y(e.stopValue,1)},duration:y(e.duration,3),delay:e.delay,easingFunction:e.easingFunction,update:i,complete:e.complete,cancel:e.cancel})};Gh.prototype.addOffsetIncrement=function(e){e=y(e,y.EMPTY_OBJECT);let n=e.material.uniforms;return this.addProperty({object:n,property:"offset",startValue:n.offset,stopValue:n.offset+1,duration:e.duration,delay:e.delay,easingFunction:e.easingFunction,update:e.update,cancel:e.cancel,_repeat:1/0})};Gh.prototype.remove=function(e){if(!l(e))return!1;let t=this._tweens.indexOf(e);return t!==-1?(e.tweenjs.stop(),l(e.cancel)&&e.cancel(),this._tweens.splice(t,1),!0):!1};Gh.prototype.removeAll=function(){let e=this._tweens;for(let t=0;t<e.length;++t){let n=e[t];n.tweenjs.stop(),l(n.cancel)&&n.cancel()}e.length=0};Gh.prototype.contains=function(e){return l(e)&&this._tweens.indexOf(e)!==-1};Gh.prototype.get=function(e){return this._tweens[e]};Gh.prototype.update=function(e){let t=this._tweens,n=0;for(e=l(e)?e/zn.SECONDS_PER_MILLISECOND:fi();n<t.length;){let i=t[n],o=i.tweenjs;i.needsStart?(i.needsStart=!1,o.start(e)):o.update(e)?n++:(o.stop(),t.splice(n,1))}};var zT=Gh;function a9(e){this.enableInputs=!0,this.enableTranslate=!0,this.enableZoom=!0,this.enableRotate=!0,this.enableTilt=!0,this.enableLook=!0,this.inertiaSpin=.9,this.inertiaTranslate=.9,this.inertiaZoom=.8,this.maximumMovementRatio=.1,this.bounceAnimationTime=3,this.minimumZoomDistance=1,this.maximumZoomDistance=Number.POSITIVE_INFINITY,this.translateEventTypes=Ei.LEFT_DRAG,this.zoomEventTypes=[Ei.RIGHT_DRAG,Ei.WHEEL,Ei.PINCH],this.rotateEventTypes=Ei.LEFT_DRAG,this.tiltEventTypes=[Ei.MIDDLE_DRAG,Ei.PINCH,{eventType:Ei.LEFT_DRAG,modifier:qs.CTRL},{eventType:Ei.RIGHT_DRAG,modifier:qs.CTRL}],this.lookEventTypes={eventType:Ei.LEFT_DRAG,modifier:qs.SHIFT},this.minimumPickingTerrainHeight=15e4,this._minimumPickingTerrainHeight=this.minimumPickingTerrainHeight,this.minimumPickingTerrainDistanceWithInertia=4e3,this.minimumCollisionTerrainHeight=15e3,this._minimumCollisionTerrainHeight=this.minimumCollisionTerrainHeight,this.minimumTrackBallHeight=75e5,this._minimumTrackBallHeight=this.minimumTrackBallHeight,this.enableCollisionDetection=!0,this._scene=e,this._globe=void 0,this._ellipsoid=void 0,this._lastGlobeHeight=0,this._aggregator=new r9(e.canvas),this._lastInertiaSpinMovement=void 0,this._lastInertiaZoomMovement=void 0,this._lastInertiaTranslateMovement=void 0,this._lastInertiaTiltMovement=void 0,this._inertiaDisablers={_lastInertiaZoomMovement:["_lastInertiaSpinMovement","_lastInertiaTranslateMovement","_lastInertiaTiltMovement"],_lastInertiaTiltMovement:["_lastInertiaSpinMovement","_lastInertiaTranslateMovement"]},this._tweens=new zT,this._tween=void 0,this._horizontalRotationAxis=void 0,this._tiltCenterMousePosition=new D(-1,-1),this._tiltCenter=new h,this._rotateMousePosition=new D(-1,-1),this._rotateStartPosition=new h,this._strafeStartPosition=new h,this._strafeMousePosition=new D,this._strafeEndMousePosition=new D,this._zoomMouseStart=new D(-1,-1),this._zoomWorldPosition=new h,this._useZoomWorldPosition=!1,this._panLastMousePosition=new D,this._panLastWorldPosition=new h,this._tiltCVOffMap=!1,this._looking=!1,this._rotating=!1,this._strafing=!1,this._zoomingOnVector=!1,this._zoomingUnderground=!1,this._rotatingZoom=!1,this._adjustedHeightForTerrain=!1,this._cameraUnderground=!1;let t=e.mapProjection;this._maxCoord=t.project(new he(Math.PI,W.PI_OVER_TWO)),this._zoomFactor=5,this._rotateFactor=void 0,this._rotateRateRangeAdjustment=void 0,this._maximumRotateRate=1.77,this._minimumRotateRate=1/5e3,this._minimumZoomRate=20,this._maximumZoomRate=5906376272e3,this._minimumUndergroundPickDistance=2e3,this._maximumUndergroundPickDistance=1e4}function kft(e,t){if(e<0)return 0;let n=(1-t)*25;return Math.exp(-n*e)}function Uft(e){return D.equalsEpsilon(e.startPosition,e.endPosition,W.EPSILON14)}var Dft=.4;function Bft(e,t,n,i,o,r,s){let a=r[s];l(a)||(a=r[s]={startPosition:new D,endPosition:new D,motion:new D,inertiaEnabled:!0});let c=e.getButtonPressTime(t,n),d=e.getButtonReleaseTime(t,n),u=c&&d&&(d.getTime()-c.getTime())/1e3,p=d&&(new Date().getTime()-d.getTime())/1e3;if(c&&d&&u<Dft){let g=kft(p,i),f=e.getLastMovement(t,n);if(!l(f)||Uft(f)||!a.inertiaEnabled||(a.motion.x=(f.endPosition.x-f.startPosition.x)*.5,a.motion.y=(f.endPosition.y-f.startPosition.y)*.5,a.startPosition=D.clone(f.startPosition,a.startPosition),a.endPosition=D.multiplyByScalar(a.motion,g,a.endPosition),a.endPosition=D.add(a.startPosition,a.endPosition,a.endPosition),isNaN(a.endPosition.x)||isNaN(a.endPosition.y)||D.distance(a.startPosition,a.endPosition)<.5))return;if(!e.isButtonDown(t,n)){let x=e.getStartMousePosition(t,n);o(r,x,a)}}}function Yft(e,t){if(l(t)){let n=e[t];l(n)&&(n.inertiaEnabled=!0);let i=e._inertiaDisablers[t];if(l(i)){let o=i.length;for(let r=0;r<o;++r)n=e[i[r]],l(n)&&(n.inertiaEnabled=!1)}}}var r_e=[];function ll(e,t,n,i,o,r){if(!l(n))return;let s=e._aggregator;Array.isArray(n)||(r_e[0]=n,n=r_e);let a=n.length;for(let c=0;c<a;++c){let d=n[c],u=l(d.eventType)?d.eventType:d,m=d.modifier,p=s.isMoving(u,m)&&s.getMovement(u,m),g=s.getStartMousePosition(u,m);e.enableInputs&&t&&(p?(i(e,g,p),Yft(e,r)):o<1&&Bft(s,u,m,o,i,e,r))}}var u3=new pn,Oft=new h,Hft=new D,zft=new h,Kft=new D,Jft=new h,Qft=new h,jft=new h,qft=new h,g_e=new h,$ft=new h,ept=new h,tpt=new h,npt=new h,ipt=new h,opt=new h,rpt=new h,spt=new h,apt=new h,cpt=new h,KT=new h,s_e=new h,a_e=new h,T8={orientation:new za};function E8(e,t,n,i,o,r){let s=1;l(r)&&(s=W.clamp(Math.abs(r),.25,1));let a=n.endPosition.y-n.startPosition.y,d=a>0?e.minimumZoomDistance*s:0,u=e.maximumZoomDistance,m=o-d,p=i*m;p=W.clamp(p,e._minimumZoomRate,e._maximumZoomRate);let g=a/e._scene.canvas.clientHeight;g=Math.min(g,e.maximumMovementRatio);let f=p*g;if(e.enableCollisionDetection||e.minimumZoomDistance===0||!l(e._globe)){if(f>0&&Math.abs(o-d)<1||f<0&&Math.abs(o-u)<1)return;o-f<d?f=o-d-1:o-f>u&&(f=o-u)}let x=e._scene,_=x.camera,C=x.mode,V=T8.orientation;if(V.heading=_.heading,V.pitch=_.pitch,V.roll=_.roll,_.frustum instanceof on){Math.abs(f)>0&&(_.zoomIn(f),_._adjustOrthographicFrustum(!0));return}let L=y(n.inertiaEnabled,D.equals(t,e._zoomMouseStart)),Z=e._zoomingOnVector,G=e._rotatingZoom,X;if(L||(e._zoomMouseStart=D.clone(t,e._zoomMouseStart),l(e._globe)&&C===oe.SCENE2D?(X=_.getPickRay(t,u3).origin,X=h.fromElements(X.y,X.z,X.x)):l(e._globe)&&(X=ab(e,t,Oft)),l(X)?(e._useZoomWorldPosition=!0,e._zoomWorldPosition=h.clone(X,e._zoomWorldPosition)):e._useZoomWorldPosition=!1,Z=e._zoomingOnVector=!1,G=e._rotatingZoom=!1,e._zoomingUnderground=e._cameraUnderground),!e._useZoomWorldPosition){_.zoomIn(f);return}let v=C===oe.COLUMBUS_VIEW;if(_.positionCartographic.height<2e6&&(G=!0),!L||G){if(C===oe.SCENE2D){let P=e._zoomWorldPosition,F=_.position;if(!h.equals(P,F)&&_.positionCartographic.height<e._maxCoord.x*2){let A=_.position.x,b=h.subtract(P,F,zft);h.normalize(b,b);let R=h.distance(P,F)*f/(_.getMagnitude()*.5);_.move(b,R*.5),(_.position.x<0&&A>0||_.position.x>0&&A<0)&&(X=_.getPickRay(t,u3).origin,X=h.fromElements(X.y,X.z,X.x),e._zoomWorldPosition=h.clone(X,e._zoomWorldPosition))}}else if(C===oe.SCENE3D){let P=h.normalize(_.position,g_e);if(e._cameraUnderground||e._zoomingUnderground||_.positionCartographic.height<3e3&&Math.abs(h.dot(_.direction,P))<.6)v=!0;else{let F=x.canvas,A=Kft;A.x=F.clientWidth/2,A.y=F.clientHeight/2;let b=ab(e,A,Jft);if(!l(b))v=!0;else if(_.positionCartographic.height<1e6)if(h.dot(_.direction,P)>=-.5)v=!0;else{let R=ept;h.clone(_.position,R);let E=e._zoomWorldPosition,I=$ft;if(I=h.normalize(E,I),h.dot(I,P)<0)return;let w=cpt,N=ipt;h.clone(_.direction,N),h.add(R,h.multiplyByScalar(N,1e3,KT),w);let B=opt,U=rpt;h.subtract(E,R,B),h.normalize(B,U);let O=h.dot(P,U);if(O>=0){e._zoomMouseStart.x=-1;return}let k=Math.acos(-O),J=h.magnitude(R),H=h.magnitude(E),ee=J-f,z=h.magnitude(B),j=Math.asin(W.clamp(z/H*Math.sin(k),-1,1)),q=Math.asin(W.clamp(ee/H*Math.sin(k),-1,1)),be=j-q+k,Te=tpt;h.normalize(R,Te);let ae=npt;ae=h.cross(U,Te,ae),ae=h.normalize(ae,ae),h.normalize(h.cross(Te,ae,KT),N),h.multiplyByScalar(h.normalize(w,KT),h.magnitude(w)-f,w),h.normalize(R,R),h.multiplyByScalar(R,ee,R);let ye=spt;h.multiplyByScalar(h.add(h.multiplyByScalar(Te,Math.cos(be)-1,s_e),h.multiplyByScalar(N,Math.sin(be),a_e),KT),ee,ye),h.add(R,ye,R),h.normalize(w,Te),h.normalize(h.cross(Te,ae,KT),N);let Se=apt;h.multiplyByScalar(h.add(h.multiplyByScalar(Te,Math.cos(be)-1,s_e),h.multiplyByScalar(N,Math.sin(be),a_e),KT),h.magnitude(w),Se),h.add(w,Se,w),h.clone(R,_.position),h.normalize(h.subtract(w,R,KT),_.direction),h.clone(_.direction,_.direction),h.cross(_.direction,_.up,_.right),h.cross(_.right,_.direction,_.up),_.setView(T8);return}else{let R=h.normalize(b,Qft),E=h.normalize(e._zoomWorldPosition,jft),I=h.dot(E,R);if(I>0&&I<1){let w=W.acosClamped(I),N=h.cross(E,R,qft),B=Math.abs(w)>W.toRadians(20)?_.positionCartographic.height*.75:_.positionCartographic.height-f,U=f/B;_.rotate(N,w*U)}}}}e._rotatingZoom=!v}if(!L&&v||Z){let P,F=ki.wgs84ToWindowCoordinates(x,e._zoomWorldPosition,Hft);C!==oe.COLUMBUS_VIEW&&D.equals(t,e._zoomMouseStart)&&l(F)?P=_.getPickRay(F,u3):P=_.getPickRay(t,u3);let A=P.direction;(C===oe.COLUMBUS_VIEW||C===oe.SCENE2D)&&h.fromElements(A.y,A.z,A.x,A),_.move(A,f),e._zoomingOnVector=!0}else _.zoomIn(f);e._cameraUnderground||_.setView(T8)}var lpt=new pn,dpt=new pn,upt=new h;function mpt(e,t,n){let o=e._scene.camera,r=o.getPickRay(n.startPosition,lpt).origin,s=o.getPickRay(n.endPosition,dpt).origin;r=h.fromElements(r.y,r.z,r.x,r),s=h.fromElements(s.y,s.z,s.x,s);let a=h.subtract(r,s,upt),c=h.magnitude(a);c>0&&(h.normalize(a,a),o.move(a,c))}function c_e(e,t,n){l(n.distance)&&(n=n.distance);let o=e._scene.camera;E8(e,t,n,e._zoomFactor,o.getMagnitude())}var hpt=new D,fpt=new D;function l_e(e,t,n){if(l(n.angleAndHeight)){ppt(e,t,n.angleAndHeight);return}let i=e._scene,o=i.camera,r=i.canvas,s=r.clientWidth,a=r.clientHeight,c=hpt;c.x=2/s*n.startPosition.x-1,c.y=2/a*(a-n.startPosition.y)-1,c=D.normalize(c,c);let d=fpt;d.x=2/s*n.endPosition.x-1,d.y=2/a*(a-n.endPosition.y)-1,d=D.normalize(d,d);let u=W.acosClamped(c.x);c.y<0&&(u=W.TWO_PI-u);let m=W.acosClamped(d.x);d.y<0&&(m=W.TWO_PI-m);let p=m-u;o.twistRight(p)}function ppt(e,t,n){let i=e._rotateFactor*e._rotateRateRangeAdjustment;i>e._maximumRotateRate&&(i=e._maximumRotateRate),i<e._minimumRotateRate&&(i=e._minimumRotateRate);let o=e._scene,r=o.camera,s=o.canvas,a=(n.endPosition.x-n.startPosition.x)/s.clientWidth;a=Math.min(a,e.maximumMovementRatio);let c=i*a*Math.PI*4;r.twistRight(c)}function bpt(e){let t=e._scene.mapMode2D===Ql.ROTATE;M.equals(M.IDENTITY,e._scene.camera.transform)?(ll(e,e.enableTranslate,e.translateEventTypes,mpt,e.inertiaTranslate,"_lastInertiaTranslateMovement"),ll(e,e.enableZoom,e.zoomEventTypes,c_e,e.inertiaZoom,"_lastInertiaZoomMovement"),t&&ll(e,e.enableRotate,e.tiltEventTypes,l_e,e.inertiaSpin,"_lastInertiaTiltMovement")):(ll(e,e.enableZoom,e.zoomEventTypes,c_e,e.inertiaZoom,"_lastInertiaZoomMovement"),t&&ll(e,e.enableRotate,e.translateEventTypes,l_e,e.inertiaSpin,"_lastInertiaSpinMovement"))}var y_e=new pn,gpt=new h,ypt=new h;function ab(e,t,n){let i=e._scene,o=e._globe,r=i.camera,s;if(i.pickPositionSupported&&(s=i.pickPositionWorldCoordinates(t,gpt)),!l(o))return h.clone(s,n);let a=!e._cameraUnderground,c=r.getPickRay(t,y_e),d=o.pickWorldCoordinates(c,i,a,ypt),u=l(s)?h.distance(s,r.positionWC):Number.POSITIVE_INFINITY,m=l(d)?h.distance(d,r.positionWC):Number.POSITIVE_INFINITY;return u<m?h.clone(s,n):h.clone(d,n)}var xpt=new he;function y3(e){let t=e._ellipsoid,n=e._scene,i=n.camera,o=n.mode,r=0;if(o===oe.SCENE3D){let c=t.cartesianToCartographic(i.position,xpt);l(c)&&(r=c.height)}else r=i.position.z;let s=y(e._scene.globeHeight,0);return Math.abs(s-r)}var _pt=new h;function x_e(e,t){let n=t.origin,i=t.direction,o=y3(e),r=h.normalize(n,_pt),s=Math.abs(h.dot(r,i));return s=Math.max(s,.5)*2,o*s}function __e(e,t,n,i){let o=h.distance(t.origin,n),r=y3(e),s=W.clamp(r*5,e._minimumUndergroundPickDistance,e._maximumUndergroundPickDistance);return o>s&&(o=Math.min(o,r/5),o=Math.max(o,100)),pn.getPoint(t,o,i)}function T_e(e,t,n,i){let o;return l(n)?(o=h.distance(t.origin,n),o>e._maximumUndergroundPickDistance&&(o=y3(e))):o=y3(e),pn.getPoint(t,o,i)}var Tpt=new D;function S_e(e,t){let n=t.endPosition,i=D.subtract(t.endPosition,t.startPosition,Tpt),o=e._strafeEndMousePosition;D.add(o,i,o),t.endPosition=o,X8(e,t,e._strafeStartPosition),t.endPosition=n}var d_e=new pn,Spt=new pn,S8=new h,Cpt=new h,Vpt=new h,Lpt=new h,Rpt=new cn(h.UNIT_X,0),Zpt=new D,Gpt=new D;function Ept(e,t,n){if(h.equals(t,e._translateMousePosition)||(e._looking=!1),h.equals(t,e._strafeMousePosition)||(e._strafing=!1),e._looking){Qd(e,t,n);return}if(e._strafing){S_e(e,n);return}let o=e._scene.camera,r=e._cameraUnderground,s=D.clone(n.startPosition,Zpt),a=D.clone(n.endPosition,Gpt),c=o.getPickRay(s,d_e),d=h.clone(h.ZERO,Lpt),u=h.UNIT_X,m;if(o.position.z<e._minimumPickingTerrainHeight&&(m=ab(e,s,S8),l(m)&&(d.x=m.x)),r||d.x>o.position.z&&l(m)){let L=m;r&&(L=T_e(e,c,m,S8)),D.clone(t,e._strafeMousePosition),D.clone(t,e._strafeEndMousePosition),h.clone(L,e._strafeStartPosition),e._strafing=!0,X8(e,n,e._strafeStartPosition);return}let p=cn.fromPointNormal(d,u,Rpt);c=o.getPickRay(s,d_e);let g=jn.rayPlane(c,p,S8),f=o.getPickRay(a,Spt),x=jn.rayPlane(f,p,Cpt);if(!l(g)||!l(x)){e._looking=!0,Qd(e,t,n),D.clone(t,e._translateMousePosition);return}let _=h.subtract(g,x,Vpt),C=_.x;_.x=_.y,_.y=_.z,_.z=C;let V=h.magnitude(_);V>W.EPSILON6&&(h.normalize(_,_),o.move(_,V))}var C_e=new D,f3=new pn,p3=new h,Xpt=new h,V_e=new M,Ipt=new M,Wpt=new h,Ppt=new cn(h.UNIT_X,0),C8=new h,R8=new he,L_e=new M,vpt=new we,wpt=new $,b3=new h;function Fpt(e,t,n){if(l(n.angleAndHeight)&&(n=n.angleAndHeight),D.equals(t,e._tiltCenterMousePosition)||(e._tiltCVOffMap=!1,e._looking=!1),e._looking){Qd(e,t,n);return}let o=e._scene.camera;e._tiltCVOffMap||!e.onMap()||Math.abs(o.position.z)>e._minimumPickingTerrainHeight?(e._tiltCVOffMap=!0,Apt(e,t,n)):Mpt(e,t,n)}function Apt(e,t,n){let i=e._scene,o=i.camera,r=i.canvas,s=C_e;s.x=r.clientWidth/2,s.y=r.clientHeight/2;let a=o.getPickRay(s,f3),c=h.UNIT_X,d=a.origin,u=a.direction,m,p=h.dot(c,u);if(Math.abs(p)>W.EPSILON6&&(m=-h.dot(c,d)/p),!l(m)||m<=0){e._looking=!0,Qd(e,t,n),D.clone(t,e._tiltCenterMousePosition);return}let g=h.multiplyByScalar(u,m,p3);h.add(d,g,g);let f=i.mapProjection,x=f.ellipsoid;h.fromElements(g.y,g.z,g.x,g);let _=f.unproject(g,R8);x.cartographicToCartesian(_,g);let C=Gt.eastNorthUpToFixedFrame(g,x,V_e),V=e._globe,L=e._ellipsoid;e._globe=void 0,e._ellipsoid=ie.UNIT_SPHERE,e._rotateFactor=1,e._rotateRateRangeAdjustment=1;let Z=M.clone(o.transform,L_e);o._setTransform(C),Jd(e,t,n,h.UNIT_Z),o._setTransform(Z),e._globe=V,e._ellipsoid=L;let G=L.maximumRadius;e._rotateFactor=1/G,e._rotateRateRangeAdjustment=G}function Mpt(e,t,n){let i=e._scene,o=i.camera,r=e._cameraUnderground,s,a,c=h.UNIT_X;if(D.equals(t,e._tiltCenterMousePosition))s=h.clone(e._tiltCenter,p3);else{if(o.position.z<e._minimumPickingTerrainHeight&&(s=ab(e,t,p3)),!l(s)){a=o.getPickRay(t,f3);let b=a.origin,R=a.direction,E,I=h.dot(c,R);if(Math.abs(I)>W.EPSILON6&&(E=-h.dot(c,b)/I),!l(E)||E<=0){e._looking=!0,Qd(e,t,n),D.clone(t,e._tiltCenterMousePosition);return}s=h.multiplyByScalar(R,E,p3),h.add(b,s,s)}r&&(l(a)||(a=o.getPickRay(t,f3)),__e(e,a,s,s)),D.clone(t,e._tiltCenterMousePosition),h.clone(s,e._tiltCenter)}let d=i.canvas,u=C_e;u.x=d.clientWidth/2,u.y=e._tiltCenterMousePosition.y,a=o.getPickRay(u,f3);let m=h.clone(h.ZERO,Wpt);m.x=s.x;let p=cn.fromPointNormal(m,c,Ppt),g=jn.rayPlane(a,p,Xpt),f=o._projection,x=f.ellipsoid;h.fromElements(s.y,s.z,s.x,s);let _=f.unproject(s,R8);x.cartographicToCartesian(_,s);let C=Gt.eastNorthUpToFixedFrame(s,x,V_e),V;l(g)?(h.fromElements(g.y,g.z,g.x,g),_=f.unproject(g,R8),x.cartographicToCartesian(_,g),V=Gt.eastNorthUpToFixedFrame(g,x,Ipt)):V=C;let L=e._globe,Z=e._ellipsoid;e._globe=void 0,e._ellipsoid=ie.UNIT_SPHERE,e._rotateFactor=1,e._rotateRateRangeAdjustment=1;let G=h.UNIT_Z,X=M.clone(o.transform,L_e);o._setTransform(C);let v=h.cross(h.UNIT_Z,h.normalize(o.position,C8),C8),P=h.dot(o.right,v);if(Jd(e,t,n,G,!1,!0),o._setTransform(V),P<0){let b=n.startPosition.y-n.endPosition.y;(r&&b<0||!r&&b>0)&&(G=void 0);let R=o.constrainedAxis;o.constrainedAxis=void 0,Jd(e,t,n,G,!0,!1),o.constrainedAxis=R}else Jd(e,t,n,G,!0,!1);if(l(o.constrainedAxis)){let b=h.cross(o.direction,o.constrainedAxis,b3);h.equalsEpsilon(b,h.ZERO,W.EPSILON6)||(h.dot(b,o.right)<0&&h.negate(b,b),h.cross(b,o.direction,o.up),h.cross(o.direction,o.up,o.right),h.normalize(o.up,o.up),h.normalize(o.right,o.right))}o._setTransform(X),e._globe=L,e._ellipsoid=Z;let F=Z.maximumRadius;e._rotateFactor=1/F,e._rotateRateRangeAdjustment=F;let A=h.clone(o.positionWC,C8);if(e.enableCollisionDetection&&P8(e,!0),!h.equals(o.positionWC,A)){o._setTransform(V),o.worldToCameraCoordinatesPoint(A,A);let b=h.magnitudeSquared(A);h.magnitudeSquared(o.position)>b&&(h.normalize(o.position,o.position),h.multiplyByScalar(o.position,Math.sqrt(b),o.position));let R=h.angleBetween(A,o.position),E=h.cross(A,o.position,A);h.normalize(E,E);let I=we.fromAxisAngle(E,R,vpt),w=$.fromQuaternion(I,wpt);$.multiplyByVector(w,o.direction,o.direction),$.multiplyByVector(w,o.up,o.up),h.cross(o.direction,o.up,o.right),h.cross(o.right,o.direction,o.up),o._setTransform(X)}}var R_e=new D,Z_e=new pn,G_e=new h;function Npt(e,t,n){l(n.distance)&&(n=n.distance);let i=e._scene,o=i.camera,r=i.canvas,s=e._cameraUnderground,a;s?a=t:(a=R_e,a.x=r.clientWidth/2,a.y=r.clientHeight/2);let c=o.getPickRay(a,Z_e),d=c.origin,u=c.direction,m=o.position.z,p;m<e._minimumPickingTerrainHeight&&(p=ab(e,a,G_e));let g;if(l(p)&&(g=h.distance(d,p)),s){let f=x_e(e,c,m);l(g)?g=Math.min(g,f):g=f}if(!l(g)){let f=h.UNIT_X;g=-h.dot(f,d)/h.dot(f,u)}E8(e,t,n,e._zoomFactor,g)}function kpt(e){let n=e._scene.camera;if(!M.equals(M.IDENTITY,n.transform))ll(e,e.enableRotate,e.rotateEventTypes,Jd,e.inertiaSpin,"_lastInertiaSpinMovement"),ll(e,e.enableZoom,e.zoomEventTypes,X_e,e.inertiaZoom,"_lastInertiaZoomMovement");else{let i=e._tweens;if(e._aggregator.anyButtonDown&&i.removeAll(),ll(e,e.enableTilt,e.tiltEventTypes,Fpt,e.inertiaSpin,"_lastInertiaTiltMovement"),ll(e,e.enableTranslate,e.translateEventTypes,Ept,e.inertiaTranslate,"_lastInertiaTranslateMovement"),ll(e,e.enableZoom,e.zoomEventTypes,Npt,e.inertiaZoom,"_lastInertiaZoomMovement"),ll(e,e.enableLook,e.lookEventTypes,Qd),!e._aggregator.anyButtonDown&&!i.contains(e._tween)){let o=n.createCorrectPositionTween(e.bounceAnimationTime);l(o)&&(e._tween=i.add(o))}i.update()}}var Upt=new pn,Dpt=new cn(h.UNIT_X,0),Bpt=new h,Ypt=new h;function X8(e,t,n){let i=e._scene,o=i.camera,r=o.getPickRay(t.endPosition,Upt),s=h.clone(o.direction,Ypt);i.mode===oe.COLUMBUS_VIEW&&h.fromElements(s.z,s.x,s.y,s);let a=cn.fromPointNormal(n,s,Dpt),c=jn.rayPlane(r,a,Bpt);l(c)&&(s=h.subtract(n,c,s),i.mode===oe.COLUMBUS_VIEW&&h.fromElements(s.y,s.z,s.x,s),h.add(o.position,s,o.position))}var u_e=new h,E_e=new he,Z8=new h,G8=new ie,Opt=new h,Hpt=new h,zpt=new h;function Kpt(e,t,n){let o=e._scene.camera,r=e._cameraUnderground,s=e._ellipsoid;if(!M.equals(o.transform,M.IDENTITY)){Jd(e,t,n);return}let a,c,d=s.geodeticSurfaceNormal(o.position,Opt);if(D.equals(t,e._rotateMousePosition)){if(e._looking)Qd(e,t,n,d);else if(e._rotating)Jd(e,t,n);else if(e._strafing)S_e(e,n);else{if(h.magnitude(o.position)<h.magnitude(e._rotateStartPosition))return;a=h.magnitude(e._rotateStartPosition),c=Z8,c.x=c.y=c.z=a,s=ie.fromCartesian3(c,G8),L8(e,t,n,s)}return}e._looking=!1,e._rotating=!1,e._strafing=!1;let u=s.cartesianToCartographic(o.positionWC,E_e).height,m=e._globe;if(l(m)&&u<e._minimumPickingTerrainHeight){let p=ab(e,n.startPosition,zpt);if(l(p)){let g=!1,f=o.getPickRay(n.startPosition,y_e);if(r)g=!0,T_e(e,f,p,p);else{let x=s.geodeticSurfaceNormal(p,Hpt);Math.abs(h.dot(f.direction,x))<.05?g=!0:g=h.magnitude(o.position)<h.magnitude(p)}g?(D.clone(t,e._strafeEndMousePosition),h.clone(p,e._strafeStartPosition),e._strafing=!0,X8(e,n,e._strafeStartPosition)):(a=h.magnitude(p),c=Z8,c.x=c.y=c.z=a,s=ie.fromCartesian3(c,G8),L8(e,t,n,s),h.clone(p,e._rotateStartPosition))}else e._looking=!0,Qd(e,t,n,d)}else l(o.pickEllipsoid(n.startPosition,e._ellipsoid,u_e))?(L8(e,t,n,e._ellipsoid),h.clone(u_e,e._rotateStartPosition)):u>e._minimumTrackBallHeight?(e._rotating=!0,Jd(e,t,n)):(e._looking=!0,Qd(e,t,n,d));D.clone(t,e._rotateMousePosition)}function Jd(e,t,n,i,o,r){o=y(o,!1),r=y(r,!1);let s=e._scene,a=s.camera,c=s.canvas,d=a.constrainedAxis;l(i)&&(a.constrainedAxis=i);let u=h.magnitude(a.position),m=e._rotateFactor*(u-e._rotateRateRangeAdjustment);m>e._maximumRotateRate&&(m=e._maximumRotateRate),m<e._minimumRotateRate&&(m=e._minimumRotateRate);let p=(n.startPosition.x-n.endPosition.x)/c.clientWidth,g=(n.startPosition.y-n.endPosition.y)/c.clientHeight;p=Math.min(p,e.maximumMovementRatio),g=Math.min(g,e.maximumMovementRatio);let f=m*p*Math.PI*2,x=m*g*Math.PI;o||a.rotateRight(f),r||a.rotateUp(x),a.constrainedAxis=d}var V8=se.clone(se.UNIT_W),m_e=se.clone(se.UNIT_W),m3=new h,oL=new h,h3=new h,h_e=new h,Jpt=new D,Qpt=new D,jpt=new D,qpt=new D,$pt=new pn;function L8(e,t,n,i){let o=e._scene,r=o.camera,s=D.clone(n.startPosition,Jpt),a=D.clone(n.endPosition,Qpt),c=i.cartesianToCartographic(r.positionWC,E_e).height,d,u;if(!n.inertiaEnabled&&c<e._minimumPickingTerrainHeight&&(d=h.clone(e._panLastWorldPosition,V8),!l(e._globe)&&!D.equalsEpsilon(s,e._panLastMousePosition)&&(d=ab(e,s,V8)),!l(e._globe)&&l(d))){let m=h.subtract(d,r.positionWC,oL),p=h.multiplyByScalar(r.directionWC,h.dot(r.directionWC,m),oL),g=h.magnitude(p),f=r.frustum.getPixelDimensions(o.drawingBufferWidth,o.drawingBufferHeight,g,o.pixelRatio,qpt),x=D.subtract(a,s,jpt),_=h.multiplyByScalar(r.rightWC,x.x*f.x,oL),C=h.normalize(r.positionWC,g_e),V=r.getPickRay(a,$pt).direction,L=h.subtract(V,h.projectVector(V,r.rightWC,h3),h3),Z=h.angleBetween(L,r.directionWC),G=1;l(r.frustum.fov)&&(G=Math.max(Math.tan(Z),.1));let X=Math.abs(h.dot(r.directionWC,C)),v=-x.y*f.y*2/Math.sqrt(G)*(1-X),P=h.multiplyByScalar(V,v,h3);X=Math.abs(h.dot(r.upWC,C));let F=h.multiplyByScalar(r.upWC,-x.y*(1-X)*f.y,h_e);u=h.add(d,_,m_e),u=h.add(u,P,u),u=h.add(u,F,u),h.clone(u,e._panLastWorldPosition),D.clone(a,e._panLastMousePosition)}if((!l(d)||!l(u))&&(d=r.pickEllipsoid(s,i,V8),u=r.pickEllipsoid(a,i,m_e)),!l(d)||!l(u)){e._rotating=!0,Jd(e,t,n);return}if(d=r.worldToCameraCoordinates(d,d),u=r.worldToCameraCoordinates(u,u),l(r.constrainedAxis)){let m=r.constrainedAxis,p=h.mostOrthogonalAxis(m,m3);h.cross(p,m,p),h.normalize(p,p);let g=h.cross(m,p,oL),f=h.magnitude(d),x=h.dot(m,d),_=Math.acos(x/f),C=h.multiplyByScalar(m,x,h3);h.subtract(d,C,C),h.normalize(C,C);let V=h.magnitude(u),L=h.dot(m,u),Z=Math.acos(L/V),G=h.multiplyByScalar(m,L,h_e);h.subtract(u,G,G),h.normalize(G,G);let X=Math.acos(h.dot(C,p));h.dot(C,g)<0&&(X=W.TWO_PI-X);let v=Math.acos(h.dot(G,p));h.dot(G,g)<0&&(v=W.TWO_PI-v);let P=X-v,F;h.equalsEpsilon(m,r.position,W.EPSILON2)?F=r.right:F=h.cross(m,r.position,m3);let A=h.cross(m,F,m3),b=h.dot(A,h.subtract(d,m,oL)),R=h.dot(A,h.subtract(u,m,oL)),E;b>0&&R>0?E=Z-_:b>0&&R<=0?h.dot(r.position,m)>0?E=-_-Z:E=_+Z:E=_-Z,r.rotateRight(P),r.rotateUp(E)}else{h.normalize(d,d),h.normalize(u,u);let m=h.dot(d,u),p=h.cross(d,u,m3);if(m<1&&!h.equalsEpsilon(p,h.ZERO,W.EPSILON14)){let g=Math.acos(m);r.rotate(p,g)}}}var e0t=new h,t0t=new he,f_e=0;function X_e(e,t,n){l(n.distance)&&(n=n.distance);let i=n.inertiaEnabled,o=e._ellipsoid,r=e._scene,s=r.camera,a=r.canvas,c=e._cameraUnderground,d;c?d=t:(d=R_e,d.x=a.clientWidth/2,d.y=a.clientHeight/2);let u=s.getPickRay(d,Z_e),m,p=o.cartesianToCartographic(s.position,t0t).height,g=Math.abs(f_e)<e.minimumPickingTerrainDistanceWithInertia;(i?g:p<e._minimumPickingTerrainHeight)&&(m=ab(e,d,G_e));let x;if(l(m)&&(x=h.distance(u.origin,m),f_e=x),c){let C=x_e(e,u,p);l(x)?x=Math.min(x,C):x=C}l(x)||(x=p);let _=h.normalize(s.position,e0t);E8(e,t,n,e._zoomFactor,x,h.dot(_,s.direction))}var I_e=new D,g3=new pn,s9=new h,n0t=new h,W_e=new M,i0t=new M,P_e=new M,o0t=new we,r0t=new $,I8=new he,W8=new h;function s0t(e,t,n){let o=e._scene.camera;if(!M.equals(o.transform,M.IDENTITY))return;if(l(n.angleAndHeight)&&(n=n.angleAndHeight),D.equals(t,e._tiltCenterMousePosition)||(e._tiltOnEllipsoid=!1,e._looking=!1),e._looking){let a=e._ellipsoid.geodeticSurfaceNormal(o.position,W8);Qd(e,t,n,a);return}let s=e._ellipsoid.cartesianToCartographic(o.position,I8);e._tiltOnEllipsoid||s.height>e._minimumCollisionTerrainHeight?(e._tiltOnEllipsoid=!0,c0t(e,t,n)):l0t(e,t,n)}var a0t=new he;function c0t(e,t,n){let i=e._ellipsoid,o=e._scene,r=o.camera,s=e.minimumZoomDistance*.25,a=i.cartesianToCartographic(r.positionWC,a0t).height;if(a-s-1<W.EPSILON3&&n.endPosition.y-n.startPosition.y<0)return;let c=o.canvas,d=I_e;d.x=c.clientWidth/2,d.y=c.clientHeight/2;let u=r.getPickRay(d,g3),m,p=jn.rayEllipsoid(u,i);if(l(p))m=pn.getPoint(u,p.start,s9);else if(a>e._minimumTrackBallHeight){let V=jn.grazingAltitudeLocation(u,i);if(!l(V))return;let L=i.cartesianToCartographic(V,I8);L.height=0,m=i.cartographicToCartesian(L,s9)}else{e._looking=!0;let V=e._ellipsoid.geodeticSurfaceNormal(r.position,W8);Qd(e,t,n,V),D.clone(t,e._tiltCenterMousePosition);return}let g=Gt.eastNorthUpToFixedFrame(m,i,W_e),f=e._globe,x=e._ellipsoid;e._globe=void 0,e._ellipsoid=ie.UNIT_SPHERE,e._rotateFactor=1,e._rotateRateRangeAdjustment=1;let _=M.clone(r.transform,P_e);r._setTransform(g),Jd(e,t,n,h.UNIT_Z),r._setTransform(_),e._globe=f,e._ellipsoid=x;let C=x.maximumRadius;e._rotateFactor=1/C,e._rotateRateRangeAdjustment=C}function l0t(e,t,n){let i=e._ellipsoid,o=e._scene,r=o.camera,s=e._cameraUnderground,a,c,d;if(D.equals(t,e._tiltCenterMousePosition))a=h.clone(e._tiltCenter,s9);else{if(a=ab(e,t,s9),!l(a)){if(c=r.getPickRay(t,g3),d=jn.rayEllipsoid(c,i),!l(d)){if(i.cartesianToCartographic(r.position,I8).height<=e._minimumTrackBallHeight){e._looking=!0;let R=e._ellipsoid.geodeticSurfaceNormal(r.position,W8);Qd(e,t,n,R),D.clone(t,e._tiltCenterMousePosition)}return}a=pn.getPoint(c,d.start,s9)}s&&(l(c)||(c=r.getPickRay(t,g3)),__e(e,c,a,a)),D.clone(t,e._tiltCenterMousePosition),h.clone(a,e._tiltCenter)}let u=o.canvas,m=I_e;m.x=u.clientWidth/2,m.y=e._tiltCenterMousePosition.y,c=r.getPickRay(m,g3);let p=h.magnitude(a),g=h.fromElements(p,p,p,Z8),f=ie.fromCartesian3(g,G8);if(d=jn.rayEllipsoid(c,f),!l(d))return;let x=h.magnitude(c.origin)>p?d.start:d.stop,_=pn.getPoint(c,x,n0t),C=Gt.eastNorthUpToFixedFrame(a,i,W_e),V=Gt.eastNorthUpToFixedFrame(_,f,i0t),L=e._globe,Z=e._ellipsoid;e._globe=void 0,e._ellipsoid=ie.UNIT_SPHERE,e._rotateFactor=1,e._rotateRateRangeAdjustment=1;let G=h.UNIT_Z,X=M.clone(r.transform,P_e);r._setTransform(V);let v=h.cross(_,r.positionWC,b3);if(h.dot(r.rightWC,v)<0){let b=n.startPosition.y-n.endPosition.y;(s&&b<0||!s&&b>0)&&(G=void 0);let R=r.constrainedAxis;r.constrainedAxis=void 0,Jd(e,t,n,G,!0,!1),r.constrainedAxis=R}else Jd(e,t,n,G,!0,!1);if(r._setTransform(C),Jd(e,t,n,G,!1,!0),l(r.constrainedAxis)){let b=h.cross(r.direction,r.constrainedAxis,b3);h.equalsEpsilon(b,h.ZERO,W.EPSILON6)||(h.dot(b,r.right)<0&&h.negate(b,b),h.cross(b,r.direction,r.up),h.cross(r.direction,r.up,r.right),h.normalize(r.up,r.up),h.normalize(r.right,r.right))}r._setTransform(X),e._globe=L,e._ellipsoid=Z;let F=Z.maximumRadius;e._rotateFactor=1/F,e._rotateRateRangeAdjustment=F;let A=h.clone(r.positionWC,b3);if(e.enableCollisionDetection&&P8(e,!0),!h.equals(r.positionWC,A)){r._setTransform(V),r.worldToCameraCoordinatesPoint(A,A);let b=h.magnitudeSquared(A);h.magnitudeSquared(r.position)>b&&(h.normalize(r.position,r.position),h.multiplyByScalar(r.position,Math.sqrt(b),r.position));let R=h.angleBetween(A,r.position),E=h.cross(A,r.position,A);h.normalize(E,E);let I=we.fromAxisAngle(E,R,o0t),w=$.fromQuaternion(I,r0t);$.multiplyByVector(w,r.direction,r.direction),$.multiplyByVector(w,r.up,r.up),h.cross(r.direction,r.up,r.right),h.cross(r.right,r.direction,r.up),r._setTransform(X)}}var d0t=new D,u0t=new D,p_e=new pn,b_e=new pn,m0t=new h,h0t=new h;function Qd(e,t,n,i){let r=e._scene.camera,s=d0t;s.x=n.startPosition.x,s.y=0;let a=u0t;a.x=n.endPosition.x,a.y=0;let c=r.getPickRay(s,p_e),d=r.getPickRay(a,b_e),u=0,m,p;r.frustum instanceof on?(m=c.origin,p=d.origin,h.add(r.direction,m,m),h.add(r.direction,p,p),h.subtract(m,r.position,m),h.subtract(p,r.position,p),h.normalize(m,m),h.normalize(p,p)):(m=c.direction,p=d.direction);let g=h.dot(m,p);g<1&&(u=Math.acos(g)),u=n.startPosition.x>n.endPosition.x?-u:u;let f=e._horizontalRotationAxis;if(l(i)?r.look(i,-u):l(f)?r.look(f,-u):r.lookLeft(u),s.x=0,s.y=n.startPosition.y,a.x=0,a.y=n.endPosition.y,c=r.getPickRay(s,p_e),d=r.getPickRay(a,b_e),u=0,r.frustum instanceof on?(m=c.origin,p=d.origin,h.add(r.direction,m,m),h.add(r.direction,p,p),h.subtract(m,r.position,m),h.subtract(p,r.position,p),h.normalize(m,m),h.normalize(p,p)):(m=c.direction,p=d.direction),g=h.dot(m,p),g<1&&(u=Math.acos(g)),u=n.startPosition.y>n.endPosition.y?-u:u,i=y(i,f),l(i)){let x=r.direction,_=h.negate(i,m0t),C=h.equalsEpsilon(x,i,W.EPSILON2),V=h.equalsEpsilon(x,_,W.EPSILON2);if(!C&&!V){g=h.dot(x,i);let L=W.acosClamped(g);u>0&&u>L&&(u=L-W.EPSILON4),g=h.dot(x,_),L=W.acosClamped(g),u<0&&-u>L&&(u=-L+W.EPSILON4);let Z=h.cross(i,x,h0t);r.look(Z,u)}else(C&&u<0||V&&u>0)&&r.look(r.right,-u)}else r.lookUp(u)}function f0t(e){ll(e,e.enableRotate,e.rotateEventTypes,Kpt,e.inertiaSpin,"_lastInertiaSpinMovement"),ll(e,e.enableZoom,e.zoomEventTypes,X_e,e.inertiaZoom,"_lastInertiaZoomMovement"),ll(e,e.enableTilt,e.tiltEventTypes,s0t,e.inertiaSpin,"_lastInertiaTiltMovement"),ll(e,e.enableLook,e.lookEventTypes,Qd)}var p0t=new M,b0t=new he;function P8(e,t){e._adjustedHeightForTerrain=!0;let n=e._scene,i=n.mode,o=n.globe;if(i===oe.SCENE2D||i===oe.MORPHING)return;let r=n.camera,s=y(o?.ellipsoid,ie.WGS84),a=n.mapProjection,c,d;M.equals(r.transform,M.IDENTITY)||(c=M.clone(r.transform,p0t),d=h.magnitude(r.position),r._setTransform(M.IDENTITY));let u=b0t;i===oe.SCENE3D?s.cartesianToCartographic(r.position,u):a.unproject(r.position,u);let m=!1;if(u.height<e._minimumCollisionTerrainHeight){let p=e._scene.globeHeight;if(l(p)){let g=p+e.minimumZoomDistance,f=p-e._lastGlobeHeight,x=f/e._lastGlobeHeight;u.height<g&&(t||Math.abs(x)<=.1)&&(u.height=g,i===oe.SCENE3D?s.cartographicToCartesian(u,r.position):a.project(u,r.position),m=!0),t||Math.abs(x)<=.1?e._lastGlobeHeight=p:e._lastGlobeHeight+=f*.1}}l(c)&&(r._setTransform(c),m&&(h.normalize(r.position,r.position),h.negate(r.position,r.direction),h.multiplyByScalar(r.position,Math.max(d,e.minimumZoomDistance),r.position),h.normalize(r.direction,r.direction),h.cross(r.direction,r.up,r.right),h.cross(r.right,r.direction,r.up)))}a9.prototype.onMap=function(){let e=this._scene,t=e.mode,n=e.camera;return t===oe.COLUMBUS_VIEW?Math.abs(n.position.x)-this._maxCoord.x<0&&Math.abs(n.position.y)-this._maxCoord.y<0:!0};var g0t=new h,y0t=new h;a9.prototype.update=function(){let e=this._scene,{camera:t,globe:n,mode:i}=e;M.equals(t.transform,M.IDENTITY)?(this._globe=n,this._ellipsoid=l(this._globe)?this._globe.ellipsoid:e.mapProjection.ellipsoid):(this._globe=void 0,this._ellipsoid=ie.UNIT_SPHERE);let{verticalExaggeration:o,verticalExaggerationRelativeHeight:r}=e;this._minimumCollisionTerrainHeight=mr.getHeight(this.minimumCollisionTerrainHeight,o,r),this._minimumPickingTerrainHeight=mr.getHeight(this.minimumPickingTerrainHeight,o,r),this._minimumTrackBallHeight=mr.getHeight(this.minimumTrackBallHeight,o,r),this._cameraUnderground=e.cameraUnderground&&l(this._globe);let s=this._ellipsoid.maximumRadius;this._rotateFactor=1/s,this._rotateRateRangeAdjustment=s,this._adjustedHeightForTerrain=!1;let a=h.clone(t.positionWC,g0t),c=h.clone(t.directionWC,y0t);if(i===oe.SCENE2D?bpt(this):i===oe.COLUMBUS_VIEW?(this._horizontalRotationAxis=h.UNIT_Z,kpt(this)):i===oe.SCENE3D&&(this._horizontalRotationAxis=void 0,f0t(this)),this.enableCollisionDetection&&!this._adjustedHeightForTerrain){let d=!h.equals(a,t.positionWC)||!h.equals(c,t.directionWC);P8(this,d)}this._aggregator.reset()};a9.prototype.isDestroyed=function(){return!1};a9.prototype.destroy=function(){return this._tweens.removeAll(),this._aggregator=this._aggregator&&this._aggregator.destroy(),me(this)};var c9=a9;var ZUi=T(S(),1);var sUi=T(S(),1),l9=`uniform sampler2D colorTexture; uniform sampler2D colorTexture2; uniform vec2 center; uniform float radius; in vec2 v_textureCoordinates; void main() { vec4 color0 = texture(colorTexture, v_textureCoordinates); vec4 color1 = texture(colorTexture2, v_textureCoordinates); float x = length(gl_FragCoord.xy - center) / radius; float t = smoothstep(0.5, 0.8, x); out_FragColor = mix(color0 + color1, color1, t); } `;var cUi=T(S(),1),d9=`uniform sampler2D colorTexture; uniform float avgLuminance; uniform float threshold; uniform float offset; in vec2 v_textureCoordinates; float key(float avg) { float guess = 1.5 - (1.5 / (avg * 0.1 + 1.0)); return max(0.0, guess) + 0.1; } // See section 9. "The bright-pass filter" of Realtime HDR Rendering // http://www.cg.tuwien.ac.at/research/publications/2007/Luksch_2007_RHR/Luksch_2007_RHR-RealtimeHDR%20.pdf void main() { vec4 color = texture(colorTexture, v_textureCoordinates); vec3 xyz = czm_RGBToXYZ(color.rgb); float luminance = xyz.r; float scaledLum = key(avgLuminance) * luminance / avgLuminance; float brightLum = max(scaledLum - threshold, 0.0); float brightness = brightLum / (offset + brightLum); xyz.r = brightness; out_FragColor = vec4(czm_XYZToRGB(xyz), 1.0); } `;function cb(){this._sceneFramebuffer=new AT;let e=.125,t=new Array(6);t[0]=new fo({fragmentShader:jl,textureScale:e,forcePowerOfTwo:!0,sampleMode:Kd.LINEAR});let n=t[1]=new fo({fragmentShader:d9,uniforms:{avgLuminance:.5,threshold:.25,offset:.1},textureScale:e,forcePowerOfTwo:!0}),i=this;this._delta=1,this._sigma=2,this._blurStep=new D,t[2]=new fo({fragmentShader:Gy,uniforms:{step:function(){return i._blurStep.x=i._blurStep.y=1/n.outputTexture.width,i._blurStep},delta:function(){return i._delta},sigma:function(){return i._sigma},direction:0},textureScale:e,forcePowerOfTwo:!0}),t[3]=new fo({fragmentShader:Gy,uniforms:{step:function(){return i._blurStep.x=i._blurStep.y=1/n.outputTexture.width,i._blurStep},delta:function(){return i._delta},sigma:function(){return i._sigma},direction:1},textureScale:e,forcePowerOfTwo:!0}),t[4]=new fo({fragmentShader:jl,sampleMode:Kd.LINEAR}),this._uCenter=new D,this._uRadius=void 0,t[5]=new fo({fragmentShader:l9,uniforms:{center:function(){return i._uCenter},radius:function(){return i._uRadius},colorTexture2:function(){return i._sceneFramebuffer.framebuffer.getColorTexture(0)}}}),this._stages=new al({stages:t});let o=new YT(this),r=t.length;for(let s=0;s<r;++s)t[s]._textureCache=o;this._textureCache=o,this.length=t.length}cb.prototype.get=function(e){return this._stages.get(e)};cb.prototype.getStageByName=function(e){let t=this._stages.length;for(let n=0;n<t;++n){let i=this._stages.get(n);if(i.name===e)return i}};var x0t=new se,v_e=new D,_0t=new D,w_e=new M;function T0t(e,t,n){let i=t.uniformState,o=i.sunPositionWC,r=i.view,s=i.viewProjection,a=i.projection,c=M.computeViewportTransformation(n,0,1,w_e),d=M.multiplyByPoint(r,o,x0t),u=Gt.pointToGLWindowCoordinates(s,c,o,v_e);d.x+=W.SOLAR_RADIUS;let m=Gt.pointToGLWindowCoordinates(a,c,d,d),p=D.magnitude(D.subtract(m,u,m))*30*2,g=_0t;g.x=p,g.y=p,e._uCenter=D.clone(u,e._uCenter),e._uRadius=Math.max(g.x,g.y)*.15;let f=t.drawingBufferWidth,x=t.drawingBufferHeight,_=e._stages,C=_.get(0),V=C.outputTexture.width,L=C.outputTexture.height,Z=new He;Z.width=V,Z.height=L,c=M.computeViewportTransformation(Z,0,1,w_e),u=Gt.pointToGLWindowCoordinates(s,c,o,v_e),g.x*=V/f,g.y*=L/x;let G=C.scissorRectangle;G.x=Math.max(u.x-g.x*.5,0),G.y=Math.max(u.y-g.y*.5,0),G.width=Math.min(g.x,f),G.height=Math.min(g.y,x);for(let X=1;X<4;++X)He.clone(G,_.get(X).scissorRectangle)}cb.prototype.clear=function(e,t,n){this._sceneFramebuffer.clear(e,t,n),this._textureCache.clear(e)};cb.prototype.update=function(e){let t=e.context,n=e.viewport,i=this._sceneFramebuffer;i.update(t,n);let o=i.framebuffer;return this._textureCache.update(t),this._stages.update(t,!1),T0t(this,t,n),o};cb.prototype.execute=function(e){let t=this._sceneFramebuffer.framebuffer.getColorTexture(0),n=this._stages,i=n.length;n.get(0).execute(e,t);for(let o=1;o<i;++o)n.get(o).execute(e,n.get(o-1).outputTexture)};cb.prototype.copy=function(e,t){if(!l(this._copyColorCommand)){let n=this;this._copyColorCommand=e.createViewportQuadCommand(jl,{uniformMap:{colorTexture:function(){return n._stages.get(n._stages.length-1).outputTexture}},owner:this})}this._copyColorCommand.framebuffer=t,this._copyColorCommand.execute(e)};cb.prototype.isDestroyed=function(){return!1};cb.prototype.destroy=function(){return this._textureCache.destroy(),this._stages.destroy(),me(this)};var u9=cb;var vUi=T(S(),1);function F_e(){this._cachedShowFrustumsShaders={}}function S0t(e){let t={},n=e.vertexAttributes;for(let i in n)n.hasOwnProperty(i)&&(t[i]=n[i].index);return t}function C0t(e,t){let n=e.context,i=t,o=i.fragmentShaderSource.clone(),r=[];o.sources=o.sources.map(function(u){u=Ye.replaceMain(u,"czm_Debug_main");let m=/out_FragData_(\d+)/g,p;for(;(p=m.exec(u))!==null;)r.indexOf(p[1])===-1&&r.push(p[1]);return u});let s=r.length,a="";a+=`uniform vec3 debugShowCommandsColor; `,a+=`uniform vec3 debugShowFrustumsColor; `,a+=`void main() { czm_Debug_main(); `;let c;if(s>0)for(c=0;c<s;++c)a+=` out_FragData_${r[c]}.rgb *= debugShowCommandsColor; `,a+=` out_FragData_${r[c]}.rgb *= debugShowFrustumsColor; `;else a+=` out_FragColor.rgb *= debugShowCommandsColor; `,a+=` out_FragColor.rgb *= debugShowFrustumsColor; `;a+="}",o.sources.push(a);let d=S0t(i);return $t.fromCache({context:n,vertexShaderSource:i.vertexShaderSource,fragmentShaderSource:o,attributeLocations:d})}var m9=new Y;function V0t(e,t){let n;return l(t.uniformMap)?n=t.uniformMap:n={},l(n.debugShowCommandsColor)||l(n.debugShowFrustumsColor)||(n.debugShowCommandsColor=function(){return e.debugShowCommands?(l(t._debugColor)||(t._debugColor=Y.fromRandom()),t._debugColor):Y.WHITE},n.debugShowFrustumsColor=function(){return e.debugShowFrustums?(m9.red=t.debugOverlappingFrustums&1?1:0,m9.green=t.debugOverlappingFrustums&2?1:0,m9.blue=t.debugOverlappingFrustums&4?1:0,m9.alpha=1,m9):Y.WHITE}),n}var L0t=new et;F_e.prototype.executeDebugShowFrustumsCommand=function(e,t,n){let i=t.shaderProgram.id,o=this._cachedShowFrustumsShaders[i];l(o)||(o=C0t(e,t.shaderProgram),this._cachedShowFrustumsShaders[i]=o);let r=et.shallowClone(t,L0t);r.shaderProgram=o,r.uniformMap=V0t(e,t),r.execute(e.context,n)};var h9=F_e;var kUi=T(S(),1);function JT(e,t,n){this._primitive=e,this._tileIndex=t,this._sampleIndex=n,this._metadata={},this._orientedBoundingBox=new Gn}JT.fromKeyframeNode=function(e,t,n,i){let o=new JT(e,t,n),{spatialNode:r,metadata:s}=i;return o._metadata=R0t(e,s,n),o._orientedBoundingBox=G0t(e,r,n,o._orientedBoundingBox),o};function R0t(e,t,n){if(!l(t))return;let{names:i,types:o}=e.provider,r={};for(let s=0;s<i.length;s++){let a=i[s],c=zt.getComponentCount(o[s]),d=t[s].slice(n*c,(n+1)*c);r[a]=d}return r}var A_e=new h,Z0t=new h;function G0t(e,t,n,i){let o=t.dimensions,r=o.x*o.y,s=Math.floor(n/r),a=n-s*r,c=Math.floor(a/o.x),d=a-c*o.x,u=h.fromElements(d,c,s,A_e),m=h.divideComponents(h.subtract(u,e._paddingBefore,A_e),e.dimensions,Z0t);return e._shape.computeOrientedBoundingBoxForSample(t,e.dimensions,m,i)}Object.defineProperties(JT.prototype,{metadata:{get:function(){return this._metadata}},primitive:{get:function(){return this._primitive}},sampleIndex:{get:function(){return this._sampleIndex}},tileIndex:{get:function(){return this._tileIndex}},orientedBoundingBox:{get:function(){return this._orientedBoundingBox.clone()}}});JT.prototype.hasProperty=function(e){return l(this._metadata[e])};JT.prototype.getNames=function(){return Object.keys(this._metadata)};JT.prototype.getProperty=function(e){return this._metadata[e]};var f9=JT;var wYi=T(S(),1);var r3i=T(S(),1);var UDi=T(S(),1);var DUi=T(S(),1),p9=`struct Ray { vec3 pos; vec3 dir; vec3 rawDir; }; #if defined(JITTER) /** * Generate a pseudo-random value for a given 2D screen coordinate. * Similar to https://www.shadertoy.com/view/4djSRW with a modified hashscale. */ float hash(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * 50.0); p3 += dot(p3, p3.yzx + 19.19); return fract((p3.x + p3.y) * p3.z); } #endif float minComponent(in vec3 v) { return min(min(v.x, v.y), v.z); } float maxComponent(in vec3 v) { return max(max(v.x, v.y), v.z); } struct PointJacobianT { vec3 point; mat3 jacobianT; }; `;var YUi=T(S(),1),b9=`// See Intersection.glsl for the definition of intersectScene // See IntersectionUtils.glsl for the definition of nextIntersection // See convertUvToBox.glsl, convertUvToCylinder.glsl, or convertUvToEllipsoid.glsl // for the definition of convertUvToShapeUvSpace. The appropriate function is // selected based on the VoxelPrimitive shape type, and added to the shader in // Scene/VoxelRenderResources.js. // See Octree.glsl for the definitions of TraversalData, SampleData, // traverseOctreeFromBeginning, and traverseOctreeFromExisting // See Megatexture.glsl for the definition of accumulatePropertiesFromMegatexture #define STEP_COUNT_MAX 1000 // Harcoded value because GLSL doesn't like variable length loops #if defined(PICKING_VOXEL) #define ALPHA_ACCUM_MAX 0.1 #else #define ALPHA_ACCUM_MAX 0.98 // Must be > 0.0 and <= 1.0 #endif uniform mat3 u_transformDirectionViewToLocal; uniform vec3 u_cameraPositionUv; uniform float u_stepSize; #if defined(PICKING) uniform vec4 u_pickColor; #endif vec3 getSampleSize(in int level) { vec3 sampleCount = exp2(float(level)) * vec3(u_dimensions); vec3 sampleSizeUv = 1.0 / sampleCount; return scaleShapeUvToShapeSpace(sampleSizeUv); } #define MINIMUM_STEP_SCALAR (0.02) #define SHIFT_FRACTION (0.001) /** * Given a coordinate within a tile, and sample spacings along a ray through * the coordinate, find the distance to the points where the ray entered and * exited the voxel cell, along with the surface normals at those points. * The surface normals are returned in shape space coordinates. */ RayShapeIntersection getVoxelIntersection(in vec3 tileUv, in vec3 sampleSizeAlongRay) { vec3 voxelCoord = tileUv * vec3(u_dimensions); vec3 directions = sign(sampleSizeAlongRay); vec3 positiveDirections = max(directions, 0.0); vec3 entryCoord = mix(ceil(voxelCoord), floor(voxelCoord), positiveDirections); vec3 exitCoord = entryCoord + directions; vec3 distanceFromEntry = -abs((entryCoord - voxelCoord) * sampleSizeAlongRay); float lastEntry = maxComponent(distanceFromEntry); bvec3 isLastEntry = equal(distanceFromEntry, vec3(lastEntry)); vec3 entryNormal = -1.0 * vec3(isLastEntry) * directions; vec4 entry = vec4(entryNormal, lastEntry); vec3 distanceToExit = abs((exitCoord - voxelCoord) * sampleSizeAlongRay); float firstExit = minComponent(distanceToExit); bvec3 isFirstExit = equal(distanceToExit, vec3(firstExit)); vec3 exitNormal = vec3(isFirstExit) * directions; vec4 exit = vec4(exitNormal, firstExit); return RayShapeIntersection(entry, exit); } vec4 getStepSize(in SampleData sampleData, in Ray viewRay, in RayShapeIntersection shapeIntersection, in mat3 jacobianT, in float currentT) { // The Jacobian is computed in a space where the shape spans [-1, 1]. // But the ray is marched in a space where the shape fills [0, 1]. // So we need to scale the Jacobian by 2. vec3 gradient = 2.0 * viewRay.rawDir * jacobianT; vec3 sampleSizeAlongRay = getSampleSize(sampleData.tileCoords.w) / gradient; RayShapeIntersection voxelIntersection = getVoxelIntersection(sampleData.tileUv, sampleSizeAlongRay); // Transform normal from shape space to Cartesian space vec3 voxelNormal = normalize(jacobianT * voxelIntersection.entry.xyz); // Compare with the shape intersection, to choose the appropriate normal vec4 voxelEntry = vec4(voxelNormal, currentT + voxelIntersection.entry.w); vec4 entry = intersectionMax(shapeIntersection.entry, voxelEntry); float fixedStep = minComponent(abs(sampleSizeAlongRay)) * u_stepSize; float shift = fixedStep * SHIFT_FRACTION; float dt = voxelIntersection.exit.w + shift; if ((currentT + dt) > shapeIntersection.exit.w) { // Stop at end of shape dt = shapeIntersection.exit.w - currentT + shift; } float stepSize = clamp(dt, fixedStep * MINIMUM_STEP_SCALAR, fixedStep + shift); return vec4(entry.xyz, stepSize); } vec2 packIntToVec2(int value) { float shifted = float(value) / 255.0; float lowBits = fract(shifted); float highBits = floor(shifted) / 255.0; return vec2(highBits, lowBits); } vec2 packFloatToVec2(float value) { float lowBits = fract(value); float highBits = floor(value) / 255.0; return vec2(highBits, lowBits); } int getSampleIndex(in vec3 tileUv) { ivec3 voxelDimensions = u_dimensions; vec3 sampleCoordinate = tileUv * vec3(voxelDimensions); // tileUv = 1.0 is a valid coordinate but sampleIndex = voxelDimensions is not. // (tileUv = 1.0 corresponds to the last sample, at index = voxelDimensions - 1). // Clamp to [0, voxelDimensions - 0.5) to avoid numerical error before flooring vec3 maxCoordinate = vec3(voxelDimensions) - vec3(0.5); sampleCoordinate = clamp(sampleCoordinate, vec3(0.0), maxCoordinate); ivec3 sampleIndex = ivec3(floor(sampleCoordinate)); #if defined(PADDING) voxelDimensions += u_paddingBefore + u_paddingAfter; sampleIndex += u_paddingBefore; #endif // Convert to a 1D index for lookup in a 1D data array return sampleIndex.x + voxelDimensions.x * (sampleIndex.y + voxelDimensions.y * sampleIndex.z); } void main() { vec4 fragCoord = gl_FragCoord; vec2 screenCoord = (fragCoord.xy - czm_viewport.xy) / czm_viewport.zw; // [0,1] vec3 eyeDirection = normalize(czm_windowToEyeCoordinates(fragCoord).xyz); vec3 viewDirWorld = normalize(czm_inverseViewRotation * eyeDirection); // normalize again just in case vec3 viewDirUv = normalize(u_transformDirectionViewToLocal * eyeDirection); // normalize again just in case vec3 viewPosUv = u_cameraPositionUv; #if defined(SHAPE_ELLIPSOID) // viewDirUv has been scaled to a space where the ellipsoid is a sphere. // Undo this scaling to get the raw direction. vec3 rawDir = viewDirUv * u_ellipsoidRadiiUv; Ray viewRayUv = Ray(viewPosUv, viewDirUv, rawDir); #else Ray viewRayUv = Ray(viewPosUv, viewDirUv, viewDirUv); #endif Intersections ix; RayShapeIntersection shapeIntersection = intersectScene(screenCoord, viewRayUv, ix); // Exit early if the scene was completely missed. if (shapeIntersection.entry.w == NO_HIT) { discard; } float currentT = shapeIntersection.entry.w; float endT = shapeIntersection.exit.w; vec3 positionUv = viewPosUv + currentT * viewDirUv; PointJacobianT pointJacobian = convertUvToShapeUvSpaceDerivative(positionUv); // Traverse the tree from the start position TraversalData traversalData; SampleData sampleDatas[SAMPLE_COUNT]; traverseOctreeFromBeginning(pointJacobian.point, traversalData, sampleDatas); vec4 step = getStepSize(sampleDatas[0], viewRayUv, shapeIntersection, pointJacobian.jacobianT, currentT); #if defined(JITTER) float noise = hash(screenCoord); // [0,1] currentT += noise * step.w; positionUv += noise * step.w * viewDirUv; #endif FragmentInput fragmentInput; #if defined(STATISTICS) setStatistics(fragmentInput.metadata.statistics); #endif vec4 colorAccum = vec4(0.0); for (int stepCount = 0; stepCount < STEP_COUNT_MAX; ++stepCount) { // Read properties from the megatexture based on the traversal state Properties properties = accumulatePropertiesFromMegatexture(sampleDatas); // Prepare the custom shader inputs copyPropertiesToMetadata(properties, fragmentInput.metadata); fragmentInput.voxel.positionUv = positionUv; fragmentInput.voxel.positionShapeUv = pointJacobian.point; fragmentInput.voxel.positionUvLocal = sampleDatas[0].tileUv; fragmentInput.voxel.viewDirUv = viewDirUv; fragmentInput.voxel.viewDirWorld = viewDirWorld; fragmentInput.voxel.surfaceNormal = step.xyz; fragmentInput.voxel.travelDistance = step.w; fragmentInput.voxel.stepCount = stepCount; fragmentInput.voxel.tileIndex = sampleDatas[0].megatextureIndex; fragmentInput.voxel.sampleIndex = getSampleIndex(sampleDatas[0].tileUv); // Run the custom shader czm_modelMaterial materialOutput; fragmentMain(fragmentInput, materialOutput); // Sanitize the custom shader output vec4 color = vec4(materialOutput.diffuse, materialOutput.alpha); color.rgb = max(color.rgb, vec3(0.0)); color.a = clamp(color.a, 0.0, 1.0); // Pre-multiplied alpha blend colorAccum += (1.0 - colorAccum.a) * vec4(color.rgb * color.a, color.a); // Stop traversing if the alpha has been fully saturated if (colorAccum.a > ALPHA_ACCUM_MAX) { colorAccum.a = ALPHA_ACCUM_MAX; break; } if (step.w == 0.0) { // Shape is infinitely thin. The ray may have hit the edge of a // foreground voxel. Step ahead slightly to check for more voxels step.w == 0.00001; } // Keep raymarching currentT += step.w; positionUv = viewPosUv + currentT * viewDirUv; // Check if there's more intersections. if (currentT > endT) { #if (INTERSECTION_COUNT == 1) break; #else shapeIntersection = nextIntersection(ix); if (shapeIntersection.entry.w == NO_HIT) { break; } else { // Found another intersection. Resume raymarching there currentT = shapeIntersection.entry.w; endT = shapeIntersection.exit.w; positionUv = viewPosUv + currentT * viewDirUv; } #endif } // Traverse the tree from the current ray position. // This is similar to traverseOctreeFromBeginning but is faster when the ray is in the same tile as the previous step. pointJacobian = convertUvToShapeUvSpaceDerivative(positionUv); traverseOctreeFromExisting(pointJacobian.point, traversalData, sampleDatas); step = getStepSize(sampleDatas[0], viewRayUv, shapeIntersection, pointJacobian.jacobianT, currentT); } // Convert the alpha from [0,ALPHA_ACCUM_MAX] to [0,1] colorAccum.a /= ALPHA_ACCUM_MAX; #if defined(PICKING) // If alpha is 0.0 there is nothing to pick if (colorAccum.a == 0.0) { discard; } out_FragColor = u_pickColor; #elif defined(PICKING_VOXEL) // If alpha is 0.0 there is nothing to pick if (colorAccum.a == 0.0) { discard; } vec2 megatextureId = packIntToVec2(sampleDatas[0].megatextureIndex); vec2 sampleIndex = packIntToVec2(getSampleIndex(sampleDatas[0].tileUv)); out_FragColor = vec4(megatextureId, sampleIndex); #else out_FragColor = colorAccum; #endif } `;var HUi=T(S(),1),g9=`in vec2 position; uniform vec4 u_ndcSpaceAxisAlignedBoundingBox; void main() { vec2 aabbMin = u_ndcSpaceAxisAlignedBoundingBox.xy; vec2 aabbMax = u_ndcSpaceAxisAlignedBoundingBox.zw; vec2 translation = 0.5 * (aabbMax + aabbMin); vec2 scale = 0.5 * (aabbMax - aabbMin); gl_Position = vec4(position * scale + translation, 0.0, 1.0); } `;var KUi=T(S(),1),y9=`/* Intersection defines #define INTERSECTION_COUNT ### */ #define NO_HIT (-czm_infinity) #define INF_HIT (czm_infinity * 0.5) struct RayShapeIntersection { vec4 entry; vec4 exit; }; vec4 intersectionMin(in vec4 intersect0, in vec4 intersect1) { if (intersect0.w == NO_HIT) { return intersect1; } else if (intersect1.w == NO_HIT) { return intersect0; } return (intersect0.w <= intersect1.w) ? intersect0 : intersect1; } vec4 intersectionMax(in vec4 intersect0, in vec4 intersect1) { return (intersect0.w >= intersect1.w) ? intersect0 : intersect1; } RayShapeIntersection intersectIntersections(in Ray ray, in RayShapeIntersection intersect0, in RayShapeIntersection intersect1) { bool missed = (intersect0.entry.w == NO_HIT) || (intersect1.entry.w == NO_HIT) || (intersect0.exit.w < intersect1.entry.w) || (intersect0.entry.w > intersect1.exit.w); if (missed) { vec4 miss = vec4(normalize(ray.dir), NO_HIT); return RayShapeIntersection(miss, miss); } vec4 entry = intersectionMax(intersect0.entry, intersect1.entry); vec4 exit = intersectionMin(intersect0.exit, intersect1.exit); return RayShapeIntersection(entry, exit); } struct Intersections { // Don't access these member variables directly - call the functions instead. // Store an array of ray-surface intersections. Each intersection is composed of: // .xyz for the surface normal at the intersection point // .w for the T value // The scale of the normal encodes the shape intersection type: // length(intersection.xyz) = 1: positive shape entry // length(intersection.xyz) = 2: positive shape exit // length(intersection.xyz) = 3: negative shape entry // length(intersection.xyz) = 4: negative shape exit // INTERSECTION_COUNT is the number of ray-*shape* (volume) intersections, // so we need twice as many to track ray-*surface* intersections vec4 intersections[INTERSECTION_COUNT * 2]; #if (INTERSECTION_COUNT > 1) // Maintain state for future nextIntersection calls int index; int surroundCount; bool surroundIsPositive; #endif }; RayShapeIntersection getFirstIntersection(in Intersections ix) { return RayShapeIntersection(ix.intersections[0], ix.intersections[1]); } vec4 encodeIntersectionType(vec4 intersection, int index, bool entry) { float scale = float(index > 0) * 2.0 + float(!entry) + 1.0; return vec4(intersection.xyz * scale, intersection.w); } // Use defines instead of real functions because WebGL1 cannot access array with non-constant index. #define setIntersection(/*inout Intersections*/ ix, /*int*/ index, /*float*/ t, /*bool*/ positive, /*bool*/ enter) (ix).intersections[(index)] = vec4(0.0, float(!positive) * 2.0 + float(!enter) + 1.0, 0.0, (t)) #define setIntersectionPair(/*inout Intersections*/ ix, /*int*/ index, /*vec2*/ entryExit) (ix).intersections[(index) * 2 + 0] = vec4(0.0, float((index) > 0) * 2.0 + 1.0, 0.0, (entryExit).x); (ix).intersections[(index) * 2 + 1] = vec4(0.0, float((index) > 0) * 2.0 + 2.0, 0.0, (entryExit).y) #define setSurfaceIntersection(/*inout Intersections*/ ix, /*int*/ index, /*vec4*/ intersection, /*bool*/ positive, /*bool*/ enter) (ix).intersections[(index)] = encodeIntersectionType((intersection), int(!positive), (enter)) #define setShapeIntersection(/*inout Intersections*/ ix, /*int*/ index, /*RayShapeIntersection*/ intersection) (ix).intersections[(index) * 2 + 0] = encodeIntersectionType((intersection).entry, (index), true); (ix).intersections[(index) * 2 + 1] = encodeIntersectionType((intersection).exit, (index), false) #if (INTERSECTION_COUNT > 1) void initializeIntersections(inout Intersections ix) { // Sort the intersections from min T to max T with bubble sort. // Note: If this sorting function changes, some of the intersection test may // need to be updated. Search for "bubble sort" to find those areas. const int sortPasses = INTERSECTION_COUNT * 2 - 1; for (int n = sortPasses; n > 0; --n) { for (int i = 0; i < sortPasses; ++i) { // The loop should be: for (i = 0; i < n; ++i) {...} but WebGL1 cannot // loop with non-constant condition, so it has to break early instead if (i >= n) { break; } vec4 intersect0 = ix.intersections[i + 0]; vec4 intersect1 = ix.intersections[i + 1]; bool inOrder = intersect0.w <= intersect1.w; ix.intersections[i + 0] = inOrder ? intersect0 : intersect1; ix.intersections[i + 1] = inOrder ? intersect1 : intersect0; } } // Prepare initial state for nextIntersection ix.index = 0; ix.surroundCount = 0; ix.surroundIsPositive = false; } #endif #if (INTERSECTION_COUNT > 1) RayShapeIntersection nextIntersection(inout Intersections ix) { vec4 surfaceIntersection = vec4(0.0, 0.0, 0.0, NO_HIT); RayShapeIntersection shapeIntersection = RayShapeIntersection(surfaceIntersection, surfaceIntersection); const int passCount = INTERSECTION_COUNT * 2; if (ix.index == passCount) { return shapeIntersection; } for (int i = 0; i < passCount; ++i) { // The loop should be: for (i = ix.index; i < passCount; ++i) {...} but WebGL1 cannot // loop with non-constant condition, so it has to continue instead. if (i < ix.index) { continue; } ix.index = i + 1; surfaceIntersection = ix.intersections[i]; int intersectionType = int(length(surfaceIntersection.xyz) - 0.5); bool currShapeIsPositive = intersectionType < 2; bool enter = intMod(intersectionType, 2) == 0; ix.surroundCount += enter ? +1 : -1; ix.surroundIsPositive = currShapeIsPositive ? enter : ix.surroundIsPositive; // entering positive or exiting negative if (ix.surroundCount == 1 && ix.surroundIsPositive && enter == currShapeIsPositive) { shapeIntersection.entry = surfaceIntersection; } // exiting positive or entering negative after being inside positive bool exitPositive = !enter && currShapeIsPositive && ix.surroundCount == 0; bool enterNegativeFromPositive = enter && !currShapeIsPositive && ix.surroundCount == 2 && ix.surroundIsPositive; if (exitPositive || enterNegativeFromPositive) { shapeIntersection.exit = surfaceIntersection; // entry and exit have been found, so the loop can stop if (exitPositive) { // After exiting positive shape there is nothing left to intersect, so jump to the end index. ix.index = passCount; } break; } } return shapeIntersection; } #endif // NOTE: initializeIntersections, nextIntersection aren't even declared unless INTERSECTION_COUNT > 1 `;var QUi=T(S(),1),x9=`// See IntersectionUtils.glsl for the definitions of Ray, Intersections, // setIntersectionPair, INF_HIT, NO_HIT /* intersectDepth defines (set in Scene/VoxelRenderResources.js) #define DEPTH_INTERSECTION_INDEX ### */ uniform mat4 u_transformPositionViewToUv; void intersectDepth(in vec2 screenCoord, in Ray ray, inout Intersections ix) { float logDepthOrDepth = czm_unpackDepth(texture(czm_globeDepthTexture, screenCoord)); if (logDepthOrDepth != 0.0) { // Calculate how far the ray must travel before it hits the depth buffer. vec4 eyeCoordinateDepth = czm_screenToEyeCoordinates(screenCoord, logDepthOrDepth); eyeCoordinateDepth /= eyeCoordinateDepth.w; vec3 depthPositionUv = vec3(u_transformPositionViewToUv * eyeCoordinateDepth); float t = dot(depthPositionUv - ray.pos, ray.dir); setIntersectionPair(ix, DEPTH_INTERSECTION_INDEX, vec2(t, +INF_HIT)); } else { // There's no depth at this location. setIntersectionPair(ix, DEPTH_INTERSECTION_INDEX, vec2(NO_HIT)); } } `;var qUi=T(S(),1),_9=`// See IntersectionUtils.glsl for the definitions of Ray, Intersections, INF_HIT, // NO_HIT, setShapeIntersection /* Clipping plane defines (set in Scene/VoxelRenderResources.js) #define CLIPPING_PLANES_UNION #define CLIPPING_PLANES_COUNT #define CLIPPING_PLANES_INTERSECTION_INDEX */ uniform sampler2D u_clippingPlanesTexture; uniform mat4 u_clippingPlanesMatrix; // Plane is in Hessian Normal Form vec4 intersectPlane(in Ray ray, in vec4 plane) { vec3 n = plane.xyz; // normal float w = plane.w; // -dot(pointOnPlane, normal) float a = dot(ray.pos, n); float b = dot(ray.dir, n); float t = -(w + a) / b; return vec4(n, t); } void intersectClippingPlanes(in Ray ray, inout Intersections ix) { vec4 backSide = vec4(-ray.dir, -INF_HIT); vec4 farSide = vec4(ray.dir, +INF_HIT); RayShapeIntersection clippingVolume; #if (CLIPPING_PLANES_COUNT == 1) // Union and intersection are the same when there's one clipping plane, and the code // is more simplified. vec4 planeUv = getClippingPlane(u_clippingPlanesTexture, 0, u_clippingPlanesMatrix); vec4 intersection = intersectPlane(ray, planeUv); bool reflects = dot(ray.dir, intersection.xyz) < 0.0; clippingVolume.entry = reflects ? backSide : intersection; clippingVolume.exit = reflects ? intersection : farSide; setShapeIntersection(ix, CLIPPING_PLANES_INTERSECTION_INDEX, clippingVolume); #elif defined(CLIPPING_PLANES_UNION) vec4 firstTransmission = vec4(ray.dir, +INF_HIT); vec4 lastReflection = vec4(-ray.dir, -INF_HIT); for (int i = 0; i < CLIPPING_PLANES_COUNT; i++) { vec4 planeUv = getClippingPlane(u_clippingPlanesTexture, i, u_clippingPlanesMatrix); vec4 intersection = intersectPlane(ray, planeUv); if (dot(ray.dir, planeUv.xyz) > 0.0) { firstTransmission = intersection.w <= firstTransmission.w ? intersection : firstTransmission; } else { lastReflection = intersection.w >= lastReflection.w ? intersection : lastReflection; } } clippingVolume.entry = backSide; clippingVolume.exit = lastReflection; setShapeIntersection(ix, CLIPPING_PLANES_INTERSECTION_INDEX + 0, clippingVolume); clippingVolume.entry = firstTransmission; clippingVolume.exit = farSide; setShapeIntersection(ix, CLIPPING_PLANES_INTERSECTION_INDEX + 1, clippingVolume); #else // intersection vec4 lastTransmission = vec4(ray.dir, -INF_HIT); vec4 firstReflection = vec4(-ray.dir, +INF_HIT); for (int i = 0; i < CLIPPING_PLANES_COUNT; i++) { vec4 planeUv = getClippingPlane(u_clippingPlanesTexture, i, u_clippingPlanesMatrix); vec4 intersection = intersectPlane(ray, planeUv); if (dot(ray.dir, planeUv.xyz) > 0.0) { lastTransmission = intersection.w > lastTransmission.w ? intersection : lastTransmission; } else { firstReflection = intersection.w < firstReflection.w ? intersection: firstReflection; } } if (lastTransmission.w < firstReflection.w) { clippingVolume.entry = lastTransmission; clippingVolume.exit = firstReflection; } else { clippingVolume.entry = vec4(-ray.dir, NO_HIT); clippingVolume.exit = vec4(ray.dir, NO_HIT); } setShapeIntersection(ix, CLIPPING_PLANES_INTERSECTION_INDEX, clippingVolume); #endif } `;var eDi=T(S(),1),rL=`// See IntersectionUtils.glsl for the definitions of Ray, NO_HIT, INF_HIT, // RayShapeIntersection vec4 intersectLongitude(in Ray ray, in float angle, in bool positiveNormal) { float normalSign = positiveNormal ? 1.0 : -1.0; vec2 planeNormal = vec2(-sin(angle), cos(angle)) * normalSign; vec2 position = ray.pos.xy; vec2 direction = ray.dir.xy; float approachRate = dot(direction, planeNormal); float distance = -dot(position, planeNormal); float t = (approachRate == 0.0) ? NO_HIT : distance / approachRate; return vec4(planeNormal, 0.0, t); } RayShapeIntersection intersectHalfSpace(in Ray ray, in float angle, in bool positiveNormal) { vec4 intersection = intersectLongitude(ray, angle, positiveNormal); vec4 farSide = vec4(normalize(ray.dir), INF_HIT); bool hitFront = (intersection.w > 0.0) == (dot(ray.pos.xy, intersection.xy) > 0.0); if (!hitFront) { return RayShapeIntersection(intersection, farSide); } else { return RayShapeIntersection(-1.0 * farSide, intersection); } } void intersectFlippedWedge(in Ray ray, in vec2 minMaxAngle, out RayShapeIntersection intersections[2]) { intersections[0] = intersectHalfSpace(ray, minMaxAngle.x, false); intersections[1] = intersectHalfSpace(ray, minMaxAngle.y, true); } bool hitPositiveHalfPlane(in Ray ray, in vec4 intersection, in bool positiveNormal) { float normalSign = positiveNormal ? 1.0 : -1.0; vec2 planeDirection = vec2(intersection.y, -intersection.x) * normalSign; vec2 hit = ray.pos.xy + intersection.w * ray.dir.xy; return dot(hit, planeDirection) > 0.0; } void intersectHalfPlane(in Ray ray, in float angle, out RayShapeIntersection intersections[2]) { vec4 intersection = intersectLongitude(ray, angle, true); vec4 farSide = vec4(normalize(ray.dir), INF_HIT); if (hitPositiveHalfPlane(ray, intersection, true)) { intersections[0].entry = -1.0 * farSide; intersections[0].exit = vec4(-1.0 * intersection.xy, 0.0, intersection.w); intersections[1].entry = intersection; intersections[1].exit = farSide; } else { vec4 miss = vec4(normalize(ray.dir), NO_HIT); intersections[0].entry = -1.0 * farSide; intersections[0].exit = farSide; intersections[1].entry = miss; intersections[1].exit = miss; } } RayShapeIntersection intersectRegularWedge(in Ray ray, in vec2 minMaxAngle) { // Note: works for maxAngle > minAngle + pi, where the "regular wedge" // is actually a negative volume. // Compute intersections with the two planes. // Normals will point toward the "outside" (negative space) vec4 intersect1 = intersectLongitude(ray, minMaxAngle.x, false); vec4 intersect2 = intersectLongitude(ray, minMaxAngle.y, true); // Choose intersection with smallest T as the "first", the other as "last" // Note: first or last could be in the "shadow" wedge, beyond the tip bool inOrder = intersect1.w <= intersect2.w; vec4 first = inOrder ? intersect1 : intersect2; vec4 last = inOrder ? intersect2 : intersect1; bool firstIsAhead = first.w >= 0.0; bool startedInsideFirst = dot(ray.pos.xy, first.xy) < 0.0; bool exitFromInside = firstIsAhead == startedInsideFirst; bool lastIsAhead = last.w > 0.0; bool startedOutsideLast = dot(ray.pos.xy, last.xy) >= 0.0; bool enterFromOutside = lastIsAhead == startedOutsideLast; vec4 farSide = vec4(normalize(ray.dir), INF_HIT); vec4 miss = vec4(normalize(ray.dir), NO_HIT); if (exitFromInside && enterFromOutside) { // Ray crosses both faces of negative wedge, exiting then entering the positive shape return RayShapeIntersection(first, last); } else if (!exitFromInside && enterFromOutside) { // Ray starts inside wedge. last is in shadow wedge, and first is actually the entry return RayShapeIntersection(-1.0 * farSide, first); } else if (exitFromInside && !enterFromOutside) { // First intersection was in the shadow wedge, so last is actually the exit return RayShapeIntersection(last, farSide); } else { // !exitFromInside && !enterFromOutside // Both intersections were in the shadow wedge return RayShapeIntersection(miss, miss); } } `;var nDi=T(S(),1),T9=`// See IntersectionUtils.glsl for the definitions of Ray, RayShapeIntersection, // NO_HIT, Intersections /* Box defines (set in Scene/VoxelBoxShape.js) #define BOX_INTERSECTION_INDEX ### // always 0 */ uniform vec3 u_renderMinBounds; uniform vec3 u_renderMaxBounds; RayShapeIntersection intersectBox(in Ray ray, in vec3 minBound, in vec3 maxBound) { // Consider the box as the intersection of the space between 3 pairs of parallel planes // Compute the distance along the ray to each plane vec3 t0 = (minBound - ray.pos) / ray.dir; vec3 t1 = (maxBound - ray.pos) / ray.dir; // Identify candidate entries/exits based on distance from ray.pos vec3 entries = min(t0, t1); vec3 exits = max(t0, t1); vec3 directions = sign(ray.dir); // The actual intersection points are the furthest entry and the closest exit float lastEntry = maxComponent(entries); bvec3 isLastEntry = equal(entries, vec3(lastEntry)); vec3 entryNormal = -1.0 * vec3(isLastEntry) * directions; vec4 entry = vec4(entryNormal, lastEntry); float firstExit = minComponent(exits); bvec3 isFirstExit = equal(exits, vec3(firstExit)); vec3 exitNormal = vec3(isLastEntry) * directions; vec4 exit = vec4(exitNormal, firstExit); if (entry.w > exit.w) { entry.w = NO_HIT; exit.w = NO_HIT; } return RayShapeIntersection(entry, exit); } void intersectShape(in Ray ray, inout Intersections ix) { RayShapeIntersection intersection = intersectBox(ray, u_renderMinBounds, u_renderMaxBounds); setShapeIntersection(ix, BOX_INTERSECTION_INDEX, intersection); } `;var oDi=T(S(),1),S9=`// See IntersectionUtils.glsl for the definitions of Ray, NO_HIT, Intersections, // RayShapeIntersection, setSurfaceIntersection, setShapeIntersection, // intersectIntersections // See IntersectLongitude.glsl for the definitions of intersectHalfPlane, // intersectFlippedWedge, intersectRegularWedge /* Cylinder defines (set in Scene/VoxelCylinderShape.js) #define CYLINDER_HAS_RENDER_BOUNDS_RADIUS_MIN #define CYLINDER_HAS_RENDER_BOUNDS_RADIUS_FLAT #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO #define CYLINDER_INTERSECTION_INDEX_RADIUS_MAX #define CYLINDER_INTERSECTION_INDEX_RADIUS_MIN #define CYLINDER_INTERSECTION_INDEX_ANGLE */ // Cylinder uniforms uniform vec2 u_cylinderRenderRadiusMinMax; uniform vec2 u_cylinderRenderHeightMinMax; #if defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE) uniform vec2 u_cylinderRenderAngleMinMax; #endif /** * Find the intersection of a ray with the volume defined by two planes of constant z */ RayShapeIntersection intersectHeightBounds(in Ray ray, in vec2 minMaxHeight, in bool convex) { float zPosition = ray.pos.z; float zDirection = ray.dir.z; float tmin = (minMaxHeight.x - zPosition) / zDirection; float tmax = (minMaxHeight.y - zPosition) / zDirection; // Normals point outside the volume float signFlip = convex ? 1.0 : -1.0; vec4 intersectMin = vec4(0.0, 0.0, -1.0 * signFlip, tmin); vec4 intersectMax = vec4(0.0, 0.0, 1.0 * signFlip, tmax); bool topEntry = zDirection < 0.0; vec4 entry = topEntry ? intersectMax : intersectMin; vec4 exit = topEntry ? intersectMin : intersectMax; return RayShapeIntersection(entry, exit); } /** * Find the intersection of a ray with a right cylindrical surface of a given radius * about the z-axis. */ RayShapeIntersection intersectCylinder(in Ray ray, in float radius, in bool convex) { vec2 position = ray.pos.xy; vec2 direction = ray.dir.xy; float a = dot(direction, direction); float b = dot(position, direction); float c = dot(position, position) - radius * radius; float determinant = b * b - a * c; if (determinant < 0.0) { vec4 miss = vec4(normalize(ray.dir), NO_HIT); return RayShapeIntersection(miss, miss); } determinant = sqrt(determinant); float t1 = (-b - determinant) / a; float t2 = (-b + determinant) / a; float signFlip = convex ? 1.0 : -1.0; vec4 intersect1 = vec4(normalize(position + t1 * direction) * signFlip, 0.0, t1); vec4 intersect2 = vec4(normalize(position + t2 * direction) * signFlip, 0.0, t2); return RayShapeIntersection(intersect1, intersect2); } /** * Find the intersection of a ray with a right cylindrical solid of given * radius and height bounds. NOTE: The shape is assumed to be convex. */ RayShapeIntersection intersectBoundedCylinder(in Ray ray, in float radius, in vec2 minMaxHeight) { RayShapeIntersection cylinderIntersection = intersectCylinder(ray, radius, true); RayShapeIntersection heightBoundsIntersection = intersectHeightBounds(ray, minMaxHeight, true); return intersectIntersections(ray, cylinderIntersection, heightBoundsIntersection); } void intersectShape(Ray ray, inout Intersections ix) { // Position is converted from [0,1] to [-1,+1] because shape intersections assume unit space is [-1,+1]. // Direction is scaled as well to be in sync with position. ray.pos = ray.pos * 2.0 - 1.0; ray.dir *= 2.0; RayShapeIntersection outerIntersect = intersectBoundedCylinder(ray, u_cylinderRenderRadiusMinMax.y, u_cylinderRenderHeightMinMax); setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_RADIUS_MAX, outerIntersect); if (outerIntersect.entry.w == NO_HIT) { return; } #if defined(CYLINDER_HAS_RENDER_BOUNDS_RADIUS_FLAT) // When the cylinder is perfectly thin it's necessary to sandwich the // inner cylinder intersection inside the outer cylinder intersection. // Without this special case, // [outerMin, outerMax, innerMin, innerMax] will bubble sort to // [outerMin, innerMin, outerMax, innerMax] which will cause the back // side of the cylinder to be invisible because it will think the ray // is still inside the inner (negative) cylinder after exiting the // outer (positive) cylinder. // With this special case, // [outerMin, innerMin, innerMax, outerMax] will bubble sort to // [outerMin, innerMin, innerMax, outerMax] which will work correctly. // Note: If initializeIntersections() changes its sorting function // from bubble sort to something else, this code may need to change. RayShapeIntersection innerIntersect = intersectCylinder(ray, 1.0, false); setSurfaceIntersection(ix, 0, outerIntersect.entry, true, true); // positive, enter setSurfaceIntersection(ix, 1, innerIntersect.entry, false, true); // negative, enter setSurfaceIntersection(ix, 2, innerIntersect.exit, false, false); // negative, exit setSurfaceIntersection(ix, 3, outerIntersect.exit, true, false); // positive, exit #elif defined(CYLINDER_HAS_RENDER_BOUNDS_RADIUS_MIN) RayShapeIntersection innerIntersect = intersectCylinder(ray, u_cylinderRenderRadiusMinMax.x, false); setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_RADIUS_MIN, innerIntersect); #endif #if defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF) RayShapeIntersection wedgeIntersect = intersectRegularWedge(ray, u_cylinderRenderAngleMinMax); setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE, wedgeIntersect); #elif defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF) RayShapeIntersection wedgeIntersects[2]; intersectFlippedWedge(ray, u_cylinderRenderAngleMinMax, wedgeIntersects); setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 0, wedgeIntersects[0]); setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 1, wedgeIntersects[1]); #elif defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO) RayShapeIntersection wedgeIntersects[2]; intersectHalfPlane(ray, u_cylinderRenderAngleMinMax.x, wedgeIntersects); setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 0, wedgeIntersects[0]); setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 1, wedgeIntersects[1]); #endif } `;var sDi=T(S(),1),C9=`// See IntersectionUtils.glsl for the definitions of Ray, NO_HIT, INF_HIT, Intersections, // RayShapeIntersection, setSurfaceIntersection, setShapeIntersection // See IntersectLongitude.glsl for the definitions of intersectHalfPlane, // intersectFlippedWedge, intersectRegularWedge /* Ellipsoid defines (set in Scene/VoxelEllipsoidShape.js) #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_UNDER_HALF #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_EQUAL_HALF #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_OVER_HALF #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_UNDER_HALF #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_EQUAL_HALF #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_OVER_HALF #define ELLIPSOID_INTERSECTION_INDEX_LONGITUDE #define ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX #define ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN #define ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MAX #define ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MIN */ #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE) uniform vec2 u_ellipsoidRenderLongitudeMinMax; #endif uniform float u_eccentricitySquared; uniform vec2 u_ellipsoidRenderLatitudeSinMinMax; uniform vec2 u_clipMinMaxHeight; RayShapeIntersection intersectZPlane(in Ray ray, in float z) { float t = -ray.pos.z / ray.dir.z; bool startsOutside = sign(ray.pos.z) == sign(z); bool entry = (t >= 0.0) != startsOutside; vec4 intersect = vec4(0.0, 0.0, z, t); vec4 farSide = vec4(normalize(ray.dir), INF_HIT); if (entry) { return RayShapeIntersection(intersect, farSide); } else { return RayShapeIntersection(-1.0 * farSide, intersect); } } RayShapeIntersection intersectHeight(in Ray ray, in float relativeHeight, in bool convex) { // Scale the ray by the ellipsoid axes to make it a unit sphere // Note: approximating ellipsoid + height as an ellipsoid vec3 radiiCorrection = u_ellipsoidRadiiUv / (u_ellipsoidRadiiUv + relativeHeight); vec3 position = ray.pos * radiiCorrection; vec3 direction = ray.dir * radiiCorrection; float a = dot(direction, direction); // ~ 1.0 (or maybe 4.0 if ray is scaled) float b = dot(direction, position); // roughly inside [-1.0, 1.0] when zoomed in float c = dot(position, position) - 1.0; // ~ 0.0 when zoomed in. float determinant = b * b - a * c; // ~ b * b when zoomed in if (determinant < 0.0) { vec4 miss = vec4(normalize(direction), NO_HIT); return RayShapeIntersection(miss, miss); } determinant = sqrt(determinant); // Compute larger root using standard formula float signB = b < 0.0 ? -1.0 : 1.0; // The other root may suffer from subtractive cancellation in the standard formula. // Compute it from the first root instead. float t1 = (-b - signB * determinant) / a; float t2 = c / (a * t1); float tmin = min(t1, t2); float tmax = max(t1, t2); float directionScale = convex ? 1.0 : -1.0; vec3 d1 = directionScale * normalize(position + tmin * direction); vec3 d2 = directionScale * normalize(position + tmax * direction); return RayShapeIntersection(vec4(d1, tmin), vec4(d2, tmax)); } /** * Given a circular cone around the z-axis, with apex at the origin, * find the parametric distance(s) along a ray where that ray intersects * the cone. * The cone opening angle is described by the squared cosine of * its half-angle (the angle between the Z-axis and the surface) */ vec2 intersectDoubleEndedCone(in Ray ray, in float cosSqrHalfAngle) { vec3 o = ray.pos; vec3 d = ray.dir; float sinSqrHalfAngle = 1.0 - cosSqrHalfAngle; float aSin = d.z * d.z * sinSqrHalfAngle; float aCos = -dot(d.xy, d.xy) * cosSqrHalfAngle; float a = aSin + aCos; float bSin = d.z * o.z * sinSqrHalfAngle; float bCos = -dot(o.xy, d.xy) * cosSqrHalfAngle; float b = bSin + bCos; float cSin = o.z * o.z * sinSqrHalfAngle; float cCos = -dot(o.xy, o.xy) * cosSqrHalfAngle; float c = cSin + cCos; // determinant = b * b - a * c. But bSin * bSin = aSin * cSin. // Avoid subtractive cancellation by expanding to eliminate these terms float determinant = 2.0 * bSin * bCos + bCos * bCos - aSin * cCos - aCos * cSin - aCos * cCos; if (determinant < 0.0) { return vec2(NO_HIT); } else if (a == 0.0) { // Ray is parallel to cone surface return (b == 0.0) ? vec2(NO_HIT) // Ray is on cone surface : vec2(-0.5 * c / b, NO_HIT); } determinant = sqrt(determinant); // Compute larger root using standard formula float signB = b < 0.0 ? -1.0 : 1.0; float t1 = (-b - signB * determinant) / a; // The other root may suffer from subtractive cancellation in the standard formula. // Compute it from the first root instead. float t2 = c / (a * t1); float tmin = min(t1, t2); float tmax = max(t1, t2); return vec2(tmin, tmax); } /** * Given a point on a conical surface, find the surface normal at that point. */ vec3 getConeNormal(in vec3 p, in bool convex) { // Start with radial component pointing toward z-axis vec2 radial = -abs(p.z) * normalize(p.xy); // Z component points toward opening of cone float zSign = (p.z < 0.0) ? -1.0 : 1.0; float z = length(p.xy) * zSign; // Flip normal if shape is convex float flip = (convex) ? -1.0 : 1.0; return normalize(vec3(radial, z) * flip); } /** * Compute the shift between the ellipsoid origin and the apex of a cone of latitude */ float getLatitudeConeShift(in float sinLatitude) { // Find prime vertical radius of curvature: // the distance along the ellipsoid normal to the intersection with the z-axis float x2 = u_eccentricitySquared * sinLatitude * sinLatitude; float primeVerticalRadius = inversesqrt(1.0 - x2); // Compute a shift from the origin to the intersection of the cone with the z-axis return primeVerticalRadius * u_eccentricitySquared * sinLatitude; } void intersectFlippedCone(in Ray ray, in float cosHalfAngle, out RayShapeIntersection intersections[2]) { // Undo the scaling from ellipsoid to sphere ray.pos = ray.pos * u_ellipsoidRadiiUv; ray.dir = ray.dir * u_ellipsoidRadiiUv; // Shift the ray to account for the latitude cone not being centered at the Earth center ray.pos.z += getLatitudeConeShift(cosHalfAngle); float cosSqrHalfAngle = cosHalfAngle * cosHalfAngle; vec2 intersect = intersectDoubleEndedCone(ray, cosSqrHalfAngle); vec4 miss = vec4(normalize(ray.dir), NO_HIT); vec4 farSide = vec4(normalize(ray.dir), INF_HIT); // Initialize output with no intersections intersections[0].entry = -1.0 * farSide; intersections[0].exit = farSide; intersections[1].entry = miss; intersections[1].exit = miss; if (intersect.x == NO_HIT) { return; } // Find the points of intersection float tmin = intersect.x; float tmax = intersect.y; vec3 p0 = ray.pos + tmin * ray.dir; vec3 p1 = ray.pos + tmax * ray.dir; vec4 intersect0 = vec4(getConeNormal(p0, true), tmin); vec4 intersect1 = vec4(getConeNormal(p1, true), tmax); bool p0InShadowCone = sign(p0.z) != sign(cosHalfAngle); bool p1InShadowCone = sign(p1.z) != sign(cosHalfAngle); if (p0InShadowCone && p1InShadowCone) { // no valid intersections } else if (p0InShadowCone) { intersections[0].exit = intersect1; } else if (p1InShadowCone) { intersections[0].entry = intersect0; } else { intersections[0].exit = intersect0; intersections[1].entry = intersect1; intersections[1].exit = farSide; } } RayShapeIntersection intersectRegularCone(in Ray ray, in float cosHalfAngle, in bool convex) { // Undo the scaling from ellipsoid to sphere ray.pos = ray.pos * u_ellipsoidRadiiUv; ray.dir = ray.dir * u_ellipsoidRadiiUv; // Shift the ray to account for the latitude cone not being centered at the Earth center ray.pos.z += getLatitudeConeShift(cosHalfAngle); float cosSqrHalfAngle = cosHalfAngle * cosHalfAngle; vec2 intersect = intersectDoubleEndedCone(ray, cosSqrHalfAngle); vec4 miss = vec4(normalize(ray.dir), NO_HIT); vec4 farSide = vec4(normalize(ray.dir), INF_HIT); if (intersect.x == NO_HIT) { return RayShapeIntersection(miss, miss); } // Find the points of intersection float tmin = intersect.x; float tmax = intersect.y; vec3 p0 = ray.pos + tmin * ray.dir; vec3 p1 = ray.pos + tmax * ray.dir; vec4 intersect0 = vec4(getConeNormal(p0, convex), tmin); vec4 intersect1 = vec4(getConeNormal(p1, convex), tmax); bool p0InShadowCone = sign(p0.z) != sign(cosHalfAngle); bool p1InShadowCone = sign(p1.z) != sign(cosHalfAngle); if (p0InShadowCone && p1InShadowCone) { return RayShapeIntersection(miss, miss); } else if (p0InShadowCone) { return RayShapeIntersection(intersect1, farSide); } else if (p1InShadowCone) { return RayShapeIntersection(-1.0 * farSide, intersect0); } else { return RayShapeIntersection(intersect0, intersect1); } } void intersectShape(in Ray ray, inout Intersections ix) { // Position is converted from [0,1] to [-1,+1] because shape intersections assume unit space is [-1,+1]. // Direction is scaled as well to be in sync with position. ray.pos = ray.pos * 2.0 - 1.0; ray.dir *= 2.0; // Outer ellipsoid RayShapeIntersection outerIntersect = intersectHeight(ray, u_clipMinMaxHeight.y, true); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MAX, outerIntersect); // Exit early if the outer ellipsoid was missed. if (outerIntersect.entry.w == NO_HIT) { return; } // Inner ellipsoid RayShapeIntersection innerIntersect = intersectHeight(ray, u_clipMinMaxHeight.x, false); if (innerIntersect.entry.w == NO_HIT) { setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MIN, innerIntersect); } else { // When the ellipsoid is large and thin it's possible for floating point math // to cause the ray to intersect the inner ellipsoid before the outer ellipsoid. // To prevent this from happening, clamp innerIntersect to outerIntersect and // sandwich the inner ellipsoid intersection inside the outer ellipsoid intersection. // Without this special case, // [outerMin, outerMax, innerMin, innerMax] will bubble sort to // [outerMin, innerMin, outerMax, innerMax] which will cause the back // side of the ellipsoid to be invisible because it will think the ray // is still inside the inner (negative) ellipsoid after exiting the // outer (positive) ellipsoid. // With this special case, // [outerMin, innerMin, innerMax, outerMax] will bubble sort to // [outerMin, innerMin, innerMax, outerMax] which will work correctly. // Note: If initializeIntersections() changes its sorting function // from bubble sort to something else, this code may need to change. innerIntersect.entry.w = max(innerIntersect.entry.w, outerIntersect.entry.w); innerIntersect.exit.w = min(innerIntersect.exit.w, outerIntersect.exit.w); setSurfaceIntersection(ix, 0, outerIntersect.entry, true, true); // positive, enter setSurfaceIntersection(ix, 1, innerIntersect.entry, false, true); // negative, enter setSurfaceIntersection(ix, 2, innerIntersect.exit, false, false); // negative, exit setSurfaceIntersection(ix, 3, outerIntersect.exit, true, false); // positive, exit } // Bottom cone #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_UNDER_HALF) RayShapeIntersection bottomConeIntersection = intersectRegularCone(ray, u_ellipsoidRenderLatitudeSinMinMax.x, false); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN, bottomConeIntersection); #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_EQUAL_HALF) RayShapeIntersection bottomConeIntersection = intersectZPlane(ray, -1.0); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN, bottomConeIntersection); #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_OVER_HALF) RayShapeIntersection bottomConeIntersections[2]; intersectFlippedCone(ray, u_ellipsoidRenderLatitudeSinMinMax.x, bottomConeIntersections); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN + 0, bottomConeIntersections[0]); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN + 1, bottomConeIntersections[1]); #endif // Top cone #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF) RayShapeIntersection topConeIntersections[2]; intersectFlippedCone(ray, u_ellipsoidRenderLatitudeSinMinMax.y, topConeIntersections); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX + 0, topConeIntersections[0]); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX + 1, topConeIntersections[1]); #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_EQUAL_HALF) RayShapeIntersection topConeIntersection = intersectZPlane(ray, 1.0); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX, topConeIntersection); #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_OVER_HALF) RayShapeIntersection topConeIntersection = intersectRegularCone(ray, u_ellipsoidRenderLatitudeSinMinMax.y, false); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX, topConeIntersection); #endif // Wedge #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO) RayShapeIntersection wedgeIntersects[2]; intersectHalfPlane(ray, u_ellipsoidRenderLongitudeMinMax.x, wedgeIntersects); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 0, wedgeIntersects[0]); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 1, wedgeIntersects[1]); #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_UNDER_HALF) RayShapeIntersection wedgeIntersect = intersectRegularWedge(ray, u_ellipsoidRenderLongitudeMinMax); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE, wedgeIntersect); #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF) RayShapeIntersection wedgeIntersects[2]; intersectFlippedWedge(ray, u_ellipsoidRenderLongitudeMinMax, wedgeIntersects); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 0, wedgeIntersects[0]); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 1, wedgeIntersects[1]); #endif } `;var cDi=T(S(),1),QT=`// Main intersection function for Voxel scenes. // See IntersectBox.glsl, IntersectCylinder.glsl, or IntersectEllipsoid.glsl // for the definition of intersectShape. The appropriate function is selected // based on the VoxelPrimitive shape type, and added to the shader in // Scene/VoxelRenderResources.js. // See also IntersectClippingPlane.glsl and IntersectDepth.glsl. // See IntersectionUtils.glsl for the definitions of Ray, NO_HIT, // getFirstIntersection, initializeIntersections, nextIntersection. /* Intersection defines (set in Scene/VoxelRenderResources.js) #define INTERSECTION_COUNT ### */ RayShapeIntersection intersectScene(in vec2 screenCoord, in Ray ray, out Intersections ix) { // Do a ray-shape intersection to find the exact starting and ending points. intersectShape(ray, ix); // Exit early if the positive shape was completely missed or behind the ray. RayShapeIntersection intersection = getFirstIntersection(ix); if (intersection.entry.w == NO_HIT) { // Positive shape was completely missed - so exit early. return intersection; } // Clipping planes #if defined(CLIPPING_PLANES) intersectClippingPlanes(ray, ix); #endif // Depth #if defined(DEPTH_TEST) intersectDepth(screenCoord, ray, ix); #endif // Find the first intersection that's in front of the ray #if (INTERSECTION_COUNT > 1) initializeIntersections(ix); for (int i = 0; i < INTERSECTION_COUNT; ++i) { intersection = nextIntersection(ix); if (intersection.exit.w > 0.0) { // Set start to 0.0 when ray is inside the shape. intersection.entry.w = max(intersection.entry.w, 0.0); break; } } #else // Set start to 0.0 when ray is inside the shape. intersection.entry.w = max(intersection.entry.w, 0.0); #endif return intersection; } `;var dDi=T(S(),1),V9=`/* Box defines (set in Scene/VoxelBoxShape.js) #define BOX_HAS_SHAPE_BOUNDS */ #if defined(BOX_HAS_SHAPE_BOUNDS) uniform vec3 u_boxUvToShapeUvScale; uniform vec3 u_boxUvToShapeUvTranslate; #endif PointJacobianT convertUvToShapeSpaceDerivative(in vec3 positionUv) { // For BOX, UV space = shape space, so we can use positionUv as-is, // and the Jacobian is the identity matrix, except that a step of 1 // only spans half the shape space [-1, 1], so the identity is scaled. return PointJacobianT(positionUv, mat3(0.5)); } vec3 convertShapeToShapeUvSpace(in vec3 positionShape) { #if defined(BOX_HAS_SHAPE_BOUNDS) return positionShape * u_boxUvToShapeUvScale + u_boxUvToShapeUvTranslate; #else return positionShape; #endif } PointJacobianT convertUvToShapeUvSpaceDerivative(in vec3 positionUv) { PointJacobianT pointJacobian = convertUvToShapeSpaceDerivative(positionUv); pointJacobian.point = convertShapeToShapeUvSpace(pointJacobian.point); return pointJacobian; } vec3 convertShapeUvToUvSpace(in vec3 shapeUv) { #if defined(BOX_HAS_SHAPE_BOUNDS) return (shapeUv - u_boxUvToShapeUvTranslate) / u_boxUvToShapeUvScale; #else return shapeUv; #endif } vec3 scaleShapeUvToShapeSpace(in vec3 shapeUv) { #if defined(BOX_HAS_SHAPE_BOUNDS) return shapeUv / u_boxUvToShapeUvScale; #else return shapeUv; #endif }`;var mDi=T(S(),1),L9=`/* Cylinder defines (set in Scene/VoxelCylinderShape.js) #define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS #define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED */ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS) uniform vec2 u_cylinderUvToShapeUvRadius; // x = scale, y = offset #endif #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT) uniform vec2 u_cylinderUvToShapeUvHeight; // x = scale, y = offset #endif #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE) uniform vec2 u_cylinderUvToShapeUvAngle; // x = scale, y = offset #endif #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY) || defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY) uniform vec2 u_cylinderShapeUvAngleMinMax; #endif #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY) || defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY) || defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED) uniform float u_cylinderShapeUvAngleRangeZeroMid; #endif PointJacobianT convertUvToShapeSpaceDerivative(in vec3 positionUv) { // Convert from Cartesian UV space [0, 1] to Cartesian local space [-1, 1] vec3 position = positionUv * 2.0 - 1.0; float radius = length(position.xy); // [0, 1] vec3 radial = normalize(vec3(position.xy, 0.0)); // Shape space height is defined within [0, 1] float height = positionUv.z; // [0, 1] vec3 z = vec3(0.0, 0.0, 1.0); float angle = atan(position.y, position.x); vec3 east = normalize(vec3(-position.y, position.x, 0.0)); vec3 point = vec3(radius, height, angle); mat3 jacobianT = mat3(radial, z, east / length(position.xy)); return PointJacobianT(point, jacobianT); } vec3 convertShapeToShapeUvSpace(in vec3 positionShape) { float radius = positionShape.x; #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS) radius = radius * u_cylinderUvToShapeUvRadius.x + u_cylinderUvToShapeUvRadius.y; #endif float height = positionShape.y; #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT) height = height * u_cylinderUvToShapeUvHeight.x + u_cylinderUvToShapeUvHeight.y; #endif float angle = (positionShape.z + czm_pi) / czm_twoPi; #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE) #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED) // Comparing against u_cylinderShapeUvAngleMinMax has precision problems. u_cylinderShapeUvAngleRangeZeroMid is more conservative. angle += float(angle < u_cylinderShapeUvAngleRangeZeroMid); #endif // Avoid flickering from reading voxels from both sides of the -pi/+pi discontinuity. #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY) angle = angle > u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.x : angle; #elif defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY) angle = angle < u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.y : angle; #endif angle = angle * u_cylinderUvToShapeUvAngle.x + u_cylinderUvToShapeUvAngle.y; #endif return vec3(radius, height, angle); } PointJacobianT convertUvToShapeUvSpaceDerivative(in vec3 positionUv) { PointJacobianT pointJacobian = convertUvToShapeSpaceDerivative(positionUv); pointJacobian.point = convertShapeToShapeUvSpace(pointJacobian.point); return pointJacobian; } vec3 scaleShapeUvToShapeSpace(in vec3 shapeUv) { float radius = shapeUv.x; #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS) radius /= u_cylinderUvToShapeUvRadius.x; #endif float height = shapeUv.y; #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT) height /= u_cylinderUvToShapeUvHeight.x; #endif float angle = shapeUv.z * czm_twoPi; #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE) angle /= u_cylinderUvToShapeUvAngle.x; #endif return vec3(radius, height, angle); } `;var fDi=T(S(),1),R9=`/* Ellipsoid defines (set in Scene/VoxelEllipsoidShape.js) #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY #define ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE #define ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED #define ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE */ uniform vec3 u_ellipsoidRadiiUv; // [0,1] uniform vec2 u_evoluteScale; // (radiiUv.x ^ 2 - radiiUv.z ^ 2) * vec2(1.0, -1.0) / radiiUv; uniform vec3 u_ellipsoidInverseRadiiSquaredUv; #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY) || defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY) || defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED) uniform vec3 u_ellipsoidShapeUvLongitudeMinMaxMid; #endif #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE) uniform vec2 u_ellipsoidUvToShapeUvLongitude; // x = scale, y = offset #endif #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE) uniform vec2 u_ellipsoidUvToShapeUvLatitude; // x = scale, y = offset #endif uniform float u_ellipsoidInverseHeightDifferenceUv; // robust iterative solution without trig functions // https://github.com/0xfaded/ellipse_demo/issues/1 // https://stackoverflow.com/questions/22959698/distance-from-given-point-to-given-ellipse // Extended to return radius of curvature along with the point vec3 nearestPointAndRadiusOnEllipse(vec2 pos, vec2 radii) { vec2 p = abs(pos); vec2 inverseRadii = 1.0 / radii; // We describe the ellipse parametrically: v = radii * vec2(cos(t), sin(t)) // but store the cos and sin of t in a vec2 for efficiency. // Initial guess: t = pi/4 vec2 tTrigs = vec2(0.7071067811865476); // Initial guess of point on ellipsoid vec2 v = radii * tTrigs; // Center of curvature of the ellipse at v vec2 evolute = u_evoluteScale * tTrigs * tTrigs * tTrigs; const int iterations = 3; for (int i = 0; i < iterations; ++i) { // Find the (approximate) intersection of p - evolute with the ellipsoid. vec2 q = normalize(p - evolute) * length(v - evolute); // Update the estimate of t. tTrigs = (q + evolute) * inverseRadii; tTrigs = normalize(clamp(tTrigs, 0.0, 1.0)); v = radii * tTrigs; evolute = u_evoluteScale * tTrigs * tTrigs * tTrigs; } return vec3(v * sign(pos), length(v - evolute)); } PointJacobianT convertUvToShapeSpaceDerivative(in vec3 positionUv) { // Convert from UV space [0, 1] to local space [-1, 1] vec3 position = positionUv * 2.0 - 1.0; // Undo the scaling from ellipsoid to sphere position = position * u_ellipsoidRadiiUv; float longitude = atan(position.y, position.x); vec3 east = normalize(vec3(-position.y, position.x, 0.0)); // Convert the 3D position to a 2D position relative to the ellipse (radii.x, radii.z) // (assume radii.y == radii.x) and find the nearest point on the ellipse and its normal float distanceFromZAxis = length(position.xy); vec2 posEllipse = vec2(distanceFromZAxis, position.z); vec3 surfacePointAndRadius = nearestPointAndRadiusOnEllipse(posEllipse, u_ellipsoidRadiiUv.xz); vec2 surfacePoint = surfacePointAndRadius.xy; vec2 normal2d = normalize(surfacePoint * u_ellipsoidInverseRadiiSquaredUv.xz); float latitude = atan(normal2d.y, normal2d.x); vec3 north = vec3(-normal2d.y * normalize(position.xy), abs(normal2d.x)); float heightSign = length(posEllipse) < length(surfacePoint) ? -1.0 : 1.0; float height = heightSign * length(posEllipse - surfacePoint); vec3 up = normalize(cross(east, north)); vec3 point = vec3(longitude, latitude, height); mat3 jacobianT = mat3(east / distanceFromZAxis, north / (surfacePointAndRadius.z + height), up); return PointJacobianT(point, jacobianT); } vec3 convertShapeToShapeUvSpace(in vec3 positionShape) { // Longitude: shift & scale to [0, 1] float longitude = (positionShape.x + czm_pi) / czm_twoPi; // Correct the angle when max < min // Technically this should compare against min longitude - but it has precision problems so compare against the middle of empty space. #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED) longitude += float(longitude < u_ellipsoidShapeUvLongitudeMinMaxMid.z); #endif // Avoid flickering from reading voxels from both sides of the -pi/+pi discontinuity. #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY) longitude = longitude > u_ellipsoidShapeUvLongitudeMinMaxMid.z ? u_ellipsoidShapeUvLongitudeMinMaxMid.x : longitude; #endif #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY) longitude = longitude < u_ellipsoidShapeUvLongitudeMinMaxMid.z ? u_ellipsoidShapeUvLongitudeMinMaxMid.y : longitude; #endif #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE) longitude = longitude * u_ellipsoidUvToShapeUvLongitude.x + u_ellipsoidUvToShapeUvLongitude.y; #endif // Latitude: shift and scale to [0, 1] float latitude = (positionShape.y + czm_piOverTwo) / czm_pi; #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE) latitude = latitude * u_ellipsoidUvToShapeUvLatitude.x + u_ellipsoidUvToShapeUvLatitude.y; #endif // Height: scale to the range [0, 1] float height = 1.0 + positionShape.z * u_ellipsoidInverseHeightDifferenceUv; return vec3(longitude, latitude, height); } PointJacobianT convertUvToShapeUvSpaceDerivative(in vec3 positionUv) { PointJacobianT pointJacobian = convertUvToShapeSpaceDerivative(positionUv); pointJacobian.point = convertShapeToShapeUvSpace(pointJacobian.point); return pointJacobian; } vec3 scaleShapeUvToShapeSpace(in vec3 shapeUv) { // Convert from [0, 1] to radians [-pi, pi] float longitude = shapeUv.x * czm_twoPi; #if defined (ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE) longitude /= u_ellipsoidUvToShapeUvLongitude.x; #endif // Convert from [0, 1] to radians [-pi/2, pi/2] float latitude = shapeUv.y * czm_pi; #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE) latitude /= u_ellipsoidUvToShapeUvLatitude.x; #endif float height = shapeUv.z / u_ellipsoidInverseHeightDifferenceUv; return vec3(longitude, latitude, height); } `;var bDi=T(S(),1),Z9=`// These octree flags must be in sync with GpuOctreeFlag in VoxelTraversal.js #define OCTREE_FLAG_INTERNAL 0 #define OCTREE_FLAG_LEAF 1 #define OCTREE_FLAG_PACKED_LEAF_FROM_PARENT 2 #define OCTREE_MAX_LEVELS 32 // Harcoded value because GLSL doesn't like variable length loops uniform sampler2D u_octreeInternalNodeTexture; uniform vec2 u_octreeInternalNodeTexelSizeUv; uniform int u_octreeInternalNodeTilesPerRow; #if (SAMPLE_COUNT > 1) uniform sampler2D u_octreeLeafNodeTexture; uniform vec2 u_octreeLeafNodeTexelSizeUv; uniform int u_octreeLeafNodeTilesPerRow; #endif struct OctreeNodeData { int data; int flag; }; struct TraversalData { ivec4 octreeCoords; int parentOctreeIndex; }; struct SampleData { int megatextureIndex; ivec4 tileCoords; vec3 tileUv; #if (SAMPLE_COUNT > 1) float weight; #endif }; // Integer mod: For WebGL1 only int intMod(in int a, in int b) { return a - (b * (a / b)); } int normU8_toInt(in float value) { return int(value * 255.0); } int normU8x2_toInt(in vec2 value) { return int(value.x * 255.0) + 256 * int(value.y * 255.0); } float normU8x2_toFloat(in vec2 value) { return float(normU8x2_toInt(value)) / 65535.0; } OctreeNodeData getOctreeNodeData(in vec2 octreeUv) { vec4 texData = texture(u_octreeInternalNodeTexture, octreeUv); OctreeNodeData data; data.data = normU8x2_toInt(texData.xy); data.flag = normU8x2_toInt(texData.zw); return data; } OctreeNodeData getOctreeChildData(in int parentOctreeIndex, in ivec3 childCoord) { int childIndex = childCoord.z * 4 + childCoord.y * 2 + childCoord.x; int octreeCoordX = intMod(parentOctreeIndex, u_octreeInternalNodeTilesPerRow) * 9 + 1 + childIndex; int octreeCoordY = parentOctreeIndex / u_octreeInternalNodeTilesPerRow; vec2 octreeUv = u_octreeInternalNodeTexelSizeUv * vec2(float(octreeCoordX) + 0.5, float(octreeCoordY) + 0.5); return getOctreeNodeData(octreeUv); } int getOctreeParentIndex(in int octreeIndex) { int octreeCoordX = intMod(octreeIndex, u_octreeInternalNodeTilesPerRow) * 9; int octreeCoordY = octreeIndex / u_octreeInternalNodeTilesPerRow; vec2 octreeUv = u_octreeInternalNodeTexelSizeUv * vec2(float(octreeCoordX) + 0.5, float(octreeCoordY) + 0.5); vec4 parentData = texture(u_octreeInternalNodeTexture, octreeUv); int parentOctreeIndex = normU8x2_toInt(parentData.xy); return parentOctreeIndex; } /** * Convert a position in the uv-space of the tileset bounding shape * into the uv-space of a tile within the tileset */ vec3 getTileUv(in vec3 shapePosition, in ivec4 octreeCoords) { // PERFORMANCE_IDEA: use bit-shifting (only in WebGL2) float dimAtLevel = exp2(float(octreeCoords.w)); return shapePosition * dimAtLevel - vec3(octreeCoords.xyz); } vec3 getClampedTileUv(in vec3 shapePosition, in ivec4 octreeCoords) { vec3 tileUv = getTileUv(shapePosition, octreeCoords); return clamp(tileUv, vec3(0.0), vec3(1.0)); } void getOctreeLeafSampleData(in OctreeNodeData data, in ivec4 octreeCoords, out SampleData sampleData) { sampleData.megatextureIndex = data.data; sampleData.tileCoords = (data.flag == OCTREE_FLAG_PACKED_LEAF_FROM_PARENT) ? ivec4(octreeCoords.xyz / 2, octreeCoords.w - 1) : octreeCoords; } #if (SAMPLE_COUNT > 1) void getOctreeLeafSampleDatas(in OctreeNodeData data, in ivec4 octreeCoords, out SampleData sampleDatas[SAMPLE_COUNT]) { int leafIndex = data.data; int leafNodeTexelCount = 2; // Adding 0.5 moves to the center of the texel float leafCoordXStart = float(intMod(leafIndex, u_octreeLeafNodeTilesPerRow) * leafNodeTexelCount) + 0.5; float leafCoordY = float(leafIndex / u_octreeLeafNodeTilesPerRow) + 0.5; // Get an interpolation weight and a flag to determine whether to read the parent texture vec2 leafUv0 = u_octreeLeafNodeTexelSizeUv * vec2(leafCoordXStart + 0.0, leafCoordY); vec4 leafData0 = texture(u_octreeLeafNodeTexture, leafUv0); float lerp = normU8x2_toFloat(leafData0.xy); sampleDatas[0].weight = 1.0 - lerp; sampleDatas[1].weight = lerp; // TODO: this looks wrong? Should be comparing to OCTREE_FLAG_PACKED_LEAF_FROM_PARENT sampleDatas[0].tileCoords = (normU8_toInt(leafData0.z) == 1) ? ivec4(octreeCoords.xyz / 2, octreeCoords.w - 1) : octreeCoords; sampleDatas[1].tileCoords = (normU8_toInt(leafData0.w) == 1) ? ivec4(octreeCoords.xyz / 2, octreeCoords.w - 1) : octreeCoords; // Get megatexture indices for both samples vec2 leafUv1 = u_octreeLeafNodeTexelSizeUv * vec2(leafCoordXStart + 1.0, leafCoordY); vec4 leafData1 = texture(u_octreeLeafNodeTexture, leafUv1); sampleDatas[0].megatextureIndex = normU8x2_toInt(leafData1.xy); sampleDatas[1].megatextureIndex = normU8x2_toInt(leafData1.zw); } #endif OctreeNodeData traverseOctreeDownwards(in vec3 shapePosition, inout TraversalData traversalData) { float sizeAtLevel = exp2(-1.0 * float(traversalData.octreeCoords.w)); vec3 start = vec3(traversalData.octreeCoords.xyz) * sizeAtLevel; vec3 end = start + vec3(sizeAtLevel); OctreeNodeData childData; for (int i = 0; i < OCTREE_MAX_LEVELS; ++i) { // Find out which octree child contains the position // 0 if before center, 1 if after vec3 center = 0.5 * (start + end); vec3 childCoord = step(center, shapePosition); // Get octree coords for the next level down ivec4 octreeCoords = traversalData.octreeCoords; traversalData.octreeCoords = ivec4(octreeCoords.xyz * 2 + ivec3(childCoord), octreeCoords.w + 1); childData = getOctreeChildData(traversalData.parentOctreeIndex, ivec3(childCoord)); if (childData.flag != OCTREE_FLAG_INTERNAL) { // leaf tile - stop traversing break; } // interior tile - keep going deeper start = mix(start, center, childCoord); end = mix(center, end, childCoord); traversalData.parentOctreeIndex = childData.data; } return childData; } /** * Transform a given position to an octree tile coordinate and a position within that tile, * and find the corresponding megatexture index and texture coordinates */ void traverseOctreeFromBeginning(in vec3 shapePosition, out TraversalData traversalData, out SampleData sampleDatas[SAMPLE_COUNT]) { traversalData.octreeCoords = ivec4(0); traversalData.parentOctreeIndex = 0; OctreeNodeData nodeData = getOctreeNodeData(vec2(0.0)); if (nodeData.flag != OCTREE_FLAG_LEAF) { nodeData = traverseOctreeDownwards(shapePosition, traversalData); } #if (SAMPLE_COUNT == 1) getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]); sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords); #else getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas); sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords); sampleDatas[1].tileUv = getClampedTileUv(shapePosition, sampleDatas[1].tileCoords); #endif } bool inRange(in vec3 v, in vec3 minVal, in vec3 maxVal) { return clamp(v, minVal, maxVal) == v; } bool insideTile(in vec3 shapePosition, in ivec4 octreeCoords) { vec3 tileUv = getTileUv(shapePosition, octreeCoords); bool inside = inRange(tileUv, vec3(0.0), vec3(1.0)); // Assume (!) the position is always inside the root tile. return inside || octreeCoords.w == 0; } void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData traversalData, inout SampleData sampleDatas[SAMPLE_COUNT]) { if (insideTile(shapePosition, traversalData.octreeCoords)) { for (int i = 0; i < SAMPLE_COUNT; i++) { sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords); } return; } // Go up tree until we find a parent tile containing shapePosition for (int i = 0; i < OCTREE_MAX_LEVELS; ++i) { traversalData.octreeCoords.xyz /= 2; traversalData.octreeCoords.w -= 1; if (insideTile(shapePosition, traversalData.octreeCoords)) { break; } traversalData.parentOctreeIndex = getOctreeParentIndex(traversalData.parentOctreeIndex); } // Go down tree OctreeNodeData nodeData = traverseOctreeDownwards(shapePosition, traversalData); #if (SAMPLE_COUNT == 1) getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]); sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords); #else getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas); sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords); sampleDatas[1].tileUv = getClampedTileUv(shapePosition, sampleDatas[1].tileCoords); #endif } `;var yDi=T(S(),1),G9=`// See Octree.glsl for the definitions of SampleData and intMod /* Megatexture defines (set in Scene/VoxelRenderResources.js) #define SAMPLE_COUNT ### #define NEAREST_SAMPLING #define PADDING */ uniform ivec2 u_megatextureSliceDimensions; // number of slices per tile, in two dimensions uniform ivec2 u_megatextureTileDimensions; // number of tiles per megatexture, in two dimensions uniform vec2 u_megatextureVoxelSizeUv; uniform vec2 u_megatextureSliceSizeUv; uniform vec2 u_megatextureTileSizeUv; uniform ivec3 u_dimensions; // does not include padding #if defined(PADDING) uniform ivec3 u_paddingBefore; uniform ivec3 u_paddingAfter; #endif // Integer min, max, clamp: For WebGL1 only int intMin(int a, int b) { return a <= b ? a : b; } int intMax(int a, int b) { return a >= b ? a : b; } int intClamp(int v, int minVal, int maxVal) { return intMin(intMax(v, minVal), maxVal); } vec2 index1DTo2DTexcoord(int index, ivec2 dimensions, vec2 uvScale) { int indexX = intMod(index, dimensions.x); int indexY = index / dimensions.x; return vec2(indexX, indexY) * uvScale; } /* How is 3D data stored in a 2D megatexture? In this example there is only one loaded tile and it has 2x2x2 voxels (8 voxels total). The data is sliced by Z. The data at Z = 0 is placed in texels (0,0), (0,1), (1,0), (1,1) and the data at Z = 1 is placed in texels (2,0), (2,1), (3,0), (3,1). Note that there could be empty space in the megatexture because it's a power of two. 0 1 2 3 +---+---+---+---+ | | | | | 3 +---+---+---+---+ | | | | | 2 +-------+-------+ |010|110|011|111| 1 |--- ---|--- ---| |000|100|001|101| 0 +-------+-------+ When doing linear interpolation the megatexture needs to be sampled twice: once for the Z slice above the voxel coordinate and once for the slice below. The two slices are interpolated with fract(coord.z - 0.5). For example, a Z coordinate of 1.0 is halfway between two Z slices so the interpolation factor is 0.5. Below is a side view of the 3D voxel grid with voxel coordinates on the left side. 2 +---+ |001| 1 +-z-+ |000| 0 +---+ When doing nearest neighbor the megatexture only needs to be sampled once at the closest Z slice. */ Properties getPropertiesFromMegatexture(in SampleData sampleData) { int tileIndex = sampleData.megatextureIndex; vec3 voxelCoord = sampleData.tileUv * vec3(u_dimensions); ivec3 voxelDimensions = u_dimensions; #if defined(PADDING) voxelDimensions += u_paddingBefore + u_paddingAfter; voxelCoord += vec3(u_paddingBefore); #endif #if defined(NEAREST_SAMPLING) // Round to the center of the nearest voxel voxelCoord = floor(voxelCoord) + vec3(0.5); #endif // Tile location vec2 tileUvOffset = index1DTo2DTexcoord(tileIndex, u_megatextureTileDimensions, u_megatextureTileSizeUv); // Slice location float slice = voxelCoord.z - 0.5; int sliceIndex = int(floor(slice)); int sliceIndex0 = intClamp(sliceIndex, 0, voxelDimensions.z - 1); vec2 sliceUvOffset0 = index1DTo2DTexcoord(sliceIndex0, u_megatextureSliceDimensions, u_megatextureSliceSizeUv); // Voxel location vec2 voxelUvOffset = clamp(voxelCoord.xy, vec2(0.5), vec2(voxelDimensions.xy) - vec2(0.5)) * u_megatextureVoxelSizeUv; // Final location in the megatexture vec2 uv0 = tileUvOffset + sliceUvOffset0 + voxelUvOffset; #if defined(NEAREST_SAMPLING) return getPropertiesFromMegatextureAtUv(uv0); #else float sliceLerp = fract(slice); int sliceIndex1 = intMin(sliceIndex + 1, voxelDimensions.z - 1); vec2 sliceUvOffset1 = index1DTo2DTexcoord(sliceIndex1, u_megatextureSliceDimensions, u_megatextureSliceSizeUv); vec2 uv1 = tileUvOffset + sliceUvOffset1 + voxelUvOffset; Properties properties0 = getPropertiesFromMegatextureAtUv(uv0); Properties properties1 = getPropertiesFromMegatextureAtUv(uv1); return mixProperties(properties0, properties1, sliceLerp); #endif } // Convert an array of sample datas to a final weighted properties. Properties accumulatePropertiesFromMegatexture(in SampleData sampleDatas[SAMPLE_COUNT]) { #if (SAMPLE_COUNT == 1) return getPropertiesFromMegatexture(sampleDatas[0]); #else // When more than one sample is taken the accumulator needs to start at 0 Properties properties = clearProperties(); for (int i = 0; i < SAMPLE_COUNT; ++i) { float weight = sampleDatas[i].weight; // Avoid reading the megatexture when the weight is 0 as it can be costly. if (weight > 0.0) { Properties tempProperties = getPropertiesFromMegatexture(sampleDatas[i]); tempProperties = scaleProperties(tempProperties, weight); properties = sumProperties(properties, tempProperties); } } return properties; #endif } `;function E0t(e){let t=new O_;this.shaderBuilder=t;let n=e._customShader,i=xt(e._uniformMap,n.uniformMap);e._uniformMap=i;let o=n.uniforms;for(let p in o)if(o.hasOwnProperty(p)){let g=o[p];t.addUniform(g.type,p,xe.FRAGMENT)}t.addUniform("sampler2D","u_megatextureTextures[METADATA_COUNT]",xe.FRAGMENT),this.uniformMap=i;let r=e._clippingPlanes,s=l(r)&&r.enabled?r.length:0;this.clippingPlanes=r,this.clippingPlanesLength=s,t.addVertexLines([g9]),t.addFragmentLines([n.fragmentShaderText,"#line 0",Z9,p9,y9,G9]),s>0&&(t.addDefine("CLIPPING_PLANES",void 0,xe.FRAGMENT),t.addDefine("CLIPPING_PLANES_COUNT",s,xe.FRAGMENT),r.unionClippingRegions&&t.addDefine("CLIPPING_PLANES_UNION",void 0,xe.FRAGMENT),t.addFragmentLines([_9])),e._depthTest&&(t.addDefine("DEPTH_TEST",void 0,xe.FRAGMENT),t.addFragmentLines([x9]));let a=e._provider.shape;a==="BOX"?t.addFragmentLines([V9,T9,QT]):a==="CYLINDER"?t.addFragmentLines([L9,rL,S9,QT]):a==="ELLIPSOID"&&(t.addDefine("SHAPE_ELLIPSOID",void 0,xe.FRAGMENT),t.addFragmentLines([R9,rL,C9,QT])),t.addFragmentLines([b9]);let c=e._shape,d=c.shaderDefines;for(let p in d)if(d.hasOwnProperty(p)){let g=d[p];l(g)&&(g=g===!0?void 0:g,t.addDefine(p,g,xe.FRAGMENT))}let u=c.shaderMaximumIntersectionsLength;s>0&&(t.addDefine("CLIPPING_PLANES_INTERSECTION_INDEX",u,xe.FRAGMENT),s===1?u+=1:r.unionClippingRegions?u+=2:u+=1),e._depthTest&&(t.addDefine("DEPTH_INTERSECTION_INDEX",u,xe.FRAGMENT),u+=1),t.addDefine("INTERSECTION_COUNT",u,xe.FRAGMENT),(!h.equals(e.paddingBefore,h.ZERO)||!h.equals(e.paddingAfter,h.ZERO))&&t.addDefine("PADDING",void 0,xe.FRAGMENT),e._useLogDepth&&t.addDefine("LOG_DEPTH_READ_ONLY",void 0,xe.FRAGMENT),e._jitter&&t.addDefine("JITTER",void 0,xe.FRAGMENT),e._nearestSampling&&t.addDefine("NEAREST_SAMPLING",void 0,xe.FRAGMENT);let m=e._traversal;t.addDefine("SAMPLE_COUNT",`${m._sampleCount}`,xe.FRAGMENT)}var E9=E0t;var HDi=T(S(),1);function X0t(e,t){let{shaderBuilder:n}=e,{names:i,types:o,componentTypes:r,minimumValues:s,maximumValues:a}=t._provider,c=o.length,d=l(s)&&l(a);n.addDefine("METADATA_COUNT",c,xe.FRAGMENT),d&&n.addDefine("STATISTICS",void 0,xe.FRAGMENT);for(let P=0;P<c;P++){let F=i[P],A=o[P],b=`PropertyStatistics_${F}`,R=`PropertyStatistics_${F}`;n.addStruct(b,R,xe.FRAGMENT);let E=x3(A);n.addStructField(b,E,"min"),n.addStructField(b,E,"max")}let u="Statistics",m="Statistics",p="statistics";n.addStruct(u,m,xe.FRAGMENT);for(let P=0;P<c;P++){let F=i[P],A=`PropertyStatistics_${F}`,b=F;n.addStructField(u,A,b)}let g="Metadata",f="Metadata",x="metadata";n.addStruct(g,f,xe.FRAGMENT),n.addStructField(g,m,p);for(let P=0;P<c;P++){let F=i[P],A=o[P],b=x3(A);n.addStructField(g,b,F)}for(let P=0;P<c;P++){let F=i[P],A=o[P],b=W0t(A),R=`VoxelProperty_${F}`,E=`VoxelProperty_${F}`;n.addStruct(R,E,xe.FRAGMENT),n.addStructField(R,b,"partialDerivativeLocal"),n.addStructField(R,b,"partialDerivativeWorld"),n.addStructField(R,b,"partialDerivativeView"),n.addStructField(R,b,"partialDerivativeValid")}let _="Voxel",C="Voxel",V="voxel";n.addStruct(_,C,xe.FRAGMENT);for(let P=0;P<c;P++){let F=i[P],A=`VoxelProperty_${F}`;n.addStructField(_,A,F)}n.addStructField(_,"vec3","positionEC"),n.addStructField(_,"vec3","positionUv"),n.addStructField(_,"vec3","positionShapeUv"),n.addStructField(_,"vec3","positionUvLocal"),n.addStructField(_,"vec3","viewDirUv"),n.addStructField(_,"vec3","viewDirWorld"),n.addStructField(_,"vec3","surfaceNormal"),n.addStructField(_,"float","travelDistance"),n.addStructField(_,"int","stepCount"),n.addStructField(_,"int","tileIndex"),n.addStructField(_,"int","sampleIndex");let L="FragmentInput";n.addStruct(L,"FragmentInput",xe.FRAGMENT),n.addStructField(L,f,x),n.addStructField(L,C,V);let G="Properties",X="Properties",v="properties";n.addStruct(G,X,xe.FRAGMENT);for(let P=0;P<c;P++){let F=i[P],A=o[P],b=x3(A);n.addStructField(G,b,F)}{let P="clearProperties";n.addFunction(P,`${X} clearProperties()`,xe.FRAGMENT),n.addFunctionLines(P,[`${X} ${v};`]);for(let F=0;F<c;F++){let A=i[F],b=o[F],R=r[F],E=x3(b,R);n.addFunctionLines(P,[`${v}.${A} = ${E}(0.0);`])}n.addFunctionLines(P,[`return ${v};`])}{let P="sumProperties";n.addFunction(P,`${X} sumProperties(${X} propertiesA, ${X} propertiesB)`,xe.FRAGMENT),n.addFunctionLines(P,[`${X} ${v};`]);for(let F=0;F<c;F++){let A=i[F];n.addFunctionLines(P,[`${v}.${A} = propertiesA.${A} + propertiesB.${A};`])}n.addFunctionLines(P,[`return ${v};`])}{let P="scaleProperties";n.addFunction(P,`${X} scaleProperties(${X} ${v}, float scale)`,xe.FRAGMENT),n.addFunctionLines(P,[`${X} scaledProperties = ${v};`]);for(let F=0;F<c;F++){let A=i[F];n.addFunctionLines(P,[`scaledProperties.${A} *= scale;`])}n.addFunctionLines(P,["return scaledProperties;"])}{let P="mixProperties";n.addFunction(P,`${X} mixProperties(${X} propertiesA, ${X} propertiesB, float mixFactor)`,xe.FRAGMENT),n.addFunctionLines(P,[`${X} ${v};`]);for(let F=0;F<c;F++){let A=i[F];n.addFunctionLines(P,[`${v}.${A} = mix(propertiesA.${A}, propertiesB.${A}, mixFactor);`])}n.addFunctionLines(P,[`return ${v};`])}{let P="copyPropertiesToMetadata";n.addFunction(P,`void copyPropertiesToMetadata(in ${X} ${v}, inout ${f} ${x})`,xe.FRAGMENT);for(let F=0;F<c;F++){let A=i[F];n.addFunctionLines(P,[`${x}.${A} = ${v}.${A};`])}}if(d){let P="setStatistics";n.addFunction(P,`void setStatistics(inout ${m} ${p})`,xe.FRAGMENT);for(let F=0;F<c;F++){let A=i[F],b=o[F],R=zt.getComponentCount(b);for(let E=0;E<R;E++){let I=P0t(b,E),w=s[F][E],N=a[F][E];n.addFunctionLines(P,[`${p}.${A}.min${I} = ${M_e(w)};`,`${p}.${A}.max${I} = ${M_e(N)};`])}}}{let P="getPropertiesFromMegatextureAtUv";n.addFunction(P,`${X} getPropertiesFromMegatextureAtUv(vec2 texcoord)`,xe.FRAGMENT),n.addFunctionLines(P,[`${X} ${v};`]);for(let F=0;F<c;F++){let A=i[F],b=o[F],R=r[F],E=I0t(b,R);n.addFunctionLines(P,[`properties.${A} = texture(u_megatextureTextures[${F}], texcoord)${E};`])}n.addFunctionLines(P,[`return ${v};`])}}function x3(e){if(e===zt.SCALAR)return"float";if(e===zt.VEC2)return"vec2";if(e===zt.VEC3)return"vec3";if(e===zt.VEC4)return"vec4"}function I0t(e){if(e===zt.SCALAR)return".r";if(e===zt.VEC2)return".ra";if(e===zt.VEC3)return".rgb";if(e===zt.VEC4)return""}function W0t(e){if(e===zt.SCALAR)return"vec3";if(e===zt.VEC2)return"mat2";if(e===zt.VEC3)return"mat3";if(e===zt.VEC4)return"mat4"}function M_e(e){let t=e.toString();return t.indexOf(".")===-1&&(t=`${e}.0`),t}function P0t(e,t){return e===zt.SCALAR?"":`[${t}]`}var X9=X0t;function v0t(e,t){let n=new E9(e);X9(n,e);let{shaderBuilder:i,clippingPlanes:o,clippingPlanesLength:r}=n;if(r>0){let C="getClippingPlane",V=K0(o,t),L=0,Z=V.indexOf(")")+1,G=V.indexOf("{",Z)+1,X=V.indexOf("}",G),v=V.slice(L,Z),P=V.slice(G,X);i.addFunction(C,v,xe.FRAGMENT),i.addFunctionLines(C,[P])}let s=i.clone();s.addDefine("PICKING",void 0,xe.FRAGMENT);let a=i.clone();a.addDefine("PICKING_VOXEL",void 0,xe.FRAGMENT);let c=i.buildShaderProgram(t),d=s.buildShaderProgram(t),u=a.buildShaderProgram(t),m=De.fromCache({cull:{enabled:!0,face:bi.BACK},depthTest:{enabled:!1},depthMask:!1,blending:un.PRE_MULTIPLIED_ALPHA_BLEND}),p=t.getViewportQuadVertexArray(),g=e._depthTest,f=new et({vertexArray:p,primitiveType:Fe.TRIANGLES,renderState:m,shaderProgram:c,uniformMap:n.uniformMap,modelMatrix:e._compoundModelMatrix,pass:Re.VOXELS,executeInClosestFrustum:!0,owner:this,cull:g,occlude:g}),x=et.shallowClone(f,new et);x.shaderProgram=d,x.pickOnly=!0;let _=et.shallowClone(f,new et);if(_.shaderProgram=u,_.pickOnly=!0,l(e._drawCommand)){let C=e._drawCommand;C.shaderProgram=C.shaderProgram&&C.shaderProgram.destroy()}if(l(e._drawCommandPick)){let C=e._drawCommandPick;C.shaderProgram=C.shaderProgram&&C.shaderProgram.destroy()}if(l(e._drawCommandPickVoxel)){let C=e._drawCommandPickVoxel;C.shaderProgram=C.shaderProgram&&C.shaderProgram.destroy()}e._drawCommand=f,e._drawCommandPick=x,e._drawCommandPickVoxel=_}var I9=v0t;var D3i=T(S(),1);var f3i=T(S(),1);function ql(){this.orientedBoundingBox=new Gn,this.boundingSphere=new le,this.boundTransform=new M,this.shapeTransform=new M,this._minBounds=h.clone(ql.DefaultMinBounds,new h),this._maxBounds=h.clone(ql.DefaultMaxBounds,new h),this.shaderUniforms={renderMinBounds:new h,renderMaxBounds:new h,boxUvToShapeUvScale:new h,boxUvToShapeUvTranslate:new h},this.shaderDefines={BOX_INTERSECTION_INDEX:void 0,BOX_HAS_SHAPE_BOUNDS:void 0},this.shaderMaximumIntersectionsLength=0}var w0t=new h,v8=new h,F0t=new $,A0t=new h,M0t=new h,N0t=new h,k0t=new h,N_e=M.fromRotationTranslation($.fromUniformScale(.5,new $),new h(.5,.5,.5),new M);ql.prototype.update=function(e,t,n,i,o){i=y(i,ql.DefaultMinBounds),o=y(o,ql.DefaultMaxBounds);let r=ql.DefaultMinBounds,s=ql.DefaultMaxBounds;t=this._minBounds=h.clamp(t,r,s,this._minBounds),n=this._maxBounds=h.clamp(n,r,s,this._maxBounds),i=h.clamp(i,r,s,A0t),o=h.clamp(o,r,s,M0t);let a=h.clamp(t,i,o,N0t),c=h.clamp(n,i,o,k0t),d=M.getScale(e,v8);if(a.x>c.x||a.y>c.y||a.z>c.z||(a.x===c.x)+(a.y===c.y)+(a.z===c.z)>=2||i.x>o.x||i.y>o.y||i.z>o.z||d.x===0||d.y===0||d.z===0)return!1;this.shapeTransform=M.clone(e,this.shapeTransform),this.orientedBoundingBox=F8(a,c,this.shapeTransform,this.orientedBoundingBox),this.boundTransform=M.fromRotationTranslation(this.orientedBoundingBox.halfAxes,this.orientedBoundingBox.center,this.boundTransform),this.boundingSphere=le.fromOrientedBoundingBox(this.orientedBoundingBox,this.boundingSphere);let{shaderUniforms:u,shaderDefines:m}=this;for(let f in m)m.hasOwnProperty(f)&&(m[f]=void 0);let p=!h.equals(t,r)||!h.equals(n,s),g=0;if(m.BOX_INTERSECTION_INDEX=g,g+=1,u.renderMinBounds=M.multiplyByPoint(N_e,a,u.renderMinBounds),u.renderMaxBounds=M.multiplyByPoint(N_e,c,u.renderMaxBounds),p){m.BOX_HAS_SHAPE_BOUNDS=!0;let f=t,x=n;u.boxUvToShapeUvScale=h.fromElements(2/(f.x===x.x?1:x.x-f.x),2/(f.y===x.y?1:x.y-f.y),2/(f.z===x.z?1:x.z-f.z),u.boxUvToShapeUvScale),u.boxUvToShapeUvTranslate=h.fromElements(-u.boxUvToShapeUvScale.x*(f.x*.5+.5),-u.boxUvToShapeUvScale.y*(f.y*.5+.5),-u.boxUvToShapeUvScale.z*(f.z*.5+.5),u.boxUvToShapeUvTranslate)}return this.shaderMaximumIntersectionsLength=g,!0};var _3=new h,w8=new h;ql.prototype.computeOrientedBoundingBoxForTile=function(e,t,n,i,o){let r=this._minBounds,s=this._maxBounds,a=1/Math.pow(2,e),c=h.fromElements(W.lerp(r.x,s.x,a*t),W.lerp(r.y,s.y,a*n),W.lerp(r.z,s.z,a*i),_3),d=h.fromElements(W.lerp(r.x,s.x,a*(t+1)),W.lerp(r.y,s.y,a*(n+1)),W.lerp(r.z,s.z,a*(i+1)),w8);return F8(c,d,this.shapeTransform,o)};var k_e=new h;ql.prototype.computeOrientedBoundingBoxForSample=function(e,t,n,i){let o=1/Math.pow(2,e.level),r=h.divideComponents(h.ONE,t,k_e),s=h.multiplyByScalar(r,o,k_e),a=h.multiplyByScalar(h.fromElements(e.x+n.x,e.y+n.y,e.z+n.z,_3),o,_3),c=h.add(a,s,w8),d=this._minBounds,u=this._maxBounds,m=h.fromElements(W.lerp(d.x,u.x,a.x),W.lerp(d.y,u.y,a.y),W.lerp(d.z,u.z,a.z),_3),p=h.fromElements(W.lerp(d.x,u.x,c.x),W.lerp(d.y,u.y,c.y),W.lerp(d.z,u.z,c.z),w8);return F8(m,p,this.shapeTransform,i)};ql.DefaultMinBounds=Object.freeze(new h(-1,-1,-1));ql.DefaultMaxBounds=Object.freeze(new h(1,1,1));function F8(e,t,n,i){let o=ql.DefaultMinBounds,r=ql.DefaultMaxBounds;if(h.equals(e,o)&&h.equals(t,r))i.center=M.getTranslation(n,i.center),i.halfAxes=M.getMatrix3(n,i.halfAxes);else{let a=M.getScale(n,v8),c=h.midpoint(e,t,w0t);i.center=M.multiplyByPoint(n,c,i.center),a=h.fromElements(a.x*.5*(t.x-e.x),a.y*.5*(t.y-e.y),a.z*.5*(t.z-e.z),v8);let d=M.getRotation(n,F0t);i.halfAxes=$.setScale(d,a,i.halfAxes)}return i}var Qf=ql;var L3i=T(S(),1);function Qr(){this.orientedBoundingBox=new Gn,this.boundingSphere=new le,this.boundTransform=new M,this.shapeTransform=new M,this._minimumRadius=Qr.DefaultMinBounds.x,this._maximumRadius=Qr.DefaultMaxBounds.x,this._minimumHeight=Qr.DefaultMinBounds.y,this._maximumHeight=Qr.DefaultMaxBounds.y,this._minimumAngle=Qr.DefaultMinBounds.z,this._maximumAngle=Qr.DefaultMaxBounds.z,this.shaderUniforms={cylinderRenderHeightMinMax:new D,cylinderRenderRadiusMinMax:new D,cylinderRenderAngleMinMax:new D,cylinderUvToShapeUvRadius:new D,cylinderUvToShapeUvHeight:new D,cylinderUvToShapeUvAngle:new D,cylinderShapeUvAngleMinMax:new D,cylinderShapeUvAngleRangeZeroMid:0},this.shaderDefines={CYLINDER_HAS_RENDER_BOUNDS_RADIUS_MIN:void 0,CYLINDER_HAS_RENDER_BOUNDS_RADIUS_FLAT:void 0,CYLINDER_HAS_RENDER_BOUNDS_ANGLE:void 0,CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO:void 0,CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF:void 0,CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF:void 0,CYLINDER_HAS_SHAPE_BOUNDS_RADIUS:void 0,CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT:void 0,CYLINDER_HAS_SHAPE_BOUNDS_ANGLE:void 0,CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY:void 0,CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY:void 0,CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED:void 0,CYLINDER_INTERSECTION_INDEX_RADIUS_MAX:void 0,CYLINDER_INTERSECTION_INDEX_RADIUS_MIN:void 0,CYLINDER_INTERSECTION_INDEX_ANGLE:void 0},this.shaderMaximumIntersectionsLength=0}var Y_e=new h;Qr.prototype.update=function(e,t,n,i,o){i=y(i,Qr.DefaultMinBounds),o=y(o,Qr.DefaultMaxBounds);let r=Qr.DefaultMinBounds.x,s=Qr.DefaultMaxBounds.x,a=Qr.DefaultMinBounds.y,c=Qr.DefaultMaxBounds.y,d=Qr.DefaultMinBounds.z,u=Qr.DefaultMaxBounds.z,m=u-d,p=.5*m,g=W.EPSILON10,f=W.EPSILON3,x=W.EPSILON10,_=W.clamp(t.x,r,s),C=W.clamp(n.x,r,s),V=W.clamp(i.x,r,s),L=W.clamp(o.x,r,s),Z=Math.max(_,V),G=Math.min(C,L),X=W.clamp(t.y,a,c),v=W.clamp(n.y,a,c),P=W.clamp(i.y,a,c),F=W.clamp(o.y,a,c),A=Math.max(X,P),b=Math.min(v,F),R=W.negativePiToPi(t.z),E=W.negativePiToPi(n.z),I=W.negativePiToPi(i.z),w=W.negativePiToPi(o.z),N=Math.max(R,I),B=Math.min(E,w),U=M.getScale(e,Y_e);if(G===0||Z>G||A>b||W.equalsEpsilon(U.x,0,void 0,g)||W.equalsEpsilon(U.y,0,void 0,g)||W.equalsEpsilon(U.z,0,void 0,g))return!1;this._minimumRadius=_,this._maximumRadius=C,this._minimumHeight=X,this._maximumHeight=v,this._minimumAngle=R,this._maximumAngle=E,this.shapeTransform=M.clone(e,this.shapeTransform),this.orientedBoundingBox=M8(Z,G,A,b,N,B,this.shapeTransform,this.orientedBoundingBox),this.boundTransform=M.fromRotationTranslation(this.orientedBoundingBox.halfAxes,this.orientedBoundingBox.center,this.boundTransform),this.boundingSphere=le.fromOrientedBoundingBox(this.orientedBoundingBox,this.boundingSphere);let J=_===r&&C===s,H=X===a&&v===c,ee=E<R,z=E-R+ee*m,j=z>p+x&&z<m-x,q=z<p-x,be=z>=p-x&&z<=p+x,Te=j||q||be,ae=W.equalsEpsilon(R,d,void 0,f),ye=W.equalsEpsilon(E,u,void 0,f),Se=Z===r,Le=B<N,Xe=B-N+Le*m,Pe=Xe>=p-x&&Xe<m-x,ke=Xe>x&&Xe<p-x,Pt=Xe<=x,Ot=Pe||ke||Pt,{shaderUniforms:ht,shaderDefines:Ae}=this;for(let Qe in Ae)Ae.hasOwnProperty(Qe)&&(Ae[Qe]=void 0);let $e=0;if(Ae.CYLINDER_INTERSECTION_INDEX_RADIUS_MAX=$e,$e+=1,Se||(Ae.CYLINDER_HAS_RENDER_BOUNDS_RADIUS_MIN=!0,Ae.CYLINDER_INTERSECTION_INDEX_RADIUS_MIN=$e,$e+=1),ht.cylinderRenderRadiusMinMax=D.fromElements(Z,G,ht.cylinderRenderRadiusMinMax),Z===G&&(Ae.CYLINDER_HAS_RENDER_BOUNDS_RADIUS_FLAT=!0),!J){Ae.CYLINDER_HAS_SHAPE_BOUNDS_RADIUS=!0;let Qe=C-_,je=0,kt=1;Qe!==0&&(je=1/Qe,kt=-_/Qe),ht.cylinderUvToShapeUvRadius=D.fromElements(je,kt,ht.cylinderUvToShapeUvRadius)}if(!H){Ae.CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT=!0;let Qe=v-X,je=0,kt=1;Qe!==0&&(je=2/Qe,kt=-(X+1)/Qe),ht.cylinderUvToShapeUvHeight=D.fromElements(je,kt,ht.cylinderUvToShapeUvHeight)}if(ht.cylinderRenderHeightMinMax=D.fromElements(A,b,ht.cylinderRenderHeightMinMax),ee&&(Ae.CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED=!0),Ot&&(Ae.CYLINDER_HAS_RENDER_BOUNDS_ANGLE=!0,Ae.CYLINDER_INTERSECTION_INDEX_ANGLE=$e,Pe?(Ae.CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF=!0,$e+=1):ke?(Ae.CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF=!0,$e+=2):Pt&&(Ae.CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO=!0,$e+=2),ht.cylinderRenderAngleMinMax=D.fromElements(N,B,ht.cylinderRenderAngleMinMax)),Te){Ae.CYLINDER_HAS_SHAPE_BOUNDS_ANGLE=!0,ae&&(Ae.CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY=!0),ye&&(Ae.CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY=!0);let Qe=(R-d)/m,je=(E-d)/m,kt=1-z/m;if(ht.cylinderShapeUvAngleMinMax=D.fromElements(Qe,je,ht.cylinderShapeUvAngleMinMax),ht.cylinderShapeUvAngleRangeZeroMid=(je+.5*kt)%1,z<=x)ht.cylinderUvToShapeUvAngle=D.fromElements(0,1,ht.cylinderUvToShapeUvAngle);else{let pe=m/z,Ve=-(R-d)/z;ht.cylinderUvToShapeUvAngle=D.fromElements(pe,Ve,ht.cylinderUvToShapeUvAngle)}}return this.shaderMaximumIntersectionsLength=$e,!0};Qr.prototype.computeOrientedBoundingBoxForTile=function(e,t,n,i,o){let r=this._minimumRadius,s=this._maximumRadius,a=this._minimumHeight,c=this._maximumHeight,d=this._minimumAngle,u=this._maximumAngle,m=1/Math.pow(2,e),p=W.lerp(r,s,t*m),g=W.lerp(r,s,(t+1)*m),f=W.lerp(a,c,n*m),x=W.lerp(a,c,(n+1)*m),_=W.lerp(d,u,i*m),C=W.lerp(d,u,(i+1)*m);return M8(p,g,f,x,_,C,this.shapeTransform,o)};var U_e=new h,D_e=new h,U0t=new h;Qr.prototype.computeOrientedBoundingBoxForSample=function(e,t,n,i){let o=1/Math.pow(2,e.level),r=h.divideComponents(h.ONE,t,U_e),s=h.multiplyByScalar(r,o,U_e),a=h.multiplyByScalar(h.fromElements(e.x+n.x,e.y+n.y,e.z+n.z,D_e),o,D_e),c=h.add(a,s,U0t),d=this._minimumRadius,u=this._maximumRadius,m=this._minimumHeight,p=this._maximumHeight,g=this._minimumAngle,f=this._maximumAngle,x=W.lerp(d,u,a.x),_=W.lerp(d,u,c.x),C=W.lerp(m,p,a.y),V=W.lerp(m,p,c.y),L=W.lerp(g,f,a.z),Z=W.lerp(g,f,c.z);return M8(x,_,C,V,L,Z,this.shapeTransform,i)};Qr.DefaultMinBounds=Object.freeze(new h(0,-1,-W.PI));Qr.DefaultMaxBounds=Object.freeze(new h(1,1,+W.PI));var D0t=5,B0t=new Array(D0t),Y0t=new h,O0t=new $,H0t=new M,z0t=new M,K0t=new M,A8=new M,J0t=new h,Q0t=new h,j0t=new h,O_e=new Array(8);for(let e=0;e<8;e++)O_e[e]=new h;function B_e(e,t,n){return Math.abs(se.dot(e,t))<n}function q0t(e){let t=M.getColumn(e,0,J0t),n=M.getColumn(e,1,Q0t),i=M.getColumn(e,2,j0t),o=W.EPSILON4;return B_e(t,n,o)&&B_e(n,i,o)}function $0t(e,t){let n=O_e;h.fromElements(-.5,-.5,-.5,n[0]),h.fromElements(-.5,-.5,.5,n[1]),h.fromElements(-.5,.5,-.5,n[2]),h.fromElements(-.5,.5,.5,n[3]),h.fromElements(.5,-.5,-.5,n[4]),h.fromElements(.5,-.5,.5,n[5]),h.fromElements(.5,.5,-.5,n[6]),h.fromElements(.5,.5,.5,n[7]);for(let i=0;i<8;++i)M.multiplyByPoint(e,n[i],n[i]);return Gn.fromPoints(n,t)}function M8(e,t,n,i,o,r,s,a){let c=Qr.DefaultMinBounds,d=Qr.DefaultMaxBounds,u=c.x,m=d.x,p=c.y,g=d.y,f=c.z,x=d.z;if(e===u&&t===m&&n===p&&i===g&&o===f&&r===x)return a.center=M.getTranslation(s,a.center),a.halfAxes=M.getMatrix3(s,a.halfAxes),a;r<o&&(r+=W.TWO_PI);let C=r-o,V=o+C*.5,L=B0t,Z=0;L[Z++]=o,L[Z++]=r,L[Z++]=V,C>W.PI&&(L[Z++]=V-W.PI_OVER_TWO,L[Z++]=V+W.PI_OVER_TWO);let G=1,X=1,v=-1,P=-1;for(let ee=0;ee<Z;++ee){let z=L[ee]-V,j=Math.cos(z),q=Math.sin(z),be=j*e,Te=q*e,ae=j*t,ye=q*t;G=Math.min(G,be),X=Math.min(X,Te),G=Math.min(G,ae),X=Math.min(X,ye),v=Math.max(v,be),P=Math.max(P,Te),v=Math.max(v,ae),P=Math.max(P,ye)}let F=v-G,A=P-X,b=i-n,R=(G+v)*.5,E=(X+P)*.5,I=(n+i)*.5,w=h.fromElements(R,E,I,Y0t),N=$.fromRotationZ(V,O0t),B=h.fromElements(F,A,b,Y_e),U=M.fromScale(B,K0t),O=M.fromRotation(N,z0t),k=M.fromTranslation(w,H0t),J=M.multiplyTransformation(O,M.multiplyTransformation(k,U,A8),A8),H=M.multiplyTransformation(s,J,A8);return q0t(H)?Gn.fromTransformation(H,a):$0t(H,a)}var jf=Qr;var A3i=T(S(),1);function lb(){this.orientedBoundingBox=new Gn,this.boundingSphere=new le,this.boundTransform=new M,this.shapeTransform=new M,this._rectangle=new ce,this._minimumHeight=lb.DefaultMinBounds.z,this._maximumHeight=lb.DefaultMaxBounds.z,this._ellipsoid=new ie,this._translation=new h,this._rotation=new $,this.shaderUniforms={ellipsoidRadiiUv:new h,eccentricitySquared:0,evoluteScale:new D,ellipsoidInverseRadiiSquaredUv:new h,ellipsoidRenderLongitudeMinMax:new D,ellipsoidShapeUvLongitudeMinMaxMid:new h,ellipsoidUvToShapeUvLongitude:new D,ellipsoidUvToShapeUvLatitude:new D,ellipsoidRenderLatitudeSinMinMax:new D,ellipsoidInverseHeightDifferenceUv:0,clipMinMaxHeight:new D},this.shaderDefines={ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE:void 0,ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO:void 0,ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_UNDER_HALF:void 0,ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF:void 0,ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY:void 0,ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY:void 0,ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE:void 0,ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED:void 0,ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF:void 0,ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_EQUAL_HALF:void 0,ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_OVER_HALF:void 0,ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_UNDER_HALF:void 0,ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_EQUAL_HALF:void 0,ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_OVER_HALF:void 0,ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE:void 0,ELLIPSOID_INTERSECTION_INDEX_LONGITUDE:void 0,ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX:void 0,ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN:void 0,ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MAX:void 0,ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MIN:void 0},this.shaderMaximumIntersectionsLength=0}var ebt=new h,tbt=new h,nbt=new h,ibt=new h,obt=new h,rbt=new h,sbt=new h,abt=new h,cbt=new $,H_e=new h,z_e=new h,lbt=new ce;lb.prototype.update=function(e,t,n,i,o){let{DefaultMinBounds:r,DefaultMaxBounds:s}=lb;i=y(i,r),o=y(o,s);let a=W.EPSILON10,c=W.EPSILON3,d=W.EPSILON10,u=W.EPSILON10,m=W.EPSILON3,p=M.getScale(e,abt),g=h.clone(r,ebt);g.z=-h.minimumComponent(p);let f=h.clamp(t,g,s,tbt),x=h.clamp(n,g,s,nbt),_=h.clamp(i,g,s,ibt),C=h.clamp(o,g,s,obt),V=h.maximumByComponent(f,_,rbt),L=h.minimumByComponent(x,C,sbt),Z=h.add(p,h.fromElements(x.z,x.z,x.z,H_e),H_e),G=h.maximumComponent(Z),X=h.add(p,h.fromElements(L.z,L.z,L.z,z_e),z_e);if(V.y>L.y||V.y===s.y||L.y===r.y||V.z>L.z||W.equalsEpsilon(X,h.ZERO,void 0,a))return!1;this._rectangle=ce.fromRadians(f.x,f.y,x.x,x.y),this._translation=M.getTranslation(e,this._translation),this._rotation=M.getRotation(e,this._rotation),this._ellipsoid=ie.fromCartesian3(p,this._ellipsoid),this._minimumHeight=f.z,this._maximumHeight=x.z;let v=ce.fromRadians(V.x,V.y,L.x,L.y,lbt);this.orientedBoundingBox=N8(v,V.z,L.z,this._ellipsoid,this._translation,this._rotation,this.orientedBoundingBox),this.shapeTransform=M.fromRotationTranslation($.setScale(this._rotation,Z,cbt),this._translation,this.shapeTransform),this.boundTransform=M.fromRotationTranslation(this.orientedBoundingBox.halfAxes,this.orientedBoundingBox.center,this.boundTransform),this.boundingSphere=le.fromOrientedBoundingBox(this.orientedBoundingBox,this.boundingSphere);let P=s.x-r.x,F=.5*P,A=L.x<V.x,b=L.x-V.x+A*P,R=b<=d,E=b>=F-d&&b<P-d,I=b>d&&b<F-d,w=R||E||I,N=x.x<f.x,B=x.x-f.x+N*P,U=B>F+d&&B<P-d,O=B>=F-d&&B<=F+d,k=B<F-d,J=U||O||k,H=L.y<-m,ee=L.y>=-m&&L.y<=+m,z=L.y>+m&&L.y<s.y-u,j=H||ee||z,q=V.y>r.y+u&&V.y<-m,be=V.y>=-m&&V.y<=+m,Te=V.y>+m,ae=q||be||Te,ye=j||ae,Se=x.y-f.y,Le=x.y<-m,Xe=x.y>=-m&&x.y<=+m,Pe=x.y>+m&&x.y<s.y-u,ke=Le||Xe||Pe,Pt=f.y>r.y+u&&f.y<-m,Ot=f.y>=-m&&f.y<=+m,ht=f.y>+m,$e=ke||(Pt||Ot||ht),{shaderUniforms:Qe,shaderDefines:je}=this;for(let li in je)je.hasOwnProperty(li)&&(je[li]=void 0);Qe.ellipsoidRadiiUv=h.divideByScalar(Z,G,Qe.ellipsoidRadiiUv);let{x:kt,z:pe}=Qe.ellipsoidRadiiUv,Ve=pe/kt;Qe.eccentricitySquared=1-Ve*Ve,Qe.evoluteScale=D.fromElements((kt*kt-pe*pe)/kt,(pe*pe-kt*kt)/pe,Qe.evoluteScale),Qe.ellipsoidInverseRadiiSquaredUv=h.divideComponents(h.ONE,h.multiplyComponents(Qe.ellipsoidRadiiUv,Qe.ellipsoidRadiiUv,Qe.ellipsoidInverseRadiiSquaredUv),Qe.ellipsoidInverseRadiiSquaredUv);let Dt=0;je.ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MAX=Dt,Dt+=1,je.ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MIN=Dt,Dt+=1,Qe.clipMinMaxHeight=D.fromElements((V.z-x.z)/G,(L.z-x.z)/G,Qe.clipMinMaxHeight);let bt=(x.z-f.z)/G;if(Qe.ellipsoidInverseHeightDifferenceUv=1/bt,f.z===x.z&&(Qe.ellipsoidInverseHeightDifferenceUv=0),w&&(je.ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE=!0,je.ELLIPSOID_INTERSECTION_INDEX_LONGITUDE=Dt,E?(je.ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_UNDER_HALF=!0,Dt+=1):I?(je.ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF=!0,Dt+=2):R&&(je.ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO=!0,Dt+=2),Qe.ellipsoidRenderLongitudeMinMax=D.fromElements(V.x,L.x,Qe.ellipsoidRenderLongitudeMinMax)),J)if(je.ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE=!0,x.x<f.x&&(je.ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED=!0),B<=d)Qe.ellipsoidUvToShapeUvLongitude=D.fromElements(0,1,Qe.ellipsoidUvToShapeUvLongitude);else{let Vo=P/B,Rs=-(f.x-r.x)/B;Qe.ellipsoidUvToShapeUvLongitude=D.fromElements(Vo,Rs,Qe.ellipsoidUvToShapeUvLongitude)}if(w){let li=W.equalsEpsilon(V.x,r.x,void 0,c),Vo=W.equalsEpsilon(L.x,s.x,void 0,c);li&&(je.ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY=!0),Vo&&(je.ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY=!0);let Rs=(f.x-r.x)/P,zs=(x.x-r.x)/P,Nr=(L.x-r.x)/P,$r=1-b/P,Ue=(Nr+.5*$r)%1;Qe.ellipsoidShapeUvLongitudeMinMaxMid=h.fromElements(Rs,zs,Ue,Qe.ellipsoidShapeUvLongitudeMinMaxMid)}if(ye&&(ae&&(je.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN=!0,je.ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN=Dt,q?(je.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_UNDER_HALF=!0,Dt+=1):be?(je.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_EQUAL_HALF=!0,Dt+=1):Te&&(je.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_OVER_HALF=!0,Dt+=2)),j&&(je.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX=!0,je.ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX=Dt,H?(je.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF=!0,Dt+=2):ee?(je.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_EQUAL_HALF=!0,Dt+=1):z&&(je.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_OVER_HALF=!0,Dt+=1)),Qe.ellipsoidRenderLatitudeSinMinMax=D.fromElements(Math.sin(V.y),Math.sin(L.y),Qe.ellipsoidRenderLatitudeSinMinMax)),$e)if(je.ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE=!0,Se<u)Qe.ellipsoidUvToShapeUvLatitude=D.fromElements(0,1,Qe.ellipsoidUvToShapeUvLatitude);else{let Vo=(s.y-r.y)/Se,Rs=(r.y-f.y)/Se;Qe.ellipsoidUvToShapeUvLatitude=D.fromElements(Vo,Rs,Qe.ellipsoidUvToShapeUvLatitude)}return this.shaderMaximumIntersectionsLength=Dt,!0};var Q_e=new ce;lb.prototype.computeOrientedBoundingBoxForTile=function(e,t,n,i,o){let r=1/Math.pow(2,e),s=t*r,a=(t+1)*r,c=n*r,d=(n+1)*r,u=i*r,m=(i+1)*r,p=ce.subsection(this._rectangle,s,c,a,d,Q_e),g=W.lerp(this._minimumHeight,this._maximumHeight,u),f=W.lerp(this._minimumHeight,this._maximumHeight,m);return N8(p,g,f,this._ellipsoid,this._translation,this._rotation,o)};var K_e=new h,J_e=new h,dbt=new h;lb.prototype.computeOrientedBoundingBoxForSample=function(e,t,n,i){let o=1/Math.pow(2,e.level),r=h.divideComponents(h.ONE,t,K_e),s=h.multiplyByScalar(r,o,K_e),a=h.multiplyByScalar(h.fromElements(e.x+n.x,e.y+n.y,e.z+n.z,J_e),o,J_e),c=h.add(a,s,dbt),d=ce.subsection(this._rectangle,a.x,a.y,c.x,c.y,Q_e),u=W.lerp(this._minimumHeight,this._maximumHeight,a.z),m=W.lerp(this._minimumHeight,this._maximumHeight,c.z);return N8(d,u,m,this._ellipsoid,this._translation,this._rotation,i)};function N8(e,t,n,i,o,r,s){return s=Gn.fromRectangle(e,t,n,i,s),s.center=h.add(s.center,o,s.center),s.halfAxes=$.multiply(s.halfAxes,r,s.halfAxes),s}lb.DefaultMinBounds=Object.freeze(new h(-W.PI,-W.PI_OVER_TWO,-ie.WGS84.minimumRadius));lb.DefaultMaxBounds=Object.freeze(new h(W.PI,W.PI_OVER_TWO,10*ie.WGS84.maximumRadius));var jT=lb;var jd={BOX:"BOX",ELLIPSOID:"ELLIPSOID",CYLINDER:"CYLINDER"};jd.getMinBounds=function(e){switch(e){case jd.BOX:return Qf.DefaultMinBounds;case jd.ELLIPSOID:return jT.DefaultMinBounds;case jd.CYLINDER:return jf.DefaultMinBounds}};jd.getMaxBounds=function(e){switch(e){case jd.BOX:return Qf.DefaultMaxBounds;case jd.ELLIPSOID:return jT.DefaultMaxBounds;case jd.CYLINDER:return jf.DefaultMaxBounds}};jd.getShapeConstructor=function(e){switch(e){case jd.BOX:return Qf;case jd.ELLIPSOID:return jT;case jd.CYLINDER:return jf}};var Xi=Object.freeze(jd);var NBi=T(S(),1);var Y3i=T(S(),1),j_e=Object.freeze({UNLOADED:0,RECEIVING:1,RECEIVED:2,LOADED:3,FAILED:4,UNAVAILABLE:5});function T3(e,t){this.spatialNode=e,this.keyframe=t,this.state=j_e.UNLOADED,this.metadata=[],this.megatextureIndex=-1,this.priority=-Number.MAX_VALUE,this.highPriorityFrameNumber=-1}T3.priorityComparator=function(e,t){return e.priority-t.priority};T3.searchComparator=function(e,t){return e.keyframe-t.keyframe};T3.LoadState=j_e;var Ki=T3;var dBi=T(S(),1);function Xy(e,t,n,i,o){i===an.UNSIGNED_SHORT&&(i=an.FLOAT32);let r=e.floatingPointTexture;if(i===an.FLOAT32&&!r)throw new ue("Floating point texture not supported");let s;i===an.FLOAT32||i===an.FLOAT64?s=ze.FLOAT:i===an.UINT8&&(s=ze.UNSIGNED_BYTE);let a;n===1?a=e.webgl2?at.RED:at.LUMINANCE:n===2?a=e.webgl2?at.RG:at.LUMINANCE_ALPHA:n===3?a=at.RGB:n===4&&(a=at.RGBA);let c=512*1024*1024,d=128*1024*1024;o=Math.min(y(o,d),c);let u=Mt.maximumTextureSize,m=an.getSizeInBytes(i),p=Math.floor(o/(n*m)),g=Math.min(u,W.previousPowerOfTwo(Math.floor(Math.sqrt(p)))),f=Math.ceil(Math.sqrt(t.x)),x=Math.ceil(t.z/f),_=f*t.x,C=x*t.y,V=Math.floor(g/_),L=Math.floor(g/C);if(V===0||L===0)throw new ue("Tileset is too large to fit into megatexture");this.channelCount=n,this.componentType=i,this.voxelCountPerTile=h.clone(t,new h),this.maximumTileCount=V*L,this.regionCountPerMegatexture=new D(V,L),this.voxelCountPerRegion=new D(_,C),this.sliceCountPerRegion=new D(f,x),this.voxelSizeUv=new D(1/g,1/g),this.sliceSizeUv=new D(t.x/g,t.y/g),this.regionSizeUv=new D(_/g,C/g),this.texture=new Et({context:e,pixelFormat:a,pixelDatatype:s,flipY:!1,width:g,height:g,sampler:new sn({wrapS:Cn.CLAMP_TO_EDGE,wrapT:Cn.CLAMP_TO_EDGE,minificationFilter:rn.LINEAR,magnificationFilter:di.LINEAR})});let Z=an.toComponentDatatype(i);this.tileVoxelDataTemp=Q.createTypedArray(Z,_*C*n),this.nodes=new Array(this.maximumTileCount);for(let G=0;G<this.maximumTileCount;G++)this.nodes[G]=new ubt(G);for(let G=0;G<this.maximumTileCount;G++){let X=this.nodes[G];X.previousNode=G>0?this.nodes[G-1]:void 0,X.nextNode=G<this.maximumTileCount-1?this.nodes[G+1]:void 0}this.occupiedList=void 0,this.emptyList=this.nodes[0],this.occupiedCount=0}function ubt(e){this.index=e,this.nextNode=void 0,this.previousNode=void 0}Xy.prototype.add=function(e){if(this.isFull())throw new fe("Trying to add when there are no empty spots");let t=this.emptyList;this.emptyList=this.emptyList.nextNode,l(this.emptyList)&&(this.emptyList.previousNode=void 0),t.nextNode=this.occupiedList,l(t.nextNode)&&(t.nextNode.previousNode=t),this.occupiedList=t;let n=t.index;return this.writeDataToTexture(n,e),this.occupiedCount++,n};Xy.prototype.remove=function(e){if(e<0||e>=this.maximumTileCount)throw new fe("Megatexture index out of bounds");let t=this.nodes[e];l(t.previousNode)&&(t.previousNode.nextNode=t.nextNode),l(t.nextNode)&&(t.nextNode.previousNode=t.previousNode),t.nextNode=this.emptyList,l(t.nextNode)&&(t.nextNode.previousNode=t),t.previousNode=void 0,this.emptyList=t,this.occupiedCount--};Xy.prototype.isFull=function(){return this.emptyList===void 0};Xy.getApproximateTextureMemoryByteLength=function(e,t,n,i){i===an.UNSIGNED_SHORT&&(i=an.FLOAT32);let o=an.getSizeInBytes(i),r=e*t.x*t.y*t.z,s=Math.ceil(Math.sqrt(t.x)),a=Math.ceil(t.z/s),c=s*t.x,d=a*t.y,u=W.previousPowerOfTwo(Math.floor(Math.sqrt(r)));for(;;){let p=Math.floor(u/c),g=Math.floor(u/d);if(p*g>=e)break;u*=2}return u*u*n*o};Xy.prototype.writeDataToTexture=function(e,t){let n=t.constructor===Uint16Array?new Float32Array(t):t,i=this.voxelCountPerTile,o=this.sliceCountPerRegion,r=this.voxelCountPerRegion,s=this.channelCount,a=this.tileVoxelDataTemp;for(let x=0;x<i.z;x++){let _=x%o.x*i.x,C=Math.floor(x/o.x)*i.y;for(let V=0;V<i.y;V++)for(let L=0;L<i.x;L++){let Z=x*i.y*i.x+V*i.x+L,G=(C+V)*r.x+(_+L);for(let X=0;X<s;X++)a[G*s+X]=n[Z*s+X]}}let c=this.regionCountPerMegatexture,d=r.x,u=r.y,m=e%c.x*r.x,p=Math.floor(e/c.x)*r.y,f={source:{arrayBufferView:a,width:d,height:u},xOffset:m,yOffset:p};this.texture.copyFrom(f)};Xy.prototype.isDestroyed=function(){return!1};Xy.prototype.destroy=function(){return this.texture=this.texture&&this.texture.destroy(),me(this)};var sL=Xy;var _Bi=T(S(),1);function sm(e,t,n,i,o,r,s){this.children=void 0,this.parent=o,this.level=e,this.x=t,this.y=n,this.z=i,this.dimensions=h.clone(s),this.keyframeNodes=[],this.renderableKeyframeNodes=[],this.renderableKeyframeNodeLerp=0,this.renderableKeyframeNodePrevious=void 0,this.renderableKeyframeNodeNext=void 0,this.orientedBoundingBox=new Gn,this.approximateVoxelSize=0,this.screenSpaceError=0,this.visitedFrameNumber=-1,this.computeBoundingVolumes(r)}var mbt=new h;sm.prototype.computeBoundingVolumes=function(e){this.orientedBoundingBox=e.computeOrientedBoundingBoxForTile(this.level,this.x,this.y,this.z,this.orientedBoundingBox);let t=$.getScale(this.orientedBoundingBox.halfAxes,mbt),n=2*h.maximumComponent(t);this.approximateVoxelSize=n/h.minimumComponent(this.dimensions)};sm.prototype.constructChildNodes=function(e){let{level:t,x:n,y:i,z:o}=this,r=n*2,s=i*2,a=o*2,c=s+1,d=r+1,u=a+1,m=t+1,p=[[m,r,s,a],[m,d,s,a],[m,r,c,a],[m,d,c,a],[m,r,s,u],[m,d,s,u],[m,r,c,u],[m,d,c,u]];this.children=p.map(([g,f,x,_])=>new sm(g,f,x,_,this,e,this.dimensions))};sm.prototype.visibility=function(e,t){let n=this.orientedBoundingBox;return e.cullingVolume.computeVisibilityWithPlaneMask(n,t)};sm.prototype.computeScreenSpaceError=function(e,t){let n=this.orientedBoundingBox,i=Math.sqrt(n.distanceSquaredTo(e));i=Math.max(i,W.EPSILON7);let o=this.approximateVoxelSize,r=t*(o/i);this.screenSpaceError=r};var q_e={keyframe:0};function W9(e,t){return q_e.keyframe=e,Ro(t,q_e,Ki.searchComparator)}sm.prototype.computeSurroundingRenderableKeyframeNodes=function(e){let t=this,n=t.level,i=Math.floor(e),o=Math.ceil(e),r,s,a=+Number.MAX_VALUE,c=+Number.MAX_VALUE;for(;l(t);){let{renderableKeyframeNodes:m}=t;if(m.length>=1){let p=hbt(i,m),g=m[p],f=o===i||i<g.keyframe?p:Math.min(p+1,m.length-1),x=m[f],_=i-g.keyframe,C=$_e(n-t.level,_);C<a&&(a=C,r=g);let V=x.keyframe-o,L=$_e(n-t.level,V);if(L<c&&(c=L,s=x),_===0&&V===0)break}t=t.parent}if(this.renderableKeyframeNodePrevious=r,this.renderableKeyframeNodeNext=s,!l(r)||!l(s))return;let d=r.keyframe,u=s.keyframe;this.renderableKeyframeNodeLerp=d===u?0:W.clamp((e-d)/(u-d),0,1)};function hbt(e,t){let n=W9(e,t);return n<0?W.clamp(~n-1,0,t.length-1):n}function $_e(e,t){let n=Math.exp(e*4),i=t>=0?1:-200;return e*n+t*i}sm.prototype.isVisited=function(e){return this.visitedFrameNumber===e};sm.prototype.createKeyframeNode=function(e){let t=W9(e,this.keyframeNodes);if(t<0){t=~t;let n=new Ki(this,e);this.keyframeNodes.splice(t,0,n)}};sm.prototype.destroyKeyframeNode=function(e,t){let n=e.keyframe,i=W9(n,this.keyframeNodes);if(i<0)throw new fe("Keyframe node does not exist.");if(this.keyframeNodes.splice(i,1),e.megatextureIndex!==-1){for(let r=0;r<t.length;r++)t[r].remove(e.megatextureIndex);let o=W9(n,this.renderableKeyframeNodes);if(o<0)throw new fe("Renderable keyframe node does not exist.");this.renderableKeyframeNodes.splice(o,1)}e.spatialNode=void 0,e.state=Ki.LoadState.UNLOADED,e.metadata={},e.megatextureIndex=-1,e.priority=-Number.MAX_VALUE,e.highPriorityFrameNumber=-1};sm.prototype.addKeyframeNodeToMegatextures=function(e,t){if(e.state!==Ki.LoadState.RECEIVED||e.megatextureIndex!==-1||e.metadata.length!==t.length)throw new fe("Keyframe node cannot be added to megatexture");for(let o=0;o<t.length;o++){let r=t[o];e.megatextureIndex=r.add(e.metadata[o])}e.state=Ki.LoadState.LOADED;let n=this.renderableKeyframeNodes,i=W9(e.keyframe,n);if(i>=0)throw new fe("Keyframe already renderable");i=~i,n.splice(i,0,e)};sm.prototype.isRenderable=function(e){let t=this.renderableKeyframeNodePrevious,n=this.renderableKeyframeNodeNext,i=this.level;return l(t)&&l(n)&&(t.spatialNode.level===i||n.spatialNode.level===i)&&this.visitedFrameNumber===e};var P9=sm;function db(e,t,n,i,o,r,s){this._primitive=e,this.megatextures=new Array(i.length);for(let f=0;f<i.length;f++){let x=i[f],_=zt.getComponentCount(x),C=o[f];this.megatextures[f]=new sL(t,n,_,C,s)}let a=this.megatextures[0].maximumTileCount;this._simultaneousRequestCount=0,this._debugPrint=!1,this._frameNumber=0;let c=e._shape;this.rootNode=new P9(0,0,0,0,void 0,c,n),this._priorityQueue=new Tx({maximumLength:a,comparator:Ki.priorityComparator}),this._highPriorityKeyframeNodes=new Array(a),this._keyframeNodesInMegatexture=new Array(a),this._keyframeCount=r,this._sampleCount=void 0,this._keyframeLocation=0,this._binaryTreeKeyframeWeighting=new Array(r);let d=this._binaryTreeKeyframeWeighting;d[0]=0,d[r-1]=0,k8(d,1,r-2,0);let u=9,m=2048,p=Math.floor(m/u),g=Math.ceil(a/p);this.internalNodeTexture=new Et({context:t,pixelFormat:at.RGBA,pixelDatatype:ze.UNSIGNED_BYTE,flipY:!1,width:m,height:g,sampler:new sn({minificationFilter:rn.NEAREST,magnificationFilter:di.NEAREST})}),this.internalNodeTilesPerRow=p,this.internalNodeTexelSizeUv=new D(1/m,1/g),this.leafNodeTexture=void 0,this.leafNodeTilesPerRow=void 0,this.leafNodeTexelSizeUv=new D}db.prototype.findKeyframeNode=function(e){return this._keyframeNodesInMegatexture.find(function(t){return t.megatextureIndex===e})};function k8(e,t,n,i){if(t>n)return;let o=Math.floor((t+n)/2);e[o]=i,k8(e,t,o-1,i+1),k8(e,o+1,n,i+1)}db.simultaneousRequestCountMaximum=50;db.prototype.update=function(e,t,n,i){let o=this._primitive,r=e.context,s=this.megatextures[0].maximumTileCount,a=this._keyframeCount,c=o._levelBlendFactor,d=c>0,u=a>1,m=(d?2:1)*(u?2:1);this._sampleCount=m;let p=m>=2;if(p&&!l(this.leafNodeTexture)){let V=Math.floor(512),L=Math.ceil(s/V);this.leafNodeTexture=new Et({context:r,pixelFormat:at.RGBA,pixelDatatype:ze.UNSIGNED_BYTE,flipY:!1,width:1024,height:L,sampler:new sn({minificationFilter:rn.NEAREST,magnificationFilter:di.NEAREST})}),this.leafNodeTexelSizeUv=D.fromElements(1/1024,1/L,this.leafNodeTexelSizeUv),this.leafNodeTilesPerRow=V}else!p&&l(this.leafNodeTexture)&&(this.leafNodeTexture=this.leafNodeTexture.destroy());if(this._keyframeLocation=W.clamp(t,0,a-1),n&&eTe(this,this.rootNode),i)return;this._frameNumber=e.frameNumber;let g=fi();bbt(this,e);let f=fi();xbt(this,m,c);let x=fi();if(this._debugPrint){let _=f-g,C=x-f,V=x-g;ybt(this,_,C,V)}};db.prototype.isRenderable=function(e){return e.isRenderable(this._frameNumber)};db.prototype.isDestroyed=function(){return!1};db.prototype.destroy=function(){let e=this.megatextures,t=e.length;for(let n=0;n<t;n++)e[n]=e[n]&&e[n].destroy();return this.internalNodeTexture=this.internalNodeTexture&&this.internalNodeTexture.destroy(),this.leafNodeTexture=this.leafNodeTexture&&this.leafNodeTexture.destroy(),me(this)};function eTe(e,t){if(t.computeBoundingVolumes(e._primitive._shape),l(t.children))for(let n=0;n<8;n++){let i=t.children[n];eTe(e,i)}}function fbt(e,t){if(e._simultaneousRequestCount>=db.simultaneousRequestCountMaximum)return;let n=e._primitive._provider;function i(c){e._simultaneousRequestCount--;let d=n.types.length;if(!l(c))t.state=Ki.LoadState.UNAVAILABLE;else if(c===Ki.LoadState.FAILED)t.state=Ki.LoadState.FAILED;else if(!Array.isArray(c)||c.length!==d)t.state=Ki.LoadState.FAILED;else{let u=e.megatextures;for(let m=0;m<d;m++){let{voxelCountPerTile:p,channelCount:g}=u[m],{x:f,y:x,z:_}=p,C=f*x*_,V=c[m],L=C*g;if(V.length===L)t.metadata[m]=V,t.state=Ki.LoadState.RECEIVED;else{t.state=Ki.LoadState.FAILED;break}}}}function o(){e._simultaneousRequestCount--,t.state=Ki.LoadState.FAILED}let{keyframe:r,spatialNode:s}=t,a=n.requestData({tileLevel:s.level,tileX:s.x,tileY:s.y,tileZ:s.z,keyframe:r});l(a)?(e._simultaneousRequestCount++,t.state=Ki.LoadState.RECEIVING,a.then(i).catch(o)):t.state=Ki.LoadState.FAILED}function pbt(e){return e/(1+e)}function bbt(e,t){let n=e._frameNumber,i=e._primitive,o=i._shape,r=i.screenSpaceError,s=e._priorityQueue,a=e._keyframeCount,c=W.clamp(Math.floor(e._keyframeLocation),0,a-2),d=c+1,{camera:u,context:m,pixelRatio:p}=t,{positionWC:g,frustum:f}=u,_=m.drawingBufferHeight/p/f.sseDenominator;function C(A,b){if(A.computeScreenSpaceError(g,_),b=A.visibility(t,b),b===rs.MASK_OUTSIDE)return;if(A.visitedFrameNumber=n,a===1)A.createKeyframeNode(0);else if(A.keyframeNodes.length!==a)for(let N=0;N<a;N++)A.createKeyframeNode(N);let{screenSpaceError:R,keyframeNodes:E}=A,I=pbt(R),w=!1;for(let N=0;N<E.length;N++){let B=E[N];B.priority=10*I+gbt(c,B.keyframe,d,e),B.state!==Ki.LoadState.UNAVAILABLE&&B.state!==Ki.LoadState.FAILED&&B.priority!==-Number.MAX_VALUE&&s.insert(B),B.state===Ki.LoadState.LOADED&&(w=!0)}if(R<r||!w){A.children=void 0;return}l(A.children)||A.constructChildNodes(o);for(let N=0;N<8;N++){let B=A.children[N];C(B,b)}}s.reset(),C(e.rootNode,rs.MASK_INDETERMINATE);let V=e._highPriorityKeyframeNodes,L=0,Z;for(;s.length>0;)Z=s.removeMaximum(),Z.highPriorityFrameNumber=n,V[L]=Z,L++;let G=e._keyframeNodesInMegatexture,X=e.megatextures[0],v=X.occupiedCount;G.length=v,G.sort(function(A,b){return A.highPriorityFrameNumber===b.highPriorityFrameNumber?b.priority-A.priority:b.highPriorityFrameNumber-A.highPriorityFrameNumber});let P=0,F=0;for(let A=0;A<L;A++)if(Z=V[A],!(Z.state===Ki.LoadState.LOADED||Z.spatialNode===void 0)&&(Z.state===Ki.LoadState.UNLOADED&&fbt(e,Z),Z.state===Ki.LoadState.RECEIVED)){let b=0;if(X.isFull()){b=v-1-P,P++;let R=G[b];R.spatialNode.destroyKeyframeNode(R,e.megatextures)}else b=v+F,F++;Z.spatialNode.addKeyframeNodeToMegatextures(Z,e.megatextures),G[b]=Z}}function gbt(e,t,n,i){let o=Math.min(Math.abs(t-e),Math.abs(t-n)),r=Math.max(e,i._keyframeCount-n-1,1),s=Math.pow(1-o/r,4),a=Math.exp(-i._binaryTreeKeyframeWeighting[t]);return W.lerp(a,s,.15+.85*s)}function ybt(e,t,n,i){let o=e._keyframeCount,r=e.rootNode,s=Object.keys(Ki.LoadState).length,a=new Array(s),c=new Array(s),d=0;for(let C=0;C<s;C++){let V=new Array(o);a[C]=V;for(let L=0;L<o;L++)V[L]=0;c[C]=0}function u(C){let V=C.keyframeNodes;for(let L=0;L<V.length;L++){let Z=V[L],G=Z.keyframe,X=Z.state;a[X][G]+=1,c[X]+=1,d++}if(l(C.children))for(let L=0;L<8;L++){let Z=C.children[L];u(Z)}}u(r);let m=`KEYFRAMES: ${a[Ki.LoadState.LOADED]}`,p=`UNLOADED: ${c[Ki.LoadState.UNLOADED]} | RECEIVING: ${c[Ki.LoadState.RECEIVING]} | RECEIVED: ${c[Ki.LoadState.RECEIVED]} | LOADED: ${c[Ki.LoadState.LOADED]} | FAILED: ${c[Ki.LoadState.FAILED]} | UNAVAILABLE: ${c[Ki.LoadState.UNAVAILABLE]} | TOTAL: ${d}`,g=Math.round(t*100)/100,f=Math.round(n*100)/100,x=Math.round(i*100)/100,_=`LOAD: ${g} | OCT: ${f} | ALL: ${x}`;console.log(`${m} || ${p} || ${_}`)}var S3={INTERNAL:0,LEAF:1,PACKED_LEAF_FROM_PARENT:2};function xbt(e,t,n){let i=e._primitive._screenSpaceError,o=e._keyframeLocation,r=e._frameNumber,s=t>=2,a=0,c=0,d=[],u=[];function m(g,f,x,_,C){let V=!1;if(l(g.children))for(let L=0;L<8;L++){let Z=g.children[L];Z.computeSurroundingRenderableKeyframeNodes(o),Z.isRenderable(r)&&(V=!0)}if(V){d[C]=S3.INTERNAL<<16|f,d[x]=_,a++,_=f,C=_*9+1;for(let L=0;L<8;L++){let Z=g.children[L];f=a,x=f*9+0,m(Z,f,x,_,C+L)}}else{if(s){let L=c*5,Z=g.renderableKeyframeNodePrevious,G=g.level-Z.spatialNode.level,X=Z.spatialNode.parent,v=l(X)?X.renderableKeyframeNodePrevious:Z,P=_bt(g,i,n),F=G,A=1,b=Z.megatextureIndex,R=v.megatextureIndex;u[L+0]=P,u[L+1]=F,u[L+2]=A,u[L+3]=b,u[L+4]=R,d[C]=S3.LEAF<<16|c}else{let L=g.renderableKeyframeNodePrevious,G=g.level-L.spatialNode.level===0?S3.LEAF:S3.PACKED_LEAF_FROM_PARENT;d[C]=G<<16|L.megatextureIndex}c++}}let p=e.rootNode;p.computeSurroundingRenderableKeyframeNodes(o),p.isRenderable(r)&&m(p,0,0,0,0),Tbt(d,9,e.internalNodeTilesPerRow,e.internalNodeTexture),s&&Sbt(u,2,e.leafNodeTilesPerRow,e.leafNodeTexture)}function _bt(e,t,n){if(e.parent===void 0)return 0;let i=e.screenSpaceError,o=e.parent.screenSpaceError,s=((t-i)/(o-i)+n-1)/n;return W.clamp(s,0,1)}function Tbt(e,t,n,i){let o=at.componentsLength(i.pixelFormat),r=Math.ceil(e.length/t),s=Math.max(1,t*Math.min(r,n)),a=Math.max(1,Math.ceil(r/n)),c=new Uint8Array(s*a*o);for(let m=0;m<e.length;m++){let p=e[m],g=m*o;for(let f=0;f<o;f++)c[g+f]=p>>>f*8&255}let u={source:{arrayBufferView:c,width:s,height:a},xOffset:0,yOffset:0};i.copyFrom(u)}function Sbt(e,t,n,i){let o=at.componentsLength(i.pixelFormat),r=5,s=Math.ceil(e.length/r),a=Math.max(1,t*Math.min(s,n)),c=Math.max(1,Math.ceil(s/n)),d=new Uint8Array(a*c*o);for(let p=0;p<s;p++){let g=e[p*r+0],f=e[p*r+1],x=e[p*r+2],_=e[p*r+3],C=e[p*r+4],V=W.clamp(Math.floor(65536*g),0,65535);d[p*8+0]=V>>>0&255,d[p*8+1]=V>>>8&255,d[p*8+2]=f&255,d[p*8+3]=x&255,d[p*8+4]=_>>>0&255,d[p*8+5]=_>>>8&255,d[p*8+6]=C>>>0&255,d[p*8+7]=C>>>8&255}let m={source:{arrayBufferView:d,width:a,height:c},xOffset:0,yOffset:0};i.copyFrom(m)}db.getApproximateTextureMemoryByteLength=function(e,t,n,i){let o=0,r=n.length;for(let s=0;s<r;s++){let a=n[s],c=i[s],d=zt.getComponentCount(a);o+=sL.getApproximateTextureMemoryByteLength(e,t,d,c)}return o};var aL=db;var cYi=T(S(),1);var UBi=T(S(),1),Cbt={FLOAT:"float",VEC2:"vec2",VEC3:"vec3",VEC4:"vec4",INT:"int",INT_VEC2:"ivec2",INT_VEC3:"ivec3",INT_VEC4:"ivec4",BOOL:"bool",BOOL_VEC2:"bvec2",BOOL_VEC3:"bvec3",BOOL_VEC4:"bvec4",MAT2:"mat2",MAT3:"mat3",MAT4:"mat4",SAMPLER_2D:"sampler2D",SAMPLER_CUBE:"samplerCube"},cL=Object.freeze(Cbt);var qBi=T(S(),1);function lL(){this._defaultTexture=void 0,this._textures={},this._loadedImages=[],this._lastUpdatedFrame=-1}lL.prototype.getTexture=function(e){return this._textures[e]};function Vbt(e,t,n){n.resource.fetchImage().then(function(i){e._loadedImages.push({id:t,image:i,textureUniform:n})}).catch(function(){let i=e._textures[t];l(i)&&i!==e._defaultTexture&&i.destroy(),e._textures[t]=e._defaultTexture})}lL.prototype.loadTexture2D=function(e,t){l(t.typedArray)?this._loadedImages.push({id:e,textureUniform:t}):Vbt(this,e,t)};function Lbt(e,t,n){let{id:i,textureUniform:o,image:r}=t,s=n.webgl2?C3(o,r,n):Rbt(o,r,n),a=e._textures[i];l(a)&&a!==n.defaultTexture&&a.destroy(),e._textures[i]=s}function C3(e,t,n){let{typedArray:i,sampler:o}=e,r=l(i)?nTe(e,n):new Et({context:n,source:t,sampler:o});return tTe(o)&&r.generateMipmap(),r}function Rbt(e,t,n){let{typedArray:i,sampler:o}=e,r=tTe(o),s=o.wrapS===Cn.REPEAT||o.wrapS===Cn.MIRRORED_REPEAT||o.wrapT===Cn.REPEAT||o.wrapT===Cn.MIRRORED_REPEAT,{width:a,height:c}=l(i)?e:t,d=[a,c].every(W.isPowerOfTwo);if((r||s)&&!d)if(l(i)){if(e.pixelDatatype===ze.UNSIGNED_BYTE){let m=yZ(i,a,c),p=cg(m);return C3({sampler:o},p,n)}}else{let m=cg(t);return C3(e,m,n)}else return C3(e,t,n);return r?console.warn("Texture requires resizing for mipmaps but pixelDataType cannot be resized. The texture may be rendered incorrectly."):s&&console.warn("Texture requires resizing for wrapping but pixelDataType cannot be resized. The texture may be rendered incorrectly."),nTe(e,n)}function tTe(e){return[rn.NEAREST_MIPMAP_NEAREST,rn.NEAREST_MIPMAP_LINEAR,rn.LINEAR_MIPMAP_NEAREST,rn.LINEAR_MIPMAP_LINEAR].includes(e.minificationFilter)}function nTe(e,t){let{pixelFormat:n,pixelDatatype:i,width:o,height:r,typedArray:s,sampler:a}=e;return new Et({context:t,pixelFormat:n,pixelDatatype:i,source:{arrayBufferView:s,width:o,height:r},sampler:a,flipY:!1})}lL.prototype.update=function(e){if(e.frameNumber===this._lastUpdatedFrame)return;this._lastUpdatedFrame=e.frameNumber;let t=e.context;this._defaultTexture=t.defaultTexture;let n=this._loadedImages;for(let i=0;i<n.length;i++){let o=n[i];Lbt(this,o,t)}n.length=0};lL.prototype.isDestroyed=function(){return!1};lL.prototype.destroy=function(){let e=this._textures;for(let t in e)if(e.hasOwnProperty(t)){let n=e[t];n!==this._defaultTexture&&n.destroy()}return me(this)};var v9=lL;function w9(e){e=y(e,y.EMPTY_OBJECT),this.mode=y(e.mode,b0.MODIFY_MATERIAL),this.lightingModel=e.lightingModel,this.uniforms=y(e.uniforms,y.EMPTY_OBJECT),this.varyings=y(e.varyings,y.EMPTY_OBJECT),this.vertexShaderText=e.vertexShaderText,this.fragmentShaderText=e.fragmentShaderText,this.translucencyMode=y(e.translucencyMode,vg.INHERIT),this._textureManager=new v9,this._defaultTexture=void 0,this.uniformMap=Zbt(this),this.usedVariablesVertex={attributeSet:{},featureIdSet:{},metadataSet:{}},this.usedVariablesFragment={attributeSet:{},featureIdSet:{},metadataSet:{},materialSet:{}},Xbt(this),Ibt(this)}function Zbt(e){let t=e.uniforms,n={};for(let i in t)if(t.hasOwnProperty(i)){let o=t[i];o.type===cL.SAMPLER_2D?(e._textureManager.loadTexture2D(i,o.value),n[i]=Gbt(e,i)):n[i]=Ebt(e,i)}return n}function Gbt(e,t){return function(){return y(e._textureManager.getTexture(t),e._defaultTexture)}}function Ebt(e,t){return function(){return e.uniforms[t].value}}function qT(e,t,n){let i;for(;(i=t.exec(e))!==null;){let o=i[1];n[o]=!0}}function Xbt(e){let t=/[vf]sInput\.attributes\.(\w+)/g,n=/[vf]sInput\.featureIds\.(\w+)/g,i=/[vf]sInput\.metadata.(\w+)/g,o,r=e.vertexShaderText;l(r)&&(o=e.usedVariablesVertex.attributeSet,qT(r,t,o),o=e.usedVariablesVertex.featureIdSet,qT(r,n,o),o=e.usedVariablesVertex.metadataSet,qT(r,i,o));let s=e.fragmentShaderText;if(l(s)){o=e.usedVariablesFragment.attributeSet,qT(s,t,o),o=e.usedVariablesFragment.featureIdSet,qT(s,n,o),o=e.usedVariablesFragment.metadataSet,qT(s,i,o);let a=/material\.(\w+)/g,c=e.usedVariablesFragment.materialSet;qT(s,a,c)}}function iTe(e){let t=/^.*MC$/,n=/^.*WC$/,i=/^.*EC$/;return t.test(e)?`${e} (model coordinates)`:n.test(e)?`${e} (Cartesian world coordinates)`:i.test(e)?`${e} (eye coordinates)`:e}function Rc(e,t,n,i){if(e.hasOwnProperty(t)){let o=`${iTe(t)} is not available in the ${i} shader. Did you mean ${iTe(n)} instead?`;throw new fe(o)}}function Ibt(e){let t=e.usedVariablesVertex.attributeSet;Rc(t,"position","positionMC","vertex"),Rc(t,"normal","normalMC","vertex"),Rc(t,"tangent","tangentMC","vertex"),Rc(t,"bitangent","bitangentMC","vertex"),Rc(t,"positionWC","positionMC","vertex"),Rc(t,"positionEC","positionMC","vertex"),Rc(t,"normalEC","normalMC","vertex"),Rc(t,"tangentEC","tangentMC","vertex"),Rc(t,"bitangentEC","bitangentMC","vertex");let n=e.usedVariablesFragment.attributeSet;Rc(n,"position","positionEC","fragment"),Rc(n,"normal","normalEC","fragment"),Rc(n,"tangent","tangentEC","fragment"),Rc(n,"bitangent","bitangentEC","fragment"),Rc(n,"normalMC","normalEC","fragment"),Rc(n,"tangentMC","tangentEC","fragment"),Rc(n,"bitangentMC","bitangentEC","fragment")}w9.prototype.setUniform=function(e,t){let n=this.uniforms[e];n.type===cL.SAMPLER_2D?this._textureManager.loadTexture2D(e,t):l(t.clone)?n.value=t.clone(n.value):n.value=t};w9.prototype.update=function(e){this._defaultTexture=e.context.defaultTexture,this._textureManager.update(e)};w9.prototype.isDestroyed=function(){return!1};w9.prototype.destroy=function(){this._textureManager=this._textureManager&&this._textureManager.destroy(),me(this)};var $T=w9;function qf(e){e=y(e,y.EMPTY_OBJECT),this._ready=!1,this._provider=y(e.provider,qf.DefaultProvider),this._traversal=void 0,this._shape=void 0,this._shapeVisible=!1,this._paddingBefore=new h,this._paddingAfter=new h,this._minBounds=new h,this._minBoundsOld=new h,this._maxBounds=new h,this._maxBoundsOld=new h,this._exaggeratedMinBounds=new h,this._exaggeratedMinBoundsOld=new h,this._exaggeratedMaxBounds=new h,this._exaggeratedMaxBoundsOld=new h,this._minClippingBounds=new h,this._minClippingBoundsOld=new h,this._maxClippingBounds=new h,this._maxClippingBoundsOld=new h,this._clippingPlanes=void 0,this._clippingPlanesState=0,this._clippingPlanesEnabled=!1,this._modelMatrix=M.clone(y(e.modelMatrix,M.IDENTITY)),this._exaggeratedModelMatrix=M.clone(this._modelMatrix),this._compoundModelMatrix=new M,this._compoundModelMatrixOld=new M,this._customShader=y(e.customShader,qf.DefaultCustomShader),this._customShaderCompilationEvent=new ge,this._shaderDirty=!0,this._drawCommand=void 0,this._drawCommandPick=void 0,this._pickId=void 0,this._clock=e.clock,this._transformPositionWorldToUv=new M,this._transformPositionUvToWorld=new M,this._transformDirectionWorldToLocal=new $,this._transformNormalLocalToWorld=new $,this._jitter=!1,this._nearestSampling=!1,this._levelBlendFactor=0,this._stepSizeMultiplier=1,this._depthTest=!0,this._useLogDepth=void 0,this._screenSpaceError=4,this._debugPolylines=new qm,this._debugDraw=!1,this._disableRender=!1,this._disableUpdate=!1,this._uniforms={octreeInternalNodeTexture:void 0,octreeInternalNodeTilesPerRow:0,octreeInternalNodeTexelSizeUv:new D,octreeLeafNodeTexture:void 0,octreeLeafNodeTilesPerRow:0,octreeLeafNodeTexelSizeUv:new D,megatextureTextures:[],megatextureSliceDimensions:new D,megatextureTileDimensions:new D,megatextureVoxelSizeUv:new D,megatextureSliceSizeUv:new D,megatextureTileSizeUv:new D,dimensions:new h,paddingBefore:new h,paddingAfter:new h,transformPositionViewToUv:new M,transformPositionUvToView:new M,transformDirectionViewToLocal:new $,transformNormalLocalToWorld:new $,cameraPositionUv:new h,ndcSpaceAxisAlignedBoundingBox:new se,clippingPlanesTexture:void 0,clippingPlanesMatrix:new M,stepSize:0,pickColor:new Y},this._shapeDefinesOld={},this._uniformMap={};let t=this._uniforms,n=this._uniformMap;for(let o in t)if(t.hasOwnProperty(o)){let r=`u_${o}`;n[r]=function(){return t[o]}}let i=this._provider;Wbt(this,i)}function Wbt(e,t){let{shape:n,minBounds:i=Xi.getMinBounds(n),maxBounds:o=Xi.getMaxBounds(n)}=t;e.minBounds=i,e.maxBounds=o,e.minClippingBounds=Xi.getMinBounds(n),e.maxClippingBounds=Xi.getMaxBounds(n),e._exaggeratedMinBounds=h.clone(e._minBounds,e._exaggeratedMinBounds),e._exaggeratedMaxBounds=h.clone(e._maxBounds,e._exaggeratedMaxBounds),e._exaggeratedModelMatrix=M.clone(e._modelMatrix,e._exaggeratedModelMatrix),rTe(e,t);let r=Xi.getShapeConstructor(n);e._shape=new r,e._shapeVisible=sTe(e,e._shape,t)}Object.defineProperties(qf.prototype,{ready:{get:function(){return this._ready}},provider:{get:function(){return this._provider}},boundingSphere:{get:function(){return this._shape.boundingSphere}},orientedBoundingBox:{get:function(){return this._shape.orientedBoundingBox}},modelMatrix:{get:function(){return this._modelMatrix},set:function(e){this._modelMatrix=M.clone(e,this._modelMatrix)}},shape:{get:function(){return this._provider.shape}},dimensions:{get:function(){return this._provider.dimensions}},minimumValues:{get:function(){return this._provider.minimumValues}},maximumValues:{get:function(){return this._provider.maximumValues}},show:{get:function(){return!this._disableRender},set:function(e){this._disableRender=!e}},disableUpdate:{get:function(){return this._disableUpdate},set:function(e){this._disableUpdate=e}},debugDraw:{get:function(){return this._debugDraw},set:function(e){this._debugDraw=e}},depthTest:{get:function(){return this._depthTest},set:function(e){this._depthTest!==e&&(this._depthTest=e,this._shaderDirty=!0)}},jitter:{get:function(){return this._jitter},set:function(e){this._jitter!==e&&(this._jitter=e,this._shaderDirty=!0)}},nearestSampling:{get:function(){return this._nearestSampling},set:function(e){this._nearestSampling!==e&&(this._nearestSampling=e,this._shaderDirty=!0)}},levelBlendFactor:{get:function(){return this._levelBlendFactor},set:function(e){this._levelBlendFactor=W.clamp(e,0,1)}},screenSpaceError:{get:function(){return this._screenSpaceError},set:function(e){this._screenSpaceError=e}},stepSize:{get:function(){return this._stepSizeMultiplier},set:function(e){this._stepSizeMultiplier=e}},minBounds:{get:function(){return this._minBounds},set:function(e){this._minBounds=h.clone(e,this._minBounds)}},maxBounds:{get:function(){return this._maxBounds},set:function(e){this._maxBounds=h.clone(e,this._maxBounds)}},minClippingBounds:{get:function(){return this._minClippingBounds},set:function(e){this._minClippingBounds=h.clone(e,this._minClippingBounds)}},maxClippingBounds:{get:function(){return this._maxClippingBounds},set:function(e){this._maxClippingBounds=h.clone(e,this._maxClippingBounds)}},clippingPlanes:{get:function(){return this._clippingPlanes},set:function(e){ss.setOwner(e,this,"_clippingPlanes")}},customShader:{get:function(){return this._customShader},set:function(e){if(this._customShader!==e){let t=this._uniformMap,i=this._customShader.uniformMap;for(let o in i)i.hasOwnProperty(o)&&delete t[o];l(e)?this._customShader=e:this._customShader=qf.DefaultCustomShader,this._shaderDirty=!0}}},customShaderCompilationEvent:{get:function(){return this._customShaderCompilationEvent}}});var Pbt=new h,vbt=new se,wbt=new se,Fbt=new h,Abt=new h,Mbt=new $,Nbt=new $,kbt=new M,Ubt=new M,Dbt=new M,Bbt=M.fromRotationTranslation($.fromUniformScale(.5,new $),new h(.5,.5,.5),new M),Ybt=M.fromRotationTranslation($.fromUniformScale(2,new $),new h(-1,-1,-1),new M);qf.prototype.update=function(e){let t=this._provider;this._customShader.update(e);let n=e.context;if(!this._ready){Qbt(this,t,n),e.afterRender.push(()=>(this._ready=!0,!0));return}Kbt(this,e);let i=rTe(this,t),o=this._shape;if(i&&(this._shapeVisible=sTe(this,o,t),$bt(this,o)&&(this._shaderDirty=!0)),!this._shapeVisible)return;let r=egt(t.timeIntervalCollection,this._clock),s=this._traversal,a=s._sampleCount;if(s.update(e,r,i,this._disableUpdate),a!==s._sampleCount&&(this._shaderDirty=!0),!s.isRenderable(s.rootNode)||(this._debugDraw&&cgt(this,e),this._disableRender))return;this._useLogDepth!==e.useLogDepth&&(this._useLogDepth=e.useLogDepth,this._shaderDirty=!0),tgt(this,e)&&(this._shaderDirty=!0);let d=s.leafNodeTexture,u=this._uniforms;l(d)&&(u.octreeLeafNodeTexture=s.leafNodeTexture,u.octreeLeafNodeTexelSizeUv=D.clone(s.leafNodeTexelSizeUv,u.octreeLeafNodeTexelSizeUv),u.octreeLeafNodeTilesPerRow=s.leafNodeTilesPerRow),this._shaderDirty&&(I9(this,n),this._shaderDirty=!1);let m=n.uniformState.viewProjection,p=o.orientedBoundingBox,g=ogt(p,m,wbt);if(g.x===1||g.y===1||g.z===-1||g.w===-1)return;u.ndcSpaceAxisAlignedBoundingBox=se.clone(g,u.ndcSpaceAxisAlignedBoundingBox);let x=n.uniformState.inverseView;u.transformPositionViewToUv=M.multiplyTransformation(this._transformPositionWorldToUv,x,u.transformPositionViewToUv);let _=n.uniformState.view;u.transformPositionUvToView=M.multiplyTransformation(_,this._transformPositionUvToWorld,u.transformPositionUvToView);let C=n.uniformState.inverseViewRotation;u.transformDirectionViewToLocal=$.multiply(this._transformDirectionWorldToLocal,C,u.transformDirectionViewToLocal),u.transformNormalLocalToWorld=$.clone(this._transformNormalLocalToWorld,u.transformNormalLocalToWorld);let V=e.camera.positionWC;u.cameraPositionUv=M.multiplyByPoint(this._transformPositionWorldToUv,V,u.cameraPositionUv),u.stepSize=this._stepSizeMultiplier;let L=e.passes.pick?this._drawCommandPick:e.passes.pickVoxel?this._drawCommandPickVoxel:this._drawCommand;L.boundingVolume=o.boundingSphere,e.commandList.push(L)};var Obt=new h,U8=new h,Hbt=new he,zbt=new h;function Kbt(e,t){if(e._exaggeratedMinBounds=h.clone(e._minBounds,e._exaggeratedMinBounds),e._exaggeratedMaxBounds=h.clone(e._maxBounds,e._exaggeratedMaxBounds),e.shape===Xi.ELLIPSOID){let n=t.verticalExaggerationRelativeHeight,i=t.verticalExaggeration;e._exaggeratedMinBounds.z=(e._minBounds.z-n)*i+n,e._exaggeratedMaxBounds.z=(e._maxBounds.z-n)*i+n}else if(e.shape===Xi.BOX){let n=h.fromElements(1,1,t.verticalExaggeration,Obt);e._exaggeratedModelMatrix=M.multiplyByScale(e._modelMatrix,n,e._exaggeratedModelMatrix),e._exaggeratedModelMatrix=M.multiplyByTranslation(e._exaggeratedModelMatrix,Jbt(e,t),e._exaggeratedModelMatrix)}}function Jbt(e,t){let{shapeTransform:n=M.IDENTITY,globalTransform:i=M.IDENTITY}=e._provider,o=M.getTranslation(n,U8),r=M.multiplyByPoint(e._modelMatrix,o,U8),s=M.multiplyByPoint(i,r,U8),c=ie.WGS84.cartesianToCartographic(s,Hbt),d=0;l(c)&&(d=c.height);let u=mr.getHeight(d,t.verticalExaggeration,t.verticalExaggerationRelativeHeight);return h.fromElements(0,0,(u-d)/t.verticalExaggeration,zbt)}function Qbt(e,t,n){let i=e._uniforms;e._pickId=n.createPickId({primitive:e}),i.pickColor=Y.clone(e._pickId.color,i.pickColor);let{shaderDefines:o,shaderUniforms:r}=e._shape;e._shapeDefinesOld=Oe(o,!0);let s=e._uniformMap;for(let a in r)if(r.hasOwnProperty(a)){let c=`u_${a}`;s[c]=function(){return r[a]}}i.dimensions=h.clone(t.dimensions,i.dimensions),e._paddingBefore=h.clone(y(t.paddingBefore,h.ZERO),e._paddingBefore),i.paddingBefore=h.clone(e._paddingBefore,i.paddingBefore),e._paddingAfter=h.clone(y(t.paddingAfter,h.ZERO),e._paddingBefore),i.paddingAfter=h.clone(e._paddingAfter,i.paddingAfter),e._traversal=jbt(e,t,n),qbt(e._traversal,i)}function rTe(e,t){let n=y(t.shapeTransform,M.IDENTITY),i=y(t.globalTransform,M.IDENTITY);return M.multiplyTransformation(i,e._exaggeratedModelMatrix,e._compoundModelMatrix),M.multiplyTransformation(e._compoundModelMatrix,n,e._compoundModelMatrix),eS(e,"_compoundModelMatrix","_compoundModelMatrixOld")+eS(e,"_minBounds","_minBoundsOld")+eS(e,"_maxBounds","_maxBoundsOld")+eS(e,"_exaggeratedMinBounds","_exaggeratedMinBoundsOld")+eS(e,"_exaggeratedMaxBounds","_exaggeratedMaxBoundsOld")+eS(e,"_minClippingBounds","_minClippingBoundsOld")+eS(e,"_maxClippingBounds","_maxClippingBoundsOld")>0}function eS(e,t,n){let i=e[t],o=e[n],r=!i.equals(o);return r&&i.clone(o),r?1:0}function sTe(e,t,n){if(!t.update(e._compoundModelMatrix,e._exaggeratedMinBounds,e._exaggeratedMaxBounds,e.minClippingBounds,e.maxClippingBounds))return!1;let o=t.shapeTransform,r=M.inverse(o,kbt),s=M.getRotation(o,Mbt),a=M.getScale(o,Fbt),c=h.maximumComponent(a),d=h.divideByScalar(a,c,Abt),u=$.multiplyByScale(s,d,Nbt);return e._transformPositionWorldToUv=M.multiplyTransformation(Bbt,r,e._transformPositionWorldToUv),e._transformPositionUvToWorld=M.multiplyTransformation(o,Ybt,e._transformPositionUvToWorld),e._transformDirectionWorldToLocal=M.getMatrix3(r,e._transformDirectionWorldToLocal),e._transformNormalLocalToWorld=$.inverseTranspose(u,e._transformNormalLocalToWorld),!0}function jbt(e,t,n){let i=h.clone(t.dimensions,Pbt);h.add(i,e._paddingBefore,i),h.add(i,e._paddingAfter,i);let o=t.maximumTileCount,r=l(o)?aL.getApproximateTextureMemoryByteLength(o,i,t.types,t.componentTypes):void 0,s=y(t.keyframeCount,1);return new aL(e,n,i,t.types,t.componentTypes,s,r)}function qbt(e,t){t.octreeInternalNodeTexture=e.internalNodeTexture,t.octreeInternalNodeTexelSizeUv=D.clone(e.internalNodeTexelSizeUv,t.octreeInternalNodeTexelSizeUv),t.octreeInternalNodeTilesPerRow=e.internalNodeTilesPerRow;let n=e.megatextures,i=n[0],o=n.length;t.megatextureTextures=new Array(o);for(let r=0;r<o;r++)t.megatextureTextures[r]=n[r].texture;t.megatextureSliceDimensions=D.clone(i.sliceCountPerRegion,t.megatextureSliceDimensions),t.megatextureTileDimensions=D.clone(i.regionCountPerMegatexture,t.megatextureTileDimensions),t.megatextureVoxelSizeUv=D.clone(i.voxelSizeUv,t.megatextureVoxelSizeUv),t.megatextureSliceSizeUv=D.clone(i.sliceSizeUv,t.megatextureSliceSizeUv),t.megatextureTileSizeUv=D.clone(i.regionSizeUv,t.megatextureTileSizeUv)}function $bt(e,t){let n=t.shaderDefines,i=Object.keys(n).some(o=>n[o]!==e._shapeDefinesOld[o]);return i&&(e._shapeDefinesOld=Oe(n,!0)),i}function egt(e,t){if(!l(e)||!l(t))return 0;let n=t.currentTime,i,o=e.indexOf(n);o>=0?i=e.get(o):(o=~o,o===e.length?(o=e.length-1,i=e.get(o),n=i.stop):(i=e.get(o),n=i.start));let r=te.secondsDifference(i.stop,i.start),a=te.secondsDifference(n,i.start)/r;return o+a}function tgt(e,t){let n=e.clippingPlanes;if(!l(n))return!1;n.update(t);let{clippingPlanesState:i,enabled:o}=n;if(o){let r=e._uniforms;r.clippingPlanesTexture=n.texture,r.clippingPlanesMatrix=M.transpose(M.multiplyTransformation(M.inverse(n.modelMatrix,r.clippingPlanesMatrix),e._transformPositionUvToWorld,r.clippingPlanesMatrix),r.clippingPlanesMatrix)}return e._clippingPlanesState===i&&e._clippingPlanesEnabled===o?!1:(e._clippingPlanesState=i,e._clippingPlanesEnabled=o,!0)}qf.prototype.isDestroyed=function(){return!1};qf.prototype.destroy=function(){let e=this._drawCommand;l(e)&&(e.shaderProgram=e.shaderProgram&&e.shaderProgram.destroy());let t=this._drawCommandPick;return l(t)&&(t.shaderProgram=t.shaderProgram&&t.shaderProgram.destroy()),this._pickId=this._pickId&&this._pickId.destroy(),this._traversal=this._traversal&&this._traversal.destroy(),this._clippingPlanes=this._clippingPlanes&&this._clippingPlanes.destroy(),me(this)};var oTe=new Array(new se(-1,-1,-1,1),new se(1,-1,-1,1),new se(-1,1,-1,1),new se(1,1,-1,1),new se(-1,-1,1,1),new se(1,-1,1,1),new se(-1,1,1,1),new se(1,1,1,1)),ngt=new Array(1,2,4,0,3,5,0,3,6,1,2,7,0,5,6,1,4,7,2,4,7,3,5,6),igt=new Array(new se,new se,new se,new se,new se,new se,new se,new se);function ogt(e,t,n){let i=M.fromRotationTranslation(e.halfAxes,e.center,Ubt),o=M.multiply(t,i,Dbt),r=+Number.MAX_VALUE,s=-Number.MAX_VALUE,a=+Number.MAX_VALUE,c=-Number.MAX_VALUE,d,u=igt,m=oTe.length;for(d=0;d<m;d++)M.multiplyByVector(o,oTe[d],u[d]);for(d=0;d<m;d++){let p=u[d];if(p.z>=-p.w){let g=p.x/p.w,f=p.y/p.w;r=Math.min(r,g),s=Math.max(s,g),a=Math.min(a,f),c=Math.max(c,f)}else for(let g=0;g<3;g++){let f=ngt[d*3+g],x=u[f];if(x.z>=-x.w){let _=p.z+p.w,C=x.z+x.w,V=_/(_-C),L=se.lerp(p,x,V,vbt),Z=L.x/L.w,G=L.y/L.w;r=Math.min(r,Z),s=Math.max(s,Z),a=Math.min(a,G),c=Math.max(c,G)}}}return r=W.clamp(r,-1,1),a=W.clamp(a,-1,1),s=W.clamp(s,-1,1),c=W.clamp(c,-1,1),n=se.fromElements(r,a,s,c,n),n}var D8=3e7,rgt=new h(D8,0,0),sgt=new h(0,D8,0),agt=new h(0,0,D8);function cgt(e,t){let n=e._traversal,i=e._debugPolylines;i.removeAll();function o(c,d,u,m){i.add({positions:[c,d],width:m,material:Mi.fromType("Color",{color:u})})}function r(c,d,u){let m=c.computeCorners();o(m[0],m[1],d,u),o(m[2],m[3],d,u),o(m[4],m[5],d,u),o(m[6],m[7],d,u),o(m[0],m[2],d,u),o(m[4],m[6],d,u),o(m[1],m[3],d,u),o(m[5],m[7],d,u),o(m[0],m[4],d,u),o(m[2],m[6],d,u),o(m[1],m[5],d,u),o(m[3],m[7],d,u)}function s(c){if(!n.isRenderable(c))return;let d=c.level,m=Math.max(1,5/Math.pow(2,d)),g=[Y.RED,Y.LIME,Y.BLUE][d%3];if(r(c.orientedBoundingBox,g,m),l(c.children))for(let f=0;f<8;f++)s(c.children[f])}r(e._shape.orientedBoundingBox,Y.WHITE,5),s(n.rootNode);let a=10;o(h.ZERO,rgt,Y.RED,a),o(h.ZERO,sgt,Y.LIME,a),o(h.ZERO,agt,Y.BLUE,a),i.update(t)}qf.DefaultCustomShader=new $T({fragmentShaderText:`void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material) { material.diffuse = vec3(1.0); material.alpha = 1.0; }`});function aTe(){this.ready=!0,this.shape=Xi.BOX,this.dimensions=new h(1,1,1),this.names=["data"],this.types=[zt.SCALAR],this.componentTypes=[an.FLOAT32],this.maximumTileCount=1}aTe.prototype.requestData=function(e){if(!((l(e)?y(e.tileLevel,0):0)>=1))return Promise.resolve([new Float32Array(1)])};qf.DefaultProvider=new aTe;var Iy=qf;var L3=function(e){return function(){e.frameState.afterRender.push(function(){e.requestRender()})}};function mi(e){e=y(e,y.EMPTY_OBJECT);let t=e.canvas,n=e.creditContainer,i=e.creditViewport,o=Oe(e.contextOptions),r=l(n),s=new aw(t,o);r||(n=document.createElement("div"),n.style.position="absolute",n.style.bottom="0",n.style["text-shadow"]="0 0 2px #000000",n.style.color="#ffffff",n.style["font-size"]="10px",n.style["padding-right"]="5px",t.parentNode.appendChild(n)),l(i)||(i=t.parentNode),this._id=Yn(),this._jobScheduler=new CF,this._frameState=new TF(s,new fF(n," \u2022 ",i),this._jobScheduler),this._frameState.scene3DOnly=y(e.scene3DOnly,!1),this._removeCreditContainer=!r,this._creditContainer=n,this._canvas=t,this._context=s,this._computeEngine=new nw(s),this._globe=void 0,this._globeTranslucencyState=new SF,this._primitives=new Ul,this._groundPrimitives=new Ul,this._globeHeight=void 0,this._globeHeightDirty=!0,this._cameraUnderground=!1,this._removeUpdateHeightCallback=void 0,this._logDepthBuffer=mi.defaultLogDepthBuffer&&s.fragmentDepth,this._logDepthBufferDirty=!0,this._tweens=new zT,this._shaderFrameCount=0,this._sunPostProcess=void 0,this._computeCommandList=[],this._overlayCommandList=[],this._useOIT=y(e.orderIndependentTranslucency,!0),this._executeOITFunction=void 0,this._depthPlane=new gF(e.depthPlaneEllipsoidOffset),this._clearColorCommand=new oi({color:new Y,stencil:0,owner:this}),this._depthClearCommand=new oi({depth:1,owner:this}),this._stencilClearCommand=new oi({stencil:0}),this._classificationStencilClearCommand=new oi({stencil:0,renderState:De.fromCache({stencilMask:Nt.CLASSIFICATION_MASK})}),this._depthOnlyRenderStateCache={},this._transitioner=new o9(this),this._preUpdate=new ge,this._postUpdate=new ge,this._renderError=new ge,this._preRender=new ge,this._postRender=new ge,this._minimumDisableDepthTestDistance=0,this._debugInspector=new h9,this._msaaSamples=y(e.msaaSamples,1),this.rethrowRenderErrors=!1,this.completeMorphOnUserInput=!0,this.morphStart=new ge,this.morphComplete=new ge,this.skyBox=void 0,this.skyAtmosphere=void 0,this.sun=void 0,this.sunBloom=!0,this._sunBloom=void 0,this.moon=void 0,this.backgroundColor=Y.clone(Y.BLACK),this._mode=oe.SCENE3D,this._mapProjection=l(e.mapProjection)?e.mapProjection:new Si,this.morphTime=1,this.farToNearRatio=1e3,this.logarithmicDepthFarToNearRatio=1e9,this.nearToFarDistance2D=175e4,this.verticalExaggeration=1,this.verticalExaggerationRelativeHeight=0,this.debugCommandFilter=void 0,this.debugShowCommands=!1,this.debugShowFrustums=!1,this.debugShowFramesPerSecond=!1,this.debugShowDepthFrustum=1,this.debugShowFrustumPlanes=!1,this._debugShowFrustumPlanes=!1,this._debugFrustumPlanes=void 0,this.useDepthPicking=!0,this.pickTranslucentDepth=!1,this.cameraEventWaitTime=500,this.atmosphere=new sF,this.fog=new _F,this._shadowMapCamera=new ao(this),this.shadowMap=new ob({context:s,lightCamera:this._shadowMapCamera,enabled:y(e.shadows,!1)}),this.invertClassification=!1,this.invertClassificationColor=Y.clone(Y.WHITE),this._actualInvertClassificationColor=Y.clone(this._invertClassificationColor),this._invertClassification=new eL,this.focalLength=void 0,this.eyeSeparation=void 0,this.postProcessStages=new n9,this._brdfLutGenerator=new cF,this._performanceDisplay=void 0,this._debugVolume=void 0,this._screenSpaceCameraController=new c9(this),this._cameraUnderground=!1,this._mapMode2D=y(e.mapMode2D,Ql.INFINITE_SCROLL),this._environmentState={skyBoxCommand:void 0,skyAtmosphereCommand:void 0,sunDrawCommand:void 0,sunComputeCommand:void 0,moonCommand:void 0,isSunVisible:!1,isMoonVisible:!1,isReadyForAtmosphere:!1,isSkyAtmosphereVisible:!1,clearGlobeDepth:!1,useDepthPlane:!1,renderTranslucentDepthForPick:!1,originalFramebuffer:void 0,useGlobeDepthFramebuffer:!1,useOIT:!1,useInvertClassification:!1,usePostProcess:!1,usePostProcessSelected:!1,useWebVR:!1},this._useWebVR=!1,this._cameraVR=void 0,this._aspectRatioVR=void 0,this.requestRenderMode=y(e.requestRenderMode,!1),this._renderRequested=!0,this.maximumRenderTimeChange=y(e.maximumRenderTimeChange,0),this._lastRenderTime=void 0,this._frameRateMonitor=void 0,this._removeRequestListenerCallback=Oa.requestCompletedEvent.addEventListener(L3(this)),this._removeTaskProcessorListenerCallback=hi.taskCompletedEvent.addEventListener(L3(this)),this._removeGlobeCallbacks=[],this._removeTerrainProviderReadyListener=void 0;let a=new He(0,0,s.drawingBufferWidth,s.drawingBufferHeight),c=new ao(this);this._logDepthBuffer&&(c.frustum.near=.1,c.frustum.far=1e10),this.preloadFlightCamera=new ao(this),this.preloadFlightCullingVolume=void 0,this._picking=new vF(this),this._defaultView=new kT(this,c,a),this._view=this._defaultView,this._hdr=void 0,this._hdrDirty=void 0,this.highDynamicRange=!1,this.gamma=2.2,this.sphericalHarmonicCoefficients=void 0,this.specularEnvironmentMaps=void 0,this._specularEnvironmentMapAtlas=void 0,this.light=new H0,uTe(this,0,te.now()),this.updateFrameState(),this.initializeFrame()}mi.defaultLogDepthBuffer=!0;function lgt(e,t){for(let i=0;i<e._removeGlobeCallbacks.length;++i)e._removeGlobeCallbacks[i]();e._removeGlobeCallbacks.length=0;let n=[];l(t)&&(n.push(t.imageryLayersUpdatedEvent.addEventListener(L3(e))),n.push(t.terrainProviderChanged.addEventListener(L3(e)))),e._removeGlobeCallbacks=n}Object.defineProperties(mi.prototype,{canvas:{get:function(){return this._canvas}},drawingBufferHeight:{get:function(){return this._context.drawingBufferHeight}},drawingBufferWidth:{get:function(){return this._context.drawingBufferWidth}},maximumAliasedLineWidth:{get:function(){return Mt.maximumAliasedLineWidth}},maximumCubeMapSize:{get:function(){return Mt.maximumCubeMapSize}},pickPositionSupported:{get:function(){return this._context.depthTexture}},sampleHeightSupported:{get:function(){return this._context.depthTexture}},clampToHeightSupported:{get:function(){return this._context.depthTexture}},invertClassificationSupported:{get:function(){return this._context.depthTexture}},specularEnvironmentMapsSupported:{get:function(){return Am.isSupported(this._context)}},globe:{get:function(){return this._globe},set:function(e){this._globe=this._globe&&this._globe.destroy(),this._globe=e,lgt(this,e)}},primitives:{get:function(){return this._primitives}},groundPrimitives:{get:function(){return this._groundPrimitives}},camera:{get:function(){return this._view.camera},set:function(e){this._view.camera=e}},view:{get:function(){return this._view},set:function(e){this._view=e}},defaultView:{get:function(){return this._defaultView}},picking:{get:function(){return this._picking}},screenSpaceCameraController:{get:function(){return this._screenSpaceCameraController}},mapProjection:{get:function(){return this._mapProjection}},jobScheduler:{get:function(){return this._jobScheduler}},frameState:{get:function(){return this._frameState}},environmentState:{get:function(){return this._environmentState}},tweens:{get:function(){return this._tweens}},imageryLayers:{get:function(){if(l(this.globe))return this.globe.imageryLayers}},terrainProvider:{get:function(){if(l(this.globe))return this.globe.terrainProvider},set:function(e){this._removeTerrainProviderReadyListener=this._removeTerrainProviderReadyListener&&this._removeTerrainProviderReadyListener(),l(this.globe)&&(this.globe.terrainProvider=e)}},terrainProviderChanged:{get:function(){if(l(this.globe))return this.globe.terrainProviderChanged}},preUpdate:{get:function(){return this._preUpdate}},postUpdate:{get:function(){return this._postUpdate}},renderError:{get:function(){return this._renderError}},preRender:{get:function(){return this._preRender}},postRender:{get:function(){return this._postRender}},lastRenderTime:{get:function(){return this._lastRenderTime}},context:{get:function(){return this._context}},debugFrustumStatistics:{get:function(){return this._view.debugFrustumStatistics}},scene3DOnly:{get:function(){return this._frameState.scene3DOnly}},orderIndependentTranslucency:{get:function(){return this._useOIT}},id:{get:function(){return this._id}},mode:{get:function(){return this._mode},set:function(e){e===oe.SCENE2D?this.morphTo2D(0):e===oe.SCENE3D?this.morphTo3D(0):e===oe.COLUMBUS_VIEW&&this.morphToColumbusView(0),this._mode=e}},frustumCommandsList:{get:function(){return this._view.frustumCommandsList}},numberOfFrustums:{get:function(){return this._view.frustumCommandsList.length}},useWebVR:{get:function(){return this._useWebVR},set:function(e){this._useWebVR=e,this._useWebVR?(this._frameState.creditDisplay.container.style.visibility="hidden",this._cameraVR=new ao(this),l(this._deviceOrientationCameraController)||(this._deviceOrientationCameraController=new xF(this)),this._aspectRatioVR=this.camera.frustum.aspectRatio):(this._frameState.creditDisplay.container.style.visibility="visible",this._cameraVR=void 0,this._deviceOrientationCameraController=this._deviceOrientationCameraController&&!this._deviceOrientationCameraController.isDestroyed()&&this._deviceOrientationCameraController.destroy(),this.camera.frustum.aspectRatio=this._aspectRatioVR,this.camera.frustum.xOffset=0)}},mapMode2D:{get:function(){return this._mapMode2D}},splitPosition:{get:function(){return this._frameState.splitPosition},set:function(e){this._frameState.splitPosition=e}},minimumDisableDepthTestDistance:{get:function(){return this._minimumDisableDepthTestDistance},set:function(e){this._minimumDisableDepthTestDistance=e}},logarithmicDepthBuffer:{get:function(){return this._logDepthBuffer},set:function(e){e=this._context.fragmentDepth&&e,this._logDepthBuffer!==e&&(this._logDepthBuffer=e,this._logDepthBufferDirty=!0)}},gamma:{get:function(){return this._context.uniformState.gamma},set:function(e){this._context.uniformState.gamma=e}},highDynamicRange:{get:function(){return this._hdr},set:function(e){let t=this._context,n=e&&t.depthTexture&&(t.colorBufferFloat||t.colorBufferHalfFloat);this._hdrDirty=n!==this._hdr,this._hdr=n}},highDynamicRangeSupported:{get:function(){let e=this._context;return e.depthTexture&&(e.colorBufferFloat||e.colorBufferHalfFloat)}},cameraUnderground:{get:function(){return this._cameraUnderground}},msaaSamples:{get:function(){return this._msaaSamples},set:function(e){e=Math.min(e,Mt.maximumSamples),this._msaaSamples=e}},msaaSupported:{get:function(){return this._context.msaa}},pixelRatio:{get:function(){return this._frameState.pixelRatio},set:function(e){this._frameState.pixelRatio=e}},opaqueFrustumNearOffset:{get:function(){return .9999}},globeHeight:{get:function(){return this._globeHeight}}});mi.prototype.getCompressedTextureFormatSupported=function(e){let t=this.context;return(e==="WEBGL_compressed_texture_s3tc"||e==="s3tc")&&t.s3tc||(e==="WEBGL_compressed_texture_pvrtc"||e==="pvrtc")&&t.pvrtc||(e==="WEBGL_compressed_texture_etc"||e==="etc")&&t.etc||(e==="WEBGL_compressed_texture_etc1"||e==="etc1")&&t.etc1||(e==="WEBGL_compressed_texture_astc"||e==="astc")&&t.astc||(e==="EXT_texture_compression_bptc"||e==="bc7")&&t.bc7};function cTe(e,t,n){let i=e._frameState,o=e._context,r=e._view.oit,s=i.shadowState.lightShadowMaps,a=i.shadowState.lightShadowsEnabled,c=t.derivedCommands;l(t.pickId)&&(c.picking=eb.createPickDerivedCommand(e,t,o,c.picking)),t.pickOnly||(c.depth=eb.createDepthOnlyDerivedCommand(e,t,o,c.depth)),c.originalCommand=t,e._hdr&&(c.hdr=eb.createHdrCommand(t,o,c.hdr),t=c.hdr.command,c=t.derivedCommands),a&&t.receiveShadows&&(c.shadows=ob.createReceiveDerivedCommand(s,t,n,o,c.shadows)),t.pass===Re.TRANSLUCENT&&l(r)&&r.isSupported()&&(a&&t.receiveShadows?(c.oit=l(c.oit)?c.oit:{},c.oit.shadows=r.createDerivedCommands(c.shadows.receiveCommand,o,c.oit.shadows)):c.oit=r.createDerivedCommands(t,o,c.oit))}mi.prototype.updateDerivedCommands=function(e){if(!l(e.derivedCommands))return;let t=this._frameState,n=this._context,i=!1,o=t.shadowState.lastDirtyTime;e.lastDirtyTime!==o&&(e.lastDirtyTime=o,e.dirty=!0,i=!0);let r=t.useLogDepth,s=this._hdr,a=e.derivedCommands,c=l(a.logDepth),d=l(a.hdr),u=l(a.originalCommand),m=r&&!c,p=s&&!d,g=(!r||!s)&&!u;if(e.dirty=e.dirty||m||p||g,e.dirty){e.dirty=!1;let f=t.shadowState.shadowMaps;t.shadowState.shadowsEnabled&&e.castShadows&&(a.shadows=ob.createCastDerivedCommand(f,e,i,n,a.shadows)),(c||m)&&(a.logDepth=eb.createLogDepthCommand(e,n,a.logDepth),cTe(this,a.logDepth.command,i)),(u||g)&&cTe(this,e,i)}};var dgt=new tm({pass:Io.RENDER}),B8=new tm({pass:Io.PRELOAD}),Y8=new tm({pass:Io.PRELOAD_FLIGHT}),ugt=new tm({pass:Io.REQUEST_RENDER_MODE_DEFER_CHECK}),lTe=new le,O8;function mgt(e){let t=e.globe;if(e._mode===oe.SCENE3D&&l(t)&&t.show&&!e._cameraUnderground&&!e._globeTranslucencyState.translucent){let n=t.ellipsoid,i=e.frameState.minimumTerrainHeight;return lTe.radius=n.minimumRadius+i,O8=BR.fromBoundingSphere(lTe,e.camera.positionWC,O8),O8}}mi.prototype.clearPasses=function(e){e.render=!1,e.pick=!1,e.pickVoxel=!1,e.depth=!1,e.postProcess=!1,e.offscreen=!1};function uTe(e,t,n){let i=e._frameState;i.frameNumber=t,i.time=te.clone(n,i.time)}mi.prototype.updateFrameState=function(){let e=this.camera,t=this._frameState;t.commandList.length=0,t.shadowMaps.length=0,t.brdfLutGenerator=this._brdfLutGenerator,t.environmentMap=this.skyBox&&this.skyBox._cubeMap,t.mode=this._mode,t.morphTime=this.morphTime,t.mapProjection=this.mapProjection,t.camera=e,t.cullingVolume=e.frustum.computeCullingVolume(e.positionWC,e.directionWC,e.upWC),t.occluder=mgt(this),t.minimumTerrainHeight=0,t.minimumDisableDepthTestDistance=this._minimumDisableDepthTestDistance,t.invertClassification=this.invertClassification,t.useLogDepth=this._logDepthBuffer&&!(this.camera.frustum instanceof on||this.camera.frustum instanceof Zr),t.light=this.light,t.cameraUnderground=this._cameraUnderground,t.globeTranslucencyState=this._globeTranslucencyState;let{globe:n}=this;l(n)&&n._terrainExaggerationChanged&&(this.verticalExaggeration=n._terrainExaggeration,this.verticalExaggerationRelativeHeight=n._terrainExaggerationRelativeHeight,n._terrainExaggerationChanged=!1),t.verticalExaggeration=this.verticalExaggeration,t.verticalExaggerationRelativeHeight=this.verticalExaggerationRelativeHeight,l(this._specularEnvironmentMapAtlas)&&this._specularEnvironmentMapAtlas.ready?(t.specularEnvironmentMaps=this._specularEnvironmentMapAtlas.texture,t.specularEnvironmentMapsMaximumLOD=this._specularEnvironmentMapAtlas.maximumMipmapLevel):(t.specularEnvironmentMaps=void 0,t.specularEnvironmentMapsMaximumLOD=void 0),t.sphericalHarmonicCoefficients=this.sphericalHarmonicCoefficients,this._actualInvertClassificationColor=Y.clone(this.invertClassificationColor,this._actualInvertClassificationColor),eL.isTranslucencySupported(this._context)||(this._actualInvertClassificationColor.alpha=1),t.invertClassificationColor=this._actualInvertClassificationColor,l(this.globe)?t.maximumScreenSpaceError=this.globe.maximumScreenSpaceError:t.maximumScreenSpaceError=2,this.clearPasses(t.passes),t.tilesetPassState=void 0};mi.prototype.isVisible=function(e,t,n){return l(e)&&(!l(e.boundingVolume)||!e.cull||t.computeVisibility(e.boundingVolume)!==Kt.OUTSIDE&&(!l(n)||!e.occlude||!e.boundingVolume.isOccluded(n)))};var V3=new M(0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,1);V3=M.inverseTransformation(V3,V3);function hgt(e,t,n,i){let o=t._frameState,r=o.context,s=e.boundingVolume;l(t._debugVolume)&&t._debugVolume.destroy();let a,c=h.clone(s.center);if(o.mode!==oe.SCENE3D){c=M.multiplyByPoint(V3,c,c);let p=o.mapProjection,g=p.unproject(c);c=p.ellipsoid.cartographicToCartesian(g)}if(l(s.radius)){let p=s.radius;a=An.toWireframe(Xs.createGeometry(new Xs({radii:new h(p,p,p),vertexFormat:dn.FLAT_VERTEX_FORMAT}))),t._debugVolume=new En({geometryInstances:new St({geometry:a,modelMatrix:M.fromTranslation(c),attributes:{color:new Ht(1,0,0,1)}}),appearance:new dn({flat:!0,translucent:!1}),asynchronous:!1})}else{let p=s.halfAxes;a=An.toWireframe(yl.createGeometry(yl.fromDimensions({dimensions:new h(2,2,2),vertexFormat:dn.FLAT_VERTEX_FORMAT}))),t._debugVolume=new En({geometryInstances:new St({geometry:a,modelMatrix:M.fromRotationTranslation(p,c,new M),attributes:{color:new Ht(1,0,0,1)}}),appearance:new dn({flat:!0,translucent:!1}),asynchronous:!1})}let d=o.commandList,u=o.commandList=[];t._debugVolume.update(o),e=u[0],o.useLogDepth&&(e=eb.createLogDepthCommand(e,r).command);let m;l(i)&&(m=n.framebuffer,n.framebuffer=i),e.execute(r,n),l(m)&&(n.framebuffer=m),o.commandList=d}function Aa(e,t,n,i,o){let r=t._frameState;if(l(t.debugCommandFilter)&&!t.debugCommandFilter(e))return;if(e instanceof oi){e.execute(n,i);return}e.debugShowBoundingVolume&&l(e.boundingVolume)&&hgt(e,t,i,o),r.useLogDepth&&l(e.derivedCommands.logDepth)&&(e=e.derivedCommands.logDepth.command);let s=r.passes;if(!s.pick&&!s.pickVoxel&&!s.depth&&t._hdr&&l(e.derivedCommands)&&l(e.derivedCommands.hdr)&&(e=e.derivedCommands.hdr.command),s.pick||s.depth){if(s.pick&&!s.depth&&l(e.derivedCommands.picking)){e=e.derivedCommands.picking.pickCommand,e.execute(n,i);return}else if(l(e.derivedCommands.depth)){e=e.derivedCommands.depth.depthOnlyCommand,e.execute(n,i);return}}if(t.debugShowCommands||t.debugShowFrustums){t._debugInspector.executeDebugShowFrustumsCommand(t,e,i);return}r.shadowState.lightShadowsEnabled&&e.receiveShadows&&l(e.derivedCommands.shadows)?e.derivedCommands.shadows.receiveCommand.execute(n,i):e.execute(n,i)}function F9(e,t,n,i){let o=t._frameState,r=e.derivedCommands;l(r)&&(o.useLogDepth&&l(r.logDepth)&&(e=r.logDepth.command),r=e.derivedCommands,l(r.picking)?(e=r.picking.pickCommand,e.execute(n,i)):l(r.depth)&&(e=r.depth.depthOnlyCommand,e.execute(n,i)))}function mTe(e,t,n){return t.boundingVolume.distanceSquaredTo(n)-e.boundingVolume.distanceSquaredTo(n)}function fgt(e,t,n){return e.boundingVolume.distanceSquaredTo(n)-t.boundingVolume.distanceSquaredTo(n)+W.EPSILON12}function pgt(e,t,n,i,o){let r=e.context;wp(i,mTe,e.camera.positionWC),l(o)&&t(o.unclassifiedCommand,e,r,n);let s=i.length;for(let a=0;a<s;++a)t(i[a],e,r,n)}function bgt(e,t,n,i,o){let r=e.context;wp(i,fgt,e.camera.positionWC),l(o)&&t(o.unclassifiedCommand,e,r,n);let s=i.length;for(let a=0;a<s;++a)t(i[a],e,r,n)}function ggt(e,t,n,i){let o=e.context;wp(i,mTe,e.camera.positionWC);let r=i.length;for(let s=0;s<r;++s)t(i[s],e,o,n)}var ygt=new yi,xgt=new Uc,_gt=new on,Tgt=new Zr;function z8(e,t){let{camera:n,context:i,frameState:o}=e,{uniformState:r}=i;r.updateCamera(n);let s;l(n.frustum.fov)?s=n.frustum.clone(ygt):l(n.frustum.infiniteProjectionMatrix)?s=n.frustum.clone(xgt):l(n.frustum.width)?s=n.frustum.clone(_gt):s=n.frustum.clone(Tgt),s.near=n.frustum.near,s.far=n.frustum.far,r.updateFrustum(s),r.updatePass(Re.ENVIRONMENT);let a=o.passes,c=a.pick||a.pickVoxel,d=e._environmentState,u=e._view,m=d.renderTranslucentDepthForPick,p=d.useWebVR;if(!c){let R=d.skyBoxCommand;if(l(R)&&Aa(R,e,i,t),d.isSkyAtmosphereVisible&&Aa(d.skyAtmosphereCommand,e,i,t),d.isSunVisible&&(d.sunDrawCommand.execute(i,t),e.sunBloom&&!p)){let E;d.useGlobeDepthFramebuffer?E=u.globeDepth.framebuffer:d.usePostProcess?E=u.sceneFramebuffer.framebuffer:E=d.originalFramebuffer,e._sunPostProcess.execute(i),e._sunPostProcess.copy(i,E),t.framebuffer=E}d.isMoonVisible&&d.moonCommand.execute(i,t)}let g;d.useOIT?(l(e._executeOITFunction)||(e._executeOITFunction=function(R,E,I,w,N){u.globeDepth.prepareColorTextures(i),u.oit.executeCommands(R,E,I,w,N)}),g=e._executeOITFunction):a.render?g=pgt:g=bgt;let f=u.frustumCommandsList,x=f.length,_=d.clearGlobeDepth,C=d.useDepthPlane,V=e._globeTranslucencyState,L=V.translucent,Z=e._view.globeTranslucencyFramebuffer,G=e._depthClearCommand,X=e._stencilClearCommand,v=e._classificationStencilClearCommand,P=e._depthPlane,F=d.usePostProcessSelected,A=n.position.z,b;for(let R=0;R<x;++R){let E=x-R-1,I=f[E];e.mode===oe.SCENE2D?(n.position.z=A-I.near+1,s.far=Math.max(1,I.far-I.near),s.near=1,r.update(o),r.updateFrustum(s)):(s.near=E!==0?I.near*e.opaqueFrustumNearOffset:I.near,s.far=I.far,r.updateFrustum(s)),G.execute(i,t),i.stencilBuffer&&X.execute(i,t),r.updatePass(Re.GLOBE);let w=I.commands[Re.GLOBE],N=I.indices[Re.GLOBE];if(L)V.executeGlobeCommands(I,Aa,Z,e,t);else for(b=0;b<N;++b)Aa(w[b],e,i,t);let B=u.globeDepth;if(l(B)&&d.useGlobeDepthFramebuffer&&B.executeCopyDepth(i,t),!d.renderTranslucentDepthForPick)if(r.updatePass(Re.TERRAIN_CLASSIFICATION),w=I.commands[Re.TERRAIN_CLASSIFICATION],N=I.indices[Re.TERRAIN_CLASSIFICATION],L)V.executeGlobeClassificationCommands(I,Aa,Z,e,t);else for(b=0;b<N;++b)Aa(w[b],e,i,t);if(_&&(G.execute(i,t),C&&P.execute(i,t)),!d.useInvertClassification||c||d.renderTranslucentDepthForPick){for(r.updatePass(Re.CESIUM_3D_TILE),w=I.commands[Re.CESIUM_3D_TILE],N=I.indices[Re.CESIUM_3D_TILE],b=0;b<N;++b)Aa(w[b],e,i,t);if(N>0&&(l(B)&&d.useGlobeDepthFramebuffer&&(B.prepareColorTextures(i,_),B.executeUpdateDepth(i,t,_,B.depthStencilTexture)),!d.renderTranslucentDepthForPick))for(r.updatePass(Re.CESIUM_3D_TILE_CLASSIFICATION),w=I.commands[Re.CESIUM_3D_TILE_CLASSIFICATION],N=I.indices[Re.CESIUM_3D_TILE_CLASSIFICATION],b=0;b<N;++b)Aa(w[b],e,i,t)}else{e._invertClassification.clear(i,t);let J=t.framebuffer;for(t.framebuffer=e._invertClassification._fbo.framebuffer,r.updatePass(Re.CESIUM_3D_TILE),w=I.commands[Re.CESIUM_3D_TILE],N=I.indices[Re.CESIUM_3D_TILE],b=0;b<N;++b)Aa(w[b],e,i,t);for(l(B)&&d.useGlobeDepthFramebuffer&&(e._invertClassification.prepareTextures(i),B.executeUpdateDepth(i,t,_,e._invertClassification._fbo.getDepthStencilTexture())),r.updatePass(Re.CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW),w=I.commands[Re.CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW],N=I.indices[Re.CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW],b=0;b<N;++b)Aa(w[b],e,i,t);for(t.framebuffer=J,e._invertClassification.executeClassified(i,t),o.invertClassificationColor.alpha===1&&e._invertClassification.executeUnclassified(i,t),N>0&&i.stencilBuffer&&v.execute(i,t),r.updatePass(Re.CESIUM_3D_TILE_CLASSIFICATION),w=I.commands[Re.CESIUM_3D_TILE_CLASSIFICATION],N=I.indices[Re.CESIUM_3D_TILE_CLASSIFICATION],b=0;b<N;++b)Aa(w[b],e,i,t)}for(N>0&&i.stencilBuffer&&X.execute(i,t),r.updatePass(Re.VOXELS),w=I.commands[Re.VOXELS],N=I.indices[Re.VOXELS],w.length=N,ggt(e,Aa,t,w),r.updatePass(Re.OPAQUE),w=I.commands[Re.OPAQUE],N=I.indices[Re.OPAQUE],b=0;b<N;++b)Aa(w[b],e,i,t);E!==0&&e.mode!==oe.SCENE2D&&(s.near=I.near,r.updateFrustum(s));let U;if(!c&&d.useInvertClassification&&o.invertClassificationColor.alpha<1&&(U=e._invertClassification),r.updatePass(Re.TRANSLUCENT),w=I.commands[Re.TRANSLUCENT],w.length=I.indices[Re.TRANSLUCENT],g(e,Aa,t,w,U),I.indices[Re.CESIUM_3D_TILE_CLASSIFICATION]>0&&u.translucentTileClassification.isSupported()&&(u.translucentTileClassification.executeTranslucentCommands(e,Aa,t,w,B.depthStencilTexture),u.translucentTileClassification.executeClassificationCommands(e,Aa,t,I)),i.depthTexture&&e.useDepthPicking&&(d.useGlobeDepthFramebuffer||m)){let J=B.depthStencilTexture,H=e._picking.getPickDepth(e,E);H.update(i,J),H.executeCopyDepth(i,t)}if(c||!F)continue;let k=t.framebuffer;if(t.framebuffer=u.sceneFramebuffer.getIdFramebuffer(),s.near=E!==0?I.near*e.opaqueFrustumNearOffset:I.near,s.far=I.far,r.updateFrustum(s),r.updatePass(Re.GLOBE),w=I.commands[Re.GLOBE],N=I.indices[Re.GLOBE],L)V.executeGlobeCommands(I,F9,Z,e,t);else for(b=0;b<N;++b)F9(w[b],e,i,t);for(_&&(G.framebuffer=t.framebuffer,G.execute(i,t),G.framebuffer=void 0),_&&C&&P.execute(i,t),r.updatePass(Re.CESIUM_3D_TILE),w=I.commands[Re.CESIUM_3D_TILE],N=I.indices[Re.CESIUM_3D_TILE],b=0;b<N;++b)F9(w[b],e,i,t);for(r.updatePass(Re.OPAQUE),w=I.commands[Re.OPAQUE],N=I.indices[Re.OPAQUE],b=0;b<N;++b)F9(w[b],e,i,t);for(r.updatePass(Re.TRANSLUCENT),w=I.commands[Re.TRANSLUCENT],N=I.indices[Re.TRANSLUCENT],b=0;b<N;++b)F9(w[b],e,i,t);t.framebuffer=k}}function hTe(e){e.context.uniformState.updatePass(Re.COMPUTE);let n=e._environmentState.sunComputeCommand;l(n)&&n.execute(e._computeEngine);let i=e._computeCommandList,o=i.length;for(let r=0;r<o;++r)i[r].execute(e._computeEngine)}function Sgt(e,t){e.context.uniformState.updatePass(Re.OVERLAY);let i=e.context,o=e._overlayCommandList,r=o.length;for(let s=0;s<r;++s)o[s].execute(i,t)}function Cgt(e,t,n){let i=n.shadowMapCullingVolume,o=n.isPointLight,r=n.passes,s=r.length,a=t.length;for(let c=0;c<a;++c){let d=t[c];if(e.updateDerivedCommands(d),d.castShadows&&(d.pass===Re.GLOBE||d.pass===Re.CESIUM_3D_TILE||d.pass===Re.OPAQUE||d.pass===Re.TRANSLUCENT)&&e.isVisible(d,i))if(o)for(let u=0;u<s;++u)r[u].commandList.push(d);else if(s===1)r[0].commandList.push(d);else{let u=!1;for(let m=s-1;m>=0;--m){let p=r[m].cullingVolume;if(e.isVisible(d,p))r[m].commandList.push(d),u=!0;else if(u)break}}}}function fTe(e){let t=e.frameState,n=t.shadowState.shadowMaps,i=n.length;if(!t.shadowState.shadowsEnabled)return;let o=e.context,r=o.uniformState;for(let s=0;s<i;++s){let a=n[s];if(a.outOfView)continue;let c=a.passes,d=c.length;for(let m=0;m<d;++m)c[m].commandList.length=0;let u=e.frameState.commandList;Cgt(e,u,a);for(let m=0;m<d;++m){let p=a.passes[m];r.updateCamera(p.camera),a.updatePass(o,m);let g=p.commandList.length;for(let f=0;f<g;++f){let x=p.commandList[f];r.updatePass(x.pass),Aa(x.derivedCommands.shadows.castCommands[s],e,o,p.passState)}}}}var Vgt=new h;mi.prototype.updateAndExecuteCommands=function(e,t){let i=this._frameState.mode;this._environmentState.useWebVR?Lgt(this,e,t):i!==oe.SCENE2D||this._mapMode2D===Ql.ROTATE?Wy(!0,this,e,t):(K8(this,e,t),vgt(this,e))};function Lgt(e,t,n){let i=e._view,o=i.camera,s=e._environmentState.renderTranslucentDepthForPick;K8(e,t,n),pTe(e),i.createPotentiallyVisibleSet(e),hTe(e),s||fTe(e);let a=t.viewport;a.x=0,a.y=0,a.width=a.width*.5;let c=ao.clone(o,e._cameraVR);c.frustum=o.frustum;let d=o.frustum.near,u=d*y(e.focalLength,5),m=y(e.eyeSeparation,u/30),p=h.multiplyByScalar(c.right,m*.5,Vgt);o.frustum.aspectRatio=a.width/a.height;let g=.5*m*d/u;h.add(c.position,p,o.position),o.frustum.xOffset=g,z8(e,t),a.x=a.width,h.subtract(c.position,p,o.position),o.frustum.xOffset=-g,z8(e,t),ao.clone(c,o)}var Rgt=new he(Math.PI,W.PI_OVER_TWO),Zgt=new h,Ggt=new h,Egt=new M,Xgt=new M,Igt=new h,Wgt=new h,Pgt=new He;function vgt(e,t){let n=e.context,i=e.frameState,o=e.camera,r=t.viewport,s=He.clone(r,Pgt);t.viewport=s;let a=Rgt,c=Zgt;e.mapProjection.project(a,c);let u=h.clone(o.position,Ggt),m=M.clone(o.transform,Xgt),p=o.frustum.clone();o._setTransform(M.IDENTITY);let g=M.computeViewportTransformation(s,0,1,Egt),f=o.frustum.projectionMatrix,x=o.positionWC.y,_=h.fromElements(W.sign(x)*c.x-x,0,-o.positionWC.x,Igt),C=Gt.pointToGLWindowCoordinates(f,g,_,Wgt);C.x=Math.floor(C.x);let V=s.x,L=s.width;if(x===0||C.x<=V||C.x>=V+L)Wy(!0,e,t);else if(Math.abs(V+L*.5-C.x)<1)s.width=C.x-s.x,o.position.x*=W.sign(o.position.x),o.frustum.right=0,i.cullingVolume=o.frustum.computeCullingVolume(o.positionWC,o.directionWC,o.upWC),n.uniformState.update(i),Wy(!0,e,t),s.x=C.x,o.position.x=-o.position.x,o.frustum.right=-o.frustum.left,o.frustum.left=0,i.cullingVolume=o.frustum.computeCullingVolume(o.positionWC,o.directionWC,o.upWC),n.uniformState.update(i),Wy(!1,e,t);else if(C.x>V+L*.5){s.width=C.x-V;let Z=o.frustum.right;o.frustum.right=c.x-x,i.cullingVolume=o.frustum.computeCullingVolume(o.positionWC,o.directionWC,o.upWC),n.uniformState.update(i),Wy(!0,e,t),s.x=C.x,s.width=V+L-C.x,o.position.x=-o.position.x,o.frustum.left=-o.frustum.right,o.frustum.right=Z-o.frustum.right*2,i.cullingVolume=o.frustum.computeCullingVolume(o.positionWC,o.directionWC,o.upWC),n.uniformState.update(i),Wy(!1,e,t)}else{s.x=C.x,s.width=V+L-C.x;let Z=o.frustum.left;o.frustum.left=-c.x-x,i.cullingVolume=o.frustum.computeCullingVolume(o.positionWC,o.directionWC,o.upWC),n.uniformState.update(i),Wy(!0,e,t),s.x=V,s.width=C.x-V,o.position.x=-o.position.x,o.frustum.right=-o.frustum.left,o.frustum.left=Z-o.frustum.left*2,i.cullingVolume=o.frustum.computeCullingVolume(o.positionWC,o.directionWC,o.upWC),n.uniformState.update(i),Wy(!1,e,t)}o._setTransform(m),h.clone(u,o.position),o.frustum=p.clone(),t.viewport=r}function Wy(e,t,n,i){let o=t._environmentState,r=t._view,s=o.renderTranslucentDepthForPick;e||(t.frameState.commandList.length=0),pTe(t),r.createPotentiallyVisibleSet(t),e&&(l(i)&&K8(t,n,i),hTe(t),s||fTe(t)),z8(t,n)}var dTe=new rs;mi.prototype.updateEnvironment=function(){let e=this._frameState,t=this._view,n=this._environmentState,i=e.passes.render,o=e.passes.offscreen,r=this.atmosphere,s=this.skyAtmosphere,a=this.globe,c=this._globeTranslucencyState;if(!i||this._mode!==oe.SCENE2D&&t.camera.frustum instanceof on||!c.environmentVisible)n.skyAtmosphereCommand=void 0,n.skyBoxCommand=void 0,n.sunDrawCommand=void 0,n.sunComputeCommand=void 0,n.moonCommand=void 0;else{if(l(s)){if(l(a))s.setDynamicLighting(WT.fromGlobeFlags(a)),n.isReadyForAtmosphere=n.isReadyForAtmosphere||!a.show||a._surface._tilesToRender.length>0;else{let C=r.dynamicLighting;s.setDynamicLighting(C),n.isReadyForAtmosphere=!0}n.skyAtmosphereCommand=s.update(e,a),l(n.skyAtmosphereCommand)&&this.updateDerivedCommands(n.skyAtmosphereCommand)}else n.skyAtmosphereCommand=void 0;n.skyBoxCommand=l(this.skyBox)?this.skyBox.update(e,this._hdr):void 0;let _=l(this.sun)?this.sun.update(e,t.passState,this._hdr):void 0;n.sunDrawCommand=l(_)?_.drawCommand:void 0,n.sunComputeCommand=l(_)?_.computeCommand:void 0,n.moonCommand=l(this.moon)?this.moon.update(e):void 0}let d=n.clearGlobeDepth=l(a)&&a.show&&(!a.depthTestAgainstTerrain||this.mode===oe.SCENE2D);(n.useDepthPlane=d&&this.mode===oe.SCENE3D&&c.useDepthPlane)&&this._depthPlane.update(e),n.renderTranslucentDepthForPick=!1,n.useWebVR=this._useWebVR&&this.mode!==oe.SCENE2D&&!o;let m=e.mode===oe.SCENE3D&&!c.sunVisibleThroughGlobe?e.occluder:void 0,p=e.cullingVolume,g=dTe.planes;for(let _=0;_<5;++_)g[_]=p.planes[_];p=dTe,n.isSkyAtmosphereVisible=l(n.skyAtmosphereCommand)&&n.isReadyForAtmosphere,n.isSunVisible=this.isVisible(n.sunDrawCommand,p,m),n.isMoonVisible=this.isVisible(n.moonCommand,p,m);let f=this.specularEnvironmentMaps,x=this._specularEnvironmentMapAtlas;l(f)&&(!l(x)||x.url!==f)?(x=x&&x.destroy(),this._specularEnvironmentMapAtlas=new Am(f)):!l(f)&&l(x)&&(x.destroy(),this._specularEnvironmentMapAtlas=void 0),l(this._specularEnvironmentMapAtlas)&&this._specularEnvironmentMapAtlas.update(e)};function wgt(e){let t=e._frameState;e.debugShowFrustumPlanes!==e._debugShowFrustumPlanes&&(e.debugShowFrustumPlanes?e._debugFrustumPlanes=new Df({camera:e.camera,updateOnChange:!1,frustumSplits:t.frustumSplits}):e._debugFrustumPlanes=e._debugFrustumPlanes&&e._debugFrustumPlanes.destroy(),e._debugShowFrustumPlanes=e.debugShowFrustumPlanes),l(e._debugFrustumPlanes)&&e._debugFrustumPlanes.update(t)}function Fgt(e){let t=e._frameState,n=t.shadowMaps,i=n.length,o=i>0&&!t.passes.pick&&!t.passes.pickVoxel&&e.mode===oe.SCENE3D;if(o!==t.shadowState.shadowsEnabled&&(++t.shadowState.lastDirtyTime,t.shadowState.shadowsEnabled=o),t.shadowState.lightShadowsEnabled=!1,!!o){for(let r=0;r<i;++r)if(n[r]!==t.shadowState.shadowMaps[r]){++t.shadowState.lastDirtyTime;break}t.shadowState.shadowMaps.length=0,t.shadowState.lightShadowMaps.length=0;for(let r=0;r<i;++r){let s=n[r];s.update(t),t.shadowState.shadowMaps.push(s),s.fromLightSource&&(t.shadowState.lightShadowMaps.push(s),t.shadowState.lightShadowsEnabled=!0),s.dirty&&(++t.shadowState.lastDirtyTime,s.dirty=!1)}}}function pTe(e){let t=e._frameState;e._groundPrimitives.update(t),e._primitives.update(t),wgt(e),Fgt(e),e._globe&&e._globe.render(t)}function K8(e,t,n){let i=e._context,o=e._frameState,r=e._environmentState,s=e._view,a=e._frameState.passes,c=a.pick||a.pickVoxel;l(s.globeDepth)&&(s.globeDepth.picking=c);let d=r.useWebVR;r.originalFramebuffer=t.framebuffer,l(e.sun)&&e.sunBloom!==e._sunBloom?(e.sunBloom&&!d?e._sunPostProcess=new u9:l(e._sunPostProcess)&&(e._sunPostProcess=e._sunPostProcess.destroy()),e._sunBloom=e.sunBloom):!l(e.sun)&&l(e._sunPostProcess)&&(e._sunPostProcess=e._sunPostProcess.destroy(),e._sunBloom=!1);let u=e._clearColorCommand;Y.clone(n,u.color),u.execute(i,t);let m=r.useGlobeDepthFramebuffer=l(s.globeDepth);m&&(s.globeDepth.update(i,t,s.viewport,e.msaaSamples,e._hdr,r.clearGlobeDepth),s.globeDepth.clear(i,t,n));let p=s.oit,g=r.useOIT=!c&&l(p)&&p.isSupported();g&&(p.update(i,t,s.globeDepth.colorFramebufferManager,e._hdr,e.msaaSamples),p.clear(i,t,n),r.useOIT=p.isSupported());let f=e.postProcessStages,x=r.usePostProcess=!c&&(e._hdr||f.length>0||f.ambientOcclusion.enabled||f.fxaa.enabled||f.bloom.enabled);if(r.usePostProcessSelected=!1,x&&(s.sceneFramebuffer.update(i,s.viewport,e._hdr,e.msaaSamples),s.sceneFramebuffer.clear(i,t,n),f.update(i,o.useLogDepth,e._hdr),f.clear(i),x=r.usePostProcess=f.ready,r.usePostProcessSelected=x&&f.hasSelected),r.isSunVisible&&e.sunBloom&&!d?(t.framebuffer=e._sunPostProcess.update(t),e._sunPostProcess.clear(i,t,n)):m?t.framebuffer=s.globeDepth.framebuffer:x&&(t.framebuffer=s.sceneFramebuffer.framebuffer),l(t.framebuffer)&&u.execute(i,t),r.useInvertClassification=!c&&l(t.framebuffer)&&e.invertClassification){let C;if(e.frameState.invertClassificationColor.alpha===1&&r.useGlobeDepthFramebuffer&&(C=s.globeDepth.framebuffer),l(C)||i.depthTexture){if(e._invertClassification.previousFramebuffer=C,e._invertClassification.update(i,e.msaaSamples,s.globeDepth.colorFramebufferManager),e._invertClassification.clear(i,t),e.frameState.invertClassificationColor.alpha<1&&g){let V=e._invertClassification.unclassifiedCommand,L=V.derivedCommands;L.oit=p.createDerivedCommands(V,i,L.oit)}}else r.useInvertClassification=!1}e._globeTranslucencyState.translucent&&s.globeTranslucencyFramebuffer.updateAndClear(e._hdr,s.viewport,i,t)}mi.prototype.resolveFramebuffers=function(e){let t=this._context,n=this._environmentState,i=this._view,o=i.globeDepth;l(o)&&o.prepareColorTextures(t);let r=n.useOIT,s=n.useGlobeDepthFramebuffer,a=n.usePostProcess,c=n.originalFramebuffer,d=s?o.colorFramebufferManager:void 0,u=i.sceneFramebuffer._colorFramebuffer,m=i.sceneFramebuffer.idFramebuffer;r&&(e.framebuffer=a?u.framebuffer:c,i.oit.execute(t,e));let p=i.translucentTileClassification;if(p.hasTranslucentDepth&&p.isSupported()&&p.execute(this,e),a){i.sceneFramebuffer.prepareColorTextures(t);let g=u;s&&!r&&(g=d);let f=this.postProcessStages,x=g.getColorTexture(0),_=m.getColorTexture(0),C=y(d,u).getDepthStencilTexture();f.execute(t,x,C,_),f.copy(t,c)}!r&&!a&&s&&(e.framebuffer=c,o.executeCopyColor(t,e))};function Agt(e){let t=e._frameState.afterRender;for(let n=0,i=t.length;n<i;++n)t[n]()&&e.requestRender();t.length=0}function Mgt(e){if(e.mode===oe.MORPHING)return;let n=e.camera.positionCartographic;return e.getHeight(n)}mi.prototype.getHeight=function(e,t){if(!l(e))return;let n=t===Je.CLAMP_TO_TERRAIN||t===Je.RELATIVE_TO_TERRAIN,i=t===Je.CLAMP_TO_3D_TILE||t===Je.RELATIVE_TO_3D_TILE;if(!l(e))return;let o=Number.NEGATIVE_INFINITY;if(!n){let s=this.primitives.length;for(let a=0;a<s;++a){let c=this.primitives.get(a);if(!c.isCesium3DTileset||!c.show||!c.enableCollision)continue;let d=c.getHeight(e,this);l(d)&&d>o&&(o=d)}}let r=this._globe;if(!i&&l(r)&&r.show){let s=r.getHeight(e);s>o&&(o=s)}if(o>Number.NEGATIVE_INFINITY)return o};var H8=new he;mi.prototype.updateHeight=function(e,t,n){let i=()=>{he.clone(e,H8);let g=this.getHeight(e,n);l(g)&&(H8.height=g,t(H8))},o=n===Je.CLAMP_TO_TERRAIN||n===Je.RELATIVE_TO_TERRAIN,r=n===Je.CLAMP_TO_3D_TILE||n===Je.RELATIVE_TO_3D_TILE,s;!r&&l(this.globe)&&(s=this.globe._surface.updateHeight(e,i));let a={},c=this.globe?.ellipsoid,d=g=>{if(o||g.isDestroyed()||!g.isCesium3DTileset)return;let f=g.updateHeight(e,i,c);a[g.id]=f};if(!o){let g=this.primitives.length;for(let f=0;f<g;++f){let x=this.primitives.get(f);d(x)}}let u=this.primitives.primitiveAdded.addEventListener(d),m=this.primitives.primitiveRemoved.addEventListener(g=>{g.isDestroyed()||!g.isCesium3DTileset||(l(a[g.id])&&a[g.id](),delete a[g.id])});return()=>{s=s&&s(),Object.values(a).forEach(g=>g()),a={},u(),m()}};function Ngt(e){let t=e.camera,n=e._mode,i=e._screenSpaceCameraController,o=t.positionCartographic;if(!l(o))return!1;if(!i.onMap()&&o.height<0)return!0;if(n===oe.SCENE2D||n===oe.MORPHING)return!1;let r=e._globeHeight;return l(r)&&o.height<r}mi.prototype.initializeFrame=function(){if(this._shaderFrameCount++===120&&(this._shaderFrameCount=0,this._context.shaderCache.destroyReleasedShaderPrograms(),this._context.textureCache.destroyReleasedTextures()),this._tweens.update(),this._globeHeightDirty){l(this._removeUpdateHeightCallback)&&(this._removeUpdateHeightCallback(),this._removeUpdateHeightCallback=void 0),this._globeHeight=Mgt(this),this._globeHeightDirty=!1;let e=this.camera.positionCartographic;this._removeUpdateHeightCallback=this.updateHeight(e,t=>{this.isDestroyed()||(this._globeHeight=t.height)})}this._cameraUnderground=Ngt(this),this._globeTranslucencyState.update(this),this._screenSpaceCameraController.update(),l(this._deviceOrientationCameraController)&&this._deviceOrientationCameraController.update(),this.camera.update(this._mode),this.camera._updateCameraChanged()};function kgt(e,t){if(e.debugShowFramesPerSecond){if(!l(e._performanceDisplay)){let n=document.createElement("div");n.className="cesium-performanceDisplay-defaultContainer",e._canvas.parentNode.appendChild(n);let o=new tb({container:n});e._performanceDisplay=o,e._performanceContainer=n}e._performanceDisplay.throttled=e.requestRenderMode,e._performanceDisplay.update(t)}else l(e._performanceDisplay)&&(e._performanceDisplay=e._performanceDisplay&&e._performanceDisplay.destroy(),e._performanceContainer.parentNode.removeChild(e._performanceContainer))}function Ugt(e){e._jobScheduler.resetBudgets();let t=e._frameState;e.primitives.prePassesUpdate(t),l(e.globe)&&e.globe.update(t),e._picking.update(),t.creditDisplay.update()}function Dgt(e){let t=e._frameState;e.primitives.postPassesUpdate(t),Oa.update()}var Bgt=new Y;function Ygt(e){let t=e._frameState,n=e.context,i=n.uniformState,o=e._defaultView;e._view=o,e.updateFrameState(),t.passes.render=!0,t.passes.postProcess=e.postProcessStages.hasSelected,t.tilesetPassState=dgt;let r=y(e.backgroundColor,Y.BLACK);e._hdr&&(r=Y.clone(r,Bgt),r.red=Math.pow(r.red,e.gamma),r.green=Math.pow(r.green,e.gamma),r.blue=Math.pow(r.blue,e.gamma)),t.backgroundColor=r,t.atmosphere=e.atmosphere,e.fog.update(t),i.update(t);let s=e.shadowMap;l(s)&&s.enabled&&(!l(e.light)||e.light instanceof H0?h.negate(i.sunDirectionWC,e._shadowMapCamera.direction):h.clone(e.light.direction,e._shadowMapCamera.direction),t.shadowMaps.push(s)),e._computeCommandList.length=0,e._overlayCommandList.length=0;let a=o.viewport;a.x=0,a.y=0,a.width=n.drawingBufferWidth,a.height=n.drawingBufferHeight;let c=o.passState;c.framebuffer=void 0,c.blendingEnabled=void 0,c.scissorTest=void 0,c.viewport=He.clone(a,c.viewport),l(e.globe)&&e.globe.beginFrame(t),e.updateEnvironment(),e.updateAndExecuteCommands(c,r),e.resolveFramebuffers(c),c.framebuffer=void 0,Sgt(e,c),l(e.globe)&&(e.globe.endFrame(t),e.globe.tilesLoaded||(e._renderRequested=!0)),n.endFrame()}function tS(e,t){try{t(e)}catch(n){if(e._renderError.raiseEvent(e,n),e.rethrowRenderErrors)throw n}}function Ogt(e){return e._picking.updateMostDetailedRayPicks(e)}mi.prototype.render=function(e){this._preUpdate.raiseEvent(this,e);let t=this._frameState;t.newFrame=!1,l(e)||(e=te.now());let n=this._view.checkForCameraUpdates(this);n&&(this._globeHeightDirty=!0);let i=!this.requestRenderMode||this._renderRequested||n||this._logDepthBufferDirty||this._hdrDirty||this.mode===oe.MORPHING;if(!i&&l(this.maximumRenderTimeChange)&&l(this._lastRenderTime)){let o=Math.abs(te.secondsDifference(this._lastRenderTime,e));i=i||o>this.maximumRenderTimeChange}if(i){this._lastRenderTime=te.clone(e,this._lastRenderTime),this._renderRequested=!1,this._logDepthBufferDirty=!1,this._hdrDirty=!1;let o=W.incrementWrap(t.frameNumber,15e6,1);uTe(this,o,e),t.newFrame=!0}tS(this,Ugt),this.primitives.show&&(tS(this,Ogt),tS(this,Hgt),tS(this,zgt),i||tS(this,Kgt)),this._postUpdate.raiseEvent(this,e),i&&(this._preRender.raiseEvent(this,e),t.creditDisplay.beginFrame(),tS(this,Ygt)),kgt(this,i),tS(this,Dgt),Agt(this),i&&(this._postRender.raiseEvent(this,e),t.creditDisplay.endFrame())};mi.prototype.forceRender=function(e){this._renderRequested=!0,this.render(e)};mi.prototype.requestRender=function(){this._renderRequested=!0};mi.prototype.clampLineWidth=function(e){return Math.max(Mt.minimumAliasedLineWidth,Math.min(e,Mt.maximumAliasedLineWidth))};mi.prototype.pick=function(e,t,n){return this._picking.pick(this,e,t,n)};mi.prototype.pickVoxel=function(e,t,n){let i=this.pick(e,t,n);if(!l(i))return;let o=i.primitive;if(!(o instanceof Iy))return;let r=this._picking.pickVoxelCoordinate(this,e,t,n),s=255*r[0]+r[1],a=o._traversal.findKeyframeNode(s);if(!l(a))return;let c=255*r[2]+r[3];return f9.fromKeyframeNode(o,s,c,a)};mi.prototype.pickPositionWorldCoordinates=function(e,t){return this._picking.pickPositionWorldCoordinates(this,e,t)};mi.prototype.pickPosition=function(e,t){return this._picking.pickPosition(this,e,t)};mi.prototype.drillPick=function(e,t,n,i){return this._picking.drillPick(this,e,t,n,i)};function Hgt(e){let t=e._frameState;B8.camera=t.camera,B8.cullingVolume=t.cullingVolume,e.primitives.updateForPass(t,B8)}function zgt(e){let t=e._frameState;if(!t.camera.canPreloadFlight())return;Y8.camera=e.preloadFlightCamera,Y8.cullingVolume=e.preloadFlightCullingVolume,e.primitives.updateForPass(t,Y8)}function Kgt(e){e.primitives.updateForPass(e._frameState,ugt)}mi.prototype.pickFromRay=function(e,t,n){return this._picking.pickFromRay(this,e,t,n)};mi.prototype.drillPickFromRay=function(e,t,n,i){return this._picking.drillPickFromRay(this,e,t,n,i)};mi.prototype.pickFromRayMostDetailed=function(e,t,n){return this._picking.pickFromRayMostDetailed(this,e,t,n)};mi.prototype.drillPickFromRayMostDetailed=function(e,t,n,i){return this._picking.drillPickFromRayMostDetailed(this,e,t,n,i)};mi.prototype.sampleHeight=function(e,t,n){return this._picking.sampleHeight(this,e,t,n)};mi.prototype.clampToHeight=function(e,t,n,i){return this._picking.clampToHeight(this,e,t,n,i)};mi.prototype.sampleHeightMostDetailed=function(e,t,n){return this._picking.sampleHeightMostDetailed(this,e,t,n)};mi.prototype.clampToHeightMostDetailed=function(e,t,n){return this._picking.clampToHeightMostDetailed(this,e,t,n)};mi.prototype.cartesianToCanvasCoordinates=function(e,t){return ki.wgs84ToWindowCoordinates(this,e,t)};mi.prototype.completeMorph=function(){this._transitioner.completeMorph()};mi.prototype.morphTo2D=function(e){let t,n=this.globe;l(n)?t=n.ellipsoid:t=this.mapProjection.ellipsoid,e=y(e,2),this._transitioner.morphTo2D(e,t)};mi.prototype.morphToColumbusView=function(e){let t,n=this.globe;l(n)?t=n.ellipsoid:t=this.mapProjection.ellipsoid,e=y(e,2),this._transitioner.morphToColumbusView(e,t)};mi.prototype.morphTo3D=function(e){let t,n=this.globe;l(n)?t=n.ellipsoid:t=this.mapProjection.ellipsoid,e=y(e,2),this._transitioner.morphTo3D(e,t)};function Jgt(e,t){if(e._removeTerrainProviderReadyListener=e._removeTerrainProviderReadyListener&&e._removeTerrainProviderReadyListener(),t.ready){l(e.globe)&&(e.globe.terrainProvider=t.provider);return}e.globe.terrainProvider=void 0,e._removeTerrainProviderReadyListener=t.readyEvent.addEventListener(n=>{l(e)&&l(e.globe)&&(e.globe.terrainProvider=n),e._removeTerrainProviderReadyListener()})}mi.prototype.setTerrain=function(e){return Jgt(this,e),e};mi.prototype.isDestroyed=function(){return!1};mi.prototype.destroy=function(){this._tweens.removeAll(),this._computeEngine=this._computeEngine&&this._computeEngine.destroy(),this._screenSpaceCameraController=this._screenSpaceCameraController&&this._screenSpaceCameraController.destroy(),this._deviceOrientationCameraController=this._deviceOrientationCameraController&&!this._deviceOrientationCameraController.isDestroyed()&&this._deviceOrientationCameraController.destroy(),this._primitives=this._primitives&&this._primitives.destroy(),this._groundPrimitives=this._groundPrimitives&&this._groundPrimitives.destroy(),this._globe=this._globe&&this._globe.destroy(),this._removeTerrainProviderReadyListener=this._removeTerrainProviderReadyListener&&this._removeTerrainProviderReadyListener(),this.skyBox=this.skyBox&&this.skyBox.destroy(),this.skyAtmosphere=this.skyAtmosphere&&this.skyAtmosphere.destroy(),this._debugSphere=this._debugSphere&&this._debugSphere.destroy(),this.sun=this.sun&&this.sun.destroy(),this._sunPostProcess=this._sunPostProcess&&this._sunPostProcess.destroy(),this._depthPlane=this._depthPlane&&this._depthPlane.destroy(),this._transitioner=this._transitioner&&this._transitioner.destroy(),this._debugFrustumPlanes=this._debugFrustumPlanes&&this._debugFrustumPlanes.destroy(),this._brdfLutGenerator=this._brdfLutGenerator&&this._brdfLutGenerator.destroy(),this._picking=this._picking&&this._picking.destroy(),this._defaultView=this._defaultView&&this._defaultView.destroy(),this._view=void 0,this._removeCreditContainer&&this._canvas.parentNode.removeChild(this._creditContainer),this.postProcessStages=this.postProcessStages&&this.postProcessStages.destroy(),this._context=this._context&&this._context.destroy(),this._frameState.creditDisplay=this._frameState.creditDisplay&&this._frameState.creditDisplay.destroy(),l(this._performanceDisplay)&&(this._performanceDisplay=this._performanceDisplay&&this._performanceDisplay.destroy(),this._performanceContainer.parentNode.removeChild(this._performanceContainer)),this._removeRequestListenerCallback(),this._removeTaskProcessorListenerCallback();for(let e=0;e<this._removeGlobeCallbacks.length;++e)this._removeGlobeCallbacks[e]();return this._removeGlobeCallbacks.length=0,l(this._removeUpdateHeightCallback)&&(this._removeUpdateHeightCallback(),this._removeUpdateHeightCallback=void 0),me(this)};var A9=mi;var XHi=T(S(),1);function dL(e){e=y(e,ie.WGS84),this.show=!0,this.perFragmentAtmosphere=!1,this._ellipsoid=e;let t=1.025,n=h.multiplyByScalar(e.radii,t,new h);this._scaleMatrix=M.fromScale(n),this._modelMatrix=new M,this._command=new et({owner:this,modelMatrix:this._modelMatrix}),this._spSkyFromSpace=void 0,this._spSkyFromAtmosphere=void 0,this._flags=void 0,this.atmosphereLightIntensity=50,this.atmosphereRayleighCoefficient=new h(55e-7,13e-6,284e-7),this.atmosphereMieCoefficient=new h(21e-6,21e-6,21e-6),this.atmosphereRayleighScaleHeight=1e4,this.atmosphereMieScaleHeight=3200,this.atmosphereMieAnisotropy=.9,this.hueShift=0,this.saturationShift=0,this.brightnessShift=0,this._hueSaturationBrightness=new h;let i=new h;i.x=e.maximumRadius*t,i.y=e.maximumRadius,i.z=0,this._radiiAndDynamicAtmosphereColor=i;let o=this;this._command.uniformMap={u_radiiAndDynamicAtmosphereColor:function(){return o._radiiAndDynamicAtmosphereColor},u_hsbShift:function(){return o._hueSaturationBrightness.x=o.hueShift,o._hueSaturationBrightness.y=o.saturationShift,o._hueSaturationBrightness.z=o.brightnessShift,o._hueSaturationBrightness},u_atmosphereLightIntensity:function(){return o.atmosphereLightIntensity},u_atmosphereRayleighCoefficient:function(){return o.atmosphereRayleighCoefficient},u_atmosphereMieCoefficient:function(){return o.atmosphereMieCoefficient},u_atmosphereRayleighScaleHeight:function(){return o.atmosphereRayleighScaleHeight},u_atmosphereMieScaleHeight:function(){return o.atmosphereMieScaleHeight},u_atmosphereMieAnisotropy:function(){return o.atmosphereMieAnisotropy}}}Object.defineProperties(dL.prototype,{ellipsoid:{get:function(){return this._ellipsoid}}});dL.prototype.setDynamicLighting=function(e){this._radiiAndDynamicAtmosphereColor.z=e};var J8=new M;dL.prototype.update=function(e,t){if(!this.show)return;let n=e.mode;if(n!==oe.SCENE3D&&n!==oe.MORPHING||!e.passes.render)return;let i=M.fromRotationTranslation(e.context.uniformState.inverseViewRotation,h.ZERO,J8),o=M.multiplyTransformation(i,Eo.Y_UP_TO_Z_UP,J8),r=M.multiply(this._scaleMatrix,o,J8);M.clone(r,this._modelMatrix);let s=e.context,a=Qgt(this),c=e.globeTranslucencyState.translucent,d=this.perFragmentAtmosphere||c||!l(t)||!t.show,u=this._command;if(!l(u.vertexArray)){let p=Xs.createGeometry(new Xs({radii:new h(1,1,1),slicePartitions:256,stackPartitions:256,vertexFormat:We.POSITION_ONLY}));u.vertexArray=ti.fromGeometry({context:s,geometry:p,attributeLocations:An.createAttributeLocations(p),bufferUsage:Ne.STATIC_DRAW}),u.renderState=De.fromCache({cull:{enabled:!0,face:bi.FRONT},blending:un.ALPHA_BLEND,depthMask:!1})}let m=a|d<<2|c<<3;if(m!==this._flags){this._flags=m;let p=[];a&&p.push("COLOR_CORRECT"),d&&p.push("PER_FRAGMENT_ATMOSPHERE"),c&&p.push("GLOBE_TRANSLUCENT");let g=new Ye({defines:p,sources:[z0,FV,Vw]}),f=new Ye({defines:p,sources:[z0,FV,Cw]});this._spSkyAtmosphere=$t.fromCache({context:s,vertexShaderSource:g,fragmentShaderSource:f}),u.shaderProgram=this._spSkyAtmosphere}return u};function Qgt(e){return!(W.equalsEpsilon(e.hueShift,0,W.EPSILON7)&&W.equalsEpsilon(e.saturationShift,0,W.EPSILON7)&&W.equalsEpsilon(e.brightnessShift,0,W.EPSILON7))}dL.prototype.isDestroyed=function(){return!1};dL.prototype.destroy=function(){let e=this._command;return e.vertexArray=e.vertexArray&&e.vertexArray.destroy(),this._spSkyAtmosphere=this._spSkyAtmosphere&&this._spSkyAtmosphere.destroy(),me(this)};var M9=dL;var qHi=T(S(),1);function R3(e){this.sources=e.sources,this._sources=void 0,this.show=y(e.show,!0),this._command=new et({modelMatrix:M.clone(M.IDENTITY),owner:this}),this._cubeMap=void 0,this._attributeLocations=void 0,this._useHdr=void 0}R3.prototype.update=function(e,t){let n=this;if(!this.show||e.mode!==oe.SCENE3D&&e.mode!==oe.MORPHING||!e.passes.render)return;let i=e.context;if(this._sources!==this.sources){this._sources=this.sources;let r=this.sources;typeof r.positiveX=="string"?cw(i,this._sources).then(function(s){n._cubeMap=n._cubeMap&&n._cubeMap.destroy(),n._cubeMap=s}):(this._cubeMap=this._cubeMap&&this._cubeMap.destroy(),this._cubeMap=new sc({context:i,source:r}))}let o=this._command;if(!l(o.vertexArray)){o.uniformMap={u_cubeMap:function(){return n._cubeMap}};let r=yl.createGeometry(yl.fromDimensions({dimensions:new h(2,2,2),vertexFormat:We.POSITION_ONLY})),s=this._attributeLocations=An.createAttributeLocations(r);o.vertexArray=ti.fromGeometry({context:i,geometry:r,attributeLocations:s,bufferUsage:Ne.STATIC_DRAW}),o.renderState=De.fromCache({blending:un.ALPHA_BLEND})}if(!l(o.shaderProgram)||this._useHdr!==t){let r=new Ye({defines:[t?"HDR":""],sources:[Lw]});o.shaderProgram=$t.fromCache({context:i,vertexShaderSource:Rw,fragmentShaderSource:r,attributeLocations:this._attributeLocations}),this._useHdr=t}if(l(this._cubeMap))return o};R3.prototype.isDestroyed=function(){return!1};R3.prototype.destroy=function(){let e=this._command;return e.vertexArray=e.vertexArray&&e.vertexArray.destroy(),e.shaderProgram=e.shaderProgram&&e.shaderProgram.destroy(),this._cubeMap=this._cubeMap&&this._cubeMap.destroy(),me(this)};var N9=R3;var Zzi=T(S(),1);function U9(){this.show=!0,this._drawCommand=new et({primitiveType:Fe.TRIANGLES,boundingVolume:new le,owner:this}),this._commands={drawCommand:this._drawCommand,computeCommand:void 0},this._boundingVolume=new le,this._boundingVolume2D=new le,this._texture=void 0,this._drawingBufferWidth=void 0,this._drawingBufferHeight=void 0,this._radiusTS=void 0,this._size=void 0,this.glowFactor=1,this._glowFactorDirty=!1,this._useHdr=void 0;let e=this;this._uniformMap={u_texture:function(){return e._texture},u_size:function(){return e._size}}}Object.defineProperties(U9.prototype,{glowFactor:{get:function(){return this._glowFactor},set:function(e){e=Math.max(e,0),this._glowFactor=e,this._glowFactorDirty=!0}}});var jgt=new D,qgt=new D,$gt=new se,k9=new se;U9.prototype.update=function(e,t,n){if(!this.show)return;let i=e.mode;if(i===oe.SCENE2D||i===oe.MORPHING||!e.passes.render)return;let o=e.context,r=t.viewport.width,s=t.viewport.height;if(!l(this._texture)||r!==this._drawingBufferWidth||s!==this._drawingBufferHeight||this._glowFactorDirty||n!==this._useHdr){this._texture=this._texture&&this._texture.destroy(),this._drawingBufferWidth=r,this._drawingBufferHeight=s,this._glowFactorDirty=!1,this._useHdr=n;let Z=Math.max(r,s);Z=Math.pow(2,Math.ceil(Math.log(Z)/Math.log(2))-2),Z=Math.max(1,Z);let G=n?o.halfFloatingPointTexture?ze.HALF_FLOAT:ze.FLOAT:ze.UNSIGNED_BYTE;this._texture=new Et({context:o,width:Z,height:Z,pixelFormat:at.RGBA,pixelDatatype:G}),this._glowLengthTS=this._glowFactor*5,this._radiusTS=1/(1+2*this._glowLengthTS)*.5;let X=this,v={u_radiusTS:function(){return X._radiusTS}};this._commands.computeCommand=new Xl({fragmentShaderSource:Gw,outputTexture:this._texture,uniformMap:v,persists:!1,owner:this,postExecute:function(){X._commands.computeCommand=void 0}})}let a=this._drawCommand;if(!l(a.vertexArray)){let Z={direction:0},G=new Uint8Array(4*2);G[0]=0,G[1]=0,G[2]=255,G[3]=0,G[4]=255,G[5]=255,G[6]=0,G[7]=255;let X=ft.createVertexBuffer({context:o,typedArray:G,usage:Ne.STATIC_DRAW}),v=[{index:Z.direction,vertexBuffer:X,componentsPerAttribute:2,normalize:!0,componentDatatype:Q.UNSIGNED_BYTE}],P=ft.createIndexBuffer({context:o,typedArray:new Uint16Array([0,1,2,0,2,3]),usage:Ne.STATIC_DRAW,indexDatatype:Me.UNSIGNED_SHORT});a.vertexArray=new ti({context:o,attributes:v,indexBuffer:P}),a.shaderProgram=$t.fromCache({context:o,vertexShaderSource:Ew,fragmentShaderSource:Zw,attributeLocations:Z}),a.renderState=De.fromCache({blending:un.ALPHA_BLEND}),a.uniformMap=this._uniformMap}let c=o.uniformState.sunPositionWC,d=o.uniformState.sunPositionColumbusView,u=this._boundingVolume,m=this._boundingVolume2D;h.clone(c,u.center),m.center.x=d.z,m.center.y=d.x,m.center.z=d.y,u.radius=W.SOLAR_RADIUS+W.SOLAR_RADIUS*this._glowLengthTS,m.radius=u.radius,i===oe.SCENE3D?le.clone(u,a.boundingVolume):i===oe.COLUMBUS_VIEW&&le.clone(m,a.boundingVolume);let p=ki.computeActualWgs84Position(e,c,k9),g=h.magnitude(h.subtract(p,e.camera.position,k9)),f=o.uniformState.projection,x=$gt;x.x=0,x.y=0,x.z=-g,x.w=1;let _=M.multiplyByVector(f,x,k9),C=ki.clipToGLWindowCoordinates(t.viewport,_,jgt);x.x=W.SOLAR_RADIUS;let V=M.multiplyByVector(f,x,k9),L=ki.clipToGLWindowCoordinates(t.viewport,V,qgt);return this._size=D.magnitude(D.subtract(L,C,k9)),this._size=2*this._size*(1+2*this._glowLengthTS),this._size=Math.ceil(this._size),this._commands};U9.prototype.isDestroyed=function(){return!1};U9.prototype.destroy=function(){let e=this._drawCommand;return e.vertexArray=e.vertexArray&&e.vertexArray.destroy(),e.shaderProgram=e.shaderProgram&&e.shaderProgram.destroy(),this._texture=this._texture&&this._texture.destroy(),me(this)};var D9=U9;function uL(e){return tn(`Assets/Textures/SkyBox/tycho2t3_80_${e}.jpg`)}function eyt(e){e._renderLoopRunning=!0;let t=0;function n(i){if(!e.isDestroyed())if(e._useDefaultRenderLoop)try{let o=e._targetFrameRate;if(!l(o))e.resize(),e.render(),requestAnimationFrame(n);else{let r=1e3/o,s=i-t;s>r&&(e.resize(),e.render(),t=i-s%r),requestAnimationFrame(n)}}catch(o){e._useDefaultRenderLoop=!1,e._renderLoopRunning=!1,e._showRenderLoopErrors&&e.showErrorPanel("An error occurred while rendering. Rendering has stopped.",void 0,o)}else e._renderLoopRunning=!1}requestAnimationFrame(n)}function bTe(e){let t=e._useBrowserRecommendedResolution?1:window.devicePixelRatio;return t*=e._resolutionScale,l(e._scene)&&(e._scene.pixelRatio=t),t}function gTe(e){let t=e._canvas,n=t.clientWidth,i=t.clientHeight,o=bTe(e);e._canvasClientWidth=n,e._canvasClientHeight=i,n*=o,i*=o,t.width=n,t.height=i,e._canRender=n!==0&&i!==0,e._lastDevicePixelRatio=window.devicePixelRatio}function yTe(e){let t=e._canvas,n=t.width,i=t.height;if(n!==0&&i!==0){let o=e._scene.camera.frustum;l(o.aspectRatio)?o.aspectRatio=n/i:(o.top=o.right*(i/n),o.bottom=-o.top)}}function nS(e,t){e=In(e),t=y(t,y.EMPTY_OBJECT);let n=document.createElement("div");n.className="cesium-widget",e.appendChild(n);let i=document.createElement("canvas"),o=Yt.supportsImageRenderingPixelated();this._supportsImageRenderingPixelated=o,o&&(i.style.imageRendering=Yt.imageRenderingValue()),i.oncontextmenu=function(){return!1},i.onselectstart=function(){return!1};function r(){i!==i.ownerDocument.activeElement&&i.ownerDocument.activeElement.blur()}y(t.blurActiveElementOnCanvasFocus,!0)&&(i.addEventListener("mousedown",r),i.addEventListener("pointerdown",r)),n.appendChild(i);let a=document.createElement("div");a.className="cesium-widget-credits";let c=l(t.creditContainer)?In(t.creditContainer):n;c.appendChild(a);let d=l(t.creditViewport)?In(t.creditViewport):n,u=y(t.showRenderLoopErrors,!0),m=y(t.useBrowserRecommendedResolution,!0);this._element=n,this._container=e,this._canvas=i,this._canvasClientWidth=0,this._canvasClientHeight=0,this._lastDevicePixelRatio=0,this._creditViewport=d,this._creditContainer=c,this._innerCreditContainer=a,this._canRender=!1,this._renderLoopRunning=!1,this._showRenderLoopErrors=u,this._resolutionScale=1,this._useBrowserRecommendedResolution=m,this._forceResize=!1,this._clock=l(t.clock)?t.clock:new Sm,gTe(this);try{let p=new A9({canvas:i,contextOptions:t.contextOptions,creditContainer:a,creditViewport:d,mapProjection:t.mapProjection,orderIndependentTranslucency:t.orderIndependentTranslucency,scene3DOnly:y(t.scene3DOnly,!1),shadows:t.shadows,mapMode2D:t.mapMode2D,requestRenderMode:t.requestRenderMode,maximumRenderTimeChange:t.maximumRenderTimeChange,depthPlaneEllipsoidOffset:t.depthPlaneEllipsoidOffset,msaaSamples:t.msaaSamples});this._scene=p,p.camera.constrainedAxis=h.UNIT_Z,bTe(this),yTe(this);let g=y(p.mapProjection.ellipsoid,ie.WGS84),f=t.globe;l(f)||(f=new tF(g)),f!==!1&&(p.globe=f,p.globe.shadows=y(t.terrainShadows,_n.RECEIVE_ONLY));let x=t.skyBox;l(x)||(x=new N9({sources:{positiveX:uL("px"),negativeX:uL("mx"),positiveY:uL("py"),negativeY:uL("my"),positiveZ:uL("pz"),negativeZ:uL("mz")}})),x!==!1&&(p.skyBox=x,p.sun=new D9,p.moon=new oF);let _=t.skyAtmosphere;l(_)||(_=new M9(g),_.show=t.globe!==!1&&f.show),_!==!1&&(p.skyAtmosphere=_);let C=t.baseLayer;t.globe!==!1&&C!==!1&&(l(C)||(C=ma.fromWorldImagery()),p.imageryLayers.add(C)),l(t.terrainProvider)&&t.globe!==!1&&(p.terrainProvider=t.terrainProvider),l(t.terrain)&&t.globe!==!1&&p.setTerrain(t.terrain),this._screenSpaceEventHandler=new fd(i),l(t.sceneMode)&&(t.sceneMode===oe.SCENE2D&&this._scene.morphTo2D(0),t.sceneMode===oe.COLUMBUS_VIEW&&this._scene.morphToColumbusView(0)),this._useDefaultRenderLoop=void 0,this.useDefaultRenderLoop=y(t.useDefaultRenderLoop,!0),this._targetFrameRate=void 0,this.targetFrameRate=t.targetFrameRate;let V=this;this._onRenderError=function(L,Z){V._useDefaultRenderLoop=!1,V._renderLoopRunning=!1,V._showRenderLoopErrors&&V.showErrorPanel("An error occurred while rendering. Rendering has stopped.",void 0,Z)},p.renderError.addEventListener(this._onRenderError)}catch(p){throw u&&this.showErrorPanel("Error constructing CesiumWidget.",'Visit <a href="http://get.webgl.org">http://get.webgl.org</a> to verify that your web browser and hardware support WebGL. Consider trying a different web browser or updating your video drivers. Detailed error information is below:',p),p}}Object.defineProperties(nS.prototype,{container:{get:function(){return this._container}},canvas:{get:function(){return this._canvas}},creditContainer:{get:function(){return this._creditContainer}},creditViewport:{get:function(){return this._creditViewport}},scene:{get:function(){return this._scene}},imageryLayers:{get:function(){return this._scene.imageryLayers}},terrainProvider:{get:function(){return this._scene.terrainProvider},set:function(e){this._scene.terrainProvider=e}},creditDisplay:{get:function(){return this._scene.frameState.creditDisplay}},camera:{get:function(){return this._scene.camera}},clock:{get:function(){return this._clock}},screenSpaceEventHandler:{get:function(){return this._screenSpaceEventHandler}},targetFrameRate:{get:function(){return this._targetFrameRate},set:function(e){this._targetFrameRate=e}},useDefaultRenderLoop:{get:function(){return this._useDefaultRenderLoop},set:function(e){this._useDefaultRenderLoop!==e&&(this._useDefaultRenderLoop=e,e&&!this._renderLoopRunning&&eyt(this))}},resolutionScale:{get:function(){return this._resolutionScale},set:function(e){this._resolutionScale!==e&&(this._resolutionScale=e,this._forceResize=!0)}},useBrowserRecommendedResolution:{get:function(){return this._useBrowserRecommendedResolution},set:function(e){this._useBrowserRecommendedResolution!==e&&(this._useBrowserRecommendedResolution=e,this._forceResize=!0)}}});nS.prototype.showErrorPanel=function(e,t,n){let i=this._element,o=document.createElement("div");o.className="cesium-widget-errorPanel";let r=document.createElement("div");r.className="cesium-widget-errorPanel-content",o.appendChild(r);let s=document.createElement("div");s.className="cesium-widget-errorPanel-header",s.appendChild(document.createTextNode(e)),r.appendChild(s);let a=document.createElement("div");a.className="cesium-widget-errorPanel-scroll",r.appendChild(a);function c(){a.style.maxHeight=`${Math.max(Math.round(i.clientHeight*.9-100),30)}px`}c(),l(window.addEventListener)&&window.addEventListener("resize",c,!1);let d=l(t),u=l(n);if(d||u){let g=document.createElement("div");if(g.className="cesium-widget-errorPanel-message",a.appendChild(g),u){let f=Oh(n);d||(typeof n=="string"&&(n=new Error(n)),t=Oh({name:n.name,message:n.message}),f=n.stack),typeof console<"u"&&console.error(`${e} ${t} ${f}`);let x=document.createElement("div");x.className="cesium-widget-errorPanel-message-details collapsed";let _=document.createElement("span");_.className="cesium-widget-errorPanel-more-details",_.appendChild(document.createTextNode("See more...")),x.appendChild(_),x.onclick=function(C){x.removeChild(_),x.appendChild(document.createTextNode(f)),x.className="cesium-widget-errorPanel-message-details",r.className="cesium-widget-errorPanel-content expanded",x.onclick=void 0},a.appendChild(x)}g.innerHTML=`<p>${t}</p>`}let m=document.createElement("div");m.className="cesium-widget-errorPanel-buttonPanel",r.appendChild(m);let p=document.createElement("button");p.setAttribute("type","button"),p.className="cesium-button",p.appendChild(document.createTextNode("OK")),p.onclick=function(){l(c)&&l(window.removeEventListener)&&window.removeEventListener("resize",c,!1),i.removeChild(o)},m.appendChild(p),i.appendChild(o)};nS.prototype.isDestroyed=function(){return!1};nS.prototype.destroy=function(){l(this._scene)&&(this._scene.renderError.removeEventListener(this._onRenderError),this._scene=this._scene.destroy()),this._container.removeChild(this._element),this._creditContainer.removeChild(this._innerCreditContainer),me(this)};nS.prototype.resize=function(){let e=this._canvas;!this._forceResize&&this._canvasClientWidth===e.clientWidth&&this._canvasClientHeight===e.clientHeight&&this._lastDevicePixelRatio===window.devicePixelRatio||(this._forceResize=!1,gTe(this),yTe(this),this._scene.requestRender())};nS.prototype.render=function(){if(this._canRender){this._scene.initializeFrame();let e=this._clock.tick();this._scene.render(e)}else this._clock.tick()};var B9=nS;var eKi=T(S(),1);var tyt=new h(1,1,1);function Q8(e){e=y(e,tyt),this._dimensions=h.clone(e)}Object.defineProperties(Q8.prototype,{dimensions:{get:function(){return this._dimensions},set:function(e){h.clone(e,this._dimensions)}}});var nyt=new h;Q8.prototype.emit=function(e){let t=this._dimensions,n=h.multiplyByScalar(t,.5,nyt),i=W.randomBetween(-n.x,n.x),o=W.randomBetween(-n.y,n.y),r=W.randomBetween(-n.z,n.z);e.position=h.fromElements(i,o,r,e.position),e.velocity=h.normalize(e.position,e.velocity)};var j8=Q8;var iKi=T(S(),1);function $f(){this.featurePropertiesDirty=!1}Object.defineProperties($f.prototype,{featuresLength:{get:function(){fe.throwInstantiationError()}},pointsLength:{get:function(){fe.throwInstantiationError()}},trianglesLength:{get:function(){fe.throwInstantiationError()}},geometryByteLength:{get:function(){fe.throwInstantiationError()}},texturesByteLength:{get:function(){fe.throwInstantiationError()}},batchTableByteLength:{get:function(){fe.throwInstantiationError()}},innerContents:{get:function(){fe.throwInstantiationError()}},ready:{get:function(){fe.throwInstantiationError()}},tileset:{get:function(){fe.throwInstantiationError()}},tile:{get:function(){fe.throwInstantiationError()}},url:{get:function(){fe.throwInstantiationError()}},batchTable:{get:function(){fe.throwInstantiationError()}},metadata:{get:function(){fe.throwInstantiationError()},set:function(e){fe.throwInstantiationError()}},group:{get:function(){fe.throwInstantiationError()},set:function(e){fe.throwInstantiationError()}}});$f.prototype.hasProperty=function(e,t){fe.throwInstantiationError()};$f.prototype.getFeature=function(e){fe.throwInstantiationError()};$f.prototype.applyDebugSettings=function(e,t){fe.throwInstantiationError()};$f.prototype.applyStyle=function(e){fe.throwInstantiationError()};$f.prototype.update=function(e,t){fe.throwInstantiationError()};$f.prototype.pick=function(e,t,n){fe.throwInstantiationError()};$f.prototype.isDestroyed=function(){fe.throwInstantiationError()};$f.prototype.destroy=function(){fe.throwInstantiationError()};var q8=$f;var bKi=T(S(),1);var cKi=T(S(),1);function mL(e,t){this._conditionsExpression=Oe(e,!0),this._conditions=e.conditions,this._runtimeConditions=void 0,oyt(this,t)}Object.defineProperties(mL.prototype,{conditionsExpression:{get:function(){return this._conditionsExpression}}});function iyt(e,t){this.condition=e,this.expression=t}function oyt(e,t){let n=[],i=e._conditions;if(!l(i))return;let o=i.length;for(let r=0;r<o;++r){let s=i[r],a=String(s[0]),c=String(s[1]);n.push(new iyt(new Ru(a,t),new Ru(c,t)))}e._runtimeConditions=n}mL.prototype.evaluate=function(e,t){let n=this._runtimeConditions;if(!l(n))return;let i=n.length;for(let o=0;o<i;++o){let r=n[o];if(r.condition.evaluate(e))return r.expression.evaluate(e,t)}};mL.prototype.evaluateColor=function(e,t){let n=this._runtimeConditions;if(!l(n))return;let i=n.length;for(let o=0;o<i;++o){let r=n[o];if(r.condition.evaluate(e))return r.expression.evaluateColor(e,t)}};mL.prototype.getShaderFunction=function(e,t,n,i){let o=this._runtimeConditions;if(!l(o)||o.length===0)return;let r="",s=o.length;for(let a=0;a<s;++a){let c=o[a],d=c.condition.getShaderExpression(t,n),u=c.expression.getShaderExpression(t,n);r+=` ${a===0?"if":"else if"} (${d}) { return ${u}; } `}return r=`${i} ${e} { ${r} return ${i}(1.0); } `,r};mL.prototype.getVariables=function(){let e=[],t=this._runtimeConditions;if(!l(t)||t.length===0)return e;let n=t.length;for(let i=0;i<n;++i){let o=t[i];e.push.apply(e,o.condition.getVariables()),e.push.apply(e,o.expression.getVariables())}return e=e.filter(function(i,o,r){return r.indexOf(i)===o}),e};var Y9=mL;function Py(e){this._style={},this._ready=!1,this._show=void 0,this._color=void 0,this._pointSize=void 0,this._pointOutlineColor=void 0,this._pointOutlineWidth=void 0,this._labelColor=void 0,this._labelOutlineColor=void 0,this._labelOutlineWidth=void 0,this._font=void 0,this._labelStyle=void 0,this._labelText=void 0,this._backgroundColor=void 0,this._backgroundPadding=void 0,this._backgroundEnabled=void 0,this._scaleByDistance=void 0,this._translucencyByDistance=void 0,this._distanceDisplayCondition=void 0,this._heightOffset=void 0,this._anchorLineEnabled=void 0,this._anchorLineColor=void 0,this._image=void 0,this._disableDepthTestDistance=void 0,this._horizontalOrigin=void 0,this._verticalOrigin=void 0,this._labelHorizontalOrigin=void 0,this._labelVerticalOrigin=void 0,this._meta=void 0,this._colorShaderFunction=void 0,this._showShaderFunction=void 0,this._pointSizeShaderFunction=void 0,this._colorShaderFunctionReady=!1,this._showShaderFunctionReady=!1,this._pointSizeShaderFunctionReady=!1,this._colorShaderTranslucent=!1,ryt(this,e)}function ryt(e,t){t=y(Oe(t,!0),e._style),e._style=t,e.show=t.show,e.color=t.color,e.pointSize=t.pointSize,e.pointOutlineColor=t.pointOutlineColor,e.pointOutlineWidth=t.pointOutlineWidth,e.labelColor=t.labelColor,e.labelOutlineColor=t.labelOutlineColor,e.labelOutlineWidth=t.labelOutlineWidth,e.labelStyle=t.labelStyle,e.font=t.font,e.labelText=t.labelText,e.backgroundColor=t.backgroundColor,e.backgroundPadding=t.backgroundPadding,e.backgroundEnabled=t.backgroundEnabled,e.scaleByDistance=t.scaleByDistance,e.translucencyByDistance=t.translucencyByDistance,e.distanceDisplayCondition=t.distanceDisplayCondition,e.heightOffset=t.heightOffset,e.anchorLineEnabled=t.anchorLineEnabled,e.anchorLineColor=t.anchorLineColor,e.image=t.image,e.disableDepthTestDistance=t.disableDepthTestDistance,e.horizontalOrigin=t.horizontalOrigin,e.verticalOrigin=t.verticalOrigin,e.labelHorizontalOrigin=t.labelHorizontalOrigin,e.labelVerticalOrigin=t.labelVerticalOrigin;let n={};if(l(t.meta)){let i=t.defines,o=y(t.meta,y.EMPTY_OBJECT);for(let r in o)o.hasOwnProperty(r)&&(n[r]=new Ru(o[r],i))}e._meta=n,e._ready=!0}function er(e,t){let n=y(e._style,y.EMPTY_OBJECT).defines;if(l(t)){if(typeof t=="boolean"||typeof t=="number")return new Ru(String(t));if(typeof t=="string")return new Ru(t,n);if(l(t.conditions))return new Y9(t,n)}else return;return t}function tr(e){if(l(e)){if(l(e.expression))return e.expression;if(l(e.conditionsExpression))return Oe(e.conditionsExpression,!0)}else return;return e}Object.defineProperties(Py.prototype,{style:{get:function(){return this._style}},show:{get:function(){return this._show},set:function(e){this._show=er(this,e),this._style.show=tr(this._show),this._showShaderFunctionReady=!1}},color:{get:function(){return this._color},set:function(e){this._color=er(this,e),this._style.color=tr(this._color),this._colorShaderFunctionReady=!1}},pointSize:{get:function(){return this._pointSize},set:function(e){this._pointSize=er(this,e),this._style.pointSize=tr(this._pointSize),this._pointSizeShaderFunctionReady=!1}},pointOutlineColor:{get:function(){return this._pointOutlineColor},set:function(e){this._pointOutlineColor=er(this,e),this._style.pointOutlineColor=tr(this._pointOutlineColor)}},pointOutlineWidth:{get:function(){return this._pointOutlineWidth},set:function(e){this._pointOutlineWidth=er(this,e),this._style.pointOutlineWidth=tr(this._pointOutlineWidth)}},labelColor:{get:function(){return this._labelColor},set:function(e){this._labelColor=er(this,e),this._style.labelColor=tr(this._labelColor)}},labelOutlineColor:{get:function(){return this._labelOutlineColor},set:function(e){this._labelOutlineColor=er(this,e),this._style.labelOutlineColor=tr(this._labelOutlineColor)}},labelOutlineWidth:{get:function(){return this._labelOutlineWidth},set:function(e){this._labelOutlineWidth=er(this,e),this._style.labelOutlineWidth=tr(this._labelOutlineWidth)}},font:{get:function(){return this._font},set:function(e){this._font=er(this,e),this._style.font=tr(this._font)}},labelStyle:{get:function(){return this._labelStyle},set:function(e){this._labelStyle=er(this,e),this._style.labelStyle=tr(this._labelStyle)}},labelText:{get:function(){return this._labelText},set:function(e){this._labelText=er(this,e),this._style.labelText=tr(this._labelText)}},backgroundColor:{get:function(){return this._backgroundColor},set:function(e){this._backgroundColor=er(this,e),this._style.backgroundColor=tr(this._backgroundColor)}},backgroundPadding:{get:function(){return this._backgroundPadding},set:function(e){this._backgroundPadding=er(this,e),this._style.backgroundPadding=tr(this._backgroundPadding)}},backgroundEnabled:{get:function(){return this._backgroundEnabled},set:function(e){this._backgroundEnabled=er(this,e),this._style.backgroundEnabled=tr(this._backgroundEnabled)}},scaleByDistance:{get:function(){return this._scaleByDistance},set:function(e){this._scaleByDistance=er(this,e),this._style.scaleByDistance=tr(this._scaleByDistance)}},translucencyByDistance:{get:function(){return this._translucencyByDistance},set:function(e){this._translucencyByDistance=er(this,e),this._style.translucencyByDistance=tr(this._translucencyByDistance)}},distanceDisplayCondition:{get:function(){return this._distanceDisplayCondition},set:function(e){this._distanceDisplayCondition=er(this,e),this._style.distanceDisplayCondition=tr(this._distanceDisplayCondition)}},heightOffset:{get:function(){return this._heightOffset},set:function(e){this._heightOffset=er(this,e),this._style.heightOffset=tr(this._heightOffset)}},anchorLineEnabled:{get:function(){return this._anchorLineEnabled},set:function(e){this._anchorLineEnabled=er(this,e),this._style.anchorLineEnabled=tr(this._anchorLineEnabled)}},anchorLineColor:{get:function(){return this._anchorLineColor},set:function(e){this._anchorLineColor=er(this,e),this._style.anchorLineColor=tr(this._anchorLineColor)}},image:{get:function(){return this._image},set:function(e){this._image=er(this,e),this._style.image=tr(this._image)}},disableDepthTestDistance:{get:function(){return this._disableDepthTestDistance},set:function(e){this._disableDepthTestDistance=er(this,e),this._style.disableDepthTestDistance=tr(this._disableDepthTestDistance)}},horizontalOrigin:{get:function(){return this._horizontalOrigin},set:function(e){this._horizontalOrigin=er(this,e),this._style.horizontalOrigin=tr(this._horizontalOrigin)}},verticalOrigin:{get:function(){return this._verticalOrigin},set:function(e){this._verticalOrigin=er(this,e),this._style.verticalOrigin=tr(this._verticalOrigin)}},labelHorizontalOrigin:{get:function(){return this._labelHorizontalOrigin},set:function(e){this._labelHorizontalOrigin=er(this,e),this._style.labelHorizontalOrigin=tr(this._labelHorizontalOrigin)}},labelVerticalOrigin:{get:function(){return this._labelVerticalOrigin},set:function(e){this._labelVerticalOrigin=er(this,e),this._style.labelVerticalOrigin=tr(this._labelVerticalOrigin)}},meta:{get:function(){return this._meta},set:function(e){this._meta=e}}});Py.fromUrl=function(e){return Ee.createIfNeeded(e).fetchJson(e).then(function(n){return new Py(n)})};Py.prototype.getColorShaderFunction=function(e,t,n){return this._colorShaderFunctionReady?(n.translucent=this._colorShaderTranslucent,this._colorShaderFunction):(this._colorShaderFunctionReady=!0,l(this.color)&&l(this.color.getShaderFunction)?this._colorShaderFunction=this.color.getShaderFunction(e,t,n,"vec4"):this._colorShaderFunction=void 0,this._colorShaderTranslucent=n.translucent,this._colorShaderFunction)};Py.prototype.getShowShaderFunction=function(e,t,n){return this._showShaderFunctionReady?this._showShaderFunction:(this._showShaderFunctionReady=!0,l(this.show)&&l(this.show.getShaderFunction)?this._showShaderFunction=this.show.getShaderFunction(e,t,n,"bool"):this._showShaderFunction=void 0,this._showShaderFunction)};Py.prototype.getPointSizeShaderFunction=function(e,t,n){return this._pointSizeShaderFunctionReady?this._pointSizeShaderFunction:(this._pointSizeShaderFunctionReady=!0,l(this.pointSize)&&l(this.pointSize.getShaderFunction)?this._pointSizeShaderFunction=this.pointSize.getShaderFunction(e,t,n,"float"):this._pointSizeShaderFunction=void 0,this._pointSizeShaderFunction)};Py.prototype.getVariables=function(){let e=[];return l(this.color)&&l(this.color.getVariables)&&e.push.apply(e,this.color.getVariables()),l(this.show)&&l(this.show.getVariables)&&e.push.apply(e,this.show.getVariables()),l(this.pointSize)&&l(this.pointSize.getVariables)&&e.push.apply(e,this.pointSize.getVariables()),e=e.filter(function(t,n,i){return i.indexOf(t)===n}),e};var iS=Py;var JKi=T(S(),1);var _Ki=T(S(),1);function O9(e){e=y(e,y.EMPTY_OBJECT),this._maximumSubtreeCount=y(e.maximumSubtreeCount,0),this._subtreeRequestCounter=0,this._queue=new Tx({comparator:O9.comparator})}O9.prototype.addSubtree=function(e){let t=new syt(e,this._subtreeRequestCounter);this._subtreeRequestCounter++,this._queue.insert(t);let n=e.implicitCoordinates;if(n.level>0){let i=n.getParentSubtreeCoordinates(),o=this.find(i)}if(this._maximumSubtreeCount>0)for(;this._queue.length>this._maximumSubtreeCount&&this._queue.getMinimum()!==t;)this._queue.removeMinimum()};O9.prototype.find=function(e){let t=this._queue,n=t.internalArray,i=t.length;for(let o=0;o<i;o++){let r=n[o],a=r.subtree.implicitCoordinates;if(e.isEqual(a))return r.subtree}};O9.comparator=function(e,t){let n=e.subtree.implicitCoordinates,i=t.subtree.implicitCoordinates;return n.isAncestor(i)?1:i.isAncestor(n)?-1:e.stamp-t.stamp};function syt(e,t){this.subtree=e,this.stamp=t}var H9=O9;var LKi=T(S(),1);function Z3(e){this._resource=e,this._metadataTable=void 0}Object.defineProperties(Z3.prototype,{metadataTable:{get:function(){return this._metadataTable}}});Z3.fromJson=async function(e,t,n,i){let o;l(t)?o={json:t,binary:void 0}:o=cyt(n);let r=await ayt(e,o.json,o.binary),s={},a=o.json.bufferViews.length;for(let m=0;m<a;++m){let p=o.json.bufferViews[m],g=p.byteOffset,f=g+p.byteLength,_=r[p.buffer].subarray(g,f);s[m]=_}let c=o.json.voxelTable,d=o.json.propertyTables[c],u=new Z3(e);return u._metadataTable=new Pl({count:d.count,properties:d.properties,class:i.classes[d.class],bufferViews:s}),u};function ayt(e,t,n){let i=t.buffers.length,o=new Array(i);for(let r=0;r<i;r++){let s=t.buffers[r];if(l(s.uri)){let c=e.getDerivedResource({url:s.uri});o[r]=c.fetchArrayBuffer().then(function(d){return new Uint8Array(d)})}else o[r]=Promise.resolve(n)}return Promise.all(o)}function cyt(e){let n=new DataView(e.buffer,e.byteOffset),i=8,o=n.getUint32(i,!0);i+=8;let r=n.getUint32(i,!0);i+=8;let s=Zo(e,i,o);i+=o;let a=e.subarray(i,i+r);return{json:s,binary:a}}var z9=Z3;function G3(e){e=y(e,y.EMPTY_OBJECT),this.shapeTransform=void 0,this.globalTransform=void 0,this.shape=void 0,this.minBounds=void 0,this.maxBounds=void 0,this.dimensions=void 0,this.paddingBefore=void 0,this.paddingAfter=void 0,this.names=void 0,this.types=void 0,this.componentTypes=void 0,this.minimumValues=void 0,this.maximumValues=void 0,this.maximumTileCount=void 0,this._implicitTileset=void 0,this._subtreeCache=new H9}G3.fromUrl=async function(e){let t=Ee.createIfNeeded(e),n=await t.fetchJson();dyt(n);let i=pyt(n,t);await i.load();let o=n.root,r=o.content.extensions["3DTILES_content_voxels"],s=r.class,a=ri(n,"3DTILES_metadata")?n.extensions["3DTILES_metadata"]:n,c=i.schema,d=new oT({metadataJson:a,schema:c}),u=new G3;byt(u,d,s);let m=new sT(t,o,c),{shape:p,minBounds:g,maxBounds:f,shapeTransform:x,globalTransform:_}=uyt(o);u.shape=p,u.minBounds=g,u.maxBounds=f,u.dimensions=h.unpack(r.dimensions),u.shapeTransform=x,u.globalTransform=_,u.maximumTileCount=lyt(d);let C,V;return l(r.padding)&&(C=h.unpack(r.padding.before),V=h.unpack(r.padding.after)),u.paddingBefore=C,u.paddingAfter=V,u._implicitTileset=m,Ni.unload(i),u};function lyt(e){if(l(e.tileset))return e.tileset.getPropertyBySemantic(P_.TILESET_TILE_COUNT)}function dyt(e){let t=e.root;if(!l(t.content))throw new ue("Root must have content");if(!ri(t.content,"3DTILES_content_voxels"))throw new ue("Root tile content must have 3DTILES_content_voxels extension");if(!ri(t,"3DTILES_implicit_tiling")&&!l(t.implicitTiling))throw new ue("Root tile must have implicit tiling");if(!l(e.schema)&&!l(e.schemaUri)&&!ri(e,"3DTILES_metadata"))throw new ue("Tileset must have a metadata schema")}function uyt(e){let t=e.boundingVolume,n;if(l(e.transform)?n=M.unpack(e.transform):n=M.clone(M.IDENTITY),l(t.box))return hyt(t.box,n);if(l(t.region))return myt(t.region);if(ri(t,"3DTILES_bounding_volume_cylinder"))return fyt(t.extensions["3DTILES_bounding_volume_cylinder"].cylinder,n);throw new ue("Only box, region and 3DTILES_bounding_volume_cylinder are supported in Cesium3DTilesVoxelProvider")}function myt(e){let t=e[0],n=e[1],i=e[2],o=e[3],r=e[4],s=e[5],a=M.fromScale(ie.WGS84.radii),c=new h(t,n,r),d=new h(i,o,s);return{shape:Xi.ELLIPSOID,minBounds:c,maxBounds:d,shapeTransform:a,globalTransform:M.clone(M.IDENTITY)}}function hyt(e,t){let n=Gn.unpack(e),i=M.fromRotationTranslation(n.halfAxes,n.center);return{shape:Xi.BOX,minBounds:h.clone(Qf.DefaultMinBounds),maxBounds:h.clone(Qf.DefaultMaxBounds),shapeTransform:i,globalTransform:t}}function fyt(e,t){let n=Gn.unpack(e),i=M.fromRotationTranslation(n.halfAxes,n.center);return{shape:Xi.CYLINDER,minBounds:h.clone(jf.DefaultMinBounds),maxBounds:h.clone(jf.DefaultMaxBounds),shapeTransform:i,globalTransform:t}}function pyt(e,t){let{schemaUri:n,schema:i}=e;return l(n)?Ni.getSchemaLoader({resource:t.getDerivedResource({url:n})}):Ni.getSchemaLoader({schema:i})}function byt(e,t,n){let{schema:i,statistics:o}=t,r=o?.classes[n],s=i.classes[n].properties,a=Object.entries(s).map(([m,p])=>{let{type:g,componentType:f}=p,x=r?.properties[m].min,_=r?.properties[m].max,C=zt.getComponentCount(g),V=xTe(x,C),L=xTe(_,C);return{id:m,type:g,componentType:f,minValue:V,maxValue:L}});e.names=a.map(m=>m.id),e.types=a.map(m=>m.type),e.componentTypes=a.map(m=>m.componentType);let c=a.map(m=>m.minValue),d=a.map(m=>m.maxValue),u=c.some(l);e.minimumValues=u?c:void 0,e.maximumValues=u?d:void 0}function xTe(e,t){if(!l(e))return;let n=Array.isArray(e)?e:[e];return Array.from({length:t},(i,o)=>n[o])}async function gyt(e,t){let n=e.contentUriTemplates[0].getDerivedResource({templateValues:t.getTemplateValues()}),i=e.baseResource.getDerivedResource({url:n.url}),o=await i.fetchArrayBuffer(),r=Vf(o);return await z9.fromJson(i,r.jsonPayload,r.binaryPayload,e.metadataSchema)}async function yyt(e,t){let n=e._implicitTileset,i=e._subtreeCache,o=i.find(t);if(l(o))return o;let r=n.subtreeUriTemplate.getDerivedResource({templateValues:t.getTemplateValues()}),s=n.baseResource.getDerivedResource({url:r.url}),a=await s.fetchArrayBuffer();if(o=i.find(t),l(o))return o;let c=Vf(a);return o=await W_.fromSubtreeJson(s,c.jsonPayload,c.binaryPayload,n,t),i.addSubtree(o),o}G3.prototype.requestData=function(e){e=y(e,y.EMPTY_OBJECT);let t=y(e.tileLevel,0),n=y(e.tileX,0),i=y(e.tileY,0),o=y(e.tileZ,0);if(y(e.keyframe,0)!==0)return;let s=this._implicitTileset,a=this.names,c=new aT({subdivisionScheme:s.subdivisionScheme,subtreeLevels:s.subtreeLevels,level:t,x:n,y:i,z:o}),d=c.isSubtreeRoot()&&c.level>0,u=d?c.getParentSubtreeCoordinates():c.getSubtreeCoordinates();return yyt(this,u).then(function(p){return(d?p.childSubtreeIsAvailableAtCoordinates(c):p.tileIsAvailableAtCoordinates(c))?gyt(s,c):Promise.reject("Tile is not available")}).then(function(p){return a.map(function(g){return p.metadataTable.getPropertyTypedArray(g)})})};var $8=G3;var eJi=T(S(),1);function e7(e){e=y(e,1),this._radius=y(e,1)}Object.defineProperties(e7.prototype,{radius:{get:function(){return this._radius},set:function(e){this._radius=e}}});e7.prototype.emit=function(e){let t=W.randomBetween(0,W.TWO_PI),n=W.randomBetween(0,this._radius),i=n*Math.cos(t),o=n*Math.sin(t),r=0;e.position=h.fromElements(i,o,r,e.position),e.velocity=h.clone(h.UNIT_Z,e.velocity)};var K9=e7;var YJi=T(S(),1);var nJi=T(S(),1),t7={CUMULUS:0};t7.validate=function(e){return e===t7.CUMULUS};var hL=Object.freeze(t7);var lJi=T(S(),1);function Eh(e,t){if(e=y(e,y.EMPTY_OBJECT),this._show=y(e.show,!0),this._position=h.clone(y(e.position,h.ZERO)),!l(e.scale)&&l(e.maximumSize))this._maximumSize=h.clone(e.maximumSize),this._scale=new D(this._maximumSize.x,this._maximumSize.y);else{this._scale=D.clone(y(e.scale,new D(20,12)));let n=new h(this._scale.x,this._scale.y,Math.min(this._scale.x,this._scale.y)/1.5);this._maximumSize=h.clone(y(e.maximumSize,n))}this._slice=y(e.slice,-1),this._color=Y.clone(y(e.color,Y.WHITE)),this._brightness=y(e.brightness,1),this._cloudCollection=t,this._index=-1}var xyt=Eh.SHOW_INDEX=0,_yt=Eh.POSITION_INDEX=1,Tyt=Eh.SCALE_INDEX=2,Syt=Eh.MAXIMUM_SIZE_INDEX=3,Cyt=Eh.SLICE_INDEX=4,Vyt=Eh.BRIGHTNESS_INDEX=5,Lyt=Eh.COLOR_INDEX=6;Eh.NUMBER_OF_PROPERTIES=7;function oS(e,t){let n=e._cloudCollection;l(n)&&(n._updateCloud(e,t),e._dirty=!0)}Object.defineProperties(Eh.prototype,{show:{get:function(){return this._show},set:function(e){this._show!==e&&(this._show=e,oS(this,xyt))}},position:{get:function(){return this._position},set:function(e){let t=this._position;h.equals(t,e)||(h.clone(e,t),oS(this,_yt))}},scale:{get:function(){return this._scale},set:function(e){let t=this._scale;D.equals(t,e)||(D.clone(e,t),oS(this,Tyt))}},maximumSize:{get:function(){return this._maximumSize},set:function(e){let t=this._maximumSize;h.equals(t,e)||(h.clone(e,t),oS(this,Syt))}},color:{get:function(){return this._color},set:function(e){let t=this._color;Y.equals(t,e)||(Y.clone(e,t),oS(this,Lyt))}},slice:{get:function(){return this._slice},set:function(e){this._slice!==e&&(this._slice=e,oS(this,Cyt))}},brightness:{get:function(){return this._brightness},set:function(e){this._brightness!==e&&(this._brightness=e,oS(this,Vyt))}}});Eh.prototype._destroy=function(){this._cloudCollection=void 0};var qd=Eh;var $d,E3=new h,Ryt={positionHighAndScaleX:0,positionLowAndScaleY:1,packedAttribute0:2,packedAttribute1:3,color:4},Zyt={direction:0,positionHighAndScaleX:1,positionLowAndScaleY:2,packedAttribute0:3,packedAttribute1:4,color:5},Gyt=qd.SHOW_INDEX,Eyt=qd.POSITION_INDEX,Xyt=qd.SCALE_INDEX,Iyt=qd.MAXIMUM_SIZE_INDEX,Wyt=qd.SLICE_INDEX,Pyt=qd.BRIGHTNESS_INDEX,vyt=qd.NUMBER_OF_PROPERTIES,wyt=qd.COLOR_INDEX;function Xh(e){e=y(e,y.EMPTY_OBJECT),this._clouds=[],this._cloudsToUpdate=[],this._cloudsToUpdateIndex=0,this._cloudsRemoved=!1,this._createVertexArray=!1,this._propertiesChanged=new Uint32Array(vyt),this._noiseTexture=void 0,this._textureSliceWidth=128,this._noiseTextureRows=4,this.noiseDetail=y(e.noiseDetail,16),this.noiseOffset=h.clone(y(e.noiseOffset,h.ZERO)),this._loading=!1,this._ready=!1;let t=this;this._uniforms={u_noiseTexture:function(){return t._noiseTexture},u_noiseTextureDimensions:_Te(t),u_noiseDetail:function(){return t.noiseDetail}},this._vaNoise=void 0,this._spNoise=void 0,this._spCreated=!1,this._sp=void 0,this._rs=void 0,this.show=y(e.show,!0),this._colorCommands=[],this.debugBillboards=y(e.debugBillboards,!1),this._compiledDebugBillboards=!1,this.debugEllipsoids=y(e.debugEllipsoids,!1),this._compiledDebugEllipsoids=!1}function _Te(e){return function(){return E3.x=e._textureSliceWidth,E3.y=e._noiseTextureRows,E3.z=1/e._noiseTextureRows,E3}}Object.defineProperties(Xh.prototype,{length:{get:function(){return i7(this),this._clouds.length}}});function TTe(e){let t=e.length;for(let n=0;n<t;++n)e[n]&&e[n]._destroy()}Xh.prototype.add=function(e){e=y(e,y.EMPTY_OBJECT);let t=y(e.cloudType,hL.CUMULUS),n;return t===hL.CUMULUS&&(n=new qd(e,this),n._index=this._clouds.length,this._clouds.push(n),this._createVertexArray=!0),n};Xh.prototype.remove=function(e){return this.contains(e)?(this._clouds[e._index]=void 0,this._cloudsRemoved=!0,this._createVertexArray=!0,e._destroy(),!0):!1};Xh.prototype.removeAll=function(){TTe(this._clouds),this._clouds=[],this._cloudsToUpdate=[],this._cloudsToUpdateIndex=0,this._cloudsRemoved=!1,this._createVertexArray=!0};function i7(e){if(e._cloudsRemoved){e._cloudsRemoved=!1;let t=[],n=e._clouds,i=n.length;for(let o=0,r=0;o<i;++o){let s=n[o];l(s)&&(n._index=r++,t.push(s))}e._clouds=t}}Xh.prototype._updateCloud=function(e,t){e._dirty||(this._cloudsToUpdate[this._cloudsToUpdateIndex++]=e),++this._propertiesChanged[t]};Xh.prototype.contains=function(e){return l(e)&&e._cloudCollection===this};Xh.prototype.get=function(e){return i7(this),this._clouds[e]};var Fyt=new Float32Array([-1,-1,1,-1,1,1,-1,1]),Ayt=new Uint16Array([0,1,2,0,2,3]);function Myt(e){let t=ft.createVertexBuffer({context:e,typedArray:Fyt,usage:Ne.STATIC_DRAW}),n=ft.createIndexBuffer({context:e,typedArray:Ayt,usage:Ne.STATIC_DRAW,indexDatatype:Me.UNSIGNED_SHORT}),i=[{index:0,vertexBuffer:t,componentsPerAttribute:2,componentDatatype:Q.FLOAT}];return new ti({context:e,attributes:i,indexBuffer:n})}var o7;function Nyt(e){let n=e.cache.cloudCollection_indexBufferBatched;if(l(n))return n;let i=16384*6-6,o=new Uint16Array(i);for(let r=0,s=0;r<i;r+=6,s+=4)o[r]=s,o[r+1]=s+1,o[r+2]=s+2,o[r+3]=s,o[r+4]=s+2,o[r+5]=s+3;return n=ft.createIndexBuffer({context:e,typedArray:o,usage:Ne.STATIC_DRAW,indexDatatype:Me.UNSIGNED_SHORT}),n.vertexArrayDestroyable=!1,e.cache.cloudCollection_indexBufferBatched=n,n}function kyt(e){let t=e.cache.cloudCollection_indexBufferInstanced;return l(t)||(t=ft.createIndexBuffer({context:e,typedArray:new Uint16Array([0,1,2,0,2,3]),usage:Ne.STATIC_DRAW,indexDatatype:Me.UNSIGNED_SHORT}),t.vertexArrayDestroyable=!1,e.cache.cloudCollection_indexBufferInstanced=t),t}function Uyt(e){let t=e.cache.cloudCollection_vertexBufferInstanced;return l(t)||(t=ft.createVertexBuffer({context:e,typedArray:new Float32Array([0,0,1,0,1,1,0,1]),usage:Ne.STATIC_DRAW}),t.vertexArrayDestroyable=!1,e.cache.cloudCollection_vertexBufferInstanced=t),t}function Dyt(e,t,n){let i=[{index:$d.positionHighAndScaleX,componentsPerAttribute:4,componentDatatype:Q.FLOAT,usage:Ne.STATIC_DRAW},{index:$d.positionLowAndScaleY,componentsPerAttribute:4,componentDatatype:Q.FLOAT,usage:Ne.STATIC_DRAW},{index:$d.packedAttribute0,componentsPerAttribute:4,componentDatatype:Q.FLOAT,usage:Ne.STATIC_DRAW},{index:$d.packedAttribute1,componentsPerAttribute:4,componentDatatype:Q.FLOAT,usage:Ne.STATIC_DRAW},{index:$d.color,componentsPerAttribute:4,componentDatatype:Q.UNSIGNED_BYTE,normalize:!0,usage:Ne.STATIC_DRAW}];n&&i.push({index:$d.direction,componentsPerAttribute:2,componentDatatype:Q.FLOAT,vertexBuffer:Uyt(e)});let o=n?t:4*t;return new g0(e,i,o,n)}var n7=new Bn;function STe(e,t,n,i){let o,r=n[$d.positionHighAndScaleX],s=n[$d.positionLowAndScaleY],a=i.position;Bn.fromCartesian(a,n7);let c=i.scale,d=n7.high,u=n7.low;e._instanced?(o=i._index,r(o,d.x,d.y,d.z,c.x),s(o,u.x,u.y,u.z,c.y)):(o=i._index*4,r(o+0,d.x,d.y,d.z,c.x),r(o+1,d.x,d.y,d.z,c.x),r(o+2,d.x,d.y,d.z,c.x),r(o+3,d.x,d.y,d.z,c.x),s(o+0,u.x,u.y,u.z,c.y),s(o+1,u.x,u.y,u.z,c.y),s(o+2,u.x,u.y,u.z,c.y),s(o+3,u.x,u.y,u.z,c.y))}function CTe(e,t,n,i){let o,r=n[$d.packedAttribute0],s=i.show,a=i.brightness;e._instanced?(o=i._index,r(o,s,a,0,0)):(o=i._index*4,r(o+0,s,a,0,0),r(o+1,s,a,1,0),r(o+2,s,a,1,1),r(o+3,s,a,0,1))}function VTe(e,t,n,i){let o,r=n[$d.packedAttribute1],s=i.maximumSize,a=i.slice;e._instanced?(o=i._index,r(o,s.x,s.y,s.z,a)):(o=i._index*4,r(o+0,s.x,s.y,s.z,a),r(o+1,s.x,s.y,s.z,a),r(o+2,s.x,s.y,s.z,a),r(o+3,s.x,s.y,s.z,a))}function LTe(e,t,n,i){let o,r=n[$d.color],s=i.color,a=Y.floatToByte(s.red),c=Y.floatToByte(s.green),d=Y.floatToByte(s.blue),u=Y.floatToByte(s.alpha);e._instanced?(o=i._index,r(o,a,c,d,u)):(o=i._index*4,r(o+0,a,c,d,u),r(o+1,a,c,d,u),r(o+2,a,c,d,u),r(o+3,a,c,d,u))}function Byt(e,t,n,i){STe(e,t,n,i),CTe(e,t,n,i),VTe(e,t,n,i),LTe(e,t,n,i)}function Yyt(e,t,n,i){let o=e,r=o._textureSliceWidth,s=o._noiseTextureRows,a=t.context;o._vaNoise=Myt(a),o._spNoise=$t.fromCache({context:a,vertexShaderSource:n,fragmentShaderSource:i,attributeLocations:{position:0}});let c=o.noiseDetail,d=o.noiseOffset;o._noiseTexture=new Et({context:a,width:r*r/s,height:r*s,pixelDatatype:ze.UNSIGNED_BYTE,pixelFormat:at.RGBA,sampler:new sn({wrapS:Cn.REPEAT,wrapT:Cn.REPEAT,minificationFilter:rn.NEAREST,magnificationFilter:di.NEAREST})});let u=new Xl({vertexArray:o._vaNoise,shaderProgram:o._spNoise,outputTexture:o._noiseTexture,uniformMap:{u_noiseTextureDimensions:_Te(o),u_noiseDetail:function(){return c},u_noiseOffset:function(){return d}},persists:!1,owner:e,postExecute:function(m){o._ready=!0,o._loading=!1}});t.commandList.push(u),o._loading=!0}function Oyt(e,t){let n=e,i=t.context;n._createVertexArray=!1,n._vaf=n._vaf&&n._vaf.destroy();let o=e._clouds,r=o.length;if(r>0){n._vaf=Dyt(i,r,n._instanced);let s=n._vaf.writers,a;for(a=0;a<r;++a){let c=o[a];Byt(e,t,s,c)}n._vaf.commit(o7(i))}}var Hyt=[];function zyt(e,t){let n=t.context,i=e,r=i._clouds.length,s=i._cloudsToUpdate,a=i._cloudsToUpdateIndex,c=i._propertiesChanged,d=Hyt;d.length=0,(c[Eyt]||c[Xyt])&&d.push(STe),(c[Gyt]||c[Pyt])&&d.push(CTe),(c[Iyt]||c[Wyt])&&d.push(VTe),c[wyt]&&d.push(LTe);let u=d.length,m=i._vaf.writers,p,g,f;if(a/r>.1){for(p=0;p<a;++p)for(g=s[p],g._dirty=!1,f=0;f<u;++f)d[f](e,t,m,g);i._vaf.commit(o7(n))}else{for(p=0;p<a;++p){for(g=s[p],g._dirty=!1,f=0;f<u;++f)d[f](e,t,m,g);i._instanced?i._vaf.subCommit(g._index,1):i._vaf.subCommit(g._index*4,4)}i._vaf.endSubCommits()}i._cloudsToUpdateIndex=0}function Kyt(e,t,n,i){let o=t.context,r=e,s=new Ye({defines:[],sources:[n]});r._instanced&&s.defines.push("INSTANCED");let a=new Ye({defines:[],sources:[i]});r.debugBillboards&&a.defines.push("DEBUG_BILLBOARDS"),r.debugEllipsoids&&a.defines.push("DEBUG_ELLIPSOIDS"),r._sp=$t.replaceCache({context:o,shaderProgram:r._sp,vertexShaderSource:s,fragmentShaderSource:a,attributeLocations:$d}),r._rs=De.fromCache({depthTest:{enabled:!0,func:ne.LESS},depthMask:!1,blending:un.ALPHA_BLEND}),r._spCreated=!0,r._compiledDebugBillboards=r.debugBillboards,r._compiledDebugEllipsoids=r.debugEllipsoids}function Jyt(e,t){let n=e,i=t.passes,o=n._uniforms,r=t.commandList;if(i.render){let s=n._colorCommands,a=n._vaf.va,c=a.length;s.length=c;for(let d=0;d<c;d++){let u=s[d];l(u)||(u=s[d]=new et),u.pass=Re.TRANSLUCENT,u.owner=e,u.uniformMap=o,u.count=a[d].indicesCount,u.vertexArray=a[d].va,u.shaderProgram=n._sp,u.renderState=n._rs,n._instanced&&(u.count=6,u.instanceCount=n._clouds.length),r.push(u)}}}Xh.prototype.update=function(e){if(i7(this),!this.show)return;let t=this.debugBillboards||this.debugEllipsoids;this._ready=t?!0:l(this._noiseTexture),!this._ready&&!this._loading&&!t&&Yyt(this,e,hw,mw),this._instanced=e.context.instancedArrays,$d=this._instanced?Zyt:Ryt,o7=this._instanced?kyt:Nyt;let i=this._clouds.length,o=this._cloudsToUpdate,r=this._cloudsToUpdateIndex;this._createVertexArray?Oyt(this,e):r>0&&zyt(this,e),r>i*1.5&&(o.length=i),!(!l(this._vaf)||!l(this._vaf.va)||!this._ready&!t)&&((!this._spCreated||this.debugBillboards!==this._compiledDebugBillboards||this.debugEllipsoids!==this._compiledDebugEllipsoids)&&Kyt(this,e,uw,dw),Jyt(this,e))};Xh.prototype.isDestroyed=function(){return!1};Xh.prototype.destroy=function(){return this._noiseTexture=this._noiseTexture&&this._noiseTexture.destroy(),this._sp=this._sp&&this._sp.destroy(),this._vaf=this._vaf&&this._vaf.destroy(),TTe(this._clouds),me(this)};var r7=Xh;var JJi=T(S(),1);var Qyt=W.toRadians(30);function s7(e){this._angle=y(e,Qyt)}Object.defineProperties(s7.prototype,{angle:{get:function(){return this._angle},set:function(e){this._angle=e}}});s7.prototype.emit=function(e){let t=Math.tan(this._angle),n=W.randomBetween(0,W.TWO_PI),i=W.randomBetween(0,t),o=i*Math.cos(n),r=i*Math.sin(n),s=1;e.velocity=h.fromElements(o,r,s,e.velocity),h.normalize(e.velocity,e.velocity),e.position=h.clone(h.ZERO,e.position)};var a7=s7;var eQi=T(S(),1);function J9(e){e=y(e,y.EMPTY_OBJECT);let t=e.attributeName,n=e.perInstanceAttribute;l(n)||(n=!1);let i=y(e.glslDatatype,"vec3"),o=`v_${t}`,r;if(t==="normal"||t==="tangent"||t==="bitangent")r=`vec4 getColor() { return vec4((${o} + vec3(1.0)) * 0.5, 1.0); } `;else switch(t==="st"&&(i="vec2"),i){case"float":r=`vec4 getColor() { return vec4(vec3(${o}), 1.0); } `;break;case"vec2":r=`vec4 getColor() { return vec4(${o}, 0.0, 1.0); } `;break;case"vec3":r=`vec4 getColor() { return vec4(${o}, 1.0); } `;break;case"vec4":r=`vec4 getColor() { return ${o}; } `;break}let s=`in vec3 position3DHigh; in vec3 position3DLow; in float batchId; ${n?"":`in ${i} ${t}; `}out ${i} ${o}; void main() { vec4 p = czm_translateRelativeToEye(position3DHigh, position3DLow); ${n?`${o} = czm_batchTable_${t}(batchId); `:`${o} = ${t}; `}gl_Position = czm_modelViewProjectionRelativeToEye * p; }`,a=`in ${i} ${o}; ${r} void main() { out_FragColor = getColor(); }`;this.material=void 0,this.translucent=y(e.translucent,!1),this._vertexShaderSource=y(e.vertexShaderSource,s),this._fragmentShaderSource=y(e.fragmentShaderSource,a),this._renderState=eo.getDefaultRenderState(!1,!1,e.renderState),this._closed=y(e.closed,!1),this._attributeName=t,this._glslDatatype=i}Object.defineProperties(J9.prototype,{vertexShaderSource:{get:function(){return this._vertexShaderSource}},fragmentShaderSource:{get:function(){return this._fragmentShaderSource}},renderState:{get:function(){return this._renderState}},closed:{get:function(){return this._closed}},attributeName:{get:function(){return this._attributeName}},glslDatatype:{get:function(){return this._glslDatatype}}});J9.prototype.getFragmentShaderSource=eo.prototype.getFragmentShaderSource;J9.prototype.isTranslucent=eo.prototype.isTranslucent;J9.prototype.getRenderState=eo.prototype.getRenderState;var c7=J9;var hQi=T(S(),1);function X3(e){e=y(e,y.EMPTY_OBJECT),this.length=y(e.length,1e7),this._length=void 0,this.width=y(e.width,2),this._width=void 0,this.show=y(e.show,!0),this.modelMatrix=M.clone(y(e.modelMatrix,M.IDENTITY)),this._modelMatrix=new M,this.id=e.id,this._id=void 0,this._primitive=void 0}X3.prototype.update=function(e){if(this.show){if(!l(this._primitive)||!M.equals(this._modelMatrix,this.modelMatrix)||this._length!==this.length||this._width!==this.width||this._id!==this.id){this._modelMatrix=M.clone(this.modelMatrix,this._modelMatrix),this._length=this.length,this._width=this.width,this._id=this.id,l(this._primitive)&&this._primitive.destroy(),this.modelMatrix[12]===0&&this.modelMatrix[13]===0&&this.modelMatrix[14]===0&&(this.modelMatrix[14]=.01);let t=new St({geometry:new Ip({positions:[h.ZERO,h.UNIT_X],width:this.width,vertexFormat:Or.VERTEX_FORMAT,colors:[Y.RED,Y.RED],arcType:qt.NONE}),modelMatrix:M.multiplyByUniformScale(this.modelMatrix,this.length,new M),id:this.id,pickPrimitive:this}),n=new St({geometry:new Ip({positions:[h.ZERO,h.UNIT_Y],width:this.width,vertexFormat:Or.VERTEX_FORMAT,colors:[Y.GREEN,Y.GREEN],arcType:qt.NONE}),modelMatrix:M.multiplyByUniformScale(this.modelMatrix,this.length,new M),id:this.id,pickPrimitive:this}),i=new St({geometry:new Ip({positions:[h.ZERO,h.UNIT_Z],width:this.width,vertexFormat:Or.VERTEX_FORMAT,colors:[Y.BLUE,Y.BLUE],arcType:qt.NONE}),modelMatrix:M.multiplyByUniformScale(this.modelMatrix,this.length,new M),id:this.id,pickPrimitive:this});this._primitive=new En({geometryInstances:[t,n,i],appearance:new Or,asynchronous:!1})}this._primitive.update(e)}};X3.prototype.isDestroyed=function(){return!1};X3.prototype.destroy=function(){return this._primitive=this._primitive&&this._primitive.destroy(),me(this)};var Q9=X3;var yQi=T(S(),1);function jyt(e){this.direction=h.clone(e.direction),this.color=Y.clone(y(e.color,Y.WHITE)),this.intensity=y(e.intensity,1)}var l7=jyt;var IQi=T(S(),1);var _Qi=T(S(),1),j9=`in vec3 v_positionMC; in vec3 v_positionEC; in vec2 v_st; void main() { czm_materialInput materialInput; vec3 normalEC = normalize(czm_normal3D * czm_geodeticSurfaceNormal(v_positionMC, vec3(0.0), vec3(1.0))); #ifdef FACE_FORWARD normalEC = faceforward(normalEC, vec3(0.0, 0.0, 1.0), -normalEC); #endif materialInput.s = v_st.s; materialInput.st = v_st; materialInput.str = vec3(v_st, 0.0); // Convert tangent space material normal to eye space materialInput.normalEC = normalEC; materialInput.tangentToEyeMatrix = czm_eastNorthUpToEyeCoordinates(v_positionMC, materialInput.normalEC); // Convert view vector to world space vec3 positionToEyeEC = -v_positionEC; materialInput.positionToEyeEC = positionToEyeEC; czm_material material = czm_getMaterial(materialInput); #ifdef FLAT out_FragColor = vec4(material.diffuse + material.emission, material.alpha); #else out_FragColor = czm_phong(normalize(positionToEyeEC), material, czm_lightDirectionEC); #endif } `;var SQi=T(S(),1),q9=`in vec3 position3DHigh; in vec3 position3DLow; in vec2 st; in float batchId; out vec3 v_positionMC; out vec3 v_positionEC; out vec2 v_st; void main() { vec4 p = czm_computePosition(); v_positionMC = position3DHigh + position3DLow; // position in model coordinates v_positionEC = (czm_modelViewRelativeToEye * p).xyz; // position in eye coordinates v_st = st; gl_Position = czm_modelViewProjectionRelativeToEye * p; } `;function rS(e){e=y(e,y.EMPTY_OBJECT);let t=y(e.translucent,!0),n=y(e.aboveGround,!1);this.material=l(e.material)?e.material:Mi.fromType(Mi.ColorType),this.translucent=y(e.translucent,!0),this._vertexShaderSource=y(e.vertexShaderSource,q9),this._fragmentShaderSource=y(e.fragmentShaderSource,j9),this._renderState=eo.getDefaultRenderState(t,!n,e.renderState),this._closed=!1,this._flat=y(e.flat,!1),this._faceForward=y(e.faceForward,n),this._aboveGround=n}Object.defineProperties(rS.prototype,{vertexShaderSource:{get:function(){return this._vertexShaderSource}},fragmentShaderSource:{get:function(){return this._fragmentShaderSource}},renderState:{get:function(){return this._renderState}},closed:{get:function(){return this._closed}},vertexFormat:{get:function(){return rS.VERTEX_FORMAT}},flat:{get:function(){return this._flat}},faceForward:{get:function(){return this._faceForward}},aboveGround:{get:function(){return this._aboveGround}}});rS.VERTEX_FORMAT=We.POSITION_AND_ST;rS.prototype.getFragmentShaderSource=eo.prototype.getFragmentShaderSource;rS.prototype.isTranslucent=eo.prototype.isTranslucent;rS.prototype.getRenderState=eo.prototype.getRenderState;var d7=rS;var NQi=T(S(),1);function $l(e){this._scene=e.scene,this.samplingWindow=y(e.samplingWindow,$l.defaultSettings.samplingWindow),this.quietPeriod=y(e.quietPeriod,$l.defaultSettings.quietPeriod),this.warmupPeriod=y(e.warmupPeriod,$l.defaultSettings.warmupPeriod),this.minimumFrameRateDuringWarmup=y(e.minimumFrameRateDuringWarmup,$l.defaultSettings.minimumFrameRateDuringWarmup),this.minimumFrameRateAfterWarmup=y(e.minimumFrameRateAfterWarmup,$l.defaultSettings.minimumFrameRateAfterWarmup),this._lowFrameRate=new ge,this._nominalFrameRate=new ge,this._frameTimes=[],this._needsQuietPeriod=!0,this._quietPeriodEndTime=0,this._warmupPeriodEndTime=0,this._frameRateIsLow=!1,this._lastFramesPerSecond=void 0,this._pauseCount=0;let t=this;this._preUpdateRemoveListener=this._scene.preUpdate.addEventListener(function(o,r){qyt(t,r)}),this._hiddenPropertyName=document.hidden!==void 0?"hidden":document.mozHidden!==void 0?"mozHidden":document.msHidden!==void 0?"msHidden":document.webkitHidden!==void 0?"webkitHidden":void 0;let n=document.hidden!==void 0?"visibilitychange":document.mozHidden!==void 0?"mozvisibilitychange":document.msHidden!==void 0?"msvisibilitychange":document.webkitHidden!==void 0?"webkitvisibilitychange":void 0;function i(){$yt(t)}this._visibilityChangeRemoveListener=void 0,l(n)&&(document.addEventListener(n,i,!1),this._visibilityChangeRemoveListener=function(){document.removeEventListener(n,i,!1)})}$l.defaultSettings={samplingWindow:5,quietPeriod:2,warmupPeriod:5,minimumFrameRateDuringWarmup:4,minimumFrameRateAfterWarmup:8};$l.fromScene=function(e){return(!l(e._frameRateMonitor)||e._frameRateMonitor.isDestroyed())&&(e._frameRateMonitor=new $l({scene:e})),e._frameRateMonitor};Object.defineProperties($l.prototype,{scene:{get:function(){return this._scene}},lowFrameRate:{get:function(){return this._lowFrameRate}},nominalFrameRate:{get:function(){return this._nominalFrameRate}},lastFramesPerSecond:{get:function(){return this._lastFramesPerSecond}}});$l.prototype.pause=function(){++this._pauseCount,this._pauseCount===1&&(this._frameTimes.length=0,this._lastFramesPerSecond=void 0)};$l.prototype.unpause=function(){--this._pauseCount,this._pauseCount<=0&&(this._pauseCount=0,this._needsQuietPeriod=!0)};$l.prototype.isDestroyed=function(){return!1};$l.prototype.destroy=function(){return this._preUpdateRemoveListener(),l(this._visibilityChangeRemoveListener)&&this._visibilityChangeRemoveListener(),me(this)};function qyt(e,t){if(e._pauseCount>0)return;let n=fi();if(e._needsQuietPeriod)e._needsQuietPeriod=!1,e._frameTimes.length=0,e._quietPeriodEndTime=n+e.quietPeriod/zn.SECONDS_PER_MILLISECOND,e._warmupPeriodEndTime=e._quietPeriodEndTime+(e.warmupPeriod+e.samplingWindow)/zn.SECONDS_PER_MILLISECOND;else if(n>=e._quietPeriodEndTime){e._frameTimes.push(n);let i=n-e.samplingWindow/zn.SECONDS_PER_MILLISECOND;if(e._frameTimes.length>=2&&e._frameTimes[0]<=i){for(;e._frameTimes.length>=2&&e._frameTimes[1]<i;)e._frameTimes.shift();let o=(n-e._frameTimes[0])/(e._frameTimes.length-1);e._lastFramesPerSecond=1e3/o;let r=1e3/(n>e._warmupPeriodEndTime?e.minimumFrameRateAfterWarmup:e.minimumFrameRateDuringWarmup);o>r?e._frameRateIsLow||(e._frameRateIsLow=!0,e._needsQuietPeriod=!0,e.lowFrameRate.raiseEvent(e.scene,e._lastFramesPerSecond)):e._frameRateIsLow&&(e._frameRateIsLow=!1,e._needsQuietPeriod=!0,e.nominalFrameRate.raiseEvent(e.scene,e._lastFramesPerSecond))}}}function $yt(e){document[e._hiddenPropertyName]?e.pause():e.unpause()}var $9=$l;var $Qi=T(S(),1);var RTe=T(tH(),1);function u7(){this._image=new Image}u7.prototype.isReady=function(){return!0};u7.prototype.shouldDiscardImage=function(e){return e===this._image};function sS(e){e=y(e,y.EMPTY_OBJECT),this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=void 0,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0,this._tileDiscardPolicy=e.tileDiscardPolicy,this._tilingScheme=new Ai({numberOfLevelZeroTilesX:2,numberOfLevelZeroTilesY:2,rectangle:new ce(-W.PI,-W.PI,W.PI,W.PI),ellipsoid:e.ellipsoid});let t=e.credit;typeof t=="string"&&(t=new Ct(t)),this._credit=t,this._tileWidth=256,this._tileHeight=256,this._maximumLevel=23,l(this._tileDiscardPolicy)||(this._tileDiscardPolicy=new u7),this._errorEvent=new ge}Object.defineProperties(sS.prototype,{url:{get:function(){return this._metadata.url}},proxy:{get:function(){return this._metadata.proxy}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){return this._maximumLevel}},minimumLevel:{get:function(){return 0}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._tilingScheme.rectangle}},tileDiscardPolicy:{get:function(){return this._tileDiscardPolicy}},errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},hasAlphaChannel:{get:function(){return!1}}});sS.fromMetadata=function(e,t){if(!e.imageryPresent)throw new ue(`The server ${e.url} doesn't have imagery`);let n=new sS(t);return n._metadata=e,n};sS.prototype.getTileCredits=function(e,t,n){let i=this._metadata,o=i.getTileInformation(e,t,n);if(l(o)){let r=i.providers[o.imageryProvider];if(l(r))return[r]}};sS.prototype.requestImage=function(e,t,n,i){let o=this._tileDiscardPolicy._image,r=this._metadata,s=Rp.tileXYToQuadKey(e,t,n),a=r.getTileInformation(e,t,n);if(!l(a)){if(r.isValid(s)){let d=new Yo({throttle:i.throttle,throttleByServer:i.throttleByServer,type:i.type,priorityFunction:i.priorityFunction});r.populateSubtree(e,t,n,d);return}return Promise.resolve(o)}if(!a.hasImagery())return Promise.resolve(o);let c=ext(this,a,e,t,n,i).fetchArrayBuffer();if(l(c))return c.then(function(d){bZ(r.key,d);let u=new Uint8Array(d),m,p=r.protoImagery;if((!l(p)||!p)&&(m=txt(u)),!l(m)&&(!l(p)||p)){let g=nxt(u);m=g.imageType,u=g.imageData}return!l(m)||!l(u)?o:Yx({uint8Array:u,format:m,flipY:!0})})};sS.prototype.pickFeatures=function(e,t,n,i,o){};function ext(e,t,n,i,o,r){let s=Rp.tileXYToQuadKey(n,i,o),a=t.imageryVersion;return a=l(a)&&a>0?a:1,e._metadata.resource.getDerivedResource({url:`flatfile?f1-0${s}-i.${a.toString()}`,request:r})}function txt(e){let t="JFIF";if(e[6]===t.charCodeAt(0)&&e[7]===t.charCodeAt(1)&&e[8]===t.charCodeAt(2)&&e[9]===t.charCodeAt(3))return"image/jpeg";let n="PNG";if(e[1]===n.charCodeAt(0)&&e[2]===n.charCodeAt(1)&&e[3]===n.charCodeAt(2))return"image/png"}function nxt(e){let t=RTe.Reader.create(e),n=t.len,i={};for(;t.pos<n;){let s=t.uint32(),a;switch(s>>>3){case 1:i.imageType=t.uint32();break;case 2:i.imageData=t.bytes();break;case 3:i.alphaType=t.uint32();break;case 4:i.imageAlpha=t.bytes();break;case 5:if(a=i.copyrightIds,l(a)||(a=i.copyrightIds=[]),(s&7)===2){let c=t.uint32()+t.pos;for(;t.pos<c;)a.push(t.uint32())}else a.push(t.uint32());break;default:t.skipType(s&7);break}}let o=i.imageType;if(l(o))switch(o){case 0:i.imageType="image/jpeg";break;case 4:i.imageType="image/png";break;default:throw new ue("GoogleEarthEnterpriseImageryProvider: Unsupported image type.")}let r=i.alphaType;return l(r)&&r!==0&&(console.log("GoogleEarthEnterpriseImageryProvider: External alpha not supported."),delete i.alphaType,delete i.imageAlpha),i}var m7=sS;var s4i=T(S(),1);var ixt=new Y(1,1,1,.4),oxt=new Y(0,1,0,.05),rxt=new Y(0,.5,0,.2);function aS(e){e=y(e,y.EMPTY_OBJECT),this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=void 0,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0,this._tilingScheme=l(e.tilingScheme)?e.tilingScheme:new Ai({ellipsoid:e.ellipsoid}),this._cells=y(e.cells,8),this._color=y(e.color,ixt),this._glowColor=y(e.glowColor,oxt),this._glowWidth=y(e.glowWidth,6),this._backgroundColor=y(e.backgroundColor,rxt),this._errorEvent=new ge,this._tileWidth=y(e.tileWidth,256),this._tileHeight=y(e.tileHeight,256),this._canvasSize=y(e.canvasSize,256),this._canvas=this._createGridCanvas()}Object.defineProperties(aS.prototype,{proxy:{get:function(){}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){}},minimumLevel:{get:function(){}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._tilingScheme.rectangle}},tileDiscardPolicy:{get:function(){}},errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){}},hasAlphaChannel:{get:function(){return!0}}});aS.prototype._drawGrid=function(e){let n=this._canvasSize;for(let i=0;i<=this._cells;++i){let r=1+i/this._cells*(n-1);e.moveTo(r,0),e.lineTo(r,n),e.moveTo(0,r),e.lineTo(n,r)}e.stroke()};aS.prototype._createGridCanvas=function(){let e=document.createElement("canvas");e.width=this._canvasSize,e.height=this._canvasSize;let t=0,n=this._canvasSize,i=e.getContext("2d"),o=this._backgroundColor.toCssColorString();i.fillStyle=o,i.fillRect(t,t,n,n);let r=this._glowColor.toCssColorString();i.strokeStyle=r,i.lineWidth=this._glowWidth,i.strokeRect(t,t,n,n),this._drawGrid(i),i.lineWidth=this._glowWidth*.5,i.strokeRect(t,t,n,n),this._drawGrid(i);let s=this._color.toCssColorString();return i.strokeStyle=s,i.lineWidth=2,i.strokeRect(t,t,n,n),i.lineWidth=1,this._drawGrid(i),e};aS.prototype.getTileCredits=function(e,t,n){};aS.prototype.requestImage=function(e,t,n,i){return Promise.resolve(this._canvas)};aS.prototype.pickFeatures=function(e,t,n,i,o){};var h7=aS;var Dji=T(S(),1);var hji=T(S(),1);var J4i=T(S(),1);var b4i=T(S(),1);function Ih(){}Ih._maxDecodingConcurrency=Math.max(Yt.hardwareConcurrency-1,1);Ih._decodeTaskProcessor=new hi("decodeI3S",Ih._maxDecodingConcurrency);Ih._promise=void 0;async function sxt(){if(await Ih._decodeTaskProcessor.initWebAssemblyModule({wasmBinaryFile:"ThirdParty/draco_decoder.wasm"}))return Ih._decodeTaskProcessor;throw new ue("I3S decoder could not be initialized.")}Ih.decode=async function(e,t,n,i,o){return l(Ih._promise)||(Ih._promise=sxt()),Ih._promise.then(function(r){let s=n._parent._data,a=n._parent._inverseRotationMatrix,c=0,d=0,u=0;l(s.obb)?(c=s.obb.center[0],d=s.obb.center[1],u=s.obb.center[2]):l(s.mbs)&&(c=s.mbs[0],d=s.mbs[1],u=s.mbs[2]);let m=$.fromRotationX(-W.PI_OVER_TWO),p=new $;$.multiply(m,a,p);let g=he.fromDegrees(c,d,u),f=ie.WGS84.cartographicToCartesian(g),x={binaryData:n._data,featureData:l(i)&&l(i[0])?i[0].data:void 0,schema:t,bufferInfo:n._geometryBufferInfo,ellipsoidRadiiSquare:ie.WGS84.radiiSquared,url:e,geoidDataList:n._dataProvider._geoidDataList,cartographicCenter:g,cartesianCenter:f,parentRotation:p,enableFeatures:n._dataProvider.showFeatures,splitGeometryByColorTransparency:n._dataProvider.adjustMaterialAlphaMode,symbologyData:o,calculateNormals:n._dataProvider.calculateNormals};return r.scheduleTask(x)})};var eA=Ih;var _4i=T(S(),1);function f7(e,t){this._parent=e,this._dataProvider=e._dataProvider,this._layer=e._layer,l(this._parent._nodeIndex)?this._resource=this._parent._layer.resource.getDerivedResource({url:`nodes/${this._parent._data.mesh.attribute.resource}/${t}`}):this._resource=this._parent.resource.getDerivedResource({url:t})}Object.defineProperties(f7.prototype,{resource:{get:function(){return this._resource}},data:{get:function(){return this._data}}});f7.prototype.load=async function(){return this._data=await Wh.loadJson(this._resource),this._data};var tA=f7;var V4i=T(S(),1);function ub(e,t){this._storageInfo=t,this._parent=e,this._dataProvider=e._dataProvider,this._loadPromise=void 0;let n=`attributes/${t.key}/0`;l(this._parent._nodeIndex)?this._resource=this._parent._layer.resource.getDerivedResource({url:`nodes/${this._parent._data.mesh.attribute.resource}/${n}`}):this._resource=this._parent.resource.getDerivedResource({url:n})}Object.defineProperties(ub.prototype,{resource:{get:function(){return this._resource}},header:{get:function(){return this._header}},values:{get:function(){if(l(this._values)){if(l(this._values.attributeValues))return this._values.attributeValues;if(l(this._values.objectIds))return this._values.objectIds}return[]}},name:{get:function(){return this._storageInfo.name}}});function I3(e){return e==="UInt8"||e==="Int8"?1:e==="UInt16"||e==="Int16"?2:e==="UInt32"||e==="Int32"||e==="Oid32"||e==="Float32"?4:e==="UInt64"||e==="Int64"||e==="Float64"?8:0}function axt(e){return e==="String"?1:I3(e)}async function cxt(e){let t=await e._dataProvider._loadBinary(e._resource),n=new DataView(t);e._data=t,e._validateHeader(n);let i=e._parseHeader(n),o=e._getBodyOffset(i);e._validateBody(n,o),e._parseBody(n,o)}ub.prototype.load=function(){return l(this._loadPromise)?this._loadPromise:(this._loadPromise=cxt(this).catch(function(e){console.error(e)}),this._loadPromise)};ub.prototype._parseValue=function(e,t,n){let i;if(t==="UInt8")i=e.getUint8(n),n+=1;else if(t==="Int8")i=e.getInt8(n),n+=1;else if(t==="UInt16")i=e.getUint16(n,!0),n+=2;else if(t==="Int16")i=e.getInt16(n,!0),n+=2;else if(t==="UInt32")i=e.getUint32(n,!0),n+=4;else if(t==="Oid32")i=e.getUint32(n,!0),n+=4;else if(t==="Int32")i=e.getInt32(n,!0),n+=4;else if(t==="UInt64"){let o=e.getUint32(n,!0),r=e.getUint32(n+4,!0);i=o+Math.pow(2,32)*r,n+=8}else if(t==="Int64"){let o=e.getUint32(n,!0),r=e.getUint32(n+4,!0);r<Math.pow(2,31)?i=o+Math.pow(2,32)*r:i=o+Math.pow(2,32)*(r-Math.pow(2,32)),n+=8}else t==="Float32"?(i=e.getFloat32(n,!0),n+=4):t==="Float64"?(i=e.getFloat64(n,!0),n+=8):t==="String"&&(i=String.fromCharCode(e.getUint8(n)),n+=1);return{value:i,offset:n}};ub.prototype._parseHeader=function(e){let t=0;this._header={};for(let n=0;n<this._storageInfo.header.length;n++){let i=this._storageInfo.header[n],o=this._parseValue(e,i.valueType,t);this._header[i.property]=o.value,t=o.offset}return t};ub.prototype._parseBody=function(e,t){this._values={};for(let n=0;n<this._storageInfo.ordering.length;n++){let i=this._storageInfo.ordering[n],o=i==="ObjectIds"?"objectIds":i,r=this._storageInfo[o];if(l(r)){this._values[o]=[];for(let s=0;s<this._header.count;++s)if(r.valueType!=="String"){let a=this._parseValue(e,r.valueType,t);this._values[o].push(a.value),t=a.offset}else{let a=this._values.attributeByteCounts[s],c="";for(let d=0;d<a;++d){let u=this._parseValue(e,r.valueType,t);u.value.charCodeAt(0)!==0&&(c+=u.value),t=u.offset}this._values[o].push(c)}}}};ub.prototype._getBodyOffset=function(e){let t=0;return l(this._storageInfo.attributeValues)?t=I3(this._storageInfo.attributeValues.valueType):l(this._storageInfo.objectIds)&&(t=I3(this._storageInfo.objectIds.valueType)),t>0?Math.ceil(e/t)*t:e};ub.prototype._validateHeader=function(e){let t=0;for(let n=0;n<this._storageInfo.header.length;n++){let i=this._storageInfo.header[n];t+=axt(i.valueType)}if(e.byteLength<t)throw new ue(`Invalid attribute buffer size (field: ${this.name}, header: ${t}, actual: ${e.byteLength})`)};ub.prototype._validateBody=function(e,t){if(!l(this._header.count))throw new ue(`Invalid attribute buffer (field: ${this.name}, count is missing)`);let n;for(let i=0;i<this._storageInfo.ordering.length&&t<e.byteLength;i++){let o=this._storageInfo.ordering[i],r=o==="ObjectIds"?"objectIds":o,s=this._storageInfo[r];if(l(s))if(s.valueType!=="String"){r==="attributeByteCounts"&&(n=t);let a=I3(s.valueType);t+=a*this._header.count}else{if(!l(n))throw new ue(`Invalid attribute buffer (field: ${this.name}, attributeByteCounts is missing)`);for(let a=0;a<this._header.count&&t<e.byteLength;++a){let c=this._parseValue(e,this._storageInfo.attributeByteCounts.valueType,n);t+=c.value,n=c.offset}}else throw new ue(`Invalid attribute buffer (field: ${this.name}, ${r} is missing)`)}if(e.byteLength<t)throw new ue(`Invalid attribute buffer size (field: ${this.name}, expected: ${t}, actual: ${e.byteLength})`)};var nA=ub;var I4i=T(S(),1);function iA(e,t){let n=e._dataProvider,i=e._layer,o;l(e._nodeIndex)?o=i.resource.getDerivedResource({url:`nodes/${e._data.mesh.geometry.resource}/${t}`}):o=e.resource.getDerivedResource({url:t}),this._parent=e,this._dataProvider=n,this._layer=i,this._resource=o,this._customAttributes=void 0}Object.defineProperties(iA.prototype,{resource:{get:function(){return this._resource}},data:{get:function(){return this._data}},customAttributes:{get:function(){return this._customAttributes}}});iA.prototype.load=function(){let e=this;return this._dataProvider._loadBinary(this._resource).then(function(t){return e._data=t,t})};var lxt=new h,dxt=new h,uxt=new h,mxt=new h,hxt=new h;function p7(e,t,n,i){let o=h.subtract(i,n,lxt),r=h.cross(o,h.subtract(e,n,dxt),mxt),s=h.cross(o,h.subtract(t,n,uxt),hxt);return h.dot(r,s)>=0}var fxt=new h,pxt=new h,bxt=new h,gxt=new h,yxt=new h,xxt=new h,_xt=new h,Txt=new h,Sxt=new h,Cxt=new h;iA.prototype.getClosestPointIndexOnTriangle=function(e,t,n){if(l(this._customAttributes)&&l(this._customAttributes.positions)){let i=new h(e,t,n);i.x-=this._customAttributes.cartesianCenter.x,i.y-=this._customAttributes.cartesianCenter.y,i.z-=this._customAttributes.cartesianCenter.z,$.multiplyByVector(this._customAttributes.parentRotation,i,i);let o=Number.MAX_VALUE,r,s,a,c,d=this._customAttributes.positions,u=this._customAttributes.indices,m;l(u)?m=u.length:m=d.length/3;for(let p=0;p<m;p++){let g,f,x;l(u)?(g=u[p],f=u[p+1],x=u[p+2]):(g=p*3,f=p*3+1,x=p*3+2);let _=h.fromElements(d[g*3],d[g*3+1],d[g*3+2],fxt),C=h.fromElements(d[f*3],d[f*3+1],d[f*3+2],pxt),V=new h(d[x*3],d[x*3+1],d[x*3+2],bxt);if(!p7(i,_,C,V)||!p7(i,C,_,V)||!p7(i,V,_,C))continue;let L=h.subtract(C,_,gxt),Z=h.subtract(V,_,yxt),G=h.cross(L,Z,xxt);if(h.magnitude(G)===0)continue;let X=h.normalize(G,_xt),v=h.subtract(i,_,Txt),P=Math.abs(h.dot(v,X));if(P<o){o=P,r=p;let F=h.magnitudeSquared(h.subtract(i,_,v)),A=h.magnitudeSquared(h.subtract(i,C,Sxt)),b=h.magnitudeSquared(h.subtract(i,V,Cxt));F<A&&F<b?(a=g,c=_,s=F):A<b?(a=f,c=C,s=A):(a=x,c=V,s=b)}}if(l(r))return{index:a,distanceSquared:s,distance:Math.sqrt(s),queriedPosition:i,closestPosition:h.clone(c)}}return{index:-1,distanceSquared:Number.Infinity,distance:Number.Infinity}};function ZTe(e){let t=[],n=e.length;for(let i=0;i<n;i++)i<3?t.push(Hx(e[i])):t.push(e[i]);return t}iA.prototype._generateGltf=function(e,t,n,i,o,r,s,a){let c={pbrMetallicRoughness:{metallicFactor:0},doubleSided:!0,name:"Material"},d=!1,u,m="";if(l(this._parent._data.mesh)&&l(this._layer._data.materialDefinitions)){let L=this._parent._data.mesh.material.definition;if(L>=0&&L<this._layer._data.materialDefinitions.length){if(u=this._layer._data.materialDefinitions[L],c=u,l(c.pbrMetallicRoughness)&&l(c.pbrMetallicRoughness.baseColorTexture)){d=!0,c.pbrMetallicRoughness.baseColorTexture.index=0;let Z="0";if(l(this._layer._data.textureSetDefinitions))for(let G=0;G<this._layer._data.textureSetDefinitions.length;G++){let X=this._layer._data.textureSetDefinitions[G];for(let v=0;v<X.formats.length;v++){let P=X.formats[v];if(P.format==="jpg"){Z=P.name;break}}}l(this._parent._data.mesh)&&this._parent._data.mesh.material.resource>=0&&(m=this._layer.resource.getDerivedResource({url:`nodes/${this._parent._data.mesh.material.resource}/textures/${Z}`}).url)}l(c.pbrMetallicRoughness)&&l(c.pbrMetallicRoughness.baseColorFactor)&&(c.pbrMetallicRoughness.baseColorFactor=ZTe(c.pbrMetallicRoughness.baseColorFactor)),l(c.emissiveFactor)&&(c.emissiveFactor=ZTe(c.emissiveFactor))}}else l(this._parent._data.textureData)&&(d=!0,m=this._parent.resource.getDerivedResource({url:`${this._parent._data.textureData[0].href}`}).url,c.pbrMetallicRoughness.baseColorTexture={index:0});l(c.alphaMode)&&(c.alphaMode=c.alphaMode.toUpperCase());let p=[],g=[],f=[];d&&(p=[{sampler:0,source:0}],g=[{uri:m}],f=[{magFilter:9729,minFilter:9986,wrapS:10497,wrapT:10497}]);let x=[],_=n.length;for(let V=0;V<_;V++){let L=n[V].primitives,Z=L.length;for(let G=0;G<Z;G++){let X=L[G];if(l(X.material)){for(;X.material>=x.length;){let P=Oe(c,!0);x.push(P)}let v=x[X.material];l(X.extra)&&X.extra.isTransparent?l(v.alphaMode)||(v.alphaMode="BLEND"):v.alphaMode==="BLEND"&&(v.alphaMode="OPAQUE")}}}return{scene:0,scenes:[{nodes:e}],nodes:t,meshes:n,buffers:i,bufferViews:o,accessors:r,materials:x,textures:p,images:g,samplers:f,asset:{version:"2.0"},extensions:s,extensionsUsed:a}};var fL=iA;function Zc(e,t,n){let i,o,r,s;n?(i=0,o=e):(i=e._level+1,o=e._layer),typeof t=="number"?r=t:s=e.resource.getDerivedResource({url:`${t}/`}),this._parent=e,this._dataProvider=e._dataProvider,this._isRoot=n,this._level=i,this._layer=o,this._nodeIndex=r,this._resource=s,this._isLoading=!1,this._tile=void 0,this._data=void 0,this._geometryData=[],this._featureData=[],this._fields={},this._children=[],this._childrenReadyPromise=void 0,this._globalTransform=void 0,this._inverseGlobalTransform=void 0,this._inverseRotationMatrix=void 0,this._symbologyData=void 0}Object.defineProperties(Zc.prototype,{resource:{get:function(){return this._resource}},layer:{get:function(){return this._layer}},parent:{get:function(){return this._parent}},children:{get:function(){return this._children}},geometryData:{get:function(){return this._geometryData}},featureData:{get:function(){return this._featureData}},fields:{get:function(){return this._fields}},tile:{get:function(){return this._tile}},data:{get:function(){return this._data}}});Zc.prototype.load=async function(){let e=this;function t(){if(!e._isRoot){let o=e._create3DTileDefinition();e._tile=new Uu(e._layer._tileset,e._dataProvider.resource,o,e._parent._tile),e._tile._i3sNode=e}}if(!l(this._nodeIndex)){let o=await Wh.loadJson(this._resource);e._data=o,t();return}let n=await this._layer._getNodeInNodePages(this._nodeIndex);e._data=n;let i;e._isRoot?i="nodes/root/":l(n.mesh)&&(i=`../${n.mesh.geometry.resource}/`),l(i)&&(e._resource=e._parent.resource.getDerivedResource({url:i})),t()};function GTe(e,t){let n=new nA(e,t);return e._fields[t.name]=n,n.load()}Zc.prototype.loadFields=function(){let e=this._layer._data.attributeStorageInfo,t=[];if(l(e))for(let n=0;n<e.length;n++){let i=e[n],o=this._fields[i.name];l(o)?t.push(o.load()):t.push(GTe(this,i))}return Promise.all(t)};Zc.prototype.loadField=function(e){let t=this._fields[e];if(l(t))return t.load();let n=this._layer._data.attributeStorageInfo;if(l(n))for(let i=0;i<n.length;i++){let o=n[i];if(o.name===e)return GTe(this,o)}return Promise.resolve()};Zc.prototype.getFieldsForPickedPosition=function(e){let t=this.geometryData[0];if(!l(t.customAttributes.featureIndex))return{};let n=t.getClosestPointIndexOnTriangle(e.x,e.y,e.z);if(n.index===-1||n.index>t.customAttributes.featureIndex.length)return{};let i=t.customAttributes.featureIndex[n.index];return this.getFieldsForFeature(i)};Zc.prototype.getFieldsForFeature=function(e){let t={};for(let n in this.fields)if(this.fields.hasOwnProperty(n)){let i=this.fields[n];e>=0&&e<i.values.length&&(t[i.name]=i.values[e])}return t};Zc.prototype._loadChildren=function(){let e=this;if(l(this._childrenReadyPromise))return this._childrenReadyPromise;let t=[];if(l(e._data.children))for(let n=0;n<e._data.children.length;n++){let i=e._data.children[n],o=new Zc(e,y(i.href,i),!1);e._children.push(o),t.push(o.load())}return this._childrenReadyPromise=Promise.all(t).then(function(){for(let n=0;n<e._children.length;n++)e._tile.children.push(e._children[n]._tile)}),this._childrenReadyPromise};Zc.prototype._loadGeometryData=function(){let e=[];if(l(this._data.geometryData))for(let t=0;t<this._data.geometryData.length;t++){let n=new fL(this,this._data.geometryData[t].href);this._geometryData.push(n),e.push(n.load())}else if(l(this._data.mesh)){let t=this._layer._findBestGeometryBuffers(this._data.mesh.geometry.definition,["position","uv0"]),n=`./geometries/${t.bufferIndex}/`,i=new fL(this,n);i._geometryDefinitions=t.definition,i._geometryBufferInfo=t.geometryBufferInfo,this._geometryData.push(i),e.push(i.load())}return Promise.all(e)};Zc.prototype._loadFeatureData=function(){let e=[];if(l(this._data.featureData))for(let t=0;t<this._data.featureData.length;t++){let n=new tA(this,this._data.featureData[t].href);this._featureData.push(n),e.push(n.load())}return Promise.all(e)};Zc.prototype._clearGeometryData=function(){this._geometryData=[]};Zc.prototype._create3DTileDefinition=function(){let e=this._data.obb,t=this._data.mbs;if(!l(e)&&!l(t)){console.error("Failed to load I3S node. Bounding volume is required.");return}let n;if(l(e)?n=he.fromDegrees(e.center[0],e.center[1],e.center[2]):n=he.fromDegrees(t[0],t[1],t[2]),l(this._dataProvider._geoidDataList)&&l(n))for(let C=0;C<this._dataProvider._geoidDataList.length;C++){let V=this._dataProvider._geoidDataList[C],L=V.projection.project(n);if(L.x>V.nativeExtent.west&&L.x<V.nativeExtent.east&&L.y>V.nativeExtent.south&&L.y<V.nativeExtent.north){n.height+=Zxt(L.x,L.y,V);break}}let i={},o,r=0;l(e)?(i={box:[0,0,0,e.halfSize[0],0,0,0,e.halfSize[1],0,0,0,e.halfSize[2]]},r=Math.max(Math.max(this._data.obb.halfSize[0],this._data.obb.halfSize[1]),this._data.obb.halfSize[2]),o=ie.WGS84.cartographicToCartesian(n)):(i={sphere:[0,0,0,t[3]]},o=ie.WGS84.cartographicToCartesian(n),r=this._data.mbs[3]),r*=2;let s=1/0;if(l(this._data.lodThreshold))if(this._layer._data.nodePages.lodSelectionMetricType==="maxScreenThresholdSQ"){let C=Math.sqrt(this._data.lodThreshold/(Math.PI*.25));s=r/C}else if(this._layer._data.nodePages.lodSelectionMetricType==="maxScreenThreshold"){let C=this._data.lodThreshold;s=r/C}else console.error("Invalid lodSelectionMetricType in Layer");else if(l(this._data.lodSelection))for(let C=0;C<this._data.lodSelection.length;C++)this._data.lodSelection[C].metricType==="maxScreenThreshold"&&(s=r/this._data.lodSelection[C].maxError);s===1/0&&(s=1e5);let a=s*16,c=new za(0,0,0),d=Gt.headingPitchRollQuaternion(o,c);l(this._data.obb)&&(d=new we(this._data.obb.quaternion[0],this._data.obb.quaternion[1],this._data.obb.quaternion[2],this._data.obb.quaternion[3]));let u=$.fromQuaternion(d),m=$.inverse(u,new $),p=new M(u[0],u[1],u[2],0,u[3],u[4],u[5],0,u[6],u[7],u[8],0,o.x,o.y,o.z,1),g=M.inverse(p,new M),f=M.clone(p);l(this._parent._globalTransform)&&M.multiply(p,this._parent._inverseGlobalTransform,f),this._globalTransform=p,this._inverseGlobalTransform=g,this._inverseRotationMatrix=m;let x=[];for(let C=0;C<this._children.length;C++)x.push(this._children[C]._create3DTileDefinition());return{children:x,refine:"REPLACE",boundingVolume:i,transform:[f[0],f[4],f[8],f[12],f[1],f[5],f[9],f[13],f[2],f[6],f[10],f[14],f[3],f[7],f[11],f[15]],content:{uri:l(this._resource)?this._resource.url:void 0},geometricError:a}};Zc.prototype._loadSymbology=async function(){!l(this._symbologyData)&&l(this._layer._symbology)&&(this._symbologyData=await this._layer._symbology._getSymbology(this))};Zc.prototype._createContentURL=async function(){let e={scene:0,scenes:[{nodes:[0]}],nodes:[{name:"singleNode"}],meshes:[],buffers:[],bufferViews:[],accessors:[],materials:[],textures:[],images:[],samplers:[],asset:{version:"2.0"}},t=[this._loadGeometryData()];if(this._dataProvider.legacyVersion16&&t.push(this._loadFeatureData()),await Promise.all(t),l(this._geometryData)&&this._geometryData.length>0){this._dataProvider._applySymbology&&await this._loadSymbology();let o=this._geometryData[0].resource.url,r=this._layer._data.store.defaultGeometrySchema,s=this._geometryData[0],a=await eA.decode(o,r,s,this._featureData[0],this._symbologyData);if(!l(a))return;e=s._generateGltf(a.meshData.nodesInScene,a.meshData.nodes,a.meshData.meshes,a.meshData.buffers,a.meshData.bufferViews,a.meshData.accessors,a.meshData.rootExtensions,a.meshData.extensionsUsed),this._geometryData[0]._customAttributes=a.meshData._customAttributes}let n=this._dataProvider._binarizeGltf(e),i=new Blob([n],{type:"application/binary"});return URL.createObjectURL(i)};async function Vxt(e){let t=e._layer._filters,n=[];for(let i=0;i<t.length;i++){let o=e.loadField(t[i].name);n.push(o)}return await Promise.all(n),t}function Lxt(e,t,n){if(!l(n.values)||n.values.length===0)return!1;let i=l(t)?t.values:[],o;e<i.length&&(o=i[e]);let r=!1;for(let s=0;s<n.values.length;s++)if(n.values[s]===o){r=!0;break}return r}async function ETe(e,t){let n=e._tile.content.batchTable;if(l(n)&&n.featuresLength>0){n.setAllShow(!0);let i=await Vxt(e);if(i.length>0)for(let o=0;o<n.featuresLength;o++)for(let r=0;r<i.length;r++){let s=i[r];if(!Lxt(o,e._fields[s.name],s)){n.setShow(o,!1);break}}}t.show=!0}Zc.prototype._filterFeatures=function(){let e=[];for(let n=0;n<this._children.length;n++){let i=this._children[n]._filterFeatures();e.push(i)}let t=this._tile?.content?._model;if(l(this._geometryData)&&this._geometryData.length>0&&l(t)&&t.ready){t.show=!1;let n=ETe(this,t);e.push(n)}return Promise.all(e)};Uu.prototype._hookedRequestContent=Uu.prototype.requestContent;Uu.prototype.requestContent=function(){if(!this.tileset._isI3STileSet)return this._hookedRequestContent();if(!this._isLoading){this._isLoading=!0;let e=this;return this._i3sNode._createContentURL().then(t=>{if(!l(t)){e._isLoading=!1;return}return e._contentResource=new Ee({url:t}),e._hookedRequestContent()}).then(t=>{let n=t?._model;return l(e._i3sNode._geometryData)&&e._i3sNode._geometryData.length>0&&l(n)&&(n.show=!1,n.readyEvent.addEventListener(()=>{ETe(e._i3sNode,n)})),e._isLoading=!1,t})}};function Rxt(e,t,n,i,o,r){let s=n*(1-e)+i*e,a=o*(1-e)+r*e;return s*(1-t)+a*t}function W3(e,t,n,i){let o=e+t*n;return i[o]}function Zxt(e,t,n){let i=n.nativeExtent,o=(e-i.west)/(i.east-i.west)*(n.width-1),r=(t-i.south)/(i.north-i.south)*(n.height-1),s=Math.floor(o),a=Math.floor(r);o-=s,r-=a;let c=s<n.width?s+1:s,d=a<n.height?a+1:a;a=n.height-1-a,d=n.height-1-d;let u=W3(s,a,n.width,n.buffer),m=W3(c,a,n.width,n.buffer),p=W3(s,d,n.width,n.buffer),g=W3(c,d,n.width,n.buffer),f=Rxt(o,r,u,m,p,g);return f=f*n.scale+n.offset,f}Object.defineProperties(Uu.prototype,{i3sNode:{get:function(){return this._i3sNode}}});var pL=Zc;var tji=T(S(),1);function P3(e){this._layer=e,this._defaultSymbology=void 0,this._valueFields=[],this._uniqueValueHash=void 0,this._classBreaksHash=void 0,this._parseLayerSymbology()}Object.defineProperties(P3.prototype,{defaultSymbology:{get:function(){return this._defaultSymbology}}});function b7(e,t){let n=[];for(let i=0;i<e.length;i++){let o=Y.byteToFloat(e[i]);i<3?n.push(Hx(o)):n.push(o)}return n.length===3&&(l(t)?n.push(1-t/100):n.push(1)),n}function bL(e,t){let n={edges:void 0,material:void 0};if(l(e)&&l(e.symbolLayers))for(let i=0;i<e.symbolLayers.length;i++){let o=e.symbolLayers[i];if(o.type==="Fill"){let r=o.edges,s=o.outline;if(l(r)?(n.edges={},l(r.color)&&(n.edges.color=b7(r.color,r.transparency))):l(s)&&(n.edges={},l(s.color)&&(n.edges.color=b7(s.color,s.transparency))),!t){let a=o.material;l(a)&&(n.material={colorMixMode:a.colorMixMode},l(a.color)&&(n.material.color=b7(a.color,a.transparency)))}break}}return n}function Gxt(e,t){if(l(e.uniqueValueGroups)){let n={};for(let i=0;i<e.uniqueValueGroups.length;i++){let o=e.uniqueValueGroups[i].classes;if(l(o))for(let r=0;r<o.length;r++){let s=bL(o[r].symbol,t),a=o[r].values;for(let c=0;c<a.length;c++){let d=a[c],u=n;for(let m=0;m<d.length;m++){let p=d[m];m===d.length-1?u[p]=s:(l(u[p])||(u[p]={}),u=u[p])}}}}return n}if(l(e.uniqueValueInfos)){let n={};for(let i=0;i<e.uniqueValueInfos.length;i++){let o=e.uniqueValueInfos[i];n[o.value]=bL(o.symbol,t)}return n}}function Ext(e,t){if(l(e.classBreakInfos)){let n=[...e.classBreakInfos];n.sort(function(o,r){let s=y(o.classMaxValue,o.classMinValue),a=y(r.classMaxValue,r.classMinValue);return s-a});let i={ranges:[],symbols:[]};l(e.minValue)&&(i.ranges.push(e.minValue),i.symbols.push(void 0));for(let o=0;o<n.length;o++){let r=n[o];l(r.classMinValue)&&(i.ranges.length===0||r.classMinValue>i.ranges[i.ranges.length-1])&&(i.ranges.push(r.classMinValue),i.symbols.push(void 0)),l(r.classMaxValue)&&(i.ranges.length===0||r.classMaxValue>i.ranges[i.ranges.length-1])&&(i.ranges.push(r.classMaxValue),i.symbols.push(bL(r.symbol,t)))}return i.symbols.push(void 0),i}}P3.prototype._parseLayerSymbology=function(){let e=this._layer.data.drawingInfo;if(l(e)&&l(e.renderer)){let t=this._layer.data.cachedDrawingInfo,n=l(t)&&t.color===!0,i=e.renderer;i.type==="simple"?this._defaultSymbology=bL(i.symbol,n):i.type==="uniqueValue"?(this._defaultSymbology=bL(i.defaultSymbol,n),this._valueFields.push(i.field1),l(i.field2)&&this._valueFields.push(i.field2),l(i.field3)&&this._valueFields.push(i.field3),this._uniqueValueHash=Gxt(i,n)):i.type==="classBreaks"&&(this._defaultSymbology=bL(i.defaultSymbol,n),this._valueFields.push(i.field),this._classBreaksHash=Ext(i,n))}};function XTe(e,t,n,i){let o=t[n];if(i<o.length){let r=o[i],s=e[r];return l(s)&&++n<t.length?XTe(s,t,n,i):s}}function Xxt(e,t){let n=0,i=e.length;if(n<i)do{let o=n+i>>>1;e[o]<t?n=o+1:i=o}while(n<i);return n}function Ixt(e,t,n){let i=t[n],o=Xxt(e.ranges,i);return e.symbols[o]}P3.prototype._getSymbology=async function(e){let t={default:this._defaultSymbology};if(this._valueFields.length>0){let n=[];for(let r=0;r<this._valueFields.length;r++)n.push(e.loadField(this._valueFields[r]));await Promise.all(n);let i=[];for(let r=0;r<this._valueFields.length;r++)i.push(e.fields[this._valueFields[r]].values);let o;if(l(this._uniqueValueHash)?o=r=>XTe(this._uniqueValueHash,i,0,r):l(this._classBreaksHash)&&(o=r=>Ixt(this._classBreaksHash,i[0],r)),l(o)){let r=i[0];for(let s=0;s<r.length;s++){let a=o(s);l(a)&&(t[s]=a)}}}return t};var oA=P3;function ed(e,t,n){this._dataProvider=e,this._parent=n,!l(t.href)&&l(t.id)&&(t.href=`layers/${t.id}`);let i=this._parent.resource.getUrlComponent(),o="";i.match(/layers\/\d/)?o=`${i}`.replace(/\/+$/,""):o=`${i}`.replace(/\/?$/,"/").concat(`${t.href}`),this._version=t.store.version;let r=this._version.split(".");this._majorVersion=parseInt(r[0]),this._minorVersion=r.length>1?parseInt(r[1]):0,this._resource=new Ee({url:o}),this._resource.setQueryParameters(this._dataProvider.resource.queryParameters),this._resource.appendForwardSlash(),this._data=t,this._rootNode=void 0,this._nodePages={},this._nodePageFetches={},this._extent=void 0,this._tileset=void 0,this._geometryDefinitions=void 0,this._filters=[],this._symbology=void 0,this._computeGeometryDefinitions(!0),this._computeExtent()}Object.defineProperties(ed.prototype,{resource:{get:function(){return this._resource}},rootNode:{get:function(){return this._rootNode}},tileset:{get:function(){return this._tileset}},data:{get:function(){return this._data}},version:{get:function(){return this._version}},majorVersion:{get:function(){return this._majorVersion}},minorVersion:{get:function(){return this._minorVersion}},legacyVersion16:{get:function(){if(l(this.version))return this.majorVersion<1||this.majorVersion===1&&this.minorVersion<=6}}});ed.prototype.load=async function(e){if(this._data.spatialReference.wkid!==4326)throw new ue(`Unsupported spatial reference: ${this._data.spatialReference.wkid}`);if(this._dataProvider.applySymbology&&(this._symbology=new oA(this)),await this._dataProvider.loadGeoidData(),await this._loadRootNode(e),await this._create3DTileset(e),this._rootNode._tile=this._tileset._root,this._tileset._root._i3sNode=this._rootNode,this.legacyVersion16)return this._rootNode._loadChildren()};ed.prototype._computeGeometryDefinitions=function(e){if(this._geometryDefinitions=[],l(this._data.geometryDefinitions))for(let t=0;t<this._data.geometryDefinitions.length;t++){let n=[],i=this._data.geometryDefinitions[t].geometryBuffers;for(let o=0;o<i.length;o++){let r=i[o],s=[],a=!1;if(l(r.compressedAttributes)&&e){a=!0;let c=r.compressedAttributes.attributes;for(let d=0;d<c.length;d++)s.push(c[d])}else for(let c in r)c!=="offset"&&s.push(c);n.push({compressed:a,attributes:s,index:i.indexOf(r)})}n.sort(function(o,r){return o.compressed&&!r.compressed?-1:!o.compressed&&r.compressed?1:o.attributes.length-r.attributes.length}),this._geometryDefinitions.push(n)}};ed.prototype._findBestGeometryBuffers=function(e,t){let n=this._geometryDefinitions[e];if(l(n))for(let i=0;i<n.length;++i){let o=n[i],r=!1,s=o.attributes;for(let a=0;a<t.length;a++)if(!s.includes(t[a])){r=!0;break}if(!r)return{bufferIndex:o.index,definition:n,geometryBufferInfo:o}}return 0};ed.prototype._loadRootNode=function(e){if(l(this._data.nodePages)){let t=0;l(this._data.nodePages.rootIndex)&&(t=this._data.nodePages.rootIndex),this._rootNode=new pL(this,t,!0)}else this._rootNode=new pL(this,this._data.store.rootNode,!0);return this._rootNode.load(e)};ed.prototype._getNodeInNodePages=function(e){let t=Math.floor(e/this._data.nodePages.nodesPerPage),n=e%this._data.nodePages.nodesPerPage;return this._loadNodePage(t).then(function(i){return i.nodes[n]})};ed._fetchJson=function(e){return e.fetchJson()};ed.prototype._loadNodePage=function(e){let t=this;if(!l(this._nodePageFetches[e])){let n=this.resource.getDerivedResource({url:`nodepages/${e}/`}),i=ed._fetchJson(n).then(function(o){return l(o.error)&&o.error.code!==200?Promise.reject(o.error):(t._nodePages[e]=o.nodes,o)});this._nodePageFetches[e]=i}return this._nodePageFetches[e]};ed.prototype._computeExtent=function(){l(this._data.fullExtent)?this._extent=ce.fromDegrees(this._data.fullExtent.xmin,this._data.fullExtent.ymin,this._data.fullExtent.xmax,this._data.fullExtent.ymax):l(this._data.store.extent)&&(this._extent=ce.fromDegrees(this._data.store.extent[0],this._data.store.extent[1],this._data.store.extent[2],this._data.store.extent[3]))};ed.prototype._create3DTileset=async function(e){let t={asset:{version:"1.0"},geometricError:Number.MAX_VALUE,root:this._rootNode._create3DTileDefinition()},n=new Blob([JSON.stringify(t)],{type:"application/json"}),i=URL.createObjectURL(n),o=this._symbology?.defaultSymbology?.edges?.color;l(o)&&!l(e?.outlineColor)&&(e=l(e)?Oe(e):{},e.outlineColor=Y.fromCartesian4(se.fromArray(o))),this._tileset=await sa.fromUrl(i,e),this._tileset.show=this._parent.show,this._tileset._isI3STileSet=!0,this._tileset.tileUnload.addEventListener(function(r){r._i3sNode._clearGeometryData(),URL.revokeObjectURL(r._contentResource._url),r._contentResource=r._i3sNode.resource}),this._tileset.tileVisible.addEventListener(function(r){l(r._i3sNode)&&r._i3sNode._loadChildren()})};ed.prototype._updateVisibility=function(){l(this._tileset)&&(this._tileset.show=this._parent.show)};ed.prototype.filterByAttributes=function(e){this._filters=l(e)?Oe(e,!0):[];let t=this._rootNode;return l(t)?t._filterFeatures():Promise.resolve()};var cS=ed;var yji=T(S(),1);function v3(e,t){this._dataProvider=e,this._resource=new Ee({url:t}),this._resource.setQueryParameters(e.resource.queryParameters),this._resource.appendForwardSlash()}Object.defineProperties(v3.prototype,{resource:{get:function(){return this._resource}},data:{get:function(){return this._data}},names:{get:function(){let e=[],t=this._data.summary;if(l(t))for(let n=0;n<t.length;++n)e.push(t[n].fieldName);return e}}});v3.prototype.load=async function(){return this._data=await Wh.loadJson(this._resource),this._data};v3.prototype._getValues=function(e){let t=this._data.summary;if(l(t))for(let n=0;n<t.length;++n){let i=t[n];if(i.fieldName===e)return l(i.mostFrequentValues)?[...i.mostFrequentValues]:[]}};var rA=v3;var Lji=T(S(),1);function sA(e,t,n){this._dataProvider=e,this._parent=t,this._data=n,this._name=n.name,this._modelName=n.modelName,this._visibility=y(n.visibility,!0),this._resource=void 0,this._sublayers=[],this._i3sLayers=[]}Object.defineProperties(sA.prototype,{resource:{get:function(){return this._resource}},data:{get:function(){return this._data}},name:{get:function(){return this._name}},modelName:{get:function(){return this._modelName}},sublayers:{get:function(){return this._sublayers}},visibility:{get:function(){return this._visibility},set:function(e){if(this._visibility!==e){this._visibility=e;for(let t=0;t<this._i3sLayers.length;t++)this._i3sLayers[t]._updateVisibility()}}},show:{get:function(){return this._visibility&&this._parent.show}}});sA._fromData=async function(e,t,n,i){let o=new sA(e,i,n);if(o._data.layerType==="group"){let r=o._data.sublayers;if(l(r)){let s=[];for(let c=0;c<r.length;c++){let d=sA._fromData(e,t,r[c],o);s.push(d)}let a=await Promise.all(s);for(let c=0;c<a.length;c++){let d=a[c];o._sublayers.push(d),o._i3sLayers.push(...d._i3sLayers)}}}else if(o._data.layerType==="3DObject"){let r=t.concat(`/sublayers/${o._data.id}`),s=new Ee({url:r});s.setQueryParameters(e.resource.queryParameters),s.appendForwardSlash(),o._resource=s;let a=await Wh.loadJson(o._resource),c=new cS(e,a,o);o._i3sLayers.push(c)}else console.log(`${o._data.layerType} layer ${o._data.name} is skipped as not supported.`);return o};var aA=sA;var PTe=T(ITe(),1);function ds(e){e=y(e,y.EMPTY_OBJECT),this._name=e.name,this._show=y(e.show,!0),this._geoidTiledTerrainProvider=e.geoidTiledTerrainProvider,this._showFeatures=y(e.showFeatures,!1),this._adjustMaterialAlphaMode=y(e.adjustMaterialAlphaMode,!1),this._applySymbology=y(e.applySymbology,!1),this._calculateNormals=y(e.calculateNormals,!1),this._cesium3dTilesetOptions=y(e.cesium3dTilesetOptions,y.EMPTY_OBJECT),this._layers=[],this._sublayers=[],this._data=void 0,this._extent=void 0,this._geoidDataPromise=void 0,this._geoidDataList=void 0,this._decoderTaskProcessor=void 0,this._taskProcessorReadyPromise=void 0,this._attributeStatistics=[],this._layersExtent=[]}Object.defineProperties(ds.prototype,{name:{get:function(){return this._name}},show:{get:function(){return this._show},set:function(e){if(this._show!==e){this._show=e;for(let t=0;t<this._layers.length;t++)this._layers[t]._updateVisibility()}}},geoidTiledTerrainProvider:{get:function(){return this._geoidTiledTerrainProvider}},layers:{get:function(){return this._layers}},sublayers:{get:function(){return this._sublayers}},data:{get:function(){return this._data}},extent:{get:function(){return this._extent}},resource:{get:function(){return this._resource}},showFeatures:{get:function(){return this._showFeatures}},adjustMaterialAlphaMode:{get:function(){return this._adjustMaterialAlphaMode}},applySymbology:{get:function(){return this._applySymbology}},calculateNormals:{get:function(){return this._calculateNormals}}});ds.prototype.destroy=function(){for(let e=0;e<this._layers.length;e++)l(this._layers[e]._tileset)&&this._layers[e]._tileset.destroy();return me(this)};ds.prototype.isDestroyed=function(){return!1};ds.prototype.update=function(e){for(let t=0;t<this._layers.length;t++)l(this._layers[t]._tileset)&&this._layers[t]._tileset.update(e)};ds.prototype.prePassesUpdate=function(e){for(let t=0;t<this._layers.length;t++)l(this._layers[t]._tileset)&&this._layers[t]._tileset.prePassesUpdate(e)};ds.prototype.postPassesUpdate=function(e){for(let t=0;t<this._layers.length;t++)l(this._layers[t]._tileset)&&this._layers[t]._tileset.postPassesUpdate(e)};ds.prototype.updateForPass=function(e,t){for(let n=0;n<this._layers.length;n++)l(this._layers[n]._tileset)&&this._layers[n]._tileset.updateForPass(e,t)};function Wxt(e,t){let n=e.resource.getUrlComponent(),i="";return n.match(/layers\/\d/)?i=`${n}`.replace(/\/+$/,""):i=`${n}`.replace(/\/?$/,"/").concat(`layers/${t}`),i}async function WTe(e,t,n){if(t.layerType==="Building"){l(n.showFeatures)||(e._showFeatures=!0),l(n.adjustMaterialAlphaMode)||(e._adjustMaterialAlphaMode=!0),l(n.applySymbology)||(e._applySymbology=!0),l(n.calculateNormals)||(e._calculateNormals=!0);let i=Wxt(e,t.id);if(l(t.sublayers)){let o=[];for(let s=0;s<t.sublayers.length;s++){let a=aA._fromData(e,i,t.sublayers[s],e);o.push(a)}let r=await Promise.all(o);for(let s=0;s<r.length;s++){let a=r[s];e._sublayers.push(a),e._layers.push(...a._i3sLayers)}}if(l(t.statisticsHRef)){let o=i.concat(`/${t.statisticsHRef}`),r=new rA(e,o);await r.load(),e._attributeStatistics.push(r)}if(l(t.fullExtent)){let o=ce.fromDegrees(t.fullExtent.xmin,t.fullExtent.ymin,t.fullExtent.xmax,t.fullExtent.ymax);e._layersExtent.push(o)}}else if(t.layerType==="3DObject"||t.layerType==="IntegratedMesh"){!l(n.calculateNormals)&&!l(t.textureSetDefinitions)&&(e._calculateNormals=!0);let i=new cS(e,t,e);e._layers.push(i),l(i._extent)&&e._layersExtent.push(i._extent)}else console.log(`${t.layerType} layer ${t.name} is skipped as not supported.`)}ds.fromUrl=async function(e,t){t=y(t,y.EMPTY_OBJECT);let n=Ee.createIfNeeded(e);n.setQueryParameters({f:"pjson"},!0);let i=await ds.loadJson(n),o=new ds(t);if(o._resource=n,o._data=i,l(i.layers)){let s=[];for(let a=0;a<i.layers.length;a++){let c=WTe(o,i.layers[a],t);s.push(c)}await Promise.all(s)}else await WTe(o,i,t);o._computeExtent();let r=[];for(let s=0;s<o._layers.length;s++)r.push(o._layers[s].load(t.cesium3dTilesetOptions));return await Promise.all(r),o};ds._fetchJson=function(e){return e.fetchJson()};ds.loadJson=async function(e){let t=await ds._fetchJson(e);if(l(t.error)){if(console.error("Failed to fetch I3S ",e.url),l(t.error.message)&&console.error(t.error.message),l(t.error.details))for(let n=0;n<t.error.details.length;n++)console.log(t.error.details[n]);throw new ue(t.error)}return t};ds.prototype._loadBinary=async function(e){let t=await e.fetchArrayBuffer();if(t.byteLength>0&&new Uint8Array(t)[0]===123&&new TextDecoder().decode(t).includes("404"))throw new ue(`Failed to load binary: ${e.url}`);return t};ds.prototype._binarizeGltf=function(e){let n=new TextEncoder().encode(JSON.stringify(e)),i=new Uint8Array(n.byteLength+20),o={magic:new Uint8Array(i.buffer,0,4),version:new Uint32Array(i.buffer,4,1),length:new Uint32Array(i.buffer,8,1),chunkLength:new Uint32Array(i.buffer,12,1),chunkType:new Uint32Array(i.buffer,16,1),chunkData:new Uint8Array(i.buffer,20,n.byteLength)};return o.magic[0]=103,o.magic[1]=108,o.magic[2]=84,o.magic[3]=70,o.version[0]=2,o.length[0]=i.byteLength,o.chunkLength[0]=n.byteLength,o.chunkType[0]=1313821514,o.chunkData.set(n),i};var Pxt=new D;function vxt(e,t){let n=e.tilingScheme,i=[],o={},r=e._lodCount,s=he.fromRadians(t.west,t.north),a=he.fromRadians(t.east,t.south),c=n.positionToTileXY(s,r),d=n.positionToTileXY(a,r);for(let m=c.x;m<=d.x;m++)for(let p=c.y;p<=d.y;p++){let g=D.fromElements(m,p,Pxt),f=g.toString();if(!o.hasOwnProperty(f)){let x={x:g.x,y:g.y,level:r,tilingScheme:n,terrainProvider:e,positions:[]};o[f]=x,i.push(x)}}let u=[];for(let m=0;m<i.length;++m){let p=i[m],g=p.terrainProvider.requestTileGeometry(p.x,p.y,p.level);u.push(g)}return Promise.all(u).then(function(m){let p=[];for(let g=0;g<m.length;g++){let f={tilingScheme:n,x:i[g].x,y:i[g].y,level:i[g].level},x=m[g],_="Geographic";n._projection instanceof Ci&&(_="WebMercator");let C={projectionType:_,projection:n._projection,nativeExtent:n.tileXYToNativeRectangle(f.x,f.y,f.level),height:x._height,width:x._width,scale:x._structure.heightScale,offset:x._structure.heightOffset};if(x._encoding===iu.LERC){let V=PTe.default.decode(x._buffer);C.buffer=V.pixels[0]}else C.buffer=x._buffer;p.push(C)}return p})}async function wxt(e){let t=e._geoidTiledTerrainProvider;if(l(t))try{let n=await vxt(t,e._extent);e._geoidDataList=n}catch{console.log("Error retrieving Geoid Terrain tiles - no geoid conversion will be performed.")}}ds.prototype.loadGeoidData=async function(){return l(this._geoidDataPromise)?this._geoidDataPromise:(this._geoidDataPromise=wxt(this),this._geoidDataPromise)};ds.prototype._computeExtent=function(){let e;for(let t=0;t<this._layersExtent.length;t++){let n=this._layersExtent[t];l(e)?ce.union(e,n,e):e=ce.clone(n)}this._extent=e};ds.prototype.getAttributeNames=function(){let e=[];for(let t=0;t<this._attributeStatistics.length;++t)e.push(...this._attributeStatistics[t].names);return e};ds.prototype.getAttributeValues=function(e){for(let t=0;t<this._attributeStatistics.length;++t){let n=this._attributeStatistics[t]._getValues(e);if(l(n))return n}return[]};ds.prototype.filterByAttributes=function(e){let t=[];for(let n=0;n<this._layers.length;n++){let i=this._layers[n].filterByAttributes(e);t.push(i)}return Promise.all(t)};var Wh=ds;var Oji=T(S(),1);function vTe(){}Object.defineProperties(vTe.prototype,{color:{get:fe.throwInstantiationError},intensity:{get:fe.throwInstantiationError}});var g7=vTe;var qji=T(S(),1);var Fxt=/\/$/,wTe=new Ct('© <a href="https://www.mapbox.com/about/maps/">Mapbox</a> © <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> <strong><a href="https://www.mapbox.com/map-feedback/">Improve this map</a></strong>');function gL(e){e=y(e,y.EMPTY_OBJECT);let t=e.styleId,n=e.accessToken;this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=void 0,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0;let i=Ee.createIfNeeded(y(e.url,"https://api.mapbox.com/styles/v1/"));this._styleId=t,this._accessToken=n;let o=y(e.tilesize,512);this._tilesize=o;let r=y(e.username,"mapbox");this._username=r;let s=l(e.scaleFactor)?"@2x":"",a=i.getUrlComponent();Fxt.test(a)||(a+="/"),a+=`${this._username}/${t}/tiles/${this._tilesize}/{z}/{x}/{y}${s}`,i.url=a,i.setQueryParameters({access_token:n});let c;l(e.credit)?(c=e.credit,typeof c=="string"&&(c=new Ct(c))):c=wTe,this._resource=i,this._imageryProvider=new wa({url:i,credit:c,ellipsoid:e.ellipsoid,minimumLevel:e.minimumLevel,maximumLevel:e.maximumLevel,rectangle:e.rectangle})}Object.defineProperties(gL.prototype,{url:{get:function(){return this._imageryProvider.url}},rectangle:{get:function(){return this._imageryProvider.rectangle}},tileWidth:{get:function(){return this._imageryProvider.tileWidth}},tileHeight:{get:function(){return this._imageryProvider.tileHeight}},maximumLevel:{get:function(){return this._imageryProvider.maximumLevel}},minimumLevel:{get:function(){return this._imageryProvider.minimumLevel}},tilingScheme:{get:function(){return this._imageryProvider.tilingScheme}},tileDiscardPolicy:{get:function(){return this._imageryProvider.tileDiscardPolicy}},errorEvent:{get:function(){return this._imageryProvider.errorEvent}},credit:{get:function(){return this._imageryProvider.credit}},proxy:{get:function(){return this._imageryProvider.proxy}},hasAlphaChannel:{get:function(){return this._imageryProvider.hasAlphaChannel}}});gL.prototype.getTileCredits=function(e,t,n){};gL.prototype.requestImage=function(e,t,n,i){return this._imageryProvider.requestImage(e,t,n,i)};gL.prototype.pickFeatures=function(e,t,n,i,o){return this._imageryProvider.pickFeatures(e,t,n,i,o)};gL._defaultCredit=wTe;var y7=gL;var e8i=T(S(),1);function x7(e){}x7.prototype.isReady=function(){return!0};x7.prototype.shouldDiscardImage=function(e){return!1};var _7=x7;var l8i=T(S(),1);var Axt=new Ct("MapQuest, Open Street Map and contributors, CC-BY-SA");function F3(e){e=y(e,y.EMPTY_OBJECT);let t=Ee.createIfNeeded(y(e.url,"https://tile.openstreetmap.org/"));t.appendForwardSlash(),t.url+=`{z}/{x}/{y}${e.retinaTiles?"@2x":""}.${y(e.fileExtension,"png")}`;let n=new Br({ellipsoid:e.ellipsoid}),i=256,o=256,r=y(e.minimumLevel,0),s=e.maximumLevel,a=y(e.rectangle,n.rectangle),c=n.positionToTileXY(ce.southwest(a),r),d=n.positionToTileXY(ce.northeast(a),r),u=(Math.abs(d.x-c.x)+1)*(Math.abs(d.y-c.y)+1),m=y(e.credit,Axt);typeof m=="string"&&(m=new Ct(m)),wa.call(this,{url:t,credit:m,tilingScheme:n,tileWidth:i,tileHeight:o,minimumLevel:r,maximumLevel:s,rectangle:a})}l(Object.create)&&(F3.prototype=Object.create(wa.prototype),F3.prototype.constructor=F3);var mb=F3;var b8i=T(S(),1);var Mxt=new D(1,1);function T7(e){e=y(e,y.EMPTY_OBJECT),this.mass=y(e.mass,1),this.position=h.clone(y(e.position,h.ZERO)),this.velocity=h.clone(y(e.velocity,h.ZERO)),this.life=y(e.life,Number.MAX_VALUE),this.image=e.image,this.startColor=Y.clone(y(e.startColor,Y.WHITE)),this.endColor=Y.clone(y(e.endColor,Y.WHITE)),this.startScale=y(e.startScale,1),this.endScale=y(e.endScale,1),this.imageSize=D.clone(y(e.imageSize,Mxt)),this._age=0,this._normalizedAge=0,this._billboard=void 0}Object.defineProperties(T7.prototype,{age:{get:function(){return this._age}},normalizedAge:{get:function(){return this._normalizedAge}}});var FTe=new h;T7.prototype.update=function(e,t){return h.multiplyByScalar(this.velocity,e,FTe),h.add(this.position,FTe,this.position),l(t)&&t(this,e),this._age+=e,this.life===Number.MAX_VALUE?this._normalizedAge=0:this._normalizedAge=this._age/this.life,this._age<=this.life};var yL=T7;var x8i=T(S(),1);function ATe(e){e=y(e,y.EMPTY_OBJECT),this.time=y(e.time,0),this.minimum=y(e.minimum,0),this.maximum=y(e.maximum,50),this._complete=!1}Object.defineProperties(ATe.prototype,{complete:{get:function(){return this._complete}}});var S7=ATe;var S8i=T(S(),1);function MTe(e){}MTe.prototype.emit=function(e){fe.throwInstantiationError()};var C7=MTe;var A8i=T(S(),1);var NTe=new D(1,1);function cA(e){e=y(e,y.EMPTY_OBJECT),this.show=y(e.show,!0),this.updateCallback=e.updateCallback,this.loop=y(e.loop,!0),this.image=y(e.image,void 0);let t=e.emitter;l(t)||(t=new K9(.5)),this._emitter=t,this._bursts=e.bursts,this._modelMatrix=M.clone(y(e.modelMatrix,M.IDENTITY)),this._emitterModelMatrix=M.clone(y(e.emitterModelMatrix,M.IDENTITY)),this._matrixDirty=!0,this._combinedMatrix=new M,this._startColor=Y.clone(y(e.color,y(e.startColor,Y.WHITE))),this._endColor=Y.clone(y(e.color,y(e.endColor,Y.WHITE))),this._startScale=y(e.scale,y(e.startScale,1)),this._endScale=y(e.scale,y(e.endScale,1)),this._emissionRate=y(e.emissionRate,5),this._minimumSpeed=y(e.speed,y(e.minimumSpeed,1)),this._maximumSpeed=y(e.speed,y(e.maximumSpeed,1)),this._minimumParticleLife=y(e.particleLife,y(e.minimumParticleLife,5)),this._maximumParticleLife=y(e.particleLife,y(e.maximumParticleLife,5)),this._minimumMass=y(e.mass,y(e.minimumMass,1)),this._maximumMass=y(e.mass,y(e.maximumMass,1)),this._minimumImageSize=D.clone(y(e.imageSize,y(e.minimumImageSize,NTe))),this._maximumImageSize=D.clone(y(e.imageSize,y(e.maximumImageSize,NTe))),this._sizeInMeters=y(e.sizeInMeters,!1),this._lifetime=y(e.lifetime,Number.MAX_VALUE),this._billboardCollection=void 0,this._particles=[],this._particlePool=[],this._previousTime=void 0,this._currentTime=0,this._carryOver=0,this._complete=new ge,this._isComplete=!1,this._updateParticlePool=!0,this._particleEstimate=0}Object.defineProperties(cA.prototype,{emitter:{get:function(){return this._emitter},set:function(e){this._emitter=e}},bursts:{get:function(){return this._bursts},set:function(e){this._bursts=e,this._updateParticlePool=!0}},modelMatrix:{get:function(){return this._modelMatrix},set:function(e){this._matrixDirty=this._matrixDirty||!M.equals(this._modelMatrix,e),M.clone(e,this._modelMatrix)}},emitterModelMatrix:{get:function(){return this._emitterModelMatrix},set:function(e){this._matrixDirty=this._matrixDirty||!M.equals(this._emitterModelMatrix,e),M.clone(e,this._emitterModelMatrix)}},startColor:{get:function(){return this._startColor},set:function(e){Y.clone(e,this._startColor)}},endColor:{get:function(){return this._endColor},set:function(e){Y.clone(e,this._endColor)}},startScale:{get:function(){return this._startScale},set:function(e){this._startScale=e}},endScale:{get:function(){return this._endScale},set:function(e){this._endScale=e}},emissionRate:{get:function(){return this._emissionRate},set:function(e){this._emissionRate=e,this._updateParticlePool=!0}},minimumSpeed:{get:function(){return this._minimumSpeed},set:function(e){this._minimumSpeed=e}},maximumSpeed:{get:function(){return this._maximumSpeed},set:function(e){this._maximumSpeed=e}},minimumParticleLife:{get:function(){return this._minimumParticleLife},set:function(e){this._minimumParticleLife=e}},maximumParticleLife:{get:function(){return this._maximumParticleLife},set:function(e){this._maximumParticleLife=e,this._updateParticlePool=!0}},minimumMass:{get:function(){return this._minimumMass},set:function(e){this._minimumMass=e}},maximumMass:{get:function(){return this._maximumMass},set:function(e){this._maximumMass=e}},minimumImageSize:{get:function(){return this._minimumImageSize},set:function(e){this._minimumImageSize=e}},maximumImageSize:{get:function(){return this._maximumImageSize},set:function(e){this._maximumImageSize=e}},sizeInMeters:{get:function(){return this._sizeInMeters},set:function(e){this._sizeInMeters=e}},lifetime:{get:function(){return this._lifetime},set:function(e){this._lifetime=e}},complete:{get:function(){return this._complete}},isComplete:{get:function(){return this._isComplete}}});function Nxt(e){let t=e._emissionRate,n=e._maximumParticleLife,i=0,o=e._bursts;if(l(o)){let m=o.length;for(let p=0;p<m;++p)i+=o[p].maximum}let r=e._billboardCollection,s=e.image,a=Math.ceil(t*n+i),c=e._particles,d=e._particlePool,u=Math.max(a-c.length-d.length,0);for(let m=0;m<u;++m){let p=new yL;p._billboard=r.add({image:s,show:!1}),d.push(p)}e._particleEstimate=a}function kxt(e){let t=e._particlePool.pop();return l(t)||(t=new yL),t}function Uxt(e,t){e._particlePool.push(t)}function Dxt(e){let t=e._particles,n=e._particlePool,i=e._billboardCollection,o=t.length,r=n.length,s=e._particleEstimate,a=r-Math.max(s-o-r,0);for(let c=a;c<r;++c){let d=n[c];i.remove(d._billboard)}n.length=a}function Bxt(e){l(e._billboard)&&(e._billboard.show=!1)}function kTe(e,t){let n=t._billboard;l(n)||(n=t._billboard=e._billboardCollection.add({image:t.image})),n.width=t.imageSize.x,n.height=t.imageSize.y,n.position=t.position,n.sizeInMeters=e.sizeInMeters,n.show=!0;let i=W.lerp(t.startColor.red,t.endColor.red,t.normalizedAge),o=W.lerp(t.startColor.green,t.endColor.green,t.normalizedAge),r=W.lerp(t.startColor.blue,t.endColor.blue,t.normalizedAge),s=W.lerp(t.startColor.alpha,t.endColor.alpha,t.normalizedAge);n.color=new Y(i,o,r,s),n.scale=W.lerp(t.startScale,t.endScale,t.normalizedAge)}function Yxt(e,t){t.startColor=Y.clone(e._startColor,t.startColor),t.endColor=Y.clone(e._endColor,t.endColor),t.startScale=e._startScale,t.endScale=e._endScale,t.image=e.image,t.life=W.randomBetween(e._minimumParticleLife,e._maximumParticleLife),t.mass=W.randomBetween(e._minimumMass,e._maximumMass),t.imageSize.x=W.randomBetween(e._minimumImageSize.x,e._maximumImageSize.x),t.imageSize.y=W.randomBetween(e._minimumImageSize.y,e._maximumImageSize.y),t._normalizedAge=0,t._age=0;let n=W.randomBetween(e._minimumSpeed,e._maximumSpeed);h.multiplyByScalar(t.velocity,n,t.velocity),e._particles.push(t)}function Oxt(e,t){if(e._isComplete)return 0;t=W.mod(t,e._lifetime);let n=t*e._emissionRate,i=Math.floor(n);if(e._carryOver+=n-i,e._carryOver>1&&(i++,e._carryOver-=1),l(e.bursts)){let o=e.bursts.length;for(let r=0;r<o;r++){let s=e.bursts[r],a=e._currentTime;l(s)&&!s._complete&&a>s.time&&(i+=W.randomBetween(s.minimum,s.maximum),s._complete=!0)}}return i}var A3=new h;cA.prototype.update=function(e){if(!this.show)return;l(this._billboardCollection)||(this._billboardCollection=new Rd),this._updateParticlePool&&(Nxt(this),this._updateParticlePool=!1);let t=0;this._previousTime&&(t=te.secondsDifference(e.time,this._previousTime)),t<0&&(t=0);let n=this._particles,i=this._emitter,o=this.updateCallback,r,s,a=n.length;for(r=0;r<a;++r)s=n[r],s.update(t,o)?kTe(this,s):(Bxt(s),Uxt(this,s),n[r]=n[a-1],--r,--a);n.length=a;let c=Oxt(this,t);if(c>0&&l(i)){this._matrixDirty&&(this._combinedMatrix=M.multiply(this.modelMatrix,this.emitterModelMatrix,this._combinedMatrix),this._matrixDirty=!1);let d=this._combinedMatrix;for(r=0;r<c;r++)s=kxt(this),this._emitter.emit(s),h.add(s.position,s.velocity,A3),M.multiplyByPoint(d,A3,A3),s.position=M.multiplyByPoint(d,s.position,s.position),h.subtract(A3,s.position,s.velocity),h.normalize(s.velocity,s.velocity),Yxt(this,s),kTe(this,s)}if(this._billboardCollection.update(e),this._previousTime=te.clone(e.time,this._previousTime),this._currentTime+=t,this._lifetime!==Number.MAX_VALUE&&this._currentTime>this._lifetime)if(this.loop){if(this._currentTime=W.mod(this._currentTime,this._lifetime),this.bursts){let d=this.bursts.length;for(r=0;r<d;r++)this.bursts[r]._complete=!1}}else this._isComplete=!0,this._complete.raiseEvent(this);e.frameNumber%120===0&&Dxt(this)};cA.prototype.isDestroyed=function(){return!1};cA.prototype.destroy=function(){return this._billboardCollection=this._billboardCollection&&this._billboardCollection.destroy(),me(this)};var V7=cA;var L7i=T(S(),1);var BTe=T(_M(),1);var N8i=T(S(),1);function Hxt(e,t,n){return` float clipDistance = clip(gl_FragCoord, ${e}, ${t}); vec4 clippingPlanesEdgeColor = vec4(1.0); clippingPlanesEdgeColor.rgb = ${n}.rgb; float clippingPlanesEdgeWidth = ${n}.a; if (clipDistance > 0.0 && clipDistance < clippingPlanesEdgeWidth) { out_FragColor = clippingPlanesEdgeColor; } `}var lA=Hxt;var D8i=T(S(),1);var zxt={modifyFragmentShader:function(t){return t=Ye.replaceMain(t,"czm_splitter_main"),t+=`uniform float czm_splitDirection; void main() { #ifndef SHADOW_MAP if (czm_splitDirection < 0.0 && gl_FragCoord.x > czm_splitPosition) discard; if (czm_splitDirection > 0.0 && gl_FragCoord.x < czm_splitPosition) discard; #endif czm_splitter_main(); } `,t},addUniforms:function(t,n){n.czm_splitDirection=function(){return t.splitDirection}}},xL=zxt;var lS={NEEDS_DECODE:0,DECODING:1,READY:2,FAILED:3};function dA(e){this._parsedContent=void 0,this._drawCommand=void 0,this._isTranslucent=!1,this._styleTranslucent=!1,this._constantColor=Y.clone(Y.DARKGRAY),this._highlightColor=Y.clone(Y.WHITE),this._pointSize=1,this._rtcCenter=void 0,this._quantizedVolumeScale=void 0,this._quantizedVolumeOffset=void 0,this._styleableShaderAttributes=void 0,this._isQuantized=!1,this._isOctEncoded16P=!1,this._isRGB565=!1,this._hasColors=!1,this._hasNormals=!1,this._hasBatchIds=!1,this._decodingState=lS.READY,this._dequantizeInShader=!0,this._isQuantizedDraco=!1,this._isOctEncodedDraco=!1,this._quantizedRange=0,this._octEncodedRange=0,this.backFaceCulling=!1,this._backFaceCulling=!1,this.normalShading=!0,this._normalShading=!0,this._opaqueRenderState=void 0,this._translucentRenderState=void 0,this._mode=void 0,this._ready=!1,this._pointsLength=0,this._geometryByteLength=0,this._vertexShaderLoaded=e.vertexShaderLoaded,this._fragmentShaderLoaded=e.fragmentShaderLoaded,this._uniformMapLoaded=e.uniformMapLoaded,this._batchTableLoaded=e.batchTableLoaded,this._pickIdLoaded=e.pickIdLoaded,this._opaquePass=y(e.opaquePass,Re.OPAQUE),this._cull=y(e.cull,!0),this.style=void 0,this._style=void 0,this.styleDirty=!1,this.modelMatrix=M.clone(M.IDENTITY),this._modelMatrix=M.clone(M.IDENTITY),this.time=0,this.shadows=_n.ENABLED,this._boundingSphere=void 0,this.clippingPlanes=void 0,this.isClipped=!1,this.clippingPlanesDirty=!1,this.clippingPlanesOriginMatrix=void 0,this.attenuation=!1,this._attenuation=!1,this.geometricError=0,this.geometricErrorScale=1,this.maximumAttenuation=this._pointSize,this.splitDirection=y(e.splitDirection,qc.NONE),this._splittingEnabled=!1,this._error=void 0,Kxt(this,e)}Object.defineProperties(dA.prototype,{pointsLength:{get:function(){return this._pointsLength}},geometryByteLength:{get:function(){return this._geometryByteLength}},ready:{get:function(){return this._ready}},color:{get:function(){return Y.clone(this._highlightColor)},set:function(e){this._highlightColor=Y.clone(e,this._highlightColor)}},boundingSphere:{get:function(){if(l(this._drawCommand))return this._drawCommand.boundingVolume},set:function(e){this._boundingSphere=le.clone(e,this._boundingSphere)}}});function Kxt(e,t){let n=z_.parse(t.arrayBuffer,t.byteOffset);if(e._parsedContent=n,e._rtcCenter=n.rtcCenter,e._hasNormals=n.hasNormals,e._hasColors=n.hasColors,e._hasBatchIds=n.hasBatchIds,e._isTranslucent=n.isTranslucent,!n.hasBatchIds&&l(n.batchTableBinary)&&(n.styleableProperties=jp.getBinaryProperties(n.pointsLength,n.batchTableJson,n.batchTableBinary)),l(n.draco)){let a=n.draco;e._decodingState=lS.NEEDS_DECODE,a.dequantizeInShader=e._dequantizeInShader}let i=n.positions;l(i)&&(e._isQuantized=i.isQuantized,e._quantizedVolumeScale=i.quantizedVolumeScale,e._quantizedVolumeOffset=i.quantizedVolumeOffset,e._quantizedRange=i.quantizedRange);let o=n.normals;l(o)&&(e._isOctEncoded16P=o.octEncoded);let r=n.colors;l(r)&&(l(r.constantColor)&&(e._constantColor=Y.clone(r.constantColor,e._constantColor),e._hasColors=!1),e._isRGB565=r.isRGB565);let s=n.batchIds;l(n.batchIds)&&(s.name="BATCH_ID",s.semantic="BATCH_ID",s.setIndex=void 0),n.hasBatchIds&&e._batchTableLoaded(n.batchLength,n.batchTableJson,n.batchTableBinary),e._pointsLength=n.pointsLength}var Jxt=new h,Qxt=new h,jxt=new h,UTe,M3;function qxt(e){if(!l(M3)){UTe=new BTe.default(0),M3=new Array(e);for(let t=0;t<e;++t)M3[t]=UTe.random()}return M3}function $xt(e){let n=e.length/3,i=Math.min(n,20),o=qxt(20),r=Number.MAX_VALUE,s=-Number.MAX_VALUE,a=h.fromElements(r,r,r,Jxt),c=h.fromElements(s,s,s,Qxt);for(let u=0;u<i;++u){let m=Math.floor(o[u]*n),p=h.unpack(e,m*3,jxt);h.minimumByComponent(a,p,a),h.maximumByComponent(c,p,c)}let d=le.fromCornerPoints(a,c);return d.radius+=W.EPSILON2,d}function DTe(e,t){let n=Q.fromTypedArray(e);return n===Q.INT||n===Q.UNSIGNED_INT||n===Q.DOUBLE?(Ft("Cast pnts property to floats",`Point cloud property "${t}" will be cast to a float array because INT, UNSIGNED_INT, and DOUBLE are not valid WebGL vertex attribute types. Some precision may be lost.`),new Float32Array(e)):e}var e_t=new se,t_t=new se,n_t=new Y,YTe=0,N3=1,E7=2,OTe=3,i_t=4,L7=new M,o_t=new M;function r_t(e,t){let n=t.context,i=e._parsedContent,o=e._pointsLength,r=i.positions,s=i.colors,a=i.normals,c=i.batchIds,d=i.styleableProperties,u=l(d),m=e._isQuantized,p=e._isQuantizedDraco,g=e._isOctEncoded16P,f=e._isOctEncodedDraco,x=e._quantizedRange,_=e._octEncodedRange,C=e._isRGB565,V=e._isTranslucent,L=e._hasColors,Z=e._hasNormals,G=e._hasBatchIds,X,v,P=[],F={};if(e._styleableShaderAttributes=F,u){let U=i_t;for(let O in d)if(d.hasOwnProperty(O)){let k=d[O],J=DTe(k.typedArray,O);X=k.componentCount,v=Q.fromTypedArray(J);let H=ft.createVertexBuffer({context:n,typedArray:J,usage:Ne.STATIC_DRAW});e._geometryByteLength+=H.sizeInBytes;let ee={index:U,vertexBuffer:H,componentsPerAttribute:X,componentDatatype:v,normalize:!1,offsetInBytes:0,strideInBytes:0};P.push(ee),F[O]={location:U,componentCount:X},++U}}let A=ft.createVertexBuffer({context:n,typedArray:r.typedArray,usage:Ne.STATIC_DRAW});e._geometryByteLength+=A.sizeInBytes;let b;L&&(b=ft.createVertexBuffer({context:n,typedArray:s.typedArray,usage:Ne.STATIC_DRAW}),e._geometryByteLength+=b.sizeInBytes);let R;Z&&(R=ft.createVertexBuffer({context:n,typedArray:a.typedArray,usage:Ne.STATIC_DRAW}),e._geometryByteLength+=R.sizeInBytes);let E;G&&(c.typedArray=DTe(c.typedArray,"batchIds"),E=ft.createVertexBuffer({context:n,typedArray:c.typedArray,usage:Ne.STATIC_DRAW}),e._geometryByteLength+=E.sizeInBytes);let I=[];if(m?v=Q.UNSIGNED_SHORT:p?v=x<=255?Q.UNSIGNED_BYTE:Q.UNSIGNED_SHORT:v=Q.FLOAT,I.push({index:YTe,vertexBuffer:A,componentsPerAttribute:3,componentDatatype:v,normalize:!1,offsetInBytes:0,strideInBytes:0}),e._cull&&(m||p?e._boundingSphere=le.fromCornerPoints(h.ZERO,e._quantizedVolumeScale):e._boundingSphere=$xt(r.typedArray)),L)if(C)I.push({index:N3,vertexBuffer:b,componentsPerAttribute:1,componentDatatype:Q.UNSIGNED_SHORT,normalize:!1,offsetInBytes:0,strideInBytes:0});else{let U=V?4:3;I.push({index:N3,vertexBuffer:b,componentsPerAttribute:U,componentDatatype:Q.UNSIGNED_BYTE,normalize:!0,offsetInBytes:0,strideInBytes:0})}Z&&(g?(X=2,v=Q.UNSIGNED_BYTE):f?(X=2,v=_<=255?Q.UNSIGNED_BYTE:Q.UNSIGNED_SHORT):(X=3,v=Q.FLOAT),I.push({index:E7,vertexBuffer:R,componentsPerAttribute:X,componentDatatype:v,normalize:!1,offsetInBytes:0,strideInBytes:0})),G&&I.push({index:OTe,vertexBuffer:E,componentsPerAttribute:1,componentDatatype:Q.fromTypedArray(c.typedArray),normalize:!1,offsetInBytes:0,strideInBytes:0}),u&&(I=I.concat(P));let w=new ti({context:n,attributes:I}),N={depthTest:{enabled:!0}},B={depthTest:{enabled:!0},depthMask:!1,blending:un.ALPHA_BLEND};e._opaquePass===Re.CESIUM_3D_TILE&&(N.stencilTest=Nt.setCesium3DTileBit(),N.stencilMask=Nt.CESIUM_3D_TILE_MASK,B.stencilTest=Nt.setCesium3DTileBit(),B.stencilMask=Nt.CESIUM_3D_TILE_MASK),e._opaqueRenderState=De.fromCache(N),e._translucentRenderState=De.fromCache(B),e._drawCommand=new et({boundingVolume:new le,cull:e._cull,modelMatrix:new M,primitiveType:Fe.POINTS,vertexArray:w,count:o,shaderProgram:void 0,uniformMap:void 0,renderState:V?e._translucentRenderState:e._opaqueRenderState,pass:V?Re.TRANSLUCENT:e._opaquePass,owner:e,castShadows:!1,receiveShadows:!1,pickId:e._pickIdLoaded()})}function s_t(e,t){let n=t.context,i=e._isQuantized,o=e._isQuantizedDraco,r=e._isOctEncodedDraco,s={u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier:function(){let a=e_t;if(a.x=e._attenuation?e.maximumAttenuation:e._pointSize,a.x*=t.pixelRatio,a.y=e.time,e._attenuation){let c=t.camera.frustum,d;t.mode===oe.SCENE2D||c instanceof on?d=Number.POSITIVE_INFINITY:d=n.drawingBufferHeight/t.camera.frustum.sseDenominator,a.z=e.geometricError*e.geometricErrorScale,a.w=d}return a},u_highlightColor:function(){return e._highlightColor},u_constantColor:function(){return e._constantColor},u_clippingPlanes:function(){let a=e.clippingPlanes;return e.isClipped?a.texture:n.defaultTexture},u_clippingPlanesEdgeStyle:function(){let a=e.clippingPlanes;if(!l(a))return Y.TRANSPARENT;let c=Y.clone(a.edgeColor,n_t);return c.alpha=a.edgeWidth,c},u_clippingPlanesMatrix:function(){let a=e.clippingPlanes;if(!l(a))return M.IDENTITY;let c=y(e.clippingPlanesOriginMatrix,e._modelMatrix);M.multiply(n.uniformState.view3D,c,L7);let d=M.multiply(L7,a.modelMatrix,L7);return M.inverseTranspose(d,o_t)}};xL.addUniforms(e,s),(i||o||r)&&(s=xt(s,{u_quantizedVolumeScaleAndOctEncodedRange:function(){let a=t_t;if(l(e._quantizedVolumeScale)){let c=h.clone(e._quantizedVolumeScale,a);h.divideByScalar(c,e._quantizedRange,a)}return a.w=e._octEncodedRange,a}})),l(e._uniformMapLoaded)&&(s=e._uniformMapLoaded(s)),e._drawCommand.uniformMap=s}function R7(e,t){let n=/czm_3dtiles_property_(\d+)/g,i=n.exec(e);for(;i!==null;){let o=parseInt(i[1]);t.indexOf(o)===-1&&t.push(o),i=n.exec(e)}}function Z7(e,t){e=e.slice(e.indexOf(` `));let n=/czm_3dtiles_builtin_property_(\w+)/g,i=n.exec(e);for(;i!==null;){let o=i[1];t.indexOf(o)===-1&&t.push(o),i=n.exec(e)}}function G7(e,t){let n=e.numberOfAttributes;for(let i=0;i<n;++i){let o=e.getAttribute(i);if(o.index===t)return o}}var a_t={POSITION:"czm_3dtiles_builtin_property_POSITION",POSITION_ABSOLUTE:"czm_3dtiles_builtin_property_POSITION_ABSOLUTE",COLOR:"czm_3dtiles_builtin_property_COLOR",NORMAL:"czm_3dtiles_builtin_property_NORMAL"};function c_t(e,t,n){let i,o,r,s=t.context,a=l(n),c=e._isQuantized,d=e._isQuantizedDraco,u=e._isOctEncoded16P,m=e._isOctEncodedDraco,p=e._isRGB565,g=e._isTranslucent,f=e._hasColors,x=e._hasNormals,_=e._hasBatchIds,C=e._backFaceCulling,V=e._normalShading,L=e._drawCommand.vertexArray,Z=e.clippingPlanes,G=e._attenuation,X,v,P,F=g,A=Oe(a_t),b={},R=e._styleableShaderAttributes;for(o in R)R.hasOwnProperty(o)&&(r=R[o],A[o]=`czm_3dtiles_property_${r.location}`,b[r.location]=r);if(a){let ae={translucent:!1},ye="(vec3 czm_3dtiles_builtin_property_POSITION, vec3 czm_3dtiles_builtin_property_POSITION_ABSOLUTE, vec4 czm_3dtiles_builtin_property_COLOR, vec3 czm_3dtiles_builtin_property_NORMAL)";X=n.getColorShaderFunction(`getColorFromStyle${ye}`,A,ae),v=n.getShowShaderFunction(`getShowFromStyle${ye}`,A,ae),P=n.getPointSizeShaderFunction(`getPointSizeFromStyle${ye}`,A,ae),l(X)&&ae.translucent&&(F=!0)}e._styleTranslucent=F;let E=l(X),I=l(v),w=l(P),N=e.isClipped,B=[],U=[];E&&(R7(X,B),Z7(X,U)),I&&(R7(v,B),Z7(v,U)),w&&(R7(P,B),Z7(P,U));let O=U.indexOf("COLOR")>=0,k=U.indexOf("NORMAL")>=0;if(k&&!x)throw new ue("Style references the NORMAL semantic but the point cloud does not have normals");for(o in R)if(R.hasOwnProperty(o)){r=R[o];let ae=B.indexOf(r.location)>=0,ye=G7(L,r.location);ye.enabled=ae}let J=f&&(!E||O);if(f){let ae=G7(L,N3);ae.enabled=J}let H=x&&(V||C||k);if(x){let ae=G7(L,E7);ae.enabled=H}let ee={a_position:YTe};J&&(ee.a_color=N3),H&&(ee.a_normal=E7),_&&(ee.a_batchId=OTe);let z="",j=B.length;for(i=0;i<j;++i){let ae=B[i];r=b[ae];let ye=r.componentCount,Se=`czm_3dtiles_property_${ae}`,Le;ye===1?Le="float":Le=`vec${ye}`,z+=`in ${Le} ${Se}; `,ee[Se]=r.location}s_t(e,t);let q=`in vec3 a_position; out vec4 v_color; uniform vec4 u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier; uniform vec4 u_constantColor; uniform vec4 u_highlightColor; `;q+=`float u_pointSize; float tiles3d_tileset_time; `,G&&(q+=`float u_geometricError; float u_depthMultiplier; `),q+=z,J&&(g?q+=`in vec4 a_color; `:p?q+=`in float a_color; const float SHIFT_RIGHT_11 = 1.0 / 2048.0; const float SHIFT_RIGHT_5 = 1.0 / 32.0; const float SHIFT_LEFT_11 = 2048.0; const float SHIFT_LEFT_5 = 32.0; const float NORMALIZE_6 = 1.0 / 64.0; const float NORMALIZE_5 = 1.0 / 32.0; `:q+=`in vec3 a_color; `),H&&(u||m?q+=`in vec2 a_normal; `:q+=`in vec3 a_normal; `),_&&(q+=`in float a_batchId; `),(c||d||m)&&(q+=`uniform vec4 u_quantizedVolumeScaleAndOctEncodedRange; `),E&&(q+=X),I&&(q+=v),w&&(q+=P),q+=`void main() { u_pointSize = u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier.x; tiles3d_tileset_time = u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier.y; `,G&&(q+=` u_geometricError = u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier.z; u_depthMultiplier = u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier.w; `),J?g?q+=` vec4 color = a_color; `:p?q+=` float compressed = a_color; float r = floor(compressed * SHIFT_RIGHT_11); compressed -= r * SHIFT_LEFT_11; float g = floor(compressed * SHIFT_RIGHT_5); compressed -= g * SHIFT_LEFT_5; float b = compressed; vec3 rgb = vec3(r * NORMALIZE_5, g * NORMALIZE_6, b * NORMALIZE_5); vec4 color = vec4(rgb, 1.0); `:q+=` vec4 color = vec4(a_color, 1.0); `:q+=` vec4 color = u_constantColor; `,c||d?q+=` vec3 position = a_position * u_quantizedVolumeScaleAndOctEncodedRange.xyz; `:q+=` vec3 position = a_position; `,q+=` vec3 position_absolute = vec3(czm_model * vec4(position, 1.0)); `,H?(u?q+=` vec3 normal = czm_octDecode(a_normal); `:m?q+=` vec3 normal = czm_octDecode(a_normal, u_quantizedVolumeScaleAndOctEncodedRange.w).zxy; `:q+=` vec3 normal = a_normal; `,q+=` vec3 normalEC = czm_normal * normal; `):q+=` vec3 normal = vec3(1.0); `,E&&(q+=` color = getColorFromStyle(position, position_absolute, color, normal); `),I&&(q+=` float show = float(getShowFromStyle(position, position_absolute, color, normal)); `),w?q+=` gl_PointSize = getPointSizeFromStyle(position, position_absolute, color, normal) * czm_pixelRatio; `:G?q+=` vec4 positionEC = czm_modelView * vec4(position, 1.0); float depth = -positionEC.z; gl_PointSize = min((u_geometricError / depth) * u_depthMultiplier, u_pointSize); `:q+=` gl_PointSize = u_pointSize; `,q+=` color = color * u_highlightColor; `,H&&V&&(q+=` float diffuseStrength = czm_getLambertDiffuse(czm_lightDirectionEC, normalEC); diffuseStrength = max(diffuseStrength, 0.4); color.xyz *= diffuseStrength * czm_lightColor; `),q+=` v_color = color; gl_Position = czm_modelViewProjection * vec4(position, 1.0); `,H&&C&&(q+=` float visible = step(-normalEC.z, 0.0); gl_Position *= visible; gl_PointSize *= visible; `),I&&(q+=` gl_Position.w *= float(show); gl_PointSize *= float(show); `),q+=`} `;let be=`in vec4 v_color; `;N&&(be+=`uniform highp sampler2D u_clippingPlanes; uniform mat4 u_clippingPlanesMatrix; uniform vec4 u_clippingPlanesEdgeStyle; `,be+=` `,be+=K0(Z,s),be+=` `),be+=`void main() { out_FragColor = czm_gammaCorrect(v_color); `,N&&(be+=lA("u_clippingPlanes","u_clippingPlanesMatrix","u_clippingPlanesEdgeStyle")),be+=`} `,e.splitDirection!==qc.NONE&&(be=xL.modifyFragmentShader(be)),l(e._vertexShaderLoaded)&&(q=e._vertexShaderLoaded(q)),l(e._fragmentShaderLoaded)&&(be=e._fragmentShaderLoaded(be));let Te=e._drawCommand;l(Te.shaderProgram)&&Te.shaderProgram.destroy(),Te.shaderProgram=$t.fromCache({context:s,vertexShaderSource:q,fragmentShaderSource:be,attributeLocations:ee});try{Te.shaderProgram._bind()}catch{throw new ue("Error generating style shader: this may be caused by a type mismatch, index out-of-bounds, or other syntax error.")}}function l_t(e,t){if(e._decodingState===lS.READY)return!1;if(e._decodingState===lS.NEEDS_DECODE){let n=e._parsedContent,i=n.draco,o=i0.decodePointCloud(i,t);l(o)&&(e._decodingState=lS.DECODING,o.then(function(r){e._decodingState=lS.READY;let s=l(r.POSITION)?r.POSITION.array:void 0,a=l(r.RGB)?r.RGB.array:void 0,c=l(r.RGBA)?r.RGBA.array:void 0,d=l(r.NORMAL)?r.NORMAL.array:void 0,u=l(r.BATCH_ID)?r.BATCH_ID.array:void 0,m=l(s)&&l(r.POSITION.data.quantization),p=l(d)&&l(r.NORMAL.data.quantization);if(m){let _=r.POSITION.data.quantization,C=_.range;e._quantizedVolumeScale=h.fromElements(C,C,C),e._quantizedVolumeOffset=h.unpack(_.minValues),e._quantizedRange=(1<<_.quantizationBits)-1,e._isQuantizedDraco=!0}p&&(e._octEncodedRange=(1<<r.NORMAL.data.quantization.quantizationBits)-1,e._isOctEncodedDraco=!0);let g=n.styleableProperties,f=i.batchTableProperties;for(let _ in f)if(f.hasOwnProperty(_)){let C=r[_];l(g)||(g={}),g[_]={typedArray:C.array,componentCount:C.data.componentsPerAttribute}}l(s)&&(n.positions={typedArray:s});let x=y(c,a);l(x)&&(n.colors={typedArray:x}),l(d)&&(n.normals={typedArray:d}),l(u)&&(n.batchIds={typedArray:u}),n.styleableProperties=g}).catch(function(r){e._decodingState=lS.FAILED,e._error=r}))}return!0}var d_t=new se,u_t=new h;dA.prototype.update=function(e){let t=e.context;if(l(this._error)){let d=this._error;throw this._error=void 0,d}if(l_t(this,t))return;let i=!1,o=!M.equals(this._modelMatrix,this.modelMatrix);if(this._mode!==e.mode&&(this._mode=e.mode,o=!0),l(this._drawCommand)||(r_t(this,e),o=!0,i=!0,this._ready=!0,this._parsedContent=void 0),o){M.clone(this.modelMatrix,this._modelMatrix);let d=this._drawCommand.modelMatrix;if(M.clone(this._modelMatrix,d),l(this._rtcCenter)&&M.multiplyByTranslation(d,this._rtcCenter,d),l(this._quantizedVolumeOffset)&&M.multiplyByTranslation(d,this._quantizedVolumeOffset,d),e.mode!==oe.SCENE3D){let m=e.mapProjection,p=M.getColumn(d,3,d_t);se.equals(p,se.UNIT_W)||Gt.basisTo2D(m,d,d)}let u=this._drawCommand.boundingVolume;if(le.clone(this._boundingSphere,u),this._cull){let m=u.center;M.multiplyByPoint(d,m,m);let p=M.getScale(d,u_t);u.radius*=h.maximumComponent(p)}}this.clippingPlanesDirty&&(this.clippingPlanesDirty=!1,i=!0),this._attenuation!==this.attenuation&&(this._attenuation=this.attenuation,i=!0),this.backFaceCulling!==this._backFaceCulling&&(this._backFaceCulling=this.backFaceCulling,i=!0),this.normalShading!==this._normalShading&&(this._normalShading=this.normalShading,i=!0),(this._style!==this.style||this.styleDirty)&&(this._style=this.style,this.styleDirty=!1,i=!0);let r=this.splitDirection!==qc.NONE;this._splittingEnabled!==r&&(this._splittingEnabled=r,i=!0),i&&c_t(this,e,this._style),this._drawCommand.castShadows=_n.castShadows(this.shadows),this._drawCommand.receiveShadows=_n.receiveShadows(this.shadows);let s=this._highlightColor.alpha<1||this._constantColor.alpha<1||this._styleTranslucent;this._drawCommand.renderState=s?this._translucentRenderState:this._opaqueRenderState,this._drawCommand.pass=s?Re.TRANSLUCENT:this._opaquePass;let a=e.commandList,c=e.passes;(c.render||c.pick)&&a.push(this._drawCommand)};dA.prototype.isDestroyed=function(){return!1};dA.prototype.destroy=function(){let e=this._drawCommand;return l(e)&&(e.vertexArray=e.vertexArray&&e.vertexArray.destroy(),e.shaderProgram=e.shaderProgram&&e.shaderProgram.destroy()),me(this)};var uA=dA;var G7i=T(S(),1);function eu(){fe.throwInstantiationError()}eu.computeDefaultLevelZeroMaximumGeometricError=function(e){return e.ellipsoid.maximumRadius*2*Math.PI*.25/(65*e.getNumberOfXTilesAtLevel(0))};Object.defineProperties(eu.prototype,{quadtree:{get:fe.throwInstantiationError,set:fe.throwInstantiationError},tilingScheme:{get:fe.throwInstantiationError},errorEvent:{get:fe.throwInstantiationError}});eu.prototype.update=fe.throwInstantiationError;eu.prototype.beginUpdate=fe.throwInstantiationError;eu.prototype.endUpdate=fe.throwInstantiationError;eu.prototype.getLevelMaximumGeometricError=fe.throwInstantiationError;eu.prototype.loadTile=fe.throwInstantiationError;eu.prototype.computeTileVisibility=fe.throwInstantiationError;eu.prototype.showTileThisFrame=fe.throwInstantiationError;eu.prototype.computeDistanceToTile=fe.throwInstantiationError;eu.prototype.isDestroyed=fe.throwInstantiationError;eu.prototype.destroy=fe.throwInstantiationError;var X7=eu;var P7i=T(S(),1);function I7(e){e=y(e,1),this._radius=y(e,1)}Object.defineProperties(I7.prototype,{radius:{get:function(){return this._radius},set:function(e){this._radius=e}}});I7.prototype.emit=function(e){let t=W.randomBetween(0,W.TWO_PI),n=W.randomBetween(0,W.PI),i=W.randomBetween(0,this._radius),o=i*Math.cos(t)*Math.sin(n),r=i*Math.sin(t)*Math.sin(n),s=i*Math.cos(n);e.position=h.fromElements(o,r,s,e.position),e.velocity=h.normalize(e.position,e.velocity)};var W7=I7;var F7i=T(S(),1);function mA(){}mA.prototype.evaluate=function(e,t){fe.throwInstantiationError()};mA.prototype.evaluateColor=function(e,t){fe.throwInstantiationError()};mA.prototype.getShaderFunction=function(e,t,n,i){fe.throwInstantiationError()};mA.prototype.getVariables=function(){fe.throwInstantiationError()};var P7=mA;var U7i=T(S(),1);function _L(e){this._ready=!1,this._provider=void 0,this._errorEvent=new ge,this._readyEvent=new ge,h_t(this,e)}Object.defineProperties(_L.prototype,{errorEvent:{get:function(){return this._errorEvent}},readyEvent:{get:function(){return this._readyEvent}},ready:{get:function(){return this._ready}},provider:{get:function(){return this._provider}}});_L.fromWorldTerrain=function(e){return new _L(Bx(e))};_L.fromWorldBathymetry=function(e){return new _L(pZ(e))};function m_t(e,t){e.numberOfListeners>0?e.raiseEvent(t):console.error(t)}async function h_t(e,t){let n;try{n=await Promise.resolve(t),e._provider=n,e._ready=!0,e._readyEvent.raiseEvent(n)}catch(i){m_t(e._errorEvent,i)}}var hA=_L;var Y7i=T(S(),1);function TL(){}TL.prototype.boundingVolume=void 0;TL.prototype.boundingSphere=void 0;TL.prototype.distanceToCamera=function(e){fe.throwInstantiationError()};TL.prototype.intersectPlane=function(e){fe.throwInstantiationError()};TL.prototype.createDebugVolume=function(e){fe.throwInstantiationError()};var v7=TL;var j7i=T(S(),1);function fA(e){e=y(e,y.EMPTY_OBJECT),this._tilingScheme=l(e.tilingScheme)?e.tilingScheme:new Ai({ellipsoid:e.ellipsoid}),this._color=y(e.color,Y.YELLOW),this._errorEvent=new ge,this._tileWidth=y(e.tileWidth,256),this._tileHeight=y(e.tileHeight,256),this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=void 0,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0}Object.defineProperties(fA.prototype,{proxy:{get:function(){}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){}},minimumLevel:{get:function(){}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._tilingScheme.rectangle}},tileDiscardPolicy:{get:function(){}},errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){}},hasAlphaChannel:{get:function(){return!0}}});fA.prototype.getTileCredits=function(e,t,n){};fA.prototype.requestImage=function(e,t,n,i){let o=document.createElement("canvas");o.width=256,o.height=256;let r=o.getContext("2d"),s=this._color.toCssColorString();return r.strokeStyle=s,r.lineWidth=2,r.strokeRect(1,1,255,255),r.font="bold 25px Arial",r.textAlign="center",r.fillStyle=s,r.fillText(`L: ${n}`,124,86),r.fillText(`X: ${e}`,124,136),r.fillText(`Y: ${t}`,124,186),Promise.resolve(o)};fA.prototype.pickFeatures=function(e,t,n,i,o){};var pA=fA;var e6i=T(S(),1);function w7(e){fe.throwInstantiationError()}w7.prototype.isReady=fe.throwInstantiationError;w7.prototype.shouldDiscardImage=fe.throwInstantiationError;var F7=w7;var n6i=T(S(),1),f_t={START:0,LOADING:1,READY:2,UPSAMPLED_ONLY:3},A7=Object.freeze(f_t);var _6i=T(S(),1);function uS(e){e=y(e,y.EMPTY_OBJECT),this.show=y(e.show,!0),this.modelMatrix=M.clone(y(e.modelMatrix,M.IDENTITY)),this.shadows=y(e.shadows,_n.ENABLED),this.maximumMemoryUsage=y(e.maximumMemoryUsage,256),this.shading=new bf(e.shading),this.style=e.style,this.frameFailed=new ge,this.frameChanged=new ge,this._clock=e.clock,this._intervals=e.intervals,this._clippingPlanes=void 0,this.clippingPlanes=e.clippingPlanes,this._pointCloudEyeDomeLighting=new c0,this._loadTimestamp=void 0,this._clippingPlanesState=0,this._styleDirty=!1,this._pickId=void 0,this._totalMemoryUsageInBytes=0,this._frames=[],this._previousInterval=void 0,this._nextInterval=void 0,this._lastRenderedFrame=void 0,this._clockMultiplier=0,this._runningSum=0,this._runningLength=0,this._runningIndex=0,this._runningSamples=new Array(5).fill(0),this._runningAverage=0}Object.defineProperties(uS.prototype,{clippingPlanes:{get:function(){return this._clippingPlanes},set:function(e){ss.setOwner(e,this,"_clippingPlanes")}},totalMemoryUsageInBytes:{get:function(){return this._totalMemoryUsageInBytes}},boundingSphere:{get:function(){if(l(this._lastRenderedFrame))return this._lastRenderedFrame.pointCloud.boundingSphere}}});function p_t(e){return`uniform vec4 czm_pickColor; ${e}`}function b_t(e){return function(t){return xt(t,{czm_pickColor:function(){return e._pickId.color}})}}function g_t(){return"czm_pickColor"}uS.prototype.makeStyleDirty=function(){this._styleDirty=!0};uS.prototype._getAverageLoadTime=function(){return this._runningLength===0?.05:this._runningAverage};var y_t=new te;function N7(e){let t=e._clock,n=t.canAnimate&&t.shouldAnimate,i=t.multiplier;return n?i:0}function dS(e,t){return e._intervals.indexOf(t.start)}function x_t(e,t){let n=e._intervals,i=e._clock,o=N7(e);if(o===0)return;let r=e._getAverageLoadTime(),s=te.addSeconds(i.currentTime,r*o,y_t),a=n.indexOf(s),c=dS(e,t);return a===c&&(o>=0?++a:--a),n.get(a)}function __t(e){let t=e._intervals,i=e._clock.currentTime,o=t.indexOf(i);return t.get(o)}function T_t(e,t,n){let i=N7(e),o=dS(e,t),r=dS(e,n);return i>=0?o>=r:o<=r}function zTe(e,t){return function(n){let i=l(n.message)?n.message:n.toString();e.frameFailed.numberOfListeners>0?e.frameFailed.raiseEvent({uri:t,message:i}):(console.log(`A frame failed to load: ${t}`),console.log(`Error: ${i}`))}}function S_t(e,t,n){let i=dS(e,t),o=e._frames,r=o[i];if(!l(r)){let s=t.data.transform,a=l(s)?M.fromArray(s):void 0,c=t.data.uri;r={pointCloud:void 0,transform:a,timestamp:fi(),sequential:!0,ready:!1,touchedFrameNumber:n.frameNumber,uri:c},o[i]=r,Ee.fetchArrayBuffer({url:c}).then(function(d){r.pointCloud=new uA({arrayBuffer:d,cull:!0,fragmentShaderLoaded:p_t,uniformMapLoaded:b_t(e),pickIdLoaded:g_t})}).catch(zTe(e,c))}return r}function C_t(e,t){e._runningSum+=t,e._runningSum-=e._runningSamples[e._runningIndex],e._runningSamples[e._runningIndex]=t,e._runningLength=Math.min(e._runningLength+1,e._runningSamples.length),e._runningIndex=(e._runningIndex+1)%e._runningSamples.length,e._runningAverage=e._runningSum/e._runningLength}function V_t(e,t,n,i){t.touchedFrameNumber<i.frameNumber-1&&(t.sequential=!1);let o=t.pointCloud;if(l(o)&&!t.ready){let r=i.commandList,s=r.length;if(KTe(e,t,n,i),o.ready&&(t.ready=!0,e._totalMemoryUsageInBytes+=o.geometryByteLength,r.length=s,t.sequential)){let a=(fi()-t.timestamp)/1e3;C_t(e,a)}}t.touchedFrameNumber=i.frameNumber}var L_t=new M;function R_t(e,t){let n=e.shading;return l(n)&&l(n.baseResolution)?n.baseResolution:l(t.boundingSphere)?W.cbrt(t.boundingSphere.volume()/t.pointsLength):0}function Z_t(e){let t=e.shading;return l(t)&&l(t.maximumAttenuation)?t.maximumAttenuation:10}var G_t=new bf;function KTe(e,t,n,i){let o=y(e.shading,G_t),r=t.pointCloud,s=y(t.transform,M.IDENTITY);r.modelMatrix=M.multiplyTransformation(e.modelMatrix,s,L_t),r.style=e.style,r.time=n.timeSinceLoad,r.shadows=e.shadows,r.clippingPlanes=e._clippingPlanes,r.isClipped=n.isClipped,r.attenuation=o.attenuation,r.backFaceCulling=o.backFaceCulling,r.normalShading=o.normalShading,r.geometricError=R_t(e,r),r.geometricErrorScale=o.geometricErrorScale,r.maximumAttenuation=Z_t(e);try{r.update(i)}catch(a){zTe(e,t.uri)(a)}t.touchedFrameNumber=i.frameNumber}function M7(e,t,n,i){let o=S_t(e,t,i);V_t(e,o,n,i)}function E_t(e){return function(t){return t.touchedFrameNumber<e.frameNumber}}function JTe(e,t){let n=e._frames,i=n.length;for(let o=0;o<i;++o){let r=n[o];if(l(r)&&(!l(t)||t(r))){let s=r.pointCloud;r.ready&&(e._totalMemoryUsageInBytes-=s.geometryByteLength),l(s)&&s.destroy(),r===e._lastRenderedFrame&&(e._lastRenderedFrame=void 0),n[o]=void 0}}}function X_t(e,t){let n=dS(e,t),i=e._frames[n];if(l(i)&&i.ready)return i}function HTe(e,t,n,i,o){return l(n)?n.ready?!0:(M7(e,t,i,o),n.ready):!1}function I_t(e,t,n,i,o){let r,s,a,c=e._intervals,d=e._frames,u=dS(e,n),m=dS(e,t);if(u>=m){for(r=u;r>=m;--r)if(s=c.get(r),a=d[r],HTe(e,s,a,i,o))return s}else for(r=u;r<=m;++r)if(s=c.get(r),a=d[r],HTe(e,s,a,i,o))return s;return t}function W_t(e,t,n){let i=e._frames,o=i.length;for(let r=0;r<o;++r){let s=i[r];l(s)&&l(s.pointCloud)&&(s.pointCloud.clippingPlanesDirty=t,s.pointCloud.styleDirty=n)}}var SL={timeSinceLoad:0,isClipped:!1,clippingPlanesDirty:!1};uS.prototype.update=function(e){if(e.mode===oe.MORPHING||!this.show)return;l(this._pickId)||(this._pickId=e.context.createPickId({primitive:this})),l(this._loadTimestamp)||(this._loadTimestamp=te.clone(e.time));let t=Math.max(te.secondsDifference(e.time,this._loadTimestamp)*1e3,0),n=this._clippingPlanes,i=0,o=!1,r=l(n)&&n.enabled;r&&(n.update(e),i=n.clippingPlanesState),this._clippingPlanesState!==i&&(this._clippingPlanesState=i,o=!0);let s=this._styleDirty;this._styleDirty=!1,(o||s)&&W_t(this,o,s),SL.timeSinceLoad=t,SL.isClipped=r;let a=this.shading,c=this._pointCloudEyeDomeLighting,d=e.commandList,u=d.length,m=this._previousInterval,p=this._nextInterval,g=__t(this);if(!l(g))return;let f=!1,x=N7(this),_=x===0;x!==this._clockMultiplier&&(f=!0,this._clockMultiplier=x),(!l(m)||_)&&(m=g),(!l(p)||f||T_t(this,g,p))&&(p=x_t(this,g)),m=I_t(this,m,g,SL,e);let C=X_t(this,m);l(C)||(M7(this,m,SL,e),C=this._lastRenderedFrame),l(C)&&KTe(this,C,SL,e),l(p)&&M7(this,p,SL,e);let V=this;l(C)&&!l(this._lastRenderedFrame)&&e.afterRender.push(function(){return!0}),l(C)&&C!==this._lastRenderedFrame&&V.frameChanged.numberOfListeners>0&&e.afterRender.push(function(){return V.frameChanged.raiseEvent(V),!0}),this._previousInterval=m,this._nextInterval=p,this._lastRenderedFrame=C;let L=this._totalMemoryUsageInBytes,Z=this.maximumMemoryUsage*1024*1024;L>Z&&JTe(this,E_t(e));let X=d.length-u;l(a)&&a.attenuation&&a.eyeDomeLighting&&X>0&&c.update(e,u,a,this.boundingSphere)};uS.prototype.isDestroyed=function(){return!1};uS.prototype.destroy=function(){return JTe(this),this._clippingPlanes=this._clippingPlanes&&this._clippingPlanes.destroy(),this._pickId=this._pickId&&this._pickId.destroy(),me(this)};var CL=uS;var W6i=T(S(),1);function k3(e,t){this.show=!0,l(e)||(e=new He),this.rectangle=He.clone(e),l(t)||(t=Mi.fromType(Mi.ColorType,{color:new Y(1,1,1,1)})),this.material=t,this._material=void 0,this._overlayCommand=void 0,this._rs=void 0}k3.prototype.update=function(e){if(!this.show)return;let t=this._rs;if((!l(t)||!He.equals(t.viewport,this.rectangle))&&(this._rs=De.fromCache({blending:un.ALPHA_BLEND,viewport:this.rectangle})),e.passes.render){let i=e.context;if(this._material!==this.material||!l(this._overlayCommand)){this._material=this.material,l(this._overlayCommand)&&this._overlayCommand.shaderProgram.destroy();let o=new Ye({sources:[this._material.shaderSource,Xw]});this._overlayCommand=i.createViewportQuadCommand(o,{renderState:this._rs,uniformMap:this._material._uniforms,owner:this}),this._overlayCommand.pass=Re.OVERLAY}this._material.update(i),this._overlayCommand.renderState=this._rs,this._overlayCommand.uniformMap=this._material._uniforms,e.commandList.push(this._overlayCommand)}};k3.prototype.isDestroyed=function(){return!1};k3.prototype.destroy=function(){return l(this._overlayCommand)&&(this._overlayCommand.shaderProgram=this._overlayCommand.shaderProgram&&this._overlayCommand.shaderProgram.destroy()),me(this)};var k7=k3;var w6i=T(S(),1);function U7(){fe.throwInstantiationError()}Object.defineProperties(U7.prototype,{globalTransform:{get:fe.throwInstantiationError},shapeTransform:{get:fe.throwInstantiationError},shape:{get:fe.throwInstantiationError},minBounds:{get:fe.throwInstantiationError},maxBounds:{get:fe.throwInstantiationError},dimensions:{get:fe.throwInstantiationError},paddingBefore:{get:fe.throwInstantiationError},paddingAfter:{get:fe.throwInstantiationError},names:{get:fe.throwInstantiationError},types:{get:fe.throwInstantiationError},componentTypes:{get:fe.throwInstantiationError},minimumValues:{get:fe.throwInstantiationError},maximumValues:{get:fe.throwInstantiationError},maximumTileCount:{get:fe.throwInstantiationError},keyframeCount:{get:fe.throwInstantiationError},timeIntervalCollection:{get:fe.throwInstantiationError}});U7.prototype.requestData=fe.throwInstantiationError;var D7=U7;var M6i=T(S(),1);function mS(){fe.throwInstantiationError()}Object.defineProperties(mS.prototype,{orientedBoundingBox:{get:fe.throwInstantiationError},boundingSphere:{get:fe.throwInstantiationError},boundTransform:{get:fe.throwInstantiationError},shapeTransform:{get:fe.throwInstantiationError},shaderUniforms:{get:fe.throwInstantiationError},shaderDefines:{get:fe.throwInstantiationError},shaderMaximumIntersectionsLength:{get:fe.throwInstantiationError}});mS.prototype.update=fe.throwInstantiationError;mS.prototype.computeOrientedBoundingBoxForTile=fe.throwInstantiationError;mS.prototype.computeOrientedBoundingBoxForSample=fe.throwInstantiationError;mS.DefaultMinBounds=fe.throwInstantiationError;mS.DefaultMaxBounds=fe.throwInstantiationError;var B7=mS;var Y6i=T(S(),1);async function Y7(e,t){let n=t.terrainProvider,i=t.mapProjection,o=i.ellipsoid,r,s=t.camera.getRectangleCameraCoordinates(e);if(t.mode===oe.SCENE3D?r=o.cartesianToCartographic(s):r=i.unproject(s),!l(n))return r;let a=n.availability;if(!l(a)||t.mode===oe.SCENE2D)return r;let c=[ce.center(e),ce.southeast(e),ce.southwest(e),ce.northeast(e),ce.northwest(e)],d=await Y7._sampleTerrainMostDetailed(n,c),u=!1,m=d.reduce(function(g,f){return l(f.height)?(u=!0,Math.max(f.height,g)):g},-Number.MAX_VALUE),p=r;return u&&(p.height+=m),p}Y7._sampleTerrainMostDetailed=Ox;var hS=Y7;var sqi=T(S(),1);var P_t=new Y,v_t=new Y,w_t=new Y,F_t=new Y,QTe=new se,bA=new Uint8Array(4);function jTe(e,t,n,i){let o=t.height===n.height?0:(e-t.height)/(n.height-t.height);return Y.lerp(t.color,n.color,o,i)}function U3(e,t){return{height:e,color:Y.clone(t)}}function qTe(e){return e=e.filter(function(t,n,i){let o=n>0,r=n<i.length-1,s=o?t.height===i[n-1].height:!0,a=r?t.height===i[n+1].height:!0;return!s||!a}),e=e.filter(function(t,n,i){let o=n>0,r=n<i.length-1,s=o?Y.equals(t.color,i[n-1].color):!1,a=r?Y.equals(t.color,i[n+1].color):!1;return!s||!a}),e=e.filter(function(t,n,i){let o=n>0,r=o?Y.equals(t.color,i[n-1].color):!1,s=o?t.height===i[n-1].height:!0;return!r||!s}),e}function A_t(e){let t,n,i=[],o=e.length;for(t=0;t<o;t++){let r=e[t],s=r.entries,a=s.length,c=[];for(n=0;n<a;n++){let g=s[n],f=W.clamp(g.height,td._minimumHeight,td._maximumHeight),x=Y.clone(g.color,P_t);x.red*=x.alpha,x.green*=x.alpha,x.blue*=x.alpha,c.push(U3(f,x))}let d=!0,u=!0;for(n=0;n<a-1;n++){let g=c[n+0],f=c[n+1];d=d&&g.height<=f.height,u=u&&g.height>=f.height}u?c=c.reverse():d||wp(c,function(g,f){return W.sign(g.height-f.height)});let m=y(r.extendDownwards,!1),p=y(r.extendUpwards,!1);c.length===1&&!m&&!p&&(m=!0,p=!0),m&&c.splice(0,0,U3(td._minimumHeight,c[0].color)),p&&c.splice(c.length,0,U3(td._maximumHeight,c[c.length-1].color)),c=qTe(c),i.push(c)}return i}function M_t(e){let t=A_t(e),n=[],i=[],o;function r(d,u){n.push(U3(d,u))}function s(d,u,m){let p=Y.multiplyByScalar(m,1-u.alpha,F_t);p=Y.add(p,u,p),r(d,p)}let a=t.length;for(o=0;o<a;o++){let d=t[o],u=0,m=0;i=n,n=[];let p=d.length,g=i.length;for(;u<p||m<g;){let f=u<p?d[u]:void 0,x=u>0?d[u-1]:void 0,_=u<p-1?d[u+1]:void 0,C=m<g?i[m]:void 0,V=m>0?i[m-1]:void 0,L=m<g-1?i[m+1]:void 0;if(l(f)&&l(C)&&f.height===C.height){let Z=l(L)&&C.height===L.height,G=!l(V),X=!l(L),v=l(_)&&f.height===_.height,P=!l(x),F=!l(_);Z?v?(s(f.height,f.color,C.color),s(f.height,_.color,L.color)):P?(r(f.height,C.color),s(f.height,f.color,L.color)):F?(s(f.height,f.color,C.color),r(f.height,L.color)):(s(f.height,f.color,C.color),s(f.height,f.color,L.color)):G?v?(r(f.height,f.color),s(f.height,_.color,C.color)):F?(r(f.height,f.color),r(f.height,C.color)):(P||r(f.height,f.color),s(f.height,f.color,C.color)):X?v?(s(f.height,f.color,C.color),r(f.height,_.color)):P?(r(f.height,C.color),r(f.height,f.color)):F?s(f.height,f.color,C.color):(s(f.height,f.color,C.color),r(f.height,f.color)):v?(s(f.height,f.color,C.color),s(f.height,_.color,C.color)):P?(r(f.height,C.color),s(f.height,f.color,C.color)):F?(s(f.height,f.color,C.color),r(f.height,C.color)):s(f.height,f.color,C.color),u+=v?2:1,m+=Z?2:1}else if(l(f)&&l(C)&&l(V)&&f.height<C.height){let Z=jTe(f.height,V,C,w_t);l(x)?l(_)?s(f.height,f.color,Z):(s(f.height,f.color,Z),r(f.height,Z)):(r(f.height,Z),s(f.height,f.color,Z)),u++}else if(l(C)&&l(f)&&l(x)&&C.height<f.height){let Z=jTe(C.height,x,f,v_t);l(V)?l(L)?s(C.height,Z,C.color):(s(C.height,Z,C.color),r(C.height,Z)):(r(C.height,Z),s(C.height,Z,C.color)),m++}else l(f)&&(!l(C)||f.height<C.height)?(l(C)&&!l(V)&&!l(_)?(r(f.height,f.color),r(f.height,td._emptyColor),r(C.height,td._emptyColor)):(!l(C)&&l(V)&&!l(x)&&(r(V.height,td._emptyColor),r(f.height,td._emptyColor)),r(f.height,f.color)),u++):l(C)&&(!l(f)||C.height<f.height)&&(r(C.height,C.color),m++)}}return qTe(n)}function td(e){let{scene:t,layers:n}=y(e,y.EMPTY_OBJECT),{context:i}=t,o=M_t(n),r=o.length,s,a,c;if(!td._useFloatTexture(i)){a=ze.UNSIGNED_BYTE,c=at.RGBA,s=new Uint8Array(r*4);for(let g=0;g<r;g++)se.packFloat(o[g].height,QTe),se.pack(QTe,s,g*4)}else{a=ze.FLOAT,c=i.webgl2?at.RED:at.LUMINANCE,s=new Float32Array(r);for(let g=0;g<r;g++)s[g]=o[g].height}let u=Et.create({context:i,pixelFormat:c,pixelDatatype:a,source:{arrayBufferView:s,width:r,height:1},sampler:new sn({wrapS:Cn.CLAMP_TO_EDGE,wrapT:Cn.CLAMP_TO_EDGE,minificationFilter:rn.NEAREST,magnificationFilter:di.NEAREST})}),m=new Uint8Array(r*4);for(let g=0;g<r;g++)o[g].color.toBytes(bA),m[g*4+0]=bA[0],m[g*4+1]=bA[1],m[g*4+2]=bA[2],m[g*4+3]=bA[3];let p=Et.create({context:i,pixelFormat:at.RGBA,pixelDatatype:ze.UNSIGNED_BYTE,source:{arrayBufferView:m,width:r,height:1},sampler:new sn({wrapS:Cn.CLAMP_TO_EDGE,wrapT:Cn.CLAMP_TO_EDGE,minificationFilter:rn.LINEAR,magnificationFilter:di.LINEAR})});return Mi.fromType("ElevationBand",{heights:u,colors:p})}td._useFloatTexture=function(e){return e.floatingPointTexture};td._maximumHeight=5906376425472;td._minimumHeight=-5906376425472;td._emptyColor=new Y(0,0,0,0);var O7=td;var fqi=T(S(),1);async function N_t(e,t){if(t=y(t,{}),t.cacheBytes=y(t.cacheBytes,1536*1024*1024),t.maximumCacheOverflowBytes=y(t.maximumCacheOverflowBytes,1024*1024*1024),t.enableCollision=y(t.enableCollision,!0),e=y(e,Lx.defaultApiKey),!l(e))return k_t(t);let n,i=Lx.getDefaultCredit();l(i)&&(n=[i]);let o=new Ee({url:`${Lx.mapTilesApiEndpoint}3dtiles/root.json`,queryParameters:{key:e},credits:n});return sa.fromUrl(o,t)}var $Te={};async function k_t(e){let i=$Te[2275207];l(i)||(i=sd.fromAssetId(2275207),$Te[2275207]=i);let o=await i;return sa.fromUrl(o,e)}var H7=N_t;var Tqi=T(S(),1);async function U_t(e){let t=await sa.fromIonAssetId(96188,e);e=y(e,y.EMPTY_OBJECT);let n=e.style;if(!l(n)){let i=y(e.defaultColor,Y.WHITE).toCssColorString();n=new iS({color:`Boolean(\${feature['cesium#color']}) ? color(\${feature['cesium#color']}) : ${i}`})}return t.style=n,t}var z7=U_t;var Iqi=T(S(),1);function D_t(e){e=y(e,y.EMPTY_OBJECT);let t=[],n=e.geometry;(!l(n.attributes)||!l(n.primitiveType))&&(n=n.constructor.createGeometry(n));let i=n.attributes,o=M.clone(y(e.modelMatrix,M.IDENTITY)),r=y(e.length,1e4);if(l(i.normal)&&t.push(new St({geometry:An.createLineSegmentsForVectors(n,"normal",r),attributes:{color:new Ht(1,0,0,1)},modelMatrix:o})),l(i.tangent)&&t.push(new St({geometry:An.createLineSegmentsForVectors(n,"tangent",r),attributes:{color:new Ht(0,1,0,1)},modelMatrix:o})),l(i.bitangent)&&t.push(new St({geometry:An.createLineSegmentsForVectors(n,"bitangent",r),attributes:{color:new Ht(0,0,1,1)},modelMatrix:o})),t.length>0)return new En({asynchronous:!1,geometryInstances:t,appearance:new dn({flat:!0,translucent:!1})})}var K7=D_t;var Pqi=T(S(),1),J7=`uniform sampler2D u_depthTexture; in vec2 v_textureCoordinates; void main() { float z_window = czm_unpackDepth(texture(u_depthTexture, v_textureCoordinates)); z_window = czm_reverseLogDepth(z_window); float n_range = czm_depthRange.near; float f_range = czm_depthRange.far; float z_ndc = (2.0 * z_window - n_range - f_range) / (f_range - n_range); float scale = pow(z_ndc * 0.5 + 0.5, 8.0); out_FragColor = vec4(mix(vec3(0.0), vec3(1.0), scale), 1.0); } `;var Uqi=T(S(),1);function B_t(e){e=y(e,y.EMPTY_OBJECT),this.typedArray=e.typedArray,this.width=e.width,this.height=e.height,this.pixelFormat=y(e.pixelFormat,at.RGBA),this.pixelDatatype=y(e.pixelDatatype,ze.UNSIGNED_BYTE);let t=e.url;typeof t=="string"&&(t=Ee.createIfNeeded(t)),this.resource=t;let i=y(e.repeat,!0)?Cn.REPEAT:Cn.CLAMP_TO_EDGE;this.sampler=new sn({wrapS:i,wrapT:i,minificationFilter:e.minificationFilter,magnificationFilter:e.magnificationFilter,maximumAnisotropy:e.maximumAnisotropy})}var Q7=B_t;var Bqi=T(S(),1),Y_t={FLOAT:"float",VEC2:"vec2",VEC3:"vec3",VEC4:"vec4",MAT2:"mat2",MAT3:"mat2",MAT4:"mat4"},j7=Object.freeze(Y_t);var Hqi=T(S(),1);function O_t(e){async function t({data:i}){let o=[],r={id:i.id,result:void 0,error:void 0};self.CESIUM_BASE_URL=i.baseUrl;try{let s=await e(i.parameters,o);r.result=s}catch(s){s instanceof Error?r.error={name:s.name,message:s.message,stack:s.stack}:r.error=s}i.canTransferArrayBuffer||(o.length=0);try{postMessage(r,o)}catch(s){r.result=void 0,r.error=`postMessage failed with error: ${Oh(s)} with responseMessage: ${JSON.stringify(r)}`,postMessage(r)}}function n(i){postMessage({id:i.data?.id,error:`postMessage failed with error: ${JSON.stringify(i)}`})}return self.onmessage=t,self.onmessageerror=n,self}var q7=O_t;globalThis.CESIUM_VERSION="1.118";var $1o=T(S(),1);var Exo=T(S(),1);var Lxo=T(S(),1);var bxo=T(S(),1),gA;typeof ko<"u"&&(gA=ko);(function(){/*! * Knockout JavaScript library v3.5.1 * (c) The Knockout.js team - http://knockoutjs.com/ * License: MIT (http://www.opensource.org/licenses/mit-license.php) */(function(){(function(e){var t=this||(0,eval)("this"),n=t.document,i=t.navigator,o=t.jQuery,r=t.JSON;o||typeof jQuery>"u"||(o=jQuery),function(s){s(t.ko={})}(function(s,a){function c(b,R){return b===null||typeof b in x?b===R:!1}function d(b,R){var E;return function(){E||(E=f.a.setTimeout(function(){E=e,b()},R))}}function u(b,R){var E;return function(){clearTimeout(E),E=f.a.setTimeout(b,R)}}function m(b,R){R&&R!=="change"?R==="beforeChange"?this.pc(b):this.gb(b,R):this.qc(b)}function p(b,R){R!==null&&R.s&&R.s()}function g(b,R){var E=this.qd,I=E[Z];I.ra||(this.Qb&&this.mb[R]?(E.uc(R,b,this.mb[R]),this.mb[R]=null,--this.Qb):I.I[R]||E.uc(R,b,I.J?{da:b}:E.$c(b)),b.Ja&&b.gd())}var f=typeof s<"u"?s:{};f.b=function(b,R){for(var E=b.split("."),I=f,w=0;w<E.length-1;w++)I=I[E[w]];I[E[E.length-1]]=R},f.L=function(b,R,E){b[R]=E},f.version="3.5.1",f.b("version",f.version),f.options={deferUpdates:!1,useOnlyNativeEvents:!1,foreachHidesDestroyed:!1},f.a=function(){function b(z,j){for(var q in z)w.call(z,q)&&j(q,z[q])}function R(z,j){if(j)for(var q in j)w.call(j,q)&&(z[q]=j[q]);return z}function E(z,j){return z.__proto__=j,z}function I(z,j,q,be){var Te=z[j].match(H)||[];f.a.D(q.match(H),function(ae){f.a.Na(Te,ae,be)}),z[j]=Te.join(" ")}var w=Object.prototype.hasOwnProperty,N={__proto__:[]}instanceof Array,B=typeof Symbol=="function",U={},O={};U[i&&/Firefox\/2/i.test(i.userAgent)?"KeyboardEvent":"UIEvents"]=["keyup","keydown","keypress"],U.MouseEvents="click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave".split(" "),b(U,function(z,j){if(j.length)for(var q=0,be=j.length;q<be;q++)O[j[q]]=z});var k={propertychange:!0},J=n&&function(){for(var z=3,j=n.createElement("div"),q=j.getElementsByTagName("i");j.innerHTML="<!--[if gt IE "+ ++z+"]><i></i><![endif]-->",q[0];);return 4<z?z:e}(),H=/\S+/g,ee;return{Jc:["authenticity_token",/^__RequestVerificationToken(_.*)?$/],D:function(z,j,q){for(var be=0,Te=z.length;be<Te;be++)j.call(q,z[be],be,z)},A:typeof Array.prototype.indexOf=="function"?function(z,j){return Array.prototype.indexOf.call(z,j)}:function(z,j){for(var q=0,be=z.length;q<be;q++)if(z[q]===j)return q;return-1},Lb:function(z,j,q){for(var be=0,Te=z.length;be<Te;be++)if(j.call(q,z[be],be,z))return z[be];return e},Pa:function(z,j){var q=f.a.A(z,j);0<q?z.splice(q,1):q===0&&z.shift()},wc:function(z){var j=[];return z&&f.a.D(z,function(q){0>f.a.A(j,q)&&j.push(q)}),j},Mb:function(z,j,q){var be=[];if(z)for(var Te=0,ae=z.length;Te<ae;Te++)be.push(j.call(q,z[Te],Te));return be},jb:function(z,j,q){var be=[];if(z)for(var Te=0,ae=z.length;Te<ae;Te++)j.call(q,z[Te],Te)&&be.push(z[Te]);return be},Nb:function(z,j){if(j instanceof Array)z.push.apply(z,j);else for(var q=0,be=j.length;q<be;q++)z.push(j[q]);return z},Na:function(z,j,q){var be=f.a.A(f.a.bc(z),j);0>be?q&&z.push(j):q||z.splice(be,1)},Ba:N,extend:R,setPrototypeOf:E,Ab:N?E:R,P:b,Ga:function(z,j,q){if(!z)return z;var be={},Te;for(Te in z)w.call(z,Te)&&(be[Te]=j.call(q,z[Te],Te,z));return be},Tb:function(z){for(;z.firstChild;)f.removeNode(z.firstChild)},Yb:function(z){z=f.a.la(z);for(var j=(z[0]&&z[0].ownerDocument||n).createElement("div"),q=0,be=z.length;q<be;q++)j.appendChild(f.oa(z[q]));return j},Ca:function(z,j){for(var q=0,be=z.length,Te=[];q<be;q++){var ae=z[q].cloneNode(!0);Te.push(j?f.oa(ae):ae)}return Te},va:function(z,j){if(f.a.Tb(z),j)for(var q=0,be=j.length;q<be;q++)z.appendChild(j[q])},Xc:function(z,j){var q=z.nodeType?[z]:z;if(0<q.length){for(var be=q[0],Te=be.parentNode,ae=0,ye=j.length;ae<ye;ae++)Te.insertBefore(j[ae],be);for(ae=0,ye=q.length;ae<ye;ae++)f.removeNode(q[ae])}},Ua:function(z,j){if(z.length){for(j=j.nodeType===8&&j.parentNode||j;z.length&&z[0].parentNode!==j;)z.splice(0,1);for(;1<z.length&&z[z.length-1].parentNode!==j;)z.length--;if(1<z.length){var q=z[0],be=z[z.length-1];for(z.length=0;q!==be;)z.push(q),q=q.nextSibling;z.push(be)}}return z},Zc:function(z,j){7>J?z.setAttribute("selected",j):z.selected=j},Db:function(z){return z===null||z===e?"":z.trim?z.trim():z.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")},Ud:function(z,j){return z=z||"",j.length>z.length?!1:z.substring(0,j.length)===j},vd:function(z,j){if(z===j)return!0;if(z.nodeType===11)return!1;if(j.contains)return j.contains(z.nodeType!==1?z.parentNode:z);if(j.compareDocumentPosition)return(j.compareDocumentPosition(z)&16)==16;for(;z&&z!=j;)z=z.parentNode;return!!z},Sb:function(z){return f.a.vd(z,z.ownerDocument.documentElement)},kd:function(z){return!!f.a.Lb(z,f.a.Sb)},R:function(z){return z&&z.tagName&&z.tagName.toLowerCase()},Ac:function(z){return f.onError?function(){try{return z.apply(this,arguments)}catch(j){throw f.onError&&f.onError(j),j}}:z},setTimeout:function(z,j){return setTimeout(f.a.Ac(z),j)},Gc:function(z){setTimeout(function(){throw f.onError&&f.onError(z),z},0)},B:function(z,j,q){var be=f.a.Ac(q);if(q=k[j],f.options.useOnlyNativeEvents||q||!o)if(q||typeof z.addEventListener!="function")if(typeof z.attachEvent<"u"){var Te=function(ye){be.call(z,ye)},ae="on"+j;z.attachEvent(ae,Te),f.a.K.za(z,function(){z.detachEvent(ae,Te)})}else throw Error("Browser doesn't support addEventListener or attachEvent");else z.addEventListener(j,be,!1);else ee||(ee=typeof o(z).on=="function"?"on":"bind"),o(z)[ee](j,be)},Fb:function(z,j){if(!z||!z.nodeType)throw Error("element must be a DOM node when calling triggerEvent");var q;if(f.a.R(z)==="input"&&z.type&&j.toLowerCase()=="click"?(q=z.type,q=q=="checkbox"||q=="radio"):q=!1,f.options.useOnlyNativeEvents||!o||q)if(typeof n.createEvent=="function")if(typeof z.dispatchEvent=="function")q=n.createEvent(O[j]||"HTMLEvents"),q.initEvent(j,!0,!0,t,0,0,0,0,0,!1,!1,!1,!1,0,z),z.dispatchEvent(q);else throw Error("The supplied element doesn't support dispatchEvent");else if(q&&z.click)z.click();else if(typeof z.fireEvent<"u")z.fireEvent("on"+j);else throw Error("Browser doesn't support triggering events");else o(z).trigger(j)},f:function(z){return f.O(z)?z():z},bc:function(z){return f.O(z)?z.v():z},Eb:function(z,j,q){var be;j&&(typeof z.classList=="object"?(be=z.classList[q?"add":"remove"],f.a.D(j.match(H),function(Te){be.call(z.classList,Te)})):typeof z.className.baseVal=="string"?I(z.className,"baseVal",j,q):I(z,"className",j,q))},Bb:function(z,j){var q=f.a.f(j);(q===null||q===e)&&(q="");var be=f.h.firstChild(z);!be||be.nodeType!=3||f.h.nextSibling(be)?f.h.va(z,[z.ownerDocument.createTextNode(q)]):be.data=q,f.a.Ad(z)},Yc:function(z,j){if(z.name=j,7>=J)try{var q=z.name.replace(/[&<>'"]/g,function(be){return"&#"+be.charCodeAt(0)+";"});z.mergeAttributes(n.createElement("<input name='"+q+"'/>"),!1)}catch{}},Ad:function(z){9<=J&&(z=z.nodeType==1?z:z.parentNode,z.style&&(z.style.zoom=z.style.zoom))},wd:function(z){if(J){var j=z.style.width;z.style.width=0,z.style.width=j}},Pd:function(z,j){z=f.a.f(z),j=f.a.f(j);for(var q=[],be=z;be<=j;be++)q.push(be);return q},la:function(z){for(var j=[],q=0,be=z.length;q<be;q++)j.push(z[q]);return j},Da:function(z){return B?Symbol(z):z},Zd:J===6,$d:J===7,W:J,Lc:function(z,j){for(var q=f.a.la(z.getElementsByTagName("input")).concat(f.a.la(z.getElementsByTagName("textarea"))),be=typeof j=="string"?function(ye){return ye.name===j}:function(ye){return j.test(ye.name)},Te=[],ae=q.length-1;0<=ae;ae--)be(q[ae])&&Te.push(q[ae]);return Te},Nd:function(z){return typeof z=="string"&&(z=f.a.Db(z))?r&&r.parse?r.parse(z):new Function("return "+z)():null},hc:function(z,j,q){if(!r||!r.stringify)throw Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js");return r.stringify(f.a.f(z),j,q)},Od:function(z,j,q){q=q||{};var be=q.params||{},Te=q.includeFields||this.Jc,ae=z;if(typeof z=="object"&&f.a.R(z)==="form")for(var ae=z.action,ye=Te.length-1;0<=ye;ye--)for(var Se=f.a.Lc(z,Te[ye]),Le=Se.length-1;0<=Le;Le--)be[Se[Le].name]=Se[Le].value;j=f.a.f(j);var Xe=n.createElement("form");Xe.style.display="none",Xe.action=ae,Xe.method="post";for(var Pe in j)z=n.createElement("input"),z.type="hidden",z.name=Pe,z.value=f.a.hc(f.a.f(j[Pe])),Xe.appendChild(z);b(be,function(ke,Pt){var Ot=n.createElement("input");Ot.type="hidden",Ot.name=ke,Ot.value=Pt,Xe.appendChild(Ot)}),n.body.appendChild(Xe),q.submitter?q.submitter(Xe):Xe.submit(),setTimeout(function(){Xe.parentNode.removeChild(Xe)},0)}}}(),f.b("utils",f.a),f.b("utils.arrayForEach",f.a.D),f.b("utils.arrayFirst",f.a.Lb),f.b("utils.arrayFilter",f.a.jb),f.b("utils.arrayGetDistinctValues",f.a.wc),f.b("utils.arrayIndexOf",f.a.A),f.b("utils.arrayMap",f.a.Mb),f.b("utils.arrayPushAll",f.a.Nb),f.b("utils.arrayRemoveItem",f.a.Pa),f.b("utils.cloneNodes",f.a.Ca),f.b("utils.createSymbolOrString",f.a.Da),f.b("utils.extend",f.a.extend),f.b("utils.fieldsIncludedWithJsonPost",f.a.Jc),f.b("utils.getFormFields",f.a.Lc),f.b("utils.objectMap",f.a.Ga),f.b("utils.peekObservable",f.a.bc),f.b("utils.postJson",f.a.Od),f.b("utils.parseJson",f.a.Nd),f.b("utils.registerEventHandler",f.a.B),f.b("utils.stringifyJson",f.a.hc),f.b("utils.range",f.a.Pd),f.b("utils.toggleDomNodeCssClass",f.a.Eb),f.b("utils.triggerEvent",f.a.Fb),f.b("utils.unwrapObservable",f.a.f),f.b("utils.objectForEach",f.a.P),f.b("utils.addOrRemoveItem",f.a.Na),f.b("utils.setTextContent",f.a.Bb),f.b("unwrap",f.a.f),Function.prototype.bind||(Function.prototype.bind=function(b){var R=this;if(arguments.length===1)return function(){return R.apply(b,arguments)};var E=Array.prototype.slice.call(arguments,1);return function(){var I=E.slice(0);return I.push.apply(I,arguments),R.apply(b,I)}}),f.a.g=new function(){var b=0,R="__ko__"+new Date().getTime(),E={},I,w;return f.a.W?(I=function(N,B){var U=N[R];if(!U||U==="null"||!E[U]){if(!B)return e;U=N[R]="ko"+b++,E[U]={}}return E[U]},w=function(N){var B=N[R];return B?(delete E[B],N[R]=null,!0):!1}):(I=function(N,B){var U=N[R];return!U&&B&&(U=N[R]={}),U},w=function(N){return N[R]?(delete N[R],!0):!1}),{get:function(N,B){var U=I(N,!1);return U&&U[B]},set:function(N,B,U){(N=I(N,U!==e))&&(N[B]=U)},Ub:function(N,B,U){return N=I(N,!0),N[B]||(N[B]=U)},clear:w,Z:function(){return b+++R}}},f.b("utils.domData",f.a.g),f.b("utils.domData.clear",f.a.g.clear),f.a.K=new function(){function b(B,U){var O=f.a.g.get(B,I);return O===e&&U&&(O=[],f.a.g.set(B,I,O)),O}function R(B){var U=b(B,!1);if(U)for(var U=U.slice(0),O=0;O<U.length;O++)U[O](B);f.a.g.clear(B),f.a.K.cleanExternalData(B),N[B.nodeType]&&E(B.childNodes,!0)}function E(B,U){for(var O=[],k,J=0;J<B.length;J++)if((!U||B[J].nodeType===8)&&(R(O[O.length]=k=B[J]),B[J]!==k))for(;J--&&f.a.A(O,B[J])==-1;);}var I=f.a.g.Z(),w={1:!0,8:!0,9:!0},N={1:!0,9:!0};return{za:function(B,U){if(typeof U!="function")throw Error("Callback must be a function");b(B,!0).push(U)},yb:function(B,U){var O=b(B,!1);O&&(f.a.Pa(O,U),O.length==0&&f.a.g.set(B,I,e))},oa:function(B){return f.u.G(function(){w[B.nodeType]&&(R(B),N[B.nodeType]&&E(B.getElementsByTagName("*")))}),B},removeNode:function(B){f.oa(B),B.parentNode&&B.parentNode.removeChild(B)},cleanExternalData:function(B){o&&typeof o.cleanData=="function"&&o.cleanData([B])}}},f.oa=f.a.K.oa,f.removeNode=f.a.K.removeNode,f.b("cleanNode",f.oa),f.b("removeNode",f.removeNode),f.b("utils.domNodeDisposal",f.a.K),f.b("utils.domNodeDisposal.addDisposeCallback",f.a.K.za),f.b("utils.domNodeDisposal.removeDisposeCallback",f.a.K.yb),function(){var b=[0,"",""],R=[1,"<table>","</table>"],E=[3,"<table><tbody><tr>","</tr></tbody></table>"],I=[1,"<select multiple='multiple'>","</select>"],w={thead:R,tbody:R,tfoot:R,tr:[2,"<table><tbody>","</tbody></table>"],td:E,th:E,option:I,optgroup:I},N=8>=f.a.W;f.a.ua=function(B,U){var O;if(o){if(o.parseHTML)O=o.parseHTML(B,U)||[];else if((O=o.clean([B],U))&&O[0]){for(var k=O[0];k.parentNode&&k.parentNode.nodeType!==11;)k=k.parentNode;k.parentNode&&k.parentNode.removeChild(k)}}else{(O=U)||(O=n);var k=O.parentWindow||O.defaultView||t,J=f.a.Db(B).toLowerCase(),H=O.createElement("div"),ee;for(ee=(J=J.match(/^(?:\x3c!--.*?--\x3e\s*?)*?<([a-z]+)[\s>]/))&&w[J[1]]||b,J=ee[0],ee="ignored<div>"+ee[1]+B+ee[2]+"</div>",typeof k.innerShiv=="function"?H.appendChild(k.innerShiv(ee)):(N&&O.body.appendChild(H),H.innerHTML=ee,N&&H.parentNode.removeChild(H));J--;)H=H.lastChild;O=f.a.la(H.lastChild.childNodes)}return O},f.a.Md=function(B,U){var O=f.a.ua(B,U);return O.length&&O[0].parentElement||f.a.Yb(O)},f.a.fc=function(B,U){if(f.a.Tb(B),U=f.a.f(U),U!==null&&U!==e)if(typeof U!="string"&&(U=U.toString()),o)o(B).html(U);else for(var O=f.a.ua(U,B.ownerDocument),k=0;k<O.length;k++)B.appendChild(O[k])}}(),f.b("utils.parseHtmlFragment",f.a.ua),f.b("utils.setHtml",f.a.fc),f.aa=function(){function b(E,I){if(E){if(E.nodeType==8){var w=f.aa.Uc(E.nodeValue);w!=null&&I.push({ud:E,Kd:w})}else if(E.nodeType==1)for(var w=0,N=E.childNodes,B=N.length;w<B;w++)b(N[w],I)}}var R={};return{Xb:function(E){if(typeof E!="function")throw Error("You can only pass a function to ko.memoization.memoize()");var I=(4294967296*(1+Math.random())|0).toString(16).substring(1)+(4294967296*(1+Math.random())|0).toString(16).substring(1);return R[I]=E,"<!--[ko_memo:"+I+"]-->"},bd:function(E,I){var w=R[E];if(w===e)throw Error("Couldn't find any memo with ID "+E+". Perhaps it's already been unmemoized.");try{return w.apply(null,I||[]),!0}finally{delete R[E]}},cd:function(E,I){var w=[];b(E,w);for(var N=0,B=w.length;N<B;N++){var U=w[N].ud,O=[U];I&&f.a.Nb(O,I),f.aa.bd(w[N].Kd,O),U.nodeValue="",U.parentNode&&U.parentNode.removeChild(U)}},Uc:function(E){return(E=E.match(/^\[ko_memo\:(.*?)\]$/))?E[1]:null}}}(),f.b("memoization",f.aa),f.b("memoization.memoize",f.aa.Xb),f.b("memoization.unmemoize",f.aa.bd),f.b("memoization.parseMemoText",f.aa.Uc),f.b("memoization.unmemoizeDomNodeAndDescendants",f.aa.cd),f.na=function(){function b(){if(w){for(var U=w,O=0,k;B<w;)if(k=I[B++]){if(B>U){if(5e3<=++O){B=w,f.a.Gc(Error("'Too much recursion' after processing "+O+" task groups."));break}U=w}try{k()}catch(J){f.a.Gc(J)}}}}function R(){b(),B=w=I.length=0}var E,I=[],w=0,N=1,B=0;return t.MutationObserver?E=function(U){var O=n.createElement("div");return new MutationObserver(U).observe(O,{attributes:!0}),function(){O.classList.toggle("foo")}}(R):E=n&&"onreadystatechange"in n.createElement("script")?function(U){var O=n.createElement("script");O.onreadystatechange=function(){O.onreadystatechange=null,n.documentElement.removeChild(O),O=null,U()},n.documentElement.appendChild(O)}:function(U){setTimeout(U,0)},{scheduler:E,zb:function(U){return w||f.na.scheduler(R),I[w++]=U,N++},cancel:function(U){U=U-(N-w),U>=B&&U<w&&(I[U]=null)},resetForTesting:function(){var U=w-B;return B=w=I.length=0,U},Sd:b}}(),f.b("tasks",f.na),f.b("tasks.schedule",f.na.zb),f.b("tasks.runEarly",f.na.Sd),f.Ta={throttle:function(b,R){b.throttleEvaluation=R;var E=null;return f.$({read:b,write:function(I){clearTimeout(E),E=f.a.setTimeout(function(){b(I)},R)}})},rateLimit:function(b,R){var E,I,w;typeof R=="number"?E=R:(E=R.timeout,I=R.method),b.Hb=!1,w=typeof I=="function"?I:I=="notifyWhenChangesStop"?u:d,b.ub(function(N){return w(N,E,R)})},deferred:function(b,R){if(R!==!0)throw Error("The 'deferred' extender only accepts the value 'true', because it is not supported to turn deferral off once enabled.");b.Hb||(b.Hb=!0,b.ub(function(E){var I,w=!1;return function(){if(!w){f.na.cancel(I),I=f.na.zb(E);try{w=!0,b.notifySubscribers(e,"dirty")}finally{w=!1}}}}))},notify:function(b,R){b.equalityComparer=R=="always"?null:c}};var x={undefined:1,boolean:1,number:1,string:1};f.b("extenders",f.Ta),f.ic=function(b,R,E){this.da=b,this.lc=R,this.mc=E,this.Ib=!1,this.fb=this.Jb=null,f.L(this,"dispose",this.s),f.L(this,"disposeWhenNodeIsRemoved",this.l)},f.ic.prototype.s=function(){this.Ib||(this.fb&&f.a.K.yb(this.Jb,this.fb),this.Ib=!0,this.mc(),this.da=this.lc=this.mc=this.Jb=this.fb=null)},f.ic.prototype.l=function(b){this.Jb=b,f.a.K.za(b,this.fb=this.s.bind(this))},f.T=function(){f.a.Ab(this,_),_.qb(this)};var _={qb:function(b){b.U={change:[]},b.sc=1},subscribe:function(b,R,E){var I=this;E=E||"change";var w=new f.ic(I,R?b.bind(R):b,function(){f.a.Pa(I.U[E],w),I.hb&&I.hb(E)});return I.Qa&&I.Qa(E),I.U[E]||(I.U[E]=[]),I.U[E].push(w),w},notifySubscribers:function(b,R){if(R=R||"change",R==="change"&&this.Gb(),this.Wa(R)){var E=R==="change"&&this.ed||this.U[R].slice(0);try{f.u.xc();for(var I=0,w;w=E[I];++I)w.Ib||w.lc(b)}finally{f.u.end()}}},ob:function(){return this.sc},Dd:function(b){return this.ob()!==b},Gb:function(){++this.sc},ub:function(b){var R=this,E=f.O(R),I,w,N,B,U;R.gb||(R.gb=R.notifySubscribers,R.notifySubscribers=m);var O=b(function(){R.Ja=!1,E&&B===R&&(B=R.nc?R.nc():R());var k=w||U&&R.sb(N,B);U=w=I=!1,k&&R.gb(N=B)});R.qc=function(k,J){J&&R.Ja||(U=!J),R.ed=R.U.change.slice(0),R.Ja=I=!0,B=k,O()},R.pc=function(k){I||(N=k,R.gb(k,"beforeChange"))},R.rc=function(){U=!0},R.gd=function(){R.sb(N,R.v(!0))&&(w=!0)}},Wa:function(b){return this.U[b]&&this.U[b].length},Bd:function(b){if(b)return this.U[b]&&this.U[b].length||0;var R=0;return f.a.P(this.U,function(E,I){E!=="dirty"&&(R+=I.length)}),R},sb:function(b,R){return!this.equalityComparer||!this.equalityComparer(b,R)},toString:function(){return"[object Object]"},extend:function(b){var R=this;return b&&f.a.P(b,function(E,I){var w=f.Ta[E];typeof w=="function"&&(R=w(R,I)||R)}),R}};f.L(_,"init",_.qb),f.L(_,"subscribe",_.subscribe),f.L(_,"extend",_.extend),f.L(_,"getSubscriptionsCount",_.Bd),f.a.Ba&&f.a.setPrototypeOf(_,Function.prototype),f.T.fn=_,f.Qc=function(b){return b!=null&&typeof b.subscribe=="function"&&typeof b.notifySubscribers=="function"},f.b("subscribable",f.T),f.b("isSubscribable",f.Qc),f.S=f.u=function(){function b(N){E.push(I),I=N}function R(){I=E.pop()}var E=[],I,w=0;return{xc:b,end:R,cc:function(N){if(I){if(!f.Qc(N))throw Error("Only subscribable things can act as dependencies");I.od.call(I.pd,N,N.fd||(N.fd=++w))}},G:function(N,B,U){try{return b(),N.apply(B,U||[])}finally{R()}},qa:function(){if(I)return I.o.qa()},Va:function(){if(I)return I.o.Va()},Ya:function(){if(I)return I.Ya},o:function(){if(I)return I.o}}}(),f.b("computedContext",f.S),f.b("computedContext.getDependenciesCount",f.S.qa),f.b("computedContext.getDependencies",f.S.Va),f.b("computedContext.isInitial",f.S.Ya),f.b("computedContext.registerDependency",f.S.cc),f.b("ignoreDependencies",f.Yd=f.u.G);var C=f.a.Da("_latestValue");f.ta=function(b){function R(){return 0<arguments.length?(R.sb(R[C],arguments[0])&&(R.ya(),R[C]=arguments[0],R.xa()),this):(f.u.cc(R),R[C])}return R[C]=b,f.a.Ba||f.a.extend(R,f.T.fn),f.T.fn.qb(R),f.a.Ab(R,V),f.options.deferUpdates&&f.Ta.deferred(R,!0),R};var V={equalityComparer:c,v:function(){return this[C]},xa:function(){this.notifySubscribers(this[C],"spectate"),this.notifySubscribers(this[C])},ya:function(){this.notifySubscribers(this[C],"beforeChange")}};f.a.Ba&&f.a.setPrototypeOf(V,f.T.fn);var L=f.ta.Ma="__ko_proto__";V[L]=f.ta,f.O=function(b){if((b=typeof b=="function"&&b[L])&&b!==V[L]&&b!==f.o.fn[L])throw Error("Invalid object that looks like an observable; possibly from another Knockout instance");return!!b},f.Za=function(b){return typeof b=="function"&&(b[L]===V[L]||b[L]===f.o.fn[L]&&b.Nc)},f.b("observable",f.ta),f.b("isObservable",f.O),f.b("isWriteableObservable",f.Za),f.b("isWritableObservable",f.Za),f.b("observable.fn",V),f.L(V,"peek",V.v),f.L(V,"valueHasMutated",V.xa),f.L(V,"valueWillMutate",V.ya),f.Ha=function(b){if(b=b||[],typeof b!="object"||!("length"in b))throw Error("The argument passed when initializing an observable array must be an array, or null, or undefined.");return b=f.ta(b),f.a.Ab(b,f.Ha.fn),b.extend({trackArrayChanges:!0})},f.Ha.fn={remove:function(b){for(var R=this.v(),E=[],I=typeof b!="function"||f.O(b)?function(B){return B===b}:b,w=0;w<R.length;w++){var N=R[w];if(I(N)){if(E.length===0&&this.ya(),R[w]!==N)throw Error("Array modified during remove; cannot remove item");E.push(N),R.splice(w,1),w--}}return E.length&&this.xa(),E},removeAll:function(b){if(b===e){var R=this.v(),E=R.slice(0);return this.ya(),R.splice(0,R.length),this.xa(),E}return b?this.remove(function(I){return 0<=f.a.A(b,I)}):[]},destroy:function(b){var R=this.v(),E=typeof b!="function"||f.O(b)?function(N){return N===b}:b;this.ya();for(var I=R.length-1;0<=I;I--){var w=R[I];E(w)&&(w._destroy=!0)}this.xa()},destroyAll:function(b){return b===e?this.destroy(function(){return!0}):b?this.destroy(function(R){return 0<=f.a.A(b,R)}):[]},indexOf:function(b){var R=this();return f.a.A(R,b)},replace:function(b,R){var E=this.indexOf(b);0<=E&&(this.ya(),this.v()[E]=R,this.xa())},sorted:function(b){var R=this().slice(0);return b?R.sort(b):R.sort()},reversed:function(){return this().slice(0).reverse()}},f.a.Ba&&f.a.setPrototypeOf(f.Ha.fn,f.ta.fn),f.a.D("pop push reverse shift sort splice unshift".split(" "),function(b){f.Ha.fn[b]=function(){var R=this.v();this.ya(),this.zc(R,b,arguments);var E=R[b].apply(R,arguments);return this.xa(),E===R?this:E}}),f.a.D(["slice"],function(b){f.Ha.fn[b]=function(){var R=this();return R[b].apply(R,arguments)}}),f.Pc=function(b){return f.O(b)&&typeof b.remove=="function"&&typeof b.push=="function"},f.b("observableArray",f.Ha),f.b("isObservableArray",f.Pc),f.Ta.trackArrayChanges=function(b,R){function E(){function H(){if(U){var ee=[].concat(b.v()||[]),z;b.Wa("arrayChange")&&((!w||1<U)&&(w=f.a.Pb(O,ee,b.Ob)),z=w),O=ee,w=null,U=0,z&&z.length&&b.notifySubscribers(z,"arrayChange")}}I?H():(I=!0,B=b.subscribe(function(){++U},null,"spectate"),O=[].concat(b.v()||[]),w=null,N=b.subscribe(H))}if(b.Ob={},R&&typeof R=="object"&&f.a.extend(b.Ob,R),b.Ob.sparse=!0,!b.zc){var I=!1,w=null,N,B,U=0,O,k=b.Qa,J=b.hb;b.Qa=function(H){k&&k.call(b,H),H==="arrayChange"&&E()},b.hb=function(H){J&&J.call(b,H),H!=="arrayChange"||b.Wa("arrayChange")||(N&&N.s(),B&&B.s(),B=N=null,I=!1,O=e)},b.zc=function(H,ee,z){function j(Xe,Pe,ke){return q[q.length]={status:Xe,value:Pe,index:ke}}if(I&&!U){var q=[],be=H.length,Te=z.length,ae=0;switch(ee){case"push":ae=be;case"unshift":for(ee=0;ee<Te;ee++)j("added",z[ee],ae+ee);break;case"pop":ae=be-1;case"shift":be&&j("deleted",H[ae],ae);break;case"splice":ee=Math.min(Math.max(0,0>z[0]?be+z[0]:z[0]),be);for(var be=Te===1?be:Math.min(ee+(z[1]||0),be),Te=ee+Te-2,ae=Math.max(be,Te),ye=[],Se=[],Le=2;ee<ae;++ee,++Le)ee<be&&Se.push(j("deleted",H[ee],ee)),ee<Te&&ye.push(j("added",z[Le],ee));f.a.Kc(Se,ye);break;default:return}w=q}}}};var Z=f.a.Da("_state");f.o=f.$=function(b,R,E){function I(){if(0<arguments.length){if(typeof w=="function")w.apply(N.nb,arguments);else throw Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.");return this}return N.ra||f.u.cc(I),(N.ka||N.J&&I.Xa())&&I.ha(),N.X}if(typeof b=="object"?E=b:(E=E||{},b&&(E.read=b)),typeof E.read!="function")throw Error("Pass a function that returns the value of the ko.computed");var w=E.write,N={X:e,sa:!0,ka:!0,rb:!1,jc:!1,ra:!1,wb:!1,J:!1,Wc:E.read,nb:R||E.owner,l:E.disposeWhenNodeIsRemoved||E.l||null,Sa:E.disposeWhen||E.Sa,Rb:null,I:{},V:0,Ic:null};return I[Z]=N,I.Nc=typeof w=="function",f.a.Ba||f.a.extend(I,f.T.fn),f.T.fn.qb(I),f.a.Ab(I,G),E.pure?(N.wb=!0,N.J=!0,f.a.extend(I,X)):E.deferEvaluation&&f.a.extend(I,v),f.options.deferUpdates&&f.Ta.deferred(I,!0),N.l&&(N.jc=!0,N.l.nodeType||(N.l=null)),N.J||E.deferEvaluation||I.ha(),N.l&&I.ja()&&f.a.K.za(N.l,N.Rb=function(){I.s()}),I};var G={equalityComparer:c,qa:function(){return this[Z].V},Va:function(){var b=[];return f.a.P(this[Z].I,function(R,E){b[E.Ka]=E.da}),b},Vb:function(b){if(!this[Z].V)return!1;var R=this.Va();return f.a.A(R,b)!==-1?!0:!!f.a.Lb(R,function(E){return E.Vb&&E.Vb(b)})},uc:function(b,R,E){if(this[Z].wb&&R===this)throw Error("A 'pure' computed must not be called recursively");this[Z].I[b]=E,E.Ka=this[Z].V++,E.La=R.ob()},Xa:function(){var b,R,E=this[Z].I;for(b in E)if(Object.prototype.hasOwnProperty.call(E,b)&&(R=E[b],this.Ia&&R.da.Ja||R.da.Dd(R.La)))return!0},Jd:function(){this.Ia&&!this[Z].rb&&this.Ia(!1)},ja:function(){var b=this[Z];return b.ka||0<b.V},Rd:function(){this.Ja?this[Z].ka&&(this[Z].sa=!0):this.Hc()},$c:function(b){if(b.Hb){var R=b.subscribe(this.Jd,this,"dirty"),E=b.subscribe(this.Rd,this);return{da:b,s:function(){R.s(),E.s()}}}return b.subscribe(this.Hc,this)},Hc:function(){var b=this,R=b.throttleEvaluation;R&&0<=R?(clearTimeout(this[Z].Ic),this[Z].Ic=f.a.setTimeout(function(){b.ha(!0)},R)):b.Ia?b.Ia(!0):b.ha(!0)},ha:function(b){var R=this[Z],E=R.Sa,I=!1;if(!R.rb&&!R.ra){if(R.l&&!f.a.Sb(R.l)||E&&E()){if(!R.jc){this.s();return}}else R.jc=!1;R.rb=!0;try{I=this.zd(b)}finally{R.rb=!1}return I}},zd:function(b){var R=this[Z],I=!1,E=R.wb?e:!R.V,I={qd:this,mb:R.I,Qb:R.V};f.u.xc({pd:I,od:g,o:this,Ya:E}),R.I={},R.V=0;var w=this.yd(R,I);return R.V?I=this.sb(R.X,w):(this.s(),I=!0),I&&(R.J?this.Gb():this.notifySubscribers(R.X,"beforeChange"),R.X=w,this.notifySubscribers(R.X,"spectate"),!R.J&&b&&this.notifySubscribers(R.X),this.rc&&this.rc()),E&&this.notifySubscribers(R.X,"awake"),I},yd:function(b,R){try{var E=b.Wc;return b.nb?E.call(b.nb):E()}finally{f.u.end(),R.Qb&&!b.J&&f.a.P(R.mb,p),b.sa=b.ka=!1}},v:function(b){var R=this[Z];return(R.ka&&(b||!R.V)||R.J&&this.Xa())&&this.ha(),R.X},ub:function(b){f.T.fn.ub.call(this,b),this.nc=function(){return this[Z].J||(this[Z].sa?this.ha():this[Z].ka=!1),this[Z].X},this.Ia=function(R){this.pc(this[Z].X),this[Z].ka=!0,R&&(this[Z].sa=!0),this.qc(this,!R)}},s:function(){var b=this[Z];!b.J&&b.I&&f.a.P(b.I,function(R,E){E.s&&E.s()}),b.l&&b.Rb&&f.a.K.yb(b.l,b.Rb),b.I=e,b.V=0,b.ra=!0,b.sa=!1,b.ka=!1,b.J=!1,b.l=e,b.Sa=e,b.Wc=e,this.Nc||(b.nb=e)}},X={Qa:function(b){var R=this,E=R[Z];if(!E.ra&&E.J&&b=="change"){if(E.J=!1,E.sa||R.Xa())E.I=null,E.V=0,R.ha()&&R.Gb();else{var I=[];f.a.P(E.I,function(w,N){I[N.Ka]=w}),f.a.D(I,function(w,N){var B=E.I[w],U=R.$c(B.da);U.Ka=N,U.La=B.La,E.I[w]=U}),R.Xa()&&R.ha()&&R.Gb()}E.ra||R.notifySubscribers(E.X,"awake")}},hb:function(b){var R=this[Z];R.ra||b!="change"||this.Wa("change")||(f.a.P(R.I,function(E,I){I.s&&(R.I[E]={da:I.da,Ka:I.Ka,La:I.La},I.s())}),R.J=!0,this.notifySubscribers(e,"asleep"))},ob:function(){var b=this[Z];return b.J&&(b.sa||this.Xa())&&this.ha(),f.T.fn.ob.call(this)}},v={Qa:function(b){b!="change"&&b!="beforeChange"||this.v()}};f.a.Ba&&f.a.setPrototypeOf(G,f.T.fn);var P=f.ta.Ma;G[P]=f.o,f.Oc=function(b){return typeof b=="function"&&b[P]===G[P]},f.Fd=function(b){return f.Oc(b)&&b[Z]&&b[Z].wb},f.b("computed",f.o),f.b("dependentObservable",f.o),f.b("isComputed",f.Oc),f.b("isPureComputed",f.Fd),f.b("computed.fn",G),f.L(G,"peek",G.v),f.L(G,"dispose",G.s),f.L(G,"isActive",G.ja),f.L(G,"getDependenciesCount",G.qa),f.L(G,"getDependencies",G.Va),f.xb=function(b,R){return typeof b=="function"?f.o(b,R,{pure:!0}):(b=f.a.extend({},b),b.pure=!0,f.o(b,R))},f.b("pureComputed",f.xb),function(){function b(I,w,N){if(N=N||new E,I=w(I),typeof I!="object"||I===null||I===e||I instanceof RegExp||I instanceof Date||I instanceof String||I instanceof Number||I instanceof Boolean)return I;var B=I instanceof Array?[]:{};return N.save(I,B),R(I,function(U){var O=w(I[U]);switch(typeof O){case"boolean":case"number":case"string":case"function":B[U]=O;break;case"object":case"undefined":var k=N.get(O);B[U]=k!==e?k:b(O,w,N)}}),B}function R(I,w){if(I instanceof Array){for(var N=0;N<I.length;N++)w(N);typeof I.toJSON=="function"&&w("toJSON")}else for(N in I)w(N)}function E(){this.keys=[],this.values=[]}f.ad=function(I){if(arguments.length==0)throw Error("When calling ko.toJS, pass the object you want to convert.");return b(I,function(w){for(var N=0;f.O(w)&&10>N;N++)w=w();return w})},f.toJSON=function(I,w,N){return I=f.ad(I),f.a.hc(I,w,N)},E.prototype={constructor:E,save:function(I,w){var N=f.a.A(this.keys,I);0<=N?this.values[N]=w:(this.keys.push(I),this.values.push(w))},get:function(I){return I=f.a.A(this.keys,I),0<=I?this.values[I]:e}}}(),f.b("toJS",f.ad),f.b("toJSON",f.toJSON),f.Wd=function(b,R,E){function I(w){var N=f.xb(b,E).extend({ma:"always"}),B=N.subscribe(function(U){U&&(B.s(),w(U))});return N.notifySubscribers(N.v()),B}return typeof Promise!="function"||R?I(R.bind(E)):new Promise(I)},f.b("when",f.Wd),function(){f.w={M:function(b){switch(f.a.R(b)){case"option":return b.__ko__hasDomDataOptionValue__===!0?f.a.g.get(b,f.c.options.$b):7>=f.a.W?b.getAttributeNode("value")&&b.getAttributeNode("value").specified?b.value:b.text:b.value;case"select":return 0<=b.selectedIndex?f.w.M(b.options[b.selectedIndex]):e;default:return b.value}},cb:function(b,R,E){switch(f.a.R(b)){case"option":typeof R=="string"?(f.a.g.set(b,f.c.options.$b,e),"__ko__hasDomDataOptionValue__"in b&&delete b.__ko__hasDomDataOptionValue__,b.value=R):(f.a.g.set(b,f.c.options.$b,R),b.__ko__hasDomDataOptionValue__=!0,b.value=typeof R=="number"?R:"");break;case"select":(R===""||R===null)&&(R=e);for(var I=-1,w=0,N=b.options.length,B;w<N;++w)if(B=f.w.M(b.options[w]),B==R||B===""&&R===e){I=w;break}(E||0<=I||R===e&&1<b.size)&&(b.selectedIndex=I,f.a.W===6&&f.a.setTimeout(function(){b.selectedIndex=I},0));break;default:(R===null||R===e)&&(R=""),b.value=R}}}}(),f.b("selectExtensions",f.w),f.b("selectExtensions.readValue",f.w.M),f.b("selectExtensions.writeValue",f.w.cb),f.m=function(){function b(U){U=f.a.Db(U),U.charCodeAt(0)===123&&(U=U.slice(1,-1)),U+=` ,`;var O=[],k=U.match(I),J,H=[],ee=0;if(1<k.length){for(var z=0,j;j=k[z];++z){var q=j.charCodeAt(0);if(q===44){if(0>=ee){O.push(J&&H.length?{key:J,value:H.join("")}:{unknown:J||H.join("")}),J=ee=0,H=[];continue}}else if(q===58){if(!ee&&!J&&H.length===1){J=H.pop();continue}}else{if(q===47&&1<j.length&&(j.charCodeAt(1)===47||j.charCodeAt(1)===42))continue;q===47&&z&&1<j.length?(q=k[z-1].match(w))&&!N[q[0]]&&(U=U.substr(U.indexOf(j)+1),k=U.match(I),z=-1,j="/"):q===40||q===123||q===91?++ee:q===41||q===125||q===93?--ee:J||H.length||q!==34&&q!==39||(j=j.slice(1,-1))}H.push(j)}if(0<ee)throw Error("Unbalanced parentheses, braces, or brackets")}return O}var R=["true","false","null","undefined"],E=/^(?:[$_a-z][$\w]*|(.+)(\.\s*[$_a-z][$\w]*|\[.+\]))$/i,I=RegExp(`"(?:\\\\.|[^"])*"|'(?:\\\\.|[^'])*'|\`(?:\\\\.|[^\`])*\`|/\\*(?:[^*]|\\*+[^*/])*\\*+/|//.* |/(?:\\\\.|[^/])+/w*|[^\\s:,/][^,"'\`{}()/:[\\]]*[^\\s,"'\`{}()/:[\\]]|[^\\s]`,"g"),w=/[\])"'A-Za-z0-9_$]+$/,N={in:1,return:1,typeof:1},B={};return{Ra:[],wa:B,ac:b,vb:function(U,O){function k(q,be){var Te;if(!z){var ae=f.getBindingHandler(q);if(ae&&ae.preprocess&&!(be=ae.preprocess(be,q,k)))return;(ae=B[q])&&(Te=be,0<=f.a.A(R,Te)?Te=!1:(ae=Te.match(E),Te=ae===null?!1:ae[1]?"Object("+ae[1]+")"+ae[2]:Te),ae=Te),ae&&H.push("'"+(typeof B[q]=="string"?B[q]:q)+"':function(_z){"+Te+"=_z}")}ee&&(be="function(){return "+be+" }"),J.push("'"+q+"':"+be)}O=O||{};var J=[],H=[],ee=O.valueAccessors,z=O.bindingParams,j=typeof U=="string"?b(U):U;return f.a.D(j,function(q){k(q.key||q.unknown,q.value)}),H.length&&k("_ko_property_writers","{"+H.join(",")+" }"),J.join(",")},Id:function(U,O){for(var k=0;k<U.length;k++)if(U[k].key==O)return!0;return!1},eb:function(U,O,k,J,H){U&&f.O(U)?!f.Za(U)||H&&U.v()===J||U(J):(U=O.get("_ko_property_writers"))&&U[k]&&U[k](J)}}}(),f.b("expressionRewriting",f.m),f.b("expressionRewriting.bindingRewriteValidators",f.m.Ra),f.b("expressionRewriting.parseObjectLiteral",f.m.ac),f.b("expressionRewriting.preProcessBindings",f.m.vb),f.b("expressionRewriting._twoWayBindings",f.m.wa),f.b("jsonExpressionRewriting",f.m),f.b("jsonExpressionRewriting.insertPropertyAccessorsIntoJson",f.m.vb),function(){function b(k){return k.nodeType==8&&N.test(w?k.text:k.nodeValue)}function R(k){return k.nodeType==8&&B.test(w?k.text:k.nodeValue)}function E(k,J){for(var H=k,ee=1,z=[];H=H.nextSibling;){if(R(H)&&(f.a.g.set(H,O,!0),ee--,ee===0))return z;z.push(H),b(H)&&ee++}if(!J)throw Error("Cannot find closing comment tag to match: "+k.nodeValue);return null}function I(k,J){var H=E(k,J);return H?0<H.length?H[H.length-1].nextSibling:k.nextSibling:null}var w=n&&n.createComment("test").text==="<!--test-->",N=w?/^\x3c!--\s*ko(?:\s+([\s\S]+))?\s*--\x3e$/:/^\s*ko(?:\s+([\s\S]+))?\s*$/,B=w?/^\x3c!--\s*\/ko\s*--\x3e$/:/^\s*\/ko\s*$/,U={ul:!0,ol:!0},O="__ko_matchedEndComment__";f.h={ea:{},childNodes:function(k){return b(k)?E(k):k.childNodes},Ea:function(k){if(b(k)){k=f.h.childNodes(k);for(var J=0,H=k.length;J<H;J++)f.removeNode(k[J])}else f.a.Tb(k)},va:function(k,J){if(b(k)){f.h.Ea(k);for(var H=k.nextSibling,ee=0,z=J.length;ee<z;ee++)H.parentNode.insertBefore(J[ee],H)}else f.a.va(k,J)},Vc:function(k,J){var H;b(k)?(H=k.nextSibling,k=k.parentNode):H=k.firstChild,H?J!==H&&k.insertBefore(J,H):k.appendChild(J)},Wb:function(k,J,H){H?(H=H.nextSibling,b(k)&&(k=k.parentNode),H?J!==H&&k.insertBefore(J,H):k.appendChild(J)):f.h.Vc(k,J)},firstChild:function(k){if(b(k))return!k.nextSibling||R(k.nextSibling)?null:k.nextSibling;if(k.firstChild&&R(k.firstChild))throw Error("Found invalid end comment, as the first child of "+k);return k.firstChild},nextSibling:function(k){if(b(k)&&(k=I(k)),k.nextSibling&&R(k.nextSibling)){var J=k.nextSibling;if(R(J)&&!f.a.g.get(J,O))throw Error("Found end comment without a matching opening comment, as child of "+k);return null}return k.nextSibling},Cd:b,Vd:function(k){return(k=(w?k.text:k.nodeValue).match(N))?k[1]:null},Sc:function(k){if(U[f.a.R(k)]){var J=k.firstChild;if(J)do if(J.nodeType===1){var H;H=J.firstChild;var ee=null;if(H)do if(ee)ee.push(H);else if(b(H)){var z=I(H,!0);z?H=z:ee=[H]}else R(H)&&(ee=[H]);while(H=H.nextSibling);if(H=ee)for(ee=J.nextSibling,z=0;z<H.length;z++)ee?k.insertBefore(H[z],ee):k.appendChild(H[z])}while(J=J.nextSibling)}}}}(),f.b("virtualElements",f.h),f.b("virtualElements.allowedBindings",f.h.ea),f.b("virtualElements.emptyNode",f.h.Ea),f.b("virtualElements.insertAfter",f.h.Wb),f.b("virtualElements.prepend",f.h.Vc),f.b("virtualElements.setDomNodeChildren",f.h.va),function(){f.ga=function(){this.nd={}},f.a.extend(f.ga.prototype,{nodeHasBindings:function(b){switch(b.nodeType){case 1:return b.getAttribute("data-bind")!=null||f.j.getComponentNameForNode(b);case 8:return f.h.Cd(b);default:return!1}},getBindings:function(b,R){var E=this.getBindingsString(b,R),E=E?this.parseBindingsString(E,R,b):null;return f.j.tc(E,b,R,!1)},getBindingAccessors:function(b,R){var E=this.getBindingsString(b,R),E=E?this.parseBindingsString(E,R,b,{valueAccessors:!0}):null;return f.j.tc(E,b,R,!0)},getBindingsString:function(b){switch(b.nodeType){case 1:return b.getAttribute("data-bind");case 8:return f.h.Vd(b);default:return null}},parseBindingsString:function(b,R,E,I){try{var w=this.nd,N=b+(I&&I.valueAccessors||""),B;if(!(B=w[N])){var U,O="with($context){with($data||{}){return{"+f.m.vb(b,I)+"}}}";U=new Function("$context","$element",O),B=w[N]=U}return B(R,E)}catch(k){throw k.message=`Unable to parse bindings. Bindings value: `+b+` Message: `+k.message,k}}}),f.ga.instance=new f.ga}(),f.b("bindingProvider",f.ga),function(){function b(ae){var ye=(ae=f.a.g.get(ae,Te))&&ae.N;ye&&(ae.N=null,ye.Tc())}function R(ae,ye,Se){this.node=ae,this.yc=ye,this.kb=[],this.H=!1,ye.N||f.a.K.za(ae,b),Se&&Se.N&&(Se.N.kb.push(ae),this.Kb=Se)}function E(ae){return function(){return ae}}function I(ae){return ae()}function w(ae){return f.a.Ga(f.u.G(ae),function(ye,Se){return function(){return ae()[Se]}})}function N(ae,ye,Se){return typeof ae=="function"?w(ae.bind(null,ye,Se)):f.a.Ga(ae,E)}function B(ae,ye){return w(this.getBindings.bind(this,ae,ye))}function U(ae,ye){var Se=f.h.firstChild(ye);if(Se){var Le,Xe=f.ga.instance,Pe=Xe.preprocessNode;if(Pe){for(;Le=Se;)Se=f.h.nextSibling(Le),Pe.call(Xe,Le);Se=f.h.firstChild(ye)}for(;Le=Se;)Se=f.h.nextSibling(Le),O(ae,Le)}f.i.ma(ye,f.i.H)}function O(ae,ye){var Se=ae,Le=ye.nodeType===1;Le&&f.h.Sc(ye),(Le||f.ga.instance.nodeHasBindings(ye))&&(Se=J(ye,null,ae).bindingContextForDescendants),Se&&!q[f.a.R(ye)]&&U(Se,ye)}function k(ae){var ye=[],Se={},Le=[];return f.a.P(ae,function Xe(Pe){if(!Se[Pe]){var ke=f.getBindingHandler(Pe);ke&&(ke.after&&(Le.push(Pe),f.a.D(ke.after,function(Pt){if(ae[Pt]){if(f.a.A(Le,Pt)!==-1)throw Error("Cannot combine the following bindings, because they have a cyclic dependency: "+Le.join(", "));Xe(Pt)}}),Le.length--),ye.push({key:Pe,Mc:ke})),Se[Pe]=!0}}),ye}function J(ae,ye,Se){var Le=f.a.g.Ub(ae,Te,{}),Xe=Le.hd;if(!ye){if(Xe)throw Error("You cannot apply bindings multiple times to the same element.");Le.hd=!0}Xe||(Le.context=Se),Le.Zb||(Le.Zb={});var Pe;if(ye&&typeof ye!="function")Pe=ye;else{var ke=f.ga.instance,Pt=ke.getBindingAccessors||B,Ot=f.$(function(){return(Pe=ye?ye(Se,ae):Pt.call(ke,ae,Se))&&(Se[ee]&&Se[ee](),Se[j]&&Se[j]()),Pe},null,{l:ae});Pe&&Ot.ja()||(Ot=null)}var ht=Se,Ae;if(Pe){var $e=function(){return f.a.Ga(Ot?Ot():Pe,I)},Qe=Ot?function(je){return function(){return I(Ot()[je])}}:function(je){return Pe[je]};$e.get=function(je){return Pe[je]&&I(Qe(je))},$e.has=function(je){return je in Pe},f.i.H in Pe&&f.i.subscribe(ae,f.i.H,function(){var je=(0,Pe[f.i.H])();if(je){var kt=f.h.childNodes(ae);kt.length&&je(kt,f.Ec(kt[0]))}}),f.i.pa in Pe&&(ht=f.i.Cb(ae,Se),f.i.subscribe(ae,f.i.pa,function(){var je=(0,Pe[f.i.pa])();je&&f.h.firstChild(ae)&&je(ae)})),Le=k(Pe),f.a.D(Le,function(je){var kt=je.Mc.init,pe=je.Mc.update,Ve=je.key;if(ae.nodeType===8&&!f.h.ea[Ve])throw Error("The binding '"+Ve+"' cannot be used with virtual elements");try{typeof kt=="function"&&f.u.G(function(){var Dt=kt(ae,Qe(Ve),$e,ht.$data,ht);if(Dt&&Dt.controlsDescendantBindings){if(Ae!==e)throw Error("Multiple bindings ("+Ae+" and "+Ve+") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.");Ae=Ve}}),typeof pe=="function"&&f.$(function(){pe(ae,Qe(Ve),$e,ht.$data,ht)},null,{l:ae})}catch(Dt){throw Dt.message='Unable to process binding "'+Ve+": "+Pe[Ve]+`" Message: `+Dt.message,Dt}})}return Le=Ae===e,{shouldBindDescendants:Le,bindingContextForDescendants:Le&&ht}}function H(ae,ye){return ae&&ae instanceof f.fa?ae:new f.fa(ae,e,e,ye)}var ee=f.a.Da("_subscribable"),z=f.a.Da("_ancestorBindingInfo"),j=f.a.Da("_dataDependency");f.c={};var q={script:!0,textarea:!0,template:!0};f.getBindingHandler=function(ae){return f.c[ae]};var be={};f.fa=function(ae,ye,Se,Le,Xe){function Pe(){var Qe=ht?Ot():Ot,je=f.a.f(Qe);return ye?(f.a.extend(ke,ye),z in ye&&(ke[z]=ye[z])):(ke.$parents=[],ke.$root=je,ke.ko=f),ke[ee]=Ae,Pt?je=ke.$data:(ke.$rawData=Qe,ke.$data=je),Se&&(ke[Se]=je),Le&&Le(ke,ye,je),ye&&ye[ee]&&!f.S.o().Vb(ye[ee])&&ye[ee](),$e&&(ke[j]=$e),ke.$data}var ke=this,Pt=ae===be,Ot=Pt?e:ae,ht=typeof Ot=="function"&&!f.O(Ot),Ae,$e=Xe&&Xe.dataDependency;Xe&&Xe.exportDependencies?Pe():(Ae=f.xb(Pe),Ae.v(),Ae.ja()?Ae.equalityComparer=null:ke[ee]=e)},f.fa.prototype.createChildContext=function(ae,ye,Se,Le){if(!Le&&ye&&typeof ye=="object"&&(Le=ye,ye=Le.as,Se=Le.extend),ye&&Le&&Le.noChildContext){var Xe=typeof ae=="function"&&!f.O(ae);return new f.fa(be,this,null,function(Pe){Se&&Se(Pe),Pe[ye]=Xe?ae():ae},Le)}return new f.fa(ae,this,ye,function(Pe,ke){Pe.$parentContext=ke,Pe.$parent=ke.$data,Pe.$parents=(ke.$parents||[]).slice(0),Pe.$parents.unshift(Pe.$parent),Se&&Se(Pe)},Le)},f.fa.prototype.extend=function(ae,ye){return new f.fa(be,this,null,function(Se){f.a.extend(Se,typeof ae=="function"?ae(Se):ae)},ye)};var Te=f.a.g.Z();R.prototype.Tc=function(){this.Kb&&this.Kb.N&&this.Kb.N.sd(this.node)},R.prototype.sd=function(ae){f.a.Pa(this.kb,ae),!this.kb.length&&this.H&&this.Cc()},R.prototype.Cc=function(){this.H=!0,this.yc.N&&!this.kb.length&&(this.yc.N=null,f.a.K.yb(this.node,b),f.i.ma(this.node,f.i.pa),this.Tc())},f.i={H:"childrenComplete",pa:"descendantsComplete",subscribe:function(ae,ye,Se,Le,Xe){var Pe=f.a.g.Ub(ae,Te,{});return Pe.Fa||(Pe.Fa=new f.T),Xe&&Xe.notifyImmediately&&Pe.Zb[ye]&&f.u.G(Se,Le,[ae]),Pe.Fa.subscribe(Se,Le,ye)},ma:function(ae,ye){var Se=f.a.g.get(ae,Te);if(Se&&(Se.Zb[ye]=!0,Se.Fa&&Se.Fa.notifySubscribers(ae,ye),ye==f.i.H)){if(Se.N)Se.N.Cc();else if(Se.N===e&&Se.Fa&&Se.Fa.Wa(f.i.pa))throw Error("descendantsComplete event not supported for bindings on this node")}},Cb:function(ae,ye){var Se=f.a.g.Ub(ae,Te,{});return Se.N||(Se.N=new R(ae,Se,ye[z])),ye[z]==Se?ye:ye.extend(function(Le){Le[z]=Se})}},f.Td=function(ae){return(ae=f.a.g.get(ae,Te))&&ae.context},f.ib=function(ae,ye,Se){return ae.nodeType===1&&f.h.Sc(ae),J(ae,ye,H(Se))},f.ld=function(ae,ye,Se){return Se=H(Se),f.ib(ae,N(ye,Se,ae),Se)},f.Oa=function(ae,ye){ye.nodeType!==1&&ye.nodeType!==8||U(H(ae),ye)},f.vc=function(ae,ye,Se){if(!o&&t.jQuery&&(o=t.jQuery),2>arguments.length){if(ye=n.body,!ye)throw Error("ko.applyBindings: could not find document.body; has the document been loaded?")}else if(!ye||ye.nodeType!==1&&ye.nodeType!==8)throw Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node");O(H(ae,Se),ye)},f.Dc=function(ae){return!ae||ae.nodeType!==1&&ae.nodeType!==8?e:f.Td(ae)},f.Ec=function(ae){return(ae=f.Dc(ae))?ae.$data:e},f.b("bindingHandlers",f.c),f.b("bindingEvent",f.i),f.b("bindingEvent.subscribe",f.i.subscribe),f.b("bindingEvent.startPossiblyAsyncContentBinding",f.i.Cb),f.b("applyBindings",f.vc),f.b("applyBindingsToDescendants",f.Oa),f.b("applyBindingAccessorsToNode",f.ib),f.b("applyBindingsToNode",f.ld),f.b("contextFor",f.Dc),f.b("dataFor",f.Ec)}(),function(b){function R(B,U){var O=Object.prototype.hasOwnProperty.call(w,B)?w[B]:b,k;O?O.subscribe(U):(O=w[B]=new f.T,O.subscribe(U),E(B,function(J,H){var ee=!(!H||!H.synchronous);N[B]={definition:J,Gd:ee},delete w[B],k||ee?O.notifySubscribers(J):f.na.zb(function(){O.notifySubscribers(J)})}),k=!0)}function E(B,U){I("getConfig",[B],function(O){O?I("loadComponent",[B,O],function(k){U(k,O)}):U(null,null)})}function I(B,U,O,k){k||(k=f.j.loaders.slice(0));var J=k.shift();if(J){var H=J[B];if(H){var ee=!1;if(H.apply(J,U.concat(function(z){ee?O(null):z!==null?O(z):I(B,U,O,k)}))!==b&&(ee=!0,!J.suppressLoaderExceptions))throw Error("Component loaders must supply values by invoking the callback, not by returning values synchronously.")}else I(B,U,O,k)}else O(null)}var w={},N={};f.j={get:function(B,U){var O=Object.prototype.hasOwnProperty.call(N,B)?N[B]:b;O?O.Gd?f.u.G(function(){U(O.definition)}):f.na.zb(function(){U(O.definition)}):R(B,U)},Bc:function(B){delete N[B]},oc:I},f.j.loaders=[],f.b("components",f.j),f.b("components.get",f.j.get),f.b("components.clearCachedDefinition",f.j.Bc)}(),function(){function b(O,k,J,H){function ee(){--j===0&&H(z)}var z={},j=2,q=J.template;J=J.viewModel,q?w(k,q,function(be){f.j.oc("loadTemplate",[O,be],function(Te){z.template=Te,ee()})}):ee(),J?w(k,J,function(be){f.j.oc("loadViewModel",[O,be],function(Te){z[U]=Te,ee()})}):ee()}function R(O,k,J){if(typeof k=="function")J(function(ee){return new k(ee)});else if(typeof k[U]=="function")J(k[U]);else if("instance"in k){var H=k.instance;J(function(){return H})}else"viewModel"in k?R(O,k.viewModel,J):O("Unknown viewModel value: "+k)}function E(O){switch(f.a.R(O)){case"script":return f.a.ua(O.text);case"textarea":return f.a.ua(O.value);case"template":if(I(O.content))return f.a.Ca(O.content.childNodes)}return f.a.Ca(O.childNodes)}function I(O){return t.DocumentFragment?O instanceof DocumentFragment:O&&O.nodeType===11}function w(O,k,J){typeof k.require=="string"?a||t.require?(a||t.require)([k.require],function(H){H&&typeof H=="object"&&H.Xd&&H.default&&(H=H.default),J(H)}):O("Uses require, but no AMD loader is present"):J(k)}function N(O){return function(k){throw Error("Component '"+O+"': "+k)}}var B={};f.j.register=function(O,k){if(!k)throw Error("Invalid configuration for "+O);if(f.j.tb(O))throw Error("Component "+O+" is already registered");B[O]=k},f.j.tb=function(O){return Object.prototype.hasOwnProperty.call(B,O)},f.j.unregister=function(O){delete B[O],f.j.Bc(O)},f.j.Fc={getConfig:function(O,k){k(f.j.tb(O)?B[O]:null)},loadComponent:function(O,k,J){var H=N(O);w(H,k,function(ee){b(O,H,ee,J)})},loadTemplate:function(O,k,J){if(O=N(O),typeof k=="string")J(f.a.ua(k));else if(k instanceof Array)J(k);else if(I(k))J(f.a.la(k.childNodes));else if(k.element)if(k=k.element,t.HTMLElement?k instanceof HTMLElement:k&&k.tagName&&k.nodeType===1)J(E(k));else if(typeof k=="string"){var H=n.getElementById(k);H?J(E(H)):O("Cannot find element with ID "+k)}else O("Unknown element type: "+k);else O("Unknown template value: "+k)},loadViewModel:function(O,k,J){R(N(O),k,J)}};var U="createViewModel";f.b("components.register",f.j.register),f.b("components.isRegistered",f.j.tb),f.b("components.unregister",f.j.unregister),f.b("components.defaultLoader",f.j.Fc),f.j.loaders.push(f.j.Fc),f.j.dd=B}(),function(){function b(E,I){var w=E.getAttribute("params");if(w){var w=R.parseBindingsString(w,I,E,{valueAccessors:!0,bindingParams:!0}),w=f.a.Ga(w,function(U){return f.o(U,null,{l:E})}),N=f.a.Ga(w,function(U){var O=U.v();return U.ja()?f.o({read:function(){return f.a.f(U())},write:f.Za(O)&&function(k){U()(k)},l:E}):O});return Object.prototype.hasOwnProperty.call(N,"$raw")||(N.$raw=w),N}return{$raw:{}}}f.j.getComponentNameForNode=function(E){var I=f.a.R(E);if(f.j.tb(I)&&(I.indexOf("-")!=-1||""+E=="[object HTMLUnknownElement]"||8>=f.a.W&&E.tagName===I))return I},f.j.tc=function(E,I,w,N){if(I.nodeType===1){var B=f.j.getComponentNameForNode(I);if(B){if(E=E||{},E.component)throw Error('Cannot use the "component" binding on a custom element matching a component');var U={name:B,params:b(I,w)};E.component=N?function(){return U}:U}}return E};var R=new f.ga;9>f.a.W&&(f.j.register=function(E){return function(I){return E.apply(this,arguments)}}(f.j.register),n.createDocumentFragment=function(E){return function(){var I=E(),w=f.j.dd,N;for(N in w);return I}}(n.createDocumentFragment))}(),function(){function b(I,w,N){if(w=w.template,!w)throw Error("Component '"+I+"' has no template");I=f.a.Ca(w),f.h.va(N,I)}function R(I,w,N){var B=I.createViewModel;return B?B.call(I,w,N):w}var E=0;f.c.component={init:function(I,w,N,B,U){function O(){var z=k&&k.dispose;typeof z=="function"&&z.call(k),H&&H.s(),J=k=H=null}var k,J,H,ee=f.a.la(f.h.childNodes(I));return f.h.Ea(I),f.a.K.za(I,O),f.o(function(){var z=f.a.f(w()),j,q;if(typeof z=="string"?j=z:(j=f.a.f(z.name),q=f.a.f(z.params)),!j)throw Error("No component name specified");var be=f.i.Cb(I,U),Te=J=++E;f.j.get(j,function(ae){if(J===Te){if(O(),!ae)throw Error("Unknown component '"+j+"'");b(j,ae,I);var ye=R(ae,q,{element:I,templateNodes:ee});ae=be.createChildContext(ye,{extend:function(Se){Se.$component=ye,Se.$componentTemplateNodes=ee}}),ye&&ye.koDescendantsComplete&&(H=f.i.subscribe(I,f.i.pa,ye.koDescendantsComplete,ye)),k=ye,f.Oa(ae,I)}})},null,{l:I}),{controlsDescendantBindings:!0}}},f.h.ea.component=!0}();var F={class:"className",for:"htmlFor"};f.c.attr={update:function(b,R){var E=f.a.f(R())||{};f.a.P(E,function(I,w){w=f.a.f(w);var N=I.indexOf(":"),N="lookupNamespaceURI"in b&&0<N&&b.lookupNamespaceURI(I.substr(0,N)),B=w===!1||w===null||w===e;B?N?b.removeAttributeNS(N,I):b.removeAttribute(I):w=w.toString(),8>=f.a.W&&I in F?(I=F[I],B?b.removeAttribute(I):b[I]=w):B||(N?b.setAttributeNS(N,I,w):b.setAttribute(I,w)),I==="name"&&f.a.Yc(b,B?"":w)})}},function(){f.c.checked={after:["value","attr"],init:function(b,R,E){function I(){var z=b.checked,j=N();if(!f.S.Ya()&&(z||!U&&!f.S.qa())){var q=f.u.G(R);if(k){var be=J?q.v():q,Te=ee;ee=j,Te!==j?z&&(f.a.Na(be,j,!0),f.a.Na(be,Te,!1)):f.a.Na(be,j,z),J&&f.Za(q)&&q(be)}else B&&(j===e?j=z:z||(j=e)),f.m.eb(q,E,"checked",j,!0)}}function w(){var z=f.a.f(R()),j=N();k?(b.checked=0<=f.a.A(z,j),ee=j):b.checked=B&&j===e?!!z:N()===z}var N=f.xb(function(){if(E.has("checkedValue"))return f.a.f(E.get("checkedValue"));if(H)return E.has("value")?f.a.f(E.get("value")):b.value}),B=b.type=="checkbox",U=b.type=="radio";if(B||U){var O=R(),k=B&&f.a.f(O)instanceof Array,J=!(k&&O.push&&O.splice),H=U||k,ee=k?N():e;U&&!b.name&&f.c.uniqueName.init(b,function(){return!0}),f.o(I,null,{l:b}),f.a.B(b,"click",I),f.o(w,null,{l:b}),O=e}}},f.m.wa.checked=!0,f.c.checkedValue={update:function(b,R){b.value=f.a.f(R())}}}(),f.c.class={update:function(b,R){var E=f.a.Db(f.a.f(R()));f.a.Eb(b,b.__ko__cssValue,!1),b.__ko__cssValue=E,f.a.Eb(b,E,!0)}},f.c.css={update:function(b,R){var E=f.a.f(R());E!==null&&typeof E=="object"?f.a.P(E,function(I,w){w=f.a.f(w),f.a.Eb(b,I,w)}):f.c.class.update(b,R)}},f.c.enable={update:function(b,R){var E=f.a.f(R());E&&b.disabled?b.removeAttribute("disabled"):E||b.disabled||(b.disabled=!0)}},f.c.disable={update:function(b,R){f.c.enable.update(b,function(){return!f.a.f(R())})}},f.c.event={init:function(b,R,E,I,w){var N=R()||{};f.a.P(N,function(B){typeof B=="string"&&f.a.B(b,B,function(U){var O,k=R()[B];if(k){try{var J=f.a.la(arguments);I=w.$data,J.unshift(I),O=k.apply(I,J)}finally{O!==!0&&(U.preventDefault?U.preventDefault():U.returnValue=!1)}E.get(B+"Bubble")===!1&&(U.cancelBubble=!0,U.stopPropagation&&U.stopPropagation())}})})}},f.c.foreach={Rc:function(b){return function(){var R=b(),E=f.a.bc(R);return!E||typeof E.length=="number"?{foreach:R,templateEngine:f.ba.Ma}:(f.a.f(R),{foreach:E.data,as:E.as,noChildContext:E.noChildContext,includeDestroyed:E.includeDestroyed,afterAdd:E.afterAdd,beforeRemove:E.beforeRemove,afterRender:E.afterRender,beforeMove:E.beforeMove,afterMove:E.afterMove,templateEngine:f.ba.Ma})}},init:function(b,R){return f.c.template.init(b,f.c.foreach.Rc(R))},update:function(b,R,E,I,w){return f.c.template.update(b,f.c.foreach.Rc(R),E,I,w)}},f.m.Ra.foreach=!1,f.h.ea.foreach=!0,f.c.hasfocus={init:function(b,R,E){function I(B){b.__ko_hasfocusUpdating=!0;var U=b.ownerDocument;if("activeElement"in U){var O;try{O=U.activeElement}catch{O=U.body}B=O===b}U=R(),f.m.eb(U,E,"hasfocus",B,!0),b.__ko_hasfocusLastValue=B,b.__ko_hasfocusUpdating=!1}var w=I.bind(null,!0),N=I.bind(null,!1);f.a.B(b,"focus",w),f.a.B(b,"focusin",w),f.a.B(b,"blur",N),f.a.B(b,"focusout",N),b.__ko_hasfocusLastValue=!1},update:function(b,R){var E=!!f.a.f(R());b.__ko_hasfocusUpdating||b.__ko_hasfocusLastValue===E||(E?b.focus():b.blur(),!E&&b.__ko_hasfocusLastValue&&b.ownerDocument.body.focus(),f.u.G(f.a.Fb,null,[b,E?"focusin":"focusout"]))}},f.m.wa.hasfocus=!0,f.c.hasFocus=f.c.hasfocus,f.m.wa.hasFocus="hasfocus",f.c.html={init:function(){return{controlsDescendantBindings:!0}},update:function(b,R){f.a.fc(b,R())}},function(){function b(R,E,I){f.c[R]={init:function(w,N,B,U,O){var k,J,H={},ee,z,j;if(E){U=B.get("as");var q=B.get("noChildContext");j=!(U&&q),H={as:U,noChildContext:q,exportDependencies:j}}return z=(ee=B.get("completeOn")=="render")||B.has(f.i.pa),f.o(function(){var be=f.a.f(N()),Te=!I!=!be,ae=!J,ye;(j||Te!==k)&&(z&&(O=f.i.Cb(w,O)),Te&&((!E||j)&&(H.dataDependency=f.S.o()),ye=E?O.createChildContext(typeof be=="function"?be:N,H):f.S.qa()?O.extend(null,H):O),ae&&f.S.qa()&&(J=f.a.Ca(f.h.childNodes(w),!0)),Te?(ae||f.h.va(w,f.a.Ca(J)),f.Oa(ye,w)):(f.h.Ea(w),ee||f.i.ma(w,f.i.H)),k=Te)},null,{l:w}),{controlsDescendantBindings:!0}}},f.m.Ra[R]=!1,f.h.ea[R]=!0}b("if"),b("ifnot",!1,!0),b("with",!0)}(),f.c.let={init:function(b,R,E,I,w){return R=w.extend(R),f.Oa(R,b),{controlsDescendantBindings:!0}}},f.h.ea.let=!0;var A={};f.c.options={init:function(b){if(f.a.R(b)!=="select")throw Error("options binding applies only to SELECT elements");for(;0<b.length;)b.remove(0);return{controlsDescendantBindings:!0}},update:function(b,R,E){function I(){return f.a.jb(b.options,function(q){return q.selected})}function w(q,be,Te){var ae=typeof be;return ae=="function"?be(q):ae=="string"?q[be]:Te}function N(q,be){if(z&&k)f.i.ma(b,f.i.H);else if(ee.length){var Te=0<=f.a.A(ee,f.w.M(be[0]));f.a.Zc(be[0],Te),z&&!Te&&f.u.G(f.a.Fb,null,[b,"change"])}}var B=b.multiple,U=b.length!=0&&B?b.scrollTop:null,O=f.a.f(R()),k=E.get("valueAllowUnset")&&E.has("value"),J=E.get("optionsIncludeDestroyed");R={};var H,ee=[];k||(B?ee=f.a.Mb(I(),f.w.M):0<=b.selectedIndex&&ee.push(f.w.M(b.options[b.selectedIndex]))),O&&(typeof O.length>"u"&&(O=[O]),H=f.a.jb(O,function(q){return J||q===e||q===null||!f.a.f(q._destroy)}),E.has("optionsCaption")&&(O=f.a.f(E.get("optionsCaption")),O!==null&&O!==e&&H.unshift(A)));var z=!1;if(R.beforeRemove=function(q){b.removeChild(q)},O=N,E.has("optionsAfterRender")&&typeof E.get("optionsAfterRender")=="function"&&(O=function(q,be){N(0,be),f.u.G(E.get("optionsAfterRender"),null,[be[0],q!==A?q:e])}),f.a.ec(b,H,function(q,be,Te){return Te.length&&(ee=!k&&Te[0].selected?[f.w.M(Te[0])]:[],z=!0),be=b.ownerDocument.createElement("option"),q===A?(f.a.Bb(be,E.get("optionsCaption")),f.w.cb(be,e)):(Te=w(q,E.get("optionsValue"),q),f.w.cb(be,f.a.f(Te)),q=w(q,E.get("optionsText"),Te),f.a.Bb(be,q)),[be]},R,O),!k){var j;B?j=ee.length&&I().length<ee.length:j=ee.length&&0<=b.selectedIndex?f.w.M(b.options[b.selectedIndex])!==ee[0]:ee.length||0<=b.selectedIndex,j&&f.u.G(f.a.Fb,null,[b,"change"])}(k||f.S.Ya())&&f.i.ma(b,f.i.H),f.a.wd(b),U&&20<Math.abs(U-b.scrollTop)&&(b.scrollTop=U)}},f.c.options.$b=f.a.g.Z(),f.c.selectedOptions={init:function(b,R,E){function I(){var B=R(),U=[];f.a.D(b.getElementsByTagName("option"),function(O){O.selected&&U.push(f.w.M(O))}),f.m.eb(B,E,"selectedOptions",U)}function w(){var B=f.a.f(R()),U=b.scrollTop;B&&typeof B.length=="number"&&f.a.D(b.getElementsByTagName("option"),function(O){var k=0<=f.a.A(B,f.w.M(O));O.selected!=k&&f.a.Zc(O,k)}),b.scrollTop=U}if(f.a.R(b)!="select")throw Error("selectedOptions binding applies only to SELECT elements");var N;f.i.subscribe(b,f.i.H,function(){N?I():(f.a.B(b,"change",I),N=f.o(w,null,{l:b}))},null,{notifyImmediately:!0})},update:function(){}},f.m.wa.selectedOptions=!0,f.c.style={update:function(b,R){var E=f.a.f(R()||{});f.a.P(E,function(I,w){if(w=f.a.f(w),(w===null||w===e||w===!1)&&(w=""),o)o(b).css(I,w);else if(/^--/.test(I))b.style.setProperty(I,w);else{I=I.replace(/-(\w)/g,function(B,U){return U.toUpperCase()});var N=b.style[I];b.style[I]=w,w===N||b.style[I]!=N||isNaN(w)||(b.style[I]=w+"px")}})}},f.c.submit={init:function(b,R,E,I,w){if(typeof R()!="function")throw Error("The value for a submit binding must be a function");f.a.B(b,"submit",function(N){var B,U=R();try{B=U.call(w.$data,b)}finally{B!==!0&&(N.preventDefault?N.preventDefault():N.returnValue=!1)}})}},f.c.text={init:function(){return{controlsDescendantBindings:!0}},update:function(b,R){f.a.Bb(b,R())}},f.h.ea.text=!0,function(){if(t&&t.navigator){var b=function(H){if(H)return parseFloat(H[1])},R=t.navigator.userAgent,E,I,w,N,B;(E=t.opera&&t.opera.version&&parseInt(t.opera.version()))||(B=b(R.match(/Edge\/([^ ]+)$/)))||b(R.match(/Chrome\/([^ ]+)/))||(I=b(R.match(/Version\/([^ ]+) Safari/)))||(w=b(R.match(/Firefox\/([^ ]+)/)))||(N=f.a.W||b(R.match(/MSIE ([^ ]+)/)))||(N=b(R.match(/rv:([^ )]+)/)))}if(8<=N&&10>N)var U=f.a.g.Z(),O=f.a.g.Z(),k=function(H){var ee=this.activeElement;(ee=ee&&f.a.g.get(ee,O))&&ee(H)},J=function(H,ee){var z=H.ownerDocument;f.a.g.get(z,U)||(f.a.g.set(z,U,!0),f.a.B(z,"selectionchange",k)),f.a.g.set(H,O,ee)};f.c.textInput={init:function(H,ee,z){function j(Pe,ke){f.a.B(H,Pe,ke)}function q(){var Pe=f.a.f(ee());(Pe===null||Pe===e)&&(Pe=""),Se!==e&&Pe===Se?f.a.setTimeout(q,4):H.value!==Pe&&(Xe=!0,H.value=Pe,Xe=!1,ae=H.value)}function be(){ye||(Se=H.value,ye=f.a.setTimeout(Te,4))}function Te(){clearTimeout(ye),Se=ye=e;var Pe=H.value;ae!==Pe&&(ae=Pe,f.m.eb(ee(),z,"textInput",Pe))}var ae=H.value,ye,Se,Le=f.a.W==9?be:Te,Xe=!1;N&&j("keypress",Te),11>N&&j("propertychange",function(Pe){Xe||Pe.propertyName!=="value"||Le(Pe)}),N==8&&(j("keyup",Te),j("keydown",Te)),J&&(J(H,Le),j("dragend",be)),(!N||9<=N)&&j("input",Le),5>I&&f.a.R(H)==="textarea"?(j("keydown",be),j("paste",be),j("cut",be)):11>E?j("keydown",be):4>w?(j("DOMAutoComplete",Te),j("dragdrop",Te),j("drop",Te)):B&&H.type==="number"&&j("keydown",be),j("change",Te),j("blur",Te),f.o(q,null,{l:H})}},f.m.wa.textInput=!0,f.c.textinput={preprocess:function(H,ee,z){z("textInput",H)}}}(),f.c.uniqueName={init:function(b,R){if(R()){var E="ko_unique_"+ ++f.c.uniqueName.rd;f.a.Yc(b,E)}}},f.c.uniqueName.rd=0,f.c.using={init:function(b,R,E,I,w){var N;return E.has("as")&&(N={as:E.get("as"),noChildContext:E.get("noChildContext")}),R=w.createChildContext(R,N),f.Oa(R,b),{controlsDescendantBindings:!0}}},f.h.ea.using=!0,f.c.value={init:function(b,R,E){var I=f.a.R(b),w=I=="input";if(!w||b.type!="checkbox"&&b.type!="radio"){var N=[],B=E.get("valueUpdate"),U=!1,O=null;B&&(typeof B=="string"?N=[B]:N=f.a.wc(B),f.a.Pa(N,"change"));var k=function(){O=null,U=!1;var ee=R(),z=f.w.M(b);f.m.eb(ee,E,"value",z)};!f.a.W||!w||b.type!="text"||b.autocomplete=="off"||b.form&&b.form.autocomplete=="off"||f.a.A(N,"propertychange")!=-1||(f.a.B(b,"propertychange",function(){U=!0}),f.a.B(b,"focus",function(){U=!1}),f.a.B(b,"blur",function(){U&&k()})),f.a.D(N,function(ee){var z=k;f.a.Ud(ee,"after")&&(z=function(){O=f.w.M(b),f.a.setTimeout(k,0)},ee=ee.substring(5)),f.a.B(b,ee,z)});var J;if(J=w&&b.type=="file"?function(){var ee=f.a.f(R());ee===null||ee===e||ee===""?b.value="":f.u.G(k)}:function(){var ee=f.a.f(R()),z=f.w.M(b);O!==null&&ee===O?f.a.setTimeout(J,0):(ee!==z||z===e)&&(I==="select"?(z=E.get("valueAllowUnset"),f.w.cb(b,ee,z),z||ee===f.w.M(b)||f.u.G(k)):f.w.cb(b,ee))},I==="select"){var H;f.i.subscribe(b,f.i.H,function(){H?E.get("valueAllowUnset")?J():k():(f.a.B(b,"change",k),H=f.o(J,null,{l:b}))},null,{notifyImmediately:!0})}else f.a.B(b,"change",k),f.o(J,null,{l:b})}else f.ib(b,{checkedValue:R})},update:function(){}},f.m.wa.value=!0,f.c.visible={update:function(b,R){var E=f.a.f(R()),I=b.style.display!="none";E&&!I?b.style.display="":!E&&I&&(b.style.display="none")}},f.c.hidden={update:function(b,R){f.c.visible.update(b,function(){return!f.a.f(R())})}},function(b){f.c[b]={init:function(R,E,I,w,N){return f.c.event.init.call(this,R,function(){var B={};return B[b]=E(),B},I,w,N)}}}("click"),f.ca=function(){},f.ca.prototype.renderTemplateSource=function(){throw Error("Override renderTemplateSource")},f.ca.prototype.createJavaScriptEvaluatorBlock=function(){throw Error("Override createJavaScriptEvaluatorBlock")},f.ca.prototype.makeTemplateSource=function(b,R){if(typeof b=="string"){R=R||n;var E=R.getElementById(b);if(!E)throw Error("Cannot find template with ID "+b);return new f.C.F(E)}if(b.nodeType==1||b.nodeType==8)return new f.C.ia(b);throw Error("Unknown template type: "+b)},f.ca.prototype.renderTemplate=function(b,R,E,I){return b=this.makeTemplateSource(b,I),this.renderTemplateSource(b,R,E,I)},f.ca.prototype.isTemplateRewritten=function(b,R){return this.allowTemplateRewriting===!1?!0:this.makeTemplateSource(b,R).data("isRewritten")},f.ca.prototype.rewriteTemplate=function(b,R,E){b=this.makeTemplateSource(b,E),R=R(b.text()),b.text(R),b.data("isRewritten",!0)},f.b("templateEngine",f.ca),f.kc=function(){function b(I,w,N,B){I=f.m.ac(I);for(var U=f.m.Ra,O=0;O<I.length;O++){var k=I[O].key;if(Object.prototype.hasOwnProperty.call(U,k)){var J=U[k];if(typeof J=="function"){if(k=J(I[O].value))throw Error(k)}else if(!J)throw Error("This template engine does not support the '"+k+"' binding within its templates")}}return N="ko.__tr_ambtns(function($context,$element){return(function(){return{ "+f.m.vb(I,{valueAccessors:!0})+" } })()},'"+N.toLowerCase()+"')",B.createJavaScriptEvaluatorBlock(N)+w}var R=/(<([a-z]+\d*)(?:\s+(?!data-bind\s*=\s*)[a-z0-9\-]+(?:=(?:\"[^\"]*\"|\'[^\']*\'|[^>]*))?)*\s+)data-bind\s*=\s*(["'])([\s\S]*?)\3/gi,E=/\x3c!--\s*ko\b\s*([\s\S]*?)\s*--\x3e/g;return{xd:function(I,w,N){w.isTemplateRewritten(I,N)||w.rewriteTemplate(I,function(B){return f.kc.Ld(B,w)},N)},Ld:function(I,w){return I.replace(R,function(N,B,U,O,k){return b(k,B,U,w)}).replace(E,function(N,B){return b(B,"<!-- ko -->","#comment",w)})},md:function(I,w){return f.aa.Xb(function(N,B){var U=N.nextSibling;U&&U.nodeName.toLowerCase()===w&&f.ib(U,I,B)})}}}(),f.b("__tr_ambtns",f.kc.md),function(){f.C={},f.C.F=function(E){if(this.F=E){var I=f.a.R(E);this.ab=I==="script"?1:I==="textarea"?2:I=="template"&&E.content&&E.content.nodeType===11?3:4}},f.C.F.prototype.text=function(){var E=this.ab===1?"text":this.ab===2?"value":"innerHTML";if(arguments.length==0)return this.F[E];var I=arguments[0];E==="innerHTML"?f.a.fc(this.F,I):this.F[E]=I};var b=f.a.g.Z()+"_";f.C.F.prototype.data=function(E){if(arguments.length===1)return f.a.g.get(this.F,b+E);f.a.g.set(this.F,b+E,arguments[1])};var R=f.a.g.Z();f.C.F.prototype.nodes=function(){var E=this.F;if(arguments.length==0){var I=f.a.g.get(E,R)||{},w=I.lb||(this.ab===3?E.content:this.ab===4?E:e);if(!w||I.jd){var N=this.text();N&&N!==I.bb&&(w=f.a.Md(N,E.ownerDocument),f.a.g.set(E,R,{lb:w,bb:N,jd:!0}))}return w}I=arguments[0],this.ab!==e&&this.text(""),f.a.g.set(E,R,{lb:I})},f.C.ia=function(E){this.F=E},f.C.ia.prototype=new f.C.F,f.C.ia.prototype.constructor=f.C.ia,f.C.ia.prototype.text=function(){if(arguments.length==0){var E=f.a.g.get(this.F,R)||{};return E.bb===e&&E.lb&&(E.bb=E.lb.innerHTML),E.bb}f.a.g.set(this.F,R,{bb:arguments[0]})},f.b("templateSources",f.C),f.b("templateSources.domElement",f.C.F),f.b("templateSources.anonymousTemplate",f.C.ia)}(),function(){function b(O,k,J){var H;for(k=f.h.nextSibling(k);O&&(H=O)!==k;)O=f.h.nextSibling(H),J(H,O)}function R(O,k){if(O.length){var J=O[0],H=O[O.length-1],ee=J.parentNode,z=f.ga.instance,j=z.preprocessNode;if(j){if(b(J,H,function(q,be){var Te=q.previousSibling,ae=j.call(z,q);ae&&(q===J&&(J=ae[0]||be),q===H&&(H=ae[ae.length-1]||Te))}),O.length=0,!J)return;J===H?O.push(J):(O.push(J,H),f.a.Ua(O,ee))}b(J,H,function(q){q.nodeType!==1&&q.nodeType!==8||f.vc(k,q)}),b(J,H,function(q){q.nodeType!==1&&q.nodeType!==8||f.aa.cd(q,[k])}),f.a.Ua(O,ee)}}function E(O){return O.nodeType?O:0<O.length?O[0]:null}function I(O,k,J,H,ee){ee=ee||{};var z=(O&&E(O)||J||{}).ownerDocument,j=ee.templateEngine||N;if(f.kc.xd(J,j,z),J=j.renderTemplate(J,H,ee,z),typeof J.length!="number"||0<J.length&&typeof J[0].nodeType!="number")throw Error("Template engine must return an array of DOM nodes");switch(z=!1,k){case"replaceChildren":f.h.va(O,J),z=!0;break;case"replaceNode":f.a.Xc(O,J),z=!0;break;case"ignoreTargetNode":break;default:throw Error("Unknown renderMode: "+k)}return z&&(R(J,H),ee.afterRender&&f.u.G(ee.afterRender,null,[J,H[ee.as||"$data"]]),k=="replaceChildren"&&f.i.ma(O,f.i.H)),J}function w(O,k,J){return f.O(O)?O():typeof O=="function"?O(k,J):O}var N;f.gc=function(O){if(O!=e&&!(O instanceof f.ca))throw Error("templateEngine must inherit from ko.templateEngine");N=O},f.dc=function(O,k,J,H,ee){if(J=J||{},(J.templateEngine||N)==e)throw Error("Set a template engine before calling renderTemplate");if(ee=ee||"replaceChildren",H){var z=E(H);return f.$(function(){var q=k&&k instanceof f.fa?k:new f.fa(k,null,null,null,{exportDependencies:!0}),j=w(O,q.$data,q),q=I(H,ee,j,q,J);ee=="replaceNode"&&(H=q,z=E(H))},null,{Sa:function(){return!z||!f.a.Sb(z)},l:z&&ee=="replaceNode"?z.parentNode:z})}return f.aa.Xb(function(j){f.dc(O,k,J,j,"replaceNode")})},f.Qd=function(O,k,J,H,ee){function z(Se,Le){f.u.G(f.a.ec,null,[H,Se,q,J,j,Le]),f.i.ma(H,f.i.H)}function j(Se,Le){R(Le,be),J.afterRender&&J.afterRender(Le,Se),be=null}function q(Se,Le){be=ee.createChildContext(Se,{as:Te,noChildContext:J.noChildContext,extend:function(Pe){Pe.$index=Le,Te&&(Pe[Te+"Index"]=Le)}});var Xe=w(O,Se,be);return I(H,"ignoreTargetNode",Xe,be,J)}var be,Te=J.as,ae=J.includeDestroyed===!1||f.options.foreachHidesDestroyed&&!J.includeDestroyed;if(ae||J.beforeRemove||!f.Pc(k))return f.$(function(){var Se=f.a.f(k)||[];typeof Se.length>"u"&&(Se=[Se]),ae&&(Se=f.a.jb(Se,function(Le){return Le===e||Le===null||!f.a.f(Le._destroy)})),z(Se)},null,{l:H});z(k.v());var ye=k.subscribe(function(Se){z(k(),Se)},null,"arrayChange");return ye.l(H),ye};var B=f.a.g.Z(),U=f.a.g.Z();f.c.template={init:function(O,k){var J=f.a.f(k());if(typeof J=="string"||"name"in J)f.h.Ea(O);else if("nodes"in J){if(J=J.nodes||[],f.O(J))throw Error('The "nodes" option must be a plain, non-observable array.');var H=J[0]&&J[0].parentNode;H&&f.a.g.get(H,U)||(H=f.a.Yb(J),f.a.g.set(H,U,!0)),new f.C.ia(O).nodes(H)}else if(J=f.h.childNodes(O),0<J.length)H=f.a.Yb(J),new f.C.ia(O).nodes(H);else throw Error("Anonymous template defined, but no template content was provided");return{controlsDescendantBindings:!0}},update:function(O,k,J,H,ee){var z=k();k=f.a.f(z),J=!0,H=null,typeof k=="string"?k={}:(z="name"in k?k.name:O,"if"in k&&(J=f.a.f(k.if)),J&&"ifnot"in k&&(J=!f.a.f(k.ifnot)),J&&!z&&(J=!1)),"foreach"in k?H=f.Qd(z,J&&k.foreach||[],k,O,ee):J?(J=ee,"data"in k&&(J=ee.createChildContext(k.data,{as:k.as,noChildContext:k.noChildContext,exportDependencies:!0})),H=f.dc(z,J,k,O)):f.h.Ea(O),ee=H,(k=f.a.g.get(O,B))&&typeof k.s=="function"&&k.s(),f.a.g.set(O,B,!ee||ee.ja&&!ee.ja()?e:ee)}},f.m.Ra.template=function(O){return O=f.m.ac(O),O.length==1&&O[0].unknown||f.m.Id(O,"name")?null:"This template engine does not support anonymous templates nested within its templates"},f.h.ea.template=!0}(),f.b("setTemplateEngine",f.gc),f.b("renderTemplate",f.dc),f.a.Kc=function(b,R,E){if(b.length&&R.length){var I,w,N,B,U;for(I=w=0;(!E||I<E)&&(B=b[w]);++w){for(N=0;U=R[N];++N)if(B.value===U.value){B.moved=U.index,U.moved=B.index,R.splice(N,1),I=N=0;break}I+=N}}},f.a.Pb=function(){function b(R,E,I,w,N){var B=Math.min,U=Math.max,O=[],k,J=R.length,H,ee=E.length,z=ee-J||1,j=J+ee+1,q,be,Te;for(k=0;k<=J;k++)for(be=q,O.push(q=[]),Te=B(ee,k+z),H=U(0,k-1);H<=Te;H++)q[H]=H?k?R[k-1]===E[H-1]?be[H-1]:B(be[H]||j,q[H-1]||j)+1:H+1:k+1;for(B=[],U=[],z=[],k=J,H=ee;k||H;)ee=O[k][H]-1,H&&ee===O[k][H-1]?U.push(B[B.length]={status:I,value:E[--H],index:H}):k&&ee===O[k-1][H]?z.push(B[B.length]={status:w,value:R[--k],index:k}):(--H,--k,N.sparse||B.push({status:"retained",value:E[H]}));return f.a.Kc(z,U,!N.dontLimitMoves&&10*J),B.reverse()}return function(R,E,I){return I=typeof I=="boolean"?{dontLimitMoves:I}:I||{},R=R||[],E=E||[],R.length<E.length?b(R,E,"added","deleted",I):b(E,R,"deleted","added",I)}}(),f.b("utils.compareArrays",f.a.Pb),function(){function b(I,w,N,B,U){var O=[],k=f.$(function(){var J=w(N,U,f.a.Ua(O,I))||[];0<O.length&&(f.a.Xc(O,J),B&&f.u.G(B,null,[N,J,U])),O.length=0,f.a.Nb(O,J)},null,{l:I,Sa:function(){return!f.a.kd(O)}});return{Y:O,$:k.ja()?k:e}}var R=f.a.g.Z(),E=f.a.g.Z();f.a.ec=function(I,w,N,B,U,O){function k(je){Xe={Aa:je,pb:f.ta(be++)},j.push(Xe),z||Le.push(Xe)}function J(je){Xe=ee[je],be!==Xe.pb.v()&&Se.push(Xe),Xe.pb(be++),f.a.Ua(Xe.Y,I),j.push(Xe)}function H(je,kt){if(je)for(var pe=0,Ve=kt.length;pe<Ve;pe++)f.a.D(kt[pe].Y,function(Dt){je(Dt,pe,kt[pe].Aa)})}w=w||[],typeof w.length>"u"&&(w=[w]),B=B||{};var ee=f.a.g.get(I,R),z=!ee,j=[],q=0,be=0,Te=[],ae=[],ye=[],Se=[],Le=[],Xe,Pe=0;if(z)f.a.D(w,k);else{if(!O||ee&&ee._countWaitingForRemove){var ke=f.a.Mb(ee,function(je){return je.Aa});O=f.a.Pb(ke,w,{dontLimitMoves:B.dontLimitMoves,sparse:!0})}for(var ke=0,Pt,Ot,ht;Pt=O[ke];ke++)switch(Ot=Pt.moved,ht=Pt.index,Pt.status){case"deleted":for(;q<ht;)J(q++);Ot===e&&(Xe=ee[q],Xe.$&&(Xe.$.s(),Xe.$=e),f.a.Ua(Xe.Y,I).length&&(B.beforeRemove&&(j.push(Xe),Pe++,Xe.Aa===E?Xe=null:ye.push(Xe)),Xe&&Te.push.apply(Te,Xe.Y))),q++;break;case"added":for(;be<ht;)J(q++);Ot!==e?(ae.push(j.length),J(Ot)):k(Pt.value)}for(;be<w.length;)J(q++);j._countWaitingForRemove=Pe}f.a.g.set(I,R,j),H(B.beforeMove,Se),f.a.D(Te,B.beforeRemove?f.oa:f.removeNode);var Ae,$e,Qe;try{Qe=I.ownerDocument.activeElement}catch{}if(ae.length)for(;(ke=ae.shift())!=e;){for(Xe=j[ke],Ae=e;ke;)if(($e=j[--ke].Y)&&$e.length){Ae=$e[$e.length-1];break}for(w=0;q=Xe.Y[w];Ae=q,w++)f.h.Wb(I,q,Ae)}for(ke=0;Xe=j[ke];ke++){for(Xe.Y||f.a.extend(Xe,b(I,N,Xe.Aa,U,Xe.pb)),w=0;q=Xe.Y[w];Ae=q,w++)f.h.Wb(I,q,Ae);!Xe.Ed&&U&&(U(Xe.Aa,Xe.Y,Xe.pb),Xe.Ed=!0,Ae=Xe.Y[Xe.Y.length-1])}for(Qe&&I.ownerDocument.activeElement!=Qe&&Qe.focus(),H(B.beforeRemove,ye),ke=0;ke<ye.length;++ke)ye[ke].Aa=E;H(B.afterMove,Se),H(B.afterAdd,Le)}}(),f.b("utils.setDomNodeChildrenFromArrayMapping",f.a.ec),f.ba=function(){this.allowTemplateRewriting=!1},f.ba.prototype=new f.ca,f.ba.prototype.constructor=f.ba,f.ba.prototype.renderTemplateSource=function(b,R,E,I){return(R=!(9>f.a.W)&&b.nodes?b.nodes():null)?f.a.la(R.cloneNode(!0).childNodes):(b=b.text(),f.a.ua(b,I))},f.ba.Ma=new f.ba,f.gc(f.ba.Ma),f.b("nativeTemplateEngine",f.ba),function(){f.$a=function(){var R=this.Hd=function(){if(!o||!o.tmpl)return 0;try{if(0<=o.tmpl.tag.tmpl.open.toString().indexOf("__"))return 2}catch{}return 1}();this.renderTemplateSource=function(E,I,w,N){if(N=N||n,w=w||{},2>R)throw Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later.");var B=E.data("precompiled");return B||(B=E.text()||"",B=o.template(null,"{{ko_with $item.koBindingContext}}"+B+"{{/ko_with}}"),E.data("precompiled",B)),E=[I.$data],I=o.extend({koBindingContext:I},w.templateOptions),I=o.tmpl(B,E,I),I.appendTo(N.createElement("div")),o.fragments={},I},this.createJavaScriptEvaluatorBlock=function(E){return"{{ko_code ((function() { return "+E+" })()) }}"},this.addTemplate=function(E,I){n.write("<script type='text/html' id='"+E+"'>"+I+"<\/script>")},0<R&&(o.tmpl.tag.ko_code={open:"__.push($1 || '');"},o.tmpl.tag.ko_with={open:"with($1) {",close:"} "})},f.$a.prototype=new f.ca,f.$a.prototype.constructor=f.$a;var b=new f.$a;0<b.Hd&&f.gc(b),f.b("jqueryTmplTemplateEngine",f.$a)}()})})()})()})();var H_t=ko;typeof window<"u"?(ko=window.ko,typeof gA<"u"?window.ko=gA:delete window.ko):(ko=global.ko,typeof gA<"u"?global.ko=gA:delete global.ko);var fS=H_t;var yxo=T(S(),1);/** * @license * Knockout ES5 plugin - https://github.com/SteveSanderson/knockout-es5 * Copyright (c) Steve Sanderson * MIT license */var $7="__knockoutObservables",e6="__knockoutSubscribable";function eSe(e,t){if(!e)throw new Error("When calling ko.track, you must pass an object as the first parameter.");var n=this,i=tSe(e,!0);return t=t||Object.getOwnPropertyNames(e),t.forEach(function(o){if(!(o===$7||o===e6)&&!(o in i)){var r=e[o],s=r instanceof Array,a=n.isObservable(r)?r:s?n.observableArray(r):n.observable(r);Object.defineProperty(e,o,{configurable:!0,enumerable:!0,get:a,set:n.isWriteableObservable(a)?a:void 0}),i[o]=a,s&&K_t(n,a)}}),e}function tSe(e,t){var n=e[$7];return!n&&t&&(n={},Object.defineProperty(e,$7,{value:n})),n}function z_t(e,t,n){var i=this,o={owner:e,deferEvaluation:!0};if(typeof n=="function")o.read=n;else{if("value"in n)throw new Error('For ko.defineProperty, you must not specify a "value" for the property. You must provide a "get" function.');if(typeof n.get!="function")throw new Error('For ko.defineProperty, the third parameter must be either an evaluator function, or an options object containing a function called "get".');o.read=n.get,o.write=n.set}return e[t]=i.computed(o),eSe.call(i,e,[t]),e}function K_t(e,t){var n=null;e.computed(function(){n&&(n.dispose(),n=null);var i=t();i instanceof Array&&(n=J_t(e,t,i))})}function J_t(e,t,n){var i=Q_t(e,n);return i.subscribe(t)}function Q_t(e,t){var n=t[e6];if(!n){n=new e.subscribable,Object.defineProperty(t,e6,{value:n});var i={};j_t(t,n,i),q_t(e,t,n,i)}return n}function j_t(e,t,n){["pop","push","reverse","shift","sort","splice","unshift"].forEach(function(i){var o=e[i];e[i]=function(){var r=o.apply(this,arguments);return n.pause!==!0&&t.notifySubscribers(this),r}})}function q_t(e,t,n,i){["remove","removeAll","destroy","destroyAll","replace"].forEach(function(o){Object.defineProperty(t,o,{enumerable:!1,value:function(){var r;i.pause=!0;try{r=e.observableArray.fn[o].apply(e.observableArray(t),arguments)}finally{i.pause=!1}return n.notifySubscribers(t),r}})})}function nSe(e,t){if(!e)return null;var n=tSe(e,!1);return n&&n[t]||null}function $_t(e,t){var n=nSe(e,t);n&&n.valueHasMutated()}function eTt(e){e.track=eSe,e.getObservable=nSe,e.valueHasMutated=$_t,e.defineProperty=z_t}var yA={attachToKo:eTt};var _xo=T(S(),1),iSe="http://www.w3.org/2000/svg",oSe="cesium-svgPath-svg",tTt={register:function(e){e.bindingHandlers.cesiumSvgPath={init:function(t,n){let i=document.createElementNS(iSe,"svg:svg");i.setAttribute("class",oSe);let o=document.createElementNS(iSe,"path");return i.appendChild(o),e.virtualElements.setDomNodeChildren(t,[i]),e.computed({read:function(){let r=e.unwrap(n());o.setAttribute("d",e.unwrap(r.path));let s=e.unwrap(r.width),a=e.unwrap(r.height);i.setAttribute("width",s),i.setAttribute("height",a),i.setAttribute("viewBox",`0 0 ${s} ${a}`),r.css&&i.setAttribute("class",`${oSe} ${e.unwrap(r.css)}`)},disposeWhenNodeIsRemoved:t}),{controlsDescendantBindings:!0}}},e.virtualElements.allowedBindings.cesiumSvgPath=!0}},xA=tTt;yA.attachToKo(fS);xA.register(fS);var Ce=fS;function _A(e){l(e)||(e=new Sm),this._clock=e,this._eventHelper=new Rr,this._eventHelper.add(e.onTick,this.synchronize,this),this.systemTime=Ce.observable(te.now()),this.systemTime.equalityComparer=te.equals,this.startTime=Ce.observable(e.startTime),this.startTime.equalityComparer=te.equals,this.startTime.subscribe(function(t){e.startTime=t,this.synchronize()},this),this.stopTime=Ce.observable(e.stopTime),this.stopTime.equalityComparer=te.equals,this.stopTime.subscribe(function(t){e.stopTime=t,this.synchronize()},this),this.currentTime=Ce.observable(e.currentTime),this.currentTime.equalityComparer=te.equals,this.currentTime.subscribe(function(t){e.currentTime=t,this.synchronize()},this),this.multiplier=Ce.observable(e.multiplier),this.multiplier.subscribe(function(t){e.multiplier=t,this.synchronize()},this),this.clockStep=Ce.observable(e.clockStep),this.clockStep.subscribe(function(t){e.clockStep=t,this.synchronize()},this),this.clockRange=Ce.observable(e.clockRange),this.clockRange.subscribe(function(t){e.clockRange=t,this.synchronize()},this),this.canAnimate=Ce.observable(e.canAnimate),this.canAnimate.subscribe(function(t){e.canAnimate=t,this.synchronize()},this),this.shouldAnimate=Ce.observable(e.shouldAnimate),this.shouldAnimate.subscribe(function(t){e.shouldAnimate=t,this.synchronize()},this),Ce.track(this,["systemTime","startTime","stopTime","currentTime","multiplier","clockStep","clockRange","canAnimate","shouldAnimate"])}Object.defineProperties(_A.prototype,{clock:{get:function(){return this._clock}}});_A.prototype.synchronize=function(){let e=this._clock;this.systemTime=te.now(),this.startTime=e.startTime,this.stopTime=e.stopTime,this.currentTime=e.currentTime,this.multiplier=e.multiplier,this.clockStep=e.clockStep,this.clockRange=e.clockRange,this.canAnimate=e.canAnimate,this.shouldAnimate=e.shouldAnimate};_A.prototype.isDestroyed=function(){return!1};_A.prototype.destroy=function(){this._eventHelper.removeAll(),me(this)};var TA=_A;var Wxo=T(S(),1);function nTt(){this.canExecute=void 0,this.beforeExecute=void 0,this.afterExecute=void 0,fe.throwInstantiationError()}var t6=nTt;var Fxo=T(S(),1);var SA={};SA.createCheckbox=function(e,t,n){let i=document.createElement("div"),o=document.createElement("label"),r=document.createElement("input");r.type="checkbox";let s=`checked: ${t}`;return l(n)&&(s+=`, enable: ${n}`),r.setAttribute("data-bind",s),o.appendChild(r),o.appendChild(document.createTextNode(e)),i.appendChild(o),i};SA.createSection=function(e,t,n,i){let o=document.createElement("div");o.className="cesium-cesiumInspector-section",o.setAttribute("data-bind",`css: { "cesium-cesiumInspector-section-collapsed": !${n} }`),e.appendChild(o);let r=document.createElement("h3");r.className="cesium-cesiumInspector-sectionHeader",r.appendChild(document.createTextNode(t)),r.setAttribute("data-bind",`click: ${i}`),o.appendChild(r);let s=document.createElement("div");return s.className="cesium-cesiumInspector-sectionContent",o.appendChild(s),s};SA.createRangeInput=function(e,t,n,i,o,r){r=y(r,t);let s=document.createElement("input");s.setAttribute("data-bind",`value: ${r}`),s.type="number";let a=document.createElement("input");a.type="range",a.min=n,a.max=i,a.step=y(o,"any"),a.setAttribute("data-bind",`valueUpdate: "input", value: ${t}`);let c=document.createElement("div");c.appendChild(a);let d=document.createElement("div");return d.className="cesium-cesiumInspector-slider",d.appendChild(document.createTextNode(e)),d.appendChild(s),d.appendChild(c),d};SA.createButton=function(e,t,n){let i=document.createElement("button");i.type="button",i.textContent=e,i.className="cesium-cesiumInspector-pickButton";let o=`click: ${t}`;return l(n)&&(o+=`, css: {"cesium-cesiumInspector-pickButtonHighlight" : ${n}}`),i.setAttribute("data-bind",o),i};var Ma=SA;var Dxo=T(S(),1);function rSe(e,t){this._command=e,t=y(t,y.EMPTY_OBJECT),this.toggled=y(t.toggled,!1),this.tooltip=y(t.tooltip,""),Ce.track(this,["toggled","tooltip"])}Object.defineProperties(rSe.prototype,{command:{get:function(){return this._command}}});var vy=rSe;var Kxo=T(S(),1);function iTt(e,t){t=y(t,!0);let n=new ge,i=new ge;function o(){let r={args:arguments,cancel:!1},s;return n.raiseEvent(r),r.cancel||(s=e.apply(null,arguments),i.raiseEvent(s)),s}return o.canExecute=t,Ce.track(o,["canExecute"]),Object.defineProperties(o,{beforeExecute:{value:n},afterExecute:{value:i}}),o}var Vn=iTt;var jxo=T(S(),1);function oTt(e,t,n,i,o){return n.call(i,e[t]),Ce.getObservable(e,t).subscribe(n,i,o)}var ba=oTt;var n_o=T(S(),1);var pS="http://www.w3.org/2000/svg",cSe="http://www.w3.org/1999/xlink",D3,CA=Y.fromCssColorString("rgba(247,250,255,0.384)"),B3=Y.fromCssColorString("rgba(143,191,255,0.216)"),n6=Y.fromCssColorString("rgba(153,197,255,0.098)"),Y3=Y.fromCssColorString("rgba(255,255,255,0.086)"),rTt=Y.fromCssColorString("rgba(255,255,255,0.267)"),sTt=Y.fromCssColorString("rgba(255,255,255,0)"),sSe=Y.fromCssColorString("rgba(66,67,68,0.3)"),aSe=Y.fromCssColorString("rgba(0,0,0,0.5)");function wy(e){return Y.fromCssColorString(window.getComputedStyle(e).getPropertyValue("color"))}var VA={animation_pathReset:{tagName:"path",transform:"translate(16,16) scale(0.85) translate(-16,-16)",d:"M24.316,5.318,9.833,13.682,9.833,5.5,5.5,5.5,5.5,25.5,9.833,25.5,9.833,17.318,24.316,25.682z"},animation_pathPause:{tagName:"path",transform:"translate(16,16) scale(0.85) translate(-16,-16)",d:"M13,5.5,7.5,5.5,7.5,25.5,13,25.5zM24.5,5.5,19,5.5,19,25.5,24.5,25.5z"},animation_pathPlay:{tagName:"path",transform:"translate(16,16) scale(0.85) translate(-16,-16)",d:"M6.684,25.682L24.316,15.5L6.684,5.318V25.682z"},animation_pathPlayReverse:{tagName:"path",transform:"translate(16,16) scale(-0.85,0.85) translate(-16,-16)",d:"M6.684,25.682L24.316,15.5L6.684,5.318V25.682z"},animation_pathLoop:{tagName:"path",transform:"translate(16,16) scale(0.85) translate(-16,-16)",d:"M24.249,15.499c-0.009,4.832-3.918,8.741-8.75,8.75c-2.515,0-4.768-1.064-6.365-2.763l2.068-1.442l-7.901-3.703l0.744,8.694l2.193-1.529c2.244,2.594,5.562,4.242,9.26,4.242c6.767,0,12.249-5.482,12.249-12.249H24.249zM15.499,6.75c2.516,0,4.769,1.065,6.367,2.764l-2.068,1.443l7.901,3.701l-0.746-8.693l-2.192,1.529c-2.245-2.594-5.562-4.245-9.262-4.245C8.734,3.25,3.25,8.734,3.249,15.499H6.75C6.758,10.668,10.668,6.758,15.499,6.75z"},animation_pathClock:{tagName:"path",transform:"translate(16,16) scale(0.85) translate(-16,-15.5)",d:"M15.5,2.374C8.251,2.375,2.376,8.251,2.374,15.5C2.376,22.748,8.251,28.623,15.5,28.627c7.249-0.004,13.124-5.879,13.125-13.127C28.624,8.251,22.749,2.375,15.5,2.374zM15.5,25.623C9.909,25.615,5.385,21.09,5.375,15.5C5.385,9.909,9.909,5.384,15.5,5.374c5.59,0.01,10.115,4.535,10.124,10.125C25.615,21.09,21.091,25.615,15.5,25.623zM8.625,15.5c-0.001-0.552-0.448-0.999-1.001-1c-0.553,0-1,0.448-1,1c0,0.553,0.449,1,1,1C8.176,16.5,8.624,16.053,8.625,15.5zM8.179,18.572c-0.478,0.277-0.642,0.889-0.365,1.367c0.275,0.479,0.889,0.641,1.365,0.365c0.479-0.275,0.643-0.887,0.367-1.367C9.27,18.461,8.658,18.297,8.179,18.572zM9.18,10.696c-0.479-0.276-1.09-0.112-1.366,0.366s-0.111,1.09,0.365,1.366c0.479,0.276,1.09,0.113,1.367-0.366C9.821,11.584,9.657,10.973,9.18,10.696zM22.822,12.428c0.478-0.275,0.643-0.888,0.366-1.366c-0.275-0.478-0.89-0.642-1.366-0.366c-0.479,0.278-0.642,0.89-0.366,1.367C21.732,12.54,22.344,12.705,22.822,12.428zM12.062,21.455c-0.478-0.275-1.089-0.111-1.366,0.367c-0.275,0.479-0.111,1.09,0.366,1.365c0.478,0.277,1.091,0.111,1.365-0.365C12.704,22.344,12.54,21.732,12.062,21.455zM12.062,9.545c0.479-0.276,0.642-0.888,0.366-1.366c-0.276-0.478-0.888-0.642-1.366-0.366s-0.642,0.888-0.366,1.366C10.973,9.658,11.584,9.822,12.062,9.545zM22.823,18.572c-0.48-0.275-1.092-0.111-1.367,0.365c-0.275,0.479-0.112,1.092,0.367,1.367c0.477,0.275,1.089,0.113,1.365-0.365C23.464,19.461,23.3,18.848,22.823,18.572zM19.938,7.813c-0.477-0.276-1.091-0.111-1.365,0.366c-0.275,0.48-0.111,1.091,0.366,1.367s1.089,0.112,1.366-0.366C20.581,8.702,20.418,8.089,19.938,7.813zM23.378,14.5c-0.554,0.002-1.001,0.45-1.001,1c0.001,0.552,0.448,1,1.001,1c0.551,0,1-0.447,1-1C24.378,14.949,23.929,14.5,23.378,14.5zM15.501,6.624c-0.552,0-1,0.448-1,1l-0.466,7.343l-3.004,1.96c-0.478,0.277-0.642,0.889-0.365,1.365c0.275,0.479,0.889,0.643,1.365,0.367l3.305-1.676C15.39,16.99,15.444,17,15.501,17c0.828,0,1.5-0.671,1.5-1.5l-0.5-7.876C16.501,7.072,16.053,6.624,15.501,6.624zM15.501,22.377c-0.552,0-1,0.447-1,1s0.448,1,1,1s1-0.447,1-1S16.053,22.377,15.501,22.377zM18.939,21.455c-0.479,0.277-0.643,0.889-0.366,1.367c0.275,0.477,0.888,0.643,1.366,0.365c0.478-0.275,0.642-0.889,0.366-1.365C20.028,21.344,19.417,21.18,18.939,21.455z"},animation_pathWingButton:{tagName:"path",d:"m 4.5,0.5 c -2.216,0 -4,1.784 -4,4 l 0,24 c 0,2.216 1.784,4 4,4 l 13.71875,0 C 22.478584,27.272785 27.273681,22.511272 32.5,18.25 l 0,-13.75 c 0,-2.216 -1.784,-4 -4,-4 l -24,0 z"},animation_pathPointer:{tagName:"path",d:"M-15,-65,-15,-55,15,-55,15,-65,0,-95z"},animation_pathSwooshFX:{tagName:"path",d:"m 85,0 c 0,16.617 -4.813944,35.356 -13.131081,48.4508 h 6.099803 c 8.317138,-13.0948 13.13322,-28.5955 13.13322,-45.2124 0,-46.94483 -38.402714,-85.00262 -85.7743869,-85.00262 -1.0218522,0 -2.0373001,0.0241 -3.0506131,0.0589 45.958443,1.59437 82.723058,35.77285 82.723058,81.70532 z"}};function Ph(e){let t=document.createElementNS(pS,e.tagName);for(let n in e)if(e.hasOwnProperty(n)&&n!=="tagName")if(n==="children"){let i=e.children.length;for(let o=0;o<i;++o)t.appendChild(Ph(e.children[o]))}else n.indexOf("xlink:")===0?t.setAttributeNS(cSe,n.substring(6),e[n]):n==="textContent"?t.textContent=e[n]:t.setAttribute(n,e[n]);return t}function i6(e,t,n){let i=document.createElementNS(pS,"text");i.setAttribute("x",e),i.setAttribute("y",t),i.setAttribute("class","cesium-animation-svgText");let o=document.createElementNS(pS,"tspan");return o.textContent=n,i.appendChild(o),i}function aTt(e,t,n){e.setAttribute("transform",`translate(100,100) rotate(${n})`),t.setAttribute("transform",`rotate(${n})`)}var O3=new Y;function jr(e,t){let n=t.alpha,i=1-n;return O3.red=e.red*i+t.red*n,O3.green=e.green*i+t.green*n,O3.blue=e.blue*i+t.blue*n,O3.toCssColorString()}function o6(e,t,n){let i=VA[n],o={tagName:"g",class:"cesium-animation-rectButton",transform:`translate(${e},${t})`,children:[{tagName:"rect",class:"cesium-animation-buttonGlow",width:32,height:32,rx:2,ry:2},{tagName:"rect",class:"cesium-animation-buttonMain",width:32,height:32,rx:4,ry:4},{class:"cesium-animation-buttonPath",id:n,tagName:i.tagName,transform:i.transform,d:i.d},{tagName:"title",textContent:""}]};return Ph(o)}function cTt(e,t,n){let i=VA[n],o=VA.animation_pathWingButton,r={tagName:"g",class:"cesium-animation-rectButton",transform:`translate(${e},${t})`,children:[{class:"cesium-animation-buttonGlow",id:"animation_pathWingButton",tagName:o.tagName,d:o.d},{class:"cesium-animation-buttonMain",id:"animation_pathWingButton",tagName:o.tagName,d:o.d},{class:"cesium-animation-buttonPath",id:n,tagName:i.tagName,transform:i.transform,d:i.d},{tagName:"title",textContent:""}]};return Ph(r)}function lTt(e,t){let n=e._viewModel,i=n.shuttleRingDragging;if(!(i&&D3!==e))if(t.type==="mousedown"||i&&t.type==="mousemove"||t.type==="touchstart"&&t.touches.length===1||i&&t.type==="touchmove"&&t.touches.length===1){let o=e._centerX,r=e._centerY,a=e._svgNode.getBoundingClientRect(),c,d;if(t.type==="touchstart"||t.type==="touchmove"?(c=t.touches[0].clientX,d=t.touches[0].clientY):(c=t.clientX,d=t.clientY),!i&&(c>a.right||c<a.left||d<a.top||d>a.bottom))return;let u=e._shuttleRingPointer.getBoundingClientRect(),m=c-o-a.left,p=d-r-a.top,g=Math.atan2(p,m)*180/Math.PI+90;g>180&&(g-=360);let f=n.shuttleRingAngle;i||c<u.right&&c>u.left&&d>u.top&&d<u.bottom?(D3=e,n.shuttleRingDragging=!0,n.shuttleRingAngle=g):g<f?n.slower():g>f&&n.faster(),t.preventDefault()}else e===D3&&(D3=void 0),n.shuttleRingDragging=!1}function hb(e,t){this._viewModel=t,this.svgElement=e,this._enabled=void 0,this._toggled=void 0;let n=this;this._clickFunction=function(){let i=n._viewModel.command;i.canExecute&&i()},e.addEventListener("click",this._clickFunction,!0),this._subscriptions=[ba(t,"toggled",this.setToggled,this),ba(t,"tooltip",this.setTooltip,this),ba(t.command,"canExecute",this.setEnabled,this)]}hb.prototype.destroy=function(){this.svgElement.removeEventListener("click",this._clickFunction,!0);let e=this._subscriptions;for(let t=0,n=e.length;t<n;t++)e[t].dispose();me(this)};hb.prototype.isDestroyed=function(){return!1};hb.prototype.setEnabled=function(e){if(this._enabled!==e){if(this._enabled=e,!e){this.svgElement.setAttribute("class","cesium-animation-buttonDisabled");return}if(this._toggled){this.svgElement.setAttribute("class","cesium-animation-rectButton cesium-animation-buttonToggled");return}this.svgElement.setAttribute("class","cesium-animation-rectButton")}};hb.prototype.setToggled=function(e){this._toggled!==e&&(this._toggled=e,this._enabled&&(e?this.svgElement.setAttribute("class","cesium-animation-rectButton cesium-animation-buttonToggled"):this.svgElement.setAttribute("class","cesium-animation-rectButton")))};hb.prototype.setTooltip=function(e){this.svgElement.getElementsByTagName("title")[0].textContent=e};function VL(e,t){e=In(e),this._viewModel=t,this._container=e,this._centerX=0,this._centerY=0,this._defsElement=void 0,this._svgNode=void 0,this._topG=void 0,this._lastHeight=void 0,this._lastWidth=void 0;let n=e.ownerDocument,i=document.createElement("style");i.textContent=".cesium-animation-rectButton .cesium-animation-buttonGlow { filter: url(#animation_blurred); }.cesium-animation-rectButton .cesium-animation-buttonMain { fill: url(#animation_buttonNormal); }.cesium-animation-buttonToggled .cesium-animation-buttonMain { fill: url(#animation_buttonToggled); }.cesium-animation-rectButton:hover .cesium-animation-buttonMain { fill: url(#animation_buttonHovered); }.cesium-animation-buttonDisabled .cesium-animation-buttonMain { fill: url(#animation_buttonDisabled); }.cesium-animation-shuttleRingG .cesium-animation-shuttleRingSwoosh { fill: url(#animation_shuttleRingSwooshGradient); }.cesium-animation-shuttleRingG:hover .cesium-animation-shuttleRingSwoosh { fill: url(#animation_shuttleRingSwooshHovered); }.cesium-animation-shuttleRingPointer { fill: url(#animation_shuttleRingPointerGradient); }.cesium-animation-shuttleRingPausePointer { fill: url(#animation_shuttleRingPointerPaused); }.cesium-animation-knobOuter { fill: url(#animation_knobOuter); }.cesium-animation-knobInner { fill: url(#animation_knobInner); }",n.head.insertBefore(i,n.head.childNodes[0]);let o=document.createElement("div");o.className="cesium-animation-theme",o.innerHTML='<div class="cesium-animation-themeNormal"></div><div class="cesium-animation-themeHover"></div><div class="cesium-animation-themeSelect"></div><div class="cesium-animation-themeDisabled"></div><div class="cesium-animation-themeKnob"></div><div class="cesium-animation-themePointer"></div><div class="cesium-animation-themeSwoosh"></div><div class="cesium-animation-themeSwooshHover"></div>',this._theme=o,this._themeNormal=o.childNodes[0],this._themeHover=o.childNodes[1],this._themeSelect=o.childNodes[2],this._themeDisabled=o.childNodes[3],this._themeKnob=o.childNodes[4],this._themePointer=o.childNodes[5],this._themeSwoosh=o.childNodes[6],this._themeSwooshHover=o.childNodes[7];let r=document.createElementNS(pS,"svg:svg");this._svgNode=r,r.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink",cSe);let s=document.createElementNS(pS,"g");this._topG=s,this._realtimeSVG=new hb(cTt(3,4,"animation_pathClock"),t.playRealtimeViewModel),this._playReverseSVG=new hb(o6(44,99,"animation_pathPlayReverse"),t.playReverseViewModel),this._playForwardSVG=new hb(o6(124,99,"animation_pathPlay"),t.playForwardViewModel),this._pauseSVG=new hb(o6(84,99,"animation_pathPause"),t.pauseViewModel);let a=document.createElementNS(pS,"g");a.appendChild(this._realtimeSVG.svgElement),a.appendChild(this._playReverseSVG.svgElement),a.appendChild(this._playForwardSVG.svgElement),a.appendChild(this._pauseSVG.svgElement);let c=Ph({tagName:"circle",class:"cesium-animation-shuttleRingBack",cx:100,cy:100,r:99});this._shuttleRingBackPanel=c;let d=VA.animation_pathSwooshFX,u=VA.animation_pathPointer,m=Ph({tagName:"g",class:"cesium-animation-shuttleRingSwoosh",children:[{tagName:d.tagName,transform:"translate(100,97) scale(-1,1)",id:"animation_pathSwooshFX",d:d.d},{tagName:d.tagName,transform:"translate(100,97)",id:"animation_pathSwooshFX",d:d.d},{tagName:"line",x1:100,y1:8,x2:100,y2:22}]});this._shuttleRingSwooshG=m,this._shuttleRingPointer=Ph({class:"cesium-animation-shuttleRingPointer",id:"animation_pathPointer",tagName:u.tagName,d:u.d});let p=Ph({tagName:"g",transform:"translate(100,100)"});this._knobOuter=Ph({tagName:"circle",class:"cesium-animation-knobOuter",cx:0,cy:0,r:71});let g=61,f=Ph({tagName:"circle",class:"cesium-animation-knobInner",cx:0,cy:0,r:g});this._knobDate=i6(0,-24,""),this._knobTime=i6(0,-7,""),this._knobStatus=i6(0,-41,"");let x=Ph({tagName:"circle",class:"cesium-animation-blank",cx:0,cy:0,r:g}),_=document.createElementNS(pS,"g");_.setAttribute("class","cesium-animation-shuttleRingG"),e.appendChild(o),s.appendChild(_),s.appendChild(p),s.appendChild(a),_.appendChild(c),_.appendChild(m),_.appendChild(this._shuttleRingPointer),p.appendChild(this._knobOuter),p.appendChild(f),p.appendChild(this._knobDate),p.appendChild(this._knobTime),p.appendChild(this._knobStatus),p.appendChild(x),r.appendChild(s),e.appendChild(r);let C=this;function V(v){lTt(C,v)}this._mouseCallback=V,c.addEventListener("mousedown",V,!0),c.addEventListener("touchstart",V,!0),m.addEventListener("mousedown",V,!0),m.addEventListener("touchstart",V,!0),n.addEventListener("mousemove",V,!0),n.addEventListener("touchmove",V,!0),n.addEventListener("mouseup",V,!0),n.addEventListener("touchend",V,!0),n.addEventListener("touchcancel",V,!0),this._shuttleRingPointer.addEventListener("mousedown",V,!0),this._shuttleRingPointer.addEventListener("touchstart",V,!0),this._knobOuter.addEventListener("mousedown",V,!0),this._knobOuter.addEventListener("touchstart",V,!0);let L=this._knobTime.childNodes[0],Z=this._knobDate.childNodes[0],G=this._knobStatus.childNodes[0],X;this._subscriptions=[ba(t.pauseViewModel,"toggled",function(v){X!==v&&(X=v,X?C._shuttleRingPointer.setAttribute("class","cesium-animation-shuttleRingPausePointer"):C._shuttleRingPointer.setAttribute("class","cesium-animation-shuttleRingPointer"))}),ba(t,"shuttleRingAngle",function(v){aTt(C._shuttleRingPointer,C._knobOuter,v)}),ba(t,"dateLabel",function(v){Z.textContent!==v&&(Z.textContent=v)}),ba(t,"timeLabel",function(v){L.textContent!==v&&(L.textContent=v)}),ba(t,"multiplierLabel",function(v){G.textContent!==v&&(G.textContent=v)})],this.applyThemeChanges(),this.resize()}Object.defineProperties(VL.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});VL.prototype.isDestroyed=function(){return!1};VL.prototype.destroy=function(){l(this._observer)&&(this._observer.disconnect(),this._observer=void 0);let e=this._container.ownerDocument,t=this._mouseCallback;this._shuttleRingBackPanel.removeEventListener("mousedown",t,!0),this._shuttleRingBackPanel.removeEventListener("touchstart",t,!0),this._shuttleRingSwooshG.removeEventListener("mousedown",t,!0),this._shuttleRingSwooshG.removeEventListener("touchstart",t,!0),e.removeEventListener("mousemove",t,!0),e.removeEventListener("touchmove",t,!0),e.removeEventListener("mouseup",t,!0),e.removeEventListener("touchend",t,!0),e.removeEventListener("touchcancel",t,!0),this._shuttleRingPointer.removeEventListener("mousedown",t,!0),this._shuttleRingPointer.removeEventListener("touchstart",t,!0),this._knobOuter.removeEventListener("mousedown",t,!0),this._knobOuter.removeEventListener("touchstart",t,!0),this._container.removeChild(this._svgNode),this._container.removeChild(this._theme),this._realtimeSVG.destroy(),this._playReverseSVG.destroy(),this._playForwardSVG.destroy(),this._pauseSVG.destroy();let n=this._subscriptions;for(let i=0,o=n.length;i<o;i++)n[i].dispose();return me(this)};VL.prototype.resize=function(){let e=this._container.clientWidth,t=this._container.clientHeight;if(e===this._lastWidth&&t===this._lastHeight)return;let n=this._svgNode,i=200,o=132,r=e,s=t;e===0&&t===0?(r=i,s=o):e===0?(s=t,r=i*(t/o)):t===0&&(r=e,s=o*(e/i));let a=r/i,c=s/o;n.style.cssText=`width: ${r}px; height: ${s}px; position: absolute; bottom: 0; left: 0; overflow: hidden;`,n.setAttribute("width",r),n.setAttribute("height",s),n.setAttribute("viewBox",`0 0 ${r} ${s}`),this._topG.setAttribute("transform",`scale(${a},${c})`),this._centerX=Math.max(1,100*a),this._centerY=Math.max(1,100*c),this._lastHeight=e,this._lastWidth=t};VL.prototype.applyThemeChanges=function(){let e=this._container.ownerDocument;if(!e.body.contains(this._container)){if(l(this._observer))return;let u=this;u._observer=new MutationObserver(function(){e.body.contains(u._container)&&(u._observer.disconnect(),u._observer=void 0,u.applyThemeChanges())}),u._observer.observe(e,{childList:!0,subtree:!0});return}let t=wy(this._themeNormal),n=wy(this._themeHover),i=wy(this._themeSelect),o=wy(this._themeDisabled),r=wy(this._themeKnob),s=wy(this._themePointer),a=wy(this._themeSwoosh),c=wy(this._themeSwooshHover),d=Ph({tagName:"defs",children:[{id:"animation_buttonNormal",tagName:"linearGradient",x1:"50%",y1:"0%",x2:"50%",y2:"100%",children:[{tagName:"stop",offset:"0%","stop-color":jr(t,CA)},{tagName:"stop",offset:"12%","stop-color":jr(t,B3)},{tagName:"stop",offset:"46%","stop-color":jr(t,n6)},{tagName:"stop",offset:"81%","stop-color":jr(t,Y3)}]},{id:"animation_buttonHovered",tagName:"linearGradient",x1:"50%",y1:"0%",x2:"50%",y2:"100%",children:[{tagName:"stop",offset:"0%","stop-color":jr(n,CA)},{tagName:"stop",offset:"12%","stop-color":jr(n,B3)},{tagName:"stop",offset:"46%","stop-color":jr(n,n6)},{tagName:"stop",offset:"81%","stop-color":jr(n,Y3)}]},{id:"animation_buttonToggled",tagName:"linearGradient",x1:"50%",y1:"0%",x2:"50%",y2:"100%",children:[{tagName:"stop",offset:"0%","stop-color":jr(i,CA)},{tagName:"stop",offset:"12%","stop-color":jr(i,B3)},{tagName:"stop",offset:"46%","stop-color":jr(i,n6)},{tagName:"stop",offset:"81%","stop-color":jr(i,Y3)}]},{id:"animation_buttonDisabled",tagName:"linearGradient",x1:"50%",y1:"0%",x2:"50%",y2:"100%",children:[{tagName:"stop",offset:"0%","stop-color":jr(o,rTt)},{tagName:"stop",offset:"75%","stop-color":jr(o,sTt)}]},{id:"animation_blurred",tagName:"filter",width:"200%",height:"200%",x:"-50%",y:"-50%",children:[{tagName:"feGaussianBlur",stdDeviation:4,in:"SourceGraphic"}]},{id:"animation_shuttleRingSwooshGradient",tagName:"linearGradient",x1:"50%",y1:"0%",x2:"50%",y2:"100%",children:[{tagName:"stop",offset:"0%","stop-opacity":.2,"stop-color":a.toCssColorString()},{tagName:"stop",offset:"85%","stop-opacity":.85,"stop-color":a.toCssColorString()},{tagName:"stop",offset:"95%","stop-opacity":.05,"stop-color":a.toCssColorString()}]},{id:"animation_shuttleRingSwooshHovered",tagName:"linearGradient",x1:"50%",y1:"0%",x2:"50%",y2:"100%",children:[{tagName:"stop",offset:"0%","stop-opacity":.2,"stop-color":c.toCssColorString()},{tagName:"stop",offset:"85%","stop-opacity":.85,"stop-color":c.toCssColorString()},{tagName:"stop",offset:"95%","stop-opacity":.05,"stop-color":c.toCssColorString()}]},{id:"animation_shuttleRingPointerGradient",tagName:"linearGradient",x1:"0%",y1:"50%",x2:"100%",y2:"50%",children:[{tagName:"stop",offset:"0%","stop-color":s.toCssColorString()},{tagName:"stop",offset:"40%","stop-color":s.toCssColorString()},{tagName:"stop",offset:"60%","stop-color":jr(s,aSe)},{tagName:"stop",offset:"100%","stop-color":jr(s,aSe)}]},{id:"animation_shuttleRingPointerPaused",tagName:"linearGradient",x1:"0%",y1:"50%",x2:"100%",y2:"50%",children:[{tagName:"stop",offset:"0%","stop-color":"#CCC"},{tagName:"stop",offset:"40%","stop-color":"#CCC"},{tagName:"stop",offset:"60%","stop-color":"#555"},{tagName:"stop",offset:"100%","stop-color":"#555"}]},{id:"animation_knobOuter",tagName:"linearGradient",x1:"20%",y1:"0%",x2:"90%",y2:"100%",children:[{tagName:"stop",offset:"5%","stop-color":jr(r,CA)},{tagName:"stop",offset:"60%","stop-color":jr(r,sSe)},{tagName:"stop",offset:"85%","stop-color":jr(r,B3)}]},{id:"animation_knobInner",tagName:"linearGradient",x1:"20%",y1:"0%",x2:"90%",y2:"100%",children:[{tagName:"stop",offset:"5%","stop-color":jr(r,sSe)},{tagName:"stop",offset:"60%","stop-color":jr(r,CA)},{tagName:"stop",offset:"85%","stop-color":jr(r,Y3)}]}]});l(this._defsElement)?this._svgNode.replaceChild(d,this._defsElement):this._svgNode.appendChild(d),this._defsElement=d};var LA=VL;var d_o=T(S(),1);var dTt=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],Fy=15,LL=105;function lSe(e,t){return e-t}function r6(e,t){let n=Ro(t,e,lSe);return n<0?~n:n}function uTt(e,t){if(Math.abs(e)<=Fy)return e/Fy;let n=Fy,i=LL,o,r=0,s;return e>0?(o=Math.log(t[t.length-1]),s=(o-r)/(i-n),Math.exp(r+s*(e-n))):(o=Math.log(-t[0]),s=(o-r)/(i-n),-Math.exp(r+s*(Math.abs(e)-n)))}function mTt(e,t,n){if(n.clockStep===co.SYSTEM_CLOCK)return Fy;if(Math.abs(e)<=1)return e*Fy;let i=t[t.length-1];e>i?e=i:e<-i&&(e=-i);let o=Fy,r=LL,s,a=0,c;return e>0?(s=Math.log(i),c=(s-a)/(r-o),(Math.log(e)-a)/c+o):(s=Math.log(-t[0]),c=(s-a)/(r-o),-((Math.log(Math.abs(e))-a)/c+o))}function am(e){let t=this;this._clockViewModel=e,this._allShuttleRingTicks=[],this._dateFormatter=am.defaultDateFormatter,this._timeFormatter=am.defaultTimeFormatter,this.shuttleRingDragging=!1,this.snapToTicks=!1,Ce.track(this,["_allShuttleRingTicks","_dateFormatter","_timeFormatter","shuttleRingDragging","snapToTicks"]),this._sortedFilteredPositiveTicks=[],this.setShuttleRingTicks(am.defaultTicks),this.timeLabel=void 0,Ce.defineProperty(this,"timeLabel",function(){return t._timeFormatter(t._clockViewModel.currentTime,t)}),this.dateLabel=void 0,Ce.defineProperty(this,"dateLabel",function(){return t._dateFormatter(t._clockViewModel.currentTime,t)}),this.multiplierLabel=void 0,Ce.defineProperty(this,"multiplierLabel",function(){let s=t._clockViewModel;if(s.clockStep===co.SYSTEM_CLOCK)return"Today";let a=s.multiplier;return a%1===0?`${a.toFixed(0)}x`:`${a.toFixed(3).replace(/0{0,3}$/,"")}x`}),this.shuttleRingAngle=void 0,Ce.defineProperty(this,"shuttleRingAngle",{get:function(){return mTt(e.multiplier,t._allShuttleRingTicks,e)},set:function(s){s=Math.max(Math.min(s,LL),-LL);let a=t._allShuttleRingTicks,c=t._clockViewModel;if(c.clockStep=co.SYSTEM_CLOCK_MULTIPLIER,Math.abs(s)===LL){c.multiplier=s>0?a[a.length-1]:a[0];return}let d=uTt(s,a);if(t.snapToTicks)d=a[r6(d,a)];else if(d!==0){let u=Math.abs(d);if(u>100){let m=u.toFixed(0).length-2,p=Math.pow(10,m);d=Math.round(d/p)*p|0}else u>Fy?d=Math.round(d):u>1?d=+d.toFixed(1):u>0&&(d=+d.toFixed(2))}c.multiplier=d}}),this._canAnimate=void 0,Ce.defineProperty(this,"_canAnimate",function(){let s=t._clockViewModel,a=s.clockRange;if(t.shuttleRingDragging||a===Cr.UNBOUNDED)return!0;let c=s.multiplier,d=s.currentTime,u=s.startTime,m=!1;if(a===Cr.LOOP_STOP)m=te.greaterThan(d,u)||d.equals(u)&&c>0;else{let p=s.stopTime;m=te.greaterThan(d,u)&&te.lessThan(d,p)||d.equals(u)&&c>0||d.equals(p)&&c<0}return m||(s.shouldAnimate=!1),m}),this._isSystemTimeAvailable=void 0,Ce.defineProperty(this,"_isSystemTimeAvailable",function(){let s=t._clockViewModel;if(s.clockRange===Cr.UNBOUNDED)return!0;let c=s.systemTime;return te.greaterThanOrEquals(c,s.startTime)&&te.lessThanOrEquals(c,s.stopTime)}),this._isAnimating=void 0,Ce.defineProperty(this,"_isAnimating",function(){return t._clockViewModel.shouldAnimate&&(t._canAnimate||t.shuttleRingDragging)});let n=Vn(function(){let s=t._clockViewModel;s.shouldAnimate?s.shouldAnimate=!1:t._canAnimate&&(s.shouldAnimate=!0)});this._pauseViewModel=new vy(n,{toggled:Ce.computed(function(){return!t._isAnimating}),tooltip:"Pause"});let i=Vn(function(){let s=t._clockViewModel,a=s.multiplier;a>0&&(s.multiplier=-a),s.shouldAnimate=!0});this._playReverseViewModel=new vy(i,{toggled:Ce.computed(function(){return t._isAnimating&&e.multiplier<0}),tooltip:"Play Reverse"});let o=Vn(function(){let s=t._clockViewModel,a=s.multiplier;a<0&&(s.multiplier=-a),s.shouldAnimate=!0});this._playForwardViewModel=new vy(o,{toggled:Ce.computed(function(){return t._isAnimating&&e.multiplier>0&&e.clockStep!==co.SYSTEM_CLOCK}),tooltip:"Play Forward"});let r=Vn(function(){t._clockViewModel.clockStep=co.SYSTEM_CLOCK},Ce.getObservable(this,"_isSystemTimeAvailable"));this._playRealtimeViewModel=new vy(r,{toggled:Ce.computed(function(){return e.clockStep===co.SYSTEM_CLOCK}),tooltip:Ce.computed(function(){return t._isSystemTimeAvailable?"Today (real-time)":"Current time not in range"})}),this._slower=Vn(function(){let s=t._clockViewModel,a=t._allShuttleRingTicks,c=s.multiplier,d=r6(c,a)-1;d>=0&&(s.multiplier=a[d])}),this._faster=Vn(function(){let s=t._clockViewModel,a=t._allShuttleRingTicks,c=s.multiplier,d=r6(c,a)+1;d<a.length&&(s.multiplier=a[d])})}am.defaultDateFormatter=function(e,t){let n=te.toGregorianDate(e);return`${dTt[n.month-1]} ${n.day} ${n.year}`};am.defaultTicks=[.001,.002,.005,.01,.02,.05,.1,.25,.5,1,2,5,10,15,30,60,120,300,600,900,1800,3600,7200,14400,21600,43200,86400,172800,345600,604800];am.defaultTimeFormatter=function(e,t){let n=te.toGregorianDate(e),i=Math.round(n.millisecond);return Math.abs(t._clockViewModel.multiplier)<1?`${n.hour.toString().padStart(2,"0")}:${n.minute.toString().padStart(2,"0")}:${n.second.toString().padStart(2,"0")}.${i.toString().padStart(3,"0")}`:`${n.hour.toString().padStart(2,"0")}:${n.minute.toString().padStart(2,"0")}:${n.second.toString().padStart(2,"0")} UTC`};am.prototype.getShuttleRingTicks=function(){return this._sortedFilteredPositiveTicks.slice(0)};am.prototype.setShuttleRingTicks=function(e){let t,n,i,o={},r=this._sortedFilteredPositiveTicks;for(r.length=0,t=0,n=e.length;t<n;++t)i=e[t],o.hasOwnProperty(i)||(o[i]=!0,r.push(i));r.sort(lSe);let s=[];for(n=r.length,t=n-1;t>=0;--t)i=r[t],i!==0&&s.push(-i);Array.prototype.push.apply(s,r),this._allShuttleRingTicks=s};Object.defineProperties(am.prototype,{slower:{get:function(){return this._slower}},faster:{get:function(){return this._faster}},clockViewModel:{get:function(){return this._clockViewModel}},pauseViewModel:{get:function(){return this._pauseViewModel}},playReverseViewModel:{get:function(){return this._playReverseViewModel}},playForwardViewModel:{get:function(){return this._playForwardViewModel}},playRealtimeViewModel:{get:function(){return this._playRealtimeViewModel}},dateFormatter:{get:function(){return this._dateFormatter},set:function(e){this._dateFormatter=e}},timeFormatter:{get:function(){return this._timeFormatter},set:function(e){this._timeFormatter=e}}});am._maxShuttleRingAngle=LL;am._realtimeShuttleRingAngle=Fy;var RA=am;var C_o=T(S(),1);var b_o=T(S(),1);function dSe(e){e=y(e,y.EMPTY_OBJECT);let t=e.globe,n=y(e.imageryProviderViewModels,[]),i=y(e.terrainProviderViewModels,[]);this._globe=t,this.imageryProviderViewModels=n.slice(0),this.terrainProviderViewModels=i.slice(0),this.dropDownVisible=!1,Ce.track(this,["imageryProviderViewModels","terrainProviderViewModels","dropDownVisible"]);let o=Ce.getObservable(this,"imageryProviderViewModels"),r=Ce.pureComputed(function(){let m=o(),p={},g;for(g=0;g<m.length;g++){let _=m[g],C=_.category;l(p[C])?p[C].push(_):p[C]=[_]}let f=Object.keys(p),x=[];for(g=0;g<f.length;g++){let _=f[g];x.push({name:_,providers:p[_]})}return x});this._imageryProviders=r;let s=Ce.getObservable(this,"terrainProviderViewModels"),a=Ce.pureComputed(function(){let m=s(),p={},g;for(g=0;g<m.length;g++){let _=m[g],C=_.category;l(p[C])?p[C].push(_):p[C]=[_]}let f=Object.keys(p),x=[];for(g=0;g<f.length;g++){let _=f[g];x.push({name:_,providers:p[_]})}return x});this._terrainProviders=a,this.buttonTooltip=void 0,Ce.defineProperty(this,"buttonTooltip",function(){let m=this.selectedImagery,p=this.selectedTerrain,g=l(m)?m.name:void 0,f=l(p)?p.name:void 0;return l(g)&&l(f)?`${g} ${f}`:l(g)?g:f}),this.buttonImageUrl=void 0,Ce.defineProperty(this,"buttonImageUrl",function(){let m=this.selectedImagery;if(l(m))return m.iconUrl}),this.selectedImagery=void 0;let c=Ce.observable();this._currentImageryLayers=[],Ce.defineProperty(this,"selectedImagery",{get:function(){return c()},set:function(m){if(c()===m){this.dropDownVisible=!1;return}let p,g=this._currentImageryLayers,f=g.length,x=this._globe.imageryLayers,_=!1;for(p=0;p<f;p++){let C=x.length;for(let V=0;V<C;V++){let L=x.get(V);if(L===g[p]){x.remove(L),_=!0;break}}}if(l(m)){let C=m.creationCommand();if(Array.isArray(C)){let V=C.length;for(this._currentImageryLayers=[],p=V-1;p>=0;p--){let L=ma.fromProviderAsync(C[p]);x.add(L,0),this._currentImageryLayers.push(L)}}else{this._currentImageryLayers=[];let V=ma.fromProviderAsync(C);if(V.name=m.name,_)x.add(V,0);else{let L=x.get(0);l(L)&&x.remove(L),x.add(V,0)}this._currentImageryLayers.push(V)}}c(m),this.dropDownVisible=!1}}),this.selectedTerrain=void 0;let d=Ce.observable();Ce.defineProperty(this,"selectedTerrain",{get:function(){return d()},set:function(m){if(d()===m){this.dropDownVisible=!1;return}let p;if(l(m)&&(p=m.creationCommand()),l(p)&&!l(p.then))this._globe.depthTestAgainstTerrain=!(p instanceof qh),this._globe.terrainProvider=p;else if(l(p)){let g=!1,f=this._globe.terrainProviderChanged.addEventListener(()=>{g=!0,f()}),_=new hA(p).readyEvent.addEventListener(C=>{g||(this._globe.depthTestAgainstTerrain=!(C instanceof qh),this._globe.terrainProvider=C,_())})}d(m),this.dropDownVisible=!1}});let u=this;this._toggleDropDown=Vn(function(){u.dropDownVisible=!u.dropDownVisible}),this.selectedImagery=y(e.selectedImageryProviderViewModel,n[0]),this.selectedTerrain=y(e.selectedTerrainProviderViewModel,i[0])}Object.defineProperties(dSe.prototype,{toggleDropDown:{get:function(){return this._toggleDropDown}},globe:{get:function(){return this._globe}}});var ZA=dSe;function H3(e,t){e=In(e);let n=new ZA(t),i=document.createElement("button");i.type="button",i.className="cesium-button cesium-toolbar-button",i.setAttribute("data-bind","attr: { title: buttonTooltip },click: toggleDropDown"),e.appendChild(i);let o=document.createElement("img");o.setAttribute("draggable","false"),o.className="cesium-baseLayerPicker-selected",o.setAttribute("data-bind","attr: { src: buttonImageUrl }, visible: !!buttonImageUrl"),i.appendChild(o);let r=document.createElement("div");r.className="cesium-baseLayerPicker-dropDown",r.setAttribute("data-bind",'css: { "cesium-baseLayerPicker-dropDown-visible" : dropDownVisible }'),e.appendChild(r);let s=document.createElement("div");s.className="cesium-baseLayerPicker-sectionTitle",s.setAttribute("data-bind","visible: imageryProviderViewModels.length > 0"),s.innerHTML="Imagery",r.appendChild(s);let a=document.createElement("div");a.className="cesium-baseLayerPicker-section",a.setAttribute("data-bind","foreach: _imageryProviders"),r.appendChild(a);let c=document.createElement("div");c.className="cesium-baseLayerPicker-category",a.appendChild(c);let d=document.createElement("div");d.className="cesium-baseLayerPicker-categoryTitle",d.setAttribute("data-bind","text: name"),c.appendChild(d);let u=document.createElement("div");u.className="cesium-baseLayerPicker-choices",u.setAttribute("data-bind","foreach: providers"),c.appendChild(u);let m=document.createElement("div");m.className="cesium-baseLayerPicker-item",m.setAttribute("data-bind",'css: { "cesium-baseLayerPicker-selectedItem" : $data === $parents[1].selectedImagery },attr: { title: tooltip },visible: creationCommand.canExecute,click: function($data) { $parents[1].selectedImagery = $data; }'),u.appendChild(m);let p=document.createElement("img");p.className="cesium-baseLayerPicker-itemIcon",p.setAttribute("data-bind","attr: { src: iconUrl }"),p.setAttribute("draggable","false"),m.appendChild(p);let g=document.createElement("div");g.className="cesium-baseLayerPicker-itemLabel",g.setAttribute("data-bind","text: name"),m.appendChild(g);let f=document.createElement("div");f.className="cesium-baseLayerPicker-sectionTitle",f.setAttribute("data-bind","visible: terrainProviderViewModels.length > 0"),f.innerHTML="Terrain",r.appendChild(f);let x=document.createElement("div");x.className="cesium-baseLayerPicker-section",x.setAttribute("data-bind","foreach: _terrainProviders"),r.appendChild(x);let _=document.createElement("div");_.className="cesium-baseLayerPicker-category",x.appendChild(_);let C=document.createElement("div");C.className="cesium-baseLayerPicker-categoryTitle",C.setAttribute("data-bind","text: name"),_.appendChild(C);let V=document.createElement("div");V.className="cesium-baseLayerPicker-choices",V.setAttribute("data-bind","foreach: providers"),_.appendChild(V);let L=document.createElement("div");L.className="cesium-baseLayerPicker-item",L.setAttribute("data-bind",'css: { "cesium-baseLayerPicker-selectedItem" : $data === $parents[1].selectedTerrain },attr: { title: tooltip },visible: creationCommand.canExecute,click: function($data) { $parents[1].selectedTerrain = $data; }'),V.appendChild(L);let Z=document.createElement("img");Z.className="cesium-baseLayerPicker-itemIcon",Z.setAttribute("data-bind","attr: { src: iconUrl }"),Z.setAttribute("draggable","false"),L.appendChild(Z);let G=document.createElement("div");G.className="cesium-baseLayerPicker-itemLabel",G.setAttribute("data-bind","text: name"),L.appendChild(G),Ce.applyBindings(n,i),Ce.applyBindings(n,r),this._viewModel=n,this._container=e,this._element=i,this._dropPanel=r,this._closeDropDown=function(X){i.contains(X.target)||r.contains(X.target)||(n.dropDownVisible=!1)},Yt.supportsPointerEvents()?document.addEventListener("pointerdown",this._closeDropDown,!0):(document.addEventListener("mousedown",this._closeDropDown,!0),document.addEventListener("touchstart",this._closeDropDown,!0))}Object.defineProperties(H3.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});H3.prototype.isDestroyed=function(){return!1};H3.prototype.destroy=function(){return Yt.supportsPointerEvents()?document.removeEventListener("pointerdown",this._closeDropDown,!0):(document.removeEventListener("mousedown",this._closeDropDown,!0),document.removeEventListener("touchstart",this._closeDropDown,!0)),Ce.cleanNode(this._element),Ce.cleanNode(this._dropPanel),this._container.removeChild(this._element),this._container.removeChild(this._dropPanel),me(this)};var GA=H3;var E_o=T(S(),1);function uSe(e){let t=e.creationFunction;l(t.canExecute)||(t=Vn(t)),this._creationCommand=t,this.name=e.name,this.tooltip=e.tooltip,this.iconUrl=e.iconUrl,this._category=y(e.category,""),Ce.track(this,["name","tooltip","iconUrl"])}Object.defineProperties(uSe.prototype,{creationCommand:{get:function(){return this._creationCommand}},category:{get:function(){return this._category}}});var qr=uSe;var P_o=T(S(),1);function hTt(){let e=[],t=devicePixelRatio>=2;return e.push(new qr({name:"Bing Maps Aerial",iconUrl:tn("Widgets/Images/ImageryProviders/bingAerial.png"),tooltip:"Bing Maps aerial imagery, provided by Cesium ion",category:"Cesium ion",creationFunction:function(){return q0({style:j0.AERIAL})}})),e.push(new qr({name:"Bing Maps Aerial with Labels",iconUrl:tn("Widgets/Images/ImageryProviders/bingAerialLabels.png"),tooltip:"Bing Maps aerial imagery with labels, provided by Cesium ion",category:"Cesium ion",creationFunction:function(){return q0({style:j0.AERIAL_WITH_LABELS})}})),e.push(new qr({name:"Bing Maps Roads",iconUrl:tn("Widgets/Images/ImageryProviders/bingRoads.png"),tooltip:"Bing Maps standard road maps, provided by Cesium ion",category:"Cesium ion",creationFunction:function(){return q0({style:j0.ROAD})}})),e.push(new qr({name:"ArcGIS World Imagery",iconUrl:tn("Widgets/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png"),tooltip:`ArcGIS World Imagery provides one meter or better satellite and aerial imagery in many parts of the world and lower resolution satellite imagery worldwide. The map includes 15m TerraColor imagery at small and mid-scales (~1:591M down to ~1:288k) for the world. The map features Maxar imagery at 0.3m resolution for select metropolitan areas around the world, 0.5m resolution across the United States and parts of Western Europe, and 1m resolution imagery across the rest of the world. In addition to commercial sources, the World Imagery map features high-resolution aerial photography contributed by the GIS User Community. This imagery ranges from 0.3m to 0.03m resolution (down to ~1:280 nin select communities). For more information on this map, including the terms of use, visit us online at https://www.arcgis.com/home/item.html?id=10df2279f9684e4a9f6a7f08febac2a9`,category:"Other",creationFunction:function(){return J0.fromBasemapType(Ch.SATELLITE,{enablePickFeatures:!1})}})),e.push(new qr({name:"ArcGIS World Hillshade",iconUrl:tn("Widgets/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png"),tooltip:`ArcGIS World Hillshade map portrays elevation as an artistic hillshade. This map is designed to be used as a backdrop for topographical, soil, hydro, landcover or other outdoor recreational maps. The map was compiled from a variety of sources from several data providers. The basemap has global coverage down to a scale of ~1:72k. In select areas of the United States and Europe, coverage is available down to ~1:9k. For more information on this map, including the terms of use, visit us online at https://www.arcgis.com/home/item.html?id=1b243539f4514b6ba35e7d995890db1d`,category:"Other",creationFunction:function(){return J0.fromBasemapType(Ch.HILLSHADE,{enablePickFeatures:!1})}})),e.push(new qr({name:"Esri World Ocean",iconUrl:tn("Widgets/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png"),tooltip:`ArcGIS World Ocean map is designed to be used as a base map by marine GIS professionals and as a reference map by anyone interested in ocean data. The base map features marine bathymetry. Land features include inland waters and roads overlaid on land cover and shaded relief imagery. The map was compiled from a variety of best available sources from several data providers, including General Bathymetric Chart of the Oceans GEBCO_08 Grid, National Oceanic and Atmospheric Administration (NOAA), and National Geographic, Garmin, HERE, Geonames.org, and Esri, and various other contributors. The base map currently provides coverage for the world down to a scale of ~1:577k, and coverage down to 1:72k in US coastal areas, and various other areas. Coverage down to ~ 1:9k is available limited areas based on regional hydrographic survey data. The base map was designed and developed by Esri. For more information on this map, including our terms of use, visit us online at https://www.arcgis.com/home/item.html?id=1e126e7520f9466c9ca28b8f28b5e500`,category:"Other",creationFunction:function(){return J0.fromBasemapType(Ch.OCEANS,{enablePickFeatures:!1})}})),e.push(new qr({name:"Open\xADStreet\xADMap",iconUrl:tn("Widgets/Images/ImageryProviders/openStreetMap.png"),tooltip:`OpenStreetMap (OSM) is a collaborative project to create a free editable map of the world. http://www.openstreetmap.org`,category:"Other",creationFunction:function(){return new mb({url:"https://tile.openstreetmap.org/"})}})),e.push(new qr({name:"Stadia x Stamen Watercolor",iconUrl:tn("Widgets/Images/ImageryProviders/stamenWatercolor.png"),tooltip:`Based on the original basemaps created for the Knight Foundation and reminiscent of hand drawn maps, the watercolor maps from Stamen Design apply raster effect area washes and organic edges over a paper texture to add warm pop to any map. https://docs.stadiamaps.com/map-styles/stamen-watercolor/`,category:"Other",creationFunction:function(){return new mb({url:"https://tiles.stadiamaps.com/tiles/stamen_watercolor/",fileExtension:"jpg",credit:`© <a href="https://stamen.com/" target="_blank">Stamen Design</a> © <a href="https://www.stadiamaps.com/" target="_blank">Stadia Maps</a> © <a href="https://openmaptiles.org/" target="_blank">OpenMapTiles</a> © <a href="https://www.openstreetmap.org/about/" target="_blank">OpenStreetMap contributors</a>`})}})),e.push(new qr({name:"Stadia x Stamen Toner",iconUrl:tn("Widgets/Images/ImageryProviders/stamenToner.png"),tooltip:`Based on the original basemaps created for the Knight Foundation and the most popular of the excellent styles from Stamen Design, these high-contrast B+W (black and white) maps are the perfect backdrop for your colorful and eye-catching overlays. https://docs.stadiamaps.com/map-styles/stamen-toner/`,category:"Other",creationFunction:function(){return new mb({url:"https://tiles.stadiamaps.com/tiles/stamen_toner/",retinaTiles:t,credit:`© <a href="https://stamen.com/" target="_blank">Stamen Design</a> © <a href="https://www.stadiamaps.com/" target="_blank">Stadia Maps</a> © <a href="https://openmaptiles.org/" target="_blank">OpenMapTiles</a> © <a href="https://www.openstreetmap.org/about/" target="_blank">OpenStreetMap contributors</a>`})}})),e.push(new qr({name:"Stadia Alidade Smooth",iconUrl:tn("Widgets/Images/ImageryProviders/stadiaAlidadeSmooth.png"),tooltip:`Stadia's custom Alidade Smooth style is designed for maps that use a lot of markers or overlays. It features a muted color scheme and fewer points of interest to allow your added data to shine. https://docs.stadiamaps.com/map-styles/alidade-smooth/`,category:"Other",creationFunction:function(){return new mb({url:"https://tiles.stadiamaps.com/tiles/alidade_smooth/",retinaTiles:t,credit:`© <a href="https://www.stadiamaps.com/" target="_blank">Stadia Maps</a> © <a href="https://openmaptiles.org/" target="_blank">OpenMapTiles</a> © <a href="https://www.openstreetmap.org/about/" target="_blank">OpenStreetMap contributors</a>`})}})),e.push(new qr({name:"Stadia Alidade Smooth Dark",iconUrl:tn("Widgets/Images/ImageryProviders/stadiaAlidadeSmoothDark.png"),tooltip:`Stadia Alidade Smooth Dark, like its lighter cousin, is also designed to stay out of the way. It just flips the dark mode switch on the color scheme. With the lights out, your data can now literally shine. https://docs.stadiamaps.com/map-styles/alidade-smooth-dark/`,category:"Other",creationFunction:function(){return new mb({url:"https://tiles.stadiamaps.com/tiles/alidade_smooth_dark/",retinaTiles:t,credit:`© <a href="https://www.stadiamaps.com/" target="_blank">Stadia Maps</a> © <a href="https://openmaptiles.org/" target="_blank">OpenMapTiles</a> © <a href="https://www.openstreetmap.org/about/" target="_blank">OpenStreetMap contributors</a>`})}})),e.push(new qr({name:"Sentinel-2",iconUrl:tn("Widgets/Images/ImageryProviders/sentinel-2.png"),tooltip:"Sentinel-2 cloudless by EOX IT Services GmbH (Contains modified Copernicus Sentinel data 2016 and 2017).",category:"Cesium ion",creationFunction:function(){return Q0.fromAssetId(3954)}})),e.push(new qr({name:"Blue Marble",iconUrl:tn("Widgets/Images/ImageryProviders/blueMarble.png"),tooltip:"Blue Marble Next Generation July, 2004 imagery from NASA.",category:"Cesium ion",creationFunction:function(){return Q0.fromAssetId(3845)}})),e.push(new qr({name:"Earth at night",iconUrl:tn("Widgets/Images/ImageryProviders/earthAtNight.png"),tooltip:"The Earth at night, also known as The Black Marble, is a 500 meter resolution global composite imagery layer released by NASA.",category:"Cesium ion",creationFunction:function(){return Q0.fromAssetId(3812)}})),e.push(new qr({name:"Natural Earth\xA0II",iconUrl:tn("Widgets/Images/ImageryProviders/naturalEarthII.png"),tooltip:`Natural Earth II, darkened for contrast. http://www.naturalearthdata.com/`,category:"Cesium ion",creationFunction:function(){return Ty.fromUrl(tn("Assets/Textures/NaturalEarthII"))}})),e}var EA=hTt;var A_o=T(S(),1);function fTt(){let e=[];return e.push(new qr({name:"WGS84 Ellipsoid",iconUrl:tn("Widgets/Images/TerrainProviders/Ellipsoid.png"),tooltip:"WGS84 standard ellipsoid, also known as EPSG:4326",category:"Cesium ion",creationFunction:function(){return new qh}})),e.push(new qr({name:"Cesium World Terrain",iconUrl:tn("Widgets/Images/TerrainProviders/CesiumWorldTerrain.png"),tooltip:"High-resolution global terrain tileset curated from several datasources and hosted by Cesium ion",category:"Cesium ion",creationFunction:function(){return Bx({requestWaterMask:!0,requestVertexNormals:!0})}})),e}var XA=fTt;var j_o=T(S(),1);var B_o=T(S(),1);function pTt(e){let t;if(l(e)){t="Command Statistics";let n=e.commandsInFrustums;for(let i in n)if(n.hasOwnProperty(i)){let o=parseInt(i,10),r;if(o===7)r="1, 2 and 3";else{let s=[];for(let a=2;a>=0;a--){let c=Math.pow(2,a);o>=c&&(s.push(a+1),o-=c)}r=s.reverse().join(" and ")}t+=`<br>    ${n[i]} in frustum ${r}`}t+=`<br>Total: ${e.totalCommands}`}return t}function s6(e,t,n){let i=Math.min(n,t);return i=Math.max(i,e),i}var bTt=new pn,gTt=new h;function IA(e,t){let n=this,i=e.canvas,o=new fd(i);this._eventHandler=o,this._scene=e,this._canvas=i,this._primitive=void 0,this._tile=void 0,this._modelMatrixPrimitive=void 0,this._performanceDisplay=void 0,this._performanceContainer=t;let r=this._scene.globe;r.depthTestAgainstTerrain=!0,this.frustums=!1,this.frustumPlanes=!1,this.performance=!1,this.shaderCacheText="",this.primitiveBoundingSphere=!1,this.primitiveReferenceFrame=!1,this.filterPrimitive=!1,this.tileBoundingSphere=!1,this.filterTile=!1,this.wireframe=!1,this.depthFrustum=1,this._numberOfFrustums=1,this.suspendUpdates=!1,this.tileCoordinates=!1,this.frustumStatisticText=!1,this.tileText="",this.hasPickedPrimitive=!1,this.hasPickedTile=!1,this.pickPrimitiveActive=!1,this.pickTileActive=!1,this.dropDownVisible=!0,this.generalVisible=!0,this.primitivesVisible=!1,this.terrainVisible=!1,this.depthFrustumText="",Ce.track(this,["frustums","frustumPlanes","performance","shaderCacheText","primitiveBoundingSphere","primitiveReferenceFrame","filterPrimitive","tileBoundingSphere","filterTile","wireframe","depthFrustum","suspendUpdates","tileCoordinates","frustumStatisticText","tileText","hasPickedPrimitive","hasPickedTile","pickPrimitiveActive","pickTileActive","dropDownVisible","generalVisible","primitivesVisible","terrainVisible","depthFrustumText"]),this._toggleDropDown=Vn(function(){n.dropDownVisible=!n.dropDownVisible}),this._toggleGeneral=Vn(function(){n.generalVisible=!n.generalVisible}),this._togglePrimitives=Vn(function(){n.primitivesVisible=!n.primitivesVisible}),this._toggleTerrain=Vn(function(){n.terrainVisible=!n.terrainVisible}),this._frustumsSubscription=Ce.getObservable(this,"frustums").subscribe(function(d){n._scene.debugShowFrustums=d,n._scene.requestRender()}),this._frustumPlanesSubscription=Ce.getObservable(this,"frustumPlanes").subscribe(function(d){n._scene.debugShowFrustumPlanes=d,n._scene.requestRender()}),this._performanceSubscription=Ce.getObservable(this,"performance").subscribe(function(d){d?n._performanceDisplay=new tb({container:n._performanceContainer}):n._performanceContainer.innerHTML=""}),this._showPrimitiveBoundingSphere=Vn(function(){return n._primitive.debugShowBoundingVolume=n.primitiveBoundingSphere,n._scene.requestRender(),!0}),this._primitiveBoundingSphereSubscription=Ce.getObservable(this,"primitiveBoundingSphere").subscribe(function(){n._showPrimitiveBoundingSphere()}),this._showPrimitiveReferenceFrame=Vn(function(){if(n.primitiveReferenceFrame){let d=n._primitive.modelMatrix;n._modelMatrixPrimitive=new Q9({modelMatrix:d}),n._scene.primitives.add(n._modelMatrixPrimitive)}else l(n._modelMatrixPrimitive)&&(n._scene.primitives.remove(n._modelMatrixPrimitive),n._modelMatrixPrimitive=void 0);return n._scene.requestRender(),!0}),this._primitiveReferenceFrameSubscription=Ce.getObservable(this,"primitiveReferenceFrame").subscribe(function(){n._showPrimitiveReferenceFrame()}),this._doFilterPrimitive=Vn(function(){return n.filterPrimitive?n._scene.debugCommandFilter=function(d){return l(n._modelMatrixPrimitive)&&d.owner===n._modelMatrixPrimitive._primitive?!0:l(n._primitive)?d.owner===n._primitive||d.owner===n._primitive._billboardCollection||d.owner.primitive===n._primitive:!1}:n._scene.debugCommandFilter=void 0,!0}),this._filterPrimitiveSubscription=Ce.getObservable(this,"filterPrimitive").subscribe(function(){n._doFilterPrimitive(),n._scene.requestRender()}),this._wireframeSubscription=Ce.getObservable(this,"wireframe").subscribe(function(d){r._surface.tileProvider._debug.wireframe=d,n._scene.requestRender()}),this._depthFrustumSubscription=Ce.getObservable(this,"depthFrustum").subscribe(function(d){n._scene.debugShowDepthFrustum=d,n._scene.requestRender()}),this._incrementDepthFrustum=Vn(function(){let d=n.depthFrustum+1;return n.depthFrustum=s6(1,n._numberOfFrustums,d),n._scene.requestRender(),!0}),this._decrementDepthFrustum=Vn(function(){let d=n.depthFrustum-1;return n.depthFrustum=s6(1,n._numberOfFrustums,d),n._scene.requestRender(),!0}),this._suspendUpdatesSubscription=Ce.getObservable(this,"suspendUpdates").subscribe(function(d){r._surface._debug.suspendLodUpdate=d,d||(n.filterTile=!1)});let s;this._showTileCoordinates=Vn(function(){return n.tileCoordinates&&!l(s)?s=e.imageryLayers.addImageryProvider(new pA({tilingScheme:e.terrainProvider.tilingScheme})):!n.tileCoordinates&&l(s)&&(e.imageryLayers.remove(s),s=void 0),!0}),this._tileCoordinatesSubscription=Ce.getObservable(this,"tileCoordinates").subscribe(function(){n._showTileCoordinates(),n._scene.requestRender()}),this._tileBoundingSphereSubscription=Ce.getObservable(this,"tileBoundingSphere").subscribe(function(){n._showTileBoundingSphere(),n._scene.requestRender()}),this._showTileBoundingSphere=Vn(function(){return n.tileBoundingSphere?r._surface.tileProvider._debug.boundingSphereTile=n._tile:r._surface.tileProvider._debug.boundingSphereTile=void 0,n._scene.requestRender(),!0}),this._doFilterTile=Vn(function(){return n.filterTile?(n.suspendUpdates=!0,r._surface._tilesToRender=[],l(n._tile)&&n._tile.renderable&&r._surface._tilesToRender.push(n._tile)):n.suspendUpdates=!1,!0}),this._filterTileSubscription=Ce.getObservable(this,"filterTile").subscribe(function(){n.doFilterTile(),n._scene.requestRender()});function a(d){let u=n._scene.pick({x:d.position.x,y:d.position.y});l(u)&&(n.primitive=l(u.collection)?u.collection:u.primitive),n._scene.requestRender(),n.pickPrimitiveActive=!1}this._pickPrimitive=Vn(function(){n.pickPrimitiveActive=!n.pickPrimitiveActive}),this._pickPrimitiveActiveSubscription=Ce.getObservable(this,"pickPrimitiveActive").subscribe(function(d){d?o.setInputAction(a,yn.LEFT_CLICK):o.removeInputAction(yn.LEFT_CLICK)});function c(d){let u,m=r.ellipsoid,p=n._scene.camera.getPickRay(d.position,bTt),g=r.pick(p,n._scene,gTt);if(l(g)){let f=m.cartesianToCartographic(g),x=r._surface.tileProvider._tilesToRenderByTextureCount;for(let _=0;!u&&_<x.length;++_){let C=x[_];if(l(C))for(let V=0;!u&&V<C.length;++V){let L=C[V];ce.contains(L.rectangle,f)&&(u=L)}}}n.tile=u,n.pickTileActive=!1}this._pickTile=Vn(function(){n.pickTileActive=!n.pickTileActive}),this._pickTileActiveSubscription=Ce.getObservable(this,"pickTileActive").subscribe(function(d){d?o.setInputAction(c,yn.LEFT_CLICK):o.removeInputAction(yn.LEFT_CLICK)}),this._removePostRenderEvent=e.postRender.addEventListener(function(){n._update()})}Object.defineProperties(IA.prototype,{scene:{get:function(){return this._scene}},performanceContainer:{get:function(){return this._performanceContainer}},toggleDropDown:{get:function(){return this._toggleDropDown}},showPrimitiveBoundingSphere:{get:function(){return this._showPrimitiveBoundingSphere}},showPrimitiveReferenceFrame:{get:function(){return this._showPrimitiveReferenceFrame}},doFilterPrimitive:{get:function(){return this._doFilterPrimitive}},incrementDepthFrustum:{get:function(){return this._incrementDepthFrustum}},decrementDepthFrustum:{get:function(){return this._decrementDepthFrustum}},showTileCoordinates:{get:function(){return this._showTileCoordinates}},showTileBoundingSphere:{get:function(){return this._showTileBoundingSphere}},doFilterTile:{get:function(){return this._doFilterTile}},toggleGeneral:{get:function(){return this._toggleGeneral}},togglePrimitives:{get:function(){return this._togglePrimitives}},toggleTerrain:{get:function(){return this._toggleTerrain}},pickPrimitive:{get:function(){return this._pickPrimitive}},pickTile:{get:function(){return this._pickTile}},selectParent:{get:function(){let e=this;return Vn(function(){e.tile=e.tile.parent})}},selectNW:{get:function(){let e=this;return Vn(function(){e.tile=e.tile.northwestChild})}},selectNE:{get:function(){let e=this;return Vn(function(){e.tile=e.tile.northeastChild})}},selectSW:{get:function(){let e=this;return Vn(function(){e.tile=e.tile.southwestChild})}},selectSE:{get:function(){let e=this;return Vn(function(){e.tile=e.tile.southeastChild})}},primitive:{get:function(){return this._primitive},set:function(e){let t=this._primitive;e!==t&&(this.hasPickedPrimitive=!0,l(t)&&(t.debugShowBoundingVolume=!1),this._scene.debugCommandFilter=void 0,l(this._modelMatrixPrimitive)&&(this._scene.primitives.remove(this._modelMatrixPrimitive),this._modelMatrixPrimitive=void 0),this._primitive=e,e.show=!1,setTimeout(function(){e.show=!0},50),this.showPrimitiveBoundingSphere(),this.showPrimitiveReferenceFrame(),this.doFilterPrimitive())}},tile:{get:function(){return this._tile},set:function(e){if(l(e)){this.hasPickedTile=!0;let t=this._tile;if(e!==t){this.tileText=`L: ${e.level} X: ${e.x} Y: ${e.y}`,this.tileText+=`<br>SW corner: ${e.rectangle.west}, ${e.rectangle.south}`,this.tileText+=`<br>NE corner: ${e.rectangle.east}, ${e.rectangle.north}`;let n=e.data;l(n)&&l(n.tileBoundingRegion)?this.tileText+=`<br>Min: ${n.tileBoundingRegion.minimumHeight} Max: ${n.tileBoundingRegion.maximumHeight}`:this.tileText+="<br>(Tile is not loaded)"}this._tile=e,this.showTileBoundingSphere(),this.doFilterTile()}else this.hasPickedTile=!1,this._tile=void 0}}});IA.prototype._update=function(){this.frustums&&(this.frustumStatisticText=pTt(this._scene.debugFrustumStatistics));let e=this._scene.numberOfFrustums;this._numberOfFrustums=e,this.depthFrustum=s6(1,e,this.depthFrustum),this.depthFrustumText=`${this.depthFrustum} of ${e}`,this.performance&&this._performanceDisplay.update(),this.primitiveReferenceFrame&&(this._modelMatrixPrimitive.modelMatrix=this._primitive.modelMatrix),this.shaderCacheText=`Cached shaders: ${this._scene.context.shaderCache.numberOfShaders}`};IA.prototype.isDestroyed=function(){return!1};IA.prototype.destroy=function(){return this._eventHandler.destroy(),this._removePostRenderEvent(),this._frustumsSubscription.dispose(),this._frustumPlanesSubscription.dispose(),this._performanceSubscription.dispose(),this._primitiveBoundingSphereSubscription.dispose(),this._primitiveReferenceFrameSubscription.dispose(),this._filterPrimitiveSubscription.dispose(),this._wireframeSubscription.dispose(),this._depthFrustumSubscription.dispose(),this._suspendUpdatesSubscription.dispose(),this._tileCoordinatesSubscription.dispose(),this._tileBoundingSphereSubscription.dispose(),this._filterTileSubscription.dispose(),this._pickPrimitiveActiveSubscription.dispose(),this._pickTileActiveSubscription.dispose(),me(this)};var WA=IA;function z3(e,t){e=In(e);let n=document.createElement("div"),i=new WA(t,n);this._viewModel=i,this._container=e;let o=document.createElement("div");this._element=o;let r=document.createElement("div");r.textContent="Cesium Inspector",r.className="cesium-cesiumInspector-button",r.setAttribute("data-bind","click: toggleDropDown"),o.appendChild(r),o.className="cesium-cesiumInspector",o.setAttribute("data-bind",'css: { "cesium-cesiumInspector-visible" : dropDownVisible, "cesium-cesiumInspector-hidden" : !dropDownVisible }'),e.appendChild(this._element);let s=document.createElement("div");s.className="cesium-cesiumInspector-dropDown",o.appendChild(s);let a=Ma.createSection,c=Ma.createCheckbox,d=a(s,"General","generalVisible","toggleGeneral"),u=c("Show Frustums","frustums"),m=document.createElement("div");m.className="cesium-cesiumInspector-frustumStatistics",m.setAttribute("data-bind","visible: frustums, html: frustumStatisticText"),u.appendChild(m),d.appendChild(u),d.appendChild(c("Show Frustum Planes","frustumPlanes")),d.appendChild(c("Performance Display","performance")),n.className="cesium-cesiumInspector-performanceDisplay",d.appendChild(n);let p=document.createElement("div");p.className="cesium-cesiumInspector-shaderCache",p.setAttribute("data-bind","html: shaderCacheText"),d.appendChild(p);let g=document.createElement("div");d.appendChild(g);let f=document.createElement("span");f.setAttribute("data-bind",'html: "     Frustum:"'),g.appendChild(f);let x=document.createElement("span");x.setAttribute("data-bind","text: depthFrustumText"),g.appendChild(x);let _=document.createElement("input");_.type="button",_.value="-",_.className="cesium-cesiumInspector-pickButton",_.setAttribute("data-bind","click: decrementDepthFrustum"),g.appendChild(_);let C=document.createElement("input");C.type="button",C.value="+",C.className="cesium-cesiumInspector-pickButton",C.setAttribute("data-bind","click: incrementDepthFrustum"),g.appendChild(C);let V=a(s,"Primitives","primitivesVisible","togglePrimitives"),L=document.createElement("div");L.className="cesium-cesiumInspector-pickSection",V.appendChild(L);let Z=document.createElement("input");Z.type="button",Z.value="Pick a primitive",Z.className="cesium-cesiumInspector-pickButton",Z.setAttribute("data-bind",'css: {"cesium-cesiumInspector-pickButtonHighlight" : pickPrimitiveActive}, click: pickPrimitive');let G=document.createElement("div");G.className="cesium-cesiumInspector-center",G.appendChild(Z),L.appendChild(G),L.appendChild(c("Show bounding sphere","primitiveBoundingSphere","hasPickedPrimitive")),L.appendChild(c("Show reference frame","primitiveReferenceFrame","hasPickedPrimitive")),this._primitiveOnly=c("Show only selected","filterPrimitive","hasPickedPrimitive"),L.appendChild(this._primitiveOnly);let X=a(s,"Terrain","terrainVisible","toggleTerrain"),v=document.createElement("div");v.className="cesium-cesiumInspector-pickSection",X.appendChild(v);let P=document.createElement("input");P.type="button",P.value="Pick a tile",P.className="cesium-cesiumInspector-pickButton",P.setAttribute("data-bind",'css: {"cesium-cesiumInspector-pickButtonHighlight" : pickTileActive}, click: pickTile'),G=document.createElement("div"),G.appendChild(P),G.className="cesium-cesiumInspector-center",v.appendChild(G);let F=document.createElement("div");v.appendChild(F);let A=document.createElement("input");A.type="button",A.value="Parent",A.className="cesium-cesiumInspector-pickButton",A.setAttribute("data-bind","click: selectParent");let b=document.createElement("input");b.type="button",b.value="NW",b.className="cesium-cesiumInspector-pickButton",b.setAttribute("data-bind","click: selectNW");let R=document.createElement("input");R.type="button",R.value="NE",R.className="cesium-cesiumInspector-pickButton",R.setAttribute("data-bind","click: selectNE");let E=document.createElement("input");E.type="button",E.value="SW",E.className="cesium-cesiumInspector-pickButton",E.setAttribute("data-bind","click: selectSW");let I=document.createElement("input");I.type="button",I.value="SE",I.className="cesium-cesiumInspector-pickButton",I.setAttribute("data-bind","click: selectSE");let w=document.createElement("div");w.className="cesium-cesiumInspector-tileText",F.className="cesium-cesiumInspector-frustumStatistics",F.appendChild(w),F.setAttribute("data-bind","visible: hasPickedTile"),w.setAttribute("data-bind","html: tileText");let N=document.createElement("div");N.className="cesium-cesiumInspector-relativeText",N.textContent="Select relative:",F.appendChild(N);let B=document.createElement("table"),U=document.createElement("tr"),O=document.createElement("tr"),k=document.createElement("td");k.appendChild(A);let J=document.createElement("td");J.appendChild(b);let H=document.createElement("td");H.appendChild(R),U.appendChild(k),U.appendChild(J),U.appendChild(H);let ee=document.createElement("td"),z=document.createElement("td");z.appendChild(E);let j=document.createElement("td");j.appendChild(I),O.appendChild(ee),O.appendChild(z),O.appendChild(j),B.appendChild(U),B.appendChild(O),F.appendChild(B),v.appendChild(c("Show bounding volume","tileBoundingSphere","hasPickedTile")),v.appendChild(c("Show only selected","filterTile","hasPickedTile")),X.appendChild(c("Wireframe","wireframe")),X.appendChild(c("Suspend LOD update","suspendUpdates")),X.appendChild(c("Show tile coordinates","tileCoordinates")),Ce.applyBindings(i,this._element)}Object.defineProperties(z3.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});z3.prototype.isDestroyed=function(){return!1};z3.prototype.destroy=function(){return Ce.cleanNode(this._element),this._container.removeChild(this._element),this.viewModel.destroy(),me(this)};var PA=z3;var lTo=T(S(),1);var nTo=T(S(),1);function yTt(e){return function(t){let n=e._scene.pick(t.position);l(n)&&n.primitive instanceof sa&&(e.tileset=n.primitive),e.pickActive=!1}}function hSe(e,t){t?e._eventHandler.setInputAction(function(n){let i=e._scene.pick(n.endPosition);l(i)&&i.primitive instanceof sa&&(e.tileset=i.primitive)},yn.MOUSE_MOVE):(e._eventHandler.removeInputAction(yn.MOUSE_MOVE),e.picking=e.picking)}var xTt={maximumFractionDigits:3};function vA(e){let t=e/1048576;return t<1?t.toLocaleString(void 0,xTt):Math.round(t).toLocaleString()}function wA(e,t){if(!l(e))return"";let n=t?e._statisticsPerPass[Io.PICK]:e._statisticsPerPass[Io.RENDER],i='<ul class="cesium-cesiumInspector-statistics">';return i+=`<li><strong>Visited: </strong>${n.visited.toLocaleString()}</li><li><strong>Selected: </strong>${n.selected.toLocaleString()}</li><li><strong>Commands: </strong>${n.numberOfCommands.toLocaleString()}</li>`,i+="</ul>",t||(i+='<ul class="cesium-cesiumInspector-statistics">',i+=`<li><strong>Requests: </strong>${n.numberOfPendingRequests.toLocaleString()}</li><li><strong>Attempted: </strong>${n.numberOfAttemptedRequests.toLocaleString()}</li><li><strong>Processing: </strong>${n.numberOfTilesProcessing.toLocaleString()}</li><li><strong>Content Ready: </strong>${n.numberOfTilesWithContentReady.toLocaleString()}</li><li><strong>Total: </strong>${n.numberOfTilesTotal.toLocaleString()}</li>`,i+="</ul>",i+='<ul class="cesium-cesiumInspector-statistics">',i+=`<li><strong>Features Selected: </strong>${n.numberOfFeaturesSelected.toLocaleString()}</li><li><strong>Features Loaded: </strong>${n.numberOfFeaturesLoaded.toLocaleString()}</li><li><strong>Points Selected: </strong>${n.numberOfPointsSelected.toLocaleString()}</li><li><strong>Points Loaded: </strong>${n.numberOfPointsLoaded.toLocaleString()}</li><li><strong>Triangles Selected: </strong>${n.numberOfTrianglesSelected.toLocaleString()}</li>`,i+="</ul>",i+='<ul class="cesium-cesiumInspector-statistics">',i+=`<li><strong>Tiles styled: </strong>${n.numberOfTilesStyled.toLocaleString()}</li><li><strong>Features styled: </strong>${n.numberOfFeaturesStyled.toLocaleString()}</li>`,i+="</ul>",i+='<ul class="cesium-cesiumInspector-statistics">',i+=`<li><strong>Children Union Culled: </strong>${n.numberOfTilesCulledWithChildrenUnion.toLocaleString()}</li>`,i+="</ul>",i+='<ul class="cesium-cesiumInspector-statistics">',i+=`<li><strong>Geometry Memory (MB): </strong>${vA(n.geometryByteLength)}</li><li><strong>Texture Memory (MB): </strong>${vA(n.texturesByteLength)}</li><li><strong>Batch Table Memory (MB): </strong>${vA(n.batchTableByteLength)}</li>`,i+="</ul>"),i}function fSe(){let e=Ni.statistics;return` <ul class="cesium-cesiumInspector-statistics"> <li><strong>Geometry Memory (MB): </strong>${vA(e.geometryByteLength)}</li> <li><strong>Texture Memory (MB): </strong>${vA(e.texturesByteLength)}</li> </ul> `}var _Tt=[{text:"Highlight",value:Il.HIGHLIGHT},{text:"Replace",value:Il.REPLACE},{text:"Mix",value:Il.MIX}],mSe=new Y(1,1,0,.4),TTt=new Y,K3=new Y;function ga(e,t){let n=this,i=e.canvas;this._eventHandler=new fd(i),this._scene=e,this._performanceContainer=t,this._canvas=i,this._performanceDisplay=new tb({container:t}),this._statisticsText="",this._pickStatisticsText="",this._resourceCacheStatisticsText="",this._editorError="",this.performance=!1,this.showStatistics=!0,this.showPickStatistics=!0,this.showResourceCacheStatistics=!1,this.inspectorVisible=!0,this.tilesetVisible=!1,this.displayVisible=!1,this.updateVisible=!1,this.loggingVisible=!1,this.styleVisible=!1,this.tileDebugLabelsVisible=!1,this.optimizationVisible=!1,this.styleString="{}",this.hasEnabledWireframe=!1,this._tileset=void 0,this._feature=void 0,this._tile=void 0,Ce.track(this,["performance","inspectorVisible","_statisticsText","_pickStatisticsText","_resourceCacheStatisticsText","_editorError","showPickStatistics","showStatistics","showResourceCacheStatistics","tilesetVisible","displayVisible","updateVisible","loggingVisible","styleVisible","optimizationVisible","tileDebugLabelsVisible","styleString","_feature","_tile","_tileset","hasEnabledWireframe"]),this._properties=Ce.observable({}),this.properties=[],Ce.defineProperty(this,"properties",function(){let k=[],J=n._properties();for(let H in J)J.hasOwnProperty(H)&&k.push(H);return k});let o=Ce.observable();Ce.defineProperty(this,"dynamicScreenSpaceError",{get:function(){return o()},set:function(k){o(k),l(n._tileset)&&(n._tileset.dynamicScreenSpaceError=k)}}),this.dynamicScreenSpaceError=!1;let r=Ce.observable();Ce.defineProperty(this,"colorBlendMode",{get:function(){return r()},set:function(k){r(k),l(n._tileset)&&(n._tileset.colorBlendMode=k,n._scene.requestRender())}}),this.colorBlendMode=Il.HIGHLIGHT;let s=Ce.observable(),a=Ce.observable();Ce.defineProperty(this,"picking",{get:function(){return a()},set:function(k){a(k),k?n._eventHandler.setInputAction(function(J){let H=e.pick(J.endPosition);if(H instanceof vs?(n.feature=H,n.tile=H.content.tile):l(H)&&l(H.content)?(n.feature=void 0,n.tile=H.content.tile):(n.feature=void 0,n.tile=void 0),!!l(n._tileset)){if(s&&l(H)&&l(H.content)){let ee;e.pickPositionSupported&&(ee=e.pickPosition(J.endPosition),l(ee)&&(n._tileset.debugPickPosition=ee)),n._tileset.debugPickedTile=H.content.tile}else n._tileset.debugPickedTile=void 0;n._scene.requestRender()}},yn.MOUSE_MOVE):(n.feature=void 0,n.tile=void 0,n._eventHandler.removeInputAction(yn.MOUSE_MOVE))}}),this.picking=!0;let c=Ce.observable();Ce.defineProperty(this,"colorize",{get:function(){return c()},set:function(k){c(k),l(n._tileset)&&(n._tileset.debugColorizeTiles=k,n._scene.requestRender())}}),this.colorize=!1;let d=Ce.observable();Ce.defineProperty(this,"wireframe",{get:function(){return d()},set:function(k){d(k),l(n._tileset)&&(n._tileset.debugWireframe=k,n._scene.requestRender())}}),this.wireframe=!1;let u=Ce.observable();Ce.defineProperty(this,"showBoundingVolumes",{get:function(){return u()},set:function(k){u(k),l(n._tileset)&&(n._tileset.debugShowBoundingVolume=k,n._scene.requestRender())}}),this.showBoundingVolumes=!1;let m=Ce.observable();Ce.defineProperty(this,"showContentBoundingVolumes",{get:function(){return m()},set:function(k){m(k),l(n._tileset)&&(n._tileset.debugShowContentBoundingVolume=k,n._scene.requestRender())}}),this.showContentBoundingVolumes=!1;let p=Ce.observable();Ce.defineProperty(this,"showRequestVolumes",{get:function(){return p()},set:function(k){p(k),l(n._tileset)&&(n._tileset.debugShowViewerRequestVolume=k,n._scene.requestRender())}}),this.showRequestVolumes=!1;let g=Ce.observable();Ce.defineProperty(this,"freezeFrame",{get:function(){return g()},set:function(k){g(k),l(n._tileset)&&(n._tileset.debugFreezeFrame=k,n._scene.debugShowFrustumPlanes=k,n._scene.requestRender())}}),this.freezeFrame=!1,Ce.defineProperty(this,"showOnlyPickedTileDebugLabel",{get:function(){return s()},set:function(k){s(k),l(n._tileset)&&(n._tileset.debugPickedTileLabelOnly=k,n._scene.requestRender())}}),this.showOnlyPickedTileDebugLabel=!1;let f=Ce.observable();Ce.defineProperty(this,"showGeometricError",{get:function(){return f()},set:function(k){f(k),l(n._tileset)&&(n._tileset.debugShowGeometricError=k,n._scene.requestRender())}}),this.showGeometricError=!1;let x=Ce.observable();Ce.defineProperty(this,"showRenderingStatistics",{get:function(){return x()},set:function(k){x(k),l(n._tileset)&&(n._tileset.debugShowRenderingStatistics=k,n._scene.requestRender())}}),this.showRenderingStatistics=!1;let _=Ce.observable();Ce.defineProperty(this,"showMemoryUsage",{get:function(){return _()},set:function(k){_(k),l(n._tileset)&&(n._tileset.debugShowMemoryUsage=k,n._scene.requestRender())}}),this.showMemoryUsage=!1;let C=Ce.observable();Ce.defineProperty(this,"showUrl",{get:function(){return C()},set:function(k){C(k),l(n._tileset)&&(n._tileset.debugShowUrl=k,n._scene.requestRender())}}),this.showUrl=!1;let V=Ce.observable();Ce.defineProperty(this,"maximumScreenSpaceError",{get:function(){return V()},set:function(k){k=Number(k),isNaN(k)||(V(k),l(n._tileset)&&(n._tileset.maximumScreenSpaceError=k))}}),this.maximumScreenSpaceError=16;let L=Ce.observable();Ce.defineProperty(this,"dynamicScreenSpaceErrorDensity",{get:function(){return L()},set:function(k){k=Number(k),isNaN(k)||(L(k),l(n._tileset)&&(n._tileset.dynamicScreenSpaceErrorDensity=k))}}),this.dynamicScreenSpaceErrorDensity=2e-4,this.dynamicScreenSpaceErrorDensitySliderValue=void 0,Ce.defineProperty(this,"dynamicScreenSpaceErrorDensitySliderValue",{get:function(){return Math.pow(L(),1/6)},set:function(k){let J=Math.pow(k,6);L(J),l(n._tileset)&&(n._tileset.dynamicScreenSpaceErrorDensity=J)}});let Z=Ce.observable();Ce.defineProperty(this,"dynamicScreenSpaceErrorFactor",{get:function(){return Z()},set:function(k){k=Number(k),isNaN(k)||(Z(k),l(n._tileset)&&(n._tileset.dynamicScreenSpaceErrorFactor=k))}}),this.dynamicScreenSpaceErrorFactor=24;let G=yTt(this),X=Ce.observable();Ce.defineProperty(this,"pickActive",{get:function(){return X()},set:function(k){X(k),k?n._eventHandler.setInputAction(G,yn.LEFT_CLICK):n._eventHandler.removeInputAction(yn.LEFT_CLICK)}});let v=Ce.observable();Ce.defineProperty(this,"pointCloudShading",{get:function(){return v()},set:function(k){v(k),l(n._tileset)&&(n._tileset.pointCloudShading.attenuation=k)}}),this.pointCloudShading=!1;let P=Ce.observable();Ce.defineProperty(this,"geometricErrorScale",{get:function(){return P()},set:function(k){k=Number(k),isNaN(k)||(P(k),l(n._tileset)&&(n._tileset.pointCloudShading.geometricErrorScale=k))}}),this.geometricErrorScale=1;let F=Ce.observable();Ce.defineProperty(this,"maximumAttenuation",{get:function(){return F()},set:function(k){k=Number(k),isNaN(k)||(F(k),l(n._tileset)&&(n._tileset.pointCloudShading.maximumAttenuation=k===0?void 0:k))}}),this.maximumAttenuation=0;let A=Ce.observable();Ce.defineProperty(this,"baseResolution",{get:function(){return A()},set:function(k){k=Number(k),isNaN(k)||(A(k),l(n._tileset)&&(n._tileset.pointCloudShading.baseResolution=k===0?void 0:k))}}),this.baseResolution=0;let b=Ce.observable();Ce.defineProperty(this,"eyeDomeLighting",{get:function(){return b()},set:function(k){b(k),l(n._tileset)&&(n._tileset.pointCloudShading.eyeDomeLighting=k)}}),this.eyeDomeLighting=!1;let R=Ce.observable();Ce.defineProperty(this,"eyeDomeLightingStrength",{get:function(){return R()},set:function(k){k=Number(k),isNaN(k)||(R(k),l(n._tileset)&&(n._tileset.pointCloudShading.eyeDomeLightingStrength=k))}}),this.eyeDomeLightingStrength=1;let E=Ce.observable();Ce.defineProperty(this,"eyeDomeLightingRadius",{get:function(){return E()},set:function(k){k=Number(k),isNaN(k)||(E(k),l(n._tileset)&&(n._tileset.pointCloudShading.eyeDomeLightingRadius=k))}}),this.eyeDomeLightingRadius=1,this.pickActive=!1;let I=Ce.observable();Ce.defineProperty(this,"skipLevelOfDetail",{get:function(){return I()},set:function(k){I(k),l(n._tileset)&&(n._tileset.skipLevelOfDetail=k)}}),this.skipLevelOfDetail=!0;let w=Ce.observable();Ce.defineProperty(this,"skipScreenSpaceErrorFactor",{get:function(){return w()},set:function(k){k=Number(k),isNaN(k)||(w(k),l(n._tileset)&&(n._tileset.skipScreenSpaceErrorFactor=k))}}),this.skipScreenSpaceErrorFactor=16;let N=Ce.observable();Ce.defineProperty(this,"baseScreenSpaceError",{get:function(){return N()},set:function(k){k=Number(k),isNaN(k)||(N(k),l(n._tileset)&&(n._tileset.baseScreenSpaceError=k))}}),this.baseScreenSpaceError=1024;let B=Ce.observable();Ce.defineProperty(this,"skipLevels",{get:function(){return B()},set:function(k){k=Number(k),isNaN(k)||(B(k),l(n._tileset)&&(n._tileset.skipLevels=k))}}),this.skipLevels=1;let U=Ce.observable();Ce.defineProperty(this,"immediatelyLoadDesiredLevelOfDetail",{get:function(){return U()},set:function(k){U(k),l(n._tileset)&&(n._tileset.immediatelyLoadDesiredLevelOfDetail=k)}}),this.immediatelyLoadDesiredLevelOfDetail=!1;let O=Ce.observable();Ce.defineProperty(this,"loadSiblings",{get:function(){return O()},set:function(k){O(k),l(n._tileset)&&(n._tileset.loadSiblings=k)}}),this.loadSiblings=!1,this._style=void 0,this._shouldStyle=!1,this._definedProperties=["properties","dynamicScreenSpaceError","colorBlendMode","picking","colorize","wireframe","showBoundingVolumes","showContentBoundingVolumes","showRequestVolumes","freezeFrame","maximumScreenSpaceError","dynamicScreenSpaceErrorDensity","baseScreenSpaceError","skipScreenSpaceErrorFactor","skipLevelOfDetail","skipLevels","immediatelyLoadDesiredLevelOfDetail","loadSiblings","dynamicScreenSpaceErrorDensitySliderValue","dynamicScreenSpaceErrorFactor","pickActive","showOnlyPickedTileDebugLabel","showGeometricError","showRenderingStatistics","showMemoryUsage","showUrl","pointCloudShading","geometricErrorScale","maximumAttenuation","baseResolution","eyeDomeLighting","eyeDomeLightingStrength","eyeDomeLightingRadius"],this._removePostRenderEvent=e.postRender.addEventListener(function(){n._update()}),l(this._tileset)||hSe(this,!0)}Object.defineProperties(ga.prototype,{scene:{get:function(){return this._scene}},performanceContainer:{get:function(){return this._performanceContainer}},statisticsText:{get:function(){return this._statisticsText}},pickStatisticsText:{get:function(){return this._pickStatisticsText}},resourceCacheStatisticsText:{get:function(){return this._resourceCacheStatisticsText}},colorBlendModes:{get:function(){return _Tt}},editorError:{get:function(){return this._editorError}},tileset:{get:function(){return this._tileset},set:function(e){if(this._tileset=e,this._style=void 0,this.styleString="{}",this.feature=void 0,this.tile=void 0,l(e)){this._properties(e.properties);let t=["colorize","wireframe","showBoundingVolumes","showContentBoundingVolumes","showRequestVolumes","freezeFrame","showOnlyPickedTileDebugLabel","showGeometricError","showRenderingStatistics","showMemoryUsage","showUrl"],n=t.length;for(let o=0;o<n;++o){let r=t[o];this[r]=this[r]}this.maximumScreenSpaceError=e.maximumScreenSpaceError,this.dynamicScreenSpaceError=e.dynamicScreenSpaceError,this.dynamicScreenSpaceErrorDensity=e.dynamicScreenSpaceErrorDensity,this.dynamicScreenSpaceErrorFactor=e.dynamicScreenSpaceErrorFactor,this.colorBlendMode=e.colorBlendMode,this.skipLevelOfDetail=e.skipLevelOfDetail,this.skipScreenSpaceErrorFactor=e.skipScreenSpaceErrorFactor,this.baseScreenSpaceError=e.baseScreenSpaceError,this.skipLevels=e.skipLevels,this.immediatelyLoadDesiredLevelOfDetail=e.immediatelyLoadDesiredLevelOfDetail,this.loadSiblings=e.loadSiblings,this.hasEnabledWireframe=e._enableDebugWireframe;let i=e.pointCloudShading;this.pointCloudShading=i.attenuation,this.geometricErrorScale=i.geometricErrorScale,this.maximumAttenuation=i.maximumAttenuation?i.maximumAttenuation:0,this.baseResolution=i.baseResolution?i.baseResolution:0,this.eyeDomeLighting=i.eyeDomeLighting,this.eyeDomeLightingStrength=i.eyeDomeLightingStrength,this.eyeDomeLightingRadius=i.eyeDomeLightingRadius,this._scene.requestRender()}else this._properties({});this._statisticsText=wA(e,!1),this._pickStatisticsText=wA(e,!0),this._resourceCacheStatisticsText=fSe(),hSe(this,!1)}},feature:{get:function(){return this._feature},set:function(e){if(this._feature===e)return;let t=this._feature;l(t)&&!t.content.isDestroyed()&&(!this.colorize&&l(this._style)?t.color=l(this._style.color)?this._style.color.evaluateColor(t,TTt):Y.WHITE:t.color=K3,this._scene.requestRender()),l(e)&&(Y.clone(e.color,K3),e.color=mSe,this._scene.requestRender()),this._feature=e}},tile:{get:function(){return this._tile},set:function(e){if(this._tile===e)return;let t=this._tile;l(t)&&!t.isDestroyed()&&!a6(t.content)&&(t.color=K3,this._scene.requestRender()),l(e)&&!a6(e.content)&&(Y.clone(e.color,K3),e.color=mSe,this._scene.requestRender()),this._tile=e}}});function a6(e){if(!l(e))return!1;if(e.featuresLength>0)return!0;let t=e.innerContents;if(l(t)){let n=t.length;for(let i=0;i<n;++i)if(!a6(t[i]))return!1;return!0}return!1}ga.prototype.togglePickTileset=function(){this.pickActive=!this.pickActive};ga.prototype.toggleInspector=function(){this.inspectorVisible=!this.inspectorVisible};ga.prototype.toggleTileset=function(){this.tilesetVisible=!this.tilesetVisible};ga.prototype.toggleDisplay=function(){this.displayVisible=!this.displayVisible};ga.prototype.toggleUpdate=function(){this.updateVisible=!this.updateVisible};ga.prototype.toggleLogging=function(){this.loggingVisible=!this.loggingVisible};ga.prototype.toggleStyle=function(){this.styleVisible=!this.styleVisible};ga.prototype.toggleTileDebugLabels=function(){this.tileDebugLabelsVisible=!this.tileDebugLabelsVisible};ga.prototype.toggleOptimization=function(){this.optimizationVisible=!this.optimizationVisible};ga.prototype.trimTilesCache=function(){l(this._tileset)&&this._tileset.trimLoadedTiles()};ga.prototype.compileStyle=function(){let e=this._tileset;if(!(!l(e)||this.styleString===JSON.stringify(e.style))){this._editorError="";try{this.styleString.length===0&&(this.styleString="{}"),this._style=new iS(JSON.parse(this.styleString)),this._shouldStyle=!0,this._scene.requestRender()}catch(t){this._editorError=t.toString()}this.feature=this._feature,this.tile=this._tile}};ga.prototype.styleEditorKeyPress=function(e,t){if(t.keyCode===9){t.preventDefault();let n=t.target,i=n.selectionStart,o=n.selectionEnd,r=o,a=n.value.slice(i,o).split(` `),c=a.length,d;if(t.shiftKey)for(d=0;d<c;++d)a[d][0]===" "&&(a[d][1]===" "?(a[d]=a[d].substr(2),r-=2):(a[d]=a[d].substr(1),r-=1));else for(d=0;d<c;++d)a[d]=` ${a[d]}`,r+=2;let u=a.join(` `);n.value=n.value.slice(0,i)+u+n.value.slice(o),n.selectionStart=i!==o?i:r,n.selectionEnd=r}else t.ctrlKey&&(t.keyCode===10||t.keyCode===13)&&this.compileStyle();return!0};ga.prototype._update=function(){let e=this._tileset;if(this.performance&&this._performanceDisplay.update(),l(e)){if(e.isDestroyed()){this.tile=void 0,this.feature=void 0,this.tileset=void 0;return}let t=e.style;this._style!==e.style&&(this._shouldStyle?(e.style=this._style,this._shouldStyle=!1):(this._style=t,this.styleString=JSON.stringify(t.style,null," ")))}this.showStatistics&&(this._statisticsText=wA(e,!1),this._pickStatisticsText=wA(e,!0),this._resourceCacheStatisticsText=fSe())};ga.prototype.isDestroyed=function(){return!1};ga.prototype.destroy=function(){this._eventHandler.destroy(),this._removePostRenderEvent();let e=this;return this._definedProperties.forEach(function(t){Ce.getObservable(e,t).dispose()}),me(this)};ga.getStatistics=wA;var FA=ga;function J3(e,t){e=In(e);let n=document.createElement("div"),i=document.createElement("div");i.setAttribute("data-bind","visible: performance");let o=new FA(t,i);this._viewModel=o,this._container=e,this._element=n;let r=document.createElement("div");r.textContent="3D Tiles Inspector",r.className="cesium-cesiumInspector-button",r.setAttribute("data-bind","click: toggleInspector"),n.appendChild(r),n.className="cesium-cesiumInspector cesium-3DTilesInspector",n.setAttribute("data-bind",'css: { "cesium-cesiumInspector-visible" : inspectorVisible, "cesium-cesiumInspector-hidden" : !inspectorVisible}'),e.appendChild(n);let s=document.createElement("div");s.className="cesium-cesiumInspector-dropDown",n.appendChild(s);let a=Ma.createSection,c=Ma.createCheckbox,d=Ma.createRangeInput,u=Ma.createButton,m=a(s,"Tileset","tilesetVisible","toggleTileset"),p=a(s,"Display","displayVisible","toggleDisplay"),g=a(s,"Update","updateVisible","toggleUpdate"),f=a(s,"Logging","loggingVisible","toggleLogging"),x=a(s,"Tile Debug Labels","tileDebugLabelsVisible","toggleTileDebugLabels"),_=a(s,"Style","styleVisible","toggleStyle"),C=a(s,"Optimization","optimizationVisible","toggleOptimization"),V=document.createElement("div");V.className="field-group";let L=document.createElement("label");L.className="field-label",L.appendChild(document.createTextNode("Properties: "));let Z=document.createElement("div");Z.setAttribute("data-bind","text: properties"),V.appendChild(L),V.appendChild(Z),m.appendChild(V),m.appendChild(u("Pick Tileset","togglePickTileset","pickActive")),m.appendChild(u("Trim Tiles Cache","trimTilesCache")),m.appendChild(c("Enable Picking","picking")),p.appendChild(c("Colorize","colorize"));let G=p.appendChild(c("Wireframe","wireframe","_tileset === undefined || hasEnabledWireframe")),X=document.createElement("p");X.setAttribute("data-bind","visible: _tileset !== undefined && !hasEnabledWireframe"),X.setAttribute("class","cesium-3DTilesInspector-disabledElementsInfo"),X.innerText="Set enableDebugWireframe to true in the tileset constructor to enable this option.",G.appendChild(X),p.appendChild(c("Bounding Volumes","showBoundingVolumes")),p.appendChild(c("Content Volumes","showContentBoundingVolumes")),p.appendChild(c("Request Volumes","showRequestVolumes")),p.appendChild(c("Point Cloud Shading","pointCloudShading"));let v=document.createElement("div");v.setAttribute("data-bind","visible: pointCloudShading"),v.appendChild(d("Geometric Error Scale","geometricErrorScale",0,2,.01)),v.appendChild(d("Maximum Attenuation","maximumAttenuation",0,32,1)),v.appendChild(d("Base Resolution","baseResolution",0,1,.01)),v.appendChild(c("Eye Dome Lighting (EDL)","eyeDomeLighting")),p.appendChild(v);let P=document.createElement("div");P.setAttribute("data-bind","visible: eyeDomeLighting"),P.appendChild(d("EDL Strength","eyeDomeLightingStrength",0,2,.1)),P.appendChild(d("EDL Radius","eyeDomeLightingRadius",0,4,.1)),v.appendChild(P),g.appendChild(c("Freeze Frame","freezeFrame")),g.appendChild(c("Dynamic Screen Space Error","dynamicScreenSpaceError"));let F=document.createElement("div");F.appendChild(d("Maximum Screen Space Error","maximumScreenSpaceError",0,128,1)),g.appendChild(F);let A=document.createElement("div");A.setAttribute("data-bind","visible: dynamicScreenSpaceError"),A.appendChild(d("Screen Space Error Density","dynamicScreenSpaceErrorDensitySliderValue",0,1,.005,"dynamicScreenSpaceErrorDensity")),A.appendChild(d("Screen Space Error Factor","dynamicScreenSpaceErrorFactor",1,32,.1)),g.appendChild(A),f.appendChild(c("Performance","performance")),f.appendChild(i),f.appendChild(c("Statistics","showStatistics"));let b=document.createElement("div");b.className="cesium-3dTilesInspector-statistics",b.setAttribute("data-bind","html: statisticsText, visible: showStatistics"),f.appendChild(b),f.appendChild(c("Pick Statistics","showPickStatistics"));let R=document.createElement("div");R.className="cesium-3dTilesInspector-statistics",R.setAttribute("data-bind","html: pickStatisticsText, visible: showPickStatistics"),f.appendChild(R),f.appendChild(c("Resource Cache Statistics","showResourceCacheStatistics"));let E=document.createElement("div");E.className="cesium-3dTilesInspector-statistics",E.setAttribute("data-bind","html: resourceCacheStatisticsText, visible: showResourceCacheStatistics"),f.appendChild(E);let I=document.createElement("div");_.appendChild(I),I.appendChild(document.createTextNode("Color Blend Mode: "));let w=document.createElement("select");w.setAttribute("data-bind",'options: colorBlendModes, optionsText: "text", optionsValue: "value", value: colorBlendMode'),I.appendChild(w);let N=document.createElement("textarea");N.setAttribute("data-bind","textInput: styleString, event: { keydown: styleEditorKeyPress }"),I.className="cesium-cesiumInspector-styleEditor",I.appendChild(N);let B=u("Compile (Ctrl+Enter)","compileStyle");I.appendChild(B);let U=document.createElement("div");U.className="cesium-cesiumInspector-error",U.setAttribute("data-bind","text: editorError"),I.appendChild(U),x.appendChild(c("Show Picked Only","showOnlyPickedTileDebugLabel")),x.appendChild(c("Geometric Error","showGeometricError")),x.appendChild(c("Rendering Statistics","showRenderingStatistics")),x.appendChild(c("Memory Usage (MB)","showMemoryUsage")),x.appendChild(c("Url","showUrl")),C.appendChild(c("Skip Tile LODs","skipLevelOfDetail"));let O=document.createElement("div");O.appendChild(d("Skip SSE Factor","skipScreenSpaceErrorFactor",1,50,1)),C.appendChild(O);let k=document.createElement("div");k.appendChild(d("SSE before skipping LOD","baseScreenSpaceError",0,4096,1)),C.appendChild(k);let J=document.createElement("div");J.appendChild(d("Min. levels to skip","skipLevels",0,10,1)),C.appendChild(J),C.appendChild(c("Load only tiles that meet the max SSE.","immediatelyLoadDesiredLevelOfDetail")),C.appendChild(c("Load siblings of visible tiles","loadSiblings")),Ce.applyBindings(o,n)}Object.defineProperties(J3.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});J3.prototype.isDestroyed=function(){return!1};J3.prototype.destroy=function(){return Ce.cleanNode(this._element),this._container.removeChild(this._element),this.viewModel.destroy(),me(this)};var AA=J3;var STo=T(S(),1);var pTo=T(S(),1);function Q3(e,t){l(t)||(t=document.body),t=In(t);let n=this,i=Ce.observable(ur.fullscreen),o=Ce.observable(ur.enabled),r=t.ownerDocument;this.isFullscreen=void 0,Ce.defineProperty(this,"isFullscreen",{get:function(){return i()}}),this.isFullscreenEnabled=void 0,Ce.defineProperty(this,"isFullscreenEnabled",{get:function(){return o()},set:function(s){o(s&&ur.enabled)}}),this.tooltip=void 0,Ce.defineProperty(this,"tooltip",function(){return this.isFullscreenEnabled?i()?"Exit full screen":"Full screen":"Full screen unavailable"}),this._command=Vn(function(){ur.fullscreen?ur.exitFullscreen():ur.requestFullscreen(n._fullscreenElement)},Ce.getObservable(this,"isFullscreenEnabled")),this._fullscreenElement=y(In(e),r.body),this._callback=function(){i(ur.fullscreen)},r.addEventListener(ur.changeEventName,this._callback)}Object.defineProperties(Q3.prototype,{fullscreenElement:{get:function(){return this._fullscreenElement},set:function(e){this._fullscreenElement=e}},command:{get:function(){return this._command}}});Q3.prototype.isDestroyed=function(){return!1};Q3.prototype.destroy=function(){document.removeEventListener(ur.changeEventName,this._callback),me(this)};var MA=Q3;var STt="M 83.96875 17.5625 L 83.96875 17.59375 L 76.65625 24.875 L 97.09375 24.96875 L 76.09375 45.96875 L 81.9375 51.8125 L 102.78125 30.9375 L 102.875 51.15625 L 110.15625 43.875 L 110.1875 17.59375 L 83.96875 17.5625 z M 44.125 17.59375 L 17.90625 17.625 L 17.9375 43.90625 L 25.21875 51.1875 L 25.3125 30.96875 L 46.15625 51.8125 L 52 45.96875 L 31 25 L 51.4375 24.90625 L 44.125 17.59375 z M 46.0625 76.03125 L 25.1875 96.875 L 25.09375 76.65625 L 17.8125 83.9375 L 17.8125 110.21875 L 44 110.25 L 51.3125 102.9375 L 30.90625 102.84375 L 51.875 81.875 L 46.0625 76.03125 z M 82 76.15625 L 76.15625 82 L 97.15625 103 L 76.71875 103.0625 L 84.03125 110.375 L 110.25 110.34375 L 110.21875 84.0625 L 102.9375 76.8125 L 102.84375 97 L 82 76.15625 z",CTt="M 104.34375 17.5625 L 83.5 38.4375 L 83.40625 18.21875 L 76.125 25.5 L 76.09375 51.78125 L 102.3125 51.8125 L 102.3125 51.78125 L 109.625 44.5 L 89.1875 44.40625 L 110.1875 23.40625 L 104.34375 17.5625 z M 23.75 17.59375 L 17.90625 23.4375 L 38.90625 44.4375 L 18.5 44.53125 L 25.78125 51.8125 L 52 51.78125 L 51.96875 25.53125 L 44.6875 18.25 L 44.625 38.46875 L 23.75 17.59375 z M 25.6875 76.03125 L 18.375 83.3125 L 38.78125 83.40625 L 17.8125 104.40625 L 23.625 110.25 L 44.5 89.375 L 44.59375 109.59375 L 51.875 102.3125 L 51.875 76.0625 L 25.6875 76.03125 z M 102.375 76.15625 L 76.15625 76.1875 L 76.1875 102.4375 L 83.46875 109.71875 L 83.5625 89.53125 L 104.40625 110.375 L 110.25 104.53125 L 89.25 83.53125 L 109.6875 83.46875 L 102.375 76.15625 z";function j3(e,t){e=In(e);let n=new MA(t,e);n._exitFullScreenPath=CTt,n._enterFullScreenPath=STt;let i=document.createElement("button");i.type="button",i.className="cesium-button cesium-fullscreenButton",i.setAttribute("data-bind","attr: { title: tooltip },click: command,enable: isFullscreenEnabled,cesiumSvgPath: { path: isFullscreen ? _exitFullScreenPath : _enterFullScreenPath, width: 128, height: 128 }"),e.appendChild(i),Ce.applyBindings(n,i),this._container=e,this._viewModel=n,this._element=i}Object.defineProperties(j3.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});j3.prototype.isDestroyed=function(){return!1};j3.prototype.destroy=function(){return this._viewModel.destroy(),Ce.cleanNode(this._element),this._container.removeChild(this._element),me(this)};var NA=j3;var wTo=T(S(),1);var GTo=T(S(),1);var pSe=1e3;function cm(e){l(e.geocoderServices)?this._geocoderServices=e.geocoderServices:this._geocoderServices=[new NR({scene:e.scene})],this._viewContainer=e.container,this._scene=e.scene,this._flightDuration=e.flightDuration,this._searchText="",this._isSearchInProgress=!1,this._wasGeocodeCancelled=!1,this._previousCredits=[],this._complete=new ge,this._suggestions=[],this._selectedSuggestion=void 0,this._showSuggestions=!0,this._handleArrowDown=gSe,this._handleArrowUp=bSe;let t=this;this._suggestionsVisible=Ce.pureComputed(function(){let o=Ce.getObservable(t,"_suggestions")().length>0,r=Ce.getObservable(t,"_showSuggestions")();return o&&r}),this._searchCommand=Vn(function(i){if(i=y(i,Hb.SEARCH),t._focusTextbox=!1,l(t._selectedSuggestion))return t.activateSuggestion(t._selectedSuggestion),!1;if(t.hideSuggestions(),t.isSearchInProgress)ETt(t);else return ZTt(t,t._geocoderServices,i)}),this.deselectSuggestion=function(){t._selectedSuggestion=void 0},this.handleKeyDown=function(i,o){let r=o.key==="ArrowDown"||o.key==="Down"||o.keyCode===40,s=o.key==="ArrowUp"||o.key==="Up"||o.keyCode===38;return(r||s)&&o.preventDefault(),!0},this.handleKeyUp=function(i,o){let r=o.key==="ArrowDown"||o.key==="Down"||o.keyCode===40,s=o.key==="ArrowUp"||o.key==="Up"||o.keyCode===38,a=o.key==="Enter"||o.keyCode===13;return s?bSe(t):r?gSe(t):a&&t._searchCommand(),!0},this.activateSuggestion=function(i){t.hideSuggestions(),t._searchText=i.displayName;let o=i.destination;_Se(t),t.destinationFound(t,o)},this.hideSuggestions=function(){t._showSuggestions=!1,t._selectedSuggestion=void 0},this.showSuggestions=function(){t._showSuggestions=!0},this.handleMouseover=function(i,o){i!==t._selectedSuggestion&&(t._selectedSuggestion=i)},this.keepExpanded=!1,this.autoComplete=y(e.autocomplete,!0),this.destinationFound=y(e.destinationFound,cm.flyToDestination),this._focusTextbox=!1,Ce.track(this,["_searchText","_isSearchInProgress","keepExpanded","_suggestions","_selectedSuggestion","_showSuggestions","_focusTextbox"]);let n=Ce.getObservable(this,"_searchText");n.extend({rateLimit:{timeout:500}}),this._suggestionSubscription=n.subscribe(function(){cm._updateSearchSuggestions(t)}),this.isSearchInProgress=void 0,Ce.defineProperty(this,"isSearchInProgress",{get:function(){return this._isSearchInProgress}}),this.searchText=void 0,Ce.defineProperty(this,"searchText",{get:function(){return this.isSearchInProgress?"Searching...":this._searchText},set:function(i){this._searchText=i}}),this.flightDuration=void 0,Ce.defineProperty(this,"flightDuration",{get:function(){return this._flightDuration},set:function(i){this._flightDuration=i}})}Object.defineProperties(cm.prototype,{complete:{get:function(){return this._complete}},scene:{get:function(){return this._scene}},search:{get:function(){return this._searchCommand}},selectedSuggestion:{get:function(){return this._selectedSuggestion}},suggestions:{get:function(){return this._suggestions}}});cm.prototype.destroy=function(){this._suggestionSubscription.dispose()};function bSe(e){if(e._suggestions.length===0)return;let t=e._suggestions.indexOf(e._selectedSuggestion);if(t===-1||t===0){e._selectedSuggestion=void 0;return}let n=t-1;e._selectedSuggestion=e._suggestions[n],cm._adjustSuggestionsScroll(e,n)}function gSe(e){if(e._suggestions.length===0)return;let t=e._suggestions.length,i=(e._suggestions.indexOf(e._selectedSuggestion)+1)%t;e._selectedSuggestion=e._suggestions[i],cm._adjustSuggestionsScroll(e,i)}function VTt(e,t){let n=l(t)?t.availability:void 0;return l(n)?Ox(t,[e]).then(function(i){return e=i[0],e.height+=pSe,e}):(e.height+=pSe,Promise.resolve(e))}function LTt(e,t){let n=e._scene,o=n.mapProjection.ellipsoid,r=n.camera,s=n.terrainProvider,a=t,c;return t instanceof ce?W.equalsEpsilon(t.south,t.north,W.EPSILON7)&&W.equalsEpsilon(t.east,t.west,W.EPSILON7)?t=ce.center(t):c=hS(t,n):t=o.cartesianToCartographic(t),l(c)||(c=VTt(t,s)),c.then(function(d){a=o.cartographicToCartesian(d)}).finally(function(){r.flyTo({destination:a,complete:function(){e._complete.raiseEvent()},duration:e._flightDuration,endTransform:M.IDENTITY})})}async function RTt(e,t,n){try{return{state:"fulfilled",value:await e.geocode(t,n),credits:e.credit}}catch(i){return{state:"rejected",reason:i}}}async function ZTt(e,t,n){let i=e._searchText;if(xSe(i)){e.showSuggestions();return}e._isSearchInProgress=!0,e._wasGeocodeCancelled=!1;let o,r;for(o=0;o<t.length;o++){if(e._wasGeocodeCancelled)return;if(r=await RTt(t[o],i,n),l(r)&&r.state==="fulfilled"&&r.value.length>0)break}if(e._wasGeocodeCancelled)return;e._isSearchInProgress=!1,l6(e);let s=r.value;if(r.state==="fulfilled"&&l(s)&&s.length>0){e._searchText=s[0].displayName,e.destinationFound(e,s[0].destination);let a=ySe(e,bC.getCreditsFromResult(s[0]));l(a)||c6(e,t[o].credit);return}e._searchText=`${i} (not found)`}function c6(e,t){l(t)&&!e._scene.isDestroyed()&&!e._scene.frameState.creditDisplay.isDestroyed()&&(e._scene.frameState.creditDisplay.addStaticCredit(t),e._previousCredits.push(t))}function ySe(e,t){return l(t)&&t.forEach(n=>c6(e,n)),t}function l6(e){!e._scene.isDestroyed()&&!e._scene.frameState.creditDisplay.isDestroyed()&&e._previousCredits.forEach(t=>{e._scene.frameState.creditDisplay.removeStaticCredit(t)}),e._previousCredits.length=0}function GTt(e,t){let n=In(e._viewContainer),i=n.getElementsByClassName("search-results")[0],r=n.getElementsByTagName("li")[t];if(t===0){i.scrollTop=0;return}let s=r.offsetTop;s+r.clientHeight>i.clientHeight?i.scrollTop=s+r.clientHeight:s<i.scrollTop&&(i.scrollTop=s)}function ETt(e){e._isSearchInProgress&&(e._isSearchInProgress=!1,e._wasGeocodeCancelled=!0)}function xSe(e){return/^\s*$/.test(e)}function _Se(e){Ce.getObservable(e,"_suggestions").removeAll()}async function XTt(e){if(!e.autoComplete)return;let t=e._searchText;if(_Se(e),l6(e),!xSe(t))for(let n of e._geocoderServices){let i=await n.geocode(t,Hb.AUTOCOMPLETE);if(e._suggestions=e._suggestions.concat(i),i.length>0){let o=!0;i.forEach(r=>{let s=bC.getCreditsFromResult(r);o=o&&!l(s),ySe(e,s)}),o&&c6(e,n.credit)}if(e._suggestions.length>=5)return}}cm.flyToDestination=LTt;cm._updateSearchSuggestions=XTt;cm._adjustSuggestionsScroll=GTt;cm.prototype.isDestroyed=function(){return!1};cm.prototype.destroy=function(){return l6(this),me(this)};var kA=cm;var ITt="M29.772,26.433l-7.126-7.126c0.96-1.583,1.523-3.435,1.524-5.421C24.169,8.093,19.478,3.401,13.688,3.399C7.897,3.401,3.204,8.093,3.204,13.885c0,5.789,4.693,10.481,10.484,10.481c1.987,0,3.839-0.563,5.422-1.523l7.128,7.127L29.772,26.433zM7.203,13.885c0.006-3.582,2.903-6.478,6.484-6.486c3.579,0.008,6.478,2.904,6.484,6.486c-0.007,3.58-2.905,6.476-6.484,6.484C10.106,20.361,7.209,17.465,7.203,13.885z",WTt="M24.778,21.419 19.276,15.917 24.777,10.415 21.949,7.585 16.447,13.087 10.945,7.585 8.117,10.415 13.618,15.917 8.116,21.419 10.946,24.248 16.447,18.746 21.948,24.248z";function q3(e){let t=In(e.container),n=new kA(e);n._startSearchPath=ITt,n._stopSearchPath=WTt;let i=document.createElement("form");i.setAttribute("data-bind","submit: search");let o=document.createElement("input");o.type="search",o.className="cesium-geocoder-input",o.setAttribute("placeholder","Enter an address or landmark..."),o.setAttribute("data-bind",'textInput: searchText,disable: isSearchInProgress,event: { keyup: handleKeyUp, keydown: handleKeyDown, mouseover: deselectSuggestion },css: { "cesium-geocoder-input-wide" : keepExpanded || searchText.length > 0 },hasFocus: _focusTextbox'),this._onTextBoxFocus=function(){setTimeout(function(){o.select()},0)},o.addEventListener("focus",this._onTextBoxFocus,!1),i.appendChild(o),this._textBox=o;let r=document.createElement("span");r.className="cesium-geocoder-searchButton",r.setAttribute("data-bind","click: search,cesiumSvgPath: { path: isSearchInProgress ? _stopSearchPath : _startSearchPath, width: 32, height: 32 }"),i.appendChild(r),t.appendChild(i);let s=document.createElement("div");s.className="search-results",s.setAttribute("data-bind","visible: _suggestionsVisible");let a=document.createElement("ul");a.setAttribute("data-bind","foreach: _suggestions");let c=document.createElement("li");a.appendChild(c),c.setAttribute("data-bind","text: $data.displayName, click: $parent.activateSuggestion, event: { mouseover: $parent.handleMouseover}, css: { active: $data === $parent._selectedSuggestion }"),s.appendChild(a),t.appendChild(s),Ce.applyBindings(n,i),Ce.applyBindings(n,s),this._container=t,this._searchSuggestionsContainer=s,this._viewModel=n,this._form=i,this._onInputBegin=function(d){let u=d.target;typeof d.composedPath=="function"&&(u=d.composedPath()[0]),t.contains(u)||(n._focusTextbox=!1,n.hideSuggestions())},this._onInputEnd=function(d){n._focusTextbox=!0,n.showSuggestions()},Yt.supportsPointerEvents()?(document.addEventListener("pointerdown",this._onInputBegin,!0),t.addEventListener("pointerup",this._onInputEnd,!0),t.addEventListener("pointercancel",this._onInputEnd,!0)):(document.addEventListener("mousedown",this._onInputBegin,!0),t.addEventListener("mouseup",this._onInputEnd,!0),document.addEventListener("touchstart",this._onInputBegin,!0),t.addEventListener("touchend",this._onInputEnd,!0),t.addEventListener("touchcancel",this._onInputEnd,!0))}Object.defineProperties(q3.prototype,{container:{get:function(){return this._container}},searchSuggestionsContainer:{get:function(){return this._searchSuggestionsContainer}},viewModel:{get:function(){return this._viewModel}}});q3.prototype.isDestroyed=function(){return!1};q3.prototype.destroy=function(){let e=this._container;return Yt.supportsPointerEvents()?(document.removeEventListener("pointerdown",this._onInputBegin,!0),e.removeEventListener("pointerup",this._onInputEnd,!0)):(document.removeEventListener("mousedown",this._onInputBegin,!0),e.removeEventListener("mouseup",this._onInputEnd,!0),document.removeEventListener("touchstart",this._onInputBegin,!0),e.removeEventListener("touchend",this._onInputEnd,!0)),this._viewModel.destroy(),Ce.cleanNode(this._form),Ce.cleanNode(this._searchSuggestionsContainer),e.removeChild(this._form),e.removeChild(this._searchSuggestionsContainer),this._textBox.removeEventListener("focus",this._onTextBoxFocus,!1),me(this)};var UA=q3;var HTo=T(S(),1);var NTo=T(S(),1);function TSe(e,t){this._scene=e,this._duration=t;let n=this;this._command=Vn(function(){n._scene.camera.flyHome(n._duration)}),this.tooltip="View Home",Ce.track(this,["tooltip"])}Object.defineProperties(TSe.prototype,{scene:{get:function(){return this._scene}},command:{get:function(){return this._command}},duration:{get:function(){return this._duration},set:function(e){this._duration=e}}});var DA=TSe;function $3(e,t,n){e=In(e);let i=new DA(t,n);i._svgPath="M14,4l-10,8.75h20l-4.25-3.7188v-4.6562h-2.812v2.1875l-2.938-2.5625zm-7.0938,9.906v10.094h14.094v-10.094h-14.094zm2.1876,2.313h3.3122v4.25h-3.3122v-4.25zm5.8442,1.281h3.406v6.438h-3.406v-6.438z";let o=document.createElement("button");o.type="button",o.className="cesium-button cesium-toolbar-button cesium-home-button",o.setAttribute("data-bind","attr: { title: tooltip },click: command,cesiumSvgPath: { path: _svgPath, width: 28, height: 28 }"),e.appendChild(o),Ce.applyBindings(i,o),this._container=e,this._viewModel=i,this._element=o}Object.defineProperties($3.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});$3.prototype.isDestroyed=function(){return!1};$3.prototype.destroy=function(){return Ce.cleanNode(this._element),this._container.removeChild(this._element),me(this)};var BA=$3;var nSo=T(S(),1);var QTo=T(S(),1);function PTt(e,t){t.currentTarget.parentElement.parentElement.querySelector(`#${e.name}-expander`).classList.toggle("active"),t.currentTarget.textContent=t.currentTarget.textContent==="+"?"-":"+"}function CSe(e,t){Ce.track(e);for(let n=0;n<e.sublayers.length;n++)CSe(e.sublayers[n],t)}function eB(e){return e.modelName==="FullModel"}function VSe(e){return e.modelName==="Overview"}function LSe(e){return VSe(e)||eB(e)}function SSe(e,t){if(LSe(e)){e.visibility=!1;for(let i=0;i<e.sublayers.length;i++)e.sublayers[i].visibility=!0;let n={name:e.name,modelName:e.modelName,disable:Ce.observable(!1),index:t.sublayers.length};return t.topLayers.push(n),t.sublayers.push(e),n}}function vTt(e,t){if(LSe(e)){t.sublayers.forEach(i=>i.visibility=!1),t.sublayers[e.index].visibility=!0;let n=document.getElementById("bsl-wrapper");eB(e)?(t.currentLevel=t.selectedLevel,n.style.display="block"):(t.selectedLevel=t.currentLevel,t.currentLevel="All",n.style.display="none")}}async function wTt(e,t){try{let n=e.getAttributeNames();for(let i=0;i<n.length;i++)if(n[i]==="BldgLevel"){let o=e.getAttributeValues(n[i]);for(let r=0;r<o.length;r++)t.push(o[r])}t.sort((i,o)=>i-o),t.unshift("All")}catch(n){console.log(`There was an error getting attributes: ${n}`)}}function FTt(e){let t=this;this.levels=[],this.viewModel={sublayers:[],levels:this.levels,currentLevel:Ce.observable(),selectedLevel:"All",topLayers:[{name:"Select a layer to explore...",disable:Ce.observable(!0),index:-1}],currentLayer:Ce.observable(),expandClickHandler:PTt,setOptionDisable:function(i,o){Ce.applyBindingsToNode(i,{disable:o.disable},o)},defaultLayer:void 0},this.viewModel.currentLayer.subscribe(function(i){vTt(i,t.viewModel)});let n=e.sublayers;for(let i=0;i<n.length;i++){CSe(n[i],this.viewModel);let o=SSe(n[i],this.viewModel);l(o)&&(VSe(o)||!l(this.viewModel.defaultLayer)&&eB(o))&&(this.viewModel.defaultLayer=o)}if(this.viewModel.topLayers.length===1&&n.length>0){e.show=!1;let i={name:"Full Model",modelName:"FullModel",visibility:e.show,sublayers:e.sublayers};this.viewModel.defaultLayer=SSe(i,this.viewModel),this.viewModel.currentLayer.subscribe(function(o){e.show=eB(o)})}else this.viewModel.topLayers.length===1&&(this.viewModel.topLayers[0].name="Building layers not found");return wTt(e,this.levels),this.viewModel.currentLevel.subscribe(function(i){i!=="All"?e.filterByAttributes([{name:"BldgLevel",values:[i]}]):e.filterByAttributes()}),this.viewModel}var YA=FTt;function ATt(e,t){let n=document.getElementById(e),i=document.createElement("div");i.classList.add("cesium-viewer-i3s-explorer"),i.innerHTML=` <h3>Building explorer</h3> <select data-bind="options: topLayers, optionsText: 'name', optionsAfterRender: setOptionDisable, value: currentLayer" ></select> <div id="bsl-wrapper"> <h3>Select Level</h3> <select data-bind="options: levels, value: currentLevel"></select> <h3>Disciplines & Categories</h3> <ul class="layersList" data-bind="foreach: sublayers"> <ul class="layersList" data-bind="foreach: sublayers.sort(function (l, r) { return l.name.localeCompare(r.name) })"> <li> <div class="li-wrapper"> <span class="expandItem" data-bind="click: $root.expandClickHandler" >+</span > <input type="checkbox" data-bind="checked: visibility, valueUpdate: 'input', attr: { id: name}" /> <label data-bind="attr: { for: name}"> <span data-bind="text: name"></span> </label> </div> <ul class="nested" data-bind="attr: { id: name + '-expander'}"> <li data-bind="foreach: sublayers.sort(function (l, r) { return l.name.localeCompare(r.name) })"> <div class="li-wrapper"> <input type="checkbox" data-bind="checked: visibility, valueUpdate: 'input', attr: { id: name}" /> <label data-bind="attr: { for: name}"> <span data-bind="text: name"></span> </label> </div> </li> </ul> </li> </ul> </ul> </div>`,n.appendChild(i);let o=new YA(t);Ce.track(o),Ce.applyBindings(o,n),l(o.defaultLayer)&&(o.currentLayer=o.defaultLayer)}var d6=ATt;var hSo=T(S(),1);var sSo=T(S(),1);var MTt="M 13.84375 7.03125 C 11.412798 7.03125 9.46875 8.975298 9.46875 11.40625 L 9.46875 11.59375 L 2.53125 7.21875 L 2.53125 24.0625 L 9.46875 19.6875 C 9.4853444 22.104033 11.423165 24.0625 13.84375 24.0625 L 25.875 24.0625 C 28.305952 24.0625 30.28125 22.087202 30.28125 19.65625 L 30.28125 11.40625 C 30.28125 8.975298 28.305952 7.03125 25.875 7.03125 L 13.84375 7.03125 z",NTt="M 27.34375 1.65625 L 5.28125 27.9375 L 8.09375 30.3125 L 30.15625 4.03125 L 27.34375 1.65625 z M 13.84375 7.03125 C 11.412798 7.03125 9.46875 8.975298 9.46875 11.40625 L 9.46875 11.59375 L 2.53125 7.21875 L 2.53125 24.0625 L 9.46875 19.6875 C 9.4724893 20.232036 9.5676108 20.7379 9.75 21.21875 L 21.65625 7.03125 L 13.84375 7.03125 z M 28.21875 7.71875 L 14.53125 24.0625 L 25.875 24.0625 C 28.305952 24.0625 30.28125 22.087202 30.28125 19.65625 L 30.28125 11.40625 C 30.28125 9.8371439 29.456025 8.4902779 28.21875 7.71875 z";function u6(){this._cameraClicked=new ge,this._closeClicked=new ge,this.maxHeight=500,this.enableCamera=!1,this.isCameraTracking=!1,this.showInfo=!1,this.titleText="",this.description="",Ce.track(this,["showInfo","titleText","description","maxHeight","enableCamera","isCameraTracking"]),this._loadingIndicatorHtml='<div class="cesium-infoBox-loadingContainer"><span class="cesium-infoBox-loading"></span></div>',this.cameraIconPath=void 0,Ce.defineProperty(this,"cameraIconPath",{get:function(){return!this.enableCamera||this.isCameraTracking?NTt:MTt}}),Ce.defineProperty(this,"_bodyless",{get:function(){return!l(this.description)||this.description.length===0}})}u6.prototype.maxHeightOffset=function(e){return`${this.maxHeight-e}px`};Object.defineProperties(u6.prototype,{cameraClicked:{get:function(){return this._cameraClicked}},closeClicked:{get:function(){return this._closeClicked}}});var OA=u6;function tB(e){e=In(e);let t=document.createElement("div");t.className="cesium-infoBox",t.setAttribute("data-bind",'css: { "cesium-infoBox-visible" : showInfo, "cesium-infoBox-bodyless" : _bodyless }'),e.appendChild(t);let n=document.createElement("div");n.className="cesium-infoBox-title",n.setAttribute("data-bind","text: titleText"),t.appendChild(n);let i=document.createElement("button");i.type="button",i.className="cesium-button cesium-infoBox-camera",i.setAttribute("data-bind",'attr: { title: "Focus camera on object" },click: function () { cameraClicked.raiseEvent(this); },enable: enableCamera,cesiumSvgPath: { path: cameraIconPath, width: 32, height: 32 }'),t.appendChild(i);let o=document.createElement("button");o.type="button",o.className="cesium-infoBox-close",o.setAttribute("data-bind","click: function () { closeClicked.raiseEvent(this); }"),o.innerHTML="×",t.appendChild(o);let r=document.createElement("iframe");r.className="cesium-infoBox-iframe",r.setAttribute("sandbox","allow-same-origin allow-popups allow-forms"),r.setAttribute("data-bind","style : { maxHeight : maxHeightOffset(40) }"),r.setAttribute("allowfullscreen",!0),t.appendChild(r);let s=new OA;Ce.applyBindings(s,t),this._container=e,this._element=t,this._frame=r,this._viewModel=s,this._descriptionSubscription=void 0;let a=this;r.addEventListener("load",function(){let c=r.contentDocument,d=c.createElement("link");d.href=tn("Widgets/InfoBox/InfoBoxDescription.css"),d.rel="stylesheet",d.type="text/css";let u=c.createElement("div");u.className="cesium-infoBox-description",c.head.appendChild(d),c.body.appendChild(u),a._descriptionSubscription=ba(s,"description",function(m){r.style.height="5px",u.innerHTML=m;let p=null,g=u.firstElementChild;if(g!==null&&u.childNodes.length===1){let x=window.getComputedStyle(g);if(x!==null){let _=x["background-color"],C=Y.fromCssColorString(_);l(C)&&C.alpha!==0&&(p=x["background-color"])}}t.style["background-color"]=p;let f=u.getBoundingClientRect().height;r.style.height=`${f}px`})}),r.setAttribute("src","about:blank")}Object.defineProperties(tB.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}},frame:{get:function(){return this._frame}}});tB.prototype.isDestroyed=function(){return!1};tB.prototype.destroy=function(){let e=this._container;return Ce.cleanNode(this._element),e.removeChild(this._element),l(this._descriptionSubscription)&&this._descriptionSubscription.dispose(),me(this)};var HA=tB;var VSo=T(S(),1);var gSo=T(S(),1);function RSe(){this.showInstructions=!1;let e=this;this._command=Vn(function(){e.showInstructions=!e.showInstructions}),this._showClick=Vn(function(){e._touch=!1}),this._showTouch=Vn(function(){e._touch=!0}),this._touch=!1,this.tooltip="Navigation Instructions",Ce.track(this,["tooltip","showInstructions","_touch"])}Object.defineProperties(RSe.prototype,{command:{get:function(){return this._command}},showClick:{get:function(){return this._showClick}},showTouch:{get:function(){return this._showTouch}}});var zA=RSe;function nB(e){let t=In(e.container),n=new zA,i=y(e.instructionsInitiallyVisible,!1);n.showInstructions=i,n._svgPath="M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466z M17.328,24.371h-2.707v-2.596h2.707V24.371zM17.328,19.003v0.858h-2.707v-1.057c0-3.19,3.63-3.696,3.63-5.963c0-1.034-0.924-1.826-2.134-1.826c-1.254,0-2.354,0.924-2.354,0.924l-1.541-1.915c0,0,1.519-1.584,4.137-1.584c2.487,0,4.796,1.54,4.796,4.136C21.156,16.208,17.328,16.627,17.328,19.003z";let o=document.createElement("span");o.className="cesium-navigationHelpButton-wrapper",t.appendChild(o);let r=document.createElement("button");r.type="button",r.className="cesium-button cesium-toolbar-button cesium-navigation-help-button",r.setAttribute("data-bind","attr: { title: tooltip },click: command,cesiumSvgPath: { path: _svgPath, width: 32, height: 32 }"),o.appendChild(r);let s=document.createElement("div");s.className="cesium-navigation-help",s.setAttribute("data-bind",'css: { "cesium-navigation-help-visible" : showInstructions}'),o.appendChild(s);let a=document.createElement("button");a.type="button",a.className="cesium-navigation-button cesium-navigation-button-left",a.setAttribute("data-bind",'click: showClick, css: {"cesium-navigation-button-selected": !_touch, "cesium-navigation-button-unselected": _touch}');let c=document.createElement("img");c.src=tn("Widgets/Images/NavigationHelp/Mouse.svg"),c.className="cesium-navigation-button-icon",c.style.width="25px",c.style.height="25px",a.appendChild(c),a.appendChild(document.createTextNode("Mouse"));let d=document.createElement("button");d.type="button",d.className="cesium-navigation-button cesium-navigation-button-right",d.setAttribute("data-bind",'click: showTouch, css: {"cesium-navigation-button-selected": _touch, "cesium-navigation-button-unselected": !_touch}');let u=document.createElement("img");u.src=tn("Widgets/Images/NavigationHelp/Touch.svg"),u.className="cesium-navigation-button-icon",u.style.width="25px",u.style.height="25px",d.appendChild(u),d.appendChild(document.createTextNode("Touch")),s.appendChild(a),s.appendChild(d);let m=document.createElement("div");m.className="cesium-click-navigation-help cesium-navigation-help-instructions",m.setAttribute("data-bind",'css: { "cesium-click-navigation-help-visible" : !_touch}'),m.innerHTML=` <table> <tr> <td><img src="${tn("Widgets/Images/NavigationHelp/MouseLeft.svg")}" width="48" height="48" /></td> <td> <div class="cesium-navigation-help-pan">Pan view</div> <div class="cesium-navigation-help-details">Left click + drag</div> </td> </tr> <tr> <td><img src="${tn("Widgets/Images/NavigationHelp/MouseRight.svg")}" width="48" height="48" /></td> <td> <div class="cesium-navigation-help-zoom">Zoom view</div> <div class="cesium-navigation-help-details">Right click + drag, or</div> <div class="cesium-navigation-help-details">Mouse wheel scroll</div> </td> </tr> <tr> <td><img src="${tn("Widgets/Images/NavigationHelp/MouseMiddle.svg")}" width="48" height="48" /></td> <td> <div class="cesium-navigation-help-rotate">Rotate view</div> <div class="cesium-navigation-help-details">Middle click + drag, or</div> <div class="cesium-navigation-help-details">CTRL + Left/Right click + drag</div> </td> </tr> </table>`,s.appendChild(m);let p=document.createElement("div");p.className="cesium-touch-navigation-help cesium-navigation-help-instructions",p.setAttribute("data-bind",'css: { "cesium-touch-navigation-help-visible" : _touch}'),p.innerHTML=` <table> <tr> <td><img src="${tn("Widgets/Images/NavigationHelp/TouchDrag.svg")}" width="70" height="48" /></td> <td> <div class="cesium-navigation-help-pan">Pan view</div> <div class="cesium-navigation-help-details">One finger drag</div> </td> </tr> <tr> <td><img src="${tn("Widgets/Images/NavigationHelp/TouchZoom.svg")}" width="70" height="48" /></td> <td> <div class="cesium-navigation-help-zoom">Zoom view</div> <div class="cesium-navigation-help-details">Two finger pinch</div> </td> </tr> <tr> <td><img src="${tn("Widgets/Images/NavigationHelp/TouchTilt.svg")}" width="70" height="48" /></td> <td> <div class="cesium-navigation-help-rotate">Tilt view</div> <div class="cesium-navigation-help-details">Two finger drag, same direction</div> </td> </tr> <tr> <td><img src="${tn("Widgets/Images/NavigationHelp/TouchRotate.svg")}" width="70" height="48" /></td> <td> <div class="cesium-navigation-help-tilt">Rotate view</div> <div class="cesium-navigation-help-details">Two finger drag, opposite direction</div> </td> </tr> </table>`,s.appendChild(p),Ce.applyBindings(n,o),this._container=t,this._viewModel=n,this._wrapper=o,this._closeInstructions=function(g){o.contains(g.target)||(n.showInstructions=!1)},Yt.supportsPointerEvents()?document.addEventListener("pointerdown",this._closeInstructions,!0):(document.addEventListener("mousedown",this._closeInstructions,!0),document.addEventListener("touchstart",this._closeInstructions,!0))}Object.defineProperties(nB.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});nB.prototype.isDestroyed=function(){return!1};nB.prototype.destroy=function(){return Yt.supportsPointerEvents()?document.removeEventListener("pointerdown",this._closeInstructions,!0):(document.removeEventListener("mousedown",this._closeInstructions,!0),document.removeEventListener("touchstart",this._closeInstructions,!0)),Ce.cleanNode(this._wrapper),this._container.removeChild(this._wrapper),me(this)};var KA=nB;var MSo=T(S(),1);var ISo=T(S(),1);function m6(e){this._scene=e.scene,this.lowFrameRateMessage=y(e.lowFrameRateMessage,"This application appears to be performing poorly on your system. Please try using a different web browser or updating your video drivers."),this.lowFrameRateMessageDismissed=!1,this.showingLowFrameRateMessage=!1,Ce.track(this,["lowFrameRateMessage","lowFrameRateMessageDismissed","showingLowFrameRateMessage"]);let t=this;this._dismissMessage=Vn(function(){t.showingLowFrameRateMessage=!1,t.lowFrameRateMessageDismissed=!0});let n=$9.fromScene(e.scene);this._unsubscribeLowFrameRate=n.lowFrameRate.addEventListener(function(){t.lowFrameRateMessageDismissed||(t.showingLowFrameRateMessage=!0)}),this._unsubscribeNominalFrameRate=n.nominalFrameRate.addEventListener(function(){t.showingLowFrameRateMessage=!1})}Object.defineProperties(m6.prototype,{scene:{get:function(){return this._scene}},dismissMessage:{get:function(){return this._dismissMessage}}});m6.prototype.destroy=function(){return this._unsubscribeLowFrameRate(),this._unsubscribeNominalFrameRate(),me(this)};var JA=m6;function iB(e){let t=In(e.container),n=new JA(e),i=document.createElement("div");i.className="cesium-performance-watchdog-message-area",i.setAttribute("data-bind","visible: showingLowFrameRateMessage");let o=document.createElement("button");o.setAttribute("type","button"),o.className="cesium-performance-watchdog-message-dismiss",o.innerHTML="×",o.setAttribute("data-bind","click: dismissMessage"),i.appendChild(o);let r=document.createElement("div");r.className="cesium-performance-watchdog-message",r.setAttribute("data-bind","html: lowFrameRateMessage"),i.appendChild(r),t.appendChild(i),Ce.applyBindings(n,i),this._container=t,this._viewModel=n,this._element=i}Object.defineProperties(iB.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});iB.prototype.isDestroyed=function(){return!1};iB.prototype.destroy=function(){return this._viewModel.destroy(),Ce.cleanNode(this._element),this._container.removeChild(this._element),me(this)};var QA=iB;var jSo=T(S(),1);var YSo=T(S(),1);function oB(e){this._scene=e,this._orthographic=e.camera.frustum instanceof on,this._flightInProgress=!1,this.dropDownVisible=!1,this.tooltipPerspective="Perspective Projection",this.tooltipOrthographic="Orthographic Projection",this.selectedTooltip=void 0,this.sceneMode=e.mode,Ce.track(this,["_orthographic","_flightInProgress","sceneMode","dropDownVisible","tooltipPerspective","tooltipOrthographic"]);let t=this;Ce.defineProperty(this,"selectedTooltip",function(){return t._orthographic?t.tooltipOrthographic:t.tooltipPerspective}),this._toggleDropDown=Vn(function(){t.sceneMode===oe.SCENE2D||t._flightInProgress||(t.dropDownVisible=!t.dropDownVisible)}),this._eventHelper=new Rr,this._eventHelper.add(e.morphComplete,function(n,i,o,r){t.sceneMode=o,t._orthographic=o===oe.SCENE2D||t._scene.camera.frustum instanceof on}),this._eventHelper.add(e.preRender,function(){t._flightInProgress=l(e.camera._currentFlight)}),this._switchToPerspective=Vn(function(){t.sceneMode!==oe.SCENE2D&&(t._scene.camera.switchToPerspectiveFrustum(),t._orthographic=!1,t.dropDownVisible=!1)}),this._switchToOrthographic=Vn(function(){t.sceneMode!==oe.SCENE2D&&(t._scene.camera.switchToOrthographicFrustum(),t._orthographic=!0,t.dropDownVisible=!1)}),this._sceneMode=oe}Object.defineProperties(oB.prototype,{scene:{get:function(){return this._scene}},toggleDropDown:{get:function(){return this._toggleDropDown}},switchToPerspective:{get:function(){return this._switchToPerspective}},switchToOrthographic:{get:function(){return this._switchToOrthographic}},isOrthographicProjection:{get:function(){return this._orthographic}}});oB.prototype.isDestroyed=function(){return!1};oB.prototype.destroy=function(){this._eventHelper.removeAll(),me(this)};var jA=oB;var kTt="M 28.15625,10.4375 9.125,13.21875 13.75,43.25 41.75,55.09375 50.8125,37 54.5,11.9375 z m 0.125,3 19.976451,0.394265 L 43.03125,16.875 22.6875,14.28125 z M 50.971746,15.705477 47.90625,36.03125 42.53125,46 44.84375,19.3125 z M 12.625,16.03125 l 29.15625,3.6875 -2.65625,31 L 16.4375,41.125 z",UTt="m 31.560594,6.5254438 -20.75,12.4687502 0.1875,24.5625 22.28125,11.8125 19.5,-12 0.65625,-0.375 0,-0.75 0.0312,-23.21875 z m 0.0625,3.125 16.65625,9.5000002 -16.125,10.28125 -17.34375,-9.71875 z m 18.96875,11.1875002 0.15625,20.65625 -17.46875,10.59375 0.15625,-20.28125 z m -37.0625,1.25 17.21875,9.625 -0.15625,19.21875 -16.9375,-9 z";function rB(e,t){e=In(e);let n=new jA(t);n._perspectivePath=kTt,n._orthographicPath=UTt;let i=document.createElement("span");i.className="cesium-projectionPicker-wrapper cesium-toolbar-button",e.appendChild(i);let o=document.createElement("button");o.type="button",o.className="cesium-button cesium-toolbar-button",o.setAttribute("data-bind",'css: { "cesium-projectionPicker-buttonPerspective": !_orthographic, "cesium-projectionPicker-buttonOrthographic": _orthographic, "cesium-button-disabled" : sceneMode === _sceneMode.SCENE2D || _flightInProgress, "cesium-projectionPicker-selected": dropDownVisible },attr: { title: selectedTooltip },click: toggleDropDown'),o.innerHTML='<!-- ko cesiumSvgPath: { path: _perspectivePath, width: 64, height: 64, css: "cesium-projectionPicker-iconPerspective" } --><!-- /ko --><!-- ko cesiumSvgPath: { path: _orthographicPath, width: 64, height: 64, css: "cesium-projectionPicker-iconOrthographic" } --><!-- /ko -->',i.appendChild(o);let r=document.createElement("button");r.type="button",r.className="cesium-button cesium-toolbar-button cesium-projectionPicker-dropDown-icon",r.setAttribute("data-bind",'css: { "cesium-projectionPicker-visible" : (dropDownVisible && _orthographic), "cesium-projectionPicker-none" : !_orthographic, "cesium-projectionPicker-hidden" : !dropDownVisible },attr: { title: tooltipPerspective },click: switchToPerspective,cesiumSvgPath: { path: _perspectivePath, width: 64, height: 64 }'),i.appendChild(r);let s=document.createElement("button");s.type="button",s.className="cesium-button cesium-toolbar-button cesium-projectionPicker-dropDown-icon",s.setAttribute("data-bind",'css: { "cesium-projectionPicker-visible" : (dropDownVisible && !_orthographic), "cesium-projectionPicker-none" : _orthographic, "cesium-projectionPicker-hidden" : !dropDownVisible},attr: { title: tooltipOrthographic },click: switchToOrthographic,cesiumSvgPath: { path: _orthographicPath, width: 64, height: 64 }'),i.appendChild(s),Ce.applyBindings(n,i),this._viewModel=n,this._container=e,this._wrapper=i,this._closeDropDown=function(a){i.contains(a.target)||(n.dropDownVisible=!1)},Yt.supportsPointerEvents()?document.addEventListener("pointerdown",this._closeDropDown,!0):(document.addEventListener("mousedown",this._closeDropDown,!0),document.addEventListener("touchstart",this._closeDropDown,!0))}Object.defineProperties(rB.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});rB.prototype.isDestroyed=function(){return!1};rB.prototype.destroy=function(){return this._viewModel.destroy(),Yt.supportsPointerEvents()?document.removeEventListener("pointerdown",this._closeDropDown,!0):(document.removeEventListener("mousedown",this._closeDropDown,!0),document.removeEventListener("touchstart",this._closeDropDown,!0)),Ce.cleanNode(this._wrapper),this._container.removeChild(this._wrapper),me(this)};var qA=rB;var uCo=T(S(),1);var oCo=T(S(),1);function sB(e,t){this._scene=e;let n=this,i=function(o,r,s,a){n.sceneMode=s,n.dropDownVisible=!1};this._eventHelper=new Rr,this._eventHelper.add(e.morphStart,i),this._duration=y(t,2),this.sceneMode=e.mode,this.dropDownVisible=!1,this.tooltip2D="2D",this.tooltip3D="3D",this.tooltipColumbusView="Columbus View",Ce.track(this,["sceneMode","dropDownVisible","tooltip2D","tooltip3D","tooltipColumbusView"]),this.selectedTooltip=void 0,Ce.defineProperty(this,"selectedTooltip",function(){let o=n.sceneMode;return o===oe.SCENE2D?n.tooltip2D:o===oe.SCENE3D?n.tooltip3D:n.tooltipColumbusView}),this._toggleDropDown=Vn(function(){n.dropDownVisible=!n.dropDownVisible}),this._morphTo2D=Vn(function(){e.morphTo2D(n._duration)}),this._morphTo3D=Vn(function(){e.morphTo3D(n._duration)}),this._morphToColumbusView=Vn(function(){e.morphToColumbusView(n._duration)}),this._sceneMode=oe}Object.defineProperties(sB.prototype,{scene:{get:function(){return this._scene}},duration:{get:function(){return this._duration},set:function(e){this._duration=e}},toggleDropDown:{get:function(){return this._toggleDropDown}},morphTo2D:{get:function(){return this._morphTo2D}},morphTo3D:{get:function(){return this._morphTo3D}},morphToColumbusView:{get:function(){return this._morphToColumbusView}}});sB.prototype.isDestroyed=function(){return!1};sB.prototype.destroy=function(){this._eventHelper.removeAll(),me(this)};var $A=sB;var DTt="m 32.401392,4.9330437 c -7.087603,0 -14.096095,2.884602 -19.10793,7.8946843 -5.0118352,5.010083 -7.9296167,11.987468 -7.9296167,19.072999 0,7.085531 2.9177815,14.097848 7.9296167,19.107931 4.837653,4.835961 11.541408,7.631372 18.374354,7.82482 0.05712,0.01231 0.454119,0.139729 0.454119,0.139729 l 0.03493,-0.104797 c 0.08246,7.84e-4 0.162033,0.03493 0.244525,0.03493 0.08304,0 0.161515,-0.03414 0.244526,-0.03493 l 0.03493,0.104797 c 0,0 0.309474,-0.129487 0.349323,-0.139729 6.867765,-0.168094 13.582903,-2.965206 18.444218,-7.82482 2.558195,-2.5573 4.551081,-5.638134 5.903547,-8.977584 1.297191,-3.202966 2.02607,-6.661489 2.02607,-10.130347 0,-6.237309 -2.366261,-12.31219 -6.322734,-17.116794 -0.0034,-0.02316 0.0049,-0.04488 0,-0.06986 -0.01733,-0.08745 -0.104529,-0.278855 -0.104797,-0.279458 -5.31e-4,-0.0012 -0.522988,-0.628147 -0.523984,-0.62878 -3.47e-4,-2.2e-4 -0.133444,-0.03532 -0.244525,-0.06987 C 51.944299,13.447603 51.751076,13.104317 51.474391,12.827728 46.462556,7.8176457 39.488996,4.9330437 32.401392,4.9330437 z m -2.130866,3.5281554 0.104797,9.6762289 c -4.111695,-0.08361 -7.109829,-0.423664 -9.257041,-0.943171 1.198093,-2.269271 2.524531,-4.124404 3.91241,-5.414496 2.167498,-2.0147811 3.950145,-2.8540169 5.239834,-3.3185619 z m 2.794579,0 c 1.280302,0.4754953 3.022186,1.3285948 5.065173,3.2486979 1.424667,1.338973 2.788862,3.303645 3.982275,5.728886 -2.29082,0.403367 -5.381258,0.621049 -8.942651,0.698645 L 33.065105,8.4611991 z m 5.728886,0.2445256 c 4.004072,1.1230822 7.793098,3.1481363 10.724195,6.0782083 0.03468,0.03466 0.07033,0.06991 0.104797,0.104797 -0.45375,0.313891 -0.923054,0.663002 -1.956205,1.082899 -0.647388,0.263114 -1.906242,0.477396 -2.829511,0.733577 -1.382296,-2.988132 -3.027146,-5.368585 -4.785716,-7.0213781 -0.422866,-0.397432 -0.835818,-0.6453247 -1.25756,-0.9781032 z m -15.33525,0.7685092 c -0.106753,0.09503 -0.207753,0.145402 -0.31439,0.244526 -1.684973,1.5662541 -3.298068,3.8232211 -4.680919,6.5672591 -0.343797,-0.14942 -1.035052,-0.273198 -1.292493,-0.419186 -0.956528,-0.542427 -1.362964,-1.022024 -1.537018,-1.292493 -0.0241,-0.03745 -0.01868,-0.0401 -0.03493,-0.06986 2.250095,-2.163342 4.948824,-3.869984 7.859752,-5.0302421 z m -9.641296,7.0912431 c 0.464973,0.571618 0.937729,1.169056 1.956205,1.746612 0.349907,0.198425 1.107143,0.335404 1.537018,0.523983 -1.20166,3.172984 -1.998037,7.051901 -2.165798,11.772162 C 14.256557,30.361384 12.934823,30.161483 12.280427,29.90959 10.644437,29.279855 9.6888882,28.674891 9.1714586,28.267775 8.6540289,27.860658 8.6474751,27.778724 8.6474751,27.778724 l -0.069864,0.03493 C 9.3100294,23.691285 11.163248,19.798527 13.817445,16.565477 z m 37.552149,0.523984 c 2.548924,3.289983 4.265057,7.202594 4.890513,11.318043 -0.650428,0.410896 -1.756876,1.001936 -3.563088,1.606882 -1.171552,0.392383 -3.163859,0.759153 -4.960377,1.117832 -0.04367,-4.752703 -0.784809,-8.591423 -1.88634,-11.807094 0.917574,-0.263678 2.170552,-0.486495 2.864443,-0.76851 1.274693,-0.518066 2.003942,-1.001558 2.654849,-1.467153 z m -31.439008,2.619917 c 2.487341,0.672766 5.775813,1.137775 10.479669,1.222628 l 0.104797,10.689263 0,0.03493 0,0.733577 c -5.435005,-0.09059 -9.512219,-0.519044 -12.610536,-1.117831 0.106127,-4.776683 0.879334,-8.55791 2.02607,-11.562569 z m 23.264866,0.31439 c 1.073459,3.067541 1.833795,6.821314 1.816476,11.702298 -3.054474,0.423245 -7.062018,0.648559 -11.702298,0.698644 l 0,-0.838373 -0.104796,-10.654331 c 4.082416,-0.0864 7.404468,-0.403886 9.990618,-0.908238 z M 8.2632205,30.922625 c 0.7558676,0.510548 1.5529563,1.013339 3.0041715,1.57195 0.937518,0.360875 2.612202,0.647642 3.91241,0.978102 0.112814,3.85566 0.703989,7.107756 1.606883,9.920754 -1.147172,-0.324262 -2.644553,-0.640648 -3.423359,-0.978102 -1.516688,-0.657177 -2.386627,-1.287332 -2.864443,-1.71168 -0.477816,-0.424347 -0.489051,-0.489051 -0.489051,-0.489051 L 9.8002387,40.319395 C 8.791691,37.621767 8.1584238,34.769583 8.1584238,31.900727 c 0,-0.330153 0.090589,-0.648169 0.1047967,-0.978102 z m 48.2763445,0.419186 c 0.0047,0.188973 0.06986,0.36991 0.06986,0.558916 0,2.938869 -0.620228,5.873558 -1.676747,8.628261 -0.07435,0.07583 -0.06552,0.07411 -0.454119,0.349323 -0.606965,0.429857 -1.631665,1.042044 -3.318562,1.676747 -1.208528,0.454713 -3.204964,0.850894 -5.135038,1.25756 0.84593,-2.765726 1.41808,-6.005357 1.606883,-9.815957 2.232369,-0.413371 4.483758,-0.840201 5.938479,-1.327425 1.410632,-0.472457 2.153108,-0.89469 2.96924,-1.327425 z m -38.530252,2.864443 c 3.208141,0.56697 7.372279,0.898588 12.575603,0.978103 l 0.174662,9.885821 c -4.392517,-0.06139 -8.106722,-0.320566 -10.863925,-0.803441 -1.051954,-2.664695 -1.692909,-6.043794 -1.88634,-10.060483 z m 26.793022,0.31439 c -0.246298,3.923551 -0.877762,7.263679 -1.816476,9.885822 -2.561957,0.361954 -5.766249,0.560708 -9.431703,0.62878 l -0.174661,-9.815957 c 4.491734,-0.04969 8.334769,-0.293032 11.42284,-0.698645 z M 12.035901,44.860585 c 0.09977,0.04523 0.105535,0.09465 0.209594,0.139729 1.337656,0.579602 3.441099,1.058072 5.589157,1.537018 1.545042,3.399208 3.548524,5.969402 5.589157,7.789888 -3.034411,-1.215537 -5.871615,-3.007978 -8.174142,-5.309699 -1.245911,-1.245475 -2.271794,-2.662961 -3.213766,-4.156936 z m 40.69605,0 c -0.941972,1.493975 -1.967855,2.911461 -3.213765,4.156936 -2.74253,2.741571 -6.244106,4.696717 -9.955686,5.868615 0.261347,-0.241079 0.507495,-0.394491 0.768509,-0.663713 1.674841,-1.727516 3.320792,-4.181056 4.645987,-7.265904 2.962447,-0.503021 5.408965,-1.122293 7.161107,-1.781544 0.284034,-0.106865 0.337297,-0.207323 0.593848,-0.31439 z m -31.404076,2.305527 c 2.645807,0.376448 5.701178,0.649995 9.466635,0.698645 l 0.139729,7.789888 c -1.38739,-0.480844 -3.316218,-1.29837 -5.659022,-3.388427 -1.388822,-1.238993 -2.743668,-3.0113 -3.947342,-5.100106 z m 20.365491,0.104797 c -1.04872,2.041937 -2.174337,3.779068 -3.353494,4.995309 -1.853177,1.911459 -3.425515,2.82679 -4.611055,3.353494 l -0.139729,-7.789887 c 3.13091,-0.05714 5.728238,-0.278725 8.104278,-0.558916 z",BTt="m 2.9825053,17.550598 0,1.368113 0,26.267766 0,1.368113 1.36811,0 54.9981397,0 1.36811,0 0,-1.368113 0,-26.267766 0,-1.368113 -1.36811,0 -54.9981397,0 -1.36811,0 z m 2.73623,2.736226 10.3292497,0 0,10.466063 -10.3292497,0 0,-10.466063 z m 13.0654697,0 11.69737,0 0,10.466063 -11.69737,0 0,-10.466063 z m 14.43359,0 11.69737,0 0,10.466063 -11.69737,0 0,-10.466063 z m 14.43359,0 10.32926,0 0,10.466063 -10.32926,0 0,-10.466063 z m -41.9326497,13.202288 10.3292497,0 0,10.329252 -10.3292497,0 0,-10.329252 z m 13.0654697,0 11.69737,0 0,10.329252 -11.69737,0 0,-10.329252 z m 14.43359,0 11.69737,0 0,10.329252 -11.69737,0 0,-10.329252 z m 14.43359,0 10.32926,0 0,10.329252 -10.32926,0 0,-10.329252 z",YTt="m 14.723969,17.675598 -0.340489,0.817175 -11.1680536,26.183638 -0.817175,1.872692 2.076986,0 54.7506996,0 2.07698,0 -0.81717,-1.872692 -11.16805,-26.183638 -0.34049,-0.817175 -0.91933,0 -32.414586,0 -0.919322,0 z m 1.838643,2.723916 6.196908,0 -2.928209,10.418977 -7.729111,0 4.460412,-10.418977 z m 9.02297,0 4.903049,0 0,10.418977 -7.831258,0 2.928209,-10.418977 z m 7.626964,0 5.584031,0 2.62176,10.418977 -8.205791,0 0,-10.418977 z m 8.410081,0 5.51593,0 4.46042,10.418977 -7.38863,0 -2.58772,-10.418977 z m -30.678091,13.142892 8.103649,0 -2.89416,10.282782 -9.6018026,0 4.3923136,-10.282782 z m 10.929711,0 8.614384,0 0,10.282782 -11.508544,0 2.89416,-10.282782 z m 11.338299,0 8.852721,0 2.58772,10.282782 -11.440441,0 0,-10.282782 z m 11.678781,0 7.86531,0 4.39231,10.282782 -9.6699,0 -2.58772,-10.282782 z";function aB(e,t,n){e=In(e);let i=new $A(t,n);i._globePath=DTt,i._flatMapPath=BTt,i._columbusViewPath=YTt;let o=document.createElement("span");o.className="cesium-sceneModePicker-wrapper cesium-toolbar-button",e.appendChild(o);let r=document.createElement("button");r.type="button",r.className="cesium-button cesium-toolbar-button",r.setAttribute("data-bind",'css: { "cesium-sceneModePicker-button2D": sceneMode === _sceneMode.SCENE2D, "cesium-sceneModePicker-button3D": sceneMode === _sceneMode.SCENE3D, "cesium-sceneModePicker-buttonColumbusView": sceneMode === _sceneMode.COLUMBUS_VIEW, "cesium-sceneModePicker-selected": dropDownVisible },attr: { title: selectedTooltip },click: toggleDropDown'),r.innerHTML='<!-- ko cesiumSvgPath: { path: _globePath, width: 64, height: 64, css: "cesium-sceneModePicker-slide-svg cesium-sceneModePicker-icon3D" } --><!-- /ko --><!-- ko cesiumSvgPath: { path: _flatMapPath, width: 64, height: 64, css: "cesium-sceneModePicker-slide-svg cesium-sceneModePicker-icon2D" } --><!-- /ko --><!-- ko cesiumSvgPath: { path: _columbusViewPath, width: 64, height: 64, css: "cesium-sceneModePicker-slide-svg cesium-sceneModePicker-iconColumbusView" } --><!-- /ko -->',o.appendChild(r);let s=document.createElement("button");s.type="button",s.className="cesium-button cesium-toolbar-button cesium-sceneModePicker-dropDown-icon",s.setAttribute("data-bind",'css: { "cesium-sceneModePicker-visible" : (dropDownVisible && (sceneMode !== _sceneMode.SCENE3D)) || (!dropDownVisible && (sceneMode === _sceneMode.SCENE3D)), "cesium-sceneModePicker-none" : sceneMode === _sceneMode.SCENE3D, "cesium-sceneModePicker-hidden" : !dropDownVisible },attr: { title: tooltip3D },click: morphTo3D,cesiumSvgPath: { path: _globePath, width: 64, height: 64 }'),o.appendChild(s);let a=document.createElement("button");a.type="button",a.className="cesium-button cesium-toolbar-button cesium-sceneModePicker-dropDown-icon",a.setAttribute("data-bind",'css: { "cesium-sceneModePicker-visible" : (dropDownVisible && (sceneMode !== _sceneMode.SCENE2D)), "cesium-sceneModePicker-none" : sceneMode === _sceneMode.SCENE2D, "cesium-sceneModePicker-hidden" : !dropDownVisible },attr: { title: tooltip2D },click: morphTo2D,cesiumSvgPath: { path: _flatMapPath, width: 64, height: 64 }'),o.appendChild(a);let c=document.createElement("button");c.type="button",c.className="cesium-button cesium-toolbar-button cesium-sceneModePicker-dropDown-icon",c.setAttribute("data-bind",'css: { "cesium-sceneModePicker-visible" : (dropDownVisible && (sceneMode !== _sceneMode.COLUMBUS_VIEW)) || (!dropDownVisible && (sceneMode === _sceneMode.COLUMBUS_VIEW)), "cesium-sceneModePicker-none" : sceneMode === _sceneMode.COLUMBUS_VIEW, "cesium-sceneModePicker-hidden" : !dropDownVisible},attr: { title: tooltipColumbusView },click: morphToColumbusView,cesiumSvgPath: { path: _columbusViewPath, width: 64, height: 64 }'),o.appendChild(c),Ce.applyBindings(i,o),this._viewModel=i,this._container=e,this._wrapper=o,this._closeDropDown=function(d){o.contains(d.target)||(i.dropDownVisible=!1)},Yt.supportsPointerEvents()?document.addEventListener("pointerdown",this._closeDropDown,!0):(document.addEventListener("mousedown",this._closeDropDown,!0),document.addEventListener("touchstart",this._closeDropDown,!0))}Object.defineProperties(aB.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});aB.prototype.isDestroyed=function(){return!1};aB.prototype.destroy=function(){return this._viewModel.destroy(),Yt.supportsPointerEvents()?document.removeEventListener("pointerdown",this._closeDropDown,!0):(document.removeEventListener("mousedown",this._closeDropDown,!0),document.removeEventListener("touchstart",this._closeDropDown,!0)),Ce.cleanNode(this._wrapper),this._container.removeChild(this._wrapper),me(this)};var eM=aB;var CCo=T(S(),1);var bCo=T(S(),1);var OTt=new D,cB="-1000px";function tM(e,t,n){this._scene=e,this._screenPositionX=cB,this._screenPositionY=cB,this._tweens=e.tweens,this._container=y(n,document.body),this._selectionIndicatorElement=t,this._scale=1,this.position=void 0,this.showSelection=!1,Ce.track(this,["position","_screenPositionX","_screenPositionY","_scale","showSelection"]),this.isVisible=void 0,Ce.defineProperty(this,"isVisible",{get:function(){return this.showSelection&&l(this.position)}}),Ce.defineProperty(this,"_transform",{get:function(){return`scale(${this._scale})`}}),this.computeScreenSpacePosition=function(i,o){return ki.wgs84ToWindowCoordinates(e,i,o)}}tM.prototype.update=function(){if(this.showSelection&&l(this.position)){let e=this.computeScreenSpacePosition(this.position,OTt);if(!l(e))this._screenPositionX=cB,this._screenPositionY=cB;else{let t=this._container,n=t.parentNode.clientWidth,i=t.parentNode.clientHeight,o=this._selectionIndicatorElement.clientWidth,r=o*.5;e.x=Math.min(Math.max(e.x,-o),n+o)-r,e.y=Math.min(Math.max(e.y,-o),i+o)-r,this._screenPositionX=`${Math.floor(e.x+.25)}px`,this._screenPositionY=`${Math.floor(e.y+.25)}px`}}};tM.prototype.animateAppear=function(){this._tweens.addProperty({object:this,property:"_scale",startValue:2,stopValue:1,duration:.8,easingFunction:Lr.EXPONENTIAL_OUT})};tM.prototype.animateDepart=function(){this._tweens.addProperty({object:this,property:"_scale",startValue:this._scale,stopValue:1.5,duration:.8,easingFunction:Lr.EXPONENTIAL_OUT})};Object.defineProperties(tM.prototype,{container:{get:function(){return this._container}},selectionIndicatorElement:{get:function(){return this._selectionIndicatorElement}},scene:{get:function(){return this._scene}}});var nM=tM;function lB(e,t){e=In(e),this._container=e;let n=document.createElement("div");n.className="cesium-selection-wrapper",n.setAttribute("data-bind",'style: { "top" : _screenPositionY, "left" : _screenPositionX },css: { "cesium-selection-wrapper-visible" : isVisible }'),e.appendChild(n),this._element=n;let i="http://www.w3.org/2000/svg",o="M -34 -34 L -34 -11.25 L -30 -15.25 L -30 -30 L -15.25 -30 L -11.25 -34 L -34 -34 z M 11.25 -34 L 15.25 -30 L 30 -30 L 30 -15.25 L 34 -11.25 L 34 -34 L 11.25 -34 z M -34 11.25 L -34 34 L -11.25 34 L -15.25 30 L -30 30 L -30 15.25 L -34 11.25 z M 34 11.25 L 30 15.25 L 30 30 L 15.25 30 L 11.25 34 L 34 34 L 34 11.25 z",r=document.createElementNS(i,"svg:svg");r.setAttribute("width",160),r.setAttribute("height",160),r.setAttribute("viewBox","0 0 160 160");let s=document.createElementNS(i,"g");s.setAttribute("transform","translate(80,80)"),r.appendChild(s);let a=document.createElementNS(i,"path");a.setAttribute("data-bind","attr: { transform: _transform }"),a.setAttribute("d",o),s.appendChild(a),n.appendChild(r);let c=new nM(t,this._element,this._container);this._viewModel=c,Ce.applyBindings(this._viewModel,this._element)}Object.defineProperties(lB.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});lB.prototype.isDestroyed=function(){return!1};lB.prototype.destroy=function(){let e=this._container;return Ce.cleanNode(this._element),e.removeChild(this._element),me(this)};var iM=lB;var wCo=T(S(),1);var RCo=T(S(),1);function bS(e,t,n){this._color=e,this._height=t,this._base=y(n,0)}bS.prototype.getHeight=function(){return this._height};bS.prototype.getBase=function(){return this._base};bS.prototype.getStartTime=function(){return this._start};bS.prototype.getStopTime=function(){return this._stop};bS.prototype.setRange=function(e,t){this._start=e,this._stop=t};bS.prototype.render=function(e){let t="";if(this._start&&this._stop&&this._color){let n=te.secondsDifference(this._start,e.epochJulian),i=Math.round(e.timeBarWidth*e.getAlpha(n)),o=te.secondsDifference(this._stop,e.epochJulian),r=Math.round(e.timeBarWidth*e.getAlpha(o))-i;i<0&&(r+=i,i=0),i+r>e.timeBarWidth&&(r=e.timeBarWidth-i),r>0&&(t=`<span class="cesium-timeline-highlight" style="left: ${i.toString()}px; width: ${r.toString()}px; bottom: ${this._base.toString()}px; height: ${this._height}px; background-color: ${this._color};"></span>`)}return t};var oM=bS;var ECo=T(S(),1);function ZSe(e,t,n,i){this.interval=e,this.height=t,this.color=n||new Y(.5,.5,.5,1),this.backgroundColor=i||new Y(0,0,0,0)}ZSe.prototype.render=function(e,t){let n=this.interval.start,i=this.interval.stop,o=t.startJulian,r=te.addSeconds(t.startJulian,t.duration,new te);if(te.lessThan(n,o)&&te.greaterThan(i,r))e.fillStyle=this.color.toCssColorString(),e.fillRect(0,t.y,t.timeBarWidth,this.height);else if(te.lessThanOrEquals(n,r)&&te.greaterThanOrEquals(i,o)){let s,a,c;for(s=0;s<t.timeBarWidth;++s){let d=te.addSeconds(t.startJulian,s/t.timeBarWidth*t.duration,new te);!l(a)&&te.greaterThanOrEquals(d,n)?a=s:!l(c)&&te.greaterThanOrEquals(d,i)&&(c=s)}e.fillStyle=this.backgroundColor.toCssColorString(),e.fillRect(0,t.y,t.timeBarWidth,this.height),l(a)&&(l(c)||(c=t.timeBarWidth),e.fillStyle=this.color.toCssColorString(),e.fillRect(a,t.y,Math.max(c-a,1),this.height))}};var rM=ZSe;var h6=1e12,lm={none:0,scrub:1,slide:2,zoom:3,touchOnly:4},dl={none:0,scrub:1,slideZoom:2,singleTap:3,ignore:4},Ay=[.001,.002,.005,.01,.02,.05,.1,.25,.5,1,2,5,10,15,30,60,120,300,600,900,1800,3600,7200,14400,21600,43200,86400,172800,345600,604800,1296e3,2592e3,5184e3,7776e3,15552e3,31536e3,63072e3,126144e3,15768e4,31536e4,63072e4,126144e4,15768e5,31536e5,63072e5,126144e5,15768e6,31536e6],HTt=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function ul(e,t){e=In(e);let n=e.ownerDocument;this.container=e;let i=n.createElement("div");i.className="cesium-timeline-main",e.appendChild(i),this._topDiv=i,this._endJulian=void 0,this._epochJulian=void 0,this._lastXPos=void 0,this._scrubElement=void 0,this._startJulian=void 0,this._timeBarSecondsSpan=void 0,this._clock=t,this._scrubJulian=t.currentTime,this._mainTicSpan=-1,this._mouseMode=lm.none,this._touchMode=dl.none,this._touchState={centerX:0,spanX:0},this._mouseX=0,this._timelineDrag=0,this._timelineDragLocation=void 0,this._lastHeight=void 0,this._lastWidth=void 0,this._topDiv.innerHTML='<div class="cesium-timeline-bar"></div><div class="cesium-timeline-trackContainer"><canvas class="cesium-timeline-tracks" width="10" height="1"></canvas></div><div class="cesium-timeline-needle"></div><span class="cesium-timeline-ruler"></span>',this._timeBarEle=this._topDiv.childNodes[0],this._trackContainer=this._topDiv.childNodes[1],this._trackListEle=this._topDiv.childNodes[1].childNodes[0],this._needleEle=this._topDiv.childNodes[2],this._rulerEle=this._topDiv.childNodes[3],this._context=this._trackListEle.getContext("2d"),this._trackList=[],this._highlightRanges=[],this.zoomTo(t.startTime,t.stopTime),this._onMouseDown=zTt(this),this._onMouseUp=KTt(this),this._onMouseMove=JTt(this),this._onMouseWheel=QTt(this),this._onTouchStart=jTt(this),this._onTouchMove=$Tt(this),this._onTouchEnd=qTt(this);let o=this._timeBarEle;n.addEventListener("mouseup",this._onMouseUp,!1),n.addEventListener("mousemove",this._onMouseMove,!1),o.addEventListener("mousedown",this._onMouseDown,!1),o.addEventListener("DOMMouseScroll",this._onMouseWheel,!1),o.addEventListener("mousewheel",this._onMouseWheel,!1),o.addEventListener("touchstart",this._onTouchStart,!1),o.addEventListener("touchmove",this._onTouchMove,!1),o.addEventListener("touchend",this._onTouchEnd,!1),o.addEventListener("touchcancel",this._onTouchEnd,!1),this._topDiv.oncontextmenu=function(){return!1},t.onTick.addEventListener(this.updateFromClock,this),this.updateFromClock()}ul.prototype.addEventListener=function(e,t,n){this._topDiv.addEventListener(e,t,n)};ul.prototype.removeEventListener=function(e,t,n){this._topDiv.removeEventListener(e,t,n)};ul.prototype.isDestroyed=function(){return!1};ul.prototype.destroy=function(){this._clock.onTick.removeEventListener(this.updateFromClock,this);let e=this.container.ownerDocument;e.removeEventListener("mouseup",this._onMouseUp,!1),e.removeEventListener("mousemove",this._onMouseMove,!1);let t=this._timeBarEle;t.removeEventListener("mousedown",this._onMouseDown,!1),t.removeEventListener("DOMMouseScroll",this._onMouseWheel,!1),t.removeEventListener("mousewheel",this._onMouseWheel,!1),t.removeEventListener("touchstart",this._onTouchStart,!1),t.removeEventListener("touchmove",this._onTouchMove,!1),t.removeEventListener("touchend",this._onTouchEnd,!1),t.removeEventListener("touchcancel",this._onTouchEnd,!1),this.container.removeChild(this._topDiv),me(this)};ul.prototype.addHighlightRange=function(e,t,n){let i=new oM(e,t,n);return this._highlightRanges.push(i),this.resize(),i};ul.prototype.addTrack=function(e,t,n,i){let o=new rM(e,t,n,i);return this._trackList.push(o),this._lastHeight=void 0,this.resize(),o};ul.prototype.zoomTo=function(e,t){if(this._startJulian=e,this._endJulian=t,this._timeBarSecondsSpan=te.secondsDifference(t,e),this._clock&&this._clock.clockRange!==Cr.UNBOUNDED){let i=this._clock.startTime,o=this._clock.stopTime,r=te.secondsDifference(o,i),s=te.secondsDifference(i,this._startJulian),a=te.secondsDifference(o,this._endJulian);this._timeBarSecondsSpan>=r?(this._timeBarSecondsSpan=r,this._startJulian=this._clock.startTime,this._endJulian=this._clock.stopTime):s>0?(this._endJulian=te.addSeconds(this._endJulian,s,new te),this._startJulian=i,this._timeBarSecondsSpan=te.secondsDifference(this._endJulian,this._startJulian)):a<0&&(this._startJulian=te.addSeconds(this._startJulian,a,new te),this._endJulian=o,this._timeBarSecondsSpan=te.secondsDifference(this._endJulian,this._startJulian))}this._makeTics();let n=document.createEvent("Event");n.initEvent("setzoom",!0,!0),n.startJulian=this._startJulian,n.endJulian=this._endJulian,n.epochJulian=this._epochJulian,n.totalSpan=this._timeBarSecondsSpan,n.mainTicSpan=this._mainTicSpan,this._topDiv.dispatchEvent(n)};ul.prototype.zoomFrom=function(e){let t=te.secondsDifference(this._scrubJulian,this._startJulian);e>1||t<0||t>this._timeBarSecondsSpan?t=this._timeBarSecondsSpan*.5:t+=t-this._timeBarSecondsSpan*.5;let n=this._timeBarSecondsSpan-t;this.zoomTo(te.addSeconds(this._startJulian,t-t*e,new te),te.addSeconds(this._endJulian,n*e-n,new te))};function f6(e){return e<10?`0${e.toString()}`:e.toString()}ul.prototype.makeLabel=function(e){let t=te.toGregorianDate(e),n=t.millisecond,i=" UTC";if(n>0&&this._timeBarSecondsSpan<3600){for(i=Math.floor(n).toString();i.length<3;)i=`0${i}`;i=`.${i}`}return`${HTt[t.month-1]} ${t.day} ${t.year} ${f6(t.hour)}:${f6(t.minute)}:${f6(t.second)}${i}`};ul.prototype.smallestTicInPixels=7;ul.prototype._makeTics=function(){let e=this._timeBarEle,t=te.secondsDifference(this._scrubJulian,this._startJulian),n=Math.round(t*this._topDiv.clientWidth/this._timeBarSecondsSpan),i=n-8,o,r=this;this._needleEle.style.left=`${n.toString()}px`;let s="",a=.01,c=31536e6,d=1e-10,u=0,m=this._timeBarSecondsSpan;m<a?(m=a,this._timeBarSecondsSpan=a,this._endJulian=te.addSeconds(this._startJulian,a,new te)):m>c&&(m=c,this._timeBarSecondsSpan=c,this._endJulian=te.addSeconds(this._startJulian,c,new te));let p=this._timeBarEle.clientWidth;p<10&&(p=10);let g=this._startJulian,f=Math.min(m/p*1e-5,.4),x,_=te.toGregorianDate(g);m>31536e4?x=te.fromDate(new Date(Date.UTC(Math.floor(_.year/100)*100,0))):m>31536e3?x=te.fromDate(new Date(Date.UTC(Math.floor(_.year/10)*10,0))):m>86400?x=te.fromDate(new Date(Date.UTC(_.year,0))):x=te.fromDate(new Date(Date.UTC(_.year,_.month,_.day)));let C=te.secondsDifference(this._startJulian,te.addSeconds(x,f,new te)),V=C+m;this._epochJulian=x;function L(k){return Math.floor(C/k)*k}function Z(k,J){return Math.ceil(k/J+.5)*J}function G(k){return(k-C)/m}function X(k,J){return k-J*Math.round(k/J)}this._rulerEle.innerHTML=this.makeLabel(te.addSeconds(this._endJulian,-a,new te));let v=this._rulerEle.offsetWidth+20;v<30&&(v=180);let P=u;u-=d;let F={startTime:C,startJulian:g,epochJulian:x,duration:m,timeBarWidth:p,getAlpha:G};this._highlightRanges.forEach(function(k){s+=k.render(F)});let A=0,b=0,R=0,E=v/p;E>1&&(E=1),E*=this._timeBarSecondsSpan;let I=-1,w=-1,N=Ay.length,B;for(B=0;B<N;++B){let k=Ay[B];if(++I,A=k,k>E&&k>u)break;w<0&&p*(k/this._timeBarSecondsSpan)>=this.smallestTicInPixels&&(w=I)}if(I>0){for(;I>0;)if(--I,Math.abs(X(A,Ay[I]))<1e-5){Ay[I]>=u&&(b=Ay[I]);break}if(w>=0)for(;w<I;){if(Math.abs(X(b,Ay[w]))<1e-5&&Ay[w]>=u){R=Ay[w];break}++w}}u=P,u>d&&R<1e-5&&Math.abs(u-A)>d&&(R=u,u<=A+d&&(b=0));let U=-999999,O;if(p*(R/this._timeBarSecondsSpan)>=3)for(o=L(R);o<=V;o=Z(o,R))s+=`<span class="cesium-timeline-ticTiny" style="left: ${Math.round(p*G(o)).toString()}px;"></span>`;if(p*(b/this._timeBarSecondsSpan)>=3)for(o=L(b);o<=V;o=Z(o,b))s+=`<span class="cesium-timeline-ticSub" style="left: ${Math.round(p*G(o)).toString()}px;"></span>`;if(p*(A/this._timeBarSecondsSpan)>=2){this._mainTicSpan=A,V+=A,o=L(A);let k=te.computeTaiMinusUtc(x);for(;o<=V;){let J=te.addSeconds(g,o-C,new te);if(A>2.1){let j=te.computeTaiMinusUtc(J);Math.abs(j-k)>.1&&(o+=j-k,J=te.addSeconds(g,o-C,new te))}let H=Math.round(p*G(o)),ee=this.makeLabel(J);this._rulerEle.innerHTML=ee,O=this._rulerEle.offsetWidth,O<10&&(O=v);let z=H-(O/2-1);z>U?(U=z+O+5,s+=`<span class="cesium-timeline-ticMain" style="left: ${H.toString()}px;"></span><span class="cesium-timeline-ticLabel" style="left: ${z.toString()}px;">${ee}</span>`):s+=`<span class="cesium-timeline-ticSub" style="left: ${H.toString()}px;"></span>`,o=Z(o,A)}}else this._mainTicSpan=-1;s+=`<span class="cesium-timeline-icon16" style="left:${i}px;bottom:0;background-position: 0 0;"></span>`,e.innerHTML=s,this._scrubElement=e.lastChild,this._context.clearRect(0,0,this._trackListEle.width,this._trackListEle.height),F.y=0,this._trackList.forEach(function(k){k.render(r._context,F),F.y+=k.height})};ul.prototype.updateFromClock=function(){this._scrubJulian=this._clock.currentTime;let e=this._scrubElement;if(l(this._scrubElement)){let t=te.secondsDifference(this._scrubJulian,this._startJulian),n=Math.round(t*this._topDiv.clientWidth/this._timeBarSecondsSpan);this._lastXPos!==n&&(this._lastXPos=n,e.style.left=`${n-8}px`,this._needleEle.style.left=`${n}px`)}l(this._timelineDragLocation)&&(this._setTimeBarTime(this._timelineDragLocation,this._timelineDragLocation*this._timeBarSecondsSpan/this._topDiv.clientWidth),this.zoomTo(te.addSeconds(this._startJulian,this._timelineDrag,new te),te.addSeconds(this._endJulian,this._timelineDrag,new te)))};ul.prototype._setTimeBarTime=function(e,t){if(e=Math.round(e),this._scrubJulian=te.addSeconds(this._startJulian,t,new te),this._scrubElement){let i=e-8;this._scrubElement.style.left=`${i.toString()}px`,this._needleEle.style.left=`${e.toString()}px`}let n=document.createEvent("Event");n.initEvent("settime",!0,!0),n.clientX=e,n.timeSeconds=t,n.timeJulian=this._scrubJulian,n.clock=this._clock,this._topDiv.dispatchEvent(n)};function zTt(e){return function(t){e._mouseMode!==lm.touchOnly&&(t.button===0?(e._mouseMode=lm.scrub,e._scrubElement&&(e._scrubElement.style.backgroundPosition="-16px 0"),e._onMouseMove(t)):(e._mouseX=t.clientX,t.button===2?e._mouseMode=lm.zoom:e._mouseMode=lm.slide)),t.preventDefault()}}function KTt(e){return function(t){e._mouseMode=lm.none,e._scrubElement&&(e._scrubElement.style.backgroundPosition="0 0"),e._timelineDrag=0,e._timelineDragLocation=void 0}}function JTt(e){return function(t){let n;if(e._mouseMode===lm.scrub){t.preventDefault();let i=t.clientX-e._topDiv.getBoundingClientRect().left;i<0?(e._timelineDragLocation=0,e._timelineDrag=-.01*e._timeBarSecondsSpan):i>e._topDiv.clientWidth?(e._timelineDragLocation=e._topDiv.clientWidth,e._timelineDrag=.01*e._timeBarSecondsSpan):(e._timelineDragLocation=void 0,e._setTimeBarTime(i,i*e._timeBarSecondsSpan/e._topDiv.clientWidth))}else if(e._mouseMode===lm.slide){if(n=e._mouseX-t.clientX,e._mouseX=t.clientX,n!==0){let i=n*e._timeBarSecondsSpan/e._topDiv.clientWidth;e.zoomTo(te.addSeconds(e._startJulian,i,new te),te.addSeconds(e._endJulian,i,new te))}}else e._mouseMode===lm.zoom&&(n=e._mouseX-t.clientX,e._mouseX=t.clientX,n!==0&&e.zoomFrom(Math.pow(1.01,n)))}}function QTt(e){return function(t){let n=t.wheelDeltaY||t.wheelDelta||-t.detail;h6=Math.max(Math.min(Math.abs(n),h6),1),n/=h6,e.zoomFrom(Math.pow(1.05,-n))}}function jTt(e){return function(t){let n=t.touches.length,i,o,r=e._topDiv.getBoundingClientRect().left;t.preventDefault(),e._mouseMode=lm.touchOnly,n===1?(i=te.secondsDifference(e._scrubJulian,e._startJulian),o=Math.round(i*e._topDiv.clientWidth/e._timeBarSecondsSpan+r),Math.abs(t.touches[0].clientX-o)<50?(e._touchMode=dl.scrub,e._scrubElement&&(e._scrubElement.style.backgroundPosition=n===1?"-16px 0":"0 0")):(e._touchMode=dl.singleTap,e._touchState.centerX=t.touches[0].clientX-r)):n===2?(e._touchMode=dl.slideZoom,e._touchState.centerX=(t.touches[0].clientX+t.touches[1].clientX)*.5-r,e._touchState.spanX=Math.abs(t.touches[0].clientX-t.touches[1].clientX)):e._touchMode=dl.ignore}}function qTt(e){return function(t){let n=t.touches.length,i=e._topDiv.getBoundingClientRect().left;e._touchMode===dl.singleTap?(e._touchMode=dl.scrub,e._onTouchMove(t)):e._touchMode===dl.scrub&&e._onTouchMove(t),e._mouseMode=lm.touchOnly,n!==1?e._touchMode=n>0?dl.ignore:dl.none:e._touchMode===dl.slideZoom&&(e._touchState.centerX=t.touches[0].clientX-i),e._scrubElement&&(e._scrubElement.style.backgroundPosition="0 0")}}function $Tt(e){return function(t){let n,i,o,r,s,a,c=1,d=e._topDiv.getBoundingClientRect().left;e._touchMode===dl.singleTap&&(e._touchMode=dl.slideZoom),e._mouseMode=lm.touchOnly,e._touchMode===dl.scrub?(t.preventDefault(),t.changedTouches.length===1&&(i=t.changedTouches[0].clientX-d,i>=0&&i<=e._topDiv.clientWidth&&e._setTimeBarTime(i,i*e._timeBarSecondsSpan/e._topDiv.clientWidth))):e._touchMode===dl.slideZoom&&(o=t.touches.length,o===2?(r=(t.touches[0].clientX+t.touches[1].clientX)*.5-d,s=Math.abs(t.touches[0].clientX-t.touches[1].clientX)):o===1&&(r=t.touches[0].clientX-d,s=0),l(r)&&(s>0&&e._touchState.spanX>0?(c=e._touchState.spanX/s,a=te.addSeconds(e._startJulian,(e._touchState.centerX*e._timeBarSecondsSpan-r*e._timeBarSecondsSpan*c)/e._topDiv.clientWidth,new te)):(n=e._touchState.centerX-r,a=te.addSeconds(e._startJulian,n*e._timeBarSecondsSpan/e._topDiv.clientWidth,new te)),e.zoomTo(a,te.addSeconds(a,e._timeBarSecondsSpan*c,new te)),e._touchState.centerX=r,e._touchState.spanX=s))}}ul.prototype.resize=function(){let e=this.container.clientWidth,t=this.container.clientHeight;if(e===this._lastWidth&&t===this._lastHeight)return;this._trackContainer.style.height=`${t}px`;let n=1;this._trackList.forEach(function(i){n+=i.height}),this._trackListEle.style.height=`${n.toString()}px`,this._trackListEle.width=this._trackListEle.clientWidth,this._trackListEle.height=n,this._makeTics(),this._lastXPos=void 0,this._lastWidth=e,this._lastHeight=t};var sM=ul;var qCo=T(S(),1);var OCo=T(S(),1);var WSe=T(ISe(),1);function nSt(e){let t=!1,n=window.screen;return l(n)&&(l(n.lockOrientation)?t=n.lockOrientation(e):l(n.mozLockOrientation)?t=n.mozLockOrientation(e):l(n.msLockOrientation)?t=n.msLockOrientation(e):l(n.orientation&&n.orientation.lock)&&(t=n.orientation.lock(e))),t}function PSe(){let e=window.screen;l(e)&&(l(e.unlockOrientation)?e.unlockOrientation():l(e.mozUnlockOrientation)?e.mozUnlockOrientation():l(e.msUnlockOrientation)?e.msUnlockOrientation():l(e.orientation&&e.orientation.unlock)&&e.orientation.unlock())}function iSt(e,t,n,i){i()||(n()?(t.useWebVR=!1,e._locked&&(PSe(),e._locked=!1),e._noSleep.disable(),ur.exitFullscreen(),n(!1)):(ur.fullscreen||ur.requestFullscreen(e._vrElement),e._noSleep.enable(),e._locked||(e._locked=nSt("landscape")),t.useWebVR=!0,n(!0)))}function dB(e,t){let n=this,i=Ce.observable(ur.enabled),o=Ce.observable(!1);this.isVRMode=void 0,Ce.defineProperty(this,"isVRMode",{get:function(){return o()}}),this.isVREnabled=void 0,Ce.defineProperty(this,"isVREnabled",{get:function(){return i()},set:function(s){i(s&&ur.enabled)}}),this.tooltip=void 0,Ce.defineProperty(this,"tooltip",function(){return i()?o()?"Exit VR mode":"Enter VR mode":"VR mode is unavailable"});let r=Ce.observable(!1);this._isOrthographic=void 0,Ce.defineProperty(this,"_isOrthographic",{get:function(){return r()}}),this._eventHelper=new Rr,this._eventHelper.add(e.preRender,function(){r(e.camera.frustum instanceof on)}),this._locked=!1,this._noSleep=new WSe.default,this._command=Vn(function(){iSt(n,e,o,r)},Ce.getObservable(this,"isVREnabled")),this._vrElement=y(In(t),document.body),this._callback=function(){!ur.fullscreen&&o()&&(e.useWebVR=!1,n._locked&&(PSe(),n._locked=!1),n._noSleep.disable(),o(!1))},document.addEventListener(ur.changeEventName,this._callback)}Object.defineProperties(dB.prototype,{vrElement:{get:function(){return this._vrElement},set:function(e){this._vrElement=e}},command:{get:function(){return this._command}}});dB.prototype.isDestroyed=function(){return!1};dB.prototype.destroy=function(){this._eventHelper.removeAll(),document.removeEventListener(ur.changeEventName,this._callback),me(this)};var aM=dB;var oSt="M 5.3125 6.375 C 4.008126 6.375 2.96875 7.4141499 2.96875 8.71875 L 2.96875 19.5 C 2.96875 20.8043 4.008126 21.875 5.3125 21.875 L 13.65625 21.875 C 13.71832 20.0547 14.845166 18.59375 16.21875 18.59375 C 17.592088 18.59375 18.71881 20.0552 18.78125 21.875 L 27.09375 21.875 C 28.398125 21.875 29.4375 20.8043 29.4375 19.5 L 29.4375 8.71875 C 29.4375 7.4141499 28.398125 6.375 27.09375 6.375 L 5.3125 6.375 z M 9.625 10.4375 C 11.55989 10.4375 13.125 12.03385 13.125 13.96875 C 13.125 15.90365 11.55989 17.46875 9.625 17.46875 C 7.69011 17.46875 6.125 15.90365 6.125 13.96875 C 6.125 12.03385 7.69011 10.4375 9.625 10.4375 z M 22.46875 10.4375 C 24.40364 10.4375 25.96875 12.03385 25.96875 13.96875 C 25.96875 15.90365 24.40364 17.46875 22.46875 17.46875 C 20.53386 17.46875 18.96875 15.90365 18.96875 13.96875 C 18.96875 12.03385 20.53386 10.4375 22.46875 10.4375 z",rSt="M 25.770585,2.4552065 C 15.72282,13.962707 10.699956,19.704407 8.1768352,22.580207 c -1.261561,1.4379 -1.902282,2.1427 -2.21875,2.5 -0.141624,0.1599 -0.208984,0.2355 -0.25,0.2813 l 0.6875,0.75 c 10e-5,-10e-5 0.679191,0.727 0.6875,0.7187 0.01662,-0.016 0.02451,-0.024 0.03125,-0.031 0.01348,-0.014 0.04013,-0.038 0.0625,-0.062 0.04474,-0.05 0.120921,-0.1315 0.28125,-0.3126 0.320657,-0.3619 0.956139,-1.0921 2.2187499,-2.5312 2.5252219,-2.8781 7.5454589,-8.6169 17.5937499,-20.1250005 l -1.5,-1.3125 z m -20.5624998,3.9063 c -1.304375,0 -2.34375,1.0391 -2.34375,2.3437 l 0,10.8125005 c 0,1.3043 1.039375,2.375 2.34375,2.375 l 2.25,0 c 1.9518039,-2.2246 7.4710958,-8.5584 13.5624998,-15.5312005 l -15.8124998,0 z m 21.1249998,0 c -1.855467,2.1245 -2.114296,2.4005 -3.59375,4.0936995 1.767282,0.1815 3.15625,1.685301 3.15625,3.500001 0,1.9349 -1.56511,3.5 -3.5,3.5 -1.658043,0 -3.043426,-1.1411 -3.40625,-2.6875 -1.089617,1.2461 -2.647139,2.9988 -3.46875,3.9375 0.191501,-0.062 0.388502,-0.094 0.59375,-0.094 1.373338,0 2.50006,1.4614 2.5625,3.2812 l 8.3125,0 c 1.304375,0 2.34375,-1.0707 2.34375,-2.375 l 0,-10.8125005 c 0,-1.3046 -1.039375,-2.3437 -2.34375,-2.3437 l -0.65625,0 z M 9.5518351,10.423906 c 1.9348899,0 3.4999999,1.596401 3.4999999,3.531301 0,1.9349 -1.56511,3.5 -3.4999999,3.5 -1.9348899,0 -3.4999999,-1.5651 -3.4999999,-3.5 0,-1.9349 1.56511,-3.531301 3.4999999,-3.531301 z m 4.2187499,10.312601 c -0.206517,0.2356 -0.844218,0.9428 -1.03125,1.1562 l 0.8125,0 c 0.01392,-0.4081 0.107026,-0.7968 0.21875,-1.1562 z";function uB(e,t,n){e=In(e);let i=new aM(t,n);i._exitVRPath=rSt,i._enterVRPath=oSt;let o=document.createElement("button");o.type="button",o.className="cesium-button cesium-vrButton",o.setAttribute("data-bind",'css: { "cesium-button-disabled" : _isOrthographic }, attr: { title: tooltip },click: command,enable: isVREnabled,cesiumSvgPath: { path: isVRMode ? _exitVRPath : _enterVRPath, width: 32, height: 32 }'),e.appendChild(o),Ce.applyBindings(i,o),this._container=e,this._viewModel=i,this._element=o}Object.defineProperties(uB.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});uB.prototype.isDestroyed=function(){return!1};uB.prototype.destroy=function(){return this._viewModel.destroy(),Ce.cleanNode(this._element),this._container.removeChild(this._element),me(this)};var cM=uB;var _1o=T(S(),1);var My=new le;function FSe(e){let t=e.clock;t.currentTime=e.timeJulian,t.shouldAnimate=!1}function sSt(e){let t=e.getPropertyIds(),n="";return t.forEach(function(i){let o=e.getProperty(i);l(o)&&(n+=`<tr><th>${i}</th><td>${o}</td></tr>`)}),n.length>0&&(n=`<table class="cesium-infoBox-defaultTable"><tbody>${n}</tbody></table>`),n}function aSt(e){let t,n=[],i=e.getPropertyIds();for(t=0;t<i.length;t++){let r=i[t];/^name$/i.test(r)?n[0]=e.getProperty(r):/name/i.test(r)?n[1]=e.getProperty(r):/^title$/i.test(r)?n[2]=e.getProperty(r):/^(id|identifier)$/i.test(r)?n[3]=e.getProperty(r):/element/i.test(r)?n[4]=e.getProperty(r):/(id|identifier)$/i.test(r)&&(n[5]=e.getProperty(r))}let o=n.length;for(t=0;t<o;t++){let r=n[t];if(l(r)&&r!=="")return r}return"Unnamed Feature"}function vSe(e,t){let n=e.scene.pick(t.position);if(l(n)){let i=y(n.id,n.primitive.id);if(i instanceof Jo)return i;if(n instanceof vs)return new Jo({name:aSt(n),description:sSt(n),feature:n})}if(l(e.scene.globe))return dSt(e,t.position)}var cSt=new te;function ASe(e,t,n){if(l(n)){let i=n.clock;if(l(i)&&(i.getValue(t),l(e))){let o=i.startTime,r=i.stopTime;te.equals(o,r)&&(r=te.addSeconds(o,W.EPSILON2,cSt)),e.updateFromClock(),e.zoomTo(o,r)}}}var lSt=new h;function dSt(e,t){let n=e.scene,i=n.camera.getPickRay(t),o=n.imageryLayers.pickImageryLayerFeatures(i,n);if(!l(o))return;let r=new Jo({id:"Loading...",description:"Loading feature information..."});return o.then(function(s){if(e.selectedEntity!==r)return;if(!l(s)||s.length===0){e.selectedEntity=wSe();return}let a=s[0],c=new Jo({id:a.name,description:a.description});if(l(a.position)){let d=e.scene.globe.ellipsoid.cartographicToCartesian(a.position,lSt);c.position=new Oc(d)}e.selectedEntity=c},function(){e.selectedEntity===r&&(e.selectedEntity=wSe())}),r}function wSe(){return new Jo({id:"None",description:"No features found."})}function uSt(e,t){let n=e._geocoder,i=e._homeButton,o=e._sceneModePicker,r=e._projectionPicker,s=e._baseLayerPicker,a=e._animation,c=e._timeline,d=e._fullscreenButton,u=e._infoBox,m=e._selectionIndicator,p=t?"hidden":"visible";if(l(n)&&(n.container.style.visibility=p),l(i)&&(i.container.style.visibility=p),l(o)&&(o.container.style.visibility=p),l(r)&&(r.container.style.visibility=p),l(s)&&(s.container.style.visibility=p),l(a)&&(a.container.style.visibility=p),l(c)&&(c.container.style.visibility=p),l(d)&&d.viewModel.isFullscreenEnabled&&(d.container.style.visibility=p),l(u)&&(u.container.style.visibility=p),l(m)&&(m.container.style.visibility=p),e._container){let g=t||!l(d)?0:d.container.clientWidth;e._vrButton.container.style.right=`${g}px`,e.forceResize()}}function Ii(e,t){e=In(e),t=y(t,y.EMPTY_OBJECT);let n=(!l(t.globe)||t.globe!==!1)&&(!l(t.baseLayerPicker)||t.baseLayerPicker!==!1),i=this,o=document.createElement("div");o.className="cesium-viewer",e.appendChild(o);let r=document.createElement("div");r.className="cesium-viewer-cesiumWidgetContainer",o.appendChild(r);let s=document.createElement("div");s.className="cesium-viewer-bottom",o.appendChild(s);let a=y(t.scene3DOnly,!1),c,d,u=!1;l(t.clockViewModel)?(d=t.clockViewModel,c=d.clock):(c=new Sm,d=new TA(c),u=!0),l(t.shouldAnimate)&&(c.shouldAnimate=t.shouldAnimate);let m=new B9(r,{baseLayer:n||l(t.baseLayer)||l(t.imageryProvider)?!1:void 0,clock:c,skyBox:t.skyBox,skyAtmosphere:t.skyAtmosphere,sceneMode:t.sceneMode,mapProjection:t.mapProjection,globe:t.globe,orderIndependentTranslucency:t.orderIndependentTranslucency,contextOptions:t.contextOptions,useDefaultRenderLoop:t.useDefaultRenderLoop,targetFrameRate:t.targetFrameRate,showRenderLoopErrors:t.showRenderLoopErrors,useBrowserRecommendedResolution:t.useBrowserRecommendedResolution,creditContainer:l(t.creditContainer)?t.creditContainer:s,creditViewport:t.creditViewport,scene3DOnly:a,shadows:t.shadows,terrainShadows:t.terrainShadows,mapMode2D:t.mapMode2D,blurActiveElementOnCanvasFocus:t.blurActiveElementOnCanvasFocus,requestRenderMode:t.requestRenderMode,maximumRenderTimeChange:t.maximumRenderTimeChange,depthPlaneEllipsoidOffset:t.depthPlaneEllipsoidOffset,msaaSamples:t.msaaSamples}),p=t.dataSources,g=!1;l(p)||(p=new qP,g=!0);let f=m.scene,x=new _v({scene:f,dataSourceCollection:p}),_=new Rr;_.add(c.onTick,Ii.prototype._onTick,this),_.add(f.morphStart,Ii.prototype._clearTrackedObject,this);let C;if(!l(t.selectionIndicator)||t.selectionIndicator!==!1){let H=document.createElement("div");H.className="cesium-viewer-selectionIndicatorContainer",o.appendChild(H),C=new iM(H,f)}let V;if(!l(t.infoBox)||t.infoBox!==!1){let H=document.createElement("div");H.className="cesium-viewer-infoBoxContainer",o.appendChild(H),V=new HA(H);let ee=V.viewModel;_.add(ee.cameraClicked,Ii.prototype._onInfoBoxCameraClicked,this),_.add(ee.closeClicked,Ii.prototype._onInfoBoxClockClicked,this)}let L=document.createElement("div");L.className="cesium-viewer-toolbar",o.appendChild(L);let Z;if(!l(t.geocoder)||t.geocoder!==!1){let H=document.createElement("div");H.className="cesium-viewer-geocoderContainer",L.appendChild(H);let ee;l(t.geocoder)&&typeof t.geocoder!="boolean"&&(ee=Array.isArray(t.geocoder)?t.geocoder:[t.geocoder]),Z=new UA({container:H,geocoderServices:ee,scene:f}),_.add(Z.viewModel.search.beforeExecute,Ii.prototype._clearObjects,this)}let G;(!l(t.homeButton)||t.homeButton!==!1)&&(G=new BA(L,f),l(Z)&&_.add(G.viewModel.command.afterExecute,function(){let H=Z.viewModel;H.searchText="",H.isSearchInProgress&&H.search()}),_.add(G.viewModel.command.beforeExecute,Ii.prototype._clearTrackedObject,this));let X;!a&&(!l(t.sceneModePicker)||t.sceneModePicker!==!1)&&(X=new eM(L,f));let v;t.projectionPicker&&(v=new qA(L,f));let P,F;if(n){let H=y(t.imageryProviderViewModels,EA()),ee=y(t.terrainProviderViewModels,XA());P=new GA(L,{globe:f.globe,imageryProviderViewModels:H,selectedImageryProviderViewModel:t.selectedImageryProviderViewModel,terrainProviderViewModels:ee,selectedTerrainProviderViewModel:t.selectedTerrainProviderViewModel}),F=L.getElementsByClassName("cesium-baseLayerPicker-dropDown")[0]}l(t.baseLayer)&&t.baseLayer!==!1&&(n&&(P.viewModel.selectedImagery=void 0),f.imageryLayers.removeAll(),f.imageryLayers.add(t.baseLayer)),l(t.terrainProvider)&&(n&&(P.viewModel.selectedTerrain=void 0),f.terrainProvider=t.terrainProvider),l(t.terrain)&&(n&&(P.viewModel.selectedTerrain=void 0,f.globe.depthTestAgainstTerrain=!0),f.setTerrain(t.terrain));let A;if(!l(t.navigationHelpButton)||t.navigationHelpButton!==!1){let H=!0;try{if(l(window.localStorage)){let ee=window.localStorage.getItem("cesium-hasSeenNavHelp");l(ee)&&ee?H=!1:window.localStorage.setItem("cesium-hasSeenNavHelp","true")}}catch{}A=new KA({container:L,instructionsInitiallyVisible:y(t.navigationInstructionsInitiallyVisible,H)})}let b;if(!l(t.animation)||t.animation!==!1){let H=document.createElement("div");H.className="cesium-viewer-animationContainer",o.appendChild(H),b=new LA(H,new RA(d))}let R;if(!l(t.timeline)||t.timeline!==!1){let H=document.createElement("div");H.className="cesium-viewer-timelineContainer",o.appendChild(H),R=new sM(H,c),R.addEventListener("settime",FSe,!1),R.zoomTo(c.startTime,c.stopTime)}let E,I,w;(!l(t.fullscreenButton)||t.fullscreenButton!==!1)&&(w=document.createElement("div"),w.className="cesium-viewer-fullscreenContainer",o.appendChild(w),E=new NA(w,t.fullscreenElement),I=ba(E.viewModel,"isFullscreenEnabled",function(H){w.style.display=H?"block":"none",l(R)&&(R.container.style.right=`${w.clientWidth}px`,R.resize())}));let N,B,U;if(t.vrButton){let H=document.createElement("div");H.className="cesium-viewer-vrContainer",o.appendChild(H),N=new cM(H,f,t.fullScreenElement),B=ba(N.viewModel,"isVREnabled",function(ee){H.style.display=ee?"block":"none",l(E)&&(H.style.right=`${w.clientWidth}px`),l(R)&&(R.container.style.right=`${H.clientWidth}px`,R.resize())}),U=ba(N.viewModel,"isVRMode",function(ee){uSt(i,ee)})}this._baseLayerPickerDropDown=F,this._fullscreenSubscription=I,this._vrSubscription=B,this._vrModeSubscription=U,this._dataSourceChangedListeners={},this._automaticallyTrackDataSourceClocks=y(t.automaticallyTrackDataSourceClocks,!0),this._container=e,this._bottomContainer=s,this._element=o,this._cesiumWidget=m,this._selectionIndicator=C,this._infoBox=V,this._dataSourceCollection=p,this._destroyDataSourceCollection=g,this._dataSourceDisplay=x,this._clockViewModel=d,this._destroyClockViewModel=u,this._toolbar=L,this._homeButton=G,this._sceneModePicker=X,this._projectionPicker=v,this._baseLayerPicker=P,this._navigationHelpButton=A,this._animation=b,this._timeline=R,this._fullscreenButton=E,this._vrButton=N,this._geocoder=Z,this._eventHelper=_,this._lastWidth=0,this._lastHeight=0,this._allowDataSourcesToSuspendAnimation=!0,this._entityView=void 0,this._enableInfoOrSelection=l(V)||l(C),this._clockTrackedDataSource=void 0,this._trackedEntity=void 0,this._needTrackedEntityUpdate=!1,this._selectedEntity=void 0,this._zoomIsFlight=!1,this._zoomTarget=void 0,this._zoomPromise=void 0,this._zoomOptions=void 0,this._selectedEntityChanged=new ge,this._trackedEntityChanged=new ge,Ce.track(this,["_trackedEntity","_selectedEntity","_clockTrackedDataSource"]),_.add(p.dataSourceAdded,Ii.prototype._onDataSourceAdded,this),_.add(p.dataSourceRemoved,Ii.prototype._onDataSourceRemoved,this),_.add(f.postUpdate,Ii.prototype.resize,this),_.add(f.postRender,Ii.prototype._postRender,this);let O=p.length;for(let H=0;H<O;H++)this._dataSourceAdded(p,p.get(H));this._dataSourceAdded(void 0,x.defaultDataSource),_.add(p.dataSourceAdded,Ii.prototype._dataSourceAdded,this),_.add(p.dataSourceRemoved,Ii.prototype._dataSourceRemoved,this);function k(H){let ee=vSe(i,H);l(ee)?K.getValueOrUndefined(ee.position,i.clock.currentTime)?i.trackedEntity=ee:i.zoomTo(ee):l(i.trackedEntity)&&(i.trackedEntity=void 0)}function J(H){i.selectedEntity=vSe(i,H)}m.screenSpaceEventHandler.setInputAction(J,yn.LEFT_CLICK),m.screenSpaceEventHandler.setInputAction(k,yn.LEFT_DOUBLE_CLICK)}Object.defineProperties(Ii.prototype,{container:{get:function(){return this._container}},creditDisplay:{get:function(){return this._cesiumWidget.creditDisplay}},bottomContainer:{get:function(){return this._bottomContainer}},cesiumWidget:{get:function(){return this._cesiumWidget}},selectionIndicator:{get:function(){return this._selectionIndicator}},infoBox:{get:function(){return this._infoBox}},geocoder:{get:function(){return this._geocoder}},homeButton:{get:function(){return this._homeButton}},sceneModePicker:{get:function(){return this._sceneModePicker}},projectionPicker:{get:function(){return this._projectionPicker}},baseLayerPicker:{get:function(){return this._baseLayerPicker}},navigationHelpButton:{get:function(){return this._navigationHelpButton}},animation:{get:function(){return this._animation}},timeline:{get:function(){return this._timeline}},fullscreenButton:{get:function(){return this._fullscreenButton}},vrButton:{get:function(){return this._vrButton}},dataSourceDisplay:{get:function(){return this._dataSourceDisplay}},entities:{get:function(){return this._dataSourceDisplay.defaultDataSource.entities}},dataSources:{get:function(){return this._dataSourceCollection}},canvas:{get:function(){return this._cesiumWidget.canvas}},scene:{get:function(){return this._cesiumWidget.scene}},shadows:{get:function(){return this.scene.shadowMap.enabled},set:function(e){this.scene.shadowMap.enabled=e}},terrainShadows:{get:function(){return this.scene.globe.shadows},set:function(e){this.scene.globe.shadows=e}},shadowMap:{get:function(){return this.scene.shadowMap}},imageryLayers:{get:function(){return this.scene.imageryLayers}},terrainProvider:{get:function(){return this.scene.terrainProvider},set:function(e){this.scene.terrainProvider=e}},camera:{get:function(){return this.scene.camera}},postProcessStages:{get:function(){return this.scene.postProcessStages}},clock:{get:function(){return this._clockViewModel.clock}},clockViewModel:{get:function(){return this._clockViewModel}},screenSpaceEventHandler:{get:function(){return this._cesiumWidget.screenSpaceEventHandler}},targetFrameRate:{get:function(){return this._cesiumWidget.targetFrameRate},set:function(e){this._cesiumWidget.targetFrameRate=e}},useDefaultRenderLoop:{get:function(){return this._cesiumWidget.useDefaultRenderLoop},set:function(e){this._cesiumWidget.useDefaultRenderLoop=e}},resolutionScale:{get:function(){return this._cesiumWidget.resolutionScale},set:function(e){this._cesiumWidget.resolutionScale=e}},useBrowserRecommendedResolution:{get:function(){return this._cesiumWidget.useBrowserRecommendedResolution},set:function(e){this._cesiumWidget.useBrowserRecommendedResolution=e}},allowDataSourcesToSuspendAnimation:{get:function(){return this._allowDataSourcesToSuspendAnimation},set:function(e){this._allowDataSourcesToSuspendAnimation=e}},trackedEntity:{get:function(){return this._trackedEntity},set:function(e){if(this._trackedEntity!==e){this._trackedEntity=e,y6(this);let t=this.scene,n=t.mode;!l(e)||!l(e.position)?(this._needTrackedEntityUpdate=!1,(n===oe.COLUMBUS_VIEW||n===oe.SCENE2D)&&(t.screenSpaceCameraController.enableTranslate=!0),(n===oe.COLUMBUS_VIEW||n===oe.SCENE3D)&&(t.screenSpaceCameraController.enableTilt=!0),this._entityView=void 0,this.camera.lookAtTransform(M.IDENTITY)):this._needTrackedEntityUpdate=!0,this._trackedEntityChanged.raiseEvent(e),this.scene.requestRender()}}},selectedEntity:{get:function(){return this._selectedEntity},set:function(e){if(this._selectedEntity!==e){this._selectedEntity=e;let t=l(this._selectionIndicator)?this._selectionIndicator.viewModel:void 0;l(e)?l(t)&&t.animateAppear():l(t)&&t.animateDepart(),this._selectedEntityChanged.raiseEvent(e)}}},selectedEntityChanged:{get:function(){return this._selectedEntityChanged}},trackedEntityChanged:{get:function(){return this._trackedEntityChanged}},clockTrackedDataSource:{get:function(){return this._clockTrackedDataSource},set:function(e){this._clockTrackedDataSource!==e&&(this._clockTrackedDataSource=e,ASe(this._timeline,this.clock,e))}}});Ii.prototype.extend=function(e,t){e(this,t)};Ii.prototype.resize=function(){let e=this._cesiumWidget,t=this._container,n=t.clientWidth,i=t.clientHeight,o=l(this._animation),r=l(this._timeline);if(e.resize(),n===this._lastWidth&&i===this._lastHeight)return;let s=i-125,a=this._baseLayerPickerDropDown;if(l(a)&&(a.style.maxHeight=`${s}px`),l(this._geocoder)){let g=this._geocoder.searchSuggestionsContainer;g.style.maxHeight=`${s}px`}l(this._infoBox)&&(this._infoBox.viewModel.maxHeight=s);let c=this._timeline,d,u=0,m=0,p=0;if(o&&window.getComputedStyle(this._animation.container).visibility!=="hidden"){let g=this._lastWidth;d=this._animation.container,n>900?(u=169,g<=900&&(d.style.width="169px",d.style.height="112px",this._animation.resize())):n>=600?(u=136,(g<600||g>900)&&(d.style.width="136px",d.style.height="90px",this._animation.resize())):(u=106,(g>600||g===0)&&(d.style.width="106px",d.style.height="70px",this._animation.resize())),m=u+5}if(r&&window.getComputedStyle(this._timeline.container).visibility!=="hidden"){let g=this._fullscreenButton,f=this._vrButton,x=c.container,_=x.style;p=x.clientHeight+3,_.left=`${u}px`;let C=0;l(g)&&(C+=g.container.clientWidth),l(f)&&(C+=f.container.clientWidth),_.right=`${C}px`,c.resize()}this._bottomContainer.style.left=`${m}px`,this._bottomContainer.style.bottom=`${p}px`,this._lastWidth=n,this._lastHeight=i};Ii.prototype.forceResize=function(){this._lastWidth=0,this.resize()};Ii.prototype.render=function(){this._cesiumWidget.render()};Ii.prototype.isDestroyed=function(){return!1};Ii.prototype.destroy=function(){let e;l(this.screenSpaceEventHandler)&&!this.screenSpaceEventHandler.isDestroyed()&&(this.screenSpaceEventHandler.removeInputAction(yn.LEFT_CLICK),this.screenSpaceEventHandler.removeInputAction(yn.LEFT_DOUBLE_CLICK));let t=this.dataSources,n=t.length;for(e=0;e<n;e++)this._dataSourceRemoved(t,t.get(e));return this._dataSourceRemoved(void 0,this._dataSourceDisplay.defaultDataSource),this._container.removeChild(this._element),this._element.removeChild(this._toolbar),this._eventHelper.removeAll(),l(this._geocoder)&&(this._geocoder=this._geocoder.destroy()),l(this._homeButton)&&(this._homeButton=this._homeButton.destroy()),l(this._sceneModePicker)&&(this._sceneModePicker=this._sceneModePicker.destroy()),l(this._projectionPicker)&&(this._projectionPicker=this._projectionPicker.destroy()),l(this._baseLayerPicker)&&(this._baseLayerPicker=this._baseLayerPicker.destroy()),l(this._animation)&&(this._element.removeChild(this._animation.container),this._animation=this._animation.destroy()),l(this._timeline)&&(this._timeline.removeEventListener("settime",FSe,!1),this._element.removeChild(this._timeline.container),this._timeline=this._timeline.destroy()),l(this._fullscreenButton)&&(this._fullscreenSubscription.dispose(),this._element.removeChild(this._fullscreenButton.container),this._fullscreenButton=this._fullscreenButton.destroy()),l(this._vrButton)&&(this._vrSubscription.dispose(),this._vrModeSubscription.dispose(),this._element.removeChild(this._vrButton.container),this._vrButton=this._vrButton.destroy()),l(this._infoBox)&&(this._element.removeChild(this._infoBox.container),this._infoBox=this._infoBox.destroy()),l(this._selectionIndicator)&&(this._element.removeChild(this._selectionIndicator.container),this._selectionIndicator=this._selectionIndicator.destroy()),this._destroyClockViewModel&&(this._clockViewModel=this._clockViewModel.destroy()),this._dataSourceDisplay=this._dataSourceDisplay.destroy(),this._cesiumWidget=this._cesiumWidget.destroy(),this._destroyDataSourceCollection&&(this._dataSourceCollection=this._dataSourceCollection.destroy()),me(this)};Ii.prototype._dataSourceAdded=function(e,t){t.entities.collectionChanged.addEventListener(Ii.prototype._onEntityCollectionChanged,this)};Ii.prototype._dataSourceRemoved=function(e,t){let n=t.entities;n.collectionChanged.removeEventListener(Ii.prototype._onEntityCollectionChanged,this),l(this.trackedEntity)&&n.getById(this.trackedEntity.id)===this.trackedEntity&&(this.trackedEntity=void 0),l(this.selectedEntity)&&n.getById(this.selectedEntity.id)===this.selectedEntity&&(this.selectedEntity=void 0)};Ii.prototype._onTick=function(e){let t=e.currentTime,n=this._dataSourceDisplay.update(t);this._allowDataSourcesToSuspendAnimation&&(this._clockViewModel.canAnimate=n);let i=this._entityView;if(l(i)){let u=this._trackedEntity;this._dataSourceDisplay.getBoundingSphere(u,!1,My)===mt.DONE&&i.update(t,My)}let o,r=!1,s=this.selectedEntity,a=l(s)&&this._enableInfoOrSelection;a&&s.isShowing&&s.isAvailable(t)&&(this._dataSourceDisplay.getBoundingSphere(s,!0,My)!==mt.FAILED?o=My.center:l(s.position)&&(o=s.position.getValue(t,o)),r=l(o));let c=l(this._selectionIndicator)?this._selectionIndicator.viewModel:void 0;l(c)&&(c.position=h.clone(o,c.position),c.showSelection=a&&r,c.update());let d=l(this._infoBox)?this._infoBox.viewModel:void 0;l(d)&&(d.showInfo=a,d.enableCamera=r,d.isCameraTracking=this.trackedEntity===this.selectedEntity,a?(d.titleText=y(s.name,s.id),d.description=K.getValueOrDefault(s.description,t,"")):(d.titleText="",d.description=""))};Ii.prototype._onEntityCollectionChanged=function(e,t,n){let i=n.length;for(let o=0;o<i;o++){let r=n[o];this.trackedEntity===r&&(this.trackedEntity=void 0),this.selectedEntity===r&&(this.selectedEntity=void 0)}};Ii.prototype._onInfoBoxCameraClicked=function(e){if(e.isCameraTracking&&this.trackedEntity===this.selectedEntity)this.trackedEntity=void 0;else{let n=this.selectedEntity.position;l(n)?this.trackedEntity=this.selectedEntity:this.zoomTo(this.selectedEntity)}};Ii.prototype._clearTrackedObject=function(){this.trackedEntity=void 0};Ii.prototype._onInfoBoxClockClicked=function(e){this.selectedEntity=void 0};Ii.prototype._clearObjects=function(){this.trackedEntity=void 0,this.selectedEntity=void 0};Ii.prototype._onDataSourceChanged=function(e){this.clockTrackedDataSource===e&&ASe(this.timeline,this.clock,e)};Ii.prototype._onDataSourceAdded=function(e,t){this._automaticallyTrackDataSourceClocks&&(this.clockTrackedDataSource=t);let n=t.entities.id,i=this._eventHelper.add(t.changedEvent,Ii.prototype._onDataSourceChanged,this);this._dataSourceChangedListeners[n]=i};Ii.prototype._onDataSourceRemoved=function(e,t){let n=this.clockTrackedDataSource===t,i=t.entities.id;if(this._dataSourceChangedListeners[i](),this._dataSourceChangedListeners[i]=void 0,n){let o=e.length;this._automaticallyTrackDataSourceClocks&&o>0?this.clockTrackedDataSource=e.get(o-1):this.clockTrackedDataSource=void 0}};Ii.prototype.zoomTo=function(e,t){return MSe(this,e,{offset:t},!1)};Ii.prototype.flyTo=function(e,t){return MSe(this,e,t,!0)};function MSe(e,t,n,i){y6(e);let o=new Promise(r=>{e._completeZoom=function(s){r(s)}});return e._zoomPromise=o,e._zoomIsFlight=i,e._zoomOptions=n,Promise.resolve(t).then(function(r){if(e._zoomPromise===o){if(r instanceof ma){let s;l(r.imageryProvider)?s=Promise.resolve(r.getImageryRectangle()):s=new Promise(a=>{let c=r.readyEvent.addEventListener(()=>{c(),a(r.getImageryRectangle())})}),s.then(function(a){return hS(a,e.scene)}).then(function(a){e._zoomPromise===o&&(e._zoomTarget=a)});return}if(r instanceof sa||r instanceof CL||r instanceof Iy){e._zoomTarget=r;return}if(r.isLoading&&l(r.loadingEvent)){let s=r.loadingEvent.addEventListener(function(){s(),e._zoomPromise===o&&(e._zoomTarget=r.entities.values.slice(0))});return}if(Array.isArray(r)){e._zoomTarget=r.slice(0);return}r=y(r.values,r),l(r.entities)&&(r=r.entities.values),Array.isArray(r)?e._zoomTarget=r.slice(0):e._zoomTarget=[r]}}),e.scene.requestRender(),o}function lM(e){e._zoomPromise=void 0,e._zoomTarget=void 0,e._zoomOptions=void 0}function y6(e){let t=e._zoomPromise;l(t)&&(lM(e),e._completeZoom(!1))}Ii.prototype._postRender=function(){mSt(this),hSt(this)};function mSt(e){let t=e._zoomTarget;if(!l(t)||e.scene.mode===oe.MORPHING)return;let n=e.scene,i=n.camera,o=y(e._zoomOptions,{}),r;function s(u){l(o.offset)||(o.offset=new fu(0,-.5,u.radius)),r={offset:o.offset,duration:o.duration,maximumHeight:o.maximumHeight,complete:function(){e._completeZoom(!0)},cancel:function(){e._completeZoom(!1)}},e._zoomIsFlight?i.flyToBoundingSphere(t.boundingSphere,r):(i.viewBoundingSphere(u,o.offset),i.lookAtTransform(M.IDENTITY),e._completeZoom(!0)),lM(e)}if(t instanceof CL){if(l(t.boundingSphere)){s(t.boundingSphere);return}let u=t.frameChanged.addEventListener(function(m){s(m.boundingSphere),u()});return}if(t instanceof sa||t instanceof Iy){s(t.boundingSphere);return}if(t instanceof he){r={destination:n.mapProjection.ellipsoid.cartographicToCartesian(t),duration:o.duration,maximumHeight:o.maximumHeight,complete:function(){e._completeZoom(!0)},cancel:function(){e._completeZoom(!1)}},e._zoomIsFlight?i.flyTo(r):(i.setView(r),e._completeZoom(!0)),lM(e);return}let a=t,c=[];for(let u=0,m=a.length;u<m;u++){let p=e._dataSourceDisplay.getBoundingSphere(a[u],!1,My);if(p===mt.PENDING)return;p!==mt.FAILED&&c.push(le.clone(My))}if(c.length===0){y6(e);return}e.trackedEntity=void 0;let d=le.fromBoundingSpheres(c);e._zoomIsFlight?(lM(e),i.flyToBoundingSphere(d,{duration:o.duration,maximumHeight:o.maximumHeight,complete:function(){e._completeZoom(!0)},cancel:function(){e._completeZoom(!1)},offset:o.offset})):(i.viewBoundingSphere(d,o.offset),i.lookAtTransform(M.IDENTITY),lM(e),e._completeZoom(!0))}function hSt(e){if(!e._needTrackedEntityUpdate)return;let t=e._trackedEntity,n=e.clock.currentTime,i=K.getValueOrUndefined(t.position,n);if(!l(i))return;let o=e.scene,r=e._dataSourceDisplay.getBoundingSphere(t,!1,My);if(r===mt.PENDING)return;let s=o.mode;(s===oe.COLUMBUS_VIEW||s===oe.SCENE2D)&&(o.screenSpaceCameraController.enableTranslate=!1),(s===oe.COLUMBUS_VIEW||s===oe.SCENE3D)&&(o.screenSpaceCameraController.enableTilt=!1);let a=r!==mt.FAILED?My:void 0;e._entityView=new Sv(t,o,o.mapProjection.ellipsoid),e._entityView.update(n,a),e._needTrackedEntityUpdate=!1}var x6=Ii;var C1o=T(S(),1);function fSt(e){let t=document.createElement("div");t.className="cesium-viewer-cesium3DTilesInspectorContainer",e.container.appendChild(t);let n=new AA(t,e.scene);Object.defineProperties(e,{cesium3DTilesInspector:{get:function(){return n}}})}var _6=fSt;var R1o=T(S(),1);function pSt(e){let t=document.createElement("div");t.className="cesium-viewer-cesiumInspectorContainer",e.container.appendChild(t);let n=new PA(t,e.scene);Object.defineProperties(e,{cesiumInspector:{get:function(){return n}}})}var T6=pSt;var X1o=T(S(),1);function bSt(e,t){t=y(t,y.EMPTY_OBJECT);let n=!0,i=y(t.flyToOnDrop,!0),o=new ge,r=y(t.clearOnDrop,!0),s=y(t.dropTarget,e.container),a=y(t.clampToGround,!0),c=t.proxy;s=In(s),Object.defineProperties(e,{dropTarget:{get:function(){return s},set:function(u){NSe(s,d),s=u,S6(s,d)}},dropEnabled:{get:function(){return n},set:function(u){u!==n&&(u?S6(s,d):NSe(s,d),n=u)}},dropError:{get:function(){return o}},clearOnDrop:{get:function(){return r},set:function(u){r=u}},flyToOnDrop:{get:function(){return i},set:function(u){i=u}},proxy:{get:function(){return c},set:function(u){c=u}},clampToGround:{get:function(){return a},set:function(u){a=u}}});function d(u){gS(u),r&&(e.entities.removeAll(),e.dataSources.removeAll());let m=u.dataTransfer.files,p=m.length;for(let g=0;g<p;g++){let f=m[g],x=new FileReader;x.onload=gSt(e,f,c,a),x.onerror=ySt(e,f),x.readAsText(f)}}S6(s,d),e.destroy=TZ(e,e.destroy,function(){e.dropEnabled=!1}),e._handleDrop=d}function gS(e){e.stopPropagation(),e.preventDefault()}function NSe(e,t){let n=e;l(n)&&(n.removeEventListener("drop",t,!1),n.removeEventListener("dragenter",gS,!1),n.removeEventListener("dragover",gS,!1),n.removeEventListener("dragexit",gS,!1))}function S6(e,t){e.addEventListener("drop",t,!1),e.addEventListener("dragenter",gS,!1),e.addEventListener("dragover",gS,!1),e.addEventListener("dragexit",gS,!1)}function gSt(e,t,n,i){let o=e.scene;return function(r){let s=t.name;try{let a;if(/\.czml$/i.test(s))a=jP.load(JSON.parse(r.target.result),{sourceUri:s});else if(/\.geojson$/i.test(s)||/\.json$/i.test(s)||/\.topojson$/i.test(s))a=Cv.load(JSON.parse(r.target.result),{sourceUri:s,clampToGround:i});else if(/\.(kml|kmz)$/i.test(s))a=$v.load(t,{sourceUri:s,proxy:n,camera:o.camera,canvas:o.canvas,clampToGround:i,screenOverlayContainer:e.container});else if(/\.gpx$/i.test(s))a=Zv.load(t,{sourceUri:s,proxy:n});else{e.dropError.raiseEvent(e,s,`Unrecognized file: ${s}`);return}l(a)&&e.dataSources.add(a).then(function(c){e.flyToOnDrop&&e.flyTo(c)}).catch(function(c){e.dropError.raiseEvent(e,s,c)})}catch(a){e.dropError.raiseEvent(e,s,a)}}}function ySt(e,t){return function(n){e.dropError.raiseEvent(e,t.name,n.target.error)}}var C6=bSt;var F1o=T(S(),1);function xSt(e,t){t=y(t,y.EMPTY_OBJECT);let n=new QA({scene:e.scene,container:e.bottomContainer,lowFrameRateMessage:t.lowFrameRateMessage});Object.defineProperties(e,{performanceWatchdog:{get:function(){return n}}})}var V6=xSt;var j1o=T(S(),1);var K1o=T(S(),1);var U1o=T(S(),1);function kSe(e){let t=e.split(` `),n;for(n=0;n<t.length&&!t[n].match(/\S/);n++);if(n===t.length)return"";let i="",o=/^\s*/,s=t[n].match(o)[0].length;for(let a=n;a<t.length;a++){let c=t[a];c.match(o)[0].length>=s&&(c=c.slice(s)),i+=`${c} `}return i}function dm(e){this._scene=e,this._voxelPrimitive=void 0,this._customShaderCompilationRemoveCallback=void 0,this._definedProperties=[],this._getPrimitiveFunctions=[],this._modelMatrixReady=!1;let t=this;function n(o){let{name:r,initialValue:s}=o;t._definedProperties.push(r);let a=o.setPrimitiveFunction;a===!0&&(a=function(u){t._voxelPrimitive[r]=u});let c=o.getPrimitiveFunction;c===!0&&(c=function(){t[r]=t._voxelPrimitive[r]}),l(c)&&t._getPrimitiveFunctions.push(c);let d=Ce.observable();return Ce.defineProperty(t,r,{get:function(){return d()},set:function(u){typeof s=="number"&&typeof u=="string"&&(u=Number(u),isNaN(u)&&(u=s)),typeof s=="boolean"&&typeof u=="number"&&(u=u===1),d(u),l(a)&&l(t._voxelPrimitive)&&(a(u),e.requestRender())}}),t[r]=s,d}function i(o,r){return function(s){let a=t._voxelPrimitive[o].clone();a[r]=s,t._voxelPrimitive[o]=a}}n({name:"inspectorVisible",initialValue:!0}),n({name:"displayVisible",initialValue:!1}),n({name:"transformVisible",initialValue:!1}),n({name:"boundsVisible",initialValue:!1}),n({name:"clippingVisible",initialValue:!1}),n({name:"shaderVisible",initialValue:!1}),n({name:"shaderString",initialValue:"",getPrimitiveFunction:function(){let o=t._voxelPrimitive.customShader.fragmentShaderText;t.shaderString=kSe(o)}}),n({name:"shaderCompilationMessage",initialValue:""}),n({name:"shaderCompilationSuccess",initialValue:!0}),n({name:"depthTest",initialValue:!1,setPrimitiveFunction:!0,getPrimitiveFunction:!0}),n({name:"show",initialValue:!0,setPrimitiveFunction:!0,getPrimitiveFunction:!0}),n({name:"disableUpdate",initialValue:!1,setPrimitiveFunction:!0,getPrimitiveFunction:!0}),n({name:"debugDraw",initialValue:!1,setPrimitiveFunction:!0,getPrimitiveFunction:!0}),n({name:"jitter",initialValue:!0,setPrimitiveFunction:!0,getPrimitiveFunction:!0}),n({name:"nearestSampling",initialValue:!0,setPrimitiveFunction:!0,getPrimitiveFunction:!0}),n({name:"screenSpaceError",initialValue:4,setPrimitiveFunction:!0,getPrimitiveFunction:!0}),n({name:"stepSize",initialValue:1,setPrimitiveFunction:!0,getPrimitiveFunction:!0}),n({name:"shapeIsBox",getPrimitiveFunction:function(){let o=t._voxelPrimitive.shape;t.shapeIsBox=o===Xi.BOX}}),n({name:"shapeIsEllipsoid",getPrimitiveFunction:function(){let o=t._voxelPrimitive.shape;t.shapeIsEllipsoid=o===Xi.ELLIPSOID}}),n({name:"shapeIsCylinder",getPrimitiveFunction:function(){let o=t._voxelPrimitive.shape;t.shapeIsCylinder=o===Xi.CYLINDER}}),n({name:"boundsBoxMaxX",initialValue:0,setPrimitiveFunction:i("maxBounds","x"),getPrimitiveFunction:function(){t.boundsBoxMaxX=t._voxelPrimitive.maxBounds.x}}),n({name:"boundsBoxMinX",initialValue:0,setPrimitiveFunction:i("minBounds","x"),getPrimitiveFunction:function(){t.boundsBoxMinX=t._voxelPrimitive.minBounds.x}}),n({name:"boundsBoxMaxY",initialValue:0,setPrimitiveFunction:i("maxBounds","y"),getPrimitiveFunction:function(){t.boundsBoxMaxY=t._voxelPrimitive.maxBounds.y}}),n({name:"boundsBoxMinY",initialValue:0,setPrimitiveFunction:i("minBounds","y"),getPrimitiveFunction:function(){t.boundsBoxMinY=t._voxelPrimitive.minBounds.y}}),n({name:"boundsBoxMaxZ",initialValue:0,setPrimitiveFunction:i("maxBounds","z"),getPrimitiveFunction:function(){t.boundsBoxMaxZ=t._voxelPrimitive.maxBounds.z}}),n({name:"boundsBoxMinZ",initialValue:0,setPrimitiveFunction:i("minBounds","z"),getPrimitiveFunction:function(){t.boundsBoxMinZ=t._voxelPrimitive.minBounds.z}}),n({name:"boundsEllipsoidMaxLongitude",initialValue:0,setPrimitiveFunction:i("maxBounds","x"),getPrimitiveFunction:function(){t.boundsEllipsoidMaxLongitude=t._voxelPrimitive.maxBounds.x}}),n({name:"boundsEllipsoidMinLongitude",initialValue:0,setPrimitiveFunction:i("minBounds","x"),getPrimitiveFunction:function(){t.boundsEllipsoidMinLongitude=t._voxelPrimitive.minBounds.x}}),n({name:"boundsEllipsoidMaxLatitude",initialValue:0,setPrimitiveFunction:i("maxBounds","y"),getPrimitiveFunction:function(){t.boundsEllipsoidMaxLatitude=t._voxelPrimitive.maxBounds.y}}),n({name:"boundsEllipsoidMinLatitude",initialValue:0,setPrimitiveFunction:i("minBounds","y"),getPrimitiveFunction:function(){t.boundsEllipsoidMinLatitude=t._voxelPrimitive.minBounds.y}}),n({name:"boundsEllipsoidMaxHeight",initialValue:0,setPrimitiveFunction:i("maxBounds","z"),getPrimitiveFunction:function(){t.boundsEllipsoidMaxHeight=t._voxelPrimitive.maxBounds.z}}),n({name:"boundsEllipsoidMinHeight",initialValue:0,setPrimitiveFunction:i("minBounds","z"),getPrimitiveFunction:function(){t.boundsEllipsoidMinHeight=t._voxelPrimitive.minBounds.z}}),n({name:"boundsCylinderMaxRadius",initialValue:0,setPrimitiveFunction:i("maxBounds","x"),getPrimitiveFunction:function(){t.boundsCylinderMaxRadius=t._voxelPrimitive.maxBounds.x}}),n({name:"boundsCylinderMinRadius",initialValue:0,setPrimitiveFunction:i("minBounds","x"),getPrimitiveFunction:function(){t.boundsCylinderMinRadius=t._voxelPrimitive.minBounds.x}}),n({name:"boundsCylinderMaxHeight",initialValue:0,setPrimitiveFunction:i("maxBounds","y"),getPrimitiveFunction:function(){t.boundsCylinderMaxHeight=t._voxelPrimitive.maxBounds.y}}),n({name:"boundsCylinderMinHeight",initialValue:0,setPrimitiveFunction:i("minBounds","y"),getPrimitiveFunction:function(){t.boundsCylinderMinHeight=t._voxelPrimitive.minBounds.y}}),n({name:"boundsCylinderMaxAngle",initialValue:0,setPrimitiveFunction:i("maxBounds","z"),getPrimitiveFunction:function(){t.boundsCylinderMaxAngle=t._voxelPrimitive.maxBounds.z}}),n({name:"boundsCylinderMinAngle",initialValue:0,setPrimitiveFunction:i("minBounds","z"),getPrimitiveFunction:function(){t.boundsCylinderMinAngle=t._voxelPrimitive.minBounds.z}}),n({name:"clippingBoxMaxX",initialValue:0,setPrimitiveFunction:i("maxClippingBounds","x"),getPrimitiveFunction:function(){t.clippingBoxMaxX=t._voxelPrimitive.maxClippingBounds.x}}),n({name:"clippingBoxMinX",initialValue:0,setPrimitiveFunction:i("minClippingBounds","x"),getPrimitiveFunction:function(){t.clippingBoxMinX=t._voxelPrimitive.minClippingBounds.x}}),n({name:"clippingBoxMaxY",initialValue:0,setPrimitiveFunction:i("maxClippingBounds","y"),getPrimitiveFunction:function(){t.clippingBoxMaxY=t._voxelPrimitive.maxClippingBounds.y}}),n({name:"clippingBoxMinY",initialValue:0,setPrimitiveFunction:i("minClippingBounds","y"),getPrimitiveFunction:function(){t.clippingBoxMinY=t._voxelPrimitive.minClippingBounds.y}}),n({name:"clippingBoxMaxZ",initialValue:0,setPrimitiveFunction:i("maxClippingBounds","z"),getPrimitiveFunction:function(){t.clippingBoxMaxZ=t._voxelPrimitive.maxClippingBounds.z}}),n({name:"clippingBoxMinZ",initialValue:0,setPrimitiveFunction:i("minClippingBounds","z"),getPrimitiveFunction:function(){t.clippingBoxMinZ=t._voxelPrimitive.minClippingBounds.z}}),n({name:"clippingEllipsoidMaxLongitude",initialValue:0,setPrimitiveFunction:i("maxClippingBounds","x"),getPrimitiveFunction:function(){t.clippingEllipsoidMaxLongitude=t._voxelPrimitive.maxClippingBounds.x}}),n({name:"clippingEllipsoidMinLongitude",initialValue:0,setPrimitiveFunction:i("minClippingBounds","x"),getPrimitiveFunction:function(){t.clippingEllipsoidMinLongitude=t._voxelPrimitive.minClippingBounds.x}}),n({name:"clippingEllipsoidMaxLatitude",initialValue:0,setPrimitiveFunction:i("maxClippingBounds","y"),getPrimitiveFunction:function(){t.clippingEllipsoidMaxLatitude=t._voxelPrimitive.maxClippingBounds.y}}),n({name:"clippingEllipsoidMinLatitude",initialValue:0,setPrimitiveFunction:i("minClippingBounds","y"),getPrimitiveFunction:function(){t.clippingEllipsoidMinLatitude=t._voxelPrimitive.minClippingBounds.y}}),n({name:"clippingEllipsoidMaxHeight",initialValue:0,setPrimitiveFunction:i("maxClippingBounds","z"),getPrimitiveFunction:function(){t.clippingEllipsoidMaxHeight=t._voxelPrimitive.maxClippingBounds.z}}),n({name:"clippingEllipsoidMinHeight",initialValue:0,setPrimitiveFunction:i("minClippingBounds","z"),getPrimitiveFunction:function(){t.clippingEllipsoidMinHeight=t._voxelPrimitive.minClippingBounds.z}}),n({name:"clippingCylinderMaxRadius",initialValue:0,setPrimitiveFunction:i("maxClippingBounds","x"),getPrimitiveFunction:function(){t.clippingCylinderMaxRadius=t._voxelPrimitive.maxClippingBounds.x}}),n({name:"clippingCylinderMinRadius",initialValue:0,setPrimitiveFunction:i("minClippingBounds","x"),getPrimitiveFunction:function(){t.clippingCylinderMinRadius=t._voxelPrimitive.minClippingBounds.x}}),n({name:"clippingCylinderMaxHeight",initialValue:0,setPrimitiveFunction:i("maxClippingBounds","y"),getPrimitiveFunction:function(){t.clippingCylinderMaxHeight=t._voxelPrimitive.maxClippingBounds.y}}),n({name:"clippingCylinderMinHeight",initialValue:0,setPrimitiveFunction:i("minClippingBounds","y"),getPrimitiveFunction:function(){t.clippingCylinderMinHeight=t._voxelPrimitive.minClippingBounds.y}}),n({name:"clippingCylinderMaxAngle",initialValue:0,setPrimitiveFunction:i("maxClippingBounds","z"),getPrimitiveFunction:function(){t.clippingCylinderMaxAngle=t._voxelPrimitive.maxClippingBounds.z}}),n({name:"clippingCylinderMinAngle",initialValue:0,setPrimitiveFunction:i("minClippingBounds","z"),getPrimitiveFunction:function(){t.clippingCylinderMinAngle=t._voxelPrimitive.minClippingBounds.z}}),n({name:"translationX",initialValue:0,setPrimitiveFunction:function(){t._modelMatrixReady&&ep(t)},getPrimitiveFunction:function(){t.translationX=M.getTranslation(t._voxelPrimitive.modelMatrix,new h).x}}),n({name:"translationY",initialValue:0,setPrimitiveFunction:function(){t._modelMatrixReady&&ep(t)},getPrimitiveFunction:function(){t.translationY=M.getTranslation(t._voxelPrimitive.modelMatrix,new h).y}}),n({name:"translationZ",initialValue:0,setPrimitiveFunction:function(){t._modelMatrixReady&&ep(t)},getPrimitiveFunction:function(){t.translationZ=M.getTranslation(t._voxelPrimitive.modelMatrix,new h).z}}),n({name:"scaleX",initialValue:1,setPrimitiveFunction:function(){t._modelMatrixReady&&ep(t)},getPrimitiveFunction:function(){t.scaleX=M.getScale(t._voxelPrimitive.modelMatrix,new h).x}}),n({name:"scaleY",initialValue:1,setPrimitiveFunction:function(){t._modelMatrixReady&&ep(t)},getPrimitiveFunction:function(){t.scaleY=M.getScale(t._voxelPrimitive.modelMatrix,new h).y}}),n({name:"scaleZ",initialValue:1,setPrimitiveFunction:function(){t._modelMatrixReady&&ep(t)},getPrimitiveFunction:function(){t.scaleZ=M.getScale(t._voxelPrimitive.modelMatrix,new h).z}}),n({name:"angleX",initialValue:0,setPrimitiveFunction:function(){t._modelMatrixReady&&ep(t)}}),n({name:"angleY",initialValue:0,setPrimitiveFunction:function(){t._modelMatrixReady&&ep(t)}}),n({name:"angleZ",initialValue:0,setPrimitiveFunction:function(){t._modelMatrixReady&&ep(t)}})}var _St=new h,TSt=new h,SSt=new za,CSt=new $;function ep(e){let t=h.fromElements(e.translationX,e.translationY,e.translationZ,_St),n=h.fromElements(e.scaleX,e.scaleY,e.scaleZ,TSt),i=SSt;i.heading=e.angleX,i.pitch=e.angleY,i.roll=e.angleZ;let o=$.fromHeadingPitchRoll(i,CSt),r=$.multiplyByScale(o,n,o);e._voxelPrimitive.modelMatrix=M.fromRotationTranslation(r,t,e._voxelPrimitive.modelMatrix)}Object.defineProperties(dm.prototype,{scene:{get:function(){return this._scene}},voxelPrimitive:{get:function(){return this._voxelPrimitive},set:function(e){if(l(this._customShaderCompilationRemoveCallback)&&this._customShaderCompilationRemoveCallback(),l(e)){this._voxelPrimitive=e;let t=this;t._customShaderCompilationRemoveCallback=t._voxelPrimitive.customShaderCompilationEvent.addEventListener(function(n){let i=t._voxelPrimitive.customShader.fragmentShaderText;t.shaderString=kSe(i),l(n)?(t.shaderCompilationMessage=n.message,t.shaderCompilationSuccess=!1):(t.shaderCompilationMessage="Shader compiled successfully!",t.shaderCompilationSuccess=!0)}),t._modelMatrixReady=!1;for(let n=0;n<t._getPrimitiveFunctions.length;n++)t._getPrimitiveFunctions[n]();t._modelMatrixReady=!0,ep(t)}}}});dm.prototype.toggleInspector=function(){this.inspectorVisible=!this.inspectorVisible};dm.prototype.toggleDisplay=function(){this.displayVisible=!this.displayVisible};dm.prototype.toggleTransform=function(){this.transformVisible=!this.transformVisible};dm.prototype.toggleBounds=function(){this.boundsVisible=!this.boundsVisible};dm.prototype.toggleClipping=function(){this.clippingVisible=!this.clippingVisible};dm.prototype.toggleShader=function(){this.shaderVisible=!this.shaderVisible};dm.prototype.compileShader=function(){l(this._voxelPrimitive)&&(this._voxelPrimitive.customShader=new $T({fragmentShaderText:this.shaderString,uniforms:this._voxelPrimitive.customShader.uniforms}))};dm.prototype.shaderEditorKeyPress=function(e,t){if(t.keyCode===9){t.preventDefault();let n=t.target,i=n.selectionStart,o=n.selectionEnd,r=o,a=n.value.slice(i,o).split(` `),c=a.length,d;if(t.shiftKey)for(d=0;d<c;++d)a[d][0]===" "&&(a[d][1]===" "?(a[d]=a[d].substr(2),r-=2):(a[d]=a[d].substr(1),r-=1));else for(d=0;d<c;++d)a[d]=` ${a[d]}`,r+=2;let u=a.join(` `);n.value=n.value.slice(0,i)+u+n.value.slice(o),n.selectionStart=i!==o?i:r,n.selectionEnd=r}else t.ctrlKey&&(t.keyCode===10||t.keyCode===13)&&this.compileShader();return!0};dm.prototype.isDestroyed=function(){return!1};dm.prototype.destroy=function(){let e=this;return this._definedProperties.forEach(function(t){Ce.getObservable(e,t).dispose()}),me(this)};var dM=dm;function mB(e,t){e=In(e);let n=document.createElement("div"),i=new dM(t);this._viewModel=i,this._container=e,this._element=n;let o=document.createElement("div");o.textContent="Voxel Inspector",o.className="cesium-cesiumInspector-button",o.setAttribute("data-bind","click: toggleInspector"),n.appendChild(o),n.className="cesium-cesiumInspector cesium-VoxelInspector",n.setAttribute("data-bind",'css: { "cesium-cesiumInspector-visible" : inspectorVisible, "cesium-cesiumInspector-hidden" : !inspectorVisible}'),e.appendChild(n);let r=document.createElement("div");r.className="cesium-cesiumInspector-dropDown",n.appendChild(r);let s=Ma.createSection,a=Ma.createCheckbox,c=Ma.createRangeInput,d=Ma.createButton,u=s(r,"Display","displayVisible","toggleDisplay"),m=s(r,"Transform","transformVisible","toggleTransform"),p=s(r,"Bounds","boundsVisible","toggleBounds"),g=s(r,"Clipping","clippingVisible","toggleClipping"),f=s(r,"Shader","shaderVisible","toggleShader");u.appendChild(a("Depth Test","depthTest")),u.appendChild(a("Show","show")),u.appendChild(a("Disable Update","disableUpdate")),u.appendChild(a("Debug Draw","debugDraw")),u.appendChild(a("Jitter","jitter")),u.appendChild(a("Nearest Sampling","nearestSampling")),u.appendChild(c("Screen Space Error","screenSpaceError",0,128)),u.appendChild(c("Step Size","stepSize",0,2));let x=10,_=10,C=W.PI;m.appendChild(c("Translation X","translationX",-x,+x)),m.appendChild(c("Translation Y","translationY",-x,+x)),m.appendChild(c("Translation Z","translationZ",-x,+x)),m.appendChild(c("Scale X","scaleX",0,+_)),m.appendChild(c("Scale Y","scaleY",0,+_)),m.appendChild(c("Scale Z","scaleZ",0,+_)),m.appendChild(c("Heading","angleX",-C,+C)),m.appendChild(c("Pitch","angleY",-C,+C)),m.appendChild(c("Roll","angleZ",-C,+C));let V=Xi.getMinBounds(Xi.BOX),L=Xi.getMaxBounds(Xi.BOX),Z=h.fromElements(Xi.getMinBounds(Xi.ELLIPSOID).x,Xi.getMinBounds(Xi.ELLIPSOID).y,-ie.WGS84.maximumRadius,new h),G=h.fromElements(Xi.getMaxBounds(Xi.ELLIPSOID).x,Xi.getMaxBounds(Xi.ELLIPSOID).y,1e7,new h),X=Xi.getMinBounds(Xi.CYLINDER),v=Xi.getMaxBounds(Xi.CYLINDER);RL("Max X","Min X","Max Y","Min Y","Max Z","Min Z","boundsBoxMaxX","boundsBoxMinX","boundsBoxMaxY","boundsBoxMinY","boundsBoxMaxZ","boundsBoxMinZ",V,L,"shapeIsBox",p),RL("Max Longitude","Min Longitude","Max Latitude","Min Latitude","Max Height","Min Height","boundsEllipsoidMaxLongitude","boundsEllipsoidMinLongitude","boundsEllipsoidMaxLatitude","boundsEllipsoidMinLatitude","boundsEllipsoidMaxHeight","boundsEllipsoidMinHeight",Z,G,"shapeIsEllipsoid",p),RL("Max Radius","Min Radius","Max Height","Min Height","Max Angle","Min Angle","boundsCylinderMaxRadius","boundsCylinderMinRadius","boundsCylinderMaxHeight","boundsCylinderMinHeight","boundsCylinderMaxAngle","boundsCylinderMinAngle",X,v,"shapeIsCylinder",p),RL("Max X","Min X","Max Y","Min Y","Max Z","Min Z","clippingBoxMaxX","clippingBoxMinX","clippingBoxMaxY","clippingBoxMinY","clippingBoxMaxZ","clippingBoxMinZ",V,L,"shapeIsBox",g),RL("Max Longitude","Min Longitude","Max Latitude","Min Latitude","Max Height","Min Height","clippingEllipsoidMaxLongitude","clippingEllipsoidMinLongitude","clippingEllipsoidMaxLatitude","clippingEllipsoidMinLatitude","clippingEllipsoidMaxHeight","clippingEllipsoidMinHeight",Z,G,"shapeIsEllipsoid",g),RL("Max Radius","Min Radius","Max Height","Min Height","Max Angle","Min Angle","clippingCylinderMaxRadius","clippingCylinderMinRadius","clippingCylinderMaxHeight","clippingCylinderMinHeight","clippingCylinderMaxAngle","clippingCylinderMinAngle",X,v,"shapeIsCylinder",g);let P=document.createElement("div");f.appendChild(P);let F=document.createElement("textarea");F.setAttribute("data-bind","textInput: shaderString, event: { keydown: shaderEditorKeyPress }"),P.className="cesium-cesiumInspector-styleEditor",P.appendChild(F);let A=d("Compile (Ctrl+Enter)","compileShader");P.appendChild(A);let b=document.createElement("label");b.style.display="block",b.setAttribute("data-bind","text: shaderCompilationMessage, style: {color: shaderCompilationSuccess ? 'green' : 'red'}"),P.appendChild(b),Ce.applyBindings(i,n)}Object.defineProperties(mB.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});mB.prototype.isDestroyed=function(){return!1};mB.prototype.destroy=function(){return Ce.cleanNode(this._element),this._container.removeChild(this._element),this.viewModel.destroy(),me(this)};function RL(e,t,n,i,o,r,s,a,c,d,u,m,p,g,f,x){let _=Ma.createRangeInput,C=p,V=g,L=x.appendChild(document.createElement("div"));L.setAttribute("data-bind",`if: ${f}`),L.appendChild(_(e,s,C.x,V.x)),L.appendChild(_(t,a,C.x,V.x)),L.appendChild(_(n,c,C.y,V.y)),L.appendChild(_(i,d,C.y,V.y)),L.appendChild(_(o,u,C.z,V.z)),L.appendChild(_(r,m,C.z,V.z))}var uM=mB;function VSt(e){let t=document.createElement("div");t.className="cesium-viewer-voxelInspectorContainer",e.container.appendChild(t);let n=new uM(t,e.scene);Object.defineProperties(e,{voxelInspector:{get:function(){return n}}})}var L6=VSt;globalThis.CESIUM_VERSION="1.118";var LSt="1.118";return tCe(RSt);})();