cesium
Version:
CesiumJS is a JavaScript library for creating 3D globes and 2D maps in a web browser without a plugin.
26 lines (25 loc) • 5.68 MB
JavaScript
/**
* @license
* Cesium - https://github.com/CesiumGS/cesium
* Version 1.135.0
*
* 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 jZe=Object.create;var eU=Object.defineProperty;var qZe=Object.getOwnPropertyDescriptor;var $Ze=Object.getOwnPropertyNames;var eRe=Object.getPrototypeOf,tRe=Object.prototype.hasOwnProperty;var tU=(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 Uu=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),nRe=(e,t)=>{for(var n in t)eU(e,n,{get:t[n],enumerable:!0})},mte=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of $Ze(t))!tRe.call(e,o)&&o!==n&&eU(e,o,{get:()=>t[o],enumerable:!(i=qZe(t,o))||i.enumerable});return e};var y=(e,t,n)=>(n=e!=null?jZe(eRe(e)):{},mte(t||!e||!e.__esModule?eU(n,"default",{value:e,enumerable:!0}):n,e)),iRe=e=>mte(eU({},"__esModule",{value:!0}),e);var x=Uu(()=>{globalThis.CESIUM_WORKERS=atob("dmFyIENlc2l1bVdvcmtlcnM9KCgpPT57dmFyIFYyPU9iamVjdC5jcmVhdGU7dmFyIHp1PU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgSDI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgSzI9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIHEyPU9iamVjdC5nZXRQcm90b3R5cGVPZixXMj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBsYT0oZT0+dHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6dHlwZW9mIFByb3h5PCJ1Ij9uZXcgUHJveHkoZSx7Z2V0Oih0LG4pPT4odHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6dClbbl19KTplKShmdW5jdGlvbihlKXtpZih0eXBlb2YgcmVxdWlyZTwidSIpcmV0dXJuIHJlcXVpcmUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3Rocm93IEVycm9yKCdEeW5hbWljIHJlcXVpcmUgb2YgIicrZSsnIiBpcyBub3Qgc3VwcG9ydGVkJyl9KSxMeT1lPT50PT57dmFyIG49ZVt0XTtpZihuKXJldHVybiBuKCk7dGhyb3cgbmV3IEVycm9yKCJNb2R1bGUgbm90IGZvdW5kIGluIGJ1bmRsZTogIit0KX07dmFyIFk9KGUsdCk9PigpPT4oZSYmKHQ9ZShlPTApKSx0KTt2YXIgZW89KGUsdCk9PigpPT4odHx8ZSgodD17ZXhwb3J0czp7fX0pLmV4cG9ydHMsdCksdC5leHBvcnRzKSxzdD0oZSx0KT0+e2Zvcih2YXIgbiBpbiB0KXp1KGUsbix7Z2V0OnRbbl0sZW51bWVyYWJsZTohMH0pfSxqeT0oZSx0LG4sbyk9PntpZih0JiZ0eXBlb2YgdD09Im9iamVjdCJ8fHR5cGVvZiB0PT0iZnVuY3Rpb24iKWZvcihsZXQgYSBvZiBLMih0KSkhVzIuY2FsbChlLGEpJiZhIT09biYmenUoZSxhLHtnZXQ6KCk9PnRbYV0sZW51bWVyYWJsZTohKG89SDIodCxhKSl8fG8uZW51bWVyYWJsZX0pO3JldHVybiBlfTt2YXIgaGE9KGUsdCxuKT0+KG49ZSE9bnVsbD9WMihxMihlKSk6e30sankodHx8IWV8fCFlLl9fZXNNb2R1bGU/enUobiwiZGVmYXVsdCIse3ZhbHVlOmUsZW51bWVyYWJsZTohMH0pOm4sZSkpLFgyPWU9Pmp5KHp1KHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlKTtmdW5jdGlvbiBZMihlKXtyZXR1cm4gZSE9bnVsbH12YXIgZyxmZT1ZKCgpPT57Zz1ZMn0pO2Z1bmN0aW9uIHppKGUpe3RoaXMubmFtZT0iRGV2ZWxvcGVyRXJyb3IiLHRoaXMubWVzc2FnZT1lO2xldCB0O3RyeXt0aHJvdyBuZXcgRXJyb3J9Y2F0Y2gobil7dD1uLnN0YWNrfXRoaXMuc3RhY2s9dH12YXIgYW4sR2M9WSgoKT0+e2ZlKCk7ZyhPYmplY3QuY3JlYXRlKSYmKHppLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSksemkucHJvdG90eXBlLmNvbnN0cnVjdG9yPXppKTt6aS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtsZXQgZT1gJHt0aGlzLm5hbWV9OiAke3RoaXMubWVzc2FnZX1gO3JldHVybiBnKHRoaXMuc3RhY2spJiYoZSs9YAoke3RoaXMuc3RhY2sudG9TdHJpbmcoKX1gKSxlfTt6aS50aHJvd0luc3RhbnRpYXRpb25FcnJvcj1mdW5jdGlvbigpe3Rocm93IG5ldyB6aSgiVGhpcyBmdW5jdGlvbiBkZWZpbmVzIGFuIGludGVyZmFjZSBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIil9O2FuPXppfSk7ZnVuY3Rpb24gSjIoZSl7cmV0dXJuYCR7ZX0gaXMgcmVxdWlyZWQsIGFjdHVhbCB2YWx1ZSB3YXMgdW5kZWZpbmVkYH1mdW5jdGlvbiBWYyhlLHQsbil7cmV0dXJuYEV4cGVjdGVkICR7bn0gdG8gYmUgdHlwZW9mICR7dH0sIGFjdHVhbCB0eXBlb2Ygd2FzICR7ZX1gfXZhciB0byxNbixDbT1ZKCgpPT57ZmUoKTtHYygpO3RvPXt9O3RvLnR5cGVPZj17fTt0by5kZWZpbmVkPWZ1bmN0aW9uKGUsdCl7aWYoIWcodCkpdGhyb3cgbmV3IGFuKEoyKGUpKX07dG8udHlwZU9mLmZ1bmM9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgYW4oVmModHlwZW9mIHQsImZ1bmN0aW9uIixlKSl9O3RvLnR5cGVPZi5zdHJpbmc9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdCE9InN0cmluZyIpdGhyb3cgbmV3IGFuKFZjKHR5cGVvZiB0LCJzdHJpbmciLGUpKX07dG8udHlwZU9mLm51bWJlcj1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyIil0aHJvdyBuZXcgYW4oVmModHlwZW9mIHQsIm51bWJlciIsZSkpfTt0by50eXBlT2YubnVtYmVyLmxlc3NUaGFuPWZ1bmN0aW9uKGUsdCxuKXtpZih0by50eXBlT2YubnVtYmVyKGUsdCksdD49bil0aHJvdyBuZXcgYW4oYEV4cGVjdGVkICR7ZX0gdG8gYmUgbGVzcyB0aGFuICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHt0fWApfTt0by50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHM9ZnVuY3Rpb24oZSx0LG4pe2lmKHRvLnR5cGVPZi5udW1iZXIoZSx0KSx0Pm4pdGhyb3cgbmV3IGFuKGBFeHBlY3RlZCAke2V9IHRvIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAke259LCBhY3R1YWwgdmFsdWUgd2FzICR7dH1gKX07dG8udHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbj1mdW5jdGlvbihlLHQsbil7aWYodG8udHlwZU9mLm51bWJlcihlLHQpLHQ8PW4pdGhyb3cgbmV3IGFuKGBFeHBlY3RlZCAke2V9IHRvIGJlIGdyZWF0ZXIgdGhhbiAke259LCBhY3R1YWwgdmFsdWUgd2FzICR7dH1gKX07dG8udHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzPWZ1bmN0aW9uKGUsdCxuKXtpZih0by50eXBlT2YubnVtYmVyKGUsdCksdDxuKXRocm93IG5ldyBhbihgRXhwZWN0ZWQgJHtlfSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtufSwgYWN0dWFsIHZhbHVlIHdhcyAke3R9YCl9O3RvLnR5cGVPZi5vYmplY3Q9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdCE9Im9iamVjdCIpdGhyb3cgbmV3IGFuKFZjKHR5cGVvZiB0LCJvYmplY3QiLGUpKX07dG8udHlwZU9mLmJvb2w9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdCE9ImJvb2xlYW4iKXRocm93IG5ldyBhbihWYyh0eXBlb2YgdCwiYm9vbGVhbiIsZSkpfTt0by50eXBlT2YuYmlnaW50PWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIHQhPSJiaWdpbnQiKXRocm93IG5ldyBhbihWYyh0eXBlb2YgdCwiYmlnaW50IixlKSl9O3RvLnR5cGVPZi5udW1iZXIuZXF1YWxzPWZ1bmN0aW9uKGUsdCxuLG8pe2lmKHRvLnR5cGVPZi5udW1iZXIoZSxuKSx0by50eXBlT2YubnVtYmVyKHQsbyksbiE9PW8pdGhyb3cgbmV3IGFuKGAke2V9IG11c3QgYmUgZXF1YWwgdG8gJHt0fSwgdGhlIGFjdHVhbCB2YWx1ZXMgYXJlICR7bn0gYW5kICR7b31gKX07TW49dG99KTt2YXIgR3k9ZW8oKG16LHp5KT0+e3ZhciBTcj1mdW5jdGlvbihlKXtlPT1udWxsJiYoZT1uZXcgRGF0ZSgpLmdldFRpbWUoKSksdGhpcy5OPTYyNCx0aGlzLk09Mzk3LHRoaXMuTUFUUklYX0E9MjU2NzQ4MzYxNSx0aGlzLlVQUEVSX01BU0s9MjE0NzQ4MzY0OCx0aGlzLkxPV0VSX01BU0s9MjE0NzQ4MzY0Nyx0aGlzLm10PW5ldyBBcnJheSh0aGlzLk4pLHRoaXMubXRpPXRoaXMuTisxLGUuY29uc3RydWN0b3I9PUFycmF5P3RoaXMuaW5pdF9ieV9hcnJheShlLGUubGVuZ3RoKTp0aGlzLmluaXRfc2VlZChlKX07U3IucHJvdG90eXBlLmluaXRfc2VlZD1mdW5jdGlvbihlKXtmb3IodGhpcy5tdFswXT1lPj4+MCx0aGlzLm10aT0xO3RoaXMubXRpPHRoaXMuTjt0aGlzLm10aSsrKXt2YXIgZT10aGlzLm10W3RoaXMubXRpLTFdXnRoaXMubXRbdGhpcy5tdGktMV0+Pj4zMDt0aGlzLm10W3RoaXMubXRpXT0oKChlJjQyOTQ5MDE3NjApPj4+MTYpKjE4MTI0MzMyNTM8PDE2KSsoZSY2NTUzNSkqMTgxMjQzMzI1Myt0aGlzLm10aSx0aGlzLm10W3RoaXMubXRpXT4+Pj0wfX07U3IucHJvdG90eXBlLmluaXRfYnlfYXJyYXk9ZnVuY3Rpb24oZSx0KXt2YXIgbixvLGE7Zm9yKHRoaXMuaW5pdF9zZWVkKDE5NjUwMjE4KSxuPTEsbz0wLGE9dGhpcy5OPnQ/dGhpcy5OOnQ7YTthLS0pe3ZhciByPXRoaXMubXRbbi0xXV50aGlzLm10W24tMV0+Pj4zMDt0aGlzLm10W25dPSh0aGlzLm10W25dXigoKHImNDI5NDkwMTc2MCk+Pj4xNikqMTY2NDUyNTw8MTYpKyhyJjY1NTM1KSoxNjY0NTI1KStlW29dK28sdGhpcy5tdFtuXT4+Pj0wLG4rKyxvKyssbj49dGhpcy5OJiYodGhpcy5tdFswXT10aGlzLm10W3RoaXMuTi0xXSxuPTEpLG8+PXQmJihvPTApfWZvcihhPXRoaXMuTi0xO2E7YS0tKXt2YXIgcj10aGlzLm10W24tMV1edGhpcy5tdFtuLTFdPj4+MzA7dGhpcy5tdFtuXT0odGhpcy5tdFtuXV4oKChyJjQyOTQ5MDE3NjApPj4+MTYpKjE1NjYwODM5NDE8PDE2KSsociY2NTUzNSkqMTU2NjA4Mzk0MSktbix0aGlzLm10W25dPj4+PTAsbisrLG4+PXRoaXMuTiYmKHRoaXMubXRbMF09dGhpcy5tdFt0aGlzLk4tMV0sbj0xKX10aGlzLm10WzBdPTIxNDc0ODM2NDh9O1NyLnByb3RvdHlwZS5yYW5kb21faW50PWZ1bmN0aW9uKCl7dmFyIGUsdD1uZXcgQXJyYXkoMCx0aGlzLk1BVFJJWF9BKTtpZih0aGlzLm10aT49dGhpcy5OKXt2YXIgbjtmb3IodGhpcy5tdGk9PXRoaXMuTisxJiZ0aGlzLmluaXRfc2VlZCg1NDg5KSxuPTA7bjx0aGlzLk4tdGhpcy5NO24rKyllPXRoaXMubXRbbl0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbbisxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtuXT10aGlzLm10W24rdGhpcy5NXV5lPj4+MV50W2UmMV07Zm9yKDtuPHRoaXMuTi0xO24rKyllPXRoaXMubXRbbl0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbbisxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtuXT10aGlzLm10W24rKHRoaXMuTS10aGlzLk4pXV5lPj4+MV50W2UmMV07ZT10aGlzLm10W3RoaXMuTi0xXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFswXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFt0aGlzLk4tMV09dGhpcy5tdFt0aGlzLk0tMV1eZT4+PjFedFtlJjFdLHRoaXMubXRpPTB9cmV0dXJuIGU9dGhpcy5tdFt0aGlzLm10aSsrXSxlXj1lPj4+MTEsZV49ZTw8NyYyNjM2OTI4NjQwLGVePWU8PDE1JjQwMjI3MzA3NTIsZV49ZT4+PjE4LGU+Pj4wfTtTci5wcm90b3R5cGUucmFuZG9tX2ludDMxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpPj4+MX07U3IucHJvdG90eXBlLnJhbmRvbV9pbmNsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLzQyOTQ5NjcyOTUpfTtTci5wcm90b3R5cGUucmFuZG9tPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLzQyOTQ5NjcyOTYpfTtTci5wcm90b3R5cGUucmFuZG9tX2V4Y2w9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5yYW5kb21faW50KCkrLjUpKigxLzQyOTQ5NjcyOTYpfTtTci5wcm90b3R5cGUucmFuZG9tX2xvbmc9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJhbmRvbV9pbnQoKT4+PjUsdD10aGlzLnJhbmRvbV9pbnQoKT4+PjY7cmV0dXJuKGUqNjcxMDg4NjQrdCkqKDEvOTAwNzE5OTI1NDc0MDk5Mil9O3p5LmV4cG9ydHM9U3J9KTt2YXIgTW0sU2UsR3UsVnksayxLZT1ZKCgpPT57TW09aGEoR3koKSwxKSxTZT17fTtTZS5FUFNJTE9OMT0uMTtTZS5FUFNJTE9OMj0uMDE7U2UuRVBTSUxPTjM9LjAwMTtTZS5FUFNJTE9OND0xZS00O1NlLkVQU0lMT041PTFlLTU7U2UuRVBTSUxPTjY9MWUtNjtTZS5FUFNJTE9ONz0xZS03O1NlLkVQU0lMT044PTFlLTg7U2UuRVBTSUxPTjk9MWUtOTtTZS5FUFNJTE9OMTA9MWUtMTA7U2UuRVBTSUxPTjExPTFlLTExO1NlLkVQU0lMT04xMj0xZS0xMjtTZS5FUFNJTE9OMTM9MWUtMTM7U2UuRVBTSUxPTjE0PTFlLTE0O1NlLkVQU0lMT04xNT0xZS0xNTtTZS5FUFNJTE9OMTY9MWUtMTY7U2UuRVBTSUxPTjE3PTFlLTE3O1NlLkVQU0lMT04xOD0xZS0xODtTZS5FUFNJTE9OMTk9MWUtMTk7U2UuRVBTSUxPTjIwPTFlLTIwO1NlLkVQU0lMT04yMT0xZS0yMTtTZS5HUkFWSVRBVElPTkFMUEFSQU1FVEVSPTM5ODYwMDQ0MThlNTtTZS5TT0xBUl9SQURJVVM9Njk1NWU1O1NlLkxVTkFSX1JBRElVUz0xNzM3NDAwO1NlLlNJWFRZX0ZPVVJfS0lMT0JZVEVTPTY0KjEwMjQ7U2UuRk9VUl9HSUdBQllURVM9NCoxMDI0KjEwMjQqMTAyNDtTZS5zaWduPU1hdGguc2lnbj8/ZnVuY3Rpb24odCl7cmV0dXJuIHQ9K3QsdD09PTB8fHQhPT10P3Q6dD4wPzE6LTF9O1NlLnNpZ25Ob3RaZXJvPWZ1bmN0aW9uKGUpe3JldHVybiBlPDA/LTE6MX07U2UudG9TTm9ybT1mdW5jdGlvbihlLHQpe3JldHVybiB0PXQ/PzI1NSxNYXRoLnJvdW5kKChTZS5jbGFtcChlLC0xLDEpKi41Ky41KSp0KX07U2UuZnJvbVNOb3JtPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9dD8/MjU1LFNlLmNsYW1wKGUsMCx0KS90KjItMX07U2Uubm9ybWFsaXplPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj1NYXRoLm1heChuLXQsMCksbj09PTA/MDpTZS5jbGFtcCgoZS10KS9uLDAsMSl9O1NlLnNpbmg9TWF0aC5zaW5oPz9mdW5jdGlvbih0KXtyZXR1cm4oTWF0aC5leHAodCktTWF0aC5leHAoLXQpKS8yfTtTZS5jb3NoPU1hdGguY29zaD8/ZnVuY3Rpb24odCl7cmV0dXJuKE1hdGguZXhwKHQpK01hdGguZXhwKC10KSkvMn07U2UubGVycD1mdW5jdGlvbihlLHQsbil7cmV0dXJuKDEtbikqZStuKnR9O1NlLlBJPU1hdGguUEk7U2UuT05FX09WRVJfUEk9MS9NYXRoLlBJO1NlLlBJX09WRVJfVFdPPU1hdGguUEkvMjtTZS5QSV9PVkVSX1RIUkVFPU1hdGguUEkvMztTZS5QSV9PVkVSX0ZPVVI9TWF0aC5QSS80O1NlLlBJX09WRVJfU0lYPU1hdGguUEkvNjtTZS5USFJFRV9QSV9PVkVSX1RXTz0zKk1hdGguUEkvMjtTZS5UV09fUEk9MipNYXRoLlBJO1NlLk9ORV9PVkVSX1RXT19QST0xLygyKk1hdGguUEkpO1NlLlJBRElBTlNfUEVSX0RFR1JFRT1NYXRoLlBJLzE4MDtTZS5ERUdSRUVTX1BFUl9SQURJQU49MTgwL01hdGguUEk7U2UuUkFESUFOU19QRVJfQVJDU0VDT05EPVNlLlJBRElBTlNfUEVSX0RFR1JFRS8zNjAwO1NlLnRvUmFkaWFucz1mdW5jdGlvbihlKXtyZXR1cm4gZSpTZS5SQURJQU5TX1BFUl9ERUdSRUV9O1NlLnRvRGVncmVlcz1mdW5jdGlvbihlKXtyZXR1cm4gZSpTZS5ERUdSRUVTX1BFUl9SQURJQU59O1NlLmNvbnZlcnRMb25naXR1ZGVSYW5nZT1mdW5jdGlvbihlKXtsZXQgdD1TZS5UV09fUEksbj1lLU1hdGguZmxvb3IoZS90KSp0O3JldHVybiBuPC1NYXRoLlBJP24rdDpuPj1NYXRoLlBJP24tdDpufTtTZS5jbGFtcFRvTGF0aXR1ZGVSYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gU2UuY2xhbXAoZSwtMSpTZS5QSV9PVkVSX1RXTyxTZS5QSV9PVkVSX1RXTyl9O1NlLm5lZ2F0aXZlUGlUb1BpPWZ1bmN0aW9uKGUpe3JldHVybiBlPj0tU2UuUEkmJmU8PVNlLlBJP2U6U2UuemVyb1RvVHdvUGkoZStTZS5QSSktU2UuUEl9O1NlLnplcm9Ub1R3b1BpPWZ1bmN0aW9uKGUpe2lmKGU+PTAmJmU8PVNlLlRXT19QSSlyZXR1cm4gZTtsZXQgdD1TZS5tb2QoZSxTZS5UV09fUEkpO3JldHVybiBNYXRoLmFicyh0KTxTZS5FUFNJTE9OMTQmJk1hdGguYWJzKGUpPlNlLkVQU0lMT04xND9TZS5UV09fUEk6dH07U2UubW9kPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIFNlLnNpZ24oZSk9PT1TZS5zaWduKHQpJiZNYXRoLmFicyhlKTxNYXRoLmFicyh0KT9lOihlJXQrdCkldH07U2UuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbihlLHQsbixvKXtuPW4/PzAsbz1vPz9uO2xldCBhPU1hdGguYWJzKGUtdCk7cmV0dXJuIGE8PW98fGE8PW4qTWF0aC5tYXgoTWF0aC5hYnMoZSksTWF0aC5hYnModCkpfTtTZS5sZXNzVGhhbj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGUtdDwtbn07U2UubGVzc1RoYW5PckVxdWFscz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGUtdDxufTtTZS5ncmVhdGVyVGhhbj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGUtdD5ufTtTZS5ncmVhdGVyVGhhbk9yRXF1YWxzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS10Pi1ufTtHdT1bMV07U2UuZmFjdG9yaWFsPWZ1bmN0aW9uKGUpe2xldCB0PUd1Lmxlbmd0aDtpZihlPj10KXtsZXQgbj1HdVt0LTFdO2ZvcihsZXQgbz10O288PWU7bysrKXtsZXQgYT1uKm87R3UucHVzaChhKSxuPWF9fXJldHVybiBHdVtlXX07U2UuaW5jcmVtZW50V3JhcD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG49bj8/MCwrK2UsZT50JiYoZT1uKSxlfTtTZS5pc1Bvd2VyT2ZUd289ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT0wJiYoZSZlLTEpPT09MH07U2UubmV4dFBvd2VyT2ZUd289ZnVuY3Rpb24oZSl7cmV0dXJuLS1lLGV8PWU+PjEsZXw9ZT4+MixlfD1lPj40LGV8PWU+PjgsZXw9ZT4+MTYsKytlLGV9O1NlLnByZXZpb3VzUG93ZXJPZlR3bz1mdW5jdGlvbihlKXtyZXR1cm4gZXw9ZT4+MSxlfD1lPj4yLGV8PWU+PjQsZXw9ZT4+OCxlfD1lPj4xNixlfD1lPj4zMixlPShlPj4+MCktKGU+Pj4xKSxlfTtTZS5jbGFtcD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU8dD90OmU+bj9uOmV9O1Z5PW5ldyBNbS5kZWZhdWx0O1NlLnNldFJhbmRvbU51bWJlclNlZWQ9ZnVuY3Rpb24oZSl7Vnk9bmV3IE1tLmRlZmF1bHQoZSl9O1NlLm5leHRSYW5kb21OdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gVnkucmFuZG9tKCl9O1NlLnJhbmRvbUJldHdlZW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gU2UubmV4dFJhbmRvbU51bWJlcigpKih0LWUpK2V9O1NlLmFjb3NDbGFtcGVkPWZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmFjb3MoU2UuY2xhbXAoZSwtMSwxKSl9O1NlLmFzaW5DbGFtcGVkPWZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmFzaW4oU2UuY2xhbXAoZSwtMSwxKSl9O1NlLmNob3JkTGVuZ3RoPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIDIqdCpNYXRoLnNpbihlKi41KX07U2UubG9nQmFzZT1mdW5jdGlvbihlLHQpe3JldHVybiBNYXRoLmxvZyhlKS9NYXRoLmxvZyh0KX07U2UuY2JydD1NYXRoLmNicnQ/P2Z1bmN0aW9uKHQpe2xldCBuPU1hdGgucG93KE1hdGguYWJzKHQpLC4zMzMzMzMzMzMzMzMzMzMzKTtyZXR1cm4gdDwwPy1uOm59O1NlLmxvZzI9TWF0aC5sb2cyPz9mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5sb2codCkqTWF0aC5MT0cyRX07U2UuZm9nPWZ1bmN0aW9uKGUsdCl7bGV0IG49ZSp0O3JldHVybiAxLU1hdGguZXhwKC0obipuKSl9O1NlLmZhc3RBcHByb3hpbWF0ZUF0YW49ZnVuY3Rpb24oZSl7cmV0dXJuIGUqKC0uMTc4NCpNYXRoLmFicyhlKS0uMDY2MyplKmUrMS4wMzAxKX07U2UuZmFzdEFwcHJveGltYXRlQXRhbjI9ZnVuY3Rpb24oZSx0KXtsZXQgbixvPU1hdGguYWJzKGUpO249TWF0aC5hYnModCk7bGV0IGE9TWF0aC5tYXgobyxuKTtuPU1hdGgubWluKG8sbik7bGV0IHI9bi9hO3JldHVybiBvPVNlLmZhc3RBcHByb3hpbWF0ZUF0YW4ociksbz1NYXRoLmFicyh0KT5NYXRoLmFicyhlKT9TZS5QSV9PVkVSX1RXTy1vOm8sbz1lPDA/U2UuUEktbzpvLG89dDwwPy1vOm8sb307az1TZX0pO2Z1bmN0aW9uIEFlKGUsdCxuKXt0aGlzLng9ZT8/MCx0aGlzLnk9dD8/MCx0aGlzLno9bj8/MH12YXIgSHUsSHksVnUsTm0sWjIsbWEsSGMscyxGZT1ZKCgpPT57ZmUoKTtLZSgpO0FlLmZyb21TcGhlcmljYWw9ZnVuY3Rpb24oZSx0KXtnKHQpfHwodD1uZXcgQWUpO2xldCBuPWUuY2xvY2ssbz1lLmNvbmUsYT1lLm1hZ25pdHVkZT8/MSxyPWEqTWF0aC5zaW4obyk7cmV0dXJuIHQueD1yKk1hdGguY29zKG4pLHQueT1yKk1hdGguc2luKG4pLHQuej1hKk1hdGguY29zKG8pLHR9O0FlLmZyb21FbGVtZW50cz1mdW5jdGlvbihlLHQsbixvKXtyZXR1cm4gZyhvKT8oby54PWUsby55PXQsby56PW4sbyk6bmV3IEFlKGUsdCxuKX07QWUuY2xvbmU9ZnVuY3Rpb24oZSx0KXtpZihnKGUpKXJldHVybiBnKHQpPyh0Lng9ZS54LHQueT1lLnksdC56PWUueix0KTpuZXcgQWUoZS54LGUueSxlLnopfTtBZS5mcm9tQ2FydGVzaWFuND1BZS5jbG9uZTtBZS5wYWNrZWRMZW5ndGg9MztBZS5wYWNrPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj1uPz8wLHRbbisrXT1lLngsdFtuKytdPWUueSx0W25dPWUueix0fTtBZS51bnBhY2s9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0PXQ/PzAsZyhuKXx8KG49bmV3IEFlKSxuLng9ZVt0KytdLG4ueT1lW3QrK10sbi56PWVbdF0sbn07QWUucGFja0FycmF5PWZ1bmN0aW9uKGUsdCl7bGV0IG49ZS5sZW5ndGgsbz1uKjM7Zyh0KT8hQXJyYXkuaXNBcnJheSh0KSYmdC5sZW5ndGghPT1vfHx0Lmxlbmd0aCE9PW8mJih0Lmxlbmd0aD1vKTp0PW5ldyBBcnJheShvKTtmb3IobGV0IGE9MDthPG47KythKUFlLnBhY2soZVthXSx0LGEqMyk7cmV0dXJuIHR9O0FlLnVucGFja0FycmF5PWZ1bmN0aW9uKGUsdCl7bGV0IG49ZS5sZW5ndGg7Zyh0KT90Lmxlbmd0aD1uLzM6dD1uZXcgQXJyYXkobi8zKTtmb3IobGV0IG89MDtvPG47bys9Myl7bGV0IGE9by8zO3RbYV09QWUudW5wYWNrKGUsbyx0W2FdKX1yZXR1cm4gdH07QWUuZnJvbUFycmF5PUFlLnVucGFjaztBZS5tYXhpbXVtQ29tcG9uZW50PWZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLm1heChlLngsZS55LGUueil9O0FlLm1pbmltdW1Db21wb25lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubWluKGUueCxlLnksZS56KX07QWUubWluaW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbi54PU1hdGgubWluKGUueCx0LngpLG4ueT1NYXRoLm1pbihlLnksdC55KSxuLno9TWF0aC5taW4oZS56LHQueiksbn07QWUubWF4aW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbi54PU1hdGgubWF4KGUueCx0LngpLG4ueT1NYXRoLm1heChlLnksdC55KSxuLno9TWF0aC5tYXgoZS56LHQueiksbn07QWUuY2xhbXA9ZnVuY3Rpb24oZSx0LG4sbyl7bGV0IGE9ay5jbGFtcChlLngsdC54LG4ueCkscj1rLmNsYW1wKGUueSx0Lnksbi55KSxpPWsuY2xhbXAoZS56LHQueixuLnopO3JldHVybiBvLng9YSxvLnk9cixvLno9aSxvfTtBZS5tYWduaXR1ZGVTcXVhcmVkPWZ1bmN0aW9uKGUpe3JldHVybiBlLngqZS54K2UueSplLnkrZS56KmUuen07QWUubWFnbml0dWRlPWZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnNxcnQoQWUubWFnbml0dWRlU3F1YXJlZChlKSl9O0h1PW5ldyBBZTtBZS5kaXN0YW5jZT1mdW5jdGlvbihlLHQpe3JldHVybiBBZS5zdWJ0cmFjdChlLHQsSHUpLEFlLm1hZ25pdHVkZShIdSl9O0FlLmRpc3RhbmNlU3F1YXJlZD1mdW5jdGlvbihlLHQpe3JldHVybiBBZS5zdWJ0cmFjdChlLHQsSHUpLEFlLm1hZ25pdHVkZVNxdWFyZWQoSHUpfTtBZS5ub3JtYWxpemU9ZnVuY3Rpb24oZSx0KXtsZXQgbj1BZS5tYWduaXR1ZGUoZSk7cmV0dXJuIHQueD1lLngvbix0Lnk9ZS55L24sdC56PWUuei9uLHR9O0FlLmRvdD1mdW5jdGlvbihlLHQpe3JldHVybiBlLngqdC54K2UueSp0LnkrZS56KnQuen07QWUubXVsdGlwbHlDb21wb25lbnRzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbi54PWUueCp0Lngsbi55PWUueSp0Lnksbi56PWUueip0Lnosbn07QWUuZGl2aWRlQ29tcG9uZW50cz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4ueD1lLngvdC54LG4ueT1lLnkvdC55LG4uej1lLnovdC56LG59O0FlLmFkZD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4ueD1lLngrdC54LG4ueT1lLnkrdC55LG4uej1lLnordC56LG59O0FlLnN1YnRyYWN0PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbi54PWUueC10Lngsbi55PWUueS10Lnksbi56PWUuei10Lnosbn07QWUubXVsdGlwbHlCeVNjYWxhcj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4ueD1lLngqdCxuLnk9ZS55KnQsbi56PWUueip0LG59O0FlLmRpdmlkZUJ5U2NhbGFyPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbi54PWUueC90LG4ueT1lLnkvdCxuLno9ZS56L3Qsbn07QWUubmVnYXRlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQueD0tZS54LHQueT0tZS55LHQuej0tZS56LHR9O0FlLmFicz1mdW5jdGlvbihlLHQpe3JldHVybiB0Lng9TWF0aC5hYnMoZS54KSx0Lnk9TWF0aC5hYnMoZS55KSx0Lno9TWF0aC5hYnMoZS56KSx0fTtIeT1uZXcgQWU7QWUubGVycD1mdW5jdGlvbihlLHQsbixvKXtyZXR1cm4gQWUubXVsdGlwbHlCeVNjYWxhcih0LG4sSHkpLG89QWUubXVsdGlwbHlCeVNjYWxhcihlLDEtbixvKSxBZS5hZGQoSHksbyxvKX07VnU9bmV3IEFlLE5tPW5ldyBBZTtBZS5hbmdsZUJldHdlZW49ZnVuY3Rpb24oZSx0KXtBZS5ub3JtYWxpemUoZSxWdSksQWUubm9ybWFsaXplKHQsTm0pO2xldCBuPUFlLmRvdChWdSxObSksbz1BZS5tYWduaXR1ZGUoQWUuY3Jvc3MoVnUsTm0sVnUpKTtyZXR1cm4gTWF0aC5hdGFuMihvLG4pfTtaMj1uZXcgQWU7QWUubW9zdE9ydGhvZ29uYWxBeGlzPWZ1bmN0aW9uKGUsdCl7bGV0IG49QWUubm9ybWFsaXplKGUsWjIpO3JldHVybiBBZS5hYnMobixuKSxuLng8PW4ueT9uLng8PW4uej90PUFlLmNsb25lKEFlLlVOSVRfWCx0KTp0PUFlLmNsb25lKEFlLlVOSVRfWix0KTpuLnk8PW4uej90PUFlLmNsb25lKEFlLlVOSVRfWSx0KTp0PUFlLmNsb25lKEFlLlVOSVRfWix0KSx0fTtBZS5wcm9qZWN0VmVjdG9yPWZ1bmN0aW9uKGUsdCxuKXtsZXQgbz1BZS5kb3QoZSx0KS9BZS5kb3QodCx0KTtyZXR1cm4gQWUubXVsdGlwbHlCeVNjYWxhcih0LG8sbil9O0FlLmVxdWFscz1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09dHx8ZyhlKSYmZyh0KSYmZS54PT09dC54JiZlLnk9PT10LnkmJmUuej09PXQuen07QWUuZXF1YWxzQXJyYXk9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLng9PT10W25dJiZlLnk9PT10W24rMV0mJmUuej09PXRbbisyXX07QWUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbihlLHQsbixvKXtyZXR1cm4gZT09PXR8fGcoZSkmJmcodCkmJmsuZXF1YWxzRXBzaWxvbihlLngsdC54LG4sbykmJmsuZXF1YWxzRXBzaWxvbihlLnksdC55LG4sbykmJmsuZXF1YWxzRXBzaWxvbihlLnosdC56LG4sbyl9O0FlLmNyb3NzPWZ1bmN0aW9uKGUsdCxuKXtsZXQgbz1lLngsYT1lLnkscj1lLnosaT10LngsZj10LnksZD10LnosYz1hKmQtcipmLHU9cippLW8qZCxsPW8qZi1hKmk7cmV0dXJuIG4ueD1jLG4ueT11LG4uej1sLG59O0FlLm1pZHBvaW50PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbi54PShlLngrdC54KSouNSxuLnk9KGUueSt0LnkpKi41LG4uej0oZS56K3QueikqLjUsbn07QWUuZnJvbURlZ3JlZXM9ZnVuY3Rpb24oZSx0LG4sbyxhKXtyZXR1cm4gZT1rLnRvUmFkaWFucyhlKSx0PWsudG9SYWRpYW5zKHQpLEFlLmZyb21SYWRpYW5zKGUsdCxuLG8sYSl9O21hPW5ldyBBZSxIYz1uZXcgQWU7QWUuX2VsbGlwc29pZFJhZGlpU3F1YXJlZD1uZXcgQWUoNjM3ODEzNyo2Mzc4MTM3LDYzNzgxMzcqNjM3ODEzNyw2MzU2NzUyMzE0MjQ1MTc5ZS05KjYzNTY3NTIzMTQyNDUxNzllLTkpO0FlLmZyb21SYWRpYW5zPWZ1bmN0aW9uKGUsdCxuLG8sYSl7bj1uPz8wO2xldCByPWcobyk/by5yYWRpaVNxdWFyZWQ6QWUuX2VsbGlwc29pZFJhZGlpU3F1YXJlZCxpPU1hdGguY29zKHQpO21hLng9aSpNYXRoLmNvcyhlKSxtYS55PWkqTWF0aC5zaW4oZSksbWEuej1NYXRoLnNpbih0KSxtYT1BZS5ub3JtYWxpemUobWEsbWEpLEFlLm11bHRpcGx5Q29tcG9uZW50cyhyLG1hLEhjKTtsZXQgZj1NYXRoLnNxcnQoQWUuZG90KG1hLEhjKSk7cmV0dXJuIEhjPUFlLmRpdmlkZUJ5U2NhbGFyKEhjLGYsSGMpLG1hPUFlLm11bHRpcGx5QnlTY2FsYXIobWEsbixtYSksZyhhKXx8KGE9bmV3IEFlKSxBZS5hZGQoSGMsbWEsYSl9O0FlLmZyb21EZWdyZWVzQXJyYXk9ZnVuY3Rpb24oZSx0LG4pe2xldCBvPWUubGVuZ3RoO2cobik/bi5sZW5ndGg9by8yOm49bmV3IEFycmF5KG8vMik7Zm9yKGxldCBhPTA7YTxvO2ErPTIpe2xldCByPWVbYV0saT1lW2ErMV0sZj1hLzI7bltmXT1BZS5mcm9tRGVncmVlcyhyLGksMCx0LG5bZl0pfXJldHVybiBufTtBZS5mcm9tUmFkaWFuc0FycmF5PWZ1bmN0aW9uKGUsdCxuKXtsZXQgbz1lLmxlbmd0aDtnKG4pP24ubGVuZ3RoPW8vMjpuPW5ldyBBcnJheShvLzIpO2ZvcihsZXQgYT0wO2E8bzthKz0yKXtsZXQgcj1lW2FdLGk9ZVthKzFdLGY9YS8yO25bZl09QWUuZnJvbVJhZGlhbnMocixpLDAsdCxuW2ZdKX1yZXR1cm4gbn07QWUuZnJvbURlZ3JlZXNBcnJheUhlaWdodHM9ZnVuY3Rpb24oZSx0LG4pe2xldCBvPWUubGVuZ3RoO2cobik/bi5sZW5ndGg9by8zOm49bmV3IEFycmF5KG8vMyk7Zm9yKGxldCBhPTA7YTxvO2ErPTMpe2xldCByPWVbYV0saT1lW2ErMV0sZj1lW2ErMl0sZD1hLzM7bltkXT1BZS5mcm9tRGVncmVlcyhyLGksZix0LG5bZF0pfXJldHVybiBufTtBZS5mcm9tUmFkaWFuc0FycmF5SGVpZ2h0cz1mdW5jdGlvbihlLHQsbil7bGV0IG89ZS5sZW5ndGg7ZyhuKT9uLmxlbmd0aD1vLzM6bj1uZXcgQXJyYXkoby8zKTtmb3IobGV0IGE9MDthPG87YSs9Myl7bGV0IHI9ZVthXSxpPWVbYSsxXSxmPWVbYSsyXSxkPWEvMztuW2RdPUFlLmZyb21SYWRpYW5zKHIsaSxmLHQsbltkXSl9cmV0dXJuIG59O0FlLlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgQWUoMCwwLDApKTtBZS5PTkU9T2JqZWN0LmZyZWV6ZShuZXcgQWUoMSwxLDEpKTtBZS5VTklUX1g9T2JqZWN0LmZyZWV6ZShuZXcgQWUoMSwwLDApKTtBZS5VTklUX1k9T2JqZWN0LmZyZWV6ZShuZXcgQWUoMCwxLDApKTtBZS5VTklUX1o9T2JqZWN0LmZyZWV6ZShuZXcgQWUoMCwwLDEpKTtBZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oZSl7cmV0dXJuIEFlLmNsb25lKHRoaXMsZSl9O0FlLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oZSl7cmV0dXJuIEFlLmVxdWFscyh0aGlzLGUpfTtBZS5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIEFlLmVxdWFsc0Vwc2lsb24odGhpcyxlLHQsbil9O0FlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzLnh9LCAke3RoaXMueX0sICR7dGhpcy56fSlgfTtzPUFlfSk7ZnVuY3Rpb24gZVMoZSx0LG4sbyxhKXtsZXQgcj1lLngsaT1lLnksZj1lLnosZD10LngsYz10LnksdT10LnosbD1yKnIqZCpkLGg9aSppKmMqYyxtPWYqZip1KnUsYj1sK2grbSxwPU1hdGguc3FydCgxL2IpLHk9cy5tdWx0aXBseUJ5U2NhbGFyKGUscCxRMik7aWYoYjxvKXJldHVybiBpc0Zpbml0ZShwKT9zLmNsb25lKHksYSk6dm9pZCAwO2xldCBfPW4ueCxBPW4ueSxFPW4ueixUPSQyO1QueD15LngqXyoyLFQueT15LnkqQSoyLFQuej15LnoqRSoyO2xldCBSPSgxLXApKnMubWFnbml0dWRlKGUpLyguNSpzLm1hZ25pdHVkZShUKSksQz0wLE0sTixQLEksdix3LHgsUyxGLEIsejtkb3tSLT1DLFA9MS8oMStSKl8pLEk9MS8oMStSKkEpLHY9MS8oMStSKkUpLHc9UCpQLHg9SSpJLFM9dip2LEY9dypQLEI9eCpJLHo9Uyp2LE09bCp3K2gqeCttKlMtMSxOPWwqRipfK2gqQipBK20qeipFO2xldCBEPS0yKk47Qz1NL0R9d2hpbGUoTWF0aC5hYnMoTSk+ay5FUFNJTE9OMTIpO3JldHVybiBnKGEpPyhhLng9cipQLGEueT1pKkksYS56PWYqdixhKTpuZXcgcyhyKlAsaSpJLGYqdil9dmFyIFEyLCQyLEt1LEltPVkoKCk9PntGZSgpO2ZlKCk7S2UoKTtRMj1uZXcgcywkMj1uZXcgcztLdT1lU30pO2Z1bmN0aW9uIHBuKGUsdCxuKXt0aGlzLmxvbmdpdHVkZT1lPz8wLHRoaXMubGF0aXR1ZGU9dD8/MCx0aGlzLmhlaWdodD1uPz8wfXZhciB0UyxuUyxvUyxyZSxJdD1ZKCgpPT57RmUoKTtmZSgpO0tlKCk7SW0oKTtwbi5mcm9tUmFkaWFucz1mdW5jdGlvbihlLHQsbixvKXtyZXR1cm4gbj1uPz8wLGcobyk/KG8ubG9uZ2l0dWRlPWUsby5sYXRpdHVkZT10LG8uaGVpZ2h0PW4sbyk6bmV3IHBuKGUsdCxuKX07cG4uZnJvbURlZ3JlZXM9ZnVuY3Rpb24oZSx0LG4sbyl7cmV0dXJuIGU9ay50b1JhZGlhbnMoZSksdD1rLnRvUmFkaWFucyh0KSxwbi5mcm9tUmFkaWFucyhlLHQsbixvKX07dFM9bmV3IHMsblM9bmV3IHMsb1M9bmV3IHM7cG4uX2VsbGlwc29pZE9uZU92ZXJSYWRpaT1uZXcgcygxLzYzNzgxMzcsMS82Mzc4MTM3LDEvNjM1Njc1MjMxNDI0NTE3OWUtOSk7cG4uX2VsbGlwc29pZE9uZU92ZXJSYWRpaVNxdWFyZWQ9bmV3IHMoMS8oNjM3ODEzNyo2Mzc4MTM3KSwxLyg2Mzc4MTM3KjYzNzgxMzcpLDEvKDYzNTY3NTIzMTQyNDUxNzllLTkqNjM1Njc1MjMxNDI0NTE3OWUtOSkpO3BuLl9lbGxpcHNvaWRDZW50ZXJUb2xlcmFuY2VTcXVhcmVkPWsuRVBTSUxPTjE7cG4uZnJvbUNhcnRlc2lhbj1mdW5jdGlvbihlLHQsbil7bGV0IG89Zyh0KT90Lm9uZU92ZXJSYWRpaTpwbi5fZWxsaXBzb2lkT25lT3ZlclJhZGlpLGE9Zyh0KT90Lm9uZU92ZXJSYWRpaVNxdWFyZWQ6cG4uX2VsbGlwc29pZE9uZU92ZXJSYWRpaVNxdWFyZWQscj1nKHQpP3QuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ6cG4uX2VsbGlwc29pZENlbnRlclRvbGVyYW5jZVNxdWFyZWQsaT1LdShlLG8sYSxyLG5TKTtpZighZyhpKSlyZXR1cm47bGV0IGY9cy5tdWx0aXBseUNvbXBvbmVudHMoaSxhLHRTKTtmPXMubm9ybWFsaXplKGYsZik7bGV0IGQ9cy5zdWJ0cmFjdChlLGksb1MpLGM9TWF0aC5hdGFuMihmLnksZi54KSx1PU1hdGguYXNpbihmLnopLGw9ay5zaWduKHMuZG90KGQsZSkpKnMubWFnbml0dWRlKGQpO3JldHVybiBnKG4pPyhuLmxvbmdpdHVkZT1jLG4ubGF0aXR1ZGU9dSxuLmhlaWdodD1sLG4pOm5ldyBwbihjLHUsbCl9O3BuLnRvQ2FydGVzaWFuPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gcy5mcm9tUmFkaWFucyhlLmxvbmdpdHVkZSxlLmxhdGl0dWRlLGUuaGVpZ2h0LHQsbil9O3BuLmNsb25lPWZ1bmN0aW9uKGUsdCl7aWYoZyhlKSlyZXR1cm4gZyh0KT8odC5sb25naXR1ZGU9ZS5sb25naXR1ZGUsdC5sYXRpdHVkZT1lLmxhdGl0dWRlLHQuaGVpZ2h0PWUuaGVpZ2h0LHQpOm5ldyBwbihlLmxvbmdpdHVkZSxlLmxhdGl0dWRlLGUuaGVpZ2h0KX07cG4uZXF1YWxzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10fHxnKGUpJiZnKHQpJiZlLmxvbmdpdHVkZT09PXQubG9uZ2l0dWRlJiZlLmxhdGl0dWRlPT09dC5sYXRpdHVkZSYmZS5oZWlnaHQ9PT10LmhlaWdodH07cG4uZXF1YWxzRXBzaWxvbj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG49bj8/MCxlPT09dHx8ZyhlKSYmZyh0KSYmTWF0aC5hYnMoZS5sb25naXR1ZGUtdC5sb25naXR1ZGUpPD1uJiZNYXRoLmFicyhlLmxhdGl0dWRlLXQubGF0aXR1ZGUpPD1uJiZNYXRoLmFicyhlLmhlaWdodC10LmhlaWdodCk8PW59O3BuLlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgcG4oMCwwLDApKTtwbi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHBuLmNsb25lKHRoaXMsZSl9O3BuLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHBuLmVxdWFscyh0aGlzLGUpfTtwbi5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbihlLHQpe3JldHVybiBwbi5lcXVhbHNFcHNpbG9uKHRoaXMsZSx0KX07cG4ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuYCgke3RoaXMubG9uZ2l0dWRlfSwgJHt0aGlzLmxhdGl0dWRlfSwgJHt0aGlzLmhlaWdodH0pYH07cmU9cG59KTtmdW5jdGlvbiB6ZShlLHQpe3RoaXMueD1lPz8wLHRoaXMueT10Pz8wfXZhciBxdSxLeSxxeSxXeSxhUyxYLFZ0PVkoKCk9PntmZSgpO0tlKCk7emUuZnJvbUVsZW1lbnRzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZyhuKT8obi54PWUsbi55PXQsbik6bmV3IHplKGUsdCl9O3plLmNsb25lPWZ1bmN0aW9uKGUsdCl7aWYoZyhlKSlyZXR1cm4gZyh0KT8odC54PWUueCx0Lnk9ZS55LHQpOm5ldyB6ZShlLngsZS55KX07emUuZnJvbUNhcnRlc2lhbjM9emUuY2xvbmU7emUuZnJvbUNhcnRlc2lhbjQ9emUuY2xvbmU7emUucGFja2VkTGVuZ3RoPTI7emUucGFjaz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG49bj8/MCx0W24rK109ZS54LHRbbl09ZS55LHR9O3plLnVucGFjaz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ9dD8/MCxnKG4pfHwobj1uZXcgemUpLG4ueD1lW3QrK10sbi55PWVbdF0sbn07emUucGFja0FycmF5PWZ1bmN0aW9uKGUsdCl7bGV0IG49ZS5sZW5ndGgsbz1uKjI7Zyh0KT8hQXJyYXkuaXNBcnJheSh0KSYmdC5sZW5ndGghPT1vfHx0Lmxlbmd0aCE9PW8mJih0Lmxlbmd0aD1vKTp0PW5ldyBBcnJheShvKTtmb3IobGV0IGE9MDthPG47KythKXplLnBhY2soZVthXSx0LGEqMik7cmV0dXJuIHR9O3plLnVucGFja0FycmF5PWZ1bmN0aW9uKGUsdCl7bGV0IG49ZS5sZW5ndGg7Zyh0KT90Lmxlbmd0aD1uLzI6dD1uZXcgQXJyYXkobi8yKTtmb3IobGV0IG89MDtvPG47bys9Mil7bGV0IGE9by8yO3RbYV09emUudW5wYWNrKGUsbyx0W2FdKX1yZXR1cm4gdH07emUuZnJvbUFycmF5PXplLnVucGFjazt6ZS5tYXhpbXVtQ29tcG9uZW50PWZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLm1heChlLngsZS55KX07emUubWluaW11bUNvbXBvbmVudD1mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5taW4oZS54LGUueSl9O3plLm1pbmltdW1CeUNvbXBvbmVudD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4ueD1NYXRoLm1pbihlLngsdC54KSxuLnk9TWF0aC5taW4oZS55LHQueSksbn07emUubWF4aW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbi54PU1hdGgubWF4KGUueCx0LngpLG4ueT1NYXRoLm1heChlLnksdC55KSxufTt6ZS5jbGFtcD1mdW5jdGlvbihlLHQsbixvKXtsZXQgYT1rLmNsYW1wKGUueCx0Lngsbi54KSxyPWsuY2xhbXAoZS55LHQueSxuLnkpO3JldHVybiBvLng9YSxvLnk9cixvfTt6ZS5tYWduaXR1ZGVTcXVhcmVkPWZ1bmN0aW9uKGUpe3JldHVybiBlLngqZS54K2UueSplLnl9O3plLm1hZ25pdHVkZT1mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5zcXJ0KHplLm1hZ25pdHVkZVNxdWFyZWQoZSkpfTtxdT1uZXcgemU7emUuZGlzdGFuY2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gemUuc3VidHJhY3QoZSx0LHF1KSx6ZS5tYWduaXR1ZGUocXUpfTt6ZS5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gemUuc3VidHJhY3QoZSx0LHF1KSx6ZS5tYWduaXR1ZGVTcXVhcmVkKHF1KX07emUubm9ybWFsaXplPWZ1bmN0aW9uKGUsdCl7bGV0IG49emUubWFnbml0dWRlKGUpO3JldHVybiB0Lng9ZS54L24sdC55PWUueS9uLHR9O3plLmRvdD1mdW5jdGlvbihlLHQpe3JldHVybiBlLngqdC54K2UueSp0Lnl9O3plLmNyb3NzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUueCp0LnktZS55KnQueH07emUubXVsdGlwbHlDb21wb25lbnRzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbi54PWUueCp0Lngsbi55PWUueSp0Lnksbn07emUuZGl2aWRlQ29tcG9uZW50cz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4ueD1lLngvdC54LG4ueT1lLnkvdC55LG59O3plLmFkZD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4ueD1lLngrdC54LG4ueT1lLnkrdC55LG59O3plLnN1YnRyYWN0PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbi54PWUueC10Lngsbi55PWUueS10Lnksbn07emUubXVsdGlwbHlCeVNjYWxhcj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4ueD1lLngqdCxuLnk9ZS55KnQsbn07emUuZGl2aWRlQnlTY2FsYXI9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuLng9ZS54L3Qsbi55PWUueS90LG59O3plLm5lZ2F0ZT1mdW5jdGlvbihlLHQpe3JldHVybiB0Lng9LWUueCx0Lnk9LWUueSx0fTt6ZS5hYnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC54PU1hdGguYWJzKGUueCksdC55PU1hdGguYWJzKGUueSksdH07S3k9bmV3IHplO3plLmxlcnA9ZnVuY3Rpb24oZSx0LG4sbyl7cmV0dXJuIHplLm11bHRpcGx5QnlTY2FsYXIodCxuLEt5KSxvPXplLm11bHRpcGx5QnlTY2FsYXIoZSwxLW4sbyksemUuYWRkKEt5LG8sbyl9O3F5PW5ldyB6ZSxXeT1uZXcgemU7emUuYW5nbGVCZXR3ZWVuPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHplLm5vcm1hbGl6ZShlLHF5KSx6ZS5ub3JtYWxpemUodCxXeSksay5hY29zQ2xhbXBlZCh6ZS5kb3QocXksV3kpKX07YVM9bmV3IHplO3plLm1vc3RPcnRob2dvbmFsQXhpcz1mdW5jdGlvbihlLHQpe2xldCBuPXplLm5vcm1hbGl6ZShlLGFTKTtyZXR1cm4gemUuYWJzKG4sbiksbi54PD1uLnk/dD16ZS5jbG9uZSh6ZS5VTklUX1gsdCk6dD16ZS5jbG9uZSh6ZS5VTklUX1ksdCksdH07emUuZXF1YWxzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10fHxnKGUpJiZnKHQpJiZlLng9PT10LngmJmUueT09PXQueX07emUuZXF1YWxzQXJyYXk9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLng9PT10W25dJiZlLnk9PT10W24rMV19O3plLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24oZSx0LG4sbyl7cmV0dXJuIGU9PT10fHxnKGUpJiZnKHQpJiZrLmVxdWFsc0Vwc2lsb24oZS54LHQueCxuLG8pJiZrLmVxdWFsc0Vwc2lsb24oZS55LHQueSxuLG8pfTt6ZS5aRVJPPU9iamVjdC5mcmVlemUobmV3IHplKDAsMCkpO3plLk9ORT1PYmplY3QuZnJlZXplKG5ldyB6ZSgxLDEpKTt6ZS5VTklUX1g9T2JqZWN0LmZyZWV6ZShuZXcgemUoMSwwKSk7emUuVU5JVF9ZPU9iamVjdC5mcmVlemUobmV3IHplKDAsMSkpO3plLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbihlKXtyZXR1cm4gemUuY2xvbmUodGhpcyxlKX07emUucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtyZXR1cm4gemUuZXF1YWxzKHRoaXMsZSl9O3plLnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gemUuZXF1YWxzRXBzaWxvbih0aGlzLGUsdCxuKX07emUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuYCgke3RoaXMueH0sICR7dGhpcy55fSlgfTtYPXplfSk7ZnVuY3Rpb24gWXkoZSx0LG4sbyl7dD10Pz8wLG49bj8/MCxvPW8/PzAsZS5fcmFkaWk9bmV3IHModCxuLG8pLGUuX3JhZGlpU3F1YXJlZD1uZXcgcyh0KnQsbipuLG8qbyksZS5fcmFkaWlUb1RoZUZvdXJ0aD1uZXcgcyh0KnQqdCp0LG4qbipuKm4sbypvKm8qbyksZS5fb25lT3ZlclJhZGlpPW5ldyBzKHQ9PT0wPzA6MS90LG49PT0wPzA6MS9uLG89PT0wPzA6MS9vKSxlLl9vbmVPdmVyUmFkaWlTcXVhcmVkPW5ldyBzKHQ9PT0wPzA6MS8odCp0KSxuPT09MD8wOjEvKG4qbiksbz09PTA/MDoxLyhvKm8pKSxlLl9taW5pbXVtUmFkaXVzPU1hdGgubWluKHQsbixvKSxlLl9tYXhpbXVtUmFkaXVzPU1hdGgubWF4KHQsbixvKSxlLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkPWsuRVBTSUxPTjEsZS5fcmFkaWlTcXVhcmVkLnohPT0wJiYoZS5fc3F1YXJlZFhPdmVyU3F1YXJlZFo9ZS5fcmFkaWlTcXVhcmVkLngvZS5fcmFkaWlTcXVhcmVkLnopfWZ1bmN0aW9uIEF0KGUsdCxuKXt0aGlzLl9yYWRpaT12b2lkIDAsdGhpcy5fcmFkaWlTcXVhcmVkPXZvaWQgMCx0aGlzLl9yYWRpaVRvVGhlRm91cnRoPXZvaWQgMCx0aGlzLl9vbmVPdmVyUmFkaWk9dm9pZCAwLHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQ9dm9pZCAwLHRoaXMuX21pbmltdW1SYWRpdXM9dm9pZCAwLHRoaXMuX21heGltdW1SYWRpdXM9dm9pZCAwLHRoaXMuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ9dm9pZCAwLHRoaXMuX3NxdWFyZWRYT3ZlclNxdWFyZWRaPXZvaWQgMCxZeSh0aGlzLGUsdCxuKX1mdW5jdGlvbiBYeShlLHQsbil7bGV0IG89LjUqKHQrZSksYT0uNSoodC1lKSxyPTA7Zm9yKGxldCBpPTA7aTw1O2krKyl7bGV0IGY9YSp1U1tpXTtyKz1sU1tpXSoobihvK2YpK24oby1mKSl9cmV0dXJuIHIqPWEscn12YXIgclMsaVMsY1Msc1MsZlMsZFMsdVMsbFMsVyxKZT1ZKCgpPT57VnQoKTtGZSgpO0l0KCk7ZmUoKTtLZSgpO0ltKCk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQXQucHJvdG90eXBlLHtyYWRpaTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpfX0scmFkaWlTcXVhcmVkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaWlTcXVhcmVkfX0scmFkaWlUb1RoZUZvdXJ0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpVG9UaGVGb3VydGh9fSxvbmVPdmVyUmFkaWk6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbmVPdmVyUmFkaWl9fSxvbmVPdmVyUmFkaWlTcXVhcmVkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25lT3ZlclJhZGlpU3F1YXJlZH19LG1pbmltdW1SYWRpdXM6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9taW5pbXVtUmFkaXVzfX0sbWF4aW11bVJhZGl1czp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heGltdW1SYWRpdXN9fX0pO0F0LmNsb25lPWZ1bmN0aW9uKGUsdCl7aWYoIWcoZSkpcmV0dXJuO2xldCBuPWUuX3JhZGlpO3JldHVybiBnKHQpPyhzLmNsb25lKG4sdC5fcmFkaWkpLHMuY2xvbmUoZS5fcmFkaWlTcXVhcmVkLHQuX3JhZGlpU3F1YXJlZCkscy5jbG9uZShlLl9yYWRpaVRvVGhlRm91cnRoLHQuX3JhZGlpVG9UaGVGb3VydGgpLHMuY2xvbmUoZS5fb25lT3ZlclJhZGlpLHQuX29uZU92ZXJSYWRpaSkscy5jbG9uZShlLl9vbmVPdmVyUmFkaWlTcXVhcmVkLHQuX29uZU92ZXJSYWRpaVNxdWFyZWQpLHQuX21pbmltdW1SYWRpdXM9ZS5fbWluaW11bVJhZGl1cyx0Ll9tYXhpbXVtUmFkaXVzPWUuX21heGltdW1SYWRpdXMsdC5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZD1lLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkLHQpOm5ldyBBdChuLngsbi55LG4ueil9O0F0LmZyb21DYXJ0ZXNpYW4zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGcodCl8fCh0PW5ldyBBdCksZyhlKSYmWXkodCxlLngsZS55LGUueiksdH07QXQuV0dTODQ9T2JqZWN0LmZyZWV6ZShuZXcgQXQoNjM3ODEzNyw2Mzc4MTM3LDYzNTY3NTIzMTQyNDUxNzllLTkpKTtBdC5VTklUX1NQSEVSRT1PYmplY3QuZnJlZXplKG5ldyBBdCgxLDEsMSkpO0F0Lk1PT049T2JqZWN0LmZyZWV6ZShuZXcgQXQoay5MVU5BUl9SQURJVVMsay5MVU5BUl9SQURJVVMsay5MVU5BUl9SQURJVVMpKTtBdC5NQVJTPU9iamVjdC5mcmVlemUobmV3IEF0KDMzOTYxOTAsMzM5NjE5MCwzMzc2MjAwKSk7QXQuX2RlZmF1bHQ9QXQuV0dTODQ7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQXQse2RlZmF1bHQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBBdC5fZGVmYXVsdH0sc2V0OmZ1bmN0aW9uKGUpe0F0Ll9kZWZhdWx0PWUscy5fZWxsaXBzb2lkUmFkaWlTcXVhcmVkPWUucmFkaWlTcXVhcmVkLHJlLl9lbGxpcHNvaWRPbmVPdmVyUmFkaWk9ZS5vbmVPdmVyUmFkaWkscmUuX2VsbGlwc29pZE9uZU92ZXJSYWRpaVNxdWFyZWQ9ZS5vbmVPdmVyUmFkaWlTcXVhcmVkLHJlLl9lbGxpcHNvaWRDZW50ZXJUb2xlcmFuY2VTcXVhcmVkPWUuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWR9fX0pO0F0LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbihlKXtyZXR1cm4gQXQuY2xvbmUodGhpcyxlKX07QXQucGFja2VkTGVuZ3RoPXMucGFja2VkTGVuZ3RoO0F0LnBhY2s9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuPW4/PzAscy5wYWNrKGUuX3JhZGlpLHQsbiksdH07QXQudW5wYWNrPWZ1bmN0aW9uKGUsdCxuKXt0PXQ/PzA7bGV0IG89cy51bnBhY2soZSx0KTtyZXR1cm4gQXQuZnJvbUNhcnRlc2lhbjMobyxuKX07QXQucHJvdG90eXBlLmdlb2NlbnRyaWNTdXJmYWNlTm9ybWFsPXMubm9ybWFsaXplO0F0LnByb3RvdHlwZS5nZW9kZXRpY1N1cmZhY2VOb3JtYWxDYXJ0b2dyYXBoaWM9ZnVuY3Rpb24oZSx0KXtsZXQgbj1lLmxvbmdpdHVkZSxvPWUubGF0aXR1ZGUsYT1NYXRoLmNvcyhvKSxyPWEqTWF0aC5jb3MobiksaT1hKk1hdGguc2luKG4pLGY9TWF0aC5zaW4obyk7cmV0dXJuIGcodCl8fCh0PW5ldyBzKSx0Lng9cix0Lnk9aSx0Lno9ZixzLm5vcm1hbGl6ZSh0LHQpfTtBdC5wcm90b3R5cGUuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsPWZ1bmN0aW9uKGUsdCl7aWYoIXMuZXF1YWxzRXBzaWxvbihlLHMuWkVSTyxrLkVQU0lMT04xNCkpcmV0dXJuIGcodCl8fCh0PW5ldyBzKSx0PXMubXVsdGlwbHlDb21wb25lbnRzKGUsdGhpcy5fb25lT3ZlclJhZGlpU3F1YXJlZCx0KSxzLm5vcm1hbGl6ZSh0LHQpfTtyUz1uZXcgcyxpUz1uZXcgcztBdC5wcm90b3R5cGUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW49ZnVuY3Rpb24oZSx0KXtsZXQgbj1yUyxvPWlTO3RoaXMuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsQ2FydG9ncmFwaGljKGUsbikscy5tdWx0aXBseUNvbXBvbmVudHModGhpcy5fcmFkaWlTcXVhcmVkLG4sbyk7bGV0IGE9TWF0aC5zcXJ0KHMuZG90KG4sbykpO3JldHVybiBzLmRpdmlkZUJ5U2NhbGFyKG8sYSxvKSxzLm11bHRpcGx5QnlTY2FsYXIobixlLmhlaWdodCxuKSxnKHQpfHwodD1uZXcgcykscy5hZGQobyxuLHQpfTtBdC5wcm90b3R5cGUuY2FydG9ncmFwaGljQXJyYXlUb0NhcnRlc2lhbkFycmF5PWZ1bmN0aW9uKGUsdCl7bGV0IG49ZS5sZW5ndGg7Zyh0KT90Lmxlbmd0aD1uOnQ9bmV3IEFycmF5KG4pO2ZvcihsZXQgbz0wO288bjtvKyspdFtvXT10aGlzLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGVbb10sdFtvXSk7cmV0dXJuIHR9O2NTPW5ldyBzLHNTPW5ldyBzLGZTPW5ldyBzO0F0LnByb3RvdHlwZS5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYz1mdW5jdGlvbihlLHQpe2xldCBuPXRoaXMuc2NhbGVUb0dlb2RldGljU3VyZmFjZShlLHNTKTtpZighZyhuKSlyZXR1cm47bGV0IG89dGhpcy5nZW9kZXRpY1N1cmZhY2VOb3JtYWwobixjUyksYT1zLnN1YnRyYWN0KGUsbixmUykscj1NYXRoLmF0YW4yKG8ueSxvLngpLGk9TWF0aC5hc2luKG8ueiksZj1rLnNpZ24ocy5kb3QoYSxlKSkqcy5tYWduaXR1ZGUoYSk7cmV0dXJuIGcodCk/KHQubG9uZ2l0dWRlPXIsdC5sYXRpdHVkZT1pLHQuaGVpZ2h0PWYsdCk6bmV3IHJlKHIsaSxmKX07QXQucHJvdG90eXBlLmNhcnRlc2lhbkFycmF5VG9DYXJ0b2dyYXBoaWNBcnJheT1mdW5jdGlvbihlLHQpe2xldCBuPWUubGVuZ3RoO2codCk/dC5sZW5ndGg9bjp0PW5ldyBBcnJheShuKTtmb3IobGV0IG89MDtvPG47KytvKXRbb109dGhpcy5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhlW29dLHRbb10pO3JldHVybiB0fTtBdC5wcm90b3R5cGUuc2NhbGVUb0dlb2RldGljU3VyZmFjZT1mdW5jdGlvbihlLHQpe3JldHVybiBLdShlLHRoaXMuX29uZU92ZXJSYWRpaSx0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkLHRoaXMuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQsdCl9O0F0LnByb3RvdHlwZS5zY2FsZVRvR2VvY2VudHJpY1N1cmZhY2U9ZnVuY3Rpb24oZSx0KXtnKHQpfHwodD1uZXcgcyk7bGV0IG49ZS54LG89ZS55LGE9ZS56LHI9dGhpcy5fb25lT3ZlclJhZGlpU3F1YXJlZCxpPTEvTWF0aC5zcXJ0KG4qbipyLngrbypvKnIueSthKmEqci56KTtyZXR1cm4gcy5tdWx0aXBseUJ5U2NhbGFyKGUsaSx0KX07QXQucHJvdG90eXBlLnRyYW5zZm9ybVBvc2l0aW9uVG9TY2FsZWRTcGFjZT1mdW5jdGlvbihlLHQpe3JldHVybiBnKHQpfHwodD1uZXcgcykscy5tdWx0aXBseUNvbXBvbmVudHMoZSx0aGlzLl9vbmVPdmVyUmFkaWksdCl9O0F0LnByb3RvdHlwZS50cmFuc2Zvcm1Qb3NpdGlvbkZyb21TY2FsZWRTcGFjZT1mdW5jdGlvbihlLHQpe3JldHVybiBnKHQpfHwodD1uZXcgcykscy5tdWx0aXBseUNvbXBvbmVudHMoZSx0aGlzLl9yYWRpaSx0KX07QXQucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcz09PWV8fGcoZSkmJnMuZXF1YWxzKHRoaXMuX3JhZGlpLGUuX3JhZGlpKX07QXQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpLnRvU3RyaW5nKCl9O0F0LnByb3RvdHlwZS5nZXRTdXJmYWNlTm9ybWFsSW50ZXJzZWN0aW9uV2l0aFpBeGlzPWZ1bmN0aW9uKGUsdCxuKXt0PXQ/PzA7bGV0IG89dGhpcy5fc3F1YXJlZFhPdmVyU3F1YXJlZFo7aWYoZyhuKXx8KG49bmV3IHMpLG4ueD0wLG4ueT0wLG4uej1lLnoqKDEtbyksIShNYXRoLmFicyhuLnopPj10aGlzLl9yYWRpaS56LXQpKXJldHVybiBufTtkUz1uZXcgcztBdC5wcm90b3R5cGUuZ2V0TG9jYWxDdXJ2YXR1cmU9ZnVuY3Rpb24oZSx0KXtnKHQpfHwodD1uZXcgWCk7bGV0IG49dGhpcy5nZXRTdXJmYWNlTm9ybWFsSW50ZXJzZWN0aW9uV2l0aFpBeGlzKGUsMCxkUyksbz1zLmRpc3RhbmNlKGUsbiksYT10aGlzLm1pbmltdW1SYWRpdXMqby90aGlzLm1heGltdW1SYWRpdXMqKjIscj1vKmEqKjI7cmV0dXJuIFguZnJvbUVsZW1lbnRzKDEvbywxL3IsdCl9O3VTPVsuMTQ4ODc0MzM4OTgxNjMsLjQzMzM5NTM5NDEyOTI1LC42Nzk0MDk1NjgyOTkwMiwuODY1MDYzMzY2Njg4OTgsLjk3MzkwNjUyODUxNzE3LDBdLGxTPVsuMjk1NTI0MjI0NzE0NzUsLjI2OTI2NjcxOTMwOTk5LC4yMTkwODYzNjI1MTU5OCwuMTQ5NDUxMzQ5MTUwNTgsLjA2NjY3MTM0NDMwODY4NCwwXTtBdC5wcm90b3R5cGUuc3VyZmFjZUFyZWE9ZnVuY3Rpb24oZSl7bGV0IHQ9ZS53ZXN0LG49ZS5lYXN0LG89ZS5zb3V0aCxhPWUubm9ydGg7Zm9yKDtuPHQ7KW4rPWsuVFdPX1BJO2xldCByPXRoaXMuX3JhZGlpU3F1YXJlZCxpPXIueCxmPXIueSxkPXIueixjPWkqZjtyZXR1cm4gWHkobyxhLGZ1bmN0aW9uKHUpe2xldCBsPU1hdGguY29zKHUpLGg9TWF0aC5zaW4odSk7cmV0dXJuIE1hdGguY29zKHUpKlh5KHQsbixmdW5jdGlvbihtKXtsZXQgYj1NYXRoLmNvcyhtKSxwPU1hdGguc2luKG0pO3JldHVybiBNYXRoLnNxcnQoYypoKmgrZCooZipiKmIraSpwKnApKmwqbCl9KX0pfTtXPUF0fSk7ZnVuY3Rpb24gV3UoZSl7dGhpcy5fZWxsaXBzb2lkPWU/P1cuZGVmYXVsdCx0aGlzLl9zZW1pbWFqb3JBeGlzPXRoaXMuX2VsbGlwc29pZC5tYXhpbXVtUmFkaXVzLHRoaXMuX29uZU92ZXJTZW1pbWFqb3JBeGlzPTEvdGhpcy5fc2VtaW1ham9yQXhpc312YXIgcm8sQ3I9WSgoKT0+e0ZlKCk7SXQoKTtmZSgpO0plKCk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoV3UucHJvdG90eXBlLHtlbGxpcHNvaWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbGxpcHNvaWR9fX0pO1d1LnByb3RvdHlwZS5wcm9qZWN0PWZ1bmN0aW9uKGUsdCl7bGV0IG49dGhpcy5fc2VtaW1ham9yQXhpcyxvPWUubG9uZ2l0dWRlKm4sYT1lLmxhdGl0dWRlKm4scj1lLmhlaWdodDtyZXR1cm4gZyh0KT8odC54PW8sdC55PWEsdC56PXIsdCk6bmV3IHMobyxhLHIpfTtXdS5wcm90b3R5cGUudW5wcm9qZWN0PWZ1bmN0aW9uKGUsdCl7bGV0IG49dGhpcy5fb25lT3ZlclNlbWltYWpvckF4aXMsbz1lLngqbixhPWUueSpuLHI9ZS56O3JldHVybiBnKHQpPyh0LmxvbmdpdHVkZT1vLHQubGF0aXR1ZGU9YSx0LmhlaWdodD1yLHQpOm5ldyByZShvLGEscil9O3JvPVd1fSk7dmFyIGhTLFNuLEdpPVkoKCk9PntoUz17T1VUU0lERTotMSxJTlRFUlNFQ1RJTkc6MCxJTlNJREU6MX0sU249T2JqZWN0LmZyZWV6ZShoUyl9KTtmdW5jdGlvbiBtUyhlLHQpe3RoaXMuc3RhcnQ9ZT8/MCx0aGlzLnN0b3A9dD8/MH12YXIgJGEsWHU9WSgoKT0+eyRhPW1TfSk7ZnVuY3Rpb24gRWUoZSx0LG4sbyxhLHIsaSxmLGQpe3RoaXNbMF09ZT8/MCx0aGlzWzFdPW8/PzAsdGhpc1syXT1pPz8wLHRoaXNbM109dD8/MCx0aGlzWzRdPWE/PzAsdGhpc1s1XT1mPz8wLHRoaXNbNl09bj8/MCx0aGlzWzddPXI/PzAsdGhpc1s4XT1kPz8wfWZ1bmN0aW9uIHlTKGUpe2xldCB0PTA7Zm9yKGxldCBuPTA7bjw5Oysrbil7bGV0IG89ZVtuXTt0Kz1vKm99cmV0dXJuIE1hdGguc3FydCh0KX1mdW5jdGlvbiBBUyhlKXtsZXQgdD0wO2ZvcihsZXQgbj0wO248MzsrK24pe2xldCBvPWVbRWUuZ2V0RWxlbWVudEluZGV4KHZtW25dLGttW25dKV07dCs9MipvKm99cmV0dXJuIE1hdGguc3FydCh0KX1mdW5jdGlvbiB3UyhlLHQpe2xldCBuPWsuRVBTSUxPTjE1LG89MCxhPTE7Zm9yKGxldCBjPTA7YzwzOysrYyl7bGV0IHU9TWF0aC5hYnMoZVtFZS5nZXRFbGVtZW50SW5kZXgodm1bY10sa21bY10pXSk7dT5vJiYoYT1jLG89dSl9bGV0IHI9MSxpPTAsZj1rbVthXSxkPXZtW2FdO2lmKE1hdGguYWJzKGVbRWUuZ2V0RWxlbWVudEluZGV4KGQsZildKT5uKXtsZXQgYz1lW0VlLmdldEVsZW1lbnRJbmRleChkLGQpXSx1PWVbRWUuZ2V0RWxlbWVudEluZGV4KGYsZildLGw9ZVtFZS5nZXRFbGVtZW50SW5kZXgoZCxmKV0saD0oYy11KS8yL2wsbTtoPDA/bT0tMS8oLWgrTWF0aC5zcXJ0KDEraCpoKSk6bT0xLyhoK01hdGguc3FydCgxK2gqaCkpLHI9MS9NYXRoLnNxcnQoMSttKm0pLGk9bSpyfXJldHVybiB0PUVlLmNsb25lKEVlLklERU5USVRZLHQpLHRbRWUuZ2V0RWxlbWVudEluZGV4KGYsZildPXRbRWUuZ2V0RWxlbWVudEluZGV4KGQsZCldPXIsdFtFZS5nZXRFbGVtZW50SW5kZXgoZCxmKV09aSx0W0VlLmdldEVsZW1lbnRJbmRleChmLGQpXT0taSx0fXZhciBiUyxwUyxQbSxKeSxfUyxnUyxrbSx2bSxZdSxaeSxFUyxKLFVuPVkoKCk9PntGZSgpO2ZlKCk7S2UoKTtFZS5wYWNrZWRMZW5ndGg9OTtFZS5wYWNrPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj1uPz8wLHRbbisrXT1lWzBdLHRbbisrXT1lWzFdLHRbbisrXT1lWzJdLHRbbisrXT1lWzNdLHRbbisrXT1lWzRdLHRbbisrXT1lWzVdLHRbbisrXT1lWzZdLHRbbisrXT1lWzddLHRbbisrXT1lWzhdLHR9O0VlLnVucGFjaz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ9dD8/MCxnKG4pfHwobj1uZXcgRWUpLG5bMF09ZVt0KytdLG5bMV09ZVt0KytdLG5bMl09ZVt0KytdLG5bM109ZVt0KytdLG5bNF09ZVt0KytdLG5bNV09ZVt0KytdLG5bNl09ZVt0KytdLG5bN109ZVt0KytdLG5bOF09ZVt0KytdLG59O0VlLnBhY2tBcnJheT1mdW5jdGlvbihlLHQpe2xldCBuPWUubGVuZ3RoLG89bio5O2codCk/IUFycmF5LmlzQXJyYXkodCkmJnQubGVuZ3RoIT09b3x8dC5sZW5ndGghPT1vJiYodC5sZW5ndGg9byk6dD1uZXcgQXJyYXkobyk7Zm9yKGxldCBhPTA7YTxuOysrYSlFZS5wYWNrKGVbYV0sdCxhKjkpO3JldHVybiB0fTtFZS51bnBhY2tBcnJheT1mdW5jdGlvbihlLHQpe2xldCBuPWUubGVuZ3RoO2codCk/dC5sZW5ndGg9bi85OnQ9bmV3IEFycmF5KG4vOSk7Zm9yKGxldCBvPTA7bzxuO28rPTkpe2xldCBhPW8vOTt0W2FdPUVlLnVucGFjayhlLG8sdFthXSl9cmV0dXJuIHR9O0VlLmNsb25lPWZ1bmN0aW9uKGUsdCl7aWYoZyhlKSlyZXR1cm4gZyh0KT8odFswXT1lWzBdLHRbMV09ZVsxXSx0WzJdPWVbMl0sdFszXT1lWzNdLHRbNF09ZVs0XSx0WzVdPWVbNV0sdFs2XT1lWzZdLHRbN109ZVs3XSx0WzhdPWVbOF0sdCk6bmV3IEVlKGVbMF0sZVszXSxlWzZdLGVbMV0sZVs0XSxlWzddLGVbMl0sZVs1XSxlWzhdKX07RWUuZnJvbUFycmF5PUVlLnVucGFjaztFZS5mcm9tQ29sdW1uTWFqb3JBcnJheT1mdW5jdGlvbihlLHQpe3JldHVybiBFZS5jbG9uZShlLHQpfTtFZS5mcm9tUm93TWFqb3JBcnJheT1mdW5jdGlvbihlLHQpe3JldHVybiBnKHQpPyh0WzBdPWVbMF0sdFsxXT1lWzNdLHRbMl09ZVs2XSx0WzNdPWVbMV0sdFs0XT1lWzRdLHRbNV09ZVs3XSx0WzZdPWVbMl0sdFs3XT1lWzVdLHRbOF09ZVs4XSx0KTpuZXcgRWUoZVswXSxlWzFdLGVbMl0sZVszXSxlWzRdLGVbNV0sZVs2XSxlWzddLGVbOF0pfTtFZS5mcm9tUXVhdGVybmlvbj1mdW5jdGlvbihlLHQpe2xldCBuPWUueCplLngsbz1lLngqZS55LGE9ZS54KmUueixyPWUueCplLncsaT1lLnkqZS55LGY9ZS55KmUueixkPWUueSplLncsYz1lLnoqZS56LHU9ZS56KmUudyxsPWUudyplLncsaD1uLWktYytsLG09Miooby11KSxiPTIqKGErZCkscD0yKihvK3UpLHk9LW4raS1jK2wsXz0yKihmLXIpLEE9MiooYS1kKSxFPTIqKGYrciksVD0tbi1pK2MrbDtyZXR1cm4gZyh0KT8odFswXT1oLHRbMV09cCx0WzJdPUEsdFszXT1tLHRbNF09eSx0WzVdPUUsdFs2XT1iLHRbN109Xyx0WzhdPVQsdCk6bmV3IEVlKGgsbSxiLHAseSxfLEEsRSxUKX07RWUuZnJvbUhlYWRpbmdQaXRjaFJvbGw9ZnVuY3Rpb24oZSx0KXtsZXQgbj1NYXRoLmNvcygtZS5waXRjaCksbz1NYXRoLmNvcygtZS5oZWFkaW5nKSxhPU1hdGguY29zKGUucm9sbCkscj1NYXRoLnNpbigtZS5waXRjaCksaT1NYXRoLnNpbigtZS5oZWFkaW5nKSxmPU1hdGguc2luKGUucm9sbCksZD1uKm8sYz0tYSppK2YqcipvLHU9ZippK2EqcipvLGw9bippLGg9YSpvK2YqcippLG09LWYqbythKnIqaSxiPS1yLHA9ZipuLHk9YSpuO3JldHVybiBnKHQpPyh0WzBdPWQsdFsxXT1sLHRbMl09Yix0WzNdPWMsdFs0XT1oLHRbNV09cCx0WzZdPXUsdFs3XT1tLHRbOF09eSx0KTpuZXcgRWUoZCxjLHUsbCxoLG0sYixwLHkpfTtFZS5mcm9tU2NhbGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZyh0KT8odFswXT1lLngsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT1lLnksdFs1XT0wLHRbNl09MCx0WzddPTAsdFs4XT1lLnosdCk6bmV3IEVlKGUueCwwLDAsMCxlLnksMCwwLDAsZS56KX07RWUuZnJvbVVuaWZvcm1TY2FsZT1mdW5jdGlvbihlLHQpe3JldHVybiBnKHQpPyh0WzBdPWUsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT1lLHRbNV09MCx0WzZdPTAsdFs3XT0wLHRbOF09ZSx0KTpuZXcgRWUoZSwwLDAsMCxlLDAsMCwwLGUpfTtFZS5mcm9tQ3Jvc3NQcm9kdWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGcodCk/KHRbMF09MCx0WzFdPWUueix0WzJdPS1lLnksdFszXT0tZS56LHRbNF09MCx0WzVdPWUueCx0WzZdPWUueSx0WzddPS1lLngsdFs4XT0wLHQpOm5ldyBFZSgwLC1lLnosZS55LGUueiwwLC1lLngsLWUueSxlLngsMCl9O0VlLmZyb21Sb3RhdGlvblg9ZnVuY3Rpb24oZSx0KXtsZXQgbj1NYXRoLmNvcyhlKSxvPU1hdGguc2luKGUpO3JldHVybiBnKHQpPyh0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT1uLHRbNV09byx0WzZdPTAsdFs3XT0tbyx0WzhdPW4sdCk6bmV3IEVlKDEsMCwwLDAsbiwtbywwLG8sbil9O0VlLmZyb21Sb3RhdGlvblk9ZnVuY3Rpb24oZSx0KXtsZXQgbj1NYXRoLmNvcyhlKSxvPU1hdGguc2luKGUpO3JldHVybiBnKHQpPyh0WzBdPW4sdFsxXT0wLHRbMl09LW8sdFszXT0wLHRbNF09MSx0WzVdPTAsdFs2XT1vLHRbN109MCx0WzhdPW4sdCk6bmV3IEVlKG4sMCxvLDAsMSwwLC1vLDAsbil9O0VlLmZyb21Sb3RhdGlvblo9ZnVuY3Rpb24oZSx0KXtsZXQgbj1NYXRoLmNvcyhlKSxvPU1hdGguc2luKGUpO3JldHVybiBnKHQpPyh0WzBdPW4sdFsxXT1vLHRbMl09MCx0WzNdPS1vLHRbNF09bix0WzVdPTAsdFs2XT0wLHRbN109MCx0WzhdPTEsdCk6bmV3IEVlKG4sLW8sMCxvLG4sMCwwLDAsMSl9O0VlLnRvQXJyYXk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZyh0KT8odFswXT1lWzBdLHRbMV09ZVsxXSx0WzJdPWVbMl0sdFszXT1lWzNdLHRbNF09ZVs0XSx0WzVdPWVbNV0sdFs2XT1lWzZdLHRbN109ZVs3XSx0WzhdPWVbOF0sdCk6W2VbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSxlWzVdLGVbNl0sZVs3XSxlWzhdXX07RWUuZ2V0RWxlbWVudEluZGV4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUqMyt0fTtFZS5nZXRDb2x1bW49ZnVuY3Rpb24oZSx0LG4pe2xldCBvPXQqMyxhPWVbb10scj1lW28rMV0saT1lW28rMl07cmV0dXJuIG4ueD1hLG4ueT1yLG4uej1pLG59O0VlLnNldENvbHVtbj1mdW5jdGlvbihlLHQsbixvKXtvPUVlLmNsb25lKGUsbyk7bGV0IGE9dCozO3JldHVybiBvW2FdPW4ueCxvW2ErMV09bi55LG9bYSsyXT1uLnosb307RWUuZ2V0Um93PWZ1bmN0aW9uKGUsdCxuKXtsZXQgbz1lW3RdLGE9ZVt0KzNdLHI9ZVt0KzZdO3JldHVybiBuLng9byxuLnk9YSxuLno9cixufTtFZS5zZXRSb3c9ZnVuY3Rpb24oZSx0LG4sbyl7cmV0dXJuIG89RWUuY2xvbmUoZSxvKSxvW3RdPW4ueCxvW3QrM109bi55LG9bdCs2XT1uLnosb307YlM9bmV3IHM7RWUuc2V0U2NhbGU9ZnVuY3Rpb24oZSx0LG4pe2xldCBvPUVlLmdldFNjYWxlKGUsYlMpLGE9dC54L28ueCxyPXQueS9vLnksaT10Lnovby56O3JldHVybiBuWzBdPWVbMF0qYSxuWzFdPWVbMV0qYSxuWzJdPWVbMl0qYSxuWzNdPWVbM10qcixuWzRdPWVbNF0qcixuWzVdPWVbNV0qcixuWzZdPWVbNl0qaSxuWzddPWVbN10qaSxuWzhdPWVbOF0qaSxufTtwUz1uZXcgcztFZS5zZXRVbmlmb3JtU2NhbGU9ZnVuY3Rpb24oZSx0LG4pe2xldCBvPUVlLmdldFNjYWxlKGUscFMpLGE9dC9vLngscj10L28ueSxpPXQvby56O3JldHVybiBuWzBdPWVbMF0qYSxuWzFdPWVbMV0qYSxuWzJdPWVbMl0qYSxuWzNdPWVbM10qcixuWzRdPWVbNF0qcixuWzVdPWVbNV0qcixuWzZdPWVbNl0qaSxuWzddPWVbN10qaSxuWzhdPWVbOF0qaSxufTtQbT1uZXcgcztFZS5nZXRTY2FsZT1mdW5jdGlvbihlLHQpe3JldHVybiB0Lng9cy5tYWduaXR1ZGUocy5mcm9tRWxlbWVudHMoZVswXSxlWzFdLGVbMl0sUG0pKSx0Lnk9cy5tYWduaXR1ZGUocy5mcm9tRWxlbWVudHMoZVszXSxlWzRdLGVbNV0sUG0pKSx0Lno9cy5tYWduaXR1ZGUocy5mcm9tRWxlbWVudHMoZVs2XSxlWzddLGVbOF0sUG0pKSx0fTtKeT1uZXcgcztFZS5nZXRNYXhpbXVtU2NhbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIEVlLmdldFNjYWxlKGUsSnkpLHMubWF4aW11bUNvbXBvbmVudChKeSl9O19TPW5ldyBzO0VlLnNldFJvdGF0aW9uPWZ1bmN0aW9uKGUsdCxuKXtsZXQgbz1FZS5nZXRTY2FsZShlLF9TKTtyZXR1cm4gblswXT10WzBdKm8ueCxuWzFdPXRbMV0qby54LG5bMl09dFsyXSpvLngsblszXT10WzNdKm8ueSxuWzRdPXRbNF0qby55LG5bNV09dFs1XSpvLnksbls2XT10WzZdKm8ueixuWzddPXRbN10qby56LG5bOF09dFs4XSpvLnosbn07Z1M9bmV3IHM7RWUuZ2V0Um90YXRpb249ZnVuY3Rpb24oZSx0KXtsZXQgbj1FZS5nZXRTY2FsZShlLGdTKTtyZXR1cm4gdFswXT1lWzBdL24ueCx0WzFdPWVbMV0vbi54LHRbMl09ZVsyXS9uLngsdFszXT1lWzNdL24ueSx0WzRdPWVbNF0vbi55LHRbNV09ZVs1XS9uLnksdFs2XT1lWzZdL24ueix0WzddPWVbN10vbi56LHRbOF09ZVs4XS9uLnosdH07RWUubXVsdGlwbHk9ZnVuY3Rpb24oZSx0LG4pe2xldCBvPWVbMF0qdFswXStlWzNdKnRbMV0rZVs2XSp0WzJdLGE9ZVsxXSp0WzBdK2VbNF0qdFsxXStlWzddKnRbMl0scj1lWzJdKnRbMF0rZVs1XSp0WzFdK2VbOF0qdFsyXSxpPWVbMF0qdFszXStlWzNdKnRbNF0rZVs2XSp0WzVdLGY9ZVsxXSp0WzNdK2VbNF0qdFs0XStlWzddKnRbNV0sZD1lWzJdKnRbM10rZVs1XSp0WzRdK2VbOF0qdFs1XSxjPWVbMF0qdFs2XStlWzNdKnRbN10rZVs2XSp0WzhdLHU9ZVsxXSp0WzZdK2VbNF0qdFs3XStlWzddKnRbOF0sbD1lWzJdKnRbNl0rZVs1XSp0WzddK2VbOF0qdFs4XTtyZXR1cm4gblswXT1vLG5bMV09YSxuWzJdPXIsblszXT1pLG5bNF09ZixuWzVdPWQsbls2XT1jLG5bN109dSxuWzhdPWwsbn07RWUuYWRkPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gblswXT1lWzBdK3RbMF0sblsxXT1lWzFdK3RbMV0sblsyXT1lWzJdK3RbMl0sblszXT1lWzNdK3RbM10sbls0XT1lWzRdK3RbNF0sbls1XT1lWzVdK3RbNV0sbls2XT1lWzZdK3RbNl0sbls3XT1lWzddK3RbN10sbls4XT1lWzhdK3RbOF0sbn07RWUuc3VidHJhY3Q9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuWzBdPWVbMF0tdFswXSxuWzFdPWVbMV0tdFsxXSxuWzJdPWVbMl0tdFsyXSxuWzNdPWVbM10tdFszXSxuWzRdPWVbNF0tdFs0XSxuWzVdPWVbNV0tdFs1XSxuWzZdPWVbNl0tdFs2XSxuWzddPWVbN10tdFs3XSxuWzhdPWVbOF0tdFs4XSxufTtFZS5tdWx0aXBseUJ5VmVjdG9yPWZ1bmN0aW9uKGUsdCxuKXtsZXQgbz10LngsYT10Lnkscj10LnosaT1lWzBdKm8rZVszXSphK2VbNl0qcixmPWVbMV0qbytlWzRdKmErZVs3XSpyLGQ9ZVsyXSpvK2VbNV0qYStlWzhdKnI7cmV0dXJuIG4ueD1pLG4ueT1mLG4uej1kLG59O0VlLm11bHRpcGx5QnlTY2FsYXI9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuWzBdPWVbMF0qdCxuWzFdPWVbMV0qdCxuWzJdPWVbMl0qdCxuWzNdPWVbM10qdCxuWzRdPWVbNF0qdCxuWzVdPWVbNV0qdCxuWzZdPWVbNl0qdCxuWzddPWVbN10qdCxuWzhdPWVbOF0qdCxufTtFZS5tdWx0aXBseUJ5U2NhbGU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuWzBdPWVbMF0qdC54LG5bMV09ZVsxXSp0LngsblsyXT1lWzJdKnQueCxuWzNdPWVbM10qdC55LG5bNF09ZVs0XSp0Lnksbls1XT1lWzVdKnQueSxuWzZdPWVbNl0qdC56LG5bN109ZVs3XSp0Lnosbls4XT1lWzhdKnQueixufTtFZS5tdWx0aXBseUJ5VW5pZm9ybVNjYWxlPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gblswXT1lWzBdKnQsblsxXT1lWzFdKnQsblsyXT1lWzJdKnQsblszXT1lWzNdKnQsbls0XT1lWzRdKnQsbls1XT1lWzVdKnQsbls2XT1lWzZdKnQsbls3XT1lWzddKnQsbls4XT1lWzhdKnQsbn07RWUubmVnYXRlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRbMF09LWVbMF0sdFsxXT0tZVsxXSx0WzJdPS1lWzJdLHRbM109LWVbM10sdFs0XT0tZVs0XSx0WzVdPS1lWzVdLHRbNl09LWVbNl0sdFs3XT0tZVs3XSx0WzhdPS1lWzhdLHR9O0VlLnRyYW5zcG9zZT1mdW5jdGlvbihlLHQpe2xldCBuPWVbMF0sbz1lWzNdLGE9ZVs2XSxyPWVbMV0saT1lWzRdLGY9ZVs3XSxkPWVbMl0sYz1lWzVdLHU9ZVs4XTtyZXR1cm4gdFswXT1uLHRbMV09byx0WzJdPWEsdFszXT1yLHRbNF09aSx0WzVdPWYsdFs2XT1kLHRbN109Yyx0WzhdPXUsdH07a209WzEsMCwwXSx2bT1bMiwyLDFdO1l1PW5ldyBFZSxaeT1uZXcgRWU7RWUuY29tcHV0ZUVpZ2VuRGVjb21wb3NpdGlvbj1mdW5jdGlvbihlLHQpe2xldCBuPWsuRVBTSUxPTjIwLG89MTAsYT0wLHI9MDtnKHQpfHwodD17fSk7bGV0IGk9dC51bml0YXJ5PUVlLmNsb25lKEVlLklERU5USVRZLHQudW5pdGFyeSksZj10LmRpYWdvbmFsPUVlLmNsb25lKGUsdC5kaWFnb25hbCksZD1uKnlTKGYpO2Zvcig7cjxvJiZBUyhmKT5kOyl3UyhmLFl1KSxFZS50cmFuc3Bvc2UoWXUsWnkpLEVlLm11bHRpcGx5KGYsWXUsZiksRWUubXVsdGlwbHkoWnksZixmKSxFZS5tdWx0aXBseShpLFl1LGkpLCsrYT4yJiYoKytyLGE9MCk7cmV0dXJuIHR9O0VlLmFicz1mdW5jdGlvbihlLHQpe3JldHVybiB0WzBdPU1hdGguYWJzKGVbMF0pLHRbMV09TWF0aC5hYnMoZVsxXSksdFsyXT1NYXRoLmFicyhlWzJdKSx0WzNdPU1hdGguYWJzKGVbM10pLHRbNF09TWF0aC5hYnMoZVs0XSksdFs1XT1NYXRoLmFicyhlWzVdKSx0WzZdPU1hdGguYWJzKGVbNl0pLHRbN109TWF0aC5hYnMoZVs3XSksdFs4XT1NYXRoLmFicyhlWzhdKSx0fTtFZS5kZXRlcm1pbmFudD1mdW5jdGlvbihlKXtsZXQgdD1lWzBdLG49ZVszXSxvPWVbNl0sYT1lWzFdLHI9ZVs0XSxpPWVbN10sZj1lWzJdLGQ9ZVs1XSxjPWVbOF07cmV0dXJuIHQqKHIqYy1kKmkpK2EqKGQqby1uKmMpK2YqKG4qaS1yKm8pfTtFZS5pbnZlcnNlPWZ1bmN0aW9uKGUsdCl7bGV0IG49ZVswXSxvPWVbMV0sYT1lWzJdLHI9ZVszXSxpPWVbNF0sZj1lWzVdLGQ9ZVs2XSxjPWVbN10sdT1lWzhdLGw9RWUuZGV0ZXJtaW5hbnQoZSk7dFswXT1pKnUtYypmLHRbMV09YyphLW8qdSx0WzJdPW8qZi1pKmEsdFszXT1kKmYtcip1LHRbNF09bip1LWQqYSx0WzVdPXIqYS1uKmYsdFs2XT1yKmMtZCppLHRbN109ZCpvLW4qYyx0WzhdPW4qaS1yKm87bGV0IGg9MS9sO3JldHVybiBFZS5tdWx0aXBseUJ5U2NhbGFyKHQsaCx0KX07RVM9bmV3IEVlO0VlLmludmVyc2VUcmFuc3Bvc2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gRWUuaW52ZXJzZShFZS50cmFuc3Bvc2UoZSxFUyksdCl9O0VlLmVxdWFscz1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09dHx8ZyhlKSYmZyh0KSYmZVswXT09PXRbMF0mJmVbMV09PT10WzFdJiZlWzJdPT09dFsyXSYmZVszXT09PXRbM10mJmVbNF09PT10WzRdJiZlWzVdPT09dFs1XSYmZVs2XT09PXRbNl0mJmVbN109PT10WzddJiZlWzhdPT09dFs4XX07RWUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG49bj8/MCxlPT09dHx8ZyhlKSYmZyh0KSYmTWF0aC5hYnMoZVswXS10WzBdKTw9biYmTWF0aC5hYnMoZVsxXS10WzFdKTw9biYmTWF0aC5hYnMoZVsyXS10WzJdKTw9biYmTWF0aC5hYnMoZVszXS10WzNdKTw9biYmTWF0aC5hYnMoZVs0XS10WzRdKTw9biYmTWF0aC5hYnMoZVs1XS10WzVdKTw9biYmTWF0aC5hYnMoZVs2XS10WzZdKTw9biYmTWF0aC5hYnMoZVs3XS10WzddKTw9biYmTWF0aC5hYnMoZVs4XS10WzhdKTw9bn07RWUuSURFTlRJVFk9T2JqZWN0LmZyZWV6ZShuZXcgRWUoMSwwLDAsMCwxLDAsMCwwLDEpKTtFZS5aRVJPPU9iamVjdC5mcmVlemUobmV3IEVlKDAsMCwwLDAsMCwwLDAsMCwwKSk7RWUuQ09MVU1OMFJPVzA9MDtFZS5DT0xVTU4wUk9XMT0xO0VlLkNPTFVNTjBST1cyPTI7RWUuQ09MVU1OMVJPVzA9MztFZS5DT0xVTU4xUk9XMT00O0VlLkNPTFVNTjFST1cyPTU7RWUuQ09MVU1OMlJPVzA9NjtFZS5DT0xVTU4yUk9XMT03O0VlLkNPTFVNTjJST1cyPTg7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRWUucHJvdG90eXBlLHtsZW5ndGg6e2dldDpmdW5jdGlvbigpe3JldHVybiBFZS5wYWNrZWRMZW5ndGh9fX0pO0VlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbihlKXtyZXR1cm4gRWUuY2xvbmUodGhpcyxlKX07RWUucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtyZXR1cm4gRWUuZXF1YWxzKHRoaXMsZSl9O0VlLmVxdWFsc0FycmF5PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZVswX