UNPKG

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.84 MB
/** * @license * Cesium - https://github.com/CesiumGS/cesium * Version 1.140.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. */ "use strict";var Cesium=(()=>{var JGe=Object.create;var RR=Object.defineProperty;var jGe=Object.getOwnPropertyDescriptor;var QGe=Object.getOwnPropertyNames;var qGe=Object.getPrototypeOf,$Ge=Object.prototype.hasOwnProperty;var eLe=(e,t,n)=>t in e?RR(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var eU=(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 rm=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),tLe=(e,t)=>{for(var n in t)RR(e,n,{get:t[n],enumerable:!0})},Nie=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of QGe(t))!$Ge.call(e,o)&&o!==n&&RR(e,o,{get:()=>t[o],enumerable:!(i=jGe(t,o))||i.enumerable});return e};var x=(e,t,n)=>(n=e!=null?JGe(qGe(e)):{},Nie(t||!e||!e.__esModule?RR(n,"default",{value:e,enumerable:!0}):n,e)),nLe=e=>Nie(RR({},"__esModule",{value:!0}),e);var Hn=(e,t,n)=>eLe(e,typeof t!="symbol"?t+"":t,n);var T=rm(()=>{"use strict";globalThis.CESIUM_WORKERS=atob("dmFyIENlc2l1bVdvcmtlcnM9KCgpPT57dmFyIG1TPU9iamVjdC5jcmVhdGU7dmFyIFd1PU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgYlM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgcFM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIGdTPU9iamVjdC5nZXRQcm90b3R5cGVPZixfUz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBiYT0oZT0+dHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6dHlwZW9mIFByb3h5PCJ1Ij9uZXcgUHJveHkoZSx7Z2V0Oih0LG4pPT4odHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6dClbbl19KTplKShmdW5jdGlvbihlKXtpZih0eXBlb2YgcmVxdWlyZTwidSIpcmV0dXJuIHJlcXVpcmUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3Rocm93IEVycm9yKCdEeW5hbWljIHJlcXVpcmUgb2YgIicrZSsnIiBpcyBub3Qgc3VwcG9ydGVkJyl9KSxjMT1lPT50PT57dmFyIG49ZVt0XTtpZihuKXJldHVybiBuKCk7dGhyb3cgbmV3IEVycm9yKCJNb2R1bGUgbm90IGZvdW5kIGluIGJ1bmRsZTogIit0KX07dmFyIFg9KGUsdCk9PigpPT4oZSYmKHQ9ZShlPTApKSx0KTt2YXIgZW89KGUsdCk9PigpPT4odHx8ZSgodD17ZXhwb3J0czp7fX0pLmV4cG9ydHMsdCksdC5leHBvcnRzKSxydD0oZSx0KT0+e2Zvcih2YXIgbiBpbiB0KVd1KGUsbix7Z2V0OnRbbl0sZW51bWVyYWJsZTohMH0pfSxzMT0oZSx0LG4sbyk9PntpZih0JiZ0eXBlb2YgdD09Im9iamVjdCJ8fHR5cGVvZiB0PT0iZnVuY3Rpb24iKWZvcihsZXQgYSBvZiBwUyh0KSkhX1MuY2FsbChlLGEpJiZhIT09biYmV3UoZSxhLHtnZXQ6KCk9PnRbYV0sZW51bWVyYWJsZTohKG89YlModCxhKSl8fG8uZW51bWVyYWJsZX0pO3JldHVybiBlfTt2YXIgY2E9KGUsdCxuKT0+KG49ZSE9bnVsbD9tUyhnUyhlKSk6e30sczEodHx8IWV8fCFlLl9fZXNNb2R1bGU/V3UobiwiZGVmYXVsdCIse3ZhbHVlOmUsZW51bWVyYWJsZTohMH0pOm4sZSkpLHlTPWU9PnMxKFd1KHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlKTtmdW5jdGlvbiBBUyhlKXtyZXR1cm4gZSE9bnVsbH12YXIgZyxzZT1YKCgpPT57Zz1BU30pO2Z1bmN0aW9uIFlpKGUpe3RoaXMubmFtZT0iRGV2ZWxvcGVyRXJyb3IiLHRoaXMubWVzc2FnZT1lO2xldCB0O3RyeXt0aHJvdyBuZXcgRXJyb3J9Y2F0Y2gobil7dD1uLnN0YWNrfXRoaXMuc3RhY2s9dH12YXIgV3QsSmk9WCgoKT0+e3NlKCk7ZyhPYmplY3QuY3JlYXRlKSYmKFlpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSksWWkucHJvdG90eXBlLmNvbnN0cnVjdG9yPVlpKTtZaS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtsZXQgZT1gJHt0aGlzLm5hbWV9OiAke3RoaXMubWVzc2FnZX1gO3JldHVybiBnKHRoaXMuc3RhY2spJiYoZSs9YAoke3RoaXMuc3RhY2sudG9TdHJpbmcoKX1gKSxlfTtZaS50aHJvd0luc3RhbnRpYXRpb25FcnJvcj1mdW5jdGlvbigpe3Rocm93IG5ldyBZaSgiVGhpcyBmdW5jdGlvbiBkZWZpbmVzIGFuIGludGVyZmFjZSBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIil9O1d0PVlpfSk7ZnVuY3Rpb24gd1MoZSl7cmV0dXJuYCR7ZX0gaXMgcmVxdWlyZWQsIGFjdHVhbCB2YWx1ZSB3YXMgdW5kZWZpbmVkYH1mdW5jdGlvbiBxYyhlLHQsbil7cmV0dXJuYEV4cGVjdGVkICR7bn0gdG8gYmUgdHlwZW9mICR7dH0sIGFjdHVhbCB0eXBlb2Ygd2FzICR7ZX1gfXZhciB0byxNbixVbT1YKCgpPT57c2UoKTtKaSgpO3RvPXt9O3RvLnR5cGVPZj17fTt0by5kZWZpbmVkPWZ1bmN0aW9uKGUsdCl7aWYoIWcodCkpdGhyb3cgbmV3IFd0KHdTKGUpKX07dG8udHlwZU9mLmZ1bmM9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgV3QocWModHlwZW9mIHQsImZ1bmN0aW9uIixlKSl9O3RvLnR5cGVPZi5zdHJpbmc9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdCE9InN0cmluZyIpdGhyb3cgbmV3IFd0KHFjKHR5cGVvZiB0LCJzdHJpbmciLGUpKX07dG8udHlwZU9mLm51bWJlcj1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyIil0aHJvdyBuZXcgV3QocWModHlwZW9mIHQsIm51bWJlciIsZSkpfTt0by50eXBlT2YubnVtYmVyLmxlc3NUaGFuPWZ1bmN0aW9uKGUsdCxuKXtpZih0by50eXBlT2YubnVtYmVyKGUsdCksdD49bil0aHJvdyBuZXcgV3QoYEV4cGVjdGVkICR7ZX0gdG8gYmUgbGVzcyB0aGFuICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHt0fWApfTt0by50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHM9ZnVuY3Rpb24oZSx0LG4pe2lmKHRvLnR5cGVPZi5udW1iZXIoZSx0KSx0Pm4pdGhyb3cgbmV3IFd0KGBFeHBlY3RlZCAke2V9IHRvIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAke259LCBhY3R1YWwgdmFsdWUgd2FzICR7dH1gKX07dG8udHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbj1mdW5jdGlvbihlLHQsbil7aWYodG8udHlwZU9mLm51bWJlcihlLHQpLHQ8PW4pdGhyb3cgbmV3IFd0KGBFeHBlY3RlZCAke2V9IHRvIGJlIGdyZWF0ZXIgdGhhbiAke259LCBhY3R1YWwgdmFsdWUgd2FzICR7dH1gKX07dG8udHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzPWZ1bmN0aW9uKGUsdCxuKXtpZih0by50eXBlT2YubnVtYmVyKGUsdCksdDxuKXRocm93IG5ldyBXdChgRXhwZWN0ZWQgJHtlfSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtufSwgYWN0dWFsIHZhbHVlIHdhcyAke3R9YCl9O3RvLnR5cGVPZi5vYmplY3Q9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdCE9Im9iamVjdCIpdGhyb3cgbmV3IFd0KHFjKHR5cGVvZiB0LCJvYmplY3QiLGUpKX07dG8udHlwZU9mLmJvb2w9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdCE9ImJvb2xlYW4iKXRocm93IG5ldyBXdChxYyh0eXBlb2YgdCwiYm9vbGVhbiIsZSkpfTt0by50eXBlT2YuYmlnaW50PWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIHQhPSJiaWdpbnQiKXRocm93IG5ldyBXdChxYyh0eXBlb2YgdCwiYmlnaW50IixlKSl9O3RvLnR5cGVPZi5udW1iZXIuZXF1YWxzPWZ1bmN0aW9uKGUsdCxuLG8pe2lmKHRvLnR5cGVPZi5udW1iZXIoZSxuKSx0by50eXBlT2YubnVtYmVyKHQsbyksbiE9PW8pdGhyb3cgbmV3IFd0KGAke2V9IG11c3QgYmUgZXF1YWwgdG8gJHt0fSwgdGhlIGFjdHVhbCB2YWx1ZXMgYXJlICR7bn0gYW5kICR7b31gKX07TW49dG99KTt2YXIgZDE9ZW8oKHdHLGYxKT0+e3ZhciBQcj1mdW5jdGlvbihlKXtlPT1udWxsJiYoZT1uZXcgRGF0ZSgpLmdldFRpbWUoKSksdGhpcy5OPTYyNCx0aGlzLk09Mzk3LHRoaXMuTUFUUklYX0E9MjU2NzQ4MzYxNSx0aGlzLlVQUEVSX01BU0s9MjE0NzQ4MzY0OCx0aGlzLkxPV0VSX01BU0s9MjE0NzQ4MzY0Nyx0aGlzLm10PW5ldyBBcnJheSh0aGlzLk4pLHRoaXMubXRpPXRoaXMuTisxLGUuY29uc3RydWN0b3I9PUFycmF5P3RoaXMuaW5pdF9ieV9hcnJheShlLGUubGVuZ3RoKTp0aGlzLmluaXRfc2VlZChlKX07UHIucHJvdG90eXBlLmluaXRfc2VlZD1mdW5jdGlvbihlKXtmb3IodGhpcy5tdFswXT1lPj4+MCx0aGlzLm10aT0xO3RoaXMubXRpPHRoaXMuTjt0aGlzLm10aSsrKXt2YXIgZT10aGlzLm10W3RoaXMubXRpLTFdXnRoaXMubXRbdGhpcy5tdGktMV0+Pj4zMDt0aGlzLm10W3RoaXMubXRpXT0oKChlJjQyOTQ5MDE3NjApPj4+MTYpKjE4MTI0MzMyNTM8PDE2KSsoZSY2NTUzNSkqMTgxMjQzMzI1Myt0aGlzLm10aSx0aGlzLm10W3RoaXMubXRpXT4+Pj0wfX07UHIucHJvdG90eXBlLmluaXRfYnlfYXJyYXk9ZnVuY3Rpb24oZSx0KXt2YXIgbixvLGE7Zm9yKHRoaXMuaW5pdF9zZWVkKDE5NjUwMjE4KSxuPTEsbz0wLGE9dGhpcy5OPnQ/dGhpcy5OOnQ7YTthLS0pe3ZhciByPXRoaXMubXRbbi0xXV50aGlzLm10W24tMV0+Pj4zMDt0aGlzLm10W25dPSh0aGlzLm10W25dXigoKHImNDI5NDkwMTc2MCk+Pj4xNikqMTY2NDUyNTw8MTYpKyhyJjY1NTM1KSoxNjY0NTI1KStlW29dK28sdGhpcy5tdFtuXT4+Pj0wLG4rKyxvKyssbj49dGhpcy5OJiYodGhpcy5tdFswXT10aGlzLm10W3RoaXMuTi0xXSxuPTEpLG8+PXQmJihvPTApfWZvcihhPXRoaXMuTi0xO2E7YS0tKXt2YXIgcj10aGlzLm10W24tMV1edGhpcy5tdFtuLTFdPj4+MzA7dGhpcy5tdFtuXT0odGhpcy5tdFtuXV4oKChyJjQyOTQ5MDE3NjApPj4+MTYpKjE1NjYwODM5NDE8PDE2KSsociY2NTUzNSkqMTU2NjA4Mzk0MSktbix0aGlzLm10W25dPj4+PTAsbisrLG4+PXRoaXMuTiYmKHRoaXMubXRbMF09dGhpcy5tdFt0aGlzLk4tMV0sbj0xKX10aGlzLm10WzBdPTIxNDc0ODM2NDh9O1ByLnByb3RvdHlwZS5yYW5kb21faW50PWZ1bmN0aW9uKCl7dmFyIGUsdD1uZXcgQXJyYXkoMCx0aGlzLk1BVFJJWF9BKTtpZih0aGlzLm10aT49dGhpcy5OKXt2YXIgbjtmb3IodGhpcy5tdGk9PXRoaXMuTisxJiZ0aGlzLmluaXRfc2VlZCg1NDg5KSxuPTA7bjx0aGlzLk4tdGhpcy5NO24rKyllPXRoaXMubXRbbl0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbbisxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtuXT10aGlzLm10W24rdGhpcy5NXV5lPj4+MV50W2UmMV07Zm9yKDtuPHRoaXMuTi0xO24rKyllPXRoaXMubXRbbl0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbbisxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtuXT10aGlzLm10W24rKHRoaXMuTS10aGlzLk4pXV5lPj4+MV50W2UmMV07ZT10aGlzLm10W3RoaXMuTi0xXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFswXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFt0aGlzLk4tMV09dGhpcy5tdFt0aGlzLk0tMV1eZT4+PjFedFtlJjFdLHRoaXMubXRpPTB9cmV0dXJuIGU9dGhpcy5tdFt0aGlzLm10aSsrXSxlXj1lPj4+MTEsZV49ZTw8NyYyNjM2OTI4NjQwLGVePWU8PDE1JjQwMjI3MzA3NTIsZV49ZT4+PjE4LGU+Pj4wfTtQci5wcm90b3R5cGUucmFuZG9tX2ludDMxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpPj4+MX07UHIucHJvdG90eXBlLnJhbmRvbV9pbmNsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLzQyOTQ5NjcyOTUpfTtQci5wcm90b3R5cGUucmFuZG9tPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLzQyOTQ5NjcyOTYpfTtQci5wcm90b3R5cGUucmFuZG9tX2V4Y2w9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5yYW5kb21faW50KCkrLjUpKigxLzQyOTQ5NjcyOTYpfTtQci5wcm90b3R5cGUucmFuZG9tX2xvbmc9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJhbmRvbV9pbnQoKT4+PjUsdD10aGlzLnJhbmRvbV9pbnQoKT4+PjY7cmV0dXJuKGUqNjcxMDg4NjQrdCkqKDEvOTAwNzE5OTI1NDc0MDk5Mil9O2YxLmV4cG9ydHM9UHJ9KTt2YXIgTG0sT2UsWHUsdTEsayxHZT1YKCgpPT57TG09Y2EoZDEoKSwxKSxPZT17fTtPZS5FUFNJTE9OMT0uMTtPZS5FUFNJTE9OMj0uMDE7T2UuRVBTSUxPTjM9LjAwMTtPZS5FUFNJTE9OND0xZS00O09lLkVQU0lMT041PTFlLTU7T2UuRVBTSUxPTjY9MWUtNjtPZS5FUFNJTE9ONz0xZS03O09lLkVQU0lMT044PTFlLTg7T2UuRVBTSUxPTjk9MWUtOTtPZS5FUFNJTE9OMTA9MWUtMTA7T2UuRVBTSUxPTjExPTFlLTExO09lLkVQU0lMT04xMj0xZS0xMjtPZS5FUFNJTE9OMTM9MWUtMTM7T2UuRVBTSUxPTjE0PTFlLTE0O09lLkVQU0lMT04xNT0xZS0xNTtPZS5FUFNJTE9OMTY9MWUtMTY7T2UuRVBTSUxPTjE3PTFlLTE3O09lLkVQU0lMT04xOD0xZS0xODtPZS5FUFNJTE9OMTk9MWUtMTk7T2UuRVBTSUxPTjIwPTFlLTIwO09lLkVQU0lMT04yMT0xZS0yMTtPZS5HUkFWSVRBVElPTkFMUEFSQU1FVEVSPTM5ODYwMDQ0MThlNTtPZS5TT0xBUl9SQURJVVM9Njk1NWU1O09lLkxVTkFSX1JBRElVUz0xNzM3NDAwO09lLlNJWFRZX0ZPVVJfS0lMT0JZVEVTPTY0KjEwMjQ7T2UuRk9VUl9HSUdBQllURVM9NCoxMDI0KjEwMjQqMTAyNDtPZS5zaWduPU1hdGguc2lnbj8/ZnVuY3Rpb24odCl7cmV0dXJuIHQ9K3QsdD09PTB8fHQhPT10P3Q6dD4wPzE6LTF9O09lLnNpZ25Ob3RaZXJvPWZ1bmN0aW9uKGUpe3JldHVybiBlPDA/LTE6MX07T2UudG9TTm9ybT1mdW5jdGlvbihlLHQpe3JldHVybiB0PXQ/PzI1NSxNYXRoLnJvdW5kKChPZS5jbGFtcChlLC0xLDEpKi41Ky41KSp0KX07T2UuZnJvbVNOb3JtPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9dD8/MjU1LE9lLmNsYW1wKGUsMCx0KS90KjItMX07T2Uubm9ybWFsaXplPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj1NYXRoLm1heChuLXQsMCksbj09PTA/MDpPZS5jbGFtcCgoZS10KS9uLDAsMSl9O09lLnNpbmg9TWF0aC5zaW5oPz9mdW5jdGlvbih0KXtyZXR1cm4oTWF0aC5leHAodCktTWF0aC5leHAoLXQpKS8yfTtPZS5jb3NoPU1hdGguY29zaD8/ZnVuY3Rpb24odCl7cmV0dXJuKE1hdGguZXhwKHQpK01hdGguZXhwKC10KSkvMn07T2UubGVycD1mdW5jdGlvbihlLHQsbil7cmV0dXJuKDEtbikqZStuKnR9O09lLlBJPU1hdGguUEk7T2UuT05FX09WRVJfUEk9MS9NYXRoLlBJO09lLlBJX09WRVJfVFdPPU1hdGguUEkvMjtPZS5QSV9PVkVSX1RIUkVFPU1hdGguUEkvMztPZS5QSV9PVkVSX0ZPVVI9TWF0aC5QSS80O09lLlBJX09WRVJfU0lYPU1hdGguUEkvNjtPZS5USFJFRV9QSV9PVkVSX1RXTz0zKk1hdGguUEkvMjtPZS5UV09fUEk9MipNYXRoLlBJO09lLk9ORV9PVkVSX1RXT19QST0xLygyKk1hdGguUEkpO09lLlJBRElBTlNfUEVSX0RFR1JFRT1NYXRoLlBJLzE4MDtPZS5ERUdSRUVTX1BFUl9SQURJQU49MTgwL01hdGguUEk7T2UuUkFESUFOU19QRVJfQVJDU0VDT05EPU9lLlJBRElBTlNfUEVSX0RFR1JFRS8zNjAwO09lLnRvUmFkaWFucz1mdW5jdGlvbihlKXtyZXR1cm4gZSpPZS5SQURJQU5TX1BFUl9ERUdSRUV9O09lLnRvRGVncmVlcz1mdW5jdGlvbihlKXtyZXR1cm4gZSpPZS5ERUdSRUVTX1BFUl9SQURJQU59O09lLmNvbnZlcnRMb25naXR1ZGVSYW5nZT1mdW5jdGlvbihlKXtsZXQgdD1PZS5UV09fUEksbj1lLU1hdGguZmxvb3IoZS90KSp0O3JldHVybiBuPC1NYXRoLlBJP24rdDpuPj1NYXRoLlBJP24tdDpufTtPZS5jbGFtcFRvTGF0aXR1ZGVSYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gT2UuY2xhbXAoZSwtMSpPZS5QSV9PVkVSX1RXTyxPZS5QSV9PVkVSX1RXTyl9O09lLm5lZ2F0aXZlUGlUb1BpPWZ1bmN0aW9uKGUpe3JldHVybiBlPj0tT2UuUEkmJmU8PU9lLlBJP2U6T2UuemVyb1RvVHdvUGkoZStPZS5QSSktT2UuUEl9O09lLnplcm9Ub1R3b1BpPWZ1bmN0aW9uKGUpe2lmKGU+PTAmJmU8PU9lLlRXT19QSSlyZXR1cm4gZTtsZXQgdD1PZS5tb2QoZSxPZS5UV09fUEkpO3JldHVybiBNYXRoLmFicyh0KTxPZS5FUFNJTE9OMTQmJk1hdGguYWJzKGUpPk9lLkVQU0lMT04xND9PZS5UV09fUEk6dH07T2UubW9kPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE9lLnNpZ24oZSk9PT1PZS5zaWduKHQpJiZNYXRoLmFicyhlKTxNYXRoLmFicyh0KT9lOihlJXQrdCkldH07T2UuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbihlLHQsbixvKXtuPW4/PzAsbz1vPz9uO2xldCBhPU1hdGguYWJzKGUtdCk7cmV0dXJuIGE8PW98fGE8PW4qTWF0aC5tYXgoTWF0aC5hYnMoZSksTWF0aC5hYnModCkpfTtPZS5sZXNzVGhhbj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGUtdDwtbn07T2UubGVzc1RoYW5PckVxdWFscz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGUtdDxufTtPZS5ncmVhdGVyVGhhbj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGUtdD5ufTtPZS5ncmVhdGVyVGhhbk9yRXF1YWxzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS10Pi1ufTtYdT1bMV07T2UuZmFjdG9yaWFsPWZ1bmN0aW9uKGUpe2xldCB0PVh1Lmxlbmd0aDtpZihlPj10KXtsZXQgbj1YdVt0LTFdO2ZvcihsZXQgbz10O288PWU7bysrKXtsZXQgYT1uKm87WHUucHVzaChhKSxuPWF9fXJldHVybiBYdVtlXX07T2UuaW5jcmVtZW50V3JhcD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG49bj8/MCwrK2UsZT50JiYoZT1uKSxlfTtPZS5pc1Bvd2VyT2ZUd289ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT0wJiYoZSZlLTEpPT09MH07T2UubmV4dFBvd2VyT2ZUd289ZnVuY3Rpb24oZSl7cmV0dXJuLS1lLGV8PWU+PjEsZXw9ZT4+MixlfD1lPj40LGV8PWU+PjgsZXw9ZT4+MTYsKytlLGV9O09lLnByZXZpb3VzUG93ZXJPZlR3bz1mdW5jdGlvbihlKXtyZXR1cm4gZXw9ZT4+MSxlfD1lPj4yLGV8PWU+PjQsZXw9ZT4+OCxlfD1lPj4xNixlfD1lPj4zMixlPShlPj4+MCktKGU+Pj4xKSxlfTtPZS5jbGFtcD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU8dD90OmU+bj9uOmV9O3UxPW5ldyBMbS5kZWZhdWx0O09lLnNldFJhbmRvbU51bWJlclNlZWQ9ZnVuY3Rpb24oZSl7dTE9bmV3IExtLmRlZmF1bHQoZSl9O09lLm5leHRSYW5kb21OdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdTEucmFuZG9tKCl9O09lLnJhbmRvbUJldHdlZW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gT2UubmV4dFJhbmRvbU51bWJlcigpKih0LWUpK2V9O09lLmFjb3NDbGFtcGVkPWZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmFjb3MoT2UuY2xhbXAoZSwtMSwxKSl9O09lLmFzaW5DbGFtcGVkPWZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmFzaW4oT2UuY2xhbXAoZSwtMSwxKSl9O09lLmNob3JkTGVuZ3RoPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIDIqdCpNYXRoLnNpbihlKi41KX07T2UubG9nQmFzZT1mdW5jdGlvbihlLHQpe3JldHVybiBNYXRoLmxvZyhlKS9NYXRoLmxvZyh0KX07T2UuY2JydD1NYXRoLmNicnQ/P2Z1bmN0aW9uKHQpe2xldCBuPU1hdGgucG93KE1hdGguYWJzKHQpLC4zMzMzMzMzMzMzMzMzMzMzKTtyZXR1cm4gdDwwPy1uOm59O09lLmxvZzI9TWF0aC5sb2cyPz9mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5sb2codCkqTWF0aC5MT0cyRX07T2UuZm9nPWZ1bmN0aW9uKGUsdCl7bGV0IG49ZSp0O3JldHVybiAxLU1hdGguZXhwKC0obipuKSl9O09lLmZhc3RBcHByb3hpbWF0ZUF0YW49ZnVuY3Rpb24oZSl7cmV0dXJuIGUqKC0uMTc4NCpNYXRoLmFicyhlKS0uMDY2MyplKmUrMS4wMzAxKX07T2UuZmFzdEFwcHJveGltYXRlQXRhbjI9ZnVuY3Rpb24oZSx0KXtsZXQgbixvPU1hdGguYWJzKGUpO249TWF0aC5hYnModCk7bGV0IGE9TWF0aC5tYXgobyxuKTtuPU1hdGgubWluKG8sbik7bGV0IHI9bi9hO3JldHVybiBvPU9lLmZhc3RBcHByb3hpbWF0ZUF0YW4ociksbz1NYXRoLmFicyh0KT5NYXRoLmFicyhlKT9PZS5QSV9PVkVSX1RXTy1vOm8sbz1lPDA/T2UuUEktbzpvLG89dDwwPy1vOm8sb307az1PZX0pO3ZhciBtbixZdSxsMSxKdSxqbSxFUyxwYSxXYyxzLEllPVgoKCk9PntzZSgpO0dlKCk7bW49Y2xhc3MgZXtjb25zdHJ1Y3Rvcih0LG4sbyl7dGhpcy54PXQ/PzAsdGhpcy55PW4/PzAsdGhpcy56PW8/PzB9c3RhdGljIGZyb21TcGhlcmljYWwodCxuKXtnKG4pfHwobj1uZXcgZSk7bGV0IG89dC5jbG9jayxhPXQuY29uZSxyPXQubWFnbml0dWRlPz8xLGk9cipNYXRoLnNpbihhKTtyZXR1cm4gbi54PWkqTWF0aC5jb3Mobyksbi55PWkqTWF0aC5zaW4obyksbi56PXIqTWF0aC5jb3MoYSksbn1zdGF0aWMgZnJvbUVsZW1lbnRzKHQsbixvLGEpe3JldHVybiBnKGEpPyhhLng9dCxhLnk9bixhLno9byxhKTpuZXcgZSh0LG4sbyl9c3RhdGljIGNsb25lKHQsbil7aWYoZyh0KSlyZXR1cm4gZyhuKT8obi54PXQueCxuLnk9dC55LG4uej10Lnosbik6bmV3IGUodC54LHQueSx0LnopfXN0YXRpYyBwYWNrKHQsbixvKXtyZXR1cm4gbz1vPz8wLG5bbysrXT10LngsbltvKytdPXQueSxuW29dPXQueixufXN0YXRpYyB1bnBhY2sodCxuLG8pe3JldHVybiBuPW4/PzAsZyhvKXx8KG89bmV3IGUpLG8ueD10W24rK10sby55PXRbbisrXSxvLno9dFtuXSxvfXN0YXRpYyBwYWNrQXJyYXkodCxuKXtsZXQgbz10Lmxlbmd0aCxhPW8qMztnKG4pPyFBcnJheS5pc0FycmF5KG4pJiZuLmxlbmd0aCE9PWF8fG4ubGVuZ3RoIT09YSYmKG4ubGVuZ3RoPWEpOm49bmV3IEFycmF5KGEpO2ZvcihsZXQgcj0wO3I8bzsrK3IpZS5wYWNrKHRbcl0sbixyKjMpO3JldHVybiBufXN0YXRpYyB1bnBhY2tBcnJheSh0LG4pe2xldCBvPXQubGVuZ3RoO2cobik/bi5sZW5ndGg9by8zOm49bmV3IEFycmF5KG8vMyk7Zm9yKGxldCBhPTA7YTxvO2ErPTMpe2xldCByPWEvMztuW3JdPWUudW5wYWNrKHQsYSxuW3JdKX1yZXR1cm4gbn1zdGF0aWMgbWF4aW11bUNvbXBvbmVudCh0KXtyZXR1cm4gTWF0aC5tYXgodC54LHQueSx0LnopfXN0YXRpYyBtaW5pbXVtQ29tcG9uZW50KHQpe3JldHVybiBNYXRoLm1pbih0LngsdC55LHQueil9c3RhdGljIG1pbmltdW1CeUNvbXBvbmVudCh0LG4sbyl7cmV0dXJuIG8ueD1NYXRoLm1pbih0Lngsbi54KSxvLnk9TWF0aC5taW4odC55LG4ueSksby56PU1hdGgubWluKHQueixuLnopLG99c3RhdGljIG1heGltdW1CeUNvbXBvbmVudCh0LG4sbyl7cmV0dXJuIG8ueD1NYXRoLm1heCh0Lngsbi54KSxvLnk9TWF0aC5tYXgodC55LG4ueSksby56PU1hdGgubWF4KHQueixuLnopLG99c3RhdGljIGNsYW1wKHQsbixvLGEpe2xldCByPWsuY2xhbXAodC54LG4ueCxvLngpLGk9ay5jbGFtcCh0Lnksbi55LG8ueSksZj1rLmNsYW1wKHQueixuLnosby56KTtyZXR1cm4gYS54PXIsYS55PWksYS56PWYsYX1zdGF0aWMgbWFnbml0dWRlU3F1YXJlZCh0KXtyZXR1cm4gdC54KnQueCt0LnkqdC55K3Queip0Lnp9c3RhdGljIG1hZ25pdHVkZSh0KXtyZXR1cm4gTWF0aC5zcXJ0KGUubWFnbml0dWRlU3F1YXJlZCh0KSl9c3RhdGljIGRpc3RhbmNlKHQsbil7cmV0dXJuIGUuc3VidHJhY3QodCxuLFl1KSxlLm1hZ25pdHVkZShZdSl9c3RhdGljIGRpc3RhbmNlU3F1YXJlZCh0LG4pe3JldHVybiBlLnN1YnRyYWN0KHQsbixZdSksZS5tYWduaXR1ZGVTcXVhcmVkKFl1KX1zdGF0aWMgbm9ybWFsaXplKHQsbil7bGV0IG89ZS5tYWduaXR1ZGUodCk7cmV0dXJuIG4ueD10LngvbyxuLnk9dC55L28sbi56PXQuei9vLG59c3RhdGljIGRvdCh0LG4pe3JldHVybiB0Lngqbi54K3QueSpuLnkrdC56Km4uen1zdGF0aWMgbXVsdGlwbHlDb21wb25lbnRzKHQsbixvKXtyZXR1cm4gby54PXQueCpuLngsby55PXQueSpuLnksby56PXQueipuLnosb31zdGF0aWMgZGl2aWRlQ29tcG9uZW50cyh0LG4sbyl7cmV0dXJuIG8ueD10Lngvbi54LG8ueT10Lnkvbi55LG8uej10Lnovbi56LG99c3RhdGljIGFkZCh0LG4sbyl7cmV0dXJuIG8ueD10Lngrbi54LG8ueT10Lnkrbi55LG8uej10Lnorbi56LG99c3RhdGljIHN1YnRyYWN0KHQsbixvKXtyZXR1cm4gby54PXQueC1uLngsby55PXQueS1uLnksby56PXQuei1uLnosb31zdGF0aWMgbXVsdGlwbHlCeVNjYWxhcih0LG4sbyl7cmV0dXJuIG8ueD10LngqbixvLnk9dC55Km4sby56PXQueipuLG99c3RhdGljIGRpdmlkZUJ5U2NhbGFyKHQsbixvKXtyZXR1cm4gby54PXQueC9uLG8ueT10LnkvbixvLno9dC56L24sb31zdGF0aWMgbmVnYXRlKHQsbil7cmV0dXJuIG4ueD0tdC54LG4ueT0tdC55LG4uej0tdC56LG59c3RhdGljIGFicyh0LG4pe3JldHVybiBuLng9TWF0aC5hYnModC54KSxuLnk9TWF0aC5hYnModC55KSxuLno9TWF0aC5hYnModC56KSxufXN0YXRpYyBsZXJwKHQsbixvLGEpe3JldHVybiBlLm11bHRpcGx5QnlTY2FsYXIobixvLGwxKSxhPWUubXVsdGlwbHlCeVNjYWxhcih0LDEtbyxhKSxlLmFkZChsMSxhLGEpfXN0YXRpYyBhbmdsZUJldHdlZW4odCxuKXtlLm5vcm1hbGl6ZSh0LEp1KSxlLm5vcm1hbGl6ZShuLGptKTtsZXQgbz1lLmRvdChKdSxqbSksYT1lLm1hZ25pdHVkZShlLmNyb3NzKEp1LGptLEp1KSk7cmV0dXJuIE1hdGguYXRhbjIoYSxvKX1zdGF0aWMgbW9zdE9ydGhvZ29uYWxBeGlzKHQsbil7bGV0IG89ZS5ub3JtYWxpemUodCxFUyk7cmV0dXJuIGUuYWJzKG8sbyksby54PD1vLnk/by54PD1vLno/bj1lLmNsb25lKGUuVU5JVF9YLG4pOm49ZS5jbG9uZShlLlVOSVRfWixuKTpvLnk8PW8uej9uPWUuY2xvbmUoZS5VTklUX1ksbik6bj1lLmNsb25lKGUuVU5JVF9aLG4pLG59c3RhdGljIHByb2plY3RWZWN0b3IodCxuLG8pe2xldCBhPWUuZG90KHQsbikvZS5kb3QobixuKTtyZXR1cm4gZS5tdWx0aXBseUJ5U2NhbGFyKG4sYSxvKX1zdGF0aWMgZXF1YWxzKHQsbil7cmV0dXJuIHQ9PT1ufHxnKHQpJiZnKG4pJiZ0Lng9PT1uLngmJnQueT09PW4ueSYmdC56PT09bi56fXN0YXRpYyBlcXVhbHNBcnJheSh0LG4sbyl7cmV0dXJuIHQueD09PW5bb10mJnQueT09PW5bbysxXSYmdC56PT09bltvKzJdfXN0YXRpYyBlcXVhbHNFcHNpbG9uKHQsbixvLGEpe3JldHVybiB0PT09bnx8Zyh0KSYmZyhuKSYmay5lcXVhbHNFcHNpbG9uKHQueCxuLngsbyxhKSYmay5lcXVhbHNFcHNpbG9uKHQueSxuLnksbyxhKSYmay5lcXVhbHNFcHNpbG9uKHQueixuLnosbyxhKX1zdGF0aWMgY3Jvc3ModCxuLG8pe2xldCBhPXQueCxyPXQueSxpPXQueixmPW4ueCxkPW4ueSxjPW4ueix1PXIqYy1pKmQsbD1pKmYtYSpjLGg9YSpkLXIqZjtyZXR1cm4gby54PXUsby55PWwsby56PWgsb31zdGF0aWMgbWlkcG9pbnQodCxuLG8pe3JldHVybiBvLng9KHQueCtuLngpKi41LG8ueT0odC55K24ueSkqLjUsby56PSh0Lnorbi56KSouNSxvfXN0YXRpYyBmcm9tRGVncmVlcyh0LG4sbyxhLHIpe3JldHVybiB0PWsudG9SYWRpYW5zKHQpLG49ay50b1JhZGlhbnMobiksZS5mcm9tUmFkaWFucyh0LG4sbyxhLHIpfXN0YXRpYyBmcm9tUmFkaWFucyh0LG4sbyxhLHIpe289bz8/MDtsZXQgaT1nKGEpP2EucmFkaWlTcXVhcmVkOmUuX2VsbGlwc29pZFJhZGlpU3F1YXJlZCxmPU1hdGguY29zKG4pO3BhLng9ZipNYXRoLmNvcyh0KSxwYS55PWYqTWF0aC5zaW4odCkscGEuej1NYXRoLnNpbihuKSxwYT1lLm5vcm1hbGl6ZShwYSxwYSksZS5tdWx0aXBseUNvbXBvbmVudHMoaSxwYSxXYyk7bGV0IGQ9TWF0aC5zcXJ0KGUuZG90KHBhLFdjKSk7cmV0dXJuIFdjPWUuZGl2aWRlQnlTY2FsYXIoV2MsZCxXYykscGE9ZS5tdWx0aXBseUJ5U2NhbGFyKHBhLG8scGEpLGcocil8fChyPW5ldyBlKSxlLmFkZChXYyxwYSxyKX1zdGF0aWMgZnJvbURlZ3JlZXNBcnJheSh0LG4sbyl7bGV0IGE9dC5sZW5ndGg7ZyhvKT9vLmxlbmd0aD1hLzI6bz1uZXcgQXJyYXkoYS8yKTtmb3IobGV0IHI9MDtyPGE7cis9Mil7bGV0IGk9dFtyXSxmPXRbcisxXSxkPXIvMjtvW2RdPWUuZnJvbURlZ3JlZXMoaSxmLDAsbixvW2RdKX1yZXR1cm4gb31zdGF0aWMgZnJvbVJhZGlhbnNBcnJheSh0LG4sbyl7bGV0IGE9dC5sZW5ndGg7ZyhvKT9vLmxlbmd0aD1hLzI6bz1uZXcgQXJyYXkoYS8yKTtmb3IobGV0IHI9MDtyPGE7cis9Mil7bGV0IGk9dFtyXSxmPXRbcisxXSxkPXIvMjtvW2RdPWUuZnJvbVJhZGlhbnMoaSxmLDAsbixvW2RdKX1yZXR1cm4gb31zdGF0aWMgZnJvbURlZ3JlZXNBcnJheUhlaWdodHModCxuLG8pe2xldCBhPXQubGVuZ3RoO2cobyk/by5sZW5ndGg9YS8zOm89bmV3IEFycmF5KGEvMyk7Zm9yKGxldCByPTA7cjxhO3IrPTMpe2xldCBpPXRbcl0sZj10W3IrMV0sZD10W3IrMl0sYz1yLzM7b1tjXT1lLmZyb21EZWdyZWVzKGksZixkLG4sb1tjXSl9cmV0dXJuIG99c3RhdGljIGZyb21SYWRpYW5zQXJyYXlIZWlnaHRzKHQsbixvKXtsZXQgYT10Lmxlbmd0aDtnKG8pP28ubGVuZ3RoPWEvMzpvPW5ldyBBcnJheShhLzMpO2ZvcihsZXQgcj0wO3I8YTtyKz0zKXtsZXQgaT10W3JdLGY9dFtyKzFdLGQ9dFtyKzJdLGM9ci8zO29bY109ZS5mcm9tUmFkaWFucyhpLGYsZCxuLG9bY10pfXJldHVybiBvfWNsb25lKHQpe3JldHVybiBlLmNsb25lKHRoaXMsdCl9ZXF1YWxzKHQpe3JldHVybiBlLmVxdWFscyh0aGlzLHQpfWVxdWFsc0Vwc2lsb24odCxuLG8pe3JldHVybiBlLmVxdWFsc0Vwc2lsb24odGhpcyx0LG4sbyl9dG9TdHJpbmcoKXtyZXR1cm5gKCR7dGhpcy54fSwgJHt0aGlzLnl9LCAke3RoaXMuen0pYH19O21uLmZyb21DYXJ0ZXNpYW40PW1uLmNsb25lO21uLnBhY2tlZExlbmd0aD0zO21uLmZyb21BcnJheT1tbi51bnBhY2s7WXU9bmV3IG1uLGwxPW5ldyBtbixKdT1uZXcgbW4sam09bmV3IG1uLEVTPW5ldyBtbixwYT1uZXcgbW4sV2M9bmV3IG1uO21uLl9lbGxpcHNvaWRSYWRpaVNxdWFyZWQ9bmV3IG1uKDYzNzgxMzcqNjM3ODEzNyw2Mzc4MTM3KjYzNzgxMzcsNjM1Njc1MjMxNDI0NTE3OWUtOSo2MzU2NzUyMzE0MjQ1MTc5ZS05KTttbi5aRVJPPU9iamVjdC5mcmVlemUobmV3IG1uKDAsMCwwKSk7bW4uT05FPU9iamVjdC5mcmVlemUobmV3IG1uKDEsMSwxKSk7bW4uVU5JVF9YPU9iamVjdC5mcmVlemUobmV3IG1uKDEsMCwwKSk7bW4uVU5JVF9ZPU9iamVjdC5mcmVlemUobmV3IG1uKDAsMSwwKSk7bW4uVU5JVF9aPU9iamVjdC5mcmVlemUobmV3IG1uKDAsMCwxKSk7cz1tbn0pO2Z1bmN0aW9uIHhTKGUsdCxuLG8sYSl7bGV0IHI9ZS54LGk9ZS55LGY9ZS56LGQ9dC54LGM9dC55LHU9dC56LGw9cipyKmQqZCxoPWkqaSpjKmMsbT1mKmYqdSp1LGI9bCtoK20scD1NYXRoLnNxcnQoMS9iKSx5PXMubXVsdGlwbHlCeVNjYWxhcihlLHAsVFMpO2lmKGI8bylyZXR1cm4gaXNGaW5pdGUocCk/cy5jbG9uZSh5LGEpOnZvaWQgMDtsZXQgRT1uLngsXz1uLnksVD1uLnosdz1SUzt3Lng9eS54KkUqMix3Lnk9eS55Kl8qMix3Lno9eS56KlQqMjtsZXQgUj0oMS1wKSpzLm1hZ25pdHVkZShlKS8oLjUqcy5tYWduaXR1ZGUodykpLFM9MCxDLEksTixQLHYsQSx4LE0sRixVLHo7ZG97Ui09UyxOPTEvKDErUipFKSxQPTEvKDErUipfKSx2PTEvKDErUipUKSxBPU4qTix4PVAqUCxNPXYqdixGPUEqTixVPXgqUCx6PU0qdixDPWwqQStoKngrbSpNLTEsST1sKkYqRStoKlUqXyttKnoqVDtsZXQgRD0tMipJO1M9Qy9EfXdoaWxlKE1hdGguYWJzKEMpPmsuRVBTSUxPTjEyKTtyZXR1cm4gZyhhKT8oYS54PXIqTixhLnk9aSpQLGEuej1mKnYsYSk6bmV3IHMocipOLGkqUCxmKnYpfXZhciBUUyxSUyxadSx6bT1YKCgpPT57SWUoKTtzZSgpO0dlKCk7VFM9bmV3IHMsUlM9bmV3IHM7WnU9eFN9KTtmdW5jdGlvbiBibihlLHQsbil7dGhpcy5sb25naXR1ZGU9ZT8/MCx0aGlzLmxhdGl0dWRlPXQ/PzAsdGhpcy5oZWlnaHQ9bj8/MH12YXIgT1MsU1MsQ1MscmUsRXQ9WCgoKT0+e0llKCk7c2UoKTtHZSgpO3ptKCk7Ym4uZnJvbVJhZGlhbnM9ZnVuY3Rpb24oZSx0LG4sbyl7cmV0dXJuIG49bj8/MCxnKG8pPyhvLmxvbmdpdHVkZT1lLG8ubGF0aXR1ZGU9dCxvLmhlaWdodD1uLG8pOm5ldyBibihlLHQsbil9O2JuLmZyb21EZWdyZWVzPWZ1bmN0aW9uKGUsdCxuLG8pe3JldHVybiBlPWsudG9SYWRpYW5zKGUpLHQ9ay50b1JhZGlhbnModCksYm4uZnJvbVJhZGlhbnMoZSx0LG4sbyl9O09TPW5ldyBzLFNTPW5ldyBzLENTPW5ldyBzO2JuLl9lbGxpcHNvaWRPbmVPdmVyUmFkaWk9bmV3IHMoMS82Mzc4MTM3LDEvNjM3ODEzNywxLzYzNTY3NTIzMTQyNDUxNzllLTkpO2JuLl9lbGxpcHNvaWRPbmVPdmVyUmFkaWlTcXVhcmVkPW5ldyBzKDEvKDYzNzgxMzcqNjM3ODEzNyksMS8oNjM3ODEzNyo2Mzc4MTM3KSwxLyg2MzU2NzUyMzE0MjQ1MTc5ZS05KjYzNTY3NTIzMTQyNDUxNzllLTkpKTtibi5fZWxsaXBzb2lkQ2VudGVyVG9sZXJhbmNlU3F1YXJlZD1rLkVQU0lMT04xO2JuLmZyb21DYXJ0ZXNpYW49ZnVuY3Rpb24oZSx0LG4pe2xldCBvPWcodCk/dC5vbmVPdmVyUmFkaWk6Ym4uX2VsbGlwc29pZE9uZU92ZXJSYWRpaSxhPWcodCk/dC5vbmVPdmVyUmFkaWlTcXVhcmVkOmJuLl9lbGxpcHNvaWRPbmVPdmVyUmFkaWlTcXVhcmVkLHI9Zyh0KT90Ll9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkOmJuLl9lbGxpcHNvaWRDZW50ZXJUb2xlcmFuY2VTcXVhcmVkLGk9WnUoZSxvLGEscixTUyk7aWYoIWcoaSkpcmV0dXJuO2xldCBmPXMubXVsdGlwbHlDb21wb25lbnRzKGksYSxPUyk7Zj1zLm5vcm1hbGl6ZShmLGYpO2xldCBkPXMuc3VidHJhY3QoZSxpLENTKSxjPU1hdGguYXRhbjIoZi55LGYueCksdT1NYXRoLmFzaW4oZi56KSxsPWsuc2lnbihzLmRvdChkLGUpKSpzLm1hZ25pdHVkZShkKTtyZXR1cm4gZyhuKT8obi5sb25naXR1ZGU9YyxuLmxhdGl0dWRlPXUsbi5oZWlnaHQ9bCxuKTpuZXcgYm4oYyx1LGwpfTtibi50b0NhcnRlc2lhbj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHMuZnJvbVJhZGlhbnMoZS5sb25naXR1ZGUsZS5sYXRpdHVkZSxlLmhlaWdodCx0LG4pfTtibi5jbG9uZT1mdW5jdGlvbihlLHQpe2lmKGcoZSkpcmV0dXJuIGcodCk/KHQubG9uZ2l0dWRlPWUubG9uZ2l0dWRlLHQubGF0aXR1ZGU9ZS5sYXRpdHVkZSx0LmhlaWdodD1lLmhlaWdodCx0KTpuZXcgYm4oZS5sb25naXR1ZGUsZS5sYXRpdHVkZSxlLmhlaWdodCl9O2JuLmVxdWFscz1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09dHx8ZyhlKSYmZyh0KSYmZS5sb25naXR1ZGU9PT10LmxvbmdpdHVkZSYmZS5sYXRpdHVkZT09PXQubGF0aXR1ZGUmJmUuaGVpZ2h0PT09dC5oZWlnaHR9O2JuLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuPW4/PzAsZT09PXR8fGcoZSkmJmcodCkmJk1hdGguYWJzKGUubG9uZ2l0dWRlLXQubG9uZ2l0dWRlKTw9biYmTWF0aC5hYnMoZS5sYXRpdHVkZS10LmxhdGl0dWRlKTw9biYmTWF0aC5hYnMoZS5oZWlnaHQtdC5oZWlnaHQpPD1ufTtibi5aRVJPPU9iamVjdC5mcmVlemUobmV3IGJuKDAsMCwwKSk7Ym4ucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKGUpe3JldHVybiBibi5jbG9uZSh0aGlzLGUpfTtibi5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKGUpe3JldHVybiBibi5lcXVhbHModGhpcyxlKX07Ym4ucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYm4uZXF1YWxzRXBzaWxvbih0aGlzLGUsdCl9O2JuLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzLmxvbmdpdHVkZX0sICR7dGhpcy5sYXRpdHVkZX0sICR7dGhpcy5oZWlnaHR9KWB9O3JlPWJufSk7dmFyIEZuLFF1LGgxLG0xLGIxLE1TLFksanQ9WCgoKT0+e3NlKCk7R2UoKTtGbj1jbGFzcyBle2NvbnN0cnVjdG9yKHQsbil7dGhpcy54PXQ/PzAsdGhpcy55PW4/PzB9c3RhdGljIGZyb21FbGVtZW50cyh0LG4sbyl7cmV0dXJuIGcobyk/KG8ueD10LG8ueT1uLG8pOm5ldyBlKHQsbil9c3RhdGljIGNsb25lKHQsbil7aWYoZyh0KSlyZXR1cm4gZyhuKT8obi54PXQueCxuLnk9dC55LG4pOm5ldyBlKHQueCx0LnkpfXN0YXRpYyBwYWNrKHQsbixvKXtyZXR1cm4gbz1vPz8wLG5bbysrXT10LngsbltvXT10Lnksbn1zdGF0aWMgdW5wYWNrKHQsbixvKXtyZXR1cm4gbj1uPz8wLGcobyl8fChvPW5ldyBlKSxvLng9dFtuKytdLG8ueT10W25dLG99c3RhdGljIHBhY2tBcnJheSh0LG4pe2xldCBvPXQubGVuZ3RoLGE9byoyO2cobik/IUFycmF5LmlzQXJyYXkobikmJm4ubGVuZ3RoIT09YXx8bi5sZW5ndGghPT1hJiYobi5sZW5ndGg9YSk6bj1uZXcgQXJyYXkoYSk7Zm9yKGxldCByPTA7cjxvOysrcillLnBhY2sodFtyXSxuLHIqMik7cmV0dXJuIG59c3RhdGljIHVucGFja0FycmF5KHQsbil7bGV0IG89dC5sZW5ndGg7ZyhuKT9uLmxlbmd0aD1vLzI6bj1uZXcgQXJyYXkoby8yKTtmb3IobGV0IGE9MDthPG87YSs9Mil7bGV0IHI9YS8yO25bcl09ZS51bnBhY2sodCxhLG5bcl0pfXJldHVybiBufXN0YXRpYyBtYXhpbXVtQ29tcG9uZW50KHQpe3JldHVybiBNYXRoLm1heCh0LngsdC55KX1zdGF0aWMgbWluaW11bUNvbXBvbmVudCh0KXtyZXR1cm4gTWF0aC5taW4odC54LHQueSl9c3RhdGljIG1pbmltdW1CeUNvbXBvbmVudCh0LG4sbyl7cmV0dXJuIG8ueD1NYXRoLm1pbih0Lngsbi54KSxvLnk9TWF0aC5taW4odC55LG4ueSksb31zdGF0aWMgbWF4aW11bUJ5Q29tcG9uZW50KHQsbixvKXtyZXR1cm4gby54PU1hdGgubWF4KHQueCxuLngpLG8ueT1NYXRoLm1heCh0Lnksbi55KSxvfXN0YXRpYyBjbGFtcCh0LG4sbyxhKXtsZXQgcj1rLmNsYW1wKHQueCxuLngsby54KSxpPWsuY2xhbXAodC55LG4ueSxvLnkpO3JldHVybiBhLng9cixhLnk9aSxhfXN0YXRpYyBtYWduaXR1ZGVTcXVhcmVkKHQpe3JldHVybiB0LngqdC54K3QueSp0Lnl9c3RhdGljIG1hZ25pdHVkZSh0KXtyZXR1cm4gTWF0aC5zcXJ0KGUubWFnbml0dWRlU3F1YXJlZCh0KSl9c3RhdGljIGRpc3RhbmNlKHQsbil7cmV0dXJuIGUuc3VidHJhY3QodCxuLFF1KSxlLm1hZ25pdHVkZShRdSl9c3RhdGljIGRpc3RhbmNlU3F1YXJlZCh0LG4pe3JldHVybiBlLnN1YnRyYWN0KHQsbixRdSksZS5tYWduaXR1ZGVTcXVhcmVkKFF1KX1zdGF0aWMgbm9ybWFsaXplKHQsbil7bGV0IG89ZS5tYWduaXR1ZGUodCk7cmV0dXJuIG4ueD10LngvbyxuLnk9dC55L28sbn1zdGF0aWMgZG90KHQsbil7cmV0dXJuIHQueCpuLngrdC55Km4ueX1zdGF0aWMgY3Jvc3ModCxuKXtyZXR1cm4gdC54Km4ueS10Lnkqbi54fXN0YXRpYyBtdWx0aXBseUNvbXBvbmVudHModCxuLG8pe3JldHVybiBvLng9dC54Km4ueCxvLnk9dC55Km4ueSxvfXN0YXRpYyBkaXZpZGVDb21wb25lbnRzKHQsbixvKXtyZXR1cm4gby54PXQueC9uLngsby55PXQueS9uLnksb31zdGF0aWMgYWRkKHQsbixvKXtyZXR1cm4gby54PXQueCtuLngsby55PXQueStuLnksb31zdGF0aWMgc3VidHJhY3QodCxuLG8pe3JldHVybiBvLng9dC54LW4ueCxvLnk9dC55LW4ueSxvfXN0YXRpYyBtdWx0aXBseUJ5U2NhbGFyKHQsbixvKXtyZXR1cm4gby54PXQueCpuLG8ueT10LnkqbixvfXN0YXRpYyBkaXZpZGVCeVNjYWxhcih0LG4sbyl7cmV0dXJuIG8ueD10LngvbixvLnk9dC55L24sb31zdGF0aWMgbmVnYXRlKHQsbil7cmV0dXJuIG4ueD0tdC54LG4ueT0tdC55LG59c3RhdGljIGFicyh0LG4pe3JldHVybiBuLng9TWF0aC5hYnModC54KSxuLnk9TWF0aC5hYnModC55KSxufXN0YXRpYyBsZXJwKHQsbixvLGEpe3JldHVybiBlLm11bHRpcGx5QnlTY2FsYXIobixvLGgxKSxhPWUubXVsdGlwbHlCeVNjYWxhcih0LDEtbyxhKSxlLmFkZChoMSxhLGEpfXN0YXRpYyBhbmdsZUJldHdlZW4odCxuKXtyZXR1cm4gZS5ub3JtYWxpemUodCxtMSksZS5ub3JtYWxpemUobixiMSksay5hY29zQ2xhbXBlZChlLmRvdChtMSxiMSkpfXN0YXRpYyBtb3N0T3J0aG9nb25hbEF4aXModCxuKXtsZXQgbz1lLm5vcm1hbGl6ZSh0LE1TKTtyZXR1cm4gZS5hYnMobyxvKSxvLng8PW8ueT9uPWUuY2xvbmUoZS5VTklUX1gsbik6bj1lLmNsb25lKGUuVU5JVF9ZLG4pLG59c3RhdGljIGVxdWFscyh0LG4pe3JldHVybiB0PT09bnx8Zyh0KSYmZyhuKSYmdC54PT09bi54JiZ0Lnk9PT1uLnl9c3RhdGljIGVxdWFsc0FycmF5KHQsbixvKXtyZXR1cm4gdC54PT09bltvXSYmdC55PT09bltvKzFdfXN0YXRpYyBlcXVhbHNFcHNpbG9uKHQsbixvLGEpe3JldHVybiB0PT09bnx8Zyh0KSYmZyhuKSYmay5lcXVhbHNFcHNpbG9uKHQueCxuLngsbyxhKSYmay5lcXVhbHNFcHNpbG9uKHQueSxuLnksbyxhKX1jbG9uZSh0KXtyZXR1cm4gZS5jbG9uZSh0aGlzLHQpfWVxdWFscyh0KXtyZXR1cm4gZS5lcXVhbHModGhpcyx0KX1lcXVhbHNFcHNpbG9uKHQsbixvKXtyZXR1cm4gZS5lcXVhbHNFcHNpbG9uKHRoaXMsdCxuLG8pfXRvU3RyaW5nKCl7cmV0dXJuYCgke3RoaXMueH0sICR7dGhpcy55fSlgfX07Rm4uZnJvbUNhcnRlc2lhbjM9Rm4uY2xvbmU7Rm4uZnJvbUNhcnRlc2lhbjQ9Rm4uY2xvbmU7Rm4ucGFja2VkTGVuZ3RoPTI7Rm4uZnJvbUFycmF5PUZuLnVucGFjaztRdT1uZXcgRm4saDE9bmV3IEZuLG0xPW5ldyBGbixiMT1uZXcgRm4sTVM9bmV3IEZuO0ZuLlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgRm4oMCwwKSk7Rm4uT05FPU9iamVjdC5mcmVlemUobmV3IEZuKDEsMSkpO0ZuLlVOSVRfWD1PYmplY3QuZnJlZXplKG5ldyBGbigxLDApKTtGbi5VTklUX1k9T2JqZWN0LmZyZWV6ZShuZXcgRm4oMCwxKSk7WT1Gbn0pO2Z1bmN0aW9uIGcxKGUsdCxuLG8pe3Q9dD8/MCxuPW4/PzAsbz1vPz8wLGUuX3JhZGlpPW5ldyBzKHQsbixvKSxlLl9yYWRpaVNxdWFyZWQ9bmV3IHModCp0LG4qbixvKm8pLGUuX3JhZGlpVG9UaGVGb3VydGg9bmV3IHModCp0KnQqdCxuKm4qbipuLG8qbypvKm8pLGUuX29uZU92ZXJSYWRpaT1uZXcgcyh0PT09MD8wOjEvdCxuPT09MD8wOjEvbixvPT09MD8wOjEvbyksZS5fb25lT3ZlclJhZGlpU3F1YXJlZD1uZXcgcyh0PT09MD8wOjEvKHQqdCksbj09PTA/MDoxLyhuKm4pLG89PT0wPzA6MS8obypvKSksZS5fbWluaW11bVJhZGl1cz1NYXRoLm1pbih0LG4sbyksZS5fbWF4aW11bVJhZGl1cz1NYXRoLm1heCh0LG4sbyksZS5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZD1rLkVQU0lMT04xLGUuX3JhZGlpU3F1YXJlZC56IT09MCYmKGUuX3NxdWFyZWRYT3ZlclNxdWFyZWRaPWUuX3JhZGlpU3F1YXJlZC54L2UuX3JhZGlpU3F1YXJlZC56KX1mdW5jdGlvbiBfdChlLHQsbil7dGhpcy5fcmFkaWk9dm9pZCAwLHRoaXMuX3JhZGlpU3F1YXJlZD12b2lkIDAsdGhpcy5fcmFkaWlUb1RoZUZvdXJ0aD12b2lkIDAsdGhpcy5fb25lT3ZlclJhZGlpPXZvaWQgMCx0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkPXZvaWQgMCx0aGlzLl9taW5pbXVtUmFkaXVzPXZvaWQgMCx0aGlzLl9tYXhpbXVtUmFkaXVzPXZvaWQgMCx0aGlzLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkPXZvaWQgMCx0aGlzLl9zcXVhcmVkWE92ZXJTcXVhcmVkWj12b2lkIDAsZzEodGhpcyxlLHQsbil9ZnVuY3Rpb24gcDEoZSx0LG4pe2xldCBvPS41Kih0K2UpLGE9LjUqKHQtZSkscj0wO2ZvcihsZXQgaT0wO2k8NTtpKyspe2xldCBmPWEqRFNbaV07cis9QlNbaV0qKG4obytmKStuKG8tZikpfXJldHVybiByKj1hLHJ9dmFyIE5TLElTLFBTLGtTLHZTLEZTLERTLEJTLHEscWU9WCgoKT0+e2p0KCk7SWUoKTtFdCgpO3NlKCk7R2UoKTt6bSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKF90LnByb3RvdHlwZSx7cmFkaWk6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpaX19LHJhZGlpU3F1YXJlZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpU3F1YXJlZH19LHJhZGlpVG9UaGVGb3VydGg6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpaVRvVGhlRm91cnRofX0sb25lT3ZlclJhZGlpOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25lT3ZlclJhZGlpfX0sb25lT3ZlclJhZGlpU3F1YXJlZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWR9fSxtaW5pbXVtUmFkaXVzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWluaW11bVJhZGl1c319LG1heGltdW1SYWRpdXM6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhpbXVtUmFkaXVzfX19KTtfdC5jbG9uZT1mdW5jdGlvbihlLHQpe2lmKCFnKGUpKXJldHVybjtsZXQgbj1lLl9yYWRpaTtyZXR1cm4gZyh0KT8ocy5jbG9uZShuLHQuX3JhZGlpKSxzLmNsb25lKGUuX3JhZGlpU3F1YXJlZCx0Ll9yYWRpaVNxdWFyZWQpLHMuY2xvbmUoZS5fcmFkaWlUb1RoZUZvdXJ0aCx0Ll9yYWRpaVRvVGhlRm91cnRoKSxzLmNsb25lKGUuX29uZU92ZXJSYWRpaSx0Ll9vbmVPdmVyUmFkaWkpLHMuY2xvbmUoZS5fb25lT3ZlclJhZGlpU3F1YXJlZCx0Ll9vbmVPdmVyUmFkaWlTcXVhcmVkKSx0Ll9taW5pbXVtUmFkaXVzPWUuX21pbmltdW1SYWRpdXMsdC5fbWF4aW11bVJhZGl1cz1lLl9tYXhpbXVtUmFkaXVzLHQuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ9ZS5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZCx0KTpuZXcgX3Qobi54LG4ueSxuLnopfTtfdC5mcm9tQ2FydGVzaWFuMz1mdW5jdGlvbihlLHQpe3JldHVybiBnKHQpfHwodD1uZXcgX3QpLGcoZSkmJmcxKHQsZS54LGUueSxlLnopLHR9O190LldHUzg0PU9iamVjdC5mcmVlemUobmV3IF90KDYzNzgxMzcsNjM3ODEzNyw2MzU2NzUyMzE0MjQ1MTc5ZS05KSk7X3QuVU5JVF9TUEhFUkU9T2JqZWN0LmZyZWV6ZShuZXcgX3QoMSwxLDEpKTtfdC5NT09OPU9iamVjdC5mcmVlemUobmV3IF90KGsuTFVOQVJfUkFESVVTLGsuTFVOQVJfUkFESVVTLGsuTFVOQVJfUkFESVVTKSk7X3QuTUFSUz1PYmplY3QuZnJlZXplKG5ldyBfdCgzMzk2MTkwLDMzOTYxOTAsMzM3NjIwMCkpO190Ll9kZWZhdWx0PV90LldHUzg0O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKF90LHtkZWZhdWx0OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gX3QuX2RlZmF1bHR9LHNldDpmdW5jdGlvbihlKXtfdC5fZGVmYXVsdD1lLHMuX2VsbGlwc29pZFJhZGlpU3F1YXJlZD1lLnJhZGlpU3F1YXJlZCxyZS5fZWxsaXBzb2lkT25lT3ZlclJhZGlpPWUub25lT3ZlclJhZGlpLHJlLl9lbGxpcHNvaWRPbmVPdmVyUmFkaWlTcXVhcmVkPWUub25lT3ZlclJhZGlpU3F1YXJlZCxyZS5fZWxsaXBzb2lkQ2VudGVyVG9sZXJhbmNlU3F1YXJlZD1lLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkfX19KTtfdC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oZSl7cmV0dXJuIF90LmNsb25lKHRoaXMsZSl9O190LnBhY2tlZExlbmd0aD1zLnBhY2tlZExlbmd0aDtfdC5wYWNrPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj1uPz8wLHMucGFjayhlLl9yYWRpaSx0LG4pLHR9O190LnVucGFjaz1mdW5jdGlvbihlLHQsbil7dD10Pz8wO2xldCBvPXMudW5wYWNrKGUsdCk7cmV0dXJuIF90LmZyb21DYXJ0ZXNpYW4zKG8sbil9O190LnByb3RvdHlwZS5nZW9jZW50cmljU3VyZmFjZU5vcm1hbD1zLm5vcm1hbGl6ZTtfdC5wcm90b3R5cGUuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsQ2FydG9ncmFwaGljPWZ1bmN0aW9uKGUsdCl7bGV0IG49ZS5sb25naXR1ZGUsbz1lLmxhdGl0dWRlLGE9TWF0aC5jb3Mobykscj1hKk1hdGguY29zKG4pLGk9YSpNYXRoLnNpbihuKSxmPU1hdGguc2luKG8pO3JldHVybiBnKHQpfHwodD1uZXcgcyksdC54PXIsdC55PWksdC56PWYscy5ub3JtYWxpemUodCx0KX07X3QucHJvdG90eXBlLmdlb2RldGljU3VyZmFjZU5vcm1hbD1mdW5jdGlvbihlLHQpe2lmKCFzLmVxdWFsc0Vwc2lsb24oZSxzLlpFUk8say5FUFNJTE9OMTQpKXJldHVybiBnKHQpfHwodD1uZXcgcyksdD1zLm11bHRpcGx5Q29tcG9uZW50cyhlLHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQsdCkscy5ub3JtYWxpemUodCx0KX07TlM9bmV3IHMsSVM9bmV3IHM7X3QucHJvdG90eXBlLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuPWZ1bmN0aW9uKGUsdCl7bGV0IG49TlMsbz1JUzt0aGlzLmdlb2RldGljU3VyZmFjZU5vcm1hbENhcnRvZ3JhcGhpYyhlLG4pLHMubXVsdGlwbHlDb21wb25lbnRzKHRoaXMuX3JhZGlpU3F1YXJlZCxuLG8pO2xldCBhPU1hdGguc3FydChzLmRvdChuLG8pKTtyZXR1cm4gcy5kaXZpZGVCeVNjYWxhcihvLGEsbykscy5tdWx0aXBseUJ5U2NhbGFyKG4sZS5oZWlnaHQsbiksZyh0KXx8KHQ9bmV3IHMpLHMuYWRkKG8sbix0KX07X3QucHJvdG90eXBlLmNhcnRvZ3JhcGhpY0FycmF5VG9DYXJ0ZXNpYW5BcnJheT1mdW5jdGlvbihlLHQpe2xldCBuPWUubGVuZ3RoO2codCk/dC5sZW5ndGg9bjp0PW5ldyBBcnJheShuKTtmb3IobGV0IG89MDtvPG47bysrKXRbb109dGhpcy5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihlW29dLHRbb10pO3JldHVybiB0fTtQUz1uZXcgcyxrUz1uZXcgcyx2Uz1uZXcgcztfdC5wcm90b3R5cGUuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWM9ZnVuY3Rpb24oZSx0KXtsZXQgbj10aGlzLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UoZSxrUyk7aWYoIWcobikpcmV0dXJuO2xldCBvPXRoaXMuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKG4sUFMpLGE9cy5zdWJ0cmFjdChlLG4sdlMpLHI9TWF0aC5hdGFuMihvLnksby54KSxpPU1hdGguYXNpbihvLnopLGY9ay5zaWduKHMuZG90KGEsZSkpKnMubWFnbml0dWRlKGEpO3JldHVybiBnKHQpPyh0LmxvbmdpdHVkZT1yLHQubGF0aXR1ZGU9aSx0LmhlaWdodD1mLHQpOm5ldyByZShyLGksZil9O190LnByb3RvdHlwZS5jYXJ0ZXNpYW5BcnJheVRvQ2FydG9ncmFwaGljQXJyYXk9ZnVuY3Rpb24oZSx0KXtsZXQgbj1lLmxlbmd0aDtnKHQpP3QubGVuZ3RoPW46dD1uZXcgQXJyYXkobik7Zm9yKGxldCBvPTA7bzxuOysrbyl0W29dPXRoaXMuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoZVtvXSx0W29dKTtyZXR1cm4gdH07X3QucHJvdG90eXBlLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWnUoZSx0aGlzLl9vbmVPdmVyUmFkaWksdGhpcy5fb25lT3ZlclJhZGlpU3F1YXJlZCx0aGlzLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkLHQpfTtfdC5wcm90b3R5cGUuc2NhbGVUb0dlb2NlbnRyaWNTdXJmYWNlPWZ1bmN0aW9uKGUsdCl7Zyh0KXx8KHQ9bmV3IHMpO2xldCBuPWUueCxvPWUueSxhPWUueixyPXRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQsaT0xL01hdGguc3FydChuKm4qci54K28qbypyLnkrYSphKnIueik7cmV0dXJuIHMubXVsdGlwbHlCeVNjYWxhcihlLGksdCl9O190LnByb3RvdHlwZS50cmFuc2Zvcm1Qb3NpdGlvblRvU2NhbGVkU3BhY2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZyh0KXx8KHQ9bmV3IHMpLHMubXVsdGlwbHlDb21wb25lbnRzKGUsdGhpcy5fb25lT3ZlclJhZGlpLHQpfTtfdC5wcm90b3R5cGUudHJhbnNmb3JtUG9zaXRpb25Gcm9tU2NhbGVkU3BhY2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZyh0KXx8KHQ9bmV3IHMpLHMubXVsdGlwbHlDb21wb25lbnRzKGUsdGhpcy5fcmFkaWksdCl9O190LnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXM9PT1lfHxnKGUpJiZzLmVxdWFscyh0aGlzLl9yYWRpaSxlLl9yYWRpaSl9O190LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpaS50b1N0cmluZygpfTtfdC5wcm90b3R5cGUuZ2V0U3VyZmFjZU5vcm1hbEludGVyc2VjdGlvbldpdGhaQXhpcz1mdW5jdGlvbihlLHQsbil7dD10Pz8wO2xldCBvPXRoaXMuX3NxdWFyZWRYT3ZlclNxdWFyZWRaO2lmKGcobil8fChuPW5ldyBzKSxuLng9MCxuLnk9MCxuLno9ZS56KigxLW8pLCEoTWF0aC5hYnMobi56KT49dGhpcy5fcmFkaWkuei10KSlyZXR1cm4gbn07RlM9bmV3IHM7X3QucHJvdG90eXBlLmdldExvY2FsQ3VydmF0dXJlPWZ1bmN0aW9uKGUsdCl7Zyh0KXx8KHQ9bmV3IFkpO2xldCBuPXRoaXMuZ2V0U3VyZmFjZU5vcm1hbEludGVyc2VjdGlvbldpdGhaQXhpcyhlLDAsRlMpLG89cy5kaXN0YW5jZShlLG4pLGE9dGhpcy5taW5pbXVtUmFkaXVzKm8vdGhpcy5tYXhpbXVtUmFkaXVzKioyLHI9byphKioyO3JldHVybiBZLmZyb21FbGVtZW50cygxL28sMS9yLHQpfTtEUz1bLjE0ODg3NDMzODk4MTYzLC40MzMzOTUzOTQxMjkyNSwuNjc5NDA5NTY4Mjk5MDIsLjg2NTA2MzM2NjY4ODk4LC45NzM5MDY1Mjg1MTcxNywwXSxCUz1bLjI5NTUyNDIyNDcxNDc1LC4yNjkyNjY3MTkzMDk5OSwuMjE5MDg2MzYyNTE1OTgsLjE0OTQ1MTM0OTE1MDU4LC4wNjY2NzEzNDQzMDg2ODQsMF07X3QucHJvdG90eXBlLnN1cmZhY2VBcmVhPWZ1bmN0aW9uKGUpe2xldCB0PWUud2VzdCxuPWUuZWFzdCxvPWUuc291dGgsYT1lLm5vcnRoO2Zvcig7bjx0OyluKz1rLlRXT19QSTtsZXQgcj10aGlzLl9yYWRpaVNxdWFyZWQsaT1yLngsZj1yLnksZD1yLnosYz1pKmY7cmV0dXJuIHAxKG8sYSxmdW5jdGlvbih1KXtsZXQgbD1NYXRoLmNvcyh1KSxoPU1hdGguc2luKHUpO3JldHVybiBNYXRoLmNvcyh1KSpwMSh0LG4sZnVuY3Rpb24obSl7bGV0IGI9TWF0aC5jb3MobSkscD1NYXRoLnNpbihtKTtyZXR1cm4gTWF0aC5zcXJ0KGMqaCpoK2QqKGYqYipiK2kqcCpwKSpsKmwpfSl9KX07cT1fdH0pO2Z1bmN0aW9uICR1KGUpe3RoaXMuX2VsbGlwc29pZD1lPz9xLmRlZmF1bHQsdGhpcy5fc2VtaW1ham9yQXhpcz10aGlzLl9lbGxpcHNvaWQubWF4aW11bVJhZGl1cyx0aGlzLl9vbmVPdmVyU2VtaW1ham9yQXhpcz0xL3RoaXMuX3NlbWltYWpvckF4aXN9dmFyIGlvLGtyPVgoKCk9PntJZSgpO0V0KCk7c2UoKTtxZSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCR1LnByb3RvdHlwZSx7ZWxsaXBzb2lkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxsaXBzb2lkfX19KTskdS5wcm90b3R5cGUucHJvamVjdD1mdW5jdGlvbihlLHQpe2xldCBuPXRoaXMuX3NlbWltYWpvckF4aXMsbz1lLmxvbmdpdHVkZSpuLGE9ZS5sYXRpdHVkZSpuLHI9ZS5oZWlnaHQ7cmV0dXJuIGcodCk/KHQueD1vLHQueT1hLHQuej1yLHQpOm5ldyBzKG8sYSxyKX07JHUucHJvdG90eXBlLnVucHJvamVjdD1mdW5jdGlvbihlLHQpe2xldCBuPXRoaXMuX29uZU92ZXJTZW1pbWFqb3JBeGlzLG89ZS54Km4sYT1lLnkqbixyPWUuejtyZXR1cm4gZyh0KT8odC5sb25naXR1ZGU9byx0LmxhdGl0dWRlPWEsdC5oZWlnaHQ9cix0KTpuZXcgcmUobyxhLHIpfTtpbz0kdX0pO3ZhciBVUyxTbixaaT1YKCgpPT57VVM9e09VVFNJREU6LTEsSU5URVJTRUNUSU5HOjAsSU5TSURFOjF9LFNuPU9iamVjdC5mcmVlemUoVVMpfSk7ZnVuY3Rpb24gTFMoZSx0KXt0aGlzLnN0YXJ0PWU/PzAsdGhpcy5zdG9wPXQ/PzB9dmFyIEVvLGxmPVgoKCk9PntFbz1MU30pO2Z1bmN0aW9uIHdlKGUsdCxuLG8sYSxyLGksZixkKXt0aGlzWzBdPWU/PzAsdGhpc1sxXT1vPz8wLHRoaXNbMl09aT8/MCx0aGlzWzNdPXQ/PzAsdGhpc1s0XT1hPz8wLHRoaXNbNV09Zj8/MCx0aGlzWzZdPW4/PzAsdGhpc1s3XT1yPz8wLHRoaXNbOF09ZD8/MH1mdW5jdGlvbiBIUyhlKXtsZXQgdD0wO2ZvcihsZXQgbj0wO248OTsrK24pe2xldCBvPWVbbl07dCs9bypvfXJldHVybiBNYXRoLnNxcnQodCl9ZnVuY3Rpb24gS1MoZSl7bGV0IHQ9MDtmb3IobGV0IG49MDtuPDM7KytuKXtsZXQgbz1lW3dlLmdldEVsZW1lbnRJbmRleChIbVtuXSxWbVtuXSldO3QrPTIqbypvfXJldHVybiBNYXRoLnNxcnQodCl9ZnVuY3Rpb24gcVMoZSx0KXtsZXQgbj1rLkVQU0lMT04xNSxvPTAsYT0xO2ZvcihsZXQgYz0wO2M8MzsrK2Mpe2xldCB1PU1hdGguYWJzKGVbd2UuZ2V0RWxlbWVudEluZGV4KEhtW2NdLFZtW2NdKV0pO3U+byYmKGE9YyxvPXUpfWxldCByPTEsaT0wLGY9Vm1bYV0sZD1IbVthXTtpZihNYXRoLmFicyhlW3dlLmdldEVsZW1lbnRJbmRleChkLGYpXSk+bil7bGV0IGM9ZVt3ZS5nZXRFbGVtZW50SW5kZXgoZCxkKV0sdT1lW3dlLmdldEVsZW1lbnRJbmRleChmLGYpXSxsPWVbd2UuZ2V0RWxlbWVudEluZGV4KGQsZildLGg9KGMtdSkvMi9sLG07aDwwP209LTEvKC1oK01hdGguc3FydCgxK2gqaCkpOm09MS8oaCtNYXRoLnNxcnQoMStoKmgpKSxyPTEvTWF0aC5zcXJ0KDErbSptKSxpPW0qcn1yZXR1cm4gdD13ZS5jbG9uZSh3ZS5JREVOVElUWSx0KSx0W3dlLmdldEVsZW1lbnRJbmRleChmLGYpXT10W3dlLmdldEVsZW1lbnRJbmRleChkLGQpXT1yLHRbd2UuZ2V0RWxlbWVudEluZGV4KGQsZildPWksdFt3ZS5nZXRFbGVtZW50SW5kZXgoZixkKV09LWksdH12YXIgalMselMsR20sXzEsR1MsVlMsVm0sSG0sZWwseTEsV1MsSixEbj1YKCgpPT57SWUoKTtzZSgpO0dlKCk7d2UucGFja2VkTGVuZ3RoPTk7d2UucGFjaz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG49bj8/MCx0W24rK109ZVswXSx0W24rK109ZVsxXSx0W24rK109ZVsyXSx0W24rK109ZVszXSx0W24rK109ZVs0XSx0W24rK109ZVs1XSx0W24rK109ZVs2XSx0W24rK109ZVs3XSx0W24rK109ZVs4XSx0fTt3ZS51bnBhY2s9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0PXQ/PzAsZyhuKXx8KG49bmV3IHdlKSxuWzBdPWVbdCsrXSxuWzFdPWVbdCsrXSxuWzJdPWVbdCsrXSxuWzNdPWVbdCsrXSxuWzRdPWVbdCsrXSxuWzVdPWVbdCsrXSxuWzZdPWVbdCsrXSxuWzddPWVbdCsrXSxuWzhdPWVbdCsrXSxufTt3ZS5wYWNrQXJyYXk9ZnVuY3Rpb24oZSx0KXtsZXQgbj1lLmxlbmd0aCxvPW4qOTtnKHQpPyFBcnJheS5pc0FycmF5KHQpJiZ0Lmxlbmd0aCE9PW98fHQubGVuZ3RoIT09byYmKHQubGVuZ3RoPW8pOnQ9bmV3IEFycmF5KG8pO2ZvcihsZXQgYT0wO2E8bjsrK2Epd2UucGFjayhlW2FdLHQsYSo5KTtyZXR1cm4gdH07d2UudW5wYWNrQXJyYXk9ZnVuY3Rpb24oZSx0KXtsZXQgbj1lLmxlbmd0aDtnKHQpP3QubGVuZ3RoPW4vOTp0PW5ldyBBcnJheShuLzkpO2ZvcihsZXQgbz0wO288bjtvKz05KXtsZXQgYT1vLzk7dFthXT13ZS51bnBhY2soZSxvLHRbYV0pfXJldHVybiB0fTt3ZS5jbG9uZT1mdW5jdGlvbihlLHQpe2lmKGcoZSkpcmV0dXJuIGcodCk/KHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHRbM109ZVszXSx0WzRdPWVbNF0sdFs1XT1lWzVdLHRbNl09ZVs2XSx0WzddPWVbN10sdFs4XT1lWzhdLHQpOm5ldyB3ZShlWzBdLGVbM10sZVs2XSxlWzFdLGVbNF0sZVs3XSxlWzJdLGVbNV0sZVs4XSl9O3dlLmZyb21BcnJheT13ZS51bnBhY2s7d2UuZnJvbUNvbHVtbk1ham9yQXJyYXk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gd2UuY2xvbmUoZSx0KX07d2UuZnJvbVJvd01ham9yQXJyYXk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZyh0KT8odFswXT1lWzBdLHRbMV09ZVszXSx0WzJdPWVbNl0sdFszXT1lWzFdLHRbNF09ZVs0XSx0WzVdPWVbN10sdFs2XT1lWzJdLHRbN109ZVs1XSx0WzhdPWVbOF0sdCk6bmV3IHdlKGVbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSxlWzVdLGVbNl0sZVs3XSxlWzhdKX07d2UuZnJvbVF1YXRlcm5pb249ZnVuY3Rpb24oZSx0KXtsZXQgbj1lLngqZS54LG89ZS54KmUueSxhPWUueCplLnoscj1lLngqZS53LGk9ZS55KmUueSxmPWUueSplLnosZD1lLnkqZS53LGM9ZS56KmUueix1PWUueiplLncsbD1lLncqZS53LGg9bi1pLWMrbCxtPTIqKG8tdSksYj0yKihhK2QpLHA9Mioobyt1KSx5PS1uK2ktYytsLEU9MiooZi1yKSxfPTIqKGEtZCksVD0yKihmK3IpLHc9LW4taStjK2w7cmV0dXJuIGcodCk/KHRbMF09aCx0WzFdPXAsdFsyXT1fLHRbM109bSx0WzRdPXksdFs1XT1ULHRbNl09Yix0WzddPUUsdFs4XT13LHQpOm5ldyB3ZShoLG0sYixwLHksRSxfLFQsdyl9O3dlLmZyb21IZWFkaW5nUGl0Y2hSb2xsPWZ1bmN0aW9uKGUsdCl7bGV0IG49TWF0aC5jb3MoLWUucGl0Y2gpLG89TWF0aC5jb3MoLWUuaGVhZGluZyksYT1NYXRoLmNvcyhlLnJvbGwpLHI9TWF0aC5zaW4oLWUucGl0Y2gpLGk9TWF0aC5zaW4oLWUuaGVhZGluZyksZj1NYXRoLnNpbihlLnJvbGwpLGQ9bipvLGM9LWEqaStmKnIqbyx1PWYqaSthKnIqbyxsPW4qaSxoPWEqbytmKnIqaSxtPS1mKm8rYSpyKmksYj0tcixwPWYqbix5PWEqbjtyZXR1cm4gZyh0KT8odFswXT1kLHRbMV09bCx0WzJdPWIsdFszXT1jLHRbNF09aCx0WzVdPXAsdFs2XT11LHRbN109bSx0WzhdPXksdCk6bmV3IHdlKGQsYyx1LGwsaCxtLGIscCx5KX07d2UuZnJvbVNjYWxlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGcodCk/KHRbMF09ZS54LHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09ZS55LHRbNV09MCx0WzZdPTAsdFs3XT0wLHRbOF09ZS56LHQpOm5ldyB3ZShlLngsMCwwLDAsZS55LDAsMCwwLGUueil9O3dlLmZyb21Vbmlmb3JtU2NhbGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZyh0KT8odFswXT1lLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09ZSx0WzVdPTAsdFs2XT0wLHRbN109MCx0WzhdPWUsdCk6bmV3IHdlKGUsMCwwLDAsZSwwLDAsMCxlKX07d2UuZnJvbUNyb3NzUHJvZHVjdD1mdW5jdGlvbihlLHQpe3JldHVybiBnKHQpPyh0WzBdPTAsdFsxXT1lLnosdFsyXT0tZS55LHRbM109LWUueix0WzRdPTAsdFs1XT1lLngsdFs2XT1lLnksdFs3XT0tZS54LHRbOF09MCx0KTpuZXcgd2UoMCwtZS56LGUueSxlLnosMCwtZS54LC1lLnksZS54LDApfTt3ZS5mcm9tUm90YXRpb25YPWZ1bmN0aW9uKGUsdCl7bGV0IG49TWF0aC5jb3MoZSksbz1NYXRoLnNpbihlKTtyZXR1cm4gZyh0KT8odFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09bix0WzVdPW8sdFs2XT0wLHRbN109LW8sdFs4XT1uLHQpOm5ldyB3ZSgxLDAsMCwwLG4sLW8sMCxvLG4pfTt3ZS5mcm9tUm90YXRpb25ZPWZ1bmN0aW9uKGUsdCl7bGV0IG49TWF0aC5jb3MoZSksbz1NYXRoLnNpbihlKTtyZXR1cm4gZyh0KT8odFswXT1uLHRbMV09MCx0WzJdPS1vLHRbM109MCx0WzRdPTEsdFs1XT0wLHRbNl09byx0WzddPTAsdFs4XT1uLHQpOm5ldyB3ZShuLDAsbywwLDEsMCwtbywwLG4pfTt3ZS5mcm9tUm90YXRpb25aPWZ1bmN0aW9uKGUsdCl7bGV0IG49TWF0aC5jb3MoZSksbz1NYXRoLnNpbihlKTtyZXR1cm4gZyh0KT8odFswXT1uLHRbMV09byx0WzJdPTAsdFszXT0tbyx0WzRdPW4sdFs1XT0wLHRbNl09MCx0WzddPTAsdFs4XT0xLHQpOm5ldyB3ZShuLC1vLDAsbyxuLDAsMCwwLDEpfTt3ZS50b0FycmF5PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGcodCk/KHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHRbM109ZVszXSx0WzRdPWVbNF0sdFs1XT1lWzVdLHRbNl09ZVs2XSx0WzddPWVbN10sdFs4XT1lWzhdLHQpOltlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XSxlWzZdLGVbN10sZVs4XV19O3dlLmdldEVsZW1lbnRJbmRleD1mdW5jdGlvbihlLHQpe3JldHVybiBlKjMrdH07d2UuZ2V0Q29sdW1uPWZ1bmN0aW9uKGUsdCxuKXtsZXQgbz10KjMsYT1lW29dLHI9ZVtvKzFdLGk9ZVtvKzJdO3JldHVybiBuLng9YSxuLnk9cixuLno9aSxufTt3ZS5zZXRDb2x1bW49ZnVuY3Rpb24oZSx0LG4sbyl7bz13ZS5jbG9uZShlLG8pO2xldCBhPXQqMztyZXR1cm4gb1thXT1uLngsb1thKzFdPW4ueSxvW2ErMl09bi56LG99O3dlLmdldFJvdz1mdW5jdGlvbihlLHQsbil7bGV0IG89ZVt0XSxhPWVbdCszXSxyPWVbdCs2XTtyZXR1cm4gbi54PW8sbi55PWEsbi56PXIsbn07d2Uuc2V0Um93PWZ1bmN0aW9uKGUsdCxuLG8pe3JldHVybiBvPXdlLmNsb25lKGUsbyksb1t0XT1uLngsb1t0KzNdPW4ueSxvW3QrNl09bi56LG99O2pTPW5ldyBzO3dlLnNldFNjYWxlPWZ1bmN0aW9uKGUsdCxuKXtsZXQgbz13ZS5nZXRTY2FsZShlLGpTKSxhPXQueC9vLngscj10Lnkvby55LGk9dC56L28uejtyZXR1cm4gblswXT1lWzBdKmEsblsxXT1lWzFdKmEsblsyXT1lWzJdKmEsblszXT1lWzNdKnIsbls0XT1lWzRdKnIsbls1XT1lWzVdKnIsbls2XT1lWzZdKmksbls3XT1lWzddKmksbls4XT1lWzhdKmksbn07elM9bmV3IHM7d2Uuc2V0VW5pZm9ybVNjYWxlPWZ1bmN0aW9uKGUsdCxuKXtsZXQgbz13ZS5nZXRTY2FsZShlLHpTKSxhPXQvby54LHI9dC9vLnksaT10L28uejtyZXR1cm4gblswXT1lWzBdKmEsblsxXT1lWzFdKmEsblsyXT1lWzJdKmEsblszXT1lWzNdKnIsbls0XT1lWzRdKnIsbls1XT1lWzVdKnIsbls2XT1lWzZdKmksbls3XT1lWzddKmksbls4XT1lWzhdKmksbn07R209bmV3IHM7d2UuZ2V0U2NhbGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC54PXMubWFnbml0dWRlKHMuZnJvbUVsZW1lbnRzKGVbMF0sZVsxXSxlWzJdLEdtKSksdC55PXMubWFnbml0dWRlKHMuZnJvbUVsZW1lbnRzKGVbM10sZVs0XSxlWzVdLEdtKSksdC56PXMubWFnbml0dWRlKHMuZnJvbUVsZW1lbnRzKGVbNl0sZVs3XSxlWzhdLEdtKSksdH07XzE9bmV3IHM7d2UuZ2V0TWF4aW11bVNjYWxlPWZ1bmN0aW9uKGUpe3JldHVybiB3ZS5nZXRTY2FsZShlLF8xKSxzLm1heGltdW1Db21wb25lbnQoXzEpfTtHUz1uZXcgczt3ZS5zZXRSb3RhdGlvbj1mdW5jdGlvbihlLHQsbil7bGV0IG89d2UuZ2V0U2NhbGUoZSxHUyk7cmV0dXJuIG5bMF09dFswXSpvLngsblsxXT10WzFdKm8ueCxuWzJdPXRbMl0qby54LG5bM109dFszXSpvLnksbls0XT10WzRdKm8ueSxuWzVdPXRbNV0qby55LG5bNl09dFs2XSpvLnosbls3XT10WzddKm8ueixuWzhdPXRbOF0qby56LG59O1ZTPW5ldyBzO3dlLmdldFJvdGF0aW9uPWZ1bmN0aW9uKGUsdCl7bGV0IG49d2UuZ2V0U2NhbGUoZSxWUyk7cmV0dXJuIHRbMF09ZVswXS9uLngsdFsxXT1lWzFdL24ueCx0WzJdPWVbMl0vbi54LHRbM109ZVszXS9uLnksdFs0XT1lWzRdL24ueSx0WzVdPWVbNV0vbi55LHRbNl09ZVs2XS9uLnosdFs3XT1lWzddL24ueix0WzhdPWVbOF0vbi56LHR9O3dlLm11bHRpcGx5PWZ1bmN0aW9uKGUsdCxuKXtsZXQgbz1lWzBdKnRbMF0rZVszXSp0WzFdK2VbNl0qdFsyXSxhPWVbMV0qdFswXStlWzRdKnRbMV0rZVs3XSp0WzJdLHI9ZVsyXSp0WzBdK2VbNV0qdFsxXStlWzhdKnRbMl0saT1lWzBdKnRbM10rZVszXSp0WzRdK2VbNl0qdFs1XSxmPWVbMV0qdFszXStlWzRdKnRbNF0rZVs3XSp0WzVdLGQ9ZVsyXSp0WzNdK2VbNV0qdFs0XStlWzhdKnRbNV0sYz1lWzBdKnRbNl0rZVszXSp0WzddK2VbNl0qdFs4XSx1PWVbMV0qdFs2XStlWzRdKnRbN10rZVs3XSp0WzhdLGw9ZVsyXSp0WzZdK2VbNV0qdFs3XStlWzhdKnRbOF07cmV0dXJuIG5bMF09byxuWzFdPWEsblsyXT1yLG5bM109aSxuWzRdPWYsbls1XT1kLG5bNl09YyxuWzddPXUsbls4XT1sLG59O3dlLmFkZD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG5bMF09ZVswXSt0WzBdLG5bMV09ZVsxXSt0WzFdLG5bMl09ZVsyXSt0WzJdLG5bM109ZVszXSt0WzNdLG5bNF09ZVs0XSt0WzRdLG5bNV09ZVs1XSt0WzVdLG5bNl09ZVs2XSt0WzZdLG5bN109ZVs3XSt0WzddLG5bOF09ZVs4XSt0WzhdLG59O3dlLnN1YnRyYWN0PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gblswXT1lWzBdLXRbMF0sblsxXT1lWzFdLXRbMV0sblsyXT1lWzJdLXRbMl0sblszXT1lWzNdLXRbM10sbls0XT1lWzRdLXRbNF0sbls1XT1lWzVdLXRbNV0sbls2XT1lWzZdLXRbNl0sbls3XT1lWzddLXRbN10sbls4XT1lWzhdLXRbOF0sbn07d2UubXVsdGlwbHlCeVZlY3Rvcj1mdW5jdGlvbihlLHQsbil7bGV0IG89dC54LGE9dC55LHI9dC56LGk9ZVswXSpvK2VbM10qYStlWzZdKnIsZj1lWzFdKm8rZVs0XSphK2VbN10qcixkPWVbMl0qbytlWzVdKmErZVs4XSpyO3JldHVybiBuLng9aSxuLnk9ZixuLno9ZCxufTt3ZS5tdWx0aXBseUJ5U2NhbGFyPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gblswXT1lWzBdKnQsblsxXT1lWzFdKnQsblsyXT1lWzJdKnQsblszXT1lWzNdKnQsbls0XT1lWzRdKnQsbls1XT1lWzVdKnQsbls2XT1lWzZdKnQsbls3XT1lWzddKnQsbls4XT1lWzhdKnQsbn07d2UubXVsdGlwbHlCeVNjYWxlPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gblswXT1lWzBdKnQueCxuWzFdPWVbMV0qdC54LG5bMl09ZVsyXSp0LngsblszXT1lWzNdKnQueSxuWzRdPWVbNF0qdC55LG5bNV09ZVs1XSp0Lnksbls2XT1lWzZdKnQueixuWzddPWVbN10qdC56LG5bOF09ZVs4XSp0Lnosbn07d2UubXVsdGlwbHlCeVVuaWZvcm1TY2FsZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG5bMF09ZVswXSp0LG5bMV09ZVsxXSp0LG5bMl09ZVsyXSp0LG5bM109ZVszXSp0LG5bNF09ZVs0XSp0LG5bNV09ZVs1XSp0LG5bNl09ZVs2XSp0LG5bN109ZVs3XSp0LG5bOF09ZVs4XSp0LG59O3dlLm5lZ2F0ZT1mdW5jdGlvbihlLHQpe3JldHVybiB0WzBdPS1lWzBdLHRbMV09LWVbMV0sdFsyXT0tZVsyXSx0WzNdPS1lWzNdLHRbNF09LWVbNF0sdFs1XT0tZVs1XSx0WzZdPS1lWzZdLHRbN109LWVbN10sdFs4XT0tZVs4XSx0fTt3ZS50cmFuc3Bvc2U9ZnVuY3Rpb24oZSx0KXtsZXQgbj1lWzBdLG89ZVszXSxhPWVbNl0scj1lWzFdLGk9ZVs0XSxmPWVbN10sZD1lWzJdLGM9ZVs1XSx1PWVbOF07cmV0dXJuIHRbMF09bix0WzFdPW8sdFsyXT1hLHRbM109cix0WzRdPWksdFs1XT1mLHRbNl09ZCx0WzddPWMsdFs4XT11LHR9O1ZtPVsxLDAsMF0sSG09WzIsMiwxXTtlbD1uZXcgd2UseTE9bmV3IHdlO3dlLmNvbXB1dGVFaWdlbkRlY29tcG9zaXRpb249ZnVuY3Rpb24oZSx0KXtsZXQgbj1rLkVQU0lMT04yMCxvPTEwLGE9MCxyPTA7Zyh0KXx8KHQ9e30pO2xldCBpPXQudW5pdGFyeT13ZS5jbG9uZSh3ZS5JREVOVElUWSx0LnVuaXRhcnkpLGY9dC5kaWFnb25hbD13ZS5jbG9uZShlLHQuZGlhZ29uYWwpLGQ9bipIUyhmKTtmb3IoO3I8byYmS1MoZik+ZDspcVMoZixlbCksd2UudHJhbnNwb3NlKGVsLHkxKSx3ZS5tdWx0aXBseShmLGVsLGYpLHdlLm11bHRpcGx5KHkxLGYsZiksd2UubXVsdGlwbHkoaSxlbCxpKSwrK2E+MiYmKCsrcixhPTApO3JldHVybiB0fTt3ZS5hYnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdFswXT1NYXRoLmFicyhlWzBdKSx0WzFdPU1hdGguYWJzKGVbMV0pLHRbMl09TWF0aC5hYnMoZVsyXSksdFszXT1NYXRoLmFicyhlWzNdKSx0WzRdPU1hdGguYWJzKGVbNF0pLHRbNV09TWF0aC5hYnMoZVs1XSksdFs2XT1NYXRoLmFicyhlWzZdKSx0WzddPU1hdGguYWJzKGVbN10pLHRbOF09TWF0aC5hYnMoZVs4XSksdH07d2UuZGV0ZXJtaW5hbnQ9ZnVuY3Rpb24oZSl7bGV0IHQ9ZVswXSxuPWVbM10sbz1lWzZdLGE9ZVsxXSxyPWVbNF0saT1lWzddLGY9ZVsyXSxkPWVbNV0sYz1lWzhdO3JldHVybiB0KihyKmMtZCppKSthKihkKm8tbipjKStmKihuKmktcipvKX07d2UuaW52ZXJzZT1mdW5jdGlvbihlLHQpe2xldCBuPWVbMF0sbz1lWzFdLGE9ZVsyXSxyPWVbM10saT1lWzRdLGY9ZVs1XSxkPWVbNl0sYz1lWzddLHU9ZVs4XSxsPXdlLmRldGVybWluYW50KGUpO3RbMF09aSp1LWMqZix0WzFdPWMqYS1vKnUsdFsyXT1vKmYtaSphLHRbM109ZCpmLXIqdSx0WzRdPW4qdS1kKmEsdFs1XT1yKmEtbipmLHRbNl09cipjLWQqaSx0WzddPWQqby1uKmMsdFs4XT1uKmktcipvO2xldCBoPTEvbDtyZXR1cm4gd2UubXVsdGlwbHlCeVNjYWxhcih0LGgsdCl9O1dTPW5ldyB3ZTt3ZS5pbnZlcnNlVHJhbnNwb3NlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHdlLmludmVyc2Uod2UudHJhbnNwb3NlKGUsV1MpLHQpfTt3ZS5lcXVhbHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PXR8fGcoZSkmJmcodCkmJmVbMF09PT10WzBdJiZlWzFdPT09dFsxXSYmZVsyXT09PXRbMl0mJmVbM109PT10WzNdJiZlWzRdPT09dFs0XSYmZVs1XT09PXRbNV0mJmVbNl09PT10WzZdJiZlWzddPT09dFs3XSYmZVs4XT09PXRbOF19O3dlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuPW4/PzAsZT09PXR8fGcoZSkmJmcodCkmJk1hdGguYWJzKGVbMF0tdFswXSk8PW4mJk1hdGguYWJzKGVbMV0tdFsxXSk8PW4mJk1hdGguYWJzKGVbMl0tdFsyXSk8PW4mJk1hdGguYWJzKGVbM10tdFszXSk8PW4mJk1hdGguYWJzKGVbNF0tdFs0XSk8PW4mJk1hdGguYWJzKGVbNV0tdFs1XSk8PW4mJk1hdGguYWJzKGVbNl0tdFs2XSk8PW4mJk1hdGguYWJzKGVbN10tdFs3XSk8PW4mJk1hdGguYWJzKGVbOF0tdFs4XSk8PW59O3dlLklERU5USVRZPU9iamVjdC5mcmVlemUobmV3IHdlKDEsMCwwLDAsMSwwLDAsMCwxKSk7d2UuWkVSTz1PYmplY3QuZnJlZXplKG5ldyB3ZSgwLDAsMCwwLDAsMCwwLDAsMCkpO3dlLkNPTFVNTjBST1cwPTA7d2UuQ09MVU1OMFJPVzE9MTt3ZS5DT0xVTU4wUk9XMj0yO3dlLkNPTFVNTjFST1cwPTM7d2UuQ09MVU1OMVJPVzE9NDt3ZS5DT0xVTU4xUk9XMj01O3dlLkNPTFVNTjJST1cwPTY7d2UuQ09MVU1OMlJPVzE9Nzt3ZS5DT0xVTU4yUk9XMj04O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHdlLnByb3RvdHlwZSx7bGVuZ3RoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gd2UucGFja2VkTGVuZ3RofX19KTt3ZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHdlLmNsb25lKHRoaXMsZSl9O3dlLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHdlLmVxdWFscyh0aGlzLGUpfTt3ZS5lcXVhbHNBcnJheT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGVbMF09PT10W25dJiZlWzFdPT09dFtuKzFdJiZlWzJdPT09dFtuKzJdJiZlWzNdPT09dFtuKzNdJiZlWzRdPT09dFtuKzRdJiZlWzVdPT09dFtuKzVdJiZlWzZdPT09dFtuKzZdJiZlWzddPT09dFtuKzddJiZlWzhdPT09dFtuKzhdfTt3ZS5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbihlLHQpe3JldHVybiB3ZS5lcXVhbHNFcHNpbG9uKHRoaXMsZSx0KX07d2UucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuYCgke3RoaXNbMF19LCAke3RoaXNbM119LCAke3RoaXNbNl19KQooJHt0aGlzWzFdfSwgJHt0aGlzWzRdfSwgJHt0aGlzWzddfSkKKCR7dGhpc1syXX0sICR7dGhpc1s1XX0sICR7dGhpc1s4XX0pYH07Sj13ZX0pO3ZhciBZbix0bCxBMSxYUyxLbSxObyxZUyxKUyx3MSxkdCxnYT1YKCgpPT57c2UoKTtHZSgpO1luPWNsYXNzIGV7Y29uc3RydWN0b3IodCxuLG8sYSl7dGhpcy54PXQ/PzAsdGhpcy55PW4/PzAsdGhpcy56PW8/PzAsdGhpcy53PWE/PzB9c3RhdGljIGZyb21FbGVtZW50cyh0LG4sbyxhLHIpe3JldHVybiBnK